diff --git a/CMake/macros.cmake b/CMake/macros.cmake deleted file mode 100644 index 73458d7312e..00000000000 --- a/CMake/macros.cmake +++ /dev/null @@ -1,172 +0,0 @@ -MACRO(BLENDERLIB_NOLIST - name - sources - includes) - - # Gather all headers - FILE(GLOB_RECURSE INC_ALL *.h) - - INCLUDE_DIRECTORIES(${includes}) - ADD_LIBRARY(${name} ${INC_ALL} ${sources}) - - # Group by location on disk - SOURCE_GROUP(Files FILES CMakeLists.txt) - SET(ALL_FILES ${sources} ${INC_ALL}) - FOREACH(SRC ${ALL_FILES}) - STRING(REGEX REPLACE ${CMAKE_CURRENT_SOURCE_DIR} "Files" REL_DIR "${SRC}") - STRING(REGEX REPLACE "[\\\\/][^\\\\/]*$" "" REL_DIR "${REL_DIR}") - STRING(REGEX REPLACE "^[\\\\/]" "" REL_DIR "${REL_DIR}") - IF(REL_DIR) - SOURCE_GROUP(${REL_DIR} FILES ${SRC}) - ELSE(REL_DIR) - SOURCE_GROUP(Files FILES ${SRC}) - ENDIF(REL_DIR) - ENDFOREACH(SRC) - - MESSAGE(STATUS "Configuring library ${name}") -ENDMACRO(BLENDERLIB_NOLIST) - -MACRO(BLENDERLIB - name - sources - includes) - - BLENDERLIB_NOLIST(${name} "${sources}" "${includes}") - - # Add to blender's list of libraries - FILE(APPEND ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt "${name};") -ENDMACRO(BLENDERLIB) - -MACRO(SETUP_LIBDIRS) - # see "cmake --help-policy CMP0003" - if(COMMAND cmake_policy) - CMAKE_POLICY(SET CMP0003 NEW) - endif(COMMAND cmake_policy) - - LINK_DIRECTORIES(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH} ${LIBSAMPLERATE_LIBPATH}) - - IF(WITH_PYTHON) - LINK_DIRECTORIES(${PYTHON_LIBPATH}) - ENDIF(WITH_PYTHON) - IF(WITH_INTERNATIONAL) - LINK_DIRECTORIES(${ICONV_LIBPATH}) - LINK_DIRECTORIES(${GETTEXT_LIBPATH}) - ENDIF(WITH_INTERNATIONAL) - IF(WITH_SDL) - LINK_DIRECTORIES(${SDL_LIBPATH}) - ENDIF(WITH_SDL) - IF(WITH_FFMPEG) - LINK_DIRECTORIES(${FFMPEG_LIBPATH}) - ENDIF(WITH_FFMPEG) - IF(WITH_OPENEXR) - LINK_DIRECTORIES(${OPENEXR_LIBPATH}) - ENDIF(WITH_OPENEXR) - IF(WITH_QUICKTIME) - LINK_DIRECTORIES(${QUICKTIME_LIBPATH}) - ENDIF(WITH_QUICKTIME) - IF(WITH_OPENAL) - LINK_DIRECTORIES(${OPENAL_LIBPATH}) - ENDIF(WITH_OPENAL) - IF(WITH_JACK) - LINK_DIRECTORIES(${JACK_LIBPATH}) - ENDIF(WITH_JACK) - IF(WITH_SNDFILE) - LINK_DIRECTORIES(${SNDFILE_LIBPATH}) - ENDIF(WITH_SNDFILE) - IF(WITH_FFTW3) - LINK_DIRECTORIES(${FFTW3_LIBPATH}) - ENDIF(WITH_FFTW3) - IF(WITH_OPENCOLLADA) - LINK_DIRECTORIES(${OPENCOLLADA_LIBPATH}) - LINK_DIRECTORIES(${PCRE_LIBPATH}) - LINK_DIRECTORIES(${EXPAT_LIBPATH}) - ENDIF(WITH_OPENCOLLADA) - - IF(WIN32) - LINK_DIRECTORIES(${PTHREADS_LIBPATH}) - ENDIF(WIN32) -ENDMACRO(SETUP_LIBDIRS) - -MACRO(SETUP_LIBLINKS - target) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS} ") - - TARGET_LINK_LIBRARIES(${target} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${JPEG_LIBRARY} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${LLIBS}) - - # since we are using the local libs for python when compiling msvc projects, we need to add _d when compiling debug versions - IF(WITH_PYTHON) - TARGET_LINK_LIBRARIES(${target} ${PYTHON_LINKFLAGS}) - - IF(WIN32) - TARGET_LINK_LIBRARIES(${target} debug ${PYTHON_LIB}_d) - TARGET_LINK_LIBRARIES(${target} optimized ${PYTHON_LIB}) - ELSE(WIN32) - TARGET_LINK_LIBRARIES(${target} ${PYTHON_LIB}) - ENDIF(WIN32) - ENDIF(WITH_PYTHON) - - TARGET_LINK_LIBRARIES(${target} ${OPENGL_glu_LIBRARY} ${JPEG_LIB} ${PNG_LIB} ${ZLIB_LIB}) - TARGET_LINK_LIBRARIES(${target} ${FREETYPE_LIBRARY} ${LIBSAMPLERATE_LIB}) - - IF(WITH_INTERNATIONAL) - TARGET_LINK_LIBRARIES(${target} ${GETTEXT_LIB}) - - IF(WIN32) - TARGET_LINK_LIBRARIES(${target} ${ICONV_LIB}) - ENDIF(WIN32) - ENDIF(WITH_INTERNATIONAL) - - IF(WITH_OPENAL) - TARGET_LINK_LIBRARIES(${target} ${OPENAL_LIBRARY}) - ENDIF(WITH_OPENAL) - IF(WITH_FFTW3) - TARGET_LINK_LIBRARIES(${target} ${FFTW3_LIB}) - ENDIF(WITH_FFTW3) - IF(WITH_JACK) - TARGET_LINK_LIBRARIES(${target} ${JACK_LIB}) - ENDIF(WITH_JACK) - IF(WITH_SNDFILE) - TARGET_LINK_LIBRARIES(${target} ${SNDFILE_LIB}) - ENDIF(WITH_SNDFILE) - IF(WITH_SDL) - TARGET_LINK_LIBRARIES(${target} ${SDL_LIBRARY}) - ENDIF(WITH_SDL) - IF(WITH_QUICKTIME) - TARGET_LINK_LIBRARIES(${target} ${QUICKTIME_LIB}) - ENDIF(WITH_QUICKTIME) - IF(WITH_OPENEXR) - IF(WIN32) - FOREACH(loop_var ${OPENEXR_LIB}) - TARGET_LINK_LIBRARIES(${target} debug ${loop_var}_d) - TARGET_LINK_LIBRARIES(${target} optimized ${loop_var}) - ENDFOREACH(loop_var) - ELSE(WIN32) - TARGET_LINK_LIBRARIES(${target} ${OPENEXR_LIB}) - ENDIF(WIN32) - ENDIF(WITH_OPENEXR) - IF(WITH_FFMPEG) - TARGET_LINK_LIBRARIES(${target} ${FFMPEG_LIB}) - ENDIF(WITH_FFMPEG) - IF(WITH_OPENCOLLADA) - IF(WIN32) - FOREACH(loop_var ${OPENCOLLADA_LIB}) - TARGET_LINK_LIBRARIES(${target} debug ${loop_var}_d) - TARGET_LINK_LIBRARIES(${target} optimized ${loop_var}) - ENDFOREACH(loop_var) - TARGET_LINK_LIBRARIES(${target} debug ${PCRE_LIB}_d) - TARGET_LINK_LIBRARIES(${target} optimized ${PCRE_LIB}) - IF(EXPAT_LIB) - TARGET_LINK_LIBRARIES(${target} debug ${EXPAT_LIB}_d) - TARGET_LINK_LIBRARIES(${target} optimized ${EXPAT_LIB}) - ENDIF(EXPAT_LIB) - ELSE(WIN32) - TARGET_LINK_LIBRARIES(${target} ${OPENCOLLADA_LIB}) - TARGET_LINK_LIBRARIES(${target} ${PCRE_LIB}) - TARGET_LINK_LIBRARIES(${target} ${EXPAT_LIB}) - ENDIF(WIN32) - ENDIF(WITH_OPENCOLLADA) - IF(WIN32) - TARGET_LINK_LIBRARIES(${target} ${PTHREADS_LIB}) - ENDIF(WIN32) -ENDMACRO(SETUP_LIBLINKS) - diff --git a/CMakeLists.txt b/CMakeLists.txt index 35730af3f4f..bec1353a8cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ - # $Id$ +# $Id$ # ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or @@ -42,7 +42,11 @@ Remove the CMakeCache.txt file and try again from another folder, e.g.: ") ENDIF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) -CMAKE_MINIMUM_REQUIRED(VERSION 2.4) +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +# quiet output for Makefiles, 'make -s' helps too +# SET_PROPERTY(GLOBAL PROPERTY RULE_MESSAGES OFF) + PROJECT(Blender) #----------------------------------------------------------------------------- @@ -51,80 +55,104 @@ PROJECT(Blender) SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) -# Note! - Could create this from the blender version string -# ...but thats quite involved, make sure this matches the blender version. -SET(BLENDER_VERSION 2.5) +#----------------------------------------------------------------------------- +# Load some macros. +INCLUDE(build_files/cmake/macros.cmake) #----------------------------------------------------------------------------- # Set default config options -OPTION(WITH_PLAYER "Build Player" OFF) -OPTION(WITH_GAMEENGINE "Enable Game Engine" ON) -OPTION(WITH_BULLET "Enable Bullet (Physics Engine)" ON) -OPTION(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON) -OPTION(WITH_ELBEEM "Enable Elbeem (Fluid Simulation)" ON) -OPTION(WITH_QUICKTIME "Enable Quicktime Support" OFF) -OPTION(WITH_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" ON) -OPTION(WITH_DDS "Enable DDS Support" ON) -OPTION(WITH_FFMPEG "Enable FFMPeg Support (http://ffmpeg.mplayerhq.hu/)" OFF) -OPTION(WITH_PYTHON "Enable Embedded Python API" ON) -OPTION(WITH_SDL "Enable SDL for sound and joystick support" ON) -OPTION(WITH_OPENJPEG "Enable OpenJpeg Support (http://www.openjpeg.org/)" OFF) -OPTION(WITH_OPENAL "Enable OpenAL Support (http://www.openal.org)" ON) -OPTION(WITH_WEBPLUGIN "Enable Web Plugin (Unix only)" OFF) -OPTION(WITH_FFTW3 "Enable FFTW3 support" OFF) -OPTION(WITH_JACK "Enable Jack Support (http://www.jackaudio.org)" OFF) -OPTION(WITH_SNDFILE "Enable libsndfile Support (http://www.mega-nerd.com/libsndfile)" OFF) -OPTION(WITH_LZO "Enable fast LZO compression, used for pointcache" ON) -OPTION(WITH_LZMA "Enable best LZMA compression, used for pointcache" ON) -OPTION(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation" OFF) -OPTION(WITH_BUILDINFO "Include extra build details" ON) -OPTION(WITH_INSTALL "Install accompanying scripts and language files needed to run blender" ON) -OPTION(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org/)" ON) -# Unix defaults to OpenMP On +GET_BLENDER_VERSION() + +# Blender internal features +OPTION(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON) +OPTION(WITH_LCMS "Enable color correction with lcms" OFF) +OPTION(WITH_PYTHON "Enable Embedded Python API" ON) +OPTION(WITH_BUILDINFO "Include extra build details" ON) +OPTION(WITH_ELBEEM "Enable Elbeem (Fluid Simulation)" ON) +OPTION(WITH_FFTW3 "Enable FFTW3 support (Used for smoke and audio effects)" OFF) +OPTION(WITH_BULLET "Enable Bullet (Physics Engine)" ON) +OPTION(WITH_GAMEENGINE "Enable Game Engine" ON) +OPTION(WITH_PLAYER "Build Player" OFF) +# (unix defaults to OpenMP On) IF(UNIX AND NOT APPLE) OPTION(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" ON) ELSE() OPTION(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" OFF) ENDIF() -OPTION(WITH_RAYOPTIMIZATION "Enable use of SIMD (SSE) optimizations for the raytracer" OFF) +# Image format support +OPTION(WITH_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" ON) +OPTION(WITH_OPENJPEG "Enable OpenJpeg Support (http://www.openjpeg.org/)" OFF) +OPTION(WITH_TIFF "Enable LibTIFF Support" ON) +OPTION(WITH_DDS "Enable DDS Support" ON) -IF (APPLE) +# Audio format support +OPTION(WITH_FFMPEG "Enable FFMPeg Support (http://ffmpeg.mplayerhq.hu/)" OFF) +OPTION(WITH_SNDFILE "Enable libsndfile Support (http://www.mega-nerd.com/libsndfile)" OFF) +IF(APPLE OR WIN32) + OPTION(WITH_QUICKTIME "Enable Quicktime Support" OFF) +ENDIF(APPLE OR WIN32) + +# 3D format support +# disable opencollada on non-apple unix because opencollada has no package for debian +IF(UNIX AND NOT APPLE) + OPTION(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org/)" OFF) +ELSE() + OPTION(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org/)" OFF) +ENDIF() + +# Sound output +OPTION(WITH_SDL "Enable SDL for sound and joystick support" ON) +OPTION(WITH_OPENAL "Enable OpenAL Support (http://www.openal.org)" ON) +OPTION(WITH_JACK "Enable Jack Support (http://www.jackaudio.org)" OFF) + +# Compression +OPTION(WITH_LZO "Enable fast LZO compression (used for pointcache)" ON) +OPTION(WITH_LZMA "Enable best LZMA compression, (used for pointcache)" ON) + +# Misc +OPTION(WITH_RAYOPTIMIZATION "Enable use of SIMD (SSE) optimizations for the raytracer" ON) +OPTION(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation tracking" OFF) +OPTION(WITH_INSTALL "Install accompanying scripts and language files needed to run blender" ON) + +IF(APPLE) OPTION(WITH_COCOA "Use Cocoa framework instead of deprecated Carbon" ON) OPTION(USE_QTKIT "Use QtKit instead of Carbon quicktime (needed for having partial quicktime for 64bit)" OFF) OPTION(WITH_LIBS10.5 "Use 10.5 libs (needed for 64bit builds)" OFF) -ENDIF (APPLE) +ENDIF(APPLE) + +IF(NOT WITH_BULLET AND WITH_GAMEENGINE) + MESSAGE("WARNING: WITH_GAMEENGINE needs WITH_BULLET") +ENDIF(NOT WITH_BULLET AND WITH_GAMEENGINE) IF(NOT WITH_GAMEENGINE AND WITH_PLAYER) MESSAGE("WARNING: WITH_PLAYER needs WITH_GAMEENGINE") ENDIF(NOT WITH_GAMEENGINE AND WITH_PLAYER) +TEST_SSE_SUPPORT() + +# disabled for now, not supported +# OPTION(WITH_WEBPLUGIN "Enable Web Plugin (Unix only)" OFF) + # For alternate Python locations the commandline can be used to override detected/default cache settings, e.g: # On Unix: -# cmake -D PYTHON_LIB=/usr/local/lib/python2.3/config/libpython2.3.so -D PYTHON_INC=/usr/local/include/python2.3 -D PYTHON_BINARY=/usr/local/bin/python2.3 -G "Unix Makefiles" ../blender +# cmake -D PYTHON_LIB=/usr/local/lib/python3.1/config/libpython3.1.so -D PYTHON_INC=/usr/local/include/python3.1 -G "Unix Makefiles" ../blender # On Macs: -# cmake -D PYTHON_INC=/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -D PYTHON_LIBPATH=/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config -D PYTHON_BINARY=/System/Library/Frameworks/Python.framework/Versions/2.5/bin/python2.5 -G Xcode ../blender +# cmake -D PYTHON_INC=/System/Library/Frameworks/Python.framework/Versions/3.1/include/python3.1 -D PYTHON_LIBPATH=/System/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/config -G Xcode ../blender # # When changing any of this remember to update the notes in doc/blender-cmake.txt -#----------------------------------------------------------------------------- -# Load some macros. -INCLUDE(CMake/macros.cmake) - #----------------------------------------------------------------------------- #Platform specifics IF(UNIX AND NOT APPLE) - IF(WITH_OPENAL) FIND_PACKAGE(OpenAL) - IF(OPENAL_FOUND) - SET(WITH_OPENAL ON) - ELSE(OPENAL_FOUND) + IF(NOT OPENAL_FOUND) SET(WITH_OPENAL OFF) - ENDIF(OPENAL_FOUND) + ENDIF(NOT OPENAL_FOUND) ENDIF(WITH_OPENAL) IF(WITH_JACK) @@ -141,37 +169,43 @@ IF(UNIX AND NOT APPLE) SET(SNDFILE_LIBPATH ${SNDFILE}/lib) ENDIF(WITH_SNDFILE) - FIND_LIBRARY(INTL_LIBRARY - NAMES intl - PATHS - /sw/lib - ) - FIND_LIBRARY(ICONV_LIBRARY - NAMES iconv - PATHS - /sw/lib - ) - - IF(INTL_LIBRARY AND ICONV_LIBRARY) - SET(GETTEXT_LIB ${INTL_LIBRARY} ${ICONV_LIBRARY}) - ENDIF(INTL_LIBRARY AND ICONV_LIBRARY) + IF(WITH_INTERNATIONAL) + FIND_LIBRARY(INTL_LIBRARY + NAMES intl + PATHS + /sw/lib + ) + + FIND_LIBRARY(ICONV_LIBRARY + NAMES iconv + PATHS + /sw/lib + ) + + IF(INTL_LIBRARY AND ICONV_LIBRARY) + SET(GETTEXT_LIB ${INTL_LIBRARY} ${ICONV_LIBRARY}) + ENDIF(INTL_LIBRARY AND ICONV_LIBRARY) + ENDIF(WITH_INTERNATIONAL) FIND_PACKAGE(Freetype) # UNSET(FREETYPE_INCLUDE_DIRS CACHE) # cant use - # No way to set py31. remove for now. - # FIND_PACKAGE(PythonLibs) - SET(PYTHON /usr) - SET(PYTHON_VERSION 3.1) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") - # SET(PYTHON_BINARY python) # not used yet - SET(PYTHON_LIB python${PYTHON_VERSION} CACHE STRING "") - SET(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "") - - # FIND_PACKAGE(PythonInterp) # not used yet - # SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "") - - SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic") + + IF(WITH_PYTHON) + # No way to set py31. remove for now. + # FIND_PACKAGE(PythonLibs) + SET(PYTHON /usr) + SET(PYTHON_VERSION 3.1) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_BINARY python) # not used yet + SET(PYTHON_LIB python${PYTHON_VERSION} CACHE STRING "") + SET(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "") + + # FIND_PACKAGE(PythonInterp) # not used yet + # SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "") + + SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic") + ENDIF(WITH_PYTHON) IF(WITH_SDL) FIND_PACKAGE(SDL) @@ -181,23 +215,53 @@ IF(UNIX AND NOT APPLE) ENDIF(NOT SDL_FOUND) ENDIF(WITH_SDL) - FIND_PATH(OPENEXR_INC - ImfXdr.h - PATHS - /usr/local/include/OpenEXR - /usr/include/OpenEXR - /sw/include/OpenEXR - /opt/local/include/OpenEXR - /opt/csw/include/OpenEXR - /opt/include/OpenEXR - ) - SET(OPENEXR_LIB Half IlmImf Iex Imath) + IF(WITH_OPENEXR) + SET(OPENEXR /usr CACHE FILEPATH "OPENEXR Directory") + FIND_PATH(OPENEXR_INC + ImfXdr.h + PATHS + ${OPENEXR}/include/OpenEXR + /usr/local/include/OpenEXR + /sw/include/OpenEXR + /opt/local/include/OpenEXR + /opt/csw/include/OpenEXR + /opt/include/OpenEXR + ) + SET(OPENEXR_LIB Half IlmImf Iex Imath) + + IF(NOT OPENEXR_INC) + SET(WITH_OPENEXR OFF) + ENDIF(NOT OPENEXR_INC) + ENDIF(WITH_OPENEXR) + + IF(WITH_TIFF) + FIND_PACKAGE(TIFF) + IF(NOT TIFF_FOUND) + SET(WITH_TIFF OFF) + ENDIF(NOT TIFF_FOUND) + ENDIF(WITH_TIFF) + + FIND_PACKAGE(JPEG REQUIRED) + + FIND_PACKAGE(PNG REQUIRED) + + FIND_PACKAGE(ZLIB REQUIRED) + + IF(WITH_LCMS) + SET(LCMS /usr CACHE FILEPATH "LCMS directory") + SET(LCMS_INCLUDE_DIR ${LCMS}/include) + SET(LCMS_LIBRARY lcms) + SET(LCMS_LIBPATH ${LCMS}/lib) + ENDIF(WITH_LCMS) + + IF(WITH_FFMPEG) + SET(FFMPEG /usr CACHE FILEPATH "FFMPEG Directory") + SET(FFMPEG_INC ${FFMPEG}/include) + SET(FFMPEG_LIB avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries") + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_CONSTANT_MACROS") + ENDIF(WITH_FFMPEG) - SET(FFMPEG /usr) - SET(FFMPEG_INC ${FFMPEG}/include) - SET(FFMPEG_LIB avformat avcodec avutil avdevice swscale) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) - IF(WITH_FFTW3) SET(FFTW3 /usr) SET(FFTW3_INC ${FFTW3}/include) @@ -210,12 +274,6 @@ IF(UNIX AND NOT APPLE) SET(LIBSAMPLERATE_LIB samplerate) SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) - FIND_PACKAGE(JPEG REQUIRED) - - FIND_PACKAGE(PNG REQUIRED) - - FIND_PACKAGE(ZLIB REQUIRED) - IF (WITH_OPENCOLLADA) SET(OPENCOLLADA /usr/local/opencollada CACHE FILEPATH "OpenCollada Directory") SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib) @@ -236,6 +294,10 @@ IF(UNIX AND NOT APPLE) IF(CMAKE_SYSTEM_NAME MATCHES "Linux") # BSD's dont use libdl.so SET(LLIBS "${LLIBS} -ldl") + + # binreloc is linux only + SET(BINRELOC ${CMAKE_SOURCE_DIR}/extern/binreloc) + SET(BINRELOC_INC ${BINRELOC}/include) ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") IF(WITH_OPENMP) @@ -247,6 +309,12 @@ IF(UNIX AND NOT APPLE) SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing -Wno-char-subscripts") + IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + SET(PLATFORM_CFLAGS " -msse -msse2 ${PLATFORM_CFLAGS}") + ADD_DEFINITIONS(-D__SSE__) + ADD_DEFINITIONS(-D__MMX__) + ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + SET(PLATFORM_LINKFLAGS "-pthread") # Better warnings @@ -256,6 +324,7 @@ IF(UNIX AND NOT APPLE) INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ) ENDIF(UNIX AND NOT APPLE) + IF(WIN32) # this file is included anyway when building under Windows with cl.exe @@ -268,133 +337,21 @@ IF(WIN32) message("64 bit compiler detected.") SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/win64) ENDIF(CMAKE_CL_64) + + ADD_DEFINITIONS(-DWIN32) - SET(PYTHON ${LIBDIR}/python) - SET(PYTHON_VERSION 3.1) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}") - # SET(PYTHON_BINARY python) # not used yet - SET(PYTHON_LIB python31) - SET(PYTHON_LIBPATH ${PYTHON}/lib) - - SET(OPENAL ${LIBDIR}/openal) - SET(OPENAL_INCLUDE_DIR ${OPENAL}/include) - SET(OPENAL_LIBRARY wrap_oal) - SET(OPENAL_LIBPATH ${OPENAL}/lib) - - IF(WITH_JACK) - SET(JACK ${LIBDIR}/jack) - SET(JACK_INC ${JACK}/include/jack ${JACK}/include) - SET(JACK_LIB libjack) - SET(JACK_LIBPATH ${JACK}/lib) - ENDIF(WITH_JACK) - - IF(WITH_SNDFILE) - SET(SNDFILE ${LIBDIR}/sndfile) - SET(SNDFILE_INC ${SNDFILE}/include) - SET(SNDFILE_LIB libsndfile-1) - SET(SNDFILE_LIBPATH ${SNDFILE}/lib) - ENDIF(WITH_SNDFILE) - - IF(CMAKE_CL_64) - SET(PNG_LIBRARIES libpng) - ELSE(CMAKE_CL_64) - SET(PNG_LIBRARIES libpng_st) - ENDIF(CMAKE_CL_64) - SET(JPEG_LIBRARY libjpeg) - - SET(ZLIB ${LIBDIR}/zlib) - SET(ZLIB_INC ${ZLIB}/include) - IF(CMAKE_CL_64) - SET(ZLIB_LIBRARIES libz) - ELSE(CMAKE_CL_64) - SET(ZLIB_LIBRARIES zlib) - ENDIF(CMAKE_CL_64) - SET(ZLIB_LIBPATH ${ZLIB}/lib) - - SET(PTHREADS ${LIBDIR}/pthreads) - SET(PTHREADS_INC ${PTHREADS}/include) - SET(PTHREADS_LIB pthreadVC2) - SET(PTHREADS_LIBPATH ${PTHREADS}/lib) - - SET(ICONV ${LIBDIR}/iconv) - SET(ICONV_INC ${ICONV}/include) - SET(ICONV_LIB iconv) - SET(ICONV_LIBPATH ${ICONV}/lib) - - IF(WITH_FFTW3) - SET(FFTW3 ${LIBDIR}/fftw3) - SET(FFTW3_INC ${FFTW3}/include) - SET(FFTW3_LIB libfftw) - SET(FFTW3_LIBPATH ${FFTW3}/lib) - ENDIF(WITH_FFTW3) - - SET(GETTEXT ${LIBDIR}/gettext) - SET(GETTEXT_INC ${GETTEXT}/include) - IF(CMAKE_CL_64) - SET(GETTEXT_LIB gettext) - ELSE(CMAKE_CL_64) - SET(GETTEXT_LIB gnu_gettext) - ENDIF(CMAKE_CL_64) - SET(GETTEXT_LIBPATH ${GETTEXT}/lib) - - SET(FREETYPE ${LIBDIR}/freetype) - SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) - SET(FREETYPE_LIBPATH ${FREETYPE}/lib) - SET(FREETYPE_LIBRARY freetype2ST) - - SET(OPENEXR ${LIBDIR}/openexr) - SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath) - SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) - IF (MSVC80) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005) - ELSE (MSVC80) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc) - ENDIF(MSVC80) - IF (MSVC90) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2008) - ENDIF(MSVC90) - - - SET(QUICKTIME ${LIBDIR}/QTDevWin) - SET(QUICKTIME_INC ${QUICKTIME}/CIncludes) - SET(QUICKTIME_LIB qtmlClient) - SET(QUICKTIME_LIBPATH ${QUICKTIME}/Libraries) - - SET(FFMPEG ${LIBDIR}/ffmpeg) - SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include/msvc) - SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + IF(WITH_INTERNATIONAL) + SET(ICONV ${LIBDIR}/iconv) + SET(ICONV_INC ${ICONV}/include) + SET(ICONV_LIB iconv) + SET(ICONV_LIBPATH ${ICONV}/lib) + ENDIF(WITH_INTERNATIONAL) SET(LIBSAMPLERATE ${LIBDIR}/samplerate) SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) SET(LIBSAMPLERATE_LIB libsamplerate) SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) - IF(CMAKE_CL_64) - SET(LLIBS kernel32 user32 vfw32 winmm ws2_32 ) - ELSE(CMAKE_CL_64) - SET(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm) - ENDIF(CMAKE_CL_64) - - SET(CMAKE_CXX_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) - - IF(WITH_OPENMP) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp ") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp ") - ENDIF(WITH_OPENMP) - - SET(SDL ${LIBDIR}/sdl) - SET(SDL_INCLUDE_DIR ${SDL}/include) - SET(SDL_LIBRARY SDL) - SET(SDL_LIBPATH ${SDL}/lib) - SET(PNG "${LIBDIR}/png") SET(PNG_INC "${PNG}/include") SET(PNG_LIBPATH ${PNG}/lib) @@ -403,30 +360,283 @@ IF(WIN32) SET(JPEG_INC "${JPEG}/include") SET(JPEG_LIBPATH ${JPEG}/lib) - SET(TIFF ${LIBDIR}/tiff) - SET(TIFF_INC ${TIFF}/include) - SET(WINTAB_INC ${LIBDIR}/wintab/include) - SET(OPENCOLLADA ${LIBDIR}/opencollada) - SET(OPENCOLLADA_INC ${OPENCOLLADA}/include) - SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib) - SET(OPENCOLLADA_LIB OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils OpenCOLLADAStreamWriter MathMLSolver GeneratedSaxParser UTF xml2 buffer ftoa) - #pcre is bundled with openCollada - #SET(PCRE ${LIBDIR}/pcre) - #SET(PCRE_LIBPATH ${PCRE}/lib) - SET(PCRE_LIB pcre) + IF(WITH_PYTHON) + SET(PYTHON ${LIBDIR}/python) + SET(PYTHON_VERSION 3.1) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}") + # SET(PYTHON_BINARY python) # not used yet + SET(PYTHON_LIB python31) + SET(PYTHON_LIBPATH ${PYTHON}/lib) + ENDIF(WITH_PYTHON) + IF(WITH_OPENAL) + SET(OPENAL ${LIBDIR}/openal) + SET(OPENAL_INCLUDE_DIR ${OPENAL}/include) + SET(OPENAL_LIBRARY wrap_oal) + SET(OPENAL_LIBPATH ${OPENAL}/lib) + ENDIF(WITH_OPENAL) + + IF(WITH_SNDFILE) + SET(SNDFILE ${LIBDIR}/sndfile) + SET(SNDFILE_INC ${SNDFILE}/include) + SET(SNDFILE_LIB libsndfile-1) + SET(SNDFILE_LIBPATH ${SNDFILE}/lib) + ENDIF(WITH_SNDFILE) + + IF(WITH_SDL) + SET(SDL ${LIBDIR}/sdl) + SET(SDL_INCLUDE_DIR ${SDL}/include) + SET(SDL_LIBRARY SDL) + SET(SDL_LIBPATH ${SDL}/lib) + ENDIF(WITH_SDL) + + IF(WITH_QUICKTIME) + SET(QUICKTIME ${LIBDIR}/QTDevWin) + SET(QUICKTIME_INC ${QUICKTIME}/CIncludes) + SET(QUICKTIME_LIB qtmlClient) + SET(QUICKTIME_LIBPATH ${QUICKTIME}/Libraries) + ENDIF(WITH_QUICKTIME) + + IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + ADD_DEFINITIONS(-D__SSE__) + ADD_DEFINITIONS(-D__MMX__) + ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + + IF(MSVC) + IF(CMAKE_CL_64) + SET(LLIBS kernel32 user32 vfw32 winmm ws2_32 ) + ELSE(CMAKE_CL_64) + SET(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm) + ENDIF(CMAKE_CL_64) + + SET(CMAKE_CXX_FLAGS "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305" CACHE STRING "MSVC MT C++ flags " FORCE) + SET(CMAKE_C_FLAGS "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305" CACHE STRING "MSVC MT C++ flags " FORCE) + + SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) + + IF(WITH_OPENMP) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp ") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp ") + ENDIF(WITH_OPENMP) + + IF(WITH_INTERNATIONAL) + SET(GETTEXT ${LIBDIR}/gettext) + SET(GETTEXT_INC ${GETTEXT}/include) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + IF(CMAKE_CL_64) + SET(GETTEXT_LIB gettext) + ELSE(CMAKE_CL_64) + SET(GETTEXT_LIB gnu_gettext) + ENDIF(CMAKE_CL_64) + ENDIF(WITH_INTERNATIONAL) + + IF(CMAKE_CL_64) + SET(PNG_LIBRARIES libpng) + ELSE(CMAKE_CL_64) + SET(PNG_LIBRARIES libpng_st) + ENDIF(CMAKE_CL_64) + SET(JPEG_LIBRARY libjpeg) + + SET(ZLIB ${LIBDIR}/zlib) + SET(ZLIB_INC ${ZLIB}/include) + SET(ZLIB_LIBPATH ${ZLIB}/lib) + IF(CMAKE_CL_64) + SET(ZLIB_LIBRARIES libz) + ELSE(CMAKE_CL_64) + SET(ZLIB_LIBRARIES zlib) + ENDIF(CMAKE_CL_64) + + SET(PTHREADS ${LIBDIR}/pthreads) + SET(PTHREADS_INC ${PTHREADS}/include) + SET(PTHREADS_LIBPATH ${PTHREADS}/lib) + SET(PTHREADS_LIB pthreadVC2) + + SET(FREETYPE ${LIBDIR}/freetype) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) + SET(FREETYPE_LIBPATH ${FREETYPE}/lib) + SET(FREETYPE_LIBRARY freetype2ST) + + IF(WITH_FFTW3) + SET(FFTW3 ${LIBDIR}/fftw3) + SET(FFTW3_LIB libfftw) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) + + IF(WITH_OPENCOLLADA) + SET(OPENCOLLADA ${LIBDIR}/opencollada) + SET(OPENCOLLADA_INC ${OPENCOLLADA}/include) + SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib) + SET(OPENCOLLADA_LIB OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils OpenCOLLADAStreamWriter MathMLSolver GeneratedSaxParser xml2 buffer ftoa) + #pcre is bundled with openCollada + #SET(PCRE ${LIBDIR}/pcre) + #SET(PCRE_LIBPATH ${PCRE}/lib) + SET(PCRE_LIB pcre) + ENDIF(WITH_OPENCOLLADA) + + # TODO: IF(WITH_LCMS) + + IF(WITH_FFMPEG) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include/msvc) + SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + ENDIF(WITH_FFMPEG) + + IF(WITH_OPENEXR) + SET(OPENEXR ${LIBDIR}/openexr) + SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath) + SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) + IF (MSVC80) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005) + ELSE (MSVC80) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc) + ENDIF(MSVC80) + IF (MSVC90) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2008) + ENDIF(MSVC90) + ENDIF(WITH_OPENEXR) + + IF(WITH_TIFF) + SET(TIFF ${LIBDIR}/tiff) + SET(TIFF_LIBRARY libtiff) + SET(TIFF_INCLUDE_DIR ${TIFF}/include) + SET(TIFF_LIBPATH ${TIFF}/lib) + ENDIF(WITH_TIFF) + + IF(WITH_JACK) + SET(JACK ${LIBDIR}/jack) + SET(JACK_INC ${JACK}/include/jack ${JACK}/include) + SET(JACK_LIB libjack) + SET(JACK_LIBPATH ${JACK}/lib) + ENDIF(WITH_JACK) + + # MSVC only, Mingw doesnt need + IF(CMAKE_CL_64) + SET(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib;MSVCRT.lib ") + ELSE(CMAKE_CL_64) + SET(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ") + ENDIF(CMAKE_CL_64) + + SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ") + + ELSE(MSVC) # MINGW + SET(LLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid") + + SET(CMAKE_CXX_FLAGS "-pipe -funsigned-char -fno-strict-aliasing" CACHE STRING "Mingw C++ flags ") + SET(CMAKE_C_FLAGS "-pipe -funsigned-char -fno-strict-aliasing" CACHE STRING "Mingw C flags ") + + SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "Mingw debug C++ flags ") + SET(CMAKE_CXX_FLAGS_RELEASE " -O2" CACHE STRING "Mingw release C++ flags ") + SET(CMAKE_CXX_FLAGS_MINSIZEREL " -Os" CACHE STRING "Mingw minsize release C++ flags ") + SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Mingw release, debug C++ flags ") + + SET(CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE STRING "Mingw debug C flags ") + SET(CMAKE_C_FLAGS_RELEASE "-O2" CACHE STRING "Mingw release C flags ") + SET(CMAKE_C_FLAGS_MINSIZEREL "-Os" CACHE STRING "Mingw minsize release C flags ") + SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Mingw release, debug C++ flags ") + ADD_DEFINITIONS(-DFREE_WINDOWS) + + IF(WITH_OPENMP) + SET(LLIBS "${LLIBS} -lgomp") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") + ENDIF(WITH_OPENMP) + + IF(WITH_INTERNATIONAL) + SET(GETTEXT ${LIBDIR}/gcc/gettext) + SET(GETTEXT_INC ${GETTEXT}/include) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + SET(GETTEXT_LIB intl) + ENDIF(WITH_INTERNATIONAL) + + SET(JPEG_LIBRARY libjpeg) + SET(PNG_LIBRARIES png) + + SET(ZLIB ${LIBDIR}/zlib) + SET(ZLIB_INC ${ZLIB}/include) + SET(ZLIB_LIBPATH ${ZLIB}/lib) + SET(ZLIB_LIBRARIES z) + + SET(PTHREADS ${LIBDIR}/pthreads) + SET(PTHREADS_INC ${PTHREADS}/include) + SET(PTHREADS_LIBPATH ${PTHREADS}/lib) + SET(PTHREADS_LIB pthreadGC2) + + SET(FREETYPE ${LIBDIR}/gcc/freetype) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) + SET(FREETYPE_LIBPATH ${FREETYPE}/lib) + SET(FREETYPE_LIBRARY freetype) + + IF(WITH_FFTW3) + SET(FFTW3 ${LIBDIR}/gcc/fftw3) + SET(FFTW3_LIB fftw3) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) + + IF(WITH_OPENCOLLADA) + SET(OPENCOLLADA ${LIBDIR}/gcc/opencollada) + SET(OPENCOLLADA_INC ${OPENCOLLADA}/include) + SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib ${OPENCOLLADA}/lib) + SET(OPENCOLLADA_LIB OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver expat pcre buffer ftoa) + #pcre is bundled with openCollada + #SET(PCRE ${LIBDIR}/pcre) + #SET(PCRE_LIBPATH ${PCRE}/lib) + SET(PCRE_LIB pcre) + ENDIF(WITH_OPENCOLLADA) + + IF(WITH_FFMPEG) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include) + SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + ENDIF(WITH_FFMPEG) + + IF(WITH_OPENEXR) + SET(OPENEXR ${LIBDIR}/gcc/openexr) + SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/OpenEXR) + SET(OPENEXR_LIB Half IlmImf Imath IlmThread) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib) + ENDIF(WITH_OPENEXR) + + IF(WITH_TIFF) + SET(TIFF ${LIBDIR}/gcc/tiff) + SET(TIFF_LIBRARY tiff) + SET(TIFF_INCLUDE_DIR ${TIFF}/include) + SET(TIFF_LIBPATH ${TIFF}/lib) + ENDIF(WITH_TIFF) + + IF(WITH_JACK) + SET(JACK ${LIBDIR}/jack) + SET(JACK_INC ${JACK}/include/jack ${JACK}/include) + SET(JACK_LIB jack) + SET(JACK_LIBPATH ${JACK}/lib) + + # TODO, gives linking errors, force off + SET(WITH_JACK OFF) + ENDIF(WITH_JACK) + + IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + SET(PLATFORM_CFLAGS " -msse -msse2 ${PLATFORM_CFLAGS}") + ADD_DEFINITIONS(-D__SSE__) + ADD_DEFINITIONS(-D__MMX__) + ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + + ENDIF(MSVC) - IF(CMAKE_CL_64) - SET(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib;MSVCRT.lib ") - ELSE(CMAKE_CL_64) - SET(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ") - ENDIF(CMAKE_CL_64) - - SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ") ENDIF(WIN32) + IF(APPLE) IF(WITH_LIBS10.5) SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-9.x.universal) @@ -459,8 +669,8 @@ IF(APPLE) IF(WITH_SNDFILE) SET(SNDFILE ${LIBDIR}/sndfile) SET(SNDFILE_INC ${SNDFILE}/include) - SET(SNDFILE_LIB sndfile) - SET(SNDFILE_LIBPATH ${SNDFILE}/lib) + SET(SNDFILE_LIB sndfile FLAC ogg vorbis vorbisenc) + SET(SNDFILE_LIBPATH ${SNDFILE}/lib ${FFMPEG}/lib) ENDIF(WITH_SNDFILE) SET(PYTHON_VERSION 3.1) @@ -473,12 +683,12 @@ IF(APPLE) # SET(PYTHON_BINARY "${PYTHON}/bin/python${PYTHON_VERSION}") # not used yet SET(PYTHON_LIB python${PYTHON_VERSION}) SET(PYTHON_LIBPATH "${PYTHON}/lib/python${PYTHON_VERSION}") - # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled + # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled ELSE(PYTHON_VERSION MATCHES 3.1) # otherwise, use custom system framework SET(PYTHON /System/Library/Frameworks/Python.framework/Versions/) - SET(PYTHON_VERSION 2.5) + SET(PYTHON_VERSION 3.1) SET(PYTHON_INC "${PYTHON}${PYTHON_VERSION}/include/python${PYTHON_VERSION}") # SET(PYTHON_BINARY ${PYTHON}${PYTHON_VERSION}/bin/python${PYTHON_VERSION}) # not used yet SET(PYTHON_LIB "") @@ -486,10 +696,12 @@ IF(APPLE) SET(PYTHON_LINKFLAGS "-u _PyMac_Error -framework System -framework Python") ENDIF(PYTHON_VERSION MATCHES 3.1) - SET(GETTEXT ${LIBDIR}/gettext) - SET(GETTEXT_INC "${GETTEXT}/include") - SET(GETTEXT_LIB intl iconv) - SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + IF(WITH_INTERNATIONAL) + SET(GETTEXT ${LIBDIR}/gettext) + SET(GETTEXT_INC "${GETTEXT}/include") + SET(GETTEXT_LIB intl iconv) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + ENDIF(WITH_INTERNATIONAL) IF(WITH_FFTW3) SET(FFTW3 ${LIBDIR}/fftw3) @@ -510,15 +722,27 @@ IF(APPLE) SET(FREETYPE_LIBPATH ${FREETYPE}/lib) SET(FREETYPE_LIBRARY freetype) - SET(OPENEXR ${LIBDIR}/openexr) - SET(OPENEXR_INC ${OPENEXR}/include/OpenEXR ${OPENEXR}/include) - SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib) + IF(WITH_OPENEXR) + SET(OPENEXR ${LIBDIR}/openexr) + SET(OPENEXR_INC ${OPENEXR}/include/OpenEXR ${OPENEXR}/include) + SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib) + ENDIF(WITH_OPENEXR) - SET(FFMPEG ${LIBDIR}/ffmpeg) - SET(FFMPEG_INC ${FFMPEG}/include) - SET(FFMPEG_LIB avcodec avdevice avformat avutil mp3lame swscale x264 xvidcore theora theoradec theoraenc vorbis vorbisenc vorbisfile ogg) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + IF(WITH_LCMS) + SET(LCMS ${LIBDIR}/lcms) + SET(LCMS_INCLUDE_DIR ${LCMS}/include) + SET(LCMS_LIBRARY lcms) + SET(LCMS_LIBPATH ${LCMS}/lib) + ENDIF(WITH_LCMS) + + IF(WITH_FFMPEG) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${FFMPEG}/include) + SET(FFMPEG_LIB avcodec avdevice avformat avutil mp3lame swscale x264 xvidcore theora theoradec theoraenc vorbis vorbisenc vorbisfile ogg) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_CONSTANT_MACROS") + ENDIF(WITH_FFMPEG) SET(LIBSAMPLERATE ${LIBDIR}/samplerate) SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) @@ -566,10 +790,12 @@ IF(APPLE) SET(EXPAT_LIB) ENDIF (WITH_OPENCOLLADA) - SET(SDL ${LIBDIR}/sdl) - SET(SDL_INCLUDE_DIR ${SDL}/include) - SET(SDL_LIBRARY SDL) - SET(SDL_LIBPATH ${SDL}/lib) + IF(WITH_SDL) + SET(SDL ${LIBDIR}/sdl) + SET(SDL_INCLUDE_DIR ${SDL}/include) + SET(SDL_LIBRARY SDL) + SET(SDL_LIBPATH ${SDL}/lib) + ENDIF(WITH_SDL) SET(PNG "${LIBDIR}/png") SET(PNG_INC "${PNG}/include") @@ -579,8 +805,18 @@ IF(APPLE) SET(JPEG_INC "${JPEG}/include") SET(JPEG_LIBPATH ${JPEG}/lib) - SET(TIFF ${LIBDIR}/tiff) - SET(TIFF_INC ${TIFF}/include) + IF(WITH_TIFF) + SET(TIFF ${LIBDIR}/tiff) + SET(TIFF_INCLUDE_DIR ${TIFF}/include) + SET(TIFF_LIBRARY tiff) + SET(TIFF_LIBPATH ${TIFF}/lib) + ENDIF(WITH_TIFF) + + IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) + SET(PLATFORM_CFLAGS " -msse -msse2 ${PLATFORM_CFLAGS}") + ADD_DEFINITIONS(-D__SSE__) + ADD_DEFINITIONS(-D__MMX__) + ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD) SET(EXETYPE MACOSX_BUNDLE) @@ -603,11 +839,6 @@ IF(APPLE) ENDIF(APPLE) -IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - SET(BINRELOC ${CMAKE_SOURCE_DIR}/extern/binreloc) - SET(BINRELOC_INC ${BINRELOC}/include) -ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") - # buildinfo IF(WITH_BUILDINFO) @@ -633,10 +864,11 @@ ENDIF(WITH_BUILDINFO) #----------------------------------------------------------------------------- # Common. - -set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg) -set(OPENJPEG_INC ${OPENJPEG}) -set(OPENJPEG_LIb extern_libopenjpeg) +IF(WITH_OPENJPEG) + set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg) + set(OPENJPEG_INC ${OPENJPEG}) + set(OPENJPEG_LIb extern_libopenjpeg) +ENDIF(WITH_OPENJPEG) #----------------------------------------------------------------------------- # Blender WebPlugin diff --git a/COPYING b/COPYING index 232ee776d87..6e1e14ac224 100644 --- a/COPYING +++ b/COPYING @@ -1,3 +1,11 @@ -Please read over both of the following files: +Blender uses the GNU General Public License, which describes the rights +to distribute or change the code. + +Please read this file for the full license. doc/GPL-license.txt -doc/BL-license.txt + +Apart from the GNU GPL, Blender is not available under other licenses. + +2010, Blender Foundation +foundation@blender.org + diff --git a/Makefile b/Makefile index 7c883c41741..b16e046d5e8 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ sinclude user-def.mk # export NAN_NO_OPENAL=true export NANBLENDERHOME=$(shell pwd) -MAKEFLAGS=-I$(NANBLENDERHOME)/source --no-print-directory +MAKEFLAGS=-I$(NANBLENDERHOME)/build_files/make --no-print-directory SOURCEDIR = ifeq ($(FREE_WINDOWS),true) @@ -50,7 +50,7 @@ else DIRS ?= extern intern source po endif -include source/nan_subdirs.mk +include build_files/make/nan_subdirs.mk .PHONY: release release: diff --git a/README b/README deleted file mode 100644 index 1a7964f954e..00000000000 --- a/README +++ /dev/null @@ -1,45 +0,0 @@ -Welcome to the fun world of open source. - -For instructions on building and installing Blender, please see the file named -INSTALL. - - ----------------------.Blanguages and the .blender directory--------------------- - -The .blender directory holds various data files for Blender. -In the 2.28a release those are the .Blanguages file containing a list of -translations, the translations themselves and a default ttf font. - -Blender checks for the presence of this directory in several locations: - - the current directory - - your home directory - - On OSX, the blender bundle is also checked - - On Windows, the installation dir is checked. - -If you get a 'File ".Blanguages" not found' warning, try to copy the .blender -dir to one of these locations (your home directory being recommended). - - - --------------------------------------Links-------------------------------------- - -Getting Involved: -http://www.blender.org/community/get-involved - -Community: -http://www.blender.org/Community - -Main blender development site: -http://www.blender.org - -The Blender project homepage: -http://projects.blender.org/projects/bf-blender - -Documentation: -http://www.blender.org/education-help - -Bug tracker: -http://www.blender.org/development/report-a-bug - -Feature request tracker: -http://wiki.blender.org/index.php/Requests diff --git a/SConstruct b/SConstruct index bfb36ce7cee..3aaafe0f648 100644 --- a/SConstruct +++ b/SConstruct @@ -46,15 +46,19 @@ import glob import re from tempfile import mkdtemp -import tools.Blender -import tools.btools -import tools.bcolors +# needed for importing tools +sys.path.append(os.path.join(".", "build_files", "scons", "tools")) + +import Blender +import btools +import bcolors EnsureSConsVersion(1,0,0) -BlenderEnvironment = tools.Blender.BlenderEnvironment -btools = tools.btools -B = tools.Blender +BlenderEnvironment = Blender.BlenderEnvironment +B = Blender + +VERSION = btools.VERSION # This is used in creating the local config directories ### globals ### platform = sys.platform @@ -157,7 +161,7 @@ if crossbuild and platform not in ('win32-vc', 'win64-vc'): env['OURPLATFORM'] = platform -configfile = 'config'+os.sep+platform+'-config.py' +configfile = os.path.join("build_files", "scons", "config", platform + "-config.py") if os.path.exists(configfile): print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + configfile @@ -182,7 +186,7 @@ if os.path.exists(userconfig): else: print B.bc.WARNING + userconfig + " not found, no user overrides" + B.bc.ENDC -opts = btools.read_opts(optfiles, B.arguments) +opts = btools.read_opts(env, optfiles, B.arguments) opts.Update(env) if not env['BF_FANCY']: @@ -193,7 +197,7 @@ if not env['BF_FANCY']: # NOTE: only do the scripts directory for now, otherwise is too disruptive for developers # TODO: perhaps we need an option (off by default) to not do this altogether... if not env['WITHOUT_BF_INSTALL'] and not env['WITHOUT_BF_OVERWRITE_INSTALL']: - scriptsDir = env['BF_INSTALLDIR'] + os.sep + '.blender' + os.sep + 'scripts' + scriptsDir = os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts') if os.path.isdir(scriptsDir): print B.bc.OKGREEN + "Clearing installation directory%s: %s" % (B.bc.ENDC, os.path.abspath(scriptsDir)) shutil.rmtree(scriptsDir) @@ -201,6 +205,7 @@ if not env['WITHOUT_BF_INSTALL'] and not env['WITHOUT_BF_OVERWRITE_INSTALL']: SetOption('num_jobs', int(env['BF_NUMJOBS'])) print B.bc.OKGREEN + "Build with parallel jobs%s: %s" % (B.bc.ENDC, GetOption('num_jobs')) +print B.bc.OKGREEN + "Build with debug symbols%s: %s" % (B.bc.ENDC, env['BF_DEBUG']) # BLENDERPATH is a unix only option to enable typical style paths this is # spesifically a data-dir, which is used a lot but cant replace BF_INSTALLDIR @@ -268,6 +273,7 @@ if 'blenderlite' in B.targets: target_env_defs['WITH_BF_GAMEENGINE'] = False target_env_defs['WITH_BF_OPENAL'] = False target_env_defs['WITH_BF_OPENEXR'] = False + target_env_defs['WITH_BF_OPENMP'] = False target_env_defs['WITH_BF_ICONV'] = False target_env_defs['WITH_BF_INTERNATIONAL'] = False target_env_defs['WITH_BF_OPENJPEG'] = False @@ -402,7 +408,7 @@ thestatlibs, thelibincs = B.setup_staticlibs(env) thesyslibs = B.setup_syslibs(env) if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']: - env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender') + env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender') if env['WITH_BF_PLAYER']: playerlist = B.create_blender_liblist(env, 'player') playerlist += B.create_blender_liblist(env, 'intern') @@ -432,9 +438,11 @@ else: blenderinstall = env.Install(dir=dir, source=B.program_list) -#-- .blender -#- dont do .blender and scripts for darwin, it is already in the bundle +#-- local path = config files in install dir: installdir\VERSION +#- dont do config and scripts for darwin, it is already in the bundle dotblendlist = [] +datafileslist = [] +datafilestargetlist = [] dottargetlist = [] scriptinstall = [] @@ -453,22 +461,29 @@ if env['OURPLATFORM']!='darwin': if f.endswith('.ttf'): continue - dotblendlist.append(os.path.join(dp, f)) - if env['WITH_BF_FHS']: dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:])) # skip bin/.blender - else: dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:])) # skip bin - - # print dir+ os.sep + f - print dir - dottargetlist.append(dir + os.sep + f) - + if 'locale' in dp: + datafileslist.append(os.path.join(dp,f)) + if env['WITH_BF_FHS']: dir= os.path.join(*([BLENDERPATH] + ['datafiles'] + dp.split(os.sep)[2:])) # skip bin/.blender + else: dir= os.path.join(*([BLENDERPATH] + [VERSION] + ['datafiles'] + dp.split(os.sep)[1:])) # skip bin + datafilestargetlist.append(dir + os.sep + f) + else: + dotblendlist.append(os.path.join(dp, f)) + if env['WITH_BF_FHS']: dir= os.path.join(*([BLENDERPATH] + ['config'] + dp.split(os.sep)[2:])) # skip bin/.blender + else: dir= os.path.join(*([BLENDERPATH] + [VERSION] + ['config'] + dp.split(os.sep)[1:])) # skip bin + + dottargetlist.append(dir + os.sep + f) + dotblenderinstall = [] for targetdir,srcfile in zip(dottargetlist, dotblendlist): td, tf = os.path.split(targetdir) dotblenderinstall.append(env.Install(dir=td, source=srcfile)) + for targetdir,srcfile in zip(datafilestargetlist, datafileslist): + td, tf = os.path.split(targetdir) + dotblenderinstall.append(env.Install(dir=td, source=srcfile)) if env['WITH_BF_PYTHON']: - #-- .blender/scripts + #-- local/VERSION/scripts scriptpaths=['release/scripts'] for scriptpath in scriptpaths: for dp, dn, df in os.walk(scriptpath): @@ -476,7 +491,7 @@ if env['OURPLATFORM']!='darwin': dn.remove('.svn') if env['WITH_BF_FHS']: dir = BLENDERPATH - else: dir = os.path.join(env['BF_INSTALLDIR'], '.blender') + else: dir = os.path.join(env['BF_INSTALLDIR'], VERSION) dir += os.sep + os.path.basename(scriptpath) + dp[len(scriptpath):] source=[os.path.join(dp, f) for f in df if f[-3:]!='pyc'] @@ -569,10 +584,12 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'): #currently win64-vc doesn't appear to have libpng.dll if env['OURPLATFORM'] != 'win64-vc': - dllsources += ['${BF_PNG_LIBPATH}/libpng.dll', - '${BF_ZLIB_LIBPATH}/zlib.dll'] + dllsources += ['${BF_PNG_LIBPATH}/libpng.dll'] - dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll'] + dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll'] + # Used when linking to libtiff was dynamic + # keep it here until compilation on all platform would be ok + # dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll'] if env['OURPLATFORM'] != 'linuxcross': # pthreads library is already added diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake new file mode 100644 index 00000000000..84e6b788dc0 --- /dev/null +++ b/build_files/cmake/macros.cmake @@ -0,0 +1,233 @@ +MACRO(BLENDERLIB_NOLIST + name + sources + includes) + + # Gather all headers + FILE(GLOB_RECURSE INC_ALL *.h) + + INCLUDE_DIRECTORIES(${includes}) + ADD_LIBRARY(${name} ${INC_ALL} ${sources}) + + # Group by location on disk + SOURCE_GROUP(Files FILES CMakeLists.txt) + SET(ALL_FILES ${sources} ${INC_ALL}) + FOREACH(SRC ${ALL_FILES}) + STRING(REGEX REPLACE ${CMAKE_CURRENT_SOURCE_DIR} "Files" REL_DIR "${SRC}") + STRING(REGEX REPLACE "[\\\\/][^\\\\/]*$" "" REL_DIR "${REL_DIR}") + STRING(REGEX REPLACE "^[\\\\/]" "" REL_DIR "${REL_DIR}") + IF(REL_DIR) + SOURCE_GROUP(${REL_DIR} FILES ${SRC}) + ELSE(REL_DIR) + SOURCE_GROUP(Files FILES ${SRC}) + ENDIF(REL_DIR) + ENDFOREACH(SRC) + + MESSAGE(STATUS "Configuring library ${name}") +ENDMACRO(BLENDERLIB_NOLIST) + +MACRO(BLENDERLIB + name + sources + includes) + + BLENDERLIB_NOLIST(${name} "${sources}" "${includes}") + + # Add to blender's list of libraries + FILE(APPEND ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt "${name};") +ENDMACRO(BLENDERLIB) + +MACRO(SETUP_LIBDIRS) + # see "cmake --help-policy CMP0003" + if(COMMAND cmake_policy) + CMAKE_POLICY(SET CMP0003 NEW) + endif(COMMAND cmake_policy) + + LINK_DIRECTORIES(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH} ${LIBSAMPLERATE_LIBPATH}) + + IF(WITH_PYTHON) + LINK_DIRECTORIES(${PYTHON_LIBPATH}) + ENDIF(WITH_PYTHON) + IF(WITH_INTERNATIONAL) + LINK_DIRECTORIES(${ICONV_LIBPATH}) + LINK_DIRECTORIES(${GETTEXT_LIBPATH}) + ENDIF(WITH_INTERNATIONAL) + IF(WITH_SDL) + LINK_DIRECTORIES(${SDL_LIBPATH}) + ENDIF(WITH_SDL) + IF(WITH_FFMPEG) + LINK_DIRECTORIES(${FFMPEG_LIBPATH}) + ENDIF(WITH_FFMPEG) + IF(WITH_OPENEXR) + LINK_DIRECTORIES(${OPENEXR_LIBPATH}) + ENDIF(WITH_OPENEXR) + IF(WITH_TIFF) + LINK_DIRECTORIES(${TIFF_LIBPATH}) + ENDIF(WITH_TIFF) + IF(WITH_LCMS) + LINK_DIRECTORIES(${LCMS_LIBPATH}) + ENDIF(WITH_LCMS) + IF(WITH_QUICKTIME) + LINK_DIRECTORIES(${QUICKTIME_LIBPATH}) + ENDIF(WITH_QUICKTIME) + IF(WITH_OPENAL) + LINK_DIRECTORIES(${OPENAL_LIBPATH}) + ENDIF(WITH_OPENAL) + IF(WITH_JACK) + LINK_DIRECTORIES(${JACK_LIBPATH}) + ENDIF(WITH_JACK) + IF(WITH_SNDFILE) + LINK_DIRECTORIES(${SNDFILE_LIBPATH}) + ENDIF(WITH_SNDFILE) + IF(WITH_FFTW3) + LINK_DIRECTORIES(${FFTW3_LIBPATH}) + ENDIF(WITH_FFTW3) + IF(WITH_OPENCOLLADA) + LINK_DIRECTORIES(${OPENCOLLADA_LIBPATH}) + LINK_DIRECTORIES(${PCRE_LIBPATH}) + LINK_DIRECTORIES(${EXPAT_LIBPATH}) + ENDIF(WITH_OPENCOLLADA) + + IF(WIN32) + LINK_DIRECTORIES(${PTHREADS_LIBPATH}) + ENDIF(WIN32) +ENDMACRO(SETUP_LIBDIRS) + +MACRO(SETUP_LIBLINKS + target) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINKFLAGS} ") + + TARGET_LINK_LIBRARIES(${target} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${JPEG_LIBRARY} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${LLIBS}) + + # since we are using the local libs for python when compiling msvc projects, we need to add _d when compiling debug versions + IF(WITH_PYTHON) + TARGET_LINK_LIBRARIES(${target} ${PYTHON_LINKFLAGS}) + + IF(WIN32) + TARGET_LINK_LIBRARIES(${target} debug ${PYTHON_LIB}_d) + TARGET_LINK_LIBRARIES(${target} optimized ${PYTHON_LIB}) + ELSE(WIN32) + TARGET_LINK_LIBRARIES(${target} ${PYTHON_LIB}) + ENDIF(WIN32) + ENDIF(WITH_PYTHON) + + TARGET_LINK_LIBRARIES(${target} ${OPENGL_glu_LIBRARY} ${JPEG_LIB} ${PNG_LIB} ${ZLIB_LIB}) + TARGET_LINK_LIBRARIES(${target} ${FREETYPE_LIBRARY} ${LIBSAMPLERATE_LIB}) + + IF(WITH_INTERNATIONAL) + TARGET_LINK_LIBRARIES(${target} ${GETTEXT_LIB}) + + IF(WIN32) + TARGET_LINK_LIBRARIES(${target} ${ICONV_LIB}) + ENDIF(WIN32) + ENDIF(WITH_INTERNATIONAL) + + IF(WITH_OPENAL) + TARGET_LINK_LIBRARIES(${target} ${OPENAL_LIBRARY}) + ENDIF(WITH_OPENAL) + IF(WITH_FFTW3) + TARGET_LINK_LIBRARIES(${target} ${FFTW3_LIB}) + ENDIF(WITH_FFTW3) + IF(WITH_JACK) + TARGET_LINK_LIBRARIES(${target} ${JACK_LIB}) + ENDIF(WITH_JACK) + IF(WITH_SNDFILE) + TARGET_LINK_LIBRARIES(${target} ${SNDFILE_LIB}) + ENDIF(WITH_SNDFILE) + IF(WITH_SDL) + TARGET_LINK_LIBRARIES(${target} ${SDL_LIBRARY}) + ENDIF(WITH_SDL) + IF(WITH_QUICKTIME) + TARGET_LINK_LIBRARIES(${target} ${QUICKTIME_LIB}) + ENDIF(WITH_QUICKTIME) + IF(WITH_TIFF) + TARGET_LINK_LIBRARIES(${target} ${TIFF_LIBRARY}) + ENDIF(WITH_TIFF) + IF(WITH_OPENEXR) + IF(WIN32) + FOREACH(loop_var ${OPENEXR_LIB}) + TARGET_LINK_LIBRARIES(${target} debug ${loop_var}_d) + TARGET_LINK_LIBRARIES(${target} optimized ${loop_var}) + ENDFOREACH(loop_var) + ELSE(WIN32) + TARGET_LINK_LIBRARIES(${target} ${OPENEXR_LIB}) + ENDIF(WIN32) + ENDIF(WITH_OPENEXR) + IF(WITH_LCMS) + TARGET_LINK_LIBRARIES(${target} ${LCMS_LIBRARY}) + ENDIF(WITH_LCMS) + IF(WITH_FFMPEG) + TARGET_LINK_LIBRARIES(${target} ${FFMPEG_LIB}) + ENDIF(WITH_FFMPEG) + IF(WITH_OPENCOLLADA) + IF(WIN32) + FOREACH(loop_var ${OPENCOLLADA_LIB}) + TARGET_LINK_LIBRARIES(${target} debug ${loop_var}_d) + TARGET_LINK_LIBRARIES(${target} optimized ${loop_var}) + ENDFOREACH(loop_var) + TARGET_LINK_LIBRARIES(${target} debug ${PCRE_LIB}_d) + TARGET_LINK_LIBRARIES(${target} optimized ${PCRE_LIB}) + IF(EXPAT_LIB) + TARGET_LINK_LIBRARIES(${target} debug ${EXPAT_LIB}_d) + TARGET_LINK_LIBRARIES(${target} optimized ${EXPAT_LIB}) + ENDIF(EXPAT_LIB) + ELSE(WIN32) + TARGET_LINK_LIBRARIES(${target} ${OPENCOLLADA_LIB}) + TARGET_LINK_LIBRARIES(${target} ${PCRE_LIB}) + TARGET_LINK_LIBRARIES(${target} ${EXPAT_LIB}) + ENDIF(WIN32) + ENDIF(WITH_OPENCOLLADA) + IF(WIN32) + TARGET_LINK_LIBRARIES(${target} ${PTHREADS_LIB}) + ENDIF(WIN32) +ENDMACRO(SETUP_LIBLINKS) + +MACRO(TEST_SSE_SUPPORT) + INCLUDE(CheckCXXSourceCompiles) + + MESSAGE(STATUS "Detecting SSE support") + IF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + SET(CMAKE_REQUIRED_FLAGS "-msse -msse2") + ELSEIF(MSVC) + SET(CMAKE_REQUIRED_FLAGS "/arch:SSE2") + ENDIF() + + CHECK_CXX_SOURCE_COMPILES(" + #include + int main() { __m128 v = _mm_setzero_ps(); return 0; }" + SUPPORT_SSE_BUILD) +ENDMACRO(TEST_SSE_SUPPORT) + +MACRO(GET_BLENDER_VERSION) + FILE(READ ${CMAKE_SOURCE_DIR}/source/blender/blenkernel/BKE_blender.h CONTENT) + STRING(REGEX REPLACE "\n" ";" CONTENT "${CONTENT}") + STRING(REGEX REPLACE "\t" ";" CONTENT "${CONTENT}") + STRING(REGEX REPLACE " " ";" CONTENT "${CONTENT}") + + FOREACH(ITEM ${CONTENT}) + IF(LASTITEM MATCHES "BLENDER_VERSION") + MATH(EXPR BLENDER_VERSION_MAJOR "${ITEM} / 100") + MATH(EXPR BLENDER_VERSION_MINOR "${ITEM} % 100") + SET(BLENDER_VERSION "${BLENDER_VERSION_MAJOR}.${BLENDER_VERSION_MINOR}") + ENDIF(LASTITEM MATCHES "BLENDER_VERSION") + + IF(LASTITEM MATCHES "BLENDER_SUBVERSION") + SET(BLENDER_SUBVERSION ${ITEM}) + ENDIF(LASTITEM MATCHES "BLENDER_SUBVERSION") + + IF(LASTITEM MATCHES "BLENDER_MINVERSION") + MATH(EXPR BLENDER_MINVERSION_MAJOR "${ITEM} / 100") + MATH(EXPR BLENDER_MINVERSION_MINOR "${ITEM} % 100") + SET(BLENDER_MINVERSION "${BLENDER_MINVERSION_MAJOR}.${BLENDER_MINVERSION_MINOR}") + ENDIF(LASTITEM MATCHES "BLENDER_MINVERSION") + + IF(LASTITEM MATCHES "BLENDER_MINSUBVERSION") + SET(BLENDER_MINSUBVERSION ${ITEM}) + ENDIF(LASTITEM MATCHES "BLENDER_MINSUBVERSION") + + SET(LASTITEM ${ITEM}) + ENDFOREACH(ITEM ${CONTENT}) + + MESSAGE(STATUS "Version major: ${BLENDER_VERSION_MAJOR}, Version minor: ${BLENDER_VERSION_MINOR}, Subversion: ${BLENDER_SUBVERSION}, Version: ${BLENDER_VERSION}") + MESSAGE(STATUS "Minversion major: ${BLENDER_MINVERSION_MAJOR}, Minversion minor: ${BLENDER_MINVERSION_MINOR}, MinSubversion: ${BLENDER_MINSUBVERSION}, Minversion: ${BLENDER_MINVERSION}") +ENDMACRO(GET_BLENDER_VERSION) diff --git a/build_files/make/example_scripts/linux_nanmakefiles.sh b/build_files/make/example_scripts/linux_nanmakefiles.sh new file mode 100755 index 00000000000..aa8d8820681 --- /dev/null +++ b/build_files/make/example_scripts/linux_nanmakefiles.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# +# This is an example script to build things with the Nan Makefiles +# +# + +rm -f /tmp/.nanguess +export MAKE=make +export NANBLENDERHOME=`pwd` +export MAKEFLAGS="-w -I $NANBLENDERHOME/source --no-print-directory" +export HMAKE="$NANBLENDERHOME/source/tools/hmake/hmake" + +export NAN_PYTHON=/soft/python-2.2.2b1/progeny1 +export NAN_PYTHON_VERSION=2.2 +export NAN_OPENAL=/usr/local +export NAN_JPEG=/usr/local +export NAN_PNG=/usr/local +export NAN_SDL=/usr/local +export NAN_ODE=/usr/local +export NAN_ZLIB=/usr/local +export NAN_FREETYPE=/usr/local + +export NAN_MOZILLA_INC=/usr/local/include/mozilla-1.0.1/ +export NAN_MOZILLA_LIB=/usr/local/lib/mozilla-1.0.1/ +#export NAN_NSPR=/scratch/irulan/mein/nspr-4.2.2/mozilla/nsprpub/dist/ +export CPPFLAGS="$CPPFLAGS" +export CFLAGS="$CFLAGS" +export INTERNATIONAL=true + +$HMAKE -C intern/ +if [ $? -eq 0 ]; then + $HMAKE -C source/ +fi +$HMAKE -C release + +#cd release +#make diff --git a/build_files/make/example_scripts/macos_nanmakefiles.sh b/build_files/make/example_scripts/macos_nanmakefiles.sh new file mode 100755 index 00000000000..d2cce204a53 --- /dev/null +++ b/build_files/make/example_scripts/macos_nanmakefiles.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +rm -f /tmp/.nanguess +export MAKE=make +export NANBLENDERHOME=`pwd` +export MAKEFLAGS="-w -I $NANBLENDERHOME/source --no-print-directory" +export HMAKE="$NANBLENDERHOME/source/tools/hmake/hmake" +echo +echo NANBLENDERHOME : ${NANBLENDERHOME} + +export NAN_PYTHON=/sw + +$HMAKE -C intern/ +if [ $? -eq 0 ]; then + $HMAKE -C source/ +fi +cd release +make diff --git a/build_files/make/example_scripts/sunos_nanmakefiles.sh b/build_files/make/example_scripts/sunos_nanmakefiles.sh new file mode 100755 index 00000000000..25dd17bebb1 --- /dev/null +++ b/build_files/make/example_scripts/sunos_nanmakefiles.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# This is an example build script for SunOS5.8 + +rm -f /tmp/.nanguess +export MAKE=make +export NANBLENDERHOME=`pwd` +export MAKEFLAGS="-w -I $NANBLENDERHOME/source --no-print-directory" +export HMAKE="$NANBLENDERHOME/source/tools/hmake/hmake" + +export NAN_PYTHON=/soft/python-2.2.2b1/SunOS5.8 +export NAN_PYTHON_VERSION=2.2 +export NAN_OPENAL=/usr/local +export NAN_JPEG=/usr/local +export NAN_PNG=/usr/local +export NAN_SDL=/usr/local +export NAN_ODE=/usr/local +export NAN_OPENSSL=/soft/ssl/openssl-0.9.6e +export NAN_ZLIB=/usr/local +export NAN_FREETYPE=/usr/local + +export NAN_MOZILLA_INC=/usr/local/include/mozilla-1.0.1/ +export NAN_MOZILLA_LIB=/usr/local/lib/mozilla-1.0.1/ +export NAN_NSPR=/scratch/irulan/mein/nspr-4.2.2/mozilla/nsprpub/dist/ +export CPPFLAGS="$CPPFLAGS" +export CFLAGS="$CFLAGS" +export INTERNATIONAL=true + +$HMAKE -C intern/ +if [ $? -eq 0 ]; then + $HMAKE -C source/ +fi +$HMAKE -C release + +#cd release +#make diff --git a/source/nan_compile.mk b/build_files/make/nan_compile.mk similarity index 95% rename from source/nan_compile.mk rename to build_files/make/nan_compile.mk index 0a094b572cd..36c315a8e11 100644 --- a/source/nan_compile.mk +++ b/build_files/make/nan_compile.mk @@ -82,10 +82,10 @@ ifeq ($(OS),darwin) endif endif ifeq ($(CPU),powerpc) - CFLAGS += -pipe -fPIC -ffast-math -mcpu=7450 -mtune=G5 -funsigned-char -fno-strict-aliasing - CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing + CFLAGS += -pipe -fPIC -mcpu=7450 -mtune=G5 -funsigned-char -fno-strict-aliasing + CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing else - CFLAGS += -pipe -fPIC -ffast-math -funsigned-char + CFLAGS += -pipe -fPIC -funsigned-char CCFLAGS += -pipe -fPIC -funsigned-char endif @@ -94,16 +94,14 @@ ifeq ($(OS),darwin) CCFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS) ifeq ($(MACOSX_ARCHITECTURE), $(findstring $(MACOSX_ARCHITECTURE), "i386 x86_64")) - REL_CFLAGS += -ftree-vectorize -msse -msse2 -msse3 - REL_CCFLAGS += -ftree-vectorize -msse -msse2 -msse3 + REL_CFLAGS += -O2 -ftree-vectorize -msse -msse2 -msse3 + REL_CCFLAGS += -O2 -ftree-vectorize -msse -msse2 -msse3 + else + REL_CFLAGS += -O2 + REL_CCFLAGS += -O2 endif - ifeq ($(MACOSX_ARCHITECTURE), x86_64) - REL_CFLAGS += -mssse3 - REL_CCFLAGS += -mssse3 - endif - - CPPFLAGS += -D_THREAD_SAFE -fpascal-strings + CPPFLAGS += -D_THREAD_SAFE ifeq ($(WITH_COCOA), true) CPPFLAGS += -DGHOST_COCOA @@ -174,8 +172,8 @@ ifeq ($(OS),linux) CCC ?= g++ # CFLAGS += -pipe # CCFLAGS += -pipe - CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing - CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing + CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 + CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 REL_CFLAGS += -O2 REL_CCFLAGS += -O2 NAN_DEPEND = true @@ -214,7 +212,7 @@ ifeq ($(OS),solaris) #CC ?= cc #CCC ?= CC endif - + JAVAC = javac JAVAH = javah CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing diff --git a/source/nan_definitions.mk b/build_files/make/nan_definitions.mk similarity index 95% rename from source/nan_definitions.mk rename to build_files/make/nan_definitions.mk index a3748ae247f..d14bdb0a13c 100644 --- a/source/nan_definitions.mk +++ b/build_files/make/nan_definitions.mk @@ -31,7 +31,7 @@ # set some defaults when these are not overruled (?=) by environment variables # -sinclude ../user-def.mk +sinclude ../../user-def.mk # This warning only takes place once in source/ ifeq (debug, $(findstring debug, $(MAKECMDGOALS))) @@ -133,13 +133,13 @@ ifndef CONFIG_GUESS endif ifeq ($(WITH_JACK), true) - export NAN_JACK ?= /usr + export NAN_JACK ?= $(LCGDIR)/jack export NAN_JACKCFLAGS ?= -I$(NAN_JACK)/include/jack export NAN_JACKLIBS ?= $(NAN_JACK)/lib/libjack.a endif ifeq ($(WITH_SNDFILE),true) - export NAN_SNDFILE ?= /usr + export NAN_SNDFILE ?= $(LCGDIR)/sndfile export NAN_SNDFILECFLAGS ?= -I$(NAN_SNDFILE)/include export NAN_SNDFILELIBS ?= $(NAN_SNDFILE)/lib/libsndfile.a $(NAN_SNDFILE)/lib/libFLAC.a $(NAN_SNDFILE)/lib/libogg.a endif @@ -158,7 +158,8 @@ ifndef CONFIG_GUESS export BF_PCRE_LIBS ?= $(BF_PCRE)/lib/libpcre.a endif - + export WITH_TIFF ?= true + # Compare recreated .mo files with committed ones export BF_VERIFY_MO_FILES ?= true @@ -207,8 +208,8 @@ ifndef CONFIG_GUESS else export PY_FRAMEWORK ?= 1 ifdef PY_FRAMEWORK - export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/2.5 - export NAN_PYTHON_VERSION ?= 2.5 + export NAN_PYTHON_VERSION ?= 3.1 + export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/$(NAN_PYTHON_VERSION) export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_PYTHON_LIB ?= -framework Python else @@ -275,6 +276,7 @@ ifndef CONFIG_GUESS endif export BF_PCRE = $(LCGDIR)/opencollada + export BF_OPENCOLLADA_LIBS = $(BF_OPENCOLLADA)/lib/libOpenCOLLADASaxFrameworkLoader.a $(BF_OPENCOLLADA)/lib/libOpenCOLLADAFramework.a $(BF_OPENCOLLADA)/lib/libOpenCOLLADABaseUtils.a $(BF_OPENCOLLADA)/lib/libOpenCOLLADAStreamWriter.a $(BF_OPENCOLLADA)/lib/libMathMLSolver.a $(BF_OPENCOLLADA)/lib/libGeneratedSaxParser.a $(BF_OPENCOLLADA)/lib/libUTF.a $(BF_OPENCOLLADA)/lib/libftoa.a $(BF_OPENCOLLADA)/lib/libbuffer.a -lxml2 else ifeq ($(OS),freebsd) @@ -369,7 +371,7 @@ ifndef CONFIG_GUESS # enable l10n export INTERNATIONAL ?= true - # Different endianess will make it fail, rely on other plataforms for checks + # Different endianess will make it fail, rely on other platforms for checks export BF_VERIFY_MO_FILES = false else @@ -411,12 +413,6 @@ ifndef CONFIG_GUESS export BF_FFTW3_LIBS ?= $(shell pkg-config --libs fftw3 ) endif - ifeq ($(WITH_OPENJPEG), true) - export BF_OPENJPEG ?= /usr - export BF_OPENJPEG_INC ?= /usr/include - export BF_OPENJPEG_LIBS ?= -lopenjpeg - endif - # Uncomment the following line to use Mozilla inplace of netscape # Location of MOZILLA/Netscape header files... @@ -439,6 +435,11 @@ ifndef CONFIG_GUESS export WITH_FFMPEG ?= true endif + ifeq ($(CPU), powerpc) + # Different endianess will make it fail, rely on other platforms for checks + export BF_VERIFY_MO_FILES = false + endif + else ifeq ($(OS),openbsd) @@ -538,7 +539,7 @@ ifndef CONFIG_GUESS ifeq ($(FREE_WINDOWS), true) export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/freegettext.a $(NAN_ICONV)/lib/freeiconv.a export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) - export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/lib25_vs2005/libpython25.a + export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/lib25_vs2005/libpython31.a # NOT TESTED, PROBABLY BROKEN export NAN_FREETYPE ?= $(LCGDIR)/gcc/freetype export NAN_SDL ?= $(LCGDIR)/gcc/sdl export NAN_OPENEXR ?= $(LCGDIR)/gcc/openexr @@ -548,7 +549,7 @@ ifndef CONFIG_GUESS else export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/gnu_gettext.lib $(NAN_ICONV)/lib/iconv.lib export NAN_PYTHON_BINARY ?= python - export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python23.lib + export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python31.lib # NOT TESTED, PROBABLY BROKEN export NAN_FREETYPE ?= $(LCGDIR)/freetype export NAN_SDL ?= $(LCGDIR)/sdl export NAN_OPENEXR ?= $(LCGDIR)/openexr @@ -618,6 +619,9 @@ ifndef CONFIG_GUESS endif # freebsd endif # darwin + # default tiff libs + export NAN_TIFF_LIBS ?= $(NAN_TIFF)/lib/libtiff.a + endif # CONFIG_GUESS # Don't want to build the gameengine? diff --git a/source/nan_link.mk b/build_files/make/nan_link.mk similarity index 96% rename from source/nan_link.mk rename to build_files/make/nan_link.mk index 3ab4f9710db..bbf4053b14c 100644 --- a/source/nan_link.mk +++ b/build_files/make/nan_link.mk @@ -108,7 +108,7 @@ ifeq ($(OS),linux) endif ifeq ($(CPU),$(findstring $(CPU), "i386 x86_64 ia64 parisc64 powerpc sparc64")) COMMENT = "MESA 3.1" - LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXmu -lXext -lX11 -lXi + LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXext -lX11 -lXi LLIBS += -lutil -lc -lm -ldl -lpthread LLIBS += -L$(NAN_PYTHON)/lib -Wl,-rpath -Wl,$(NAN_PYTHON)/lib -lpython$(NAN_PYTHON_VERSION) LOPTS = -export-dynamic @@ -155,7 +155,7 @@ ifeq ($(OS),windows) LOPTS += /NODEFAULTLIB:"libcd" LOPTS += /NODEFAULTLIB:"libcp" LOPTS += /NODEFAULTLIB:"libcpd" - LOPTS += /NODEFAULTLIB:"python20" + LOPTS += /NODEFAULTLIB:"python31" LOPTS += /NODEFAULTLIB:"msvcrt" LOPTS += /SUBSYSTEM:CONSOLE LDFLAGS += /MT @@ -191,4 +191,8 @@ ifeq ($(WITH_OPENCOLLADA),true) LLIBS += $(BF_OPENCOLLADA_LIBS) endif +ifeq ($(WITH_TIFF),true) + LLIBS += $(NAN_TIFF_LIBS) +endif + LLIBS += $(NAN_PYTHON_LIB) diff --git a/source/nan_subdirs.mk b/build_files/make/nan_subdirs.mk similarity index 100% rename from source/nan_subdirs.mk rename to build_files/make/nan_subdirs.mk diff --git a/source/nan_warn.mk b/build_files/make/nan_warn.mk similarity index 100% rename from source/nan_warn.mk rename to build_files/make/nan_warn.mk diff --git a/config/aix4-config.py b/build_files/scons/config/aix4-config.py similarity index 95% rename from config/aix4-config.py rename to build_files/scons/config/aix4-config.py index 3a3db39494d..a769f53b35e 100644 --- a/config/aix4-config.py +++ b/build_files/scons/config/aix4-config.py @@ -14,7 +14,7 @@ BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}' BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}' BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' #BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a' BF_PYTHON_LINKFLAGS = ['-Xlinker', '-export-dynamic'] -BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/python2.5/config/libpython${BF_PYTHON_VERSION}.a' +BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/python${BF_PYTHON_VERSION}/config/libpython${BF_PYTHON_VERSION}.a' WITH_BF_OPENAL = 'false' WITH_BF_STATICOPENAL = 'false' @@ -83,22 +83,11 @@ BF_FTGL_LIB = 'extern_ftgl' WITH_BF_GAMEENGINE='false' -WITH_BF_ODE = 'false' -BF_ODE = LIBDIR + '/ode' -BF_ODE_INC = BF_ODE + '/include' -BF_ODE_LIB = BF_ODE + '/lib/libode.a' - WITH_BF_BULLET = 'true' BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - -WITH_BF_YAFRAY = 'true' - #WITH_BF_NSPR = 'true' #BF_NSPR = $(LIBDIR)/nspr #BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr diff --git a/config/darwin-config.py b/build_files/scons/config/darwin-config.py similarity index 95% rename from config/darwin-config.py rename to build_files/scons/config/darwin-config.py index b0e6948001b..1423e8fb392 100644 --- a/config/darwin-config.py +++ b/build_files/scons/config/darwin-config.py @@ -131,8 +131,8 @@ BF_JACK_LIBPATH = '${BF_JACK}/lib' WITH_BF_SNDFILE = True BF_SNDFILE = LIBDIR + '/sndfile' BF_SNDFILE_INC = '${BF_SNDFILE}/include' -BF_SNDFILE_LIB = 'sndfile' -BF_SNDFILE_LIBPATH = '${BF_SNDFILE}/lib' +BF_SNDFILE_LIB = 'sndfile FLAC ogg vorbis vorbisenc' +BF_SNDFILE_LIBPATH = '${BF_SNDFILE}/lib ${BF_FFMPEG}/lib' #ogg libs are stored in ffmpeg dir WITH_BF_SDL = True BF_SDL = LIBDIR + '/sdl' #$(shell sdl-config --prefix) @@ -151,6 +151,13 @@ BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf WITH_BF_DDS = True +#Color Management System +WITH_BF_LCMS = False +BF_LCMS = LIBDIR + '/lcms' +BF_LCMS_INC = '${BF_LCMS}/include' +BF_LCMS_LIB = 'lcms' +BF_LCMS_LIBPATH = '${BF_LCMS}/lib' + WITH_BF_JPEG = True BF_JPEG = LIBDIR + '/jpeg' BF_JPEG_INC = '${BF_JPEG}/include' @@ -163,8 +170,11 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'png' BF_PNG_LIBPATH = '${BF_PNG}/lib' +WITH_BF_TIFF = True BF_TIFF = LIBDIR + '/tiff' BF_TIFF_INC = '${BF_TIFF}/include' +BF_TIFF_LIB = 'tiff' +BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = '/usr' @@ -269,9 +279,9 @@ else: CFLAGS = ['-pipe','-funsigned-char']+ARCH_FLAGS -CPPFLAGS = ['-fpascal-strings']+ARCH_FLAGS -CCFLAGS = ['-pipe','-funsigned-char','-fpascal-strings']+ARCH_FLAGS -CXXFLAGS = ['-pipe','-funsigned-char', '-fpascal-strings']+ARCH_FLAGS +CPPFLAGS = []+ARCH_FLAGS +CCFLAGS = ['-pipe','-funsigned-char']+ARCH_FLAGS +CXXFLAGS = ['-pipe','-funsigned-char']+ARCH_FLAGS if WITH_GHOST_COCOA==True: PLATFORM_LINKFLAGS = ['-fexceptions','-framework','CoreServices','-framework','Foundation','-framework','IOKit','-framework','AppKit','-framework','Cocoa','-framework','Carbon','-framework','AudioUnit','-framework','AudioToolbox','-framework','CoreAudio','-framework','OpenAL']+ARCH_FLAGS diff --git a/config/irix6-config.py b/build_files/scons/config/irix6-config.py similarity index 98% rename from config/irix6-config.py rename to build_files/scons/config/irix6-config.py index df18e0b511f..7c319f7b520 100644 --- a/config/irix6-config.py +++ b/build_files/scons/config/irix6-config.py @@ -10,7 +10,7 @@ BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}' BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}' BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' #BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a' BF_PYTHON_LINKFLAGS = ['-Xlinker', '-export-dynamic'] -BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/python2.5/config/libpython${BF_PYTHON_VERSION}.a' +BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/python${BF_PYTHON_VERSION}/config/libpython${BF_PYTHON_VERSION}.a' WITH_BF_OPENAL = 'true' WITH_BF_STATICOPENAL = 'true' diff --git a/config/linux2-config.py b/build_files/scons/config/linux2-config.py similarity index 95% rename from config/linux2-config.py rename to build_files/scons/config/linux2-config.py index 53cad76d612..7a350a74ed5 100644 --- a/config/linux2-config.py +++ b/build_files/scons/config/linux2-config.py @@ -68,8 +68,10 @@ BF_PNG = '/usr' BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'png' +WITH_BF_TIFF = True BF_TIFF = '/usr' BF_TIFF_INC = '${BF_TIFF}/include' +BF_TIFF_LIB = 'tiff' WITH_BF_ZLIB = True BF_ZLIB = '/usr' @@ -166,7 +168,7 @@ BF_EXPAT_LIBPATH = '/usr/lib' WITH_BF_OPENMP = True #Ray trace optimization -WITH_BF_RAYOPTIMIZATION = False +WITH_BF_RAYOPTIMIZATION = True BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse','-pthread'] ## @@ -175,10 +177,13 @@ CXX = 'g++' ##ifeq ($CPU),alpha) ## CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing -mieee -CCFLAGS = ['-pipe','-fPIC','-funsigned-char','-fno-strict-aliasing'] +CCFLAGS = ['-pipe','-fPIC','-funsigned-char','-fno-strict-aliasing','-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64'] CPPFLAGS = [] -CXXFLAGS = ['-pipe','-fPIC','-funsigned-char','-fno-strict-aliasing'] +CXXFLAGS = ['-pipe','-fPIC','-funsigned-char','-fno-strict-aliasing','-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64'] +if WITH_BF_FFMPEG: + # libavutil needs UINT64_C() + CXXFLAGS += ['-D__STDC_CONSTANT_MACROS', ] REL_CFLAGS = ['-O2'] REL_CCFLAGS = ['-O2'] ##BF_DEPEND = True diff --git a/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py similarity index 93% rename from config/linuxcross-config.py rename to build_files/scons/config/linuxcross-config.py index fe5e954f3bc..1650201f8c6 100644 --- a/config/linuxcross-config.py +++ b/build_files/scons/config/linuxcross-config.py @@ -55,7 +55,7 @@ WITH_BF_OPENEXR = True WITH_BF_STATICOPENEXR = False BF_OPENEXR = LIBDIR + '/gcc/openexr' BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR' -BF_OPENEXR_LIB = ' Half IlmImf Iex ' +BF_OPENEXR_LIB = ' Half IlmImf Iex IlmThread ' BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib' # Warning, this static lib configuration is untested! users of this OS please confirm. BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a' @@ -65,7 +65,7 @@ WITH_BF_DDS = True WITH_BF_JPEG = True BF_JPEG = LIBDIR + '/jpeg' BF_JPEG_INC = '${BF_JPEG}/include' -BF_JPEG_LIB = 'jpeg' +BF_JPEG_LIB = 'libjpeg' BF_JPEG_LIBPATH = '${BF_JPEG}/lib' WITH_BF_PNG = True @@ -75,15 +75,15 @@ BF_PNG_LIB = 'png' BF_PNG_LIBPATH = '${BF_PNG}/lib' WITH_BF_TIFF = True -BF_TIFF = LIBDIR + '/tiff' +BF_TIFF = LIBDIR + '/gcc/tiff' BF_TIFF_INC = '${BF_TIFF}/include' -BF_TIFF_LIB = 'libtiff' +BF_TIFF_LIB = 'tiff' BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = LIBDIR + '/zlib' BF_ZLIB_INC = '${BF_ZLIB}/include' -#BF_ZLIB_LIB = 'z' +BF_ZLIB_LIB = 'libz' BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib' WITH_BF_INTERNATIONAL = True @@ -151,11 +151,9 @@ BF_OPENGL = 'C:\\MingW' BF_OPENGL_INC = '${BF_OPENGL}/include' BF_OPENGL_LIBINC = '${BF_OPENGL}/lib' BF_OPENGL_LIB = 'opengl32 glu32' -BF_OPENGL_LIB_STATIC = [ '${BF_OPENGL}/lib/libGL.a', '${BF_OPENGL}/lib/libGLU.a', - '${BF_OPENGL}/lib/libXmu.a', '${BF_OPENGL}/lib/libXext.a', - '${BF_OPENGL}/lib/libX11.a', '${BF_OPENGL}/lib/libXi.a' ] +BF_OPENGL_LIB_STATIC = [ '${BF_OPENGL}/lib/libGL.a', '${BF_OPENGL}/lib/libGLU.a'] -WITH_BF_OPENMP = True +WITH_BF_OPENMP = False BF_OPENMP = LIBDIR + '/gcc/gomp' BF_OPENMP_INC = '${BF_OPENMP}/include' BF_OPENMP_LIBPATH = '${BF_OPENMP}/lib' @@ -171,12 +169,9 @@ BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader Open BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib ${BF_ICONV_LIBPATH}' #Ray trace optimization -WITH_BF_RAYOPTIMIZATION = False +WITH_BF_RAYOPTIMIZATION = True BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse'] -CC = 'i586-mingw32msvc-gcc' -CXX = 'i586-mingw32msvc-g++' - CCFLAGS = [ '-pipe', '-funsigned-char', '-fno-strict-aliasing' ] CPPFLAGS = ['-DWIN32', '-DFREE_WINDOWS'] diff --git a/config/openbsd3-config.py b/build_files/scons/config/openbsd3-config.py similarity index 100% rename from config/openbsd3-config.py rename to build_files/scons/config/openbsd3-config.py diff --git a/config/sunos5-config.py b/build_files/scons/config/sunos5-config.py similarity index 100% rename from config/sunos5-config.py rename to build_files/scons/config/sunos5-config.py diff --git a/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py similarity index 97% rename from config/win32-mingw-config.py rename to build_files/scons/config/win32-mingw-config.py index 9088db5a5d8..f8b67781172 100644 --- a/config/win32-mingw-config.py +++ b/build_files/scons/config/win32-mingw-config.py @@ -54,7 +54,7 @@ WITH_BF_OPENEXR = True WITH_BF_STATICOPENEXR = False BF_OPENEXR = LIBDIR + '/gcc/openexr' BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR' -BF_OPENEXR_LIB = ' Half IlmImf Iex ' +BF_OPENEXR_LIB = ' Half IlmImf Iex IlmThread ' BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib' # Warning, this static lib configuration is untested! users of this OS please confirm. BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a' @@ -64,7 +64,7 @@ WITH_BF_DDS = True WITH_BF_JPEG = True BF_JPEG = LIBDIR + '/jpeg' BF_JPEG_INC = '${BF_JPEG}/include' -BF_JPEG_LIB = 'jpeg' +BF_JPEG_LIB = 'liblibjpeg' BF_JPEG_LIBPATH = '${BF_JPEG}/lib' WITH_BF_PNG = True @@ -73,14 +73,16 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'png' BF_PNG_LIBPATH = '${BF_PNG}/lib' -BF_TIFF = LIBDIR + '/tiff' +WITH_BF_TIFF = True +BF_TIFF = LIBDIR + '/gcc/tiff' BF_TIFF_INC = '${BF_TIFF}/include' -BF_TIFF_LIB = 'libtiff' +BF_TIFF_LIB = 'tiff' BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = LIBDIR + '/zlib' BF_ZLIB_INC = '${BF_ZLIB}/include' +BF_ZLIB_LIB = 'libz' BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib' WITH_BF_INTERNATIONAL = True diff --git a/config/win32-vc-config.py b/build_files/scons/config/win32-vc-config.py similarity index 90% rename from config/win32-vc-config.py rename to build_files/scons/config/win32-vc-config.py index e1d20fa8ce0..ce34737fd49 100644 --- a/config/win32-vc-config.py +++ b/build_files/scons/config/win32-vc-config.py @@ -79,6 +79,7 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'libpng_st' BF_PNG_LIBPATH = '${BF_PNG}/lib' +WITH_BF_TIFF = True BF_TIFF = LIBDIR + '/tiff' BF_TIFF_INC = '${BF_TIFF}/include' BF_TIFF_LIB = 'libtiff' @@ -138,18 +139,18 @@ BF_FFTW3_LIBPATH = '${BF_FFTW3}/lib' WITH_BF_REDCODE = False BF_REDCODE_INC = '#extern' -WITH_BF_COLLADA = False +WITH_BF_COLLADA = True BF_COLLADA = '#source/blender/collada' BF_COLLADA_INC = '${BF_COLLADA}' BF_COLLADA_LIB = 'bf_collada' BF_OPENCOLLADA = LIBDIR + '/opencollada' BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}/include' -BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver xml2 pcre buffer ftoa' +BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser MathMLSolver xml2 pcre buffer ftoa' BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib' #Ray trace optimization -WITH_BF_RAYOPTIMIZATION = False +WITH_BF_RAYOPTIMIZATION = True BF_RAYOPTIMIZATION_SSE_FLAGS = ['/arch:SSE'] WITH_BF_STATICOPENGL = False @@ -164,7 +165,6 @@ CC = 'cl.exe' CXX = 'cl.exe' CCFLAGS = ['/nologo', '/Ob1', '/J', '/W3', '/Gd', '/wd4244', '/wd4305', '/wd4800', '/wd4065', '/wd4267'] -#CCFLAGS += ['/GL'] CXXFLAGS = ['/EHsc'] BGE_CXXFLAGS = ['/O2', '/EHsc', '/GR', '/fp:fast', '/arch:SSE'] @@ -181,12 +181,15 @@ CXX_WARN = [] LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid'] -PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:IX86','/INCREMENTAL:YES','/NODEFAULTLIB:"msvcprt.lib"','/NODEFAULTLIB:"msvcprtd.lib"','/NODEFAULTLIB:"glut32.lib"','/NODEFAULTLIB:"libc.lib"','/NODEFAULTLIB:"libcd.lib"','/NODEFAULTLIB:"libcpd.lib"','/NODEFAULTLIB:"libcp.lib"','/NODEFAULTLIB:"msvcrt.lib"', '/NODEFAULTLIB:"msvcrtd.lib"', '/NODEFAULTLIB:"msvcmrt.lib"', '/NODEFAULTLIB:"msvcurt.lib"', '/LARGEADDRESSAWARE'] -#PLATFORM_LINKFLAGS += ['/LTCG'] +PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:IX86','/INCREMENTAL:NO','/NODEFAULTLIB:"msvcprt.lib"','/NODEFAULTLIB:"msvcprtd.lib"','/NODEFAULTLIB:"glut32.lib"','/NODEFAULTLIB:"libc.lib"','/NODEFAULTLIB:"libcd.lib"','/NODEFAULTLIB:"libcpd.lib"','/NODEFAULTLIB:"libcp.lib"','/NODEFAULTLIB:"msvcrt.lib"', '/NODEFAULTLIB:"msvcrtd.lib"', '/NODEFAULTLIB:"msvcmrt.lib"', '/NODEFAULTLIB:"msvcurt.lib"', '/LARGEADDRESSAWARE'] + # # Todo # BF_PROFILE_CCFLAGS = ['-pg', '-g '] # BF_PROFILE_LINKFLAGS = ['-pg'] # BF_PROFILE = False +#turn off makebsc by default ( as 64 bit version does ) .. takes ages to build .. for nothing ( well some M$ addicts may disagree ) +BF_BSC=False + BF_BUILDDIR = '..\\build\\win32-vc' BF_INSTALLDIR='..\\install\\win32-vc' diff --git a/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py similarity index 98% rename from config/win64-vc-config.py rename to build_files/scons/config/win64-vc-config.py index 41772dea14b..46b9034823c 100644 --- a/config/win64-vc-config.py +++ b/build_files/scons/config/win64-vc-config.py @@ -75,6 +75,7 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'libpng' BF_PNG_LIBPATH = '${BF_PNG}/lib' +WITH_BF_TIFF = True BF_TIFF = LIBDIR + '/tiff' BF_TIFF_INC = '${BF_TIFF}/include' BF_TIFF_LIB = 'libtiff' @@ -151,18 +152,18 @@ BF_FFTW3_LIBPATH = '${BF_FFTW3}/lib' WITH_BF_REDCODE = False BF_REDCODE_INC = '#extern' -WITH_BF_COLLADA = False +WITH_BF_COLLADA = True BF_COLLADA = '#source/blender/collada' BF_COLLADA_INC = '${BF_COLLADA}' BF_COLLADA_LIB = 'bf_collada' BF_OPENCOLLADA = LIBDIR + '/opencollada' BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}/include' -BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver xml2 pcre' +BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser MathMLSolver xml2 pcre buffer ftoa' BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib' #Ray trace optimization -WITH_BF_RAYOPTIMIZATION = False +WITH_BF_RAYOPTIMIZATION = True BF_RAYOPTIMIZATION_SSE_FLAGS = ['/arch:SSE','/arch:SSE2'] WITH_BF_STATICOPENGL = False diff --git a/tools/Blender.py b/build_files/scons/tools/Blender.py similarity index 90% rename from tools/Blender.py rename to build_files/scons/tools/Blender.py index 8ee7857ee2e..7f5ce4767e3 100644 --- a/tools/Blender.py +++ b/build_files/scons/tools/Blender.py @@ -14,6 +14,7 @@ to kill any code duplication """ +import os import os.path import string import glob @@ -30,6 +31,8 @@ import SCons.Builder import SCons.Tool import bcolors bc = bcolors.bcolors() +import btools +VERSION = btools.VERSION Split = SCons.Util.Split Action = SCons.Action.Action @@ -118,8 +121,9 @@ def setup_staticlibs(lenv): ] libincs = [] - if lenv['OURPLATFORM'] != 'linuxcross': - libincs.append('/usr/lib') + + if lenv['WITH_BF_FFMPEG']: + libincs += Split(lenv['BF_FFMPEG_LIBPATH']) libincs.extend([ lenv['BF_OPENGL_LIBPATH'], @@ -135,8 +139,6 @@ def setup_staticlibs(lenv): libincs += Split(lenv['BF_PYTHON_LIBPATH']) if lenv['WITH_BF_SDL']: libincs += Split(lenv['BF_SDL_LIBPATH']) - if lenv['WITH_BF_FFMPEG']: - libincs += Split(lenv['BF_FFMPEG_LIBPATH']) if lenv['WITH_BF_JACK']: libincs += Split(lenv['BF_JACK_LIBPATH']) if lenv['WITH_BF_SNDFILE']: @@ -145,6 +147,10 @@ def setup_staticlibs(lenv): libincs += Split(lenv['BF_OPENEXR_LIBPATH']) if lenv['WITH_BF_STATICOPENEXR']: statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC']) + if lenv['WITH_BF_LCMS']: + libincs += Split(lenv['BF_LCMS_LIBPATH']) + if lenv['WITH_BF_TIFF']: + libincs += Split(lenv['BF_TIFF_LIBPATH']) if lenv['WITH_BF_FFTW3']: libincs += Split(lenv['BF_FFTW3_LIBPATH']) if lenv['WITH_BF_INTERNATIONAL']: @@ -161,7 +167,7 @@ def setup_staticlibs(lenv): if lenv['WITH_BF_PYTHON'] and lenv['WITH_BF_STATICPYTHON']: statlibs += Split(lenv['BF_PYTHON_LIB_STATIC']) - if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross'): + if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): libincs += Split(lenv['BF_PTHREADS_LIBPATH']) if lenv['WITH_BF_COLLADA']: @@ -174,6 +180,9 @@ def setup_staticlibs(lenv): if lenv['OURPLATFORM'] == 'linuxcross': libincs += Split(lenv['BF_OPENMP_LIBPATH']) + # setting this last so any overriding of manually libs could be handled + if lenv['OURPLATFORM'] not in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'): + libincs.append('/usr/lib') return statlibs, libincs @@ -188,12 +197,10 @@ def setup_syslibs(lenv): syslibs += Split(lenv['BF_FREETYPE_LIB']) if lenv['WITH_BF_PYTHON'] and not lenv['WITH_BF_STATICPYTHON']: - if not lenv['BF_NO_PYDEBUG'] and lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc'): - print "using debug py" + if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'): syslibs.append(lenv['BF_PYTHON_LIB']+'_d') else: - print "not using debug py" - syslibs.append(lenv['BF_PYTHON_LIB']) + syslibs.append(lenv['BF_PYTHON_LIB']) if lenv['WITH_BF_INTERNATIONAL']: syslibs += Split(lenv['BF_GETTEXT_LIB']) if lenv['WITH_BF_OPENAL']: @@ -209,6 +216,8 @@ def setup_syslibs(lenv): if lenv['WITH_BF_OPENEXR']: if not lenv['WITH_BF_STATICOPENEXR']: syslibs += Split(lenv['BF_OPENEXR_LIB']) + if lenv['WITH_BF_TIFF']: + syslibs += Split(lenv['BF_TIFF_LIB']) if lenv['WITH_BF_FFMPEG']: syslibs += Split(lenv['BF_FFMPEG_LIB']) if lenv['WITH_BF_OGG']: @@ -223,7 +232,7 @@ def setup_syslibs(lenv): syslibs += Split(lenv['BF_SDL_LIB']) if not lenv['WITH_BF_STATICOPENGL']: syslibs += Split(lenv['BF_OPENGL_LIB']) - if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw','linuxcross'): + if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw','linuxcross', 'win64-vc'): syslibs += Split(lenv['BF_PTHREADS_LIB']) if lenv['WITH_BF_LCMS']: syslibs.append(lenv['BF_LCMS_LIB']) @@ -353,7 +362,11 @@ class CompZipFile(zipfile.ZipFile): """Partial copy of python2.6's zipfile.ZipFile (see http://www.python.org) to get a extractall() that works on py2.5 and probably earlier distributions.""" def __init__(self, file, mode="r", compression=zipfile.ZIP_STORED, allowZip64=False): - zipfile.ZipFile.__init__(self, file, mode, compression, allowZip64) + if sys.version_info < (2, 6): + zipfile.ZipFile.__init__(self, file, mode, compression) + else: + zipfile.ZipFile.__init__(self, file, mode, compression, allowZip64) + if not hasattr(self,"extractall"): # use our method print "Debug: Using comp_extractall!" self.extractall= self.comp_extractall @@ -455,7 +468,7 @@ def WinPyBundle(target=None, source=None, env=None): py_target = env.subst( env['BF_INSTALLDIR'] ) if py_target[0]=='#': py_target=py_target[1:] - py_target+= '/.blender/python/lib/' + py_target = os.path.join(py_target, VERSION, 'python', 'lib') def printexception(func,path,ex): if os.path.exists(path): #do not report if path does not exist. eg on a fresh build. print str(func) + ' failed on ' + str(path) @@ -485,7 +498,9 @@ def AppIt(target=None, source=None, env=None): builddir, b = os.path.split(a) libdir = env['LCGDIR'][1:] osxarch = env['MACOSX_ARCHITECTURE'] + installdir = env['BF_INSTALLDIR'] print("compiled architecture: %s"%(osxarch)) + print("Installing to %s"%(installdir)) if libdir == '../lib/darwin-9.x.universal': python_zip = 'python_' + osxarch + '.zip' # set specific python_arch.zip else: @@ -500,45 +515,45 @@ def AppIt(target=None, source=None, env=None): sourcedir = bldroot + '/source/darwin/%s.app'%binary sourceinfo = bldroot + "/source/darwin/%s.app/Contents/Info.plist"%binary - targetinfo = builddir +'/' + "%s.app/Contents/Info.plist"%binary - cmd = builddir + '/' +'%s.app'%binary + targetinfo = installdir +'/' + "%s.app/Contents/Info.plist"%binary + cmd = installdir + '/' +'%s.app'%binary if os.path.isdir(cmd): shutil.rmtree(cmd) shutil.copytree(sourcedir, cmd) cmd = "cat %s | sed s/VERSION/`cat release/VERSION`/ | sed s/DATE/`date +'%%Y-%%b-%%d'`/ > %s"%(sourceinfo,targetinfo) commands.getoutput(cmd) - cmd = 'cp %s/%s %s/%s.app/Contents/MacOS/%s'%(builddir, binary,builddir, binary, binary) + cmd = 'cp %s/%s %s/%s.app/Contents/MacOS/%s'%(builddir, binary,installdir, binary, binary) commands.getoutput(cmd) - cmd = 'mkdir %s/%s.app/Contents/MacOS/.blender/'%(builddir, binary) + cmd = 'mkdir %s/%s.app/Contents/MacOS/%s/'%(installdir, binary, VERSION) # print cmd commands.getoutput(cmd) - cmd = builddir + '/%s.app/Contents/MacOS/.blender'%binary + cmd = installdir + '/%s.app/Contents/MacOS/%s'%(binary,VERSION) shutil.copy(bldroot + '/bin/.blender/.bfont.ttf', cmd) shutil.copy(bldroot + '/bin/.blender/.Blanguages', cmd) - cmd = 'cp -R %s/bin/.blender/locale %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary) + cmd = 'cp -R %s/bin/%s/locale %s/%s.app/Contents/Resources/'%(bldroot,VERSION,installdir,binary) + commands.getoutput(cmd) + cmd = 'cp -R %s/bin/%s/locale %s/%s.app/Contents/MacOS/%s/'%(bldroot,VERSION,installdir,binary,VERSION) + commands.getoutput(cmd) + cmd = 'cp %s/bin/%s/.Blanguages %s/%s.app/Contents/Resources/'%(bldroot,VERSION,installdir,binary) + commands.getoutput(cmd) + cmd = 'mkdir %s/%s.app/Contents/MacOS/%s/python/'%(installdir,binary, VERSION) + commands.getoutput(cmd) + cmd = 'unzip -q %s/release/%s -d %s/%s.app/Contents/MacOS/%s/python/'%(libdir,python_zip,installdir,binary,VERSION) commands.getoutput(cmd) - cmd = 'cp -R %s/bin/.blender/locale %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) - commands.getoutput(cmd) - cmd = 'cp %s/bin/.blender/.Blanguages %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary) - commands.getoutput(cmd) - cmd = 'mkdir %s/%s.app/Contents/MacOS/.blender/python/'%(builddir,binary) - commands.getoutput(cmd) - cmd = 'unzip -q %s/release/%s -d %s/%s.app/Contents/MacOS/.blender/python/'%(libdir,python_zip,builddir,binary) - commands.getoutput(cmd) - cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) + cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) commands.getoutput(cmd) - cmd = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) + cmd = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) commands.getoutput(cmd) - cmd = 'cp -R %s/release/io %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) + cmd = 'cp -R %s/release/io %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) commands.getoutput(cmd) - cmd = 'chmod +x %s/%s.app/Contents/MacOS/%s'%(builddir,binary, binary) + cmd = 'chmod +x %s/%s.app/Contents/MacOS/%s'%(installdir,binary, binary) commands.getoutput(cmd) - cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(builddir, binary) + cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(installdir, binary) commands.getoutput(cmd) - cmd = 'find %s/%s.app -name .DS_Store -exec rm -rf {} \;'%(builddir, binary) + cmd = 'find %s/%s.app -name .DS_Store -exec rm -rf {} \;'%(installdir, binary) commands.getoutput(cmd) - cmd = 'find %s/%s.app -name __MACOSX -exec rm -rf {} \;'%(builddir, binary) + cmd = 'find %s/%s.app -name __MACOSX -exec rm -rf {} \;'%(installdir, binary) commands.getoutput(cmd) # extract copy system python, be sure to update other build systems @@ -548,7 +563,7 @@ def my_unixpybundle_print(target, source, env): def UnixPyBundle(target=None, source=None, env=None): # Any Unix except osx - #-- .blender/python/lib/python3.1 + #-- VERSION/python/lib/python3.1 import commands @@ -557,7 +572,7 @@ def UnixPyBundle(target=None, source=None, env=None): commands.getoutput(cmd) if env['WITH_BF_FHS']: dir = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION']) # BLENDERPATH - else: dir = os.path.join(env['BF_INSTALLDIR'], '.blender') + else: dir = os.path.join(env['BF_INSTALLDIR'], VERSION) py_src = env.subst( env['BF_PYTHON_LIBPATH'] + '/python'+env['BF_PYTHON_VERSION'] ) py_target = env.subst( dir + '/python/lib/python'+env['BF_PYTHON_VERSION'] ) @@ -624,7 +639,7 @@ class BlenderEnvironment(SConsEnvironment): if not self or not libname or not source: print bc.FAIL+'Cannot continue. Missing argument for BlenderRes '+libname+bc.ENDC self.Exit() - if self['OURPLATFORM'] not in ('win32-vc','win32-mingw','linuxcross'): + if self['OURPLATFORM'] not in ('win32-vc','win32-mingw','linuxcross', 'win64-vc'): print bc.FAIL+'BlenderRes is for windows only!'+bc.END self.Exit() @@ -715,7 +730,7 @@ class BlenderEnvironment(SConsEnvironment): global vcp print bc.HEADER+'Configuring program '+bc.ENDC+bc.OKGREEN+progname+bc.ENDC lenv = self.Clone() - if lenv['OURPLATFORM'] in ['win32-vc', 'cygwin']: + if lenv['OURPLATFORM'] in ('win32-vc', 'cygwin', 'win64-vc'): lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS']) lenv.Append(LINKFLAGS = ['/FORCE:MULTIPLE']) if lenv['BF_DEBUG']: @@ -746,11 +761,7 @@ class BlenderEnvironment(SConsEnvironment): lenv.Append(LIBS = lenv['BF_QUICKTIME_LIB']) lenv.Append(LIBPATH = lenv['BF_QUICKTIME_LIBPATH']) prog = lenv.Program(target=builddir+'bin/'+progname, source=sources) - - #needed for incremental linking - if lenv['OURPLATFORM'] == 'win32-vc': prog = lenv.Precious(prog) - - if lenv['BF_DEBUG'] and lenv['OURPLATFORM']=='win32-vc' and lenv['BF_BSC']: + if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc') and lenv['BF_BSC']: f = lenv.File(progname + '.bsc', builddir) brs = lenv.Command(f, prog, [bsc]) SConsEnvironment.Default(self, brs) diff --git a/tools/__init__.py b/build_files/scons/tools/__init__.py similarity index 100% rename from tools/__init__.py rename to build_files/scons/tools/__init__.py diff --git a/tools/bcolors.py b/build_files/scons/tools/bcolors.py similarity index 100% rename from tools/bcolors.py rename to build_files/scons/tools/bcolors.py diff --git a/tools/btools.py b/build_files/scons/tools/btools.py similarity index 76% rename from tools/btools.py rename to build_files/scons/tools/btools.py index e8f01aa688a..03a1a0f0b7a 100644 --- a/tools/btools.py +++ b/build_files/scons/tools/btools.py @@ -1,4 +1,3 @@ - import os import os.path import SCons.Options @@ -16,6 +15,8 @@ import sys Variables = SCons.Variables BoolVariable = SCons.Variables.BoolVariable +VERSION = '2.52' # This is used in creating the local config directories + def print_arguments(args, bc): if len(args): for k,v in args.iteritems(): @@ -27,7 +28,7 @@ def print_arguments(args, bc): def validate_arguments(args, bc): opts_list = [ - 'WITH_BF_PYTHON', 'BF_PYTHON', 'BF_NO_PYDEBUG', 'BF_PYTHON_VERSION', 'BF_PYTHON_INC', 'BF_PYTHON_BINARY', 'BF_PYTHON_LIB', 'BF_PYTHON_LIBPATH', 'WITH_BF_STATICPYTHON', 'BF_PYTHON_LIB_STATIC', 'BF_PYTHON_DLL', + 'WITH_BF_PYTHON', 'BF_PYTHON', 'BF_PYTHON_VERSION', 'BF_PYTHON_INC', 'BF_PYTHON_BINARY', 'BF_PYTHON_LIB', 'BF_PYTHON_LIBPATH', 'WITH_BF_STATICPYTHON', 'BF_PYTHON_LIB_STATIC', 'BF_PYTHON_DLL', 'WITH_BF_OPENAL', 'BF_OPENAL', 'BF_OPENAL_INC', 'BF_OPENAL_LIB', 'BF_OPENAL_LIBPATH', 'WITH_BF_STATICOPENAL', 'BF_OPENAL_LIB_STATIC', 'WITH_BF_SDL', 'BF_SDL', 'BF_SDL_INC', 'BF_SDL_LIB', 'BF_SDL_LIBPATH', 'BF_LIBSAMPLERATE', 'BF_LIBSAMPLERATE_INC', 'BF_LIBSAMPLERATE_LIB', 'BF_LIBSAMPLERATE_LIBPATH', @@ -42,7 +43,7 @@ def validate_arguments(args, bc): 'WITH_BF_OPENJPEG', 'BF_OPENJPEG', 'BF_OPENJPEG_INC', 'BF_OPENJPEG_LIB', 'BF_OPENJPEG_LIBPATH', 'WITH_BF_REDCODE', 'BF_REDCODE', 'BF_REDCODE_INC', 'BF_REDCODE_LIB', 'BF_REDCODE_LIBPATH', 'WITH_BF_PNG', 'BF_PNG', 'BF_PNG_INC', 'BF_PNG_LIB', 'BF_PNG_LIBPATH', - 'BF_TIFF', 'BF_TIFF_INC', 'BF_TIFF_LIB', 'BF_TIFF_LIBPATH', + 'WITH_BF_TIFF', 'BF_TIFF', 'BF_TIFF_INC', 'BF_TIFF_LIB', 'BF_TIFF_LIBPATH', 'WITH_BF_ZLIB', 'BF_ZLIB', 'BF_ZLIB_INC', 'BF_ZLIB_LIB', 'BF_ZLIB_LIBPATH', 'WITH_BF_INTERNATIONAL', 'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'BF_GETTEXT_LIBPATH', @@ -73,7 +74,7 @@ def validate_arguments(args, bc): 'BF_FANCY', 'BF_QUIET', 'BF_LINE_OVERWRITE', 'BF_X264_CONFIG', 'BF_XVIDCORE_CONFIG', - 'WITH_BF_LCMS', 'BF_LCMS_LIB', + 'WITH_BF_LCMS', 'BF_LCMS', 'BF_LCMS_INC', 'BF_LCMS_LIB', 'BF_LCMS_LIBPATH', 'WITH_BF_DOCS', 'BF_NUMJOBS', 'BF_MSVS', @@ -82,12 +83,13 @@ def validate_arguments(args, bc): 'BF_GHOST_DEBUG', 'WITH_BF_RAYOPTIMIZATION', 'BF_RAYOPTIMIZATION_SSE_FLAGS', - 'BF_NO_ELBEEM' + 'BF_NO_ELBEEM', + 'BF_VCREDIST' # Windows-only, and useful only when creating installer ] # Have options here that scons expects to be lists opts_list_split = [ - 'BF_PYTHON_LINKFLAGS', 'BF_NO_PYDEBUG', + 'BF_PYTHON_LINKFLAGS', 'BF_OPENGL_LINKFLAGS', 'CFLAGS', 'CCFLAGS', 'CXXFLAGS', 'CPPFLAGS', 'REL_CFLAGS', 'REL_CCFLAGS', 'REL_CXXFLAGS', @@ -160,7 +162,7 @@ def SetupSpawn( env ): env['SPAWN'] = buf.ourspawn -def read_opts(cfg, args): +def read_opts(env, cfg, args): localopts = Variables.Variables(cfg, args) localopts.AddVariables( ('LCGDIR', 'location of cvs lib dir'), @@ -174,7 +176,6 @@ def read_opts(cfg, args): ('BF_PYTHON_LIB_STATIC', 'Python static libraries', ''), ('BF_PYTHON_LIBPATH', 'Library path', ''), ('BF_PYTHON_LINKFLAGS', 'Python link flags', ''), - (BoolVariable('BF_NO_PYDEBUG', 'Don\'t Use Python Debug Lib', False)), (BoolVariable('WITH_BF_STATICPYTHON', 'Staticly link to python', False)), (BoolVariable('BF_NO_ELBEEM', 'Disable Fluid Sim', False)), @@ -262,11 +263,18 @@ def read_opts(cfg, args): ('BF_PNG_LIB', 'PNG library', ''), ('BF_PNG_LIBPATH', 'PNG library path', ''), + (BoolVariable('WITH_BF_TIFF', 'Use TIFF if true', True)), ('BF_TIFF', 'TIFF base path', ''), ('BF_TIFF_INC', 'TIFF include path', ''), ('BF_TIFF_LIB', 'TIFF library', ''), ('BF_TIFF_LIBPATH', 'TIFF library path', ''), + (BoolVariable('WITH_BF_LCMS', 'Enable color correction with lcms', False)), + ('BF_LCMS', 'LCMS base path', ''), + ('BF_LCMS_INC', 'LCMS include path', ''), + ('BF_LCMS_LIB', 'LCMS library', ''), + ('BF_LCMS_LIBPATH', 'LCMS library path', ''), + (BoolVariable('WITH_BF_ZLIB', 'Use ZLib if true', True)), ('BF_ZLIB', 'ZLib base path', ''), ('BF_ZLIB_INC', 'ZLib include path', ''), @@ -400,8 +408,8 @@ def read_opts(cfg, args): ('BF_BUILDDIR', 'Build dir', ''), ('BF_INSTALLDIR', 'Installation dir', ''), - ('CC', 'C compiler to use', ''), - ('CXX', 'C++ compiler to use', ''), + ('CC', 'C compiler to use', env['CC']), + ('CXX', 'C++ compiler to use', env['CXX']), (BoolVariable('BF_BUILDINFO', 'Buildtime in splash if true', True)), @@ -418,9 +426,6 @@ def read_opts(cfg, args): (BoolVariable('WITH_BF_LZO', 'Enable fast LZO pointcache compression', True)), (BoolVariable('WITH_BF_LZMA', 'Enable best LZMA pointcache compression', True)), - (BoolVariable('WITH_BF_LCMS', 'Enable color correction with lcms', False)), - ('BF_LCMS_LIB', 'LCMSlibrary', 'lcms'), - ('BF_X264_CONFIG', 'configuration flags for x264', ''), ('BF_XVIDCORE_CONFIG', 'configuration flags for xvidcore', ''), (BoolVariable('WITH_BF_DOCS', 'Generate API documentation', False)), @@ -437,36 +442,60 @@ def read_opts(cfg, args): (BoolVariable('BF_GHOST_DEBUG', 'Make GHOST print events and info to stdout. (very verbose)', False)), (BoolVariable('WITH_BF_RAYOPTIMIZATION', 'Enable raytracer SSE/SIMD optimization.', False)), - ('BF_RAYOPTIMIZATION_SSE_FLAGS', 'SSE flags', '') + ('BF_RAYOPTIMIZATION_SSE_FLAGS', 'SSE flags', ''), + ('BF_VCREDIST', 'Full path to vcredist', '') ) # end of opts.AddOptions() return localopts def NSIS_print(target, source, env): - return "Creating NSIS installer for Blender 3D" + return "Creating NSIS installer for Blender" def NSIS_Installer(target=None, source=None, env=None): + print "="*35 - if env['OURPLATFORM'] != 'win32-vc' and env['OURPLATFORM'] != 'win32-mingw': + if env['OURPLATFORM'] not in ('win32-vc', 'win32-mingw', 'win64-vc'): print "NSIS installer is only available on Windows." Exit() - - start_dir = os.getcwd() - rel_dir = start_dir + "\\release\\windows\\installer\\" - install_base_dir = start_dir + "\\" - - if not os.path.exists(install_base_dir+env['BF_INSTALLDIR']+'/plugins/include'): - os.mkdir(install_base_dir+env['BF_INSTALLDIR']+'/plugins/include') - - for f in glob.glob('source/blender/blenpluginapi/*.h'): - shutil.copy(f,install_base_dir+env['BF_INSTALLDIR']+'/plugins/include') + if env['OURPLATFORM'] == 'win32-vc': + bitness = '32' + elif env['OURPLATFORM'] == 'win64-vc': + bitness = '64' + else: + bitness = '-mingw' - shutil.copy('source/blender/blenpluginapi/plugin.def',install_base_dir+env['BF_INSTALLDIR']+'/plugins/include/') + start_dir = os.getcwd() + rel_dir = os.path.join(start_dir,'release','windows','installer') + install_base_dir = start_dir + os.sep + + bf_installdir = os.path.join(os.getcwd(),env['BF_INSTALLDIR']) + bf_installdir = os.path.normpath(bf_installdir) + + doneroot = False + rootdirconts = [] + datafiles = '' + l = len(bf_installdir) + + for dp,dn,df in os.walk(bf_installdir): + if not doneroot: + for f in df: + rootdirconts.append(os.path.join(dp,f)) + doneroot = True + else: + if len(df)>0: + dp_tmp = dp[l:] + if dp_tmp.find('python\\lib') > -1: + datafiles += "\n" +r'SetOutPath $INSTDIR'+dp[l:]+"\n\n" + else: + datafiles += "\n"+r'SetOutPath $BLENDERHOME'+dp[l:]+"\n\n" + + for f in df: + outfile = os.path.join(dp,f) + datafiles += ' File '+outfile + "\n" os.chdir("release") v = open("VERSION") version = v.read()[:-1] - shortver = version.split('.')[0] + version.split('.')[1] v.close() #### change to suit install dir #### @@ -476,149 +505,50 @@ def NSIS_Installer(target=None, source=None, env=None): ns = open("00.sconsblender.nsi","r") - ns_cnt = str(ns.read()) ns.close() - # set Python version we compile against - ns_cnt = string.replace(ns_cnt, "[PYTHON_VERSION]", env['BF_PYTHON_VERSION']) + # var replacements + ns_cnt = string.replace(ns_cnt, "[DISTDIR]", os.path.normpath(inst_dir+os.sep)) + ns_cnt = string.replace(ns_cnt, "[VERSION]", version) + ns_cnt = string.replace(ns_cnt, "[SHORTVERSION]", VERSION) + ns_cnt = string.replace(ns_cnt, "[RELDIR]", os.path.normpath(rel_dir)) + ns_cnt = string.replace(ns_cnt, "[BITNESS]", bitness) # do root rootlist = [] - rootdir = os.listdir(inst_dir+"\\") - for rootitem in rootdir: - if os.path.isdir(inst_dir+"\\"+ rootitem) == 0: - rootlist.append("File \"" + os.path.normpath(inst_dir) + "\\" + rootitem+"\"") + for rootitem in rootdirconts: + rootlist.append("File \"" + rootitem + "\"") rootstring = string.join(rootlist, "\n ") + rootstring = rootstring rootstring += "\n\n" ns_cnt = string.replace(ns_cnt, "[ROOTDIRCONTS]", rootstring) + # do delete items delrootlist = [] - for rootitem in rootdir: - if os.path.isdir(inst_dir + rootitem) == 0: - delrootlist.append("Delete $INSTDIR\\" + rootitem) + for rootitem in rootdirconts: + delrootlist.append("Delete $INSTDIR\\" + rootitem[l+1:]) delrootstring = string.join(delrootlist, "\n ") delrootstring += "\n" ns_cnt = string.replace(ns_cnt, "[DELROOTDIRCONTS]", delrootstring) - # do scripts - scriptlist = [] - scriptpath = "%s%s" % (inst_dir, "\\.blender\\scripts") - scriptdir = os.listdir(scriptpath) - for scriptitem in scriptdir: - scriptfile = "%s\\%s" % (scriptpath, scriptitem) - if os.path.isdir(scriptfile) == 0: - scriptfile = os.path.normpath(scriptfile) - scriptlist.append("File \"%s\"" % scriptfile) - scriptstring = string.join(scriptlist, "\n ") - scriptstring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[SCRIPTCONTS]", scriptstring) + ns_cnt = string.replace(ns_cnt, "[DODATAFILES]", datafiles) - # do scripts\bpymodules - bpymodlist = [] - bpymodpath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpymodules") - bpymoddir = os.listdir(bpymodpath) - - for bpymoditem in bpymoddir: - bpymodfile = "%s\\%s" % (bpymodpath, bpymoditem) - if os.path.isdir(bpymodfile) == 0: - bpymodfile = os.path.normpath(bpymodfile) - bpymodlist.append("File \"%s\"" % bpymodfile) - bpymodstring = string.join(bpymodlist, "\n ") - bpymodstring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[SCRIPTMODCONTS]", bpymodstring) - - # do scripts\bpymodules\colladaimex - colladalist = [] - bpymodpath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpymodules\\ColladaImEx") - bpymoddir = os.listdir(bpymodpath) - - for bpymoditem in bpymoddir: - bpymodfile = "%s\\%s" % (bpymodpath, bpymoditem) - if os.path.isdir(bpymodfile) == 0: - bpymodfile=os.path.normpath(bpymodfile) - colladalist.append("File \"%s\"" % bpymodfile) - bpymodstring = string.join(colladalist, "\n ") - bpymodstring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[SCRIPTMODCOLLADACONT]", bpymodstring) - - # do scripts\bpydata - bpydatalist = [] - bpydatapath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpydata") - bpydatadir = os.listdir(bpydatapath) - for bpydataitem in bpydatadir: - bpydatafile = "%s\\%s" % (bpydatapath, bpydataitem) - if os.path.isdir(bpydatafile) == 0: - bpydatalist.append("File \"%s\"" % bpydatafile) - bpydatastring = string.join(bpydatalist, "\n ") - bpydatastring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[SCRIPTDATACONTS]", bpydatastring) - - # do plugins\include - plugincludelist = [] - plugincludepath = "%s%s" % (inst_dir, "\\plugins\\include") - plugincludedir = os.listdir(plugincludepath) - for plugincludeitem in plugincludedir: - plugincludefile = "%s\\%s" % (plugincludepath, plugincludeitem) - if os.path.isdir(plugincludefile) == 0: - if plugincludefile.find('.h') or plugincludefile.find('.DEF'): - plugincludefile = os.path.normpath(plugincludefile) - plugincludelist.append("File \"%s\"" % plugincludefile) - plugincludestring = string.join(plugincludelist, "\n ") - plugincludestring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[PLUGINCONTS]", plugincludestring) - - # do scripts\bpydata\config - cfglist = [] - cfgpath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpydata\\config") - cfgdir = os.listdir(cfgpath) - for cfgitem in cfgdir: - cfgfile = "%s\\%s" % (cfgpath, cfgitem) - if os.path.isdir(cfgfile) == 0: - cfglist.append("File \"%s\"" % cfgfile) - cfgstring = string.join(cfglist, "\n ") - cfgstring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[SCRIPTDATACFGCONTS]", cfgstring) - - # do dotblender - dotblendlist = [] - dotblenddir = os.listdir(inst_dir+"\\.blender") - for dotblenditem in dotblenddir: - if os.path.isdir(inst_dir + "\\.blender\\" + dotblenditem) == 0: - dotblendlist.append("File \"" + os.path.normpath(inst_dir) + "\\.blender\\" + - dotblenditem+"\"") - dotblendstring = string.join(dotblendlist, "\n ") - dotblendstring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[DOTBLENDERCONTS]", dotblendstring) - - # do language files - langlist = [] - langfiles = [] - langdir = os.listdir(inst_dir + "\\.blender\\locale") - for langitem in langdir: - if os.path.isdir(inst_dir + "\\.blender\\locale\\" + langitem) == 1: - langfiles.append("SetOutPath $BLENDERHOME\\.blender\\locale\\" + langitem + "\\LC_MESSAGES") - langfiles.append("File \"" + os.path.normpath(inst_dir) + "\\.blender\\locale\\" - + langitem + "\\LC_MESSAGES\\blender.mo\"") - langstring = string.join(langfiles, "\n ") - langstring += "\n\n" - ns_cnt = string.replace(ns_cnt, "[LANGUAGECONTS]", langstring) - - # var replacements - ns_cnt = string.replace(ns_cnt, "DISTDIR", os.path.normpath(inst_dir+"\\")) - ns_cnt = string.replace(ns_cnt, "SHORTVER", shortver) - ns_cnt = string.replace(ns_cnt, "VERSION", version) - ns_cnt = string.replace(ns_cnt, "RELDIR", os.path.normpath(rel_dir)) + # Setup vcredist part + vcredist = "File \""+env['BF_VCREDIST'] + "\"\n" + vcredist += " ExecWait '\"$TEMP\\" + os.path.basename(env['BF_VCREDIST']) + "\" /q'\n" + vcredist += " Delete \"$TEMP\\" + os.path.basename(env['BF_VCREDIST'])+"\"" + ns_cnt = string.replace(ns_cnt, "[VCREDIST]", vcredist) tmpnsi = os.path.normpath(install_base_dir+os.sep+env['BF_BUILDDIR']+os.sep+"00.blender_tmp.nsi") new_nsis = open(tmpnsi, 'w') new_nsis.write(ns_cnt) new_nsis.close() - print "Preparing nsis file looks ok\n" + print "NSIS Installer script created" os.chdir(start_dir) - print "try to launch 'makensis' ...make sure it is on the path \n" + print "Launching 'makensis'" cmdline = "makensis " + "\""+tmpnsi+"\"" diff --git a/tools/crossmingw.py b/build_files/scons/tools/crossmingw.py similarity index 99% rename from tools/crossmingw.py rename to build_files/scons/tools/crossmingw.py index ba6d4878593..f97fdf3c15e 100644 --- a/tools/crossmingw.py +++ b/build_files/scons/tools/crossmingw.py @@ -50,6 +50,7 @@ prefixes = SCons.Util.Split(""" i486-mingw32msvc- i586-mingw32msvc- i686-mingw32msvc- + i686-pc-mingw32- """) def find(env): diff --git a/tools/mstoolkit.py b/build_files/scons/tools/mstoolkit.py old mode 100755 new mode 100644 similarity index 100% rename from tools/mstoolkit.py rename to build_files/scons/tools/mstoolkit.py diff --git a/doc/blender-cmake.txt b/doc/blender-cmake.txt index 05037a3ab2a..a49ff629b5b 100644 --- a/doc/blender-cmake.txt +++ b/doc/blender-cmake.txt @@ -132,9 +132,9 @@ $Id$ The commandline can be used to override detected/default settings, e.g: On Unix: - cmake -D PYTHON_LIB=/usr/local/lib/python2.3/config/libpython2.3.so -D PYTHON_INC=/usr/local/include/python2.3 -D PYTHON_BINARY=/usr/local/bin/python2.3 -G "Unix Makefiles" ../blender + cmake -D PYTHON_LIB=/usr/local/lib/python3.1/config/libpython3.1.so -D PYTHON_INC=/usr/local/include/python3.1 -G "Unix Makefiles" ../blender On Macs: - cmake -D PYTHON_INC=/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -D PYTHON_LIBPATH=/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config -D PYTHON_BINARY=/System/Library/Frameworks/Python.framework/Versions/2.5/bin/python2.5 -G Xcode ../blender + cmake -D PYTHON_INC=/System/Library/Frameworks/Python.framework/Versions/3.1/include/python3.1 -G Xcode ../blender Mote that this should only be needed once per build directory generation because it will keep the overrides in CMakeCache.txt for subsequent runs. diff --git a/doc/blender.1 b/doc/blender.1 new file mode 100644 index 00000000000..43ac5638765 --- /dev/null +++ b/doc/blender.1 @@ -0,0 +1,338 @@ +.TH "BLENDER" "1" "June 27, 2010" "Blender Blender 2\&.52 (sub 5) " + +.SH NAME +blender \- a 3D modelling and rendering package +.SH SYNOPSIS +.B blender [args ...] [file] [args ...] +.br +.SH DESCRIPTION +.PP +.B blender +is a 3D modelling and rendering package. It is the in-house software of a high quality animation studio, Blender has proven to be an extremely fast and versatile design instrument. The software has a personal touch, offering a unique approach to the world of Three Dimensions. + +Use Blender to create TV commercials, to make technical visualizations, business graphics, to do some morphing, or design user interfaces. You can easy build and manage complex environments. The renderer is versatile and extremely fast. All basic animation principles (curves & keys) are well implemented. + +http://www.blender.org +.SH OPTIONS + +Blender 2.52 (sub 5) Build +Usage: blender [args ...] [file] [args ...] +.br +.SS "Render Options:" + +.TP +.B \-b or \-\-background +.br +Load in background (often used for UI\-less rendering) +.br + +.TP +.B \-a or \-\-render\-anim +.br +Render frames from start to end (inclusive) +.br + +.TP +.B \-S or \-\-scene +.br +Set the active scene for rendering +.br + +.TP +.B \-f or \-\-render\-frame +.br +Render frame and save it. +.br ++ start frame relative, \- end frame relative. +.br + +.TP +.B \-s or \-\-frame\-start +.br +Set start to frame (use before the \-a argument) +.br + +.TP +.B \-e or \-\-frame\-end +.br +Set end to frame (use before the \-a argument) +.br + +.TP +.B \-j or \-\-frame\-jump +.br +Set number of frames to step forward after each rendered frame +.br + +.TP +.B \-o or \-\-render\-output +.br +Set the render path and file name. +.br +Use // at the start of the path to +.br + render relative to the blend file. +.br +The # characters are replaced by the frame number, and used to define zero padding. +.br + ani_##_test.png becomes ani_01_test.png +.br + test\-######.png becomes test\-000001.png +.br + When the filename does not contain #, The suffix #### is added to the filename +.br +The frame number will be added at the end of the filename. +.br + eg: blender \-b foobar.blend \-o //render_ \-F PNG \-x 1 \-a +.br + //render_ becomes //render_####, writing frames as //render_0001.png// +.br + +.TP +.B \-E or \-\-engine +.br +Specify the render engine +.br +use \-E help to list available engines +.br + +.IP + +.SS "Format Options:" + +.TP +.B \-F or \-\-render\-format +.br +Set the render format, Valid options are... +.br + TGA IRIS JPEG MOVIE IRIZ RAWTGA +.br + AVIRAW AVIJPEG PNG BMP FRAMESERVER +.br +(formats that can be compiled into blender, not available on all systems) +.br + HDR TIFF EXR MULTILAYER MPEG AVICODEC QUICKTIME CINEON DPX DDS +.br + +.TP +.B \-x or \-\-use\-extension +.br +Set option to add the file extension to the end of the file +.br + +.TP +.B \-t or \-\-threads +.br +Use amount of for rendering in background +.br +[1\-BLENDER_MAX_THREADS], 0 for systems processor count. +.br + +.IP + +.SS "Animation Playback Options:" + +.TP +.B \-a +.br +Playback , only operates this way when not running in background. +.br + \-p Open with lower left corner at , +.br + \-m Read from disk (Don't buffer) +.br + \-f Specify FPS to start with +.br + \-j Set frame step to +.br + +.IP + +.SS "Window Options:" + +.TP +.B \-w or \-\-window\-border +.br +Force opening with borders (default) +.br + +.TP +.B \-W or \-\-window\-borderless +.br +Force opening with without borders +.br + +.TP +.B \-p or \-\-window\-geometry +.br +Open with lower left corner at , and width and height as , +.br + +.IP + +.SS "Game Engine Specific Options:" + +.TP +.B \-g Game Engine specific options +.br +\-g fixedtime Run on 50 hertz without dropping frames +.br +\-g vertexarrays Use Vertex Arrays for rendering (usually faster) +.br +\-g nomipmap No Texture Mipmapping +.br +\-g linearmipmap Linear Texture Mipmapping instead of Nearest (default) +.br + +.IP + +.SS "Misc Options:" + +.TP +.B \-d or \-\-debug +.br +Turn debugging on +.br + +.IP +* Prints every operator call and their arguments +.br +* Disables mouse grab (to interact with a debugger in some cases) +.br +* Keeps python sys.stdin rather then setting it to None +.br + +.TP +.B \-\-debug\-fpe +.br +Enable floating point exceptions +.br + +.IP + +.TP +.B \-nojoystick +.br +Disable joystick support +.br + +.TP +.B \-noglsl +.br +Disable GLSL shading +.br + +.TP +.B \-noaudio +.br +Force sound system to None +.br + +.TP +.B \-setaudio +.br +Force sound system to a specific device +.br +NULL SDL OPENAL JACK +.br + +.IP + +.TP +.B \-h or \-\-help +.br +Print this help text and exit +.br + +.IP + +.TP +.B \-y or \-\-enable\-autoexec +.br +Enable automatic python script execution (default) +.br + +.TP +.B \-Y or \-\-disable\-autoexec +.br +Disable automatic python script execution (pydrivers, pyconstraints, pynodes) +.br + +.IP + +.TP +.B \-P or \-\-python +.br +Run the given Python script (filename or Blender Text) +.br + +.TP +.B \-\-python\-console +.br +Run blender with an interactive console +.br + +.TP +.B \-v or \-\-version +.br +Print Blender version and exit +.br + +.TP +.B \-\- +.br +Ends option processing, following arguments passed unchanged. Access via python's sys.argv +.br + +.SS "Other Options:" + +.TP +.B /? +.br +Print this help text and exit (windows only) +.br + +.TP +.B \-R +.br +Register .blend extension (windows only) +.br + +.SS "Argument Parsing:" + + arguments must be separated by white space. eg + "blender \-ba test.blend" + ...will ignore the 'a' + "blender \-b test.blend \-f8" + ...will ignore 8 because there is no space between the \-f and the frame value +.br +.SS "Argument Order:" + +Arguments are executed in the order they are given. eg + "blender \-\-background test.blend \-\-render\-frame 1 \-\-render\-output /tmp" + ...will not render to /tmp because '\-\-render\-frame 1' renders before the output path is set + "blender \-\-background \-\-render\-output /tmp test.blend \-\-render\-frame 1" + ...will not render to /tmp because loading the blend file overwrites the render output that was set + "blender \-\-background test.blend \-\-render\-output /tmp \-\-render\-frame 1" works as expected. +.br +.br +.SH "ENVIRONMENT VARIABLES" + \fIHOME\fR Store files such as .blender/ .B.blend .Bfs .Blog here. + \fIBLENDERPATH\fR System directory to use for data files and scripts. + For this build of blender the default \fIBLENDERPATH\fR is... + "/usr/local/share/blender/2.5" + setting the \fIBLENDERPATH\fR will override this + \fITMP\fR or \fITMPDIR\fR Store temporary files here. + \fIPYTHONHOME\fR Path to the python directory, eg. /usr/lib/python. +.br +.br + +.br +.SH SEE ALSO +.B yafaray(1) + +.br +.SH AUTHORS +This manpage was written for a Debian GNU/Linux system by Daniel Mester + and updated by Cyril Brulebois + and Dan Eicher . diff --git a/doc/blender.1.py b/doc/blender.1.py new file mode 100644 index 00000000000..05b491cf21e --- /dev/null +++ b/doc/blender.1.py @@ -0,0 +1,134 @@ +#!/usr/bin/python + +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +import subprocess +import os + +import time +import datetime + + +def man_format(data): + data = data.replace("-", "\\-") + data = data.replace("\t", " ") + # data = data.replace("$", "\\fI") + + data_ls = [] + for w in data.split(): + if w.startswith("$"): + w = "\\fI" + w[1:] + "\\fR" + + data_ls.append(w) + + data = data[:len(data) - len(data.lstrip())] + " ".join(data_ls) + + return data + + +blender_bin = os.path.join(os.path.dirname(__file__), "../blender") + +blender_help = subprocess.Popen([blender_bin, "--help"], stdout=subprocess.PIPE).communicate()[0].decode() + +blender_version = subprocess.Popen([blender_bin, "--version"], stdout=subprocess.PIPE).communicate()[0].decode().strip() +blender_version = blender_version.split("Build")[0] + +date_string = datetime.date.fromtimestamp(time.time()).strftime("%B %d, %Y") + +filepath = os.path.splitext(__file__)[0] + ".1" + +file = open(filepath, "w") + +fw = file.write + +fw('.TH "BLENDER" "1" "%s" "Blender %s"\n' % (date_string, blender_version.replace(".", "\\&."))) + +fw(''' +.SH NAME +blender \- a 3D modelling and rendering package''') + +fw(''' +.SH SYNOPSIS +.B blender [args ...] [file] [args ...]''') + +fw(''' +.br +.SH DESCRIPTION +.PP +.B blender +is a 3D modelling and rendering package. It is the in-house software of a high quality animation studio, Blender has proven to be an extremely fast and versatile design instrument. The software has a personal touch, offering a unique approach to the world of Three Dimensions. + +Use Blender to create TV commercials, to make technical visualizations, business graphics, to do some morphing, or design user interfaces. You can easy build and manage complex environments. The renderer is versatile and extremely fast. All basic animation principles (curves & keys) are well implemented. + +http://www.blender.org''') + +fw(''' +.SH OPTIONS''') + +fw("\n\n") + +lines = [line.rstrip() for line in blender_help.split("\n")] + +while lines: + l = lines.pop(0) + if l.startswith("Environment Variables:"): + fw('.SH "ENVIRONMENT VARIABLES"\n') + elif l.endswith(":"): # one line + fw('.SS "%s"\n\n' % l) + elif l.startswith("-") or l.startswith("/"): # can be multi line + + fw('.TP\n') + fw('.B %s\n' % man_format(l)) + + while lines: + # line with no + if lines[0].strip() and len(lines[0].lstrip()) == len(lines[0]): # no white space + break + + if not l: # second blank line + fw('.IP\n') + else: + fw('.br\n') + + l = lines.pop(0) + l = l[1:] # remove first whitespace (tab) + + fw('%s\n' % man_format(l)) + + else: + if not l.strip(): + fw('.br\n') + else: + fw('%s\n' % man_format(l)) + +# footer + +fw(''' +.br +.SH SEE ALSO +.B yafaray(1) + +.br +.SH AUTHORS +This manpage was written for a Debian GNU/Linux system by Daniel Mester + and updated by Cyril Brulebois + and Dan Eicher . +''') diff --git a/extern/glew/include/GL/glew.h b/extern/glew/include/GL/glew.h index 2014092e877..3cb7bed3dda 100644 --- a/extern/glew/include/GL/glew.h +++ b/extern/glew/include/GL/glew.h @@ -2702,7 +2702,7 @@ typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURLAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); @@ -2723,7 +2723,7 @@ typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum targ #define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) #define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) #define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) -#define glFramebufferTexturLayer GLEW_GET_FUN(__glewFramebufferTexturLayer) +#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) #define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) #define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) #define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) @@ -8288,7 +8288,6 @@ typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -typedef void (GLAPIENTRY * PFNGLVIDEOPARAMETERIVNVPROC) (GLuint video_slot, GLenum pname, const GLint* params); #define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) #define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) @@ -10563,7 +10562,7 @@ GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; -GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURLAYERPROC __glewFramebufferTexturLayer; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; @@ -11612,7 +11611,6 @@ GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; -GLEW_FUN_EXPORT PFNGLVIDEOPARAMETERIVNVPROC __glewVideoParameterivNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; diff --git a/extern/glew/src/glew.c b/extern/glew/src/glew.c index 24c6a726c38..1d947d364d3 100644 --- a/extern/glew/src/glew.c +++ b/extern/glew/src/glew.c @@ -547,7 +547,7 @@ PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTURLAYERPROC __glewFramebufferTexturLayer = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; @@ -1596,7 +1596,6 @@ PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; -PFNGLVIDEOPARAMETERIVNVPROC __glewVideoParameterivNV = NULL; PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; @@ -2739,7 +2738,7 @@ static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; - r = ((glFramebufferTexturLayer = (PFNGLFRAMEBUFFERTEXTURLAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexturLayer")) == NULL) || r; + r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; @@ -5303,7 +5302,6 @@ static GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT) r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; - r = ((glVideoParameterivNV = (PFNGLVIDEOPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoParameterivNV")) == NULL) || r; return r; } diff --git a/extern/libopenjpeg/dwt.c b/extern/libopenjpeg/dwt.c index 78d18d175f4..357b475b9ac 100644 --- a/extern/libopenjpeg/dwt.c +++ b/extern/libopenjpeg/dwt.c @@ -610,7 +610,7 @@ static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){ int i; for(i = 0; i < count; ++i){ __m128 tmp = vw[i*2]; - vw[i*2] = tmp * c; + vw[i*2] = _mm_mul_ps(tmp, c); } } @@ -622,18 +622,18 @@ static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){ __m128 tmp1 = vl[ 0]; __m128 tmp2 = vw[-1]; __m128 tmp3 = vw[ 0]; - vw[-1] = tmp2 + ((tmp1 + tmp3) * c); + vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c)); vl = vw; vw += 2; } if(m >= k){ return; } - c += c; - c *= vl[0]; + c = _mm_add_ps(c, c); + c = _mm_mul_ps(c, vl[0]); for(; m < k; ++m){ __m128 tmp = vw[-1]; - vw[-1] = tmp + c; + vw[-1] = _mm_add_ps(tmp, c); vw += 2; } } diff --git a/extern/libopenjpeg/opj_malloc.h b/extern/libopenjpeg/opj_malloc.h index 4e9727af0f3..960bdb3ec4b 100644 --- a/extern/libopenjpeg/opj_malloc.h +++ b/extern/libopenjpeg/opj_malloc.h @@ -76,7 +76,7 @@ Allocate memory aligned to a 16 byte boundry #if defined(__sun) #define HAVE_MEMALIGN #elif defined(__GNUC__) - #ifndef __APPLE__ + #if !defined(__APPLE__) && !defined(__FreeBSD__) #define HAVE_MEMALIGN #include #endif diff --git a/extern/libopenjpeg/patches/fbsd.patch b/extern/libopenjpeg/patches/fbsd.patch new file mode 100644 index 00000000000..90e77600941 --- /dev/null +++ b/extern/libopenjpeg/patches/fbsd.patch @@ -0,0 +1,13 @@ +Index: extern/libopenjpeg/opj_malloc.h +=================================================================== +--- extern/libopenjpeg/opj_malloc.h (revision 27736) ++++ extern/libopenjpeg/opj_malloc.h (working copy) +@@ -76,7 +76,7 @@ + #if defined(__sun) + #define HAVE_MEMALIGN + #elif defined(__GNUC__) +- #ifndef __APPLE__ ++ #if !defined(__APPLE__) && !defined(__FreeBSD__) + #define HAVE_MEMALIGN + #include + #endif diff --git a/extern/lzo/minilzo/Makefile b/extern/lzo/minilzo/Makefile index 8f3d5042579..11e51f3ad96 100644 --- a/extern/lzo/minilzo/Makefile +++ b/extern/lzo/minilzo/Makefile @@ -1,5 +1,5 @@ # -# $Id: +# $Id$ # # ***** BEGIN GPL LICENSE BLOCK ***** # diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp index f67c819ff10..8e71c97baec 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp @@ -23,6 +23,9 @@ * ***** END LGPL LICENSE BLOCK ***** */ +// needed for INT64_C +#define __STDC_CONSTANT_MACROS + #include "AUD_FFMPEGFactory.h" #include "AUD_FFMPEGReader.h" #include "AUD_Buffer.h" diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index 027ac015eb5..313ea52e892 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -67,12 +67,12 @@ int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer* buffer) audio_pkg_data, audio_pkg_size); - buf_pos += data_size; - // read error, next packet! if(read_length < 0) break; + buf_pos += data_size; + // move packet parameters audio_pkg_data += read_length; audio_pkg_size -= read_length; diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp index f7394e36c4d..8740f62c9a7 100644 --- a/intern/audaspace/intern/AUD_C-API.cpp +++ b/intern/audaspace/intern/AUD_C-API.cpp @@ -27,6 +27,11 @@ #include #include +#ifdef WITH_FFMPEG +// needed for INT64_C +#define __STDC_CONSTANT_MACROS +#endif + #include "AUD_NULLDevice.h" #include "AUD_I3DDevice.h" #include "AUD_FileFactory.h" @@ -62,6 +67,7 @@ #include "AUD_JackDevice.h" #endif + #ifdef WITH_FFMPEG extern "C" { #include @@ -84,11 +90,15 @@ static AUD_IDevice* AUD_device = NULL; static int AUD_available_devices[4]; static AUD_I3DDevice* AUD_3ddevice = NULL; -int AUD_init(AUD_DeviceType device, AUD_DeviceSpecs specs, int buffersize) +void AUD_initOnce() { #ifdef WITH_FFMPEG av_register_all(); #endif +} + +int AUD_init(AUD_DeviceType device, AUD_DeviceSpecs specs, int buffersize) +{ AUD_IDevice* dev = NULL; if(AUD_device) diff --git a/intern/audaspace/intern/AUD_C-API.h b/intern/audaspace/intern/AUD_C-API.h index a7372c29885..55aed02153f 100644 --- a/intern/audaspace/intern/AUD_C-API.h +++ b/intern/audaspace/intern/AUD_C-API.h @@ -55,6 +55,11 @@ typedef struct typedef void (*AUD_syncFunction)(void*, int, float); #endif +/** + * Initializes FFMPEG if it is enabled. + */ +extern void AUD_initOnce(); + /** * Initializes an audio device. * \param device The device type that should be used. diff --git a/intern/audaspace/intern/AUD_FileFactory.cpp b/intern/audaspace/intern/AUD_FileFactory.cpp index b63390803b1..5888479a0ba 100644 --- a/intern/audaspace/intern/AUD_FileFactory.cpp +++ b/intern/audaspace/intern/AUD_FileFactory.cpp @@ -29,6 +29,9 @@ #include #ifdef WITH_FFMPEG +// needed for INT64_C +#define __STDC_CONSTANT_MACROS + #include "AUD_FFMPEGReader.h" #endif #ifdef WITH_SNDFILE diff --git a/intern/audaspace/intern/AUD_NULLDevice.cpp b/intern/audaspace/intern/AUD_NULLDevice.cpp index 3936695c28f..c9dfadd1839 100644 --- a/intern/audaspace/intern/AUD_NULLDevice.cpp +++ b/intern/audaspace/intern/AUD_NULLDevice.cpp @@ -23,6 +23,8 @@ * ***** END LGPL LICENSE BLOCK ***** */ +#include + #include "AUD_NULLDevice.h" #include "AUD_IReader.h" #include "AUD_IFactory.h" @@ -76,7 +78,7 @@ bool AUD_NULLDevice::seek(AUD_Handle* handle, float position) float AUD_NULLDevice::getPosition(AUD_Handle* handle) { - return 0.0f; + return std::numeric_limits::quiet_NaN(); } AUD_Status AUD_NULLDevice::getStatus(AUD_Handle* handle) diff --git a/intern/bsp/intern/BSP_MeshPrimitives.cpp b/intern/bsp/intern/BSP_MeshPrimitives.cpp index 16cca56622f..f77d353ec94 100644 --- a/intern/bsp/intern/BSP_MeshPrimitives.cpp +++ b/intern/bsp/intern/BSP_MeshPrimitives.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "BSP_MeshPrimitives.h" #include "MT_assert.h" diff --git a/intern/bsp/intern/CSG_BooleanOps.cpp b/intern/bsp/intern/CSG_BooleanOps.cpp index fc7eb5d14d7..dfc46dff85d 100644 --- a/intern/bsp/intern/CSG_BooleanOps.cpp +++ b/intern/bsp/intern/CSG_BooleanOps.cpp @@ -30,10 +30,6 @@ * Implementation of external api for CSG part of BSP lib interface. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "../extern/CSG_BooleanOps.h" #include "BSP_CSGMesh_CFIterator.h" #include "MEM_RefCountPtr.h" diff --git a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp index 122eda99f66..7b0d144c5c7 100644 --- a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp +++ b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp @@ -31,10 +31,6 @@ * $Id$ * Copyright (C) 2001 NaN Technologies B.V. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(WIN32) || defined(__APPLE__) # ifdef WIN32 # include diff --git a/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp b/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp index 39b18545f62..1d3be0b9ca4 100644 --- a/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp +++ b/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "BSP_MeshDrawer.h" #include "BSP_TMesh.h" diff --git a/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp b/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp index 07f2503effd..9c0499a7977 100644 --- a/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp +++ b/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "BSP_PlyLoader.h" #include "MT_Vector3.h" diff --git a/intern/bsp/test/BSP_GhostTest/main.cpp b/intern/bsp/test/BSP_GhostTest/main.cpp index 409334e1720..a03d85b25e9 100644 --- a/intern/bsp/test/BSP_GhostTest/main.cpp +++ b/intern/bsp/test/BSP_GhostTest/main.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "BSP_GhostTest3D.h" #include "BSP_TMesh.h" diff --git a/intern/bsp/test/BSP_GhostTest/plyfile.c b/intern/bsp/test/BSP_GhostTest/plyfile.c index 400b0f20ee7..aa0db15a334 100644 --- a/intern/bsp/test/BSP_GhostTest/plyfile.c +++ b/intern/bsp/test/BSP_GhostTest/plyfile.c @@ -67,10 +67,6 @@ WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. #include #include "ply.h" -#ifdef HAVE_CONFIG_H -#include -#endif - char *type_names[] = { "invalid", "char", "short", "int", diff --git a/intern/container/intern/CTR_List.cpp b/intern/container/intern/CTR_List.cpp index fdb72082604..05090db97d9 100644 --- a/intern/container/intern/CTR_List.cpp +++ b/intern/container/intern/CTR_List.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "CTR_List.h" diff --git a/intern/decimation/intern/LOD_EdgeCollapser.cpp b/intern/decimation/intern/LOD_EdgeCollapser.cpp index a5efe87b8b4..353ddbf363f 100644 --- a/intern/decimation/intern/LOD_EdgeCollapser.cpp +++ b/intern/decimation/intern/LOD_EdgeCollapser.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "LOD_EdgeCollapser.h" #include "LOD_ManMesh2.h" diff --git a/intern/decimation/intern/LOD_ExternNormalEditor.cpp b/intern/decimation/intern/LOD_ExternNormalEditor.cpp index 505970d583f..7130ff2a0d6 100644 --- a/intern/decimation/intern/LOD_ExternNormalEditor.cpp +++ b/intern/decimation/intern/LOD_ExternNormalEditor.cpp @@ -29,10 +29,6 @@ #include "LOD_ExternNormalEditor.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - using namespace std; diff --git a/intern/decimation/intern/LOD_FaceNormalEditor.cpp b/intern/decimation/intern/LOD_FaceNormalEditor.cpp index 91183cbb59f..a6175bbb0c8 100644 --- a/intern/decimation/intern/LOD_FaceNormalEditor.cpp +++ b/intern/decimation/intern/LOD_FaceNormalEditor.cpp @@ -29,10 +29,6 @@ // implementation of LOD_FaceNormalEditor.h /////////////////////////////////////// -#ifdef HAVE_CONFIG_H -#include -#endif - #include "LOD_FaceNormalEditor.h" using namespace std; diff --git a/intern/decimation/intern/LOD_ManMesh2.cpp b/intern/decimation/intern/LOD_ManMesh2.cpp index 7b1b5e15035..a48c8fe0db1 100644 --- a/intern/decimation/intern/LOD_ManMesh2.cpp +++ b/intern/decimation/intern/LOD_ManMesh2.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "LOD_ManMesh2.h" #include "MT_assert.h" diff --git a/intern/decimation/intern/LOD_MeshPrimitives.cpp b/intern/decimation/intern/LOD_MeshPrimitives.cpp index f7f6448e35e..5e5a9ec9fc4 100644 --- a/intern/decimation/intern/LOD_MeshPrimitives.cpp +++ b/intern/decimation/intern/LOD_MeshPrimitives.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "LOD_MeshPrimitives.h" #include "MT_assert.h" diff --git a/intern/decimation/intern/LOD_QSDecimator.cpp b/intern/decimation/intern/LOD_QSDecimator.cpp index d19096aead1..151f06d69fc 100644 --- a/intern/decimation/intern/LOD_QSDecimator.cpp +++ b/intern/decimation/intern/LOD_QSDecimator.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "LOD_QSDecimator.h" #include "LOD_ExternBufferEditor.h" diff --git a/intern/decimation/intern/LOD_QuadricEditor.cpp b/intern/decimation/intern/LOD_QuadricEditor.cpp index 27bf946ef73..7eb7f24ece4 100644 --- a/intern/decimation/intern/LOD_QuadricEditor.cpp +++ b/intern/decimation/intern/LOD_QuadricEditor.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "LOD_QuadricEditor.h" #include "LOD_ExternNormalEditor.h" diff --git a/intern/decimation/intern/LOD_decimation.cpp b/intern/decimation/intern/LOD_decimation.cpp index 12d558d5189..69fb018df98 100644 --- a/intern/decimation/intern/LOD_decimation.cpp +++ b/intern/decimation/intern/LOD_decimation.cpp @@ -27,10 +27,6 @@ */ // implementation of external c api -#ifdef HAVE_CONFIG_H -#include -#endif - #include "../extern/LOD_decimation.h" #include "LOD_DecimationClass.h" diff --git a/intern/elbeem/CMakeLists.txt b/intern/elbeem/CMakeLists.txt index f0c71e067fc..e45a210bd88 100644 --- a/intern/elbeem/CMakeLists.txt +++ b/intern/elbeem/CMakeLists.txt @@ -24,7 +24,7 @@ # # ***** END GPL LICENSE BLOCK ***** -SET(INC ${ZLIB_INC} ${PNG_INC} extern) +SET(INC ${PNG_INC} ${ZLIB_INC} extern) FILE(GLOB SRC intern/*.cpp) diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index ba62bcb8e4b..1a7627c9099 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -24,57 +24,68 @@ # # ***** END GPL LICENSE BLOCK ***** -SET(INC . ../string ../../extern/glew/include ../../source/blender/imbuf ../../source/blender/makesdna) +SET(INC + . + ../string + ../../extern/glew/include + ../../source/blender/imbuf + ../../source/blender/makesdna +) -FILE(GLOB SRC intern/*.cpp intern/*.mm) +SET(SRC + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_Buttons.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_CallbackEventConsumer.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_C-api.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_EventManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_EventPrinter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_ISystem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_ModifierKeys.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_NDOFManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_Path-api.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_Rect.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_System.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_TimerManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_Window.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowManager.cpp +) IF(APPLE) IF(WITH_COCOA) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") + SET(SRC ${SRC} + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCocoa.mm + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCocoa.mm + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCocoa.mm + ) ELSE(WITH_COCOA) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCocoa.mm") + SET(SRC ${SRC} + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp + ) ENDIF(WITH_COCOA) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DropTargetWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") IF(WITH_QUICKTIME) ADD_DEFINITIONS(-DWITH_QUICKTIME) ENDIF(WITH_QUICKTIME) -ELSE(APPLE) - IF(WIN32) - SET(INC ${INC} ${WINTAB_INC}) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") - ELSE(WIN32) - SET(INC ${INC} ${X11_X11_INCLUDE_PATH}) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DropTargetWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCocoa.mm") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCocoa.mm") - ENDIF(WIN32) +ELSEIF(WIN32) + SET(INC ${INC} ${WINTAB_INC}) + + SET(SRC ${SRC} + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DropTargetWin32.cpp + ) +ELSEIF(UNIX) + SET(INC ${INC} ${X11_X11_INCLUDE_PATH}) + + SET(SRC ${SRC} + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp + ) ENDIF(APPLE) BLENDERLIB(bf_ghost "${SRC}" "${INC}") -#, libtype=['core','player'], priority = [25,15] ) + diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 346fa292520..28fa72f9700 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -264,7 +264,24 @@ extern int GHOST_DispatchEvents(GHOST_SystemHandle systemhandle); extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, GHOST_EventConsumerHandle consumerhandle); +/*************************************************************************************** + ** Progress bar functionality + ***************************************************************************************/ +/** + * Sets the progress bar value displayed in the window/application icon + * @param windowhandle The handle to the window + * @param progress The progress % (0.0 to 1.0) + */ +extern GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle, float progress); + +/** + * Hides the progress bar in the icon + * @param windowhandle The handle to the window + */ +extern GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle); + + /*************************************************************************************** ** N-degree of freedom device management functionality ***************************************************************************************/ @@ -819,20 +836,6 @@ extern GHOST_TUns8* GHOST_getClipboard(int selection); */ extern void GHOST_putClipboard(GHOST_TInt8 *buffer, int selection); -/** - * Determine the base dir in which shared resources are located. It will first try to use - * "unpack and run" path, then look for properly installed path, not including versioning. - * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). - */ -extern const GHOST_TUns8* GHOST_getSystemDir(); - -/** - * Determine the base dir in which user configuration is stored, not including versioning. - * If needed, it will create the base directory. - * @return Unsigned char string pointing to user dir (eg ~/.blender/). - */ -extern const GHOST_TUns8* GHOST_getUserDir(); - #ifdef __cplusplus } diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h index fd8641f2055..47f142e4c8a 100644 --- a/intern/ghost/GHOST_ISystem.h +++ b/intern/ghost/GHOST_ISystem.h @@ -331,7 +331,7 @@ public: * @param y The y-coordinate of the cursor. * @return Indication of success. */ - virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const = 0; + virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) = 0; /*************************************************************************************** ** Access to mouse button and keyboard states. @@ -370,12 +370,7 @@ public: */ virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0; - - /*************************************************************************************** - ** Determine special paths. - ***************************************************************************************/ - - /** + /** * Determine the base dir in which shared resources are located. It will first try to use * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). @@ -389,6 +384,11 @@ public: */ virtual const GHOST_TUns8* getUserDir() const = 0; + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8* getBinaryDir() const = 0; protected: /** * Initialize the system. diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h index a024b2b51e5..83757b17e8b 100644 --- a/intern/ghost/GHOST_IWindow.h +++ b/intern/ghost/GHOST_IWindow.h @@ -234,6 +234,21 @@ public: */ virtual const GHOST_TabletData* GetTabletData() = 0; + /*************************************************************************************** + ** Progress bar functionality + ***************************************************************************************/ + + /** + * Sets the progress bar value displayed in the window/application icon + * @param progress The progress % + */ + virtual GHOST_TSuccess setProgressBar(float progress) = 0; + + /** + * Hides the progress bar in the icon + */ + virtual GHOST_TSuccess endProgressBar() = 0; + /*************************************************************************************** ** Cursor management functionality ***************************************************************************************/ diff --git a/source/blender/imbuf/intern/IMB_bitplanes.h b/intern/ghost/GHOST_Path-api.h similarity index 50% rename from source/blender/imbuf/intern/IMB_bitplanes.h rename to intern/ghost/GHOST_Path-api.h index c8deb6f9a02..c38a4e2de88 100644 --- a/source/blender/imbuf/intern/IMB_bitplanes.h +++ b/intern/ghost/GHOST_Path-api.h @@ -1,6 +1,4 @@ -/* - * IMB_bitplanes.h - * +/** * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -19,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * The Original Code is Copyright (C) 2010 by Blender Foundation. * All rights reserved. * * The Original Code is: all of this file. @@ -28,20 +26,38 @@ * * ***** END GPL LICENSE BLOCK ***** */ -/** - * \file IMB_bitplanes.h - * \ingroup imbuf - * \brief Function declarations for bitplanes.c - */ -#ifndef IMB_BITPLANES_H -#define IMB_BITPLANES_H +#ifndef GHOST_PATH_API_H +#define GHOST_PATH_API_H -struct ImBuf; - -void imb_bptolong(struct ImBuf *ibuf); -void imb_longtobp(struct ImBuf *ibuf); -unsigned int **imb_copyplanelist(struct ImBuf *ibuf); +#include "GHOST_Types.h" +#ifdef __cplusplus +extern "C" { #endif +/** + * Determine the base dir in which shared resources are located. It will first try to use + * "unpack and run" path, then look for properly installed path, not including versioning. + * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). + */ +extern const GHOST_TUns8* GHOST_getSystemDir(); + +/** + * Determine the base dir in which user configuration is stored, not including versioning. + * @return Unsigned char string pointing to user dir (eg ~). + */ +extern const GHOST_TUns8* GHOST_getUserDir(); + + +/** + * Determine the dir in which the binary file is found. + * @return Unsigned char string pointing to binary dir (eg ~/usr/local/bin/). + */ +extern const GHOST_TUns8* GHOST_getBinaryDir(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript index 1269c631190..65c00b16373 100644 --- a/intern/ghost/SConscript +++ b/intern/ghost/SConscript @@ -56,9 +56,8 @@ else: if env['BF_GHOST_DEBUG']: defs.append('BF_GHOST_DEBUG') - + incs = '. ../string #extern/glew/include #source/blender/imbuf #source/blender/makesdna ' + env['BF_OPENGL_INC'] if window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'): incs = env['BF_WINTAB_INC'] + ' ' + incs env.BlenderLib ('bf_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15] ) - diff --git a/intern/ghost/intern/GHOST_Buttons.cpp b/intern/ghost/intern/GHOST_Buttons.cpp index 01f65103766..edccb24d5a1 100644 --- a/intern/ghost/intern/GHOST_Buttons.cpp +++ b/intern/ghost/intern/GHOST_Buttons.cpp @@ -28,10 +28,6 @@ #include "GHOST_Buttons.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GHOST_Buttons::GHOST_Buttons() diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index 51305e82064..839d85c9617 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -37,10 +37,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "intern/GHOST_Debug.h" #include "GHOST_C-api.h" #include "GHOST_ISystem.h" @@ -252,6 +248,21 @@ GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, GHOST_Eve return system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle); } +GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle,float progress) +{ + GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + + return window->setProgressBar(progress); +} + +GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle) +{ + GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + + return window->endProgressBar(); +} + + int GHOST_OpenNDOF(GHOST_SystemHandle systemhandle, GHOST_WindowHandle windowhandle, GHOST_NDOFLibraryInit_fp setNdofLibraryInit, GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown, @@ -854,15 +865,3 @@ void GHOST_putClipboard(GHOST_TInt8 *buffer, int selection) GHOST_ISystem* system = GHOST_ISystem::getSystem(); system->putClipboard(buffer, selection); } - -const GHOST_TUns8* GHOST_getSystemDir() -{ - GHOST_ISystem* system = GHOST_ISystem::getSystem(); - return system->getSystemDir(); -} - -const GHOST_TUns8* GHOST_getUserDir() -{ - GHOST_ISystem* system = GHOST_ISystem::getSystem(); - return system->getUserDir(); -} diff --git a/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp b/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp index af3534fcc38..7f5ed859de1 100644 --- a/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp +++ b/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp @@ -34,10 +34,6 @@ * @date October 25, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_Debug.h" #include "GHOST_C-api.h" #include "GHOST_CallbackEventConsumer.h" diff --git a/intern/ghost/intern/GHOST_DisplayManager.cpp b/intern/ghost/intern/GHOST_DisplayManager.cpp index c65914ef1ac..eaa00732725 100644 --- a/intern/ghost/intern/GHOST_DisplayManager.cpp +++ b/intern/ghost/intern/GHOST_DisplayManager.cpp @@ -32,10 +32,6 @@ * @date September 21, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_DisplayManager.h" #include "GHOST_Debug.h" diff --git a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp index 76291a2ea4c..2c92ef0e2fa 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp @@ -34,10 +34,6 @@ * @date September 21, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_DisplayManagerCarbon.h" #include "GHOST_Debug.h" diff --git a/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp b/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp index 7c9a905ff43..29d15d3e4de 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp @@ -34,10 +34,6 @@ * @date September 21, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_DisplayManagerWin32.h" #include "GHOST_Debug.h" diff --git a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp index 0c0a0daebc7..fad3149e48c 100644 --- a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp +++ b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_DisplayManagerX11.h" #include "GHOST_SystemX11.h" diff --git a/intern/ghost/intern/GHOST_DropTargetWin32.cpp b/intern/ghost/intern/GHOST_DropTargetWin32.cpp index c2185ae9b23..6470b406492 100644 --- a/intern/ghost/intern/GHOST_DropTargetWin32.cpp +++ b/intern/ghost/intern/GHOST_DropTargetWin32.cpp @@ -110,8 +110,8 @@ ULONG __stdcall GHOST_DropTargetWin32::Release(void) */ HRESULT __stdcall GHOST_DropTargetWin32::DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect) { - // we don't know yet if we accept the drop. - m_window->setAcceptDragOperation(false); + // we accept all drop by default + m_window->setAcceptDragOperation(true); *pdwEffect = DROPEFFECT_NONE; m_draggedObjectType = getGhostType(pDataObject); diff --git a/intern/ghost/intern/GHOST_EventManager.cpp b/intern/ghost/intern/GHOST_EventManager.cpp index d9cdfe6faa2..0eeb2245cd0 100644 --- a/intern/ghost/intern/GHOST_EventManager.cpp +++ b/intern/ghost/intern/GHOST_EventManager.cpp @@ -38,10 +38,6 @@ #include #include "GHOST_Debug.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GHOST_EventManager::GHOST_EventManager() { diff --git a/intern/ghost/intern/GHOST_EventPrinter.cpp b/intern/ghost/intern/GHOST_EventPrinter.cpp index 9bb1532c947..645a33ab8c5 100644 --- a/intern/ghost/intern/GHOST_EventPrinter.cpp +++ b/intern/ghost/intern/GHOST_EventPrinter.cpp @@ -36,10 +36,6 @@ #include "GHOST_EventDragnDrop.h" #include "GHOST_Debug.h" -#ifdef HAVE_CONFIG_H -#include -#endif - bool GHOST_EventPrinter::processEvent(GHOST_IEvent* event) { diff --git a/intern/ghost/intern/GHOST_ISystem.cpp b/intern/ghost/intern/GHOST_ISystem.cpp index 1a8bf3d3e84..eecf3c51c19 100644 --- a/intern/ghost/intern/GHOST_ISystem.cpp +++ b/intern/ghost/intern/GHOST_ISystem.cpp @@ -34,10 +34,6 @@ * @date May 7, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_ISystem.h" #ifdef WIN32 diff --git a/intern/ghost/intern/GHOST_ModifierKeys.cpp b/intern/ghost/intern/GHOST_ModifierKeys.cpp index 75bd22cada1..ed884966cb3 100644 --- a/intern/ghost/intern/GHOST_ModifierKeys.cpp +++ b/intern/ghost/intern/GHOST_ModifierKeys.cpp @@ -34,10 +34,6 @@ * @date May 31, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_ModifierKeys.h" diff --git a/source/blender/imbuf/intern/IMB_amiga.h b/intern/ghost/intern/GHOST_Path-api.cpp similarity index 58% rename from source/blender/imbuf/intern/IMB_amiga.h rename to intern/ghost/intern/GHOST_Path-api.cpp index e8d908df4c3..b2b7c68e998 100644 --- a/source/blender/imbuf/intern/IMB_amiga.h +++ b/intern/ghost/intern/GHOST_Path-api.cpp @@ -1,6 +1,4 @@ /** - * IMB_amiga.h - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -19,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * The Original Code is Copyright (C) 2010 by Blender Foundation. * All rights reserved. * * The Original Code is: all of this file. @@ -28,20 +26,25 @@ * * ***** END GPL LICENSE BLOCK ***** */ -/** - * \file IMB_amiga.h - * \ingroup imbuf - * \brief Function declarations for amiga.c - */ -#ifndef IMB_AMIGA_H -#define IMB_AMIGA_H +#include "intern/GHOST_Debug.h" +#include "GHOST_Path-api.h" +#include "GHOST_ISystem.h" -struct ImBuf; +const GHOST_TUns8* GHOST_getSystemDir() +{ + GHOST_ISystem* system = GHOST_ISystem::getSystem(); + return system ? system->getSystemDir() : NULL; +} -struct ImBuf *imb_loadamiga(int *iffmem,int flags); -short imb_encodebodyh(struct ImBuf *ibuf, int file); -short imb_encodebodyv(struct ImBuf *ibuf, int file); - -#endif +const GHOST_TUns8* GHOST_getUserDir() +{ + GHOST_ISystem* system = GHOST_ISystem::getSystem(); + return system ? system->getUserDir() : NULL; /* will be NULL in background mode */ +} +const GHOST_TUns8* GHOST_getBinaryDir() +{ + GHOST_ISystem* system = GHOST_ISystem::getSystem(); + return system ? system->getBinaryDir() : NULL; /* will be NULL in background mode */ +} diff --git a/intern/ghost/intern/GHOST_Rect.cpp b/intern/ghost/intern/GHOST_Rect.cpp index bb42d89425d..aa6491cf5e5 100644 --- a/intern/ghost/intern/GHOST_Rect.cpp +++ b/intern/ghost/intern/GHOST_Rect.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_Rect.h" diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp index dc7d1ddfb91..c89534e01c5 100644 --- a/intern/ghost/intern/GHOST_System.cpp +++ b/intern/ghost/intern/GHOST_System.cpp @@ -34,10 +34,6 @@ * @date May 7, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_System.h" #include diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h index d6c6a356323..a18670738fe 100644 --- a/intern/ghost/intern/GHOST_System.h +++ b/intern/ghost/intern/GHOST_System.h @@ -297,7 +297,7 @@ public: */ virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0; - /** + /** * Determine the base dir in which shared resources are located. It will first try to use * "unpack and run" path, then look for properly installed path, not including versioning. * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). @@ -311,6 +311,11 @@ public: */ virtual const GHOST_TUns8* getUserDir() const = 0; + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8* getBinaryDir() const = 0; protected: /** * Initialize the system. diff --git a/intern/ghost/intern/GHOST_SystemCarbon.cpp b/intern/ghost/intern/GHOST_SystemCarbon.cpp index 36ea1c7fe85..ecdc03b4347 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.cpp +++ b/intern/ghost/intern/GHOST_SystemCarbon.cpp @@ -531,7 +531,7 @@ GHOST_TSuccess GHOST_SystemCarbon::getCursorPosition(GHOST_TInt32& x, GHOST_TInt } -GHOST_TSuccess GHOST_SystemCarbon::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const +GHOST_TSuccess GHOST_SystemCarbon::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { float xf=(float)x, yf=(float)y; @@ -1215,9 +1215,10 @@ void GHOST_SystemCarbon::putClipboard(GHOST_TInt8 *buffer, bool selection) const } } + const GHOST_TUns8* GHOST_SystemCarbon::getSystemDir() const { - return (GHOST_TUns8*)"/Library/Application Support/Blender"; + return (GHOST_TUns8*)"/Library/Application Support"; } const GHOST_TUns8* GHOST_SystemCarbon::getUserDir() const @@ -1228,9 +1229,24 @@ const GHOST_TUns8* GHOST_SystemCarbon::getUserDir() const if (env) { strncpy(usrPath, env, 245); usrPath[245]=0; - strcat(usrPath, "/Library/Application Support/Blender"); + strcat(usrPath, "/Library/Application Support"); return (GHOST_TUns8*) usrPath; } else return NULL; } + +const GHOST_TUns8* GHOST_SystemCarbon::getBinaryDir() const +{ + CFURLRef bundleURL; + CFStringRef pathStr; + static char path[256]; + CFBundleRef mainBundle = CFBundleGetMainBundle(); + + bundleURL = CFBundleCopyBundleURL(mainBundle); + pathStr = CFURLCopyFileSystemPath(bundleURL, kCFURLPOSIXPathStyle); + CFStringGetCString(pathStr, path, 255, kCFStringEncodingASCII); + CFRelease(pathStr); + CFRelease(bundleURL); + return (GHOST_TUns8*)path; +} diff --git a/intern/ghost/intern/GHOST_SystemCarbon.h b/intern/ghost/intern/GHOST_SystemCarbon.h index 7f0870674b4..723652dc872 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.h +++ b/intern/ghost/intern/GHOST_SystemCarbon.h @@ -156,7 +156,7 @@ public: * @param y The y-coordinate of the cursor. * @return Indication of success. */ - virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const; + virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y); /*************************************************************************************** ** Access to mouse button and keyboard states. @@ -190,6 +190,7 @@ public: */ virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const; + /** * Determine the base dir in which shared resources are located. It will first try to use * "unpack and run" path, then look for properly installed path, not including versioning. @@ -204,6 +205,12 @@ public: */ virtual const GHOST_TUns8* getUserDir() const; + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8* getBinaryDir() const; + protected: /** * Initializes the system. diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h b/intern/ghost/intern/GHOST_SystemCocoa.h index 55d317cea1f..56b4ceeedf7 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.h +++ b/intern/ghost/intern/GHOST_SystemCocoa.h @@ -179,8 +179,8 @@ public: * @param y The y-coordinate of the cursor. * @return Indication of success. */ - virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const; - + virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y); + /*************************************************************************************** ** Access to mouse button and keyboard states. ***************************************************************************************/ @@ -227,6 +227,12 @@ public: */ virtual const GHOST_TUns8* getUserDir() const; + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8* getBinaryDir() const; + /** * Handles a window event. Called by GHOST_WindowCocoa window delegate * @param eventType The type of window event @@ -272,6 +278,14 @@ protected: */ GHOST_TSuccess handleKeyEvent(void *eventPtr); + /** + * Performs the actual cursor position update (location in screen coordinates). + * @param x The x-coordinate of the cursor. + * @param y The y-coordinate of the cursor. + * @return Indication of success. + */ + GHOST_TSuccess setMouseCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y); + /** Start time at initialization. */ GHOST_TUns64 m_start_time; diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index a5ee257bcd4..a3089a76ece 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -15,6 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +<<<<<<< .working * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. @@ -41,9 +42,41 @@ #include "GHOST_EventCursor.h" #include "GHOST_EventWheel.h" #include "GHOST_EventNDOF.h" +======= + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Maarten Gribnau 05/2001 + * Damien Plisson 09/2009 + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#import + +/*For the currently not ported to Cocoa keyboard layout functions (64bit & 10.6 compatible)*/ +#include + +#include +#include +#include + +#include "GHOST_SystemCocoa.h" + +#include "GHOST_DisplayManagerCocoa.h" +#include "GHOST_EventKey.h" +#include "GHOST_EventButton.h" +#include "GHOST_EventCursor.h" +#include "GHOST_EventWheel.h" +#include "GHOST_EventNDOF.h" +>>>>>>> .merge-right.r30358 #include "GHOST_EventTrackpad.h" #include "GHOST_EventDragnDrop.h" #include "GHOST_EventString.h" +<<<<<<< .working #include "GHOST_TimerManager.h" #include "GHOST_TimerTask.h" @@ -376,6 +409,381 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar) } +======= + +#include "GHOST_TimerManager.h" +#include "GHOST_TimerTask.h" +#include "GHOST_WindowManager.h" +#include "GHOST_WindowCocoa.h" +#include "GHOST_NDOFManager.h" +#include "AssertMacros.h" + +#pragma mark KeyMap, mouse converters +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 +/* Keycodes not defined in Tiger */ +/* + * Summary: + * Virtual keycodes + * + * Discussion: + * These constants are the virtual keycodes defined originally in + * Inside Mac Volume V, pg. V-191. They identify physical keys on a + * keyboard. Those constants with "ANSI" in the name are labeled + * according to the key position on an ANSI-standard US keyboard. + * For example, kVK_ANSI_A indicates the virtual keycode for the key + * with the letter 'A' in the US keyboard layout. Other keyboard + * layouts may have the 'A' key label on a different physical key; + * in this case, pressing 'A' will generate a different virtual + * keycode. + */ +enum { + kVK_ANSI_A = 0x00, + kVK_ANSI_S = 0x01, + kVK_ANSI_D = 0x02, + kVK_ANSI_F = 0x03, + kVK_ANSI_H = 0x04, + kVK_ANSI_G = 0x05, + kVK_ANSI_Z = 0x06, + kVK_ANSI_X = 0x07, + kVK_ANSI_C = 0x08, + kVK_ANSI_V = 0x09, + kVK_ANSI_B = 0x0B, + kVK_ANSI_Q = 0x0C, + kVK_ANSI_W = 0x0D, + kVK_ANSI_E = 0x0E, + kVK_ANSI_R = 0x0F, + kVK_ANSI_Y = 0x10, + kVK_ANSI_T = 0x11, + kVK_ANSI_1 = 0x12, + kVK_ANSI_2 = 0x13, + kVK_ANSI_3 = 0x14, + kVK_ANSI_4 = 0x15, + kVK_ANSI_6 = 0x16, + kVK_ANSI_5 = 0x17, + kVK_ANSI_Equal = 0x18, + kVK_ANSI_9 = 0x19, + kVK_ANSI_7 = 0x1A, + kVK_ANSI_Minus = 0x1B, + kVK_ANSI_8 = 0x1C, + kVK_ANSI_0 = 0x1D, + kVK_ANSI_RightBracket = 0x1E, + kVK_ANSI_O = 0x1F, + kVK_ANSI_U = 0x20, + kVK_ANSI_LeftBracket = 0x21, + kVK_ANSI_I = 0x22, + kVK_ANSI_P = 0x23, + kVK_ANSI_L = 0x25, + kVK_ANSI_J = 0x26, + kVK_ANSI_Quote = 0x27, + kVK_ANSI_K = 0x28, + kVK_ANSI_Semicolon = 0x29, + kVK_ANSI_Backslash = 0x2A, + kVK_ANSI_Comma = 0x2B, + kVK_ANSI_Slash = 0x2C, + kVK_ANSI_N = 0x2D, + kVK_ANSI_M = 0x2E, + kVK_ANSI_Period = 0x2F, + kVK_ANSI_Grave = 0x32, + kVK_ANSI_KeypadDecimal = 0x41, + kVK_ANSI_KeypadMultiply = 0x43, + kVK_ANSI_KeypadPlus = 0x45, + kVK_ANSI_KeypadClear = 0x47, + kVK_ANSI_KeypadDivide = 0x4B, + kVK_ANSI_KeypadEnter = 0x4C, + kVK_ANSI_KeypadMinus = 0x4E, + kVK_ANSI_KeypadEquals = 0x51, + kVK_ANSI_Keypad0 = 0x52, + kVK_ANSI_Keypad1 = 0x53, + kVK_ANSI_Keypad2 = 0x54, + kVK_ANSI_Keypad3 = 0x55, + kVK_ANSI_Keypad4 = 0x56, + kVK_ANSI_Keypad5 = 0x57, + kVK_ANSI_Keypad6 = 0x58, + kVK_ANSI_Keypad7 = 0x59, + kVK_ANSI_Keypad8 = 0x5B, + kVK_ANSI_Keypad9 = 0x5C +}; + +/* keycodes for keys that are independent of keyboard layout*/ +enum { + kVK_Return = 0x24, + kVK_Tab = 0x30, + kVK_Space = 0x31, + kVK_Delete = 0x33, + kVK_Escape = 0x35, + kVK_Command = 0x37, + kVK_Shift = 0x38, + kVK_CapsLock = 0x39, + kVK_Option = 0x3A, + kVK_Control = 0x3B, + kVK_RightShift = 0x3C, + kVK_RightOption = 0x3D, + kVK_RightControl = 0x3E, + kVK_Function = 0x3F, + kVK_F17 = 0x40, + kVK_VolumeUp = 0x48, + kVK_VolumeDown = 0x49, + kVK_Mute = 0x4A, + kVK_F18 = 0x4F, + kVK_F19 = 0x50, + kVK_F20 = 0x5A, + kVK_F5 = 0x60, + kVK_F6 = 0x61, + kVK_F7 = 0x62, + kVK_F3 = 0x63, + kVK_F8 = 0x64, + kVK_F9 = 0x65, + kVK_F11 = 0x67, + kVK_F13 = 0x69, + kVK_F16 = 0x6A, + kVK_F14 = 0x6B, + kVK_F10 = 0x6D, + kVK_F12 = 0x6F, + kVK_F15 = 0x71, + kVK_Help = 0x72, + kVK_Home = 0x73, + kVK_PageUp = 0x74, + kVK_ForwardDelete = 0x75, + kVK_F4 = 0x76, + kVK_End = 0x77, + kVK_F2 = 0x78, + kVK_PageDown = 0x79, + kVK_F1 = 0x7A, + kVK_LeftArrow = 0x7B, + kVK_RightArrow = 0x7C, + kVK_DownArrow = 0x7D, + kVK_UpArrow = 0x7E +}; + +/* ISO keyboards only*/ +enum { + kVK_ISO_Section = 0x0A +}; + +/* JIS keyboards only*/ +enum { + kVK_JIS_Yen = 0x5D, + kVK_JIS_Underscore = 0x5E, + kVK_JIS_KeypadComma = 0x5F, + kVK_JIS_Eisu = 0x66, + kVK_JIS_Kana = 0x68 +}; +#endif + +static GHOST_TButtonMask convertButton(int button) +{ + switch (button) { + case 0: + return GHOST_kButtonMaskLeft; + case 1: + return GHOST_kButtonMaskRight; + case 2: + return GHOST_kButtonMaskMiddle; + case 3: + return GHOST_kButtonMaskButton4; + case 4: + return GHOST_kButtonMaskButton5; + default: + return GHOST_kButtonMaskLeft; + } +} + +/** + * Converts Mac rawkey codes (same for Cocoa & Carbon) + * into GHOST key codes + * @param rawCode The raw physical key code + * @param recvChar the character ignoring modifiers (except for shift) + * @return Ghost key code + */ +static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction) +{ + + //printf("\nrecvchar %c 0x%x",recvChar,recvChar); + switch (rawCode) { + /*Physical keycodes not used due to map changes in int'l keyboards + case kVK_ANSI_A: return GHOST_kKeyA; + case kVK_ANSI_B: return GHOST_kKeyB; + case kVK_ANSI_C: return GHOST_kKeyC; + case kVK_ANSI_D: return GHOST_kKeyD; + case kVK_ANSI_E: return GHOST_kKeyE; + case kVK_ANSI_F: return GHOST_kKeyF; + case kVK_ANSI_G: return GHOST_kKeyG; + case kVK_ANSI_H: return GHOST_kKeyH; + case kVK_ANSI_I: return GHOST_kKeyI; + case kVK_ANSI_J: return GHOST_kKeyJ; + case kVK_ANSI_K: return GHOST_kKeyK; + case kVK_ANSI_L: return GHOST_kKeyL; + case kVK_ANSI_M: return GHOST_kKeyM; + case kVK_ANSI_N: return GHOST_kKeyN; + case kVK_ANSI_O: return GHOST_kKeyO; + case kVK_ANSI_P: return GHOST_kKeyP; + case kVK_ANSI_Q: return GHOST_kKeyQ; + case kVK_ANSI_R: return GHOST_kKeyR; + case kVK_ANSI_S: return GHOST_kKeyS; + case kVK_ANSI_T: return GHOST_kKeyT; + case kVK_ANSI_U: return GHOST_kKeyU; + case kVK_ANSI_V: return GHOST_kKeyV; + case kVK_ANSI_W: return GHOST_kKeyW; + case kVK_ANSI_X: return GHOST_kKeyX; + case kVK_ANSI_Y: return GHOST_kKeyY; + case kVK_ANSI_Z: return GHOST_kKeyZ;*/ + + /* Numbers keys mapped to handle some int'l keyboard (e.g. French)*/ + case kVK_ISO_Section: return GHOST_kKeyUnknown; + case kVK_ANSI_1: return GHOST_kKey1; + case kVK_ANSI_2: return GHOST_kKey2; + case kVK_ANSI_3: return GHOST_kKey3; + case kVK_ANSI_4: return GHOST_kKey4; + case kVK_ANSI_5: return GHOST_kKey5; + case kVK_ANSI_6: return GHOST_kKey6; + case kVK_ANSI_7: return GHOST_kKey7; + case kVK_ANSI_8: return GHOST_kKey8; + case kVK_ANSI_9: return GHOST_kKey9; + case kVK_ANSI_0: return GHOST_kKey0; + + case kVK_ANSI_Keypad0: return GHOST_kKeyNumpad0; + case kVK_ANSI_Keypad1: return GHOST_kKeyNumpad1; + case kVK_ANSI_Keypad2: return GHOST_kKeyNumpad2; + case kVK_ANSI_Keypad3: return GHOST_kKeyNumpad3; + case kVK_ANSI_Keypad4: return GHOST_kKeyNumpad4; + case kVK_ANSI_Keypad5: return GHOST_kKeyNumpad5; + case kVK_ANSI_Keypad6: return GHOST_kKeyNumpad6; + case kVK_ANSI_Keypad7: return GHOST_kKeyNumpad7; + case kVK_ANSI_Keypad8: return GHOST_kKeyNumpad8; + case kVK_ANSI_Keypad9: return GHOST_kKeyNumpad9; + case kVK_ANSI_KeypadDecimal: return GHOST_kKeyNumpadPeriod; + case kVK_ANSI_KeypadEnter: return GHOST_kKeyNumpadEnter; + case kVK_ANSI_KeypadPlus: return GHOST_kKeyNumpadPlus; + case kVK_ANSI_KeypadMinus: return GHOST_kKeyNumpadMinus; + case kVK_ANSI_KeypadMultiply: return GHOST_kKeyNumpadAsterisk; + case kVK_ANSI_KeypadDivide: return GHOST_kKeyNumpadSlash; + case kVK_ANSI_KeypadClear: return GHOST_kKeyUnknown; + + case kVK_F1: return GHOST_kKeyF1; + case kVK_F2: return GHOST_kKeyF2; + case kVK_F3: return GHOST_kKeyF3; + case kVK_F4: return GHOST_kKeyF4; + case kVK_F5: return GHOST_kKeyF5; + case kVK_F6: return GHOST_kKeyF6; + case kVK_F7: return GHOST_kKeyF7; + case kVK_F8: return GHOST_kKeyF8; + case kVK_F9: return GHOST_kKeyF9; + case kVK_F10: return GHOST_kKeyF10; + case kVK_F11: return GHOST_kKeyF11; + case kVK_F12: return GHOST_kKeyF12; + case kVK_F13: return GHOST_kKeyF13; + case kVK_F14: return GHOST_kKeyF14; + case kVK_F15: return GHOST_kKeyF15; + case kVK_F16: return GHOST_kKeyF16; + case kVK_F17: return GHOST_kKeyF17; + case kVK_F18: return GHOST_kKeyF18; + case kVK_F19: return GHOST_kKeyF19; + case kVK_F20: return GHOST_kKeyF20; + + case kVK_UpArrow: return GHOST_kKeyUpArrow; + case kVK_DownArrow: return GHOST_kKeyDownArrow; + case kVK_LeftArrow: return GHOST_kKeyLeftArrow; + case kVK_RightArrow: return GHOST_kKeyRightArrow; + + case kVK_Return: return GHOST_kKeyEnter; + case kVK_Delete: return GHOST_kKeyBackSpace; + case kVK_ForwardDelete: return GHOST_kKeyDelete; + case kVK_Escape: return GHOST_kKeyEsc; + case kVK_Tab: return GHOST_kKeyTab; + case kVK_Space: return GHOST_kKeySpace; + + case kVK_Home: return GHOST_kKeyHome; + case kVK_End: return GHOST_kKeyEnd; + case kVK_PageUp: return GHOST_kKeyUpPage; + case kVK_PageDown: return GHOST_kKeyDownPage; + + /*case kVK_ANSI_Minus: return GHOST_kKeyMinus; + case kVK_ANSI_Equal: return GHOST_kKeyEqual; + case kVK_ANSI_Comma: return GHOST_kKeyComma; + case kVK_ANSI_Period: return GHOST_kKeyPeriod; + case kVK_ANSI_Slash: return GHOST_kKeySlash; + case kVK_ANSI_Semicolon: return GHOST_kKeySemicolon; + case kVK_ANSI_Quote: return GHOST_kKeyQuote; + case kVK_ANSI_Backslash: return GHOST_kKeyBackslash; + case kVK_ANSI_LeftBracket: return GHOST_kKeyLeftBracket; + case kVK_ANSI_RightBracket: return GHOST_kKeyRightBracket; + case kVK_ANSI_Grave: return GHOST_kKeyAccentGrave;*/ + + case kVK_VolumeUp: + case kVK_VolumeDown: + case kVK_Mute: + return GHOST_kKeyUnknown; + + default: + /* alphanumerical or punctuation key that is remappable in int'l keyboards */ + if ((recvChar >= 'A') && (recvChar <= 'Z')) { + return (GHOST_TKey) (recvChar - 'A' + GHOST_kKeyA); + } else if ((recvChar >= 'a') && (recvChar <= 'z')) { + return (GHOST_TKey) (recvChar - 'a' + GHOST_kKeyA); + } else { +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 + KeyboardLayoutRef keyLayout; + UCKeyboardLayout *uchrData; + + KLGetCurrentKeyboardLayout(&keyLayout); + KLGetKeyboardLayoutProperty(keyLayout, kKLuchrData, (const void **) + &uchrData); + /*get actual character value of the "remappable" keys in int'l keyboards, + if keyboard layout is not correctly reported (e.g. some non Apple keyboards in Tiger), + then fallback on using the received charactersIgnoringModifiers */ + if (uchrData) + { + UInt32 deadKeyState=0; + UniCharCount actualStrLength=0; + + UCKeyTranslate(uchrData, rawCode, keyAction, 0, + LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, 1, &actualStrLength, &recvChar); + + } +#else + /* Leopard and Snow Leopard 64bit compatible API*/ + CFDataRef uchrHandle; /*the keyboard layout*/ + TISInputSourceRef kbdTISHandle; + + kbdTISHandle = TISCopyCurrentKeyboardLayoutInputSource(); + uchrHandle = (CFDataRef)TISGetInputSourceProperty(kbdTISHandle,kTISPropertyUnicodeKeyLayoutData); + CFRelease(kbdTISHandle); + + /*get actual character value of the "remappable" keys in int'l keyboards, + if keyboard layout is not correctly reported (e.g. some non Apple keyboards in Tiger), + then fallback on using the received charactersIgnoringModifiers */ + if (uchrHandle) + { + UInt32 deadKeyState=0; + UniCharCount actualStrLength=0; + + UCKeyTranslate((UCKeyboardLayout*)CFDataGetBytePtr(uchrHandle), rawCode, keyAction, 0, + LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, 1, &actualStrLength, &recvChar); + + } +#endif + switch (recvChar) { + case '-': return GHOST_kKeyMinus; + case '=': return GHOST_kKeyEqual; + case ',': return GHOST_kKeyComma; + case '.': return GHOST_kKeyPeriod; + case '/': return GHOST_kKeySlash; + case ';': return GHOST_kKeySemicolon; + case '\'': return GHOST_kKeyQuote; + case '\\': return GHOST_kKeyBackslash; + case '[': return GHOST_kKeyLeftBracket; + case ']': return GHOST_kKeyRightBracket; + case '`': return GHOST_kKeyAccentGrave; + default: + return GHOST_kKeyUnknown; + } + } + } + return GHOST_kKeyUnknown; +} + + +>>>>>>> .merge-right.r30358 #pragma mark defines for 10.6 api not documented in 10.5 #ifndef MAC_OS_X_VERSION_10_6 enum { @@ -702,6 +1110,7 @@ GHOST_IWindow* GHOST_SystemCocoa::createWindow( top = top > contentRect.origin.y ? top : contentRect.origin.y; window = new GHOST_WindowCocoa (this, title, left, top, width, height, state, type, stereoVisual, numOfAASamples); +<<<<<<< .working if (window) { if (window->getValid()) { @@ -745,6 +1154,53 @@ GHOST_TSuccess GHOST_SystemCocoa::endFullScreen(void) +======= + + if (window) { + if (window->getValid()) { + // Store the pointer to the window + GHOST_ASSERT(m_windowManager, "m_windowManager not initialized"); + m_windowManager->addWindow(window); + m_windowManager->setActiveWindow(window); + //Need to tell window manager the new window is the active one (Cocoa does not send the event activate upon window creation) + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window)); + pushEvent(new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window)); + + } + else { + GHOST_PRINT("GHOST_SystemCocoa::createWindow(): window invalid\n"); + delete window; + window = 0; + } + } + else { + GHOST_PRINT("GHOST_SystemCocoa::createWindow(): could not create window\n"); + } + [pool drain]; + return window; +} + +GHOST_TSuccess GHOST_SystemCocoa::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, const bool stereoVisual) +{ + GHOST_IWindow* currentWindow = m_windowManager->getActiveWindow(); + *window = currentWindow; + + if(!currentWindow) return GHOST_kFailure; + + return currentWindow->setState(GHOST_kWindowStateFullScreen); +} + +GHOST_TSuccess GHOST_SystemCocoa::endFullScreen(void) +{ + GHOST_IWindow* currentWindow = m_windowManager->getActiveWindow(); + if(!currentWindow) return GHOST_kFailure; + + return currentWindow->setState(GHOST_kWindowStateNormal); +} + + + +>>>>>>> .merge-right.r30358 /** * @note : returns coordinates in Cocoa screen coordinates */ @@ -761,10 +1217,39 @@ GHOST_TSuccess GHOST_SystemCocoa::getCursorPosition(GHOST_TInt32& x, GHOST_TInt3 /** * @note : expect Cocoa screen coordinates */ +<<<<<<< .working GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const { float xf=(float)x, yf=(float)y; +======= +GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) +{ + GHOST_TInt32 wx,wy; GHOST_WindowCocoa* window = (GHOST_WindowCocoa*)m_windowManager->getActiveWindow(); + if (!window) return GHOST_kFailure; + + //Cursor and mouse dissociation placed here not to interfere with continuous grab + // (in cont. grab setMouseCursorPosition is directly called) + CGAssociateMouseAndMouseCursorPosition(false); + setMouseCursorPosition(x, y); + CGAssociateMouseAndMouseCursorPosition(true); + + //Force mouse move event (not pushed by Cocoa) + window->screenToClient(x, y, wx, wy); + pushEvent(new GHOST_EventCursor(getMilliSeconds(), GHOST_kEventCursorMove, window, wx,wy)); + m_outsideLoopEventProcessed = true; + + return GHOST_kSuccess; +} + +GHOST_TSuccess GHOST_SystemCocoa::setMouseCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) +{ + float xf=(float)x, yf=(float)y; +>>>>>>> .merge-right.r30358 + GHOST_WindowCocoa* window = (GHOST_WindowCocoa*)m_windowManager->getActiveWindow(); + if (!window) return GHOST_kFailure; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSScreen *windowScreen = window->getScreen(); NSRect screenRect = [windowScreen frame]; @@ -777,12 +1262,22 @@ GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 CGDisplayMoveCursorToPoint((CGDirectDisplayID)[[[windowScreen deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue], CGPointMake(xf, yf)); +<<<<<<< .working return GHOST_kSuccess; } GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys& keys) const { +======= + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys& keys) const +{ +>>>>>>> .merge-right.r30358 keys.set(GHOST_kModifierKeyCommand, (m_modifierMask & NSCommandKeyMask) ? true : false); keys.set(GHOST_kModifierKeyLeftAlt, (m_modifierMask & NSAlternateKeyMask) ? true : false); keys.set(GHOST_kModifierKeyLeftShift, (m_modifierMask & NSShiftKeyMask) ? true : false); @@ -1040,7 +1535,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType { droppedStr = [droppedArray objectAtIndex:i]; - pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding]; + pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); if (!temp_buff) { @@ -1048,7 +1543,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType break; } - strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSISOLatin1StringEncoding], pastedTextSize); + strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSUTF8StringEncoding], pastedTextSize); temp_buff[pastedTextSize] = '\0'; strArray->strings[i] = temp_buff; @@ -1059,7 +1554,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType case GHOST_kDragnDropTypeString: droppedStr = (NSString*)data; - pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding]; + pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); @@ -1067,7 +1562,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType return GHOST_kFailure; } - strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSISOLatin1StringEncoding], pastedTextSize); + strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSUTF8StringEncoding], pastedTextSize); temp_buff[pastedTextSize] = '\0'; @@ -1467,7 +1962,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) //Set new cursor position window->clientToScreen(x_mouse, y_mouse, x_cur, y_cur); - setCursorPosition(x_cur, y_cur); /* wrap */ + setMouseCursorPosition(x_cur, y_cur); /* wrap */ //Post event window->getCursorGrabInitPos(x_cur, y_cur); @@ -1573,9 +2068,15 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) charsIgnoringModifiers = [event charactersIgnoringModifiers]; if ([charsIgnoringModifiers length]>0) keyCode = convertKey([event keyCode], - [charsIgnoringModifiers characterAtIndex:0]); + [charsIgnoringModifiers characterAtIndex:0], + [event type] == NSKeyDown?kUCKeyActionDown:kUCKeyActionUp); else +<<<<<<< .working keyCode = convertKey([event keyCode],0); +======= + keyCode = convertKey([event keyCode],0, + [event type] == NSKeyDown?kUCKeyActionDown:kUCKeyActionUp); +>>>>>>> .merge-right.r30358 characters = [event characters]; @@ -1595,14 +2096,28 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) if ([event type] == NSKeyDown) { pushEvent( new GHOST_EventKey([event timestamp]*1000, GHOST_kEventKeyDown, window, keyCode, ascii) ); +<<<<<<< .working //printf("\nKey pressed keyCode=%u ascii=%i %c",keyCode,ascii,ascii); } else { +======= + //printf("\nKey down rawCode=0x%x charsIgnoringModifiers=%c keyCode=%u ascii=%i %c",[event keyCode],[charsIgnoringModifiers length]>0?[charsIgnoringModifiers characterAtIndex:0]:' ',keyCode,ascii,ascii); + } else { +>>>>>>> .merge-right.r30358 pushEvent( new GHOST_EventKey([event timestamp]*1000, GHOST_kEventKeyUp, window, keyCode, ascii) ); +<<<<<<< .working } break; case NSFlagsChanged: modifiers = [event modifierFlags]; +======= + //printf("\nKey up rawCode=0x%x charsIgnoringModifiers=%c keyCode=%u ascii=%i %c",[event keyCode],[charsIgnoringModifiers length]>0?[charsIgnoringModifiers characterAtIndex:0]:' ',keyCode,ascii,ascii); + } + break; + + case NSFlagsChanged: + modifiers = [event modifierFlags]; +>>>>>>> .merge-right.r30358 if ((modifiers & NSShiftKeyMask) != (m_modifierMask & NSShiftKeyMask)) { pushEvent( new GHOST_EventKey([event timestamp]*1000, (modifiers & NSShiftKeyMask)?GHOST_kEventKeyDown:GHOST_kEventKeyUp, window, GHOST_kKeyLeftShift) ); @@ -1718,22 +2233,16 @@ const GHOST_TUns8* GHOST_SystemCocoa::getSystemDir() const { static GHOST_TUns8 tempPath[512] = ""; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSFileManager *fileManager; NSString *basePath; NSArray *paths; paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSLocalDomainMask, YES); if ([paths count] > 0) - basePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Blender"]; - else { //Fall back to standard unix path in case of issue - basePath = @"/usr/share/blender"; - } - - /* Ensure path exists, creates it if needed */ - fileManager = [NSFileManager defaultManager]; - if (![fileManager fileExistsAtPath:basePath isDirectory:NULL]) { - [fileManager createDirectoryAtPath:basePath attributes:nil]; + basePath = [paths objectAtIndex:0]; + else { + [pool drain]; + return NULL; } strcpy((char*)tempPath, [basePath cStringUsingEncoding:NSASCIIStringEncoding]); @@ -1746,22 +2255,35 @@ const GHOST_TUns8* GHOST_SystemCocoa::getUserDir() const { static GHOST_TUns8 tempPath[512] = ""; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSFileManager *fileManager; NSString *basePath; NSArray *paths; paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); if ([paths count] > 0) - basePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Blender"]; - else { //Fall back to HOME in case of issue - basePath = [NSHomeDirectory() stringByAppendingPathComponent:@".blender"]; + basePath = [paths objectAtIndex:0]; + else { + [pool drain]; + return NULL; } + + strcpy((char*)tempPath, [basePath cStringUsingEncoding:NSASCIIStringEncoding]); - /* Ensure path exists, creates it if needed */ - fileManager = [NSFileManager defaultManager]; - if (![fileManager fileExistsAtPath:basePath isDirectory:NULL]) { - [fileManager createDirectoryAtPath:basePath attributes:nil]; + [pool drain]; + return tempPath; +} + +const GHOST_TUns8* GHOST_SystemCocoa::getBinaryDir() const +{ + static GHOST_TUns8 tempPath[512] = ""; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSString *basePath; + + basePath = [[NSBundle mainBundle] bundlePath]; + + if (basePath == nil) { + [pool drain]; + return NULL; } strcpy((char*)tempPath, [basePath cStringUsingEncoding:NSASCIIStringEncoding]); diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index b1c5ee6e6f2..da7a0399f41 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -34,13 +34,17 @@ * @date May 7, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_SystemWin32.h" #include "GHOST_EventDragnDrop.h" +#define WIN32_LEAN_AND_MEAN +#ifdef _WIN32_IE +#undef _WIN32_IE +#endif +#define _WIN32_IE 0x0501 +#include +#include + // win64 doesn't define GWL_USERDATA #ifdef WIN32 #ifndef GWL_USERDATA @@ -273,8 +277,10 @@ GHOST_TSuccess GHOST_SystemWin32::getCursorPosition(GHOST_TInt32& x, GHOST_TInt3 } -GHOST_TSuccess GHOST_SystemWin32::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const +GHOST_TSuccess GHOST_SystemWin32::setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) { + if (!GetActiveWindow()) + return GHOST_kFailure; return ::SetCursorPos(x, y) == TRUE ? GHOST_kSuccess : GHOST_kFailure; } @@ -1097,10 +1103,36 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const const GHOST_TUns8* GHOST_SystemWin32::getSystemDir() const { + static char knownpath[MAX_PATH]; + HRESULT hResult = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath); + + if (hResult == S_OK) + { + return (GHOST_TUns8*)knownpath; + } + return NULL; } const GHOST_TUns8* GHOST_SystemWin32::getUserDir() const { + static char knownpath[MAX_PATH]; + HRESULT hResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath); + + if (hResult == S_OK) + { + return (GHOST_TUns8*)knownpath; + } + + return NULL; +} + +const GHOST_TUns8* GHOST_SystemWin32::getBinaryDir() const +{ + static char fullname[MAX_PATH]; + if(GetModuleFileName(0, fullname, MAX_PATH)) { + return (GHOST_TUns8*)fullname; + } + return NULL; } diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h index 75bb858fb49..888d9c0ab3e 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.h +++ b/intern/ghost/intern/GHOST_SystemWin32.h @@ -153,7 +153,7 @@ public: * @param y The y-coordinate of the cursor. * @return Indication of success. */ - virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y) const; + virtual GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y); /*************************************************************************************** ** Access to mouse button and keyboard states. @@ -186,22 +186,27 @@ public: * @return No return */ virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const; - /** * Determine the base dir in which shared resources are located. It will first try to use * "unpack and run" path, then look for properly installed path, not including versioning. - * @return Unsigned char string pointing to system dir (eg /usr/share/blender/). + * @return Unsigned char string pointing to system dir (eg /usr/share/). */ virtual const GHOST_TUns8* getSystemDir() const; /** * Determine the base dir in which user configuration is stored, not including versioning. * If needed, it will create the base directory. - * @return Unsigned char string pointing to user dir (eg ~/.blender/). + * @return Unsigned char string pointing to user dir (eg ~/). */ virtual const GHOST_TUns8* getUserDir() const; + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + virtual const GHOST_TUns8* getBinaryDir() const; + /** * Creates a drag'n'drop event and pushes it immediately onto the event queue. * Called by GHOST_DropTargetWin32 class. diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index cbf775045fd..c9228e68e54 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -29,10 +29,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_SystemX11.h" #include "GHOST_WindowX11.h" #include "GHOST_WindowManager.h" @@ -469,7 +465,7 @@ GHOST_SystemX11::processEvent(XEvent *xe) /* could also clamp to screen bounds * wrap with a window outside the view will fail atm */ - bounds.wrapPoint(x_new, y_new, 2); /* offset of one incase blender is at screen bounds */ + bounds.wrapPoint(x_new, y_new, 8); /* offset of one incase blender is at screen bounds */ window->getCursorGrabAccum(x_accum, y_accum); if(x_new != xme.x_root || y_new != xme.y_root) { @@ -536,38 +532,43 @@ GHOST_SystemX11::processEvent(XEvent *xe) } case ButtonPress: - { - /* process wheel mouse events and break */ - if (xe->xbutton.button == 4) { - g_event = new GHOST_EventWheel(getMilliSeconds(), window, 1); - break; - } - if (xe->xbutton.button == 5) { - g_event = new GHOST_EventWheel(getMilliSeconds(), window, -1); - break; - } - } case ButtonRelease: { - XButtonEvent & xbe = xe->xbutton; GHOST_TButtonMask gbmask = GHOST_kButtonMaskLeft; - switch (xbe.button) { - case Button1 : gbmask = GHOST_kButtonMaskLeft; break; - case Button3 : gbmask = GHOST_kButtonMaskRight; break; - /* It seems events 6 and 7 are for horizontal scrolling. - * you can re-order button mapping like this... (swaps 6,7 with 8,9) - * xmodmap -e "pointer = 1 2 3 4 5 8 9 6 7" - */ - case 8 : gbmask = GHOST_kButtonMaskButton4; break; /* Button4 is the wheel */ - case 9 : gbmask = GHOST_kButtonMaskButton5; break; /* Button5 is a wheel too */ - default: - case Button2 : gbmask = GHOST_kButtonMaskMiddle; break; - } - GHOST_TEventType type = (xbe.type == ButtonPress) ? GHOST_kEventButtonDown : GHOST_kEventButtonUp; + + /* process wheel mouse events and break, only pass on press events */ + if(xbe.button == Button4) { + if(xbe.type == ButtonPress) + g_event = new GHOST_EventWheel(getMilliSeconds(), window, 1); + break; + } + else if(xbe.button == Button5) { + if(xbe.type == ButtonPress) + g_event = new GHOST_EventWheel(getMilliSeconds(), window, -1); + break; + } + /* process rest of normal mouse buttons */ + if(xbe.button == Button1) + gbmask = GHOST_kButtonMaskLeft; + else if(xbe.button == Button2) + gbmask = GHOST_kButtonMaskMiddle; + else if(xbe.button == Button3) + gbmask = GHOST_kButtonMaskRight; + /* It seems events 6 and 7 are for horizontal scrolling. + * you can re-order button mapping like this... (swaps 6,7 with 8,9) + * xmodmap -e "pointer = 1 2 3 4 5 8 9 6 7" + */ + else if(xbe.button == 8) + gbmask = GHOST_kButtonMaskButton4; + else if(xbe.button == 9) + gbmask = GHOST_kButtonMaskButton5; + else + break; + g_event = new GHOST_EventButton( getMilliSeconds(), @@ -965,7 +966,7 @@ GHOST_SystemX11:: setCursorPosition( GHOST_TInt32 x, GHOST_TInt32 y -) const { +) { // This is a brute force move in screen coordinates // XWarpPointer does relative moves so first determine the @@ -1460,19 +1461,21 @@ void GHOST_SystemX11::putClipboard(GHOST_TInt8 *buffer, bool selection) const const GHOST_TUns8* GHOST_SystemX11::getSystemDir() const { - return (GHOST_TUns8*)"/usr/share/blender"; + return (GHOST_TUns8*)"/usr/share"; } const GHOST_TUns8* GHOST_SystemX11::getUserDir() const { - static char path[256]; char* env = getenv("HOME"); if(env) { - strncpy(path, env, 245); - path[245]=0; - strcat(path, "/.blender/"); - return (GHOST_TUns8*) path; + return (GHOST_TUns8*) env; } else { return NULL; } } + +const GHOST_TUns8* GHOST_SystemX11::getBinaryDir() const +{ + return NULL; +} + diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h index 1d9959cc931..13ad4200ab8 100644 --- a/intern/ghost/intern/GHOST_SystemX11.h +++ b/intern/ghost/intern/GHOST_SystemX11.h @@ -158,7 +158,7 @@ public: setCursorPosition( GHOST_TInt32 x, GHOST_TInt32 y - ) const; + ); /** * Returns the state of all modifier keys. @@ -240,6 +240,12 @@ public: */ const GHOST_TUns8* getUserDir() const; + /** + * Determine the directory of the current binary + * @return Unsigned char string pointing to the binary dir + */ + const GHOST_TUns8* getBinaryDir() const; + /** * Atom used for ICCCM, WM-spec and Motif. * We only need get this atom at the start, it's relative diff --git a/intern/ghost/intern/GHOST_TimerManager.cpp b/intern/ghost/intern/GHOST_TimerManager.cpp index a83e4d2edce..ec99e323d14 100644 --- a/intern/ghost/intern/GHOST_TimerManager.cpp +++ b/intern/ghost/intern/GHOST_TimerManager.cpp @@ -34,10 +34,6 @@ * @date May 31, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_TimerManager.h" #include diff --git a/intern/ghost/intern/GHOST_Window.cpp b/intern/ghost/intern/GHOST_Window.cpp index b5f8050bebb..374b620c348 100644 --- a/intern/ghost/intern/GHOST_Window.cpp +++ b/intern/ghost/intern/GHOST_Window.cpp @@ -32,10 +32,6 @@ * @date May 10, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_Window.h" @@ -57,6 +53,8 @@ GHOST_Window::GHOST_Window( m_isUnsavedChanges = false; m_canAcceptDragOperation = false; + m_progressBarVisible = false; + m_cursorGrabAccumPos[0] = 0; m_cursorGrabAccumPos[1] = 0; diff --git a/intern/ghost/intern/GHOST_Window.h b/intern/ghost/intern/GHOST_Window.h index bec9cecc830..d4d53787357 100644 --- a/intern/ghost/intern/GHOST_Window.h +++ b/intern/ghost/intern/GHOST_Window.h @@ -191,6 +191,17 @@ public: */ virtual GHOST_TSuccess getCursorGrabBounds(GHOST_Rect& bounds); + /** + * Sets the progress bar value displayed in the window/application icon + * @param progress The progress % (0.0 to 1.0) + */ + virtual GHOST_TSuccess setProgressBar(float progress) {return GHOST_kFailure;}; + + /** + * Hides the progress bar in the icon + */ + virtual GHOST_TSuccess endProgressBar() {return GHOST_kFailure;}; + /** * Tells if the ongoing drag'n'drop object can be accepted upon mouse drop */ @@ -313,6 +324,9 @@ protected: /** The current shape of the cursor */ GHOST_TStandardCursor m_cursorShape; + /** The presence of progress indicator with the application icon */ + bool m_progressBarVisible; + /** The acceptance of the "drop candidate" of the current drag'n'drop operation */ bool m_canAcceptDragOperation; diff --git a/intern/ghost/intern/GHOST_WindowCarbon.cpp b/intern/ghost/intern/GHOST_WindowCarbon.cpp index 65584e4cc1f..a8295ec57d3 100644 --- a/intern/ghost/intern/GHOST_WindowCarbon.cpp +++ b/intern/ghost/intern/GHOST_WindowCarbon.cpp @@ -34,10 +34,6 @@ * @date May 10, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_WindowCarbon.h" #include "GHOST_Debug.h" @@ -46,7 +42,7 @@ AGLContext GHOST_WindowCarbon::s_firstaglCtx = NULL; const GHOST_TInt32 GHOST_WindowCarbon::s_sizeRectSize = 16; #endif //GHOST_DRAW_CARBON_GUTTER -static const GLint sPreferredFormatWindow[8] = { +static const GLint sPreferredFormatWindow[10] = { AGL_RGBA, AGL_DOUBLEBUFFER, AGL_ACCELERATED, @@ -54,7 +50,7 @@ AGL_DEPTH_SIZE, 32, AGL_NONE, }; -static const GLint sPreferredFormatFullScreen[9] = { +static const GLint sPreferredFormatFullScreen[11] = { AGL_RGBA, AGL_DOUBLEBUFFER, AGL_ACCELERATED, diff --git a/intern/ghost/intern/GHOST_WindowCocoa.h b/intern/ghost/intern/GHOST_WindowCocoa.h index 948fb5e36ee..4b492a6b0b5 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.h +++ b/intern/ghost/intern/GHOST_WindowCocoa.h @@ -226,6 +226,17 @@ public: GHOST_TabletData& GetCocoaTabletData() { return m_tablet; } + + /** + * Sets the progress bar value displayed in the window/application icon + * @param progress The progress % (0.0 to 1.0) + */ + virtual GHOST_TSuccess setProgressBar(float progress); + + /** + * Hides the progress bar icon + */ + virtual GHOST_TSuccess endProgressBar(); protected: /** * Tries to install a rendering context in this window. @@ -291,14 +302,6 @@ protected: NSCursor* m_customCursor; GHOST_TabletData m_tablet; - - /** - * The width/height of the size rectangle in the lower right corner of a - * Mac/Carbon window. This is also the height of the gutter area. - */ -#ifdef GHOST_DRAW_CARBON_GUTTER - static const GHOST_TInt32 s_sizeRectSize; -#endif // GHOST_DRAW_CARBON_GUTTER }; #endif // _GHOST_WINDOW_COCOA_H_ diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index 6206388fdaa..233edfc9d65 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -167,7 +167,7 @@ extern "C" { else if ([[draggingPBoard types] containsObject:NSStringPboardType]) m_draggedObjectType = GHOST_kDragnDropTypeString; else return NSDragOperationNone; - associatedWindow->setAcceptDragOperation(FALSE); //Drag operation needs to be accepted explicitly by the event manager + associatedWindow->setAcceptDragOperation(TRUE); //Drag operation is accepted by default systemCocoa->handleDraggingEvent(GHOST_kEventDraggingEntered, m_draggedObjectType, associatedWindow, mouseLocation.x, mouseLocation.y, nil); return NSDragOperationCopy; } @@ -348,10 +348,11 @@ GHOST_WindowCocoa::GHOST_WindowCocoa( pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated; //pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway - + pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize; pixelFormatAttrsWindow[i++] = (NSOpenGLPixelFormatAttribute) 32; + if (stereoVisual) pixelFormatAttrsWindow[i++] = NSOpenGLPFAStereo; if (numOfAASamples>0) { @@ -692,12 +693,239 @@ void GHOST_WindowCocoa::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST } +<<<<<<< .working +======= +void GHOST_WindowCocoa::setTitle(const STR_String& title) +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setTitle(): window invalid") + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSString *windowTitle = [[NSString alloc] initWithUTF8String:title]; + + //Set associated file if applicable + if ([windowTitle hasPrefix:@"Blender"]) + { + NSRange fileStrRange; + NSString *associatedFileName; + int len; + + fileStrRange.location = [windowTitle rangeOfString:@"["].location+1; + len = [windowTitle rangeOfString:@"]"].location - fileStrRange.location; + + if (len >0) + { + fileStrRange.length = len; + associatedFileName = [windowTitle substringWithRange:fileStrRange]; + @try { + [m_window setRepresentedFilename:associatedFileName]; + } + @catch (NSException * e) { + printf("\nInvalid file path given in window title"); + } + [m_window setTitle:[associatedFileName lastPathComponent]]; + } + else { + [m_window setTitle:windowTitle]; + [m_window setRepresentedFilename:@""]; + } + + } else { + [m_window setTitle:windowTitle]; + [m_window setRepresentedFilename:@""]; + } + + + [windowTitle release]; + [pool drain]; +} + + +void GHOST_WindowCocoa::getTitle(STR_String& title) const +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getTitle(): window invalid") + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSString *windowTitle = [m_window title]; + + if (windowTitle != nil) { + title = [windowTitle UTF8String]; + } + + [pool drain]; +} + + +void GHOST_WindowCocoa::getWindowBounds(GHOST_Rect& bounds) const +{ + NSRect rect; + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getWindowBounds(): window invalid") + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSRect screenSize = [[m_window screen] visibleFrame]; + + rect = [m_window frame]; + + bounds.m_b = screenSize.size.height - (rect.origin.y -screenSize.origin.y); + bounds.m_l = rect.origin.x -screenSize.origin.x; + bounds.m_r = rect.origin.x-screenSize.origin.x + rect.size.width; + bounds.m_t = screenSize.size.height - (rect.origin.y + rect.size.height -screenSize.origin.y); + + [pool drain]; +} + + +void GHOST_WindowCocoa::getClientBounds(GHOST_Rect& bounds) const +{ + NSRect rect; + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getClientBounds(): window invalid") + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (!m_fullScreen) + { + NSRect screenSize = [[m_window screen] visibleFrame]; + + //Max window contents as screen size (excluding title bar...) + NSRect contentRect = [CocoaWindow contentRectForFrameRect:screenSize + styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)]; + + rect = [m_window contentRectForFrameRect:[m_window frame]]; + + bounds.m_b = contentRect.size.height - (rect.origin.y -contentRect.origin.y); + bounds.m_l = rect.origin.x -contentRect.origin.x; + bounds.m_r = rect.origin.x-contentRect.origin.x + rect.size.width; + bounds.m_t = contentRect.size.height - (rect.origin.y + rect.size.height -contentRect.origin.y); + } + else { + NSRect screenSize = [[m_window screen] frame]; + + bounds.m_b = screenSize.origin.y + screenSize.size.height; + bounds.m_l = screenSize.origin.x; + bounds.m_r = screenSize.origin.x + screenSize.size.width; + bounds.m_t = screenSize.origin.y; + } + [pool drain]; +} + + +GHOST_TSuccess GHOST_WindowCocoa::setClientWidth(GHOST_TUns32 width) +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setClientWidth(): window invalid") + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + GHOST_Rect cBnds, wBnds; + getClientBounds(cBnds); + if (((GHOST_TUns32)cBnds.getWidth()) != width) { + NSSize size; + size.width=width; + size.height=cBnds.getHeight(); + [m_window setContentSize:size]; + } + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_WindowCocoa::setClientHeight(GHOST_TUns32 height) +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setClientHeight(): window invalid") + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + GHOST_Rect cBnds, wBnds; + getClientBounds(cBnds); + if (((GHOST_TUns32)cBnds.getHeight()) != height) { + NSSize size; + size.width=cBnds.getWidth(); + size.height=height; + [m_window setContentSize:size]; + } + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_WindowCocoa::setClientSize(GHOST_TUns32 width, GHOST_TUns32 height) +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setClientSize(): window invalid") + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + GHOST_Rect cBnds, wBnds; + getClientBounds(cBnds); + if ((((GHOST_TUns32)cBnds.getWidth()) != width) || + (((GHOST_TUns32)cBnds.getHeight()) != height)) { + NSSize size; + size.width=width; + size.height=height; + [m_window setContentSize:size]; + } + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TWindowState GHOST_WindowCocoa::getState() const +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::getState(): window invalid") + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + GHOST_TWindowState state; + if (m_fullScreen) { + state = GHOST_kWindowStateFullScreen; + } + else if ([m_window isMiniaturized]) { + state = GHOST_kWindowStateMinimized; + } + else if ([m_window isZoomed]) { + state = GHOST_kWindowStateMaximized; + } + else { + state = GHOST_kWindowStateNormal; + } + [pool drain]; + return state; +} + + +void GHOST_WindowCocoa::screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::screenToClient(): window invalid") + + NSPoint screenCoord; + NSPoint baseCoord; + + screenCoord.x = inX; + screenCoord.y = inY; + + baseCoord = [m_window convertScreenToBase:screenCoord]; + + outX = baseCoord.x; + outY = baseCoord.y; +} + + +void GHOST_WindowCocoa::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::clientToScreen(): window invalid") + + NSPoint screenCoord; + NSPoint baseCoord; + + baseCoord.x = inX; + baseCoord.y = inY; + + screenCoord = [m_window convertBaseToScreen:baseCoord]; + + outX = screenCoord.x; + outY = screenCoord.y; +} + + +>>>>>>> .merge-right.r30358 NSScreen* GHOST_WindowCocoa::getScreen() { return [m_window screen]; } +<<<<<<< .working /** * @note Fullscreen switch is not actual fullscreen with display capture. As this capture removes all OS X window manager features. * Instead, the menu bar and the dock are hidden, and the window is made borderless and enlarged. @@ -733,7 +961,45 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Make window borderless and enlarge it [m_window setStyleMask:NSBorderlessWindowMask]; [m_window setFrame:[[m_window screen] frame] display:YES]; +======= +/** + * @note Fullscreen switch is not actual fullscreen with display capture. As this capture removes all OS X window manager features. + * Instead, the menu bar and the dock are hidden, and the window is made borderless and enlarged. + * Thus, process switch, exposé, spaces, ... still work in fullscreen mode + */ +GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::setState(): window invalid") + switch (state) { + case GHOST_kWindowStateMinimized: + [m_window miniaturize:nil]; + break; + case GHOST_kWindowStateMaximized: + [m_window zoom:nil]; + break; + + case GHOST_kWindowStateFullScreen: + if (!m_fullScreen) + { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + //This status change needs to be done before Cocoa call to enter fullscreen mode + //to give window delegate hint not to forward its deactivation to ghost wm that doesn't know view/window difference + m_fullScreen = true; + +#ifdef MAC_OS_X_VERSION_10_6 + //10.6 provides Cocoa functions to autoshow menu bar, and to change a window style + //Hide menu & dock if needed + if ([[m_window screen] isEqual:[[NSScreen screens] objectAtIndex:0]]) + { + [NSApp setPresentationOptions:(NSApplicationPresentationHideDock | NSApplicationPresentationAutoHideMenuBar)]; + } + //Make window borderless and enlarge it + [m_window setStyleMask:NSBorderlessWindowMask]; + [m_window setFrame:[[m_window screen] frame] display:YES]; +>>>>>>> .merge-right.r30358 [m_window makeFirstResponder:m_openGLView]; +<<<<<<< .working #else //With 10.5, we need to create a new window to change its style to borderless //Hide menu & dock if needed @@ -791,6 +1057,65 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Make window normal and resize it [m_window setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)]; [m_window setFrame:[[m_window screen] visibleFrame] display:YES]; +======= +#else + //With 10.5, we need to create a new window to change its style to borderless + //Hide menu & dock if needed + if ([[m_window screen] isEqual:[[NSScreen screens] objectAtIndex:0]]) + { + //Cocoa function in 10.5 does not allow to set the menu bar in auto-show mode [NSMenu setMenuBarVisible:NO]; + //One of the very few 64bit compatible Carbon function + SetSystemUIMode(kUIModeAllHidden,kUIOptionAutoShowMenuBar); + } + //Create a fullscreen borderless window + CocoaWindow *tmpWindow = [[CocoaWindow alloc] + initWithContentRect:[[m_window screen] frame] + styleMask:NSBorderlessWindowMask + backing:NSBackingStoreBuffered + defer:YES]; + //Copy current window parameters + [tmpWindow setTitle:[m_window title]]; + [tmpWindow setRepresentedFilename:[m_window representedFilename]]; + [tmpWindow setReleasedWhenClosed:NO]; + [tmpWindow setAcceptsMouseMovedEvents:YES]; + [tmpWindow setDelegate:[m_window delegate]]; + + //Assign the openGL view to the new window + [tmpWindow setContentView:m_openGLView]; + + //Show the new window + [tmpWindow makeKeyAndOrderFront:nil]; + //Close and release old window + [m_window setDelegate:nil]; // To avoid the notification of "window closed" event + [m_window close]; + [m_window release]; + m_window = tmpWindow; +#endif + + //Tell WM of view new size + m_systemCocoa->handleWindowEvent(GHOST_kEventWindowSize, this); + + [pool drain]; + } + break; + case GHOST_kWindowStateNormal: + default: + if (m_fullScreen) + { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + m_fullScreen = false; + + //Exit fullscreen +#ifdef MAC_OS_X_VERSION_10_6 + //Show again menu & dock if needed + if ([[m_window screen] isEqual:[NSScreen mainScreen]]) + { + [NSApp setPresentationOptions:NSApplicationPresentationDefault]; + } + //Make window normal and resize it + [m_window setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)]; + [m_window setFrame:[[m_window screen] visibleFrame] display:YES]; +>>>>>>> .merge-right.r30358 //TODO for 10.6 only : window title is forgotten after the style change [m_window makeFirstResponder:m_openGLView]; #else @@ -969,6 +1294,7 @@ GHOST_TSuccess GHOST_WindowCocoa::installDrawingContext(GHOST_TDrawingContextTyp m_openGLContext = tmpOpenGLContext; break; +<<<<<<< .working case GHOST_kDrawingContextTypeNone: success = GHOST_kSuccess; break; @@ -1077,7 +1403,176 @@ void GHOST_WindowCocoa::loadCursor(bool visible, GHOST_TStandardCursor cursor) c case GHOST_kStandardCursorTopRightCorner: case GHOST_kStandardCursorBottomRightCorner: case GHOST_kStandardCursorBottomLeftCorner: +======= + case GHOST_kDrawingContextTypeNone: + success = GHOST_kSuccess; + break; + + default: + break; + } + [pool drain]; + return success; +} + + +GHOST_TSuccess GHOST_WindowCocoa::removeDrawingContext() +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + switch (m_drawingContextType) { + case GHOST_kDrawingContextTypeOpenGL: + if (m_openGLContext) + { + [m_openGLView clearGLContext]; + if (s_firstOpenGLcontext == m_openGLContext) s_firstOpenGLcontext = nil; + m_openGLContext = nil; + } + [pool drain]; + return GHOST_kSuccess; + case GHOST_kDrawingContextTypeNone: + [pool drain]; + return GHOST_kSuccess; + break; + default: + [pool drain]; + return GHOST_kFailure; + } +} + + +GHOST_TSuccess GHOST_WindowCocoa::invalidate() +{ + GHOST_ASSERT(getValid(), "GHOST_WindowCocoa::invalidate(): window invalid") + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [m_openGLView setNeedsDisplay:YES]; + [pool drain]; + return GHOST_kSuccess; +} + +#pragma mark Progress bar + +GHOST_TSuccess GHOST_WindowCocoa::setProgressBar(float progress) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if ((progress >=0.0) && (progress <=1.0)) { + NSImage* dockIcon = [[NSImage alloc] initWithSize:NSMakeSize(128,128)]; + + [dockIcon lockFocus]; + NSRect progressBox = {{4, 4}, {120, 16}}; + + [[NSImage imageNamed:@"NSApplicationIcon"] dissolveToPoint:NSZeroPoint fraction:1.0]; + + // Track & Outline + [[NSColor blackColor] setFill]; + NSRectFill(progressBox); + + [[NSColor whiteColor] set]; + NSFrameRect(progressBox); + + // Progress fill + progressBox = NSInsetRect(progressBox, 1, 1); + [[NSColor knobColor] setFill]; + progressBox.size.width = progressBox.size.width * progress; + NSRectFill(progressBox); + + [dockIcon unlockFocus]; + + [NSApp setApplicationIconImage:dockIcon]; + [dockIcon release]; + + m_progressBarVisible = true; + } + + [pool drain]; + return GHOST_kSuccess; +} + + +GHOST_TSuccess GHOST_WindowCocoa::endProgressBar() +{ + if (!m_progressBarVisible) return GHOST_kFailure; + m_progressBarVisible = false; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSImage* dockIcon = [[NSImage alloc] initWithSize:NSMakeSize(128,128)]; + [dockIcon lockFocus]; + [[NSImage imageNamed:@"NSApplicationIcon"] dissolveToPoint:NSZeroPoint fraction:1.0]; + [dockIcon unlockFocus]; + [NSApp setApplicationIconImage:dockIcon]; + [dockIcon release]; + + [pool drain]; + return GHOST_kSuccess; +} + + + +#pragma mark Cursor handling + +void GHOST_WindowCocoa::loadCursor(bool visible, GHOST_TStandardCursor cursor) const +{ + static bool systemCursorVisible = true; + + NSCursor *tmpCursor =nil; + + if (visible != systemCursorVisible) { + if (visible) { + [NSCursor unhide]; + systemCursorVisible = true; + } + else { + [NSCursor hide]; + systemCursorVisible = false; + } + } + + if (cursor == GHOST_kStandardCursorCustom && m_customCursor) { + tmpCursor = m_customCursor; + } else { + switch (cursor) { + case GHOST_kStandardCursorDestroy: + tmpCursor = [NSCursor disappearingItemCursor]; + break; + case GHOST_kStandardCursorText: + tmpCursor = [NSCursor IBeamCursor]; + break; + case GHOST_kStandardCursorCrosshair: + tmpCursor = [NSCursor crosshairCursor]; + break; + case GHOST_kStandardCursorUpDown: + tmpCursor = [NSCursor resizeUpDownCursor]; + break; + case GHOST_kStandardCursorLeftRight: + tmpCursor = [NSCursor resizeLeftRightCursor]; + break; + case GHOST_kStandardCursorTopSide: + tmpCursor = [NSCursor resizeUpCursor]; + break; + case GHOST_kStandardCursorBottomSide: + tmpCursor = [NSCursor resizeDownCursor]; + break; + case GHOST_kStandardCursorLeftSide: + tmpCursor = [NSCursor resizeLeftCursor]; + break; + case GHOST_kStandardCursorRightSide: + tmpCursor = [NSCursor resizeRightCursor]; + break; + case GHOST_kStandardCursorRightArrow: + case GHOST_kStandardCursorInfo: + case GHOST_kStandardCursorLeftArrow: + case GHOST_kStandardCursorHelp: + case GHOST_kStandardCursorCycle: + case GHOST_kStandardCursorSpray: + case GHOST_kStandardCursorWait: + case GHOST_kStandardCursorTopLeftCorner: + case GHOST_kStandardCursorTopRightCorner: + case GHOST_kStandardCursorBottomRightCorner: + case GHOST_kStandardCursorBottomLeftCorner: +>>>>>>> .merge-right.r30358 case GHOST_kStandardCursorCopy: +<<<<<<< .working case GHOST_kStandardCursorDefault: default: tmpCursor = [NSCursor arrowCursor]; @@ -1100,6 +1595,32 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorVisibility(bool visible) } +======= + case GHOST_kStandardCursorDefault: + default: + tmpCursor = [NSCursor arrowCursor]; + break; + }; + } + [tmpCursor set]; +} + + + +GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorVisibility(bool visible) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; + + if ([m_window isVisible]) { + loadCursor(visible, getCursorShape()); + } + + [pool drain]; + return GHOST_kSuccess; +} + + +>>>>>>> .merge-right.r30358 GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(GHOST_TGrabCursorMode mode) { GHOST_TSuccess err = GHOST_kSuccess; @@ -1142,6 +1663,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(GHOST_TGrabCursorMode mode m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */ } return err; +<<<<<<< .working } GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorShape(GHOST_TStandardCursor shape) @@ -1205,6 +1727,74 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 *bitmap samplesPerPixel:2 hasAlpha:YES isPlanar:YES +======= +} + +GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorShape(GHOST_TStandardCursor shape) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (m_customCursor) { + [m_customCursor release]; + m_customCursor = nil; + } + + if ([m_window isVisible]) { + loadCursor(getCursorVisibility(), shape); + } + + [pool drain]; + return GHOST_kSuccess; +} + +/** Reverse the bits in a GHOST_TUns8 +static GHOST_TUns8 uns8ReverseBits(GHOST_TUns8 ch) +{ + ch= ((ch>>1)&0x55) | ((ch<<1)&0xAA); + ch= ((ch>>2)&0x33) | ((ch<<2)&0xCC); + ch= ((ch>>4)&0x0F) | ((ch<<4)&0xF0); + return ch; +} +*/ + + +/** Reverse the bits in a GHOST_TUns16 */ +static GHOST_TUns16 uns16ReverseBits(GHOST_TUns16 shrt) +{ + shrt= ((shrt>>1)&0x5555) | ((shrt<<1)&0xAAAA); + shrt= ((shrt>>2)&0x3333) | ((shrt<<2)&0xCCCC); + shrt= ((shrt>>4)&0x0F0F) | ((shrt<<4)&0xF0F0); + shrt= ((shrt>>8)&0x00FF) | ((shrt<<8)&0xFF00); + return shrt; +} + +GHOST_TSuccess GHOST_WindowCocoa::setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, + int sizex, int sizey, int hotX, int hotY, int fg_color, int bg_color) +{ + int y,nbUns16; + NSPoint hotSpotPoint; + NSBitmapImageRep *cursorImageRep; + NSImage *cursorImage; + NSSize imSize; + GHOST_TUns16 *cursorBitmap; + + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (m_customCursor) { + [m_customCursor release]; + m_customCursor = nil; + } + + + cursorImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil + pixelsWide:sizex + pixelsHigh:sizey + bitsPerSample:1 + samplesPerPixel:2 + hasAlpha:YES + isPlanar:YES +>>>>>>> .merge-right.r30358 colorSpaceName:NSDeviceWhiteColorSpace bytesPerRow:(sizex/8 + (sizex%8 >0 ?1:0)) bitsPerPixel:1]; diff --git a/intern/ghost/intern/GHOST_WindowManager.cpp b/intern/ghost/intern/GHOST_WindowManager.cpp index c43307c9513..1ac357ac97f 100644 --- a/intern/ghost/intern/GHOST_WindowManager.cpp +++ b/intern/ghost/intern/GHOST_WindowManager.cpp @@ -34,10 +34,6 @@ * @date May 11, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_WindowManager.h" #include #include "GHOST_Debug.h" diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 4aeccd7fe2a..1366aebf9e7 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -34,10 +34,6 @@ * @date May 10, 2001 */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include #include "GHOST_WindowWin32.h" #include "GHOST_SystemWin32.h" @@ -68,6 +64,7 @@ LPCSTR GHOST_WindowWin32::s_windowClassName = "GHOST_WindowClass"; const int GHOST_WindowWin32::s_maxTitleLength = 128; HGLRC GHOST_WindowWin32::s_firsthGLRc = NULL; +HDC GHOST_WindowWin32::s_firstHDC = NULL; static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd); static int EnumPixelFormats(HDC hdc); @@ -138,6 +135,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( m_top(top), m_width(width), m_height(height), + m_normal_state(GHOST_kWindowStateNormal), m_stereo(stereoVisual), m_nextWindow(NULL) { @@ -158,11 +156,16 @@ GHOST_WindowWin32::GHOST_WindowWin32( width = tw; left = rect.left; } + else if(left < rect.left) + left = rect.left; + if(th < height) { height = th; top = rect.top; } + else if(top < rect.top) + top = rect.top; m_hWnd = ::CreateWindow( s_windowClassName, // pointer to registered class name @@ -201,6 +204,10 @@ GHOST_WindowWin32::GHOST_WindowWin32( // Store the device context m_hDC = ::GetDC(m_hWnd); + if(!s_firstHDC) { + s_firstHDC = m_hDC; + } + // Show the window int nCmdShow; switch (state) { @@ -307,10 +314,11 @@ GHOST_WindowWin32::~GHOST_WindowWin32() m_customCursor = NULL; } + ::wglMakeCurrent(NULL, NULL); m_multisampleEnabled = GHOST_kFailure; m_multisample = 0; setDrawingContextType(GHOST_kDrawingContextTypeNone); - if (m_hDC) { + if (m_hDC && m_hDC != s_firstHDC) { ::ReleaseDC(m_hWnd, m_hDC); m_hDC = 0; } @@ -481,9 +489,13 @@ void GHOST_WindowWin32::clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST GHOST_TSuccess GHOST_WindowWin32::setState(GHOST_TWindowState state) { + GHOST_TWindowState curstate = getState(); WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); ::GetWindowPlacement(m_hWnd, &wp); + + if (state == GHOST_kWindowStateNormal) + state = m_normal_state; switch (state) { case GHOST_kWindowStateMinimized: wp.showCmd = SW_SHOWMINIMIZED; @@ -494,6 +506,8 @@ GHOST_TSuccess GHOST_WindowWin32::setState(GHOST_TWindowState state) SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); break; case GHOST_kWindowStateFullScreen: + if (curstate != state && curstate != GHOST_kWindowStateMinimized) + m_normal_state = curstate; wp.showCmd = SW_SHOWMAXIMIZED; wp.ptMaxPosition.x = 0; wp.ptMaxPosition.y = 0; @@ -636,6 +650,7 @@ GHOST_TSuccess GHOST_WindowWin32::installDrawingContext(GHOST_TDrawingContextTyp m_hGlRc = ::wglCreateContext(m_hDC); if (m_hGlRc) { if (s_firsthGLRc) { + ::wglCopyContext(s_firsthGLRc, m_hGlRc, GL_ALL_ATTRIB_BITS); wglShareLists(s_firsthGLRc, m_hGlRc); } else { s_firsthGLRc = m_hGlRc; @@ -1078,7 +1093,7 @@ static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd) { !(pfd.dwFlags & PFD_DRAW_TO_WINDOW) || !(pfd.dwFlags & PFD_DOUBLEBUFFER) || /* Blender _needs_ this */ ( pfd.cDepthBits <= 8 ) || - !(pfd.iPixelType == PFD_TYPE_RGBA) ) + !(pfd.iPixelType == PFD_TYPE_RGBA)) return 0; weight = 1; /* it's usable */ diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index 5e1f708f61c..a4d31f87ffa 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -315,6 +315,8 @@ protected: HGLRC m_hGlRc; /** The first created OpenGL context (for sharing display lists) */ static HGLRC s_firsthGLRc; + /** The first created device context handle. */ + static HDC s_firstHDC; /** Flag for if window has captured the mouse */ bool m_hasMouseCaptured; /** Count of number of pressed buttons */ @@ -351,6 +353,7 @@ protected: GHOST_TInt32 m_top; GHOST_TUns32 m_width; GHOST_TUns32 m_height; + GHOST_TWindowState m_normal_state; bool m_stereo; /** The GHOST_System passes this to wm if this window is being replaced */ diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 9be278706a8..60e12ff78df 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -57,6 +57,9 @@ typedef struct { #define MWM_HINTS_DECORATIONS (1L << 1) + +// #define GHOST_X11_GRAB + /* * A Client can't change the window property, that is * the work of the window manager. In case, we send @@ -159,6 +162,7 @@ GHOST_WindowX11( GHOST_Window(title,left,top,width,height,state,type,stereoVisual,numOfAASamples), m_context(NULL), m_display(display), + m_normal_state(GHOST_kWindowStateNormal), m_system (system), m_valid_setup (false), m_invalid_window(false), @@ -1036,6 +1040,9 @@ GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state) is_motif_full = motifIsFullScreen(); + if (state == GHOST_kWindowStateNormal) + state = m_normal_state; + if (state == GHOST_kWindowStateNormal) { if (is_max == True) netwmMaximized(False); @@ -1055,6 +1062,8 @@ GHOST_TSuccess GHOST_WindowX11::setState(GHOST_TWindowState state) if (cur_state == GHOST_kWindowStateMinimized) return (GHOST_kFailure); + m_normal_state = cur_state; + if (is_max == True) netwmMaximized(False); if (is_full == False) @@ -1436,7 +1445,9 @@ setWindowCursorGrab( setWindowCursorVisibility(false); } +#ifdef GHOST_X11_GRAB XGrabPointer(m_display, m_window, False, ButtonPressMask| ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); +#endif } else { if (m_cursorGrab==GHOST_kGrabHide) { @@ -1454,7 +1465,9 @@ setWindowCursorGrab( /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */ setCursorGrabAccum(0, 0); m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */ +#ifdef GHOST_X11_GRAB XUngrabPointer(m_display, CurrentTime); +#endif } XFlush(m_display); diff --git a/intern/ghost/intern/GHOST_WindowX11.h b/intern/ghost/intern/GHOST_WindowX11.h index f2420c4c493..2f45378117d 100644 --- a/intern/ghost/intern/GHOST_WindowX11.h +++ b/intern/ghost/intern/GHOST_WindowX11.h @@ -327,6 +327,7 @@ private : Window m_window; Display *m_display; XVisualInfo *m_visual; + GHOST_TWindowState m_normal_state; /** The first created OpenGL context (for sharing display lists) */ static GLXContext s_firstContext; diff --git a/intern/ghost/intern/Makefile b/intern/ghost/intern/Makefile index 23d27e61590..2f5e088f4fe 100644 --- a/intern/ghost/intern/Makefile +++ b/intern/ghost/intern/Makefile @@ -38,7 +38,7 @@ CCSRCS += GHOST_EventManager.cpp GHOST_EventPrinter.cpp GHOST_WindowManager.cpp CCSRCS += GHOST_ISystem.cpp GHOST_ModifierKeys.cpp GHOST_TimerManager.cpp CCSRCS += GHOST_Rect.cpp GHOST_DisplayManager.cpp GHOST_C-api.cpp CCSRCS += GHOST_CallbackEventConsumer.cpp -CCSRCS += GHOST_NDOFManager.cpp +CCSRCS += GHOST_NDOFManager.cpp GHOST_Path-api.cpp ifeq ($(OS),$(findstring $(OS), "darwin")) ifeq ($(WITH_COCOA), true) diff --git a/intern/ghost/make/msvc_9_0/ghost.vcproj b/intern/ghost/make/msvc_9_0/ghost.vcproj index 05a103791f1..b51e14275c9 100644 --- a/intern/ghost/make/msvc_9_0/ghost.vcproj +++ b/intern/ghost/make/msvc_9_0/ghost.vcproj @@ -44,7 +44,7 @@ Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..;..\..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\..\lib\windows\wintab\INCLUDE;..\..\..\..\..\build\msvc_9\extern\glew\include" + AdditionalIncludeDirectories="..\..;..\..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\..\lib\windows\wintab\INCLUDE;..\..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\source\blender\imbuf;..\..\..\..\source\blender\makesdna" PreprocessorDefinitions="WIN32,NDEBUG,_LIB" StringPooling="true" RuntimeLibrary="0" @@ -197,7 +197,7 @@ + + @@ -525,6 +529,10 @@ RelativePath="..\..\intern\GHOST_NDOFManager.cpp" > + + diff --git a/intern/ghost/test/gears/GHOST_C-Test.c b/intern/ghost/test/gears/GHOST_C-Test.c index b57e38b4688..e8e818abca7 100644 --- a/intern/ghost/test/gears/GHOST_C-Test.c +++ b/intern/ghost/test/gears/GHOST_C-Test.c @@ -45,10 +45,6 @@ #define FALSE 0 -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GHOST_C-api.h" #if defined(WIN32) || defined(__APPLE__) diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp index 92e7f4997bc..6e269e1cede 100644 --- a/intern/ghost/test/gears/GHOST_Test.cpp +++ b/intern/ghost/test/gears/GHOST_Test.cpp @@ -41,10 +41,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(WIN32) || defined(__APPLE__) #ifdef WIN32 #include diff --git a/intern/ghost/test/multitest/Basic.c b/intern/ghost/test/multitest/Basic.c index be463b39bd5..1510c47f28a 100644 --- a/intern/ghost/test/multitest/Basic.c +++ b/intern/ghost/test/multitest/Basic.c @@ -28,10 +28,6 @@ #include "Basic.h" -#ifdef HAVE_CONFIG_H -#include -#endif - int min_i(int a, int b) { return (a -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "GHOST_C-api.h" diff --git a/intern/ghost/test/multitest/MultiTest.c b/intern/ghost/test/multitest/MultiTest.c index cc28ec23986..848601b2cc7 100644 --- a/intern/ghost/test/multitest/MultiTest.c +++ b/intern/ghost/test/multitest/MultiTest.c @@ -39,10 +39,6 @@ #include "GL.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "GHOST_C-api.h" diff --git a/intern/ghost/test/multitest/ScrollBar.c b/intern/ghost/test/multitest/ScrollBar.c index 34219be1bed..7574a5c85f1 100644 --- a/intern/ghost/test/multitest/ScrollBar.c +++ b/intern/ghost/test/multitest/ScrollBar.c @@ -30,10 +30,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "Basic.h" diff --git a/intern/ghost/test/multitest/Util.c b/intern/ghost/test/multitest/Util.c index 0bc152f6543..abc4c2651e4 100644 --- a/intern/ghost/test/multitest/Util.c +++ b/intern/ghost/test/multitest/Util.c @@ -32,10 +32,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "Util.h" diff --git a/intern/ghost/test/multitest/WindowData.c b/intern/ghost/test/multitest/WindowData.c index 8d8ac8ff426..0a4c2aa8d00 100644 --- a/intern/ghost/test/multitest/WindowData.c +++ b/intern/ghost/test/multitest/WindowData.c @@ -28,10 +28,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "GHOST_C-api.h" diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h index 1d001ea6074..8c5caa6f359 100644 --- a/intern/guardedalloc/MEM_guardedalloc.h +++ b/intern/guardedalloc/MEM_guardedalloc.h @@ -66,7 +66,7 @@ extern "C" { /** Returns the lenght of the allocated memory segment pointed at * by vmemh. If the pointer was not previously allocated by this * module, the result is undefined.*/ - int MEM_allocN_len(void *vmemh); + size_t MEM_allocN_len(void *vmemh); /** * Release memory previously allocatred by this module. @@ -93,23 +93,23 @@ extern "C" { * allocated block, the old one is freed. this is not as optimized * as a system realloc but just makes a new allocation and copies * over from existing memory. */ - void *MEM_reallocN(void *vmemh, unsigned int len); + void *MEM_reallocN(void *vmemh, size_t len); /** * Allocate a block of memory of size len, with tag name str. The * memory is cleared. The name must be static, because only a * pointer to it is stored ! */ - void *MEM_callocN(unsigned int len, const char * str); + void *MEM_callocN(size_t len, const char * str); /** Allocate a block of memory of size len, with tag name str. The * name must be a static, because only a pointer to it is stored ! * */ - void *MEM_mallocN(unsigned int len, const char * str); + void *MEM_mallocN(size_t len, const char * str); /** Same as callocN, clears memory and uses mmap (disk cached) if supported. Can be free'd with MEM_freeN as usual. * */ - void *MEM_mapallocN(unsigned int len, const char * str); + void *MEM_mapallocN(size_t len, const char * str); /** Print a list of the names and sizes of all allocated memory * blocks. as a python dict for easy investigation */ @@ -150,16 +150,15 @@ extern "C" { /********* Internal structs. They're only here for the MEM_OVERHEAD macro.*********/ -/* --------------------------------------------------------------------- */ -/* Data definition */ -/* --------------------------------------------------------------------- */ +/*BMESH_TODO/XXX: note to self, don't merge this into trunk*/ + /* all memory chunks are put in linked lists */ typedef struct localLink { struct localLink *next,*prev; } localLink; -typedef struct localListBase +typedef struct localListBase { void *first, *last; } localListBase; @@ -167,12 +166,15 @@ typedef struct localListBase /* note: keep this struct aligned (e.g., irix/gcc) - Hos */ typedef struct MemHead { int tag1; - int len; + size_t len; struct MemHead *next,*prev; const char * name; const char * nextname; int tag2; int mmap; /* if true, memory was mmapped */ +#ifdef DEBUG_MEMCOUNTER + int _count; +#endif } MemHead; typedef struct MemTail { @@ -186,6 +188,12 @@ typedef struct MemTail { #define MEM_OVERHEAD (sizeof(MemHead) + sizeof(MemTail) + MEM_OVERHEADBIAS) +/*reset the peak memory statistic to zero*/ +void MEM_reset_peak_memory(void); + +/*get the peak memory usage in bytes, including mmap allocations*/ +uintptr_t MEM_get_peak_memory(void); + #ifdef __cplusplus } #endif diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index 42f5443aef2..0a0c9485a39 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -36,18 +36,29 @@ #include #include /* memcpy */ #include +#include +/* Blame Microsoft for LLP64 and no inttypes.h, quick workaround needed: */ +#if defined(WIN64) +#define SIZET_FORMAT "%I64u" +#define SIZET_ARG(a) ((unsigned long long)(a)) +#else +#define SIZET_FORMAT "%lu" +#define SIZET_ARG(a) ((unsigned long)(a)) +#endif /* mmap exception */ #if defined(WIN32) -#include #include "mmap_win.h" #else -#include #include #endif #include "MEM_guardedalloc.h" +/* --------------------------------------------------------------------- */ +/* Data definition */ +/* --------------------------------------------------------------------- */ + /* --------------------------------------------------------------------- */ /* local functions */ /* --------------------------------------------------------------------- */ @@ -82,7 +93,7 @@ static const char *check_memlist(MemHead *memh); static volatile int totblock= 0; -static volatile uintptr_t mem_in_use= 0, mmap_in_use= 0; +static volatile uintptr_t mem_in_use= 0, mmap_in_use= 0, peak_mem = 0; static volatile struct localListBase _membase; static volatile struct localListBase *membase = &_membase; @@ -164,7 +175,7 @@ void MEM_set_memory_debug(void) malloc_debug_memset= 1; } -int MEM_allocN_len(void *vmemh) +size_t MEM_allocN_len(void *vmemh) { if (vmemh) { MemHead *memh= vmemh; @@ -175,29 +186,7 @@ int MEM_allocN_len(void *vmemh) return 0; } -void *MEM_reallocN(void *vmemh, unsigned int len) -{ - void *newp= NULL; - - if (vmemh) { - MemHead *memh= vmemh; - memh--; - - newp= MEM_mallocN(len, memh->name); - if(newp) { - if(len < memh->len) - memcpy(newp, vmemh, len); - else - memcpy(newp, vmemh, memh->len); - } - - MEM_freeN(vmemh); - } - - return newp; -} - -void *MEM_dupallocN(void *vmemh) +void *MEM_reallocN(void *vmemh, size_t len) { void *newp= NULL; @@ -205,6 +194,28 @@ void *MEM_dupallocN(void *vmemh) MemHead *memh= vmemh; memh--; + if(memh->mmap) + newp= MEM_mapallocN(len, "dupli_mapalloc"); + else + newp= MEM_mallocN(len, "dupli_alloc"); + + if (newp == NULL) return NULL; + + memcpy(newp, vmemh, len<=memh->len ? len : memh->len); + } + + return newp; +} + + +void *MEM_dupallocN(void *vmemh) +{ + void *newp= NULL; + + if (vmemh) { + MemHead *memh= vmemh; + memh--; + if(memh->mmap) newp= MEM_mapallocN(memh->len, "dupli_mapalloc"); else @@ -218,7 +229,7 @@ void *MEM_dupallocN(void *vmemh) return newp; } -static void make_memhead_header(MemHead *memh, unsigned int len, const char *str) +static void make_memhead_header(MemHead *memh, size_t len, const char *str) { MemTail *memt; @@ -238,9 +249,11 @@ static void make_memhead_header(MemHead *memh, unsigned int len, const char *str totblock++; mem_in_use += len; + + peak_mem = mem_in_use > peak_mem ? mem_in_use : peak_mem; } -void *MEM_mallocN(unsigned int len, const char *str) +void *MEM_mallocN(size_t len, const char *str) { MemHead *memh; @@ -258,11 +271,11 @@ void *MEM_mallocN(unsigned int len, const char *str) return (++memh); } mem_unlock_thread(); - print_error("Malloc returns nill: len=%d in %s, total %u\n",len, str, mem_in_use); + print_error("Malloc returns null: len=" SIZET_FORMAT " in %s, total %u\n", SIZET_ARG(len), str, mem_in_use); return NULL; } -void *MEM_callocN(unsigned int len, const char *str) +void *MEM_callocN(size_t len, const char *str) { MemHead *memh; @@ -278,12 +291,12 @@ void *MEM_callocN(unsigned int len, const char *str) return (++memh); } mem_unlock_thread(); - print_error("Calloc returns nill: len=%d in %s, total %u\n",len, str, mem_in_use); + print_error("Calloc returns null: len=" SIZET_FORMAT " in %s, total %u\n", SIZET_ARG(len), str, mem_in_use); return 0; } /* note; mmap returns zero'd memory */ -void *MEM_mapallocN(unsigned int len, const char *str) +void *MEM_mapallocN(size_t len, const char *str) { MemHead *memh; @@ -311,12 +324,13 @@ void *MEM_mapallocN(unsigned int len, const char *str) make_memhead_header(memh, len, str); memh->mmap= 1; mmap_in_use += len; + peak_mem = mmap_in_use > peak_mem ? mmap_in_use : peak_mem; mem_unlock_thread(); return (++memh); } else { mem_unlock_thread(); - print_error("Mapalloc returns nill, fallback to regular malloc: len=%d in %s, total %u\n",len, str, mmap_in_use); + print_error("Mapalloc returns null, fallback to regular malloc: len=" SIZET_FORMAT " in %s, total %u\n", SIZET_ARG(len), str, mmap_in_use); return MEM_callocN(len, str); } } @@ -399,12 +413,17 @@ void MEM_printmemlist_stats() /* sort by length and print */ qsort(printblock, totpb, sizeof(MemPrintBlock), compare_len); printf("\ntotal memory len: %.3f MB\n", (double)mem_in_use/(double)(1024*1024)); + printf(" ITEMS TOTAL-MiB AVERAGE-KiB TYPE\n"); for(a=0, pb=printblock; aname, pb->items, (double)pb->len/(double)(1024*1024)); + printf("%6d (%8.3f %8.3f) %s\n", pb->items, (double)pb->len/(double)(1024*1024), (double)pb->len/1024.0/(double)pb->items, pb->name); free(printblock); mem_unlock_thread(); + +#if 0 /* GLIBC only */ + malloc_stats(); +#endif } /* Prints in python syntax for easy */ @@ -423,9 +442,13 @@ static void MEM_printmemlist_internal( int pydict ) } while(membl) { if (pydict) { - fprintf(stderr, "{'len':%i, 'name':'''%s''', 'pointer':'%p'},\\\n", membl->len, membl->name, membl+1); + fprintf(stderr, "{'len':" SIZET_FORMAT ", 'name':'''%s''', 'pointer':'%p'},\\\n", SIZET_ARG(membl->len), membl->name, membl+1); } else { - print_error("%s len: %d %p\n",membl->name,membl->len, membl+1); +#ifdef DEBUG_MEMCOUNTER + print_error("%s len: " SIZET_FORMAT " %p, count: %d\n", membl->name, SIZET_ARG(membl->len), membl+1, membl->_count); +#else + print_error("%s len: " SIZET_FORMAT " %p\n", membl->name, SIZET_ARG(membl->len), membl+1); +#endif } if(membl->next) membl= MEMNEXT(membl->next); @@ -745,6 +768,24 @@ static const char *check_memlist(MemHead *memh) return(name); } +uintptr_t MEM_get_peak_memory(void) +{ + uintptr_t _peak_mem; + + mem_lock_thread(); + _peak_mem = peak_mem; + mem_unlock_thread(); + + return _peak_mem; +} + +void MEM_reset_peak_memory(void) +{ + mem_lock_thread(); + peak_mem = 0; + mem_unlock_thread(); +} + uintptr_t MEM_get_memory_in_use(void) { uintptr_t _mem_in_use; diff --git a/intern/guardedalloc/test/simpletest/memtest.c b/intern/guardedalloc/test/simpletest/memtest.c index 51f1f491894..98f943f0d7d 100644 --- a/intern/guardedalloc/test/simpletest/memtest.c +++ b/intern/guardedalloc/test/simpletest/memtest.c @@ -43,10 +43,6 @@ #include #include "MEM_guardedalloc.h" -#ifdef HAVE_CONFIG_H -#include -#endif - static void mem_error_cb(const char *errorStr) { fprintf(stderr, "%s", errorStr); diff --git a/intern/iksolver/intern/IK_QSegment.cpp b/intern/iksolver/intern/IK_QSegment.cpp index 50364f3627f..5de5846cb61 100644 --- a/intern/iksolver/intern/IK_QSegment.cpp +++ b/intern/iksolver/intern/IK_QSegment.cpp @@ -28,9 +28,6 @@ */ #include "IK_QSegment.h" -#ifdef WIN32 -#define _USE_MATH_DEFINES -#endif #include // Utility functions @@ -372,8 +369,8 @@ void IK_QSphericalSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) return; if (axis == 1) { - lmin = MT_clamp(lmin, -M_PI, M_PI); - lmax = MT_clamp(lmax, -M_PI, M_PI); + lmin = MT_clamp(lmin, -MT_PI, MT_PI); + lmax = MT_clamp(lmax, -MT_PI, MT_PI); m_min_y = lmin; m_max_y = lmax; @@ -382,8 +379,8 @@ void IK_QSphericalSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) } else { // clamp and convert to axis angle parameters - lmin = MT_clamp(lmin, -M_PI, M_PI); - lmax = MT_clamp(lmax, -M_PI, M_PI); + lmin = MT_clamp(lmin, -MT_PI, MT_PI); + lmax = MT_clamp(lmax, -MT_PI, MT_PI); lmin = sin(lmin*0.5); lmax = sin(lmax*0.5); @@ -615,8 +612,8 @@ void IK_QRevoluteSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) return; // clamp and convert to axis angle parameters - lmin = MT_clamp(lmin, -M_PI, M_PI); - lmax = MT_clamp(lmax, -M_PI, M_PI); + lmin = MT_clamp(lmin, -MT_PI, MT_PI); + lmax = MT_clamp(lmax, -MT_PI, MT_PI); m_min = lmin; m_max = lmax; @@ -754,8 +751,8 @@ void IK_QSwingSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) return; // clamp and convert to axis angle parameters - lmin = MT_clamp(lmin, -M_PI, M_PI); - lmax = MT_clamp(lmax, -M_PI, M_PI); + lmin = MT_clamp(lmin, -MT_PI, MT_PI); + lmax = MT_clamp(lmax, -MT_PI, MT_PI); lmin = sin(lmin*0.5); lmax = sin(lmax*0.5); @@ -900,8 +897,8 @@ void IK_QElbowSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) return; // clamp and convert to axis angle parameters - lmin = MT_clamp(lmin, -M_PI, M_PI); - lmax = MT_clamp(lmax, -M_PI, M_PI); + lmin = MT_clamp(lmin, -MT_PI, MT_PI); + lmax = MT_clamp(lmax, -MT_PI, MT_PI); lmin = lmin; lmax = lmax; diff --git a/intern/iksolver/intern/TNT/svd.h b/intern/iksolver/intern/TNT/svd.h index 9ca51fa2650..9ae289474a9 100644 --- a/intern/iksolver/intern/TNT/svd.h +++ b/intern/iksolver/intern/TNT/svd.h @@ -349,8 +349,9 @@ void SVD(MaTRiX &A, MaTRiX &U, VecToR &s, MaTRiX &V, VecToR &work1, VecToR &work for (j = k; j < p-1; j++) { typename MaTRiX::value_type t = hypot(f,g); - typename MaTRiX::value_type cs = f/t; - typename MaTRiX::value_type sn = g/t; + /* division by zero checks added to avoid NaN (brecht) */ + typename MaTRiX::value_type cs = (t == 0.0f)? 0.0f: f/t; + typename MaTRiX::value_type sn = (t == 0.0f)? 0.0f: g/t; if (j != k) { e[j-1] = t; } @@ -366,8 +367,9 @@ void SVD(MaTRiX &A, MaTRiX &U, VecToR &s, MaTRiX &V, VecToR &work1, VecToR &work } t = hypot(f,g); - cs = f/t; - sn = g/t; + /* division by zero checks added to avoid NaN (brecht) */ + cs = (t == 0.0f)? 0.0f: f/t; + sn = (t == 0.0f)? 0.0f: g/t; s[j] = t; f = cs*e[j] + sn*s[j+1]; s[j+1] = -sn*e[j] + cs*s[j+1]; diff --git a/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp b/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp index 7b87c69928f..1882038163d 100644 --- a/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp +++ b/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GlutDrawer.h" #include "MT_assert.h" diff --git a/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp b/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp index 9412dc25e42..c7c592204e8 100644 --- a/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp +++ b/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GlutKeyboardManager.h" #include "MT_assert.h" diff --git a/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp b/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp index 79187a7fd1b..98e36af5c79 100644 --- a/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp +++ b/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GlutMouseManager.h" #include "MT_assert.h" diff --git a/intern/iksolver/test/ik_glut_test/intern/main.cpp b/intern/iksolver/test/ik_glut_test/intern/main.cpp index f323648dbd7..f2e91ee9c31 100644 --- a/intern/iksolver/test/ik_glut_test/intern/main.cpp +++ b/intern/iksolver/test/ik_glut_test/intern/main.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_SmartPtr.h" #ifdef USE_QUATERNIONS diff --git a/intern/itasc/Armature.cpp b/intern/itasc/Armature.cpp index 7776b6aa3b6..46d114e6c3f 100644 --- a/intern/itasc/Armature.cpp +++ b/intern/itasc/Armature.cpp @@ -340,11 +340,6 @@ int Armature::addLimitConstraint(const std::string& segment_name, unsigned int d } if ((joint.getNDof() == 1 && dof > 0) || (joint.getNDof() == 2 && dof > 1)) return -1; - if (joint.getType() < Joint::TransX || joint.getType() == Joint::Swing) { - // for rotation joint, the limit is given in degree, convert to radian - _min *= KDL::deg2rad; - _max *= KDL::deg2rad; - } Joint_struct& p_joint = m_joints[segment_it->second.q_nr+dof]; p_joint.min = _min; p_joint.max = _max; diff --git a/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp b/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp index 5b8fc7f37e8..50700e39203 100644 --- a/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp +++ b/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp @@ -20,10 +20,6 @@ * */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_CacheLimiter.h" #include "MEM_CacheLimiterC-Api.h" diff --git a/intern/memutil/intern/MEM_RefCountedC-Api.cpp b/intern/memutil/intern/MEM_RefCountedC-Api.cpp index f990c8d71ee..3c04d3c4531 100644 --- a/intern/memutil/intern/MEM_RefCountedC-Api.cpp +++ b/intern/memutil/intern/MEM_RefCountedC-Api.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_RefCountedC-Api.h" #include "MEM_RefCounted.h" diff --git a/intern/moto/intern/MT_CmMatrix4x4.cpp b/intern/moto/intern/MT_CmMatrix4x4.cpp index ff3693cd7d5..e8342f93dd8 100644 --- a/intern/moto/intern/MT_CmMatrix4x4.cpp +++ b/intern/moto/intern/MT_CmMatrix4x4.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_CmMatrix4x4.h" #include "MT_Vector3.h" #include "MT_Point3.h" diff --git a/intern/moto/intern/MT_Matrix3x3.cpp b/intern/moto/intern/MT_Matrix3x3.cpp index 80bc65fea47..a186ed22296 100644 --- a/intern/moto/intern/MT_Matrix3x3.cpp +++ b/intern/moto/intern/MT_Matrix3x3.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Matrix3x3.h" diff --git a/intern/moto/intern/MT_Matrix4x4.cpp b/intern/moto/intern/MT_Matrix4x4.cpp index 257be4728e8..bab67224cd6 100644 --- a/intern/moto/intern/MT_Matrix4x4.cpp +++ b/intern/moto/intern/MT_Matrix4x4.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Matrix4x4.h" diff --git a/intern/moto/intern/MT_Plane3.cpp b/intern/moto/intern/MT_Plane3.cpp index 0889ede1682..ea64b5c0457 100644 --- a/intern/moto/intern/MT_Plane3.cpp +++ b/intern/moto/intern/MT_Plane3.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef GEN_INLINED #include "MT_Plane3.h" #include "MT_Plane3.inl" diff --git a/intern/moto/intern/MT_Point3.cpp b/intern/moto/intern/MT_Point3.cpp index 8ebeda0098d..882709718fb 100644 --- a/intern/moto/intern/MT_Point3.cpp +++ b/intern/moto/intern/MT_Point3.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Point3.h" diff --git a/intern/moto/intern/MT_Quaternion.cpp b/intern/moto/intern/MT_Quaternion.cpp index 4ed3a9e15c6..c613d72eb5d 100644 --- a/intern/moto/intern/MT_Quaternion.cpp +++ b/intern/moto/intern/MT_Quaternion.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Quaternion.h" diff --git a/intern/moto/intern/MT_Transform.cpp b/intern/moto/intern/MT_Transform.cpp index 986a5c24df0..9d0b371eab2 100644 --- a/intern/moto/intern/MT_Transform.cpp +++ b/intern/moto/intern/MT_Transform.cpp @@ -47,10 +47,6 @@ */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Transform.h" void MT_Transform::setValue(const float *m) { diff --git a/intern/moto/intern/MT_Vector2.cpp b/intern/moto/intern/MT_Vector2.cpp index 54d15f4087c..f7674a1a753 100644 --- a/intern/moto/intern/MT_Vector2.cpp +++ b/intern/moto/intern/MT_Vector2.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Vector2.h" diff --git a/intern/moto/intern/MT_Vector3.cpp b/intern/moto/intern/MT_Vector3.cpp index 5283f1c9e93..da5bd23ce00 100644 --- a/intern/moto/intern/MT_Vector3.cpp +++ b/intern/moto/intern/MT_Vector3.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Vector3.h" diff --git a/intern/moto/intern/MT_Vector4.cpp b/intern/moto/intern/MT_Vector4.cpp index 9625c3ef53d..d3cea173a64 100644 --- a/intern/moto/intern/MT_Vector4.cpp +++ b/intern/moto/intern/MT_Vector4.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_Vector4.h" diff --git a/intern/moto/intern/MT_random.cpp b/intern/moto/intern/MT_random.cpp index aae64391734..b7389497b49 100644 --- a/intern/moto/intern/MT_random.cpp +++ b/intern/moto/intern/MT_random.cpp @@ -55,10 +55,6 @@ /* When you use this, send an email to: matumoto@math.keio.ac.jp */ /* with an appropriate reference to your work. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MT_random.h" /* Period parameters */ diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt index 1ab323fe70d..8579c76b322 100644 --- a/intern/smoke/CMakeLists.txt +++ b/intern/smoke/CMakeLists.txt @@ -24,7 +24,7 @@ # # ***** END GPL LICENSE BLOCK ***** -SET(INC ${ZLIB_INC} ${PNG_INC} intern ../../extern/bullet2/src ../memutil ../guardealloc) +SET(INC ${PNG_INC} ${ZLIB_INC} intern ../../extern/bullet2/src ../memutil ../guardealloc) FILE(GLOB SRC intern/*.cpp) diff --git a/intern/string/STR_String.h b/intern/string/STR_String.h index 19875c27fa4..b24dea1d3c9 100644 --- a/intern/string/STR_String.h +++ b/intern/string/STR_String.h @@ -202,8 +202,8 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "CXX:STR_String"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "CXX:STR_String"); } + void operator delete(void *mem) { MEM_freeN(mem); } #endif }; diff --git a/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj b/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj index f226ad5a72c..29a297d6f6a 100644 --- a/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj +++ b/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj @@ -380,15 +380,18 @@ > + + >>>>>> .merge-right.r30358 RelativePath="..\..\..\source\blender\python\generic\bpy_internal_import.c" > - - + + + + @@ -457,6 +468,57 @@ > +<<<<<<< .working +======= + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> .merge-right.r30358 diff --git a/projectfiles_vc9/blender/blender.sln b/projectfiles_vc9/blender/blender.sln index d5fc95b2583..53b812accf5 100644 --- a/projectfiles_vc9/blender/blender.sln +++ b/projectfiles_vc9/blender/blender.sln @@ -8,6 +8,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blender", "blender.vcproj", {6A51010A-9393-4D77-84B4-5BBCDA6E7C25} = {6A51010A-9393-4D77-84B4-5BBCDA6E7C25} {A90C4918-4B21-4277-93BD-AF65F30951D9} = {A90C4918-4B21-4277-93BD-AF65F30951D9} {FB88301F-F725-401B-ACD7-D2ABBF333B71} = {FB88301F-F725-401B-ACD7-D2ABBF333B71} + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC} = {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC} {76D3102B-7DD2-8BA1-034A-8B19FE2897C2} = {76D3102B-7DD2-8BA1-034A-8B19FE2897C2} {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE} = {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE} {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8} = {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8} @@ -257,6 +258,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "INT_elbeem", "..\..\intern\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "INT_ghost", "..\..\intern\ghost\make\msvc_9_0\ghost.vcproj", "{76D90B92-ECC7-409C-9F98-A8814B90F3C0}" ProjectSection(ProjectDependencies) = postProject + {BAC615B0-F1AF-418B-8D23-A10FD8870D6A} = {BAC615B0-F1AF-418B-8D23-A10FD8870D6A} {B789C2F3-279E-4A85-8F0A-7F7AC068E598} = {B789C2F3-279E-4A85-8F0A-7F7AC068E598} EndProjectSection EndProject @@ -367,8 +369,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BRE_raytrace", "render\BRE_ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BF_collada", "collada\BF_collada.vcproj", "{76D3102B-7DD2-8BA1-034A-8B19FE2897C2}" EndProject +<<<<<<< .working Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BLF_blenfont", "blenfont\BLF_blenfont.vcproj", "{D1A9312F-4557-4982-A0F4-4D08508235F4}" EndProject +======= +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_modifiers", "modifiers\modifiers.vcproj", "{7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}" +EndProject +>>>>>>> .merge-right.r30358 Global GlobalSection(SolutionConfigurationPlatforms) = preSolution 3D Plugin Debug|Win32 = 3D Plugin Debug|Win32 @@ -1600,6 +1607,7 @@ Global {76D3102B-7DD2-8BA1-034A-8B19FE2897C2}.Debug|Win32.Build.0 = Blender Debug|Win32 {76D3102B-7DD2-8BA1-034A-8B19FE2897C2}.Release|Win32.ActiveCfg = Blender Release|Win32 {76D3102B-7DD2-8BA1-034A-8B19FE2897C2}.Release|Win32.Build.0 = Blender Release|Win32 +<<<<<<< .working {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Debug|Win32.ActiveCfg = Blender Debug|Win32 {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Debug|Win32.Build.0 = Blender Debug|Win32 {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Release|Win32.ActiveCfg = Blender Debug|Win32 @@ -1620,6 +1628,28 @@ Global {D1A9312F-4557-4982-A0F4-4D08508235F4}.Debug|Win32.Build.0 = Blender Debug|Win32 {D1A9312F-4557-4982-A0F4-4D08508235F4}.Release|Win32.ActiveCfg = Blender Release|Win32 {D1A9312F-4557-4982-A0F4-4D08508235F4}.Release|Win32.Build.0 = Blender Release|Win32 +======= + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3D Plugin Debug|Win32.ActiveCfg = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Blender Debug|Win32.Build.0 = Blender Debug|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Blender Release|Win32.ActiveCfg = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Blender Release|Win32.Build.0 = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.BlenderPlayer Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.BlenderPlayer Debug|Win32.Build.0 = BlenderPlayer Debug|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.BlenderPlayer Release|Win32.ActiveCfg = BlenderPlayer Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.BlenderPlayer Release|Win32.Build.0 = BlenderPlayer Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Debug|Win32.ActiveCfg = Blender Debug|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Debug|Win32.Build.0 = Blender Debug|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Release|Win32.ActiveCfg = Blender Release|Win32 + {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Release|Win32.Build.0 = Blender Release|Win32 +>>>>>>> .merge-right.r30358 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/projectfiles_vc9/blender/blender.vcproj b/projectfiles_vc9/blender/blender.vcproj index 60824daaa61..e5ca1370ab0 100644 --- a/projectfiles_vc9/blender/blender.vcproj +++ b/projectfiles_vc9/blender/blender.vcproj @@ -1,3 +1,4 @@ +<<<<<<< .working +======= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> .merge-right.r30358 diff --git a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj index b90ab3d6287..f656fb49388 100644 --- a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj +++ b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj @@ -43,7 +43,7 @@ >>>>>> .merge-right.r30358 PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_OPENEXR;WITH_DDS;WITH_BULLET;WITH_FFMPEG;GLEW_STATIC" BasicRuntimeChecks="3" RuntimeLibrary="1" @@ -194,7 +198,11 @@ Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" +<<<<<<< .working AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern;..\..\..\extern\lzo\minilzo;..\..\..\extern\lzma;..\..\..\source\blender\blenfont;..\..\..\source\blender\ikplugin;..\..\..\source\blender\windowmanager;..\..\..\source\blender\bmesh" +======= + AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\modifiers;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern;..\..\..\extern\lzo\minilzo;..\..\..\extern\lzma;..\..\..\source\blender\blenfont;..\..\..\source\blender\ikplugin;..\..\..\source\blender\windowmanager" +>>>>>>> .merge-right.r30358 PreprocessorDefinitions="NDEBUG;WIN32;_LIB;UNWRAPPER;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG;GLEW_STATIC" StringPooling="true" RuntimeLibrary="0" @@ -269,7 +277,7 @@ - - @@ -658,6 +662,10 @@ RelativePath="..\..\..\source\blender\blenkernel\intern\image.c" > + + @@ -770,10 +778,6 @@ RelativePath="..\..\..\source\blender\blenkernel\intern\shrinkwrap.c" > - - diff --git a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj index e5eecf0835c..d0a360a6a9d 100644 --- a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj +++ b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj @@ -1,3 +1,4 @@ +<<<<<<< .working + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>>>>> .merge-right.r30358 RelativePath="..\..\..\source\blender\blenlib\intern\path_util.c" > @@ -612,6 +1229,7 @@ > @@ -769,10 +1387,178 @@ > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >>>>>> .merge-right.r30358 + RelativePath="..\..\..\source\blender\blenlib\BLI_path_util.h" + > + + @@ -813,3 +1599,49 @@ +======= + RelativePath="..\..\..\source\blender\blenlib\BLI_scanfill.h" + > + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> .merge-right.r30358 diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index 9cafa103dda..ae7fc04b766 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -238,6 +238,10 @@ RelativePath="..\..\..\source\blender\editors\include\ED_keyframing.h" > + + @@ -1471,6 +1475,10 @@ RelativePath="..\..\..\source\blender\editors\space_logic\logic_intern.h" > + + @@ -1555,6 +1563,14 @@ RelativePath="..\..\..\source\blender\editors\render\render_intern.h" > + + + + diff --git a/projectfiles_vc9/blender/gpu/BL_gpu.vcproj b/projectfiles_vc9/blender/gpu/BL_gpu.vcproj index a182a3eceb5..d92121aacf6 100644 --- a/projectfiles_vc9/blender/gpu/BL_gpu.vcproj +++ b/projectfiles_vc9/blender/gpu/BL_gpu.vcproj @@ -43,7 +43,7 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -565,6 +521,14 @@ RelativePath="..\..\..\source\blender\imbuf\intern\md5.c" > + + + + @@ -625,6 +589,10 @@ RelativePath="..\..\..\source\blender\imbuf\intern\thumbs.c" > + + @@ -779,62 +747,26 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl" > - - - - - - - - - - - - - - - - - - @@ -844,51 +776,19 @@ > - - - - - - - - - - - - - - - - +======= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> .merge-right.r30358 diff --git a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj index 1860e56e49b..ae04b3e4f57 100644 --- a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj +++ b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj @@ -1,3 +1,4 @@ +<<<<<<< .working +======= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> .merge-right.r30358 diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj new file mode 100644 index 00000000000..3b56775dcf7 --- /dev/null +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj b/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj index 72150cb7752..8c74ec18b41 100644 --- a/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj +++ b/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj @@ -43,7 +43,7 @@ + + + + @@ -775,6 +783,14 @@ RelativePath="..\..\..\source\gameengine\GameLogic\SCA_PythonController.h" > + + + + diff --git a/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj b/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj index 4eb37259785..d3128247281 100644 --- a/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj +++ b/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj @@ -114,7 +114,7 @@ Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\gameengine\Ketsji;..\..\..\source\gameengine\Expressions;..\..\..\source\gameengine\GameLogic;..\..\..\source\gameengine\SceneGraph;..\..\..\source\gameengine\Rasterizer;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\BlenderRoutines;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf;..\..\..\source\blender\python;..\..\..\source\blender\gpu;..\..\..\source\kernel\gen_system;..\..\..\intern\string;..\..\..\intern\moto\include;..\..\..\intern\guardedalloc;..\..\..\intern\SoundSystem;..\..\..\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include" + AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\lib\windows\ffmpeg\include\msvc;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\gameengine\Ketsji;..\..\..\source\gameengine\Expressions;..\..\..\source\gameengine\GameLogic;..\..\..\source\gameengine\SceneGraph;..\..\..\source\gameengine\Rasterizer;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\BlenderRoutines;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\gpu;..\..\..\source\kernel\gen_system;..\..\..\intern\string;..\..\..\intern\moto\include;..\..\..\intern\guardedalloc;..\..\..\intern\SoundSystem;..\..\..\extern\glew\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WITH_FFMPEG;__STDC_CONSTANT_MACROS" StringPooling="true" RuntimeLibrary="0" diff --git a/release/VERSION b/release/VERSION index f838d66c68f..49d0a5da421 100644 --- a/release/VERSION +++ b/release/VERSION @@ -1 +1 @@ -2.5-alpha1 +2.5-alpha2 diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons index 2aee30b407f..b9fa75cc254 100644 Binary files a/release/datafiles/blenderbuttons and b/release/datafiles/blenderbuttons differ diff --git a/release/datafiles/splash.png b/release/datafiles/splash.png index 1894d2c2bdc..78a44ba9cb5 100644 Binary files a/release/datafiles/splash.png and b/release/datafiles/splash.png differ diff --git a/release/freedesktop/blender.desktop b/release/freedesktop/blender.desktop index 39e0e3afe8e..1069958f6f1 100644 --- a/release/freedesktop/blender.desktop +++ b/release/freedesktop/blender.desktop @@ -3,7 +3,7 @@ Encoding=UTF-8 Name=Blender Comment=3D modeling, animation, rendering and post-production Exec=blender -Icon=blender.png +Icon=blender.svg Terminal=false Type=Application Categories=Graphics;3DGraphics; diff --git a/release/getversion.py b/release/getversion.py index 057690f46e9..29622b2154d 100755 --- a/release/getversion.py +++ b/release/getversion.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- mode: python; tab-width: 4; indent-tabs-mode: t; -*- # vim: tabstop=4 -# $Id# +# $Id$ # ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or diff --git a/release/plugins/sequence/blur.c b/release/plugins/sequence/blur.c index 261bfa40351..c23a924ac65 100644 --- a/release/plugins/sequence/blur.c +++ b/release/plugins/sequence/blur.c @@ -160,7 +160,7 @@ void doblur(struct ImBuf *mbuf, float fac, Cast *cast) char *irect, *prect, *mrect; float *irectf, *prectf, *mrectf; - /* wich buffers ? */ + /* which buffers ? */ if(fac>7.0) fac= 7.0; if(fac<=1.0) return; diff --git a/release/scripts/io/engine_render_pov.py b/release/scripts/io/engine_render_pov.py index 338676968cd..9cda4375ecc 100644 --- a/release/scripts/io/engine_render_pov.py +++ b/release/scripts/io/engine_render_pov.py @@ -134,7 +134,7 @@ def write_pov(filename, scene=None, info_callback=None): def exportCamera(): camera = scene.camera - matrix = camera.matrix + matrix = camera.matrix_world # compute resolution Qsize = float(render.resolution_x) / float(render.resolution_y) @@ -155,7 +155,7 @@ def write_pov(filename, scene=None, info_callback=None): for ob in lamps: lamp = ob.data - matrix = ob.matrix + matrix = ob.matrix_world color = tuple([c * lamp.energy for c in lamp.color]) # Colour is modified by energy @@ -263,11 +263,11 @@ def write_pov(filename, scene=None, info_callback=None): writeObjectMaterial(material) - writeMatrix(ob.matrix) + writeMatrix(ob.matrix_world) file.write('}\n') - def exportMeshs(sel): + def exportMeshs(scene, sel): ob_num = 0 @@ -280,7 +280,7 @@ def write_pov(filename, scene=None, info_callback=None): me = ob.data me_materials = me.materials - me = ob.create_mesh(True, 'RENDER') + me = ob.create_mesh(scene, True, 'RENDER') if not me: continue @@ -292,7 +292,7 @@ def write_pov(filename, scene=None, info_callback=None): # continue # me = ob.data - matrix = ob.matrix + matrix = ob.matrix_world try: uv_layer = me.active_uv_texture.data except: @@ -545,7 +545,7 @@ def write_pov(filename, scene=None, info_callback=None): mist = world.mist - if mist.enabled: + if mist.use_mist: file.write('fog {\n') file.write('\tdistance %.6f\n' % mist.depth) file.write('\tcolor rgbt<%.3g, %.3g, %.3g, %.3g>\n' % (tuple(world.horizon_color) + (1 - mist.intensity,))) @@ -593,7 +593,7 @@ def write_pov(filename, scene=None, info_callback=None): sel = scene.objects exportLamps([l for l in sel if l.type == 'LAMP']) exportMeta([l for l in sel if l.type == 'META']) - exportMeshs(sel) + exportMeshs(scene, sel) exportWorld(scene.world) exportGlobalSettings(scene) @@ -629,8 +629,8 @@ def write_pov_ini(filename_ini, filename_pov, filename_image): file.write('Output_File_Type=T\n') # TGA, best progressive loading file.write('Output_Alpha=1\n') - if render.antialiasing: - aa_mapping = {'OVERSAMPLE_5': 2, 'OVERSAMPLE_8': 3, 'OVERSAMPLE_11': 4, 'OVERSAMPLE_16': 5} # method 1 assumed + if render.render_antialiasing: + aa_mapping = {'5': 2, '8': 3, '11': 4, '16': 5} # method 1 assumed file.write('Antialias=1\n') file.write('Antialias_Depth=%d\n' % aa_mapping[render.antialiasing_samples]) else: @@ -762,12 +762,22 @@ class PovrayRender(bpy.types.RenderEngine): if 1: # TODO, when povray isnt found this gives a cryptic error, would be nice to be able to detect if it exists - self._process = subprocess.Popen([pov_binary, self._temp_file_ini]) # stdout=subprocess.PIPE, stderr=subprocess.PIPE + try: + self._process = subprocess.Popen([pov_binary, self._temp_file_ini]) # stdout=subprocess.PIPE, stderr=subprocess.PIPE + except OSError: + # TODO, report api + print("POVRAY: could not execute '%s', possibly povray isn't installed" % pov_binary) + import traceback + traceback.print_exc() + print ("***-DONE-***") + return False + else: # This works too but means we have to wait until its done os.system('%s %s' % (pov_binary, self._temp_file_ini)) print ("***-DONE-***") + return True def _cleanup(self): for f in (self._temp_file_in, self._temp_file_ini, self._temp_file_out): @@ -783,7 +793,10 @@ class PovrayRender(bpy.types.RenderEngine): self.update_stats("", "POVRAY: Exporting data from Blender") self._export(scene) self.update_stats("", "POVRAY: Parsing File") - self._render() + + if not self._render(): + self.update_stats("", "POVRAY: Not found") + return r = scene.render @@ -880,6 +893,30 @@ for member in dir(properties_material): except: pass del properties_material +import properties_data_mesh +for member in dir(properties_data_mesh): + subclass = getattr(properties_data_mesh, member) + try: + subclass.COMPAT_ENGINES.add('POVRAY_RENDER') + except: + pass +del properties_data_mesh +import properties_texture +for member in dir(properties_texture): + subclass = getattr(properties_texture, member) + try: + subclass.COMPAT_ENGINES.add('POVRAY_RENDER') + except: + pass +del properties_texture +import properties_data_camera +for member in dir(properties_data_camera): + subclass = getattr(properties_data_camera, member) + try: + subclass.COMPAT_ENGINES.add('POVRAY_RENDER') + except: + pass +del properties_data_camera class RenderButtonsPanel(bpy.types.Panel): @@ -954,6 +991,7 @@ def register(): for cls in classes: register(cls) + def unregister(): unregister = bpy.types.unregister for cls in classes: @@ -961,4 +999,3 @@ def unregister(): if __name__ == "__main__": register() - diff --git a/release/scripts/io/export_3ds.py b/release/scripts/io/export_3ds.py index b65332c931f..4fd889c75c6 100644 --- a/release/scripts/io/export_3ds.py +++ b/release/scripts/io/export_3ds.py @@ -74,15 +74,15 @@ import bpy # also used by X3D exporter # return a tuple (free, object list), free is True if memory should be freed later with free_derived_objects() -def create_derived_objects(ob): +def create_derived_objects(scene, ob): if ob.parent and ob.parent.dupli_type != 'NONE': return False, None if ob.dupli_type != 'NONE': - ob.create_dupli_list() + ob.create_dupli_list(scene) return True, [(dob.object, dob.matrix) for dob in ob.dupli_list] else: - return False, [(ob, ob.matrix)] + return False, [(ob, ob.matrix_world)] # also used by X3D exporter def free_derived_objects(ob): @@ -494,8 +494,7 @@ def make_material_texture_chunk(id, images): mat_sub = _3ds_chunk(id) def add_image(img): - filename = os.path.basename(image.filename) -# filename = image.filename.split('\\')[-1].split('/')[-1] + filename = os.path.basename(image.filepath) mat_sub_file = _3ds_chunk(MATMAPFILE) mat_sub_file.add_variable("mapfile", _3ds_string(sane_name(filename))) mat_sub.add_subchunk(mat_sub_file) @@ -942,6 +941,8 @@ def save_3ds(filename, context): sce = context.scene # sce= bpy.data.scenes.active + bpy.ops.object.mode_set(mode='OBJECT') + # Initialize the main chunk (primary): primary = _3ds_chunk(PRIMARY) # Add version chunk: @@ -966,11 +967,12 @@ def save_3ds(filename, context): # each material is added once): materialDict = {} mesh_objects = [] - for ob in [ob for ob in context.scene.objects if ob.is_visible()]: + scene = context.scene + for ob in [ob for ob in scene.objects if ob.is_visible(scene)]: # for ob in sce.objects.context: # get derived objects - free, derived = create_derived_objects(ob) + free, derived = create_derived_objects(scene, ob) if derived == None: continue @@ -980,7 +982,7 @@ def save_3ds(filename, context): if ob.type not in ('MESH', 'CURVE', 'SURFACE', 'TEXT', 'META'): continue - data = ob_derived.create_mesh(True, 'PREVIEW') + data = ob_derived.create_mesh(scene, True, 'PREVIEW') # data = getMeshFromObject(ob_derived, None, True, False, sce) if data: data.transform(mat) @@ -1120,12 +1122,11 @@ class Export3DS(bpy.types.Operator): # to the class instance from the operator settings before calling. - # filename = StringProperty(name="File Name", description="File name used for exporting the 3DS file", maxlen= 1024, default= ""), - path = StringProperty(name="File Path", description="File path used for exporting the 3DS file", maxlen= 1024, default= "") + filepath = StringProperty(name="File Path", description="Filepath used for exporting the 3DS file", maxlen= 1024, default= "") check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) def execute(self, context): - save_3ds(self.properties.path, context) + save_3ds(self.properties.filepath, context) return {'FINISHED'} def invoke(self, context, event): @@ -1139,8 +1140,8 @@ class Export3DS(bpy.types.Operator): # Add to a menu def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".3ds") - self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)").path = default_path + default_path = os.path.splitext(bpy.data.filepath)[0] + ".3ds" + self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)").filepath = default_path def register(): @@ -1153,4 +1154,3 @@ def unregister(): if __name__ == "__main__": register() - diff --git a/release/scripts/io/export_fbx.py b/release/scripts/io/export_fbx.py index e1c7f68c557..4505b56b41c 100644 --- a/release/scripts/io/export_fbx.py +++ b/release/scripts/io/export_fbx.py @@ -54,50 +54,11 @@ import time import math # math.pi import shutil # for file copying - - - - - - - - - - - - - - - - - - - - - -# import Blender import bpy -import Mathutils - - - - - - - - - - - - - - - - - - +from mathutils import Vector, Euler, Matrix, RotationMatrix def copy_file(source, dest): + # XXX - remove, can use shutil file = open(source, 'rb') data = file.read() file.close() @@ -114,7 +75,7 @@ def copy_images(dest_dir, textures): image_paths = set() for tex in textures: - image_paths.add(Blender.sys.expandpath(tex.filename)) + image_paths.add(bpy.utils.expandpath(tex.filepath)) # Now copy images copyCount = 0 @@ -135,7 +96,7 @@ def copy_images(dest_dir, textures): # I guess FBX uses degrees instead of radians (Arystan). # Call this function just before writing to FBX. def eulerRadToDeg(eul): - ret = Mathutils.Euler() + ret = Euler() ret.x = 180 / math.pi * eul[0] ret.y = 180 / math.pi * eul[1] @@ -143,10 +104,10 @@ def eulerRadToDeg(eul): return ret -mtx4_identity = Mathutils.Matrix() +mtx4_identity = Matrix() # testing -mtx_x90 = Mathutils.RotationMatrix( math.pi/2, 3, 'X') # used +mtx_x90 = RotationMatrix( math.pi/2, 3, 'X') # used #mtx_x90n = RotationMatrix(-90, 3, 'x') #mtx_y90 = RotationMatrix( 90, 3, 'y') #mtx_y90n = RotationMatrix(-90, 3, 'y') @@ -154,11 +115,11 @@ mtx_x90 = Mathutils.RotationMatrix( math.pi/2, 3, 'X') # used #mtx_z90n = RotationMatrix(-90, 3, 'z') #mtx4_x90 = RotationMatrix( 90, 4, 'x') -mtx4_x90n = Mathutils.RotationMatrix(-math.pi/2, 4, 'X') # used +mtx4_x90n = RotationMatrix(-math.pi/2, 4, 'X') # used #mtx4_y90 = RotationMatrix( 90, 4, 'y') -mtx4_y90n = Mathutils.RotationMatrix(-math.pi/2, 4, 'Y') # used -mtx4_z90 = Mathutils.RotationMatrix( math.pi/2, 4, 'Z') # used -mtx4_z90n = Mathutils.RotationMatrix(-math.pi/2, 4, 'Z') # used +mtx4_y90n = RotationMatrix(-math.pi/2, 4, 'Y') # used +mtx4_z90 = RotationMatrix( math.pi/2, 4, 'Z') # used +mtx4_z90n = RotationMatrix(-math.pi/2, 4, 'Z') # used # def strip_path(p): # return p.split('\\')[-1].split('/')[-1] @@ -333,7 +294,7 @@ def write(filename, batch_objects = None, \ EXP_CAMERA = True, EXP_EMPTY = True, EXP_IMAGE_COPY = False, - GLOBAL_MATRIX = Mathutils.Matrix(), + GLOBAL_MATRIX = Matrix(), ANIM_ENABLE = True, ANIM_OPTIMIZE = True, ANIM_OPTIMIZE_PRECISSION = 6, @@ -344,6 +305,8 @@ def write(filename, batch_objects = None, \ BATCH_OWN_DIR = False ): + bpy.ops.object.mode_set(mode='OBJECT') + # ----------------- Batch support! if BATCH_ENABLE: if os == None: BATCH_OWN_DIR = False @@ -388,7 +351,6 @@ def write(filename, batch_objects = None, \ orig_sce = context.scene # orig_sce = bpy.data.scenes.active - new_fbxpath = fbxpath # own dir option modifies, we need to keep an original for data in data_seq: # scene or group newname = BATCH_FILE_PREFIX + bpy.utils.clean_name(data.name) @@ -545,10 +507,10 @@ def write(filename, batch_objects = None, \ #arm_mat = self.fbxArm.parRelMatrix() if not self.parent: #return mtx4_z90 * (self.getPoseMatrix(frame) * arm_mat) # dont apply arm matrix anymore - return mtx4_z90 * self.getPoseMatrix(frame) + return self.getPoseMatrix(frame) * mtx4_z90 else: #return (mtx4_z90 * ((self.getPoseMatrix(frame) * arm_mat))) * (mtx4_z90 * (self.parent.getPoseMatrix(frame) * arm_mat)).invert() - return (mtx4_z90 * (self.getPoseMatrix(frame))) * (mtx4_z90 * self.parent.getPoseMatrix(frame)).invert() + return (self.parent.getPoseMatrix(frame) * mtx4_z90).invert() * ((self.getPoseMatrix(frame)) * mtx4_z90) # we need thes because cameras and lights modified rotations def getAnimParRelMatrixRot(self, frame): @@ -565,42 +527,41 @@ def write(filename, batch_objects = None, \ self.blenObject = ob self.fbxGroupNames = [] self.fbxParent = None # set later on IF the parent is in the selection. - if matrixWorld: self.matrixWorld = matrixWorld * GLOBAL_MATRIX - else: self.matrixWorld = ob.matrix * GLOBAL_MATRIX + if matrixWorld: self.matrixWorld = GLOBAL_MATRIX * matrixWorld + else: self.matrixWorld = GLOBAL_MATRIX * ob.matrix_world # else: self.matrixWorld = ob.matrixWorld * GLOBAL_MATRIX self.__anim_poselist = {} # we should only access this def parRelMatrix(self): if self.fbxParent: - return self.matrixWorld * self.fbxParent.matrixWorld.copy().invert() + return self.fbxParent.matrixWorld.copy().invert() * self.matrixWorld else: return self.matrixWorld def setPoseFrame(self, f): - self.__anim_poselist[f] = self.blenObject.matrix.copy() -# self.__anim_poselist[f] = self.blenObject.matrixWorld.copy() + self.__anim_poselist[f] = self.blenObject.matrix_world.copy() def getAnimParRelMatrix(self, frame): if self.fbxParent: #return (self.__anim_poselist[frame] * self.fbxParent.__anim_poselist[frame].copy().invert() ) * GLOBAL_MATRIX - return (self.__anim_poselist[frame] * GLOBAL_MATRIX) * (self.fbxParent.__anim_poselist[frame] * GLOBAL_MATRIX).invert() + return (GLOBAL_MATRIX * self.fbxParent.__anim_poselist[frame]).invert() * (GLOBAL_MATRIX * self.__anim_poselist[frame]) else: - return self.__anim_poselist[frame] * GLOBAL_MATRIX + return GLOBAL_MATRIX * self.__anim_poselist[frame] def getAnimParRelMatrixRot(self, frame): type = self.blenObject.type if self.fbxParent: - matrix_rot = (((self.__anim_poselist[frame] * GLOBAL_MATRIX) * (self.fbxParent.__anim_poselist[frame] * GLOBAL_MATRIX).invert())).rotation_part() + matrix_rot = ((GLOBAL_MATRIX * self.fbxParent.__anim_poselist[frame]).invert() * (GLOBAL_MATRIX * self.__anim_poselist[frame])).rotation_part() else: - matrix_rot = (self.__anim_poselist[frame] * GLOBAL_MATRIX).rotation_part() + matrix_rot = (GLOBAL_MATRIX * self.__anim_poselist[frame]).rotation_part() # Lamps need to be rotated if type =='LAMP': - matrix_rot = mtx_x90 * matrix_rot + matrix_rot = matrix_rot * mtx_x90 elif type =='CAMERA': # elif ob and type =='Camera': - y = Mathutils.Vector(0,1,0) * matrix_rot - matrix_rot = matrix_rot * Mathutils.RotationMatrix(math.pi/2, 3, y) + y = matrix_rot * Vector((0.0, 1.0, 0.0)) + matrix_rot = RotationMatrix(math.pi/2, 3, y) * matrix_rot return matrix_rot @@ -651,7 +612,7 @@ def write(filename, batch_objects = None, \ }''' % (curtime)) file.write('\nCreationTime: "%.4i-%.2i-%.2i %.2i:%.2i:%.2i:000"' % curtime) - file.write('\nCreator: "Blender3D version %s"' % bpy.app.version_string) + file.write('\nCreator: "Blender version %s"' % bpy.app.version_string) pose_items = [] # list of (fbxName, matrix) to write pose data for, easier to collect allong the way @@ -666,15 +627,15 @@ def write(filename, batch_objects = None, \ # we know we have a matrix # matrix = mtx4_z90 * (ob.matrix['ARMATURESPACE'] * matrix_mod) - matrix = mtx4_z90 * ob.matrix_local # dont apply armature matrix anymore + matrix = ob.matrix_local * mtx4_z90 # dont apply armature matrix anymore # matrix = mtx4_z90 * ob.matrix['ARMATURESPACE'] # dont apply armature matrix anymore parent = ob.parent if parent: #par_matrix = mtx4_z90 * (parent.matrix['ARMATURESPACE'] * matrix_mod) - par_matrix = mtx4_z90 * parent.matrix_local # dont apply armature matrix anymore + par_matrix = parent.matrix_local * mtx4_z90 # dont apply armature matrix anymore # par_matrix = mtx4_z90 * parent.matrix['ARMATURESPACE'] # dont apply armature matrix anymore - matrix = matrix * par_matrix.copy().invert() + matrix = par_matrix.copy().invert() * matrix matrix_rot = matrix.rotation_part() @@ -684,7 +645,7 @@ def write(filename, batch_objects = None, \ else: # This is bad because we need the parent relative matrix from the fbx parent (if we have one), dont use anymore - #if ob and not matrix: matrix = ob.matrixWorld * GLOBAL_MATRIX + #if ob and not matrix: matrix = ob.matrix_world * GLOBAL_MATRIX if ob and not matrix: raise Exception("error: this should never happen!") matrix_rot = matrix @@ -698,11 +659,11 @@ def write(filename, batch_objects = None, \ matrix_rot = matrix.rotation_part() # Lamps need to be rotated if ob and ob.type =='Lamp': - matrix_rot = mtx_x90 * matrix_rot + matrix_rot = matrix_rot * mtx_x90 rot = tuple(matrix_rot.to_euler()) elif ob and ob.type =='Camera': - y = Mathutils.Vector(0,1,0) * matrix_rot - matrix_rot = matrix_rot * Mathutils.RotationMatrix(math.pi/2, 3, y) + y = matrix_rot * Vector((0.0, 1.0, 0.0)) + matrix_rot = RotationMatrix(math.pi/2, 3, y) * matrix_rot rot = tuple(matrix_rot.to_euler()) else: rot = tuple(matrix_rot.to_euler()) @@ -1087,8 +1048,8 @@ def write(filename, batch_objects = None, \ file.write('\n\t\tTypeFlags: "Camera"') file.write('\n\t\tGeometryVersion: 124') file.write('\n\t\tPosition: %.6f,%.6f,%.6f' % loc) - file.write('\n\t\tUp: %.6f,%.6f,%.6f' % tuple(Mathutils.Vector(0,1,0) * matrix_rot) ) - file.write('\n\t\tLookAt: %.6f,%.6f,%.6f' % tuple(Mathutils.Vector(0,0,-1)*matrix_rot) ) + file.write('\n\t\tUp: %.6f,%.6f,%.6f' % tuple(matrix_rot * Vector((0.0, 1.0, 0.0)))) + file.write('\n\t\tLookAt: %.6f,%.6f,%.6f' % tuple(matrix_rot * Vector((0.0, 0.0, -1.0)))) #file.write('\n\t\tUp: 0,0,0' ) #file.write('\n\t\tLookAt: 0,0,0' ) @@ -1293,7 +1254,7 @@ def write(filename, batch_objects = None, \ file.write('\n\t}') def copy_image(image): - fn = bpy.utils.expandpath(image.filename) + fn = bpy.utils.expandpath(image.filepath) fn_strip = os.path.basename(fn) if EXP_IMAGE_COPY: @@ -1320,7 +1281,7 @@ def write(filename, batch_objects = None, \ Property: "Height", "int", "",0''') if tex: fname_rel, fname_strip = copy_image(tex) -# fname, fname_strip, fname_rel = derived_paths(tex.filename, basepath, EXP_IMAGE_COPY) +# fname, fname_strip, fname_rel = derived_paths(tex.filepath, basepath, EXP_IMAGE_COPY) else: fname = fname_strip = fname_rel = '' @@ -1385,7 +1346,7 @@ def write(filename, batch_objects = None, \ if tex: fname_rel, fname_strip = copy_image(tex) -# fname, fname_strip, fname_rel = derived_paths(tex.filename, basepath, EXP_IMAGE_COPY) +# fname, fname_strip, fname_rel = derived_paths(tex.filepath, basepath, EXP_IMAGE_COPY) else: fname = fname_strip = fname_rel = '' @@ -1485,10 +1446,10 @@ def write(filename, batch_objects = None, \ if my_mesh.fbxParent: # TODO FIXME, this case is broken in some cases. skinned meshes just shouldnt have parents where possible! - m = mtx4_z90 * (my_bone.restMatrix * my_bone.fbxArm.matrixWorld.copy() * my_mesh.matrixWorld.copy().invert() ) + m = (my_mesh.matrixWorld.copy().invert() * my_bone.fbxArm.matrixWorld.copy() * my_bone.restMatrix) * mtx4_z90 else: # Yes! this is it... - but dosnt work when the mesh is a. - m = mtx4_z90 * (my_bone.restMatrix * my_bone.fbxArm.matrixWorld.copy() * my_mesh.matrixWorld.copy().invert() ) + m = (my_mesh.matrixWorld.copy().invert() * my_bone.fbxArm.matrixWorld.copy() * my_bone.restMatrix) * mtx4_z90 #m = mtx4_z90 * my_bone.restMatrix matstr = mat4x4str(m) @@ -1542,17 +1503,14 @@ def write(filename, batch_objects = None, \ file.write('\n\t\tPolygonVertexIndex: ') i=-1 for f in me.faces: - fi = f.verts - # fi = [v_index for j, v_index in enumerate(f.verts) if v_index != 0 or j != 3] -# fi = [v.index for v in f] + fi = f.verts[:] - # flip the last index, odd but it looks like - # this is how fbx tells one face from another - fi[-1] = -(fi[-1]+1) + # last index XORd w. -1 indicates end of face + fi[-1] = fi[-1] ^ -1 fi = tuple(fi) + if i==-1: if len(fi) == 3: file.write('%i,%i,%i' % fi ) -# if len(f) == 3: file.write('%i,%i,%i' % fi ) else: file.write('%i,%i,%i,%i' % fi ) i=0 else: @@ -1560,10 +1518,26 @@ def write(filename, batch_objects = None, \ file.write('\n\t\t') i=0 if len(fi) == 3: file.write(',%i,%i,%i' % fi ) -# if len(f) == 3: file.write(',%i,%i,%i' % fi ) else: file.write(',%i,%i,%i,%i' % fi ) i+=1 + # write loose edges as faces. + for ed in me.edges: + if ed.loose: + ed_val = ed.verts[:] + ed_val = ed_val[0], ed_val[-1] ^ -1 + + if i==-1: + file.write('%i,%i' % ed_val) + i=0 + else: + if i==13: + file.write('\n\t\t') + i=0 + file.write(',%i,%i' % ed_val) + i+=1 + + file.write('\n\t\tEdges: ') i=-1 for ed in me.edges: @@ -2036,12 +2010,11 @@ def write(filename, batch_objects = None, \ if ob_arms_orig_rest: for ob_base in bpy.data.objects: - #if ob_base.type == 'Armature': - ob_base.make_display_list() -# ob_base.makeDisplayList() + if ob_base.type == 'ARMATURE': + ob_base.update(scene) # This causes the makeDisplayList command to effect the mesh - scene.set_frame(scene.current_frame) + scene.set_frame(scene.frame_current) # Blender.Set('curframe', Blender.Get('curframe')) @@ -2051,9 +2024,9 @@ def write(filename, batch_objects = None, \ if ob_base.parent and ob_base.parent.dupli_type != 'NONE': continue - obs = [(ob_base, ob_base.matrix)] + obs = [(ob_base, ob_base.matrix_world)] if ob_base.dupli_type != 'NONE': - ob_base.create_dupli_list() + ob_base.create_dupli_list(scene) obs = [(dob.object, dob.matrix) for dob in ob_base.dupli_list] for ob, mtx in obs: @@ -2082,7 +2055,7 @@ def write(filename, batch_objects = None, \ if tmp_ob_type != 'MESH': # if tmp_ob_type != 'Mesh': # me = bpy.data.meshes.new() - try: me = ob.create_mesh(True, 'PREVIEW') + try: me = ob.create_mesh(scene, True, 'PREVIEW') # try: me.getFromObject(ob) except: me = None if me: @@ -2093,7 +2066,7 @@ def write(filename, batch_objects = None, \ # Mesh Type! if EXP_MESH_APPLY_MOD: # me = bpy.data.meshes.new() - me = ob.create_mesh(True, 'PREVIEW') + me = ob.create_mesh(scene, True, 'PREVIEW') # me.getFromObject(ob) # so we keep the vert groups @@ -2212,11 +2185,9 @@ def write(filename, batch_objects = None, \ if ob_arms_orig_rest: for ob_base in bpy.data.objects: if ob_base.type == 'ARMATURE': -# if ob_base.type == 'Armature': - ob_base.make_display_list() -# ob_base.makeDisplayList() + ob_base.update(scene) # This causes the makeDisplayList command to effect the mesh - scene.set_frame(scene.current_frame) + scene.set_frame(scene.frame_current) # Blender.Set('curframe', Blender.Get('curframe')) del tmp_ob_type, tmp_objects @@ -2701,9 +2672,9 @@ Connections: {''') return int(0.5 + ((t/fps) * 46186158000)) fps = float(render.fps) - start = scene.start_frame + start = scene.frame_start # start = render.sFrame - end = scene.end_frame + end = scene.frame_end # end = render.eFrame if end < start: start, end = end, start if start==end: ANIM_ENABLE = False @@ -2713,7 +2684,7 @@ Connections: {''') if ANIM_ENABLE and [tmp for tmp in ob_anim_lists if tmp]: - frame_orig = scene.current_frame + frame_orig = scene.frame_current # frame_orig = Blender.Get('curframe') if ANIM_OPTIMIZE: @@ -2812,7 +2783,7 @@ Takes: {''') # Set the action active for my_bone in ob_arms: if blenAction in my_bone.blenActionList: - ob.action = blenAction + ob.animation_data.action = blenAction # print '\t\tSetting Action!', blenAction # scene.update(1) @@ -2969,7 +2940,7 @@ Takes: {''') # end action loop. set original actions # do this after every loop incase actions effect eachother. for my_bone in ob_arms: - my_bone.blenObject.action = my_bone.blenAction + my_bone.blenObject.animation_data.action = my_bone.blenAction file.write('\n}') @@ -2998,8 +2969,7 @@ Takes: {''') # --------------------------- Footer if world: m = world.mist - has_mist = m.enabled -# has_mist = world.mode & 1 + has_mist = m.use_mist mist_intense = m.intensity mist_start = m.start mist_end = m.depth @@ -3150,9 +3120,9 @@ def fbx_ui_write(filename, context): # Make the matrix GLOBAL_MATRIX = mtx4_identity GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = GLOBALS['_SCALE'].val - if GLOBALS['_XROT90'].val: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_x90n - if GLOBALS['_YROT90'].val: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_y90n - if GLOBALS['_ZROT90'].val: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_z90n + if GLOBALS['_XROT90'].val: GLOBAL_MATRIX = mtx4_x90n * GLOBAL_MATRIX + if GLOBALS['_YROT90'].val: GLOBAL_MATRIX = mtx4_y90n * GLOBAL_MATRIX + if GLOBALS['_ZROT90'].val: GLOBAL_MATRIX = mtx4_z90n * GLOBAL_MATRIX ret = write(\ filename, None,\ @@ -3364,7 +3334,7 @@ class ExportFBX(bpy.types.Operator): # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for exporting the FBX file", maxlen= 1024, default="") + filepath = StringProperty(name="File Path", description="Filepath used for exporting the FBX file", maxlen= 1024, default="") check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) EXP_OBS_SELECTED = BoolProperty(name="Selected Objects", description="Export selected objects on visible layers", default=True) @@ -3398,16 +3368,16 @@ class ExportFBX(bpy.types.Operator): return context.active_object def execute(self, context): - if not self.properties.path: - raise Exception("path not set") + if not self.properties.filepath: + raise Exception("filepath not set") GLOBAL_MATRIX = mtx4_identity GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = self.properties.TX_SCALE - if self.properties.TX_XROT90: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_x90n - if self.properties.TX_YROT90: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_y90n - if self.properties.TX_ZROT90: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_z90n + if self.properties.TX_XROT90: GLOBAL_MATRIX = mtx4_x90n * GLOBAL_MATRIX + if self.properties.TX_YROT90: GLOBAL_MATRIX = mtx4_y90n * GLOBAL_MATRIX + if self.properties.TX_ZROT90: GLOBAL_MATRIX = mtx4_z90n * GLOBAL_MATRIX - write(self.properties.path, + write(self.properties.filepath, None, # XXX context, self.properties.EXP_OBS_SELECTED, @@ -3440,7 +3410,7 @@ class ExportFBX(bpy.types.Operator): # if __name__ == "__main__": -# bpy.ops.EXPORT_OT_ply(filename="/tmp/test.ply") +# bpy.ops.EXPORT_OT_ply(filepath="/tmp/test.ply") # NOTES (all line numbers correspond to original export_fbx.py (under release/scripts) @@ -3467,8 +3437,8 @@ class ExportFBX(bpy.types.Operator): def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".fbx") - self.layout.operator(ExportFBX.bl_idname, text="Autodesk FBX (.fbx)").path = default_path + default_path = os.path.splitext(bpy.data.filepath)[0] + ".fbx" + self.layout.operator(ExportFBX.bl_idname, text="Autodesk FBX (.fbx)").filepath = default_path def register(): diff --git a/release/scripts/io/export_mdd.py b/release/scripts/io/export_mdd.py index a4dca4db204..d2e53070910 100644 --- a/release/scripts/io/export_mdd.py +++ b/release/scripts/io/export_mdd.py @@ -48,7 +48,7 @@ Be sure not to use modifiers that change the number or order of verts in the mes # ***** END GPL LICENCE BLOCK ***** import bpy -import Mathutils +import mathutils from struct import pack @@ -82,12 +82,12 @@ def write(filename, sce, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS): bpy.ops.object.mode_set(mode='OBJECT') - orig_frame = sce.current_frame + orig_frame = sce.frame_current sce.set_frame(PREF_STARTFRAME) - me = ob.create_mesh(True, 'PREVIEW') + me = ob.create_mesh(sce, True, 'PREVIEW') #Flip y and z - mat_flip = Mathutils.Matrix(\ + mat_flip = mathutils.Matrix(\ [1.0, 0.0, 0.0, 0.0],\ [0.0, 0.0, 1.0, 0.0],\ [0.0, 1.0, 0.0, 0.0],\ @@ -113,7 +113,7 @@ def write(filename, sce, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS): """ check_vertcount(me, numverts) - me.transform(mat_flip * ob.matrix) + me.transform(mat_flip * ob.matrix_world) f.write(pack(">%df" % (numverts * 3), *[axis for v in me.verts for axis in v.co])) for frame in range(PREF_STARTFRAME, PREF_ENDFRAME + 1):#in order to start at desired frame @@ -123,9 +123,9 @@ def write(filename, sce, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS): """ sce.set_frame(frame) - me = ob.create_mesh(True, 'PREVIEW') + me = ob.create_mesh(sce, True, 'PREVIEW') check_vertcount(me, numverts) - me.transform(mat_flip * ob.matrix) + me.transform(mat_flip * ob.matrix_world) # Write the vertex data f.write(pack(">%df" % (numverts * 3), *[axis for v in me.verts for axis in v.co])) @@ -159,21 +159,21 @@ class ExportMDD(bpy.types.Operator): # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for exporting the MDD file", maxlen=1024) + filepath = StringProperty(name="File Path", description="Filepath used for exporting the MDD file", maxlen=1024) check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) fps = IntProperty(name="Frames Per Second", description="Number of frames/second", min=minfps, max=maxfps, default=25) - start_frame = IntProperty(name="Start Frame", description="Start frame for baking", min=minframe, max=maxframe, default=1) - end_frame = IntProperty(name="End Frame", description="End frame for baking", min=minframe, max=maxframe, default=250) + frame_start = IntProperty(name="Start Frame", description="Start frame for baking", min=minframe, max=maxframe, default=1) + frame_end = IntProperty(name="End Frame", description="End frame for baking", min=minframe, max=maxframe, default=250) def poll(self, context): ob = context.active_object return (ob and ob.type == 'MESH') def execute(self, context): - if not self.properties.path: + if not self.properties.filepath: raise Exception("filename not set") - write(self.properties.path, context.scene, context.active_object, - self.properties.start_frame, self.properties.end_frame, self.properties.fps) + write(self.properties.filepath, context.scene, context.active_object, + self.properties.frame_start, self.properties.frame_end, self.properties.fps) return {'FINISHED'} def invoke(self, context, event): @@ -183,18 +183,19 @@ class ExportMDD(bpy.types.Operator): def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".mdd") - self.layout.operator(ExportMDD.bl_idname, text="Lightwave Point Cache (.mdd)").path = default_path + import os + default_path = os.path.splitext(bpy.data.filepath)[0] + ".mdd" + self.layout.operator(ExportMDD.bl_idname, text="Lightwave Point Cache (.mdd)").filepath = default_path def register(): bpy.types.register(ExportMDD) bpy.types.INFO_MT_file_export.append(menu_func) + def unregister(): bpy.types.unregister(ExportMDD) bpy.types.INFO_MT_file_export.remove(menu_func) if __name__ == "__main__": register() - diff --git a/release/scripts/io/export_obj.py b/release/scripts/io/export_obj.py index 046ae9ecf99..626b92c3591 100644 --- a/release/scripts/io/export_obj.py +++ b/release/scripts/io/export_obj.py @@ -47,7 +47,7 @@ import time import shutil import bpy -import Mathutils +import mathutils # Returns a tuple - path,extension. @@ -65,19 +65,15 @@ def fixName(name): else: return name.replace(' ', '_') -# A Dict of Materials -# (material.name, image.name):matname_imagename # matname_imagename has gaps removed. -MTL_DICT = {} - -def write_mtl(scene, filename, copy_images): +def write_mtl(scene, filepath, copy_images, mtl_dict): world = scene.world worldAmb = world.ambient_color - dest_dir = os.path.dirname(filename) + dest_dir = os.path.dirname(filepath) def copy_image(image): - fn = bpy.utils.expandpath(image.filename) + fn = bpy.utils.expandpath(image.filepath) fn_strip = os.path.basename(fn) if copy_images: rel = fn_strip @@ -90,12 +86,12 @@ def write_mtl(scene, filename, copy_images): return rel - file = open(filename, "w") + file = open(filepath, "w") # XXX -# file.write('# Blender3D MTL File: %s\n' % Blender.Get('filename').split('\\')[-1].split('/')[-1]) - file.write('# Material Count: %i\n' % len(MTL_DICT)) +# file.write('# Blender MTL File: %s\n' % Blender.Get('filepath').split('\\')[-1].split('/')[-1]) + file.write('# Material Count: %i\n' % len(mtl_dict)) # Write material/image combinations we have used. - for key, (mtl_mat_name, mat, img) in MTL_DICT.items(): + for key, (mtl_mat_name, mat, img) in mtl_dict.items(): # Get the Blender data for the material and the image. # Having an image named None will make a bug, dont do it :) @@ -135,15 +131,15 @@ def write_mtl(scene, filename, copy_images): # write relative image path rel = copy_image(img) file.write('map_Kd %s\n' % rel) # Diffuse mapping image -# file.write('map_Kd %s\n' % img.filename.split('\\')[-1].split('/')[-1]) # Diffuse mapping image +# file.write('map_Kd %s\n' % img.filepath.split('\\')[-1].split('/')[-1]) # Diffuse mapping image elif mat: # No face image. if we havea material search for MTex image. for mtex in mat.texture_slots: if mtex and mtex.texture.type == 'IMAGE': try: - filename = copy_image(mtex.texture.image) -# filename = mtex.texture.image.filename.split('\\')[-1].split('/')[-1] - file.write('map_Kd %s\n' % filename) # Diffuse mapping image + filepath = copy_image(mtex.texture.image) +# filepath = mtex.texture.image.filepath.split('\\')[-1].split('/')[-1] + file.write('map_Kd %s\n' % filepath) # Diffuse mapping image break except: # Texture has no image though its an image type, best ignore. @@ -173,7 +169,7 @@ def copy_images(dest_dir): # Get unique image names uniqueImages = {} - for matname, mat, image in MTL_DICT.values(): # Only use image name + for matname, mat, image in mtl_dict.values(): # Only use image name # Get Texface images if image: uniqueImages[image] = image # Should use sets here. wait until Python 2.4 is default. @@ -193,7 +189,7 @@ def copy_images(dest_dir): copyCount = 0 # for bImage in uniqueImages.values(): -# image_path = bpy.utils.expandpath(bImage.filename) +# image_path = bpy.utils.expandpath(bImage.filepath) # if bpy.sys.exists(image_path): # # Make a name for the target path. # dest_image_path = dest_dir + image_path.split('\\')[-1].split('/')[-1] @@ -225,7 +221,7 @@ def write_nurb(file, ob, ob_mat): cu = ob.data # use negative indices - Vector = Blender.Mathutils.Vector + Vector = Blender.mathutils.Vector for nu in cu: if nu.type==0: DEG_ORDER_U = 1 @@ -286,7 +282,7 @@ def write_nurb(file, ob, ob_mat): return tot_verts -def write(filename, objects, scene, +def write(filepath, objects, scene, EXPORT_TRI=False, EXPORT_EDGES=False, EXPORT_NORMALS=False, @@ -355,26 +351,26 @@ def write(filename, objects, scene, return ret - print('OBJ Export path: "%s"' % filename) + print('OBJ Export path: "%s"' % filepath) temp_mesh_name = '~tmp-mesh' time1 = time.clock() # time1 = sys.time() # scn = Scene.GetCurrent() - file = open(filename, "w") + file = open(filepath, "w") # Write Header - file.write('# Blender3D v%s OBJ File: %s\n' % (bpy.app.version_string, bpy.data.filename.split('/')[-1].split('\\')[-1] )) - file.write('# www.blender3d.org\n') + file.write('# Blender v%s OBJ File: %s\n' % (bpy.app.version_string, bpy.data.filepath.split('/')[-1].split('\\')[-1] )) + file.write('# www.blender.org\n') # Tell the obj file what material file to use. if EXPORT_MTL: - mtlfilename = '%s.mtl' % '.'.join(filename.split('.')[:-1]) - file.write('mtllib %s\n' % ( mtlfilename.split('\\')[-1].split('/')[-1] )) + mtlfilepath = '%s.mtl' % '.'.join(filepath.split('.')[:-1]) + file.write('mtllib %s\n' % ( mtlfilepath.split('\\')[-1].split('/')[-1] )) if EXPORT_ROTX90: - mat_xrot90= Mathutils.RotationMatrix(-math.pi/2, 4, 'X') + mat_xrot90= mathutils.RotationMatrix(-math.pi/2, 4, 'X') # Initialize totals, these are updated each object totverts = totuvco = totno = 1 @@ -383,6 +379,10 @@ def write(filename, objects, scene, globalNormals = {} + # A Dict of Materials + # (material.name, image.name):matname_imagename # matname_imagename has gaps removed. + mtl_dict = {} + # Get all meshes for ob_main in objects: @@ -396,14 +396,14 @@ def write(filename, objects, scene, if ob_main.dupli_type != 'NONE': # XXX print('creating dupli_list on', ob_main.name) - ob_main.create_dupli_list() + ob_main.create_dupli_list(scene) obs = [(dob.object, dob.matrix) for dob in ob_main.dupli_list] # XXX debug print print(ob_main.name, 'has', len(obs), 'dupli children') else: - obs = [(ob_main, ob_main.matrix)] + obs = [(ob_main, ob_main.matrix_world)] for ob, ob_mat in obs: @@ -421,7 +421,7 @@ def write(filename, objects, scene, if ob.type != 'MESH': continue - me = ob.create_mesh(EXPORT_APPLY_MODIFIERS, 'PREVIEW') + me = ob.create_mesh(scene, EXPORT_APPLY_MODIFIERS, 'PREVIEW') if EXPORT_ROTX90: me.transform(mat_xrot90 * ob_mat) @@ -691,7 +691,7 @@ def write(filename, objects, scene, file.write('usemtl (null)\n') # mat, image else: - mat_data= MTL_DICT.get(key) + mat_data= mtl_dict.get(key) if not mat_data: # First add to global dict so we can export to mtl # Then write mtl @@ -701,9 +701,9 @@ def write(filename, objects, scene, # If none image dont bother adding it to the name if key[1] == None: - mat_data = MTL_DICT[key] = ('%s'%fixName(key[0])), materialItems[f_mat], f_image + mat_data = mtl_dict[key] = ('%s'%fixName(key[0])), materialItems[f_mat], f_image else: - mat_data = MTL_DICT[key] = ('%s_%s' % (fixName(key[0]), fixName(key[1]))), materialItems[f_mat], f_image + mat_data = mtl_dict[key] = ('%s_%s' % (fixName(key[0]), fixName(key[1]))), materialItems[f_mat], f_image if EXPORT_GROUP_BY_MAT: file.write('g %s_%s_%s\n' % (fixName(ob.name), fixName(ob.data.name), mat_data[0]) ) # can be mat_image or (null) @@ -782,22 +782,22 @@ def write(filename, objects, scene, # Now we have all our materials, save them if EXPORT_MTL: - write_mtl(scene, mtlfilename, EXPORT_COPY_IMAGES) + write_mtl(scene, mtlfilepath, EXPORT_COPY_IMAGES, mtl_dict) # if EXPORT_COPY_IMAGES: -# dest_dir = os.path.basename(filename) -# # dest_dir = filename +# dest_dir = os.path.basename(filepath) +# # dest_dir = filepath # # # Remove chars until we are just the path. # # while dest_dir and dest_dir[-1] not in '\\/': # # dest_dir = dest_dir[:-1] # if dest_dir: -# copy_images(dest_dir) +# copy_images(dest_dir, mtl_dict) # else: -# print('\tError: "%s" could not be used as a base for an image path.' % filename) +# print('\tError: "%s" could not be used as a base for an image path.' % filepath) print("OBJ Export time: %.2f" % (time.clock() - time1)) # print "OBJ Export time: %.2f" % (sys.time() - time1) -def do_export(filename, context, +def do_export(filepath, context, EXPORT_APPLY_MODIFIERS = True, # not used EXPORT_ROTX90 = True, # wrong EXPORT_TRI = False, # ok @@ -816,14 +816,15 @@ def do_export(filename, context, EXPORT_KEEP_VERT_ORDER = False, EXPORT_POLYGROUPS = False, EXPORT_CURVE_AS_NURBS = True): - # Window.EditMode(0) - # Window.WaitCursor(1) - - base_name, ext = splitExt(filename) + + base_name, ext = splitExt(filepath) context_name = [base_name, '', '', ext] # Base name, scene name, frame number, extension orig_scene = context.scene + # Exit edit mode before exporting, so current object states are exported properly. + bpy.ops.object.mode_set(mode='OBJECT') + # if EXPORT_ALL_SCENES: # export_scenes = bpy.data.scenes # else: @@ -839,23 +840,23 @@ def do_export(filename, context, for scn in export_scenes: # scn.makeCurrent() # If already current, this is not slow. # context = scn.getRenderingContext() - orig_frame = scn.current_frame + orig_frame = scn.frame_current if EXPORT_ALL_SCENES: # Add scene name into the context_name context_name[1] = '_%s' % bpy.utils.clean_name(scn.name) # WARNING, its possible that this could cause a collision. we could fix if were feeling parranoied. # Export an animation? if EXPORT_ANIMATION: - scene_frames = range(scn.start_frame, context.end_frame+1) # Up to and including the end frame. + scene_frames = range(scn.frame_start, context.frame_end + 1) # Up to and including the end frame. else: scene_frames = [orig_frame] # Dont export an animation. # Loop through all frames in the scene and export. for frame in scene_frames: - if EXPORT_ANIMATION: # Add frame to the filename. + if EXPORT_ANIMATION: # Add frame to the filepath. context_name[2] = '_%.6d' % frame - scn.current_frame = frame + scn.frame_current = frame if EXPORT_SEL_ONLY: export_objects = context.selected_objects else: @@ -874,7 +875,7 @@ def do_export(filename, context, EXPORT_POLYGROUPS, EXPORT_CURVE_AS_NURBS) - scn.current_frame = orig_frame + scn.frame_current = orig_frame # Restore old active scene. # orig_scene.makeCurrent() @@ -899,7 +900,7 @@ class ExportOBJ(bpy.types.Operator): # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for exporting the OBJ file", maxlen= 1024, default= "") + filepath = StringProperty(name="File Path", description="Filepath used for exporting the OBJ file", maxlen= 1024, default= "") check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) # context group @@ -931,11 +932,11 @@ class ExportOBJ(bpy.types.Operator): def execute(self, context): - path = self.properties.path - if not path.lower().endswith(".obj"): - path += ".obj" + filepath = self.properties.filepath + if not filepath.lower().endswith(".obj"): + filepath += ".obj" - do_export(path, context, + do_export(filepath, context, EXPORT_TRI=self.properties.use_triangles, EXPORT_EDGES=self.properties.use_edges, EXPORT_NORMALS=self.properties.use_normals, @@ -963,8 +964,8 @@ class ExportOBJ(bpy.types.Operator): def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".obj") - self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)").path = default_path + default_path = os.path.splitext(bpy.data.filepath)[0] + ".obj" + self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)").filepath = default_path def register(): diff --git a/release/scripts/io/export_ply.py b/release/scripts/io/export_ply.py index 92d4f2ff914..0b936bdceb2 100644 --- a/release/scripts/io/export_ply.py +++ b/release/scripts/io/export_ply.py @@ -99,10 +99,11 @@ def write(filename, scene, ob, \ Window.WaitCursor(1) """ + bpy.ops.object.mode_set(mode='OBJECT') #mesh = BPyMesh.getMeshFromObject(ob, None, EXPORT_APPLY_MODIFIERS, False, scn) # XXX if EXPORT_APPLY_MODIFIERS: - mesh = ob.create_mesh(True, 'PREVIEW') + mesh = ob.create_mesh(scene, True, 'PREVIEW') else: mesh = ob.data @@ -110,7 +111,7 @@ def write(filename, scene, ob, \ raise ("Error, could not get mesh data from active object") return - # mesh.transform(ob.matrixWorld) # XXX + # mesh.transform(ob.matrix_world) # XXX faceUV = (len(mesh.uv_textures) > 0) vertexUV = (len(mesh.sticky) > 0) @@ -202,7 +203,7 @@ def write(filename, scene, ob, \ file.write('ply\n') file.write('format ascii 1.0\n') - file.write('comment Created by Blender3D %s - www.blender.org, source file: %s\n' % (bpy.app.version_string, bpy.data.filename.split('/')[-1].split('\\')[-1])) + file.write('comment Created by Blender %s - www.blender.org, source file: %s\n' % (bpy.app.version_string, bpy.data.filepath.split('/')[-1].split('\\')[-1])) file.write('element vertex %d\n' % len(ply_verts)) @@ -210,13 +211,10 @@ def write(filename, scene, ob, \ file.write('property float y\n') file.write('property float z\n') - # XXX - """ if EXPORT_NORMALS: file.write('property float nx\n') file.write('property float ny\n') file.write('property float nz\n') - """ if EXPORT_UV: file.write('property float s\n') file.write('property float t\n') @@ -231,10 +229,8 @@ def write(filename, scene, ob, \ for i, v in enumerate(ply_verts): file.write('%.6f %.6f %.6f ' % tuple(mesh_verts[v[0]].co)) # co - """ if EXPORT_NORMALS: file.write('%.6f %.6f %.6f ' % v[1]) # no - """ if EXPORT_UV: file.write('%.6f %.6f ' % v[2]) # uv if EXPORT_COLORS: @@ -271,7 +267,7 @@ class ExportPLY(bpy.types.Operator): # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen=1024, default="") + filepath = StringProperty(name="File Path", description="Filepath used for exporting the PLY file", maxlen=1024, default="") check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True) use_normals = BoolProperty(name="Normals", description="Export Normals for smooth and hard shaded faces", default=True) @@ -284,10 +280,10 @@ class ExportPLY(bpy.types.Operator): def execute(self, context): # print("Selected: " + context.active_object.name) - if not self.properties.path: + if not self.properties.filepath: raise Exception("filename not set") - write(self.properties.path, context.scene, context.active_object,\ + write(self.properties.filepath, context.scene, context.active_object,\ EXPORT_APPLY_MODIFIERS=self.properties.use_modifiers, EXPORT_NORMALS=self.properties.use_normals, EXPORT_UV=self.properties.use_uvs, @@ -314,8 +310,9 @@ class ExportPLY(bpy.types.Operator): def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".ply") - self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)").path = default_path + import os + default_path = os.path.splitext(bpy.data.filepath)[0] + ".ply" + self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)").filepath = default_path def register(): diff --git a/release/scripts/io/export_x3d.py b/release/scripts/io/export_x3d.py index f1ab8cd3de7..1bad80f6d8e 100644 --- a/release/scripts/io/export_x3d.py +++ b/release/scripts/io/export_x3d.py @@ -69,7 +69,7 @@ import math import os import bpy -import Mathutils +import mathutils from export_3ds import create_derived_objects, free_derived_objects @@ -81,7 +81,7 @@ from export_3ds import create_derived_objects, free_derived_objects # DEG2RAD=0.017453292519943295 -MATWORLD= Mathutils.RotationMatrix(-90, 4, 'X') +MATWORLD= mathutils.RotationMatrix(-90, 4, 'X') #################################### # Global Variables @@ -237,7 +237,7 @@ class x3d_class: lens = min(lens, math.pi) # get the camera location, subtract 90 degress from X to orient like X3D does - # mat = ob.matrixWorld - mat is now passed! + # mat = ob.matrix_world - mat is now passed! loc = self.rotatePointForVRML(mat.translation_part()) rot = mat.to_euler() @@ -300,7 +300,7 @@ class x3d_class: # note -dz seems to equal om[3][1] # note dy seems to equal om[3][2] - #location=(ob.matrixWorld*MATWORLD).translation_part() # now passed + #location=(ob.matrix_world*MATWORLD).translation_part() # now passed location=(mtx*MATWORLD).translation_part() radius = lamp.distance*math.cos(beamWidth) @@ -346,7 +346,7 @@ class x3d_class: ambi = 0 ambientIntensity = 0 - # location=(ob.matrixWorld*MATWORLD).translation_part() # now passed + # location=(ob.matrix_world*MATWORLD).translation_part() # now passed location= (mtx*MATWORLD).translation_part() self.file.write("\n") else: #-- vertices - # mesh.transform(ob.matrixWorld) + # mesh.transform(ob.matrix_world) self.writeIndented("\n" % self.cleanStr(name)) self.texNames[name] += 1 @@ -794,28 +794,28 @@ class x3d_class: pic = tex.image # using .expandpath just in case, os.path may not expect // - basename = os.path.basename(bpy.utils.expandpath(pic.filename)) + basename = os.path.basename(bpy.utils.expandpath(pic.filepath)) pic = alltextures[i].image # pic = alltextures[i].getImage() if (namemat == "back") and (pic != None): self.file.write("\n\tbackUrl=\"%s\" " % basename) - # self.file.write("\n\tbackUrl=\"%s\" " % pic.filename.split('/')[-1].split('\\')[-1]) + # self.file.write("\n\tbackUrl=\"%s\" " % pic.filepath.split('/')[-1].split('\\')[-1]) elif (namemat == "bottom") and (pic != None): self.writeIndented("bottomUrl=\"%s\" " % basename) - # self.writeIndented("bottomUrl=\"%s\" " % pic.filename.split('/')[-1].split('\\')[-1]) + # self.writeIndented("bottomUrl=\"%s\" " % pic.filepath.split('/')[-1].split('\\')[-1]) elif (namemat == "front") and (pic != None): self.writeIndented("frontUrl=\"%s\" " % basename) - # self.writeIndented("frontUrl=\"%s\" " % pic.filename.split('/')[-1].split('\\')[-1]) + # self.writeIndented("frontUrl=\"%s\" " % pic.filepath.split('/')[-1].split('\\')[-1]) elif (namemat == "left") and (pic != None): self.writeIndented("leftUrl=\"%s\" " % basename) - # self.writeIndented("leftUrl=\"%s\" " % pic.filename.split('/')[-1].split('\\')[-1]) + # self.writeIndented("leftUrl=\"%s\" " % pic.filepath.split('/')[-1].split('\\')[-1]) elif (namemat == "right") and (pic != None): self.writeIndented("rightUrl=\"%s\" " % basename) - # self.writeIndented("rightUrl=\"%s\" " % pic.filename.split('/')[-1].split('\\')[-1]) + # self.writeIndented("rightUrl=\"%s\" " % pic.filepath.split('/')[-1].split('\\')[-1]) elif (namemat == "top") and (pic != None): self.writeIndented("topUrl=\"%s\" " % basename) - # self.writeIndented("topUrl=\"%s\" " % pic.filename.split('/')[-1].split('\\')[-1]) + # self.writeIndented("topUrl=\"%s\" " % pic.filepath.split('/')[-1].split('\\')[-1]) self.writeIndented("/>\n\n") ########################################################## @@ -852,10 +852,10 @@ class x3d_class: # -------------------------- - for ob_main in [o for o in scene.objects if o.is_visible()]: + for ob_main in [o for o in scene.objects if o.is_visible(scene)]: # for ob_main in scene.objects.context: - free, derived = create_derived_objects(ob_main) + free, derived = create_derived_objects(scene, ob_main) if derived == None: continue @@ -871,7 +871,7 @@ class x3d_class: # elif objType in ("Mesh", "Curve", "Surf", "Text") : if EXPORT_APPLY_MODIFIERS or objType != 'MESH': # if EXPORT_APPLY_MODIFIERS or objType != 'Mesh': - me = ob.create_mesh(EXPORT_APPLY_MODIFIERS, 'PREVIEW') + me = ob.create_mesh(scene, EXPORT_APPLY_MODIFIERS, 'PREVIEW') # me= BPyMesh.getMeshFromObject(ob, containerMesh, EXPORT_APPLY_MODIFIERS, False, scene) else: me = ob.data @@ -1155,8 +1155,9 @@ def x3d_export(filename, scene = context.scene - # scene = Blender.Scene.GetCurrent() world = scene.world + + bpy.ops.object.mode_set(mode='OBJECT') # XXX these are global textures while .Get() returned only scene's? alltextures = bpy.data.textures @@ -1214,9 +1215,6 @@ def x3d_export_ui(filename): ######################################################### -# if __name__ == '__main__': -# Blender.Window.FileSelector(x3d_export_ui,"Export X3D", Blender.Get('filename').replace('.blend', '.x3d')) - from bpy.props import * class ExportX3D(bpy.types.Operator): @@ -1226,7 +1224,7 @@ class ExportX3D(bpy.types.Operator): # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for exporting the X3D file", maxlen= 1024, default= "") + filepath = StringProperty(name="File Path", description="Filepath used for exporting the X3D file", maxlen= 1024, default= "") check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) apply_modifiers = BoolProperty(name="Apply Modifiers", description="Use transformed mesh data from each object", default=True) @@ -1234,7 +1232,7 @@ class ExportX3D(bpy.types.Operator): compress = BoolProperty(name="Compress", description="GZip the resulting file, requires a full python install", default=False) def execute(self, context): - x3d_export(self.properties.path, context, self.properties.apply_modifiers, self.properties.triangulate, self.properties.compress) + x3d_export(self.properties.filepath, context, self.properties.apply_modifiers, self.properties.triangulate, self.properties.compress) return {'FINISHED'} def invoke(self, context, event): @@ -1244,8 +1242,8 @@ class ExportX3D(bpy.types.Operator): def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".x3d") - self.layout.operator(ExportX3D.bl_idname, text="X3D Extensible 3D (.x3d)").path = default_path + default_path = os.path.splitext(bpy.data.filepath)[0] + ".x3d" + self.layout.operator(ExportX3D.bl_idname, text="X3D Extensible 3D (.x3d)").filepath = default_path def register(): @@ -1261,4 +1259,3 @@ def unregister(): if __name__ == "__main__": register() - diff --git a/release/scripts/io/import_anim_bvh.py b/release/scripts/io/import_anim_bvh.py index 364bd6e96ee..d497ac47065 100644 --- a/release/scripts/io/import_anim_bvh.py +++ b/release/scripts/io/import_anim_bvh.py @@ -22,8 +22,8 @@ import math from math import radians import bpy -import Mathutils -from Mathutils import Vector, Euler, Matrix, RotationMatrix, TranslationMatrix +import mathutils +from mathutils import Vector, Euler, Matrix, RotationMatrix, TranslationMatrix class bvh_node_class(object): @@ -83,7 +83,7 @@ def eulerRotate(x, y, z, rot_order): # Should work but doesnt! ''' - eul = Euler(x,y,z) + eul = Euler((x, y, z)) eul.order = "XYZ"[rot_order[0]] + "XYZ"[rot_order[1]] + "XYZ"[rot_order[2]] return tuple(eul.to_matrix().to_euler()) ''' @@ -136,7 +136,7 @@ def read_bvh(context, file_path, ROT_MODE='XYZ', GLOBAL_SCALE=1.0): #print '%snode: %s, parent: %s' % (len(bvh_nodes_serial) * ' ', name, bvh_nodes_serial[-1]) lineIdx += 2 # Incriment to the next line (Offset) - rest_head_local = Vector(float(file_lines[lineIdx][1]), float(file_lines[lineIdx][2]), float(file_lines[lineIdx][3])) * GLOBAL_SCALE + rest_head_local = Vector((float(file_lines[lineIdx][1]), float(file_lines[lineIdx][2]), float(file_lines[lineIdx][3]))) * GLOBAL_SCALE lineIdx += 1 # Incriment to the next line (Channels) # newChannel[Xposition, Yposition, Zposition, Xrotation, Yrotation, Zrotation] @@ -188,7 +188,7 @@ def read_bvh(context, file_path, ROT_MODE='XYZ', GLOBAL_SCALE=1.0): # Account for an end node if file_lines[lineIdx][0].lower() == 'end' and file_lines[lineIdx][1].lower() == 'site': # There is somtimes a name after 'End Site' but we will ignore it. lineIdx += 2 # Incriment to the next line (Offset) - rest_tail = Vector(float(file_lines[lineIdx][1]), float(file_lines[lineIdx][2]), float(file_lines[lineIdx][3])) * GLOBAL_SCALE + rest_tail = Vector((float(file_lines[lineIdx][1]), float(file_lines[lineIdx][2]), float(file_lines[lineIdx][3]))) * GLOBAL_SCALE bvh_nodes_serial[-1].rest_tail_world = bvh_nodes_serial[-1].rest_head_world + rest_tail bvh_nodes_serial[-1].rest_tail_local = bvh_nodes_serial[-1].rest_head_local + rest_tail @@ -267,8 +267,8 @@ def read_bvh(context, file_path, ROT_MODE='XYZ', GLOBAL_SCALE=1.0): # raise 'error, bvh node has no end and no children. bad file' # Removed temp for now - rest_tail_world = Vector(0.0, 0.0, 0.0) - rest_tail_local = Vector(0.0, 0.0, 0.0) + rest_tail_world = Vector((0.0, 0.0, 0.0)) + rest_tail_local = Vector((0.0, 0.0, 0.0)) for bvh_node_child in bvh_node.children: rest_tail_world += bvh_node_child.rest_head_world rest_tail_local += bvh_node_child.rest_head_local @@ -321,14 +321,14 @@ def bvh_node_dict2objects(context, bvh_nodes, IMPORT_START_FRAME=1, IMPORT_LOOP= # Animate the data, the last used bvh_node will do since they all have the same number of frames - for current_frame in range(len(bvh_node.anim_data)): - Blender.Set('curframe', current_frame + IMPORT_START_FRAME) + for frame_current in range(len(bvh_node.anim_data)): + Blender.Set('curframe', frame_current + IMPORT_START_FRAME) for bvh_node in bvh_nodes.values(): - lx, ly, lz, rx, ry, rz = bvh_node.anim_data[current_frame] + lx, ly, lz, rx, ry, rz = bvh_node.anim_data[frame_current] rest_head_local = bvh_node.rest_head_local - bvh_node.temp.loc = rest_head_local + Vector(lx, ly, lz) + bvh_node.temp.loc = rest_head_local + Vector((lx, ly, lz)) bvh_node.temp.rot = rx, ry, rz @@ -458,13 +458,11 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM pose_bone = pose_bones[bone_name] pose_bone.rotation_mode = eul_order_lookup[tuple(bvh_node.rot_order)] - elif ROT_MODE == 'XYZ': - print(2) + elif ROT_MODE != 'QUATERNION': for pose_bone in pose_bones: - pose_bone.rotation_mode = 'XYZ' + pose_bone.rotation_mode = ROT_MODE else: # Quats default - print(3) pass context.scene.update() @@ -508,30 +506,30 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM prev_euler = [Euler() for i in range(len(bvh_nodes))] # Animate the data, the last used bvh_node will do since they all have the same number of frames - for current_frame in range(len(bvh_node.anim_data)-1): # skip the first frame (rest frame) - # print current_frame + for frame_current in range(len(bvh_node.anim_data)-1): # skip the first frame (rest frame) + # print frame_current - # if current_frame==40: # debugging + # if frame_current==40: # debugging # break # Dont neet to set the current frame for i, bvh_node in enumerate(bvh_nodes.values()): pose_bone, bone, bone_rest_matrix, bone_rest_matrix_inv = bvh_node.temp - lx, ly, lz, rx, ry, rz = bvh_node.anim_data[current_frame + 1] + lx, ly, lz, rx, ry, rz = bvh_node.anim_data[frame_current + 1] if bvh_node.has_rot: - bone_rotation_matrix = Euler(rx, ry, rz).to_matrix().resize4x4() + bone_rotation_matrix = Euler((rx, ry, rz)).to_matrix().resize4x4() bone_rotation_matrix = bone_rest_matrix_inv * bone_rotation_matrix * bone_rest_matrix if ROT_MODE == 'QUATERNION': pose_bone.rotation_quaternion = bone_rotation_matrix.to_quat() else: - euler = bone_rotation_matrix.to_euler('XYZ', prev_euler[i]) # pose_bone.rotation_mode # TODO, XYZ default for now + euler = bone_rotation_matrix.to_euler(pose_bone.rotation_mode, prev_euler[i]) pose_bone.rotation_euler = euler prev_euler[i] = euler if bvh_node.has_loc: - pose_bone.location = (bone_rest_matrix_inv * TranslationMatrix(Vector(lx, ly, lz) - bvh_node.rest_head_local)).translation_part() + pose_bone.location = (bone_rest_matrix_inv * TranslationMatrix(Vector((lx, ly, lz)) - bvh_node.rest_head_local)).translation_part() if bvh_node.has_loc: pose_bone.keyframe_insert("location") @@ -563,23 +561,23 @@ class BvhImporter(bpy.types.Operator): bl_idname = "import_anim.bvh" bl_label = "Import BVH" - path = StringProperty(name="File Path", description="File path used for importing the OBJ file", maxlen=1024, default="") + filepath = StringProperty(name="File Path", description="Filepath used for importing the OBJ file", maxlen=1024, default="") scale = FloatProperty(name="Scale", description="Scale the BVH by this value", min=0.0001, max=1000000.0, soft_min=0.001, soft_max=100.0, default=0.1) - start_frame = IntProperty(name="Start Frame", description="Starting frame for the animation", default=1) + frame_start = IntProperty(name="Start Frame", description="Starting frame for the animation", default=1) loop = BoolProperty(name="Loop", description="Loop the animation playback", default=False) rotate_mode = EnumProperty(items=( ('QUATERNION', "Quaternion", "Convert rotations to quaternions"), - # ('NATIVE', "Euler (Native)", "Use the rotation order defined in the BVH file"), + ('NATIVE', "Euler (Native)", "Use the rotation order defined in the BVH file"), ('XYZ', "Euler (XYZ)", "Convert rotations to euler XYZ"), - # ('XZY', "Euler (XZY)", "Convert rotations to euler XZY"), - # ('YXZ', "Euler (YXZ)", "Convert rotations to euler YXZ"), - # ('YZX', "Euler (YZX)", "Convert rotations to euler YZX"), - # ('ZXY', "Euler (ZXY)", "Convert rotations to euler ZXY"), - # ('ZYX', "Euler (ZYX)", "Convert rotations to euler ZYX")), + ('XZY', "Euler (XZY)", "Convert rotations to euler XZY"), + ('YXZ', "Euler (YXZ)", "Convert rotations to euler YXZ"), + ('YZX', "Euler (YZX)", "Convert rotations to euler YZX"), + ('ZXY', "Euler (ZXY)", "Convert rotations to euler ZXY"), + ('ZYX', "Euler (ZYX)", "Convert rotations to euler ZYX"), ), name="Rotation", description="Rotation conversion.", - default='QUATERNION') + default='NATIVE') def execute(self, context): # print("Selected: " + context.active_object.name) @@ -587,7 +585,7 @@ class BvhImporter(bpy.types.Operator): t1 = time.time() print('\tparsing bvh...', end="") - bvh_nodes = read_bvh(context, self.properties.path, + bvh_nodes = read_bvh(context, self.properties.filepath, ROT_MODE=self.properties.rotate_mode, GLOBAL_SCALE=self.properties.scale) @@ -597,7 +595,7 @@ class BvhImporter(bpy.types.Operator): bvh_node_dict2armature(context, bvh_nodes, ROT_MODE=self.properties.rotate_mode, - IMPORT_START_FRAME=self.properties.start_frame, + IMPORT_START_FRAME=self.properties.frame_start, IMPORT_LOOP=self.properties.loop) print('Done in %.4f\n' % (time.time() - t1)) @@ -609,7 +607,8 @@ class BvhImporter(bpy.types.Operator): return {'RUNNING_MODAL'} -menu_func = lambda self, context: self.layout.operator(BvhImporter.bl_idname, text="Motion Capture (.bvh)") +def menu_func(self, context): + self.layout.operator(BvhImporter.bl_idname, text="Motion Capture (.bvh)") def register(): diff --git a/release/scripts/io/import_scene_3ds.py b/release/scripts/io/import_scene_3ds.py index d1dbdc62563..7b3004d4f52 100644 --- a/release/scripts/io/import_scene_3ds.py +++ b/release/scripts/io/import_scene_3ds.py @@ -144,7 +144,7 @@ import struct from import_scene_obj import unpack_face_list, load_image import bpy -import Mathutils +import mathutils BOUNDS_3DS = [] @@ -310,8 +310,8 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH): contextObName = None contextLamp = [None, None] # object, Data contextMaterial = None - contextMatrix_rot = None # Blender.Mathutils.Matrix(); contextMatrix.identity() - #contextMatrix_tx = None # Blender.Mathutils.Matrix(); contextMatrix.identity() + contextMatrix_rot = None # Blender.mathutils.Matrix(); contextMatrix.identity() + #contextMatrix_tx = None # Blender.mathutils.Matrix(); contextMatrix.identity() contextMesh_vertls = None contextMesh_facels = None contextMeshMaterials = {} # matname:[face_idxs] @@ -360,7 +360,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH): vertMappingIndex = 0 vertsToUse = [i for i in range(len(myContextMesh_vertls)) if faceVertUsers[i]] - myVertMapping = dict( [ (ii, i) for i, ii in enumerate(vertsToUse) ] ) + myVertMapping = {ii: i for i, ii in enumerate(vertsToUse)} tempName= '%s_%s' % (contextObName, matName) # matName may be None. bmesh = bpy.data.meshes.new(tempName) @@ -427,9 +427,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH): ''' if contextMatrix_rot: - # ob.matrix = [x for row in contextMatrix_rot for x in row] - ob.matrix = contextMatrix_rot -# ob.setMatrix(contextMatrix_rot) + ob.matrix_world = contextMatrix_rot importedObjects.append(ob) bmesh.update() @@ -722,7 +720,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH): def getuv(): temp_data = file.read(STRUCT_SIZE_2FLOAT) new_chunk.bytes_read += STRUCT_SIZE_2FLOAT #2 float x 4 bytes each - return Mathutils.Vector( struct.unpack('<2f', temp_data) ) + return mathutils.Vector( struct.unpack('<2f', temp_data) ) contextMeshUV = [ getuv() for i in range(num_uv) ] @@ -732,7 +730,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH): data = list( struct.unpack('15: - mat= 15 context_material_old= context_material blender_face.material_index= mat @@ -1363,7 +1346,7 @@ def load_obj_ui(filepath, BATCH_LOAD= False): 'Separate objects from obj...',\ ('Object', SPLIT_OBJECTS, 'Import OBJ Objects into Blender Objects'),\ ('Group', SPLIT_GROUPS, 'Import OBJ Groups into Blender Objects'),\ - ('Material', SPLIT_MATERIALS, 'Import each material into a seperate mesh (Avoids > 16 per mesh error)'),\ + ('Split Materials', SPLIT_MATERIALS, 'Import each material into a seperate mesh'),\ 'Options...',\ ('Keep Vert Order', KEEP_VERT_ORDER, 'Keep vert and face order, disables some other options.'),\ ('Clamp Scale:', CLAMP_SIZE, 0.0, 1000.0, 'Clamp the size to this maximum (Zero to Disable)'),\ @@ -1449,7 +1432,7 @@ def load_obj_ui(filepath, BATCH_LOAD= False): Draw.BeginAlign() SPLIT_OBJECTS = Draw.Toggle('Object', EVENT_REDRAW, ui_x+9, ui_y+89, 55, 21, SPLIT_OBJECTS.val, 'Import OBJ Objects into Blender Objects', do_split) SPLIT_GROUPS = Draw.Toggle('Group', EVENT_REDRAW, ui_x+64, ui_y+89, 55, 21, SPLIT_GROUPS.val, 'Import OBJ Groups into Blender Objects', do_split) - SPLIT_MATERIALS = Draw.Toggle('Material', EVENT_REDRAW, ui_x+119, ui_y+89, 60, 21, SPLIT_MATERIALS.val, 'Import each material into a seperate mesh (Avoids > 16 per mesh error)', do_split) + SPLIT_MATERIALS = Draw.Toggle('Split Materials', EVENT_REDRAW, ui_x+119, ui_y+89, 60, 21, SPLIT_MATERIALS.val, 'Import each material into a seperate mesh', do_split) Draw.EndAlign() # Only used for user feedback @@ -1580,14 +1563,14 @@ class IMPORT_OT_obj(bpy.types.Operator): # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for importing the OBJ file", maxlen= 1024, default= "") + filepath = StringProperty(name="File Path", description="Filepath used for importing the OBJ file", maxlen= 1024, default= "") CREATE_SMOOTH_GROUPS = BoolProperty(name="Smooth Groups", description="Surround smooth groups by sharp edges", default= True) CREATE_FGONS = BoolProperty(name="NGons as FGons", description="Import faces with more then 4 verts as fgons", default= True) CREATE_EDGES = BoolProperty(name="Lines as Edges", description="Import lines and faces with 2 verts as edge", default= True) SPLIT_OBJECTS = BoolProperty(name="Object", description="Import OBJ Objects into Blender Objects", default= True) SPLIT_GROUPS = BoolProperty(name="Group", description="Import OBJ Groups into Blender Objects", default= True) - SPLIT_MATERIALS = BoolProperty(name="Material", description="Import each material into a seperate mesh (Avoids > 16 per mesh error)", default= True) + SPLIT_MATERIALS = BoolProperty(name="Split Materials", description="Import each material into a seperate mesh", default= False) # old comment: only used for user feedback # disabled this option because in old code a handler for it disabled SPLIT* params, it's not passed to load_obj # KEEP_VERT_ORDER = BoolProperty(name="Keep Vert Order", description="Keep vert and face order, disables split options, enable for morph targets", default= True) @@ -1600,7 +1583,7 @@ class IMPORT_OT_obj(bpy.types.Operator): def execute(self, context): # print("Selected: " + context.active_object.name) - load_obj(self.properties.path, + load_obj(self.properties.filepath, context, self.properties.CLAMP_SIZE, self.properties.CREATE_FGONS, @@ -1621,7 +1604,8 @@ class IMPORT_OT_obj(bpy.types.Operator): return {'RUNNING_MODAL'} -menu_func = lambda self, context: self.layout.operator(IMPORT_OT_obj.bl_idname, text="Wavefront (.obj)") +def menu_func(self, context): + self.layout.operator(IMPORT_OT_obj.bl_idname, text="Wavefront (.obj)") def register(): @@ -1648,4 +1632,3 @@ def unregister(): if __name__ == "__main__": register() - diff --git a/release/scripts/io/import_shape_mdd.py b/release/scripts/io/import_shape_mdd.py index c64fbd15a5c..ec0e7696630 100644 --- a/release/scripts/io/import_shape_mdd.py +++ b/release/scripts/io/import_shape_mdd.py @@ -25,7 +25,7 @@ # origonal model the mdd was Baked out from their will be Strange # behavior # -# vertex animation to ShapeKeys with ipo and gives the frame a value of 1.0 +# vertex animation to ShapeKeys with ipo and gives the frame a value of 1.0 # A modifier to read mdd files would be Ideal but thats for another day :) # # Please send any fixes,updates,bugs to Slow67_at_Gmail.com @@ -36,77 +36,75 @@ from struct import unpack def mdd_import(filepath, ob, scene, PREF_START_FRAME=0, PREF_JUMP=1): - + print('\n\nimporting mdd "%s"' % filepath) - + bpy.ops.object.mode_set(mode='OBJECT') file = open(filepath, 'rb') frames, points = unpack(">2i", file.read(8)) time = unpack((">%df" % frames), file.read(frames * 4)) - - print('\tpoints:%d frames:%d' % (points,frames)) + + print('\tpoints:%d frames:%d' % (points, frames)) # If target object doesn't have Basis shape key, create it. try: - num_keys = len( ob.data.shape_keys.keys ) + num_keys = len(ob.data.shape_keys.keys) except: basis = ob.add_shape_key() basis.name = "Basis" ob.data.update() - scene.current_frame = PREF_START_FRAME + scene.frame_current = PREF_START_FRAME def UpdateMesh(ob, fr): - + # Insert new shape key new_shapekey = ob.add_shape_key() new_shapekey.name = ("frame_%.4d" % fr) new_shapekey_name = new_shapekey.name - + ob.active_shape_key_index = len(ob.data.shape_keys.keys)-1 index = len(ob.data.shape_keys.keys)-1 ob.shape_key_lock = True - - verts = ob.data.shape_keys.keys[ len(ob.data.shape_keys.keys)-1 ].data - - for v in verts: - # 12 is the size of 3 floats - x,y,z= unpack('>3f', file.read(12)) - v.co[:] = x,z,y + verts = ob.data.shape_keys.keys[len(ob.data.shape_keys.keys)-1].data + + + for v in verts: # 12 is the size of 3 floats + v.co[:] = unpack('>3f', file.read(12)) #me.update() ob.shape_key_lock = False - + # insert keyframes shape_keys = ob.data.shape_keys - scene.current_frame -= 1 + scene.frame_current -= 1 ob.data.shape_keys.keys[index].value = 0.0 shape_keys.keys[len(ob.data.shape_keys.keys)-1].keyframe_insert("value") - scene.current_frame += 1 + scene.frame_current += 1 ob.data.shape_keys.keys[index].value = 1.0 shape_keys.keys[len(ob.data.shape_keys.keys)-1].keyframe_insert("value") - scene.current_frame += 1 + scene.frame_current += 1 ob.data.shape_keys.keys[index].value = 0.0 shape_keys.keys[len(ob.data.shape_keys.keys)-1].keyframe_insert("value") - ob.data.update() + ob.data.update() for i in range(frames): UpdateMesh(ob, i) - + from bpy.props import * class importMDD(bpy.types.Operator): '''Import MDD vertex keyframe file to shape keys''' - bl_idname = "import.mdd" + bl_idname = "import_shape.mdd" bl_label = "Import MDD" # get first scene to get min and max properties for frames, fps @@ -118,20 +116,19 @@ class importMDD(bpy.types.Operator): # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. - path = StringProperty(name="File Path", description="File path used for importing the MDD file", maxlen=1024) + filepath = StringProperty(name="File Path", description="Filepath used for importing the MDD file", maxlen=1024) #fps = IntProperty(name="Frames Per Second", description="Number of frames/second", min=minfps, max=maxfps, default=25) - start_frame = IntProperty(name="Start Frame", description="Start frame for inserting animation", min=minframe, max=maxframe, default=0) - + frame_start = IntProperty(name="Start Frame", description="Start frame for inserting animation", min=minframe, max=maxframe, default=0) def poll(self, context): ob = context.active_object return (ob and ob.type == 'MESH') def execute(self, context): - if not self.properties.path: + if not self.properties.filepath: raise Exception("filename not set") - mdd_import( self.properties.path, bpy.context.active_object, context.scene, self.properties.start_frame, 1) + mdd_import(self.properties.filepath, bpy.context.active_object, context.scene, self.properties.frame_start, 1) return {'FINISHED'} @@ -148,7 +145,8 @@ def menu_func(self, context): def register(): bpy.types.register(importMDD) bpy.types.INFO_MT_file_import.append(menu_func) - + + def unregister(): bpy.types.unregister(importMDD) bpy.types.INFO_MT_file_import.remove(menu_func) diff --git a/release/scripts/io/netrender/__init__.py b/release/scripts/io/netrender/__init__.py index e06d061f173..f5f104d6d92 100644 --- a/release/scripts/io/netrender/__init__.py +++ b/release/scripts/io/netrender/__init__.py @@ -27,6 +27,7 @@ from netrender import master_html from netrender import utils from netrender import balancing from netrender import ui +from netrender import repath jobs = [] slaves = [] diff --git a/release/scripts/io/netrender/client.py b/release/scripts/io/netrender/client.py index aea9c37ff47..9f6d1a7639e 100644 --- a/release/scripts/io/netrender/client.py +++ b/release/scripts/io/netrender/client.py @@ -96,12 +96,12 @@ def clientSendJob(conn, scene, anim = False): job = netrender.model.RenderJob() if anim: - for f in range(scene.start_frame, scene.end_frame + 1): + for f in range(scene.frame_start, scene.frame_end + 1): job.addFrame(f) else: - job.addFrame(scene.current_frame) + job.addFrame(scene.frame_current) - filename = bpy.data.filename + filename = bpy.data.filepath job.addFile(filename) job_name = netsettings.job_name @@ -113,7 +113,7 @@ def clientSendJob(conn, scene, anim = False): # LIBRARIES ########################### for lib in bpy.data.libraries: - file_path = bpy.utils.expandpath(lib.filename) + file_path = bpy.utils.expandpath(lib.filepath) if os.path.exists(file_path): job.addFile(file_path) @@ -122,9 +122,13 @@ def clientSendJob(conn, scene, anim = False): ########################### for image in bpy.data.images: if image.source == "FILE" and not image.packed_file: - file_path = bpy.utils.expandpath(image.filename) + file_path = bpy.utils.expandpath(image.filepath) if os.path.exists(file_path): job.addFile(file_path) + + tex_path = os.path.splitext(file_path)[0] + ".tex" + if os.path.exists(tex_path): + job.addFile(tex_path) ########################### # FLUID + POINT CACHE @@ -144,6 +148,9 @@ def clientSendJob(conn, scene, anim = False): addPointCache(job, object, modifier.domain_settings.point_cache_low, default_path) if modifier.domain_settings.highres: addPointCache(job, object, modifier.domain_settings.point_cache_high, default_path) + elif modifier.type == "MULTIRES" and modifier.external: + file_path = bpy.utils.expandpath(modifier.filepath) + job.addFile(file_path) # particles modifier are stupid and don't contain data # we have to go through the object property @@ -186,6 +193,7 @@ def requestResult(conn, job_id, frame): class NetworkRenderEngine(bpy.types.RenderEngine): bl_idname = 'NET_RENDER' bl_label = "Network Render" + bl_postprocess = False def render(self, scene): if scene.network_render.mode == "RENDER_CLIENT": self.render_client(scene) @@ -227,7 +235,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine): self.update_stats("", "Network render waiting for results") - requestResult(conn, job_id, scene.current_frame) + requestResult(conn, job_id, scene.frame_current) response = conn.getresponse() if response.status == http.client.NO_CONTENT: @@ -235,12 +243,12 @@ class NetworkRenderEngine(bpy.types.RenderEngine): netsettings.job_id = clientSendJob(conn, scene) job_id = netsettings.job_id - requestResult(conn, job_id, scene.current_frame) + requestResult(conn, job_id, scene.frame_current) response = conn.getresponse() while response.status == http.client.ACCEPTED and not self.test_break(): time.sleep(1) - requestResult(conn, job_id, scene.current_frame) + requestResult(conn, job_id, scene.frame_current) response = conn.getresponse() # cancel new jobs (animate on network) on break @@ -268,7 +276,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine): f.close() result = self.begin_result(0, 0, x, y) - result.load_from_file(netsettings.path + "output.exr", 0, 0) + result.load_from_file(netsettings.path + "output.exr") self.end_result(result) conn.close() @@ -283,3 +291,6 @@ def compatible(module): #compatible("properties_render") compatible("properties_world") compatible("properties_material") +compatible("properties_data_mesh") +compatible("properties_data_camera") +compatible("properties_texture") diff --git a/release/scripts/io/netrender/master.py b/release/scripts/io/netrender/master.py index 019f33047d8..f227f61a536 100644 --- a/release/scripts/io/netrender/master.py +++ b/release/scripts/io/netrender/master.py @@ -19,6 +19,7 @@ import sys, os import http, http.client, http.server, urllib, socket, socketserver, threading import subprocess, shutil, time, hashlib +import pickle import select # for select.error from netrender.utils import * @@ -27,12 +28,16 @@ import netrender.balancing import netrender.master_html class MRenderFile(netrender.model.RenderFile): - def __init__(self, filepath, index, start, end): - super().__init__(filepath, index, start, end) + def __init__(self, filepath, index, start, end, signature): + super().__init__(filepath, index, start, end, signature) self.found = False def test(self): self.found = os.path.exists(self.filepath) + if self.found: + found_signature = hashFile(self.filepath) + self.found = self.signature == found_signature + return self.found @@ -74,7 +79,7 @@ class MRenderJob(netrender.model.RenderJob): # special server properties self.last_update = 0 self.save_path = "" - self.files = [MRenderFile(rfile.filepath, rfile.index, rfile.start, rfile.end) for rfile in job_info.files] + self.files = [MRenderFile(rfile.filepath, rfile.index, rfile.start, rfile.end, rfile.signature) for rfile in job_info.files] self.resolution = None @@ -190,6 +195,11 @@ pause_pattern = re.compile("/pause_([a-zA-Z0-9]+)") edit_pattern = re.compile("/edit_([a-zA-Z0-9]+)") class RenderHandler(http.server.BaseHTTPRequestHandler): + def log_message(self, format, *args): + # override because the original calls self.address_string(), which + # is extremely slow due to some timeout.. + sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format%args)) + def send_head(self, code = http.client.OK, headers = {}, content = "application/octet-stream"): self.send_response(code) self.send_header("Content-type", content) @@ -711,7 +721,7 @@ class RenderHandler(http.server.BaseHTTPRequestHandler): buf = self.rfile.read(length) # add same temp file + renames as slave - + f = open(file_path, "wb") f.write(buf) f.close() @@ -861,16 +871,20 @@ class RenderHandler(http.server.BaseHTTPRequestHandler): self.send_head(http.client.NO_CONTENT) class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer): - def __init__(self, address, handler_class, path): + def __init__(self, address, handler_class, path, subdir=True): super().__init__(address, handler_class) self.jobs = [] self.jobs_map = {} self.slaves = [] self.slaves_map = {} self.job_id = 0 - self.path = path + "master_" + str(os.getpid()) + os.sep - self.slave_timeout = 30 # 30 mins: need a parameter for that + if subdir: + self.path = path + "master_" + str(os.getpid()) + os.sep + else: + self.path = path + + self.slave_timeout = 5 # 5 mins: need a parameter for that self.balancer = netrender.balancing.Balancer() self.balancer.addRule(netrender.balancing.RatingUsageByCategory(self.getJobs)) @@ -883,6 +897,22 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer): if not os.path.exists(self.path): os.mkdir(self.path) + def restore(self, jobs, slaves, balancer = None): + self.jobs = jobs + self.jobs_map = {} + + for job in self.jobs: + self.jobs_map[job.id] = job + self.job_id = max(self.job_id, int(job.id)) + + self.slaves = slaves + for slave in self.slaves: + self.slaves_map[slave.id] = slave + + if balancer: + self.balancer = balancer + + def nextJobID(self): self.job_id += 1 return str(self.job_id) @@ -1001,8 +1031,29 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer): def clearMaster(path): shutil.rmtree(path) +def createMaster(address, clear, path): + filepath = os.path.join(path, "blender_master.data") + + if not clear and os.path.exists(filepath): + print("loading saved master:", filepath) + with open(filepath, 'rb') as f: + path, jobs, slaves = pickle.load(f) + + httpd = RenderMasterServer(address, RenderHandler, path, subdir=False) + httpd.restore(jobs, slaves) + + return httpd + + return RenderMasterServer(address, RenderHandler, path) + +def saveMaster(path, httpd): + filepath = os.path.join(path, "blender_master.data") + + with open(filepath, 'wb') as f: + pickle.dump((httpd.path, httpd.jobs, httpd.slaves), f, pickle.HIGHEST_PROTOCOL) + def runMaster(address, broadcast, clear, path, update_stats, test_break): - httpd = RenderMasterServer(address, RenderHandler, path) + httpd = createMaster(address, clear, path) httpd.timeout = 1 httpd.stats = update_stats @@ -1010,7 +1061,7 @@ def runMaster(address, broadcast, clear, path, update_stats, test_break): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - start_time = time.time() + start_time = time.time() - 2 while not test_break(): try: @@ -1018,7 +1069,7 @@ def runMaster(address, broadcast, clear, path, update_stats, test_break): except select.error: pass - if time.time() - start_time >= 10: # need constant here + if time.time() - start_time >= 2: # need constant here httpd.timeoutSlaves() httpd.updateUsage() @@ -1031,3 +1082,6 @@ def runMaster(address, broadcast, clear, path, update_stats, test_break): httpd.server_close() if clear: clearMaster(httpd.path) + else: + saveMaster(path, httpd) + diff --git a/release/scripts/io/netrender/master_html.py b/release/scripts/io/netrender/master_html.py index e5feac86e12..c3695cd4f0f 100644 --- a/release/scripts/io/netrender/master_html.py +++ b/release/scripts/io/netrender/master_html.py @@ -29,6 +29,7 @@ def get(handler): def head(title): output("") + output("") output("") # output("") output("") @@ -105,53 +106,6 @@ def get(handler): handler.send_head(content = "text/html") head("NetRender") - output("<h2>Master</h2>") - - output("""<button title="remove all jobs" onclick="clear_jobs();">CLEAR JOB LIST</button>""") - - startTable(caption = "Rules", class_style = "rules") - - headerTable("type", "enabled", "description", "limit") - - for rule in handler.server.balancer.rules: - rowTable( - "rating", - checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))), - rule, - rule.str_limit() + - """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " " - ) - - for rule in handler.server.balancer.priorities: - rowTable( - "priority", - checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))), - rule, - rule.str_limit() + - """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " " - ) - - for rule in handler.server.balancer.exceptions: - rowTable( - "exception", - checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))), - rule, - rule.str_limit() + - """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " " - ) - - endTable() - - output("<h2>Slaves</h2>") - - startTable() - headerTable("name", "address", "last seen", "stats", "job") - - for slave in handler.server.slaves: - rowTable(slave.name, slave.address[0], time.ctime(slave.last_seen), slave.stats, link(slave.job.name, "/html/job" + slave.job.id) if slave.job else "None") - - endTable() - output("<h2>Jobs</h2>") startTable() @@ -203,6 +157,53 @@ def get(handler): ) endTable() + + output("<h2>Slaves</h2>") + + startTable() + headerTable("name", "address", "last seen", "stats", "job") + + for slave in handler.server.slaves: + rowTable(slave.name, slave.address[0], time.ctime(slave.last_seen), slave.stats, link(slave.job.name, "/html/job" + slave.job.id) if slave.job else "None") + + endTable() + + output("<h2>Configuration</h2>") + + output("""<button title="remove all jobs" onclick="clear_jobs();">CLEAR JOB LIST</button>""") + + startTable(caption = "Rules", class_style = "rules") + + headerTable("type", "enabled", "description", "limit") + + for rule in handler.server.balancer.rules: + rowTable( + "rating", + checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))), + rule, + rule.str_limit() + + """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " " + ) + + for rule in handler.server.balancer.priorities: + rowTable( + "priority", + checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))), + rule, + rule.str_limit() + + """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " " + ) + + for rule in handler.server.balancer.exceptions: + rowTable( + "exception", + checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))), + rule, + rule.str_limit() + + """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " " + ) + + endTable() output("</body></html>") @@ -234,13 +235,17 @@ def get(handler): tot_cache = 0 tot_fluid = 0 + rowTable(job.files[0].filepath) + rowTable("Other Files", class_style = "toggle", extra = "onclick='toggleDisplay(".other", "none", "table-row")'") + for file in job.files: if file.filepath.endswith(".bphys"): tot_cache += 1 elif file.filepath.endswith(".bobj.gz") or file.filepath.endswith(".bvel.gz"): tot_fluid += 1 else: - rowTable(file.filepath) + if file != job.files[0]: + rowTable(file.filepath, class_style = "other") if tot_cache > 0: rowTable("%i physic cache files" % tot_cache, class_style = "toggle", extra = "onclick='toggleDisplay(".cache", "none", "table-row")'") @@ -256,9 +261,9 @@ def get(handler): endTable() - output("<h2>Blacklist</h2>") - if job.blacklist: + output("<h2>Blacklist</h2>") + startTable() headerTable("name", "address") @@ -267,8 +272,6 @@ def get(handler): rowTable(slave.name, slave.address[0]) endTable() - else: - output("<i>Empty</i>") output("<h2>Frames</h2>") diff --git a/release/scripts/io/netrender/model.py b/release/scripts/io/netrender/model.py index 8b0f50ba848..e7656f498b4 100644 --- a/release/scripts/io/netrender/model.py +++ b/release/scripts/io/netrender/model.py @@ -103,8 +103,10 @@ JOB_TYPES = { } class RenderFile: - def __init__(self, filepath = "", index = 0, start = -1, end = -1): + def __init__(self, filepath = "", index = 0, start = -1, end = -1, signature=0): self.filepath = filepath + self.original_path = filepath + self.signature = signature self.index = index self.start = start self.end = end @@ -112,9 +114,11 @@ class RenderFile: def serialize(self): return { "filepath": self.filepath, + "original_path": self.original_path, "index": self.index, "start": self.start, - "end": self.end + "end": self.end, + "signature": self.signature } @staticmethod @@ -122,7 +126,8 @@ class RenderFile: if not data: return None - rfile = RenderFile(data["filepath"], data["index"], data["start"], data["end"]) + rfile = RenderFile(data["filepath"], data["index"], data["start"], data["end"], data["signature"]) + rfile.original_path = data["original_path"] return rfile @@ -153,7 +158,8 @@ class RenderJob: self.blacklist = job_info.blacklist def addFile(self, file_path, start=-1, end=-1): - self.files.append(RenderFile(file_path, len(self.files), start, end)) + signature = hashFile(file_path) + self.files.append(RenderFile(file_path, len(self.files), start, end, signature)) def addFrame(self, frame_number, command = ""): frame = RenderFrame(frame_number, command) diff --git a/release/scripts/io/netrender/netrender.css b/release/scripts/io/netrender/netrender.css index cc8a93bb9a7..0c54690e002 100644 --- a/release/scripts/io/netrender/netrender.css +++ b/release/scripts/io/netrender/netrender.css @@ -68,6 +68,10 @@ button { display: none; } +.other { + display: none; +} + .rules { width: 60em; text-align: left; diff --git a/release/scripts/io/netrender/operators.py b/release/scripts/io/netrender/operators.py index f667be68c84..858ec800dbc 100644 --- a/release/scripts/io/netrender/operators.py +++ b/release/scripts/io/netrender/operators.py @@ -39,7 +39,7 @@ class RENDER_OT_netslave_bake(bpy.types.Operator): scene = context.scene netsettings = scene.network_render - filename = bpy.data.filename + filename = bpy.data.filepath path, name = os.path.split(filename) root, ext = os.path.splitext(name) default_path = path + os.sep + "blendcache_" + root + os.sep # need an API call for that @@ -77,7 +77,7 @@ class RENDER_OT_netslave_bake(bpy.types.Operator): bpy.ops.ptcache.bake_all() - #bpy.ops.wm.save_mainfile(path = path + os.sep + root + "_baked.blend") + #bpy.ops.wm.save_mainfile(filepath = path + os.sep + root + "_baked.blend") return {'FINISHED'} @@ -104,7 +104,7 @@ class RENDER_OT_netclientanim(bpy.types.Operator): scene.network_render.job_id = client.clientSendJob(conn, scene, True) conn.close() - bpy.ops.screen.render('INVOKE_AREA', animation=True) + bpy.ops.render.render('INVOKE_AREA', animation=True) return {'FINISHED'} @@ -121,7 +121,7 @@ class RENDER_OT_netclientrun(bpy.types.Operator): return True def execute(self, context): - bpy.ops.screen.render('INVOKE_AREA', animation=True) + bpy.ops.render.render('INVOKE_AREA', animation=True) return {'FINISHED'} @@ -158,6 +158,36 @@ class RENDER_OT_netclientsend(bpy.types.Operator): def invoke(self, context, event): return self.execute(context) +@rnaType +class RENDER_OT_netclientsendframe(bpy.types.Operator): + '''Send Render Job with current frame to the Network''' + bl_idname = "render.netclientsendframe" + bl_label = "Send current frame job" + + def poll(self, context): + return True + + def execute(self, context): + scene = context.scene + netsettings = scene.network_render + + try: + conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report) + + if conn: + # Sending file + scene.network_render.job_id = client.clientSendJob(conn, scene, False) + conn.close() + self.report('INFO', "Job sent to master") + except Exception as err: + self.report('ERROR', str(err)) + + + return {'FINISHED'} + + def invoke(self, context, event): + return self.execute(context) + @rnaType class RENDER_OT_netclientstatus(bpy.types.Operator): '''Refresh the status of the current jobs''' diff --git a/release/scripts/io/netrender/repath.py b/release/scripts/io/netrender/repath.py new file mode 100755 index 00000000000..7f9befd34fb --- /dev/null +++ b/release/scripts/io/netrender/repath.py @@ -0,0 +1,147 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +import sys, os +import subprocess + +import bpy + +from netrender.utils import * +import netrender.model + +BLENDER_PATH = sys.argv[0] + +def reset(job): + main_file = job.files[0] + + job_full_path = main_file.filepath + + if os.path.exists(job_full_path + ".bak"): + os.remove(job_full_path) # repathed file + os.renames(job_full_path + ".bak", job_full_path) + +def update(job): + paths = [] + + main_file = job.files[0] + + job_full_path = main_file.filepath + + + path, ext = os.path.splitext(job_full_path) + + new_path = path + ".remap" + ext + + # Disable for now. Partial repath should work anyway + #all = main_file.filepath != main_file.original_path + all = False + + for rfile in job.files[1:]: + if all or rfile.original_path != rfile.filepath: + paths.append(rfile.original_path) + paths.append(rfile.filepath) + + # Only update if needed + if paths: + process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-P", __file__, "--", new_path] + paths, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + process.wait() + + os.renames(job_full_path, job_full_path + ".bak") + os.renames(new_path, job_full_path) + +def process(paths): + def processPointCache(point_cache): + point_cache.external = False + + def processFluid(fluid): + new_path = path_map.get(fluid.path, None) + if new_path: + fluid.path = new_path + + path_map = {} + for i in range(0, len(paths), 2): + # special case for point cache + if paths[i].endswith(".bphys"): + pass # Don't need them in the map, they all use the default external path + # NOTE: This is probably not correct all the time, need to be fixed. + # special case for fluids + elif paths[i].endswith(".bobj.gz"): + path_map[os.path.split(paths[i])[0]] = os.path.split(paths[i+1])[0] + else: + path_map[paths[i]] = paths[i+1] + + ########################### + # LIBRARIES + ########################### + for lib in bpy.data.libraries: + file_path = bpy.utils.expandpath(lib.filepath) + new_path = path_map.get(file_path, None) + if new_path: + lib.filepath = new_path + + ########################### + # IMAGES + ########################### + for image in bpy.data.images: + if image.source == "FILE" and not image.packed_file: + file_path = bpy.utils.expandpath(image.filepath) + new_path = path_map.get(file_path, None) + if new_path: + image.filepath = new_path + + + ########################### + # FLUID + POINT CACHE + ########################### + for object in bpy.data.objects: + for modifier in object.modifiers: + if modifier.type == 'FLUID_SIMULATION' and modifier.settings.type == "DOMAIN": + processFluid(settings) + elif modifier.type == "CLOTH": + processPointCache(modifier.point_cache) + elif modifier.type == "SOFT_BODY": + processPointCache(modifier.point_cache) + elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN": + processPointCache(modifier.domain_settings.point_cache_low) + if modifier.domain_settings.highres: + processPointCache(modifier.domain_settings.point_cache_high) + elif modifier.type == "MULTIRES" and modifier.external: + file_path = bpy.utils.expandpath(modifier.filepath) + new_path = path_map.get(file_path, None) + if new_path: + modifier.filepath = new_path + + # particles modifier are stupid and don't contain data + # we have to go through the object property + for psys in object.particle_systems: + processPointCache(psys.point_cache) + + +if __name__ == "__main__": + try: + i = sys.argv.index("--") + except: + i = 0 + + if i: + new_path = sys.argv[i+1] + args = sys.argv[i+2:] + + process(args) + + bpy.ops.wm.save_as_mainfile(path=new_path, check_existing=False) diff --git a/release/scripts/io/netrender/slave.py b/release/scripts/io/netrender/slave.py index d24490385fb..9fd00152dc1 100644 --- a/release/scripts/io/netrender/slave.py +++ b/release/scripts/io/netrender/slave.py @@ -22,6 +22,7 @@ import subprocess, time from netrender.utils import * import netrender.model +import netrender.repath BLENDER_PATH = sys.argv[0] @@ -64,12 +65,22 @@ def testCancel(conn, job_id, frame_number): else: return False -def testFile(conn, job_id, slave_id, file_index, JOB_PREFIX, file_path, main_path = None): - job_full_path = prefixPath(JOB_PREFIX, file_path, main_path) +def testFile(conn, job_id, slave_id, rfile, JOB_PREFIX, main_path = None): + job_full_path = prefixPath(JOB_PREFIX, rfile.filepath, main_path) + + found = os.path.exists(job_full_path) + + if found: + found_signature = hashFile(job_full_path) + found = found_signature == rfile.signature + + if not found: + print("Found file %s at %s but signature mismatch!" % (rfile.filepath, job_full_path)) + job_full_path = prefixPath(JOB_PREFIX, rfile.filepath, main_path, force = True) - if not os.path.exists(job_full_path): - temp_path = JOB_PREFIX + "slave.temp.blend" - conn.request("GET", fileURL(job_id, file_index), headers={"slave-id":slave_id}) + if not found: + temp_path = JOB_PREFIX + "slave.temp" + conn.request("GET", fileURL(job_id, rfile.index), headers={"slave-id":slave_id}) response = conn.getresponse() if response.status != http.client.OK: @@ -85,6 +96,8 @@ def testFile(conn, job_id, slave_id, file_index, JOB_PREFIX, file_path, main_pat f.close() os.renames(temp_path, job_full_path) + + rfile.filepath = job_full_path return job_full_path @@ -105,6 +118,8 @@ def render_slave(engine, netsettings, threads): if not os.path.exists(NODE_PREFIX): os.mkdir(NODE_PREFIX) + engine.update_stats("", "Network render connected to master, waiting for jobs") + while not engine.test_break(): conn.request("GET", "/job", headers={"slave-id":slave_id}) response = conn.getresponse() @@ -113,6 +128,7 @@ def render_slave(engine, netsettings, threads): timeout = 1 # reset timeout on new job job = netrender.model.RenderJob.materialize(eval(str(response.read(), encoding='utf8'))) + engine.update_stats("", "Network render processing job from master") JOB_PREFIX = NODE_PREFIX + "job_" + job.id + os.sep if not os.path.exists(JOB_PREFIX): @@ -123,14 +139,17 @@ def render_slave(engine, netsettings, threads): job_path = job.files[0].filepath # path of main file main_path, main_file = os.path.split(job_path) - job_full_path = testFile(conn, job.id, slave_id, 0, JOB_PREFIX, job_path) + job_full_path = testFile(conn, job.id, slave_id, job.files[0], JOB_PREFIX) print("Fullpath", job_full_path) print("File:", main_file, "and %i other files" % (len(job.files) - 1,)) - engine.update_stats("", "Render File "+ main_file+ " for job "+ job.id) for rfile in job.files[1:]: + testFile(conn, job.id, slave_id, rfile, JOB_PREFIX, main_path) print("\t", rfile.filepath) - testFile(conn, job.id, slave_id, rfile.index, JOB_PREFIX, rfile.filepath, main_path) + + netrender.repath.update(job) + + engine.update_stats("", "Render File "+ main_file+ " for job "+ job.id) # announce log to master logfile = netrender.model.LogFile(job.id, slave_id, [frame.number for frame in job.frames]) @@ -175,6 +194,10 @@ def render_slave(engine, netsettings, threads): # (only need to update on one frame, they are linked conn.request("PUT", logURL(job.id, first_frame), stdout, headers=headers) response = conn.getresponse() + + # Also output on console + if netsettings.slave_thumb: + print(str(stdout, encoding='utf8'), end="") stdout = bytes() @@ -182,6 +205,9 @@ def render_slave(engine, netsettings, threads): if testCancel(conn, job.id, first_frame): cancelled = True + if job.type == netrender.model.JOB_BLENDER: + netrender.repath.reset(job) + # read leftovers if needed stdout += process.stdout.read() @@ -191,6 +217,17 @@ def render_slave(engine, netsettings, threads): process.terminate() continue # to next frame + # flush the rest of the logs + if stdout: + # Also output on console + if netsettings.slave_thumb: + print(str(stdout, encoding='utf8'), end="") + + # (only need to update on one frame, they are linked + conn.request("PUT", logURL(job.id, first_frame), stdout, headers=headers) + if conn.getresponse().status == http.client.NO_CONTENT: + continue + total_t = time.time() - start_t avg_t = total_t / len(job.frames) @@ -199,13 +236,6 @@ def render_slave(engine, netsettings, threads): print("status", status) - # flush the rest of the logs - if stdout: - # (only need to update on one frame, they are linked - conn.request("PUT", logURL(job.id, first_frame), stdout, headers=headers) - if conn.getresponse().status == http.client.NO_CONTENT: - continue - headers = {"job-id":job.id, "slave-id":slave_id, "job-time":str(avg_t)} @@ -245,6 +275,8 @@ def render_slave(engine, netsettings, threads): conn.request("PUT", "/render", headers=headers) if conn.getresponse().status == http.client.NO_CONTENT: continue + + engine.update_stats("", "Network render connected to master, waiting for jobs") else: if timeout < MAX_TIMEOUT: timeout += INCREMENT_TIMEOUT diff --git a/release/scripts/io/netrender/ui.py b/release/scripts/io/netrender/ui.py index ba14d7e4f42..c60b10c484a 100644 --- a/release/scripts/io/netrender/ui.py +++ b/release/scripts/io/netrender/ui.py @@ -37,8 +37,8 @@ DONE = 2 ERROR = 3 def init_file(): - if netrender.init_file != bpy.data.filename: - netrender.init_file = bpy.data.filename + if netrender.init_file != bpy.data.filepath: + netrender.init_file = bpy.data.filepath netrender.init_data = True netrender.init_address = True @@ -76,7 +76,7 @@ def verify_address(netsettings): else: netsettings.server_address = "[default]" -class RenderButtonsPanel(bpy.types.Panel): +class RenderButtonsPanel(): bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "render" @@ -88,7 +88,7 @@ class RenderButtonsPanel(bpy.types.Panel): # Setting panel, use in the scene for now. @rnaType -class RENDER_PT_network_settings(RenderButtonsPanel): +class RENDER_PT_network_settings(bpy.types.Panel, RenderButtonsPanel): bl_label = "Network Settings" COMPAT_ENGINES = {'NET_RENDER'} @@ -123,7 +123,7 @@ class RENDER_PT_network_settings(RenderButtonsPanel): layout.operator("render.netclientweb", icon='QUESTION') @rnaType -class RENDER_PT_network_slave_settings(RenderButtonsPanel): +class RENDER_PT_network_slave_settings(bpy.types.Panel, RenderButtonsPanel): bl_label = "Slave Settings" COMPAT_ENGINES = {'NET_RENDER'} @@ -141,13 +141,14 @@ class RENDER_PT_network_slave_settings(RenderButtonsPanel): layout.prop(netsettings, "slave_clear") layout.prop(netsettings, "slave_thumb") + layout.prop(netsettings, "slave_outputlog") layout.label(text="Threads:") layout.prop(rd, "threads_mode", expand=True) sub = layout.column() - sub.enabled = rd.threads_mode == 'THREADS_FIXED' + sub.enabled = rd.threads_mode == 'FIXED' sub.prop(rd, "threads") @rnaType -class RENDER_PT_network_master_settings(RenderButtonsPanel): +class RENDER_PT_network_master_settings(bpy.types.Panel, RenderButtonsPanel): bl_label = "Master Settings" COMPAT_ENGINES = {'NET_RENDER'} @@ -166,7 +167,7 @@ class RENDER_PT_network_master_settings(RenderButtonsPanel): layout.prop(netsettings, "master_clear") @rnaType -class RENDER_PT_network_job(RenderButtonsPanel): +class RENDER_PT_network_job(bpy.types.Panel, RenderButtonsPanel): bl_label = "Job Settings" COMPAT_ENGINES = {'NET_RENDER'} @@ -186,10 +187,11 @@ class RENDER_PT_network_job(RenderButtonsPanel): if netsettings.server_address != "[default]": layout.operator("render.netclientanim", icon='RENDER_ANIMATION') layout.operator("render.netclientsend", icon='FILE_BLEND') + layout.operator("render.netclientsendframe", icon='RENDER_STILL') if netsettings.job_id: row = layout.row() - row.operator("screen.render", text="Get Image", icon='RENDER_STILL') - row.operator("screen.render", text="Get Animation", icon='RENDER_ANIMATION').animation = True + row.operator("render.render", text="Get Image", icon='RENDER_STILL') + row.operator("render.render", text="Get Animation", icon='RENDER_ANIMATION').animation = True split = layout.split(percentage=0.3) @@ -206,16 +208,17 @@ class RENDER_PT_network_job(RenderButtonsPanel): row.prop(netsettings, "chunks") @rnaType -class RENDER_PT_network_slaves(RenderButtonsPanel): +class RENDER_PT_network_slaves(bpy.types.Panel, RenderButtonsPanel): bl_label = "Slaves Status" COMPAT_ENGINES = {'NET_RENDER'} def poll(self, context): scene = context.scene netsettings = scene.network_render + if netsettings.mode != "RENDER_CLIENT": + return False verify_address(netsettings) return (super().poll(context) - and netsettings.mode == "RENDER_CLIENT" and netsettings.server_address != "[default]") def draw(self, context): @@ -244,16 +247,17 @@ class RENDER_PT_network_slaves(RenderButtonsPanel): layout.label(text="Stats: " + slave.stats) @rnaType -class RENDER_PT_network_slaves_blacklist(RenderButtonsPanel): +class RENDER_PT_network_slaves_blacklist(bpy.types.Panel, RenderButtonsPanel): bl_label = "Slaves Blacklist" COMPAT_ENGINES = {'NET_RENDER'} def poll(self, context): scene = context.scene netsettings = scene.network_render + if netsettings.mode != "RENDER_CLIENT": + return False verify_address(netsettings) return (super().poll(context) - and netsettings.mode == "RENDER_CLIENT" and netsettings.server_address != "[default]") def draw(self, context): @@ -281,16 +285,17 @@ class RENDER_PT_network_slaves_blacklist(RenderButtonsPanel): layout.label(text="Stats: " + slave.stats) @rnaType -class RENDER_PT_network_jobs(RenderButtonsPanel): +class RENDER_PT_network_jobs(bpy.types.Panel, RenderButtonsPanel): bl_label = "Jobs" COMPAT_ENGINES = {'NET_RENDER'} def poll(self, context): scene = context.scene netsettings = scene.network_render + if netsettings.mode != "RENDER_CLIENT": + return False verify_address(netsettings) return (super().poll(context) - and netsettings.mode == "RENDER_CLIENT" and netsettings.server_address != "[default]") def draw(self, context): @@ -362,6 +367,11 @@ NetRenderSettings.BoolProperty( attr="slave_thumb", description="Generate thumbnails on slaves instead of master", default = False) +NetRenderSettings.BoolProperty( attr="slave_outputlog", + name="Output render log on console", + description="Output render text log to console as well as sending it to the master", + default = True) + NetRenderSettings.BoolProperty( attr="master_clear", name="Clear on exit", description="delete saved files on exit", diff --git a/release/scripts/io/netrender/utils.py b/release/scripts/io/netrender/utils.py index 1d35ea00c99..6288b9747c0 100644 --- a/release/scripts/io/netrender/utils.py +++ b/release/scripts/io/netrender/utils.py @@ -19,7 +19,7 @@ import sys, os import re import http, http.client, http.server, urllib, socket -import subprocess, shutil, time, hashlib +import subprocess, shutil, time, hashlib, zlib import netrender.model @@ -28,7 +28,7 @@ try: except: bpy = None -VERSION = bytes("0.8", encoding='utf8') +VERSION = bytes("0.9", encoding='utf8') # Jobs status JOB_WAITING = 0 # before all data has been entered @@ -110,7 +110,7 @@ def clientConnection(address, port, report = None, scan = True): return None try: - conn = http.client.HTTPConnection(address, port) + conn = http.client.HTTPConnection(address, port, timeout = 5) if conn: if clientVerifyVersion(conn): @@ -154,18 +154,33 @@ def renderURL(job_id, frame_number): def cancelURL(job_id): return "/cancel_%s" % (job_id) -def prefixPath(prefix_directory, file_path, prefix_path): +def hashFile(path): + f = open(path, "rb") + value = hashData(f.read()) + f.close() + return value + +def hashData(data): + m = hashlib.md5() + m.update(data) + return m.hexdigest() + + +def prefixPath(prefix_directory, file_path, prefix_path, force = False): if os.path.isabs(file_path): # if an absolute path, make sure path exists, if it doesn't, use relative local path full_path = file_path - if not os.path.exists(full_path): + if force or not os.path.exists(full_path): p, n = os.path.split(full_path) if prefix_path and p.startswith(prefix_path): - directory = prefix_directory + p[len(prefix_path):] - full_path = directory + os.sep + n - if not os.path.exists(directory): - os.mkdir(directory) + if len(prefix_path) < len(p): + directory = prefix_directory + p[len(prefix_path)+1:] + os.sep # +1 to remove separator + if not os.path.exists(directory): + os.mkdir(directory) + else: + directory = prefix_directory + full_path = directory + n else: full_path = prefix_directory + n else: @@ -199,8 +214,8 @@ def thumbnail(filename): if bpy: scene = bpy.data.scenes[0] # FIXME, this is dodgy! scene.render.file_format = "JPEG" - scene.render.quality = 90 - bpy.ops.image.open(path = filename) + scene.render.file_quality = 90 + bpy.ops.image.open(filepath=filename) img = bpy.data.images[imagename] img.save_render(thumbname, scene=scene) diff --git a/release/scripts/keyingsets/keyingsets_builtins.py b/release/scripts/keyingsets/keyingsets_builtins.py new file mode 100644 index 00000000000..bf5c66ad01d --- /dev/null +++ b/release/scripts/keyingsets/keyingsets_builtins.py @@ -0,0 +1,225 @@ +# Built-In Keying Sets +# None of these Keying Sets should be removed, as these +# are needed by various parts of Blender in order for them +# to work correctly. + +import bpy +from keyingsets_utils import * + +############################### +# Built-In KeyingSets + +# Location +class BUILTIN_KSI_Location(bpy.types.KeyingSetInfo): + bl_label = "Location" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + generate = RKS_GEN_location + +# Rotation +class BUILTIN_KSI_Rotation(bpy.types.KeyingSetInfo): + bl_label = "Rotation" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + generate = RKS_GEN_rotation + +# Scale +class BUILTIN_KSI_Scaling(bpy.types.KeyingSetInfo): + bl_label = "Scaling" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + generate = RKS_GEN_scaling + +# ------------ + +# LocRot +class BUILTIN_KSI_LocRot(bpy.types.KeyingSetInfo): + bl_label = "LocRot" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + def generate(self, context, ks, data): + # location + RKS_GEN_location(self, context, ks, data) + # rotation + RKS_GEN_rotation(self, context, ks, data) + +# LocScale +class BUILTIN_KSI_LocScale(bpy.types.KeyingSetInfo): + bl_label = "LocScale" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + def generate(self, context, ks, data): + # location + RKS_GEN_location(self, context, ks, data) + # scale + RKS_GEN_scaling(self, context, ks, data) + +# LocRotScale +class BUILTIN_KSI_LocRotScale(bpy.types.KeyingSetInfo): + bl_label = "LocRotScale" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + def generate(self, context, ks, data): + # location + RKS_GEN_location(self, context, ks, data) + # rotation + RKS_GEN_rotation(self, context, ks, data) + # scale + RKS_GEN_scaling(self, context, ks, data) + +# RotScale +class BUILTIN_KSI_RotScale(bpy.types.KeyingSetInfo): + bl_label = "RotScale" + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + def generate(self, context, ks, data): + # rotation + RKS_GEN_rotation(self, context, ks, data) + # scaling + RKS_GEN_scaling(self, context, ks, data) + +# ------------ + +# Location +class BUILTIN_KSI_VisualLoc(bpy.types.KeyingSetInfo): + bl_label = "Visual Location" + + insertkey_visual = True + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + generate = RKS_GEN_location + +# Rotation +class BUILTIN_KSI_VisualRot(bpy.types.KeyingSetInfo): + bl_label = "Visual Rotation" + + insertkey_visual = True + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + generate = RKS_GEN_rotation + +# VisualLocRot +class BUILTIN_KSI_VisualLocRot(bpy.types.KeyingSetInfo): + bl_label = "Visual LocRot" + + insertkey_visual = True + + # poll - use predefined callback for selected bones/objects + poll = RKS_POLL_selected_items + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + def generate(self, context, ks, data): + # location + RKS_GEN_location(self, context, ks, data) + # rotation + RKS_GEN_rotation(self, context, ks, data) + +# ------------ + +# Available +class BUILTIN_KSI_Available(bpy.types.KeyingSetInfo): + bl_label = "Available" + + # poll - use predefined callback for selected objects + # TODO: this should really check whether the selected object (or datablock) + # has any animation data defined yet + poll = RKS_POLL_selected_objects + + # iterator - use callback for selected bones/objects + iterator = RKS_ITER_selected_item + + # generator - use callback for location + generate = RKS_GEN_available + +############################### + +classes = [ + BUILTIN_KSI_Location, + BUILTIN_KSI_Rotation, + BUILTIN_KSI_Scaling, + + BUILTIN_KSI_LocRot, + BUILTIN_KSI_LocScale, + BUILTIN_KSI_LocRotScale, + BUILTIN_KSI_RotScale, + + BUILTIN_KSI_VisualLoc, + BUILTIN_KSI_VisualRot, + BUILTIN_KSI_VisualLocRot, + + BUILTIN_KSI_Available, +] + + +def register(): + register = bpy.types.register + for cls in classes: + register(cls) + + +def unregister(): + unregister = bpy.types.unregister + for cls in classes: + unregister(cls) + +if __name__ == "__main__": + register() + +############################### diff --git a/release/scripts/keyingsets/keyingsets_utils.py b/release/scripts/keyingsets/keyingsets_utils.py new file mode 100644 index 00000000000..77b0f3ebacd --- /dev/null +++ b/release/scripts/keyingsets/keyingsets_utils.py @@ -0,0 +1,163 @@ +# This file defines a set of methods that are useful for various +# Relative Keying Set (RKS) related operations, such as: callbacks +# for polling, iterator callbacks, and also generate callbacks. +# All of these can be used in conjunction with the others. + +import bpy + +########################### +# General Utilities + +# Append the specified property name on the the existing path +def path_add_property(path, prop): + if len(path): + return path + "." + prop; + else: + return prop; + +########################### +# Poll Callbacks + +# selected objects +def RKS_POLL_selected_objects(ksi, context): + return context.active_object or len(context.selected_objects); + +# selected bones +def RKS_POLL_selected_bones(ksi, context): + # we must be in Pose Mode, and there must be some bones selected + if (context.active_object) and (context.active_object.mode == 'POSE'): + if context.active_pose_bone or len(context.selected_pose_bones): + return True; + + # nothing selected + return False; + + +# selected bones or objects +def RKS_POLL_selected_items(ksi, context): + return RKS_POLL_selected_bones(ksi, context) or RKS_POLL_selected_objects(ksi, context); + +########################### +# Iterator Callbacks + +# all selected objects or pose bones, depending on which we've got +def RKS_ITER_selected_item(ksi, context, ks): + if (context.active_object) and (context.active_object.mode == 'POSE'): + for bone in context.selected_pose_bones: + ksi.generate(context, ks, bone) + else: + for ob in context.selected_objects: + ksi.generate(context, ks, ob) + +########################### +# Generate Callbacks + +# 'Available' F-Curves +def RKS_GEN_available(ksi, context, ks, data): + # try to get the animation data associated with the closest + # ID-block to the data (neither of which may exist/be easy to find) + id_block = data.id_data + adt = getattr(id_block, "animation_data", None) + + # there must also be an active action... + if adt is None or adt.action is None: + return; + + # for each F-Curve, include an path to key it + # NOTE: we don't need to set the group settings here + for fcu in adt.action.fcurves: + ks.paths.add(id_block, fcu.data_path, index=fcu.array_index) + +# ------ + +# get ID block and based ID path for transform generators +def get_transform_generators_base_info(data): + # ID-block for the data + id_block = data.id_data + + # get base path and grouping method/name + if isinstance(data, bpy.types.ID): + # no path in this case + path = "" + + # data on ID-blocks directly should get grouped by the KeyingSet + grouping = None + else: + # get the path to the ID-block + path = data.path_from_id() + + # try to use the name of the data element to group the F-Curve + # else fallback on the KeyingSet name + grouping = getattr(data, "name", None) + + # return the ID-block and the path + return id_block, path, grouping + +# Location +def RKS_GEN_location(ksi, context, ks, data): + # get id-block and path info + id_block, base_path, grouping= get_transform_generators_base_info(data) + + # add the property name to the base path + path = path_add_property(base_path, "location") + + # add Keying Set entry for this... + if grouping: + ks.paths.add(id_block, path, grouping_method='NAMED', group_name=grouping) + else: + ks.paths.add(id_block, path) + +# Rotation +def RKS_GEN_rotation(ksi, context, ks, data): + # get id-block and path info + id_block, base_path, grouping= get_transform_generators_base_info(data) + + # add the property name to the base path + # rotation mode affects the property used + if data.rotation_mode == 'QUATERNION': + path = path_add_property(base_path, "rotation_quaternion") + elif data.rotation_mode == 'AXISANGLE': + path = path_add_property(base_path, "rotation_axis_angle") + else: + path = path_add_property(base_path, "rotation_euler") + + # add Keying Set entry for this... + if grouping: + ks.paths.add(id_block, path, grouping_method='NAMED', group_name=grouping) + else: + ks.paths.add(id_block, path) + +# Scaling +def RKS_GEN_scaling(ksi, context, ks, data): + # get id-block and path info + id_block, base_path, grouping= get_transform_generators_base_info(data) + + # add the property name to the base path + path = path_add_property(base_path, "scale") + + # add Keying Set entry for this... + if grouping: + ks.paths.add(id_block, path, grouping_method='NAMED', group_name=grouping) + else: + ks.paths.add(id_block, path) + +########################### +# Un-needed stuff which is here to just shut up the warnings... + +classes = [] + +def register(): + register = bpy.types.register + for cls in classes: + register(cls) + + +def unregister(): + unregister = bpy.types.unregister + for cls in classes: + unregister(cls) + +if __name__ == "__main__": + register() + +########################### diff --git a/release/scripts/modules/add_object_utils.py b/release/scripts/modules/add_object_utils.py new file mode 100644 index 00000000000..cef368c529d --- /dev/null +++ b/release/scripts/modules/add_object_utils.py @@ -0,0 +1,83 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +import bpy +import mathutils + + +def add_object_align_init(context, operator): + + if operator and operator.properties.is_property_set("location") and operator.properties.is_property_set("rotation"): + location = mathutils.TranslationMatrix(mathutils.Vector(operator.properties.location)) + rotation = mathutils.Euler(operator.properties.rotation).to_matrix().resize4x4() + else: + # TODO, local view cursor! + location = mathutils.TranslationMatrix(context.scene.cursor_location) + + if context.user_preferences.edit.object_align == 'VIEW' and context.space_data.type == 'VIEW_3D': + rotation = context.space_data.region_3d.view_matrix.rotation_part().invert().resize4x4() + else: + rotation = mathutils.Matrix() + + # set the operator properties + if operator: + operator.properties.location = location.translation_part() + operator.properties.rotation = rotation.to_euler() + + return location * rotation + + +def add_object_data(context, obdata, operator=None): + + scene = context.scene + + # ugh, could be made nicer + for ob in scene.objects: + ob.selected = False + + obj_new = bpy.data.objects.new(obdata.name, obdata) + + base = scene.objects.link(obj_new) + base.selected = True + + if context.space_data and context.space_data.type == 'VIEW_3D': + base.layers_from_view(context.space_data) + + + obj_new.matrix_world = add_object_align_init(context, operator) + + obj_act = scene.objects.active + + if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type: + bpy.ops.object.mode_set(mode='OBJECT') + + obj_act.selected = True + scene.update() # apply location + #scene.objects.active = obj_new + + bpy.ops.object.join() # join into the active. + + bpy.ops.object.mode_set(mode='EDIT') + else: + scene.objects.active = obj_new + if context.user_preferences.edit.enter_edit_mode: + bpy.ops.object.mode_set(mode='EDIT') + + return base diff --git a/release/scripts/modules/blend_render_info.py b/release/scripts/modules/blend_render_info.py new file mode 100755 index 00000000000..dcd1f9cbee3 --- /dev/null +++ b/release/scripts/modules/blend_render_info.py @@ -0,0 +1,100 @@ +#!/usr/bin/python + +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +# This module can get render info without running from inside blender. +# +# This struct wont change according to Ton. +# Note that the size differs on 32/64bit +# +# typedef struct BHead { +# int code, len; +# void *old; +# int SDNAnr, nr; +# } BHead; + + +def read_blend_rend_chunk(path): + + import struct + + blendfile = open(path, 'rb') + + head = blendfile.read(7) + + if head[0:2] == b'\x1f\x8b': # gzip magic + import gzip + blendfile.close() + blendfile = gzip.open(path, 'rb') + head = blendfile.read(7) + + if head != b'BLENDER': + print("not a blend file:", path) + blendfile.close() + return [] + + is_64_bit = (blendfile.read(1) == b'-') + + # true for PPC, false for X86 + is_big_endian = (blendfile.read(1) == b'V') + + # Now read the bhead chunk!!! + blendfile.read(3) # skip the version + + scenes = [] + + sizeof_bhead = 24 if is_64_bit else 20 + + while blendfile.read(4) == b'REND': + sizeof_bhead_left = sizeof_bhead - 4 + + struct.unpack('>i' if is_big_endian else '<i', blendfile.read(4))[0] + sizeof_bhead_left -= 4 + + # We dont care about the rest of the bhead struct + blendfile.read(sizeof_bhead_left) + + # Now we want the scene name, start and end frame. this is 32bites long + start_frame, end_frame = struct.unpack('>2i' if is_big_endian else '<2i', blendfile.read(8)) + + scene_name = blendfile.read(24) + + scene_name = scene_name[:scene_name.index(b'\0')] + + try: + scene_name = str(scene_name, 'utf8') + except TypeError: + pass + + scenes.append((start_frame, end_frame, scene_name)) + + return scenes + + +def main(): + import sys + for arg in sys.argv[1:]: + if arg.lower().endswith('.blend'): + for value in read_blend_rend_chunk(arg): + print("%d %d %s" % value) + +if __name__ == '__main__': + main() diff --git a/release/scripts/modules/bpy/__init__.py b/release/scripts/modules/bpy/__init__.py index 12f8e19cef4..1e6db441599 100644 --- a/release/scripts/modules/bpy/__init__.py +++ b/release/scripts/modules/bpy/__init__.py @@ -43,10 +43,13 @@ def _main(): ## people need to explain how this is even a fix. # _sys.path[:] = filter(None, _sys.path) - # a bit nasty but this prevents help() and input() from locking blender - # Ideally we could have some way for the console to replace sys.stdin but - # python would lock blender while waiting for a return value, not easy :| - _sys.stdin = None + # because of how the console works. we need our own help() pager func. + # replace the bold function because it adds crazy chars + import pydoc + pydoc.getpager = lambda: pydoc.plainpager + pydoc.Helper.getline = lambda self, prompt: None + pydoc.TextDoc.bold = lambda self, text: text + # if "-d" in sys.argv: # Enable this to measure startup speed if 0: diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py index 7787d9ee5fe..5cde7091257 100644 --- a/release/scripts/modules/bpy/utils.py +++ b/release/scripts/modules/bpy/utils.py @@ -27,7 +27,7 @@ import bpy as _bpy import os as _os import sys as _sys -from _bpy import home_paths +from _bpy import home_paths, blend_paths def _test_import(module_name, loaded_modules): @@ -144,6 +144,9 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): _loaded.append(mod) if reload_scripts: + + # TODO, this is broken but should work, needs looking into + ''' # reload modules that may not be directly included for type_class_name in dir(_bpy.types): type_class = getattr(_bpy.types, type_class_name) @@ -156,6 +159,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): for module_name in sorted(loaded_modules): print("Reloading:", module_name) test_reload(_sys.modules[module_name]) + ''' # loop over and unload all scripts _loaded.reverse() @@ -166,23 +170,26 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): unregister() except: traceback.print_exc() + + for mod in _loaded: + reload(mod) + _loaded[:] = [] - for base_path in script_paths(user=False): - for path_subdir in ("ui", "op", "io", "cfg"): + user_path = user_script_path() + + for base_path in script_paths(): + for path_subdir in ("", "ui", "op", "io", "cfg", "keyingsets", "modules"): path = _os.path.join(base_path, path_subdir) if _os.path.isdir(path): sys_path_ensure(path) - for mod in modules_from_path(path, loaded_modules): - test_register(mod) + # only add this to sys.modules, dont run + if path_subdir == "modules": + continue - user_path = user_script_path() - if user_path: - for path_subdir in ("", "ui", "op", "io", "cfg"): - path = _os.path.join(user_path, path_subdir) - if _os.path.isdir(path): - sys_path_ensure(path) + if user_path != base_path and path_subdir == "": + continue # avoid loading 2.4x scripts for mod in modules_from_path(path, loaded_modules): test_register(mod) @@ -206,8 +213,26 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): def expandpath(path): + """ + Returns the absolute path relative to the current blend file using the "//" prefix. + """ if path.startswith("//"): - return _os.path.join(_os.path.dirname(_bpy.data.filename), path[2:]) + return _os.path.join(_os.path.dirname(_bpy.data.filepath), path[2:]) + + return path + + +def relpath(path, start=None): + """ + Returns the path relative to the current blend file using the "//" prefix. + + :arg start: Relative to this path, when not set the current filename is used. + :type start: string + """ + if not path.startswith("//"): + if start is None: + start = _os.path.dirname(_bpy.data.filepath) + return "//" + _os.path.relpath(path, start) return path @@ -315,3 +340,51 @@ def preset_paths(subdir): ''' return (_os.path.join(_presets, subdir), ) + + +def smpte_from_seconds(time, fps=None): + ''' + Returns an SMPTE formatted string from the time in seconds: "HH:MM:SS:FF". + + If the fps is not given the current scene is used. + ''' + import math + + if fps is None: + fps = _bpy.context.scene.render.fps + + hours = minutes = seconds = frames = 0 + + if time < 0: + time = - time + neg = "-" + else: + neg = "" + + if time >= 3600.0: # hours + hours = int(time / 3600.0) + time = time % 3600.0 + if time >= 60.0: # mins + minutes = int(time / 60.0) + time = time % 60.0 + + seconds = int(time) + frames = int(round(math.floor(((time - seconds) * fps)))) + + return "%s%02d:%02d:%02d:%02d" % (neg, hours, minutes, seconds, frames) + + +def smpte_from_frame(frame, fps=None, fps_base=None): + ''' + Returns an SMPTE formatted string from the frame: "HH:MM:SS:FF". + + If the fps and fps_base are not given the current scene is used. + ''' + + if fps is None: + fps = _bpy.context.scene.render.fps + + if fps_base is None: + fps_base = _bpy.context.scene.render.fps_base + + return smpte_from_seconds((frame * fps_base) / fps, fps) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 060de711637..9d6f5ce7b2f 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -19,7 +19,7 @@ # <pep8 compliant> from _bpy import types as bpy_types -from Mathutils import Vector +from mathutils import Vector StructRNA = bpy_types.Struct.__bases__[0] # StructRNA = bpy_types.Struct @@ -29,15 +29,62 @@ class Context(StructRNA): __slots__ = () def copy(self): + from types import BuiltinMethodType new_context = {} - generic_keys = StructRNA.__dict__.keys() - for item in dir(self): - if item not in generic_keys: - new_context[item] = getattr(self, item) + generic_attrs = list(StructRNA.__dict__.keys()) + ["bl_rna", "rna_type", "copy"] + for attr in dir(self): + if not (attr.startswith("_") or attr in generic_attrs): + value = getattr(self, attr) + if type(value) != BuiltinMethodType: + new_context[attr] = value return new_context +class Library(bpy_types.ID): + __slots__ = () + + @property + def users_id(self): + """ID datablocks which use this library""" + import bpy + + # See: readblenentry.c, IDTYPE_FLAGS_ISLINKABLE, we could make this an attribute in rna. + attr_links = "actions", "armatures", "brushes", "cameras", \ + "curves", "gpencil", "groups", "images", \ + "lamps", "lattices", "materials", "metaballs", \ + "meshes", "node_groups", "objects", "scenes", \ + "sounds", "textures", "texts", "fonts", "worlds" + + return tuple(id_block for attr in attr_links for id_block in getattr(bpy.data, attr) if id_block.library == self) + + +class Texture(bpy_types.ID): + __slots__ = () + + @property + def users_material(self): + """Materials that use this texture""" + import bpy + return tuple(mat for mat in bpy.data.materials if self in [slot.texture for slot in mat.texture_slots if slot]) + + @property + def users_object_modifier(self): + """Object modifiers that use this texture""" + import bpy + return tuple(obj for obj in bpy.data.objects if self in [mod.texture for mod in obj.modifiers if mod.type == 'DISPLACE']) + + +class Group(bpy_types.ID): + __slots__ = () + + @property + def users_dupli_group(self): + """The dupli group this group is used in""" + import bpy + return tuple(obj for obj in bpy.data.objects if self == obj.dupli_group) + + class Object(bpy_types.ID): __slots__ = () @@ -45,21 +92,19 @@ class Object(bpy_types.ID): def children(self): """All the children of this object""" import bpy - return [child for child in bpy.data.objects if child.parent == self] + return tuple(child for child in bpy.data.objects if child.parent == self) @property - def group_users(self): + def users_group(self): """The groups this object is in""" import bpy - name = self.name - return [group for group in bpy.data.groups if name in group.objects] + return tuple(group for group in bpy.data.groups if self in group.objects[:]) @property - def scene_users(self): + def users_scene(self): """The scenes this object is in""" import bpy - name = self.name - return [scene for scene in bpy.data.scenes if name in scene.objects] + return tuple(scene for scene in bpy.data.scenes if self in scene.objects[:]) class _GenericBone: @@ -95,19 +140,19 @@ class _GenericBone: def x_axis(self): """ Vector pointing down the x-axis of the bone. """ - return self.matrix.rotation_part() * Vector(1.0, 0.0, 0.0) + return self.matrix.rotation_part() * Vector((1.0, 0.0, 0.0)) @property def y_axis(self): """ Vector pointing down the x-axis of the bone. """ - return self.matrix.rotation_part() * Vector(0.0, 1.0, 0.0) + return self.matrix.rotation_part() * Vector((0.0, 1.0, 0.0)) @property def z_axis(self): """ Vector pointing down the x-axis of the bone. """ - return self.matrix.rotation_part() * Vector(0.0, 0.0, 1.0) + return self.matrix.rotation_part() * Vector((0.0, 0.0, 1.0)) @property def basename(self): @@ -236,8 +281,8 @@ class EditBone(StructRNA, _GenericBone): Transform the the bones head, tail, roll and envalope (when the matrix has a scale component). Expects a 4x4 or 3x3 matrix. """ - from Mathutils import Vector - z_vec = self.matrix.rotation_part() * Vector(0.0, 0.0, 1.0) + from mathutils import Vector + z_vec = self.matrix.rotation_part() * Vector((0.0, 0.0, 1.0)) self.tail = matrix * self.tail self.head = matrix * self.head scalar = matrix.median_scale @@ -303,7 +348,7 @@ class Mesh(bpy_types.ID): edge_face_count_dict = self.edge_face_count_dict return [edge_face_count_dict.get(ed.key, 0) for ed in self.edges] - def edge_loops(self, faces=None, seams=()): + def edge_loops_from_faces(self, faces=None, seams=()): """ Edge loops defined by faces @@ -314,7 +359,7 @@ class Mesh(bpy_types.ID): return a list of edge key lists [ [(0,1), (4, 8), (3,8)], ...] - optionaly, seams are edge keys that will be removed + return a list of edge vertex index lists """ OTHER_INDEX = 2, 3, 0, 1 # opposite face index @@ -379,6 +424,70 @@ class Mesh(bpy_types.ID): return edge_loops + def edge_loops_from_edges(self, edges=None): + """ + Edge loops defined by edges + + Takes me.edges or a list of edges and returns the edge loops + + return a list of vertex indices. + [ [1, 6, 7, 2], ...] + + closed loops have matching start and end values. + """ + line_polys = [] + + # Get edges not used by a face + if edges is None: + edges = self.edges + + if not hasattr(edges, "pop"): + edges = edges[:] + + edge_dict = {ed.key: ed for ed in self.edges if ed.selected} + + while edges: + current_edge = edges.pop() + vert_end, vert_start = current_edge.verts[:] + line_poly = [vert_start, vert_end] + + ok = True + while ok: + ok = False + #for i, ed in enumerate(edges): + i = len(edges) + while i: + i -= 1 + ed = edges[i] + v1, v2 = ed.verts + if v1 == vert_end: + line_poly.append(v2) + vert_end = line_poly[-1] + ok = 1 + del edges[i] + # break + elif v2 == vert_end: + line_poly.append(v1) + vert_end = line_poly[-1] + ok = 1 + del edges[i] + #break + elif v1 == vert_start: + line_poly.insert(0, v2) + vert_start = line_poly[0] + ok = 1 + del edges[i] + # break + elif v2 == vert_start: + line_poly.insert(0, v1) + vert_start = line_poly[0] + ok = 1 + del edges[i] + #break + line_polys.append(line_poly) + + return line_polys + class MeshEdge(StructRNA): __slots__ = () @@ -410,6 +519,24 @@ class MeshFace(StructRNA): return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0]) +class Text(bpy_types.ID): + __slots__ = () + + def as_string(self): + """Return the text as a string.""" + return "\n".join(line.line for line in self.lines) + + def from_string(self, string): + """Replace text with this string.""" + self.clear() + self.write(string) + + @property + def users_logic(self): + """Logic bricks that use this text""" + import bpy + return tuple(obj for obj in bpy.data.objects if self in [cont.text for cont in obj.game.controllers if cont.type == 'PYTHON']) + import collections @@ -490,9 +617,9 @@ class Header(StructRNA, _GenericUI): class Menu(StructRNA, _GenericUI): __slots__ = () - def path_menu(self, searchpaths, operator): + def path_menu(self, searchpaths, operator, props_default={}): layout = self.layout - # hard coded to set the operators 'path' to the filename. + # hard coded to set the operators 'filepath' to the filename. import os import bpy.utils @@ -501,17 +628,26 @@ class Menu(StructRNA, _GenericUI): # collect paths files = [] - for path in searchpaths: - files.extend([(f, os.path.join(path, f)) for f in os.listdir(path)]) + for directory in searchpaths: + files.extend([(f, os.path.join(directory, f)) for f in os.listdir(directory)]) files.sort() - for f, path in files: + for f, filepath in files: if f.startswith("."): continue - layout.operator(operator, text=bpy.utils.display_name(f)).path = path + preset_name = bpy.utils.display_name(f) + props = layout.operator(operator, text=preset_name) + + for attr, value in props_default.items(): + setattr(props, attr, value) + + props.filepath = filepath + if operator == "script.execute_preset": + props.menu_idname = self.bl_idname + props.preset_name = preset_name def draw_preset(self, context): """Define these on the subclass diff --git a/release/scripts/modules/console/complete_calltip.py b/release/scripts/modules/console/complete_calltip.py index c4687b4f10b..87fac9f4c07 100644 --- a/release/scripts/modules/console/complete_calltip.py +++ b/release/scripts/modules/console/complete_calltip.py @@ -124,7 +124,7 @@ def get_argspec(func, strip_self=True, doc=None, source=None): if source is None: try: source = inspect.getsource(func) - except TypeError: + except (TypeError, IOError): source = '' if source: match = re.search(DEF_SOURCE % func_name, source, RE_FLAG) diff --git a/release/scripts/modules/console/complete_import.py b/release/scripts/modules/console/complete_import.py index 875c557f497..4b50cf6deb8 100644 --- a/release/scripts/modules/console/complete_import.py +++ b/release/scripts/modules/console/complete_import.py @@ -32,6 +32,7 @@ changes have been made: - limit list of modules to prefix in case of "from w" - sorted modules - added sphinx documentation +- complete() returns a blank list of the module isnt found """ @@ -183,3 +184,8 @@ def complete(line): if len(words) >= 3 and words[0] == 'from': mod = words[1] return filter_prefix(try_import(mod), words[-1]) + + # get here if the import is not found + # import invalidmodule + # ^, in this case return nothing + return [] diff --git a/release/scripts/modules/graphviz_export.py b/release/scripts/modules/graphviz_export.py index 1e7c7adfb7f..900d69670d5 100644 --- a/release/scripts/modules/graphviz_export.py +++ b/release/scripts/modules/graphviz_export.py @@ -51,13 +51,13 @@ def compat_str(text, line_length=0): return text -def graph_armature(obj, path, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=True, XTRA_INFO=True): +def graph_armature(obj, filepath, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=True, XTRA_INFO=True): CONSTRAINTS = DRIVERS = True - fileobject = open(path, "w") + fileobject = open(filepath, "w") fw = fileobject.write fw(header) - fw('label = "%s::%s" ;' % (bpy.data.filename.split("/")[-1].split("\\")[-1], obj.name)) + fw('label = "%s::%s" ;' % (bpy.data.filepath.split("/")[-1].split("\\")[-1], obj.name)) arm = obj.data @@ -157,17 +157,18 @@ def graph_armature(obj, path, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=True, pbone = rna_path_as_pbone(rna_path) if pbone: - for target in fcurve_driver.driver.targets: - pbone_target = rna_path_as_pbone(target.data_path) - rna_path_target = target.data_path - if pbone_target: - opts = ['dir=forward', "weight=1", "arrowhead=normal", "arrowtail=none", "constraint=false", 'color="blue"', "labelfontsize=4"] # , - display_source = rna_path.replace("pose.bones", "") - display_target = rna_path_target.replace("pose.bones", "") - if XTRA_INFO: - label = "%s\\n%s" % (display_source, display_target) - opts.append('label="%s"' % compat_str(label)) - fw('"%s" -> "%s" [%s] ;\n' % (pbone_target.name, pbone.name, ','.join(opts))) + for var in fcurve_driver.driver.variables: + for target in var.targets: + pbone_target = rna_path_as_pbone(target.data_path) + rna_path_target = target.data_path + if pbone_target: + opts = ['dir=forward', "weight=1", "arrowhead=normal", "arrowtail=none", "constraint=false", 'color="blue"', "labelfontsize=4"] # , + display_source = rna_path.replace("pose.bones", "") + display_target = rna_path_target.replace("pose.bones", "") + if XTRA_INFO: + label = "%s\\n%s" % (display_source, display_target) + opts.append('label="%s"' % compat_str(label)) + fw('"%s" -> "%s" [%s] ;\n' % (pbone_target.name, pbone.name, ','.join(opts))) fw(footer) fileobject.close() @@ -177,7 +178,7 @@ def graph_armature(obj, path, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=True, import sys sys.stdout.flush() ''' - print("\nSaved:", path) + print("\nSaved:", filepath) return True if __name__ == "__main__": diff --git a/release/scripts/modules/rigify/__init__.py b/release/scripts/modules/rigify/__init__.py index 895afd20d59..ef8f62ad058 100644 --- a/release/scripts/modules/rigify/__init__.py +++ b/release/scripts/modules/rigify/__init__.py @@ -19,17 +19,17 @@ # <pep8 compliant> import bpy -from Mathutils import Vector +from mathutils import Vector # TODO, have these in a more general module from rna_prop_ui import rna_idprop_ui_prop_get SPECIAL_TYPES = "root", LAYER_TYPES = "main", "extra", "ik", "fk" -ORG_LAYERS = [n==31 for n in range(0,32)] -MCH_LAYERS = [n==30 for n in range(0,32)] -DEF_LAYERS = [n==29 for n in range(0,32)] -ROOT_LAYERS = [n==28 for n in range(0,32)] +ORG_LAYERS = [n == 31 for n in range(0, 32)] +MCH_LAYERS = [n == 30 for n in range(0, 32)] +DEF_LAYERS = [n == 29 for n in range(0, 32)] +ROOT_LAYERS = [n == 28 for n in range(0, 32)] ORG_PREFIX = "ORG-" MCH_PREFIX = "MCH-" @@ -38,7 +38,6 @@ DEF_PREFIX = "DEF-" WGT_PREFIX = "WGT-" - class RigifyError(Exception): """Exception raised for errors in the metarig. """ @@ -235,12 +234,12 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True): bone_gen = obj.pose.bones[bone.name] # Rotation mode and transform locks - bone_gen.rotation_mode = bone.rotation_mode - bone_gen.lock_rotation = tuple(bone.lock_rotation) - bone_gen.lock_rotation_w = bone.lock_rotation_w + bone_gen.rotation_mode = bone.rotation_mode + bone_gen.lock_rotation = tuple(bone.lock_rotation) + bone_gen.lock_rotation_w = bone.lock_rotation_w bone_gen.lock_rotations_4d = bone.lock_rotations_4d - bone_gen.lock_location = tuple(bone.lock_location) - bone_gen.lock_scale = tuple(bone.lock_scale) + bone_gen.lock_location = tuple(bone.lock_location) + bone_gen.lock_scale = tuple(bone.lock_scale) # Custom properties for prop in bone.keys(): @@ -456,12 +455,12 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True): bone.deform = True else: # Assign bone appearance if there is a widget for it - obj.pose.bones[bone_name].custom_shape = context.scene.objects.get(WGT_PREFIX+bone_name) + obj.pose.bones[bone_name].custom_shape = context.scene.objects.get(WGT_PREFIX + bone_name) layer_tot[:] = [max(lay) for lay in zip(layer_tot, bone.layer)] # Only for demo'ing - layer_show = [a and not (b or c or d) for a,b,c,d in zip(layer_tot, ORG_LAYERS, MCH_LAYERS, DEF_LAYERS)] + layer_show = [a and not (b or c or d) for a, b, c, d in zip(layer_tot, ORG_LAYERS, MCH_LAYERS, DEF_LAYERS)] arm.layer = layer_show @@ -535,7 +534,7 @@ def generate_test_all(context, GRAPH=False): new_objects = rigify.generate_test(context) if GRAPH: - base_name = os.path.splitext(bpy.data.filename)[0] + base_name = os.path.splitext(bpy.data.filepath)[0] for obj, obj_new in new_objects: for obj in (obj, obj_new): fn = base_name + "-" + bpy.utils.clean_name(obj.name) diff --git a/release/scripts/modules/rigify/arm_biped.py b/release/scripts/modules/rigify/arm_biped.py index 7aa6a37304a..7a99eb5d80a 100644 --- a/release/scripts/modules/rigify/arm_biped.py +++ b/release/scripts/modules/rigify/arm_biped.py @@ -23,7 +23,7 @@ from math import radians, pi from rigify import RigifyError, ORG_PREFIX from rigify_utils import bone_class_instance, copy_bone_simple, add_pole_target_bone, add_stretch_to, blend_bone_list, get_side_name, get_base_name from rna_prop_ui import rna_idprop_ui_prop_get -from Mathutils import Vector +from mathutils import Vector METARIG_NAMES = "shoulder", "arm", "forearm", "hand" @@ -192,7 +192,7 @@ def fk(obj, definitions, base_names, options): # shoulder is used as a hinge fk_chain.rename("shoulder", "MCH-%s_hinge" % base_names[mt.arm]) - fk_chain.shoulder_e.translate(Vector(0.0, fk_chain.shoulder_e.length / 2, 0.0)) + fk_chain.shoulder_e.translate(Vector((0.0, fk_chain.shoulder_e.length / 2, 0.0))) # upper arm constrains to this. ex.socket_e = copy_bone_simple(arm, mt.arm, "MCH-%s_socket" % base_names[mt.arm]) @@ -240,11 +240,11 @@ def fk(obj, definitions, base_names, options): con.name = "hinge" con.target = obj con.subtarget = mt.shoulder - driver_fcurve = con.driver_add("influence", 0) + driver_fcurve = con.driver_add("influence") driver = driver_fcurve.driver - controller_path = fk_chain.arm_p.path_to_id() + controller_path = fk_chain.arm_p.path_from_id() # add custom prop fk_chain.arm_p["hinge"] = 0.0 prop = rna_idprop_ui_prop_get(fk_chain.arm_p, "hinge", create=True) diff --git a/release/scripts/modules/rigify/copy.py b/release/scripts/modules/rigify/copy.py index 907435da2b4..e0bff555a9b 100644 --- a/release/scripts/modules/rigify/copy.py +++ b/release/scripts/modules/rigify/copy.py @@ -110,4 +110,3 @@ def main(obj, bone_definition, base_names, options): deform(obj, bone_definition, base_names, options) return (cpy,) - diff --git a/release/scripts/modules/rigify/eye_balls.py b/release/scripts/modules/rigify/eye_balls.py index 9cb3c8229b0..48f0448dfb3 100644 --- a/release/scripts/modules/rigify/eye_balls.py +++ b/release/scripts/modules/rigify/eye_balls.py @@ -20,13 +20,92 @@ import bpy from rna_prop_ui import rna_idprop_ui_prop_get -from Mathutils import Vector +from mathutils import Vector from rigify import RigifyError from rigify_utils import copy_bone_simple #METARIG_NAMES = ("cpy",) RIG_TYPE = "eye_balls" +def addget_shape_key(obj, name="Key"): + """ Fetches a shape key, or creates it if it doesn't exist + """ + # Create a shapekey set if it doesn't already exist + if obj.data.shape_keys is None: + shape = obj.add_shape_key(name="Basis", from_mix=False) + obj.active_shape_key_index = 0 + + # Get the shapekey, or create it if it doesn't already exist + if name in obj.data.shape_keys.keys: + shape_key = obj.data.shape_keys.keys[name] + else: + shape_key = obj.add_shape_key(name=name, from_mix=False) + + return shape_key + + +def addget_shape_key_driver(obj, name="Key"): + """ Fetches the driver for the shape key, or creates it if it doesn't + already exist. + """ + driver_path = 'keys["' + name + '"].value' + fcurve = None + driver = None + new = False + if obj.data.shape_keys.animation_data is not None: + for driver_s in obj.data.shape_keys.animation_data.drivers: + if driver_s.data_path == driver_path: + fcurve = driver_s + if fcurve == None: + fcurve = obj.data.shape_keys.keys[name].driver_add("value") + fcurve.driver.type = 'AVERAGE' + new = True + + return fcurve, new + + +def create_shape_and_driver(obj, bone, meshes, shape_name, var_name, var_path, expression): + """ Creates/gets a shape key and sets up a driver for it. + + obj = armature object + bone = driving bone name + meshes = list of meshes to create the shapekey/driver on + shape_name = name of the shape key + var_name = name of the driving variable + var_path = path to the property on the bone to drive with + expression = python expression for the driver + """ + pb = obj.pose.bones + bpy.ops.object.mode_set(mode='OBJECT') + + for mesh_name in meshes: + mesh_obj = bpy.data.objects[mesh_name] + + # Add/get the shape key + shape = addget_shape_key(mesh_obj, name=shape_name) + + # Add/get the shape key driver + fcurve, a = addget_shape_key_driver(mesh_obj, name=shape_name) + + # Set up the driver + driver = fcurve.driver + driver.type = 'SCRIPTED' + driver.expression = expression + + # Get the variable, or create it if it doesn't already exist + if var_name in driver.variables: + var = driver.variables[var_name] + else: + var = driver.variables.new() + var.name = var_name + + # Set up the variable + var.type = "SINGLE_PROP" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = 'pose.bones["' + bone + '"]' + var_path + + def mark_actions(): for action in bpy.data.actions: action.tag = True @@ -120,6 +199,12 @@ def control(obj, definitions, base_names, options): head = definitions[0] eye_target = definitions[1] + # Get list of pupil mesh objects + if "mesh" in options: + pupil_meshes = options["mesh"].replace(" ", "").split(",") + else: + pupil_meshes = [] + # Get list of eyes if "eyes" in options: eye_base_names = options["eyes"].replace(" ", "").split(",") @@ -132,7 +217,7 @@ def control(obj, definitions, base_names, options): eyes += ["ORG-"+name] # Get the average position of the eyes - center = Vector(0,0,0) + center = Vector((0, 0, 0)) for eye in eyes: center += eb[eye].head if len(eyes) != 0: @@ -197,7 +282,7 @@ def control(obj, definitions, base_names, options): prop["min"] = 0.0 prop["max"] = 1.0 - free_driver_path = pb[target_ctrl].path_to_id() + '["free"]' + free_driver_path = pb[target_ctrl].path_from_id() + '["free"]' # Constraints # Mind's eye tracks eye target control @@ -210,7 +295,7 @@ def control(obj, definitions, base_names, options): con.target = obj con.subtarget = head - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' mod = fcurve.modifiers[0] @@ -241,11 +326,55 @@ def control(obj, definitions, base_names, options): con.subtarget = target_ctrl con.action = spread_action con.transform_channel = 'SCALE_X' - con.start_frame = -20 - con.end_frame = 20 + con.frame_start = -20 + con.frame_end = 20 con.minimum = 0.0 con.maximum = 2.0 con.target_space = 'LOCAL' + + + # Get/create the shape keys and drivers for pupil dilation + shape_names = ["PUPILS-dilate_wide", "PUPILS-dilate_narrow"] + slider_name = "pupil_dilate" + + # Set up the custom property on the bone + prop = rna_idprop_ui_prop_get(pb[target_ctrl], slider_name, create=True) + pb[target_ctrl][slider_name] = 0.0 + prop["min"] = 0.0 + prop["max"] = 1.0 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + if len(shape_names) > 1: + prop["min"] = -1.0 + prop["soft_min"] = -1.0 + + # Add the shape drivers + # Positive + if shape_names[0] != "": + # Set up the variables for creating the shape key driver + shape_name = shape_names[0] + var_name = slider_name.replace(".", "_").replace("-", "_") + var_path = '["' + slider_name + '"]' + if slider_name + "_fac" in options: + fac = options[slider_name + "_fac"] + else: + fac = 1.0 + expression = var_name + " * " + str(fac) + # Create the shape key driver + create_shape_and_driver(obj, target_ctrl, pupil_meshes, shape_name, var_name, var_path, expression) + # Negative + if shape_names[0] != "" and len(shape_names) > 1: + # Set up the variables for creating the shape key driver + shape_name = shape_names[1] + var_name = slider_name.replace(".", "_").replace("-", "_") + var_path = '["' + slider_name + '"]' + if slider_name + "_fac" in options: + fac = options[slider_name + "_fac"] + else: + fac = 1.0 + expression = var_name + " * " + str(fac) + " * -1" + # Create the shape key driver + create_shape_and_driver(obj, target_ctrl, pupil_meshes, shape_name, var_name, var_path, expression) diff --git a/release/scripts/modules/rigify/eye_lid.py b/release/scripts/modules/rigify/eye_lid.py index 39804e6b704..bb9749011c2 100644 --- a/release/scripts/modules/rigify/eye_lid.py +++ b/release/scripts/modules/rigify/eye_lid.py @@ -21,7 +21,7 @@ import bpy from rna_prop_ui import rna_idprop_ui_prop_get from math import acos -from Mathutils import Vector +from mathutils import Vector from rigify import RigifyError from rigify_utils import copy_bone_simple @@ -299,14 +299,15 @@ def control(obj, definitions, base_names, options): lid8 = copy_bone_simple(obj.data, definitions[9], base_names[definitions[9]]).name size = eb[lid1].length - eb[lid1].tail = eb[lid1].head + Vector(0,size,0) - eb[lid2].tail = eb[lid2].head + Vector(0,size,0) - eb[lid3].tail = eb[lid3].head + Vector(0,size,0) - eb[lid4].tail = eb[lid4].head + Vector(0,size,0) - eb[lid5].tail = eb[lid5].head + Vector(0,size,0) - eb[lid6].tail = eb[lid6].head + Vector(0,size,0) - eb[lid7].tail = eb[lid7].head + Vector(0,size,0) - eb[lid8].tail = eb[lid8].head + Vector(0,size,0) + size_y = Vector(0.0, size, 0.0) + eb[lid1].tail = eb[lid1].head + size_y + eb[lid2].tail = eb[lid2].head + size_y + eb[lid3].tail = eb[lid3].head + size_y + eb[lid4].tail = eb[lid4].head + size_y + eb[lid5].tail = eb[lid5].head + size_y + eb[lid6].tail = eb[lid6].head + size_y + eb[lid7].tail = eb[lid7].head + size_y + eb[lid8].tail = eb[lid8].head + size_y eb[lid1].roll = 0 eb[lid2].roll = 0 @@ -355,7 +356,7 @@ def control(obj, definitions, base_names, options): prop["min"] = 0.0 prop["max"] = 1.0 - close_driver_path = pb[upper_lid_ctrl].path_to_id() + '["close_action"]' + close_driver_path = pb[upper_lid_ctrl].path_from_id() + '["close_action"]' # Constraints @@ -433,12 +434,12 @@ def control(obj, definitions, base_names, options): con.subtarget = upper_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance*2 con.maximum = distance con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -452,12 +453,12 @@ def control(obj, definitions, base_names, options): con.subtarget = upper_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance*2 con.maximum = distance con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -470,12 +471,12 @@ def control(obj, definitions, base_names, options): con.subtarget = upper_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance*2 con.maximum = distance con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -488,12 +489,12 @@ def control(obj, definitions, base_names, options): con.subtarget = upper_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance*2 con.maximum = distance con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -506,12 +507,12 @@ def control(obj, definitions, base_names, options): con.subtarget = upper_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance*2 con.maximum = distance con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -525,12 +526,12 @@ def control(obj, definitions, base_names, options): con.subtarget = lower_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance con.maximum = distance*2 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -543,12 +544,12 @@ def control(obj, definitions, base_names, options): con.subtarget = lower_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance con.maximum = distance*2 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -561,12 +562,12 @@ def control(obj, definitions, base_names, options): con.subtarget = lower_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance con.maximum = distance*2 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -579,12 +580,12 @@ def control(obj, definitions, base_names, options): con.subtarget = lower_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance con.maximum = distance*2 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -597,12 +598,12 @@ def control(obj, definitions, base_names, options): con.subtarget = lower_lid_ctrl con.action = close_action con.transform_channel = 'LOCATION_Y' - con.start_frame = -30 - con.end_frame = 30 + con.frame_start = -30 + con.frame_end = 30 con.minimum = -distance con.maximum = distance*2 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() diff --git a/release/scripts/modules/rigify/finger_curl.py b/release/scripts/modules/rigify/finger_curl.py index f6574fc75bb..63f1816012b 100644 --- a/release/scripts/modules/rigify/finger_curl.py +++ b/release/scripts/modules/rigify/finger_curl.py @@ -57,31 +57,20 @@ def metarig_template(): def metarig_definition(obj, orig_bone_name): ''' The bone given is the first in a chain - Expects a chain of at least 2 children. + Expects a chain with at least 1 child of the same base name. eg. - finger -> finger_01 -> finger_02 + finger_01 -> finger_02 ''' - bone_definition = [] - orig_bone = obj.data.bones[orig_bone_name] - bone_definition.append(orig_bone.name) - - bone = orig_bone - chain = 0 - while chain < 2: # first 2 bones only have 1 child - children = bone.children - - if len(children) != 1: - raise RigifyError("expected the chain to have 2 children from bone '%s' without a fork" % orig_bone_name) - bone = children[0] - bone_definition.append(bone.name) # finger_02, finger_03 - chain += 1 - - if len(bone_definition) != len(METARIG_NAMES): - raise RigifyError("internal problem, expected %d bones" % len(METARIG_NAMES)) - + bone_definition = [orig_bone.name] + + bone_definition.extend([child.name for child in orig_bone.children_recursive_basename]) + + if len(bone_definition) < 2: + raise RigifyError("expected the chain to have at least 1 child from bone '%s' without the same base name" % orig_bone_name) + return bone_definition @@ -90,6 +79,8 @@ def deform(obj, definitions, base_names, options): """ bpy.ops.object.mode_set(mode='EDIT') + three_digits = True if len(definitions) > 2 else False + # Create base digit bones: two bones, each half of the base digit. f1a = copy_bone_simple(obj.data, definitions[0], "DEF-%s.01" % base_names[definitions[0]], parent=True) f1b = copy_bone_simple(obj.data, definitions[0], "DEF-%s.02" % base_names[definitions[0]], parent=True) @@ -102,13 +93,15 @@ def deform(obj, definitions, base_names, options): # Create the other deform bones. f2 = copy_bone_simple(obj.data, definitions[1], "DEF-%s" % base_names[definitions[1]], parent=True) - f3 = copy_bone_simple(obj.data, definitions[2], "DEF-%s" % base_names[definitions[2]], parent=True) + if three_digits: + f3 = copy_bone_simple(obj.data, definitions[2], "DEF-%s" % base_names[definitions[2]], parent=True) # Store names before leaving edit mode f1a_name = f1a.name f1b_name = f1b.name f2_name = f2.name - f3_name = f3.name + if three_digits: + f3_name = f3.name # Leave edit mode bpy.ops.object.mode_set(mode='OBJECT') @@ -117,7 +110,8 @@ def deform(obj, definitions, base_names, options): f1a = obj.pose.bones[f1a_name] f1b = obj.pose.bones[f1b_name] f2 = obj.pose.bones[f2_name] - f3 = obj.pose.bones[f3_name] + if three_digits: + f3 = obj.pose.bones[f3_name] # Constrain the base digit's bones con = f1a.constraints.new('DAMPED_TRACK') @@ -141,15 +135,18 @@ def deform(obj, definitions, base_names, options): con.target = obj con.subtarget = definitions[1] - con = f3.constraints.new('COPY_TRANSFORMS') - con.name = "copy_transforms" - con.target = obj - con.subtarget = definitions[2] + if three_digits: + con = f3.constraints.new('COPY_TRANSFORMS') + con.name = "copy_transforms" + con.target = obj + con.subtarget = definitions[2] def main(obj, bone_definition, base_names, options): # *** EDITMODE bpy.ops.object.mode_set(mode='EDIT') + + three_digits = True if len(bone_definition) > 2 else False # get assosiated data arm = obj.data @@ -159,7 +156,8 @@ def main(obj, bone_definition, base_names, options): org_f1 = bone_definition[0] # Original finger bone 01 org_f2 = bone_definition[1] # Original finger bone 02 - org_f3 = bone_definition[2] # Original finger bone 03 + if three_digits: + org_f3 = bone_definition[2] # Original finger bone 03 # Check options if "bend_ratio" in options: @@ -179,7 +177,10 @@ def main(obj, bone_definition, base_names, options): # Create the control bone base_name = base_names[bone_definition[0]].split(".", 1)[0] - tot_len = eb[org_f1].length + eb[org_f2].length + eb[org_f3].length + if three_digits: + tot_len = eb[org_f1].length + eb[org_f2].length + eb[org_f3].length + else: + tot_len = eb[org_f1].length + eb[org_f2].length control = copy_bone_simple(arm, bone_definition[0], base_name + get_side_name(base_names[bone_definition[0]]), parent=True).name eb[control].connected = eb[org_f1].connected eb[control].parent = eb[org_f1].parent @@ -188,26 +189,30 @@ def main(obj, bone_definition, base_names, options): # Create secondary control bones f1 = copy_bone_simple(arm, bone_definition[0], base_names[bone_definition[0]]).name f2 = copy_bone_simple(arm, bone_definition[1], base_names[bone_definition[1]]).name - f3 = copy_bone_simple(arm, bone_definition[2], base_names[bone_definition[2]]).name + if three_digits: + f3 = copy_bone_simple(arm, bone_definition[2], base_names[bone_definition[2]]).name # Create driver bones df1 = copy_bone_simple(arm, bone_definition[0], "MCH-" + base_names[bone_definition[0]]).name eb[df1].length /= 2 df2 = copy_bone_simple(arm, bone_definition[1], "MCH-" + base_names[bone_definition[1]]).name eb[df2].length /= 2 - df3 = copy_bone_simple(arm, bone_definition[2], "MCH-" + base_names[bone_definition[2]]).name - eb[df3].length /= 2 + if three_digits: + df3 = copy_bone_simple(arm, bone_definition[2], "MCH-" + base_names[bone_definition[2]]).name + eb[df3].length /= 2 # Set parents of the bones, interleaving the driver bones with the secondary control bones - eb[f3].connected = False - eb[df3].connected = False + if three_digits: + eb[f3].connected = False + eb[df3].connected = False eb[f2].connected = False eb[df2].connected = False eb[f1].connected = False eb[df1].connected = eb[org_f1].connected - eb[f3].parent = eb[df3] - eb[df3].parent = eb[f2] + if three_digits: + eb[f3].parent = eb[df3] + eb[df3].parent = eb[f2] eb[f2].parent = eb[df2] eb[df2].parent = eb[f1] eb[f1].parent = eb[df1] @@ -234,12 +239,15 @@ def main(obj, bone_definition, base_names, options): pb[control].lock_scale = True, False, True pb[f1].rotation_mode = 'YZX' pb[f2].rotation_mode = 'YZX' - pb[f3].rotation_mode = 'YZX' + if three_digits: + pb[f3].rotation_mode = 'YZX' pb[f1].lock_location = True, True, True pb[f2].lock_location = True, True, True - pb[f3].lock_location = True, True, True + if three_digits: + pb[f3].lock_location = True, True, True pb[df2].rotation_mode = 'YZX' - pb[df3].rotation_mode = 'YZX' + if three_digits: + pb[df3].rotation_mode = 'YZX' # Add the bend_ratio property to the control bone pb[control]["bend_ratio"] = bend_ratio @@ -271,18 +279,19 @@ def main(obj, bone_definition, base_names, options): con.target = obj con.subtarget = f2 - con = pb[org_f3].constraints.new('COPY_TRANSFORMS') - con.target = obj - con.subtarget = f3 + if three_digits: + con = pb[org_f3].constraints.new('COPY_TRANSFORMS') + con.target = obj + con.subtarget = f3 if make_hinge: con = pb[hinge].constraints.new('COPY_TRANSFORMS') con.target = obj con.subtarget = bb[org_f1].parent.name - hinge_driver_path = pb[control].path_to_id() + '["hinge"]' + hinge_driver_path = pb[control].path_from_id() + '["hinge"]' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -301,10 +310,15 @@ def main(obj, bone_definition, base_names, options): con.subtarget = socket # Create the drivers for the driver bones (control bone scale rotates driver bones) - controller_path = pb[control].path_to_id() # 'pose.bones["%s"]' % control_bone_name + controller_path = pb[control].path_from_id() # 'pose.bones["%s"]' % control_bone_name + + if three_digits: + finger_digits = [df2, df3] + else: + finger_digits = [df2] i = 0 - for bone in [df2, df3]: + for bone in finger_digits: # XXX - todo, any number if i == 2: @@ -334,10 +348,13 @@ def main(obj, bone_definition, base_names, options): var.targets[0].data_path = controller_path + '["bend_ratio"]' # XXX - todo, any number - if i == 0: - driver.expression = '(-scale+1.0)*pi*2.0*(1.0-br)' - elif i == 1: - driver.expression = '(-scale+1.0)*pi*2.0*br' + if three_digits: + if i == 0: + driver.expression = '(-scale+1.0)*pi*2.0*(1.0-br)' + elif i == 1: + driver.expression = '(-scale+1.0)*pi*2.0*br' + else: + driver.expression = driver.expression = '(-scale+1.0)*pi*2.0' i += 1 @@ -346,11 +363,16 @@ def main(obj, bone_definition, base_names, options): layer = [n==options["ex_layer"] for n in range(0,32)] else: layer = list(arm.bones[bone_definition[0]].layer) - for bone_name in [f1, f2, f3]: - arm.bones[bone_name].layer = layer + #for bone_name in [f1, f2, f3]: + # arm.bones[bone_name].layer = layer + arm.bones[f1].layer = layer + arm.bones[f2].layer = layer + if three_digits: + arm.bones[f3].layer = layer layer = list(arm.bones[bone_definition[0]].layer) bb[control].layer = layer # no blending the result of this return None + diff --git a/release/scripts/modules/rigify/leg_biped.py b/release/scripts/modules/rigify/leg_biped.py index 40d2ea0c4f2..53028986873 100644 --- a/release/scripts/modules/rigify/leg_biped.py +++ b/release/scripts/modules/rigify/leg_biped.py @@ -201,7 +201,7 @@ def ik(obj, bone_definition, base_names, options): ik.knee_target_e.local_location = False # roll the bone to point up... could also point in the same direction as ik.foot_roll - # ik.foot_roll_02_e.matrix * Vector(0.0, 0.0, 1.0) # ACK!, no rest matrix in editmode + # ik.foot_roll_02_e.matrix * Vector((0.0, 0.0, 1.0)) # ACK!, no rest matrix in editmode ik.foot_roll_01_e.align_roll((0.0, 0.0, -1.0)) bpy.ops.object.mode_set(mode='OBJECT') @@ -227,7 +227,7 @@ def ik(obj, bone_definition, base_names, options): con = ik_chain.shin_p.constraints.new('IK') con.chain_length = 2 con.iterations = 500 - con.pole_angle = -pi/2 + con.pole_angle = -pi / 2.0 con.use_tail = True con.use_stretch = True con.use_target = True @@ -265,7 +265,7 @@ def ik(obj, bone_definition, base_names, options): # last step setup layers if "ik_layer" in options: - layer = [n==options["ik_layer"] for n in range(0,32)] + layer = [n == options["ik_layer"] for n in range(0, 32)] else: layer = list(mt_chain.thigh_b.layer) for attr in ik_chain.attr_names: @@ -279,7 +279,7 @@ def ik(obj, bone_definition, base_names, options): def fk(obj, bone_definition, base_names, options): - from Mathutils import Vector + from mathutils import Vector arm = obj.data # these account for all bones in METARIG_NAMES @@ -298,7 +298,7 @@ def fk(obj, bone_definition, base_names, options): ex.thigh_socket_e = copy_bone_simple(arm, mt_chain.thigh, "MCH-%s_socket" % base_names[mt_chain.thigh], parent=True) ex.thigh_socket = ex.thigh_socket_e.name - ex.thigh_socket_e.tail = ex.thigh_socket_e.head + Vector(0.0, 0.0, ex.thigh_socket_e.length / 4.0) + ex.thigh_socket_e.tail = ex.thigh_socket_e.head + Vector((0.0, 0.0, ex.thigh_socket_e.length / 4.0)) ex.thigh_hinge_e = copy_bone_simple(arm, mt.hips, "MCH-%s_hinge" % base_names[mt_chain.thigh], parent=False) ex.thigh_hinge = ex.thigh_hinge_e.name @@ -349,9 +349,9 @@ def fk(obj, bone_definition, base_names, options): con.subtarget = mt.hips # add driver - hinge_driver_path = fk_chain.thigh_p.path_to_id() + '["hinge"]' + hinge_driver_path = fk_chain.thigh_p.path_from_id() + '["hinge"]' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -368,7 +368,7 @@ def fk(obj, bone_definition, base_names, options): # last step setup layers if "fk_layer" in options: - layer = [n==options["fk_layer"] for n in range(0,32)] + layer = [n == options["fk_layer"] for n in range(0, 32)] else: layer = list(mt_chain.thigh_b.layer) for attr in fk_chain.attr_names: @@ -499,4 +499,3 @@ def main(obj, bone_definition, base_names, options): bpy.ops.object.mode_set(mode='OBJECT') blend_bone_list(obj, bone_definition + [None], bones_fk, bones_ik, target_bone=bones_ik[6], target_prop="ik", blend_default=1.0) - diff --git a/release/scripts/modules/rigify/leg_quadruped.py b/release/scripts/modules/rigify/leg_quadruped.py index c21680740bd..688387bbd53 100644 --- a/release/scripts/modules/rigify/leg_quadruped.py +++ b/release/scripts/modules/rigify/leg_quadruped.py @@ -23,7 +23,7 @@ from rna_prop_ui import rna_idprop_ui_prop_get from math import pi from rigify import RigifyError from rigify_utils import bone_class_instance, copy_bone_simple, get_side_name, get_base_name -from Mathutils import Vector +from mathutils import Vector METARIG_NAMES = "hips", "thigh", "shin", "foot", "toe" @@ -160,7 +160,7 @@ def ik(obj, bone_definition, base_names, options): ik.foot_roll_e.parent = ik_chain.foot_e ik.foot_roll_e.head -= mt_chain.toe_e.vector.normalize() * mt_chain.foot_e.length ik.foot_roll_e.tail = ik.foot_roll_e.head - (mt_chain.foot_e.vector.normalize() * mt_chain.toe_e.length) - ik.foot_roll_e.align_roll(mt_chain.foot_e.matrix.rotation_part() * Vector(0.0, 0.0, -1.0)) + ik.foot_roll_e.align_roll(mt_chain.foot_e.matrix.rotation_part() * Vector((0.0, 0.0, -1.0))) # MCH-foot ik.foot_roll_01_e = copy_bone_simple(arm, mt_chain.foot, "MCH-" + base_names[mt_chain.foot]) @@ -207,13 +207,13 @@ def ik(obj, bone_definition, base_names, options): prop["min"] = 0.0 prop["max"] = 1.0 - ik_driver_path = pb[ik_chain.foot].path_to_id() + '["ik"]' + ik_driver_path = pb[ik_chain.foot].path_from_id() + '["ik"]' # simple constraining of orig bones con = mt_chain.thigh_p.constraints.new('COPY_TRANSFORMS') con.target = obj con.subtarget = ik_chain.thigh - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -225,7 +225,7 @@ def ik(obj, bone_definition, base_names, options): con = mt_chain.shin_p.constraints.new('COPY_TRANSFORMS') con.target = obj con.subtarget = ik_chain.shin - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -237,7 +237,7 @@ def ik(obj, bone_definition, base_names, options): con = mt_chain.foot_p.constraints.new('COPY_TRANSFORMS') con.target = obj con.subtarget = ik.foot_roll_02 - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -249,7 +249,7 @@ def ik(obj, bone_definition, base_names, options): con = mt_chain.toe_p.constraints.new('COPY_TRANSFORMS') con.target = obj con.subtarget = ik_chain.toe - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -369,9 +369,9 @@ def fk(obj, bone_definition, base_names, options): prop["min"] = 0.0 prop["max"] = 1.0 - hinge_driver_path = pb[fk_chain.thigh].path_to_id() + '["hinge"]' + hinge_driver_path = pb[fk_chain.thigh].path_from_id() + '["hinge"]' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' diff --git a/release/scripts/modules/rigify/mouth.py b/release/scripts/modules/rigify/mouth.py index 31d7c5a1ce9..d516a48ec95 100644 --- a/release/scripts/modules/rigify/mouth.py +++ b/release/scripts/modules/rigify/mouth.py @@ -21,7 +21,7 @@ import bpy from rna_prop_ui import rna_idprop_ui_prop_get from math import acos, pi -from Mathutils import Vector +from mathutils import Vector from rigify import RigifyError from rigify_utils import copy_bone_simple @@ -77,7 +77,7 @@ def addget_shape_key_driver(obj, name="Key"): if driver_s.data_path == driver_path: fcurve = driver_s if fcurve == None: - fcurve = obj.data.shape_keys.keys[name].driver_add("value", 0) + fcurve = obj.data.shape_keys.keys[name].driver_add("value") fcurve.driver.type = 'AVERAGE' new = True @@ -173,7 +173,7 @@ def deform(obj, definitions, base_names, options): jopen1 = copy_bone_simple(obj.data, jaw, "MCH-"+base_names[jaw]+".track1", parent=True).name eb[jopen1].connected = False eb[jopen1].head = eb[jaw].tail - eb[jopen1].tail = eb[jopen1].head + Vector(0, 0, eb[jaw].length/4) + eb[jopen1].tail = eb[jopen1].head + Vector((0, 0, eb[jaw].length/4)) jopen2 = copy_bone_simple(obj.data, jopen1, "MCH-"+base_names[jaw]+".track2").name eb[jopen2].parent = eb[jaw] @@ -427,7 +427,7 @@ def control(obj, definitions, base_names, options): # Jaw open tracker jopent = copy_bone_simple(obj.data, jaw_e.name, "MCH-"+base_names[jaw_e.name]+".track", parent=True).name eb[jopent].connected = False - eb[jopent].tail = jaw_e.tail + Vector(0,0,jaw_e.length) + eb[jopent].tail = jaw_e.tail + Vector((0.0, 0.0, jaw_e.length)) eb[jopent].head = jaw_e.tail bpy.ops.object.mode_set(mode='OBJECT') @@ -448,7 +448,7 @@ def control(obj, definitions, base_names, options): prop["min"] = 0.0 prop["max"] = 1.0 - open_driver_path = pb[lip1].path_to_id() + '["open_action"]' + open_driver_path = pb[lip1].path_from_id() + '["open_action"]' # Constraints @@ -543,12 +543,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -561,12 +561,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -579,12 +579,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -597,12 +597,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -615,12 +615,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -633,12 +633,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -651,12 +651,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -669,12 +669,12 @@ def control(obj, definitions, base_names, options): con.subtarget = jopent con.action = open_action con.transform_channel = 'SCALE_Y' - con.start_frame = 0 - con.end_frame = 60 + con.frame_start = 0 + con.frame_end = 60 con.minimum = 0.0 con.maximum = 1.0 con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() diff --git a/release/scripts/modules/rigify/neck.py b/release/scripts/modules/rigify/neck.py new file mode 100644 index 00000000000..0d2ab25bcc9 --- /dev/null +++ b/release/scripts/modules/rigify/neck.py @@ -0,0 +1,344 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +import bpy +from rigify import RigifyError +from rigify_utils import bone_class_instance, copy_bone_simple +from rna_prop_ui import rna_idprop_ui_prop_get + + + +def metarig_template(): + # TODO: + ## generated by rigify.write_meta_rig + #bpy.ops.object.mode_set(mode='EDIT') + #obj = bpy.context.active_object + #arm = obj.data + #bone = arm.edit_bones.new('body') + #bone.head[:] = 0.0000, -0.0276, -0.1328 + #bone.tail[:] = 0.0000, -0.0170, -0.0197 + #bone.roll = 0.0000 + #bone.connected = False + #bone = arm.edit_bones.new('head') + #bone.head[:] = 0.0000, -0.0170, -0.0197 + #bone.tail[:] = 0.0000, 0.0726, 0.1354 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['body'] + #bone = arm.edit_bones.new('neck.01') + #bone.head[:] = 0.0000, -0.0170, -0.0197 + #bone.tail[:] = 0.0000, -0.0099, 0.0146 + #bone.roll = 0.0000 + #bone.connected = False + #bone.parent = arm.edit_bones['head'] + #bone = arm.edit_bones.new('neck.02') + #bone.head[:] = 0.0000, -0.0099, 0.0146 + #bone.tail[:] = 0.0000, -0.0242, 0.0514 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.01'] + #bone = arm.edit_bones.new('neck.03') + #bone.head[:] = 0.0000, -0.0242, 0.0514 + #bone.tail[:] = 0.0000, -0.0417, 0.0868 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.02'] + #bone = arm.edit_bones.new('neck.04') + #bone.head[:] = 0.0000, -0.0417, 0.0868 + #bone.tail[:] = 0.0000, -0.0509, 0.1190 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.03'] + #bone = arm.edit_bones.new('neck.05') + #bone.head[:] = 0.0000, -0.0509, 0.1190 + #bone.tail[:] = 0.0000, -0.0537, 0.1600 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.04'] + # + #bpy.ops.object.mode_set(mode='OBJECT') + #pbone = obj.pose.bones['head'] + #pbone['type'] = 'neck_flex' + pass + + +def metarig_definition(obj, orig_bone_name): + ''' + The bone given is neck_01, its parent is the body + eg. + body -> neck_01 -> neck_02 -> neck_03.... etc + ''' + arm = obj.data + neck = arm.bones[orig_bone_name] + body = neck.parent + + bone_definition = [body.name, neck.name] + bone_definition.extend([child.name for child in neck.children_recursive_basename]) + return bone_definition + + +def deform(obj, definitions, base_names, options): + for org_bone_name in definitions[1:]: + bpy.ops.object.mode_set(mode='EDIT') + + # Create deform bone. + bone = copy_bone_simple(obj.data, org_bone_name, "DEF-%s" % base_names[org_bone_name], parent=True) + + # Store name before leaving edit mode + bone_name = bone.name + + # Leave edit mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Get the pose bone + bone = obj.pose.bones[bone_name] + + # Constrain to the original bone + # XXX. Todo, is this needed if the bone is connected to its parent? + con = bone.constraints.new('COPY_TRANSFORMS') + con.name = "copy_loc" + con.target = obj + con.subtarget = org_bone_name + + +def main(obj, bone_definition, base_names, options): + from mathutils import Vector + + arm = obj.data + eb = obj.data.edit_bones + bb = obj.data.bones + pb = obj.pose.bones + + body = bone_definition[0] + + # Create the neck and head control bones + if "head_name" in options: + head_name = options["head_name"] + else: + head_name = "head" + + neck_name = base_names[bone_definition[1]].split(".")[0] + + neck_ctrl = copy_bone_simple(arm, bone_definition[1], neck_name).name + head_ctrl = copy_bone_simple(arm, bone_definition[len(bone_definition)-1], head_name).name + eb[head_ctrl].tail += eb[neck_ctrl].head - eb[head_ctrl].head + eb[head_ctrl].head = eb[neck_ctrl].head + + # Create hinge and socket bones + neck_hinge = copy_bone_simple(arm, bone_definition[0], "MCH-" + neck_name + "_hinge").name + head_hinge = copy_bone_simple(arm, neck_ctrl, "MCH-" + head_name + "_hinge").name + eb[neck_hinge].tail += eb[neck_ctrl].head - eb[neck_hinge].head + eb[neck_hinge].head = eb[neck_ctrl].head + eb[head_hinge].tail += eb[neck_ctrl].head - eb[head_hinge].head + eb[head_hinge].head = eb[neck_ctrl].head + + neck_socket = copy_bone_simple(arm, bone_definition[1], "MCH-" + neck_name + "_socket").name + head_socket = copy_bone_simple(arm, bone_definition[1], "MCH-" + head_name + "_socket").name + + # Parent-child relationships between the body, hinges, controls, and sockets + eb[neck_ctrl].parent = eb[neck_hinge] + eb[head_ctrl].parent = eb[head_hinge] + + eb[neck_socket].parent = eb[body] + eb[head_socket].parent = eb[body] + + # Create neck bones + neck = [] # neck bones + neck_neck = [] # bones constrained to neck control + neck_head = [] # bones constrained to head control + for i in range(1, len(bone_definition)): + # Create bones + neck_bone = copy_bone_simple(arm, bone_definition[i], base_names[bone_definition[i]]).name + neck_neck_bone = copy_bone_simple(arm, neck_ctrl, "MCH-" + base_names[bone_definition[i]] + ".neck").name + neck_head_bone = copy_bone_simple(arm, head_ctrl, "MCH-" + base_names[bone_definition[i]] + ".head").name + + # Move them all to the same place + eb[neck_neck_bone].tail += eb[neck_bone].head - eb[neck_neck_bone].head + eb[neck_head_bone].tail += eb[neck_bone].head - eb[neck_neck_bone].head + eb[neck_neck_bone].head = eb[neck_bone].head + eb[neck_head_bone].head = eb[neck_bone].head + + # Parent/child relationships + eb[neck_bone].parent = eb[neck_head_bone] + eb[neck_head_bone].parent = eb[neck_neck_bone] + + if i > 1: + eb[neck_neck_bone].parent = eb[neck[i-2]] + else: + eb[neck_neck_bone].parent = eb[body] + + # Add them to the lists + neck += [neck_bone] + neck_neck += [neck_neck_bone] + neck_head += [neck_head_bone] + + # Create deformation rig + deform(obj, bone_definition, base_names, options) + + + bpy.ops.object.mode_set(mode='OBJECT') + + # Axis locks + pb[neck_ctrl].lock_location = True, True, True + pb[head_ctrl].lock_location = True, True, True + + for bone in neck: + pb[bone].lock_location = True, True, True + + # Neck hinge + prop = rna_idprop_ui_prop_get(pb[neck_ctrl], "hinge", create=True) + pb[neck_ctrl]["hinge"] = 0.0 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + prop["hard_min"] = 0.0 + prop["hard_max"] = 1.0 + + con = pb[neck_hinge].constraints.new('COPY_LOCATION') + con.name = "socket" + con.target = obj + con.subtarget = neck_socket + + con = pb[neck_hinge].constraints.new('COPY_ROTATION') + con.name = "hinge" + con.target = obj + con.subtarget = body + + hinge_driver_path = pb[neck_ctrl].path_from_id() + '["hinge"]' + + fcurve = con.driver_add("influence") + driver = fcurve.driver + var = driver.variables.new() + driver.type = 'AVERAGE' + var.name = "var" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = hinge_driver_path + + mod = fcurve.modifiers[0] + mod.poly_order = 1 + mod.coefficients[0] = 1.0 + mod.coefficients[1] = -1.0 + + # Head hinge + prop = rna_idprop_ui_prop_get(pb[head_ctrl], "hinge", create=True) + pb[head_ctrl]["hinge"] = 0.0 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + prop["hard_min"] = 0.0 + prop["hard_max"] = 1.0 + + con = pb[head_hinge].constraints.new('COPY_LOCATION') + con.name = "socket" + con.target = obj + con.subtarget = head_socket + + con = pb[head_hinge].constraints.new('COPY_ROTATION') + con.name = "hinge" + con.target = obj + con.subtarget = neck_ctrl + + hinge_driver_path = pb[head_ctrl].path_from_id() + '["hinge"]' + + fcurve = con.driver_add("influence") + driver = fcurve.driver + var = driver.variables.new() + driver.type = 'AVERAGE' + var.name = "var" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = hinge_driver_path + + mod = fcurve.modifiers[0] + mod.poly_order = 1 + mod.coefficients[0] = 1.0 + mod.coefficients[1] = -1.0 + + # Neck rotation constraints + for i in range(0, len(neck_neck)): + con = pb[neck_neck[i]].constraints.new('COPY_ROTATION') + con.name = "neck rotation" + con.target = obj + con.subtarget = neck_ctrl + con.influence = (i+1) / len(neck_neck) + + + # Head rotation constraints/drivers + prop = rna_idprop_ui_prop_get(pb[head_ctrl], "extent", create=True) + if "extent" in options: + pb[head_ctrl]["extent"] = options["extent"] + else: + pb[head_ctrl]["extent"] = 0.5 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + prop["hard_min"] = 0.0 + prop["hard_max"] = 1.0 + + extent_prop_path = pb[head_ctrl].path_from_id() + '["extent"]' + + for i in range(0, len(neck_head)): + con = pb[neck_head[i]].constraints.new('COPY_ROTATION') + con.name = "head rotation" + con.target = obj + con.subtarget = head_ctrl + + if i < (len(neck_head)-1): + inf = (i+1) / len(neck_head) + + fcurve = con.driver_add("influence") + driver = fcurve.driver + var = driver.variables.new() + var.name = "ext" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = extent_prop_path + + driver.expression = "0 if ext == 0 else (((%s-1)/ext)+1)" % inf + else: + con.influence = 1.0 + + # Constrain original bones to the neck bones + for i in range(0, len(neck)): + con = pb[bone_definition[i+1]].constraints.new('COPY_TRANSFORMS') + con.name = "copy_transform" + con.target = obj + con.subtarget = neck[i] + + + # Set the controls' custom shapes to use other bones for transforms + pb[neck_ctrl].custom_shape_transform = pb[bone_definition[len(bone_definition)//2]] + pb[head_ctrl].custom_shape_transform = pb[bone_definition[len(bone_definition)-1]] + + + # last step setup layers + if "ex_layer" in options: + layer = [n==options["ex_layer"] for n in range(0,32)] + else: + layer = list(arm.bones[bone_definition[1]].layer) + for bone in neck: + bb[bone].layer = layer + + layer = list(arm.bones[bone_definition[1]].layer) + bb[neck_ctrl].layer = layer + bb[head_ctrl].layer = layer + + + # no blending the result of this + return None + diff --git a/release/scripts/modules/rigify/neck_flex.py b/release/scripts/modules/rigify/neck_flex.py index b3628ef4c2c..08f963434d1 100644 --- a/release/scripts/modules/rigify/neck_flex.py +++ b/release/scripts/modules/rigify/neck_flex.py @@ -125,7 +125,7 @@ def deform(obj, definitions, base_names, options): def main(obj, bone_definition, base_names, options): - from Mathutils import Vector + from mathutils import Vector arm = obj.data @@ -176,7 +176,7 @@ def main(obj, bone_definition, base_names, options): ex.neck_socket_e.connected = False ex.neck_socket_e.parent = mt.body_e ex.neck_socket_e.head = mt.head_e.head - ex.neck_socket_e.tail = mt.head_e.head - Vector(0.0, neck_chain_segment_length / 2.0, 0.0) + ex.neck_socket_e.tail = mt.head_e.head - Vector((0.0, neck_chain_segment_length / 2.0, 0.0)) ex.neck_socket_e.roll = 0.0 @@ -237,9 +237,9 @@ def main(obj, bone_definition, base_names, options): con.subtarget = mt.body # add driver - hinge_driver_path = ex.head_ctrl_p.path_to_id() + '["hinge"]' + hinge_driver_path = ex.head_ctrl_p.path_from_id() + '["hinge"]' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -254,12 +254,12 @@ def main(obj, bone_definition, base_names, options): mod.coefficients[0] = 1.0 mod.coefficients[1] = -1.0 - head_driver_path = ex.head_ctrl_p.path_to_id() + head_driver_path = ex.head_ctrl_p.path_from_id() target_names = [("b%.2d" % (i + 1)) for i in range(len(neck_chain))] ex.head_ctrl_p["bend_tot"] = 0.0 - fcurve = ex.head_ctrl_p.driver_add('["bend_tot"]', 0) + fcurve = ex.head_ctrl_p.driver_add('["bend_tot"]') driver = fcurve.driver driver.type = 'SUM' fcurve.modifiers.remove(0) # grr dont need a modifier @@ -296,7 +296,7 @@ def main(obj, bone_definition, base_names, options): con.owner_space = 'LOCAL' con.target_space = 'LOCAL' - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'SCRIPTED' driver.expression = "bend/bend_tot" @@ -332,7 +332,7 @@ def main(obj, bone_definition, base_names, options): # last step setup layers if "ex_layer" in options: - layer = [n==options["ex_layer"] for n in range(0,32)] + layer = [n == options["ex_layer"] for n in range(0, 32)] else: layer = list(arm.bones[bone_definition[1]].layer) for attr in ex_chain.attr_names: @@ -346,4 +346,3 @@ def main(obj, bone_definition, base_names, options): # no blending the result of this return None - diff --git a/release/scripts/modules/rigify/palm_curl.py b/release/scripts/modules/rigify/palm_curl.py index 6626438709d..2bdd28a348a 100644 --- a/release/scripts/modules/rigify/palm_curl.py +++ b/release/scripts/modules/rigify/palm_curl.py @@ -156,7 +156,7 @@ def main(obj, bone_definition, base_names, options): driver_fcurves = pinky_pbone.driver_add("rotation_euler") - controller_path = control_pbone.path_to_id() + controller_path = control_pbone.path_from_id() # add custom prop control_pbone["spread"] = 0.0 @@ -248,13 +248,13 @@ def main(obj, bone_definition, base_names, options): # NOTE: the direction of the Z rotation depends on which side the palm is on. # we could do a simple side-of-x test but better to work out the direction # the hand is facing. - from Mathutils import Vector + from mathutils import Vector from math import degrees child_pbone_01 = obj.pose.bones[children[0]].bone child_pbone_02 = obj.pose.bones[children[1]].bone rel_vec = child_pbone_01.head - child_pbone_02.head - x_vec = child_pbone_01.matrix.rotation_part() * Vector(1.0, 0.0, 0.0) + x_vec = child_pbone_01.matrix.rotation_part() * Vector((1.0, 0.0, 0.0)) return degrees(rel_vec.angle(x_vec)) > 90.0 diff --git a/release/scripts/modules/rigify/shape_key_control.py b/release/scripts/modules/rigify/shape_key_control.py index fd0e900a7b5..ac3987ca7e1 100644 --- a/release/scripts/modules/rigify/shape_key_control.py +++ b/release/scripts/modules/rigify/shape_key_control.py @@ -57,7 +57,7 @@ def addget_shape_key_driver(obj, name="Key"): if driver_s.data_path == driver_path: fcurve = driver_s if fcurve == None: - fcurve = obj.data.shape_keys.keys[name].driver_add("value", 0) + fcurve = obj.data.shape_keys.keys[name].driver_add("value") fcurve.driver.type = 'AVERAGE' new = True diff --git a/release/scripts/modules/rigify/shape_key_distance.py b/release/scripts/modules/rigify/shape_key_distance.py index 68501ac829b..06dd3d67d4b 100644 --- a/release/scripts/modules/rigify/shape_key_distance.py +++ b/release/scripts/modules/rigify/shape_key_distance.py @@ -54,7 +54,7 @@ def addget_shape_key_driver(obj, name="Key"): if driver_s.data_path == driver_path: fcurve = driver_s if fcurve == None: - fcurve = obj.data.shape_keys.keys[name].driver_add("value", 0) + fcurve = obj.data.shape_keys.keys[name].driver_add("value") fcurve.driver.type = 'AVERAGE' return fcurve diff --git a/release/scripts/modules/rigify/shape_key_rotdiff.py b/release/scripts/modules/rigify/shape_key_rotdiff.py index 2c30d95e666..7049bcf74bb 100644 --- a/release/scripts/modules/rigify/shape_key_rotdiff.py +++ b/release/scripts/modules/rigify/shape_key_rotdiff.py @@ -54,7 +54,7 @@ def addget_shape_key_driver(obj, name="Key"): if driver_s.data_path == driver_path: fcurve = driver_s if fcurve == None: - fcurve = obj.data.shape_keys.keys[name].driver_add("value", 0) + fcurve = obj.data.shape_keys.keys[name].driver_add("value") fcurve.driver.type = 'AVERAGE' return fcurve diff --git a/release/scripts/modules/rigify/spine_pivot_flex.py b/release/scripts/modules/rigify/spine_pivot_flex.py index 3ae5818f908..d3bab72d9a1 100644 --- a/release/scripts/modules/rigify/spine_pivot_flex.py +++ b/release/scripts/modules/rigify/spine_pivot_flex.py @@ -147,7 +147,7 @@ def deform(obj, definitions, base_names, options): def main(obj, bone_definition, base_names, options): - from Mathutils import Vector, RotationMatrix + from mathutils import Vector, RotationMatrix from math import radians, pi arm = obj.data @@ -177,11 +177,11 @@ def main(obj, bone_definition, base_names, options): # copy the pelvis, offset to make MCH-spine_rotate and MCH-ribcage_hinge ex.ribcage_hinge_e = copy_bone_simple(arm, mt.pelvis, "MCH-%s_hinge" % base_names[mt.ribcage]) ex.ribcage_hinge = ex.ribcage_hinge_e.name - ex.ribcage_hinge_e.translate(Vector(0.0, spine_chain_segment_length / 4.0, 0.0)) + ex.ribcage_hinge_e.translate(Vector((0.0, spine_chain_segment_length / 4.0, 0.0))) ex.spine_rotate_e = copy_bone_simple(arm, mt.ribcage, "MCH-%s_rotate" % spine_chain_basename) ex.spine_rotate = ex.spine_rotate_e.name - ex.spine_rotate_e.translate(Vector(0.0, spine_chain_segment_length / 2.0, 0.0)) + ex.spine_rotate_e.translate(Vector((0.0, spine_chain_segment_length / 2.0, 0.0))) ex.spine_rotate_e.connected = False ex.spine_rotate_e.parent = ex.pelvis_copy_e @@ -294,14 +294,14 @@ def main(obj, bone_definition, base_names, options): con.subtarget = ex.pelvis_copy # add driver - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' var.name = "var" var.targets[0].id_type = 'OBJECT' var.targets[0].id = obj - var.targets[0].data_path = ex.ribcage_copy_p.path_to_id() + '["hinge"]' + var.targets[0].data_path = ex.ribcage_copy_p.path_from_id() + '["hinge"]' mod = fcurve.modifiers[0] mod.poly_order = 1 @@ -347,10 +347,10 @@ def main(obj, bone_definition, base_names, options): # Constrain 'inbetween' bones target_names = [("b%.2d" % (i + 1)) for i in range(spine_chain_len - 1)] - rib_driver_path = ex.ribcage_copy_p.path_to_id() + rib_driver_path = ex.ribcage_copy_p.path_from_id() ex.ribcage_copy_p["bend_tot"] = 0.0 - fcurve = ex.ribcage_copy_p.driver_add('["bend_tot"]', 0) + fcurve = ex.ribcage_copy_p.driver_add('["bend_tot"]') driver = fcurve.driver driver.type = 'SUM' fcurve.modifiers.remove(0) # grr dont need a modifier @@ -385,7 +385,7 @@ def main(obj, bone_definition, base_names, options): del spine_p # add driver - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'SCRIPTED' driver.expression = "bend/bend_tot" @@ -440,7 +440,7 @@ def main(obj, bone_definition, base_names, options): if i == spine_chain_len: con.head_tail = 1.0 - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver var = driver.variables.new() driver.type = 'AVERAGE' @@ -463,7 +463,7 @@ def main(obj, bone_definition, base_names, options): # last step setup layers if "ex_layer" in options: - layer = [n==options["ex_layer"] for n in range(0,32)] + layer = [n == options["ex_layer"] for n in range(0, 32)] else: layer = list(arm.bones[bone_definition[1]].layer) for attr in ex.attr_names: diff --git a/release/scripts/modules/rigify/stretch.py b/release/scripts/modules/rigify/stretch.py index 0902b108def..1c3d317b4b1 100644 --- a/release/scripts/modules/rigify/stretch.py +++ b/release/scripts/modules/rigify/stretch.py @@ -41,19 +41,18 @@ RIG_TYPE = "stretch" # pbone = obj.pose.bones['Bone'] # pbone['type'] = 'copy' -bool_map = {0:False, 1:True, - 0.0:False, 1.0:True, - "false":False, "true":True, - "False":False, "True":True, - "no":False, "yes":True, - "No":False, "Yes":True} +bool_map = {0: False, 1: True, + 0.0: False, 1.0: True, + "false": False, "true": True, + "False": False, "True": True, + "no": False, "yes": True, + "No": False, "Yes": True} + def metarig_definition(obj, orig_bone_name): return (orig_bone_name,) - - def main(obj, bone_definition, base_names, options): """ A stretchy bone from one bone to another. Deformation only (no controls). @@ -108,4 +107,3 @@ def main(obj, bone_definition, base_names, options): con.volume = 'NO_VOLUME' return tuple() - diff --git a/release/scripts/modules/rigify/tail_control.py b/release/scripts/modules/rigify/tail_control.py index 56305b5e07e..47da9778913 100644 --- a/release/scripts/modules/rigify/tail_control.py +++ b/release/scripts/modules/rigify/tail_control.py @@ -22,7 +22,7 @@ import bpy from rigify import RigifyError from rigify_utils import bone_class_instance, copy_bone_simple from rna_prop_ui import rna_idprop_ui_prop_get -from Mathutils import Vector, RotationMatrix +from mathutils import Vector, RotationMatrix from math import radians, pi # not used, defined for completeness @@ -133,9 +133,9 @@ def main(obj, bone_definitions, base_names, options): con_h.subtarget = hinge1 # Add drivers - bone_path = pb[bones[0]].path_to_id() + bone_path = pb[bones[0]].path_from_id() - driver_fcurve = con_f.driver_add("influence", 0) + driver_fcurve = con_f.driver_add("influence") driver = driver_fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -148,7 +148,7 @@ def main(obj, bone_definitions, base_names, options): mod.coefficients[0] = 1.0 mod.coefficients[1] = -1.0 - driver_fcurve = con_h.driver_add("influence", 0) + driver_fcurve = con_h.driver_add("influence") driver = driver_fcurve.driver driver.type = 'AVERAGE' var = driver.variables.new() @@ -163,4 +163,3 @@ def main(obj, bone_definitions, base_names, options): return None - diff --git a/release/scripts/modules/rigify/tongue.py b/release/scripts/modules/rigify/tongue.py new file mode 100644 index 00000000000..b6dfe756b71 --- /dev/null +++ b/release/scripts/modules/rigify/tongue.py @@ -0,0 +1,361 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +import bpy +from rigify import RigifyError +from rigify_utils import bone_class_instance, copy_bone_simple +from rna_prop_ui import rna_idprop_ui_prop_get + +# not used, defined for completeness +METARIG_NAMES = ("body", "head") + + +def metarig_template(): + # TODO: + ## generated by rigify.write_meta_rig + #bpy.ops.object.mode_set(mode='EDIT') + #obj = bpy.context.active_object + #arm = obj.data + #bone = arm.edit_bones.new('body') + #bone.head[:] = 0.0000, -0.0276, -0.1328 + #bone.tail[:] = 0.0000, -0.0170, -0.0197 + #bone.roll = 0.0000 + #bone.connected = False + #bone = arm.edit_bones.new('head') + #bone.head[:] = 0.0000, -0.0170, -0.0197 + #bone.tail[:] = 0.0000, 0.0726, 0.1354 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['body'] + #bone = arm.edit_bones.new('neck.01') + #bone.head[:] = 0.0000, -0.0170, -0.0197 + #bone.tail[:] = 0.0000, -0.0099, 0.0146 + #bone.roll = 0.0000 + #bone.connected = False + #bone.parent = arm.edit_bones['head'] + #bone = arm.edit_bones.new('neck.02') + #bone.head[:] = 0.0000, -0.0099, 0.0146 + #bone.tail[:] = 0.0000, -0.0242, 0.0514 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.01'] + #bone = arm.edit_bones.new('neck.03') + #bone.head[:] = 0.0000, -0.0242, 0.0514 + #bone.tail[:] = 0.0000, -0.0417, 0.0868 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.02'] + #bone = arm.edit_bones.new('neck.04') + #bone.head[:] = 0.0000, -0.0417, 0.0868 + #bone.tail[:] = 0.0000, -0.0509, 0.1190 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.03'] + #bone = arm.edit_bones.new('neck.05') + #bone.head[:] = 0.0000, -0.0509, 0.1190 + #bone.tail[:] = 0.0000, -0.0537, 0.1600 + #bone.roll = 0.0000 + #bone.connected = True + #bone.parent = arm.edit_bones['neck.04'] + # + #bpy.ops.object.mode_set(mode='OBJECT') + #pbone = obj.pose.bones['head'] + #pbone['type'] = 'neck_flex' + pass + + +def metarig_definition(obj, orig_bone_name): + ''' + The bone given is the tongue control, its parent is the body, + # its only child the first of a chain with matching basenames. + eg. + body -> tongue_control -> tongue_01 -> tongue_02 -> tongue_03.... etc + ''' + arm = obj.data + tongue = arm.bones[orig_bone_name] + body = tongue.parent + + children = tongue.children + if len(children) != 1: + raise RigifyError("expected the tongue bone '%s' to have only 1 child." % orig_bone_name) + + child = children[0] + bone_definition = [body.name, tongue.name, child.name] + bone_definition.extend([child.name for child in child.children_recursive_basename]) + return bone_definition + + +def deform(obj, definitions, base_names, options): + for org_bone_name in definitions[2:]: + bpy.ops.object.mode_set(mode='EDIT') + + # Create deform bone. + bone = copy_bone_simple(obj.data, org_bone_name, "DEF-%s" % base_names[org_bone_name], parent=True) + + # Store name before leaving edit mode + bone_name = bone.name + + # Leave edit mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Get the pose bone + bone = obj.pose.bones[bone_name] + + # Constrain to the original bone + # XXX. Todo, is this needed if the bone is connected to its parent? + con = bone.constraints.new('COPY_TRANSFORMS') + con.name = "copy_loc" + con.target = obj + con.subtarget = org_bone_name + + +# TODO: rename all of the head/neck references to tongue +def main(obj, bone_definition, base_names, options): + from mathutils import Vector + + arm = obj.data + + # Initialize container classes for convenience + mt = bone_class_instance(obj, ["body", "head"]) # meta + mt.body = bone_definition[0] + mt.head = bone_definition[1] + mt.update() + + neck_chain = bone_definition[2:] + + mt_chain = bone_class_instance(obj, [("neck_%.2d" % (i + 1)) for i in range(len(neck_chain))]) # 99 bones enough eh? + for i, attr in enumerate(mt_chain.attr_names): + setattr(mt_chain, attr, neck_chain[i]) + mt_chain.update() + + neck_chain_basename = base_names[mt_chain.neck_01_e.name].split(".")[0] + neck_chain_segment_length = mt_chain.neck_01_e.length + + ex = bone_class_instance(obj, ["head", "head_hinge", "neck_socket", "head_ctrl"]) # hinge & extras + + # Add the head hinge at the bodys location, becomes the parent of the original head + + # apply everything to this copy of the chain + ex_chain = mt_chain.copy(base_names=base_names) + ex_chain.neck_01_e.parent = mt_chain.neck_01_e.parent + + + # Copy the head bone and offset + ex.head_e = copy_bone_simple(arm, mt.head, "MCH-%s" % base_names[mt.head], parent=True) + ex.head_e.connected = False + ex.head = ex.head_e.name + # offset + head_length = ex.head_e.length + ex.head_e.head.y += head_length / 2.0 + ex.head_e.tail.y += head_length / 2.0 + + # Yes, use the body bone but call it a head hinge + ex.head_hinge_e = copy_bone_simple(arm, mt.body, "MCH-%s_hinge" % base_names[mt.head], parent=False) + ex.head_hinge_e.connected = False + ex.head_hinge = ex.head_hinge_e.name + ex.head_hinge_e.head.y += head_length / 4.0 + ex.head_hinge_e.tail.y += head_length / 4.0 + + # Insert the neck socket, the head copys this loation + ex.neck_socket_e = arm.edit_bones.new("MCH-%s_socked" % neck_chain_basename) + ex.neck_socket = ex.neck_socket_e.name + ex.neck_socket_e.connected = False + ex.neck_socket_e.parent = mt.body_e + ex.neck_socket_e.head = mt.head_e.head + ex.neck_socket_e.tail = mt.head_e.head - Vector((0.0, neck_chain_segment_length / 2.0, 0.0)) + ex.neck_socket_e.roll = 0.0 + + + # copy of the head for controling + ex.head_ctrl_e = copy_bone_simple(arm, mt.head, base_names[mt.head]) + ex.head_ctrl = ex.head_ctrl_e.name + ex.head_ctrl_e.parent = ex.head_hinge_e + + for i, attr in enumerate(ex_chain.attr_names): + neck_e = getattr(ex_chain, attr + "_e") + + # dont store parent names, re-reference as each chain bones parent. + neck_e_parent = arm.edit_bones.new("MCH-rot_%s" % base_names[getattr(mt_chain, attr)]) + neck_e_parent.head = neck_e.head + neck_e_parent.tail = neck_e.head + (mt.head_e.vector.normalize() * neck_chain_segment_length / 2.0) + neck_e_parent.roll = mt.head_e.roll + + orig_parent = neck_e.parent + neck_e.connected = False + neck_e.parent = neck_e_parent + neck_e_parent.connected = False + + if i == 0: + neck_e_parent.parent = mt.body_e + else: + neck_e_parent.parent = orig_parent + + deform(obj, bone_definition, base_names, options) + + bpy.ops.object.mode_set(mode='OBJECT') + + mt.update() + mt_chain.update() + ex_chain.update() + ex.update() + + # Axis locks + ex.head_ctrl_p.lock_location = True, True, True + ex.head_ctrl_p.lock_scale = True, False, True + + # Simple one off constraints, no drivers + con = ex.head_ctrl_p.constraints.new('COPY_LOCATION') + con.target = obj + con.subtarget = ex.neck_socket + + con = ex.head_p.constraints.new('COPY_ROTATION') + con.target = obj + con.subtarget = ex.head_ctrl + + # driven hinge + prop = rna_idprop_ui_prop_get(ex.head_ctrl_p, "hinge", create=True) + ex.head_ctrl_p["hinge"] = 0.0 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + + con = ex.head_hinge_p.constraints.new('COPY_ROTATION') + con.name = "hinge" + con.target = obj + con.subtarget = mt.body + + # add driver + hinge_driver_path = ex.head_ctrl_p.path_to_id() + '["hinge"]' + + fcurve = con.driver_add("influence") + driver = fcurve.driver + var = driver.variables.new() + driver.type = 'AVERAGE' + var.name = "var" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = hinge_driver_path + + #mod = fcurve_driver.modifiers.new('GENERATOR') + mod = fcurve.modifiers[0] + mod.poly_order = 1 + mod.coefficients[0] = 1.0 + mod.coefficients[1] = -1.0 + + head_driver_path = ex.head_ctrl_p.path_to_id() + + target_names = [("b%.2d" % (i + 1)) for i in range(len(neck_chain))] + + ex.head_ctrl_p["bend_tot"] = 0.0 + fcurve = ex.head_ctrl_p.driver_add('["bend_tot"]') + driver = fcurve.driver + driver.type = 'SUM' + fcurve.modifiers.remove(0) # grr dont need a modifier + + for i in range(len(neck_chain)): + var = driver.variables.new() + var.name = target_names[i] + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = head_driver_path + ('["bend_%.2d"]' % (i + 1)) + + + for i, attr in enumerate(ex_chain.attr_names): + neck_p = getattr(ex_chain, attr + "_p") + neck_p.lock_location = True, True, True + neck_p.lock_location = True, True, True + neck_p.lock_rotations_4d = True + + # Add bend prop + prop_name = "bend_%.2d" % (i + 1) + prop = rna_idprop_ui_prop_get(ex.head_ctrl_p, prop_name, create=True) + ex.head_ctrl_p[prop_name] = 1.0 + prop["soft_min"] = 0.0 + prop["soft_max"] = 1.0 + + # add parent constraint + neck_p_parent = neck_p.parent + + # add constraints + if i == 0: + con = neck_p.constraints.new('COPY_SCALE') + con.name = "Copy Scale" + con.target = obj + con.subtarget = ex.head_ctrl + con.owner_space = 'LOCAL' + con.target_space = 'LOCAL' + + con = neck_p_parent.constraints.new('COPY_ROTATION') + con.name = "Copy Rotation" + con.target = obj + con.subtarget = ex.head + con.owner_space = 'LOCAL' + con.target_space = 'LOCAL' + + fcurve = con.driver_add("influence") + driver = fcurve.driver + driver.type = 'SCRIPTED' + driver.expression = "bend/bend_tot" + + fcurve.modifiers.remove(0) # grr dont need a modifier + + + # add target + var = driver.variables.new() + var.name = "bend_tot" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = head_driver_path + ('["bend_tot"]') + + var = driver.variables.new() + var.name = "bend" + var.targets[0].id_type = 'OBJECT' + var.targets[0].id = obj + var.targets[0].data_path = head_driver_path + ('["%s"]' % prop_name) + + + # finally constrain the original bone to this one + orig_neck_p = getattr(mt_chain, attr + "_p") + con = orig_neck_p.constraints.new('COPY_TRANSFORMS') + con.target = obj + con.subtarget = neck_p.name + + + # Set the head control's custom shape to use the last + # org neck bone for its transform + ex.head_ctrl_p.custom_shape_transform = obj.pose.bones[bone_definition[len(bone_definition)-1]] + + + # last step setup layers + if "ex_layer" in options: + layer = [n==options["ex_layer"] for n in range(0,32)] + else: + layer = list(arm.bones[bone_definition[1]].layer) + for attr in ex_chain.attr_names: + getattr(ex_chain, attr + "_b").layer = layer + for attr in ex.attr_names: + getattr(ex, attr + "_b").layer = layer + + layer = list(arm.bones[bone_definition[1]].layer) + ex.head_ctrl_b.layer = layer + + + # no blending the result of this + return None + diff --git a/release/scripts/modules/rigify/track_dual.py b/release/scripts/modules/rigify/track_dual.py index a926be684e6..38c2a86ab32 100644 --- a/release/scripts/modules/rigify/track_dual.py +++ b/release/scripts/modules/rigify/track_dual.py @@ -41,12 +41,12 @@ RIG_TYPE = "track_dual" # pbone = obj.pose.bones['Bone'] # pbone['type'] = 'copy' -bool_map = {0:False, 1:True, - 0.0:False, 1.0:True, - "false":False, "true":True, - "False":False, "True":True, - "no":False, "yes":True, - "No":False, "Yes":True} +bool_map = {0: False, 1: True, + 0.0: False, 1.0: True, + "false": False, "true": True, + "False": False, "True": True, + "no": False, "yes": True, + "No": False, "Yes": True} def metarig_definition(obj, orig_bone_name): diff --git a/release/scripts/modules/rigify/track_reverse.py b/release/scripts/modules/rigify/track_reverse.py index 988f7576294..21d38c28920 100644 --- a/release/scripts/modules/rigify/track_reverse.py +++ b/release/scripts/modules/rigify/track_reverse.py @@ -98,4 +98,3 @@ def main(obj, bone_definition, base_names, options): return tuple() - diff --git a/release/scripts/modules/rigify_utils.py b/release/scripts/modules/rigify_utils.py index 812342b3ebc..25ab6bebf48 100644 --- a/release/scripts/modules/rigify_utils.py +++ b/release/scripts/modules/rigify_utils.py @@ -26,7 +26,7 @@ # that a generic function would need to check for. import bpy -from Mathutils import Vector +from mathutils import Vector from rna_prop_ui import rna_idprop_ui_prop_get DELIMITER = '-._' @@ -136,7 +136,7 @@ def blend_bone_list(obj, apply_bones, from_bones, to_bones, target_bone=None, ta prop["soft_min"] = 0.0 prop["soft_max"] = 1.0 - driver_path = prop_pbone.path_to_id() + ('["%s"]' % target_prop) + driver_path = prop_pbone.path_from_id() + ('["%s"]' % target_prop) def blend_target(driver): var = driver.variables.new() @@ -154,7 +154,7 @@ def blend_bone_list(obj, apply_bones, from_bones, to_bones, target_bone=None, ta con.target = obj con.subtarget = to_bone_name - fcurve = con.driver_add("influence", 0) + fcurve = con.driver_add("influence") driver = fcurve.driver driver.type = 'AVERAGE' fcurve.modifiers.remove(0) # grr dont need a modifier @@ -204,12 +204,12 @@ def add_pole_target_bone(obj, base_bone_name, name, mode='CROSS'): offset.length = distance elif mode == 'ZAVERAGE': # between both bones Z axis - z_axis_a = base_ebone.matrix.copy().rotation_part() * Vector(0.0, 0.0, -1.0) - z_axis_b = parent_ebone.matrix.copy().rotation_part() * Vector(0.0, 0.0, -1.0) + z_axis_a = base_ebone.matrix.copy().rotation_part() * Vector((0.0, 0.0, -1.0)) + z_axis_b = parent_ebone.matrix.copy().rotation_part() * Vector((0.0, 0.0, -1.0)) offset = (z_axis_a + z_axis_b).normalize() * distance else: # preset axis - offset = Vector(0, 0, 0) + offset = Vector((0.0, 0.0, 0.0)) if mode[0] == "+": val = distance else: diff --git a/release/scripts/modules/rna_info.py b/release/scripts/modules/rna_info.py index 1c1a32becf9..3fd70fedd8c 100644 --- a/release/scripts/modules/rna_info.py +++ b/release/scripts/modules/rna_info.py @@ -25,6 +25,44 @@ import bpy # use to strip python paths script_paths = bpy.utils.script_paths() +_FAKE_STRUCT_SUBCLASS = True + + +def _get_direct_attr(rna_type, attr): + props = getattr(rna_type, attr) + base = rna_type.base + + if not base: + return [prop for prop in props] + else: + props_base = getattr(base, attr).values() + return [prop for prop in props if prop not in props_base] + + +def get_direct_properties(rna_type): + return _get_direct_attr(rna_type, "properties") + + +def get_direct_functions(rna_type): + return _get_direct_attr(rna_type, "functions") + + +def rna_id_ignore(rna_id): + if rna_id == "rna_type": + return True + + if "_OT_" in rna_id: + return True + if "_MT_" in rna_id: + return True + if "_PT_" in rna_id: + return True + if "_HT_" in rna_id: + return True + if "_KSI_" in rna_id: + return True + return False + def range_str(val): if val < -10000000: @@ -67,8 +105,8 @@ class InfoStructRNA: def build(self): rna_type = self.bl_rna parent_id = self.identifier - self.properties[:] = [GetInfoPropertyRNA(rna_prop, parent_id) for rna_id, rna_prop in rna_type.properties.items() if rna_id != "rna_type"] - self.functions[:] = [GetInfoFunctionRNA(rna_prop, parent_id) for rna_prop in rna_type.functions.values()] + self.properties[:] = [GetInfoPropertyRNA(rna_prop, parent_id) for rna_prop in get_direct_properties(rna_type) if rna_prop.identifier != "rna_type"] + self.functions[:] = [GetInfoFunctionRNA(rna_prop, parent_id) for rna_prop in get_direct_functions(rna_type)] def get_bases(self): bases = [] @@ -116,17 +154,17 @@ class InfoStructRNA: def __repr__(self): - txt = '' + txt = "" txt += self.identifier if self.base: - txt += '(%s)' % self.base.identifier - txt += ': ' + self.description + '\n' + txt += "(%s)" % self.base.identifier + txt += ": " + self.description + "\n" for prop in self.properties: - txt += prop.__repr__() + '\n' + txt += prop.__repr__() + "\n" for func in self.functions: - txt += func.__repr__() + '\n' + txt += func.__repr__() + "\n" return txt @@ -163,40 +201,40 @@ class InfoPropertyRNA: if self.type == "enum": self.enum_items[:] = rna_prop.items.keys() + if self.array_length: self.default = tuple(getattr(rna_prop, "default_array", ())) + else: + self.default = getattr(rna_prop, "default", None) + self.default_str = "" # fallback + + + if self.type == "pointer": + # pointer has no default, just set as None + self.default = None + self.default_str = "None" + elif self.type == "string": + self.default_str = "\"%s\"" % self.default + elif self.type == "enum": + self.default_str = "'%s'" % self.default + elif self.array_length: self.default_str = '' # special case for floats if len(self.default) > 0: - if type(self.default[0]) is float: + if self.type == "float": self.default_str = "(%s)" % ", ".join([float_as_string(f) for f in self.default]) if not self.default_str: self.default_str = str(self.default) else: - self.default = getattr(rna_prop, "default", "") - if type(self.default) is float: + if self.type == "float": self.default_str = float_as_string(self.default) else: self.default_str = str(self.default) self.srna = GetInfoStructRNA(rna_prop.srna) # valid for pointer/collections - def get_default_string(self): - # pointer has no default, just set as None - if self.type == "pointer": - return "None" - elif self.type == "string": - return '"' + self.default_str + '"' - elif self.type == "enum": - if self.default_str: - return "'" + self.default_str + "'" - else: - return "" - - return self.default_str - def get_arg_default(self, force=True): - default = self.get_default_string() + default = self.default_str if default and (force or self.is_required == False): return "%s=%s" % (self.identifier, default) return self.identifier @@ -212,6 +250,13 @@ class InfoPropertyRNA: type_str += " in [%s, %s]" % (range_str(self.min), range_str(self.max)) elif self.type == "enum": type_str += " in [%s]" % ', '.join([("'%s'" % s) for s in self.enum_items]) + + if not (as_arg or as_ret): + # write default property, ignore function args for this + if self.type != "pointer": + if self.default_str: + type_str += ", default %s" % self.default_str + else: if self.type == "collection": if self.collection_type: @@ -223,17 +268,22 @@ class InfoPropertyRNA: type_str += collection_str + (class_fmt % self.fixed_type.identifier) + # setup qualifiers for this value. + type_info = [] if as_ret: pass elif as_arg: if not self.is_required: - type_str += ", (optional)" + type_info.append("optional") else: # readonly is only useful for selfs, not args if self.is_readonly: - type_str += ", (readonly)" + type_info.append("readonly") if self.is_never_none: - type_str += ", (never None)" + type_info.append("never None") + + if type_info: + type_str += (", (%s)" % ", ".join(type_info)) return type_str @@ -338,7 +388,7 @@ def _GetInfoRNA(bl_rna, cls, parent_id=''): key = parent_id, bl_rna.identifier try: return cls.global_lookup[key] - except: + except KeyError: instance = cls.global_lookup[key] = cls(bl_rna) return instance @@ -366,22 +416,7 @@ def BuildRNAInfo(): rna_full_path_dict = {} # store the result of full_rna_struct_path(rna_struct) rna_children_dict = {} # store all rna_structs nested from here rna_references_dict = {} # store a list of rna path strings that reference this type - rna_functions_dict = {} # store all functions directly in this type (not inherited) - rna_words = set() - - def rna_id_ignore(rna_id): - if rna_id == "rna_type": - return True - - if "_OT_" in rna_id: - return True - if "_MT_" in rna_id: - return True - if "_PT_" in rna_id: - return True - if "_HT_" in rna_id: - return True - return False + # rna_functions_dict = {} # store all functions directly in this type (not inherited) def full_rna_struct_path(rna_struct): ''' @@ -427,7 +462,8 @@ def BuildRNAInfo(): rna_full_path_dict[identifier] = full_rna_struct_path(rna_struct) # Store a list of functions, remove inherited later - rna_functions_dict[identifier] = list(rna_struct.functions) + # NOT USED YET + ## rna_functions_dict[identifier] = get_direct_functions(rna_struct) # fill in these later @@ -439,12 +475,6 @@ def BuildRNAInfo(): print("Ignoring", rna_type_name) - # Sucks but we need to copy this so we can check original parent functions - rna_functions_dict__copy = {} - for key, val in rna_functions_dict.items(): - rna_functions_dict__copy[key] = val[:] - - structs.sort() # not needed but speeds up sort below, setting items without an inheritance first # Arrange so classes are always defined in the correct order @@ -479,41 +509,27 @@ def BuildRNAInfo(): # precalc vars to avoid a lot of looping for (rna_base, identifier, rna_struct) in structs: - if rna_base: - rna_base_prop_keys = rna_struct_dict[rna_base].properties.keys() # could cache - rna_base_func_keys = [f.identifier for f in rna_struct_dict[rna_base].functions] - else: - rna_base_prop_keys = [] - rna_base_func_keys = [] - # rna_struct_path = full_rna_struct_path(rna_struct) rna_struct_path = rna_full_path_dict[identifier] - for rna_prop_identifier, rna_prop in rna_struct.properties.items(): + for rna_prop in get_direct_properties(rna_struct): + rna_prop_identifier = rna_prop.identifier - if rna_prop_identifier == 'RNA' or \ - rna_id_ignore(rna_prop_identifier) or \ - rna_prop_identifier in rna_base_prop_keys: + if rna_prop_identifier == 'RNA' or rna_id_ignore(rna_prop_identifier): continue - for rna_prop_ptr in (getattr(rna_prop, "fixed_type", None), getattr(rna_prop, "srna", None)): # Does this property point to me? if rna_prop_ptr: rna_references_dict[rna_prop_ptr.identifier].append("%s.%s" % (rna_struct_path, rna_prop_identifier)) - for rna_func in rna_struct.functions: + for rna_func in get_direct_functions(rna_struct): for rna_prop_identifier, rna_prop in rna_func.parameters.items(): - if rna_prop_identifier == 'RNA' or \ - rna_id_ignore(rna_prop_identifier) or \ - rna_prop_identifier in rna_base_func_keys: + if rna_prop_identifier == 'RNA' or rna_id_ignore(rna_prop_identifier): continue - try: - rna_prop_ptr = rna_prop.fixed_type - except: - rna_prop_ptr = None + rna_prop_ptr = getattr(rna_prop, "fixed_type", None) # Does this property point to me? if rna_prop_ptr: @@ -526,16 +542,6 @@ def BuildRNAInfo(): rna_children_dict[nested.identifier].append(rna_struct) - if rna_base: - rna_funcs = rna_functions_dict[identifier] - if rna_funcs: - # Remove inherited functions if we have any - rna_base_funcs = rna_functions_dict__copy[rna_base] - rna_funcs[:] = [f for f in rna_funcs if f not in rna_base_funcs] - - rna_functions_dict__copy.clear() - del rna_functions_dict__copy - # Sort the refs, just reads nicer for rna_refs in rna_references_dict.values(): rna_refs.sort() @@ -574,6 +580,16 @@ def BuildRNAInfo(): for prop in func.return_values: prop.build() + if 1: + for rna_info in InfoStructRNA.global_lookup.values(): + for prop in rna_info.properties: + # ERROR CHECK + default = prop.default + if type(default) in (float, int): + if default < prop.min or default > prop.max: + print("\t %s.%s, %s not in [%s - %s]" % (rna_info.identifier, prop.identifier, default, prop.min, prop.max)) + + # now for operators op_mods = dir(bpy.ops) @@ -604,3 +620,23 @@ def BuildRNAInfo(): # print(rna_info) return InfoStructRNA.global_lookup, InfoFunctionRNA.global_lookup, InfoOperatorRNA.global_lookup, InfoPropertyRNA.global_lookup + + +if __name__ == "__main__": + import rna_info + struct = rna_info.BuildRNAInfo()[0] + data = "" + for struct_id, v in sorted(struct.items()): + struct_id_str = "".join(sid for sid in struct_id if struct_id) + props = [(prop.identifier, prop) for prop in v.properties] + + for prop_id, prop in sorted(props): + if prop.type == 'boolean': + continue + data += "%s.%s -> %s: %s%s %s\n" % (struct_id_str, prop.identifier, prop.identifier, prop.type, ", (read-only)" if prop.is_readonly else "", prop.description) + + if bpy.app.background: + print(data) + else: + text = bpy.data.texts.new(name="api.py") + text.from_string(data) diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py index 246fa4bdb7d..3e8662c275f 100644 --- a/release/scripts/modules/rna_prop_ui.py +++ b/release/scripts/modules/rna_prop_ui.py @@ -61,7 +61,7 @@ def rna_idprop_ui_prop_clear(item, prop): def draw(layout, context, context_member, use_edit=True): def assign_props(prop, val, key): - prop.path = context_member + prop.data_path = context_member prop.property = key try: @@ -81,7 +81,7 @@ def draw(layout, context, context_member, use_edit=True): if use_edit: row = layout.row() props = row.operator("wm.properties_add", text="Add") - props.path = context_member + props.data_path = context_member del row for key, val in items: @@ -140,7 +140,7 @@ from bpy.props import * rna_path = StringProperty(name="Property Edit", - description="Property path edit", maxlen=1024, default="", options={'HIDDEN'}) + description="Property data_path edit", maxlen=1024, default="", options={'HIDDEN'}) rna_value = StringProperty(name="Property Value", description="Property value edit", maxlen=1024, default="") @@ -153,11 +153,11 @@ rna_max = FloatProperty(name="Max", default=1.0, precision=3) class WM_OT_properties_edit(bpy.types.Operator): - '''Internal use (edit a property path)''' + '''Internal use (edit a property data_path)''' bl_idname = "wm.properties_edit" bl_label = "Edit Property" - path = rna_path + data_path = rna_path property = rna_property value = rna_value min = rna_min @@ -165,7 +165,7 @@ class WM_OT_properties_edit(bpy.types.Operator): description = StringProperty(name="Tip", default="") def execute(self, context): - path = self.properties.path + data_path = self.properties.data_path value = self.properties.value prop = self.properties.property prop_old = self._last_prop[0] @@ -176,7 +176,7 @@ class WM_OT_properties_edit(bpy.types.Operator): value_eval = value # First remove - item = eval("context.%s" % path) + item = eval("context.%s" % data_path) rna_idprop_ui_prop_clear(item, prop_old) exec_str = "del item['%s']" % prop_old @@ -207,7 +207,7 @@ class WM_OT_properties_edit(bpy.types.Operator): self._last_prop = [self.properties.property] - item = eval("context.%s" % self.properties.path) + item = eval("context.%s" % self.properties.data_path) # setup defaults prop_ui = rna_idprop_ui_prop_get(item, self.properties.property, False) # dont create @@ -225,14 +225,14 @@ class WM_OT_properties_edit(bpy.types.Operator): class WM_OT_properties_add(bpy.types.Operator): - '''Internal use (edit a property path)''' + '''Internal use (edit a property data_path)''' bl_idname = "wm.properties_add" bl_label = "Add Property" - path = rna_path + data_path = rna_path def execute(self, context): - item = eval("context.%s" % self.properties.path) + item = eval("context.%s" % self.properties.data_path) def unique_name(names): prop = 'prop' @@ -251,14 +251,14 @@ class WM_OT_properties_add(bpy.types.Operator): class WM_OT_properties_remove(bpy.types.Operator): - '''Internal use (edit a property path)''' + '''Internal use (edit a property data_path)''' bl_idname = "wm.properties_remove" - bl_label = "Add Property" + bl_label = "Remove Property" - path = rna_path + data_path = rna_path property = rna_property def execute(self, context): - item = eval("context.%s" % self.properties.path) + item = eval("context.%s" % self.properties.data_path) del item[self.properties.property] return {'FINISHED'} diff --git a/release/scripts/op/add_armature_human.py b/release/scripts/op/add_armature_human.py index 1944e73de1b..164bbfb100b 100644 --- a/release/scripts/op/add_armature_human.py +++ b/release/scripts/op/add_armature_human.py @@ -18,7 +18,7 @@ # <pep8-80 compliant> import bpy -import Mathutils +import mathutils from math import cos, sin, pi # could this be stored elsewhere? @@ -609,10 +609,10 @@ def register(): bpy.types.register(AddHuman) bpy.types.INFO_MT_armature_add.append(menu_func) + def unregister(): bpy.types.unregister(AddHuman) bpy.types.INFO_MT_armature_add.remove(menu_func) if __name__ == "__main__": register() - diff --git a/release/scripts/op/add_mesh_torus.py b/release/scripts/op/add_mesh_torus.py index e7c7ac86ee6..16bf4e1c92c 100644 --- a/release/scripts/op/add_mesh_torus.py +++ b/release/scripts/op/add_mesh_torus.py @@ -18,13 +18,13 @@ # <pep8 compliant> import bpy -import Mathutils +import mathutils from math import cos, sin, pi def add_torus(major_rad, minor_rad, major_seg, minor_seg): - Vector = Mathutils.Vector - Quaternion = Mathutils.Quaternion + Vector = mathutils.Vector + Quaternion = mathutils.Quaternion PI_2 = pi * 2 z_axis = (0, 0, 1) @@ -39,10 +39,10 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg): for minor_index in range(minor_seg): angle = 2 * pi * minor_index / minor_seg - vec = Vector(major_rad + (cos(angle) * minor_rad), 0.0, - (sin(angle) * minor_rad)) * quat + vec = Vector((major_rad + (cos(angle) * minor_rad), 0.0, + (sin(angle) * minor_rad))) * quat - verts.extend([vec.x, vec.y, vec.z]) + verts.extend(vec[:]) if minor_index + 1 == minor_seg: i2 = (major_index) * minor_seg @@ -102,6 +102,10 @@ class AddTorus(bpy.types.Operator): description="Total Interior Radius of the torus", default=0.5, min=0.01, max=100.0) + # generic transform props + location = FloatVectorProperty(name="Location") + rotation = FloatVectorProperty(name="Rotation") + def execute(self, context): props = self.properties @@ -120,44 +124,16 @@ class AddTorus(bpy.types.Operator): mesh.add_geometry(int(len(verts_loc) / 3), 0, int(len(faces) / 4)) mesh.verts.foreach_set("co", verts_loc) mesh.faces.foreach_set("verts_raw", faces) - mesh.faces.foreach_set("smooth", [False] * len(mesh.faces)) - - scene = context.scene - - # ugh - for ob in scene.objects: - ob.selected = False - mesh.update() - ob_new = bpy.data.objects.new("Torus", mesh) - scene.objects.link(ob_new) - ob_new.selected = True - ob_new.location = scene.cursor_location - - obj_act = scene.objects.active - - if obj_act and obj_act.mode == 'EDIT': - bpy.ops.object.mode_set(mode='OBJECT') - - obj_act.selected = True - scene.update() # apply location - #scene.objects.active = ob_new - - bpy.ops.object.join() # join into the active. - - bpy.ops.object.mode_set(mode='EDIT') - else: - scene.objects.active = ob_new - if context.user_preferences.edit.enter_edit_mode: - bpy.ops.object.mode_set(mode='EDIT') + import add_object_utils + add_object_utils.add_object_data(context, mesh, operator=self) return {'FINISHED'} -# Add to the menu -menu_func = (lambda self, context: self.layout.operator(AddTorus.bl_idname, - text="Torus", icon='MESH_DONUT')) +def menu_func(self, context): + self.layout.operator(AddTorus.bl_idname, text="Torus", icon='MESH_DONUT') def register(): diff --git a/release/scripts/op/fcurve_euler_filter.py b/release/scripts/op/fcurve_euler_filter.py index 1c9e9a73312..bba4576ef73 100644 --- a/release/scripts/op/fcurve_euler_filter.py +++ b/release/scripts/op/fcurve_euler_filter.py @@ -1,6 +1,6 @@ from math import * import bpy -from Mathutils import * +from mathutils import * def main(context): def cleanupEulCurve(fcv): diff --git a/release/scripts/op/image.py b/release/scripts/op/image.py index ea5177b1503..be583012d7a 100644 --- a/release/scripts/op/image.py +++ b/release/scripts/op/image.py @@ -19,6 +19,67 @@ # <pep8 compliant> import bpy +from bpy.props import StringProperty + + +class EditExternally(bpy.types.Operator): + '''Edit image in an external application''' + bl_idname = "image.external_edit" + bl_label = "Image Edit Externally" + bl_options = {'REGISTER'} + + filepath = StringProperty(name="File Path", description="Path to an image file", maxlen=1024, default="") + + def _editor_guess(self, context): + import platform + system = platform.system() + + image_editor = context.user_preferences.filepaths.image_editor + + # use image editor in the preferences when available. + if not image_editor: + if system == 'Windows': + image_editor = ["start"] # not tested! + elif system == 'Darwin': + image_editor = ["open"] + else: + image_editor = ["gimp"] + else: + if system == 'Darwin': + # blender file selector treats .app as a folder + # and will include a trailing backslash, so we strip it. + image_editor.rstrip('\\') + image_editor = ["open", "-a", image_editor] + else: + image_editor = [image_editor] + + return image_editor + + def execute(self, context): + import subprocess + filepath = self.properties.filepath + image_editor = self._editor_guess(context) + + cmd = [] + cmd.extend(image_editor) + cmd.append(bpy.utils.expandpath(filepath)) + + subprocess.Popen(cmd) + + return {'FINISHED'} + + def invoke(self, context, event): + try: + filepath = context.space_data.image.filepath + except: + self.report({'ERROR'}, "Image not found on disk") + return {'CANCELLED'} + + self.properties.filepath = filepath + self.execute(context) + + return {'FINISHED'} + class SaveDirty(bpy.types.Operator): '''Select object matching a naming pattern''' @@ -30,23 +91,118 @@ class SaveDirty(bpy.types.Operator): unique_paths = set() for image in bpy.data.images: if image.dirty: - path = bpy.utils.expandpath(image.filename) - if "\\" not in path and "/" not in path: - self.report({'WARNING'}, "Invalid path: " + path) - elif path in unique_paths: - self.report({'WARNING'}, "Path used by more then one image: " + path) + filepath = bpy.utils.expandpath(image.filepath) + if "\\" not in filepath and "/" not in filepath: + self.report({'WARNING'}, "Invalid path: " + filepath) + elif filepath in unique_paths: + self.report({'WARNING'}, "Path used by more then one image: " + filepath) else: - unique_paths.add(path) + unique_paths.add(filepath) image.save() return {'FINISHED'} +class ProjectEdit(bpy.types.Operator): + '''Select object matching a naming pattern''' + bl_idname = "image.project_edit" + bl_label = "Project Edit" + bl_options = {'REGISTER'} + + _proj_hack = [""] + + def execute(self, context): + import os + import subprocess + + EXT = "png" # could be made an option but for now ok + + for image in bpy.data.images: + image.tag = True + + bpy.ops.paint.image_from_view() + + image_new = None + for image in bpy.data.images: + if not image.tag: + image_new = image + break + + if not image_new: + self.report({'ERROR'}, "Could not make new image") + return {'CANCELLED'} + + filepath = os.path.basename(bpy.data.filepath) + filepath = os.path.splitext(filepath)[0] + # filepath = bpy.utils.clean_name(filepath) # fixes <memory> rubbish, needs checking + + if filepath.startswith(".") or filepath == "": + # TODO, have a way to check if the file is saved, assume .B25.blend + tmpdir = context.user_preferences.filepaths.temporary_directory + filepath = os.path.join(tmpdir, "project_edit") + else: + filepath = "//" + filepath + + obj = context.object + + if obj: + filepath += "_" + bpy.utils.clean_name(obj.name) + + filepath_final = filepath + "." + EXT + i = 0 + + while os.path.exists(bpy.utils.expandpath(filepath_final)): + filepath_final = filepath + ("%.3d.%s" % (i, EXT)) + i += 1 + + image_new.name = os.path.basename(filepath_final) + ProjectEdit._proj_hack[0] = image_new.name + + image_new.filepath_raw = filepath_final # TODO, filepath raw is crummy + image_new.file_format = 'PNG' + image_new.save() + + bpy.ops.image.external_edit(filepath=filepath_final) + + return {'FINISHED'} + + +class ProjectApply(bpy.types.Operator): + '''Select object matching a naming pattern''' + bl_idname = "image.project_apply" + bl_label = "Project Apply" + bl_options = {'REGISTER'} + + def execute(self, context): + image_name = ProjectEdit._proj_hack[0] # TODO, deal with this nicer + + try: + image = bpy.data.images[image_name] + except KeyError: + self.report({'ERROR'}, "Could not find image '%s'" % image_name) + return {'CANCELLED'} + + image.reload() + bpy.ops.paint.project_image(image=image_name) + + return {'FINISHED'} + +classes = [ + EditExternally, + SaveDirty, + ProjectEdit, + ProjectApply] + + def register(): - bpy.types.register(SaveDirty) + register = bpy.types.register + for cls in classes: + register(cls) def unregister(): - bpy.types.unregister(SaveDirty) + unregister = bpy.types.unregister + for cls in classes: + unregister(cls) if __name__ == "__main__": register() diff --git a/release/scripts/op/mesh.py b/release/scripts/op/mesh.py index 3989e51b6ca..78ca9a18cdc 100644 --- a/release/scripts/op/mesh.py +++ b/release/scripts/op/mesh.py @@ -76,7 +76,7 @@ class MeshMirrorUV(bpy.types.Operator): def execute(self, context): DIR = 1 # TODO, make an option - from Mathutils import Vector + from mathutils import Vector ob = context.active_object is_editmode = (ob.mode == 'EDIT') diff --git a/release/scripts/op/nla.py b/release/scripts/op/nla.py new file mode 100644 index 00000000000..d0c53758ba9 --- /dev/null +++ b/release/scripts/op/nla.py @@ -0,0 +1,190 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +import bpy + + +def pose_info(): + from mathutils import Matrix + + info = {} + + obj = bpy.context.object + pose = obj.pose + + pose_items = pose.bones.items() + + for name, pbone in pose_items: + binfo = {} + bone = pbone.bone + + binfo["parent"] = getattr(bone.parent, "name", None) + binfo["bone"] = bone + binfo["pbone"] = pbone + binfo["matrix_local"] = bone.matrix_local.copy() + try: + binfo["matrix_local_inv"] = binfo["matrix_local"].copy().invert() + except: + binfo["matrix_local_inv"] = Matrix() + + binfo["matrix"] = bone.matrix.copy() + binfo["matrix_pose"] = pbone.matrix.copy() + try: + binfo["matrix_pose_inv"] = binfo["matrix_pose"].copy().invert() + except: + binfo["matrix_pose_inv"] = Matrix() + + print(binfo["matrix_pose"]) + info[name] = binfo + + for name, pbone in pose_items: + binfo = info[name] + binfo_parent = binfo.get("parent", None) + if binfo_parent: + binfo_parent = info[binfo_parent] + + matrix = binfo["matrix_pose"] + rest_matrix = binfo["matrix_local"] + + if binfo_parent: + matrix = binfo_parent["matrix_pose_inv"] * matrix + rest_matrix = binfo_parent["matrix_local_inv"] * rest_matrix + + matrix = rest_matrix.copy().invert() * matrix + + binfo["matrix_key"] = matrix.copy() + + return info + + +def bake(frame_start, frame_end, step=1, only_selected=False): + # import nla; reload(nla); nla.bake() + + scene = bpy.context.scene + obj = bpy.context.object + pose = obj.pose + + info_ls = [] + + frame_range = range(frame_start, frame_end + 1, step) + + # could spped this up by applying steps here too... + for f in frame_range: + scene.set_frame(f) + + info = pose_info() + info_ls.append(info) + f += 1 + + action = bpy.data.actions.new("Action") + + bpy.context.object.animation_data.action = action + + pose_items = pose.bones.items() + + for name, pbone in pose_items: + if only_selected and not pbone.selected: + continue + + for f in frame_range: + matrix = info_ls[int((f - frame_start) / step)][name]["matrix_key"] + + #pbone.location = matrix.translation_part() + #pbone.rotation_quaternion = matrix.to_quat() + pbone.matrix_local = [f for v in matrix for f in v] + + pbone.keyframe_insert("location", -1, f, name) + + rotation_mode = pbone.rotation_mode + + if rotation_mode == 'QUATERNION': + pbone.keyframe_insert("rotation_quaternion", -1, f, name) + elif rotation_mode == 'AXIS_ANGLE': + pbone.keyframe_insert("rotation_axis_angle", -1, f, name) + else: # euler, XYZ, ZXY etc + pbone.keyframe_insert("rotation_euler", -1, f, name) + + pbone.keyframe_insert("scale", -1, f, name) + + return action + + +from bpy.props import * + + +class BakeAction(bpy.types.Operator): + '''Bake animation to an Action''' + bl_idname = "nla.bake" + bl_label = "Bake Action" + bl_options = {'REGISTER', 'UNDO'} + + frame_start = IntProperty(name="Start Frame", + description="Start frame for baking", + default=1, min=1, max=300000) + frame_end = IntProperty(name="End Frame", + description="End frame for baking", + default=250, min=1, max=300000) + step = IntProperty(name="Frame Step", + description="Frame Step", + default=1, min=1, max=120) + only_selected = BoolProperty(name="Only Selected", + default=True) + + def execute(self, context): + props = self.properties + + action = bake(props.frame_start, props.frame_end, props.step, props.only_selected) + + # basic cleanup, could move elsewhere + for fcu in action.fcurves: + keyframe_points = fcu.keyframe_points + i = 1 + while i < len(fcu.keyframe_points) - 1: + val_prev = keyframe_points[i - 1].co[1] + val_next = keyframe_points[i + 1].co[1] + val = keyframe_points[i].co[1] + + if abs(val - val_prev) + abs(val - val_next) < 0.0001: + keyframe_points.remove(keyframe_points[i]) + else: + i += 1 + + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.manager + return wm.invoke_props_dialog(self) + + +#def menu_func(self, context): +# self.layout.operator(BakeAction.bl_idname, text="Bake Armature Action") + + +def register(): + bpy.types.register(BakeAction) + # bpy.types.INFO_MT_mesh_add.append(menu_func) + + +def unregister(): + bpy.types.unregister(BakeAction) + # bpy.types.INFO_MT_mesh_add.remove(menu_func) + +if __name__ == "__main__": + register() diff --git a/release/scripts/op/object.py b/release/scripts/op/object.py index 5ff25a47b2f..b16d2b0dcf2 100644 --- a/release/scripts/op/object.py +++ b/release/scripts/op/object.py @@ -113,24 +113,42 @@ class SelectHierarchy(bpy.types.Operator): return context.object def execute(self, context): - obj = context.object - if self.properties.direction == 'PARENT': - parent = obj.parent - if not parent: - return {'CANCELLED'} - obj_act = parent - else: - children = obj.children - if len(children) != 1: - return {'CANCELLED'} - obj_act = children[0] + objs = context.selected_objects + obj_act = context.object + + if context.object not in objs: + objs.append(context.object) if not self.properties.extend: - # obj.selected = False + # for obj in objs: + # obj.selected = False bpy.ops.object.select_all(action='DESELECT') - obj_act.selected = True - context.scene.objects.active = obj_act + if self.properties.direction == 'PARENT': + parents = [] + for obj in objs: + parent = obj.parent + + if parent: + parents.append(parent) + + if obj_act == obj: + context.scene.objects.active = parent + + parent.selected = True + + if parents: + return {'CANCELLED'} + + else: + children = [] + for obj in objs: + children += list(obj.children) + for obj_iter in children: + obj_iter.selected = True + + children.sort(key=lambda obj_iter: obj_iter.name) + context.scene.objects.active = children[0] return {'FINISHED'} @@ -235,8 +253,8 @@ class ShapeTransfer(bpy.types.Operator): ob.active_shape_key_index = len(me.shape_keys.keys) - 1 ob.shape_key_lock = True - from Geometry import BarycentricTransform - from Mathutils import Vector + from geometry import BarycentricTransform + from mathutils import Vector if use_clamp and mode == 'OFFSET': use_clamp = False @@ -383,6 +401,7 @@ class ShapeTransfer(bpy.types.Operator): return {'CANCELLED'} return self._main(ob_act, objects, self.properties.mode, self.properties.use_clamp) + class JoinUVs(bpy.types.Operator): '''Copy UV Layout to objects with matching geometry''' bl_idname = "object.join_uvs" @@ -440,6 +459,7 @@ class JoinUVs(bpy.types.Operator): self._main(context) return {'FINISHED'} + class MakeDupliFace(bpy.types.Operator): '''Make linked objects into dupli-faces''' bl_idname = "object.make_dupli_face" @@ -450,12 +470,12 @@ class MakeDupliFace(bpy.types.Operator): return (obj and obj.type == 'MESH') def _main(self, context): - from Mathutils import Vector + from mathutils import Vector from math import sqrt SCALE_FAC = 0.01 offset = 0.5 * SCALE_FAC - base_tri = Vector(-offset, -offset, 0.0), Vector(offset, -offset, 0.0), Vector(offset, offset, 0.0), Vector(-offset, offset, 0.0) + base_tri = Vector((-offset, -offset, 0.0)), Vector((offset, -offset, 0.0)), Vector((offset, offset, 0.0)), Vector((-offset, offset, 0.0)) def matrix_to_quat(matrix): # scale = matrix.median_scale @@ -471,7 +491,7 @@ class MakeDupliFace(bpy.types.Operator): linked.setdefault(data, []).append(obj) for data, objects in linked.items(): - face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix) for axis in v] + face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix_world) for axis in v] faces = list(range(int(len(face_verts) / 3))) mesh = bpy.data.meshes.new(data.name + "_dupli") @@ -505,6 +525,26 @@ class MakeDupliFace(bpy.types.Operator): return {'FINISHED'} +class IsolateTypeRender(bpy.types.Operator): + '''Select object matching a naming pattern''' + bl_idname = "object.isolate_type_render" + bl_label = "Isolate Render Selection" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + act_type = context.object.type + + for obj in context.visible_objects: + + if obj.selected: + obj.restrict_render = False + else: + if obj.type == act_type: + obj.restrict_render = True + + return {'FINISHED'} + + classes = [ SelectPattern, SelectCamera, @@ -512,6 +552,7 @@ classes = [ SubdivisionSet, ShapeTransfer, JoinUVs, + IsolateTypeRender, MakeDupliFace] @@ -520,6 +561,7 @@ def register(): for cls in classes: register(cls) + def unregister(): unregister = bpy.types.unregister for cls in classes: @@ -527,4 +569,3 @@ def unregister(): if __name__ == "__main__": register() - diff --git a/release/scripts/op/object_align.py b/release/scripts/op/object_align.py index c5fcc3d2a32..6e5eef0fbc2 100644 --- a/release/scripts/op/object_align.py +++ b/release/scripts/op/object_align.py @@ -19,22 +19,22 @@ # <pep8 compliant> import bpy -from Mathutils import Vector +from mathutils import Vector def align_objects(align_x, align_y, align_z, align_mode, relative_to): cursor = bpy.context.scene.cursor_location - Left_Up_Front_SEL = [[],[],[]] - Right_Down_Back_SEL = [[],[],[]] + Left_Up_Front_SEL = [[], [], []] + Right_Down_Back_SEL = [[], [], []] flag_first = True for obj in bpy.context.selected_objects: if obj.type == 'MESH': - bb_world = [obj.matrix * Vector(v[:]) for v in obj.bound_box] + bb_world = [obj.matrix_world * Vector(v[:]) for v in obj.bound_box] Left_Up_Front = bb_world[1] Right_Down_Back = bb_world[7] @@ -43,13 +43,13 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to): if obj == bpy.context.active_object: - center_active_x = ( Left_Up_Front[0] + Right_Down_Back[0] ) / 2 - center_active_y = ( Left_Up_Front[1] + Right_Down_Back[1] ) / 2 - center_active_z = ( Left_Up_Front[2] + Right_Down_Back[2] ) / 2 + center_active_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2 + center_active_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2 + center_active_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2 - size_active_x = ( Right_Down_Back[0] - Left_Up_Front[0] ) / 2 - size_active_y = ( Right_Down_Back[1] - Left_Up_Front[1] ) / 2 - size_active_z = ( Left_Up_Front[2] - Right_Down_Back[2] ) / 2 + size_active_x = (Right_Down_Back[0] - Left_Up_Front[0]) / 2 + size_active_y = (Right_Down_Back[1] - Left_Up_Front[1]) / 2 + size_active_z = (Left_Up_Front[2] - Right_Down_Back[2]) / 2 # Selection Center @@ -85,9 +85,9 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to): if Right_Down_Back[2] < Right_Down_Back_SEL[2]: Right_Down_Back_SEL[2] = Right_Down_Back[2] - center_sel_x = ( Left_Up_Front_SEL[0] + Right_Down_Back_SEL[0] ) / 2 - center_sel_y = ( Left_Up_Front_SEL[1] + Right_Down_Back_SEL[1] ) / 2 - center_sel_z = ( Left_Up_Front_SEL[2] + Right_Down_Back_SEL[2] ) / 2 + center_sel_x = (Left_Up_Front_SEL[0] + Right_Down_Back_SEL[0]) / 2 + center_sel_y = (Left_Up_Front_SEL[1] + Right_Down_Back_SEL[1]) / 2 + center_sel_z = (Left_Up_Front_SEL[2] + Right_Down_Back_SEL[2]) / 2 # Main Loop @@ -95,14 +95,14 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to): if obj.type == 'MESH': loc_world = obj.location - bb_world = [obj.matrix * Vector(v[:]) for v in obj.bound_box] + bb_world = [obj.matrix_world * Vector(v[:]) for v in obj.bound_box] Left_Up_Front = bb_world[1] Right_Down_Back = bb_world[7] - center_x = ( Left_Up_Front[0] + Right_Down_Back[0] ) / 2 - center_y = ( Left_Up_Front[1] + Right_Down_Back[1] ) / 2 - center_z = ( Left_Up_Front[2] + Right_Down_Back[2] ) / 2 + center_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2 + center_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2 + center_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2 positive_x = Right_Down_Back[0] positive_y = Right_Down_Back[1] @@ -240,8 +240,7 @@ class AlignObjects(bpy.types.Operator): align_mode = bpy.props.EnumProperty(items=( ('OPT_1', "Negative Sides", ""), ('OPT_2', "Centers", ""), - ('OPT_3', "Positive Sides", "") - ), + ('OPT_3', "Positive Sides", "")), name="Align Mode:", description="", default='OPT_2') @@ -250,8 +249,7 @@ class AlignObjects(bpy.types.Operator): ('OPT_1', "Scene Origin", ""), ('OPT_2', "3D Cursor", ""), ('OPT_3', "Selection", ""), - ('OPT_4', "Active", "") - ), + ('OPT_4', "Active", "")), name="Relative To:", description="", default='OPT_4') diff --git a/release/scripts/op/object_randomize_transform.py b/release/scripts/op/object_randomize_transform.py index 3d3feb66424..89884b1767f 100644 --- a/release/scripts/op/object_randomize_transform.py +++ b/release/scripts/op/object_randomize_transform.py @@ -25,12 +25,12 @@ def randomize_selected(seed, loc, rot, scale, scale_even, scale_min): import random from random import uniform - from Mathutils import Vector + from mathutils import Vector random.seed(seed) def rand_vec(vec_range): - return Vector([uniform(- val, val) for val in vec_range]) + return Vector([uniform(-val, val) for val in vec_range]) for obj in bpy.context.selected_objects: diff --git a/release/scripts/op/presets.py b/release/scripts/op/presets.py index 1a8e57f7c32..f80c5e69ddd 100644 --- a/release/scripts/op/presets.py +++ b/release/scripts/op/presets.py @@ -27,8 +27,8 @@ class AddPresetBase(bpy.types.Operator): subclasses must define - preset_values - preset_subdir ''' - bl_idname = "render.preset_add" - bl_label = "Add Render Preset" + # bl_idname = "script.preset_base_add" + # bl_label = "Add a Python Preset" name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="") @@ -46,14 +46,18 @@ class AddPresetBase(bpy.types.Operator): target_path = bpy.utils.preset_paths(self.preset_subdir)[0] # we need some way to tell the user and system preset path - file_preset = open(os.path.join(target_path, filename), 'w') + filepath = os.path.join(target_path, filename) + if getattr(self, "save_keyconfig", False): + bpy.ops.wm.keyconfig_export(filepath=filepath, kc_name=self.properties.name) + file_preset = open(filepath, 'a') + file_preset.write("wm.active_keyconfig = kc\n\n") + else: + file_preset = open(filepath, 'w') + file_preset.write("import bpy\n") for rna_path in self.preset_values: value = eval(rna_path) - if type(value) == str: - value = "'%s'" % value - - file_preset.write("%s = %s\n" % (rna_path, value)) + file_preset.write("%s = %s\n" % (rna_path, repr(value))) file_preset.close() @@ -68,6 +72,25 @@ class AddPresetBase(bpy.types.Operator): return {'RUNNING_MODAL'} +class ExecutePreset(bpy.types.Operator): + ''' Executes a preset ''' + bl_idname = "script.execute_preset" + bl_label = "Execute a Python Preset" + + filepath = bpy.props.StringProperty(name="Path", description="Path of the Python file to execute", maxlen=512, default="") + preset_name = bpy.props.StringProperty(name="Preset Name", description="Name of the Preset being executed", default="") + menu_idname = bpy.props.StringProperty(name="Menu ID Name", description="ID name of the menu this was called from", default="") + + def execute(self, context): + # change the menu title to the most recently chosen option + preset_class = getattr(bpy.types, self.properties.menu_idname) + preset_class.bl_label = self.properties.preset_name + + # execute the preset using script.python_file_run + bpy.ops.script.python_file_run(filepath=self.properties.filepath) + return {'FINISHED'} + + class AddPresetRender(AddPresetBase): '''Add a Render Preset''' bl_idname = "render.preset_add" @@ -158,11 +181,35 @@ class AddPresetSunSky(AddPresetBase): preset_subdir = "sunsky" +class AddPresetInteraction(AddPresetBase): + '''Add an Application Interaction Preset''' + bl_idname = "wm.interaction_preset_add" + bl_label = "Add Interaction Preset" + name = AddPresetBase.name + save_keyconfig = True + + preset_values = [ + "bpy.context.user_preferences.edit.drag_immediately", + "bpy.context.user_preferences.edit.insertkey_xyz_to_rgb", + "bpy.context.user_preferences.inputs.select_mouse", + "bpy.context.user_preferences.inputs.zoom_style", + "bpy.context.user_preferences.inputs.zoom_axis", + "bpy.context.user_preferences.inputs.view_rotation", + "bpy.context.user_preferences.inputs.invert_zoom_direction", + "bpy.context.user_preferences.inputs.emulate_numpad", + "bpy.context.user_preferences.inputs.emulate_3_button_mouse", + "bpy.context.user_preferences.inputs.continuous_mouse", + ] + + preset_subdir = "interaction" + classes = [ + ExecutePreset, AddPresetRender, AddPresetSSS, AddPresetCloth, - AddPresetSunSky] + AddPresetSunSky, + AddPresetInteraction] def register(): diff --git a/release/scripts/op/screen_play_rendered_anim.py b/release/scripts/op/screen_play_rendered_anim.py index 17087183c7d..2ecd445df1d 100644 --- a/release/scripts/op/screen_play_rendered_anim.py +++ b/release/scripts/op/screen_play_rendered_anim.py @@ -25,36 +25,40 @@ # Originally written by Matt Ebb import bpy -import subprocess import os -import platform def guess_player_path(preset): - if preset == 'BLENDER24': - player_path = 'blender' + import platform + system = platform.system() - if platform.system() == 'Darwin': - test_path = '/Applications/blender 2.49.app/Contents/MacOS/blender' - elif platform.system() == 'Windows': - test_path = '/Program Files/Blender Foundation/Blender/blender.exe' + if preset == 'BLENDER24': + player_path = "blender" + + if system == 'Darwin': + test_path = "/Applications/blender 2.49.app/Contents/MacOS/blender" + elif system == 'Windows': + test_path = "/Program Files/Blender Foundation/Blender/blender.exe" if os.path.exists(test_path): player_path = test_path elif preset == 'DJV': - player_path = 'djv_view' + player_path = "djv_view" - if platform.system() == 'Darwin': + if system == 'Darwin': test_path = '/Applications/djv-0.8.2.app/Contents/Resources/bin/djv_view' if os.path.exists(test_path): player_path = test_path elif preset == 'FRAMECYCLER': - player_path = 'framecycler' + player_path = "framecycler" elif preset == 'RV': - player_path = 'rv' + player_path = "rv" + + elif preset == 'MPLAYER': + player_path = "mplayer" return player_path @@ -62,11 +66,13 @@ def guess_player_path(preset): class PlayRenderedAnim(bpy.types.Operator): '''Plays back rendered frames/movies using an external player.''' - bl_idname = "screen.play_rendered_anim" + bl_idname = "render.play_rendered_anim" bl_label = "Play Rendered Animation" bl_options = {'REGISTER'} def execute(self, context): + import subprocess + scene = context.scene rd = scene.render prefs = context.user_preferences @@ -74,18 +80,32 @@ class PlayRenderedAnim(bpy.types.Operator): preset = prefs.filepaths.animation_player_preset player_path = prefs.filepaths.animation_player file_path = bpy.utils.expandpath(rd.output_path) + is_movie = rd.is_movie_format # try and guess a command line if it doesn't exist if player_path == '': player_path = guess_player_path(preset) - if preset in ('FRAMECYCLER', 'RV'): + if is_movie == False and preset in ('FRAMECYCLER', 'RV', 'MPLAYER'): # replace the number with '#' - file_a, file_b = rd.frame_path(frame=0), rd.frame_path(frame=1) + file_a = rd.frame_path(frame=0) + + # TODO, make an api call for this + frame_tmp = 9 + file_b = rd.frame_path(frame=frame_tmp) + + while len(file_a) == len(file_b): + frame_tmp = (frame_tmp * 10) + 9 + print(frame_tmp) + file_b = rd.frame_path(frame=frame_tmp) + file_b = rd.frame_path(frame=int(frame_tmp / 10)) + file = ''.join([(c if file_b[i] == c else "#") for i, c in enumerate(file_a)]) else: # works for movies and images - file = rd.frame_path(frame=scene.start_frame) + file = rd.frame_path(frame=scene.frame_start) + + file = bpy.utils.expandpath(file) # expand '//' cmd = [player_path] # extra options, fps controls etc. @@ -96,11 +116,20 @@ class PlayRenderedAnim(bpy.types.Operator): opts = [file, "-playback_speed", str(rd.fps)] cmd.extend(opts) elif preset == 'FRAMECYCLER': - opts = [file, "%d-%d" % (scene.start_frame, scene.end_frame)] + opts = [file, "%d-%d" % (scene.frame_start, scene.frame_end)] cmd.extend(opts) elif preset == 'RV': opts = ["-fps", str(rd.fps), "-play", "[ %s ]" % file] cmd.extend(opts) + elif preset == 'MPLAYER': + opts = [] + if is_movie: + opts.append(file) + else: + opts.append("mf://%s" % file.replace("#", "?")) + opts += ["-mf", "fps=%.4f" % (rd.fps / rd.fps_base)] + opts += ["-loop", "0", "-really-quiet", "-fs"] + cmd.extend(opts) else: # 'CUSTOM' cmd.append(file) @@ -123,4 +152,3 @@ def unregister(): if __name__ == "__main__": register() - diff --git a/release/scripts/op/sequencer.py b/release/scripts/op/sequencer.py index 51bb96442e9..13668498aae 100644 --- a/release/scripts/op/sequencer.py +++ b/release/scripts/op/sequencer.py @@ -20,6 +20,9 @@ import bpy +from bpy.props import * + + class SequencerCrossfadeSounds(bpy.types.Operator): '''Do crossfading volume animation of two selected sound strips.''' @@ -48,34 +51,101 @@ class SequencerCrossfadeSounds(bpy.types.Operator): if seq2 == None: self.report({'ERROR'}, "Select 2 sound strips.") return {'CANCELLED'} - if seq1.start_frame_final > seq2.start_frame_final: + if seq1.frame_final_start > seq2.frame_final_start: s = seq1 seq1 = seq2 seq2 = s - if seq1.end_frame_final > seq2.start_frame_final: - tempcfra = context.scene.current_frame - context.scene.current_frame = seq2.start_frame_final + if seq1.frame_final_end > seq2.frame_final_start: + tempcfra = context.scene.frame_current + context.scene.frame_current = seq2.frame_final_start seq1.keyframe_insert('volume') - context.scene.current_frame = seq1.end_frame_final + context.scene.frame_current = seq1.frame_final_end seq1.volume = 0 seq1.keyframe_insert('volume') seq2.keyframe_insert('volume') - context.scene.current_frame = seq2.start_frame_final + context.scene.frame_current = seq2.frame_final_start seq2.volume = 0 seq2.keyframe_insert('volume') - context.scene.current_frame = tempcfra + context.scene.frame_current = tempcfra return {'FINISHED'} else: self.report({'ERROR'}, "The selected strips don't overlap.") return {'CANCELLED'} +class SequencerCutMulticam(bpy.types.Operator): + '''Cut multicam strip and select camera.''' + + bl_idname = "sequencer.cut_multicam" + bl_label = "Cut multicam" + bl_options = {'REGISTER', 'UNDO'} + + camera = IntProperty(name="Camera", + default=1, min=1, max=32, soft_min=1, soft_max=32) + + def poll(self, context): + if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip: + return context.scene.sequence_editor.active_strip.type == 'MULTICAM' + else: + return False + + def execute(self, context): + camera = self.properties.camera + + s = context.scene.sequence_editor.active_strip + + if s.multicam_source == camera: + return {'FINISHED'} + + if not s.selected: + s.selected = True + + cfra = context.scene.frame_current + bpy.ops.sequencer.cut(frame=cfra, type='SOFT', side='RIGHT') + for s in context.scene.sequence_editor.sequences_all: + if s.selected and s.type == 'MULTICAM' and s.frame_final_start <= cfra and cfra < s.frame_final_end: + context.scene.sequence_editor.active_strip = s + + context.scene.sequence_editor.active_strip.multicam_source = camera + return {'FINISHED'} + + +class SequencerDeinterlaceSelectedMovies(bpy.types.Operator): + '''Deinterlace all selected movie sources.''' + + bl_idname = "sequencer.deinterlace_selected_movies" + bl_label = "Deinterlace Movies" + bl_options = {'REGISTER', 'UNDO'} + + def poll(self, context): + if context.scene and context.scene.sequence_editor: + return True + else: + return False + + def execute(self, context): + for s in context.scene.sequence_editor.sequences_all: + if s.selected and s.type == 'MOVIE': + s.de_interlace = True + + return {'FINISHED'} + + def register(): - bpy.types.register(SequencerCrossfadeSounds) + register = bpy.types.register + + register(SequencerCrossfadeSounds) + register(SequencerCutMulticam) + register(SequencerDeinterlaceSelectedMovies) + def unregister(): - bpy.types.unregister(SequencerCrossfadeSounds) + unregister = bpy.types.unregister + + unregister(SequencerCrossfadeSounds) + unregister(SequencerCutMulticam) + unregister(SequencerDeinterlaceSelectedMovies) + if __name__ == "__main__": register() - diff --git a/release/scripts/op/uv.py b/release/scripts/op/uv.py index f22db9d87a8..51c1695677b 100644 --- a/release/scripts/op/uv.py +++ b/release/scripts/op/uv.py @@ -29,7 +29,7 @@ class ExportUVLayout(bpy.types.Operator): bl_label = "Export UV Layout" bl_options = {'REGISTER', 'UNDO'} - path = StringProperty(name="File Path", description="File path used for exporting the SVG file", maxlen=1024, default="") + filepath = StringProperty(name="File Path", description="File path used for exporting the SVG file", maxlen=1024, default="") check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) export_all = BoolProperty(name="All UV's", description="Export all UVs in this mesh (not just the visible ones)", default=False) mode = EnumProperty(items=( @@ -113,7 +113,7 @@ class ExportUVLayout(bpy.types.Operator): mode = self.properties.mode - file = open(self.properties.path, "w") + file = open(self.properties.filepath, "w") fw = file.write if mode == 'SVG': @@ -123,7 +123,7 @@ class ExportUVLayout(bpy.types.Operator): fw(' "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n') fw('<svg width="%dpx" height="%dpx" viewBox="0px 0px %dpx %dpx"\n' % (image_width, image_height, image_width, image_height)) fw(' xmlns="http://www.w3.org/2000/svg" version="1.1">\n') - desc = "%s, %s, %s (Blender %s)" % (basename(bpy.data.filename), obj.name, mesh.name, bpy.app.version_string) + desc = "%s, %s, %s (Blender %s)" % (basename(bpy.data.filepath), obj.name, mesh.name, bpy.app.version_string) fw('<desc>%s</desc>\n' % escape(desc)) # svg colors @@ -167,18 +167,34 @@ class ExportUVLayout(bpy.types.Operator): fw('1 setlinewidth\n') fw('1 setlinejoin\n') fw('1 setlinecap\n') + fw('/DRAW {') + # can remove from here to next comment to disable filling, aparently alpha is not supported + fw('gsave\n') + fw('0.7 setgray\n') + fw('fill\n') + fw('grestore\n') + fw('0 setgray\n') + # remove to here + fw('stroke\n') + fw('} def\n') fw('newpath\n') + firstline = True for i, uvs in self._face_uv_iter(context): for j, uv in enumerate(uvs): x, y = uv[0], uv[1] if j == 0: + if not firstline: + fw('closepath\n') + fw('DRAW\n') + fw('newpath\n') + firstline = False fw('%.5f %.5f moveto\n' % (x * image_width, y * image_height)) else: fw('%.5f %.5f lineto\n' % (x * image_width, y * image_height)) fw('closepath\n') - fw('stroke\n') + fw('DRAW\n') fw('showpage\n') fw('%%EOF\n') @@ -194,8 +210,9 @@ class ExportUVLayout(bpy.types.Operator): def menu_func(self, context): - default_path = bpy.data.filename.replace(".blend", ".svg") - self.layout.operator(ExportUVLayout.bl_idname).path = default_path + import os + default_path = os.path.splitext(bpy.data.filepath)[0] + ".svg" + self.layout.operator(ExportUVLayout.bl_idname).filepath = default_path def register(): @@ -203,7 +220,7 @@ def register(): bpy.types.IMAGE_MT_uvs.append(menu_func) -def unreguster(): +def unregister(): bpy.types.unregister(ExportUVLayout) bpy.types.IMAGE_MT_uvs.remove(menu_func) diff --git a/release/scripts/op/uvcalc_follow_active.py b/release/scripts/op/uvcalc_follow_active.py index a76bd0d3a98..61c149c8735 100644 --- a/release/scripts/op/uvcalc_follow_active.py +++ b/release/scripts/op/uvcalc_follow_active.py @@ -65,9 +65,9 @@ def extend(obj, operator, EXTEND_MODE): # vertex index is the key, uv is the value - uvs_vhash_source = dict([(vindex, uvs_source[i]) for i, vindex in enumerate(vidx_source)]) + uvs_vhash_source = {vindex: uvs_source[i] for i, vindex in enumerate(vidx_source)} - uvs_vhash_target = dict([(vindex, uvs_target[i]) for i, vindex in enumerate(vidx_target)]) + uvs_vhash_target = {vindex: uvs_target[i] for i, vindex in enumerate(vidx_target)} edge_idxs_source = face_edge_vs(vidx_source) edge_idxs_target = face_edge_vs(vidx_target) @@ -180,7 +180,7 @@ def extend(obj, operator, EXTEND_MODE): #SEAM = me.edges.seam if EXTEND_MODE == 'LENGTH': - edge_loops = me.edge_loops(face_sel, [ed.key for ed in me.edges if ed.seam]) + edge_loops = me.edge_loops_from_faces(face_sel, [ed.key for ed in me.edges if ed.seam]) me_verts = me.verts for loop in edge_loops: looplen = [0.0] @@ -266,10 +266,10 @@ def register(): bpy.types.register(FollowActiveQuads) bpy.types.VIEW3D_MT_uv_map.append(menu_func) + def unregister(): bpy.types.unregister(FollowActiveQuads) bpy.types.VIEW3D_MT_uv_map.remove(menu_func) if __name__ == "__main__": register() - diff --git a/release/scripts/op/uvcalc_smart_project.py b/release/scripts/op/uvcalc_smart_project.py index c88faae2818..13bf6244f4d 100644 --- a/release/scripts/op/uvcalc_smart_project.py +++ b/release/scripts/op/uvcalc_smart_project.py @@ -22,10 +22,9 @@ # <pep8 compliant> -#from Blender import Object, Draw, Window, sys, Mesh, Geometry -from Mathutils import Matrix, Vector, RotationMatrix +from mathutils import Matrix, Vector, RotationMatrix import time -import Geometry +import geometry import bpy from math import cos, radians @@ -200,7 +199,7 @@ def pointInEdges(pt, edges): """ def pointInIsland(pt, island): - vec1 = Vector(); vec2 = Vector(); vec3 = Vector() + vec1, vec2, vec3 = Vector(), Vector(), Vector() for f in island: vec1.x, vec1.y = f.uv[0] vec2.x, vec2.y = f.uv[1] @@ -227,7 +226,7 @@ def islandIntersectUvIsland(source, target, SourceOffset): # Edge intersect test for ed in edgeLoopsSource: for seg in edgeLoopsTarget: - i = Geometry.LineIntersect2D(\ + i = geometry.LineIntersect2D(\ seg[0], seg[1], SourceOffset+ed[0], SourceOffset+ed[1]) if i: return 1 # LINE INTERSECTION @@ -390,7 +389,7 @@ def mergeUvIslands(islandList): w, h = maxx-minx, maxy-miny totFaceArea = 0 - offset= Vector(minx, miny) + offset= Vector((minx, miny)) for f in islandList[islandIdx]: for uv in f.uv: uv -= offset @@ -514,7 +513,7 @@ def mergeUvIslands(islandList): ##testcount+=1 #print 'Testing intersect' - Intersect = islandIntersectUvIsland(sourceIsland, targetIsland, Vector(boxLeft, boxBottom)) + Intersect = islandIntersectUvIsland(sourceIsland, targetIsland, Vector((boxLeft, boxBottom))) #print 'Done', Intersect if Intersect == 1: # Line intersect, dont bother with this any more pass @@ -540,7 +539,7 @@ def mergeUvIslands(islandList): # Move faces into new island and offset targetIsland[0].extend(sourceIsland[0]) - offset= Vector(boxLeft, boxBottom) + offset= Vector((boxLeft, boxBottom)) for f in sourceIsland[0]: for uv in f.uv: @@ -565,7 +564,7 @@ def mergeUvIslands(islandList): targetIsland[7].extend(sourceIsland[7]) - offset= Vector(boxLeft, boxBottom, 0) + offset= Vector((boxLeft, boxBottom, 0.0)) for p in sourceIsland[7]: p+= offset @@ -741,7 +740,7 @@ def packIslands(islandList): #XXX Window.DrawProgressBar(0.7, 'Packing %i UV Islands...' % len(packBoxes) ) time1 = time.time() - packWidth, packHeight = Geometry.BoxPack2D(packBoxes) + packWidth, packHeight = geometry.BoxPack2D(packBoxes) # print 'Box Packing Time:', time.time() - time1 @@ -781,9 +780,9 @@ def packIslands(islandList): def VectoMat(vec): a3 = vec.__copy__().normalize() - up = Vector(0,0,1) + up = Vector((0.0, 0.0, 1.0)) if abs(a3.dot(up)) == 1.0: - up = Vector(0,1,0) + up = Vector((0.0, 1.0, 0.0)) a1 = a3.cross(up).normalize() a2 = a3.cross(a1) @@ -936,7 +935,7 @@ def main(context, island_margin, projection_limit): # Initialize projectVecs if USER_VIEW_INIT: # Generate Projection - projectVecs = [Vector(Window.GetViewVector()) * ob.matrixWorld.copy().invert().rotation_part()] # We add to this allong the way + projectVecs = [Vector(Window.GetViewVector()) * ob.matrix_world.copy().invert().rotation_part()] # We add to this allong the way else: projectVecs = [] @@ -964,7 +963,7 @@ def main(context, island_margin, projection_limit): newProjectMeshFaces.append(tempMeshFaces.pop(fIdx)) # Add the average of all these faces normals as a projectionVec - averageVec = Vector(0,0,0) + averageVec = Vector((0.0, 0.0, 0.0)) if USER_AREA_WEIGHT: for fprop in newProjectMeshFaces: averageVec += (fprop.no * fprop.area) @@ -1056,7 +1055,7 @@ def main(context, island_margin, projection_limit): for f in faceProjectionGroupList[i]: f_uv = f.uv for j, v in enumerate(f.v): - # XXX - note, between Mathutils in 2.4 and 2.5 the order changed. + # XXX - note, between mathutils in 2.4 and 2.5 the order changed. f_uv[j][:] = (v.co * MatProj)[:2] diff --git a/release/scripts/op/vertexpaint_dirt.py b/release/scripts/op/vertexpaint_dirt.py index f2c2d5bd864..c1521866a56 100644 --- a/release/scripts/op/vertexpaint_dirt.py +++ b/release/scripts/op/vertexpaint_dirt.py @@ -34,7 +34,7 @@ import bpy import math import time -from Mathutils import Vector +from mathutils import Vector from bpy.props import * @@ -58,17 +58,22 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean, con[e.verts[0]].append(e.verts[1]) con[e.verts[1]].append(e.verts[0]) - for v in me.verts: + for i, v in enumerate(me.verts): vec = Vector() no = v.normal co = v.co # get the direction of the vectors between the vertex and it's connected vertices - for c in con[v.index]: - vec += Vector(me.verts[c].co - co).normalize() + for c in con[i]: + vec += (me.verts[c].co - co).normalize() # normalize the vector by dividing by the number of connected verts - vec /= len(con[v.index]) + tot_con = len(con[i]) + + if tot_con == 0: + continue + + vec /= tot_con # angle is the acos of the dot product between vert and connected verts normals ang = math.acos(no.dot(vec)) @@ -79,7 +84,7 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean, if not dirt_only: ang = min(clamp_clean, ang) - vert_tone[v.index] = ang + vert_tone[i] = ang # blur tones for i in range(blur_iterations): @@ -146,7 +151,7 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean, class VertexPaintDirt(bpy.types.Operator): - bl_idname = "mesh.vertex_paint_dirt" + bl_idname = "paint.vertex_color_dirt" bl_label = "Dirty Vertex Colors" bl_options = {'REGISTER', 'UNDO'} @@ -171,7 +176,7 @@ class VertexPaintDirt(bpy.types.Operator): print('Dirt calculated in %.6f' % (time.time() - t)) - return('FINISHED',) + return {'FINISHED'} def register(): diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py index 216cb57537e..ed77f32ff6d 100644 --- a/release/scripts/op/wm.py +++ b/release/scripts/op/wm.py @@ -16,7 +16,7 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8-80 compliant> +# <pep8 compliant> import bpy @@ -24,8 +24,7 @@ from bpy.props import * class MESH_OT_delete_edgeloop(bpy.types.Operator): - '''Export a single object as a stanford PLY with normals, - colours and texture coordinates.''' + '''Delete an edge loop by merging the faces on each side to a single face loop''' bl_idname = "mesh.delete_edgeloop" bl_label = "Delete Edge Loop" @@ -47,10 +46,10 @@ rna_relative_prop = BoolProperty(name="Relative", default=False) -def context_path_validate(context, path): +def context_path_validate(context, data_path): import sys try: - value = eval("context.%s" % path) + value = eval("context.%s" % data_path) except AttributeError: if "'NoneType'" in str(sys.exc_info()[1]): # One of the items in the rna path is None, just ignore this @@ -63,13 +62,13 @@ def context_path_validate(context, path): def execute_context_assign(self, context): - if context_path_validate(context, self.properties.path) is Ellipsis: + if context_path_validate(context, self.properties.data_path) is Ellipsis: return {'PASS_THROUGH'} if getattr(self.properties, "relative", False): - exec("context.%s+=self.properties.value" % self.properties.path) + exec("context.%s+=self.properties.value" % self.properties.data_path) else: - exec("context.%s=self.properties.value" % self.properties.path) + exec("context.%s=self.properties.value" % self.properties.data_path) return {'FINISHED'} @@ -80,7 +79,7 @@ class WM_OT_context_set_boolean(bpy.types.Operator): bl_label = "Context Set Boolean" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value = BoolProperty(name="Value", description="Assignment value", default=True) @@ -93,20 +92,56 @@ class WM_OT_context_set_int(bpy.types.Operator): # same as enum bl_label = "Context Set" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value = IntProperty(name="Value", description="Assign value", default=0) relative = rna_relative_prop execute = execute_context_assign +class WM_OT_context_scale_int(bpy.types.Operator): # same as enum + '''Scale an int context value.''' + bl_idname = "wm.context_scale_int" + bl_label = "Context Set" + bl_options = {'UNDO'} + + data_path = rna_path_prop + value = FloatProperty(name="Value", description="Assign value", default=1.0) + always_step = BoolProperty(name="Always Step", + description="Always adjust the value by a minimum of 1 when 'value' is not 1.0.", + default=True) + + def execute(self, context): + if context_path_validate(context, self.properties.data_path) is Ellipsis: + return {'PASS_THROUGH'} + + value = self.properties.value + data_path = self.properties.data_path + + if value == 1.0: # nothing to do + return {'CANCELLED'} + + if getattr(self.properties, "always_step", False): + if value > 1.0: + add = "1" + func = "max" + else: + add = "-1" + func = "min" + exec("context.%s = %s(round(context.%s * value), context.%s + %s)" % (data_path, func, data_path, data_path, add)) + else: + exec("context.%s *= value" % self.properties.data_path) + + return {'FINISHED'} + + class WM_OT_context_set_float(bpy.types.Operator): # same as enum '''Set a context value.''' bl_idname = "wm.context_set_float" bl_label = "Context Set Float" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value = FloatProperty(name="Value", description="Assignment value", default=0.0) relative = rna_relative_prop @@ -120,7 +155,7 @@ class WM_OT_context_set_string(bpy.types.Operator): # same as enum bl_label = "Context Set String" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value = StringProperty(name="Value", description="Assign value", maxlen=1024, default="") @@ -133,7 +168,7 @@ class WM_OT_context_set_enum(bpy.types.Operator): bl_label = "Context Set Enum" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value = StringProperty(name="Value", description="Assignment value (as a string)", maxlen=1024, default="") @@ -147,15 +182,15 @@ class WM_OT_context_set_value(bpy.types.Operator): bl_label = "Context Set Value" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value = StringProperty(name="Value", description="Assignment value (as a string)", maxlen=1024, default="") def execute(self, context): - if context_path_validate(context, self.properties.path) is Ellipsis: + if context_path_validate(context, self.properties.data_path) is Ellipsis: return {'PASS_THROUGH'} - exec("context.%s=%s" % (self.properties.path, self.properties.value)) + exec("context.%s=%s" % (self.properties.data_path, self.properties.value)) return {'FINISHED'} @@ -165,15 +200,15 @@ class WM_OT_context_toggle(bpy.types.Operator): bl_label = "Context Toggle" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop def execute(self, context): - if context_path_validate(context, self.properties.path) is Ellipsis: + if context_path_validate(context, self.properties.data_path) is Ellipsis: return {'PASS_THROUGH'} exec("context.%s=not (context.%s)" % - (self.properties.path, self.properties.path)) + (self.properties.data_path, self.properties.data_path)) return {'FINISHED'} @@ -184,7 +219,7 @@ class WM_OT_context_toggle_enum(bpy.types.Operator): bl_label = "Context Toggle Values" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop value_1 = StringProperty(name="Value", \ description="Toggle enum", maxlen=1024, default="") @@ -193,12 +228,12 @@ class WM_OT_context_toggle_enum(bpy.types.Operator): def execute(self, context): - if context_path_validate(context, self.properties.path) is Ellipsis: + if context_path_validate(context, self.properties.data_path) is Ellipsis: return {'PASS_THROUGH'} exec("context.%s = ['%s', '%s'][context.%s!='%s']" % \ - (self.properties.path, self.properties.value_1,\ - self.properties.value_2, self.properties.path, + (self.properties.data_path, self.properties.value_1,\ + self.properties.value_2, self.properties.data_path, self.properties.value_2)) return {'FINISHED'} @@ -211,12 +246,12 @@ class WM_OT_context_cycle_int(bpy.types.Operator): bl_label = "Context Int Cycle" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop reverse = rna_reverse_prop def execute(self, context): - path = self.properties.path - value = context_path_validate(context, path) + data_path = self.properties.data_path + value = context_path_validate(context, data_path) if value is Ellipsis: return {'PASS_THROUGH'} @@ -225,16 +260,16 @@ class WM_OT_context_cycle_int(bpy.types.Operator): else: value += 1 - exec("context.%s=value" % path) + exec("context.%s=value" % data_path) - if value != eval("context.%s" % path): + if value != eval("context.%s" % data_path): # relies on rna clamping int's out of the range if self.properties.reverse: value = (1 << 32) else: value = - (1 << 32) - exec("context.%s=value" % path) + exec("context.%s=value" % data_path) return {'FINISHED'} @@ -245,19 +280,19 @@ class WM_OT_context_cycle_enum(bpy.types.Operator): bl_label = "Context Enum Cycle" bl_options = {'UNDO'} - path = rna_path_prop + data_path = rna_path_prop reverse = rna_reverse_prop def execute(self, context): - value = context_path_validate(context, self.properties.path) + value = context_path_validate(context, self.properties.data_path) if value is Ellipsis: return {'PASS_THROUGH'} orig_value = value # Have to get rna enum values - rna_struct_str, rna_prop_str = self.properties.path.rsplit('.', 1) + rna_struct_str, rna_prop_str = self.properties.data_path.rsplit('.', 1) i = rna_prop_str.find('[') # just incse we get "context.foo.bar[0]" @@ -287,7 +322,7 @@ class WM_OT_context_cycle_enum(bpy.types.Operator): advance_enum = enums[orig_index + 1] # set the new value - exec("context.%s=advance_enum" % self.properties.path) + exec("context.%s=advance_enum" % self.properties.data_path) return {'FINISHED'} doc_id = StringProperty(name="Doc ID", @@ -302,27 +337,27 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): bl_idname = "wm.context_modal_mouse" bl_label = "Context Modal Mouse" - path_iter = StringProperty(description="The path relative to the context, must point to an iterable.") - path_item = StringProperty(description="The path from each iterable to the value (int or float)") + data_path_iter = StringProperty(description="The data path relative to the context, must point to an iterable.") + data_path_item = StringProperty(description="The data path from each iterable to the value (int or float)") input_scale = FloatProperty(default=0.01, description="Scale the mouse movement by this value before applying the delta") invert = BoolProperty(default=False, description="Invert the mouse input") initial_x = IntProperty(options={'HIDDEN'}) def _values_store(self, context): - path_iter = self.properties.path_iter - path_item = self.properties.path_item + data_path_iter = self.properties.data_path_iter + data_path_item = self.properties.data_path_item self._values = values = {} - for item in getattr(context, path_iter): + for item in getattr(context, data_path_iter): try: - value_orig = eval("item." + path_item) + value_orig = eval("item." + data_path_item) except: continue # check this can be set, maybe this is library data. try: - exec("item.%s = %s" % (path_item, value_orig)) + exec("item.%s = %s" % (data_path_item, value_orig)) except: continue @@ -333,17 +368,17 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): if self.properties.invert: delta = - delta - path_item = self.properties.path_item + data_path_item = self.properties.data_path_item for item, value_orig in self._values.items(): if type(value_orig) == int: - exec("item.%s = int(%d)" % (path_item, round(value_orig + delta))) + exec("item.%s = int(%d)" % (data_path_item, round(value_orig + delta))) else: - exec("item.%s = %f" % (path_item, value_orig + delta)) + exec("item.%s = %f" % (data_path_item, value_orig + delta)) def _values_restore(self): - path_item = self.properties.path_item + data_path_item = self.properties.data_path_item for item, value_orig in self._values.items(): - exec("item.%s = %s" % (path_item, value_orig)) + exec("item.%s = %s" % (data_path_item, value_orig)) self._values.clear() @@ -371,7 +406,9 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): self._values_store(context) if not self._values: - self.report({'WARNING'}, "Nothing to operate on: %s[ ].%s" % (self.properties.path_iter, self.properties.path_item)) + self.report({'WARNING'}, "Nothing to operate on: %s[ ].%s" % + (self.properties.data_path_iter, self.properties.data_path_item)) + return {'CANCELLED'} else: self.properties.initial_x = event.mouse_x @@ -380,6 +417,52 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): return {'RUNNING_MODAL'} +class WM_OT_url_open(bpy.types.Operator): + "Open a website in the Webbrowser" + bl_idname = "wm.url_open" + bl_label = "" + + url = StringProperty(name="URL", description="URL to open") + + def execute(self, context): + import webbrowser + webbrowser.open(self.properties.url) + return {'FINISHED'} + + +class WM_OT_path_open(bpy.types.Operator): + "Open a path in a file browser" + bl_idname = "wm.path_open" + bl_label = "" + + filepath = StringProperty(name="File Path", maxlen=1024) + + def execute(self, context): + import sys + import os + import subprocess + + filepath = bpy.utils.expandpath(self.properties.filepath) + filepath = os.path.normpath(filepath) + + if not os.path.exists(filepath): + self.report({'ERROR'}, "File '%s' not found" % filepath) + return {'CANCELLED'} + + if sys.platform == 'win32': + subprocess.Popen(['start', filepath], shell=True) + elif sys.platform == 'darwin': + subprocess.Popen(['open', filepath]) + else: + try: + subprocess.Popen(['xdg-open', filepath]) + except OSError: + # xdg-open *should* be supported by recent Gnome, KDE, Xfce + pass + + return {'FINISHED'} + + class WM_OT_doc_view(bpy.types.Operator): '''Load online reference docs''' bl_idname = "wm.doc_view" @@ -449,7 +532,8 @@ class WM_OT_doc_edit(bpy.types.Operator): class_name, class_prop = doc_id.split('.') if not doc_new: - return {'RUNNING_MODAL'} + self.report({'ERROR'}, "No input given for '%s'" % doc_id) + return {'CANCELLED'} # check if this is an operator op_name = class_name.upper() + '_OT_' + class_prop @@ -466,10 +550,6 @@ class WM_OT_doc_edit(bpy.types.Operator): print("op - old:'%s' -> new:'%s'" % (doc_orig, doc_new)) upload["title"] = 'OPERATOR %s:%s' % (doc_id, doc_orig) - upload["description"] = doc_new - - self._send_xmlrpc(upload) - else: rna = getattr(bpy.types, class_name).bl_rna doc_orig = rna.properties[class_prop].description @@ -485,20 +565,15 @@ class WM_OT_doc_edit(bpy.types.Operator): return {'FINISHED'} + def draw(self, context): + layout = self.layout + props = self.properties + layout.label(text="Descriptor ID: '%s'" % props.doc_id) + layout.prop(props, "doc_new", text="") + def invoke(self, context, event): wm = context.manager - return wm.invoke_props_popup(self, event) - - -class WM_OT_reload_scripts(bpy.types.Operator): - '''Load online reference docs''' - bl_idname = "wm.reload_scripts" - bl_label = "Reload Scripts" - - def execute(self, context): - MOD = type(bpy) - bpy.utils.load_scripts(True) - return {'FINISHED'} + return wm.invoke_props_dialog(self, width=600) import rna_prop_ui @@ -508,6 +583,7 @@ classes = [ WM_OT_context_set_boolean, WM_OT_context_set_int, + WM_OT_context_scale_int, WM_OT_context_set_float, WM_OT_context_set_string, WM_OT_context_set_enum, @@ -518,11 +594,12 @@ classes = [ WM_OT_context_cycle_int, WM_OT_context_modal_mouse, + WM_OT_url_open, + WM_OT_path_open, + WM_OT_doc_view, WM_OT_doc_edit, - WM_OT_reload_scripts, - # experemental! rna_prop_ui.WM_OT_properties_edit, rna_prop_ui.WM_OT_properties_add, diff --git a/release/scripts/presets/cloth/cotton.py b/release/scripts/presets/cloth/cotton.py index 7fe8b890b38..695050cf195 100644 --- a/release/scripts/presets/cloth/cotton.py +++ b/release/scripts/presets/cloth/cotton.py @@ -1,3 +1,4 @@ +import bpy bpy.context.cloth.settings.quality = 5 bpy.context.cloth.settings.mass = 0.300 bpy.context.cloth.settings.structural_stiffness = 15.000 diff --git a/release/scripts/presets/cloth/denim.py b/release/scripts/presets/cloth/denim.py index 4cad384a014..bd72fa873da 100644 --- a/release/scripts/presets/cloth/denim.py +++ b/release/scripts/presets/cloth/denim.py @@ -1,3 +1,4 @@ +import bpy bpy.context.cloth.settings.quality = 12 bpy.context.cloth.settings.mass = 1 bpy.context.cloth.settings.structural_stiffness = 40 diff --git a/release/scripts/presets/cloth/leather.py b/release/scripts/presets/cloth/leather.py index 11176c7e814..b85f504b0bb 100644 --- a/release/scripts/presets/cloth/leather.py +++ b/release/scripts/presets/cloth/leather.py @@ -1,3 +1,4 @@ +import bpy bpy.context.cloth.settings.quality = 15 bpy.context.cloth.settings.mass = 0.4 bpy.context.cloth.settings.structural_stiffness = 80 diff --git a/release/scripts/presets/cloth/rubber.py b/release/scripts/presets/cloth/rubber.py index 101c11b141a..c2d7625d333 100644 --- a/release/scripts/presets/cloth/rubber.py +++ b/release/scripts/presets/cloth/rubber.py @@ -1,3 +1,4 @@ +import bpy bpy.context.active_object.modifiers['Cloth'].settings.quality = 7 bpy.context.active_object.modifiers['Cloth'].settings.mass = 3 bpy.context.active_object.modifiers['Cloth'].settings.structural_stiffness = 15 diff --git a/release/scripts/presets/cloth/silk.py b/release/scripts/presets/cloth/silk.py index a0dea5f1fd3..c2a98c270b8 100644 --- a/release/scripts/presets/cloth/silk.py +++ b/release/scripts/presets/cloth/silk.py @@ -1,3 +1,4 @@ +import bpy bpy.context.cloth.settings.quality = 5 bpy.context.cloth.settings.mass = 0.150 bpy.context.cloth.settings.structural_stiffness = 5 diff --git a/release/scripts/presets/ffmpeg/DV.py b/release/scripts/presets/ffmpeg/DV.py new file mode 100644 index 00000000000..4cdb2f271b9 --- /dev/null +++ b/release/scripts/presets/ffmpeg/DV.py @@ -0,0 +1,10 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "DV" +bpy.context.scene.render.resolution_x = 720 + +if is_ntsc: + bpy.context.scene.render.resolution_y = 480 +else: + bpy.context.scene.render.resolution_y = 576 diff --git a/release/scripts/presets/ffmpeg/DVD.py b/release/scripts/presets/ffmpeg/DVD.py new file mode 100644 index 00000000000..233bdab4f20 --- /dev/null +++ b/release/scripts/presets/ffmpeg/DVD.py @@ -0,0 +1,19 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "MPEG2" +bpy.context.scene.render.resolution_x = 720 + +if is_ntsc: + bpy.context.scene.render.resolution_y = 480 + bpy.context.scene.render.ffmpeg_gopsize = 18 +else: + bpy.context.scene.render.resolution_y = 576 + bpy.context.scene.render.ffmpeg_gopsize = 15 + +bpy.context.scene.render.ffmpeg_video_bitrate = 6000 +bpy.context.scene.render.ffmpeg_maxrate = 9000 +bpy.context.scene.render.ffmpeg_minrate = 0 +bpy.context.scene.render.ffmpeg_buffersize = 224*8 +bpy.context.scene.render.ffmpeg_packetsize = 2048 +bpy.context.scene.render.ffmpeg_muxrate = 10080000 diff --git a/release/scripts/presets/ffmpeg/SVCD.py b/release/scripts/presets/ffmpeg/SVCD.py new file mode 100644 index 00000000000..52f938623b8 --- /dev/null +++ b/release/scripts/presets/ffmpeg/SVCD.py @@ -0,0 +1,19 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "MPEG2" +bpy.context.scene.render.resolution_x = 480 + +if is_ntsc: + bpy.context.scene.render.resolution_y = 480 + bpy.context.scene.render.ffmpeg_gopsize = 18 +else: + bpy.context.scene.render.resolution_y = 576 + bpy.context.scene.render.ffmpeg_gopsize = 15 + +bpy.context.scene.render.ffmpeg_video_bitrate = 2040 +bpy.context.scene.render.ffmpeg_maxrate = 2516 +bpy.context.scene.render.ffmpeg_minrate = 0 +bpy.context.scene.render.ffmpeg_buffersize = 224*8 +bpy.context.scene.render.ffmpeg_packetsize = 2324 +bpy.context.scene.render.ffmpeg_muxrate = 0 diff --git a/release/scripts/presets/ffmpeg/VCD.py b/release/scripts/presets/ffmpeg/VCD.py new file mode 100644 index 00000000000..876fa2d8ba6 --- /dev/null +++ b/release/scripts/presets/ffmpeg/VCD.py @@ -0,0 +1,19 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "MPEG1" +bpy.context.scene.render.resolution_x = 352 + +if is_ntsc: + bpy.context.scene.render.resolution_y = 240 + bpy.context.scene.render.ffmpeg_gopsize = 18 +else: + bpy.context.scene.render.resolution_y = 288 + bpy.context.scene.render.ffmpeg_gopsize = 15 + +bpy.context.scene.render.ffmpeg_video_bitrate = 1150 +bpy.context.scene.render.ffmpeg_maxrate = 1150 +bpy.context.scene.render.ffmpeg_minrate = 1150 +bpy.context.scene.render.ffmpeg_buffersize = 40*8 +bpy.context.scene.render.ffmpeg_packetsize = 2324 +bpy.context.scene.render.ffmpeg_muxrate = 2352 * 75 * 8 diff --git a/release/scripts/presets/ffmpeg/h264.py b/release/scripts/presets/ffmpeg/h264.py new file mode 100644 index 00000000000..74e6890a5d4 --- /dev/null +++ b/release/scripts/presets/ffmpeg/h264.py @@ -0,0 +1,17 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "H264" +bpy.context.scene.render.ffmpeg_codec = "H264" + +if is_ntsc: + bpy.context.scene.render.ffmpeg_gopsize = 18 +else: + bpy.context.scene.render.ffmpeg_gopsize = 15 + +bpy.context.scene.render.ffmpeg_video_bitrate = 6000 +bpy.context.scene.render.ffmpeg_maxrate = 9000 +bpy.context.scene.render.ffmpeg_minrate = 0 +bpy.context.scene.render.ffmpeg_buffersize = 224*8 +bpy.context.scene.render.ffmpeg_packetsize = 2048 +bpy.context.scene.render.ffmpeg_muxrate = 10080000 diff --git a/release/scripts/presets/ffmpeg/theora.py b/release/scripts/presets/ffmpeg/theora.py new file mode 100644 index 00000000000..6ce9d4ea7ed --- /dev/null +++ b/release/scripts/presets/ffmpeg/theora.py @@ -0,0 +1,17 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "OGG" +bpy.context.scene.render.ffmpeg_codec = "THEORA" + +if is_ntsc: + bpy.context.scene.render.ffmpeg_gopsize = 18 +else: + bpy.context.scene.render.ffmpeg_gopsize = 15 + +bpy.context.scene.render.ffmpeg_video_bitrate = 6000 +bpy.context.scene.render.ffmpeg_maxrate = 9000 +bpy.context.scene.render.ffmpeg_minrate = 0 +bpy.context.scene.render.ffmpeg_buffersize = 224*8 +bpy.context.scene.render.ffmpeg_packetsize = 2048 +bpy.context.scene.render.ffmpeg_muxrate = 10080000 diff --git a/release/scripts/presets/ffmpeg/xvid.py b/release/scripts/presets/ffmpeg/xvid.py new file mode 100644 index 00000000000..0c8e3989451 --- /dev/null +++ b/release/scripts/presets/ffmpeg/xvid.py @@ -0,0 +1,17 @@ +import bpy +is_ntsc = (bpy.context.scene.render.fps != 25) + +bpy.context.scene.render.ffmpeg_format = "AVI" +bpy.context.scene.render.ffmpeg_codec = "XVID" + +if is_ntsc: + bpy.context.scene.render.ffmpeg_gopsize = 18 +else: + bpy.context.scene.render.ffmpeg_gopsize = 15 + +bpy.context.scene.render.ffmpeg_video_bitrate = 6000 +bpy.context.scene.render.ffmpeg_maxrate = 9000 +bpy.context.scene.render.ffmpeg_minrate = 0 +bpy.context.scene.render.ffmpeg_buffersize = 224*8 +bpy.context.scene.render.ffmpeg_packetsize = 2048 +bpy.context.scene.render.ffmpeg_muxrate = 10080000 diff --git a/release/scripts/presets/interaction/blender.py b/release/scripts/presets/interaction/blender.py new file mode 100644 index 00000000000..63006b2008d --- /dev/null +++ b/release/scripts/presets/interaction/blender.py @@ -0,0 +1,16 @@ +# Configuration Blender +import bpy + +wm = bpy.context.manager +wm.active_keyconfig = wm.keyconfigs['Blender'] + +bpy.context.user_preferences.view.auto_depth = False +bpy.context.user_preferences.view.zoom_to_mouse = False +bpy.context.user_preferences.view.rotate_around_selection = False +bpy.context.user_preferences.edit.drag_immediately = False +bpy.context.user_preferences.edit.insertkey_xyz_to_rgb = False +bpy.context.user_preferences.inputs.select_mouse = 'RIGHT' +bpy.context.user_preferences.inputs.zoom_style = 'DOLLY' +bpy.context.user_preferences.inputs.zoom_axis = 'VERTICAL' +bpy.context.user_preferences.inputs.view_rotation = 'TRACKBALL' +bpy.context.user_preferences.inputs.invert_zoom_direction = False diff --git a/release/scripts/presets/interaction/maya.py b/release/scripts/presets/interaction/maya.py new file mode 100644 index 00000000000..31652035dff --- /dev/null +++ b/release/scripts/presets/interaction/maya.py @@ -0,0 +1,386 @@ +# Configuration Maya +import bpy + +wm = bpy.context.manager +kc = wm.add_keyconfig('Maya') + +# Map 3D View +km = kc.add_keymap('3D View', space_type='VIEW_3D', region_type='WINDOW', modal=False) + +kmi = km.items.add('view3d.manipulator', 'LEFTMOUSE', 'PRESS', any=True) +kmi.properties.release_confirm = True +kmi = km.items.add('view3d.cursor3d', 'ACTIONMOUSE', 'PRESS') +kmi = km.items.add('view3d.rotate', 'LEFTMOUSE', 'PRESS', alt=True) +kmi = km.items.add('view3d.move', 'MIDDLEMOUSE', 'PRESS', alt=True) +kmi = km.items.add('view3d.zoom', 'RIGHTMOUSE', 'PRESS', alt=True) +kmi = km.items.add('view3d.view_selected', 'NUMPAD_PERIOD', 'PRESS') +kmi = km.items.add('view3d.view_center_cursor', 'NUMPAD_PERIOD', 'PRESS', ctrl=True) +kmi = km.items.add('view3d.fly', 'F', 'PRESS', shift=True) +kmi = km.items.add('view3d.smoothview', 'TIMER1', 'ANY', any=True) +kmi = km.items.add('view3d.rotate', 'TRACKPADPAN', 'ANY', alt=True) +kmi = km.items.add('view3d.rotate', 'MOUSEROTATE', 'ANY') +kmi = km.items.add('view3d.move', 'TRACKPADPAN', 'ANY') +kmi = km.items.add('view3d.zoom', 'TRACKPADZOOM', 'ANY') +kmi = km.items.add('view3d.zoom', 'NUMPAD_PLUS', 'PRESS') +kmi.properties.delta = 1 +kmi = km.items.add('view3d.zoom', 'NUMPAD_MINUS', 'PRESS') +kmi.properties.delta = -1 +kmi = km.items.add('view3d.zoom', 'EQUAL', 'PRESS', ctrl=True) +kmi.properties.delta = 1 +kmi = km.items.add('view3d.zoom', 'MINUS', 'PRESS', ctrl=True) +kmi.properties.delta = -1 +kmi = km.items.add('view3d.zoom', 'WHEELINMOUSE', 'PRESS') +kmi.properties.delta = 1 +kmi = km.items.add('view3d.zoom', 'WHEELOUTMOUSE', 'PRESS') +kmi.properties.delta = -1 +kmi = km.items.add('view3d.view_all', 'HOME', 'PRESS') +kmi.properties.center = False +kmi = km.items.add('view3d.view_all', 'C', 'PRESS', shift=True) +kmi.properties.center = True +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_0', 'PRESS') +kmi.properties.type = 'CAMERA' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_1', 'PRESS') +kmi.properties.type = 'FRONT' +kmi = km.items.add('view3d.view_orbit', 'NUMPAD_2', 'PRESS') +kmi.properties.type = 'ORBITDOWN' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_3', 'PRESS') +kmi.properties.type = 'RIGHT' +kmi = km.items.add('view3d.view_orbit', 'NUMPAD_4', 'PRESS') +kmi.properties.type = 'ORBITLEFT' +kmi = km.items.add('view3d.view_persportho', 'NUMPAD_5', 'PRESS') +kmi = km.items.add('view3d.view_orbit', 'NUMPAD_6', 'PRESS') +kmi.properties.type = 'ORBITRIGHT' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_7', 'PRESS') +kmi.properties.type = 'TOP' +kmi = km.items.add('view3d.view_orbit', 'NUMPAD_8', 'PRESS') +kmi.properties.type = 'ORBITUP' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', ctrl=True) +kmi.properties.type = 'BACK' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', ctrl=True) +kmi.properties.type = 'LEFT' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', ctrl=True) +kmi.properties.type = 'BOTTOM' +kmi = km.items.add('view3d.view_pan', 'NUMPAD_2', 'PRESS', ctrl=True) +kmi.properties.type = 'PANDOWN' +kmi = km.items.add('view3d.view_pan', 'NUMPAD_4', 'PRESS', ctrl=True) +kmi.properties.type = 'PANLEFT' +kmi = km.items.add('view3d.view_pan', 'NUMPAD_6', 'PRESS', ctrl=True) +kmi.properties.type = 'PANRIGHT' +kmi = km.items.add('view3d.view_pan', 'NUMPAD_8', 'PRESS', ctrl=True) +kmi.properties.type = 'PANUP' +kmi = km.items.add('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', ctrl=True) +kmi.properties.type = 'PANRIGHT' +kmi = km.items.add('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True) +kmi.properties.type = 'PANLEFT' +kmi = km.items.add('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', shift=True) +kmi.properties.type = 'PANUP' +kmi = km.items.add('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', shift=True) +kmi.properties.type = 'PANDOWN' +kmi = km.items.add('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', ctrl=True, alt=True) +kmi.properties.type = 'ORBITLEFT' +kmi = km.items.add('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True, alt=True) +kmi.properties.type = 'ORBITRIGHT' +kmi = km.items.add('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', shift=True, alt=True) +kmi.properties.type = 'ORBITUP' +kmi = km.items.add('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', shift=True, alt=True) +kmi.properties.type = 'ORBITDOWN' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True) +kmi.properties.align_active = True +kmi.properties.type = 'FRONT' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True) +kmi.properties.align_active = True +kmi.properties.type = 'RIGHT' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True) +kmi.properties.align_active = True +kmi.properties.type = 'TOP' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True, ctrl=True) +kmi.properties.align_active = True +kmi.properties.type = 'BACK' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True, ctrl=True) +kmi.properties.align_active = True +kmi.properties.type = 'LEFT' +kmi = km.items.add('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True, ctrl=True) +kmi.properties.align_active = True +kmi.properties.type = 'BOTTOM' +kmi = km.items.add('view3d.localview', 'NUMPAD_SLASH', 'PRESS') +kmi = km.items.add('view3d.layers', 'ACCENT_GRAVE', 'PRESS') +kmi.properties.nr = 0 +kmi = km.items.add('view3d.layers', 'ONE', 'PRESS', any=True) +kmi.properties.nr = 1 +kmi = km.items.add('view3d.layers', 'TWO', 'PRESS', any=True) +kmi.properties.nr = 2 +kmi = km.items.add('view3d.layers', 'THREE', 'PRESS', any=True) +kmi.properties.nr = 3 +kmi = km.items.add('view3d.layers', 'FOUR', 'PRESS', any=True) +kmi.properties.nr = 4 +kmi = km.items.add('view3d.layers', 'FIVE', 'PRESS', any=True) +kmi.properties.nr = 5 +kmi = km.items.add('view3d.layers', 'SIX', 'PRESS', any=True) +kmi.properties.nr = 6 +kmi = km.items.add('view3d.layers', 'SEVEN', 'PRESS', any=True) +kmi.properties.nr = 7 +kmi = km.items.add('view3d.layers', 'EIGHT', 'PRESS', any=True) +kmi.properties.nr = 8 +kmi = km.items.add('view3d.layers', 'NINE', 'PRESS', any=True) +kmi.properties.nr = 9 +kmi = km.items.add('view3d.layers', 'ZERO', 'PRESS', any=True) +kmi.properties.nr = 10 +kmi = km.items.add('wm.context_toggle_enum', 'Z', 'PRESS') +kmi.properties.data_path = 'space_data.viewport_shading' +kmi.properties.value_1 = 'SOLID' +kmi.properties.value_2 = 'WIREFRAME' +kmi = km.items.add('wm.context_toggle_enum', 'Z', 'PRESS', alt=True) +kmi.properties.data_path = 'space_data.viewport_shading' +kmi.properties.value_1 = 'TEXTURED' +kmi.properties.value_2 = 'SOLID' +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS') +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True) +kmi.properties.extend = True +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True) +kmi.properties.center = True +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', alt=True) +kmi.properties.enumerate = True +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True) +kmi.properties.center = True +kmi.properties.extend = True +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True) +kmi.properties.center = True +kmi.properties.enumerate = True +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True) +kmi.properties.enumerate = True +kmi.properties.extend = True +kmi = km.items.add('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True) +kmi.properties.center = True +kmi.properties.enumerate = True +kmi.properties.extend = True +kmi = km.items.add('view3d.select_border', 'EVT_TWEAK_S', 'ANY') +kmi.properties.extend = False +kmi = km.items.add('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True) +kmi = km.items.add('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', shift=True, ctrl=True) +kmi.properties.deselect = True +kmi = km.items.add('view3d.select_circle', 'C', 'PRESS') +kmi = km.items.add('view3d.clip_border', 'B', 'PRESS', alt=True) +kmi = km.items.add('view3d.zoom_border', 'B', 'PRESS', shift=True) +kmi = km.items.add('view3d.render_border', 'B', 'PRESS', shift=True) +kmi = km.items.add('view3d.camera_to_view', 'NUMPAD_0', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('view3d.object_as_camera', 'NUMPAD_0', 'PRESS', ctrl=True) +kmi = km.items.add('wm.call_menu', 'S', 'PRESS', shift=True) +kmi.properties.name = 'VIEW3D_MT_snap' +kmi = km.items.add('wm.context_set_enum', 'COMMA', 'PRESS') +kmi.properties.data_path = 'space_data.pivot_point' +kmi.properties.value = 'BOUNDING_BOX_CENTER' +kmi = km.items.add('wm.context_set_enum', 'COMMA', 'PRESS', ctrl=True) +kmi.properties.data_path = 'space_data.pivot_point' +kmi.properties.value = 'MEDIAN_POINT' +kmi = km.items.add('wm.context_toggle', 'COMMA', 'PRESS', alt=True) +kmi.properties.data_path = 'space_data.pivot_point_align' +kmi = km.items.add('wm.context_toggle', 'Q', 'PRESS') +kmi.properties.data_path = 'space_data.manipulator' +kmi = km.items.add('wm.context_set_enum', 'PERIOD', 'PRESS') +kmi.properties.data_path = 'space_data.pivot_point' +kmi.properties.value = 'CURSOR' +kmi = km.items.add('wm.context_set_enum', 'PERIOD', 'PRESS', ctrl=True) +kmi.properties.data_path = 'space_data.pivot_point' +kmi.properties.value = 'INDIVIDUAL_ORIGINS' +kmi = km.items.add('wm.context_set_enum', 'PERIOD', 'PRESS', alt=True) +kmi.properties.data_path = 'space_data.pivot_point' +kmi.properties.value = 'ACTIVE_ELEMENT' +kmi = km.items.add('transform.translate', 'G', 'PRESS', shift=True) +kmi = km.items.add('transform.translate', 'EVT_TWEAK_S', 'ANY') +kmi = km.items.add('transform.rotate', 'R', 'PRESS', shift=True) +kmi = km.items.add('transform.resize', 'S', 'PRESS', shift=True) +kmi = km.items.add('transform.warp', 'W', 'PRESS', shift=True) +kmi = km.items.add('transform.tosphere', 'S', 'PRESS', shift=True, alt=True) +kmi = km.items.add('transform.shear', 'S', 'PRESS', shift=True, ctrl=True, alt=True) +kmi = km.items.add('transform.select_orientation', 'SPACE', 'PRESS', alt=True) +kmi = km.items.add('transform.create_orientation', 'SPACE', 'PRESS', ctrl=True, alt=True) +kmi.properties.use = True +kmi = km.items.add('transform.mirror', 'M', 'PRESS', ctrl=True) +kmi = km.items.add('wm.context_toggle', 'TAB', 'PRESS', shift=True) +kmi.properties.data_path = 'tool_settings.snap' +kmi = km.items.add('transform.snap_type', 'TAB', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('view3d.enable_manipulator', 'W', 'PRESS') +kmi.properties.translate = True +kmi = km.items.add('view3d.enable_manipulator', 'E', 'PRESS') +kmi.properties.rotate = True +kmi = km.items.add('view3d.enable_manipulator', 'R', 'PRESS') +kmi.properties.scale = True +kmi = km.items.add('view3d.select_border', 'EVT_TWEAK_S', 'ANY', shift=True) +kmi.properties.extend = True + +# Map Object Mode +km = kc.add_keymap('Object Mode', space_type='EMPTY', region_type='WINDOW', modal=False) + +kmi = km.items.add('wm.context_cycle_enum', 'O', 'PRESS', shift=True) +kmi.properties.data_path = 'tool_settings.proportional_editing_falloff' +kmi = km.items.add('wm.context_toggle_enum', 'O', 'PRESS') +kmi.properties.data_path = 'tool_settings.proportional_editing' +kmi.properties.value_1 = 'DISABLED' +kmi.properties.value_2 = 'ENABLED' +kmi = km.items.add('view3d.game_start', 'P', 'PRESS') +kmi = km.items.add('object.select_all', 'A', 'PRESS') +kmi = km.items.add('object.select_inverse', 'I', 'PRESS', ctrl=True) +kmi = km.items.add('object.select_linked', 'L', 'PRESS', shift=True) +kmi = km.items.add('object.select_grouped', 'G', 'PRESS', shift=True) +kmi = km.items.add('object.select_mirror', 'M', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS') +kmi.properties.direction = 'PARENT' +kmi = km.items.add('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS', shift=True) +kmi.properties.direction = 'PARENT' +kmi.properties.extend = True +kmi = km.items.add('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS') +kmi.properties.direction = 'CHILD' +kmi = km.items.add('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS', shift=True) +kmi.properties.direction = 'CHILD' +kmi.properties.extend = True +kmi = km.items.add('object.parent_set', 'P', 'PRESS', ctrl=True) +kmi = km.items.add('object.parent_no_inverse_set', 'P', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('object.parent_clear', 'P', 'PRESS', alt=True) +kmi = km.items.add('object.track_set', 'T', 'PRESS', ctrl=True) +kmi = km.items.add('object.track_clear', 'T', 'PRESS', alt=True) +kmi = km.items.add('object.constraint_add_with_targets', 'C', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('object.constraints_clear', 'C', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('object.location_clear', 'G', 'PRESS', alt=True) +kmi = km.items.add('object.rotation_clear', 'R', 'PRESS', alt=True) +kmi = km.items.add('object.scale_clear', 'S', 'PRESS', alt=True) +kmi = km.items.add('object.origin_clear', 'O', 'PRESS', alt=True) +kmi = km.items.add('object.restrictview_clear', 'H', 'PRESS', alt=True) +kmi = km.items.add('object.restrictview_set', 'H', 'PRESS') +kmi = km.items.add('object.restrictview_set', 'H', 'PRESS', shift=True) +kmi.properties.unselected = True +kmi = km.items.add('object.move_to_layer', 'M', 'PRESS') +kmi = km.items.add('object.delete', 'X', 'PRESS') +kmi = km.items.add('object.delete', 'DEL', 'PRESS') +kmi = km.items.add('wm.call_menu', 'A', 'PRESS', shift=True) +kmi.properties.name = 'INFO_MT_add' +kmi = km.items.add('object.duplicates_make_real', 'A', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('wm.call_menu', 'A', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_object_apply' +kmi = km.items.add('wm.call_menu', 'U', 'PRESS') +kmi.properties.name = 'VIEW3D_MT_make_single_user' +kmi = km.items.add('wm.call_menu', 'L', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_make_links' +kmi = km.items.add('object.duplicate_move', 'D', 'PRESS', shift=True) +kmi = km.items.add('object.duplicate_move_linked', 'D', 'PRESS', alt=True) +kmi = km.items.add('object.join', 'J', 'PRESS', ctrl=True) +kmi = km.items.add('object.convert', 'C', 'PRESS', alt=True) +kmi = km.items.add('object.proxy_make', 'P', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('object.make_local', 'L', 'PRESS') +kmi = km.items.add('anim.keyframe_insert_menu', 'I', 'PRESS') +kmi = km.items.add('anim.keyframe_delete_v3d', 'I', 'PRESS', alt=True) +kmi = km.items.add('anim.keying_set_active_set', 'I', 'PRESS', shift=True, ctrl=True, alt=True) +kmi = km.items.add('group.create', 'G', 'PRESS', ctrl=True) +kmi = km.items.add('group.objects_remove', 'G', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('group.objects_add_active', 'G', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('group.objects_remove_active', 'G', 'PRESS', shift=True, alt=True) +kmi = km.items.add('wm.call_menu', 'W', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_object_specials' +kmi = km.items.add('object.subdivision_set', 'ZERO', 'PRESS', ctrl=True) +kmi.properties.level = 0 +kmi = km.items.add('object.subdivision_set', 'ONE', 'PRESS', ctrl=True) +kmi.properties.level = 1 +kmi = km.items.add('object.subdivision_set', 'TWO', 'PRESS', ctrl=True) +kmi.properties.level = 2 +kmi = km.items.add('object.subdivision_set', 'THREE', 'PRESS', ctrl=True) +kmi.properties.level = 3 +kmi = km.items.add('object.subdivision_set', 'FOUR', 'PRESS', ctrl=True) +kmi.properties.level = 4 +kmi = km.items.add('object.subdivision_set', 'FIVE', 'PRESS', ctrl=True) +kmi.properties.level = 5 +kmi = km.items.add('object.select_all', 'SELECTMOUSE', 'CLICK') +kmi.properties.action = 'DESELECT' + +# Map Mesh +km = kc.add_keymap('Mesh', space_type='EMPTY', region_type='WINDOW', modal=False) + +kmi = km.items.add('mesh.loopcut_slide', 'R', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.loop_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('mesh.loop_select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True) +kmi.properties.extend = True +kmi = km.items.add('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True) +kmi.properties.extend = True +kmi = km.items.add('mesh.select_shortest_path', 'SELECTMOUSE', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.select_all', 'A', 'PRESS') +kmi = km.items.add('mesh.select_more', 'NUMPAD_PLUS', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.select_less', 'NUMPAD_MINUS', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.select_inverse', 'I', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.select_non_manifold', 'M', 'PRESS', shift=True, ctrl=True, alt=True) +kmi = km.items.add('mesh.select_linked', 'L', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.select_linked_pick', 'L', 'PRESS') +kmi = km.items.add('mesh.select_linked_pick', 'L', 'PRESS', shift=True) +kmi.properties.deselect = True +kmi = km.items.add('mesh.faces_select_linked_flat', 'F', 'PRESS', shift=True, ctrl=True, alt=True) +kmi.properties.sharpness = 135.0 +kmi = km.items.add('mesh.select_similar', 'G', 'PRESS', shift=True) +kmi = km.items.add('wm.call_menu', 'TAB', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_edit_mesh_selection_mode' +kmi = km.items.add('mesh.hide', 'H', 'PRESS') +kmi = km.items.add('mesh.hide', 'H', 'PRESS', shift=True) +kmi.properties.unselected = True +kmi = km.items.add('mesh.reveal', 'H', 'PRESS', alt=True) +kmi = km.items.add('mesh.normals_make_consistent', 'N', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.normals_make_consistent', 'N', 'PRESS', shift=True, ctrl=True) +kmi.properties.inside = True +kmi = km.items.add('view3d.edit_mesh_extrude_move_normal', 'E', 'PRESS', ctrl=True) +kmi = km.items.add('view3d.edit_mesh_extrude_individual_move', 'E', 'PRESS', shift=True) +kmi = km.items.add('wm.call_menu', 'E', 'PRESS', alt=True) +kmi.properties.name = 'VIEW3D_MT_edit_mesh_extrude' +kmi = km.items.add('mesh.spin', 'R', 'PRESS', alt=True) +kmi = km.items.add('mesh.fill', 'F', 'PRESS', alt=True) +kmi = km.items.add('mesh.beautify_fill', 'F', 'PRESS', shift=True, alt=True) +kmi = km.items.add('mesh.quads_convert_to_tris', 'T', 'PRESS', ctrl=True) +kmi = km.items.add('mesh.tris_convert_to_quads', 'J', 'PRESS', alt=True) +kmi = km.items.add('mesh.edge_flip', 'F', 'PRESS', shift=True, ctrl=True) +kmi = km.items.add('mesh.rip_move', 'V', 'PRESS') +kmi = km.items.add('mesh.merge', 'M', 'PRESS', alt=True) +kmi = km.items.add('transform.shrink_fatten', 'S', 'PRESS', ctrl=True, alt=True) +kmi = km.items.add('mesh.edge_face_add', 'F', 'PRESS') +kmi = km.items.add('mesh.duplicate_move', 'D', 'PRESS', shift=True) +kmi = km.items.add('wm.call_menu', 'A', 'PRESS', shift=True) +kmi.properties.name = 'INFO_MT_mesh_add' +kmi = km.items.add('mesh.separate', 'P', 'PRESS') +kmi = km.items.add('mesh.split', 'Y', 'PRESS') +kmi = km.items.add('mesh.dupli_extrude_cursor', 'ACTIONMOUSE', 'CLICK', ctrl=True) +kmi = km.items.add('mesh.delete', 'X', 'PRESS') +kmi = km.items.add('mesh.delete', 'DEL', 'PRESS') +kmi = km.items.add('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', key_modifier='K') +kmi = km.items.add('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', shift=True, key_modifier='K') +kmi.properties.type = 'MIDPOINTS' +kmi = km.items.add('object.vertex_parent_set', 'P', 'PRESS', ctrl=True) +kmi = km.items.add('wm.call_menu', 'W', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_edit_mesh_specials' +kmi = km.items.add('wm.call_menu', 'F', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_edit_mesh_faces' +kmi = km.items.add('wm.call_menu', 'E', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_edit_mesh_edges' +kmi = km.items.add('wm.call_menu', 'V', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_edit_mesh_vertices' +kmi = km.items.add('wm.call_menu', 'H', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_hook' +kmi = km.items.add('wm.call_menu', 'U', 'PRESS') +kmi.properties.name = 'VIEW3D_MT_uv_map' +kmi = km.items.add('wm.call_menu', 'G', 'PRESS', ctrl=True) +kmi.properties.name = 'VIEW3D_MT_vertex_group' +kmi = km.items.add('wm.context_cycle_enum', 'O', 'PRESS', shift=True) +kmi.properties.data_path = 'tool_settings.proportional_editing_falloff' +kmi = km.items.add('wm.context_toggle_enum', 'O', 'PRESS') +kmi.properties.data_path = 'tool_settings.proportional_editing' +kmi.properties.value_1 = 'DISABLED' +kmi.properties.value_2 = 'ENABLED' +kmi = km.items.add('wm.context_toggle_enum', 'O', 'PRESS', alt=True) +kmi.properties.data_path = 'tool_settings.proportional_editing' +kmi.properties.value_1 = 'DISABLED' +kmi.properties.value_2 = 'CONNECTED' +kmi = km.items.add('mesh.select_all', 'SELECTMOUSE', 'CLICK') +kmi.properties.action = 'DESELECT' + +wm.active_keyconfig = kc + +bpy.context.user_preferences.edit.drag_immediately = True +bpy.context.user_preferences.edit.insertkey_xyz_to_rgb = False +bpy.context.user_preferences.inputs.select_mouse = 'LEFT' +bpy.context.user_preferences.inputs.zoom_style = 'DOLLY' +bpy.context.user_preferences.inputs.zoom_axis = 'HORIZONTAL' +bpy.context.user_preferences.inputs.view_rotation = 'TURNTABLE' +bpy.context.user_preferences.inputs.invert_zoom_direction = True diff --git a/release/scripts/presets/render/DVCPRO_HD_1080p.py b/release/scripts/presets/render/DVCPRO_HD_1080p.py new file mode 100644 index 00000000000..f97b389795e --- /dev/null +++ b/release/scripts/presets/render/DVCPRO_HD_1080p.py @@ -0,0 +1,8 @@ +import bpy +bpy.context.scene.render.resolution_x = 1280 +bpy.context.scene.render.resolution_y = 1080 +bpy.context.scene.render.resolution_percentage = 100 +bpy.context.scene.render.pixel_aspect_x = 3 +bpy.context.scene.render.pixel_aspect_y = 2 +bpy.context.scene.render.fps = 24 +bpy.context.scene.render.fps_base = 1 diff --git a/release/scripts/presets/render/DVCPRO_HD_720p.py b/release/scripts/presets/render/DVCPRO_HD_720p.py new file mode 100644 index 00000000000..dbe4c9243d8 --- /dev/null +++ b/release/scripts/presets/render/DVCPRO_HD_720p.py @@ -0,0 +1,8 @@ +import bpy +bpy.context.scene.render.resolution_x = 960 +bpy.context.scene.render.resolution_y = 720 +bpy.context.scene.render.resolution_percentage = 100 +bpy.context.scene.render.pixel_aspect_x = 4 +bpy.context.scene.render.pixel_aspect_y = 3 +bpy.context.scene.render.fps = 24 +bpy.context.scene.render.fps_base = 1 diff --git a/release/scripts/presets/render/HDTV_1080p.py b/release/scripts/presets/render/HDTV_1080p.py index 7693dae9347..32b771dc4a5 100644 --- a/release/scripts/presets/render/HDTV_1080p.py +++ b/release/scripts/presets/render/HDTV_1080p.py @@ -1,3 +1,4 @@ +import bpy bpy.context.scene.render.resolution_x = 1920 bpy.context.scene.render.resolution_y = 1080 bpy.context.scene.render.resolution_percentage = 100 diff --git a/release/scripts/presets/render/HDTV_720p.py b/release/scripts/presets/render/HDTV_720p.py index ee16c1e8b33..c5c81eeb790 100644 --- a/release/scripts/presets/render/HDTV_720p.py +++ b/release/scripts/presets/render/HDTV_720p.py @@ -1,3 +1,4 @@ +import bpy bpy.context.scene.render.resolution_x = 1280 bpy.context.scene.render.resolution_y = 720 bpy.context.scene.render.resolution_percentage = 100 diff --git a/release/scripts/presets/render/HDV_1080p.py b/release/scripts/presets/render/HDV_1080p.py new file mode 100644 index 00000000000..7637648e53a --- /dev/null +++ b/release/scripts/presets/render/HDV_1080p.py @@ -0,0 +1,8 @@ +import bpy +bpy.context.scene.render.resolution_x = 1440 +bpy.context.scene.render.resolution_y = 1080 +bpy.context.scene.render.resolution_percentage = 100 +bpy.context.scene.render.pixel_aspect_x = 4 +bpy.context.scene.render.pixel_aspect_y = 3 +bpy.context.scene.render.fps = 24 +bpy.context.scene.render.fps_base = 1 diff --git a/release/scripts/presets/render/TV_NTSC_16_colon_9.py b/release/scripts/presets/render/TV_NTSC_16_colon_9.py new file mode 100644 index 00000000000..12ecaab4800 --- /dev/null +++ b/release/scripts/presets/render/TV_NTSC_16_colon_9.py @@ -0,0 +1,8 @@ +import bpy +bpy.context.scene.render.resolution_x = 720 +bpy.context.scene.render.resolution_y = 480 +bpy.context.scene.render.resolution_percentage = 100 +bpy.context.scene.render.pixel_aspect_x = 40 +bpy.context.scene.render.pixel_aspect_y = 33 +bpy.context.scene.render.fps = 30 +bpy.context.scene.render.fps_base = 1.001 diff --git a/release/scripts/presets/render/TV_NTSC.py b/release/scripts/presets/render/TV_NTSC_4_colon_3.py similarity index 82% rename from release/scripts/presets/render/TV_NTSC.py rename to release/scripts/presets/render/TV_NTSC_4_colon_3.py index cd6322fd21a..471c45b04d7 100644 --- a/release/scripts/presets/render/TV_NTSC.py +++ b/release/scripts/presets/render/TV_NTSC_4_colon_3.py @@ -1,5 +1,6 @@ +import bpy bpy.context.scene.render.resolution_x = 720 -bpy.context.scene.render.resolution_y = 480 +bpy.context.scene.render.resolution_y = 486 bpy.context.scene.render.resolution_percentage = 100 bpy.context.scene.render.pixel_aspect_x = 10 bpy.context.scene.render.pixel_aspect_y = 11 diff --git a/release/scripts/presets/render/TV_PAL_16_colon_9.py b/release/scripts/presets/render/TV_PAL_16_colon_9.py index 516209a877d..2add29e9408 100644 --- a/release/scripts/presets/render/TV_PAL_16_colon_9.py +++ b/release/scripts/presets/render/TV_PAL_16_colon_9.py @@ -1,7 +1,8 @@ +import bpy bpy.context.scene.render.resolution_x = 720 bpy.context.scene.render.resolution_y = 576 bpy.context.scene.render.resolution_percentage = 100 -bpy.context.scene.render.pixel_aspect_x = 64 -bpy.context.scene.render.pixel_aspect_y = 45 +bpy.context.scene.render.pixel_aspect_x = 16 +bpy.context.scene.render.pixel_aspect_y = 11 bpy.context.scene.render.fps = 25 bpy.context.scene.render.fps_base = 1 diff --git a/release/scripts/presets/render/TV_PAL.py b/release/scripts/presets/render/TV_PAL_4_colon_3.py similarity index 67% rename from release/scripts/presets/render/TV_PAL.py rename to release/scripts/presets/render/TV_PAL_4_colon_3.py index 4a71ad021fe..92cb794558e 100644 --- a/release/scripts/presets/render/TV_PAL.py +++ b/release/scripts/presets/render/TV_PAL_4_colon_3.py @@ -1,7 +1,8 @@ +import bpy bpy.context.scene.render.resolution_x = 720 bpy.context.scene.render.resolution_y = 576 bpy.context.scene.render.resolution_percentage = 100 -bpy.context.scene.render.pixel_aspect_x = 54 -bpy.context.scene.render.pixel_aspect_y = 51 +bpy.context.scene.render.pixel_aspect_x = 12 +bpy.context.scene.render.pixel_aspect_y = 11 bpy.context.scene.render.fps = 25 bpy.context.scene.render.fps_base = 1 diff --git a/release/scripts/presets/sss/apple.py b/release/scripts/presets/sss/apple.py index 474769cd36f..d505be2b435 100644 --- a/release/scripts/presets/sss/apple.py +++ b/release/scripts/presets/sss/apple.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 11.605, 3.884, 1.754 bpy.context.active_object.active_material.subsurface_scattering.color = 0.430, 0.210, 0.168 diff --git a/release/scripts/presets/sss/chicken.py b/release/scripts/presets/sss/chicken.py index 6253de09376..53e199455c1 100644 --- a/release/scripts/presets/sss/chicken.py +++ b/release/scripts/presets/sss/chicken.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 9.436, 3.348, 1.790 bpy.context.active_object.active_material.subsurface_scattering.color = 0.439, 0.216, 0.141 diff --git a/release/scripts/presets/sss/cream.py b/release/scripts/presets/sss/cream.py index f0a5292b85c..221739a30ab 100644 --- a/release/scripts/presets/sss/cream.py +++ b/release/scripts/presets/sss/cream.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 15.028, 4.664, 2.541 bpy.context.active_object.active_material.subsurface_scattering.color = 0.987, 0.943, 0.827 diff --git a/release/scripts/presets/sss/ketchup.py b/release/scripts/presets/sss/ketchup.py index caece1ea7ca..96d136dc271 100644 --- a/release/scripts/presets/sss/ketchup.py +++ b/release/scripts/presets/sss/ketchup.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 4.762, 0.575, 0.394 bpy.context.active_object.active_material.subsurface_scattering.color = 0.222, 0.008, 0.002 diff --git a/release/scripts/presets/sss/marble.py b/release/scripts/presets/sss/marble.py index ea894f69800..cd68fd7d26f 100644 --- a/release/scripts/presets/sss/marble.py +++ b/release/scripts/presets/sss/marble.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 8.509, 5.566, 3.951 bpy.context.active_object.active_material.subsurface_scattering.color = 0.925, 0.905, 0.884 diff --git a/release/scripts/presets/sss/potato.py b/release/scripts/presets/sss/potato.py index 89407dff427..7a6c25db833 100644 --- a/release/scripts/presets/sss/potato.py +++ b/release/scripts/presets/sss/potato.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 14.266, 7.228, 2.036 bpy.context.active_object.active_material.subsurface_scattering.color = 0.855, 0.740, 0.292 diff --git a/release/scripts/presets/sss/skim_milk.py b/release/scripts/presets/sss/skim_milk.py index 2e5b19d4f53..5be37b820da 100644 --- a/release/scripts/presets/sss/skim_milk.py +++ b/release/scripts/presets/sss/skim_milk.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 18.424, 10.443, 3.502 bpy.context.active_object.active_material.subsurface_scattering.color = 0.889, 0.888, 0.796 diff --git a/release/scripts/presets/sss/skin1.py b/release/scripts/presets/sss/skin1.py index 42fb1fac43a..76dc64f61f9 100644 --- a/release/scripts/presets/sss/skin1.py +++ b/release/scripts/presets/sss/skin1.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 3.673, 1.367, 0.683 bpy.context.active_object.active_material.subsurface_scattering.color = 0.574, 0.313, 0.174 diff --git a/release/scripts/presets/sss/skin2.py b/release/scripts/presets/sss/skin2.py index 52b649ecd8f..6a72a782638 100644 --- a/release/scripts/presets/sss/skin2.py +++ b/release/scripts/presets/sss/skin2.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 4.821, 1.694, 1.090 bpy.context.active_object.active_material.subsurface_scattering.color = 0.749, 0.571, 0.467 diff --git a/release/scripts/presets/sss/whole_milk.py b/release/scripts/presets/sss/whole_milk.py index 4cb6ccf3dcf..59aaa135933 100644 --- a/release/scripts/presets/sss/whole_milk.py +++ b/release/scripts/presets/sss/whole_milk.py @@ -1,2 +1,3 @@ +import bpy bpy.context.active_object.active_material.subsurface_scattering.radius = 10.899, 6.575, 2.508 bpy.context.active_object.active_material.subsurface_scattering.color = 0.947, 0.931, 0.852 diff --git a/release/scripts/presets/sunsky/classic.py b/release/scripts/presets/sunsky/classic.py index 9ee35d68dad..4394dcce242 100644 --- a/release/scripts/presets/sunsky/classic.py +++ b/release/scripts/presets/sunsky/classic.py @@ -1,3 +1,4 @@ +import bpy bpy.context.object.data.sky.atmosphere_turbidity = 4.0 bpy.context.object.data.sky.sky_blend_type = 'ADD' bpy.context.object.data.sky.sky_blend = 1.0 diff --git a/release/scripts/presets/sunsky/desert.py b/release/scripts/presets/sunsky/desert.py index 26ed4527746..f68ea23845b 100644 --- a/release/scripts/presets/sunsky/desert.py +++ b/release/scripts/presets/sunsky/desert.py @@ -1,3 +1,4 @@ +import bpy bpy.context.object.data.sky.atmosphere_turbidity = 6.0 bpy.context.object.data.sky.sky_blend_type = 'ADD' bpy.context.object.data.sky.sky_blend = 1.0 diff --git a/release/scripts/presets/sunsky/mountain.py b/release/scripts/presets/sunsky/mountain.py index e35d3944042..9b81ffd4399 100644 --- a/release/scripts/presets/sunsky/mountain.py +++ b/release/scripts/presets/sunsky/mountain.py @@ -1,3 +1,4 @@ +import bpy bpy.context.object.data.sky.atmosphere_turbidity = 2.00000023842 bpy.context.object.data.sky.sky_blend_type = 'ADD' bpy.context.object.data.sky.sky_blend = 1.0 diff --git a/release/scripts/templates/gamelogic.py b/release/scripts/templates/gamelogic.py index b4eac81b492..b31d5d95987 100644 --- a/release/scripts/templates/gamelogic.py +++ b/release/scripts/templates/gamelogic.py @@ -7,7 +7,7 @@ # import GameKeys # support for Vector(), Matrix() types and advanced functions like ScaleMatrix(...) and RotationMatrix(...) -# import Mathutils +# import mathutils # for functions like getWindowWidth(), getWindowHeight() # import Rasterizer diff --git a/release/scripts/templates/operator.py b/release/scripts/templates/operator.py index 23d75607ba3..e20b92c9b6a 100644 --- a/release/scripts/templates/operator.py +++ b/release/scripts/templates/operator.py @@ -1,7 +1,6 @@ - import bpy -def write_some_data(context, path, use_some_setting): +def write_some_data(context, filepath, use_some_setting): print("running write_some_data...") pass @@ -16,7 +15,7 @@ class ExportSomeData(bpy.types.Operator): # to the class instance from the operator settings before calling. # TODO, add better example props - path = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen= 1024, default= "") + filepath = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen= 1024, default= "") use_setting = BoolProperty(name="Example Boolean", description="Example Tooltip", default= True) type = bpy.props.EnumProperty(items=(('OPT_A', "First Option", "Description one"), ('OPT_B', "Second Option", "Description two.")), @@ -30,10 +29,10 @@ class ExportSomeData(bpy.types.Operator): def execute(self, context): # # Bug, currently isnt working - #if not self.is_property_set("path"): + #if not self.is_property_set("filepath"): # raise Exception("filename not set") - write_some_data(self.properties.path, context, self.properties.use_setting) + write_some_data(self.properties.filepath, context, self.properties.use_setting) return {'FINISHED'} @@ -63,4 +62,4 @@ menu_func = lambda self, context: self.layout.operator("export.some_data", text= bpy.types.INFO_MT_file_export.append(menu_func) if __name__ == "__main__": - bpy.ops.export.some_data('INVOKE_DEFAULT', path="/tmp/test.ply") + bpy.ops.export.some_data('INVOKE_DEFAULT', filepath="/tmp/test.ply") diff --git a/release/scripts/templates/operator_modal.py b/release/scripts/templates/operator_modal.py index b2839efabe4..e029d91a7fa 100644 --- a/release/scripts/templates/operator_modal.py +++ b/release/scripts/templates/operator_modal.py @@ -1,3 +1,4 @@ +import bpy from bpy.props import * class ModalOperator(bpy.types.Operator): diff --git a/release/scripts/templates/operator_modal_draw.py b/release/scripts/templates/operator_modal_draw.py index 1f0d7a8504f..1f24672346b 100644 --- a/release/scripts/templates/operator_modal_draw.py +++ b/release/scripts/templates/operator_modal_draw.py @@ -1,13 +1,16 @@ +import bpy import bgl import blf def draw_callback_px(self, context): print("mouse points", len(self.mouse_path)) + font_id = 0 # XXX, need to find out how best to get this. + # draw some text - blf.position(15, 30, 0) - blf.size(20, 72) - blf.draw("Hello Word " + str(len(self.mouse_path))) + blf.position(font_id, 15, 30, 0) + blf.size(font_id, 20, 72) + blf.draw(font_id, "Hello Word " + str(len(self.mouse_path))) # 50% alpha, 2 pixel width line bgl.glEnable(bgl.GL_BLEND) @@ -20,7 +23,7 @@ def draw_callback_px(self, context): bgl.glEnd() - # restore opengl defaults + # restore opengl defaults bgl.glLineWidth(1) bgl.glDisable(bgl.GL_BLEND) bgl.glColor4f(0.0, 0.0, 0.0, 1.0) @@ -50,7 +53,7 @@ class ModalDrawOperator(bpy.types.Operator): def invoke(self, context, event): if context.area.type == 'VIEW_3D': context.manager.add_modal_handler(self) - + # Add the region OpenGL drawing callback # draw in view space with 'POST_VIEW' and 'PRE_VIEW' self._handle = context.region.callback_add(draw_callback_px, (self, context), 'POST_PIXEL') @@ -72,4 +75,4 @@ def unregister(): if __name__ == "__main__": - register() \ No newline at end of file + register() diff --git a/release/scripts/templates/operator_modal_view3d.py b/release/scripts/templates/operator_modal_view3d.py new file mode 100644 index 00000000000..da019c2b653 --- /dev/null +++ b/release/scripts/templates/operator_modal_view3d.py @@ -0,0 +1,56 @@ +import bpy +from mathutils import Vector +from bpy.props import FloatVectorProperty + +class ViewOperator(bpy.types.Operator): + '''Translate the view using mouse events.''' + bl_idname = "view3d.modal_operator" + bl_label = "Simple View Operator" + + offset = FloatVectorProperty(name="Offset", size=3) + + + def execute(self, context): + v3d = context.space_data + rv3d = v3d.region_3d + + rv3d.view_location = self._initial_location + Vector(self.properties.offset) + + def modal(self, context, event): + v3d = context.space_data + rv3d = v3d.region_3d + + if event.type == 'MOUSEMOVE': + self.properties.offset = (self._initial_mouse - Vector((event.mouse_x, event.mouse_y, 0.0))) * 0.02 + self.execute(context) + + elif event.type == 'LEFTMOUSE': + return {'FINISHED'} + + elif event.type in ('RIGHTMOUSE', 'ESC'): + rv3d.view_location = self._initial_location + return {'CANCELLED'} + + return {'RUNNING_MODAL'} + + def invoke(self, context, event): + + if context.space_data.type == 'VIEW_3D': + v3d = context.space_data + rv3d = v3d.region_3d + + context.manager.add_modal_handler(self) + + if rv3d.view_perspective == 'CAMERA': + rv3d.view_perspective = 'PERSP' + + self._initial_mouse = Vector((event.mouse_x, event.mouse_y, 0.0)) + self._initial_location = rv3d.view_location.copy() + + return {'RUNNING_MODAL'} + else: + self.report({'WARNING'}, "Active space must be a View3d") + return {'CANCELLED'} + + +bpy.types.register(ViewOperator) diff --git a/release/scripts/templates/operator_simple.py b/release/scripts/templates/operator_simple.py index c62d3720d96..985a628c2d0 100644 --- a/release/scripts/templates/operator_simple.py +++ b/release/scripts/templates/operator_simple.py @@ -1,3 +1,4 @@ +import bpy def main(context): for ob in context.scene.objects: @@ -15,7 +16,11 @@ class SimpleOperator(bpy.types.Operator): main(context) return {'FINISHED'} -bpy.types.register(SimpleOperator) +def register(): + bpy.types.register(SimpleOperator) + +def unregister(): + bpy.types.unregister(SimpleOperator) if __name__ == "__main__": - bpy.ops.object.simple_operator() + register() diff --git a/release/scripts/templates/operator_uv.py b/release/scripts/templates/operator_uv.py index 36d8333d49d..1003bd6c58b 100644 --- a/release/scripts/templates/operator_uv.py +++ b/release/scripts/templates/operator_uv.py @@ -1,3 +1,4 @@ +import bpy def main(context): obj = context.active_object diff --git a/release/scripts/ui/properties_animviz.py b/release/scripts/ui/properties_animviz.py index 71b49cea2f2..9eb046cc2c8 100644 --- a/release/scripts/ui/properties_animviz.py +++ b/release/scripts/ui/properties_animviz.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check ################################################ # Generic Panels (Independent of DataType) @@ -49,8 +49,8 @@ class MotionPathButtonsPanel(bpy.types.Panel): sub.prop(mps, "before_current", text="Before") sub.prop(mps, "after_current", text="After") elif (mps.type == 'RANGE'): - sub.prop(mps, "start_frame", text="Start") - sub.prop(mps, "end_frame", text="End") + sub.prop(mps, "frame_start", text="Start") + sub.prop(mps, "frame_end", text="End") sub.prop(mps, "frame_step", text="Step") if bones: @@ -61,6 +61,8 @@ class MotionPathButtonsPanel(bpy.types.Panel): col.label(text="Display:") col.prop(mps, "show_frame_numbers", text="Frame Numbers") col.prop(mps, "highlight_keyframes", text="Keyframes") + if bones: + col.prop(mps, "search_all_action_keyframes", text="+ Non-Grouped Keyframes") col.prop(mps, "show_keyframe_numbers", text="Keyframe Numbers") @@ -88,8 +90,8 @@ class OnionSkinButtonsPanel(bpy.types.Panel): sub = col.column(align=True) if arm.ghost_type == 'RANGE': - sub.prop(arm, "ghost_start_frame", text="Start") - sub.prop(arm, "ghost_end_frame", text="End") + sub.prop(arm, "ghost_frame_start", text="Start") + sub.prop(arm, "ghost_frame_end", text="End") sub.prop(arm, "ghost_size", text="Step") elif arm.ghost_type == 'CURRENT_FRAME': sub.prop(arm, "ghost_step", text="Range") @@ -103,6 +105,7 @@ class OnionSkinButtonsPanel(bpy.types.Panel): ################################################ # Specific Panels for DataTypes + class OBJECT_PT_motion_paths(MotionPathButtonsPanel): #bl_label = "Object Motion Paths" bl_context = "object" @@ -129,13 +132,14 @@ class OBJECT_PT_motion_paths(MotionPathButtonsPanel): col = split.column() col.operator("object.paths_clear", text="Clear Paths") + class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): #bl_label = "Object Onion Skinning" bl_context = "object" def poll(self, context): return (context.object) - + def draw(self, context): layout = self.layout @@ -144,6 +148,7 @@ class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): self.draw_settings(context, ob.animation_visualisation, wide_ui) + class DATA_PT_motion_paths(MotionPathButtonsPanel): #bl_label = "Bones Motion Paths" bl_context = "data" @@ -171,6 +176,7 @@ class DATA_PT_motion_paths(MotionPathButtonsPanel): col = split.column() col.operator("pose.paths_clear", text="Clear Paths") + class DATA_PT_onion_skinning(OnionSkinButtonsPanel): #bl_label = "Bones Onion Skinning" bl_context = "data" @@ -187,17 +193,18 @@ class DATA_PT_onion_skinning(OnionSkinButtonsPanel): self.draw_settings(context, ob.pose.animation_visualisation, wide_ui, bones=True) -# NOTE: +# NOTE: # The specialised panel types defined here (i.e. OBJECT_PT_*, etc.) # aren't registered here, but are rather imported to (and registered) # in the files defining the contexts where they reside. Otherwise, # these panels appear at the top of the lists by default. # # However, we keep these empty register funcs here just in case -# something will need them again one day, and also to make +# something will need them again one day, and also to make # it easier to maintain these scripts. classes = [] + def register(): register = bpy.types.register for cls in classes: diff --git a/release/scripts/ui/properties_data_armature.py b/release/scripts/ui/properties_data_armature.py index b7864618de6..38903cc1f27 100644 --- a/release/scripts/ui/properties_data_armature.py +++ b/release/scripts/ui/properties_data_armature.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class DataButtonsPanel(bpy.types.Panel): @@ -69,7 +69,10 @@ class DATA_PT_skeleton(DataButtonsPanel): arm = context.armature wide_ui = context.region.width > narrowui - layout.prop(arm, "pose_position", expand=True) + if wide_ui: + layout.prop(arm, "pose_position", expand=True) + else: + layout.prop(arm, "pose_position", text="") split = layout.split() @@ -79,13 +82,17 @@ class DATA_PT_skeleton(DataButtonsPanel): col.label(text="Protected Layers:") col.prop(arm, "layer_protection", text="") - if wide_ui: - col = split.column() col.label(text="Deform:") + + split = layout.split() + + col = split.column() col.prop(arm, "deform_vertexgroups", text="Vertex Groups") col.prop(arm, "deform_envelope", text="Envelopes") + + if wide_ui: + col = split.column() col.prop(arm, "deform_quaternion", text="Quaternion") - col.prop(arm, "deform_bbone_rest", text="B-Bones Rest") class DATA_PT_display(DataButtonsPanel): @@ -114,7 +121,6 @@ class DATA_PT_display(DataButtonsPanel): col = split.column() col.prop(arm, "draw_group_colors", text="Colors") col.prop(arm, "delay_deform", text="Delay Refresh") - col.prop(ob, "x_ray", text="X-Ray (Object)") class DATA_PT_bone_groups(DataButtonsPanel): @@ -154,13 +160,16 @@ class DATA_PT_bone_groups(DataButtonsPanel): col = split.column() col.template_triColorSet(group, "colors") - row = layout.row(align=True) + row = layout.row() row.active = (ob.proxy is None) - row.operator("pose.group_assign", text="Assign") - row.operator("pose.group_unassign", text="Remove") #row.operator("pose.bone_group_remove_from", text="Remove") - #row.operator("object.bone_group_select", text="Select") - #row.operator("object.bone_group_deselect", text="Deselect") + sub = row.row(align=True) + sub.operator("pose.group_assign", text="Assign") + sub.operator("pose.group_unassign", text="Remove") #row.operator("pose.bone_group_remove_from", text="Remove") + + sub = row.row(align=True) + sub.operator("pose.group_select", text="Select") + sub.operator("pose.group_deselect", text="Deselect") # TODO: this panel will soon be depreceated too @@ -186,8 +195,8 @@ class DATA_PT_ghost(DataButtonsPanel): sub = col.column(align=True) if arm.ghost_type == 'RANGE': - sub.prop(arm, "ghost_start_frame", text="Start") - sub.prop(arm, "ghost_end_frame", text="End") + sub.prop(arm, "ghost_frame_start", text="Start") + sub.prop(arm, "ghost_frame_end", text="End") sub.prop(arm, "ghost_size", text="Step") elif arm.ghost_type == 'CURRENT_FRAME': sub.prop(arm, "ghost_step", text="Range") @@ -253,7 +262,7 @@ class DATA_PT_iksolver_itasc(DataButtonsPanel): row.prop(itasc, "dampmax", text="Damp", slider=True) row.prop(itasc, "dampeps", text="Eps", slider=True) -# import generic panels from other files +# import generic panels from other files from properties_animviz import DATA_PT_motion_paths, DATA_PT_onion_skinning classes = [ diff --git a/release/scripts/ui/properties_data_armature_rigify.py b/release/scripts/ui/properties_data_armature_rigify.py index 99df79ed970..43021858f9f 100644 --- a/release/scripts/ui/properties_data_armature_rigify.py +++ b/release/scripts/ui/properties_data_armature_rigify.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class PoseTemplateSettings(bpy.types.IDPropertyGroup): @@ -29,28 +29,6 @@ class PoseTemplateSettings(bpy.types.IDPropertyGroup): class PoseTemplate(bpy.types.IDPropertyGroup): pass -PoseTemplate.StringProperty(attr="name", - name="Name of the slave", - description="", - maxlen=64, - default="") - - -PoseTemplateSettings.CollectionProperty(attr="templates", type=PoseTemplate, name="Templates", description="") -PoseTemplateSettings.IntProperty(attr="active_template_index", - name="Index of the active slave", - description="", - default=-1, - min=-1, - max=65535) - -PoseTemplateSettings.BoolProperty(attr="generate_def_rig", - name="Create Deform Rig", - description="Create a copy of the metarig, constrainted by the generated rig", - default=False) - -bpy.types.Scene.PointerProperty(attr="pose_templates", type=PoseTemplateSettings, name="Pose Templates", description="Pose Template Settings") - def metarig_templates(): import rigify @@ -234,7 +212,7 @@ class Graph(bpy.types.Operator): import bpy reload(graphviz_export) obj = bpy.context.object - path = os.path.splitext(bpy.data.filename)[0] + "-" + bpy.utils.clean_name(obj.name) + path = os.path.splitext(bpy.data.filepath)[0] + "-" + bpy.utils.clean_name(obj.name) path_dot = path + ".dot" path_png = path + ".png" saved = graphviz_export.graph_armature(bpy.context.object, path_dot, CONSTRAINTS=False, DRIVERS=False) @@ -254,14 +232,14 @@ class AsScript(bpy.types.Operator): bl_label = "Write Metarig to Script" bl_options = {'REGISTER', 'UNDO'} - path = StringProperty(name="File Path", description="File path used for exporting the Armature file", maxlen=1024, default="") + filepath = StringProperty(name="File Path", description="File path used for exporting the Armature file", maxlen=1024, default="") def execute(self, context): import rigify_utils reload(rigify_utils) obj = context.object code = rigify_utils.write_meta_rig(obj) - path = self.properties.path + path = self.properties.filepath file = open(path, "w") file.write(code) file.close() @@ -271,7 +249,7 @@ class AsScript(bpy.types.Operator): def invoke(self, context, event): import os obj = context.object - self.properties.path = os.path.splitext(bpy.data.filename)[0] + "-" + bpy.utils.clean_name(obj.name) + ".py" + self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + "-" + bpy.utils.clean_name(obj.name) + ".py" wm = context.manager wm.add_fileselect(self) return {'RUNNING_MODAL'} @@ -356,6 +334,28 @@ def register(): for cls in classes: register(cls) + PoseTemplate.StringProperty(attr="name", + name="Name of the slave", + description="", + maxlen=64, + default="") + + + PoseTemplateSettings.CollectionProperty(attr="templates", type=PoseTemplate, name="Templates", description="") + PoseTemplateSettings.IntProperty(attr="active_template_index", + name="Index of the active slave", + description="", + default=-1, + min=-1, + max=65535) + + PoseTemplateSettings.BoolProperty(attr="generate_def_rig", + name="Create Deform Rig", + description="Create a copy of the metarig, constrainted by the generated rig", + default=False) + + bpy.types.Scene.PointerProperty(attr="pose_templates", type=PoseTemplateSettings, name="Pose Templates", description="Pose Template Settings") + space_info.INFO_MT_armature_add.append(menu_func) diff --git a/release/scripts/ui/properties_data_bone.py b/release/scripts/ui/properties_data_bone.py index a6bac3e6aaa..b6b638ef380 100644 --- a/release/scripts/ui/properties_data_bone.py +++ b/release/scripts/ui/properties_data_bone.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class BoneButtonsPanel(bpy.types.Panel): @@ -257,6 +257,9 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel): pchan = ob.pose.bones[bone.name] wide_ui = context.region.width > narrowui + row = layout.row() + row.prop(ob.pose, "ik_solver") + split = layout.split(percentage=0.25) split.prop(pchan, "ik_dof_x", text="X") split.active = pchan.has_ik diff --git a/release/scripts/ui/properties_data_camera.py b/release/scripts/ui/properties_data_camera.py index be0a4f84145..3abd460c427 100644 --- a/release/scripts/ui/properties_data_camera.py +++ b/release/scripts/ui/properties_data_camera.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class DataButtonsPanel(bpy.types.Panel): @@ -29,12 +29,14 @@ class DataButtonsPanel(bpy.types.Panel): bl_context = "data" def poll(self, context): - return context.camera + engine = context.scene.render.engine + return context.camera and (engine in self.COMPAT_ENGINES) class DATA_PT_context_camera(DataButtonsPanel): bl_label = "" bl_show_header = False + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -61,10 +63,12 @@ class DATA_PT_context_camera(DataButtonsPanel): class DATA_PT_custom_props_camera(DataButtonsPanel, PropertyPanel): _context_path = "object.data" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} class DATA_PT_camera(DataButtonsPanel): bl_label = "Lens" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -125,6 +129,7 @@ class DATA_PT_camera(DataButtonsPanel): class DATA_PT_camera_display(DataButtonsPanel): bl_label = "Display" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout diff --git a/release/scripts/ui/properties_data_curve.py b/release/scripts/ui/properties_data_curve.py index 9848e423665..fd836f5e5d4 100644 --- a/release/scripts/ui/properties_data_curve.py +++ b/release/scripts/ui/properties_data_curve.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class DataButtonsPanel(bpy.types.Panel): @@ -44,7 +44,7 @@ class DataButtonsPanelActive(DataButtonsPanel): def poll(self, context): curve = context.curve - return (curve and curve.active_spline) + return (curve and type(curve) is not bpy.types.TextCurve and curve.splines.active) class DATA_PT_context_curve(DataButtonsPanel): @@ -120,13 +120,13 @@ class DATA_PT_shape_curve(DataButtonsPanel): if is_curve or is_text: sub = col.column() - sub.active = (curve.dimensions == '2D') sub.label(text="Caps:") sub.prop(curve, "front") sub.prop(curve, "back") + sub.prop(curve, "use_deform_fill") col.label(text="Textures:") -# col.prop(curve, "uv_orco") + col.prop(curve, "map_along_length") col.prop(curve, "auto_texspace") @@ -204,7 +204,7 @@ class DATA_PT_active_spline(DataButtonsPanelActive): ob = context.object curve = context.curve - act_spline = curve.active_spline + act_spline = curve.splines.active is_surf = (ob.type == 'SURFACE') is_poly = (act_spline.type == 'POLY') @@ -308,10 +308,11 @@ class DATA_PT_font(DataButtonsPanel): split = layout.split() - col = split.column(align=True) - col.label(text="Underline:") - col.prop(text, "ul_position", text="Position") - col.prop(text, "ul_height", text="Thickness") + col = split.column() + colsub = col.column(align=True) + colsub.label(text="Underline:") + colsub.prop(text, "ul_position", text="Position") + colsub.prop(text, "ul_height", text="Thickness") if wide_ui: col = split.column() @@ -319,8 +320,13 @@ class DATA_PT_font(DataButtonsPanel): col.prop(char, "bold") col.prop(char, "italic") col.prop(char, "underline") -# col.prop(char, "style") -# col.prop(char, "wrap") + + split = layout.split() + col = split.column() + col.prop(text, "small_caps_scale", text="Small Caps") + + col = split.column() + col.prop(char, "use_small_caps") class DATA_PT_paragraph(DataButtonsPanel): @@ -368,20 +374,35 @@ class DATA_PT_textboxes(DataButtonsPanel): text = context.curve wide_ui = context.region.width > narrowui - for box in text.textboxes: - split = layout.box().split() + split = layout.split() + col = split.column() + col.operator("font.textbox_add", icon='ZOOMIN') + if wide_ui: + col = split.column() + + for i, box in enumerate(text.textboxes): + + boxy = layout.box() + + row = boxy.row() + + split = row.split() col = split.column(align=True) + col.label(text="Dimensions:") col.prop(box, "width", text="Width") col.prop(box, "height", text="Height") if wide_ui: col = split.column(align=True) + col.label(text="Offset:") col.prop(box, "x", text="X") col.prop(box, "y", text="Y") + row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i + classes = [ DATA_PT_context_curve, diff --git a/release/scripts/ui/properties_data_empty.py b/release/scripts/ui/properties_data_empty.py index a0999fb9d4a..577e32ed840 100644 --- a/release/scripts/ui/properties_data_empty.py +++ b/release/scripts/ui/properties_data_empty.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class DataButtonsPanel(bpy.types.Panel): diff --git a/release/scripts/ui/properties_data_lamp.py b/release/scripts/ui/properties_data_lamp.py index 9a99959a610..14493301b1e 100644 --- a/release/scripts/ui/properties_data_lamp.py +++ b/release/scripts/ui/properties_data_lamp.py @@ -20,13 +20,14 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class LAMP_MT_sunsky_presets(bpy.types.Menu): - bl_label = "Render Presets" + bl_label = "Sun & Sky Presets" preset_subdir = "sunsky" - preset_operator = "script.python_file_run" + preset_operator = "script.execute_preset" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} draw = bpy.types.Menu.draw_preset @@ -36,11 +37,13 @@ class DataButtonsPanel(bpy.types.Panel): bl_context = "data" def poll(self, context): - return context.lamp + engine = context.scene.render.engine + return context.lamp and (engine in self.COMPAT_ENGINES) class DATA_PT_preview(DataButtonsPanel): bl_label = "Preview" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): self.layout.template_preview(context.lamp) @@ -49,6 +52,7 @@ class DATA_PT_preview(DataButtonsPanel): class DATA_PT_context_lamp(DataButtonsPanel): bl_label = "" bl_show_header = False + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -75,10 +79,12 @@ class DATA_PT_context_lamp(DataButtonsPanel): class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel): _context_path = "object.data" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} class DATA_PT_lamp(DataButtonsPanel): bl_label = "Lamp" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -125,10 +131,12 @@ class DATA_PT_lamp(DataButtonsPanel): class DATA_PT_sunsky(DataButtonsPanel): bl_label = "Sky & Atmosphere" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): lamp = context.lamp - return (lamp and lamp.type == 'SUN') + engine = context.scene.render.engine + return (lamp and lamp.type == 'SUN') and (engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -138,8 +146,8 @@ class DATA_PT_sunsky(DataButtonsPanel): row = layout.row(align=True) row.prop(lamp, "use_sky") - row.menu("LAMP_MT_sunsky_presets", text="Presets") - row.operator("lamp.sunsky_preset_add", text="Add") + row.menu("LAMP_MT_sunsky_presets", text=bpy.types.LAMP_MT_sunsky_presets.bl_label) + row.operator("lamp.sunsky_preset_add", text="", icon="ZOOMIN") row = layout.row() row.active = lamp.use_sky or lamp.use_atmosphere @@ -196,10 +204,12 @@ class DATA_PT_sunsky(DataButtonsPanel): class DATA_PT_shadow(DataButtonsPanel): bl_label = "Shadow" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): lamp = context.lamp - return (lamp and lamp.type in ('POINT', 'SUN', 'SPOT', 'AREA')) + engine = context.scene.render.engine + return (lamp and lamp.type in ('POINT', 'SUN', 'SPOT', 'AREA')) and (engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -319,10 +329,12 @@ class DATA_PT_shadow(DataButtonsPanel): class DATA_PT_area(DataButtonsPanel): bl_label = "Area Shape" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): lamp = context.lamp - return (lamp and lamp.type == 'AREA') + engine = context.scene.render.engine + return (lamp and lamp.type == 'AREA') and (engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -344,10 +356,12 @@ class DATA_PT_area(DataButtonsPanel): class DATA_PT_spot(DataButtonsPanel): bl_label = "Spot Shape" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): lamp = context.lamp - return (lamp and lamp.type == 'SPOT') + engine = context.scene.render.engine + return (lamp and lamp.type == 'SPOT') and (engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -379,11 +393,13 @@ class DATA_PT_spot(DataButtonsPanel): class DATA_PT_falloff_curve(DataButtonsPanel): bl_label = "Falloff Curve" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): lamp = context.lamp + engine = context.scene.render.engine - return (lamp and lamp.type in ('POINT', 'SPOT') and lamp.falloff_type == 'CUSTOM_CURVE') + return (lamp and lamp.type in ('POINT', 'SPOT') and lamp.falloff_type == 'CUSTOM_CURVE') and (engine in self.COMPAT_ENGINES) def draw(self, context): lamp = context.lamp diff --git a/release/scripts/ui/properties_data_lattice.py b/release/scripts/ui/properties_data_lattice.py index 0c1f9d8001c..2aa719437a7 100644 --- a/release/scripts/ui/properties_data_lattice.py +++ b/release/scripts/ui/properties_data_lattice.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class DataButtonsPanel(bpy.types.Panel): @@ -93,7 +93,9 @@ class DATA_PT_lattice(DataButtonsPanel): col = split.column() col.prop(lat, "interpolation_type_w", text="") - layout.prop(lat, "outside") + row = layout.row() + row.prop(lat, "outside") + row.prop_object(lat, "vertex_group", context.object, "vertex_groups", text="") classes = [ diff --git a/release/scripts/ui/properties_data_mesh.py b/release/scripts/ui/properties_data_mesh.py index d48d2ec8046..44d3d19e793 100644 --- a/release/scripts/ui/properties_data_mesh.py +++ b/release/scripts/ui/properties_data_mesh.py @@ -20,11 +20,12 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class MESH_MT_vertex_group_specials(bpy.types.Menu): bl_label = "Vertex Group Specials" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -38,6 +39,7 @@ class MESH_MT_vertex_group_specials(bpy.types.Menu): class MESH_MT_shape_key_specials(bpy.types.Menu): bl_label = "Shape Key Specials" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -53,12 +55,14 @@ class DataButtonsPanel(bpy.types.Panel): bl_context = "data" def poll(self, context): - return context.mesh + engine = context.scene.render.engine + return context.mesh and (engine in self.COMPAT_ENGINES) class DATA_PT_context_mesh(DataButtonsPanel): bl_label = "" bl_show_header = False + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -85,10 +89,12 @@ class DATA_PT_context_mesh(DataButtonsPanel): class DATA_PT_custom_props_mesh(DataButtonsPanel, PropertyPanel): _context_path = "object.data" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} class DATA_PT_normals(DataButtonsPanel): bl_label = "Normals" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -114,6 +120,7 @@ class DATA_PT_normals(DataButtonsPanel): class DATA_PT_settings(DataButtonsPanel): bl_label = "Settings" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -125,9 +132,11 @@ class DATA_PT_settings(DataButtonsPanel): class DATA_PT_vertex_groups(DataButtonsPanel): bl_label = "Vertex Groups" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): - return (context.object and context.object.type in ('MESH', 'LATTICE')) + engine = context.scene.render.engine + return (context.object and context.object.type in ('MESH', 'LATTICE') and (engine in self.COMPAT_ENGINES)) def draw(self, context): layout = self.layout @@ -146,6 +155,9 @@ class DATA_PT_vertex_groups(DataButtonsPanel): col.operator("object.vertex_group_add", icon='ZOOMIN', text="") col.operator("object.vertex_group_remove", icon='ZOOMOUT', text="") col.menu("MESH_MT_vertex_group_specials", icon='DOWNARROW_HLT', text="") + if group: + col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP' + col.operator("object.vertex_group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' if group: row = layout.row() @@ -167,9 +179,11 @@ class DATA_PT_vertex_groups(DataButtonsPanel): class DATA_PT_shape_keys(DataButtonsPanel): bl_label = "Shape Keys" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): - return (context.object and context.object.type in ('MESH', 'LATTICE', 'CURVE', 'SURFACE')) + engine = context.scene.render.engine + return (context.object and context.object.type in ('MESH', 'LATTICE', 'CURVE', 'SURFACE') and (engine in self.COMPAT_ENGINES)) def draw(self, context): layout = self.layout @@ -263,6 +277,7 @@ class DATA_PT_shape_keys(DataButtonsPanel): class DATA_PT_uv_texture(DataButtonsPanel): bl_label = "UV Texture" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -283,8 +298,56 @@ class DATA_PT_uv_texture(DataButtonsPanel): layout.prop(lay, "name") +class DATA_PT_texface(DataButtonsPanel): + bl_label = "Texture Face" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def poll(self, context): + ob = context.active_object + rd = context.scene.render + + return (context.mode == 'EDIT_MESH') and (rd.engine == 'BLENDER_GAME') and ob and ob.type == 'MESH' + + def draw(self, context): + layout = self.layout + col = layout.column() + + wide_ui = context.region.width > narrowui + me = context.mesh + + tf = me.faces.active_tface + + if tf: + split = layout.split() + col = split.column() + + col.prop(tf, "tex") + col.prop(tf, "light") + col.prop(tf, "invisible") + col.prop(tf, "collision") + + col.prop(tf, "shared") + col.prop(tf, "twoside") + col.prop(tf, "object_color") + + if wide_ui: + col = split.column() + + col.prop(tf, "halo") + col.prop(tf, "billboard") + col.prop(tf, "shadow") + col.prop(tf, "text") + col.prop(tf, "alpha_sort") + + col = layout.column() + col.prop(tf, "transp") + else: + col.label(text="No UV Texture") + + class DATA_PT_vertex_colors(DataButtonsPanel): bl_label = "Vertex Colors" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -315,6 +378,7 @@ classes = [ DATA_PT_vertex_groups, DATA_PT_shape_keys, DATA_PT_uv_texture, + DATA_PT_texface, DATA_PT_vertex_colors, DATA_PT_custom_props_mesh] diff --git a/release/scripts/ui/properties_data_metaball.py b/release/scripts/ui/properties_data_metaball.py index b751a9f9059..e0155059b98 100644 --- a/release/scripts/ui/properties_data_metaball.py +++ b/release/scripts/ui/properties_data_metaball.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class DataButtonsPanel(bpy.types.Panel): diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py index 8364d070d1a..dfa0d8029b2 100644 --- a/release/scripts/ui/properties_data_modifier.py +++ b/release/scripts/ui/properties_data_modifier.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check narrowmod = 260 @@ -164,7 +164,7 @@ class DATA_PT_modifiers(DataButtonsPanel): split = layout.split() col = split.column() - col.prop(md, "start") + col.prop(md, "frame_start") col.prop(md, "length") if wide_ui: @@ -229,7 +229,7 @@ class DATA_PT_modifiers(DataButtonsPanel): def DECIMATE(self, layout, ob, md, wide_ui): layout.prop(md, "ratio") - layout.prop(md, "face_count") + layout.label(text="Face Count: %s" % str(md.face_count)) def DISPLACE(self, layout, ob, md, wide_ui): split = layout.split() @@ -291,6 +291,7 @@ class DATA_PT_modifiers(DataButtonsPanel): col.prop(md, "unborn") col.prop(md, "alive") col.prop(md, "dead") + col.prop(md, "size") layout.operator("object.explode_refresh", text="Refresh") @@ -368,7 +369,6 @@ class DATA_PT_modifiers(DataButtonsPanel): sub = col.column() sub.label(text="Object:") sub.prop(md, "object", text="") - sub.prop(md, "mode", text="") sub.active = not md.is_bound if wide_ui: col = split.column() @@ -386,15 +386,14 @@ class DATA_PT_modifiers(DataButtonsPanel): else: layout.operator("object.meshdeform_bind", text="Bind") - if md.mode == 'VOLUME': - split = layout.split() + split = layout.split() + col = split.column() + col.prop(md, "precision") + + if wide_ui: col = split.column() - col.prop(md, "precision") - - if wide_ui: - col = split.column() - col.prop(md, "dynamic") + col.prop(md, "dynamic") def MIRROR(self, layout, ob, md, wide_ui): layout.prop(md, "merge_limit") @@ -438,6 +437,7 @@ class DATA_PT_modifiers(DataButtonsPanel): col.prop(md, "levels", text="Preview") col.prop(md, "sculpt_levels", text="Sculpt") col.prop(md, "render_levels", text="Render") + col.prop(bpy.context.tool_settings.sculpt, "fast_navigate") if wide_ui: col = split.column() @@ -453,12 +453,12 @@ class DATA_PT_modifiers(DataButtonsPanel): col = layout.column() row = col.row() if md.external: - row.operator("object.multires_pack_external", text="Pack External") + row.operator("object.multires_external_pack", text="Pack External") row.label() row = col.row() - row.prop(md, "filename", text="") + row.prop(md, "filepath", text="") else: - row.operator("object.multires_save_external", text="Save External...") + row.operator("object.multires_external_save", text="Save External...") row.label() def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui): @@ -481,10 +481,10 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.separator() - layout.prop(md, "path", text="Create Along Paths") + layout.prop(md, "use_path", text="Create Along Paths") split = layout.split() - split.active = md.path + split.active = md.use_path col = split.column() col.row().prop(md, "axis", expand=True) col.prop(md, "keep_shape") @@ -497,6 +497,28 @@ class DATA_PT_modifiers(DataButtonsPanel): def PARTICLE_SYSTEM(self, layout, ob, md, wide_ui): layout.label(text="See Particle panel.") + def SCREW(self, layout, ob, md, wide_ui): + split = layout.split() + + col = split.column() + col.prop(md, "axis") + col.prop(md, "object", text="AxisOb") + col.prop(md, "angle") + col.prop(md, "steps") + col.prop(md, "render_steps") + + if wide_ui: + col = split.column() + row = col.row() + row.active = (md.object is None or md.use_object_screw_offset == False) + row.prop(md, "screw_offset") + row = col.row() + row.active = (md.object is not None) + row.prop(md, "use_object_screw_offset") + col.prop(md, "use_normal_calculate") + col.prop(md, "use_normal_flip") + col.prop(md, "iterations") + def SHRINKWRAP(self, layout, ob, md, wide_ui): split = layout.split() col = split.column() @@ -602,11 +624,13 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.label(text="See Soft Body panel.") def SOLIDIFY(self, layout, ob, md, wide_ui): - layout.prop(md, "offset") split = layout.split() col = split.column() + col.prop(md, "thickness") + col.prop_object(md, "vertex_group", ob, "vertex_groups", text="") + col.label(text="Crease:") col.prop(md, "edge_crease_inner", text="Inner") col.prop(md, "edge_crease_outer", text="Outer") @@ -614,11 +638,20 @@ class DATA_PT_modifiers(DataButtonsPanel): if wide_ui: col = split.column() - col.label() - col.prop(md, "use_rim") + + col.prop(md, "offset") + colsub = col.column() + colsub.active = (md.vertex_group is not "") + colsub.prop(md, "invert", text="Invert") + col.prop(md, "use_even_offset") col.prop(md, "use_quality_normals") + col.prop(md, "use_rim") + colsub = col.column() + colsub.active = md.use_rim + colsub.prop(md, "use_rim_material") + # col = layout.column() # col.label(text="Vertex Group:") # col.prop_object(md, "vertex_group", ob, "vertex_groups", text="") @@ -638,6 +671,7 @@ class DATA_PT_modifiers(DataButtonsPanel): if wide_ui: col = split.column() col.label(text="Options:") + col.prop(md, "subsurf_uv") col.prop(md, "optimal_display") def SURFACE(self, layout, ob, md, wide_ui): @@ -666,9 +700,12 @@ class DATA_PT_modifiers(DataButtonsPanel): if wide_ui: col = split.column() sub = col.column(align=True) - sub.label(text="Aspect Ratio:") - sub.prop(md, "horizontal_aspect_ratio", text="Horizontal") - sub.prop(md, "vertical_aspect_ratio", text="Vertical") + sub.prop(md, "aspect_x", text="Aspect X") + sub.prop(md, "aspect_y", text="Aspect Y") + + sub = col.column(align=True) + sub.prop(md, "scale_x", text="Scale X") + sub.prop(md, "scale_y", text="Scale Y") def WAVE(self, layout, ob, md, wide_ui): split = layout.split() diff --git a/release/scripts/ui/properties_game.py b/release/scripts/ui/properties_game.py index 41af955d9ec..9ec7168f834 100644 --- a/release/scripts/ui/properties_game.py +++ b/release/scripts/ui/properties_game.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class PhysicsButtonsPanel(bpy.types.Panel): @@ -30,11 +30,12 @@ class PhysicsButtonsPanel(bpy.types.Panel): def poll(self, context): ob = context.active_object rd = context.scene.render - return ob and ob.game and (rd.engine == 'BLENDER_GAME') + return ob and ob.game and (rd.engine in self.COMPAT_ENGINES) class PHYSICS_PT_game_physics(PhysicsButtonsPanel): bl_label = "Physics" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -163,11 +164,12 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel): class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel): bl_label = "Collision Bounds" + COMPAT_ENGINES = {'BLENDER_GAME'} def poll(self, context): game = context.object.game rd = context.scene.render - return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine == 'BLENDER_GAME') + return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine in self.COMPAT_ENGINES) def draw_header(self, context): game = context.active_object.game @@ -203,11 +205,12 @@ class RenderButtonsPanel(bpy.types.Panel): def poll(self, context): rd = context.scene.render - return (rd.engine == 'BLENDER_GAME') + return (rd.engine in self.COMPAT_ENGINES) class RENDER_PT_game(RenderButtonsPanel): bl_label = "Game" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -219,6 +222,7 @@ class RENDER_PT_game(RenderButtonsPanel): class RENDER_PT_game_player(RenderButtonsPanel): bl_label = "Standalone Player" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -256,6 +260,7 @@ class RENDER_PT_game_player(RenderButtonsPanel): class RENDER_PT_game_stereo(RenderButtonsPanel): bl_label = "Stereo" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -315,6 +320,7 @@ class RENDER_PT_game_stereo(RenderButtonsPanel): class RENDER_PT_game_shading(RenderButtonsPanel): bl_label = "Shading" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -343,6 +349,7 @@ class RENDER_PT_game_shading(RenderButtonsPanel): class RENDER_PT_game_performance(RenderButtonsPanel): bl_label = "Performance" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -368,6 +375,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel): class RENDER_PT_game_sound(RenderButtonsPanel): bl_label = "Sound" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -390,12 +398,13 @@ class WorldButtonsPanel(bpy.types.Panel): def poll(self, context): scene = context.scene - return (scene.render.engine == 'BLENDER_GAME') and (scene.world is not None) + return (scene.render.engine in self.COMPAT_ENGINES) and (scene.world is not None) class WORLD_PT_game_context_world(WorldButtonsPanel): bl_label = "" bl_show_header = False + COMPAT_ENGINES = {'BLENDER_GAME'} def poll(self, context): rd = context.scene.render @@ -424,6 +433,7 @@ class WORLD_PT_game_context_world(WorldButtonsPanel): class WORLD_PT_game_world(WorldButtonsPanel): bl_label = "World" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -443,11 +453,12 @@ class WORLD_PT_game_world(WorldButtonsPanel): class WORLD_PT_game_mist(WorldButtonsPanel): bl_label = "Mist" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw_header(self, context): world = context.world - self.layout.prop(world.mist, "enabled", text="") + self.layout.prop(world.mist, "use_mist", text="") def draw(self, context): layout = self.layout @@ -455,7 +466,7 @@ class WORLD_PT_game_mist(WorldButtonsPanel): world = context.world wide_ui = context.region.width > narrowui - layout.active = world.mist.enabled + layout.active = world.mist.use_mist split = layout.split() col = split.column() @@ -468,6 +479,7 @@ class WORLD_PT_game_mist(WorldButtonsPanel): class WORLD_PT_game_physics(WorldButtonsPanel): bl_label = "Physics" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout diff --git a/release/scripts/ui/properties_material.py b/release/scripts/ui/properties_material.py index 13bfd7a7f5d..1526bd004a0 100644 --- a/release/scripts/ui/properties_material.py +++ b/release/scripts/ui/properties_material.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check def active_node_mat(mat): @@ -39,7 +39,7 @@ def active_node_mat(mat): class MATERIAL_MT_sss_presets(bpy.types.Menu): bl_label = "SSS Presets" preset_subdir = "sss" - preset_operator = "script.python_file_run" + preset_operator = "script.execute_preset" draw = bpy.types.Menu.draw_preset @@ -505,8 +505,8 @@ class MATERIAL_PT_sss(MaterialButtonsPanel): row = layout.row().split() sub = row.row(align=True).split(percentage=0.75) - sub.menu("MATERIAL_MT_sss_presets", text="Presets") - sub.operator("material.sss_preset_add", text="Add") + sub.menu("MATERIAL_MT_sss_presets", text=bpy.types.MATERIAL_MT_sss_presets.bl_label) + sub.operator("material.sss_preset_add", text="", icon="ZOOMIN") split = layout.split() @@ -570,10 +570,11 @@ class MATERIAL_PT_mirror(MaterialButtonsPanel): col = split.column() col.separator() - col.prop(raym, "distance", text="Max Dist") col.prop(raym, "depth") + col.prop(raym, "distance", text="Max Dist") col.separator() sub = col.split(percentage=0.4) + sub.active = raym.distance > 0.0 sub.label(text="Fade To:") sub.prop(raym, "fade_to", text="") @@ -913,6 +914,32 @@ class MATERIAL_PT_volume_integration(VolumeButtonsPanel): col.prop(vol, "depth_cutoff") +class MATERIAL_PT_volume_options(VolumeButtonsPanel): + bl_label = "Options" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + bl_default_closed = True + + def draw(self, context): + layout = self.layout + + mat = active_node_mat(context.material) + wide_ui = context.region.width > narrowui + + split = layout.split() + + col = split.column() + col.prop(mat, "traceable") + col.prop(mat, "full_oversampling") + col.prop(mat, "exclude_mist") + + col = split.column() + col.label(text="Light Group:") + col.prop(mat, "light_group", text="") + row = col.row() + row.active = bool(mat.light_group) + row.prop(mat, "light_group_exclusive", text="Exclusive") + + classes = [ MATERIAL_PT_context_material, MATERIAL_PT_preview, @@ -937,8 +964,8 @@ classes = [ MATERIAL_PT_volume_shading, MATERIAL_PT_volume_lighting, MATERIAL_PT_volume_transp, - MATERIAL_PT_volume_integration, + MATERIAL_PT_volume_options, MATERIAL_PT_custom_props] diff --git a/release/scripts/ui/properties_object.py b/release/scripts/ui/properties_object.py index b11180411f4..4e60879d665 100644 --- a/release/scripts/ui/properties_object.py +++ b/release/scripts/ui/properties_object.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class ObjectButtonsPanel(bpy.types.Panel): @@ -35,12 +35,15 @@ class OBJECT_PT_context_object(ObjectButtonsPanel): def draw(self, context): layout = self.layout - + space = context.space_data ob = context.object row = layout.row() row.label(text="", icon='OBJECT_DATA') - row.prop(ob, "name", text="") + if space.use_pin_id: + row.template_ID(space, "pin_id") + else: + row.prop(ob, "name", text="") class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel): @@ -152,13 +155,11 @@ class OBJECT_PT_groups(ObjectButtonsPanel): ob = context.object wide_ui = context.region.width > narrowui - if wide_ui: - split = layout.split() - split.operator_menu_enum("object.group_add", "group") - split.label() - else: - layout.operator_menu_enum("object.group_add", "group") + row = layout.row(align=True) + row.operator("object.group_link", text="Add to Group") + row.operator("object.group_add", text="", icon='ZOOMIN') + # XXX, this is bad practice, yes, I wrote it :( - campbell index = 0 value = str(tuple(context.scene.cursor_location)) for group in bpy.data.groups: @@ -169,7 +170,7 @@ class OBJECT_PT_groups(ObjectButtonsPanel): row = col.box().row() row.prop(group, "name", text="") - row.operator("object.group_remove", text="", icon='X') + row.operator("object.group_remove", text="", icon='X', emboss=False) split = col.box().split() @@ -181,7 +182,7 @@ class OBJECT_PT_groups(ObjectButtonsPanel): col.prop(group, "dupli_offset", text="") prop = col.operator("wm.context_set_value", text="From Cursor") - prop.path = "object.group_users[%d].dupli_offset" % index + prop.data_path = "object.users_group[%d].dupli_offset" % index prop.value = value index += 1 @@ -213,6 +214,7 @@ class OBJECT_PT_display(ObjectButtonsPanel): col.prop(ob, "draw_name", text="Name") col.prop(ob, "draw_axis", text="Axis") col.prop(ob, "draw_wire", text="Wire") + col.prop(ob, "color", text="Object Color") if wide_ui: col = split.column() @@ -268,9 +270,12 @@ class OBJECT_PT_duplication(ObjectButtonsPanel): else: layout.prop(ob, "dupli_group", text="") +# XXX: the following options are all quite buggy, ancient hacks that should be dropped + class OBJECT_PT_animation(ObjectButtonsPanel): - bl_label = "Animation" + bl_label = "Animation Hacks" + bl_default_closed = True def draw(self, context): layout = self.layout @@ -294,17 +299,15 @@ class OBJECT_PT_animation(ObjectButtonsPanel): row.active = (ob.parent is not None) col.prop(ob, "time_offset", text="Offset") + # XXX: these are still used for a few curve-related tracking features if wide_ui: col = split.column() - col.label(text="Track:") - col.prop(ob, "track", text="") + col.label(text="Tracking Axes:") col.prop(ob, "track_axis", text="Axis") col.prop(ob, "up_axis", text="Up Axis") - row = col.row() - row.prop(ob, "track_override_parent", text="Override Parent") - row.active = (ob.parent is not None) -# import generic panels from other files + +# import generic panels from other files from properties_animviz import OBJECT_PT_motion_paths, OBJECT_PT_onion_skinning classes = [ @@ -315,8 +318,8 @@ classes = [ OBJECT_PT_groups, OBJECT_PT_display, OBJECT_PT_duplication, - OBJECT_PT_animation, - + OBJECT_PT_animation, # XXX: panel of old hacks pending to be removed... + OBJECT_PT_motion_paths, #OBJECT_PT_onion_skinning, diff --git a/release/scripts/ui/properties_object_constraint.py b/release/scripts/ui/properties_object_constraint.py index 6f6fcfc1641..335bd25b501 100644 --- a/release/scripts/ui/properties_object_constraint.py +++ b/release/scripts/ui/properties_object_constraint.py @@ -19,7 +19,8 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check +narrowcon = 260 class ConstraintButtonsPanel(bpy.types.Panel): @@ -30,14 +31,15 @@ class ConstraintButtonsPanel(bpy.types.Panel): def draw_constraint(self, context, con): layout = self.layout - box = layout.template_constraint(con) wide_ui = context.region.width > narrowui + compact_con = context.region.width < narrowcon + box = layout.template_constraint(con, compact=compact_con) if box: # match enum type to our functions, avoids a lookup table. getattr(self, con.type)(context, box, con, wide_ui) - if con.type not in ('RIGID_BODY_JOINT', 'SPLINE_IK', 'NULL'): + if con.type not in ('RIGID_BODY_JOINT', 'NULL'): box.prop(con, "influence") def space_template(self, layout, con, wide_ui, target=True, owner=True): @@ -76,7 +78,7 @@ class ConstraintButtonsPanel(bpy.types.Panel): else: layout.prop_object(con, "subtarget", con.target.data, "bones", text="") - if con.type in ('COPY_LOCATION', 'STRETCH_TO', 'TRACK_TO'): + if con.type in ('COPY_LOCATION', 'STRETCH_TO', 'TRACK_TO', 'PIVOT'): row = layout.row() row.label(text="Head/Tail:") row.prop(con, "head_tail", text="") @@ -97,12 +99,12 @@ class ConstraintButtonsPanel(bpy.types.Panel): split = layout.split(percentage=0.33) col = split.column() - col.prop(con, "tail") - col.prop(con, "stretch") + col.prop(con, "use_tail") + col.prop(con, "use_stretch") col = split.column() col.prop(con, "chain_length") - col.prop(con, "targetless") + col.prop(con, "use_target") def CHILD_OF(self, context, layout, con, wide_ui): self.target_template(layout, con, wide_ui) @@ -205,10 +207,10 @@ class ConstraintButtonsPanel(bpy.types.Panel): row.label(text="Axis Ref:") row.prop(con, "axis_reference", expand=True) split = layout.split(percentage=0.33) - split.row().prop(con, "position") + split.row().prop(con, "use_position") row = split.row() row.prop(con, "weight", text="Weight", slider=True) - row.active = con.position + row.active = con.use_position split = layout.split(percentage=0.33) row = split.row() row.label(text="Lock:") @@ -219,7 +221,7 @@ class ConstraintButtonsPanel(bpy.types.Panel): split.active = con.use_position split = layout.split(percentage=0.33) - split.row().prop(con, "rotation") + split.row().prop(con, "use_rotation") row = split.row() row.prop(con, "orient_weight", text="Weight", slider=True) row.active = con.use_rotation @@ -461,6 +463,17 @@ class ConstraintButtonsPanel(bpy.types.Panel): self.space_template(layout, con, wide_ui) + def MAINTAIN_VOLUME(self, context, layout, con, wide_ui): + + row = layout.row() + if wide_ui: + row.label(text="Free:") + row.prop(con, "axis", expand=True) + + layout.prop(con, "volume") + + self.space_template(layout, con, wide_ui) + def COPY_TRANSFORMS(self, context, layout, con, wide_ui): self.target_template(layout, con, wide_ui) @@ -485,8 +498,8 @@ class ConstraintButtonsPanel(bpy.types.Panel): col = split.column(align=True) col.label(text="Action Length:") - col.prop(con, "start_frame", text="Start") - col.prop(con, "end_frame", text="End") + col.prop(con, "frame_start", text="Start") + col.prop(con, "frame_end", text="End") if wide_ui: col = split.column(align=True) @@ -719,6 +732,23 @@ class ConstraintButtonsPanel(bpy.types.Panel): col.prop(con, "xz_scaling_mode", text="") col.prop(con, "use_curve_radius") + def PIVOT(self, context, layout, con, wide_ui): + self.target_template(layout, con, wide_ui) + + if con.target: + col = layout.column() + col.prop(con, "offset", text="Pivot Offset") + else: + col = layout.column() + col.prop(con, "use_relative_position") + if con.use_relative_position: + col.prop(con, "offset", text="Relative Pivot Point") + else: + col.prop(con, "offset", text="Absolute Pivot Point") + + col = layout.column() + col.prop(con, "enabled_rotation_range", text="Pivot When") + class OBJECT_PT_constraints(ConstraintButtonsPanel): bl_label = "Object Constraints" diff --git a/release/scripts/ui/properties_particle.py b/release/scripts/ui/properties_particle.py index dbd2b90fea2..58e602dd1e2 100644 --- a/release/scripts/ui/properties_particle.py +++ b/release/scripts/ui/properties_particle.py @@ -25,18 +25,21 @@ from properties_physics_common import effector_weights_ui from properties_physics_common import basic_force_field_settings_ui from properties_physics_common import basic_force_field_falloff_ui +narrowui = bpy.context.user_preferences.view.properties_width_check + def particle_panel_enabled(context, psys): return (psys.point_cache.baked is False) and (not psys.edited) and (not context.particle_system_editable) -def particle_panel_poll(context): +def particle_panel_poll(panel, context): psys = context.particle_system + engine = context.scene.render.engine if psys is None: return False if psys.settings is None: return False - return psys.settings.type in ('EMITTER', 'REACTOR', 'HAIR') + return psys.settings.type in ('EMITTER', 'REACTOR', 'HAIR') and (engine in panel.COMPAT_ENGINES) class ParticleButtonsPanel(bpy.types.Panel): @@ -45,15 +48,17 @@ class ParticleButtonsPanel(bpy.types.Panel): bl_context = "particle" def poll(self, context): - return particle_panel_poll(context) + return particle_panel_poll(self, context) class PARTICLE_PT_context_particles(ParticleButtonsPanel): bl_label = "" bl_show_header = False + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): - return (context.particle_system or context.object) + engine = context.scene.render.engine + return (context.particle_system or context.object) and (engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -132,14 +137,16 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel): class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel): + COMPAT_ENGINES = {'BLENDER_RENDER'} _context_path = "particle_system.settings" class PARTICLE_PT_emission(ParticleButtonsPanel): bl_label = "Emission" + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): - if particle_panel_poll(context): + if particle_panel_poll(self, context): return not context.particle_system.point_cache.external else: return False @@ -149,6 +156,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): psys = context.particle_system part = psys.settings + wide_ui = context.region.width > narrowui layout.enabled = particle_panel_enabled(context, psys) and not psys.multiple_caches @@ -160,8 +168,8 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): split = layout.split() col = split.column(align=True) - col.prop(part, "start") - col.prop(part, "end") + col.prop(part, "frame_start") + col.prop(part, "frame_end") col = split.column(align=True) col.prop(part, "lifetime") @@ -170,7 +178,10 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): layout.row().label(text="Emit From:") row = layout.row() - row.prop(part, "emit_from", expand=True) + if wide_ui: + row.prop(part, "emit_from", expand=True) + else: + row.prop(part, "emit_from", text="") row = layout.row() row.prop(part, "trand") if part.distribution != 'GRID': @@ -178,7 +189,10 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): if part.emit_from == 'FACE' or part.emit_from == 'VOLUME': row = layout.row() - row.prop(part, "distribution", expand=True) + if wide_ui: + row.prop(part, "distribution", expand=True) + else: + row.prop(part, "distribution", text="") row = layout.row() @@ -192,14 +206,16 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel): bl_label = "Hair dynamics" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): psys = context.particle_system + engine = context.scene.render.engine if psys is None: return False if psys.settings is None: return False - return psys.settings.type == 'HAIR' + return psys.settings.type == 'HAIR' and (engine in self.COMPAT_ENGINES) def draw_header(self, context): #cloth = context.cloth.collision_settings @@ -247,9 +263,11 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel): class PARTICLE_PT_cache(ParticleButtonsPanel): bl_label = "Cache" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): psys = context.particle_system + engine = context.scene.render.engine if psys is None: return False if psys.settings is None: @@ -257,20 +275,20 @@ class PARTICLE_PT_cache(ParticleButtonsPanel): phystype = psys.settings.physics_type if phystype == 'NO' or phystype == 'KEYED': return False - return psys.settings.type in ('EMITTER', 'REACTOR') or (psys.settings.type == 'HAIR' and psys.hair_dynamics) + return (psys.settings.type in ('EMITTER', 'REACTOR') or (psys.settings.type == 'HAIR' and psys.hair_dynamics)) and engine in self.COMPAT_ENGINES def draw(self, context): - psys = context.particle_system - point_cache_ui(self, context, psys.point_cache, particle_panel_enabled(context, psys), not psys.hair_dynamics, 0) + point_cache_ui(self, context, psys.point_cache, True, 'HAIR' if psys.hair_dynamics else 'PSYS') class PARTICLE_PT_velocity(ParticleButtonsPanel): bl_label = "Velocity" + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): - if particle_panel_poll(context): + if particle_panel_poll(self, context): psys = context.particle_system return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.external else: @@ -314,9 +332,10 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel): class PARTICLE_PT_rotation(ParticleButtonsPanel): bl_label = "Rotation" + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): - if particle_panel_poll(context): + if particle_panel_poll(self, context): psys = context.particle_system return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.external else: @@ -327,6 +346,7 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel): psys = context.particle_system part = psys.settings + wide_ui = context.region.width > narrowui layout.enabled = particle_panel_enabled(context, psys) @@ -344,7 +364,10 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel): sub.prop(part, "random_phase_factor", text="Random", slider=True) layout.row().label(text="Angular Velocity:") - layout.row().prop(part, "angular_velocity_mode", expand=True) + if wide_ui: + layout.row().prop(part, "angular_velocity_mode", expand=True) + else: + layout.row().prop(part, "angular_velocity_mode", text="") split = layout.split() sub = split.column() @@ -355,9 +378,10 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel): class PARTICLE_PT_physics(ParticleButtonsPanel): bl_label = "Physics" + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): - if particle_panel_poll(context): + if particle_panel_poll(self, context): return not context.particle_system.point_cache.external else: return False @@ -367,11 +391,16 @@ class PARTICLE_PT_physics(ParticleButtonsPanel): psys = context.particle_system part = psys.settings + wide_ui = context.region.width > narrowui layout.enabled = particle_panel_enabled(context, psys) row = layout.row() - row.prop(part, "physics_type", expand=True) + if wide_ui: + row.prop(part, "physics_type", expand=True) + else: + row.prop(part, "physics_type", text="") + if part.physics_type != 'NO': row = layout.row() col = row.column(align=True) @@ -390,10 +419,53 @@ class PARTICLE_PT_physics(ParticleButtonsPanel): sub.prop(part, "drag_factor", slider=True) sub.prop(part, "damp_factor", slider=True) sub = split.column() + sub.label(text="Integration:") + sub.prop(part, "integrator", text="") + sub.prop(part, "time_tweak") + sub.prop(part, "subframes") + sub = layout.row() sub.prop(part, "size_deflect") sub.prop(part, "die_on_collision") - sub.prop(part, "integrator") + + elif part.physics_type == 'FLUID': + fluid = part.fluid + split = layout.split() + sub = split.column() + + sub.label(text="Forces:") + sub.prop(part, "brownian_factor") + sub.prop(part, "drag_factor", slider=True) + sub.prop(part, "damp_factor", slider=True) + sub = split.column() + sub.label(text="Integration:") + sub.prop(part, "integrator", text="") sub.prop(part, "time_tweak") + sub.prop(part, "subframes") + sub = layout.row() + sub.prop(part, "size_deflect") + sub.prop(part, "die_on_collision") + + split = layout.split() + sub = split.column() + sub.label(text="Fluid Interaction:") + sub.prop(fluid, "fluid_radius", slider=True) + sub.prop(fluid, "stiffness_k") + sub.prop(fluid, "stiffness_knear") + sub.prop(fluid, "rest_density") + + sub.label(text="Viscosity:") + sub.prop(fluid, "viscosity_omega", text="Linear") + sub.prop(fluid, "viscosity_beta", text="Square") + + sub = split.column() + + sub.label(text="Springs:") + sub.prop(fluid, "spring_k", text="Force", slider=True) + sub.prop(fluid, "rest_length", slider=True) + layout.label(text="Multiple fluids interactions:") + + sub.label(text="Buoyancy:") + sub.prop(fluid, "buoyancy", slider=True) elif part.physics_type == 'KEYED': split = layout.split() @@ -454,7 +526,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel): col.prop(boids, "banking", slider=True) col.prop(boids, "height", slider=True) - if part.physics_type == 'KEYED' or part.physics_type == 'BOIDS': + if part.physics_type == 'KEYED' or part.physics_type == 'BOIDS' or part.physics_type == 'FLUID': if part.physics_type == 'BOIDS': layout.label(text="Relations:") @@ -484,7 +556,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel): col.active = psys.keyed_timing col.prop(key, "time") col.prop(key, "duration") - else: + elif part.physics_type == 'BOIDS': sub = row.row() #doesn't work yet #sub.red_alert = key.valid @@ -492,20 +564,28 @@ class PARTICLE_PT_physics(ParticleButtonsPanel): sub.prop(key, "system", text="System") layout.prop(key, "mode", expand=True) + elif part.physics_type == 'FLUID': + sub = row.row() + #doesn't work yet + #sub.red_alert = key.valid + sub.prop(key, "object", text="") + sub.prop(key, "system", text="System") class PARTICLE_PT_boidbrain(ParticleButtonsPanel): bl_label = "Boid Brain" + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): psys = context.particle_system + engine = context.scene.render.engine if psys is None: return False if psys.settings is None: return False if psys.point_cache.external: return False - return psys.settings.physics_type == 'BOIDS' + return psys.settings.physics_type == 'BOIDS' and engine in self.COMPAT_ENGINES def draw(self, context): layout = self.layout @@ -594,20 +674,23 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel): class PARTICLE_PT_render(ParticleButtonsPanel): bl_label = "Render" + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): psys = context.particle_system + engine = context.scene.render.engine if psys is None: return False if psys.settings is None: return False - return True + return engine in self.COMPAT_ENGINES def draw(self, context): layout = self.layout psys = context.particle_system part = psys.settings + wide_ui = context.region.width > narrowui row = layout.row() row.prop(part, "material") @@ -623,7 +706,10 @@ class PARTICLE_PT_render(ParticleButtonsPanel): sub.prop(part, "died") row = layout.row() - row.prop(part, "ren_as", expand=True) + if wide_ui: + row.prop(part, "ren_as", expand=True) + else: + row.prop(part, "ren_as", text="") split = layout.split() @@ -635,12 +721,6 @@ class PARTICLE_PT_render(ParticleButtonsPanel): sub = split.column() sub.prop(part, "velocity_length") elif part.ren_as == 'PATH': - - if part.type != 'HAIR' and part.physics_type != 'KEYED' and (psys.point_cache.baked is False): - box = layout.box() - box.label(text="Baked or keyed particles needed for correct rendering.") - return - sub.prop(part, "render_strand") subsub = sub.column() subsub.active = (part.render_strand is False) @@ -716,7 +796,10 @@ class PARTICLE_PT_render(ParticleButtonsPanel): sub.label(text="Align:") row = layout.row() - row.prop(part, "billboard_align", expand=True) + if wide_ui: + row.prop(part, "billboard_align", expand=True) + else: + row.prop(part, "billboard_align", text="") row.prop(part, "billboard_lock", text="Lock") row = layout.row() row.prop(part, "billboard_object") @@ -741,9 +824,9 @@ class PARTICLE_PT_render(ParticleButtonsPanel): row.prop(psys, "billboard_split_uv") row = layout.row() row.label(text="Animate:") - row.prop(part, "billboard_animation", expand=True) + row.prop(part, "billboard_animation", text="") row.label(text="Offset:") - row.prop(part, "billboard_split_offset", expand=True) + row.prop(part, "billboard_split_offset", text="") if part.ren_as == 'HALO' or part.ren_as == 'LINE' or part.ren_as == 'BILLBOARD': row = layout.row() @@ -762,34 +845,35 @@ class PARTICLE_PT_render(ParticleButtonsPanel): class PARTICLE_PT_draw(ParticleButtonsPanel): bl_label = "Display" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def poll(self, context): psys = context.particle_system + engine = context.scene.render.engine if psys is None: return False if psys.settings is None: return False - return True + return engine in self.COMPAT_ENGINES def draw(self, context): layout = self.layout psys = context.particle_system part = psys.settings + wide_ui = context.region.width > narrowui row = layout.row() - row.prop(part, "draw_as", expand=True) + if wide_ui: + row.prop(part, "draw_as", expand=True) + else: + row.prop(part, "draw_as", text="") if part.draw_as == 'NONE' or (part.ren_as == 'NONE' and part.draw_as == 'RENDER'): return path = (part.ren_as == 'PATH' and part.draw_as == 'RENDER') or part.draw_as == 'PATH' - if path and part.type != 'HAIR' and part.physics_type != 'KEYED' and psys.point_cache.baked is False: - box = layout.box() - box.label(text="Baked or keyed particles needed for correct drawing.") - return - row = layout.row() row.prop(part, "display", slider=True) if part.draw_as != 'RENDER' or part.ren_as == 'HALO': @@ -820,14 +904,19 @@ class PARTICLE_PT_draw(ParticleButtonsPanel): class PARTICLE_PT_children(ParticleButtonsPanel): bl_label = "Children" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def draw(self, context): layout = self.layout psys = context.particle_system part = psys.settings + wide_ui = context.region.width > narrowui - layout.row().prop(part, "child_type", expand=True) + if wide_ui: + layout.row().prop(part, "child_type", expand=True) + else: + layout.row().prop(part, "child_type", text="") if part.child_type == 'NONE': return @@ -883,7 +972,10 @@ class PARTICLE_PT_children(ParticleButtonsPanel): col.label(text="hair parting controls") layout.row().label(text="Kink:") - layout.row().prop(part, "kink", expand=True) + if wide_ui: + layout.row().prop(part, "kink", expand=True) + else: + layout.row().prop(part, "kink", text="") split = layout.split() @@ -897,6 +989,7 @@ class PARTICLE_PT_children(ParticleButtonsPanel): class PARTICLE_PT_field_weights(ParticleButtonsPanel): bl_label = "Field Weights" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def draw(self, context): part = context.particle_system.settings @@ -909,6 +1002,7 @@ class PARTICLE_PT_field_weights(ParticleButtonsPanel): class PARTICLE_PT_force_fields(ParticleButtonsPanel): bl_label = "Force Field Settings" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def draw(self, context): layout = self.layout @@ -936,6 +1030,7 @@ class PARTICLE_PT_force_fields(ParticleButtonsPanel): class PARTICLE_PT_vertexgroups(ParticleButtonsPanel): bl_label = "Vertexgroups" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER'} def draw(self, context): layout = self.layout diff --git a/release/scripts/ui/properties_physics_cloth.py b/release/scripts/ui/properties_physics_cloth.py index 7a65420e172..61e1fe81812 100644 --- a/release/scripts/ui/properties_physics_cloth.py +++ b/release/scripts/ui/properties_physics_cloth.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check from properties_physics_common import point_cache_ui @@ -36,7 +36,7 @@ class CLOTH_MT_presets(bpy.types.Menu): ''' bl_label = "Cloth Presets" preset_subdir = "cloth" - preset_operator = "script.python_file_run" + preset_operator = "script.execute_preset" draw = bpy.types.Menu.draw_preset @@ -62,7 +62,6 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel): wide_ui = context.region.width > narrowui split = layout.split() - split.operator_context = 'EXEC_DEFAULT' if md: # remove modifier + settings @@ -76,9 +75,7 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel): # add modifier split.operator("object.modifier_add", text="Add").type = 'CLOTH' if wide_ui: - split.column() - - split.operator_context = 'INVOKE_DEFAULT' + split.label() if md: cloth = md.settings @@ -90,9 +87,9 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel): col = split.column() col.label(text="Presets:") - sub = col.row(align=True).split(percentage=0.75) - sub.menu("CLOTH_MT_presets", text="Presets") - sub.operator("cloth.preset_add", text="Add") + sub = col.row(align=True) + sub.menu("CLOTH_MT_presets", text=bpy.types.CLOTH_MT_presets.bl_label) + sub.operator("cloth.preset_add", text="", icon="ZOOMIN") col.label(text="Quality:") col.prop(cloth, "quality", text="Steps", slider=True) @@ -129,6 +126,12 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel): col.prop(cloth, "goal_friction", text="Friction") """ + key = ob.data.shape_keys + + if key: + col.label(text="Rest Shape Key:") + col.prop_object(cloth, "rest_shape_key", key, "keys", text="") + class PHYSICS_PT_cloth_cache(PhysicButtonsPanel): bl_label = "Cloth Cache" @@ -139,7 +142,7 @@ class PHYSICS_PT_cloth_cache(PhysicButtonsPanel): def draw(self, context): md = context.cloth - point_cache_ui(self, context, md.point_cache, cloth_panel_enabled(md), 0, 0) + point_cache_ui(self, context, md.point_cache, cloth_panel_enabled(md), 'CLOTH') class PHYSICS_PT_cloth_collision(PhysicButtonsPanel): @@ -179,6 +182,8 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel): sub.prop(cloth, "self_collision_quality", slider=True, text="Quality") sub.prop(cloth, "self_min_distance", slider=True, text="Distance") + layout.prop(cloth, "group") + class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel): bl_label = "Cloth Stiffness Scaling" diff --git a/release/scripts/ui/properties_physics_common.py b/release/scripts/ui/properties_physics_common.py index b81fa25b1a1..be8972e4fe6 100644 --- a/release/scripts/ui/properties_physics_common.py +++ b/release/scripts/ui/properties_physics_common.py @@ -18,14 +18,18 @@ # <pep8 compliant> -narrowui = 180 +import bpy + +narrowui = bpy.context.user_preferences.view.properties_width_check + +#cachetype can be 'PSYS' 'HAIR' 'SMOKE' etc -def point_cache_ui(self, context, cache, enabled, particles, smoke): +def point_cache_ui(self, context, cache, enabled, cachetype): layout = self.layout wide_ui = context.region.width > narrowui - layout.set_context_pointer("PointCache", cache) + layout.set_context_pointer("point_cache", cache) row = layout.row() row.template_list(cache, "point_cache_list", cache, "active_point_cache_index", rows=2) @@ -34,60 +38,75 @@ def point_cache_ui(self, context, cache, enabled, particles, smoke): col.operator("ptcache.remove", icon='ZOOMOUT', text="") row = layout.row() - row.label(text="File Name:") - if particles: + if cachetype in ('PSYS', 'HAIR', 'SMOKE'): row.prop(cache, "external") if cache.external: split = layout.split(percentage=0.80) - split.prop(cache, "name", text="") + split.prop(cache, "name", text="File Name") split.prop(cache, "index", text="") - layout.label(text="File Path:") + row = layout.row() + row.label(text="File Path:") + row.prop(cache, "use_library_path", "Use Lib Path") + layout.prop(cache, "filepath", text="") layout.label(text=cache.info) else: - layout.prop(cache, "name", text="") + layout.prop(cache, "name", text="File Name") - if not particles: - row = layout.row() - row.enabled = enabled - row.prop(cache, "start_frame") - row.prop(cache, "end_frame") + split = layout.split() + col = split.column(align=True) - row = layout.row() + if cachetype != 'PSYS': + col.enabled = enabled + col.prop(cache, "frame_start") + col.prop(cache, "frame_end") + if cachetype != 'SMOKE': + col.prop(cache, "step") - if cache.baked == True: - row.operator("ptcache.free_bake", text="Free Bake") - else: - row.operator("ptcache.bake", text="Bake").bake = True + if wide_ui: + col = split.column() - sub = row.row() - sub.enabled = (cache.frames_skipped or cache.outdated) and enabled - sub.operator("ptcache.bake", "bake", False, text="Calculate to Current Frame") - - row = layout.row() - row.enabled = enabled - row.operator("ptcache.bake_from_cache", text="Current Cache to Bake") - if not smoke: - row.prop(cache, "step") - - if not smoke: - row = layout.row() - sub = row.row() + if cachetype != 'SMOKE': + sub = col.column() sub.enabled = enabled sub.prop(cache, "quick_cache") - row.prop(cache, "disk_cache") - layout.label(text=cache.info) + sub = col.column() + sub.enabled = bpy.data.file_is_saved + sub.prop(cache, "disk_cache") + col.label(text=cache.info) + + sub = col.column() + sub.prop(cache, "use_library_path", "Use Lib Path") layout.separator() - row = layout.row() - row.operator("ptcache.bake_all", text="Bake All Dynamics").bake = True - row.operator("ptcache.free_bake_all", text="Free All Bakes") - layout.operator("ptcache.bake_all", "bake", False, text="Update All Dynamics to current frame") + split = layout.split() + + col = split.column() + + if cache.baked == True: + col.operator("ptcache.free_bake", text="Free Bake") + else: + col.operator("ptcache.bake", text="Bake").bake = True + + sub = col.row() + sub.enabled = (cache.frames_skipped or cache.outdated) and enabled + sub.operator("ptcache.bake", text="Calculate To Frame").bake = False + + sub = col.column() + sub.enabled = enabled + sub.operator("ptcache.bake_from_cache", text="Current Cache to Bake") + + + if wide_ui: + col = split.column() + col.operator("ptcache.bake_all", text="Bake All Dynamics").bake = True + col.operator("ptcache.free_bake_all", text="Free All Bakes") + col.operator("ptcache.bake_all", text="Update All To Frame").bake = False def effector_weights_ui(self, context, weights): diff --git a/release/scripts/ui/properties_physics_field.py b/release/scripts/ui/properties_physics_field.py index e0be01d4c1c..57fa40e4c5d 100644 --- a/release/scripts/ui/properties_physics_field.py +++ b/release/scripts/ui/properties_physics_field.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check from properties_physics_common import basic_force_field_settings_ui @@ -72,6 +72,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel): col.prop(field, "guide_free") col.prop(field, "falloff_power") col.prop(field, "guide_path_add") + col.prop(field, "use_guide_path_weight") if wide_ui: col = split.column() @@ -184,7 +185,6 @@ class PHYSICS_PT_collision(PhysicButtonsPanel): wide_ui = context.region.width > narrowui split = layout.split() - split.operator_context = 'EXEC_DEFAULT' if md: # remove modifier + settings diff --git a/release/scripts/ui/properties_physics_fluid.py b/release/scripts/ui/properties_physics_fluid.py index 9b36b98bc24..32acd88654d 100644 --- a/release/scripts/ui/properties_physics_fluid.py +++ b/release/scripts/ui/properties_physics_fluid.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class PhysicButtonsPanel(bpy.types.Panel): @@ -43,7 +43,6 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): wide_ui = context.region.width > narrowui split = layout.split() - split.operator_context = 'EXEC_DEFAULT' if md: # remove modifier + settings @@ -67,9 +66,18 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): if fluid: if wide_ui: - layout.prop(fluid, "type") + row = layout.row() + row.prop(fluid, "type") + if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE'): + row.prop(fluid, "active", text="") else: layout.prop(fluid, "type", text="") + if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE'): + layout.prop(fluid, "active", text="") + + layout = layout.column() + if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE'): + layout.active = fluid.active if fluid.type == 'DOMAIN': layout.operator("fluid.bake", text="Bake Fluid Simulation", icon='MOD_FLUIDSIM') @@ -220,15 +228,29 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel): layout = self.layout fluid = context.fluid.settings + scene = context.scene wide_ui = context.region.width > narrowui split = layout.split() col = split.column() - col.label(text="Gravity:") - col.prop(fluid, "gravity", text="") - col.label(text="Real World Size:") - col.prop(fluid, "real_world_size", text="Metres") + if scene.use_gravity: + col.label(text="Using Scene Gravity", icon="SCENE_DATA") + sub = col.column() + sub.enabled = False + sub.prop(fluid, "gravity", text="") + else: + col.label(text="Gravity:") + col.prop(fluid, "gravity", text="") + + if scene.unit_settings.system != 'NONE': + col.label(text="Using Scene Size Units", icon="SCENE_DATA") + sub = col.column() + sub.enabled = False + sub.prop(fluid, "real_world_size", text="Metres") + else: + col.label(text="Real World Size:") + col.prop(fluid, "real_world_size", text="Metres") if wide_ui: col = split.column() diff --git a/release/scripts/ui/properties_physics_smoke.py b/release/scripts/ui/properties_physics_smoke.py index 1f91b761e1a..c5357c515de 100644 --- a/release/scripts/ui/properties_physics_smoke.py +++ b/release/scripts/ui/properties_physics_smoke.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check from properties_physics_common import point_cache_ui @@ -48,7 +48,6 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel): wide_ui = context.region.width > narrowui split = layout.split() - split.operator_context = 'EXEC_DEFAULT' if md: # remove modifier + settings @@ -71,8 +70,7 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel): else: layout.prop(md, "smoke_type", text="") - if md.smoke_type == 'TYPE_DOMAIN': - + if md.smoke_type == 'DOMAIN': domain = md.domain_settings split = layout.split() @@ -94,8 +92,7 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel): sub.prop(domain, "dissolve_speed", text="Time") sub.prop(domain, "dissolve_smoke_log", text="Slow") - elif md.smoke_type == 'TYPE_FLOW': - + elif md.smoke_type == 'FLOW': flow = md.flow_settings split = layout.split() @@ -115,7 +112,7 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel): col.prop(flow, "temperature") col.prop(flow, "density") - #elif md.smoke_type == 'TYPE_COLL': + #elif md.smoke_type == 'COLLISION': # layout.separator() @@ -125,7 +122,7 @@ class PHYSICS_PT_smoke_groups(PhysicButtonsPanel): def poll(self, context): md = context.smoke - return md and (md.smoke_type == 'TYPE_DOMAIN') + return md and (md.smoke_type == 'DOMAIN') def draw(self, context): layout = self.layout @@ -154,20 +151,18 @@ class PHYSICS_PT_smoke_cache(PhysicButtonsPanel): def poll(self, context): md = context.smoke - return md and (md.smoke_type == 'TYPE_DOMAIN') + return md and (md.smoke_type == 'DOMAIN') def draw(self, context): layout = self.layout - domain = context.smoke.domain_settings - - layout.label(text="Compression:") - layout.prop(domain, "smoke_cache_comp", expand=True) - md = context.smoke.domain_settings cache = md.point_cache_low - point_cache_ui(self, context, cache, (cache.baked is False), 0, 1) + layout.label(text="Compression:") + layout.prop(md, "smoke_cache_comp", expand=True) + + point_cache_ui(self, context, cache, (cache.baked is False), 'SMOKE') class PHYSICS_PT_smoke_highres(PhysicButtonsPanel): @@ -176,12 +171,12 @@ class PHYSICS_PT_smoke_highres(PhysicButtonsPanel): def poll(self, context): md = context.smoke - return md and (md.smoke_type == 'TYPE_DOMAIN') + return md and (md.smoke_type == 'DOMAIN') def draw_header(self, context): - high = context.smoke.domain_settings + md = context.smoke.domain_settings - self.layout.prop(high, "highres", text="") + self.layout.prop(md, "highres", text="") def draw(self, context): layout = self.layout @@ -189,6 +184,8 @@ class PHYSICS_PT_smoke_highres(PhysicButtonsPanel): md = context.smoke.domain_settings wide_ui = context.region.width > narrowui + layout.active = md.highres + split = layout.split() col = split.column() @@ -209,21 +206,18 @@ class PHYSICS_PT_smoke_cache_highres(PhysicButtonsPanel): def poll(self, context): md = context.smoke - return md and (md.smoke_type == 'TYPE_DOMAIN') and md.domain_settings.highres + return md and (md.smoke_type == 'DOMAIN') and md.domain_settings.highres def draw(self, context): layout = self.layout - domain = context.smoke.domain_settings - - layout.label(text="Compression:") - layout.prop(domain, "smoke_cache_high_comp", expand=True) - - md = context.smoke.domain_settings cache = md.point_cache_high - point_cache_ui(self, context, cache, (cache.baked is False), 0, 1) + layout.label(text="Compression:") + layout.prop(md, "smoke_cache_high_comp", expand=True) + + point_cache_ui(self, context, cache, (cache.baked is False), 'SMOKE') class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel): @@ -232,7 +226,7 @@ class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel): def poll(self, context): smoke = context.smoke - return (smoke and smoke.smoke_type == 'TYPE_DOMAIN') + return (smoke and smoke.smoke_type == 'DOMAIN') def draw(self, context): domain = context.smoke.domain_settings diff --git a/release/scripts/ui/properties_physics_softbody.py b/release/scripts/ui/properties_physics_softbody.py index 8a59e087dc3..60149cf533b 100644 --- a/release/scripts/ui/properties_physics_softbody.py +++ b/release/scripts/ui/properties_physics_softbody.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check from properties_physics_common import point_cache_ui @@ -38,7 +38,9 @@ class PhysicButtonsPanel(bpy.types.Panel): def poll(self, context): ob = context.object rd = context.scene.render - return (ob and ob.type == 'MESH') and (not rd.use_game_engine) +# return (ob and ob.type == 'MESH') and (not rd.use_game_engine) +# i really hate touching things i do not understand completely .. but i think this should read (bjornmose) + return (ob and (ob.type == 'MESH' or ob.type == 'LATTICE'or ob.type == 'CURVE')) and (not rd.use_game_engine) class PHYSICS_PT_softbody(PhysicButtonsPanel): @@ -52,7 +54,6 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel): wide_ui = context.region.width > narrowui split = layout.split() - split.operator_context = 'EXEC_DEFAULT' if md: # remove modifier + settings @@ -96,7 +97,7 @@ class PHYSICS_PT_softbody_cache(PhysicButtonsPanel): def draw(self, context): md = context.soft_body - point_cache_ui(self, context, md.point_cache, softbody_panel_enabled(md), 0, 0) + point_cache_ui(self, context, md.point_cache, softbody_panel_enabled(md), 'SOFTBODY') class PHYSICS_PT_softbody_goal(PhysicButtonsPanel): @@ -185,10 +186,13 @@ class PHYSICS_PT_softbody_edge(PhysicButtonsPanel): sub.active = softbody.stiff_quads sub.prop(softbody, "shear") - col.prop(softbody, "new_aero", text="Aero") - sub = col.column() - sub.enabled = softbody.new_aero - sub.prop(softbody, "aero", text="Factor") + col.label(text="Aerodynamics:") + col.row().prop(softbody, "aerodynamics_type", expand=True) + col.prop(softbody, "aero", text="Factor") + + #sub = col.column() + #sub.enabled = softbody.aero > 0 + col.label(text="Collision:") col.prop(softbody, "edge_collision", text="Edge") @@ -196,7 +200,7 @@ class PHYSICS_PT_softbody_edge(PhysicButtonsPanel): class PHYSICS_PT_softbody_collision(PhysicButtonsPanel): - bl_label = "Soft Body Collision" + bl_label = "Soft Body Self Collision" bl_default_closed = True def poll(self, context): @@ -217,7 +221,7 @@ class PHYSICS_PT_softbody_collision(PhysicButtonsPanel): layout.active = softbody.self_collision and softbody_panel_enabled(md) - layout.label(text="Collision Type:") + layout.label(text="Collision Ball Size Calculation:") if wide_ui: layout.prop(softbody, "collision_type", expand=True) else: diff --git a/release/scripts/ui/properties_render.py b/release/scripts/ui/properties_render.py index 8bf3318c3e2..829416b86d3 100644 --- a/release/scripts/ui/properties_render.py +++ b/release/scripts/ui/properties_render.py @@ -19,12 +19,19 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class RENDER_MT_presets(bpy.types.Menu): bl_label = "Render Presets" preset_subdir = "render" + preset_operator = "script.execute_preset" + draw = bpy.types.Menu.draw_preset + + +class RENDER_MT_ffmpeg_presets(bpy.types.Menu): + bl_label = "FFMPEG Presets" + preset_subdir = "ffmpeg" preset_operator = "script.python_file_run" draw = bpy.types.Menu.draw_preset @@ -53,11 +60,11 @@ class RENDER_PT_render(RenderButtonsPanel): split = layout.split() col = split.column() - col.operator("screen.render", text="Image", icon='RENDER_STILL') + col.operator("render.render", text="Image", icon='RENDER_STILL') if wide_ui: col = split.column() - col.operator("screen.render", text="Animation", icon='RENDER_ANIMATION').animation = True + col.operator("render.render", text="Animation", icon='RENDER_ANIMATION').animation = True layout.prop(rd, "display_mode", text="Display") @@ -89,13 +96,16 @@ class RENDER_PT_layers(RenderButtonsPanel): split = layout.split() col = split.column() - col.prop(scene, "visible_layers", text="Scene") + col.prop(scene, "layers", text="Scene") + col.label(text="") + col.prop(rl, "light_override", text="Light") + col.prop(rl, "material_override", text="Material") if wide_ui: col = split.column() col.prop(rl, "visible_layers", text="Layer") + col.label(text="Mask Layers:") + col.prop(rl, "zmask_layers", text="") - layout.prop(rl, "light_override", text="Light") - layout.prop(rl, "material_override", text="Material") layout.separator() layout.label(text="Include:") @@ -119,11 +129,6 @@ class RENDER_PT_layers(RenderButtonsPanel): col.prop(rl, "edge") col.prop(rl, "strand") - if rl.zmask: - split = layout.split() - split.label(text="Zmask Layers:") - split.column().prop(rl, "zmask_layers", text="") - layout.separator() split = layout.split() @@ -145,28 +150,28 @@ class RENDER_PT_layers(RenderButtonsPanel): col.prop(rl, "pass_diffuse") row = col.row() row.prop(rl, "pass_specular") - row.prop(rl, "pass_specular_exclude", text="", icon='X') + row.prop(rl, "pass_specular_exclude", text="") row = col.row() row.prop(rl, "pass_shadow") - row.prop(rl, "pass_shadow_exclude", text="", icon='X') + row.prop(rl, "pass_shadow_exclude", text="") row = col.row() row.prop(rl, "pass_emit") - row.prop(rl, "pass_emit_exclude", text="", icon='X') + row.prop(rl, "pass_emit_exclude", text="") row = col.row() row.prop(rl, "pass_ao") - row.prop(rl, "pass_ao_exclude", text="", icon='X') + row.prop(rl, "pass_ao_exclude", text="") row = col.row() row.prop(rl, "pass_environment") - row.prop(rl, "pass_environment_exclude", text="", icon='X') + row.prop(rl, "pass_environment_exclude", text="") row = col.row() row.prop(rl, "pass_indirect") - row.prop(rl, "pass_indirect_exclude", text="", icon='X') + row.prop(rl, "pass_indirect_exclude", text="") row = col.row() row.prop(rl, "pass_reflection") - row.prop(rl, "pass_reflection_exclude", text="", icon='X') + row.prop(rl, "pass_reflection_exclude", text="") row = col.row() row.prop(rl, "pass_refraction") - row.prop(rl, "pass_refraction_exclude", text="", icon='X') + row.prop(rl, "pass_refraction_exclude", text="") class RENDER_PT_shading(RenderButtonsPanel): @@ -182,14 +187,14 @@ class RENDER_PT_shading(RenderButtonsPanel): split = layout.split() col = split.column() - col.prop(rd, "render_textures", text="Textures") - col.prop(rd, "render_shadows", text="Shadows") - col.prop(rd, "render_sss", text="Subsurface Scattering") - col.prop(rd, "render_envmaps", text="Environment Map") + col.prop(rd, "use_textures", text="Textures") + col.prop(rd, "use_shadows", text="Shadows") + col.prop(rd, "use_sss", text="Subsurface Scattering") + col.prop(rd, "use_envmaps", text="Environment Map") if wide_ui: col = split.column() - col.prop(rd, "render_raytracing", text="Ray Tracing") + col.prop(rd, "use_raytracing", text="Ray Tracing") col.prop(rd, "color_management") col.prop(rd, "alpha_mode", text="Alpha") @@ -211,7 +216,7 @@ class RENDER_PT_performance(RenderButtonsPanel): col.label(text="Threads:") col.row().prop(rd, "threads_mode", expand=True) sub = col.column() - sub.enabled = rd.threads_mode == 'THREADS_FIXED' + sub.enabled = rd.threads_mode == 'FIXED' sub.prop(rd, "threads") sub = col.column(align=True) sub.label(text="Tiles:") @@ -228,7 +233,7 @@ class RENDER_PT_performance(RenderButtonsPanel): sub.active = rd.use_compositing sub.prop(rd, "free_image_textures") sub = col.column() - sub.active = rd.render_raytracing + sub.active = rd.use_raytracing sub.label(text="Acceleration structure:") sub.prop(rd, "raytrace_structure", text="") if rd.raytrace_structure == 'OCTREE': @@ -305,11 +310,20 @@ class RENDER_PT_output(RenderButtonsPanel): col.prop(rd, "use_overwrite") col.prop(rd, "use_placeholder") - if rd.file_format in ('AVIJPEG', 'JPEG'): + if rd.file_format in ('AVI_JPEG', 'JPEG'): split = layout.split() - split.prop(rd, "quality", slider=True) + split.prop(rd, "file_quality", slider=True) - elif rd.file_format == 'OPENEXR': + elif rd.file_format == 'MULTILAYER': + split = layout.split() + + col = split.column() + col.label(text="Codec:") + col.prop(rd, "exr_codec", text="") + if wide_ui: + col = split.column() + + elif rd.file_format == 'OPEN_EXR': split = layout.split() col = split.column() @@ -355,14 +369,38 @@ class RENDER_PT_output(RenderButtonsPanel): elif rd.file_format == 'QUICKTIME_CARBON': split = layout.split() - split.operator("scene.render_set_quicktime_codec") + split.operator("scene.render_data_set_quicktime_codec") elif rd.file_format == 'QUICKTIME_QTKIT': split = layout.split() col = split.column() - col.prop(rd, "quicktime_codec_type") + col.prop(rd, "quicktime_codec_type", text="Video Codec") col.prop(rd, "quicktime_codec_spatial_quality", text="Quality") + # Audio + col.prop(rd, "quicktime_audiocodec_type", text="Audio Codec") + if rd.quicktime_audiocodec_type != 'No audio': + split = layout.split() + col = split.column() + if rd.quicktime_audiocodec_type == 'LPCM': + col.prop(rd, "quicktime_audio_bitdepth", text="") + if wide_ui: + col = split.column() + col.prop(rd, "quicktime_audio_samplerate", text="") + + split = layout.split() + col = split.column() + if rd.quicktime_audiocodec_type == 'AAC': + col.prop(rd, "quicktime_audio_bitrate") + if wide_ui: + subsplit = split.split() + col = subsplit.column() + if rd.quicktime_audiocodec_type == 'AAC': + col.prop(rd, "quicktime_audio_codec_isvbr") + if wide_ui: + col = subsplit.column() + col.prop(rd, "quicktime_audio_resampling_hq") + class RENDER_PT_encoding(RenderButtonsPanel): bl_label = "Encoding" @@ -379,6 +417,8 @@ class RENDER_PT_encoding(RenderButtonsPanel): rd = context.scene.render wide_ui = context.region.width > narrowui + layout.menu("RENDER_MT_ffmpeg_presets", text="Presets") + split = layout.split() col = split.column() @@ -441,14 +481,14 @@ class RENDER_PT_antialiasing(RenderButtonsPanel): def draw_header(self, context): rd = context.scene.render - self.layout.prop(rd, "antialiasing", text="") + self.layout.prop(rd, "render_antialiasing", text="") def draw(self, context): layout = self.layout rd = context.scene.render wide_ui = context.region.width > narrowui - layout.active = rd.antialiasing + layout.active = rd.render_antialiasing split = layout.split() @@ -482,6 +522,7 @@ class RENDER_PT_motion_blur(RenderButtonsPanel): row = layout.row() row.prop(rd, "motion_blur_samples") + row.prop(rd, "motion_blur_shutter") class RENDER_PT_dimensions(RenderButtonsPanel): @@ -495,10 +536,9 @@ class RENDER_PT_dimensions(RenderButtonsPanel): rd = scene.render wide_ui = context.region.width > narrowui - row = layout.row().split() - sub = row.row(align=True).split(percentage=0.75) - sub.menu("RENDER_MT_presets", text="Presets") - sub.operator("render.preset_add", text="Add") + row = layout.row(align=True) + row.menu("RENDER_MT_presets", text=bpy.types.RENDER_MT_presets.bl_label) + row.operator("render.preset_add", text="", icon="ZOOMIN") split = layout.split() @@ -523,8 +563,8 @@ class RENDER_PT_dimensions(RenderButtonsPanel): col = split.column() sub = col.column(align=True) sub.label(text="Frame Range:") - sub.prop(scene, "start_frame", text="Start") - sub.prop(scene, "end_frame", text="End") + sub.prop(scene, "frame_start", text="Start") + sub.prop(scene, "frame_end", text="End") sub.prop(scene, "frame_step", text="Step") sub.label(text="Frame Rate:") @@ -627,6 +667,7 @@ class RENDER_PT_bake(RenderButtonsPanel): classes = [ RENDER_MT_presets, + RENDER_MT_ffmpeg_presets, RENDER_PT_render, RENDER_PT_layers, RENDER_PT_dimensions, diff --git a/release/scripts/ui/properties_scene.py b/release/scripts/ui/properties_scene.py index 0209140ef4e..06ad1eda835 100644 --- a/release/scripts/ui/properties_scene.py +++ b/release/scripts/ui/properties_scene.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class SceneButtonsPanel(bpy.types.Panel): @@ -96,17 +96,16 @@ class SCENE_PT_keying_sets(SceneButtonsPanel): col.operator("anim.keying_set_remove", icon='ZOOMOUT', text="") ks = scene.active_keying_set - if ks: + if ks and ks.absolute: row = layout.row() col = row.column() col.prop(ks, "name") - col.prop(ks, "absolute") subcol = col.column() subcol.operator_context = 'INVOKE_DEFAULT' op = subcol.operator("anim.keying_set_export", text="Export to File") - op.path = "keyingset.py" + op.filepath = "keyingset.py" if wide_ui: col = row.column() @@ -120,7 +119,7 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel): bl_label = "Active Keying Set" def poll(self, context): - return (context.scene.active_keying_set is not None) + return (context.scene.active_keying_set and context.scene.active_keying_set.absolute) def draw(self, context): layout = self.layout @@ -164,6 +163,11 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel): if ksp.grouping == 'NAMED': col.prop(ksp, "group") + col.label(text="Keyframing Settings:") + col.prop(ksp, "insertkey_needed", text="Needed") + col.prop(ksp, "insertkey_visual", text="Visual") + col.prop(ksp, "insertkey_xyz_to_rgb", text="XYZ to RGB") + class SCENE_PT_physics(SceneButtonsPanel): bl_label = "Gravity" @@ -225,18 +229,16 @@ class ANIM_OT_keying_set_export(bpy.types.Operator): bl_idname = "anim.keying_set_export" bl_label = "Export Keying Set..." - path = bpy.props.StringProperty(name="File Path", description="File path to write file to.") - filename = bpy.props.StringProperty(name="File Name", description="Name of the file.") - directory = bpy.props.StringProperty(name="Directory", description="Directory of the file.") + filepath = bpy.props.StringProperty(name="File Path", description="Filepath to write file to.") filter_folder = bpy.props.BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) filter_text = bpy.props.BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) filter_python = bpy.props.BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) def execute(self, context): - if not self.properties.path: - raise Exception("File path not set.") + if not self.properties.filepath: + raise Exception("Filepath not set.") - f = open(self.properties.path, "w") + f = open(self.properties.filepath, "w") if not f: raise Exception("Could not open file.") @@ -295,9 +297,9 @@ class ANIM_OT_keying_set_export(bpy.types.Operator): # write paths f.write("# Path Definitions\n") for ksp in ks.paths: - f.write("ksp = ks.add_destination(") + f.write("ksp = ks.paths.add(") - # id-block + RNA-path + # id-block + data_path if ksp.id: # find the relevant shorthand from the cache id_bpy_path = id_to_paths_cache[ksp.id][0] @@ -306,8 +308,10 @@ class ANIM_OT_keying_set_export(bpy.types.Operator): f.write("%s, '%s'" % (id_bpy_path, ksp.data_path)) # array index settings (if applicable) - if ksp.entire_array is False: - f.write(", entire_array=False, array_index=%d" % ksp.array_index) + if ksp.entire_array: + f.write(", index=-1") + else: + f.write(", index=%d" % ksp.array_index) # grouping settings (if applicable) # NOTE: the current default is KEYINGSET, but if this changes, change this code too diff --git a/release/scripts/ui/properties_texture.py b/release/scripts/ui/properties_texture.py index 8794b19bd4d..2bfbe188c9e 100644 --- a/release/scripts/ui/properties_texture.py +++ b/release/scripts/ui/properties_texture.py @@ -20,24 +20,38 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check -def active_node_mat(mat): - if mat: - mat_node = mat.active_node_material - if mat_node: - return mat_node - else: - return mat +class TEXTURE_MT_specials(bpy.types.Menu): + bl_label = "Texture Specials" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} - return None + def draw(self, context): + layout = self.layout + + layout.operator("texture.slot_copy", icon='COPYDOWN') + layout.operator("texture.slot_paste", icon='PASTEDOWN') + + +class TEXTURE_MT_envmap_specials(bpy.types.Menu): + bl_label = "Environment Map Specials" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + + layout.operator("texture.envmap_save", icon='IMAGEFILE') + layout.operator("texture.envmap_clear", icon='FILE_REFRESH') + layout.operator("texture.envmap_clear_all", icon='FILE_REFRESH') + +from properties_material import active_node_mat def context_tex_datablock(context): - idblock = active_node_mat(context.material) + idblock = context.material if idblock: - return idblock + return active_node_mat(idblock) idblock = context.lamp if idblock: @@ -58,18 +72,21 @@ class TextureButtonsPanel(bpy.types.Panel): def poll(self, context): tex = context.texture - return (tex and (tex.type != 'NONE' or tex.use_nodes)) + if not tex: + return False + engine = context.scene.render.engine + return (tex.type != 'NONE' or tex.use_nodes) and (engine in self.COMPAT_ENGINES) class TEXTURE_PT_preview(TextureButtonsPanel): bl_label = "Preview" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout tex = context.texture - slot = context.texture_slot - + slot = getattr(context, "texture_slot", None) idblock = context_tex_datablock(context) if idblock: @@ -81,9 +98,14 @@ class TEXTURE_PT_preview(TextureButtonsPanel): class TEXTURE_PT_context_texture(TextureButtonsPanel): bl_label = "" bl_show_header = False + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): - return (context.material or context.world or context.lamp or context.brush or context.texture) + engine = context.scene.render.engine + if not hasattr(context, "texture_slot"): + return False + return ((context.material or context.world or context.lamp or context.brush or context.texture) + and (engine in self.COMPAT_ENGINES)) def draw(self, context): layout = self.layout @@ -103,6 +125,7 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel): col = row.column(align=True) col.operator("texture.slot_move", text="", icon='TRIA_UP').type = 'UP' col.operator("texture.slot_move", text="", icon='TRIA_DOWN').type = 'DOWN' + col.menu("TEXTURE_MT_specials", icon='DOWNARROW_HLT', text="") if wide_ui: split = layout.split(percentage=0.65) @@ -145,14 +168,17 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel): class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel): _context_path = "texture" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): # use alternate poll since NONE texture type is ok - return context.texture + engine = context.scene.render.engine + return context.texture and (engine in self.COMPAT_ENGINES) class TEXTURE_PT_colors(TextureButtonsPanel): bl_label = "Colors" bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -178,19 +204,36 @@ class TEXTURE_PT_colors(TextureButtonsPanel): col.label(text="Adjust:") col.prop(tex, "brightness") col.prop(tex, "contrast") + col.prop(tex, "saturation") # Texture Slot Panels # class TextureSlotPanel(TextureButtonsPanel): + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): - return (context.texture_slot and - TextureButtonsPanel.poll(self, context)) + if not hasattr(context, "texture_slot"): + return False + + engine = context.scene.render.engine + return TextureButtonsPanel.poll(self, context) and (engine in self.COMPAT_ENGINES) class TEXTURE_PT_mapping(TextureSlotPanel): bl_label = "Mapping" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def poll(self, context): + idblock = context_tex_datablock(context) + if type(idblock) == bpy.types.Brush and not context.sculpt_object: + return False + + if not getattr(context, "texture_slot", None): + return False + + engine = context.scene.render.engine + return (engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -231,15 +274,13 @@ class TEXTURE_PT_mapping(TextureSlotPanel): split.prop(tex, "object", text="") if type(idblock) == bpy.types.Brush: - layout.prop(tex, "map_mode", expand=True) + if context.sculpt_object: + layout.label(text="Brush Mapping:") + layout.prop(tex, "map_mode", expand=True) - row = layout.row() - row.active = tex.map_mode in ('FIXED', 'TILED') - row.prop(tex, "angle") - - row = layout.row() - row.active = tex.map_mode in ('TILED', '3D') - row.column().prop(tex, "size") + row = layout.row() + row.active = tex.map_mode in ('FIXED', 'TILED') + row.prop(tex, "angle") else: if type(idblock) == bpy.types.Material: split = layout.split(percentage=0.3) @@ -263,26 +304,33 @@ class TEXTURE_PT_mapping(TextureSlotPanel): row.prop(tex, "y_mapping", text="") row.prop(tex, "z_mapping", text="") - # any non brush - split = layout.split() + split = layout.split() + col = split.column() + col.prop(tex, "offset") + + if wide_ui: col = split.column() - col.prop(tex, "offset") + else: + col.separator() - if wide_ui: - col = split.column() - col.prop(tex, "size") + col.prop(tex, "size") class TEXTURE_PT_influence(TextureSlotPanel): bl_label = "Influence" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): idblock = context_tex_datablock(context) if type(idblock) == bpy.types.Brush: return False - return context.texture_slot + if not getattr(context, "texture_slot", None): + return False + + engine = context.scene.render.engine + return (engine in self.COMPAT_ENGINES) def draw(self, context): @@ -326,7 +374,8 @@ class TEXTURE_PT_influence(TextureSlotPanel): factor_but(col, tex.map_raymir, "map_raymir", "raymir_factor", "Ray Mirror") col.label(text="Geometry:") - factor_but(col, tex.map_normal, "map_normal", "normal_factor", "Normal") + # XXX replace 'or' when displacement is fixed to not rely on normal influence value. + factor_but(col, (tex.map_normal or tex.map_displacement), "map_normal", "normal_factor", "Normal") factor_but(col, tex.map_warp, "map_warp", "warp_factor", "Warp") factor_but(col, tex.map_displacement, "map_displacement", "displacement_factor", "Displace") @@ -345,7 +394,7 @@ class TEXTURE_PT_influence(TextureSlotPanel): if wide_ui: col = split.column() col.label(text=" ") - factor_but(col, tex.map_alpha, "map_coloremission", "coloremission_factor", "Emission Color") + factor_but(col, tex.map_coloremission, "map_coloremission", "coloremission_factor", "Emission Color") factor_but(col, tex.map_colortransmission, "map_colortransmission", "colortransmission_factor", "Transmission Color") factor_but(col, tex.map_colorreflection, "map_colorreflection", "colorreflection_factor", "Reflection Color") @@ -394,15 +443,18 @@ class TEXTURE_PT_influence(TextureSlotPanel): class TextureTypePanel(TextureButtonsPanel): + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): tex = context.texture - return (tex and tex.type == self.tex_type and not tex.use_nodes) + engine = context.scene.render.engine + return ((tex and tex.type == self.tex_type and not tex.use_nodes) and (engine in self.COMPAT_ENGINES)) class TEXTURE_PT_clouds(TextureTypePanel): bl_label = "Clouds" tex_type = 'CLOUDS' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -432,6 +484,7 @@ class TEXTURE_PT_clouds(TextureTypePanel): class TEXTURE_PT_wood(TextureTypePanel): bl_label = "Wood" tex_type = 'WOOD' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -468,6 +521,7 @@ class TEXTURE_PT_wood(TextureTypePanel): class TEXTURE_PT_marble(TextureTypePanel): bl_label = "Marble" tex_type = 'MARBLE' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -499,6 +553,7 @@ class TEXTURE_PT_marble(TextureTypePanel): class TEXTURE_PT_magic(TextureTypePanel): bl_label = "Magic" tex_type = 'MAGIC' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -519,6 +574,7 @@ class TEXTURE_PT_magic(TextureTypePanel): class TEXTURE_PT_blend(TextureTypePanel): bl_label = "Blend" tex_type = 'BLEND' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -540,6 +596,7 @@ class TEXTURE_PT_blend(TextureTypePanel): class TEXTURE_PT_stucci(TextureTypePanel): bl_label = "Stucci" tex_type = 'STUCCI' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -568,6 +625,7 @@ class TEXTURE_PT_stucci(TextureTypePanel): class TEXTURE_PT_image(TextureTypePanel): bl_label = "Image" tex_type = 'IMAGE' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -577,10 +635,24 @@ class TEXTURE_PT_image(TextureTypePanel): layout.template_image(tex, "image", tex.image_user) +def texture_filter_common(tex, layout): + layout.label(text="Filter:") + layout.prop(tex, "filter", text="") + if tex.mipmap and tex.filter in ('AREA', 'EWA', 'FELINE'): + if tex.filter == 'FELINE': + layout.prop(tex, "filter_probes", text="Probes") + else: + layout.prop(tex, "filter_eccentricity", text="Eccentricity") + + layout.prop(tex, "filter_size") + layout.prop(tex, "filter_size_minimum") + + class TEXTURE_PT_image_sampling(TextureTypePanel): bl_label = "Image Sampling" bl_default_closed = True tex_type = 'IMAGE' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -608,28 +680,20 @@ class TEXTURE_PT_image_sampling(TextureTypePanel): row.active = tex.normal_map row.prop(tex, "normal_space", text="") - col.label(text="Filter:") - col.prop(tex, "filter", text="") - col.prop(tex, "filter_size") - col.prop(tex, "filter_size_minimum") col.prop(tex, "mipmap") - row = col.row() row.active = tex.mipmap row.prop(tex, "mipmap_gauss") - col.prop(tex, "interpolation") - if tex.mipmap and tex.filter != 'DEFAULT': - if tex.filter == 'FELINE': - col.prop(tex, "filter_probes", text="Probes") - else: - col.prop(tex, "filter_eccentricity", text="Eccentricity") + + texture_filter_common(tex, col) class TEXTURE_PT_image_mapping(TextureTypePanel): bl_label = "Image Mapping" bl_default_closed = True tex_type = 'IMAGE' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -687,6 +751,7 @@ class TEXTURE_PT_image_mapping(TextureTypePanel): class TEXTURE_PT_plugin(TextureTypePanel): bl_label = "Plugin" tex_type = 'PLUGIN' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -699,18 +764,62 @@ class TEXTURE_PT_plugin(TextureTypePanel): class TEXTURE_PT_envmap(TextureTypePanel): bl_label = "Environment Map" tex_type = 'ENVIRONMENT_MAP' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout - # tex = context.texture + tex = context.texture + env = tex.environment_map - layout.label(text="Nothing yet") + wide_ui = context.region.width > narrowui + + row = layout.row() + row.prop(env, "source", expand=True) + row.menu("TEXTURE_MT_envmap_specials", icon='DOWNARROW_HLT', text="") + + if env.source == 'IMAGE_FILE': + layout.template_ID(tex, "image", open="image.open") + layout.template_image(tex, "image", tex.image_user, compact=True) + else: + layout.prop(env, "mapping") + if env.mapping == 'PLANE': + layout.prop(env, "zoom") + layout.prop(env, "viewpoint_object") + + split = layout.split() + + col = split.column() + col.prop(env, "ignore_layers") + col.prop(env, "resolution") + col.prop(env, "depth") + + if wide_ui: + col = split.column(align=True) + + col.label(text="Clipping:") + col.prop(env, "clip_start", text="Start") + col.prop(env, "clip_end", text="End") + + +class TEXTURE_PT_envmap_sampling(TextureTypePanel): + bl_label = "Environment Map Sampling" + bl_default_closed = True + tex_type = 'ENVIRONMENT_MAP' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + + tex = context.texture + + texture_filter_common(tex, layout) class TEXTURE_PT_musgrave(TextureTypePanel): bl_label = "Musgrave" tex_type = 'MUSGRAVE' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -758,6 +867,7 @@ class TEXTURE_PT_musgrave(TextureTypePanel): class TEXTURE_PT_voronoi(TextureTypePanel): bl_label = "Voronoi" tex_type = 'VORONOI' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -801,6 +911,7 @@ class TEXTURE_PT_voronoi(TextureTypePanel): class TEXTURE_PT_distortednoise(TextureTypePanel): bl_label = "Distorted Noise" tex_type = 'DISTORTED_NOISE' + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def draw(self, context): layout = self.layout @@ -828,10 +939,12 @@ class TEXTURE_PT_distortednoise(TextureTypePanel): class TEXTURE_PT_voxeldata(TextureButtonsPanel): bl_label = "Voxel Data" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): tex = context.texture - return (tex and tex.type == 'VOXEL_DATA') + engine = context.scene.render.engine + return (tex and tex.type == 'VOXEL_DATA' and (engine in self.COMPAT_ENGINES)) def draw(self, context): layout = self.layout @@ -848,7 +961,9 @@ class TEXTURE_PT_voxeldata(TextureButtonsPanel): layout.prop(vd, "domain_object") layout.prop(vd, "smoke_data_type") elif vd.file_format == 'IMAGE_SEQUENCE': - layout.template_image(tex, "image", tex.image_user) + layout.template_ID(tex, "image", open="image.open") + layout.template_image(tex, "image", tex.image_user, compact=True) + #layout.prop(vd, "frames") layout.prop(vd, "still") row = layout.row() @@ -862,10 +977,12 @@ class TEXTURE_PT_voxeldata(TextureButtonsPanel): class TEXTURE_PT_pointdensity(TextureButtonsPanel): bl_label = "Point Density" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): tex = context.texture - return (tex and tex.type == 'POINT_DENSITY') + engine = context.scene.render.engine + return (tex and tex.type == 'POINT_DENSITY' and (engine in self.COMPAT_ENGINES)) def draw(self, context): layout = self.layout @@ -920,10 +1037,12 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel): class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel): bl_label = "Turbulence" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} def poll(self, context): tex = context.texture - return (tex and tex.type == 'POINT_DENSITY') + engine = context.scene.render.engine + return (tex and tex.type == 'POINT_DENSITY' and (engine in self.COMPAT_ENGINES)) def draw_header(self, context): layout = self.layout @@ -958,6 +1077,9 @@ class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel): classes = [ + TEXTURE_MT_specials, + TEXTURE_MT_envmap_specials, + TEXTURE_PT_context_texture, TEXTURE_PT_preview, @@ -972,6 +1094,7 @@ classes = [ TEXTURE_PT_image_mapping, TEXTURE_PT_plugin, TEXTURE_PT_envmap, + TEXTURE_PT_envmap_sampling, TEXTURE_PT_musgrave, TEXTURE_PT_voronoi, TEXTURE_PT_distortednoise, diff --git a/release/scripts/ui/properties_world.py b/release/scripts/ui/properties_world.py index 1ee47e942a0..e63d513a4b5 100644 --- a/release/scripts/ui/properties_world.py +++ b/release/scripts/ui/properties_world.py @@ -20,7 +20,7 @@ import bpy from rna_prop_ui import PropertyPanel -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class WorldButtonsPanel(bpy.types.Panel): @@ -111,14 +111,14 @@ class WORLD_PT_mist(WorldButtonsPanel): def draw_header(self, context): world = context.world - self.layout.prop(world.mist, "enabled", text="") + self.layout.prop(world.mist, "use_mist", text="") def draw(self, context): layout = self.layout wide_ui = context.region.width > narrowui world = context.world - layout.active = world.mist.enabled + layout.active = world.mist.use_mist split = layout.split() @@ -142,14 +142,14 @@ class WORLD_PT_stars(WorldButtonsPanel): def draw_header(self, context): world = context.world - self.layout.prop(world.stars, "enabled", text="") + self.layout.prop(world.stars, "use_stars", text="") def draw(self, context): layout = self.layout wide_ui = context.region.width > narrowui world = context.world - layout.active = world.stars.enabled + layout.active = world.stars.use_stars split = layout.split() diff --git a/release/scripts/ui/space_buttons.py b/release/scripts/ui/space_buttons.py index 019f751449f..9fc30a8189b 100644 --- a/release/scripts/ui/space_buttons.py +++ b/release/scripts/ui/space_buttons.py @@ -38,7 +38,7 @@ class Buttons_HT_header(bpy.types.Header): row = layout.row() row.prop(so, "buttons_context", expand=True, text="") - row.prop(scene, "current_frame") + row.prop(scene, "frame_current") class Buttons_MT_view(bpy.types.Menu): diff --git a/release/scripts/ui/space_dopesheet.py b/release/scripts/ui/space_dopesheet.py index 1dc8ffd1af9..41917acd997 100644 --- a/release/scripts/ui/space_dopesheet.py +++ b/release/scripts/ui/space_dopesheet.py @@ -77,6 +77,7 @@ class DOPESHEET_MT_view(bpy.types.Menu): layout.prop(st, "show_cframe_indicator") layout.prop(st, "show_sliders") layout.prop(st, "automerge_keyframes") + layout.prop(st, "use_marker_sync") if st.show_seconds: layout.operator("anim.time_toggle", text="Show Frames") @@ -123,6 +124,9 @@ class DOPESHEET_MT_select(bpy.types.Menu): layout.operator("action.select_more") layout.operator("action.select_less") + layout.separator() + layout.operator("action.select_linked") + class DOPESHEET_MT_channel(bpy.types.Menu): bl_label = "Channel" @@ -154,8 +158,8 @@ class DOPESHEET_MT_key(bpy.types.Menu): layout.column() layout.menu("DOPESHEET_MT_key_transform", text="Transform") - layout.operator_menu_enum("action.snap", property="type", text="Snap") - layout.operator_menu_enum("action.mirror", property="type", text="Mirror") + layout.operator_menu_enum("action.snap", "type", text="Snap") + layout.operator_menu_enum("action.mirror", "type", text="Mirror") layout.separator() layout.operator("action.keyframe_insert") @@ -165,10 +169,10 @@ class DOPESHEET_MT_key(bpy.types.Menu): layout.operator("action.delete") layout.separator() - layout.operator_menu_enum("action.keyframe_type", property="type", text="Keyframe Type") - layout.operator_menu_enum("action.handle_type", property="type", text="Handle Type") - layout.operator_menu_enum("action.interpolation_type", property="type", text="Interpolation Mode") - layout.operator_menu_enum("action.extrapolation_type", property="type", text="Extrapolation Mode") + layout.operator_menu_enum("action.keyframe_type", "type", text="Keyframe Type") + layout.operator_menu_enum("action.handle_type", "type", text="Handle Type") + layout.operator_menu_enum("action.interpolation_type", "type", text="Interpolation Mode") + layout.operator_menu_enum("action.extrapolation_type", "type", text="Extrapolation Mode") layout.separator() layout.operator("action.clean") @@ -186,9 +190,10 @@ class DOPESHEET_MT_key_transform(bpy.types.Menu): layout = self.layout layout.column() - layout.operator("transform.translate", text="Grab/Move") + layout.operator("transform.transform", text="Grab/Move").mode = 'TIME_TRANSLATE' layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND' - layout.operator("transform.resize", text="Scale") + layout.operator("transform.transform", text="Slide").mode = 'TIME_SLIDE' + layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE' classes = [ diff --git a/release/scripts/ui/space_graph.py b/release/scripts/ui/space_graph.py index 64f6337177e..1533b891202 100644 --- a/release/scripts/ui/space_graph.py +++ b/release/scripts/ui/space_graph.py @@ -114,6 +114,7 @@ class GRAPH_MT_select(bpy.types.Menu): layout.separator() layout.operator("graph.select_border") layout.operator("graph.select_border", text="Border Axis Range").axis_range = True + layout.operator("graph.select_border", text="Border (Include Handles)").include_handles = True layout.separator() layout.operator("graph.select_column", text="Columns on Selected Keys").mode = 'KEYS' @@ -126,6 +127,9 @@ class GRAPH_MT_select(bpy.types.Menu): layout.operator("graph.select_more") layout.operator("graph.select_less") + layout.separator() + layout.operator("graph.select_linked") + class GRAPH_MT_channel(bpy.types.Menu): bl_label = "Channel" @@ -142,6 +146,7 @@ class GRAPH_MT_channel(bpy.types.Menu): layout.separator() layout.operator("anim.channels_editable_toggle") + layout.operator("anim.channels_visibility_set") layout.separator() layout.operator("anim.channels_expand") @@ -160,8 +165,8 @@ class GRAPH_MT_key(bpy.types.Menu): layout.column() layout.menu("GRAPH_MT_key_transform", text="Transform") - layout.operator_menu_enum("graph.snap", property="type", text="Snap") - layout.operator_menu_enum("graph.mirror", property="type", text="Mirror") + layout.operator_menu_enum("graph.snap", "type", text="Snap") + layout.operator_menu_enum("graph.mirror", "type", text="Mirror") layout.separator() layout.operator("graph.keyframe_insert") @@ -172,9 +177,9 @@ class GRAPH_MT_key(bpy.types.Menu): layout.operator("graph.delete") layout.separator() - layout.operator_menu_enum("graph.handle_type", property="type", text="Handle Type") - layout.operator_menu_enum("graph.interpolation_type", property="type", text="Interpolation Mode") - layout.operator_menu_enum("graph.extrapolation_type", property="type", text="Extrapolation Mode") + layout.operator_menu_enum("graph.handle_type", "type", text="Handle Type") + layout.operator_menu_enum("graph.interpolation_type", "type", text="Interpolation Mode") + layout.operator_menu_enum("graph.extrapolation_type", "type", text="Extrapolation Mode") layout.separator() layout.operator("graph.clean") diff --git a/release/scripts/ui/space_image.py b/release/scripts/ui/space_image.py index 3fd7025a4f7..e9c963db7b3 100644 --- a/release/scripts/ui/space_image.py +++ b/release/scripts/ui/space_image.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -narrowui = 180 +narrowui = bpy.context.user_preferences.view.properties_width_check class IMAGE_MT_view(bpy.types.Menu): @@ -29,7 +29,7 @@ class IMAGE_MT_view(bpy.types.Menu): layout = self.layout sima = context.space_data - # uv = sima.uv_editor + uv = sima.uv_editor toolsettings = context.tool_settings show_uvedit = sima.show_uvedit @@ -42,6 +42,7 @@ class IMAGE_MT_view(bpy.types.Menu): layout.prop(sima, "update_automatically") if show_uvedit: layout.prop(toolsettings, "uv_local_view") # Numpad / + layout.prop(uv, "draw_other_objects") layout.separator() @@ -111,10 +112,13 @@ class IMAGE_MT_image(bpy.types.Menu): layout.operator("image.save") layout.operator("image.save_as") + layout.operator("image.save_as", text="Save a Copy").copy = True if ima.source == 'SEQUENCE': layout.operator("image.save_sequence") + layout.operator("image.external_edit", "Edit Externally") + if not show_render: layout.separator() @@ -141,8 +145,8 @@ class IMAGE_MT_uvs_showhide(bpy.types.Menu): layout = self.layout layout.operator("uv.reveal") - layout.operator("uv.hide") - layout.operator("uv.hide").unselected = True + layout.operator("uv.hide", text="Hide Selected") + layout.operator("uv.hide", text="Hide Unselected").unselected = True class IMAGE_MT_uvs_transform(bpy.types.Menu): @@ -250,7 +254,7 @@ class IMAGE_HT_header(bpy.types.Header): iuser = sima.image_user toolsettings = context.tool_settings - # show_render = sima.show_render + show_render = sima.show_render # show_paint = sima.show_paint show_uvedit = sima.show_uvedit @@ -274,6 +278,8 @@ class IMAGE_HT_header(bpy.types.Header): sub.menu("IMAGE_MT_uvs") layout.template_ID(sima, "image", new="image.new") + if not show_render: + layout.prop(sima, "image_pin", text="") # uv editing if show_uvedit: @@ -340,7 +346,7 @@ class IMAGE_PT_image_properties(bpy.types.Panel): # ima = sima.image iuser = sima.image_user - layout.template_image(sima, "image", iuser, compact=True) + layout.template_image(sima, "image", iuser) class IMAGE_PT_game_properties(bpy.types.Panel): @@ -402,7 +408,81 @@ class IMAGE_PT_view_histogram(bpy.types.Panel): sima = context.space_data - layout.template_histogram(sima, "histogram") + layout.template_histogram(sima.scopes, "histogram") + layout.prop(sima.scopes.histogram, "mode", icon_only=True) + + +class IMAGE_PT_view_waveform(bpy.types.Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'PREVIEW' + bl_label = "Waveform" + + def poll(self, context): + sima = context.space_data + return (sima and sima.image) + + def draw(self, context): + layout = self.layout + + sima = context.space_data + layout.template_waveform(sima, "scopes") + sub = layout.row().split(percentage=0.75) + sub.prop(sima.scopes, "waveform_alpha") + sub.prop(sima.scopes, "waveform_mode", text="", icon_only=True) + + +class IMAGE_PT_view_vectorscope(bpy.types.Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'PREVIEW' + bl_label = "Vectorscope" + + def poll(self, context): + sima = context.space_data + return (sima and sima.image) + + def draw(self, context): + layout = self.layout + + sima = context.space_data + layout.template_vectorscope(sima, "scopes") + layout.prop(sima.scopes, "vectorscope_alpha") + + +class IMAGE_PT_sample_line(bpy.types.Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'PREVIEW' + bl_label = "Sample Line" + + def poll(self, context): + sima = context.space_data + return (sima and sima.image) + + def draw(self, context): + layout = self.layout + layout.operator("image.sample_line") + sima = context.space_data + layout.template_histogram(sima, "sample_histogram") + layout.prop(sima.sample_histogram, "mode") + + +class IMAGE_PT_scope_sample(bpy.types.Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'PREVIEW' + bl_label = "Scope Samples" + + def poll(self, context): + sima = context.space_data + return sima + + def draw(self, context): + layout = self.layout + sima = context.space_data + split = layout.split() + row = split.row() + row.prop(sima.scopes, "use_full_resolution") + row = split.row() + row.active = not sima.scopes.use_full_resolution + row.prop(sima.scopes, "accuracy") class IMAGE_PT_view_properties(bpy.types.Panel): @@ -442,6 +522,9 @@ class IMAGE_PT_view_properties(bpy.types.Panel): if show_uvedit: + col = layout.column() + col.prop(uvedit, "cursor_location") + col = layout.column() col.label(text="UVs:") row = col.row() @@ -570,7 +653,7 @@ class IMAGE_PT_paint_curve(bpy.types.Panel): brush = toolsettings.brush layout.template_curve_mapping(brush, "curve") - layout.operator_menu_enum("brush.curve_preset", property="shape") + layout.operator_menu_enum("brush.curve_preset", "shape") classes = [ @@ -590,7 +673,11 @@ classes = [ IMAGE_PT_paint_curve, IMAGE_PT_game_properties, IMAGE_PT_view_properties, - IMAGE_PT_view_histogram] + IMAGE_PT_view_histogram, + IMAGE_PT_view_waveform, + IMAGE_PT_view_vectorscope, + IMAGE_PT_sample_line, + IMAGE_PT_scope_sample] def register(): diff --git a/release/scripts/ui/space_info.py b/release/scripts/ui/space_info.py index e1bc8f2b226..ca8371b85fe 100644 --- a/release/scripts/ui/space_info.py +++ b/release/scripts/ui/space_info.py @@ -25,7 +25,7 @@ class INFO_HT_header(bpy.types.Header): def draw(self, context): layout = self.layout - + wm = context.manager if wm and len(wm.operators): last_op = wm.operators[-1] @@ -64,11 +64,10 @@ class INFO_HT_header(bpy.types.Header): layout.separator() layout.template_running_jobs() - - if last_op and last_op.has_reports: - layout.template_reports_banner(last_op) - else: - layout.label(text=scene.statistics()) + + layout.template_reports_banner() + + layout.label(text=scene.statistics()) # XXX: this should be right-aligned to the RHS of the region layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER', text="") @@ -85,7 +84,7 @@ class INFO_MT_file(bpy.types.Menu): layout.operator_context = 'INVOKE_AREA' layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER') layout.menu("INFO_MT_file_open_recent") - layout.operator("wm.recover_last_session") + layout.operator("wm.recover_last_session", icon='RECOVER_LAST') layout.operator("wm.recover_auto_save", text="Recover Auto Save...") layout.separator() @@ -106,7 +105,9 @@ class INFO_MT_file(bpy.types.Menu): layout.operator_context = 'INVOKE_AREA' layout.operator("wm.link_append", text="Link") - layout.operator("wm.link_append", text="Append").link = False + props = layout.operator("wm.link_append", text="Append") + props.link = False + props.instance_groups = False layout.separator() @@ -123,27 +124,6 @@ class INFO_MT_file(bpy.types.Menu): layout.operator("wm.exit_blender", text="Quit", icon='QUIT') -class INFO_MT_file_open_recent(bpy.types.Menu): - bl_idname = "INFO_MT_file_open_recent" - bl_label = "Open Recent..." - - def draw(self, context): - import os - layout = self.layout - layout.operator_context = 'EXEC_AREA' - - path = os.path.join(bpy.app.home, ".Blog") - - if os.path.isfile(path): - file = open(path, "rU") - for line in file: - line = line.rstrip() - layout.operator("wm.open_mainfile", text=line, icon='FILE_BLEND').path = line - file.close() - else: - layout.label(text='No recent files') - - class INFO_MT_file_import(bpy.types.Menu): bl_idname = "INFO_MT_file_import" bl_label = "Import" @@ -198,6 +178,35 @@ class INFO_MT_mesh_add(bpy.types.Menu): layout.operator("mesh.primitive_monkey_add", icon='MESH_MONKEY', text="Monkey") +class INFO_MT_curve_add(bpy.types.Menu): + bl_idname = "INFO_MT_curve_add" + bl_label = "Curve" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("curve.primitive_bezier_curve_add", icon='CURVE_BEZCURVE', text="Bezier") + layout.operator("curve.primitive_bezier_circle_add", icon='CURVE_BEZCIRCLE', text="Circle") + layout.operator("curve.primitive_nurbs_curve_add", icon='CURVE_NCURVE', text="Nurbs Curve") + layout.operator("curve.primitive_nurbs_circle_add", icon='CURVE_NCIRCLE', text="Nurbs Circle") + layout.operator("curve.primitive_nurbs_path_add", icon='CURVE_PATH', text="Path") + + +class INFO_MT_surface_add(bpy.types.Menu): + bl_idname = "INFO_MT_surface_add" + bl_label = "Surface" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("surface.primitive_nurbs_surface_curve_add", icon='SURFACE_NCURVE', text="NURBS Curve") + layout.operator("surface.primitive_nurbs_surface_circle_add", icon='SURFACE_NCIRCLE', text="NURBS Circle") + layout.operator("surface.primitive_nurbs_surface_surface_add", icon='SURFACE_NSURFACE', text="NURBS Surface") + layout.operator("surface.primitive_nurbs_surface_tube_add", icon='SURFACE_NTUBE', text="NURBS Tube") + layout.operator("surface.primitive_nurbs_surface_sphere_add", icon='SURFACE_NSPHERE', text="NURBS Sphere") + layout.operator("surface.primitive_nurbs_surface_donut_add", icon='SURFACE_NDONUT', text="NURBS Torus") + + class INFO_MT_armature_add(bpy.types.Menu): bl_idname = "INFO_MT_armature_add" bl_label = "Armature" @@ -219,9 +228,11 @@ class INFO_MT_add(bpy.types.Menu): #layout.operator_menu_enum("object.mesh_add", "type", text="Mesh", icon='OUTLINER_OB_MESH') layout.menu("INFO_MT_mesh_add", icon='OUTLINER_OB_MESH') - layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE') - layout.operator_menu_enum("object.surface_add", "type", text="Surface", icon='OUTLINER_OB_SURFACE') - layout.operator_menu_enum("object.metaball_add", "type", 'META', text="Metaball", icon='OUTLINER_OB_META') + #layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE') + layout.menu("INFO_MT_curve_add", icon='OUTLINER_OB_CURVE') + #layout.operator_menu_enum("object.surface_add", "type", text="Surface", icon='OUTLINER_OB_SURFACE') + layout.menu("INFO_MT_surface_add", icon='OUTLINER_OB_SURFACE') + layout.operator_menu_enum("object.metaball_add", "type", text="Metaball", icon='OUTLINER_OB_META') layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT') layout.separator() @@ -233,17 +244,17 @@ class INFO_MT_add(bpy.types.Menu): layout.operator("object.camera_add", text="Camera", icon='OUTLINER_OB_CAMERA') layout.operator_context = 'EXEC_SCREEN' - layout.operator_menu_enum("object.lamp_add", "type", 'LAMP', text="Lamp", icon='OUTLINER_OB_LAMP') + layout.operator_menu_enum("object.lamp_add", "type", text="Lamp", icon='OUTLINER_OB_LAMP') layout.separator() - layout.operator_menu_enum("object.effector_add", "type", 'EMPTY', text="Force Field", icon='OUTLINER_OB_EMPTY') + layout.operator_menu_enum("object.effector_add", "type", text="Force Field", icon='OUTLINER_OB_EMPTY') layout.separator() if(len(bpy.data.groups) > 10): layout.operator_context = 'INVOKE_DEFAULT' - layout.operator("object.group_instance_add", "type", text="Group Instance...", icon='OUTLINER_OB_EMPTY') + layout.operator("object.group_instance_add", text="Group Instance...", icon='OUTLINER_OB_EMPTY') else: - layout.operator_menu_enum("object.group_instance_add", "type", text="Group Instance", icon='OUTLINER_OB_EMPTY') + layout.operator_menu_enum("object.group_instance_add", "group", text="Group Instance", icon='OUTLINER_OB_EMPTY') class INFO_MT_game(bpy.types.Menu): @@ -263,6 +274,8 @@ class INFO_MT_game(bpy.types.Menu): layout.prop(gs, "show_physics_visualization") layout.prop(gs, "use_deprecation_warnings") layout.prop(gs, "use_animation_record") + layout.separator() + layout.prop(gs, "auto_start") class INFO_MT_render(bpy.types.Menu): @@ -273,18 +286,18 @@ class INFO_MT_render(bpy.types.Menu): # rd = context.scene.render - layout.operator("screen.render", text="Render Image", icon='RENDER_STILL') - layout.operator("screen.render", text="Render Animation", icon='RENDER_ANIMATION').animation = True + layout.operator("render.render", text="Render Image", icon='RENDER_STILL') + layout.operator("render.render", text="Render Animation", icon='RENDER_ANIMATION').animation = True layout.separator() - layout.operator("screen.opengl_render", text="OpenGL Render Image") - layout.operator("screen.opengl_render", text="OpenGL Render Animation").animation = True + layout.operator("render.opengl", text="OpenGL Render Image") + layout.operator("render.opengl", text="OpenGL Render Animation").animation = True layout.separator() - layout.operator("screen.render_view_show") - layout.operator("screen.play_rendered_anim") + layout.operator("render.view_show") + layout.operator("render.play_rendered_anim") class INFO_MT_help(bpy.types.Menu): @@ -293,92 +306,30 @@ class INFO_MT_help(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.operator("help.manual", icon='HELP') - layout.operator("help.release_logs", icon='URL') + layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual' + layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-250/' layout.separator() - layout.operator("help.blender_website", icon='URL') - layout.operator("help.blender_eshop", icon='URL') - layout.operator("help.developer_community", icon='URL') - layout.operator("help.user_community", icon='URL') + layout.operator("wm.url_open", text="Blender Website", icon='URL').url = 'http://www.blender.org/' + layout.operator("wm.url_open", text="Blender e-Shop", icon='URL').url = 'http://www.blender.org/e-shop' + layout.operator("wm.url_open", text="Developer Community", icon='URL').url = 'http://www.blender.org/community/get-involved/' + layout.operator("wm.url_open", text="User Community", icon='URL').url = 'http://www.blender.org/community/user-community/' layout.separator() - layout.operator("help.report_bug", icon='URL') + layout.operator("wm.url_open", text="Report a Bug", icon='URL').url = 'http://projects.blender.org/tracker/?atid=498&group_id=9&func=browse' layout.separator() - layout.operator("help.python_api", icon='URL') + layout.operator("wm.url_open", text="Python API Reference", icon='URL').url = 'http://www.blender.org/documentation/250PythonDoc/contents.html' layout.operator("help.operator_cheat_sheet") + layout.separator() + layout.operator("wm.splash") # Help operators -class HelpOperator(bpy.types.Operator): - - def execute(self, context): - import webbrowser - webbrowser.open(self._url) - return {'FINISHED'} - - -class HELP_OT_manual(HelpOperator): - '''The Blender Wiki manual''' - bl_idname = "help.manual" - bl_label = "Manual" - _url = 'http://wiki.blender.org/index.php/Doc:Manual' - - -class HELP_OT_release_logs(HelpOperator): - '''Information about the changes in this version of Blender''' - bl_idname = "help.release_logs" - bl_label = "Release Log" - _url = 'http://www.blender.org/development/release-logs/blender-250/' - - -class HELP_OT_blender_website(HelpOperator): - '''The official Blender website''' - bl_idname = "help.blender_website" - bl_label = "Blender Website" - _url = 'http://www.blender.org/' - - -class HELP_OT_blender_eshop(HelpOperator): - '''Buy official Blender resources and merchandise online''' - bl_idname = "help.blender_eshop" - bl_label = "Blender e-Shop" - _url = 'http://www.blender3d.org/e-shop' - - -class HELP_OT_developer_community(HelpOperator): - '''Get involved with Blender development''' - bl_idname = "help.developer_community" - bl_label = "Developer Community" - _url = 'http://www.blender.org/community/get-involved/' - - -class HELP_OT_user_community(HelpOperator): - '''Get involved with other Blender users''' - bl_idname = "help.user_community" - bl_label = "User Community" - _url = 'http://www.blender.org/community/user-community/' - - -class HELP_OT_report_bug(HelpOperator): - '''Report a bug in the Blender bug tracker''' - bl_idname = "help.report_bug" - bl_label = "Report a Bug" - _url = 'http://projects.blender.org/tracker/?atid=498&group_id=9&func=browse' - - -class HELP_OT_python_api(HelpOperator): - '''Reference for operator and data Python API''' - bl_idname = "help.python_api" - bl_label = "Python API Reference" - _url = 'http://www.blender.org/documentation/250PythonDoc/contents.html' - - class HELP_OT_operator_cheat_sheet(bpy.types.Operator): bl_idname = "help.operator_cheat_sheet" - bl_label = "Operator Cheat Sheet (new textblock)" + bl_label = "Operator Cheat Sheet" def execute(self, context): op_strings = [] @@ -404,25 +355,18 @@ class HELP_OT_operator_cheat_sheet(bpy.types.Operator): classes = [ INFO_HT_header, INFO_MT_file, - INFO_MT_file_open_recent, INFO_MT_file_import, INFO_MT_file_export, INFO_MT_file_external_data, INFO_MT_add, INFO_MT_mesh_add, + INFO_MT_curve_add, + INFO_MT_surface_add, INFO_MT_armature_add, INFO_MT_game, INFO_MT_render, INFO_MT_help, - HELP_OT_manual, - HELP_OT_release_logs, - HELP_OT_blender_website, - HELP_OT_blender_eshop, - HELP_OT_developer_community, - HELP_OT_user_community, - HELP_OT_report_bug, - HELP_OT_python_api, HELP_OT_operator_cheat_sheet] diff --git a/release/scripts/ui/space_logic.py b/release/scripts/ui/space_logic.py index 07b26fdc862..a01a5ce6305 100644 --- a/release/scripts/ui/space_logic.py +++ b/release/scripts/ui/space_logic.py @@ -35,20 +35,31 @@ class LOGIC_PT_properties(bpy.types.Panel): ob = context.active_object game = ob.game - layout.operator("object.game_property_new", text="Add Game Property") + layout.operator("object.game_property_new", text="Add Game Property", icon='ZOOMIN') for i, prop in enumerate(game.properties): - row = layout.row(align=True) + box = layout.box() + row = box.row() row.prop(prop, "name", text="") row.prop(prop, "type", text="") row.prop(prop, "value", text="", toggle=True) # we dont care about the type. rna will display correctly row.prop(prop, "debug", text="", toggle=True, icon='INFO') - row.operator("object.game_property_remove", text="", icon='X').index = i + row.operator("object.game_property_remove", text="", icon='X', emboss=False).index = i +class LOGIC_MT_logicbricks_add(bpy.types.Menu): + bl_label = "Add" + + def draw(self, context): + layout = self.layout + + layout.operator_menu_enum("logic.sensor_add", "type", text="Sensor") + layout.operator_menu_enum("logic.controller_add", "type", text="Controller") + layout.operator_menu_enum("logic.actuator_add", "type", text="Actuator") + classes = [ - LOGIC_PT_properties] + LOGIC_PT_properties, LOGIC_MT_logicbricks_add] def register(): diff --git a/release/scripts/ui/space_nla.py b/release/scripts/ui/space_nla.py index 12ed8aa7740..0eb342d4b15 100644 --- a/release/scripts/ui/space_nla.py +++ b/release/scripts/ui/space_nla.py @@ -102,7 +102,7 @@ class NLA_MT_edit(bpy.types.Menu): layout.column() layout.menu("NLA_MT_edit_transform", text="Transform") - layout.operator_menu_enum("nla.snap", property="type", text="Snap") + layout.operator_menu_enum("nla.snap", "type", text="Snap") layout.separator() layout.operator("nla.duplicate") diff --git a/release/scripts/ui/space_node.py b/release/scripts/ui/space_node.py index f510235a39d..365835009ba 100644 --- a/release/scripts/ui/space_node.py +++ b/release/scripts/ui/space_node.py @@ -55,7 +55,10 @@ class NODE_HT_header(bpy.types.Header): snode_id = snode.id id_from = snode.id_from if id_from: - layout.template_ID(id_from, "active_texture", new="texture.new") + if snode.texture_type == 'BRUSH': + layout.template_ID(id_from, "texture", new="texture.new") + else: + layout.template_ID(id_from, "active_texture", new="texture.new") if snode_id: layout.prop(snode_id, "use_nodes") @@ -66,6 +69,10 @@ class NODE_HT_header(bpy.types.Header): layout.prop(scene.render, "free_unused_nodes", text="Free Unused") layout.prop(snode, "backdrop") + layout.separator() + + layout.template_running_jobs() + class NODE_MT_view(bpy.types.Menu): bl_label = "View" @@ -101,6 +108,9 @@ class NODE_MT_select(bpy.types.Menu): layout.operator("node.select_all") layout.operator("node.select_linked_from") layout.operator("node.select_linked_to") + layout.operator("node.select_same_type") + layout.operator("node.select_same_type_next") + layout.operator("node.select_same_type_prev") class NODE_MT_node(bpy.types.Menu): @@ -129,8 +139,10 @@ class NODE_MT_node(bpy.types.Menu): layout.separator() - layout.operator("node.hide") - layout.operator("node.mute") + layout.operator("node.hide_toggle") + layout.operator("node.mute_toggle") + layout.operator("node.preview_toggle") + layout.operator("node.hide_socket_toggle") # XXX # layout.operator("node.rename") diff --git a/release/scripts/ui/space_outliner.py b/release/scripts/ui/space_outliner.py index d5bb35baa6c..ec3c430feaa 100644 --- a/release/scripts/ui/space_outliner.py +++ b/release/scripts/ui/space_outliner.py @@ -36,11 +36,14 @@ class OUTLINER_HT_header(bpy.types.Header): if context.area.show_menus: sub = row.row(align=True) sub.menu("OUTLINER_MT_view") + sub.menu("OUTLINER_MT_search") if space.display_mode == 'DATABLOCKS': sub.menu("OUTLINER_MT_edit_datablocks") layout.prop(space, "display_mode", text="") + layout.prop(space, "display_filter", icon='VIEWZOOM', text="") + layout.separator() if space.display_mode == 'DATABLOCKS': @@ -83,6 +86,20 @@ class OUTLINER_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") +class OUTLINER_MT_search(bpy.types.Menu): + bl_label = "Search" + + def draw(self, context): + layout = self.layout + + space = context.space_data + + col = layout.column() + + col.prop(space, "match_case_sensitive") + col.prop(space, "match_complete") + + class OUTLINER_MT_edit_datablocks(bpy.types.Menu): bl_label = "Edit" @@ -103,6 +120,7 @@ class OUTLINER_MT_edit_datablocks(bpy.types.Menu): classes = [ OUTLINER_HT_header, OUTLINER_MT_view, + OUTLINER_MT_search, OUTLINER_MT_edit_datablocks] diff --git a/release/scripts/ui/space_sequencer.py b/release/scripts/ui/space_sequencer.py index 8930a04e11c..97d84b77e18 100644 --- a/release/scripts/ui/space_sequencer.py +++ b/release/scripts/ui/space_sequencer.py @@ -50,10 +50,10 @@ class SEQUENCER_HT_header(bpy.types.Header): sub.menu("SEQUENCER_MT_add") sub.menu("SEQUENCER_MT_strip") - layout.prop(st, "view_type", text="") + layout.prop(st, "view_type", expand=True, text="") if (st.view_type == 'PREVIEW') or (st.view_type == 'SEQUENCER_PREVIEW'): - layout.prop(st, "display_mode", text="") + layout.prop(st, "display_mode", expand=True, text="") if (st.view_type == 'SEQUENCER'): row = layout.row(align=True) @@ -69,6 +69,14 @@ class SEQUENCER_HT_header(bpy.types.Header): else: layout.prop(st, "display_channel", text="Channel") + ed = context.scene.sequence_editor + if ed: + row = layout.row(align=True) + row.prop(ed, "show_overlay", text="", icon='GHOST_ENABLED') + if ed.show_overlay: + row.prop(ed, "overlay_frame", text="") + row.prop(ed, "overlay_lock", text="", icon='LOCKED') + class SEQUENCER_MT_view_toggle(bpy.types.Menu): bl_label = "View Type" @@ -126,6 +134,10 @@ class SEQUENCER_MT_view(bpy.types.Menu): layout.operator_context = 'INVOKE_REGION_PREVIEW' layout.operator("sequencer.view_all_preview", text='Fit preview in window') layout.operator_context = 'INVOKE_DEFAULT' + + # # XXX, invokes in the header view + # layout.operator("sequencer.view_ghost_border", text='Overlay Border') + layout.operator("sequencer.view_selected") layout.prop(st, "draw_frames") @@ -136,6 +148,8 @@ class SEQUENCER_MT_view(bpy.types.Menu): layout.prop(st, "separate_color_preview") layout.separator() + layout.prop(st, "use_marker_sync") + layout.separator() layout.operator("screen.area_dupli") layout.operator("screen.screen_full_area") @@ -185,7 +199,7 @@ class SEQUENCER_MT_add(bpy.types.Menu): layout.operator_context = 'INVOKE_REGION_WIN' layout.column() - layout.operator("sequencer.scene_strip_add", text="Scene") + layout.operator_menu_enum("sequencer.scene_strip_add", "scene", text="Scene...") layout.operator("sequencer.movie_strip_add", text="Movie") layout.operator("sequencer.image_strip_add", text="Image") layout.operator("sequencer.sound_strip_add", text="Sound") @@ -215,6 +229,7 @@ class SEQUENCER_MT_add_effect(bpy.types.Menu): layout.operator("sequencer.effect_strip_add", text="Transform").type = 'TRANSFORM' layout.operator("sequencer.effect_strip_add", text="Color").type = 'COLOR' layout.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED' + layout.operator("sequencer.effect_strip_add", text="Multicam Selector").type = 'MULTICAM' class SEQUENCER_MT_strip(bpy.types.Menu): @@ -234,6 +249,7 @@ class SEQUENCER_MT_strip(bpy.types.Menu): layout.operator("sequencer.cut", text="Cut (hard) at frame").type = 'HARD' layout.operator("sequencer.cut", text="Cut (soft) at frame").type = 'SOFT' layout.operator("sequencer.images_separate") + layout.operator("sequencer.deinterlace_selected_movies") layout.separator() layout.operator("sequencer.duplicate") @@ -244,20 +260,23 @@ class SEQUENCER_MT_strip(bpy.types.Menu): if strip: stype = strip.type - if stype == 'EFFECT': - layout.separator() - layout.operator("sequencer.effect_change") - layout.operator("sequencer.effect_reassign_inputs") + # XXX note strip.type is never equal to 'EFFECT', look at seq_type_items within rna_sequencer.c + if stype == 'EFFECT': + pass + # layout.separator() + # layout.operator("sequencer.effect_change") + # layout.operator("sequencer.effect_reassign_inputs") elif stype == 'IMAGE': layout.separator() # layout.operator("sequencer.image_change") layout.operator("sequencer.rendersize") elif stype == 'SCENE': - layout.separator() - layout.operator("sequencer.scene_change", text="Change Scene") + pass + # layout.separator() + # layout.operator("sequencer.scene_change", text="Change Scene") elif stype == 'MOVIE': layout.separator() - layout.operator("sequencer.movie_change") + # layout.operator("sequencer.movie_change") layout.operator("sequencer.rendersize") layout.separator() @@ -272,6 +291,7 @@ class SEQUENCER_MT_strip(bpy.types.Menu): layout.separator() layout.operator("sequencer.reload") + layout.operator("sequencer.reassign_inputs") layout.separator() layout.operator("sequencer.lock") layout.operator("sequencer.unlock") @@ -284,6 +304,10 @@ class SEQUENCER_MT_strip(bpy.types.Menu): layout.operator_menu_enum("sequencer.swap", "side") + layout.separator() + + layout.operator("sequencer.swap_data") + class SequencerButtonsPanel(bpy.types.Panel): bl_space_type = 'SEQUENCE_EDITOR' @@ -312,7 +336,9 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel): def draw(self, context): layout = self.layout + scene = context.scene render = context.scene.render + frame_current = scene.frame_current strip = act_strip(context) split = layout.split(percentage=0.3) @@ -327,38 +353,54 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel): split.label(text="Blend:") split.prop(strip, "blend_mode", text="") - row = layout.row() - if strip.mute == True: - row.prop(strip, "mute", toggle=True, icon='RESTRICT_VIEW_ON', text="") - elif strip.mute is False: - row.prop(strip, "mute", toggle=True, icon='RESTRICT_VIEW_OFF', text="") - + row = layout.row(align=True) sub = row.row() sub.active = (not strip.mute) - sub.prop(strip, "blend_opacity", text="Opacity", slider=True) - - row = layout.row() - row.prop(strip, "lock") - row.prop(strip, "frame_locked", text="Frame Lock") + sub = row.row() + row.prop(strip, "mute", toggle=True, icon='RESTRICT_VIEW_ON' if strip.mute else 'RESTRICT_VIEW_OFF', text="") + row.prop(strip, "lock", toggle=True, icon='LOCKED' if strip.lock else 'UNLOCKED', text="") col = layout.column() - col.enabled = not strip.lock - col.prop(strip, "channel") - col.prop(strip, "start_frame") - subrow = col.split(percentage=0.66) - subrow.prop(strip, "length") - subrow.label(text="%.2f sec" % (strip.length / (render.fps / render.fps_base))) + sub = col.column() + sub.enabled = not strip.lock + sub.prop(strip, "channel") + sub.prop(strip, "frame_start") + sub.prop(strip, "frame_final_length") col = layout.column(align=True) - col.label(text="Offset:") - col.prop(strip, "start_offset", text="Start") - col.prop(strip, "end_offset", text="End") + row = col.row() + row.label(text="Final Length: %s" % bpy.utils.smpte_from_frame(strip.frame_final_length)) + row = col.row() + row.active = (frame_current >= strip.frame_start and frame_current <= strip.frame_start + strip.frame_length) + row.label(text="Playhead: %d" % (frame_current - strip.frame_start)) - col = layout.column(align=True) - col.label(text="Still:") - col.prop(strip, "start_still", text="Start") - col.prop(strip, "end_still", text="End") + col.label(text="Frame Offset %d:%d" % (strip.frame_offset_start, strip.frame_offset_end)) + col.label(text="Frame Still %d:%d" % (strip.frame_still_start, strip.frame_still_end)) + + +class SEQUENCER_PT_preview(bpy.types.Panel): + bl_label = "Scene Preview/Render" + bl_space_type = 'SEQUENCE_EDITOR' + bl_region_type = 'UI' + + def draw(self, context): + layout = self.layout + render = context.scene.render + + col = layout.column() + col.prop(render, "use_sequencer_gl_preview", text="Open GL Preview") + col = layout.column() + col.active = render.use_sequencer_gl_preview + col.prop(render, "sequencer_gl_preview", text="") + + ''' + col = layout.column() + col.prop(render, "use_sequencer_gl_render", text="Open GL Render") + col = layout.column() + col.active = render.use_sequencer_gl_render + col.prop(render, "sequencer_gl_render", text="") + ''' class SEQUENCER_PT_effect(SequencerButtonsPanel): @@ -375,7 +417,8 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel): return strip.type in ('ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', 'PLUGIN', - 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED') + 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED', + 'MULTICAM') def draw(self, context): layout = self.layout @@ -419,6 +462,22 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel): elif strip.type == 'TRANSFORM': self.draw_panel_transform(strip) + elif strip.type == "MULTICAM": + layout.prop(strip, "multicam_source") + + row = layout.row(align=True) + sub = row.row() + sub.scale_x = 2.0 + + if not context.screen.animation_playing: + sub.operator("screen.animation_play", text="", icon='PLAY') + else: + sub.operator("screen.animation_play", text="", icon='PAUSE') + + row.label("Cut To") + for i in range(1, strip.channel): + row.operator("sequencer.cut_multicam", text=str(i)).camera = i + col = layout.column(align=True) if strip.type == 'SPEED': @@ -470,11 +529,16 @@ class SEQUENCER_PT_input(SequencerButtonsPanel): if not strip: return False - return strip.type in ('MOVIE', 'IMAGE') - + return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META', + 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', + 'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', + 'PLUGIN', + 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', + 'MULTICAM', 'SPEED') + def draw_filename(self, context): pass - + def draw(self, context): layout = self.layout @@ -483,16 +547,14 @@ class SEQUENCER_PT_input(SequencerButtonsPanel): self.draw_filename(context) layout.prop(strip, "use_translation", text="Image Offset:") - if strip.transform: + if strip.use_translation: col = layout.column(align=True) - col.active = strip.use_translation col.prop(strip.transform, "offset_x", text="X") col.prop(strip.transform, "offset_y", text="Y") layout.prop(strip, "use_crop", text="Image Crop:") - if strip.crop: + if strip.use_crop: col = layout.column(align=True) - col.active = strip.use_crop col.prop(strip.crop, "top") col.prop(strip.crop, "left") col.prop(strip.crop, "bottom") @@ -502,7 +564,8 @@ class SEQUENCER_PT_input(SequencerButtonsPanel): col.label(text="Trim Duration:") col.prop(strip, "animation_start_offset", text="Start") col.prop(strip, "animation_end_offset", text="End") - + + class SEQUENCER_PT_input_movie(SEQUENCER_PT_input): bl_label = "Strip Input" @@ -527,6 +590,7 @@ class SEQUENCER_PT_input_movie(SEQUENCER_PT_input): col = split.column() col.prop(strip, "filepath", text="") + class SEQUENCER_PT_input_image(SEQUENCER_PT_input): bl_label = "Strip Input" @@ -553,7 +617,7 @@ class SEQUENCER_PT_input_image(SEQUENCER_PT_input): # Current element for the filename - elem = strip.getStripElem(context.scene.current_frame) + elem = strip.getStripElem(context.scene.frame_current) if elem: split = layout.split(percentage=0.2) col = split.column() @@ -562,6 +626,23 @@ class SEQUENCER_PT_input_image(SEQUENCER_PT_input): col.prop(elem, "filename", text="") # strip.elements[0] could be a fallback +class SEQUENCER_PT_input_secondary(SEQUENCER_PT_input): + bl_label = "Strip Input" + + def poll(self, context): + if not self.has_sequencer(context): + return False + + strip = act_strip(context) + if not strip: + return False + + return strip.type in ('SCENE', 'META') + + def draw_filename(self, context): + pass + + class SEQUENCER_PT_sound(SequencerButtonsPanel): bl_label = "Sound" @@ -583,7 +664,7 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel): layout.template_ID(strip, "sound", open="sound.open") layout.separator() - layout.prop(strip.sound, "filepath", text="") + layout.prop(strip, "filepath", text="") row = layout.row() if strip.sound.packed_file: @@ -594,6 +675,12 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel): row.prop(strip.sound, "caching") layout.prop(strip, "volume") + layout.prop(strip, "attenuation") + + col = layout.column(align=True) + col.label(text="Trim Duration:") + col.prop(strip, "animation_start_offset", text="Start") + col.prop(strip, "animation_end_offset", text="End") class SEQUENCER_PT_scene(SequencerButtonsPanel): @@ -616,6 +703,9 @@ class SEQUENCER_PT_scene(SequencerButtonsPanel): layout.template_ID(strip, "scene") + layout.label(text="Camera Override") + layout.template_ID(strip, "scene_camera") + class SEQUENCER_PT_filter(SequencerButtonsPanel): bl_label = "Filter" @@ -628,7 +718,12 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel): if not strip: return False - return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META') + return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META', + 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', + 'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', + 'PLUGIN', + 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', + 'MULTICAM', 'SPEED') def draw(self, context): layout = self.layout @@ -638,34 +733,37 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel): col = layout.column() col.label(text="Video:") col.prop(strip, "strobe") + + row = layout.row() + row.label(text="Flip:") + row.prop(strip, "flip_x", text="X") + row.prop(strip, "flip_y", text="Y") + + col = layout.column() + col.prop(strip, "reverse_frames", text="Backwards") col.prop(strip, "de_interlace") col = layout.column() col.label(text="Colors:") + col.prop(strip, "color_saturation", text="Saturation") col.prop(strip, "multiply_colors", text="Multiply") col.prop(strip, "premultiply") col.prop(strip, "convert_float") - col = layout.column() - col.label(text="Flip:") - col.prop(strip, "flip_x", text="X") - col.prop(strip, "flip_y", text="Y") - col.prop(strip, "reverse_frames", text="Backwards") - layout.prop(strip, "use_color_balance") - if strip.color_balance: # TODO - need to add this somehow + if strip.use_color_balance and strip.color_balance: # TODO - need to add this somehow row = layout.row() row.active = strip.use_color_balance col = row.column() - col.template_color_wheel(strip.color_balance, "lift", value_slider=False) + col.template_color_wheel(strip.color_balance, "lift", value_slider=False, cubic=True) col.row().prop(strip.color_balance, "lift") col.prop(strip.color_balance, "inverse_lift", text="Inverse") col = row.column() - col.template_color_wheel(strip.color_balance, "gamma", value_slider=False) + col.template_color_wheel(strip.color_balance, "gamma", value_slider=False, lock_luminosity=True, cubic=True) col.row().prop(strip.color_balance, "gamma") col.prop(strip.color_balance, "inverse_gamma", text="Inverse") col = row.column() - col.template_color_wheel(strip.color_balance, "gain", value_slider=False) + col.template_color_wheel(strip.color_balance, "gain", value_slider=False, lock_luminosity=True, cubic=True) col.row().prop(strip.color_balance, "gain") col.prop(strip.color_balance, "inverse_gain", text="Inverse") @@ -681,7 +779,7 @@ class SEQUENCER_PT_proxy(SequencerButtonsPanel): if not strip: return False - return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META') + return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META', 'MULTICAM') def draw_header(self, context): strip = act_strip(context) @@ -695,9 +793,12 @@ class SEQUENCER_PT_proxy(SequencerButtonsPanel): flow = layout.column_flow() flow.prop(strip, "proxy_custom_directory") + flow.prop(strip, "proxy_custom_file") if strip.proxy: # TODO - need to add this somehow - flow.prop(strip.proxy, "directory") - flow.prop(strip.proxy, "file") + if strip.proxy_custom_directory and not strip.proxy_custom_file: + flow.prop(strip.proxy, "directory") + if strip.proxy_custom_file: + flow.prop(strip.proxy, "filepath") class SEQUENCER_PT_view(SequencerButtonsPanel_Output): @@ -709,9 +810,12 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output): st = context.space_data col = layout.column() - col.prop(st, "draw_overexposed") # text="Zebra" - col.prop(st, "draw_safe_margin") - + if st.display_mode == 'IMAGE': + col.prop(st, "draw_overexposed") # text="Zebra" + col.prop(st, "draw_safe_margin") + if st.display_mode == 'WAVEFORM': + col.prop(st, "separate_color_preview") + col.prop(st, "proxy_render_size") classes = [ SEQUENCER_HT_header, # header/menu classes @@ -724,9 +828,11 @@ classes = [ SEQUENCER_MT_strip, SEQUENCER_PT_edit, # sequencer panels + SEQUENCER_PT_preview, SEQUENCER_PT_effect, SEQUENCER_PT_input_movie, SEQUENCER_PT_input_image, + SEQUENCER_PT_input_secondary, SEQUENCER_PT_sound, SEQUENCER_PT_scene, SEQUENCER_PT_filter, diff --git a/release/scripts/ui/space_text.py b/release/scripts/ui/space_text.py index 3a789566a61..692f1581bd6 100644 --- a/release/scripts/ui/space_text.py +++ b/release/scripts/ui/space_text.py @@ -54,19 +54,19 @@ class TEXT_HT_header(bpy.types.Header): if text: row = layout.row() row.operator("text.run_script") + + row = layout.row() + row.active = text.name.endswith(".py") row.prop(text, "use_module") row = layout.row() - if text.filename != "": + if text.filepath: if text.dirty: - row.label(text="File: *%s (unsaved)" % text.filename) + row.label(text="File: *%s (unsaved)" % text.filepath) else: - row.label(text="File: %s" % text.filename) + row.label(text="File: %s" % text.filepath) else: - if text.library: - row.label(text="Text: External") - else: - row.label(text="Text: Internal") + row.label(text="Text: External" if text.library else "Text: Internal") class TEXT_PT_properties(bpy.types.Panel): @@ -147,7 +147,7 @@ class TEXT_MT_text(bpy.types.Menu): layout.operator("text.save") layout.operator("text.save_as") - if text.filename != "": + if text.filepath: layout.operator("text.make_internal") layout.column() @@ -177,7 +177,7 @@ class TEXT_MT_templates(bpy.types.Menu): bl_label = "Script Templates" def draw(self, context): - self.path_menu(bpy.utils.script_paths("templates"), "text.open") + self.path_menu(bpy.utils.script_paths("templates"), "text.open", {"internal": True}) class TEXT_MT_edit_view(bpy.types.Menu): @@ -274,6 +274,22 @@ class TEXT_MT_edit(bpy.types.Menu): layout.menu("TEXT_MT_edit_to3d") +class TEXT_MT_toolbox(bpy.types.Menu): + bl_label = "" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_DEFAULT' + + layout.operator("text.cut") + layout.operator("text.copy") + layout.operator("text.paste") + + layout.separator() + + layout.operator("text.run_script") + + classes = [ TEXT_HT_header, TEXT_PT_properties, @@ -285,7 +301,8 @@ classes = [ TEXT_MT_edit_view, TEXT_MT_edit_select, TEXT_MT_edit_markers, - TEXT_MT_edit_to3d] + TEXT_MT_edit_to3d, + TEXT_MT_toolbox] def register(): diff --git a/release/scripts/ui/space_time.py b/release/scripts/ui/space_time.py index 2f2fad59e9f..042e4dbc015 100644 --- a/release/scripts/ui/space_time.py +++ b/release/scripts/ui/space_time.py @@ -39,17 +39,17 @@ class TIME_HT_header(bpy.types.Header): sub.menu("TIME_MT_frame") sub.menu("TIME_MT_playback") - layout.prop(scene, "use_preview_range", text="PR") + layout.prop(scene, "use_preview_range", text="", toggle=True) row = layout.row(align=True) if not scene.use_preview_range: - row.prop(scene, "start_frame", text="Start") - row.prop(scene, "end_frame", text="End") + row.prop(scene, "frame_start", text="Start") + row.prop(scene, "frame_end", text="End") else: - row.prop(scene, "preview_range_start_frame", text="Start") - row.prop(scene, "preview_range_end_frame", text="End") + row.prop(scene, "preview_range_frame_start", text="Start") + row.prop(scene, "preview_range_frame_end", text="End") - layout.prop(scene, "current_frame", text="") + layout.prop(scene, "frame_current", text="") layout.separator() @@ -67,7 +67,7 @@ class TIME_HT_header(bpy.types.Header): row.operator("screen.frame_jump", text="", icon='FF').end = True row = layout.row(align=True) - row.prop(tools, "use_auto_keying", text="", toggle=True, icon='REC') + row.prop(tools, "use_auto_keying", text="", toggle=True) if screen.animation_playing and tools.use_auto_keying: subsub = row.row() subsub.prop(tools, "record_with_nla", toggle=True) @@ -77,7 +77,7 @@ class TIME_HT_header(bpy.types.Header): layout.separator() row = layout.row(align=True) - row.prop_object(scene, "active_keying_set", scene, "keying_sets", text="") + row.prop_object(scene, "active_keying_set", scene, "all_keying_sets", text="") row.operator("anim.keyframe_insert", text="", icon='KEY_HLT') row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT') @@ -100,9 +100,33 @@ class TIME_MT_view(bpy.types.Menu): layout.separator() + layout.menu("TIME_MT_cache") + + layout.separator() + layout.operator("marker.camera_bind") +class TIME_MT_cache(bpy.types.Menu): + bl_label = "Cache" + + def draw(self, context): + layout = self.layout + + st = context.space_data + + layout.prop(st, "show_cache") + + layout.separator() + + col = layout.column() + col.enabled = st.show_cache + col.prop(st, "cache_softbody") + col.prop(st, "cache_particles") + col.prop(st, "cache_cloth") + col.prop(st, "cache_smoke") + + class TIME_MT_frame(bpy.types.Menu): bl_label = "Frame" @@ -171,6 +195,7 @@ class TIME_MT_autokey(bpy.types.Menu): classes = [ TIME_HT_header, TIME_MT_view, + TIME_MT_cache, TIME_MT_frame, TIME_MT_autokey, TIME_MT_playback] diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py index bea9f80edec..61f759a1d83 100644 --- a/release/scripts/ui/space_userpref.py +++ b/release/scripts/ui/space_userpref.py @@ -19,26 +19,34 @@ # <pep8 compliant> import bpy import os -import re import shutil def ui_items_general(col, context): """ General UI Theme Settings (User Interface) """ + row = col.row() - sub = row.column() - sub.prop(context, "outline") - sub.prop(context, "item", slider=True) - sub = row.column() - sub.prop(context, "inner", slider=True) - sub.prop(context, "inner_sel", slider=True) - sub = row.column() - sub.prop(context, "text") - sub.prop(context, "text_sel") - sub = row.column() - sub.prop(context, "shaded") - subsub = sub.column(align=True) + + subsplit = row.split(percentage=0.95) + + padding = subsplit.split(percentage=0.15) + colsub = padding.column() + colsub = padding.column() + colsub.row().prop(context, "outline") + colsub.row().prop(context, "item", slider=True) + colsub.row().prop(context, "inner", slider=True) + colsub.row().prop(context, "inner_sel", slider=True) + + subsplit = row.split(percentage=0.85) + + padding = subsplit.split(percentage=0.15) + colsub = padding.column() + colsub = padding.column() + colsub.row().prop(context, "text") + colsub.row().prop(context, "text_sel") + colsub.prop(context, "shaded") + subsub = colsub.column(align=True) subsub.active = context.shaded subsub.prop(context, "shadetop") subsub.prop(context, "shadedown") @@ -67,91 +75,6 @@ def opengl_lamp_buttons(column, lamp): col.active = lamp.enabled col.prop(lamp, "direction", text="") -KM_HIERARCHY = [ - ('Window', 'EMPTY', 'WINDOW', []), # file save, window change, exit - ('Screen', 'EMPTY', 'WINDOW', [ # full screen, undo, screenshot - ('Screen Editing', 'EMPTY', 'WINDOW', []), # resizing, action corners - ]), - - ('View2D', 'EMPTY', 'WINDOW', []), # view 2d navigation (per region) - ('View2D Buttons List', 'EMPTY', 'WINDOW', []), # view 2d with buttons navigation - ('Header', 'EMPTY', 'WINDOW', []), # header stuff (per region) - ('Grease Pencil', 'EMPTY', 'WINDOW', []), # grease pencil stuff (per region) - - ('3D View', 'VIEW_3D', 'WINDOW', [ # view 3d navigation and generic stuff (select, transform) - ('Object Mode', 'EMPTY', 'WINDOW', []), - ('Mesh', 'EMPTY', 'WINDOW', []), - ('Curve', 'EMPTY', 'WINDOW', []), - ('Armature', 'EMPTY', 'WINDOW', []), - ('Metaball', 'EMPTY', 'WINDOW', []), - ('Lattice', 'EMPTY', 'WINDOW', []), - ('Font', 'EMPTY', 'WINDOW', []), - - ('Pose', 'EMPTY', 'WINDOW', []), - - ('Vertex Paint', 'EMPTY', 'WINDOW', []), - ('Weight Paint', 'EMPTY', 'WINDOW', []), - ('Face Mask', 'EMPTY', 'WINDOW', []), - ('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d - ('Sculpt', 'EMPTY', 'WINDOW', []), - - ('Armature Sketch', 'EMPTY', 'WINDOW', []), - ('Particle', 'EMPTY', 'WINDOW', []), - - ('Object Non-modal', 'EMPTY', 'WINDOW', []), # mode change - - ('3D View Generic', 'VIEW_3D', 'WINDOW', []) # toolbar and properties - ]), - - ('Frames', 'EMPTY', 'WINDOW', []), # frame navigation (per region) - ('Markers', 'EMPTY', 'WINDOW', []), # markers (per region) - ('Animation', 'EMPTY', 'WINDOW', []), # frame change on click, preview range (per region) - ('Animation Channels', 'EMPTY', 'WINDOW', []), - ('Graph Editor', 'GRAPH_EDITOR', 'WINDOW', [ - ('Graph Editor Generic', 'GRAPH_EDITOR', 'WINDOW', []) - ]), - ('Dopesheet', 'DOPESHEET_EDITOR', 'WINDOW', []), - ('NLA Editor', 'NLA_EDITOR', 'WINDOW', [ - ('NLA Channels', 'NLA_EDITOR', 'WINDOW', []), - ('NLA Generic', 'NLA_EDITOR', 'WINDOW', []) - ]), - - ('Image', 'IMAGE_EDITOR', 'WINDOW', [ - ('UV Editor', 'EMPTY', 'WINDOW', []), # image (reverse order, UVEdit before Image - ('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d - ('Image Generic', 'IMAGE_EDITOR', 'WINDOW', []) - ]), - - ('Timeline', 'TIMELINE', 'WINDOW', []), - ('Outliner', 'OUTLINER', 'WINDOW', []), - - ('Node Editor', 'NODE_EDITOR', 'WINDOW', [ - ('Node Generic', 'NODE_EDITOR', 'WINDOW', []) - ]), - ('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', []), - ('Logic Editor', 'LOGIC_EDITOR', 'WINDOW', []), - - ('File Browser', 'FILE_BROWSER', 'WINDOW', [ - ('File Browser Main', 'FILE_BROWSER', 'WINDOW', []), - ('File Browser Buttons', 'FILE_BROWSER', 'WINDOW', []) - ]), - - ('Property Editor', 'PROPERTIES', 'WINDOW', []), # align context menu - - ('Script', 'SCRIPTS_WINDOW', 'WINDOW', []), - ('Text', 'TEXT_EDITOR', 'WINDOW', []), - ('Console', 'CONSOLE', 'WINDOW', []), - - ('View3D Gesture Circle', 'EMPTY', 'WINDOW', []), - ('Gesture Border', 'EMPTY', 'WINDOW', []), - ('Standard Modal Map', 'EMPTY', 'WINDOW', []), - ('Transform Modal Map', 'EMPTY', 'WINDOW', []), - ('View3D Fly Modal', 'EMPTY', 'WINDOW', []), - ('View3D Rotate Modal', 'EMPTY', 'WINDOW', []), - ('View3D Move Modal', 'EMPTY', 'WINDOW', []), - ('View3D Zoom Modal', 'EMPTY', 'WINDOW', []), - ] - class USERPREF_HT_header(bpy.types.Header): bl_space_type = 'USER_PREFERENCES' @@ -165,16 +88,18 @@ class USERPREF_HT_header(bpy.types.Header): layout.operator_context = 'EXEC_AREA' layout.operator("wm.save_homefile", text="Save As Default") + layout.operator_context = 'INVOKE_DEFAULT' + if userpref.active_section == 'INPUT': - layout.operator_context = 'INVOKE_DEFAULT' - op = layout.operator("wm.keyconfig_export", "Export Key Configuration...") - op.path = "keymap.py" - op = layout.operator("wm.keyconfig_import", "Import Key Configuration...") - op.path = "keymap.py" + op = layout.operator("wm.keyconfig_export") + op.filepath = "keymap.py" + op = layout.operator("wm.keyconfig_import") + op.filepath = "keymap.py" elif userpref.active_section == 'ADDONS': - layout.operator_context = 'INVOKE_DEFAULT' - op = layout.operator("wm.addon_install", "Install Add-On...") - op.path = "*.py" + op = layout.operator("wm.addon_install") + op.filepath = "*.py" + elif userpref.active_section == 'THEMES': + op = layout.operator("ui.reset_default_theme") class USERPREF_PT_tabs(bpy.types.Panel): @@ -191,6 +116,26 @@ class USERPREF_PT_tabs(bpy.types.Panel): layout.prop(userpref, "active_section", expand=True) +class USERPREF_MT_interaction_presets(bpy.types.Menu): + bl_label = "Presets" + preset_subdir = "interaction" + preset_operator = "script.execute_preset" + draw = bpy.types.Menu.draw_preset + + +class USERPREF_MT_splash(bpy.types.Menu): + bl_label = "Splash" + + def draw(self, context): + layout = self.layout + split = layout.split() + row = split.row() + row.label("") + row = split.row() + row.label("Interaction:") + row.menu("USERPREF_MT_interaction_presets", text=bpy.types.USERPREF_MT_interaction_presets.bl_label) + + class USERPREF_PT_interface(bpy.types.Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "Interface" @@ -217,7 +162,6 @@ class USERPREF_PT_interface(bpy.types.Panel): col.prop(view, "show_view_name", text="View Name") col.prop(view, "show_playback_fps", text="Playback FPS") col.prop(view, "global_scene") - col.prop(view, "pin_floating_panels") col.prop(view, "object_origin_size") col.separator() @@ -230,6 +174,13 @@ class USERPREF_PT_interface(bpy.types.Panel): sub.prop(view, "mini_axis_size", text="Size") sub.prop(view, "mini_axis_brightness", text="Brightness") + col.separator() + col.separator() + col.separator() + + col.label(text="Properties Window:") + col.prop(view, "properties_width_check") + row.separator() row.separator() @@ -280,6 +231,10 @@ class USERPREF_PT_interface(bpy.types.Panel): col.prop(view, "open_toplevel_delay", text="Top Level") col.prop(view, "open_sublevel_delay", text="Sub Level") + col.separator() + + col.prop(view, "show_splash") + class USERPREF_PT_edit(bpy.types.Panel): bl_space_type = 'USER_PREFERENCES' @@ -325,13 +280,6 @@ class USERPREF_PT_edit(bpy.types.Panel): row.separator() col = row.column() - col.label(text="Snap:") - col.prop(edit, "snap_translate", text="Translate") - col.prop(edit, "snap_rotate", text="Rotate") - col.prop(edit, "snap_scale", text="Scale") - col.separator() - col.separator() - col.separator() col.label(text="Grease Pencil:") col.prop(edit, "grease_pencil_manhattan_distance", text="Manhattan Distance") col.prop(edit, "grease_pencil_euclidean_distance", text="Euclidean Distance") @@ -365,7 +313,8 @@ class USERPREF_PT_edit(bpy.types.Panel): col.separator() col.label(text="New F-Curve Defaults:") - col.prop(edit, "new_interpolation_type", text="Interpolation") + col.prop(edit, "keyframe_new_interpolation_type", text="Interpolation") + col.prop(edit, "keyframe_new_handle_type", text="Handles") col.prop(edit, "insertkey_xyz_to_rgb", text="XYZ to RGB") col.separator() @@ -378,7 +327,21 @@ class USERPREF_PT_edit(bpy.types.Panel): row.separator() row.separator() + sculpt = context.tool_settings.sculpt col = row.column() + col.label(text="Paint and Sculpt:") + col.prop(edit, "sculpt_paint_use_unified_size", text="Unify Size") + col.prop(edit, "sculpt_paint_use_unified_strength", text="Unify Strength") + row = col.row(align=True) + row.label("Overlay Color:") + row.prop(edit, "sculpt_paint_overlay_col", text="") + col.prop(sculpt, "use_openmp", text="Threaded Sculpt") + col.prop(sculpt, "show_brush") + + col.separator() + col.separator() + col.separator() + col.label(text="Duplicate Data:") col.prop(edit, "duplicate_mesh", text="Mesh") col.prop(edit, "duplicate_surface", text="Surface") @@ -423,6 +386,7 @@ class USERPREF_PT_system(bpy.types.Panel): col.prop(system, "frame_server_port") col.prop(system, "scrollback", text="Console Scrollback") col.prop(system, "auto_execute_scripts") + col.prop(system, "tabs_as_spaces") col.separator() col.separator() @@ -533,6 +497,36 @@ class USERPREF_PT_theme(bpy.types.Panel): bl_region_type = 'WINDOW' bl_show_header = False + @staticmethod + def _theme_generic(split, themedata): + + row = split.row() + + subsplit = row.split(percentage=0.95) + + padding1 = subsplit.split(percentage=0.15) + padding1.column() + + subsplit = row.split(percentage=0.85) + + padding2 = subsplit.split(percentage=0.15) + padding2.column() + + colsub_pair = padding1.column(), padding2.column() + + props_type = {} + + for i, prop in enumerate(themedata.rna_type.properties): + attr = prop.identifier + if attr == "rna_type": + continue + + props_type.setdefault((prop.type, prop.subtype), []).append(prop.identifier) + + for props_type, props_ls in sorted(props_type.items()): + for i, attr in enumerate(props_ls): + colsub_pair[i % 2].row().prop(themedata, attr) + def poll(self, context): userpref = context.user_preferences return (userpref.active_section == 'THEMES') @@ -545,6 +539,12 @@ class USERPREF_PT_theme(bpy.types.Panel): split_themes = layout.split(percentage=0.2) split_themes.prop(theme, "theme_area", expand=True) + split = layout.split(percentage=0.4) + + + layout.separator() + layout.separator() + split = split_themes.split() if theme.theme_area == 'USER_INTERFACE': @@ -606,6 +606,10 @@ class USERPREF_PT_theme(bpy.types.Panel): col.label(text="Scroll Bar:") ui_items_general(col, ui) + ui = theme.user_interface.wcol_progress + col.label(text="Progress Bar:") + ui_items_general(col, ui) + ui = theme.user_interface.wcol_list_item col.label(text="List Item:") ui_items_general(col, ui) @@ -614,360 +618,39 @@ class USERPREF_PT_theme(bpy.types.Panel): col.label(text="State:") row = col.row() - sub = row.column() - sub.prop(ui, "inner_anim") - sub.prop(ui, "inner_anim_sel") - sub = row.column() - sub.prop(ui, "inner_driven") - sub.prop(ui, "inner_driven_sel") - sub = row.column() - sub.prop(ui, "inner_key") - sub.prop(ui, "inner_key_sel") - sub = row.column() - sub.prop(ui, "blend") + + subsplit = row.split(percentage=0.95) + + padding = subsplit.split(percentage=0.15) + colsub = padding.column() + colsub = padding.column() + colsub.row().prop(ui, "inner_anim") + colsub.row().prop(ui, "inner_anim_sel") + colsub.row().prop(ui, "inner_driven") + colsub.row().prop(ui, "inner_driven_sel") + + subsplit = row.split(percentage=0.85) + + padding = subsplit.split(percentage=0.15) + colsub = padding.column() + colsub = padding.column() + colsub.row().prop(ui, "inner_key") + colsub.row().prop(ui, "inner_key_sel") + colsub.row().prop(ui, "blend") + ui = theme.user_interface col.separator() col.separator() - col.prop(ui, "icon_file") + + split = col.split(percentage=0.93) + split.prop(ui, "icon_file") layout.separator() layout.separator() - - elif theme.theme_area == 'VIEW_3D': - v3d = theme.view_3d - - col = split.column() - col.prop(v3d, "back") - col.prop(v3d, "button") - col.prop(v3d, "button_title") - col.prop(v3d, "button_text") - col.prop(v3d, "header") - - col = split.column() - col.prop(v3d, "grid") - col.prop(v3d, "wire") - col.prop(v3d, "lamp", slider=True) - col.prop(v3d, "editmesh_active", slider=True) - - col = split.column() - col.prop(v3d, "object_selected") - col.prop(v3d, "object_active") - col.prop(v3d, "object_grouped") - col.prop(v3d, "object_grouped_active") - col.prop(v3d, "transform") - - col = split.column() - col.prop(v3d, "vertex") - col.prop(v3d, "face", slider=True) - col.prop(v3d, "normal") - col.prop(v3d, "vertex_normal") - col.prop(v3d, "bone_solid") - col.prop(v3d, "bone_pose") - #col.prop(v3d, "edge") Doesn't seem to work - - elif theme.theme_area == 'GRAPH_EDITOR': - graph = theme.graph_editor - - col = split.column() - col.prop(graph, "back") - col.prop(graph, "button") - col.prop(graph, "button_title") - col.prop(graph, "button_text") - - col = split.column() - col.prop(graph, "header") - col.prop(graph, "grid") - col.prop(graph, "list") - col.prop(graph, "channel_group") - - col = split.column() - col.prop(graph, "active_channels_group") - col.prop(graph, "dopesheet_channel") - col.prop(graph, "dopesheet_subchannel") - col.prop(graph, "vertex") - - col = split.column() - col.prop(graph, "current_frame") - col.prop(graph, "handle_vertex") - col.prop(graph, "handle_vertex_select") - col.separator() - col.prop(graph, "handle_vertex_size") - - elif theme.theme_area == 'FILE_BROWSER': - file_browse = theme.file_browser - - col = split.column() - col.prop(file_browse, "back") - col.prop(file_browse, "text") - col.prop(file_browse, "text_hi") - - col = split.column() - col.prop(file_browse, "header") - col.prop(file_browse, "list") - - col = split.column() - col.prop(file_browse, "selected_file") - col.prop(file_browse, "tiles") - - col = split.column() - col.prop(file_browse, "active_file") - col.prop(file_browse, "active_file_text") - - elif theme.theme_area == 'NLA_EDITOR': - nla = theme.nla_editor - - col = split.column() - col.prop(nla, "back") - col.prop(nla, "button") - col.prop(nla, "button_title") - - col = split.column() - col.prop(nla, "button_text") - col.prop(nla, "text") - col.prop(nla, "header") - - col = split.column() - col.prop(nla, "grid") - col.prop(nla, "bars") - col.prop(nla, "bars_selected") - - col = split.column() - col.prop(nla, "strips") - col.prop(nla, "strips_selected") - col.prop(nla, "current_frame") - - elif theme.theme_area == 'DOPESHEET_EDITOR': - dope = theme.dopesheet_editor - - col = split.column() - col.prop(dope, "back") - col.prop(dope, "list") - col.prop(dope, "text") - col.prop(dope, "header") - - col = split.column() - col.prop(dope, "grid") - col.prop(dope, "channels") - col.prop(dope, "channels_selected") - col.prop(dope, "channel_group") - - col = split.column() - col.prop(dope, "active_channels_group") - col.prop(dope, "long_key") - col.prop(dope, "long_key_selected") - - col = split.column() - col.prop(dope, "current_frame") - col.prop(dope, "dopesheet_channel") - col.prop(dope, "dopesheet_subchannel") - - elif theme.theme_area == 'IMAGE_EDITOR': - image = theme.image_editor - - col = split.column() - col.prop(image, "back") - col.prop(image, "scope_back") - col.prop(image, "button") - - col = split.column() - col.prop(image, "button_title") - col.prop(image, "button_text") - - col = split.column() - col.prop(image, "header") - - col = split.column() - col.prop(image, "editmesh_active", slider=True) - - elif theme.theme_area == 'SEQUENCE_EDITOR': - seq = theme.sequence_editor - - col = split.column() - col.prop(seq, "back") - col.prop(seq, "button") - col.prop(seq, "button_title") - col.prop(seq, "button_text") - col.prop(seq, "text") - - col = split.column() - col.prop(seq, "header") - col.prop(seq, "grid") - col.prop(seq, "movie_strip") - col.prop(seq, "image_strip") - col.prop(seq, "scene_strip") - - col = split.column() - col.prop(seq, "audio_strip") - col.prop(seq, "effect_strip") - col.prop(seq, "plugin_strip") - col.prop(seq, "transition_strip") - - col = split.column() - col.prop(seq, "meta_strip") - col.prop(seq, "current_frame") - col.prop(seq, "keyframe") - col.prop(seq, "draw_action") - - elif theme.theme_area == 'PROPERTIES': - prop = theme.properties - - col = split.column() - col.prop(prop, "back") - - col = split.column() - col.prop(prop, "title") - - col = split.column() - col.prop(prop, "text") - - col = split.column() - col.prop(prop, "header") - - elif theme.theme_area == 'TEXT_EDITOR': - text = theme.text_editor - - col = split.column() - col.prop(text, "back") - col.prop(text, "button") - col.prop(text, "button_title") - col.prop(text, "button_text") - - col = split.column() - col.prop(text, "text") - col.prop(text, "text_hi") - col.prop(text, "header") - col.prop(text, "line_numbers_background") - - col = split.column() - col.prop(text, "selected_text") - col.prop(text, "cursor") - col.prop(text, "syntax_builtin") - col.prop(text, "syntax_special") - - col = split.column() - col.prop(text, "syntax_comment") - col.prop(text, "syntax_string") - col.prop(text, "syntax_numbers") - - elif theme.theme_area == 'TIMELINE': - time = theme.timeline - - col = split.column() - col.prop(time, "back") - col.prop(time, "text") - - col = split.column() - col.prop(time, "header") - - col = split.column() - col.prop(time, "grid") - - col = split.column() - col.prop(time, "current_frame") - - elif theme.theme_area == 'NODE_EDITOR': - node = theme.node_editor - - col = split.column() - col.prop(node, "back") - col.prop(node, "button") - col.prop(node, "button_title") - col.prop(node, "button_text") - - col = split.column() - col.prop(node, "text") - col.prop(node, "text_hi") - col.prop(node, "header") - col.prop(node, "wires") - - col = split.column() - col.prop(node, "wire_select") - col.prop(node, "selected_text") - col.prop(node, "node_backdrop", slider=True) - col.prop(node, "in_out_node") - - col = split.column() - col.prop(node, "converter_node") - col.prop(node, "operator_node") - col.prop(node, "group_node") - - elif theme.theme_area == 'LOGIC_EDITOR': - logic = theme.logic_editor - - col = split.column() - col.prop(logic, "back") - col.prop(logic, "button") - - col = split.column() - col.prop(logic, "button_title") - col.prop(logic, "button_text") - - col = split.column() - col.prop(logic, "text") - col.prop(logic, "header") - - col = split.column() - col.prop(logic, "panel") - - elif theme.theme_area == 'OUTLINER': - out = theme.outliner - - col = split.column() - col.prop(out, "back") - - col = split.column() - col.prop(out, "text") - - col = split.column() - col.prop(out, "text_hi") - - col = split.column() - col.prop(out, "header") - - elif theme.theme_area == 'INFO': - info = theme.info - - col = split.column() - col.prop(info, "back") - - col = split.column() - col.prop(info, "header") - - col = split.column() - col.prop(info, "header_text") - - col = split.column() - - elif theme.theme_area == 'USER_PREFERENCES': - prefs = theme.user_preferences - - col = split.column() - col.prop(prefs, "back") - - col = split.column() - col.prop(prefs, "text") - - col = split.column() - col.prop(prefs, "header") - - col = split.column() - col.prop(prefs, "header_text") - - elif theme.theme_area == 'CONSOLE': - prefs = theme.console - - col = split.column() - col.prop(prefs, "back") - col.prop(prefs, "header") - - col = split.column() - col.prop(prefs, "line_output") - col.prop(prefs, "line_input") - col.prop(prefs, "line_info") - col.prop(prefs, "line_error") - col.prop(prefs, "cursor") + else: + self._theme_generic(split, getattr(theme, theme.theme_area.lower())) class USERPREF_PT_file(bpy.types.Panel): @@ -1003,6 +686,7 @@ class USERPREF_PT_file(bpy.types.Panel): sub.label(text="Scripts:") sub.label(text="Sounds:") sub.label(text="Temp:") + sub.label(text="Image Editor:") sub.label(text="Animation Player:") sub = col1.column() @@ -1014,6 +698,7 @@ class USERPREF_PT_file(bpy.types.Panel): sub.prop(paths, "python_scripts_directory", text="") sub.prop(paths, "sounds_directory", text="") sub.prop(paths, "temporary_directory", text="") + sub.prop(paths, "image_editor", text="") subsplit = sub.split(percentage=0.3) subsplit.prop(paths, "animation_player_preset", text="") subsplit.prop(paths, "animation_player", text="") @@ -1038,202 +723,29 @@ class USERPREF_PT_file(bpy.types.Panel): sub.enabled = paths.auto_save_temporary_files sub.prop(paths, "auto_save_time", text="Timer (mins)") +from space_userpref_keymap import InputKeyMapPanel -class USERPREF_PT_input(bpy.types.Panel): + +class USERPREF_PT_input(InputKeyMapPanel): bl_space_type = 'USER_PREFERENCES' bl_label = "Input" - bl_region_type = 'WINDOW' - bl_show_header = False def poll(self, context): userpref = context.user_preferences return (userpref.active_section == 'INPUT') - def draw_entry(self, kc, entry, col, level=0): - idname, spaceid, regionid, children = entry - - km = kc.find_keymap(idname, space_type=spaceid, region_type=regionid) - - if km: - self.draw_km(kc, km, children, col, level) - - def indented_layout(self, layout, level): - indentpx = 16 - if level == 0: - level = 0.0001 # Tweak so that a percentage of 0 won't split by half - indent = level * indentpx / bpy.context.region.width - - split = layout.split(percentage=indent) - col = split.column() - col = split.column() - return col - - def draw_km(self, kc, km, children, layout, level): - km = km.active() - - layout.set_context_pointer("keymap", km) - - col = self.indented_layout(layout, level) - - row = col.row() - row.prop(km, "children_expanded", text="", no_bg=True) - row.label(text=km.name) - - row.label() - row.label() - - if km.modal: - row.label(text="", icon='LINKED') - if km.user_defined: - op = row.operator("wm.keymap_restore", text="Restore") - else: - op = row.operator("wm.keymap_edit", text="Edit") - - if km.children_expanded: - if children: - # Put the Parent key map's entries in a 'global' sub-category - # equal in hierarchy to the other children categories - subcol = self.indented_layout(col, level + 1) - subrow = subcol.row() - subrow.prop(km, "items_expanded", text="", no_bg=True) - subrow.label(text="%s (Global)" % km.name) - else: - km.items_expanded = True - - # Key Map items - if km.items_expanded: - for kmi in km.items: - self.draw_kmi(kc, km, kmi, col, level + 1) - - # "Add New" at end of keymap item list - col = self.indented_layout(col, level + 1) - subcol = col.split(percentage=0.2).column() - subcol.active = km.user_defined - op = subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') - - col.separator() - - # Child key maps - if children: - subcol = col.column() - row = subcol.row() - - for entry in children: - self.draw_entry(kc, entry, col, level + 1) - - def draw_kmi(self, kc, km, kmi, layout, level): - map_type = kmi.map_type - - col = self.indented_layout(layout, level) - - if km.user_defined: - col = col.column(align=True) - box = col.box() - else: - box = col.column() - - split = box.split(percentage=0.05) - - # header bar - row = split.row() - row.prop(kmi, "expanded", text="", no_bg=True) - - row = split.row() - row.enabled = km.user_defined - row.prop(kmi, "active", text="", no_bg=True) - - if km.modal: - row.prop(kmi, "propvalue", text="") - else: - row.label(text=kmi.name) - - row = split.row() - row.enabled = km.user_defined - row.prop(kmi, "map_type", text="") - if map_type == 'KEYBOARD': - row.prop(kmi, "type", text="", full_event=True) - elif map_type == 'MOUSE': - row.prop(kmi, "type", text="", full_event=True) - elif map_type == 'TWEAK': - subrow = row.row() - subrow.prop(kmi, "type", text="") - subrow.prop(kmi, "value", text="") - elif map_type == 'TIMER': - row.prop(kmi, "type", text="") - else: - row.label() - - if kmi.id: - op = row.operator("wm.keyitem_restore", text="", icon='BACK') - op.item_id = kmi.id - op = row.operator("wm.keyitem_remove", text="", icon='X') - op.item_id = kmi.id - - # Expanded, additional event settings - if kmi.expanded: - box = col.box() - - box.enabled = km.user_defined - - if map_type not in ('TEXTINPUT', 'TIMER'): - split = box.split(percentage=0.4) - sub = split.row() - - if km.modal: - sub.prop(kmi, "propvalue", text="") - else: - sub.prop(kmi, "idname", text="") - - sub = split.column() - subrow = sub.row(align=True) - - if map_type == 'KEYBOARD': - subrow.prop(kmi, "type", text="", event=True) - subrow.prop(kmi, "value", text="") - elif map_type == 'MOUSE': - subrow.prop(kmi, "type", text="") - subrow.prop(kmi, "value", text="") - - subrow = sub.row() - subrow.scale_x = 0.75 - subrow.prop(kmi, "any") - subrow.prop(kmi, "shift") - subrow.prop(kmi, "ctrl") - subrow.prop(kmi, "alt") - subrow.prop(kmi, "oskey", text="Cmd") - subrow.prop(kmi, "key_modifier", text="", event=True) - - def display_properties(properties, title=None): - box.separator() - if title: - box.label(text=title) - flow = box.column_flow(columns=2) - for pname in dir(properties): - if not properties.is_property_hidden(pname): - value = eval("properties." + pname) - if isinstance(value, bpy.types.OperatorProperties): - display_properties(value, title=pname) - else: - flow.prop(properties, pname) - - # Operator properties - props = kmi.properties - if props is not None: - display_properties(props) - - # Modal key maps attached to this operator - if not km.modal: - kmm = kc.find_keymap_modal(kmi.idname) - if kmm: - self.draw_km(kc, kmm, None, layout, level + 1) - layout.set_context_pointer("keymap", km) - def draw_input_prefs(self, inputs, layout): # General settings row = layout.row() col = row.column() sub = col.column() + sub.label(text="Presets:") + subrow = sub.row(align=True) + subrow.menu("USERPREF_MT_interaction_presets", text=bpy.types.USERPREF_MT_interaction_presets.bl_label) + subrow.operator("wm.interaction_preset_add", text="", icon='ZOOMIN') + sub.separator() + sub.label(text="Mouse:") sub1 = sub.column() sub1.enabled = (inputs.select_mouse == 'RIGHT') @@ -1257,8 +769,8 @@ class USERPREF_PT_input(bpy.types.Panel): sub.row().prop(inputs, "view_rotation", expand=True) sub.label(text="Zoom Style:") - sub.row().prop(inputs, "viewport_zoom_style", expand=True) - if inputs.viewport_zoom_style == 'DOLLY': + sub.row().prop(inputs, "zoom_style", text="") + if inputs.zoom_style == 'DOLLY': sub.row().prop(inputs, "zoom_axis", expand=True) sub.prop(inputs, "invert_zoom_direction") @@ -1271,50 +783,15 @@ class USERPREF_PT_input(bpy.types.Panel): #sub.prop(view, "wheel_scroll_lines", text="Scroll Lines") col.separator() - + ''' not implemented yet sub = col.column() sub.label(text="NDOF Device:") sub.prop(inputs, "ndof_pan_speed", text="Pan Speed") sub.prop(inputs, "ndof_rotate_speed", text="Orbit Speed") + ''' row.separator() - def draw_filtered(self, kc, layout): - filter = kc.filter.lower() - - for km in kc.keymaps: - km = km.active() - layout.set_context_pointer("keymap", km) - - filtered_items = [kmi for kmi in km.items if filter in kmi.name.lower()] - - if len(filtered_items) != 0: - col = layout.column() - - row = col.row() - row.label(text=km.name, icon="DOT") - - row.label() - row.label() - - if km.user_defined: - op = row.operator("wm.keymap_restore", text="Restore") - else: - op = row.operator("wm.keymap_edit", text="Edit") - - for kmi in filtered_items: - self.draw_kmi(kc, km, kmi, col, 1) - - # "Add New" at end of keymap item list - col = self.indented_layout(layout, 1) - subcol = col.split(percentage=0.2).column() - subcol.active = km.user_defined - op = subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') - - def draw_hierarchy(self, defkc, layout): - for entry in KM_HIERARCHY: - self.draw_entry(defkc, entry, layout) - def draw(self, context): layout = self.layout @@ -1333,28 +810,7 @@ class USERPREF_PT_input(bpy.types.Panel): self.draw_input_prefs(inputs, split) # Keymap Settings - col = split.column() - # kc = wm.active_keyconfig - kc = wm.default_keyconfig - - sub = col.column() - - subsplit = sub.split() - subcol = subsplit.column() - row = subcol.row() - row.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Configuration:") - - layout.set_context_pointer("keyconfig", wm.active_keyconfig) - row.operator("wm.keyconfig_remove", text="", icon='X') - - row.prop(kc, "filter", icon="VIEWZOOM") - - col.separator() - - if kc.filter != "": - self.draw_filtered(kc, col) - else: - self.draw_hierarchy(kc, col) + self.draw_keymaps(context, split) #print("runtime", time.time() - start) @@ -1369,7 +825,8 @@ class USERPREF_PT_addons(bpy.types.Panel): userpref = context.user_preferences return (userpref.active_section == 'ADDONS') - def _addon_list(self): + @staticmethod + def _addon_list(): import sys modules = [] loaded_modules = set() @@ -1388,22 +845,142 @@ class USERPREF_PT_addons(bpy.types.Panel): userpref = context.user_preferences used_ext = {ext.module for ext in userpref.addons} - col = layout.column() + # collect the categories that can be filtered on + addons = [(mod, addon_info_get(mod)) for mod in self._addon_list()] - for mod in self._addon_list(): - box = col.box() - row = box.row() - text = mod.__doc__ - if not text: - text = mod.__name__ - row.label(text=text) + cats = {info["category"] for mod, info in addons} + cats.discard("") + + cats = ["All", "Enabled", "Disabled"] + sorted(cats) + + bpy.types.Scene.EnumProperty(items=[(cat, cat, cat + " addons") for cat in cats], + name="Category", attr="addon_filter", description="Filter add-ons by category") + bpy.types.Scene.StringProperty(name="Search", attr="addon_search", + description="Search within the selected filter") + + split = layout.split(percentage=0.2) + col = split.column() + col.prop(context.scene, "addon_filter", text="Filter", expand=True) + col.prop(context.scene, "addon_search", text="", icon='VIEWZOOM') + + col = split.column() + + filter = context.scene.addon_filter + search = context.scene.addon_search.lower() + + for mod, info in addons: module_name = mod.__name__ - row.operator("wm.addon_disable" if module_name in used_ext else "wm.addon_enable").module = module_name + is_enabled = module_name in used_ext + + # check if add-on should be visible with current filters + if (filter == "All") or \ + (filter == info["category"]) or \ + (filter == "Enabled" and is_enabled) or \ + (filter == "Disabled" and not is_enabled): + + + if search and search not in info["name"].lower(): + if info["author"]: + if search not in info["author"].lower(): + continue + else: + continue + + # Addon UI Code + box = col.column().box() + colsub = box.column() + row = colsub.row() + + row.operator("wm.addon_expand", icon='TRIA_DOWN' if info["expanded"] else 'TRIA_RIGHT', emboss=False).module = module_name + + rowsub = row.row() + rowsub.active = is_enabled + rowsub.label(text=info["name"], icon='ERROR' if info["warning"] else 'BLENDER') + + if is_enabled: + row.operator("wm.addon_disable", icon='CHECKBOX_HLT', text="", emboss=False).module = module_name + else: + row.operator("wm.addon_enable", icon='CHECKBOX_DEHLT', text="", emboss=False).module = module_name + + # Expanded UI (only if additional infos are available) + if info["expanded"]: + if info["description"]: + split = colsub.row().split(percentage=0.15) + split.label(text='Description:') + split.label(text=info["description"]) + if info["location"]: + split = colsub.row().split(percentage=0.15) + split.label(text='Location:') + split.label(text=info["location"]) + if info["author"]: + split = colsub.row().split(percentage=0.15) + split.label(text='Author:') + split.label(text=info["author"]) + if info["version"]: + split = colsub.row().split(percentage=0.15) + split.label(text='Version:') + split.label(text=info["version"]) + if info["warning"]: + split = colsub.row().split(percentage=0.15) + split.label(text="Warning:") + split.label(text=' ' + info["warning"], icon='ERROR') + if info["wiki_url"] or info["tracker_url"]: + split = colsub.row().split(percentage=0.15) + split.label(text="Internet:") + if info["wiki_url"]: + split.operator("wm.url_open", text="Link to the Wiki", icon='HELP').url = info["wiki_url"] + if info["tracker_url"]: + split.operator("wm.url_open", text="Report a Bug", icon='URL').url = info["tracker_url"] + + if info["wiki_url"] and info["tracker_url"]: + split.separator() + else: + split.separator() + split.separator() + + # Append missing scripts + # First collect scripts that are used but have no script file. + module_names = {mod.__name__ for mod, info in addons} + missing_modules = {ext for ext in used_ext if ext not in module_names} + + if missing_modules and filter in ("All", "Enabled"): + col.column().separator() + col.column().label(text="Missing script files") + + module_names = {mod.__name__ for mod, info in addons} + for ext in sorted(missing_modules): + # Addon UI Code + box = col.column().box() + colsub = box.column() + row = colsub.row() + + row.label(text=ext, icon='ERROR') + row.operator("wm.addon_disable").module = ext from bpy.props import * +def addon_info_get(mod, info_basis={"name": "", "author": "", "version": "", "blender": "", "location": "", "description": "", "wiki_url": "", "tracker_url": "", "category": "", "warning": "", "expanded": False}): + addon_info = getattr(mod, "bl_addon_info", {}) + + # avoid re-initializing + if "_init" in addon_info: + return addon_info + + if not addon_info: + mod.bl_addon_info = addon_info + + for key, value in info_basis.items(): + addon_info.setdefault(key, value) + + if not addon_info["name"]: + addon_info["name"] = mod.__name__ + + addon_info["_init"] = None + return addon_info + + class WM_OT_addon_enable(bpy.types.Operator): "Enable an addon" bl_idname = "wm.addon_enable" @@ -1412,16 +989,24 @@ class WM_OT_addon_enable(bpy.types.Operator): module = StringProperty(name="Module", description="Module name of the addon to enable") def execute(self, context): - import traceback - ext = context.user_preferences.addons.new() module_name = self.properties.module - ext.module = module_name try: mod = __import__(module_name) mod.register() except: + import traceback traceback.print_exc() + return {'CANCELLED'} + + ext = context.user_preferences.addons.new() + ext.module = module_name + + # check if add-on is written for current blender version, or raise a warning + info = addon_info_get(mod) + + if info.get("blender", (0, 0, 0)) > bpy.app.version: + self.report("WARNING','This script was written for a newer version of Blender and might not function (correctly).\nThe script is enabled though.") return {'FINISHED'} @@ -1459,20 +1044,18 @@ class WM_OT_addon_disable(bpy.types.Operator): class WM_OT_addon_install(bpy.types.Operator): "Install an addon" bl_idname = "wm.addon_install" - bl_label = "Install Add-On" + bl_label = "Install Add-On..." module = StringProperty(name="Module", description="Module name of the addon to disable") - path = StringProperty(name="File Path", description="File path to write file to") - filename = StringProperty(name="File Name", description="Name of the file") - directory = StringProperty(name="Directory", description="Directory of the file") + filepath = StringProperty(name="File Path", description="File path to write file to") filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) def execute(self, context): import traceback import zipfile - pyfile = self.properties.path + pyfile = self.properties.filepath path_addons = bpy.utils.script_paths("addons")[-1] @@ -1483,7 +1066,7 @@ class WM_OT_addon_install(bpy.types.Operator): #extract the file to "addons" file_to_extract.extractall(path_addons) - + except: traceback.print_exc() return {'CANCELLED'} @@ -1518,382 +1101,26 @@ class WM_OT_addon_install(bpy.types.Operator): return {'RUNNING_MODAL'} -class WM_OT_keyconfig_test(bpy.types.Operator): - "Test keyconfig for conflicts" - bl_idname = "wm.keyconfig_test" - bl_label = "Test Key Configuration for Conflicts" +class WM_OT_addon_expand(bpy.types.Operator): + "Display more information on this add-on" + bl_idname = "wm.addon_expand" + bl_label = "" - def testEntry(self, kc, entry, src=None, parent=None): - result = False - - def kmistr(kmi): - if km.modal: - s = ["kmi = km.add_modal_item(\'%s\', \'%s\', \'%s\'" % (kmi.propvalue, kmi.type, kmi.value)] - else: - s = ["kmi = km.add_item(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value)] - - if kmi.any: - s.append(", any=True") - else: - if kmi.shift: - s.append(", shift=True") - if kmi.ctrl: - s.append(", ctrl=True") - if kmi.alt: - s.append(", alt=True") - if kmi.oskey: - s.append(", oskey=True") - if kmi.key_modifier and kmi.key_modifier != 'NONE': - s.append(", key_modifier=\'%s\'" % kmi.key_modifier) - - s.append(")\n") - - def export_properties(prefix, properties): - for pname in dir(properties): - if not properties.is_property_hidden(pname): - value = eval("properties.%s" % pname) - if isinstance(value, bpy.types.OperatorProperties): - export_properties(prefix + "." + pname, value) - elif properties.is_property_set(pname): - value = _string_value(value) - if value != "": - s.append(prefix + ".%s = %s\n" % (pname, value)) - - props = kmi.properties - - if props is not None: - export_properties("kmi.properties", props) - - return "".join(s).strip() - - idname, spaceid, regionid, children = entry - - km = kc.find_keymap(idname, space_type=spaceid, region_type=regionid) - - if km: - km = km.active() - - if src: - for item in km.items: - if src.compare(item): - print("===========") - print(parent.name) - print(kmistr(src)) - print(km.name) - print(kmistr(item)) - result = True - - for child in children: - if self.testEntry(kc, child, src, parent): - result = True - else: - for i in range(len(km.items)): - src = km.items[i] - - for child in children: - if self.testEntry(kc, child, src, km): - result = True - - for j in range(len(km.items) - i - 1): - item = km.items[j + i + 1] - if src.compare(item): - print("===========") - print(km.name) - print(kmistr(src)) - print(kmistr(item)) - result = True - - for child in children: - if self.testEntry(kc, child): - result = True - - return result - - def testConfig(self, kc): - result = False - for entry in KM_HIERARCHY: - if self.testEntry(kc, entry): - result = True - return result + module = StringProperty(name="Module", description="Module name of the addon to expand") def execute(self, context): - wm = context.manager - kc = wm.default_keyconfig - - if self.testConfig(kc): - print("CONFLICT") - - return {'FINISHED'} - - -def _string_value(value): - if isinstance(value, str) or isinstance(value, bool) or isinstance(value, float) or isinstance(value, int): - result = repr(value) - elif getattr(value, '__len__', False): - repr(list(value)) - else: - print("Export key configuration: can't write ", value) - - return result - - -class WM_OT_keyconfig_import(bpy.types.Operator): - "Import key configuration from a python script" - bl_idname = "wm.keyconfig_import" - bl_label = "Import Key Configuration..." - - path = StringProperty(name="File Path", description="File path to write file to") - filename = StringProperty(name="File Name", description="Name of the file") - directory = StringProperty(name="Directory", description="Directory of the file") - filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) - filter_text = BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) - filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) - - keep_original = BoolProperty(name="Keep original", description="Keep original file after copying to configuration folder", default=True) - - def execute(self, context): - if not self.properties.path: - raise Exception("File path not set") - - f = open(self.properties.path, "r") - if not f: - raise Exception("Could not open file") - - name_pattern = re.compile("^kc = wm.add_keyconfig\('(.*)'\)$") - - for line in f.readlines(): - match = name_pattern.match(line) - - if match: - config_name = match.groups()[0] - - f.close() - - path = os.path.split(os.path.split(__file__)[0])[0] # remove ui/space_userpref.py - path = os.path.join(path, "cfg") - - # create config folder if needed - if not os.path.exists(path): - os.mkdir(path) - - path = os.path.join(path, config_name + ".py") - - if self.properties.keep_original: - shutil.copy(self.properties.path, path) - else: - shutil.move(self.properties.path, path) - - __import__(config_name) - - wm = bpy.context.manager - wm.active_keyconfig = wm.keyconfigs[config_name] - - return {'FINISHED'} - - def invoke(self, context, event): - wm = context.manager - wm.add_fileselect(self) - return {'RUNNING_MODAL'} - - -class WM_OT_keyconfig_export(bpy.types.Operator): - "Export key configuration to a python script" - bl_idname = "wm.keyconfig_export" - bl_label = "Export Key Configuration..." - - path = StringProperty(name="File Path", description="File path to write file to") - filename = StringProperty(name="File Name", description="Name of the file") - directory = StringProperty(name="Directory", description="Directory of the file") - filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) - filter_text = BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) - filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) - - def execute(self, context): - if not self.properties.path: - raise Exception("File path not set") - - f = open(self.properties.path, "w") - if not f: - raise Exception("Could not open file") - - wm = context.manager - kc = wm.active_keyconfig - - if kc.name == 'Blender': - name = os.path.splitext(os.path.basename(self.properties.path))[0] - else: - name = kc.name - - f.write("# Configuration %s\n" % name) - - f.write("import bpy\n\n") - f.write("wm = bpy.context.manager\n") - f.write("kc = wm.add_keyconfig('%s')\n\n" % name) - - for km in kc.keymaps: - km = km.active() - f.write("# Map %s\n" % km.name) - f.write("km = kc.add_keymap('%s', space_type='%s', region_type='%s', modal=%s)\n\n" % (km.name, km.space_type, km.region_type, km.modal)) - for kmi in km.items: - if km.modal: - f.write("kmi = km.add_modal_item('%s', '%s', '%s'" % (kmi.propvalue, kmi.type, kmi.value)) - else: - f.write("kmi = km.add_item('%s', '%s', '%s'" % (kmi.idname, kmi.type, kmi.value)) - if kmi.any: - f.write(", any=True") - else: - if kmi.shift: - f.write(", shift=True") - if kmi.ctrl: - f.write(", ctrl=True") - if kmi.alt: - f.write(", alt=True") - if kmi.oskey: - f.write(", oskey=True") - if kmi.key_modifier and kmi.key_modifier != 'NONE': - f.write(", key_modifier='%s'" % kmi.key_modifier) - f.write(")\n") - - def export_properties(prefix, properties): - for pname in dir(properties): - if not properties.is_property_hidden(pname): - value = eval("properties.%s" % pname) - if isinstance(value, bpy.types.OperatorProperties): - export_properties(prefix + "." + pname, value) - elif properties.is_property_set(pname): - value = _string_value(value) - if value != "": - f.write(prefix + ".%s = %s\n" % (pname, value)) - - props = kmi.properties - - if props is not None: - export_properties("kmi.properties", props) - - f.write("\n") - - f.close() - - return {'FINISHED'} - - def invoke(self, context, event): - wm = context.manager - wm.add_fileselect(self) - return {'RUNNING_MODAL'} - - -class WM_OT_keymap_edit(bpy.types.Operator): - "Edit key map" - bl_idname = "wm.keymap_edit" - bl_label = "Edit Key Map" - - def execute(self, context): - wm = context.manager - km = context.keymap - km.copy_to_user() - return {'FINISHED'} - - -class WM_OT_keymap_restore(bpy.types.Operator): - "Restore key map(s)" - bl_idname = "wm.keymap_restore" - bl_label = "Restore Key Map(s)" - - all = BoolProperty(attr="all", name="All Keymaps", description="Restore all keymaps to default") - - def execute(self, context): - wm = context.manager - - if self.properties.all: - for km in wm.default_keyconfig.keymaps: - km.restore_to_default() - else: - km = context.keymap - km.restore_to_default() - - return {'FINISHED'} - - -class WM_OT_keyitem_restore(bpy.types.Operator): - "Restore key map item" - bl_idname = "wm.keyitem_restore" - bl_label = "Restore Key Map Item" - - item_id = IntProperty(attr="item_id", name="Item Identifier", description="Identifier of the item to remove") - - def execute(self, context): - wm = context.manager - km = context.keymap - kmi = km.item_from_id(self.properties.item_id) - - km.restore_item_to_default(kmi) - - return {'FINISHED'} - - -class WM_OT_keyitem_add(bpy.types.Operator): - "Add key map item" - bl_idname = "wm.keyitem_add" - bl_label = "Add Key Map Item" - - def execute(self, context): - wm = context.manager - km = context.keymap - kc = wm.default_keyconfig - - if km.modal: - km.add_modal_item("", 'A', 'PRESS') # kmi - else: - km.add_item("none", 'A', 'PRESS') # kmi - - # clear filter and expand keymap so we can see the newly added item - if kc.filter != '': - kc.filter = '' - km.items_expanded = True - km.children_expanded = True - - return {'FINISHED'} - - -class WM_OT_keyitem_remove(bpy.types.Operator): - "Remove key map item" - bl_idname = "wm.keyitem_remove" - bl_label = "Remove Key Map Item" - - item_id = IntProperty(attr="item_id", name="Item Identifier", description="Identifier of the item to remove") - - def execute(self, context): - wm = context.manager - km = context.keymap - kmi = km.item_from_id(self.properties.item_id) - km.remove_item(kmi) - return {'FINISHED'} - - -class WM_OT_keyconfig_remove(bpy.types.Operator): - "Remove key config" - bl_idname = "wm.keyconfig_remove" - bl_label = "Remove Key Config" - - def poll(self, context): - wm = context.manager - return wm.active_keyconfig.user_defined - - def execute(self, context): - wm = context.manager - - keyconfig = wm.active_keyconfig - - module = __import__(keyconfig.name) - - os.remove(module.__file__) - - compiled_path = module.__file__ + "c" # for .pyc - - if os.path.exists(compiled_path): - os.remove(compiled_path) - - wm.remove_keyconfig(keyconfig) + module_name = self.properties.module + + # unlikely to fail, module should have alredy been imported + try: + mod = __import__(module_name) + except: + import traceback + traceback.print_exc() + return {'CANCELLED'} + + info = addon_info_get(mod) + info["expanded"] = not info["expanded"] return {'FINISHED'} @@ -1908,19 +1135,13 @@ classes = [ USERPREF_PT_input, USERPREF_PT_addons, + USERPREF_MT_interaction_presets, + USERPREF_MT_splash, + WM_OT_addon_enable, WM_OT_addon_disable, WM_OT_addon_install, - - WM_OT_keyconfig_export, - WM_OT_keyconfig_import, - WM_OT_keyconfig_test, - WM_OT_keyconfig_remove, - WM_OT_keymap_edit, - WM_OT_keymap_restore, - WM_OT_keyitem_add, - WM_OT_keyitem_remove, - WM_OT_keyitem_restore] + WM_OT_addon_expand] def register(): diff --git a/release/scripts/ui/space_userpref_keymap.py b/release/scripts/ui/space_userpref_keymap.py new file mode 100644 index 00000000000..c93b24d5cb2 --- /dev/null +++ b/release/scripts/ui/space_userpref_keymap.py @@ -0,0 +1,812 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> +import bpy +import os +import re +import shutil + +KM_HIERARCHY = [ + ('Window', 'EMPTY', 'WINDOW', []), # file save, window change, exit + ('Screen', 'EMPTY', 'WINDOW', [ # full screen, undo, screenshot + ('Screen Editing', 'EMPTY', 'WINDOW', []), # resizing, action corners + ]), + + ('View2D', 'EMPTY', 'WINDOW', []), # view 2d navigation (per region) + ('View2D Buttons List', 'EMPTY', 'WINDOW', []), # view 2d with buttons navigation + ('Header', 'EMPTY', 'WINDOW', []), # header stuff (per region) + ('Grease Pencil', 'EMPTY', 'WINDOW', []), # grease pencil stuff (per region) + + ('3D View', 'VIEW_3D', 'WINDOW', [ # view 3d navigation and generic stuff (select, transform) + ('Object Mode', 'EMPTY', 'WINDOW', []), + ('Mesh', 'EMPTY', 'WINDOW', []), + ('Curve', 'EMPTY', 'WINDOW', []), + ('Armature', 'EMPTY', 'WINDOW', []), + ('Metaball', 'EMPTY', 'WINDOW', []), + ('Lattice', 'EMPTY', 'WINDOW', []), + ('Font', 'EMPTY', 'WINDOW', []), + + ('Pose', 'EMPTY', 'WINDOW', []), + + ('Vertex Paint', 'EMPTY', 'WINDOW', []), + ('Weight Paint', 'EMPTY', 'WINDOW', []), + ('Face Mask', 'EMPTY', 'WINDOW', []), + ('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d + ('Sculpt', 'EMPTY', 'WINDOW', []), + + ('Armature Sketch', 'EMPTY', 'WINDOW', []), + ('Particle', 'EMPTY', 'WINDOW', []), + + ('Object Non-modal', 'EMPTY', 'WINDOW', []), # mode change + + ('3D View Generic', 'VIEW_3D', 'WINDOW', []) # toolbar and properties + ]), + + ('Frames', 'EMPTY', 'WINDOW', []), # frame navigation (per region) + ('Markers', 'EMPTY', 'WINDOW', []), # markers (per region) + ('Animation', 'EMPTY', 'WINDOW', []), # frame change on click, preview range (per region) + ('Animation Channels', 'EMPTY', 'WINDOW', []), + ('Graph Editor', 'GRAPH_EDITOR', 'WINDOW', [ + ('Graph Editor Generic', 'GRAPH_EDITOR', 'WINDOW', []) + ]), + ('Dopesheet', 'DOPESHEET_EDITOR', 'WINDOW', []), + ('NLA Editor', 'NLA_EDITOR', 'WINDOW', [ + ('NLA Channels', 'NLA_EDITOR', 'WINDOW', []), + ('NLA Generic', 'NLA_EDITOR', 'WINDOW', []) + ]), + + ('Image', 'IMAGE_EDITOR', 'WINDOW', [ + ('UV Editor', 'EMPTY', 'WINDOW', []), # image (reverse order, UVEdit before Image + ('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d + ('Image Generic', 'IMAGE_EDITOR', 'WINDOW', []) + ]), + + ('Timeline', 'TIMELINE', 'WINDOW', []), + ('Outliner', 'OUTLINER', 'WINDOW', []), + + ('Node Editor', 'NODE_EDITOR', 'WINDOW', [ + ('Node Generic', 'NODE_EDITOR', 'WINDOW', []) + ]), + ('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', []), + ('Logic Editor', 'LOGIC_EDITOR', 'WINDOW', []), + + ('File Browser', 'FILE_BROWSER', 'WINDOW', [ + ('File Browser Main', 'FILE_BROWSER', 'WINDOW', []), + ('File Browser Buttons', 'FILE_BROWSER', 'WINDOW', []) + ]), + + ('Property Editor', 'PROPERTIES', 'WINDOW', []), # align context menu + + ('Script', 'SCRIPTS_WINDOW', 'WINDOW', []), + ('Text', 'TEXT_EDITOR', 'WINDOW', []), + ('Console', 'CONSOLE', 'WINDOW', []), + + ('View3D Gesture Circle', 'EMPTY', 'WINDOW', []), + ('Gesture Border', 'EMPTY', 'WINDOW', []), + ('Standard Modal Map', 'EMPTY', 'WINDOW', []), + ('Transform Modal Map', 'EMPTY', 'WINDOW', []), + ('View3D Fly Modal', 'EMPTY', 'WINDOW', []), + ('View3D Rotate Modal', 'EMPTY', 'WINDOW', []), + ('View3D Move Modal', 'EMPTY', 'WINDOW', []), + ('View3D Zoom Modal', 'EMPTY', 'WINDOW', []), + ] + + +def _km_exists_in(km, export_keymaps): + for km2, kc in export_keymaps: + if km2.name == km.name: + return True + return False + + +def _merge_keymaps(kc1, kc2): + """ note: kc1 takes priority over kc2 + """ + merged_keymaps = [(km, kc1) for km in kc1.keymaps] + if kc1 != kc2: + merged_keymaps.extend([(km, kc2) for km in kc2.keymaps if not _km_exists_in(km, merged_keymaps)]) + + return merged_keymaps + + +class InputKeyMapPanel(bpy.types.Panel): + bl_space_type = 'USER_PREFERENCES' + bl_label = "Input" + bl_region_type = 'WINDOW' + bl_show_header = False + + def draw_entry(self, display_keymaps, entry, col, level=0): + idname, spaceid, regionid, children = entry + + for km, kc in display_keymaps: + if km.name == idname and km.space_type == spaceid and km.region_type == regionid: + self.draw_km(display_keymaps, kc, km, children, col, level) + + ''' + km = kc.find_keymap(idname, space_type=spaceid, region_type=regionid) + if not km: + kc = defkc + km = kc.find_keymap(idname, space_type=spaceid, region_type=regionid) + + if km: + self.draw_km(kc, km, children, col, level) + ''' + + def indented_layout(self, layout, level): + indentpx = 16 + if level == 0: + level = 0.0001 # Tweak so that a percentage of 0 won't split by half + indent = level * indentpx / bpy.context.region.width + + split = layout.split(percentage=indent) + col = split.column() + col = split.column() + return col + + def draw_km(self, display_keymaps, kc, km, children, layout, level): + km = km.active() + + layout.set_context_pointer("keymap", km) + + col = self.indented_layout(layout, level) + + row = col.row() + row.prop(km, "children_expanded", text="", emboss=False) + row.label(text=km.name) + + row.label() + row.label() + + if km.modal: + row.label(text="", icon='LINKED') + if km.user_defined: + op = row.operator("wm.keymap_restore", text="Restore") + else: + op = row.operator("wm.keymap_edit", text="Edit") + + if km.children_expanded: + if children: + # Put the Parent key map's entries in a 'global' sub-category + # equal in hierarchy to the other children categories + subcol = self.indented_layout(col, level + 1) + subrow = subcol.row() + subrow.prop(km, "items_expanded", text="", emboss=False) + subrow.label(text="%s (Global)" % km.name) + else: + km.items_expanded = True + + # Key Map items + if km.items_expanded: + for kmi in km.items: + self.draw_kmi(display_keymaps, kc, km, kmi, col, level + 1) + + # "Add New" at end of keymap item list + col = self.indented_layout(col, level + 1) + subcol = col.split(percentage=0.2).column() + subcol.enabled = km.user_defined + op = subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') + + col.separator() + + # Child key maps + if children: + subcol = col.column() + row = subcol.row() + + for entry in children: + self.draw_entry(display_keymaps, entry, col, level + 1) + + def draw_kmi(self, display_keymaps, kc, km, kmi, layout, level): + map_type = kmi.map_type + + col = self.indented_layout(layout, level) + + if km.user_defined: + col = col.column(align=True) + box = col.box() + else: + box = col.column() + + split = box.split(percentage=0.05) + + # header bar + row = split.row() + row.prop(kmi, "expanded", text="", emboss=False) + + row = split.row() + row.enabled = km.user_defined + row.prop(kmi, "active", text="", emboss=False) + + if km.modal: + row.prop(kmi, "propvalue", text="") + else: + row.label(text=kmi.name) + + row = split.row() + row.enabled = km.user_defined + row.prop(kmi, "map_type", text="") + if map_type == 'KEYBOARD': + row.prop(kmi, "type", text="", full_event=True) + elif map_type == 'MOUSE': + row.prop(kmi, "type", text="", full_event=True) + elif map_type == 'TWEAK': + subrow = row.row() + subrow.prop(kmi, "type", text="") + subrow.prop(kmi, "value", text="") + elif map_type == 'TIMER': + row.prop(kmi, "type", text="") + else: + row.label() + + if kmi.id: + op = row.operator("wm.keyitem_restore", text="", icon='BACK') + op.item_id = kmi.id + op = row.operator("wm.keyitem_remove", text="", icon='X') + op.item_id = kmi.id + + # Expanded, additional event settings + if kmi.expanded: + box = col.box() + + box.enabled = km.user_defined + + if map_type not in ('TEXTINPUT', 'TIMER'): + split = box.split(percentage=0.4) + sub = split.row() + + if km.modal: + sub.prop(kmi, "propvalue", text="") + else: + sub.prop(kmi, "idname", text="") + + sub = split.column() + subrow = sub.row(align=True) + + if map_type == 'KEYBOARD': + subrow.prop(kmi, "type", text="", event=True) + subrow.prop(kmi, "value", text="") + elif map_type == 'MOUSE': + subrow.prop(kmi, "type", text="") + subrow.prop(kmi, "value", text="") + + subrow = sub.row() + subrow.scale_x = 0.75 + subrow.prop(kmi, "any") + subrow.prop(kmi, "shift") + subrow.prop(kmi, "ctrl") + subrow.prop(kmi, "alt") + subrow.prop(kmi, "oskey", text="Cmd") + subrow.prop(kmi, "key_modifier", text="", event=True) + + def display_properties(properties, title=None): + box.separator() + if title: + box.label(text=title) + flow = box.column_flow(columns=2) + for pname in dir(properties): + if not properties.is_property_hidden(pname): + value = eval("properties." + pname) + if isinstance(value, bpy.types.OperatorProperties): + display_properties(value, title=pname) + else: + flow.prop(properties, pname) + + # Operator properties + props = kmi.properties + if props is not None: + display_properties(props) + + # Modal key maps attached to this operator + if not km.modal: + kmm = kc.find_keymap_modal(kmi.idname) + if kmm: + self.draw_km(display_keymaps, kc, kmm, None, layout, level + 1) + layout.set_context_pointer("keymap", km) + + def draw_filtered(self, display_keymaps, filter, layout): + for km, kc in display_keymaps: + km = km.active() + layout.set_context_pointer("keymap", km) + + filtered_items = [kmi for kmi in km.items if filter in kmi.name.lower()] + + if len(filtered_items) != 0: + col = layout.column() + + row = col.row() + row.label(text=km.name, icon="DOT") + + row.label() + row.label() + + if km.user_defined: + op = row.operator("wm.keymap_restore", text="Restore") + else: + op = row.operator("wm.keymap_edit", text="Edit") + + for kmi in filtered_items: + self.draw_kmi(display_keymaps, kc, km, kmi, col, 1) + + # "Add New" at end of keymap item list + col = self.indented_layout(layout, 1) + subcol = col.split(percentage=0.2).column() + subcol.enabled = km.user_defined + op = subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') + + def draw_hierarchy(self, display_keymaps, layout): + for entry in KM_HIERARCHY: + self.draw_entry(display_keymaps, entry, layout) + + def draw_keymaps(self, context, layout): + wm = context.manager + kc = wm.active_keyconfig + defkc = wm.default_keyconfig + + col = layout.column() + sub = col.column() + + subsplit = sub.split() + subcol = subsplit.column() + + row = subcol.row() + row.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Key Config:") + layout.set_context_pointer("keyconfig", wm.active_keyconfig) + row.operator("wm.keyconfig_remove", text="", icon='X') + + row.prop(context.space_data, "filter", icon="VIEWZOOM") + + col.separator() + + display_keymaps = _merge_keymaps(kc, defkc) + if context.space_data.filter != "": + filter = context.space_data.filter.lower() + self.draw_filtered(display_keymaps, filter, col) + else: + self.draw_hierarchy(display_keymaps, col) + + +from bpy.props import * + + +class WM_OT_keyconfig_test(bpy.types.Operator): + "Test keyconfig for conflicts" + bl_idname = "wm.keyconfig_test" + bl_label = "Test Key Configuration for Conflicts" + + def testEntry(self, kc, entry, src=None, parent=None): + result = False + + def kmistr(kmi): + if km.modal: + s = ["kmi = km.items.add_modal(\'%s\', \'%s\', \'%s\'" % (kmi.propvalue, kmi.type, kmi.value)] + else: + s = ["kmi = km.items.add(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value)] + + if kmi.any: + s.append(", any=True") + else: + if kmi.shift: + s.append(", shift=True") + if kmi.ctrl: + s.append(", ctrl=True") + if kmi.alt: + s.append(", alt=True") + if kmi.oskey: + s.append(", oskey=True") + if kmi.key_modifier and kmi.key_modifier != 'NONE': + s.append(", key_modifier=\'%s\'" % kmi.key_modifier) + + s.append(")\n") + + def export_properties(prefix, properties): + for pname in dir(properties): + if not properties.is_property_hidden(pname): + value = eval("properties.%s" % pname) + if isinstance(value, bpy.types.OperatorProperties): + export_properties(prefix + "." + pname, value) + elif properties.is_property_set(pname): + value = _string_value(value) + if value != "": + s.append(prefix + ".%s = %s\n" % (pname, value)) + + props = kmi.properties + + if props is not None: + export_properties("kmi.properties", props) + + return "".join(s).strip() + + idname, spaceid, regionid, children = entry + + km = kc.find_keymap(idname, space_type=spaceid, region_type=regionid) + + if km: + km = km.active() + + if src: + for item in km.items: + if src.compare(item): + print("===========") + print(parent.name) + print(kmistr(src)) + print(km.name) + print(kmistr(item)) + result = True + + for child in children: + if self.testEntry(kc, child, src, parent): + result = True + else: + for i in range(len(km.items)): + src = km.items[i] + + for child in children: + if self.testEntry(kc, child, src, km): + result = True + + for j in range(len(km.items) - i - 1): + item = km.items[j + i + 1] + if src.compare(item): + print("===========") + print(km.name) + print(kmistr(src)) + print(kmistr(item)) + result = True + + for child in children: + if self.testEntry(kc, child): + result = True + + return result + + def testConfig(self, kc): + result = False + for entry in KM_HIERARCHY: + if self.testEntry(kc, entry): + result = True + return result + + def execute(self, context): + wm = context.manager + kc = wm.default_keyconfig + + if self.testConfig(kc): + print("CONFLICT") + + return {'FINISHED'} + + +def _string_value(value): + if isinstance(value, str) or isinstance(value, bool) or isinstance(value, float) or isinstance(value, int): + result = repr(value) + elif getattr(value, '__len__', False): + repr(list(value)) + else: + print("Export key configuration: can't write ", value) + + return result + + +class WM_OT_keyconfig_import(bpy.types.Operator): + "Import key configuration from a python script" + bl_idname = "wm.keyconfig_import" + bl_label = "Import Key Configuration..." + + filepath = StringProperty(name="File Path", description="Filepath to write file to") + filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) + filter_text = BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) + filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) + + keep_original = BoolProperty(name="Keep original", description="Keep original file after copying to configuration folder", default=True) + + def execute(self, context): + if not self.properties.filepath: + raise Exception("Filepath not set") + + f = open(self.properties.filepath, "r") + if not f: + raise Exception("Could not open file") + + name_pattern = re.compile("^kc = wm.add_keyconfig\('(.*)'\)$") + + for line in f.readlines(): + match = name_pattern.match(line) + + if match: + config_name = match.groups()[0] + + f.close() + + path = os.path.split(os.path.split(__file__)[0])[0] # remove ui/space_userpref.py + path = os.path.join(path, "cfg") + + # create config folder if needed + if not os.path.exists(path): + os.mkdir(path) + + path = os.path.join(path, config_name + ".py") + + if self.properties.keep_original: + shutil.copy(self.properties.filepath, path) + else: + shutil.move(self.properties.filepath, path) + + exec("import " + config_name) + + wm = bpy.context.manager + wm.active_keyconfig = wm.keyconfigs[config_name] + + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.manager + wm.add_fileselect(self) + return {'RUNNING_MODAL'} + +# This operator is also used by interaction presets saving - AddPresetBase + + +class WM_OT_keyconfig_export(bpy.types.Operator): + "Export key configuration to a python script" + bl_idname = "wm.keyconfig_export" + bl_label = "Export Key Configuration..." + + filepath = StringProperty(name="File Path", description="Filepath to write file to") + filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) + filter_text = BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) + filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) + kc_name = StringProperty(name="KeyConfig Name", description="Name to save the key config as") + + def execute(self, context): + if not self.properties.filepath: + raise Exception("Filepath not set") + + f = open(self.properties.filepath, "w") + if not f: + raise Exception("Could not open file") + + wm = context.manager + kc = wm.active_keyconfig + + if self.properties.kc_name != '': + name = self.properties.kc_name + elif kc.name == 'Blender': + name = os.path.splitext(os.path.basename(self.properties.filepath))[0] + else: + name = kc.name + + f.write("# Configuration %s\n" % name) + + f.write("import bpy\n\n") + f.write("wm = bpy.context.manager\n") + f.write("kc = wm.add_keyconfig('%s')\n\n" % name) + + # Generate a list of keymaps to export: + # + # First add all user_defined keymaps (found in inputs.edited_keymaps list), + # then add all remaining keymaps from the currently active custom keyconfig. + # + # This will create a final list of keymaps that can be used as a 'diff' against + # the default blender keyconfig, recreating the current setup from a fresh blender + # without needing to export keymaps which haven't been edited. + + class FakeKeyConfig(): + keymaps = [] + edited_kc = FakeKeyConfig() + edited_kc.keymaps.extend(context.user_preferences.inputs.edited_keymaps) + # merge edited keymaps with non-default keyconfig, if it exists + if kc != wm.default_keyconfig: + export_keymaps = _merge_keymaps(edited_kc, kc) + else: + export_keymaps = _merge_keymaps(edited_kc, edited_kc) + + for km, kc_x in export_keymaps: + + km = km.active() + + f.write("# Map %s\n" % km.name) + f.write("km = kc.add_keymap('%s', space_type='%s', region_type='%s', modal=%s)\n\n" % (km.name, km.space_type, km.region_type, km.modal)) + for kmi in km.items: + if km.modal: + f.write("kmi = km.items.add_modal('%s', '%s', '%s'" % (kmi.propvalue, kmi.type, kmi.value)) + else: + f.write("kmi = km.items.add('%s', '%s', '%s'" % (kmi.idname, kmi.type, kmi.value)) + if kmi.any: + f.write(", any=True") + else: + if kmi.shift: + f.write(", shift=True") + if kmi.ctrl: + f.write(", ctrl=True") + if kmi.alt: + f.write(", alt=True") + if kmi.oskey: + f.write(", oskey=True") + if kmi.key_modifier and kmi.key_modifier != 'NONE': + f.write(", key_modifier='%s'" % kmi.key_modifier) + f.write(")\n") + + def export_properties(prefix, properties): + for pname in dir(properties): + if not properties.is_property_hidden(pname): + value = eval("properties.%s" % pname) + if isinstance(value, bpy.types.OperatorProperties): + export_properties(prefix + "." + pname, value) + elif properties.is_property_set(pname): + value = _string_value(value) + if value != "": + f.write(prefix + ".%s = %s\n" % (pname, value)) + + props = kmi.properties + + if props is not None: + export_properties("kmi.properties", props) + + f.write("\n") + + f.close() + + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.manager + wm.add_fileselect(self) + return {'RUNNING_MODAL'} + + +class WM_OT_keymap_edit(bpy.types.Operator): + "Edit stored key map" + bl_idname = "wm.keymap_edit" + bl_label = "Edit Key Map" + + def execute(self, context): + wm = context.manager + km = context.keymap + km.copy_to_user() + return {'FINISHED'} + + +class WM_OT_keymap_restore(bpy.types.Operator): + "Restore key map(s)" + bl_idname = "wm.keymap_restore" + bl_label = "Restore Key Map(s)" + + all = BoolProperty(attr="all", name="All Keymaps", description="Restore all keymaps to default") + + def execute(self, context): + wm = context.manager + + if self.properties.all: + for km in wm.default_keyconfig.keymaps: + km.restore_to_default() + else: + km = context.keymap + km.restore_to_default() + + return {'FINISHED'} + + +class WM_OT_keyitem_restore(bpy.types.Operator): + "Restore key map item" + bl_idname = "wm.keyitem_restore" + bl_label = "Restore Key Map Item" + + item_id = IntProperty(attr="item_id", name="Item Identifier", description="Identifier of the item to remove") + + def execute(self, context): + wm = context.manager + km = context.keymap + kmi = km.item_from_id(self.properties.item_id) + + km.restore_item_to_default(kmi) + + return {'FINISHED'} + + +class WM_OT_keyitem_add(bpy.types.Operator): + "Add key map item" + bl_idname = "wm.keyitem_add" + bl_label = "Add Key Map Item" + + def execute(self, context): + wm = context.manager + km = context.keymap + kc = wm.default_keyconfig + + if km.modal: + km.items.add_modal("", 'A', 'PRESS') # kmi + else: + km.items.add("none", 'A', 'PRESS') # kmi + + # clear filter and expand keymap so we can see the newly added item + if context.space_data.filter != '': + context.space_data.filter = '' + km.items_expanded = True + km.children_expanded = True + + return {'FINISHED'} + + +class WM_OT_keyitem_remove(bpy.types.Operator): + "Remove key map item" + bl_idname = "wm.keyitem_remove" + bl_label = "Remove Key Map Item" + + item_id = IntProperty(attr="item_id", name="Item Identifier", description="Identifier of the item to remove") + + def execute(self, context): + wm = context.manager + km = context.keymap + kmi = km.item_from_id(self.properties.item_id) + km.remove_item(kmi) + return {'FINISHED'} + + +class WM_OT_keyconfig_remove(bpy.types.Operator): + "Remove key config" + bl_idname = "wm.keyconfig_remove" + bl_label = "Remove Key Config" + + def poll(self, context): + wm = context.manager + return wm.active_keyconfig.user_defined + + def execute(self, context): + wm = context.manager + + keyconfig = wm.active_keyconfig + + module = __import__(keyconfig.name) + + os.remove(module.__file__) + + compiled_path = module.__file__ + "c" # for .pyc + + if os.path.exists(compiled_path): + os.remove(compiled_path) + + wm.remove_keyconfig(keyconfig) + return {'FINISHED'} + + +classes = [ + WM_OT_keyconfig_export, + WM_OT_keyconfig_import, + WM_OT_keyconfig_test, + WM_OT_keyconfig_remove, + WM_OT_keymap_edit, + WM_OT_keymap_restore, + WM_OT_keyitem_add, + WM_OT_keyitem_remove, + WM_OT_keyitem_restore] + + +def register(): + register = bpy.types.register + for cls in classes: + register(cls) + + +def unregister(): + unregister = bpy.types.unregister + for cls in classes: + unregister(cls) + +if __name__ == "__main__": + register() diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py index 865e132745b..bab3695a0b6 100644 --- a/release/scripts/ui/space_view3d.py +++ b/release/scripts/ui/space_view3d.py @@ -32,13 +32,12 @@ class VIEW3D_HT_header(bpy.types.Header): obj = context.active_object toolsettings = context.tool_settings - row = layout.row() + row = layout.row(align=True) row.template_header() - sub = row.row(align=True) - # Menus if context.area.show_menus: + sub = row.row(align=True) sub.menu("VIEW3D_MT_view") @@ -54,6 +53,7 @@ class VIEW3D_HT_header(bpy.types.Header): else: sub.menu("VIEW3D_MT_object") + row = layout.row() row.template_header_3D() # do in C for now since these buttons cant be both toggle AND exclusive. @@ -81,10 +81,6 @@ class VIEW3D_HT_header(bpy.types.Header): if toolsettings.proportional_editing != 'DISABLED': row.prop(toolsettings, "proportional_editing_falloff", text="", icon_only=True) - # paint save - if mode_string == 'PAINT_TEXTURE': - row.operator("image.save_dirty", text="Save Edited") - # Snap row = layout.row(align=True) row.prop(toolsettings, "snap", text="") @@ -100,8 +96,8 @@ class VIEW3D_HT_header(bpy.types.Header): # OpenGL render row = layout.row(align=True) - row.operator("screen.opengl_render", text="", icon='RENDER_STILL') - props = row.operator("screen.opengl_render", text="", icon='RENDER_ANIMATION') + row.operator("render.opengl", text="", icon='RENDER_STILL') + props = row.operator("render.opengl", text="", icon='RENDER_ANIMATION') props.animation = True # Pose @@ -149,7 +145,7 @@ class VIEW3D_MT_transform(bpy.types.Menu): layout.operator("transform.tosphere", text="To Sphere") layout.operator("transform.shear", text="Shear") layout.operator("transform.warp", text="Warp") - layout.operator("transform.transform", text="Push/Pull").mode = 'PUSHPULL' + layout.operator("transform.push_pull", text="Push/Pull") if context.edit_object and context.edit_object.type == 'ARMATURE': layout.operator("armature.align") else: @@ -211,7 +207,6 @@ class VIEW3D_MT_snap(bpy.types.Menu): layout.operator("view3d.snap_selected_to_grid", text="Selection to Grid") layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor") - layout.operator("view3d.snap_selected_to_center", text="Selection to Origin") layout.separator() @@ -254,8 +249,11 @@ class VIEW3D_MT_view(bpy.types.Menu): layout.operator("view3d.viewnumpad", text="Camera").type = 'CAMERA' layout.operator("view3d.viewnumpad", text="Top").type = 'TOP' + layout.operator("view3d.viewnumpad", text="Bottom").type = 'BOTTOM' layout.operator("view3d.viewnumpad", text="Front").type = 'FRONT' + layout.operator("view3d.viewnumpad", text="Back").type = 'BACK' layout.operator("view3d.viewnumpad", text="Right").type = 'RIGHT' + layout.operator("view3d.viewnumpad", text="Left").type = 'LEFT' layout.menu("VIEW3D_MT_view_cameras", text="Cameras") @@ -388,7 +386,7 @@ class VIEW3D_MT_select_object(bpy.types.Menu): layout.operator("object.select_random", text="Random") layout.operator("object.select_mirror", text="Mirror") layout.operator("object.select_by_layer", text="Select All by Layer") - layout.operator_menu_enum("object.select_by_type", "type", "", text="Select All by Type...") + layout.operator_menu_enum("object.select_by_type", "type", text="Select All by Type...") layout.operator("object.select_camera", text="Select Camera") layout.separator() @@ -455,8 +453,8 @@ class VIEW3D_MT_select_particle(bpy.types.Menu): layout.separator() - layout.operator("particle.select_first", text="Roots") - layout.operator("particle.select_last", text="Tips") + layout.operator("particle.select_roots", text="Roots") + layout.operator("particle.select_tips", text="Tips") class VIEW3D_MT_select_edit_mesh(bpy.types.Menu): @@ -475,8 +473,8 @@ class VIEW3D_MT_select_edit_mesh(bpy.types.Menu): layout.separator() - layout.operator("mesh.select_random", text="Random...") - layout.operator("mesh.select_nth", text="Select Nth...") + layout.operator("mesh.select_random", text="Random") + layout.operator("mesh.select_nth", text="Every N Number of Verts") layout.operator("mesh.edges_select_sharp", text="Sharp Edges") layout.operator("mesh.faces_select_linked_flat", text="Linked Flat Faces") layout.operator("mesh.faces_select_interior", text="Interior Faces") @@ -486,8 +484,10 @@ class VIEW3D_MT_select_edit_mesh(bpy.types.Menu): layout.operator("mesh.select_by_number_vertices", text="Triangles").type = 'TRIANGLES' layout.operator("mesh.select_by_number_vertices", text="Quads").type = 'QUADS' + if context.scene.tool_settings.mesh_selection_mode[2] == False: + layout.operator("mesh.select_non_manifold", text="Non Manifold") layout.operator("mesh.select_by_number_vertices", text="Loose Verts/Edges").type = 'OTHER' - layout.operator("mesh.select_similar", text="Similar...") + layout.operator("mesh.select_similar", text="Similar") layout.separator() @@ -523,7 +523,7 @@ class VIEW3D_MT_select_edit_curve(bpy.types.Menu): layout.operator("curve.select_all", text="Select/Deselect All") layout.operator("curve.select_inverse") layout.operator("curve.select_random") - layout.operator("curve.select_every_nth") + layout.operator("curve.select_nth", text="Every Nth Number of Points") layout.separator() @@ -552,7 +552,7 @@ class VIEW3D_MT_select_edit_surface(bpy.types.Menu): layout.operator("curve.select_all", text="Select/Deselect All") layout.operator("curve.select_inverse") layout.operator("curve.select_random") - layout.operator("curve.select_every_nth") + layout.operator("curve.select_nth", text="Every Nth Number of Points") layout.separator() @@ -656,6 +656,7 @@ class VIEW3D_MT_object(bpy.types.Menu): layout.operator("anim.keyframe_insert_menu", text="Insert Keyframe...") layout.operator("anim.keyframe_delete_v3d", text="Delete Keyframe...") + layout.operator("anim.keying_set_active_set", text="Change Keying Set...") layout.separator() @@ -677,6 +678,11 @@ class VIEW3D_MT_object(bpy.types.Menu): layout.separator() + layout.menu("VIEW3D_MT_object_game_properties") + layout.menu("VIEW3D_MT_object_game_logicbricks") + + layout.separator() + layout.operator("object.join_uvs") layout.operator("object.join") @@ -705,35 +711,86 @@ class VIEW3D_MT_object_specials(bpy.types.Menu): def poll(self, context): # add more special types - obj = context.object - return bool(obj and obj.type == 'LAMP') + return context.object def draw(self, context): layout = self.layout obj = context.object - if obj and obj.type == 'LAMP': + if obj.type == 'CAMERA': layout.operator_context = 'INVOKE_REGION_WIN' - props = layout.operator("wm.context_modal_mouse", text="Spot Size") - props.path_iter = "selected_editable_objects" - props.path_item = "data.spot_size" - props.input_scale = 0.01 - - props = layout.operator("wm.context_modal_mouse", text="Distance") - props.path_iter = "selected_editable_objects" - props.path_item = "data.distance" + props = layout.operator("wm.context_modal_mouse", text="Camera Lens Angle") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.lens" props.input_scale = 0.1 - props = layout.operator("wm.context_modal_mouse", text="Clip Start") - props.path_iter = "selected_editable_objects" - props.path_item = "data.shadow_buffer_clip_start" - props.input_scale = 0.05 + if not obj.data.dof_object: + #layout.label(text="Test Has DOF obj"); + props = layout.operator("wm.context_modal_mouse", text="DOF Distance") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.dof_distance" + props.input_scale = 0.02 - props = layout.operator("wm.context_modal_mouse", text="Clip End") - props.path_iter = "selected_editable_objects" - props.path_item = "data.shadow_buffer_clip_end" - props.input_scale = 0.05 + if obj.type in ('CURVE','TEXT'): + layout.operator_context = 'INVOKE_REGION_WIN' + + props = layout.operator("wm.context_modal_mouse", text="Extrude Size") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.extrude" + props.input_scale = 0.01 + + props = layout.operator("wm.context_modal_mouse", text="Width Size") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.width" + props.input_scale = 0.01 + + if obj.type == 'EMPTY': + layout.operator_context = 'INVOKE_REGION_WIN' + + props = layout.operator("wm.context_modal_mouse", text="Empty Draw Size") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "empty_draw_size" + props.input_scale = 0.01 + + if obj.type == 'LAMP': + layout.operator_context = 'INVOKE_REGION_WIN' + + props = layout.operator("wm.context_modal_mouse", text="Energy") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.energy" + + if obj.data.type in ('SPOT', 'AREA', 'POINT'): + props = layout.operator("wm.context_modal_mouse", text="Falloff Distance") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.distance" + props.input_scale = 0.1 + + if obj.data.type == 'SPOT': + layout.separator() + props = layout.operator("wm.context_modal_mouse", text="Spot Size") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.spot_size" + props.input_scale = 0.01 + + props = layout.operator("wm.context_modal_mouse", text="Spot Blend") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.spot_blend" + props.input_scale = -0.01 + + props = layout.operator("wm.context_modal_mouse", text="Clip Start") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.shadow_buffer_clip_start" + props.input_scale = 0.05 + + props = layout.operator("wm.context_modal_mouse", text="Clip End") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.shadow_buffer_clip_end" + props.input_scale = 0.05 + + layout.separator() + + props = layout.operator("object.isolate_type_render") class VIEW3D_MT_object_apply(bpy.types.Menu): @@ -792,6 +849,7 @@ class VIEW3D_MT_object_constraints(bpy.types.Menu): layout = self.layout layout.operator("object.constraint_add_with_targets") + layout.operator("object.constraints_copy") layout.operator("object.constraints_clear") @@ -834,11 +892,32 @@ class VIEW3D_MT_make_links(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.operator_menu_enum("object.make_links_scene", "type", text="Objects to Scene...") - layout.operator_menu_enum("marker.make_links_scene", "type", text="Markers to Scene...") - layout.operator_enums("object.make_links_data", property="type") # inline + layout.operator_menu_enum("object.make_links_scene", "scene", text="Objects to Scene...") + layout.operator_menu_enum("marker.make_links_scene", "scene", text="Markers to Scene...") + layout.operator_enums("object.make_links_data", "type") # inline +class VIEW3D_MT_object_game_properties(bpy.types.Menu): + bl_label = "Game Properties" + + def draw(self, context): + layout = self.layout + + layout.operator("object.game_property_copy", text="Replace").operation = 'REPLACE' + layout.operator("object.game_property_copy", text="Merge").operation = 'MERGE' + layout.operator_menu_enum("object.game_property_copy", "property", text="Copy...") + layout.separator() + layout.operator("object.game_property_clear") + + +class VIEW3D_MT_object_game_logicbricks(bpy.types.Menu): + bl_label = "Logic Bricks" + + def draw(self, context): + layout = self.layout + + layout.operator("object.logic_bricks_copy", text="Copy") + # ********** Vertex paint menu ********** @@ -849,6 +928,7 @@ class VIEW3D_MT_paint_vertex(bpy.types.Menu): layout = self.layout layout.operator("paint.vertex_color_set") + layout.operator("paint.vertex_color_dirt") class VIEW3D_MT_hook(bpy.types.Menu): @@ -932,7 +1012,7 @@ class VIEW3D_MT_sculpt(bpy.types.Menu): layout.prop(sculpt, "lock_y") layout.prop(sculpt, "lock_z") layout.separator() - layout.operator_menu_enum("brush.curve_preset", property="shape") + layout.operator_menu_enum("brush.curve_preset", "shape") layout.separator() sculpt_tool = brush.sculpt_tool @@ -991,8 +1071,8 @@ class VIEW3D_MT_particle_specials(bpy.types.Menu): layout.separator() if particle_edit.selection_mode == 'POINT': layout.operator("particle.subdivide") - layout.operator("particle.select_first") - layout.operator("particle.select_last") + layout.operator("particle.select_roots") + layout.operator("particle.select_tips") layout.operator("particle.remove_doubles") @@ -1022,6 +1102,7 @@ class VIEW3D_MT_pose(bpy.types.Menu): layout.operator("anim.keyframe_insert_menu", text="Insert Keyframe...") layout.operator("anim.keyframe_delete_v3d", text="Delete Keyframe...") + layout.operator("anim.keying_set_active_set", text="Change Keying Set...") layout.separator() @@ -1142,6 +1223,7 @@ class VIEW3D_MT_pose_constraints(bpy.types.Menu): layout = self.layout layout.operator("pose.constraint_add_with_targets", text="Add (With Targets)...") + layout.operator("pose.constraints_copy") layout.operator("pose.constraints_clear") @@ -1243,15 +1325,15 @@ class VIEW3D_MT_edit_mesh_selection_mode(bpy.types.Menu): prop = layout.operator("wm.context_set_value", text="Vertex", icon='VERTEXSEL') prop.value = "(True, False, False)" - prop.path = "tool_settings.mesh_selection_mode" + prop.data_path = "tool_settings.mesh_selection_mode" prop = layout.operator("wm.context_set_value", text="Edge", icon='EDGESEL') prop.value = "(False, True, False)" - prop.path = "tool_settings.mesh_selection_mode" + prop.data_path = "tool_settings.mesh_selection_mode" prop = layout.operator("wm.context_set_value", text="Face", icon='FACESEL') prop.value = "(False, False, True)" - prop.path = "tool_settings.mesh_selection_mode" + prop.data_path = "tool_settings.mesh_selection_mode" class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu): @@ -1373,7 +1455,7 @@ class VIEW3D_OT_edit_mesh_extrude_move(bpy.types.Operator): totedge = mesh.total_edge_sel totvert = mesh.total_vert_sel - if totface >= 1 or totvert == 1: + if totface >= 1: return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN', TRANSFORM_OT_translate={"constraint_orientation": "NORMAL", "constraint_axis": [False, False, True]}) elif totedge == 1: return bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN', TRANSFORM_OT_translate={"constraint_orientation": "NORMAL", "constraint_axis": [True, True, False]}) @@ -1462,12 +1544,14 @@ class VIEW3D_MT_edit_mesh_faces(bpy.types.Menu): layout = self.layout layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("mesh.flip_normals") # layout.operator("mesh.bevel") # layout.operator("mesh.bevel") layout.operator("mesh.edge_face_add") layout.operator("mesh.fill") layout.operator("mesh.beautify_fill") layout.operator("mesh.solidify") + layout.operator("mesh.sort_faces") layout.separator() @@ -1623,6 +1707,13 @@ class VIEW3D_MT_edit_text(bpy.types.Menu): layout.menu("VIEW3D_MT_edit_text_chars") + layout.separator() + + layout.operator("font.style_toggle", text="Toggle Bold").style = 'BOLD' + layout.operator("font.style_toggle", text="Toggle Italic").style = 'ITALIC' + layout.operator("font.style_toggle", text="Toggle Underline").style = 'UNDERLINE' + layout.operator("font.style_toggle", text="Toggle Small Caps").style = 'SMALL_CAPS' + class VIEW3D_MT_edit_text_chars(bpy.types.Menu): bl_label = "Special Characters" @@ -1829,7 +1920,7 @@ class VIEW3D_MT_edit_armature_roll(bpy.types.Menu): # ********** Panel ********** -class VIEW3D_PT_3dview_properties(bpy.types.Panel): +class VIEW3D_PT_view3d_properties(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "View" @@ -1845,8 +1936,7 @@ class VIEW3D_PT_3dview_properties(bpy.types.Panel): scene = context.scene col = layout.column() - col.label(text="Camera:") - col.prop(view, "camera", text="") + col.active = view.region_3d.view_perspective != 'CAMERA' col.prop(view, "lens") col.label(text="Lock to Object:") col.prop(view, "lock_object", text="") @@ -1858,10 +1948,15 @@ class VIEW3D_PT_3dview_properties(bpy.types.Panel): col.prop(view, "clip_start", text="Start") col.prop(view, "clip_end", text="End") - layout.column().prop(scene, "cursor_location", text="3D Cursor:") + subcol = col.column() + subcol.enabled = not view.lock_camera_and_layers + subcol.label(text="Local Camera:") + subcol.prop(view, "camera", text="") + + layout.column().prop(view, "cursor_location") -class VIEW3D_PT_3dview_name(bpy.types.Panel): +class VIEW3D_PT_view3d_name(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Item" @@ -1885,7 +1980,7 @@ class VIEW3D_PT_3dview_name(bpy.types.Panel): row.prop(bone, "name", text="") -class VIEW3D_PT_3dview_display(bpy.types.Panel): +class VIEW3D_PT_view3d_display(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Display" @@ -1903,9 +1998,11 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel): ob = context.object col = layout.column() - col.prop(view, "display_x_axis", text="X Axis") - col.prop(view, "display_y_axis", text="Y Axis") - col.prop(view, "display_z_axis", text="Z Axis") + col.prop(view, "display_render_override") + + col = layout.column() + display_all = not view.display_render_override + col.active = display_all col.prop(view, "outline_selected") col.prop(view, "all_object_origins") col.prop(view, "relationship_lines") @@ -1914,9 +2011,17 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel): col.prop(mesh, "all_edges") col = layout.column() - col.prop(view, "display_floor", text="Grid Floor") + col.active = display_all + split = col.split(percentage=0.55) + split.prop(view, "display_floor", text="Grid Floor") + + row = split.row(align=True) + row.prop(view, "display_x_axis", text="X", toggle=True) + row.prop(view, "display_y_axis", text="Y", toggle=True) + row.prop(view, "display_z_axis", text="Z", toggle=True) + sub = col.column(align=True) - sub.active = view.display_floor + sub.active = (display_all and view.display_floor) sub.prop(view, "grid_lines", text="Lines") sub.prop(view, "grid_spacing", text="Spacing") sub.prop(view, "grid_subdivisions", text="Subdivisions") @@ -1943,7 +2048,7 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel): row.prop(region, "box_clip") -class VIEW3D_PT_3dview_meshdisplay(bpy.types.Panel): +class VIEW3D_PT_view3d_meshdisplay(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Mesh Display" @@ -1979,7 +2084,7 @@ class VIEW3D_PT_3dview_meshdisplay(bpy.types.Panel): col.prop(mesh, "draw_face_area") -class VIEW3D_PT_3dview_curvedisplay(bpy.types.Panel): +class VIEW3D_PT_view3d_curvedisplay(bpy.types.Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Curve Display" @@ -2029,7 +2134,7 @@ class VIEW3D_PT_background_image(bpy.types.Panel): layout.active = view.display_background_images box = layout.box() row = box.row(align=True) - row.prop(bg, "show_expanded", text="", no_bg=True) + row.prop(bg, "show_expanded", text="", emboss=False) row.label(text=getattr(bg.image, "name", "Not Set")) row.operator("view3d.remove_background_image", text="", icon='X').index = i @@ -2115,6 +2220,7 @@ class VIEW3D_PT_etch_a_ton(bpy.types.Panel): col.prop(toolsettings, "etch_autoname") col.prop(toolsettings, "etch_number") col.prop(toolsettings, "etch_side") + col.operator("sketch.convert", text="Convert") class VIEW3D_PT_context_properties(bpy.types.Panel): @@ -2192,6 +2298,8 @@ classes = [ VIEW3D_MT_object_showhide, VIEW3D_MT_make_single_user, VIEW3D_MT_make_links, + VIEW3D_MT_object_game_properties, + VIEW3D_MT_object_game_logicbricks, VIEW3D_MT_hook, VIEW3D_MT_vertex_group, @@ -2247,11 +2355,11 @@ classes = [ VIEW3D_MT_armature_specials, # Only as a menu for keybindings # Panels - VIEW3D_PT_3dview_properties, - VIEW3D_PT_3dview_display, - VIEW3D_PT_3dview_name, - VIEW3D_PT_3dview_meshdisplay, - VIEW3D_PT_3dview_curvedisplay, + VIEW3D_PT_view3d_properties, + VIEW3D_PT_view3d_display, + VIEW3D_PT_view3d_name, + VIEW3D_PT_view3d_meshdisplay, + VIEW3D_PT_view3d_curvedisplay, VIEW3D_PT_background_image, VIEW3D_PT_transform_orientations, VIEW3D_PT_etch_a_ton, diff --git a/release/scripts/ui/space_view3d_toolbar.py b/release/scripts/ui/space_view3d_toolbar.py index 6de4ba6ce34..515fa236fc0 100644 --- a/release/scripts/ui/space_view3d_toolbar.py +++ b/release/scripts/ui/space_view3d_toolbar.py @@ -19,6 +19,7 @@ # <pep8 compliant> import bpy +narrowui = bpy.context.user_preferences.view.properties_width_check class View3DPanel(bpy.types.Panel): bl_space_type = 'VIEW_3D' @@ -41,6 +42,9 @@ class VIEW3D_PT_tools_objectmode(View3DPanel): col.operator("transform.rotate") col.operator("transform.resize", text="Scale") + col = layout.column(align=True) + col.operator("object.origin_set", text="Origin") + col = layout.column(align=True) col.label(text="Object:") col.operator("object.duplicate_move") @@ -500,18 +504,26 @@ class VIEW3D_PT_tools_brush(PaintPanel): if not context.particle_edit_object: col = layout.split().column() - row = col.row() - if context.sculpt_object and brush: - defaultbrushes = 8 - elif context.texture_paint_object and brush: - defaultbrushes = 4 + if context.sculpt_object and context.tool_settings.sculpt: + col.template_ID_preview(settings, "brush", new="brush.add", filter="is_sculpt_brush", rows=3, cols=8) + elif context.texture_paint_object and context.tool_settings.image_paint: + col.template_ID_preview(settings, "brush", new="brush.add", filter="is_imapaint_brush", rows=3, cols=8) + elif context.vertex_paint_object and context.tool_settings.vertex_paint: + col.template_ID_preview(settings, "brush", new="brush.add", filter="is_vpaint_brush", rows=3, cols=8) + elif context.weight_paint_object and context.tool_settings.weight_paint: + col.template_ID_preview(settings, "brush", new="brush.add", filter="is_wpaint_brush", rows=3, cols=8) else: - defaultbrushes = 7 + row = col.row() - row.template_list(settings, "brushes", settings, "active_brush_index", rows=2, maxrows=defaultbrushes) + if context.sculpt_object and brush: + defaultbrushes = 8 + elif context.texture_paint_object and brush: + defaultbrushes = 4 + else: + defaultbrushes = 7 - col.template_ID(settings, "brush", new="brush.add") + row.template_list(settings, "brushes", settings, "active_brush_index", rows=2, maxrows=defaultbrushes) # Particle Mode # @@ -523,9 +535,11 @@ class VIEW3D_PT_tools_brush(PaintPanel): if settings.tool != 'NONE': col = layout.column() col.prop(brush, "size", slider=True) - col.prop(brush, "strength", slider=True) + if settings.tool != 'ADD': + col.prop(brush, "strength", slider=True) if settings.tool == 'ADD': + col.prop(brush, "count") col = layout.column() col.prop(settings, "add_interpolate") sub = col.column(align=True) @@ -541,33 +555,150 @@ class VIEW3D_PT_tools_brush(PaintPanel): # Sculpt Mode # elif context.sculpt_object and brush: + edit = context.user_preferences.edit + col = layout.column() + + col.separator() row = col.row(align=True) - row.prop(brush, "size", slider=True) - if brush.sculpt_tool != 'GRAB': - row.prop(brush, "use_size_pressure", toggle=True, text="") + if edit.sculpt_paint_use_unified_size: + if edit.sculpt_paint_unified_lock_brush_size: + row.prop(edit, "sculpt_paint_unified_lock_brush_size", toggle=True, text="", icon='LOCKED') + row.prop(edit, "sculpt_paint_unified_unprojected_radius", text="Unified Radius", slider=True) + else: + row.prop(edit, "sculpt_paint_unified_lock_brush_size", toggle=True, text="", icon='UNLOCKED') + row.prop(edit, "sculpt_paint_unified_size", text="Unified Radius", slider=True) + + else: + if brush.lock_brush_size: + row.prop(brush, "lock_brush_size", toggle=True, text="", icon='LOCKED') + row.prop(brush, "unprojected_radius", text="Radius", slider=True) + else: + row.prop(brush, "lock_brush_size", toggle=True, text="", icon='UNLOCKED') + row.prop(brush, "size", text="Radius", slider=True) + + row.prop(brush, "use_size_pressure", toggle=True, text="") + + + if brush.sculpt_tool not in ('SNAKE_HOOK', 'GRAB', 'ROTATE'): + col.separator() row = col.row(align=True) - row.prop(brush, "strength", slider=True) + + if brush.use_space and brush.sculpt_tool not in ('SMOOTH'): + if brush.use_space_atten: + row.prop(brush, "use_space_atten", toggle=True, text="", icon='LOCKED') + else: + row.prop(brush, "use_space_atten", toggle=True, text="", icon='UNLOCKED') + + if edit.sculpt_paint_use_unified_strength: + row.prop(edit, "sculpt_paint_unified_strength", text="Unified Strength", slider=True) + else: + row.prop(brush, "strength", text="Strength", slider=True) + row.prop(brush, "use_strength_pressure", text="") - # XXX - TODO - #row = col.row(align=True) - #row.prop(brush, "jitter", slider=True) - #row.prop(brush, "use_jitter_pressure", toggle=True, text="") - col = layout.column() - if brush.sculpt_tool in ('DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'): - col.row().prop(brush, "direction", expand=True) + if brush.sculpt_tool not in ('SMOOTH'): + col.separator() - if brush.sculpt_tool in ('DRAW', 'INFLATE', 'LAYER'): - col.prop(brush, "use_accumulate") + row = col.row(align=True) + row.prop(brush, "autosmooth_factor", slider=True) + row.prop(brush, "use_inverse_smooth_pressure", toggle=True, text="") - if brush.sculpt_tool == 'LAYER': + + + if brush.sculpt_tool in ('GRAB', 'SNAKE_HOOK'): + col.separator() + + row = col.row(align=True) + row.prop(brush, "normal_weight", slider=True) + + + + if brush.sculpt_tool in ('CREASE', 'BLOB'): + col.separator() + + row = col.row(align=True) + row.prop(brush, "crease_pinch_factor", slider=True, text="Pinch") + + if brush.sculpt_tool not in ('PINCH', 'INFLATE', 'SMOOTH'): + row = col.row(align=True) + + col.separator() + + if brush.use_original_normal: + row.prop(brush, "use_original_normal", toggle=True, text="", icon='LOCKED') + else: + row.prop(brush, "use_original_normal", toggle=True, text="", icon='UNLOCKED') + + row.prop(brush, "sculpt_plane", text="") + + #if brush.sculpt_tool in ('CLAY', 'CLAY_TUBES', 'FLATTEN', 'FILL', 'SCRAPE'): + if brush.sculpt_tool in ('CLAY', 'FLATTEN', 'FILL', 'SCRAPE'): + row = col.row(align=True) + row.prop(brush, "plane_offset", slider=True) + row.prop(brush, "use_offset_pressure", text="") + + col.separator() + + row= col.row() + row.prop(brush, "use_plane_trim", text="Trim") + row= col.row() + row.active=brush.use_plane_trim + row.prop(brush, "plane_trim", slider=True, text="Distance") + + col.separator() + + row= col.row() + row.prop(brush, "use_frontface", text="Front Faces Only") + + #if brush.sculpt_tool in ('DRAW', 'CREASE', 'BLOB', 'LAYER', 'CLAY', 'CLAY_TUBES'): + if brush.sculpt_tool in ('DRAW', 'CREASE', 'BLOB', 'LAYER', 'CLAY'): + col.separator() + col.row().prop(brush, "direction", expand=True) + elif brush.sculpt_tool in ('FLATTEN'): + col.separator() + col.row().prop(brush, "flatten_contrast", expand=True) + elif brush.sculpt_tool in ('FILL'): + col.separator() + col.row().prop(brush, "fill_deepen", expand=True) + elif brush.sculpt_tool in ('SCRAPE'): + col.separator() + col.row().prop(brush, "scrape_peaks", expand=True) + elif brush.sculpt_tool in ('INFLATE'): + col.separator() + col.row().prop(brush, "inflate_deflate", expand=True) + elif brush.sculpt_tool in ('PINCH'): + col.separator() + col.row().prop(brush, "pinch_magnify", expand=True) + + + + #if brush.sculpt_tool in ('DRAW', 'CREASE', 'BLOB', 'INFLATE', 'LAYER', 'CLAY', 'CLAY_TUBES'): + if brush.sculpt_tool in ('DRAW', 'CREASE', 'BLOB', 'INFLATE', 'LAYER', 'CLAY'): + col.separator() + + col.prop(brush, "use_accumulate") + + + + if brush.sculpt_tool == 'LAYER': + col.separator() + + ob = context.sculpt_object + do_persistent = True + + # not supported yet for this case + for md in ob.modifiers: + if md.type == 'MULTIRES': + do_persistent = False + + if do_persistent: col.prop(brush, "use_persistent") col.operator("sculpt.set_persistent_base") @@ -592,6 +723,11 @@ class VIEW3D_PT_tools_brush(PaintPanel): col.prop(brush, "blend", text="Blend") + col = layout.column() + col.active = (brush.blend not in ('ERASE_ALPHA', 'ADD_ALPHA')) + col.prop(brush, "use_alpha") + + # Weight Paint Mode # elif context.weight_paint_object and brush: @@ -650,9 +786,88 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel): col = layout.column() - col.template_ID_preview(brush, "texture", new="texture.new", rows=2, cols=4) + col.template_ID_preview(brush, "texture", new="texture.new", rows=3, cols=8) - col.row().prop(tex_slot, "map_mode", expand=True) + if context.sculpt_object: + #XXX duplicated from properties_texture.py + + wide_ui = context.region.width > narrowui + + + col.separator() + + + col.label(text="Brush Mapping:") + row = col.row(align=True) + row.prop(tex_slot, "map_mode", expand=True) + + col.separator() + + col = layout.column() + col.active = tex_slot.map_mode in ('FIXED') + col.label(text="Angle:") + + col = layout.column() + if not brush.use_anchor and brush.sculpt_tool not in ('GRAB', 'SNAKE_HOOK', 'THUMB', 'ROTATE') and tex_slot.map_mode in ('FIXED'): + col.prop(brush, "texture_angle_source", text="") + else: + col.prop(brush, "texture_angle_source_no_random", text="") + + #row = col.row(align=True) + #row.label(text="Angle:") + #row.active = tex_slot.map_mode in ('FIXED', 'TILED') + + #row = col.row(align=True) + + #col = row.column() + #col.active = tex_slot.map_mode in ('FIXED') + #col.prop(brush, "use_rake", toggle=True, icon='PARTICLEMODE', text="") + + col = layout.column() + col.prop(tex_slot, "angle", text="") + col.active = tex_slot.map_mode in ('FIXED', 'TILED') + + #col = layout.column() + #col.prop(brush, "use_random_rotation") + #col.active = (not brush.use_rake) and (not brush.use_anchor) and brush.sculpt_tool not in ('GRAB', 'SNAKE_HOOK', 'THUMB', 'ROTATE') and tex_slot.map_mode in ('FIXED') + + split = layout.split() + + col = split.column() + col.prop(tex_slot, "offset") + + if wide_ui: + col = split.column() + else: + col.separator() + + col.prop(tex_slot, "size") + + col = layout.column() + + row = col.row(align=True) + row.label(text="Sample Bias:") + row = col.row(align=True) + row.prop(brush, "texture_sample_bias", slider=True, text="") + + row = col.row(align=True) + row.label(text="Overlay:") + row.active = tex_slot.map_mode in ('FIXED', 'TILED') + + row = col.row(align=True) + + col = row.column() + + if brush.use_texture_overlay: + col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_OFF') + else: + col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON') + + col.active = tex_slot.map_mode in ('FIXED', 'TILED') + + col = row.column() + col.prop(brush, "texture_overlay_alpha", text="Alpha") + col.active = tex_slot.map_mode in ('FIXED', 'TILED') and brush.use_texture_overlay class VIEW3D_PT_tools_brush_tool(PaintPanel): @@ -676,15 +891,11 @@ class VIEW3D_PT_tools_brush_tool(PaintPanel): col = layout.column(align=True) if context.sculpt_object: - col.prop(brush, "sculpt_tool", expand=True) + col.prop(brush, "sculpt_tool", expand=False, text="") elif context.texture_paint_object: - col.prop(brush, "imagepaint_tool", expand=True) - #col.prop_enum(settings, "tool", 'DRAW') - #col.prop_enum(settings, "tool", 'SOFTEN') - #col.prop_enum(settings, "tool", 'CLONE') - #col.prop_enum(settings, "tool", 'SMEAR') + col.prop(brush, "imagepaint_tool", expand=False, text="") elif context.vertex_paint_object or context.weight_paint_object: - col.prop(brush, "vertexpaint_tool", expand=True) + col.prop(brush, "vertexpaint_tool", expand=False, text="") class VIEW3D_PT_tools_brush_stroke(PaintPanel): @@ -705,29 +916,83 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel): brush = settings.brush texture_paint = context.texture_paint_object - if context.sculpt_object: - if brush.sculpt_tool != 'LAYER': - layout.prop(brush, "use_anchor") - layout.prop(brush, "use_rake") - - layout.prop(brush, "use_airbrush") col = layout.column() - col.active = brush.use_airbrush - col.prop(brush, "rate", slider=True) - if not texture_paint: - layout.prop(brush, "use_smooth_stroke") + if context.sculpt_object: + col.label(text="Stroke Method:") + col.prop(brush, "stroke_method", text="") + + if brush.use_anchor: + col.separator() + row = col.row() + row.prop(brush, "edge_to_edge", "Edge To Edge") + + if brush.use_airbrush: + col.separator() + row = col.row() + row.prop(brush, "rate", text="Rate", slider=True) + + if brush.use_space: + col.separator() + row = col.row() + row.active = brush.use_space + row.prop(brush, "spacing", text="Spacing") + + if brush.sculpt_tool not in ('GRAB', 'THUMB', 'SNAKE_HOOK', 'ROTATE') and (not brush.use_anchor) and (not brush.restore_mesh): + col = layout.column() + col.separator() + + col.prop(brush, "use_smooth_stroke") + + sub = col.column() + sub.active = brush.use_smooth_stroke + sub.prop(brush, "smooth_stroke_radius", text="Radius", slider=True) + sub.prop(brush, "smooth_stroke_factor", text="Factor", slider=True) + + col.separator() + + row = col.row(align=True) + row.prop(brush, "jitter", slider=True) + row.prop(brush, "use_jitter_pressure", toggle=True, text="") + + else: + row = col.row() + row.prop(brush, "use_airbrush") + + row = col.row() + row.active = brush.use_airbrush and (not brush.use_space) and (not brush.use_anchor) + row.prop(brush, "rate", slider=True) + + col.separator() + + if not texture_paint: + row = col.row() + row.prop(brush, "use_smooth_stroke") + + col = layout.column() + col.active = brush.use_smooth_stroke + col.prop(brush, "smooth_stroke_radius", text="Radius", slider=True) + col.prop(brush, "smooth_stroke_factor", text="Factor", slider=True) + + col.separator() + col = layout.column() - col.active = brush.use_smooth_stroke - col.prop(brush, "smooth_stroke_radius", text="Radius", slider=True) - col.prop(brush, "smooth_stroke_factor", text="Factor", slider=True) + col.active = (not brush.use_anchor) and (brush.sculpt_tool not in ('GRAB', 'THUMB', 'ROTATE', 'SNAKE_HOOK')) - layout.prop(brush, "use_space") - row = layout.row(align=True) - row.active = brush.use_space - row.prop(brush, "spacing", text="Distance", slider=True) - if texture_paint: - row.prop(brush, "use_spacing_pressure", toggle=True, text="") + row = col.row() + row.prop(brush, "use_space") + + row = col.row() + row.active = brush.use_space + row.prop(brush, "spacing", text="Spacing") + + #col.prop(brush, "use_space_atten", text="Adaptive Strength") + #col.prop(brush, "use_adaptive_space", text="Adaptive Spacing") + + #col.separator() + + #if texture_paint: + # row.prop(brush, "use_spacing_pressure", toggle=True, text="") class VIEW3D_PT_tools_brush_curve(PaintPanel): @@ -745,11 +1010,19 @@ class VIEW3D_PT_tools_brush_curve(PaintPanel): brush = settings.brush layout.template_curve_mapping(brush, "curve", brush=True) - layout.operator_menu_enum("brush.curve_preset", property="shape") + row = layout.row(align=True) + row.operator("brush.curve_preset", icon="SMOOTHCURVE", text="").shape = 'SMOOTH' + row.operator("brush.curve_preset", icon="SPHERECURVE", text="").shape = 'ROUND' + row.operator("brush.curve_preset", icon="ROOTCURVE", text="").shape = 'ROOT' + row.operator("brush.curve_preset", icon="SHARPCURVE", text="").shape = 'SHARP' + row.operator("brush.curve_preset", icon="LINCURVE", text="").shape = 'LINE' + row.operator("brush.curve_preset", icon="NOCURVE", text="").shape = 'MAX' + row.operator("brush.curve_preset", icon="RNDCURVE", text="").shape = 'MID9' class VIEW3D_PT_sculpt_options(PaintPanel): bl_label = "Options" + bl_default_closed = True def poll(self, context): return (context.sculpt_object and context.tool_settings.sculpt) @@ -757,25 +1030,100 @@ class VIEW3D_PT_sculpt_options(PaintPanel): def draw(self, context): layout = self.layout + wide_ui = context.region.width > narrowui + sculpt = context.tool_settings.sculpt + settings = self.paint_settings(context) + brush = settings.brush - col = layout.column() - col.prop(sculpt, "show_brush") - col.prop(sculpt, "fast_navigate") - - split = self.layout.split() + split = layout.split() col = split.column() - col.label(text="Symmetry:") + + edit = context.user_preferences.edit + col.label(text="Unified Settings:") + col.prop(edit, "sculpt_paint_use_unified_size", text="Size") + col.prop(edit, "sculpt_paint_use_unified_strength", text="Strength") + + if wide_ui: + col = split.column() + else: + col.separator() + + col.label(text="Lock:") + row = col.row(align=True) + row.prop(sculpt, "lock_x", text="X", toggle=True) + row.prop(sculpt, "lock_y", text="Y", toggle=True) + row.prop(sculpt, "lock_z", text="Z", toggle=True) + +class VIEW3D_PT_sculpt_symmetry(PaintPanel): + bl_label = "Symmetry" + bl_default_closed = True + + def poll(self, context): + return (context.sculpt_object and context.tool_settings.sculpt) + + def draw(self, context): + wide_ui = context.region.width > narrowui + + layout = self.layout + + sculpt = context.tool_settings.sculpt + settings = self.paint_settings(context) + brush = settings.brush + + split = layout.split() + + col = split.column() + + col.label(text="Mirror:") col.prop(sculpt, "symmetry_x", text="X") col.prop(sculpt, "symmetry_y", text="Y") col.prop(sculpt, "symmetry_z", text="Z") - col = split.column() - col.label(text="Lock:") - col.prop(sculpt, "lock_x", text="X") - col.prop(sculpt, "lock_y", text="Y") - col.prop(sculpt, "lock_z", text="Z") + if wide_ui: + col = split.column() + else: + col.separator() + + col.prop(sculpt, "radial_symm", text="Radial") + + col = layout.column() + + col.separator() + + col.prop(sculpt, "use_symmetry_feather", text="Feather") + +class VIEW3D_PT_tools_brush_appearance(PaintPanel): + bl_label = "Appearance" + bl_default_closed = True + + def poll(self, context): + return (context.sculpt_object and context.tool_settings.sculpt) or (context.vertex_paint_object and context.tool_settings.vertex_paint) or (context.weight_paint_object and context.tool_settings.weight_paint) or (context.texture_paint_object and context.tool_settings.image_paint) + + def draw(self, context): + layout = self.layout + + sculpt = context.tool_settings.sculpt + settings = self.paint_settings(context) + brush = settings.brush + + col = layout.column(); + + if context.sculpt_object and context.tool_settings.sculpt: + #if brush.sculpt_tool in ('DRAW', 'INFLATE', 'CLAY', 'CLAY_TUBES', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN'): + if brush.sculpt_tool in ('DRAW', 'INFLATE', 'CLAY', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN'): + col.prop(brush, "add_col", text="Add Color") + col.prop(brush, "sub_col", text="Substract Color") + else: + col.prop(brush, "add_col", text="Color") + + col.separator() + + col = layout.column() + col.label(text="Icon:") + #col.template_ID_preview(brush, "image_icon", open="image.open", filter="is_image_icon", rows=3, cols=8) + col.template_ID_preview(brush, "image_icon", open="image.open", rows=3, cols=8) # ********** default tools for weightpaint **************** @@ -907,6 +1255,18 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel): sub = col.column() sub.prop(ipaint, "seam_bleed") + col.label(text="External Editing") + row = col.split(align=True, percentage=0.55) + row.operator("image.project_edit", text="Quick Edit") + row.operator("image.project_apply", text="Apply") + row = col.row(align=True) + row.prop(ipaint, "screen_grab_size", text="") + + sub = col.column() + sub.operator("paint.project_image", text="Apply Camera Image") + + sub.operator("image.save_dirty", text="Save All Edited") + class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu): bl_label = "Clone Layer" @@ -915,7 +1275,7 @@ class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu): layout = self.layout for i, tex in enumerate(context.active_object.data.uv_textures): prop = layout.operator("wm.context_set_int", text=tex.name) - prop.path = "active_object.data.uv_texture_clone_index" + prop.data_path = "active_object.data.uv_texture_clone_index" prop.value = i @@ -926,7 +1286,7 @@ class VIEW3D_MT_tools_projectpaint_stencil(bpy.types.Menu): layout = self.layout for i, tex in enumerate(context.active_object.data.uv_textures): prop = layout.operator("wm.context_set_int", text=tex.name) - prop.path = "active_object.data.uv_texture_stencil_index" + prop.data_path = "active_object.data.uv_texture_stencil_index" prop.value = i @@ -986,12 +1346,15 @@ class VIEW3D_PT_tools_particlemode(View3DPanel): col.active = pe.editable col.label(text="Draw:") col.prop(pe, "draw_step", text="Path Steps") - if pe.type == 'PARTICLES': - col.prop(pe, "draw_particles", text="Particles") - col.prop(pe, "fade_time") - sub = col.row() - sub.active = pe.fade_time - sub.prop(pe, "fade_frames", slider=True) + if pe.hair: + col.prop(pe, "draw_particles", text="Children") + else: + if pe.type == 'PARTICLES': + col.prop(pe, "draw_particles", text="Particles") + col.prop(pe, "fade_time") + sub = col.row() + sub.active = pe.fade_time + sub.prop(pe, "fade_frames", slider=True) classes = [ @@ -1010,9 +1373,11 @@ classes = [ VIEW3D_PT_tools_posemode_options, VIEW3D_PT_tools_brush, VIEW3D_PT_tools_brush_texture, - VIEW3D_PT_tools_brush_tool, VIEW3D_PT_tools_brush_stroke, VIEW3D_PT_tools_brush_curve, + VIEW3D_PT_tools_brush_appearance, + VIEW3D_PT_tools_brush_tool, + VIEW3D_PT_sculpt_symmetry, VIEW3D_PT_sculpt_options, VIEW3D_PT_tools_vertexpaint, VIEW3D_PT_tools_weightpaint_options, diff --git a/release/text/readme.html b/release/text/readme.html index 666a8ed6175..1da4b62a73e 100644 --- a/release/text/readme.html +++ b/release/text/readme.html @@ -12,15 +12,15 @@ </style> </head> <body> -<p class="title"><b>Blender 2.5 Alpha 1</b></p> +<p class="title"><b>Blender 2.5 Alpha 2</b></p> <p><br></p> <p class="header"><b>About</b></p> <p class="body">Welcome to Blender, the free, open source 3D application for modeling, animation, rendering, compositing, video editing and game creation. Blender is available for Linux, Mac OS X, Windows, Solaris and Irix and has a large world-wide community.</p> <p class="body">Blender can be used freely for any purpose, including commercial use and distribution. It's free and open-source software, released under the GNU GPL licence. The entire source code is available on our website.</p> <p class="body">For more information, visit <a href="http://www.blender.org">blender.org</a>.</p> <p><br></p> -<p class="header"><b>2.5 Alpha 1</b></p> -<p class="body">The Blender Foundation and online developer community is proud to present Blender 2.5 Alpha 1. This release is the second official testing release of the Blender 2.5 series, and represents the culmination of many years of redesign and development work. <a href="http://www.blender.org/development/release-logs/blender-250/">More information about this release</a>.</p> +<p class="header"><b>2.5 Alpha 2</b></p> +<p class="body">The Blender Foundation and online developer community is proud to present Blender 2.5 Alpha 2. This release is the third official testing release of the Blender 2.5 series, and represents the culmination of many years of redesign and development work. <a href="http://www.blender.org/development/release-logs/blender-250/">More information about this release</a>.</p> <p class="body">What to Expect:</p> <p class="body"> • Big improvements - This is our most exciting version to date, already a significant improvement in many ways over 2.49</p> <p class="body"> • Missing/Incomplete Features - Although most of it is there, not all functionality from pre-2.5 versions has been restored yet. Some functionality may be re-implemented a different way.</p> @@ -28,7 +28,7 @@ <p class="body"> • Changes - If you're used to the old Blenders, Blender 2.5 may seem quite different at first, but it won't be long before it grows on you even more than before.</p> <p><br></p> <p class="header"><b>Bugs</b></p> -<p class="body">Blender 2.5 Alpha 1 is unfinished software. If you encounter a bug, please help us by posting it in the bug tracker or using Help → Report a Bug from inside Blender 2.5. If it wasn’t reported yet, please log in (or register) and fill in detailed information about the error. Please post detailed instructions on how to reproduce it or post a .blend file showcasing the bug.</p> +<p class="body">Blender 2.5 Alpha 2 is unfinished software. If you encounter a bug, please help us by posting it in the bug tracker or using Help → Report a Bug from inside Blender 2.5. If it wasn’t reported yet, please log in (or register) and fill in detailed information about the error. Please post detailed instructions on how to reproduce it or post a .blend file showcasing the bug.</p> <p><br></p> <p class="header"><b>Package Contents</b></p> <p class="body">The downloaded Blender package includes:</p> diff --git a/release/windows/inno/blender.iss b/release/windows/inno/blender.iss deleted file mode 100644 index 5faf5b47406..00000000000 --- a/release/windows/inno/blender.iss +++ /dev/null @@ -1,92 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - - -[Setup] -#define VERSION "2.49b" - -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{C45CB76D-AD5F-49CC-86DE-72B168A6A888} -AppName=Blender -AppVerName=Blender {#VERSION} -AppPublisher=Blender Foundation -AppPublisherURL=http://www.blender.org -AppSupportURL=http://www.blender.org -AppUpdatesURL=http://www.blender.org -DefaultDirName={pf}\Blender -DefaultGroupName=Blender Foundation -AllowNoIcons=true -LicenseFile=.\copyright.txt -OutputBaseFilename=blender-{#VERSION} -Compression=lzma -SolidCompression=true -ChangesAssociations=true -WizardImageFile=.\installer.bmp -WizardSmallImageFile=.\header.bmp -SetupIconFile=.\installer.ico -MinVersion=,5.01.2600sp1 -PrivilegesRequired=none -AllowRootDirectory=true -ShowLanguageDialog=auto - -[Dirs] -Name: {userdocs}\Blender; Flags: uninsneveruninstall; Tasks: ; Languages: - -[Languages] -Name: english; MessagesFile: compiler:Default.isl - -[Tasks] -Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked -Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked - -[Files] -Source: ..\..\..\..\build\bin\release\blender.exe; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\blender.html; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\BlenderQuickStart.pdf; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\copyright.txt; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\GPL-license.txt; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\Python-license.txt; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\release_249.txt; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\*.dll; DestDir: {app}; Flags: ignoreversion -Source: ..\..\..\..\build\bin\release\plugins\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs -Source: ..\..\..\..\build\bin\release\.blender\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs -; NOTE: Don't use "Flags: ignoreversion" on any shared system files - -[Icons] -Name: {group}\Blender; Filename: {app}\blender.exe -Name: {group}\ReleaseNotes; Filename: {app}\release_249.txt -Name: {group}\Blender.org; Filename: {app}\blender.html -Name: {group}\Copyright; Filename: {app}\copyright.txt -Name: {group}\GPL; Filename: {app}\GPL-license.txt -Name: {group}\Uninstall; Filename: {uninstallexe}; Tasks: ; Languages: -Name: {commondesktop}\Blender; Filename: {app}\blender.exe; Tasks: desktopicon -Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Blender; Filename: {app}\blender.exe; Tasks: quicklaunchicon - -[Registry] -Root: HKCR; Subkey: .blend; ValueType: string; ValueName: ; ValueData: BlenderFile; Flags: uninsdeletevalue -Root: HKCR; Subkey: BlenderFile; ValueType: string; ValueName: ; ValueData: Blender File; Flags: uninsdeletekey -Root: HKCR; Subkey: BlenderFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\blender.exe,0 -Root: HKCR; Subkey: BlenderFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\blender.exe"" ""%1""" - -[Run] -Filename: {app}\blender.exe; Description: {cm:LaunchProgram,Blender}; Flags: nowait postinstall skipifsilent - - -[_ISToolDownload] - -[UninstallDelete] -Name: {app}\blender.exe; Type: files -Name: {app}\*.dll; Type: files -Name: {app}\blender.html; Type: files; Tasks: ; Languages: -Name: {app}\BlenderQuickStart.pdf; Type: files -Name: {app}\copyright.txt; Type: files -Name: {app}\GPL-license.txt; Type: files -Name: {app}\Python-license.txt; Type: files -Name: {app}\release_249.txt; Type: files -Name: {app}\.blender\*; Type: filesandordirs -Name: {app}\plugins\*; Type: filesandordirs -Name: {app}\.blender; Type: dirifempty -Name: {app}\plugins; Type: dirifempty -Name: {app}; Type: dirifempty diff --git a/release/windows/inno/copyright.txt b/release/windows/inno/copyright.txt deleted file mode 100644 index 4e67c2561d3..00000000000 --- a/release/windows/inno/copyright.txt +++ /dev/null @@ -1,56 +0,0 @@ -BLENDER CREATOR LICENSE AGREEMENT - -IMPORTANT: PLEASE READ CAREFULLY BEFORE USING THE BLENDER CREATOR SOFTWARE. - -This License Agreement for the Blender Creator software ("License Agreement") is an agreement between NaN Technologies B.V., Meerenakkerplein 11, 5652 BJ Eindhoven, the Netherlands ("NaN") and you (either an individual or a legal entity) ("You") with respect to the software product which this License Agreement accompanies (the "Software"). - -By installing, copying or otherwise using the Software, You agree to be bound by the terms of this License Agreement. If You do not agree to the terms of this License Agreement do not install or use the Software. - - -1. Grant of License - -Subject to the provisions of this License Agreement, NaN grants You a limited, non-exclusive, personal, non-sublicenseable, non-transferable, revocable license to use the Software at any computer You own or use. - -2. License Restrictions - -Except as expressly provided under this License Agreement, or without prior written consent from NaN, or without permission by law, You may not: (a) remove or alter any proprietary, copyright or trademark notices in or on the Software; (b) modify, decompile, disassemble or reverse-engineer the Software; (c) sublicense, rent, lease, lend, assign or otherwise transfer rights to the Software. - -3. Permitted copying and electronic distribution of Software - -You are hereby granted permission to copy and distribute the Software without written agreement from NaN, only for non-commercial purposes. Distributing the Software within a restricted non-public environment, such as using a local network in a company or a local network of a university, is considered a 'non-commercial purpose'. This entire License Agreement must appear in and/or accompany all copies of the Software. -Distributing the Software 'bundled' in with ANY product is considered to be a 'commercial purpose'. - -4. Intellectual Property Rights and Ownership - -Title and ownership to all rights, including intellectual property rights, in and to the Software shall at all times solely and exclusively remain with NaN. The Software is protected by national and international (copyright) laws and treaties. All rights not expressly granted herein are reserved to NaN. - -5. Disclaimer of Warranties - -NaN provides you with the Software "as is" and with all faults. NaN explicitly disclaims all warranties and guarantees and does not make any representations with respect to the Software, whether express, implied, or statutory, including, but not limited to any (if any) warranties of or related to: fitness for a particular purpose, title, non-infringement, lack of viruses, accuracy or completeness of responses, results, lack of negligence or lack of workmanlike effort, and correspondence to description. The entire risk arising out of use or performance of the Software remains with You. - -6. Limitation of Liability - -In no event shall NaN or its employees, agents or suppliers be liable for any direct, indirect, consequential, incidental, special, punitive, or other damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, claims of third parties, damages as a result of injury to any person, or any other loss) arising out of or in connection with the license granted under this License Agreement or the use of or inability to use the Software, even if NaN has been advised of the possibility of such damages. - -7. User warning and indemnification - -WARNING: use of the Software and use of any works that are (partially) created with the Software (the "Works") may cause physical or psychological reactions from You or from third parties, which may result in damages, injuries, losses and/or other negative consequences. You acknowledge that NaN can not be held liable for any such damages, injuries, losses and/or other negative consequences. You acknowledge that it is your obligation to investigate, prevent and/or minimize such reactions prior to having third parties use the Works. - -You shall indemnify and hold harmless NaN from and against all actions, claims, demands, proceedings, losses, damages, costs, charges and expenses, including but not limited to legal fees and expenses, arising out of or in connection with (i) the use of the Software by You and (ii) the use of any Works created with the Software by You or any third parties. - -8. Term and Termination - -This License Agreement and the license granted hereunder is effective until terminated. This License Agreement shall terminate automatically and forthwith if You fail to comply with the terms of this License Agreement. Upon termination, You shall cease the use of the Software, remove the Software from (the memory of) your computer and destroy all copies of the Software. - -9. Entire Agreement - -This License Agreement is the entire agreement between NaN and You in respect of the subject matter of the License Agreement. This License Agreement supersedes all prior written or oral agreements, proposals or understandings, and any other communications between NaN and You relating to the subject matter of this License Agreement. - -10. Enforceability - -If any provision of this License Agreement is held to be unenforceable by a court of competent jurisdiction for any reason, such provision shall be adapted or amended only to the extent necessary to make it enforceable, and the remainder of the License Agreement shall remain in effect. - -11. Governing law and disputes - -This License Agreement and all disputes arising from it will be governed by the laws of The Netherlands. All disputes arising in connection with this Agreement that cannot be settled amicably shall be brought before the competent court in Amsterdam, the Netherlands, to which jurisdiction NaN and You hereby irrevocably consent. - diff --git a/release/windows/inno/installer.bmp b/release/windows/inno/installer.bmp deleted file mode 100644 index 10fb01454a4..00000000000 Binary files a/release/windows/inno/installer.bmp and /dev/null differ diff --git a/release/windows/installer/00.checked.bmp b/release/windows/installer/00.checked.bmp new file mode 100644 index 00000000000..6c2e98d361c Binary files /dev/null and b/release/windows/installer/00.checked.bmp differ diff --git a/release/windows/inno/header.bmp b/release/windows/installer/00.header.bmp similarity index 100% rename from release/windows/inno/header.bmp rename to release/windows/installer/00.header.bmp diff --git a/release/windows/inno/installer.ico b/release/windows/installer/00.installer.ico similarity index 100% rename from release/windows/inno/installer.ico rename to release/windows/installer/00.installer.ico diff --git a/release/windows/installer/00.sconsblender.nsi b/release/windows/installer/00.sconsblender.nsi new file mode 100644 index 00000000000..89255ced981 --- /dev/null +++ b/release/windows/installer/00.sconsblender.nsi @@ -0,0 +1,225 @@ +; +; $Id$ +; +; Blender Self-Installer for Windows (NSIS - http://nsis.sourceforge.net) +; +; Requires the MoreInfo plugin - http://nsis.sourceforge.net/MoreInfo_plug-in +; + +!include "MUI.nsh" +!include "WinVer.nsh" +!include "FileFunc.nsh" +!include "WordFunc.nsh" +!include "nsDialogs.nsh" + +SetCompressor /SOLID lzma + +Name "Blender [VERSION]" + +!define MUI_ABORTWARNING + +!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Blender. It is recommended that you close all other applications before starting Setup." +!define MUI_WELCOMEFINISHPAGE_BITMAP "[RELDIR]\01.installer.bmp" +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "[RELDIR]\00.header.bmp" +!define MUI_COMPONENTSPAGE_SMALLDESC +!define MUI_FINISHPAGE_RUN "$INSTDIR\blender.exe" +!define MUI_CHECKBITMAP "[RELDIR]\00.checked.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "[RELDIR]\01.installer.bmp" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "[DISTDIR]\Copyright.txt" +!insertmacro MUI_PAGE_COMPONENTS + +!insertmacro MUI_PAGE_DIRECTORY +Page custom DataLocation DataLocationOnLeave +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro Locate +!insertmacro VersionCompare + + +Icon "[RELDIR]\00.installer.ico" +UninstallIcon "[RELDIR]\00.installer.ico" + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Language Strings + + ;Description + LangString DESC_SecCopyUI ${LANG_ENGLISH} "Copy all required files to the application folder." + LangString DESC_Section2 ${LANG_ENGLISH} "Add shortcut items to the Start Menu. (Recommended)" + LangString DESC_Section3 ${LANG_ENGLISH} "Add a shortcut to Blender on your desktop." + LangString DESC_Section4 ${LANG_ENGLISH} "Blender can register itself with .blend files to allow double-clicking from Windows Explorer, etc." + LangString TEXT_IO_TITLE ${LANG_ENGLISH} "Specify User Data Location" +;-------------------------------- +;Data + +Caption "Blender [VERSION] Installer" +OutFile "[DISTDIR]\..\blender-[VERSION]-windows[BITNESS].exe" +InstallDir "$PROGRAMFILES[BITNESS]\Blender Foundation\Blender" + +BrandingText "Blender Foundation | http://www.blender.org" +ComponentText "This will install Blender [VERSION] on your computer." + +DirText "Use the field below to specify the folder where you want Blender to be copied to. To specify a different folder, type a new name or use the Browse button to select an existing folder." + +SilentUnInstall normal + +Var BLENDERHOME +Var SHORTVERSION ; This is blender_version_decimal() from path_util.c + +; custom controls +Var HWND + +Var HWND_APPDATA +Var HWND_INSTDIR +Var HWND_HOMEDIR + +Function .onInit + ClearErrors + StrCpy $SHORTVERSION "[SHORTVERSION]" +FunctionEnd + +Function DataLocation + nsDialogs::Create /NOUNLOAD 1018 + Pop $HWND + + ${If} $HWND == error + Abort + ${EndIf} + + ${NSD_CreateLabel} 0 0 100% 12u "Please specify where you wish to install Blender's user data files." + ${NSD_CreateRadioButton} 0 20 100% 12u "Use the Application Data directory (Requires Windows 2000 or better)" + Pop $HWND_APPDATA + ${NSD_CreateRadioButton} 0 50 100% 12u "Use the installation directory (ie. location chosen to install blender.exe)." + Pop $HWND_INSTDIR + ${NSD_CreateRadioButton} 0 80 100% 12u "I have defined a %HOME% variable, please install files here." + Pop $HWND_HOMEDIR + + ${If} ${AtMostWinME} + GetDlgItem $0 $HWND $HWND_APPDATA + EnableWindow $0 0 + SendMessage $HWND_INSTDIR ${BM_SETCHECK} 1 0 + ${Else} + SendMessage $HWND_APPDATA ${BM_SETCHECK} 1 0 + ${EndIf} + + nsDialogs::Show + +FunctionEnd + +Function DataLocationOnLeave + ${NSD_GetState} $HWND_APPDATA $R0 + ${If} $R0 == "1" + StrCpy $BLENDERHOME "$APPDATA\Blender Foundation\Blender" + ${Else} + ${NSD_GetState} $HWND_INSTDIR $R0 + ${If} $R0 == "1" + StrCpy $BLENDERHOME $INSTDIR + ${Else} + ${NSD_GetState} $HWND_HOMEDIR $R0 + ${If} $R0 == "1" + ReadEnvStr $BLENDERHOME "HOME" + ${EndIf} + ${EndIf} + ${EndIf} +FunctionEnd + +Section "Blender-[VERSION] (required)" SecCopyUI + SectionIn RO + + ; Set output path to the installation directory. + SetOutPath $INSTDIR + ; the contents of Blender installation root dir + [ROOTDIRCONTS] + + ; all datafiles (python, scripts, config) + [DODATAFILES] + + SetOutPath $INSTDIR + ; Write the installation path into the registry + WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "Install_Dir" "$INSTDIR" + WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir" "$BLENDERHOME" + WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ShortVersion" "[SHORTVERSION]" + ; Write the uninstall keys for Windows + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayName" "Blender (remove only)" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "UninstallString" '"$INSTDIR\uninstall.exe"' + WriteUninstaller "uninstall.exe" + + ; Let's now run silent vcredist installer + SetOutPath $TEMP + [VCREDIST] + +SectionEnd + +Section "Add Start Menu shortcuts" Section2 + SetShellVarContext all + CreateDirectory "$SMPROGRAMS\Blender Foundation\Blender\" + CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 + CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Blender.lnk" "$INSTDIR\Blender.exe" "" "$INSTDIR\blender.exe" 0 + CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Readme.lnk" "$INSTDIR\readme.html" "" "" 0 + CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Copyright.lnk" "$INSTDIR\Copyright.txt" "" "$INSTDIR\copyright.txt" 0 + CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\GPL-license.lnk" "$INSTDIR\GPL-license.txt" "" "$INSTDIR\GPL-license.txt" 0 +SectionEnd + +Section "Add Desktop Blender-[VERSION] shortcut" Section3 + CreateShortCut "$DESKTOP\Blender.lnk" "$INSTDIR\blender.exe" "" "$INSTDIR\blender.exe" 0 +SectionEnd + +Section "Open .blend files with Blender-[VERSION]" Section4 + + WriteRegStr HKCR ".blend" "" "blendfile" + WriteRegStr HKCR "blendfile" "" "Blender .blend File" + WriteRegStr HKCR "blendfile\shell" "" "open" + WriteRegStr HKCR "blendfile\DefaultIcon" "" $INSTDIR\blender.exe,1 + WriteRegStr HKCR "blendfile\shell\open\command" "" \ + '"$INSTDIR\blender.exe" "%1"' + +SectionEnd + +UninstallText "This will uninstall Blender [VERSION], and all datafiles from the installation dir. Hit next to continue." + +Section "Uninstall" + ; remove registry keys + ReadRegStr $BLENDERHOME HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir" + ReadRegStr $SHORTVERSION HKLM "SOFTWARE\BlenderFoundation" "ShortVersion" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" + DeleteRegKey HKLM "SOFTWARE\BlenderFoundation" + SetShellVarContext all + + StrCpy $0 "$SMPROGRAMS\Blender Foundation\" + MessageBox MB_OK $0 + ; remove files + [DELROOTDIRCONTS] + + Delete "$INSTDIR\uninstall.exe" + + MessageBox MB_YESNO "Erase $BLENDERHOME? This includes all installed scripts and configuration files and any file you may have created there." IDNO Next + RMDir /r "$BLENDERHOME" +Next: + ; remove shortcuts, if any. + Delete "$DESKTOP\Blender.lnk" + ; remove all link related directories and files + RMDir /r "$SMPROGRAMS\Blender Foundation\" + ; remove entire installation directory, including any file created by the user + RMDir /r "$INSTDIR" +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecCopyUI} $(DESC_SecCopyUI) + !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2) + !insertmacro MUI_DESCRIPTION_TEXT ${Section3} $(DESC_Section3) + !insertmacro MUI_DESCRIPTION_TEXT ${Section4} $(DESC_Section4) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + diff --git a/source/Makefile b/source/Makefile index fde4af16d91..12e47ba5863 100644 --- a/source/Makefile +++ b/source/Makefile @@ -97,6 +97,7 @@ COMLIB += $(OCGDIR)/blender/nodes_tex/$(DEBUG_DIR)libnodes_tex.a COMLIB += $(OCGDIR)/blender/nodes/$(DEBUG_DIR)libnodes.a COMLIB += $(OCGDIR)/blender/imbuf/$(DEBUG_DIR)libimbuf.a COMLIB += $(OCGDIR)/blender/ikplugin/$(DEBUG_DIR)libikplugin.a +COMLIB += $(OCGDIR)/blender/modifiers/$(DEBUG_DIR)libmodifiers.a COMLIB += $(NAN_IKSOLVER)/lib/$(DEBUG_DIR)libiksolver.a COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc.a COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc_kdl.a @@ -119,6 +120,7 @@ COMLIB += $(NAN_BSP)/lib/$(DEBUG_DIR)libbsp.a COMLIB += $(NAN_BOOLOP)/lib/$(DEBUG_DIR)libboolop.a COMLIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a COMLIB += $(NAN_DECIMATION)/lib/$(DEBUG_DIR)libdecimation.a +COMLIB += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a ifeq ($(WITH_FFMPEG),true) COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_ffmpeg.a @@ -477,7 +479,7 @@ debug debuglink:: clean:: linkclean debuglinkclean link: $(BINTARGETS) - @echo "****> Build $(MAKE_START) - `date '+%H:%M:%S %d-%b-%Y'`" + @echo "****> Build SVN rev $(BUILD_REV), $(MAKE_START) - `date '+%H:%M:%S %d-%b-%Y'`" ifdef NANENV @for n in $(NANENV); do \ echo " $$n"; \ diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index b7686752882..2af347a82a7 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -29,6 +29,7 @@ ADD_SUBDIRECTORY(editors) ADD_SUBDIRECTORY(avi) ADD_SUBDIRECTORY(nodes) ADD_SUBDIRECTORY(blenkernel) +ADD_SUBDIRECTORY(modifiers) ADD_SUBDIRECTORY(blenlib) ADD_SUBDIRECTORY(bmesh) ADD_SUBDIRECTORY(blenloader) diff --git a/source/blender/Makefile b/source/blender/Makefile index 1c4ff6935b9..1149e1c4be2 100644 --- a/source/blender/Makefile +++ b/source/blender/Makefile @@ -33,7 +33,7 @@ include nan_definitions.mk DIRS = windowmanager editors blenloader readblenfile DIRS += avi imbuf render blenlib blenkernel blenpluginapi DIRS += makesdna makesrna -DIRS += python nodes gpu +DIRS += python nodes modifiers gpu DIRS += blenfont ikplugin ifeq ($(WITH_QUICKTIME), true) diff --git a/source/blender/SConscript b/source/blender/SConscript index 6033374ddb5..c4990dc765b 100644 --- a/source/blender/SConscript +++ b/source/blender/SConscript @@ -17,6 +17,7 @@ SConscript(['avi/SConscript', 'readblenfile/SConscript', 'render/SConscript', 'nodes/SConscript', + 'modifiers/SConscript', 'ikplugin/SConscript', 'windowmanager/SConscript', 'blenfont/SConscript']) diff --git a/source/blender/avi/AVI_avi.h b/source/blender/avi/AVI_avi.h index 42493685ede..a3115e0543b 100644 --- a/source/blender/avi/AVI_avi.h +++ b/source/blender/avi/AVI_avi.h @@ -175,7 +175,7 @@ typedef struct _AviStreamRec { } AviStreamRec; typedef struct _AviMovie { - FILE *fp; + FILE *fp; int type; #define AVI_MOVIE_READ 0 diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 5be39557577..a73dec57a55 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -197,8 +197,8 @@ int AVI_is_avi (char *name) { return 0; if (GET_FCC (fp) != FCC("RIFF") || - !GET_FCC (fp) || - GET_FCC (fp) != FCC("AVI ")) { + !GET_FCC (fp) || + GET_FCC (fp) != FCC("AVI ")) { ret = 0; } else { ret = 1; @@ -228,19 +228,19 @@ int AVI_is_avi (char *name) { return 0; if (GET_FCC (movie.fp) != FCC("RIFF") || - !(movie.size = GET_FCC (movie.fp))) { - fclose(movie.fp); + !(movie.size = GET_FCC (movie.fp))) { + fclose(movie.fp); return 0; } movie.header = &header; if (GET_FCC (movie.fp) != FCC("AVI ") || - GET_FCC (movie.fp) != FCC("LIST") || - !GET_FCC (movie.fp) || - GET_FCC (movie.fp) != FCC("hdrl") || - (movie.header->fcc = GET_FCC (movie.fp)) != FCC("avih") || - !(movie.header->size = GET_FCC (movie.fp))) { + GET_FCC (movie.fp) != FCC("LIST") || + !GET_FCC (movie.fp) || + GET_FCC (movie.fp) != FCC("hdrl") || + (movie.header->fcc = GET_FCC (movie.fp)) != FCC("avih") || + !(movie.header->size = GET_FCC (movie.fp))) { DEBUG("bad initial header info\n"); fclose(movie.fp); return 0; @@ -274,10 +274,10 @@ int AVI_is_avi (char *name) { for (temp=0; temp < movie.header->Streams; temp++) { if (GET_FCC(movie.fp) != FCC("LIST") || - !GET_FCC (movie.fp) || - GET_FCC (movie.fp) != FCC ("strl") || - (movie.streams[temp].sh.fcc = GET_FCC (movie.fp)) != FCC ("strh") || - !(movie.streams[temp].sh.size = GET_FCC (movie.fp))) { + !GET_FCC (movie.fp) || + GET_FCC (movie.fp) != FCC ("strl") || + (movie.streams[temp].sh.fcc = GET_FCC (movie.fp)) != FCC ("strh") || + !(movie.streams[temp].sh.size = GET_FCC (movie.fp))) { DEBUG("bad stream header information\n"); MEM_freeN(movie.streams); @@ -357,7 +357,7 @@ int AVI_is_avi (char *name) { fcca = bi->Compression; - if ( movie.streams[temp].format == + if ( movie.streams[temp].format == AVI_FORMAT_AVI_RGB) { if (fcca == FCC ("DIB ") || fcca == FCC ("RGB ") || @@ -386,7 +386,7 @@ int AVI_is_avi (char *name) { MEM_freeN(movie.streams); fclose(movie.fp); - return 0; + return 0; } fseek(movie.fp, temp, SEEK_CUR); } @@ -417,17 +417,17 @@ AviError AVI_open_movie (char *name, AviMovie *movie) { return AVI_ERROR_OPEN; if (GET_FCC (movie->fp) != FCC("RIFF") || - !(movie->size = GET_FCC (movie->fp))) + !(movie->size = GET_FCC (movie->fp))) return AVI_ERROR_FORMAT; movie->header = (AviMainHeader *) MEM_mallocN (sizeof (AviMainHeader), "movieheader"); if (GET_FCC (movie->fp) != FCC("AVI ") || - GET_FCC (movie->fp) != FCC("LIST") || - !GET_FCC (movie->fp) || - GET_FCC (movie->fp) != FCC("hdrl") || - (movie->header->fcc = GET_FCC (movie->fp)) != FCC("avih") || - !(movie->header->size = GET_FCC (movie->fp))) { + GET_FCC (movie->fp) != FCC("LIST") || + !GET_FCC (movie->fp) || + GET_FCC (movie->fp) != FCC("hdrl") || + (movie->header->fcc = GET_FCC (movie->fp)) != FCC("avih") || + !(movie->header->size = GET_FCC (movie->fp))) { DEBUG("bad initial header info\n"); return AVI_ERROR_FORMAT; } @@ -459,10 +459,10 @@ AviError AVI_open_movie (char *name, AviMovie *movie) { for (temp=0; temp < movie->header->Streams; temp++) { if (GET_FCC(movie->fp) != FCC("LIST") || - !GET_FCC (movie->fp) || - GET_FCC (movie->fp) != FCC ("strl") || - (movie->streams[temp].sh.fcc = GET_FCC (movie->fp)) != FCC ("strh") || - !(movie->streams[temp].sh.size = GET_FCC (movie->fp))) { + !GET_FCC (movie->fp) || + GET_FCC (movie->fp) != FCC ("strl") || + (movie->streams[temp].sh.fcc = GET_FCC (movie->fp)) != FCC ("strh") || + !(movie->streams[temp].sh.size = GET_FCC (movie->fp))) { DEBUG("bad stream header information\n"); return AVI_ERROR_FORMAT; } @@ -535,7 +535,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) { fcca = bi->Compression; - if ( movie->streams[temp].format == + if ( movie->streams[temp].format == AVI_FORMAT_AVI_RGB) { if (fcca == FCC ("DIB ") || fcca == FCC ("RGB ") || @@ -559,7 +559,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) { temp= GET_FCC (movie->fp); if (temp<0 || ftell(movie->fp) > movie->size) { DEBUG("incorrect size in header or error in AVI\n"); - return AVI_ERROR_FORMAT; + return AVI_ERROR_FORMAT; } fseek(movie->fp, temp, SEEK_CUR); } @@ -584,7 +584,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) { } if (ftell(movie->fp) > movie->size) { DEBUG("incorrect size in header or error in AVI\n"); - return AVI_ERROR_FORMAT; + return AVI_ERROR_FORMAT; } } @@ -727,9 +727,9 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) { movie->header->fcc = FCC("avih"); movie->header->size = 56; movie->header->MicroSecPerFrame = 66667; - movie->header->MaxBytesPerSec = 0; - movie->header->PaddingGranularity = 0; - movie->header->Flags = AVIF_HASINDEX | AVIF_MUSTUSEINDEX; + movie->header->MaxBytesPerSec = 0; + movie->header->PaddingGranularity = 0; + movie->header->Flags = AVIF_HASINDEX | AVIF_MUSTUSEINDEX; movie->header->TotalFrames = 0; movie->header->InitialFrames = 0; movie->header->Streams = streams; @@ -906,10 +906,10 @@ AviError AVI_write_frame (AviMovie *movie, int frame_num, ...) { if (frame_num+1 > movie->index_entries) { temp = (AviIndexEntry *) MEM_mallocN ((frame_num+1) * - (movie->header->Streams+1) * sizeof(AviIndexEntry),"newidxentry"); + (movie->header->Streams+1) * sizeof(AviIndexEntry),"newidxentry"); if (movie->entries != NULL) { memcpy (temp, movie->entries, movie->index_entries * (movie->header->Streams+1) - * sizeof(AviIndexEntry)); + * sizeof(AviIndexEntry)); MEM_freeN (movie->entries); } diff --git a/source/blender/avi/intern/avirgb.c b/source/blender/avi/intern/avirgb.c index 2fcc2646e6f..f7acbf238b5 100644 --- a/source/blender/avi/intern/avirgb.c +++ b/source/blender/avi/intern/avirgb.c @@ -32,10 +32,6 @@ * */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "AVI_avi.h" #include <stdlib.h> #include <string.h> diff --git a/source/blender/avi/intern/codecs.c b/source/blender/avi/intern/codecs.c index 9691c903027..c66de231b3f 100644 --- a/source/blender/avi/intern/codecs.c +++ b/source/blender/avi/intern/codecs.c @@ -38,47 +38,43 @@ #include "mjpeg.h" #include "rgb32.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, int *size) { if (from == to) - return buffer; + return buffer; if (from != AVI_FORMAT_RGB24 && - to != AVI_FORMAT_RGB24) - return avi_format_convert(movie, stream, - avi_format_convert (movie, stream, buffer, from, AVI_FORMAT_RGB24, size), - AVI_FORMAT_RGB24, to, size); + to != AVI_FORMAT_RGB24) + return avi_format_convert(movie, stream, + avi_format_convert (movie, stream, buffer, from, AVI_FORMAT_RGB24, size), + AVI_FORMAT_RGB24, to, size); switch (to) { case AVI_FORMAT_RGB24: - switch (from) { - case AVI_FORMAT_AVI_RGB: - buffer = avi_converter_from_avi_rgb (movie, stream, buffer, size); - break; - case AVI_FORMAT_MJPEG: - buffer = avi_converter_from_mjpeg (movie, stream, buffer, size); - break; - case AVI_FORMAT_RGB32: - buffer = avi_converter_from_rgb32 (movie, stream, buffer, size); - break; - default: - break; - } - break; + switch (from) { + case AVI_FORMAT_AVI_RGB: + buffer = avi_converter_from_avi_rgb (movie, stream, buffer, size); + break; + case AVI_FORMAT_MJPEG: + buffer = avi_converter_from_mjpeg (movie, stream, buffer, size); + break; + case AVI_FORMAT_RGB32: + buffer = avi_converter_from_rgb32 (movie, stream, buffer, size); + break; + default: + break; + } + break; case AVI_FORMAT_AVI_RGB: - buffer = avi_converter_to_avi_rgb (movie, stream, buffer, size); - break; + buffer = avi_converter_to_avi_rgb (movie, stream, buffer, size); + break; case AVI_FORMAT_MJPEG: - buffer = avi_converter_to_mjpeg (movie, stream, buffer, size); - break; + buffer = avi_converter_to_mjpeg (movie, stream, buffer, size); + break; case AVI_FORMAT_RGB32: - buffer = avi_converter_to_rgb32 (movie, stream, buffer, size); - break; + buffer = avi_converter_to_rgb32 (movie, stream, buffer, size); + break; default: - break; + break; } return buffer; @@ -88,11 +84,11 @@ int avi_get_data_id (AviFormat format, int stream) { char fcc[5]; if (avi_get_format_type (format) == FCC("vids")) - sprintf (fcc,"%2.2ddc",stream); + sprintf (fcc,"%2.2ddc",stream); else if (avi_get_format_type (format) == FCC("auds")) - sprintf (fcc,"%2.2ddc",stream); + sprintf (fcc,"%2.2ddc",stream); else - return 0; + return 0; return FCC(fcc); } @@ -103,11 +99,11 @@ int avi_get_format_type (AviFormat format) { case AVI_FORMAT_RGB32: case AVI_FORMAT_AVI_RGB: case AVI_FORMAT_MJPEG: - return FCC("vids"); - break; + return FCC("vids"); + break; default: - return 0; - break; + return 0; + break; } } @@ -116,14 +112,14 @@ int avi_get_format_fcc (AviFormat format) { case AVI_FORMAT_RGB24: case AVI_FORMAT_RGB32: case AVI_FORMAT_AVI_RGB: - return FCC("DIB "); - break; + return FCC("DIB "); + break; case AVI_FORMAT_MJPEG: - return FCC("MJPG"); - break; + return FCC("MJPG"); + break; default: - return 0; - break; + return 0; + break; } } @@ -132,13 +128,13 @@ int avi_get_format_compression (AviFormat format) { case AVI_FORMAT_RGB24: case AVI_FORMAT_RGB32: case AVI_FORMAT_AVI_RGB: - return 0; - break; + return 0; + break; case AVI_FORMAT_MJPEG: - return FCC("MJPG"); - break; + return FCC("MJPG"); + break; default: - return 0; - break; + return 0; + break; } } diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c index b0422a4e56e..282e26b3ee8 100644 --- a/source/blender/avi/intern/endian.c +++ b/source/blender/avi/intern/endian.c @@ -32,10 +32,6 @@ * ***** END GPL LICENSE BLOCK ***** * */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include <stdlib.h> #include <string.h> #include <stdio.h> diff --git a/source/blender/avi/intern/mjpeg.c b/source/blender/avi/intern/mjpeg.c index 6608e6c8363..fd7e8aaef83 100644 --- a/source/blender/avi/intern/mjpeg.c +++ b/source/blender/avi/intern/mjpeg.c @@ -40,10 +40,6 @@ #include "mjpeg.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #define PADUP(num, amt) ((num+(amt-1))&~(amt-1)) static void jpegmemdestmgr_build (j_compress_ptr cinfo, unsigned char *buffer, int bufsize); @@ -134,13 +130,13 @@ static void std_huff_tables (j_decompress_ptr dinfo) { 0xf9, 0xfa }; add_huff_table(dinfo, &dinfo->dc_huff_tbl_ptrs[0], - bits_dc_luminance, val_dc_luminance); + bits_dc_luminance, val_dc_luminance); add_huff_table(dinfo, &dinfo->ac_huff_tbl_ptrs[0], - bits_ac_luminance, val_ac_luminance); + bits_ac_luminance, val_ac_luminance); add_huff_table(dinfo, &dinfo->dc_huff_tbl_ptrs[1], - bits_dc_chrominance, val_dc_chrominance); + bits_dc_chrominance, val_dc_chrominance); add_huff_table(dinfo, &dinfo->ac_huff_tbl_ptrs[1], - bits_ac_chrominance, val_ac_chrominance); + bits_ac_chrominance, val_ac_chrominance); } static int Decode_JPEG(unsigned char *inBuffer, unsigned char *outBuffer, unsigned int width, unsigned int height, int bufsize) { diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c index bab02ec2a40..15ec40ade8c 100644 --- a/source/blender/avi/intern/options.c +++ b/source/blender/avi/intern/options.c @@ -36,10 +36,6 @@ #include "avi_intern.h" #include "endian.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - /* avi_set_compress_options gets its own file... now don't WE feel important? */ AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) { @@ -109,17 +105,17 @@ AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, } - fseek (movie->fp, movie->offset_table[0], SEEK_SET); - awrite (movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); + fseek (movie->fp, movie->offset_table[0], SEEK_SET); + awrite (movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); - break; + break; case AVI_OPTION_TYPE_STRH: - break; + break; case AVI_OPTION_TYPE_STRF: - break; + break; default: - return AVI_ERROR_OPTION; - break; + return AVI_ERROR_OPTION; + break; } return AVI_ERROR_NONE; diff --git a/source/blender/avi/intern/rgb32.c b/source/blender/avi/intern/rgb32.c index 80fb27408a8..68e3ce4d1d2 100644 --- a/source/blender/avi/intern/rgb32.c +++ b/source/blender/avi/intern/rgb32.c @@ -37,10 +37,6 @@ #include "MEM_guardedalloc.h" #include "rgb32.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size) { int y, x, rowstridea, rowstrideb; unsigned char *buf; diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h index ef903671fae..933d287bcff 100644 --- a/source/blender/blenfont/BLF_api.h +++ b/source/blender/blenfont/BLF_api.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -37,50 +37,47 @@ void BLF_exit(void); int BLF_load(char *name); int BLF_load_mem(char *name, unsigned char *mem, int mem_size); +int BLF_load_unique(char *name); +int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size); + /* Attach a file with metrics information from memory. */ -void BLF_metrics_attach(unsigned char *mem, int mem_size); +void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size); -/* - * Set/Get the current font. - */ -void BLF_set(int fontid); -int BLF_get(void); - -void BLF_aspect(float aspect); -void BLF_position(float x, float y, float z); -void BLF_size(int size, int dpi); +void BLF_aspect(int fontid, float aspect); +void BLF_position(int fontid, float x, float y, float z); +void BLF_size(int fontid, int size, int dpi); /* Draw the string using the default font, size and dpi. */ void BLF_draw_default(float x, float y, float z, char *str); /* Draw the string using the current font. */ -void BLF_draw(char *str); +void BLF_draw(int fontid, char *str); /* * This function return the bounding box of the string * and are not multiplied by the aspect. */ -void BLF_boundbox(char *str, struct rctf *box); +void BLF_boundbox(int fontid, char *str, struct rctf *box); /* * The next both function return the width and height * of the string, using the current font and both value * are multiplied by the aspect of the font. */ -float BLF_width(char *str); -float BLF_height(char *str); +float BLF_width(int fontid, char *str); +float BLF_height(int fontid, char *str); /* * The following function return the width and height of the string, but * just in one call, so avoid extra freetype2 stuff. */ -void BLF_width_and_height(char *str, float *width, float *height); +void BLF_width_and_height(int fontid, char *str, float *width, float *height); /* * For fixed width fonts only, returns the width of a * character. */ -float BLF_fixed_width(void); +float BLF_fixed_width(int fontid); /* * and this two function return the width and height @@ -91,27 +88,34 @@ float BLF_width_default(char *str); float BLF_height_default(char *str); /* - * set rotation for default font + * Set rotation for default font. */ -void BLF_default_rotation(float angle); +void BLF_rotation_default(float angle); + +/* + * Enable/disable options to the default font. + */ +void BLF_enable_default(int option); +void BLF_disable_default(int option); /* * By default, rotation and clipping are disable and * have to be enable/disable using BLF_enable/disable. */ -void BLF_rotation(float angle); -void BLF_clipping(float xmin, float ymin, float xmax, float ymax); -void BLF_blur(int size); +void BLF_rotation(int fontid, float angle); +void BLF_clipping(int fontid, float xmin, float ymin, float xmax, float ymax); +void BLF_clipping_default(float xmin, float ymin, float xmax, float ymax); +void BLF_blur(int fontid, int size); -void BLF_enable(int option); -void BLF_disable(int option); +void BLF_enable(int fontid, int option); +void BLF_disable(int fontid, int option); /* * Shadow options, level is the blur level, can be 3, 5 or 0 and * the other argument are the rgba color. * Take care that shadow need to be enable using BLF_enable!!. */ -void BLF_shadow(int level, float r, float g, float b, float a); +void BLF_shadow(int fontid, int level, float r, float g, float b, float a); /* * Set the offset for shadow text, this is the current cursor @@ -119,7 +123,7 @@ void BLF_shadow(int level, float r, float g, float b, float a); * this function, the current position is calculate only on * BLF_draw, so it's safe call this whenever you like. */ -void BLF_shadow_offset(int x, int y); +void BLF_shadow_offset(int fontid, int x, int y); /* * Set the buffer, size and number of channels to draw, one thing to take care is call @@ -130,18 +134,18 @@ void BLF_shadow_offset(int x, int y); * * BLF_buffer(NULL, NULL, 0, 0, 0); */ -void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch); +void BLF_buffer(int fontid, float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch); /* * Set the color to be used for text. */ -void BLF_buffer_col(float r, float g, float b, float a); +void BLF_buffer_col(int fontid, float r, float g, float b, float a); /* * Draw the string into the buffer, this function draw in both buffer, float and unsigned char _BUT_ * it's not necessary set both buffer, NULL is valid here. */ -void BLF_draw_buffer(char *str); +void BLF_draw_buffer(int fontid, char *str); /* * Search the path directory to the locale files, this try all diff --git a/source/blender/blenfont/BLF_types.h b/source/blender/blenfont/BLF_types.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/source/blender/blenfont/Makefile b/source/blender/blenfont/Makefile index 43eda027855..9f34d458126 100644 --- a/source/blender/blenfont/Makefile +++ b/source/blender/blenfont/Makefile @@ -1,5 +1,5 @@ # -# $Id: +# $Id$ # # ***** BEGIN GPL LICENSE BLOCK ***** # diff --git a/source/blender/blenfont/intern/Makefile b/source/blender/blenfont/intern/Makefile index 6e53ca959d3..77e87c27a02 100644 --- a/source/blender/blenfont/intern/Makefile +++ b/source/blender/blenfont/intern/Makefile @@ -1,5 +1,5 @@ # -# $Id: +# $Id$ # # ***** BEGIN GPL LICENSE BLOCK ***** # @@ -32,6 +32,7 @@ DIR = $(OCGDIR)/blender/blenfont include nan_compile.mk CFLAGS += $(LEVEL_1_C_WARNINGS) +#CFLAGS += -O2 -Wall -Wno-char-subscripts # OpenGL and Freetype2 CPPFLAGS += -I$(NAN_GLEW)/include diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 682a0aabb4f..f6b7c5f71e6 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -41,14 +41,7 @@ #include "DNA_listBase.h" #include "DNA_vec_types.h" -#include "BKE_utildefines.h" - -#include "BLI_blenlib.h" -#include "BLI_linklist.h" /* linknode */ -#include "BLI_string.h" - #include "BIF_gl.h" -#include "BIF_glutil.h" #include "BLF_api.h" #include "blf_internal_types.h" @@ -68,14 +61,18 @@ FontBLF *global_font[BLF_MAX_FONT]; /* Number of font. */ int global_font_num= 0; -/* Current font. */ -int global_font_cur= 0; - /* Default size and dpi, for BLF_draw_default. */ int global_font_default= -1; int global_font_points= 11; int global_font_dpi= 72; +static FontBLF *BLF_get(int fontid) +{ + if (fontid >= 0 && fontid < BLF_MAX_FONT) + return(global_font[fontid]); + return(NULL); +} + int BLF_init(int points, int dpi) { int i; @@ -156,11 +153,48 @@ int BLF_load(char *name) return(i); } -void BLF_metrics_attach(unsigned char *mem, int mem_size) +int BLF_load_unique(char *name) +{ + FontBLF *font; + char *filename; + int i; + + if (!name) + return(-1); + + /* Don't search in the cache!! make a new + * object font, this is for keep fonts threads safe. + */ + if (global_font_num+1 >= BLF_MAX_FONT) { + printf("Too many fonts!!!\n"); + return(-1); + } + + filename= blf_dir_search(name); + if (!filename) { + printf("Can't find font: %s\n", name); + return(-1); + } + + font= blf_font_new(name, filename); + MEM_freeN(filename); + + if (!font) { + printf("Can't load font: %s\n", name); + return(-1); + } + + global_font[global_font_num]= font; + i= global_font_num; + global_font_num++; + return(i); +} + +void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_attach_from_mem(font, mem, mem_size); } @@ -201,50 +235,91 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size) return(i); } -void BLF_set(int fontid) +int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size) { - if (fontid >= 0 && fontid < BLF_MAX_FONT) - global_font_cur= fontid; + FontBLF *font; + int i; + + if (!name) + return(-1); + + /* + * Don't search in the cache, make a new object font! + * this is to keep the font thread safe. + */ + if (global_font_num+1 >= BLF_MAX_FONT) { + printf("Too many fonts!!!\n"); + return(-1); + } + + if (!mem || !mem_size) { + printf("Can't load font: %s from memory!!\n", name); + return(-1); + } + + font= blf_font_new_from_mem(name, mem, mem_size); + if (!font) { + printf("Can't load font: %s from memory!!\n", name); + return(-1); + } + + global_font[global_font_num]= font; + i= global_font_num; + global_font_num++; + return(i); } -int BLF_get(void) -{ - return(global_font_cur); -} - -void BLF_enable(int option) +void BLF_enable(int fontid, int option) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->flags |= option; } -void BLF_disable(int option) +void BLF_disable(int fontid, int option) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->flags &= ~option; } -void BLF_aspect(float aspect) +void BLF_enable_default(int option) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(global_font_default); + if (font) + font->flags |= option; +} + +void BLF_disable_default(int option) +{ + FontBLF *font; + + font= BLF_get(global_font_default); + if (font) + font->flags &= ~option; +} + +void BLF_aspect(int fontid, float aspect) +{ + FontBLF *font; + + font= BLF_get(fontid); if (font) font->aspect= aspect; } -void BLF_position(float x, float y, float z) +void BLF_position(int fontid, float x, float y, float z) { FontBLF *font; float remainder; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { remainder= x - floor(x); if (remainder > 0.4 && remainder < 0.6) { @@ -268,29 +343,26 @@ void BLF_position(float x, float y, float z) } } -void BLF_size(int size, int dpi) +void BLF_size(int fontid, int size, int dpi) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_size(font, size, dpi); } -void BLF_blur(int size) +void BLF_blur(int fontid, int size) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->blur= size; } void BLF_draw_default(float x, float y, float z, char *str) { - FontBLF *font; - int old_font=0, old_point=0, old_dpi=0; - if (!str) return; @@ -302,38 +374,21 @@ void BLF_draw_default(float x, float y, float z, char *str) return; } - font= global_font[global_font_cur]; - if (font) { - old_font= global_font_cur; - old_point= font->size; - old_dpi= font->dpi; - } - - global_font_cur= global_font_default; - BLF_size(global_font_points, global_font_dpi); - BLF_position(x, y, z); - BLF_draw(str); - - /* restore the old font. */ - if (font) { - global_font_cur= old_font; - BLF_size(old_point, old_dpi); - } + BLF_size(global_font_default, global_font_points, global_font_dpi); + BLF_position(global_font_default, x, y, z); + BLF_draw(global_font_default, str); } -void BLF_default_rotation(float angle) +void BLF_rotation_default(float angle) { - - if (global_font_default>=0) { - global_font[global_font_default]->angle= angle; - if(angle) - global_font[global_font_default]->flags |= BLF_ROTATION; - else - global_font[global_font_default]->flags &= ~BLF_ROTATION; - } + FontBLF *font; + + font= BLF_get(global_font_default); + if (font) + font->angle= angle; } -void BLF_draw(char *str) +void BLF_draw(int fontid, char *str) { FontBLF *font; @@ -341,7 +396,7 @@ void BLF_draw(char *str) * The pixmap alignment hack is handle * in BLF_position (old ui_rasterpos_safe). */ - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); @@ -362,39 +417,39 @@ void BLF_draw(char *str) } } -void BLF_boundbox(char *str, rctf *box) +void BLF_boundbox(int fontid, char *str, rctf *box) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_boundbox(font, str, box); } -void BLF_width_and_height(char *str, float *width, float *height) +void BLF_width_and_height(int fontid, char *str, float *width, float *height) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_width_and_height(font, str, width, height); } -float BLF_width(char *str) +float BLF_width(int fontid, char *str) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) return(blf_font_width(font, str)); return(0.0f); } -float BLF_fixed_width(void) +float BLF_fixed_width(int fontid) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) return(blf_font_fixed_width(font)); return(0.0f); @@ -402,9 +457,7 @@ float BLF_fixed_width(void) float BLF_width_default(char *str) { - FontBLF *font; float width; - int old_font=0, old_point=0, old_dpi=0; if (global_font_default == -1) global_font_default= blf_search("default"); @@ -414,30 +467,16 @@ float BLF_width_default(char *str) return(0.0f); } - font= global_font[global_font_cur]; - if (font) { - old_font= global_font_cur; - old_point= font->size; - old_dpi= font->dpi; - } - - global_font_cur= global_font_default; - BLF_size(global_font_points, global_font_dpi); - width= BLF_width(str); - - /* restore the old font. */ - if (font) { - global_font_cur= old_font; - BLF_size(old_point, old_dpi); - } + BLF_size(global_font_default, global_font_points, global_font_dpi); + width= BLF_width(global_font_default, str); return(width); } -float BLF_height(char *str) +float BLF_height(int fontid, char *str) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) return(blf_font_height(font, str)); return(0.0f); @@ -445,9 +484,7 @@ float BLF_height(char *str) float BLF_height_default(char *str) { - FontBLF *font; float height; - int old_font=0, old_point=0, old_dpi=0; if (global_font_default == -1) global_font_default= blf_search("default"); @@ -457,39 +494,25 @@ float BLF_height_default(char *str) return(0.0f); } - font= global_font[global_font_cur]; - if (font) { - old_font= global_font_cur; - old_point= font->size; - old_dpi= font->dpi; - } - - global_font_cur= global_font_default; - BLF_size(global_font_points, global_font_dpi); - height= BLF_height(str); - - /* restore the old font. */ - if (font) { - global_font_cur= old_font; - BLF_size(old_point, old_dpi); - } + BLF_size(global_font_default, global_font_points, global_font_dpi); + height= BLF_height(global_font_default, str); return(height); } -void BLF_rotation(float angle) +void BLF_rotation(int fontid, float angle) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->angle= angle; } -void BLF_clipping(float xmin, float ymin, float xmax, float ymax) +void BLF_clipping(int fontid, float xmin, float ymin, float xmax, float ymax) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->clip_rec.xmin= xmin; font->clip_rec.ymin= ymin; @@ -498,11 +521,24 @@ void BLF_clipping(float xmin, float ymin, float xmax, float ymax) } } -void BLF_shadow(int level, float r, float g, float b, float a) +void BLF_clipping_default(float xmin, float ymin, float xmax, float ymax) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(global_font_default); + if (font) { + font->clip_rec.xmin= xmin; + font->clip_rec.ymin= ymin; + font->clip_rec.xmax= xmax; + font->clip_rec.ymax= ymax; + } +} + +void BLF_shadow(int fontid, int level, float r, float g, float b, float a) +{ + FontBLF *font; + + font= BLF_get(fontid); if (font) { font->shadow= level; font->shadow_col[0]= r; @@ -512,22 +548,22 @@ void BLF_shadow(int level, float r, float g, float b, float a) } } -void BLF_shadow_offset(int x, int y) +void BLF_shadow_offset(int fontid, int x, int y) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->shadow_x= x; font->shadow_y= y; } } -void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch) +void BLF_buffer(int fontid, float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->b_fbuf= fbuf; font->b_cbuf= cbuf; @@ -537,11 +573,11 @@ void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h } } -void BLF_buffer_col(float r, float g, float b, float a) +void BLF_buffer_col(int fontid, float r, float g, float b, float a) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->b_col[0]= r; font->b_col[1]= g; @@ -550,11 +586,11 @@ void BLF_buffer_col(float r, float g, float b, float a) } } -void BLF_draw_buffer(char *str) +void BLF_draw_buffer(int fontid, char *str) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_buffer(font, str); } diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 5d623c61d34..e650586aa9c 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -36,14 +36,11 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_vec_types.h" #include "BKE_utildefines.h" #include "BLI_blenlib.h" -#include "BLI_linklist.h" /* linknode */ -#include "BLI_string.h" #include "BIF_gl.h" diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 98044b965e1..f7c5531f0ac 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -45,7 +45,6 @@ #include "BLI_blenlib.h" #include "BLI_linklist.h" /* linknode */ -#include "BLI_string.h" #include "BLI_math.h" #include "BIF_gl.h" @@ -151,8 +150,9 @@ void blf_font_draw(FontBLF *font, char *str) void blf_font_buffer(FontBLF *font, char *str) { - unsigned char *data, *cbuf; + unsigned char *cbuf; unsigned int c; + unsigned char b_col_char[3]; GlyphBLF *g, *g_prev; FT_Vector delta; FT_UInt glyph_index; @@ -160,14 +160,18 @@ void blf_font_buffer(FontBLF *font, char *str) int pen_x, pen_y, y, x, yb, diff; int i, has_kerning, st, chx, chy; - if (!font->glyph_cache) + if (!font->glyph_cache || (!font->b_fbuf && !font->b_cbuf)) return; - + i= 0; pen_x= (int)font->pos[0]; pen_y= (int)font->pos[1]; has_kerning= FT_HAS_KERNING(font->face); g_prev= NULL; + + b_col_char[0]= font->b_col[0] * 255; + b_col_char[1]= font->b_col[1] * 255; + b_col_char[2]= font->b_col[2] * 255; while (str[i]) { c= blf_utf8_next((unsigned char *)str, &i); @@ -217,28 +221,34 @@ void blf_font_buffer(FontBLF *font, char *str) else chy= pen_y + ((int)g->pos_y); - if (font->b_fbuf) { - if (chx >= 0 && chx < font->bw && pen_y >= 0 && pen_y < font->bh) { - if (g->pitch < 0) - yb= 0; - else - yb= g->height-1; + if ((chx + g->width) >= 0 && chx < font->bw && (pen_y + g->height) >= 0 && pen_y < font->bh) { + /* dont draw beyond the buffer bounds */ + int width_clip= g->width; + int height_clip= g->height; - for (y= 0; y < g->height; y++) { - for (x= 0; x < g->width; x++) { - fbuf= font->b_fbuf + font->bch * ((chx + x) + ((pen_y + y)*font->bw)); - data= g->bitmap + x + (yb * g->pitch); - a= data[0]/255.0f; + if (width_clip + chx > font->bw) width_clip -= chx + width_clip - font->bw; + if (height_clip + pen_y > font->bh) height_clip -= pen_y + height_clip - font->bh; - if (a == 1.0) { - fbuf[0]= font->b_col[0]; - fbuf[1]= font->b_col[1]; - fbuf[2]= font->b_col[2]; - } - else { - fbuf[0]= (font->b_col[0]*a) + (fbuf[0] * (1-a)); - fbuf[1]= (font->b_col[1]*a) + (fbuf[1] * (1-a)); - fbuf[2]= (font->b_col[2]*a) + (fbuf[2] * (1-a)); + yb= g->pitch < 0 ? 0 : g->height-1; + + if (font->b_fbuf) { + for (y=(chy >= 0 ? 0:-chy); y < height_clip; y++) { + for (x=(chx >= 0 ? 0:-chx); x < width_clip; x++) { + + a= *(g->bitmap + x + (yb * g->pitch)) / 255.0f; + + if(a > 0.0f) { + fbuf= font->b_fbuf + font->bch * ((chx + x) + ((pen_y + y)*font->bw)); + if (a >= 1.0f) { + fbuf[0]= font->b_col[0]; + fbuf[1]= font->b_col[1]; + fbuf[2]= font->b_col[2]; + } + else { + fbuf[0]= (font->b_col[0]*a) + (fbuf[0] * (1-a)); + fbuf[1]= (font->b_col[1]*a) + (fbuf[1] * (1-a)); + fbuf[2]= (font->b_col[2]*a) + (fbuf[2] * (1-a)); + } } } @@ -248,30 +258,24 @@ void blf_font_buffer(FontBLF *font, char *str) yb--; } } - } - if (font->b_cbuf) { - if (chx >= 0 && chx < font->bw && pen_y >= 0 && pen_y < font->bh) { - if (g->pitch < 0) - yb= 0; - else - yb= g->height-1; + if (font->b_cbuf) { + for (y= 0; y < height_clip; y++) { + for (x= 0; x < width_clip; x++) { + a= *(g->bitmap + x + (yb * g->pitch)) / 255.0f; - for (y= 0; y < g->height; y++) { - for (x= 0; x < g->width; x++) { - cbuf= font->b_cbuf + font->bch * ((chx + x) + ((pen_y + y)*font->bw)); - data= g->bitmap + x + (yb * g->pitch); - a= data[0]; - - if (a == 256) { - cbuf[0]= font->b_col[0]; - cbuf[1]= font->b_col[1]; - cbuf[2]= font->b_col[2]; - } - else { - cbuf[0]= (font->b_col[0]*a) + (cbuf[0] * (256-a)); - cbuf[1]= (font->b_col[1]*a) + (cbuf[1] * (256-a)); - cbuf[2]= (font->b_col[2]*a) + (cbuf[2] * (256-a)); + if(a > 0.0f) { + cbuf= font->b_cbuf + font->bch * ((chx + x) + ((pen_y + y)*font->bw)); + if (a >= 1.0f) { + cbuf[0]= b_col_char[0]; + cbuf[1]= b_col_char[1]; + cbuf[2]= b_col_char[2]; + } + else { + cbuf[0]= (b_col_char[0]*a) + (cbuf[0] * (1-a)); + cbuf[1]= (b_col_char[1]*a) + (cbuf[1] * (1-a)); + cbuf[2]= (b_col_char[2]*a) + (cbuf[2] * (1-a)); + } } } diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index f2f3f0ea4c4..0d694c28b2b 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -39,14 +39,9 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_vec_types.h" -#include "BKE_utildefines.h" - #include "BLI_blenlib.h" -#include "BLI_linklist.h" /* linknode */ -#include "BLI_string.h" #include "BIF_gl.h" #include "BLF_api.h" diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c index 5976a2c98a6..1baf2c82ef7 100644 --- a/source/blender/blenfont/intern/blf_lang.c +++ b/source/blender/blenfont/intern/blf_lang.c @@ -45,7 +45,6 @@ #include "BLI_linklist.h" /* linknode */ #include "BLI_string.h" -#include "BIF_gl.h" #ifdef __APPLE__ #include "BKE_utildefines.h" @@ -60,65 +59,19 @@ char global_messagepath[1024]; char global_language[32]; char global_encoding_name[32]; -#if defined(__APPLE__) -void BLF_lang_init(void) /* Apple Only, todo - use BLI_gethome_folder */ + +void BLF_lang_init(void) { - char *bundlepath; - - strcpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT); - - /* set messagepath directory */ -#ifndef LOCALEDIR -#define LOCALEDIR "/usr/share/locale" -#endif - - strcpy(global_messagepath, ".blender/locale"); - - if (!BLI_exist(global_messagepath)) { /* locale not in current dir */ - BLI_make_file_string("/", global_messagepath, BLI_gethome(), ".blender/locale"); - - if (!BLI_exist(global_messagepath)) { /* locale not in home dir */ - /* message catalogs are stored inside the application bundle */ - bundlepath= BLI_getbundle(); - strcpy(global_messagepath, bundlepath); - strcat(global_messagepath, "/Contents/Resources/locale"); - if (!BLI_exist(global_messagepath)) { /* locale not in bundle (now that's odd..) */ - strcpy(global_messagepath, LOCALEDIR); - - if (!BLI_exist(global_messagepath)) { /* locale not in LOCALEDIR */ - strcpy(global_messagepath, "message"); /* old compatibility as last */ - } - } - } - } -} -#elif defined(_WIN32) -void BLF_lang_init(void) /* Windows Only, todo - use BLI_gethome_folder */ -{ - strcpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT); + char *messagepath= BLI_get_folder(BLENDER_DATAFILES, "locale"); - strcpy(global_messagepath, ".blender/locale"); - - if (!BLI_exist(global_messagepath)) { /* locale not in current dir */ - BLI_make_file_string("/", global_messagepath, BLI_gethome(), ".blender/locale"); - - if (!BLI_exist(global_messagepath)) { /* locale not in home dir */ - BLI_make_file_string("/", global_messagepath, BLI_gethome(), "/locale"); - } - } -} -#else -void BLF_lang_init(void) /* not win or mac */ -{ - char *messagepath= BLI_gethome_folder("locale", BLI_GETHOME_ALL); + BLI_strncpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT, sizeof(global_encoding_name)); - if(messagepath) - strncpy(global_messagepath, messagepath, sizeof(global_messagepath)); + if (messagepath) + BLI_strncpy(global_messagepath, messagepath, sizeof(global_messagepath)); else global_messagepath[0]= '\0'; - } -#endif + void BLF_lang_set(const char *str) { diff --git a/source/blender/blenfont/intern/blf_util.c b/source/blender/blenfont/intern/blf_util.c index 319a837bbb6..30e6e3fd3f5 100644 --- a/source/blender/blenfont/intern/blf_util.c +++ b/source/blender/blenfont/intern/blf_util.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,8 +30,6 @@ #include <stdlib.h> #include <string.h> -#include "BIF_gl.h" - unsigned int blf_next_p2(unsigned int x) { diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 1440176f1d9..9ef4ffe52df 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -267,28 +267,28 @@ struct DerivedMesh { * passed as a float or short array, only one should be non-NULL. */ void (*foreachMappedVert)( - DerivedMesh *dm, - void (*func)(void *userData, int index, float *co, - float *no_f, short *no_s), - void *userData); + DerivedMesh *dm, + void (*func)(void *userData, int index, float *co, + float *no_f, short *no_s), + void *userData); /* Iterate over each mapped edge in the derived mesh, calling the * given function with the original edge and the mapped edge's new * coordinates. */ void (*foreachMappedEdge)(DerivedMesh *dm, - void (*func)(void *userData, int index, - float *v0co, float *v1co), - void *userData); + void (*func)(void *userData, int index, + float *v0co, float *v1co), + void *userData); /* Iterate over each mapped face in the derived mesh, calling the * given function with the original face and the mapped face's (or * faces') center and normal. */ void (*foreachMappedFaceCenter)(DerivedMesh *dm, - void (*func)(void *userData, int index, - float *cent, float *no), - void *userData); + void (*func)(void *userData, int index, + float *cent, float *no), + void *userData); /* Iterate over all vertex points, calling DO_MINMAX with given args. * @@ -329,7 +329,7 @@ struct DerivedMesh { * * Also called for *final* editmode DerivedMeshes */ - void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges); + void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges); /* Draw all loose edges (edges w/ no adjoining faces) */ void (*drawLooseEdges)(DerivedMesh *dm); @@ -342,7 +342,7 @@ struct DerivedMesh { * Also called for *final* editmode DerivedMeshes */ void (*drawFacesSolid)(DerivedMesh *dm, float (*partial_redraw_planes)[4], - int fast, int (*setMaterial)(int, void *attribs)); + int fast, int (*setMaterial)(int, void *attribs)); /* Draw all faces * o If useTwoSided, draw front and back using col arrays @@ -350,7 +350,7 @@ struct DerivedMesh { * in ABGR format, and should be passed as per-face vertex color. */ void (*drawFacesColored)(DerivedMesh *dm, int useTwoSided, - unsigned char *col1, unsigned char *col2); + unsigned char *col1, unsigned char *col2); /* Draw all faces using MTFace * o Drawing options too complicated to enumerate, look at code. @@ -380,17 +380,17 @@ struct DerivedMesh { * smooth shaded. */ void (*drawMappedFaces)(DerivedMesh *dm, - int (*setDrawOptions)(void *userData, int index, - int *drawSmooth_r), - void *userData, int useColors); + int (*setDrawOptions)(void *userData, int index, + int *drawSmooth_r), + void *userData, int useColors); /* Draw mapped faces using MTFace * o Drawing options too complicated to enumerate, look at code. */ void (*drawMappedFacesTex)(DerivedMesh *dm, - int (*setDrawOptions)(void *userData, - int index), - void *userData); + int (*setDrawOptions)(void *userData, + int index), + void *userData); /* Draw mapped faces with GLSL materials * o setMaterial is called for every different material nr @@ -406,8 +406,8 @@ struct DerivedMesh { * returns true */ void (*drawMappedEdges)(DerivedMesh *dm, - int (*setDrawOptions)(void *userData, int index), - void *userData); + int (*setDrawOptions)(void *userData, int index), + void *userData); /* Draw mapped edges as lines with interpolation values * o Only if !setDrawOptions or @@ -417,12 +417,12 @@ struct DerivedMesh { * NOTE: This routine is optional! */ void (*drawMappedEdgesInterp)(DerivedMesh *dm, - int (*setDrawOptions)(void *userData, - int index), - void (*setDrawInterpOptions)(void *userData, - int index, - float t), - void *userData); + int (*setDrawOptions)(void *userData, + int index), + void (*setDrawInterpOptions)(void *userData, + int index, + float t), + void *userData); /* Release reference to the DerivedMesh. This function decides internally * if the DerivedMesh will be freed, or cached for later use. */ @@ -445,8 +445,8 @@ void DM_init(DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, * of vertices, edges and faces, with a layer setup copied from source */ void DM_from_template(DerivedMesh *dm, DerivedMesh *source, - DerivedMeshType type, - int numVerts, int numEdges, int numFaces, + DerivedMeshType type, + int numVerts, int numEdges, int numFaces, int numLoops, int numPolys); /* utility function to release a DerivedMesh's layers @@ -474,13 +474,13 @@ void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask); * freed, see BKE_customdata.h for the different options */ void DM_add_vert_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); + void *layer); void DM_add_edge_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); + void *layer); void DM_add_tessface_layer(struct DerivedMesh *dm, int type, int alloctype, void *layer); void DM_add_face_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); + void *layer); /* custom data access functions * return pointer to data from first layer which matches type @@ -514,15 +514,15 @@ void DM_set_face_data(struct DerivedMesh *dm, int index, int type, void *data); * these copy all layers for which the CD_FLAG_NOCOPY flag is not set */ void DM_copy_vert_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); + int source_index, int dest_index, int count); void DM_copy_edge_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); + int source_index, int dest_index, int count); void DM_copy_tessface_data(struct DerivedMesh *source, struct DerivedMesh *dest, int source_index, int dest_index, int count); void DM_copy_loop_data(struct DerivedMesh *source, struct DerivedMesh *dest, int source_index, int dest_index, int count); void DM_copy_face_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); + int source_index, int dest_index, int count); /* custom data free functions * free count elements, starting at index @@ -542,8 +542,8 @@ void DM_DupPolys(DerivedMesh *source, DerivedMesh *target); * indexed by dest_index in the dest mesh */ void DM_interp_vert_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, float *weights, - int count, int dest_index); + int *src_indices, float *weights, + int count, int dest_index); /* interpolates edge data from the edges indexed by src_indices in the * source mesh using the given weights and stores the result in the edge indexed @@ -554,9 +554,9 @@ void DM_interp_vert_data(struct DerivedMesh *source, struct DerivedMesh *dest, */ typedef float EdgeVertWeight[SUB_ELEMS_EDGE][SUB_ELEMS_EDGE]; void DM_interp_edge_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, - float *weights, EdgeVertWeight *vert_weights, - int count, int dest_index); + int *src_indices, + float *weights, EdgeVertWeight *vert_weights, + int count, int dest_index); /* interpolates face data from the faces indexed by src_indices in the * source mesh using the given weights and stores the result in the face indexed @@ -567,11 +567,11 @@ void DM_interp_edge_data(struct DerivedMesh *source, struct DerivedMesh *dest, */ typedef float FaceVertWeight[SUB_ELEMS_FACE][SUB_ELEMS_FACE]; void DM_interp_tessface_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, - float *weights, FaceVertWeight *vert_weights, - int count, int dest_index); + int *src_indices, + float *weights, FaceVertWeight *vert_weights, + int count, int dest_index); -void DM_swap_tessface_data(struct DerivedMesh *dm, int index, int *corner_indices); +void DM_swap_tessface_data(struct DerivedMesh *dm, int index, const int *corner_indices); void DM_interp_loop_data(struct DerivedMesh *source, struct DerivedMesh *dest, int *src_indices, @@ -591,14 +591,14 @@ float *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob); /* */ DerivedMesh *mesh_get_derived_final(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); + CustomDataMask dataMask); DerivedMesh *mesh_get_derived_deform(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); + CustomDataMask dataMask); DerivedMesh *mesh_create_derived_for_modifier(struct Scene *scene, struct Object *ob, struct ModifierData *md); DerivedMesh *mesh_create_derived_render(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); + CustomDataMask dataMask); DerivedMesh *getEditDerivedBMesh(struct BMEditMesh *em, struct Object *ob, float (*vertexCos)[3]); @@ -607,29 +607,29 @@ DerivedMesh *mesh_create_derived_index_render(struct Scene *scene, struct Object /* same as above but wont use render settings */ DerivedMesh *mesh_create_derived_view(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); + CustomDataMask dataMask); DerivedMesh *mesh_create_derived_no_deform(struct Scene *scene, struct Object *ob, - float (*vertCos)[3], - CustomDataMask dataMask); + float (*vertCos)[3], + CustomDataMask dataMask); DerivedMesh *mesh_create_derived_no_deform_render(struct Scene *scene, struct Object *ob, - float (*vertCos)[3], - CustomDataMask dataMask); + float (*vertCos)[3], + CustomDataMask dataMask); /* for gameengine */ DerivedMesh *mesh_create_derived_no_virtual(struct Scene *scene, struct Object *ob, float (*vertCos)[3], - CustomDataMask dataMask); + CustomDataMask dataMask); DerivedMesh *editbmesh_get_derived_base(struct Object *, struct BMEditMesh *em); DerivedMesh *editbmesh_get_derived_cage(struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask); DerivedMesh *editbmesh_get_derived_cage_and_final(struct Scene *scene, struct Object *, struct BMEditMesh *em, DerivedMesh **final_r, - CustomDataMask dataMask); + CustomDataMask dataMask); void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *em, CustomDataMask dataMask); /* returns an array of deform matrices for crazyspace correction, and the number of modifiers left */ int editbmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct BMEditMesh *em, - float (**deformmats)[3][3], float (**deformcos)[3]); + float (**deformmats)[3][3], float (**deformcos)[3]); void weight_to_rgb(float input, float *fr, float *fg, float *fb); @@ -664,5 +664,8 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, void DM_add_tangent_layer(DerivedMesh *dm); +/* Set object's bounding box based on DerivedMesh min/max data */ +void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm); + #endif diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 1b38e276ca4..4d3f000c863 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -105,6 +105,9 @@ struct bActionGroup *get_active_actiongroup(struct bAction *act); /* Make the given Action Group the active one */ void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select); +/* Add a new action group with the given name to the action */ +struct bActionGroup *action_groups_add_new(struct bAction *act, const char name[]); + /* Add given channel into (active) group */ void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve); @@ -129,6 +132,13 @@ void free_pose_channel(struct bPoseChannel *pchan); */ void free_pose_channels(struct bPose *pose); +/** + * Removes the hash for quick lookup of channels, must + * be done when adding/removing channels. + */ +void make_pose_channels_hash(struct bPose *pose); +void free_pose_channels_hash(struct bPose *pose); + /** * Removes and deallocates all data from a pose, and also frees the pose. */ diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h index 79b4d50586a..aae2be14f1f 100644 --- a/source/blender/blenkernel/BKE_anim.h +++ b/source/blender/blenkernel/BKE_anim.h @@ -63,7 +63,7 @@ void animviz_calc_motionpaths(struct Scene *scene, ListBase *targets); void free_path(struct Path *path); void calc_curvepath(struct Object *ob); int interval_test(int min, int max, int p1, int cycl); -int where_on_path(struct Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius); +int where_on_path(struct Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius, float *weight); /* ---------------------------------------------------- */ /* Dupli-Geometry */ diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index f6950ba07b8..af5e31b1efa 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -71,7 +71,7 @@ void BKE_animdata_make_local(struct AnimData *adt); struct KeyingSet *BKE_keyingset_add(struct ListBase *list, const char name[], short flag, short keyingflag); /* Add a path to a KeyingSet */ -void BKE_keyingset_add_path(struct KeyingSet *ks, struct ID *id, const char group_name[], const char rna_path[], int array_index, short flag, short groupmode); +struct KS_Path *BKE_keyingset_add_path(struct KeyingSet *ks, struct ID *id, const char group_name[], const char rna_path[], int array_index, short flag, short groupmode); /* Find the destination matching the criteria given */ struct KS_Path *BKE_keyingset_find_path(struct KeyingSet *ks, struct ID *id, const char group_name[], const char rna_path[], int array_index, int group_mode); @@ -79,6 +79,9 @@ struct KS_Path *BKE_keyingset_find_path(struct KeyingSet *ks, struct ID *id, con /* Copy all KeyingSets in the given list */ void BKE_keyingsets_copy(struct ListBase *newlist, struct ListBase *list); +/* Free the given Keying Set path */ +void BKE_keyingset_free_path(struct KeyingSet *ks, struct KS_Path *ksp); + /* Free data for KeyingSet but not set itself */ void BKE_keyingset_free(struct KeyingSet *ks); @@ -89,7 +92,7 @@ void BKE_keyingsets_free(struct ListBase *list); /* Path Fixing API */ /* Fix all the paths for the given ID+AnimData */ -void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, char *prefix, char *oldName, char *newName); +void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths); /* Fix all the paths for the entire database... */ void BKE_all_animdata_fix_paths_rename(char *prefix, char *oldName, char *newName); diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h index 7e3d7f2a2ce..2c661a74573 100644 --- a/source/blender/blenkernel/BKE_armature.h +++ b/source/blender/blenkernel/BKE_armature.h @@ -81,7 +81,7 @@ void make_local_armature(struct bArmature *arm); struct bArmature *copy_armature(struct bArmature *arm); void bone_flip_name (char *name, int strip_number); -void bone_autoside_name (char *name, int strip_number, short axis, float head, float tail); +int bone_autoside_name (char *name, int strip_number, short axis, float head, float tail); struct Bone *get_named_bone (struct bArmature *arm, const char *name); diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 229a573a9bd..34e8fb420c9 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -43,9 +43,9 @@ struct bContext; struct ReportList; struct Scene; struct Main; - + #define BLENDER_VERSION 252 -#define BLENDER_SUBVERSION 0 +#define BLENDER_SUBVERSION 5 #define BLENDER_MINVERSION 250 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_bmesh.h b/source/blender/blenkernel/BKE_bmesh.h index f8e556ab43f..b6c39697428 100644 --- a/source/blender/blenkernel/BKE_bmesh.h +++ b/source/blender/blenkernel/BKE_bmesh.h @@ -219,11 +219,11 @@ typedef struct BME_TransData { void *loc; /* a pointer to the data to transform (likely the vert's cos) */ float factor; /* primary scaling factor; also accumulates number of weighted edges for beveling tool */ float weight; /* another scaling factor; used primarily for propogating vertex weights to transforms; */ - /* weight is also used across recursive bevels to help with the math */ + /* weight is also used across recursive bevels to help with the math */ float maxfactor; /* the unscaled, original factor (used only by "edge verts" in recursive beveling) */ float *max; /* the maximum distance this vert can be transformed; negative is infinite - * it points to the "parent" maxfactor (where maxfactor makes little sense) - * where the max limit is stored (limits are stored per-corner) */ + * it points to the "parent" maxfactor (where maxfactor makes little sense) + * where the max limit is stored (limits are stored per-corner) */ } BME_TransData; typedef struct BME_TransData_Head { diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index fcc636215c9..6a209167f93 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -84,5 +84,15 @@ unsigned int *brush_gen_texture_cache(struct Brush *br, int half_side); void brush_radial_control_invoke(struct wmOperator *op, struct Brush *br, float size_weight); int brush_radial_control_exec(struct wmOperator *op, struct Brush *br, float size_weight); +/* unified strength and size */ +int sculpt_get_brush_size(struct Brush *brush); +void sculpt_set_brush_size(struct Brush *brush, int size); +int sculpt_get_lock_brush_size(struct Brush *brush); +float sculpt_get_brush_unprojected_radius(struct Brush *brush); +void sculpt_set_brush_unprojected_radius(struct Brush *brush, float unprojected_radius); +float sculpt_get_brush_alpha(struct Brush *brush); +void sculpt_set_brush_alpha(struct Brush *brush, float alpha); + + #endif diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h index 44d3995cffd..25ffcb53144 100644 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ b/source/blender/blenkernel/BKE_cdderivedmesh.h @@ -62,6 +62,16 @@ struct DerivedMesh *CDDM_from_editmesh(struct EditMesh *em, struct Mesh *me); /* creates a CDDerivedMesh from the given BMEditMesh */ DerivedMesh *CDDM_from_BMEditMesh(struct BMEditMesh *em, struct Mesh *me); +/* creates a CDDerivedMesh from the given curve object */ +struct DerivedMesh *CDDM_from_curve(struct Object *ob); + +/* creates a CDDerivedMesh from the given curve object and specified dispbase */ +/* useful for OrcoDM creation for curves with constructive modifiers */ +DerivedMesh *CDDM_from_curve_customDB(struct Object *ob, struct ListBase *dispbase); + +struct BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, struct BMEditMesh *existing); + + /* Copies the given DerivedMesh with verts, faces & edges stored as * custom element data. */ diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index a8a0d7daa89..d8b3fcfd0bb 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -126,6 +126,7 @@ typedef struct ClothVertex float mass; /* mass / weight of the vertex */ float goal; /* goal, from SB */ float impulse[3]; /* used in collision.c */ + float *xrest; /* temporary valid for building springs */ unsigned int impulse_count; /* same as above */ float avg_spring_len; /* average length of connected springs */ float struct_stiff; @@ -240,6 +241,7 @@ void cloth_init ( ClothModifierData *clmd ); DerivedMesh *clothModifier_do ( ClothModifierData *clmd, struct Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc ); void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int totface ); +int cloth_uses_vgroup(ClothModifierData *clmd); // needed for collision.c void bvhtree_update_from_cloth ( ClothModifierData *clmd, int moving ); diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h index 689fa96ffa6..91c5eb4afee 100644 --- a/source/blender/blenkernel/BKE_collision.h +++ b/source/blender/blenkernel/BKE_collision.h @@ -49,12 +49,13 @@ #include "BLI_kdopbvh.h" +struct Cloth; +struct ClothModifierData; +struct DerivedMesh; +struct Group; +struct MFace; struct Object; struct Scene; -struct Cloth; -struct MFace; -struct DerivedMesh; -struct ClothModifierData; //////////////////////////////////////// // used for collisions in collision.c @@ -139,7 +140,7 @@ void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3], ///////////////////////////////////////////////// // used in effect.c ///////////////////////////////////////////////// -Object **get_collisionobjects(struct Scene *scene, Object *self, int *numcollobj); +struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, int *numcollobj); typedef struct ColliderCache { struct ColliderCache *next, *prev; @@ -147,7 +148,7 @@ typedef struct ColliderCache { struct CollisionModifierData *collmd; } ColliderCache; -struct ListBase *get_collider_cache(struct Scene *scene, Object *self); +struct ListBase *get_collider_cache(struct Scene *scene, struct Object *self, struct Group *group); void free_collider_cache(struct ListBase **colliders); ///////////////////////////////////////////////// diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h index 3e1d4fe927b..1f2dee6dcfc 100644 --- a/source/blender/blenkernel/BKE_colortools.h +++ b/source/blender/blenkernel/BKE_colortools.h @@ -31,7 +31,7 @@ struct CurveMapping; struct CurveMap; -struct Histogram; +struct Scopes; struct ImBuf; struct rctf; @@ -45,13 +45,6 @@ struct rctf; # define DO_INLINE static inline #endif -typedef enum CurveMappingPreset { - CURVE_PRESET_LINE, - CURVE_PRESET_SHARP, - CURVE_PRESET_SMOOTH, - CURVE_PRESET_MAX -} CurveMappingPreset; - void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w); void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w); @@ -62,7 +55,7 @@ void curvemapping_set_black_white(struct CurveMapping *cumap, float *black, f void curvemap_remove(struct CurveMap *cuma, int flag); void curvemap_insert(struct CurveMap *cuma, float x, float y); -void curvemap_reset(struct CurveMap *cuma, struct rctf *clipr, CurveMappingPreset preset); +void curvemap_reset(struct CurveMap *cuma, struct rctf *clipr, int preset); void curvemap_sethandle(struct CurveMap *cuma, int type); void curvemapping_changed(struct CurveMapping *cumap, int rem_doubles); @@ -81,7 +74,9 @@ void curvemapping_initialize(struct CurveMapping *cumap); void curvemapping_table_RGBA(struct CurveMapping *cumap, float **array, int *size); void colorcorrection_do_ibuf(struct ImBuf *ibuf, const char *profile); -void histogram_update(struct Histogram *hist, struct ImBuf *ibuf); +void scopes_update(struct Scopes *scopes, struct ImBuf *ibuf, int use_color_management); +void scopes_free(struct Scopes *scopes); +void scopes_new(struct Scopes *scopes); #endif diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index 9c5e89bff76..64e9636cae7 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -122,7 +122,7 @@ bConstraintTypeInfo *get_constraint_typeinfo(int type); void unique_constraint_name(struct bConstraint *con, struct ListBase *list); void free_constraints(struct ListBase *list); -void copy_constraints(struct ListBase *dst, const struct ListBase *src); +void copy_constraints(struct ListBase *dst, const struct ListBase *src, int do_extern); void relink_constraints(struct ListBase *list); void id_loop_constraints(struct ListBase *list, ConstraintIDFunc func, void *userdata); void free_constraint_data(struct bConstraint *con); @@ -130,7 +130,8 @@ void free_constraint_data(struct bConstraint *con); /* Constraint API function prototypes */ struct bConstraint *constraints_get_active(struct ListBase *list); void constraints_set_active(ListBase *list, struct bConstraint *con); - +struct bConstraint *constraints_findByName(struct ListBase *list, const char *name); + struct bConstraint *add_ob_constraint(struct Object *ob, const char *name, short type); struct bConstraint *add_pose_constraint(struct Object *ob, struct bPoseChannel *pchan, const char *name, short type); diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index ae3fdb91edf..f6d41190c5a 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -167,14 +167,20 @@ void CTX_wm_menu_set(bContext *C, struct ARegion *menu); /* Data Context - listbases consist of CollectionPointerLink items and must be - freed with BLI_freelistN! + freed with BLI_freelistN! - the dir listbase consits of LinkData items */ +/* data type, needed so we can tell between a NULL pointer and an empty list */ +enum { + CTX_DATA_TYPE_POINTER = 0, + CTX_DATA_TYPE_COLLECTION +}; + PointerRNA CTX_data_pointer_get(const bContext *C, const char *member); PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type); ListBase CTX_data_collection_get(const bContext *C, const char *member); ListBase CTX_data_dir_get(const bContext *C); -int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb); +int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb, short *r_type); void CTX_data_id_pointer_set(bContextDataResult *result, struct ID *id); void CTX_data_pointer_set(bContextDataResult *result, struct ID *id, StructRNA *type, void *data); @@ -184,6 +190,9 @@ void CTX_data_list_add(bContextDataResult *result, struct ID *id, StructRNA *typ void CTX_data_dir_set(bContextDataResult *result, const char **member); +void CTX_data_type_set(struct bContextDataResult *result, short type); +short CTX_data_type_get(struct bContextDataResult *result); + int CTX_data_equals(const char *member, const char *str); int CTX_data_dir(const char *member); diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 5fb44c52307..ca45c2f318c 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -40,12 +40,12 @@ struct ListBase; struct BezTriple; struct BevList; -#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (((nu)->flagu & CU_CYCLIC) ? (nu->orderu-1) : 0) ) -#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (((nu)->flagv & CU_CYCLIC) ? (nu->orderv-1) : 0) ) +#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (((nu)->flagu & CU_NURB_CYCLIC) ? (nu->orderu-1) : 0) ) +#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (((nu)->flagv & CU_NURB_CYCLIC) ? (nu->orderv-1) : 0) ) /* Non cyclic nurbs have 1 less segment */ -#define SEGMENTSU(nu) ( ((nu)->flagu & CU_CYCLIC) ? (nu)->pntsu : (nu)->pntsu-1 ) -#define SEGMENTSV(nu) ( ((nu)->flagv & CU_CYCLIC) ? (nu)->pntsv : (nu)->pntsv-1 ) +#define SEGMENTSU(nu) ( ((nu)->flagu & CU_NURB_CYCLIC) ? (nu)->pntsu : (nu)->pntsu-1 ) +#define SEGMENTSV(nu) ( ((nu)->flagv & CU_NURB_CYCLIC) ? (nu)->pntsv : (nu)->pntsv-1 ) #define CU_DO_TILT(cu, nu) (((nu->flag & CU_2D) && (cu->flag & CU_3D)==0) ? 0 : 1) #define CU_DO_RADIUS(cu, nu) ((CU_DO_TILT(cu, nu) || cu->bevobj || cu->ext1!=0.0 || cu->ext2!=0.0) ? 1:0) @@ -72,11 +72,11 @@ void minmaxNurb( struct Nurb *nu, float *min, float *max); void makeknots( struct Nurb *nu, short uv); void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride); -void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu, int stride); +void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride); void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride); float *make_orco_curve(struct Scene *scene, struct Object *ob); float *make_orco_surf( struct Object *ob); -void makebevelcurve(struct Scene *scene, struct Object *ob, struct ListBase *disp); +void makebevelcurve(struct Scene *scene, struct Object *ob, struct ListBase *disp, int forRender); void makeBevelList( struct Object *ob); @@ -89,6 +89,9 @@ void sethandlesNurb(ListBase *editnurb, short code); void switchdirectionNurb( struct Nurb *nu); +void addNurbPoints(struct Nurb *nu, int number); +void addNurbPointsBezier(struct Nurb *nu, int number); + float (*curve_getVertexCos(struct Curve *cu, struct ListBase *lb, int *numVerts_r))[3]; void curve_applyVertexCos(struct Curve *cu, struct ListBase *lb, float (*vertexCos)[3]); diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 7d4bae20ba5..ae38d4b4a41 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -61,7 +61,7 @@ extern const CustomDataMask CD_MASK_FACECORNERS; #define CD_DEFAULT 2 /* allocate and set to default */ #define CD_REFERENCE 3 /* use data pointers, set layer flag NOFREE */ #define CD_DUPLICATE 4 /* do a full copy of all layers, only allowed if source - has same number of elements */ + has same number of elements */ /* Checks if the layer at physical offset layern (in data->layers) support math * the below operations. @@ -86,12 +86,12 @@ void CustomData_data_add(int type, void *data1, void *data2); * mask is a bitfield where (mask & (1 << (layer type))) indicates * if a layer should be copied or not. alloctype must be one of the above. */ void CustomData_copy(const struct CustomData *source, struct CustomData *dest, - CustomDataMask mask, int alloctype, int totelem); + CustomDataMask mask, int alloctype, int totelem); /* same as the above, except that this will preserve existing layers, and only * add the layers that were not there yet */ void CustomData_merge(const struct CustomData *source, struct CustomData *dest, - CustomDataMask mask, int alloctype, int totelem); + CustomDataMask mask, int alloctype, int totelem); /*bmesh version of CustomData_merge; merges the layouts of source and dest, then goes through the mesh and makes sure all the customdata blocks are @@ -114,10 +114,10 @@ void CustomData_free_temporary(struct CustomData *data, int totelem); * in editmode, use EM_add_data_layer instead of this function */ void *CustomData_add_layer(struct CustomData *data, int type, int alloctype, - void *layer, int totelem); + void *layer, int totelem); /*same as above but accepts a name */ void *CustomData_add_layer_named(struct CustomData *data, int type, int alloctype, - void *layer, int totelem, char *name); + void *layer, int totelem, char *name); /* frees the active or first data layer with the give type. * returns 1 on succes, 0 if no layer with the given type is found @@ -146,14 +146,14 @@ int CustomData_number_of_layers(const struct CustomData *data, int type); * returns the layer data */ void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type); void *CustomData_duplicate_referenced_layer_named(struct CustomData *data, - int type, char *name); + int type, char *name); /* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is * zero for the layer type, so only layer types specified by the mask * will be copied */ void CustomData_set_only_copy(const struct CustomData *data, - CustomDataMask mask); + CustomDataMask mask); /* copies data from one CustomData object to another * objects need not be compatible, each source layer is copied to the @@ -161,12 +161,12 @@ void CustomData_set_only_copy(const struct CustomData *data, * return 1 on success, 0 on failure */ void CustomData_copy_data(const struct CustomData *source, - struct CustomData *dest, int source_index, - int dest_index, int count); + struct CustomData *dest, int source_index, + int dest_index, int count); void CustomData_copy_elements(int type, void *source, void *dest, int count); void CustomData_em_copy_data(const struct CustomData *source, - struct CustomData *dest, void *src_block, - void **dest_block); + struct CustomData *dest, void *src_block, + void **dest_block); void CustomData_bmesh_copy_data(const struct CustomData *source, struct CustomData *dest, void *src_block, void **dest_block); @@ -191,11 +191,11 @@ void CustomData_free_elem(struct CustomData *data, int index, int count); * returns 1 on success, 0 on failure */ void CustomData_interp(const struct CustomData *source, struct CustomData *dest, - int *src_indices, float *weights, float *sub_weights, - int count, int dest_index); + int *src_indices, float *weights, float *sub_weights, + int count, int dest_index); void CustomData_em_interp(struct CustomData *data, void **src_blocks, - float *weights, float *sub_weights, int count, - void *dest_block); + float *weights, float *sub_weights, int count, + void *dest_block); void CustomData_bmesh_interp(struct CustomData *data, void **src_blocks, float *weights, float *sub_weights, int count, void *dest_block); @@ -204,7 +204,7 @@ void CustomData_bmesh_interp(struct CustomData *data, void **src_blocks, /* swaps the data in the element corners, to new corners with indices as specified in corner_indices. for edges this is an array of length 2, for faces an array of length 4 */ -void CustomData_swap(struct CustomData *data, int index, int *corner_indices); +void CustomData_swap(struct CustomData *data, int index, const int *corner_indices); /* gets a pointer to the data element at index from the first layer of type * returns NULL if there is no layer of type @@ -226,7 +226,7 @@ void *CustomData_bmesh_get_layer_n(const struct CustomData *data, void *block, i void *CustomData_get_layer(const struct CustomData *data, int type); void *CustomData_get_layer_n(const struct CustomData *data, int type, int n); void *CustomData_get_layer_named(const struct CustomData *data, int type, - char *name); + char *name); int CustomData_get_layer_index(const struct CustomData *data, int type); int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n); int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name); @@ -244,11 +244,11 @@ int CustomData_get_stencil_layer(const struct CustomData *data, int type); * no effect if there is no layer of type */ void CustomData_set(const struct CustomData *data, int index, int type, - void *source); + void *source); void CustomData_em_set(struct CustomData *data, void *block, int type, - void *source); + void *source); void CustomData_em_set_n(struct CustomData *data, void *block, int type, int n, - void *source); + void *source); void CustomData_bmesh_set(const struct CustomData *data, void *block, int type, void *source); @@ -292,9 +292,9 @@ void CustomData_bmesh_free_block(struct CustomData *data, void **block); /* copy custom data to/from layers as in mesh/derivedmesh, to editmesh blocks of data. the CustomData's must not be compatible */ void CustomData_to_em_block(const struct CustomData *source, - struct CustomData *dest, int index, void **block); + struct CustomData *dest, int index, void **block); void CustomData_from_em_block(const struct CustomData *source, - struct CustomData *dest, void *block, int index); + struct CustomData *dest, void *block, int index); void CustomData_to_bmesh_block(const struct CustomData *source, struct CustomData *dest, int src_index, void **dest_block); void CustomData_from_bmesh_block(const struct CustomData *source, @@ -333,6 +333,8 @@ void CustomData_external_write(struct CustomData *data, struct ID *id, CustomDataMask mask, int totelem, int free); void CustomData_external_read(struct CustomData *data, struct ID *id, CustomDataMask mask, int totelem); +void CustomData_external_reload(struct CustomData *data, + struct ID *id, CustomDataMask mask, int totelem); #endif diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index a250456f5c1..df0627f61ba 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -62,13 +62,14 @@ struct Material; struct Bone; struct Mesh; struct EditMesh; +struct DerivedMesh; /* used for curves, nurbs, mball, importing */ typedef struct DispList { - struct DispList *next, *prev; - short type, flag; - int parts, nr; - short col, rt; /* rt used by initrenderNurbs */ + struct DispList *next, *prev; + short type, flag; + int parts, nr; + short col, rt; /* rt used by initrenderNurbs */ float *verts, *nors; int *index; unsigned int *col1, *col2; @@ -87,20 +88,26 @@ extern void count_displist(struct ListBase *lb, int *totvert, int *totface); extern void freedisplist(struct ListBase *lb); extern int displist_has_faces(struct ListBase *lb); -extern void makeDispListSurf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, int forRender, int forOrco); +extern void makeDispListSurf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forRender, int forOrco); extern void makeDispListCurveTypes(struct Scene *scene, struct Object *ob, int forOrco); +extern void makeDispListCurveTypes_forRender(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, struct DerivedMesh **derivedFinal, int forOrco); +extern void makeDispListCurveTypes_forOrco(struct Scene *scene, struct Object *ob, struct ListBase *dispbase); extern void makeDispListMBall(struct Scene *scene, struct Object *ob); +extern void makeDispListMBall_forRender(struct Scene *scene, struct Object *ob, struct ListBase *dispbase); extern void shadeDispList(struct Scene *scene, struct Base *base); extern void shadeMeshMCol(struct Scene *scene, struct Object *ob, struct Mesh *me); int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4); void imagestodisplist(void); void reshadeall_displist(struct Scene *scene); -void filldisplist(struct ListBase *dispbase, struct ListBase *to); +void filldisplist(struct ListBase *dispbase, struct ListBase *to, int flipnormal); void fastshade_free_render(void); float calc_taper(struct Scene *scene, struct Object *taperobj, int cur, int tot); +/* add Orco layer to the displist object which has got derived mesh and return orco */ +float *makeOrcoDispList(struct Scene *scene, struct Object *ob, struct DerivedMesh *derivedFinal, int forRender); + #endif diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index 9df6bfdbe7c..835e2ed80c8 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -158,6 +158,7 @@ FModifierTypeInfo *get_fmodifier_typeinfo(int type); /* ---------------------- */ struct FModifier *add_fmodifier(ListBase *modifiers, int type); +struct FModifier *copy_fmodifier(struct FModifier *src); void copy_fmodifiers(ListBase *dst, ListBase *src); int remove_fmodifier(ListBase *modifiers, struct FModifier *fcm); int remove_fmodifier_index(ListBase *modifiers, int index); @@ -186,6 +187,8 @@ void copy_fcurves(ListBase *dst, ListBase *src); /* find matching F-Curve in the given list of F-Curves */ struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int array_index); +struct FCurve *iter_step_fcurve (struct FCurve *fcu_iter, const char rna_path[]); + /* high level function to get an fcurve from C without having the rna */ struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, char *prop_name, int index); diff --git a/source/blender/blenkernel/BKE_fluidsim.h b/source/blender/blenkernel/BKE_fluidsim.h index d99e7b42cff..e730f4ec34c 100644 --- a/source/blender/blenkernel/BKE_fluidsim.h +++ b/source/blender/blenkernel/BKE_fluidsim.h @@ -30,32 +30,21 @@ #ifndef BKE_FLUIDSIM_H #define BKE_FLUIDSIM_H + struct Object; struct Scene; struct FluidsimModifierData; +struct FluidsimSettings; struct DerivedMesh; struct MVert; /* old interface */ -struct FluidsimSettings *fluidsimSettingsNew(struct Object *srcob); void initElbeemMesh(struct Scene *scene, struct Object *ob, int *numVertices, float **vertices, int *numTriangles, int **triangles, int useGlobalCoords, int modifierIndex); -/* new fluid-modifier interface */ -void fluidsim_init(struct FluidsimModifierData *fluidmd); -void fluidsim_free(struct FluidsimModifierData *fluidmd); - -struct DerivedMesh *fluidsim_read_cache(struct Object *ob, struct DerivedMesh *orgdm, - struct FluidsimModifierData *fluidmd, int framenr, int useRenderParams); -void fluidsim_read_vel_cache(struct FluidsimModifierData *fluidmd, struct DerivedMesh *dm, - char *filename); -struct DerivedMesh *fluidsimModifier_do(struct FluidsimModifierData *fluidmd, - struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, - int useRenderParams, int isFinalCalc); - /* bounding box & memory estimate */ void fluid_get_bb(struct MVert *mvert, int totvert, float obmat[][4], float start[3], float size[3]); diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 6084b0cfb73..6a602339e11 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -83,9 +83,6 @@ typedef struct Global { struct VFont *selfont; struct ListBase ttfdata; - /* libtiff flag used to determine if shared library loaded for libtiff*/ - int have_libtiff; - /* this variable is written to / read from FileGlobal->fileflags */ int fileflags; @@ -106,7 +103,7 @@ typedef struct Global { #define G_RENDER_OGL (1 << 0) #define G_SWAP_EXCHANGE (1 << 1) /* also uses G_FILE_AUTOPLAY */ -#define G_RENDER_SHADOW (1 << 3) +/* #define G_RENDER_SHADOW (1 << 3) */ /* temp flag, removed */ #define G_BACKBUFSEL (1 << 4) #define G_PICKSEL (1 << 5) diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h index d1491cc1616..e63e3c93f1e 100644 --- a/source/blender/blenkernel/BKE_group.h +++ b/source/blender/blenkernel/BKE_group.h @@ -31,6 +31,7 @@ #ifndef BKE_GROUP_H #define BKE_GROUP_H +struct Base; struct Group; struct GroupObject; struct Object; diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h index 9634b872e91..0e0d76f4284 100644 --- a/source/blender/blenkernel/BKE_idprop.h +++ b/source/blender/blenkernel/BKE_idprop.h @@ -1,5 +1,5 @@ /** - * $Id: BKE_idprop.h + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -71,7 +71,8 @@ void IDP_FreeArray(struct IDProperty *prop); void IDP_UnlinkArray(struct IDProperty *prop); /* ---------- String Type ------------ */ -void IDP_AssignString(struct IDProperty *prop, char *st); +IDProperty *IDP_NewString(const char *st, const char *name, int maxlen);/* maxlen excludes '\0' */ +void IDP_AssignString(struct IDProperty *prop, char *st, int maxlen); /* maxlen excludes '\0' */ void IDP_ConcatStringC(struct IDProperty *prop, char *st); void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append); void IDP_FreeString(struct IDProperty *prop); @@ -114,7 +115,7 @@ int IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop); /*this is the same as IDP_AddToGroup, only you pass an item in the group list to be inserted after.*/ int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous, - struct IDProperty *pnew); + struct IDProperty *pnew); /*NOTE: this does not free the property!! diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 6b22b10cf24..d7eb5fe8246 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -55,7 +55,6 @@ int BKE_imtype_is_movie(int imtype); struct anim *openanim(char * name, int flags); -void converttopremul(struct ImBuf *ibuf); void image_de_interlace(struct Image *ima, int odd); void tag_image_time(struct Image *ima); @@ -116,7 +115,9 @@ void BKE_image_release_ibuf(struct Image *ima, void *lock); struct Image *BKE_add_image_file(const char *name, int frame); /* adds image, adds ibuf, generates color or pattern */ -struct Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4]); +struct Image *BKE_add_image_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4]); +/* adds image from imbuf, owns imbuf */ +struct Image *BKE_add_image_imbuf(struct ImBuf *ibuf); /* for reload, refresh, pack */ void BKE_image_signal(struct Image *ima, struct ImageUser *iuser, int signal); @@ -139,6 +140,9 @@ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct Im /* for multilayer images as well as for render-viewer */ struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima); void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima); + +/* for multiple slot render, call this before render */ +void BKE_image_backup_render(struct Scene *scene, struct Image *ima); /* goes over all textures that use images */ void BKE_image_free_all_textures(void); @@ -160,6 +164,11 @@ struct Image *BKE_image_copy(struct Image *ima); /* merge source into dest, and free source */ void BKE_image_merge(struct Image *dest, struct Image *source); +/* image_gen.c */ +void BKE_image_buf_fill_color(unsigned char *rect, float *rect_float, int width, int height, float color[4]); +void BKE_image_buf_fill_checker(unsigned char *rect, float *rect_float, int height, int width); +void BKE_image_buf_fill_checker_color(unsigned char *rect, float *rect_float, int height, int width); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h index b3a3b4a5e9f..daf6925845f 100644 --- a/source/blender/blenkernel/BKE_key.h +++ b/source/blender/blenkernel/BKE_key.h @@ -77,6 +77,9 @@ void key_to_latt(struct KeyBlock *kb, struct Lattice *lt); void latt_to_key(struct Lattice *lt, struct KeyBlock *kb); void key_to_curve(struct KeyBlock *kb, struct Curve *cu, struct ListBase *nurb); void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb); +float (*key_to_vertcos(struct Object *ob, struct KeyBlock *kb))[3]; +void vertcos_to_key(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]); +void offset_to_key(struct Object *ob, struct KeyBlock *kb, float (*ofs)[3]); #ifdef __cplusplus }; diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index d99296068d9..880f3f7e724 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -49,7 +49,7 @@ void init_latt_deform(struct Object *oblatt, struct Object *ob); void calc_latt_deform(struct Object *, float *co, float weight); void end_latt_deform(struct Object *); -int object_deform_mball(struct Object *ob); +int object_deform_mball(struct Object *ob, struct ListBase *dispbase); void outside_lattice(struct Lattice *lt); void curve_deform_verts(struct Scene *scene, struct Object *cuOb, struct Object *target, @@ -59,11 +59,11 @@ void curve_deform_vector(struct Scene *scene, struct Object *cuOb, struct Object float *orco, float *vec, float mat[][3], int no_rot_axis); void lattice_deform_verts(struct Object *laOb, struct Object *target, - struct DerivedMesh *dm, float (*vertexCos)[3], - int numVerts, char *vgroup); + struct DerivedMesh *dm, float (*vertexCos)[3], + int numVerts, char *vgroup); void armature_deform_verts(struct Object *armOb, struct Object *target, - struct DerivedMesh *dm, float (*vertexCos)[3], - float (*defMats)[3][3], int numVerts, int deformflag, + struct DerivedMesh *dm, float (*vertexCos)[3], + float (*defMats)[3][3], int numVerts, int deformflag, float (*prevCos)[3], const char *defgrp_name); float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]; diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index b859dbe6f51..cb61a08f3ba 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -51,10 +51,9 @@ int id_make_local(struct ID *id, int test); int id_copy(struct ID *id, struct ID **newid, int test); int id_unlink(struct ID *id, int test); -int check_for_dupid(struct ListBase *lb, struct ID *id, char *name); int new_id(struct ListBase *lb, struct ID *id, const char *name); -struct ListBase *wich_libbase(struct Main *mainlib, short type); +struct ListBase *which_libbase(struct Main *mainlib, short type); #define MAX_LIBARRAY 40 int set_listbasepointers(struct Main *main, struct ListBase **lb); @@ -82,5 +81,8 @@ void recalc_all_library_objects(struct Main *main); void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowManager *) ); +/* use when "" is given to new_id() */ +#define ID_FALLBACK_NAME "Untitled" + #endif diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index 7ec5d172130..07ca5a1c0ee 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -83,6 +83,10 @@ void free_matcopybuf(void); void copy_matcopybuf(struct Material *ma); void paste_matcopybuf(struct Material *ma); +void clear_mat_mtex_copybuf(void); +void copy_mat_mtex_copybuf(struct ID *id); +void paste_mat_mtex_copybuf(struct ID *id); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index e28e2c4d86e..8d7d205e847 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -163,11 +163,12 @@ struct MetaBall *add_mball(char *name); struct MetaBall *copy_mball(struct MetaBall *mb); void make_local_mball(struct MetaBall *mb); void tex_space_mball(struct Object *ob); -float *make_orco_mball(struct Object *ob); +float *make_orco_mball(struct Object *ob, struct ListBase *dispbase); void copy_mball_properties(struct Scene *scene, struct Object *active_object); struct Object *find_basis_mball(struct Scene *scene, struct Object *ob); int is_basis_mball(struct Object *ob); -void metaball_polygonize(struct Scene *scene, struct Object *ob); +int is_mball_basis_for(struct Object *ob1, struct Object *ob2); +void metaball_polygonize(struct Scene *scene, struct Object *ob, struct ListBase *dispbase); void calc_mballco(struct MetaElem *ml, float *vec); float densfunc(struct MetaElem *ball, float x, float y, float z); float metaball(float x, float y, float z); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 5839239a7a5..20291611986 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -98,6 +98,11 @@ int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, struct Mesh *get_mesh(struct Object *ob); void set_mesh(struct Object *ob, struct Mesh *me); void mball_to_mesh(struct ListBase *lb, struct Mesh *me); +int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *_totvert, + struct MEdge **alledge, int *_totedge, struct MFace **allface, int *_totface); +int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase, + struct MVert **allvert, int *_totvert, struct MEdge **alledge, int *_totedge, + struct MFace **allface, int *_totface); void nurbs_to_mesh(struct Object *ob); void mesh_to_curve(struct Scene *scene, struct Object *ob); void free_dverts(struct MDeformVert *dvert, int totvert); diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 493ee281395..48ce0d4b57b 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -131,22 +131,22 @@ typedef struct ModifierTypeInfo { * and otherwise the ob argument. */ void (*deformVerts)(struct ModifierData *md, struct Object *ob, - struct DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, - int useRenderParams, int isFinalCalc); + struct DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, + int useRenderParams, int isFinalCalc); /* Like deformVerts but called during editmode (for supporting modifiers) */ void (*deformVertsEM)( - struct ModifierData *md, struct Object *ob, - struct BMEditMesh *editData, struct DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts); + struct ModifierData *md, struct Object *ob, + struct BMEditMesh *editData, struct DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts); /* Set deform matrix per vertex for crazyspace correction */ void (*deformMatricesEM)( - struct ModifierData *md, struct Object *ob, - struct BMEditMesh *editData, struct DerivedMesh *derivedData, - float (*vertexCos)[3], float (*defMats)[3][3], int numVerts); + struct ModifierData *md, struct Object *ob, + struct BMEditMesh *editData, struct DerivedMesh *derivedData, + float (*vertexCos)[3], float (*defMats)[3][3], int numVerts); /********************* Non-deform modifier functions *********************/ @@ -170,9 +170,9 @@ typedef struct ModifierTypeInfo { * modified form), but must not release it. */ struct DerivedMesh *(*applyModifier)( - struct ModifierData *md, struct Object *ob, - struct DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc); + struct ModifierData *md, struct Object *ob, + struct DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc); /* Like applyModifier but called during editmode (for supporting * modifiers). @@ -182,9 +182,9 @@ typedef struct ModifierTypeInfo { * derivedData apply as for applyModifier. */ struct DerivedMesh *(*applyModifierEM)( - struct ModifierData *md, struct Object *ob, - struct BMEditMesh *editData, - struct DerivedMesh *derivedData); + struct ModifierData *md, struct Object *ob, + struct BMEditMesh *editData, + struct DerivedMesh *derivedData); /********************* Optional functions *********************/ @@ -237,7 +237,7 @@ typedef struct ModifierTypeInfo { * This function is optional. */ void (*updateDepgraph)(struct ModifierData *md, struct DagForest *forest, struct Scene *scene, - struct Object *ob, struct DagNode *obNode); + struct Object *ob, struct DagNode *obNode); /* Should return true if the modifier needs to be recalculated on time * changes. @@ -253,7 +253,7 @@ typedef struct ModifierTypeInfo { * This function is optional. */ void (*foreachObjectLink)(struct ModifierData *md, struct Object *ob, - ObjectWalkFunc walk, void *userData); + ObjectWalkFunc walk, void *userData); /* Should call the given walk function with a pointer to each ID * pointer (i.e. each datablock pointer) that the modifier data @@ -264,7 +264,7 @@ typedef struct ModifierTypeInfo { * will be used. */ void (*foreachIDLink)(struct ModifierData *md, struct Object *ob, - IDWalkFunc walk, void *userData); + IDWalkFunc walk, void *userData); } ModifierTypeInfo; ModifierTypeInfo *modifierType_getInfo (ModifierType type); @@ -287,15 +287,16 @@ int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, i void modifier_setError(struct ModifierData *md, char *format, ...); void modifiers_foreachObjectLink(struct Object *ob, - ObjectWalkFunc walk, - void *userData); + ObjectWalkFunc walk, + void *userData); void modifiers_foreachIDLink(struct Object *ob, - IDWalkFunc walk, - void *userData); + IDWalkFunc walk, + void *userData); struct ModifierData *modifiers_findByType(struct Object *ob, ModifierType type); +struct ModifierData *modifiers_findByName(struct Object *ob, const char *name); void modifiers_clearErrors(struct Object *ob); int modifiers_getCageIndex(struct Scene *scene, struct Object *ob, - int *lastPossibleCageIndex_r, int virtual_); + int *lastPossibleCageIndex_r, int virtual_); int modifiers_isSoftbodyEnabled(struct Object *ob); int modifiers_isClothEnabled(struct Object *ob); @@ -315,11 +316,14 @@ int modifiers_indexInObject(struct Object *ob, struct ModifierData *md * end of the stack. */ struct LinkNode *modifiers_calcDataMasks(struct Scene *scene, - struct Object *ob, - struct ModifierData *md, - CustomDataMask dataMask, - int required_mode); + struct Object *ob, + struct ModifierData *md, + CustomDataMask dataMask, + int required_mode); struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob); +/* here for do_versions */ +void modifier_mdef_compact_influences(struct ModifierData *md); + #endif diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 22f70d079ca..39fc795e6ff 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -35,22 +35,32 @@ struct Mesh; struct MFace; struct Multires; struct MultiresModifierData; +struct ModifierData; struct Object; void multires_mark_as_modified(struct Object *ob); void multires_force_update(struct Object *ob); void multires_force_render_update(struct Object *ob); +void multires_force_external_reload(struct Object *ob); struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, int local_mmd, struct DerivedMesh*, struct Object *, int, int); -struct MultiresModifierData *find_multires_modifier(struct Object *ob); +struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene, + struct ModifierData *lastmd); +struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd, + struct Object *ob); void multiresModifier_join(struct Object *); void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction); void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int updateblock, int simple); -int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src); +int multiresModifier_reshape(struct Scene *scene, struct MultiresModifierData *mmd, + struct Object *dst, struct Object *src); +int multiresModifier_reshapeFromDM(struct Scene *scene, struct MultiresModifierData *mmd, + struct Object *ob, struct DerivedMesh *srcdm); +int multiresModifier_reshapeFromDeformMod(struct Scene *scene, struct MultiresModifierData *mmd, + struct Object *ob, struct ModifierData *md); void multires_stitch_grids(struct Object *); diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index 5b842965225..30bce613dbe 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -77,6 +77,8 @@ void BKE_nlatrack_sort_strips(struct NlaTrack *nlt); short BKE_nlatrack_add_strip(struct NlaTrack *nlt, struct NlaStrip *strip); +short BKE_nlatrack_get_bounds(struct NlaTrack *nlt, float bounds[2]); + /* ............ */ struct NlaStrip *BKE_nlastrip_find_active(struct NlaTrack *nlt); diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index a6ebb72320c..4c7dcff0cd2 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -290,9 +290,11 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define RRES_OUT_AO 10 #define RRES_OUT_REFLECT 11 #define RRES_OUT_REFRACT 12 -#define RRES_OUT_RADIO 13 +#define RRES_OUT_INDIRECT 13 #define RRES_OUT_INDEXOB 14 #define RRES_OUT_MIST 15 +#define RRES_OUT_EMIT 16 +#define RRES_OUT_ENV 17 /* note: types are needed to restore callbacks, don't change values */ #define CMP_NODE_VIEWER 201 @@ -381,6 +383,7 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define CMP_SCALE_RELATIVE 0 #define CMP_SCALE_ABSOLUTE 1 #define CMP_SCALE_SCENEPERCENT 2 +#define CMP_SCALE_RENDERPERCENT 3 /* the type definitions array */ diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index a6a641a3219..07c3da48792 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -45,6 +45,8 @@ struct SoftBody; struct BulletSoftBody; struct Group; struct bAction; +struct RenderData; +struct rctf; void clear_workob(struct Object *workob); void what_does_parent(struct Scene *scene, struct Object *ob, struct Object *workob); @@ -75,6 +77,7 @@ void *add_camera(char *name); struct Camera *copy_camera(struct Camera *cam); void make_local_camera(struct Camera *cam); float dof_camera(struct Object *ob); + void *add_lamp(char *name); struct Lamp *copy_lamp(struct Lamp *la); void make_local_lamp(struct Lamp *la); @@ -110,6 +113,8 @@ void where_is_object_simul(struct Scene *scene, struct Object *ob); struct BoundBox *unit_boundbox(void); void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]); struct BoundBox *object_get_boundbox(struct Object *ob); +void object_get_dimensions(struct Object *ob, float *value); +void object_set_dimensions(struct Object *ob, const float *value); void object_boundbox_flag(struct Object *ob, int flag, int set); void minmax_object(struct Object *ob, float *min, float *max); int minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, float *max); @@ -128,6 +133,10 @@ int object_insert_ptcache(struct Object *ob); // void object_delete_ptcache(struct Object *ob, int index); struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, char *name, int from_mix); +void object_camera_matrix( + struct RenderData *rd, struct Object *camera, int winx, int winy, short field_second, + float winmat[][4], struct rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor, + float *viewdx, float *viewdy); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index 6742d0fd924..91fa664bde5 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -28,6 +28,8 @@ #ifndef BKE_PAINT_H #define BKE_PAINT_H +#include "DNA_vec_types.h" + struct Brush; struct MFace; struct MultireModifierData; @@ -69,13 +71,15 @@ typedef struct SculptSession { struct MFace *mface; int totvert, totface; float *face_normals; - struct PBVH *tree; struct Object *ob; - struct KeyBlock *kb, *refkb; + struct KeyBlock *kb; /* Mesh connectivity */ struct ListBase *fmap; + /* PBVH acceleration structure */ + struct PBVH *pbvh; + /* Used temporarily per-stroke */ float *vertexcosnos; @@ -86,15 +90,18 @@ typedef struct SculptSession { unsigned int texcache_side, *texcache, texcache_actual; /* Layer brush persistence between strokes */ - float (*layer_co)[3]; /* Copy of the mesh vertices' locations */ - float *layer_disps; /* Displacements for each vertex */ + float (*layer_co)[3]; /* Copy of the mesh vertices' locations */ struct SculptStroke *stroke; struct StrokeCache *cache; struct GPUDrawObject *drawobject; + + int modifiers_active; + + rcti previous_r; } SculptSession; -void free_sculptsession(SculptSession **); +void free_sculptsession(struct Object *ob); #endif diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 45166ebf022..33a41821fe2 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -169,6 +169,7 @@ typedef struct ParticleCollision float nor[3]; // normal at collision point float vel[3]; // velocity of collision point float co1[3], co2[3]; // ray start and end points + float ve1[3], ve2[3]; // particle velocities float ray_len; // original length of co2-co1, needed for collision time evaluation float t; // time of previous collision, needed for substracting face velocity } ParticleCollision; @@ -254,9 +255,11 @@ void psys_threads_free(ParticleThread *threads); void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3]); /* particle_system.c */ +void psys_update_path_cache(struct ParticleSimulationData *sim, float cfra); struct ParticleSystem *psys_get_target_system(struct Object *ob, struct ParticleTarget *pt); void psys_count_keyed_targets(struct ParticleSimulationData *sim); void psys_update_particle_tree(struct ParticleSystem *psys, float cfra); +void psys_update_children(struct ParticleSimulationData *sim); void psys_make_temp_pointcache(struct Object *ob, struct ParticleSystem *psys); void psys_get_pointcache_start_end(struct Scene *scene, ParticleSystem *psys, int *sfra, int *efra); diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h index 10550ccdc05..03a86b6566a 100644 --- a/source/blender/blenkernel/BKE_pointcache.h +++ b/source/blender/blenkernel/BKE_pointcache.h @@ -118,7 +118,7 @@ typedef struct PTCacheID { unsigned int data_types, info_types; /* copies point data to cache data */ - int (*write_elem)(int index, void *calldata, void **data); + int (*write_elem)(int index, void *calldata, void **data, int cfra); /* copies point data to cache data */ int (*write_stream)(PTCacheFile *pf, void *calldata); /* copies cache cata to point data */ @@ -128,10 +128,10 @@ typedef struct PTCacheID { /* interpolated between previously read point data and cache data */ void (*interpolate_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data); - /* total number of simulated points */ - int (*totpoint)(void *calldata); - /* number of points written for current cache frame (currently not used) */ - int (*totwrite)(void *calldata); + /* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */ + int (*totpoint)(void *calldata, int cfra); + /* number of points written for current cache frame */ + int (*totwrite)(void *calldata, int cfra); int (*write_header)(PTCacheFile *pf); int (*read_header)(PTCacheFile *pf); @@ -236,7 +236,7 @@ void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothMo void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd); void BKE_ptcache_id_from_smoke_turbulence(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd); -void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob); +void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis); /***************** Global funcs ****************************/ void BKE_ptcache_remove(void); @@ -258,6 +258,7 @@ int BKE_ptcache_data_size(int data_type); /* Memory cache read/write helpers. */ void BKE_ptcache_mem_init_pointers(struct PTCacheMem *pm); void BKE_ptcache_mem_incr_pointers(struct PTCacheMem *pm); +int BKE_ptcache_mem_seek_pointers(int point_index, struct PTCacheMem *pm); /* Copy a specific data type from cache data to point data. */ void BKE_ptcache_data_get(void **data, int type, int index, void *to); @@ -302,4 +303,10 @@ void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid); /* Loads simulation from external (disk) cache files. */ void BKE_ptcache_load_external(struct PTCacheID *pid); +/* Set correct flags after successful simulation step */ +void BKE_ptcache_validate(struct PointCache *cache, int framenr); + +/* Set correct flags after unsuccessful simulation step */ +void BKE_ptcache_invalidate(struct PointCache *cache); + #endif diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h index 62381bbc1f5..d7b7801d697 100644 --- a/source/blender/blenkernel/BKE_report.h +++ b/source/blender/blenkernel/BKE_report.h @@ -59,6 +59,8 @@ void BKE_report_store_level_set(ReportList *reports, ReportType level); char *BKE_reports_string(ReportList *reports, ReportType level); void BKE_reports_print(ReportList *reports, ReportType level); +Report *BKE_reports_last_displayable(ReportList *reports); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/BKE_sca.h b/source/blender/blenkernel/BKE_sca.h index 910f381823c..7adbfd9b48d 100644 --- a/source/blender/blenkernel/BKE_sca.h +++ b/source/blender/blenkernel/BKE_sca.h @@ -37,6 +37,9 @@ struct Object; struct bController; struct bActuator; +void link_logicbricks(void **poin, void ***ppoin, short *tot, short size); +void unlink_logicbricks(void **poin, void ***ppoin, short *tot); + void unlink_controller(struct bController *cont); void unlink_controllers(struct ListBase *lb); void free_controller(struct bController *cont); @@ -67,5 +70,9 @@ void set_sca_new_poins_ob(struct Object *ob); void set_sca_new_poins(void); void sca_remove_ob_poin(struct Object *obt, struct Object *ob); +void sca_move_sensor(struct bSensor *sens_to_move, Object *ob, int move_up); +void sca_move_controller(struct bController *cont_to_move, Object *ob, int move_up); +void sca_move_actuator(struct bActuator *act_to_move, Object *ob, int move_up); + #endif diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 5e5131f9ccc..f0fb2a65673 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -47,9 +47,8 @@ struct Main; #define SCE_COPY_LINK_DATA 2 #define SCE_COPY_FULL 3 -/* note; doesn't work when scene is empty */ -#define SETLOOPER(s, b) sce= s, b= (Base*)sce->base.first; b; b= (Base*)(b->next?b->next:sce->set?(sce=sce->set)->base.first:NULL) - +#define SETLOOPER(s, b) sce= s, b= _setlooper_base_step(&sce, NULL); b; b= _setlooper_base_step(&sce, b) +struct Base *_setlooper_base_step(struct Scene **sce, struct Base *base); void free_avicodecdata(struct AviCodecData *acd); void free_qtcodecdata(struct QuicktimeCodecData *acd); @@ -59,17 +58,20 @@ struct Scene *add_scene(char *name); struct Base *object_in_scene(struct Object *ob, struct Scene *sce); void set_scene_bg(struct Scene *sce); -void set_scene_name(char *name); +struct Scene *set_scene_name(char *name); struct Scene *copy_scene(struct Main *bmain, struct Scene *sce, int type); void unlink_scene(struct Main *bmain, struct Scene *sce, struct Scene *newsce); -int next_object(struct Scene *scene, int val, struct Base **base, struct Object **ob); +int next_object(struct Scene **scene, int val, struct Base **base, struct Object **ob); struct Object *scene_find_camera(struct Scene *sc); -struct Object *scene_find_camera_switch(struct Scene *scene); // DURIAN_CAMERA_SWITCH +struct Object *scene_camera_switch_find(struct Scene *scene); // DURIAN_CAMERA_SWITCH +int scene_camera_switch_update(struct Scene *scene); char *scene_find_marker_name(struct Scene *scene, int frame); char *scene_find_last_marker_name(struct Scene *scene, int frame); +int scene_marker_tfm_translate(struct Scene *scene, int delta, int flag); +int scene_marker_tfm_extend(struct Scene *scene, int delta, int flag, int frame, char side); struct Base *scene_add_base(struct Scene *sce, struct Object *ob); void scene_deselect_all(struct Scene *sce); @@ -78,6 +80,8 @@ void scene_select_base(struct Scene *sce, struct Base *selbase); /* checks for cycle, returns 1 if it's all OK */ int scene_check_setscene(struct Scene *sce); +float BKE_curframe(struct Scene *scene); + void scene_update_tagged(struct Scene *sce); void scene_update_for_newframe(struct Scene *sce, unsigned int lay); diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index ee9a4db049f..125486625bb 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -227,7 +227,6 @@ void BKE_spacetypes_free(void); /* only for quitting blender */ /* spacedata */ void BKE_spacedata_freelist(ListBase *lb); void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2); -void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2); /* area/regions */ struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar); @@ -236,6 +235,11 @@ void BKE_screen_area_free(struct ScrArea *sa); struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type); +void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene); +void BKE_screen_view3d_scene_sync(struct bScreen *sc); +void BKE_screen_view3d_main_sync(ListBase *screen_lb, struct Scene *scene); + + /* screen */ void free_screen(struct bScreen *sc); unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene); diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index b0a810203cf..002a1958a13 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -112,22 +112,22 @@ struct SeqEffectHandle { /* stores the y-range of the effect IPO */ void (*store_icu_yrange)(struct Sequence * seq, - short adrcode, float *ymin, float *ymax); + short adrcode, float *ymin, float *ymax); /* stores the default facf0 and facf1 if no IPO is present */ void (*get_default_fac)(struct Sequence *seq, int cfra, - float * facf0, float * facf1); + float * facf0, float * facf1); /* execute the effect - sequence effects are only required to either support - float-rects or byte-rects - (mixed cases are handled one layer up...) */ + sequence effects are only required to either support + float-rects or byte-rects + (mixed cases are handled one layer up...) */ void (*execute)(struct Scene *scene, struct Sequence *seq, int cfra, - float facf0, float facf1, - int x, int y, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3, struct ImBuf *out); + float facf0, float facf1, + int x, int y, int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out); }; /* ********************* prototypes *************** */ @@ -136,8 +136,8 @@ struct SeqEffectHandle { void printf_strip(struct Sequence *seq); /* apply functions recursively */ -void seqbase_recursive_apply(struct ListBase *seqbase, int (*apply_func)(struct Sequence *seq, void *), void *arg); -void seq_recursive_apply(struct Sequence *seq, int (*apply_func)(struct Sequence *, void *), void *arg); +int seqbase_recursive_apply(struct ListBase *seqbase, int (*apply_func)(struct Sequence *seq, void *), void *arg); +int seq_recursive_apply(struct Sequence *seq, int (*apply_func)(struct Sequence *, void *), void *arg); // extern void seq_free_sequence(struct Scene *scene, struct Sequence *seq); @@ -149,11 +149,12 @@ char *give_seqname(struct Sequence *seq); struct ImBuf *give_ibuf_seq(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size); struct ImBuf *give_ibuf_seq_threaded(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size); struct ImBuf *give_ibuf_seq_direct(struct Scene *scene, int rectx, int recty, int cfra, int render_size, struct Sequence *seq); +struct ImBuf *give_ibuf_seqbase(struct Scene *scene, int rectx, int recty, int cfra, int chan_shown, int render_size, struct ListBase *seqbasep); void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown, int render_size); void calc_sequence(struct Scene *scene, struct Sequence *seq); void calc_sequence_disp(struct Scene *scene, struct Sequence *seq); void new_tstripdata(struct Sequence *seq); -void reload_sequence_new_file(struct Scene *scene, struct Sequence * seq); +void reload_sequence_new_file(struct Scene *scene, struct Sequence * seq, int lock_range); void sort_seq(struct Scene *scene); void build_seqar_cb(struct ListBase *seqbase, struct Sequence ***seqar, int *totseq, int (*test_func)(struct Sequence * seq)); @@ -186,21 +187,27 @@ void seq_single_fix(struct Sequence *seq); int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test); struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq); void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs); +void seq_dupe_animdata(struct Scene *scene, char *name_from, char *name_to); int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct Scene *evil_scene); int shuffle_seq_time(ListBase * seqbasep, struct Scene *evil_scene); int seqbase_isolated_sel_check(struct ListBase *seqbase); void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_mem_usage); +struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Sequence * seq, int dupe_flag); +int seq_swap(struct Sequence *seq_a, struct Sequence *seq_b); void seq_update_sound(struct Scene* scene, struct Sequence *seq); void seq_update_muting(struct Scene* scene, struct Editing *ed); void seqbase_sound_reload(Scene *scene, ListBase *seqbase); void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq); +void seqbase_dupli_recursive(struct Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag); + void clear_scene_in_allseqs(struct Scene *sce); struct Sequence *get_seq_by_name(struct ListBase *seqbase, const char *name, int recursive); -struct Sequence *active_seq_get(struct Scene *scene); -void active_seq_set(struct Scene *scene, struct Sequence *seq); +struct Sequence *seq_active_get(struct Scene *scene); +void seq_active_set(struct Scene *scene, struct Sequence *seq); +int seq_active_pair_get(struct Scene *scene, struct Sequence **seq_act, struct Sequence **seq_other); /* api for adding new sequence strips */ typedef struct SeqLoadInfo { @@ -222,6 +229,13 @@ typedef struct SeqLoadInfo { #define SEQ_LOAD_MOVIE_SOUND 1<<2 #define SEQ_LOAD_SOUND_CACHE 1<<3 + +/* seq_dupli' flags */ +#define SEQ_DUPE_UNIQUE_NAME 1<<0 +#define SEQ_DUPE_CONTEXT 1<<1 +#define SEQ_DUPE_ANIM 1<<2 +#define SEQ_DUPE_ALL 1<<3 /* otherwise only selected are copied */ + /* use as an api function */ typedef struct Sequence *(*SeqLoadFunc)(struct bContext *, ListBase *, struct SeqLoadInfo *); @@ -233,6 +247,10 @@ struct Sequence *sequencer_add_image_strip(struct bContext *C, ListBase *seqbase struct Sequence *sequencer_add_sound_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); struct Sequence *sequencer_add_movie_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); +/* view3d draw callback, run when not in background view */ +typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, int, int, int); +extern SequencerDrawView sequencer_view3d_cb; + /* copy/paste */ extern ListBase seqbase_clipboard; extern int seqbase_clipboard_frame; diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h index 4b6c5ba5459..47fb5049278 100644 --- a/source/blender/blenkernel/BKE_shrinkwrap.h +++ b/source/blender/blenkernel/BKE_shrinkwrap.h @@ -107,7 +107,7 @@ typedef struct ShrinkwrapCalcData struct Object *ob; //object we are applying shrinkwrap to - MVert *vert; //Array of verts being projected (to fetch normals or other data) + struct MVert *vert; //Array of verts being projected (to fetch normals or other data) float (*vertexCos)[3]; //vertexs being shrinkwraped int numVerts; diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h index 4547f869439..088d61061b2 100644 --- a/source/blender/blenkernel/BKE_smoke.h +++ b/source/blender/blenkernel/BKE_smoke.h @@ -40,6 +40,7 @@ void smokeModifier_free (struct SmokeModifierData *smd); void smokeModifier_reset(struct SmokeModifierData *smd); void smokeModifier_reset_turbulence(struct SmokeModifierData *smd); void smokeModifier_createType(struct SmokeModifierData *smd); +void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData *tsmd); long long smoke_get_mem_req(int xres, int yres, int zres, int amplify); diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h index e7fbf50ad82..738fe7dde82 100644 --- a/source/blender/blenkernel/BKE_softbody.h +++ b/source/blender/blenkernel/BKE_softbody.h @@ -1,7 +1,7 @@ /** - * BKE_softbody.h - * - * $Id: BKE_softbody.h + * BKE_softbody.h + * + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -39,11 +39,11 @@ typedef struct BodyPoint { float origS[3], origE[3], origT[3], pos[3], vec[3], force[3]; float goal; float prevpos[3], prevvec[3], prevdx[3], prevdv[3]; /* used for Heun integration */ - float impdv[3],impdx[3]; - int nofsprings; int *springs; + float impdv[3],impdx[3]; + int nofsprings; int *springs; float choke,choke2,frozen; float colball; - short flag; + short loc_flag; //reserved by locale module specific states //char octantflag; float mass; float springweight; diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h index fa035d62d62..50c86e80b08 100644 --- a/source/blender/blenkernel/BKE_sound.h +++ b/source/blender/blenkernel/BKE_sound.h @@ -38,6 +38,8 @@ struct ListBase; struct Main; struct Sequence; +void sound_init_once(); + void sound_init(struct Main *main); void sound_exit(); @@ -72,6 +74,8 @@ void sound_create_scene(struct Scene *scene); void sound_destroy_scene(struct Scene *scene); +void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip); + void* sound_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip); void sound_remove_scene_sound(struct Scene *scene, void* handle); diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index a7926e90e02..2e2b4f2bf2a 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -28,16 +28,21 @@ #ifndef BKE_SUBSURF_H #define BKE_SUBSURF_H -struct Mesh; -struct Object; +struct DMGridAdjacency; +struct DMGridData; struct DerivedMesh; struct EditMesh; +struct IndexNode; +struct ListBase; +struct Mesh; struct MultiresSubsurf; +struct Object; +struct PBVH; struct SubsurfModifierData; -struct _CCGSubsurf; -struct _CCGVert; struct _CCGEdge; struct _CCGFace; +struct _CCGSubsurf; +struct _CCGVert; struct EdgeHash; struct PBVH; struct DMGridData; @@ -46,12 +51,12 @@ struct DMGridAdjacency; /**************************** External *****************************/ struct DerivedMesh *subsurf_make_derived_from_derived( - struct DerivedMesh *dm, - struct SubsurfModifierData *smd, - int useRenderParams, float (*vertCos)[3], - int isFinalCalc, int editMode); + struct DerivedMesh *dm, + struct SubsurfModifierData *smd, + int useRenderParams, float (*vertCos)[3], + int isFinalCalc, int editMode); -void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]); +void subsurf_calculate_limit_positions(struct Mesh *me, float (*positions_r)[3]); /**************************** Internal *****************************/ @@ -65,7 +70,7 @@ typedef struct CCGDerivedMesh { struct {int startVert; struct _CCGVert *vert;} *vertMap; struct {int startVert; int startEdge; struct _CCGEdge *edge;} *edgeMap; struct {int startVert; int startEdge; - int startFace; struct _CCGFace *face;} *faceMap; + int startFace; struct _CCGFace *face;} *faceMap; short *edgeFlags; char *faceFlags; @@ -73,6 +78,9 @@ typedef struct CCGDerivedMesh { int *reverseFaceMap; struct PBVH *pbvh; + int pbvh_draw; + struct ListBase *fmap; + struct IndexNode *fmap_mem; struct DMGridData **gridData; struct DMGridAdjacency *gridAdjacency; @@ -86,7 +94,7 @@ typedef struct CCGDerivedMesh { int lvl, totlvl; float (*orco)[3]; - Object *ob; + struct Object *ob; int modified; void (*update)(DerivedMesh*); diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h index ace352395d2..39c12a2bfd8 100644 --- a/source/blender/blenkernel/BKE_texture.h +++ b/source/blender/blenkernel/BKE_texture.h @@ -64,6 +64,7 @@ void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size); void default_tex(struct Tex *tex); struct Tex *add_texture(const char *name); +void tex_set_type(struct Tex *tex, int type); void default_mtex(struct MTex *mtex); struct MTex *add_mtex(void); struct Tex *copy_texture(struct Tex *tex); diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h index f9252eac875..e4f81625031 100644 --- a/source/blender/blenkernel/BKE_utildefines.h +++ b/source/blender/blenkernel/BKE_utildefines.h @@ -1,6 +1,5 @@ /* - $Id$ - + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -43,6 +42,9 @@ extern "C" { #define TRUE 1 #endif +/* Macro to convert a value to string in the preprocessor */ +#define QUOTE(x) #x + /* these values need to be hardcoded in structs, dna does not recognize defines */ /* also defined in DNA_space_types.h */ #ifndef FILE_MAXDIR @@ -110,6 +112,7 @@ extern "C" { #define AVG2(x, y) ( 0.5 * ((x) + (y)) ) #define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f)) +#define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f)) #define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);} #define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);} @@ -169,7 +172,7 @@ extern "C" { #define IMAG MAKE_ID('I','M','A','G') #define DNA1 MAKE_ID('D','N','A','1') -#define TEST MAKE_ID('T','E','S','T') +#define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */ #define REND MAKE_ID('R','E','N','D') #define USER MAKE_ID('U','S','E','R') diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 801abe7324d..09707ba5c91 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -50,6 +50,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) @@ -68,6 +72,11 @@ IF(WITH_FFMPEG) ADD_DEFINITIONS(-DWITH_FFMPEG) ENDIF(WITH_FFMPEG) +IF(WITH_LCMS) + SET(INC ${INC} ${LCMS_INCLUDE_DIR}) + ADD_DEFINITIONS(-DWITH_LCMS) +ENDIF(WITH_LCMS) + IF(WITH_PYTHON) SET(INC ${INC} ../python ${PYTHON_INC}) ELSE(WITH_PYTHON) diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index dfd1e00c104..88a45ee9302 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -6,7 +6,7 @@ sources = env.Glob('intern/*.c') incs = '. #/intern/guardedalloc #/intern/memutil ../editors/include' incs += ' ../blenlib ../blenfont ../makesdna ../windowmanager' incs += ' ../render/extern/include #/intern/decimation/extern ../makesrna' -incs += ' ../imbuf ../ikplugin ../avi #/intern/elbeem/extern ../nodes' +incs += ' ../imbuf ../ikplugin ../avi #/intern/elbeem/extern ../nodes ../modifiers' incs += ' #/intern/iksolver/extern ../blenloader' incs += ' #/extern/bullet2/src' incs += ' #/intern/opennl/extern #/intern/bsp/extern' @@ -39,6 +39,9 @@ else: if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') @@ -65,6 +68,7 @@ if env['BF_NO_ELBEEM']: if env['WITH_BF_LCMS']: defs.append('WITH_LCMS') + incs += ' ' + env['BF_LCMS_INC'] if env['WITH_BF_LZO']: incs += ' #/extern/lzo/minilzo' diff --git a/source/blender/blenkernel/intern/BME_Customdata.c b/source/blender/blenkernel/intern/BME_Customdata.c index d70478bac21..913225a2f73 100644 --- a/source/blender/blenkernel/intern/BME_Customdata.c +++ b/source/blender/blenkernel/intern/BME_Customdata.c @@ -35,13 +35,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <string.h> -#include "BKE_bmesh.h" #include "BKE_bmeshCustomData.h" #include "bmesh_private.h" -#include <string.h> #include "MEM_guardedalloc.h" -#include "BLI_mempool.h" /********************* Layer type information **********************/ typedef struct BME_LayerTypeInfo { @@ -138,7 +136,7 @@ static void BME_CD_alloc_block(BME_CustomData *data, void **block) } void BME_CD_copy_data(const BME_CustomData *source, BME_CustomData *dest, - void *src_block, void **dest_block) + void *src_block, void **dest_block) { const BME_LayerTypeInfo *typeInfo; int dest_i, src_i; @@ -154,7 +152,7 @@ void BME_CD_copy_data(const BME_CustomData *source, BME_CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ diff --git a/source/blender/blenkernel/intern/BME_conversions.c b/source/blender/blenkernel/intern/BME_conversions.c index 4181825acb5..aab0c0011a0 100644 --- a/source/blender/blenkernel/intern/BME_conversions.c +++ b/source/blender/blenkernel/intern/BME_conversions.c @@ -34,22 +34,14 @@ */ #include "MEM_guardedalloc.h" -#include "BKE_customdata.h" -#include "DNA_listBase.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_utildefines.h" #include "BKE_mesh.h" -#include "BKE_bmesh.h" -#include "BKE_global.h" -#include "BKE_DerivedMesh.h" #include "BKE_cdderivedmesh.h" -#include "BLI_blenlib.h" -#include "BLI_editVert.h" #include "BLI_edgehash.h" //XXX #include "BIF_editmesh.h" //XXX #include "editmesh.h" diff --git a/source/blender/blenkernel/intern/BME_eulers.c b/source/blender/blenkernel/intern/BME_eulers.c index 9c83f6aaf65..baa490bbeb5 100644 --- a/source/blender/blenkernel/intern/BME_eulers.c +++ b/source/blender/blenkernel/intern/BME_eulers.c @@ -35,17 +35,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" -#include "DNA_meshdata_types.h" -#include "DNA_mesh_types.h" -#include "BKE_utildefines.h" -#include "BKE_customdata.h" -#include "BKE_bmesh.h" - -#include "BLI_blenlib.h" #include "bmesh_private.h" -#include "BLI_ghash.h" /********************************************************* * "Euler API" * @@ -81,7 +72,7 @@ code. *The term "Euler Operator" is actually a misnomer when referring to a non-manifold - data structure. Its use is in keeping with the convention established by others. + data structure. Its use is in keeping with the convention established by others. TODO: -Finish inserting 'strict' validation in all Eulers diff --git a/source/blender/blenkernel/intern/BME_mesh.c b/source/blender/blenkernel/intern/BME_mesh.c index e9a1284809a..938b193a433 100644 --- a/source/blender/blenkernel/intern/BME_mesh.c +++ b/source/blender/blenkernel/intern/BME_mesh.c @@ -35,13 +35,9 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" -#include "BLI_blenlib.h" -#include "BKE_utildefines.h" #include "BKE_bmesh.h" #include "bmesh_private.h" - /* * BME MAKE MESH * @@ -92,7 +88,7 @@ void BME_free_mesh(BME_Mesh *bm) if(bm->ldata.totlayer) BLI_mempool_destroy(bm->ldata.pool); if(bm->pdata.totlayer) BLI_mempool_destroy(bm->pdata.pool); - /*free custom data*/ + /*free custom data*/ CustomData_free(&bm->vdata,0); CustomData_free(&bm->edata,0); CustomData_free(&bm->ldata,0); diff --git a/source/blender/blenkernel/intern/BME_structure.c b/source/blender/blenkernel/intern/BME_structure.c index bc14e5d37d6..53cf93c43af 100644 --- a/source/blender/blenkernel/intern/BME_structure.c +++ b/source/blender/blenkernel/intern/BME_structure.c @@ -36,12 +36,7 @@ #include <limits.h> #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" -#include "BKE_utildefines.h" #include "BKE_bmesh.h" -#include "BLI_blenlib.h" -#include "BLI_linklist.h" -#include "BLI_ghash.h" /** * MISC utility functions. * diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c index 483e7ad150e..66df8f2ad6a 100644 --- a/source/blender/blenkernel/intern/BME_tools.c +++ b/source/blender/blenkernel/intern/BME_tools.c @@ -36,15 +36,11 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_meshdata_types.h" -#include "DNA_mesh_types.h" #include "DNA_object_types.h" -#include "BKE_utildefines.h" #include "BKE_bmesh.h" #include "BLI_math.h" -#include "BLI_blenlib.h" #include "BLI_cellalloc.h" /*split this all into a seperate bevel.c file in src*/ @@ -55,8 +51,8 @@ BME_TransData_Head *BME_init_transdata(int bufsize) { BME_TransData_Head *td; td = MEM_callocN(sizeof(BME_TransData_Head), "BMesh transdata header"); - td->gh = BLI_ghash_new(BLI_ghashutil_ptrhash,BLI_ghashutil_ptrcmp); - td->ma = BLI_memarena_new(bufsize); + td->gh = BLI_ghash_new(BLI_ghashutil_ptrhash,BLI_ghashutil_ptrcmp, "BME_init_transdata gh"); + td->ma = BLI_memarena_new(bufsize, "BME_TransData arena"); BLI_memarena_use_calloc(td->ma); return td; diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index eb316c64af4..bbd68fb797b 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -170,7 +170,7 @@ static void *_ehashIterator_getCurrent(EHashIterator *ehi) { static void _ehashIterator_next(EHashIterator *ehi) { if (ehi->curEntry) { - ehi->curEntry = ehi->curEntry->next; + ehi->curEntry = ehi->curEntry->next; while (!ehi->curEntry) { ehi->curBucket++; if (ehi->curBucket==ehi->eh->curSize) @@ -1159,7 +1159,7 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss, int normalDataOffset = ss->normalDataOffset; int vertDataSize = ss->meshIFC.vertDataSize; - #pragma omp parallel for private(ptrIdx) schedule(static) + #pragma omp parallel for private(ptrIdx) if(numEffectedF*edgeSize*edgeSize*4 >= CCG_OMP_LIMIT) for (ptrIdx=0; ptrIdx<numEffectedF; ptrIdx++) { CCGFace *f = (CCGFace*) effectedF[ptrIdx]; int S, x, y; @@ -1285,7 +1285,7 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss, } } - #pragma omp parallel for private(ptrIdx) schedule(static) + #pragma omp parallel for private(ptrIdx) if(numEffectedF*edgeSize*edgeSize*4 >= CCG_OMP_LIMIT) for (ptrIdx=0; ptrIdx<numEffectedF; ptrIdx++) { CCGFace *f = (CCGFace*) effectedF[ptrIdx]; int S, x, y; @@ -1351,7 +1351,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss, int vertDataSize = ss->meshIFC.vertDataSize; void *q = ss->q, *r = ss->r; - #pragma omp parallel for private(ptrIdx) schedule(static) + #pragma omp parallel for private(ptrIdx) if(numEffectedF*edgeSize*edgeSize*4 >= CCG_OMP_LIMIT) for (ptrIdx=0; ptrIdx<numEffectedF; ptrIdx++) { CCGFace *f = (CCGFace*) effectedF[ptrIdx]; int S, x, y; @@ -1685,7 +1685,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss, } } - #pragma omp parallel private(ptrIdx) + #pragma omp parallel private(ptrIdx) if(numEffectedF*edgeSize*edgeSize*4 >= CCG_OMP_LIMIT) { void *q, *r; @@ -1791,14 +1791,14 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss, gridSize = 1 + (1<<((nextLvl)-1)); cornerIdx = gridSize-1; - #pragma omp parallel for private(i) schedule(static) + #pragma omp parallel for private(i) if(numEffectedF*edgeSize*edgeSize*4 >= CCG_OMP_LIMIT) for (i=0; i<numEffectedE; i++) { CCGEdge *e = effectedE[i]; VertDataCopy(EDGE_getCo(e, nextLvl, 0), VERT_getCo(e->v0, nextLvl)); VertDataCopy(EDGE_getCo(e, nextLvl, edgeSize-1), VERT_getCo(e->v1, nextLvl)); } - #pragma omp parallel for private(i) schedule(static) + #pragma omp parallel for private(i) if(numEffectedF*edgeSize*edgeSize*4 >= CCG_OMP_LIMIT) for (i=0; i<numEffectedF; i++) { CCGFace *f = effectedF[i]; int S, x; diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h index 12212c7a37b..34d684221b0 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.h +++ b/source/blender/blenkernel/intern/CCGSubSurf.h @@ -39,6 +39,10 @@ typedef enum { /***/ +#define CCG_OMP_LIMIT 1000000 + +/***/ + typedef struct _CCGSubSurf CCGSubSurf; CCGSubSurf* ccgSubSurf_new (CCGMeshIFC *ifc, int subdivisionLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 3235ccbbaa5..56b0a3bfb68 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -29,52 +29,29 @@ #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "PIL_time.h" #include "MEM_guardedalloc.h" -#include "DNA_effect_types.h" -#include "DNA_mesh_types.h" +#include "DNA_cloth_types.h" #include "DNA_key_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" #include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_object_fluidsim.h" // N_T #include "DNA_scene_types.h" // N_T -#include "DNA_texture_types.h" -#include "DNA_view3d_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_particle_types.h" -#include "BLI_math.h" #include "BLI_blenlib.h" -#include "BLI_edgehash.h" #include "BLI_editVert.h" -#include "BLI_linklist.h" +#include "BLI_math.h" #include "BLI_memarena.h" #include "BLI_array.h" +#include "BLI_pbvh.h" #include "BKE_cdderivedmesh.h" -#include "BKE_customdata.h" -#include "BKE_DerivedMesh.h" -#include "BKE_deform.h" #include "BKE_displist.h" -#include "BKE_effect.h" -#include "BKE_fluidsim.h" -#include "BKE_global.h" #include "BKE_key.h" -#include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_paint.h" -#include "BKE_subsurf.h" #include "BKE_texture.h" #include "BKE_utildefines.h" #include "BKE_particle.h" @@ -86,7 +63,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "gpu_buffers.h" +#include "GPU_buffers.h" #include "GPU_draw.h" #include "GPU_extensions.h" #include "GPU_material.h" @@ -139,7 +116,7 @@ static MFace *dm_getFaceArray(DerivedMesh *dm) static MVert *dm_dupVertArray(DerivedMesh *dm) { MVert *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumVerts(dm), - "dm_dupVertArray tmp"); + "dm_dupVertArray tmp"); if(tmp) dm->copyVertArray(dm, tmp); @@ -149,7 +126,7 @@ static MVert *dm_dupVertArray(DerivedMesh *dm) static MEdge *dm_dupEdgeArray(DerivedMesh *dm) { MEdge *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumEdges(dm), - "dm_dupEdgeArray tmp"); + "dm_dupEdgeArray tmp"); if(tmp) dm->copyEdgeArray(dm, tmp); @@ -159,7 +136,7 @@ static MEdge *dm_dupEdgeArray(DerivedMesh *dm) static MFace *dm_dupFaceArray(DerivedMesh *dm) { MFace *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumTessFaces(dm), - "dm_dupFaceArray tmp"); + "dm_dupFaceArray tmp"); if(tmp) dm->copyTessFaceArray(dm, tmp); @@ -237,11 +214,11 @@ void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type int numLoops, int numPolys) { CustomData_copy(&source->vertData, &dm->vertData, CD_MASK_DERIVEDMESH, - CD_CALLOC, numVerts); + CD_CALLOC, numVerts); CustomData_copy(&source->edgeData, &dm->edgeData, CD_MASK_DERIVEDMESH, - CD_CALLOC, numEdges); + CD_CALLOC, numEdges); CustomData_copy(&source->faceData, &dm->faceData, CD_MASK_DERIVEDMESH, - CD_CALLOC, numFaces); + CD_CALLOC, numFaces); CustomData_copy(&source->loopData, &dm->loopData, CD_MASK_DERIVEDMESH, CD_CALLOC, numLoops); CustomData_copy(&source->polyData, &dm->polyData, CD_MASK_DERIVEDMESH, @@ -434,8 +411,8 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me) stack*/ if(tmp.totvert != me->totvert) { printf("YEEK! this should be recoded! Shape key loss!!!\n"); - if(me->key) me->key->id.us--; - me->key = NULL; + if(tmp.key) tmp.key->id.us--; + tmp.key = NULL; } *me = tmp; @@ -553,24 +530,24 @@ void DM_set_face_data(DerivedMesh *dm, int index, int type, void *data) } void DM_copy_vert_data(DerivedMesh *source, DerivedMesh *dest, - int source_index, int dest_index, int count) + int source_index, int dest_index, int count) { CustomData_copy_data(&source->vertData, &dest->vertData, - source_index, dest_index, count); + source_index, dest_index, count); } void DM_copy_edge_data(DerivedMesh *source, DerivedMesh *dest, - int source_index, int dest_index, int count) + int source_index, int dest_index, int count) { CustomData_copy_data(&source->edgeData, &dest->edgeData, - source_index, dest_index, count); + source_index, dest_index, count); } void DM_copy_tessface_data(DerivedMesh *source, DerivedMesh *dest, - int source_index, int dest_index, int count) + int source_index, int dest_index, int count) { CustomData_copy_data(&source->faceData, &dest->faceData, - source_index, dest_index, count); + source_index, dest_index, count); } void DM_copy_loop_data(DerivedMesh *source, DerivedMesh *dest, @@ -613,33 +590,32 @@ void DM_free_face_data(struct DerivedMesh *dm, int index, int count) } void DM_interp_vert_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, float *weights, - int count, int dest_index) + int *src_indices, float *weights, + int count, int dest_index) { CustomData_interp(&source->vertData, &dest->vertData, src_indices, - weights, NULL, count, dest_index); + weights, NULL, count, dest_index); } void DM_interp_edge_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, - float *weights, EdgeVertWeight *vert_weights, - int count, int dest_index) + int *src_indices, + float *weights, EdgeVertWeight *vert_weights, + int count, int dest_index) { CustomData_interp(&source->edgeData, &dest->edgeData, src_indices, - weights, (float*)vert_weights, count, dest_index); + weights, (float*)vert_weights, count, dest_index); } void DM_interp_tessface_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, - float *weights, FaceVertWeight *vert_weights, - int count, int dest_index) + int *src_indices, + float *weights, FaceVertWeight *vert_weights, + int count, int dest_index) { CustomData_interp(&source->faceData, &dest->faceData, src_indices, - weights, (float*)vert_weights, count, dest_index); + weights, (float*)vert_weights, count, dest_index); } - -void DM_swap_tessface_data(DerivedMesh *dm, int index, int *corner_indices) +void DM_swap_tessface_data(DerivedMesh *dm, int index, const int *corner_indices) { CustomData_swap(&dm->faceData, index, corner_indices); } @@ -750,7 +726,7 @@ static void emDM_drawMappedEdges(void *dm, int (*setDrawOptions)(void *userData, glEnd(); } } -static void emDM_drawEdges(void *dm, int drawLooseEdges) +static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges) { emDM_drawMappedEdges(dm, NULL, NULL); } @@ -825,14 +801,14 @@ static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[ { if (vertexCos) { VECCOPY(cent, vertexCos[(int) efa->v1->tmp.l]); - add_v3_v3v3(cent, cent, vertexCos[(int) efa->v2->tmp.l]); - add_v3_v3v3(cent, cent, vertexCos[(int) efa->v3->tmp.l]); - if (efa->v4) add_v3_v3v3(cent, cent, vertexCos[(int) efa->v4->tmp.l]); + add_v3_v3(cent, vertexCos[(int) efa->v2->tmp.l]); + add_v3_v3(cent, vertexCos[(int) efa->v3->tmp.l]); + if (efa->v4) add_v3_v3(cent, vertexCos[(int) efa->v4->tmp.l]); } else { VECCOPY(cent, efa->v1->co); - add_v3_v3v3(cent, cent, efa->v2->co); - add_v3_v3v3(cent, cent, efa->v3->co); - if (efa->v4) add_v3_v3v3(cent, cent, efa->v4->co); + add_v3_v3(cent, efa->v2->co); + add_v3_v3(cent, efa->v3->co); + if (efa->v4) add_v3_v3(cent, efa->v4->co); } if (efa->v4) { @@ -876,8 +852,8 @@ static void emDM_drawMappedFaces(void *dm, int (*setDrawOptions)(void *userData, draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth); if(draw) { if (draw==2) { /* enabled with stipple */ - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(stipple_quarttone); + glEnable(GL_POLYGON_STIPPLE); + glPolygonStipple(stipple_quarttone); } glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT); @@ -947,9 +923,9 @@ static void emDM_drawMappedFaces(void *dm, int (*setDrawOptions)(void *userData, } static void emDM_drawFacesTex_common(void *dm, - int (*drawParams)(MTFace *tface, MCol *mcol, int matnr), - int (*drawParamsMapped)(void *userData, int index), - void *userData) + int (*drawParams)(MTFace *tface, MCol *mcol, int matnr), + int (*drawParamsMapped)(void *userData, int index), + void *userData) { EditMeshDerivedMesh *emdm= dm; EditMesh *em= emdm->em; @@ -1125,8 +1101,8 @@ static void emDM_drawMappedFacesTex(void *dm, int (*setDrawOptions)(void *userDa } static void emDM_drawMappedFacesGLSL(void *dm, - int (*setMaterial)(int, void *attribs), - int (*setDrawOptions)(void *userData, int index), void *userData) + int (*setMaterial)(int, void *attribs), + int (*setDrawOptions)(void *userData, int index), void *userData) { EditMeshDerivedMesh *emdm= dm; EditMesh *em= emdm->em; @@ -1275,7 +1251,7 @@ static void emDM_drawMappedFacesGLSL(void *dm, } static void emDM_drawFacesGLSL(void *dm, - int (*setMaterial)(int, void *attribs)) + int (*setMaterial)(int, void *attribs)) { ((DerivedMesh*)dm)->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL); } @@ -1319,7 +1295,22 @@ static int emDM_getNumTessFaces(void *dm) return BLI_countlist(&emdm->em->faces); } -static void emDM_getVert(void *dm, int index, MVert *vert_r) +static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3]) +{ + EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; + EditVert *eve; + int i; + + for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) { + if (emdm->vertexCos) { + copy_v3_v3(cos_r[i], emdm->vertexCos[i]); + } else { + copy_v3_v3(cos_r[i], eve->co); + } + } +} + +static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r) { EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first; int i; @@ -1392,7 +1383,7 @@ static void emDM_getFace(void *dm, int index, MFace *face_r) if(!v4) face_r->v4 = 0; for(i = 0, ev = em->verts.first; v1 || v2 || v3 || v4; - i++, ev = ev->next) { + i++, ev = ev->next) { if(ev == v1) { face_r->v1 = i; v1 = NULL; @@ -1538,14 +1529,14 @@ static void emDM_release(void *dm) } static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob, - float (*vertexCos)[3]) + float (*vertexCos)[3]) { #if 0 EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm"); DM_init(&emdm->dm, DM_TYPE_EDITMESH, BLI_countlist(&em->verts), BLI_countlist(&em->edges), BLI_countlist(&em->faces), - 0, 0); + 0, 0); emdm->dm.getMinMax = emDM_getMinMax; @@ -1553,6 +1544,8 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob, emdm->dm.getNumEdges = emDM_getNumEdges; emdm->dm.getNumTessFaces = emDM_getNumTessFaces; + emdm->dm.getVertCos = emDM_getVertCos; + emdm->dm.getVert = emDM_getVert; emdm->dm.getEdge = emDM_getEdge; emdm->dm.getTessFace = emDM_getFace; @@ -1588,7 +1581,7 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob, for(eve = em->verts.first, i = 0; eve; eve = eve->next, ++i) DM_set_vert_data(&emdm->dm, i, CD_MDEFORMVERT, - CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT)); + CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT)); } if(vertexCos) { @@ -1613,15 +1606,15 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob, float *v4 = vertexCos[(int) efa->v4->tmp.l]; normal_quad_v3( no,v1, v2, v3, v4); - add_v3_v3v3(emdm->vertexNos[(int) efa->v4->tmp.l], emdm->vertexNos[(int) efa->v4->tmp.l], no); + add_v3_v3(emdm->vertexNos[(int) efa->v4->tmp.l], no); } else { normal_tri_v3( no,v1, v2, v3); } - add_v3_v3v3(emdm->vertexNos[(int) efa->v1->tmp.l], emdm->vertexNos[(int) efa->v1->tmp.l], no); - add_v3_v3v3(emdm->vertexNos[(int) efa->v2->tmp.l], emdm->vertexNos[(int) efa->v2->tmp.l], no); - add_v3_v3v3(emdm->vertexNos[(int) efa->v3->tmp.l], emdm->vertexNos[(int) efa->v3->tmp.l], no); + add_v3_v3(emdm->vertexNos[(int) efa->v1->tmp.l], no); + add_v3_v3(emdm->vertexNos[(int) efa->v2->tmp.l], no); + add_v3_v3(emdm->vertexNos[(int) efa->v3->tmp.l], no); } for(i=0, eve= em->verts.first; eve; i++, eve=eve->next) { @@ -1693,55 +1686,89 @@ static float *get_editbmesh_orco_verts(BMEditMesh *em) } /* orco custom data layer */ -static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em) +static void *get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free) +{ + *free= 0; + + if(layer == CD_ORCO) { + /* get original coordinates */ + *free= 1; + + if(em) + return (float(*)[3])get_editbmesh_orco_verts(em); + else + return (float(*)[3])get_mesh_orco_verts(ob); + } + else if(layer == CD_CLOTH_ORCO) { + /* apply shape key for cloth, this should really be solved + by a more flexible customdata system, but not simple */ + if(!em) { + ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth); + KeyBlock *kb= key_get_keyblock(ob_get_key(ob), clmd->sim_parms->shapekey_rest); + + if(kb->data) + return kb->data; + } + + return NULL; + } + + return NULL; +} + +static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, EditMesh *em, int layer) { DerivedMesh *dm; float (*orco)[3]; + int free; - if(em) { - dm= CDDM_from_BMEditMesh(em, me); - orco= (float(*)[3])get_editbmesh_orco_verts(em); - } - else { - dm= CDDM_from_mesh(me, ob); - orco= (float(*)[3])get_mesh_orco_verts(ob); + if(em) dm= CDDM_from_BMEditMesh(em, me); + else dm= CDDM_from_mesh(me, ob); + + orco= get_orco_coords_dm(ob, em, layer, &free); + + if(orco) { + CDDM_apply_vert_coords(dm, orco); + if(free) MEM_freeN(orco); } - CDDM_apply_vert_coords(dm, orco); CDDM_calc_normals(dm); - MEM_freeN(orco); return dm; } -static void add_orco_dm(Object *ob, BMEditMesh *em, DerivedMesh *dm, DerivedMesh *orcodm) +static void add_orco_dm(Object *ob, BMEditMesh *em, DerivedMesh *dm, + DerivedMesh *orcodm, int layer) { float (*orco)[3], (*layerorco)[3]; - int totvert; + int totvert, free; totvert= dm->getNumVerts(dm); if(orcodm) { orco= MEM_callocN(sizeof(float)*3*totvert, "dm orco"); + free= 1; if(orcodm->getNumVerts(orcodm) == totvert) orcodm->getVertCos(orcodm, orco); else dm->getVertCos(dm, orco); } - else { - if(em) orco= (float(*)[3])get_editbmesh_orco_verts(em); - else orco= (float(*)[3])get_mesh_orco_verts(ob); - } - - transform_mesh_orco_verts(ob->data, orco, totvert, 0); - - if((layerorco = DM_get_vert_data_layer(dm, CD_ORCO))) { - memcpy(layerorco, orco, sizeof(float)*totvert); - MEM_freeN(orco); - } else - DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco); + orco= get_orco_coords_dm(ob, em, layer, &free); + + if(orco) { + if(layer == CD_ORCO) + transform_mesh_orco_verts(ob->data, orco, totvert, 0); + + if(!(layerorco = DM_get_vert_data_layer(dm, layer))) { + DM_add_vert_layer(dm, layer, CD_CALLOC, NULL); + layerorco = DM_get_vert_data_layer(dm, layer); + } + + memcpy(layerorco, orco, sizeof(float)*3*totvert); + if(free) MEM_freeN(orco); + } } /* weight paint colors */ @@ -1862,16 +1889,16 @@ char *)&wlcol[totloop]); * - apply deform modifiers and input vertexco */ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos)[3], - DerivedMesh **deform_r, DerivedMesh **final_r, - int useRenderParams, int useDeform, - int needMapping, CustomDataMask dataMask, int index, int useCache) + DerivedMesh **deform_r, DerivedMesh **final_r, + int useRenderParams, int useDeform, + int needMapping, CustomDataMask dataMask, int index, int useCache) { Mesh *me = ob->data; ModifierData *firstmd, *md; LinkNode *datamasks, *curr; - CustomDataMask mask; + CustomDataMask mask, nextmask; float (*deformedVerts)[3] = NULL; - DerivedMesh *dm, *orcodm, *finaldm; + DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm; int numVerts = me->totvert; int required_mode; @@ -1944,6 +1971,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos */ dm = NULL; orcodm = NULL; + clothorcodm = NULL; for(;md; md = md->next, curr = curr->next) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); @@ -1960,11 +1988,13 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue; /* add an orco layer if needed by this modifier */ - if(dm && mti->requiredDataMask) { + if(mti->requiredDataMask) mask = mti->requiredDataMask(ob, md); - if(mask & CD_MASK_ORCO) - add_orco_dm(ob, NULL, dm, orcodm); - } + else + mask = 0; + + if(dm && (mask & CD_MASK_ORCO)) + add_orco_dm(ob, NULL, dm, orcodm, CD_ORCO); /* How to apply modifier depends on (a) what we already have as * a result of previous modifiers (could be a DerivedMesh or just @@ -1972,7 +2002,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos */ if(mti->type == eModifierTypeType_OnlyDeform) { - /* No existing verts to deform, need to build them. */ if(!deformedVerts) { if(dm) { @@ -1982,7 +2011,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos */ numVerts = dm->getNumVerts(dm); deformedVerts = - MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv"); + MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv"); dm->getVertCos(dm, deformedVerts); } else { deformedVerts = mesh_getVertexCos(me, &numVerts); @@ -2031,26 +2060,20 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } } - /* create an orco derivedmesh in parallel */ - mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); - if(mask & CD_MASK_ORCO) { - if(!orcodm) - orcodm= create_orco_dm(ob, me, NULL); - - mask &= ~CD_MASK_ORCO; - DM_set_only_copy(orcodm, mask); - ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, 0); - - if(ndm) { - /* if the modifier returned a new dm, release the old one */ - if(orcodm && orcodm != ndm) orcodm->release(orcodm); - orcodm = ndm; - } - } - + /* determine which data layers are needed by following modifiers */ + if(curr->next) + nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link); + else + nextmask= dataMask; + /* set the DerivedMesh to only copy needed data */ + mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); DM_set_only_copy(dm, mask); + /* add cloth rest shape key if need */ + if(mask & CD_MASK_CLOTH_ORCO) + add_orco_dm(ob, NULL, dm, clothorcodm, CD_CLOTH_ORCO); + /* add an origspace layer if needed */ if(((CustomDataMask)GET_INT_FROM_POINTER(curr->link)) & CD_MASK_ORIGSPACE) if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE)) @@ -2071,8 +2094,40 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos deformedVerts = NULL; } } + + /* create an orco derivedmesh in parallel */ + if(nextmask & CD_MASK_ORCO) { + if(!orcodm) + orcodm= create_orco_dm(ob, me, NULL, CD_ORCO); + + nextmask &= ~CD_MASK_ORCO; + DM_set_only_copy(orcodm, nextmask); + ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, 0); + + if(ndm) { + /* if the modifier returned a new dm, release the old one */ + if(orcodm && orcodm != ndm) orcodm->release(orcodm); + orcodm = ndm; + } + } + + /* create cloth orco derivedmesh in parallel */ + if(nextmask & CD_MASK_CLOTH_ORCO) { + if(!clothorcodm) + clothorcodm= create_orco_dm(ob, me, NULL, CD_CLOTH_ORCO); + + nextmask &= ~CD_MASK_CLOTH_ORCO; + DM_set_only_copy(clothorcodm, nextmask); + ndm = mti->applyModifier(md, ob, clothorcodm, useRenderParams, 0); + + if(ndm) { + /* if the modifier returned a new dm, release the old one */ + if(clothorcodm && clothorcodm != ndm) clothorcodm->release(clothorcodm); + clothorcodm = ndm; + } + } } - + /* grab modifiers until index i */ if((index >= 0) && (modifiers_indexInObject(ob, md) >= index)) break; @@ -2111,16 +2166,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* add an orco layer if needed */ if(dataMask & CD_MASK_ORCO) { - add_orco_dm(ob, NULL, finaldm, orcodm); + add_orco_dm(ob, NULL, finaldm, orcodm, CD_ORCO); if(deform_r && *deform_r) - add_orco_dm(ob, NULL, *deform_r, NULL); + add_orco_dm(ob, NULL, *deform_r, NULL, CD_ORCO); } *final_r = finaldm; if(orcodm) orcodm->release(orcodm); + if(clothorcodm) + clothorcodm->release(clothorcodm); if(deformedVerts && deformedVerts != inputVertexCos) MEM_freeN(deformedVerts); @@ -2160,8 +2217,8 @@ static int editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, Derived } static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, DerivedMesh **cage_r, - DerivedMesh **final_r, - CustomDataMask dataMask) + DerivedMesh **final_r, + CustomDataMask dataMask) { ModifierData *md; float (*deformedVerts)[3] = NULL; @@ -2198,7 +2255,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D if(dm && mti->requiredDataMask) { mask = mti->requiredDataMask(ob, md); if(mask & CD_MASK_ORCO) - add_orco_dm(ob, em, dm, orcodm); + add_orco_dm(ob, em, dm, orcodm, CD_ORCO); } /* How to apply modifier depends on (a) what we already have as @@ -2216,14 +2273,16 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D */ numVerts = dm->getNumVerts(dm); deformedVerts = - MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv"); + MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv"); dm->getVertCos(dm, deformedVerts); } else { deformedVerts = editbmesh_getVertexCos(em, &numVerts); } } - mti->deformVertsEM(md, ob, em, dm, deformedVerts, numVerts); + if (mti->deformVertsEM) + mti->deformVertsEM(md, ob, em, dm, deformedVerts, numVerts); + else mti->deformVerts(md, ob, dm, deformedVerts, numVerts, 0, 0); } else { DerivedMesh *ndm; @@ -2255,11 +2314,15 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); if(mask & CD_MASK_ORCO) { if(!orcodm) - orcodm= create_orco_dm(ob, ob->data, em); + orcodm= create_orco_dm(ob, ob->data, em, CD_ORCO); mask &= ~CD_MASK_ORCO; DM_set_only_copy(orcodm, mask); - ndm = mti->applyModifierEM(md, ob, em, orcodm); + + if (mti->applyModifierEM) + ndm = mti->applyModifierEM(md, ob, em, orcodm); + else + ndm = mti->applyModifier(md, ob, orcodm, 0, 0); if(ndm) { /* if the modifier returned a new dm, release the old one */ @@ -2275,7 +2338,10 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE)) DM_add_tessface_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL); - ndm = mti->applyModifierEM(md, ob, em, dm); + if (mti->applyModifierEM) + ndm = mti->applyModifierEM(md, ob, em, dm); + else + ndm = mti->applyModifier(md, ob, dm, 0, 0); if (ndm) { if(dm && dm != ndm) @@ -2298,8 +2364,8 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D *cage_r = dm; } else { *cage_r = - getEditDerivedBMesh(em, ob, - deformedVerts ? MEM_dupallocN(deformedVerts) : NULL); + getEditDerivedBMesh(em, ob, + deformedVerts ? MEM_dupallocN(deformedVerts) : NULL); } } } @@ -2328,7 +2394,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D /* add an orco layer if needed */ if(dataMask & CD_MASK_ORCO) - add_orco_dm(ob, em, *final_r, orcodm); + add_orco_dm(ob, em, *final_r, orcodm, CD_ORCO); if(orcodm) orcodm->release(orcodm); @@ -2363,6 +2429,15 @@ static void clear_mesh_caches(Object *ob) ob->derivedDeform->release(ob->derivedDeform); ob->derivedDeform= NULL; } + /* we free pbvh on changes, except during sculpt since it can't deal with + changing PVBH node organization, we hope topology does not change in + the meantime .. weak */ + if(ob->sculpt && ob->sculpt->pbvh) { + if(!ob->sculpt->cache) { + BLI_pbvh_free(ob->sculpt->pbvh); + ob->sculpt->pbvh= NULL; + } + } } static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask) @@ -2370,8 +2445,7 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask) Object *obact = scene->basact?scene->basact->object:NULL; int editing = paint_facesel_test(ob); /* weight paint and face select need original indicies because of selection buffer drawing */ - int needMapping = (ob==obact) && (editing || (ob->mode & OB_MODE_WEIGHT_PAINT) || editing); - float min[3], max[3]; + int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)) || editing); clear_mesh_caches(ob); @@ -2379,13 +2453,7 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask) &ob->derivedFinal, 0, 1, needMapping, dataMask, -1, 1); - INIT_MINMAX(min, max); - - ob->derivedFinal->getMinMax(ob->derivedFinal, min, max); - - if(!ob->bb) - ob->bb= MEM_callocN(sizeof(BoundBox), "bb"); - boundbox_set_from_min_max(ob->bb, min, max); + DM_set_object_boundbox (ob, ob->derivedFinal); ob->derivedFinal->needsFree = 0; ob->derivedDeform->needsFree = 0; @@ -2394,8 +2462,6 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask) static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask) { - float min[3], max[3]; - clear_mesh_caches(obedit); if (em->derivedFinal) { @@ -2412,16 +2478,9 @@ static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, C } editbmesh_calc_modifiers(scene, obedit, em, &em->derivedCage, &em->derivedFinal, dataMask); + DM_set_object_boundbox (obedit, em->derivedFinal); + em->lastDataMask = dataMask; - - INIT_MINMAX(min, max); - - em->derivedFinal->getMinMax(em->derivedFinal, min, max); - - if(!obedit->bb) - obedit->bb= MEM_callocN(sizeof(BoundBox), "bb"); - boundbox_set_from_min_max(obedit->bb, min, max); - em->derivedFinal->needsFree = 0; em->derivedCage->needsFree = 0; } @@ -2487,7 +2546,7 @@ DerivedMesh *mesh_create_derived_view(Scene *scene, Object *ob, CustomDataMask d } DerivedMesh *mesh_create_derived_no_deform(Scene *scene, Object *ob, float (*vertCos)[3], - CustomDataMask dataMask) + CustomDataMask dataMask) { DerivedMesh *final; @@ -2497,7 +2556,7 @@ DerivedMesh *mesh_create_derived_no_deform(Scene *scene, Object *ob, float (*ver } DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*vertCos)[3], - CustomDataMask dataMask) + CustomDataMask dataMask) { DerivedMesh *final; @@ -2507,8 +2566,8 @@ DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*ve } DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob, - float (*vertCos)[3], - CustomDataMask dataMask) + float (*vertCos)[3], + CustomDataMask dataMask) { DerivedMesh *final; @@ -2520,7 +2579,7 @@ DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob, /***/ DerivedMesh *editbmesh_get_derived_cage_and_final(Scene *scene, Object *obedit, BMEditMesh *em, DerivedMesh **final_r, - CustomDataMask dataMask) + CustomDataMask dataMask) { /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh @@ -2698,7 +2757,7 @@ void DM_add_tangent_layer(DerivedMesh *dm) tangent= DM_get_tessface_data_layer(dm, CD_TANGENT); /* allocate some space */ - arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "tangent layer arena"); BLI_memarena_use_calloc(arena); vtangents= MEM_callocN(sizeof(VertexTangent*)*totvert, "VertexTangent"); @@ -2869,3 +2928,17 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs, } } +/* Set object's bounding box based on DerivedMesh min/max data */ +void DM_set_object_boundbox(Object *ob, DerivedMesh *dm) +{ + float min[3], max[3]; + + INIT_MINMAX(min, max); + + dm->getMinMax(dm, min, max); + + if(!ob->bb) + ob->bb= MEM_callocN(sizeof(BoundBox), "bb"); + + boundbox_set_from_min_max(ob->bb, min, max); +} diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile index 70e1a785787..15c022592f9 100644 --- a/source/blender/blenkernel/intern/Makefile +++ b/source/blender/blenkernel/intern/Makefile @@ -85,6 +85,9 @@ CPPFLAGS += -I../../nodes #path to gpu CPPFLAGS += -I../../gpu +#modifiers got moved +CPPFLAGS += -I../../modifiers + # path to our own external headerfiles CPPFLAGS += -I.. @@ -129,6 +132,10 @@ ifeq ($(WITH_QUICKTIME), true) CPPFLAGS += -DWITH_QUICKTIME endif +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + ifeq ($(OS), darwin) ifeq ($(WITH_BF_OPENMP), true) CPPFLAGS += -DPARALLEL=1 diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 13f247e7c3c..6c8e5c48745 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include <string.h> #include <math.h> #include <stdlib.h> @@ -38,26 +34,16 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_curve_types.h" -#include "DNA_key_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_animsys.h" #include "BKE_action.h" #include "BKE_anim.h" -#include "BKE_armature.h" -#include "BKE_blender.h" #include "BKE_constraint.h" -#include "BKE_displist.h" #include "BKE_global.h" #include "BKE_fcurve.h" -#include "BKE_key.h" -#include "BKE_lattice.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_object.h" @@ -66,23 +52,22 @@ #include "BIK_api.h" -#include "BLI_math.h" #include "BLI_blenlib.h" #include "BLI_ghash.h" +#include "BLI_math.h" #include "RNA_access.h" -#include "RNA_types.h" /* *********************** NOTE ON POSE AND ACTION ********************** - Pose is the local (object level) component of armature. The current - object pose is saved in files, and (will be) is presorted for dependency + object pose is saved in files, and (will be) is presorted for dependency - Actions have fewer (or other) channels, and write data to a Pose - Currently ob->pose data is controlled in where_is_pose only. The (recalc) - event system takes care of calling that + event system takes care of calling that - The NLA system (here too) uses Poses as interpolation format for Actions - Therefore we assume poses to be static, and duplicates of poses have channels in - same order, for quick interpolation reasons + same order, for quick interpolation reasons ****************************** (ton) ************************************ */ @@ -249,6 +234,30 @@ void set_active_action_group (bAction *act, bActionGroup *agrp, short select) } } +/* Add a new action group with the given name to the action */ +bActionGroup *action_groups_add_new (bAction *act, const char name[]) +{ + bActionGroup *agrp; + + /* sanity check: must have action and name */ + if (ELEM(NULL, act, name)) + return NULL; + + /* allocate a new one */ + agrp = MEM_callocN(sizeof(bActionGroup), "bActionGroup"); + + /* make it selected, with default name */ + agrp->flag = AGRP_SELECTED; + strncpy(agrp->name, name[0] ? name : "Group", sizeof(agrp->name)); + + /* add to action, and validate */ + BLI_addtail(&act->groups, agrp); + BLI_uniquename(&act->groups, agrp, "Group", '.', offsetof(bActionGroup, name), sizeof(agrp->name)); + + /* return the new group */ + return agrp; +} + /* Add given channel into (active) group * - assumes that channel is not linked to anything anymore * - always adds at the end of the group @@ -382,6 +391,9 @@ bPoseChannel *get_pose_channel(const bPose *pose, const char *name) if (ELEM(NULL, pose, name) || (name[0] == 0)) return NULL; + if(pose->chanhash) + return BLI_ghash_lookup(pose->chanhash, (void *)name); + return BLI_findstring(&((bPose *)pose)->chanbase, name, offsetof(bPoseChannel, name)); } @@ -417,6 +429,7 @@ bPoseChannel *verify_pose_channel(bPose *pose, const char *name) chan->protectflag = OB_LOCK_ROT4D; /* lock by components by default */ BLI_addtail(&pose->chanbase, chan); + free_pose_channels_hash(pose); return chan; } @@ -480,7 +493,7 @@ void copy_pose (bPose **dst, bPose *src, int copycon) for (pchan=outPose->chanbase.first; pchan; pchan=pchan->next) { // TODO: rename this argument... if (copycon) { - copy_constraints(&listb, &pchan->constraints); // copy_constraints NULLs listb + copy_constraints(&listb, &pchan->constraints, TRUE); // copy_constraints NULLs listb pchan->constraints= listb; pchan->path= NULL; // XXX remove this line when the new motionpaths are ready... (depreceated code) pchan->mpath= NULL; /* motion paths should not get copied yet... */ @@ -531,6 +544,26 @@ void init_pose_ikparam(bPose *pose) } } +void make_pose_channels_hash(bPose *pose) +{ + if(!pose->chanhash) { + bPoseChannel *pchan; + + pose->chanhash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "make_pose_chan gh"); + for(pchan=pose->chanbase.first; pchan; pchan=pchan->next) + BLI_ghash_insert(pose->chanhash, pchan->name, pchan); + } +} + +void free_pose_channels_hash(bPose *pose) +{ + if(pose->chanhash) { + BLI_ghash_free(pose->chanhash, NULL, NULL); + pose->chanhash= NULL; + } +} + + void free_pose_channel(bPoseChannel *pchan) { // XXX this case here will need to be removed when the new motionpaths are ready @@ -562,6 +595,8 @@ void free_pose_channels(bPose *pose) BLI_freelistN(&pose->chanbase); } + + free_pose_channels_hash(pose); } void free_pose(bPose *pose) @@ -632,7 +667,7 @@ void duplicate_pose_channel_data(bPoseChannel *pchan, const bPoseChannel *pchan_ pchan->iklinweight= pchan_from->iklinweight; /* constraints */ - copy_constraints(&pchan->constraints, &pchan_from->constraints); + copy_constraints(&pchan->constraints, &pchan_from->constraints, TRUE); /* id-properties */ if(pchan->prop) { @@ -1075,7 +1110,6 @@ void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose, copy_m4_m4(workob->parentinv, ob->parentinv); copy_m4_m4(workob->constinv, ob->constinv); workob->parent= ob->parent; - workob->track= ob->track; workob->rotmode= ob->rotmode; @@ -1150,17 +1184,17 @@ static void blend_pose_strides(bPose *dst, bPose *src, float srcweight, short mo bone matching diagram, strips A and B - .------------------------. - | A | - '------------------------' + .------------------------. + | A | + '------------------------' . . b2 - . .-------------v----------. - . | B . | - . '------------------------' - . . . - . . . + . .-------------v----------. + . | B . | + . '------------------------' + . . . + . . . offset: . 0 . A-B . A-b2+B - . . . + . . . */ @@ -1217,12 +1251,12 @@ static void blend_pose_offset_bone(bActionStrip *strip, bPose *dst, bPose *src, /* if blending, we only add with factor scrweight */ mul_v3_fl(vec, srcweight); - add_v3_v3v3(dst->cyclic_offset, dst->cyclic_offset, vec); + add_v3_v3(dst->cyclic_offset, vec); } } } - add_v3_v3v3(dst->cyclic_offset, dst->cyclic_offset, src->cyclic_offset); + add_v3_v3(dst->cyclic_offset, src->cyclic_offset); } /* added "sizecorr" here, to allow armatures to be scaled and still have striding. @@ -1384,7 +1418,7 @@ static void do_nla(Scene *scene, Object *ob, int blocktype) bActionStrip *strip, *striplast=NULL, *stripfirst=NULL; float striptime, frametime, length, actlength; float blendfac, stripframe; - float scene_cfra= frame_to_float(scene, scene->r.cfra); + float scene_cfra= BKE_curframe(scene); int doit, dostride; if(blocktype==ID_AR) { @@ -1582,7 +1616,7 @@ static void do_nla(Scene *scene, Object *ob, int blocktype) } else if(blocktype==ID_AR) { /* apply stride offset to object */ - add_v3_v3v3(ob->obmat[3], ob->obmat[3], ob->pose->stride_offset); + add_v3_v3(ob->obmat[3], ob->pose->stride_offset); } /* free */ diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index ddd5405a4c1..8c8567fdec9 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -40,31 +40,21 @@ #include "BLI_math.h" #include "BLI_rand.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_curve_types.h" -#include "DNA_effect_types.h" #include "DNA_group_types.h" #include "DNA_key_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" #include "DNA_view3d_types.h" #include "DNA_vfont_types.h" #include "BKE_anim.h" -#include "BKE_animsys.h" #include "BKE_curve.h" #include "BKE_DerivedMesh.h" -#include "BKE_displist.h" -#include "BKE_effect.h" +#include "BKE_depsgraph.h" #include "BKE_font.h" #include "BKE_group.h" #include "BKE_global.h" @@ -77,13 +67,9 @@ #include "BKE_scene.h" #include "BKE_utildefines.h" #include "BKE_tessmesh.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif +#include "BKE_depsgraph.h" // XXX bad level call... -#include "ED_mesh.h" /* --------------------- */ /* forward declarations */ @@ -206,10 +192,15 @@ bMotionPath *animviz_verify_motionpaths(Scene *scene, Object *ob, bPoseChannel * if (avs->path_bakeflag & MOTIONPATH_BAKE_HEADS) mpath->flag |= MOTIONPATH_FLAG_BHEAD; + else + mpath->flag &= ~MOTIONPATH_FLAG_BHEAD; /* allocate a cache */ mpath->points= MEM_callocN(sizeof(bMotionPathVert)*mpath->length, "bMotionPathVerts"); + /* tag viz settings as currently having some path(s) which use it */ + avs->path_bakeflag |= MOTIONPATH_BAKE_HAS_PATHS; + /* return it */ return mpath; } @@ -266,6 +257,83 @@ void animviz_get_object_motionpaths(Object *ob, ListBase *targets) /* ........ */ +/* Note on evaluation optimisations: + * Optimisations currently used here play tricks with the depsgraph in order to try and + * evaluate as few objects as strictly necessary to get nicer performance under standard + * production conditions. For those people who really need the accurate version, + * disable the ifdef (i.e. 1 -> 0) and comment out the call to motionpaths_calc_optimise_depsgraph() + */ + +/* tweak the object ordering to trick depsgraph into making MotionPath calculations run faster */ +static void motionpaths_calc_optimise_depsgraph(Scene *scene, ListBase *targets) +{ + Base *base, *baseNext; + MPathTarget *mpt; + + /* make sure our temp-tag isn't already in use */ + for (base= scene->base.first; base; base= base->next) + base->object->flag &= ~BA_TEMP_TAG; + + /* for each target, dump its object to the start of the list if it wasn't moved already */ + for (mpt= targets->first; mpt; mpt= mpt->next) { + for (base=scene->base.first; base; base=baseNext) { + baseNext = base->next; + + if ((base->object == mpt->ob) && !(mpt->ob->flag & BA_TEMP_TAG)) { + BLI_remlink(&scene->base, base); + BLI_addhead(&scene->base, base); + + mpt->ob->flag |= BA_TEMP_TAG; + break; // we really don't need to continue anymore once this happens, but this line might really 'break' + } + } + } + + /* "brew me a list that's sorted a bit faster now depsy" */ + DAG_scene_sort(scene); +} + +/* update scene for current frame */ +static void motionpaths_calc_update_scene(Scene *scene) +{ +#if 1 // 'production' optimisations always on + Base *base, *last=NULL; + + /* only stuff that moves or needs display still */ + DAG_scene_update_flags(scene, scene->lay); + + /* find the last object with the tag + * - all those afterwards are assumed to not be relevant for our calculations + */ + // optimise further by moving out... + for (base=scene->base.first; base; base=base->next) { + if (base->object->flag & BA_TEMP_TAG) + last = base; + } + + /* perform updates for tagged objects */ + // XXX: this will break if rigs depend on scene or other data that + // is animated but not attached to/updatable from objects + for (base=scene->base.first; base; base=base->next) { + /* update this object */ + object_handle_update(scene, base->object); + + /* if this is the last one we need to update, let's stop to save some time */ + if (base == last) + break; + } +#else // original, 'always correct' version + /* do all updates + * - if this is too slow, resort to using a more efficient way + * that doesn't force complete update, but for now, this is the + * most accurate way! + */ + scene_update_for_newframe(scene, scene->lay); // XXX this is the best way we can get anything moving +#endif +} + +/* ........ */ + /* perform baking for the targets on the current frame */ static void motionpaths_calc_bake_targets(Scene *scene, ListBase *targets) { @@ -327,7 +395,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) // TODO: this method could be improved... // 1) max range for standard baking - // 2) minimum range for recalc baking (i.e. between keyfames, but how?) + // 2) minimum range for recalc baking (i.e. between keyframes, but how?) for (mpt= targets->first; mpt; mpt= mpt->next) { /* try to increase area to do (only as much as needed) */ sfra= MIN2(sfra, mpt->mpath->start_frame); @@ -335,14 +403,14 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) } if (efra <= sfra) return; + /* optimise the depsgraph for faster updates */ + // TODO: whether this is used should depend on some setting for the level of optimisations used + motionpaths_calc_optimise_depsgraph(scene, targets); + /* calculate path over requested range */ for (CFRA=sfra; CFRA<=efra; CFRA++) { - /* do all updates - * - if this is too slow, resort to using a more efficient way - * that doesn't force complete update, but for now, this is the - * most accurate way! - */ - scene_update_for_newframe(scene, scene->lay); // XXX this is the best way we can get anything moving + /* update relevant data for new frame */ + motionpaths_calc_update_scene(scene); /* perform baking for targets */ motionpaths_calc_bake_targets(scene, targets); @@ -350,7 +418,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) /* reset original environment */ CFRA= cfra; - scene_update_for_newframe(scene, scene->lay); // XXX this is the best way we can get anything moving + motionpaths_calc_update_scene(scene); /* clear recalc flags from targets */ for (mpt= targets->first; mpt; mpt= mpt->next) { @@ -410,7 +478,7 @@ void calc_curvepath(Object *ob) bl= cu->bev.first; if(bl==NULL || !bl->nr) return; - cu->path=path= MEM_callocN(sizeof(Path), "path"); + cu->path=path= MEM_callocN(sizeof(Path), "calc_curvepath"); /* if POLY: last vertice != first vertice */ cycl= (bl->poly!= -1); @@ -451,7 +519,7 @@ void calc_curvepath(Object *ob) fp= dist+1; maxdist= dist+tot; fac= 1.0f/((float)path->len-1.0f); - fac = fac * path->totdist; + fac = fac * path->totdist; for(a=0; a<path->len; a++) { @@ -476,6 +544,7 @@ void calc_curvepath(Object *ob) interp_v3_v3v3(pp->vec, bevp->vec, bevpn->vec, fac2); pp->vec[3]= fac1*bevp->alfa + fac2*bevpn->alfa; pp->radius= fac1*bevp->radius + fac2*bevpn->radius; + pp->weight= fac1*bevp->weight + fac2*bevpn->weight; interp_qt_qtqt(pp->quat, bevp->quat, bevpn->quat, fac2); normalize_qt(pp->quat); @@ -507,7 +576,7 @@ int interval_test(int min, int max, int p1, int cycl) * - *vec needs FOUR items! * - ctime is normalized range <0-1> */ -int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius) /* returns OK */ +int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius, float *weight) /* returns OK */ { Curve *cu; Nurb *nu; @@ -603,6 +672,9 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat, if(radius) *radius= data[0]*p0->radius + data[1]*p1->radius + data[2]*p2->radius + data[3]*p3->radius; + if(weight) + *weight= data[0]*p0->weight + data[1]*p1->weight + data[2]*p2->weight + data[3]*p3->weight; + return 1; } @@ -658,11 +730,21 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i } dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0, OB_DUPLIGROUP, animated); - dob->no_draw= (dob->origlay & group->layer)==0; - + + /* check the group instance and object layers match, also that the object visible flags are ok. */ + if( (dob->origlay & group->layer)==0 || + (G.rendering==0 && dob->ob->restrictflag & OB_RESTRICT_VIEW) || + (G.rendering && dob->ob->restrictflag & OB_RESTRICT_RENDER) + ) { + dob->no_draw= 1; + } + else { + dob->no_draw= 0; + } + if(go->ob->transflag & OB_DUPLI) { copy_m4_m4(dob->ob->obmat, dob->mat); - object_duplilist_recursive((ID *)group, scene, go->ob, lb, ob->obmat, level+1, animated); + object_duplilist_recursive(&group->id, scene, go->ob, lb, ob->obmat, level+1, animated); copy_m4_m4(dob->ob->obmat, dob->omat); } } @@ -680,7 +762,7 @@ static void frames_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, if(level>MAX_DUPLI_RECUR) return; cfrao= scene->r.cfra; - if(ob->parent==NULL && ob->track==NULL && ob->ipo==NULL && ob->constraints.first==NULL) return; + if(ob->parent==NULL && ob->constraints.first==NULL) return; if(ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0; copyob= *ob; /* store transform info */ @@ -729,10 +811,9 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n vertexDupliData *vdd= userData; float vec[3], q2[4], mat[3][3], tmat[4][4], obmat[4][4]; - VECCOPY(vec, co); - mul_m4_v3(vdd->pmat, vec); - sub_v3_v3v3(vec, vec, vdd->pmat[3]); - add_v3_v3v3(vec, vec, vdd->obmat[3]); + mul_v3_m4v3(vec, vdd->pmat, co); + sub_v3_v3(vec, vdd->pmat[3]); + add_v3_v3(vec, vdd->obmat[3]); copy_m4_m4(obmat, vdd->obmat); VECCOPY(obmat[3], vec); @@ -848,7 +929,7 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl /* mballs have a different dupli handling */ if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */ - if(par->mode & OB_MODE_EDIT) { + if(me->edit_btmesh) { dm->foreachMappedVert(dm, vertex_dupli__mapFunc, (void*) &vdd); } else { @@ -988,7 +1069,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa mul_m4_v3(pmat, cent); sub_v3_v3v3(cent, cent, pmat[3]); - add_v3_v3v3(cent, cent, ob__obmat[3]); + add_v3_v3(cent, ob__obmat[3]); copy_m4_m4(obmat, ob__obmat); @@ -1011,7 +1092,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa copy_m4_m4(tmat, obmat); mul_m4_m4m3(obmat, tmat, mat); - dob= new_dupli_object(lb, ob, obmat, lay, a, OB_DUPLIFACES, animated); + dob= new_dupli_object(lb, ob, obmat, par->lay, a, OB_DUPLIFACES, animated); if(G.rendering) { w= (mv4)? 0.25f: 1.0f/3.0f; @@ -1056,7 +1137,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa else go= go->next; /* group loop */ } - if(par->mode & OB_MODE_EDIT) { + if(em) { MEM_freeN(mface); MEM_freeN(mvert); } @@ -1081,7 +1162,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p ParticleCacheKey *cache; float ctime, pa_time, scale = 1.0f; float tmat[4][4], mat[4][4], pamat[4][4], vec[3], size=0.0; - float (*obmat)[4], (*oldobmat)[4], recurs_mat[4][4]; + float (*obmat)[4], (*oldobmat)[4]; int lay, a, b, counter, hair = 0; int totpart, totchild, totgroup=0, pa_num; @@ -1098,10 +1179,6 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p if(!psys_check_enabled(par, psys)) return; - /* particles are already in world space, don't want the object mat twice */ - if(par_space_mat) - mul_m4_m4m4(recurs_mat, psys->imat, par_space_mat); - ctime = bsystem_time(scene, par, (float)scene->r.cfra, 0.0); totpart = psys->totpart; @@ -1110,11 +1187,21 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p BLI_srandom(31415926 + psys->seed); lay= scene->lay; - if((psys->renderdata || part->draw_as==PART_DRAW_REND) && - ((part->ren_as == PART_DRAW_OB && part->dup_ob) || - (part->ren_as == PART_DRAW_GR && part->dup_group && part->dup_group->gobject.first))) { + if((psys->renderdata || part->draw_as==PART_DRAW_REND) && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) { - psys_check_group_weights(part); + /* first check for loops (particle system object used as dupli object) */ + if(part->ren_as == PART_DRAW_OB) { + if(ELEM(part->dup_ob, NULL, par)) + return; + } + else { /*PART_DRAW_GR */ + if(part->dup_group == NULL || part->dup_group->gobject.first == NULL) + return; + + for(go=part->dup_group->gobject.first; go; go=go->next) + if(go->ob == par) + return; + } /* if we have a hair particle system, use the path cache */ if(part->type == PART_HAIR) { @@ -1128,6 +1215,8 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p totpart = psys->totcached; } + psys_check_group_weights(part); + psys->lattice = psys_get_lattice(&sim); /* gather list of objects or single object */ @@ -1245,7 +1334,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p mul_m4_m4m4(tmat, oblist[b]->obmat, pamat); mul_mat3_m4_fl(tmat, size*scale); if(par_space_mat) - mul_m4_m4m4(mat, tmat, recurs_mat); + mul_m4_m4m4(mat, tmat, par_space_mat); else copy_m4_m4(mat, tmat); @@ -1271,7 +1360,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p VECADD(tmat[3], tmat[3], vec); if(par_space_mat) - mul_m4_m4m4(mat, tmat, recurs_mat); + mul_m4_m4m4(mat, tmat, par_space_mat); else copy_m4_m4(mat, tmat); @@ -1442,7 +1531,10 @@ void free_object_duplilist(ListBase *lb) { DupliObject *dob; - for(dob= lb->first; dob; dob= dob->next) { + /* loop in reverse order, if object is instanced multiple times + the original layer may not really be original otherwise, proper + solution is more complicated */ + for(dob= lb->last; dob; dob= dob->prev) { dob->ob->lay= dob->origlay; copy_m4_m4(dob->ob->obmat, dob->omat); } diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index a880417a111..10c2c1801cb 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -36,7 +36,6 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_dynstr.h" #include "DNA_anim_types.h" @@ -51,7 +50,6 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_types.h" #include "nla_private.h" @@ -274,7 +272,7 @@ static short check_rna_path_is_valid (ID *owner_id, char *path) /* Check if some given RNA Path needs fixing - free the given path and set a new one as appropriate * NOTE: we assume that oldName and newName have [" "] padding around them */ -static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldpath) +static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldpath, int verify_paths) { char *prefixPtr= strstr(oldpath, prefix); char *oldNamePtr= strstr(oldpath, oldName); @@ -286,7 +284,7 @@ static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, cha */ if ( (prefixPtr && oldNamePtr) && (prefixPtr+prefixLen == oldNamePtr) ) { /* if we haven't aren't able to resolve the path now, try again after fixing it */ - if (check_rna_path_is_valid(owner_id, oldpath) == 0) { + if (!verify_paths || check_rna_path_is_valid(owner_id, oldpath) == 0) { DynStr *ds= BLI_dynstr_new(); char *postfixPtr= oldNamePtr+oldNameLen; char *newPath = NULL; @@ -315,7 +313,7 @@ static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, cha /* check if the new path will solve our problems */ // TODO: will need to check whether this step really helps in practice - if (check_rna_path_is_valid(owner_id, newPath)) { + if (!verify_paths || check_rna_path_is_valid(owner_id, newPath)) { /* free the old path, and return the new one, since we've solved the issues */ MEM_freeN(oldpath); return newPath; @@ -332,7 +330,7 @@ static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, cha } /* Check RNA-Paths for a list of F-Curves */ -static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *curves) +static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *curves, int verify_paths) { FCurve *fcu; @@ -340,7 +338,20 @@ static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, for (fcu= curves->first; fcu; fcu= fcu->next) { /* firstly, handle the F-Curve's own path */ if (fcu->rna_path) - fcu->rna_path= rna_path_rename_fix(owner_id, prefix, oldName, newName, fcu->rna_path); + fcu->rna_path= rna_path_rename_fix(owner_id, prefix, oldName, newName, fcu->rna_path, verify_paths); + } +} + +/* Check RNA-Paths for a list of Drivers */ +static void drivers_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldKey, char *newKey, ListBase *curves, int verify_paths) +{ + FCurve *fcu; + + /* we need to check every curve - drivers are F-Curves too! */ + for (fcu= curves->first; fcu; fcu= fcu->next) { + /* firstly, handle the F-Curve's own path */ + if (fcu->rna_path) + fcu->rna_path= rna_path_rename_fix(owner_id, prefix, oldKey, newKey, fcu->rna_path, verify_paths); /* driver? */ if (fcu->driver) { @@ -354,15 +365,16 @@ static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, { /* rename RNA path */ if (dtar->rna_path) - dtar->rna_path= rna_path_rename_fix(dtar->id, prefix, oldName, newName, dtar->rna_path); + dtar->rna_path= rna_path_rename_fix(dtar->id, prefix, oldKey, newKey, dtar->rna_path, verify_paths); /* also fix the bone-name (if applicable) */ - // XXX this has been disabled because the old/new names have padding which means this check will fail - //if ( ((dtar->id) && (GS(dtar->id->name) == ID_OB)) && - // (dtar->pchan_name[0]) && (strcmp(oldName, dtar->pchan_name)==0) ) - //{ - // BLI_strncpy(dtar->pchan_name, newName, sizeof(dtar->pchan_name)); - //} + if (strstr(prefix, "bones")) { + if ( ((dtar->id) && (GS(dtar->id->name) == ID_OB)) && + (dtar->pchan_name[0]) && (strcmp(oldName, dtar->pchan_name)==0) ) + { + BLI_strncpy(dtar->pchan_name, newName, sizeof(dtar->pchan_name)); + } + } } DRIVER_TARGETS_LOOPER_END } @@ -371,7 +383,7 @@ static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, } /* Fix all RNA-Paths for Actions linked to NLA Strips */ -static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *strips) +static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *strips, int verify_paths) { NlaStrip *strip; @@ -379,11 +391,11 @@ static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName for (strip= strips->first; strip; strip= strip->next) { /* fix strip's action */ if (strip->act) - fcurves_path_rename_fix(owner_id, prefix, oldName, newName, &strip->act->curves); + fcurves_path_rename_fix(owner_id, prefix, oldName, newName, &strip->act->curves, verify_paths); /* ignore own F-Curves, since those are local... */ /* check sub-strips (if metas) */ - nlastrips_path_rename_fix(owner_id, prefix, oldName, newName, &strip->strips); + nlastrips_path_rename_fix(owner_id, prefix, oldName, newName, &strip->strips, verify_paths); } } @@ -391,31 +403,37 @@ static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName * NOTE: it is assumed that the structure we're replacing is <prefix><["><name><"]> * i.e. pose.bones["Bone"] */ -void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, char *oldName, char *newName) +void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths) { NlaTrack *nlt; char *oldN, *newN; /* if no AnimData, no need to proceed */ - if (ELEM4(NULL, owner_id, adt, oldName, newName)) + if (ELEM(NULL, owner_id, adt)) return; - /* pad the names with [" "] so that only exact matches are made */ - oldN= BLI_sprintfN("[\"%s\"]", oldName); - newN= BLI_sprintfN("[\"%s\"]", newName); + if ((oldName != NULL) && (newName != NULL)) { + /* pad the names with [" "] so that only exact matches are made */ + oldN= BLI_sprintfN("[\"%s\"]", oldName); + newN= BLI_sprintfN("[\"%s\"]", newName); + } + else { + oldN= BLI_sprintfN("[%d]", oldSubscript); + newN= BLI_sprintfN("[%d]", newSubscript); + } /* Active action and temp action */ if (adt->action) - fcurves_path_rename_fix(owner_id, prefix, oldN, newN, &adt->action->curves); + fcurves_path_rename_fix(owner_id, prefix, oldN, newN, &adt->action->curves, verify_paths); if (adt->tmpact) - fcurves_path_rename_fix(owner_id, prefix, oldN, newN, &adt->tmpact->curves); + fcurves_path_rename_fix(owner_id, prefix, oldN, newN, &adt->tmpact->curves, verify_paths); /* Drivers - Drivers are really F-Curves */ - fcurves_path_rename_fix(owner_id, prefix, oldN, newN, &adt->drivers); + drivers_path_rename_fix(owner_id, prefix, oldName, newName, oldN, newN, &adt->drivers, verify_paths); /* NLA Data - Animation Data for Strips */ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) - nlastrips_path_rename_fix(owner_id, prefix, oldN, newN, &nlt->strips); + nlastrips_path_rename_fix(owner_id, prefix, oldN, newN, &nlt->strips, verify_paths); /* free the temp names */ MEM_freeN(oldN); @@ -482,7 +500,7 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa #define RENAMEFIX_ANIM_IDS(first) \ for (id= first; id; id= id->next) { \ AnimData *adt= BKE_animdata_from_id(id); \ - BKE_animdata_fix_paths_rename(id, adt, prefix, oldName, newName);\ + BKE_animdata_fix_paths_rename(id, adt, prefix, oldName, newName, 0, 0, 1);\ } /* nodes */ @@ -532,11 +550,11 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa /* do compositing nodes first (since these aren't included in main tree) */ if (scene->nodetree) { AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree); - BKE_animdata_fix_paths_rename((ID *)scene->nodetree, adt2, prefix, oldName, newName); + BKE_animdata_fix_paths_rename((ID *)scene->nodetree, adt2, prefix, oldName, newName, 0, 0, 1); } /* now fix scene animation data as per normal */ - BKE_animdata_fix_paths_rename((ID *)id, adt, prefix, oldName, newName); + BKE_animdata_fix_paths_rename((ID *)id, adt, prefix, oldName, newName, 0, 0, 1); } } @@ -552,15 +570,9 @@ KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[] KS_Path *ksp; /* sanity checks */ - if ELEM(NULL, ks, rna_path) + if ELEM3(NULL, ks, rna_path, id) return NULL; - /* ID is optional for relative KeyingSets, but is necessary for absolute KeyingSets */ - if (id == NULL) { - if (ks->flag & KEYINGSET_ABSOLUTE) - return NULL; - } - /* loop over paths in the current KeyingSet, finding the first one where all settings match * (i.e. the first one where none of the checks fail and equal 0) */ @@ -568,7 +580,7 @@ KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[] short eq_id=1, eq_path=1, eq_index=1, eq_group=1; /* id */ - if ((ks->flag & KEYINGSET_ABSOLUTE) && (id != ksp->id)) + if (id != ksp->id) eq_id= 0; /* path */ @@ -621,53 +633,48 @@ KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, sho return ks; } -/* Add a destination to a KeyingSet. Nothing is returned for now... +/* Add a path to a KeyingSet. Nothing is returned for now... * Checks are performed to ensure that destination is appropriate for the KeyingSet in question */ -void BKE_keyingset_add_path (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, short flag, short groupmode) +KS_Path *BKE_keyingset_add_path (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, short flag, short groupmode) { KS_Path *ksp; /* sanity checks */ if ELEM(NULL, ks, rna_path) { - printf("ERROR: no Keying Set and/or RNA Path to add destination with \n"); - return; + printf("ERROR: no Keying Set and/or RNA Path to add path with \n"); + return NULL; } - /* ID is optional for relative KeyingSets, but is necessary for absolute KeyingSets */ + /* ID is required for all types of KeyingSets */ if (id == NULL) { - if (ks->flag & KEYINGSET_ABSOLUTE) { - printf("ERROR: No ID provided for absolute destination. \n"); - return; - } + printf("ERROR: No ID provided for Keying Set Path. \n"); + return NULL; } /* don't add if there is already a matching KS_Path in the KeyingSet */ if (BKE_keyingset_find_path(ks, id, group_name, rna_path, array_index, groupmode)) { if (G.f & G_DEBUG) printf("ERROR: destination already exists in Keying Set \n"); - return; + return NULL; } /* allocate a new KeyingSet Path */ ksp= MEM_callocN(sizeof(KS_Path), "KeyingSet Path"); /* just store absolute info */ - if (ks->flag & KEYINGSET_ABSOLUTE) { - ksp->id= id; - if (group_name) - BLI_snprintf(ksp->group, 64, group_name); - else - strcpy(ksp->group, ""); - } + ksp->id= id; + if (group_name) + BLI_snprintf(ksp->group, 64, group_name); + else + strcpy(ksp->group, ""); /* store additional info for relative paths (just in case user makes the set relative) */ if (id) ksp->idtype= GS(id->name); /* just copy path info */ - // XXX no checks are performed for templates yet - // should array index be checked too? + // TODO: should array index be checked too? ksp->rna_path= BLI_strdupn(rna_path, strlen(rna_path)); ksp->array_index= array_index; @@ -677,20 +684,37 @@ void BKE_keyingset_add_path (KeyingSet *ks, ID *id, const char group_name[], con /* add KeyingSet path to KeyingSet */ BLI_addtail(&ks->paths, ksp); + + /* return this path */ + return ksp; } +/* Free the given Keying Set path */ +void BKE_keyingset_free_path (KeyingSet *ks, KS_Path *ksp) +{ + /* sanity check */ + if ELEM(NULL, ks, ksp) + return; + + /* free RNA-path info */ + MEM_freeN(ksp->rna_path); + + /* free path itself */ + BLI_freelinkN(&ks->paths, ksp); +} + /* Copy all KeyingSets in the given list */ -void BKE_keyingsets_copy(ListBase *newlist, ListBase *list) +void BKE_keyingsets_copy (ListBase *newlist, ListBase *list) { KeyingSet *ksn; KS_Path *kspn; - + BLI_duplicatelist(newlist, list); - for(ksn=newlist->first; ksn; ksn=ksn->next) { + for (ksn=newlist->first; ksn; ksn=ksn->next) { BLI_duplicatelist(&ksn->paths, &ksn->paths); - - for(kspn=ksn->paths.first; kspn; kspn=kspn->next) + + for (kspn=ksn->paths.first; kspn; kspn=kspn->next) kspn->rna_path= MEM_dupallocN(kspn->rna_path); } } @@ -709,12 +733,7 @@ void BKE_keyingset_free (KeyingSet *ks) /* free each path as we go to avoid looping twice */ for (ksp= ks->paths.first; ksp; ksp= kspn) { kspn= ksp->next; - - /* free RNA-path info */ - MEM_freeN(ksp->rna_path); - - /* free path itself */ - BLI_freelinkN(&ks->paths, ksp); + BKE_keyingset_free_path(ks, ksp); } } @@ -768,28 +787,43 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i PropertyRNA *prop; PointerRNA new_ptr; + //printf("%p %s %i %f\n", ptr, path, array_index, value); + /* get property to write to */ if (RNA_path_resolve(ptr, path, &new_ptr, &prop)) { /* set value - only for animatable numerical values */ if (RNA_property_animateable(&new_ptr, prop)) { + int array_len= RNA_property_array_length(&new_ptr, prop); + + if(array_len && array_index >= array_len) + { + if (G.f & G_DEBUG) { + printf("Animato: Invalid array index. ID = '%s', '%s[%d]', array length is %d \n", + (ptr && ptr->id.data) ? (((ID *)ptr->id.data)->name+2) : "<No ID>", + path, array_index, array_len-1); + } + + return 0; + } + switch (RNA_property_type(prop)) { case PROP_BOOLEAN: - if (RNA_property_array_length(&new_ptr, prop)) + if (array_len) RNA_property_boolean_set_index(&new_ptr, prop, array_index, (int)value); else RNA_property_boolean_set(&new_ptr, prop, (int)value); break; case PROP_INT: - if (RNA_property_array_length(&new_ptr, prop)) + if (array_len) RNA_property_int_set_index(&new_ptr, prop, array_index, (int)value); else RNA_property_int_set(&new_ptr, prop, (int)value); break; case PROP_FLOAT: - if (RNA_property_array_length(&new_ptr, prop)) + if (array_len) RNA_property_float_set_index(&new_ptr, prop, array_index, value); else RNA_property_float_set(&new_ptr, prop, value); @@ -811,7 +845,7 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i // XXX don't tag as failed yet though, as there are some legit situations (Action Constraint) // where some channels will not exist, but shouldn't lock up Action if (G.f & G_DEBUG) { - printf("Animato: Invalid path. ID = '%s', '%s [%d]' \n", + printf("Animato: Invalid path. ID = '%s', '%s[%d]' \n", (ptr && ptr->id.data) ? (((ID *)ptr->id.data)->name+2) : "<No ID>", path, array_index); } @@ -983,6 +1017,14 @@ static void nlastrip_evaluate_controls (NlaStrip *strip, float ctime) /* execute these settings as per normal */ animsys_evaluate_fcurves(&strip_ptr, &strip->fcurves, NULL, ctime); } + + /* if user can control the evaluation time (using F-Curves), consider the option which allows this time to be clamped + * to lie within extents of the action-clip, so that a steady changing rate of progress through several cycles of the clip + * can be achieved easily + */ + // NOTE: if we add any more of these special cases, we better group them up nicely... + if ((strip->flag & NLASTRIP_FLAG_USR_TIME) && (strip->flag & NLASTRIP_FLAG_USR_TIME_CYCLIC)) + strip->strip_time= fmod(strip->strip_time - strip->actstart, strip->actend - strip->actstart); } /* gets the strip active at the current time for a list of strips for evaluation purposes */ @@ -1718,7 +1760,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re */ // TODO: need to double check that this all works correctly if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM)) - { + { /* evaluate NLA data */ if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) { @@ -1778,9 +1820,10 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime) */ #define EVAL_ANIM_IDS(first, aflag) \ for (id= first; id; id= id->next) { \ - AnimData *adt= BKE_animdata_from_id(id); \ - if ( (id->us > 1) || (id->us && !(id->flag & LIB_FAKEUSER)) ) \ + if (ID_REAL_USERS(id) > 0) { \ + AnimData *adt= BKE_animdata_from_id(id); \ BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \ + } \ } /* optimisation: diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 41fe3da248e..c44406b5ed4 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -40,27 +40,22 @@ #include "DNA_anim_types.h" #include "DNA_armature_types.h" -#include "DNA_action_types.h" -#include "DNA_curve_types.h" #include "DNA_constraint_types.h" #include "DNA_mesh_types.h" #include "DNA_lattice_types.h" #include "DNA_meshdata_types.h" #include "DNA_nla_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" #include "BKE_animsys.h" #include "BKE_armature.h" #include "BKE_action.h" #include "BKE_anim.h" -#include "BKE_blender.h" #include "BKE_constraint.h" #include "BKE_curve.h" -#include "BKE_deform.h" #include "BKE_depsgraph.h" #include "BKE_DerivedMesh.h" +#include "BKE_deform.h" #include "BKE_displist.h" #include "BKE_global.h" #include "BKE_idprop.h" @@ -68,15 +63,10 @@ #include "BKE_lattice.h" #include "BKE_main.h" #include "BKE_object.h" -#include "BKE_object.h" #include "BKE_utildefines.h" #include "BIK_api.h" #include "BKE_sketch.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - /* **************** Generic Functions, data level *************** */ bArmature *add_armature(char *name) @@ -373,14 +363,14 @@ void bone_flip_name (char *name, int strip_number) * axis: the axis to name on * head/tail: the head/tail co-ordinate of the bone on the specified axis */ -void bone_autoside_name (char *name, int strip_number, short axis, float head, float tail) +int bone_autoside_name (char *name, int strip_number, short axis, float head, float tail) { unsigned int len; char basename[32]={""}; char extension[5]={""}; len= strlen(name); - if (len == 0) return; + if (len == 0) return 0; strcpy(basename, name); /* Figure out extension to append: @@ -474,9 +464,15 @@ void bone_autoside_name (char *name, int strip_number, short axis, float head, f if ((32 - len) < strlen(extension) + 1) { /* add 1 for the '.' */ strncpy(name, basename, len-strlen(extension)); } + + sprintf(name, "%s.%s", basename, extension); + + return 1; } - sprintf(name, "%s.%s", basename, extension); + else { + return 0; + } } /* ************* B-Bone support ******************* */ @@ -692,11 +688,11 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest) /* ************ Armature Deform ******************* */ -static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion, int rest_def) +static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion) { Bone *bone= pchan->bone; Mat4 *b_bone= b_bone_spline_setup(pchan, 0); - Mat4 *b_bone_rest= (rest_def)? NULL: b_bone_spline_setup(pchan, 1); + Mat4 *b_bone_rest= b_bone_spline_setup(pchan, 1); Mat4 *b_bone_mats; DualQuat *b_bone_dual_quats= NULL; float tmat[4][4]; @@ -716,17 +712,14 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion, int re invert_m4_m4(b_bone_mats[0].mat, bone->arm_mat); /* then we make the b_bone_mats: - - first transform to local bone space + - first transform to local bone space - translate over the curve to the bbone mat space - transform with b_bone matrix - transform back into global space */ unit_m4(tmat); for(a=0; a<bone->segments; a++) { - if(b_bone_rest) - invert_m4_m4(tmat, b_bone_rest[a].mat); - else - tmat[3][1] = -a*(bone->length/(float)bone->segments); + invert_m4_m4(tmat, b_bone_rest[a].mat); mul_serie_m4(b_bone_mats[a+1].mat, pchan->chan_mat, bone->arm_mat, b_bone[a].mat, tmat, b_bone_mats[0].mat, NULL, NULL, NULL); @@ -855,9 +848,8 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo mul_m4_v3(pchan->chan_mat, cop); // Make this a delta from the base position - sub_v3_v3v3(cop, cop, co); - cop[0]*=fac; cop[1]*=fac; cop[2]*=fac; - add_v3_v3v3(vec, vec, cop); + sub_v3_v3(cop, co); + madd_v3_v3fl(vec, cop, fac); if(mat) pchan_deform_mat_add(pchan, fac, bbonemat, mat); @@ -913,7 +905,7 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, Dua } void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, - float (*vertexCos)[3], float (*defMats)[3][3], + float (*vertexCos)[3], float (*defMats)[3][3], int numVerts, int deformflag, float (*prevCos)[3], const char *defgrp_name) { @@ -925,12 +917,11 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, float obinv[4][4], premat[4][4], postmat[4][4]; int use_envelope = deformflag & ARM_DEF_ENVELOPE; int use_quaternion = deformflag & ARM_DEF_QUATERNION; - int bbone_rest_def = deformflag & ARM_DEF_B_BONE_REST; int invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP; int numGroups = 0; /* safety for vertexgroup index overflow */ int i, target_totvert = 0; /* safety for vertexgroup overflow */ int use_dverts = 0; - int armature_def_nr = -1; + int armature_def_nr; int totchan; if(arm->edbo) return; @@ -952,7 +943,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) { if(!(pchan->bone->flag & BONE_NO_DEFORM)) { if(pchan->bone->segments > 1) - pchan_b_bone_defmats(pchan, use_quaternion, bbone_rest_def); + pchan_b_bone_defmats(pchan, use_quaternion); if(use_quaternion) { pchan->dual_quat= &dualquats[totchan++]; @@ -962,26 +953,28 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, } /* get the def_nr for the overall armature vertex group if present */ - for(i = 0, dg = target->defbase.first; dg; i++, dg = dg->next) - if(defgrp_name && strcmp(defgrp_name, dg->name) == 0) - armature_def_nr = i; - + armature_def_nr= defgroup_name_index(target, defgrp_name); + + if(ELEM(target->type, OB_MESH, OB_LATTICE)) { + numGroups = BLI_countlist(&target->defbase); + + if(target->type==OB_MESH) { + Mesh *me= target->data; + dverts = me->dvert; + if(dverts) + target_totvert = me->totvert; + } + else { + Lattice *lt= target->data; + dverts = lt->dvert; + if(dverts) + target_totvert = lt->pntsu*lt->pntsv*lt->pntsw; + } + } + /* get a vertex-deform-index to posechannel array */ if(deformflag & ARM_DEF_VGROUP) { if(ELEM(target->type, OB_MESH, OB_LATTICE)) { - numGroups = BLI_countlist(&target->defbase); - - if(target->type==OB_MESH) { - Mesh *me= target->data; - dverts = me->dvert; - target_totvert = me->totvert; - } - else { - Lattice *lt= target->data; - dverts = lt->dvert; - if(dverts) - target_totvert = lt->pntsu*lt->pntsv*lt->pntsw; - } /* if we have a DerivedMesh, only use dverts if it has them */ if(dm) if(dm->getVertData(dm, 0, CD_MDEFORMVERT)) @@ -991,9 +984,9 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, if(use_dverts) { defnrToPC = MEM_callocN(sizeof(*defnrToPC) * numGroups, - "defnrToBone"); + "defnrToBone"); for(i = 0, dg = target->defbase.first; dg; - i++, dg = dg->next) { + i++, dg = dg->next) { defnrToPC[i] = get_pose_channel(armOb->pose, dg->name); /* exclude non-deforming bones */ if(defnrToPC[i]) { @@ -1078,10 +1071,10 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, if(bone && bone->flag & BONE_MULT_VG_ENV) { weight *= distfactor_to_bone(co, bone->arm_head, - bone->arm_tail, - bone->rad_head, - bone->rad_tail, - bone->dist); + bone->arm_tail, + bone->rad_head, + bone->rad_tail, + bone->dist); } pchan_bone_deform(pchan, weight, vec, dq, smat, co, &contrib); } @@ -1091,7 +1084,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, */ if(deformed == 0 && use_envelope) { for(pchan = armOb->pose->chanbase.first; pchan; - pchan = pchan->next) { + pchan = pchan->next) { if(!(pchan->bone->flag & BONE_NO_DEFORM)) contrib += dist_bone_deform(pchan, vec, dq, smat, co); } @@ -1099,7 +1092,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, } else if(use_envelope) { for(pchan = armOb->pose->chanbase.first; pchan; - pchan = pchan->next) { + pchan = pchan->next) { if(!(pchan->bone->flag & BONE_NO_DEFORM)) contrib += dist_bone_deform(pchan, vec, dq, smat, co); } @@ -1113,9 +1106,9 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, if(armature_weight != 1.0f) { VECCOPY(dco, co); mul_v3m3_dq( dco, (defMats)? summat: NULL,dq); - sub_v3_v3v3(dco, dco, co); + sub_v3_v3(dco, co); mul_v3_fl(dco, armature_weight); - add_v3_v3v3(co, co, dco); + add_v3_v3(co, dco); } else mul_v3m3_dq( co, (defMats)? summat: NULL,dq); @@ -1301,10 +1294,10 @@ void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4]) */ void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]) { - float imat[4][4]; + float imat[4][4]; - invert_m4_m4(imat, arm_mat); - mul_m4_m4m4(delta_mat, pose_mat, imat); + invert_m4_m4(imat, arm_mat); + mul_m4_m4m4(delta_mat, pose_mat, imat); } /* **************** Rotation Mode Conversions ****************************** */ @@ -1377,21 +1370,21 @@ void BKE_rotMode_change_values (float quat[4], float eul[3], float axis[3], floa *************************************************************************** */ /* Computes vector and roll based on a rotation. "mat" must - contain only a rotation, and no scaling. */ + contain only a rotation, and no scaling. */ void mat3_to_vec_roll(float mat[][3], float *vec, float *roll) { - if (vec) - copy_v3_v3(vec, mat[1]); + if (vec) + copy_v3_v3(vec, mat[1]); - if (roll) { - float vecmat[3][3], vecmatinv[3][3], rollmat[3][3]; + if (roll) { + float vecmat[3][3], vecmatinv[3][3], rollmat[3][3]; - vec_roll_to_mat3(mat[1], 0.0f, vecmat); - invert_m3_m3(vecmatinv, vecmat); - mul_m3_m3m3(rollmat, vecmatinv, mat); + vec_roll_to_mat3(mat[1], 0.0f, vecmat); + invert_m3_m3(vecmatinv, vecmat); + mul_m3_m3m3(rollmat, vecmatinv, mat); - *roll= (float)atan2(rollmat[2][0], rollmat[2][2]); - } + *roll= (float)atan2(rollmat[2][0], rollmat[2][2]); + } } /* Calculates the rest matrix of a bone based @@ -1572,9 +1565,11 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected * 1. extract constraints not from proxy (CONSTRAINT_PROXY_LOCAL) from pchan's constraints * 2. copy proxy-pchan's constraints on-to new * 3. add extracted local constraints back on top + * + * note for copy_constraints: when copying constraints, disable 'do_extern' otherwise we get the libs direct linked in this blend. */ extract_proxylocal_constraints(&proxylocal_constraints, &pchan->constraints); - copy_constraints(&pchanw.constraints, &pchanp->constraints); + copy_constraints(&pchanw.constraints, &pchanp->constraints, FALSE); addlisttolist(&pchanw.constraints, &proxylocal_constraints); /* constraints - set target ob pointer to own object */ @@ -1683,6 +1678,7 @@ void armature_rebuild_pose(Object *ob, bArmature *arm) next= pchan->next; if(pchan->bone==NULL) { free_pose_channel(pchan); + free_pose_channels_hash(pose); BLI_freelinkN(&pose->chanbase, pchan); } } @@ -1702,6 +1698,8 @@ void armature_rebuild_pose(Object *ob, bArmature *arm) ob->pose->flag &= ~POSE_RECALC; ob->pose->flag |= POSE_WAS_REBUILT; + + make_pose_channels_hash(ob->pose); } @@ -1776,20 +1774,13 @@ static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel /* find the root bone and the chain of bones from the root to the tip * NOTE: this assumes that the bones are connected, but that may not be true... */ - for (pchan= pchan_tip; pchan; pchan= pchan->parent) { + for (pchan= pchan_tip; pchan && (segcount < ikData->chainlen); pchan= pchan->parent, segcount++) { /* store this segment in the chain */ pchanChain[segcount]= pchan; /* if performing rebinding, calculate the length of the bone */ boneLengths[segcount]= pchan->bone->length; totLength += boneLengths[segcount]; - - /* check if we've gotten the number of bones required yet (after incrementing the count first) - * NOTE: the 255 limit here is rather ugly, but the standard IK does this too! - */ - segcount++; - if ((segcount == ikData->chainlen) || (segcount > 255)) - break; } if (segcount == 0) @@ -1947,7 +1938,7 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o } /* tail endpoint */ - if ( where_on_path(ikData->tar, tree->points[index], vec, dir, NULL, &rad) ) { + if ( where_on_path(ikData->tar, tree->points[index], vec, dir, NULL, &rad, NULL) ) { /* apply curve's object-mode transforms to the position * unless the option to allow curve to be positioned elsewhere is activated (i.e. no root) */ @@ -1963,7 +1954,7 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o } /* head endpoint */ - if ( where_on_path(ikData->tar, tree->points[index+1], vec, dir, NULL, &rad) ) { + if ( where_on_path(ikData->tar, tree->points[index+1], vec, dir, NULL, &rad, NULL) ) { /* apply curve's object-mode transforms to the position * unless the option to allow curve to be positioned elsewhere is activated (i.e. no root) */ @@ -2012,6 +2003,11 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o rangle= dot_v3v3(rmat[1], splineVec); rangle= acos( MAX2(-1.0f, MIN2(1.0f, rangle)) ); + /* multiply the magnitude of the angle by the influence of the constraint to + * control the influence of the SplineIK effect + */ + rangle *= tree->con->enforce; + /* construct rotation matrix from the axis-angle rotation found above * - this call takes care to make sure that the axis provided is a unit vector first */ @@ -2058,7 +2054,7 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o /* we need to clamp this within sensible values */ // NOTE: these should be fine for now, but should get sanitised in future - scale= MIN2( MAX2(scale, 0.0001) , 100000); + scale= MIN2(MAX2(scale, 0.0001) , 100000); } else scale= 1.0f; @@ -2079,13 +2075,26 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o } } - /* step 5: set the location of the bone in the matrix - * - when the 'no-root' option is affected, the chain can retain - * the shape but be moved elsewhere - */ + /* step 5: set the location of the bone in the matrix */ if (ikData->flag & CONSTRAINT_SPLINEIK_NO_ROOT) { + /* when the 'no-root' option is affected, the chain can retain + * the shape but be moved elsewhere + */ VECCOPY(poseHead, pchan->pose_head); } + else if (tree->con->enforce < 1.0f) { + /* when the influence is too low + * - blend the positions for the 'root' bone + * - stick to the parent for any other + */ + if (pchan->parent) { + VECCOPY(poseHead, pchan->pose_head); + } + else { + // FIXME: this introduces popping artifacts when we reach 0.0 + interp_v3_v3v3(poseHead, pchan->pose_head, poseHead, tree->con->enforce); + } + } VECCOPY(poseMat[3], poseHead); /* finally, store the new transform */ @@ -2117,8 +2126,6 @@ static void splineik_execute_tree(Scene *scene, Object *ob, bPoseChannel *pchan_ splineik_evaluate_bone(tree, scene, ob, pchan, i, ctime); } - // TODO: if another pass is needed to ensure the validity of the chain after blending, it should go here - /* free the tree info specific to SplineIK trees now */ if (tree->chain) MEM_freeN(tree->chain); if (tree->free_points) MEM_freeN(tree->points); @@ -2268,7 +2275,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha nor[0] = BLI_gNoise(amod->noisesize, size[0]+ofs, size[1], size[2], 0, 0) - ofs; nor[1] = BLI_gNoise(amod->noisesize, size[0], size[1]+ofs, size[2], 0, 0) - ofs; nor[2] = BLI_gNoise(amod->noisesize, size[0], size[1], size[2]+ofs, 0, 0) - ofs; - add_v3_v3v3(size, size, nor); + add_v3_v3(size, nor); if (sizeo[0] != 0) mul_v3_fl(pchan->pose_mat[0], size[0] / sizeo[0]); @@ -2284,7 +2291,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha nor[2] = BLI_gNoise(amod->noisesize, eul[0], eul[1], eul[2]+ofs, 0, 0) - ofs; compatible_eul(nor, eulo); - add_v3_v3v3(eul, eul, nor); + add_v3_v3(eul, nor); compatible_eul(eul, eulo); loc_eul_size_to_mat4(pchan->pose_mat, loc, eul, size); @@ -2387,7 +2394,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti /* only rootbones get the cyclic offset (unless user doesn't want that) */ if ((bone->flag & BONE_NO_CYCLICOFFSET) == 0) - add_v3_v3v3(pchan->pose_mat[3], pchan->pose_mat[3], ob->pose->cyclic_offset); + add_v3_v3(pchan->pose_mat[3], ob->pose->cyclic_offset); } if(do_extra) { diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 81f3aeeffb6..590b9f7e476 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -48,45 +48,32 @@ #include "MEM_guardedalloc.h" -#include "DNA_curve_types.h" -#include "DNA_listBase.h" -#include "DNA_sdna_types.h" #include "DNA_userdef_types.h" -#include "DNA_object_types.h" -#include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_sound_types.h" #include "DNA_sequence_types.h" #include "BLI_blenlib.h" #include "BLI_dynstr.h" +#include "BLI_path_util.h" -#include "IMB_imbuf_types.h" #include "IMB_imbuf.h" -#include "BKE_animsys.h" -#include "BKE_action.h" #include "BKE_blender.h" #include "BKE_context.h" -#include "BKE_curve.h" #include "BKE_depsgraph.h" #include "BKE_displist.h" -#include "BKE_font.h" #include "BKE_global.h" #include "BKE_idprop.h" -#include "BKE_library.h" #include "BKE_ipo.h" +#include "BKE_library.h" #include "BKE_main.h" #include "BKE_node.h" -#include "BKE_object.h" #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_screen.h" #include "BKE_sequencer.h" -#include "BKE_sound.h" -#include "BLI_editVert.h" #include "BLO_undofile.h" #include "BLO_readfile.h" @@ -114,7 +101,7 @@ void free_blender(void) BKE_spacetypes_free(); /* after free main, it uses space callbacks */ - IMB_freeImBufdata(); /* imbuf lib */ + IMB_exit(); free_nodesystem(); } @@ -144,6 +131,8 @@ void initglobals(void) G.charstart = 0x0000; G.charmin = 0x0000; G.charmax = 0xffff; + + G.f |= G_SCRIPT_AUTOEXEC; } /***/ @@ -290,6 +279,8 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) else bfd->globalf &= ~G_DEBUG; if (G.f & G_SWAP_EXCHANGE) bfd->globalf |= G_SWAP_EXCHANGE; else bfd->globalf &= ~G_SWAP_EXCHANGE; + if (G.f & G_SCRIPT_AUTOEXEC) bfd->globalf |= G_SCRIPT_AUTOEXEC; + else bfd->globalf &= ~G_SCRIPT_AUTOEXEC; G.f= bfd->globalf; @@ -297,14 +288,22 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) //setscreen(G.curscreen); } - // XXX temporarily here - if(G.main->versionfile < 250) - do_versions_ipos_to_animato(G.main); // XXX fixme... complicated versionpatching + // FIXME: this version patching should really be part of the file-reading code, + // but we still get too many unrelated data-corruption crashes otherwise... + if (G.main->versionfile < 250) + do_versions_ipos_to_animato(G.main); - /* in case of autosave or quit.blend, use original filename instead - * use relbase_valid to make sure the file is saved, else we get <memory2> in the filename */ - if(recover && bfd->filename[0] && G.relbase_valid) + if(recover && bfd->filename[0] && G.relbase_valid) { + /* in case of autosave or quit.blend, use original filename instead + * use relbase_valid to make sure the file is saved, else we get <memory2> in the filename */ filename= bfd->filename; + } +#if 0 + else if (!G.relbase_valid) { + /* otherwise, use an empty string as filename, rather than <memory2> */ + filename=""; + } +#endif /* these are the same at times, should never copy to the same location */ if(G.sce != filename) @@ -314,8 +313,6 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) /* baseflags, groups, make depsgraph, etc */ set_scene_bg(CTX_data_scene(C)); - - DAG_on_load_update(); MEM_freeN(bfd); } @@ -370,7 +367,7 @@ int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports) BlendFileData *bfd; int retval= 1; - if(strstr(dir, ".B25.blend")==0) /* dont print user-pref loading */ + if(strstr(dir, BLENDER_STARTUP_FILE)==0) /* dont print user-pref loading */ printf("read blend: %s\n", dir); bfd= BLO_read_from_file(dir, reports); @@ -479,6 +476,9 @@ static int read_undosave(bContext *C, UndoElem *uel) strcpy(G.sce, scestr); G.fileflags= fileflags; + if(success) + DAG_on_load_update(); + return success; } @@ -537,7 +537,7 @@ void BKE_write_undo(bContext *C, char *name) sprintf(numstr, "%d.blend", counter); BLI_make_file_string("/", tstr, btempdir, numstr); - success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL); + success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL, NULL); strcpy(curundo->str, tstr); } diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c index 409e7edb519..e2a6c04450b 100644 --- a/source/blender/blenkernel/intern/bmfont.c +++ b/source/blender/blenkernel/intern/bmfont.c @@ -51,17 +51,11 @@ #include <stdio.h> #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BKE_global.h" #include "IMB_imbuf_types.h" -#include "BKE_bmfont.h" #include "BKE_bmfont_types.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - void printfGlyph(bmGlyph * glyph) { printf("unicode: %d '%c'\n", glyph->unicode, glyph->unicode); @@ -180,8 +174,8 @@ void detectBitmapFont(ImBuf *ibuf) unsigned short version; int i; - if (ibuf != NULL) { - // bitmap must have an x size that is a power of two + if (ibuf != NULL && ibuf->rect != NULL) { + // bitmap must have an x size that is a power of two if (is_power_of_two(ibuf->x)) { rect = (unsigned char *) (ibuf->rect + (ibuf->x * (ibuf->y - 1))); // printf ("starts with: %s %c %c %c %c\n", rect, rect[0], rect[1], rect[2], rect[3]); diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c index b521ec41cba..82602a6951d 100644 --- a/source/blender/blenkernel/intern/boids.c +++ b/source/blender/blenkernel/intern/boids.c @@ -34,19 +34,13 @@ #include "MEM_guardedalloc.h" -#include "DNA_particle_types.h" -#include "DNA_modifier_types.h" #include "DNA_object_force.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_boid_types.h" -#include "DNA_listBase.h" #include "BLI_rand.h" #include "BLI_math.h" #include "BLI_blenlib.h" #include "BLI_kdtree.h" -#include "BLI_kdopbvh.h" #include "BKE_collision.h" #include "BKE_effect.h" #include "BKE_boids.h" @@ -147,7 +141,7 @@ static int rule_goal_avoid(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, get_effector_data(eff, &efd, &epoint, 1); mul_v3_fl(efd.vel, efd.distance / (val->max_speed * bbd->timestep)); - add_v3_v3v3(efd.loc, efd.loc, efd.vel); + add_v3_v3(efd.loc, efd.vel); sub_v3_v3v3(efd.vec_to_point, pa->prev_state.co, efd.loc); efd.distance = len_v3(efd.vec_to_point); } @@ -361,7 +355,7 @@ static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Pa if(neighbors > 1 && ptn[1].dist!=0.0f) { sub_v3_v3v3(vec, pa->prev_state.co, bbd->sim->psys->particles[ptn[1].index].state.co); mul_v3_fl(vec, (2.0f * val->personal_space * pa->size - ptn[1].dist) / ptn[1].dist); - add_v3_v3v3(bbd->wanted_co, bbd->wanted_co, vec); + add_v3_v3(bbd->wanted_co, vec); bbd->wanted_speed = val->max_speed; len = ptn[1].dist; ret = 1; @@ -378,7 +372,7 @@ static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Pa if(neighbors > 0 && ptn[0].dist < len) { sub_v3_v3v3(vec, pa->prev_state.co, ptn[0].co); mul_v3_fl(vec, (2.0f * val->personal_space * pa->size - ptn[0].dist) / ptn[1].dist); - add_v3_v3v3(bbd->wanted_co, bbd->wanted_co, vec); + add_v3_v3(bbd->wanted_co, vec); bbd->wanted_speed = val->max_speed; len = ptn[0].dist; ret = 1; @@ -399,18 +393,18 @@ static int rule_flock(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Parti if(neighbors > 1) { for(n=1; n<neighbors; n++) { - add_v3_v3v3(loc, loc, bbd->sim->psys->particles[ptn[n].index].prev_state.co); - add_v3_v3v3(vec, vec, bbd->sim->psys->particles[ptn[n].index].prev_state.vel); + add_v3_v3(loc, bbd->sim->psys->particles[ptn[n].index].prev_state.co); + add_v3_v3(vec, bbd->sim->psys->particles[ptn[n].index].prev_state.vel); } mul_v3_fl(loc, 1.0f/((float)neighbors - 1.0f)); mul_v3_fl(vec, 1.0f/((float)neighbors - 1.0f)); - sub_v3_v3v3(loc, loc, pa->prev_state.co); - sub_v3_v3v3(vec, vec, pa->prev_state.vel); + sub_v3_v3(loc, pa->prev_state.co); + sub_v3_v3(vec, pa->prev_state.vel); - add_v3_v3v3(bbd->wanted_co, bbd->wanted_co, vec); - add_v3_v3v3(bbd->wanted_co, bbd->wanted_co, loc); + add_v3_v3(bbd->wanted_co, vec); + add_v3_v3(bbd->wanted_co, loc); bbd->wanted_speed = len_v3(bbd->wanted_co); ret = 1; @@ -573,13 +567,13 @@ static int rule_average_speed(BoidRule *rule, BoidBrainData *bbd, BoidValues *va mul_v3_fl(bbd->wanted_co, 1.1f); - add_v3_v3v3(bbd->wanted_co, bbd->wanted_co, vec); + add_v3_v3(bbd->wanted_co, vec); /* leveling */ if(asbr->level > 0.0f && psys_uses_gravity(bbd->sim)) { project_v3_v3v3(vec, bbd->wanted_co, bbd->sim->scene->physics_settings.gravity); mul_v3_fl(vec, asbr->level); - sub_v3_v3v3(bbd->wanted_co, bbd->wanted_co, vec); + sub_v3_v3(bbd->wanted_co, vec); } } else { @@ -596,7 +590,7 @@ static int rule_average_speed(BoidRule *rule, BoidBrainData *bbd, BoidValues *va if(asbr->level > 0.0f && psys_uses_gravity(bbd->sim)) { project_v3_v3v3(vec, bbd->wanted_co, bbd->sim->scene->physics_settings.gravity); mul_v3_fl(vec, asbr->level); - sub_v3_v3v3(bbd->wanted_co, bbd->wanted_co, vec); + sub_v3_v3(bbd->wanted_co, vec); } } @@ -754,7 +748,7 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro /* take surface velocity into account */ closest_point_on_surface(surmd, pa->state.co, x, NULL, v); - add_v3_v3v3(x, x, v); + add_v3_v3(x, v); /* get actual position on surface */ closest_point_on_surface(surmd, x, ground_co, ground_nor, NULL); @@ -771,10 +765,10 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro if(!bbd->sim->colliders) return NULL; - VECCOPY(col.co1, pa->state.co); - VECCOPY(col.co2, pa->state.co); - add_v3_v3v3(col.co1, col.co1, zvec); - sub_v3_v3v3(col.co2, col.co2, zvec); + copy_v3_v3(col.co1, pa->state.co); + copy_v3_v3(col.co2, pa->state.co); + add_v3_v3(col.co1, zvec); + sub_v3_v3(col.co2, zvec); sub_v3_v3v3(ray_dir, col.co2, col.co1); col.t = 0.0f; hit.index = -1; @@ -962,7 +956,7 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa) int n = 0; for(rule = state->rules.first; rule; rule=rule->next) { if(apply_boid_rule(bbd, rule, &val, pa, -1.0f)) { - add_v3_v3v3(wanted_co, wanted_co, bbd->wanted_co); + add_v3_v3(wanted_co, bbd->wanted_co); wanted_speed += bbd->wanted_speed; n++; bbd->wanted_co[0]=bbd->wanted_co[1]=bbd->wanted_co[2]=bbd->wanted_speed=0.0f; @@ -1211,7 +1205,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) mul_v3_fl(force, length); } - add_v3_v3v3(acc, acc, force); + add_v3_v3(acc, force); /* store smoothed acceleration for nice banking etc. */ VECADDFAC(bpa->data.acc, bpa->data.acc, acc, dtime); @@ -1228,8 +1222,8 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) VECCOPY(bvec, pa->prev_state.vel); mul_v3_fl(bvec, dtime); - add_v3_v3v3(dvec, dvec, bvec); - add_v3_v3v3(pa->state.co, pa->state.co, dvec); + add_v3_v3(dvec, bvec); + add_v3_v3(pa->state.co, dvec); VECADDFAC(pa->state.vel, pa->state.vel, acc, dtime); diff --git a/source/blender/blenkernel/intern/booleanops.c b/source/blender/blenkernel/intern/booleanops.c index f9b9b33d4ae..f9df0beca7c 100644 --- a/source/blender/blenkernel/intern/booleanops.c +++ b/source/blender/blenkernel/intern/booleanops.c @@ -45,7 +45,6 @@ #include "CSG_BooleanOps.h" -#include "BKE_booleanops.h" #include "BKE_cdderivedmesh.h" #include "BKE_customdata.h" #include "BKE_depsgraph.h" @@ -380,7 +379,7 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh( // a hash table to remap materials to indices if (mat) { - material_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + material_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "booleanops.c"); *totmat = 0; } diff --git a/source/blender/blenkernel/intern/booleanops_mesh.c b/source/blender/blenkernel/intern/booleanops_mesh.c index 1e99661f445..431e51cf149 100644 --- a/source/blender/blenkernel/intern/booleanops_mesh.c +++ b/source/blender/blenkernel/intern/booleanops_mesh.c @@ -30,24 +30,10 @@ */ #include "CSG_BooleanOps.h" -#include "BKE_booleanops.h" -#include "BKE_booleanops_mesh.h" #include "MEM_guardedalloc.h" -#include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "BKE_global.h" -#include "BKE_mesh.h" -#include "BKE_displist.h" -#include "BKE_object.h" -#include "BKE_utildefines.h" -#include "BKE_library.h" -#include "BKE_material.h" -#include "BLI_math.h" /** * Implementation of boolean ops mesh interface. diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index bc30b2669e8..c423d426e32 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -34,9 +34,6 @@ #include "DNA_brush_types.h" #include "DNA_color_types.h" -#include "DNA_image_types.h" -#include "DNA_object_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" @@ -56,9 +53,7 @@ #include "BKE_main.h" #include "BKE_paint.h" #include "BKE_texture.h" -#include "BKE_utildefines.h" - - +#include "BKE_icons.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -74,29 +69,59 @@ Brush *add_brush(const char *name) brush= alloc_libblock(&G.main->brush, ID_BR, name); - brush->rgb[0]= 1.0f; + /* BRUSH SCULPT TOOL SETTINGS */ + brush->sculpt_tool = SCULPT_TOOL_DRAW; /* sculpting defaults to the draw tool for new brushes */ + brush->size= 35; /* radius of the brush in pixels */ + brush->alpha= 0.5f; /* brush strength/intensity probably variable should be renamed? */ + brush->autosmooth_factor= 0.0f; + brush->crease_pinch_factor= 0.5f; + brush->sculpt_plane = SCULPT_DISP_DIR_VIEW; + brush->plane_offset= 0.0f; /* how far above or below the plane that is found by averaging the faces */ + brush->plane_trim= 0.5f; + brush->clone.alpha= 0.5f; + brush->normal_weight= 0.0f; + + /* BRUSH PAINT TOOL SETTINGS */ + brush->rgb[0]= 1.0f; /* default rgb color of the brush when painting - white */ brush->rgb[1]= 1.0f; brush->rgb[2]= 1.0f; - brush->alpha= 0.2f; - brush->size= 25; - brush->spacing= 7.5f; - brush->smooth_stroke_radius= 75; - brush->smooth_stroke_factor= 0.9; - brush->rate= 0.1f; - brush->jitter= 0.0f; - brush->clone.alpha= 0.5; - brush->sculpt_tool = SCULPT_TOOL_DRAW; - brush->flag |= BRUSH_SPACE; - brush_curve_preset(brush, CURVE_PRESET_SMOOTH); - + /* BRUSH STROKE SETTINGS */ + brush->flag |= (BRUSH_SPACE|BRUSH_SPACE_ATTEN); + brush->spacing= 10; /* how far each brush dot should be spaced as a percentage of brush diameter */ + + brush->smooth_stroke_radius= 75; + brush->smooth_stroke_factor= 0.9f; + + brush->rate= 0.1f; /* time delay between dots of paint or sculpting when doing airbrush mode */ + + brush->jitter= 0.0f; + + /* BRUSH TEXTURE SETTINGS */ default_mtex(&brush->mtex); + brush->texture_sample_bias= 0; /* value to added to texture samples */ + + /* brush appearance */ + + brush->image_icon= NULL; + + brush->add_col[0]= 1.00; /* add mode color is light red */ + brush->add_col[1]= 0.39; + brush->add_col[2]= 0.39; + + brush->sub_col[0]= 0.39; /* subtract mode color is light blue */ + brush->sub_col[1]= 0.39; + brush->sub_col[2]= 1.00; + + /* the default alpha falloff curve */ + brush_curve_preset(brush, CURVE_PRESET_SMOOTH); + /* enable fake user by default */ brush->id.flag |= LIB_FAKEUSER; brush_toggled_fake_user(brush); - - return brush; + + return brush; } Brush *copy_brush(Brush *brush) @@ -122,7 +147,7 @@ Brush *copy_brush(Brush *brush) void free_brush(Brush *brush) { if(brush->mtex.tex) brush->mtex.tex->id.us--; - + curvemapping_free(brush->curve); } @@ -237,7 +262,8 @@ void brush_curve_preset(Brush *b, /*CurveMappingPreset*/int preset) cm = b->curve->cm; cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE; - curvemap_reset(cm, &b->curve->clipr, preset); + b->curve->preset = preset; + curvemap_reset(cm, &b->curve->clipr, b->curve->preset); curvemapping_changed(b->curve, 0); } @@ -681,7 +707,7 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos) short flt; if ((brush->size != cache->lastsize) || (brush->alpha != cache->lastalpha) - || (brush->jitter != cache->lastjitter)) { + || (brush->jitter != cache->lastjitter)) { if (cache->ibuf) { IMB_freeImBuf(cache->ibuf); cache->ibuf= NULL; @@ -734,11 +760,19 @@ static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pres brush->spacing = MAX2(1.0, painter->startspacing*(1.5f-pressure)); } -static void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos) +void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos) { if(brush->jitter){ - jitterpos[0] = pos[0] + ((BLI_frand()-0.5f) * brush->size * brush->jitter * 2); - jitterpos[1] = pos[1] + ((BLI_frand()-0.5f) * brush->size * brush->jitter * 2); + float rand_pos[2]; + + // find random position within a circle of diameter 1 + do { + rand_pos[0] = BLI_frand()-0.5f; + rand_pos[1] = BLI_frand()-0.5f; + } while (len_v2(rand_pos) > 0.5f); + + jitterpos[0] = pos[0] + 2*rand_pos[0]*brush->size*brush->jitter; + jitterpos[1] = pos[1] + 2*rand_pos[1]*brush->size*brush->jitter; } else { VECCOPY2D(jitterpos, pos); @@ -890,7 +924,7 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl /* Uses the brush curve control to find a strength value between 0 and 1 */ float brush_curve_strength_clamp(Brush *br, float p, const float len) { - if(p >= len) p= 1.0f; + if(p >= len) return 0; else p= p/len; p= curvemapping_evaluateF(br->curve, 0, p); @@ -902,9 +936,12 @@ float brush_curve_strength_clamp(Brush *br, float p, const float len) * used for sculpt only */ float brush_curve_strength(Brush *br, float p, const float len) { - if(p >= len) p= 1.0f; - else p= p/len; - return curvemapping_evaluateF(br->curve, 0, p); + if(p >= len) + p= 1.0f; + else + p= p/len; + + return curvemapping_evaluateF(br->curve, 0, p); } /* TODO: should probably be unified with BrushPainter stuff? */ @@ -918,7 +955,7 @@ unsigned int *brush_gen_texture_cache(Brush *br, int half_side) memset(&texres, 0, sizeof(TexResult)); - if(mtex && mtex->tex) { + if(mtex->tex) { float x, y, step = 2.0 / side, co[3]; texcache = MEM_callocN(sizeof(int) * side * side, "Brush texture cache"); @@ -933,7 +970,7 @@ unsigned int *brush_gen_texture_cache(Brush *br, int half_side) co[2]= 0.0f; /* This is copied from displace modifier code */ - hasrgb = multitex_ext(mtex->tex, co, NULL, NULL, 1, &texres); + hasrgb = multitex_ext(mtex->tex, co, NULL, NULL, 0, &texres); /* if the texture gave an RGB value, we assume it didn't give a valid * intensity, so calculate one (formula from do_material_tex). @@ -941,7 +978,7 @@ unsigned int *brush_gen_texture_cache(Brush *br, int half_side) */ if(hasrgb & TEX_RGB) texres.tin = (0.35 * texres.tr + 0.45 * - texres.tg + 0.2 * texres.tb); + texres.tg + 0.2 * texres.tb); texres.tin = texres.tin * 255.0; ((char*)texcache)[(iy*side+ix)*4] = (char)texres.tin; @@ -996,9 +1033,9 @@ void brush_radial_control_invoke(wmOperator *op, Brush *br, float size_weight) float original_value= 0; if(mode == WM_RADIALCONTROL_SIZE) - original_value = br->size * size_weight; + original_value = sculpt_get_brush_size(br) * size_weight; else if(mode == WM_RADIALCONTROL_STRENGTH) - original_value = br->alpha; + original_value = sculpt_get_brush_alpha(br); else if(mode == WM_RADIALCONTROL_ANGLE) { MTex *mtex = brush_active_texture(br); if(mtex) @@ -1016,9 +1053,15 @@ int brush_radial_control_exec(wmOperator *op, Brush *br, float size_weight) const float conv = 0.017453293; if(mode == WM_RADIALCONTROL_SIZE) - br->size = new_value * size_weight; + if (sculpt_get_lock_brush_size(br)) { + float initial_value = RNA_float_get(op->ptr, "initial_value"); + const float unprojected_radius = sculpt_get_brush_unprojected_radius(br); + sculpt_set_brush_unprojected_radius(br, unprojected_radius * new_value/initial_value * size_weight); + } + else + sculpt_set_brush_size(br, new_value * size_weight); else if(mode == WM_RADIALCONTROL_STRENGTH) - br->alpha = new_value; + sculpt_set_brush_alpha(br, new_value); else if(mode == WM_RADIALCONTROL_ANGLE) { MTex *mtex = brush_active_texture(br); if(mtex) diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c index 082910869bf..0b2f491b28d 100644 --- a/source/blender/blenkernel/intern/bvhutils.c +++ b/source/blender/blenkernel/intern/bvhutils.c @@ -32,21 +32,12 @@ #include <math.h> #include <assert.h> -#include "BKE_bvhutils.h" - -#include "DNA_object_types.h" -#include "DNA_modifier_types.h" #include "DNA_meshdata_types.h" #include "BKE_DerivedMesh.h" #include "BKE_utildefines.h" -#include "BKE_deform.h" -#include "BKE_cdderivedmesh.h" -#include "BKE_displist.h" -#include "BKE_global.h" #include "BLI_math.h" -#include "BLI_linklist.h" #include "MEM_guardedalloc.h" /* Math stuff for ray casting on mesh faces and for nearest surface */ @@ -219,7 +210,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const } else // Region 0 { - // Minimum at interior lv + // Minimum at interior lv float invDet; if(fabs(Det) > FLT_EPSILON) invDet = 1.0f / Det; diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 9ee4b66b194..7b6da4dd811 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -37,12 +37,9 @@ #include "BIF_gl.h" #include "BKE_cdderivedmesh.h" -#include "BKE_customdata.h" -#include "BKE_DerivedMesh.h" -#include "BKE_displist.h" #include "BKE_global.h" #include "BKE_mesh.h" -#include "BKE_multires.h" +#include "BKE_paint.h" #include "BKE_utildefines.h" #include "BKE_tessmesh.h" @@ -52,18 +49,16 @@ #include "BLI_blenlib.h" #include "BLI_edgehash.h" #include "BLI_editVert.h" +#include "BLI_math.h" #include "BLI_pbvh.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_fluidsim.h" #include "DNA_object_types.h" -#include "DNA_scene_types.h" +#include "DNA_curve_types.h" /* for Curve */ #include "MEM_guardedalloc.h" -#include "gpu_buffers.h" +#include "GPU_buffers.h" #include "GPU_draw.h" #include "GPU_extensions.h" #include "GPU_material.h" @@ -85,6 +80,7 @@ typedef struct { /* Cached */ struct PBVH *pbvh; + int pbvh_draw; /* Mesh connectivity */ struct ListBase *fmap; struct IndexNode *fmap_mem; @@ -197,22 +193,47 @@ static ListBase *cdDM_getFaceMap(Object *ob, DerivedMesh *dm) Mesh *me= ob->data; create_vert_face_map(&cddm->fmap, &cddm->fmap_mem, me->mface, - me->totvert, me->totface); + me->totvert, me->totface); } return cddm->fmap; } +static int can_pbvh_draw(Object *ob, DerivedMesh *dm) +{ + CDDerivedMesh *cddm = (CDDerivedMesh*) dm; + Mesh *me= (ob)? ob->data: NULL; + + if(ob->sculpt->modifiers_active) return 0; + + return (cddm->mvert == me->mvert) || ob->sculpt->kb; +} + static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm) { CDDerivedMesh *cddm = (CDDerivedMesh*) dm; + Mesh *me= (ob)? ob->data: NULL; + if(!ob) { + cddm->pbvh= NULL; + return NULL; + } + + if(!ob->sculpt) + return NULL; + if(ob->sculpt->pbvh) { + cddm->pbvh= ob->sculpt->pbvh; + cddm->pbvh_draw = can_pbvh_draw(ob, dm); + } + + /* always build pbvh from original mesh, and only use it for drawing if + this derivedmesh is just original mesh. it's the multires subsurf dm + that this is actually for, to support a pbvh on a modified mesh */ if(!cddm->pbvh && ob->type == OB_MESH) { - Mesh *me= ob->data; - cddm->pbvh = BLI_pbvh_new(); + cddm->pbvh_draw = can_pbvh_draw(ob, dm); BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert, - me->totface, me->totvert); + me->totface, me->totvert); } return cddm->pbvh; @@ -309,7 +330,7 @@ static void cdDM_drawUVEdges(DerivedMesh *dm) } } -static void cdDM_drawEdges(DerivedMesh *dm, int drawLooseEdges) +static void cdDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges) { CDDerivedMesh *cddm = (CDDerivedMesh*) dm; MVert *mvert = cddm->mvert; @@ -320,7 +341,7 @@ static void cdDM_drawEdges(DerivedMesh *dm, int drawLooseEdges) DEBUG_VBO( "Using legacy code. cdDM_drawEdges\n" ); glBegin(GL_LINES); for(i = 0; i < dm->numEdgeData; i++, medge++) { - if((medge->flag&ME_EDGEDRAW) + if((drawAllEdges || (medge->flag&ME_EDGEDRAW)) && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) { glVertex3fv(mvert[medge->v1].co); glVertex3fv(mvert[medge->v2].co); @@ -336,7 +357,7 @@ static void cdDM_drawEdges(DerivedMesh *dm, int drawLooseEdges) GPU_edge_setup(dm); if( !GPU_buffer_legacy(dm) ) { for(i = 0; i < dm->numEdgeData; i++, medge++) { - if((medge->flag&ME_EDGEDRAW) + if((drawAllEdges || (medge->flag&ME_EDGEDRAW)) && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) { draw = 1; } @@ -425,7 +446,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, glVertex3fv(mvert[index].co); \ } - if(cddm->pbvh) { + if(cddm->pbvh && cddm->pbvh_draw) { if(dm->numFaceData) { float (*face_nors)[3] = CustomData_get_layer(&dm->faceData, CD_NORMAL); @@ -434,7 +455,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, return; glShadeModel((mface->flag & ME_SMOOTH)? GL_SMOOTH: GL_FLAT); - BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors); + BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors, (mface->flag & ME_SMOOTH)); glShadeModel(GL_FLAT); } @@ -736,7 +757,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, if( flag != lastFlag ) { if( startFace < i ) { if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */ - if (lastFlag==1 && mcol) + if (lastFlag==1 && col) GPU_color_switch(1); else GPU_color_switch(0); @@ -749,7 +770,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, } if( startFace < dm->drawObject->nelements/3 ) { if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */ - if (lastFlag==1 && mcol) + if (lastFlag==1 && col) GPU_color_switch(1); else GPU_color_switch(0); @@ -855,47 +876,41 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us } } else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */ - int state = 1; - int prevstate = 1; int prevstart = 0; GPU_vertex_setup(dm); GPU_normal_setup(dm); if( useColors && mc ) GPU_color_setup(dm); if( !GPU_buffer_legacy(dm) ) { + int tottri = dm->drawObject->nelements/3; glShadeModel(GL_SMOOTH); - for( i = 0; i < dm->drawObject->nelements/3; i++ ) { + + for( i = 0; i < tottri; i++ ) { int actualFace = dm->drawObject->faceRemap[i]; int drawSmooth = (mf[actualFace].flag & ME_SMOOTH); - int dontdraw = 0; + int draw = 1; + if(index) { orig = index[actualFace]; if(setDrawOptions && orig == ORIGINDEX_NONE) - dontdraw = 1; + draw = 0; } else orig = actualFace; - if( dontdraw ) { - state = 0; + + if(draw && setDrawOptions && !setDrawOptions(userData, orig, &drawSmooth)) + draw = 0; + + /* Goal is to draw as long of a contiguous triangle + array as possible, so draw when we hit either an + invisible triangle or at the end of the array */ + if(!draw || i == tottri - 1) { + if(prevstart != i) + /* Add one to the length (via `draw') + if we're drawing at the end of the array */ + glDrawArrays(GL_TRIANGLES,prevstart*3, (i-prevstart+draw)*3); + prevstart = i + 1; } - else { - if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) { - state = 1; - } - else { - state = 0; - } - } - if( prevstate != state && prevstate == 1 ) { - if( i-prevstart > 0 ) { - glDrawArrays(GL_TRIANGLES,prevstart*3,(i-prevstart)*3); - } - prevstart = i; - } - prevstate = state; - } - if(state==1) { - glDrawArrays(GL_TRIANGLES,prevstart*3,dm->drawObject->nelements-prevstart*3); } glShadeModel(GL_FLAT); } @@ -1291,10 +1306,10 @@ static void cdDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *us } static void cdDM_foreachMappedVert( - DerivedMesh *dm, - void (*func)(void *userData, int index, float *co, - float *no_f, short *no_s), - void *userData) + DerivedMesh *dm, + void (*func)(void *userData, int index, float *co, + float *no_f, short *no_s), + void *userData) { MVert *mv = CDDM_get_verts(dm); int i, orig, *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX); @@ -1311,10 +1326,10 @@ static void cdDM_foreachMappedVert( } static void cdDM_foreachMappedEdge( - DerivedMesh *dm, - void (*func)(void *userData, int index, - float *v0co, float *v1co), - void *userData) + DerivedMesh *dm, + void (*func)(void *userData, int index, + float *v0co, float *v1co), + void *userData) { CDDerivedMesh *cddm = (CDDerivedMesh*) dm; MVert *mv = cddm->mvert; @@ -1333,17 +1348,16 @@ static void cdDM_foreachMappedEdge( } static void cdDM_foreachMappedFaceCenter( - DerivedMesh *dm, - void (*func)(void *userData, int index, - float *cent, float *no), - void *userData) + DerivedMesh *dm, + void (*func)(void *userData, int index, + float *cent, float *no), + void *userData) { CDDerivedMesh *cddm = (CDDerivedMesh*)dm; MVert *mv = cddm->mvert; MPoly *mf = cddm->mpoly; MLoop *ml = cddm->mloop; int i, j, orig, *index; - int maxf=0; index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX); mf = cddm->mpoly; @@ -1403,7 +1417,6 @@ static void cdDM_recalcTesselation2(DerivedMesh *dm) static void cdDM_free_internal(CDDerivedMesh *cddm) { - if(cddm->pbvh) BLI_pbvh_free(cddm->pbvh); if(cddm->fmap) MEM_freeN(cddm->fmap); if(cddm->fmap_mem) MEM_freeN(cddm->fmap_mem); } @@ -1532,11 +1545,11 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob) alloctype= CD_REFERENCE; CustomData_merge(&mesh->vdata, &dm->vertData, mask, alloctype, - mesh->totvert); + mesh->totvert); CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype, - mesh->totedge); + mesh->totedge); CustomData_merge(&mesh->fdata, &dm->faceData, mask|CD_MASK_ORIGINDEX, alloctype, - mesh->totface); + mesh->totface); CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype, mesh->totloop); CustomData_merge(&mesh->pdata, &dm->polyData, mask, alloctype, @@ -1571,11 +1584,11 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me) dm->deformedOnly = 1; CustomData_merge(&em->vdata, &dm->vertData, CD_MASK_DERIVEDMESH, - CD_CALLOC, dm->numVertData); + CD_CALLOC, dm->numVertData); /* CustomData_merge(&em->edata, &dm->edgeData, CD_MASK_DERIVEDMESH, - CD_CALLOC, dm->numEdgeData); */ + CD_CALLOC, dm->numEdgeData); */ CustomData_merge(&em->fdata, &dm->faceData, CD_MASK_DERIVEDMESH, - CD_CALLOC, dm->numFaceData); + CD_CALLOC, dm->numFaceData); CustomData_merge(&em->fdata, &dm->faceData, CD_MASK_DERIVEDMESH, CD_CALLOC, dm->numFaceData); @@ -1596,7 +1609,7 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me) index = dm->getVertDataArray(dm, CD_ORIGINDEX); for(i = 0, eve = em->verts.first; i < dm->numVertData; - i++, eve = eve->next, index++) { + i++, eve = eve->next, index++) { MVert *mv = &mvert[i]; VECCOPY(mv->co, eve->co); @@ -1616,7 +1629,7 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me) index = dm->getEdgeDataArray(dm, CD_ORIGINDEX); for(i = 0, eed = em->edges.first; i < dm->numEdgeData; - i++, eed = eed->next, index++) { + i++, eed = eed->next, index++) { MEdge *med = &medge[i]; med->v1 = eed->v1->tmp.l; @@ -1636,7 +1649,7 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me) index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX); for(i = 0, efa = em->faces.first; i < dm->numFaceData; - i++, efa = efa->next, index++) { + i++, efa = efa->next, index++) { MFace *mf = &mface[i]; mf->v1 = efa->v1->tmp.l; @@ -1655,10 +1668,45 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me) return dm; } +DerivedMesh *CDDM_from_curve(Object *ob) +{ + return CDDM_from_curve_customDB(ob, &((Curve *)ob->data)->disp); +} + +DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase) +{ + DerivedMesh *dm; + CDDerivedMesh *cddm; + MVert *allvert; + MEdge *alledge; + MFace *allface; + int totvert, totedge, totface; + + if (nurbs_to_mdata_customdb(ob, dispbase, &allvert, &totvert, &alledge, + &totedge, &allface, &totface) != 0) { + /* Error initializing mdata. This often happens when curve is empty */ + return CDDM_new(0, 0, 0, 0, 0); + } + + dm = CDDM_new(totvert, totedge, totface, totface*4, totface); + dm->deformedOnly = 1; + + cddm = (CDDerivedMesh*)dm; + + memcpy(cddm->mvert, allvert, totvert*sizeof(MVert)); + memcpy(cddm->medge, alledge, totedge*sizeof(MEdge)); + memcpy(cddm->mface, allface, totface*sizeof(MFace)); + + MEM_freeN(allvert); + MEM_freeN(alledge); + MEM_freeN(allface); + + return dm; +} static void loops_to_customdata_corners(BMesh *bm, CustomData *facedata, - int cdindex, BMLoop *l3[3], - int numCol, int numTex) + int cdindex, BMLoop *l3[3], + int numCol, int numTex) { BMLoop *l; BMFace *f = l3[0]->f; @@ -2029,7 +2077,7 @@ DerivedMesh *CDDM_copy(DerivedMesh *source, int faces_from_tessfaces) DerivedMesh *CDDM_from_template(DerivedMesh *source, int numVerts, int numEdges, int numFaces, - int numLoops, int numPolys) + int numLoops, int numPolys) { CDDerivedMesh *cddm = cdDM_create("CDDM_from_template dest"); DerivedMesh *dm = &cddm->dm; @@ -2107,6 +2155,9 @@ void CDDM_calc_normals(DerivedMesh *dm) if (CustomData_has_layer(&dm->faceData, CD_NORMAL)) CustomData_free_layer(&dm->faceData, CD_NORMAL, dm->numFaceData, 0); + temp_nors = MEM_callocN(numVerts * sizeof(*temp_nors), + "CDDM_calc_normals temp_nors"); + /*recalc tesselation to ensure we have valid origindex values for mface->mpoly lookups.*/ cdDM_recalcTesselation2(dm); @@ -2202,7 +2253,7 @@ void CDDM_calc_edges(DerivedMesh *dm) med = CustomData_get_layer(&edgeData, CD_MEDGE); index = CustomData_get_layer(&edgeData, CD_ORIGINDEX); for(i = 0; !BLI_edgehashIterator_isDone(ehi); - BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) { + BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) { BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2); med->flag = ME_EDGEDRAW|ME_EDGERENDER; diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index bb3c8476a2a..44b17265807 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -27,23 +27,13 @@ #include "MEM_guardedalloc.h" -#include "BKE_cloth.h" - -#include "DNA_cloth_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_force.h" -#include "DNA_scene_types.h" -#include "DNA_particle_types.h" - -#include "BKE_deform.h" -#include "BKE_DerivedMesh.h" #include "BKE_cdderivedmesh.h" +#include "BKE_cloth.h" #include "BKE_effect.h" #include "BKE_global.h" -#include "BKE_object.h" #include "BKE_modifier.h" +#include "BKE_pointcache.h" #include "BKE_utildefines.h" -#include "BKE_particle.h" #include "BKE_pointcache.h" @@ -87,7 +77,7 @@ double tval() static CM_SOLVER_DEF solvers [] = { { "Implicit", CM_IMPLICIT, implicit_init, implicit_solver, implicit_free }, - // { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free }, + // { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free }, }; /* ********** cloth engine ******* */ @@ -368,14 +358,12 @@ static int do_init_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul /* initialize simulation data if it didn't exist already */ if(clmd->clothObject == NULL) { if(!cloth_from_object(ob, clmd, result, framenr, 1)) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; + BKE_ptcache_invalidate(cache); return 0; } if(clmd->clothObject == NULL) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; + BKE_ptcache_invalidate(cache); return 0; } @@ -448,20 +436,17 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, clmd->sim_parms->timescale= timescale; if(!result) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return dm; } if(clmd->sim_parms->reset || (framenr == (startframe - clmd->sim_parms->preroll))) { clmd->sim_parms->reset = 0; - cache->flag |= PTCACHE_REDO_NEEDED; + cache->flag |= PTCACHE_OUTDATED; BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED); - cache->simframe= 0; + BKE_ptcache_validate(cache, 0); cache->last_exact= 0; - cache->flag |= PTCACHE_SIMULATION_VALID; cache->flag &= ~PTCACHE_REDO_NEEDED; return result; } @@ -472,9 +457,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, * happen because of object changes! */ if(clmd->clothObject) { if(result->getNumVerts(result) != clmd->clothObject->numverts) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return result; } } @@ -484,9 +467,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, /* handle continuous simulation with the play button */ if(BKE_ptcache_get_continue_physics() || ((clmd->sim_parms->preroll > 0) && (framenr > startframe - clmd->sim_parms->preroll) && (framenr < startframe))) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); /* do simulation */ if(!do_init_cloth(ob, clmd, result, framenr)) @@ -500,9 +481,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, /* simulation is only active during a specific period */ if(framenr < startframe) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return result; } else if(framenr > endframe) { @@ -521,8 +500,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, if((framenr == startframe) && (clmd->sim_parms->preroll == 0)) { BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED); do_init_cloth(ob, clmd, result, framenr); - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_validate(cache, framenr); cache->flag &= ~PTCACHE_REDO_NEEDED; return result; } @@ -534,8 +512,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, implicit_set_positions(clmd); cloth_to_object (ob, clmd, result); - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_validate(cache, framenr); if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED) BKE_ptcache_write_cache(&pid, framenr); @@ -544,13 +521,10 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, } else if(cache_result==PTCACHE_READ_OLD) { implicit_set_positions(clmd); - cache->flag |= PTCACHE_SIMULATION_VALID; } else if( /*ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED)) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */ /* if baked and nothing in cache, do nothing */ - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return result; } @@ -561,13 +535,10 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, clmd->sim_parms->timescale *= framenr - cache->simframe; /* do simulation */ - cache->flag |= PTCACHE_SIMULATION_VALID; - cache->simframe= framenr; + BKE_ptcache_validate(cache, framenr); if(!do_step_cloth(ob, clmd, result, framenr)) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); } else BKE_ptcache_write_cache(&pid, framenr); @@ -752,6 +723,15 @@ static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh * } +int cloth_uses_vgroup(ClothModifierData *clmd) +{ + return (((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) || + (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )) && + ((clmd->sim_parms->vgroup_mass>0) || + (clmd->sim_parms->vgroup_struct>0)|| + (clmd->sim_parms->vgroup_bend>0))); +} + /** * cloth_apply_vgroup - applies a vertex group as specified by type * @@ -775,11 +755,7 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm ) verts = clothObj->verts; - if (((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) || - (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )) && - ((clmd->sim_parms->vgroup_mass>0) || - (clmd->sim_parms->vgroup_struct>0)|| - (clmd->sim_parms->vgroup_bend>0))) + if (cloth_uses_vgroup(clmd)) { for ( i = 0; i < numverts; i++, verts++ ) { @@ -801,7 +777,7 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm ) verts->goal = ( float ) pow ( verts->goal , 4.0f ); if ( verts->goal >=SOFTGOALSNAP ) { - verts->flags |= CLOTH_VERT_FLAG_PINNED; + verts->flags |= CLOTH_VERT_FLAG_PINNED; } } @@ -836,6 +812,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d int i = 0; MVert *mvert = NULL; ClothVertex *verts = NULL; + float (*shapekey_rest)[3]= NULL; float tnull[3] = {0,0,0}; Cloth *cloth = NULL; float maxdist = 0; @@ -873,7 +850,11 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d clmd->clothObject->springs = NULL; clmd->clothObject->numsprings = -1; + if( clmd->sim_parms->shapekey_rest ) + shapekey_rest = dm->getVertDataArray ( dm, CD_CLOTH_ORCO ); + mvert = dm->getVertArray ( dm ); + verts = clmd->clothObject->verts; // set initial values @@ -881,8 +862,16 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d { if(first) { - VECCOPY ( verts->x, mvert[i].co ); + copy_v3_v3( verts->x, mvert[i].co ); + mul_m4_v3( ob->obmat, verts->x ); + + if( shapekey_rest ) { + verts->xrest= shapekey_rest[i]; + mul_m4_v3( ob->obmat, verts->xrest ); + } + else + verts->xrest = verts->x; } /* no GUI interface yet */ @@ -1101,7 +1090,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) { spring->ij = MIN2(medge[i].v1, medge[i].v2); spring->kl = MAX2(medge[i].v2, medge[i].v1); - VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); + VECSUB ( temp, cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest ); spring->restlen = sqrt ( INPR ( temp, temp ) ); clmd->sim_parms->avg_spring_len += spring->restlen; cloth->verts[spring->ij].avg_spring_len += spring->restlen; @@ -1147,7 +1136,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) spring->ij = MIN2(mface[i].v1, mface[i].v3); spring->kl = MAX2(mface[i].v3, mface[i].v1); - VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); + VECSUB ( temp, cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest ); spring->restlen = sqrt ( INPR ( temp, temp ) ); spring->type = CLOTH_SPRING_TYPE_SHEAR; spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0; @@ -1170,7 +1159,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) spring->ij = MIN2(mface[i].v2, mface[i].v4); spring->kl = MAX2(mface[i].v4, mface[i].v2); - VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); + VECSUB ( temp, cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest ); spring->restlen = sqrt ( INPR ( temp, temp ) ); spring->type = CLOTH_SPRING_TYPE_SHEAR; spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0; @@ -1212,7 +1201,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) spring->ij = MIN2(tspring2->ij, index2); spring->kl = MAX2(tspring2->ij, index2); - VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); + VECSUB ( temp, cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest ); spring->restlen = sqrt ( INPR ( temp, temp ) ); spring->type = CLOTH_SPRING_TYPE_BENDING; spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0; @@ -1252,7 +1241,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) spring->ij = tspring2->ij; spring->kl = tspring->kl; - VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); + VECSUB ( temp, cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest ); spring->restlen = sqrt ( INPR ( temp, temp ) ); spring->type = CLOTH_SPRING_TYPE_BENDING; spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0; diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index b024ba5f4e1..9b49ac9c6ff 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -40,6 +40,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_global.h" +#include "BKE_scene.h" #include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_modifier.h" @@ -59,7 +60,7 @@ Collision modifier code start /* step is limited from 0 (frame start position) to 1 (frame end position) */ void collision_move_object ( CollisionModifierData *collmd, float step, float prevstep ) { - float tv[3] = {0,0,0}; + float tv[3] = {0, 0, 0}; unsigned int i = 0; for ( i = 0; i < collmd->numverts; i++ ) @@ -69,6 +70,7 @@ void collision_move_object ( CollisionModifierData *collmd, float step, float pr VECADDS ( collmd->current_xnew[i].co, collmd->x[i].co, tv, step ); VECSUB ( collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co ); } + bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 ); } @@ -527,7 +529,7 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier float magtangent = 0, repulse = 0, d = 0; double impulse = 0.0; float vrel_t_pre[3]; - float temp[3]; + float temp[3], spf; // calculate tangential velocity VECCOPY ( temp, collpair->normal ); @@ -565,10 +567,12 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier // Apply repulse impulse if distance too short // I_r = -min(dt*kd, m(0,1d/dt - v_n)) + spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale; + d = clmd->coll_parms->epsilon*8.0/9.0 + epsilon2*8.0/9.0 - collpair->distance; - if ( ( magrelVel < 0.1*d*clmd->sim_parms->stepsPerFrame ) && ( d > ALMOST_ZERO ) ) + if ( ( magrelVel < 0.1*d*spf ) && ( d > ALMOST_ZERO ) ) { - repulse = MIN2 ( d*1.0/clmd->sim_parms->stepsPerFrame, 0.1*d*clmd->sim_parms->stepsPerFrame - magrelVel ); + repulse = MIN2 ( d*1.0/spf, 0.1*d*spf - magrelVel ); // stay on the safe side and clamp repulse if ( impulse > ALMOST_ZERO ) @@ -1299,188 +1303,130 @@ static int cloth_collision_moving ( ClothModifierData *clmd, CollisionModifierDa } #endif +static void add_collision_object(Object ***objs, int *numobj, int *maxobj, Object *ob, Object *self, int level) +{ + CollisionModifierData *cmd= NULL; + + if(ob == self) + return; + + /* only get objects with collision modifier */ + if(ob->pd && ob->pd->deflect) + cmd= (CollisionModifierData *)modifiers_findByType(ob, eModifierType_Collision); + + if(cmd) { + /* extend array */ + if(*numobj >= *maxobj) { + *maxobj *= 2; + *objs= MEM_reallocN(*objs, sizeof(Object*)*(*maxobj)); + } + + (*objs)[*numobj] = ob; + (*numobj)++; + } + + /* objects in dupli groups, one level only for now */ + if(ob->dup_group && level == 0) { + GroupObject *go; + Group *group= ob->dup_group; + + /* add objects */ + for(go= group->gobject.first; go; go= go->next) + add_collision_object(objs, numobj, maxobj, go->ob, self, level+1); + } +} // return all collision objects in scene // collision object will exclude self -Object **get_collisionobjects(Scene *scene, Object *self, int *numcollobj) +Object **get_collisionobjects(Scene *scene, Object *self, Group *group, int *numcollobj) { - Base *base=NULL; - Object **objs = NULL; - Object *coll_ob = NULL; - CollisionModifierData *collmd = NULL; - int numobj = 0, maxobj = 100; + Base *base; + Object **objs; + GroupObject *go; + int numobj= 0, maxobj= 100; - objs = MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray"); - // check all collision objects - for ( base = scene->base.first; base; base = base->next ) - { - /*Only proceed for mesh object in same layer */ - if(!(base->object->type==OB_MESH && (base->lay & self->lay))) - continue; - - coll_ob = base->object; - - if(coll_ob == self) - continue; - - if(coll_ob->pd && coll_ob->pd->deflect) - { - collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision ); - } - else - collmd = NULL; - - if ( collmd ) - { - if(numobj >= maxobj) - { - // realloc - int oldmax = maxobj; - Object **tmp; - maxobj *= 2; - tmp = MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray"); - memcpy(tmp, objs, sizeof(Object *)*oldmax); - MEM_freeN(objs); - objs = tmp; - - } - - objs[numobj] = coll_ob; - numobj++; - } - else - { - if ( coll_ob->dup_group ) - { - GroupObject *go; - Group *group = coll_ob->dup_group; + objs= MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray"); - for ( go= group->gobject.first; go; go= go->next ) - { - coll_ob = go->ob; - collmd = NULL; - - if(coll_ob == self) - continue; - - if(coll_ob->pd && coll_ob->pd->deflect) - { - collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision ); - } - else - collmd = NULL; - - if ( !collmd ) - continue; - - if( !collmd->bvhtree) - continue; - - if(numobj >= maxobj) - { - // realloc - int oldmax = maxobj; - Object **tmp; - maxobj *= 2; - tmp = MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray"); - memcpy(tmp, objs, sizeof(Object *)*oldmax); - MEM_freeN(objs); - objs = tmp; - } - - objs[numobj] = coll_ob; - numobj++; - } - } - } + /* gather all collision objects */ + if(group) { + /* use specified group */ + for(go= group->gobject.first; go; go= go->next) + add_collision_object(&objs, &numobj, &maxobj, go->ob, self, 0); } - *numcollobj = numobj; + else { + Scene *sce; /* for SETLOOPER macro */ + /* add objects in same layer in scene */ + for(SETLOOPER(scene, base)) { + if(base->lay & self->lay) + add_collision_object(&objs, &numobj, &maxobj, base->object, self, 0); + + } + } + + *numcollobj= numobj; + return objs; } -ListBase *get_collider_cache(Scene *scene, Object *self) +static void add_collider_cache_object(ListBase **objs, Object *ob, Object *self, int level) { - Base *base=NULL; - ListBase *objs = NULL; - Object *coll_ob = NULL; - CollisionModifierData *collmd = NULL; + CollisionModifierData *cmd= NULL; ColliderCache *col; + + if(ob == self) + return; + + if(ob->pd && ob->pd->deflect) + cmd =(CollisionModifierData *)modifiers_findByType(ob, eModifierType_Collision); - // check all collision objects - for ( base = scene->base.first; base; base = base->next ) - { - /*Only proceed for mesh object in same layer */ - if(base->object->type!=OB_MESH) - continue; + if(cmd && cmd->bvhtree) { + if(*objs == NULL) + *objs = MEM_callocN(sizeof(ListBase), "ColliderCache array"); - if(self && (base->lay & self->lay)==0) - continue; - - - coll_ob = base->object; - - if(coll_ob == self) - continue; - - if(coll_ob->pd && coll_ob->pd->deflect) - { - collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision ); - } - else - collmd = NULL; - - if ( collmd ) - { - if(objs == NULL) - objs = MEM_callocN(sizeof(ListBase), "ColliderCache array"); - - col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); - col->ob = coll_ob; - col->collmd = collmd; - /* make sure collider is properly set up */ - collision_move_object(collmd, 1.0, 0.0); - BLI_addtail(objs, col); - } - else if ( coll_ob->dup_group ) - { - GroupObject *go; - Group *group = coll_ob->dup_group; - - for ( go= group->gobject.first; go; go= go->next ) - { - coll_ob = go->ob; - collmd = NULL; - - if(coll_ob == self) - continue; - - if(coll_ob->pd && coll_ob->pd->deflect) - { - collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision ); - } - else - collmd = NULL; - - if ( !collmd ) - continue; - - if( !collmd->bvhtree) - continue; - - if(objs == NULL) - objs = MEM_callocN(sizeof(ListBase), "ColliderCache array"); - - col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); - col->ob = coll_ob; - col->collmd = collmd; - /* make sure collider is properly set up */ - collision_move_object(collmd, 1.0, 0.0); - BLI_addtail(objs, col); - } - } + col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); + col->ob = ob; + col->collmd = cmd; + /* make sure collider is properly set up */ + collision_move_object(cmd, 1.0, 0.0); + BLI_addtail(*objs, col); } + + /* objects in dupli groups, one level only for now */ + if(ob->dup_group && level == 0) { + GroupObject *go; + Group *group= ob->dup_group; + + /* add objects */ + for(go= group->gobject.first; go; go= go->next) + add_collider_cache_object(objs, go->ob, self, level+1); + } +} + +ListBase *get_collider_cache(Scene *scene, Object *self, Group *group) +{ + GroupObject *go; + ListBase *objs= NULL; + + /* add object in same layer in scene */ + if(group) { + for(go= group->gobject.first; go; go= go->next) + add_collider_cache_object(&objs, go->ob, self, 0); + } + else { + Scene *sce; /* for SETLOOPER macro */ + Base *base; + + /* add objects in same layer in scene */ + for(SETLOOPER(scene, base)) { + if(!self || (base->lay & self->lay)) + add_collider_cache_object(&objs, base->object, self, 0); + + } + } + return objs; } + void free_collider_cache(ListBase **colliders) { if(*colliders) { @@ -1489,6 +1435,7 @@ void free_collider_cache(ListBase **colliders) *colliders = NULL; } } + static void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair **collisions, CollPair **collisions_index, int numresult, BVHTreeOverlap *overlap) { int i; @@ -1574,7 +1521,7 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl bvhtree_update_from_cloth ( clmd, 1 ); // 0 means STATIC, 1 means MOVING (see later in this function) bvhselftree_update_from_cloth ( clmd, 0 ); // 0 means STATIC, 1 means MOVING (see later in this function) - collobjs = get_collisionobjects(clmd->scene, ob, &numcollobj); + collobjs = get_collisionobjects(clmd->scene, ob, clmd->coll_parms->group, &numcollobj); if(!collobjs) return 0; @@ -1606,20 +1553,15 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl overlap = BLI_bvhtree_overlap ( cloth_bvh, collmd->bvhtree, &result ); // go to next object if no overlap is there - if(!result || !overlap) - { - if ( overlap ) - MEM_freeN ( overlap ); - continue; + if( result && overlap ) { + /* check if collisions really happen (costly near check) */ + cloth_bvh_objcollisions_nearcheck ( clmd, collmd, &collisions[i], &collisions_index[i], result, overlap); + + // resolve nearby collisions + ret += cloth_bvh_objcollisions_resolve ( clmd, collmd, collisions[i], collisions_index[i]); + ret2 += ret; } - - /* check if collisions really happen (costly near check) */ - cloth_bvh_objcollisions_nearcheck ( clmd, collmd, &collisions[i], &collisions_index[i], result, overlap); - - // resolve nearby collisions - ret += cloth_bvh_objcollisions_resolve ( clmd, collmd, collisions[i], collisions_index[i]); - ret2 += ret; - + if ( overlap ) MEM_freeN ( overlap ); } diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index 71b497660e9..a07c18f42f3 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -40,20 +40,14 @@ #include "DNA_color_types.h" #include "DNA_curve_types.h" -#include "DNA_image_types.h" -#include "DNA_texture_types.h" #include "BKE_colortools.h" #include "BKE_curve.h" -#include "BKE_global.h" #include "BKE_ipo.h" -#include "BKE_image.h" -#include "BKE_main.h" #include "BKE_utildefines.h" #include "BLI_blenlib.h" #include "BLI_math.h" -#include "BLI_threads.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -132,6 +126,9 @@ CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, floa cumap->cm[a].curve[1].x= maxx; cumap->cm[a].curve[1].y= maxy; } + + cumap->changed_timestamp = 0; + return cumap; } @@ -239,16 +236,19 @@ void curvemap_insert(CurveMap *cuma, float x, float y) cuma->curve= cmp; } -void curvemap_reset(CurveMap *cuma, rctf *clipr, CurveMappingPreset preset) +void curvemap_reset(CurveMap *cuma, rctf *clipr, int preset) { if(cuma->curve) MEM_freeN(cuma->curve); switch(preset) { case CURVE_PRESET_LINE: cuma->totpoint= 2; break; - case CURVE_PRESET_SHARP: cuma->totpoint= 3; break; + case CURVE_PRESET_SHARP: cuma->totpoint= 4; break; case CURVE_PRESET_SMOOTH: cuma->totpoint= 4; break; case CURVE_PRESET_MAX: cuma->totpoint= 2; break; + case CURVE_PRESET_MID9: cuma->totpoint= 9; break; + case CURVE_PRESET_ROUND: cuma->totpoint= 4; break; + case CURVE_PRESET_ROOT: cuma->totpoint= 4; break; } cuma->curve= MEM_callocN(cuma->totpoint*sizeof(CurveMapPoint), "curve points"); @@ -256,27 +256,29 @@ void curvemap_reset(CurveMap *cuma, rctf *clipr, CurveMappingPreset preset) switch(preset) { case CURVE_PRESET_LINE: cuma->curve[0].x= clipr->xmin; - cuma->curve[0].y= clipr->ymin; + cuma->curve[0].y= clipr->ymax; cuma->curve[0].flag= 0; cuma->curve[1].x= clipr->xmax; - cuma->curve[1].y= clipr->ymax; + cuma->curve[1].y= clipr->ymin; cuma->curve[1].flag= 0; break; case CURVE_PRESET_SHARP: cuma->curve[0].x= 0; cuma->curve[0].y= 1; - cuma->curve[1].x= 0.33; - cuma->curve[1].y= 0.33; - cuma->curve[2].x= 1; - cuma->curve[2].y= 0; + cuma->curve[1].x= 0.25; + cuma->curve[1].y= 0.50; + cuma->curve[2].x= 0.75; + cuma->curve[2].y= 0.04; + cuma->curve[3].x= 1; + cuma->curve[3].y= 0; break; case CURVE_PRESET_SMOOTH: cuma->curve[0].x= 0; cuma->curve[0].y= 1; cuma->curve[1].x= 0.25; - cuma->curve[1].y= 0.92; + cuma->curve[1].y= 0.94; cuma->curve[2].x= 0.75; - cuma->curve[2].y= 0.08; + cuma->curve[2].y= 0.06; cuma->curve[3].x= 1; cuma->curve[3].y= 0; break; @@ -286,8 +288,38 @@ void curvemap_reset(CurveMap *cuma, rctf *clipr, CurveMappingPreset preset) cuma->curve[1].x= 1; cuma->curve[1].y= 1; break; + case CURVE_PRESET_MID9: + { + int i; + for (i=0; i < cuma->totpoint; i++) + { + cuma->curve[i].x= i / ((float)cuma->totpoint-1); + cuma->curve[i].y= 0.5; + } + } + break; + case CURVE_PRESET_ROUND: + cuma->curve[0].x= 0; + cuma->curve[0].y= 1; + cuma->curve[1].x= 0.5; + cuma->curve[1].y= 0.90; + cuma->curve[2].x= 0.86; + cuma->curve[2].y= 0.5; + cuma->curve[3].x= 1; + cuma->curve[3].y= 0; + break; + case CURVE_PRESET_ROOT: + cuma->curve[0].x= 0; + cuma->curve[0].y= 1; + cuma->curve[1].x= 0.25; + cuma->curve[1].y= 0.95; + cuma->curve[2].x= 0.75; + cuma->curve[2].y= 0.44; + cuma->curve[3].x= 1; + cuma->curve[3].y= 0; + break; } - + if(cuma->table) { MEM_freeN(cuma->table); cuma->table= NULL; @@ -463,7 +495,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) if(vec[0] < bezt[0].vec[1][0]) vec[0]= bezt[0].vec[1][0]; - sub_v3_v3v3(vec, vec, bezt[0].vec[1]); + sub_v3_v3(vec, bezt[0].vec[1]); nlen= len_v3(vec); if(nlen>FLT_EPSILON) { mul_v3_fl(vec, hlen/nlen); @@ -480,7 +512,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) if(vec[0] > bezt[a].vec[1][0]) vec[0]= bezt[a].vec[1][0]; - sub_v3_v3v3(vec, vec, bezt[a].vec[1]); + sub_v3_v3(vec, bezt[a].vec[1]); nlen= len_v3(vec); if(nlen>FLT_EPSILON) { mul_v3_fl(vec, hlen/nlen); @@ -615,7 +647,9 @@ void curvemapping_changed(CurveMapping *cumap, int rem_doubles) float thresh= 0.01f*(clipr->xmax - clipr->xmin); float dx= 0.0f, dy= 0.0f; int a; - + + cumap->changed_timestamp++; + /* clamp with clip */ if(cumap->flag & CUMA_DO_CLIP) { for(a=0; a<cuma->totpoint; a++) { @@ -697,7 +731,7 @@ float curvemapping_evaluateF(CurveMapping *cumap, int cur, float value) if(cuma->table==NULL) { curvemap_make_table(cuma, &cumap->clipr); if(cuma->table==NULL) - return value; + return 1.0f-value; } return curvemap_evaluateF(cuma, value); } @@ -750,10 +784,10 @@ void colorcorrection_do_ibuf(ImBuf *ibuf, const char *profile) cmsErrorAction(LCMS_ERROR_SHOW); hTransform = cmsCreateProofingTransform(imageProfile, TYPE_RGBA_8, imageProfile, TYPE_RGBA_8, - proofingProfile, - INTENT_ABSOLUTE_COLORIMETRIC, - INTENT_ABSOLUTE_COLORIMETRIC, - cmsFLAGS_SOFTPROOFING); + proofingProfile, + INTENT_ABSOLUTE_COLORIMETRIC, + INTENT_ABSOLUTE_COLORIMETRIC, + cmsFLAGS_SOFTPROOFING); cmsDoTransform(hTransform, ibuf->rect, ibuf->crect, ibuf->x * ibuf->y); @@ -881,6 +915,8 @@ void curvemapping_table_RGBA(CurveMapping *cumap, float **array, int *size) /* ***************** Histogram **************** */ +#define INV_255 (1.f/255.f) + DO_INLINE int get_bin_float(float f) { int bin= (int)(f*255); @@ -893,59 +929,176 @@ DO_INLINE int get_bin_float(float f) return bin; } - -void histogram_update(Histogram *hist, ImBuf *ibuf) +DO_INLINE void save_sample_line(Scopes *scopes, const int idx, const float fx, float *rgb, float *ycc) { - int x, y, n; - double div; - float *rf; - unsigned char *rc; - unsigned int *bin_r, *bin_g, *bin_b; - - if (hist->ok == 1 ) return; - - if (hist->xmax == 0.f) hist->xmax = 1.f; - if (hist->ymax == 0.f) hist->ymax = 1.f; - + float yuv[3]; + + /* vectorscope*/ + rgb_to_yuv(rgb[0], rgb[1], rgb[2], &yuv[0], &yuv[1], &yuv[2]); + scopes->vecscope[idx + 0] = yuv[1]; + scopes->vecscope[idx + 1] = yuv[2]; + + /* waveform */ + switch (scopes->wavefrm_mode) { + case SCOPES_WAVEFRM_RGB: + scopes->waveform_1[idx + 0] = fx; + scopes->waveform_1[idx + 1] = rgb[0]; + scopes->waveform_2[idx + 0] = fx; + scopes->waveform_2[idx + 1] = rgb[1]; + scopes->waveform_3[idx + 0] = fx; + scopes->waveform_3[idx + 1] = rgb[2]; + break; + case SCOPES_WAVEFRM_LUMA: + scopes->waveform_1[idx + 0] = fx; + scopes->waveform_1[idx + 1] = ycc[0]; + break; + case SCOPES_WAVEFRM_YCC_JPEG: + case SCOPES_WAVEFRM_YCC_709: + case SCOPES_WAVEFRM_YCC_601: + scopes->waveform_1[idx + 0] = fx; + scopes->waveform_1[idx + 1] = ycc[0]; + scopes->waveform_2[idx + 0] = fx; + scopes->waveform_2[idx + 1] = ycc[1]; + scopes->waveform_3[idx + 0] = fx; + scopes->waveform_3[idx + 1] = ycc[2]; + break; + } +} + +void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management) +{ + int x, y, c, n, nl; + double div, divl; + float *rf=NULL; + unsigned char *rc=NULL; + unsigned int *bin_r, *bin_g, *bin_b, *bin_lum; + int savedlines, saveline; + float rgb[3], ycc[3], luma; + int ycc_mode=-1; + + if (scopes->ok == 1 ) return; + + if (scopes->hist.ymax == 0.f) scopes->hist.ymax = 1.f; + /* hmmmm */ if (!(ELEM(ibuf->channels, 3, 4))) return; - - hist->channels = 3; - + scopes->hist.channels = 3; + scopes->hist.x_resolution = 256; + + switch (scopes->wavefrm_mode) { + case SCOPES_WAVEFRM_RGB: + ycc_mode = -1; + break; + case SCOPES_WAVEFRM_LUMA: + case SCOPES_WAVEFRM_YCC_JPEG: + ycc_mode = BLI_YCC_JFIF_0_255; + break; + case SCOPES_WAVEFRM_YCC_601: + ycc_mode = BLI_YCC_ITU_BT601; + break; + case SCOPES_WAVEFRM_YCC_709: + ycc_mode = BLI_YCC_ITU_BT709; + break; + } + + /* temp table to count pix value for histo */ bin_r = MEM_callocN(256 * sizeof(unsigned int), "temp historgram bins"); bin_g = MEM_callocN(256 * sizeof(unsigned int), "temp historgram bins"); bin_b = MEM_callocN(256 * sizeof(unsigned int), "temp historgram bins"); + bin_lum = MEM_callocN(256 * sizeof(unsigned int), "temp historgram bins"); + + /* convert to number of lines with logarithmic scale */ + scopes->sample_lines = (scopes->accuracy*0.01) * (scopes->accuracy*0.01) * ibuf->y; - if (ibuf->rect_float) { - hist->x_resolution = 256; - - /* divide into bins */ + if (scopes->sample_full) + scopes->sample_lines = ibuf->y; + + /* scan the image */ + savedlines=0; + for (c=0; c<3; c++) { + scopes->minmax[c][0]=25500.0f; + scopes->minmax[c][1]=-25500.0f; + } + + scopes->waveform_tot = ibuf->x*scopes->sample_lines; + + if (scopes->waveform_1) + MEM_freeN(scopes->waveform_1); + if (scopes->waveform_2) + MEM_freeN(scopes->waveform_2); + if (scopes->waveform_3) + MEM_freeN(scopes->waveform_3); + if (scopes->vecscope) + MEM_freeN(scopes->vecscope); + + scopes->waveform_1= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "waveform point channel 1"); + scopes->waveform_2= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "waveform point channel 2"); + scopes->waveform_3= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "waveform point channel 3"); + scopes->vecscope= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "vectorscope point channel"); + + if (ibuf->rect_float) rf = ibuf->rect_float; - for (y = 0; y < ibuf->y; y++) { - for (x = 0; x < ibuf->x; x++) { - bin_r[ get_bin_float(rf[0]) ] += 1; - bin_g[ get_bin_float(rf[1]) ] += 1; - bin_b[ get_bin_float(rf[2]) ] += 1; - rf+= ibuf->channels; - } - } - } - else if (ibuf->rect) { - hist->x_resolution = 256; - + else if (ibuf->rect) rc = (unsigned char *)ibuf->rect; - for (y = 0; y < ibuf->y; y++) { - for (x = 0; x < ibuf->x; x++) { - bin_r[ rc[0] ] += 1; - bin_g[ rc[1] ] += 1; - bin_b[ rc[2] ] += 1; - rc += ibuf->channels; + + for (y = 0; y < ibuf->y; y++) { + if (savedlines<scopes->sample_lines && y>=((savedlines)*ibuf->y)/(scopes->sample_lines+1)) { + saveline=1; + } else saveline=0; + for (x = 0; x < ibuf->x; x++) { + + if (ibuf->rect_float) { + if (use_color_management) + linearrgb_to_srgb_v3_v3(rgb, rf); + else + copy_v3_v3(rgb, rf); } + else if (ibuf->rect) { + for (c=0; c<3; c++) + rgb[c] = rc[c] * INV_255; + } + + /* we still need luma for histogram */ + luma = 0.299*rgb[0] + 0.587*rgb[1] + 0.114 * rgb[2]; + + /* check for min max */ + if(ycc_mode == -1 ) { + for (c=0; c<3; c++) { + if (rgb[c] < scopes->minmax[c][0]) scopes->minmax[c][0] = rgb[c]; + if (rgb[c] > scopes->minmax[c][1]) scopes->minmax[c][1] = rgb[c]; + } + } + else { + rgb_to_ycc(rgb[0],rgb[1],rgb[2],&ycc[0],&ycc[1],&ycc[2], ycc_mode); + for (c=0; c<3; c++) { + ycc[c] *=INV_255; + if (ycc[c] < scopes->minmax[c][0]) scopes->minmax[c][0] = ycc[c]; + if (ycc[c] > scopes->minmax[c][1]) scopes->minmax[c][1] = ycc[c]; + } + } + /* increment count for histo*/ + bin_r[ get_bin_float(rgb[0]) ] += 1; + bin_g[ get_bin_float(rgb[1]) ] += 1; + bin_b[ get_bin_float(rgb[2]) ] += 1; + bin_lum[ get_bin_float(luma) ] += 1; + + /* save sample if needed */ + if(saveline) { + const float fx = (float)x / (float)ibuf->x; + const int idx = 2*(ibuf->x*savedlines+x); + save_sample_line(scopes, idx, fx, rgb, ycc); + } + + rf+= ibuf->channels; + rc+= ibuf->channels; } + if (saveline) + savedlines +=1; } - - /* convert to float */ + + /* convert hist data to float (proportional to max count) */ n=0; + nl=0; for (x=0; x<256; x++) { if (bin_r[x] > n) n = bin_r[x]; @@ -953,17 +1106,57 @@ void histogram_update(Histogram *hist, ImBuf *ibuf) n = bin_g[x]; if (bin_b[x] > n) n = bin_b[x]; + if (bin_lum[x] > nl) + nl = bin_lum[x]; } div = 1.f/(double)n; + divl = 1.f/(double)nl; for (x=0; x<256; x++) { - hist->data_r[x] = bin_r[x] * div; - hist->data_g[x] = bin_g[x] * div; - hist->data_b[x] = bin_b[x] * div; + scopes->hist.data_r[x] = bin_r[x] * div; + scopes->hist.data_g[x] = bin_g[x] * div; + scopes->hist.data_b[x] = bin_b[x] * div; + scopes->hist.data_luma[x] = bin_lum[x] * divl; } - MEM_freeN(bin_r); MEM_freeN(bin_g); MEM_freeN(bin_b); - - hist->ok=1; + MEM_freeN(bin_lum); + + scopes->ok = 1; +} + +void scopes_free(Scopes *scopes) +{ + if (scopes->waveform_1) { + MEM_freeN(scopes->waveform_1); + scopes->waveform_1 = NULL; + } + if (scopes->waveform_2) { + MEM_freeN(scopes->waveform_2); + scopes->waveform_2 = NULL; + } + if (scopes->waveform_3) { + MEM_freeN(scopes->waveform_3); + scopes->waveform_3 = NULL; + } + if (scopes->vecscope) { + MEM_freeN(scopes->vecscope); + scopes->vecscope = NULL; + } +} + +void scopes_new(Scopes *scopes) +{ + scopes->accuracy=30.0; + scopes->hist.mode=HISTO_MODE_RGB; + scopes->wavefrm_alpha=0.3; + scopes->vecscope_alpha=0.3; + scopes->wavefrm_height= 100; + scopes->vecscope_height= 100; + scopes->hist.height= 100; + scopes->ok= 0; + scopes->waveform_1 = NULL; + scopes->waveform_2 = NULL; + scopes->waveform_3 = NULL; + scopes->vecscope = NULL; } diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index f7a9f284a29..673b3c6d482 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -36,6 +36,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_listbase.h" #include "BLI_math.h" #include "BLI_editVert.h" #include "BLI_cellalloc.h" @@ -77,12 +78,6 @@ #include "BPY_extern.h" #endif -#include "ED_mesh.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifndef M_PI #define M_PI 3.14159265358979323846 #endif @@ -433,8 +428,8 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f * - check if the custom data masks for derivedFinal mean that we can just use that * (this is more effficient + sufficient for most cases) */ - if (ob->lastDataMask != CD_MASK_DERIVEDMESH) { - dm = mesh_get_derived_final(scene, ob, CD_MASK_DERIVEDMESH); + if (!(ob->lastDataMask & CD_MASK_MDEFORMVERT)) { + dm = mesh_get_derived_final(scene, ob, CD_MASK_MDEFORMVERT); freeDM= 1; } else @@ -457,8 +452,8 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f if (dvert[i].dw[j].def_nr == dgroup) { dm->getVertCo(dm, i, co); dm->getVertNo(dm, i, nor); - add_v3_v3v3(vec, vec, co); - add_v3_v3v3(normal, normal, nor); + add_v3_v3(vec, co); + add_v3_v3(normal, nor); count++; break; } @@ -543,7 +538,7 @@ static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][ else memcpy(tvec, bp->vec, 3*sizeof(float)); - add_v3_v3v3(vec, vec, tvec); + add_v3_v3(vec, tvec); grouped++; break; @@ -827,12 +822,12 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta /* extract components of both matrices */ VECCOPY(loc, ct->matrix[3]); - mat4_to_eulO( eul, ct->rotOrder,ct->matrix); - mat4_to_size( size,ct->matrix); + mat4_to_eulO(eul, ct->rotOrder, ct->matrix); + mat4_to_size(size, ct->matrix); VECCOPY(loco, invmat[3]); - mat4_to_eulO( eulo, cob->rotOrder,invmat); - mat4_to_size( sizo,invmat); + mat4_to_eulO(eulo, cob->rotOrder, invmat); + mat4_to_size(sizo, invmat); /* disable channels not enabled */ if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f; @@ -1024,7 +1019,7 @@ static void trackto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta float tmat[4][4]; /* Get size property, since ob->size is only the object's own relative size, not its global one */ - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); /* Clear the object's rotation */ cob->matrix[0][0]=size[0]; @@ -1250,7 +1245,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr curvetime= data->offset_fac; } - if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, &radius) ) { + if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, &radius, NULL) ) { if (data->followflag & FOLLOWPATH_FOLLOW) { vec_to_quat(quat, dir, (short)data->trackflag, (short)data->upflag); @@ -1392,9 +1387,9 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t float size[3]; VECCOPY(loc, cob->matrix[3]); - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); - mat4_to_eulO( eul, cob->rotOrder,cob->matrix); + mat4_to_eulO(eul, cob->rotOrder, cob->matrix); /* constraint data uses radians internally */ @@ -1645,17 +1640,17 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta float size[3]; VECCOPY(loc, cob->matrix[3]); - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); /* to allow compatible rotations, must get both rotations in the order of the owner... */ - mat4_to_eulO( eul, cob->rotOrder,ct->matrix); - mat4_to_eulO( obeul, cob->rotOrder,cob->matrix); + mat4_to_eulO(eul, cob->rotOrder, ct->matrix); + mat4_to_eulO(obeul, cob->rotOrder, cob->matrix); if ((data->flag & ROTLIKE_X)==0) eul[0] = obeul[0]; else { if (data->flag & ROTLIKE_OFFSET) - rotate_eulO(eul, cob->rotOrder, 'x', obeul[0]); + rotate_eulO(eul, cob->rotOrder, 'X', obeul[0]); if (data->flag & ROTLIKE_X_INVERT) eul[0] *= -1; @@ -1665,7 +1660,7 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta eul[1] = obeul[1]; else { if (data->flag & ROTLIKE_OFFSET) - rotate_eulO(eul, cob->rotOrder, 'y', obeul[1]); + rotate_eulO(eul, cob->rotOrder, 'Y', obeul[1]); if (data->flag & ROTLIKE_Y_INVERT) eul[1] *= -1; @@ -1675,7 +1670,7 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta eul[2] = obeul[2]; else { if (data->flag & ROTLIKE_OFFSET) - rotate_eulO(eul, cob->rotOrder, 'z', obeul[2]); + rotate_eulO(eul, cob->rotOrder, 'Z', obeul[2]); if (data->flag & ROTLIKE_Z_INVERT) eul[2] *= -1; @@ -1861,6 +1856,63 @@ static bConstraintTypeInfo CTI_TRANSLIKE = { translike_evaluate /* evaluate */ }; +/* ---------- Maintain Volume ---------- */ + +static void samevolume_new_data (void *cdata) +{ + bSameVolumeConstraint *data= (bSameVolumeConstraint *)cdata; + + data->flag = SAMEVOL_Y; + data->volume = 1.0f; +} + +static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets) +{ + bSameVolumeConstraint *data= con->data; + + float volume = data->volume; + float fac = 1.0f; + float obsize[3]; + + mat4_to_size(obsize, cob->matrix); + + /* calculate normalising scale factor for non-essential values */ + if (obsize[data->flag] != 0) + fac = sqrt(volume / obsize[data->flag]) / obsize[data->flag]; + + /* apply scaling factor to the channels not being kept */ + switch (data->flag) { + case SAMEVOL_X: + mul_v3_fl(cob->matrix[1], fac); + mul_v3_fl(cob->matrix[2], fac); + break; + case SAMEVOL_Y: + mul_v3_fl(cob->matrix[0], fac); + mul_v3_fl(cob->matrix[2], fac); + break; + case SAMEVOL_Z: + mul_v3_fl(cob->matrix[0], fac); + mul_v3_fl(cob->matrix[1], fac); + break; + } +} + +static bConstraintTypeInfo CTI_SAMEVOL = { + CONSTRAINT_TYPE_SAMEVOL, /* type */ + sizeof(bSameVolumeConstraint), /* size */ + "Maintain Volume", /* name */ + "bSameVolumeConstraint", /* struct name */ + NULL, /* free data */ + NULL, /* relink data */ + NULL, /* id looper */ + NULL, /* copy data */ + samevolume_new_data, /* new data */ + NULL, /* get constraint targets */ + NULL, /* flush constraint targets */ + NULL, /* get target matrix */ + samevolume_evaluate /* evaluate */ +}; + /* ----------- Python Constraint -------------- */ static void pycon_free (bConstraint *con) @@ -1930,8 +1982,10 @@ static void pycon_id_looper (bConstraint *con, ConstraintIDFunc func, void *user /* Whether this approach is maintained remains to be seen (aligorith) */ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime) { +#ifndef DISABLE_PYTHON bPythonConstraint *data= con->data; - +#endif + if (VALID_CONS_TARGET(ct)) { /* special exception for curves - depsgraph issues */ if (ct->tar->type == OB_CURVE) { @@ -2718,7 +2772,7 @@ static void stretchto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * float dist; /* store scaling before destroying obmat */ - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); /* store X orientation before destroying obmat */ xx[0] = cob->matrix[0][0]; @@ -3000,7 +3054,7 @@ static void rbj_new_data (void *cdata) bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint *)cdata; // removed code which set target of this constraint - data->type=1; + data->type=1; } static void rbj_id_looper (bConstraint *con, ConstraintIDFunc func, void *userdata) @@ -3210,7 +3264,7 @@ static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta } /* 3. position on curve */ - if (where_on_path(ct->tar, curvetime, vec, dir, NULL, NULL) ) { + if (where_on_path(ct->tar, curvetime, vec, dir, NULL, NULL, NULL) ) { unit_m4(totmat); VECCOPY(totmat[3], vec); @@ -3301,7 +3355,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * mat4_to_size( dvec,ct->matrix); break; case 1: /* rotation (convert to degrees first) */ - mat4_to_eulO( dvec, cob->rotOrder,ct->matrix); + mat4_to_eulO(dvec, cob->rotOrder, ct->matrix); for (i=0; i<3; i++) dvec[i] = (float)(dvec[i] / M_PI * 180); break; @@ -3312,8 +3366,8 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * /* extract components of owner's matrix */ VECCOPY(loc, cob->matrix[3]); - mat4_to_eulO( eul, cob->rotOrder,cob->matrix); - mat4_to_size( size,cob->matrix); + mat4_to_eulO(eul, cob->rotOrder, cob->matrix); + mat4_to_size(size, cob->matrix); /* determine where in range current transforms lie */ if (data->expo) { @@ -3433,73 +3487,73 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr float co[3] = {0.0f, 0.0f, 0.0f}; float no[3] = {0.0f, 0.0f, 0.0f}; float dist; - + SpaceTransform transform; DerivedMesh *target = object_get_derived_final(cob->scene, ct->tar, CD_MASK_BAREMESH); BVHTreeRayHit hit; BVHTreeNearest nearest; - + BVHTreeFromMesh treeData; - memset( &treeData, 0, sizeof(treeData) ); - + memset(&treeData, 0, sizeof(treeData)); + nearest.index = -1; nearest.dist = FLT_MAX; - + hit.index = -1; hit.dist = 100000.0f; //TODO should use FLT_MAX.. but normal projection doenst yet supports it - + unit_m4(ct->matrix); - + if(target != NULL) { space_transform_from_matrixs(&transform, cob->matrix, ct->tar->obmat); - + switch(scon->shrinkType) { case MOD_SHRINKWRAP_NEAREST_SURFACE: case MOD_SHRINKWRAP_NEAREST_VERTEX: - + if(scon->shrinkType == MOD_SHRINKWRAP_NEAREST_VERTEX) bvhtree_from_mesh_verts(&treeData, target, 0.0, 2, 6); else bvhtree_from_mesh_faces(&treeData, target, 0.0, 2, 6); - + if(treeData.tree == NULL) { fail = TRUE; break; } - + space_transform_apply(&transform, co); - + BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData); dist = len_v3v3(co, nearest.co); interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist)/dist); /* linear interpolation */ space_transform_invert(&transform, co); break; - + case MOD_SHRINKWRAP_PROJECT: if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS) no[0] = 1.0f; if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS) no[1] = 1.0f; if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS) no[2] = 1.0f; - + if(INPR(no,no) < FLT_EPSILON) { fail = TRUE; break; } - + normalize_v3(no); - - + + bvhtree_from_mesh_faces(&treeData, target, scon->dist, 4, 6); if(treeData.tree == NULL) { fail = TRUE; break; } - + if(normal_projection_project_vertex(0, co, no, &transform, treeData.tree, &hit, treeData.raycast_callback, &treeData) == FALSE) { fail = TRUE; @@ -3508,19 +3562,19 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr VECCOPY(co, hit.co); break; } - + free_bvhtree_from_mesh(&treeData); - + target->release(target); - + if(fail == TRUE) { /* Don't move the point */ co[0] = co[1] = co[2] = 0.0f; } - + /* co is in local object coordinates, change it to global and update target position */ - mul_v3_m4v3(co, cob->matrix, co); + mul_m4_v3(cob->matrix, co); VECCOPY(ct->matrix[3], co); } } @@ -3652,7 +3706,7 @@ static void damptrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * /* construct rotation matrix from the axis-angle rotation found above * - this call takes care to make sure that the axis provided is a unit vector first */ - axis_angle_to_mat3( rmat,raxis, rangle); + axis_angle_to_mat3(rmat, raxis, rangle); /* rotate the owner in the way defined by this rotation matrix, then reapply the location since * we may have destroyed that in the process of multiplying the matrix @@ -3701,6 +3755,13 @@ static void splineik_copy (bConstraint *con, bConstraint *srccon) dst->points= MEM_dupallocN(src->points); } +static void splineik_new_data (void *cdata) +{ + bSplineIKConstraint *data= (bSplineIKConstraint *)cdata; + + data->chainlen= 1; +} + static void splineik_id_looper (bConstraint *con, ConstraintIDFunc func, void *userdata) { bSplineIKConstraint *data= con->data; @@ -3765,13 +3826,125 @@ static bConstraintTypeInfo CTI_SPLINEIK = { NULL, /* relink data */ splineik_id_looper, /* id looper */ splineik_copy, /* copy data */ - NULL, /* new data */ + splineik_new_data, /* new data */ splineik_get_tars, /* get constraint targets */ splineik_flush_tars, /* flush constraint targets */ splineik_get_tarmat, /* get target matrix */ NULL /* evaluate - solved as separate loop */ }; +/* ----------- Pivot ------------- */ + +static void pivotcon_id_looper (bConstraint *con, ConstraintIDFunc func, void *userdata) +{ + bPivotConstraint *data= con->data; + + /* target only */ + func(con, (ID**)&data->tar, userdata); +} + +static int pivotcon_get_tars (bConstraint *con, ListBase *list) +{ + if (con && list) { + bPivotConstraint *data= con->data; + bConstraintTarget *ct; + + /* standard target-getting macro for single-target constraints */ + SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list) + + return 1; + } + + return 0; +} + +static void pivotcon_flush_tars (bConstraint *con, ListBase *list, short nocopy) +{ + if (con && list) { + bPivotConstraint *data= con->data; + bConstraintTarget *ct= list->first; + + /* the following macro is used for all standard single-target constraints */ + SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy) + } +} + +static void pivotcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets) +{ + bPivotConstraint *data= con->data; + bConstraintTarget *ct= targets->first; + + float pivot[3], vec[3]; + float rotMat[3][3]; + + /* firstly, check if pivoting should take place based on the current rotation */ + if (data->rotAxis != PIVOTCON_AXIS_NONE) { + float rot[3]; + + /* extract euler-rotation of target */ + mat4_to_eulO(rot, cob->rotOrder, cob->matrix); + + /* check which range might be violated */ + if (data->rotAxis < PIVOTCON_AXIS_X) { + /* negative rotations (data->rotAxis = 0 -> 2) */ + if (rot[data->rotAxis] > 0.0f) + return; + } + else { + /* positive rotations (data->rotAxis = 3 -> 5 */ + if (rot[data->rotAxis - PIVOTCON_AXIS_X] < 0.0f) + return; + } + } + + /* find the pivot-point to use */ + if (VALID_CONS_TARGET(ct)) { + /* apply offset to target location */ + add_v3_v3v3(pivot, ct->matrix[3], data->offset); + } + else { + /* no targets to worry about... */ + if ((data->flag & PIVOTCON_FLAG_OFFSET_ABS) == 0) { + /* offset is relative to owner */ + add_v3_v3v3(pivot, cob->matrix[3], data->offset); + } + else { + /* directly use the 'offset' specified as an absolute position instead */ + VECCOPY(pivot, data->offset); + } + } + + /* get rotation matrix representing the rotation of the owner */ + // TODO: perhaps we might want to include scaling based on the pivot too? + copy_m3_m4(rotMat, cob->matrix); + normalize_m3(rotMat); + + /* perform the pivoting... */ + /* 1. take the vector from owner to the pivot */ + sub_v3_v3v3(vec, pivot, cob->matrix[3]); + /* 2. rotate this vector by the rotation of the object... */ + mul_m3_v3(rotMat, vec); + /* 3. make the rotation in terms of the pivot now */ + add_v3_v3v3(cob->matrix[3], pivot, vec); +} + + +static bConstraintTypeInfo CTI_PIVOT = { + CONSTRAINT_TYPE_PIVOT, /* type */ + sizeof(bPivotConstraint), /* size */ + "Pivot", /* name */ + "bPivotConstraint", /* struct name */ + NULL, /* free data */ + NULL, /* relink data */ + pivotcon_id_looper, /* id looper */ + NULL, /* copy data */ + NULL, /* new data */ // XXX: might be needed to get 'normal' pivot behaviour... + pivotcon_get_tars, /* get constraint targets */ + pivotcon_flush_tars, /* flush constraint targets */ + default_get_tarmat, /* get target matrix */ + pivotcon_evaluate /* evaluate */ +}; + /* ************************* Constraints Type-Info *************************** */ /* All of the constraints api functions use bConstraintTypeInfo structs to carry out * and operations that involve constraint specific code. @@ -3807,6 +3980,8 @@ static void constraints_init_typeinfo () { constraintsTypeInfo[21]= &CTI_DAMPTRACK; /* Damped TrackTo Constraint */ constraintsTypeInfo[22]= &CTI_SPLINEIK; /* Spline IK Constraint */ constraintsTypeInfo[23]= &CTI_TRANSLIKE; /* Copy Transforms Constraint */ + constraintsTypeInfo[24]= &CTI_SAMEVOL; /* Maintain Volume Constraint */ + constraintsTypeInfo[25]= &CTI_PIVOT; /* Pivot Constraint */ } /* This function should be used for getting the appropriate type-info when only @@ -4071,7 +4246,7 @@ static void con_extern_cb(bConstraint *con, ID **idpoin, void *userdata) } /* duplicate all of the constraints in a constraint stack */ -void copy_constraints (ListBase *dst, const ListBase *src) +void copy_constraints (ListBase *dst, const ListBase *src, int do_extern) { bConstraint *con, *srccon; @@ -4090,15 +4265,23 @@ void copy_constraints (ListBase *dst, const ListBase *src) if (cti->copy_data) cti->copy_data(con, srccon); - /* go over used ID-links for this constraint to ensure that they are valid for proxies */ - if (cti->id_looper) - cti->id_looper(con, con_extern_cb, NULL); + /* for proxies we dont want to make extern */ + if (do_extern) { + /* go over used ID-links for this constraint to ensure that they are valid for proxies */ + if (cti->id_looper) + cti->id_looper(con, con_extern_cb, NULL); + } } } } /* ......... */ +bConstraint *constraints_findByName(ListBase *list, const char *name) +{ + return BLI_findstring(list, name, offsetof(bConstraint, name)); +} + /* finds the 'active' constraint in a constraint stack */ bConstraint *constraints_get_active (ListBase *list) { diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 26320e2475f..9520df71b60 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -27,8 +27,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -44,7 +42,6 @@ #include "BKE_context.h" #include "BKE_main.h" #include "BKE_screen.h" -#include "BKE_global.h" #ifndef DISABLE_PYTHON #include "BPY_extern.h" @@ -407,6 +404,7 @@ struct bContextDataResult { PointerRNA ptr; ListBase list; const char **dir; + short type; /* 0: normal, 1: seq */ }; static int ctx_data_get(bContext *C, const char *member, bContextDataResult *result) @@ -551,7 +549,7 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member) } /* 1:found, -1:found but not set, 0:not found */ -int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb) +int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb, short *r_type) { bContextDataResult result; int ret= ctx_data_get((bContext*)C, member, &result); @@ -559,10 +557,12 @@ int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListB if(ret==1) { *r_ptr= result.ptr; *r_lb= result.list; + *r_type= result.type; } else { memset(r_ptr, 0, sizeof(*r_ptr)); memset(r_lb, 0, sizeof(*r_lb)); + *r_type= 0; } return ret; @@ -685,6 +685,16 @@ void CTX_data_dir_set(bContextDataResult *result, const char **dir) result->dir= dir; } +void CTX_data_type_set(bContextDataResult *result, short type) +{ + result->type= type; +} + +short CTX_data_type_get(bContextDataResult *result) +{ + return result->type; +} + /* data context */ Main *CTX_data_main(const bContext *C) diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index e10159f5b6a..2f0c83507f0 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -34,20 +34,14 @@ #include <string.h> #include <stdlib.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" -#include "DNA_object_types.h" #include "DNA_curve_types.h" #include "DNA_material_types.h" /* for dereferencing pointers */ -#include "DNA_ID.h" #include "DNA_key_types.h" #include "DNA_scene_types.h" #include "DNA_vfont_types.h" @@ -62,7 +56,6 @@ #include "BKE_key.h" #include "BKE_library.h" #include "BKE_main.h" -#include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_utildefines.h" // VECCOPY @@ -146,6 +139,7 @@ Curve *add_curve(char *name, int type) cu->fsize= 1.0; cu->ulheight = 0.05; cu->texflag= CU_AUTOSPACE; + cu->smallcaps_scale= 0.75f; cu->twist_mode= CU_TWIST_MINIMUM; // XXX: this one seems to be the best one in most cases, at least for curve deform... cu->bb= unit_boundbox(); @@ -520,7 +514,47 @@ void minmaxNurb(Nurb *nu, float *min, float *max) bp++; } } +} +/* be sure to call makeknots after this */ +void addNurbPoints(Nurb *nu, int number) +{ + BPoint *tmp= nu->bp; + int i; + nu->bp= (BPoint *)MEM_mallocN((nu->pntsu + number) * sizeof(BPoint), "rna_Curve_spline_points_add"); + + if(tmp) { + memmove(nu->bp, tmp, nu->pntsu * sizeof(BPoint)); + MEM_freeN(tmp); + } + + memset(nu->bp + nu->pntsu, 0, number * sizeof(BPoint)); + + for(i=0, tmp= nu->bp + nu->pntsu; i < number; i++, tmp++) { + tmp->radius= 1.0f; + } + + nu->pntsu += number; +} + +void addNurbPointsBezier(Nurb *nu, int number) +{ + BezTriple *tmp= nu->bezt; + int i; + nu->bezt= (BezTriple *)MEM_mallocN((nu->pntsu + number) * sizeof(BezTriple), "rna_Curve_spline_points_add"); + + if(tmp) { + memmove(nu->bezt, tmp, nu->pntsu * sizeof(BezTriple)); + MEM_freeN(tmp); + } + + memset(nu->bezt + nu->pntsu, 0, number * sizeof(BezTriple)); + + for(i=0, tmp= nu->bezt + nu->pntsu; i < number; i++, tmp++) { + tmp->radius= 1.0f; + } + + nu->pntsu += number; } /* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */ @@ -533,7 +567,7 @@ static void calcknots(float *knots, short aantal, short order, short type) float k; int a, t; - t = aantal+order; + t = aantal+order; if(type==0) { for(a=0;a<t;a++) { @@ -588,7 +622,7 @@ static void makecyclicknots(float *knots, short pnts, short order) } b= order; - c=pnts + order + order2; + c=pnts + order + order2; for(a=pnts+order2; a<c; a++) { knots[a]= knots[a-1]+ (knots[b]-knots[b-1]); b--; @@ -604,7 +638,7 @@ void makeknots(Nurb *nu, short uv) if(nu->knotsu) MEM_freeN(nu->knotsu); if(check_valid_nurb_u(nu)) { nu->knotsu= MEM_callocN(4+sizeof(float)*KNOTSU(nu), "makeknots"); - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { calcknots(nu->knotsu, nu->pntsu, nu->orderu, 0); /* cyclic should be uniform */ makecyclicknots(nu->knotsu, nu->pntsu, nu->orderu); } else { @@ -617,7 +651,7 @@ void makeknots(Nurb *nu, short uv) if(nu->knotsv) MEM_freeN(nu->knotsv); if(check_valid_nurb_v(nu)) { nu->knotsv= MEM_callocN(4+sizeof(float)*KNOTSV(nu), "makeknots"); - if(nu->flagv & CU_CYCLIC) { + if(nu->flagv & CU_NURB_CYCLIC) { calcknots(nu->knotsv, nu->pntsv, nu->orderv, 0); /* cyclic should be uniform */ makecyclicknots(nu->knotsv, nu->pntsv, nu->orderv); } else { @@ -635,14 +669,14 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas int i, i1 = 0, i2 = 0 ,j, orderpluspnts, opp2, o2; orderpluspnts= order+pnts; - opp2 = orderpluspnts-1; + opp2 = orderpluspnts-1; /* this is for float inaccuracy */ if(t < knots[0]) t= knots[0]; else if(t > knots[opp2]) t= knots[opp2]; /* this part is order '1' */ - o2 = order + 1; + o2 = order + 1; for(i=0;i<opp2;i++) { if(knots[i]!=knots[i+1] && t>= knots[i] && t<=knots[i+1]) { basis[i]= 1.0; @@ -735,18 +769,18 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) fp= nu->knotsu; ustart= fp[nu->orderu-1]; - if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1]; + if(nu->flagu & CU_NURB_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1]; else uend= fp[nu->pntsu]; - ustep= (uend-ustart)/((nu->flagu & CU_CYCLIC) ? totu : totu - 1); + ustep= (uend-ustart)/((nu->flagu & CU_NURB_CYCLIC) ? totu : totu - 1); basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbfaces3"); fp= nu->knotsv; vstart= fp[nu->orderv-1]; - if(nu->flagv & CU_CYCLIC) vend= fp[nu->pntsv+nu->orderv-1]; + if(nu->flagv & CU_NURB_CYCLIC) vend= fp[nu->pntsv+nu->orderv-1]; else vend= fp[nu->pntsv]; - vstep= (vend-vstart)/((nu->flagv & CU_CYCLIC) ? totv : totv - 1); + vstep= (vend-vstart)/((nu->flagv & CU_NURB_CYCLIC) ? totv : totv - 1); len= KNOTSV(nu); basisv= (float *)MEM_mallocN(sizeof(float)*len*totv, "makeNurbfaces3"); @@ -754,7 +788,7 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) jend= (int *)MEM_mallocN(sizeof(float)*totv, "makeNurbfaces5"); /* precalculation of basisv and jstart,jend */ - if(nu->flagv & CU_CYCLIC) cycl= nu->orderv-1; + if(nu->flagv & CU_NURB_CYCLIC) cycl= nu->orderv-1; else cycl= 0; v= vstart; basis= basisv; @@ -765,7 +799,7 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) v+= vstep; } - if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1; + if(nu->flagu & CU_NURB_CYCLIC) cycl= nu->orderu-1; else cycl= 0; in= coord_array; u= ustart; @@ -855,14 +889,14 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) MEM_freeN(jend); } -void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu, int stride) +void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride) /* coord_array has to be 3*4*pntsu*resolu in size and zero-ed * tilt_array and radius_array will be written to if valid */ { BPoint *bp; float u, ustart, uend, ustep, sumdiv; float *basisu, *sum, *fp; - float *coord_fp= coord_array, *tilt_fp= tilt_array, *radius_fp= radius_array; + float *coord_fp= coord_array, *tilt_fp= tilt_array, *radius_fp= radius_array, *weight_fp= weight_array; int i, len, istart, iend, cycl; if(nu->knotsu==NULL) return; @@ -883,13 +917,13 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu fp= nu->knotsu; ustart= fp[nu->orderu-1]; - if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1]; + if(nu->flagu & CU_NURB_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1]; else uend= fp[nu->pntsu]; - ustep= (uend-ustart)/(resolu - ((nu->flagu & CU_CYCLIC) ? 0 : 1)); + ustep= (uend-ustart)/(resolu - ((nu->flagu & CU_NURB_CYCLIC) ? 0 : 1)); basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbcurve3"); - if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1; + if(nu->flagu & CU_NURB_CYCLIC) cycl= nu->orderu-1; else cycl= 0; u= ustart; @@ -935,6 +969,9 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu if (radius_fp) (*radius_fp) += (*fp) * bp->radius; + + if (weight_fp) + (*weight_fp) += (*fp) * bp->weight; } } @@ -943,6 +980,7 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu if (tilt_fp) tilt_fp = (float *)(((char *)tilt_fp) + stride); if (radius_fp) radius_fp = (float *)(((char *)radius_fp) + stride); + if (weight_fp) weight_fp = (float *)(((char *)weight_fp) + stride); u+= ustep; } @@ -966,18 +1004,18 @@ void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int i f*= it; rt3= (q3-q0+3.0f*(q1-q2))/f; - q0= rt0; + q0= rt0; q1= rt1+rt2+rt3; q2= 2*rt2+6*rt3; q3= 6*rt3; - for(a=0; a<=it; a++) { + for(a=0; a<=it; a++) { *p= q0; p = (float *)(((char *)p)+stride); q0+= q1; - q1+= q2; - q2+= q3; - } + q1+= q2; + q2+= q3; + } } static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float *p3, float *p, int it, int stride) @@ -987,7 +1025,7 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float * * This could also be optimized like forward_diff_bezier */ int a; - for(a=0; a<=it; a++) { + for(a=0; a<=it; a++) { float t = (float)a / (float)it; int i; @@ -996,7 +1034,7 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float } normalize_v3(p); p = (float *)(((char *)p)+stride); - } + } } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -1023,9 +1061,9 @@ float *make_orco_surf(Object *ob) sizeu = nu->pntsu*nu->resolu; sizev = nu->pntsv*nu->resolv; - if (nu->flagu & CU_CYCLIC) sizeu++; - if (nu->flagv & CU_CYCLIC) sizev++; - if(nu->pntsv>1) tot+= sizeu * sizev; + if (nu->flagu & CU_NURB_CYCLIC) sizeu++; + if (nu->flagv & CU_NURB_CYCLIC) sizev++; + if(nu->pntsv>1) tot+= sizeu * sizev; nu= nu->next; } @@ -1037,8 +1075,8 @@ float *make_orco_surf(Object *ob) if(nu->pntsv>1) { sizeu = nu->pntsu*nu->resolu; sizev = nu->pntsv*nu->resolv; - if (nu->flagu & CU_CYCLIC) sizeu++; - if (nu->flagv & CU_CYCLIC) sizev++; + if (nu->flagu & CU_NURB_CYCLIC) sizeu++; + if (nu->flagv & CU_NURB_CYCLIC) sizev++; if(cu->flag & CU_UV_ORCO) { for(b=0; b< sizeu; b++) { @@ -1064,12 +1102,12 @@ float *make_orco_surf(Object *ob) for(b=0; b<sizeu; b++) { int use_b= b; - if (b==sizeu-1 && (nu->flagu & CU_CYCLIC)) + if (b==sizeu-1 && (nu->flagu & CU_NURB_CYCLIC)) use_b= 0; for(a=0; a<sizev; a++) { int use_a= a; - if (a==sizev-1 && (nu->flagv & CU_CYCLIC)) + if (a==sizev-1 && (nu->flagv & CU_NURB_CYCLIC)) use_a= 0; tdata = _tdata + 3 * (use_b * (nu->pntsv*nu->resolv) + use_a); @@ -1100,17 +1138,12 @@ float *make_orco_curve(Scene *scene, Object *ob) DispList *dl; int u, v, numVerts; float *fp, *coord_array; - int remakeDisp = 0; + ListBase disp = {NULL, NULL}; - if (!(cu->flag&CU_UV_ORCO) && cu->key && cu->key->block.first) { - makeDispListCurveTypes(scene, ob, 1); - remakeDisp = 1; - } - - /* Assumes displist has been built */ + makeDispListCurveTypes_forOrco(scene, ob, &disp); numVerts = 0; - for (dl=cu->disp.first; dl; dl=dl->next) { + for (dl=disp.first; dl; dl=dl->next) { if (dl->type==DL_INDEX3) { numVerts += dl->nr; } else if (dl->type==DL_SURF) { @@ -1127,7 +1160,7 @@ float *make_orco_curve(Scene *scene, Object *ob) } fp= coord_array= MEM_mallocN(3*sizeof(float)*numVerts, "cu_orco"); - for (dl=cu->disp.first; dl; dl=dl->next) { + for (dl=disp.first; dl; dl=dl->next) { if (dl->type==DL_INDEX3) { for (u=0; u<dl->nr; u++, fp+=3) { if (cu->flag & CU_UV_ORCO) { @@ -1175,9 +1208,7 @@ float *make_orco_curve(Scene *scene, Object *ob) } } - if (remakeDisp) { - makeDispListCurveTypes(scene, ob, 0); - } + freedisplist(&disp); return coord_array; } @@ -1185,7 +1216,7 @@ float *make_orco_curve(Scene *scene, Object *ob) /* ***************** BEVEL ****************** */ -void makebevelcurve(Scene *scene, Object *ob, ListBase *disp) +void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender) { DispList *dl, *dlnew; Curve *bevcu, *cu; @@ -1198,40 +1229,47 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp) /* if a font object is being edited, then do nothing */ // XXX if( ob == obedit && ob->type == OB_FONT ) return; - if(cu->bevobj && cu->bevobj!=ob) { - if(cu->bevobj->type==OB_CURVE) { - bevcu= cu->bevobj->data; - if(bevcu->ext1==0.0 && bevcu->ext2==0.0) { - facx= cu->bevobj->size[0]; - facy= cu->bevobj->size[1]; + if(cu->bevobj) { + bevcu= cu->bevobj->data; + if(bevcu->ext1==0.0 && bevcu->ext2==0.0) { + ListBase bevdisp= {NULL, NULL}; + facx= cu->bevobj->size[0]; + facy= cu->bevobj->size[1]; + if (forRender) { + makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0); + dl= bevdisp.first; + } else { dl= bevcu->disp.first; if(dl==0) { makeDispListCurveTypes(scene, cu->bevobj, 0); dl= bevcu->disp.first; } - while(dl) { - if ELEM(dl->type, DL_POLY, DL_SEGM) { - dlnew= MEM_mallocN(sizeof(DispList), "makebevelcurve1"); - *dlnew= *dl; - dlnew->verts= MEM_mallocN(3*sizeof(float)*dl->parts*dl->nr, "makebevelcurve1"); - memcpy(dlnew->verts, dl->verts, 3*sizeof(float)*dl->parts*dl->nr); - - if(dlnew->type==DL_SEGM) dlnew->flag |= (DL_FRONT_CURVE|DL_BACK_CURVE); - - BLI_addtail(disp, dlnew); - fp= dlnew->verts; - nr= dlnew->parts*dlnew->nr; - while(nr--) { - fp[2]= fp[1]*facy; - fp[1]= -fp[0]*facx; - fp[0]= 0.0; - fp+= 3; - } - } - dl= dl->next; - } } + + while(dl) { + if ELEM(dl->type, DL_POLY, DL_SEGM) { + dlnew= MEM_mallocN(sizeof(DispList), "makebevelcurve1"); + *dlnew= *dl; + dlnew->verts= MEM_mallocN(3*sizeof(float)*dl->parts*dl->nr, "makebevelcurve1"); + memcpy(dlnew->verts, dl->verts, 3*sizeof(float)*dl->parts*dl->nr); + + if(dlnew->type==DL_SEGM) dlnew->flag |= (DL_FRONT_CURVE|DL_BACK_CURVE); + + BLI_addtail(disp, dlnew); + fp= dlnew->verts; + nr= dlnew->parts*dlnew->nr; + while(nr--) { + fp[2]= fp[1]*facy; + fp[1]= -fp[0]*facx; + fp[0]= 0.0; + fp+= 3; + } + } + dl= dl->next; + } + + freedisplist(&bevdisp); } } else if(cu->ext1==0.0 && cu->ext2==0.0) { @@ -1281,30 +1319,33 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp) short dnr; /* bevel now in three parts, for proper vertex normals */ - /* part 1 */ - dnr= nr= 2+ cu->bevresol; - if( (cu->flag & (CU_FRONT|CU_BACK))==0) - nr= 3+ 2*cu->bevresol; - - dl= MEM_callocN(sizeof(DispList), "makebevelcurve p1"); - dl->verts= MEM_mallocN(nr*3*sizeof(float), "makebevelcurve p1"); - BLI_addtail(disp, dl); - dl->type= DL_SEGM; - dl->parts= 1; - dl->flag= DL_BACK_CURVE; - dl->nr= nr; + /* part 1, back */ - /* half a circle */ - fp= dl->verts; - dangle= (0.5*M_PI/(dnr-1)); - angle= -(nr-1)*dangle; - - for(a=0; a<nr; a++) { - fp[0]= 0.0; - fp[1]= (float)(cos(angle)*(cu->ext2)); - fp[2]= (float)(sin(angle)*(cu->ext2)) - cu->ext1; - angle+= dangle; - fp+= 3; + if((cu->flag & CU_BACK) || !(cu->flag & CU_FRONT)) { + dnr= nr= 2+ cu->bevresol; + if( (cu->flag & (CU_FRONT|CU_BACK))==0) + nr= 3+ 2*cu->bevresol; + + dl= MEM_callocN(sizeof(DispList), "makebevelcurve p1"); + dl->verts= MEM_mallocN(nr*3*sizeof(float), "makebevelcurve p1"); + BLI_addtail(disp, dl); + dl->type= DL_SEGM; + dl->parts= 1; + dl->flag= DL_BACK_CURVE; + dl->nr= nr; + + /* half a circle */ + fp= dl->verts; + dangle= (0.5*M_PI/(dnr-1)); + angle= -(nr-1)*dangle; + + for(a=0; a<nr; a++) { + fp[0]= 0.0; + fp[1]= (float)(cos(angle)*(cu->ext2)); + fp[2]= (float)(sin(angle)*(cu->ext2)) - cu->ext1; + angle+= dangle; + fp+= 3; + } } /* part 2, sidefaces */ @@ -1337,30 +1378,32 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp) } } - /* part 3 */ - dnr= nr= 2+ cu->bevresol; - if( (cu->flag & (CU_FRONT|CU_BACK))==0) - nr= 3+ 2*cu->bevresol; - - dl= MEM_callocN(sizeof(DispList), "makebevelcurve p3"); - dl->verts= MEM_mallocN(nr*3*sizeof(float), "makebevelcurve p3"); - BLI_addtail(disp, dl); - dl->type= DL_SEGM; - dl->flag= DL_FRONT_CURVE; - dl->parts= 1; - dl->nr= nr; - - /* half a circle */ - fp= dl->verts; - angle= 0.0; - dangle= (0.5*M_PI/(dnr-1)); - - for(a=0; a<nr; a++) { - fp[0]= 0.0; - fp[1]= (float)(cos(angle)*(cu->ext2)); - fp[2]= (float)(sin(angle)*(cu->ext2)) + cu->ext1; - angle+= dangle; - fp+= 3; + /* part 3, front */ + if((cu->flag & CU_FRONT) || !(cu->flag & CU_BACK)) { + dnr= nr= 2+ cu->bevresol; + if( (cu->flag & (CU_FRONT|CU_BACK))==0) + nr= 3+ 2*cu->bevresol; + + dl= MEM_callocN(sizeof(DispList), "makebevelcurve p3"); + dl->verts= MEM_mallocN(nr*3*sizeof(float), "makebevelcurve p3"); + BLI_addtail(disp, dl); + dl->type= DL_SEGM; + dl->flag= DL_FRONT_CURVE; + dl->parts= 1; + dl->nr= nr; + + /* half a circle */ + fp= dl->verts; + angle= 0.0; + dangle= (0.5*M_PI/(dnr-1)); + + for(a=0; a<nr; a++) { + fp[0]= 0.0; + fp[1]= (float)(cos(angle)*(cu->ext2)); + fp[2]= (float)(sin(angle)*(cu->ext2)) + cu->ext1; + angle+= dangle; + fp+= 3; + } } } } @@ -1435,7 +1478,7 @@ static short bevelinside(BevList *bl1,BevList *bl2) /* there's a transition, calc intersection point */ mode= cu_isectLL(prevbevp->vec, bevp->vec, hvec1, hvec2, 0, 1, &lab, &mu, vec); /* if lab==0.0 or lab==1.0 then the edge intersects exactly a transition - only allow for one situation: we choose lab= 1.0 + only allow for one situation: we choose lab= 1.0 */ if(mode>=0 && lab!=0.0) { if(vec[0]<hvec1[0]) links++; @@ -1506,7 +1549,7 @@ static void calc_bevel_sin_cos(float x1, float y1, float x2, float y2, float *si } -static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *tilt_array, float *radius_array, int resolu, int stride) +static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride) { BezTriple *pprev, *next, *last; float fac, dfac, t[4]; @@ -1519,14 +1562,14 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float * /* returns a point */ if(prevbezt==nu->bezt) { - if(nu->flagu & CU_CYCLIC) pprev= last; + if(nu->flagu & CU_NURB_CYCLIC) pprev= last; else pprev= prevbezt; } else pprev= prevbezt-1; /* next point */ if(bezt==last) { - if(nu->flagu & CU_CYCLIC) next= nu->bezt; + if(nu->flagu & CU_NURB_CYCLIC) next= nu->bezt; else next= bezt; } else next= bezt+1; @@ -1563,6 +1606,13 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float * radius_array = (float *)(((char *)radius_array) + stride); } + + if(weight_array) { + /* basic interpolation for now, could copy tilt interp too */ + *weight_array = prevbezt->weight + (bezt->weight - prevbezt->weight)*(3.0f*fac*fac - 2.0f*fac*fac*fac); + + weight_array = (float *)(((char *)weight_array) + stride); + } } } @@ -1948,7 +1998,7 @@ void makeBevelList(Object *ob) float min, inp, x1, x2, y1, y2; struct bevelsort *sortdata, *sd, *sd1; int a, b, nr, poly, resolu = 0, len = 0; - int do_tilt, do_radius; + int do_tilt, do_radius, do_weight; /* this function needs an object, because of tflag and upflag */ cu= ob->data; @@ -1967,6 +2017,7 @@ void makeBevelList(Object *ob) /* check if we will calculate tilt data */ do_tilt = CU_DO_TILT(cu, nu); do_radius = CU_DO_RADIUS(cu, nu); /* normal display uses the radius, better just to calculate them */ + do_weight = 1; /* check we are a single point? also check we are not a surface and that the orderu is sane, * enforced in the UI but can go wrong possibly */ @@ -1985,7 +2036,7 @@ void makeBevelList(Object *ob) bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList2"); BLI_addtail(&(cu->bev), bl); - if(nu->flagu & CU_CYCLIC) bl->poly= 0; + if(nu->flagu & CU_NURB_CYCLIC) bl->poly= 0; else bl->poly= -1; bl->nr= len; bl->dupe_nr= 0; @@ -1996,6 +2047,7 @@ void makeBevelList(Object *ob) VECCOPY(bevp->vec, bp->vec); bevp->alfa= bp->alfa; bevp->radius= bp->radius; + bevp->weight= bp->weight; bevp->split_tag= TRUE; bevp++; bp++; @@ -2003,17 +2055,17 @@ void makeBevelList(Object *ob) } else if(nu->type == CU_BEZIER) { - len= resolu*(nu->pntsu+ (nu->flagu & CU_CYCLIC) -1)+1; /* in case last point is not cyclic */ + len= resolu*(nu->pntsu+ (nu->flagu & CU_NURB_CYCLIC) -1)+1; /* in case last point is not cyclic */ bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelBPoints"); BLI_addtail(&(cu->bev), bl); - if(nu->flagu & CU_CYCLIC) bl->poly= 0; + if(nu->flagu & CU_NURB_CYCLIC) bl->poly= 0; else bl->poly= -1; bevp= (BevPoint *)(bl+1); a= nu->pntsu-1; bezt= nu->bezt; - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { a++; prevbezt= nu->bezt+(nu->pntsu-1); } @@ -2028,6 +2080,7 @@ void makeBevelList(Object *ob) VECCOPY(bevp->vec, prevbezt->vec[1]); bevp->alfa= prevbezt->alfa; bevp->radius= prevbezt->radius; + bevp->weight= prevbezt->weight; bevp->split_tag= TRUE; bevp->dupe_tag= FALSE; bevp++; @@ -2049,6 +2102,7 @@ void makeBevelList(Object *ob) alfa_bezpart( prevbezt, bezt, nu, do_tilt ? &bevp->alfa : NULL, do_radius ? &bevp->radius : NULL, + do_weight ? &bevp->weight : NULL, resolu, sizeof(BevPoint)); @@ -2074,10 +2128,11 @@ void makeBevelList(Object *ob) bezt++; } - if((nu->flagu & CU_CYCLIC)==0) { /* not cyclic: endpoint */ + if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic: endpoint */ VECCOPY(bevp->vec, prevbezt->vec[1]); bevp->alfa= prevbezt->alfa; bevp->radius= prevbezt->radius; + bevp->weight= prevbezt->weight; bl->nr++; } } @@ -2089,13 +2144,14 @@ void makeBevelList(Object *ob) BLI_addtail(&(cu->bev), bl); bl->nr= len; bl->dupe_nr= 0; - if(nu->flagu & CU_CYCLIC) bl->poly= 0; + if(nu->flagu & CU_NURB_CYCLIC) bl->poly= 0; else bl->poly= -1; bevp= (BevPoint *)(bl+1); makeNurbcurve( nu, &bevp->vec[0], do_tilt ? &bevp->alfa : NULL, do_radius ? &bevp->radius : NULL, + do_weight ? &bevp->weight : NULL, resolu, sizeof(BevPoint)); } } @@ -2529,7 +2585,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */ a= nu->pntsu; bezt= nu->bezt; - if(nu->flagu & CU_CYCLIC) prev= bezt+(a-1); + if(nu->flagu & CU_NURB_CYCLIC) prev= bezt+(a-1); else prev= 0; next= bezt+1; @@ -2537,7 +2593,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */ calchandleNurb(bezt, prev, next, 0); prev= bezt; if(a==1) { - if(nu->flagu & CU_CYCLIC) next= nu->bezt; + if(nu->flagu & CU_NURB_CYCLIC) next= nu->bezt; else next= 0; } else next++; @@ -2549,13 +2605,13 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */ void testhandlesNurb(Nurb *nu) { - /* use when something has changed with handles. - it treats all BezTriples with the following rules: - PHASE 1: do types have to be altered? - Auto handles: become aligned when selection status is NOT(000 || 111) - Vector handles: become 'nothing' when (one half selected AND other not) - PHASE 2: recalculate handles - */ + /* use when something has changed with handles. + it treats all BezTriples with the following rules: + PHASE 1: do types have to be altered? + Auto handles: become aligned when selection status is NOT(000 || 111) + Vector handles: become 'nothing' when (one half selected AND other not) + PHASE 2: recalculate handles + */ BezTriple *bezt; short flag, a; @@ -2994,7 +3050,7 @@ int check_valid_nurb_u( struct Nurb *nu ) if (nu->type != CU_NURBS) return 1; /* not a nurb, lets assume its valid */ if (nu->pntsu < nu->orderu) return 0; - if (((nu->flag & CU_CYCLIC)==0) && ((nu->flagu>>1) & 2)) { /* Bezier U Endpoints */ + if (((nu->flag & CU_NURB_CYCLIC)==0) && (nu->flagu & CU_NURB_BEZIER)) { /* Bezier U Endpoints */ if (nu->orderu==4) { if (nu->pntsu < 5) return 0; /* bezier with 4 orderu needs 5 points */ } else if (nu->orderu != 3) return 0; /* order must be 3 or 4 */ @@ -3008,7 +3064,7 @@ int check_valid_nurb_v( struct Nurb *nu) if (nu->type != CU_NURBS) return 1; /* not a nurb, lets assume its valid */ if (nu->pntsv < nu->orderv) return 0; - if (((nu->flag & CU_CYCLIC)==0) && ((nu->flagv>>1) & 2)) { /* Bezier V Endpoints */ + if (((nu->flag & CU_NURB_CYCLIC)==0) && (nu->flagv & CU_NURB_BEZIER)) { /* Bezier V Endpoints */ if (nu->orderv==4) { if (nu->pntsv < 5) return 0; /* bezier with 4 orderu needs 5 points */ } else if (nu->orderv != 3) return 0; /* order must be 3 or 4 */ @@ -3023,7 +3079,7 @@ int clamp_nurb_order_u( struct Nurb *nu ) nu->orderu= nu->pntsu; change= 1; } - if(((nu->flag & CU_CYCLIC)==0) && (nu->flagu>>1)&2) { + if(((nu->flag & CU_NURB_CYCLIC)==0) && (nu->flagu & CU_NURB_BEZIER)) { CLAMP(nu->orderu, 3,4); change= 1; } @@ -3037,7 +3093,7 @@ int clamp_nurb_order_v( struct Nurb *nu) nu->orderv= nu->pntsv; change= 1; } - if(((nu->flag & CU_CYCLIC)==0) && (nu->flagv>>1)&2) { + if(((nu->flag & CU_NURB_CYCLIC)==0) && (nu->flagv & CU_NURB_BEZIER)) { CLAMP(nu->orderv, 3,4); change= 1; } diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 1cf8be330e6..d029573b2e9 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -38,16 +38,12 @@ #include "MEM_guardedalloc.h" -#include "DNA_customdata_types.h" -#include "DNA_listBase.h" #include "DNA_meshdata_types.h" #include "DNA_ID.h" #include "BLI_blenlib.h" #include "BLI_linklist.h" -#include "BLI_math.h" #include "BLI_mempool.h" -#include "BLI_string.h" #include "BKE_customdata.h" #include "BKE_customdata_file.h" @@ -92,12 +88,12 @@ typedef struct LayerTypeInfo { * count gives the number of elements in sources */ void (*interp)(void **sources, float *weights, float *sub_weights, - int count, void *dest); + int count, void *dest); - /* a function to swap the data in corners of the element */ - void (*swap)(void *data, int *corner_indices); + /* a function to swap the data in corners of the element */ + void (*swap)(void *data, const int *corner_indices); - /* a function to set a layer's data to default values. if NULL, the + /* a function to set a layer's data to default values. if NULL, the default is assumed to be all zeros */ void (*set_default)(void *data, int count); @@ -109,18 +105,18 @@ typedef struct LayerTypeInfo { void (*dominmax)(void *data1, void *min, void *max); void (*copyvalue)(void *source, void *dest); - /* a function to read data from a cdf file */ + /* a function to read data from a cdf file */ int (*read)(CDataFile *cdf, void *data, int count); - /* a function to write data to a cdf file */ + /* a function to write data to a cdf file */ int (*write)(CDataFile *cdf, void *data, int count); - /* a function to determine file size */ + /* a function to determine file size */ size_t (*filesize)(CDataFile *cdf, void *data, int count); } LayerTypeInfo; static void layerCopy_mdeformvert(const void *source, void *dest, - int count) + int count) { int i, size = sizeof(MDeformVert); @@ -162,7 +158,7 @@ static void linklist_free_simple(void *link) } static void layerInterp_mdeformvert(void **sources, float *weights, - float *sub_weights, int count, void *dest) + float *sub_weights, int count, void *dest) { MDeformVert *dvert = dest; LinkNode *dest_dw = NULL; /* a list of lists of MDeformWeight pointers */ @@ -192,7 +188,7 @@ static void layerInterp_mdeformvert(void **sources, float *weights, /* if this def_nr is not in the list, add it */ if(!node) { MDeformWeight *tmp_dw = BLI_cellalloc_calloc(sizeof(*tmp_dw), - "layerInterp_mdeformvert tmp_dw"); + "layerInterp_mdeformvert tmp_dw"); tmp_dw->def_nr = dw->def_nr; tmp_dw->weight = dw->weight * interp_weight; BLI_linklist_prepend(&dest_dw, tmp_dw); @@ -206,7 +202,7 @@ static void layerInterp_mdeformvert(void **sources, float *weights, if(totweight) { dvert->dw = BLI_cellalloc_calloc(sizeof(*dvert->dw) * totweight, - "layerInterp_mdeformvert dvert->dw"); + "layerInterp_mdeformvert dvert->dw"); dvert->totweight = totweight; for(i = 0, node = dest_dw; node; node = node->next, ++i) @@ -220,7 +216,7 @@ static void layerInterp_mdeformvert(void **sources, float *weights, static void layerInterp_msticky(void **sources, float *weights, - float *sub_weights, int count, void *dest) + float *sub_weights, int count, void *dest) { float co[2], w; MSticky *mst; @@ -252,7 +248,7 @@ static void layerCopy_tface(const void *source, void *dest, int count) } static void layerInterp_tface(void **sources, float *weights, - float *sub_weights, int count, void *dest) + float *sub_weights, int count, void *dest) { MTFace *tf = dest; int i, j, k; @@ -292,14 +288,14 @@ static void layerInterp_tface(void **sources, float *weights, } } -static void layerSwap_tface(void *data, int *corner_indices) +static void layerSwap_tface(void *data, const int *corner_indices) { MTFace *tf = data; float uv[4][2]; static const short pin_flags[4] = - { TF_PIN1, TF_PIN2, TF_PIN3, TF_PIN4 }; + { TF_PIN1, TF_PIN2, TF_PIN3, TF_PIN4 }; static const char sel_flags[4] = - { TF_SEL1, TF_SEL2, TF_SEL3, TF_SEL4 }; + { TF_SEL1, TF_SEL2, TF_SEL3, TF_SEL4 }; short unwrap = tf->unwrap & ~(TF_PIN1 | TF_PIN2 | TF_PIN3 | TF_PIN4); char flag = tf->flag & ~(TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4); int j; @@ -329,7 +325,7 @@ static void layerSwap_tface(void *data, int *corner_indices) static void layerDefault_tface(void *data, int count) { static MTFace default_tf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}, NULL, - 0, 0, TF_DYNAMIC, 0, 0}; + 0, 0, TF_DYNAMIC, 0, 0}; MTFace *tf = (MTFace*)data; int i; @@ -387,7 +383,7 @@ static void layerInterp_origspace_face(void **sources, float *weights, } } -static void layerSwap_origspace_face(void *data, int *corner_indices) +static void layerSwap_origspace_face(void *data, const int *corner_indices) { OrigSpaceFace *osf = data; float uv[4][2]; @@ -464,7 +460,7 @@ static int mdisp_corners(MDisps *s) return (s->totdisp % (3*3) == 0)? 3: 4; } -static void layerSwap_mdisps(void *data, int *ci) +static void layerSwap_mdisps(void *data, const int *ci) { MDisps *s = data; float (*d)[3] = NULL; @@ -485,7 +481,7 @@ static void layerSwap_mdisps(void *data, int *ci) } static void layerInterp_mdisps(void **sources, float *weights, float *sub_weights, - int count, void *dest) + int count, void *dest) { // XXX #if 0 @@ -578,7 +574,7 @@ static int layerRead_mdisps(CDataFile *cdf, void *data, int count) d[i].disps = MEM_callocN(sizeof(float)*3*d[i].totdisp, "mdisps read"); if(!cdf_read_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) { - printf("failed to read %d/%d %d\n", i, count, d[i].totdisp); + printf("failed to read multires displacement %d/%d %d\n", i, count, d[i].totdisp); return 0; } } @@ -593,7 +589,7 @@ static int layerWrite_mdisps(CDataFile *cdf, void *data, int count) for(i = 0; i < count; ++i) { if(!cdf_write_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) { - printf("failed to write %d/%d %d\n", i, count, d[i].totdisp); + printf("failed to write multires displacement %d/%d %d\n", i, count, d[i].totdisp); return 0; } } @@ -823,7 +819,7 @@ static void layerInterp_mloopuv(void **sources, float *weights, } static void layerInterp_mcol(void **sources, float *weights, - float *sub_weights, int count, void *dest) + float *sub_weights, int count, void *dest) { MCol *mc = dest; int i, j, k; @@ -878,7 +874,7 @@ static void layerInterp_mcol(void **sources, float *weights, } } -static void layerSwap_mcol(void *data, int *corner_indices) +static void layerSwap_mcol(void *data, const int *corner_indices) { MCol *mcol = data; MCol col[4]; @@ -979,9 +975,7 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerSwap_mcol, layerDefault_mcol}, {sizeof(MPoly), "MPoly", 1, "NGon Face", NULL, NULL, NULL, NULL, NULL}, {sizeof(MLoop), "MLoop", 1, "NGon Face-Vertex", NULL, NULL, NULL, NULL, NULL}, - {sizeof(MLoopCol), "MLoopCol", 1, "WeightLoopCol", NULL, NULL, layerInterp_mloopcol, NULL, - layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol, - layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol}, + {sizeof(float)*3, "", 0, "ClothOrco", NULL, NULL, layerInterp_shapekey}, {sizeof(MCol)*4, "MCol", 4, "IDCol", NULL, NULL, layerInterp_mcol, layerSwap_mcol, layerDefault_mcol}, {sizeof(MCol)*4, "MCol", 4, "TextureCol", NULL, NULL, layerInterp_mcol, @@ -990,6 +984,9 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { {sizeof(float)*3, "", 0, "ShapeKey", NULL, NULL, layerInterp_shapekey}, {sizeof(float), "", 0, "BevelWeight", NULL, NULL, layerInterp_bweight}, {sizeof(float), "", 0, "SubSurfCrease", NULL, NULL, layerInterp_bweight}, + {sizeof(MLoopCol), "MLoopCol", 1, "WeightLoopCol", NULL, NULL, layerInterp_mloopcol, NULL, + layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol, + layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol}, }; const char *LAYERTYPENAMES[CD_NUMTYPES] = { @@ -997,7 +994,10 @@ const char *LAYERTYPENAMES[CD_NUMTYPES] = { "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps", "CDWeightMCol", "CDMPoly", - "CDMLoop", "CDMLoopCol", "CDIDCol", "CDTextureCol", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight", "CDSubSurfCrease"}; + "CDMLoop", "CDMClothOrco", "CDMLoopCol", "CDIDCol", "CDTextureCol", + "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight", "CDSubSurfCrease" +}; + const CustomDataMask CD_MASK_BAREMESH = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MLOOP | CD_MASK_MPOLY | CD_MASK_BWEIGHT; @@ -1014,7 +1014,7 @@ const CustomDataMask CD_MASK_EDITMESH = CD_MASK_MDISPS | CD_MASK_SHAPEKEY; const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | - CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | + CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_WEIGHT_MLOOPCOL | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL | CD_MASK_NORMAL; @@ -1062,11 +1062,11 @@ void customData_update_typemap(CustomData *data) } void CustomData_merge(const struct CustomData *source, struct CustomData *dest, - CustomDataMask mask, int alloctype, int totelem) + CustomDataMask mask, int alloctype, int totelem) { const LayerTypeInfo *typeInfo; CustomDataLayer *layer, *newlayer; - int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0; + int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0, lastflag = 0; for(i = 0; i < source->totlayer; ++i) { layer = &source->layers[i]; @@ -1081,15 +1081,16 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest, lastclone = layer->active_clone; lastmask = layer->active_mask; lasttype = type; + lastflag = layer->flag; } else number++; - if(layer->flag & CD_FLAG_NOCOPY) continue; + if(lastflag & CD_FLAG_NOCOPY) continue; else if(!((int)mask & (int)(1 << (int)type))) continue; else if(number+1 < CustomData_number_of_layers(dest, type)) continue; - if((alloctype == CD_ASSIGN) && (layer->flag & CD_FLAG_NOFREE)) + if((alloctype == CD_ASSIGN) && (lastflag & CD_FLAG_NOFREE)) newlayer = customData_add_layer__internal(dest, type, CD_REFERENCE, layer->data, totelem, layer->name); else @@ -1101,6 +1102,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest, newlayer->active_rnd = lastrender; newlayer->active_clone = lastclone; newlayer->active_mask = lastmask; + newlayer->flag |= lastflag & (CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY); } } @@ -1108,10 +1110,13 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest, } void CustomData_copy(const struct CustomData *source, struct CustomData *dest, - CustomDataMask mask, int alloctype, int totelem) + CustomDataMask mask, int alloctype, int totelem) { memset(dest, 0, sizeof(*dest)); + if(source->external) + dest->external= MEM_dupallocN(source->external); + CustomData_merge(source, dest, mask, alloctype, totelem); } @@ -1375,7 +1380,7 @@ void CustomData_set_layer_flag(struct CustomData *data, int type, int flag) static int customData_resize(CustomData *data, int amount) { CustomDataLayer *tmp = MEM_callocN(sizeof(*tmp)*(data->maxlayer + amount), - "CustomData->layers"); + "CustomData->layers"); if(!tmp) return 0; data->maxlayer += amount; @@ -1463,13 +1468,13 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data, } void *CustomData_add_layer(CustomData *data, int type, int alloctype, - void *layerdata, int totelem) + void *layerdata, int totelem) { CustomDataLayer *layer; const LayerTypeInfo *typeInfo= layerType_getInfo(type); layer = customData_add_layer__internal(data, type, alloctype, layerdata, - totelem, typeInfo->defaultname); + totelem, typeInfo->defaultname); customData_update_typemap(data); if(layer) @@ -1480,12 +1485,12 @@ void *CustomData_add_layer(CustomData *data, int type, int alloctype, /*same as above but accepts a name*/ void *CustomData_add_layer_named(CustomData *data, int type, int alloctype, - void *layerdata, int totelem, char *name) + void *layerdata, int totelem, char *name) { CustomDataLayer *layer; layer = customData_add_layer__internal(data, type, alloctype, layerdata, - totelem, name); + totelem, name); customData_update_typemap(data); if(layer) @@ -1581,7 +1586,7 @@ void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type) } void *CustomData_duplicate_referenced_layer_named(struct CustomData *data, - int type, char *name) + int type, char *name) { CustomDataLayer *layer; int layer_index; @@ -1626,7 +1631,7 @@ void CustomData_free_temporary(CustomData *data, int totelem) } void CustomData_set_only_copy(const struct CustomData *data, - CustomDataMask mask) + CustomDataMask mask) { int i; @@ -1646,7 +1651,7 @@ void CustomData_copy_elements(int type, void *source, void *dest, int count) } void CustomData_copy_data(const CustomData *source, CustomData *dest, - int source_index, int dest_index, int count) + int source_index, int dest_index, int count) { const LayerTypeInfo *typeInfo; int src_i, dest_i; @@ -1661,7 +1666,7 @@ void CustomData_copy_data(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -1679,12 +1684,12 @@ void CustomData_copy_data(const CustomData *source, CustomData *dest, if(typeInfo->copy) typeInfo->copy(src_data + src_offset, - dest_data + dest_offset, - count); + dest_data + dest_offset, + count); else memcpy(dest_data + dest_offset, - src_data + src_offset, - count * typeInfo->size); + src_data + src_offset, + count * typeInfo->size); /* if there are multiple source & dest layers of the same type, * we don't want to copy all source layers to the same dest, so @@ -1708,7 +1713,7 @@ void CustomData_free_elem(CustomData *data, int index, int count) int offset = typeInfo->size * index; typeInfo->free((char *)data->layers[i].data + offset, - count, typeInfo->size); + count, typeInfo->size); } } } @@ -1717,8 +1722,8 @@ void CustomData_free_elem(CustomData *data, int index, int count) #define SOURCE_BUF_SIZE 100 void CustomData_interp(const CustomData *source, CustomData *dest, - int *src_indices, float *weights, float *sub_weights, - int count, int dest_index) + int *src_indices, float *weights, float *sub_weights, + int count, int dest_index) { int src_i, dest_i; int dest_offset; @@ -1731,7 +1736,7 @@ void CustomData_interp(const CustomData *source, CustomData *dest, */ if(count > SOURCE_BUF_SIZE) sources = MEM_callocN(sizeof(*sources) * count, - "CustomData_interp sources"); + "CustomData_interp sources"); /* interpolates a layer at a time */ dest_i = 0; @@ -1743,7 +1748,7 @@ void CustomData_interp(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -1773,7 +1778,7 @@ void CustomData_interp(const CustomData *source, CustomData *dest, if(count > SOURCE_BUF_SIZE) MEM_freeN(sources); } -void CustomData_swap(struct CustomData *data, int index, int *corner_indices) +void CustomData_swap(struct CustomData *data, int index, const int *corner_indices) { const LayerTypeInfo *typeInfo; int i; @@ -1836,7 +1841,7 @@ void *CustomData_get_layer_n(const CustomData *data, int type, int n) } void *CustomData_get_layer_named(const struct CustomData *data, int type, - char *name) + char *name) { int layer_index = CustomData_get_named_layer_index(data, type, name); if(layer_index < 0) return NULL; @@ -1884,21 +1889,21 @@ void CustomData_set(const CustomData *data, int index, int type, void *source) void CustomData_em_free_block(CustomData *data, void **block) { - const LayerTypeInfo *typeInfo; - int i; + const LayerTypeInfo *typeInfo; + int i; if(!*block) return; - for(i = 0; i < data->totlayer; ++i) { - if(!(data->layers[i].flag & CD_FLAG_NOFREE)) { - typeInfo = layerType_getInfo(data->layers[i].type); + for(i = 0; i < data->totlayer; ++i) { + if(!(data->layers[i].flag & CD_FLAG_NOFREE)) { + typeInfo = layerType_getInfo(data->layers[i].type); - if(typeInfo->free) { + if(typeInfo->free) { int offset = data->layers[i].offset; - typeInfo->free((char*)*block + offset, 1, typeInfo->size); + typeInfo->free((char*)*block + offset, 1, typeInfo->size); } - } - } + } + } MEM_freeN(*block); *block = NULL; @@ -1918,7 +1923,7 @@ static void CustomData_em_alloc_block(CustomData *data, void **block) } void CustomData_em_copy_data(const CustomData *source, CustomData *dest, - void *src_block, void **dest_block) + void *src_block, void **dest_block) { const LayerTypeInfo *typeInfo; int dest_i, src_i; @@ -1934,7 +1939,7 @@ void CustomData_em_copy_data(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -2011,7 +2016,7 @@ void CustomData_em_set_n(CustomData *data, void *block, int type, int n, void *s } void CustomData_em_interp(CustomData *data, void **src_blocks, float *weights, - float *sub_weights, int count, void *dest_block) + float *sub_weights, int count, void *dest_block) { int i, j; void *source_buf[SOURCE_BUF_SIZE]; @@ -2022,7 +2027,7 @@ void CustomData_em_interp(CustomData *data, void **src_blocks, float *weights, */ if(count > SOURCE_BUF_SIZE) sources = MEM_callocN(sizeof(*sources) * count, - "CustomData_interp sources"); + "CustomData_interp sources"); /* interpolates a layer at a time */ for(i = 0; i < data->totlayer; ++i) { @@ -2034,7 +2039,7 @@ void CustomData_em_interp(CustomData *data, void **src_blocks, float *weights, sources[j] = (char *)src_blocks[j] + layer->offset; typeInfo->interp(sources, weights, sub_weights, count, - (char *)dest_block + layer->offset); + (char *)dest_block + layer->offset); } } @@ -2060,7 +2065,7 @@ void CustomData_em_set_default(CustomData *data, void **block) } void CustomData_to_em_block(const CustomData *source, CustomData *dest, - int src_index, void **dest_block) + int src_index, void **dest_block) { const LayerTypeInfo *typeInfo; int dest_i, src_i, src_offset; @@ -2076,7 +2081,7 @@ void CustomData_to_em_block(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -2106,7 +2111,7 @@ void CustomData_to_em_block(const CustomData *source, CustomData *dest, } void CustomData_from_em_block(const CustomData *source, CustomData *dest, - void *src_block, int dest_index) + void *src_block, int dest_index) { const LayerTypeInfo *typeInfo; int dest_i, src_i, dest_offset; @@ -2119,7 +2124,7 @@ void CustomData_from_em_block(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -2233,20 +2238,20 @@ void CustomData_bmesh_merge(CustomData *source, CustomData *dest, void CustomData_bmesh_free_block(CustomData *data, void **block) { - const LayerTypeInfo *typeInfo; - int i; + const LayerTypeInfo *typeInfo; + int i; if(!*block) return; - for(i = 0; i < data->totlayer; ++i) { - if(!(data->layers[i].flag & CD_FLAG_NOFREE)) { - typeInfo = layerType_getInfo(data->layers[i].type); + for(i = 0; i < data->totlayer; ++i) { + if(!(data->layers[i].flag & CD_FLAG_NOFREE)) { + typeInfo = layerType_getInfo(data->layers[i].type); - if(typeInfo->free) { + if(typeInfo->free) { int offset = data->layers[i].offset; typeInfo->free((char*)*block + offset, 1, typeInfo->size); } - } - } + } + } if (data->totsize) BLI_mempool_free(data->pool, *block); @@ -2267,7 +2272,7 @@ static void CustomData_bmesh_alloc_block(CustomData *data, void **block) } void CustomData_bmesh_copy_data(const CustomData *source, CustomData *dest, - void *src_block, void **dest_block) + void *src_block, void **dest_block) { const LayerTypeInfo *typeInfo; int dest_i, src_i; @@ -2283,7 +2288,7 @@ void CustomData_bmesh_copy_data(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -2450,7 +2455,7 @@ void CustomData_bmesh_set_layer_n(CustomData *data, void *block, int n, void *so } void CustomData_bmesh_interp(CustomData *data, void **src_blocks, float *weights, - float *sub_weights, int count, void *dest_block) + float *sub_weights, int count, void *dest_block) { int i, j; void *source_buf[SOURCE_BUF_SIZE]; @@ -2461,7 +2466,7 @@ void CustomData_bmesh_interp(CustomData *data, void **src_blocks, float *weights */ if(count > SOURCE_BUF_SIZE) sources = MEM_callocN(sizeof(*sources) * count, - "CustomData_interp sources"); + "CustomData_interp sources"); /* interpolates a layer at a time */ for(i = 0; i < data->totlayer; ++i) { @@ -2472,7 +2477,7 @@ void CustomData_bmesh_interp(CustomData *data, void **src_blocks, float *weights sources[j] = (char *)src_blocks[j] + layer->offset; typeInfo->interp(sources, weights, sub_weights, count, - (char *)dest_block + layer->offset); + (char *)dest_block + layer->offset); } } @@ -2499,7 +2504,7 @@ void CustomData_bmesh_set_default(CustomData *data, void **block) } void CustomData_to_bmesh_block(const CustomData *source, CustomData *dest, - int src_index, void **dest_block) + int src_index, void **dest_block) { const LayerTypeInfo *typeInfo; int dest_i, src_i, src_offset; @@ -2515,7 +2520,7 @@ void CustomData_to_bmesh_block(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -2545,7 +2550,7 @@ void CustomData_to_bmesh_block(const CustomData *source, CustomData *dest, } void CustomData_from_bmesh_block(const CustomData *source, CustomData *dest, - void *src_block, int dest_index) + void *src_block, int dest_index) { const LayerTypeInfo *typeInfo; int dest_i, src_i, dest_offset; @@ -2558,7 +2563,7 @@ void CustomData_from_bmesh_block(const CustomData *source, CustomData *dest, * (this should work because layers are ordered by type) */ while(dest_i < dest->totlayer - && dest->layers[dest_i].type < source->layers[src_i].type) + && dest->layers[dest_i].type < source->layers[src_i].type) ++dest_i; /* if there are no more dest layers, we're done */ @@ -2698,8 +2703,8 @@ int CustomData_verify_versions(struct CustomData *data, int index) } if (!keeplayer) { - for (i=index+1; i < data->totlayer; ++i) - data->layers[i-1] = data->layers[i]; + for (i=index+1; i < data->totlayer; ++i) + data->layers[i-1] = data->layers[i]; data->totlayer--; } @@ -2710,10 +2715,29 @@ int CustomData_verify_versions(struct CustomData *data, int index) static void customdata_external_filename(char filename[FILE_MAX], ID *id, CustomDataExternal *external) { - char *path = (id->lib)? id->lib->filename: G.sce; + char *path = (id->lib)? id->lib->filepath: G.sce; BLI_strncpy(filename, external->filename, FILE_MAX); - BLI_convertstringcode(filename, path); + BLI_path_abs(filename, path); +} + +void CustomData_external_reload(CustomData *data, ID *id, CustomDataMask mask, int totelem) +{ + CustomDataLayer *layer; + const LayerTypeInfo *typeInfo; + int i; + + for(i=0; i<data->totlayer; i++) { + layer = &data->layers[i]; + typeInfo = layerType_getInfo(layer->type); + + if(!(mask & (1<<layer->type))); + else if((layer->flag & CD_FLAG_EXTERNAL) && (layer->flag & CD_FLAG_IN_MEMORY)) { + if(typeInfo->free) + typeInfo->free(layer->data, totelem, typeInfo->size); + layer->flag &= ~CD_FLAG_IN_MEMORY; + } + } } void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int totelem) @@ -2883,9 +2907,9 @@ void CustomData_external_add(CustomData *data, ID *id, int type, int totelem, co if(!external) { external= MEM_callocN(sizeof(CustomDataExternal), "CustomDataExternal"); - BLI_strncpy(external->filename, filename, sizeof(external->filename)); data->external= external; } + BLI_strncpy(external->filename, filename, sizeof(external->filename)); layer->flag |= CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY; } diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 06b5ba84433..1ab0cb8d29d 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -38,35 +38,14 @@ #include "MEM_guardedalloc.h" -#include "DNA_curve_types.h" -#include "DNA_effect_types.h" -#include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_scene_types.h" -#include "BKE_curve.h" #include "BKE_deform.h" -#include "BKE_displist.h" -#include "BKE_effect.h" -#include "BKE_global.h" -#include "BKE_key.h" -#include "BKE_lattice.h" -#include "BKE_object.h" -#include "BKE_softbody.h" -#include "BKE_utildefines.h" -#include "BKE_mesh.h" #include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_cellalloc.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - void defgroup_copy_list (ListBase *outbase, ListBase *inbase) { @@ -223,7 +202,7 @@ int defgroup_name_index (Object *ob, const char *name) bDeformGroup *curdef; int def_nr; - if(name[0] != '\0') { + if(name && name[0] != '\0') { for (curdef=ob->defbase.first, def_nr=0; curdef; curdef=curdef->next, def_nr++) { if (!strcmp(curdef->name, name)) return def_nr; @@ -386,10 +365,10 @@ void defgroup_unique_name (bDeformGroup *dg, Object *ob) void flip_side_name (char *name, const char *from_name, int strip_number) { int len; - char prefix[sizeof((bDeformGroup *)NULL)->name]={""}; /* The part before the facing */ - char suffix[sizeof((bDeformGroup *)NULL)->name]={""}; /* The part after the facing */ - char replace[sizeof((bDeformGroup *)NULL)->name]={""}; /* The replacement string */ - char number[sizeof((bDeformGroup *)NULL)->name]={""}; /* The number extension string */ + char prefix[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The part before the facing */ + char suffix[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The part after the facing */ + char replace[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The replacement string */ + char number[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The number extension string */ char *index=NULL; len= strlen(from_name); diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 0c9248c1eb9..142f80a350e 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -29,35 +29,16 @@ #include <string.h> #include <math.h> -#include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_winstuff.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_boid_types.h" -#include "DNA_curve_types.h" #include "DNA_camera_types.h" -#include "DNA_ID.h" -#include "DNA_effect_types.h" #include "DNA_group_types.h" #include "DNA_lattice_types.h" -#include "DNA_lamp_types.h" #include "DNA_key_types.h" #include "DNA_mesh_types.h" -#include "DNA_modifier_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_object_fluidsim.h" -#include "DNA_outliner_types.h" -#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_view2d_types.h" -#include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" #include "BLI_ghash.h" @@ -75,7 +56,6 @@ #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_pointcache.h" -#include "BKE_utildefines.h" #include "BKE_scene.h" #include "BKE_screen.h" @@ -488,11 +468,6 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O addtoroot = 0; } - if (ob->track) { - node2 = dag_get_node(dag,ob->track); - dag_add_relation(dag,node2,node,DAG_RL_OB_OB, "Track To"); - addtoroot = 0; - } if (ob->proxy) { node2 = dag_get_node(dag, ob->proxy); dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA|DAG_RL_OB_OB, "Proxy"); @@ -828,7 +803,7 @@ DagNode * dag_add_node (DagForest *forest, void * fob) } if(!forest->nodeHash) - forest->nodeHash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + forest->nodeHash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "dag_add_node gh"); BLI_ghash_insert(forest->nodeHash, fob, node); } @@ -971,7 +946,7 @@ static void dag_node_print_dependency_cycle(DagForest *dag, DagNode *startnode, { DagNode *node; - for(node = dag->DagNode.first; node; node= node->next) + for(node = dag->DagNode.first; node; node= node->next) node->color= DAG_WHITE; printf(" %s depends on %s through %s.\n", dag_node_name(endnode), dag_node_name(startnode), name); @@ -1553,7 +1528,7 @@ int is_acyclic( DagForest *dag) { void set_node_xy(DagNode *node, float x, float y) { - node->x = x; + node->x = x; node->y = y; } @@ -1779,8 +1754,8 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime) node->lasttime= curtime; ob= node->ob; - if(ob && (ob->recalc & OB_RECALC)) { - all_layer= ob->lay; + if(ob && (ob->recalc & OB_RECALC_ALL)) { + all_layer= node->scelay; /* got an object node that changes, now check relations */ for(itA = node->child; itA; itA= itA->next) { @@ -1822,7 +1797,7 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime) if(ob->recalc & OB_RECALC_DATA) object_free_display(ob); - ob->recalc &= ~OB_RECALC; + ob->recalc &= ~OB_RECALC_ALL; } } @@ -1835,7 +1810,7 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime) if(itA->node->type==ID_OB) { obc= itA->node->ob; /* child moves */ - if((obc->recalc & OB_RECALC)==OB_RECALC_OB) { + if((obc->recalc & OB_RECALC_ALL)==OB_RECALC_OB) { /* parent has deforming info */ if(itA->type & (DAG_RL_OB_DATA|DAG_RL_DATA_DATA)) { // printf("parent %s changes ob %s\n", ob->id.name, obc->id.name); @@ -1889,7 +1864,7 @@ static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int if(itA->node->lasttime!=curtime) { ob= (Object*)(node->ob); - if(reset || (ob->recalc & OB_RECALC)) { + if(reset || (ob->recalc & OB_RECALC_ALL)) { if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH)) ob->recalc |= OB_RECALC_DATA; @@ -1902,13 +1877,60 @@ static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int } } +/* flush layer flags to dependencies */ +static void dag_scene_flush_layers(Scene *sce, int lay) +{ + DagNode *node, *firstnode; + DagAdjList *itA; + Base *base; + int lasttime; + + firstnode= sce->theDag->DagNode.first; // always scene node + + for(itA = firstnode->child; itA; itA= itA->next) + itA->lay= 0; + + sce->theDag->time++; // so we know which nodes were accessed + lasttime= sce->theDag->time; + + /* update layer flags in nodes */ + for(base= sce->base.first; base; base= base->next) { + node= dag_get_node(sce->theDag, base->object); + node->scelay= base->object->lay; + } + + /* ensure cameras are set as if they are on a visible layer, because + they ared still used for rendering or setting the camera view */ + if(sce->camera) { + node= dag_get_node(sce->theDag, sce->camera); + node->scelay |= lay; + } + +#ifdef DURIAN_CAMERA_SWITCH + { + TimeMarker *m; + + for(m= sce->markers.first; m; m= m->next) { + if(m->camera) { + node= dag_get_node(sce->theDag, m->camera); + node->scelay |= lay; + } + } + } +#endif + + /* flush layer nodes to dependencies */ + for(itA = firstnode->child; itA; itA= itA->next) + if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB) + flush_layer_node(sce, itA->node, lasttime); +} + /* flushes all recalc flags in objects down the dependency tree */ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time) { - DagNode *firstnode, *node; + DagNode *firstnode; DagAdjList *itA; Object *ob; - Base *base; int lasttime; if(sce->theDag==NULL) { @@ -1918,26 +1940,9 @@ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time) firstnode= sce->theDag->DagNode.first; // always scene node - for(itA = firstnode->child; itA; itA= itA->next) - itA->lay= 0; - /* first we flush the layer flags */ - sce->theDag->time++; // so we know which nodes were accessed - lasttime= sce->theDag->time; + dag_scene_flush_layers(sce, lay); - - for(base= sce->base.first; base; base= base->next) { - node= dag_get_node(sce->theDag, base->object); - if(node) - node->scelay= base->object->lay; - else - node->scelay= 0; - } - - for(itA = firstnode->child; itA; itA= itA->next) - if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB) - flush_layer_node(sce, itA->node, lasttime); - /* then we use the relationships + layer info to flush update events */ sce->theDag->time++; // so we know which nodes were accessed lasttime= sce->theDag->time; @@ -1953,7 +1958,7 @@ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time) if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB) { ob= (Object*)(itA->node->ob); - if(ob->recalc & OB_RECALC) { + if(ob->recalc & OB_RECALC_ALL) { if(BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH)) ob->recalc |= OB_RECALC_DATA; @@ -1969,11 +1974,30 @@ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time) static int object_modifiers_use_time(Object *ob) { ModifierData *md; - + + /* check if a modifier in modifier stack needs time input */ for (md=ob->modifiers.first; md; md=md->next) if (modifier_dependsOnTime(md)) return 1; - + + /* check whether any modifiers are animated */ + if (ob->adt) { + AnimData *adt = ob->adt; + + /* action - check for F-Curves with paths containing 'modifiers[' */ + if (adt->action) { + FCurve *fcu; + + for (fcu = adt->action->curves.first; fcu; fcu = fcu->next) { + if (fcu->rna_path && strstr(fcu->rna_path, "modifiers[")) + return 1; + } + } + + // XXX: also, should check NLA strips, though for now assume that nobody uses + // that and we can omit that for performance reasons... + } + return 0; } @@ -2033,14 +2057,14 @@ static void dag_object_time_update_flags(Object *ob) /* this case is for groups with nla, whilst nla target has no action or nla */ for(strip= ob->nlastrips.first; strip; strip= strip->next) { if(strip->object) - strip->object->recalc |= OB_RECALC; + strip->object->recalc |= OB_RECALC_ALL; } } } #endif // XXX old animation system if(animdata_use_time(ob->adt)) { - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_OB; ob->adt->recalc |= ADT_RECALC_ANIM; } @@ -2193,7 +2217,7 @@ static void dag_current_scene_layers(Main *bmain, Scene **sce, unsigned int *lay *sce= bmain->scene.first; if(*sce) *lay= (*sce)->lay; - /* XXX for background mode, we should get the scen + /* XXX for background mode, we should get the scene from somewhere, for the -S option, but it's in the context, how to get it here? */ } @@ -2219,19 +2243,24 @@ void DAG_on_load_update(void) Object *ob; Group *group; GroupObject *go; - unsigned int lay; + DagNode *node; + unsigned int lay, oblay; dag_current_scene_layers(bmain, &scene, &lay); - if(scene) { + if(scene && scene->theDag) { /* derivedmeshes and displists are not saved to file so need to be remade, tag them so they get remade in the scene update loop, note armature poses or object matrices are preserved and do not require updates, so we skip those */ + dag_scene_flush_layers(scene, lay); + for(SETLOOPER(scene, base)) { ob= base->object; + node= (sce->theDag)? dag_get_node(sce->theDag, ob): NULL; + oblay= (node)? node->lay: ob->lay; - if(base->lay & lay) { + if(oblay & lay) { if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) ob->recalc |= OB_RECALC_DATA; if(ob->dup_group) @@ -2244,6 +2273,8 @@ void DAG_on_load_update(void) for(go= group->gobject.first; go; go= go->next) { if(ELEM5(go->ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) go->ob->recalc |= OB_RECALC_DATA; + if(go->ob->proxy_from) + go->ob->recalc |= OB_RECALC_OB; } group->id.flag &= ~LIB_DOIT; @@ -2255,6 +2286,16 @@ void DAG_on_load_update(void) } } +static void dag_id_flush_update__isDependentTexture(void *userData, Object *ob, ID **idpoin) +{ + struct { ID *id; int is_dependent; } *data = userData; + + if(*idpoin && GS((*idpoin)->name)==ID_TE) { + if (data->id == (*idpoin)) + data->is_dependent = 1; + } +} + void DAG_id_flush_update(ID *id, short flag) { Main *bmain= G.main; @@ -2271,7 +2312,7 @@ void DAG_id_flush_update(ID *id, short flag) /* set flags & pointcache for object */ if(GS(id->name) == ID_OB) { ob= (Object*)id; - ob->recalc |= (flag & OB_RECALC); + ob->recalc |= (flag & OB_RECALC_ALL); BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH); if(flag & OB_RECALC_DATA) { @@ -2279,15 +2320,10 @@ void DAG_id_flush_update(ID *id, short flag) id= ob->data; /* no point in trying in this cases */ - if(!id || id->us <= 1) - id= NULL; - /* curves and surfaces only need to mark one object, since - otherwise cu->displist would be computed multiple times */ - else if(ob->type==OB_CURVE || ob->type==OB_SURF) - id= NULL; - /* also for locked shape keys we make an exception */ - else if(ob_get_key(ob) && (ob->shapeflag & OB_SHAPE_LOCK)) + if(id && id->us <= 1) { + dag_editors_update(bmain, id); id= NULL; + } } } @@ -2296,25 +2332,44 @@ void DAG_id_flush_update(ID *id, short flag) idtype= GS(id->name); if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) { + int first_ob= 1; for(obt=bmain->object.first; obt; obt= obt->id.next) { if(!(ob && obt == ob) && obt->data == id) { + + /* try to avoid displist recalculation for linked curves */ + if (!first_ob && ELEM(obt->type, OB_CURVE, OB_SURF)) { + /* if curve object has got derivedFinal it means this + object has got constructive modifiers and object + should be recalculated anyhow */ + if (!obt->derivedFinal) + continue; + } + obt->recalc |= OB_RECALC_DATA; BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH); - /* for these we only flag one object, otherwise cu->displist - would be computed multiple times */ - if(obt->type==OB_CURVE || obt->type==OB_SURF) - break; + first_ob= 0; } } } + /* set flags based on textures - can influence depgraph via modifiers */ + if(idtype == ID_TE) { + for(obt=bmain->object.first; obt; obt= obt->id.next) { + struct { ID *id; int is_dependent; } data = {id, 0}; + + modifiers_foreachIDLink(obt, dag_id_flush_update__isDependentTexture, &data); + if (data.is_dependent) + obt->recalc |= OB_RECALC_DATA; + } + } + /* set flags based on ShapeKey */ if(idtype == ID_KE) { for(obt=bmain->object.first; obt; obt= obt->id.next) { Key *key= ob_get_key(obt); if(!(ob && obt == ob) && ((ID *)key == id)) { - obt->flag |= (OB_RECALC|OB_RECALC_DATA); + obt->flag |= (OB_RECALC_OB|OB_RECALC_DATA); BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH); } } @@ -2327,7 +2382,7 @@ void DAG_id_flush_update(ID *id, short flag) for(psys=obt->particlesystem.first; psys; psys=psys->next) { if(&psys->part->id == id) { BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH); - obt->recalc |= (flag & OB_RECALC); + obt->recalc |= (flag & OB_RECALC_ALL); psys->recalc |= (flag & PSYS_RECALC); } } @@ -2407,7 +2462,7 @@ void DAG_id_update_flags(ID *id) GroupObject *go; /* primitive; tag all... this call helps building groups for particles */ for(go= group->gobject.first; go; go= go->next) - go->ob->recalc= OB_RECALC; + go->ob->recalc= OB_RECALC_ALL; } } else { diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index c1fcf4f13f4..15e561cfc45 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -35,54 +35,28 @@ #include "MEM_guardedalloc.h" -#include "IMB_imbuf_types.h" -#include "DNA_texture_types.h" -#include "DNA_meta_types.h" #include "DNA_curve_types.h" -#include "DNA_effect_types.h" -#include "DNA_listBase.h" -#include "DNA_lamp_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" #include "DNA_scene_types.h" -#include "DNA_image_types.h" #include "DNA_material_types.h" -#include "DNA_view3d_types.h" -#include "DNA_lattice_types.h" -#include "DNA_key_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_editVert.h" -#include "BLI_edgehash.h" -#include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_displist.h" -#include "BKE_deform.h" -#include "BKE_DerivedMesh.h" +#include "BKE_cdderivedmesh.h" #include "BKE_object.h" -#include "BKE_world.h" -#include "BKE_mesh.h" -#include "BKE_effect.h" #include "BKE_mball.h" #include "BKE_material.h" #include "BKE_curve.h" #include "BKE_key.h" #include "BKE_anim.h" -#include "BKE_screen.h" -#include "BKE_texture.h" -#include "BKE_library.h" #include "BKE_font.h" #include "BKE_lattice.h" -#include "BKE_scene.h" -#include "BKE_subsurf.h" #include "BKE_modifier.h" -#include "BKE_customdata.h" #include "RE_pipeline.h" #include "RE_shader_ext.h" @@ -222,10 +196,10 @@ void addnormalsDispList(Object *ob, ListBase *lb) normal_quad_v3( nor,v1, v3, v4, v2); - add_v3_v3v3(n1, n1, nor); - add_v3_v3v3(n2, n2, nor); - add_v3_v3v3(n3, n3, nor); - add_v3_v3v3(n4, n4, nor); + add_v3_v3(n1, nor); + add_v3_v3(n2, nor); + add_v3_v3(n3, nor); + add_v3_v3(n4, nor); v2= v1; v1+= 3; v4= v3; v3+= 3; @@ -321,9 +295,9 @@ static Render *fastshade_get_render(Scene *scene) /* XXX ugly global still, but we can't do preview while rendering */ if(G.rendering==0) { - Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT); + Render *re= RE_GetRender("_Shade View_"); if(re==NULL) { - re= RE_NewRender("_Shade View_", RE_SLOT_DEFAULT); + re= RE_NewRender("_Shade View_"); RE_Database_Baking(re, scene, 0, 0); /* 0= no faces */ } @@ -337,7 +311,7 @@ static Render *fastshade_get_render(Scene *scene) /* called on file reading */ void fastshade_free_render(void) { - Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT); + Render *re= RE_GetRender("_Shade View_"); if(re) { RE_Database_Free(re); @@ -516,7 +490,7 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un float *orco, *vnors, *nors, imat[3][3], mat[4][4], vec[3]; int a, i, need_orco, totface, totvert; CustomDataMask dataMask = CD_MASK_BAREMESH | CD_MASK_MCOL - | CD_MASK_MTFACE | CD_MASK_NORMAL; + | CD_MASK_MTFACE | CD_MASK_NORMAL; init_fastshade_for_ob(re, ob, &need_orco, mat, imat); @@ -601,9 +575,9 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un char *col1= (char*)&col1base[j*4]; char *col2= (char*)(col2base?&col2base[j*4]:NULL); float *vn = (mf->flag & ME_SMOOTH)?&vnors[3*vidx[j]]:n1; - - VECCOPY(vec, mv->co); - mul_m4_v3(mat, vec); + + mul_v3_m4v3(vec, mat, mv->co); + vec[0]+= 0.001*vn[0]; vec[1]+= 0.001*vn[1]; vec[2]+= 0.001*vn[2]; @@ -714,8 +688,7 @@ void shadeDispList(Scene *scene, Base *base) a= dl->nr; while(a--) { - VECCOPY(vec, fp); - mul_m4_v3(mat, vec); + mul_v3_m4v3(vec, mat, fp); fastshade(vec, n1, fp, ma, (char *)col1, NULL); @@ -730,8 +703,7 @@ void shadeDispList(Scene *scene, Base *base) nor= dl->nors; while(a--) { - VECCOPY(vec, fp); - mul_m4_v3(mat, vec); + mul_v3_m4v3(vec, mat, fp); n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2]; n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2]; @@ -768,8 +740,7 @@ void shadeDispList(Scene *scene, Base *base) a= dl->nr; while(a--) { - VECCOPY(vec, fp); - mul_m4_v3(mat, vec); + mul_v3_m4v3(vec, mat, fp); /* transpose ! */ n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2]; @@ -839,17 +810,17 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) /* count */ len= 0; a= nu->pntsu-1; - if(nu->flagu & CU_CYCLIC) a++; + if(nu->flagu & CU_NURB_CYCLIC) a++; prevbezt= nu->bezt; bezt= prevbezt+1; while(a--) { - if(a==0 && (nu->flagu & CU_CYCLIC)) bezt= nu->bezt; + if(a==0 && (nu->flagu & CU_NURB_CYCLIC)) bezt= nu->bezt; if(prevbezt->h2==HD_VECT && bezt->h1==HD_VECT) len++; else len+= resolu; - if(a==0 && (nu->flagu & CU_CYCLIC)==0) len++; + if(a==0 && (nu->flagu & CU_NURB_CYCLIC)==0) len++; prevbezt= bezt; bezt++; @@ -866,7 +837,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) data= dl->verts; - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { dl->type= DL_POLY; a= nu->pntsu; } @@ -919,9 +890,9 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) dl->charidx = nu->charidx; data= dl->verts; - if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY; + if(nu->flagu & CU_NURB_CYCLIC) dl->type= DL_POLY; else dl->type= DL_SEGM; - makeNurbcurve(nu, data, NULL, NULL, resolu, 3*sizeof(float)); + makeNurbcurve(nu, data, NULL, NULL, NULL, resolu, 3*sizeof(float)); } else if(nu->type == CU_POLY) { len= nu->pntsu; @@ -934,7 +905,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) dl->charidx = nu->charidx; data= dl->verts; - if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY; + if(nu->flagu & CU_NURB_CYCLIC) dl->type= DL_POLY; else dl->type= DL_SEGM; a= len; @@ -951,7 +922,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) } -void filldisplist(ListBase *dispbase, ListBase *to) +void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal) { EditVert *eve, *v1, *vlast; EditFace *efa; @@ -1045,6 +1016,9 @@ void filldisplist(ListBase *dispbase, ListBase *to) index[0]= (intptr_t)efa->v1->tmp.l; index[1]= (intptr_t)efa->v2->tmp.l; index[2]= (intptr_t)efa->v3->tmp.l; + + if(flipnormal) + SWAP(int, index[0], index[2]); index+= 3; efa= efa->next; @@ -1121,13 +1095,13 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase) dl= dl->next; } - filldisplist(&front, dispbase); - filldisplist(&back, dispbase); + filldisplist(&front, dispbase, 1); + filldisplist(&back, dispbase, 0); freedisplist(&front); freedisplist(&back); - filldisplist(dispbase, dispbase); + filldisplist(dispbase, dispbase, 0); } @@ -1139,7 +1113,7 @@ static void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase) bevels_to_filledpoly(cu, dispbase); } else { - filldisplist(dispbase, dispbase); + filldisplist(dispbase, dispbase, 0); } } @@ -1195,21 +1169,31 @@ void makeDispListMBall(Scene *scene, Object *ob) { if(!ob || ob->type!=OB_MBALL) return; + // XXX: mball stuff uses plenty of global variables + // while this is unchanged updating during render is unsafe + if(G.rendering) return; + freedisplist(&(ob->disp)); - + if(ob->type==OB_MBALL) { if(ob==find_basis_mball(scene, ob)) { - metaball_polygonize(scene, ob); + metaball_polygonize(scene, ob, &ob->disp); tex_space_mball(ob); - object_deform_mball(ob); + object_deform_mball(ob, &ob->disp); } } boundbox_displist(ob); } -static ModifierData *curve_get_tesselate_point(Object *ob, int forRender, int editmode) +void makeDispListMBall_forRender(Scene *scene, Object *ob, ListBase *dispbase) +{ + metaball_polygonize(scene, ob, dispbase); + object_deform_mball(ob, dispbase); +} + +static ModifierData *curve_get_tesselate_point(Scene *scene, Object *ob, int forRender, int editmode) { ModifierData *md = modifiers_getVirtualModifierList(ob); ModifierData *preTesselatePoint; @@ -1222,10 +1206,7 @@ static ModifierData *curve_get_tesselate_point(Object *ob, int forRender, int ed preTesselatePoint = NULL; for (; md; md=md->next) { - ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - if ((md->mode & required_mode) != required_mode) continue; - if (mti->isDisabled && mti->isDisabled(md, forRender)) continue; + if (!modifier_isEnabled(scene, md, required_mode)) continue; if (ELEM3(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) { preTesselatePoint = md; @@ -1251,7 +1232,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl if(forRender) required_mode = eModifierMode_Render; else required_mode = eModifierMode_Realtime; - preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode); + preTesselatePoint = curve_get_tesselate_point(scene, ob, forRender, editmode); if(editmode) required_mode |= eModifierMode_Editmode; @@ -1282,7 +1263,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl deformedVerts = curve_getVertexCos(cu, nurb, &numVerts); originalVerts = MEM_dupallocN(deformedVerts); } - + mti->deformVerts(md, ob, NULL, deformedVerts, numVerts, forRender, editmode); if (md==preTesselatePoint) @@ -1294,7 +1275,7 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl curve_applyVertexCos(cu, nurb, deformedVerts); if (keyVerts) /* these are not passed through modifier stack */ curve_applyKeyVertexTilts(cu, nurb, keyVerts); - + if(keyVerts) MEM_freeN(keyVerts); @@ -1303,20 +1284,56 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, fl *numVerts_r = numVerts; } -static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispbase, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3]) +static float (*displist_get_allverts (ListBase *dispbase, int *totvert))[3] +{ + DispList *dl; + float (*allverts)[3], *fp; + + *totvert= 0; + + for (dl=dispbase->first; dl; dl=dl->next) + *totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr; + + allverts= MEM_mallocN((*totvert)*sizeof(float)*3, "displist_get_allverts allverts"); + fp= (float*)allverts; + for (dl=dispbase->first; dl; dl=dl->next) { + int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); + memcpy(fp, dl->verts, sizeof(float) * offs); + fp+= offs; + } + + return allverts; +} + +static void displist_apply_allverts(ListBase *dispbase, float (*allverts)[3]) +{ + DispList *dl; + float *fp; + + fp= (float*)allverts; + for (dl=dispbase->first; dl; dl=dl->next) { + int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); + memcpy(dl->verts, fp, sizeof(float) * offs); + fp+= offs; + } +} + +static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispbase, + DerivedMesh **derivedFinal, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3]) { ModifierData *md = modifiers_getVirtualModifierList(ob); ModifierData *preTesselatePoint; Curve *cu= ob->data; ListBase *nurb= cu->editnurb?cu->editnurb:&cu->nurb; - DispList *dl; - int required_mode; + int required_mode, totvert = 0; int editmode = (!forRender && cu->editnurb); + DerivedMesh *dm= NULL, *ndm; + float (*vertCos)[3] = NULL; if(forRender) required_mode = eModifierMode_Render; else required_mode = eModifierMode_Realtime; - preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode); + preTesselatePoint = curve_get_tesselate_point(scene, ob, forRender, editmode); if(editmode) required_mode |= eModifierMode_Editmode; @@ -1324,47 +1341,104 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba md = preTesselatePoint->next; } + if (derivedFinal && *derivedFinal) { + (*derivedFinal)->release (*derivedFinal); + } + for (; md; md=md->next) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); - + md->scene= scene; - + if ((md->mode & required_mode) != required_mode) continue; if (mti->isDisabled && mti->isDisabled(md, forRender)) continue; - if (mti->type!=eModifierTypeType_OnlyDeform && mti->type!=eModifierTypeType_DeformOrConstruct) continue; - /* need to put all verts in 1 block for curve deform */ - if(md->type==eModifierType_Curve) { - float *allverts, *fp; - int totvert= 0; - - for (dl=dispbase->first; dl; dl=dl->next) - totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr; - - fp= allverts= MEM_mallocN(totvert*sizeof(float)*3, "temp vert"); - for (dl=dispbase->first; dl; dl=dl->next) { - int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); - memcpy(fp, dl->verts, sizeof(float) * offs); - fp+= offs; + if (mti->type == eModifierTypeType_OnlyDeform || + (mti->type == eModifierTypeType_DeformOrConstruct && !dm)) { + if (dm) { + if (!vertCos) { + totvert = dm->getNumVerts(dm); + vertCos = MEM_mallocN(sizeof(*vertCos) * totvert, "dfmv"); + dm->getVertCos(dm, vertCos); + } + + mti->deformVerts(md, ob, dm, vertCos, totvert, forRender, editmode); + } else { + if (!vertCos) { + vertCos= displist_get_allverts(dispbase, &totvert); + } + + mti->deformVerts(md, ob, NULL, vertCos, totvert, forRender, editmode); } - - mti->deformVerts(md, ob, NULL, (float(*)[3]) allverts, totvert, forRender, editmode); - - fp= allverts; - for (dl=dispbase->first; dl; dl=dl->next) { - int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr); - memcpy(dl->verts, fp, sizeof(float) * offs); - fp+= offs; + } else { + if (!derivedFinal) { + /* makeDisplistCurveTypes could be used for beveling, where derived mesh */ + /* is totally unnecessary, so we could stop modifiers applying */ + /* when we found constructive modifier but derived mesh is unwanted result */ + break; } - MEM_freeN(allverts); - } - else { - for (dl=dispbase->first; dl; dl=dl->next) { - mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr, forRender, editmode); + + if (dm) { + if (vertCos) { + DerivedMesh *tdm = CDDM_copy(dm, 0); + dm->release(dm); + dm = tdm; + + CDDM_apply_vert_coords(dm, vertCos); + CDDM_calc_normals(dm); + } + } else { + if (vertCos) { + displist_apply_allverts(dispbase, vertCos); + } + + if (ELEM(ob->type, OB_CURVE, OB_FONT) && (cu->flag & CU_DEFORM_FILL)) { + curve_to_filledpoly(cu, nurb, dispbase); + } + + dm= CDDM_from_curve_customDB(ob, dispbase); + + CDDM_calc_normals(dm); + } + + if (vertCos) { + /* Vertex coordinates were applied to necessary data, could free it */ + MEM_freeN(vertCos); + vertCos= NULL; + } + + ndm = mti->applyModifier(md, ob, dm, forRender, editmode); + + if (ndm) { + /* Modifier returned a new derived mesh */ + + if (dm && dm != ndm) /* Modifier */ + dm->release (dm); + dm = ndm; } } } + if (vertCos) { + if (dm) { + DerivedMesh *tdm = CDDM_copy(dm, 0); + dm->release(dm); + dm = tdm; + + CDDM_apply_vert_coords(dm, vertCos); + CDDM_calc_normals(dm); + MEM_freeN(vertCos); + } else { + displist_apply_allverts(dispbase, vertCos); + MEM_freeN(vertCos); + vertCos= NULL; + } + } + + if (derivedFinal) { + (*derivedFinal) = dm; + } + if (deformedVerts) { curve_applyVertexCos(ob->data, nurb, originalVerts); MEM_freeN(originalVerts); @@ -1402,7 +1476,110 @@ static void displist_surf_indices(DispList *dl) } -void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRender, int forOrco) +static DerivedMesh *create_orco_dm(Scene *scene, Object *ob) +{ + DerivedMesh *dm; + ListBase disp= {NULL, NULL}; + + /* OrcoDM should be created from underformed disp lists */ + makeDispListCurveTypes_forOrco(scene, ob, &disp); + dm= CDDM_from_curve_customDB(ob, &disp); + + freedisplist(&disp); + + return dm; +} + +static void add_orco_dm(Scene *scene, Object *ob, DerivedMesh *dm, DerivedMesh *orcodm) +{ + float (*orco)[3], (*layerorco)[3]; + int totvert, a; + Curve *cu= ob->data; + + totvert= dm->getNumVerts(dm); + + if(orcodm) { + orco= MEM_callocN(sizeof(float)*3*totvert, "dm orco"); + + if(orcodm->getNumVerts(orcodm) == totvert) + orcodm->getVertCos(orcodm, orco); + else + dm->getVertCos(dm, orco); + } + else { + orco= (float(*)[3])make_orco_curve(scene, ob); + } + + for(a=0; a<totvert; a++) { + float *co = orco[a]; + co[0] = (co[0]-cu->loc[0])/cu->size[0]; + co[1] = (co[1]-cu->loc[1])/cu->size[1]; + co[2] = (co[2]-cu->loc[2])/cu->size[2]; + } + + if((layerorco = DM_get_vert_data_layer(dm, CD_ORCO))) { + memcpy(layerorco, orco, sizeof(float)*totvert); + MEM_freeN(orco); + } + else + DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco); +} + +static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFinal, int forRender) +{ + /* this function represents logic of mesh's orcodm calculation */ + /* for displist-based objects */ + + ModifierData *md = modifiers_getVirtualModifierList(ob); + ModifierData *preTesselatePoint; + Curve *cu= ob->data; + int required_mode; + int editmode = (!forRender && cu->editnurb); + DerivedMesh *ndm, *orcodm= NULL; + + if(forRender) required_mode = eModifierMode_Render; + else required_mode = eModifierMode_Realtime; + + preTesselatePoint = curve_get_tesselate_point(scene, ob, forRender, editmode); + + if(editmode) required_mode |= eModifierMode_Editmode; + + if (preTesselatePoint) { + md = preTesselatePoint->next; + } + + for (; md; md=md->next) { + ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + md->scene= scene; + + if ((md->mode & required_mode) != required_mode) continue; + if (mti->isDisabled && mti->isDisabled(md, forRender)) continue; + if (mti->type!=eModifierTypeType_Constructive) continue; + + if(!orcodm) + orcodm= create_orco_dm(scene, ob); + + ndm = mti->applyModifier(md, ob, orcodm, forRender, 0); + + if(ndm) { + /* if the modifier returned a new dm, release the old one */ + if(orcodm && orcodm != ndm) { + orcodm->release(orcodm); + } + orcodm = ndm; + } + } + + /* add an orco layer if needed */ + add_orco_dm(scene, ob, derivedFinal, orcodm); + + if(orcodm) + orcodm->release(orcodm); +} + +void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, + DerivedMesh **derivedFinal, int forRender, int forOrco) { ListBase *nubase; Nurb *nu; @@ -1426,22 +1603,25 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRende if(forRender || nu->hide==0) { if(nu->pntsv==1) { len= SEGMENTSU(nu)*nu->resolu; - + dl= MEM_callocN(sizeof(DispList), "makeDispListsurf"); dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts"); - + BLI_addtail(dispbase, dl); dl->parts= 1; dl->nr= len; dl->col= nu->mat_nr; dl->charidx= nu->charidx; - dl->rt= nu->flag; - + + /* dl->rt will be used as flag for render face and */ + /* CU_2D conflicts with R_NOPUNOFLIP */ + dl->rt= nu->flag & ~CU_2D; + data= dl->verts; - if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY; + if(nu->flagu & CU_NURB_CYCLIC) dl->type= DL_POLY; else dl->type= DL_SEGM; - - makeNurbcurve(nu, data, NULL, NULL, nu->resolu, 3*sizeof(float)); + + makeNurbcurve(nu, data, NULL, NULL, NULL, nu->resolu, 3*sizeof(float)); } else { len= (nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv); @@ -1452,15 +1632,18 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRende dl->col= nu->mat_nr; dl->charidx= nu->charidx; - dl->rt= nu->flag; - + + /* dl->rt will be used as flag for render face and */ + /* CU_2D conflicts with R_NOPUNOFLIP */ + dl->rt= nu->flag & ~CU_2D; + data= dl->verts; dl->type= DL_SURF; - + dl->parts= (nu->pntsu*nu->resolu); /* in reverse, because makeNurbfaces works that way */ dl->nr= (nu->pntsv*nu->resolv); - if(nu->flagv & CU_CYCLIC) dl->flag|= DL_CYCL_U; /* reverse too! */ - if(nu->flagu & CU_CYCLIC) dl->flag|= DL_CYCL_V; + if(nu->flagv & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_U; /* reverse too! */ + if(nu->flagu & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_V; makeNurbfaces(nu, data, 0); @@ -1475,23 +1658,20 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRende } if(!forOrco) - curve_calc_modifiers_post(scene, ob, dispbase, forRender, originalVerts, deformedVerts); + curve_calc_modifiers_post(scene, ob, dispbase, derivedFinal, + forRender, originalVerts, deformedVerts); } -void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) +static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispbase, + DerivedMesh **derivedFinal, int forRender, int forOrco) { Curve *cu = ob->data; - ListBase *dispbase; - + /* we do allow duplis... this is only displist on curve level */ if(!ELEM3(ob->type, OB_SURF, OB_CURVE, OB_FONT)) return; - freedisplist(&(ob->disp)); - dispbase= &(cu->disp); - freedisplist(dispbase); - if(ob->type==OB_SURF) { - makeDispListSurf(scene, ob, dispbase, 0, forOrco); + makeDispListSurf(scene, ob, dispbase, derivedFinal, forRender, forOrco); } else if (ELEM(ob->type, OB_CURVE, OB_FONT)) { ListBase dlbev; @@ -1500,24 +1680,33 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) float (*deformedVerts)[3]; int numVerts; + /* Bevel and taper objects should always be curves */ + if (cu->bevobj && cu->bevobj->type != OB_CURVE) { + cu->bevobj = NULL; + } + + if (cu->taperobj && cu->taperobj->type != OB_CURVE) { + cu->taperobj = NULL; + } + if(cu->editnurb) nubase= cu->editnurb; else nubase= &cu->nurb; - + BLI_freelistN(&(cu->bev)); - + if(cu->path) free_path(cu->path); cu->path= NULL; - + if(ob->type==OB_FONT) BKE_text_to_curve(scene, ob, 0); - - if(!forOrco) curve_calc_modifiers_pre(scene, ob, 0, &originalVerts, &deformedVerts, &numVerts); + + if(!forOrco) curve_calc_modifiers_pre(scene, ob, forRender, &originalVerts, &deformedVerts, &numVerts); makeBevelList(ob); /* If curve has no bevel will return nothing */ - makebevelcurve(scene, ob, &dlbev); + makebevelcurve(scene, ob, &dlbev, forRender); /* no bevel or extrude, and no width correction? */ if (!dlbev.first && cu->width==1.0f) { @@ -1532,26 +1721,29 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) float *fp1, *data; BevPoint *bevp; int a,b; - + if (bl->nr) { /* blank bevel lists can happen */ - + /* exception handling; curve without bevel or extrude, with width correction */ if(dlbev.first==NULL) { dl= MEM_callocN(sizeof(DispList), "makeDispListbev"); dl->verts= MEM_callocN(3*sizeof(float)*bl->nr, "dlverts"); BLI_addtail(dispbase, dl); - + if(bl->poly!= -1) dl->type= DL_POLY; else dl->type= DL_SEGM; - + if(dl->type==DL_SEGM) dl->flag = (DL_FRONT_CURVE|DL_BACK_CURVE); - + dl->parts= 1; dl->nr= bl->nr; dl->col= nu->mat_nr; dl->charidx= nu->charidx; - dl->rt= nu->flag; - + + /* dl->rt will be used as flag for render face and */ + /* CU_2D conflicts with R_NOPUNOFLIP */ + dl->rt= nu->flag & ~CU_2D; + a= dl->nr; bevp= (BevPoint *)(bl+1); data= dl->verts; @@ -1565,10 +1757,10 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) } else { DispList *dlb; - + for (dlb=dlbev.first; dlb; dlb=dlb->next) { - /* for each part of the bevel use a separate displblock */ + /* for each part of the bevel use a separate displblock */ dl= MEM_callocN(sizeof(DispList), "makeDispListbev1"); dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts"); BLI_addtail(dispbase, dl); @@ -1583,11 +1775,15 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) dl->nr= dlb->nr; dl->col= nu->mat_nr; dl->charidx= nu->charidx; - dl->rt= nu->flag; + + /* dl->rt will be used as flag for render face and */ + /* CU_2D conflicts with R_NOPUNOFLIP */ + dl->rt= nu->flag & ~CU_2D; + dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2"); bevp= (BevPoint *)(bl+1); - /* for each point of poly make a bevel piece */ + /* for each point of poly make a bevel piece */ bevp= (BevPoint *)(bl+1); for(a=0; a<bl->nr; a++,bevp++) { float fac=1.0; @@ -1597,7 +1793,7 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) } else { fac = calc_taper(scene, cu->taperobj, a, bl->nr); } - + if (bevp->split_tag) { dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F); } @@ -1611,9 +1807,9 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) vec[0]= fp1[1]+widfac; vec[1]= fp1[2]; vec[2]= 0.0; - + mul_qt_v3(bevp->quat, vec); - + data[0]= bevp->vec[0] + fac*vec[0]; data[1]= bevp->vec[1] + fac*vec[1]; data[2]= bevp->vec[2] + fac*vec[2]; @@ -1636,15 +1832,77 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) freedisplist(&dlbev); } - curve_to_filledpoly(cu, nubase, dispbase); + if (!(cu->flag & CU_DEFORM_FILL)) { + curve_to_filledpoly(cu, nubase, dispbase); + } if(cu->flag & CU_PATH) calc_curvepath(ob); - if(!forOrco) curve_calc_modifiers_post(scene, ob, &cu->disp, 0, originalVerts, deformedVerts); - tex_space_curve(cu); + if (!forRender) { + tex_space_curve(cu); + } + + if(!forOrco) curve_calc_modifiers_post(scene, ob, dispbase, derivedFinal, forRender, originalVerts, deformedVerts); + + if (cu->flag & CU_DEFORM_FILL && !ob->derivedFinal) { + curve_to_filledpoly(cu, nubase, dispbase); + } } - - boundbox_displist(ob); +} + +void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco) +{ + Curve *cu = ob->data; + ListBase *dispbase; + + freedisplist(&(ob->disp)); + dispbase= &(cu->disp); + freedisplist(dispbase); + + do_makeDispListCurveTypes(scene, ob, dispbase, &ob->derivedFinal, 0, forOrco); + + if (ob->derivedFinal) { + DM_set_object_boundbox (ob, ob->derivedFinal); + } else { + boundbox_displist (ob); + + /* if there is no derivedMesh, object's boundbox is unneeded */ + if (ob->bb) { + MEM_freeN(ob->bb); + ob->bb= NULL; + } + } +} + +void makeDispListCurveTypes_forRender(Scene *scene, Object *ob, ListBase *dispbase, + DerivedMesh **derivedFinal, int forOrco) +{ + do_makeDispListCurveTypes(scene, ob, dispbase, derivedFinal, 1, forOrco); +} + +void makeDispListCurveTypes_forOrco(struct Scene *scene, struct Object *ob, struct ListBase *dispbase) +{ + do_makeDispListCurveTypes(scene, ob, dispbase, NULL, 1, 1); +} + +/* add Orco layer to the displist object which has got derived mesh and return orco */ +float *makeOrcoDispList(Scene *scene, Object *ob, DerivedMesh *derivedFinal, int forRender) { + float *orco; + + if (derivedFinal == NULL) + derivedFinal= ob->derivedFinal; + + if (!derivedFinal->getVertDataArray(derivedFinal, CD_ORCO)) { + curve_calc_orcodm(scene, ob, derivedFinal, forRender); + } + + orco= derivedFinal->getVertDataArray(derivedFinal, CD_ORCO); + + if(orco) { + orco= MEM_dupallocN(orco); + } + + return orco; } void imagestodisplist(void) @@ -1667,7 +1925,7 @@ static void boundbox_displist(Object *ob) Curve *cu= ob->data; int doit= 0; - if(cu->bb==0) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox"); + if(cu->bb==0) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox"); bb= cu->bb; dl= cu->disp.first; diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c index 3063d42cbe5..168e0e566de 100644 --- a/source/blender/blenkernel/intern/editderivedbmesh.c +++ b/source/blender/blenkernel/intern/editderivedbmesh.c @@ -129,7 +129,7 @@ static void BMEdit_RecalcTesselation_intern(BMEditMesh *tm) BMIter iter, liter; BMFace *f; BMLoop *l; - int i = 0, j, a, b; + int i = 0, j; if (tm->looptris) MEM_freeN(tm->looptris); @@ -354,9 +354,9 @@ static void bmdm_recalc_lookups(EditDerivedBMesh *bmdm) if (bmdm->ehash) BLI_ghash_free(bmdm->ehash, NULL, NULL); if (bmdm->fhash) BLI_ghash_free(bmdm->fhash, NULL, NULL); - bmdm->vhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - bmdm->ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - bmdm->fhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + bmdm->vhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh derived"); + bmdm->ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh derived"); + bmdm->fhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh derived"); if (bmdm->vtable) MEM_freeN(bmdm->vtable); if (bmdm->etable) MEM_freeN(bmdm->etable); @@ -398,7 +398,7 @@ static void bmdm_recalc_lookups(EditDerivedBMesh *bmdm) static void bmDM_recalcTesselation(DerivedMesh *dm) { - EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm; + //EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm; //bmdm_recalc_lookups(bmdm); } @@ -1166,13 +1166,13 @@ static int bmvert_to_mvert(BMesh *bm, BMVert *ev, MVert *vert_r) if (CustomData_has_layer(&bm->vdata, CD_BWEIGHT)) { vert_r->bweight = (unsigned char) (BM_GetCDf(&bm->vdata, ev, CD_BWEIGHT)*255.0f); } + + return 1; } static void bmDM_getVert(DerivedMesh *dm, int index, MVert *vert_r) { BMVert *ev; - BMIter iter; - int i; if (index < 0 || index >= ((EditDerivedBMesh *)dm)->tv) { printf("error in bmDM_getVert.\n"); @@ -1188,9 +1188,6 @@ static void bmDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r) EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; BMesh *bm = ((EditDerivedBMesh *)dm)->tc->bm; BMEdge *e; - BMVert *ev, *v1, *v2; - BMIter iter; - int i; if (index < 0 || index >= ((EditDerivedBMesh *)dm)->te) { printf("error in bmDM_getEdge.\n"); @@ -1221,11 +1218,8 @@ static void bmDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r) static void bmDM_getTessFace(DerivedMesh *dm, int index, MFace *face_r) { EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->tc->bm; BMFace *ef; - BMIter iter; BMLoop **l; - int i; if (index < 0 || index >= ((EditDerivedBMesh *)dm)->tf) { printf("error in bmDM_getTessFace.\n"); diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index f8193a3a7b0..b1182cfcec3 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -222,7 +222,7 @@ static void precalculate_effector(EffectorCache *eff) makeDispListCurveTypes(eff->scene, eff->ob, 0); if(cu->path && cu->path->data) { - where_on_path(eff->ob, 0.0, eff->guide_loc, eff->guide_dir, NULL, &eff->guide_radius); + where_on_path(eff->ob, 0.0, eff->guide_loc, eff->guide_dir, NULL, &eff->guide_radius, NULL); mul_m4_v3(eff->ob->obmat, eff->guide_loc); mul_mat3_m4_v3(eff->ob->obmat, eff->guide_dir); } @@ -429,7 +429,7 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect return visibility; if(!colls) - colls = get_collider_cache(eff->scene, NULL); + colls = get_collider_cache(eff->scene, NULL, NULL); if(!colls) return visibility; @@ -576,10 +576,10 @@ int closest_point_on_surface(SurfaceModifierData *surmd, float *co, float *surfa MFace *mface = CDDM_get_tessface(surmd->dm, nearest.index); VECCOPY(surface_vel, surmd->v[mface->v1].co); - add_v3_v3v3(surface_vel, surface_vel, surmd->v[mface->v2].co); - add_v3_v3v3(surface_vel, surface_vel, surmd->v[mface->v3].co); + add_v3_v3(surface_vel, surmd->v[mface->v2].co); + add_v3_v3(surface_vel, surmd->v[mface->v3].co); if(mface->v4) - add_v3_v3v3(surface_vel, surface_vel, surmd->v[mface->v4].co); + add_v3_v3(surface_vel, surmd->v[mface->v4].co); mul_v3_fl(surface_vel, mface->v4 ? 0.25f : 0.333f); } @@ -600,7 +600,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin /* using velocity corrected location allows for easier sliding over effector surface */ copy_v3_v3(vec, point->vel); mul_v3_fl(vec, point->vel_to_frame); - add_v3_v3v3(vec, vec, point->loc); + add_v3_v3(vec, point->loc); ret = closest_point_on_surface(eff->surmd, vec, efd->loc, efd->nor, real_velocity ? efd->vel : NULL); @@ -777,10 +777,10 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP } if(eff->pd->flag & PFIELD_TEX_OBJECT) { - mul_mat3_m4_v3(eff->ob->obmat, tex_co); + mul_m4_v3(eff->ob->obmat, tex_co); } - hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL,NULL, 1, result); + hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL,NULL, 0, result); if(hasrgb && mode==PFIELD_TEX_RGB) { force[0] = (0.5f - result->tr) * strength; @@ -791,15 +791,15 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP strength/=nabla; tex_co[0] += nabla; - multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 1, result+1); + multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+1); tex_co[0] -= nabla; tex_co[1] += nabla; - multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 1, result+2); + multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+2); tex_co[1] -= nabla; tex_co[2] += nabla; - multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 1, result+3); + multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+3); if(mode == PFIELD_TEX_GRAD || !hasrgb) { /* if we dont have rgb fall back to grad */ force[0] = (result[0].tin - result[1].tin) * strength; @@ -827,7 +827,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP VECADDFAC(force, force, efd->nor, fac); } - add_v3_v3v3(total_force, total_force, force); + add_v3_v3(total_force, force); } void do_physical_effector(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, float *total_force) { @@ -874,7 +874,7 @@ void do_physical_effector(EffectorCache *eff, EffectorData *efd, EffectedPoint * mul_v3_fl(force, strength * efd->falloff); VECADDFAC(temp, temp, point->vel, -point->vel_to_sec); - add_v3_v3v3(force, force, temp); + add_v3_v3(force, temp); } break; case PFIELD_MAGNET: @@ -893,7 +893,7 @@ void do_physical_effector(EffectorCache *eff, EffectorData *efd, EffectedPoint * mul_v3_fl(force, -strength * efd->falloff); copy_v3_v3(temp, point->vel); mul_v3_fl(temp, -damp * 2.0f * (float)sqrt(fabs(strength)) * point->vel_to_sec); - add_v3_v3v3(force, force, temp); + add_v3_v3(force, temp); break; case PFIELD_CHARGE: mul_v3_fl(force, point->charge * strength * efd->falloff); @@ -950,20 +950,20 @@ void do_physical_effector(EffectorCache *eff, EffectorData *efd, EffectedPoint * if(pd->f_flow != 0.0f) { VECADDFAC(dave, dave, point->ave, -pd->f_flow * efd->falloff); } - add_v3_v3v3(point->ave, point->ave, dave); + add_v3_v3(point->ave, dave); } } /* -------- pdDoEffectors() -------- - generic force/speed system, now used for particles and softbodies - scene = scene where it runs in, for time and stuff + generic force/speed system, now used for particles and softbodies + scene = scene where it runs in, for time and stuff lb = listbase with objects that take part in effecting opco = global coord, as input - force = force accumulator - speed = actual current speed which can be altered + force = force accumulator + speed = actual current speed which can be altered cur_time = "external" time in frames, is constant for static particles loc_time = "local" time in frames, range <0-1> for the lifetime of particle - par_layer = layer the caller is in + par_layer = layer the caller is in flags = only used for softbody wind now guide = old speed of particle diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index cc42b0754a5..deae6d2808b 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -55,35 +55,26 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_material_types.h" -#include "DNA_lamp_types.h" #include "DNA_curve_types.h" -#include "DNA_image_types.h" #include "DNA_camera_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "BKE_utildefines.h" #include "BLI_blenlib.h" #include "BLI_math.h" -#include "BLI_editVert.h" #include "BKE_blender.h" #include "BKE_global.h" #include "BKE_main.h" #include "BKE_mesh.h" #include "BKE_library.h" -#include "BKE_global.h" #include "BKE_object.h" #include "BKE_material.h" -#include "BKE_exotic.h" #include "BKE_report.h" -#include "BKE_screen.h" #include "BKE_displist.h" #include "BKE_DerivedMesh.h" #include "BKE_curve.h" -#include "BKE_customdata.h" #ifndef DISABLE_PYTHON #include "BPY_extern.h" @@ -138,19 +129,19 @@ static int is_stl(char *str) #define READSTLVERT { \ if (fread(mvert->co, sizeof(float), 3, fpSTL) != 3) { \ - char error_msg[255]; \ - MEM_freeN(vertdata); \ - MEM_freeN(facedata); \ - fclose(fpSTL); \ - sprintf(error_msg, "Problems reading face %d!", i); \ - return; \ + char error_msg[255]; \ + MEM_freeN(vertdata); \ + MEM_freeN(facedata); \ + fclose(fpSTL); \ + sprintf(error_msg, "Problems reading face %d!", i); \ + return; \ } \ else { \ - if (ENDIAN_ORDER==B_ENDIAN) { \ - SWITCH_INT(mvert->co[0]); \ - SWITCH_INT(mvert->co[1]); \ - SWITCH_INT(mvert->co[2]); \ - } \ + if (ENDIAN_ORDER==B_ENDIAN) { \ + SWITCH_INT(mvert->co[0]); \ + SWITCH_INT(mvert->co[1]); \ + SWITCH_INT(mvert->co[2]); \ + } \ } \ } @@ -276,9 +267,9 @@ static void read_stl_mesh_binary(Scene *scene, char *str) me->totvert = totvert; me->totface = totface; me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, - vertdata, totvert); + vertdata, totvert); me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, - facedata, totface); + facedata, totface); mesh_add_normals_flags(me); make_edges(me, 0); @@ -419,9 +410,9 @@ static void read_stl_mesh_ascii(Scene *scene, char *str) me->totface = totface; me->totvert = totvert; me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, - NULL, totvert); + NULL, totvert); me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, - NULL, totface); + NULL, totface); /* Copy vert coords and create topology */ mvert = me->mvert; @@ -871,7 +862,7 @@ static void read_inventor(Scene *scene, char *str, struct ListBase *listb) /* count the nr of lines */ tot= 0; index= iv->data[0]; - lll = iv->datalen[0]-1; + lll = iv->datalen[0]-1; for(a=0; a<lll; a++) { if(index[0]!= -1 && index[1]!= -1) tot++; index++; @@ -1018,7 +1009,7 @@ static void read_inventor(Scene *scene, char *str, struct ListBase *listb) } /* indices */ - lll = index[0] - 2; + lll = index[0] - 2; for(b=0; b<lll; b++) { idata[0]= first; idata[1]= first+1; @@ -1054,7 +1045,7 @@ static void read_inventor(Scene *scene, char *str, struct ListBase *listb) /* count triangles */ face= 0; index= iv->data[0]; - lll = iv->datalen[0]-2; + lll = iv->datalen[0]-2; for(a=0; a<lll; a++) { if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) face++; index++; @@ -1132,7 +1123,7 @@ static void read_inventor(Scene *scene, char *str, struct ListBase *listb) /* count triangles */ face= 0; index= iv->data[0]; - lll=iv->datalen[0]-2; + lll=iv->datalen[0]-2; for(a=0; a<lll; a++) { if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) face++; index++; @@ -1164,7 +1155,7 @@ static void read_inventor(Scene *scene, char *str, struct ListBase *listb) index= iv->data[0]; idata= dl->index; - lll=iv->datalen[0]-2; + lll=iv->datalen[0]-2; for(a=lll; a>0; a--) { if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) { @@ -1485,9 +1476,9 @@ static void displist_to_mesh(Scene *scene, DispList *dlfirst) me->totvert= totvert; me->totface= totface; me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, - NULL, me->totvert); + NULL, me->totvert); me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, - NULL, me->totface); + NULL, me->totface); maxvertidx= totvert-1; mvert= me->mvert; @@ -1965,8 +1956,8 @@ void write_stl(Scene *scene, char *str) fseek(fpSTL, 80, SEEK_SET); if (ENDIAN_ORDER==B_ENDIAN) { - SWITCH_INT(numfacets); - } + SWITCH_INT(numfacets); + } fwrite(&numfacets, 4*sizeof(char), 1, fpSTL); fclose(fpSTL); @@ -2583,13 +2574,13 @@ void write_dxf(struct Scene *scene, char *str) /* The header part of the DXF */ write_group(0, "SECTION"); - write_group(2, "HEADER"); + write_group(2, "HEADER"); write_group(0, "ENDSEC"); /* The blocks part of the DXF */ write_group(0, "SECTION"); - write_group(2, "BLOCKS"); + write_group(2, "BLOCKS"); /* only write meshes we're using in this scene */ @@ -2613,7 +2604,7 @@ void write_dxf(struct Scene *scene, char *str) /* The entities part of the DXF */ write_group(0, "SECTION"); - write_group(2, "ENTITIES"); + write_group(2, "ENTITIES"); /* Write all the mesh objects */ base= scene->base.first; @@ -3065,7 +3056,7 @@ static void dxf_read_line(Scene *scene, int noob) { hasbumped=1; } - /* 2D Polyline state vars */ + /* 2D Polyline state vars */ static Object *p2dhold=NULL; static Mesh *p2dmhold=NULL; static char oldplay[32]; @@ -3140,35 +3131,35 @@ static void dxf_read_ellipse(Scene *scene, int noob) read_group(id, val); while(id!=0) { if (id==8) { - BLI_strncpy(layname, val, sizeof(layname)); + BLI_strncpy(layname, val, sizeof(layname)); } else if (id==10) { - center[0]= (float) atof(val); + center[0]= (float) atof(val); } else if (id==20) { - center[1]= (float) atof(val); + center[1]= (float) atof(val); } else if (id==30) { - center[2]= (float) atof(val); + center[2]= (float) atof(val); } else if (id==11) { - axis_endpoint[0]= (float) atof(val); + axis_endpoint[0]= (float) atof(val); } else if (id==21) { - axis_endpoint[1]= (float) atof(val); + axis_endpoint[1]= (float) atof(val); } else if (id==31) { - axis_endpoint[2]= (float) atof(val); + axis_endpoint[2]= (float) atof(val); } else if (id==40) { - axis_ratio = (float) atof(val); + axis_ratio = (float) atof(val); } else if (id==41) { printf("dxf: start = %f", atof(val) * 180/M_PI); - start_angle = -atof(val) + M_PI_2; + start_angle = -atof(val) + M_PI_2; } else if (id==42) { printf("dxf: end = %f", atof(val) * 180/M_PI); end_angle = -atof(val) + M_PI_2; } else if (id==62) { - int colorid= atoi(val); - CLAMP(colorid, 1, 255); - dxf_col_to_rgb(colorid, &color[0], &color[1], &color[2]); + int colorid= atoi(val); + CLAMP(colorid, 1, 255); + dxf_col_to_rgb(colorid, &color[0], &color[1], &color[2]); } else if (id==67) { - vspace= atoi(val); + vspace= atoi(val); } else if (id==100) { - isArc = 1; + isArc = 1; } else if (id==210) { extrusion[0] = atof(val); } else if (id==220) { @@ -3299,28 +3290,28 @@ static void dxf_read_arc(Scene *scene, int noob) read_group(id, val); while(id!=0) { if (id==8) { - BLI_strncpy(layname, val, sizeof(layname)); + BLI_strncpy(layname, val, sizeof(layname)); } else if (id==10) { - center[0]= (float) atof(val); + center[0]= (float) atof(val); } else if (id==20) { - center[1]= (float) atof(val); + center[1]= (float) atof(val); } else if (id==30) { - center[2]= (float) atof(val); + center[2]= (float) atof(val); } else if (id==40) { - dia = (float) atof(val); + dia = (float) atof(val); } else if (id==62) { - int colorid= atoi(val); + int colorid= atoi(val); - CLAMP(colorid, 1, 255); - dxf_col_to_rgb(colorid, &color[0], &color[1], &color[2]); + CLAMP(colorid, 1, 255); + dxf_col_to_rgb(colorid, &color[0], &color[1], &color[2]); } else if (id==67) { - vspace= atoi(val); + vspace= atoi(val); } else if (id==100) { - isArc = 1; + isArc = 1; } else if (id==50) { - start_angle = (90 - atoi(val)) * M_PI/180.0; + start_angle = (90 - atoi(val)) * M_PI/180.0; } else if (id==51) { - end_angle = (90 - atoi(val)) * M_PI/180.0; + end_angle = (90 - atoi(val)) * M_PI/180.0; } else if (id==210) { extrusion[0] = atof(val); } else if (id==220) { @@ -4080,7 +4071,7 @@ static void dxf_read(Scene *scene, char *filename) ob->dupon= 1; ob->dupoff= 0; ob->dupsta= 1; ob->dupend= 100; - ob->recalc= OB_RECALC; /* needed because of weird way of adding libdata directly */ + ob->recalc= OB_RECALC_ALL; /* needed because of weird way of adding libdata directly */ ob->data= obdata; ((ID*)ob->data)->us++; diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 807a723685a..43f01199b69 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -34,10 +34,6 @@ #include <string.h> #include <float.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" @@ -45,7 +41,6 @@ #include "BLI_blenlib.h" #include "BLI_math.h" -#include "BLI_noise.h" #include "BKE_fcurve.h" #include "BKE_animsys.h" @@ -53,12 +48,10 @@ #include "BKE_armature.h" #include "BKE_curve.h" #include "BKE_global.h" -#include "BKE_idprop.h" #include "BKE_object.h" #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_types.h" #ifndef DISABLE_PYTHON #include "BPY_extern.h" @@ -237,6 +230,27 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array return NULL; } +/* quick way to loop over all fcurves of a given 'path' */ +FCurve *iter_step_fcurve (FCurve *fcu_iter, const char rna_path[]) +{ + FCurve *fcu; + + /* sanity checks */ + if (ELEM(NULL, fcu_iter, rna_path)) + return NULL; + + /* check paths of curves, then array indices... */ + for (fcu= fcu_iter; fcu; fcu= fcu->next) { + /* simple string-compare (this assumes that they have the same root...) */ + if (fcu->rna_path && !strcmp(fcu->rna_path, rna_path)) { + return fcu; + } + } + + /* return */ + return NULL; +} + /* Get list of LinkData's containing pointers to the F-Curves which control the types of data indicated * Lists... * - dst: list of LinkData's matching the criteria returned. @@ -1404,7 +1418,7 @@ static float evaluate_driver (ChannelDriver *driver, float evaltime) /* this evaluates the expression using Python,and returns its result: * - on errors it reports, then returns 0.0f */ - driver->curval= BPY_pydriver_eval(driver); + driver->curval= BPY_eval_driver(driver); } #endif /* DISABLE_PYTHON*/ } diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c index 592119ce099..a0906a67be0 100644 --- a/source/blender/blenkernel/intern/fluidsim.c +++ b/source/blender/blenkernel/intern/fluidsim.c @@ -62,557 +62,14 @@ /* ************************* fluidsim bobj file handling **************************** */ -// ----------------------------------------- -// forward decleration -// ----------------------------------------- - -// ----------------------------------------- - -void fluidsim_init(FluidsimModifierData *fluidmd) -{ -#ifndef DISABLE_ELBEEM - if(fluidmd) - { - FluidsimSettings *fss = MEM_callocN(sizeof(FluidsimSettings), "fluidsimsettings"); - - fluidmd->fss = fss; - - if(!fss) - return; - - fss->fmd = fluidmd; - fss->type = OB_FLUIDSIM_ENABLE; - fss->show_advancedoptions = 0; - - fss->resolutionxyz = 65; - fss->previewresxyz = 45; - fss->realsize = 0.5; - fss->guiDisplayMode = 2; // preview - fss->renderDisplayMode = 3; // render - - fss->viscosityMode = 2; // default to water - fss->viscosityValue = 1.0; - fss->viscosityExponent = 6; - - // dg TODO: change this to [] - fss->gravx = 0.0; - fss->gravy = 0.0; - fss->gravz = -9.81; - fss->animStart = 0.0; - fss->animEnd = 4.0; - fss->gstar = 0.005; // used as normgstar - fss->maxRefine = -1; - // maxRefine is set according to resolutionxyz during bake - - // fluid/inflow settings - // fss->iniVel --> automatically set to 0 - - /* elubie: changed this to default to the same dir as the render output - to prevent saving to C:\ on Windows */ - BLI_strncpy(fss->surfdataPath, btempdir, FILE_MAX); - - // first init of bounding box - // no bounding box needed - - // todo - reuse default init from elbeem! - fss->typeFlags = OB_FSBND_PARTSLIP; - fss->domainNovecgen = 0; - fss->volumeInitType = 1; // volume - fss->partSlipValue = 0.2; - - fss->generateTracers = 0; - fss->generateParticles = 0.0; - fss->surfaceSmoothing = 1.0; - fss->surfaceSubdivs = 0.0; - fss->particleInfSize = 0.0; - fss->particleInfAlpha = 0.0; - - // init fluid control settings - fss->attractforceStrength = 0.2; - fss->attractforceRadius = 0.75; - fss->velocityforceStrength = 0.2; - fss->velocityforceRadius = 0.75; - fss->cpsTimeStart = fss->animStart; - fss->cpsTimeEnd = fss->animEnd; - fss->cpsQuality = 10.0; // 1.0 / 10.0 => means 0.1 width - - /* - BAD TODO: this is done in buttons_object.c in the moment - Mesh *mesh = ob->data; - // calculate bounding box - fluid_get_bb(mesh->mvert, mesh->totvert, ob->obmat, fss->bbStart, fss->bbSize); - */ - - // (ab)used to store velocities - fss->meshSurfNormals = NULL; - - fss->lastgoodframe = -1; - - fss->flag = 0; - - } -#endif - return; -} - -void fluidsim_free(FluidsimModifierData *fluidmd) -{ -#ifndef DISABLE_ELBEEM - if(fluidmd) - { - if(fluidmd->fss->meshSurfNormals) - { - MEM_freeN(fluidmd->fss->meshSurfNormals); - fluidmd->fss->meshSurfNormals = NULL; - } - MEM_freeN(fluidmd->fss); - } -#endif - return; -} - -DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc) -{ -#ifndef DISABLE_ELBEEM - DerivedMesh *result = NULL; - int framenr; - FluidsimSettings *fss = NULL; - - framenr= (int)scene->r.cfra; - - // only handle fluidsim domains - if(fluidmd && fluidmd->fss && (fluidmd->fss->type != OB_FLUIDSIM_DOMAIN)) - return dm; - - // sanity check - if(!fluidmd || (fluidmd && !fluidmd->fss)) - return dm; - - fss = fluidmd->fss; - - // timescale not supported yet - // clmd->sim_parms->timescale= timescale; - - // support reversing of baked fluid frames here - if((fss->flag & OB_FLUIDSIM_REVERSE) && (fss->lastgoodframe >= 0)) - { - framenr = fss->lastgoodframe - framenr + 1; - CLAMP(framenr, 1, fss->lastgoodframe); - } - - /* try to read from cache */ - if(((fss->lastgoodframe >= framenr) || (fss->lastgoodframe < 0)) && (result = fluidsim_read_cache(ob, dm, fluidmd, framenr, useRenderParams))) - { - // fss->lastgoodframe = framenr; // set also in src/fluidsim.c - return result; - } - else - { - // display last known good frame - if(fss->lastgoodframe >= 0) - { - if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams))) - { - return result; - } - - // it was supposed to be a valid frame but it isn't! - fss->lastgoodframe = framenr - 1; - - - // this could be likely the case when you load an old fluidsim - if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams))) - { - return result; - } - } - - result = CDDM_copy(dm, 0); - - if(result) - { - return result; - } - } - - return dm; -#else - return NULL; -#endif -} - -#ifndef DISABLE_ELBEEM -/* read .bobj.gz file into a fluidsimDerivedMesh struct */ -static DerivedMesh *fluidsim_read_obj(char *filename) -{ - int wri,i,j; - float wrf; - int gotBytes; - gzFile gzf; - int numverts = 0, numfaces = 0; - DerivedMesh *dm = NULL; - MFace *mface; - MVert *mvert; - short *normals; - - // ------------------------------------------------ - // get numverts + numfaces first - // ------------------------------------------------ - gzf = gzopen(filename, "rb"); - if (!gzf) - { - return NULL; - } - - // read numverts - gotBytes = gzread(gzf, &wri, sizeof(wri)); - numverts = wri; - - // skip verts - for(i=0; i<numverts*3; i++) - { - gotBytes = gzread(gzf, &wrf, sizeof( wrf )); - } - - // read number of normals - gotBytes = gzread(gzf, &wri, sizeof(wri)); - - // skip normals - for(i=0; i<numverts*3; i++) - { - gotBytes = gzread(gzf, &wrf, sizeof( wrf )); - } - - /* get no. of triangles */ - gotBytes = gzread(gzf, &wri, sizeof(wri)); - numfaces = wri; - - gzclose( gzf ); - // ------------------------------------------------ - - if(!numfaces || !numverts) - return NULL; - - gzf = gzopen(filename, "rb"); - if (!gzf) - { - return NULL; - } - - dm = CDDM_new(numverts, 0, numfaces, 0, 0); - - if(!dm) - { - gzclose( gzf ); - return NULL; - } - - // read numverts - gotBytes = gzread(gzf, &wri, sizeof(wri)); - - // read vertex position from file - mvert = CDDM_get_verts(dm); - for(i=0; i<numverts; i++) - { - MVert *mv = &mvert[i]; - - for(j=0; j<3; j++) - { - gotBytes = gzread(gzf, &wrf, sizeof( wrf )); - mv->co[j] = wrf; - } - } - - // should be the same as numverts - gotBytes = gzread(gzf, &wri, sizeof(wri)); - if(wri != numverts) - { - if(dm) - dm->release(dm); - gzclose( gzf ); - return NULL; - } - - normals = MEM_callocN(sizeof(short) * numverts * 3, "fluid_tmp_normals" ); - if(!normals) - { - if(dm) - dm->release(dm); - gzclose( gzf ); - return NULL; - } - - // read normals from file (but don't save them yet) - for(i=0; i<numverts*3; i++) - { - gotBytes = gzread(gzf, &wrf, sizeof( wrf )); - normals[i] = (short)(wrf*32767.0f); - } - - /* read no. of triangles */ - gotBytes = gzread(gzf, &wri, sizeof(wri)); - - if(wri!=numfaces) - printf("Fluidsim: error in reading data from file.\n"); - - // read triangles from file - mface = CDDM_get_tessfaces(dm); - for(i=0; i<numfaces; i++) - { - int face[4]; - MFace *mf = &mface[i]; - - gotBytes = gzread(gzf, &(face[0]), sizeof( face[0] )); - gotBytes = gzread(gzf, &(face[1]), sizeof( face[1] )); - gotBytes = gzread(gzf, &(face[2]), sizeof( face[2] )); - face[3] = 0; - - // check if 3rd vertex has index 0 (not allowed in blender) - if(face[2]) - { - mf->v1 = face[0]; - mf->v2 = face[1]; - mf->v3 = face[2]; - } - else - { - mf->v1 = face[1]; - mf->v2 = face[2]; - mf->v3 = face[0]; - } - mf->v4 = face[3]; - - test_index_face(mf, NULL, 0, 3); - } - - gzclose( gzf ); - - CDDM_calc_edges(dm); - - CDDM_apply_vert_normals(dm, (short (*)[3])normals); - MEM_freeN(normals); - - CDDM_tessfaces_to_faces(dm); - // CDDM_calc_normals(result); - - return dm; -} - -DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams) -{ - int displaymode = 0; - int curFrame = framenr - 1 /*scene->r.sfra*/; /* start with 0 at start frame */ - char targetDir[FILE_MAXFILE+FILE_MAXDIR], targetFile[FILE_MAXFILE+FILE_MAXDIR]; - FluidsimSettings *fss = fluidmd->fss; - DerivedMesh *dm = NULL; - MFace *mface; - int numfaces; - int mat_nr, flag, i; - - if(!useRenderParams) { - displaymode = fss->guiDisplayMode; - } else { - displaymode = fss->renderDisplayMode; - } - - strncpy(targetDir, fss->surfdataPath, FILE_MAXDIR); - - // use preview or final mesh? - if(displaymode==1) - { - // just display original object - return NULL; - } - else if(displaymode==2) - { - strcat(targetDir,"fluidsurface_preview_####"); - } - else - { // 3 - strcat(targetDir,"fluidsurface_final_####"); - } - - BLI_convertstringcode(targetDir, G.sce); - BLI_convertstringframe(targetDir, curFrame, 0); // fixed #frame-no - - strcpy(targetFile,targetDir); - strcat(targetFile, ".bobj.gz"); - - dm = fluidsim_read_obj(targetFile); - - if(!dm) - { - // switch, abort background rendering when fluidsim mesh is missing - const char *strEnvName2 = "BLENDER_ELBEEMBOBJABORT"; // from blendercall.cpp - - if(G.background==1) { - if(getenv(strEnvName2)) { - int elevel = atoi(getenv(strEnvName2)); - if(elevel>0) { - printf("Env. var %s set, fluid sim mesh '%s' not found, aborting render...\n",strEnvName2, targetFile); - exit(1); - } - } - } - - // display org. object upon failure which is in dm - return NULL; - } - - // assign material + flags to new dm - mface = orgdm->getTessFaceArray(orgdm); - mat_nr = mface[0].mat_nr; - flag = mface[0].flag; - - mface = dm->getTessFaceArray(dm); - numfaces = dm->getNumTessFaces(dm); - for(i=0; i<numfaces; i++) - { - mface[i].mat_nr = mat_nr; - mface[i].flag = flag; - } - - // load vertex velocities, if they exist... - // TODO? use generate flag as loading flag as well? - // warning, needs original .bobj.gz mesh loading filename - if(displaymode==3) - { - fluidsim_read_vel_cache(fluidmd, dm, targetFile); - } - else - { - if(fss->meshSurfNormals) - MEM_freeN(fss->meshSurfNormals); - - fss->meshSurfNormals = NULL; - } - - return dm; -} - - -/* read zipped fluidsim velocities into the co's of the fluidsimsettings normals struct */ -void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename) -{ - int wri, i, j; - float wrf; - gzFile gzf; - FluidsimSettings *fss = fluidmd->fss; - int len = strlen(filename); - int totvert = dm->getNumVerts(dm); - float *velarray = NULL; - - // mesh and vverts have to be valid from loading... - - if(fss->meshSurfNormals) - MEM_freeN(fss->meshSurfNormals); - - if(len<7) - { - return; - } - - if(fss->domainNovecgen>0) return; - - // abusing pointer to hold an array of 3d-velocities - fss->meshSurfNormals = MEM_callocN(sizeof(float)*3*dm->getNumVerts(dm), "Fluidsim_velocities"); - // abusing pointer to hold an INT - fss->meshSurface = SET_INT_IN_POINTER(totvert); - - velarray = (float *)fss->meshSurfNormals; - - // .bobj.gz , correct filename - // 87654321 - filename[len-6] = 'v'; - filename[len-5] = 'e'; - filename[len-4] = 'l'; - - gzf = gzopen(filename, "rb"); - if (!gzf) - { - MEM_freeN(fss->meshSurfNormals); - fss->meshSurfNormals = NULL; - return; - } - - gzread(gzf, &wri, sizeof( wri )); - if(wri != totvert) - { - MEM_freeN(fss->meshSurfNormals); - fss->meshSurfNormals = NULL; - return; - } - - for(i=0; i<totvert;i++) - { - for(j=0; j<3; j++) - { - gzread(gzf, &wrf, sizeof( wrf )); - velarray[3*i + j] = wrf; - } - } - - gzclose(gzf); -} - -void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4], - /*RET*/ float start[3], /*RET*/ float size[3] ) -{ - float bbsx=0.0, bbsy=0.0, bbsz=0.0; - float bbex=1.0, bbey=1.0, bbez=1.0; - int i; - float vec[3]; - - if(totvert == 0) { - zero_v3(start); - zero_v3(size); - return; - } - - VECCOPY(vec, mvert[0].co); - mul_m4_v3(obmat, vec); - bbsx = vec[0]; bbsy = vec[1]; bbsz = vec[2]; - bbex = vec[0]; bbey = vec[1]; bbez = vec[2]; - - for(i = 1; i < totvert; i++) { - VECCOPY(vec, mvert[i].co); - mul_m4_v3(obmat, vec); - - if(vec[0] < bbsx){ bbsx= vec[0]; } - if(vec[1] < bbsy){ bbsy= vec[1]; } - if(vec[2] < bbsz){ bbsz= vec[2]; } - if(vec[0] > bbex){ bbex= vec[0]; } - if(vec[1] > bbey){ bbey= vec[1]; } - if(vec[2] > bbez){ bbez= vec[2]; } - } - - // return values... - if(start) { - start[0] = bbsx; - start[1] = bbsy; - start[2] = bbsz; - } - if(size) { - size[0] = bbex-bbsx; - size[1] = bbey-bbsy; - size[2] = bbez-bbsz; - } -} - -//------------------------------------------------------------------------------- -// old interface -//------------------------------------------------------------------------------- - - - //------------------------------------------------------------------------------- // file handling //------------------------------------------------------------------------------- -void initElbeemMesh(struct Scene *scene, struct Object *ob, - int *numVertices, float **vertices, - int *numTriangles, int **triangles, - int useGlobalCoords, int modifierIndex) +void initElbeemMesh(struct Scene *scene, struct Object *ob, + int *numVertices, float **vertices, + int *numTriangles, int **triangles, + int useGlobalCoords, int modifierIndex) { DerivedMesh *dm = NULL; MVert *mvert; @@ -651,14 +108,14 @@ void initElbeemMesh(struct Scene *scene, struct Object *ob, face[2] = mface[i].v3; face[3] = mface[i].v4; - tris[countTris*3+0] = face[0]; - tris[countTris*3+1] = face[1]; - tris[countTris*3+2] = face[2]; + tris[countTris*3+0] = face[0]; + tris[countTris*3+1] = face[1]; + tris[countTris*3+2] = face[2]; countTris++; - if(face[3]) { - tris[countTris*3+0] = face[0]; - tris[countTris*3+1] = face[2]; - tris[countTris*3+2] = face[3]; + if(face[3]) { + tris[countTris*3+0] = face[0]; + tris[countTris*3+1] = face[2]; + tris[countTris*3+2] = face[3]; countTris++; } } @@ -666,21 +123,3 @@ void initElbeemMesh(struct Scene *scene, struct Object *ob, dm->release(dm); } - -void fluid_estimate_memory(Object *ob, FluidsimSettings *fss, char *value) -{ - Mesh *mesh; - - value[0]= '\0'; - - if(ob->type == OB_MESH) { - /* use mesh bounding box and object scaling */ - mesh= ob->data; - - fluid_get_bb(mesh->mvert, mesh->totvert, ob->obmat, fss->bbStart, fss->bbSize); - elbeemEstimateMemreq(fss->resolutionxyz, fss->bbSize[0],fss->bbSize[1],fss->bbSize[2], fss->maxRefine, value); - } -} - -#endif // DISABLE_ELBEEM - diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index cee6d59488f..5829d462011 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -32,29 +32,19 @@ #include <string.h> #include <float.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" #include "BLI_blenlib.h" -#include "BLI_math.h" -#include "BLI_noise.h" +#include "BLI_math.h" /* windows needs for M_PI */ #include "BKE_fcurve.h" -#include "BKE_curve.h" -#include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_utildefines.h" -#include "RNA_access.h" -#include "RNA_types.h" - #ifndef DISABLE_PYTHON -#include "BPY_extern.h" /* for BPY_pydriver_eval() */ +#include "BPY_extern.h" /* for BPY_eval_driver() */ #endif #define SMALL -1.0e-10 @@ -311,10 +301,10 @@ static void fcm_fn_generator_new_data (void *mdata) */ static double sinc (double x) { - if (fabs(x) < 0.0001) - return 1.0; - else - return sin(M_PI * x) / (M_PI * x); + if (fabs(x) < 0.0001) + return 1.0; + else + return sin(M_PI * x) / (M_PI * x); } static void fcm_fn_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime) @@ -871,6 +861,59 @@ static FModifierTypeInfo FMI_LIMITS = { fcm_limits_evaluate /* evaluate */ }; +/* Stepped F-Curve Modifier --------------------------- */ + +static void fcm_stepped_new_data (void *mdata) +{ + FMod_Stepped *data= (FMod_Stepped *)mdata; + + /* just need to set the step-size to 2-frames by default */ + // XXX: or would 5 be more normal? + data->step_size = 2.0f; +} + +static float fcm_stepped_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime) +{ + FMod_Stepped *data= (FMod_Stepped *)fcm->data; + int snapblock; + + /* check range clamping to see if we should alter the timing to achieve the desired results */ + if (data->flag & FCM_STEPPED_NO_BEFORE) { + if (evaltime < data->start_frame) + return evaltime; + } + if (data->flag & FCM_STEPPED_NO_AFTER) { + if (evaltime > data->end_frame) + return evaltime; + } + + /* we snap to the start of the previous closest block of 'step_size' frames + * after the start offset has been discarded + * - i.e. round down + */ + snapblock = (int)((evaltime - data->offset) / data->step_size); + + /* reapply the offset, and multiple the snapblock by the size of the steps to get + * the new time to evaluate at + */ + return ((float)snapblock * data->step_size) + data->offset; +} + +static FModifierTypeInfo FMI_STEPPED = { + FMODIFIER_TYPE_STEPPED, /* type */ + sizeof(FMod_Limits), /* size */ + FMI_TYPE_GENERATE_CURVE, /* action type */ /* XXX... err... */ + FMI_REQUIRES_RUNTIME_CHECK, /* requirements */ + "Stepped", /* name */ + "FMod_Stepped", /* struct name */ + NULL, /* free data */ + NULL, /* copy data */ + fcm_stepped_new_data, /* new data */ + NULL, /* verify */ + fcm_stepped_time, /* evaluate time */ + NULL /* evaluate */ +}; + /* F-Curve Modifier API --------------------------- */ /* All of the F-Curve Modifier api functions use FModifierTypeInfo structs to carry out * and operations that involve F-Curve modifier specific code. @@ -892,6 +935,7 @@ static void fmods_init_typeinfo () fmodifiersTypeInfo[6]= NULL/*&FMI_FILTER*/; /* Filter F-Curve Modifier */ // XXX unimplemented fmodifiersTypeInfo[7]= &FMI_PYTHON; /* Custom Python F-Curve Modifier */ fmodifiersTypeInfo[8]= &FMI_LIMITS; /* Limits F-Curve Modifier */ + fmodifiersTypeInfo[9]= &FMI_STEPPED; /* Stepped F-Curve Modifier */ } /* This function should be used for getting the appropriate type-info when only @@ -968,6 +1012,31 @@ FModifier *add_fmodifier (ListBase *modifiers, int type) return fcm; } +/* Make a copy of the specified F-Modifier */ +FModifier *copy_fmodifier (FModifier *src) +{ + FModifierTypeInfo *fmi= fmodifier_get_typeinfo(src); + FModifier *dst; + + /* sanity check */ + if (src == NULL) + return NULL; + + /* copy the base data, clearing the links */ + dst = MEM_dupallocN(src); + dst->next = dst->prev = NULL; + + /* make a new copy of the F-Modifier's data */ + dst->data = MEM_dupallocN(src->data); + + /* only do specific constraints if required */ + if (fmi && fmi->copy_data) + fmi->copy_data(dst, src); + + /* return the new modifier */ + return dst; +} + /* Duplicate all of the F-Modifiers in the Modifier stacks */ void copy_fmodifiers (ListBase *dst, ListBase *src) { @@ -1132,14 +1201,20 @@ short list_has_suitable_fmodifier (ListBase *modifiers, int mtype, short acttype float evaluate_time_fmodifiers (ListBase *modifiers, FCurve *fcu, float cvalue, float evaltime) { FModifier *fcm; - float m_evaltime= evaltime; /* sanity checks */ if ELEM(NULL, modifiers, modifiers->last) return evaltime; - /* find the first modifier from end of stack that modifies time, and calculate the time the modifier - * would calculate time at + /* Starting from the end of the stack, calculate the time effects of various stacked modifiers + * on the time the F-Curve should be evaluated at. + * + * This is done in reverse order to standard evaluation, as when this is done in standard + * order, each modifier would cause jumps to other points in the curve, forcing all + * previous ones to be evaluated again for them to be correct. However, if we did in the + * reverse order as we have here, we can consider them a macro to micro type of waterfall + * effect, which should get us the desired effects when using layered time manipulations + * (such as multiple 'stepped' modifiers in sequence, causing different stepping rates) */ for (fcm= modifiers->last; fcm; fcm= fcm->prev) { FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm); @@ -1148,13 +1223,12 @@ float evaluate_time_fmodifiers (ListBase *modifiers, FCurve *fcu, float cvalue, // TODO: implement the 'influence' control feature... if (fmi && fmi->evaluate_modifier_time) { if ((fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED)) == 0) - m_evaltime= fmi->evaluate_modifier_time(fcu, fcm, cvalue, evaltime); - break; + evaltime= fmi->evaluate_modifier_time(fcu, fcm, cvalue, evaltime); } } /* return the modified evaltime */ - return m_evaltime; + return evaltime; } /* Evalautes the given set of F-Curve Modifiers using the given data diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 36bb031744e..a99f2599f66 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -1,4 +1,4 @@ -/* font.c +/* font.c * * * $Id$ @@ -34,10 +34,7 @@ #include <math.h> #include <stdlib.h> #include <wchar.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif +#include <wctype.h> #include "MEM_guardedalloc.h" @@ -47,8 +44,6 @@ #include "DNA_packedFile_types.h" #include "DNA_curve_types.h" -#include "DNA_object_types.h" -#include "DNA_view3d_types.h" #include "DNA_vfont_types.h" #include "DNA_scene_types.h" @@ -60,7 +55,6 @@ #include "BKE_font.h" #include "BKE_global.h" #include "BKE_main.h" -#include "BKE_screen.h" #include "BKE_anim.h" #include "BKE_curve.h" #include "BKE_displist.h" @@ -163,7 +157,7 @@ According to RFC 3629 "UTF-8, a transformation format of ISO 10646" (http://tools.ietf.org/html/rfc3629), the valid UTF-8 encoding are: Char. number range | UTF-8 octet sequence - (hexadecimal) | (binary) + (hexadecimal) | (binary) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx @@ -205,7 +199,7 @@ int utf8towchar(wchar_t *w, char *c) *w = '?'; } } else - *w=(c[0] & 0x7f); + *w=(c[0] & 0x7f); c++; w++; @@ -433,12 +427,12 @@ VFont *load_vfont(char *name) static VFont *which_vfont(Curve *cu, CharInfo *info) { - switch(info->flag & CU_STYLE) { - case CU_BOLD: + switch(info->flag & (CU_CHINFO_BOLD|CU_CHINFO_ITALIC)) { + case CU_CHINFO_BOLD: if (cu->vfontb) return(cu->vfontb); else return(cu->vfont); - case CU_ITALIC: + case CU_CHINFO_ITALIC: if (cu->vfonti) return(cu->vfonti); else return(cu->vfont); - case (CU_BOLD|CU_ITALIC): + case (CU_CHINFO_BOLD|CU_CHINFO_ITALIC): if (cu->vfontbi) return(cu->vfontbi); else return(cu->vfont); default: return(cu->vfont); @@ -456,6 +450,17 @@ VFont *get_builtin_font(void) return load_vfont("<builtin>"); } +static VChar *find_vfont_char(VFontData *vfd, intptr_t character) +{ + VChar *che= NULL; + + for(che = vfd->characters.first; che; che = che->next) { + if(che->index == character) + break; + } + return che; /* NULL if not found */ +} + static void build_underline(Curve *cu, float x1, float y1, float x2, float y2, int charidx, short mat_nr) { Nurb *nu2; @@ -473,7 +478,7 @@ static void build_underline(Curve *cu, float x1, float y1, float x2, float y2, i nu2->pntsv = 1; nu2->orderu = 4; nu2->orderv = 1; - nu2->flagu = CU_CYCLIC; + nu2->flagu = CU_NURB_CYCLIC; bp = (BPoint*)MEM_callocN(4 * sizeof(BPoint),"underline_bp"); if (bp == 0){ @@ -530,14 +535,7 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float si= (float)sin(rot); co= (float)cos(rot); - // Find the correct character from the font - che = vfd->characters.first; - while(che) - { - if(che->index == character) - break; - che = che->next; - } + che= find_vfont_char(vfd, character); // Select the glyph data if(che) @@ -604,9 +602,23 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float } bezt2 = nu2->bezt; + if(info->flag & CU_CHINFO_SMALLCAPS_CHECK) { + const float sca= cu->smallcaps_scale; + for (i= nu2->pntsu; i > 0; i--) { + fp= bezt2->vec[0]; + fp[0] *= sca; + fp[1] *= sca; + fp[3] *= sca; + fp[4] *= sca; + fp[6] *= sca; + fp[7] *= sca; + bezt2++; + } + } + bezt2 = nu2->bezt; + for (i= nu2->pntsu; i > 0; i--) { fp= bezt2->vec[0]; - fp[0]= (fp[0]+ofsx)*fsize; fp[1]= (fp[1]+ofsy)*fsize; fp[3]= (fp[3]+ofsx)*fsize; @@ -642,6 +654,20 @@ int BKE_font_getselection(Object *ob, int *start, int *end) } } +static float char_width(Curve *cu, VChar *che, CharInfo *info) +{ + // The character wasn't found, propably ascii = 0, then the width shall be 0 as well + if(che == NULL) { + return 0.0f; + } + else if(info->flag & CU_CHINFO_SMALLCAPS_CHECK) { + return che->width * cu->smallcaps_scale; + } + else { + return che->width; + } +} + struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) { VFont *vfont, *oldvfont; @@ -723,7 +749,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) oldvfont = NULL; - for (i=0; i<slen; i++) custrinfo[i].flag &= ~CU_WRAP; + for (i=0; i<slen; i++) custrinfo[i].flag &= ~(CU_CHINFO_WRAP|CU_CHINFO_SMALLCAPS_CHECK); if (cu->selboxes) MEM_freeN(cu->selboxes); cu->selboxes = NULL; @@ -736,18 +762,21 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) makebreak: // Characters in the list che = vfd->characters.first; - ascii = mem[i]; info = &(custrinfo[i]); + ascii = mem[i]; + if(info->flag & CU_CHINFO_SMALLCAPS) { + ascii = towupper(ascii); + if(mem[i] != ascii) { + mem[i]= ascii; + info->flag |= CU_CHINFO_SMALLCAPS_CHECK; + } + } + vfont = which_vfont(cu, info); if(vfont==NULL) break; - - // Find the character - while(che) { - if(che->index == ascii) - break; - che = che->next; - } + + che= find_vfont_char(vfd, ascii); /* * The character wasn't in the current curve base so load it @@ -759,12 +788,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) } /* Try getting the character again from the list */ - che = vfd->characters.first; - while(che) { - if(che->index == ascii) - break; - che = che->next; - } + che= find_vfont_char(vfd, ascii); /* No VFont found */ if (vfont==0) { @@ -787,11 +811,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) return 0; } - // The character wasn't found, propably ascii = 0, then the width shall be 0 as well - if(!che) - twidth = 0; - else - twidth = che->width; + twidth = char_width(cu, che, info); // Calculate positions if((tb->w != 0.0) && (ct->dobreak==0) && ((xof-(tb->x/cu->fsize)+twidth)*cu->fsize) > tb->w) { @@ -805,13 +825,13 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) i = j-1; xof = ct->xof; ct[1].dobreak = 1; - custrinfo[i+1].flag |= CU_WRAP; + custrinfo[i+1].flag |= CU_CHINFO_WRAP; goto makebreak; } if (chartransdata[j].dobreak) { // fprintf(stderr, "word too long: %c%c%c...\n", mem[j], mem[j+1], mem[j+2]); ct->dobreak= 1; - custrinfo[i+1].flag |= CU_WRAP; + custrinfo[i+1].flag |= CU_CHINFO_WRAP; ct -= 1; cnr -= 1; i--; @@ -835,8 +855,8 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) linedata4[lnr]= wsnr; if ( (tb->h != 0.0) && - ((-(yof-(tb->y/cu->fsize))) > ((tb->h/cu->fsize)-(linedist*cu->fsize))) && - (cu->totbox > (curbox+1)) ) { + ((-(yof-(tb->y/cu->fsize))) > ((tb->h/cu->fsize)-(linedist*cu->fsize))) && + (cu->totbox > (curbox+1)) ) { maxlen= 0; tb++; curbox++; @@ -888,10 +908,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) else wsfac = 1.0; // Set the width of the character - if(!che) - twidth = 0; - else - twidth = che->width; + twidth = char_width(cu, che, info); xof += (twidth*wsfac*(1.0+(info->kern/40.0)) ) + xtrax; @@ -930,13 +947,13 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) ct++; } } else if((cu->spacemode==CU_FLUSH) && - (cu->tb[0].w != 0.0)) { + (cu->tb[0].w != 0.0)) { for(i=0;i<lnr;i++) if(linedata2[i]>1) linedata[i]= (linedata3[i]-linedata[i])/(linedata2[i]-1); for (i=0; i<=slen; i++) { for (j=i; (mem[j]) && (mem[j]!='\n') && - (mem[j]!='\r') && (chartransdata[j].dobreak==0) && (j<slen); j++); + (mem[j]!='\r') && (chartransdata[j].dobreak==0) && (j<slen); j++); // if ((mem[j]!='\r') && (mem[j]!='\n') && (mem[j])) { ct->xof+= ct->charnr*linedata[ct->linenr]; // } @@ -947,10 +964,10 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) float curofs= 0.0f; for (i=0; i<=slen; i++) { for (j=i; (mem[j]) && (mem[j]!='\n') && - (mem[j]!='\r') && (chartransdata[j].dobreak==0) && (j<slen); j++); + (mem[j]!='\r') && (chartransdata[j].dobreak==0) && (j<slen); j++); if ((mem[j]!='\r') && (mem[j]!='\n') && - ((chartransdata[j].dobreak!=0))) { - if (mem[i]==' ') curofs += (linedata3[ct->linenr]-linedata[ct->linenr])/linedata4[ct->linenr]; + ((chartransdata[j].dobreak!=0))) { + if (mem[i]==' ') curofs += (linedata3[ct->linenr]-linedata[ct->linenr])/linedata4[ct->linenr]; ct->xof+= curofs; } if (mem[i]=='\n' || mem[i]=='\r' || chartransdata[i].dobreak) curofs= 0; @@ -960,7 +977,8 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) } /* TEXT ON CURVE */ - if(cu->textoncurve) { + /* Note: Only OB_CURVE objects could have a path */ + if(cu->textoncurve && cu->textoncurve->type==OB_CURVE) { Curve *cucu= cu->textoncurve->data; int oldflag= cucu->flag; @@ -1021,19 +1039,10 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) /* rotate around center character */ ascii = mem[i]; - - // Find the character - che = vfd->characters.first; - while(che) { - if(che->index == ascii) - break; - che = che->next; - } + + che= find_vfont_char(vfd, ascii); - if(che) - twidth = che->width; - else - twidth = 0; + twidth = char_width(cu, che, info); dtime= distfac*0.35f*twidth; /* why not 0.5? */ dtime= distfac*0.5f*twidth; /* why not 0.5? */ @@ -1043,8 +1052,8 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) /* calc the right loc AND the right rot separately */ /* vec, tvec need 4 items */ - where_on_path(cu->textoncurve, ctime, vec, tvec, NULL, NULL); - where_on_path(cu->textoncurve, ctime+dtime, tvec, rotvec, NULL, NULL); + where_on_path(cu->textoncurve, ctime, vec, tvec, NULL, NULL, NULL); + where_on_path(cu->textoncurve, ctime+dtime, tvec, rotvec, NULL, NULL, NULL); mul_v3_fl(vec, sizefac); @@ -1157,24 +1166,19 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) if(cha != '\n' && cha != '\r') buildchar(cu, cha, info, ct->xof, ct->yof, ct->rot, i); - if ((info->flag & CU_UNDERLINE) && (cu->textoncurve == NULL) && (cha != '\n') && (cha != '\r')) { + if ((info->flag & CU_CHINFO_UNDERLINE) && (cu->textoncurve == NULL) && (cha != '\n') && (cha != '\r')) { float ulwidth, uloverlap= 0.0f; if ( (i<(slen-1)) && (mem[i+1] != '\n') && (mem[i+1] != '\r') && - ((mem[i+1] != ' ') || (custrinfo[i+1].flag & CU_UNDERLINE)) && ((custrinfo[i+1].flag & CU_WRAP)==0) + ((mem[i+1] != ' ') || (custrinfo[i+1].flag & CU_CHINFO_UNDERLINE)) && ((custrinfo[i+1].flag & CU_CHINFO_WRAP)==0) ) { uloverlap = xtrax + 0.1; } // Find the character, the characters has to be in the memory already // since character checking has been done earlier already. - che = vfd->characters.first; - while(che) { - if(che->index == cha) - break; - che = che->next; - } - - if(!che) twidth =0; else twidth=che->width; + che= find_vfont_char(vfd, cha); + + twidth = char_width(cu, che, info); ulwidth = cu->fsize * ((twidth* (1.0+(info->kern/40.0)))+uloverlap); build_underline(cu, ct->xof*cu->fsize, ct->yof*cu->fsize + (cu->ulpos-0.05)*cu->fsize, ct->xof*cu->fsize + ulwidth, diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index c65961d0953..5612d69ed76 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -33,27 +33,13 @@ #include "MEM_guardedalloc.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" -#include "BLI_math.h" #include "BLI_blenlib.h" -#include "DNA_listBase.h" #include "DNA_gpencil_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_vec_types.h" -#include "BKE_blender.h" -#include "BKE_context.h" -#include "BKE_curve.h" #include "BKE_global.h" #include "BKE_gpencil.h" -#include "BKE_image.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_utildefines.h" diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c index 4f768bbad23..6377a6f6ccd 100644 --- a/source/blender/blenkernel/intern/group.c +++ b/source/blender/blenkernel/intern/group.c @@ -29,14 +29,11 @@ #include <stdio.h> #include <string.h> +#include <math.h> #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" -#include "DNA_effect_types.h" #include "DNA_group_types.h" -#include "DNA_ID.h" -#include "DNA_ipo_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" #include "DNA_nla_types.h" @@ -47,16 +44,11 @@ #include "BKE_global.h" #include "BKE_group.h" -#include "BKE_ipo.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_object.h" #include "BKE_scene.h" /* object_in_scene */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - static void free_group_object(GroupObject *go) { MEM_freeN(go); @@ -288,6 +280,7 @@ int group_is_animated(Object *parent, Group *group) return 0; } +#if 0 // add back when timeoffset & animsys work again /* only replaces object strips or action when parent nla instructs it */ /* keep checking nla.c though, in case internal structure of strip changes */ static void group_replaces_nla(Object *parent, Object *target, char mode) @@ -327,6 +320,7 @@ static void group_replaces_nla(Object *parent, Object *target, char mode) } } } +#endif /* puts all group members in local timing system, after this call you can draw everything, leaves tags in objects to signal it needs further updating */ @@ -336,13 +330,18 @@ void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group) { GroupObject *go; +#if 0 /* warning, isnt clearing the recalc flag on the object which causes it to run all the time, + * not just on frame change. + * This isnt working because the animation data is only re-evalyated on frame change so commenting for now + * but when its enabled at some point it will need to be changed so as not to update so much - campbell */ + /* if animated group... */ if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first) { int cfrao; /* switch to local time */ cfrao= scene->r.cfra; - scene->r.cfra -= (int)give_timeoffset(parent); + scene->r.cfra -= (int)floor(give_timeoffset(parent) + 0.5f); /* we need a DAG per group... */ for(go= group->gobject.first; go; go= go->next) { @@ -361,7 +360,9 @@ void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group) /* restore */ scene->r.cfra= cfrao; } - else { + else +#endif + { /* only do existing tags, as set by regular depsgraph */ for(go= group->gobject.first; go; go= go->next) { if(go->ob) { diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c index 1f22e8c1e3f..ad2c857be75 100644 --- a/source/blender/blenkernel/intern/icons.c +++ b/source/blender/blenkernel/intern/icons.c @@ -32,23 +32,17 @@ #include <stdlib.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" -#include "DNA_ID.h" -#include "DNA_image_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" #include "DNA_texture_types.h" #include "DNA_world_types.h" +#include "DNA_brush_types.h" #include "BLI_ghash.h" #include "BKE_icons.h" -#include "BKE_utildefines.h" #include "BKE_global.h" /* only for G.background test */ #include "BLO_sys_types.h" // for intptr_t support @@ -108,7 +102,7 @@ void BKE_icons_init(int first_dyn_id) gFirstIconId = first_dyn_id; if (!gIcons) - gIcons = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); + gIcons = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "icons_init gh"); } void BKE_icons_free() @@ -127,6 +121,7 @@ struct PreviewImage* BKE_previewimg_create() for (i=0; i<PREVIEW_MIPMAPS; ++i) { prv_img->changed[i] = 1; + prv_img->changed_timestamp[i] = 0; } return prv_img; } @@ -209,7 +204,7 @@ PreviewImage* BKE_previewimg_get(ID *id) Image *img = (Image*)id; if (!img->preview) img->preview = BKE_previewimg_create(); prv_img = img->preview; - } + } return prv_img; } @@ -231,6 +226,7 @@ void BKE_icon_changed(int id) int i; for (i=0; i<PREVIEW_MIPMAPS; ++i) { prv->changed[i] = 1; + prv->changed_timestamp[i]++; } } } diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c index 37aee8fb4aa..2ccb33b088a 100644 --- a/source/blender/blenkernel/intern/idprop.c +++ b/source/blender/blenkernel/intern/idprop.c @@ -1,5 +1,5 @@ /** - * $Id: idprop.c + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,13 +29,8 @@ #include <stdlib.h> #include <string.h> -#include "DNA_listBase.h" -#include "DNA_ID.h" - #include "BKE_idprop.h" -#include "BKE_global.h" #include "BKE_library.h" -#include "BKE_utildefines.h" #include "BLI_blenlib.h" @@ -294,16 +289,44 @@ IDProperty *IDP_CopyArray(IDProperty *prop) /*taken from readfile.c*/ #define SWITCH_LONGINT(a) { \ - char s_i, *p_i; \ - p_i= (char *)&(a); \ - s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ - s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ - s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ - s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ + s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ + s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ + s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } /* ---------- String Type ------------ */ +IDProperty *IDP_NewString(const char *st, const char *name, int maxlen) +{ + IDProperty *prop = MEM_callocN(sizeof(IDProperty), "IDProperty string"); + + if (st == NULL) { + prop->data.pointer = MEM_callocN(DEFAULT_ALLOC_FOR_NULL_STRINGS, "id property string 1"); + prop->totallen = DEFAULT_ALLOC_FOR_NULL_STRINGS; + prop->len = 1; /*NULL string, has len of 1 to account for null byte.*/ + } + else { + int stlen = strlen(st); + + if(maxlen > 0 && maxlen < stlen) + stlen = maxlen; + + stlen++; /* null terminator '\0' */ + + prop->data.pointer = MEM_callocN(stlen, "id property string 2"); + prop->len = prop->totallen = stlen; + BLI_strncpy(prop->data.pointer, st, stlen); + } + + prop->type = IDP_STRING; + BLI_strncpy(prop->name, name, MAX_IDPROP_NAME); + + return prop; +} + IDProperty *IDP_CopyString(IDProperty *prop) { IDProperty *newp = idp_generic_copy(prop); @@ -317,14 +340,19 @@ IDProperty *IDP_CopyString(IDProperty *prop) } -void IDP_AssignString(IDProperty *prop, char *st) +void IDP_AssignString(IDProperty *prop, char *st, int maxlen) { int stlen; stlen = strlen(st); - IDP_ResizeArray(prop, stlen+1); /*make room for null byte :) */ - strcpy(prop->data.pointer, st); + if(maxlen > 0 && maxlen < stlen) + stlen= maxlen; + + stlen++; /* make room for null byte */ + + IDP_ResizeArray(prop, stlen); + BLI_strncpy(prop->data.pointer, st, stlen); } void IDP_ConcatStringC(IDProperty *prop, char *st) @@ -714,9 +742,6 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, const char *name) prop->type = type; BLI_strncpy(prop->name, name, MAX_IDPROP_NAME); - /*security null byte*/ - prop->name[MAX_IDPROP_NAME-1] = 0; - return prop; } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index accadb3d434..b66b5c60916 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -1,4 +1,4 @@ -/* image.c +/* image.c * * $Id$ * @@ -52,16 +52,12 @@ #include "intern/openexr/openexr_multi.h" #endif -#include "DNA_image_types.h" #include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_camera_types.h" #include "DNA_sequence_types.h" -#include "DNA_texture_types.h" -#include "DNA_sequence_types.h" #include "DNA_userdef_types.h" -#include "BLI_math.h" #include "BLI_blenlib.h" #include "BLI_threads.h" @@ -73,8 +69,6 @@ #include "BKE_main.h" #include "BKE_packedFile.h" #include "BKE_scene.h" -#include "BKE_texture.h" -#include "BKE_utildefines.h" //XXX #include "BIF_editseq.h" @@ -84,7 +78,6 @@ #include "RE_pipeline.h" -#include "GPU_extensions.h" #include "GPU_draw.h" #include "BLO_sys_types.h" // for intptr_t support @@ -99,58 +92,6 @@ /* ******** IMAGE PROCESSING ************* */ -/* used by sequencer and image premul option - IMA_DO_PREMUL */ -void converttopremul(struct ImBuf *ibuf) -{ - int x, y; - - if(ibuf==0) return; - if (ibuf->rect) { - int val; - char *cp; - if(ibuf->depth==24) { /* put alpha at 255 */ - cp= (char *)(ibuf->rect); - for(y=0; y<ibuf->y; y++) { - for(x=0; x<ibuf->x; x++, cp+=4) { - cp[3]= 255; - } - } - } else { - cp= (char *)(ibuf->rect); - for(y=0; y<ibuf->y; y++) { - for(x=0; x<ibuf->x; x++, cp+=4) { - val= cp[3]; - cp[0]= (cp[0]*val)>>8; - cp[1]= (cp[1]*val)>>8; - cp[2]= (cp[2]*val)>>8; - } - } - } - } - if (ibuf->rect_float) { - float val; - float *cp; - if(ibuf->depth==24) { /* put alpha at 1.0 */ - cp= ibuf->rect_float;; - for(y=0; y<ibuf->y; y++) { - for(x=0; x<ibuf->x; x++, cp+=4) { - cp[3]= 1.0; - } - } - } else { - cp= ibuf->rect_float; - for(y=0; y<ibuf->y; y++) { - for(x=0; x<ibuf->x; x++, cp+=4) { - val= cp[3]; - cp[0]= cp[0]*val; - cp[1]= cp[1]*val; - cp[2]= cp[2]*val; - } - } - } - } -} - static void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */ { struct ImBuf * tbuf1, * tbuf2; @@ -236,7 +177,7 @@ static void image_free_buffers(Image *ima) if(ima->anim) IMB_free_anim(ima->anim); ima->anim= NULL; - + if(ima->rr) { RE_FreeRenderResult(ima->rr); ima->rr= NULL; @@ -250,6 +191,8 @@ static void image_free_buffers(Image *ima) /* called by library too, do not free ima itself */ void free_image(Image *ima) { + int a; + image_free_buffers(ima); if (ima->packedfile) { freePackedFile(ima->packedfile); @@ -257,12 +200,14 @@ void free_image(Image *ima) } BKE_icon_delete(&ima->id); ima->id.icon_id = 0; - if (ima->preview) { - BKE_previewimg_free(&ima->preview); - } - if (ima->render_text) { - MEM_freeN(ima->render_text); - ima->render_text= NULL; + + BKE_previewimg_free(&ima->preview); + + for(a=0; a<IMA_MAX_RENDER_SLOT; a++) { + if(ima->renders[a]) { + RE_FreeRenderResult(ima->renders[a]); + ima->renders[a]= NULL; + } } } @@ -383,15 +328,8 @@ Image *BKE_add_image_file(const char *name, int frame) const char *libname; char str[FILE_MAX], strtest[FILE_MAX]; - /* escape when name is directory */ - len= strlen(name); - if(len) { - if(name[len-1]=='/' || name[len-1]=='\\') - return NULL; - } - BLI_strncpy(str, name, sizeof(str)); - BLI_convertstringcode(str, G.sce); + BLI_path_abs(str, G.sce); /* exists? */ file= open(str, O_BINARY|O_RDONLY); @@ -402,7 +340,7 @@ Image *BKE_add_image_file(const char *name, int frame) for(ima= G.main->image.first; ima; ima= ima->id.next) { if(ima->source!=IMA_SRC_VIEWER && ima->source!=IMA_SRC_GENERATED) { BLI_strncpy(strtest, ima->name, sizeof(ima->name)); - BLI_convertstringcode(strtest, G.sce); + BLI_path_abs(strtest, G.sce); if( strcmp(strtest, str)==0 ) { if(ima->anim==NULL || ima->id.us==0) { @@ -435,138 +373,43 @@ Image *BKE_add_image_file(const char *name, int frame) return ima; } -static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4]) +static ImBuf *add_ibuf_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4]) { ImBuf *ibuf; - float h=0.0, hoffs=0.0, hue=0.0, s=0.9, v=0.9, r, g, b; unsigned char *rect= NULL; float *rect_float= NULL; - int x, y; - int checkerwidth=32, dark=1; if (floatbuf) { - ibuf= IMB_allocImBuf(width, height, 24, IB_rectfloat, 0); + ibuf= IMB_allocImBuf(width, height, depth, IB_rectfloat, 0); rect_float= (float*)ibuf->rect_float; } else { - ibuf= IMB_allocImBuf(width, height, 24, IB_rect, 0); + ibuf= IMB_allocImBuf(width, height, depth, IB_rect, 0); rect= (unsigned char*)ibuf->rect; } strcpy(ibuf->name, "//Untitled"); ibuf->userflags |= IB_BITMAPDIRTY; - if (uvtestgrid) { - /* these two passes could be combined into one, but it's more readable and - * easy to tweak like this, speed isn't really that much of an issue in this situation... */ - - /* checkers */ - for(y=0; y<height; y++) { - dark = powf(-1.0f, floorf(y / checkerwidth)); - - for(x=0; x<width; x++) { - if (x % checkerwidth == 0) dark *= -1; - - if (floatbuf) { - if (dark > 0) { - rect_float[0] = rect_float[1] = rect_float[2] = 0.25f; - rect_float[3] = 1.0f; - } else { - rect_float[0] = rect_float[1] = rect_float[2] = 0.58f; - rect_float[3] = 1.0f; - } - rect_float+=4; - } - else { - if (dark > 0) { - rect[0] = rect[1] = rect[2] = 64; - rect[3] = 255; - } else { - rect[0] = rect[1] = rect[2] = 150; - rect[3] = 255; - } - rect += 4; - } - } - } - - /* 2nd pass, colored + */ - if (floatbuf) rect_float= (float*)ibuf->rect_float; - else rect= (unsigned char*)ibuf->rect; - - for(y=0; y<height; y++) { - hoffs = 0.125f * floorf(y / checkerwidth); - - for(x=0; x<width; x++) { - h = 0.125f * floorf(x / checkerwidth); - - if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 4) && - (fabs((y % checkerwidth) - (checkerwidth / 2)) < 4)) { - - if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 1) || - (fabs((y % checkerwidth) - (checkerwidth / 2)) < 1)) { - - hue = fmodf(fabs(h-hoffs), 1.0f); - hsv_to_rgb(hue, s, v, &r, &g, &b); - - if (floatbuf) { - rect_float[0]= r; - rect_float[1]= g; - rect_float[2]= b; - rect_float[3]= 1.0f; - } - else { - rect[0]= (char)(r * 255.0f); - rect[1]= (char)(g * 255.0f); - rect[2]= (char)(b * 255.0f); - rect[3]= 255; - } - } - } - - if (floatbuf) - rect_float+=4; - else - rect+=4; - } - } - } else { /* blank image */ - char ccol[4]; - - ccol[0]= (char)(color[0]*255.0f); - ccol[1]= (char)(color[1]*255.0f); - ccol[2]= (char)(color[2]*255.0f); - ccol[3]= (char)(color[3]*255.0f); - - for(y=0; y<height; y++) { - for(x=0; x<width; x++) { - if (floatbuf) { - rect_float[0]= color[0]; - rect_float[1]= color[1]; - rect_float[2]= color[2]; - rect_float[3]= color[3]; - rect_float+=4; - } - else { - rect[0]= ccol[0]; - rect[1]= ccol[1]; - rect[2]= ccol[2]; - rect[3]= ccol[3]; - rect+=4; - } - } - } + switch(uvtestgrid) { + case 1: + BKE_image_buf_fill_checker(rect, rect_float, width, height); + break; + case 2: + BKE_image_buf_fill_checker_color(rect, rect_float, width, height); + break; + default: + BKE_image_buf_fill_color(rect, rect_float, width, height, color); } + return ibuf; } /* adds new image block, creates ImBuf and initializes color */ -Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4]) +Image *BKE_add_image_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4]) { - Image *ima; - /* on save, type is changed to FILE in editsima.c */ - ima= image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST); + Image *ima= image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST); if (ima) { ImBuf *ibuf; @@ -576,7 +419,7 @@ Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short ima->gen_y= height; ima->gen_type= uvtestgrid; - ibuf= add_ibuf_size(width, height, name, floatbuf, uvtestgrid, color); + ibuf= add_ibuf_size(width, height, name, depth, floatbuf, uvtestgrid, color); image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); ima->ok= IMA_OK_LOADED; @@ -585,6 +428,23 @@ Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short return ima; } +/* creates an image image owns the imbuf passed */ +Image *BKE_add_image_imbuf(ImBuf *ibuf) +{ + /* on save, type is changed to FILE in editsima.c */ + Image *ima; + + ima= image_alloc(BLI_path_basename(ibuf->name), IMA_SRC_FILE, IMA_TYPE_IMAGE); + + if (ima) { + BLI_strncpy(ima->name, ibuf->name, FILE_MAX); + image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); + ima->ok= IMA_OK_LOADED; + } + + return ima; +} + /* packs rect from memory as PNG */ void BKE_image_memorypack(Image *ima) { @@ -814,8 +674,6 @@ int BKE_imtype_to_ftype(int imtype) return TGA; else if(imtype==R_RAWTGA) return RAWTGA; - else if(imtype==R_HAMX) - return AN_hamx; #ifdef WITH_OPENJPEG else if(imtype==R_JP2) return JP2; @@ -852,8 +710,6 @@ int BKE_ftype_to_imtype(int ftype) return R_TARGA; else if(ftype & RAWTGA) return R_RAWTGA; - else if(ftype == AN_hamx) - return R_HAMX; #ifdef WITH_OPENJPEG else if(ftype & JP2) return R_JP2; @@ -866,7 +722,6 @@ int BKE_ftype_to_imtype(int ftype) int BKE_imtype_is_movie(int imtype) { switch(imtype) { - case R_MOVIE: case R_AVIRAW: case R_AVIJPEG: case R_AVICODEC: @@ -915,10 +770,12 @@ void BKE_add_image_extension(char *string, int imtype) if(!BLI_testextensie(string, ".bmp")) extension= ".bmp"; } - else if(G.have_libtiff && (imtype==R_TIFF)) { +#ifdef WITH_TIFF + else if(imtype==R_TIFF) { if(!BLI_testextensie(string, ".tif") && !BLI_testextensie(string, ".tiff")) extension= ".tif"; } +#endif #ifdef WITH_OPENEXR else if( ELEM(imtype, R_OPENEXR, R_MULTILAYER)) { if(!BLI_testextensie(string, ".exr")) @@ -943,7 +800,7 @@ void BKE_add_image_extension(char *string, int imtype) extension= ".jp2"; } #endif - else { // R_MOVIE, R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90, R_QUICKTIME etc + else { // R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90, R_QUICKTIME etc if(!( BLI_testextensie(string, ".jpg") || BLI_testextensie(string, ".jpeg"))) extension= ".jpg"; } @@ -968,14 +825,9 @@ typedef struct StampData { static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix) { char text[256]; - -#ifndef WIN32 struct tm *tl; time_t t; -#else - char sdate[9]; -#endif /* WIN32 */ - + if (scene->r.stamp & R_STAMP_FILENAME) { if (G.relbase_valid) { if (do_prefix) sprintf(stamp_data->file, "File %s", G.sce); @@ -996,14 +848,11 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix) } if (scene->r.stamp & R_STAMP_DATE) { -#ifdef WIN32 - _strdate (sdate); - sprintf (text, "%s", sdate); -#else + t = time (NULL); tl = localtime (&t); - sprintf (text, "%04d-%02d-%02d", tl->tm_year+1900, tl->tm_mon+1, tl->tm_mday); -#endif /* WIN32 */ + sprintf (text, "%04d/%02d/%02d %02d:%02d:%02d", tl->tm_year+1900, tl->tm_mon+1, tl->tm_mday, tl->tm_hour, tl->tm_min, tl->tm_sec); + if (do_prefix) sprintf(stamp_data->date, "Date %s", text); else sprintf(stamp_data->date, "%s", text); } else { @@ -1088,7 +937,7 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix) } { - Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING); + Render *re= RE_GetRender(scene->id.name); RenderStats *stats= re ? RE_GetStats(re):NULL; if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) { @@ -1106,17 +955,17 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix) extern int datatoc_bmonofont_ttf_size; extern char datatoc_bmonofont_ttf[]; -// XXX - copied from text_font_begin -static void stamp_font_begin(int size) +// XXX - copied from text_font_begin ! Change all the BLF_* here +static int mono= -1; + +int stamp_font_begin(int size) { - static int mono= -1; - if (mono == -1) - mono= BLF_load_mem("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size); + mono= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size); - BLF_set(mono); - BLF_aspect(1.0); - BLF_size(size, 72); + BLF_aspect(mono, 1.0); + BLF_size(mono, size, 72); + return(mono); // XXX This is for image_gen.c!! } void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels) @@ -1124,6 +973,7 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i struct StampData stamp_data; float w, h, pad; int x, y; + float h_fixed; if (!rect && !rectf) return; @@ -1136,24 +986,32 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i stamp_font_begin(scene->r.stamp_font_id); - BLF_buffer(rectf, rect, width, height, channels); - BLF_buffer_col(scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0); - pad= BLF_width("--"); + BLF_buffer(mono, rectf, rect, width, height, channels); + BLF_buffer_col(mono, scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0); + pad= BLF_width(mono, "--"); + + /* use 'h_fixed' rather then 'h', aligns better */ + // BLF_width_and_height(mono, "^|/_AgPpJjlYy", &w, &h_fixed); + { + rctf box; + BLF_boundbox(mono, "^|/_AgPpJjlYy", &box); + h_fixed= box.ymax - box.ymin; + } x= 0; y= height; if (stamp_data.file[0]) { /* Top left corner */ - BLF_width_and_height(stamp_data.file, &w, &h); + BLF_width_and_height(mono, stamp_data.file, &w, &h); h= h_fixed; y -= h; /* also a little of space to the background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, w+3, y+h+2); /* and draw the text. */ - BLF_position(x, y, 0.0); - BLF_draw_buffer(stamp_data.file); + BLF_position(mono, x, y, 0.0); + BLF_draw_buffer(mono, stamp_data.file); /* the extra pixel for background. */ y -= 4; @@ -1161,14 +1019,14 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Top left corner, below File */ if (stamp_data.note[0]) { - BLF_width_and_height(stamp_data.note, &w, &h); + BLF_width_and_height(mono, stamp_data.note, &w, &h); h= h_fixed; y -= h; /* and space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-2, w+3, y+h+2); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+2); - BLF_position(x, y+1, 0.0); - BLF_draw_buffer(stamp_data.note); + BLF_position(mono, x, y+1, 0.0); + BLF_draw_buffer(mono, stamp_data.note); /* the extra pixel for background. */ y -= 4; @@ -1176,14 +1034,14 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Top left corner, below File (or Note) */ if (stamp_data.date[0]) { - BLF_width_and_height(stamp_data.date, &w, &h); + BLF_width_and_height(mono, stamp_data.date, &w, &h); h= h_fixed; y -= h; /* and space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+2); - BLF_position(x, y, 0.0); - BLF_draw_buffer(stamp_data.date); + BLF_position(mono, x, y, 0.0); + BLF_draw_buffer(mono, stamp_data.date); /* the extra pixel for background. */ y -= 4; @@ -1191,14 +1049,14 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Top left corner, below File, Date or Note */ if (stamp_data.rendertime[0]) { - BLF_width_and_height(stamp_data.rendertime, &w, &h); + BLF_width_and_height(mono, stamp_data.rendertime, &w, &h); h= h_fixed; y -= h; /* and space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+2); - BLF_position(x, y, 0.0); - BLF_draw_buffer(stamp_data.rendertime); + BLF_position(mono, x, y, 0.0); + BLF_draw_buffer(mono, stamp_data.rendertime); } x= 0; @@ -1206,14 +1064,14 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Bottom left corner, leaving space for timing */ if (stamp_data.marker[0]) { - BLF_width_and_height(stamp_data.marker, &w, &h); + BLF_width_and_height(mono, stamp_data.marker, &w, &h); h= h_fixed; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, w+2, y+h+2); /* and pad the text. */ - BLF_position(x, y+3, 0.0); - BLF_draw_buffer(stamp_data.marker); + BLF_position(mono, x, y+3, 0.0); + BLF_draw_buffer(mono, stamp_data.marker); /* space width. */ x += w + pad; @@ -1221,73 +1079,72 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Left bottom corner */ if (stamp_data.time[0]) { - BLF_width_and_height(stamp_data.time, &w, &h); + BLF_width_and_height(mono, stamp_data.time, &w, &h); h= h_fixed; /* extra space for background */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2); /* and pad the text. */ - BLF_position(x, y+3, 0.0); - BLF_draw_buffer(stamp_data.time); + BLF_position(mono, x, y+3, 0.0); + BLF_draw_buffer(mono, stamp_data.time); /* space width. */ x += w + pad; } if (stamp_data.frame[0]) { - BLF_width_and_height(stamp_data.frame, &w, &h); + BLF_width_and_height(mono, stamp_data.frame, &w, &h); h= h_fixed; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2); /* and pad the text. */ - BLF_position(x, y+3, 0.0); - - BLF_draw_buffer(stamp_data.frame); + BLF_position(mono, x, y+3, 0.0); + BLF_draw_buffer(mono, stamp_data.frame); /* space width. */ x += w + pad; } if (stamp_data.camera[0]) { - BLF_width_and_height(stamp_data.camera, &w, &h); + BLF_width_and_height(mono, stamp_data.camera, &w, &h); h= h_fixed; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3); - BLF_position(x, y+3, 0.0); - BLF_draw_buffer(stamp_data.camera); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2); + BLF_position(mono, x, y+3, 0.0); + BLF_draw_buffer(mono, stamp_data.camera); } if (stamp_data.scene[0]) { - BLF_width_and_height(stamp_data.scene, &w, &h); + BLF_width_and_height(mono, stamp_data.scene, &w, &h); h= h_fixed; /* Bottom right corner, with an extra space because blenfont is too strict! */ x= width - w - 2; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+3, y+h+2); /* and pad the text. */ - BLF_position(x, y+3, 0.0); - BLF_draw_buffer(stamp_data.scene); + BLF_position(mono, x, y+3, 0.0); + BLF_draw_buffer(mono, stamp_data.scene); } if (stamp_data.strip[0]) { - BLF_width_and_height(stamp_data.scene, &w, &h); + BLF_width_and_height(mono, stamp_data.scene, &w, &h); h= h_fixed; /* Top right corner, with an extra space because blenfont is too strict! */ x= width - w - pad; y= height - h; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, x+w+pad, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, x+w+pad, y+h+2); - BLF_position(x, y, 0.0); - BLF_draw_buffer(stamp_data.strip); + BLF_position(mono, x, y, 0.0); + BLF_draw_buffer(mono, stamp_data.strip); } /* cleanup the buffer. */ - BLF_buffer(NULL, NULL, 0, 0, 0); + BLF_buffer(mono, NULL, NULL, 0, 0, 0); } void BKE_stamp_info(Scene *scene, struct ImBuf *ibuf) @@ -1299,15 +1156,16 @@ void BKE_stamp_info(Scene *scene, struct ImBuf *ibuf) /* fill all the data values, no prefix */ stampdata(scene, &stamp_data, 0); - if (stamp_data.file[0]) IMB_imginfo_change_field (ibuf, "File", stamp_data.file); - if (stamp_data.note[0]) IMB_imginfo_change_field (ibuf, "Note", stamp_data.note); - if (stamp_data.date[0]) IMB_imginfo_change_field (ibuf, "Date", stamp_data.date); - if (stamp_data.marker[0]) IMB_imginfo_change_field (ibuf, "Marker", stamp_data.marker); - if (stamp_data.time[0]) IMB_imginfo_change_field (ibuf, "Time", stamp_data.time); - if (stamp_data.frame[0]) IMB_imginfo_change_field (ibuf, "Frame", stamp_data.frame); - if (stamp_data.camera[0]) IMB_imginfo_change_field (ibuf, "Camera", stamp_data.camera); - if (stamp_data.scene[0]) IMB_imginfo_change_field (ibuf, "Scene", stamp_data.scene); - if (stamp_data.strip[0]) IMB_imginfo_change_field (ibuf, "Strip", stamp_data.strip); + if (stamp_data.file[0]) IMB_metadata_change_field (ibuf, "File", stamp_data.file); + if (stamp_data.note[0]) IMB_metadata_change_field (ibuf, "Note", stamp_data.note); + if (stamp_data.date[0]) IMB_metadata_change_field (ibuf, "Date", stamp_data.date); + if (stamp_data.marker[0]) IMB_metadata_change_field (ibuf, "Marker", stamp_data.marker); + if (stamp_data.time[0]) IMB_metadata_change_field (ibuf, "Time", stamp_data.time); + if (stamp_data.frame[0]) IMB_metadata_change_field (ibuf, "Frame", stamp_data.frame); + if (stamp_data.camera[0]) IMB_metadata_change_field (ibuf, "Camera", stamp_data.camera); + if (stamp_data.scene[0]) IMB_metadata_change_field (ibuf, "Scene", stamp_data.scene); + if (stamp_data.strip[0]) IMB_metadata_change_field (ibuf, "Strip", stamp_data.strip); + if (stamp_data.rendertime[0]) IMB_metadata_change_field (ibuf, "RenderTime", stamp_data.rendertime); } int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimtype, int quality) @@ -1331,12 +1189,14 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt else if ((imtype==R_BMP)) { ibuf->ftype= BMP; } - else if ((G.have_libtiff) && (imtype==R_TIFF)) { +#ifdef WITH_TIFF + else if (imtype==R_TIFF) { ibuf->ftype= TIF; if(subimtype & R_TIFF_16BIT) ibuf->ftype |= TIF_16BIT; } +#endif #ifdef WITH_OPENEXR else if (imtype==R_OPENEXR || imtype==R_MULTILAYER) { ibuf->ftype= OPENEXR; @@ -1361,9 +1221,6 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt else if(imtype==R_RAWTGA) { ibuf->ftype= RAWTGA; } - else if(imtype==R_HAMX) { - ibuf->ftype= AN_hamx; - } #ifdef WITH_OPENJPEG else if(imtype==R_JP2) { if(quality < 10) quality= 90; @@ -1387,7 +1244,7 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt } #endif else { - /* R_JPEG90, R_MOVIE, etc. default we save jpegs */ + /* R_JPEG90, etc. default we save jpegs */ if(quality < 10) quality= 90; ibuf->ftype= JPG|quality; if(ibuf->depth==32) ibuf->depth= 24; /* unsupported feature only confuses other s/w */ @@ -1411,8 +1268,8 @@ void BKE_makepicstring(char *string, char *base, int frame, int imtype, int use_ { if (string==NULL) return; BLI_strncpy(string, base, FILE_MAX - 10); /* weak assumption */ - BLI_convertstringcode(string, G.sce); - BLI_convertstringframe(string, frame, 4); + BLI_path_abs(string, G.sce); + BLI_path_frame(string, frame, 4); if(use_ext) BKE_add_image_extension(string, imtype); @@ -1594,20 +1451,48 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser) return rpass; } -RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, Image *ima) +RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima) { - if(ima->rr) + if(ima->rr) { return ima->rr; - else if(ima->type==IMA_TYPE_R_RESULT) - return RE_AcquireResultRead(RE_GetRender(scene->id.name, RE_SLOT_VIEW)); - return NULL; + } + else if(ima->type==IMA_TYPE_R_RESULT) { + if(ima->render_slot == ima->last_render_slot) + return RE_AcquireResultRead(RE_GetRender(scene->id.name)); + else + return ima->renders[ima->render_slot]; + } + else + return NULL; } -void BKE_image_release_renderresult(struct Scene *scene, Image *ima) +void BKE_image_release_renderresult(Scene *scene, Image *ima) { if(ima->rr); - else if(ima->type==IMA_TYPE_R_RESULT) - RE_ReleaseResult(RE_GetRender(scene->id.name, RE_SLOT_VIEW)); + else if(ima->type==IMA_TYPE_R_RESULT) { + if(ima->render_slot == ima->last_render_slot) + RE_ReleaseResult(RE_GetRender(scene->id.name)); + } +} + +void BKE_image_backup_render(Scene *scene, Image *ima) +{ + /* called right before rendering, ima->renders contains render + result pointers for everything but the current render */ + Render *re= RE_GetRender(scene->id.name); + int slot= ima->render_slot, last= ima->last_render_slot; + + if(slot != last) { + if(ima->renders[slot]) { + RE_FreeRenderResult(ima->renders[slot]); + ima->renders[slot]= NULL; + } + + ima->renders[last]= NULL; + RE_SwapResult(re, &ima->renders[last]); + } + + ima->last_render_slot= slot; } /* after imbuf load, openexr type can return with a exrhandle open */ @@ -1655,6 +1540,7 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame) struct ImBuf *ibuf; unsigned short numlen; char name[FILE_MAX], head[FILE_MAX], tail[FILE_MAX]; + int flag; /* XXX temp stuff? */ if(ima->lastframe != frame) @@ -1667,12 +1553,16 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame) BLI_strncpy(name, ima->name, sizeof(name)); if(ima->id.lib) - BLI_convertstringcode(name, ima->id.lib->filename); + BLI_path_abs(name, ima->id.lib->filepath); else - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); + flag= IB_rect|IB_multilayer; + if(ima->flag & IMA_DO_PREMUL) + flag |= IB_premul; + /* read ibuf */ - ibuf = IMB_loadiffname(name, IB_rect|IB_multilayer); + ibuf = IMB_loadiffname(name, flag); if(G.f & G_DEBUG) printf("loaded %s\n", name); if (ibuf) { @@ -1692,10 +1582,6 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame) image_initialize_after_load(ima, ibuf); image_assign_ibuf(ima, ibuf, 0, frame); #endif - - if(ima->flag & IMA_DO_PREMUL) - converttopremul(ibuf); - } else ima->ok= 0; @@ -1774,11 +1660,11 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame) BLI_strncpy(str, ima->name, FILE_MAX); if(ima->id.lib) - BLI_convertstringcode(str, ima->id.lib->filename); + BLI_path_abs(str, ima->id.lib->filepath); else - BLI_convertstringcode(str, G.sce); + BLI_path_abs(str, G.sce); - ima->anim = openanim(str, IB_cmap | IB_rect); + ima->anim = openanim(str, IB_rect); /* let's initialize this user */ if(ima->anim && iuser && iuser->frames==0) @@ -1809,33 +1695,40 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame) return ibuf; } -/* cfra used for # code, Image can only have this # for all its users */ +/* cfra used for # code, Image can only have this # for all its users + * warning, 'iuser' can be NULL */ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra) { struct ImBuf *ibuf; char str[FILE_MAX]; - int assign = 0; + int assign = 0, flag; /* always ensure clean ima */ image_free_buffers(ima); /* is there a PackedFile with this image ? */ if (ima->packedfile) { - ibuf = IMB_ibImageFromMemory((int *) ima->packedfile->data, ima->packedfile->size, IB_rect|IB_multilayer); + flag = IB_rect|IB_multilayer; + if(ima->flag & IMA_DO_PREMUL) flag |= IB_premul; + + ibuf = IMB_ibImageFromMemory((unsigned char*)ima->packedfile->data, ima->packedfile->size, flag); } else { + flag= IB_rect|IB_multilayer|IB_metadata; + if(ima->flag & IMA_DO_PREMUL) + flag |= IB_premul; /* get the right string */ BLI_strncpy(str, ima->name, sizeof(str)); if(ima->id.lib) - BLI_convertstringcode(str, ima->id.lib->filename); + BLI_path_abs(str, ima->id.lib->filepath); else - BLI_convertstringcode(str, G.sce); + BLI_path_abs(str, G.sce); - BLI_convertstringframe(str, cfra, 0); + BLI_path_frame(str, cfra, 0); /* read ibuf */ - ibuf = IMB_loadiffname(str, IB_rect|IB_multilayer|IB_imginfo); + ibuf = IMB_loadiffname(str, flag); } if (ibuf) { @@ -1857,9 +1750,6 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra) if ((ima->packedfile == NULL) && (G.fileflags & G_AUTOPACK)) ima->packedfile = newPackedFile(NULL, str); } - - if(ima->flag & IMA_DO_PREMUL) - converttopremul(ibuf); } else ima->ok= 0; @@ -1915,113 +1805,123 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser) /* always returns a single ibuf, also during render progress */ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_r) { - Render *re= NULL; - RenderResult *rr= NULL; - + Render *re; + RenderResult rres; + float *rectf, *rectz; + unsigned int *rect; + float dither; + int channels, layer, pass; + ImBuf *ibuf; + int from_render= (ima->render_slot == ima->last_render_slot); + + if(!(iuser && iuser->scene)) + return NULL; + /* if we the caller is not going to release the lock, don't give the image */ if(!lock_r) return NULL; - if(iuser && iuser->scene) { - re= RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW); - rr= RE_AcquireResultRead(re); + re= RE_GetRender(iuser->scene->id.name); - /* release is done in BKE_image_release_ibuf using lock_r */ + channels= 4; + layer= (iuser)? iuser->layer: 0; + pass= (iuser)? iuser->pass: 0; + + if(from_render) { + RE_AcquireResultImage(re, &rres); + } + else if(ima->renders[ima->render_slot]) { + rres= *(ima->renders[ima->render_slot]); + rres.have_combined= rres.rectf != NULL; + } + else + memset(&rres, 0, sizeof(RenderResult)); + + if(!(rres.rectx > 0 && rres.recty > 0)) { + if(from_render) + RE_ReleaseResultImage(re); + return NULL; + } + + /* release is done in BKE_image_release_ibuf using lock_r */ + if(from_render) { + BLI_lock_thread(LOCK_VIEWER); *lock_r= re; } - if(rr==NULL) - return NULL; - - if(RE_RenderInProgress(re)) { - ImBuf *ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0); - - /* make ibuf if needed, and initialize it */ - /* this only gets called when mutex locked */ - if(ibuf==NULL) { - ibuf= IMB_allocImBuf(rr->rectx, rr->recty, 32, IB_rect, 0); - image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); - } + /* this gives active layer, composite or seqence result */ + rect= (unsigned int *)rres.rect32; + rectf= rres.rectf; + rectz= rres.rectz; + dither= iuser->scene->r.dither_intensity; - return ibuf; + /* combined layer gets added as first layer */ + if(rres.have_combined && layer==0); + else if(rres.layers.first) { + RenderLayer *rl= BLI_findlink(&rres.layers, layer-(rres.have_combined?1:0)); + if(rl) { + RenderPass *rpass; + + /* there's no combined pass, is in renderlayer itself */ + if(pass==0) { + rectf= rl->rectf; + } + else { + rpass= BLI_findlink(&rl->passes, pass-1); + if(rpass) { + channels= rpass->channels; + rectf= rpass->rect; + dither= 0.0f; /* don't dither passes */ + } + } + + for(rpass= rl->passes.first; rpass; rpass= rpass->next) + if(rpass->passtype == SCE_PASS_Z) + rectz= rpass->rect; + } + } + + ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0); + + /* make ibuf if needed, and initialize it */ + if(ibuf==NULL) { + ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0, 0); + image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); + } + + ibuf->x= rres.rectx; + ibuf->y= rres.recty; + + if(ibuf->rect_float!=rectf || rect) /* ensure correct redraw */ + imb_freerectImBuf(ibuf); + + if(rect) + ibuf->rect= rect; + + if(rectf) { + ibuf->rect_float= rectf; + ibuf->flags |= IB_rectfloat; + ibuf->channels= channels; } else { - RenderResult rres; - float *rectf, *rectz; - unsigned int *rect; - float dither; - int channels, layer, pass; - - channels= 4; - layer= (iuser)? iuser->layer: 0; - pass= (iuser)? iuser->pass: 0; - - /* this gives active layer, composite or seqence result */ - RE_AcquireResultImage(RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW), &rres); - rect= (unsigned int *)rres.rect32; - rectf= rres.rectf; - rectz= rres.rectz; - dither= iuser->scene->r.dither_intensity; - - /* get compo/seq result by default */ - if(rr->rectf && layer==0); - else if(rr->layers.first) { - RenderLayer *rl= BLI_findlink(&rr->layers, layer-(rr->rectf?1:0)); - if(rl) { - RenderPass *rpass; - - /* there's no combined pass, is in renderlayer itself */ - if(pass==0) { - rectf= rl->rectf; - } - else { - rpass= BLI_findlink(&rl->passes, pass-1); - if(rpass) { - channels= rpass->channels; - rectf= rpass->rect; - dither= 0.0f; /* don't dither passes */ - } - } - - for(rpass= rl->passes.first; rpass; rpass= rpass->next) - if(rpass->passtype == SCE_PASS_Z) - rectz= rpass->rect; - } - } - - if(rectf || rect) { - ImBuf *ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0); - - /* make ibuf if needed, and initialize it */ - if(ibuf==NULL) { - ibuf= IMB_allocImBuf(rr->rectx, rr->recty, 32, 0, 0); - image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); - } - ibuf->x= rr->rectx; - ibuf->y= rr->recty; - - if(ibuf->rect_float!=rectf || rect) /* ensure correct redraw */ - imb_freerectImBuf(ibuf); - if(rect) - ibuf->rect= rect; - - ibuf->rect_float= rectf; - ibuf->flags |= IB_rectfloat; - ibuf->channels= channels; - ibuf->zbuf_float= rectz; - ibuf->flags |= IB_zbuffloat; - ibuf->dither= dither; - - RE_ReleaseResultImage(re); - - ima->ok= IMA_OK_LOADED; - return ibuf; - } - - RE_ReleaseResultImage(re); + ibuf->rect_float= NULL; + ibuf->flags &= ~IB_rectfloat; } - - return NULL; + + if(rectz) { + ibuf->zbuf_float= rectz; + ibuf->flags |= IB_zbuffloat; + } + else { + ibuf->zbuf_float= NULL; + ibuf->flags &= ~IB_zbuffloat; + } + + ibuf->dither= dither; + + ima->ok= IMA_OK_LOADED; + + return ibuf; } static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame_r, int *index_r) @@ -2047,7 +1947,7 @@ static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame if(ima->lastframe != frame) ima->tpageflag |= IMA_TPAGE_REFRESH; ima->lastframe = frame; - } + } else if(ima->type==IMA_TYPE_MULTILAYER) { frame= iuser?iuser->framenr:ima->lastframe; index= iuser?iuser->multi_index:IMA_NO_INDEX; @@ -2171,7 +2071,7 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) /* UV testgrid or black or solid etc */ if(ima->gen_x==0) ima->gen_x= 1024; if(ima->gen_y==0) ima->gen_y= 1024; - ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 0, ima->gen_type, color); + ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 24, 0, ima->gen_type, color); image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); ima->ok= IMA_OK_LOADED; } @@ -2182,10 +2082,17 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) ibuf= image_get_render_result(ima, iuser, lock_r); } else if(ima->type==IMA_TYPE_COMPOSITE) { - /* Composite Viewer, all handled in compositor */ - /* fake ibuf, will be filled in compositor */ - ibuf= IMB_allocImBuf(256, 256, 32, IB_rect, 0); - image_assign_ibuf(ima, ibuf, 0, frame); + /* requires lock/unlock, otherwise don't return image */ + if(lock_r) { + /* unlock in BKE_image_release_ibuf */ + BLI_lock_thread(LOCK_VIEWER); + *lock_r= ima; + + /* Composite Viewer, all handled in compositor */ + /* fake ibuf, will be filled in compositor */ + ibuf= IMB_allocImBuf(256, 256, 32, IB_rect, 0); + image_assign_ibuf(ima, ibuf, 0, frame); + } } } } @@ -2203,9 +2110,14 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) void BKE_image_release_ibuf(Image *ima, void *lock) { - /* for getting image during threaded render, need to release */ - if(lock) - RE_ReleaseResult(lock); + /* for getting image during threaded render / compositing, need to release */ + if(lock == ima) { + BLI_unlock_thread(LOCK_VIEWER); /* viewer image */ + } + else if(lock) { + RE_ReleaseResultImage(lock); /* render result */ + BLI_unlock_thread(LOCK_VIEWER); /* view image imbuf */ + } } ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser) diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c new file mode 100644 index 00000000000..9248ce69280 --- /dev/null +++ b/source/blender/blenkernel/intern/image_gen.c @@ -0,0 +1,367 @@ +/* image_gen.c + * + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Matt Ebb, Campbell Barton, Shuvro Sarker + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <math.h> +#include <stdlib.h> +#include "BLI_math_color.h" +#include "BLF_api.h" + +void BKE_image_buf_fill_color(unsigned char *rect, float *rect_float, int width, int height, float color[4]) +{ + int x, y; + + /* blank image */ + if(rect_float) { + for(y= 0; y<height; y++) { + for(x= 0; x<width; x++) { + rect_float[0]= color[0]; + rect_float[1]= color[1]; + rect_float[2]= color[2]; + rect_float[3]= color[3]; + rect_float+= 4; + } + } + } + + if(rect) { + char ccol[4]; + + ccol[0]= (char)(color[0]*255.0f); + ccol[1]= (char)(color[1]*255.0f); + ccol[2]= (char)(color[2]*255.0f); + ccol[3]= (char)(color[3]*255.0f); + for(y= 0; y<height; y++) { + for(x= 0; x<width; x++) { + + rect[0]= ccol[0]; + rect[1]= ccol[1]; + rect[2]= ccol[2]; + rect[3]= ccol[3]; + rect+= 4; + } + } + } +} + + +void BKE_image_buf_fill_checker(unsigned char *rect, float *rect_float, int width, int height) +{ + /* these two passes could be combined into one, but it's more readable and + * easy to tweak like this, speed isn't really that much of an issue in this situation... */ + + int checkerwidth= 32, dark= 1; + int x, y; + + unsigned char *rect_orig= rect; + float *rect_float_orig= rect_float; + + + float h=0.0, hoffs=0.0, hue=0.0, s=0.9, v=0.9, r, g, b; + + /* checkers */ + for(y= 0; y<height; y++) { + dark= powf(-1.0f, floorf(y / checkerwidth)); + + for(x= 0; x<width; x++) { + if (x % checkerwidth == 0) dark= -dark; + + if (rect_float) { + if (dark > 0) { + rect_float[0]= rect_float[1]= rect_float[2]= 0.25f; + rect_float[3]= 1.0f; + } else { + rect_float[0]= rect_float[1]= rect_float[2]= 0.58f; + rect_float[3]= 1.0f; + } + rect_float+= 4; + } + else { + if (dark > 0) { + rect[0]= rect[1]= rect[2]= 64; + rect[3]= 255; + } else { + rect[0]= rect[1]= rect[2]= 150; + rect[3]= 255; + } + rect+= 4; + } + } + } + + rect= rect_orig; + rect_float= rect_float_orig; + + /* 2nd pass, colored + */ + for(y= 0; y<height; y++) { + hoffs= 0.125f * floorf(y / checkerwidth); + + for(x= 0; x<width; x++) { + h= 0.125f * floorf(x / checkerwidth); + + if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 4) && + (fabs((y % checkerwidth) - (checkerwidth / 2)) < 4)) { + + if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 1) || + (fabs((y % checkerwidth) - (checkerwidth / 2)) < 1)) { + + hue= fmodf(fabs(h-hoffs), 1.0f); + hsv_to_rgb(hue, s, v, &r, &g, &b); + + if (rect) { + rect[0]= (char)(r * 255.0f); + rect[1]= (char)(g * 255.0f); + rect[2]= (char)(b * 255.0f); + rect[3]= 255; + } + + if (rect_float) { + rect_float[0]= r; + rect_float[1]= g; + rect_float[2]= b; + rect_float[3]= 1.0f; + } + } + } + + if (rect_float) rect_float+= 4; + if (rect) rect+= 4; + } + } +} + + +/* Utility functions for BKE_image_buf_fill_checker_color */ + +#define BLEND_FLOAT(real, add) (real+add <= 1.0) ? (real+add) : 1.0 +#define BLEND_CHAR(real, add) ((real + (char)(add * 255.0)) <= 255) ? (real + (char)(add * 255.0)) : 255 + +static int is_pow2(int n) +{ + return ((n)&(n-1))==0; +} +static int larger_pow2(int n) +{ + if (is_pow2(n)) + return n; + + while(!is_pow2(n)) + n= n&(n-1); + + return n*2; +} + +static void checker_board_color_fill(unsigned char *rect, float *rect_float, int width, int height) +{ + int hue_step, y, x; + float hue, val, sat, r, g, b; + + sat= 1.0; + + hue_step= larger_pow2(width / 8); + if(hue_step < 8) hue_step= 8; + + for(y= 0; y < height; y++) + { + + val= 0.1 + (y * (0.4 / height)); /* use a number lower then 1.0 else its too bright */ + for(x= 0; x < width; x++) + { + hue= (float)((double)(x/hue_step) * 1.0 / width * hue_step); + hsv_to_rgb(hue, sat, val, &r, &g, &b); + + if (rect) { + rect[0]= (char)(r * 255.0f); + rect[1]= (char)(g * 255.0f); + rect[2]= (char)(b * 255.0f); + rect[3]= 255; + + rect += 4; + } + + if (rect_float) { + rect_float[0]= r; + rect_float[1]= g; + rect_float[2]= b; + rect_float[3]= 1.0f; + + rect_float += 4; + } + } + } +} + +static void checker_board_color_tint(unsigned char *rect, float *rect_float, int width, int height, int size, float blend) +{ + int x, y; + float blend_half= blend * 0.5f; + + for(y= 0; y < height; y++) + { + for(x= 0; x < width; x++) + { + if( ( (y/size)%2 == 1 && (x/size)%2 == 1 ) || ( (y/size)%2 == 0 && (x/size)%2 == 0 ) ) + { + if (rect) { + rect[0]= (char)BLEND_CHAR(rect[0], blend); + rect[1]= (char)BLEND_CHAR(rect[1], blend); + rect[2]= (char)BLEND_CHAR(rect[2], blend); + rect[3]= 255; + + rect += 4; + } + if (rect_float) { + rect_float[0]= BLEND_FLOAT(rect_float[0], blend); + rect_float[1]= BLEND_FLOAT(rect_float[1], blend); + rect_float[2]= BLEND_FLOAT(rect_float[2], blend); + rect_float[3]= 1.0f; + + rect_float += 4; + } + } + else { + if (rect) { + rect[0]= (char)BLEND_CHAR(rect[0], blend_half); + rect[1]= (char)BLEND_CHAR(rect[1], blend_half); + rect[2]= (char)BLEND_CHAR(rect[2], blend_half); + rect[3]= 255; + + rect += 4; + } + if (rect_float) { + rect_float[0]= BLEND_FLOAT(rect_float[0], blend_half); + rect_float[1]= BLEND_FLOAT(rect_float[1], blend_half); + rect_float[2]= BLEND_FLOAT(rect_float[2], blend_half); + rect_float[3]= 1.0f; + + rect_float += 4; + } + } + + } + } +} + +static void checker_board_grid_fill(unsigned char *rect, float *rect_float, int width, int height, float blend) +{ + int x, y; + for(y= 0; y < height; y++) + { + for(x= 0; x < width; x++) + { + if( ((y % 32) == 0) || ((x % 32) == 0) || x == 0 ) + { + if (rect) { + rect[0]= BLEND_CHAR(rect[0], blend); + rect[1]= BLEND_CHAR(rect[1], blend); + rect[2]= BLEND_CHAR(rect[2], blend); + rect[3]= 255; + + rect += 4; + } + if (rect_float) { + rect_float[0]= BLEND_FLOAT(rect_float[0], blend); + rect_float[1]= BLEND_FLOAT(rect_float[1], blend); + rect_float[2]= BLEND_FLOAT(rect_float[2], blend); + rect_float[3]= 1.0f; + + rect_float += 4; + } + } + else { + if(rect_float) rect_float += 4; + if(rect) rect += 4; + } + } + } +} + +/* defined in image.c */ +extern int stamp_font_begin(int size); + +static void checker_board_text(unsigned char *rect, float *rect_float, int width, int height, int step, int outline) +{ + int x, y, mono; + int pen_x, pen_y; + char text[3]= {'A', '1', '\0'}; + + /* hard coded size! */ + mono= stamp_font_begin(54); + BLF_buffer(mono, rect_float, rect, width, height, 4); + + for(y= 0; y < height; y+=step) + { + text[1]= '1'; + + for(x= 0; x < width; x+=step) + { + /* hard coded offset */ + pen_x = x + 33; + pen_y = y + 44; + + /* terribly crappy outline font! */ + BLF_buffer_col(mono, 1.0, 1.0, 1.0, 1.0); + + BLF_position(mono, pen_x-outline, pen_y, 0.0); + BLF_draw_buffer(mono, text); + BLF_position(mono, pen_x+outline, pen_y, 0.0); + BLF_draw_buffer(mono, text); + BLF_position(mono, pen_x, pen_y-outline, 0.0); + BLF_draw_buffer(mono, text); + BLF_position(mono, pen_x, pen_y+outline, 0.0); + BLF_draw_buffer(mono, text); + + BLF_position(mono, pen_x-outline, pen_y-outline, 0.0); + BLF_draw_buffer(mono, text); + BLF_position(mono, pen_x+outline, pen_y+outline, 0.0); + BLF_draw_buffer(mono, text); + BLF_position(mono, pen_x-outline, pen_y+outline, 0.0); + BLF_draw_buffer(mono, text); + BLF_position(mono, pen_x+outline, pen_y-outline, 0.0); + BLF_draw_buffer(mono, text); + + BLF_buffer_col(mono, 0.0, 0.0, 0.0, 1.0); + BLF_position(mono, pen_x, pen_y, 0.0); + BLF_draw_buffer(mono, text); + + text[1]++; + } + text[0]++; + } + + /* cleanup the buffer. */ + BLF_buffer(mono, NULL, NULL, 0, 0, 0); +} + +void BKE_image_buf_fill_checker_color(unsigned char *rect, float *rect_float, int width, int height) +{ + checker_board_color_fill(rect, rect_float, width, height); + checker_board_color_tint(rect, rect_float, width, height, 1, 0.03f); + checker_board_color_tint(rect, rect_float, width, height, 4, 0.05f); + checker_board_color_tint(rect, rect_float, width, height, 32, 0.07f); + checker_board_color_tint(rect, rect_float, width, height, 128, 0.15f); + checker_board_grid_fill(rect, rect_float, width, height, 1.0f/4.0f); + + checker_board_text(rect, rect_float, width, height, 128, 2); +} diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c index 6912a65886a..902965bd2f6 100644 --- a/source/blender/blenkernel/intern/implicit.c +++ b/source/blender/blenkernel/intern/implicit.c @@ -31,15 +31,16 @@ #include "BKE_cloth.h" -#include "DNA_cloth_types.h" -#include "DNA_scene_types.h" #include "DNA_object_force.h" #include "BKE_effect.h" #include "BKE_global.h" -#include "BKE_cloth.h" #include "BKE_utildefines.h" +#include "BLI_threads.h" + +#define CLOTH_OPENMP_LIMIT 25 + #ifdef _WIN32 #include <windows.h> static LARGE_INTEGER _itstart, _itend; @@ -233,8 +234,11 @@ DO_INLINE float dot_lfvector(float (*fLongVectorA)[3], float (*fLongVectorB)[3], { long i = 0; float temp = 0.0; +// XXX brecht, disabled this for now (first schedule line was already disabled), +// due to non-commutative nature of floating point ops this makes the sim give +// different results each time you run it! // schedule(guided, 2) -#pragma omp parallel for reduction(+: temp) +//#pragma omp parallel for reduction(+: temp) if(verts > CLOTH_OPENMP_LIMIT) for(i = 0; i < (long)verts; i++) { temp += INPR(fLongVectorA[i], fLongVectorB[i]); @@ -580,11 +584,12 @@ DO_INLINE void mul_bfmatrix_S(fmatrix3x3 *matrix, float scalar) DO_INLINE void mul_bfmatrix_lfvector( float (*to)[3], fmatrix3x3 *from, lfVector *fLongVector) { unsigned int i = 0; - lfVector *temp = create_lfvector(from[0].vcount); + unsigned int vcount = from[0].vcount; + lfVector *temp = create_lfvector(vcount); - zero_lfvector(to, from[0].vcount); + zero_lfvector(to, vcount); -#pragma omp parallel sections private(i) +#pragma omp parallel sections private(i) if(vcount > CLOTH_OPENMP_LIMIT) { #pragma omp section { @@ -965,7 +970,7 @@ DO_INLINE void BuildPPinv(fmatrix3x3 *lA, fmatrix3x3 *P, fmatrix3x3 *Pinv) unsigned int i = 0; // Take only the diagonal blocks of A -// #pragma omp parallel for private(i) +// #pragma omp parallel for private(i) if(lA[0].vcount > CLOTH_OPENMP_LIMIT) for(i = 0; i<lA[0].vcount; i++) { // block diagonalizer @@ -1425,7 +1430,7 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec /* 10x10x10 grid gives nice initial results */ HairGridVert grid[10][10][10]; HairGridVert colg[10][10][10]; - ListBase *colliders = get_collider_cache(clmd->scene, NULL); + ListBase *colliders = get_collider_cache(clmd->scene, NULL, NULL); ColliderCache *col = NULL; float gmin[3], gmax[3], density; /* 2.0f is an experimental value that seems to give good results */ @@ -1463,6 +1468,8 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec i = HAIR_GRID_INDEX(lX[v], gmin, gmax, 0); j = HAIR_GRID_INDEX(lX[v], gmin, gmax, 1); k = HAIR_GRID_INDEX(lX[v], gmin, gmax, 2); + if (i < 0 || j < 0 || k < 0 || i > 10 || j >= 10 || k >= 10) + continue; grid[i][j][k].velocity[0] += lV[v][0]; grid[i][j][k].velocity[1] += lV[v][1]; @@ -1526,6 +1533,8 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec i = HAIR_GRID_INDEX(lX[v], gmin, gmax, 0); j = HAIR_GRID_INDEX(lX[v], gmin, gmax, 1); k = HAIR_GRID_INDEX(lX[v], gmin, gmax, 2); + if (i < 0 || j < 0 || k < 0 || i > 10 || j >= 10 || k >= 10) + continue; lF[v][0] += smoothfac * (grid[i][j][k].velocity[0] - lV[v][0]); lF[v][1] += smoothfac * (grid[i][j][k].velocity[1] - lV[v][1]); @@ -1540,6 +1549,7 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec free_collider_cache(&colliders); } + static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M) { /* Collect forces and derivatives: F,dFdX,dFdV */ @@ -1734,9 +1744,10 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase ClothVertex *verts = cloth->verts; unsigned int numverts = cloth->numverts; float dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame; + float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale; Implicit_Data *id = cloth->implicit; - int result = 0; - + int do_extra_solve; + if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) /* do goal stuff */ { for(i = 0; i < numverts; i++) @@ -1781,60 +1792,50 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase if(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED && clmd->clothObject->bvhtree) { - float temp = clmd->sim_parms->stepsPerFrame; - /* not too nice hack, but collisions need this correction -jahka */ - clmd->sim_parms->stepsPerFrame /= clmd->sim_parms->timescale; - // collisions // itstart(); // update verts to current positions for(i = 0; i < numverts; i++) - { + { VECCOPY(verts[i].tx, id->Xnew[i]); - + VECSUB(verts[i].tv, verts[i].tx, verts[i].txold); VECCOPY(verts[i].v, verts[i].tv); } - + // call collision function // TODO: check if "step" or "step+dt" is correct - dg - result = cloth_bvh_objcollision(ob, clmd, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale); - - // correct velocity again, just to be sure we had to change it due to adaptive collisions - for(i = 0; i < numverts; i++) - { - VECSUB(verts[i].tv, verts[i].tx, id->X[i]); - } + do_extra_solve = cloth_bvh_objcollision(ob, clmd, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale); // copy corrected positions back to simulation for(i = 0; i < numverts; i++) { - if(result) + // correct velocity again, just to be sure we had to change it due to adaptive collisions + VECSUB(verts[i].tv, verts[i].tx, id->X[i]); + + if(do_extra_solve) { if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED)) continue; - + VECCOPY(id->Xnew[i], verts[i].tx); VECCOPY(id->Vnew[i], verts[i].tv); - mul_v3_fl(id->Vnew[i], clmd->sim_parms->stepsPerFrame); + mul_v3_fl(id->Vnew[i], spf); } } - /* restore original stepsPerFrame */ - clmd->sim_parms->stepsPerFrame = temp; - // X = Xnew; cp_lfvector(id->X, id->Xnew, numverts); - + // if there were collisions, advance the velocity from v_n+1/2 to v_n+1 - if(result) + if(do_extra_solve) { // V = Vnew; cp_lfvector(id->V, id->Vnew, numverts); - + // calculate cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step+dt, id->M); @@ -1854,7 +1855,6 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase cp_lfvector(id->V, id->Vnew, numverts); step += dt; - } for(i = 0; i < numverts; i++) diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index dbde6403226..cd8ab8290e5 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -41,54 +41,33 @@ #include <string.h> #include <stddef.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_curve_types.h" #include "DNA_camera_types.h" #include "DNA_lamp_types.h" #include "DNA_ipo_types.h" #include "DNA_key_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" #include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_particle_types.h" #include "DNA_sequence_types.h" #include "DNA_scene_types.h" -#include "DNA_sound_types.h" -#include "DNA_texture_types.h" -#include "DNA_view3d_types.h" #include "DNA_world_types.h" +#include "BLI_math.h" /* windows needs for M_PI */ #include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_dynstr.h" #include "BKE_utildefines.h" #include "BKE_animsys.h" #include "BKE_action.h" -#include "BKE_blender.h" -#include "BKE_curve.h" -#include "BKE_constraint.h" #include "BKE_fcurve.h" #include "BKE_global.h" -#include "BKE_ipo.h" -#include "BKE_library.h" #include "BKE_main.h" -#include "BKE_mesh.h" #include "BKE_nla.h" -#include "BKE_object.h" - +#include "BKE_sequencer.h" /* *************************************************** */ @@ -813,12 +792,12 @@ static char *particle_adrcodes_to_paths (int adrcode, int *array_index) /* Allocate memory for RNA-path for some property given a blocktype, adrcode, and 'root' parts of path * Input: * - blocktype, adrcode - determines setting to get - * - actname, constname - used to build path + * - actname, constname,seq - used to build path * Output: * - array_index - index in property's array (if applicable) to use * - return - the allocated path... */ -static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], int *array_index) +static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], Sequence * seq, int *array_index) { DynStr *path= BLI_dynstr_new(); char *propname=NULL, *rpath=NULL; @@ -870,19 +849,19 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co case ID_WO: /* world */ propname= world_adrcodes_to_paths(adrcode, &dummy_index); break; - + case ID_PA: /* particle */ propname= particle_adrcodes_to_paths(adrcode, &dummy_index); break; - /* XXX problematic blocktypes */ case ID_CU: /* curve */ /* this used to be a 'dummy' curve which got evaluated on the fly... * now we've got real var for this! */ propname= "eval_time"; break; - + + /* XXX problematic blocktypes */ case ID_SEQ: /* sequencer strip */ //SEQ_FAC1: switch (adrcode) { @@ -940,6 +919,11 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co /* Constraint in Object */ sprintf(buf, "constraints[\"%s\"]", constname); } + else if (seq) { + /* Sequence names in Scene */ + sprintf(buf, "sequence_editor.sequences_all[\"%s\"]", + seq->name+2); + } else strcpy(buf, ""); /* empty string */ BLI_dynstr_append(path, buf); @@ -1051,6 +1035,7 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver) if (idriver->name[0]) BLI_strncpy(dtar->pchan_name, idriver->name, 32); dtar->transChan= adrcode_to_dtar_transchan(idriver->adrcode); + dtar->flag |= DTAR_FLAG_LOCALSPACE; /* old drivers took local space */ } } else { /* Object */ @@ -1083,7 +1068,7 @@ static void fcurve_add_to_list (ListBase *groups, ListBase *list, FCurve *fcu, c bActionGroup *agrp= NULL; /* init the temp action */ - //memset(&tmp_act, 0, sizeof(bAction)); // XXX only enable this line if we get errors + memset(&tmp_act, 0, sizeof(bAction)); // XXX only enable this line if we get errors tmp_act.groups.first= groups->first; tmp_act.groups.last= groups->last; tmp_act.curves.first= list->first; @@ -1099,8 +1084,8 @@ static void fcurve_add_to_list (ListBase *groups, ListBase *list, FCurve *fcu, c agrp= MEM_callocN(sizeof(bActionGroup), "bActionGroup"); agrp->flag = AGRP_SELECTED; - if(muteipo) agrp->flag |= AGRP_MUTED; - + if (muteipo) agrp->flag |= AGRP_MUTED; + strncpy(agrp->name, grpname, sizeof(agrp->name)); BLI_addtail(&tmp_act.groups, agrp); @@ -1112,9 +1097,9 @@ static void fcurve_add_to_list (ListBase *groups, ListBase *list, FCurve *fcu, c /* WARNING: this func should only need to look at the stuff we initialised, if not, things may crash */ action_groups_add_channel(&tmp_act, agrp, fcu); - if(agrp->flag & AGRP_MUTED) /* flush down */ + if (agrp->flag & AGRP_MUTED) /* flush down */ fcu->flag |= FCURVE_MUTED; - + /* set the output lists based on the ones in the temp action */ groups->first= tmp_act.groups.first; groups->last= tmp_act.groups.last; @@ -1131,8 +1116,9 @@ static void fcurve_add_to_list (ListBase *groups, ListBase *list, FCurve *fcu, c * is not relevant, BUT do not free the IPO-Curve itself... * actname: name of Action-Channel (if applicable) that IPO-Curve's IPO-block belonged to * constname: name of Constraint-Channel (if applicable) that IPO-Curve's IPO-block belonged to + * seq: sequencer-strip (if applicable) that IPO-Curve's IPO-block belonged to */ -static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, char *actname, char *constname, int muteipo) +static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *icu, char *actname, char *constname, Sequence * seq, int muteipo) { AdrBit2Path *abp; FCurve *fcu; @@ -1255,7 +1241,7 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha /* get rna-path * - we will need to set the 'disabled' flag if no path is able to be made (for now) */ - fcu->rna_path= get_rna_access(icu->blocktype, icu->adrcode, actname, constname, &fcu->array_index); + fcu->rna_path= get_rna_access(icu->blocktype, icu->adrcode, actname, constname, seq, &fcu->array_index); if (fcu->rna_path == NULL) fcu->flag |= FCURVE_DISABLED; @@ -1297,6 +1283,20 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha dst->vec[2][1] *= fac; } + /* correct values for path speed curves + * - their values were 0-1 + * - we now need as 'frames' + */ + if ( (id) && (icu->blocktype == GS(id->name)) && + (fcu->rna_path && strcmp(fcu->rna_path, "eval_time")==0) ) + { + Curve *cu = (Curve *)id; + + dst->vec[0][1] *= cu->pathlen; + dst->vec[1][1] *= cu->pathlen; + dst->vec[2][1] *= cu->pathlen; + } + /* correct times for rotation drivers * - need to go from degrees to radians... * - there's only really 1 target to worry about @@ -1313,6 +1313,24 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha dst->vec[2][0] *= fac; } } + + /* correct values for sequencer curves, + that were not locked to frame */ + + if (seq && + (seq->flag & SEQ_IPO_FRAME_LOCKED) == 0) { + double mul= (seq->enddisp-seq->startdisp)/100.0f; + double offset= seq->startdisp; + + dst->vec[0][0] *= mul; + dst->vec[0][0] += offset; + + dst->vec[1][0] *= mul; + dst->vec[1][0] += offset; + + dst->vec[2][0] *= mul; + dst->vec[2][0] += offset; + } } } else if (icu->bp) { @@ -1332,7 +1350,7 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha * This does not assume that any ID or AnimData uses it, but does assume that * it is given two lists, which it will perform driver/animation-data separation. */ -static void ipo_to_animato (Ipo *ipo, char actname[], char constname[], ListBase *animgroups, ListBase *anim, ListBase *drivers) +static void ipo_to_animato (ID *id, Ipo *ipo, char actname[], char constname[], Sequence * seq, ListBase *animgroups, ListBase *anim, ListBase *drivers) { IpoCurve *icu; @@ -1363,7 +1381,7 @@ static void ipo_to_animato (Ipo *ipo, char actname[], char constname[], ListBase if (icu->driver) { /* Blender 2.4x allowed empty drivers, but we don't now, since they cause more trouble than they're worth */ if ((icu->driver->ob) || (icu->driver->type == IPO_DRIVER_TYPE_PYTHON)) { - icu_to_fcurves(NULL, drivers, icu, actname, constname, ipo->muteipo); + icu_to_fcurves(id, NULL, drivers, icu, actname, constname, seq, ipo->muteipo); } else { MEM_freeN(icu->driver); @@ -1371,7 +1389,7 @@ static void ipo_to_animato (Ipo *ipo, char actname[], char constname[], ListBase } } else - icu_to_fcurves(animgroups, anim, icu, actname, constname, ipo->muteipo); + icu_to_fcurves(id, animgroups, anim, icu, actname, constname, seq, ipo->muteipo); } /* if this IPO block doesn't have any users after this one, free... */ @@ -1402,7 +1420,7 @@ static void ipo_to_animato (Ipo *ipo, char actname[], char constname[], ListBase * to Objects, where ob->ipo and ob->action need to be combined). * NOTE: we need to be careful here, as same data-structs are used for new system too! */ -static void action_to_animato (bAction *act, ListBase *groups, ListBase *curves, ListBase *drivers) +static void action_to_animato (ID *id, bAction *act, ListBase *groups, ListBase *curves, ListBase *drivers) { bActionChannel *achan, *achann; bConstraintChannel *conchan, *conchann; @@ -1423,7 +1441,7 @@ static void action_to_animato (bAction *act, ListBase *groups, ListBase *curves, /* convert Action Channel's IPO data */ if (achan->ipo) { - ipo_to_animato(achan->ipo, achan->name, NULL, groups, curves, drivers); + ipo_to_animato(id, achan->ipo, achan->name, NULL, NULL, groups, curves, drivers); achan->ipo->id.us--; achan->ipo= NULL; } @@ -1435,7 +1453,7 @@ static void action_to_animato (bAction *act, ListBase *groups, ListBase *curves, /* convert Constraint Channel's IPO data */ if (conchan->ipo) { - ipo_to_animato(conchan->ipo, achan->name, conchan->name, groups, curves, drivers); + ipo_to_animato(id, conchan->ipo, achan->name, conchan->name, NULL, groups, curves, drivers); conchan->ipo->id.us--; conchan->ipo= NULL; } @@ -1456,7 +1474,7 @@ static void action_to_animato (bAction *act, ListBase *groups, ListBase *curves, * This assumes that AnimData has been added already. Separation of drivers * from animation data is accomplished here too... */ -static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[]) +static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[], Sequence * seq) { AnimData *adt= BKE_animdata_from_id(id); ListBase anim = {NULL, NULL}; @@ -1471,8 +1489,8 @@ static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[]) } if (G.f & G_DEBUG) { - printf("ipo to animdata - ID:%s, IPO:%s, actname:%s constname:%s curves:%d \n", - id->name+2, ipo->id.name+2, (actname)?actname:"<None>", (constname)?constname:"<None>", + printf("ipo to animdata - ID:%s, IPO:%s, actname:%s constname:%s seqname:%s curves:%d \n", + id->name+2, ipo->id.name+2, (actname)?actname:"<None>", (constname)?constname:"<None>", (seq)?(seq->name+2):"<None>", BLI_countlist(&ipo->curve)); } @@ -1480,7 +1498,7 @@ static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[]) * and the try to put these lists in the right places, but do not free the lists here */ // XXX there shouldn't be any need for the groups, so don't supply pointer for that now... - ipo_to_animato(ipo, actname, constname, NULL, &anim, &drivers); + ipo_to_animato(id, ipo, actname, constname, seq, NULL, &anim, &drivers); /* deal with animation first */ if (anim.first) { @@ -1522,7 +1540,7 @@ static void action_to_animdata (ID *id, bAction *act) } /* convert Action data */ - action_to_animato(act, &adt->action->groups, &adt->action->curves, &adt->drivers); + action_to_animato(id, act, &adt->action->groups, &adt->action->curves, &adt->drivers); } /* ------------------------- */ @@ -1546,7 +1564,7 @@ static void nlastrips_to_animdata (ID *id, ListBase *strips) /* this old strip is only worth something if it had an action... */ if (as->act) { /* convert Action data (if not yet converted), storing the results in the same Action */ - action_to_animato(as->act, &as->act->groups, &as->act->curves, &adt->drivers); + action_to_animato(id, as->act, &as->act->groups, &as->act->curves, &adt->drivers); /* create a new-style NLA-strip which references this Action, then copy over relevant settings */ { @@ -1625,7 +1643,6 @@ void do_versions_ipos_to_animato(Main *main) ListBase drivers = {NULL, NULL}; ID *id; AnimData *adt; - Scene *scene; if (main == NULL) { printf("Argh! Main is NULL in do_versions_ipos_to_animato() \n"); @@ -1633,13 +1650,12 @@ void do_versions_ipos_to_animato(Main *main) } /* only convert if version is right */ - // XXX??? if (main->versionfile >= 250) { printf("WARNING: Animation data too new to convert (Version %d) \n", main->versionfile); return; } - else - printf("INFO: Converting to Animato... \n"); // xxx debug + else if (G.f & G_DEBUG) + printf("INFO: Converting to Animato... \n"); /* ----------- Animation Attached to Data -------------- */ @@ -1659,7 +1675,7 @@ void do_versions_ipos_to_animato(Main *main) /* IPO first to take into any non-NLA'd Object Animation */ if (ob->ipo) { - ipo_to_animdata(id, ob->ipo, NULL, NULL); + ipo_to_animdata(id, ob->ipo, NULL, NULL, NULL); ob->ipo->id.us--; ob->ipo= NULL; @@ -1693,7 +1709,7 @@ void do_versions_ipos_to_animato(Main *main) /* IPO second... */ if (ob->ipo) { - ipo_to_animdata(id, ob->ipo, NULL, NULL); + ipo_to_animdata(id, ob->ipo, NULL, NULL, NULL); ob->ipo->id.us--; ob->ipo= NULL; } @@ -1713,7 +1729,7 @@ void do_versions_ipos_to_animato(Main *main) /* although this was the constraint's local IPO, we still need to provide pchan + con * so that drivers can be added properly... */ - ipo_to_animdata(id, con->ipo, pchan->name, con->name); + ipo_to_animdata(id, con->ipo, pchan->name, con->name, NULL); con->ipo->id.us--; con->ipo= NULL; } @@ -1733,7 +1749,7 @@ void do_versions_ipos_to_animato(Main *main) /* although this was the constraint's local IPO, we still need to provide con * so that drivers can be added properly... */ - ipo_to_animdata(id, con->ipo, NULL, con->name); + ipo_to_animdata(id, con->ipo, NULL, con->name, NULL); con->ipo->id.us--; con->ipo= NULL; } @@ -1753,7 +1769,7 @@ void do_versions_ipos_to_animato(Main *main) /* convert Constraint Channel's IPO data */ if (conchan->ipo) { - ipo_to_animdata(id, conchan->ipo, NULL, conchan->name); + ipo_to_animdata(id, conchan->ipo, NULL, conchan->name, NULL); conchan->ipo->id.us--; conchan->ipo= NULL; } @@ -1779,7 +1795,7 @@ void do_versions_ipos_to_animato(Main *main) adt= BKE_id_add_animdata(id); /* Convert Shapekey data... */ - ipo_to_animdata(id, key->ipo, NULL, NULL); + ipo_to_animdata(id, key->ipo, NULL, NULL, NULL); key->ipo->id.us--; key->ipo= NULL; } @@ -1797,7 +1813,7 @@ void do_versions_ipos_to_animato(Main *main) adt= BKE_id_add_animdata(id); /* Convert Material data... */ - ipo_to_animdata(id, ma->ipo, NULL, NULL); + ipo_to_animdata(id, ma->ipo, NULL, NULL, NULL); ma->ipo->id.us--; ma->ipo= NULL; } @@ -1815,27 +1831,30 @@ void do_versions_ipos_to_animato(Main *main) adt= BKE_id_add_animdata(id); /* Convert World data... */ - ipo_to_animdata(id, wo->ipo, NULL, NULL); + ipo_to_animdata(id, wo->ipo, NULL, NULL, NULL); wo->ipo->id.us--; wo->ipo= NULL; } } /* sequence strips */ - for(scene = main->scene.first; scene; scene = scene->id.next) { - if(scene->ed && scene->ed->seqbasep) { + for (id= main->scene.first; id; id= id->next) { + Scene *scene = (Scene *)id; + Editing * ed = scene->ed; + if (ed && ed->seqbasep) { Sequence * seq; - for(seq = scene->ed->seqbasep->first; - seq; seq = seq->next) { + adt= BKE_id_add_animdata(id); + + SEQ_BEGIN(ed, seq) { + IpoCurve *icu = (seq->ipo) ? seq->ipo->curve.first : NULL; short adrcode = SEQ_FAC1; if (G.f & G_DEBUG) printf("\tconverting sequence strip %s \n", seq->name+2); - if (!seq->ipo || !seq->ipo->curve.first) { - seq->flag |= - SEQ_USE_EFFECT_DEFAULT_FADE; + if (ELEM(NULL, seq->ipo, icu)) { + seq->flag |= SEQ_USE_EFFECT_DEFAULT_FADE; continue; } @@ -1844,24 +1863,25 @@ void do_versions_ipos_to_animato(Main *main) (semi-hack (tm) ) */ switch(seq->type) { - case SEQ_IMAGE: - case SEQ_META: - case SEQ_SCENE: - case SEQ_MOVIE: - case SEQ_COLOR: - adrcode = SEQ_FAC_OPACITY; - break; - case SEQ_SPEED: - adrcode = SEQ_FAC_SPEED; - break; + case SEQ_IMAGE: + case SEQ_META: + case SEQ_SCENE: + case SEQ_MOVIE: + case SEQ_COLOR: + adrcode = SEQ_FAC_OPACITY; + break; + case SEQ_SPEED: + adrcode = SEQ_FAC_SPEED; + break; } - ((IpoCurve*) seq->ipo->curve.first) - ->adrcode = adrcode; - ipo_to_animdata((ID*) seq, seq->ipo, - NULL, NULL); + icu->adrcode = adrcode; + + /* convert IPO */ + ipo_to_animdata((ID *)scene, seq->ipo, NULL, NULL, seq); seq->ipo->id.us--; seq->ipo = NULL; } + SEQ_END } } @@ -1878,7 +1898,7 @@ void do_versions_ipos_to_animato(Main *main) adt= BKE_id_add_animdata(id); /* Convert Texture data... */ - ipo_to_animdata(id, te->ipo, NULL, NULL); + ipo_to_animdata(id, te->ipo, NULL, NULL, NULL); te->ipo->id.us--; te->ipo= NULL; } @@ -1896,7 +1916,7 @@ void do_versions_ipos_to_animato(Main *main) adt= BKE_id_add_animdata(id); /* Convert Camera data... */ - ipo_to_animdata(id, ca->ipo, NULL, NULL); + ipo_to_animdata(id, ca->ipo, NULL, NULL, NULL); ca->ipo->id.us--; ca->ipo= NULL; } @@ -1914,12 +1934,30 @@ void do_versions_ipos_to_animato(Main *main) adt= BKE_id_add_animdata(id); /* Convert Lamp data... */ - ipo_to_animdata(id, la->ipo, NULL, NULL); + ipo_to_animdata(id, la->ipo, NULL, NULL, NULL); la->ipo->id.us--; la->ipo= NULL; } } + /* curves */ + for (id= main->curve.first; id; id= id->next) { + Curve *cu= (Curve *)id; + + if (G.f & G_DEBUG) printf("\tconverting curve %s \n", id->name+2); + + /* we're only interested in the IPO */ + if (cu->ipo) { + /* Add AnimData block */ + adt= BKE_id_add_animdata(id); + + /* Convert Curve data... */ + ipo_to_animdata(id, cu->ipo, NULL, NULL, NULL); + cu->ipo->id.us--; + cu->ipo= NULL; + } + } + /* --------- Unconverted Animation Data ------------------ */ /* For Animation data which may not be directly connected (i.e. not linked) to any other * data, we need to perform a separate pass to make sure that they are converted to standalone @@ -1938,7 +1976,7 @@ void do_versions_ipos_to_animato(Main *main) if (G.f & G_DEBUG) printf("\tconverting action %s \n", id->name+2); /* be careful! some of the actions we encounter will be converted ones... */ - action_to_animato(act, &act->groups, &act->curves, &drivers); + action_to_animato(NULL, act, &act->groups, &act->curves, &drivers); } /* ipo's */ @@ -1953,7 +1991,7 @@ void do_versions_ipos_to_animato(Main *main) /* add a new action for this, and convert all data into that action */ new_act= add_empty_action("ConvIPO_Action"); // XXX need a better name... - ipo_to_animato(ipo, NULL, NULL, NULL, &new_act->curves, &drivers); + ipo_to_animato(NULL, ipo, NULL, NULL, NULL, NULL, &new_act->curves, &drivers); } /* clear fake-users, and set user-count to zero to make sure it is cleared on file-save */ @@ -1964,6 +2002,7 @@ void do_versions_ipos_to_animato(Main *main) /* free unused drivers from actions + ipos */ free_fcurves(&drivers); - printf("INFO: Animato convert done \n"); // xxx debug + if (G.f & G_DEBUG) + printf("INFO: Animato convert done \n"); } diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index c32b2d81513..efbc09692a9 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -38,26 +38,22 @@ #include "BLI_blenlib.h" #include "BLI_editVert.h" +#include "BLI_math_vector.h" #include "DNA_anim_types.h" -#include "DNA_curve_types.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_animsys.h" -#include "BKE_action.h" -#include "BKE_blender.h" #include "BKE_curve.h" #include "BKE_customdata.h" #include "BKE_global.h" #include "BKE_key.h" #include "BKE_lattice.h" #include "BKE_library.h" -#include "BKE_mesh.h" #include "BKE_tessmesh.h" #include "BKE_main.h" #include "BKE_object.h" @@ -67,10 +63,6 @@ #include "BLI_cellalloc.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #define KEY_BPOINT 1 #define KEY_BEZTRIPLE 2 @@ -227,11 +219,11 @@ Key *copy_key_nolib(Key *key) void make_local_key(Key *key) { - /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ - if(key==0) return; + /* - only lib users: do nothing + * - only local users: set flag + * - mixed: make copy + */ + if(key==0) return; key->id.lib= 0; new_id(0, (ID *)key, 0); @@ -1778,3 +1770,202 @@ void key_to_mesh(KeyBlock *kb, Mesh *me) VECCOPY(mvert->co, fp); } } + +/************************* vert coords ************************/ +float (*key_to_vertcos(Object *ob, KeyBlock *kb))[3] +{ + float (*vertCos)[3], *co; + float *fp= kb->data; + int tot= 0, a; + + /* Count of vertex coords in array */ + if(ob->type == OB_MESH) { + Mesh *me= (Mesh*)ob->data; + tot= me->totvert; + } else if(ob->type == OB_LATTICE) { + Lattice *lt= (Lattice*)ob->data; + tot= lt->pntsu*lt->pntsv*lt->pntsw; + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { + Curve *cu= (Curve*)ob->data; + tot= count_curveverts(&cu->nurb); + } + + if (tot == 0) return NULL; + + vertCos= MEM_callocN(tot*sizeof(*vertCos), "key_to_vertcos vertCos"); + + /* Copy coords to array */ + co= (float*)vertCos; + + if(ELEM(ob->type, OB_MESH, OB_LATTICE)) { + for (a= 0; a<tot; a++, fp+=3, co+=3) { + copy_v3_v3(co, fp); + } + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { + Curve *cu= (Curve*)ob->data; + Nurb *nu= cu->nurb.first; + BezTriple *bezt; + BPoint *bp; + + while (nu) { + if(nu->bezt) { + int i; + bezt= nu->bezt; + a= nu->pntsu; + + while (a--) { + for (i= 0; i<3; i++) { + copy_v3_v3(co, fp); + fp+= 3; co+= 3; + } + + fp+= 3; /* skip alphas */ + + bezt++; + } + } + else { + bp= nu->bp; + a= nu->pntsu*nu->pntsv; + + while (a--) { + copy_v3_v3(co, fp); + + fp+= 4; + co+= 3; + + bp++; + } + } + + nu= nu->next; + } + } + + return vertCos; +} + +void vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3]) +{ + float *co= (float*)vertCos, *fp; + int tot= 0, a, elemsize; + + if (kb->data) MEM_freeN(kb->data); + + /* Count of vertex coords in array */ + if(ob->type == OB_MESH) { + Mesh *me= (Mesh*)ob->data; + tot= me->totvert; + elemsize= me->key->elemsize; + } else if(ob->type == OB_LATTICE) { + Lattice *lt= (Lattice*)ob->data; + tot= lt->pntsu*lt->pntsv*lt->pntsw; + elemsize= lt->key->elemsize; + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { + Curve *cu= (Curve*)ob->data; + elemsize= cu->key->elemsize; + tot= count_curveverts(&cu->nurb); + } + + fp= kb->data= MEM_callocN(tot*elemsize, "key_to_vertcos vertCos"); + + if (tot == 0) return; + + /* Copy coords to keyblock */ + + if(ELEM(ob->type, OB_MESH, OB_LATTICE)) { + for (a= 0; a<tot; a++, fp+=3, co+=3) { + copy_v3_v3(fp, co); + } + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { + Curve *cu= (Curve*)ob->data; + Nurb *nu= cu->nurb.first; + BezTriple *bezt; + BPoint *bp; + + while (nu) { + if(nu->bezt) { + int i; + bezt= nu->bezt; + a= nu->pntsu; + + while (a--) { + for (i= 0; i<3; i++) { + copy_v3_v3(fp, co); + fp+= 3; co+= 3; + } + + fp+= 3; /* skip alphas */ + + bezt++; + } + } + else { + bp= nu->bp; + a= nu->pntsu*nu->pntsv; + + while (a--) { + copy_v3_v3(fp, co); + + fp+= 4; + co+= 3; + + bp++; + } + } + + nu= nu->next; + } + } +} + +void offset_to_key(Object *ob, KeyBlock *kb, float (*ofs)[3]) +{ + int a; + float *co= (float*)ofs, *fp= kb->data; + + if(ELEM(ob->type, OB_MESH, OB_LATTICE)) { + for (a= 0; a<kb->totelem; a++, fp+=3, co+=3) { + add_v3_v3(fp, co); + } + } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { + Curve *cu= (Curve*)ob->data; + Nurb *nu= cu->nurb.first; + BezTriple *bezt; + BPoint *bp; + + while (nu) { + if(nu->bezt) { + int i; + bezt= nu->bezt; + a= nu->pntsu; + + while (a--) { + for (i= 0; i<3; i++) { + add_v3_v3(fp, co); + fp+= 3; co+= 3; + } + + fp+= 3; /* skip alphas */ + + bezt++; + } + } + else { + bp= nu->bp; + a= nu->pntsu*nu->pntsv; + + while (a--) { + add_v3_v3(fp, co); + + fp+= 4; + co+= 3; + + bp++; + } + } + + nu= nu->next; + } + } +} diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 211f3d07cf4..55934c0af5c 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -42,22 +42,15 @@ #include "BLI_math.h" #include "BLI_cellalloc.h" -#include "DNA_armature_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_lattice_types.h" #include "DNA_curve_types.h" #include "DNA_key_types.h" #include "BKE_anim.h" -#include "BKE_armature.h" -#include "BKE_curve.h" #include "BKE_cdderivedmesh.h" -#include "BKE_DerivedMesh.h" -#include "BKE_deform.h" #include "BKE_displist.h" #include "BKE_global.h" #include "BKE_key.h" @@ -66,9 +59,8 @@ #include "BKE_main.h" #include "BKE_mesh.h" #include "BKE_modifier.h" -#include "BKE_object.h" -#include "BKE_screen.h" #include "BKE_utildefines.h" +#include "BKE_deform.h" //XXX #include "BIF_editdeform.h" @@ -348,19 +340,29 @@ void calc_latt_deform(Object *ob, float *co, float weight) { Lattice *lt= ob->data; float u, v, w, tu[4], tv[4], tw[4]; - float *fpw, *fpv, *fpu, vec[3]; + float vec[3]; + int idx_w, idx_v, idx_u; int ui, vi, wi, uu, vv, ww; - + + /* vgroup influence */ + int defgroup_nr= -1; + float co_prev[3], weight_blend= 0.0f; + MDeformVert *dvert= lattice_get_deform_verts(ob); + + if(lt->editlatt) lt= lt->editlatt; if(lt->latticedata==NULL) return; - + + if(lt->vgroup[0] && dvert) { + defgroup_nr= defgroup_name_index(ob, lt->vgroup); + copy_v3_v3(co_prev, co); + } + /* co is in local coords, treat with latmat */ - - VECCOPY(vec, co); - mul_m4_v3(lt->latmat, vec); - + mul_v3_m4v3(vec, lt->latmat, co); + /* u v w coords */ - + if(lt->pntsu>1) { u= (vec[0]-lt->fu)/lt->du; ui= (int)floor(u); @@ -371,7 +373,7 @@ void calc_latt_deform(Object *ob, float *co, float weight) tu[0]= tu[2]= tu[3]= 0.0; tu[1]= 1.0; ui= 0; } - + if(lt->pntsv>1) { v= (vec[1]-lt->fv)/lt->dv; vi= (int)floor(v); @@ -382,7 +384,7 @@ void calc_latt_deform(Object *ob, float *co, float weight) tv[0]= tv[2]= tv[3]= 0.0; tv[1]= 1.0; vi= 0; } - + if(lt->pntsw>1) { w= (vec[2]-lt->fw)/lt->dw; wi= (int)floor(w); @@ -393,46 +395,51 @@ void calc_latt_deform(Object *ob, float *co, float weight) tw[0]= tw[2]= tw[3]= 0.0; tw[1]= 1.0; wi= 0; } - + for(ww= wi-1; ww<=wi+2; ww++) { w= tw[ww-wi+1]; - + if(w!=0.0) { if(ww>0) { - if(ww<lt->pntsw) fpw= lt->latticedata + 3*ww*lt->pntsu*lt->pntsv; - else fpw= lt->latticedata + 3*(lt->pntsw-1)*lt->pntsu*lt->pntsv; + if(ww<lt->pntsw) idx_w= ww*lt->pntsu*lt->pntsv; + else idx_w= (lt->pntsw-1)*lt->pntsu*lt->pntsv; } - else fpw= lt->latticedata; - + else idx_w= 0; + for(vv= vi-1; vv<=vi+2; vv++) { v= w*tv[vv-vi+1]; - + if(v!=0.0) { if(vv>0) { - if(vv<lt->pntsv) fpv= fpw + 3*vv*lt->pntsu; - else fpv= fpw + 3*(lt->pntsv-1)*lt->pntsu; + if(vv<lt->pntsv) idx_v= idx_w + vv*lt->pntsu; + else idx_v= idx_w + (lt->pntsv-1)*lt->pntsu; } - else fpv= fpw; - + else idx_v= idx_w; + for(uu= ui-1; uu<=ui+2; uu++) { u= weight*v*tu[uu-ui+1]; - + if(u!=0.0) { if(uu>0) { - if(uu<lt->pntsu) fpu= fpv + 3*uu; - else fpu= fpv + 3*(lt->pntsu-1); + if(uu<lt->pntsu) idx_u= idx_v + uu; + else idx_u= idx_v + (lt->pntsu-1); } - else fpu= fpv; - - co[0]+= u*fpu[0]; - co[1]+= u*fpu[1]; - co[2]+= u*fpu[2]; + else idx_u= idx_v; + + madd_v3_v3fl(co, <->latticedata[idx_u * 3], u); + + if(defgroup_nr != -1) + weight_blend += (u * defvert_find_weight(dvert + idx_u, defgroup_nr)); } } } } } } + + if(defgroup_nr != -1) + interp_v3_v3v3(co, co_prev, co, weight_blend); + } void end_latt_deform(Object *ob) @@ -491,7 +498,7 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir, else ctime1= ctime; /* vec needs 4 items */ - if(where_on_path(ob, ctime1, vec, dir, quat, radius)) { + if(where_on_path(ob, ctime1, vec, dir, quat, radius, NULL)) { if(cycl==0) { Path *path= cu->path; @@ -510,6 +517,7 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir, VECADD(vec, vec, dvec); if(quat) QUATCOPY(quat, path->data[path->len-1].quat); if(radius) *radius= path->data[path->len-1].radius; + /* weight - not used but could be added */ } } return 1; @@ -724,7 +732,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, DerivedMesh /* find the group (weak loop-in-loop) */ for(index = 0, curdef = target->defbase.first; curdef; - curdef = curdef->next, index++) + curdef = curdef->next, index++) if (!strcmp(curdef->name, vgroup)) break; @@ -756,7 +764,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, DerivedMesh VECCOPY(vec, vertexCos[a]); calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, - dvert->dw[j].weight); + dvert->dw[j].weight); mul_m4_v3(cd.objectspace, vertexCos[a]); break; } @@ -814,7 +822,7 @@ void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, float *orco } void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts, char *vgroup) + float (*vertexCos)[3], int numVerts, char *vgroup) { int a; int use_vgroups; @@ -838,26 +846,20 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, use_vgroups = 0; if(vgroup && vgroup[0] && use_vgroups) { - bDeformGroup *curdef; Mesh *me = target->data; - int index = 0; - - /* find the group (weak loop-in-loop) */ - for(curdef = target->defbase.first; curdef; - curdef = curdef->next, index++) - if(!strcmp(curdef->name, vgroup)) break; + int index = defgroup_name_index(target, vgroup); + float weight; - if(curdef && (me->dvert || dm)) { + if(index >= 0 && (me->dvert || dm)) { MDeformVert *dvert = me->dvert; - int j; for(a = 0; a < numVerts; a++, dvert++) { if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT); - for(j = 0; j < dvert->totweight; j++) { - if (dvert->dw[j].def_nr == index) { - calc_latt_deform(laOb, vertexCos[a], dvert->dw[j].weight); - } - } + + weight= defvert_find_weight(dvert, index); + + if(weight > 0.0f) + calc_latt_deform(laOb, vertexCos[a], weight); } } } else { @@ -868,14 +870,14 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, end_latt_deform(laOb); } -int object_deform_mball(Object *ob) +int object_deform_mball(Object *ob, ListBase *dispbase) { if(ob->parent && ob->parent->type==OB_LATTICE && ob->partype==PARSKEL) { DispList *dl; - for (dl=ob->disp.first; dl; dl=dl->next) { + for (dl=dispbase->first; dl; dl=dl->next) { lattice_deform_verts(ob->parent, ob, NULL, - (float(*)[3]) dl->verts, dl->nr, NULL); + (float(*)[3]) dl->verts, dl->nr, NULL); } return 1; diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index a7cafd1e0b4..d6a3dc8d983 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -40,24 +40,14 @@ #include <stdlib.h> #include <stddef.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" /* all types are needed here, in order to do memory operations */ -#include "DNA_ID.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" -#include "DNA_object_types.h" #include "DNA_mesh_types.h" #include "DNA_lattice_types.h" -#include "DNA_curve_types.h" #include "DNA_meta_types.h" #include "DNA_material_types.h" -#include "DNA_texture_types.h" -#include "DNA_image_types.h" #include "DNA_wave_types.h" #include "DNA_lamp_types.h" #include "DNA_camera_types.h" @@ -70,17 +60,10 @@ #include "DNA_sound_types.h" #include "DNA_group_types.h" #include "DNA_armature_types.h" -#include "DNA_action_types.h" -#include "DNA_userdef_types.h" #include "DNA_node_types.h" #include "DNA_nla_types.h" -#include "DNA_effect_types.h" -#include "DNA_brush_types.h" -#include "DNA_particle_types.h" -#include "DNA_space_types.h" #include "DNA_windowmanager_types.h" #include "DNA_anim_types.h" -#include "DNA_gpencil_types.h" #include "BLI_blenlib.h" #include "BLI_dynstr.h" @@ -93,7 +76,6 @@ #include "BKE_sound.h" #include "BKE_object.h" #include "BKE_screen.h" -#include "BKE_script.h" #include "BKE_mesh.h" #include "BKE_material.h" #include "BKE_curve.h" @@ -112,7 +94,6 @@ #include "BKE_armature.h" #include "BKE_action.h" #include "BKE_node.h" -#include "BKE_effect.h" #include "BKE_brush.h" #include "BKE_idprop.h" #include "BKE_particle.h" @@ -362,7 +343,7 @@ int id_unlink(ID *id, int test) if(id->us == 0) { if(test) return 1; - lb= wich_libbase(mainlib, GS(id->name)); + lb= which_libbase(mainlib, GS(id->name)); free_libblock(lb, id); return 1; @@ -371,7 +352,7 @@ int id_unlink(ID *id, int test) return 0; } -ListBase *wich_libbase(Main *mainlib, short type) +ListBase *which_libbase(Main *mainlib, short type) { switch( type ) { case ID_SCE: @@ -464,7 +445,7 @@ void recalc_all_library_objects(Main *main) /* flag for full recalc */ for(ob=main->object.first; ob; ob=ob->id.next) if(ob->id.lib) - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; } /* note: MAX_LIBARRAY define should match this code */ @@ -613,10 +594,10 @@ static ID *alloc_libblock_notest(short type) break; case ID_PA: id = MEM_callocN(sizeof(ParticleSettings), "ParticleSettings"); - break; + break; case ID_WM: id = MEM_callocN(sizeof(wmWindowManager), "Window manager"); - break; + break; case ID_GD: id = MEM_callocN(sizeof(bGPdata), "Grease Pencil"); break; @@ -669,11 +650,11 @@ void *copy_libblock(void *rt) ID *idn, *id; ListBase *lb; char *cp, *cpn; - int idn_len; + size_t idn_len; id= rt; - lb= wich_libbase(G.main, GS(id->name)); + lb= which_libbase(G.main, GS(id->name)); idn= alloc_libblock(lb, GS(id->name), id->name+2); if(idn==NULL) { @@ -697,7 +678,7 @@ void *copy_libblock(void *rt) static void free_library(Library *lib) { - /* no freeing needed for libraries yet */ + /* no freeing needed for libraries yet */ } static void (*free_windowmanager_cb)(bContext *, wmWindowManager *)= NULL; @@ -882,7 +863,7 @@ void free_main(Main *mainvar) ID *find_id(char *type, char *name) /* type: "OB" or "MA" etc */ { - ListBase *lb= wich_libbase(G.main, GS(type)); + ListBase *lb= which_libbase(G.main, GS(type)); return BLI_findstring(lb, name, offsetof(ID, name) + 2); } @@ -1093,15 +1074,16 @@ static ID *is_dupid(ListBase *lb, ID *id, char *name) * id is NULL; */ -int check_for_dupid(ListBase *lb, ID *id, char *name) +static int check_for_dupid(ListBase *lb, ID *id, char *name) { ID *idtest; int nr= 0, nrtest, a; const int maxtest=32; char left[32], leftest[32], in_use[32]; - + /* make sure input name is terminated properly */ - if( strlen(name) > 21 ) name[21]= 0; + /* if( strlen(name) > 21 ) name[21]= 0; */ + /* removed since this is only ever called from one place - campbell */ while (1) { @@ -1184,27 +1166,29 @@ int new_id(ListBase *lb, ID *id, const char *tname) { int result; char name[22]; - + /* if library, don't rename */ if(id->lib) return 0; /* if no libdata given, look up based on ID */ - if(lb==NULL) lb= wich_libbase(G.main, GS(id->name)); + if(lb==NULL) lb= which_libbase(G.main, GS(id->name)); - if(tname==0) { /* if no name given, use name of current ID */ - strncpy(name, id->name+2, 21); - result= strlen(id->name+2); - } - else { /* else make a copy (tname args can be const) */ - strncpy(name, tname, 21); - result= strlen(tname); - } + /* if no name given, use name of current ID + * else make a copy (tname args can be const) */ + if(tname==NULL) + tname= id->name+2; - /* if result > 21, strncpy don't put the final '\0' to name. */ - if( result >= 21 ) name[21]= 0; + strncpy(name, tname, sizeof(name)-1); - result = check_for_dupid( lb, id, name ); - strcpy( id->name+2, name ); + /* if result > 21, strncpy don't put the final '\0' to name. + * easier to assign each time then to check if its needed */ + name[sizeof(name)-1]= 0; + + if(name[0] == '\0') + strcpy(name, ID_FALLBACK_NAME); + + result = check_for_dupid(lb, id, name); + strcpy(id->name+2, name); /* This was in 2.43 and previous releases * however all data in blender should be sorted, not just duplicate names @@ -1241,18 +1225,24 @@ static void image_fix_relative_path(Image *ima) { if(ima->id.lib==NULL) return; if(strncmp(ima->name, "//", 2)==0) { - BLI_convertstringcode(ima->name, ima->id.lib->filename); - BLI_makestringcode(G.sce, ima->name); + BLI_path_abs(ima->name, ima->id.lib->filepath); + BLI_path_rel(ima->name, G.sce); } } #define LIBTAG(a) if(a && a->id.lib) {a->id.flag &=~LIB_INDIRECT; a->id.flag |= LIB_EXTERN;} -static void lib_indirect_test_id(ID *id) +static void lib_indirect_test_id(ID *id, Library *lib) { - if(id->lib) + if(id->lib) { + /* datablocks that were indirectly related are now direct links + * without this, appending data that has a link to other data will fail to write */ + if(lib && id->lib->parent == lib) { + id_lib_extern(id); + } return; + } if(GS(id->name)==ID_OB) { Object *ob= (Object *)id; @@ -1348,7 +1338,7 @@ void all_local(Library *lib, int untagged_only) a= set_listbasepointers(G.main, lbarray); while(a--) { for(id= lbarray[a]->first; id; id=id->next) - lib_indirect_test_id(id); + lib_indirect_test_id(id, lib); } } @@ -1360,7 +1350,7 @@ void test_idbutton(char *name) ID *idtest; - lb= wich_libbase(G.main, GS(name-2) ); + lb= which_libbase(G.main, GS(name-2) ); if(lb==0) return; /* search for id */ @@ -1374,17 +1364,17 @@ void text_idbutton(struct ID *id, char *text) if(id) { if(GS(id->name)==ID_SCE) strcpy(text, "SCE: "); - else if(GS(id->name)==ID_SCE) + else if(GS(id->name)==ID_SCE) strcpy(text, "SCR: "); - else if(GS(id->name)==ID_MA && ((Material*)id)->use_nodes) + else if(GS(id->name)==ID_MA && ((Material*)id)->use_nodes) strcpy(text, "NT: "); - else { + else { text[0]= id->name[0]; text[1]= id->name[1]; text[2]= ':'; text[3]= ' '; text[4]= 0; - } + } } else strcpy(text, ""); @@ -1393,9 +1383,9 @@ void text_idbutton(struct ID *id, char *text) void rename_id(ID *id, char *name) { ListBase *lb; - + strncpy(id->name+2, name, 21); - lb= wich_libbase(G.main, GS(id->name) ); + lb= which_libbase(G.main, GS(id->name) ); new_id(lb, id, name); } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 27b46c40d28..11c96e9a347 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -42,14 +42,10 @@ #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BKE_animsys.h" -#include "BKE_blender.h" #include "BKE_displist.h" #include "BKE_global.h" #include "BKE_icons.h" @@ -214,7 +210,7 @@ Material *copy_material(Material *ma) #if 0 // XXX old animation system id_us_plus((ID *)man->ipo); #endif // XXX old animation system - id_us_plus((ID *)man->group); + id_lib_extern((ID *)man->group); for(a=0; a<MAX_MTEX; a++) { if(ma->mtex[a]) { @@ -248,9 +244,9 @@ void make_local_material(Material *ma) int a, local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(ma->id.lib==0) return; if(ma->id.us==1) { @@ -455,7 +451,7 @@ Material *give_current_material(Object *ob, int act) if(act>ob->totcol) act= ob->totcol; else if(act<=0) act= 1; - if(ob->matbits[act-1]) { /* in object */ + if(ob->matbits && ob->matbits[act-1]) { /* in object */ ma= ob->mat[act-1]; } else { /* in data */ @@ -734,7 +730,7 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb) /* since the raytracer doesnt recalc O structs for each ray, we have to preset them all */ if(r_mode & R_RAYTRACE) { - if((ma->mode & (MA_RAYMIRROR|MA_SHADOW_TRA)) || ((ma->mode && MA_TRANSP) && (ma->mode & MA_RAYTRANSP))) { + if((ma->mode & (MA_RAYMIRROR|MA_SHADOW_TRA)) || ((ma->mode & MA_TRANSP) && (ma->mode & MA_RAYTRANSP))) { ma->texco |= NEED_UV|TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM; if(r_mode & R_OSA) ma->texco |= TEXCO_OSA; } @@ -1068,15 +1064,15 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col) } break; case MA_RAMP_DARK: - tmp=col[0]+((1-col[0])*facm); - if(tmp < *r) *r= tmp; - if(g) { - tmp=col[1]+((1-col[1])*facm); - if(tmp < *g) *g= tmp; - tmp=col[2]+((1-col[2])*facm); - if(tmp < *b) *b= tmp; - } - break; + tmp=col[0]+((1-col[0])*facm); + if(tmp < *r) *r= tmp; + if(g) { + tmp=col[1]+((1-col[1])*facm); + if(tmp < *g) *g= tmp; + tmp=col[2]+((1-col[2])*facm); + if(tmp < *b) *b= tmp; + } + break; case MA_RAMP_LIGHT: tmp= fac*col[0]; if(tmp > *r) *r= tmp; @@ -1128,7 +1124,7 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col) if(tmp <= 0.0f) *r = 0.0f; else if (( tmp = (1.0f - (1.0f - (*r)) / tmp )) < 0.0f) - *r = 0.0f; + *r = 0.0f; else if (tmp > 1.0f) *r=1.0f; else @@ -1139,17 +1135,17 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col) if(tmp <= 0.0f) *g = 0.0f; else if (( tmp = (1.0f - (1.0f - (*g)) / tmp )) < 0.0f ) - *g = 0.0f; + *g = 0.0f; else if(tmp >1.0f) *g=1.0f; else *g = tmp; - tmp = facm + fac*col[2]; - if(tmp <= 0.0f) + tmp = facm + fac*col[2]; + if(tmp <= 0.0f) *b = 0.0f; else if (( tmp = (1.0f - (1.0f - (*b)) / tmp )) < 0.0f ) - *b = 0.0f; + *b = 0.0f; else if(tmp >1.0f) *b= 1.0f; else @@ -1206,36 +1202,36 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col) } } break; - case MA_RAMP_SOFT: - if (g){ - float scr, scg, scb; + case MA_RAMP_SOFT: + if (g){ + float scr, scg, scb; - /* first calculate non-fac based Screen mix */ - scr = 1.0f - (1.0f - col[0]) * (1.0f - *r); - scg = 1.0f - (1.0f - col[1]) * (1.0f - *g); - scb = 1.0f - (1.0f - col[2]) * (1.0f - *b); + /* first calculate non-fac based Screen mix */ + scr = 1.0f - (1.0f - col[0]) * (1.0f - *r); + scg = 1.0f - (1.0f - col[1]) * (1.0f - *g); + scb = 1.0f - (1.0f - col[2]) * (1.0f - *b); - *r = facm*(*r) + fac*(((1.0f - *r) * col[0] * (*r)) + (*r * scr)); - *g = facm*(*g) + fac*(((1.0f - *g) * col[1] * (*g)) + (*g * scg)); - *b = facm*(*b) + fac*(((1.0f - *b) * col[2] * (*b)) + (*b * scb)); - } - break; - case MA_RAMP_LINEAR: - if (col[0] > 0.5f) - *r = *r + fac*(2.0f*(col[0]-0.5f)); - else - *r = *r + fac*(2.0f*(col[0]) - 1.0f); - if (g){ - if (col[1] > 0.5f) - *g = *g + fac*(2.0f*(col[1]-0.5f)); - else - *g = *g + fac*(2.0f*(col[1]) -1.0f); - if (col[2] > 0.5f) - *b = *b + fac*(2.0f*(col[2]-0.5f)); - else - *b = *b + fac*(2.0f*(col[2]) - 1.0f); - } - break; + *r = facm*(*r) + fac*(((1.0f - *r) * col[0] * (*r)) + (*r * scr)); + *g = facm*(*g) + fac*(((1.0f - *g) * col[1] * (*g)) + (*g * scg)); + *b = facm*(*b) + fac*(((1.0f - *b) * col[2] * (*b)) + (*b * scb)); + } + break; + case MA_RAMP_LINEAR: + if (col[0] > 0.5f) + *r = *r + fac*(2.0f*(col[0]-0.5f)); + else + *r = *r + fac*(2.0f*(col[0]) - 1.0f); + if (g){ + if (col[1] > 0.5f) + *g = *g + fac*(2.0f*(col[1]-0.5f)); + else + *g = *g + fac*(2.0f*(col[1]) -1.0f); + if (col[2] > 0.5f) + *b = *b + fac*(2.0f*(col[2]-0.5f)); + else + *b = *b + fac*(2.0f*(col[2]) - 1.0f); + } + break; } } @@ -1247,6 +1243,7 @@ static short matcopied=0; void clear_matcopybuf(void) { memset(&matcopybuf, 0, sizeof(Material)); + matcopied= 0; } void free_matcopybuf(void) @@ -1273,6 +1270,8 @@ void free_matcopybuf(void) matcopybuf.nodetree= NULL; } // default_mtex(&mtexcopybuf); + + matcopied= 0; } void copy_matcopybuf(Material *ma) diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 24eeb1ab43f..e35d8bce886 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -57,16 +57,11 @@ /* #include "BKE_object.h" */ #include "BKE_animsys.h" #include "BKE_scene.h" -#include "BKE_blender.h" #include "BKE_library.h" #include "BKE_displist.h" #include "BKE_mball.h" #include "BKE_object.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - /* Global variables */ static float thresh= 0.6f; @@ -231,7 +226,7 @@ void tex_space_mball(Object *ob) boundbox_set_from_min_max(bb, min, max); } -float *make_orco_mball(Object *ob) +float *make_orco_mball(Object *ob, ListBase *dispbase) { BoundBox *bb; DispList *dl; @@ -248,7 +243,7 @@ float *make_orco_mball(Object *ob) loc[2]= (bb->vec[0][2]+bb->vec[1][2])/2.0f; size[2]= bb->vec[1][2]-loc[2]; - dl= ob->disp.first; + dl= dispbase->first; orcodata= MEM_mallocN(sizeof(float)*3*dl->nr, "MballOrco"); data= dl->verts; @@ -280,6 +275,19 @@ int is_basis_mball(Object *ob) return 1; } +/* return nonzero if ob1 is a basis mball for ob */ +int is_mball_basis_for(Object *ob1, Object *ob2) +{ + int basis1nr, basis2nr; + char basis1name[32], basis2name[32]; + + splitIDname(ob1->id.name+2, basis1name, &basis1nr); + splitIDname(ob2->id.name+2, basis2name, &basis2nr); + + if(!strcmp(basis1name, basis2name)) return is_basis_mball(ob1); + else return 0; +} + /* \brief copy some properties from object to other metaball object with same base name * * When some properties (wiresize, threshold, update flags) of metaball are changed, then this properties @@ -288,6 +296,7 @@ int is_basis_mball(Object *ob) * because this metaball influence polygonisation of metaballs. */ void copy_mball_properties(Scene *scene, Object *active_object) { + Scene *sce_iter= scene; Base *base; Object *ob; MetaBall *active_mball = (MetaBall*)active_object->data; @@ -297,10 +306,10 @@ void copy_mball_properties(Scene *scene, Object *active_object) splitIDname(active_object->id.name+2, basisname, &basisnr); /* XXX recursion check, see scene.c, just too simple code this next_object() */ - if(F_ERROR==next_object(scene, 0, 0, 0)) + if(F_ERROR==next_object(&sce_iter, 0, 0, 0)) return; - while(next_object(scene, 1, &base, &ob)) { + while(next_object(&sce_iter, 1, &base, &ob)) { if (ob->type==OB_MBALL) { if(ob!=active_object){ splitIDname(ob->id.name+2, obname, &obnr); @@ -330,6 +339,7 @@ void copy_mball_properties(Scene *scene, Object *active_object) */ Object *find_basis_mball(Scene *scene, Object *basis) { + Scene *sce_iter= scene; Base *base; Object *ob,*bob= basis; MetaElem *ml=NULL; @@ -340,10 +350,10 @@ Object *find_basis_mball(Scene *scene, Object *basis) totelem= 0; /* XXX recursion check, see scene.c, just too simple code this next_object() */ - if(F_ERROR==next_object(scene, 0, 0, 0)) + if(F_ERROR==next_object(&sce_iter, 0, 0, 0)) return NULL; - while(next_object(scene, 1, &base, &ob)) { + while(next_object(&sce_iter, 1, &base, &ob)) { if (ob->type==OB_MBALL) { if(ob==bob){ @@ -687,7 +697,7 @@ void *new_pgn_element(int size) if(cur) { if(size+offs < blocksize) { adr= (void *) (cur->data+offs); - offs+= size; + offs+= size; return adr; } } @@ -1092,7 +1102,7 @@ int getedge (EDGELIST *table[], q = table[HASH(i1, j1, k1)+HASH(i2, j2, k2)]; for (; q != NULL; q = q->next) if (q->i1 == i1 && q->j1 == j1 && q->k1 == k1 && - q->i2 == i2 && q->j2 == j2 && q->k2 == k2) + q->i2 == i2 && q->j2 == j2 && q->k2 == k2) return q->vid; return -1; } @@ -1241,7 +1251,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2, p->z = neg.z; return; } - if((dx == 0.0f) && (dz == 0.0f)){ + if((dx == 0.0f) && (dz == 0.0f)){ p->x = neg.x; p->y = neg.y - negative*dy/(positive-negative); p->z = neg.z; @@ -1273,7 +1283,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2, p->y = 0.5f*(pos.y + neg.y); if ((function(p->x,p->y,p->z)) > 0.0) pos.y = p->y; else neg.y = p->y; } - } + } if((dx == 0.0f) && (dy == 0.0f)){ p->x = neg.x; @@ -1499,6 +1509,7 @@ void polygonize(PROCESS *mbproc, MetaBall *mb) float init_meta(Scene *scene, Object *ob) /* return totsize */ { + Scene *sce_iter= scene; Base *base; Object *bob; MetaBall *mb; @@ -1515,9 +1526,8 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */ splitIDname(ob->id.name+2, obname, &obnr); /* make main array */ - - next_object(scene, 0, 0, 0); - while(next_object(scene, 1, &base, &bob)) { + next_object(&sce_iter, 0, 0, 0); + while(next_object(&sce_iter, 1, &base, &bob)) { if(bob->type==OB_MBALL) { zero_size= 0; @@ -1581,7 +1591,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */ if(ml->s > 10.0) ml->s = 10.0; /* Rotation of MetaElem is stored in quat */ - quat_to_mat4( temp3,ml->quat); + quat_to_mat4( temp3,ml->quat); /* Translation of MetaElem */ unit_m4(temp2); @@ -2080,21 +2090,20 @@ void init_metaball_octal_tree(int depth) subdivide_metaball_octal_node(node, size[0], size[1], size[2], metaball_tree->depth); } -void metaball_polygonize(Scene *scene, Object *ob) +void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) { PROCESS mbproc; MetaBall *mb; DispList *dl; int a, nr_cubes; float *ve, *no, totsize, width; - + mb= ob->data; if(totelem==0) return; if(!(G.rendering) && (mb->flag==MB_UPDATE_NEVER)) return; if(G.moving && mb->flag==MB_UPDATE_FAST) return; - freedisplist(&ob->disp); curindex= totindex= 0; indices= 0; thresh= mb->thresh; @@ -2118,13 +2127,22 @@ void metaball_polygonize(Scene *scene, Object *ob) if((totelem > 512) && (totelem <= 1024)) init_metaball_octal_tree(4); if(totelem > 1024) init_metaball_octal_tree(5); - /* don't polygonize metaballs with too high resolution (base mball to small) */ + /* don't polygonize metaballs with too high resolution (base mball to small) + * note: Eps was 0.0001f but this was giving problems for blood animation for durian, using 0.00001f */ if(metaball_tree) { - if(ob->size[0]<=0.0001f*(metaball_tree->first->x_max - metaball_tree->first->x_min) || - ob->size[1]<=0.0001f*(metaball_tree->first->y_max - metaball_tree->first->y_min) || - ob->size[2]<=0.0001f*(metaball_tree->first->z_max - metaball_tree->first->z_min)) + if( ob->size[0] <= 0.00001f * (metaball_tree->first->x_max - metaball_tree->first->x_min) || + ob->size[1] <= 0.00001f * (metaball_tree->first->y_max - metaball_tree->first->y_min) || + ob->size[2] <= 0.00001f * (metaball_tree->first->z_max - metaball_tree->first->z_min)) { + new_pgn_element(-1); /* free values created by init_meta */ + MEM_freeN(mainb); + + /* free tree */ + free_metaball_octal_node(metaball_tree->first); + MEM_freeN(metaball_tree); + metaball_tree= NULL; + return; } } @@ -2157,9 +2175,8 @@ void metaball_polygonize(Scene *scene, Object *ob) } if(curindex) { - dl= MEM_callocN(sizeof(DispList), "mbaldisp"); - BLI_addtail(&ob->disp, dl); + BLI_addtail(dispbase, dl); dl->type= DL_INDEX4; dl->nr= mbproc.vertices.count; dl->parts= curindex; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index c7b76941793..956fe10ee4b 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -29,10 +29,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include <stdlib.h> #include <string.h> #include <stdio.h> @@ -40,26 +36,18 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" -#include "DNA_anim_types.h" -#include "DNA_curve_types.h" #include "DNA_scene_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" -#include "DNA_image_types.h" #include "DNA_key_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_ipo_types.h" #include "BKE_animsys.h" -#include "BKE_customdata.h" -#include "BKE_depsgraph.h" #include "BKE_main.h" #include "BKE_DerivedMesh.h" #include "BKE_global.h" #include "BKE_mesh.h" -#include "BKE_subsurf.h" #include "BKE_displist.h" #include "BKE_library.h" #include "BKE_material.h" @@ -187,7 +175,7 @@ void unlink_mesh(Mesh *me) } if(me->key) { - me->key->id.us--; + me->key->id.us--; if (me->key->id.us == 0 && me->key->ipo ) me->key->ipo->id.us--; } @@ -401,9 +389,9 @@ void make_local_mesh(Mesh *me) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(me->id.lib==0) return; if(me->id.us==1) { @@ -682,31 +670,49 @@ static int vergedgesort(const void *v1, const void *v2) return 0; } -void make_edges(Mesh *me, int old) +static void mfaces_strip_loose(MFace *mface, int *totface) +{ + int a,b; + + for (a=b=0; a<*totface; a++) { + if (mface[a].v3) { + if (a!=b) { + memcpy(&mface[b],&mface[a],sizeof(mface[b])); + } + b++; + } + } + + *totface= b; +} + +/* Create edges based on known verts and faces */ +static void make_edges_mdata(MVert *allvert, MFace *allface, int totvert, int totface, + int old, MEdge **alledge, int *_totedge) { MFace *mface; MEdge *medge; struct edgesort *edsort, *ed; int a, totedge=0, final=0; - + /* we put all edges in array, sort them, and detect doubles that way */ - - for(a= me->totface, mface= me->mface; a>0; a--, mface++) { + + for(a= totface, mface= allface; a>0; a--, mface++) { if(mface->v4) totedge+=4; else if(mface->v3) totedge+=3; else totedge+=1; } - + if(totedge==0) { /* flag that mesh has edges */ - me->medge = MEM_callocN(0, "make mesh edges"); - me->totedge = 0; + (*alledge)= MEM_callocN(0, "make mesh edges"); + (*_totedge) = 0; return; } - + ed= edsort= MEM_mallocN(totedge*sizeof(struct edgesort), "edgesort"); - - for(a= me->totface, mface= me->mface; a>0; a--, mface++) { + + for(a= totface, mface= allface; a>0; a--, mface++) { to_edgesort(ed++, mface->v1, mface->v2, !mface->v3, mface->edcode & ME_V1V2); if(mface->v4) { to_edgesort(ed++, mface->v2, mface->v3, 0, mface->edcode & ME_V2V3); @@ -718,21 +724,19 @@ void make_edges(Mesh *me, int old) to_edgesort(ed++, mface->v3, mface->v1, 0, mface->edcode & ME_V3V1); } } - + qsort(edsort, totedge, sizeof(struct edgesort), vergedgesort); - + /* count final amount */ for(a=totedge, ed=edsort; a>1; a--, ed++) { /* edge is unique when it differs from next edge, or is last */ if(ed->v1 != (ed+1)->v1 || ed->v2 != (ed+1)->v2) final++; } final++; - - medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, final); - me->medge= medge; - me->totedge= final; - + (*alledge)= medge= MEM_callocN(sizeof (MEdge) * final, "make_edges mdge"); + (*_totedge)= final; + for(a=totedge, ed=edsort; a>1; a--, ed++) { /* edge is unique when it differs from next edge, or is last */ if(ed->v1 != (ed+1)->v1 || ed->v2 != (ed+1)->v2) { @@ -740,6 +744,12 @@ void make_edges(Mesh *me, int old) medge->v2= ed->v2; if(old==0 || ed->is_draw) medge->flag= ME_EDGEDRAW|ME_EDGERENDER; if(ed->is_loose) medge->flag|= ME_LOOSEEDGE; + + /* order is swapped so extruding this edge as a surface wont flip face normals + * with cyclic curves */ + if(ed->v1+1 != ed->v2) { + SWAP(int, medge->v1, medge->v2); + } medge++; } else { @@ -755,6 +765,24 @@ void make_edges(Mesh *me, int old) medge->flag |= ME_EDGERENDER; MEM_freeN(edsort); +} + +void make_edges(Mesh *me, int old) +{ + MEdge *medge; + int totedge=0; + + make_edges_mdata(me->mvert, me->mface, me->totvert, me->totface, old, &medge, &totedge); + if(totedge==0) { + /* flag that mesh has edges */ + me->medge = medge; + me->totedge = 0; + return; + } + + medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, medge, totedge); + me->medge= medge; + me->totedge= totedge; mesh_strip_loose_faces(me); } @@ -776,7 +804,6 @@ void mesh_strip_loose_faces(Mesh *me) me->totface = b; } - void mball_to_mesh(ListBase *lb, Mesh *me) { DispList *dl; @@ -830,12 +857,21 @@ void mball_to_mesh(ListBase *lb, Mesh *me) } } -/* this may fail replacing ob->data, be sure to check ob->type */ -void nurbs_to_mesh(Object *ob) +/* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */ +/* return non-zero on error */ +int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert, + MEdge **alledge, int *totedge, MFace **allface, int *totface) +{ + return nurbs_to_mdata_customdb(ob, &((Curve *)ob->data)->disp, + allvert, totvert, alledge, totedge, allface, totface); +} + +/* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */ +/* use specified dispbase */ +int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int *_totvert, + MEdge **alledge, int *_totedge, MFace **allface, int *_totface) { - Object *ob1; DispList *dl; - Mesh *me; Curve *cu; MVert *mvert; MFace *mface; @@ -846,18 +882,15 @@ void nurbs_to_mesh(Object *ob) cu= ob->data; /* count */ - dl= cu->disp.first; + dl= dispbase->first; while(dl) { if(dl->type==DL_SEGM) { totvert+= dl->parts*dl->nr; totvlak+= dl->parts*(dl->nr-1); } else if(dl->type==DL_POLY) { - /* cyclic polys are filled. except when 3D */ - if(cu->flag & CU_3D) { - totvert+= dl->parts*dl->nr; - totvlak+= dl->parts*dl->nr; - } + totvert+= dl->parts*dl->nr; + totvlak+= dl->parts*dl->nr; } else if(dl->type==DL_SURF) { totvert+= dl->parts*dl->nr; @@ -869,34 +902,23 @@ void nurbs_to_mesh(Object *ob) } dl= dl->next; } + if(totvert==0) { /* error("can't convert"); */ /* Make Sure you check ob->data is a curve */ - return; + return -1; } - /* make mesh */ - me= add_mesh("Mesh"); - me->totvert= totvert; - me->totface= totvlak; - - me->totcol= cu->totcol; - me->mat= cu->mat; - cu->mat= 0; - cu->totcol= 0; - - mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert); - mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface); - me->mvert= mvert; - me->mface= mface; + *allvert= mvert= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mvert"); + *allface= mface= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mface"); /* verts and faces */ vertcount= 0; - dl= cu->disp.first; + dl= dispbase->first; while(dl) { int smooth= dl->rt & CU_SMOOTH ? 1 : 0; - + if(dl->type==DL_SEGM) { startvert= vertcount; a= dl->parts*dl->nr; @@ -920,27 +942,24 @@ void nurbs_to_mesh(Object *ob) } else if(dl->type==DL_POLY) { - /* 3d polys are not filled */ - if(cu->flag & CU_3D) { - startvert= vertcount; - a= dl->parts*dl->nr; - data= dl->verts; - while(a--) { - VECCOPY(mvert->co, data); - data+=3; - vertcount++; - mvert++; - } - - for(a=0; a<dl->parts; a++) { - ofs= a*dl->nr; - for(b=0; b<dl->nr; b++) { - mface->v1= startvert+ofs+b; - if(b==dl->nr-1) mface->v2= startvert+ofs; - else mface->v2= startvert+ofs+b+1; - if(smooth) mface->flag |= ME_SMOOTH; - mface++; - } + startvert= vertcount; + a= dl->parts*dl->nr; + data= dl->verts; + while(a--) { + VECCOPY(mvert->co, data); + data+=3; + vertcount++; + mvert++; + } + + for(a=0; a<dl->parts; a++) { + ofs= a*dl->nr; + for(b=0; b<dl->nr; b++) { + mface->v1= startvert+ofs+b; + if(b==dl->nr-1) mface->v2= startvert+ofs; + else mface->v2= startvert+ofs+b+1; + if(smooth) mface->flag |= ME_SMOOTH; + mface++; } } } @@ -963,13 +982,13 @@ void nurbs_to_mesh(Object *ob) mface->v3= startvert+index[1]; mface->v4= 0; test_index_face(mface, NULL, 0, 3); - + if(smooth) mface->flag |= ME_SMOOTH; mface++; index+= 3; } - - + + } else if(dl->type==DL_SURF) { startvert= vertcount; @@ -1012,13 +1031,13 @@ void nurbs_to_mesh(Object *ob) mface->v4= p2; mface->mat_nr= (unsigned char)dl->col; test_index_face(mface, NULL, 0, 4); - + if(smooth) mface->flag |= ME_SMOOTH; mface++; - p4= p3; + p4= p3; p3++; - p2= p1; + p2= p1; p1++; } } @@ -1028,15 +1047,65 @@ void nurbs_to_mesh(Object *ob) dl= dl->next; } - make_edges(me, 0); // all edges - mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); + *_totvert= totvert; + *_totface= totvlak; + + make_edges_mdata(*allvert, *allface, totvert, totvlak, 0, alledge, _totedge); + mfaces_strip_loose(*allface, _totface); + + return 0; +} + +/* this may fail replacing ob->data, be sure to check ob->type */ +void nurbs_to_mesh(Object *ob) +{ + Object *ob1; + DerivedMesh *dm= ob->derivedFinal; + Mesh *me; + Curve *cu; + MVert *allvert= NULL; + MEdge *alledge= NULL; + MFace *allface= NULL; + int totvert, totedge, totface; + + cu= ob->data; + + if (dm == NULL) { + if (nurbs_to_mdata (ob, &allvert, &totvert, &alledge, &totedge, &allface, &totface) != 0) { + /* Error initializing */ + return; + } + + /* make mesh */ + me= add_mesh("Mesh"); + me->totvert= totvert; + me->totface= totface; + me->totedge= totedge; + + me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, allvert, me->totvert); + me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, allface, me->totface); + me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, alledge, me->totedge); + + mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); + } else { + me= add_mesh("Mesh"); + DM_to_mesh(dm, me); + } + + me->totcol= cu->totcol; + me->mat= cu->mat; + + tex_space_mesh(me); + + cu->mat= 0; + cu->totcol= 0; if(ob->data) { free_libblock(&G.main->curve, ob->data); } ob->data= me; ob->type= OB_MESH; - + /* other users */ ob1= G.main->object.first; while(ob1) { @@ -1048,7 +1117,6 @@ void nurbs_to_mesh(Object *ob) } ob1= ob1->id.next; } - } typedef struct EdgeLink { @@ -1087,7 +1155,7 @@ void mesh_to_curve(Scene *scene, Object *ob) int totedge = dm->getNumEdges(dm); int totface = dm->getNumTessFaces(dm); int totedges = 0; - int i; + int i, needsFree = 0; /* only to detect edge polylines */ EdgeHash *eh = BLI_edgehash_new(); @@ -1204,7 +1272,7 @@ void mesh_to_curve(Scene *scene, Object *ob) nu->pntsu= totpoly; nu->pntsv= 1; nu->orderu= 4; - nu->flagu= 2 | (closed ? CU_CYCLIC:0); /* endpoint */ + nu->flagu= CU_NURB_ENDPOINT | (closed ? CU_NURB_CYCLIC:0); /* endpoint */ nu->resolu= 12; nu->bp= (BPoint *)MEM_callocN(sizeof(BPoint)*totpoly, "bpoints"); @@ -1227,9 +1295,23 @@ void mesh_to_curve(Scene *scene, Object *ob) ((Mesh *)ob->data)->id.us--; ob->data= cu; ob->type= OB_CURVE; + + /* curve objects can't contain DM in usual cases, we could free memory */ + needsFree= 1; } + dm->needsFree = needsFree; dm->release(dm); + + if (needsFree) { + ob->derivedFinal = NULL; + + /* curve object could have got bounding box only in special cases */ + if(ob->bb) { + MEM_freeN(ob->bb); + ob->bb= NULL; + } + } } void mesh_delete_material_index(Mesh *me, int index) @@ -1276,11 +1358,11 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, else normal_tri_v3( f_no,mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co); - add_v3_v3v3(tnorms[mf->v1], tnorms[mf->v1], f_no); - add_v3_v3v3(tnorms[mf->v2], tnorms[mf->v2], f_no); - add_v3_v3v3(tnorms[mf->v3], tnorms[mf->v3], f_no); + add_v3_v3(tnorms[mf->v1], f_no); + add_v3_v3(tnorms[mf->v2], f_no); + add_v3_v3(tnorms[mf->v3], f_no); if (mf->v4) - add_v3_v3v3(tnorms[mf->v4], tnorms[mf->v4], f_no); + add_v3_v3(tnorms[mf->v4], f_no); } for (i=0; i<numVerts; i++) { MVert *mv= &mverts[i]; diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 20e8542fb56..858e9d6c6d9 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -24,8 +24,7 @@ * Ton Roosendaal, * Ben Batt, * Brecht Van Lommel, -* Campbell Barton, -* Joseph Eagar +* Campbell Barton * * ***** END GPL LICENSE BLOCK ***** * @@ -41,8133 +40,29 @@ #include "math.h" #include "float.h" -#include "BLI_math.h" -#include "BLI_blenlib.h" -#include "BLI_kdopbvh.h" -#include "BLI_kdtree.h" -#include "BLI_linklist.h" -#include "BLI_rand.h" -#include "BLI_edgehash.h" -#include "BLI_ghash.h" -#include "BLI_memarena.h" -#include "BLI_cellalloc.h" -#include "BLI_mempool.h" -#include "BLI_array.h" - -#include "MEM_guardedalloc.h" - -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_cloth_types.h" -#include "DNA_curve_types.h" -#include "DNA_effect_types.h" -#include "DNA_group_types.h" -#include "DNA_key_types.h" -#include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_object_fluidsim.h" -#include "DNA_object_force.h" -#include "DNA_particle_types.h" -#include "DNA_scene_types.h" -#include "DNA_smoke_types.h" -#include "DNA_texture_types.h" -#include "BLI_editVert.h" - - - - -#include "BKE_main.h" -#include "BKE_anim.h" -#include "BKE_action.h" #include "BKE_bmesh.h" -#include "BKE_booleanops.h" #include "BKE_cloth.h" -#include "BKE_collision.h" -#include "BKE_cdderivedmesh.h" -#include "BKE_curve.h" -#include "BKE_customdata.h" -#include "BKE_DerivedMesh.h" -#include "BKE_displist.h" -#include "BKE_fluidsim.h" -#include "BKE_global.h" -#include "BKE_multires.h" #include "BKE_key.h" -#include "BKE_lattice.h" -#include "BKE_library.h" -#include "BKE_material.h" -#include "BKE_mesh.h" -#include "BKE_modifier.h" -#include "BKE_object.h" -#include "BKE_particle.h" -#include "BKE_pointcache.h" -#include "BKE_scene.h" -#include "BKE_smoke.h" -#include "BKE_softbody.h" -#include "BKE_subsurf.h" -#include "BKE_texture.h" -#include "BKE_utildefines.h" -#include "BKE_tessmesh.h" -#include "depsgraph_private.h" -#include "BKE_deform.h" -#include "BKE_shrinkwrap.h" -#include "BKE_simple_deform.h" - -#include "LOD_decimation.h" - -#include "CCGSubSurf.h" - -#include "RE_shader_ext.h" - -/* Utility */ - -static int is_last_displist(Object *ob) -{ - Curve *cu = ob->data; - static int curvecount=0, totcurve=0; - - if(curvecount == 0){ - DispList *dl; - - totcurve = 0; - for(dl=cu->disp.first; dl; dl=dl->next) - totcurve++; - } - - curvecount++; - - if(curvecount == totcurve){ - curvecount = 0; - return 1; - } - - return 0; -} - -/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */ -static DerivedMesh *get_dm(Scene *scene, Object *ob, BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco) -{ - if(dm) - return dm; - - if(ob->type==OB_MESH) { - if(em) dm= CDDM_from_BMEditMesh(em, ob->data); - else dm = CDDM_from_mesh((Mesh*)(ob->data), ob); - - if(vertexCos) { - CDDM_apply_vert_coords(dm, vertexCos); - //CDDM_calc_normals(dm); - } - - if(orco) - DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob)); - } - else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) { - Object *tmpobj; - Curve *tmpcu; - - if(is_last_displist(ob)) { - /* copies object and modifiers (but not the data) */ - tmpobj= copy_object(ob); - tmpcu = (Curve *)tmpobj->data; - tmpcu->id.us--; - - /* copies the data */ - tmpobj->data = copy_curve((Curve *) ob->data); - - makeDispListCurveTypes(scene, tmpobj, 1); - nurbs_to_mesh(tmpobj); - - dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj); - //CDDM_calc_normals(dm); - - free_libblock_us(&G.main->object, tmpobj); - } - } - - return dm; -} - -/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */ -static DerivedMesh *get_cddm(Scene *scene, Object *ob, BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3]) -{ - if(dm && dm->type == DM_TYPE_CDDM) - return dm; - - if(!dm) { - dm= get_dm(scene, ob, em, dm, vertexCos, 0); - } - else { - dm= CDDM_copy(dm, 0); - CDDM_apply_vert_coords(dm, vertexCos); - } - - if(dm) - CDDM_calc_normals(dm); - - return dm; -} - -/***/ - -static int noneModifier_isDisabled(ModifierData *md, int userRenderParams) -{ - return 1; -} - -/* Curve */ - -static void curveModifier_initData(ModifierData *md) -{ - CurveModifierData *cmd = (CurveModifierData*) md; - - cmd->defaxis = MOD_CURVE_POSX; -} - -static void curveModifier_copyData(ModifierData *md, ModifierData *target) -{ - CurveModifierData *cmd = (CurveModifierData*) md; - CurveModifierData *tcmd = (CurveModifierData*) target; - - tcmd->defaxis = cmd->defaxis; - tcmd->object = cmd->object; - strncpy(tcmd->name, cmd->name, 32); -} - -static CustomDataMask curveModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - CurveModifierData *cmd = (CurveModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(cmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static int curveModifier_isDisabled(ModifierData *md, int userRenderParams) -{ - CurveModifierData *cmd = (CurveModifierData*) md; - - return !cmd->object; -} - -static void curveModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - CurveModifierData *cmd = (CurveModifierData*) md; - - walk(userData, ob, &cmd->object); -} - -static void curveModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - CurveModifierData *cmd = (CurveModifierData*) md; - - if (cmd->object) { - DagNode *curNode = dag_get_node(forest, cmd->object); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Curve Modifier"); - } -} - -static void curveModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - CurveModifierData *cmd = (CurveModifierData*) md; - - curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts, - cmd->name, cmd->defaxis); -} - -static void curveModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = derivedData; - - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); - - curveModifier_deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); - - if(!derivedData) dm->release(dm); -} - -/* Lattice */ - -static void latticeModifier_copyData(ModifierData *md, ModifierData *target) -{ - LatticeModifierData *lmd = (LatticeModifierData*) md; - LatticeModifierData *tlmd = (LatticeModifierData*) target; - - tlmd->object = lmd->object; - strncpy(tlmd->name, lmd->name, 32); -} - -static CustomDataMask latticeModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - LatticeModifierData *lmd = (LatticeModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(lmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static int latticeModifier_isDisabled(ModifierData *md, int userRenderParams) -{ - LatticeModifierData *lmd = (LatticeModifierData*) md; - - return !lmd->object; -} - -static void latticeModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - LatticeModifierData *lmd = (LatticeModifierData*) md; - - walk(userData, ob, &lmd->object); -} - -static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - LatticeModifierData *lmd = (LatticeModifierData*) md; - - if(lmd->object) { - DagNode *latNode = dag_get_node(forest, lmd->object); - - dag_add_relation(forest, latNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Lattice Modifier"); - } -} - -static void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3]) -{ - while((md=md->next) && md->type==eModifierType_Armature) { - ArmatureModifierData *amd = (ArmatureModifierData*) md; - if(amd->multi && amd->prevCos==NULL) - amd->prevCos= MEM_dupallocN(vertexCos); - else - break; - } - /* lattice/mesh modifier too */ -} - - -static void latticeModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - LatticeModifierData *lmd = (LatticeModifierData*) md; - - - modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - - lattice_deform_verts(lmd->object, ob, derivedData, - vertexCos, numVerts, lmd->name); -} - -static void latticeModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = derivedData; - - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); - - latticeModifier_deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); - - if(!derivedData) dm->release(dm); -} - -/* Subsurf */ - -static void subsurfModifier_initData(ModifierData *md) -{ - SubsurfModifierData *smd = (SubsurfModifierData*) md; - - smd->levels = 1; - smd->renderLevels = 2; - smd->flags |= eSubsurfModifierFlag_SubsurfUv; -} - -static void subsurfModifier_copyData(ModifierData *md, ModifierData *target) -{ - SubsurfModifierData *smd = (SubsurfModifierData*) md; - SubsurfModifierData *tsmd = (SubsurfModifierData*) target; - - tsmd->flags = smd->flags; - tsmd->levels = smd->levels; - tsmd->renderLevels = smd->renderLevels; - tsmd->subdivType = smd->subdivType; -} - -static void subsurfModifier_freeData(ModifierData *md) -{ - SubsurfModifierData *smd = (SubsurfModifierData*) md; - - if(smd->mCache) { - ccgSubSurf_free(smd->mCache); - } - if(smd->emCache) { - ccgSubSurf_free(smd->emCache); - } -} - -static int subsurfModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - SubsurfModifierData *smd = (SubsurfModifierData*) md; - int levels= (useRenderParams)? smd->renderLevels: smd->levels; - - return get_render_subsurf_level(&md->scene->r, levels) == 0; -} - -static DerivedMesh *subsurfModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - SubsurfModifierData *smd = (SubsurfModifierData*) md; - DerivedMesh *result; - - result = subsurf_make_derived_from_derived(derivedData, smd, - useRenderParams, NULL, isFinalCalc, 0); - - if(useRenderParams || !isFinalCalc) { - DerivedMesh *cddm= CDDM_copy(result, 1); - result->release(result); - result= cddm; - } - - return result; -} - -static DerivedMesh *subsurfModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - SubsurfModifierData *smd = (SubsurfModifierData*) md; - DerivedMesh *result; - - result = subsurf_make_derived_from_derived(derivedData, smd, 0, - NULL, 0, 1); - - return result; -} - -/* Build */ - -static void buildModifier_initData(ModifierData *md) -{ - BuildModifierData *bmd = (BuildModifierData*) md; - - bmd->start = 1.0; - bmd->length = 100.0; -} - -static void buildModifier_copyData(ModifierData *md, ModifierData *target) -{ - BuildModifierData *bmd = (BuildModifierData*) md; - BuildModifierData *tbmd = (BuildModifierData*) target; - - tbmd->start = bmd->start; - tbmd->length = bmd->length; - tbmd->randomize = bmd->randomize; - tbmd->seed = bmd->seed; -} - -static int buildModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -static DerivedMesh *buildModifier_applyModifier(ModifierData *md, Object *ob, - DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = derivedData; - DerivedMesh *result; - BuildModifierData *bmd = (BuildModifierData*) md; - int i; - int numFaces, numEdges; - int maxVerts, maxEdges, maxFaces; - int *vertMap, *edgeMap, *faceMap; - float frac; - GHashIterator *hashIter; - /* maps vert indices in old mesh to indices in new mesh */ - GHash *vertHash = BLI_ghash_new(BLI_ghashutil_inthash, - BLI_ghashutil_intcmp); - /* maps edge indices in new mesh to indices in old mesh */ - GHash *edgeHash = BLI_ghash_new(BLI_ghashutil_inthash, - BLI_ghashutil_intcmp); - - maxVerts = dm->getNumVerts(dm); - vertMap = MEM_callocN(sizeof(*vertMap) * maxVerts, - "build modifier vertMap"); - for(i = 0; i < maxVerts; ++i) vertMap[i] = i; - - maxEdges = dm->getNumEdges(dm); - edgeMap = MEM_callocN(sizeof(*edgeMap) * maxEdges, - "build modifier edgeMap"); - for(i = 0; i < maxEdges; ++i) edgeMap[i] = i; - - maxFaces = dm->getNumTessFaces(dm); - faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces, - "build modifier faceMap"); - for(i = 0; i < maxFaces; ++i) faceMap[i] = i; - - if (ob) { - frac = bsystem_time(md->scene, ob, md->scene->r.cfra, - bmd->start - 1.0f) / bmd->length; - } else { - frac = md->scene->r.cfra - bmd->start / bmd->length; - } - CLAMP(frac, 0.0, 1.0); - - numFaces = dm->getNumTessFaces(dm) * frac; - numEdges = dm->getNumEdges(dm) * frac; - - /* if there's at least one face, build based on faces */ - if(numFaces) { - int maxEdges; - - if(bmd->randomize) - BLI_array_randomize(faceMap, sizeof(*faceMap), - maxFaces, bmd->seed); - - /* get the set of all vert indices that will be in the final mesh, - * mapped to the new indices - */ - for(i = 0; i < numFaces; ++i) { - MFace mf; - dm->getTessFace(dm, faceMap[i], &mf); - - if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v1))) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v1), - SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); - if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v2))) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v2), - SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); - if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v3))) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v3), - SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); - if(mf.v4 && !BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v4))) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v4), - SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); - } - - /* get the set of edges that will be in the new mesh (i.e. all edges - * that have both verts in the new mesh) - */ - maxEdges = dm->getNumEdges(dm); - for(i = 0; i < maxEdges; ++i) { - MEdge me; - dm->getEdge(dm, i, &me); - - if(BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1)) - && BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2))) - BLI_ghash_insert(edgeHash, - SET_INT_IN_POINTER(BLI_ghash_size(edgeHash)), SET_INT_IN_POINTER(i)); - } - } else if(numEdges) { - if(bmd->randomize) - BLI_array_randomize(edgeMap, sizeof(*edgeMap), - maxEdges, bmd->seed); - - /* get the set of all vert indices that will be in the final mesh, - * mapped to the new indices - */ - for(i = 0; i < numEdges; ++i) { - MEdge me; - dm->getEdge(dm, edgeMap[i], &me); - - if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1))) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(me.v1), - SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); - if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2))) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(me.v2), - SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); - } - - /* get the set of edges that will be in the new mesh - */ - for(i = 0; i < numEdges; ++i) { - MEdge me; - dm->getEdge(dm, edgeMap[i], &me); - - BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(BLI_ghash_size(edgeHash)), - SET_INT_IN_POINTER(edgeMap[i])); - } - } else { - int numVerts = dm->getNumVerts(dm) * frac; - - if(bmd->randomize) - BLI_array_randomize(vertMap, sizeof(*vertMap), - maxVerts, bmd->seed); - - /* get the set of all vert indices that will be in the final mesh, - * mapped to the new indices - */ - for(i = 0; i < numVerts; ++i) - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(vertMap[i]), SET_INT_IN_POINTER(i)); - } - - /* now we know the number of verts, edges and faces, we can create - * the mesh - */ - result = CDDM_from_template(dm, BLI_ghash_size(vertHash), - BLI_ghash_size(edgeHash), numFaces, 0, 0); - - /* copy the vertices across */ - for(hashIter = BLI_ghashIterator_new(vertHash); - !BLI_ghashIterator_isDone(hashIter); - BLI_ghashIterator_step(hashIter)) { - MVert source; - MVert *dest; - int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); - int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); - - dm->getVert(dm, oldIndex, &source); - dest = CDDM_get_vert(result, newIndex); - - DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); - *dest = source; - } - BLI_ghashIterator_free(hashIter); - - /* copy the edges across, remapping indices */ - for(i = 0; i < BLI_ghash_size(edgeHash); ++i) { - MEdge source; - MEdge *dest; - int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i))); - - dm->getEdge(dm, oldIndex, &source); - dest = CDDM_get_edge(result, i); - - source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); - source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); - - DM_copy_edge_data(dm, result, oldIndex, i, 1); - *dest = source; - } - - /* copy the faces across, remapping indices */ - for(i = 0; i < numFaces; ++i) { - MFace source; - MFace *dest; - int orig_v4; - - dm->getTessFace(dm, faceMap[i], &source); - dest = CDDM_get_tessface(result, i); - - orig_v4 = source.v4; - - source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); - source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); - source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3))); - if(source.v4) - source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4))); - - DM_copy_tessface_data(dm, result, faceMap[i], i, 1); - *dest = source; - - test_index_face(dest, &result->faceData, i, (orig_v4 ? 4 : 3)); - } - - CDDM_calc_normals(result); - CDDM_tessfaces_to_faces(result); - - BLI_ghash_free(vertHash, NULL, NULL); - BLI_ghash_free(edgeHash, NULL, NULL); - - MEM_freeN(vertMap); - MEM_freeN(edgeMap); - MEM_freeN(faceMap); - - return result; -} - -/* Mask */ - -static void maskModifier_copyData(ModifierData *md, ModifierData *target) -{ - MaskModifierData *mmd = (MaskModifierData*) md; - MaskModifierData *tmmd = (MaskModifierData*) target; - - strcpy(tmmd->vgroup, mmd->vgroup); -} - -static CustomDataMask maskModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - return (1 << CD_MDEFORMVERT); -} - -static void maskModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - MaskModifierData *mmd = (MaskModifierData *)md; - walk(userData, ob, &mmd->ob_arm); -} - -static void maskModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - MaskModifierData *mmd = (MaskModifierData *)md; - - if (mmd->ob_arm) - { - DagNode *armNode = dag_get_node(forest, mmd->ob_arm); - - dag_add_relation(forest, armNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mask Modifier"); - } -} - -static DerivedMesh *maskModifier_applyModifier(ModifierData *md, Object *ob, - DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - MaskModifierData *mmd= (MaskModifierData *)md; - DerivedMesh *dm= derivedData, *result= NULL; - GHash *vertHash=NULL, *edgeHash, *faceHash; - GHashIterator *hashIter; - MDeformVert *dvert= NULL; - int numFaces=0, numEdges=0, numVerts=0; - int maxVerts, maxEdges, maxFaces; - int i; - - /* Overview of Method: - * 1. Get the vertices that are in the vertexgroup of interest - * 2. Filter out unwanted geometry (i.e. not in vertexgroup), by populating mappings with new vs old indices - * 3. Make a new mesh containing only the mapping data - */ - - /* get original number of verts, edges, and faces */ - maxVerts= dm->getNumVerts(dm); - maxEdges= dm->getNumEdges(dm); - maxFaces= dm->getNumTessFaces(dm); - - /* check if we can just return the original mesh - * - must have verts and therefore verts assigned to vgroups to do anything useful - */ - if ( !(ELEM(mmd->mode, MOD_MASK_MODE_ARM, MOD_MASK_MODE_VGROUP)) || - (maxVerts == 0) || (ob->defbase.first == NULL) ) - { - return derivedData; - } - - /* if mode is to use selected armature bones, aggregate the bone groups */ - if (mmd->mode == MOD_MASK_MODE_ARM) /* --- using selected bones --- */ - { - GHash *vgroupHash, *boneHash; - Object *oba= mmd->ob_arm; - bPoseChannel *pchan; - bDeformGroup *def; - - /* check that there is armature object with bones to use, otherwise return original mesh */ - if (ELEM(NULL, mmd->ob_arm, mmd->ob_arm->pose)) - return derivedData; - - /* hashes for finding mapping of: - * - vgroups to indicies -> vgroupHash (string, int) - * - bones to vgroup indices -> boneHash (index of vgroup, dummy) - */ - vgroupHash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); - boneHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); - - /* build mapping of names of vertex groups to indices */ - for (i = 0, def = ob->defbase.first; def; def = def->next, i++) - BLI_ghash_insert(vgroupHash, def->name, SET_INT_IN_POINTER(i)); - - /* get selected-posechannel <-> vertexgroup index mapping */ - for (pchan= oba->pose->chanbase.first; pchan; pchan= pchan->next) - { - /* check if bone is selected */ - // TODO: include checks for visibility too? - // FIXME: the depsgraph needs extensions to make this work in realtime... - if ( (pchan->bone) && (pchan->bone->flag & BONE_SELECTED) ) - { - /* check if hash has group for this bone */ - if (BLI_ghash_haskey(vgroupHash, pchan->name)) - { - int defgrp_index= GET_INT_FROM_POINTER(BLI_ghash_lookup(vgroupHash, pchan->name)); - - /* add index to hash (store under key only) */ - BLI_ghash_insert(boneHash, SET_INT_IN_POINTER(defgrp_index), pchan); - } - } - } - - /* if no bones selected, free hashes and return original mesh */ - if (BLI_ghash_size(boneHash) == 0) - { - BLI_ghash_free(vgroupHash, NULL, NULL); - BLI_ghash_free(boneHash, NULL, NULL); - - return derivedData; - } - - /* repeat the previous check, but for dverts */ - dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT); - if (dvert == NULL) - { - BLI_ghash_free(vgroupHash, NULL, NULL); - BLI_ghash_free(boneHash, NULL, NULL); - - return derivedData; - } - - /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ - vertHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); - - /* add vertices which exist in vertexgroups into vertHash for filtering */ - for (i = 0; i < maxVerts; i++) - { - MDeformWeight *def_weight = NULL; - int j; - - for (j= 0; j < dvert[i].totweight; j++) - { - if (BLI_ghash_haskey(boneHash, SET_INT_IN_POINTER(dvert[i].dw[j].def_nr))) - { - def_weight = &dvert[i].dw[j]; - break; - } - } - - /* check if include vert in vertHash */ - if (mmd->flag & MOD_MASK_INV) { - /* if this vert is in the vgroup, don't include it in vertHash */ - if (def_weight) continue; - } - else { - /* if this vert isn't in the vgroup, don't include it in vertHash */ - if (!def_weight) continue; - } - - /* add to ghash for verts (numVerts acts as counter for mapping) */ - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts)); - numVerts++; - } - - /* free temp hashes */ - BLI_ghash_free(vgroupHash, NULL, NULL); - BLI_ghash_free(boneHash, NULL, NULL); - } - else /* --- Using Nominated VertexGroup only --- */ - { - int defgrp_index = defgroup_name_index(ob, mmd->vgroup); - - /* get dverts */ - if (defgrp_index >= 0) - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - - /* if no vgroup (i.e. dverts) found, return the initial mesh */ - if ((defgrp_index < 0) || (dvert == NULL)) - return dm; - - /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ - vertHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); - - /* add vertices which exist in vertexgroup into ghash for filtering */ - for (i = 0; i < maxVerts; i++) - { - MDeformWeight *def_weight = NULL; - int j; - - for (j= 0; j < dvert[i].totweight; j++) - { - if (dvert[i].dw[j].def_nr == defgrp_index) - { - def_weight = &dvert[i].dw[j]; - break; - } - } - - /* check if include vert in vertHash */ - if (mmd->flag & MOD_MASK_INV) { - /* if this vert is in the vgroup, don't include it in vertHash */ - if (def_weight) continue; - } - else { - /* if this vert isn't in the vgroup, don't include it in vertHash */ - if (!def_weight) continue; - } - - /* add to ghash for verts (numVerts acts as counter for mapping) */ - BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts)); - numVerts++; - } - } - - /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ - edgeHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); - faceHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); - - /* loop over edges and faces, and do the same thing to - * ensure that they only reference existing verts - */ - for (i = 0; i < maxEdges; i++) - { - MEdge me; - dm->getEdge(dm, i, &me); - - /* only add if both verts will be in new mesh */ - if ( BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1)) && - BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2)) ) - { - BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numEdges)); - numEdges++; - } - } - for (i = 0; i < maxFaces; i++) - { - MFace mf; - dm->getTessFace(dm, i, &mf); - - /* all verts must be available */ - if ( BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v1)) && - BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v2)) && - BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v3)) && - (mf.v4==0 || BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v4))) ) - { - BLI_ghash_insert(faceHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numFaces)); - numFaces++; - } - } - - - /* now we know the number of verts, edges and faces, - * we can create the new (reduced) mesh - */ - result = CDDM_from_template(dm, numVerts, numEdges, numFaces, 0, 0); - - - /* using ghash-iterators, map data into new mesh */ - /* vertices */ - for ( hashIter = BLI_ghashIterator_new(vertHash); - !BLI_ghashIterator_isDone(hashIter); - BLI_ghashIterator_step(hashIter) ) - { - MVert source; - MVert *dest; - int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); - int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); - - dm->getVert(dm, oldIndex, &source); - dest = CDDM_get_vert(result, newIndex); - - DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); - *dest = source; - } - BLI_ghashIterator_free(hashIter); - - /* edges */ - for ( hashIter = BLI_ghashIterator_new(edgeHash); - !BLI_ghashIterator_isDone(hashIter); - BLI_ghashIterator_step(hashIter) ) - { - MEdge source; - MEdge *dest; - int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); - int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); - - dm->getEdge(dm, oldIndex, &source); - dest = CDDM_get_edge(result, newIndex); - - source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); - source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); - - DM_copy_edge_data(dm, result, oldIndex, newIndex, 1); - *dest = source; - } - BLI_ghashIterator_free(hashIter); - - /* faces */ - for ( hashIter = BLI_ghashIterator_new(faceHash); - !BLI_ghashIterator_isDone(hashIter); - BLI_ghashIterator_step(hashIter) ) - { - MFace source; - MFace *dest; - int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); - int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); - int orig_v4; - - dm->getTessFace(dm, oldIndex, &source); - dest = CDDM_get_tessface(result, newIndex); - - orig_v4 = source.v4; - - source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); - source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); - source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3))); - if (source.v4) - source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4))); - - DM_copy_tessface_data(dm, result, oldIndex, newIndex, 1); - *dest = source; - - test_index_face(dest, &result->faceData, newIndex, (orig_v4 ? 4 : 3)); - } - BLI_ghashIterator_free(hashIter); - - /* recalculate normals */ - CDDM_calc_normals(result); - - /* free hashes */ - BLI_ghash_free(vertHash, NULL, NULL); - BLI_ghash_free(edgeHash, NULL, NULL); - BLI_ghash_free(faceHash, NULL, NULL); - - CDDM_tessfaces_to_faces(result); - - /* return the new mesh */ - return result; -} - -/* Array */ -/* Array modifier: duplicates the object multiple times along an axis -*/ - -static void arrayModifier_initData(ModifierData *md) -{ - ArrayModifierData *amd = (ArrayModifierData*) md; - - /* default to 2 duplicates distributed along the x-axis by an - offset of 1 object-width - */ - amd->start_cap = amd->end_cap = amd->curve_ob = amd->offset_ob = NULL; - amd->count = 2; - amd->offset[0] = amd->offset[1] = amd->offset[2] = 0; - amd->scale[0] = 1; - amd->scale[1] = amd->scale[2] = 0; - amd->length = 0; - amd->merge_dist = 0.01; - amd->fit_type = MOD_ARR_FIXEDCOUNT; - amd->offset_type = MOD_ARR_OFF_RELATIVE; - amd->flags = 0; -} - -static void arrayModifier_copyData(ModifierData *md, ModifierData *target) -{ - ArrayModifierData *amd = (ArrayModifierData*) md; - ArrayModifierData *tamd = (ArrayModifierData*) target; - - tamd->start_cap = amd->start_cap; - tamd->end_cap = amd->end_cap; - tamd->curve_ob = amd->curve_ob; - tamd->offset_ob = amd->offset_ob; - tamd->count = amd->count; - VECCOPY(tamd->offset, amd->offset); - VECCOPY(tamd->scale, amd->scale); - tamd->length = amd->length; - tamd->merge_dist = amd->merge_dist; - tamd->fit_type = amd->fit_type; - tamd->offset_type = amd->offset_type; - tamd->flags = amd->flags; -} - -static void arrayModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - ArrayModifierData *amd = (ArrayModifierData*) md; - - walk(userData, ob, &amd->start_cap); - walk(userData, ob, &amd->end_cap); - walk(userData, ob, &amd->curve_ob); - walk(userData, ob, &amd->offset_ob); -} - -static void arrayModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - ArrayModifierData *amd = (ArrayModifierData*) md; - - if (amd->start_cap) { - DagNode *curNode = dag_get_node(forest, amd->start_cap); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } - if (amd->end_cap) { - DagNode *curNode = dag_get_node(forest, amd->end_cap); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } - if (amd->curve_ob) { - DagNode *curNode = dag_get_node(forest, amd->curve_ob); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } - if (amd->offset_ob) { - DagNode *curNode = dag_get_node(forest, amd->offset_ob); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); - } -} - -static float vertarray_size(MVert *mvert, int numVerts, int axis) -{ - int i; - float min_co, max_co; - - /* if there are no vertices, width is 0 */ - if(numVerts == 0) return 0; - - /* find the minimum and maximum coordinates on the desired axis */ - min_co = max_co = mvert->co[axis]; - ++mvert; - for(i = 1; i < numVerts; ++i, ++mvert) { - if(mvert->co[axis] < min_co) min_co = mvert->co[axis]; - if(mvert->co[axis] > max_co) max_co = mvert->co[axis]; - } - - return max_co - min_co; -} - -typedef struct IndexMapEntry { - /* the new vert index that this old vert index maps to */ - int new; - /* -1 if this vert isn't merged, otherwise the old vert index it - * should be replaced with - */ - int merge; - /* 1 if this vert's first copy is merged with the last copy of its - * merge target, otherwise 0 - */ - short merge_final; -} IndexMapEntry; - -/* indexMap - an array of IndexMap entries - * oldIndex - the old index to map - * copyNum - the copy number to map to (original = 0, first copy = 1, etc.) - */ -static int calc_mapping(IndexMapEntry *indexMap, int oldIndex, int copyNum) -{ - if(indexMap[oldIndex].merge < 0) { - /* vert wasn't merged, so use copy of this vert */ - return indexMap[oldIndex].new + copyNum; - } else if(indexMap[oldIndex].merge == oldIndex) { - /* vert was merged with itself */ - return indexMap[oldIndex].new; - } else { - /* vert was merged with another vert */ - /* follow the chain of merges to the end, or until we've passed - * a number of vertices equal to the copy number - */ - if(copyNum <= 0) - return indexMap[oldIndex].new; - else - return calc_mapping(indexMap, indexMap[oldIndex].merge, - copyNum - 1); - } -} - -#if 0 -static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, - Scene *scene, Object *ob, DerivedMesh *dm, - int initFlags) -{ - int i, j; - /* offset matrix */ - float offset[4][4]; - float final_offset[4][4]; - float tmp_mat[4][4]; - float length = amd->length; - int count = amd->count; - int numVerts, numEdges, numFaces; - int maxVerts, maxEdges, maxFaces; - int finalVerts, finalEdges, finalFaces; - DerivedMesh *result, *start_cap = NULL, *end_cap = NULL; - MVert *mvert, *src_mvert; - MEdge *medge; - MFace *mface; - - IndexMapEntry *indexMap; - - EdgeHash *edges; - - /* need to avoid infinite recursion here */ - if(amd->start_cap && amd->start_cap != ob) - start_cap = amd->start_cap->derivedFinal; - if(amd->end_cap && amd->end_cap != ob) - end_cap = amd->end_cap->derivedFinal; - - unit_m4(offset); - - indexMap = MEM_callocN(sizeof(*indexMap) * dm->getNumVerts(dm), - "indexmap"); - - src_mvert = dm->getVertArray(dm); - - maxVerts = dm->getNumVerts(dm); - - if(amd->offset_type & MOD_ARR_OFF_CONST) - add_v3_v3v3(offset[3], offset[3], amd->offset); - if(amd->offset_type & MOD_ARR_OFF_RELATIVE) { - for(j = 0; j < 3; j++) - offset[3][j] += amd->scale[j] * vertarray_size(src_mvert, - maxVerts, j); - } - - if((amd->offset_type & MOD_ARR_OFF_OBJ) && (amd->offset_ob)) { - float obinv[4][4]; - float result_mat[4][4]; - - if(ob) - invert_m4_m4(obinv, ob->obmat); - else - unit_m4(obinv); - - mul_serie_m4(result_mat, offset, - obinv, amd->offset_ob->obmat, - NULL, NULL, NULL, NULL, NULL); - copy_m4_m4(offset, result_mat); - } - - if(amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) { - Curve *cu = amd->curve_ob->data; - if(cu) { - float tmp_mat[3][3]; - float scale; - - object_to_mat3(amd->curve_ob, tmp_mat); - scale = mat3_to_scale(tmp_mat); - - if(!cu->path) { - cu->flag |= CU_PATH; // needed for path & bevlist - makeDispListCurveTypes(scene, amd->curve_ob, 0); - } - if(cu->path) - length = scale*cu->path->totdist; - } - } - - /* calculate the maximum number of copies which will fit within the - prescribed length */ - if(amd->fit_type == MOD_ARR_FITLENGTH - || amd->fit_type == MOD_ARR_FITCURVE) { - float dist = sqrt(dot_v3v3(offset[3], offset[3])); - - if(dist > 1e-6f) - /* this gives length = first copy start to last copy end - add a tiny offset for floating point rounding errors */ - count = (length + 1e-6f) / dist; - else - /* if the offset has no translation, just make one copy */ - count = 1; - } - - if(count < 1) - count = 1; - - /* allocate memory for count duplicates (including original) plus - * start and end caps - */ - finalVerts = dm->getNumVerts(dm) * count; - finalEdges = dm->getNumEdges(dm) * count; - finalFaces = dm->getNumTessFaces(dm) * count; - if(start_cap) { - finalVerts += start_cap->getNumVerts(start_cap); - finalEdges += start_cap->getNumEdges(start_cap); - finalFaces += start_cap->getNumTessFaces(start_cap); - } - if(end_cap) { - finalVerts += end_cap->getNumVerts(end_cap); - finalEdges += end_cap->getNumEdges(end_cap); - finalFaces += end_cap->getNumTessFaces(end_cap); - } - result = CDDM_from_template(dm, finalVerts, finalEdges, finalFaces, 0, 0); - - /* calculate the offset matrix of the final copy (for merging) */ - unit_m4(final_offset); - - for(j=0; j < count - 1; j++) { - mul_m4_m4m4(tmp_mat, final_offset, offset); - copy_m4_m4(final_offset, tmp_mat); - } - - numVerts = numEdges = numFaces = 0; - mvert = CDDM_get_verts(result); - - for (i = 0; i < maxVerts; i++) { - indexMap[i].merge = -1; /* default to no merge */ - indexMap[i].merge_final = 0; /* default to no merge */ - } - - for (i = 0; i < maxVerts; i++) { - MVert *inMV; - MVert *mv = &mvert[numVerts]; - MVert *mv2; - float co[3]; - - inMV = &src_mvert[i]; - - DM_copy_vert_data(dm, result, i, numVerts, 1); - *mv = *inMV; - numVerts++; - - indexMap[i].new = numVerts - 1; - - VECCOPY(co, mv->co); - - /* Attempts to merge verts from one duplicate with verts from the - * next duplicate which are closer than amd->merge_dist. - * Only the first such vert pair is merged. - * If verts are merged in the first duplicate pair, they are merged - * in all pairs. - */ - if((count > 1) && (amd->flags & MOD_ARR_MERGE)) { - float tmp_co[3]; - VECCOPY(tmp_co, mv->co); - mul_m4_v3(offset, tmp_co); - - for(j = 0; j < maxVerts; j++) { - /* if vertex already merged, don't use it */ - if( indexMap[j].merge != -1 ) continue; - - inMV = &src_mvert[j]; - /* if this vert is within merge limit, merge */ - if(compare_len_v3v3(tmp_co, inMV->co, amd->merge_dist)) { - indexMap[i].merge = j; - - /* test for merging with final copy of merge target */ - if(amd->flags & MOD_ARR_MERGEFINAL) { - VECCOPY(tmp_co, inMV->co); - inMV = &src_mvert[i]; - mul_m4_v3(final_offset, tmp_co); - if(compare_len_v3v3(tmp_co, inMV->co, amd->merge_dist)) - indexMap[i].merge_final = 1; - } - break; - } - } - } - - /* if no merging, generate copies of this vert */ - if(indexMap[i].merge < 0) { - for(j=0; j < count - 1; j++) { - mv2 = &mvert[numVerts]; - - DM_copy_vert_data(result, result, numVerts - 1, numVerts, 1); - *mv2 = *mv; - numVerts++; - - mul_m4_v3(offset, co); - VECCOPY(mv2->co, co); - } - } else if(indexMap[i].merge != i && indexMap[i].merge_final) { - /* if this vert is not merging with itself, and it is merging - * with the final copy of its merge target, remove the first copy - */ - numVerts--; - DM_free_vert_data(result, numVerts, 1); - } - } - - /* make a hashtable so we can avoid duplicate edges from merging */ - edges = BLI_edgehash_new(); - - maxEdges = dm->getNumEdges(dm); - medge = CDDM_get_edges(result); - for(i = 0; i < maxEdges; i++) { - MEdge inMED; - MEdge med; - MEdge *med2; - int vert1, vert2; - - dm->getEdge(dm, i, &inMED); - - med = inMED; - med.v1 = indexMap[inMED.v1].new; - med.v2 = indexMap[inMED.v2].new; - - /* if vertices are to be merged with the final copies of their - * merge targets, calculate that final copy - */ - if(indexMap[inMED.v1].merge_final) { - med.v1 = calc_mapping(indexMap, indexMap[inMED.v1].merge, - count - 1); - } - if(indexMap[inMED.v2].merge_final) { - med.v2 = calc_mapping(indexMap, indexMap[inMED.v2].merge, - count - 1); - } - - if(med.v1 == med.v2) continue; - - if (initFlags) { - med.flag |= ME_EDGEDRAW | ME_EDGERENDER; - } - - if(!BLI_edgehash_haskey(edges, med.v1, med.v2)) { - DM_copy_edge_data(dm, result, i, numEdges, 1); - medge[numEdges] = med; - numEdges++; - - BLI_edgehash_insert(edges, med.v1, med.v2, NULL); - } - - for(j = 1; j < count; j++) - { - vert1 = calc_mapping(indexMap, inMED.v1, j); - vert2 = calc_mapping(indexMap, inMED.v2, j); - /* avoid duplicate edges */ - if(!BLI_edgehash_haskey(edges, vert1, vert2)) { - med2 = &medge[numEdges]; - - DM_copy_edge_data(dm, result, i, numEdges, 1); - *med2 = med; - numEdges++; - - med2->v1 = vert1; - med2->v2 = vert2; - - BLI_edgehash_insert(edges, med2->v1, med2->v2, NULL); - } - } - } - - maxFaces = dm->getNumTessFaces(dm); - mface = CDDM_get_tessfaces(result); - for (i=0; i < maxFaces; i++) { - MFace inMF; - MFace *mf = &mface[numFaces]; - - dm->getTessFace(dm, i, &inMF); - - DM_copy_tessface_data(dm, result, i, numFaces, 1); - *mf = inMF; - - mf->v1 = indexMap[inMF.v1].new; - mf->v2 = indexMap[inMF.v2].new; - mf->v3 = indexMap[inMF.v3].new; - if(inMF.v4) - mf->v4 = indexMap[inMF.v4].new; - - /* if vertices are to be merged with the final copies of their - * merge targets, calculate that final copy - */ - if(indexMap[inMF.v1].merge_final) - mf->v1 = calc_mapping(indexMap, indexMap[inMF.v1].merge, count-1); - if(indexMap[inMF.v2].merge_final) - mf->v2 = calc_mapping(indexMap, indexMap[inMF.v2].merge, count-1); - if(indexMap[inMF.v3].merge_final) - mf->v3 = calc_mapping(indexMap, indexMap[inMF.v3].merge, count-1); - if(inMF.v4 && indexMap[inMF.v4].merge_final) - mf->v4 = calc_mapping(indexMap, indexMap[inMF.v4].merge, count-1); - - if(test_index_face(mf, &result->faceData, numFaces, inMF.v4?4:3) < 3) - continue; - - numFaces++; - - /* if the face has fewer than 3 vertices, don't create it */ - if(mf->v3 == 0 || (mf->v1 && (mf->v1 == mf->v3 || mf->v1 == mf->v4))) { - numFaces--; - DM_free_face_data(result, numFaces, 1); - } - - for(j = 1; j < count; j++) - { - MFace *mf2 = &mface[numFaces]; - - DM_copy_tessface_data(dm, result, i, numFaces, 1); - *mf2 = *mf; - - mf2->v1 = calc_mapping(indexMap, inMF.v1, j); - mf2->v2 = calc_mapping(indexMap, inMF.v2, j); - mf2->v3 = calc_mapping(indexMap, inMF.v3, j); - if (inMF.v4) - mf2->v4 = calc_mapping(indexMap, inMF.v4, j); - - test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3); - numFaces++; - - /* if the face has fewer than 3 vertices, don't create it */ - if(mf2->v3 == 0 || (mf2->v1 && (mf2->v1 == mf2->v3 || mf2->v1 == - mf2->v4))) { - numFaces--; - DM_free_face_data(result, numFaces, 1); - } - } - } - - /* add start and end caps */ - if(start_cap) { - float startoffset[4][4]; - MVert *cap_mvert; - MEdge *cap_medge; - MFace *cap_mface; - int *origindex; - int *vert_map; - int capVerts, capEdges, capFaces; - - capVerts = start_cap->getNumVerts(start_cap); - capEdges = start_cap->getNumEdges(start_cap); - capFaces = start_cap->getNumTessFaces(start_cap); - cap_mvert = start_cap->getVertArray(start_cap); - cap_medge = start_cap->getEdgeArray(start_cap); - cap_mface = start_cap->getTessFaceArray(start_cap); - - invert_m4_m4(startoffset, offset); - - vert_map = MEM_callocN(sizeof(*vert_map) * capVerts, - "arrayModifier_doArray vert_map"); - - origindex = result->getVertDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capVerts; i++) { - MVert *mv = &cap_mvert[i]; - short merged = 0; - - if(amd->flags & MOD_ARR_MERGE) { - float tmp_co[3]; - MVert *in_mv; - int j; - - VECCOPY(tmp_co, mv->co); - mul_m4_v3(startoffset, tmp_co); - - for(j = 0; j < maxVerts; j++) { - in_mv = &src_mvert[j]; - /* if this vert is within merge limit, merge */ - if(compare_len_v3v3(tmp_co, in_mv->co, amd->merge_dist)) { - vert_map[i] = calc_mapping(indexMap, j, 0); - merged = 1; - break; - } - } - } - - if(!merged) { - DM_copy_vert_data(start_cap, result, i, numVerts, 1); - mvert[numVerts] = *mv; - mul_m4_v3(startoffset, mvert[numVerts].co); - origindex[numVerts] = ORIGINDEX_NONE; - - vert_map[i] = numVerts; - - numVerts++; - } - } - origindex = result->getEdgeDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capEdges; i++) { - int v1, v2; - - v1 = vert_map[cap_medge[i].v1]; - v2 = vert_map[cap_medge[i].v2]; - - if(!BLI_edgehash_haskey(edges, v1, v2)) { - DM_copy_edge_data(start_cap, result, i, numEdges, 1); - medge[numEdges] = cap_medge[i]; - medge[numEdges].v1 = v1; - medge[numEdges].v2 = v2; - origindex[numEdges] = ORIGINDEX_NONE; - - numEdges++; - } - } - origindex = result->getTessFaceDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capFaces; i++) { - DM_copy_tessface_data(start_cap, result, i, numFaces, 1); - mface[numFaces] = cap_mface[i]; - mface[numFaces].v1 = vert_map[mface[numFaces].v1]; - mface[numFaces].v2 = vert_map[mface[numFaces].v2]; - mface[numFaces].v3 = vert_map[mface[numFaces].v3]; - if(mface[numFaces].v4) { - mface[numFaces].v4 = vert_map[mface[numFaces].v4]; - - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 4); - } - else - { - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 3); - } - - origindex[numFaces] = ORIGINDEX_NONE; - - numFaces++; - } - - MEM_freeN(vert_map); - start_cap->release(start_cap); - } - - if(end_cap) { - float endoffset[4][4]; - MVert *cap_mvert; - MEdge *cap_medge; - MFace *cap_mface; - int *origindex; - int *vert_map; - int capVerts, capEdges, capFaces; - - capVerts = end_cap->getNumVerts(end_cap); - capEdges = end_cap->getNumEdges(end_cap); - capFaces = end_cap->getNumTessFaces(end_cap); - cap_mvert = end_cap->getVertArray(end_cap); - cap_medge = end_cap->getEdgeArray(end_cap); - cap_mface = end_cap->getTessFaceArray(end_cap); - - mul_m4_m4m4(endoffset, final_offset, offset); - - vert_map = MEM_callocN(sizeof(*vert_map) * capVerts, - "arrayModifier_doArray vert_map"); - - origindex = result->getVertDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capVerts; i++) { - MVert *mv = &cap_mvert[i]; - short merged = 0; - - if(amd->flags & MOD_ARR_MERGE) { - float tmp_co[3]; - MVert *in_mv; - int j; - - VECCOPY(tmp_co, mv->co); - mul_m4_v3(offset, tmp_co); - - for(j = 0; j < maxVerts; j++) { - in_mv = &src_mvert[j]; - /* if this vert is within merge limit, merge */ - if(compare_len_v3v3(tmp_co, in_mv->co, amd->merge_dist)) { - vert_map[i] = calc_mapping(indexMap, j, count - 1); - merged = 1; - break; - } - } - } - - if(!merged) { - DM_copy_vert_data(end_cap, result, i, numVerts, 1); - mvert[numVerts] = *mv; - mul_m4_v3(endoffset, mvert[numVerts].co); - origindex[numVerts] = ORIGINDEX_NONE; - - vert_map[i] = numVerts; - - numVerts++; - } - } - origindex = result->getEdgeDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capEdges; i++) { - int v1, v2; - - v1 = vert_map[cap_medge[i].v1]; - v2 = vert_map[cap_medge[i].v2]; - - if(!BLI_edgehash_haskey(edges, v1, v2)) { - DM_copy_edge_data(end_cap, result, i, numEdges, 1); - medge[numEdges] = cap_medge[i]; - medge[numEdges].v1 = v1; - medge[numEdges].v2 = v2; - origindex[numEdges] = ORIGINDEX_NONE; - - numEdges++; - } - } - origindex = result->getTessFaceDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capFaces; i++) { - DM_copy_tessface_data(end_cap, result, i, numFaces, 1); - mface[numFaces] = cap_mface[i]; - mface[numFaces].v1 = vert_map[mface[numFaces].v1]; - mface[numFaces].v2 = vert_map[mface[numFaces].v2]; - mface[numFaces].v3 = vert_map[mface[numFaces].v3]; - if(mface[numFaces].v4) { - mface[numFaces].v4 = vert_map[mface[numFaces].v4]; - - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 4); - } - else - { - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 3); - } - origindex[numFaces] = ORIGINDEX_NONE; - - numFaces++; - } - - MEM_freeN(vert_map); - end_cap->release(end_cap); - } - - BLI_edgehash_free(edges, NULL); - MEM_freeN(indexMap); - - CDDM_lower_num_verts(result, numVerts); - CDDM_lower_num_edges(result, numEdges); - CDDM_lower_num_faces(result, numFaces); - - CDDM_tessfaces_to_faces(result); - - return result; -} - -static DerivedMesh *arrayModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - ArrayModifierData *amd = (ArrayModifierData*) md; - - result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0); - - if(result != derivedData) - CDDM_calc_normals(result); - - return result; -} - -static DerivedMesh *arrayModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return arrayModifier_applyModifier(md, ob, derivedData, 0, 1); -} -#endif - -DerivedMesh *arrayModifier_applyModifier(ModifierData *md, Object *ob, - DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc); -DerivedMesh *arrayModifier_applyModifierEM(ModifierData *md, Object *ob, - BMEditMesh *editData, - DerivedMesh *derivedData); - -/* Mirror */ - -static void mirrorModifier_initData(ModifierData *md) -{ - MirrorModifierData *mmd = (MirrorModifierData*) md; - - mmd->flag |= (MOD_MIR_AXIS_X | MOD_MIR_VGROUP); - mmd->tolerance = 0.001; - mmd->mirror_ob = NULL; -} - -static void mirrorModifier_copyData(ModifierData *md, ModifierData *target) -{ - MirrorModifierData *mmd = (MirrorModifierData*) md; - MirrorModifierData *tmmd = (MirrorModifierData*) target; - - tmmd->axis = mmd->axis; - tmmd->flag = mmd->flag; - tmmd->tolerance = mmd->tolerance; - tmmd->mirror_ob = mmd->mirror_ob;; -} - -static void mirrorModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - MirrorModifierData *mmd = (MirrorModifierData*) md; - - walk(userData, ob, &mmd->mirror_ob); -} - -static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - MirrorModifierData *mmd = (MirrorModifierData*) md; - - if(mmd->mirror_ob) { - DagNode *latNode = dag_get_node(forest, mmd->mirror_ob); - - dag_add_relation(forest, latNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mirror Modifier"); - } -} - -#if 0 -static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd, - Object *ob, - DerivedMesh *dm, - int initFlags, - int axis) -{ - int i; - float tolerance = mmd->tolerance; - DerivedMesh *result; - int numVerts, numEdges, numFaces; - int maxVerts = dm->getNumVerts(dm); - int maxEdges = dm->getNumEdges(dm); - int maxFaces = dm->getNumTessFaces(dm); - int *flip_map= NULL; - int do_vgroup_mirr= (mmd->flag & MOD_MIR_VGROUP); - int (*indexMap)[2]; - float mtx[4][4], imtx[4][4]; - - numVerts = numEdges = numFaces = 0; - - indexMap = MEM_mallocN(sizeof(*indexMap) * maxVerts, "indexmap"); - - result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2, 0, 0); - - - if (do_vgroup_mirr) { - flip_map= defgroup_flip_map(ob, 0); - if(flip_map == NULL) - do_vgroup_mirr= 0; - } - - if (mmd->mirror_ob) { - float obinv[4][4]; - - invert_m4_m4(obinv, mmd->mirror_ob->obmat); - mul_m4_m4m4(mtx, ob->obmat, obinv); - invert_m4_m4(imtx, mtx); - } - - for(i = 0; i < maxVerts; i++) { - MVert inMV; - MVert *mv = CDDM_get_vert(result, numVerts); - int isShared; - float co[3]; - - dm->getVert(dm, i, &inMV); - - copy_v3_v3(co, inMV.co); - - if (mmd->mirror_ob) { - mul_v3_m4v3(co, mtx, co); - } - isShared = ABS(co[axis])<=tolerance; - - /* Because the topology result (# of vertices) must be the same if - * the mesh data is overridden by vertex cos, have to calc sharedness - * based on original coordinates. This is why we test before copy. - */ - DM_copy_vert_data(dm, result, i, numVerts, 1); - *mv = inMV; - numVerts++; - - indexMap[i][0] = numVerts - 1; - indexMap[i][1] = !isShared; - - if(isShared) { - co[axis] = 0; - if (mmd->mirror_ob) { - mul_v3_m4v3(co, imtx, co); - } - copy_v3_v3(mv->co, co); - - mv->flag |= ME_VERT_MERGED; - } else { - MVert *mv2 = CDDM_get_vert(result, numVerts); - - DM_copy_vert_data(dm, result, i, numVerts, 1); - *mv2 = *mv; - - co[axis] = -co[axis]; - if (mmd->mirror_ob) { - mul_v3_m4v3(co, imtx, co); - } - copy_v3_v3(mv2->co, co); - - if (do_vgroup_mirr) { - MDeformVert *dvert= DM_get_vert_data(result, numVerts, CD_MDEFORMVERT); - if(dvert) { - defvert_flip(dvert, flip_map); - } - } - - numVerts++; - } - } - - for(i = 0; i < maxEdges; i++) { - MEdge inMED; - MEdge *med = CDDM_get_edge(result, numEdges); - - dm->getEdge(dm, i, &inMED); - - DM_copy_edge_data(dm, result, i, numEdges, 1); - *med = inMED; - numEdges++; - - med->v1 = indexMap[inMED.v1][0]; - med->v2 = indexMap[inMED.v2][0]; - if(initFlags) - med->flag |= ME_EDGEDRAW | ME_EDGERENDER; - - if(indexMap[inMED.v1][1] || indexMap[inMED.v2][1]) { - MEdge *med2 = CDDM_get_edge(result, numEdges); - - DM_copy_edge_data(dm, result, i, numEdges, 1); - *med2 = *med; - numEdges++; - - med2->v1 += indexMap[inMED.v1][1]; - med2->v2 += indexMap[inMED.v2][1]; - } - } - - for(i = 0; i < maxFaces; i++) { - MFace inMF; - MFace *mf = CDDM_get_tessface(result, numFaces); - - dm->getTessFace(dm, i, &inMF); - - DM_copy_tessface_data(dm, result, i, numFaces, 1); - *mf = inMF; - numFaces++; - - mf->v1 = indexMap[inMF.v1][0]; - mf->v2 = indexMap[inMF.v2][0]; - mf->v3 = indexMap[inMF.v3][0]; - mf->v4 = indexMap[inMF.v4][0]; - - if(indexMap[inMF.v1][1] - || indexMap[inMF.v2][1] - || indexMap[inMF.v3][1] - || (mf->v4 && indexMap[inMF.v4][1])) { - MFace *mf2 = CDDM_get_tessface(result, numFaces); - static int corner_indices[4] = {2, 1, 0, 3}; - - DM_copy_tessface_data(dm, result, i, numFaces, 1); - *mf2 = *mf; - - mf2->v1 += indexMap[inMF.v1][1]; - mf2->v2 += indexMap[inMF.v2][1]; - mf2->v3 += indexMap[inMF.v3][1]; - if(inMF.v4) mf2->v4 += indexMap[inMF.v4][1]; - - /* mirror UVs if enabled */ - if(mmd->flag & (MOD_MIR_MIRROR_U | MOD_MIR_MIRROR_V)) { - MTFace *tf = result->getTessFaceData(result, numFaces, CD_MTFACE); - if(tf) { - int j; - for(j = 0; j < 4; ++j) { - if(mmd->flag & MOD_MIR_MIRROR_U) - tf->uv[j][0] = 1.0f - tf->uv[j][0]; - if(mmd->flag & MOD_MIR_MIRROR_V) - tf->uv[j][1] = 1.0f - tf->uv[j][1]; - } - } - } - - /* Flip face normal */ - SWAP(int, mf2->v1, mf2->v3); - DM_swap_tessface_data(result, numFaces, corner_indices); - - test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3); - numFaces++; - } - } - - if (flip_map) MEM_freeN(flip_map); - - MEM_freeN(indexMap); - - CDDM_lower_num_verts(result, numVerts); - CDDM_lower_num_edges(result, numEdges); - CDDM_lower_num_faces(result, numFaces); - - CDDM_tessfaces_to_faces(result); - - return result; -} -#endif - -DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd, - Object *ob, - DerivedMesh *dm, - int initFlags, - int axis); -static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd, - Object *ob, DerivedMesh *dm, - int initFlags) -{ - DerivedMesh *result = dm; - - /* check which axes have been toggled and mirror accordingly */ - if(mmd->flag & MOD_MIR_AXIS_X) { - result = doMirrorOnAxis(mmd, ob, result, initFlags, 0); - } - if(mmd->flag & MOD_MIR_AXIS_Y) { - DerivedMesh *tmp = result; - result = doMirrorOnAxis(mmd, ob, result, initFlags, 1); - if(tmp != dm) tmp->release(tmp); /* free intermediate results */ - } - if(mmd->flag & MOD_MIR_AXIS_Z) { - DerivedMesh *tmp = result; - result = doMirrorOnAxis(mmd, ob, result, initFlags, 2); - if(tmp != dm) tmp->release(tmp); /* free intermediate results */ - } - - return result; -} - -static DerivedMesh *mirrorModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - MirrorModifierData *mmd = (MirrorModifierData*) md; - - result = mirrorModifier__doMirror(mmd, ob, derivedData, 0); - - if(result != derivedData) - CDDM_calc_normals(result); - - return result; -} - -static DerivedMesh *mirrorModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return mirrorModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* EdgeSplit */ -/* EdgeSplit modifier: Splits edges in the mesh according to sharpness flag - * or edge angle (can be used to achieve autosmoothing) -*/ - -/*new cddm-based edge split code*/ -typedef struct VertUser { - int ov, v, done; - ListBase users; -} VertUser; - -typedef struct EdgeNode { - struct EdgeNode *next, *prev; - struct EdgeData *edge; -} EdgeNode; - -typedef struct EdgeData { - EdgeNode v1node, v2node; - VertUser *v1user, *v2user; - float fno[3]; /*used to calculate face angles*/ - int has_fno; - int tag; - int v1, v2; - int used; -} EdgeData; - -typedef struct MemBase { - BLI_mempool *vertuserpool; -} MemBase; - -BM_INLINE EdgeData *edge_get_next(EdgeData *e, int ov) { - if (ov == e->v1) - return e->v1node.next ? e->v1node.next->edge : NULL; - else return e->v2node.next ? e->v2node.next->edge : NULL; -} - -BM_INLINE EdgeNode *edge_get_node(EdgeData *e, int ov) -{ - if (ov == e->v1) - return &e->v1node; - else return &e->v2node; -} - -BM_INLINE VertUser *edge_get_vuser(MemBase *b, EdgeData *edge, int ov) -{ - if (ov == edge->v1) - return edge->v1user; - else if (ov == edge->v2) - return edge->v2user; - else { - printf("yeek!!\n"); - return NULL; - } -} - -BM_INLINE void edge_set_vuser(MemBase *b, EdgeData *e, int ov, VertUser *vu) - -{ - VertUser *olduser = edge_get_vuser(b, e, ov); - - if (vu == olduser) - return; - - if (olduser) - BLI_remlink(&olduser->users, ov==e->v1 ? &e->v1node : &e->v2node); - BLI_addtail(&vu->users, ov==e->v1 ? &e->v1node : &e->v2node); - - if (ov == e->v1) - e->v1user = vu; - else e->v2user = vu; -} - -BM_INLINE VertUser *new_vuser(MemBase *base) -{ - VertUser *vusr = BLI_mempool_calloc(base->vertuserpool); - - return vusr; -} - -BM_INLINE MemBase *new_membase(void) -{ - MemBase *b = MEM_callocN(sizeof(MemBase), "MemBase for edgesplit in modifier.c"); - b->vertuserpool = BLI_mempool_create(sizeof(VertUser), 1, 2048, 1, 0); - - return b; -} - -BM_INLINE void free_membase(MemBase *b) -{ - BLI_mempool_destroy(b->vertuserpool); - MEM_freeN(b); -} - -BM_INLINE EdgeData *edge_get_first(VertUser *vu) -{ - return vu->users.first ? ((EdgeNode*)vu->users.first)->edge : NULL; -} - -DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd) -{ - DerivedMesh *cddm = CDDM_copy(dm, 0); - MEdge *medge; - BLI_array_declare(medge); - MLoop *mloop, *ml, *prevl; - MPoly *mpoly, *mp; - MVert *mvert; - BLI_array_declare(mvert); - EdgeData *etags, *e, *enext; - BLI_array_declare(etags); - VertUser *vu, *vu2; - MemBase *membase; - CustomData edata, vdata; - int i, j, curv, cure; - float threshold = cos((emd->split_angle + 0.00001) * M_PI / 180.0); - float no[3], edge_angle_cos; - - if (!cddm->numVertData || !cddm->numEdgeData) - return cddm; - - membase = new_membase(); - - etags = MEM_callocN(sizeof(EdgeData)*cddm->numEdgeData, "edgedata tag thingies"); - BLI_array_set_length(etags, cddm->numEdgeData); - - mvert = cddm->getVertArray(cddm); - BLI_array_set_length(mvert, cddm->numVertData); - medge = cddm->getEdgeArray(cddm); - BLI_array_set_length(medge, cddm->numEdgeData); - mloop = CustomData_get_layer(&cddm->loopData, CD_MLOOP); - mpoly = CustomData_get_layer(&cddm->polyData, CD_MPOLY); - - for (i=0; i<cddm->numEdgeData; i++) { - etags[i].v1 = medge[i].v1; - etags[i].v2 = medge[i].v2; - - etags[i].tag = (medge[i].flag & ME_SHARP) != 0; - - etags[i].v1node.edge = etags+i; - etags[i].v2node.edge = etags+i; - } - - if (emd->flags & MOD_EDGESPLIT_FROMANGLE) { - mp = mpoly; - for (i=0; i<cddm->numPolyData; i++, mp++) { - mesh_calc_poly_normal(mp, mloop+mp->loopstart, mvert, no); - - ml = mloop + mp->loopstart; - for (j=0; j<mp->totloop; j++, ml++) { - if (!etags[ml->e].has_fno) { - VECCOPY(etags[ml->e].fno, no); - etags[ml->e].has_fno = 1; - } else if (!etags[ml->e].tag) { - edge_angle_cos = INPR(etags[ml->e].fno, no); - if (edge_angle_cos < threshold) { - etags[ml->e].tag = 1; - } - } - } - } - } - - mp = mpoly; - for (i=0; i<cddm->numPolyData; i++, mp++) { - ml = mloop + mp->loopstart; - for (j=0; j<mp->totloop; j++, ml++) { - if (etags[ml->e].tag) - continue; - - prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop; - - if (!edge_get_vuser(membase, etags+prevl->e, ml->v)) { - vu = new_vuser(membase); - vu->ov = vu->v = ml->v; - edge_set_vuser(membase, etags+prevl->e, ml->v, vu); - } - - if (!edge_get_vuser(membase, etags+ml->e, ml->v)) { - vu = new_vuser(membase); - vu->ov = vu->v = ml->v; - edge_set_vuser(membase, etags+ml->e, ml->v, vu); - } - - /*continue if previous edge is tagged*/ - if (etags[prevl->e].tag) - continue; - - /*merge together adjacent split vert users*/ - if (edge_get_vuser(membase, etags+prevl->e, ml->v) - != edge_get_vuser(membase, etags+ml->e, ml->v)) - { - vu = edge_get_vuser(membase, etags+prevl->e, ml->v); - vu2 = edge_get_vuser(membase, etags+ml->e, ml->v); - - /*remove from vu2's users list and add to vu's*/ - for (e=edge_get_first(vu2); e; e=enext) { - enext = edge_get_next(e, ml->v); - edge_set_vuser(membase, e, ml->v, vu); - } - } - } - } - - mp = mpoly; - for (i=0; i<cddm->numPolyData; i++, mp++) { - ml = mloop + mp->loopstart; - for (j=0; j<mp->totloop; j++, ml++) { - if (!etags[ml->e].tag) - continue; - - prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop; - - if (!etags[prevl->e].tag) { - vu = edge_get_vuser(membase, etags+prevl->e, ml->v); - if (!vu) { - vu = new_vuser(membase); - vu->ov = vu->v = ml->v; - edge_set_vuser(membase, etags+prevl->e, ml->v, vu); - } - - edge_set_vuser(membase, etags+ml->e, ml->v, vu); - } else { - vu = new_vuser(membase); - vu->ov = vu->v = ml->v; - edge_set_vuser(membase, etags+ml->e, ml->v, vu); - } - } - } - - curv = cddm->numVertData; - cure = cddm->numEdgeData; - mp = mpoly; - for (i=0; i<cddm->numPolyData; i++, mp++) { - ml = mloop + mp->loopstart; - for (j=0; j<mp->totloop; j++, ml++) { - e = etags + ml->e; - if (e->v1user && !e->v1user->done) { - e->v1user->done = 1; - BLI_array_growone(mvert); - - mvert[curv] = mvert[e->v1user->ov]; - e->v1user->v = curv; - - curv++; - } - - if (e->v2user && !e->v2user->done) { - e->v2user->done = 1; - BLI_array_growone(mvert); - - mvert[curv] = mvert[e->v2user->ov]; - e->v2user->v = curv; - - curv++; - } - - vu = edge_get_vuser(membase, e, ml->v); - if (!vu) - continue; - ml->v = vu->v; - -#if 0 //BMESH_TODO should really handle edges here, but for now use cddm_calc_edges - /*ok, now we have to deal with edges. . .*/ - if (etags[ml->e].tag) { - if (etags[ml->e].used) { - BLI_array_growone(medge); - BLI_array_growone(etags); - medge[cure] = medge[ml->e]; - - ml->e = cure; - etags[cure].used = 1; - cure++; - } - - vu = etags[ml->e].v1user; - vu2 = etags[ml->e].v2user; - - if (vu) - medge[ml->e].v1 = vu->v; - if (vu2) - medge[ml->e].v2 = vu2->v; - } else { - etags[ml->e].used = 1; - - if (vu->ov == etags[ml->e].v1) - medge[ml->e].v1 = vu->v; - else if (vu->ov == etags[ml->e].v2) - medge[ml->e].v2 = vu->v; - } -#endif - } - } - - - /*resize customdata arrays and add new medge/mvert arrays*/ - vdata = cddm->vertData; - edata = cddm->edgeData; - - /*make sure we don't copy over mvert/medge layers*/ - CustomData_set_layer(&vdata, CD_MVERT, NULL); - CustomData_set_layer(&edata, CD_MEDGE, NULL); - CustomData_free_layer_active(&vdata, CD_MVERT, cddm->numVertData); - CustomData_free_layer_active(&edata, CD_MEDGE, cddm->numEdgeData); - - memset(&cddm->vertData, 0, sizeof(CustomData)); - memset(&cddm->edgeData, 0, sizeof(CustomData)); - - CustomData_copy(&vdata, &cddm->vertData, CD_MASK_DERIVEDMESH, CD_CALLOC, curv); - CustomData_copy_data(&vdata, &cddm->vertData, 0, 0, cddm->numVertData); - CustomData_free(&vdata, cddm->numVertData); - cddm->numVertData = curv; - - CustomData_copy(&edata, &cddm->edgeData, CD_MASK_DERIVEDMESH, CD_CALLOC, cure); - CustomData_copy_data(&edata, &cddm->edgeData, 0, 0, cddm->numEdgeData); - CustomData_free(&edata, cddm->numEdgeData); - cddm->numEdgeData = cure; - - CDDM_set_mvert(cddm, mvert); - CDDM_set_medge(cddm, medge); - - free_membase(membase); - MEM_freeN(etags); - - /*edge calculation isn't working correctly, so just brute force it*/ - cddm->numEdgeData = 0; - CDDM_calc_edges_poly(cddm); - - cddm->numFaceData = mesh_recalcTesselation(&cddm->faceData, - &cddm->loopData, &cddm->polyData, - mvert, cddm->numFaceData, - cddm->numLoopData, cddm->numPolyData, 1, 0); - - CDDM_set_mface(cddm, DM_get_tessface_data_layer(cddm, CD_MFACE)); - CDDM_calc_normals(cddm); - - return cddm; -} - - -static void edgesplitModifier_initData(ModifierData *md) -{ - EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md; - - /* default to 30-degree split angle, sharpness from both angle & flag - */ - emd->split_angle = 30; - emd->flags = MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG; -} - -static void edgesplitModifier_copyData(ModifierData *md, ModifierData *target) -{ - EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md; - EdgeSplitModifierData *temd = (EdgeSplitModifierData*) target; - - temd->split_angle = emd->split_angle; - temd->flags = emd->flags; -} - -static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd, - Object *ob, DerivedMesh *dm) -{ - if(!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG))) - return dm; - - return doEdgeSplit(dm, emd); -} - -static DerivedMesh *edgesplitModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md; - - result = edgesplitModifier_do(emd, ob, derivedData); - - if(result != derivedData) - CDDM_calc_normals(result); - - return result; -} - -static DerivedMesh *edgesplitModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return edgesplitModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* Bevel */ - -static void bevelModifier_initData(ModifierData *md) -{ - BevelModifierData *bmd = (BevelModifierData*) md; - - bmd->value = 0.1f; - bmd->res = 1; - bmd->flags = 0; - bmd->val_flags = 0; - bmd->lim_flags = 0; - bmd->e_flags = 0; - bmd->bevel_angle = 30; - bmd->defgrp_name[0] = '\0'; -} - -static void bevelModifier_copyData(ModifierData *md, ModifierData *target) -{ - BevelModifierData *bmd = (BevelModifierData*) md; - BevelModifierData *tbmd = (BevelModifierData*) target; - - tbmd->value = bmd->value; - tbmd->res = bmd->res; - tbmd->flags = bmd->flags; - tbmd->val_flags = bmd->val_flags; - tbmd->lim_flags = bmd->lim_flags; - tbmd->e_flags = bmd->e_flags; - tbmd->bevel_angle = bmd->bevel_angle; - strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32); -} - -static CustomDataMask bevelModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - BevelModifierData *bmd = (BevelModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(bmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static DerivedMesh *bevelModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - //BME_Mesh *bm; - - /*bDeformGroup *def;*/ - int /*i,*/ options, defgrp_index = -1; - BevelModifierData *bmd = (BevelModifierData*) md; - - options = bmd->flags|bmd->val_flags|bmd->lim_flags|bmd->e_flags; - - /*if ((options & BME_BEVEL_VWEIGHT) && bmd->defgrp_name[0]) { - defgrp_index = defgroup_name_index(ob, bmd->defgrp_name); - if (defgrp_index < 0) { - options &= ~BME_BEVEL_VWEIGHT; - } - }*/ -/* - bm = BME_derivedmesh_to_bmesh(derivedData); - BME_bevel(bm,bmd->value,bmd->res,options,defgrp_index,bmd->bevel_angle,NULL); - result = BME_bmesh_to_derivedmesh(bm,derivedData); - BME_free_mesh(bm); - - CDDM_calc_normals(result); -*/ - result = derivedData; - return result; -} - -static DerivedMesh *bevelModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return bevelModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* Displace */ - -static void displaceModifier_initData(ModifierData *md) -{ - DisplaceModifierData *dmd = (DisplaceModifierData*) md; - - dmd->texture = NULL; - dmd->strength = 1; - dmd->direction = MOD_DISP_DIR_NOR; - dmd->midlevel = 0.5; -} - -static void displaceModifier_copyData(ModifierData *md, ModifierData *target) -{ - DisplaceModifierData *dmd = (DisplaceModifierData*) md; - DisplaceModifierData *tdmd = (DisplaceModifierData*) target; - - tdmd->texture = dmd->texture; - tdmd->strength = dmd->strength; - tdmd->direction = dmd->direction; - strncpy(tdmd->defgrp_name, dmd->defgrp_name, 32); - tdmd->midlevel = dmd->midlevel; - tdmd->texmapping = dmd->texmapping; - tdmd->map_object = dmd->map_object; - strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32); -} - -static CustomDataMask displaceModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - DisplaceModifierData *dmd = (DisplaceModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(dmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - /* ask for UV coordinates if we need them */ - if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= (1 << CD_MTFACE); - - return dataMask; -} - -static int displaceModifier_dependsOnTime(ModifierData *md) -{ - DisplaceModifierData *dmd = (DisplaceModifierData *)md; - - if(dmd->texture) - { - return BKE_texture_dependsOnTime(dmd->texture); - } - else - { - return 0; - } -} - -static void displaceModifier_foreachObjectLink(ModifierData *md, Object *ob, - ObjectWalkFunc walk, void *userData) -{ - DisplaceModifierData *dmd = (DisplaceModifierData*) md; - - walk(userData, ob, &dmd->map_object); -} - -static void displaceModifier_foreachIDLink(ModifierData *md, Object *ob, - IDWalkFunc walk, void *userData) -{ - DisplaceModifierData *dmd = (DisplaceModifierData*) md; - - walk(userData, ob, (ID **)&dmd->texture); - - displaceModifier_foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); -} - -static int displaceModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - DisplaceModifierData *dmd = (DisplaceModifierData*) md; - - return !dmd->texture; -} - -static void displaceModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - DisplaceModifierData *dmd = (DisplaceModifierData*) md; - - if(dmd->map_object) { - DagNode *curNode = dag_get_node(forest, dmd->map_object); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier"); - } -} - -static void validate_layer_name(const CustomData *data, int type, char *name, char *outname) -{ - int index = -1; - - /* if a layer name was given, try to find that layer */ - if(name[0]) - index = CustomData_get_named_layer_index(data, CD_MTFACE, name); - - if(index < 0) { - /* either no layer was specified, or the layer we want has been - * deleted, so assign the active layer to name - */ - index = CustomData_get_active_layer_index(data, CD_MTFACE); - strcpy(outname, data->layers[index].name); - } - else - strcpy(outname, name); -} - -static void get_texture_coords(DisplaceModifierData *dmd, Object *ob, - DerivedMesh *dm, - float (*co)[3], float (*texco)[3], - int numVerts) -{ - int i; - int texmapping = dmd->texmapping; - float mapob_imat[4][4]; - - if(texmapping == MOD_DISP_MAP_OBJECT) { - if(dmd->map_object) - invert_m4_m4(mapob_imat, dmd->map_object->obmat); - else /* if there is no map object, default to local */ - texmapping = MOD_DISP_MAP_LOCAL; - } - - /* UVs need special handling, since they come from faces */ - if(texmapping == MOD_DISP_MAP_UV) { - if(CustomData_has_layer(&dm->faceData, CD_MTFACE)) { - MFace *mface = dm->getTessFaceArray(dm); - MFace *mf; - char *done = MEM_callocN(sizeof(*done) * numVerts, - "get_texture_coords done"); - int numFaces = dm->getNumTessFaces(dm); - char uvname[32]; - MTFace *tf; - - validate_layer_name(&dm->faceData, CD_MTFACE, dmd->uvlayer_name, uvname); - tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname); - - /* verts are given the UV from the first face that uses them */ - for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tf) { - if(!done[mf->v1]) { - texco[mf->v1][0] = tf->uv[0][0]; - texco[mf->v1][1] = tf->uv[0][1]; - texco[mf->v1][2] = 0; - done[mf->v1] = 1; - } - if(!done[mf->v2]) { - texco[mf->v2][0] = tf->uv[1][0]; - texco[mf->v2][1] = tf->uv[1][1]; - texco[mf->v2][2] = 0; - done[mf->v2] = 1; - } - if(!done[mf->v3]) { - texco[mf->v3][0] = tf->uv[2][0]; - texco[mf->v3][1] = tf->uv[2][1]; - texco[mf->v3][2] = 0; - done[mf->v3] = 1; - } - if(!done[mf->v4]) { - texco[mf->v4][0] = tf->uv[3][0]; - texco[mf->v4][1] = tf->uv[3][1]; - texco[mf->v4][2] = 0; - done[mf->v4] = 1; - } - } - - /* remap UVs from [0, 1] to [-1, 1] */ - for(i = 0; i < numVerts; ++i) { - texco[i][0] = texco[i][0] * 2 - 1; - texco[i][1] = texco[i][1] * 2 - 1; - } - - MEM_freeN(done); - return; - } else /* if there are no UVs, default to local */ - texmapping = MOD_DISP_MAP_LOCAL; - } - - for(i = 0; i < numVerts; ++i, ++co, ++texco) { - switch(texmapping) { - case MOD_DISP_MAP_LOCAL: - VECCOPY(*texco, *co); - break; - case MOD_DISP_MAP_GLOBAL: - VECCOPY(*texco, *co); - mul_m4_v3(ob->obmat, *texco); - break; - case MOD_DISP_MAP_OBJECT: - VECCOPY(*texco, *co); - mul_m4_v3(ob->obmat, *texco); - mul_m4_v3(mapob_imat, *texco); - break; - } - } -} - -static void get_texture_value(Tex *texture, float *tex_co, TexResult *texres) -{ - int result_type; - - result_type = multitex_ext(texture, tex_co, NULL, - NULL, 1, texres); - - /* if the texture gave an RGB value, we assume it didn't give a valid - * intensity, so calculate one (formula from do_material_tex). - * if the texture didn't give an RGB value, copy the intensity across - */ - if(result_type & TEX_RGB) - texres->tin = (0.35f * texres->tr + 0.45f * texres->tg - + 0.2f * texres->tb); - else - texres->tr = texres->tg = texres->tb = texres->tin; -} - -/* dm must be a CDDerivedMesh */ -static void displaceModifier_do( - DisplaceModifierData *dmd, Object *ob, - DerivedMesh *dm, float (*vertexCos)[3], int numVerts) -{ - int i; - MVert *mvert; - MDeformVert *dvert = NULL; - int defgrp_index; - float (*tex_co)[3]; - - if(!dmd->texture) return; - - defgrp_index = defgroup_name_index(ob, dmd->defgrp_name); - - mvert = CDDM_get_verts(dm); - if(defgrp_index >= 0) - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - - tex_co = MEM_callocN(sizeof(*tex_co) * numVerts, - "displaceModifier_do tex_co"); - get_texture_coords(dmd, ob, dm, vertexCos, tex_co, numVerts); - - for(i = 0; i < numVerts; ++i) { - TexResult texres; - float delta = 0, strength = dmd->strength; - MDeformWeight *def_weight = NULL; - - if(dvert) { - int j; - for(j = 0; j < dvert[i].totweight; ++j) { - if(dvert[i].dw[j].def_nr == defgrp_index) { - def_weight = &dvert[i].dw[j]; - break; - } - } - if(!def_weight) continue; - } - - texres.nor = NULL; - get_texture_value(dmd->texture, tex_co[i], &texres); - - delta = texres.tin - dmd->midlevel; - - if(def_weight) strength *= def_weight->weight; - - delta *= strength; - - switch(dmd->direction) { - case MOD_DISP_DIR_X: - vertexCos[i][0] += delta; - break; - case MOD_DISP_DIR_Y: - vertexCos[i][1] += delta; - break; - case MOD_DISP_DIR_Z: - vertexCos[i][2] += delta; - break; - case MOD_DISP_DIR_RGB_XYZ: - vertexCos[i][0] += (texres.tr - dmd->midlevel) * strength; - vertexCos[i][1] += (texres.tg - dmd->midlevel) * strength; - vertexCos[i][2] += (texres.tb - dmd->midlevel) * strength; - break; - case MOD_DISP_DIR_NOR: - vertexCos[i][0] += delta * mvert[i].no[0] / 32767.0f; - vertexCos[i][1] += delta * mvert[i].no[1] / 32767.0f; - vertexCos[i][2] += delta * mvert[i].no[2] / 32767.0f; - break; - } - } - - MEM_freeN(tex_co); -} - -static void displaceModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos); - - displaceModifier_do((DisplaceModifierData *)md, ob, dm, - vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void displaceModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm= get_cddm(md->scene, ob, editData, derivedData, vertexCos); - - displaceModifier_do((DisplaceModifierData *)md, ob, dm, - vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -/* UVProject */ -/* UV Project modifier: Generates UVs projected from an object -*/ - -static void uvprojectModifier_initData(ModifierData *md) -{ - UVProjectModifierData *umd = (UVProjectModifierData*) md; - int i; - - for(i = 0; i < MOD_UVPROJECT_MAXPROJECTORS; ++i) - umd->projectors[i] = NULL; - umd->image = NULL; - umd->flags = 0; - umd->num_projectors = 1; - umd->aspectx = umd->aspecty = 1.0f; -} - -static void uvprojectModifier_copyData(ModifierData *md, ModifierData *target) -{ - UVProjectModifierData *umd = (UVProjectModifierData*) md; - UVProjectModifierData *tumd = (UVProjectModifierData*) target; - int i; - - for(i = 0; i < MOD_UVPROJECT_MAXPROJECTORS; ++i) - tumd->projectors[i] = umd->projectors[i]; - tumd->image = umd->image; - tumd->flags = umd->flags; - tumd->num_projectors = umd->num_projectors; - tumd->aspectx = umd->aspectx; - tumd->aspecty = umd->aspecty; -} - -static CustomDataMask uvprojectModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - CustomDataMask dataMask = 0; - - /* ask for UV coordinates */ - dataMask |= (1 << CD_MTFACE); - - return dataMask; -} - -static void uvprojectModifier_foreachObjectLink(ModifierData *md, Object *ob, - ObjectWalkFunc walk, void *userData) -{ - UVProjectModifierData *umd = (UVProjectModifierData*) md; - int i; - - for(i = 0; i < MOD_UVPROJECT_MAXPROJECTORS; ++i) - walk(userData, ob, &umd->projectors[i]); -} - -static void uvprojectModifier_foreachIDLink(ModifierData *md, Object *ob, - IDWalkFunc walk, void *userData) -{ - UVProjectModifierData *umd = (UVProjectModifierData*) md; - - walk(userData, ob, (ID **)&umd->image); - - uvprojectModifier_foreachObjectLink(md, ob, (ObjectWalkFunc)walk, - userData); -} - -static void uvprojectModifier_updateDepgraph(ModifierData *md, - DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) -{ - UVProjectModifierData *umd = (UVProjectModifierData*) md; - int i; - - for(i = 0; i < umd->num_projectors; ++i) { - if(umd->projectors[i]) { - DagNode *curNode = dag_get_node(forest, umd->projectors[i]); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "UV Project Modifier"); - } - } -} - -typedef struct Projector { - Object *ob; /* object this projector is derived from */ - float projmat[4][4]; /* projection matrix */ - float normal[3]; /* projector normal in world space */ -} Projector; - -static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd, - Object *ob, DerivedMesh *dm) -{ - float (*coords)[3], (*co)[3]; - MTFace *tface; - int i, numVerts, numFaces; - Image *image = umd->image; - MFace *mface, *mf; - int override_image = ((umd->flags & MOD_UVPROJECT_OVERRIDEIMAGE) != 0); - Projector projectors[MOD_UVPROJECT_MAXPROJECTORS]; - int num_projectors = 0; - float aspect; - char uvname[32]; - - if(umd->aspecty != 0) aspect = umd->aspectx / umd->aspecty; - else aspect = 1.0f; - - for(i = 0; i < umd->num_projectors; ++i) - if(umd->projectors[i]) - projectors[num_projectors++].ob = umd->projectors[i]; - - if(num_projectors == 0) return dm; - - /* make sure there are UV layers available */ - if(!CustomData_has_layer(&dm->faceData, CD_MTFACE)) return dm; - - /* make sure we're using an existing layer */ - validate_layer_name(&dm->faceData, CD_MTFACE, umd->uvlayer_name, uvname); - - /* make sure we are not modifying the original UV layer */ - tface = CustomData_duplicate_referenced_layer_named(&dm->faceData, - CD_MTFACE, uvname); - - numVerts = dm->getNumVerts(dm); - - coords = MEM_callocN(sizeof(*coords) * numVerts, - "uvprojectModifier_do coords"); - dm->getVertCos(dm, coords); - - /* convert coords to world space */ - for(i = 0, co = coords; i < numVerts; ++i, ++co) - mul_m4_v3(ob->obmat, *co); - - /* calculate a projection matrix and normal for each projector */ - for(i = 0; i < num_projectors; ++i) { - float tmpmat[4][4]; - float offsetmat[4][4]; - Camera *cam = NULL; - /* calculate projection matrix */ - invert_m4_m4(projectors[i].projmat, projectors[i].ob->obmat); - - if(projectors[i].ob->type == OB_CAMERA) { - cam = (Camera *)projectors[i].ob->data; - if(cam->type == CAM_PERSP) { - float perspmat[4][4]; - float xmax; - float xmin; - float ymax; - float ymin; - float pixsize = cam->clipsta * 32.0 / cam->lens; - - if(aspect > 1.0f) { - xmax = 0.5f * pixsize; - ymax = xmax / aspect; - } else { - ymax = 0.5f * pixsize; - xmax = ymax * aspect; - } - xmin = -xmax; - ymin = -ymax; - - perspective_m4( perspmat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend); - mul_m4_m4m4(tmpmat, projectors[i].projmat, perspmat); - } else if(cam->type == CAM_ORTHO) { - float orthomat[4][4]; - float xmax; - float xmin; - float ymax; - float ymin; - - if(aspect > 1.0f) { - xmax = 0.5f * cam->ortho_scale; - ymax = xmax / aspect; - } else { - ymax = 0.5f * cam->ortho_scale; - xmax = ymax * aspect; - } - xmin = -xmax; - ymin = -ymax; - - orthographic_m4( orthomat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend); - mul_m4_m4m4(tmpmat, projectors[i].projmat, orthomat); - } - } else { - copy_m4_m4(tmpmat, projectors[i].projmat); - } - - unit_m4(offsetmat); - mul_mat3_m4_fl(offsetmat, 0.5); - offsetmat[3][0] = offsetmat[3][1] = offsetmat[3][2] = 0.5; - - if (cam) { - if (umd->aspectx == umd->aspecty) { - offsetmat[3][0] -= cam->shiftx; - offsetmat[3][1] -= cam->shifty; - } else if (umd->aspectx < umd->aspecty) { - offsetmat[3][0] -=(cam->shiftx * umd->aspecty/umd->aspectx); - offsetmat[3][1] -= cam->shifty; - } else { - offsetmat[3][0] -= cam->shiftx; - offsetmat[3][1] -=(cam->shifty * umd->aspectx/umd->aspecty); - } - } - - mul_m4_m4m4(projectors[i].projmat, tmpmat, offsetmat); - - /* calculate worldspace projector normal (for best projector test) */ - projectors[i].normal[0] = 0; - projectors[i].normal[1] = 0; - projectors[i].normal[2] = 1; - mul_mat3_m4_v3(projectors[i].ob->obmat, projectors[i].normal); - } - - /* if only one projector, project coords to UVs */ - if(num_projectors == 1) - for(i = 0, co = coords; i < numVerts; ++i, ++co) - mul_project_m4_v4(projectors[0].projmat, *co); - - mface = dm->getTessFaceArray(dm); - numFaces = dm->getNumTessFaces(dm); - - /* apply coords as UVs, and apply image if tfaces are new */ - for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tface) { - if(override_image || !image || tface->tpage == image) { - if(num_projectors == 1) { - /* apply transformed coords as UVs */ - tface->uv[0][0] = coords[mf->v1][0]; - tface->uv[0][1] = coords[mf->v1][1]; - tface->uv[1][0] = coords[mf->v2][0]; - tface->uv[1][1] = coords[mf->v2][1]; - tface->uv[2][0] = coords[mf->v3][0]; - tface->uv[2][1] = coords[mf->v3][1]; - if(mf->v4) { - tface->uv[3][0] = coords[mf->v4][0]; - tface->uv[3][1] = coords[mf->v4][1]; - } - } else { - /* multiple projectors, select the closest to face normal - * direction - */ - float co1[3], co2[3], co3[3], co4[3]; - float face_no[3]; - int j; - Projector *best_projector; - float best_dot; - - VECCOPY(co1, coords[mf->v1]); - VECCOPY(co2, coords[mf->v2]); - VECCOPY(co3, coords[mf->v3]); - - /* get the untransformed face normal */ - if(mf->v4) { - VECCOPY(co4, coords[mf->v4]); - normal_quad_v3( face_no,co1, co2, co3, co4); - } else { - normal_tri_v3( face_no,co1, co2, co3); - } - - /* find the projector which the face points at most directly - * (projector normal with largest dot product is best) - */ - best_dot = dot_v3v3(projectors[0].normal, face_no); - best_projector = &projectors[0]; - - for(j = 1; j < num_projectors; ++j) { - float tmp_dot = dot_v3v3(projectors[j].normal, - face_no); - if(tmp_dot > best_dot) { - best_dot = tmp_dot; - best_projector = &projectors[j]; - } - } - - mul_project_m4_v4(best_projector->projmat, co1); - mul_project_m4_v4(best_projector->projmat, co2); - mul_project_m4_v4(best_projector->projmat, co3); - if(mf->v4) - mul_project_m4_v4(best_projector->projmat, co4); - - /* apply transformed coords as UVs */ - tface->uv[0][0] = co1[0]; - tface->uv[0][1] = co1[1]; - tface->uv[1][0] = co2[0]; - tface->uv[1][1] = co2[1]; - tface->uv[2][0] = co3[0]; - tface->uv[2][1] = co3[1]; - if(mf->v4) { - tface->uv[3][0] = co4[0]; - tface->uv[3][1] = co4[1]; - } - } - } - - if(override_image) { - tface->mode = TF_TEX; - tface->tpage = image; - } - } - - MEM_freeN(coords); - - return dm; -} - -static DerivedMesh *uvprojectModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - UVProjectModifierData *umd = (UVProjectModifierData*) md; - - result = uvprojectModifier_do(umd, ob, derivedData); - - return result; -} - -static DerivedMesh *uvprojectModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return uvprojectModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* Decimate */ - -static void decimateModifier_initData(ModifierData *md) -{ - DecimateModifierData *dmd = (DecimateModifierData*) md; - - dmd->percent = 1.0; -} - -static void decimateModifier_copyData(ModifierData *md, ModifierData *target) -{ - DecimateModifierData *dmd = (DecimateModifierData*) md; - DecimateModifierData *tdmd = (DecimateModifierData*) target; - - tdmd->percent = dmd->percent; -} - -static DerivedMesh *decimateModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DecimateModifierData *dmd = (DecimateModifierData*) md; - DerivedMesh *dm = derivedData, *result = NULL; - MVert *mvert; - MFace *mface; - LOD_Decimation_Info lod; - int totvert, totface; - int a, numTris; - - mvert = dm->getVertArray(dm); - mface = dm->getTessFaceArray(dm); - totvert = dm->getNumVerts(dm); - totface = dm->getNumTessFaces(dm); - - numTris = 0; - for (a=0; a<totface; a++) { - MFace *mf = &mface[a]; - numTris++; - if (mf->v4) numTris++; - } - - if(numTris<3) { - modifier_setError(md, - "Modifier requires more than 3 input faces (triangles)."); - goto exit; - } - - lod.vertex_buffer= MEM_mallocN(3*sizeof(float)*totvert, "vertices"); - lod.vertex_normal_buffer= MEM_mallocN(3*sizeof(float)*totvert, "normals"); - lod.triangle_index_buffer= MEM_mallocN(3*sizeof(int)*numTris, "trias"); - lod.vertex_num= totvert; - lod.face_num= numTris; - - for(a=0; a<totvert; a++) { - MVert *mv = &mvert[a]; - float *vbCo = &lod.vertex_buffer[a*3]; - float *vbNo = &lod.vertex_normal_buffer[a*3]; - - VECCOPY(vbCo, mv->co); - - vbNo[0] = mv->no[0]/32767.0f; - vbNo[1] = mv->no[1]/32767.0f; - vbNo[2] = mv->no[2]/32767.0f; - } - - numTris = 0; - for(a=0; a<totface; a++) { - MFace *mf = &mface[a]; - int *tri = &lod.triangle_index_buffer[3*numTris++]; - tri[0]= mf->v1; - tri[1]= mf->v2; - tri[2]= mf->v3; - - if(mf->v4) { - tri = &lod.triangle_index_buffer[3*numTris++]; - tri[0]= mf->v1; - tri[1]= mf->v3; - tri[2]= mf->v4; - } - } - - dmd->faceCount = 0; - if(LOD_LoadMesh(&lod) ) { - if( LOD_PreprocessMesh(&lod) ) { - /* we assume the decim_faces tells how much to reduce */ - - while(lod.face_num > numTris*dmd->percent) { - if( LOD_CollapseEdge(&lod)==0) break; - } - - if(lod.vertex_num>2) { - result = CDDM_new(lod.vertex_num, 0, lod.face_num, 0, 0); - dmd->faceCount = lod.face_num; - } - else - result = CDDM_new(lod.vertex_num, 0, 0, 0, 0); - - mvert = CDDM_get_verts(result); - for(a=0; a<lod.vertex_num; a++) { - MVert *mv = &mvert[a]; - float *vbCo = &lod.vertex_buffer[a*3]; - - VECCOPY(mv->co, vbCo); - } - - if(lod.vertex_num>2) { - mface = CDDM_get_tessfaces(result); - for(a=0; a<lod.face_num; a++) { - MFace *mf = &mface[a]; - int *tri = &lod.triangle_index_buffer[a*3]; - mf->v1 = tri[0]; - mf->v2 = tri[1]; - mf->v3 = tri[2]; - test_index_face(mf, NULL, 0, 3); - } - } - - CDDM_calc_edges(result); - CDDM_calc_normals(result); - CDDM_tessfaces_to_faces(result); - } - else - modifier_setError(md, "Out of memory."); - - LOD_FreeDecimationData(&lod); - } - else - modifier_setError(md, "Non-manifold mesh as input."); - - MEM_freeN(lod.vertex_buffer); - MEM_freeN(lod.vertex_normal_buffer); - MEM_freeN(lod.triangle_index_buffer); - -exit: - return result; -} - -/* Smooth */ - -static void smoothModifier_initData(ModifierData *md) -{ - SmoothModifierData *smd = (SmoothModifierData*) md; - - smd->fac = 0.5f; - smd->repeat = 1; - smd->flag = MOD_SMOOTH_X | MOD_SMOOTH_Y | MOD_SMOOTH_Z; - smd->defgrp_name[0] = '\0'; -} - -static void smoothModifier_copyData(ModifierData *md, ModifierData *target) -{ - SmoothModifierData *smd = (SmoothModifierData*) md; - SmoothModifierData *tsmd = (SmoothModifierData*) target; - - tsmd->fac = smd->fac; - tsmd->repeat = smd->repeat; - tsmd->flag = smd->flag; - strncpy(tsmd->defgrp_name, smd->defgrp_name, 32); -} - -static int smoothModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - SmoothModifierData *smd = (SmoothModifierData*) md; - short flag; - - flag = smd->flag & (MOD_SMOOTH_X|MOD_SMOOTH_Y|MOD_SMOOTH_Z); - - /* disable if modifier is off for X, Y and Z or if factor is 0 */ - if((smd->fac == 0.0f) || flag == 0) return 1; - - return 0; -} - -static CustomDataMask smoothModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - SmoothModifierData *smd = (SmoothModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void smoothModifier_do( - SmoothModifierData *smd, Object *ob, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - MDeformVert *dvert = NULL; - MEdge *medges = NULL; - - int i, j, numDMEdges, defgrp_index; - unsigned char *uctmp; - float *ftmp, fac, facm; - - ftmp = (float*)MEM_callocN(3*sizeof(float)*numVerts, - "smoothmodifier_f"); - if (!ftmp) return; - uctmp = (unsigned char*)MEM_callocN(sizeof(unsigned char)*numVerts, - "smoothmodifier_uc"); - if (!uctmp) { - if (ftmp) MEM_freeN(ftmp); - return; - } - - fac = smd->fac; - facm = 1 - fac; - - medges = dm->getEdgeArray(dm); - numDMEdges = dm->getNumEdges(dm); - - defgrp_index = defgroup_name_index(ob, smd->defgrp_name); - - if (defgrp_index >= 0) - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - - /* NOTICE: this can be optimized a little bit by moving the - * if (dvert) out of the loop, if needed */ - for (j = 0; j < smd->repeat; j++) { - for (i = 0; i < numDMEdges; i++) { - float fvec[3]; - float *v1, *v2; - unsigned int idx1, idx2; - - idx1 = medges[i].v1; - idx2 = medges[i].v2; - - v1 = vertexCos[idx1]; - v2 = vertexCos[idx2]; - - fvec[0] = (v1[0] + v2[0]) / 2.0; - fvec[1] = (v1[1] + v2[1]) / 2.0; - fvec[2] = (v1[2] + v2[2]) / 2.0; - - v1 = &ftmp[idx1*3]; - v2 = &ftmp[idx2*3]; - - if (uctmp[idx1] < 255) { - uctmp[idx1]++; - add_v3_v3v3(v1, v1, fvec); - } - if (uctmp[idx2] < 255) { - uctmp[idx2]++; - add_v3_v3v3(v2, v2, fvec); - } - } - - if (dvert) { - for (i = 0; i < numVerts; i++) { - MDeformWeight *dw = NULL; - float f, fm, facw, *fp, *v; - int k; - short flag = smd->flag; - - v = vertexCos[i]; - fp = &ftmp[i*3]; - - for (k = 0; k < dvert[i].totweight; ++k) { - if(dvert[i].dw[k].def_nr == defgrp_index) { - dw = &dvert[i].dw[k]; - break; - } - } - if (!dw) continue; - - f = fac * dw->weight; - fm = 1.0f - f; - - /* fp is the sum of uctmp[i] verts, so must be averaged */ - facw = 0.0f; - if (uctmp[i]) - facw = f / (float)uctmp[i]; - - if (flag & MOD_SMOOTH_X) - v[0] = fm * v[0] + facw * fp[0]; - if (flag & MOD_SMOOTH_Y) - v[1] = fm * v[1] + facw * fp[1]; - if (flag & MOD_SMOOTH_Z) - v[2] = fm * v[2] + facw * fp[2]; - } - } - else { /* no vertex group */ - for (i = 0; i < numVerts; i++) { - float facw, *fp, *v; - short flag = smd->flag; - - v = vertexCos[i]; - fp = &ftmp[i*3]; - - /* fp is the sum of uctmp[i] verts, so must be averaged */ - facw = 0.0f; - if (uctmp[i]) - facw = fac / (float)uctmp[i]; - - if (flag & MOD_SMOOTH_X) - v[0] = facm * v[0] + facw * fp[0]; - if (flag & MOD_SMOOTH_Y) - v[1] = facm * v[1] + facw * fp[1]; - if (flag & MOD_SMOOTH_Z) - v[2] = facm * v[2] + facw * fp[2]; - } - - } - - memset(ftmp, 0, 3*sizeof(float)*numVerts); - memset(uctmp, 0, sizeof(unsigned char)*numVerts); - } - - MEM_freeN(ftmp); - MEM_freeN(uctmp); -} - -static void smoothModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0); - - smoothModifier_do((SmoothModifierData *)md, ob, dm, - vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void smoothModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm= get_dm(md->scene, ob, editData, derivedData, NULL, 0); - - smoothModifier_do((SmoothModifierData *)md, ob, dm, - vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -/* Cast */ - -static void castModifier_initData(ModifierData *md) -{ - CastModifierData *cmd = (CastModifierData*) md; - - cmd->fac = 0.5f; - cmd->radius = 0.0f; - cmd->size = 0.0f; - cmd->flag = MOD_CAST_X | MOD_CAST_Y | MOD_CAST_Z - | MOD_CAST_SIZE_FROM_RADIUS; - cmd->type = MOD_CAST_TYPE_SPHERE; - cmd->defgrp_name[0] = '\0'; - cmd->object = NULL; -} - - -static void castModifier_copyData(ModifierData *md, ModifierData *target) -{ - CastModifierData *cmd = (CastModifierData*) md; - CastModifierData *tcmd = (CastModifierData*) target; - - tcmd->fac = cmd->fac; - tcmd->radius = cmd->radius; - tcmd->size = cmd->size; - tcmd->flag = cmd->flag; - tcmd->type = cmd->type; - tcmd->object = cmd->object; - strncpy(tcmd->defgrp_name, cmd->defgrp_name, 32); -} - -static int castModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - CastModifierData *cmd = (CastModifierData*) md; - short flag; - - flag = cmd->flag & (MOD_CAST_X|MOD_CAST_Y|MOD_CAST_Z); - - if((cmd->fac == 0.0f) || flag == 0) return 1; - - return 0; -} - -static CustomDataMask castModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - CastModifierData *cmd = (CastModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(cmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void castModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - CastModifierData *cmd = (CastModifierData*) md; - - walk (userData, ob, &cmd->object); -} - -static void castModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - CastModifierData *cmd = (CastModifierData*) md; - - if (cmd->object) { - DagNode *curNode = dag_get_node(forest, cmd->object); - - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, - "Cast Modifier"); - } -} - -static void castModifier_sphere_do( - CastModifierData *cmd, Object *ob, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - MDeformVert *dvert = NULL; - - Object *ctrl_ob = NULL; - - int i, defgrp_index; - int has_radius = 0; - short flag, type; - float fac, facm, len = 0.0f; - float vec[3], center[3] = {0.0f, 0.0f, 0.0f}; - float mat[4][4], imat[4][4]; - - fac = cmd->fac; - facm = 1.0f - fac; - - flag = cmd->flag; - type = cmd->type; /* projection type: sphere or cylinder */ - - if (type == MOD_CAST_TYPE_CYLINDER) - flag &= ~MOD_CAST_Z; - - ctrl_ob = cmd->object; - - /* spherify's center is {0, 0, 0} (the ob's own center in its local - * space), by default, but if the user defined a control object, - * we use its location, transformed to ob's local space */ - if (ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat); - mul_m4_m4m4(mat, ob->obmat, ctrl_ob->imat); - invert_m4_m4(imat, mat); - } - - invert_m4_m4(ob->imat, ob->obmat); - VECCOPY(center, ctrl_ob->obmat[3]); - mul_m4_v3(ob->imat, center); - } - - /* now we check which options the user wants */ - - /* 1) (flag was checked in the "if (ctrl_ob)" block above) */ - /* 2) cmd->radius > 0.0f: only the vertices within this radius from - * the center of the effect should be deformed */ - if (cmd->radius > FLT_EPSILON) has_radius = 1; - - /* 3) if we were given a vertex group name, - * only those vertices should be affected */ - defgrp_index = defgroup_name_index(ob, cmd->defgrp_name); - - if ((ob->type == OB_MESH) && dm && defgrp_index >= 0) - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - - if(flag & MOD_CAST_SIZE_FROM_RADIUS) { - len = cmd->radius; - } - else { - len = cmd->size; - } - - if(len <= 0) { - for (i = 0; i < numVerts; i++) { - len += len_v3v3(center, vertexCos[i]); - } - len /= numVerts; - - if (len == 0.0f) len = 10.0f; - } - - /* ready to apply the effect, one vertex at a time; - * tiny optimization: the code is separated (with parts repeated) - * in two possible cases: - * with or w/o a vgroup. With lots of if's in the code below, - * further optimizations are possible, if needed */ - if (dvert) { /* with a vgroup */ - float fac_orig = fac; - for (i = 0; i < numVerts; i++) { - MDeformWeight *dw = NULL; - int j; - float tmp_co[3]; - - VECCOPY(tmp_co, vertexCos[i]); - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(mat, tmp_co); - } else { - sub_v3_v3v3(tmp_co, tmp_co, center); - } - } - - VECCOPY(vec, tmp_co); - - if (type == MOD_CAST_TYPE_CYLINDER) - vec[2] = 0.0f; - - if (has_radius) { - if (len_v3(vec) > cmd->radius) continue; - } - - for (j = 0; j < dvert[i].totweight; ++j) { - if(dvert[i].dw[j].def_nr == defgrp_index) { - dw = &dvert[i].dw[j]; - break; - } - } - if (!dw) continue; - - fac = fac_orig * dw->weight; - facm = 1.0f - fac; - - normalize_v3(vec); - - if (flag & MOD_CAST_X) - tmp_co[0] = fac*vec[0]*len + facm*tmp_co[0]; - if (flag & MOD_CAST_Y) - tmp_co[1] = fac*vec[1]*len + facm*tmp_co[1]; - if (flag & MOD_CAST_Z) - tmp_co[2] = fac*vec[2]*len + facm*tmp_co[2]; - - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(imat, tmp_co); - } else { - add_v3_v3v3(tmp_co, tmp_co, center); - } - } - - VECCOPY(vertexCos[i], tmp_co); - } - return; - } - - /* no vgroup */ - for (i = 0; i < numVerts; i++) { - float tmp_co[3]; - - VECCOPY(tmp_co, vertexCos[i]); - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(mat, tmp_co); - } else { - sub_v3_v3v3(tmp_co, tmp_co, center); - } - } - - VECCOPY(vec, tmp_co); - - if (type == MOD_CAST_TYPE_CYLINDER) - vec[2] = 0.0f; - - if (has_radius) { - if (len_v3(vec) > cmd->radius) continue; - } - - normalize_v3(vec); - - if (flag & MOD_CAST_X) - tmp_co[0] = fac*vec[0]*len + facm*tmp_co[0]; - if (flag & MOD_CAST_Y) - tmp_co[1] = fac*vec[1]*len + facm*tmp_co[1]; - if (flag & MOD_CAST_Z) - tmp_co[2] = fac*vec[2]*len + facm*tmp_co[2]; - - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(imat, tmp_co); - } else { - add_v3_v3v3(tmp_co, tmp_co, center); - } - } - - VECCOPY(vertexCos[i], tmp_co); - } -} - -static void castModifier_cuboid_do( - CastModifierData *cmd, Object *ob, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - MDeformVert *dvert = NULL; - Object *ctrl_ob = NULL; - - int i, defgrp_index; - int has_radius = 0; - short flag; - float fac, facm; - float min[3], max[3], bb[8][3]; - float center[3] = {0.0f, 0.0f, 0.0f}; - float mat[4][4], imat[4][4]; - - fac = cmd->fac; - facm = 1.0f - fac; - - flag = cmd->flag; - - ctrl_ob = cmd->object; - - /* now we check which options the user wants */ - - /* 1) (flag was checked in the "if (ctrl_ob)" block above) */ - /* 2) cmd->radius > 0.0f: only the vertices within this radius from - * the center of the effect should be deformed */ - if (cmd->radius > FLT_EPSILON) has_radius = 1; - - /* 3) if we were given a vertex group name, - * only those vertices should be affected */ - defgrp_index = defgroup_name_index(ob, cmd->defgrp_name); - - if ((ob->type == OB_MESH) && dm && defgrp_index >= 0) - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - - if (ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat); - mul_m4_m4m4(mat, ob->obmat, ctrl_ob->imat); - invert_m4_m4(imat, mat); - } - - invert_m4_m4(ob->imat, ob->obmat); - VECCOPY(center, ctrl_ob->obmat[3]); - mul_m4_v3(ob->imat, center); - } - - if((flag & MOD_CAST_SIZE_FROM_RADIUS) && has_radius) { - for(i = 0; i < 3; i++) { - min[i] = -cmd->radius; - max[i] = cmd->radius; - } - } else if(!(flag & MOD_CAST_SIZE_FROM_RADIUS) && cmd->size > 0) { - for(i = 0; i < 3; i++) { - min[i] = -cmd->size; - max[i] = cmd->size; - } - } else { - /* get bound box */ - /* We can't use the object's bound box because other modifiers - * may have changed the vertex data. */ - INIT_MINMAX(min, max); - - /* Cast's center is the ob's own center in its local space, - * by default, but if the user defined a control object, we use - * its location, transformed to ob's local space. */ - if (ctrl_ob) { - float vec[3]; - - /* let the center of the ctrl_ob be part of the bound box: */ - DO_MINMAX(center, min, max); - - for (i = 0; i < numVerts; i++) { - sub_v3_v3v3(vec, vertexCos[i], center); - DO_MINMAX(vec, min, max); - } - } - else { - for (i = 0; i < numVerts; i++) { - DO_MINMAX(vertexCos[i], min, max); - } - } - - /* we want a symmetric bound box around the origin */ - if (fabs(min[0]) > fabs(max[0])) max[0] = fabs(min[0]); - if (fabs(min[1]) > fabs(max[1])) max[1] = fabs(min[1]); - if (fabs(min[2]) > fabs(max[2])) max[2] = fabs(min[2]); - min[0] = -max[0]; - min[1] = -max[1]; - min[2] = -max[2]; - } - - /* building our custom bounding box */ - bb[0][0] = bb[2][0] = bb[4][0] = bb[6][0] = min[0]; - bb[1][0] = bb[3][0] = bb[5][0] = bb[7][0] = max[0]; - bb[0][1] = bb[1][1] = bb[4][1] = bb[5][1] = min[1]; - bb[2][1] = bb[3][1] = bb[6][1] = bb[7][1] = max[1]; - bb[0][2] = bb[1][2] = bb[2][2] = bb[3][2] = min[2]; - bb[4][2] = bb[5][2] = bb[6][2] = bb[7][2] = max[2]; - - /* ready to apply the effect, one vertex at a time; - * tiny optimization: the code is separated (with parts repeated) - * in two possible cases: - * with or w/o a vgroup. With lots of if's in the code below, - * further optimizations are possible, if needed */ - if (dvert) { /* with a vgroup */ - float fac_orig = fac; - for (i = 0; i < numVerts; i++) { - MDeformWeight *dw = NULL; - int j, octant, coord; - float d[3], dmax, apex[3], fbb; - float tmp_co[3]; - - VECCOPY(tmp_co, vertexCos[i]); - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(mat, tmp_co); - } else { - sub_v3_v3v3(tmp_co, tmp_co, center); - } - } - - if (has_radius) { - if (fabs(tmp_co[0]) > cmd->radius || - fabs(tmp_co[1]) > cmd->radius || - fabs(tmp_co[2]) > cmd->radius) continue; - } - - for (j = 0; j < dvert[i].totweight; ++j) { - if(dvert[i].dw[j].def_nr == defgrp_index) { - dw = &dvert[i].dw[j]; - break; - } - } - if (!dw) continue; - - fac = fac_orig * dw->weight; - facm = 1.0f - fac; - - /* The algo used to project the vertices to their - * bounding box (bb) is pretty simple: - * for each vertex v: - * 1) find in which octant v is in; - * 2) find which outer "wall" of that octant is closer to v; - * 3) calculate factor (var fbb) to project v to that wall; - * 4) project. */ - - /* find in which octant this vertex is in */ - octant = 0; - if (tmp_co[0] > 0.0f) octant += 1; - if (tmp_co[1] > 0.0f) octant += 2; - if (tmp_co[2] > 0.0f) octant += 4; - - /* apex is the bb's vertex at the chosen octant */ - copy_v3_v3(apex, bb[octant]); - - /* find which bb plane is closest to this vertex ... */ - d[0] = tmp_co[0] / apex[0]; - d[1] = tmp_co[1] / apex[1]; - d[2] = tmp_co[2] / apex[2]; - - /* ... (the closest has the higher (closer to 1) d value) */ - dmax = d[0]; - coord = 0; - if (d[1] > dmax) { - dmax = d[1]; - coord = 1; - } - if (d[2] > dmax) { - /* dmax = d[2]; */ /* commented, we don't need it */ - coord = 2; - } - - /* ok, now we know which coordinate of the vertex to use */ - - if (fabs(tmp_co[coord]) < FLT_EPSILON) /* avoid division by zero */ - continue; - - /* finally, this is the factor we wanted, to project the vertex - * to its bounding box (bb) */ - fbb = apex[coord] / tmp_co[coord]; - - /* calculate the new vertex position */ - if (flag & MOD_CAST_X) - tmp_co[0] = facm * tmp_co[0] + fac * tmp_co[0] * fbb; - if (flag & MOD_CAST_Y) - tmp_co[1] = facm * tmp_co[1] + fac * tmp_co[1] * fbb; - if (flag & MOD_CAST_Z) - tmp_co[2] = facm * tmp_co[2] + fac * tmp_co[2] * fbb; - - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(imat, tmp_co); - } else { - add_v3_v3v3(tmp_co, tmp_co, center); - } - } - - VECCOPY(vertexCos[i], tmp_co); - } - return; - } - - /* no vgroup (check previous case for comments about the code) */ - for (i = 0; i < numVerts; i++) { - int octant, coord; - float d[3], dmax, fbb, apex[3]; - float tmp_co[3]; - - VECCOPY(tmp_co, vertexCos[i]); - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(mat, tmp_co); - } else { - sub_v3_v3v3(tmp_co, tmp_co, center); - } - } - - if (has_radius) { - if (fabs(tmp_co[0]) > cmd->radius || - fabs(tmp_co[1]) > cmd->radius || - fabs(tmp_co[2]) > cmd->radius) continue; - } - - octant = 0; - if (tmp_co[0] > 0.0f) octant += 1; - if (tmp_co[1] > 0.0f) octant += 2; - if (tmp_co[2] > 0.0f) octant += 4; - - copy_v3_v3(apex, bb[octant]); - - d[0] = tmp_co[0] / apex[0]; - d[1] = tmp_co[1] / apex[1]; - d[2] = tmp_co[2] / apex[2]; - - dmax = d[0]; - coord = 0; - if (d[1] > dmax) { - dmax = d[1]; - coord = 1; - } - if (d[2] > dmax) { - /* dmax = d[2]; */ /* commented, we don't need it */ - coord = 2; - } - - if (fabs(tmp_co[coord]) < FLT_EPSILON) - continue; - - fbb = apex[coord] / tmp_co[coord]; - - if (flag & MOD_CAST_X) - tmp_co[0] = facm * tmp_co[0] + fac * tmp_co[0] * fbb; - if (flag & MOD_CAST_Y) - tmp_co[1] = facm * tmp_co[1] + fac * tmp_co[1] * fbb; - if (flag & MOD_CAST_Z) - tmp_co[2] = facm * tmp_co[2] + fac * tmp_co[2] * fbb; - - if(ctrl_ob) { - if(flag & MOD_CAST_USE_OB_TRANSFORM) { - mul_m4_v3(imat, tmp_co); - } else { - add_v3_v3v3(tmp_co, tmp_co, center); - } - } - - VECCOPY(vertexCos[i], tmp_co); - } -} - -static void castModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = NULL; - CastModifierData *cmd = (CastModifierData *)md; - - if (ob->type == OB_MESH) { - /* DerivedMesh is used only in case object is MESH */ - /* so we could optimize modifier applying by skipping DM creation */ - dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0); - } - - if (cmd->type == MOD_CAST_TYPE_CUBOID) { - castModifier_cuboid_do(cmd, ob, dm, vertexCos, numVerts); - } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ - castModifier_sphere_do(cmd, ob, dm, vertexCos, numVerts); - } - - if(dm != derivedData) - dm->release(dm); -} - -static void castModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = get_dm(md->scene, ob, editData, derivedData, NULL, 0); - CastModifierData *cmd = (CastModifierData *)md; - - if (cmd->type == MOD_CAST_TYPE_CUBOID) { - castModifier_cuboid_do(cmd, ob, dm, vertexCos, numVerts); - } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ - castModifier_sphere_do(cmd, ob, dm, vertexCos, numVerts); - } - - if(dm != derivedData) - dm->release(dm); -} - -/* Wave */ - -static void waveModifier_initData(ModifierData *md) -{ - WaveModifierData *wmd = (WaveModifierData*) md; // whadya know, moved here from Iraq - - wmd->flag |= (MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL - | MOD_WAVE_NORM_X | MOD_WAVE_NORM_Y | MOD_WAVE_NORM_Z); - - wmd->objectcenter = NULL; - wmd->texture = NULL; - wmd->map_object = NULL; - wmd->height= 0.5f; - wmd->width= 1.5f; - wmd->speed= 0.25f; - wmd->narrow= 1.5f; - wmd->lifetime= 0.0f; - wmd->damp= 10.0f; - wmd->falloff= 0.0f; - wmd->texmapping = MOD_WAV_MAP_LOCAL; - wmd->defgrp_name[0] = 0; -} - -static void waveModifier_copyData(ModifierData *md, ModifierData *target) -{ - WaveModifierData *wmd = (WaveModifierData*) md; - WaveModifierData *twmd = (WaveModifierData*) target; - - twmd->damp = wmd->damp; - twmd->flag = wmd->flag; - twmd->height = wmd->height; - twmd->lifetime = wmd->lifetime; - twmd->narrow = wmd->narrow; - twmd->speed = wmd->speed; - twmd->startx = wmd->startx; - twmd->starty = wmd->starty; - twmd->timeoffs = wmd->timeoffs; - twmd->width = wmd->width; - twmd->falloff = wmd->falloff; - twmd->objectcenter = wmd->objectcenter; - twmd->texture = wmd->texture; - twmd->map_object = wmd->map_object; - twmd->texmapping = wmd->texmapping; - strncpy(twmd->defgrp_name, wmd->defgrp_name, 32); -} - -static int waveModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -static void waveModifier_foreachObjectLink( - ModifierData *md, Object *ob, - ObjectWalkFunc walk, void *userData) -{ - WaveModifierData *wmd = (WaveModifierData*) md; - - walk(userData, ob, &wmd->objectcenter); - walk(userData, ob, &wmd->map_object); -} - -static void waveModifier_foreachIDLink(ModifierData *md, Object *ob, - IDWalkFunc walk, void *userData) -{ - WaveModifierData *wmd = (WaveModifierData*) md; - - walk(userData, ob, (ID **)&wmd->texture); - - waveModifier_foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); -} - -static void waveModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - WaveModifierData *wmd = (WaveModifierData*) md; - - if(wmd->objectcenter) { - DagNode *curNode = dag_get_node(forest, wmd->objectcenter); - - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, - "Wave Modifier"); - } - - if(wmd->map_object) { - DagNode *curNode = dag_get_node(forest, wmd->map_object); - - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, - "Wave Modifer"); - } -} - -static CustomDataMask waveModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - WaveModifierData *wmd = (WaveModifierData *)md; - CustomDataMask dataMask = 0; - - - /* ask for UV coordinates if we need them */ - if(wmd->texture && wmd->texmapping == MOD_WAV_MAP_UV) - dataMask |= (1 << CD_MTFACE); - - /* ask for vertexgroups if we need them */ - if(wmd->defgrp_name[0]) - dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void wavemod_get_texture_coords(WaveModifierData *wmd, Object *ob, - DerivedMesh *dm, - float (*co)[3], float (*texco)[3], - int numVerts) -{ - int i; - int texmapping = wmd->texmapping; - - if(texmapping == MOD_WAV_MAP_OBJECT) { - if(wmd->map_object) - invert_m4_m4(wmd->map_object->imat, wmd->map_object->obmat); - else /* if there is no map object, default to local */ - texmapping = MOD_WAV_MAP_LOCAL; - } - - /* UVs need special handling, since they come from faces */ - if(texmapping == MOD_WAV_MAP_UV) { - if(CustomData_has_layer(&dm->faceData, CD_MTFACE)) { - MFace *mface = dm->getTessFaceArray(dm); - MFace *mf; - char *done = MEM_callocN(sizeof(*done) * numVerts, - "get_texture_coords done"); - int numFaces = dm->getNumTessFaces(dm); - char uvname[32]; - MTFace *tf; - - validate_layer_name(&dm->faceData, CD_MTFACE, wmd->uvlayer_name, uvname); - tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname); - - /* verts are given the UV from the first face that uses them */ - for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tf) { - if(!done[mf->v1]) { - texco[mf->v1][0] = tf->uv[0][0]; - texco[mf->v1][1] = tf->uv[0][1]; - texco[mf->v1][2] = 0; - done[mf->v1] = 1; - } - if(!done[mf->v2]) { - texco[mf->v2][0] = tf->uv[1][0]; - texco[mf->v2][1] = tf->uv[1][1]; - texco[mf->v2][2] = 0; - done[mf->v2] = 1; - } - if(!done[mf->v3]) { - texco[mf->v3][0] = tf->uv[2][0]; - texco[mf->v3][1] = tf->uv[2][1]; - texco[mf->v3][2] = 0; - done[mf->v3] = 1; - } - if(!done[mf->v4]) { - texco[mf->v4][0] = tf->uv[3][0]; - texco[mf->v4][1] = tf->uv[3][1]; - texco[mf->v4][2] = 0; - done[mf->v4] = 1; - } - } - - /* remap UVs from [0, 1] to [-1, 1] */ - for(i = 0; i < numVerts; ++i) { - texco[i][0] = texco[i][0] * 2 - 1; - texco[i][1] = texco[i][1] * 2 - 1; - } - - MEM_freeN(done); - return; - } else /* if there are no UVs, default to local */ - texmapping = MOD_WAV_MAP_LOCAL; - } - - for(i = 0; i < numVerts; ++i, ++co, ++texco) { - switch(texmapping) { - case MOD_WAV_MAP_LOCAL: - VECCOPY(*texco, *co); - break; - case MOD_WAV_MAP_GLOBAL: - VECCOPY(*texco, *co); - mul_m4_v3(ob->obmat, *texco); - break; - case MOD_WAV_MAP_OBJECT: - VECCOPY(*texco, *co); - mul_m4_v3(ob->obmat, *texco); - mul_m4_v3(wmd->map_object->imat, *texco); - break; - } - } -} - -static void waveModifier_do(WaveModifierData *md, - Scene *scene, Object *ob, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - WaveModifierData *wmd = (WaveModifierData*) md; - MVert *mvert = NULL; - MDeformVert *dvert = NULL; - int defgrp_index; - float ctime = bsystem_time(scene, ob, (float)scene->r.cfra, 0.0); - float minfac = - (float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow)); - float lifefac = wmd->height; - float (*tex_co)[3] = NULL; - - if(wmd->flag & MOD_WAVE_NORM && ob->type == OB_MESH) - mvert = dm->getVertArray(dm); - - if(wmd->objectcenter){ - float mat[4][4]; - /* get the control object's location in local coordinates */ - invert_m4_m4(ob->imat, ob->obmat); - mul_m4_m4m4(mat, wmd->objectcenter->obmat, ob->imat); - - wmd->startx = mat[3][0]; - wmd->starty = mat[3][1]; - } - - /* get the index of the deform group */ - defgrp_index = defgroup_name_index(ob, wmd->defgrp_name); - - if(defgrp_index >= 0){ - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - } - - if(wmd->damp == 0) wmd->damp = 10.0f; - - if(wmd->lifetime != 0.0) { - float x = ctime - wmd->timeoffs; - - if(x > wmd->lifetime) { - lifefac = x - wmd->lifetime; - - if(lifefac > wmd->damp) lifefac = 0.0; - else lifefac = - (float)(wmd->height * (1.0 - sqrt(lifefac / wmd->damp))); - } - } - - if(wmd->texture) { - tex_co = MEM_mallocN(sizeof(*tex_co) * numVerts, - "waveModifier_do tex_co"); - wavemod_get_texture_coords(wmd, ob, dm, vertexCos, tex_co, numVerts); - } - - if(lifefac != 0.0) { - int i; - - for(i = 0; i < numVerts; i++) { - float *co = vertexCos[i]; - float x = co[0] - wmd->startx; - float y = co[1] - wmd->starty; - float amplit= 0.0f; - float dist = 0.0f; - float falloff_fac = 0.0f; - TexResult texres; - MDeformWeight *def_weight = NULL; - - /* get weights */ - if(dvert) { - int j; - for(j = 0; j < dvert[i].totweight; ++j) { - if(dvert[i].dw[j].def_nr == defgrp_index) { - def_weight = &dvert[i].dw[j]; - break; - } - } - - /* if this vert isn't in the vgroup, don't deform it */ - if(!def_weight) continue; - } - - if(wmd->texture) { - texres.nor = NULL; - get_texture_value(wmd->texture, tex_co[i], &texres); - } - - /*get dist*/ - if(wmd->flag & MOD_WAVE_X) { - if(wmd->flag & MOD_WAVE_Y){ - dist = (float)sqrt(x*x + y*y); - } - else{ - dist = fabs(x); - } - } - else if(wmd->flag & MOD_WAVE_Y) { - dist = fabs(y); - } - - falloff_fac = (1.0-(dist / wmd->falloff)); - CLAMP(falloff_fac,0,1); - - if(wmd->flag & MOD_WAVE_X) { - if(wmd->flag & MOD_WAVE_Y) amplit = (float)sqrt(x*x + y*y); - else amplit = x; - } - else if(wmd->flag & MOD_WAVE_Y) - amplit= y; - - /* this way it makes nice circles */ - amplit -= (ctime - wmd->timeoffs) * wmd->speed; - - if(wmd->flag & MOD_WAVE_CYCL) { - amplit = (float)fmod(amplit - wmd->width, 2.0 * wmd->width) - + wmd->width; - } - - /* GAUSSIAN */ - if(amplit > -wmd->width && amplit < wmd->width) { - amplit = amplit * wmd->narrow; - amplit = (float)(1.0 / exp(amplit * amplit) - minfac); - - /*apply texture*/ - if(wmd->texture) - amplit = amplit * texres.tin; - - /*apply weight*/ - if(def_weight) - amplit = amplit * def_weight->weight; - - /*apply falloff*/ - if (wmd->falloff > 0) - amplit = amplit * falloff_fac; - - if(mvert) { - /* move along normals */ - if(wmd->flag & MOD_WAVE_NORM_X) { - co[0] += (lifefac * amplit) * mvert[i].no[0] / 32767.0f; - } - if(wmd->flag & MOD_WAVE_NORM_Y) { - co[1] += (lifefac * amplit) * mvert[i].no[1] / 32767.0f; - } - if(wmd->flag & MOD_WAVE_NORM_Z) { - co[2] += (lifefac * amplit) * mvert[i].no[2] / 32767.0f; - } - } - else { - /* move along local z axis */ - co[2] += lifefac * amplit; - } - } - } - } - - if(wmd->texture) MEM_freeN(tex_co); -} - -static void waveModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm= derivedData; - WaveModifierData *wmd = (WaveModifierData *)md; - - if(wmd->flag & MOD_WAVE_NORM) - dm= get_cddm(md->scene, ob, NULL, dm, vertexCos); - else if(wmd->texture || wmd->defgrp_name[0]) - dm= get_dm(md->scene, ob, NULL, dm, NULL, 0); - - waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void waveModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm= derivedData; - WaveModifierData *wmd = (WaveModifierData *)md; - - if(wmd->flag & MOD_WAVE_NORM) - dm= get_cddm(md->scene, ob, editData, dm, vertexCos); - else if(wmd->texture || wmd->defgrp_name[0]) - dm= get_dm(md->scene, ob, editData, dm, NULL, 0); - - waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -/* Armature */ - -static void armatureModifier_initData(ModifierData *md) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - - amd->deformflag = ARM_DEF_ENVELOPE | ARM_DEF_VGROUP; -} - -static void armatureModifier_copyData(ModifierData *md, ModifierData *target) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - ArmatureModifierData *tamd = (ArmatureModifierData*) target; - - tamd->object = amd->object; - tamd->deformflag = amd->deformflag; - strncpy(tamd->defgrp_name, amd->defgrp_name, 32); -} - -static CustomDataMask armatureModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - CustomDataMask dataMask = 0; - - /* ask for vertexgroups */ - dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static int armatureModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - - return !amd->object; -} - -static void armatureModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - - walk(userData, ob, &amd->object); -} - -static void armatureModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - - if (amd->object) { - DagNode *curNode = dag_get_node(forest, amd->object); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier"); - } -} - -static void armatureModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - - modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - - armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL, - numVerts, amd->deformflag, - (float(*)[3])amd->prevCos, amd->defgrp_name); - /* free cache */ - if(amd->prevCos) { - MEM_freeN(amd->prevCos); - amd->prevCos= NULL; - } -} - -static void armatureModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - DerivedMesh *dm = derivedData; - - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); - - armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts, - amd->deformflag, NULL, amd->defgrp_name); - - if(!derivedData) dm->release(dm); -} - -static void armatureModifier_deformMatricesEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], - float (*defMats)[3][3], int numVerts) -{ - ArmatureModifierData *amd = (ArmatureModifierData*) md; - DerivedMesh *dm = derivedData; - - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); - - armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts, - amd->deformflag, NULL, amd->defgrp_name); - - if(!derivedData) dm->release(dm); -} - -/* Hook */ - -static void hookModifier_initData(ModifierData *md) -{ - HookModifierData *hmd = (HookModifierData*) md; - - hmd->force= 1.0; -} - -static void hookModifier_copyData(ModifierData *md, ModifierData *target) -{ - HookModifierData *hmd = (HookModifierData*) md; - HookModifierData *thmd = (HookModifierData*) target; - - VECCOPY(thmd->cent, hmd->cent); - thmd->falloff = hmd->falloff; - thmd->force = hmd->force; - thmd->object = hmd->object; - thmd->totindex = hmd->totindex; - thmd->indexar = MEM_dupallocN(hmd->indexar); - memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv)); - strncpy(thmd->name, hmd->name, 32); - strncpy(thmd->subtarget, hmd->subtarget, 32); -} - -static CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - HookModifierData *hmd = (HookModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(!hmd->indexar && hmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void hookModifier_freeData(ModifierData *md) -{ - HookModifierData *hmd = (HookModifierData*) md; - - if (hmd->indexar) MEM_freeN(hmd->indexar); -} - -static int hookModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - HookModifierData *hmd = (HookModifierData*) md; - - return !hmd->object; -} - -static void hookModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - HookModifierData *hmd = (HookModifierData*) md; - - walk(userData, ob, &hmd->object); -} - -static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - HookModifierData *hmd = (HookModifierData*) md; - - if (hmd->object) { - DagNode *curNode = dag_get_node(forest, hmd->object); - - if (hmd->subtarget[0]) - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA|DAG_RL_DATA_DATA, "Hook Modifier"); - else - dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, "Hook Modifier"); - } -} - -static void hookModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - HookModifierData *hmd = (HookModifierData*) md; - bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget); - float vec[3], mat[4][4], dmat[4][4]; - int i; - DerivedMesh *dm = derivedData; - - /* get world-space matrix of target, corrected for the space the verts are in */ - if (hmd->subtarget[0] && pchan) { - /* bone target if there's a matching pose-channel */ - mul_m4_m4m4(dmat, pchan->pose_mat, hmd->object->obmat); - } - else { - /* just object target */ - copy_m4_m4(dmat, hmd->object->obmat); - } - invert_m4_m4(ob->imat, ob->obmat); - mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv, - NULL, NULL, NULL, NULL, NULL); - - /* vertex indices? */ - if(hmd->indexar) { - for(i = 0; i < hmd->totindex; i++) { - int index = hmd->indexar[i]; - - /* This should always be true and I don't generally like - * "paranoid" style code like this, but old files can have - * indices that are out of range because old blender did - * not correct them on exit editmode. - zr - */ - if(index < numVerts) { - float *co = vertexCos[index]; - float fac = hmd->force; - - /* if DerivedMesh is present and has original index data, - * use it - */ - if(dm && dm->getVertDataArray(dm, CD_ORIGINDEX)) { - int j; - int orig_index; - for(j = 0; j < numVerts; ++j) { - fac = hmd->force; - orig_index = *(int *)dm->getVertData(dm, j, - CD_ORIGINDEX); - if(orig_index == index) { - co = vertexCos[j]; - if(hmd->falloff != 0.0) { - float len = len_v3v3(co, hmd->cent); - if(len > hmd->falloff) fac = 0.0; - else if(len > 0.0) - fac *= sqrt(1.0 - len / hmd->falloff); - } - - if(fac != 0.0) { - mul_v3_m4v3(vec, mat, co); - interp_v3_v3v3(co, co, vec, fac); - } - } - } - } else { - if(hmd->falloff != 0.0) { - float len = len_v3v3(co, hmd->cent); - if(len > hmd->falloff) fac = 0.0; - else if(len > 0.0) - fac *= sqrt(1.0 - len / hmd->falloff); - } - - if(fac != 0.0) { - mul_v3_m4v3(vec, mat, co); - interp_v3_v3v3(co, co, vec, fac); - } - } - } - } - } - else if(hmd->name[0]) { /* vertex group hook */ - Mesh *me = ob->data; - int use_dverts = 0; - int maxVerts = 0; - int defgrp_index = defgroup_name_index(ob, hmd->name); - - if(dm) { - if(dm->getVertData(dm, 0, CD_MDEFORMVERT)) { - maxVerts = dm->getNumVerts(dm); - use_dverts = 1; - } - } - else if(me->dvert) { - maxVerts = me->totvert; - use_dverts = 1; - } - - if(defgrp_index >= 0 && use_dverts) { - MDeformVert *dvert = me->dvert; - int i, j; - - for(i = 0; i < maxVerts; i++, dvert++) { - if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT); - for(j = 0; j < dvert->totweight; j++) { - if(dvert->dw[j].def_nr == defgrp_index) { - float fac = hmd->force*dvert->dw[j].weight; - float *co = vertexCos[i]; - - if(hmd->falloff != 0.0) { - float len = len_v3v3(co, hmd->cent); - if(len > hmd->falloff) fac = 0.0; - else if(len > 0.0) - fac *= sqrt(1.0 - len / hmd->falloff); - } - - mul_v3_m4v3(vec, mat, co); - interp_v3_v3v3(co, co, vec, fac); - } - } - } - } - } -} - -static void hookModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = derivedData; - - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); - - hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0); - - if(!derivedData) dm->release(dm); -} - -/* Softbody */ - -static void softbodyModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts); -} - -static int softbodyModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -/* Solidify */ - - -typedef struct EdgeFaceRef { - int f1; /* init as -1 */ - int f2; -} EdgeFaceRef; - -static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3]) -{ - int i, numVerts, numEdges, numFaces; - MFace *mface, *mf; - MVert *mvert, *mv; - - float (*face_nors)[3]; - float *f_no; - int calc_face_nors= 0; - - numVerts = dm->getNumVerts(dm); - numEdges = dm->getNumEdges(dm); - numFaces = dm->getNumFaces(dm); - mface = dm->getTessFaceArray(dm); - mvert = dm->getVertArray(dm); - - /* we don't want to overwrite any referenced layers */ - - /* - Dosnt work here! - mv = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT); - cddm->mvert = mv; - */ - - face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL); - if(!face_nors) { - calc_face_nors = 1; - face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, numFaces); - } - - mv = mvert; - mf = mface; - - { - EdgeHash *edge_hash = BLI_edgehash_new(); - EdgeHashIterator *edge_iter; - int edge_ref_count = 0; - int ed_v1, ed_v2; /* use when getting the key */ - EdgeFaceRef *edge_ref_array = MEM_callocN(numEdges * sizeof(EdgeFaceRef), "Edge Connectivity"); - EdgeFaceRef *edge_ref; - float edge_normal[3]; - - /* This function adds an edge hash if its not there, and adds the face index */ -#define NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(EDV1, EDV2); \ - edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, EDV1, EDV2); \ - if (!edge_ref) { \ - edge_ref = &edge_ref_array[edge_ref_count]; edge_ref_count++; \ - edge_ref->f1=i; \ - edge_ref->f2=-1; \ - BLI_edgehash_insert(edge_hash, EDV1, EDV2, edge_ref); \ - } else { \ - edge_ref->f2=i; \ - } - - for(i = 0; i < numFaces; i++, mf++) { - f_no = face_nors[i]; - - if(mf->v4) { - if(calc_face_nors) - normal_quad_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co); - - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2); - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3); - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v4); - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v4, mf->v1); - } else { - if(calc_face_nors) - normal_tri_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co); - - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2); - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3); - NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v1); - } - } - - for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) { - /* Get the edge vert indicies, and edge value (the face indicies that use it)*/ - BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2); - edge_ref = BLI_edgehashIterator_getValue(edge_iter); - - if (edge_ref->f2 != -1) { - /* We have 2 faces using this edge, calculate the edges normal - * using the angle between the 2 faces as a weighting */ - add_v3_v3v3(edge_normal, face_nors[edge_ref->f1], face_nors[edge_ref->f2]); - normalize_v3(edge_normal); - mul_v3_fl(edge_normal, angle_normalized_v3v3(face_nors[edge_ref->f1], face_nors[edge_ref->f2])); - } else { - /* only one face attached to that edge */ - /* an edge without another attached- the weight on this is - * undefined, M_PI/2 is 90d in radians and that seems good enough */ - VECCOPY(edge_normal, face_nors[edge_ref->f1]) - mul_v3_fl(edge_normal, M_PI/2); - } - add_v3_v3(temp_nors[ed_v1], edge_normal); - add_v3_v3(temp_nors[ed_v2], edge_normal); - } - BLI_edgehashIterator_free(edge_iter); - BLI_edgehash_free(edge_hash, NULL); - MEM_freeN(edge_ref_array); - } - - /* normalize vertex normals and assign */ - for(i = 0; i < numVerts; i++, mv++) { - if(normalize_v3(temp_nors[i]) == 0.0f) { - normal_short_to_float_v3(temp_nors[i], mv->no); - } - } -} - -static void solidifyModifier_initData(ModifierData *md) -{ - SolidifyModifierData *smd = (SolidifyModifierData*) md; - smd->offset = 0.01f; - smd->flag = MOD_SOLIDIFY_RIM; -} - -static void solidifyModifier_copyData(ModifierData *md, ModifierData *target) -{ - SolidifyModifierData *smd = (SolidifyModifierData*) md; - SolidifyModifierData *tsmd = (SolidifyModifierData*) target; - tsmd->offset = smd->offset; - tsmd->crease_inner = smd->crease_inner; - tsmd->crease_outer = smd->crease_outer; - tsmd->crease_rim = smd->crease_rim; - strcpy(tsmd->defgrp_name, smd->defgrp_name); -} - -static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, - Object *ob, - DerivedMesh *dm, - int useRenderParams, - int isFinalCalc) -{ - int i; - DerivedMesh *result; - SolidifyModifierData *smd = (SolidifyModifierData*) md; - - MFace *mf, *mface, *orig_mface; - MEdge *ed, *medge, *orig_medge; - MVert *mv, *mvert, *orig_mvert; - - int numVerts = dm->getNumVerts(dm); - int numEdges = dm->getNumEdges(dm); - int numFaces = dm->getNumFaces(dm); - - /* use for edges */ - int *new_vert_arr= NULL; - int newFaces = 0; - - int *new_edge_arr= NULL; - int newEdges = 0; - - int *edge_users= NULL; - char *edge_order= NULL; - - float (*vert_nors)[3]= NULL; - - orig_mface = dm->getTessFaceArray(dm); - orig_medge = dm->getEdgeArray(dm); - orig_mvert = dm->getVertArray(dm); - - if(smd->flag & MOD_SOLIDIFY_RIM) { - EdgeHash *edgehash = BLI_edgehash_new(); - EdgeHashIterator *ehi; - int v1, v2; - int eidx; - - for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) { - mv->flag &= ~ME_VERT_TMP_TAG; - } - - for(i=0, ed=orig_medge; i<numEdges; i++, ed++) { - BLI_edgehash_insert(edgehash, ed->v1, ed->v2, SET_INT_IN_POINTER(i)); - } - -#define INVALID_UNUSED -1 -#define INVALID_PAIR -2 - -#define ADD_EDGE_USER(_v1, _v2, edge_ord) \ - eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, _v1, _v2)); \ - if(edge_users[eidx] == INVALID_UNUSED) { \ - edge_users[eidx]= (_v1 < _v2) ? i:(i+numFaces); \ - edge_order[eidx]= edge_ord; \ - } else { \ - edge_users[eidx]= INVALID_PAIR; \ - } \ - - - edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges"); - edge_order= MEM_mallocN(sizeof(char) * numEdges, "solid_mod eorder"); - memset(edge_users, INVALID_UNUSED, sizeof(int) * numEdges); - - for(i=0, mf=orig_mface; i<numFaces; i++, mf++) { - if(mf->v4) { - ADD_EDGE_USER(mf->v1, mf->v2, 0); - ADD_EDGE_USER(mf->v2, mf->v3, 1); - ADD_EDGE_USER(mf->v3, mf->v4, 2); - ADD_EDGE_USER(mf->v4, mf->v1, 3); - } - else { - ADD_EDGE_USER(mf->v1, mf->v2, 0); - ADD_EDGE_USER(mf->v2, mf->v3, 1); - ADD_EDGE_USER(mf->v3, mf->v1, 2); - } - } - -#undef ADD_EDGE_USER -#undef INVALID_UNUSED -#undef INVALID_PAIR - - - new_edge_arr= MEM_callocN(sizeof(int) * numEdges, "solid_mod arr"); - - ehi= BLI_edgehashIterator_new(edgehash); - for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - int eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); - if(edge_users[eidx] >= 0) { - BLI_edgehashIterator_getKey(ehi, &v1, &v2); - orig_mvert[v1].flag |= ME_VERT_TMP_TAG; - orig_mvert[v2].flag |= ME_VERT_TMP_TAG; - new_edge_arr[newFaces]= eidx; - newFaces++; - } - } - BLI_edgehashIterator_free(ehi); - - - - new_vert_arr= MEM_callocN(sizeof(int) * numVerts, "solid_mod new_varr"); - for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) { - if(mv->flag & ME_VERT_TMP_TAG) { - new_vert_arr[newEdges] = i; - newEdges++; - - mv->flag &= ~ME_VERT_TMP_TAG; - } - } - - BLI_edgehash_free(edgehash, NULL); - } - - if(smd->flag & MOD_SOLIDIFY_NORMAL_CALC) { - vert_nors= MEM_callocN(sizeof(float) * numVerts * 3, "mod_solid_vno_hq"); - dm_calc_normal(dm, vert_nors); - } - - result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces, 0, 0); - - mface = result->getTessFaceArray(result); - medge = result->getEdgeArray(result); - mvert = result->getVertArray(result); - - DM_copy_face_data(dm, result, 0, 0, numFaces); - DM_copy_face_data(dm, result, 0, numFaces, numFaces); - - DM_copy_edge_data(dm, result, 0, 0, numEdges); - DM_copy_edge_data(dm, result, 0, numEdges, numEdges); - - DM_copy_vert_data(dm, result, 0, 0, numVerts); - DM_copy_vert_data(dm, result, 0, numVerts, numVerts); - - { - static int corner_indices[4] = {2, 1, 0, 3}; - int is_quad; - - for(i=0, mf=mface+numFaces; i<numFaces; i++, mf++) { - mf->v1 += numVerts; - mf->v2 += numVerts; - mf->v3 += numVerts; - if(mf->v4) - mf->v4 += numVerts; - - /* Flip face normal */ - { - is_quad = mf->v4; - SWAP(int, mf->v1, mf->v3); - DM_swap_tessface_data(result, i+numFaces, corner_indices); - test_index_face(mf, &result->faceData, numFaces, is_quad ? 4:3); - } - } - } - - for(i=0, ed=medge+numEdges; i<numEdges; i++, ed++) { - ed->v1 += numVerts; - ed->v2 += numVerts; - } - - if((smd->flag & MOD_SOLIDIFY_EVEN) == 0) { - /* no even thickness, very simple */ - float scalar_short = smd->offset / 32767.0f; - - if(smd->offset < 0.0f) mv= mvert+numVerts; - else mv= mvert; - - for(i=0; i<numVerts; i++, mv++) { - mv->co[0] += mv->no[0] * scalar_short; - mv->co[1] += mv->no[1] * scalar_short; - mv->co[2] += mv->no[2] * scalar_short; - } - } - else { - /* make a face normal layer if not present */ - float (*face_nors)[3]; - int face_nors_calc= 0; - - /* same as EM_solidify() in editmesh_lib.c */ - float *vert_angles= MEM_callocN(sizeof(float) * numVerts * 2, "mod_solid_pair"); /* 2 in 1 */ - float *vert_accum= vert_angles + numVerts; - float face_angles[4]; - int i, j, vidx; - - face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL); - if(!face_nors) { - face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, dm->numFaceData); - face_nors_calc= 1; - } - - if(vert_nors==NULL) { - vert_nors= MEM_mallocN(sizeof(float) * numVerts * 3, "mod_solid_vno"); - for(i=0, mv=mvert; i<numVerts; i++, mv++) { - normal_short_to_float_v3(vert_nors[i], mv->no); - } - } - - for(i=0, mf=mface; i<numFaces; i++, mf++) { - - /* just added, calc the normal */ - if(face_nors_calc) { - if(mf->v4) - normal_quad_v3(face_nors[i], mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co); - else - normal_tri_v3(face_nors[i] , mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co); - } - - if(mf->v4) { - angle_quad_v3(face_angles, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co); - j= 3; - } - else { - angle_tri_v3(face_angles, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co); - j= 2; - } - - for(; j>=0; j--) { - vidx = *(&mf->v1 + j); - vert_accum[vidx] += face_angles[j]; - vert_angles[vidx]+= shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * face_angles[j]; - } - } - - if(smd->offset < 0.0f) mv= mvert+numVerts; - else mv= mvert; - - for(i=0; i<numVerts; i++, mv++) { - if(vert_accum[i]) { /* zero if unselected */ - madd_v3_v3fl(mv->co, vert_nors[i], smd->offset * (vert_angles[i] / vert_accum[i])); - } - } - - MEM_freeN(vert_angles); - } - - if(vert_nors) - MEM_freeN(vert_nors); - - if(smd->flag & MOD_SOLIDIFY_RIM) { - - static int edge_indices[4][4] = { - {1, 0, 0, 1}, - {2, 1, 1, 2}, - {3, 2, 2, 3}, - {0, 3, 3, 0}}; - - /* add faces & edges */ - ed= medge + (numEdges * 2); - for(i=0; i<newEdges; i++, ed++) { - ed->v1= new_vert_arr[i]; - ed->v2= new_vert_arr[i] + numVerts; - ed->flag |= ME_EDGEDRAW; - - if(smd->crease_rim) - ed->crease= smd->crease_rim * 255.0f; - } - - /* faces */ - mf= mface + (numFaces * 2); - for(i=0; i<newFaces; i++, mf++) { - int eidx= new_edge_arr[i]; - int fidx= edge_users[eidx]; - int flip; - - if(fidx >= numFaces) { - fidx -= numFaces; - flip= 1; - } - else { - flip= 0; - } - - ed= medge + eidx; - - /* copy most of the face settings */ - DM_copy_face_data(dm, result, fidx, (numFaces * 2) + i, 1); - - if(flip) { - DM_swap_tessface_data(result, (numFaces * 2) + i, edge_indices[edge_order[eidx]]); - - mf->v1= ed->v1; - mf->v2= ed->v2; - mf->v3= ed->v2 + numVerts; - mf->v4= ed->v1 + numVerts; - } - else { - DM_swap_tessface_data(result, (numFaces * 2) + i, edge_indices[edge_order[eidx]]); - - mf->v1= ed->v2; - mf->v2= ed->v1; - mf->v3= ed->v1 + numVerts; - mf->v4= ed->v2 + numVerts; - - - } - - if(smd->crease_outer > 0.0f) - ed->crease= smd->crease_outer * 255.0f; - - if(smd->crease_inner > 0.0f) { - ed= medge + (numEdges + eidx); - ed->crease= smd->crease_inner * 255.0f; - } - } - - MEM_freeN(new_vert_arr); - MEM_freeN(new_edge_arr); - MEM_freeN(edge_users); - MEM_freeN(edge_order); - } - - CDDM_tessfaces_to_faces(result); - - return result; -} - -static DerivedMesh *solidifyModifier_applyModifierEM(ModifierData *md, - Object *ob, - EditMesh *editData, - DerivedMesh *derivedData) -{ - return solidifyModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* Smoke */ - -static void smokeModifier_initData(ModifierData *md) -{ - SmokeModifierData *smd = (SmokeModifierData*) md; - - smd->domain = NULL; - smd->flow = NULL; - smd->coll = NULL; - smd->type = 0; - smd->time = -1; -} - -static void smokeModifier_freeData(ModifierData *md) -{ - SmokeModifierData *smd = (SmokeModifierData*) md; - - smokeModifier_free (smd); -} - -static void smokeModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - SmokeModifierData *smd = (SmokeModifierData*) md; - DerivedMesh *dm = dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos); - - smokeModifier_do(smd, md->scene, ob, dm, useRenderParams, isFinalCalc); - - if(dm != derivedData) - dm->release(dm); -} - -static int smokeModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -static void smokeModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - /*SmokeModifierData *smd = (SmokeModifierData *) md; - if(smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) - { - if(smd->domain->fluid_group) - { - GroupObject *go = NULL; - - for(go = smd->domain->fluid_group->gobject.first; go; go = go->next) - { - if(go->ob) - { - SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(go->ob, eModifierType_Smoke); - - // check for initialized smoke object - if(smd2 && (smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) - { - DagNode *curNode = dag_get_node(forest, go->ob); - dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow"); - } - } - } - } - } - */ -} - -/* Cloth */ - -static void clothModifier_initData(ModifierData *md) -{ - ClothModifierData *clmd = (ClothModifierData*) md; - - clmd->sim_parms = MEM_callocN(sizeof(ClothSimSettings), "cloth sim parms"); - clmd->coll_parms = MEM_callocN(sizeof(ClothCollSettings), "cloth coll parms"); - clmd->point_cache = BKE_ptcache_add(&clmd->ptcaches); - - /* check for alloc failing */ - if(!clmd->sim_parms || !clmd->coll_parms || !clmd->point_cache) - return; - - cloth_init (clmd); -} - -static DerivedMesh *clothModifier_applyModifier(ModifierData *md, Object *ob, - DerivedMesh *derivedData, int useRenderParams, int isFinalCalc) -{ - ClothModifierData *clmd = (ClothModifierData*) md; - DerivedMesh *result=NULL; - - /* check for alloc failing */ - if(!clmd->sim_parms || !clmd->coll_parms) - { - clothModifier_initData(md); - - if(!clmd->sim_parms || !clmd->coll_parms) - return derivedData; - } - - result = clothModifier_do(clmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc); - - if(result) - { - CDDM_calc_normals(result); - return result; - } - return derivedData; -} - -static void clothModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - ClothModifierData *clmd = (ClothModifierData*) md; - - Base *base; - - if(clmd) - { - for(base = scene->base.first; base; base= base->next) - { - Object *ob1= base->object; - if(ob1 != ob) - { - CollisionModifierData *coll_clmd = (CollisionModifierData *)modifiers_findByType(ob1, eModifierType_Collision); - if(coll_clmd) - { - DagNode *curNode = dag_get_node(forest, ob1); - dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Cloth Collision"); - } - } - } - } -} - -static CustomDataMask clothModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void clothModifier_copyData(ModifierData *md, ModifierData *target) -{ - ClothModifierData *clmd = (ClothModifierData*) md; - ClothModifierData *tclmd = (ClothModifierData*) target; - - if(tclmd->sim_parms) - MEM_freeN(tclmd->sim_parms); - if(tclmd->coll_parms) - MEM_freeN(tclmd->coll_parms); - - BKE_ptcache_free_list(&tclmd->ptcaches); - tclmd->point_cache = NULL; - - tclmd->sim_parms = MEM_dupallocN(clmd->sim_parms); - if(clmd->sim_parms->effector_weights) - tclmd->sim_parms->effector_weights = MEM_dupallocN(clmd->sim_parms->effector_weights); - tclmd->coll_parms = MEM_dupallocN(clmd->coll_parms); - tclmd->point_cache = BKE_ptcache_copy_list(&tclmd->ptcaches, &clmd->ptcaches); - tclmd->clothObject = NULL; -} - -static int clothModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -static void clothModifier_freeData(ModifierData *md) -{ - ClothModifierData *clmd = (ClothModifierData*) md; - - if (clmd) - { - if(G.rt > 0) - printf("clothModifier_freeData\n"); - - cloth_free_modifier_extern (clmd); - - if(clmd->sim_parms) { - if(clmd->sim_parms->effector_weights) - MEM_freeN(clmd->sim_parms->effector_weights); - MEM_freeN(clmd->sim_parms); - } - if(clmd->coll_parms) - MEM_freeN(clmd->coll_parms); - - BKE_ptcache_free_list(&clmd->ptcaches); - clmd->point_cache = NULL; - } -} - -/* Collision */ - -static void collisionModifier_initData(ModifierData *md) -{ - CollisionModifierData *collmd = (CollisionModifierData*) md; - - collmd->x = NULL; - collmd->xnew = NULL; - collmd->current_x = NULL; - collmd->current_xnew = NULL; - collmd->current_v = NULL; - collmd->time = -1000; - collmd->numverts = 0; - collmd->bvhtree = NULL; -} - -static void collisionModifier_freeData(ModifierData *md) -{ - CollisionModifierData *collmd = (CollisionModifierData*) md; - - if (collmd) - { - if(collmd->bvhtree) - BLI_bvhtree_free(collmd->bvhtree); - if(collmd->x) - MEM_freeN(collmd->x); - if(collmd->xnew) - MEM_freeN(collmd->xnew); - if(collmd->current_x) - MEM_freeN(collmd->current_x); - if(collmd->current_xnew) - MEM_freeN(collmd->current_xnew); - if(collmd->current_v) - MEM_freeN(collmd->current_v); - if(collmd->mfaces) - MEM_freeN(collmd->mfaces); - - collmd->x = NULL; - collmd->xnew = NULL; - collmd->current_x = NULL; - collmd->current_xnew = NULL; - collmd->current_v = NULL; - collmd->time = -1000; - collmd->numverts = 0; - collmd->bvhtree = NULL; - collmd->mfaces = NULL; - } -} - -static int collisionModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -static void collisionModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - CollisionModifierData *collmd = (CollisionModifierData*) md; - DerivedMesh *dm = NULL; - float current_time = 0; - unsigned int numverts = 0, i = 0; - MVert *tempVert = NULL; - - /* if possible use/create DerivedMesh */ - if(derivedData) dm = CDDM_copy(derivedData, 0); - else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob); - - if(!ob->pd) - { - printf("collisionModifier_deformVerts: Should not happen!\n"); - return; - } - - if(dm) - { - CDDM_apply_vert_coords(dm, vertexCos); - CDDM_calc_normals(dm); - - current_time = bsystem_time (md->scene, ob, ( float ) md->scene->r.cfra, 0.0 ); - - if(G.rt > 0) - printf("current_time %f, collmd->time %f\n", current_time, collmd->time); - - numverts = dm->getNumVerts ( dm ); - - if((current_time > collmd->time)|| (BKE_ptcache_get_continue_physics())) - { - // check if mesh has changed - if(collmd->x && (numverts != collmd->numverts)) - collisionModifier_freeData((ModifierData *)collmd); - - if(collmd->time == -1000) // first time - { - collmd->x = dm->dupVertArray(dm); // frame start position - - for ( i = 0; i < numverts; i++ ) - { - // we save global positions - mul_m4_v3( ob->obmat, collmd->x[i].co ); - } - - collmd->xnew = MEM_dupallocN(collmd->x); // frame end position - collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame - collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame - collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame - - collmd->numverts = numverts; - - collmd->mfaces = dm->dupTessFaceArray(dm); - collmd->numfaces = dm->getNumTessFaces(dm); - - // create bounding box hierarchy - collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->x, numverts, ob->pd->pdef_sboft); - - collmd->time = current_time; - } - else if(numverts == collmd->numverts) - { - // put positions to old positions - tempVert = collmd->x; - collmd->x = collmd->xnew; - collmd->xnew = tempVert; - - memcpy(collmd->xnew, dm->getVertArray(dm), numverts*sizeof(MVert)); - - for ( i = 0; i < numverts; i++ ) - { - // we save global positions - mul_m4_v3( ob->obmat, collmd->xnew[i].co ); - } - - memcpy(collmd->current_xnew, collmd->x, numverts*sizeof(MVert)); - memcpy(collmd->current_x, collmd->x, numverts*sizeof(MVert)); - - /* check if GUI setting has changed for bvh */ - if(collmd->bvhtree) - { - if(ob->pd->pdef_sboft != BLI_bvhtree_getepsilon(collmd->bvhtree)) - { - BLI_bvhtree_free(collmd->bvhtree); - collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->current_x, numverts, ob->pd->pdef_sboft); - } - - } - - /* happens on file load (ONLY when i decomment changes in readfile.c) */ - if(!collmd->bvhtree) - { - collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->current_x, numverts, ob->pd->pdef_sboft); - } - else - { - // recalc static bounding boxes - bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 ); - } - - collmd->time = current_time; - } - else if(numverts != collmd->numverts) - { - collisionModifier_freeData((ModifierData *)collmd); - } - - } - else if(current_time < collmd->time) - { - collisionModifier_freeData((ModifierData *)collmd); - } - else - { - if(numverts != collmd->numverts) - { - collisionModifier_freeData((ModifierData *)collmd); - } - } - } - - if(dm) - dm->release(dm); -} - - - -/* Surface */ - -static void surfaceModifier_initData(ModifierData *md) -{ - SurfaceModifierData *surmd = (SurfaceModifierData*) md; - - surmd->bvhtree = NULL; -} - -static void surfaceModifier_freeData(ModifierData *md) -{ - SurfaceModifierData *surmd = (SurfaceModifierData*) md; - - if (surmd) - { - if(surmd->bvhtree) { - free_bvhtree_from_mesh(surmd->bvhtree); - MEM_freeN(surmd->bvhtree); - } - - if(surmd->dm) - surmd->dm->release(surmd->dm); - - if(surmd->x) - MEM_freeN(surmd->x); - - if(surmd->v) - MEM_freeN(surmd->v); - - surmd->bvhtree = NULL; - surmd->dm = NULL; - } -} - -static int surfaceModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -static void surfaceModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - SurfaceModifierData *surmd = (SurfaceModifierData*) md; - unsigned int numverts = 0, i = 0; - - if(surmd->dm) - surmd->dm->release(surmd->dm); - - /* if possible use/create DerivedMesh */ - if(derivedData) surmd->dm = CDDM_copy(derivedData, 0); - else surmd->dm = get_dm(md->scene, ob, NULL, NULL, NULL, 0); - - if(!ob->pd) - { - printf("surfaceModifier_deformVerts: Should not happen!\n"); - return; - } - - if(surmd->dm) - { - int init = 0; - float *vec; - MVert *x, *v; - - CDDM_apply_vert_coords(surmd->dm, vertexCos); - CDDM_calc_normals(surmd->dm); - - numverts = surmd->dm->getNumVerts ( surmd->dm ); - - if(numverts != surmd->numverts || surmd->x == NULL || surmd->v == NULL || md->scene->r.cfra != surmd->cfra+1) { - if(surmd->x) { - MEM_freeN(surmd->x); - surmd->x = NULL; - } - if(surmd->v) { - MEM_freeN(surmd->v); - surmd->v = NULL; - } - - surmd->x = MEM_callocN(numverts * sizeof(MVert), "MVert"); - surmd->v = MEM_callocN(numverts * sizeof(MVert), "MVert"); - - surmd->numverts = numverts; - - init = 1; - } - - /* convert to global coordinates and calculate velocity */ - for(i = 0, x = surmd->x, v = surmd->v; i<numverts; i++, x++, v++) { - vec = CDDM_get_vert(surmd->dm, i)->co; - mul_m4_v3(ob->obmat, vec); - - if(init) - v->co[0] = v->co[1] = v->co[2] = 0.0f; - else - sub_v3_v3v3(v->co, vec, x->co); - - copy_v3_v3(x->co, vec); - } - - surmd->cfra = md->scene->r.cfra; - - if(surmd->bvhtree) - free_bvhtree_from_mesh(surmd->bvhtree); - else - surmd->bvhtree = MEM_callocN(sizeof(BVHTreeFromMesh), "BVHTreeFromMesh"); - - if(surmd->dm->getNumFaces(surmd->dm)) - bvhtree_from_mesh_faces(surmd->bvhtree, surmd->dm, 0.0, 2, 6); - else - bvhtree_from_mesh_edges(surmd->bvhtree, surmd->dm, 0.0, 2, 6); - } -} - - -/* Boolean */ - -static void booleanModifier_copyData(ModifierData *md, ModifierData *target) -{ - BooleanModifierData *bmd = (BooleanModifierData*) md; - BooleanModifierData *tbmd = (BooleanModifierData*) target; - - tbmd->object = bmd->object; - tbmd->operation = bmd->operation; -} - -static int booleanModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - BooleanModifierData *bmd = (BooleanModifierData*) md; - - return !bmd->object; -} - -static void booleanModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - BooleanModifierData *bmd = (BooleanModifierData*) md; - - walk(userData, ob, &bmd->object); -} - -static void booleanModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - BooleanModifierData *bmd = (BooleanModifierData*) md; - - if(bmd->object) { - DagNode *curNode = dag_get_node(forest, bmd->object); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Boolean Modifier"); - } -} - -static DerivedMesh *booleanModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - BooleanModifierData *bmd = (BooleanModifierData*) md; - DerivedMesh *dm = bmd->object->derivedFinal; - - /* we do a quick sanity check */ - if(dm && (derivedData->getNumTessFaces(derivedData) > 3) - && bmd->object && dm->getNumTessFaces(dm) > 3) { - DerivedMesh *result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob, - 1 + bmd->operation); - - /* if new mesh returned, return it; otherwise there was - * an error, so delete the modifier object */ - if(result) - return result; - else - modifier_setError(md, "Can't execute boolean operation."); - } - - return derivedData; -} - -static CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE); - - dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -/* Particles */ -static void particleSystemModifier_initData(ModifierData *md) -{ - ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; - psmd->psys= 0; - psmd->dm=0; - psmd->totdmvert= psmd->totdmedge= psmd->totdmface= 0; -} -static void particleSystemModifier_freeData(ModifierData *md) -{ - ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; - - if(psmd->dm){ - psmd->dm->needsFree = 1; - psmd->dm->release(psmd->dm); - psmd->dm=0; - } - - /* ED_object_modifier_remove may have freed this first before calling - * modifier_free (which calls this function) */ - if(psmd->psys) - psmd->psys->flag |= PSYS_DELETE; -} -static void particleSystemModifier_copyData(ModifierData *md, ModifierData *target) -{ - ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; - ParticleSystemModifierData *tpsmd= (ParticleSystemModifierData*) target; - - tpsmd->dm = 0; - tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0; - //tpsmd->facepa = 0; - tpsmd->flag = psmd->flag; - /* need to keep this to recognise a bit later in copy_object */ - tpsmd->psys = psmd->psys; -} - -static CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; - CustomDataMask dataMask = 0; - Material *ma; - MTex *mtex; - int i; - - if(!psmd->psys->part) - return 0; - - ma= give_current_material(ob, psmd->psys->part->omat); - if(ma) { - for(i=0; i<MAX_MTEX; i++) { - mtex=ma->mtex[i]; - if(mtex && (ma->septex & (1<<i))==0) - if(mtex->pmapto && (mtex->texco & TEXCO_UV)) - dataMask |= (1 << CD_MTFACE); - } - } - - if(psmd->psys->part->tanfac!=0.0) - dataMask |= (1 << CD_MTFACE); - - /* ask for vertexgroups if we need them */ - for(i=0; i<PSYS_TOT_VG; i++){ - if(psmd->psys->vgroup[i]){ - dataMask |= (1 << CD_MDEFORMVERT); - break; - } - } - - /* particles only need this if they are after a non deform modifier, and - * the modifier stack will only create them in that case. */ - dataMask |= CD_MASK_ORIGSPACE; - - dataMask |= CD_MASK_ORCO; - - return dataMask; -} - -/* saves the current emitter state for a particle system and calculates particles */ -static void particleSystemModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = derivedData; - ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; - ParticleSystem * psys=0; - int needsFree=0; - - if(ob->particlesystem.first) - psys=psmd->psys; - else - return; - - if(!psys_check_enabled(ob, psys)) - return; - - if(dm==0) { - dm= get_dm(md->scene, ob, NULL, NULL, vertexCos, 1); - - if(!dm) - return; - - needsFree= 1; - } - - /* clear old dm */ - if(psmd->dm){ - psmd->dm->needsFree = 1; - psmd->dm->release(psmd->dm); - } - - /* make new dm */ - psmd->dm=CDDM_copy(dm, 0); - CDDM_apply_vert_coords(psmd->dm, vertexCos); - CDDM_calc_normals(psmd->dm); - - if(needsFree){ - dm->needsFree = 1; - dm->release(dm); - } - - /* protect dm */ - psmd->dm->needsFree = 0; - - /* report change in mesh structure */ - if(psmd->dm->getNumVerts(psmd->dm)!=psmd->totdmvert || - psmd->dm->getNumEdges(psmd->dm)!=psmd->totdmedge || - psmd->dm->getNumTessFaces(psmd->dm)!=psmd->totdmface){ - /* in file read dm hasn't really changed but just wasn't saved in file */ - - psys->recalc |= PSYS_RECALC_RESET; - psmd->flag |= eParticleSystemFlag_DM_changed; - - psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm); - psmd->totdmedge= psmd->dm->getNumEdges(psmd->dm); - psmd->totdmface= psmd->dm->getNumTessFaces(psmd->dm); - } - - if(psys) { - psmd->flag &= ~eParticleSystemFlag_psys_updated; - particle_system_update(md->scene, ob, psys); - psmd->flag |= eParticleSystemFlag_psys_updated; - psmd->flag &= ~eParticleSystemFlag_DM_changed; - } -} - -/* disabled particles in editmode for now, until support for proper derivedmesh - * updates is coded */ -#if 0 -static void particleSystemModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = derivedData; - - if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data); - - particleSystemModifier_deformVerts(md, ob, dm, vertexCos, numVerts); - - if(!derivedData) dm->release(dm); -} -#endif - -/* Particle Instance */ -static void particleInstanceModifier_initData(ModifierData *md) -{ - ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md; - - pimd->flag = eParticleInstanceFlag_Parents|eParticleInstanceFlag_Unborn| - eParticleInstanceFlag_Alive|eParticleInstanceFlag_Dead; - pimd->psys = 1; - pimd->position = 1.0f; - pimd->axis = 2; - -} -static void particleInstanceModifier_copyData(ModifierData *md, ModifierData *target) -{ - ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md; - ParticleInstanceModifierData *tpimd= (ParticleInstanceModifierData*) target; - - tpimd->ob = pimd->ob; - tpimd->psys = pimd->psys; - tpimd->flag = pimd->flag; - tpimd->axis = pimd->axis; - tpimd->position = pimd->position; - tpimd->random_position = pimd->random_position; -} - -static int particleInstanceModifier_dependsOnTime(ModifierData *md) -{ - return 0; -} -static void particleInstanceModifier_updateDepgraph(ModifierData *md, DagForest *forest, - Scene *scene,Object *ob, DagNode *obNode) -{ - ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md; - - if (pimd->ob) { - DagNode *curNode = dag_get_node(forest, pimd->ob); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA | DAG_RL_OB_DATA, - "Particle Instance Modifier"); - } -} - -static void particleInstanceModifier_foreachObjectLink(ModifierData *md, Object *ob, - ObjectWalkFunc walk, void *userData) -{ - ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md; - - walk(userData, ob, &pimd->ob); -} - -static DerivedMesh * particleInstanceModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = derivedData, *result; - ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md; - ParticleSimulationData sim; - ParticleSystem * psys=0; - ParticleData *pa=0, *pars=0; - MFace *mface, *orig_mface; - MVert *mvert, *orig_mvert; - int i,totvert, totpart=0, totface, maxvert, maxface, first_particle=0; - short track=ob->trackflag%3, trackneg, axis = pimd->axis; - float max_co=0.0, min_co=0.0, temp_co[3], cross[3]; - float *size=NULL; - - trackneg=((ob->trackflag>2)?1:0); - - if(pimd->ob==ob){ - pimd->ob=0; - return derivedData; - } - - if(pimd->ob){ - psys = BLI_findlink(&pimd->ob->particlesystem,pimd->psys-1); - if(psys==0 || psys->totpart==0) - return derivedData; - } - else return derivedData; - - if(pimd->flag & eParticleInstanceFlag_Parents) - totpart+=psys->totpart; - if(pimd->flag & eParticleInstanceFlag_Children){ - if(totpart==0) - first_particle=psys->totpart; - totpart+=psys->totchild; - } - - if(totpart==0) - return derivedData; - - sim.scene = md->scene; - sim.ob = pimd->ob; - sim.psys = psys; - sim.psmd = psys_get_modifier(pimd->ob, psys); - - if(pimd->flag & eParticleInstanceFlag_UseSize) { - int p; - float *si; - si = size = MEM_callocN(totpart * sizeof(float), "particle size array"); - - if(pimd->flag & eParticleInstanceFlag_Parents) { - for(p=0, pa= psys->particles; p<psys->totpart; p++, pa++, si++) - *si = pa->size; - } - - if(pimd->flag & eParticleInstanceFlag_Children) { - ChildParticle *cpa = psys->child; - - for(p=0; p<psys->totchild; p++, cpa++, si++) { - *si = psys_get_child_size(psys, cpa, 0.0f, NULL); - } - } - } - - pars=psys->particles; - - totvert=dm->getNumVerts(dm); - totface=dm->getNumTessFaces(dm); - - maxvert=totvert*totpart; - maxface=totface*totpart; - - psys->lattice=psys_get_lattice(&sim); - - if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED){ - - float min_r[3], max_r[3]; - INIT_MINMAX(min_r, max_r); - dm->getMinMax(dm, min_r, max_r); - min_co=min_r[track]; - max_co=max_r[track]; - } - - result = CDDM_from_template(dm, maxvert,dm->getNumEdges(dm)*totpart,maxface, 0, 0); - - mvert=result->getVertArray(result); - orig_mvert=dm->getVertArray(dm); - - for(i=0; i<maxvert; i++){ - MVert *inMV; - MVert *mv = mvert + i; - ParticleKey state; - - inMV = orig_mvert + i%totvert; - DM_copy_vert_data(dm, result, i%totvert, i, 1); - *mv = *inMV; - - /*change orientation based on object trackflag*/ - VECCOPY(temp_co,mv->co); - mv->co[axis]=temp_co[track]; - mv->co[(axis+1)%3]=temp_co[(track+1)%3]; - mv->co[(axis+2)%3]=temp_co[(track+2)%3]; - - if((psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED) && pimd->flag & eParticleInstanceFlag_Path){ - float ran = 0.0f; - if(pimd->random_position != 0.0f) { - BLI_srandom(psys->seed + (i/totvert)%totpart); - ran = pimd->random_position * BLI_frand(); - } - - if(pimd->flag & eParticleInstanceFlag_KeepShape) { - state.time = pimd->position * (1.0f - ran); - } - else { - state.time=(mv->co[axis]-min_co)/(max_co-min_co) * pimd->position * (1.0f - ran); - - if(trackneg) - state.time=1.0f-state.time; - - mv->co[axis] = 0.0; - } - - psys_get_particle_on_path(&sim, first_particle + i/totvert, &state,1); - - normalize_v3(state.vel); - - /* TODO: incremental rotations somehow */ - if(state.vel[axis] < -0.9999 || state.vel[axis] > 0.9999) { - state.rot[0] = 1; - state.rot[1] = state.rot[2] = state.rot[3] = 0.0f; - } - else { - float temp[3] = {0.0f,0.0f,0.0f}; - temp[axis] = 1.0f; - - cross_v3_v3v3(cross, temp, state.vel); - - /* state.vel[axis] is the only component surviving from a dot product with the axis */ - axis_angle_to_quat(state.rot,cross,saacos(state.vel[axis])); - } - - } - else{ - state.time=-1.0; - psys_get_particle_state(&sim, first_particle + i/totvert, &state,1); - } - - mul_qt_v3(state.rot,mv->co); - if(pimd->flag & eParticleInstanceFlag_UseSize) - mul_v3_fl(mv->co, size[i/totvert]); - VECADD(mv->co,mv->co,state.co); - } - - mface=result->getTessFaceArray(result); - orig_mface=dm->getTessFaceArray(dm); - - for(i=0; i<maxface; i++){ - MFace *inMF; - MFace *mf = mface + i; - - if(pimd->flag & eParticleInstanceFlag_Parents){ - if(i/totface>=psys->totpart){ - if(psys->part->childtype==PART_CHILD_PARTICLES) - pa=psys->particles+(psys->child+i/totface-psys->totpart)->parent; - else - pa=0; - } - else - pa=pars+i/totface; - } - else{ - if(psys->part->childtype==PART_CHILD_PARTICLES) - pa=psys->particles+(psys->child+i/totface)->parent; - else - pa=0; - } - - if(pa){ - if(pa->alive==PARS_UNBORN && (pimd->flag&eParticleInstanceFlag_Unborn)==0) continue; - if(pa->alive==PARS_ALIVE && (pimd->flag&eParticleInstanceFlag_Alive)==0) continue; - if(pa->alive==PARS_DEAD && (pimd->flag&eParticleInstanceFlag_Dead)==0) continue; - } - - inMF = orig_mface + i%totface; - DM_copy_tessface_data(dm, result, i%totface, i, 1); - *mf = *inMF; - - mf->v1+=(i/totface)*totvert; - mf->v2+=(i/totface)*totvert; - mf->v3+=(i/totface)*totvert; - if(mf->v4) - mf->v4+=(i/totface)*totvert; - } - - CDDM_calc_edges(result); - CDDM_calc_normals(result); - - if(psys->lattice){ - end_latt_deform(psys->lattice); - psys->lattice= NULL; - } - - CDDM_tessfaces_to_faces(result); - if(size) - MEM_freeN(size); - - return result; -} -static DerivedMesh *particleInstanceModifier_applyModifierEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return particleInstanceModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* Explode */ -static void explodeModifier_initData(ModifierData *md) -{ - ExplodeModifierData *emd= (ExplodeModifierData*) md; - - emd->facepa=0; - emd->flag |= eExplodeFlag_Unborn+eExplodeFlag_Alive+eExplodeFlag_Dead; -} -static void explodeModifier_freeData(ModifierData *md) -{ - ExplodeModifierData *emd= (ExplodeModifierData*) md; - - if(emd->facepa) MEM_freeN(emd->facepa); -} -static void explodeModifier_copyData(ModifierData *md, ModifierData *target) -{ - ExplodeModifierData *emd= (ExplodeModifierData*) md; - ExplodeModifierData *temd= (ExplodeModifierData*) target; - - temd->facepa = 0; - temd->flag = emd->flag; - temd->protect = emd->protect; - temd->vgroup = emd->vgroup; -} -static int explodeModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} -static CustomDataMask explodeModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - ExplodeModifierData *emd= (ExplodeModifierData*) md; - CustomDataMask dataMask = 0; - - if(emd->vgroup) - dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void explodeModifier_createFacepa(ExplodeModifierData *emd, - ParticleSystemModifierData *psmd, - Object *ob, DerivedMesh *dm) -{ - ParticleSystem *psys=psmd->psys; - MFace *fa=0, *mface=0; - MVert *mvert = 0; - ParticleData *pa; - KDTree *tree; - float center[3], co[3]; - int *facepa=0,*vertpa=0,totvert=0,totface=0,totpart=0; - int i,p,v1,v2,v3,v4=0; - - mvert = dm->getVertArray(dm); - mface = dm->getTessFaceArray(dm); - totface= dm->getNumTessFaces(dm); - totvert= dm->getNumVerts(dm); - totpart= psmd->psys->totpart; - - BLI_srandom(psys->seed); - - if(emd->facepa) - MEM_freeN(emd->facepa); - - facepa = emd->facepa = MEM_callocN(sizeof(int)*totface, "explode_facepa"); - - vertpa = MEM_callocN(sizeof(int)*totvert, "explode_vertpa"); - - /* initialize all faces & verts to no particle */ - for(i=0; i<totface; i++) - facepa[i]=totpart; - - for (i=0; i<totvert; i++) - vertpa[i]=totpart; - - /* set protected verts */ - if(emd->vgroup){ - MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - float val; - if(dvert){ - for(i=0; i<totvert; i++){ - val = BLI_frand(); - val = (1.0f-emd->protect)*val + emd->protect*0.5f; - if(val < defvert_find_weight(dvert+i,emd->vgroup-1)) - vertpa[i] = -1; - } - } - } - - /* make tree of emitter locations */ - tree=BLI_kdtree_new(totpart); - for(p=0,pa=psys->particles; p<totpart; p++,pa++){ - psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,0,0); - BLI_kdtree_insert(tree, p, co, NULL); - } - BLI_kdtree_balance(tree); - - /* set face-particle-indexes to nearest particle to face center */ - for(i=0,fa=mface; i<totface; i++,fa++){ - add_v3_v3v3(center,mvert[fa->v1].co,mvert[fa->v2].co); - add_v3_v3v3(center,center,mvert[fa->v3].co); - if(fa->v4){ - add_v3_v3v3(center,center,mvert[fa->v4].co); - mul_v3_fl(center,0.25); - } - else - mul_v3_fl(center,0.3333f); - - p= BLI_kdtree_find_nearest(tree,center,NULL,NULL); - - v1=vertpa[fa->v1]; - v2=vertpa[fa->v2]; - v3=vertpa[fa->v3]; - if(fa->v4) - v4=vertpa[fa->v4]; - - if(v1>=0 && v2>=0 && v3>=0 && (fa->v4==0 || v4>=0)) - facepa[i]=p; - - if(v1>=0) vertpa[fa->v1]=p; - if(v2>=0) vertpa[fa->v2]=p; - if(v3>=0) vertpa[fa->v3]=p; - if(fa->v4 && v4>=0) vertpa[fa->v4]=p; - } - - if(vertpa) MEM_freeN(vertpa); - BLI_kdtree_free(tree); -} - -static int edgesplit_get(EdgeHash *edgehash, int v1, int v2) -{ - return GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, v1, v2)); -} - -static DerivedMesh * explodeModifier_splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){ - DerivedMesh *splitdm; - MFace *mf=0,*df1=0,*df2=0,*df3=0; - MFace *mface=CDDM_get_tessfaces(dm); - MVert *dupve, *mv; - EdgeHash *edgehash; - EdgeHashIterator *ehi; - int totvert=dm->getNumVerts(dm); - int totface=dm->getNumTessFaces(dm); - - int *facesplit = MEM_callocN(sizeof(int)*totface,"explode_facesplit"); - int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2"); - int *facepa = emd->facepa; - int *fs, totesplit=0,totfsplit=0,totin=0,curdupvert=0,curdupface=0,curdupin=0; - int i,j,v1,v2,v3,v4,esplit; - - edgehash= BLI_edgehash_new(); - - /* recreate vertpa from facepa calculation */ - for (i=0,mf=mface; i<totface; i++,mf++) { - vertpa[mf->v1]=facepa[i]; - vertpa[mf->v2]=facepa[i]; - vertpa[mf->v3]=facepa[i]; - if(mf->v4) - vertpa[mf->v4]=facepa[i]; - } - - /* mark edges for splitting and how to split faces */ - for (i=0,mf=mface,fs=facesplit; i<totface; i++,mf++,fs++) { - if(mf->v4){ - v1=vertpa[mf->v1]; - v2=vertpa[mf->v2]; - v3=vertpa[mf->v3]; - v4=vertpa[mf->v4]; - - if(v1!=v2){ - BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL); - (*fs)++; - } - - if(v2!=v3){ - BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL); - (*fs)++; - } - - if(v3!=v4){ - BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL); - (*fs)++; - } - - if(v1!=v4){ - BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL); - (*fs)++; - } - - if(*fs==2){ - if((v1==v2 && v3==v4) || (v1==v4 && v2==v3)) - *fs=1; - else if(v1!=v2){ - if(v1!=v4) - BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL); - else - BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL); - } - else{ - if(v1!=v4) - BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL); - else - BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL); - } - } - } - } - - /* count splits & reindex */ - ehi= BLI_edgehashIterator_new(edgehash); - totesplit=totvert; - for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totesplit)); - totesplit++; - } - BLI_edgehashIterator_free(ehi); - - /* count new faces due to splitting */ - for(i=0,fs=facesplit; i<totface; i++,fs++){ - if(*fs==1) - totfsplit+=1; - else if(*fs==2) - totfsplit+=2; - else if(*fs==3) - totfsplit+=3; - else if(*fs==4){ - totfsplit+=3; - - mf=dm->getTessFaceData(dm,i,CD_MFACE);//CDDM_get_tessface(dm,i); - - if(vertpa[mf->v1]!=vertpa[mf->v2] && vertpa[mf->v2]!=vertpa[mf->v3]) - totin++; - } - } - - splitdm= CDDM_from_template(dm, totesplit+totin, dm->getNumEdges(dm),totface+totfsplit, 0, 0); - - /* copy new faces & verts (is it really this painful with custom data??) */ - for(i=0; i<totvert; i++){ - MVert source; - MVert *dest; - dm->getVert(dm, i, &source); - dest = CDDM_get_vert(splitdm, i); - - DM_copy_vert_data(dm, splitdm, i, i, 1); - *dest = source; - } - for(i=0; i<totface; i++){ - MFace source; - MFace *dest; - dm->getTessFace(dm, i, &source); - dest = CDDM_get_tessface(splitdm, i); - - DM_copy_tessface_data(dm, splitdm, i, i, 1); - *dest = source; - } - - /* override original facepa (original pointer is saved in caller function) */ - facepa= MEM_callocN(sizeof(int)*(totface+totfsplit),"explode_facepa"); - memcpy(facepa,emd->facepa,totface*sizeof(int)); - emd->facepa=facepa; - - /* create new verts */ - curdupvert=totvert; - ehi= BLI_edgehashIterator_new(edgehash); - for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - BLI_edgehashIterator_getKey(ehi, &i, &j); - esplit= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); - mv=CDDM_get_vert(splitdm,j); - dupve=CDDM_get_vert(splitdm,esplit); - - DM_copy_vert_data(splitdm,splitdm,j,esplit,1); - - *dupve=*mv; - - mv=CDDM_get_vert(splitdm,i); - - VECADD(dupve->co,dupve->co,mv->co); - mul_v3_fl(dupve->co,0.5); - } - BLI_edgehashIterator_free(ehi); - - /* create new faces */ - curdupface=totface; - curdupin=totesplit; - for(i=0,fs=facesplit; i<totface; i++,fs++){ - if(*fs){ - mf=CDDM_get_tessface(splitdm,i); - - v1=vertpa[mf->v1]; - v2=vertpa[mf->v2]; - v3=vertpa[mf->v3]; - v4=vertpa[mf->v4]; - /* ouch! creating new faces & remapping them to new verts is no fun */ - if(*fs==1){ - df1=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df1=*mf; - curdupface++; - - if(v1==v2){ - df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); - df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); - mf->v3=df1->v2; - mf->v4=df1->v1; - } - else{ - df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); - df1->v4=edgesplit_get(edgehash, mf->v3, mf->v4); - mf->v2=df1->v1; - mf->v3=df1->v4; - } - - facepa[i]=v1; - facepa[curdupface-1]=v3; - - test_index_face(df1, &splitdm->faceData, curdupface, (df1->v4 ? 4 : 3)); - } - if(*fs==2){ - df1=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df1=*mf; - curdupface++; - - df2=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df2=*mf; - curdupface++; - - if(v1!=v2){ - if(v1!=v4){ - df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); - df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); - df2->v1=df1->v3=mf->v2; - df2->v3=df1->v4=mf->v4; - df2->v2=mf->v3; - - mf->v2=df1->v2; - mf->v3=df1->v1; - - df2->v4=mf->v4=0; - - facepa[i]=v1; - } - else{ - df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); - df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); - df1->v4=mf->v3; - df2->v2=mf->v3; - df2->v3=mf->v4; - - mf->v1=df1->v2; - mf->v3=df1->v3; - - df2->v4=mf->v4=0; - - facepa[i]=v2; - } - facepa[curdupface-1]=facepa[curdupface-2]=v3; - } - else{ - if(v1!=v4){ - df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4); - df1->v2=mf->v3; - - mf->v1=df1->v4; - mf->v2=df1->v3; - mf->v3=mf->v4; - - df2->v4=mf->v4=0; - - facepa[i]=v4; - } - else{ - df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); - df1->v4=edgesplit_get(edgehash, mf->v3, mf->v4); - df1->v1=mf->v4; - df1->v2=mf->v2; - df2->v3=mf->v4; - - mf->v1=df1->v4; - mf->v2=df1->v3; - - df2->v4=mf->v4=0; - - facepa[i]=v3; - } - - facepa[curdupface-1]=facepa[curdupface-2]=v1; - } - - test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); - test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); - } - else if(*fs==3){ - df1=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df1=*mf; - curdupface++; - - df2=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df2=*mf; - curdupface++; - - df3=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df3=*mf; - curdupface++; - - if(v1==v2){ - df2->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); - df3->v1=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); - df3->v3=df2->v2=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - df3->v2=mf->v3; - df2->v3=mf->v4; - df1->v4=df2->v4=df3->v4=0; - - mf->v3=df1->v2; - mf->v4=df1->v1; - - facepa[i]=facepa[curdupface-3]=v1; - facepa[curdupface-1]=v3; - facepa[curdupface-2]=v4; - } - else if(v2==v3){ - df3->v1=df2->v3=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); - df2->v2=df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); - df3->v2=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - - df3->v3=mf->v4; - df2->v1=mf->v1; - df1->v4=df2->v4=df3->v4=0; - - mf->v1=df1->v2; - mf->v4=df1->v3; - - facepa[i]=facepa[curdupface-3]=v2; - facepa[curdupface-1]=v4; - facepa[curdupface-2]=v1; - } - else if(v3==v4){ - df3->v2=df2->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); - df2->v3=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); - df3->v3=df1->v3=edgesplit_get(edgehash, mf->v1, mf->v4); - - df3->v1=mf->v1; - df2->v2=mf->v2; - df1->v4=df2->v4=df3->v4=0; - - mf->v1=df1->v3; - mf->v2=df1->v2; - - facepa[i]=facepa[curdupface-3]=v3; - facepa[curdupface-1]=v1; - facepa[curdupface-2]=v2; - } - else{ - df3->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); - df3->v3=df2->v1=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); - df2->v3=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - - df3->v2=mf->v2; - df2->v2=mf->v3; - df1->v4=df2->v4=df3->v4=0; - - mf->v2=df1->v1; - mf->v3=df1->v3; - - facepa[i]=facepa[curdupface-3]=v1; - facepa[curdupface-1]=v2; - facepa[curdupface-2]=v3; - } - - test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3)); - test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); - test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); - } - else if(*fs==4){ - if(v1!=v2 && v2!=v3){ - - /* set new vert to face center */ - mv=CDDM_get_vert(splitdm,mf->v1); - dupve=CDDM_get_vert(splitdm,curdupin); - DM_copy_vert_data(splitdm,splitdm,mf->v1,curdupin,1); - *dupve=*mv; - - mv=CDDM_get_vert(splitdm,mf->v2); - VECADD(dupve->co,dupve->co,mv->co); - mv=CDDM_get_vert(splitdm,mf->v3); - VECADD(dupve->co,dupve->co,mv->co); - mv=CDDM_get_vert(splitdm,mf->v4); - VECADD(dupve->co,dupve->co,mv->co); - mul_v3_fl(dupve->co,0.25); - - - df1=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df1=*mf; - curdupface++; - - df2=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df2=*mf; - curdupface++; - - df3=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df3=*mf; - curdupface++; - - df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); - df3->v2=df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); - - df2->v1=edgesplit_get(edgehash, mf->v1, mf->v4); - df3->v4=df2->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - - df3->v1=df2->v2=df1->v4=curdupin; - - mf->v2=df1->v1; - mf->v3=curdupin; - mf->v4=df2->v1; - - curdupin++; - - facepa[i]=v1; - facepa[curdupface-3]=v2; - facepa[curdupface-2]=v3; - facepa[curdupface-1]=v4; - - test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3)); - - test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); - test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); - } - else{ - df1=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df1=*mf; - curdupface++; - - df2=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df2=*mf; - curdupface++; - - df3=CDDM_get_tessface(splitdm,curdupface); - DM_copy_tessface_data(splitdm,splitdm,i,curdupface,1); - *df3=*mf; - curdupface++; - - if(v2==v3){ - df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); - df3->v1=df1->v2=df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); - df2->v1=df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4); - - df3->v3=df2->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - - df3->v2=mf->v3; - df3->v4=0; - - mf->v2=df1->v1; - mf->v3=df1->v4; - mf->v4=0; - - facepa[i]=v1; - facepa[curdupface-3]=facepa[curdupface-2]=v2; - facepa[curdupface-1]=v3; - } - else{ - df3->v1=df2->v1=df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); - df2->v4=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); - df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4); - - df3->v3=df2->v2=edgesplit_get(edgehash, mf->v2, mf->v3); - - df3->v4=0; - - mf->v1=df1->v4; - mf->v2=df1->v3; - mf->v3=mf->v4; - mf->v4=0; - - facepa[i]=v4; - facepa[curdupface-3]=facepa[curdupface-2]=v1; - facepa[curdupface-1]=v2; - } - - test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3)); - test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); - test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); - } - } - - test_index_face(df1, &splitdm->faceData, i, (df1->v4 ? 4 : 3)); - } - } - - BLI_edgehash_free(edgehash, NULL); - MEM_freeN(facesplit); - MEM_freeN(vertpa); - - CDDM_tessfaces_to_faces(splitdm); - return splitdm; - -} -static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, - ParticleSystemModifierData *psmd, Scene *scene, Object *ob, - DerivedMesh *to_explode) -{ - DerivedMesh *explode, *dm=to_explode; - MFace *mf=0, *mface; - ParticleSettings *part=psmd->psys->part; - ParticleSimulationData sim = {scene, ob, psmd->psys, psmd}; - ParticleData *pa=NULL, *pars=psmd->psys->particles; - ParticleKey state; - EdgeHash *vertpahash; - EdgeHashIterator *ehi; - float *vertco=0, imat[4][4]; - float loc0[3], nor[3]; - float timestep, cfra; - int *facepa=emd->facepa; - int totdup=0,totvert=0,totface=0,totpart=0; - int i, j, v, mindex=0; - - totface= dm->getNumTessFaces(dm); - totvert= dm->getNumVerts(dm); - mface= dm->getTessFaceArray(dm); - totpart= psmd->psys->totpart; - - timestep= psys_get_timestep(&sim); - - //if(part->flag & PART_GLOB_TIME) - cfra=bsystem_time(scene, 0,(float)scene->r.cfra,0.0); - //else - // cfra=bsystem_time(scene, ob,(float)scene->r.cfra,0.0); - - /* hash table for vertice <-> particle relations */ - vertpahash= BLI_edgehash_new(); - - for (i=0; i<totface; i++) { - /* do mindex + totvert to ensure the vertex index to be the first - * with BLI_edgehashIterator_getKey */ - if(facepa[i]==totpart || cfra <= (pars+facepa[i])->time) - mindex = totvert+totpart; - else - mindex = totvert+facepa[i]; - - mf=CDDM_get_tessface(dm,i); - - /* set face vertices to exist in particle group */ - BLI_edgehash_insert(vertpahash, mf->v1, mindex, NULL); - BLI_edgehash_insert(vertpahash, mf->v2, mindex, NULL); - BLI_edgehash_insert(vertpahash, mf->v3, mindex, NULL); - if(mf->v4) - BLI_edgehash_insert(vertpahash, mf->v4, mindex, NULL); - } - - /* make new vertice indexes & count total vertices after duplication */ - ehi= BLI_edgehashIterator_new(vertpahash); - for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totdup)); - totdup++; - } - BLI_edgehashIterator_free(ehi); - - /* the final duplicated vertices */ - explode= CDDM_from_template(dm, totdup, 0,totface, 0, 0); - /*dupvert= CDDM_get_verts(explode);*/ - - /* getting back to object space */ - invert_m4_m4(imat,ob->obmat); - - psmd->psys->lattice = psys_get_lattice(&sim); - - /* duplicate & displace vertices */ - ehi= BLI_edgehashIterator_new(vertpahash); - for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - MVert source; - MVert *dest; - - /* get particle + vertex from hash */ - BLI_edgehashIterator_getKey(ehi, &j, &i); - i -= totvert; - v= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); - - dm->getVert(dm, j, &source); - dest = CDDM_get_vert(explode,v); - - DM_copy_vert_data(dm,explode,j,v,1); - *dest = source; - - if(i!=totpart) { - /* get particle */ - pa= pars+i; - - /* get particle state */ - psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc0,nor,0,0,0,0); - mul_m4_v3(ob->obmat,loc0); - - state.time=cfra; - psys_get_particle_state(&sim, i, &state, 1); - - vertco=CDDM_get_vert(explode,v)->co; - - mul_m4_v3(ob->obmat,vertco); - - VECSUB(vertco,vertco,loc0); - - /* apply rotation, size & location */ - mul_qt_v3(state.rot,vertco); - mul_v3_fl(vertco,pa->size); - VECADD(vertco,vertco,state.co); - - mul_m4_v3(imat,vertco); - } - } - BLI_edgehashIterator_free(ehi); - - /*map new vertices to faces*/ - for (i=0; i<totface; i++) { - MFace source; - int orig_v4; - - if(facepa[i]!=totpart) - { - pa=pars+facepa[i]; - - if(pa->alive==PARS_UNBORN && (emd->flag&eExplodeFlag_Unborn)==0) continue; - if(pa->alive==PARS_ALIVE && (emd->flag&eExplodeFlag_Alive)==0) continue; - if(pa->alive==PARS_DEAD && (emd->flag&eExplodeFlag_Dead)==0) continue; - } - - dm->getTessFace(dm,i,&source); - mf=CDDM_get_tessface(explode,i); - - orig_v4 = source.v4; - - if(facepa[i]!=totpart && cfra <= pa->time) - mindex = totvert+totpart; - else - mindex = totvert+facepa[i]; - - source.v1 = edgesplit_get(vertpahash, source.v1, mindex); - source.v2 = edgesplit_get(vertpahash, source.v2, mindex); - source.v3 = edgesplit_get(vertpahash, source.v3, mindex); - if(source.v4) - source.v4 = edgesplit_get(vertpahash, source.v4, mindex); - - DM_copy_tessface_data(dm,explode,i,i,1); - - *mf = source; - - test_index_face(mf, &explode->faceData, i, (orig_v4 ? 4 : 3)); - } - - /* cleanup */ - BLI_edgehash_free(vertpahash, NULL); - - /* finalization */ - CDDM_calc_edges(explode); - CDDM_calc_normals(explode); - - if(psmd->psys->lattice){ - end_latt_deform(psmd->psys->lattice); - psmd->psys->lattice= NULL; - } - - CDDM_tessfaces_to_faces(explode); - return explode; -} - -static ParticleSystemModifierData * explodeModifier_findPrecedingParticlesystem(Object *ob, ModifierData *emd) -{ - ModifierData *md; - ParticleSystemModifierData *psmd=0; - - for (md=ob->modifiers.first; emd!=md; md=md->next){ - if(md->type==eModifierType_ParticleSystem) - psmd= (ParticleSystemModifierData*) md; - } - return psmd; -} -static DerivedMesh * explodeModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = derivedData; - ExplodeModifierData *emd= (ExplodeModifierData*) md; - ParticleSystemModifierData *psmd=explodeModifier_findPrecedingParticlesystem(ob,md); - - if(psmd){ - ParticleSystem * psys=psmd->psys; - - if(psys==0 || psys->totpart==0) return derivedData; - if(psys->part==0 || psys->particles==0) return derivedData; - if(psmd->dm==0) return derivedData; - - /* 1. find faces to be exploded if needed */ - if(emd->facepa==0 - || psmd->flag&eParticleSystemFlag_Pars - || emd->flag&eExplodeFlag_CalcFaces - || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumTessFaces(dm)){ - if(psmd->flag & eParticleSystemFlag_Pars) - psmd->flag &= ~eParticleSystemFlag_Pars; - - if(emd->flag & eExplodeFlag_CalcFaces) - emd->flag &= ~eExplodeFlag_CalcFaces; - - explodeModifier_createFacepa(emd,psmd,ob,derivedData); - } - - /* 2. create new mesh */ - if(emd->flag & eExplodeFlag_EdgeSplit){ - int *facepa = emd->facepa; - DerivedMesh *splitdm=explodeModifier_splitEdges(emd,dm); - DerivedMesh *explode=explodeModifier_explodeMesh(emd, psmd, md->scene, ob, splitdm); - - MEM_freeN(emd->facepa); - emd->facepa=facepa; - splitdm->release(splitdm); - return explode; - } - else - return explodeModifier_explodeMesh(emd, psmd, md->scene, ob, derivedData); - } - return derivedData; -} - -/* Fluidsim */ -static void fluidsimModifier_initData(ModifierData *md) -{ - FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; - - fluidsim_init(fluidmd); -} -static void fluidsimModifier_freeData(ModifierData *md) -{ - FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; - - fluidsim_free(fluidmd); -} - -static void fluidsimModifier_copyData(ModifierData *md, ModifierData *target) -{ - FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; - FluidsimModifierData *tfluidmd= (FluidsimModifierData*) target; - - if(tfluidmd->fss) - MEM_freeN(tfluidmd->fss); - - tfluidmd->fss = MEM_dupallocN(fluidmd->fss); -} - -static DerivedMesh * fluidsimModifier_applyModifier( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; - DerivedMesh *result = NULL; - - /* check for alloc failing */ - if(!fluidmd->fss) - { - fluidsimModifier_initData(md); - - if(!fluidmd->fss) - return derivedData; - } - - result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc); - - if(result) - { - return result; - } - - return derivedData; -} - -static void fluidsimModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, - Object *ob, DagNode *obNode) -{ - FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; - Base *base; - - if(fluidmd && fluidmd->fss) - { - if(fluidmd->fss->type == OB_FLUIDSIM_DOMAIN) - { - for(base = scene->base.first; base; base= base->next) - { - Object *ob1= base->object; - if(ob1 != ob) - { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob1, eModifierType_Fluidsim); - - // only put dependancies from NON-DOMAIN fluids in here - if(fluidmdtmp && fluidmdtmp->fss && (fluidmdtmp->fss->type!=OB_FLUIDSIM_DOMAIN)) - { - DagNode *curNode = dag_get_node(forest, ob1); - dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Fluidsim Object"); - } - } - } - } - } -} - -static int fluidsimModifier_dependsOnTime(ModifierData *md) -{ - return 1; -} - -/* MeshDeform */ - -static void meshdeformModifier_initData(ModifierData *md) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - - mmd->gridsize= 5; -} - -static void meshdeformModifier_freeData(ModifierData *md) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - - if(mmd->bindweights) MEM_freeN(mmd->bindweights); - if(mmd->bindcos) MEM_freeN(mmd->bindcos); - if(mmd->dyngrid) MEM_freeN(mmd->dyngrid); - if(mmd->dyninfluences) MEM_freeN(mmd->dyninfluences); - if(mmd->dynverts) MEM_freeN(mmd->dynverts); -} - -static void meshdeformModifier_copyData(ModifierData *md, ModifierData *target) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - MeshDeformModifierData *tmmd = (MeshDeformModifierData*) target; - - tmmd->gridsize = mmd->gridsize; - tmmd->object = mmd->object; -} - -static CustomDataMask meshdeformModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(mmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static int meshdeformModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - - return !mmd->object; -} - -static void meshdeformModifier_foreachObjectLink( - ModifierData *md, Object *ob, - void (*walk)(void *userData, Object *ob, Object **obpoin), - void *userData) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - - walk(userData, ob, &mmd->object); -} - -static void meshdeformModifier_updateDepgraph( - ModifierData *md, DagForest *forest, Scene *scene, Object *ob, - DagNode *obNode) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - - if (mmd->object) { - DagNode *curNode = dag_get_node(forest, mmd->object); - - dag_add_relation(forest, curNode, obNode, - DAG_RL_DATA_DATA|DAG_RL_OB_DATA|DAG_RL_DATA_OB|DAG_RL_OB_OB, - "Mesh Deform Modifier"); - } -} - -static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3], float *vec) -{ - MDefCell *cell; - MDefInfluence *inf; - float gridvec[3], dvec[3], ivec[3], co[3], wx, wy, wz; - float weight, cageweight, totweight, *cageco; - int i, j, a, x, y, z, size; - - co[0]= co[1]= co[2]= 0.0f; - totweight= 0.0f; - size= mmd->dyngridsize; - - for(i=0; i<3; i++) { - gridvec[i]= (vec[i] - mmd->dyncellmin[i] - mmd->dyncellwidth*0.5f)/mmd->dyncellwidth; - ivec[i]= (int)gridvec[i]; - dvec[i]= gridvec[i] - ivec[i]; - } - - for(i=0; i<8; i++) { - if(i & 1) { x= ivec[0]+1; wx= dvec[0]; } - else { x= ivec[0]; wx= 1.0f-dvec[0]; } - - if(i & 2) { y= ivec[1]+1; wy= dvec[1]; } - else { y= ivec[1]; wy= 1.0f-dvec[1]; } - - if(i & 4) { z= ivec[2]+1; wz= dvec[2]; } - else { z= ivec[2]; wz= 1.0f-dvec[2]; } - - CLAMP(x, 0, size-1); - CLAMP(y, 0, size-1); - CLAMP(z, 0, size-1); - - a= x + y*size + z*size*size; - weight= wx*wy*wz; - - cell= &mmd->dyngrid[a]; - inf= mmd->dyninfluences + cell->offset; - for(j=0; j<cell->totinfluence; j++, inf++) { - cageco= dco[inf->vertex]; - cageweight= weight*inf->weight; - co[0] += cageweight*cageco[0]; - co[1] += cageweight*cageco[1]; - co[2] += cageweight*cageco[2]; - totweight += cageweight; - } - } - - VECCOPY(vec, co); - - return totweight; -} - -static void meshdeformModifier_do( - ModifierData *md, Object *ob, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - Mesh *me= (mmd->object)? mmd->object->data: NULL; - BMEditMesh *bem = me->edit_btmesh; - DerivedMesh *tmpdm, *cagedm; - MDeformVert *dvert = NULL; - MDeformWeight *dw; - MVert *cagemvert; - float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4]; - float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3]; - int a, b, totvert, totcagevert, defgrp_index; - - if(!mmd->object || (!mmd->bindcos && !mmd->bindfunc)) - return; - - /* get cage derivedmesh */ - if(bem) { - tmpdm= editbmesh_get_derived_cage_and_final(md->scene, ob, bem, &cagedm, 0); - if(tmpdm) - tmpdm->release(tmpdm); - } - else - cagedm= mmd->object->derivedFinal; - - /* if we don't have one computed, use derivedmesh from data - * without any modifiers */ - if(!cagedm) { - cagedm= get_dm(md->scene, mmd->object, NULL, NULL, NULL, 0); - if(cagedm) - cagedm->needsFree= 1; - } - - if(!cagedm) - return; - - /* compute matrices to go in and out of cage object space */ - invert_m4_m4(imat, mmd->object->obmat); - mul_m4_m4m4(cagemat, ob->obmat, imat); - mul_m4_m4m4(cmat, cagemat, mmd->bindmat); - invert_m4_m4(iobmat, cmat); - copy_m3_m4(icagemat, iobmat); - - /* bind weights if needed */ - if(!mmd->bindcos) { - static int recursive = 0; - - /* progress bar redraw can make this recursive .. */ - if(!recursive) { - recursive = 1; - mmd->bindfunc(md->scene, dm, mmd, (float*)vertexCos, numVerts, cagemat); - recursive = 0; - } - } - - /* verify we have compatible weights */ - totvert= numVerts; - totcagevert= cagedm->getNumVerts(cagedm); - - if(mmd->totvert!=totvert || mmd->totcagevert!=totcagevert || !mmd->bindcos) { - cagedm->release(cagedm); - return; - } - - /* setup deformation data */ - cagemvert= cagedm->getVertArray(cagedm); - weights= mmd->bindweights; - bindcos= (float(*)[3])mmd->bindcos; - - dco= MEM_callocN(sizeof(*dco)*totcagevert, "MDefDco"); - for(a=0; a<totcagevert; a++) { - /* get cage vertex in world space with binding transform */ - VECCOPY(co, cagemvert[a].co); - - if(G.rt != 527) { - mul_m4_v3(mmd->bindmat, co); - /* compute difference with world space bind coord */ - VECSUB(dco[a], co, bindcos[a]); - } - else - VECCOPY(dco[a], co) - } - - defgrp_index = defgroup_name_index(ob, mmd->defgrp_name); - - if (defgrp_index >= 0) - dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT); - - /* do deformation */ - fac= 1.0f; - - for(b=0; b<totvert; b++) { - if(mmd->flag & MOD_MDEF_DYNAMIC_BIND) - if(!mmd->dynverts[b]) - continue; - - if(dvert) { - for(dw=NULL, a=0; a<dvert[b].totweight; a++) { - if(dvert[b].dw[a].def_nr == defgrp_index) { - dw = &dvert[b].dw[a]; - break; - } - } - - if(mmd->flag & MOD_MDEF_INVERT_VGROUP) { - if(!dw) fac= 1.0f; - else if(dw->weight == 1.0f) continue; - else fac=1.0f-dw->weight; - } - else { - if(!dw) continue; - else fac= dw->weight; - } - } - - if(mmd->flag & MOD_MDEF_DYNAMIC_BIND) { - /* transform coordinate into cage's local space */ - VECCOPY(co, vertexCos[b]); - mul_m4_v3(cagemat, co); - totweight= meshdeform_dynamic_bind(mmd, dco, co); - } - else { - totweight= 0.0f; - co[0]= co[1]= co[2]= 0.0f; - - for(a=0; a<totcagevert; a++) { - weight= weights[a + b*totcagevert]; - co[0]+= weight*dco[a][0]; - co[1]+= weight*dco[a][1]; - co[2]+= weight*dco[a][2]; - totweight += weight; - } - } - - if(totweight > 0.0f) { - mul_v3_fl(co, fac/totweight); - mul_m3_v3(icagemat, co); - if(G.rt != 527) - VECADD(vertexCos[b], vertexCos[b], co) - else - VECCOPY(vertexCos[b], co) - } - } - - /* release cage derivedmesh */ - MEM_freeN(dco); - cagedm->release(cagedm); -} - -static void meshdeformModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);; - - if(!dm) - return; - - modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ - - meshdeformModifier_do(md, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void meshdeformModifier_deformVertsEM( - ModifierData *md, Object *ob, BMEditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm; - - if(!derivedData && ob->type == OB_MESH) - dm = CDDM_from_BMEditMesh(editData, ob->data); - else - dm = derivedData; - - meshdeformModifier_do(md, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -/* Multires */ -static void multiresModifier_initData(ModifierData *md) -{ - MultiresModifierData *mmd = (MultiresModifierData*)md; - - mmd->lvl = 0; - mmd->sculptlvl = 0; - mmd->renderlvl = 0; - mmd->totlvl = 0; -} - -static void multiresModifier_copyData(ModifierData *md, ModifierData *target) -{ - MultiresModifierData *mmd = (MultiresModifierData*) md; - MultiresModifierData *tmmd = (MultiresModifierData*) target; - - tmmd->lvl = mmd->lvl; - tmmd->sculptlvl = mmd->sculptlvl; - tmmd->renderlvl = mmd->renderlvl; - tmmd->totlvl = mmd->totlvl; -} - -static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, - int useRenderParams, int isFinalCalc) -{ - MultiresModifierData *mmd = (MultiresModifierData*)md; - DerivedMesh *result; - - result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc); - - if(result == dm) - return dm; - - if(useRenderParams || !isFinalCalc) { - DerivedMesh *cddm= CDDM_copy(result, 0); - result->release(result); - result= cddm; - } - else if(ob->mode & OB_MODE_SCULPT) { - /* would be created on the fly too, just nicer this - way on first stroke after e.g. switching levels */ - result->getPBVH(ob, result); - } - - return result; -} - -/* Shrinkwrap */ - -static void shrinkwrapModifier_initData(ModifierData *md) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; - smd->shrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE; - smd->shrinkOpts = MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR; - smd->keepDist = 0.0f; - - smd->target = NULL; - smd->auxTarget = NULL; -} - -static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*)md; - ShrinkwrapModifierData *tsmd = (ShrinkwrapModifierData*)target; - - tsmd->target = smd->target; - tsmd->auxTarget = smd->auxTarget; - - strcpy(tsmd->vgroup_name, smd->vgroup_name); - - tsmd->keepDist = smd->keepDist; - tsmd->shrinkType= smd->shrinkType; - tsmd->shrinkOpts= smd->shrinkOpts; - tsmd->projAxis = smd->projAxis; - tsmd->subsurfLevels = smd->subsurfLevels; -} - -static CustomDataMask shrinkwrapModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(smd->vgroup_name[0]) - dataMask |= (1 << CD_MDEFORMVERT); - - if(smd->shrinkType == MOD_SHRINKWRAP_PROJECT - && smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL) - dataMask |= (1 << CD_MVERT); - - return dataMask; -} - -static int shrinkwrapModifier_isDisabled(ModifierData *md, int useRenderParams) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; - return !smd->target; -} - - -static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; - - walk(userData, ob, &smd->target); - walk(userData, ob, &smd->auxTarget); -} - -static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(ob, md); - - /* ensure we get a CDDM with applied vertex coords */ - if(dataMask) - dm= get_cddm(md->scene, ob, NULL, dm, vertexCos); - - shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(ob, md); - - /* ensure we get a CDDM with applied vertex coords */ - if(dataMask) - dm= get_cddm(md->scene, ob, editData, dm, vertexCos); - - shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) -{ - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; - - if (smd->target) - dag_add_relation(forest, dag_get_node(forest, smd->target), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier"); - - if (smd->auxTarget) - dag_add_relation(forest, dag_get_node(forest, smd->auxTarget), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier"); -} - -/* SimpleDeform */ -static void simpledeformModifier_initData(ModifierData *md) -{ - SimpleDeformModifierData *smd = (SimpleDeformModifierData*) md; - - smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; - smd->axis = 0; - - smd->origin = NULL; - smd->factor = 0.35f; - smd->limit[0] = 0.0f; - smd->limit[1] = 1.0f; -} - -static void simpledeformModifier_copyData(ModifierData *md, ModifierData *target) -{ - SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; - SimpleDeformModifierData *tsmd = (SimpleDeformModifierData*)target; - - tsmd->mode = smd->mode; - tsmd->axis = smd->axis; - tsmd->origin= smd->origin; - tsmd->factor= smd->factor; - memcpy(tsmd->limit, smd->limit, sizeof(tsmd->limit)); -} - -static CustomDataMask simpledeformModifier_requiredDataMask(Object *ob, ModifierData *md) -{ - SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; - CustomDataMask dataMask = 0; - - /* ask for vertexgroups if we need them */ - if(smd->vgroup_name[0]) - dataMask |= (1 << CD_MDEFORMVERT); - - return dataMask; -} - -static void simpledeformModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData) -{ - SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; - walk(userData, ob, &smd->origin); -} - -static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode) -{ - SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; - - if (smd->origin) - dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier"); -} - -static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = simpledeformModifier_requiredDataMask(ob, md); - - /* we implement requiredDataMask but thats not really usefull since - mesh_calc_modifiers pass a NULL derivedData */ - if(dataMask) - dm= get_dm(md->scene, ob, NULL, dm, NULL, 0); - - SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -static void simpledeformModifier_deformVertsEM(ModifierData *md, Object *ob, BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - DerivedMesh *dm = derivedData; - CustomDataMask dataMask = simpledeformModifier_requiredDataMask(ob, md); - - /* we implement requiredDataMask but thats not really usefull since - mesh_calc_modifiers pass a NULL derivedData */ - if(dataMask) - dm= get_dm(md->scene, ob, editData, dm, NULL, 0); - - SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts); - - if(dm != derivedData) - dm->release(dm); -} - -/* Shape Key */ - -static void shapekeyModifier_deformVerts( - ModifierData *md, Object *ob, DerivedMesh *derivedData, - float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) -{ - KeyBlock *kb= ob_get_keyblock(ob); - float (*deformedVerts)[3]; - - if(kb && kb->totelem == numVerts) { - deformedVerts= (float(*)[3])do_ob_key(md->scene, ob); - if(deformedVerts) { - memcpy(vertexCos, deformedVerts, sizeof(float)*3*numVerts); - MEM_freeN(deformedVerts); - } - } -} - -static void shapekeyModifier_deformVertsEM( - ModifierData *md, Object *ob, EditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) -{ - Key *key= ob_get_key(ob); - - if(key && key->type == KEY_RELATIVE) - shapekeyModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0); -} - -static void shapekeyModifier_deformMatricesEM( - ModifierData *md, Object *ob, EditMesh *editData, - DerivedMesh *derivedData, float (*vertexCos)[3], - float (*defMats)[3][3], int numVerts) -{ - Key *key= ob_get_key(ob); - KeyBlock *kb= ob_get_keyblock(ob); - float scale[3][3]; - int a; - - if(kb && kb->totelem==numVerts && kb!=key->refkey) { - scale_m3_fl(scale, kb->curval); - - for(a=0; a<numVerts; a++) - copy_m3_m3(defMats[a], scale); - } -} - -/***/ - -static ModifierTypeInfo typeArr[NUM_MODIFIER_TYPES]; -static int typeArrInit = 1; +#include "MOD_modifiertypes.h" ModifierTypeInfo *modifierType_getInfo(ModifierType type) { - if (typeArrInit) { - ModifierTypeInfo *mti; + static ModifierTypeInfo *types[NUM_MODIFIER_TYPES]; + static int types_init = 1; - memset(typeArr, 0, sizeof(typeArr)); - - /* Initialize and return the appropriate type info structure, - * assumes that modifier has: - * name == typeName, - * structName == typeName + 'ModifierData' - */ -#define INIT_TYPE(typeName) \ - (strcpy(typeArr[eModifierType_##typeName].name, #typeName), \ - strcpy(typeArr[eModifierType_##typeName].structName, \ -#typeName "ModifierData"), \ - typeArr[eModifierType_##typeName].structSize = \ - sizeof(typeName##ModifierData), \ - &typeArr[eModifierType_##typeName]) - - mti = &typeArr[eModifierType_None]; - strcpy(mti->name, "None"); - strcpy(mti->structName, "ModifierData"); - mti->structSize = sizeof(ModifierData); - mti->type = eModifierType_None; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_AcceptsCVs; - mti->isDisabled = noneModifier_isDisabled; - - mti = INIT_TYPE(Curve); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->initData = curveModifier_initData; - mti->copyData = curveModifier_copyData; - mti->requiredDataMask = curveModifier_requiredDataMask; - mti->isDisabled = curveModifier_isDisabled; - mti->foreachObjectLink = curveModifier_foreachObjectLink; - mti->updateDepgraph = curveModifier_updateDepgraph; - mti->deformVerts = curveModifier_deformVerts; - mti->deformVertsEM = curveModifier_deformVertsEM; - - mti = INIT_TYPE(Lattice); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->copyData = latticeModifier_copyData; - mti->requiredDataMask = latticeModifier_requiredDataMask; - mti->isDisabled = latticeModifier_isDisabled; - mti->foreachObjectLink = latticeModifier_foreachObjectLink; - mti->updateDepgraph = latticeModifier_updateDepgraph; - mti->deformVerts = latticeModifier_deformVerts; - mti->deformVertsEM = latticeModifier_deformVertsEM; - - mti = INIT_TYPE(Subsurf); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = subsurfModifier_initData; - mti->copyData = subsurfModifier_copyData; - mti->freeData = subsurfModifier_freeData; - mti->isDisabled = subsurfModifier_isDisabled; - mti->applyModifier = subsurfModifier_applyModifier; - mti->applyModifierEM = subsurfModifier_applyModifierEM; - - mti = INIT_TYPE(Build); - mti->type = eModifierTypeType_Nonconstructive; - mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->initData = buildModifier_initData; - mti->copyData = buildModifier_copyData; - mti->dependsOnTime = buildModifier_dependsOnTime; - mti->applyModifier = buildModifier_applyModifier; - - mti = INIT_TYPE(Mask); - mti->type = eModifierTypeType_Nonconstructive; - mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->copyData = maskModifier_copyData; - mti->requiredDataMask= maskModifier_requiredDataMask; - mti->foreachObjectLink = maskModifier_foreachObjectLink; - mti->updateDepgraph = maskModifier_updateDepgraph; - mti->applyModifier = maskModifier_applyModifier; - - mti = INIT_TYPE(Array); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = arrayModifier_initData; - mti->copyData = arrayModifier_copyData; - mti->foreachObjectLink = arrayModifier_foreachObjectLink; - mti->updateDepgraph = arrayModifier_updateDepgraph; - mti->applyModifier = arrayModifier_applyModifier; - mti->applyModifierEM = arrayModifier_applyModifierEM; - - mti = INIT_TYPE(Mirror); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = mirrorModifier_initData; - mti->copyData = mirrorModifier_copyData; - mti->foreachObjectLink = mirrorModifier_foreachObjectLink; - mti->updateDepgraph = mirrorModifier_updateDepgraph; - mti->applyModifier = mirrorModifier_applyModifier; - mti->applyModifierEM = mirrorModifier_applyModifierEM; - - mti = INIT_TYPE(EdgeSplit); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = edgesplitModifier_initData; - mti->copyData = edgesplitModifier_copyData; - mti->applyModifier = edgesplitModifier_applyModifier; - mti->applyModifierEM = edgesplitModifier_applyModifierEM; - - mti = INIT_TYPE(Bevel); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = bevelModifier_initData; - mti->copyData = bevelModifier_copyData; - mti->requiredDataMask = bevelModifier_requiredDataMask; - mti->applyModifier = bevelModifier_applyModifier; - mti->applyModifierEM = bevelModifier_applyModifierEM; - - mti = INIT_TYPE(Displace); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_SupportsEditmode; - mti->initData = displaceModifier_initData; - mti->copyData = displaceModifier_copyData; - mti->requiredDataMask = displaceModifier_requiredDataMask; - mti->dependsOnTime = displaceModifier_dependsOnTime; - mti->foreachObjectLink = displaceModifier_foreachObjectLink; - mti->foreachIDLink = displaceModifier_foreachIDLink; - mti->updateDepgraph = displaceModifier_updateDepgraph; - mti->isDisabled = displaceModifier_isDisabled; - mti->deformVerts = displaceModifier_deformVerts; - mti->deformVertsEM = displaceModifier_deformVertsEM; - - mti = INIT_TYPE(UVProject); - mti->type = eModifierTypeType_Nonconstructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = uvprojectModifier_initData; - mti->copyData = uvprojectModifier_copyData; - mti->requiredDataMask = uvprojectModifier_requiredDataMask; - mti->foreachObjectLink = uvprojectModifier_foreachObjectLink; - mti->foreachIDLink = uvprojectModifier_foreachIDLink; - mti->updateDepgraph = uvprojectModifier_updateDepgraph; - mti->applyModifier = uvprojectModifier_applyModifier; - mti->applyModifierEM = uvprojectModifier_applyModifierEM; - - mti = INIT_TYPE(Decimate); - mti->type = eModifierTypeType_Nonconstructive; - mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->initData = decimateModifier_initData; - mti->copyData = decimateModifier_copyData; - mti->applyModifier = decimateModifier_applyModifier; - - mti = INIT_TYPE(Smooth); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsEditmode; - mti->initData = smoothModifier_initData; - mti->copyData = smoothModifier_copyData; - mti->requiredDataMask = smoothModifier_requiredDataMask; - mti->isDisabled = smoothModifier_isDisabled; - mti->deformVerts = smoothModifier_deformVerts; - mti->deformVertsEM = smoothModifier_deformVertsEM; - - mti = INIT_TYPE(Cast); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->initData = castModifier_initData; - mti->copyData = castModifier_copyData; - mti->requiredDataMask = castModifier_requiredDataMask; - mti->isDisabled = castModifier_isDisabled; - mti->foreachObjectLink = castModifier_foreachObjectLink; - mti->updateDepgraph = castModifier_updateDepgraph; - mti->deformVerts = castModifier_deformVerts; - mti->deformVertsEM = castModifier_deformVertsEM; - - mti = INIT_TYPE(Wave); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->initData = waveModifier_initData; - mti->copyData = waveModifier_copyData; - mti->dependsOnTime = waveModifier_dependsOnTime; - mti->requiredDataMask = waveModifier_requiredDataMask; - mti->foreachObjectLink = waveModifier_foreachObjectLink; - mti->foreachIDLink = waveModifier_foreachIDLink; - mti->updateDepgraph = waveModifier_updateDepgraph; - mti->deformVerts = waveModifier_deformVerts; - mti->deformVertsEM = waveModifier_deformVertsEM; - - mti = INIT_TYPE(Armature); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->initData = armatureModifier_initData; - mti->copyData = armatureModifier_copyData; - mti->requiredDataMask = armatureModifier_requiredDataMask; - mti->isDisabled = armatureModifier_isDisabled; - mti->foreachObjectLink = armatureModifier_foreachObjectLink; - mti->updateDepgraph = armatureModifier_updateDepgraph; - mti->deformVerts = armatureModifier_deformVerts; - mti->deformVertsEM = armatureModifier_deformVertsEM; - mti->deformMatricesEM = armatureModifier_deformMatricesEM; - - mti = INIT_TYPE(Hook); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->initData = hookModifier_initData; - mti->copyData = hookModifier_copyData; - mti->requiredDataMask = hookModifier_requiredDataMask; - mti->freeData = hookModifier_freeData; - mti->isDisabled = hookModifier_isDisabled; - mti->foreachObjectLink = hookModifier_foreachObjectLink; - mti->updateDepgraph = hookModifier_updateDepgraph; - mti->deformVerts = hookModifier_deformVerts; - mti->deformVertsEM = hookModifier_deformVertsEM; - - mti = INIT_TYPE(Softbody); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_RequiresOriginalData - | eModifierTypeFlag_Single; - mti->deformVerts = softbodyModifier_deformVerts; - mti->dependsOnTime = softbodyModifier_dependsOnTime; - - mti = INIT_TYPE(Smoke); - mti->type = eModifierTypeType_OnlyDeform; - mti->initData = smokeModifier_initData; - mti->freeData = smokeModifier_freeData; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_UsesPointCache - | eModifierTypeFlag_Single; - mti->deformVerts = smokeModifier_deformVerts; - mti->dependsOnTime = smokeModifier_dependsOnTime; - mti->updateDepgraph = smokeModifier_updateDepgraph; - - mti = INIT_TYPE(Cloth); - mti->type = eModifierTypeType_Nonconstructive; - mti->initData = clothModifier_initData; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_UsesPointCache - | eModifierTypeFlag_Single; - mti->dependsOnTime = clothModifier_dependsOnTime; - mti->freeData = clothModifier_freeData; - mti->requiredDataMask = clothModifier_requiredDataMask; - mti->copyData = clothModifier_copyData; - mti->applyModifier = clothModifier_applyModifier; - mti->updateDepgraph = clothModifier_updateDepgraph; - - mti = INIT_TYPE(Collision); - mti->type = eModifierTypeType_OnlyDeform; - mti->initData = collisionModifier_initData; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_Single; - mti->dependsOnTime = collisionModifier_dependsOnTime; - mti->freeData = collisionModifier_freeData; - mti->deformVerts = collisionModifier_deformVerts; - // mti->copyData = collisionModifier_copyData; - - mti = INIT_TYPE(Surface); - mti->type = eModifierTypeType_OnlyDeform; - mti->initData = surfaceModifier_initData; - mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_NoUserAdd; - mti->dependsOnTime = surfaceModifier_dependsOnTime; - mti->freeData = surfaceModifier_freeData; - mti->deformVerts = surfaceModifier_deformVerts; - - mti = INIT_TYPE(Boolean); - mti->type = eModifierTypeType_Nonconstructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_UsesPointCache; - mti->copyData = booleanModifier_copyData; - mti->isDisabled = booleanModifier_isDisabled; - mti->applyModifier = booleanModifier_applyModifier; - mti->foreachObjectLink = booleanModifier_foreachObjectLink; - mti->updateDepgraph = booleanModifier_updateDepgraph; - mti->requiredDataMask = booleanModifier_requiredDataMask; - - mti = INIT_TYPE(MeshDeform); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->initData = meshdeformModifier_initData; - mti->freeData = meshdeformModifier_freeData; - mti->copyData = meshdeformModifier_copyData; - mti->requiredDataMask = meshdeformModifier_requiredDataMask; - mti->isDisabled = meshdeformModifier_isDisabled; - mti->foreachObjectLink = meshdeformModifier_foreachObjectLink; - mti->updateDepgraph = meshdeformModifier_updateDepgraph; - mti->deformVerts = meshdeformModifier_deformVerts; - mti->deformVertsEM = meshdeformModifier_deformVertsEM; - - mti = INIT_TYPE(ParticleSystem); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_UsesPointCache; -#if 0 - | eModifierTypeFlag_SupportsEditmode; - |eModifierTypeFlag_EnableInEditmode; -#endif - mti->initData = particleSystemModifier_initData; - mti->freeData = particleSystemModifier_freeData; - mti->copyData = particleSystemModifier_copyData; - mti->deformVerts = particleSystemModifier_deformVerts; -#if 0 - mti->deformVertsEM = particleSystemModifier_deformVertsEM; -#endif - mti->requiredDataMask = particleSystemModifier_requiredDataMask; - - mti = INIT_TYPE(ParticleInstance); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = particleInstanceModifier_initData; - mti->copyData = particleInstanceModifier_copyData; - mti->dependsOnTime = particleInstanceModifier_dependsOnTime; - mti->foreachObjectLink = particleInstanceModifier_foreachObjectLink; - mti->applyModifier = particleInstanceModifier_applyModifier; - mti->applyModifierEM = particleInstanceModifier_applyModifierEM; - mti->updateDepgraph = particleInstanceModifier_updateDepgraph; - - mti = INIT_TYPE(Explode); - mti->type = eModifierTypeType_Nonconstructive; - mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->initData = explodeModifier_initData; - mti->freeData = explodeModifier_freeData; - mti->copyData = explodeModifier_copyData; - mti->dependsOnTime = explodeModifier_dependsOnTime; - mti->requiredDataMask = explodeModifier_requiredDataMask; - mti->applyModifier = explodeModifier_applyModifier; - - mti = INIT_TYPE(Fluidsim); - mti->type = eModifierTypeType_Nonconstructive - | eModifierTypeFlag_RequiresOriginalData - | eModifierTypeFlag_Single; - mti->flags = eModifierTypeFlag_AcceptsMesh; - mti->initData = fluidsimModifier_initData; - mti->freeData = fluidsimModifier_freeData; - mti->copyData = fluidsimModifier_copyData; - mti->dependsOnTime = fluidsimModifier_dependsOnTime; - mti->applyModifier = fluidsimModifier_applyModifier; - mti->updateDepgraph = fluidsimModifier_updateDepgraph; - - mti = INIT_TYPE(Shrinkwrap); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = shrinkwrapModifier_initData; - mti->copyData = shrinkwrapModifier_copyData; - mti->requiredDataMask = shrinkwrapModifier_requiredDataMask; - mti->isDisabled = shrinkwrapModifier_isDisabled; - mti->foreachObjectLink = shrinkwrapModifier_foreachObjectLink; - mti->deformVerts = shrinkwrapModifier_deformVerts; - mti->deformVertsEM = shrinkwrapModifier_deformVertsEM; - mti->updateDepgraph = shrinkwrapModifier_updateDepgraph; - - mti = INIT_TYPE(SimpleDeform); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = simpledeformModifier_initData; - mti->copyData = simpledeformModifier_copyData; - mti->requiredDataMask = simpledeformModifier_requiredDataMask; - mti->deformVerts = simpledeformModifier_deformVerts; - mti->deformVertsEM = simpledeformModifier_deformVertsEM; - mti->foreachObjectLink = simpledeformModifier_foreachObjectLink; - mti->updateDepgraph = simpledeformModifier_updateDepgraph; - - mti = INIT_TYPE(Multires); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_RequiresOriginalData; - mti->initData = multiresModifier_initData; - mti->copyData = multiresModifier_copyData; - mti->applyModifier = multiresModifier_applyModifier; - - mti = INIT_TYPE(ShapeKey); - mti->type = eModifierTypeType_OnlyDeform; - mti->flags = eModifierTypeFlag_AcceptsCVs - | eModifierTypeFlag_SupportsEditmode; - mti->deformVerts = shapekeyModifier_deformVerts; - mti->deformVertsEM = shapekeyModifier_deformVertsEM; - mti->deformMatricesEM = shapekeyModifier_deformMatricesEM; - - mti = INIT_TYPE(Solidify); - mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh - | eModifierTypeFlag_SupportsMapping - | eModifierTypeFlag_SupportsEditmode - | eModifierTypeFlag_EnableInEditmode; - mti->initData = solidifyModifier_initData; - mti->copyData = solidifyModifier_copyData; - mti->applyModifier = solidifyModifier_applyModifier; - mti->applyModifierEM = solidifyModifier_applyModifierEM; - typeArrInit = 0; -#undef INIT_TYPE + if (types_init) { + modifier_type_init(types, type); /* MOD_utils.c */ + types_init= 0; } - if (type>=0 && type<NUM_MODIFIER_TYPES && typeArr[type].name[0]!='\0') { - return &typeArr[type]; - } else { + if(type >= 0 && type < NUM_MODIFIER_TYPES && + types[type]->name[0] != '\0') { + return types[type]; + } + else { return NULL; } } @@ -8239,6 +134,11 @@ ModifierData *modifiers_findByType(Object *ob, ModifierType type) return md; } +ModifierData *modifiers_findByName(Object *ob, const char *name) +{ + return BLI_findstring(&(ob->modifiers), name, offsetof(ModifierData, name)); +} + void modifiers_clearErrors(Object *ob) { ModifierData *md = ob->modifiers.first; diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c index 250a272015e..8b437635b2a 100644 --- a/source/blender/blenkernel/intern/modifiers_bmesh.c +++ b/source/blender/blenkernel/intern/modifiers_bmesh.c @@ -99,7 +99,6 @@ #include "depsgraph_private.h" #include "BKE_deform.h" #include "BKE_shrinkwrap.h" -#include "BKE_simple_deform.h" #include "CCGSubSurf.h" #include "RE_shader_ext.h" @@ -225,501 +224,3 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing) return em; } -static float vertarray_size(MVert *mvert, int numVerts, int axis) -{ - int i; - float min_co, max_co; - - /* if there are no vertices, width is 0 */ - if(numVerts == 0) return 0; - - /* find the minimum and maximum coordinates on the desired axis */ - min_co = max_co = mvert->co[axis]; - ++mvert; - for(i = 1; i < numVerts; ++i, ++mvert) { - if(mvert->co[axis] < min_co) min_co = mvert->co[axis]; - if(mvert->co[axis] > max_co) max_co = mvert->co[axis]; - } - - return max_co - min_co; -} - -/* finds the best possible flipped name. For renaming; check for unique names afterwards */ -/* if strip_number: removes number extensions */ -static void vertgroup_flip_name (char *name, int strip_number) -{ - int len; - char prefix[128]={""}; /* The part before the facing */ - char suffix[128]={""}; /* The part after the facing */ - char replace[128]={""}; /* The replacement string */ - char number[128]={""}; /* The number extension string */ - char *index=NULL; - - len= strlen(name); - if(len<3) return; // we don't do names like .R or .L - - /* We first check the case with a .### extension, let's find the last period */ - if(isdigit(name[len-1])) { - index= strrchr(name, '.'); // last occurrance - if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever! - if(strip_number==0) - strcpy(number, index); - *index= 0; - len= strlen(name); - } - } - - strcpy (prefix, name); - -#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_') - - /* first case; separator . - _ with extensions r R l L */ - if( IS_SEPARATOR(name[len-2]) ) { - switch(name[len-1]) { - case 'l': - prefix[len-1]= 0; - strcpy(replace, "r"); - break; - case 'r': - prefix[len-1]= 0; - strcpy(replace, "l"); - break; - case 'L': - prefix[len-1]= 0; - strcpy(replace, "R"); - break; - case 'R': - prefix[len-1]= 0; - strcpy(replace, "L"); - break; - } - } - /* case; beginning with r R l L , with separator after it */ - else if( IS_SEPARATOR(name[1]) ) { - switch(name[0]) { - case 'l': - strcpy(replace, "r"); - strcpy(suffix, name+1); - prefix[0]= 0; - break; - case 'r': - strcpy(replace, "l"); - strcpy(suffix, name+1); - prefix[0]= 0; - break; - case 'L': - strcpy(replace, "R"); - strcpy(suffix, name+1); - prefix[0]= 0; - break; - case 'R': - strcpy(replace, "L"); - strcpy(suffix, name+1); - prefix[0]= 0; - break; - } - } - else if(len > 5) { - /* hrms, why test for a separator? lets do the rule 'ultimate left or right' */ - index = BLI_strcasestr(prefix, "right"); - if (index==prefix || index==prefix+len-5) { - if(index[0]=='r') - strcpy (replace, "left"); - else { - if(index[1]=='I') - strcpy (replace, "LEFT"); - else - strcpy (replace, "Left"); - } - *index= 0; - strcpy (suffix, index+5); - } - else { - index = BLI_strcasestr(prefix, "left"); - if (index==prefix || index==prefix+len-4) { - if(index[0]=='l') - strcpy (replace, "right"); - else { - if(index[1]=='E') - strcpy (replace, "RIGHT"); - else - strcpy (replace, "Right"); - } - *index= 0; - strcpy (suffix, index+4); - } - } - } - -#undef IS_SEPARATOR - - sprintf (name, "%s%s%s%s", prefix, replace, suffix, number); -} - -typedef struct IndexMapEntry { - /* the new vert index that this old vert index maps to */ - int new; - /* -1 if this vert isn't merged, otherwise the old vert index it - * should be replaced with - */ - int merge; - /* 1 if this vert's first copy is merged with the last copy of its - * merge target, otherwise 0 - */ - short merge_final; -} IndexMapEntry; - -/* indexMap - an array of IndexMap entries - * oldIndex - the old index to map - * copyNum - the copy number to map to (original = 0, first copy = 1, etc.) - */ -static int calc_mapping(IndexMapEntry *indexMap, int oldIndex, int copyNum) -{ - if(indexMap[oldIndex].merge < 0) { - /* vert wasn't merged, so use copy of this vert */ - return indexMap[oldIndex].new + copyNum; - } else if(indexMap[oldIndex].merge == oldIndex) { - /* vert was merged with itself */ - return indexMap[oldIndex].new; - } else { - /* vert was merged with another vert */ - /* follow the chain of merges to the end, or until we've passed - * a number of vertices equal to the copy number - */ - if(copyNum <= 0) - return indexMap[oldIndex].new; - else - return calc_mapping(indexMap, indexMap[oldIndex].merge, - copyNum - 1); - } -} - -static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, - Scene *scene, Object *ob, DerivedMesh *dm, - int initFlags) -{ - DerivedMesh *cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's - BMEditMesh *em = CDDM_To_BMesh(cddm, NULL); - BMOperator op, oldop, weldop; - int i, j, indexLen; - /* offset matrix */ - float offset[4][4]; - float final_offset[4][4]; - float tmp_mat[4][4]; - float length = amd->length; - int count = amd->count, maxVerts; - int finalVerts, finalEdges, finalFaces; - int *indexMap = NULL; - DerivedMesh *start_cap = NULL, *end_cap = NULL; - MVert *src_mvert; - - /* need to avoid infinite recursion here */ - if(amd->start_cap && amd->start_cap != ob) - start_cap = mesh_get_derived_final(scene, amd->start_cap, CD_MASK_MESH); - if(amd->end_cap && amd->end_cap != ob) - end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH); - - unit_m4(offset); - - src_mvert = cddm->getVertArray(dm); - maxVerts = cddm->getNumVerts(dm); - - if(amd->offset_type & MOD_ARR_OFF_CONST) - add_v3_v3v3(offset[3], offset[3], amd->offset); - if(amd->offset_type & MOD_ARR_OFF_RELATIVE) { - for(j = 0; j < 3; j++) - offset[3][j] += amd->scale[j] * vertarray_size(src_mvert, - maxVerts, j); - } - - if((amd->offset_type & MOD_ARR_OFF_OBJ) && (amd->offset_ob)) { - float obinv[4][4]; - float result_mat[4][4]; - - if(ob) - invert_m4_m4(obinv, ob->obmat); - else - unit_m4(obinv); - - mul_serie_m4(result_mat, offset, - obinv, amd->offset_ob->obmat, - NULL, NULL, NULL, NULL, NULL); - copy_m4_m4(offset, result_mat); - } - - if(amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) { - Curve *cu = amd->curve_ob->data; - if(cu) { - float tmp_mat[3][3]; - float scale; - - object_to_mat3(amd->curve_ob, tmp_mat); - scale = mat3_to_scale(tmp_mat); - - if(!cu->path) { - cu->flag |= CU_PATH; // needed for path & bevlist - makeDispListCurveTypes(scene, amd->curve_ob, 0); - } - if(cu->path) - length = scale*cu->path->totdist; - } - } - - /* calculate the maximum number of copies which will fit within the - prescribed length */ - if(amd->fit_type == MOD_ARR_FITLENGTH - || amd->fit_type == MOD_ARR_FITCURVE) - { - float dist = sqrt(INPR(offset[3], offset[3])); - - if(dist > 1e-6f) - /* this gives length = first copy start to last copy end - add a tiny offset for floating point rounding errors */ - count = (length + 1e-6f) / dist; - else - /* if the offset has no translation, just make one copy */ - count = 1; - } - - if(count < 1) - count = 1; - - /* allocate memory for count duplicates (including original) plus - * start and end caps - */ - finalVerts = dm->getNumVerts(dm) * count; - finalEdges = dm->getNumEdges(dm) * count; - finalFaces = dm->getNumFaces(dm) * count; - if(start_cap) { - finalVerts += start_cap->getNumVerts(start_cap); - finalEdges += start_cap->getNumEdges(start_cap); - finalFaces += start_cap->getNumFaces(start_cap); - } - if(end_cap) { - finalVerts += end_cap->getNumVerts(end_cap); - finalEdges += end_cap->getNumEdges(end_cap); - finalFaces += end_cap->getNumFaces(end_cap); - } - - /* calculate the offset matrix of the final copy (for merging) */ - unit_m4(final_offset); - - for(j=0; j < count - 1; j++) { - mul_m4_m4m4(tmp_mat, final_offset, offset); - copy_m4_m4(final_offset, tmp_mat); - } - - BMO_Init_Op(&weldop, "weldverts"); - BMO_InitOpf(em->bm, &op, "dupe geom=%avef"); - oldop = op; - for (j=0; j < count; j++) { - BMVert *v, *v2; - BMOpSlot *s1; - BMOpSlot *s2; - - BMO_InitOpf(em->bm, &op, "dupe geom=%s", &oldop, j==0 ? "geom" : "newout"); - BMO_Exec_Op(em->bm, &op); - - s1 = BMO_GetSlot(&op, "geom"); - s2 = BMO_GetSlot(&op, "newout"); - - BMO_CallOpf(em->bm, "transform mat=%m4 verts=%s", offset, &op, "newout"); - - #define _E(s, i) ((BMVert**)(s)->data.buf)[i] - - /*calculate merge mapping*/ - if (j == 0) { - BMOperator findop; - BMOIter oiter; - BMVert *v, *v2; - BMHeader *h; - - BMO_InitOpf(em->bm, &findop, - "finddoubles verts=%av dist=%f keepverts=%s", - amd->merge_dist, &op, "geom"); - - i = 0; - BMO_ITER(h, &oiter, em->bm, &op, "geom", BM_ALL) { - BMINDEX_SET(h, i); - i++; - } - - BMO_ITER(h, &oiter, em->bm, &op, "newout", BM_ALL) { - BMINDEX_SET(h, i); - i++; - } - - BMO_Exec_Op(em->bm, &findop); - - indexLen = i; - indexMap = MEM_callocN(sizeof(int)*indexLen, "indexMap"); - - /*element type argument doesn't do anything here*/ - BMO_ITER(v, &oiter, em->bm, &findop, "targetmapout", 0) { - v2 = BMO_IterMapValp(&oiter); - - indexMap[BMINDEX_GET(v)] = BMINDEX_GET(v2)+1; - } - - BMO_Finish_Op(em->bm, &findop); - } - - /*generate merge mappping using index map. we do this by using the - operator slots as lookup arrays.*/ - #define E(i) (i) < s1->len ? _E(s1, i) : _E(s2, (i)-s1->len) - - for (i=0; i<indexLen; i++) { - if (!indexMap[i]) continue; - - v = E(i); - v2 = E(indexMap[i]-1); - - BMO_Insert_MapPointer(em->bm, &weldop, "targetmap", v, v2); - } - - #undef E - #undef _E - - BMO_Finish_Op(em->bm, &oldop); - oldop = op; - } - - if (j > 0) BMO_Finish_Op(em->bm, &op); - - if (amd->flags & MOD_ARR_MERGE) - BMO_Exec_Op(em->bm, &weldop); - - BMO_Finish_Op(em->bm, &weldop); - - BMEdit_RecalcTesselation(em); - cddm = CDDM_from_BMEditMesh(em, NULL); - - BMEdit_Free(em); - MEM_freeN(indexMap); - - return cddm; -} - -DerivedMesh *arrayModifier_applyModifier(ModifierData *md, Object *ob, - DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - ArrayModifierData *amd = (ArrayModifierData*) md; - - result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0); - - //if(result != derivedData) - // CDDM_calc_normals(result); - - return result; -} - -DerivedMesh *arrayModifier_applyModifierEM(ModifierData *md, Object *ob, - BMEditMesh *editData, - DerivedMesh *derivedData) -{ - return arrayModifier_applyModifier(md, ob, derivedData, 0, 1); -} - -/* Mirror */ -#define VERT_NEW 1 - -DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd, - Object *ob, - DerivedMesh *dm, - int initFlags, - int axis) -{ - float tolerance = mmd->tolerance; - DerivedMesh *result, *cddm; - BMEditMesh *em; - BMesh *bm; - BMOIter siter1; - BMOperator op; - BMVert *v1; - int vector_size=0, a, b; - bDeformGroup *def, *defb; - bDeformGroup **vector_def = NULL; - float mtx[4][4], imtx[4][4]; - int j; - - cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's - em = CDDM_To_BMesh(dm, NULL); - - /*convienence variable*/ - bm = em->bm; - - if (mmd->flag & MOD_MIR_VGROUP) { - /* calculate the number of deformedGroups */ - for(vector_size = 0, def = ob->defbase.first; def; - def = def->next, vector_size++); - - /* load the deformedGroups for fast access */ - vector_def = - (bDeformGroup **)MEM_mallocN(sizeof(bDeformGroup*) * vector_size, - "group_index"); - for(a = 0, def = ob->defbase.first; def; def = def->next, a++) { - vector_def[a] = def; - } - } - - if (mmd->mirror_ob) { - float mtx2[4][4], vec[3]; - - invert_m4_m4(mtx2, mmd->mirror_ob->obmat); - mul_m4_m4m4(mtx, ob->obmat, mtx2); - } else { - unit_m4(mtx); - } - - BMO_InitOpf(bm, &op, "mirror geom=%avef mat=%m4 mergedist=%f axis=%d", - mtx, mmd->tolerance, axis); - - BMO_Exec_Op(bm, &op); - - BMO_CallOpf(bm, "reversefaces faces=%s", &op, "newout"); - - /*handle vgroup stuff*/ - if (mmd->flag & MOD_MIR_VGROUP) { - BMO_ITER(v1, &siter1, bm, &op, "newout", BM_VERT) { - MDeformVert *dvert = CustomData_bmesh_get(&bm->vdata, v1->head.data, CD_MDEFORMVERT); - - if (dvert) { - for(j = 0; j < dvert[0].totweight; ++j) { - char tmpname[32]; - - if(dvert->dw[j].def_nr < 0 || - dvert->dw[j].def_nr >= vector_size) - continue; - - def = vector_def[dvert->dw[j].def_nr]; - strcpy(tmpname, def->name); - vertgroup_flip_name(tmpname,0); - - for(b = 0, defb = ob->defbase.first; defb; - defb = defb->next, b++) - { - if(!strcmp(defb->name, tmpname)) - { - dvert->dw[j].def_nr = b; - break; - } - } - } - } - } - } - - BMO_Finish_Op(bm, &op); - - BMEdit_RecalcTesselation(em); - result = CDDM_from_BMEditMesh(em, NULL); //CDDM_copy(getEditDerivedBMesh(em, ob, NULL), 0); - - BMEdit_Free(em); - MEM_freeN(em); - - if (vector_def) MEM_freeN(vector_def); - - return result; -} diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 83f04db9cd7..4b54114505e 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -29,27 +29,20 @@ #include "MEM_guardedalloc.h" -#include "DNA_key_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" -#include "BLI_math.h" #include "BLI_blenlib.h" +#include "BLI_math.h" #include "BLI_pbvh.h" #include "BKE_cdderivedmesh.h" -#include "BKE_customdata.h" -#include "BKE_depsgraph.h" -#include "BKE_DerivedMesh.h" -#include "BKE_global.h" #include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_multires.h" -#include "BKE_object.h" +#include "BKE_paint.h" #include "BKE_scene.h" #include "BKE_subsurf.h" #include "BKE_utildefines.h" @@ -67,19 +60,33 @@ static const int multires_side_tot[] = {0, 2, 3, 5, 9, 17, 33, 65, 129, static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert); static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl); -MultiresModifierData *find_multires_modifier(Object *ob) +DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob) +{ + ModifierData *md= (ModifierData *)mmd; + ModifierTypeInfo *mti = modifierType_getInfo(md->type); + DerivedMesh *tdm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); + DerivedMesh *dm; + + dm = mti->applyModifier(md, ob, tdm, 0, 1); + if (dm == tdm) { + dm = CDDM_copy(tdm, 0); + } + + return dm; +} + +MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *lastmd) { ModifierData *md; - MultiresModifierData *mmd = NULL; - for(md = ob->modifiers.first; md; md = md->next) { + for(md = lastmd; md; md = md->prev) { if(md->type == eModifierType_Multires) { - mmd = (MultiresModifierData*)md; - break; + if (modifier_isEnabled(scene, md, eModifierMode_Realtime)) + return (MultiresModifierData*)md; } } - return mmd; + return NULL; } static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render) @@ -117,14 +124,27 @@ void multires_mark_as_modified(Object *ob) void multires_force_update(Object *ob) { - - if(ob && ob->derivedFinal) { - ob->derivedFinal->needsFree =1; - ob->derivedFinal->release(ob->derivedFinal); - ob->derivedFinal = NULL; + if(ob) { + if(ob->derivedFinal) { + ob->derivedFinal->needsFree =1; + ob->derivedFinal->release(ob->derivedFinal); + ob->derivedFinal = NULL; + } + if(ob->sculpt && ob->sculpt->pbvh) { + BLI_pbvh_free(ob->sculpt->pbvh); + ob->sculpt->pbvh= NULL; + } } } +void multires_force_external_reload(Object *ob) +{ + Mesh *me = get_mesh(ob); + + CustomData_external_reload(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface); + multires_force_update(ob); +} + void multires_force_render_update(Object *ob) { if(ob && (ob->mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires)) @@ -193,24 +213,97 @@ void multiresModifier_join(Object *ob) } #endif -/* Returns 1 on success, 0 if the src's totvert doesn't match */ -int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src) +int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd, + Object *ob, DerivedMesh *srcdm) { - DerivedMesh *srcdm = src->derivedFinal; - DerivedMesh *mrdm = dst->derivedFinal; + DerivedMesh *mrdm = get_multires_dm (scene, mmd, ob); if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) { multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm)); multires_dm_mark_as_modified(mrdm); - multires_force_update(dst); + multires_force_update(ob); + + mrdm->release(mrdm); return 1; } + mrdm->release(mrdm); + return 0; } +/* Returns 1 on success, 0 if the src's totvert doesn't match */ +int multiresModifier_reshape(Scene *scene, MultiresModifierData *mmd, Object *dst, Object *src) +{ + DerivedMesh *srcdm = mesh_get_derived_final(scene, src, CD_MASK_BAREMESH); + return multiresModifier_reshapeFromDM(scene, mmd, dst, srcdm); +} + +int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mmd, + Object *ob, ModifierData *md) +{ + ModifierTypeInfo *mti = modifierType_getInfo(md->type); + DerivedMesh *dm, *ndm; + int numVerts, result; + float (*deformedVerts)[3]; + + if(multires_get_level(ob, mmd, 0) == 0) + return 0; + + /* Create DerivedMesh for deformation modifier */ + dm = get_multires_dm(scene, mmd, ob); + numVerts= dm->getNumVerts(dm); + deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts"); + + dm->getVertCos(dm, deformedVerts); + mti->deformVerts(md, ob, dm, deformedVerts, numVerts, 0, 0); + + ndm= CDDM_copy(dm, 0); + CDDM_apply_vert_coords(ndm, deformedVerts); + + MEM_freeN(deformedVerts); + dm->release(dm); + + /* Reshaping */ + result= multiresModifier_reshapeFromDM(scene, mmd, ob, ndm); + + /* Cleanup */ + ndm->release(ndm); + + return result; +} + +static void multires_set_tot_mdisps(Mesh *me, int lvl) +{ + MDisps *mdisps= CustomData_get_layer(&me->ldata, CD_MDISPS); + int i; + + if(mdisps) { + for(i = 0; i < me->totloop; i++, mdisps++) { + mdisps->totdisp = multires_grid_tot[lvl]; + } + } +} + +static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl) +{ + int i; + + /* reallocate displacements to be filled in */ + for(i = 0; i < me->totloop; ++i) { + int totdisp = multires_grid_tot[lvl]; + float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); + + if(mdisps[i].disps) + MEM_freeN(mdisps[i].disps); + + mdisps[i].disps = disps; + mdisps[i].totdisp = totdisp; + } +} + static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3]) { copy_v3_v3(mat[0], v1); @@ -266,6 +359,7 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire int levels = mmd->totlvl - lvl; MDisps *mdisps; + multires_set_tot_mdisps(me, mmd->totlvl); CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totloop); mdisps= CustomData_get_layer(&me->ldata, CD_MDISPS); @@ -338,23 +432,6 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0); } -static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl) -{ - int i; - - /* reallocate displacements to be filled in */ - for(i = 0; i < me->totloop; ++i) { - int totdisp = multires_grid_tot[lvl]; - float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); - - if(mdisps[i].disps) - MEM_freeN(mdisps[i].disps); - - mdisps[i].disps = disps; - mdisps[i].totdisp = totdisp; - } -} - void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple) { Mesh *me = ob->data; @@ -380,6 +457,7 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updat /* create subsurf DM from original mesh at high level */ cddm = CDDM_from_mesh(me, NULL); + DM_set_only_copy(cddm, CD_MASK_BAREMESH); highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0); /* create multires DM from original mesh at low level */ @@ -483,7 +561,8 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int k = 0; /*current loop/mdisp index within the mloop array*/ - #pragma omp parallel for private(i) schedule(static) + #pragma omp parallel for private(i) if(me->totloop*gridSize*gridSize >= CCG_OMP_LIMIT) + for(i = 0; i < me->totpoly; ++i) { const int numVerts = mpoly[i].totloop; int S, x, y, gIndex = gridOffset[i]; @@ -563,6 +642,8 @@ static void multiresModifier_update(DerivedMesh *dm) ob = ccgdm->multires.ob; me = ccgdm->multires.ob->data; mmd = ccgdm->multires.mmd; + + multires_set_tot_mdisps(me, mmd->totlvl); CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totloop); mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS); @@ -578,7 +659,10 @@ static void multiresModifier_update(DerivedMesh *dm) int i, j, numGrids, highGridSize, lowGridSize; /* create subsurf DM from original mesh at high level */ - cddm = CDDM_from_mesh(me, NULL); + if (ob->derivedDeform) cddm = CDDM_copy(ob->derivedDeform, 0); + else cddm = CDDM_from_mesh(me, NULL); + DM_set_only_copy(cddm, CD_MASK_BAREMESH); + highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0); /* create multires DM from original mesh and displacements */ @@ -629,7 +713,10 @@ static void multiresModifier_update(DerivedMesh *dm) else { DerivedMesh *cddm, *subdm; - cddm = CDDM_from_mesh(me, NULL); + if (ob->derivedDeform) cddm = CDDM_copy(ob->derivedDeform, 0); + else cddm = CDDM_from_mesh(me, NULL); + DM_set_only_copy(cddm, CD_MASK_BAREMESH); + subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0); cddm->release(cddm); @@ -660,7 +747,7 @@ void multires_stitch_grids(Object *ob) } DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob, - int useRenderParams, int isFinalCalc) + int useRenderParams, int isFinalCalc) { Mesh *me= ob->data; DerivedMesh *result; @@ -698,7 +785,10 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca memcpy(subGridData[i], gridData[i], sizeof(DMGridData)*gridSize*gridSize); } + multires_set_tot_mdisps(me, mmd->totlvl); CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totloop); + + /*run displacement*/ multiresModifier_disp_run(result, ob->data, 0, 0, subGridData, mmd->totlvl); for(i = 0; i < numGrids; i++) @@ -868,7 +958,7 @@ void multires_free(Multires *mr) } static void create_old_vert_face_map(ListBase **map, IndexNode **mem, const MultiresFace *mface, - const int totvert, const int totface) + const int totvert, const int totface) { int i,j; IndexNode *node = NULL; @@ -887,7 +977,7 @@ static void create_old_vert_face_map(ListBase **map, IndexNode **mem, const Mult } static void create_old_vert_edge_map(ListBase **map, IndexNode **mem, const MultiresEdge *medge, - const int totvert, const int totedge) + const int totvert, const int totedge) { int i,j; IndexNode *node = NULL; @@ -953,7 +1043,7 @@ static void multires_load_old_edges(ListBase **emap, MultiresLevel *lvl, int *vv } static void multires_load_old_faces(ListBase **fmap, ListBase **emap, MultiresLevel *lvl, int *vvmap, int dst, - int v1, int v2, int v3, int v4, int st2, int st3) + int v1, int v2, int v3, int v4, int st2, int st3) { int fmid; int emid13, emid14, emid23, emid24; @@ -1223,6 +1313,7 @@ void multires_load_old(Object *ob, Mesh *me) ModifierData *md; MultiresModifierData *mmd; DerivedMesh *dm, *orig; + CustomDataLayer *l; int i; /* Load original level into the mesh */ @@ -1268,6 +1359,14 @@ void multires_load_old(Object *ob, Mesh *me) dm->release(dm); orig->release(orig); + /* Copy the first-level data to the mesh */ + for(i = 0, l = me->mr->vdata.layers; i < me->mr->vdata.totlayer; ++i, ++l) + CustomData_add_layer(&me->vdata, l->type, CD_REFERENCE, l->data, me->totvert); + for(i = 0, l = me->mr->fdata.layers; i < me->mr->fdata.totlayer; ++i, ++l) + CustomData_add_layer(&me->fdata, l->type, CD_REFERENCE, l->data, me->totface); + memset(&me->mr->vdata, 0, sizeof(CustomData)); + memset(&me->mr->fdata, 0, sizeof(CustomData)); + /* Remove the old multires */ multires_free(me->mr); me->mr= NULL; diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index bbef2b3e0db..8d2ad49e7bf 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -36,29 +36,22 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" +#include "DNA_scene_types.h" -#include "BKE_animsys.h" #include "BKE_action.h" #include "BKE_fcurve.h" #include "BKE_nla.h" -#include "BKE_blender.h" +#include "BKE_global.h" #include "BKE_library.h" -#include "BKE_object.h" #include "BKE_utildefines.h" #include "RNA_access.h" #include "nla_private.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - /* *************************************************** */ /* Data Management */ @@ -833,8 +826,8 @@ void BKE_nlameta_flush_transforms (NlaStrip *mstrip) strip->end= nEnd; RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &ptr); - RNA_float_set(&ptr, "start_frame", nStart); - RNA_float_set(&ptr, "end_frame", nEnd); + RNA_float_set(&ptr, "frame_start", nStart); + RNA_float_set(&ptr, "frame_end", nEnd); } else { /* just apply the changes in offset to both ends of the strip */ @@ -961,6 +954,35 @@ short BKE_nlatrack_add_strip (NlaTrack *nlt, NlaStrip *strip) return BKE_nlastrips_add_strip(&nlt->strips, strip); } +/* Get the extents of the given NLA-Track including gaps between strips, + * returning whether this succeeded or not + */ +short BKE_nlatrack_get_bounds (NlaTrack *nlt, float bounds[2]) +{ + NlaStrip *strip; + + /* initialise bounds */ + if (bounds) + bounds[0] = bounds[1] = 0.0f; + else + return 0; + + /* sanity checks */ + if ELEM(NULL, nlt, nlt->strips.first) + return 0; + + /* lower bound is first strip's start frame */ + strip = nlt->strips.first; + bounds[0] = strip->start; + + /* upper bound is last strip's end frame */ + strip = nlt->strips.last; + bounds[1] = strip->end; + + /* done */ + return 1; +} + /* NLA Strips -------------------------------------- */ /* Find the active NLA-strip within the given track */ @@ -1221,7 +1243,7 @@ void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip) * - this is easier than iterating over all the tracks+strips hierarchy everytime * (and probably faster) */ - gh= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); + gh= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "nlastrip_validate_name gh"); for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) { for (tstrip= nlt->strips.first; tstrip; tstrip= tstrip->next) { @@ -1479,7 +1501,10 @@ short BKE_nla_tweakmode_enter (AnimData *adt) } } if ELEM3(NULL, activeTrack, activeStrip, activeStrip->act) { - printf("NLA tweakmode enter - neither active requirement found \n"); + if (G.f & G_DEBUG) { + printf("NLA tweakmode enter - neither active requirement found \n"); + printf("\tactiveTrack = %p, activeStrip = %p \n", activeTrack, activeStrip); + } return 0; } @@ -1558,4 +1583,29 @@ void BKE_nla_tweakmode_exit (AnimData *adt) adt->flag &= ~ADT_NLA_EDIT_ON; } +/* Baking Tools ------------------------------------------- */ + +void BKE_nla_bake (Scene *scene, ID *id, AnimData *adt, int flag) +{ + + /* verify that data is valid + * 1) Scene and AnimData must be provided + * 2) there must be tracks to merge... + */ + if ELEM3(NULL, scene, adt, adt->nla_tracks.first) + return; + + /* if animdata currently has an action, 'push down' this onto the stack first */ + if (adt->action) + BKE_nla_action_pushdown(adt); + + /* get range of motion to bake, and the channels involved... */ + + /* temporarily mute the action, and start keying to it */ + + /* start keying... */ + + /* unmute the action */ +} + /* *************************************************** */ diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index ced88b7e818..838ec24391c 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -36,42 +36,16 @@ #include <string.h> #include "DNA_anim_types.h" -#include "DNA_ID.h" -#include "DNA_image_types.h" -#include "DNA_node_types.h" -#include "DNA_material_types.h" -#include "DNA_texture_types.h" -#include "DNA_text_types.h" -#include "DNA_scene_types.h" #include "RNA_access.h" -#include "BKE_blender.h" -#include "BKE_colortools.h" #include "BKE_fcurve.h" -#include "BKE_global.h" -#include "BKE_image.h" -#include "BKE_library.h" -#include "BKE_main.h" -#include "BKE_node.h" -#include "BKE_texture.h" -#include "BKE_text.h" -#include "BKE_utildefines.h" #include "BKE_animsys.h" /* BKE_free_animdata only */ -#include "BLI_math.h" -#include "BLI_blenlib.h" -#include "BLI_rand.h" -#include "BLI_threads.h" #include "PIL_time.h" #include "MEM_guardedalloc.h" -#include "IMB_imbuf.h" - -#include "RE_pipeline.h" -#include "RE_shader_ext.h" /* <- TexResult */ -#include "RE_render_ext.h" /* <- ibuf_sample() */ #include "CMP_node.h" #include "intern/CMP_util.h" /* stupid include path... */ @@ -80,7 +54,6 @@ #include "TEX_node.h" #include "intern/TEX_util.h" -#include "GPU_extensions.h" #include "GPU_material.h" static ListBase empty_list = {NULL, NULL}; @@ -141,7 +114,8 @@ void ntreeInitTypes(bNodeTree *ntree) } } node->typeinfo= stype; - node->typeinfo->initfunc(node); + if(node->typeinfo) + node->typeinfo->initfunc(node); } else { node->typeinfo= node_get_type(ntree, node->type, (bNodeTree *)node->id, NULL); } @@ -1075,11 +1049,11 @@ bNodeTree *ntreeAddTree(int type) ntree->alltypes.last = NULL; /* this helps RNA identify ID pointers as nodetree */ - if(ntree->type==NTREE_SHADER) + if(ntree->type==NTREE_SHADER) BLI_strncpy(ntree->id.name, "NTShader Nodetree", sizeof(ntree->id.name)); - else if(ntree->type==NTREE_COMPOSIT) + else if(ntree->type==NTREE_COMPOSIT) BLI_strncpy(ntree->id.name, "NTCompositing Nodetree", sizeof(ntree->id.name)); - else if(ntree->type==NTREE_TEXTURE) + else if(ntree->type==NTREE_TEXTURE) BLI_strncpy(ntree->id.name, "NTTexture Nodetree", sizeof(ntree->id.name)); ntreeInitTypes(ntree); @@ -1381,9 +1355,9 @@ void ntreeMakeLocal(bNodeTree *ntree) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(ntree->id.lib==NULL) return; if(ntree->id.us==1) { @@ -1574,7 +1548,7 @@ bNode *nodeGetActiveID(bNodeTree *ntree, short idtype) if(ntree==NULL) return NULL; /* check for group edit */ - for(node= ntree->nodes.first; node; node= node->next) + for(node= ntree->nodes.first; node; node= node->next) if(node->flag & NODE_GROUP_EDIT) break; @@ -1598,7 +1572,7 @@ int nodeSetActiveID(bNodeTree *ntree, short idtype, ID *id) if(ntree==NULL) return ok; /* check for group edit */ - for(node= ntree->nodes.first; node; node= node->next) + for(node= ntree->nodes.first; node; node= node->next) if(node->flag & NODE_GROUP_EDIT) break; @@ -2460,7 +2434,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) bNode *node; ListBase threads; ThreadData thdata; - int totnode, rendering= 1; + int totnode, curnode, rendering= 1; if(ntree==NULL) return; @@ -2481,7 +2455,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) BLI_srandom(rd->cfra); /* sets need_exec tags in nodes */ - totnode= setExecutableNodes(ntree, &thdata); + curnode = totnode= setExecutableNodes(ntree, &thdata); BLI_init_threads(&threads, exec_composite_node, rd->threads); @@ -2491,14 +2465,14 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) node= getExecutableNode(ntree); if(node) { - if(ntree->timecursor) - ntree->timecursor(ntree->tch, totnode); + if(ntree->progress && totnode) + ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode)); if(ntree->stats_draw) { char str[64]; - sprintf(str, "Compositing %d %s", totnode, node->name); + sprintf(str, "Compositing %d %s", curnode, node->name); ntree->stats_draw(ntree->sdh, str); } - totnode--; + curnode--; node->threaddata = &thdata; node->exec= NODE_PROCESSING; @@ -2546,10 +2520,39 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) /* local tree then owns all compbufs */ bNodeTree *ntreeLocalize(bNodeTree *ntree) { - bNodeTree *ltree= ntreeCopyTree(ntree, 0); + bNodeTree *ltree; bNode *node; bNodeSocket *sock; + bAction *action_backup= NULL, *tmpact_backup= NULL; + + /* Workaround for copying an action on each render! + * set action to NULL so animdata actions dont get copied */ + AnimData *adt= BKE_animdata_from_id(&ntree->id); + + if(adt) { + action_backup= adt->action; + tmpact_backup= adt->tmpact; + + adt->action= NULL; + adt->tmpact= NULL; + } + + /* node copy func */ + ltree= ntreeCopyTree(ntree, 0); + + if(adt) { + AnimData *ladt= BKE_animdata_from_id(<ree->id); + + adt->action= ladt->action= action_backup; + adt->tmpact= ladt->tmpact= tmpact_backup; + + if(action_backup) action_backup->id.us++; + if(tmpact_backup) tmpact_backup->id.us++; + + } + /* end animdata uglyness */ + /* move over the compbufs */ /* right after ntreeCopyTree() oldsock pointers are valid */ for(node= ntree->nodes.first; node; node= node->next) { @@ -2571,6 +2574,8 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree) for(sock= node->outputs.first; sock; sock= sock->next) { sock->new_sock->ns.data= sock->ns.data; + compbuf_set_node(sock->new_sock->ns.data, node->new_node); + sock->ns.data= NULL; sock->new_sock->new_sock= sock; } @@ -2668,7 +2673,7 @@ static void gpu_from_node_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack for (sock=sockets->first, i=0; sock; sock=sock->next, i++) { memset(&gs[i], 0, sizeof(gs[i])); - QUATCOPY(gs[i].vec, ns[i]->vec); + QUATCOPY(gs[i].vec, ns[i]->vec); gs[i].link= ns[i]->data; if (sock->type == SOCK_VALUE) @@ -2761,7 +2766,7 @@ void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat) if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout)) data_from_gpu_stack(&node->outputs, nsout, gpuout); } - else if(node->type==NODE_GROUP && node->id) { + else if(node->type==NODE_GROUP && node->id) { node_get_stack(node, stack, nsin, nsout); gpu_node_group_execute(stack, mat, node, nsin, nsout); } @@ -2809,12 +2814,16 @@ static void force_hidden_passes(bNode *node, int passflag) if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT); if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_RADIO); - if(!(passflag & SCE_PASS_RADIO)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT); + if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT); + if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_ENV); + if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL; } @@ -3017,7 +3026,7 @@ void nodeRegisterType(ListBase *typelist, const bNodeType *ntype) bNodeType *ntypen= MEM_callocN(sizeof(bNodeType), "node type"); *ntypen= *ntype; BLI_addtail(typelist, ntypen); - } + } } static void registerCompositNodes(ListBase *ntypelist) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index a83997f1e70..a6565ade028 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -33,46 +33,30 @@ #include <math.h> #include <stdio.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_boid_types.h" #include "DNA_camera_types.h" #include "DNA_constraint_types.h" -#include "DNA_curve_types.h" #include "DNA_group_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" #include "DNA_meta_types.h" -#include "DNA_curve_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_object_fluidsim.h" -#include "DNA_outliner_types.h" -#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_sequence_types.h" #include "DNA_space_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" #include "DNA_world_types.h" #include "BLI_blenlib.h" -#include "BLI_math.h" #include "BLI_editVert.h" +#include "BLI_math.h" +#include "BLI_pbvh.h" #include "BKE_utildefines.h" @@ -85,10 +69,8 @@ #include "BKE_colortools.h" #include "BKE_deform.h" #include "BKE_DerivedMesh.h" -#include "BKE_nla.h" #include "BKE_animsys.h" #include "BKE_anim.h" -#include "BKE_blender.h" #include "BKE_constraint.h" #include "BKE_curve.h" #include "BKE_displist.h" @@ -110,7 +92,7 @@ #include "BKE_property.h" #include "BKE_sca.h" #include "BKE_scene.h" -#include "BKE_screen.h" +#include "BKE_sequencer.h" #include "BKE_softbody.h" #include "LBM_fluidsim.h" @@ -247,23 +229,26 @@ void object_free_display(Object *ob) freedisplist(&ob->disp); } -void free_sculptsession(SculptSession **ssp) +void free_sculptsession(Object *ob) { - if(ssp && *ssp) { - SculptSession *ss = *ssp; + if(ob && ob->sculpt) { + SculptSession *ss = ob->sculpt; + DerivedMesh *dm= ob->derivedFinal; + + if(ss->pbvh) + BLI_pbvh_free(ss->pbvh); + if(dm && dm->getPBVH) + dm->getPBVH(NULL, dm); /* signal to clear */ if(ss->texcache) MEM_freeN(ss->texcache); - if(ss->layer_disps) - MEM_freeN(ss->layer_disps); - if(ss->layer_co) MEM_freeN(ss->layer_co); MEM_freeN(ss); - *ssp = NULL; + ob->sculpt = NULL; } } @@ -299,7 +284,6 @@ void free_object(Object *ob) ob->path= 0; if(ob->adt) BKE_free_animdata((ID *)ob); if(ob->poselib) ob->poselib->id.us--; - if(ob->dup_group) ob->dup_group->id.us--; if(ob->gpd) ob->gpd->id.us--; if(ob->defbase.first) BLI_freelistN(&ob->defbase); @@ -322,7 +306,7 @@ void free_object(Object *ob) if(ob->bsoft) bsbFree(ob->bsoft); if(ob->gpulamp.first) GPU_lamp_free(ob); - free_sculptsession(&ob->sculpt); + free_sculptsession(ob); if(ob->pc_ids.first) BLI_freelistN(&ob->pc_ids); } @@ -333,9 +317,10 @@ static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Objec if (*obpoin==unlinkOb) { *obpoin = NULL; - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; // XXX: should this just be OB_RECALC_DATA? } } + void unlink_object(Scene *scene, Object *ob) { Object *obt; @@ -350,7 +335,9 @@ void unlink_object(Scene *scene, Object *ob) bConstraint *con; //bActionStrip *strip; // XXX animsys ModifierData *md; - int a; + ARegion *ar; + RegionView3D *rv3d; + int a, found; unlink_controllers(&ob->controllers); unlink_actuators(&ob->actuators); @@ -370,12 +357,7 @@ void unlink_object(Scene *scene, Object *ob) if(obt->parent==ob) { obt->parent= NULL; - obt->recalc |= OB_RECALC; - } - - if(obt->track==ob) { - obt->track= NULL; - obt->recalc |= OB_RECALC_OB; + obt->recalc |= OB_RECALC_ALL; } modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob); @@ -385,15 +367,15 @@ void unlink_object(Scene *scene, Object *ob) if(cu->bevobj==ob) { cu->bevobj= NULL; - obt->recalc |= OB_RECALC; + obt->recalc |= OB_RECALC_ALL; } if(cu->taperobj==ob) { cu->taperobj= NULL; - obt->recalc |= OB_RECALC; + obt->recalc |= OB_RECALC_ALL; } if(cu->textoncurve==ob) { cu->textoncurve= NULL; - obt->recalc |= OB_RECALC; + obt->recalc |= OB_RECALC_ALL; } } else if(obt->type==OB_ARMATURE && obt->pose) { @@ -422,6 +404,9 @@ void unlink_object(Scene *scene, Object *ob) if(pchan->custom==ob) pchan->custom= NULL; } + } else if(ELEM(OB_MBALL, ob->type, obt->type)) { + if(is_mball_basis_for(obt, ob)) + obt->recalc|= OB_RECALC_DATA; } sca_remove_ob_poin(obt, ob); @@ -554,13 +539,7 @@ void unlink_object(Scene *scene, Object *ob) } tex= tex->id.next; } - - /* mballs (scene==NULL when called from library.c) */ - if(scene && ob->type==OB_MBALL) { - obt= find_basis_mball(scene, ob); - if(obt) freedisplist(&obt->disp); - } - + /* worlds */ wrld= G.main->world.first; while(wrld) { @@ -592,7 +571,16 @@ void unlink_object(Scene *scene, Object *ob) } } #endif + if(sce->ed) { + Sequence *seq; + SEQ_BEGIN(sce->ed, seq) + if(seq->scene_camera==ob) { + seq->scene_camera= NULL; + } + SEQ_END + } } + sce= sce->id.next; } @@ -622,13 +610,32 @@ void unlink_object(Scene *scene, Object *ob) if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; + found= 0; if(v3d->camera==ob) { v3d->camera= NULL; - // XXX if(v3d->persp==V3D_CAMOB) v3d->persp= V3D_PERSP; + found= 1; } if(v3d->localvd && v3d->localvd->camera==ob ) { v3d->localvd->camera= NULL; - // XXX if(v3d->localvd->persp==V3D_CAMOB) v3d->localvd->persp= V3D_PERSP; + found += 2; + } + + if (found) { + if (sa->spacetype == SPACE_VIEW3D) { + for (ar= sa->regionbase.first; ar; ar= ar->next) { + if (ar->regiontype==RGN_TYPE_WINDOW) { + rv3d= (RegionView3D *)ar->regiondata; + if (found == 1 || found == 3) { + if (rv3d->persp == RV3D_CAMOB) + rv3d->persp= RV3D_PERSP; + } + if (found == 2 || found == 3) { + if (rv3d->localvd && rv3d->localvd->persp == RV3D_CAMOB) + rv3d->localvd->persp= RV3D_PERSP; + } + } + } + } } } else if(sl->spacetype==SPACE_OUTLINER) { @@ -642,6 +649,14 @@ void unlink_object(Scene *scene, Object *ob) } } } + else if(sl->spacetype==SPACE_BUTS) { + SpaceButs *sbuts= (SpaceButs *)sl; + + if(sbuts->pinid==(ID *)ob) { + sbuts->flag&= ~SB_PIN_CONTEXT; + sbuts->pinid= NULL; + } + } } sa= sa->next; @@ -687,13 +702,12 @@ void *add_camera(char *name) cam= alloc_libblock(&G.main->camera, ID_CA, name); cam->lens= 35.0f; - cam->angle= 49.14f; cam->clipsta= 0.1f; cam->clipend= 100.0f; cam->drawsize= 0.5f; cam->ortho_scale= 6.0; - cam->flag |= CAM_SHOWTITLESAFE; - cam->passepartalpha = 0.2f; + cam->flag |= CAM_SHOWPASSEPARTOUT; + cam->passepartalpha = 0.5f; return cam; } @@ -717,9 +731,9 @@ void make_local_camera(Camera *cam) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(cam->id.lib==0) return; if(cam->id.us==1) { @@ -865,9 +879,9 @@ void make_local_lamp(Lamp *la) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(la->id.lib==0) return; if(la->id.us==1) { @@ -969,7 +983,7 @@ static char *get_obdata_defname(int type) case OB_MESH: return "Mesh"; case OB_CURVE: return "Curve"; case OB_SURF: return "Surf"; - case OB_FONT: return "Font"; + case OB_FONT: return "Text"; case OB_MBALL: return "Mball"; case OB_CAMERA: return "Camera"; case OB_LAMP: return "Lamp"; @@ -1039,6 +1053,8 @@ Object *add_only_object(int type, char *name) ob->anisotropicFriction[2] = 1.0f; ob->gameflag= OB_PROP|OB_COLLISION; ob->margin = 0.0; + ob->init_state=1; + ob->state=1; /* ob->pad3 == Contact Processing Threshold */ ob->m_contactProcessingThreshold = 1.; @@ -1071,7 +1087,7 @@ Object *add_object(struct Scene *scene, int type) base= scene_add_base(scene, ob); scene_select_base(scene, base); - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; return ob; } @@ -1153,12 +1169,13 @@ ParticleSystem *copy_particlesystem(ParticleSystem *psys) } BLI_duplicatelist(&psysn->targets, &psys->targets); - + psysn->pathcache= NULL; psysn->childcache= NULL; psysn->edit= NULL; psysn->frand= NULL; psysn->pdd= NULL; + psysn->effectors= NULL; psysn->pathcachebufs.first = psysn->pathcachebufs.last = NULL; psysn->childcachebufs.first = psysn->childcachebufs.last = NULL; @@ -1277,6 +1294,7 @@ Object *copy_object(Object *ob) for (md=ob->modifiers.first; md; md=md->next) { ModifierData *nmd = modifier_new(md->type); + BLI_strncpy(nmd->name, md->name, sizeof(nmd->name)); modifier_copyData(md, nmd); BLI_addtail(&obn->modifiers, nmd); } @@ -1295,14 +1313,14 @@ Object *copy_object(Object *ob) armature_rebuild_pose(obn, obn->data); } defgroup_copy_list(&obn->defbase, &ob->defbase); - copy_constraints(&obn->constraints, &ob->constraints); + copy_constraints(&obn->constraints, &ob->constraints, TRUE); obn->mode = 0; obn->sculpt = NULL; /* increase user numbers */ id_us_plus((ID *)obn->data); - id_us_plus((ID *)obn->dup_group); + id_lib_extern((ID *)obn->dup_group); for(a=0; a<obn->totcol; a++) id_us_plus((ID *)obn->mat[a]); @@ -1363,9 +1381,9 @@ void make_local_object(Object *ob) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(ob->id.lib==NULL) return; @@ -1482,10 +1500,16 @@ void object_copy_proxy_drivers(Object *ob, Object *target) /* all drivers */ DRIVER_TARGETS_LOOPER(dvar) { - if ((Object *)dtar->id == target) - dtar->id= (ID *)ob; - else - id_lib_extern((ID *)dtar->id); + if(dtar->id) { + if ((Object *)dtar->id == target) + dtar->id= (ID *)ob; + else { + /* only on local objects because this causes indirect links a -> b -> c,blend to point directly to a.blend + * when a.blend has a proxy thats linked into c.blend */ + if(ob->id.lib==NULL) + id_lib_extern((ID *)dtar->id); + } + } } DRIVER_TARGETS_LOOPER_END } @@ -1509,7 +1533,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob) ob->proxy_group= gob; id_lib_extern(&target->id); - ob->recalc= target->recalc= OB_RECALC; + ob->recalc= target->recalc= OB_RECALC_ALL; /* copy transform */ if(gob) { @@ -1578,20 +1602,8 @@ void object_make_proxy(Object *ob, Object *target, Object *gob) /* there is also a timing calculation in drawobject() */ -float bluroffs= 0.0f, fieldoffs= 0.0f; int no_speed_curve= 0; -/* ugly calls from render */ -void set_mblur_offs(float blur) -{ - bluroffs= blur; -} - -void set_field_offs(float field) -{ - fieldoffs= field; -} - void disable_speed_curve(int val) { no_speed_curve= val; @@ -1601,11 +1613,9 @@ void disable_speed_curve(int val) /* ob can be NULL */ float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs) { - /* returns float ( see frame_to_float in ipo.c) */ + /* returns float ( see BKE_curframe in scene.c) */ + cfra += scene->r.subframe; - /* bluroffs and fieldoffs are ugly globals that are set by render */ - cfra+= bluroffs+fieldoffs; - /* global time */ if (scene) cfra*= scene->r.framelen; @@ -1714,10 +1724,8 @@ void object_to_mat4(Object *ob, float mat[][4]) object_to_mat3(ob, tmat); copy_m4_m3(mat, tmat); - - mat[3][0]= ob->loc[0] + ob->dloc[0]; - mat[3][1]= ob->loc[1] + ob->dloc[1]; - mat[3][2]= ob->loc[2] + ob->dloc[2]; + + add_v3_v3v3(mat[3], ob->loc, ob->dloc); } int enable_cu_speed= 1; @@ -1773,7 +1781,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4]) /* vec: 4 items! */ - if( where_on_path(par, ctime, vec, dir, NULL, &radius) ) { + if( where_on_path(par, ctime, vec, dir, NULL, &radius, NULL) ) { if(cu->flag & CU_FOLLOW) { vec_to_quat( quat,dir, ob->trackflag, ob->upflag); @@ -1826,7 +1834,7 @@ static void ob_parbone(Object *ob, Object *par, float mat[][4]) /* but for backwards compatibility, the child has to move to the tail */ VECCOPY(vec, mat[1]); mul_v3_fl(vec, pchan->bone->length); - add_v3_v3v3(mat[3], mat[3], vec); + add_v3_v3(mat[3], vec); } static void give_parvert(Object *par, int nr, float *vec) @@ -1866,7 +1874,7 @@ static void give_parvert(Object *par, int nr, float *vec) vindex= (index)? index[i]: i; if(vindex == nr) { - add_v3_v3v3(vec, vec, mvert[i].co); + add_v3_v3(vec, mvert[i].co); count++; } } @@ -1975,7 +1983,7 @@ static void ob_parvert3(Object *ob, Object *par, float mat[][4]) } else { add_v3_v3v3(mat[3], v1, v2); - add_v3_v3v3(mat[3], mat[3], v3); + add_v3_v3(mat[3], v3); mul_v3_fl(mat[3], 0.3333333f); } } @@ -2042,12 +2050,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime) object_to_mat4(ob, ob->obmat); } - /* Handle tracking */ - if(ob->track) { - if( ctime != ob->track->ctime) where_is_object_time(scene, ob->track, ctime); - solve_tracking (ob, ob->track->obmat); - } - /* solve constraints */ if (ob->constraints.first && !(ob->flag & OB_NO_CONSTRAINTS)) { bConstraintOb *cob; @@ -2142,33 +2144,6 @@ static void solve_parenting (Scene *scene, Object *ob, Object *par, float obmat[ } } -} -void solve_tracking (Object *ob, float targetmat[][4]) -{ - float quat[4]; - float vec[3]; - float totmat[3][3]; - float tmat[4][4]; - - sub_v3_v3v3(vec, ob->obmat[3], targetmat[3]); - vec_to_quat( quat,vec, ob->trackflag, ob->upflag); - quat_to_mat3( totmat,quat); - - if(ob->parent && (ob->transflag & OB_POWERTRACK)) { - /* 'temporal' : clear parent info */ - object_to_mat4(ob, tmat); - tmat[0][3]= ob->obmat[0][3]; - tmat[1][3]= ob->obmat[1][3]; - tmat[2][3]= ob->obmat[2][3]; - tmat[3][0]= ob->obmat[3][0]; - tmat[3][1]= ob->obmat[3][1]; - tmat[3][2]= ob->obmat[3][2]; - tmat[3][3]= ob->obmat[3][3]; - } - else copy_m4_m4(tmat, ob->obmat); - - mul_m4_m3m4(ob->obmat, totmat, tmat); - } void where_is_object(struct Scene *scene, Object *ob) @@ -2190,12 +2165,6 @@ for a lamp that is the child of another object */ int a; /* NO TIMEOFFS */ - - /* no ipo! (because of dloc and realtime-ipos) */ - // XXX old animation system - //ipo= ob->ipo; - //ob->ipo= NULL; - if(ob->parent) { par= ob->parent; @@ -2217,9 +2186,6 @@ for a lamp that is the child of another object */ object_to_mat4(ob, ob->obmat); } - if(ob->track) - solve_tracking(ob, ob->track->obmat); - /* solve constraints */ if (ob->constraints.first) { bConstraintOb *cob; @@ -2228,10 +2194,6 @@ for a lamp that is the child of another object */ solve_constraints(&ob->constraints, cob, (float)scene->r.cfra); constraints_clear_evalob(cob); } - - /* WATCH IT!!! */ - // XXX old animation system - //ob->ipo= ipo; } /* for calculation of the inverse parent transform, only used for editor */ @@ -2243,7 +2205,6 @@ void what_does_parent(Scene *scene, Object *ob, Object *workob) unit_m4(workob->parentinv); unit_m4(workob->constinv); workob->parent= ob->parent; - workob->track= ob->track; workob->trackflag= ob->trackflag; workob->upflag= ob->upflag; @@ -2292,7 +2253,7 @@ BoundBox *object_get_boundbox(Object *ob) bb = mesh_get_bb(ob); } else if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) { - bb= ( (Curve *)ob->data )->bb; + bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb; } else if(ob->type==OB_MBALL) { bb= ob->bb; @@ -2310,6 +2271,44 @@ void object_boundbox_flag(Object *ob, int flag, int set) } } +void object_get_dimensions(Object *ob, float *value) +{ + BoundBox *bb = NULL; + + bb= object_get_boundbox(ob); + if (bb) { + float scale[3]; + + mat4_to_size( scale,ob->obmat); + + value[0] = fabs(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]); + value[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]); + value[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]); + } else { + value[0] = value[1] = value[2] = 0.f; + } +} + +void object_set_dimensions(Object *ob, const float *value) +{ + BoundBox *bb = NULL; + + bb= object_get_boundbox(ob); + if (bb) { + float scale[3], len[3]; + + mat4_to_size( scale,ob->obmat); + + len[0] = bb->vec[4][0] - bb->vec[0][0]; + len[1] = bb->vec[2][1] - bb->vec[0][1]; + len[2] = bb->vec[1][2] - bb->vec[0][2]; + + if (len[0] > 0.f) ob->size[0] = value[0] / len[0]; + if (len[1] > 0.f) ob->size[1] = value[1] / len[1]; + if (len[2] > 0.f) ob->size[2] = value[2] / len[2]; + } +} + void minmax_object(Object *ob, float *min, float *max) { BoundBox bb; @@ -2365,12 +2364,12 @@ void minmax_object(Object *ob, float *min, float *max) default: DO_MINMAX(ob->obmat[3], min, max); - VECCOPY(vec, ob->obmat[3]); - add_v3_v3v3(vec, vec, ob->size); + copy_v3_v3(vec, ob->obmat[3]); + add_v3_v3(vec, ob->size); DO_MINMAX(vec, min, max); - VECCOPY(vec, ob->obmat[3]); - sub_v3_v3v3(vec, vec, ob->size); + copy_v3_v3(vec, ob->obmat[3]); + sub_v3_v3(vec, ob->size); DO_MINMAX(vec, min, max); break; } @@ -2477,11 +2476,26 @@ void object_tfm_restore(Object *ob, void *obtfm_pt) /* requires flags to be set! */ void object_handle_update(Scene *scene, Object *ob) { - if(ob->recalc & OB_RECALC) { - + if(ob->recalc & OB_RECALC_ALL) { + /* speed optimization for animation lookups */ + if(ob->pose) + make_pose_channels_hash(ob->pose); + + if(ob->recalc & OB_RECALC_DATA) { + if(ob->type==OB_ARMATURE) { + /* this happens for reading old files and to match library armatures + with poses we do it ahead of where_is_object to ensure animation + is evaluated on the rebuilt pose, otherwise we get incorrect poses + on file load */ + if(ob->pose==NULL || (ob->pose->flag & POSE_RECALC)) + armature_rebuild_pose(ob, ob->data); + } + } + /* XXX new animsys warning: depsgraph tag OB_RECALC_DATA should not skip drivers, which is only in where_is_object now */ - if(ob->recalc & OB_RECALC) { + // XXX: should this case be OB_RECALC_OB instead? + if(ob->recalc & OB_RECALC_ALL) { if (G.f & G_DEBUG) printf("recalcob %s\n", ob->id.name+2); @@ -2505,6 +2519,8 @@ void object_handle_update(Scene *scene, Object *ob) ID *data_id= (ID *)ob->data; AnimData *adt= BKE_animdata_from_id(data_id); float ctime= (float)scene->r.cfra; // XXX this is bad... + ListBase pidlist; + PTCacheID *pid; if (G.f & G_DEBUG) printf("recalcdata %s\n", ob->id.name+2); @@ -2518,7 +2534,7 @@ void object_handle_update(Scene *scene, Object *ob) BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS); // here was vieweditdatamask? XXX - if(ob->mode & OB_MODE_EDIT) { + if(em) { makeDerivedMesh(scene, ob, em, CD_MASK_BAREMESH); } else makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH); @@ -2537,11 +2553,6 @@ void object_handle_update(Scene *scene, Object *ob) lattice_calc_modifiers(scene, ob); } else if(ob->type==OB_ARMATURE) { - /* this happens for reading old files and to match library armatures with poses */ - // XXX this won't screw up the pose set already... - if(ob->pose==NULL || (ob->pose->flag & POSE_RECALC)) - armature_rebuild_pose(ob, ob->data); - /* evaluate drivers */ BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS); @@ -2592,6 +2603,24 @@ void object_handle_update(Scene *scene, Object *ob) psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated; } } + + /* check if quick cache is needed */ + BKE_ptcache_ids_from_object(&pidlist, ob, scene, MAX_DUPLI_RECUR); + + for(pid=pidlist.first; pid; pid=pid->next) { + if((pid->cache->flag & PTCACHE_BAKED) + || (pid->cache->flag & PTCACHE_QUICK_CACHE)==0) + continue; + + if(pid->cache->flag & PTCACHE_OUTDATED || (pid->cache->flag & PTCACHE_SIMULATION_VALID)==0) { + scene->physics_settings.quick_cache_step = + scene->physics_settings.quick_cache_step ? + MIN2(scene->physics_settings.quick_cache_step, pid->cache->step) : + pid->cache->step; + } + } + + BLI_freelistN(&pidlist); } /* the no-group proxy case, we call update */ @@ -2602,7 +2631,7 @@ void object_handle_update(Scene *scene, Object *ob) object_handle_update(scene, ob->proxy); } - ob->recalc &= ~OB_RECALC; + ob->recalc &= ~OB_RECALC_ALL; } /* the case when this is a group proxy, object_update is called in group.c */ @@ -2717,6 +2746,117 @@ int object_insert_ptcache(Object *ob) return i; } +/* 'lens' may be set for envmap only */ +void object_camera_matrix( + RenderData *rd, Object *camera, int winx, int winy, short field_second, + float winmat[][4], rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor, + float *viewdx, float *viewdy +) { + Camera *cam=NULL; + float pixsize; + float shiftx=0.0, shifty=0.0, winside, viewfac; + + rd->mode &= ~(R_ORTHO|R_PANORAMA); + + /* question mark */ + (*ycor)= rd->yasp / rd->xasp; + if(rd->mode & R_FIELDS) + (*ycor) *= 2.0f; + + if(camera->type==OB_CAMERA) { + cam= camera->data; + + if(cam->type==CAM_ORTHO) rd->mode |= R_ORTHO; + if(cam->flag & CAM_PANORAMA) rd->mode |= R_PANORAMA; + + /* solve this too... all time depending stuff is in convertblender.c? + * Need to update the camera early because it's used for projection matrices + * and other stuff BEFORE the animation update loop is done + * */ +#if 0 // XXX old animation system + if(cam->ipo) { + calc_ipo(cam->ipo, frame_to_float(re->scene, re->r.cfra)); + execute_ipo(&cam->id, cam->ipo); + } +#endif // XXX old animation system + shiftx=cam->shiftx; + shifty=cam->shifty; + (*lens)= cam->lens; + (*clipsta)= cam->clipsta; + (*clipend)= cam->clipend; + } + else if(camera->type==OB_LAMP) { + Lamp *la= camera->data; + float fac= cos( M_PI*la->spotsize/360.0 ); + float phi= acos(fac); + + (*lens)= 16.0*fac/sin(phi); + if((*lens)==0.0f) + (*lens)= 35.0; + (*clipsta)= la->clipsta; + (*clipend)= la->clipend; + } + else { /* envmap exception... */; + if((*lens)==0.0f) + (*lens)= 16.0; + + if((*clipsta)==0.0f || (*clipend)==0.0f) { + (*clipsta)= 0.1f; + (*clipend)= 1000.0f; + } + } + + /* ortho only with camera available */ + if(cam && rd->mode & R_ORTHO) { + if(rd->xasp*winx >= rd->yasp*winy) { + viewfac= winx; + } + else { + viewfac= (*ycor) * winy; + } + /* ortho_scale == 1.0 means exact 1 to 1 mapping */ + pixsize= cam->ortho_scale/viewfac; + } + else { + if(rd->xasp*winx >= rd->yasp*winy) viewfac= ((*lens) * winx)/32.0; + else viewfac= (*ycor) * ((*lens) * winy)/32.0; + pixsize= (*clipsta) / viewfac; + } + + /* viewplane fully centered, zbuffer fills in jittered between -.5 and +.5 */ + winside= MAX2(winx, winy); + viewplane->xmin= -0.5f*(float)winx + shiftx*winside; + viewplane->ymin= -0.5f*(*ycor)*(float)winy + shifty*winside; + viewplane->xmax= 0.5f*(float)winx + shiftx*winside; + viewplane->ymax= 0.5f*(*ycor)*(float)winy + shifty*winside; + + if(field_second) { + if(rd->mode & R_ODDFIELD) { + viewplane->ymin-= 0.5 * (*ycor); + viewplane->ymax-= 0.5 * (*ycor); + } + else { + viewplane->ymin+= 0.5 * (*ycor); + viewplane->ymax+= 0.5 * (*ycor); + } + } + /* the window matrix is used for clipping, and not changed during OSA steps */ + /* using an offset of +0.5 here would give clip errors on edges */ + viewplane->xmin *= pixsize; + viewplane->xmax *= pixsize; + viewplane->ymin *= pixsize; + viewplane->ymax *= pixsize; + + (*viewdx)= pixsize; + (*viewdy)= (*ycor) * pixsize; + + if(rd->mode & R_ORTHO) + orthographic_m4(winmat, viewplane->xmin, viewplane->xmax, viewplane->ymin, viewplane->ymax, *clipsta, *clipend); + else + perspective_m4(winmat, viewplane->xmin, viewplane->xmax, viewplane->ymin, viewplane->ymax, *clipsta, *clipend); + +} + #if 0 static int pc_findindex(ListBase *listbase, int index) { @@ -2761,15 +2901,18 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_m newkey= 1; } - kb= add_keyblock(key, name); - if(newkey || from_mix==FALSE) { /* create from mesh */ + kb= add_keyblock(key, name); mesh_to_key(me, kb); } else { /* copy from current values */ - kb->data= do_ob_key(scene, ob); + float *data= do_ob_key(scene, ob); + + /* create new block with prepared data */ + kb= add_keyblock(key, name); + kb->data= data; kb->totelem= me->totvert; } @@ -2789,16 +2932,20 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_m newkey= 1; } - kb= add_keyblock(key, name); - if(newkey || from_mix==FALSE) { + kb= add_keyblock(key, name); + /* create from lattice */ latt_to_key(lt, kb); } else { /* copy from current values */ + float *data= do_ob_key(scene, ob); + + /* create new block with prepared data */ + kb= add_keyblock(key, name); kb->totelem= lt->pntsu*lt->pntsv*lt->pntsw; - kb->data= do_ob_key(scene, ob); + kb->data= data; } return kb; @@ -2818,16 +2965,19 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_ newkey= 1; } - kb= add_keyblock(key, name); - if(newkey || from_mix==FALSE) { /* create from curve */ + kb= add_keyblock(key, name); curve_to_key(cu, kb, lb); } else { /* copy from current values */ + float *data= do_ob_key(scene, ob); + + /* create new block with prepared data */ + kb= add_keyblock(key, name); kb->totelem= count_curveverts(lb); - kb->data= do_ob_key(scene, ob); + kb->data= data; } return kb; diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c index 55f09eede91..b01f570898e 100644 --- a/source/blender/blenkernel/intern/packedFile.c +++ b/source/blender/blenkernel/intern/packedFile.c @@ -33,10 +33,6 @@ #include <fcntl.h> #include <sys/stat.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifndef WIN32 #include <unistd.h> #else @@ -49,17 +45,14 @@ #include "DNA_sound_types.h" #include "DNA_vfont_types.h" #include "DNA_packedFile_types.h" -#include "DNA_scene_types.h" #include "BLI_blenlib.h" #include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_main.h" -#include "BKE_screen.h" #include "BKE_sound.h" #include "BKE_image.h" -#include "BKE_font.h" #include "BKE_packedFile.h" #include "BKE_report.h" @@ -186,14 +179,14 @@ PackedFile *newPackedFile(ReportList *reports, char *filename) // convert relative filenames to absolute filenames strcpy(name, filename); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); // open the file // and create a PackedFile structure file= open(name, O_BINARY|O_RDONLY); if (file <= 0) { - BKE_reportf(reports, RPT_ERROR, "Can't open file: \"%s\"", name); + BKE_reportf(reports, RPT_ERROR, "Unable to pack file, source path not found: \"%s\"", name); } else { filelen = BLI_filesize(file); @@ -223,15 +216,15 @@ void packAll(Main *bmain, ReportList *reports) bSound *sound; for(ima=bmain->image.first; ima; ima=ima->id.next) - if(ima->packedfile == NULL) + if(ima->packedfile == NULL && ima->id.lib==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) ima->packedfile = newPackedFile(reports, ima->name); for(vf=bmain->vfont.first; vf; vf=vf->id.next) - if(vf->packedfile == NULL) + if(vf->packedfile == NULL && vf->id.lib==NULL) vf->packedfile = newPackedFile(reports, vf->name); for(sound=bmain->sound.first; sound; sound=sound->id.next) - if(sound->packedfile == NULL) + if(sound->packedfile == NULL && sound->id.lib==NULL) sound->packedfile = newPackedFile(reports, sound->name); } @@ -271,10 +264,10 @@ int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int gui char tempname[FILE_MAXDIR + FILE_MAXFILE]; /* void *data; */ - if (guimode); //XXX waitcursor(1); + if (guimode) {} //XXX waitcursor(1); strcpy(name, filename); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); if (BLI_exists(name)) { for (number = 1; number <= 999; number++) { @@ -315,7 +308,7 @@ int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int gui } } - if(guimode); //XXX waitcursor(0); + if(guimode) {} //XXX waitcursor(0); return (ret_value); } @@ -339,7 +332,7 @@ int checkPackedFile(char *filename, PackedFile *pf) char name[FILE_MAXDIR + FILE_MAXFILE]; strcpy(name, filename); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); if (stat(name, &st)) { ret_val = PF_NOFILE; diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 5728c7a1fe0..cf5deb95258 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -27,13 +27,11 @@ #include "MEM_guardedalloc.h" -#include "DNA_brush_types.h" #include "DNA_object_types.h" #include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "BKE_brush.h" -#include "BKE_global.h" #include "BKE_library.h" #include "BKE_paint.h" diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 7cee4b1d7bb..4c68c5487c8 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -35,27 +35,15 @@ #include "MEM_guardedalloc.h" -#include "DNA_boid_types.h" #include "DNA_curve_types.h" #include "DNA_group_types.h" -#include "DNA_ipo_types.h" // XXX old animation system stuff to remove! #include "DNA_key_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_force.h" -#include "DNA_object_types.h" #include "DNA_particle_types.h" -#include "DNA_scene_types.h" #include "DNA_smoke_types.h" -#include "DNA_texture_types.h" -#include "BLI_math.h" -#include "BLI_blenlib.h" -#include "BLI_dynstr.h" #include "BLI_kdtree.h" -#include "BLI_listbase.h" #include "BLI_rand.h" #include "BLI_threads.h" #include "BLI_cellalloc.h" @@ -73,9 +61,7 @@ #include "BKE_utildefines.h" #include "BKE_displist.h" #include "BKE_particle.h" -#include "BKE_DerivedMesh.h" #include "BKE_object.h" -#include "BKE_cloth.h" #include "BKE_material.h" #include "BKE_key.h" #include "BKE_library.h" @@ -370,6 +356,12 @@ int psys_uses_gravity(ParticleSimulationData *sim) /************************************************/ /* Freeing stuff */ /************************************************/ +void fluid_free_settings(SPHFluidSettings *fluid) +{ + if(fluid) + MEM_freeN(fluid); +} + void psys_free_settings(ParticleSettings *part) { BKE_free_animdata(&part->id); @@ -382,6 +374,7 @@ void psys_free_settings(ParticleSettings *part) BLI_freelistN(&part->dupliweights); boid_free_settings(part->boids); + fluid_free_settings(part->fluid); } void free_hair(Object *ob, ParticleSystem *psys, int dynamics) @@ -404,7 +397,7 @@ void free_hair(Object *ob, ParticleSystem *psys, int dynamics) if(dynamics) { BKE_ptcache_free_list(&psys->ptcaches); psys->clmd->point_cache = psys->pointcache = NULL; - psys->clmd->ptcaches.first = psys->clmd->ptcaches.first = NULL; + psys->clmd->ptcaches.first = psys->clmd->ptcaches.last = NULL; modifier_free((ModifierData*)psys->clmd); @@ -441,7 +434,7 @@ void free_keyed_keys(ParticleSystem *psys) } } } -static void free_child_path_cache(ParticleSystem *psys) +void psys_free_child_path_cache(ParticleSystem *psys) { psys_free_path_cache_buffers(psys->childcache, &psys->childcachebufs); psys->childcache = NULL; @@ -459,7 +452,7 @@ void psys_free_path_cache(ParticleSystem *psys, PTCacheEdit *edit) psys->pathcache= NULL; psys->totcached= 0; - free_child_path_cache(psys); + psys_free_child_path_cache(psys); } } void psys_free_children(ParticleSystem *psys) @@ -470,7 +463,7 @@ void psys_free_children(ParticleSystem *psys) psys->totchild=0; } - free_child_path_cache(psys); + psys_free_child_path_cache(psys); } void psys_free_particles(ParticleSystem *psys) { @@ -1045,6 +1038,7 @@ typedef struct ParticleInterpolationData { ParticleKey *kkey[2]; PointCache *cache; + PTCacheMem *pm; PTCacheEditPoint *epoint; PTCacheEditKey *ekey[2]; @@ -1053,31 +1047,74 @@ typedef struct ParticleInterpolationData { int bspline; } ParticleInterpolationData; /* Assumes pointcache->mem_cache exists, so for disk cached particles call psys_make_temp_pointcache() before use */ -static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, int index, float t, ParticleKey *key1, ParticleKey *key2) +/* It uses ParticleInterpolationData->pm to store the current memory cache frame so it's thread safe. */ +static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2) { - static PTCacheMem *pm = NULL; /* not thread safe */ + static PTCacheMem *pm = NULL; if(index < 0) { /* initialize */ - pm = cache->mem_cache.first; + *cur = cache->mem_cache.first; - if(pm) - pm = pm->next; + if(*cur) + *cur = (*cur)->next; } else { - if(pm) { - while(pm && pm->next && (float)pm->frame < t) - pm = pm->next; + if(*cur) { + while(*cur && (*cur)->next && (float)(*cur)->frame < t) + *cur = (*cur)->next; - BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] : index, pm->data, (float)pm->frame); - BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] : index, pm->prev->data, (float)pm->prev->frame); + pm = *cur; + + BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame); + if(pm->prev->index_array && pm->prev->index_array[index] == 0) + copy_particle_key(key1, key2, 1); + else + BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] - 1 : index, pm->prev->data, (float)pm->prev->frame); } else if(cache->mem_cache.first) { - PTCacheMem *pm2 = cache->mem_cache.first; - BKE_ptcache_make_particle_key(key2, pm2->index_array ? pm2->index_array[index] : index, pm2->data, (float)pm2->frame); + pm = cache->mem_cache.first; + BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame); copy_particle_key(key1, key2, 1); } } } +static int get_pointcache_times_for_particle(PointCache *cache, int index, float *start, float *end) +{ + PTCacheMem *pm; + int ret = 0; + + for(pm=cache->mem_cache.first; pm; pm=pm->next) { + if(pm->index_array) { + if(pm->index_array[index]) { + *start = pm->frame; + ret++; + break; + } + } + else { + *start = pm->frame; + ret++; + break; + } + } + + for(pm=cache->mem_cache.last; pm; pm=pm->prev) { + if(pm->index_array) { + if(pm->index_array[index]) { + *end = pm->frame; + ret++; + break; + } + } + else { + *end = pm->frame; + ret++; + break; + } + } + + return ret == 2; +} static void init_particle_interpolation(Object *ob, ParticleSystem *psys, ParticleData *pa, ParticleInterpolationData *pind) { @@ -1099,10 +1136,15 @@ static void init_particle_interpolation(Object *ob, ParticleSystem *psys, Partic pind->dietime = (key + pa->totkey - 1)->time; } else if(pind->cache) { - get_pointcache_keys_for_time(ob, pind->cache, -1, 0.0f, NULL, NULL); - + float start, end; + get_pointcache_keys_for_time(ob, pind->cache, &pind->pm, -1, 0.0f, NULL, NULL); pind->birthtime = pa ? pa->time : pind->cache->startframe; pind->dietime = pa ? pa->dietime : pind->cache->endframe; + + if(get_pointcache_times_for_particle(pind->cache, pa - psys->particles, &start, &end)) { + pind->birthtime = MAX2(pind->birthtime, start); + pind->dietime = MIN2(pind->dietime, end); + } } else { HairKey *key = pa->hair; @@ -1145,6 +1187,9 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData int point_vel = (point && point->keys->vel); float real_t, dfra, keytime; + /* billboards wont fill in all of these, so start cleared */ + memset(keys, 0, sizeof(keys)); + /* interpret timing and find keys */ if(point) { if(result->time < 0.0f) @@ -1229,7 +1274,7 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData memcpy(keys + 2, pind->kkey[1], sizeof(ParticleKey)); } else if(pind->cache) { - get_pointcache_keys_for_time(NULL, pind->cache, p, real_t, keys+1, keys+2); + get_pointcache_keys_for_time(NULL, pind->cache, &pind->pm, p, real_t, keys+1, keys+2); } else { hair_to_particle(keys + 1, pind->hkey[0]); @@ -1993,7 +2038,7 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time) float effect[3] = {0.0f, 0.0f, 0.0f}, veffect[3] = {0.0f, 0.0f, 0.0f}; float guidevec[4], guidedir[3], rot2[4], temp[3]; - float guidetime, radius, angle, totstrength = 0.0f; + float guidetime, radius, weight, angle, totstrength = 0.0f; float vec_to_point[3]; if(effectors) for(eff = effectors->first; eff; eff=eff->next) { @@ -2015,11 +2060,11 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time) cu = (Curve*)eff->ob->data; if(pd->flag & PFIELD_GUIDE_PATH_ADD) { - if(where_on_path(eff->ob, data->strength * guidetime, guidevec, guidedir, NULL, &radius)==0) + if(where_on_path(eff->ob, data->strength * guidetime, guidevec, guidedir, NULL, &radius, &weight)==0) return 0; } else { - if(where_on_path(eff->ob, guidetime, guidevec, guidedir, NULL, &radius)==0) + if(where_on_path(eff->ob, guidetime, guidevec, guidedir, NULL, &radius, &weight)==0) return 0; } @@ -2059,10 +2104,14 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time) VECCOPY(vec_to_point, key.co); VECADD(vec_to_point, vec_to_point, guidevec); + //VECSUB(pa_loc,pa_loc,pa_zero); VECADDFAC(effect, effect, vec_to_point, data->strength); VECADDFAC(veffect, veffect, guidedir, data->strength); totstrength += data->strength; + + if(pd->flag & PFIELD_GUIDE_PATH_WEIGHT) + totstrength *= weight; } if(totstrength != 0.0){ @@ -2130,7 +2179,7 @@ static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheK mul_v3_fl(force, effector*pow((float)k / (float)steps, 100.0f * sim->psys->part->eff_hair) / (float)steps); - add_v3_v3v3(force, force, vec); + add_v3_v3(force, vec); normalize_v3(force); @@ -2673,7 +2722,7 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd } else { /* clear out old and create new empty path cache */ - free_child_path_cache(sim->psys); + psys_free_child_path_cache(sim->psys); sim->psys->childcache= psys_alloc_path_cache_buffers(&sim->psys->childcachebufs, totchild, ctx->steps+1); sim->psys->totchildcache = totchild; } @@ -2744,7 +2793,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra) int keyed, baked; /* we don't have anything valid to create paths from so let's quit here */ - if((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache->flag & PTCACHE_BAKED)==0) + if((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache)==0) return; if(psys_in_edit_mode(sim->scene, psys)) @@ -2754,7 +2803,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra) BLI_srandom(psys->seed); keyed = psys->flag & PSYS_KEYED; - baked = !hair_dm && psys->pointcache->flag & PTCACHE_BAKED; + baked = !hair_dm && psys->pointcache->mem_cache.first; /* clear out old and create new empty path cache */ psys_free_path_cache(psys, psys->edit); @@ -2941,7 +2990,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf ParticleCacheKey *ca, **cache= edit->pathcache; ParticleEditSettings *pset = &scene->toolsettings->particle; - PTCacheEditPoint *point = edit->points; + PTCacheEditPoint *point = NULL; PTCacheEditKey *ekey = NULL; ParticleSystem *psys = edit->psys; @@ -2954,9 +3003,9 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf float birthtime = 0.0, dietime = 0.0; float t, time = 0.0, keytime = 0.0, frs_sec; float hairmat[4][4], rotmat[3][3], prev_tangent[3]; - int k,i; + int k, i; int steps = (int)pow(2.0, (double)pset->draw_step); - int totpart = edit->totpoint; + int totpart = edit->totpoint, recalc_set=0; float sel_col[3]; float nosel_col[3]; @@ -2966,6 +3015,11 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf /* clear out old and create new empty path cache */ psys_free_path_cache(edit->psys, edit); cache= edit->pathcache= psys_alloc_path_cache_buffers(&edit->pathcachebufs, totpart, steps+1); + + /* set flag for update (child particles check this too) */ + for(i=0, point=edit->points; i<totpart; i++, point++) + point->flag |= PEP_EDIT_RECALC; + recalc_set = 1; } frs_sec = (psys || edit->pid.flag & PTCACHE_VEL_PER_SEC) ? 25.0f : 1.0f; @@ -2987,7 +3041,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf } /*---first main loop: create all actual particles' paths---*/ - for(i=0; i<totpart; i++, pa+=pa?1:0, point++){ + for(i=0, point=edit->points; i<totpart; i++, pa+=pa?1:0, point++){ if(edit->totcached && !(point->flag & PEP_EDIT_RECALC)) continue; @@ -3096,17 +3150,26 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf /* selection coloring in edit mode */ if(pset->brushtype==PE_BRUSH_WEIGHT){ - if(k==0) + float t2; + + if(k==0) { weight_to_rgb(pind.hkey[1]->weight, ca->col, ca->col+1, ca->col+2); - else if(k >= steps - 1) - weight_to_rgb(pind.hkey[0]->weight, ca->col, ca->col+1, ca->col+2); - else - weight_to_rgb((1.0f - keytime) * pind.hkey[0]->weight + keytime * pind.hkey[1]->weight, ca->col, ca->col+1, ca->col+2); + } else { + float w1[3], w2[3]; + keytime = (t - (*pind.ekey[0]->time))/((*pind.ekey[1]->time) - (*pind.ekey[0]->time)); + + weight_to_rgb(pind.hkey[0]->weight, w1, w1+1, w1+2); + weight_to_rgb(pind.hkey[1]->weight, w2, w2+1, w2+2); + + interp_v3_v3v3(ca->col, w1, w2, keytime); + } /* at the moment this is only used for weight painting. * will need to move out of this check if its used elsewhere. */ - pind.hkey[0] = pind.hkey[1]; - pind.hkey[1]++; + t2 = birthtime + ((float)(k+1)/(float)steps) * (dietime - birthtime); + + while (pind.hkey[1]->time < t2) pind.hkey[1]++; + pind.hkey[0] = pind.hkey[1] - 1; } else { if((ekey + (pind.ekey[0] - point->keys))->flag & PEK_SELECT){ @@ -3135,10 +3198,16 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf edit->totcached = totpart; - if(psys && psys->part->type == PART_HAIR) { + if(psys) { ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys), NULL}; psys_cache_child_paths(&sim, cfra, 1); } + + /* clear recalc flag if set here */ + if(recalc_set) { + for(i=0, point=edit->points; i<totpart; i++, point++) + point->flag &= ~PEP_EDIT_RECALC; + } } /************************************************/ /* Particle Key handling */ @@ -3468,6 +3537,7 @@ ParticleSettings *psys_copy_settings(ParticleSettings *part) partn= copy_libblock(part); if(partn->pd) partn->pd= MEM_dupallocN(part->pd); if(partn->pd2) partn->pd2= MEM_dupallocN(part->pd2); + partn->effector_weights = MEM_dupallocN(part->effector_weights); partn->boids = boid_copy_settings(part->boids); @@ -3481,9 +3551,9 @@ void make_local_particlesettings(ParticleSettings *part) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(part->id.lib==0) return; if(part->id.us==1) { @@ -4188,8 +4258,13 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo num= pa->num_dmcache; if(num == DMCACHE_NOTFOUND) - if(pa->num < psmd->dm->getNumTessFaces(psmd->dm)) - num= pa->num; + num= pa->num; + + if (num >= psmd->dm->getNumFaces(psmd->dm)) { + /* happens when simplify is enabled + * gives invalid coords but would crash otherwise */ + num= DMCACHE_NOTFOUND; + } if(mtface && num != DMCACHE_NOTFOUND) { mface= psmd->dm->getTessFaceData(psmd->dm, num, CD_MFACE); @@ -4212,18 +4287,11 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa ParticleSystem *psys = sim->psys; ParticleSystemModifierData *psmd = sim->psmd; float loc[3], nor[3], vec[3], side[3], len, obrotmat[4][4], qmat[4][4]; - float xvec[3] = {-1.0, 0.0, 0.0}, q[4]; + float xvec[3] = {-1.0, 0.0, 0.0}, q[4], nmat[3][3]; sub_v3_v3v3(vec, (cache+cache->steps-1)->co, cache->co); len= normalize_v3(vec); - if(pa) - psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0); - else - psys_particle_on_emitter(psmd, - (psys->part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE, - cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0); - if(psys->part->rotmode) { if(!pa) pa= psys->particles+cpa->pa[0]; @@ -4236,6 +4304,17 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa mul_m4_m4m4(mat, obrotmat, qmat); } else { + if(pa) + psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0); + else + psys_particle_on_emitter(psmd, + (psys->part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE, + cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0); + + copy_m3_m4(nmat, ob->imat); + transpose_m3(nmat); + mul_m3_v3(nmat, nor); + /* make sure that we get a proper side vector */ if(fabs(dot_v3v3(nor,vec))>0.999999) { if(fabs(dot_v3v3(nor,xvec))>0.999999) { @@ -4253,7 +4332,7 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa normalize_v3(side); cross_v3_v3v3(nor, vec, side); - unit_m4(mat); + unit_m4(mat); VECCOPY(mat[0], vec); VECCOPY(mat[1], side); VECCOPY(mat[2], nor); @@ -4269,6 +4348,23 @@ void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3] xvec[0] = 1.0f; xvec[1] = 0.0f; xvec[2] = 0.0f; yvec[0] = 0.0f; yvec[1] = 1.0f; yvec[2] = 0.0f; + /* can happen with bad pointcache or physics calculation + * since this becomes geometry, nan's and inf's crash raytrace code. + * better not allow this. */ + if( !finite(bb->vec[0]) || !finite(bb->vec[1]) || !finite(bb->vec[2]) || + !finite(bb->vel[0]) || !finite(bb->vel[1]) || !finite(bb->vel[2]) ) + { + zero_v3(bb->vec); + zero_v3(bb->vel); + + zero_v3(xvec); + zero_v3(yvec); + zero_v3(zvec); + zero_v3(center); + + return; + } + if(bb->align < PART_BB_VIEW) onevec[bb->align]=1.0f; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index b057976e3b5..a128cfaedf9 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -24,7 +24,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Raul Fernandez Hernandez (Farsthary), Stephen Swhitehorn. * * ***** END GPL LICENSE BLOCK ***** */ @@ -159,8 +159,7 @@ void psys_reset(ParticleSystem *psys, int mode) psys_free_path_cache(psys, psys->edit); /* reset point cache */ - psys->pointcache->flag &= ~PTCACHE_SIMULATION_VALID; - psys->pointcache->simframe= 0; + BKE_ptcache_invalidate(psys->pointcache); } static void realloc_particles(ParticleSimulationData *sim, int new_totpart) @@ -287,7 +286,7 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys) node: the allocated links - total derived mesh element count nodearray: the array of nodes aligned with the base mesh's elements, so - each original elements can reference its derived elements + each original elements can reference its derived elements */ Mesh *me= (Mesh*)ob->data; PARTICLE_P; @@ -512,18 +511,18 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys) static void hammersley_create(float *out, int n, int seed, float amount) { RNG *rng; - double p, t, offs[2]; - int k, kk; + double p, t, offs[2]; + int k, kk; rng = rng_new(31415926 + n + seed); offs[0]= rng_getDouble(rng) + amount; offs[1]= rng_getDouble(rng) + amount; rng_free(rng); - for (k = 0; k < n; k++) { - t = 0; - for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1) - if (kk & 1) /* kk mod 2 = 1 */ + for (k = 0; k < n; k++) { + t = 0; + for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1) + if (kk & 1) /* kk mod 2 = 1 */ t += p; out[2*k + 0]= fmod((double)k/(double)n + offs[0], 1.0); @@ -546,7 +545,7 @@ static void init_mv_jit(float *jit, int num, int seed2, float amount) rng = rng_new(31415926 + num + seed2); x= 0; - num2 = 2 * num; + num2 = 2 * num; for(i=0; i<num2; i+=2) { jit[i]= x + amount*rad1*(0.5f - rng_getFloat(rng)); @@ -618,6 +617,10 @@ static int binary_search_distribution(float *sum, int n, float value) return low; } +/* the max number if calls to rng_* funcs within psys_thread_distribute_particle + * be sure to keep up to date if this changes */ +#define PSYS_RND_DIST_SKIP 2 + /* note: this function must be thread safe, for from == PART_FROM_CHILD */ #define ONLY_WORKING_WITH_PA_VERTS 0 static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, ChildParticle *cpa, int p) @@ -633,6 +636,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData int cfrom= ctx->cfrom; int distr= ctx->distr; int i, intersect, tot; + int rng_skip_tot= PSYS_RND_DIST_SKIP; /* count how many rng_* calls wont need skipping */ if(from == PART_FROM_VERT) { /* TODO_PARTICLE - use original index */ @@ -670,6 +674,8 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData case PART_DISTR_RAND: randu= rng_getFloat(thread->rng); randv= rng_getFloat(thread->rng); + rng_skip_tot -= 2; + psys_uv_to_w(randu, randv, mface->v4, pa->fuv); break; } @@ -752,6 +758,8 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData randu= rng_getFloat(thread->rng); randv= rng_getFloat(thread->rng); + rng_skip_tot -= 2; + psys_uv_to_w(randu, randv, mf->v4, cpa->fuv); cpa->num = ctx->index[p]; @@ -860,6 +868,9 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData cpa->parent=cpa->pa[0]; } } + + if(rng_skip_tot > 0) /* should never be below zero */ + rng_skip(thread->rng, rng_skip_tot); } static void *exec_distribution(void *data) @@ -876,12 +887,12 @@ static void *exec_distribution(void *data) for(p=0; p<totpart; p++, cpa++) { if(thread->ctx->skip) /* simplification skip */ - rng_skip(thread->rng, 5*thread->ctx->skip[p]); + rng_skip(thread->rng, PSYS_RND_DIST_SKIP * thread->ctx->skip[p]); if((p+thread->num) % thread->tot == 0) psys_thread_distribute_particle(thread, NULL, cpa, p); else /* thread skip */ - rng_skip(thread->rng, 5); + rng_skip(thread->rng, PSYS_RND_DIST_SKIP); } } else { @@ -2215,21 +2226,17 @@ static void set_keyed_keys(ParticleSimulationData *sim) void psys_make_temp_pointcache(Object *ob, ParticleSystem *psys) { PointCache *cache = psys->pointcache; - PTCacheID pid; - if((cache->flag & PTCACHE_DISK_CACHE)==0 || cache->mem_cache.first) - return; - - BKE_ptcache_id_from_particles(&pid, ob, psys); - - BKE_ptcache_disk_to_mem(&pid); + if(cache->flag & PTCACHE_DISK_CACHE && cache->mem_cache.first == NULL) { + PTCacheID pid; + BKE_ptcache_id_from_particles(&pid, ob, psys); + BKE_ptcache_disk_to_mem(&pid); + } } static void psys_clear_temp_pointcache(ParticleSystem *psys) { - if((psys->pointcache->flag & PTCACHE_DISK_CACHE)==0) - return; - - BKE_ptcache_free_mem(&psys->pointcache->mem_cache); + if(psys->pointcache->flag & PTCACHE_DISK_CACHE) + BKE_ptcache_free_mem(&psys->pointcache->mem_cache); } void psys_get_pointcache_start_end(Scene *scene, ParticleSystem *psys, int *sfra, int *efra) { @@ -2275,6 +2282,136 @@ static void psys_update_effectors(ParticleSimulationData *sim) precalc_guides(sim, sim->psys->effectors); } +/************************************************* + SPH fluid physics + + In theory, there could be unlimited implementation + of SPH simulators +**************************************************/ +void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra, float mass){ +/**************************************************************************************************************** +* This code uses in some parts adapted algorithms from the pseduo code as outlined in the Research paper +* Titled: Particle-based Viscoelastic Fluid Simulation. +* Authors: Simon Clavet, Philippe Beaudoin and Pierre Poulin +* +* Website: http://www.iro.umontreal.ca/labs/infographie/papers/Clavet-2005-PVFS/ +* Presented at Siggraph, (2005) +* +*****************************************************************************************************************/ + KDTree *tree = psys->tree; + KDTreeNearest *ptn = NULL; + + SPHFluidSettings *fluid = part->fluid; + ParticleData *second_particle; + + float start[3], end[3], v[3]; + float temp[3]; + float q, radius, D; + float p, pnear, pressure_near, pressure; + float dtime = dfra * psys_get_timestep(sim); + float omega = fluid->viscosity_omega; + float beta = fluid->viscosity_omega; + float massfactor = 1.0f/mass; + int n, neighbours; + + + radius = fluid->radius; + + VECCOPY(start, pa->prev_state.co); + VECCOPY(end, pa->state.co); + + VECCOPY(v, pa->state.vel); + + neighbours = BLI_kdtree_range_search(tree, radius, start, NULL, &ptn); + + /* use ptn[n].co to store relative direction */ + for(n=1; n<neighbours; n++) { + sub_v3_v3(ptn[n].co, start); + normalize_v3(ptn[n].co); + } + + /* Viscosity - Algorithm 5 */ + if (omega > 0.f || beta > 0.f) { + float u, I; + + for(n=1; n<neighbours; n++) { + second_particle = psys->particles + ptn[n].index; + q = ptn[n].dist/radius; + + sub_v3_v3v3(temp, v, second_particle->prev_state.vel); + + u = dot_v3v3(ptn[n].co, temp); + + if (u > 0){ + I = dtime * ((1-q) * (omega * u + beta * u*u)) * 0.5f; + madd_v3_v3fl(v, ptn[n].co, -I * massfactor); + } + } + } + + /* Hooke's spring force */ + if (fluid->spring_k > 0.f) { + float D, L = fluid->rest_length; + for(n=1; n<neighbours; n++) { + /* L is a factor of radius */ + D = dtime * 10.f * fluid->spring_k * (1.f - L) * (L - ptn[n].dist/radius); + madd_v3_v3fl(v, ptn[n].co, -D * massfactor); + } + } + /* Update particle position */ + VECADDFAC(end, start, v, dtime); + + /* Double Density Relaxation - Algorithm 2 */ + p = 0; + pnear = 0; + for(n=1; n<neighbours; n++) { + q = ptn[n].dist/radius; + p += ((1-q)*(1-q)); + pnear += ((1-q)*(1-q)*(1-q)); + } + p *= part->mass; + pnear *= part->mass; + pressure = fluid->stiffness_k * (p - fluid->rest_density); + pressure_near = fluid->stiffness_knear * pnear; + + for(n=1; n<neighbours; n++) { + q = ptn[n].dist/radius; + + D = dtime * dtime * (pressure*(1-q) + pressure_near*(1-q)*(1-q))* 0.5f; + madd_v3_v3fl(end, ptn[n].co, -D * massfactor); + } + + /* Artificial buoyancy force in negative gravity direction */ + if (fluid->buoyancy >= 0.f && psys_uses_gravity(sim)) { + float B = -dtime * dtime * fluid->buoyancy * (p - fluid->rest_density) * 0.5f; + madd_v3_v3fl(end, sim->scene->physics_settings.gravity, -B * massfactor); + } + + /* apply final result and recalculate velocity */ + VECCOPY(pa->state.co, end); + sub_v3_v3v3(pa->state.vel, end, start); + mul_v3_fl(pa->state.vel, 1.f/dtime); + + if(ptn){ MEM_freeN(ptn); ptn=NULL;} +} + +static void apply_particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra){ + ParticleTarget *pt; +// float dtime = dfra*psys_get_timestep(sim); + float particle_mass = part->mass; + + particle_fluidsim(psys, pa, part, sim, dfra, cfra, particle_mass); + + /*----check other SPH systems (Multifluids) , each fluid has its own parameters---*/ + for(pt=sim->psys->targets.first; pt; pt=pt->next) { + ParticleSystem *epsys = psys_get_target_system(sim->ob, pt); + + if(epsys) + particle_fluidsim(epsys, pa, epsys->part, sim, dfra, cfra, particle_mass); + } + /*----------------------------------------------------------------*/ +} + /************************************************/ /* Newtonian physics */ /************************************************/ @@ -2720,6 +2857,12 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo VECCOPY(col.co1, pa->prev_state.co); VECCOPY(col.co2, pa->state.co); + + VECCOPY(col.ve1, pa->prev_state.vel); + VECCOPY(col.ve2, pa->state.vel); + mul_v3_fl(col.ve1, timestep * dfra); + mul_v3_fl(col.ve2, timestep * dfra); + col.t = 0.0f; /* override for boids */ @@ -2765,12 +2908,20 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo int through = (BLI_frand() < pd->pdef_perm) ? 1 : 0; float co[3]; /* point of collision */ float vec[3]; /* movement through collision */ - float t = hit.dist/col.ray_len; /* time of collision between this iteration */ - float dt = col.t + t * (1.0f - col.t); /* time of collision between frame change*/ + float acc[3]; /* acceleration */ - interp_v3_v3v3(co, col.co1, col.co2, t); + float x = hit.dist/col.ray_len; /* location of collision between this iteration */ + float le = len_v3(col.ve1)/col.ray_len; + float ac = len_v3(col.ve2)/col.ray_len - le; /* (taking acceleration into account) */ + float t = (-le + sqrt(le*le + 2*ac*x))/ac; /* time of collision between this iteration */ + float dt = col.t + x * (1.0f - col.t); /* time of collision between frame change*/ + float it = 1.0 - t; + + interp_v3_v3v3(co, col.co1, col.co2, x); VECSUB(vec, col.co2, col.co1); + VECSUB(acc, col.ve2, col.ve1); + mul_v3_fl(col.vel, 1.0f-col.t); /* particle dies in collision */ @@ -2790,7 +2941,7 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo deflections=max_deflections; } else { - float nor_vec[3], tan_vec[3], tan_vel[3], vel[3]; + float nor_vec[3], tan_vec[3], tan_vel[3]; float damp, frict; float inp, inp_v; @@ -2867,10 +3018,6 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo /* combine components together again */ VECADD(vec, nor_vec, tan_vec); - /* calculate velocity from collision vector */ - VECCOPY(vel, vec); - mul_v3_fl(vel, 1.0f/MAX2((timestep*dfra) * (1.0f - col.t), 0.00001)); - /* make sure we don't hit the current face again */ VECADDFAC(co, co, col.nor, (through ? -0.0001f : 0.0001f)); @@ -2878,21 +3025,25 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo BoidParticle *bpa = pa->boid; if(bpa->data.mode == eBoidMode_OnLand || co[2] <= boid_z) { co[2] = boid_z; - vel[2] = 0.0f; + vec[2] = 0.0f; } } - /* store state for reactors */ - //VECCOPY(reaction_state.co, co); - //interp_v3_v3v3(reaction_state.vel, pa->prev_state.vel, pa->state.vel, dt); - //interp_qt_qtqt(reaction_state.rot, pa->prev_state.rot, pa->state.rot, dt); - /* set coordinates for next iteration */ - VECCOPY(col.co1, co); - VECADDFAC(col.co2, co, vec, 1.0f - t); - col.t = dt; + + /* apply acceleration to final position, but make sure particle stays above surface */ + madd_v3_v3v3fl(acc, vec, acc, it); + ac = dot_v3v3(acc, col.nor); + if((!through && ac < 0.0f) || (through && ac > 0.0f)) + madd_v3_v3fl(acc, col.nor, -ac); - if(len_v3(vec) < 0.001 && len_v3(pa->state.vel) < 0.001) { + VECCOPY(col.co1, co); + VECADDFAC(col.co2, co, acc, it); + + VECCOPY(col.ve1, vec); + VECCOPY(col.ve2, acc); + + if(len_v3(vec) < 0.001 && len_v3v3(pa->state.co, pa->prev_state.co) < 0.001) { /* kill speed to stop slipping */ VECCOPY(pa->state.vel,zerovec); VECCOPY(pa->state.co, co); @@ -2902,10 +3053,14 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo } else { VECCOPY(pa->state.co, col.co2); + mul_v3_v3fl(pa->state.vel, acc, 1.0f/MAX2((timestep*dfra) * (1.0f - col.t), 0.00001)); + /* Stickness to surface */ normalize_v3(nor_vec); - VECADDFAC(pa->state.vel, vel, nor_vec, -pd->pdef_stickness); + madd_v3_v3fl(pa->state.vel, nor_vec, -pd->pdef_stickness); } + + col.t = dt; } deflections++; @@ -2920,66 +3075,18 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo /* Hair */ /************************************************/ /* check if path cache or children need updating and do it if needed */ -static void psys_update_path_cache(ParticleSimulationData *sim, float cfra) +void psys_update_path_cache(ParticleSimulationData *sim, float cfra) { ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; - ParticleEditSettings *pset = &sim->scene->toolsettings->particle; - int distr=0, alloc=0, skip=0; - - if((psys->part->childtype && psys->totchild != get_psys_tot_child(sim->scene, psys)) || psys->recalc&PSYS_RECALC_RESET) - alloc=1; - - if(alloc || psys->recalc&PSYS_RECALC_CHILD || (psys->vgroup[PSYS_VG_DENSITY] && (sim->ob && sim->ob->mode & OB_MODE_WEIGHT_PAINT))) - distr=1; - - if(distr){ - if(alloc) - realloc_particles(sim, sim->psys->totpart); - - if(get_psys_tot_child(sim->scene, psys)) { - /* don't generate children while computing the hair keys */ - if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) { - distribute_particles(sim, PART_FROM_CHILD); - - if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0) - psys_find_parents(sim); - } - } - else - psys_free_children(psys); - } - - if((part->type==PART_HAIR || psys->flag&PSYS_KEYED || psys->pointcache->flag & PTCACHE_BAKED)==0) - skip = 1; /* only hair, keyed and baked stuff can have paths */ - else if(part->ren_as != PART_DRAW_PATH && !(part->type==PART_HAIR && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR))) - skip = 1; /* particle visualization must be set as path */ - else if(!psys->renderdata) { - if(part->draw_as != PART_DRAW_REND) - skip = 1; /* draw visualization */ - else if(psys->pointcache->flag & PTCACHE_BAKING) - skip = 1; /* no need to cache paths while baking dynamics */ - else if(psys_in_edit_mode(sim->scene, psys)) { - if((pset->flag & PE_DRAW_PART)==0) - skip = 1; - else if(part->childtype==0 && (psys->flag & PSYS_HAIR_DYNAMICS && psys->pointcache->flag & PTCACHE_BAKED)==0) - skip = 1; /* in edit mode paths are needed for child particles and dynamic hair */ - } - } - - if(!skip) { + + /* only hair, keyed and baked stuff can have paths */ + if(part->type==PART_HAIR || psys->flag&PSYS_KEYED || psys->pointcache->mem_cache.first) { psys_cache_paths(sim, cfra); /* for render, child particle paths are computed on the fly */ - if(part->childtype) { - if(!psys->totchild) - skip = 1; - else if((psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DONE)==0) - skip = 1; - - if(!skip) - psys_cache_child_paths(sim, cfra, 0); - } + if(part->childtype && psys->totchild) + psys_cache_child_paths(sim, cfra, 0); } else if(psys->pathcache) psys_free_path_cache(psys, NULL); @@ -3094,6 +3201,8 @@ static void do_hair_dynamics(ParticleSimulationData *sim) psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, 0, 0); psys->clmd->sim_parms->effector_weights = NULL; + + psys_free_path_cache(psys, NULL); } static void hair_step(ParticleSimulationData *sim, float cfra) { @@ -3123,8 +3232,8 @@ static void hair_step(ParticleSimulationData *sim, float cfra) if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS) do_hair_dynamics(sim); + /* following lines were removed r29079 but cause bug [#22811], see report for details */ psys_update_effectors(sim); - psys_update_path_cache(sim, cfra); psys->flag |= PSYS_HAIR_UPDATED; @@ -3184,15 +3293,11 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) { ParticleSystem *psys = sim->psys; ParticleSettings *part=psys->part; - KDTree *tree=0; - //IpoCurve *icu_esize=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system -/* Material *ma=give_current_material(sim->ob, part->omat); */ BoidBrainData bbd; PARTICLE_P; float timestep; - int totpart; /* current time */ - float ctime, ipotime; // XXX old animation system + float ctime; /* frame & time changes */ float dfra, dtime, pa_dtime, pa_dfra=0.0; float birthtime, dietime; @@ -3200,200 +3305,186 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) /* where have we gone in time since last time */ dfra= cfra - psys->cfra; - totpart=psys->totpart; - timestep = psys_get_timestep(sim); dtime= dfra*timestep; ctime= cfra*timestep; - ipotime= cfra; // XXX old animation system - -#if 0 // XXX old animation system - if(part->flag&PART_ABS_TIME && part->ipo){ - calc_ipo(part->ipo, cfra); - execute_ipo((ID *)part, part->ipo); - } -#endif // XXX old animation system if(dfra<0.0){ - float *vg_size=0; - //if(part->type==PART_REACTOR) - // vg_size=psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_SIZE); - LOOP_EXISTING_PARTICLES { - /* set correct ipo timing */ -#if 0 // XXX old animation system - if((part->flag&PART_ABS_TIME)==0 && part->ipo){ - ipotime=100.0f*(cfra-pa->time)/pa->lifetime; - calc_ipo(part->ipo, ipotime); - execute_ipo((ID *)part, part->ipo); - } -#endif // XXX old animation system pa->size = part->size; if(part->randsize > 0.0) pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); reset_particle(sim, pa, dtime, cfra); } - - if(vg_size) - MEM_freeN(vg_size); + return; } - else{ - BLI_srandom(31415926 + (int)cfra + psys->seed); - psys_update_effectors(sim); + BLI_srandom(31415926 + (int)cfra + psys->seed); - if(part->type != PART_HAIR) - sim->colliders = get_collider_cache(sim->scene, NULL); + psys_update_effectors(sim); - if(part->phystype==PART_PHYS_BOIDS){ - ParticleTarget *pt = psys->targets.first; - bbd.sim = sim; - bbd.part = part; - bbd.cfra = cfra; - bbd.dfra = dfra; - bbd.timestep = timestep; + if(part->type != PART_HAIR) + sim->colliders = get_collider_cache(sim->scene, NULL, NULL); - psys_update_particle_tree(psys, cfra); + if(part->phystype==PART_PHYS_BOIDS){ + ParticleTarget *pt = psys->targets.first; + bbd.sim = sim; + bbd.part = part; + bbd.cfra = cfra; + bbd.dfra = dfra; + bbd.timestep = timestep; - boids_precalc_rules(part, cfra); + psys_update_particle_tree(psys, cfra); - for(; pt; pt=pt->next) { - if(pt->ob) - psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra); - } + boids_precalc_rules(part, cfra); + + for(; pt; pt=pt->next) { + if(pt->ob) + psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra); + } + } + else if(part->phystype==PART_PHYS_FLUID){ + ParticleTarget *pt = psys->targets.first; + psys_update_particle_tree(psys, cfra); + + for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */ + if(pt->ob) psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra); + } + } + + /* main loop: calculate physics for all particles */ + LOOP_SHOWN_PARTICLES { + copy_particle_key(&pa->prev_state,&pa->state,1); + + pa->size = part->size; + if(part->randsize > 0.0) + pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); + + ///* reactions can change birth time so they need to be checked first */ + //if(psys->reactevents.first && ELEM(pa->alive,PARS_DEAD,PARS_KILLED)==0) + // react_to_events(psys,p); + + birthtime = pa->time; + dietime = birthtime + pa->lifetime; + + pa_dfra = dfra; + pa_dtime = dtime; + + + if(dietime <= cfra && psys->cfra < dietime){ + /* particle dies some time between this and last step */ + pa_dfra = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra); + pa_dtime = pa_dfra * timestep; + pa->alive = PARS_DYING; + } + else if(birthtime <= cfra && birthtime >= psys->cfra){ + /* particle is born some time between this and last step*/ + reset_particle(sim, pa, dtime, cfra); + pa->alive = PARS_ALIVE; + pa_dfra = cfra - birthtime; + pa_dtime = pa_dfra*timestep; + } + else if(dietime < cfra){ + /* nothing to be done when particle is dead */ } - /* main loop: calculate physics for all particles */ - LOOP_SHOWN_PARTICLES { - copy_particle_key(&pa->prev_state,&pa->state,1); - - /* set correct ipo timing */ -#if 0 // XXX old animation system - if((part->flag&PART_ABS_TIME)==0 && part->ipo){ - ipotime=100.0f*(cfra-pa->time)/pa->lifetime; - calc_ipo(part->ipo, ipotime); - execute_ipo((ID *)part, part->ipo); - } -#endif // XXX old animation system - //update_particle_settings(psys, part, &tpart, pa); + /* only reset unborn particles if they're shown or if the particle is born soon*/ + if(pa->alive==PARS_UNBORN + && (part->flag & PART_UNBORN || cfra + psys->pointcache->step > pa->time)) + reset_particle(sim, pa, dtime, cfra); + else if(part->phystype == PART_PHYS_NO) + reset_particle(sim, pa, dtime, cfra); - pa->size = part->size; - if(part->randsize > 0.0) - pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); + if(dfra>0.0 && ELEM(pa->alive,PARS_ALIVE,PARS_DYING)){ + switch(part->phystype){ + case PART_PHYS_NEWTON: + /* do global forces & effectors */ + apply_particle_forces(sim, p, pa_dfra, cfra); + + /* deflection */ + if(sim->colliders) + deflect_particle(sim, p, pa_dfra, cfra); - ///* reactions can change birth time so they need to be checked first */ - //if(psys->reactevents.first && ELEM(pa->alive,PARS_DEAD,PARS_KILLED)==0) - // react_to_events(psys,p); + /* rotations */ + rotate_particle(part, pa, pa_dfra, timestep); + break; + case PART_PHYS_BOIDS: + { + bbd.goal_ob = NULL; + boid_brain(&bbd, p, pa); + if(pa->alive != PARS_DYING) { + boid_body(&bbd, pa); - birthtime = pa->time; - dietime = birthtime + pa->lifetime; - - pa_dfra = dfra; - pa_dtime = dtime; - - - if(dietime <= cfra && psys->cfra < dietime){ - /* particle dies some time between this and last step */ - pa_dfra = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra); - pa_dtime = pa_dfra * timestep; - pa->alive = PARS_DYING; - } - else if(birthtime <= cfra && birthtime >= psys->cfra){ - /* particle is born some time between this and last step*/ - reset_particle(sim, pa, dtime, cfra); - pa->alive = PARS_ALIVE; - pa_dfra = cfra - birthtime; - pa_dtime = pa_dfra*timestep; - } - else if(dietime < cfra){ - /* nothing to be done when particle is dead */ - } - - /* only reset unborn particles if they're shown or if the particle is born soon*/ - if(pa->alive==PARS_UNBORN - && (part->flag & PART_UNBORN || cfra + psys->pointcache->step > pa->time)) - reset_particle(sim, pa, dtime, cfra); - else if(part->phystype == PART_PHYS_NO) - reset_particle(sim, pa, dtime, cfra); - - if(dfra>0.0 && ELEM(pa->alive,PARS_ALIVE,PARS_DYING)){ - switch(part->phystype){ - case PART_PHYS_NEWTON: - /* do global forces & effectors */ - apply_particle_forces(sim, p, pa_dfra, cfra); - /* deflection */ if(sim->colliders) deflect_particle(sim, p, pa_dfra, cfra); - - /* rotations */ - rotate_particle(part, pa, pa_dfra, timestep); - break; - case PART_PHYS_BOIDS: - { - bbd.goal_ob = NULL; - boid_brain(&bbd, p, pa); - if(pa->alive != PARS_DYING) { - boid_body(&bbd, pa); - - /* deflection */ - if(sim->colliders) - deflect_particle(sim, p, pa_dfra, cfra); - } - break; } + break; } + case PART_PHYS_FLUID: + { + /* do global forces & effectors */ + apply_particle_forces(sim, p, pa_dfra, cfra); - if(pa->alive == PARS_DYING){ - //push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state); + /* do fluid sim */ + apply_particle_fluidsim(psys, pa, part, sim, pa_dfra, cfra); - pa->alive=PARS_DEAD; - pa->state.time=pa->dietime; - } - else - pa->state.time=cfra; - - //push_reaction(ob,psys,p,PART_EVENT_NEAR,&pa->state); + /* deflection */ + if(sim->colliders) + deflect_particle(sim, p, pa_dfra, cfra); + + /* rotations, SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */ + rotate_particle(part, pa, pa_dfra, timestep); + break; + } } - } - free_collider_cache(&sim->colliders); + if(pa->alive == PARS_DYING){ + //push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state); + + pa->alive=PARS_DEAD; + pa->state.time=pa->dietime; + } + else + pa->state.time=cfra; + + //push_reaction(ob,psys,p,PART_EVENT_NEAR,&pa->state); + } } - if(tree) - BLI_kdtree_free(tree); -} + free_collider_cache(&sim->colliders); + if(psys->pathcache) + psys_free_path_cache(psys, NULL); +} +void psys_update_children(ParticleSimulationData *sim) +{ + if((sim->psys->part->type == PART_HAIR) && (sim->psys->flag & PSYS_HAIR_DONE)==0) + /* don't generate children while growing hair - waste of time */ + psys_free_children(sim->psys); + else if(sim->psys->part->childtype) { + if(sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys)) + distribute_particles(sim, PART_FROM_CHILD); + } + else + psys_free_children(sim->psys); +} /* updates cached particles' alive & other flags etc..*/ static void cached_step(ParticleSimulationData *sim, float cfra) { ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; - //IpoCurve *icu_esize = NULL; //=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system -/* Material *ma = give_current_material(sim->ob,part->omat); */ PARTICLE_P; - float disp, birthtime, dietime, *vg_size= NULL; // XXX ipotime=cfra + float disp, birthtime, dietime; BLI_srandom(psys->seed); - if(part->from!=PART_FROM_PARTICLE) - vg_size= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_SIZE); - psys_update_effectors(sim); disp= (float)get_current_display_percentage(psys)/100.0f; LOOP_PARTICLES { -#if 0 // XXX old animation system - if((part->flag&PART_ABS_TIME)==0 && part->ipo){ - ipotime=100.0f*(cfra-pa->time)/pa->lifetime; - calc_ipo(part->ipo, ipotime); - execute_ipo((ID *)part, part->ipo); - } -#endif // XXX old animation system - //update_settings_with_particle(psys, part, pa); - pa->size = part->size; if(part->randsize > 0.0) pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); @@ -3409,12 +3500,10 @@ static void cached_step(ParticleSimulationData *sim, float cfra) if(part->flag & PART_UNBORN && (psys->pointcache->flag & PTCACHE_EXTERNAL) == 0) reset_particle(sim, pa, 0.0f, cfra); } - else if(dietime <= cfra){ + else if(dietime <= cfra) pa->alive = PARS_DEAD; - } - else{ + else pa->alive = PARS_ALIVE; - } if(psys->lattice){ end_latt_deform(psys->lattice); @@ -3426,114 +3515,8 @@ static void cached_step(ParticleSimulationData *sim, float cfra) else pa->flag &= ~PARS_NO_DISP; } - - /* make sure that children are up to date */ - if(psys->part->childtype && psys->totchild != get_psys_tot_child(sim->scene, psys)) { - realloc_particles(sim, psys->totpart); - distribute_particles(sim, PART_FROM_CHILD); - } - - psys_update_path_cache(sim, cfra); - - if(vg_size) - MEM_freeN(vg_size); } -static void psys_changed_type(ParticleSimulationData *sim) -{ - ParticleSettings *part = sim->psys->part; - PTCacheID pid; - - BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys); - - /* system type has changed so set sensible defaults and clear non applicable flags */ - if(part->from == PART_FROM_PARTICLE) { - //if(part->type != PART_REACTOR) - part->from = PART_FROM_FACE; - if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT) - part->distr = PART_DISTR_JIT; - } - - if(part->phystype != PART_PHYS_KEYED) - sim->psys->flag &= ~PSYS_KEYED; - - if(part->type == PART_HAIR) { - if(ELEM4(part->ren_as, PART_DRAW_NOT, PART_DRAW_PATH, PART_DRAW_OB, PART_DRAW_GR)==0) - part->ren_as = PART_DRAW_PATH; - - if(ELEM3(part->draw_as, PART_DRAW_NOT, PART_DRAW_REND, PART_DRAW_PATH)==0) - part->draw_as = PART_DRAW_REND; - - CLAMP(part->path_start, 0.0f, 100.0f); - CLAMP(part->path_end, 0.0f, 100.0f); - - BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0); - } - else { - free_hair(sim->ob, sim->psys, 1); - - CLAMP(part->path_start, 0.0f, MAX2(100.0f, part->end + part->lifetime)); - CLAMP(part->path_end, 0.0f, MAX2(100.0f, part->end + part->lifetime)); - } - - psys_reset(sim->psys, PSYS_RESET_ALL); -} -void psys_check_boid_data(ParticleSystem *psys) -{ - BoidParticle *bpa; - PARTICLE_P; - - pa = psys->particles; - - if(!pa) - return; - - if(psys->part && psys->part->phystype==PART_PHYS_BOIDS) { - if(!pa->boid) { - bpa = MEM_callocN(psys->totpart * sizeof(BoidParticle), "Boid Data"); - - LOOP_PARTICLES - pa->boid = bpa++; - } - } - else if(pa->boid){ - MEM_freeN(pa->boid); - LOOP_PARTICLES - pa->boid = NULL; - } -} -static void psys_changed_physics(ParticleSimulationData *sim) -{ - ParticleSettings *part = sim->psys->part; - - if(ELEM(part->phystype, PART_PHYS_NO, PART_PHYS_KEYED)) { - PTCacheID pid; - BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys); - BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0); - } - else { - free_keyed_keys(sim->psys); - sim->psys->flag &= ~PSYS_KEYED; - } - - if(part->phystype == PART_PHYS_BOIDS && part->boids == NULL) { - BoidState *state; - - part->boids = MEM_callocN(sizeof(BoidSettings), "Boid Settings"); - boid_default_settings(part->boids); - - state = boid_new_state(part->boids); - BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Separate)); - BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Flock)); - - ((BoidRule*)state->rules.first)->flag |= BOIDRULE_CURRENT; - - state->flag |= BOIDSTATE_CURRENT; - BLI_addtail(&part->boids->states, state); - } - - psys_check_boid_data(sim->psys); -} static void particles_fluid_step(ParticleSimulationData *sim, int cfra) { ParticleSystem *psys = sim->psys; @@ -3567,8 +3550,8 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra) // ok, start loading strcpy(filename, fss->surfdataPath); strcat(filename, suffix); - BLI_convertstringcode(filename, G.sce); - BLI_convertstringframe(filename, curFrame, 0); // fixed #frame-no + BLI_path_abs(filename, G.sce); + BLI_path_frame(filename, curFrame, 0); // fixed #frame-no strcat(filename, suffix2); gzf = gzopen(filename, "rb"); @@ -3642,200 +3625,127 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra) #endif // DISABLE_ELBEEM } -/* Calculates the next state for all particles of the system */ -/* In particles code most fra-ending are frames, time-ending are fra*timestep (seconds)*/ +static int emit_particles(ParticleSimulationData *sim, PTCacheID *pid, float cfra) +{ + ParticleSystem *psys = sim->psys; + ParticleSettings *part = psys->part; + int oldtotpart = psys->totpart; + int totpart = oldtotpart; + + if(pid && psys->pointcache->flag & PTCACHE_EXTERNAL) + totpart = pid->cache->totpoint; + else if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT) + totpart = part->grid_res*part->grid_res*part->grid_res; + else + totpart = psys->part->totpart; + + if(totpart != oldtotpart) + realloc_particles(sim, totpart); + + return totpart - oldtotpart; +} +/* Calculates the next state for all particles of the system + * In particles code most fra-ending are frames, time-ending are fra*timestep (seconds) + * 1. Emit particles + * 2. Check cache (if used) and return if frame is cached + * 3. Do dynamics + * 4. Save to cache */ static void system_step(ParticleSimulationData *sim, float cfra) { ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; PointCache *cache = psys->pointcache; - PTCacheID pid; + PTCacheID pid, *use_cache = NULL; PARTICLE_P; - int totpart, oldtotpart, totchild, oldtotchild; - float disp, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; - int init= 0, distr= 0, alloc= 0, usecache= 0, only_children_changed= 0; - int framenr, framedelta, startframe, endframe; + int oldtotpart; + float disp; /*, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; */ + int init= 0, emit= 0; //, only_children_changed= 0; + int framenr, framedelta, startframe = 0, endframe = 100; framenr= (int)sim->scene->r.cfra; framedelta= framenr - cache->simframe; - /* set suitable cache range automatically */ - if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0 && !(psys->flag & PSYS_HAIR_DYNAMICS)) - psys_get_pointcache_start_end(sim->scene, sim->psys, &cache->startframe, &cache->endframe); - - BKE_ptcache_id_from_particles(&pid, sim->ob, psys); - BKE_ptcache_id_time(&pid, sim->scene, 0.0f, &startframe, &endframe, NULL); - - psys_clear_temp_pointcache(sim->psys); - - /* update ipo's */ -#if 0 // XXX old animation system - if((part->flag & PART_ABS_TIME) && part->ipo) { - calc_ipo(part->ipo, cfra); - execute_ipo((ID *)part, part->ipo); - } -#endif // XXX old animation system - - /* hair if it's already done is handled separate */ - if(part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DONE)) { - hair_step(sim, cfra); - psys->cfra = cfra; - psys->recalc = 0; - return; - } - /* fluid is also handled separate */ - else if(part->type == PART_FLUID) { - particles_fluid_step(sim, framenr); - psys->cfra = cfra; - psys->recalc = 0; - return; + /* cache shouldn't be used for hair or "continue physics" */ + if(part->type != PART_HAIR && BKE_ptcache_get_continue_physics() == 0) { + BKE_ptcache_id_from_particles(&pid, sim->ob, psys); + use_cache = &pid; } - /* cache shouldn't be used for hair or "none" or "keyed" physics */ - if(part->type == PART_HAIR || ELEM(part->phystype, PART_PHYS_NO, PART_PHYS_KEYED)) - usecache= 0; - else if(BKE_ptcache_get_continue_physics()) - usecache= 0; - else - usecache= 1; + if(use_cache) { + psys_clear_temp_pointcache(sim->psys); - if(usecache) { - /* frame clamping */ + /* set suitable cache range automatically */ + if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0) + psys_get_pointcache_start_end(sim->scene, sim->psys, &cache->startframe, &cache->endframe); + + BKE_ptcache_id_time(&pid, sim->scene, 0.0f, &startframe, &endframe, NULL); + + /* simulation is only active during a specific period */ if(framenr < startframe) { psys_reset(psys, PSYS_RESET_CACHE_MISS); - psys->cfra = cfra; - psys->recalc = 0; return; } else if(framenr > endframe) { framenr= endframe; } - + if(framenr == startframe) { - BKE_ptcache_id_reset(sim->scene, &pid, PTCACHE_RESET_OUTDATED); - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_id_reset(sim->scene, use_cache, PTCACHE_RESET_OUTDATED); + BKE_ptcache_validate(cache, framenr); cache->flag &= ~PTCACHE_REDO_NEEDED; } } +/* 1. emit particles */ + /* verify if we need to reallocate */ oldtotpart = psys->totpart; - oldtotchild = psys->totchild; - if(psys->pointcache->flag & PTCACHE_EXTERNAL) - totpart = pid.cache->totpoint; - else if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT) - totpart = part->grid_res*part->grid_res*part->grid_res; - else - totpart = psys->part->totpart; - totchild = get_psys_tot_child(sim->scene, psys); - - if(oldtotpart != totpart || oldtotchild != totchild) { - only_children_changed = (oldtotpart == totpart); - alloc = 1; - distr= 1; - init= 1; - } - - if(psys->recalc & PSYS_RECALC_RESET) { - distr= 1; - init= 1; - } + emit = emit_particles(sim, use_cache, cfra); + if(use_cache && emit > 0) + BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, cfra); + init = emit*emit + (psys->recalc & PSYS_RECALC_RESET); if(init) { - if(distr) { - if(alloc) { - realloc_particles(sim, totpart); - - if(oldtotpart && usecache && !only_children_changed) { - BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0); - BKE_ptcache_id_from_particles(&pid, sim->ob, psys); - } - } - - if(!only_children_changed) - distribute_particles(sim, part->from); - - if((psys->part->type == PART_HAIR) && !(psys->flag & PSYS_HAIR_DONE)) - /* don't generate children while growing hair - waste of time */ - psys_free_children(psys); - else if(get_psys_tot_child(sim->scene, psys)) - distribute_particles(sim, PART_FROM_CHILD); - } - - if(!only_children_changed) { - free_keyed_keys(psys); - - initialize_all_particles(sim); - - - if(alloc) { - reset_all_particles(sim, 0.0, cfra, oldtotpart); - } - } + distribute_particles(sim, part->from); + initialize_all_particles(sim); + reset_all_particles(sim, 0.0, cfra, oldtotpart); /* flag for possible explode modifiers after this system */ sim->psmd->flag |= eParticleSystemFlag_Pars; } - /* try to read from the cache */ - if(usecache) { - int result = BKE_ptcache_read_cache(&pid, cfra, sim->scene->r.frs_sec); +/* 2. try to read from the cache */ + if(use_cache) { + int cache_result = BKE_ptcache_read_cache(use_cache, cfra, sim->scene->r.frs_sec); - if(result == PTCACHE_READ_EXACT || result == PTCACHE_READ_INTERPOLATED) { + if(ELEM(cache_result, PTCACHE_READ_EXACT, PTCACHE_READ_INTERPOLATED)) { cached_step(sim, cfra); - psys->cfra=cfra; - psys->recalc = 0; - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_validate(cache, framenr); - if(result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED) - BKE_ptcache_write_cache(&pid, (int)cfra); + if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED) + BKE_ptcache_write_cache(use_cache, framenr); return; } - else if(result==PTCACHE_READ_OLD) { + else if(cache_result == PTCACHE_READ_OLD) { psys->cfra = (float)cache->simframe; - LOOP_PARTICLES { - /* update alive status */ - if(pa->time > psys->cfra) - pa->alive = PARS_UNBORN; - else if(pa->dietime <= psys->cfra) - pa->alive = PARS_DEAD; - else - pa->alive = PARS_ALIVE; - } + cached_step(sim, psys->cfra); } else if(cfra != startframe && ( /*sim->ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED))) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */ psys_reset(psys, PSYS_RESET_CACHE_MISS); - psys->cfra=cfra; - psys->recalc = 0; return; } + + /* if on second frame, write cache for first frame */ + if(psys->cfra == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0)) + BKE_ptcache_write_cache(use_cache, startframe); } - else { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; - } - - /* if on second frame, write cache for first frame */ - if(usecache && psys->cfra == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0)) - BKE_ptcache_write_cache(&pid, startframe); - - if(part->phystype==PART_PHYS_KEYED) - psys_count_keyed_targets(sim); - - /* initialize vertex groups */ - if(part->from!=PART_FROM_PARTICLE) { - vg_vel= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_VEL); - vg_tan= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_TAN); - vg_rot= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_ROT); - vg_size= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_SIZE); - } + else + BKE_ptcache_invalidate(cache); +/* 3. do dynamics */ /* set particles to be not calculated TODO: can't work with pointcache */ disp= (float)get_current_display_percentage(psys)/100.0f; @@ -3848,50 +3758,153 @@ static void system_step(ParticleSimulationData *sim, float cfra) } if(psys->totpart) { - int dframe, totframesback = 0; - + int dframe, subframe = 0, totframesback = 0, totsubframe = part->subframes+1; + float fraction; + /* handle negative frame start at the first frame by doing * all the steps before the first frame */ if(framenr == startframe && part->sta < startframe) totframesback = (startframe - (int)part->sta); - + for(dframe=-totframesback; dframe<=0; dframe++) { /* ok now we're all set so let's go */ - dynamics_step(sim, cfra+dframe); - psys->cfra = cfra+dframe; + for (subframe = 1; subframe <= totsubframe; subframe++) { + fraction = (float)subframe/(float)totsubframe; + dynamics_step(sim, cfra+dframe+fraction - 1.f); + psys->cfra = cfra+dframe+fraction - 1.f; + } } + } - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; - - psys->recalc = 0; - psys->cfra = cfra; - - /* only write cache starting from second frame */ - if(usecache && framenr != startframe) - BKE_ptcache_write_cache(&pid, (int)cfra); - - /* for keyed particles the path is allways known so it can be drawn */ - if(part->phystype==PART_PHYS_KEYED) { - set_keyed_keys(sim); - psys_update_path_cache(sim,(int)cfra); +/* 4. only write cache starting from second frame */ + if(use_cache) { + BKE_ptcache_validate(cache, framenr); + if(framenr != startframe) + BKE_ptcache_write_cache(use_cache, framenr); } - else if(psys->pathcache) - psys_free_path_cache(psys, NULL); - - /* cleanup */ - if(vg_vel) MEM_freeN(vg_vel); - if(vg_tan) MEM_freeN(vg_tan); - if(vg_rot) MEM_freeN(vg_rot); - if(vg_size) MEM_freeN(vg_size); +/* cleanup */ if(psys->lattice){ end_latt_deform(psys->lattice); psys->lattice= NULL; } } +/* system type has changed so set sensible defaults and clear non applicable flags */ +static void psys_changed_type(ParticleSimulationData *sim) +{ + ParticleSettings *part = sim->psys->part; + PTCacheID pid; + + BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys); + + if(part->from == PART_FROM_PARTICLE) { + //if(part->type != PART_REACTOR) + part->from = PART_FROM_FACE; + if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT) + part->distr = PART_DISTR_JIT; + } + + if(part->phystype != PART_PHYS_KEYED) + sim->psys->flag &= ~PSYS_KEYED; + + if(part->type == PART_HAIR) { + if(ELEM4(part->ren_as, PART_DRAW_NOT, PART_DRAW_PATH, PART_DRAW_OB, PART_DRAW_GR)==0) + part->ren_as = PART_DRAW_PATH; + + if(ELEM3(part->draw_as, PART_DRAW_NOT, PART_DRAW_REND, PART_DRAW_PATH)==0) + part->draw_as = PART_DRAW_REND; + + CLAMP(part->path_start, 0.0f, 100.0f); + CLAMP(part->path_end, 0.0f, 100.0f); + + BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0); + } + else { + free_hair(sim->ob, sim->psys, 1); + + CLAMP(part->path_start, 0.0f, MAX2(100.0f, part->end + part->lifetime)); + CLAMP(part->path_end, 0.0f, MAX2(100.0f, part->end + part->lifetime)); + } + + psys_reset(sim->psys, PSYS_RESET_ALL); +} +void psys_check_boid_data(ParticleSystem *psys) +{ + BoidParticle *bpa; + PARTICLE_P; + + pa = psys->particles; + + if(!pa) + return; + + if(psys->part && psys->part->phystype==PART_PHYS_BOIDS) { + if(!pa->boid) { + bpa = MEM_callocN(psys->totpart * sizeof(BoidParticle), "Boid Data"); + + LOOP_PARTICLES + pa->boid = bpa++; + } + } + else if(pa->boid){ + MEM_freeN(pa->boid); + LOOP_PARTICLES + pa->boid = NULL; + } +} + +static void fluid_default_settings(ParticleSettings *part){ + SPHFluidSettings *fluid = part->fluid; + + fluid->radius = 0.5f; + fluid->spring_k = 0.f; + fluid->rest_length = 0.5f; + fluid->viscosity_omega = 2.f; + fluid->viscosity_beta = 0.f; + fluid->stiffness_k = 0.1f; + fluid->stiffness_knear = 0.05f; + fluid->rest_density = 10.f; + fluid->buoyancy = 0.f; +} + +static void psys_changed_physics(ParticleSimulationData *sim) +{ + ParticleSettings *part = sim->psys->part; + + if(ELEM(part->phystype, PART_PHYS_NO, PART_PHYS_KEYED)) { + PTCacheID pid; + BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys); + BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0); + } + else { + free_keyed_keys(sim->psys); + sim->psys->flag &= ~PSYS_KEYED; + } + + if(part->phystype == PART_PHYS_BOIDS && part->boids == NULL) { + BoidState *state; + + part->boids = MEM_callocN(sizeof(BoidSettings), "Boid Settings"); + boid_default_settings(part->boids); + + state = boid_new_state(part->boids); + BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Separate)); + BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Flock)); + + ((BoidRule*)state->rules.first)->flag |= BOIDRULE_CURRENT; + + state->flag |= BOIDSTATE_CURRENT; + BLI_addtail(&part->boids->states, state); + } + else if(part->phystype == PART_PHYS_FLUID && part->fluid == NULL) { + part->fluid = MEM_callocN(sizeof(SPHFluidSettings), "SPH Fluid Settings"); + fluid_default_settings(part); + } + + psys_check_boid_data(sim->psys); +} static int hair_needs_recalc(ParticleSystem *psys) { if(!(psys->flag & PSYS_EDITED) && (!psys->edit || !psys->edit->edited) && @@ -3902,10 +3915,12 @@ static int hair_needs_recalc(ParticleSystem *psys) return 0; } -/* main particle update call, checks that things are ok on the large scale before actual particle calculations */ +/* main particle update call, checks that things are ok on the large scale and + * then advances in to actual particle calculations depending on particle type */ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) { ParticleSimulationData sim = {scene, ob, psys, NULL, NULL}; + ParticleSettings *part = psys->part; float cfra; /* drawdata is outdated after ANY change */ @@ -3914,7 +3929,7 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) if(!psys_check_enabled(ob, psys)) return; - cfra= bsystem_time(scene, ob, (float)scene->r.cfra, 0.0f); + cfra= BKE_curframe(scene); sim.psmd= psys_get_modifier(ob, psys); /* system was already updated from modifier stack */ @@ -3929,35 +3944,87 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) return; /* execute drivers only, as animation has already been done */ - BKE_animsys_evaluate_animdata(&psys->part->id, psys->part->adt, cfra, ADT_RECALC_DRIVERS); + BKE_animsys_evaluate_animdata(&part->id, part->adt, cfra, ADT_RECALC_DRIVERS); + + /* TODO: only free child paths in case of PSYS_RECALC_CHILD */ + if(psys->recalc & PSYS_RECALC || ob->recalc & OB_RECALC_ALL) + psys_free_path_cache(psys, NULL); + + if(psys->recalc & PSYS_RECALC_CHILD) + psys_free_children(psys); if(psys->recalc & PSYS_RECALC_TYPE) psys_changed_type(&sim); else if(psys->recalc & PSYS_RECALC_PHYS) psys_changed_physics(&sim); - /* (re-)create hair */ - if(psys->part->type==PART_HAIR && hair_needs_recalc(psys)) { - float hcfra=0.0f; - int i; + switch(part->type) { + case PART_HAIR: + { + /* (re-)create hair */ + if(hair_needs_recalc(psys)) { + float hcfra=0.0f; + int i, recalc = psys->recalc; - free_hair(ob, psys, 0); + free_hair(ob, psys, 0); - /* first step is negative so particles get killed and reset */ - psys->cfra= 1.0f; + /* first step is negative so particles get killed and reset */ + psys->cfra= 1.0f; - for(i=0; i<=psys->part->hair_step; i++){ - hcfra=100.0f*(float)i/(float)psys->part->hair_step; - BKE_animsys_evaluate_animdata(&psys->part->id, psys->part->adt, hcfra, ADT_RECALC_ANIM); - system_step(&sim, hcfra); - save_hair(&sim, hcfra); + for(i=0; i<=part->hair_step; i++){ + hcfra=100.0f*(float)i/(float)psys->part->hair_step; + BKE_animsys_evaluate_animdata(&part->id, part->adt, hcfra, ADT_RECALC_ANIM); + system_step(&sim, hcfra); + psys->cfra = hcfra; + psys->recalc = 0; + save_hair(&sim, hcfra); + } + + psys->flag |= PSYS_HAIR_DONE; + psys->recalc = recalc; + } + + if(psys->flag & PSYS_HAIR_DONE) + hair_step(&sim, cfra); + break; } + case PART_FLUID: + { + particles_fluid_step(&sim, (int)cfra); + break; + } + default: + { + switch(part->phystype) { + case PART_PHYS_NO: + case PART_PHYS_KEYED: + { + if(emit_particles(&sim, NULL, cfra)) { + free_keyed_keys(psys); + distribute_particles(&sim, part->from); + initialize_all_particles(&sim); + } + reset_all_particles(&sim, 0.0, cfra, 0); - psys->flag |= PSYS_HAIR_DONE; + if(part->phystype == PART_PHYS_KEYED) { + psys_count_keyed_targets(&sim); + set_keyed_keys(&sim); + } + break; + } + default: + { + /* the main dynamic particle system step */ + system_step(&sim, cfra); + break; + } + } + break; + } } - /* the main particle system step */ - system_step(&sim, cfra); + psys->cfra = cfra; + psys->recalc = 0; /* save matrix for duplicators */ invert_m4_m4(psys->imat, ob->obmat); diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index b1319a81f5d..5295a496d2b 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -48,13 +48,13 @@ #include "WM_api.h" +#include "BKE_anim.h" #include "BKE_blender.h" #include "BKE_cloth.h" #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" -#include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_pointcache.h" @@ -88,16 +88,12 @@ #include "BLI_winstuff.h" #endif -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) -/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */ -#include <pthread.h> -extern pthread_key_t gomp_tls_key; -static void *thread_tls_data; -#endif - #define PTCACHE_DATA_FROM(data, type, from) if(data[type]) { memcpy(data[type], from, ptcache_data_size[type]); } #define PTCACHE_DATA_TO(data, type, index, to) if(data[type]) { memcpy(to, (char*)data[type] + (index ? index * ptcache_data_size[type] : 0), ptcache_data_size[type]); } +/* could be made into a pointcache option */ +#define DURIAN_POINTCACHE_LIB_OK 1 + int ptcache_data_size[] = { sizeof(int), // BPHYS_DATA_INDEX 3 * sizeof(float), // BPHYS_DATA_LOCATION: @@ -135,7 +131,7 @@ static int ptcache_write_basic_header(PTCacheFile *pf) return 1; } /* Softbody functions */ -static int ptcache_write_softbody(int index, void *soft_v, void **data) +static int ptcache_write_softbody(int index, void *soft_v, void **data, int cfra) { SoftBody *soft= soft_v; BodyPoint *bp = soft->bpoint + index; @@ -191,13 +187,13 @@ static void ptcache_interpolate_softbody(int index, void *soft_v, void **data, f VECCOPY(bp->pos, keys->co); VECCOPY(bp->vec, keys->vel); } -static int ptcache_totpoint_softbody(void *soft_v) +static int ptcache_totpoint_softbody(void *soft_v, int cfra) { SoftBody *soft= soft_v; return soft->totpoint; } /* Particle functions */ -static int ptcache_write_particle(int index, void *psys_v, void **data) +static int ptcache_write_particle(int index, void *psys_v, void **data, int cfra) { ParticleSystem *psys= psys_v; ParticleData *pa = psys->particles + index; @@ -205,11 +201,9 @@ static int ptcache_write_particle(int index, void *psys_v, void **data) float times[3] = {pa->time, pa->dietime, pa->lifetime}; int step = psys->pointcache->step; - if(data[BPHYS_DATA_INDEX]) { - /* No need to store unborn or died particles */ - if(pa->time - step > pa->state.time || pa->dietime + step < pa->state.time) - return 0; - } + /* No need to store unborn or died particles outside cache step bounds */ + if(data[BPHYS_DATA_INDEX] && (cfra < pa->time - step || cfra > pa->dietime + step)) + return 0; PTCACHE_DATA_FROM(data, BPHYS_DATA_INDEX, &index); PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, pa->state.co); @@ -236,8 +230,14 @@ void BKE_ptcache_make_particle_key(ParticleKey *key, int index, void **data, flo static void ptcache_read_particle(int index, void *psys_v, void **data, float frs_sec, float cfra, float *old_data) { ParticleSystem *psys= psys_v; - ParticleData *pa = psys->particles + index; - BoidParticle *boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL; + ParticleData *pa; + BoidParticle *boid; + + if(index >= psys->totpart) + return; + + pa = psys->particles + index; + boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL; if(cfra > pa->state.time) memcpy(&pa->prev_state, &pa->state, sizeof(ParticleKey)); @@ -288,10 +288,19 @@ static void ptcache_read_particle(int index, void *psys_v, void **data, float fr static void ptcache_interpolate_particle(int index, void *psys_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data) { ParticleSystem *psys= psys_v; - ParticleData *pa = psys->particles + index; + ParticleData *pa; ParticleKey keys[4]; float dfra; + if(index >= psys->totpart) + return; + + pa = psys->particles + index; + + /* particle wasn't read from first cache so can't interpolate */ + if((int)cfra1 < pa->time - psys->pointcache->step || (int)cfra1 > pa->dietime + psys->pointcache->step) + return; + cfra = MIN2(cfra, pa->dietime); cfra1 = MIN2(cfra1, pa->dietime); cfra2 = MIN2(cfra2, pa->dietime); @@ -338,26 +347,20 @@ static void ptcache_interpolate_particle(int index, void *psys_v, void **data, f pa->state.time = cfra; } -static int ptcache_totpoint_particle(void *psys_v) +static int ptcache_totpoint_particle(void *psys_v, int cfra) { ParticleSystem *psys = psys_v; return psys->totpart; } -static int ptcache_totwrite_particle(void *psys_v) +static int ptcache_totwrite_particle(void *psys_v, int cfra) { ParticleSystem *psys = psys_v; + ParticleData *pa= psys->particles; + int p, step = psys->pointcache->step; int totwrite = 0; - /* TODO for later */ - //if((psys->part->flag & (PART_UNBORN|PART_DIED))==0) { - // ParticleData *pa= psys->particles; - // int p, step = psys->pointcache->step; - - // for(p=0; p<psys->totpart; p++,pa++) - // totwrite += (pa->time - step > pa->state.time || pa->dietime + step > pa->state.time); - //} - //else - totwrite= psys->totpart; + for(p=0; p<psys->totpart; p++,pa++) + totwrite += (cfra >= pa->time - step && cfra <= pa->dietime + step); return totwrite; } @@ -489,7 +492,7 @@ static int ptcache_totwrite_particle(void *psys_v) //} // /* Cloth functions */ -static int ptcache_write_cloth(int index, void *cloth_v, void **data) +static int ptcache_write_cloth(int index, void *cloth_v, void **data, int cfra) { ClothModifierData *clmd= cloth_v; Cloth *cloth= clmd->clothObject; @@ -554,10 +557,10 @@ static void ptcache_interpolate_cloth(int index, void *cloth_v, void **data, flo /* should vert->xconst be interpolated somehow too? - jahka */ } -static int ptcache_totpoint_cloth(void *cloth_v) +static int ptcache_totpoint_cloth(void *cloth_v, int cfra) { ClothModifierData *clmd= cloth_v; - return clmd->clothObject->numverts; + return clmd->clothObject ? clmd->clothObject->numverts : 0; } /* Creating ID's */ @@ -615,11 +618,7 @@ void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *p pid->write_header= ptcache_write_basic_header; pid->read_header= ptcache_read_basic_header; - pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY); - - /* TODO for later */ - //if((psys->part->flag & (PART_UNBORN|PART_DIED))==0) - // pid->data_types|= (1<<BPHYS_DATA_INDEX); + pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_INDEX); if(psys->part->phystype == PART_PHYS_BOIDS) pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION) | (1<<BPHYS_DATA_BOIDS); @@ -635,7 +634,7 @@ void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *p } /* Smoke functions */ -static int ptcache_totpoint_smoke(void *smoke_v) +static int ptcache_totpoint_smoke(void *smoke_v, int cfra) { SmokeModifierData *smd= (SmokeModifierData *)smoke_v; SmokeDomainSettings *sds = smd->domain; @@ -648,7 +647,7 @@ static int ptcache_totpoint_smoke(void *smoke_v) } /* Smoke functions */ -static int ptcache_totpoint_smoke_turbulence(void *smoke_v) +static int ptcache_totpoint_smoke_turbulence(void *smoke_v, int cfra) { SmokeModifierData *smd= (SmokeModifierData *)smoke_v; SmokeDomainSettings *sds = smd->domain; @@ -803,31 +802,37 @@ static int ptcache_compress_read(PTCacheFile *pf, unsigned char *result, unsigne int r = 0; unsigned char compressed = 0; unsigned int in_len; +#ifdef WITH_LZO unsigned int out_len = len; + size_t sizeOfIt = 5; +#endif unsigned char *in; unsigned char *props = MEM_callocN(16*sizeof(char), "tmp"); - size_t sizeOfIt = 5; ptcache_file_read(pf, &compressed, 1, sizeof(unsigned char)); if(compressed) { ptcache_file_read(pf, &in_len, 1, sizeof(unsigned int)); - in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer"); - ptcache_file_read(pf, in, in_len, sizeof(unsigned char)); - + if(in_len==0) { + /* do nothing */ + } + else { + in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer"); + ptcache_file_read(pf, in, in_len, sizeof(unsigned char)); #ifdef WITH_LZO - if(compressed == 1) - r = lzo1x_decompress(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL); + if(compressed == 1) + r = lzo1x_decompress_safe(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL); #endif #ifdef WITH_LZMA - if(compressed == 2) - { - size_t leni = in_len, leno = out_len; - ptcache_file_read(pf, &sizeOfIt, 1, sizeof(unsigned int)); - ptcache_file_read(pf, props, sizeOfIt, sizeof(unsigned char)); - r = LzmaUncompress(result, &leno, in, &leni, props, sizeOfIt); - } + if(compressed == 2) + { + size_t leni = in_len, leno = out_len; + ptcache_file_read(pf, &sizeOfIt, 1, sizeof(unsigned int)); + ptcache_file_read(pf, props, sizeOfIt, sizeof(unsigned char)); + r = LzmaUncompress(result, &leno, in, &leni, props, sizeOfIt); + } #endif - MEM_freeN(in); + MEM_freeN(in); + } } else { ptcache_file_read(pf, result, len, sizeof(unsigned char)); @@ -987,7 +992,7 @@ void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *cl pid->info_types= 0; } -void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob) +void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int duplis) { PTCacheID *pid; ParticleSystem *psys; @@ -1029,6 +1034,23 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob) } } } + + if(scene && (duplis-- > 0) && (ob->transflag & OB_DUPLI)) { + ListBase *lb_dupli_ob; + + if((lb_dupli_ob=object_duplilist(scene, ob))) { + DupliObject *dob; + for(dob= lb_dupli_ob->first; dob; dob= dob->next) { + ListBase lb_dupli_pid; + BKE_ptcache_ids_from_object(&lb_dupli_pid, dob->ob, scene, duplis); + addlisttolist(lb, &lb_dupli_pid); + if(lb_dupli_pid.first) + printf("Adding Dupli\n"); + } + + free_object_duplilist(lb_dupli_ob); /* does restore */ + } + } } @@ -1045,22 +1067,22 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob) static int ptcache_path(PTCacheID *pid, char *filename) { - Library *lib; + Library *lib= (pid)? pid->ob->id.lib: NULL; + const char *blendfilename= (lib && (pid->cache->flag & PTCACHE_IGNORE_LIBPATH)==0) ? lib->filepath: G.sce; size_t i; - lib= (pid)? pid->ob->id.lib: NULL; - if(pid->cache->flag & PTCACHE_EXTERNAL) { strcpy(filename, pid->cache->path); + + if(strncmp(filename, "//", 2)==0) + BLI_path_abs(filename, blendfilename); + return BLI_add_slash(filename); /* new strlen() */ } else if (G.relbase_valid || lib) { char file[MAX_PTCACHE_PATH]; /* we dont want the dir, only the file */ - char *blendfilename; - blendfilename= (lib)? lib->filename: G.sce; - - BLI_split_dirfile_basic(blendfilename, NULL, file); + BLI_split_dirfile(blendfilename, NULL, file); i = strlen(file); /* remove .blend */ @@ -1068,7 +1090,7 @@ static int ptcache_path(PTCacheID *pid, char *filename) file[i-6] = '\0'; snprintf(filename, MAX_PTCACHE_PATH, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */ - BLI_convertstringcode(filename, blendfilename); + BLI_path_abs(filename, blendfilename); return BLI_add_slash(filename); /* new strlen() */ } @@ -1137,10 +1159,11 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra) FILE *fp = NULL; char filename[(FILE_MAXDIR+FILE_MAXFILE)*2]; +#ifndef DURIAN_POINTCACHE_LIB_OK /* don't allow writing for linked objects */ if(pid->ob->id.lib && mode == PTCACHE_FILE_WRITE) return NULL; - +#endif if (!G.relbase_valid && (pid->cache->flag & PTCACHE_EXTERNAL)==0) return NULL; /* save blend file before using disk pointcache */ BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); @@ -1149,7 +1172,7 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra) if (!BLI_exists(filename)) { return NULL; } - fp = fopen(filename, "rb"); + fp = fopen(filename, "rb"); } else if (mode==PTCACHE_FILE_WRITE) { BLI_make_existing_file(filename); /* will create the dir if needs be, same as //textures is created */ fp = fopen(filename, "wb"); @@ -1158,13 +1181,13 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra) fp = fopen(filename, "rb+"); } - if (!fp) - return NULL; + if (!fp) + return NULL; pf= MEM_mallocN(sizeof(PTCacheFile), "PTCacheFile"); pf->fp= fp; - return pf; + return pf; } static void ptcache_file_close(PTCacheFile *pf) @@ -1266,12 +1289,32 @@ static void ptcache_file_seek_pointers(int index, PTCacheFile *pf) int i, size=0; int data_types = pf->data_types; - for(i=0; i<BPHYS_TOT_DATA; i++) - size += pf->data_types & (1<<i) ? ptcache_data_size[i] : 0; + if(data_types & (1<<BPHYS_DATA_INDEX)) { + int totpoint; + /* The simplest solution is to just write to the very end. This may cause + * some data duplication, but since it's on disk it's not so bad. The correct + * thing would be to search through the file for the correct index and only + * write to the end if it's not found, but this could be quite slow. + */ + fseek(pf->fp, 8 + sizeof(int), SEEK_SET); + fread(&totpoint, sizeof(int), 1, pf->fp); + + totpoint++; + + fseek(pf->fp, 8 + sizeof(int), SEEK_SET); + fwrite(&totpoint, sizeof(int), 1, pf->fp); + + fseek(pf->fp, 0, SEEK_END); + } + else { + for(i=0; i<BPHYS_TOT_DATA; i++) + size += pf->data_types & (1<<i) ? ptcache_data_size[i] : 0; + + /* size of default header + data up to index */ + fseek(pf->fp, 8 + 3*sizeof(int) + index * size, SEEK_SET); + } ptcache_file_init_pointers(pf); - /* size of default header + data up to index */ - fseek(pf->fp, 8 + 3*sizeof(int) + index * size, SEEK_SET); } void BKE_ptcache_mem_init_pointers(PTCacheMem *pm) { @@ -1291,13 +1334,24 @@ void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm) pm->cur[i] = (char*)pm->cur[i] + ptcache_data_size[i]; } } -void BKE_ptcache_mem_seek_pointers(int index, PTCacheMem *pm) +int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm) { int data_types = pm->data_types; - int i; + int i, index = pm->index_array ? pm->index_array[point_index] - 1 : point_index; + + if(index < 0) { + /* Can't give proper location without reallocation, so don't give any location. + * Some points will be cached improperly, but this only happens with simulation + * steps bigger than cache->step, so the cache has to be recalculated anyways + * at some point. + */ + return 0; + } for(i=0; i<BPHYS_TOT_DATA; i++) pm->cur[i] = data_types & (1<<i) ? (char*)pm->data[i] + index * ptcache_data_size[i] : NULL; + + return 1; } static void ptcache_alloc_data(PTCacheMem *pm) { @@ -1310,20 +1364,28 @@ static void ptcache_alloc_data(PTCacheMem *pm) pm->data[i] = MEM_callocN(totpoint * ptcache_data_size[i], "PTCache Data"); } } -static void ptcache_free_data(void *data[]) +static void ptcache_free_data(PTCacheMem *pm) { + void **data = pm->data; int i; for(i=0; i<BPHYS_TOT_DATA; i++) { if(data[i]) MEM_freeN(data[i]); } + + if(pm->index_array) { + MEM_freeN(pm->index_array); + pm->index_array = NULL; + } } static void ptcache_copy_data(void *from[], void *to[]) { int i; for(i=0; i<BPHYS_TOT_DATA; i++) { - if(from[i]) + /* note, durian file 03.4b_comp crashes if to[i] is not tested + * its NULL, not sure if this should be fixed elsewhere but for now its needed */ + if(from[i] && to[i]) memcpy(to[i], from[i], ptcache_data_size[i]); } } @@ -1361,7 +1423,7 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) int ret = 0, error = 0; /* nothing to read to */ - if(pid->totpoint(pid->calldata) == 0) + if(pid->totpoint(pid->calldata, (int)cfra) == 0) return 0; if(pid->cache->flag & PTCACHE_READ_INFO) { @@ -1462,13 +1524,13 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) else if(pid->read_header(pf)) { ptcache_file_init_pointers(pf); totpoint = pf->totpoint; - index = pf->data_types & BPHYS_DATA_INDEX ? &pf->data.index : &i; + index = pf->data_types & (1<<BPHYS_DATA_INDEX) ? &pf->data.index : &i; } } else { /* fall back to old cache file format */ use_old = 1; - totpoint = pid->totpoint(pid->calldata); + totpoint = pid->totpoint(pid->calldata, (int) cfra); } } if(pf2) { @@ -1481,13 +1543,13 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) else if(pid->read_header(pf2)) { ptcache_file_init_pointers(pf2); totpoint2 = pf2->totpoint; - index2 = pf2->data_types & BPHYS_DATA_INDEX ? &pf2->data.index : &i; + index2 = pf2->data_types & (1<<BPHYS_DATA_INDEX) ? &pf2->data.index : &i; } } else { /* fall back to old cache file format */ use_old = 1; - totpoint2 = pid->totpoint(pid->calldata); + totpoint2 = pid->totpoint(pid->calldata, (int) cfra); } } @@ -1500,7 +1562,7 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) if(!error) { if(pf && pid->read_stream) { - if(totpoint != pid->totpoint(pid->calldata)) + if(totpoint != pid->totpoint(pid->calldata, (int) cfra)) error = 1; else { @@ -1510,7 +1572,8 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) } } - totpoint = MIN2(totpoint, pid->totpoint(pid->calldata)); + if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0) + totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, (int) cfra)); if(!error) { @@ -1539,7 +1602,7 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) if(!error) { if(pf2 && pid->read_stream) { - if(totpoint2 != pid->totpoint(pid->calldata)) + if(totpoint2 != pid->totpoint(pid->calldata, (int) cfra)) error = 1; else { @@ -1549,7 +1612,8 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) } } - totpoint2 = MIN2(totpoint2, pid->totpoint(pid->calldata)); + if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0) + totpoint2 = MIN2(totpoint2, pid->totpoint(pid->calldata, (int) cfra)); if(!error) { @@ -1621,41 +1685,40 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec) return (error ? 0 : ret); } /* TODO for later */ -//static void ptcache_make_index_array(PTCacheMem *pm, int totpoint) -//{ -// int i, *index; -// -// if(pm->index_array) { -// MEM_freeN(pm->index_array); -// pm->index_array = NULL; -// } -// -// if(!pm->data[BPHYS_DATA_INDEX]) -// return; -// -// pm->index_array = MEM_callocN(totpoint * sizeof(int), "PTCacheMem index_array"); -// index = pm->data[BPHYS_DATA_INDEX]; -// -// for(i=0; i<pm->totpoint; i++, index++) -// pm->index_array[*index] = i; -//} +static void ptcache_make_index_array(PTCacheMem *pm, int totpoint) +{ + int i, *index; + + if(pm->index_array) { + MEM_freeN(pm->index_array); + pm->index_array = NULL; + } + + if(!pm->data[BPHYS_DATA_INDEX]) + return; + + pm->index_array = MEM_callocN(totpoint * sizeof(int), "PTCacheMem index_array"); + index = pm->data[BPHYS_DATA_INDEX]; + + for(i=0; i<pm->totpoint; i++, index++) + pm->index_array[*index] = i + 1; +} /* writes cache to disk or memory */ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra) { PointCache *cache = pid->cache; PTCacheFile *pf= NULL, *pf2= NULL; int i; - int totpoint = pid->totpoint(pid->calldata); + int totpoint = pid->totpoint(pid->calldata, cfra); int add = 0, overwrite = 0; - if(totpoint == 0 || cfra < 0 - || (cfra ? pid->data_types == 0 : pid->info_types == 0)) + if(totpoint == 0 || (cfra ? pid->data_types == 0 : pid->info_types == 0)) return 0; if(cache->flag & PTCACHE_DISK_CACHE) { - int ofra, efra = cache->endframe; + int ofra=0, efra = cache->endframe; - if(cfra==0) + if(cfra==0 && cache->startframe > 0) add = 1; /* allways start from scratch on the first frame */ else if(cfra == cache->startframe) { @@ -1690,7 +1753,7 @@ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra) return 0; pf->type = pid->type; - pf->totpoint = cfra ? totpoint : pid->totwrite(pid->calldata); + pf->totpoint = cfra ? pid->totwrite(pid->calldata, cfra) : totpoint; pf->data_types = cfra ? pid->data_types : pid->info_types; if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) { @@ -1707,7 +1770,7 @@ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra) else for(i=0; i<totpoint; i++) { if(pid->write_elem) { - int write = pid->write_elem(i, pid->calldata, pf->cur); + int write = pid->write_elem(i, pid->calldata, pf->cur, cfra); if(write) { if(!ptcache_file_write_data(pf)) { ptcache_file_close(pf); @@ -1727,7 +1790,7 @@ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra) pf2->data_types = pid->data_types; } ptcache_file_seek_pointers(i, pf2); - pid->write_elem(i, pid->calldata, pf2->cur); + pid->write_elem(i, pid->calldata, pf2->cur, cfra); if(!ptcache_file_write_data(pf2)) { ptcache_file_close(pf); ptcache_file_close(pf2); @@ -1773,7 +1836,7 @@ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra) pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem"); - pm->totpoint = pid->totwrite(pid->calldata); + pm->totpoint = pid->totwrite(pid->calldata, cfra); pm->data_types = cfra ? pid->data_types : pid->info_types; ptcache_alloc_data(pm); @@ -1781,20 +1844,20 @@ int BKE_ptcache_write_cache(PTCacheID *pid, int cfra) for(i=0; i<totpoint; i++) { if(pid->write_elem) { - int write = pid->write_elem(i, pid->calldata, pm->cur); + int write = pid->write_elem(i, pid->calldata, pm->cur, cfra); if(write) { BKE_ptcache_mem_incr_pointers(pm); /* newly born particles have to be copied to previous cached frame */ if(overwrite && write == 2) { pm2 = cache->mem_cache.last; - BKE_ptcache_mem_seek_pointers(i, pm2); - pid->write_elem(i, pid->calldata, pm2->cur); + if(BKE_ptcache_mem_seek_pointers(i, pm2)) + pid->write_elem(i, pid->calldata, pm2->cur, cfra); } } } } - //ptcache_make_index_array(pm, pid->totpoint(pid->calldata)); + ptcache_make_index_array(pm, pid->totpoint(pid->calldata, cfra)); pm->frame = cfra; BLI_addtail(&cache->mem_cache, pm); @@ -1839,9 +1902,11 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) if(!pid->cache || pid->cache->flag & PTCACHE_BAKED) return; +#ifndef DURIAN_POINTCACHE_LIB_OK /* don't allow clearing for linked objects */ if(pid->ob->id.lib) return; +#endif /*if (!G.relbase_valid) return; *//* save blend file before using pointcache */ @@ -1865,7 +1930,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) if (strstr(de->d_name, ext)) { /* do we have the right extension?*/ if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */ if (mode == PTCACHE_CLEAR_ALL) { - pid->cache->last_exact = 0; + pid->cache->last_exact = MIN2(pid->cache->startframe, 0); BLI_join_dirfile(path_full, path, de->d_name); BLI_delete(path_full, 0, 0); } else { @@ -1897,17 +1962,18 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) pm= pid->cache->mem_cache.first; if(mode == PTCACHE_CLEAR_ALL) { - pid->cache->last_exact = 0; + /*we want startframe if the cache starts before zero*/ + pid->cache->last_exact = MIN2(pid->cache->startframe, 0); for(; pm; pm=pm->next) - ptcache_free_data(pm->data); + ptcache_free_data(pm); BLI_freelistN(&pid->cache->mem_cache); } else { while(pm) { if((mode==PTCACHE_CLEAR_BEFORE && pm->frame < cfra) || (mode==PTCACHE_CLEAR_AFTER && pm->frame > cfra) ) { link = pm; + ptcache_free_data(pm); pm = pm->next; - ptcache_free_data(link->data); BLI_freelinkN(&pid->cache->mem_cache, link); } else @@ -1929,7 +1995,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) for(; pm; pm=pm->next) { if(pm->frame == cfra) { - ptcache_free_data(pm->data); + ptcache_free_data(pm); BLI_freelinkN(&pid->cache->mem_cache, pm); break; } @@ -2047,9 +2113,8 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode) } if(reset) { - cache->flag &= ~(PTCACHE_REDO_NEEDED|PTCACHE_SIMULATION_VALID); - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); + cache->flag &= ~PTCACHE_REDO_NEEDED; if(pid->type == PTCACHE_TYPE_CLOTH) cloth_free_modifier(pid->ob, pid->calldata); @@ -2214,11 +2279,8 @@ void BKE_ptcache_free_mem(ListBase *mem_cache) PTCacheMem *pm = mem_cache->first; if(pm) { - for(; pm; pm=pm->next) { - ptcache_free_data(pm->data); - if(pm->index_array) - MEM_freeN(pm->index_array); - } + for(; pm; pm=pm->next) + ptcache_free_data(pm); BLI_freelistN(mem_cache); } @@ -2271,38 +2333,6 @@ PointCache *BKE_ptcache_copy_list(ListBase *ptcaches_new, ListBase *ptcaches_old /* Baking */ -static int count_quick_cache(Scene *scene, int *quick_step) -{ - Base *base = scene->base.first; - PTCacheID *pid; - ListBase pidlist; - int autocache_count= 0; - - for(base = scene->base.first; base; base = base->next) { - if(base->object) { - BKE_ptcache_ids_from_object(&pidlist, base->object); - - for(pid=pidlist.first; pid; pid=pid->next) { - if((pid->cache->flag & PTCACHE_BAKED) - || (pid->cache->flag & PTCACHE_QUICK_CACHE)==0) - continue; - - if(pid->cache->flag & PTCACHE_OUTDATED || (pid->cache->flag & PTCACHE_SIMULATION_VALID)==0) { - if(!autocache_count) - *quick_step = pid->cache->step; - else - *quick_step = MIN2(*quick_step, pid->cache->step); - - autocache_count++; - } - } - - BLI_freelistN(&pidlist); - } - } - - return autocache_count; -} void BKE_ptcache_quick_cache_all(Scene *scene) { PTCacheBaker baker; @@ -2317,9 +2347,9 @@ void BKE_ptcache_quick_cache_all(Scene *scene) baker.render=0; baker.anim_init = 0; baker.scene=scene; + baker.quick_step=scene->physics_settings.quick_cache_step; - if(count_quick_cache(scene, &baker.quick_step)) - BKE_ptcache_make_cache(&baker); + BKE_ptcache_make_cache(&baker); } /* Simulation thread, no need for interlocks as data written in both threads @@ -2336,13 +2366,12 @@ typedef struct { static void *ptcache_make_cache_thread(void *ptr) { ptcache_make_cache_data *data = (ptcache_make_cache_data*)ptr; -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - pthread_setspecific (gomp_tls_key, thread_tls_data); -#endif - - for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step) + for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step) { scene_update_for_newframe(data->scene, data->scene->lay); + if(G.background) { + printf("bake: frame %d :: %d\n", (int)*data->cfra_ptr, data->endframe); + } + } data->thread_ended = TRUE; return NULL; @@ -2352,6 +2381,7 @@ static void *ptcache_make_cache_thread(void *ptr) { void BKE_ptcache_make_cache(PTCacheBaker* baker) { Scene *scene = baker->scene; + Scene *sce; /* SETLOOPER macro only */ Base *base; ListBase pidlist; PTCacheID *pid = baker->pid; @@ -2377,13 +2407,18 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker) /* cache/bake a single object */ cache = pid->cache; if((cache->flag & PTCACHE_BAKED)==0) { - if(pid->type==PTCACHE_TYPE_PARTICLES) - psys_get_pointcache_start_end(scene, pid->calldata, &cache->startframe, &cache->endframe); + if(pid->type==PTCACHE_TYPE_PARTICLES) { + ParticleSystem *psys= pid->calldata; + + /* a bit confusing, could make this work better in the UI */ + if(psys->part->type == PART_EMITTER) + psys_get_pointcache_start_end(scene, pid->calldata, &cache->startframe, &cache->endframe); + } else if(pid->type == PTCACHE_TYPE_SMOKE_HIGHRES) { /* get all pids from the object and search for smoke low res */ ListBase pidlist2; PTCacheID *pid2; - BKE_ptcache_ids_from_object(&pidlist2, pid->ob); + BKE_ptcache_ids_from_object(&pidlist2, pid->ob, scene, MAX_DUPLI_RECUR); for(pid2=pidlist2.first; pid2; pid2=pid2->next) { if(pid2->type == PTCACHE_TYPE_SMOKE_DOMAIN) { @@ -2416,9 +2451,9 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker) cache->flag &= ~PTCACHE_BAKED; } } - else for(base=scene->base.first; base; base= base->next) { + else for(SETLOOPER(scene, base)) { /* cache/bake everything in the scene */ - BKE_ptcache_ids_from_object(&pidlist, base->object); + BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR); for(pid=pidlist.first; pid; pid=pid->next) { cache = pid->cache; @@ -2458,40 +2493,40 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker) thread_data.thread_ended = FALSE; old_progress = -1; -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - thread_tls_data = pthread_getspecific(gomp_tls_key); -#endif - BLI_init_threads(&threads, ptcache_make_cache_thread, 1); - BLI_insert_thread(&threads, (void*)&thread_data); - - while (thread_data.thread_ended == FALSE) { - - if(bake) - progress = (int)(100.0f * (float)(CFRA - startframe)/(float)(thread_data.endframe-startframe)); - else - progress = CFRA; - - /* NOTE: baking should not redraw whole ui as this slows things down */ - if ((baker->progressbar) && (progress != old_progress)) { - baker->progressbar(baker->progresscontext, progress); - old_progress = progress; - } - - /* Delay to lessen CPU load from UI thread */ - PIL_sleep_ms(200); - - /* NOTE: breaking baking should leave calculated frames in cache, not clear it */ - if(blender_test_break() && !thread_data.break_operation) { - thread_data.break_operation = TRUE; - if (baker->progressend) - baker->progressend(baker->progresscontext); - WM_cursor_wait(1); - } + if(G.background) { + ptcache_make_cache_thread((void*)&thread_data); } + else { + BLI_init_threads(&threads, ptcache_make_cache_thread, 1); + BLI_insert_thread(&threads, (void*)&thread_data); + + while (thread_data.thread_ended == FALSE) { + + if(bake) + progress = (int)(100.0f * (float)(CFRA - startframe)/(float)(thread_data.endframe-startframe)); + else + progress = CFRA; + + /* NOTE: baking should not redraw whole ui as this slows things down */ + if ((baker->progressbar) && (progress != old_progress)) { + baker->progressbar(baker->progresscontext, progress); + old_progress = progress; + } + + /* Delay to lessen CPU load from UI thread */ + PIL_sleep_ms(200); + + /* NOTE: breaking baking should leave calculated frames in cache, not clear it */ + if(blender_test_break() && !thread_data.break_operation) { + thread_data.break_operation = TRUE; + if (baker->progressend) + baker->progressend(baker->progresscontext); + WM_cursor_wait(1); + } + } BLI_end_threads(&threads); - + } /* clear baking flag */ if(pid) { cache->flag &= ~(PTCACHE_BAKING|PTCACHE_REDO_NEEDED); @@ -2503,8 +2538,8 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker) BKE_ptcache_write_cache(pid, 0); } } - else for(base=scene->base.first; base; base= base->next) { - BKE_ptcache_ids_from_object(&pidlist, base->object); + else for(SETLOOPER(scene, base)) { + BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR); for(pid=pidlist.first; pid; pid=pid->next) { /* skip hair particles */ @@ -2587,7 +2622,7 @@ void BKE_ptcache_disk_to_mem(PTCacheID *pid) cache->flag |= PTCACHE_DISK_CACHE; - ptcache_free_data(pm->data); + ptcache_free_data(pm); MEM_freeN(pm); ptcache_file_close(pf); @@ -2597,7 +2632,7 @@ void BKE_ptcache_disk_to_mem(PTCacheID *pid) BKE_ptcache_mem_incr_pointers(pm); } - //ptcache_make_index_array(pm, pid->totpoint(pid->calldata)); + ptcache_make_index_array(pm, pid->totpoint(pid->calldata, cfra)); BLI_addtail(&pid->cache->mem_cache, pm); @@ -2629,7 +2664,8 @@ void BKE_ptcache_mem_to_disk(PTCacheID *pid) ptcache_file_init_pointers(pf); if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) { - printf("Error writing to disk cache\n"); + if (G.f & G_DEBUG) + printf("Error writing to disk cache\n"); cache->flag &= ~PTCACHE_DISK_CACHE; ptcache_file_close(pf); @@ -2639,7 +2675,8 @@ void BKE_ptcache_mem_to_disk(PTCacheID *pid) for(i=0; i<pm->totpoint; i++) { ptcache_copy_data(pm->cur, pf->cur); if(!ptcache_file_write_data(pf)) { - printf("Error writing to disk cache\n"); + if (G.f & G_DEBUG) + printf("Error writing to disk cache\n"); cache->flag &= ~PTCACHE_DISK_CACHE; ptcache_file_close(pf); @@ -2655,7 +2692,8 @@ void BKE_ptcache_mem_to_disk(PTCacheID *pid) BKE_ptcache_write_cache(pid, 0); } else - printf("Error creating disk cache file\n"); + if (G.f & G_DEBUG) + printf("Error creating disk cache file\n"); } } void BKE_ptcache_toggle_disk_cache(PTCacheID *pid) @@ -2665,7 +2703,8 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid) if (!G.relbase_valid){ cache->flag &= ~PTCACHE_DISK_CACHE; - printf("File must be saved before using disk cache!\n"); + if (G.f & G_DEBUG) + printf("File must be saved before using disk cache!\n"); return; } @@ -2813,16 +2852,14 @@ void BKE_ptcache_update_info(PTCacheID *pid) } else { PTCacheMem *pm = cache->mem_cache.first; - float framesize = 0.0f, bytes = 0.0f; - int mb; - - if(pm) - framesize = (float)ptcache_pid_old_elemsize(pid) * (float)pm->totpoint; + float bytes = 0.0f; + int i, mb; - for(; pm; pm=pm->next) + for(; pm; pm=pm->next) { + for(i=0; i<BPHYS_TOT_DATA; i++) + bytes += pm->data[i] ? MEM_allocN_len(pm->data[i]) : 0.0f; totframes++; - - bytes = totframes * framesize; + } mb = (bytes > 1024.0f * 1024.0f); @@ -2841,3 +2878,16 @@ void BKE_ptcache_update_info(PTCacheID *pid) else sprintf(cache->info, "%s.", mem_info); } + +void BKE_ptcache_validate(PointCache *cache, int framenr) +{ + cache->flag |= PTCACHE_SIMULATION_VALID; + cache->simframe = framenr; +} +void BKE_ptcache_invalidate(PointCache *cache) +{ + cache->flag &= ~PTCACHE_SIMULATION_VALID; + cache->simframe = 0; + cache->last_exact = MIN2(cache->startframe, 0); +} + diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c index d65e3391f04..a2ba7c69b93 100644 --- a/source/blender/blenkernel/intern/property.c +++ b/source/blender/blenkernel/intern/property.c @@ -35,18 +35,12 @@ #include <string.h> #include <ctype.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "MEM_guardedalloc.h" #include "DNA_property_types.h" #include "DNA_object_types.h" -#include "DNA_listBase.h" #include "BLI_blenlib.h" -#include "BKE_property.h" void free_property(bProperty *prop) { diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c index a2a44ca53a7..173c6c136f2 100644 --- a/source/blender/blenkernel/intern/report.c +++ b/source/blender/blenkernel/intern/report.c @@ -27,12 +27,12 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" - #include "BLI_blenlib.h" #include "BLI_dynstr.h" #include "BKE_report.h" +#include "BKE_global.h" /* G.background only */ +#include "BKE_utildefines.h" #include <stdarg.h> #include <stdio.h> @@ -67,7 +67,7 @@ void BKE_reports_init(ReportList *reports, int flag) memset(reports, 0, sizeof(ReportList)); reports->storelevel= RPT_INFO; - reports->printlevel= RPT_INFO; + reports->printlevel= RPT_ERROR; reports->flag= flag; } @@ -95,6 +95,10 @@ void BKE_report(ReportList *reports, ReportType type, const char *message) Report *report; int len; + /* exception, print and return in background, no reason to store a list */ + if(G.background) + reports= NULL; + if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) { printf("%s: %s\n", report_type_str(type), message); fflush(stdout); /* this ensures the message is printed before a crash */ @@ -259,3 +263,14 @@ void BKE_reports_print(ReportList *reports, ReportType level) MEM_freeN(cstring); } +Report *BKE_reports_last_displayable(ReportList *reports) +{ + Report *report=NULL; + + for (report= (Report *)reports->list.last; report; report=report->prev) { + if (ELEM3(report->type, RPT_ERROR, RPT_WARNING, RPT_INFO)) + return report; + } + + return NULL; +} \ No newline at end of file diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 1c727ee1596..61e98ce9d45 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -29,17 +29,12 @@ * all data is 'direct data', not Blender lib data. */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include <stdio.h> #include <string.h> #include <float.h> #include "MEM_guardedalloc.h" -#include "DNA_text_types.h" #include "DNA_controller_types.h" #include "DNA_sensor_types.h" #include "DNA_actuator_types.h" @@ -49,7 +44,7 @@ #include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_main.h" -#include "BKE_blender.h" +#include "BKE_library.h" #include "BKE_sca.h" /* ******************* SENSORS ************************ */ @@ -105,6 +100,8 @@ void init_sensor(bSensor *sens) /* also use when sensor changes type */ bNearSensor *ns; bMouseSensor *ms; + bJoystickSensor *js; + bRaySensor *rs; if(sens->data) MEM_freeN(sens->data); sens->data= NULL; @@ -152,12 +149,18 @@ void init_sensor(bSensor *sens) break; case SENS_RAY: sens->data= MEM_callocN(sizeof(bRaySensor), "raysens"); + rs = sens->data; + rs->range = 0.01f; break; case SENS_MESSAGE: sens->data= MEM_callocN(sizeof(bMessageSensor), "messagesens"); break; case SENS_JOYSTICK: sens->data= MEM_callocN(sizeof(bJoystickSensor), "joysticksens"); + js= sens->data; + js->hatf = SENS_JOY_HAT_UP; + js->axis = 1; + js->hat = 1; break; default: ; /* this is very severe... I cannot make any memory for this */ @@ -187,26 +190,13 @@ void unlink_controller(bController *cont) { bSensor *sens; Object *ob; - int a, removed; /* check for controller pointers in sensors */ ob= G.main->object.first; while(ob) { sens= ob->sensors.first; while(sens) { - removed= 0; - for(a=0; a<sens->totlinks; a++) { - if(removed) (sens->links)[a-1] = (sens->links)[a]; - else if((sens->links)[a] == cont) removed= 1; - } - if(removed) { - sens->totlinks--; - - if(sens->totlinks==0) { - MEM_freeN(sens->links); - sens->links= NULL; - } - } + unlink_logicbricks((void **)&cont, (void ***)&(sens->links), &sens->totlinks); sens= sens->next; } ob= ob->id.next; @@ -311,26 +301,13 @@ void unlink_actuator(bActuator *act) { bController *cont; Object *ob; - int a, removed; /* check for actuator pointers in controllers */ ob= G.main->object.first; while(ob) { cont= ob->controllers.first; while(cont) { - removed= 0; - for(a=0; a<cont->totlinks; a++) { - if(removed) (cont->links)[a-1] = (cont->links)[a]; - else if((cont->links)[a] == act) removed= 1; - } - if(removed) { - cont->totlinks--; - - if(cont->totlinks==0) { - MEM_freeN(cont->links); - cont->links= NULL; - } - } + unlink_logicbricks((void **)&act, (void ***)&(cont->links), &cont->totlinks); cont= cont->next; } ob= ob->id.next; @@ -347,7 +324,19 @@ void unlink_actuators(ListBase *lb) void free_actuator(bActuator *act) { - if(act->data) MEM_freeN(act->data); + bSoundActuator *sa; + + if(act->data) { + switch (act->type) { + case ACT_SOUND: + sa = (bSoundActuator *) act->data; + if(sa->sound) + id_us_min((ID *) sa->sound); + break; + } + + MEM_freeN(act->data); + } MEM_freeN(act); } @@ -364,6 +353,7 @@ void free_actuators(ListBase *lb) bActuator *copy_actuator(bActuator *act) { bActuator *actn; + bSoundActuator *sa; act->mynew=actn= MEM_dupallocN(act); actn->flag |= ACT_NEW; @@ -371,6 +361,13 @@ bActuator *copy_actuator(bActuator *act) actn->data= MEM_dupallocN(act->data); } + switch (act->type) { + case ACT_SOUND: + sa= (bSoundActuator *)act->data; + if(sa->sound) + id_us_plus((ID *) sa->sound); + break; + } return actn; } @@ -390,7 +387,9 @@ void copy_actuators(ListBase *lbn, ListBase *lbo) void init_actuator(bActuator *act) { /* also use when actuator changes type */ + bCameraActuator *ca; bObjectActuator *oa; + bRandomActuator *ra; bSoundActuator *sa; if(act->data) MEM_freeN(act->data); @@ -424,6 +423,8 @@ void init_actuator(bActuator *act) break; case ACT_CAMERA: act->data= MEM_callocN(sizeof(bCameraActuator), "camact"); + ca = act->data; + ca->axis = ACT_CAMERA_X; break; case ACT_EDIT_OBJECT: act->data= MEM_callocN(sizeof(bEditObjectActuator), "editobact"); @@ -439,6 +440,8 @@ void init_actuator(bActuator *act) break; case ACT_RANDOM: act->data= MEM_callocN(sizeof(bRandomActuator), "random act"); + ra=act->data; + ra->float_arg_1 = 0.1f; break; case ACT_MESSAGE: act->data= MEM_callocN(sizeof(bMessageActuator), "message act"); @@ -449,18 +452,18 @@ void init_actuator(bActuator *act) case ACT_VISIBILITY: act->data= MEM_callocN(sizeof(bVisibilityActuator), "visibility act"); break; - case ACT_2DFILTER: - act->data = MEM_callocN(sizeof( bTwoDFilterActuator ), "2d filter act"); - break; - case ACT_PARENT: - act->data = MEM_callocN(sizeof( bParentActuator ), "parent act"); - break; + case ACT_2DFILTER: + act->data = MEM_callocN(sizeof( bTwoDFilterActuator ), "2d filter act"); + break; + case ACT_PARENT: + act->data = MEM_callocN(sizeof( bParentActuator ), "parent act"); + break; case ACT_STATE: - act->data = MEM_callocN(sizeof( bStateActuator ), "state act"); - break; + act->data = MEM_callocN(sizeof( bStateActuator ), "state act"); + break; case ACT_ARMATURE: - act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act"); - break; + act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act"); + break; default: ; /* this is very severe... I cannot make any memory for this */ /* logic brick... */ @@ -484,7 +487,6 @@ bActuator *new_actuator(int type) } /* ******************** GENERAL ******************* */ - void clear_sca_new_poins_ob(Object *ob) { bSensor *sens; @@ -655,3 +657,180 @@ void sca_remove_ob_poin(Object *obt, Object *ob) act= act->next; } } + +/* ******************** INTERFACE ******************* */ +void sca_move_sensor(bSensor *sens_to_move, Object *ob, int move_up) +{ + bSensor *sens, *tmp; + + int val; + val = move_up ? 1:2; + + /* make sure this sensor belongs to this object */ + sens= ob->sensors.first; + while(sens) { + if(sens == sens_to_move) break; + sens= sens->next; + } + if(!sens) return; + + /* move up */ + if( val==1 && sens->prev) { + for (tmp=sens->prev; tmp; tmp=tmp->prev) { + if (tmp->flag & SENS_VISIBLE) + break; + } + if (tmp) { + BLI_remlink(&ob->sensors, sens); + BLI_insertlinkbefore(&ob->sensors, tmp, sens); + } + } + /* move down */ + else if( val==2 && sens->next) { + for (tmp=sens->next; tmp; tmp=tmp->next) { + if (tmp->flag & SENS_VISIBLE) + break; + } + if (tmp) { + BLI_remlink(&ob->sensors, sens); + BLI_insertlink(&ob->sensors, tmp, sens); + } + } +} + +void sca_move_controller(bController *cont_to_move, Object *ob, int move_up) +{ + bController *cont, *tmp; + + int val; + val = move_up ? 1:2; + + /* make sure this controller belongs to this object */ + cont= ob->controllers.first; + while(cont) { + if(cont == cont_to_move) break; + cont= cont->next; + } + if(!cont) return; + + /* move up */ + if( val==1 && cont->prev) { + /* locate the controller that has the same state mask but is earlier in the list */ + tmp = cont->prev; + while(tmp) { + if(tmp->state_mask & cont->state_mask) + break; + tmp = tmp->prev; + } + if (tmp) { + BLI_remlink(&ob->controllers, cont); + BLI_insertlinkbefore(&ob->controllers, tmp, cont); + } + } + + /* move down */ + else if( val==2 && cont->next) { + tmp = cont->next; + while(tmp) { + if(tmp->state_mask & cont->state_mask) + break; + tmp = tmp->next; + } + BLI_remlink(&ob->controllers, cont); + BLI_insertlink(&ob->controllers, tmp, cont); + } +} + +void sca_move_actuator(bActuator *act_to_move, Object *ob, int move_up) +{ + bActuator *act, *tmp; + int val; + + val = move_up ? 1:2; + + /* make sure this actuator belongs to this object */ + act= ob->actuators.first; + while(act) { + if(act == act_to_move) break; + act= act->next; + } + if(!act) return; + + /* move up */ + if( val==1 && act->prev) { + /* locate the first visible actuators before this one */ + for (tmp = act->prev; tmp; tmp=tmp->prev) { + if (tmp->flag & ACT_VISIBLE) + break; + } + if (tmp) { + BLI_remlink(&ob->actuators, act); + BLI_insertlinkbefore(&ob->actuators, tmp, act); + } + } + /* move down */ + else if( val==2 && act->next) { + /* locate the first visible actuators after this one */ + for (tmp=act->next; tmp; tmp=tmp->next) { + if (tmp->flag & ACT_VISIBLE) + break; + } + if (tmp) { + BLI_remlink(&ob->actuators, act); + BLI_insertlink(&ob->actuators, tmp, act); + } + } +} + +void link_logicbricks(void **poin, void ***ppoin, short *tot, short size) +{ + void **old_links= NULL; + + int ibrick; + + /* check if the bricks are already linked */ + for (ibrick=0; ibrick < *tot; ibrick++) { + if ((*ppoin)[ibrick] == *poin) + return; + } + + if (*ppoin) { + old_links= *ppoin; + + (*tot) ++; + *ppoin = MEM_callocN((*tot)*size, "new link"); + + for (ibrick=0; ibrick < *tot - 1; ibrick++) { + (*ppoin)[ibrick] = old_links[ibrick]; + } + (*ppoin)[ibrick] = *poin; + + if(old_links) MEM_freeN(old_links); + } + else { + (*tot) = 1; + *ppoin = MEM_callocN((*tot)*size, "new link"); + (*ppoin)[0] = *poin; + } +} + +void unlink_logicbricks(void **poin, void ***ppoin, short *tot) +{ + int ibrick, removed; + + removed= 0; + for (ibrick=0; ibrick < *tot; ibrick++) { + if(removed) (*ppoin)[ibrick - removed] = (*ppoin)[ibrick]; + else if((*ppoin)[ibrick] == *poin) removed = 1; + } + + if (removed) { + (*tot) --; + + if(*tot == 0) { + MEM_freeN(*ppoin); + (*ppoin)= NULL; + } + return; + } +} diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 77b1202aa20..fe52375617b 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -33,10 +33,6 @@ #include <stdio.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #ifndef WIN32 #include <unistd.h> #else @@ -45,34 +41,17 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_armature_types.h" -#include "DNA_color_types.h" -#include "DNA_constraint_types.h" -#include "DNA_curve_types.h" #include "DNA_group_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_meta_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" +#include "DNA_sequence_types.h" -#include "BKE_action.h" #include "BKE_anim.h" #include "BKE_animsys.h" -#include "BKE_armature.h" -#include "BKE_colortools.h" -#include "BKE_colortools.h" -#include "BKE_constraint.h" #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_group.h" -#include "BKE_ipo.h" #include "BKE_idprop.h" -#include "BKE_image.h" -#include "BKE_key.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_node.h" @@ -219,20 +198,30 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type) scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms); } + if(sce->r.ffcodecdata.properties) { /* intentionally check scen not sce. */ + scen->r.ffcodecdata.properties= IDP_CopyProperty(sce->r.ffcodecdata.properties); + } + /* NOTE: part of SCE_COPY_LINK_DATA and SCE_COPY_FULL operations * are done outside of blenkernel with ED_objects_single_users! */ - /* camera */ + /* camera */ if(type == SCE_COPY_LINK_DATA || type == SCE_COPY_FULL) { - ID_NEW(scen->camera); + ID_NEW(scen->camera); } /* world */ if(type == SCE_COPY_FULL) { - if(scen->world) { - id_us_plus((ID *)scen->world); - scen->world= copy_world(scen->world); - } + if(scen->world) { + id_us_plus((ID *)scen->world); + scen->world= copy_world(scen->world); + } + + if(sce->ed) { + scen->ed= MEM_callocN( sizeof(Editing), "addseq"); + scen->ed->seqbasep= &scen->ed->seqbase; + seqbase_dupli_recursive(sce, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL); + } } sound_create_scene(scen); @@ -254,9 +243,9 @@ void free_scene(Scene *sce) if(sce->gpd) { #if 0 // removed since this can be invalid memory when freeing everything - // since the grease pencil data is free'd before the scene. - // since grease pencil data is not (yet?), shared between objects - // its probably safe not to do this, some save and reload will free this. + // since the grease pencil data is free'd before the scene. + // since grease pencil data is not (yet?), shared between objects + // its probably safe not to do this, some save and reload will free this. sce->gpd->id.us--; #endif sce->gpd= NULL; @@ -332,7 +321,7 @@ Scene *add_scene(char *name) int a; sce= alloc_libblock(&G.main->scene, ID_SCE, name); - sce->lay= 1; + sce->lay= sce->layact= 1; sce->r.mode= R_GAMMA|R_OSA|R_SHADOW|R_SSS|R_ENVMAP|R_RAYTRACE; sce->r.cfra= 1; @@ -365,7 +354,11 @@ Scene *add_scene(char *name) sce->r.scemode= R_DOCOMP|R_DOSEQ|R_EXTENSION; sce->r.stamp= R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_SCENE|R_STAMP_CAMERA|R_STAMP_RENDERTIME; sce->r.stamp_font_id= 12; - + + sce->r.seq_prev_type= OB_SOLID; + sce->r.seq_rend_type= OB_SOLID; + sce->r.seq_flag= R_SEQ_GL_PREV; + sce->r.threads= 1; sce->r.simplify_subsurf= 6; @@ -439,9 +432,10 @@ Scene *add_scene(char *name) pset->fade_frames= 2; pset->selectmode= SCE_SELECT_PATH; for(a=0; a<PE_TOT_BRUSH; a++) { - pset->brush[a].strength= 50; + pset->brush[a].strength= 0.5; pset->brush[a].size= 50; pset->brush[a].step= 10; + pset->brush[a].count= 10; } pset->brush[PE_BRUSH_CUT].strength= 100; @@ -559,18 +553,17 @@ void set_scene_bg(Scene *scene) } /* called from creator.c */ -void set_scene_name(char *name) +Scene *set_scene_name(char *name) { - Scene *sce; - - for (sce= G.main->scene.first; sce; sce= sce->id.next) { - if (BLI_streq(name, sce->id.name+2)) { - set_scene_bg(sce); - return; - } + Scene *sce= (Scene *)find_id("SC", name); + if(sce) { + set_scene_bg(sce); + printf("Scene switch: '%s' in file: '%s'\n", name, G.sce); + return sce; } - - //XXX error("Can't find scene: %s", name); + + printf("Can't find scene: '%s' in file: '%s'\n", name, G.sce); + return NULL; } void unlink_scene(Main *bmain, Scene *sce, Scene *newsce) @@ -600,7 +593,7 @@ void unlink_scene(Main *bmain, Scene *sce, Scene *newsce) /* used by metaballs * doesnt return the original duplicated object, only dupli's */ -int next_object(Scene *scene, int val, Base **base, Object **ob) +int next_object(Scene **scene, int val, Base **base, Object **ob) { static ListBase *duplilist= NULL; static DupliObject *dupob; @@ -629,17 +622,21 @@ int next_object(Scene *scene, int val, Base **base, Object **ob) /* the first base */ if(fase==F_START) { - *base= scene->base.first; + *base= (*scene)->base.first; if(*base) { *ob= (*base)->object; fase= F_SCENE; } else { - /* exception: empty scene */ - if(scene->set && scene->set->base.first) { - *base= scene->set->base.first; - *ob= (*base)->object; - fase= F_SET; + /* exception: empty scene */ + while((*scene)->set) { + (*scene)= (*scene)->set; + if((*scene)->base.first) { + *base= (*scene)->base.first; + *ob= (*base)->object; + fase= F_SCENE; + break; + } } } } @@ -649,11 +646,14 @@ int next_object(Scene *scene, int val, Base **base, Object **ob) if(*base) *ob= (*base)->object; else { if(fase==F_SCENE) { - /* scene is finished, now do the set */ - if(scene->set && scene->set->base.first) { - *base= scene->set->base.first; - *ob= (*base)->object; - fase= F_SET; + /* (*scene) is finished, now do the set */ + while((*scene)->set) { + (*scene)= (*scene)->set; + if((*scene)->base.first) { + *base= (*scene)->base.first; + *ob= (*base)->object; + break; + } } } } @@ -668,7 +668,7 @@ int next_object(Scene *scene, int val, Base **base, Object **ob) this enters eternal loop because of makeDispListMBall getting called inside of group_duplilist */ if((*base)->object->dup_group == NULL) { - duplilist= object_duplilist(scene, (*base)->object); + duplilist= object_duplilist((*scene), (*base)->object); dupob= duplilist->first; @@ -704,6 +704,10 @@ int next_object(Scene *scene, int val, Base **base, Object **ob) } } + /* if(ob && *ob) { + printf("Scene: '%s', '%s'\n", (*scene)->id.name+2, (*ob)->id.name+2); + } */ + /* reset recursion test */ in_next_object= 0; @@ -722,7 +726,7 @@ Object *scene_find_camera(Scene *sc) } #ifdef DURIAN_CAMERA_SWITCH -Object *scene_find_camera_switch(Scene *scene) +Object *scene_camera_switch_find(Scene *scene) { TimeMarker *m; int cfra = scene->r.cfra; @@ -743,6 +747,18 @@ Object *scene_find_camera_switch(Scene *scene) } #endif +int scene_camera_switch_update(Scene *scene) +{ +#ifdef DURIAN_CAMERA_SWITCH + Object *camera= scene_camera_switch_find(scene); + if(camera) { + scene->camera= camera; + return 1; + } +#endif + return 0; +} + char *scene_find_marker_name(Scene *scene, int frame) { ListBase *markers= &scene->markers; @@ -783,6 +799,39 @@ char *scene_find_last_marker_name(Scene *scene, int frame) return best_marker ? best_marker->name : NULL; } +/* markers need transforming from different parts of the code so have + * a generic function to do this */ +int scene_marker_tfm_translate(Scene *scene, int delta, int flag) +{ + TimeMarker *marker; + int tot= 0; + + for (marker= scene->markers.first; marker; marker= marker->next) { + if ((marker->flag & flag) == flag) { + marker->frame += delta; + tot++; + } + } + + return tot; +} + +int scene_marker_tfm_extend(Scene *scene, int delta, int flag, int frame, char side) +{ + TimeMarker *marker; + int tot= 0; + + for (marker= scene->markers.first; marker; marker= marker->next) { + if ((marker->flag & flag) == flag) { + if((side=='L' && marker->frame < frame) || (side=='R' && marker->frame >= frame)) { + marker->frame += delta; + tot++; + } + } + } + + return tot; +} Base *scene_add_base(Scene *sce, Object *ob) { @@ -840,73 +889,62 @@ int scene_check_setscene(Scene *sce) return 1; } -/* This (evil) function is needed to cope with two legacy Blender rendering features -* mblur (motion blur that renders 'subframes' and blurs them together), and fields -* rendering. Thus, the use of ugly globals from object.c -*/ -// BAD... EVIL... JUJU...!!!! -// XXX moved here temporarily -float frame_to_float (Scene *scene, int cfra) /* see also bsystem_time in object.c */ +/* This function is needed to cope with fractional frames - including two Blender rendering features +* mblur (motion blur that renders 'subframes' and blurs them together), and fields rendering. */ + +/* see also bsystem_time in object.c */ +float BKE_curframe(Scene *scene) { - extern float bluroffs; /* bad stuff borrowed from object.c */ - extern float fieldoffs; - float ctime; - - ctime= (float)cfra; - ctime+= bluroffs+fieldoffs; - ctime*= scene->r.framelen; - + float ctime = scene->r.cfra; + ctime+= scene->r.subframe; + ctime*= scene->r.framelen; + return ctime; } -static void scene_update_newframe(Scene *sce, unsigned int lay) +static void scene_update_tagged_recursive(Scene *scene, Scene *scene_parent) { Base *base; - Object *ob; - - for(base= sce->base.first; base; base= base->next) { - ob= base->object; - - object_handle_update(sce, ob); // bke_object.h - - /* only update layer when an ipo */ - // XXX old animation system - //if(ob->ipo && has_ipo_code(ob->ipo, OB_LAY) ) { - // base->lay= ob->lay; - //} + + /* sets first, we allow per definition current scene to have + dependencies on sets, but not the other way around. */ + if(scene->set) + scene_update_tagged_recursive(scene->set, scene_parent); + + for(base= scene->base.first; base; base= base->next) { + Object *ob= base->object; + + object_handle_update(scene_parent, ob); + + if(ob->dup_group && (ob->transflag & OB_DUPLIGROUP)) + group_handle_recalc_and_update(scene_parent, ob, ob->dup_group); + + /* always update layer, so that animating layers works */ + base->lay= ob->lay; } } /* this is called in main loop, doing tagged updates before redraw */ void scene_update_tagged(Scene *scene) { - Scene *sce; - Base *base; - float ctime = frame_to_float(scene, scene->r.cfra); + scene->physics_settings.quick_cache_step= 0; /* update all objects: drivers, matrices, displists, etc. flags set by depgraph or manual, no layer check here, gets correct flushed */ - /* sets first, we allow per definition current scene to have - dependencies on sets, but not the other way around. */ - if(scene->set) { - for(SETLOOPER(scene->set, base)) - object_handle_update(scene, base->object); - } - - for(base= scene->base.first; base; base= base->next) { - object_handle_update(scene, base->object); - } + scene_update_tagged_recursive(scene, scene); /* recalc scene animation data here (for sequencer) */ { + float ctime = BKE_curframe(scene); AnimData *adt= BKE_animdata_from_id(&scene->id); if(adt && (adt->recalc & ADT_RECALC_ANIM)) BKE_animsys_evaluate_animdata(&scene->id, adt, ctime, 0); } - BKE_ptcache_quick_cache_all(scene); + if(scene->physics_settings.quick_cache_step) + BKE_ptcache_quick_cache_all(scene); /* in the future this should handle updates for all datablocks, not only objects and scenes. - brecht */ @@ -915,7 +953,7 @@ void scene_update_tagged(Scene *scene) /* applies changes right away, does all sets too */ void scene_update_for_newframe(Scene *sce, unsigned int lay) { - float ctime = frame_to_float(sce, sce->r.cfra); + float ctime = BKE_curframe(sce); Scene *sce_iter; /* clear animation overrides */ @@ -928,7 +966,7 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay) /* Following 2 functions are recursive - * so dont call within 'scene_update_newframe' */ + * so dont call within 'scene_update_tagged_recursive' */ DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still /* All 'standard' (i.e. without any dependencies) animation is handled here, @@ -940,12 +978,8 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay) BKE_animsys_evaluate_all_animation(G.main, ctime); /*...done with recusrive funcs */ - - /* sets first, we allow per definition current scene to have dependencies on sets */ - for(sce_iter= sce->set; sce_iter; sce_iter= sce_iter->set) - scene_update_newframe(sce_iter, lay); - - scene_update_newframe(sce, lay); + /* object_handle_update() on all objects, groups and sets */ + scene_update_tagged_recursive(sce, sce); } /* return default layer, also used to patch old files */ @@ -999,3 +1033,26 @@ float get_render_aosss_error(RenderData *r, float error) return error; } +/* helper function for the SETLOOPER macro */ +Base *_setlooper_base_step(Scene **sce, Base *base) +{ + if(base && base->next) { + /* common case, step to the next */ + return base->next; + } + else if(base==NULL && (*sce)->base.first) { + /* first time looping, return the scenes first base */ + return (Base *)(*sce)->base.first; + } + else { + /* reached the end, get the next base in the set */ + while((*sce= (*sce)->set)) { + base= (Base *)(*sce)->base.first; + if(base) { + return base; + } + } + } + + return NULL; +} diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 6d0057ca298..a8140cb815d 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -235,27 +235,6 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2) } } -/* lb1 should be empty */ -void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2) -{ - SpaceLink *sl; - - lb1->first= lb1->last= NULL; /* to be sure */ - - sl= lb2->first; - if(sl) { - SpaceType *st= BKE_spacetype_from_id(sl->spacetype); - - if(st && st->duplicate) { - SpaceLink *slnew= st->duplicate(sl); - - BLI_addtail(lb1, slnew); - - region_copylist(st, &slnew->regionbase, &sl->regionbase); - } - } -} - /* not region itself */ void BKE_area_region_free(SpaceType *st, ARegion *ar) { @@ -352,3 +331,66 @@ ARegion *BKE_area_find_region_type(ScrArea *sa, int type) return NULL; } +void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene) +{ + int bit; + + if(v3d->scenelock && v3d->localvd==NULL) { + v3d->lay= scene->lay; + v3d->camera= scene->camera; + + if(v3d->camera==NULL) { + ARegion *ar; + + for(ar=v3d->regionbase.first; ar; ar= ar->next) { + if(ar->regiontype == RGN_TYPE_WINDOW) { + RegionView3D *rv3d= ar->regiondata; + if(rv3d->persp==RV3D_CAMOB) + rv3d->persp= RV3D_PERSP; + } + } + } + + if((v3d->lay & v3d->layact) == 0) { + for(bit= 0; bit<32; bit++) { + if(v3d->lay & (1<<bit)) { + v3d->layact= 1<<bit; + break; + } + } + } + } +} + +void BKE_screen_view3d_scene_sync(bScreen *sc) +{ + /* are there cameras in the views that are not in the scene? */ + ScrArea *sa; + for(sa= sc->areabase.first; sa; sa= sa->next) { + SpaceLink *sl; + for(sl= sa->spacedata.first; sl; sl= sl->next) { + if(sl->spacetype==SPACE_VIEW3D) { + View3D *v3d= (View3D*) sl; + BKE_screen_view3d_sync(v3d, sc->scene); + } + } + } +} + +void BKE_screen_view3d_main_sync(ListBase *screen_lb, Scene *scene) +{ + bScreen *sc; + ScrArea *sa; + SpaceLink *sl; + + /* from scene copy to the other views */ + for(sc=screen_lb->first; sc; sc=sc->id.next) { + if(sc->scene!=scene) + continue; + + for(sa=sc->areabase.first; sa; sa=sa->next) + for(sl=sa->spacedata.first; sl; sl=sl->next) + if(sl->spacetype==SPACE_VIEW3D) + BKE_screen_view3d_sync((View3D*)sl, scene); + } +} diff --git a/source/blender/blenkernel/intern/script.c b/source/blender/blenkernel/intern/script.c index 424067a7046..c07032f71d7 100644 --- a/source/blender/blenkernel/intern/script.c +++ b/source/blender/blenkernel/intern/script.c @@ -31,17 +31,10 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "BKE_script.h" -#include "DNA_space_types.h" #include "MEM_guardedalloc.h" /* -#include "BLI_blenlib.h" -#include "BKE_utildefines.h" -#include "BKE_library.h" -#include "BKE_global.h" -#include "BKE_main.h" #ifndef DISABLE_PYTHON #include "BPY_extern.h" // Blender Python library diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index 770bcddfffd..73c19772c69 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -34,14 +34,12 @@ #include "MEM_guardedalloc.h" #include "PIL_dynlib.h" +#include "BLI_math.h" /* windows needs for M_PI */ + #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_anim_types.h" -#include "BLI_blenlib.h" -#include "BLI_math.h" - -#include "BKE_global.h" #include "BKE_fcurve.h" #include "BKE_plugin_types.h" #include "BKE_sequencer.h" @@ -54,7 +52,7 @@ #include "RNA_access.h" /* **** XXX **** */ -static void error() {} +static void error(const char *error, ...) {} #define INT 96 #define FLO 128 @@ -233,6 +231,7 @@ static ImBuf * IMB_cast_away_list(ImBuf * i) static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -313,7 +312,7 @@ static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra, IMB_convert_rgba_to_abgr(out); } if (seq->plugin->version<=3 && float_rendering) { - IMB_float_from_rect(out); + IMB_float_from_rect_simple(out); } if (use_temp_bufs) { @@ -325,7 +324,7 @@ static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra, } static int do_plugin_early_out(struct Sequence *seq, - float facf0, float facf1) + float facf0, float facf1) { return 0; } @@ -350,7 +349,7 @@ static void init_alpha_over_or_under(Sequence * seq) } static void do_alphaover_effect_byte(float facf0, float facf1, int x, int y, - char * rect1, char *rect2, char *out) + char * rect1, char *rect2, char *out) { int fac2, mfac, fac, fac4; int xo, tempc; @@ -416,7 +415,7 @@ static void do_alphaover_effect_byte(float facf0, float facf1, int x, int y, } static void do_alphaover_effect_float(float facf0, float facf1, int x, int y, - float * rect1, float *rect2, float *out) + float * rect1, float *rect2, float *out) { float fac2, mfac, fac, fac4; int xo; @@ -479,6 +478,7 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y, static void do_alphaover_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -570,8 +570,8 @@ void do_alphaunder_effect_byte( static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, - float *rect1, float *rect2, - float *out) + float *rect1, float *rect2, + float *out) { float fac2, mfac, fac, fac4; int xo; @@ -646,6 +646,7 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, static void do_alphaunder_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -766,6 +767,7 @@ void do_cross_effect_float(float facf0, float facf1, int x, int y, static void do_cross_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -856,7 +858,7 @@ static float gammaCorrect(float c) if (i < 0) res = -pow(abs(c), valid_gamma); else if (i >= RE_GAMMA_TABLE_SIZE ) res = pow(c, valid_gamma); else res = gamma_range_table[i] + - ( (c - color_domain_table[i]) * gamfactor_table[i]); + ( (c - color_domain_table[i]) * gamfactor_table[i]); return res; } /* end of float gammaCorrect(float col) */ @@ -873,7 +875,7 @@ static float invGammaCorrect(float col) if (i < 0) res = -pow(abs(col), valid_inv_gamma); else if (i >= RE_GAMMA_TABLE_SIZE) res = pow(col, valid_inv_gamma); else res = inv_gamma_range_table[i] + - ( (col - color_domain_table[i]) * inv_gamfactor_table[i]); + ( (col - color_domain_table[i]) * inv_gamfactor_table[i]); return res; } /* end of float invGammaCorrect(float col) */ @@ -928,10 +930,10 @@ static void free_gammacross(Sequence * seq) } static void do_gammacross_effect_byte(float facf0, float facf1, - int x, int y, - unsigned char *rect1, - unsigned char *rect2, - unsigned char *out) + int x, int y, + unsigned char *rect1, + unsigned char *rect2, + unsigned char *out) { int fac1, fac2, col; int xo; @@ -984,9 +986,9 @@ static void do_gammacross_effect_byte(float facf0, float facf1, } static void do_gammacross_effect_float(float facf0, float facf1, - int x, int y, - float *rect1, float *rect2, - float *out) + int x, int y, + float *rect1, float *rect2, + float *out) { float fac1, fac2; int xo; @@ -1028,6 +1030,7 @@ static void do_gammacross_effect_float(float facf0, float facf1, static void do_gammacross_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1052,8 +1055,8 @@ static void do_gammacross_effect(Scene *scene, Sequence *seq, int cfra, ********************************************************************** */ static void do_add_effect_byte(float facf0, float facf1, int x, int y, - unsigned char *rect1, unsigned char *rect2, - unsigned char *out) + unsigned char *rect1, unsigned char *rect2, + unsigned char *out) { int col, xo, fac1, fac3; char *rt1, *rt2, *rt; @@ -1142,6 +1145,7 @@ static void do_add_effect_float(float facf0, float facf1, int x, int y, static void do_add_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1164,8 +1168,8 @@ static void do_add_effect(Scene *scene, Sequence *seq, int cfra, ********************************************************************** */ static void do_sub_effect_byte(float facf0, float facf1, - int x, int y, - char *rect1, char *rect2, char *out) + int x, int y, + char *rect1, char *rect2, char *out) { int col, xo, fac1, fac3; char *rt1, *rt2, *rt; @@ -1253,7 +1257,8 @@ static void do_sub_effect_float(float facf0, float facf1, int x, int y, } static void do_sub_effect(Scene *scene, Sequence *seq, int cfra, - float facf0, float facf1, int x, int y, + float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1362,6 +1367,7 @@ static void do_drop_effect_float(float facf0, float facf1, int x, int y, static void do_drop_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf * ibuf3, struct ImBuf *out) @@ -1384,8 +1390,8 @@ static void do_drop_effect(Scene *scene, Sequence *seq, int cfra, ********************************************************************** */ static void do_mul_effect_byte(float facf0, float facf1, int x, int y, - unsigned char *rect1, unsigned char *rect2, - unsigned char *out) + unsigned char *rect1, unsigned char *rect2, + unsigned char *out) { int xo, fac1, fac3; char *rt1, *rt2, *rt; @@ -1433,8 +1439,8 @@ static void do_mul_effect_byte(float facf0, float facf1, int x, int y, } static void do_mul_effect_float(float facf0, float facf1, int x, int y, - float *rect1, float *rect2, - float *out) + float *rect1, float *rect2, + float *out) { int xo; float fac1, fac3; @@ -1483,6 +1489,7 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y, static void do_mul_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1613,13 +1620,13 @@ float hyp3,hyp4,b4,b5 output = in_band(wipezone,width,hyp,facf0,1,1); else output = in_band(wipezone,width,hyp,facf0,0,1); - } + } else { if(b1 < b2) output = in_band(wipezone,width,hyp,facf0,0,1); else output = in_band(wipezone,width,hyp,facf0,1,1); - } + } break; case DO_DOUBLE_WIPE: @@ -1659,50 +1666,50 @@ float hyp3,hyp4,b4,b5 if( hyp < hwidth && hyp2 > hwidth ) output = in_band(wipezone,hwidth,hyp,facf0,1,1); else if( hyp > hwidth && hyp2 < hwidth ) - output = in_band(wipezone,hwidth,hyp2,facf0,1,1); + output = in_band(wipezone,hwidth,hyp2,facf0,1,1); else - output = in_band(wipezone,hwidth,hyp2,facf0,1,1) * in_band(wipezone,hwidth,hyp,facf0,1,1); + output = in_band(wipezone,hwidth,hyp2,facf0,1,1) * in_band(wipezone,hwidth,hyp,facf0,1,1); } if(!wipe->forward)output = 1-output; - break; - case DO_CLOCK_WIPE: - /* - temp1: angle of effect center in rads - temp2: angle of line through (halfx,halfy) and (x,y) in rads - temp3: angle of low side of blur - temp4: angle of high side of blur - */ - output = 1.0f - facf0; - widthf = wipe->edgeWidth*2.0f*(float)M_PI; - temp1 = 2.0f * (float)M_PI * facf0; + break; + case DO_CLOCK_WIPE: + /* + temp1: angle of effect center in rads + temp2: angle of line through (halfx,halfy) and (x,y) in rads + temp3: angle of low side of blur + temp4: angle of high side of blur + */ + output = 1.0f - facf0; + widthf = wipe->edgeWidth*2.0f*(float)M_PI; + temp1 = 2.0f * (float)M_PI * facf0; - if(wipe->forward){ - temp1 = 2.0f*(float)M_PI - temp1; - } + if(wipe->forward){ + temp1 = 2.0f*(float)M_PI - temp1; + } - x = x - halfx; - y = y - halfy; + x = x - halfx; + y = y - halfy; - temp2 = asin(abs(y)/sqrt(x*x + y*y)); - if(x <= 0 && y >= 0) temp2 = (float)M_PI - temp2; - else if(x<=0 && y <= 0) temp2 += (float)M_PI; - else if(x >= 0 && y <= 0) temp2 = 2.0f*(float)M_PI - temp2; + temp2 = asin(abs(y)/sqrt(x*x + y*y)); + if(x <= 0 && y >= 0) temp2 = (float)M_PI - temp2; + else if(x<=0 && y <= 0) temp2 += (float)M_PI; + else if(x >= 0 && y <= 0) temp2 = 2.0f*(float)M_PI - temp2; - if(wipe->forward){ - temp3 = temp1-(widthf*0.5f)*facf0; - temp4 = temp1+(widthf*0.5f)*(1-facf0); - } else{ - temp3 = temp1-(widthf*0.5f)*(1-facf0); - temp4 = temp1+(widthf*0.5f)*facf0; + if(wipe->forward){ + temp3 = temp1-(widthf*0.5f)*facf0; + temp4 = temp1+(widthf*0.5f)*(1-facf0); + } else{ + temp3 = temp1-(widthf*0.5f)*(1-facf0); + temp4 = temp1+(widthf*0.5f)*facf0; } - if (temp3 < 0) temp3 = 0; - if (temp4 > 2.0f*(float)M_PI) temp4 = 2.0f*(float)M_PI; + if (temp3 < 0) temp3 = 0; + if (temp4 > 2.0f*(float)M_PI) temp4 = 2.0f*(float)M_PI; - if(temp2 < temp3) output = 0; - else if (temp2 > temp4) output = 1; - else output = (temp2-temp3)/(temp4-temp3); - if(x == 0 && y == 0) output = 1; + if(temp2 < temp3) output = 0; + else if (temp2 > temp4) output = 1; + else output = (temp2-temp3)/(temp4-temp3); + if(x == 0 && y == 0) output = 1; if(output != output) output = 1; if(wipe->forward) output = 1 - output; break; @@ -1737,9 +1744,9 @@ float hyp3,hyp4,b4,b5 if( hyp < hwidth && hyp2 > hwidth ) output = in_band(wipezone,hwidth,hyp,facf0,1,1); else if( hyp > hwidth && hyp2 < hwidth ) - output = in_band(wipezone,hwidth,hyp2,facf0,1,1); + output = in_band(wipezone,hwidth,hyp2,facf0,1,1); else - output = in_band(wipezone,hwidth,hyp2,facf0,1,1) * in_band(wipezone,hwidth,hyp,facf0,1,1); + output = in_band(wipezone,hwidth,hyp2,facf0,1,1) * in_band(wipezone,hwidth,hyp,facf0,1,1); } if(invert)facf0 = 1-facf0; @@ -1778,11 +1785,11 @@ float hyp3,hyp4,b4,b5 hwidth = width*0.5f; temp1 = (halfx-(halfx)*facf0); - pointdist = sqrt(temp1*temp1 + temp1*temp1); + pointdist = sqrt(temp1*temp1 + temp1*temp1); - temp2 = sqrt((halfx-x)*(halfx-x) + (halfy-y)*(halfy-y)); - if(temp2 > pointdist) output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,0,1); - else output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,1,1); + temp2 = sqrt((halfx-x)*(halfx-x) + (halfy-y)*(halfy-y)); + if(temp2 > pointdist) output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,0,1); + else output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,1,1); if(!wipe->forward) output = 1-output; @@ -1933,19 +1940,20 @@ static void do_wipe_effect_float(Sequence *seq, float facf0, float facf1, static void do_wipe_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { if (out->rect_float) { do_wipe_effect_float(seq, - facf0, facf1, x, y, - ibuf1->rect_float, ibuf2->rect_float, - out->rect_float); + facf0, facf1, x, y, + ibuf1->rect_float, ibuf2->rect_float, + out->rect_float); } else { do_wipe_effect_byte(seq, - facf0, facf1, x, y, - (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect, - (unsigned char*) out->rect); + facf0, facf1, x, y, + (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect, + (unsigned char*) out->rect); } } /* ********************************************************************** @@ -2077,9 +2085,10 @@ static void do_transform(Scene *scene, Sequence *seq, float facf0, int x, int y, static void do_transform_effect(Scene *scene, Sequence *seq,int cfra, - float facf0, float facf1, int x, int y, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3, struct ImBuf *out) + float facf0, float facf1, int x, int y, + int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out) { do_transform(scene, seq, facf0, x, y, ibuf1, out); } @@ -2468,8 +2477,8 @@ static void RVAddBitmaps_float (float* a, float* b, float* c, /* For each pixel whose total luminance exceeds the threshold, */ /* Multiply it's value by BOOST and add it to the output map */ static void RVIsolateHighlights_byte (unsigned char* in, unsigned char* out, - int width, int height, int threshold, - float boost, float clamp) + int width, int height, int threshold, + float boost, float clamp) { int x,y,index; int intensity; @@ -2477,7 +2486,7 @@ static void RVIsolateHighlights_byte (unsigned char* in, unsigned char* out, for(y=0;y< height;y++) { for (x=0;x< width;x++) { - index= (x+y*width)*4; + index= (x+y*width)*4; /* Isolate the intensity */ intensity=(in[index+GlowR]+in[index+GlowG]+in[index+GlowB]-threshold); @@ -2497,8 +2506,8 @@ static void RVIsolateHighlights_byte (unsigned char* in, unsigned char* out, } static void RVIsolateHighlights_float (float* in, float* out, - int width, int height, float threshold, - float boost, float clamp) + int width, int height, float threshold, + float boost, float clamp) { int x,y,index; float intensity; @@ -2506,7 +2515,7 @@ static void RVIsolateHighlights_float (float* in, float* out, for(y=0;y< height;y++) { for (x=0;x< width;x++) { - index= (x+y*width)*4; + index= (x+y*width)*4; /* Isolate the intensity */ intensity=(in[index+GlowR]+in[index+GlowG]+in[index+GlowB]-threshold); @@ -2590,19 +2599,20 @@ static void do_glow_effect_float(Sequence *seq, float facf0, float facf1, static void do_glow_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { if (out->rect_float) { do_glow_effect_float(seq, - facf0, facf1, x, y, - ibuf1->rect_float, ibuf2->rect_float, - out->rect_float); + facf0, facf1, x, y, + ibuf1->rect_float, ibuf2->rect_float, + out->rect_float); } else { do_glow_effect_byte(seq, - facf0, facf1, x, y, - (char*) ibuf1->rect, (char*) ibuf2->rect, - (char*) out->rect); + facf0, facf1, x, y, + (char*) ibuf1->rect, (char*) ibuf2->rect, + (char*) out->rect); } } @@ -2645,6 +2655,7 @@ static int early_out_color(struct Sequence *seq, static void do_solid_color(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -2719,6 +2730,64 @@ static void do_solid_color(Scene *scene, Sequence *seq, int cfra, } } +/* ********************************************************************** + MULTICAM + ********************************************************************** */ + +/* no effect inputs for multicam, we use give_ibuf_seq */ +static int num_inputs_multicam() +{ + return 0; +} + +static int early_out_multicam(struct Sequence *seq, float facf0, float facf1) +{ + return -1; +} + +static void do_multicam(Scene *scene, Sequence *seq, int cfra, + float facf0, float facf1, int x, int y, + int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out) +{ + struct ImBuf * i; + Editing * ed; + ListBase * seqbasep; + + if (seq->multicam_source == 0 || seq->multicam_source >= seq->machine) { + return; + } + + ed = scene->ed; + if (!ed) { + return; + } + seqbasep = seq_seqbase(&ed->seqbase, seq); + if (!seqbasep) { + return; + } + + i = give_ibuf_seqbase(scene, + out->x, out->y, cfra, seq->multicam_source, + preview_render_size, seqbasep); + if (!i) { + return; + } + + if (out->rect && i->rect) { + memcpy(out->rect, i->rect, out->x * out->y * 4); + } else if (out->rect_float && i->rect_float) { + memcpy(out->rect_float, i->rect_float, out->x * out->y *4*sizeof(float)); + } else if (out->rect && i->rect_float) { + IMB_rect_from_float(i); + memcpy(out->rect, i->rect, out->x * out->y * 4); + } else if (out->rect_float && i->rect) { + IMB_float_from_rect_simple(i); + memcpy(out->rect_float, i->rect_float, out->x * out->y *4*sizeof(float)); + } +} + /* ********************************************************************** SPEED ********************************************************************** */ @@ -2728,12 +2797,12 @@ static void init_speed_effect(Sequence *seq) if(seq->effectdata) MEM_freeN(seq->effectdata); seq->effectdata = MEM_callocN(sizeof(struct SpeedControlVars), - "speedcontrolvars"); + "speedcontrolvars"); v = (SpeedControlVars *)seq->effectdata; v->globalSpeed = 1.0; v->frameMap = 0; - v->flags = SEQ_SPEED_COMPRESS_IPO_Y; + v->flags = 0; v->length = 0; } @@ -2809,7 +2878,7 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force) return; } if (!seq->seq1) { /* make coverity happy and check for (CID 598) - input strip ... */ + input strip ... */ return; } @@ -2856,16 +2925,10 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force) for (cfra = 1; cfra < v->length; cfra++) { if(fcu) { - if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { - ctime = seq->startdisp + cfra; - div = 1.0; - } else { - ctime= cfra; - div= v->length / 100.0f; - if(div==0.0) return; - } - - facf = evaluate_fcurve(fcu, ctime/div); + ctime = seq->startdisp + cfra; + div = 1.0; + + facf = evaluate_fcurve(fcu, ctime/div); } else { facf = fallback_fac; } @@ -2887,19 +2950,13 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force) for (cfra = 0; cfra < v->length; cfra++) { if(fcu) { - if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { - ctime = seq->startdisp + cfra; - div = 1.0; - } else { - ctime= cfra; - div= v->length / 100.0f; - if(div==0.0) return; - } - - facf = evaluate_fcurve(fcu, ctime / div); - if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) { - facf *= v->length; - } + ctime = seq->startdisp + cfra; + div = 1.0; + + facf = evaluate_fcurve(fcu, ctime / div); + if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) { + facf *= v->length; + } } if (!fcu) { @@ -3008,14 +3065,18 @@ static void get_default_fac_fade(struct Sequence *seq, int cfra, static void do_overdrop_effect(Scene *scene, Sequence *seq, int cfra, float fac, float facf, - int x, int y, struct ImBuf * ibuf1, + int x, int y, + int preview_render_size, + struct ImBuf * ibuf1, struct ImBuf * ibuf2, struct ImBuf * ibuf3, struct ImBuf * out) { do_drop_effect(scene, seq, cfra, fac, facf, x, y, + preview_render_size, ibuf1, ibuf2, ibuf3, out); do_alphaover_effect(scene, seq, cfra, fac, facf, x, y, + preview_render_size, ibuf1, ibuf2, ibuf3, out); } @@ -3123,6 +3184,11 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type) rval.early_out = do_plugin_early_out; rval.get_default_fac = get_default_fac_fade; break; + case SEQ_MULTICAM: + rval.num_inputs = num_inputs_multicam; + rval.early_out = early_out_multicam; + rval.execute = do_multicam; + break; } return rval; diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 98dbf83f032..d97e6151a13 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -35,25 +35,26 @@ #include "MEM_guardedalloc.h" #include "MEM_CacheLimiterC-Api.h" -#include "DNA_listBase.h" #include "DNA_sequence_types.h" #include "DNA_scene_types.h" #include "DNA_anim_types.h" +#include "DNA_object_types.h" +#include "BKE_animsys.h" #include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.h" #include "BKE_sequencer.h" #include "BKE_fcurve.h" -#include "BKE_utildefines.h" +#include "BKE_scene.h" #include "RNA_access.h" #include "RE_pipeline.h" +#include "BLI_math.h" #include "BLI_fileops.h" #include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" -#include "BLI_threads.h" #include <pthread.h> #include "IMB_imbuf.h" @@ -70,8 +71,6 @@ #endif /* **** XXX ******** */ -static int seqrectx= 0; /* bad bad global! */ -static int seqrecty= 0; //static void waitcursor(int val) {} //static int blender_test_break() {return 0;} @@ -79,6 +78,8 @@ static int seqrecty= 0; #define SELECT 1 ListBase seqbase_clipboard; int seqbase_clipboard_frame; +SequencerDrawView sequencer_view3d_cb= NULL; /* NULL in background mode */ + void printf_strip(Sequence *seq) { @@ -87,18 +88,27 @@ void printf_strip(Sequence *seq) fprintf(stderr, "\tseq_tx_set_final_left: %d %d\n\n", seq_tx_get_final_left(seq, 0), seq_tx_get_final_right(seq, 0)); } -void seqbase_recursive_apply(ListBase *seqbase, int (*apply_func)(Sequence *seq, void *), void *arg) +int seqbase_recursive_apply(ListBase *seqbase, int (*apply_func)(Sequence *seq, void *), void *arg) { Sequence *iseq; for(iseq= seqbase->first; iseq; iseq= iseq->next) { - seq_recursive_apply(iseq, apply_func, arg); + if(seq_recursive_apply(iseq, apply_func, arg) == -1) + return -1; /* bail out */ } + return 1; } -void seq_recursive_apply(Sequence *seq, int (*apply_func)(Sequence *, void *), void *arg) +int seq_recursive_apply(Sequence *seq, int (*apply_func)(Sequence *, void *), void *arg) { - if(apply_func(seq, arg) && seq->seqbase.first) - seqbase_recursive_apply(&seq->seqbase, apply_func, arg); + int ret= apply_func(seq, arg); + + if(ret == -1) + return -1; /* bail out */ + + if(ret && seq->seqbase.first) + ret = seqbase_recursive_apply(&seq->seqbase, apply_func, arg); + + return ret; } /* ********************************************************************** @@ -214,6 +224,8 @@ void seq_free_strip(Strip *strip) MEM_freeN(strip); } +static void seq_free_animdata(Scene *scene, Sequence *seq); + void seq_free_sequence(Scene *scene, Sequence *seq) { if(seq->strip) seq_free_strip(seq->strip); @@ -235,6 +247,8 @@ void seq_free_sequence(Scene *scene, Sequence *seq) if(seq->scene_sound) sound_remove_scene_sound(scene, seq->scene_sound); + + seq_free_animdata(scene, seq); } MEM_freeN(seq); @@ -425,7 +439,7 @@ void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq) } static void do_seq_count_cb(ListBase *seqbase, int *totseq, - int (*test_func)(Sequence * seq)) + int (*test_func)(Sequence * seq)) { Sequence *seq; @@ -443,7 +457,7 @@ static void do_seq_count_cb(ListBase *seqbase, int *totseq, } static void do_build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int depth, - int (*test_func)(Sequence * seq)) + int (*test_func)(Sequence * seq)) { Sequence *seq; @@ -465,7 +479,7 @@ static void do_build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int depth, } void build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int *totseq, - int (*test_func)(Sequence * seq)) + int (*test_func)(Sequence * seq)) { Sequence **tseqar; @@ -503,6 +517,31 @@ void calc_sequence_disp(Scene *scene, Sequence *seq) seq_update_sound(scene, seq); } +static void seq_update_sound_bounds_recursive(Scene *scene, Sequence *metaseq) +{ + Sequence *seq; + + /* for sound we go over full meta tree to update bounds of the sound strips, + since sound is played outside of evaluating the imbufs, */ + for(seq=metaseq->seqbase.first; seq; seq=seq->next) { + if(seq->type == SEQ_META) { + seq_update_sound_bounds_recursive(scene, seq); + } + else if((seq->type == SEQ_SOUND) || (seq->type == SEQ_SCENE)) { + if(seq->scene_sound) { + int startofs = seq->startofs; + int endofs = seq->endofs; + if(seq->startofs + seq->start < metaseq->start + metaseq->startofs) + startofs = metaseq->start + metaseq->startofs - seq->start; + + if(seq->start + seq->len - seq->endofs > metaseq->start + metaseq->len - metaseq->endofs) + endofs = seq->start + seq->len - metaseq->start - metaseq->len + metaseq->endofs; + sound_move_scene_sound(scene, seq->scene_sound, seq->start + startofs, seq->start+seq->len - endofs, startofs); + } + } + } +} + void calc_sequence(Scene *scene, Sequence *seq) { Sequence *seqm; @@ -546,8 +585,8 @@ void calc_sequence(Scene *scene, Sequence *seq) if(seq->type==SEQ_META) { seqm= seq->seqbase.first; if(seqm) { - min= 1000000; - max= -1000000; + min= MAXFRAME * 2; + max= -MAXFRAME * 2; while(seqm) { if(seqm->startdisp < min) min= seqm->startdisp; if(seqm->enddisp > max) max= seqm->enddisp; @@ -562,14 +601,18 @@ void calc_sequence(Scene *scene, Sequence *seq) new_tstripdata(seq); } } + seq_update_sound_bounds_recursive(scene, seq); } calc_sequence_disp(scene, seq); } } -void reload_sequence_new_file(Scene *scene, Sequence * seq) +/* note: caller should run calc_sequence(scene, seq) after */ +void reload_sequence_new_file(Scene *scene, Sequence * seq, int lock_range) { char str[FILE_MAXDIR+FILE_MAXFILE]; + int prev_startdisp, prev_enddisp; + /* note: dont rename the strip, will break animation curves */ if (!(seq->type == SEQ_MOVIE || seq->type == SEQ_IMAGE || seq->type == SEQ_SOUND || @@ -577,17 +620,26 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq) return; } + if(lock_range) { + /* keep so we dont have to move the actual start and end points (only the data) */ + calc_sequence_disp(scene, seq); + prev_startdisp= seq->startdisp; + prev_enddisp= seq->enddisp; + } + + new_tstripdata(seq); if (seq->type != SEQ_SCENE && seq->type != SEQ_META && - seq->type != SEQ_IMAGE) { + seq->type != SEQ_IMAGE) { BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name); - BLI_convertstringcode(str, G.sce); + BLI_path_abs(str, G.sce); } if (seq->type == SEQ_IMAGE) { /* Hack? */ - int olen = MEM_allocN_len(seq->strip->stripdata)/sizeof(struct StripElem); + size_t olen = MEM_allocN_len(seq->strip->stripdata)/sizeof(struct StripElem); + seq->len = olen; seq->len -= seq->anim_startofs; seq->len -= seq->anim_endofs; @@ -622,6 +674,7 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq) } seq->strip->len = seq->len; } else if (seq->type == SEQ_SCENE) { + /* 'seq->scenenr' should be replaced with something more reliable */ Scene * sce = G.main->scene.first; int nr = 1; @@ -638,9 +691,6 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq) } else { sce = seq->scene; } - - BLI_strncpy(seq->name+2, sce->id.name + 2, SEQ_NAME_MAXSTR-2); - seqbase_unique_name_recursive(&scene->ed->seqbase, seq); seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1; seq->len -= seq->anim_startofs; @@ -653,6 +703,12 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq) free_proxy_seq(seq); + if(lock_range) { + seq_tx_set_final_left(seq, prev_startdisp); + seq_tx_set_final_right(seq, prev_enddisp); + seq_single_fix(seq); + } + calc_sequence(scene, seq); } @@ -739,7 +795,7 @@ static void seqbase_unique_name(ListBase *seqbasep, SeqUniqueInfo *sui) Sequence *seq; for(seq=seqbasep->first; seq; seq= seq->next) { if (sui->seq != seq && strcmp(sui->name_dest, seq->name+2)==0) { - sprintf(sui->name_dest, "%.18s.%03d", sui->name_src, sui->count++); + sprintf(sui->name_dest, "%.17s.%03d", sui->name_src, sui->count++); /*24 - 2 for prefix, -1 for \0 */ sui->match= 1; /* be sure to re-scan */ } } @@ -760,13 +816,18 @@ void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq) strcpy(sui.name_src, seq->name+2); strcpy(sui.name_dest, seq->name+2); - /* Strip off the suffix */ - if ((dot=strrchr(sui.name_src, '.'))) - *dot= '\0'; - sui.count= 1; sui.match= 1; /* assume the worst to start the loop */ + /* Strip off the suffix */ + if ((dot=strrchr(sui.name_src, '.'))) { + *dot= '\0'; + dot++; + + if(*dot) + sui.count= atoi(dot) + 1; + } + while(sui.match) { sui.match= 0; seqbase_unique_name(seqbasep, &sui); @@ -796,6 +857,7 @@ static char *give_seqname_by_type(int type) case SEQ_GLOW: return "Glow"; case SEQ_TRANSFORM: return "Transform"; case SEQ_COLOR: return "Color"; + case SEQ_MULTICAM: return "Multicam"; case SEQ_SPEED: return "Speed"; default: return 0; @@ -887,7 +949,8 @@ static void multibuf(ImBuf *ibuf, float fmul) } } -static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) +static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se, + int render_size) { TStripElem *se1, *se2, *se3; float fac, facf; @@ -921,7 +984,7 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) if (early_out == -1) { /* no input needed */ sh.execute(scene, seq, cfra, fac, facf, - se->ibuf->x, se->ibuf->y, + se->ibuf->x, se->ibuf->y, render_size, 0, 0, 0, se->ibuf); return; } @@ -938,7 +1001,7 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) se3= se->se3; if ( (se1==0 || se2==0 || se3==0) - || (se1->ibuf==0 || se2->ibuf==0 || se3->ibuf==0)) { + || (se1->ibuf==0 || se2->ibuf==0 || se3->ibuf==0)) { make_black_ibuf(se->ibuf); return; } @@ -990,13 +1053,13 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) y= se2->ibuf->y; if (!se1->ibuf->rect_float && se->ibuf->rect_float) { - IMB_float_from_rect(se1->ibuf); + IMB_float_from_rect_simple(se1->ibuf); } if (!se2->ibuf->rect_float && se->ibuf->rect_float) { - IMB_float_from_rect(se2->ibuf); + IMB_float_from_rect_simple(se2->ibuf); } if (!se3->ibuf->rect_float && se->ibuf->rect_float) { - IMB_float_from_rect(se3->ibuf); + IMB_float_from_rect_simple(se3->ibuf); } if (!se1->ibuf->rect && !se->ibuf->rect_float) { @@ -1009,7 +1072,8 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) IMB_rect_from_float(se3->ibuf); } - sh.execute(scene, seq, cfra, fac, facf, x, y, se1->ibuf, se2->ibuf, se3->ibuf, + sh.execute(scene, seq, cfra, fac, facf, x, y, render_size, + se1->ibuf, se2->ibuf, se3->ibuf, se->ibuf); } @@ -1023,7 +1087,7 @@ static int give_stripelem_index(Sequence *seq, int cfra) /*reverse frame in this sequence */ if(cfra <= seq->start) nr= seq->len-1; else if(cfra >= seq->start+seq->len-1) nr= 0; - else nr= (seq->start + seq->len) - cfra; + else nr= (seq->start + seq->len - 1) - cfra; } else { if(cfra <= seq->start) nr= 0; else if(cfra >= seq->start+seq->len-1) nr= seq->len-1; @@ -1055,7 +1119,7 @@ static TStripElem *give_tstripelem(Sequence *seq, int cfra) se = seq->strip->tstripdata; if (se == 0 && seq->len > 0) { se = seq->strip->tstripdata = alloc_tstripdata(seq->len, - "tstripelems"); + "tstripelems"); } nr = give_stripelem_index(seq, cfra); @@ -1073,7 +1137,7 @@ static TStripElem *give_tstripelem(Sequence *seq, int cfra) alpha over mode... */ if (seq->blend_mode != SEQ_BLEND_REPLACE || - (/*seq->ipo && seq->ipo->curve.first &&*/ + (/*seq->ipo && seq->ipo->curve.first &&*/ (!(seq->type & SEQ_EFFECT) || !seq->seq1))) { Strip * s = seq->strip; if (cfra < seq->start) { @@ -1230,7 +1294,8 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na return FALSE; } - if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) { + if ((seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) + || (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) { strcpy(dir, seq->strip->proxy->dir); } else { if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) { @@ -1243,7 +1308,7 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { BLI_join_dirfile(name, dir, seq->strip->proxy->file); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); return TRUE; } @@ -1272,8 +1337,8 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na render_size); } - BLI_convertstringcode(name, G.sce); - BLI_convertstringframe(name, frameno, 0); + BLI_path_abs(name, G.sce); + BLI_path_frame(name, frameno, 0); strcat(name, ".jpg"); @@ -1324,9 +1389,9 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, in #if 0 static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra, - int build_proxy_run, int render_size); + int build_proxy_run, int render_size); -static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int render_size) +static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty) { char name[PROXY_MAXFILE]; int quality; @@ -1347,7 +1412,7 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re /* that's why it is called custom... */ if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { return; - } + } if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) { return; @@ -1363,7 +1428,8 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re se->ibuf = 0; } - do_build_seq_ibuf(scene, seq, se, cfra, TRUE, render_size); + do_build_seq_ibuf(scene, seq, se, cfra, TRUE, render_size, + seqrectx, seqrecty); if (!se->ibuf) { return; @@ -1397,7 +1463,8 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re se->ibuf = 0; } -static void seq_proxy_rebuild(Scene *scene, Sequence * seq) +static void seq_proxy_rebuild(Scene *scene, Sequence * seq, int seqrectx, + int seqrecty) { int cfra; float rsize = seq->strip->proxy->size; @@ -1424,12 +1491,13 @@ static void seq_proxy_rebuild(Scene *scene, Sequence * seq) sequential order */ if (seq->flag & SEQ_REVERSE_FRAMES) { for (cfra = seq->enddisp-seq->endstill-1; - cfra >= seq->startdisp + seq->startstill; cfra--) { + cfra >= seq->startdisp + seq->startstill; cfra--) { TStripElem * tse = give_tstripelem(seq, cfra); if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) { //XXX set_timecursor(cfra); - seq_proxy_build_frame(scene, seq, cfra, rsize); + seq_proxy_build_frame(scene, seq, cfra, rsize, + seqrectx, seqrecty); tse->flag |= STRIPELEM_PREVIEW_DONE; } if (blender_test_break()) { @@ -1438,12 +1506,13 @@ static void seq_proxy_rebuild(Scene *scene, Sequence * seq) } } else { for (cfra = seq->startdisp + seq->startstill; - cfra < seq->enddisp - seq->endstill; cfra++) { + cfra < seq->enddisp - seq->endstill; cfra++) { TStripElem * tse = give_tstripelem(seq, cfra); if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) { //XXX set_timecursor(cfra); - seq_proxy_build_frame(scene, seq, cfra, rsize); + seq_proxy_build_frame(scene, seq, cfra, rsize, + seqrectx, seqrecty); tse->flag |= STRIPELEM_PREVIEW_DONE; } if (blender_test_break()) { @@ -1465,15 +1534,21 @@ static StripColorBalance calc_cb(StripColorBalance * cb_) StripColorBalance cb = *cb_; int c; - if (cb.flag & SEQ_COLOR_BALANCE_INVERSE_LIFT) { + for (c = 0; c < 3; c++) { + cb.lift[c] = 2.0f - cb.lift[c]; + } + + if(cb.flag & SEQ_COLOR_BALANCE_INVERSE_LIFT) { for (c = 0; c < 3; c++) { - cb.lift[c] = 1.0 - cb.lift[c]; - } - } else { - for (c = 0; c < 3; c++) { - cb.lift[c] = -(1.0 - cb.lift[c]); + /* tweak to give more subtle results + * values above 1.0 are scaled */ + if(cb.lift[c] > 1.0f) + cb.lift[c] = pow(cb.lift[c] - 1.0f, 2.0f) + 1.0f; + + cb.lift[c] = 2.0f - cb.lift[c]; } } + if (cb.flag & SEQ_COLOR_BALANCE_INVERSE_GAIN) { for (c = 0; c < 3; c++) { if (cb.gain[c] != 0.0) { @@ -1497,25 +1572,27 @@ static StripColorBalance calc_cb(StripColorBalance * cb_) return cb; } +/* note: lift is actually 2-lift */ +MINLINE float color_balance_fl(float in, const float lift, const float gain, const float gamma, const float mul) +{ + float x= (((in - 1.0f) * lift) + 1.0f) * gain; + + /* prevent NaN */ + if (x < 0.f) x = 0.f; + + return powf(x, gamma) * mul; +} + static void make_cb_table_byte(float lift, float gain, float gamma, - unsigned char * table, float mul) + unsigned char * table, float mul) { int y; for (y = 0; y < 256; y++) { - float v = 1.0 * y / 255; - v *= gain; - v += lift; - v = pow(v, gamma); - v *= mul; - if ( v > 1.0) { - v = 1.0; - } else if (v < 0.0) { - v = 0.0; - } + float v= color_balance_fl((float)y * (1.0 / 255.0f), lift, gain, gamma, mul); + CLAMP(v, 0.0f, 1.0f); table[y] = v * 255; } - } static void make_cb_table_float(float lift, float gain, float gamma, @@ -1524,11 +1601,7 @@ static void make_cb_table_float(float lift, float gain, float gamma, int y; for (y = 0; y < 256; y++) { - float v = (float) y * 1.0 / 255.0; - v *= gain; - v += lift; - v = pow(v, gamma); - v *= mul; + float v= color_balance_fl((float)y * (1.0 / 255.0f), lift, gain, gamma, mul); table[y] = v; } } @@ -1573,7 +1646,7 @@ static void color_balance_byte_float(Sequence * seq, TStripElem* se, float mul) for (c = 0; c < 3; c++) { make_cb_table_float(cb.lift[c], cb.gain[c], cb.gamma[c], - cb_tab[c], mul); + cb_tab[c], mul); } for (i = 0; i < 256; i++) { @@ -1599,8 +1672,7 @@ static void color_balance_float_float(Sequence * seq, TStripElem* se, float mul) while (p < e) { int c; for (c = 0; c < 3; c++) { - p[c] = pow(p[c] * cb.gain[c] + cb.lift[c], - cb.gamma[c]) * mul; + p[c]= color_balance_fl(p[c], cb.lift[c], cb.gain[c], cb.gamma[c], mul); } p += 4; } @@ -1630,24 +1702,24 @@ static void color_balance(Sequence * seq, TStripElem* se, float mul) - Flip X + Flip Y (could be done afterwards, backward compatibility) - Promote image to float data (affects pipeline operations afterwards) - Color balance (is most efficient in the byte -> float - (future: half -> float should also work fine!) - case, if done on load, since we can use lookup tables) + (future: half -> float should also work fine!) + case, if done on load, since we can use lookup tables) - Premultiply */ -static int input_have_to_preprocess(Scene *scene, Sequence * seq, TStripElem* se, int cfra) +static int input_have_to_preprocess(Scene *scene, Sequence * seq, TStripElem* se, int cfra, int seqrectx, int seqrecty) { float mul; if ((seq->flag & SEQ_FILTERY) || - (seq->flag & SEQ_USE_CROP) || - (seq->flag & SEQ_USE_TRANSFORM) || - (seq->flag & SEQ_FLIPX) || - (seq->flag & SEQ_FLIPY) || - (seq->flag & SEQ_USE_COLOR_BALANCE) || - (seq->flag & SEQ_MAKE_PREMUL) || - (se->ibuf->x != seqrectx || se->ibuf->y != seqrecty)) { + (seq->flag & SEQ_USE_CROP) || + (seq->flag & SEQ_USE_TRANSFORM) || + (seq->flag & SEQ_FLIPX) || + (seq->flag & SEQ_FLIPY) || + (seq->flag & SEQ_USE_COLOR_BALANCE) || + (seq->flag & SEQ_MAKE_PREMUL) || + (se->ibuf->x != seqrectx || se->ibuf->y != seqrecty)) { return TRUE; } @@ -1665,7 +1737,7 @@ static int input_have_to_preprocess(Scene *scene, Sequence * seq, TStripElem* se return FALSE; } -static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cfra) +static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cfra, int seqrectx, int seqrecty) { float mul; @@ -1702,8 +1774,8 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf } if (c.top + c.bottom >= se->ibuf->y || - c.left + c.right >= se->ibuf->x || - t.xofs >= dx || t.yofs >= dy) { + c.left + c.right >= se->ibuf->x || + t.xofs >= dx || t.yofs >= dy) { make_black_ibuf(se->ibuf); } else { ImBuf * i; @@ -1715,9 +1787,9 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf } IMB_rectcpy(i, se->ibuf, - t.xofs, t.yofs, - c.left, c.bottom, - sx, sy); + t.xofs, t.yofs, + c.left, c.bottom, + sx, sy); IMB_freeImBuf(se->ibuf); @@ -1728,12 +1800,31 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf if(seq->flag & SEQ_FLIPX) { IMB_flipx(se->ibuf); } - if(seq->flag & SEQ_FLIPY) { - IMB_flipy(se->ibuf); - } - if(seq->mul == 0.0) { - seq->mul = 1.0; + if(seq->sat != 1.0f) { + /* inline for now, could become an imbuf function */ + int i; + char *rct= (char *)se->ibuf->rect; + float *rctf= se->ibuf->rect_float; + const float sat= seq->sat; + float hsv[3]; + + if(rct) { + float rgb[3]; + for (i = se->ibuf->x * se->ibuf->y; i > 0; i--, rct+=4) { + rgb_byte_to_float(rct, rgb); + rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); + hsv_to_rgb(hsv[0], hsv[1] * sat, hsv[2], rgb, rgb+1, rgb+2); + rgb_float_to_byte(rgb, rct); + } + } + + if(rctf) { + for (i = se->ibuf->x * se->ibuf->y; i > 0; i--, rctf+=4) { + rgb_to_hsv(rctf[0], rctf[1], rctf[2], hsv, hsv+1, hsv+2); + hsv_to_rgb(hsv[0], hsv[1] * sat, hsv[2], rctf, rctf+1, rctf+2); + } + } } mul = seq->mul; @@ -1748,21 +1839,9 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf } if(seq->flag & SEQ_MAKE_FLOAT) { - if (!se->ibuf->rect_float) { - if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) { - IMB_float_from_rect(se->ibuf); - } else { - int profile = IB_PROFILE_NONE; - - /* no color management: - * don't disturb the existing profiles */ - SWAP(int, se->ibuf->profile, profile); + if (!se->ibuf->rect_float) + IMB_float_from_rect_simple(se->ibuf); - IMB_float_from_rect(se->ibuf); - - SWAP(int, se->ibuf->profile, profile); - } - } if (se->ibuf->rect) { imb_freerectImBuf(se->ibuf); } @@ -1774,7 +1853,7 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf if(seq->flag & SEQ_MAKE_PREMUL) { if(se->ibuf->depth == 32 && se->ibuf->zbuf == 0) { - converttopremul(se->ibuf); + IMB_premultiply_alpha(se->ibuf); } } @@ -1782,7 +1861,7 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty ) { if(scene->r.mode & R_OSA) { IMB_scaleImBuf(se->ibuf, - (short)seqrectx, (short)seqrecty); + (short)seqrectx, (short)seqrecty); } else { IMB_scalefastImBuf(se->ibuf, (short)seqrectx, (short)seqrecty); @@ -1792,7 +1871,8 @@ static void input_preprocess(Scene *scene, Sequence *seq, TStripElem *se, int cf /* test if image too small or discarded from cache: reload */ -static void test_and_auto_discard_ibuf(TStripElem * se) +static void test_and_auto_discard_ibuf(TStripElem * se, + int seqrectx, int seqrecty) { if (se->ibuf) { if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty @@ -1817,14 +1897,14 @@ static void test_and_auto_discard_ibuf_stills(Strip * strip) { if (strip->ibuf_startstill) { if (!strip->ibuf_startstill->rect && - !strip->ibuf_startstill->rect_float) { + !strip->ibuf_startstill->rect_float) { IMB_freeImBuf(strip->ibuf_startstill); strip->ibuf_startstill = 0; } } if (strip->ibuf_endstill) { if (!strip->ibuf_endstill->rect && - !strip->ibuf_endstill->rect_float) { + !strip->ibuf_endstill->rect_float) { IMB_freeImBuf(strip->ibuf_endstill); strip->ibuf_endstill = 0; } @@ -1840,8 +1920,8 @@ static void copy_from_ibuf_still(Sequence * seq, TStripElem * se) se->ibuf = IMB_dupImBuf(seq->strip->ibuf_startstill); } if (se->nr == seq->len - 1 - && (seq->len != 1) - && seq->strip->ibuf_endstill) { + && (seq->len != 1) + && seq->strip->ibuf_endstill) { IMB_cache_limiter_touch(seq->strip->ibuf_endstill); se->ibuf = IMB_dupImBuf(seq->strip->ibuf_endstill); @@ -1933,16 +2013,18 @@ static void check_limiter_refcount_comp(const char * func, TStripElem *se) } } -static TStripElem* do_build_seq_array_recursively(Scene *scene, - ListBase *seqbasep, int cfra, int chanshown, int render_size); +static TStripElem* do_build_seq_array_recursively( + Scene *scene, + ListBase *seqbasep, int cfra, int chanshown, int render_size, + int seqrectx, int seqrecty); static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra, - int build_proxy_run, int render_size) + int build_proxy_run, int render_size, int seqrectx, int seqrecty) { char name[FILE_MAXDIR+FILE_MAXFILE]; int use_limiter = TRUE; - test_and_auto_discard_ibuf(se); + test_and_auto_discard_ibuf(se, seqrectx, seqrecty); test_and_auto_discard_ibuf_stills(seq->strip); if(seq->type == SEQ_META) { @@ -1961,7 +2043,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(!se->ibuf && seq->seqbase.first) { meta_se = do_build_seq_array_recursively(scene, &seq->seqbase, seq->start + se->nr, 0, - render_size); + render_size, seqrectx, seqrecty); check_limiter_refcount("do_build_seq_ibuf: for META", meta_se); } @@ -1971,8 +2053,9 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(!se->ibuf && meta_se) { se->ibuf = meta_se->ibuf_comp; if(se->ibuf && - (!input_have_to_preprocess(scene, seq, se, cfra) || - build_proxy_run)) { + (!input_have_to_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty) || + build_proxy_run)) { IMB_refImBuf(se->ibuf); if (build_proxy_run) { IMB_cache_limiter_unref(se->ibuf); @@ -1996,7 +2079,8 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int } if (use_preprocess) { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, seqrectx, + seqrecty); } } else if(seq->type & SEQ_EFFECT) { int use_preprocess = FALSE; @@ -2018,11 +2102,12 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int else se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0); - do_effect(scene, cfra, seq, se); - if (input_have_to_preprocess(scene, seq, se, cfra) && - !build_proxy_run) { + do_effect(scene, cfra, seq, se, render_size); + if (input_have_to_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty) && + !build_proxy_run) { if ((se->se1 && (se->ibuf == se->se1->ibuf)) || - (se->se2 && (se->ibuf == se->se2->ibuf))) { + (se->se2 && (se->ibuf == se->se2->ibuf))) { struct ImBuf * i = IMB_dupImBuf(se->ibuf); @@ -2034,26 +2119,27 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int } } if (use_preprocess) { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, seqrectx, + seqrecty); } } else if(seq->type == SEQ_IMAGE) { if(se->ok == STRIPELEM_OK && se->ibuf == 0) { StripElem * s_elem = give_stripelem(seq, cfra); BLI_join_dirfile(name, seq->strip->dir, s_elem->name); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); if (!build_proxy_run) { se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); } copy_from_ibuf_still(seq, se); - if (!se->ibuf) { - se->ibuf= IMB_loadiffname( - name, IB_rect); + if (se->ibuf==NULL && (se->ibuf= IMB_loadiffname(name, IB_rect))) { /* we don't need both (speed reasons)! */ - if (se->ibuf && - se->ibuf->rect_float && se->ibuf->rect) { + if (se->ibuf->rect_float && se->ibuf->rect) imb_freerectImBuf(se->ibuf); - } + + /* all sequencer color is done in SRGB space, linear gives odd crossfades */ + if(se->ibuf->profile == IB_PROFILE_LINEAR_RGB) + IMB_convert_profile(se->ibuf, IB_PROFILE_NONE); copy_to_ibuf_still(seq, se); } @@ -2061,7 +2147,8 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(se->ibuf == 0) { se->ok = STRIPELEM_FAILED; } else if (!build_proxy_run) { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty); } } } else if(seq->type == SEQ_MOVIE) { @@ -2074,7 +2161,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if (se->ibuf == 0) { if(seq->anim==0) { BLI_join_dirfile(name, seq->strip->dir, seq->strip->stripdata->name); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); seq->anim = openanim( name, IB_rect | @@ -2086,8 +2173,8 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int se->ibuf = IMB_anim_absolute(seq->anim, se->nr + seq->anim_startofs); /* we don't need both (speed reasons)! */ if (se->ibuf - && se->ibuf->rect_float - && se->ibuf->rect) { + && se->ibuf->rect_float + && se->ibuf->rect) { imb_freerectImBuf(se->ibuf); } @@ -2098,13 +2185,12 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(se->ibuf == 0) { se->ok = STRIPELEM_FAILED; } else if (!build_proxy_run) { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty); } } } else if(seq->type == SEQ_SCENE) { // scene can be NULL after deletions Scene *sce= seq->scene;// *oldsce= scene; - Render *re; - RenderResult rres; int have_seq= FALSE; int sce_valid= FALSE; @@ -2116,72 +2202,103 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if (se->ibuf == NULL && sce_valid && !build_proxy_run) { se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); if (se->ibuf) { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty); } } if (se->ibuf == NULL && sce_valid) { copy_from_ibuf_still(seq, se); if (se->ibuf) { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty); } } if (!sce_valid) { se->ok = STRIPELEM_FAILED; - } else if (se->ibuf==NULL && sce_valid) { - int oldcfra; + } + else if (se->ibuf==NULL && sce_valid) { + int frame= seq->sfra + se->nr + seq->anim_startofs; + int oldcfra = seq->scene->r.cfra; + Object *oldcamera= seq->scene->camera; + ListBase oldmarkers; + /* Hack! This function can be called from do_render_seq(), in that case - the seq->scene can already have a Render initialized with same name, + the seq->scene can already have a Render initialized with same name, so we have to use a default name. (compositor uses scene name to find render). However, when called from within the UI (image preview in sequencer) we do want to use scene Render, that way the render result is defined - for display in render/imagewindow + for display in render/imagewindow - Hmm, don't see, why we can't do that all the time, + Hmm, don't see, why we can't do that all the time, and since G.rendering is uhm, gone... (Peter) */ - int rendering = 1; + int rendering = G.rendering; int doseq; + int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : (scene->r.seq_flag & R_SEQ_GL_PREV); - oldcfra = seq->scene->r.cfra; - - if(rendering) - re= RE_NewRender(" do_build_seq_ibuf", RE_SLOT_DEFAULT); - else - re= RE_NewRender(sce->id.name, RE_SLOT_VIEW); - /* prevent eternal loop */ doseq= scene->r.scemode & R_DOSEQ; scene->r.scemode &= ~R_DOSEQ; - - RE_BlenderFrame(re, sce, NULL, - seq->sfra+se->nr+seq->anim_startofs); - - RE_AcquireResultImage(re, &rres); - - if(rres.rectf) { - se->ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat, 0); - memcpy(se->ibuf->rect_float, rres.rectf, 4*sizeof(float)*rres.rectx*rres.recty); - if(rres.rectz) { - addzbuffloatImBuf(se->ibuf); - memcpy(se->ibuf->zbuf_float, rres.rectz, sizeof(float)*rres.rectx*rres.recty); - } - } else if (rres.rect32) { - se->ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect, 0); - memcpy(se->ibuf->rect, rres.rect32, 4*rres.rectx*rres.recty); - } - RE_ReleaseResultImage(re); - - // BIF_end_render_callbacks(); + seq->scene->r.cfra= frame; + if(seq->scene_camera) seq->scene->camera= seq->scene_camera; + else scene_camera_switch_update(seq->scene); + +#ifdef DURIAN_CAMERA_SWITCH + /* stooping to new low's in hackyness :( */ + oldmarkers= seq->scene->markers; + seq->scene->markers.first= seq->scene->markers.last= NULL; +#endif + + if(sequencer_view3d_cb && doseq_gl && (seq->scene == scene || have_seq==0) && seq->scene->camera) { + /* opengl offscreen render */ + scene_update_for_newframe(seq->scene, seq->scene->lay); + se->ibuf= sequencer_view3d_cb(seq->scene, seqrectx, seqrecty, scene->r.seq_prev_type); + } + else { + Render *re; + RenderResult rres; + + if(rendering) + re= RE_NewRender(" do_build_seq_ibuf"); + else + re= RE_NewRender(sce->id.name); + + RE_BlenderFrame(re, sce, NULL, sce->lay, frame); + + RE_AcquireResultImage(re, &rres); + + if(rres.rectf) { + se->ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat, 0); + memcpy(se->ibuf->rect_float, rres.rectf, 4*sizeof(float)*rres.rectx*rres.recty); + if(rres.rectz) { + addzbuffloatImBuf(se->ibuf); + memcpy(se->ibuf->zbuf_float, rres.rectz, sizeof(float)*rres.rectx*rres.recty); + } + } else if (rres.rect32) { + se->ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect, 0); + memcpy(se->ibuf->rect, rres.rect32, 4*rres.rectx*rres.recty); + } + + RE_ReleaseResultImage(re); + + // BIF_end_render_callbacks(); + } /* restore */ scene->r.scemode |= doseq; - + seq->scene->r.cfra = oldcfra; + seq->scene->camera= oldcamera; + +#ifdef DURIAN_CAMERA_SWITCH + /* stooping to new low's in hackyness :( */ + seq->scene->markers= oldmarkers; +#endif copy_to_ibuf_still(seq, se); @@ -2189,7 +2306,8 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(se->ibuf == NULL) { se->ok = STRIPELEM_FAILED; } else { - input_preprocess(scene, seq, se, cfra); + input_preprocess(scene, seq, se, cfra, + seqrectx, seqrecty); } } @@ -2204,9 +2322,9 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int } } -static TStripElem* do_build_seq_recursively(Scene *scene, Sequence *seq, int cfra, int render_size); +static TStripElem* do_build_seq_recursively(Scene *scene, Sequence *seq, int cfra, int render_size, int seqrectx, int seqrecty); -static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *se, int cfra, int render_size) +static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *se, int cfra, int render_size, int seqrectx, int seqrecty) { float fac, facf; struct SeqEffectHandle sh = get_sequence_effect(seq); @@ -2239,22 +2357,22 @@ static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *s /* no input needed */ break; case 0: - se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size); - se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size); + se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size, seqrectx, seqrecty); + se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size, seqrectx, seqrecty); if (seq->seq3) { - se->se3 = do_build_seq_recursively(scene, seq->seq3, cfra, render_size); + se->se3 = do_build_seq_recursively(scene, seq->seq3, cfra, render_size, seqrectx, seqrecty); } break; case 1: - se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size); + se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size, seqrectx, seqrecty); break; case 2: - se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size); + se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size, seqrectx, seqrecty); break; } - do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size); + do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size, seqrectx, seqrecty); /* children are not needed anymore ... */ @@ -2270,7 +2388,7 @@ static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *s check_limiter_refcount("do_effect_seq_recursively", se); } -static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, int cfra, int render_size) +static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty) { TStripElem *se; @@ -2278,9 +2396,9 @@ static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, i if(se) { if (seq->type & SEQ_EFFECT) { - do_effect_seq_recursively(scene, seq, se, cfra, render_size); + do_effect_seq_recursively(scene, seq, se, cfra, render_size, seqrectx, seqrecty); } else { - do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size); + do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size, seqrectx, seqrecty); } } return se; @@ -2294,7 +2412,7 @@ instead of faking using the blend code below... */ -static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra, int render_size) +static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty) { SpeedControlVars * s = (SpeedControlVars *)seq->effectdata; int nr = cfra - seq->start; @@ -2319,11 +2437,11 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra } if (cfra_left == cfra_right || - (s->flags & SEQ_SPEED_BLEND) == 0) { - test_and_auto_discard_ibuf(se); + (s->flags & SEQ_SPEED_BLEND) == 0) { + test_and_auto_discard_ibuf(se, seqrectx, seqrecty); if (se->ibuf == NULL) { - se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size); + se1 = do_build_seq_recursively(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty); if((se1 && se1->ibuf && se1->ibuf->rect_float)) se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2355,8 +2473,8 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra } if (se->ibuf == NULL) { - se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size); - se2 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_right, render_size); + se1 = do_build_seq_recursively(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty); + se2 = do_build_seq_recursively(scene, seq->seq1, cfra_right, render_size, seqrectx, seqrecty); if((se1 && se1->ibuf && se1->ibuf->rect_float)) se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2372,6 +2490,7 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra f_cfra - (float) cfra_left, f_cfra - (float) cfra_left, se->ibuf->x, se->ibuf->y, + render_size, se1->ibuf, se2->ibuf, 0, se->ibuf); } } @@ -2408,13 +2527,18 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra * */ -static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra, int render_size) +static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty) { TStripElem *se; + + /* BAD HACK! Seperate handling for speed effects needed, since + a) you can't just fetch a different cfra within an effect strip + b) we have to blend two frames, and CFRA is not float... + */ if (seq->type == SEQ_SPEED) { - se = do_handle_speed_effect(scene, seq, cfra, render_size); + se = do_handle_speed_effect(scene, seq, cfra, render_size, seqrectx, seqrecty); } else { - se = do_build_seq_recursively_impl(scene, seq, cfra, render_size); + se = do_build_seq_recursively_impl(scene, seq, cfra, render_size, seqrectx, seqrecty); } check_limiter_refcount("do_build_seq_recursively", se); @@ -2422,15 +2546,53 @@ static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cf return se; } -static TStripElem* do_build_seq_array_recursively(Scene *scene, - ListBase *seqbasep, int cfra, int chanshown, int render_size) +static int seq_must_swap_input_in_blend_mode(Sequence * seq) +{ + int swap_input = FALSE; + + /* bad hack, to fix crazy input ordering of + those two effects */ + + if (seq->blend_mode == SEQ_ALPHAOVER || + seq->blend_mode == SEQ_ALPHAUNDER || + seq->blend_mode == SEQ_OVERDROP) { + swap_input = TRUE; + } + + return swap_input; +} + +static int seq_get_early_out_for_blend_mode(Sequence * seq) +{ + struct SeqEffectHandle sh = get_sequence_blend(seq); + float facf = seq->blend_opacity / 100.0; + int early_out = sh.early_out(seq, facf, facf); + + if (early_out < 1) { + return early_out; + } + + if (seq_must_swap_input_in_blend_mode(seq)) { + if (early_out == 2) { + return 1; + } else if (early_out == 1) { + return 2; + } + } + return early_out; +} + +static TStripElem* do_build_seq_array_recursively( + Scene *scene, ListBase *seqbasep, int cfra, int chanshown, + int render_size, int seqrectx, int seqrecty) { Sequence* seq_arr[MAXSEQ+1]; int count; int i; TStripElem* se = 0; - count = get_shown_sequences(seqbasep, cfra, chanshown, (Sequence **)&seq_arr); + count = get_shown_sequences(seqbasep, cfra, chanshown, + (Sequence **)&seq_arr); if (!count) { return 0; @@ -2442,7 +2604,15 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, return 0; } - test_and_auto_discard_ibuf(se); +#if 0 /* commentind since this breaks keyframing, since it resets the value on draw */ + if(scene->r.cfra != cfra) { + // XXX for prefetch and overlay offset!..., very bad!!! + AnimData *adt= BKE_animdata_from_id(&scene->id); + BKE_animsys_evaluate_animdata(&scene->id, adt, cfra, ADT_RECALC_ANIM); + } +#endif + + test_and_auto_discard_ibuf(se, seqrectx, seqrecty); if (se->ibuf_comp != 0) { IMB_cache_limiter_insert(se->ibuf_comp); @@ -2453,7 +2623,9 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, if(count == 1) { - se = do_build_seq_recursively(scene, seq_arr[0], cfra, render_size); + se = do_build_seq_recursively(scene, seq_arr[0], + cfra, render_size, + seqrectx, seqrecty); if (se->ibuf) { se->ibuf_comp = se->ibuf; IMB_refImBuf(se->ibuf_comp); @@ -2465,18 +2637,19 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, for (i = count - 1; i >= 0; i--) { int early_out; Sequence * seq = seq_arr[i]; - struct SeqEffectHandle sh; - float facf; se = give_tstripelem(seq, cfra); - test_and_auto_discard_ibuf(se); + test_and_auto_discard_ibuf(se, seqrectx, seqrecty); if (se->ibuf_comp != 0) { break; } if (seq->blend_mode == SEQ_BLEND_REPLACE) { - do_build_seq_recursively(scene, seq, cfra, render_size); + do_build_seq_recursively( + scene, seq, cfra, render_size, + seqrectx, seqrecty); + if (se->ibuf) { se->ibuf_comp = se->ibuf; IMB_refImBuf(se->ibuf); @@ -2491,16 +2664,15 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, break; } - sh = get_sequence_blend(seq); - - facf = seq->blend_opacity / 100.0; - - early_out = sh.early_out(seq, facf, facf); + early_out = seq_get_early_out_for_blend_mode(seq); switch (early_out) { case -1: case 2: - do_build_seq_recursively(scene, seq, cfra, render_size); + do_build_seq_recursively( + scene, seq, cfra, render_size, + seqrectx, seqrecty); + if (se->ibuf) { se->ibuf_comp = se->ibuf; IMB_refImBuf(se->ibuf_comp); @@ -2524,7 +2696,10 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, } break; case 0: - do_build_seq_recursively(scene, seq, cfra, render_size); + do_build_seq_recursively( + scene, seq, cfra, render_size, + seqrectx, seqrecty); + if (!se->ibuf) { se->ibuf = IMB_allocImBuf( (short)seqrectx, (short)seqrecty, @@ -2554,20 +2729,19 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, TStripElem* se2 = give_tstripelem(seq_arr[i], cfra); float facf = seq->blend_opacity / 100.0; - - int early_out = sh.early_out(seq, facf, facf); + int swap_input = seq_must_swap_input_in_blend_mode(seq); + int early_out = seq_get_early_out_for_blend_mode(seq); switch (early_out) { case 0: { int x= se2->ibuf->x; int y= se2->ibuf->y; - int swap_input = FALSE; if(se1->ibuf_comp == NULL) continue; if (se1->ibuf_comp->rect_float || - se2->ibuf->rect_float) { + se2->ibuf->rect_float) { se2->ibuf_comp = IMB_allocImBuf( (short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2579,40 +2753,31 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, if (!se1->ibuf_comp->rect_float && - se2->ibuf_comp->rect_float) { - IMB_float_from_rect(se1->ibuf_comp); + se2->ibuf_comp->rect_float) { + IMB_float_from_rect_simple(se1->ibuf_comp); } if (!se2->ibuf->rect_float && - se2->ibuf_comp->rect_float) { - IMB_float_from_rect(se2->ibuf); + se2->ibuf_comp->rect_float) { + IMB_float_from_rect_simple(se2->ibuf); } if (!se1->ibuf_comp->rect && - !se2->ibuf_comp->rect_float) { + !se2->ibuf_comp->rect_float) { IMB_rect_from_float(se1->ibuf_comp); } if (!se2->ibuf->rect && - !se2->ibuf_comp->rect_float) { + !se2->ibuf_comp->rect_float) { IMB_rect_from_float(se2->ibuf); } - /* bad hack, to fix crazy input ordering of - those two effects */ - - if (seq->blend_mode == SEQ_ALPHAOVER || - seq->blend_mode == SEQ_ALPHAUNDER || - seq->blend_mode == SEQ_OVERDROP) { - swap_input = TRUE; - } - if (swap_input) { sh.execute(scene, seq, cfra, - facf, facf, x, y, + facf, facf, x, y, render_size, se2->ibuf, se1->ibuf_comp, 0, se2->ibuf_comp); } else { sh.execute(scene, seq, cfra, - facf, facf, x, y, + facf, facf, x, y, render_size, se1->ibuf_comp, se2->ibuf, 0, se2->ibuf_comp); } @@ -2627,7 +2792,7 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, break; } case 1: { - se2->ibuf_comp = se1->ibuf; + se2->ibuf_comp = se1->ibuf_comp; if(se2->ibuf_comp) IMB_refImBuf(se2->ibuf_comp); @@ -2663,10 +2828,7 @@ static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, i seqbasep= ed->seqbasep; } - seqrectx= rectx; /* bad bad global! */ - seqrecty= recty; - - se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown, render_size); + se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown, render_size, rectx, recty); if(!se) { return 0; @@ -2677,14 +2839,31 @@ static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, i return se->ibuf_comp; } +ImBuf *give_ibuf_seqbase(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size, ListBase *seqbasep) +{ + TStripElem *se; + + se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown, render_size, rectx, recty); + + if(!se) { + return 0; + } + + check_limiter_refcount_comp("give_ibuf_seqbase", se); + + if (se->ibuf_comp) { + IMB_cache_limiter_unref(se->ibuf_comp); + } + + return se->ibuf_comp; +} + + ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq) { TStripElem* se; - seqrectx= rectx; /* bad bad global! */ - seqrecty= recty; - - se = do_build_seq_recursively(scene, seq, cfra, render_size); + se = do_build_seq_recursively(scene, seq, cfra, render_size, rectx, recty); if(!se) { return 0; @@ -2737,7 +2916,7 @@ static pthread_cond_t wakeup_cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t frame_done_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t frame_done_cond = PTHREAD_COND_INITIALIZER; -static volatile int seq_thread_shutdown = FALSE; +static volatile int seq_thread_shutdown = TRUE; static volatile int seq_last_given_monoton_cfra = 0; static int monoton_cfra = 0; @@ -2888,8 +3067,8 @@ static void seq_stop_threads() seq_thread_shutdown = TRUE; - pthread_cond_broadcast(&wakeup_cond); - pthread_mutex_unlock(&wakeup_lock); + pthread_cond_broadcast(&wakeup_cond); + pthread_mutex_unlock(&wakeup_lock); for(tslot = running_threads.first; tslot; tslot= tslot->next) { pthread_join(tslot->pthread, NULL); @@ -2987,10 +3166,10 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int for (e = prefetch_done.first; e; e = e->next) { if (cfra == e->cfra && - chanshown == e->chanshown && - rectx == e->rectx && - recty == e->recty && - render_size == e->render_size) { + chanshown == e->chanshown && + rectx == e->rectx && + recty == e->recty && + render_size == e->render_size) { success = TRUE; found_something = TRUE; break; @@ -3000,10 +3179,10 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int if (!e) { for (e = prefetch_wait.first; e; e = e->next) { if (cfra == e->cfra && - chanshown == e->chanshown && - rectx == e->rectx && - recty == e->recty && - render_size == e->render_size) { + chanshown == e->chanshown && + rectx == e->rectx && + recty == e->recty && + render_size == e->render_size) { found_something = TRUE; break; } @@ -3014,13 +3193,13 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int PrefetchThread *tslot; for(tslot = running_threads.first; - tslot; tslot= tslot->next) { + tslot; tslot= tslot->next) { if (tslot->current && - cfra == tslot->current->cfra && - chanshown == tslot->current->chanshown && - rectx == tslot->current->rectx && - recty == tslot->current->recty && - render_size== tslot->current->render_size){ + cfra == tslot->current->cfra && + chanshown == tslot->current->chanshown && + rectx == tslot->current->rectx && + recty == tslot->current->recty && + render_size== tslot->current->render_size){ found_something = TRUE; break; } @@ -3092,19 +3271,19 @@ static void free_imbuf_seq_except(Scene *scene, int cfra) TStripElem * curelem = give_tstripelem(seq, cfra); for(a = 0, se = seq->strip->tstripdata; - a < seq->strip->len && se; a++, se++) { + a < seq->strip->len && se; a++, se++) { if(se != curelem) { free_imbuf_strip_elem(se); } } for(a = 0, se = seq->strip->tstripdata_startstill; - a < seq->strip->startstill && se; a++, se++) { + a < seq->strip->startstill && se; a++, se++) { if(se != curelem) { free_imbuf_strip_elem(se); } } for(a = 0, se = seq->strip->tstripdata_endstill; - a < seq->strip->endstill && se; a++, se++) { + a < seq->strip->endstill && se; a++, se++) { if(se != curelem) { free_imbuf_strip_elem(se); } @@ -3163,15 +3342,15 @@ void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage) for(seq= seqbase->first; seq; seq= seq->next) { if(seq->strip) { for(a = 0, se = seq->strip->tstripdata; - a < seq->strip->len && se; a++, se++) { + a < seq->strip->len && se; a++, se++) { free_imbuf_strip_elem(se); } for(a = 0, se = seq->strip->tstripdata_startstill; - a < seq->strip->startstill && se; a++, se++) { + a < seq->strip->startstill && se; a++, se++) { free_imbuf_strip_elem(se); } for(a = 0, se = seq->strip->tstripdata_endstill; - a < seq->strip->endstill && se; a++, se++) { + a < seq->strip->endstill && se; a++, se++) { free_imbuf_strip_elem(se); } if(seq->strip->ibuf_startstill) { @@ -3355,7 +3534,8 @@ void seq_tx_set_final_right(Sequence *seq, int val) since they work a bit differently to normal image seq's (during transform) */ int seq_single_check(Sequence *seq) { - if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR)) + if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR + || seq->type == SEQ_MULTICAM)) return 1; else return 0; @@ -3639,7 +3819,7 @@ static void seq_update_muting_recursive(Scene *scene, ListBase *seqbasep, Sequen seq_update_muting_recursive(scene, &seq->seqbase, metaseq, seqmute); } - else if(seq->type == SEQ_SOUND) { + else if((seq->type == SEQ_SOUND) || (seq->type == SEQ_SCENE)) { if(seq->scene_sound) { sound_mute_scene_sound(scene, seq->scene_sound, seqmute); } @@ -3678,6 +3858,57 @@ ListBase *seq_seqbase(ListBase *seqbase, Sequence *seq) return NULL; } +int seq_swap(Sequence *seq_a, Sequence *seq_b) +{ + char name[sizeof(seq_a->name)]; + + if(seq_a->len != seq_b->len) + return 0; + + /* type checking, could be more advanced but disalow sound vs non-sound copy */ + if(seq_a->type != seq_b->type) { + if(seq_a->type == SEQ_SOUND || seq_b->type == SEQ_SOUND) { + return 0; + } + + /* disallow effects to swap with non-effects strips */ + if((seq_a->type & SEQ_EFFECT) != (seq_b->type & SEQ_EFFECT)) { + return 0; + } + + if((seq_a->type & SEQ_EFFECT) && (seq_b->type & SEQ_EFFECT)) { + if(get_sequence_effect_num_inputs(seq_a->type) != get_sequence_effect_num_inputs(seq_b->type)) { + return 0; + } + } + } + + SWAP(Sequence, *seq_a, *seq_b); + + /* swap back names so animation fcurves dont get swapped */ + strcpy(name, seq_a->name+2); + strcpy(seq_a->name+2, seq_b->name+2); + strcpy(seq_b->name+2, name); + + /* swap back opacity, and overlay mode */ + SWAP(int, seq_a->blend_mode, seq_b->blend_mode); + SWAP(float, seq_a->blend_opacity, seq_b->blend_opacity); + + + SWAP(void *, seq_a->prev, seq_b->prev); + SWAP(void *, seq_a->next, seq_b->next); + SWAP(int, seq_a->start, seq_b->start); + SWAP(int, seq_a->startofs, seq_b->startofs); + SWAP(int, seq_a->endofs, seq_b->endofs); + SWAP(int, seq_a->startstill, seq_b->startstill); + SWAP(int, seq_a->endstill, seq_b->endstill); + SWAP(int, seq_a->machine, seq_b->machine); + SWAP(int, seq_a->startdisp, seq_b->startdisp); + SWAP(int, seq_a->enddisp, seq_b->enddisp); + + return 1; +} + /* XXX - hackish function needed for transforming strips! TODO - have some better solution */ void seq_offset_animdata(Scene *scene, Sequence *seq, int ofs) { @@ -3702,6 +3933,62 @@ void seq_offset_animdata(Scene *scene, Sequence *seq, int ofs) } } +void seq_dupe_animdata(Scene *scene, char *name_from, char *name_to) +{ + char str_from[32]; + FCurve *fcu; + FCurve *fcu_last; + FCurve *fcu_cpy; + ListBase lb= {NULL, NULL}; + + if(scene->adt==NULL || scene->adt->action==NULL) + return; + + sprintf(str_from, "[\"%s\"]", name_from); + + fcu_last= scene->adt->action->curves.last; + + for (fcu= scene->adt->action->curves.first; fcu && fcu->prev != fcu_last; fcu= fcu->next) { + if(strstr(fcu->rna_path, "sequence_editor.sequences_all[") && strstr(fcu->rna_path, str_from)) { + fcu_cpy= copy_fcurve(fcu); + BLI_addtail(&lb, fcu_cpy); + } + } + + /* notice validate is 0, keep this because the seq may not be added to the scene yet */ + BKE_animdata_fix_paths_rename(&scene->id, scene->adt, "sequence_editor.sequences_all", name_from, name_to, 0, 0, 0); + + /* add the original fcurves back */ + addlisttolist(&scene->adt->action->curves, &lb); +} + +/* XXX - hackish function needed to remove all fcurves belonging to a sequencer strip */ +static void seq_free_animdata(Scene *scene, Sequence *seq) +{ + char str[32]; + FCurve *fcu; + + if(scene->adt==NULL || scene->adt->action==NULL) + return; + + sprintf(str, "[\"%s\"]", seq->name+2); + + fcu= scene->adt->action->curves.first; + + while (fcu) { + if(strstr(fcu->rna_path, "sequence_editor.sequences_all[") && strstr(fcu->rna_path, str)) { + FCurve *next_fcu = fcu->next; + + BLI_remlink(&scene->adt->action->curves, fcu); + free_fcurve(fcu); + + fcu = next_fcu; + } else { + fcu = fcu->next; + } + } +} + Sequence *get_seq_by_name(ListBase *seqbase, const char *name, int recursive) { @@ -3720,14 +4007,14 @@ Sequence *get_seq_by_name(ListBase *seqbase, const char *name, int recursive) } -Sequence *active_seq_get(Scene *scene) +Sequence *seq_active_get(Scene *scene) { Editing *ed= seq_give_editing(scene, FALSE); if(ed==NULL) return NULL; return ed->act_seq; } -void active_seq_set(Scene *scene, Sequence *seq) +void seq_active_set(Scene *scene, Sequence *seq) { Editing *ed= seq_give_editing(scene, FALSE); if(ed==NULL) return; @@ -3735,12 +4022,41 @@ void active_seq_set(Scene *scene, Sequence *seq) ed->act_seq= seq; } +int seq_active_pair_get(Scene *scene, Sequence **seq_act, Sequence **seq_other) +{ + Editing *ed= seq_give_editing(scene, FALSE); + + *seq_act= seq_active_get(scene); + + if(*seq_act == NULL) { + return 0; + } + else { + Sequence *seq; + + *seq_other= NULL; + + for(seq= ed->seqbasep->first; seq; seq= seq->next) { + if(seq->flag & SELECT && (seq != (*seq_act))) { + if(*seq_other) { + return 0; + } + else { + *seq_other= seq; + } + } + } + + return (*seq_other != NULL); + } +} + /* api like funcs for adding */ void seq_load_apply(Scene *scene, Sequence *seq, SeqLoadInfo *seq_load) { if(seq) { - strcpy(seq->name, seq_load->name); + BLI_strncpy(seq->name+2, seq_load->name, sizeof(seq->name)-2); seqbase_unique_name_recursive(&scene->ed->seqbase, seq); if(seq_load->flag & SEQ_LOAD_FRAME_ADVANCE) { @@ -3749,7 +4065,7 @@ void seq_load_apply(Scene *scene, Sequence *seq, SeqLoadInfo *seq_load) if(seq_load->flag & SEQ_LOAD_REPLACE_SEL) { seq_load->flag |= SELECT; - active_seq_set(scene, seq); + seq_active_set(scene, seq); } if(seq_load->flag & SEQ_LOAD_SOUND_CACHE) { @@ -3777,6 +4093,7 @@ Sequence *alloc_sequence(ListBase *lb, int cfra, int machine) seq->flag= SELECT; seq->start= cfra; seq->machine= machine; + seq->sat= 1.0; seq->mul= 1.0; seq->blend_opacity = 100.0; seq->volume = 1.0f; @@ -3794,8 +4111,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel); seq->type= SEQ_IMAGE; - BLI_strncpy(seq->name+2, "Image", SEQ_NAME_MAXSTR-2); - seqbase_unique_name_recursive(&scene->ed->seqbase, seq); + seq->blend_mode= SEQ_CROSS; /* so alpha adjustment fade to the strip below */ /* basic defaults */ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); @@ -3803,8 +4119,8 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo strip->len = seq->len = seq_load->len ? seq_load->len : 1; strip->us= 1; strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); - BLI_split_dirfile_basic(seq_load->path, strip->dir, se->name); - + BLI_strncpy(strip->dir, seq_load->path, sizeof(strip->dir)); + seq_load_apply(scene, seq, seq_load); return seq; @@ -3822,7 +4138,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo AUD_SoundInfo info; - sound = sound_new_file(CTX_data_main(C), seq_load->path); + sound = sound_new_file(CTX_data_main(C), seq_load->path); /* handles relative paths */ if (sound==NULL || sound->playback_handle == NULL) { //if(op) @@ -3853,7 +4169,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); - BLI_split_dirfile_basic(seq_load->path, strip->dir, se->name); + BLI_split_dirfile(seq_load->path, strip->dir, se->name); seq->scene_sound = sound_add_scene_sound(scene, seq, seq_load->start_frame, seq_load->start_frame + strip->len, 0); @@ -3870,6 +4186,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) { Scene *scene= CTX_data_scene(C); /* only for sound */ + char path[sizeof(seq_load->path)]; Sequence *seq, *soundseq; /* generic strip vars */ Strip *strip; @@ -3877,14 +4194,18 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo struct anim *an; - an = openanim(seq_load->path, IB_rect); + BLI_strncpy(path, seq_load->path, sizeof(path)); + BLI_path_abs(path, G.sce); + + an = openanim(path, IB_rect); if(an==NULL) return NULL; seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel); - seq->type= SEQ_MOVIE; + seq->blend_mode= SEQ_CROSS; /* so alpha adjustment fade to the strip below */ + seq->anim= an; seq->anim_preseek = IMB_anim_get_preseek(an); BLI_strncpy(seq->name+2, "Movie", SEQ_NAME_MAXSTR-2); @@ -3897,7 +4218,7 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); - BLI_split_dirfile_basic(seq_load->path, strip->dir, se->name); + BLI_split_dirfile(seq_load->path, strip->dir, se->name); calc_sequence_disp(scene, seq); @@ -3912,8 +4233,142 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo seq_load->channel--; } + if(seq_load->name[0] == '\0') + BLI_strncpy(seq_load->name, se->name, sizeof(seq_load->name)); + /* can be NULL */ seq_load_apply(scene, seq, seq_load); return seq; } + + +static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag) +{ + Sequence *seqn = MEM_dupallocN(seq); + + seq->tmp = seqn; + seqn->strip= MEM_dupallocN(seq->strip); + + // XXX: add F-Curve duplication stuff? + + seqn->strip->tstripdata = 0; + seqn->strip->tstripdata_startstill = 0; + seqn->strip->tstripdata_endstill = 0; + seqn->strip->ibuf_startstill = 0; + seqn->strip->ibuf_endstill = 0; + + if (seq->strip->crop) { + seqn->strip->crop = MEM_dupallocN(seq->strip->crop); + } + + if (seq->strip->transform) { + seqn->strip->transform = MEM_dupallocN(seq->strip->transform); + } + + if (seq->strip->proxy) { + seqn->strip->proxy = MEM_dupallocN(seq->strip->proxy); + } + + if (seq->strip->color_balance) { + seqn->strip->color_balance + = MEM_dupallocN(seq->strip->color_balance); + } + + if(seq->type==SEQ_META) { + seqn->strip->stripdata = 0; + + seqn->seqbase.first= seqn->seqbase.last= 0; + /* WATCH OUT!!! - This metastrip is not recursively duplicated here - do this after!!! */ + /* - seq_dupli_recursive(&seq->seqbase,&seqn->seqbase);*/ + } else if(seq->type == SEQ_SCENE) { + seqn->strip->stripdata = 0; + if(seq->scene_sound) + seqn->scene_sound = sound_scene_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); + } else if(seq->type == SEQ_MOVIE) { + seqn->strip->stripdata = + MEM_dupallocN(seq->strip->stripdata); + seqn->anim= 0; + } else if(seq->type == SEQ_SOUND) { + seqn->strip->stripdata = + MEM_dupallocN(seq->strip->stripdata); + if(seq->scene_sound) + seqn->scene_sound = sound_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); + + seqn->sound->id.us++; + } else if(seq->type == SEQ_IMAGE) { + seqn->strip->stripdata = + MEM_dupallocN(seq->strip->stripdata); + } else if(seq->type >= SEQ_EFFECT) { + if(seq->seq1 && seq->seq1->tmp) seqn->seq1= seq->seq1->tmp; + if(seq->seq2 && seq->seq2->tmp) seqn->seq2= seq->seq2->tmp; + if(seq->seq3 && seq->seq3->tmp) seqn->seq3= seq->seq3->tmp; + + if (seq->type & SEQ_EFFECT) { + struct SeqEffectHandle sh; + sh = get_sequence_effect(seq); + if(sh.copy) + sh.copy(seq, seqn); + } + + seqn->strip->stripdata = 0; + + } else { + fprintf(stderr, "Aiiiiekkk! sequence type not " + "handled in duplicate!\nExpect a crash" + " now...\n"); + } + + if(dupe_flag & SEQ_DUPE_UNIQUE_NAME) + seqbase_unique_name_recursive(&scene->ed->seqbase, seqn); + + if(dupe_flag & SEQ_DUPE_ANIM) + seq_dupe_animdata(scene, seq->name+2, seqn->name+2); + + return seqn; +} + +Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_flag) +{ + Sequence * seqn = seq_dupli(scene, seq, dupe_flag); + if (seq->type == SEQ_META) { + Sequence *s; + for(s= seq->seqbase.first; s; s = s->next) { + Sequence *n = seq_dupli_recursive(scene, s, dupe_flag); + if (n) { + BLI_addtail(&seqn->seqbase, n); + } + } + } + return seqn; +} + +void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag) +{ + Sequence *seq; + Sequence *seqn = 0; + Sequence *last_seq = seq_active_get(scene); + + for(seq= seqbase->first; seq; seq= seq->next) { + seq->tmp= NULL; + if((seq->flag & SELECT) || (dupe_flag & SEQ_DUPE_ALL)) { + seqn = seq_dupli(scene, seq, dupe_flag); + if (seqn) { /*should never fail */ + if(dupe_flag & SEQ_DUPE_CONTEXT) { + seq->flag &= ~SEQ_ALLSEL; + seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL+SEQ_LOCK); + } + + BLI_addtail(nseqbase, seqn); + if(seq->type==SEQ_META) + seqbase_dupli_recursive(scene, &seqn->seqbase, &seq->seqbase, dupe_flag); + + if(dupe_flag & SEQ_DUPE_CONTEXT) { + if (seq == last_seq) { + seq_active_set(scene, seqn); + } + } + } + } + } +} diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index b2dd5bb3d55..b9c033f1809 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -46,23 +46,16 @@ #include "BKE_lattice.h" #include "BKE_utildefines.h" #include "BKE_deform.h" -#include "BKE_cdderivedmesh.h" -#include "BKE_displist.h" -#include "BKE_global.h" #include "BKE_mesh.h" #include "BKE_subsurf.h" #include "BKE_mesh.h" #include "BKE_tessmesh.h" #include "BLI_math.h" -#include "BLI_kdtree.h" -#include "BLI_kdopbvh.h" #include "BLI_editVert.h" -#include "RE_raytrace.h" #include "MEM_guardedalloc.h" -#include "ED_mesh.h" /* Util macros */ #define TO_STR(a) #a @@ -364,11 +357,16 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S if(calc->vert) { - VECCOPY(tmp_co, calc->vert[i].co); - if(calc->smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL) + /* calc->vert contains verts from derivedMesh */ + /* this coordinated are deformed by vertexCos only for normal projection (to get correct normals) */ + /* for other cases calc->varts contains undeformed coordinates and vertexCos should be used */ + if(calc->smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL) { + VECCOPY(tmp_co, calc->vert[i].co); normal_short_to_float_v3(tmp_no, calc->vert[i].no); - else + } else { + VECCOPY(tmp_co, co); VECCOPY(tmp_no, proj_axis); + } } else { diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c index ecafd0881ad..33871f78864 100644 --- a/source/blender/blenkernel/intern/sketch.c +++ b/source/blender/blenkernel/intern/sketch.c @@ -260,7 +260,7 @@ void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], f VECCOPY(p, delta_p); mul_v3_fl(p, delta); - add_v3_v3v3(p, p, p_start); + add_v3_v3(p, p_start); } } @@ -336,8 +336,8 @@ void sk_flattenStroke(SK_Stroke *stk, int start, int end) VECCOPY(offset, normal); mul_v3_fl(offset, d); - sub_v3_v3v3(p, p, distance); - add_v3_v3v3(p, p, offset); + sub_v3_v3(p, distance); + add_v3_v3(p, offset); } } diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index dd25bfe4ec4..5fa9f3897c2 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -717,7 +717,7 @@ void smokeModifier_createType(struct SmokeModifierData *smd) smd->domain->strength = 2.0; smd->domain->noise = MOD_SMOKE_NOISEWAVE; smd->domain->diss_speed = 5; - // init 3dview buffer + // init view3d buffer smd->domain->viewsettings = 0; smd->domain->effector_weights = BKE_add_effector_weights(NULL); } @@ -753,6 +753,41 @@ void smokeModifier_createType(struct SmokeModifierData *smd) } } +void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData *tsmd) +{ + tsmd->type = smd->type; + tsmd->time = smd->time; + + smokeModifier_createType(tsmd); + + if (tsmd->domain) { + tsmd->domain->maxres = smd->domain->maxres; + tsmd->domain->amplify = smd->domain->amplify; + tsmd->domain->omega = smd->domain->omega; + tsmd->domain->alpha = smd->domain->alpha; + tsmd->domain->beta = smd->domain->beta; + tsmd->domain->flags = smd->domain->flags; + tsmd->domain->strength = smd->domain->strength; + tsmd->domain->noise = smd->domain->noise; + tsmd->domain->diss_speed = smd->domain->diss_speed; + tsmd->domain->viewsettings = smd->domain->viewsettings; + tsmd->domain->fluid_group = smd->domain->fluid_group; + tsmd->domain->coll_group = smd->domain->coll_group; + + MEM_freeN(tsmd->domain->effector_weights); + tsmd->domain->effector_weights = MEM_dupallocN(smd->domain->effector_weights); + } else if (tsmd->flow) { + tsmd->flow->density = smd->flow->density; + tsmd->flow->temp = smd->flow->temp; + tsmd->flow->psys = smd->flow->psys; + tsmd->flow->type = smd->flow->type; + } else if (tsmd->coll) { + ; + /* leave it as initialised, collision settings is mostly caches */ + } +} + + // forward decleration static void smoke_calc_transparency(float *result, float *input, float *p0, float *p1, int res[3], float dx, float *light, bresenham_callback cb, float correct); static float calc_voxel_transp(float *result, float *input, int res[3], int *pixel, float *tRay, float correct); @@ -1156,10 +1191,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM framenr = scene->r.cfra; - // printf("time: %d\n", scene->r.cfra); - - if(framenr == smd->time) - return; + printf("time: %d\n", scene->r.cfra); cache = sds->point_cache[0]; BKE_ptcache_id_from_smoke(&pid, ob, smd); @@ -1197,8 +1229,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM if(cache_result == PTCACHE_READ_EXACT) { - cache->flag |= PTCACHE_SIMULATION_VALID; - cache->simframe= framenr; + BKE_ptcache_validate(cache, framenr); if(sds->wt) { @@ -1206,13 +1237,24 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM if(cache_result_wt == PTCACHE_READ_EXACT) { - cache_wt->flag |= PTCACHE_SIMULATION_VALID; - cache_wt->simframe= framenr; + BKE_ptcache_validate(cache_wt, framenr); + + return; + } + else + { + ; /* don't return in the case we only got low res cache but no high res cache */ + /* we still need to calculate the high res cache */ } } - return; + else + return; } + /* only calculate something when we advanced a frame */ + if(framenr == smd->time) + return; + tstart(); smoke_calc_domain(scene, ob, smd); @@ -1223,8 +1265,6 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM /* do simulation */ // low res - cache->flag |= PTCACHE_SIMULATION_VALID; - cache->simframe= framenr; // simulate the actual smoke (c++ code in intern/smoke) // DG: interesting commenting this line + deactivating loading of noise files @@ -1239,6 +1279,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM if(get_lamp(scene, light)) smoke_calc_transparency(sds->shadow, smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, calc_voxel_transp, -7.0*sds->dx); + BKE_ptcache_validate(cache, framenr); BKE_ptcache_write_cache(&pid, framenr); if(sds->wt) @@ -1250,8 +1291,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM smoke_turbulence_step(sds->wt, sds->fluid); } - cache_wt->flag |= PTCACHE_SIMULATION_VALID; - cache_wt->simframe= framenr; + BKE_ptcache_validate(cache_wt, framenr); BKE_ptcache_write_cache(&pid_wt, framenr); } @@ -1283,11 +1323,11 @@ long long smoke_get_mem_req(int xres, int yres, int zres, int amplify) // print out memory requirements long long int coarseSize = sizeof(float) * totalCells * 22 + - sizeof(unsigned char) * totalCells; + sizeof(unsigned char) * totalCells; long long int fineSize = sizeof(float) * amplifiedCells * 7 + // big grids - sizeof(float) * totalCells * 8 + // small grids - sizeof(float) * 128 * 128 * 128; // noise tile + sizeof(float) * totalCells * 8 + // small grids + sizeof(float) * 128 * 128 * 128; // noise tile long long int totalMB = (coarseSize + fineSize) / (1024 * 1024); @@ -1296,83 +1336,83 @@ long long smoke_get_mem_req(int xres, int yres, int zres, int amplify) static void bresenham_linie_3D(int x1, int y1, int z1, int x2, int y2, int z2, float *tRay, bresenham_callback cb, float *result, float *input, int res[3], float correct) { - int dx, dy, dz, i, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; - int pixel[3]; + int dx, dy, dz, i, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; + int pixel[3]; - pixel[0] = x1; - pixel[1] = y1; - pixel[2] = z1; + pixel[0] = x1; + pixel[1] = y1; + pixel[2] = z1; - dx = x2 - x1; - dy = y2 - y1; - dz = z2 - z1; + dx = x2 - x1; + dy = y2 - y1; + dz = z2 - z1; - x_inc = (dx < 0) ? -1 : 1; - l = abs(dx); - y_inc = (dy < 0) ? -1 : 1; - m = abs(dy); - z_inc = (dz < 0) ? -1 : 1; - n = abs(dz); - dx2 = l << 1; - dy2 = m << 1; - dz2 = n << 1; + x_inc = (dx < 0) ? -1 : 1; + l = abs(dx); + y_inc = (dy < 0) ? -1 : 1; + m = abs(dy); + z_inc = (dz < 0) ? -1 : 1; + n = abs(dz); + dx2 = l << 1; + dy2 = m << 1; + dz2 = n << 1; - if ((l >= m) && (l >= n)) { - err_1 = dy2 - l; - err_2 = dz2 - l; - for (i = 0; i < l; i++) { - if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON) - break; - if (err_1 > 0) { - pixel[1] += y_inc; - err_1 -= dx2; - } - if (err_2 > 0) { - pixel[2] += z_inc; - err_2 -= dx2; - } - err_1 += dy2; - err_2 += dz2; - pixel[0] += x_inc; - } - } else if ((m >= l) && (m >= n)) { - err_1 = dx2 - m; - err_2 = dz2 - m; - for (i = 0; i < m; i++) { - if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON) - break; - if (err_1 > 0) { - pixel[0] += x_inc; - err_1 -= dy2; - } - if (err_2 > 0) { - pixel[2] += z_inc; - err_2 -= dy2; - } - err_1 += dx2; - err_2 += dz2; - pixel[1] += y_inc; - } - } else { - err_1 = dy2 - n; - err_2 = dx2 - n; - for (i = 0; i < n; i++) { - if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON) - break; - if (err_1 > 0) { - pixel[1] += y_inc; - err_1 -= dz2; - } - if (err_2 > 0) { - pixel[0] += x_inc; - err_2 -= dz2; - } - err_1 += dy2; - err_2 += dx2; - pixel[2] += z_inc; - } - } - cb(result, input, res, pixel, tRay, correct); + if ((l >= m) && (l >= n)) { + err_1 = dy2 - l; + err_2 = dz2 - l; + for (i = 0; i < l; i++) { + if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON) + break; + if (err_1 > 0) { + pixel[1] += y_inc; + err_1 -= dx2; + } + if (err_2 > 0) { + pixel[2] += z_inc; + err_2 -= dx2; + } + err_1 += dy2; + err_2 += dz2; + pixel[0] += x_inc; + } + } else if ((m >= l) && (m >= n)) { + err_1 = dx2 - m; + err_2 = dz2 - m; + for (i = 0; i < m; i++) { + if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON) + break; + if (err_1 > 0) { + pixel[0] += x_inc; + err_1 -= dy2; + } + if (err_2 > 0) { + pixel[2] += z_inc; + err_2 -= dy2; + } + err_1 += dx2; + err_2 += dz2; + pixel[1] += y_inc; + } + } else { + err_1 = dy2 - n; + err_2 = dx2 - n; + for (i = 0; i < n; i++) { + if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON) + break; + if (err_1 > 0) { + pixel[1] += y_inc; + err_1 -= dz2; + } + if (err_2 > 0) { + pixel[0] += x_inc; + err_2 -= dz2; + } + err_1 += dy2; + err_2 += dx2; + pixel[2] += z_inc; + } + } + cb(result, input, res, pixel, tRay, correct); } static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int correct) @@ -1398,11 +1438,12 @@ static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int static void smoke_calc_transparency(float *result, float *input, float *p0, float *p1, int res[3], float dx, float *light, bresenham_callback cb, float correct) { - int z; float bv[6]; - int slabsize=res[0]*res[1]; + int a, z, slabsize=res[0]*res[1], size= res[0]*res[1]*res[2]; + + for(a=0; a<size; a++) + result[a]= -1.0f; - memset(result, -1, sizeof(float)*res[0]*res[1]*res[2]); // x bv[0] = p0[0]; bv[1] = p1[0]; // y diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 8ca8feead90..70834746027 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -1,5 +1,5 @@ -/* softbody.c - * +/* softbody.c + * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,17 +32,17 @@ ****** variables on the UI for now - float mediafrict; friction to env - float nodemass; softbody mass of *vertex* - float grav; softbody amount of gravitaion to apply - - float goalspring; softbody goal springs - float goalfrict; softbody goal springs friction - float mingoal; quick limits for goal + float mediafrict; friction to env + float nodemass; softbody mass of *vertex* + float grav; softbody amount of gravitaion to apply + + float goalspring; softbody goal springs + float goalfrict; softbody goal springs friction + float mingoal; quick limits for goal float maxgoal; - float inspring; softbody inner springs - float infrict; softbody inner springs friction + float inspring; softbody inner springs + float infrict; softbody inner springs friction ***** */ @@ -56,16 +56,11 @@ variables on the UI for now /* types */ #include "DNA_curve_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" /* here is the softbody struct */ -#include "DNA_key_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" #include "DNA_lattice_types.h" #include "DNA_scene_types.h" -#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_ghash.h" #include "BLI_threads.h" @@ -74,13 +69,9 @@ variables on the UI for now #include "BKE_curve.h" #include "BKE_effect.h" #include "BKE_global.h" -#include "BKE_key.h" -#include "BKE_object.h" #include "BKE_softbody.h" -#include "BKE_utildefines.h" #include "BKE_DerivedMesh.h" #include "BKE_pointcache.h" -#include "BKE_modifier.h" #include "BKE_deform.h" //XXX #include "BIF_editdeform.h" //XXX #include "BIF_graphics.h" @@ -93,7 +84,7 @@ static int (*SB_localInterruptCallBack)(void) = NULL; /* ********** soft body engine ******* */ -typedef enum {SB_EDGE=1,SB_BEND=2,SB_STIFFQUAD=3} type_spring; +typedef enum {SB_EDGE=1,SB_BEND=2,SB_STIFFQUAD=3,SB_HANDLE=4} type_spring; typedef struct BodySpring { int v1, v2; @@ -133,7 +124,7 @@ typedef struct SBScratch { typedef struct SB_thread_context { Scene *scene; - Object *ob; + Object *ob; float forcetime; float timenow; int ifirst; @@ -146,12 +137,12 @@ typedef struct SB_thread_context { int tot; }SB_thread_context; -#define NLF_BUILD 1 -#define NLF_SOLVE 2 +#define NLF_BUILD 1 +#define NLF_SOLVE 2 #define MID_PRESERVE 1 -#define SOFTGOALSNAP 0.999f +#define SOFTGOALSNAP 0.999f /* if bp-> goal is above make it a *forced follow original* and skip all ODE stuff for this bp removes *unnecessary* stiffnes from ODE system */ @@ -159,7 +150,11 @@ typedef struct SB_thread_context { #define BSF_INTERSECT 1 /* edge intersects collider face */ -#define SBF_DOFUZZY 1 /* edge intersects collider face */ + +/* private definitions for bodypoint states */ +#define SBF_DOFUZZY 1 /* Bodypoint do fuzzy */ +#define SBF_OUTOFCOLLISION 2 /* Bodypoint does not collide */ + #define BFF_INTERSECT 1 /* collider edge intrudes face */ #define BFF_CLOSEVERT 2 /* collider vertex repulses face */ @@ -197,15 +192,15 @@ static float sb_time_scale(Object *ob) { SoftBody *sb= ob->soft; /* is supposed to be there */ if (sb){ - return(sb->physics_speed); - /*hrms .. this could be IPO as well :) + return(sb->physics_speed); + /*hrms .. this could be IPO as well :) estimated range [0.001 sluggish slug - 100.0 very fast (i hope ODE solver can handle that)] 1 approx = a unit 1 pendulum at g = 9.8 [earth conditions] has period 65 frames - theory would give a 50 frames period .. so there must be something inaccurate .. looking for that (BM) + theory would give a 50 frames period .. so there must be something inaccurate .. looking for that (BM) */ } return (1.0f); - /* + /* this would be frames/sec independant timing assuming 25 fps is default but does not work very well with NLA return (25.0f/scene->r.frs_sec) @@ -213,19 +208,59 @@ static float sb_time_scale(Object *ob) } /*--- frame based timing ---*/ +/* helper functions for everything is animatable jow_go_for2_5 +++++++*/ +/* introducing them here, because i know: steps in properties ( at frame timing ) + will cause unwanted responses of the softbody system (which does inter frame calculations ) + so first 'cure' would be: interpolate linear in time .. + Q: why do i write this? + A: because it happend once, that some eger coder 'streamlined' code to fail. + We DO linear interpolation for goals .. and i think we should do on animated properties as well +*/ + +/* animate sb->maxgoal,sb->mingoal */ +static float _final_goal(Object *ob,BodyPoint *bp)/*jow_go_for2_5 */ +{ + float f = -1999.99f; + if (ob){ + SoftBody *sb= ob->soft; /* is supposed to be there */ + if(!(ob->softflag & OB_SB_GOAL)) return (0.0f); + if (sb&&bp){ + if (bp->goal < 0.0f) return (0.0f); + f = sb->mingoal + bp->goal*ABS(sb->maxgoal - sb->mingoal); + f = pow(f, 4.0f); + return (f); + } + } + printf("_final_goal failed! sb or bp ==NULL \n" ); + return f; /*using crude but spot able values some times helps debuggin */ +} + +static float _final_mass(Object *ob,BodyPoint *bp) +{ + if (ob){ + SoftBody *sb= ob->soft; /* is supposed to be there */ + if (sb&&bp){ + return(bp->mass*sb->nodemass); + } + } + printf("_final_mass failed! sb or bp ==NULL \n" ); + return 1.0f; +} +/* helper functions for everything is animateble jow_go_for2_5 ------*/ + /*+++ collider caching and dicing +++*/ /******************** for each target object/face the axis aligned bounding box (AABB) is stored -faces paralell to global axes +faces paralell to global axes so only simple "value" in [min,max] ckecks are used float operations still */ /* just an ID here to reduce the prob for killing objects ** ob->sumohandle points to we should not kill :) -*/ -const int CCD_SAVETY = 190561; +*/ +const int CCD_SAVETY = 190561; typedef struct ccdf_minmax{ float minx,miny,minz,maxx,maxy,maxz; @@ -250,16 +285,16 @@ typedef struct ccd_Mesh { static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) { - ccd_Mesh *pccd_M = NULL; + ccd_Mesh *pccd_M = NULL; ccdf_minmax *mima =NULL; MFace *mface=NULL; float v[3],hull; int i; - + /* first some paranoia checks */ if (!dm) return NULL; if (!dm->getNumVerts(dm) || !dm->getNumTessFaces(dm)) return NULL; - + pccd_M = MEM_mallocN(sizeof(ccd_Mesh),"ccd_Mesh"); pccd_M->totvert = dm->getNumVerts(dm); pccd_M->totface = dm->getNumTessFaces(dm); @@ -267,34 +302,34 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f; pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f; pccd_M->mprevvert=NULL; - - - /* blow it up with forcefield ranges */ + + + /* blow it up with forcefield ranges */ hull = MAX2(ob->pd->pdef_sbift,ob->pd->pdef_sboft); - + /* alloc and copy verts*/ pccd_M->mvert = dm->dupVertArray(dm); - /* ah yeah, put the verices to global coords once */ - /* and determine the ortho BB on the fly */ + /* ah yeah, put the verices to global coords once */ + /* and determine the ortho BB on the fly */ for(i=0; i < pccd_M->totvert; i++){ mul_m4_v3(ob->obmat, pccd_M->mvert[i].co); - - /* evaluate limits */ + + /* evaluate limits */ VECCOPY(v,pccd_M->mvert[i].co); pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull); pccd_M->bbmin[1] = MIN2(pccd_M->bbmin[1],v[1]-hull); pccd_M->bbmin[2] = MIN2(pccd_M->bbmin[2],v[2]-hull); - + pccd_M->bbmax[0] = MAX2(pccd_M->bbmax[0],v[0]+hull); pccd_M->bbmax[1] = MAX2(pccd_M->bbmax[1],v[1]+hull); pccd_M->bbmax[2] = MAX2(pccd_M->bbmax[2],v[2]+hull); - + } /* alloc and copy faces*/ pccd_M->mface = dm->dupTessFaceArray(dm); - + /* OBBs for idea1 */ - pccd_M->mima = MEM_mallocN(sizeof(ccdf_minmax)*pccd_M->totface,"ccd_Mesh_Faces_mima"); + pccd_M->mima = MEM_mallocN(sizeof(ccdf_minmax)*pccd_M->totface,"ccd_Mesh_Faces_mima"); mima = pccd_M->mima; mface = pccd_M->mface; @@ -303,23 +338,23 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) for(i=0; i < pccd_M->totface; i++){ mima->minx=mima->miny=mima->minz=1e30f; mima->maxx=mima->maxy=mima->maxz=-1e30f; - - VECCOPY(v,pccd_M->mvert[mface->v1].co); + + VECCOPY(v,pccd_M->mvert[mface->v1].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); mima->minz = MIN2(mima->minz,v[2]-hull); mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - - VECCOPY(v,pccd_M->mvert[mface->v2].co); + + VECCOPY(v,pccd_M->mvert[mface->v2].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); mima->minz = MIN2(mima->minz,v[2]-hull); mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - + VECCOPY(v,pccd_M->mvert[mface->v3].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); @@ -327,7 +362,7 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - + if(mface->v4){ VECCOPY(v,pccd_M->mvert[mface->v4].co); mima->minx = MIN2(mima->minx,v[0]-hull); @@ -338,20 +373,20 @@ static ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm) mima->maxz = MAX2(mima->maxz,v[2]+hull); } - + mima++; mface++; - + } return pccd_M; } static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) { - ccdf_minmax *mima =NULL; + ccdf_minmax *mima =NULL; MFace *mface=NULL; float v[3],hull; int i; - + /* first some paranoia checks */ if (!dm) return ; if (!dm->getNumVerts(dm) || !dm->getNumTessFaces(dm)) return ; @@ -361,43 +396,43 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f; pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f; - - - /* blow it up with forcefield ranges */ + + + /* blow it up with forcefield ranges */ hull = MAX2(ob->pd->pdef_sbift,ob->pd->pdef_sboft); - + /* rotate current to previous */ if(pccd_M->mprevvert) MEM_freeN(pccd_M->mprevvert); - pccd_M->mprevvert = pccd_M->mvert; + pccd_M->mprevvert = pccd_M->mvert; /* alloc and copy verts*/ - pccd_M->mvert = dm->dupVertArray(dm); - /* ah yeah, put the verices to global coords once */ - /* and determine the ortho BB on the fly */ + pccd_M->mvert = dm->dupVertArray(dm); + /* ah yeah, put the verices to global coords once */ + /* and determine the ortho BB on the fly */ for(i=0; i < pccd_M->totvert; i++){ mul_m4_v3(ob->obmat, pccd_M->mvert[i].co); - - /* evaluate limits */ + + /* evaluate limits */ VECCOPY(v,pccd_M->mvert[i].co); pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull); pccd_M->bbmin[1] = MIN2(pccd_M->bbmin[1],v[1]-hull); pccd_M->bbmin[2] = MIN2(pccd_M->bbmin[2],v[2]-hull); - + pccd_M->bbmax[0] = MAX2(pccd_M->bbmax[0],v[0]+hull); pccd_M->bbmax[1] = MAX2(pccd_M->bbmax[1],v[1]+hull); pccd_M->bbmax[2] = MAX2(pccd_M->bbmax[2],v[2]+hull); - /* evaluate limits */ + /* evaluate limits */ VECCOPY(v,pccd_M->mprevvert[i].co); pccd_M->bbmin[0] = MIN2(pccd_M->bbmin[0],v[0]-hull); pccd_M->bbmin[1] = MIN2(pccd_M->bbmin[1],v[1]-hull); pccd_M->bbmin[2] = MIN2(pccd_M->bbmin[2],v[2]-hull); - + pccd_M->bbmax[0] = MAX2(pccd_M->bbmax[0],v[0]+hull); pccd_M->bbmax[1] = MAX2(pccd_M->bbmax[1],v[1]+hull); pccd_M->bbmax[2] = MAX2(pccd_M->bbmax[2],v[2]+hull); - + } - + mima = pccd_M->mima; mface = pccd_M->mface; @@ -406,23 +441,23 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) for(i=0; i < pccd_M->totface; i++){ mima->minx=mima->miny=mima->minz=1e30f; mima->maxx=mima->maxy=mima->maxz=-1e30f; - - VECCOPY(v,pccd_M->mvert[mface->v1].co); + + VECCOPY(v,pccd_M->mvert[mface->v1].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); mima->minz = MIN2(mima->minz,v[2]-hull); mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - - VECCOPY(v,pccd_M->mvert[mface->v2].co); + + VECCOPY(v,pccd_M->mvert[mface->v2].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); mima->minz = MIN2(mima->minz,v[2]-hull); mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - + VECCOPY(v,pccd_M->mvert[mface->v3].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); @@ -430,7 +465,7 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - + if(mface->v4){ VECCOPY(v,pccd_M->mvert[mface->v4].co); mima->minx = MIN2(mima->minx,v[0]-hull); @@ -442,22 +477,22 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) } - VECCOPY(v,pccd_M->mprevvert[mface->v1].co); + VECCOPY(v,pccd_M->mprevvert[mface->v1].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); mima->minz = MIN2(mima->minz,v[2]-hull); mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - - VECCOPY(v,pccd_M->mprevvert[mface->v2].co); + + VECCOPY(v,pccd_M->mprevvert[mface->v2].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); mima->minz = MIN2(mima->minz,v[2]-hull); mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - + VECCOPY(v,pccd_M->mprevvert[mface->v3].co); mima->minx = MIN2(mima->minx,v[0]-hull); mima->miny = MIN2(mima->miny,v[1]-hull); @@ -465,7 +500,7 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) mima->maxx = MAX2(mima->maxx,v[0]+hull); mima->maxy = MAX2(mima->maxy,v[1]+hull); mima->maxz = MAX2(mima->maxz,v[2]+hull); - + if(mface->v4){ VECCOPY(v,pccd_M->mprevvert[mface->v4].co); mima->minx = MIN2(mima->minx,v[0]-hull); @@ -476,10 +511,10 @@ static void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm) mima->maxz = MAX2(mima->maxz,v[2]+hull); } - + mima++; mface++; - + } return ; } @@ -507,7 +542,7 @@ static void ccd_build_deflector_hash(Scene *scene, Object *vertexowner, GHash *h if(base->object->type==OB_MESH && (base->lay & vertexowner->lay)) { ob= base->object; if((vertexowner) && (ob == vertexowner)) { - /* if vertexowner is given we don't want to check collision with owner object */ + /* if vertexowner is given we don't want to check collision with owner object */ base = base->next; continue; } @@ -527,11 +562,11 @@ static void ccd_build_deflector_hash(Scene *scene, Object *vertexowner, GHash *h /* we did copy & modify all we need so give 'em away again */ dm->release(dm); - + } }/*--- only with deflecting set */ - }/* mesh && layer*/ + }/* mesh && layer*/ base = base->next; } /* while (base) */ } @@ -546,16 +581,16 @@ static void ccd_update_deflector_hash(Scene *scene, Object *vertexowner, GHash * /*Only proceed for mesh object in same layer */ if(base->object->type==OB_MESH && (base->lay & vertexowner->lay)) { ob= base->object; - if(ob == vertexowner){ - /* if vertexowner is given we don't want to check collision with owner object */ + if(ob == vertexowner){ + /* if vertexowner is given we don't want to check collision with owner object */ base = base->next; - continue; + continue; } /*+++ only with deflecting set */ if(ob->pd && ob->pd->deflect) { DerivedMesh *dm= NULL; - + if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */ dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); } else { @@ -571,7 +606,7 @@ static void ccd_update_deflector_hash(Scene *scene, Object *vertexowner, GHash * } }/*--- only with deflecting set */ - }/* mesh && layer*/ + }/* mesh && layer*/ base = base->next; } /* while (base) */ } @@ -586,12 +621,12 @@ static int count_mesh_quads(Mesh *me) { int a,result = 0; MFace *mface= me->mface; - + if(mface) { for(a=me->totface; a>0; a--, mface++) { if(mface->v4) result++; } - } + } return result; } @@ -602,21 +637,21 @@ static void add_mesh_quad_diag_springs(Object *ob) BodyPoint *bp; BodySpring *bs, *bs_new; int a ; - + if (ob->soft){ int nofquads; //float s_shear = ob->soft->shearstiff*ob->soft->shearstiff; - + nofquads = count_mesh_quads(me); if (nofquads) { /* resize spring-array to hold additional quad springs */ bs_new= MEM_callocN( (ob->soft->totspring + nofquads *2 )*sizeof(BodySpring), "bodyspring"); memcpy(bs_new,ob->soft->bspring,(ob->soft->totspring )*sizeof(BodySpring)); - + if(ob->soft->bspring) MEM_freeN(ob->soft->bspring); /* do this before reassigning the pointer or have a 1st class memory leak */ - ob->soft->bspring = bs_new; - + ob->soft->bspring = bs_new; + /* fill the tail */ a = 0; bs = bs_new+ob->soft->totspring; @@ -632,12 +667,12 @@ static void add_mesh_quad_diag_springs(Object *ob) bs->v2= mface->v4; bs->springtype =SB_STIFFQUAD; bs++; - + } - } + } } - - /* now we can announce new springs */ + + /* now we can announce new springs */ ob->soft->totspring += nofquads *2; } } @@ -647,7 +682,7 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad { /*assume we have a softbody*/ SoftBody *sb= ob->soft; /* is supposed to be there */ - BodyPoint *bp,*bpo; + BodyPoint *bp,*bpo; BodySpring *bs,*bs2,*bs3= NULL; int a,b,c,notthis= 0,v0; if (!sb->bspring){return;} /* we are 2nd order here so 1rst should have been build :) */ @@ -662,7 +697,7 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad bs = sb->bspring + bp->springs[b-1]; /*nasty thing here that springs have two ends so here we have to make sure we examine the other */ - if (( v0 == bs->v1) ){ + if (( v0 == bs->v1) ){ bpo =sb->bpoint+bs->v2; notthis = bs->v2; } @@ -670,10 +705,10 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad if (( v0 == bs->v2) ){ bpo =sb->bpoint+bs->v1; notthis = bs->v1; - } + } else {printf("oops we should not get here - add_2nd_order_springs");} } - if (bpo){/* so now we have a 2nd order humpdidump */ + if (bpo){/* so now we have a 2nd order humpdidump */ for(c=bpo->nofsprings;c>0;c--){ bs2 = sb->bspring + bpo->springs[c-1]; if ((bs2->v1 != notthis) && (bs2->v1 > v0)){ @@ -681,7 +716,7 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad if (addsprings){ bs3->v1= v0; bs3->v2= bs2->v1; - bs3->springtype =SB_BEND; + bs3->springtype =SB_BEND; bs3++; } } @@ -690,15 +725,15 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad if (addsprings){ bs3->v1= v0; bs3->v2= bs2->v2; - bs3->springtype =SB_BEND; + bs3->springtype =SB_BEND; bs3++; } } } - + } - + } /*scan for neighborhood done*/ } @@ -710,17 +745,17 @@ static void add_2nd_order_springs(Object *ob,float stiffness) int counter = 0; BodySpring *bs_new; stiffness *=stiffness; - + add_2nd_order_roller(ob,stiffness,&counter,0); /* counting */ if (counter) { /* resize spring-array to hold additional springs */ bs_new= MEM_callocN( (ob->soft->totspring + counter )*sizeof(BodySpring), "bodyspring"); memcpy(bs_new,ob->soft->bspring,(ob->soft->totspring )*sizeof(BodySpring)); - + if(ob->soft->bspring) - MEM_freeN(ob->soft->bspring); - ob->soft->bspring = bs_new; - + MEM_freeN(ob->soft->bspring); + ob->soft->bspring = bs_new; + add_2nd_order_roller(ob,stiffness,&counter,1); /* adding */ ob->soft->totspring +=counter ; } @@ -729,7 +764,7 @@ static void add_2nd_order_springs(Object *ob,float stiffness) static void add_bp_springlist(BodyPoint *bp,int springID) { int *newlist; - + if (bp->springs == NULL) { bp->springs = MEM_callocN( sizeof(int), "bpsprings"); bp->springs[0] = springID; @@ -751,35 +786,35 @@ it is O(N^2) so scanning for springs every iteration is too expensive static void build_bps_springlist(Object *ob) { SoftBody *sb= ob->soft; /* is supposed to be there */ - BodyPoint *bp; - BodySpring *bs; + BodyPoint *bp; + BodySpring *bs; int a,b; - + if (sb==NULL) return; /* paranoya check */ - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { /* throw away old list */ if (bp->springs) { MEM_freeN(bp->springs); bp->springs=NULL; } - /* scan for attached inner springs */ + /* scan for attached inner springs */ for(b=sb->totspring, bs= sb->bspring; b>0; b--, bs++) { - if (( (sb->totpoint-a) == bs->v1) ){ + if (( (sb->totpoint-a) == bs->v1) ){ add_bp_springlist(bp,sb->totspring -b); } - if (( (sb->totpoint-a) == bs->v2) ){ + if (( (sb->totpoint-a) == bs->v2) ){ add_bp_springlist(bp,sb->totspring -b); } }/*for springs*/ - }/*for bp*/ + }/*for bp*/ } static void calculate_collision_balls(Object *ob) { SoftBody *sb= ob->soft; /* is supposed to be there */ - BodyPoint *bp; - BodySpring *bs; + BodyPoint *bp; + BodySpring *bs; int a,b,akku_count; float min,max,akku; @@ -820,12 +855,12 @@ static void calculate_collision_balls(Object *ob) } } else bp->colball=0; - }/*for bp*/ + }/*for bp*/ } /* creates new softbody if didn't exist yet, makes new points and springs arrays */ -static void renew_softbody(Scene *scene, Object *ob, int totpoint, int totspring) +static void renew_softbody(Scene *scene, Object *ob, int totpoint, int totspring) { SoftBody *sb; int i; @@ -834,36 +869,40 @@ static void renew_softbody(Scene *scene, Object *ob, int totpoint, int totspring else free_softbody_intern(ob->soft); sb= ob->soft; softflag=ob->softflag; - + if(totpoint) { sb->totpoint= totpoint; sb->totspring= totspring; - + sb->bpoint= MEM_mallocN( totpoint*sizeof(BodyPoint), "bodypoint"); - if(totspring) + if(totspring) sb->bspring= MEM_mallocN( totspring*sizeof(BodySpring), "bodyspring"); /* initialise BodyPoint array */ for (i=0; i<totpoint; i++) { BodyPoint *bp = &sb->bpoint[i]; + + /* hum as far as i see this is overridden by _final_goal() now jow_go_for2_5 */ + /* sadly breaks compatibility with older versions */ + /* but makes goals behave the same for meshes, lattices and curves */ if(softflag & OB_SB_GOAL) { bp->goal= sb->defgoal; } - else { - bp->goal= 0.0f; + else { + bp->goal= 0.0f; /* so this will definily be below SOFTGOALSNAP */ } - + bp->nofsprings= 0; bp->springs= NULL; bp->choke = 0.0f; bp->choke2 = 0.0f; bp->frozen = 1.0f; bp->colball = 0.0f; - bp->flag = 0; + bp->loc_flag = 0; bp->springweight = 1.0f; - bp->mass = sb->nodemass; + bp->mass = 1.0f; } } } @@ -878,7 +917,7 @@ static void free_softbody_baked(SoftBody *sb) if(key) MEM_freeN(key); } if(sb->keys) MEM_freeN(sb->keys); - + sb->keys= NULL; sb->totkey= 0; } @@ -900,7 +939,7 @@ static void free_scratch(SoftBody *sb) MEM_freeN(sb->scratch); sb->scratch = NULL; } - + } /* only frees internal data */ @@ -909,19 +948,19 @@ static void free_softbody_intern(SoftBody *sb) if(sb) { int a; BodyPoint *bp; - + if(sb->bpoint){ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { - /* free spring list */ + /* free spring list */ if (bp->springs != NULL) { MEM_freeN(bp->springs); } } MEM_freeN(sb->bpoint); } - + if(sb->bspring) MEM_freeN(sb->bspring); - + sb->totpoint= sb->totspring= 0; sb->bpoint= NULL; sb->bspring= NULL; @@ -934,28 +973,28 @@ static void free_softbody_intern(SoftBody *sb) /* ************ dynamics ********** */ -/* the most general (micro physics correct) way to do collision -** (only needs the current particle position) +/* the most general (micro physics correct) way to do collision +** (only needs the current particle position) ** -** it actually checks if the particle intrudes a short range force field generated +** it actually checks if the particle intrudes a short range force field generated ** by the faces of the target object and returns a force to drive the particel out ** the strenght of the field grows exponetially if the particle is on the 'wrong' side of the face ** 'wrong' side : projection to the face normal is negative (all referred to a vertex in the face) ** -** flaw of this: 'fast' particles as well as 'fast' colliding faces -** give a 'tunnel' effect such that the particle passes through the force field -** without ever 'seeing' it +** flaw of this: 'fast' particles as well as 'fast' colliding faces +** give a 'tunnel' effect such that the particle passes through the force field +** without ever 'seeing' it ** this is fully compliant to heisenberg: h >= fuzzy(location) * fuzzy(time) ** besides our h is way larger than in QM because forces propagate way slower here ** we have to deal with fuzzy(time) in the range of 1/25 seconds (typical frame rate) -** yup collision targets are not known here any better +** yup collision targets are not known here any better ** and 1/25 second is looong compared to real collision events -** Q: why not use 'simple' collision here like bouncing back a particle +** Q: why not use 'simple' collision here like bouncing back a particle ** --> reverting is velocity on the face normal -** A: because our particles are not alone here -** and need to tell their neighbours exactly what happens via spring forces +** A: because our particles are not alone here +** and need to tell their neighbours exactly what happens via spring forces ** unless sbObjectStep( .. ) is called on sub frame timing level -** BTW that also questions the use of a 'implicit' solvers on softbodies +** BTW that also questions the use of a 'implicit' solvers on softbodies ** since that would only valid for 'slow' moving collision targets and dito particles */ @@ -972,10 +1011,10 @@ static void Vec3PlusStVec(float *v, float s, float *v1) static int are_there_deflectors(Scene *scene, unsigned int layer) { Base *base; - + for(base = scene->base.first; base; base= base->next) { if( (base->lay & layer) && base->object->pd) { - if(base->object->pd->deflect) + if(base->object->pd->deflect) return 1; } } @@ -1005,7 +1044,7 @@ static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_laye hash = vertexowner->soft->scratch->colliderhash; ihash = BLI_ghashIterator_new(hash); - while (!BLI_ghashIterator_isDone(ihash) ) { + while (!BLI_ghashIterator_isDone(ihash) ) { ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash); ob = BLI_ghashIterator_getKey (ihash); @@ -1021,20 +1060,20 @@ static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_laye mprevvert= ccdm->mprevvert; mima= ccdm->mima; a = ccdm->totface; - - if ((aabbmax[0] < ccdm->bbmin[0]) || + + if ((aabbmax[0] < ccdm->bbmin[0]) || (aabbmax[1] < ccdm->bbmin[1]) || (aabbmax[2] < ccdm->bbmin[2]) || - (aabbmin[0] > ccdm->bbmax[0]) || - (aabbmin[1] > ccdm->bbmax[1]) || + (aabbmin[0] > ccdm->bbmax[0]) || + (aabbmin[1] > ccdm->bbmax[1]) || (aabbmin[2] > ccdm->bbmax[2]) ) { - /* boxes dont intersect */ + /* boxes dont intersect */ BLI_ghashIterator_step(ihash); - continue; - } + continue; + } /* so now we have the 2 boxes overlapping */ - /* forces actually not used */ + /* forces actually not used */ deflected = 2; } @@ -1042,19 +1081,19 @@ static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_laye /*aye that should be cached*/ printf("missing cache error \n"); BLI_ghashIterator_step(ihash); - continue; + continue; } } /* if(ob->pd && ob->pd->deflect) */ BLI_ghashIterator_step(ihash); } /* while () */ BLI_ghashIterator_free(ihash); - return deflected; + return deflected; } /* --- the aabb section*/ /* +++ the face external section*/ -static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp, +static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp, float force[3], unsigned int par_layer,struct Object *vertexowner,float time) { Object *ob; @@ -1080,7 +1119,7 @@ static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float fa hash = vertexowner->soft->scratch->colliderhash; ihash = BLI_ghashIterator_new(hash); - while (!BLI_ghashIterator_isDone(ihash) ) { + while (!BLI_ghashIterator_isDone(ihash) ) { ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash); ob = BLI_ghashIterator_getKey (ihash); @@ -1090,33 +1129,33 @@ static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float fa MVert *mprevvert= NULL; if(ccdm){ mvert= ccdm->mvert; - a = ccdm->totvert; - mprevvert= ccdm->mprevvert; + a = ccdm->totvert; + mprevvert= ccdm->mprevvert; outerfacethickness =ob->pd->pdef_sboft; - if ((aabbmax[0] < ccdm->bbmin[0]) || + if ((aabbmax[0] < ccdm->bbmin[0]) || (aabbmax[1] < ccdm->bbmin[1]) || (aabbmax[2] < ccdm->bbmin[2]) || - (aabbmin[0] > ccdm->bbmax[0]) || - (aabbmin[1] > ccdm->bbmax[1]) || + (aabbmin[0] > ccdm->bbmax[0]) || + (aabbmin[1] > ccdm->bbmax[1]) || (aabbmin[2] > ccdm->bbmax[2]) ) { - /* boxes dont intersect */ + /* boxes dont intersect */ BLI_ghashIterator_step(ihash); - continue; - } + continue; + } } else{ /*aye that should be cached*/ printf("missing cache error \n"); BLI_ghashIterator_step(ihash); - continue; + continue; } /* use mesh*/ if (mvert) { while(a){ - VECCOPY(nv1,mvert[a-1].co); + VECCOPY(nv1,mvert[a-1].co); if(mprevvert){ mul_v3_fl(nv1,time); Vec3PlusStVec(nv1,(1.0f-time),mprevvert[a-1].co); @@ -1148,11 +1187,11 @@ static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float fa BLI_ghashIterator_step(ihash); } /* while () */ BLI_ghashIterator_free(ihash); - return deflected; + return deflected; } -static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp, +static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp, float force[3], unsigned int par_layer,struct Object *vertexowner,float time) { Object *ob; @@ -1171,7 +1210,7 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa hash = vertexowner->soft->scratch->colliderhash; ihash = BLI_ghashIterator_new(hash); - while (!BLI_ghashIterator_isDone(ihash) ) { + while (!BLI_ghashIterator_isDone(ihash) ) { ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash); ob = BLI_ghashIterator_getKey (ihash); @@ -1187,36 +1226,36 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa mprevvert= ccdm->mprevvert; mima= ccdm->mima; a = ccdm->totface; - - if ((aabbmax[0] < ccdm->bbmin[0]) || + + if ((aabbmax[0] < ccdm->bbmin[0]) || (aabbmax[1] < ccdm->bbmin[1]) || (aabbmax[2] < ccdm->bbmin[2]) || - (aabbmin[0] > ccdm->bbmax[0]) || - (aabbmin[1] > ccdm->bbmax[1]) || + (aabbmin[0] > ccdm->bbmax[0]) || + (aabbmin[1] > ccdm->bbmax[1]) || (aabbmin[2] > ccdm->bbmax[2]) ) { - /* boxes dont intersect */ + /* boxes dont intersect */ BLI_ghashIterator_step(ihash); - continue; - } + continue; + } } else{ /*aye that should be cached*/ printf("missing cache error \n"); BLI_ghashIterator_step(ihash); - continue; + continue; } /* use mesh*/ while (a--) { if ( - (aabbmax[0] < mima->minx) || - (aabbmin[0] > mima->maxx) || + (aabbmax[0] < mima->minx) || + (aabbmin[0] > mima->maxx) || (aabbmax[1] < mima->miny) || - (aabbmin[1] > mima->maxy) || + (aabbmin[1] > mima->maxy) || (aabbmax[2] < mima->minz) || - (aabbmin[2] > mima->maxz) + (aabbmin[2] > mima->maxz) ) { mface++; mima++; @@ -1226,7 +1265,7 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa if (mvert){ - VECCOPY(nv1,mvert[mface->v1].co); + VECCOPY(nv1,mvert[mface->v1].co); VECCOPY(nv2,mvert[mface->v2].co); VECCOPY(nv3,mvert[mface->v3].co); if (mface->v4){ @@ -1235,18 +1274,18 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa if (mprevvert){ mul_v3_fl(nv1,time); Vec3PlusStVec(nv1,(1.0f-time),mprevvert[mface->v1].co); - + mul_v3_fl(nv2,time); Vec3PlusStVec(nv2,(1.0f-time),mprevvert[mface->v2].co); - + mul_v3_fl(nv3,time); Vec3PlusStVec(nv3,(1.0f-time),mprevvert[mface->v3].co); - + if (mface->v4){ mul_v3_fl(nv4,time); Vec3PlusStVec(nv4,(1.0f-time),mprevvert[mface->v4].co); } - } + } } /* switch origin to be nv2*/ @@ -1254,7 +1293,7 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa VECSUB(edge2, nv3, nv2); cross_v3_v3v3(d_nvect, edge2, edge1); normalize_v3(d_nvect); - if ( + if ( isect_line_tri_v3(nv1, nv2, face_v1, face_v2, face_v3, &t, NULL) || isect_line_tri_v3(nv2, nv3, face_v1, face_v2, face_v3, &t, NULL) || isect_line_tri_v3(nv3, nv1, face_v1, face_v2, face_v3, &t, NULL) ){ @@ -1265,10 +1304,10 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa if (mface->v4){ /* quad */ /* switch origin to be nv4 */ VECSUB(edge1, nv3, nv4); - VECSUB(edge2, nv1, nv4); + VECSUB(edge2, nv1, nv4); cross_v3_v3v3(d_nvect, edge2, edge1); - normalize_v3(d_nvect); - if ( + normalize_v3(d_nvect); + if ( /* isect_line_tri_v3(nv1, nv3, face_v1, face_v2, face_v3, &t, NULL) || we did that edge already */ isect_line_tri_v3(nv3, nv4, face_v1, face_v2, face_v3, &t, NULL) || @@ -1279,13 +1318,13 @@ static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],floa } } mface++; - mima++; - }/* while a */ + mima++; + }/* while a */ } /* if(ob->pd && ob->pd->deflect) */ BLI_ghashIterator_step(ihash); } /* while () */ BLI_ghashIterator_free(ihash); - return deflected; + return deflected; } @@ -1295,20 +1334,20 @@ static void scan_for_ext_face_forces(Object *ob,float timenow) SoftBody *sb = ob->soft; BodyFace *bf; int a; - float damp=0.0f,choke=1.0f; + float damp=0.0f,choke=1.0f; float tune = -10.0f; float feedback[3]; - + if (sb && sb->scratch->totface){ - - + + bf = sb->scratch->bodyface; for(a=0; a<sb->scratch->totface; a++, bf++) { - bf->ext_force[0]=bf->ext_force[1]=bf->ext_force[2]=0.0f; + bf->ext_force[0]=bf->ext_force[1]=bf->ext_force[2]=0.0f; /*+++edges intruding*/ - bf->flag &= ~BFF_INTERSECT; + bf->flag &= ~BFF_INTERSECT; feedback[0]=feedback[1]=feedback[2]=0.0f; - if (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos, + if (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos, &damp, feedback, ob->lay ,ob , timenow)){ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback); Vec3PlusStVec(sb->bpoint[bf->v2].force,tune,feedback); @@ -1319,7 +1358,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow) } feedback[0]=feedback[1]=feedback[2]=0.0f; - if ((bf->v4) && (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos, + if ((bf->v4) && (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos, &damp, feedback, ob->lay ,ob , timenow))){ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback); Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback); @@ -1335,7 +1374,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow) bf->flag &= ~BFF_CLOSEVERT; tune = -1.0f; feedback[0]=feedback[1]=feedback[2]=0.0f; - if (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos, + if (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos, &damp, feedback, ob->lay ,ob , timenow)){ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback); Vec3PlusStVec(sb->bpoint[bf->v2].force,tune,feedback); @@ -1346,7 +1385,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow) } feedback[0]=feedback[1]=feedback[2]=0.0f; - if ((bf->v4) && (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos, + if ((bf->v4) && (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos, &damp, feedback, ob->lay ,ob , timenow))){ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback); Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback); @@ -1362,13 +1401,13 @@ static void scan_for_ext_face_forces(Object *ob,float timenow) for(a=0; a<sb->scratch->totface; a++, bf++) { if (( bf->flag & BFF_INTERSECT) || ( bf->flag & BFF_CLOSEVERT)) { - sb->bpoint[bf->v1].choke2=MAX2(sb->bpoint[bf->v1].choke2,choke); - sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke); - sb->bpoint[bf->v3].choke2=MAX2(sb->bpoint[bf->v3].choke2,choke); + sb->bpoint[bf->v1].choke2=MAX2(sb->bpoint[bf->v1].choke2,choke); + sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke); + sb->bpoint[bf->v3].choke2=MAX2(sb->bpoint[bf->v3].choke2,choke); if (bf->v4){ - sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke); + sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke); } - } + } } } } @@ -1378,7 +1417,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow) /* +++ the spring external section*/ -static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp, +static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp, float force[3], unsigned int par_layer,struct Object *vertexowner,float time) { Object *ob; @@ -1399,7 +1438,7 @@ static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],floa hash = vertexowner->soft->scratch->colliderhash; ihash = BLI_ghashIterator_new(hash); - while (!BLI_ghashIterator_isDone(ihash) ) { + while (!BLI_ghashIterator_isDone(ihash) ) { ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash); ob = BLI_ghashIterator_getKey (ihash); @@ -1415,36 +1454,36 @@ static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],floa mprevvert= ccdm->mprevvert; mima= ccdm->mima; a = ccdm->totface; - - if ((aabbmax[0] < ccdm->bbmin[0]) || + + if ((aabbmax[0] < ccdm->bbmin[0]) || (aabbmax[1] < ccdm->bbmin[1]) || (aabbmax[2] < ccdm->bbmin[2]) || - (aabbmin[0] > ccdm->bbmax[0]) || - (aabbmin[1] > ccdm->bbmax[1]) || + (aabbmin[0] > ccdm->bbmax[0]) || + (aabbmin[1] > ccdm->bbmax[1]) || (aabbmin[2] > ccdm->bbmax[2]) ) { - /* boxes dont intersect */ + /* boxes dont intersect */ BLI_ghashIterator_step(ihash); - continue; - } + continue; + } } else{ /*aye that should be cached*/ printf("missing cache error \n"); BLI_ghashIterator_step(ihash); - continue; + continue; } /* use mesh*/ while (a--) { if ( - (aabbmax[0] < mima->minx) || - (aabbmin[0] > mima->maxx) || + (aabbmax[0] < mima->minx) || + (aabbmin[0] > mima->maxx) || (aabbmax[1] < mima->miny) || - (aabbmin[1] > mima->maxy) || + (aabbmin[1] > mima->maxy) || (aabbmax[2] < mima->minz) || - (aabbmin[2] > mima->maxz) + (aabbmin[2] > mima->maxz) ) { mface++; mima++; @@ -1454,7 +1493,7 @@ static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],floa if (mvert){ - VECCOPY(nv1,mvert[mface->v1].co); + VECCOPY(nv1,mvert[mface->v1].co); VECCOPY(nv2,mvert[mface->v2].co); VECCOPY(nv3,mvert[mface->v3].co); if (mface->v4){ @@ -1463,18 +1502,18 @@ static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],floa if (mprevvert){ mul_v3_fl(nv1,time); Vec3PlusStVec(nv1,(1.0f-time),mprevvert[mface->v1].co); - + mul_v3_fl(nv2,time); Vec3PlusStVec(nv2,(1.0f-time),mprevvert[mface->v2].co); - + mul_v3_fl(nv3,time); Vec3PlusStVec(nv3,(1.0f-time),mprevvert[mface->v3].co); - + if (mface->v4){ mul_v3_fl(nv4,time); Vec3PlusStVec(nv4,(1.0f-time),mprevvert[mface->v4].co); } - } + } } /* switch origin to be nv2*/ @@ -1501,7 +1540,7 @@ static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],floa VECSUB(edge2, nv1, nv4); cross_v3_v3v3(d_nvect, edge2, edge1); - normalize_v3(d_nvect); + normalize_v3(d_nvect); if (isect_line_tri_v3( edge_v1, edge_v2,nv1, nv3, nv4, &t, NULL)){ float v1[3],v2[3]; float intrusiondepth,i1,i2; @@ -1518,26 +1557,26 @@ static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],floa } } mface++; - mima++; - }/* while a */ + mima++; + }/* while a */ } /* if(ob->pd && ob->pd->deflect) */ BLI_ghashIterator_step(ihash); } /* while () */ BLI_ghashIterator_free(ihash); - return deflected; + return deflected; } static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, int ifirst, int ilast, struct ListBase *do_effector) { SoftBody *sb = ob->soft; int a; - float damp; + float damp; float feedback[3]; if (sb && sb->totspring){ for(a=ifirst; a<ilast; a++) { BodySpring *bs = &sb->bspring[a]; - bs->ext_force[0]=bs->ext_force[1]=bs->ext_force[2]=0.0f; + bs->ext_force[0]=bs->ext_force[1]=bs->ext_force[2]=0.0f; feedback[0]=feedback[1]=feedback[2]=0.0f; bs->flag &= ~BSF_INTERSECT; @@ -1546,20 +1585,20 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, if (ob->softflag & OB_SB_EDGECOLL){ if ( sb_detect_edge_collisionCached (sb->bpoint[bs->v1].pos , sb->bpoint[bs->v2].pos, &damp,feedback,ob->lay,ob,timenow)){ - add_v3_v3v3(bs->ext_force,bs->ext_force,feedback); + add_v3_v3(bs->ext_force, feedback); bs->flag |= BSF_INTERSECT; //bs->cf=damp; - bs->cf=sb->choke*0.01f; + bs->cf=sb->choke*0.01f; } } /* ---- springs colliding */ /* +++ springs seeing wind ... n stuff depending on their orientation*/ - /* note we don't use sb->mediafrict but use sb->aeroedge for magnitude of effect*/ + /* note we don't use sb->mediafrict but use sb->aeroedge for magnitude of effect*/ if(sb->aeroedge){ float vel[3],sp[3],pr[3],force[3]; - float f,windfactor = 0.25f; + float f,windfactor = 0.25f; /*see if we have wind*/ if(do_effector) { EffectedPoint epoint; @@ -1570,8 +1609,8 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, pd_point_from_soft(scene, pos, vel, -1, &epoint); pdDoEffectors(do_effector, NULL, sb->effector_weights, &epoint, force, speed); - mul_v3_fl(speed,windfactor); - add_v3_v3v3(vel,vel,speed); + mul_v3_fl(speed,windfactor); + add_v3_v3(vel, speed); } /* media in rest */ else{ @@ -1580,7 +1619,7 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, f = normalize_v3(vel); f = -0.0001f*f*f*sb->aeroedge; /* (todo) add a nice angle dependant function done for now BUT */ - /* still there could be some nice drag/lift function, but who needs it */ + /* still there could be some nice drag/lift function, but who needs it */ VECSUB(sp, sb->bpoint[bs->v1].pos , sb->bpoint[bs->v2].pos); project_v3_v3v3(pr,vel,sp); @@ -1590,7 +1629,7 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, normalize_v3(sp); Vec3PlusStVec(bs->ext_force,f*(1.0f-ABS(dot_v3v3(vel,sp))),vel); } - else{ + else{ Vec3PlusStVec(bs->ext_force,f,vel); // to keep compatible with 2.45 release files } } @@ -1604,8 +1643,8 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, static void scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow) { SoftBody *sb = ob->soft; - ListBase *do_effector = NULL; - + ListBase *do_effector = NULL; + do_effector = pdInitEffectors(scene, ob, NULL, sb->effector_weights); if (sb){ _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector); @@ -1618,11 +1657,11 @@ static void *exec_scan_for_ext_spring_forces(void *data) SB_thread_context *pctx = (SB_thread_context*)data; _scan_for_ext_spring_forces(pctx->scene, pctx->ob, pctx->timenow, pctx->ifirst, pctx->ilast, pctx->do_effector); return 0; -} +} static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow,int totsprings,int *ptr_to_break_func()) { - ListBase *do_effector = NULL; + ListBase *do_effector = NULL; ListBase threads; SB_thread_context *sb_threads; int i, totthread,left,dec; @@ -1646,18 +1685,18 @@ static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow, dec = totsprings/totthread +1; for(i=0; i<totthread; i++) { sb_threads[i].scene = scene; - sb_threads[i].ob = ob; - sb_threads[i].forcetime = 0.0; // not used here - sb_threads[i].timenow = timenow; - sb_threads[i].ilast = left; + sb_threads[i].ob = ob; + sb_threads[i].forcetime = 0.0; // not used here + sb_threads[i].timenow = timenow; + sb_threads[i].ilast = left; left = left - dec; if (left >0){ sb_threads[i].ifirst = left; } else - sb_threads[i].ifirst = 0; - sb_threads[i].do_effector = do_effector; - sb_threads[i].do_deflector = 0;// not used here + sb_threads[i].ifirst = 0; + sb_threads[i].do_effector = do_effector; + sb_threads[i].do_deflector = 0;// not used here sb_threads[i].fieldfactor = 0.0f;// not used here sb_threads[i].windfactor = 0.0f;// not used here sb_threads[i].nr= i; @@ -1673,9 +1712,9 @@ static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow, } else exec_scan_for_ext_spring_forces(&sb_threads[0]); - /* clean up */ + /* clean up */ MEM_freeN(sb_threads); - + pdEndEffectors(&do_effector); } @@ -1688,7 +1727,7 @@ static int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,fl int winner =1; mindist = ABS(dot_v3v3(pos,a)); - cp = ABS(dot_v3v3(pos,b)); + cp = ABS(dot_v3v3(pos,b)); if ( mindist < cp ){ mindist = cp; winner =2; @@ -1699,10 +1738,10 @@ static int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,fl mindist = cp; winner =3; } - switch (winner){ - case 1: VECCOPY(w,ca); break; - case 2: VECCOPY(w,cb); break; - case 3: VECCOPY(w,cc); + switch (winner){ + case 1: VECCOPY(w,ca); break; + case 2: VECCOPY(w,cb); break; + case 3: VECCOPY(w,cc); } return(winner); } @@ -1717,7 +1756,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], GHash *hash; GHashIterator *ihash; float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3],d_nvect[3], dv1[3],ve[3],avel[3]={0.0,0.0,0.0}, - vv1[3], vv2[3], vv3[3], vv4[3], coledge[3]={0.0f, 0.0f, 0.0f}, mindistedge = 1000.0f, + vv1[3], vv2[3], vv3[3], vv4[3], coledge[3]={0.0f, 0.0f, 0.0f}, mindistedge = 1000.0f, outerforceaccu[3],innerforceaccu[3], facedist,n_mag,force_mag_norm,minx,miny,minz,maxx,maxy,maxz, innerfacethickness = -0.5f, outerfacethickness = 0.2f, @@ -1730,7 +1769,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], outerforceaccu[0]=outerforceaccu[1]=outerforceaccu[2]=0.0f; innerforceaccu[0]=innerforceaccu[1]=innerforceaccu[2]=0.0f; /* go */ - while (!BLI_ghashIterator_isDone(ihash) ) { + while (!BLI_ghashIterator_isDone(ihash) ) { ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash); ob = BLI_ghashIterator_getKey (ihash); @@ -1748,30 +1787,30 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], mima= ccdm->mima; a = ccdm->totface; - minx =ccdm->bbmin[0]; - miny =ccdm->bbmin[1]; + minx =ccdm->bbmin[0]; + miny =ccdm->bbmin[1]; minz =ccdm->bbmin[2]; - maxx =ccdm->bbmax[0]; - maxy =ccdm->bbmax[1]; - maxz =ccdm->bbmax[2]; + maxx =ccdm->bbmax[0]; + maxy =ccdm->bbmax[1]; + maxz =ccdm->bbmax[2]; - if ((opco[0] < minx) || + if ((opco[0] < minx) || (opco[1] < miny) || (opco[2] < minz) || - (opco[0] > maxx) || - (opco[1] > maxy) || + (opco[0] > maxx) || + (opco[1] > maxy) || (opco[2] > maxz) ) { - /* outside the padded boundbox --> collision object is too far away */ + /* outside the padded boundbox --> collision object is too far away */ BLI_ghashIterator_step(ihash); - continue; - } + continue; + } } else{ /*aye that should be cached*/ printf("missing cache error \n"); BLI_ghashIterator_step(ihash); - continue; + continue; } /* do object level stuff */ @@ -1781,16 +1820,16 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], fa = (ff*outerfacethickness-outerfacethickness); fa *= fa; fa = 1.0f/fa; - avel[0]=avel[1]=avel[2]=0.0f; + avel[0]=avel[1]=avel[2]=0.0f; /* use mesh*/ while (a--) { if ( - (opco[0] < mima->minx) || - (opco[0] > mima->maxx) || + (opco[0] < mima->minx) || + (opco[0] > mima->maxx) || (opco[1] < mima->miny) || - (opco[1] > mima->maxy) || + (opco[1] > mima->maxy) || (opco[2] < mima->minz) || - (opco[2] > mima->maxz) + (opco[2] > mima->maxz) ) { mface++; mima++; @@ -1799,7 +1838,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], if (mvert){ - VECCOPY(nv1,mvert[mface->v1].co); + VECCOPY(nv1,mvert[mface->v1].co); VECCOPY(nv2,mvert[mface->v2].co); VECCOPY(nv3,mvert[mface->v3].co); if (mface->v4){ @@ -1808,7 +1847,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], if (mprevvert){ /* grab the average speed of the collider vertices - before we spoil nvX + before we spoil nvX humm could be done once a SB steps but then we' need to store that too since the AABB reduced propabitlty to get here drasticallly it might be a nice tradeof CPU <--> memory @@ -1833,9 +1872,9 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], mul_v3_fl(nv4,time); Vec3PlusStVec(nv4,(1.0f-time),mprevvert[mface->v4].co); } - } + } } - + /* switch origin to be nv2*/ VECSUB(edge1, nv1, nv2); VECSUB(edge2, nv3, nv2); @@ -1847,7 +1886,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], // so rules are // - if ((facedist > innerfacethickness) && (facedist < outerfacethickness)){ + if ((facedist > innerfacethickness) && (facedist < outerfacethickness)){ if (isect_point_tri_prism_v3(opco, nv1, nv2, nv3) ){ force_mag_norm =(float)exp(-ee*facedist); if (facedist > outerfacethickness*ff) @@ -1871,7 +1910,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], *intrusion += facedist; ci++; } - } + } if (mface->v4){ /* quad */ /* switch origin to be nv4 */ VECSUB(edge1, nv3, nv4); @@ -1904,7 +1943,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], VECADD(avel,avel,ve); cavel ++; } - *intrusion += facedist; + *intrusion += facedist; ci++; } @@ -1914,7 +1953,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float dist; closest_to_line_segment_v3(ve, opco, nv1, nv2); - VECSUB(ve,opco,ve); + VECSUB(ve,opco,ve); dist = normalize_v3(ve); if ((dist < outerfacethickness)&&(dist < mindistedge )){ VECCOPY(coledge,ve); @@ -1923,7 +1962,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], } closest_to_line_segment_v3(ve, opco, nv2, nv3); - VECSUB(ve,opco,ve); + VECSUB(ve,opco,ve); dist = normalize_v3(ve); if ((dist < outerfacethickness)&&(dist < mindistedge )){ VECCOPY(coledge,ve); @@ -1932,7 +1971,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], } closest_to_line_segment_v3(ve, opco, nv3, nv1); - VECSUB(ve,opco,ve); + VECSUB(ve,opco,ve); dist = normalize_v3(ve); if ((dist < outerfacethickness)&&(dist < mindistedge )){ VECCOPY(coledge,ve); @@ -1941,7 +1980,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], } if (mface->v4){ /* quad */ closest_to_line_segment_v3(ve, opco, nv3, nv4); - VECSUB(ve,opco,ve); + VECSUB(ve,opco,ve); dist = normalize_v3(ve); if ((dist < outerfacethickness)&&(dist < mindistedge )){ VECCOPY(coledge,ve); @@ -1950,22 +1989,22 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], } closest_to_line_segment_v3(ve, opco, nv1, nv4); - VECSUB(ve,opco,ve); + VECSUB(ve,opco,ve); dist = normalize_v3(ve); if ((dist < outerfacethickness)&&(dist < mindistedge )){ VECCOPY(coledge,ve); mindistedge = dist, deflected=1; } - + } } } mface++; - mima++; - }/* while a */ + mima++; + }/* while a */ } /* if(ob->pd && ob->pd->deflect) */ BLI_ghashIterator_step(ihash); } /* while () */ @@ -1992,11 +2031,11 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], if (cavel) mul_v3_fl(avel,1.0f/(float)cavel); VECCOPY(vel,avel); if (ci) *intrusion /= ci; - if (deflected){ + if (deflected){ VECCOPY(facenormal,force); normalize_v3(facenormal); } - return deflected; + return deflected; } @@ -2004,7 +2043,7 @@ static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], static int sb_deflect_face(Object *ob,float *actpos,float *facenormal,float *force,float *cf,float time,float *vel,float *intrusion) { float s_actpos[3]; - int deflected; + int deflected; VECCOPY(s_actpos,actpos); deflected= sb_detect_vertex_collisionCached(s_actpos, facenormal, cf, force , ob->lay, ob,time,vel,intrusion); //deflected= sb_detect_vertex_collisionCachedEx(s_actpos, facenormal, cf, force , ob->lay, ob,time,vel,intrusion); @@ -2013,7 +2052,7 @@ static int sb_deflect_face(Object *ob,float *actpos,float *facenormal,float *for /* hiding this for now .. but the jacobian may pop up on other tasks .. so i'd like to keep it static void dfdx_spring(int ia, int ic, int op, float dir[3],float L,float len,float factor) -{ +{ float m,delta_ij; int i ,j; if (L < len){ @@ -2035,13 +2074,13 @@ static void dfdx_spring(int ia, int ic, int op, float dir[3],float L,float len,f static void dfdx_goal(int ia, int ic, int op, float factor) -{ +{ int i; for(i=0;i<3;i++) nlMatrixAdd(ia+i,op+ic+i,factor); } static void dfdv_goal(int ia, int ic,float factor) -{ +{ int i; for(i=0;i<3;i++) nlMatrixAdd(ia+i,ic+i,factor); } @@ -2091,13 +2130,14 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo kw = kw * kw; switch (bs->springtype){ case SB_EDGE: - forcefactor *= kw; + case SB_HANDLE: + forcefactor *= kw; break; case SB_BEND: - forcefactor *=sb->secondspring*kw; + forcefactor *=sb->secondspring*kw; break; case SB_STIFFQUAD: - forcefactor *=sb->shearstiff*sb->shearstiff* kw; + forcefactor *=sb->shearstiff*sb->shearstiff* kw; break; default: break; @@ -2119,12 +2159,12 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo //int op =3*sb->totpoint; //float mvel = -forcetime*kd; //float mpos = -forcetime*forcefactor; - /* depending on my pos */ + /* depending on my pos */ // dfdx_spring(ia,ia,op,dir,bs->len,distance,-mpos); /* depending on my vel */ // dfdv_goal(ia,ia,mvel); // well that ignores geometie if(bp2->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */ - /* depending on other pos */ + /* depending on other pos */ // dfdx_spring(ia,ic,op,dir,bs->len,distance,mpos); /* depending on other vel */ // dfdv_goal(ia,ia,-mvel); // well that ignores geometie @@ -2143,15 +2183,15 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo int number_of_points_here = ilast - ifirst; SoftBody *sb= ob->soft; /* is supposed to be there */ BodyPoint *bp; - + /* intitialize */ if (sb) { /* check conditions for various options */ - /* +++ could be done on object level to squeeze out the last bits of it */ + /* +++ could be done on object level to squeeze out the last bits of it */ do_selfcollision=((ob->softflag & OB_SB_EDGES) && (sb->bspring)&& (ob->softflag & OB_SB_SELF)); do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL); do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES)); - /* --- could be done on object level to squeeze out the last bits of it */ + /* --- could be done on object level to squeeze out the last bits of it */ } else { printf("Error expected a SB here \n"); @@ -2166,29 +2206,29 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo /* debugerin */ - bp = &sb->bpoint[ifirst]; + bp = &sb->bpoint[ifirst]; for(bb=number_of_points_here; bb>0; bb--, bp++) { /* clear forces accumulator */ bp->force[0]= bp->force[1]= bp->force[2]= 0.0; /* naive ball self collision */ /* needs to be done if goal snaps or not */ if(do_selfcollision){ - int attached; + int attached; BodyPoint *obp; - BodySpring *bs; + BodySpring *bs; int c,b; float velcenter[3],dvel[3],def[3]; float distance; float compare; - float bstune = sb->ballstiff; + float bstune = sb->ballstiff; for(c=sb->totpoint, obp= sb->bpoint; c>=ifirst+bb; c--, obp++) { - compare = (obp->colball + bp->colball); + compare = (obp->colball + bp->colball); sub_v3_v3v3(def, bp->pos, obp->pos); /* rather check the AABBoxes before ever calulating the real distance */ /* mathematically it is completly nuts, but performace is pretty much (3) times faster */ if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue; - distance = normalize_v3(def); + distance = normalize_v3(def); if (distance < compare ){ /* exclude body points attached with a spring */ attached = 0; @@ -2203,14 +2243,14 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo mid_v3_v3v3(velcenter, bp->vec, obp->vec); sub_v3_v3v3(dvel,velcenter,bp->vec); - mul_v3_fl(dvel,bp->mass); + mul_v3_fl(dvel,_final_mass(ob,bp)); Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); Vec3PlusStVec(bp->force,sb->balldamp,dvel); /* exploit force(a,b) == -force(b,a) part2/2 */ sub_v3_v3v3(dvel,velcenter,obp->vec); - mul_v3_fl(dvel,bp->mass); + mul_v3_fl(dvel,_final_mass(ob,bp)); Vec3PlusStVec(obp->force,sb->balldamp,dvel); Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); @@ -2220,8 +2260,8 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo } /* naive ball self collision done */ - if(bp->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */ - float auxvect[3]; + if(_final_goal(ob,bp) < SOFTGOALSNAP){ /* ommit this bp when it snaps */ + float auxvect[3]; float velgoal[3]; /* do goal stuff */ @@ -2229,7 +2269,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo /* true elastic goal */ float ks,kd; sub_v3_v3v3(auxvect,bp->pos,bp->origT); - ks = 1.0f/(1.0f- bp->goal*sb->goalspring)-1.0f ; + ks = 1.0f/(1.0f- _final_goal(ob,bp)*sb->goalspring)-1.0f ; bp->force[0]+= -ks*(auxvect[0]); bp->force[1]+= -ks*(auxvect[1]); bp->force[2]+= -ks*(auxvect[2]); @@ -2238,7 +2278,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo sub_v3_v3v3(velgoal,bp->origS, bp->origE); kd = sb->goalfrict * sb_fric_force_scale(ob) ; add_v3_v3v3(auxvect,velgoal,bp->vec); - + if (forcetime > 0.0 ) { /* make sure friction does not become rocket motor on time reversal */ bp->force[0]-= kd * (auxvect[0]); bp->force[1]-= kd * (auxvect[1]); @@ -2251,15 +2291,15 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo } } /* done goal stuff */ - + /* gravitation */ - if (sb && scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY){ + if (sb && scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY){ float gravity[3]; VECCOPY(gravity, scene->physics_settings.gravity); - mul_v3_fl(gravity, sb_grav_force_scale(ob)*bp->mass*sb->effector_weights->global_gravity); /* individual mass of node here */ - add_v3_v3v3(bp->force, bp->force, gravity); + mul_v3_fl(gravity, sb_grav_force_scale(ob)*_final_mass(ob,bp)*sb->effector_weights->global_gravity); /* individual mass of node here */ + add_v3_v3(bp->force, gravity); } - + /* particle field & vortex */ if(do_effector) { EffectedPoint epoint; @@ -2269,22 +2309,22 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo float eval_sb_fric_force_scale = sb_fric_force_scale(ob); /* just for calling function once */ pd_point_from_soft(scene, bp->pos, bp->vec, sb->bpoint-bp, &epoint); pdDoEffectors(do_effector, NULL, sb->effector_weights, &epoint, force, speed); - + /* apply forcefield*/ - mul_v3_fl(force,fieldfactor* eval_sb_fric_force_scale); + mul_v3_fl(force,fieldfactor* eval_sb_fric_force_scale); VECADD(bp->force, bp->force, force); - - /* BP friction in moving media */ - kd= sb->mediafrict* eval_sb_fric_force_scale; + + /* BP friction in moving media */ + kd= sb->mediafrict* eval_sb_fric_force_scale; bp->force[0] -= kd * (bp->vec[0] + windfactor*speed[0]/eval_sb_fric_force_scale); bp->force[1] -= kd * (bp->vec[1] + windfactor*speed[1]/eval_sb_fric_force_scale); bp->force[2] -= kd * (bp->vec[2] + windfactor*speed[2]/eval_sb_fric_force_scale); /* now we'll have nice centrifugal effect for vortex */ - + } else { /* BP friction in media (not) moving*/ - float kd = sb->mediafrict* sb_fric_force_scale(ob); + float kd = sb->mediafrict* sb_fric_force_scale(ob); /* assume it to be proportional to actual velocity */ bp->force[0]-= bp->vec[0]*kd; bp->force[1]-= bp->vec[1]*kd; @@ -2294,22 +2334,22 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo /* +++cached collision targets */ bp->choke = 0.0f; bp->choke2 = 0.0f; - bp->flag &= ~SBF_DOFUZZY; - if(do_deflector) { + bp->loc_flag &= ~SBF_DOFUZZY; + if(do_deflector && !(bp->loc_flag & SBF_OUTOFCOLLISION) ) { float cfforce[3],defforce[3] ={0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f}, facenormal[3], cf = 1.0f,intrusion; float kd = 1.0f; if (sb_deflect_face(ob,bp->pos,facenormal,defforce,&cf,timenow,vel,&intrusion)){ if (intrusion < 0.0f){ sb->scratch->flag |= SBF_DOFUZZY; - bp->flag |= SBF_DOFUZZY; + bp->loc_flag |= SBF_DOFUZZY; bp->choke = sb->choke*0.01f; } VECSUB(cfforce,bp->vec,vel); Vec3PlusStVec(bp->force,-cf*50.0f,cfforce); - - Vec3PlusStVec(bp->force,kd,defforce); + + Vec3PlusStVec(bp->force,kd,defforce); } } @@ -2320,19 +2360,19 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo if(ob->softflag & OB_SB_EDGES) { if (sb->bspring){ /* spring list exists at all ? */ int b; - BodySpring *bs; + BodySpring *bs; for(b=bp->nofsprings;b>0;b--){ bs = sb->bspring + bp->springs[b-1]; if (do_springcollision || do_aero){ - add_v3_v3v3(bp->force,bp->force,bs->ext_force); + add_v3_v3(bp->force, bs->ext_force); if (bs->flag & BSF_INTERSECT) - bp->choke = bs->cf; + bp->choke = bs->cf; } - // sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags) + // sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags) sb_spring_force(ob,ilast-bb,bs,iks,forcetime,0); }/* loop springs */ - }/* existing spring list */ + }/* existing spring list */ }/*any edges*/ /* ---springs */ }/*omit on snap */ @@ -2343,9 +2383,9 @@ return 0; /*done fine*/ static void *exec_softbody_calc_forces(void *data) { SB_thread_context *pctx = (SB_thread_context*)data; - _softbody_calc_forces_slice_in_a_thread(pctx->scene, pctx->ob, pctx->forcetime, pctx->timenow, pctx->ifirst, pctx->ilast, NULL, pctx->do_effector,pctx->do_deflector,pctx->fieldfactor,pctx->windfactor); + _softbody_calc_forces_slice_in_a_thread(pctx->scene, pctx->ob, pctx->forcetime, pctx->timenow, pctx->ifirst, pctx->ilast, NULL, pctx->do_effector,pctx->do_deflector,pctx->fieldfactor,pctx->windfactor); return 0; -} +} static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float timenow,int totpoint,int *ptr_to_break_func(),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor) { @@ -2364,7 +2404,7 @@ static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float t totthread--; } - /* printf("sb_cf_threads_run spawning %d threads \n",totthread); */ + /* printf("sb_cf_threads_run spawning %d threads \n",totthread); */ sb_threads= MEM_callocN(sizeof(SB_thread_context)*totthread, "SBThread"); memset(sb_threads, 0, sizeof(SB_thread_context)*totthread); @@ -2372,18 +2412,18 @@ static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float t dec = totpoint/totthread +1; for(i=0; i<totthread; i++) { sb_threads[i].scene = scene; - sb_threads[i].ob = ob; - sb_threads[i].forcetime = forcetime; - sb_threads[i].timenow = timenow; - sb_threads[i].ilast = left; + sb_threads[i].ob = ob; + sb_threads[i].forcetime = forcetime; + sb_threads[i].timenow = timenow; + sb_threads[i].ilast = left; left = left - dec; if (left >0){ sb_threads[i].ifirst = left; } else - sb_threads[i].ifirst = 0; - sb_threads[i].do_effector = do_effector; - sb_threads[i].do_deflector = do_deflector; + sb_threads[i].ifirst = 0; + sb_threads[i].do_effector = do_effector; + sb_threads[i].do_deflector = do_deflector; sb_threads[i].fieldfactor = fieldfactor; sb_threads[i].windfactor = windfactor; sb_threads[i].nr= i; @@ -2401,36 +2441,36 @@ static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float t } else exec_softbody_calc_forces(&sb_threads[0]); - /* clean up */ + /* clean up */ MEM_freeN(sb_threads); } static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, float timenow, int nl_flags) { -/* rule we never alter free variables :bp->vec bp->pos in here ! - * this will ruin adaptive stepsize AKA heun! (BM) +/* rule we never alter free variables :bp->vec bp->pos in here ! + * this will ruin adaptive stepsize AKA heun! (BM) */ SoftBody *sb= ob->soft; /* is supposed to be there */ BodyPoint *bproot; ListBase *do_effector = NULL; float iks, gravity; - float fieldfactor = -1.0f, windfactor = 0.25; + float fieldfactor = -1.0f, windfactor = 0.25; int do_deflector,do_selfcollision,do_springcollision,do_aero; - - gravity = sb->grav * sb_grav_force_scale(ob); - + + gravity = sb->grav * sb_grav_force_scale(ob); + /* check conditions for various options */ do_deflector= query_external_colliders(scene, ob); do_selfcollision=((ob->softflag & OB_SB_EDGES) && (sb->bspring)&& (ob->softflag & OB_SB_SELF)); do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL); do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES)); - + iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */ bproot= sb->bpoint; /* need this for proper spring addressing */ - - if (do_springcollision || do_aero) - sb_sfesf_threads_run(scene, ob, timenow,sb->totspring,NULL); - + + if (do_springcollision || do_aero) + sb_sfesf_threads_run(scene, ob, timenow,sb->totspring,NULL); + /* after spring scan because it uses Effoctors too */ do_effector= pdInitEffectors(scene, ob, NULL, sb->effector_weights); @@ -2443,7 +2483,7 @@ static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, fl /* finally add forces caused by face collision */ if (ob->softflag & OB_SB_FACECOLL) scan_for_ext_face_forces(ob,timenow); - + /* finish matrix and solve */ pdEndEffectors(&do_effector); } @@ -2463,20 +2503,20 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /* |||||||||||||||||||||||||| */ /* VVVVVVVVVVVVVVVVVVVVVVVVVV */ /*backward compatibility note: - fixing bug [17428] which forces adaptive step size to tiny steps - in some situations + fixing bug [17428] which forces adaptive step size to tiny steps + in some situations .. keeping G.rt==17 0x11 option for old files 'needing' the bug*/ - /* rule we never alter free variables :bp->vec bp->pos in here ! - * this will ruin adaptive stepsize AKA heun! (BM) + /* rule we never alter free variables :bp->vec bp->pos in here ! + * this will ruin adaptive stepsize AKA heun! (BM) */ SoftBody *sb= ob->soft; /* is supposed to be there */ BodyPoint *bp; BodyPoint *bproot; - BodySpring *bs; + BodySpring *bs; ListBase *do_effector = NULL; float iks, ks, kd, gravity[3] = {0.0f,0.0f,0.0f}; - float fieldfactor = -1.0f, windfactor = 0.25f; + float fieldfactor = -1.0f, windfactor = 0.25f; float tune = sb->ballstiff; int a, b, do_deflector,do_selfcollision,do_springcollision,do_aero; @@ -2491,10 +2531,10 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa */ - if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY){ + if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY){ VECCOPY(gravity, scene->physics_settings.gravity); mul_v3_fl(gravity, sb_grav_force_scale(ob)*sb->effector_weights->global_gravity); - } + } /* check conditions for various options */ do_deflector= query_external_colliders(scene, ob); @@ -2520,7 +2560,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa if(nl_flags & NLF_BUILD){ //int ia =3*(sb->totpoint-a); //int op =3*sb->totpoint; - /* dF/dV = v */ + /* dF/dV = v */ /* jacobioan nlMatrixAdd(op+ia,ia,-forcetime); nlMatrixAdd(op+ia+1,ia+1,-forcetime); @@ -2552,7 +2592,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa //if ((bp->octantflag & obp->octantflag) == 0) continue; - compare = (obp->colball + bp->colball); + compare = (obp->colball + bp->colball); sub_v3_v3v3(def, bp->pos, obp->pos); /* rather check the AABBoxes before ever calulating the real distance */ @@ -2574,7 +2614,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa mid_v3_v3v3(velcenter, bp->vec, obp->vec); sub_v3_v3v3(dvel,velcenter,bp->vec); - mul_v3_fl(dvel,bp->mass); + mul_v3_fl(dvel,_final_mass(ob,bp)); Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); Vec3PlusStVec(bp->force,sb->balldamp,dvel); @@ -2596,16 +2636,16 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /*TODO sit down an X-out the true jacobian entries*/ /*well does not make to much sense because the eigenvalues of the jacobian go negative; and negative eigenvalues - on a complex iterative system z(n+1)=A * z(n) + on a complex iterative system z(n+1)=A * z(n) give imaginary roots in the charcateristic polynom - --> solutions that to z(t)=u(t)* exp ( i omega t) --> oscilations we don't want here + --> solutions that to z(t)=u(t)* exp ( i omega t) --> oscilations we don't want here where u(t) is a unknown amplitude function (worst case rising fast) - */ + */ } /* exploit force(a,b) == -force(b,a) part2/2 */ sub_v3_v3v3(dvel,velcenter,obp->vec); - mul_v3_fl(dvel,(bp->mass+obp->mass)/2.0f); + mul_v3_fl(dvel,(_final_mass(ob,bp)+_final_mass(ob,obp))/2.0f); Vec3PlusStVec(obp->force,sb->balldamp,dvel); Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); @@ -2617,15 +2657,15 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa } /* naive ball self collision done */ - if(bp->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */ - float auxvect[3]; + if(_final_goal(ob,bp) < SOFTGOALSNAP){ /* ommit this bp when it snaps */ + float auxvect[3]; float velgoal[3]; /* do goal stuff */ if(ob->softflag & OB_SB_GOAL) { /* true elastic goal */ sub_v3_v3v3(auxvect,bp->pos,bp->origT); - ks = 1.0f/(1.0f- bp->goal*sb->goalspring)-1.0f ; + ks = 1.0f/(1.0f- _final_goal(ob,bp)*sb->goalspring)-1.0f ; bp->force[0]+= -ks*(auxvect[0]); bp->force[1]+= -ks*(auxvect[1]); bp->force[2]+= -ks*(auxvect[2]); @@ -2633,7 +2673,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa if(nl_flags & NLF_BUILD){ //int ia =3*(sb->totpoint-a); //int op =3*(sb->totpoint); - /* depending on my pos */ + /* depending on my pos */ //dfdx_goal(ia,ia,op,ks*forcetime); } @@ -2650,7 +2690,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa if(nl_flags & NLF_BUILD){ //int ia =3*(sb->totpoint-a); normalize_v3(auxvect); - /* depending on my vel */ + /* depending on my vel */ //dfdv_goal(ia,ia,kd*forcetime); } @@ -2665,7 +2705,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /* gravitation */ - VECADDFAC(bp->force, bp->force, gravity, bp->mass); /* individual mass of node here */ + VECADDFAC(bp->force, bp->force, gravity, _final_mass(ob,bp)); /* individual mass of node here */ /* particle field & vortex */ @@ -2678,11 +2718,11 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa pdDoEffectors(do_effector, NULL, sb->effector_weights, &epoint, force, speed); /* apply forcefield*/ - mul_v3_fl(force,fieldfactor* eval_sb_fric_force_scale); + mul_v3_fl(force,fieldfactor* eval_sb_fric_force_scale); VECADD(bp->force, bp->force, force); - /* BP friction in moving media */ - kd= sb->mediafrict* eval_sb_fric_force_scale; + /* BP friction in moving media */ + kd= sb->mediafrict* eval_sb_fric_force_scale; bp->force[0] -= kd * (bp->vec[0] + windfactor*speed[0]/eval_sb_fric_force_scale); bp->force[1] -= kd * (bp->vec[1] + windfactor*speed[1]/eval_sb_fric_force_scale); bp->force[2] -= kd * (bp->vec[2] + windfactor*speed[2]/eval_sb_fric_force_scale); @@ -2691,7 +2731,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa } else { /* BP friction in media (not) moving*/ - kd= sb->mediafrict* sb_fric_force_scale(ob); + kd= sb->mediafrict* sb_fric_force_scale(ob); /* assume it to be proportional to actual velocity */ bp->force[0]-= bp->vec[0]*kd; bp->force[1]-= bp->vec[1]*kd; @@ -2699,7 +2739,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /* friction in media done */ if(nl_flags & NLF_BUILD){ //int ia =3*(sb->totpoint-a); - /* da/dv = */ + /* da/dv = */ // nlMatrixAdd(ia,ia,forcetime*kd); // nlMatrixAdd(ia+1,ia+1,forcetime*kd); @@ -2710,7 +2750,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /* +++cached collision targets */ bp->choke = 0.0f; bp->choke2 = 0.0f; - bp->flag &= ~SBF_DOFUZZY; + bp->loc_flag &= ~SBF_DOFUZZY; if(do_deflector) { float cfforce[3],defforce[3] ={0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f}, facenormal[3], cf = 1.0f,intrusion; kd = 1.0f; @@ -2718,15 +2758,15 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa if (sb_deflect_face(ob,bp->pos,facenormal,defforce,&cf,timenow,vel,&intrusion)){ if ((!nl_flags)&&(intrusion < 0.0f)){ if(G.rt & 0x01){ // 17 we did check for bit 0x10 before - /*fixing bug [17428] this forces adaptive step size to tiny steps + /*fixing bug [17428] this forces adaptive step size to tiny steps in some situations .. keeping G.rt==17 option for old files 'needing' the bug */ - /*bjornmose: uugh.. what an evil hack - violation of the 'don't touch bp->pos in here' rule + /*bjornmose: uugh.. what an evil hack + violation of the 'don't touch bp->pos in here' rule but works nice, like this--> we predict the solution beeing out of the collider in heun step No1 and leave the heun step No2 adapt to it - so we kind of introduced a implicit solver for this case + so we kind of introduced a implicit solver for this case */ Vec3PlusStVec(bp->pos,-intrusion,facenormal); } @@ -2738,7 +2778,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa sb->scratch->flag |= SBF_DOFUZZY; - bp->flag |= SBF_DOFUZZY; + bp->loc_flag |= SBF_DOFUZZY; bp->choke = sb->choke*0.01f; } else{ @@ -2765,16 +2805,16 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa for(b=bp->nofsprings;b>0;b--){ bs = sb->bspring + bp->springs[b-1]; if (do_springcollision || do_aero){ - add_v3_v3v3(bp->force,bp->force,bs->ext_force); + add_v3_v3(bp->force, bs->ext_force); if (bs->flag & BSF_INTERSECT) - bp->choke = bs->cf; + bp->choke = bs->cf; } // sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags) // rather remove nl_falgs from code .. will make things a lot cleaner sb_spring_force(ob,sb->totpoint-a,bs,iks,forcetime,0); }/* loop springs */ - }/* existing spring list */ + }/* existing spring list */ }/*any edges*/ /* ---springs */ }/*omit on snap */ @@ -2799,7 +2839,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa nlEnd(NL_SYSTEM); if ((G.rt == 32) && (nl_flags & NLF_BUILD)) - { + { printf("####MEE#####\n"); nlPrintMatrix(); } @@ -2870,36 +2910,36 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * float maxerrpos= 0.0f,maxerrvel = 0.0f; int a,fuzzy=0; - forcetime *= sb_time_scale(ob); - - aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f; - aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f; + forcetime *= sb_time_scale(ob); - /* old one with homogenous masses */ + aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f; + aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f; + + /* old one with homogenous masses */ /* claim a minimum mass for vertex */ /* if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass; else timeovermass = forcetime/0.009999f; */ - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { /* now we have individual masses */ /* claim a minimum mass for vertex */ - if (bp->mass > 0.009999f) timeovermass = forcetime/bp->mass; - else timeovermass = forcetime/0.009999f; + if (_final_mass(ob,bp) > 0.009999f) timeovermass = forcetime/_final_mass(ob,bp); + else timeovermass = forcetime/0.009999f; - if(bp->goal < SOFTGOALSNAP){ - /* this makes t~ = t */ + if(_final_goal(ob,bp) < SOFTGOALSNAP){ + /* this makes t~ = t */ if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec); - + /* so here is (v)' = a(cceleration) = sum(F_springs)/m + gravitation + some friction forces + more forces*/ /* the ( ... )' operator denotes derivate respective time */ /* the euler step for velocity then becomes */ - /* v(t + dt) = v(t) + a(t) * dt */ + /* v(t + dt) = v(t) + a(t) * dt */ mul_v3_fl(bp->force,timeovermass);/* individual mass of node here */ /* some nasty if's to have heun in here too */ - VECCOPY(dv,bp->force); + VECCOPY(dv,bp->force); if (mode == 1){ VECCOPY(bp->prevvec, bp->vec); @@ -2918,12 +2958,12 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * } else {VECADD(bp->vec, bp->vec, bp->force);} - /* this makes t~ = t+dt */ + /* this makes t~ = t+dt */ if(!(mid_flags & MID_PRESERVE)) VECCOPY(dx,bp->vec); /* so here is (x)'= v(elocity) */ /* the euler step for location then becomes */ - /* x(t + dt) = x(t) + v(t~) * dt */ + /* x(t + dt) = x(t) + v(t~) * dt */ mul_v3_fl(dx,forcetime); /* the freezer coming sooner or later */ @@ -2935,13 +2975,13 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * bp->frozen =MIN2(bp->frozen*1.05f,1.0f); } mul_v3_fl(dx,bp->frozen); - */ + */ /* again some nasty if's to have heun in here too */ if (mode ==1){ VECCOPY(bp->prevpos,bp->pos); VECCOPY(bp->prevdx ,dx); } - + if (mode ==2){ bp->pos[0] = bp->prevpos[0] + 0.5f * ( dx[0] + bp->prevdx[0]); bp->pos[1] = bp->prevpos[1] + 0.5f * ( dx[1] + bp->prevdx[1]); @@ -2950,9 +2990,9 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * maxerrpos = MAX2(maxerrpos,ABS(dx[1] - bp->prevdx[1])); maxerrpos = MAX2(maxerrpos,ABS(dx[2] - bp->prevdx[2])); -/* bp->choke is set when we need to pull a vertex or edge out of the collider. - the collider object signals to get out by pushing hard. on the other hand - we don't want to end up in deep space so we add some <viscosity> +/* bp->choke is set when we need to pull a vertex or edge out of the collider. + the collider object signals to get out by pushing hard. on the other hand + we don't want to end up in deep space so we add some <viscosity> to balance that out */ if (bp->choke2 > 0.0f){ mul_v3_fl(bp->vec,(1.0f - bp->choke2)); @@ -2971,7 +3011,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * aabbmax[0] = MAX2(aabbmax[0],bp->pos[0]); aabbmax[1] = MAX2(aabbmax[1],bp->pos[1]); aabbmax[2] = MAX2(aabbmax[2],bp->pos[2]); - if (bp->flag & SBF_DOFUZZY) fuzzy =1; + if (bp->loc_flag & SBF_DOFUZZY) fuzzy =1; } /*for*/ if (sb->totpoint) mul_v3_fl(cm,1.0f/sb->totpoint); @@ -2979,7 +3019,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * VECCOPY(sb->scratch->aabbmin,aabbmin); VECCOPY(sb->scratch->aabbmax,aabbmax); } - + if (err){ /* so step size will be controlled by biggest difference in slope */ if (sb->solverflags & SBSO_OLDERR) *err = MAX2(maxerrpos,maxerrvel); @@ -2998,7 +3038,7 @@ static void softbody_restore_prev_step(Object *ob) SoftBody *sb= ob->soft; /* is supposed to be there*/ BodyPoint *bp; int a; - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { VECCOPY(bp->vec, bp->prevvec); VECCOPY(bp->pos, bp->prevpos); @@ -3011,7 +3051,7 @@ static void softbody_store_step(Object *ob) SoftBody *sb= ob->soft; /* is supposed to be there*/ BodyPoint *bp; int a; - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { VECCOPY(bp->prevvec,bp->vec); VECCOPY(bp->prevpos,bp->pos); @@ -3026,12 +3066,12 @@ static void softbody_store_state(Object *ob,float *ppos,float *pvel) BodyPoint *bp; int a; float *pp=ppos,*pv=pvel; - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { - - VECCOPY(pv, bp->vec); + + VECCOPY(pv, bp->vec); pv+=3; - + VECCOPY(pp, bp->pos); pp+=3; } @@ -3044,12 +3084,12 @@ static void softbody_retrieve_state(Object *ob,float *ppos,float *pvel) BodyPoint *bp; int a; float *pp=ppos,*pv=pvel; - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { - - VECCOPY(bp->vec,pv); + + VECCOPY(bp->vec,pv); pv+=3; - + VECCOPY(bp->pos,pp); pp+=3; } @@ -3063,17 +3103,17 @@ static void softbody_swap_state(Object *ob,float *ppos,float *pvel) int a; float *pp=ppos,*pv=pvel; float temp[3]; - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { - - VECCOPY(temp, bp->vec); - VECCOPY(bp->vec,pv); - VECCOPY(pv,temp); + + VECCOPY(temp, bp->vec); + VECCOPY(bp->vec,pv); + VECCOPY(pv,temp); pv+=3; - + VECCOPY(temp, bp->pos); - VECCOPY(bp->pos,pp); - VECCOPY(pp,temp); + VECCOPY(bp->pos,pp); + VECCOPY(pp,temp); pp+=3; } } @@ -3082,8 +3122,8 @@ static void softbody_swap_state(Object *ob,float *ppos,float *pvel) /* care for bodypoints taken out of the 'ordinary' solver step ** because they are screwed to goal by bolts -** they just need to move along with the goal in time -** we need to adjust them on sub frame timing in solver +** they just need to move along with the goal in time +** we need to adjust them on sub frame timing in solver ** so now when frame is done .. put 'em to the position at the end of frame */ static void softbody_apply_goalsnap(Object *ob) @@ -3091,12 +3131,12 @@ static void softbody_apply_goalsnap(Object *ob) SoftBody *sb= ob->soft; /* is supposed to be there */ BodyPoint *bp; int a; - + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { - if (bp->goal >= SOFTGOALSNAP){ + if (_final_goal(ob,bp) >= SOFTGOALSNAP){ VECCOPY(bp->prevpos,bp->pos); VECCOPY(bp->pos,bp->origT); - } + } } } @@ -3131,39 +3171,39 @@ static void interpolate_exciter(Object *ob, int timescale, int time) BodyPoint *bp; float f; int a; - + f = (float)time/(float)timescale; - - for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { - bp->origT[0] = bp->origS[0] + f*(bp->origE[0] - bp->origS[0]); - bp->origT[1] = bp->origS[1] + f*(bp->origE[1] - bp->origS[1]); - bp->origT[2] = bp->origS[2] + f*(bp->origE[2] - bp->origS[2]); - if (bp->goal >= SOFTGOALSNAP){ + + for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { + bp->origT[0] = bp->origS[0] + f*(bp->origE[0] - bp->origS[0]); + bp->origT[1] = bp->origS[1] + f*(bp->origE[1] - bp->origS[1]); + bp->origT[2] = bp->origS[2] + f*(bp->origE[2] - bp->origS[2]); + if (_final_goal(ob,bp) >= SOFTGOALSNAP){ bp->vec[0] = bp->origE[0] - bp->origS[0]; bp->vec[1] = bp->origE[1] - bp->origS[1]; bp->vec[2] = bp->origE[2] - bp->origS[2]; } } - + } /* ************ convertors ********** */ /* for each object type we need; - - xxxx_to_softbody(Object *ob) : a full (new) copy, creates SB geometry + - xxxx_to_softbody(Object *ob) : a full (new) copy, creates SB geometry */ static void get_scalar_from_vertexgroup(Object *ob, int vertID, short groupindex, float *target) /* result 0 on success, else indicates error number -- kind of *inverse* result defintion, --- but this way we can signal error condition to caller +-- but this way we can signal error condition to caller -- and yes this function must not be here but in a *vertex group module* */ { MDeformVert *dv= NULL; int i; - + /* spot the vert in deform vert list at mesh */ if(ob->type==OB_MESH) { Mesh *me= ob->data; @@ -3184,10 +3224,10 @@ static void get_scalar_from_vertexgroup(Object *ob, int vertID, short groupindex } } } -} +} -/* Resetting a Mesh SB object's springs */ -/* Spring lenght are caculted from'raw' mesh vertices that are NOT altered by modifier stack. */ +/* Resetting a Mesh SB object's springs */ +/* Spring lenght are caculted from'raw' mesh vertices that are NOT altered by modifier stack. */ static void springs_from_mesh(Object *ob) { SoftBody *sb; @@ -3195,21 +3235,21 @@ static void springs_from_mesh(Object *ob) BodyPoint *bp; int a; float scale =1.0f; - - sb= ob->soft; + + sb= ob->soft; if (me && sb) - { + { /* using bp->origS as a container for spring calcualtions here - ** will be overwritten sbObjectStep() to receive + ** will be overwritten sbObjectStep() to receive ** actual modifier stack positions */ - if(me->totvert) { + if(me->totvert) { bp= ob->soft->bpoint; for(a=0; a<me->totvert; a++, bp++) { - VECCOPY(bp->origS, me->mvert[a].co); + VECCOPY(bp->origS, me->mvert[a].co); mul_m4_v3(ob->obmat, bp->origS); } - + } /* recalculate spring length for meshes here */ /* public version shrink to fit */ @@ -3224,6 +3264,8 @@ static void springs_from_mesh(Object *ob) } + + /* makes totally fresh start situation */ static void mesh_to_softbody(Scene *scene, Object *ob) { @@ -3232,39 +3274,44 @@ static void mesh_to_softbody(Scene *scene, Object *ob) MEdge *medge= me->medge; BodyPoint *bp; BodySpring *bs; - float goalfac; int a, totedge; if (ob->softflag & OB_SB_EDGES) totedge= me->totedge; else totedge= 0; - + /* renew ends with ob->soft with points and edges, also checks & makes ob->soft */ renew_softbody(scene, ob, me->totvert, totedge); - + /* we always make body points */ - sb= ob->soft; + sb= ob->soft; bp= sb->bpoint; - goalfac= ABS(sb->maxgoal - sb->mingoal); - + for(a=0; a<me->totvert; a++, bp++) { /* get scalar values needed *per vertex* from vertex group functions, - so we can *paint* them nicly .. + so we can *paint* them nicly .. they are normalized [0.0..1.0] so may be we need amplitude for scale - which can be done by caller but still .. i'd like it to go this way - */ - - if((ob->softflag & OB_SB_GOAL) && sb->vertgroup) { + which can be done by caller but still .. i'd like it to go this way + */ + + if((ob->softflag & OB_SB_GOAL) && sb->vertgroup) { /* even this is a deprecated evil hack */ + /* I'd like to have it .. if (sb->namedVG_Goal[0]) */ + get_scalar_from_vertexgroup(ob, a,(short) (sb->vertgroup-1), &bp->goal); /* do this always, regardless successfull read from vertex group */ - bp->goal= sb->mingoal + bp->goal*goalfac; + /* this is where '2.5 every thing is animateable' goes wrong in the first place jow_go_for2_5 */ + /* 1st coding action to take : move this to frame level */ + /* reads: leave the bp->goal as it was read from vertex group / or default .. we will need it at per frame call */ + /* should be fixed for meshes */ + // bp->goal= sb->mingoal + bp->goal*goalfac; /* do not do here jow_go_for2_5 */ } - /* a little ad hoc changing the goal control to be less *sharp* */ - bp->goal = (float)pow(bp->goal, 4.0f); - + else{ + /* in consequence if no group was set .. but we want to animate it laters */ + /* logically attach to goal with default first */ + if(ob->softflag & OB_SB_GOAL){bp->goal =sb->defgoal;} + } + /* to proove the concept - this would enable per vertex *mass painting* + this enables per vertex *mass painting* */ - /* first set the default */ - bp->mass = sb->nodemass; if (sb->namedVG_Mass[0]) { @@ -3272,7 +3319,7 @@ static void mesh_to_softbody(Scene *scene, Object *ob) /* printf("VGN %s %d \n",sb->namedVG_Mass,grp); */ if(grp > -1){ get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->mass); - bp->mass = bp->mass * sb->nodemass; + /* 2.5 bp->mass = bp->mass * sb->nodemass; */ /* printf("bp->mass %f \n",bp->mass); */ } @@ -3283,7 +3330,7 @@ static void mesh_to_softbody(Scene *scene, Object *ob) if (sb->namedVG_Spring_K[0]) { int grp= defgroup_name_index (ob,sb->namedVG_Spring_K); - //printf("VGN %s %d \n",sb->namedVG_Spring_K,grp); + //printf("VGN %s %d \n",sb->namedVG_Spring_K,grp); if(grp > -1){ get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->springweight); //printf("bp->springweight %f \n",bp->springweight); @@ -3291,7 +3338,7 @@ static void mesh_to_softbody(Scene *scene, Object *ob) } } - + } /* but we only optionally add body edge springs */ @@ -3303,13 +3350,13 @@ static void mesh_to_softbody(Scene *scene, Object *ob) bs->v2= medge->v2; bs->springtype=SB_EDGE; } - - + + /* insert *diagonal* springs in quads if desired */ if (ob->softflag & OB_SB_QUADS) { add_mesh_quad_diag_springs(ob); } - + build_bps_springlist(ob); /* scan for springs attached to bodypoints ONCE */ /* insert *other second order* springs if desired */ if (sb->secondspring > 0.0000001f) { @@ -3317,23 +3364,23 @@ static void mesh_to_softbody(Scene *scene, Object *ob) build_bps_springlist(ob); /* yes we need to do it again*/ } springs_from_mesh(ob); /* write the 'rest'-lenght of the springs */ - if (ob->softflag & OB_SB_SELF) {calculate_collision_balls(ob);} - + if (ob->softflag & OB_SB_SELF) {calculate_collision_balls(ob);} + } - + } } static void mesh_faces_to_scratch(Object *ob) { - SoftBody *sb= ob->soft; + SoftBody *sb= ob->soft; Mesh *me= ob->data; MFace *mface; BodyFace *bodyface; int a; /* alloc and copy faces*/ - + bodyface = sb->scratch->bodyface = MEM_mallocN(sizeof(BodyFace)*me->totface,"SB_body_Faces"); //memcpy(sb->scratch->mface,me->mface,sizeof(MFace)*me->totface); mface = me->mface; @@ -3343,13 +3390,13 @@ static void mesh_faces_to_scratch(Object *ob) bodyface->v3 = mface->v3; bodyface->v4 = mface->v4; bodyface->ext_force[0] = bodyface->ext_force[1] = bodyface->ext_force[2] = 0.0f; - bodyface->flag =0; + bodyface->flag =0; } sb->scratch->totface = me->totface; } static void reference_to_scratch(Object *ob) { - SoftBody *sb= ob->soft; + SoftBody *sb= ob->soft; ReferenceVert *rp; BodyPoint *bp; float accu_pos[3] ={0.f,0.f,0.f}; @@ -3362,7 +3409,7 @@ static void reference_to_scratch(Object *ob) for(a=0; a<sb->totpoint; a++, rp++, bp++) { VECCOPY(rp->pos,bp->pos); VECADD(accu_pos,accu_pos,bp->pos); - accu_mass += bp-> mass; + accu_mass += _final_mass(ob,bp); } mul_v3_fl(accu_pos,1.0f/accu_mass); VECCOPY(sb->scratch->Ref.com,accu_pos); @@ -3370,14 +3417,14 @@ static void reference_to_scratch(Object *ob) } /* -helper function to get proper spring length +helper function to get proper spring length when object is rescaled */ static float globallen(float *v1,float *v2,Object *ob) { float p1[3],p2[3]; VECCOPY(p1,v1); - mul_m4_v3(ob->obmat, p1); + mul_m4_v3(ob->obmat, p1); VECCOPY(p2,v2); mul_m4_v3(ob->obmat, p2); return len_v3v3(p1,p2); @@ -3387,16 +3434,16 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object * { BPoint *bp=lt->def, *bpu; int u, v, w, dv, dw, bpc=0, bpuc; - + dv= lt->pntsu; dw= dv*lt->pntsv; - + for(w=0; w<lt->pntsw; w++) { - + for(v=0; v<lt->pntsv; v++) { - + for(u=0, bpuc=0, bpu=NULL; u<lt->pntsu; u++, bp++, bpc++) { - + if(w) { bs->v1 = bpc; bs->v2 = bpc-dw; @@ -3418,7 +3465,7 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object * bs->len= globallen((bpu)->vec, bp->vec,ob); bs++; } - + if (dostiff) { if(w){ @@ -3428,14 +3475,14 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object * bs->springtype=SB_BEND; bs->len= globallen((bp-dw-dv-1)->vec, bp->vec,ob); bs++; - } + } if( (v < lt->pntsv-1) && (u) ) { bs->v1 = bpc; bs->v2 = bpc-dw+dv-1; bs->springtype=SB_BEND; bs->len= globallen((bp-dw+dv-1)->vec, bp->vec,ob); bs++; - } + } } if(w < lt->pntsw -1){ @@ -3445,14 +3492,14 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object * bs->springtype=SB_BEND; bs->len= globallen((bp+dw-dv-1)->vec, bp->vec,ob); bs++; - } + } if( (v < lt->pntsv-1) && (u) ) { bs->v1 = bpc; bs->v2 = bpc+dw+dv-1; bs->springtype=SB_BEND; bs->len= globallen((bp+dw+dv-1)->vec, bp->vec,ob); bs++; - } + } } } bpu = bp; @@ -3473,35 +3520,33 @@ static void lattice_to_softbody(Scene *scene, Object *ob) totvert= lt->pntsu*lt->pntsv*lt->pntsw; if (ob->softflag & OB_SB_EDGES){ - totspring = ((lt->pntsu -1) * lt->pntsv - + (lt->pntsv -1) * lt->pntsu) * lt->pntsw + totspring = ((lt->pntsu -1) * lt->pntsv + + (lt->pntsv -1) * lt->pntsu) * lt->pntsw +lt->pntsu*lt->pntsv*(lt->pntsw -1); if (ob->softflag & OB_SB_QUADS){ totspring += 4*(lt->pntsu -1) * (lt->pntsv -1) * (lt->pntsw-1); } } - + /* renew ends with ob->soft with points and edges, also checks & makes ob->soft */ renew_softbody(scene, ob, totvert, totspring); sb= ob->soft; /* can be created in renew_softbody() */ - + /* weights from bpoints, same code used as for mesh vertices */ /* if((ob->softflag & OB_SB_GOAL) && sb->vertgroup) { 2.4x one*/ /* new! take the weights from lattice vertex anyhow */ if(ob->softflag & OB_SB_GOAL){ BodyPoint *bp= sb->bpoint; BPoint *bpnt= lt->def; - float goalfac= ABS(sb->maxgoal - sb->mingoal); + /* jow_go_for2_5 */ int a; for(a=0; a<totvert; a++, bp++, bpnt++) { - bp->goal= sb->mingoal + bpnt->weight*goalfac; - /* a little ad hoc changing the goal control to be less *sharp* */ - bp->goal = (float)pow(bp->goal, 4.0f); + bp->goal= bpnt->weight; } - } - + } + /* create some helper edges to enable SB lattice to be usefull at all */ if (ob->softflag & OB_SB_EDGES){ makelatticesprings(lt,ob->soft->bspring,ob->softflag & OB_SB_QUADS,ob); @@ -3519,63 +3564,66 @@ static void curve_surf_to_softbody(Scene *scene, Object *ob) Nurb *nu; BezTriple *bezt; BPoint *bpnt; - float goalfac; int a, curindex=0; int totvert, totspring = 0, setgoal=0; - + totvert= count_curveverts(&cu->nurb); - + if (ob->softflag & OB_SB_EDGES){ if(ob->type==OB_CURVE) { totspring= totvert - BLI_countlist(&cu->nurb); } } - + /* renew ends with ob->soft with points and edges, also checks & makes ob->soft */ renew_softbody(scene, ob, totvert, totspring); sb= ob->soft; /* can be created in renew_softbody() */ - + /* set vars now */ - goalfac= ABS(sb->maxgoal - sb->mingoal); bp= sb->bpoint; bs= sb->bspring; - + /* weights from bpoints, same code used as for mesh vertices */ /* if((ob->softflag & OB_SB_GOAL) && sb->vertgroup) 2.4x hack*/ /* new! take the weights from curve vertex anyhow */ - if(ob->softflag & OB_SB_GOAL) + if(ob->softflag & OB_SB_GOAL) setgoal= 1; - + for(nu= cu->nurb.first; nu; nu= nu->next) { if(nu->bezt) { + /* bezier case ; this is nicly said naive; who ever wrote this part, it was not me (JOW) :) */ + /* a: never ever make tangent handles (sub) and or (ob)ject to collision */ + /* b: rather calculate them using some C2 (C2= continous in second derivate -> no jump in bending ) condition */ + /* not too hard to do, but needs some more code to care for; some one may want look at it JOW 2010/06/12*/ for(bezt=nu->bezt, a=0; a<nu->pntsu; a++, bezt++, bp+=3, curindex+=3) { if(setgoal) { - bp->goal= sb->mingoal + bezt->weight*goalfac; - /* a little ad hoc changing the goal control to be less *sharp* */ - bp->goal = (float)pow(bp->goal, 4.0f); - + bp->goal= bezt->weight; + /* all three triples */ (bp+1)->goal= bp->goal; (bp+2)->goal= bp->goal; + /*do not collide handles */ + (bp+1)->loc_flag |= SBF_OUTOFCOLLISION; + (bp+2)->loc_flag |= SBF_OUTOFCOLLISION; } - + if(totspring) { if(a>0) { - bs->v1= curindex-1; + bs->v1= curindex-3; bs->v2= curindex; - bs->springtype=SB_EDGE; - bs->len= globallen( (bezt-1)->vec[2], bezt->vec[0], ob ); + bs->springtype=SB_HANDLE; + bs->len= globallen( (bezt-1)->vec[0], bezt->vec[0], ob ); bs++; } bs->v1= curindex; bs->v2= curindex+1; - bs->springtype=SB_EDGE; + bs->springtype=SB_HANDLE; bs->len= globallen( bezt->vec[0], bezt->vec[1], ob ); bs++; bs->v1= curindex+1; bs->v2= curindex+2; - bs->springtype=SB_EDGE; + bs->springtype=SB_HANDLE; bs->len= globallen( bezt->vec[1], bezt->vec[2], ob ); bs++; } @@ -3584,9 +3632,7 @@ static void curve_surf_to_softbody(Scene *scene, Object *ob) else { for(bpnt=nu->bp, a=0; a<nu->pntsu*nu->pntsv; a++, bpnt++, bp++, curindex++) { if(setgoal) { - bp->goal= sb->mingoal + bpnt->weight*goalfac; - /* a little ad hoc changing the goal control to be less *sharp* */ - bp->goal = (float)pow(bp->goal, 4.0f); + bp->goal= bpnt->weight; } if(totspring && a>0) { bs->v1= curindex-1; @@ -3598,7 +3644,7 @@ static void curve_surf_to_softbody(Scene *scene, Object *ob) } } } - + if(totspring) { build_bps_springlist(ob); /* link bps to springs */ @@ -3619,7 +3665,7 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, for(a=0; a<numVerts; a++, bp++) { VECCOPY(vertexCos[a], bp->pos); - if(local==0) + if(local==0) mul_m4_v3(ob->imat, vertexCos[a]); /* softbody is in global coords, baked optionally not */ } } @@ -3630,13 +3676,13 @@ static void sb_new_scratch(SoftBody *sb) { if (!sb) return; sb->scratch = MEM_callocN(sizeof(SBScratch), "SBScratch"); - sb->scratch->colliderhash = BLI_ghash_new(BLI_ghashutil_ptrhash,BLI_ghashutil_ptrcmp); + sb->scratch->colliderhash = BLI_ghash_new(BLI_ghashutil_ptrhash,BLI_ghashutil_ptrcmp, "sb_new_scratch gh"); sb->scratch->bodyface = NULL; sb->scratch->totface = 0; sb->scratch->aabbmax[0]=sb->scratch->aabbmax[1]=sb->scratch->aabbmax[2] = 1.0e30f; sb->scratch->aabbmin[0]=sb->scratch->aabbmin[1]=sb->scratch->aabbmin[2] = -1.0e30f; sb->scratch->Ref.ivert = NULL; - + } /* --- ************ maintaining scratch *************** */ @@ -3646,26 +3692,26 @@ static void sb_new_scratch(SoftBody *sb) SoftBody *sbNew(Scene *scene) { SoftBody *sb; - + sb= MEM_callocN(sizeof(SoftBody), "softbody"); - - sb->mediafrict= 0.5f; + + sb->mediafrict= 0.5f; sb->nodemass= 1.0f; - sb->grav= 9.8f; + sb->grav= 9.8f; sb->physics_speed= 1.0f; sb->rklimit= 0.1f; - sb->goalspring= 0.5f; - sb->goalfrict= 0.0f; - sb->mingoal= 0.0f; + sb->goalspring= 0.5f; + sb->goalfrict= 0.0f; + sb->mingoal= 0.0f; sb->maxgoal= 1.0f; sb->defgoal= 0.7f; - + sb->inspring= 0.5f; - sb->infrict= 0.5f; + sb->infrict= 0.5f; /*todo backward file compat should copy inspring to inpush while reading old files*/ - sb->inpush = 0.5f; - + sb->inpush = 0.5f; + sb->interval= 10; sb->sfra= scene->r.sfra; sb->efra= scene->r.efra; @@ -3717,7 +3763,7 @@ void sbObjectToSoftbody(Object *ob) free_softbody_intern(ob->soft); } -static int object_has_edges(Object *ob) +static int object_has_edges(Object *ob) { if(ob->type==OB_MESH) { return ((Mesh*) ob->data)->totedge; @@ -3730,7 +3776,7 @@ static int object_has_edges(Object *ob) } } -/* SB global visible functions */ +/* SB global visible functions */ void sbSetInterruptCallBack(int (*f)(void)) { SB_localInterruptCallBack = f; @@ -3745,7 +3791,7 @@ static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCo return; for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) { - /* store where goals are now */ + /* store where goals are now */ VECCOPY(bp->origS, bp->origE); /* copy the position of the goals at desired end time */ VECCOPY(bp->origE, vertexCos[a]); @@ -3753,7 +3799,7 @@ static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCo mul_m4_v3(ob->obmat, bp->origE); /* just to be save give bp->origT a defined value will be calulated in interpolate_exciter()*/ - VECCOPY(bp->origT, bp->origE); + VECCOPY(bp->origT, bp->origE); } } @@ -3767,7 +3813,7 @@ static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCo see: this is kind of reverse engeneering: having to states of a point cloud and recover what happend our advantage here we know the identity of the vertex there are others methods giving other results. - lloc,lrot,lscale are allowed to be NULL, just in case you don't need it. + lloc,lrot,lscale are allowed to be NULL, just in case you don't need it. should be pretty useful for pythoneers :) not! velocity .. 2nd order stuff vcloud_estimate_transform see @@ -3788,10 +3834,10 @@ void SB_estimate_transform(Object *ob,float lloc[3],float lrot[3][3],float lscal if(!sb || !sb->bpoint) return; opos= MEM_callocN( (sb->totpoint)*3*sizeof(float), "SB_OPOS"); rpos= MEM_callocN( (sb->totpoint)*3*sizeof(float), "SB_RPOS"); - /* might filter vertex selection with a vertex group */ + /* might filter vertex selection with a vertex group */ for(a=0, bp=sb->bpoint, rp=sb->scratch->Ref.ivert; a<sb->totpoint; a++, bp++, rp++) { - VECCOPY(rpos[a],rp->pos); - VECCOPY(opos[a],bp->pos); + VECCOPY(rpos[a],rp->pos); + VECCOPY(opos[a],bp->pos); } vcloud_estimate_transform(sb->totpoint, opos, NULL, rpos, NULL, com, rcom,lrot,lscale); @@ -3801,7 +3847,7 @@ void SB_estimate_transform(Object *ob,float lloc[3],float lrot[3][3],float lscal if (lscale) copy_m3_m3(sb->lscale,lscale); if (lrot) copy_m3_m3(sb->lrot,lrot); - + MEM_freeN(opos); MEM_freeN(rpos); } @@ -3824,9 +3870,9 @@ static void softbody_reset(Object *ob, SoftBody *sb, float (*vertexCos)[3], int 1. set sheduled time step to new dtime 2. try to advance the sheduled time step, beeing optimistic execute it 3. check for success - 3.a we 're fine continue, may be we can increase sheduled time again ?? if so, do so! + 3.a we 're fine continue, may be we can increase sheduled time again ?? if so, do so! 3.b we did exceed error limit --> roll back, shorten the sheduled time and try again at 2. - 4. check if we did reach dtime + 4. check if we did reach dtime 4.a nope we need to do some more at 2. 4.b yup we're done */ @@ -3840,7 +3886,7 @@ static void softbody_reset(Object *ob, SoftBody *sb, float (*vertexCos)[3], int /* make a nice clean scratch struc */ free_scratch(sb); /* clear if any */ sb_new_scratch(sb); /* make a new */ - sb->scratch->needstobuildcollider=1; + sb->scratch->needstobuildcollider=1; zero_v3(sb->lcom); unit_m3(sb->lrot); unit_m3(sb->lscale); @@ -3873,15 +3919,15 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) /* the simulator */ float forcetime; double sct,sst; - - + + sst=PIL_check_seconds_timer(); - /* Integration back in time is possible in theory, but pretty useless here. + /* Integration back in time is possible in theory, but pretty useless here. So we refuse to do so. Since we do not know anything about 'outside' canges especially colliders we refuse to go more than 10 frames. */ - if(dtime < 0 || dtime > 10.5f) return; - + if(dtime < 0 || dtime > 10.5f) return; + ccd_update_deflector_hash(scene, ob, sb->scratch->colliderhash); if(sb->scratch->needstobuildcollider){ @@ -3891,7 +3937,7 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) sb->scratch->needstobuildcollider=0; } - if (sb->solver_ID < 2) { + if (sb->solver_ID < 2) { /* special case of 2nd order Runge-Kutta type AKA Heun */ int mid_flags=0; float err = 0; @@ -3901,21 +3947,21 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) /* loops = counter for emergency brake * we don't want to lock up the system if physics fail */ - int loops =0 ; - + int loops =0 ; + SoftHeunTol = sb->rklimit; /* humm .. this should be calculated from sb parameters and sizes */ /* adjust loop limits */ if (sb->minloops > 0) forcetimemax = dtime / sb->minloops; if (sb->maxloops > 0) forcetimemin = dtime / sb->maxloops; if(sb->solver_ID>0) mid_flags |= MID_PRESERVE; - + forcetime =forcetimemax; /* hope for integrating in one step */ while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) ) { - /* set goals in time */ + /* set goals in time */ interpolate_exciter(ob,200,(int)(200.0*(timedone/dtime))); - + sb->scratch->flag &= ~SBF_DOFUZZY; /* do predictive euler step */ softbody_calc_forces(scene, ob, forcetime,timedone/dtime,0); @@ -3927,9 +3973,9 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) softbody_apply_forces(ob, forcetime, 2, &err,mid_flags); softbody_apply_goalsnap(ob); - + if (err > SoftHeunTol) { /* error needs to be scaled to some quantity */ - + if (forcetime > forcetimemin){ forcetime = MAX2(forcetime / 2.0f,forcetimemin); softbody_restore_prev_step(ob); @@ -3941,7 +3987,7 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) } else { float newtime = forcetime * 1.1f; /* hope for 1.1 times better conditions in next step */ - + if (sb->scratch->flag & SBF_DOFUZZY){ //if (err > SoftHeunTol/(2.0f*sb->fuzzyness)) { /* stay with this stepsize unless err really small */ newtime = forcetime; @@ -3957,7 +4003,7 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) //if (newtime > forcetime) printf("up,"); if (forcetime > 0.0) forcetime = MIN2(dtime - timedone,newtime); - else + else forcetime = MAX2(dtime - timedone,newtime); } loops++; @@ -3965,20 +4011,20 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime) sct=PIL_check_seconds_timer(); if (sct-sst > 0.5f) printf("%3.0f%% \r",100.0f*timedone/dtime); } - /* ask for user break */ + /* ask for user break */ if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break; } /* move snapped to final position */ interpolate_exciter(ob, 2, 2); softbody_apply_goalsnap(ob); - + // if(G.f & G_DEBUG){ if(sb->solverflags & SBSO_MONITOR ){ if (loops > HEUNWARNLIMIT) /* monitor high loop counts */ printf("\r needed %d steps/frame",loops); } - + } else if (sb->solver_ID == 2) {/* do semi "fake" implicit euler */ @@ -4025,17 +4071,13 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i /* check for changes in mesh, should only happen in case the mesh * structure changes during an animation */ if(sb->bpoint && numVerts != sb->totpoint) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return; } /* clamp frame ranges */ if(framenr < startframe) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - //cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return; } else if(framenr > endframe) { @@ -4068,8 +4110,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i /* continue physics special case */ if(BKE_ptcache_get_continue_physics()) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; + BKE_ptcache_invalidate(cache); /* do simulation */ dtime = timescale; softbody_update_positions(ob, sb, vertexCos, numVerts); @@ -4082,14 +4123,13 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i if(sb->totpoint==0) { return; } - if(framenr == startframe) { + if(framenr == startframe) { BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED); /* first frame, no simulation to do, just set the positions */ softbody_update_positions(ob, sb, vertexCos, numVerts); - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_validate(cache, framenr); cache->flag &= ~PTCACHE_REDO_NEEDED; return; } @@ -4100,8 +4140,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) { softbody_to_object(ob, vertexCos, numVerts, sb->local); - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_validate(cache, framenr); if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED) BKE_ptcache_write_cache(&pid, framenr); @@ -4109,13 +4148,11 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i return; } else if(cache_result==PTCACHE_READ_OLD) { - cache->flag |= PTCACHE_SIMULATION_VALID; + ; /* do nothing */ } else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) { /* if baked and nothing in cache, do nothing */ - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - cache->last_exact= 0; + BKE_ptcache_invalidate(cache); return; } @@ -4133,8 +4170,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i softbody_to_object(ob, vertexCos, numVerts, 0); - cache->simframe= framenr; - cache->flag |= PTCACHE_SIMULATION_VALID; + BKE_ptcache_validate(cache, framenr); BKE_ptcache_write_cache(&pid, framenr); } diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index e014b209e07..6402f908422 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -14,10 +14,8 @@ #include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" -#include "DNA_sound_types.h" #include "DNA_packedFile_types.h" #include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "AUD_C-API.h" @@ -31,14 +29,10 @@ #include "BKE_fcurve.h" #include "BKE_animsys.h" -#include "RNA_access.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif static int force_device = -1; +#ifdef WITH_JACK static void sound_sync_callback(void* data, int mode, float time) { struct Main* bmain = (struct Main*)data; @@ -58,6 +52,7 @@ static void sound_sync_callback(void* data, int mode, float time) scene = scene->id.next; } } +#endif int sound_define_from_str(char *str) { @@ -78,6 +73,11 @@ void sound_force_device(int device) force_device = device; } +void sound_init_once() +{ + AUD_initOnce(); +} + void sound_init(struct Main *bmain) { AUD_DeviceSpecs specs; @@ -125,7 +125,7 @@ struct bSound* sound_new_file(struct Main *bmain, char* filename) int len; strcpy(str, filename); - BLI_convertstringcode(str, bmain->name); + BLI_path_abs(str, bmain->name); len = strlen(filename); while(len > 0 && filename[len-1] != '/' && filename[len-1] != '\\') @@ -256,11 +256,11 @@ void sound_load(struct Main *bmain, struct bSound* sound) BLI_strncpy(fullpath, sound->name, sizeof(fullpath)); if(sound->id.lib) - path = sound->id.lib->filename; + path = sound->id.lib->filepath; else path = bmain ? bmain->name : G.sce; - BLI_convertstringcode(fullpath, path); + BLI_path_abs(fullpath, path); /* but we need a packed file then */ if (pf) @@ -347,6 +347,13 @@ void sound_destroy_scene(struct Scene *scene) AUD_destroySequencer(scene->sound_scene); } +void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip) +{ + if(scene != sequence->scene) + return AUD_addSequencer(scene->sound_scene, &(sequence->scene->sound_scene), startframe / FPS, endframe / FPS, frameskip / FPS, sequence); + return NULL; +} + void* sound_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip) { return AUD_addSequencer(scene->sound_scene, &(sequence->sound->playback_handle), startframe / FPS, endframe / FPS, frameskip / FPS, sequence); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 4c73e60f741..0d4c51f3b89 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -42,21 +42,17 @@ #include "DNA_scene_types.h" #include "BKE_cdderivedmesh.h" -#include "BKE_customdata.h" -#include "BKE_DerivedMesh.h" -#include "BKE_displist.h" -#include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_mesh.h" -#include "BKE_multires.h" +#include "BKE_modifier.h" +#include "BKE_paint.h" #include "BKE_scene.h" #include "BKE_subsurf.h" #include "BKE_tessmesh.h" +#include "BKE_utildefines.h" #include "BLI_blenlib.h" #include "BLI_edgehash.h" -#include "BLI_editVert.h" -#include "BLI_linklist.h" #include "BLI_math.h" #include "BLI_memarena.h" #include "BLI_pbvh.h" @@ -126,7 +122,7 @@ static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAgin if (useArena) { CCGAllocatorIFC allocatorIFC; - CCGAllocatorHDL allocator = BLI_memarena_new((1<<16)); + CCGAllocatorHDL allocator = BLI_memarena_new((1<<16), "subsurf arena"); allocatorIFC.alloc = arena_alloc; allocatorIFC.realloc = arena_realloc; @@ -386,7 +382,7 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, } static void calc_ss_weights(int gridFaces, - FaceVertWeight **qweight, FaceVertWeight **tweight) + FaceVertWeight **qweight, FaceVertWeight **tweight) { FaceVertWeight *qw, *tw; int x, y, j; @@ -899,7 +895,7 @@ static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh, } static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, - float (*vertexCos)[3], int useFlatSubdiv) + float (*vertexCos)[3], int useFlatSubdiv) { float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss); CCGVertHDL *fVerts = NULL; @@ -942,10 +938,10 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, float crease; crease = useFlatSubdiv ? creaseFactor : - me->crease * creaseFactor / 255.0f; + me->crease * creaseFactor / 255.0f; ccgSubSurf_syncEdge(ss, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(me->v1), - SET_INT_IN_POINTER(me->v2), crease, &e); + SET_INT_IN_POINTER(me->v2), crease, &e); ((int*)ccgSubSurf_getEdgeUserData(ss, e))[1] = (index)? *index++: i; } @@ -968,7 +964,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, * other parts of code significantly to handle missing faces. * since this really shouldn't even be possible we just bail.*/ if(ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), fiter->len, - fVerts, &f) == eCCGError_InvalidValue) { + fVerts, &f) == eCCGError_InvalidValue) { static int hasGivenError = 0; if(!hasGivenError) { @@ -1064,10 +1060,11 @@ static int cgdm_getNumTessFaces(DerivedMesh *dm) { return ccgSubSurf_getNumFinalFaces(cgdm->ss); } -static void cgdm_getFinalVert(DerivedMesh *dm, int vertNum, MVert *mv) +static void ccgDM_getFinalVert(DerivedMesh *dm, int vertNum, MVert *mv) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; + DMGridData *vd; int i; memset(mv, 0, sizeof(*mv)); @@ -1099,19 +1096,25 @@ static void cgdm_getFinalVert(DerivedMesh *dm, int vertNum, MVert *mv) offset = vertNum - cgdm->faceMap[i].startVert; if(offset < 1) { - copy_v3_v3(mv->co, ccgSubSurf_getFaceCenterData(f)); + vd = ccgSubSurf_getFaceCenterData(f); + copy_v3_v3(mv->co, vd->co); + normal_float_to_short_v3(mv->no, vd->no); } else if(offset < gridSideEnd) { offset -= 1; grid = offset / gridSideVerts; x = offset % gridSideVerts + 1; - copy_v3_v3(mv->co, ccgSubSurf_getFaceGridEdgeData(ss, f, grid, x)); + vd = ccgSubSurf_getFaceGridEdgeData(ss, f, grid, x); + copy_v3_v3(mv->co, vd->co); + normal_float_to_short_v3(mv->no, vd->no); } else if(offset < gridInternalEnd) { offset -= gridSideEnd; grid = offset / gridInternalVerts; offset %= gridInternalVerts; y = offset / gridSideVerts + 1; x = offset % gridSideVerts + 1; - copy_v3_v3(mv->co, ccgSubSurf_getFaceGridData(ss, f, grid, x, y)); + vd = ccgSubSurf_getFaceGridData(ss, f, grid, x, y); + copy_v3_v3(mv->co, vd->co); + normal_float_to_short_v3(mv->no, vd->no); } } else if((vertNum < cgdm->vertMap[0].startVert) && (ccgSubSurf_getNumEdges(ss) > 0)) { /* this vert comes from edge data */ @@ -1126,18 +1129,38 @@ static void cgdm_getFinalVert(DerivedMesh *dm, int vertNum, MVert *mv) e = cgdm->edgeMap[i].edge; x = vertNum - cgdm->edgeMap[i].startVert + 1; - copy_v3_v3(mv->co, ccgSubSurf_getEdgeData(ss, e, x)); + vd = ccgSubSurf_getEdgeData(ss, e, x); + copy_v3_v3(mv->co, vd->co); + normal_float_to_short_v3(mv->no, vd->no); } else { /* this vert comes from vert data */ CCGVert *v; i = vertNum - cgdm->vertMap[0].startVert; v = cgdm->vertMap[i].vert; - copy_v3_v3(mv->co, ccgSubSurf_getVertData(ss, v)); + vd = ccgSubSurf_getVertData(ss, v); + copy_v3_v3(mv->co, vd->co); + normal_float_to_short_v3(mv->no, vd->no); } } -static void cgdm_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med) +static void ccgDM_getFinalVertCo(DerivedMesh *dm, int vertNum, float co_r[3]) +{ + MVert mvert; + + ccgDM_getFinalVert(dm, vertNum, &mvert); + VECCOPY(co_r, mvert.co); +} + +static void ccgDM_getFinalVertNo(DerivedMesh *dm, int vertNum, float no_r[3]) +{ + MVert mvert; + + ccgDM_getFinalVert(dm, vertNum, &mvert); + normal_short_to_float_v3(no_r, mvert.no); +} + +static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; @@ -1216,7 +1239,7 @@ static void cgdm_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med) } } -static void cgdm_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf) +static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; @@ -1260,7 +1283,7 @@ static void cgdm_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf) else mf->flag = ME_SMOOTH; } -static void cgdm_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) +static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; @@ -1308,6 +1331,7 @@ static void cgdm_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) for(x = 1; x < edgeSize - 1; x++, i++) { vd= ccgSubSurf_getEdgeData(ss, e, x); copy_v3_v3(mvert[i].co, vd->co); + /* XXX, This gives errors with -fpe, the normals dont seem to be unit length - campbell */ normal_float_to_short_v3(mvert[i].no, vd->no); } } @@ -1323,7 +1347,7 @@ static void cgdm_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) } } -static void cgdm_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) +static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; @@ -1344,7 +1368,7 @@ static void cgdm_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) MEdge *med = &medge[i]; if(cgdm->drawInteriorEdges) - med->flag = ME_EDGEDRAW | ME_EDGERENDER; + med->flag = ME_EDGEDRAW | ME_EDGERENDER; med->v1 = getFaceIndex(ss, f, S, x, 0, edgeSize, gridSize); med->v2 = getFaceIndex(ss, f, S, x + 1, 0, edgeSize, gridSize); i++; @@ -1356,20 +1380,20 @@ static void cgdm_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) med = &medge[i]; if(cgdm->drawInteriorEdges) - med->flag = ME_EDGEDRAW | ME_EDGERENDER; + med->flag = ME_EDGEDRAW | ME_EDGERENDER; med->v1 = getFaceIndex(ss, f, S, x, y, - edgeSize, gridSize); + edgeSize, gridSize); med->v2 = getFaceIndex(ss, f, S, x, y + 1, - edgeSize, gridSize); + edgeSize, gridSize); i++; med = &medge[i]; if(cgdm->drawInteriorEdges) - med->flag = ME_EDGEDRAW | ME_EDGERENDER; + med->flag = ME_EDGEDRAW | ME_EDGERENDER; med->v1 = getFaceIndex(ss, f, S, y, x, - edgeSize, gridSize); + edgeSize, gridSize); med->v2 = getFaceIndex(ss, f, S, y + 1, x, - edgeSize, gridSize); + edgeSize, gridSize); i++; } } @@ -1388,7 +1412,7 @@ static void cgdm_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) if(edgeFlags) { if(edgeIdx != -1) { flags |= (edgeFlags[index] & (ME_SEAM | ME_SHARP)) - | ME_EDGEDRAW | ME_EDGERENDER; + | ME_EDGEDRAW | ME_EDGERENDER; } } else { flags |= ME_EDGEDRAW | ME_EDGERENDER; @@ -1493,7 +1517,7 @@ void cgdm_loopIterStep(void *self) liter->head.eindex = GET_INT_FROM_POINTER(BLI_edgehash_lookup(liter->fiter->cgdm->ehash, v1, v2)); liter->lindex += 1; - cgdm_getFinalVert((DerivedMesh*)liter->cgdm, v1, &liter->head.v); + ccgDM_getFinalVert((DerivedMesh*)liter->cgdm, v1, &liter->head.v); } void *cgdm_loopIterGetVCData(void *self, int type, int layer) @@ -1561,7 +1585,7 @@ DMFaceIter *cgdm_newFaceIter(DerivedMesh *dm) return fiter; } -static void cgdm_copyFinalFaceArray(DerivedMesh *dm, MFace *mface) +static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; @@ -1584,13 +1608,13 @@ static void cgdm_copyFinalFaceArray(DerivedMesh *dm, MFace *mface) for(x = 0; x < gridSize - 1; x++) { MFace *mf = &mface[i]; mf->v1 = getFaceIndex(ss, f, S, x + 0, y + 0, - edgeSize, gridSize); + edgeSize, gridSize); mf->v2 = getFaceIndex(ss, f, S, x + 0, y + 1, - edgeSize, gridSize); + edgeSize, gridSize); mf->v3 = getFaceIndex(ss, f, S, x + 1, y + 1, - edgeSize, gridSize); + edgeSize, gridSize); mf->v4 = getFaceIndex(ss, f, S, x + 1, y + 0, - edgeSize, gridSize); + edgeSize, gridSize); if (faceFlags) { mat_nr = faceFlags[index*2+1]; mf->flag = faceFlags[index*2]; @@ -1724,7 +1748,7 @@ static void cgdm_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData, ccgEdgeIterator_free(ei); } -static void cgdm_drawVerts(DerivedMesh *dm) { +static void ccgDM_drawVerts(DerivedMesh *dm) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; int edgeSize = ccgSubSurf_getEdgeSize(ss); @@ -1768,9 +1792,9 @@ static void cgdm_drawVerts(DerivedMesh *dm) { ccgFaceIterator_free(fi); glEnd(); } -static void cgdm_drawEdges(DerivedMesh *dm, int drawLooseEdges) { - CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = cgdm->ss; +static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges) { + CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; + CCGSubSurf *ss = ccgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); int i, edgeSize = ccgSubSurf_getEdgeSize(ss); @@ -1803,7 +1827,7 @@ static void cgdm_drawEdges(DerivedMesh *dm, int drawLooseEdges) { glColor3ub(0, 0, 0); } - if (cgdm->drawInteriorEdges) { + if (ccgdm->drawInteriorEdges) { for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) { CCGFace *f = ccgFaceIterator_getCurrent(fi); int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f); @@ -1834,7 +1858,7 @@ static void cgdm_drawEdges(DerivedMesh *dm, int drawLooseEdges) { ccgFaceIterator_free(fi); ccgEdgeIterator_free(ei); } -static void cgdm_drawLooseEdges(DerivedMesh *dm) { +static void ccgDM_drawLooseEdges(DerivedMesh *dm) { CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = cgdm->ss; CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); @@ -1873,7 +1897,7 @@ void ccgDM_glNormalFast(float *a, float *b, float *c, float *d) static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm) { - if(ccgdm->pbvh) { + if(ccgdm->pbvh && ccgdm->multires.mmd) { CCGFace **faces; int totface; @@ -1888,22 +1912,22 @@ static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm) /* Only used by non-editmesh types */ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) { - CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; - CCGSubSurf *ss = cgdm->ss; + CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; + CCGSubSurf *ss = ccgdm->ss; CCGFaceIterator *fi; - int gridSize; - char *faceFlags = cgdm->faceFlags; + int gridSize = ccgSubSurf_getGridSize(ss); + char *faceFlags = ccgdm->faceFlags; int step = (fast)? gridSize-1: 1; - ccgdm_pbvh_update(cgdm); - if(cgdm->pbvh && cgdm->multires.mmd && !fast) { + ccgdm_pbvh_update(ccgdm); + if(ccgdm->pbvh && ccgdm->multires.mmd && !fast) { if(dm->numFaceData) { /* should be per face */ if(!setMaterial(faceFlags[1]+1, NULL)) return; glShadeModel((faceFlags[0] & ME_SMOOTH)? GL_SMOOTH: GL_FLAT); - BLI_pbvh_draw(cgdm->pbvh, partial_redraw_planes, NULL); + BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, (faceFlags[0] & ME_SMOOTH)); glShadeModel(GL_FLAT); } @@ -2422,8 +2446,8 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u if (draw) { if (draw==2) { - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(stipple_quarttone); + glEnable(GL_POLYGON_STIPPLE); + glPolygonStipple(stipple_quarttone); } for (S=0; S<numVerts; S++) { @@ -2578,34 +2602,35 @@ static void cgdm_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use } static void cgdm_release(DerivedMesh *dm) { - CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm; + CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; if (DM_release(dm)) { /* Before freeing, need to update the displacement map */ - if(cgdm->multires.modified) { + if(ccgdm->multires.modified) { /* Check that mmd still exists */ - if(!cgdm->multires.local_mmd && BLI_findindex(&cgdm->multires.ob->modifiers, cgdm->multires.mmd) < 0) - cgdm->multires.mmd = NULL; - if(cgdm->multires.mmd) - cgdm->multires.update(dm); + if(!ccgdm->multires.local_mmd && BLI_findindex(&ccgdm->multires.ob->modifiers, ccgdm->multires.mmd) < 0) + ccgdm->multires.mmd = NULL; + if(ccgdm->multires.mmd) + ccgdm->multires.update(dm); } - if(cgdm->pbvh) BLI_pbvh_free(cgdm->pbvh); - if(cgdm->gridFaces) MEM_freeN(cgdm->gridFaces); - if(cgdm->gridData) MEM_freeN(cgdm->gridData); - if(cgdm->gridAdjacency) MEM_freeN(cgdm->gridAdjacency); - if(cgdm->gridOffset) MEM_freeN(cgdm->gridOffset); - if(cgdm->freeSS) ccgSubSurf_free(cgdm->ss); - if(cgdm->reverseFaceMap) MEM_freeN(cgdm->reverseFaceMap); + if (ccgdm->ehash) + BLI_edgehash_free(ccgdm->ehash, NULL); - BLI_edgehash_free(cgdm->ehash, NULL); - - MEM_freeN(cgdm->edgeFlags); - MEM_freeN(cgdm->faceFlags); - MEM_freeN(cgdm->vertMap); - MEM_freeN(cgdm->edgeMap); - MEM_freeN(cgdm->faceMap); - MEM_freeN(cgdm); + if(ccgdm->reverseFaceMap) MEM_freeN(ccgdm->reverseFaceMap); + if(ccgdm->gridFaces) MEM_freeN(ccgdm->gridFaces); + if(ccgdm->gridData) MEM_freeN(ccgdm->gridData); + if(ccgdm->gridAdjacency) MEM_freeN(ccgdm->gridAdjacency); + if(ccgdm->gridOffset) MEM_freeN(ccgdm->gridOffset); + if(ccgdm->freeSS) ccgSubSurf_free(ccgdm->ss); + if(ccgdm->fmap) MEM_freeN(ccgdm->fmap); + if(ccgdm->fmap_mem) MEM_freeN(ccgdm->fmap_mem); + MEM_freeN(ccgdm->edgeFlags); + MEM_freeN(ccgdm->faceFlags); + MEM_freeN(ccgdm->vertMap); + MEM_freeN(ccgdm->edgeMap); + MEM_freeN(ccgdm->faceMap); + MEM_freeN(ccgdm); } } @@ -2811,7 +2836,7 @@ static int cgdm_adjacent_grid(CCGSubSurf *ss, int *gridOffset, CCGFace *f, int S return gridOffset[fIndex] + (j + offset)%numEdges; } -static void cgdm_create_grids(DerivedMesh *dm) +static void ccgdm_create_grids(DerivedMesh *dm) { CCGDerivedMesh *cgdm= (CCGDerivedMesh*)dm; CCGSubSurf *ss= cgdm->ss; @@ -2878,7 +2903,7 @@ static DMGridData **ccgDM_getGridData(DerivedMesh *dm) { CCGDerivedMesh *cgdm= (CCGDerivedMesh*)dm; - cgdm_create_grids(dm); + ccgdm_create_grids(dm); return cgdm->gridData; } @@ -2886,7 +2911,7 @@ static DMGridAdjacency *ccgDM_getGridAdjacency(DerivedMesh *dm) { CCGDerivedMesh *cgdm= (CCGDerivedMesh*)dm; - cgdm_create_grids(dm); + ccgdm_create_grids(dm); return cgdm->gridAdjacency; } @@ -2894,45 +2919,106 @@ static int *ccgDM_getGridOffset(DerivedMesh *dm) { CCGDerivedMesh *cgdm= (CCGDerivedMesh*)dm; - cgdm_create_grids(dm); + ccgdm_create_grids(dm); return cgdm->gridOffset; } +static ListBase *ccgDM_getFaceMap(Object *ob, DerivedMesh *dm) +{ + CCGDerivedMesh *ccgdm= (CCGDerivedMesh*)dm; + + if(!ccgdm->multires.mmd && !ccgdm->fmap && ob->type == OB_MESH) { + Mesh *me= ob->data; + + create_vert_face_map(&ccgdm->fmap, &ccgdm->fmap_mem, me->mface, + me->totvert, me->totface); + } + + return ccgdm->fmap; +} + +static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm) +{ + ModifierData *md; + MultiresModifierData *mmd= ccgdm->multires.mmd; + + /* in sync with sculpt mode, only use multires grid pbvh if we are + the last enabled modifier in the stack, otherwise we use the base + mesh */ + if(!mmd) + return 0; + + for(md=mmd->modifier.next; md; md= md->next) + if(modifier_isEnabled(mmd->modifier.scene, md, eModifierMode_Realtime)) + return 0; + + return 1; +} + static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) { - CCGDerivedMesh *cgdm= (CCGDerivedMesh*)dm; - int gridSize, numGrids; + CCGDerivedMesh *ccgdm= (CCGDerivedMesh*)dm; + int gridSize, numGrids, grid_pbvh; - if(cgdm->pbvh) - return cgdm->pbvh; + if(!ob) { + ccgdm->pbvh= NULL; + return NULL; + } - if(cgdm->multires.mmd) { - cgdm_create_grids(dm); + if(!ob->sculpt) + return NULL; + + grid_pbvh = ccgDM_use_grid_pbvh(ccgdm); + + if(ob->sculpt->pbvh) { + if(grid_pbvh) { + /* pbvh's grids, gridadj and gridfaces points to data inside ccgdm + but this can be freed on ccgdm release, this updates the pointers + when the ccgdm gets remade, the assumption is that the topology + does not change. */ + ccgdm_create_grids(dm); + BLI_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void**)ccgdm->gridFaces); + } + + ccgdm->pbvh = ob->sculpt->pbvh; + ccgdm->pbvh_draw = grid_pbvh; + } + + if(ccgdm->pbvh) + return ccgdm->pbvh; + + /* no pbvh exists yet, we need to create one. only in case of multires + we build a pbvh over the modified mesh, in other cases the base mesh + is being sculpted, so we build a pbvh from that. */ + if(grid_pbvh) { + ccgdm_create_grids(dm); gridSize = ccgDM_getGridSize(dm); numGrids = ccgDM_getNumGrids(dm); - cgdm->pbvh = BLI_pbvh_new(); - BLI_pbvh_build_grids(cgdm->pbvh, cgdm->gridData, cgdm->gridAdjacency, - numGrids, gridSize, (void**)cgdm->gridFaces); + ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new(); + BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, + numGrids, gridSize, (void**)ccgdm->gridFaces); + ccgdm->pbvh_draw = 1; } else if(ob->type == OB_MESH) { Mesh *me= ob->data; - cgdm->pbvh = BLI_pbvh_new(); - BLI_pbvh_build_mesh(cgdm->pbvh, me->mface, me->mvert, - me->totface, me->totvert); + ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new(); + BLI_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert, + me->totface, me->totvert); + ccgdm->pbvh_draw = 0; } - return cgdm->pbvh; + return ccgdm->pbvh; } static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, - int drawInteriorEdges, - int useSubsurfUv, - DerivedMesh *dm) + int drawInteriorEdges, + int useSubsurfUv, + DerivedMesh *dm) { - CCGDerivedMesh *cgdm = MEM_callocN(sizeof(*cgdm), "cgdm"); + CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "cgdm"); CCGVertIterator *vi; CCGEdgeIterator *ei; CCGFaceIterator *fi; @@ -2959,105 +3045,121 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, MEdge *medge = NULL, medge2; MFace *mface = NULL; MPoly *mpoly = NULL; + int *orig_indices; - DM_from_template(&cgdm->dm, dm, DM_TYPE_CCGDM, + DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM, ccgSubSurf_getNumFinalVerts(ss), ccgSubSurf_getNumFinalEdges(ss), ccgSubSurf_getNumFinalFaces(ss), ccgSubSurf_getNumFinalFaces(ss)*4, ccgSubSurf_getNumFinalFaces(ss)); - numTex = CustomData_number_of_layers(&cgdm->dm.loopData, CD_MLOOPUV); - numCol = CustomData_number_of_layers(&cgdm->dm.loopData, CD_MLOOPCOL); + numTex = CustomData_number_of_layers(&ccgdm->dm.loopData, CD_MLOOPUV); + numCol = CustomData_number_of_layers(&ccgdm->dm.loopData, CD_MLOOPCOL); - if (numTex && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MTFACE) != numTex) - CustomData_from_bmeshpoly(&cgdm->dm.faceData, &cgdm->dm.polyData, &cgdm->dm.loopData, ccgSubSurf_getNumFinalFaces(ss)); - else if (numCol && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MCOL) != numCol) - CustomData_from_bmeshpoly(&cgdm->dm.faceData, &cgdm->dm.polyData, &cgdm->dm.loopData, ccgSubSurf_getNumFinalFaces(ss)); + if (numTex && CustomData_number_of_layers(&ccgdm->dm.faceData, CD_MTFACE) != numTex) + CustomData_from_bmeshpoly(&ccgdm->dm.faceData, &ccgdm->dm.polyData, &ccgdm->dm.loopData, ccgSubSurf_getNumFinalFaces(ss)); + else if (numCol && CustomData_number_of_layers(&ccgdm->dm.faceData, CD_MCOL) != numCol) + CustomData_from_bmeshpoly(&ccgdm->dm.faceData, &ccgdm->dm.polyData, &ccgdm->dm.loopData, ccgSubSurf_getNumFinalFaces(ss)); - cgdm->dm.getMinMax = cgdm_getMinMax; - cgdm->dm.getNumVerts = cgdm_getNumVerts; - cgdm->dm.getNumTessFaces = cgdm_getNumTessFaces; - cgdm->dm.getNumFaces = cgdm_getNumTessFaces; + ccgdm->dm.getMinMax = cgdm_getMinMax; + ccgdm->dm.getNumVerts = cgdm_getNumVerts; + ccgdm->dm.getNumTessFaces = cgdm_getNumTessFaces; + ccgdm->dm.getNumFaces = cgdm_getNumTessFaces; - cgdm->dm.getNumGrids = ccgDM_getNumGrids; - cgdm->dm.getGridSize = ccgDM_getGridSize; - cgdm->dm.getGridData = ccgDM_getGridData; - cgdm->dm.getGridAdjacency = ccgDM_getGridAdjacency; - cgdm->dm.getGridOffset = ccgDM_getGridOffset; - cgdm->dm.getPBVH = ccgDM_getPBVH; + ccgdm->dm.getNumGrids = ccgDM_getNumGrids; + ccgdm->dm.getPBVH = ccgDM_getPBVH; - cgdm->dm.newFaceIter = cgdm_newFaceIter; - cgdm->dm.getNumEdges = cgdm_getNumEdges; - cgdm->dm.getVert = cgdm_getFinalVert; - cgdm->dm.getEdge = cgdm_getFinalEdge; - cgdm->dm.getTessFace = cgdm_getFinalFace; - cgdm->dm.copyVertArray = cgdm_copyFinalVertArray; - cgdm->dm.copyEdgeArray = cgdm_copyFinalEdgeArray; - cgdm->dm.copyTessFaceArray = cgdm_copyFinalFaceArray; - cgdm->dm.getVertData = DM_get_vert_data; - cgdm->dm.getEdgeData = DM_get_edge_data; - cgdm->dm.getTessFaceData = DM_get_face_data; - cgdm->dm.getVertDataArray = DM_get_vert_data_layer; - cgdm->dm.getEdgeDataArray = DM_get_edge_data_layer; - cgdm->dm.getTessFaceDataArray = DM_get_tessface_data_layer; + ccgdm->dm.newFaceIter = cgdm_newFaceIter; + ccgdm->dm.getVert = ccgDM_getFinalVert; + ccgdm->dm.getEdge = ccgDM_getFinalEdge; + ccgdm->dm.getTessFace = ccgDM_getFinalFace; + ccgdm->dm.getVertCo = ccgDM_getFinalVertCo; + ccgdm->dm.getVertNo = ccgDM_getFinalVertNo; + ccgdm->dm.copyVertArray = ccgDM_copyFinalVertArray; + ccgdm->dm.copyEdgeArray = ccgDM_copyFinalEdgeArray; + ccgdm->dm.copyTessFaceArray = ccgDM_copyFinalFaceArray; + ccgdm->dm.getVertData = DM_get_vert_data; + ccgdm->dm.getEdgeData = DM_get_edge_data; + ccgdm->dm.getTessFaceData = DM_get_face_data; + ccgdm->dm.getVertDataArray = ccgDM_get_vert_data_layer; + ccgdm->dm.getEdgeDataArray = ccgDM_get_edge_data_layer; + ccgdm->dm.getTessFaceDataArray = ccgDM_get_face_data_layer; + ccgdm->dm.getNumGrids = ccgDM_getNumGrids; + ccgdm->dm.getGridSize = ccgDM_getGridSize; + ccgdm->dm.getGridData = ccgDM_getGridData; + ccgdm->dm.getGridAdjacency = ccgDM_getGridAdjacency; + ccgdm->dm.getGridOffset = ccgDM_getGridOffset; + ccgdm->dm.getFaceMap = ccgDM_getFaceMap; + ccgdm->dm.getPBVH = ccgDM_getPBVH; - cgdm->dm.getVertCos = cgdm_getVertCos; - cgdm->dm.foreachMappedVert = cgdm_foreachMappedVert; - cgdm->dm.foreachMappedEdge = cgdm_foreachMappedEdge; - cgdm->dm.foreachMappedFaceCenter = cgdm_foreachMappedFaceCenter; + ccgdm->dm.getTessFace = ccgDM_getFinalFace; + ccgdm->dm.copyVertArray = ccgDM_copyFinalVertArray; + ccgdm->dm.copyEdgeArray = ccgDM_copyFinalEdgeArray; + ccgdm->dm.copyTessFaceArray = ccgDM_copyFinalFaceArray; + ccgdm->dm.getVertData = DM_get_vert_data; + ccgdm->dm.getEdgeData = DM_get_edge_data; + ccgdm->dm.getTessFaceData = DM_get_face_data; + ccgdm->dm.getVertDataArray = DM_get_vert_data_layer; + ccgdm->dm.getEdgeDataArray = DM_get_edge_data_layer; + ccgdm->dm.getTessFaceDataArray = DM_get_tessface_data_layer; + + ccgdm->dm.getVertCos = cgdm_getVertCos; + ccgdm->dm.foreachMappedVert = cgdm_foreachMappedVert; + ccgdm->dm.foreachMappedEdge = cgdm_foreachMappedEdge; + ccgdm->dm.foreachMappedFaceCenter = cgdm_foreachMappedFaceCenter; - cgdm->dm.drawVerts = cgdm_drawVerts; - cgdm->dm.drawEdges = cgdm_drawEdges; - cgdm->dm.drawLooseEdges = cgdm_drawLooseEdges; - cgdm->dm.drawFacesSolid = ccgDM_drawFacesSolid; - cgdm->dm.drawFacesColored = cgdm_drawFacesColored; - cgdm->dm.drawFacesTex = cgdm_drawFacesTex; - cgdm->dm.drawFacesGLSL = cgdm_drawFacesGLSL; - cgdm->dm.drawMappedFaces = ccgDM_drawMappedFaces; - cgdm->dm.drawMappedFacesTex = cgdm_drawMappedFacesTex; - cgdm->dm.drawMappedFacesGLSL = cgdm_drawMappedFacesGLSL; - cgdm->dm.drawUVEdges = cgdm_drawUVEdges; + ccgdm->dm.drawVerts = ccgDM_drawVerts; + ccgdm->dm.drawEdges = ccgDM_drawEdges; + ccgdm->dm.drawLooseEdges = ccgDM_drawLooseEdges; + ccgdm->dm.drawFacesSolid = ccgDM_drawFacesSolid; + ccgdm->dm.drawFacesColored = cgdm_drawFacesColored; + ccgdm->dm.drawFacesTex = cgdm_drawFacesTex; + ccgdm->dm.drawFacesGLSL = cgdm_drawFacesGLSL; + ccgdm->dm.drawMappedFaces = ccgDM_drawMappedFaces; + ccgdm->dm.drawMappedFacesTex = cgdm_drawMappedFacesTex; + ccgdm->dm.drawMappedFacesGLSL = cgdm_drawMappedFacesGLSL; + ccgdm->dm.drawUVEdges = cgdm_drawUVEdges; - cgdm->dm.drawMappedEdgesInterp = cgdm_drawMappedEdgesInterp; - cgdm->dm.drawMappedEdges = cgdm_drawMappedEdges; + ccgdm->dm.drawMappedEdgesInterp = cgdm_drawMappedEdgesInterp; + ccgdm->dm.drawMappedEdges = cgdm_drawMappedEdges; - cgdm->dm.release = cgdm_release; + ccgdm->dm.release = cgdm_release; - cgdm->ss = ss; - cgdm->drawInteriorEdges = drawInteriorEdges; - cgdm->useSubsurfUv = useSubsurfUv; + ccgdm->ss = ss; + ccgdm->drawInteriorEdges = drawInteriorEdges; + ccgdm->useSubsurfUv = useSubsurfUv; totvert = ccgSubSurf_getNumVerts(ss); - cgdm->vertMap = MEM_mallocN(totvert * sizeof(*cgdm->vertMap), "vertMap"); + ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap"); vi = ccgSubSurf_getVertIterator(ss); for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) { CCGVert *v = ccgVertIterator_getCurrent(vi); - cgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))].vert = v; + ccgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))].vert = v; } ccgVertIterator_free(vi); totedge = ccgSubSurf_getNumEdges(ss); - cgdm->edgeMap = MEM_mallocN(totedge * sizeof(*cgdm->edgeMap), "edgeMap"); + ccgdm->edgeMap = MEM_mallocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap"); ei = ccgSubSurf_getEdgeIterator(ss); for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { CCGEdge *e = ccgEdgeIterator_getCurrent(ei); - cgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e; + ccgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e; } totface = ccgSubSurf_getNumFaces(ss); - cgdm->faceMap = MEM_mallocN(totface * sizeof(*cgdm->faceMap), "faceMap"); + ccgdm->faceMap = MEM_mallocN(totface * sizeof(*ccgdm->faceMap), "faceMap"); fi = ccgSubSurf_getFaceIterator(ss); for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) { CCGFace *f = ccgFaceIterator_getCurrent(fi); - cgdm->faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f))].face = f; + ccgdm->faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f))].face = f; } ccgFaceIterator_free(fi); - cgdm->reverseFaceMap = MEM_callocN(sizeof(int)*ccgSubSurf_getNumFinalFaces(ss), "reverseFaceMap"); + ccgdm->reverseFaceMap = MEM_callocN(sizeof(int)*ccgSubSurf_getNumFinalFaces(ss), "reverseFaceMap"); edgeSize = ccgSubSurf_getEdgeSize(ss); gridSize = ccgSubSurf_getGridSize(ss); @@ -3078,28 +3180,27 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY); /*CDDM hack*/ - edgeFlags = cgdm->edgeFlags = MEM_callocN(sizeof(short)*totedge, "faceFlags"); - faceFlags = cgdm->faceFlags = MEM_callocN(sizeof(char)*2*totface, "faceFlags"); + edgeFlags = ccgdm->edgeFlags = MEM_callocN(sizeof(short)*totedge, "faceFlags"); + faceFlags = ccgdm->faceFlags = MEM_callocN(sizeof(char)*2*totface, "faceFlags"); - vertOrigIndex = DM_get_vert_data_layer(&cgdm->dm, CD_ORIGINDEX); + vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX); /*edgeOrigIndex = DM_get_edge_data_layer(&cgdm->dm, CD_ORIGINDEX);*/ - faceOrigIndex = DM_get_tessface_data_layer(&cgdm->dm, CD_ORIGINDEX); + faceOrigIndex = DM_get_tessface_data_layer(&ccgdm->dm, CD_ORIGINDEX); - polyOrigIndex = DM_get_face_data_layer(&cgdm->dm, CD_ORIGINDEX); + polyOrigIndex = DM_get_face_data_layer(&ccgdm->dm, CD_ORIGINDEX); - if (!CustomData_has_layer(&cgdm->dm.faceData, CD_MCOL)) - DM_add_tessface_layer(&cgdm->dm, CD_MCOL, CD_CALLOC, NULL); + if (!CustomData_has_layer(&ccgdm->dm.faceData, CD_MCOL)) + DM_add_tessface_layer(&ccgdm->dm, CD_MCOL, CD_CALLOC, NULL); - mcol = DM_get_tessface_data_layer(&cgdm->dm, CD_MCOL); - has_edge_origindex = CustomData_has_layer(&cgdm->dm.edgeData, CD_ORIGINDEX); + mcol = DM_get_tessface_data_layer(&ccgdm->dm, CD_MCOL); + has_edge_origindex = CustomData_has_layer(&ccgdm->dm.edgeData, CD_ORIGINDEX); faceNum = 0; loopindex = loopindex2 = 0; //current loop index for (index = 0; index < totface; index++) { - CCGFace *f = cgdm->faceMap[index].face; + CCGFace *f = ccgdm->faceMap[index].face; int numVerts = ccgSubSurf_getFaceNumVerts(f); int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges); - int mapIndex = ccgDM_getFaceMapIndex(ss, f); int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f)); int g2_wid = gridCuts+2; float *w2; @@ -3107,9 +3208,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, w = get_ss_weights(&wtable, gridCuts, numVerts); - cgdm->faceMap[index].startVert = vertNum; - cgdm->faceMap[index].startEdge = edgeNum; - cgdm->faceMap[index].startFace = faceNum; + ccgdm->faceMap[index].startVert = vertNum; + ccgdm->faceMap[index].startEdge = edgeNum; + ccgdm->faceMap[index].startFace = faceNum; faceFlags[0] = mpoly[origIndex].flag; faceFlags[1] = mpoly[origIndex].mat_nr; @@ -3135,7 +3236,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, /*I think this is for interpolating the center vert?*/ w2 = w; // + numVerts*(g2_wid-1)*(g2_wid-1); //numVerts*((g2_wid-1)*g2_wid+g2_wid-1); - DM_interp_vert_data(dm, &cgdm->dm, vertidx, w2, + DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2, numVerts, vertNum); if (vertOrigIndex) { *vertOrigIndex = ORIGINDEX_NONE; @@ -3148,7 +3249,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, for(s = 0; s < numVerts; s++) { for(x = 1; x < gridFaces; x++) { w2 = w + s*numVerts*g2_wid*g2_wid + x*numVerts; - DM_interp_vert_data(dm, &cgdm->dm, vertidx, w2, + DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2, numVerts, vertNum); if (vertOrigIndex) { @@ -3165,7 +3266,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, for(y = 1; y < gridFaces; y++) { for(x = 1; x < gridFaces; x++) { w2 = w + s*numVerts*g2_wid*g2_wid + (y*g2_wid+x)*numVerts; - DM_interp_vert_data(dm, &cgdm->dm, vertidx, w2, + DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2, numVerts, vertNum); if (vertOrigIndex) { @@ -3180,7 +3281,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, if (has_edge_origindex) { for(i = 0; i < numFinalEdges; ++i) - *(int *)DM_get_edge_data(&cgdm->dm, edgeNum + i, + *(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i, CD_ORIGINDEX) = ORIGINDEX_NONE; } @@ -3189,31 +3290,31 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, for (y=0; y<gridFaces; y++) { for (x=0; x<gridFaces; x++) { w2 = w + s*numVerts*g2_wid*g2_wid + (y*g2_wid+x)*numVerts; - CustomData_interp(&dm->loopData, &cgdm->dm.loopData, + CustomData_interp(&dm->loopData, &ccgdm->dm.loopData, loopidx, w2, NULL, numVerts, loopindex2); loopindex2++; w2 = w + s*numVerts*g2_wid*g2_wid + ((y+1)*g2_wid+(x))*numVerts; - CustomData_interp(&dm->loopData, &cgdm->dm.loopData, + CustomData_interp(&dm->loopData, &ccgdm->dm.loopData, loopidx, w2, NULL, numVerts, loopindex2); loopindex2++; w2 = w + s*numVerts*g2_wid*g2_wid + ((y+1)*g2_wid+(x+1))*numVerts; - CustomData_interp(&dm->loopData, &cgdm->dm.loopData, + CustomData_interp(&dm->loopData, &ccgdm->dm.loopData, loopidx, w2, NULL, numVerts, loopindex2); loopindex2++; w2 = w + s*numVerts*g2_wid*g2_wid + ((y)*g2_wid+(x+1))*numVerts; - CustomData_interp(&dm->loopData, &cgdm->dm.loopData, + CustomData_interp(&dm->loopData, &ccgdm->dm.loopData, loopidx, w2, NULL, numVerts, loopindex2); loopindex2++; /*copy over poly data, e.g. mtexpoly*/ - CustomData_copy_data(&dm->polyData, &cgdm->dm.polyData, origIndex, faceNum, 1); + CustomData_copy_data(&dm->polyData, &ccgdm->dm.polyData, origIndex, faceNum, 1); /*generate tesselated face data used for drawing*/ - ccg_loops_to_corners(&cgdm->dm.faceData, &cgdm->dm.loopData, - &cgdm->dm.polyData, loopindex2-4, faceNum, faceNum, numTex, numCol); + ccg_loops_to_corners(&ccgdm->dm.faceData, &ccgdm->dm.loopData, + &ccgdm->dm.polyData, loopindex2-4, faceNum, faceNum, numTex, numCol); /*set original index data*/ if (faceOrigIndex) { @@ -3225,7 +3326,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, polyOrigIndex++; } - cgdm->reverseFaceMap[faceNum] = index; + ccgdm->reverseFaceMap[faceNum] = index; faceNum++; } @@ -3236,7 +3337,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, } for(index = 0; index < totedge; ++index) { - CCGEdge *e = cgdm->edgeMap[index].edge; + CCGEdge *e = ccgdm->edgeMap[index].edge; int numFinalEdges = edgeSize - 1; int mapIndex = ccgDM_getEdgeMapIndex(ss, e); int x; @@ -3249,8 +3350,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, v = ccgSubSurf_getEdgeVert1(e); vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v)); - cgdm->edgeMap[index].startVert = vertNum; - cgdm->edgeMap[index].startEdge = edgeNum; + ccgdm->edgeMap[index].startVert = vertNum; + ccgdm->edgeMap[index].startEdge = edgeNum; if(edgeIdx >= 0 && edgeFlags) edgeFlags[edgeIdx] = medge[edgeIdx].flag; @@ -3262,7 +3363,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, float w[2]; w[1] = (float) x / (edgeSize - 1); w[0] = 1 - w[1]; - DM_interp_vert_data(dm, &cgdm->dm, vertIdx, w, 2, vertNum); + DM_interp_vert_data(dm, &ccgdm->dm, vertIdx, w, 2, vertNum); if (vertOrigIndex) { *vertOrigIndex = ORIGINDEX_NONE; ++vertOrigIndex; @@ -3272,7 +3373,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, for(i = 0; i < numFinalEdges; ++i) { if (has_edge_origindex) { - *(int *)DM_get_edge_data(&cgdm->dm, edgeNum + i, + *(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i, CD_ORIGINDEX) = mapIndex; } } @@ -3281,18 +3382,18 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, } for(index = 0; index < totvert; ++index) { - CCGVert *v = cgdm->vertMap[index].vert; - int mapIndex = ccgDM_getVertMapIndex(cgdm->ss, v); + CCGVert *v = ccgdm->vertMap[index].vert; + int mapIndex = ccgDM_getVertMapIndex(ccgdm->ss, v); int vidx; vidx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v)); - cgdm->vertMap[index].startVert = vertNum; + ccgdm->vertMap[index].startVert = vertNum; /* set the vert base vert */ *((int*) ccgSubSurf_getVertUserData(ss, v)) = vertNum; - DM_copy_vert_data(dm, &cgdm->dm, vidx, vertNum, 1); + DM_copy_vert_data(dm, &ccgdm->dm, vidx, vertNum, 1); if (vertOrigIndex) { *vertOrigIndex = mapIndex; @@ -3301,32 +3402,32 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, ++vertNum; } - cgdm->dm.numVertData = vertNum; - cgdm->dm.numEdgeData = edgeNum; - cgdm->dm.numFaceData = faceNum; - cgdm->dm.numLoopData = loopindex2; - cgdm->dm.numPolyData = faceNum; + ccgdm->dm.numVertData = vertNum; + ccgdm->dm.numEdgeData = edgeNum; + ccgdm->dm.numFaceData = faceNum; + ccgdm->dm.numLoopData = loopindex2; + ccgdm->dm.numPolyData = faceNum; BLI_array_free(vertidx); BLI_array_free(loopidx); free_ss_weights(&wtable); - cgdm->ehash = BLI_edgehash_new(); - for (i=0; i<cgdm->dm.numEdgeData; i++) { - cgdm_getFinalEdge((DerivedMesh*)cgdm, i, &medge2); - BLI_edgehash_insert(cgdm->ehash, medge2.v1, medge2.v2, SET_INT_IN_POINTER(i)); + ccgdm->ehash = BLI_edgehash_new(); + for (i=0; i<ccgdm->dm.numEdgeData; i++) { + ccgDM_getFinalEdge((DerivedMesh*)ccgdm, i, &medge2); + BLI_edgehash_insert(ccgdm->ehash, medge2.v1, medge2.v2, SET_INT_IN_POINTER(i)); } - return cgdm; + return ccgdm; } /***/ struct DerivedMesh *subsurf_make_derived_from_derived( - struct DerivedMesh *dm, - struct SubsurfModifierData *smd, - int useRenderParams, float (*vertCos)[3], - int isFinalCalc, int editMode) + struct DerivedMesh *dm, + struct SubsurfModifierData *smd, + int useRenderParams, float (*vertCos)[3], + int isFinalCalc, int editMode) { int useSimple = smd->subdivType == ME_SIMPLE_SUBSURF; int useAging = smd->flags & eSubsurfModifierFlag_DebugIncr; @@ -3338,12 +3439,12 @@ struct DerivedMesh *subsurf_make_derived_from_derived( int levels= (smd->modifier.scene)? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels): smd->levels; smd->emCache = _getSubSurf(smd->emCache, levels, useAging, 0, - useSimple); + useSimple); ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple); result = getCCGDerivedMesh(smd->emCache, - drawInteriorEdges, - useSubsurfUv, dm); + drawInteriorEdges, + useSubsurfUv, dm); } else if(useRenderParams) { /* Do not use cache in render mode. */ CCGSubSurf *ss; @@ -3381,13 +3482,13 @@ struct DerivedMesh *subsurf_make_derived_from_derived( if(useIncremental && isFinalCalc) { smd->mCache = ss = _getSubSurf(smd->mCache, levels, - useAging, 0, useSimple); + useAging, 0, useSimple); ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple); result = getCCGDerivedMesh(smd->mCache, - drawInteriorEdges, - useSubsurfUv, dm); + drawInteriorEdges, + useSubsurfUv, dm); } else { if (smd->mCache && isFinalCalc) { ccgSubSurf_free(smd->mCache); @@ -3441,7 +3542,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) } for (i=0; i<numFaces; i++) { CCGFace *f = ccgSubSurf_getVertFace(v, i); - add_v3_v3v3(face_sum, face_sum, ccgSubSurf_getFaceCenterData(f)); + add_v3_v3(face_sum, ccgSubSurf_getFaceCenterData(f)); } /* ad-hoc correction for boundary vertices, to at least avoid them diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c index 59635d4d344..1b720c1adaa 100644 --- a/source/blender/blenkernel/intern/suggestions.c +++ b/source/blender/blenkernel/intern/suggestions.c @@ -32,9 +32,7 @@ #include <ctype.h> #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "DNA_text_types.h" -#include "BKE_text.h" #include "BKE_suggestions.h" /**********************/ diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 4dcc26827d0..e8328d0e622 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -37,8 +37,6 @@ #include "BLI_blenlib.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_constraint_types.h" #include "DNA_controller_types.h" #include "DNA_scene_types.h" @@ -50,7 +48,6 @@ #include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" -#include "BKE_node.h" #include "BKE_text.h" #include "BKE_utildefines.h" @@ -58,10 +55,6 @@ #include "BPY_extern.h" #endif -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - /***************/ /* How Texts should work @@ -187,10 +180,12 @@ Text *add_empty_text(char *name) ta->name= NULL; - init_undo_text(ta); + init_undo_text(ta); ta->nlines=1; - ta->flags= TXT_ISDIRTY | TXT_ISMEM | TXT_TABSTOSPACES; + ta->flags= TXT_ISDIRTY | TXT_ISMEM; + if((U.flag & USER_TXT_TABSTOSPACES_DISABLE)==0) + ta->flags |= TXT_TABSTOSPACES; ta->lines.first= ta->lines.last= NULL; ta->markers.first= ta->markers.last= NULL; @@ -237,15 +232,13 @@ int reopen_text(Text *text) int i, llen, len, res; unsigned char *buffer; TextLine *tmp; - char sfile[FILE_MAXFILE]; char str[FILE_MAXDIR+FILE_MAXFILE]; struct stat st; if (!text || !text->name) return 0; BLI_strncpy(str, text->name, FILE_MAXDIR+FILE_MAXFILE); - BLI_convertstringcode(str, G.sce); - BLI_split_dirfile_basic(str, NULL, sfile); + BLI_path_abs(str, G.sce); fp= fopen(str, "r"); if(fp==NULL) return 0; @@ -336,27 +329,26 @@ Text *add_text(char *file, const char *relpath) unsigned char *buffer; TextLine *tmp; Text *ta; - char sfile[FILE_MAXFILE]; char str[FILE_MAXDIR+FILE_MAXFILE]; struct stat st; BLI_strncpy(str, file, FILE_MAXDIR+FILE_MAXFILE); if (relpath) /* can be NULL (bg mode) */ - BLI_convertstringcode(str, relpath); - BLI_split_dirfile_basic(str, NULL, sfile); + BLI_path_abs(str, relpath); fp= fopen(str, "r"); if(fp==NULL) return NULL; - ta= alloc_libblock(&G.main->text, ID_TXT, sfile); + ta= alloc_libblock(&G.main->text, ID_TXT, BLI_path_basename(str)); ta->id.us= 1; ta->lines.first= ta->lines.last= NULL; ta->markers.first= ta->markers.last= NULL; ta->curl= ta->sell= NULL; - - ta->flags= TXT_TABSTOSPACES; - + + if((U.flag & USER_TXT_TABSTOSPACES_DISABLE)==0) + ta->flags= TXT_TABSTOSPACES; + fseek(fp, 0L, SEEK_END); len= ftell(fp); fseek(fp, 0L, SEEK_SET); diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 10fdbc7fa14..57816b7e470 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -42,28 +42,21 @@ #include "BLI_blenlib.h" #include "BLI_math.h" -#include "BLI_rand.h" #include "BLI_kdopbvh.h" -#include "DNA_texture_types.h" #include "DNA_key_types.h" #include "DNA_object_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" -#include "DNA_image_types.h" #include "DNA_world_types.h" #include "DNA_brush_types.h" #include "DNA_node_types.h" #include "DNA_color_types.h" -#include "DNA_scene_types.h" -#include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "BKE_plugin_types.h" - #include "BKE_utildefines.h" - #include "BKE_global.h" #include "BKE_main.h" @@ -73,7 +66,6 @@ #include "BKE_texture.h" #include "BKE_key.h" #include "BKE_icons.h" -#include "BKE_brush.h" #include "BKE_node.h" #include "BKE_animsys.h" @@ -253,7 +245,7 @@ void init_colorband(ColorBand *coba, int rangetype) coba->data[0].b= 0.0; coba->data[0].a= 0.0; - coba->data[1].r= 0.0; + coba->data[1].r= 1.0; coba->data[1].g= 1.0; coba->data[1].b= 1.0; coba->data[1].a= 1.0; @@ -459,6 +451,7 @@ void default_tex(Tex *tex) tex->nabla= 0.025; // also in do_versions tex->bright= 1.0; tex->contrast= 1.0; + tex->saturation= 1.0; tex->filtersize= 1.0; tex->rfac= 1.0; tex->gfac= 1.0; @@ -483,10 +476,10 @@ void default_tex(Tex *tex) tex->vn_coltype = 0; if (tex->env) { - tex->env->stype=ENV_STATIC; + tex->env->stype=ENV_ANIM; tex->env->clipsta=0.1; tex->env->clipend=100; - tex->env->cuberes=100; + tex->env->cuberes=600; tex->env->depth=0; } @@ -517,6 +510,27 @@ void default_tex(Tex *tex) tex->preview = NULL; } +void tex_set_type(Tex *tex, int type) +{ + switch(type) { + + case TEX_VOXELDATA: + if (tex->vd == NULL) + tex->vd = BKE_add_voxeldata(); + break; + case TEX_POINTDENSITY: + if (tex->pd == NULL) + tex->pd = BKE_add_pointdensity(); + break; + case TEX_ENVMAP: + if (tex->env == NULL) + tex->env = BKE_add_envmap(); + break; + } + + tex->type = type; +} + /* ------------------------------------------------------------------------- */ Tex *add_texture(const char *name) @@ -628,6 +642,8 @@ Tex *copy_texture(Tex *tex) if(texn->coba) texn->coba= MEM_dupallocN(texn->coba); if(texn->env) texn->env= BKE_copy_envmap(texn->env); + if(texn->pd) texn->pd= MEM_dupallocN(texn->pd); + if(texn->vd) texn->vd= MEM_dupallocN(texn->vd); if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview); @@ -651,9 +667,9 @@ void make_local_texture(Tex *tex) int a, local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(tex->id.lib==0) return; @@ -885,9 +901,15 @@ Tex *give_current_material_texture(Material *ma) } else { node= nodeGetActiveID(ma->nodetree, ID_MA); - if(node) + if(node) { ma= (Material*)node->id; + if(ma) { + mtex= ma->mtex[(int)(ma->texact)]; + if(mtex) tex= mtex->tex; + } + } } + return tex; } if(ma) { @@ -1040,10 +1062,11 @@ EnvMap *BKE_add_envmap(void) env= MEM_callocN(sizeof(EnvMap), "envmap"); env->type= ENV_CUBE; - env->stype= ENV_STATIC; + env->stype= ENV_ANIM; env->clipsta= 0.1; env->clipend= 100.0; - env->cuberes= 100; + env->cuberes= 600; + env->viewscale = 0.5; return env; } @@ -1110,6 +1133,7 @@ PointDensity *BKE_add_pointdensity(void) pd->totpoints = 0; pd->object = NULL; pd->psys = 0; + pd->psys_cache_space= TEX_PD_WORLDSPACE; return pd; } @@ -1148,7 +1172,8 @@ void BKE_free_pointdensity(PointDensity *pd) void BKE_free_voxeldatadata(struct VoxelData *vd) { if (vd->dataset) { - MEM_freeN(vd->dataset); + if(vd->file_format != TEX_VD_SMOKE) + MEM_freeN(vd->dataset); vd->dataset = NULL; } @@ -1172,6 +1197,8 @@ struct VoxelData *BKE_add_voxeldata(void) vd->int_multiplier = 1.0; vd->extend = TEX_CLIP; vd->object = NULL; + vd->cachedframe = -1; + vd->ok = 0; return vd; } diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index 87424dda04d..133f858e9ea 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -81,7 +81,7 @@ static struct bUnitDef buMetricLenDef[] = { {"decimetre", "decimetres", "dm", NULL, "10 Centimeters", 0.1, 0.0, B_UNIT_DEF_SUPPRESS}, {"centimeter", "centimeters", "cm", NULL, "Centimeters", 0.01, 0.0, B_UNIT_DEF_NONE}, {"millimeter", "millimeters", "mm", NULL, "Millimeters", 0.001, 0.0, B_UNIT_DEF_NONE}, - {"micrometer", "micrometers", "um", "µm", "Micrometers", 0.000001, 0.0, B_UNIT_DEF_NONE}, // micron too? + {"micrometer", "micrometers", "µm", "um", "Micrometers", 0.000001, 0.0, B_UNIT_DEF_NONE}, // micron too? /* These get displayed because of float precision problems in the transform header, * could work around, but for now probably people wont use these */ diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index fff0a08136b..6fb1c5ff70c 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -35,20 +35,10 @@ #include "MEM_guardedalloc.h" #include "DNA_world_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" -#include "DNA_object_types.h" -#include "DNA_camera_types.h" - - -#include "BLI_blenlib.h" -#include "BLI_math.h" - -#include "BKE_utildefines.h" #include "BKE_library.h" #include "BKE_animsys.h" -#include "BKE_world.h" #include "BKE_global.h" #include "BKE_main.h" #include "BKE_icons.h" @@ -57,10 +47,6 @@ #include "BPY_extern.h" #endif -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - void free_world(World *wrld) { MTex *mtex; @@ -86,12 +72,12 @@ World *add_world(char *name) wrld= alloc_libblock(&G.main->world, ID_WO, name); - wrld->horr= 0.25f; - wrld->horg= 0.25f; - wrld->horb= 0.25f; - wrld->zenr= 0.1f; - wrld->zeng= 0.1f; - wrld->zenb= 0.1f; + wrld->horr= 0.05f; + wrld->horg= 0.05f; + wrld->horb= 0.05f; + wrld->zenr= 0.01f; + wrld->zeng= 0.01f; + wrld->zenb= 0.01f; wrld->skytype= 0; wrld->stardist= 15.0f; wrld->starsize= 2.0f; @@ -110,6 +96,8 @@ World *add_world(char *name) wrld->ao_approx_error= 0.25f; wrld->preview = NULL; + wrld->miststa = 5.0f; + wrld->mistdist = 25.0f; return wrld; } @@ -145,9 +133,9 @@ void make_local_world(World *wrld) int local=0, lib=0; /* - only lib users: do nothing - * - only local users: set flag - * - mixed: make copy - */ + * - only local users: set flag + * - mixed: make copy + */ if(wrld->id.lib==0) return; if(wrld->id.us==1) { diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c index d67a79154d2..00614ef0f4f 100644 --- a/source/blender/blenkernel/intern/writeavi.c +++ b/source/blender/blenkernel/intern/writeavi.c @@ -75,11 +75,6 @@ bMovieHandle *BKE_get_movie_handle(int imtype) mh.get_movie_path = filepath_avi; /* do the platform specific handles */ -#ifdef __sgi - if (imtype == R_MOVIE) { - - } -#endif #if defined(_WIN32) && !defined(FREE_WINDOWS) if (imtype == R_AVICODEC) { //XXX mh.start_movie= start_avi_codec; @@ -124,12 +119,12 @@ static void filepath_avi (char *string, RenderData *rd) if (string==NULL) return; strcpy(string, rd->pic); - BLI_convertstringcode(string, G.sce); + BLI_path_abs(string, G.sce); BLI_make_existing_file(string); if (!BLI_testextensie(string, ".avi")) { - BLI_convertstringframe_range(string, rd->sfra, rd->efra, 4); + BLI_path_frame_range(string, rd->sfra, rd->efra, 4); strcat(string, ".avi"); } } diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index 6e94602c0c9..8ebf98ef930 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -69,10 +69,6 @@ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - extern void do_init_ffmpeg(); static int ffmpeg_type = 0; @@ -206,7 +202,7 @@ static const char** get_file_extensions(int format) } case FFMPEG_MPEG2: { static const char * rv[] = { ".dvd", ".vob", ".mpg", ".mpeg", - NULL }; + NULL }; return rv; } case FFMPEG_MPEG4: { @@ -271,7 +267,7 @@ static int write_video_frame(RenderData *rd, AVFrame* frame, ReportList *reports } outsize = avcodec_encode_video(c, video_buffer, video_buffersize, - frame); + frame); if (outsize != 0) { AVPacket packet; av_init_packet(&packet); @@ -366,7 +362,7 @@ static AVFrame* generate_video_frame(uint8_t* pixels, ReportList *reports) } if (c->pix_fmt != PIX_FMT_BGR32) { - sws_scale(img_convert_ctx, rgb_frame->data, + sws_scale(img_convert_ctx, (const uint8_t * const*) rgb_frame->data, rgb_frame->linesize, 0, c->height, current_frame->data, current_frame->linesize); delete_picture(rgb_frame); @@ -382,7 +378,7 @@ static void set_ffmpeg_property_option(AVCodecContext* c, IDProperty * prop) fprintf(stderr, "FFMPEG expert option: %s: ", prop->name); - strncpy(name, prop->name, 128); + BLI_strncpy(name, prop->name, sizeof(name)); param = strchr(name, ':'); @@ -446,7 +442,7 @@ static void set_ffmpeg_properties(RenderData *rd, AVCodecContext *c, const char /* prepare a video stream for the output file */ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContext* of, - int rectx, int recty) + int rectx, int recty) { AVStream* st; AVCodecContext* c; @@ -520,6 +516,12 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex /* arghhhh ... */ c->pix_fmt = PIX_FMT_YUV420P; } + + if (codec_id == CODEC_ID_H264) { + /* correct wrong default ffmpeg param which crash x264 */ + c->qmin=10; + c->qmax=51; + } if ((of->oformat->flags & AVFMT_GLOBALHEADER) // || !strcmp(of->oformat->name, "mp4") @@ -552,7 +554,7 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex video_buffersize = 2000000; video_buffer = (uint8_t*)MEM_mallocN(video_buffersize, - "FFMPEG video buffer"); + "FFMPEG video buffer"); current_frame = alloc_picture(c->pix_fmt, c->width, c->height); @@ -789,7 +791,7 @@ void filepath_ffmpeg(char* string, RenderData* rd) { if (!string || !exts) return; strcpy(string, rd->pic); - BLI_convertstringcode(string, G.sce); + BLI_path_abs(string, G.sce); BLI_make_existing_file(string); @@ -810,7 +812,7 @@ void filepath_ffmpeg(char* string, RenderData* rd) { if (!*fe) { strcat(string, autosplit); - BLI_convertstringframe_range(string, rd->sfra, rd->efra, 4); + BLI_path_frame_range(string, rd->sfra, rd->efra, 4); strcat(string, *exts); } else { *(string + strlen(string) - strlen(*fe)) = 0; @@ -1053,7 +1055,7 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int /* not all versions of ffmpeg include that, so here we go ... */ static const AVOption *my_av_find_opt(void *v, const char *name, - const char *unit, int mask, int flags){ + const char *unit, int mask, int flags){ AVClass *c= *(AVClass**)v; const AVOption *o= c->option; @@ -1078,7 +1080,7 @@ int ffmpeg_property_add_string(RenderData *rd, const char * type, const char * s avcodec_get_context_defaults(&c); - strncpy(name_, str, 128); + strncpy(name_, str, sizeof(name_)); name = name_; while (*name == ' ') name++; @@ -1242,7 +1244,8 @@ void ffmpeg_verify_image_type(RenderData *rd) rd->ffcodecdata.video_bitrate <= 1) { rd->ffcodecdata.codec = CODEC_ID_MPEG2VIDEO; - ffmpeg_set_preset(rd, FFMPEG_PRESET_DVD); + /* Don't set preset, disturbs render resolution. + * ffmpeg_set_preset(rd, FFMPEG_PRESET_DVD); */ } audio= 1; diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c index 20d858fffeb..0ec8837c0e7 100644 --- a/source/blender/blenkernel/intern/writeframeserver.c +++ b/source/blender/blenkernel/intern/writeframeserver.c @@ -1,4 +1,6 @@ /* + * $Id$ + * * Frameserver * Makes Blender accessible from TMPGenc directly using VFAPI (you can * use firefox too ;-) @@ -44,21 +46,14 @@ #include <stdlib.h> #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "DNA_userdef_types.h" #include "BKE_global.h" #include "BKE_report.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" #include "DNA_scene_types.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - static int sock; static int connsock; static int write_ppm; @@ -96,7 +91,7 @@ static int select_was_interrupted_by_signal() return (errno == EINTR); } -static int closesocket(int fd) +static int closesocket(int fd) { return close(fd); } @@ -143,10 +138,10 @@ int start_frameserver(struct Scene *scene, RenderData *rd, int rectx, int recty, return 1; } -static char index_page[] -= -"HTTP/1.1 200 OK\n" -"Content-Type: text/html\n\n" +static char index_page[] = +"HTTP/1.1 200 OK\r\n" +"Content-Type: text/html\r\n" +"\r\n" "<html><head><title>Blender Frameserver\n" "
\n"
 "

Blender Frameserver

\n" @@ -159,9 +154,10 @@ static char index_page[] "\n" "
\n"; -static char good_bye[] -= "HTTP/1.1 200 OK\n" -"Content-Type: text/html\n\n" +static char good_bye[] = +"HTTP/1.1 200 OK\r\n" +"Content-Type: text/html\r\n" +"\r\n" "Blender Frameserver\n" "
\n"
 "Render stopped. Goodbye
"; @@ -204,7 +200,7 @@ static int handle_request(RenderData *rd, char * req) *p = 0; if (strcmp(path, "/index.html") == 0 - || strcmp(path, "/") == 0) { + || strcmp(path, "/") == 0) { safe_puts(index_page); return -1; } @@ -219,13 +215,14 @@ static int handle_request(RenderData *rd, char * req) if (strcmp(path, "/info.txt") == 0) { char buf[4096]; - sprintf(buf, - "HTTP/1.1 200 OK\n" - "Content-Type: text/html\n\n" + sprintf(buf, + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n" + "\r\n" "start %d\n" "end %d\n" "width %d\n" - "height %d\n" + "height %d\n" "rate %d\n" "ratescale %d\n", rd->sfra, @@ -290,7 +287,7 @@ int frameserver_loop(RenderData *rd, ReportList *reports) tv.tv_sec = 10; tv.tv_usec = 0; - rval = select(connsock + 1, &readfds, NULL, NULL, &tv); + rval = select(connsock + 1, &readfds, NULL, NULL, &tv); if (rval > 0) { break; } else if (rval == 0) { @@ -320,10 +317,11 @@ static void serve_ppm(int *pixels, int rectx, int recty) int y; char header[1024]; - sprintf(header, - "HTTP/1.1 200 OK\n" - "Content-Type: image/ppm\n" - "Connection: close\n\n" + sprintf(header, + "HTTP/1.1 200 OK\r\n" + "Content-Type: image/ppm\r\n" + "Connection: close\r\n" + "\r\n" "P6\n" "# Creator: blender frameserver v0.0.1\n" "%d %d\n" @@ -346,7 +344,7 @@ static void serve_ppm(int *pixels, int rectx, int recty) target += 3; src += 4; } - safe_write((char*)row, 3 * rectx); + safe_write((char*)row, 3 * rectx); } free(row); closesocket(connsock); diff --git a/source/blender/blenlib/BLI_args.h b/source/blender/blenlib/BLI_args.h index d2bbdd1bf5f..cc4d65980c9 100644 --- a/source/blender/blenlib/BLI_args.h +++ b/source/blender/blenlib/BLI_args.h @@ -1,7 +1,7 @@ /** * A general argument parsing module * - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -41,12 +41,18 @@ typedef int (*BA_ArgCallback)(int argc, char **argv, void *data); struct bArgs *BLI_argsInit(int argc, char **argv); void BLI_argsFree(struct bArgs *ba); -/* pass starts at 1, -1 means valid all the time */ -void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data); -void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data); /* not case specific */ +/* pass starts at 1, -1 means valid all the time + * short_arg or long_arg can be null to specify no short or long versions + * */ +void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data); +/* short_case and long_case specify if those arguments are case specific */ +void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data); void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *data); +void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg); +void BLI_argsPrintOtherDoc(struct bArgs *ba); + void BLI_argsPrint(struct bArgs *ba); char **BLI_argsArgv(struct bArgs *ba); diff --git a/source/blender/blenlib/BLI_bfile.h b/source/blender/blenlib/BLI_bfile.h index 8c93e03c881..71e771fb4fa 100644 --- a/source/blender/blenlib/BLI_bfile.h +++ b/source/blender/blenlib/BLI_bfile.h @@ -1,4 +1,5 @@ -/* +/* -*- indent-tabs-mode:t; tab-width:4; -*- + * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,33 +34,26 @@ /** Defines for the bflags param. */ -/* Special handling: */ +/* Special handling, pick one of: */ /* For "symmetry" of flags */ #define BFILE_NORMAL (0) /* No supervision, just translate // if needed, RISKY */ #define BFILE_RAW (1<<0) -/* Path is based in env vars specified by "envvars" */ -#define BFILE_CONFIG (1<<1) /* Path is for current session temp files */ -#define BFILE_TEMP (1<<2) +#define BFILE_TEMP (1<<1) +/* Path is based in env vars of matching name */ +#define BFILE_CONFIG_BASE (1<<2) +#define BFILE_CONFIG_DATAFILES (1<<3) +#define BFILE_CONFIG_PYTHON (1<<4) +#define BFILE_CONFIG_PLUGINS (1<<5) /* Config handling, special cases: */ -#define BFILE_USERONLY (1<<3) -#define BFILE_SYSONLY (1<<4) +#define BFILE_USERONLY (1<<6) +#define BFILE_SYSONLY (1<<7) /* Compression to apply on close: */ -#define BFILE_GZIP (1<<5) - -/** - For the envvars param. - */ -typedef enum BEnvVarFamilies { - BENV_NONE, - BENV_BASE, - BENV_DATAFILES, - BENV_PYTHON, - BENV_PLUGINS -} BEnvVarFam; +#define BFILE_GZIP (1<<8) +#define BFILE_LZMA (1<<9) /** File descriptor for Blender abstracted file access. @@ -70,7 +64,6 @@ typedef struct { /* Anything below should not be touched directly */ int uflags; /* Special options requested by upper level, copy of bflags */ - BEnvVarFam evars; /* What kind of file, describe the env vars to use */ char *fpath; /* Final/requested path name */ char *tpath; /* Temp path name if applicable */ int classf; /* Own flags, common classification of open and fopen */ @@ -80,12 +73,12 @@ typedef struct { /** Open a BFILE* with fopen()-like syntax. */ -BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, BEnvVarFam envvars); +BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, const char *relpath); /** Open a BFILE* with open()-like syntax. */ -BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags, BEnvVarFam envvars); +BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags, const char *relpath); /** Get the FILE* associated with the BFILE*. diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h index 8b0625fc282..3028161734c 100644 --- a/source/blender/blenlib/BLI_blenlib.h +++ b/source/blender/blenlib/BLI_blenlib.h @@ -74,8 +74,6 @@ extern "C" { #include "BLI_listbase.h" -#include "BLI_dynamiclist.h" - #include "BLI_string.h" #include "BLI_path_util.h" diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h index abcd58b7483..72489a171b9 100644 --- a/source/blender/blenlib/BLI_bpath.h +++ b/source/blender/blenlib/BLI_bpath.h @@ -29,6 +29,9 @@ /* Based on ghash, difference is ghash is not a fixed size, * so for BPath we dont need to malloc */ +#ifndef BLI_BPATH_H +#define BLI_BPATH_H + struct BPathIteratorSeqData { int totseq; int seq; @@ -72,3 +75,5 @@ void checkMissingFiles(char *basepath, ReportList *reports); void makeFilesRelative(char *basepath, ReportList *reports); void makeFilesAbsolute(char *basepath, ReportList *reports); void findMissingFiles(char *basepath, char *str); + +#endif // BLI_BPATH_H diff --git a/source/blender/imbuf/intern/IMB_divers.h b/source/blender/blenlib/BLI_cpu.h similarity index 68% rename from source/blender/imbuf/intern/IMB_divers.h rename to source/blender/blenlib/BLI_cpu.h index 5ab0ce25484..d809f1cc594 100644 --- a/source/blender/imbuf/intern/IMB_divers.h +++ b/source/blender/blenlib/BLI_cpu.h @@ -1,5 +1,4 @@ /* - * divers.h * * $Id$ * @@ -19,27 +18,13 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * * ***** END GPL LICENSE BLOCK ***** */ -/** - * \file IMB_divers.h - * \ingroup imbuf - * \brief Function declarations for divers.c - */ -#ifndef IMB_DIVERS_H -#define IMB_DIVERS_H +#ifndef BLI_CPU_H +#define BLI_CPU_H -struct ImBuf; - -void imb_checkncols(struct ImBuf *ibuf); +int BLI_cpu_support_sse2(void); #endif diff --git a/source/blender/blenlib/BLI_dynamiclist.h b/source/blender/blenlib/BLI_dynamiclist.h deleted file mode 100644 index 1334d830aff..00000000000 --- a/source/blender/blenlib/BLI_dynamiclist.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jiri Hnidek. - * - * Documentation of Two way dynamic list with access array can be found at: - * - * http://wiki.blender.org/bin/view.pl/Blenderwiki/DynamicListWithAccessArray - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifndef BLI_DYNAMIC_LIST_H -#define BLI_DYNAMIC_LIST_H - -#include "DNA_listBase.h" - -/* - * Access array using realloc - */ -typedef struct DynamicArray{ - unsigned int count; /* count of items in list */ - unsigned int max_item_index; /* max available index */ - unsigned int last_item_index; /* max used index */ - void **items; /* dynamicaly allocated array of pointers - pointing at items in list */ -} DynamicArray; - -/* - * Two way dynamic list with access array - */ -typedef struct DynamicList { - struct DynamicArray da; /* access array */ - struct ListBase lb; /* two way linked dynamic list */ -} DynamicList; - -/* note: 'index' is a string.h function, do not use in includes */ -struct DynamicList *BLI_dlist_from_listbase(struct ListBase *); -struct ListBase *BLI_listbase_from_dlist(struct DynamicList *, struct ListBase *); -void * BLI_dlist_find_link(struct DynamicList *, unsigned int); -unsigned int BLI_count_items(struct DynamicList *); -void BLI_dlist_free_item(struct DynamicList *, unsigned int); -void BLI_dlist_rem_item(struct DynamicList *, unsigned int); -void * BLI_dlist_add_item_index(struct DynamicList *, void *, unsigned int); -void BLI_dlist_destroy(struct DynamicList *); -void BLI_dlist_init(struct DynamicList *); -void BLI_dlist_reinit(struct DynamicList *); - -#endif diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h index e6ea3559e8c..6c98d30e4b1 100644 --- a/source/blender/blenlib/BLI_fileops.h +++ b/source/blender/blenlib/BLI_fileops.h @@ -54,7 +54,6 @@ char *BLI_last_slash(const char *string); int BLI_add_slash(char *string); void BLI_del_slash(char *string); char *first_slash(char *string); -const char *BLI_short_filename(const char *string); /* only for the sane unix world: direct calls to system functions :( */ #ifndef WIN32 diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h index 2c122104f1f..1dffb285451 100644 --- a/source/blender/blenlib/BLI_fnmatch.h +++ b/source/blender/blenlib/BLI_fnmatch.h @@ -47,7 +47,7 @@ extern "C" { #define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ #define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ #define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ - + #if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) #define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ #define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h index 56f1f40be33..08330c6d3f4 100644 --- a/source/blender/blenlib/BLI_ghash.h +++ b/source/blender/blenlib/BLI_ghash.h @@ -72,8 +72,8 @@ typedef struct GHashIterator { struct Entry *curEntry; } GHashIterator; -GHash* BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp); -void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp); +GHash* BLI_ghash_new (GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info); +void BLI_ghash_free (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp); int BLI_ghash_size (GHash *gh); diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h index fc5469df23a..d9e3d7e42c6 100644 --- a/source/blender/blenlib/BLI_kdopbvh.h +++ b/source/blender/blenlib/BLI_kdopbvh.h @@ -32,6 +32,10 @@ #ifndef BLI_KDOPBVH_H #define BLI_KDOPBVH_H +#ifdef __cplusplus +extern "C" { +#endif + #include struct BVHTree; @@ -100,6 +104,9 @@ float BLI_bvhtree_bb_raycast(float *bv, float *light_start, float *light_end, fl /* range query */ int BLI_bvhtree_range_query(BVHTree *tree, const float *co, float radius, BVHTree_RangeQuery callback, void *userdata); +#ifdef __cplusplus +} +#endif #endif // BLI_KDOPBVH_H diff --git a/source/blender/blenlib/BLI_linklist.h b/source/blender/blenlib/BLI_linklist.h index 2ce40cf6231..b10d48e3ee6 100644 --- a/source/blender/blenlib/BLI_linklist.h +++ b/source/blender/blenlib/BLI_linklist.h @@ -47,11 +47,14 @@ typedef struct LinkNode { int BLI_linklist_length (struct LinkNode *list); int BLI_linklist_index (struct LinkNode *list, void *ptr); +struct LinkNode *BLI_linklist_find (struct LinkNode *list, int index); + void BLI_linklist_reverse (struct LinkNode **listp); void BLI_linklist_prepend (struct LinkNode **listp, void *ptr); void BLI_linklist_append (struct LinkNode **listp, void *ptr); void BLI_linklist_prepend_arena (struct LinkNode **listp, void *ptr, struct MemArena *ma); +void BLI_linklist_insert_after (struct LinkNode **listp, void *ptr); void BLI_linklist_free (struct LinkNode *list, LinkNodeFreeFP freefunc); void BLI_linklist_apply (struct LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata); diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h index f2fec215c2b..599487354c3 100644 --- a/source/blender/blenlib/BLI_listbase.h +++ b/source/blender/blenlib/BLI_listbase.h @@ -32,9 +32,9 @@ #ifndef BLI_LISTBASE_H #define BLI_LISTBASE_H -//#include "DNA_listbase.h" -struct ListBase; -struct LinkData; +#include "DNA_listBase.h" +//struct ListBase; +//struct LinkData; #ifdef __cplusplus extern "C" { @@ -49,6 +49,7 @@ int BLI_findstringindex(struct ListBase *listbase, const char *id, int offset); void BLI_freelistN(struct ListBase *listbase); void BLI_addtail(struct ListBase *listbase, void *vlink); void BLI_remlink(struct ListBase *listbase, void *vlink); +int BLI_remlink_safe(struct ListBase *listbase, void *vlink); void BLI_addhead(struct ListBase *listbase, void *vlink); void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink); diff --git a/source/blender/blenlib/BLI_math.h b/source/blender/blenlib/BLI_math.h index 341a3a32934..d0fb530e349 100644 --- a/source/blender/blenlib/BLI_math.h +++ b/source/blender/blenlib/BLI_math.h @@ -55,10 +55,10 @@ #include "BLI_math_base.h" #include "BLI_math_color.h" -#include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" #include "BLI_math_vector.h" +#include "BLI_math_geom.h" #endif /* BLI_MATH */ diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h index c143c44c594..bb20cb7c8e1 100644 --- a/source/blender/blenlib/BLI_math_base.h +++ b/source/blender/blenlib/BLI_math_base.h @@ -115,6 +115,9 @@ extern "C" { #ifndef fmodf #define fmodf(a, b) ((float)fmod(a, b)) #endif +#ifndef hypotf +#define hypotf(a, b) ((float)hypot(a, b)) +#endif #ifdef WIN32 #ifndef FREE_WINDOWS diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h index 8c84df9c245..72724c1c0f7 100644 --- a/source/blender/blenlib/BLI_math_color.h +++ b/source/blender/blenlib/BLI_math_color.h @@ -41,20 +41,25 @@ extern "C" { #define BLI_PR_NONE 0 #define BLI_PR_SRGB 1 #define BLI_PR_REC709 2 + +/* YCbCr */ +#define BLI_YCC_ITU_BT601 0 +#define BLI_YCC_ITU_BT709 1 +#define BLI_YCC_JFIF_0_255 2 /******************* Conversion to RGB ********************/ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b); void hex_to_rgb(char *hexcol, float *r, float *g, float *b); void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb); -void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb); +void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, int colorspace); void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace); void cpack_to_rgb(unsigned int col, float *r, float *g, float *b); /***************** Conversion from RGB ********************/ void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv); -void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr); +void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace); void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv); unsigned int rgb_to_cpack(float r, float g, float b); unsigned int hsv_to_cpack(float h, float s, float v); diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index 560a5b1abc9..5d84de7531a 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -32,6 +32,12 @@ extern "C" { #endif +#include "BLI_math_inline.h" + +#ifdef BLI_MATH_INLINE +#include "intern/math_geom_inline.c" +#endif + /********************************** Polygons *********************************/ void cent_tri_v3(float r[3], float a[3], float b[3], float c[3]); @@ -146,6 +152,8 @@ void orthographic_m4(float mat[4][4], float left, float right, int box_clip_bounds_m4(float boundbox[2][3], float bounds[4], float winmat[4][4]); +void box_minmax_bounds_m4(float min[3], float max[3], + float boundbox[2][3], float mat[4][4]); /********************************** Mapping **********************************/ @@ -165,11 +173,33 @@ void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang); -/********************************* vector clouds******************************/ +/******************************** Vector Clouds ******************************/ +void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight, + float (*rpos)[3], float *rweight, + float lloc[3],float rloc[3],float lrot[3][3],float lscale[3][3]); -void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight,float (*rpos)[3], float *rweight, - float lloc[3],float rloc[3],float lrot[3][3],float lscale[3][3]); +/****************************** Spherical Harmonics *************************/ + +/* Uses 2nd order SH => 9 coefficients, stored in this order: + 0 = (0,0), + 1 = (1,-1), 2 = (1,0), 3 = (1,1), + 4 = (2,-2), 5 = (2,-1), 6 = (2,0), 7 = (2,1), 8 = (2,2) */ + +MINLINE void zero_sh(float r[9]); +MINLINE void copy_sh_sh(float r[9], float a[9]); +MINLINE void mul_sh_fl(float r[9], float f); +MINLINE void add_sh_shsh(float r[9], float a[9], float b[9]); + +MINLINE float eval_shv3(float r[9], float v[3]); +MINLINE float diffuse_shv3(float r[9], float v[3]); +MINLINE void vec_fac_to_sh(float r[9], float v[3], float f); +MINLINE void madd_sh_shfl(float r[9], float sh[3], float f); + +/********************************* Form Factor *******************************/ + +float form_factor_hemi_poly(float p[3], float n[3], + float v1[3], float v2[3], float v3[3], float v4[3]); #ifdef __cplusplus } diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h index c762144a4b8..d002c0880b2 100644 --- a/source/blender/blenlib/BLI_math_inline.h +++ b/source/blender/blenlib/BLI_math_inline.h @@ -38,11 +38,14 @@ extern "C" { #ifdef BLI_MATH_INLINE #ifdef _MSC_VER #define MINLINE static __forceinline +#define MALWAYS_INLINE MINLINE #else #define MINLINE static inline +#define MALWAYS_INLINE static __attribute__((always_inline)) #endif #else #define MINLINE +#define MALWAYS_INLINE #endif #ifdef __cplusplus diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 8f897fdd5d6..77ebcb24975 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -78,7 +78,8 @@ void mul_serie_m4(float R[4][4], void mul_m4_v3(float M[4][4], float r[3]); void mul_v3_m4v3(float r[3], float M[4][4], float v[3]); void mul_mat3_m4_v3(float M[4][4], float r[3]); -void mul_m4_v4(float M[4][4], float r[3]); +void mul_m4_v4(float M[4][4], float r[4]); +void mul_v4_m4v4(float r[4], float M[4][4], float v[4]); void mul_project_m4_v4(float M[4][4], float r[3]); void mul_m3_v3(float M[3][3], float r[3]); @@ -121,6 +122,9 @@ float determinant_m3( float g, float h, float i); float determinant_m4(float A[4][4]); +void svd_m4(float U[4][4], float s[4], float V[4][4], float A[4][4]); +void pseudoinverse_m4_m4(float Ainv[4][4], float A[4][4], float epsilon); + /****************************** Transformations ******************************/ void scale_m3_fl(float R[3][3], float scale); diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index 32e6eeba452..388a9176d53 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -166,6 +166,9 @@ void mul_v3m3_dq(float r[3], float R[3][3], DualQuat *dq); void mat4_to_dquat(DualQuat *r, float base[4][4], float M[4][4]); void dquat_to_mat4(float R[4][4], DualQuat *dq); +float lens_to_angle(float lens); +float angle_to_lens(float angle); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index ee7deb19544..d06c0d1410b 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -32,6 +32,8 @@ extern "C" { #endif +#include "BLI_math_inline.h" + #ifdef BLI_MATH_INLINE #include "intern/math_vector_inline.c" #else @@ -46,7 +48,7 @@ MINLINE void zero_v4(float r[4]); MINLINE void copy_v2_v2(float r[2], const float a[2]); MINLINE void copy_v3_v3(float r[3], const float a[3]); -MINLINE void copy_v4_v4(float r[4], float a[4]); +MINLINE void copy_v4_v4(float r[4], const float a[4]); MINLINE void swap_v2_v2(float a[2], float b[2]); MINLINE void swap_v3_v3(float a[3], float b[3]); @@ -54,14 +56,14 @@ MINLINE void swap_v4_v4(float a[4], float b[4]); /********************************* Arithmetic ********************************/ -MINLINE void add_v2_v2(float r[2], float a[2]); -MINLINE void add_v2_v2v2(float r[2], float a[2], float b[2]); -MINLINE void add_v3_v3(float r[3], float a[3]); -MINLINE void add_v3_v3v3(float r[3], float a[3], float b[3]); +MINLINE void add_v2_v2(float r[2], const float a[2]); +MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2]); +MINLINE void add_v3_v3(float r[3], const float a[3]); +MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3]); -MINLINE void sub_v2_v2(float r[2], float a[2]); -MINLINE void sub_v2_v2v2(float r[2], float a[2], float b[2]); -MINLINE void sub_v3_v3(float r[3], float a[3]); +MINLINE void sub_v2_v2(float r[2], const float a[2]); +MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2]); +MINLINE void sub_v3_v3(float r[3], const float a[3]); MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3]); MINLINE void mul_v2_fl(float r[2], float f); @@ -69,14 +71,16 @@ MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f); MINLINE void mul_v3_fl(float r[3], float f); MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f); MINLINE void mul_v2_v2(float r[2], const float a[2]); -MINLINE void mul_v3_v3(float r[3], float a[3]); -MINLINE void mul_v3_v3v3(float r[3], float a[3], float b[3]); +MINLINE void mul_v3_v3(float r[3], const float a[3]); +MINLINE void mul_v3_v3v3(float r[3], const float a[3], const float b[3]); +MINLINE void mul_v4_fl(float r[4], float f); -MINLINE void madd_v3_v3fl(float r[3], float a[3], float f); -MINLINE void madd_v3_v3v3(float r[3], float a[3], float b[3]); -MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], const float f); -MINLINE void madd_v3_v3v3fl(float r[3], float a[3], float b[3], float f); -MINLINE void madd_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]); +MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f); +MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3]); +MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f); +MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f); +MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]); +MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f); MINLINE void negate_v3(float r[3]); MINLINE void negate_v3_v3(float r[3], const float a[3]); @@ -95,6 +99,7 @@ MINLINE float len_v2(const float a[2]); MINLINE float len_v2v2(const float a[2], const float b[2]); MINLINE float len_v3(const float a[3]); MINLINE float len_v3v3(const float a[3], const float b[3]); +MINLINE float len_squared_v3v3(const float a[3], const float b[3]); MINLINE float normalize_v2(float r[2]); MINLINE float normalize_v2_v2(float r[2], const float a[2]); @@ -108,6 +113,8 @@ void interp_v2_v2v2v2(float r[2], const float a[2], const float b[2], const floa void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t); void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]); void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float w[4]); +void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t); +void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]); void mid_v3_v3v3(float r[3], float a[3], float b[3]); @@ -149,8 +156,8 @@ void print_v2(char *str, float a[2]); void print_v3(char *str, float a[3]); void print_v4(char *str, float a[4]); -MINLINE void normal_short_to_float_v3(float r[3], short n[3]); -MINLINE void normal_float_to_short_v3(short r[3], float n[3]); +MINLINE void normal_short_to_float_v3(float r[3], const short n[3]); +MINLINE void normal_float_to_short_v3(short r[3], const float n[3]); void minmax_v3_v3v3(float r[3], float min[3], float max[3]); diff --git a/source/blender/blenlib/BLI_memarena.h b/source/blender/blenlib/BLI_memarena.h index 2383b2ed139..a17c88b70df 100644 --- a/source/blender/blenlib/BLI_memarena.h +++ b/source/blender/blenlib/BLI_memarena.h @@ -51,7 +51,7 @@ struct MemArena; typedef struct MemArena MemArena; -struct MemArena* BLI_memarena_new (int bufsize); +struct MemArena* BLI_memarena_new (int bufsize, const char *name); void BLI_memarena_free (struct MemArena *ma); void BLI_memarena_use_malloc (struct MemArena *ma); diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h index 9b4084aa172..316b850805d 100644 --- a/source/blender/blenlib/BLI_path_util.h +++ b/source/blender/blenlib/BLI_path_util.h @@ -30,13 +30,12 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef BLI_UTIL_H -#define BLI_UTIL_H +#ifndef BLI_PATH_UTIL_H +#define BLI_PATH_UTIL_H -/* XXX doesn't seem to be used, marded for removal -#define mallocstructN(x,y,name) (x*)MEM_mallocN((y)* sizeof(x),name) -#define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name) -*/ +#ifdef __cplusplus +extern "C" { +#endif struct ListBase; struct direntry; @@ -50,22 +49,85 @@ char *BLI_gethome_folder(char *folder_name, int flag); #define BLI_GETHOME_USER 1<<3 /* home folder ~/.blender */ #define BLI_GETHOME_ALL (BLI_GETHOME_SYSTEM|BLI_GETHOME_LOCAL|BLI_GETHOME_USER) + +#ifdef __APPLE__ +typedef enum { + BasePath_Temporary = 1, + BasePath_BlenderShared, + BasePath_BlenderUser, + BasePath_ApplicationBundle +} basePathesTypes; + +/** + * Gets the base path. The path may not exist. + * Note that return string must be copied as its persistence is not guaranteed + * + * @return base path of pathType + */ +const char* BLI_osx_getBasePath(basePathesTypes pathType); +#endif + +char *BLI_get_folder(int folder_id, char *subfolder); +char *BLI_get_folder_create(int folder_id, char *subfolder); + +/* folder_id */ + +/* general, will find baserd on user/local/system priority */ +#define BLENDER_CONFIG 1 +#define BLENDER_DATAFILES 2 +#define BLENDER_SCRIPTS 3 +#define BLENDER_PLUGINS 4 +#define BLENDER_PYTHON 5 + +/* user-specific */ +#define BLENDER_USER_CONFIG 31 +#define BLENDER_USER_DATAFILES 32 +#define BLENDER_USER_SCRIPTS 33 +#define BLENDER_USER_PLUGINS 34 + +/* system */ +#define BLENDER_SYSTEM_CONFIG 51 /* optional */ +#define BLENDER_SYSTEM_DATAFILES 52 +#define BLENDER_SYSTEM_SCRIPTS 53 +#define BLENDER_SYSTEM_PLUGINS 54 +#define BLENDER_SYSTEM_PYTHON 54 + +#define BLENDER_TEMP 80 + +#define BLENDER_USERFOLDER(id) (id >= BLENDER_USER_CONFIG && id <= BLENDER_USER_PLUGINS) + +#define BLENDER_STARTUP_FILE "startup.blend" +#define BLENDER_BOOKMARK_FILE "bookmarks.txt" +#define BLENDER_HISTORY_FILE "recent-files.txt" + +#ifdef WIN32 +#define BLENDER_USER_FORMAT "%s\\Blender Foundation\\Blender\\%s" +#define BLENDER_SYSTEM_FORMAT "%s\\Blender Foundation\\Blender\\%s" +#elif __APPLE__ +#define BLENDER_USER_FORMAT "%s/Blender/%s" +#define BLENDER_SYSTEM_FORMAT "%s/Blender/%s" +#else +#define BLENDER_USER_FORMAT "%s/.blender/%s" +#define BLENDER_SYSTEM_FORMAT "%s/blender/%s" +#endif + void BLI_setenv(const char *env, const char *val); void BLI_setenv_if_new(const char *env, const char* val); void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file); void BLI_make_exist(char *dir); void BLI_make_existing_file(char *name); -void BLI_split_dirfile(char *string, char *dir, char *file); -void BLI_split_dirfile_basic(const char *string, char *dir, char *file); +void BLI_split_dirfile(const char *string, char *dir, char *file); void BLI_join_dirfile(char *string, const char *dir, const char *file); +char *BLI_path_basename(char *path); int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char *base_dir, const char *src_dir, const char *dest_dir); void BLI_getlastdir(const char* dir, char *last, int maxlen); int BLI_testextensie(const char *str, const char *ext); +int BLI_replace_extension(char *path, int maxlen, const char *ext); void BLI_uniquename(struct ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len); void BLI_newname(char * name, int add); -int BLI_stringdec(char *string, char *head, char *start, unsigned short *numlen); -void BLI_stringenc(char *string, char *head, char *start, unsigned short numlen, int pic); +int BLI_stringdec(const char *string, char *head, char *start, unsigned short *numlen); +void BLI_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic); void BLI_splitdirstring(char *di,char *fi); /* make sure path separators conform to system one */ @@ -97,12 +159,12 @@ int BLI_has_parent(char *path); * @a framenum The framenumber to replace the frame code with. * @retval Returns true if the path was relative (started with "//"). */ -int BLI_convertstringcode(char *path, const char *basepath); -int BLI_convertstringframe(char *path, int frame, int digits); -int BLI_convertstringframe_range(char *path, int sta, int end, int digits); -int BLI_convertstringcwd(char *path); +int BLI_path_abs(char *path, const char *basepath); +int BLI_path_frame(char *path, int frame, int digits); +int BLI_path_frame_range(char *path, int sta, int end, int digits); +int BLI_path_cwd(char *path); -void BLI_makestringcode(const char *relfile, char *file); +void BLI_path_rel(char *file, const char *relfile); /** * Change every @a from in @a string into @a to. The @@ -139,18 +201,13 @@ char *get_install_dir(void); void BLI_where_is_temp(char *fullname, int usertemp); - /** - * determines the full path to the application bundle on OS X - * - * @return path to application bundle - */ -#ifdef __APPLE__ -char* BLI_getbundle(void); -#endif - #ifdef WITH_ICONV void BLI_string_to_utf8(char *original, char *utf_8, const char *code); #endif +#ifdef __cplusplus +} +#endif + #endif diff --git a/source/blender/blenlib/BLI_pbvh.h b/source/blender/blenlib/BLI_pbvh.h index da59c5695a4..4797aeb2364 100644 --- a/source/blender/blenlib/BLI_pbvh.h +++ b/source/blender/blenlib/BLI_pbvh.h @@ -36,18 +36,23 @@ struct ListBase; typedef struct PBVH PBVH; typedef struct PBVHNode PBVHNode; +typedef struct { + float (*co)[3]; +} PBVHProxyNode; + /* Callbacks */ /* returns 1 if the search should continue from this node, 0 otherwise */ typedef int (*BLI_pbvh_SearchCallback)(PBVHNode *node, void *data); typedef void (*BLI_pbvh_HitCallback)(PBVHNode *node, void *data); +typedef void (*BLI_pbvh_HitOccludedCallback)(PBVHNode *node, void *data, float* tmin); /* Building */ PBVH *BLI_pbvh_new(void); void BLI_pbvh_build_mesh(PBVH *bvh, struct MFace *faces, struct MVert *verts, - int totface, int totvert); + int totface, int totvert); void BLI_pbvh_build_grids(PBVH *bvh, struct DMGridData **grids, struct DMGridAdjacency *gridadj, int totgrid, int gridsize, void **gridfaces); @@ -70,8 +75,8 @@ void BLI_pbvh_search_gather(PBVH *bvh, it's up to the callback to find the primitive within the leaves that is hit first */ -void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitCallback cb, void *data, - float ray_start[3], float ray_normal[3], int original); +void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitOccludedCallback cb, void *data, + float ray_start[3], float ray_normal[3], int original); int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], float ray_start[3], float ray_normal[3], float *dist); @@ -79,7 +84,7 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], void BLI_pbvh_node_draw(PBVHNode *node, void *data); int BLI_pbvh_node_planes_contain_AABB(PBVHNode *node, void *data); -void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3]); +void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smooth); /* Node Access */ @@ -106,11 +111,21 @@ void BLI_pbvh_node_get_verts(PBVH *bvh, PBVHNode *node, void BLI_pbvh_node_get_BB(PBVHNode *node, float bb_min[3], float bb_max[3]); void BLI_pbvh_node_get_original_BB(PBVHNode *node, float bb_min[3], float bb_max[3]); +float BLI_pbvh_node_get_tmin(PBVHNode* node); + /* Update Normals/Bounding Box/Draw Buffers/Redraw and clear flags */ void BLI_pbvh_update(PBVH *bvh, int flags, float (*face_nors)[3]); void BLI_pbvh_redraw_BB(PBVH *bvh, float bb_min[3], float bb_max[3]); void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *totface); +void BLI_pbvh_grids_update(PBVH *bvh, struct DMGridData **grids, + struct DMGridAdjacency *gridadj, void **gridfaces); + +/* vertex deformer */ +float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3]; +void BLI_pbvh_apply_vertCos(struct PBVH *pbvh, float (*vertCos)[3]); +int BLI_pbvh_isDeformed(struct PBVH *pbvh); + /* Vertex Iterator */ @@ -151,13 +166,21 @@ typedef struct PBVHVertexIter { float *fno; } PBVHVertexIter; +#ifdef _MSC_VER +#pragma warning (disable:4127) // conditional expression is constant +#endif + #define BLI_pbvh_vertex_iter_begin(bvh, node, vi, mode) \ { \ struct DMGridData **grids; \ struct MVert *verts; \ int *grid_indices, totgrid, gridsize, *vert_indices, uniq_verts, totvert; \ \ - memset(&vi, 0, sizeof(PBVHVertexIter)); \ + vi.grid= 0; \ + vi.no= 0; \ + vi.fno= 0; \ + vi.mvert= 0; \ + vi.skip= 0; \ \ BLI_pbvh_node_get_grids(bvh, node, &grid_indices, &totgrid, NULL, &gridsize, &grids, NULL); \ BLI_pbvh_node_num_verts(bvh, node, &uniq_verts, &totvert); \ @@ -182,7 +205,7 @@ typedef struct PBVHVertexIter { vi.height= vi.gridsize; \ vi.grid= vi.grids[vi.grid_indices[vi.g]]; \ vi.skip= 0; \ - \ + \ /*if(mode == PVBH_ITER_UNIQUE) { \ vi.grid += subm->grid.offset; \ vi.skip= subm->grid.skip; \ @@ -193,7 +216,7 @@ typedef struct PBVHVertexIter { vi.width= vi.totvert; \ vi.height= 1; \ } \ - \ + \ for(vi.gy=0; vi.gyarg) ^ BLI_ghashutil_inthash((void*)k->pass); + return case_strhash(k->arg); // ^ BLI_ghashutil_inthash((void*)k->pass); } static int keycmp(void *a, void *b) @@ -102,7 +116,8 @@ bArgs *BLI_argsInit(int argc, char **argv) { bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs"); ba->passes = MEM_callocN(sizeof(int) * argc, "bArgs passes"); - ba->items = BLI_ghash_new(keyhash, keycmp); + ba->items = BLI_ghash_new(keyhash, keycmp, "bArgs passes gh"); + ba->docs.first = ba->docs.last = NULL; ba->argc = argc; ba->argv = argv; @@ -118,6 +133,7 @@ void BLI_argsFree(struct bArgs *ba) { BLI_ghash_free(ba->items, freeItem, freeItem); MEM_freeN(ba->passes); + BLI_freelistN(&ba->docs); MEM_freeN(ba); } @@ -134,7 +150,25 @@ char **BLI_argsArgv(struct bArgs *ba) return ba->argv; } -static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data) +static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg, char *doc) +{ + bArgDoc *d; + + d = MEM_callocN(sizeof(bArgDoc), "bArgDoc"); + + if (doc == NULL) + doc = NO_DOCS; + + d->short_arg = short_arg; + d->long_arg = long_arg; + d->documentation = doc; + + BLI_addtail(&ba->docs, d); + + return d; +} + +static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d) { bArgument *a; bAKey *key; @@ -157,20 +191,67 @@ static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ a->key = key; a->func = cb; a->data = data; + a->doc = d; BLI_ghash_insert(ba->items, key, a); } -void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data) +void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data) { - internalAdd(ba, arg, pass, 0, cb, data); + bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc); + + if (short_arg) + internalAdd(ba, short_arg, pass, short_case, cb, data, d); + + if (long_arg) + internalAdd(ba, long_arg, pass, long_case, cb, data, d); + + } -void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data) +void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data) { - internalAdd(ba, arg, pass, 1, cb, data); + BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data); } +static void internalDocPrint(bArgDoc *d) +{ + if (d->short_arg && d->long_arg) + printf("%s or %s", d->short_arg, d->long_arg); + else if (d->short_arg) + printf("%s", d->short_arg); + else if (d->long_arg) + printf("%s", d->long_arg); + + printf(" %s\n\n", d->documentation); +} + +void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg) +{ + bArgument *a = lookUp(ba, arg, -1, -1); + + if (a) + { + bArgDoc *d = a->doc; + + internalDocPrint(d); + + d->done = 1; + } +} + +void BLI_argsPrintOtherDoc(struct bArgs *ba) +{ + bArgDoc *d; + + for( d = ba->docs.first; d; d = d->next) + { + if (d->done == 0) + { + internalDocPrint(d); + } + } +} void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *default_data) { @@ -203,7 +284,8 @@ void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void * } i += retval; } else if (retval == -1){ - ba->passes[i] = pass; + if (a->key->pass != -1) + ba->passes[i] = pass; break; } } diff --git a/source/blender/blenlib/intern/BLI_bfile.c b/source/blender/blenlib/intern/BLI_bfile.c index 3306283ad3f..b9ac6875b20 100644 --- a/source/blender/blenlib/intern/BLI_bfile.c +++ b/source/blender/blenlib/intern/BLI_bfile.c @@ -1,4 +1,5 @@ -/* +/* -*- indent-tabs-mode:t; tab-width:4; -*- + * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +34,7 @@ #else #include #include "BLI_winstuff.h" + static char* find_in_pathlist(char* filename, char* pathlist); #endif #include #include @@ -46,8 +48,6 @@ #include "BLI_storage.h" #include "BLI_bfile.h" -#include "GHOST_C-api.h" - /* Internal bfile classification flags */ #define BCF_OPEN (0) #define BCF_FOPEN (1<<0) @@ -62,17 +62,14 @@ /* Declaration of internal functions */ -void chomp(char* line); -void expand_envvars(char* src, char* dst); -void fill_paths(BFILE *bfile, const char *path); -char* find_in_pathlist(char* filename, char* pathlist); -void init_vars_from_file(const char* path); -void setup_temp(); +static void fill_paths(BFILE *bfile, const char *path, const char *relpath); +static void free_paths(BFILE* bfile); + /*** Exported functions ***/ BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, - BEnvVarFam envvars) + const char *relpath) { BFILE *bfile; @@ -88,50 +85,85 @@ BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, a BCF_AT_END | BCF_WRITE a+ BCF_AT_END | BCF_WRITE | BCF_READ */ - if(strchr(mode, 'r')) + if (strchr(mode, 'r')) bfile->classf |= BCF_READ; - if(strchr(mode, 'w')) + if (strchr(mode, 'w')) bfile->classf |= (BCF_DISCARD | BCF_WRITE); - if(strchr(mode, 'a')) + if (strchr(mode, 'a')) bfile->classf |= (BCF_AT_END | BCF_WRITE); - if(strchr(mode, '+')) + if (strchr(mode, '+')) bfile->classf |= (BCF_READ | BCF_WRITE); - fill_paths(bfile, path); + fill_paths(bfile, path, relpath); bfile->stream = fopen(bfile->tpath, mode); - // detect failed fopen + if (!(bfile->stream)) { + free_paths(bfile); + MEM_freeN(bfile); + return NULL; + } + bfile->fd = fileno(bfile->stream); + return bfile; } BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags, - BEnvVarFam envvars) + const char *relpath) { BFILE *bfile; + char fopen_mode[3]; bfile = MEM_mallocN(sizeof(BFILE), "bfile-open"); bfile->classf = BCF_OPEN; bfile->uflags = bflags; /* Easy mapping for open() */ - if(flags & O_RDONLY) + if (flags & O_RDONLY) bfile->classf |= BCF_READ; - if(flags & O_WRONLY) + if (flags & O_WRONLY) bfile->classf |= BCF_WRITE; - if(flags & O_RDWR) + if (flags & O_RDWR) bfile->classf |= (BCF_READ | BCF_WRITE); - if(flags & O_APPEND) + if (flags & O_APPEND) bfile->classf |= BCF_AT_END; - if(flags & O_TRUNC) + if (flags & O_TRUNC) bfile->classf |= BCF_DISCARD; - fill_paths(bfile, pathname); + fill_paths(bfile, pathname, relpath); bfile->fd = open(bfile->tpath, flags); - // detect failed open -// bfile->stream = fdopen(bfile->fd, XXX); /* MSWindows _fdopen? */ + if (bfile->fd == -1) { + free_paths(bfile); + MEM_freeN(bfile); + return NULL; + } + + fopen_mode[0] = 'r'; + fopen_mode[1] = '\0'; + fopen_mode[2] = '\0'; + if (bfile->classf & BCF_DISCARD) { + fopen_mode[0] = 'w'; + if (bfile->classf & BCF_READ) { + fopen_mode[1] = '+'; + } + } else if (bfile->classf & BCF_AT_END) { + fopen_mode[0] = 'a'; + if (bfile->classf & BCF_READ) { + fopen_mode[1] = '+'; + } + } else if (bfile->classf & BCF_WRITE) { + fopen_mode[1] = '+'; + } + + bfile->stream = fdopen(bfile->fd, fopen_mode); /* MSWindows _fdopen? */ + if (!(bfile->stream)) { + free_paths(bfile); + MEM_freeN(bfile); + return NULL; + } + return bfile; } @@ -175,8 +207,11 @@ size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb, { size_t ret; + if (f == NULL) + return 0; + ret = fwrite(ptr, size, nmemb, f->stream); - if (ret < 0) { + if (ret <= 0) { f->error = 1; } @@ -187,8 +222,11 @@ size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb, size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f) { size_t ret; + if (f == NULL) + return 0; + ret = fread(ptr, size, nmemb, f->stream); - if ((ret < 0) && ferror(f->stream)) { + if ((ret <= 0) && ferror(f->stream)) { f->error = 1; } @@ -197,21 +235,23 @@ size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f) { void BLI_bfile_close(BFILE *bfile) { - if((bfile->classf | BCF_WRITE) && - !(bfile->uflags | BFILE_RAW)) { + if ((bfile->classf | BCF_WRITE) && + !(bfile->uflags | BFILE_RAW)) { + int error; /* Make sure data is on disk */ + error = fsync(bfile->fd); + /* fsync the directory too? */ /* Move to final name if no errors */ + if (!(bfile->error) && !error) { + rename(bfile->tpath, bfile->fpath); + } } /* Normal close */ /* Cleanup */ - if(bfile->fpath) { - MEM_freeN(bfile->fpath); - } - if(bfile->tpath) { - MEM_freeN(bfile->tpath); - } + free_paths(bfile); + MEM_freeN(bfile); } @@ -228,196 +268,8 @@ void BLI_bfile_set_error(BFILE *bfile, int error) { } -void BLI_bfile_init_vars() { - char file[MAXPATHLEN]; - char temp[MAXPATHLEN]; - extern char bprogname[]; - FILE* fp; - - /* This one is unconditional */ - sprintf(temp, "%d", BLENDER_VERSION); - BLI_setenv("BLENDER_VERSION", temp); - - /* Is this unpack&run? */ - sprintf(temp, "%s/%d/environment", dirname(bprogname), BLENDER_VERSION); - if(BLI_exist(temp)) { - BLI_setenv_if_new("BLENDER_SHARE", dirname(bprogname)); - } else { - BLI_setenv_if_new("BLENDER_SHARE", (const char*)GHOST_getSystemDir()); - } - - strcpy(file, (const char*)GHOST_getUserDir()); - BLI_add_slash(file); - strcat(file, LAST_SESSION_FILE); - fp = fopen(file, "r"); - /* 1st line, read previous version */ - if (fp && (fscanf(fp, "%3c\n", temp) == 1)) { - temp[3] = '\0'; - BLI_setenv("BLENDER_VERSION_PREV", temp); - /* 2nd line, read previous session path if needed */ - if(!getenv("BLENDER_TEMP")) { - if ((fgets(temp, MAXPATHLEN, fp) != NULL)) { - /* Clean any \n */ - chomp(temp); - /* Check the dir is still there or generate new one */ - if(!BLI_exist(temp)) { - setup_temp(); - } - } else { - /* We have to generate it for sure */ - setup_temp(); - } - } - } else { - /* Probably new user, or only <=249 before */ - BLI_setenv("BLENDER_VERSION_PREV", "0"); - setup_temp(); - } - - if(fp) { - fclose(fp); - } - - /* Load vars from user and system files */ - strcpy(file, (const char *)GHOST_getUserDir()); - BLI_add_slash(file); - strcat(file, ENVIRONMENT_FILE); - init_vars_from_file(file); - sprintf(temp, "/%d/environment", BLENDER_VERSION); - BLI_make_file_string("/", file, getenv("BLENDER_SHARE"), temp); - init_vars_from_file(file); -} - - /*** Internal functions ***/ -/** - Eliminate trailing EOL by writing a \0 over it. - Name taken from Perl. - */ -void chomp(char* line) { - int len = strlen(line); -#ifndef WIN32 - if (line[len - 1] == '\n') { - line[len - 1] = '\0'; - } -#else - if ((line[len - 2] == '\r' ) && ((line[len - 1] == '\n'))) { - line[len - 2] = '\0'; - } -#endif /* WIN32 */ -} - - -/** - Parse a file with lines like FOO=bar (comment lines have # as first - character) assigning to envvar FOO the value bar if FOO does not - exist yet. - Any white space before FOO, around the = or trailing will be used, - so beware. - */ -#define MAX_LINE 4096 -#define ENV_VAR 256 -#define VAR_LEN 8192 -void init_vars_from_file(const char* path) { - char line[MAX_LINE]; - char name[ENV_VAR]; - FILE *fp; - char* separator; - char expanded[VAR_LEN]; - - fp = fopen(path, "r"); - if (!fp) return; - - while (fgets(line, MAX_LINE, fp) != NULL) { - /* Ignore comment lines */ - if (line[0] == '#') - continue; - - /* Split into envvar name and contents */ - separator = strchr(line, '='); - if(separator && ((separator - line) < ENV_VAR)) { - /* First remove EOL */ - chomp(line); - strncpy(name, line, separator - line); - name[separator - line] = '\0'; - expand_envvars(separator + 1, expanded); - BLI_setenv_if_new(name, expanded); - } - } - fclose(fp); -} - - -/** - Look for ${} (or %%) env vars in src and expand if the var - exists (even if empty value). If not exist, the name is left as is. - The process is done all over src, and nested ${${}} is not supported. - src must be \0 terminated, and dst must be big enough. -*/ -#ifndef WIN32 - #define ENVVAR_PREFFIX "${" - #define ENVVAR_P_SIZE 2 - #define ENVVAR_SUFFIX "}" - #define ENVVAR_S_SIZE 1 -#else - #define ENVVAR_PREFFIX "%" - #define ENVVAR_P_SIZE 1 - #define ENVVAR_SUFFIX "%" - #define ENVVAR_S_SIZE 1 -#endif /* WIN32 */ -void expand_envvars(char* src, char* dst) { - char* hit1; - char* hit2; - char name[ENV_VAR]; - char* value; - int prevlen; - int done = 0; - char* source = src; - - dst[0] = '\0'; - while (!done) { - hit1 = strstr(source, ENVVAR_PREFFIX); - if (hit1) { - hit2 = strstr(hit1 + ENVVAR_P_SIZE, ENVVAR_SUFFIX); - if (hit2) { - /* "Copy" the leading part, if any */ - if (hit1 != source) { - prevlen = strlen(dst); - strncat(dst, source, hit1 - source); - dst[prevlen + (hit1 - source)] = '\0'; - } - /* Figure the name of the env var we just found */ - strncpy(name, hit1 + ENVVAR_P_SIZE, - hit2 - (hit1 + ENVVAR_P_SIZE)); - name[hit2 - (hit1 + ENVVAR_P_SIZE)] = '\0'; - /* See if we can get something with that name */ - value = getenv(name); - if (value) { - /* Push the var value */ - strcat(dst, value); - } else { - /* Leave the var name, so it is clear that it failed */ - strcat(dst, ENVVAR_PREFFIX); - strcat(dst, name); - strcat(dst, ENVVAR_SUFFIX); - } - /* Continue after closing mark, like a new string */ - source = hit2 + ENVVAR_S_SIZE; - } else { - /* Non terminated var so "copy as is" and finish */ - strcat(dst, source); - done = 1; - } - } else { - /* "Copy" whatever is left */ - strcat(dst, source); - done = 1; - } - } -} - - /** Return a full path if the filename exists when combined with any item from pathlist. Or NULL otherwise. @@ -427,7 +279,9 @@ void expand_envvars(char* src, char* dst) { #else #define SEPARATOR ':' #endif -char* find_in_pathlist(char* filename, char* pathlist) { + +#ifdef WIN32 +static char* find_in_pathlist(char* filename, char* pathlist) { char first[FILE_MAX + 10]; char* rest = NULL; @@ -445,51 +299,58 @@ char* find_in_pathlist(char* filename, char* pathlist) { /* Check if combination exists */ BLI_add_slash(first); strcat(first, filename); - if(BLI_exist(first)) { + if (BLI_exist(first)) { return strdup(first); } /* First path failed, try with rest of paths if possible */ - if(rest) { + if (rest) { return find_in_pathlist(filename, rest); } else { return NULL; } } - +#endif /** Setup fpath and tpath based in the needs of the bfile. */ -void fill_paths(BFILE *bfile, const char *path) { +static void fill_paths(BFILE *bfile, const char *path, const char *relpath) { char* source_path = NULL; char* temp_path = NULL; int bflags = bfile->uflags; - if(bflags & BFILE_NORMAL || bflags & BFILE_RAW) { + if (bflags & BFILE_NORMAL || bflags & BFILE_RAW) { // bfile->fpath is path with // replaced } - if(bflags & BFILE_TEMP) { + if (bflags & BFILE_TEMP) { temp_path = MEM_mallocN(MAXPATHLEN, "bfile-fpath-1"); snprintf(temp_path, MAXPATHLEN, "%s/%s", getenv("BLENDER_TEMP"), path); bfile->fpath = temp_path; } - if(bflags & BFILE_CONFIG) { + if (bflags & (BFILE_CONFIG_BASE | BFILE_CONFIG_DATAFILES | + BFILE_CONFIG_PYTHON | BFILE_CONFIG_PLUGINS)) { +// evars // bfile->fpath is userdir+version+path // source_path is first hit in (if using fallback to older versions) // userdir+curversion+path (... userdir+limitversion+path) sysdir+path // (limitversion is based in path, using some kind of regex or "tables") } - if(bfile->classf & BCF_WRITE && !(bflags & BFILE_RAW)) { - /* Generate temp path */ + if (bfile->classf & BCF_WRITE && !(bflags & BFILE_RAW)) { + /* Generate random named path */ temp_path = MEM_mallocN(MAXPATHLEN, "bfile-fpath-2"); snprintf(temp_path, MAXPATHLEN, "%s.XXXXXX", path); - bfile->tpath = mkdtemp(temp_path); - if(!(bfile->classf & BCF_DISCARD)) { - /* Copy data to tpath */ - if(source_path) { - // copy it from older version or sys version + bfile->fd = mkstemp(temp_path); + bfile->tpath = temp_path; + /* It will be reopened in upper levels, later */ + close(bfile->fd); + if (!(bfile->classf & BCF_DISCARD)) { + /* Copy original data into temp location */ + if (source_path) { + BLI_copy_fileops(source_path, bfile->tpath); + } else { + BLI_copy_fileops(bfile->fpath, bfile->tpath); } } } else { @@ -499,19 +360,13 @@ void fill_paths(BFILE *bfile, const char *path) { /** - Create a temp directory in safe and multiuser way. + Free memory used for path strings. */ -void setup_temp() { - char template[MAXPATHLEN]; - char* tempdir; - - if(getenv("TMPDIR")) { - sprintf(template, "%s/blender-XXXXXX", getenv("TMPDIR")); - } else { - sprintf(template, "/tmp/blender-XXXXXX"); -// MacOSX NSTemporaryDirectory and WIN32 ??? +static void free_paths(BFILE* bfile) { + if (bfile->fpath) { + MEM_freeN(bfile->fpath); + } + if (bfile->tpath) { + MEM_freeN(bfile->tpath); } - tempdir = mkdtemp(template); - BLI_setenv("BLENDER_TEMP", tempdir); } - diff --git a/source/blender/blenlib/intern/BLI_dynstr.c b/source/blender/blenlib/intern/BLI_dynstr.c index 4b7b61e64d9..5b61a86305b 100644 --- a/source/blender/blenlib/intern/BLI_dynstr.c +++ b/source/blender/blenlib/intern/BLI_dynstr.c @@ -29,8 +29,6 @@ */ #include -#include -#include #include #include "MEM_guardedalloc.h" diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index 6ef8d9e5f19..456872d6612 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -28,21 +28,10 @@ * A general (pointer -> pointer) hash table ADT */ -#include -#include -#include "MEM_guardedalloc.h" #include "BLI_ghash.h" -#include "BLI_mempool.h" - #include "BLO_sys_types.h" // for intptr_t support -#include "BKE_utildefines.h" - -#ifdef HAVE_CONFIG_H -#include -#endif - /***/ unsigned int hashsizes[]= { @@ -56,8 +45,8 @@ unsigned int hashsizes[]= { /***/ -GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp) { - GHash *gh= MEM_mallocN(sizeof(*gh), "GHash"); +GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) { + GHash *gh= MEM_mallocN(sizeof(*gh), info); gh->hashfp= hashfp; gh->cmpfp= cmpfp; gh->entrypool = BLI_mempool_create(sizeof(Entry), 64, 64, 1, 0); @@ -145,7 +134,7 @@ void *BLI_ghashIterator_getValue(GHashIterator *ghi) { void BLI_ghashIterator_step(GHashIterator *ghi) { if (ghi->curEntry) { - ghi->curEntry= ghi->curEntry->next; + ghi->curEntry= ghi->curEntry->next; while (!ghi->curEntry) { ghi->curBucket++; if (ghi->curBucket==ghi->gh->nbuckets) @@ -180,7 +169,7 @@ unsigned int BLI_ghashutil_inthash(void *ptr) { key += ~(key << 9); key ^= (key >> 17); - return (unsigned int)(key & 0xffffffff); + return (unsigned int)(key & 0xffffffff); } int BLI_ghashutil_intcmp(void *a, void *b) { diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c index 196c9ed284c..f6616ecb06b 100644 --- a/source/blender/blenlib/intern/BLI_heap.c +++ b/source/blender/blenlib/intern/BLI_heap.c @@ -28,7 +28,6 @@ * A heap / priority queue ADT. */ -#include #include #include "MEM_guardedalloc.h" @@ -70,7 +69,7 @@ Heap *BLI_heap_new() Heap *heap = (Heap*)MEM_callocN(sizeof(Heap), "BLIHeap"); heap->bufsize = 1; heap->tree = (HeapNode**)MEM_mallocN(sizeof(HeapNode*), "BLIHeapTree"); - heap->arena = BLI_memarena_new(1<<16); + heap->arena = BLI_memarena_new(1<<16, "heap arena"); return heap; } diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index 7118b804cad..4d64f4a50ff 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "math.h" -#include -#include -#include #include #include "MEM_guardedalloc.h" @@ -1494,7 +1490,7 @@ static float fast_ray_nearest_hit(const BVHRayCastData *data, const BVHNode *nod dist = t1x; if (t1y > dist) dist = t1y; - if (t1z > dist) dist = t1z; + if (t1z > dist) dist = t1z; return dist; } @@ -1617,7 +1613,7 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float *co, const float *dir, float { dfs_raycast(&data, root); // iterative_raycast(&data, root); - } + } if(hit) diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c index 38b4d7a54d2..cf94a0c9ffe 100644 --- a/source/blender/blenlib/intern/BLI_kdtree.c +++ b/source/blender/blenlib/intern/BLI_kdtree.c @@ -28,9 +28,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include #include "MEM_guardedalloc.h" diff --git a/source/blender/blenlib/intern/BLI_linklist.c b/source/blender/blenlib/intern/BLI_linklist.c index 4631d9e6bf2..c903e66057e 100644 --- a/source/blender/blenlib/intern/BLI_linklist.c +++ b/source/blender/blenlib/intern/BLI_linklist.c @@ -29,14 +29,9 @@ */ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_linklist.h" #include "BLI_memarena.h" -#ifdef HAVE_CONFIG_H -#include -#endif - int BLI_linklist_length(LinkNode *list) { if (0) { return list?(1+BLI_linklist_length(list->next)):0; @@ -50,18 +45,28 @@ int BLI_linklist_length(LinkNode *list) { } } -int BLI_linklist_index(struct LinkNode *list, void *ptr) +int BLI_linklist_index(LinkNode *list, void *ptr) { int index; - for (index = 0; list; list= list->next, index++) { + for (index = 0; list; list= list->next, index++) if (list->link == ptr) return index; - } return -1; } +LinkNode *BLI_linklist_find(LinkNode *list, int index) +{ + int i; + + for (i = 0; list; list= list->next, i++) + if (i == index) + return list; + + return NULL; +} + void BLI_linklist_reverse(LinkNode **listp) { LinkNode *rhead= NULL, *cur= *listp; @@ -93,13 +98,13 @@ void BLI_linklist_append(LinkNode **listp, void *ptr) { nlink->next = NULL; if(node == NULL){ - *listp = nlink; - } else { - while(node->next != NULL){ - node = node->next; - } - node->next = nlink; - } + *listp = nlink; + } else { + while(node->next != NULL){ + node = node->next; + } + node->next = nlink; + } } void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma) { @@ -110,6 +115,22 @@ void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma) { *listp= nlink; } +void BLI_linklist_insert_after(LinkNode **listp, void *ptr) { + LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink"); + LinkNode *node = *listp; + + nlink->link = ptr; + + if(node) { + nlink->next = node->next; + node->next = nlink; + } + else { + nlink->next = NULL; + *listp = nlink; + } +} + void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc) { while (list) { LinkNode *next= list->next; diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c index 6c87f0914f9..de2a73e065f 100644 --- a/source/blender/blenlib/intern/BLI_memarena.c +++ b/source/blender/blenlib/intern/BLI_memarena.c @@ -28,21 +28,16 @@ * Efficient memory allocation for lots of similar small chunks. */ -#include #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_memarena.h" #include "BLI_linklist.h" -#ifdef HAVE_CONFIG_H -#include -#endif - struct MemArena { unsigned char *curbuf; int bufsize, cursize; + const char *name; int use_calloc; int align; @@ -50,10 +45,11 @@ struct MemArena { LinkNode *bufs; }; -MemArena *BLI_memarena_new(int bufsize) { +MemArena *BLI_memarena_new(int bufsize, const char *name) { MemArena *ma= MEM_callocN(sizeof(*ma), "memarena"); ma->bufsize= bufsize; ma->align = 8; + ma->name= name; return ma; } @@ -96,9 +92,9 @@ void *BLI_memarena_alloc(MemArena *ma, int size) { else ma->cursize = ma->bufsize; if(ma->use_calloc) - ma->curbuf= MEM_callocN(ma->cursize, "memarena calloc"); + ma->curbuf= MEM_callocN(ma->cursize, ma->name); else - ma->curbuf= MEM_mallocN(ma->cursize, "memarena malloc"); + ma->curbuf= MEM_mallocN(ma->cursize, ma->name); BLI_linklist_prepend(&ma->bufs, ma->curbuf); diff --git a/source/blender/blenlib/intern/boxpack2d.c b/source/blender/blenlib/intern/boxpack2d.c index eebffd6bd6e..1c910dbb519 100644 --- a/source/blender/blenlib/intern/boxpack2d.c +++ b/source/blender/blenlib/intern/boxpack2d.c @@ -240,17 +240,17 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height) if (vert->free & quad_flags[j]) { switch (j) { case BL: - SET_BOXRIGHT(box, vert->x); - SET_BOXTOP(box, vert->y); - break; + SET_BOXRIGHT(box, vert->x); + SET_BOXTOP(box, vert->y); + break; case TR: - SET_BOXLEFT(box, vert->x); - SET_BOXBOTTOM(box, vert->y); - break; + SET_BOXLEFT(box, vert->x); + SET_BOXBOTTOM(box, vert->y); + break; case TL: - SET_BOXRIGHT(box, vert->x); - SET_BOXBOTTOM(box, vert->y); - break; + SET_BOXRIGHT(box, vert->x); + SET_BOXBOTTOM(box, vert->y); + break; case BR: SET_BOXLEFT(box, vert->x); SET_BOXTOP(box, vert->y); @@ -302,11 +302,11 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height) case TR: box->v[BL]= vert; vert->trb = box; - break; + break; case TL: box->v[BR]= vert; vert->tlb = box; - break; + break; case BR: box->v[TL]= vert; vert->brb = box; @@ -314,7 +314,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height) case BL: box->v[TR]= vert; vert->blb = box; - break; + break; } /* Mask free flags for verts that are diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c index 8d3d807ba1b..fbe71019379 100644 --- a/source/blender/blenlib/intern/bpath.c +++ b/source/blender/blenlib/intern/bpath.c @@ -27,12 +27,7 @@ */ #include -#include -#include -#include -#include -#include #include /* path/file handeling stuff */ @@ -46,13 +41,9 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" /* Library */ -#include "DNA_customdata_types.h" -#include "DNA_image_types.h" #include "DNA_mesh_types.h" #include "DNA_scene_types.h" /* to get the current frame */ #include "DNA_sequence_types.h" -#include "DNA_sound_types.h" #include "DNA_vfont_types.h" #include "DNA_windowmanager_types.h" @@ -71,9 +62,6 @@ /* for sequence */ //XXX #include "BSE_sequence.h" //XXX define below from BSE_sequence.h - otherwise potentially odd behaviour -#define SEQ_HAS_PATH(seq) (seq->type==SEQ_MOVIE || seq->type==SEQ_IMAGE) - - #define FILE_MAX 240 @@ -86,7 +74,7 @@ enum BPathTypes { BPATH_SEQ, BPATH_CDATA, - BPATH_DONE + BPATH_DONE }; void BLI_bpathIterator_init( struct BPathIterator *bpi, char *base_path ) { @@ -137,10 +125,11 @@ void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_ex libpath = BLI_bpathIterator_getLib(bpi); if (libpath) { /* check the files location relative to its library path */ - BLI_convertstringcode(path_expanded, libpath); + BLI_path_abs(path_expanded, libpath); } else { /* local data, use the blend files path */ - BLI_convertstringcode(path_expanded, bpi->base_path); + BLI_path_abs(path_expanded, bpi->base_path); } + BLI_cleanup_file(NULL, path_expanded); } char* BLI_bpathIterator_getLib( struct BPathIterator *bpi) { return bpi->lib; @@ -270,7 +259,7 @@ static void seq_getpath(struct BPathIterator *bpi, char *path) { path[0] = '\0'; /* incase we cant get the path */ if (seq==NULL) return; if (SEQ_HAS_PATH(seq)) { - if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) { + if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) { BLI_strncpy(path, seq->strip->dir, FILE_MAX); BLI_add_slash(path); /* incase its missing */ if (seq->strip->stripdata) { /* should always be true! */ @@ -289,8 +278,8 @@ static void seq_setpath(struct BPathIterator *bpi, char *path) { if (seq==NULL) return; if (SEQ_HAS_PATH(seq)) { - if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) { - BLI_split_dirfile_basic(path, seq->strip->dir, seq->strip->stripdata->name); + if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) { + BLI_split_dirfile(path, seq->strip->dir, seq->strip->stripdata->name); } else { /* simple case */ BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir)); @@ -343,7 +332,7 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) { /* get the path info from this datatype */ Image *ima = (Image *)bpi->data; - bpi->lib = ima->id.lib ? ima->id.lib->filename : NULL; + bpi->lib = ima->id.lib ? ima->id.lib->filepath : NULL; bpi->path = ima->name; bpi->name = ima->id.name+2; bpi->len = sizeof(ima->name); @@ -364,7 +353,7 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) { /* get the path info from this datatype */ bSound *snd = (bSound *)bpi->data; - bpi->lib = snd->id.lib ? snd->id.lib->filename : NULL; + bpi->lib = snd->id.lib ? snd->id.lib->filepath : NULL; bpi->path = snd->name; bpi->name = snd->id.name+2; bpi->len = sizeof(snd->name); @@ -385,7 +374,7 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) { /* get the path info from this datatype */ VFont *vf = (VFont *)bpi->data; - bpi->lib = vf->id.lib ? vf->id.lib->filename : NULL; + bpi->lib = vf->id.lib ? vf->id.lib->filepath : NULL; bpi->path = vf->name; bpi->name = vf->id.name+2; bpi->len = sizeof(vf->name); @@ -432,7 +421,7 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) { if (bpi->data) { Mesh *me = (Mesh *)bpi->data; - bpi->lib = me->id.lib ? me->id.lib->filename : NULL; + bpi->lib = me->id.lib ? me->id.lib->filepath : NULL; bpi->path = me->fdata.external->filename; bpi->name = me->id.name+2; bpi->len = sizeof(me->fdata.external->filename); @@ -533,7 +522,7 @@ void makeFilesRelative(char *basepath, ReportList *reports) { /* Important BLI_cleanup_dir runs before the path is made relative * because it wont work for paths that start with "//../" */ BLI_cleanup_file(bpi.base_path, filepath_relative); /* fix any /foo/../foo/ */ - BLI_makestringcode(bpi.base_path, filepath_relative); + BLI_path_rel(filepath_relative, bpi.base_path); /* be safe and check the length */ if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_relative)) { bpath_as_report(&bpi, "couldn't make path relative (too long)", reports); @@ -631,7 +620,7 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char while ((de = readdir(dir)) != NULL) { - if (strncmp(".", de->d_name, 2)==0 || strncmp("..", de->d_name, 3)==0) + if (strcmp(".", de->d_name)==0 || strcmp("..", de->d_name)==0) continue; BLI_join_dirfile(path, dirname, de->d_name); @@ -669,11 +658,11 @@ void findMissingFiles(char *basepath, char *str) { char filepath[FILE_MAX], *libpath; int filesize, recur_depth; - char dirname[FILE_MAX], filename[FILE_MAX], filename_new[FILE_MAX]; + char dirname[FILE_MAX], filename_new[FILE_MAX]; //XXX waitcursor( 1 ); - BLI_split_dirfile_basic(str, dirname, NULL); + BLI_split_dirfile(str, dirname, NULL); BLI_bpathIterator_init(&bpi, basepath); @@ -694,9 +683,8 @@ void findMissingFiles(char *basepath, char *str) { /* can the dir be opened? */ filesize = -1; recur_depth = 0; - BLI_split_dirfile_basic(filepath, NULL, filename); /* the file to find */ - findFileRecursive(filename_new, dirname, filename, &filesize, &recur_depth); + findFileRecursive(filename_new, dirname, BLI_path_basename(filepath), &filesize, &recur_depth); if (filesize == -1) { /* could not open dir */ printf("Could not open dir \"%s\"\n", dirname); return; @@ -709,7 +697,7 @@ void findMissingFiles(char *basepath, char *str) { } else { /* copy the found path into the old one */ if (G.relbase_valid) - BLI_makestringcode(bpi.base_path, filename_new); + BLI_path_rel(filename_new, bpi.base_path); BLI_bpathIterator_setPath( &bpi, filename_new ); } diff --git a/source/blender/imbuf/intern/IMB_dpxcineon.h b/source/blender/blenlib/intern/cpu.c similarity index 55% rename from source/blender/imbuf/intern/IMB_dpxcineon.h rename to source/blender/blenlib/intern/cpu.c index 4719ecd49f3..65e6b34488c 100644 --- a/source/blender/imbuf/intern/IMB_dpxcineon.h +++ b/source/blender/blenlib/intern/cpu.c @@ -1,5 +1,4 @@ -/* - * IMB_dpxcineon.h +/** * * $Id$ * @@ -19,29 +18,40 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * * ***** END GPL LICENSE BLOCK ***** */ -/** - * \file IMB_dpxcineon.h - * \ingroup imbuf - */ -#ifndef _IMB_DPX_CINEON_H -#define _IMB_DPX_CINEON_H -struct ImBuf; +#include "BLI_cpu.h" -short imb_savecineon(struct ImBuf *buf, char *myfil, int flags); -struct ImBuf *imb_loadcineon(unsigned char *mem, int size, int flags); -int imb_is_cineon(void *buf); -short imb_save_dpx(struct ImBuf *buf, char *myfile, int flags); -struct ImBuf *imb_loaddpx(unsigned char *mem, int size, int flags); -int imb_is_dpx(void *buf); +int BLI_cpu_support_sse2(void) +{ +#if defined(__x86_64__) || defined(_M_X64) + /* x86_64 always has SSE2 instructions */ + return 1; +#elif defined(__GNUC__) && defined(i386) + /* for GCC x86 we check cpuid */ + unsigned int d; + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "popl %%ebx\n\t" + : "=d"(d) + : "a"(1)); + return (d & 0x04000000) != 0; +#elif (defined(_MSC_VER) && defined(_M_IX86)) + /* also check cpuid for MSVC x86 */ + unsigned int d; + __asm { + xor eax, eax + inc eax + push ebx + cpuid + pop ebx + mov d, edx + } + return (d & 0x04000000) != 0; +#endif + + return 0; +} -#endif /*_IMB_DPX_CINEON_H*/ diff --git a/source/blender/blenlib/intern/dynamiclist.c b/source/blender/blenlib/intern/dynamiclist.c deleted file mode 100644 index 4bcccab4b18..00000000000 --- a/source/blender/blenlib/intern/dynamiclist.c +++ /dev/null @@ -1,265 +0,0 @@ -/* util.c - * - * various string, file, list operations. - * - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * - */ - -#include "MEM_guardedalloc.h" - -#include "DNA_listBase.h" - -#include "BLI_listbase.h" -#include "BLI_dynamiclist.h" - -#define PAGE_SIZE 4 - -/*=====================================================================================*/ -/* Methods for access array (realloc) */ -/*=====================================================================================*/ - -/* remove item with index */ -static void rem_array_item(struct DynamicArray *da, unsigned int index) -{ - da->items[index]=NULL; - da->count--; - if(index==da->last_item_index){ - while((!da->items[da->last_item_index]) && (da->last_item_index>0)){ - da->last_item_index--; - } - } -} - -/* add array (if needed, then realloc) */ -static void add_array_item(struct DynamicArray *da, void *item, unsigned int index) -{ - /* realloc of access array */ - if(da->max_item_index < index){ - unsigned int i, max = da->max_item_index; - void **nitems; - - do { - da->max_item_index += PAGE_SIZE; /* OS can allocate only PAGE_SIZE Bytes */ - } while(da->max_item_index<=index); - - nitems = (void**)MEM_mallocN(sizeof(void*)*(da->max_item_index+1), "dlist access array"); - for(i=0;i<=max;i++) - nitems[i] = da->items[i]; - - /* set rest pointers to the NULL */ - for(i=max+1; i<=da->max_item_index; i++) - nitems[i]=NULL; - - MEM_freeN(da->items); /* free old access array */ - da->items = nitems; - } - - da->items[index] = item; - da->count++; - if(index > da->last_item_index) da->last_item_index = index; -} - -/* free access array */ -static void destroy_array(DynamicArray *da) -{ - da->count=0; - da->last_item_index=0; - da->max_item_index=0; - MEM_freeN(da->items); - da->items = NULL; -} - -/* initialize dynamic array */ -static void init_array(DynamicArray *da) -{ - unsigned int i; - - da->count=0; - da->last_item_index=0; - da->max_item_index = PAGE_SIZE-1; - da->items = (void*)MEM_mallocN(sizeof(void*)*(da->max_item_index+1), "dlist access array"); - for(i=0; i<=da->max_item_index; i++) da->items[i]=NULL; -} - -/* reinitialize dynamic array */ -static void reinit_array(DynamicArray *da) -{ - destroy_array(da); - init_array(da); -} - -/*=====================================================================================*/ -/* Methods for two way dynamic list with access array */ -/*=====================================================================================*/ - -/* create new two way dynamic list with access array from two way dynamic list - * it doesn't copy any items to new array or something like this It is strongly - * recomended to use BLI_dlist_ methods for adding/removing items from dynamic list - * unless you can end with inconsistence system !!! */ -DynamicList *BLI_dlist_from_listbase(ListBase *lb) -{ - DynamicList *dlist; - Link *item; - int i=0, count; - - if(!lb) return NULL; - - count = BLI_countlist(lb); - - dlist = MEM_mallocN(sizeof(DynamicList), "temp dynamic list"); - /* ListBase stuff */ - dlist->lb.first = lb->first; - dlist->lb.last = lb->last; - /* access array stuff */ - dlist->da.count=count; - dlist->da.max_item_index = count-1; - dlist->da.last_item_index = count -1; - dlist->da.items = (void*)MEM_mallocN(sizeof(void*)*count, "temp dlist access array"); - - item = (Link*)lb->first; - while(item){ - dlist->da.items[i] = (void*)item; - item = item->next; - i++; - } - - /* to prevent you of using original ListBase :-) */ - lb->first = lb->last = NULL; - - return dlist; -} - -/* take out ListBase from DynamicList and destroy all temporary structures of DynamicList */ -ListBase *BLI_listbase_from_dlist(DynamicList *dlist, ListBase *lb) -{ - if(!dlist) return NULL; - - if(!lb) lb = (ListBase*)MEM_mallocN(sizeof(ListBase), "ListBase"); - - lb->first = dlist->lb.first; - lb->last = dlist->lb.last; - - /* free all items of access array */ - MEM_freeN(dlist->da.items); - /* free DynamicList*/ - MEM_freeN(dlist); - - return lb; -} - -/* return pointer at item from th dynamic list with access array */ -void *BLI_dlist_find_link(DynamicList *dlist, unsigned int index) -{ - if(!dlist || !dlist->da.items) return NULL; - - if((index <= dlist->da.last_item_index) && (index >= 0) && (dlist->da.count>0)){ - return dlist->da.items[index]; - } - else { - return NULL; - } -} - -/* return count of items in the dynamic list with access array */ -unsigned int BLI_count_items(DynamicList *dlist) -{ - if(!dlist) return 0; - - return dlist->da.count; -} - -/* free item from the dynamic list with access array */ -void BLI_dlist_free_item(DynamicList *dlist, unsigned int index) -{ - if(!dlist || !dlist->da.items) return; - - if((index <= dlist->da.last_item_index) && (dlist->da.items[index])){ - BLI_freelinkN(&(dlist->lb), dlist->da.items[index]); - rem_array_item(&(dlist->da), index); - } -} - -/* remove item from the dynamic list with access array */ -void BLI_dlist_rem_item(DynamicList *dlist, unsigned int index) -{ - if(!dlist || !dlist->da.items) return; - - if((index <= dlist->da.last_item_index) && (dlist->da.items[index])){ - BLI_remlink(&(dlist->lb), dlist->da.items[index]); - rem_array_item(&(dlist->da), index); - } -} - -/* add item to the dynamic list with access array (index) */ -void* BLI_dlist_add_item_index(DynamicList *dlist, void *item, unsigned int index) -{ - if(!dlist || !dlist->da.items) return NULL; - - if((index <= dlist->da.max_item_index) && (dlist->da.items[index])) { - /* you can't place item at used index */ - return NULL; - } - else { - add_array_item(&(dlist->da), item, index); - BLI_addtail(&(dlist->lb), item); - return item; - } -} - -/* destroy dynamic list with access array */ -void BLI_dlist_destroy(DynamicList *dlist) -{ - if(!dlist) return; - - BLI_freelistN(&(dlist->lb)); - destroy_array(&(dlist->da)); -} - -/* initialize dynamic list with access array */ -void BLI_dlist_init(DynamicList *dlist) -{ - if(!dlist) return; - - dlist->lb.first = NULL; - dlist->lb.last = NULL; - - init_array(&(dlist->da)); -} - -/* reinitialize dynamic list with acces array */ -void BLI_dlist_reinit(DynamicList *dlist) -{ - if(!dlist) return; - - BLI_freelistN(&(dlist->lb)); - reinit_array(&(dlist->da)); -} - -/*=====================================================================================*/ diff --git a/source/blender/blenlib/intern/dynlib.c b/source/blender/blenlib/intern/dynlib.c index eb41916c619..f42b342e326 100644 --- a/source/blender/blenlib/intern/dynlib.c +++ b/source/blender/blenlib/intern/dynlib.c @@ -28,15 +28,9 @@ */ #include -#include -#include #include "../PIL_dynlib.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #if !defined(CHAR_MAX) #define CHAR_MAX 255 #endif @@ -47,6 +41,8 @@ */ #ifdef WIN32 +#include +#include #include diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c index 1f70a34329f..44abd13c3fd 100644 --- a/source/blender/blenlib/intern/edgehash.c +++ b/source/blender/blenlib/intern/edgehash.c @@ -125,7 +125,7 @@ void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val) { void BLI_edgehashIterator_step(EdgeHashIterator *ehi) { if (ehi->curEntry) { - ehi->curEntry= ehi->curEntry->next; + ehi->curEntry= ehi->curEntry->next; while (!ehi->curEntry) { ehi->curBucket++; if (ehi->curBucket==ehi->eh->nbuckets) diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c index 3503164ea56..7a24d9b36b1 100644 --- a/source/blender/blenlib/intern/fileops.c +++ b/source/blender/blenlib/intern/fileops.c @@ -29,7 +29,6 @@ #include #include -#include #include #include @@ -49,9 +48,6 @@ #include "BLI_blenlib.h" -#include "BLI_storage.h" -#include "BLI_fileops.h" -#include "BLI_callbacks.h" #include "BKE_utildefines.h" @@ -84,31 +80,6 @@ char *BLI_last_slash(const char *string) { else return lfslash; } -static const char *last_slash_len(const char *string, int len) { - int a; - - for(a=len-1; a>=0; a--) - if(string[a] == '/' || string[a] == '\\') - return &string[a]; - - return NULL; -} - -const char *BLI_short_filename(const char *string) { - const char *ls, *lls; - - ls= last_slash_len(string, strlen(string)); - if(!ls) - return string; - - lls= last_slash_len(string, ls-string); - - if(lls) - return lls+1; - else - return ls+1; -} - /* adds a slash if there isnt one there alredy */ int BLI_add_slash(char *string) { int len = strlen(string); @@ -234,6 +205,10 @@ int BLI_touch(const char *file) return 0; } +int BLI_exists(char *file) { + return BLI_exist(file); +} + #ifdef WIN32 static char str[MAXPATHLEN+12]; @@ -311,10 +286,6 @@ int BLI_link(char *file, char *to) { return 1; } -int BLI_exists(char *file) { - return (GetFileAttributes(file) != 0xFFFFFFFF); -} - void BLI_recurdir_fileops(char *dirname) { char *lslash; char tmp[MAXPATHLEN]; @@ -355,10 +326,10 @@ int BLI_rename(char *from, char *to) { return rename(from, to); } -#else /* The sane UNIX world */ +#else /* The weirdo UNIX world */ /* - * but the sane UNIX world is tied to the interface, and the system + * but the UNIX world is tied to the interface, and the system * timer, and... We implement a callback mechanism. The system will * have to initialise the callback before the functions will work! * */ @@ -403,10 +374,6 @@ int BLI_link(char *file, char *to) { return system(str); } -int BLI_exists(char *file) { - return BLI_exist(file); -} - void BLI_recurdir_fileops(char *dirname) { char *lslash; char tmp[MAXPATHLEN]; diff --git a/source/blender/blenlib/intern/fnmatch.c b/source/blender/blenlib/intern/fnmatch.c index ccb6fa72ea8..c44ee754110 100644 --- a/source/blender/blenlib/intern/fnmatch.c +++ b/source/blender/blenlib/intern/fnmatch.c @@ -16,10 +16,6 @@ #ifdef WIN32 -#if HAVE_CONFIG_H -# include -#endif - /* Enable GNU extensions in fnmatch.h. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 @@ -66,97 +62,97 @@ fnmatch (const char *pattern, const char *string, int flags) # define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c)) while ((c = *p++) != '\0') - { - c = FOLD (c); + { + c = FOLD (c); - switch (c) + switch (c) { case '?': if (*n == '\0') - return FNM_NOMATCH; + return FNM_NOMATCH; else if ((flags & FNM_FILE_NAME) && *n == '/') - return FNM_NOMATCH; + return FNM_NOMATCH; else if ((flags & FNM_PERIOD) && *n == '.' && (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) - return FNM_NOMATCH; + return FNM_NOMATCH; break; case '\\': if (!(flags & FNM_NOESCAPE)) - { - c = *p++; - if (c == '\0') + { + c = *p++; + if (c == '\0') /* Trailing \ loses. */ return FNM_NOMATCH; - c = FOLD (c); - } + c = FOLD (c); + } if (FOLD (*n) != c) - return FNM_NOMATCH; + return FNM_NOMATCH; break; case '*': if ((flags & FNM_PERIOD) && *n == '.' && - (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) - return FNM_NOMATCH; + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; for (c = *p++; c == '?' || c == '*'; c = *p++) - { - if ((flags & FNM_FILE_NAME) && *n == '/') + { + if ((flags & FNM_FILE_NAME) && *n == '/') /* A slash does not match a wildcard under FNM_FILE_NAME. */ return FNM_NOMATCH; - else if (c == '?') + else if (c == '?') { /* A ? needs to match one character. */ if (*n == '\0') - /* There isn't another character; no match. */ - return FNM_NOMATCH; + /* There isn't another character; no match. */ + return FNM_NOMATCH; else - /* One character of the string is consumed in matching - this ? wildcard, so *??? won't match if there are - less than three characters. */ - ++n; + /* One character of the string is consumed in matching + this ? wildcard, so *??? won't match if there are + less than three characters. */ + ++n; + } } - } if (c == '\0') - return 0; + return 0; { - char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; - c1 = FOLD (c1); - for (--p; *n != '\0'; ++n) - if ((c == '[' || FOLD (*n) == c1) && + char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; + c1 = FOLD (c1); + for (--p; *n != '\0'; ++n) + if ((c == '[' || FOLD (*n) == c1) && fnmatch (p, n, flags & ~FNM_PERIOD) == 0) return 0; - return FNM_NOMATCH; + return FNM_NOMATCH; } case '[': { - /* Nonzero if the sense of the character class is inverted. */ - register int not; + /* Nonzero if the sense of the character class is inverted. */ + register int not; - if (*n == '\0') - return FNM_NOMATCH; + if (*n == '\0') + return FNM_NOMATCH; - if ((flags & FNM_PERIOD) && *n == '.' && + if ((flags & FNM_PERIOD) && *n == '.' && (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) - return FNM_NOMATCH; + return FNM_NOMATCH; - not = (*p == '!' || *p == '^'); - if (not) - ++p; + not = (*p == '!' || *p == '^'); + if (not) + ++p; - c = *p++; - for (;;) - { + c = *p++; + for (;;) + { register char cstart = c, cend = c; if (!(flags & FNM_NOESCAPE) && c == '\\') { - if (*p == '\0') - return FNM_NOMATCH; - cstart = cend = *p++; + if (*p == '\0') + return FNM_NOMATCH; + cstart = cend = *p++; } cstart = cend = FOLD (cstart); @@ -174,14 +170,14 @@ fnmatch (const char *pattern, const char *string, int flags) if (c == '-' && *p != ']') { - cend = *p++; - if (!(flags & FNM_NOESCAPE) && cend == '\\') - cend = *p++; - if (cend == '\0') - return FNM_NOMATCH; - cend = FOLD (cend); + cend = *p++; + if (!(flags & FNM_NOESCAPE) && cend == '\\') + cend = *p++; + if (cend == '\0') + return FNM_NOMATCH; + cend = FOLD (cend); - c = *p++; + c = *p++; } if (FOLD (*n) >= cstart && FOLD (*n) <= cend) @@ -189,15 +185,15 @@ fnmatch (const char *pattern, const char *string, int flags) if (c == ']') break; - } - if (!not) - return FNM_NOMATCH; - break; + } + if (!not) + return FNM_NOMATCH; + break; matched:; - /* Skip the rest of the [...] that already matched. */ - while (c != ']') - { + /* Skip the rest of the [...] that already matched. */ + while (c != ']') + { if (c == '\0') /* [... (unterminated) loses. */ return FNM_NOMATCH; @@ -205,31 +201,31 @@ fnmatch (const char *pattern, const char *string, int flags) c = *p++; if (!(flags & FNM_NOESCAPE) && c == '\\') { - if (*p == '\0') - return FNM_NOMATCH; - /* XXX 1003.2d11 is unclear if this is right. */ - ++p; + if (*p == '\0') + return FNM_NOMATCH; + /* XXX 1003.2d11 is unclear if this is right. */ + ++p; } - } - if (not) - return FNM_NOMATCH; + } + if (not) + return FNM_NOMATCH; } break; default: if (c != FOLD (*n)) - return FNM_NOMATCH; + return FNM_NOMATCH; } - ++n; - } + ++n; + } if (*n == '\0') - return 0; + return 0; if ((flags & FNM_LEADING_DIR) && *n == '/') - /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ - return 0; + /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ + return 0; return FNM_NOMATCH; diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c index b08631b9317..6d6abc88999 100644 --- a/source/blender/blenlib/intern/freetypefont.c +++ b/source/blender/blenlib/intern/freetypefont.c @@ -36,10 +36,11 @@ #include #include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_BBOX_H -#include FT_SIZES_H -#include +/* not needed yet */ +// #include FT_GLYPH_H +// #include FT_BBOX_H +// #include FT_SIZES_H +// #include #include "MEM_guardedalloc.h" @@ -49,7 +50,6 @@ //XXX #include "BIF_toolbox.h" -#include "BKE_global.h" #include "BKE_font.h" #include "BKE_utildefines.h" @@ -150,7 +150,7 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf nu->pntsu = onpoints[j]; nu->resolu= 8; nu->flag= CU_2D; - nu->flagu= CU_CYCLIC; + nu->flagu= CU_NURB_CYCLIC; nu->bezt = bezt; //individual curve loop, start-end @@ -429,7 +429,7 @@ static int check_freetypefont(PackedFile * pf) &face ); if(err) { success = 0; - //XXX error("This is not a valid font"); + //XXX error("This is not a valid font"); } else { /* @@ -522,14 +522,14 @@ int BLI_vfontchar_from_freetypefont(VFont *vfont, unsigned long character) typedef struct FT_Outline_ { - short n_contours; /* number of contours in glyph */ - short n_points; /* number of points in the glyph */ + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ - FT_Vector* points; /* the outline's points */ - char* tags; /* the points flags */ - short* contours; /* the contour end points */ + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ - int flags; /* outline masks */ + int flags; /* outline masks */ } FT_Outline; @@ -569,44 +569,44 @@ The following rules are applied to decompose the contour's points into segments Note that it is possible to mix conic and cubic arcs in a single contour, even though no current font driver produces such outlines. - * # on - * off - __---__ + * # on + * off + __---__ #-__ _-- -_ - --__ _- - - --__ # \ - --__ # - -# - Two "on" points + --__ _- - + --__ # \ + --__ # + -# + Two "on" points Two "on" points and one "conic" point - between them + between them - * + * # __ Two "on" points with two "conic" \ - - points between them. The point - \ / \ marked '0' is the middle of the - - 0 \ "off" points, and is a 'virtual' - -_ _- # "on" point where the curve passes. - -- It does not appear in the point - list. - * + \ / \ marked '0' is the middle of the + - 0 \ "off" points, and is a 'virtual' + -_ _- # "on" point where the curve passes. + -- It does not appear in the point + list. + * - * # on - * * off - __---__ - _-- -_ - _- - + * # on + * * off + __---__ + _-- -_ + _- - # \ - # + # - Two "on" points + Two "on" points and two "cubic" point - between them + between them Each glyph's original outline points are located on a grid of indivisible units. The points are stored diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c index dd708b27019..b1ea058eda1 100644 --- a/source/blender/blenlib/intern/graph.c +++ b/source/blender/blenlib/intern/graph.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -529,7 +529,7 @@ void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3]) sub_v3_v3v3(dv, v, center); project_v3_v3v3(pv, dv, axis); mul_v3_fl(pv, -2); - add_v3_v3v3(v, v, pv); + add_v3_v3(v, pv); } static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring, int total, float axis[3], float limit, int group) @@ -801,7 +801,7 @@ static void testAxialSymmetry(BGraph *graph, BNode* root_node, BNode* node1, BNo sub_v3_v3v3(p, root_node->p, node2->p); cross_v3_v3v3(vec, p, axis); - add_v3_v3v3(vec, vec, nor); + add_v3_v3(vec, nor); cross_v3_v3v3(nor, vec, axis); @@ -905,7 +905,7 @@ static void markdownSecondarySymmetry(BGraph *graph, BNode *node, int depth, int /* If arc is on the axis */ else if (connectedArc->symmetry_level == level) { - add_v3_v3v3(axis, axis, connectedArc->head->p); + add_v3_v3(axis, connectedArc->head->p); sub_v3_v3v3(axis, axis, connectedArc->tail->p); } } diff --git a/source/blender/blenlib/intern/gsqueue.c b/source/blender/blenlib/intern/gsqueue.c index fbc1708c133..a8b40e187d8 100644 --- a/source/blender/blenlib/intern/gsqueue.c +++ b/source/blender/blenlib/intern/gsqueue.c @@ -31,10 +31,6 @@ #include "MEM_guardedalloc.h" #include "BLI_gsqueue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - typedef struct _GSQueueElem GSQueueElem; struct _GSQueueElem { GSQueueElem *next; diff --git a/source/blender/blenlib/intern/jitter.c b/source/blender/blenlib/intern/jitter.c index 12b7482897a..dfc554394d6 100644 --- a/source/blender/blenlib/intern/jitter.c +++ b/source/blender/blenlib/intern/jitter.c @@ -30,13 +30,10 @@ */ #include -#include #include #include "MEM_guardedalloc.h" -#include "BLI_math.h" #include "BLI_rand.h" -#include "BLI_jitter.h" void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1) diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c index 5d046dce023..0a6831558d1 100644 --- a/source/blender/blenlib/intern/listbase.c +++ b/source/blender/blenlib/intern/listbase.c @@ -108,6 +108,17 @@ void BLI_remlink(ListBase *listbase, void *vlink) if (listbase->first == link) listbase->first = link->next; } +int BLI_remlink_safe(ListBase *listbase, void *vlink) +{ + if(BLI_findindex(listbase, vlink) != -1) { + BLI_remlink(listbase, vlink); + return 1; + } + else { + return 0; + } +} + void BLI_freelinkN(ListBase *listbase, void *vlink) { diff --git a/source/blender/blenlib/intern/math_base.c b/source/blender/blenlib/intern/math_base.c index a0d878f3a03..686b35a878e 100644 --- a/source/blender/blenlib/intern/math_base.c +++ b/source/blender/blenlib/intern/math_base.c @@ -25,10 +25,6 @@ * ***** END GPL LICENSE BLOCK ***** * */ -#include -#include -#include -#include #include "BLI_math.h" @@ -49,12 +45,12 @@ double copysign(double x, double y) /* from python 3.1 pymath.c */ double round(double x) { - double absx, y; - absx = fabs(x); - y = floor(absx); - if (absx - y >= 0.5) - y += 1.0; - return copysign(y, x); + double absx, y; + absx = fabs(x); + y = floor(absx); + if (absx - y >= 0.5) + y += 1.0; + return copysign(y, x); } #endif diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c index fa0ca097ef1..b364ff73e4f 100644 --- a/source/blender/blenlib/intern/math_base_inline.c +++ b/source/blender/blenlib/intern/math_base_inline.c @@ -26,7 +26,6 @@ * */ #include -#include #include #include #include diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c index fc6e722afeb..6637d74dbb1 100644 --- a/source/blender/blenlib/intern/math_color.c +++ b/source/blender/blenlib/intern/math_color.c @@ -25,10 +25,6 @@ * ***** END GPL LICENSE BLOCK ***** * */ -#include -#include -#include -#include #include "BLI_math.h" @@ -113,7 +109,9 @@ void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb) *lb=b; } -void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr) +/* The RGB inputs are supposed gamma corrected and in the range 0 - 1.0f */ +/* Output YCC have a range of 16-235 and 16-240 except with JFIF_0_255 where the range is 0-255 */ +void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace) { float sr,sg, sb; float y, cr, cb; @@ -122,24 +120,53 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr) sg=255.0f*g; sb=255.0f*b; - - y=(0.257f*sr)+(0.504f*sg)+(0.098f*sb)+16.0f; - cb=(-0.148f*sr)-(0.291f*sg)+(0.439f*sb)+128.0f; - cr=(0.439f*sr)-(0.368f*sg)-(0.071f*sb)+128.0f; + switch (colorspace) { + case BLI_YCC_ITU_BT601 : + y=(0.257f*sr)+(0.504f*sg)+(0.098f*sb)+16.0f; + cb=(-0.148f*sr)-(0.291f*sg)+(0.439f*sb)+128.0f; + cr=(0.439f*sr)-(0.368f*sg)-(0.071f*sb)+128.0f; + break; + case BLI_YCC_ITU_BT709 : + y=(0.183f*sr)+(0.614f*sg)+(0.062f*sb)+16.0f; + cb=(-0.101f*sr)-(0.338f*sg)+(0.439f*sb)+128.0f; + cr=(0.439f*sr)-(0.399f*sg)-(0.040f*sb)+128.0f; + break; + case BLI_YCC_JFIF_0_255 : + y=(0.299f*sr)+(0.587f*sg)+(0.114f*sb); + cb=(-0.16874f*sr)-(0.33126f*sg)+(0.5f*sb)+128.0f; + cr=(0.5f*sr)-(0.41869f*sg)-(0.08131f*sb)+128.0f; + break; + } *ly=y; *lcb=cb; *lcr=cr; } -void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb) + +/* YCC input have a range of 16-235 and 16-240 exepect with JFIF_0_255 where the range is 0-255 */ +/* RGB outputs are in the range 0 - 1.0f */ +void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, int colorspace) { float r,g,b; - r=1.164f*(y-16.0f)+1.596f*(cr-128.0f); - g=1.164f*(y-16.0f)-0.813f*(cr-128.0f)-0.392f*(cb-128.0f); - b=1.164f*(y-16.0f)+2.017f*(cb-128.0f); - + switch (colorspace) { + case BLI_YCC_ITU_BT601 : + r=1.164f*(y-16.0f)+1.596f*(cr-128.0f); + g=1.164f*(y-16.0f)-0.813f*(cr-128.0f)-0.392f*(cb-128.0f); + b=1.164f*(y-16.0f)+2.017f*(cb-128.0f); + break; + case BLI_YCC_ITU_BT709 : + r=1.164f*(y-16.0f)+1.793f*(cr-128.0f); + g=1.164f*(y-16.0f)-0.534f*(cr-128.0f)-0.213f*(cb-128.0f); + b=1.164f*(y-16.0f)+2.115f*(cb-128.0f); + break; + case BLI_YCC_JFIF_0_255 : + r=y+1.402f*cr - 179.456f; + g=y-0.34414f*cb - 0.71414f*cr + 135.45984f; + b=y+1.772f*cb - 226.816f; + break; + } *lr=r/255.0f; *lg=g/255.0f; *lb=b/255.0f; @@ -369,21 +396,21 @@ int constrain_rgb(float *r, float *g, float *b) { float w; - /* Amount of white needed is w = - min(0, *r, *g, *b) */ + /* Amount of white needed is w = - min(0, *r, *g, *b) */ - w = (0 < *r) ? 0 : *r; - w = (w < *g) ? w : *g; - w = (w < *b) ? w : *b; - w = -w; + w = (0 < *r) ? 0 : *r; + w = (w < *g) ? w : *g; + w = (w < *b) ? w : *b; + w = -w; - /* Add just enough white to make r, g, b all positive. */ + /* Add just enough white to make r, g, b all positive. */ - if (w > 0) { - *r += w; *g += w; *b += w; - return 1; /* Color modified to fit RGB gamut */ - } + if (w > 0) { + *r += w; *g += w; *b += w; + return 1; /* Color modified to fit RGB gamut */ + } - return 0; /* Color within RGB gamut */ + return 0; /* Color within RGB gamut */ } float rgb_to_grayscale(float rgb[3]) diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 7e12cec5023..e8fb922ce4d 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -25,14 +25,13 @@ * ***** END GPL LICENSE BLOCK ***** * */ -#include -#include -#include -#include + +#include "MEM_guardedalloc.h" #include "BLI_math.h" #include "BLI_memarena.h" -#include "MEM_guardedalloc.h" + +#include "BKE_utildefines.h" /********************************** Polygons *********************************/ @@ -63,6 +62,7 @@ float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const floa n[0]= n1[1]*n2[2]-n1[2]*n2[1]; n[1]= n1[2]*n2[0]-n1[0]*n2[2]; n[2]= n1[0]*n2[1]-n1[1]*n2[0]; + return normalize_v3(n); } @@ -125,10 +125,6 @@ float area_tri_v3(const float v1[3], const float v2[3], const float v3[3]) /* T return (len/2.0f); } -#define MAX2(x,y) ((x)>(y) ? (x) : (y)) -#define MAX3(x,y,z) MAX2(MAX2((x),(y)) , (z)) - - float area_poly_v3(int nr, float verts[][3], float *normal) { float x, y, z, area, max; @@ -406,16 +402,17 @@ int isect_line_tri_v3(float p1[3], float p2[3], float v0[3], float v1[3], float sub_v3_v3v3(s, p1, v0); - cross_v3_v3v3(q, s, e1); - *lambda = f * dot_v3v3(e2, q); - if ((*lambda < 0.0)||(*lambda > 1.0)) return 0; - u = f * dot_v3v3(s, p); if ((u < 0.0)||(u > 1.0)) return 0; - v = f * dot_v3v3(d, q); + cross_v3_v3v3(q, s, e1); + + v = f * dot_v3v3(d, q); if ((v < 0.0)||((u + v) > 1.0)) return 0; + *lambda = f * dot_v3v3(e2, q); + if ((*lambda < 0.0)||(*lambda > 1.0)) return 0; + if(uv) { uv[0]= u; uv[1]= v; @@ -445,17 +442,18 @@ int isect_ray_tri_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2 sub_v3_v3v3(s, p1, v0); - cross_v3_v3v3(q, s, e1); - *lambda = f * dot_v3v3(e2, q); - if ((*lambda < 0.0)) return 0; - u = f * dot_v3v3(s, p); if ((u < 0.0)||(u > 1.0)) return 0; + cross_v3_v3v3(q, s, e1); + v = f * dot_v3v3(d, q); if ((v < 0.0)||((u + v) > 1.0)) return 0; - if(uv) { + *lambda = f * dot_v3v3(e2, q); + if ((*lambda < 0.0)) return 0; + + if(uv) { uv[0]= u; uv[1]= v; } @@ -465,36 +463,36 @@ int isect_ray_tri_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2 int isect_ray_tri_epsilon_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float epsilon) { - float p[3], s[3], e1[3], e2[3], q[3]; - float a, f, u, v; - - sub_v3_v3v3(e1, v1, v0); - sub_v3_v3v3(e2, v2, v0); - - cross_v3_v3v3(p, d, e2); - a = dot_v3v3(e1, p); - if (a == 0.0f) return 0; - f = 1.0f/a; - - sub_v3_v3v3(s, p1, v0); - - cross_v3_v3v3(q, s, e1); + float p[3], s[3], e1[3], e2[3], q[3]; + float a, f, u, v; - u = f * dot_v3v3(s, p); - if ((u < -epsilon)||(u > 1.0f+epsilon)) return 0; - - v = f * dot_v3v3(d, q); - if ((v < -epsilon)||((u + v) > 1.0f+epsilon)) return 0; + sub_v3_v3v3(e1, v1, v0); + sub_v3_v3v3(e2, v2, v0); - *lambda = f * dot_v3v3(e2, q); - if ((*lambda < 0.0f)) return 0; + cross_v3_v3v3(p, d, e2); + a = dot_v3v3(e1, p); + if (a == 0.0f) return 0; + f = 1.0f/a; - if(uv) { - uv[0]= u; - uv[1]= v; - } - - return 1; + sub_v3_v3v3(s, p1, v0); + + u = f * dot_v3v3(s, p); + if ((u < -epsilon)||(u > 1.0f+epsilon)) return 0; + + cross_v3_v3v3(q, s, e1); + + v = f * dot_v3v3(d, q); + if ((v < -epsilon)||((u + v) > 1.0f+epsilon)) return 0; + + *lambda = f * dot_v3v3(e2, q); + if ((*lambda < 0.0f)) return 0; + + if(uv) { + uv[0]= u; + uv[1]= v; + } + + return 1; } int isect_ray_tri_threshold_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold) @@ -724,7 +722,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v *lambda = newLambda; copy_v3_v3(ipoint,e1); mul_v3_fl(ipoint,e); - add_v3_v3v3(ipoint,ipoint,v0); + add_v3_v3(ipoint, v0); found_by_sweep=1; } } @@ -748,7 +746,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v *lambda = newLambda; copy_v3_v3(ipoint,e2); mul_v3_fl(ipoint,e); - add_v3_v3v3(ipoint,ipoint,v0); + add_v3_v3(ipoint, v0); found_by_sweep=1; } } @@ -777,7 +775,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v *lambda = newLambda; copy_v3_v3(ipoint,e3); mul_v3_fl(ipoint,e); - add_v3_v3v3(ipoint,ipoint,v1); + add_v3_v3(ipoint, v1); found_by_sweep=1; } } @@ -961,7 +959,7 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3] int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3]) { return (min1[0]next) { if(fabs(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabs(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT) { - add_v3_v3v3(vt->tang, vt->tang, tang); + add_v3_v3(vt->tang, tang); return; } } @@ -1852,10 +1869,12 @@ void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float s2= uv3[0] - uv1[0]; float t1= uv2[1] - uv1[1]; float t2= uv3[1] - uv1[1]; + float det= (s1 * t2 - s2 * t1); - if(s1 && s2 && t1 && t2) { /* otherwise 'tang' becomes nan */ - float tangv[3], ct[3], e1[3], e2[3], det; - det= 1.0f / (s1 * t2 - s2 * t1); + if(det != 0.0f) { /* otherwise 'tang' becomes nan */ + float tangv[3], ct[3], e1[3], e2[3]; + + det= 1.0f/det; /* normals in render are inversed... */ sub_v3_v3v3(e1, co1, co2); @@ -1877,11 +1896,11 @@ void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, } } -/********************************************************/ +/****************************** Vector Clouds ********************************/ /* vector clouds */ /* void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight,float (*rpos)[3], float *rweight, - float lloc[3],float rloc[3],float lrot[3][3],float lscale[3][3]) + float lloc[3],float rloc[3],float lrot[3][3],float lscale[3][3]) input ( @@ -1905,13 +1924,13 @@ pointers may be NULL if not needed /* can't believe there is none in math utils */ float _det_m3(float m2[3][3]) { - float det = 0.f; - if (m2){ - det= m2[0][0]* (m2[1][1]*m2[2][2] - m2[1][2]*m2[2][1]) - -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1]) - +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]); - } - return det; + float det = 0.f; + if (m2){ + det= m2[0][0]* (m2[1][1]*m2[2][2] - m2[1][2]*m2[2][1]) + -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1]) + +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]); + } + return det; } @@ -1936,19 +1955,19 @@ void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight,flo float v[3]; copy_v3_v3(v,pos[a]); mul_v3_fl(v,weight[a]); - add_v3_v3v3(accu_com,accu_com,v); + add_v3_v3(accu_com, v); accu_weight +=weight[a]; } - else add_v3_v3v3(accu_com,accu_com,pos[a]); + else add_v3_v3(accu_com, pos[a]); if (rweight){ float v[3]; copy_v3_v3(v,rpos[a]); mul_v3_fl(v,rweight[a]); - add_v3_v3v3(accu_rcom,accu_rcom,v); + add_v3_v3(accu_rcom, v); accu_rweight +=rweight[a]; } - else add_v3_v3v3(accu_rcom,accu_rcom,rpos[a]); + else add_v3_v3(accu_rcom, rpos[a]); } if (!weight || !rweight){ @@ -2036,3 +2055,422 @@ void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight,flo } } +/******************************* Form Factor *********************************/ + +static void vec_add_dir(float r[3], float v1[3], float v2[3], float fac) +{ + r[0]= v1[0] + fac*(v2[0] - v1[0]); + r[1]= v1[1] + fac*(v2[1] - v1[1]); + r[2]= v1[2] + fac*(v2[2] - v1[2]); +} + +static int ff_visible_quad(float p[3], float n[3], float v0[3], float v1[3], float v2[3], float q0[3], float q1[3], float q2[3], float q3[3]) +{ + static const float epsilon = 1e-6f; + float c, sd[3]; + + c= dot_v3v3(n, p); + + /* signed distances from the vertices to the plane. */ + sd[0]= dot_v3v3(n, v0) - c; + sd[1]= dot_v3v3(n, v1) - c; + sd[2]= dot_v3v3(n, v2) - c; + + if(fabsf(sd[0]) < epsilon) sd[0] = 0.0f; + if(fabsf(sd[1]) < epsilon) sd[1] = 0.0f; + if(fabsf(sd[2]) < epsilon) sd[2] = 0.0f; + + if(sd[0] > 0) { + if(sd[1] > 0) { + if(sd[2] > 0) { + // +++ + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // ++- + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + vec_add_dir(q2, v1, v2, (sd[1]/(sd[1]-sd[2]))); + vec_add_dir(q3, v0, v2, (sd[0]/(sd[0]-sd[2]))); + } + else { + // ++0 + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + } + else if(sd[1] < 0) { + if(sd[2] > 0) { + // +-+ + copy_v3_v3(q0, v0); + vec_add_dir(q1, v0, v1, (sd[0]/(sd[0]-sd[1]))); + vec_add_dir(q2, v1, v2, (sd[1]/(sd[1]-sd[2]))); + copy_v3_v3(q3, v2); + } + else if(sd[2] < 0) { + // +-- + copy_v3_v3(q0, v0); + vec_add_dir(q1, v0, v1, (sd[0]/(sd[0]-sd[1]))); + vec_add_dir(q2, v0, v2, (sd[0]/(sd[0]-sd[2]))); + copy_v3_v3(q3, q2); + } + else { + // +-0 + copy_v3_v3(q0, v0); + vec_add_dir(q1, v0, v1, (sd[0]/(sd[0]-sd[1]))); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + } + else { + if(sd[2] > 0) { + // +0+ + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // +0- + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + vec_add_dir(q2, v0, v2, (sd[0]/(sd[0]-sd[2]))); + copy_v3_v3(q3, q2); + } + else { + // +00 + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + } + } + else if(sd[0] < 0) { + if(sd[1] > 0) { + if(sd[2] > 0) { + // -++ + vec_add_dir(q0, v0, v1, (sd[0]/(sd[0]-sd[1]))); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + vec_add_dir(q3, v0, v2, (sd[0]/(sd[0]-sd[2]))); + } + else if(sd[2] < 0) { + // -+- + vec_add_dir(q0, v0, v1, (sd[0]/(sd[0]-sd[1]))); + copy_v3_v3(q1, v1); + vec_add_dir(q2, v1, v2, (sd[1]/(sd[1]-sd[2]))); + copy_v3_v3(q3, q2); + } + else { + // -+0 + vec_add_dir(q0, v0, v1, (sd[0]/(sd[0]-sd[1]))); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + } + else if(sd[1] < 0) { + if(sd[2] > 0) { + // --+ + vec_add_dir(q0, v0, v2, (sd[0]/(sd[0]-sd[2]))); + vec_add_dir(q1, v1, v2, (sd[1]/(sd[1]-sd[2]))); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // --- + return 0; + } + else { + // --0 + return 0; + } + } + else { + if(sd[2] > 0) { + // -0+ + vec_add_dir(q0, v0, v2, (sd[0]/(sd[0]-sd[2]))); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // -0- + return 0; + } + else { + // -00 + return 0; + } + } + } + else { + if(sd[1] > 0) { + if(sd[2] > 0) { + // 0++ + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // 0+- + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + vec_add_dir(q2, v1, v2, (sd[1]/(sd[1]-sd[2]))); + copy_v3_v3(q3, q2); + } + else { + // 0+0 + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + } + else if(sd[1] < 0) { + if(sd[2] > 0) { + // 0-+ + copy_v3_v3(q0, v0); + vec_add_dir(q1, v1, v2, (sd[1]/(sd[1]-sd[2]))); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // 0-- + return 0; + } + else { + // 0-0 + return 0; + } + } + else { + if(sd[2] > 0) { + // 00+ + copy_v3_v3(q0, v0); + copy_v3_v3(q1, v1); + copy_v3_v3(q2, v2); + copy_v3_v3(q3, q2); + } + else if(sd[2] < 0) { + // 00- + return 0; + } + else { + // 000 + return 0; + } + } + } + + return 1; +} + +/* altivec optimization, this works, but is unused */ + +#if 0 +#include + +typedef union { + vFloat v; + float f[4]; +} vFloatResult; + +static vFloat vec_splat_float(float val) +{ + return (vFloat){val, val, val, val}; +} + +static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3) +{ + vFloat vcos, rlen, vrx, vry, vrz, vsrx, vsry, vsrz, gx, gy, gz, vangle; + vUInt8 rotate = (vUInt8){4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3}; + vFloatResult vresult; + float result; + + /* compute r* */ + vrx = (vFloat){q0[0], q1[0], q2[0], q3[0]} - vec_splat_float(p[0]); + vry = (vFloat){q0[1], q1[1], q2[1], q3[1]} - vec_splat_float(p[1]); + vrz = (vFloat){q0[2], q1[2], q2[2], q3[2]} - vec_splat_float(p[2]); + + /* normalize r* */ + rlen = vec_rsqrte(vrx*vrx + vry*vry + vrz*vrz + vec_splat_float(1e-16f)); + vrx = vrx*rlen; + vry = vry*rlen; + vrz = vrz*rlen; + + /* rotate r* for cross and dot */ + vsrx= vec_perm(vrx, vrx, rotate); + vsry= vec_perm(vry, vry, rotate); + vsrz= vec_perm(vrz, vrz, rotate); + + /* cross product */ + gx = vsry*vrz - vsrz*vry; + gy = vsrz*vrx - vsrx*vrz; + gz = vsrx*vry - vsry*vrx; + + /* normalize */ + rlen = vec_rsqrte(gx*gx + gy*gy + gz*gz + vec_splat_float(1e-16f)); + gx = gx*rlen; + gy = gy*rlen; + gz = gz*rlen; + + /* angle */ + vcos = vrx*vsrx + vry*vsry + vrz*vsrz; + vcos= vec_max(vec_min(vcos, vec_splat_float(1.0f)), vec_splat_float(-1.0f)); + vangle= vacosf(vcos); + + /* dot */ + vresult.v = (vec_splat_float(n[0])*gx + + vec_splat_float(n[1])*gy + + vec_splat_float(n[2])*gz)*vangle; + + result= (vresult.f[0] + vresult.f[1] + vresult.f[2] + vresult.f[3])*(0.5f/(float)M_PI); + result= MAX2(result, 0.0f); + + return result; +} + +#endif + +/* SSE optimization, acos code doesn't work */ + +#if 0 + +#include + +static __m128 sse_approx_acos(__m128 x) +{ + /* needs a better approximation than taylor expansion of acos, since that + * gives big erros for near 1.0 values, sqrt(2*x)*acos(1-x) should work + * better, see http://www.tom.womack.net/projects/sse-fast-arctrig.html */ + + return _mm_set_ps1(1.0f); +} + +static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3) +{ + float r0[3], r1[3], r2[3], r3[3], g0[3], g1[3], g2[3], g3[3]; + float a1, a2, a3, a4, dot1, dot2, dot3, dot4, result; + float fresult[4] __attribute__((aligned(16))); + __m128 qx, qy, qz, rx, ry, rz, rlen, srx, sry, srz, gx, gy, gz, glen, rcos, angle, aresult; + + /* compute r */ + qx = _mm_set_ps(q3[0], q2[0], q1[0], q0[0]); + qy = _mm_set_ps(q3[1], q2[1], q1[1], q0[1]); + qz = _mm_set_ps(q3[2], q2[2], q1[2], q0[2]); + + rx = qx - _mm_set_ps1(p[0]); + ry = qy - _mm_set_ps1(p[1]); + rz = qz - _mm_set_ps1(p[2]); + + /* normalize r */ + rlen = _mm_rsqrt_ps(rx*rx + ry*ry + rz*rz + _mm_set_ps1(1e-16f)); + rx = rx*rlen; + ry = ry*rlen; + rz = rz*rlen; + + /* cross product */ + srx = _mm_shuffle_ps(rx, rx, _MM_SHUFFLE(0,3,2,1)); + sry = _mm_shuffle_ps(ry, ry, _MM_SHUFFLE(0,3,2,1)); + srz = _mm_shuffle_ps(rz, rz, _MM_SHUFFLE(0,3,2,1)); + + gx = sry*rz - srz*ry; + gy = srz*rx - srx*rz; + gz = srx*ry - sry*rx; + + /* normalize g */ + glen = _mm_rsqrt_ps(gx*gx + gy*gy + gz*gz + _mm_set_ps1(1e-16f)); + gx = gx*glen; + gy = gy*glen; + gz = gz*glen; + + /* compute angle */ + rcos = rx*srx + ry*sry + rz*srz; + rcos= _mm_max_ps(_mm_min_ps(rcos, _mm_set_ps1(1.0f)), _mm_set_ps1(-1.0f)); + + angle = sse_approx_cos(rcos); + aresult = (_mm_set_ps1(n[0])*gx + _mm_set_ps1(n[1])*gy + _mm_set_ps1(n[2])*gz)*angle; + + /* sum together */ + result= (fresult[0] + fresult[1] + fresult[2] + fresult[3])*(0.5f/(float)M_PI); + result= MAX2(result, 0.0f); + + return result; +} + +#endif + +static void ff_normalize(float n[3]) +{ + float d; + + d= dot_v3v3(n, n); + + if(d > 1.0e-35F) { + d= 1.0f/sqrtf(d); + + n[0] *= d; + n[1] *= d; + n[2] *= d; + } +} + +static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3) +{ + float r0[3], r1[3], r2[3], r3[3], g0[3], g1[3], g2[3], g3[3]; + float a1, a2, a3, a4, dot1, dot2, dot3, dot4, result; + + sub_v3_v3v3(r0, q0, p); + sub_v3_v3v3(r1, q1, p); + sub_v3_v3v3(r2, q2, p); + sub_v3_v3v3(r3, q3, p); + + ff_normalize(r0); + ff_normalize(r1); + ff_normalize(r2); + ff_normalize(r3); + + cross_v3_v3v3(g0, r1, r0); ff_normalize(g0); + cross_v3_v3v3(g1, r2, r1); ff_normalize(g1); + cross_v3_v3v3(g2, r3, r2); ff_normalize(g2); + cross_v3_v3v3(g3, r0, r3); ff_normalize(g3); + + a1= saacosf(dot_v3v3(r0, r1)); + a2= saacosf(dot_v3v3(r1, r2)); + a3= saacosf(dot_v3v3(r2, r3)); + a4= saacosf(dot_v3v3(r3, r0)); + + dot1= dot_v3v3(n, g0); + dot2= dot_v3v3(n, g1); + dot3= dot_v3v3(n, g2); + dot4= dot_v3v3(n, g3); + + result= (a1*dot1 + a2*dot2 + a3*dot3 + a4*dot4)*0.5f/(float)M_PI; + result= MAX2(result, 0.0f); + + return result; +} + +float form_factor_hemi_poly(float p[3], float n[3], float v1[3], float v2[3], float v3[3], float v4[3]) +{ + /* computes how much hemisphere defined by point and normal is + covered by a quad or triangle, cosine weighted */ + float q0[3], q1[3], q2[3], q3[3], contrib= 0.0f; + + if(ff_visible_quad(p, n, v1, v2, v3, q0, q1, q2, q3)) + contrib += ff_quad_form_factor(p, n, q0, q1, q2, q3); + + if(v4 && ff_visible_quad(p, n, v1, v3, v4, q0, q1, q2, q3)) + contrib += ff_quad_form_factor(p, n, q0, q1, q2, q3); + + return contrib; +} + diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c new file mode 100644 index 00000000000..697ac8dc782 --- /dev/null +++ b/source/blender/blenlib/intern/math_geom_inline.c @@ -0,0 +1,138 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: some of this file. + * + * ***** END GPL LICENSE BLOCK ***** + * */ + +#include "BLI_math.h" + +#ifndef BLI_MATH_GEOM_INLINE +#define BLI_MATH_GEOM_INLINE + +/****************************** Spherical Harmonics **************************/ + +MINLINE void zero_sh(float r[9]) +{ + memset(r, 0, sizeof(float)*9); +} + +MINLINE void copy_sh_sh(float r[9], float a[9]) +{ + memcpy(r, a, sizeof(float)*9); +} + +MINLINE void mul_sh_fl(float r[9], float f) +{ + int i; + + for(i=0; i<9; i++) + r[i] *= f; +} + +MINLINE void add_sh_shsh(float r[9], float a[9], float b[9]) +{ + int i; + + for(i=0; i<9; i++) + r[i]= a[i] + b[i]; +} + +MINLINE float dot_shsh(float a[9], float b[9]) +{ + float r= 0.0f; + int i; + + for(i=0; i<9; i++) + r += a[i]*b[i]; + + return r; +} + +MINLINE float diffuse_shv3(float sh[9], float v[3]) +{ + /* See formula (13) in: + "An Efficient Representation for Irradiance Environment Maps" */ + static const float c1 = 0.429043f, c2 = 0.511664f, c3 = 0.743125f; + static const float c4 = 0.886227f, c5 = 0.247708f; + float x, y, z, sum; + + x= v[0]; + y= v[1]; + z= v[2]; + + sum= c1*sh[8]*(x*x - y*y); + sum += c3*sh[6]*z*z; + sum += c4*sh[0]; + sum += -c5*sh[6]; + sum += 2.0f*c1*(sh[4]*x*y + sh[7]*x*z + sh[5]*y*z); + sum += 2.0f*c2*(sh[3]*x + sh[1]*y + sh[2]*z); + + return sum; +} + +MINLINE void vec_fac_to_sh(float r[9], float v[3], float f) +{ + /* See formula (3) in: + "An Efficient Representation for Irradiance Environment Maps" */ + float sh[9], x, y, z; + + x= v[0]; + y= v[1]; + z= v[2]; + + sh[0]= 0.282095f; + + sh[1]= 0.488603f*y; + sh[2]= 0.488603f*z; + sh[3]= 0.488603f*x; + + sh[4]= 1.092548f*x*y; + sh[5]= 1.092548f*y*z; + sh[6]= 0.315392f*(3.0f*z*z - 1.0f); + sh[7]= 1.092548f*x*z; + sh[8]= 0.546274f*(x*x - y*y); + + mul_sh_fl(sh, f); + copy_sh_sh(r, sh); +} + +MINLINE float eval_shv3(float sh[9], float v[3]) +{ + float tmp[9]; + + vec_fac_to_sh(tmp, v, 1.0f); + return dot_shsh(tmp, sh); +} + +MINLINE void madd_sh_shfl(float r[9], float sh[3], float f) +{ + float tmp[9]; + + copy_sh_sh(tmp, sh); + mul_sh_fl(tmp, f); + add_sh_shsh(r, r, tmp); +} + +#endif /* BLI_MATH_GEOM_INLINE */ + diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index c970f2132c3..6e8f4622488 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -25,10 +25,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include -#include #include "BLI_math.h" @@ -129,10 +125,15 @@ void swap_m4m4(float m1[][4], float m2[][4]) /******************************** Arithmetic *********************************/ -void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4]) +void mul_m4_m4m4(float m1[][4], float m2_[][4], float m3_[][4]) { - /* matrix product: m1[j][k] = m2[j][i].m3[i][k] */ + float m2[4][4], m3[4][4]; + /* copy so it works when m1 is the same pointer as m2 or m3 */ + copy_m4_m4(m2, m2_); + copy_m4_m4(m3, m3_); + + /* matrix product: m1[j][k] = m2[j][i].m3[i][k] */ m1[0][0] = m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0] + m2[0][3]*m3[3][0]; m1[0][1] = m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1] + m2[0][3]*m3[3][1]; m1[0][2] = m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2] + m2[0][3]*m3[3][2]; @@ -155,20 +156,26 @@ void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4]) } -void mul_m3_m3m3(float m1[][3], float m3[][3], float m2[][3]) +void mul_m3_m3m3(float m1[][3], float m3_[][3], float m2_[][3]) { - /* m1[i][j] = m2[i][k]*m3[k][j], args are flipped! */ - m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0]; - m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1]; - m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2]; + float m2[3][3], m3[3][3]; - m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0]; - m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1]; - m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2]; + /* copy so it works when m1 is the same pointer as m2 or m3 */ + copy_m3_m3(m2, m2_); + copy_m3_m3(m3, m3_); - m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0]; - m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1]; - m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2]; + /* m1[i][j] = m2[i][k]*m3[k][j], args are flipped! */ + m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0]; + m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1]; + m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2]; + + m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0]; + m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1]; + m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2]; + + m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0]; + m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1]; + m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2]; } void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3]) @@ -187,18 +194,18 @@ void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3]) /* m1 = m2 * m3, ignore the elements on the 4th row/column of m3*/ void mul_m3_m3m4(float m1[][3], float m2[][3], float m3[][4]) { - /* m1[i][j] = m2[i][k] * m3[k][j] */ - m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] +m2[0][2] * m3[2][0]; - m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] +m2[0][2] * m3[2][1]; - m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] +m2[0][2] * m3[2][2]; + /* m1[i][j] = m2[i][k] * m3[k][j] */ + m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] +m2[0][2] * m3[2][0]; + m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] +m2[0][2] * m3[2][1]; + m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] +m2[0][2] * m3[2][2]; - m1[1][0] = m2[1][0] * m3[0][0] + m2[1][1] * m3[1][0] +m2[1][2] * m3[2][0]; - m1[1][1] = m2[1][0] * m3[0][1] + m2[1][1] * m3[1][1] +m2[1][2] * m3[2][1]; - m1[1][2] = m2[1][0] * m3[0][2] + m2[1][1] * m3[1][2] +m2[1][2] * m3[2][2]; + m1[1][0] = m2[1][0] * m3[0][0] + m2[1][1] * m3[1][0] +m2[1][2] * m3[2][0]; + m1[1][1] = m2[1][0] * m3[0][1] + m2[1][1] * m3[1][1] +m2[1][2] * m3[2][1]; + m1[1][2] = m2[1][0] * m3[0][2] + m2[1][1] * m3[1][2] +m2[1][2] * m3[2][2]; - m1[2][0] = m2[2][0] * m3[0][0] + m2[2][1] * m3[1][0] +m2[2][2] * m3[2][0]; - m1[2][1] = m2[2][0] * m3[0][1] + m2[2][1] * m3[1][1] +m2[2][2] * m3[2][1]; - m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] +m2[2][2] * m3[2][2]; + m1[2][0] = m2[2][0] * m3[0][0] + m2[2][1] * m3[1][0] +m2[2][2] * m3[2][0]; + m1[2][1] = m2[2][0] * m3[0][1] + m2[2][1] * m3[1][1] +m2[2][2] * m3[2][1]; + m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] +m2[2][2] * m3[2][2]; } void mul_m4_m3m4(float (*m1)[4], float (*m3)[3], float (*m2)[4]) @@ -325,17 +332,23 @@ void mul_project_m4_v4(float mat[][4], float *vec) vec[2] /= w; } -void mul_m4_v4(float mat[][4], float *vec) +void mul_v4_m4v4(float r[4], float mat[4][4], float v[4]) { - float x,y,z; + float x, y, z; - x=vec[0]; - y=vec[1]; - z= vec[2]; - vec[0]=x*mat[0][0] + y*mat[1][0] + z*mat[2][0] + mat[3][0]*vec[3]; - vec[1]=x*mat[0][1] + y*mat[1][1] + z*mat[2][1] + mat[3][1]*vec[3]; - vec[2]=x*mat[0][2] + y*mat[1][2] + z*mat[2][2] + mat[3][2]*vec[3]; - vec[3]=x*mat[0][3] + y*mat[1][3] + z*mat[2][3] + mat[3][3]*vec[3]; + x= v[0]; + y= v[1]; + z= v[2]; + + r[0]= x*mat[0][0] + y*mat[1][0] + z*mat[2][0] + mat[3][0]*v[3]; + r[1]= x*mat[0][1] + y*mat[1][1] + z*mat[2][1] + mat[3][1]*v[3]; + r[2]= x*mat[0][2] + y*mat[1][2] + z*mat[2][2] + mat[3][2]*v[3]; + r[3]= x*mat[0][3] + y*mat[1][3] + z*mat[2][3] + mat[3][3]*v[3]; +} + +void mul_m4_v4(float mat[4][4], float r[4]) +{ + mul_v4_m4v4(r, mat, r); } void mul_v3_m3v3(float r[3], float M[3][3], float a[3]) @@ -441,8 +454,8 @@ int invert_m3_m3(float m1[3][3], float m2[3][3]) /* then determinant old matrix! */ det= m2[0][0]* (m2[1][1]*m2[2][2] - m2[1][2]*m2[2][1]) - -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1]) - +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]); + -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1]) + +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]); success= (det != 0); @@ -827,8 +840,8 @@ float determinant_m3(float a1, float a2, float a3, float ans; ans = a1 * determinant_m2(b2, b3, c2, c3) - - b1 * determinant_m2(a2, a3, c2, c3) - + c1 * determinant_m2(a2, a3, b2, b3); + - b1 * determinant_m2(a2, a3, c2, c3) + + c1 * determinant_m2(a2, a3, b2, b3); return ans; } @@ -859,9 +872,9 @@ float determinant_m4(float m[][4]) d4= m[3][3]; ans = a1 * determinant_m3(b2, b3, b4, c2, c3, c4, d2, d3, d4) - - b1 * determinant_m3(a2, a3, a4, c2, c3, c4, d2, d3, d4) - + c1 * determinant_m3(a2, a3, a4, b2, b3, b4, d2, d3, d4) - - d1 * determinant_m3(a2, a3, a4, b2, b3, b4, c2, c3, c4); + - b1 * determinant_m3(a2, a3, a4, c2, c3, c4, d2, d3, d4) + + c1 * determinant_m3(a2, a3, a4, b2, b3, b4, d2, d3, d4) + - d1 * determinant_m3(a2, a3, a4, b2, b3, b4, c2, c3, c4); return ans; } @@ -942,54 +955,47 @@ void scale_m4_fl(float m[][4], float scale) void translate_m4(float mat[][4],float Tx, float Ty, float Tz) { - mat[3][0] += (Tx*mat[0][0] + Ty*mat[1][0] + Tz*mat[2][0]); - mat[3][1] += (Tx*mat[0][1] + Ty*mat[1][1] + Tz*mat[2][1]); - mat[3][2] += (Tx*mat[0][2] + Ty*mat[1][2] + Tz*mat[2][2]); + mat[3][0] += (Tx*mat[0][0] + Ty*mat[1][0] + Tz*mat[2][0]); + mat[3][1] += (Tx*mat[0][1] + Ty*mat[1][1] + Tz*mat[2][1]); + mat[3][2] += (Tx*mat[0][2] + Ty*mat[1][2] + Tz*mat[2][2]); } -void rotate_m4(float mat[][4], char axis,float angle) +void rotate_m4(float mat[][4], const char axis, const float angle) { int col; - float temp[4]; - float cosine, sine; + float temp[4]= {0.0f, 0.0f, 0.0f, 0.0f}; + float cosine, sine; - for(col=0; col<4 ; col++) /* init temp to zero matrix */ - temp[col] = 0; - - angle = (float)(angle*(3.1415926535/180.0)); - cosine = (float)cos(angle); - sine = (float)sin(angle); - switch(axis){ - case 'x': - case 'X': - for(col=0 ; col<4 ; col++) - temp[col] = cosine*mat[1][col] + sine*mat[2][col]; - for(col=0 ; col<4 ; col++) { - mat[2][col] = - sine*mat[1][col] + cosine*mat[2][col]; - mat[1][col] = temp[col]; + cosine = (float)cos(angle); + sine = (float)sin(angle); + switch(axis){ + case 'X': + for(col=0 ; col<4 ; col++) + temp[col] = cosine*mat[1][col] + sine*mat[2][col]; + for(col=0 ; col<4 ; col++) { + mat[2][col] = - sine*mat[1][col] + cosine*mat[2][col]; + mat[1][col] = temp[col]; } - break; + break; - case 'y': - case 'Y': - for(col=0 ; col<4 ; col++) - temp[col] = cosine*mat[0][col] - sine*mat[2][col]; - for(col=0 ; col<4 ; col++) { - mat[2][col] = sine*mat[0][col] + cosine*mat[2][col]; - mat[0][col] = temp[col]; - } + case 'Y': + for(col=0 ; col<4 ; col++) + temp[col] = cosine*mat[0][col] - sine*mat[2][col]; + for(col=0 ; col<4 ; col++) { + mat[2][col] = sine*mat[0][col] + cosine*mat[2][col]; + mat[0][col] = temp[col]; + } break; - case 'z': - case 'Z': - for(col=0 ; col<4 ; col++) - temp[col] = cosine*mat[0][col] + sine*mat[1][col]; - for(col=0 ; col<4 ; col++) { - mat[1][col] = - sine*mat[0][col] + cosine*mat[1][col]; - mat[0][col] = temp[col]; - } + case 'Z': + for(col=0 ; col<4 ; col++) + temp[col] = cosine*mat[0][col] + sine*mat[1][col]; + for(col=0 ; col<4 ; col++) { + mat[1][col] = - sine*mat[0][col] + cosine*mat[1][col]; + mat[0][col] = temp[col]; + } break; - } + } } void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], float srcweight) @@ -1143,3 +1149,458 @@ void print_m4(char *str, float m[][4]) printf("%f %f %f %f\n",m[0][3],m[1][3],m[2][3],m[3][3]); printf("\n"); } + +/*********************************** SVD ************************************ + * from TNT matrix library + + * Compute the Single Value Decomposition of an arbitrary matrix A + * That is compute the 3 matrices U,W,V with U column orthogonal (m,n) + * ,W a diagonal matrix and V an orthogonal square matrix s.t. + * A = U.W.Vt. From this decomposition it is trivial to compute the + * (pseudo-inverse) of A as Ainv = V.Winv.tranpose(U). + */ + +void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4]) +{ + float A[4][4]; + float work1[4], work2[4]; + int m = 4; + int n = 4; + int maxiter = 200; + int nu = minf(m,n); + + float *work = work1; + float *e = work2; + float eps; + + int i=0, j=0, k=0, p, pp, iter; + + // Reduce A to bidiagonal form, storing the diagonal elements + // in s and the super-diagonal elements in e. + + int nct = minf(m-1,n); + int nrt = maxf(0,minf(n-2,m)); + + copy_m4_m4(A, A_); + zero_m4(U); + zero_v4(s); + + for (k = 0; k < maxf(nct,nrt); k++) { + if (k < nct) { + + // Compute the transformation for the k-th column and + // place the k-th diagonal in s[k]. + // Compute 2-norm of k-th column without under/overflow. + s[k] = 0; + for (i = k; i < m; i++) { + s[k] = hypotf(s[k],A[i][k]); + } + if (s[k] != 0.0f) { + float invsk; + if (A[k][k] < 0.0f) { + s[k] = -s[k]; + } + invsk = 1.0f/s[k]; + for (i = k; i < m; i++) { + A[i][k] *= invsk; + } + A[k][k] += 1.0f; + } + s[k] = -s[k]; + } + for (j = k+1; j < n; j++) { + if ((k < nct) && (s[k] != 0.0f)) { + + // Apply the transformation. + + float t = 0; + for (i = k; i < m; i++) { + t += A[i][k]*A[i][j]; + } + t = -t/A[k][k]; + for (i = k; i < m; i++) { + A[i][j] += t*A[i][k]; + } + } + + // Place the k-th row of A into e for the + // subsequent calculation of the row transformation. + + e[j] = A[k][j]; + } + if (k < nct) { + + // Place the transformation in U for subsequent back + // multiplication. + + for (i = k; i < m; i++) + U[i][k] = A[i][k]; + } + if (k < nrt) { + + // Compute the k-th row transformation and place the + // k-th super-diagonal in e[k]. + // Compute 2-norm without under/overflow. + e[k] = 0; + for (i = k+1; i < n; i++) { + e[k] = hypotf(e[k],e[i]); + } + if (e[k] != 0.0f) { + float invek; + if (e[k+1] < 0.0f) { + e[k] = -e[k]; + } + invek = 1.0f/e[k]; + for (i = k+1; i < n; i++) { + e[i] *= invek; + } + e[k+1] += 1.0f; + } + e[k] = -e[k]; + if ((k+1 < m) & (e[k] != 0.0f)) { + float invek1; + + // Apply the transformation. + + for (i = k+1; i < m; i++) { + work[i] = 0.0f; + } + for (j = k+1; j < n; j++) { + for (i = k+1; i < m; i++) { + work[i] += e[j]*A[i][j]; + } + } + invek1 = 1.0f/e[k+1]; + for (j = k+1; j < n; j++) { + float t = -e[j]*invek1; + for (i = k+1; i < m; i++) { + A[i][j] += t*work[i]; + } + } + } + + // Place the transformation in V for subsequent + // back multiplication. + + for (i = k+1; i < n; i++) + V[i][k] = e[i]; + } + } + + // Set up the final bidiagonal matrix or order p. + + p = minf(n,m+1); + if (nct < n) { + s[nct] = A[nct][nct]; + } + if (m < p) { + s[p-1] = 0.0f; + } + if (nrt+1 < p) { + e[nrt] = A[nrt][p-1]; + } + e[p-1] = 0.0f; + + // If required, generate U. + + for (j = nct; j < nu; j++) { + for (i = 0; i < m; i++) { + U[i][j] = 0.0f; + } + U[j][j] = 1.0f; + } + for (k = nct-1; k >= 0; k--) { + if (s[k] != 0.0f) { + for (j = k+1; j < nu; j++) { + float t = 0; + for (i = k; i < m; i++) { + t += U[i][k]*U[i][j]; + } + t = -t/U[k][k]; + for (i = k; i < m; i++) { + U[i][j] += t*U[i][k]; + } + } + for (i = k; i < m; i++ ) { + U[i][k] = -U[i][k]; + } + U[k][k] = 1.0f + U[k][k]; + for (i = 0; i < k-1; i++) { + U[i][k] = 0.0f; + } + } else { + for (i = 0; i < m; i++) { + U[i][k] = 0.0f; + } + U[k][k] = 1.0f; + } + } + + // If required, generate V. + + for (k = n-1; k >= 0; k--) { + if ((k < nrt) & (e[k] != 0.0f)) { + for (j = k+1; j < nu; j++) { + float t = 0; + for (i = k+1; i < n; i++) { + t += V[i][k]*V[i][j]; + } + t = -t/V[k+1][k]; + for (i = k+1; i < n; i++) { + V[i][j] += t*V[i][k]; + } + } + } + for (i = 0; i < n; i++) { + V[i][k] = 0.0f; + } + V[k][k] = 1.0f; + } + + // Main iteration loop for the singular values. + + pp = p-1; + iter = 0; + eps = powf(2.0f,-52.0f); + while (p > 0) { + int kase=0; + k=0; + + // Test for maximum iterations to avoid infinite loop + if(maxiter == 0) + break; + maxiter--; + + // This section of the program inspects for + // negligible elements in the s and e arrays. On + // completion the variables kase and k are set as follows. + + // kase = 1 if s(p) and e[k-1] are negligible and k

= -1; k--) { + if (k == -1) { + break; + } + if (fabsf(e[k]) <= eps*(fabsf(s[k]) + fabsf(s[k+1]))) { + e[k] = 0.0f; + break; + } + } + if (k == p-2) { + kase = 4; + } else { + int ks; + for (ks = p-1; ks >= k; ks--) { + float t; + if (ks == k) { + break; + } + t = (ks != p ? fabsf(e[ks]) : 0.f) + + (ks != k+1 ? fabsf(e[ks-1]) : 0.0f); + if (fabsf(s[ks]) <= eps*t) { + s[ks] = 0.0f; + break; + } + } + if (ks == k) { + kase = 3; + } else if (ks == p-1) { + kase = 1; + } else { + kase = 2; + k = ks; + } + } + k++; + + // Perform the task indicated by kase. + + switch (kase) { + + // Deflate negligible s(p). + + case 1: { + float f = e[p-2]; + e[p-2] = 0.0f; + for (j = p-2; j >= k; j--) { + float t = hypotf(s[j],f); + float invt = 1.0f/t; + float cs = s[j]*invt; + float sn = f*invt; + s[j] = t; + if (j != k) { + f = -sn*e[j-1]; + e[j-1] = cs*e[j-1]; + } + + for (i = 0; i < n; i++) { + t = cs*V[i][j] + sn*V[i][p-1]; + V[i][p-1] = -sn*V[i][j] + cs*V[i][p-1]; + V[i][j] = t; + } + } + } + break; + + // Split at negligible s(k). + + case 2: { + float f = e[k-1]; + e[k-1] = 0.0f; + for (j = k; j < p; j++) { + float t = hypotf(s[j],f); + float invt = 1.0f/t; + float cs = s[j]*invt; + float sn = f*invt; + s[j] = t; + f = -sn*e[j]; + e[j] = cs*e[j]; + + for (i = 0; i < m; i++) { + t = cs*U[i][j] + sn*U[i][k-1]; + U[i][k-1] = -sn*U[i][j] + cs*U[i][k-1]; + U[i][j] = t; + } + } + } + break; + + // Perform one qr step. + + case 3: { + + // Calculate the shift. + + float scale = maxf(maxf(maxf(maxf( + fabsf(s[p-1]),fabsf(s[p-2])),fabsf(e[p-2])), + fabsf(s[k])),fabsf(e[k])); + float invscale = 1.0f/scale; + float sp = s[p-1]*invscale; + float spm1 = s[p-2]*invscale; + float epm1 = e[p-2]*invscale; + float sk = s[k]*invscale; + float ek = e[k]*invscale; + float b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)*0.5f; + float c = (sp*epm1)*(sp*epm1); + float shift = 0.0f; + float f, g; + if ((b != 0.0f) || (c != 0.0f)) { + shift = sqrtf(b*b + c); + if (b < 0.0f) { + shift = -shift; + } + shift = c/(b + shift); + } + f = (sk + sp)*(sk - sp) + shift; + g = sk*ek; + + // Chase zeros. + + for (j = k; j < p-1; j++) { + float t = hypotf(f,g); + /* division by zero checks added to avoid NaN (brecht) */ + float cs = (t == 0.0f)? 0.0f: f/t; + float sn = (t == 0.0f)? 0.0f: g/t; + if (j != k) { + e[j-1] = t; + } + f = cs*s[j] + sn*e[j]; + e[j] = cs*e[j] - sn*s[j]; + g = sn*s[j+1]; + s[j+1] = cs*s[j+1]; + + for (i = 0; i < n; i++) { + t = cs*V[i][j] + sn*V[i][j+1]; + V[i][j+1] = -sn*V[i][j] + cs*V[i][j+1]; + V[i][j] = t; + } + + t = hypotf(f,g); + /* division by zero checks added to avoid NaN (brecht) */ + cs = (t == 0.0f)? 0.0f: f/t; + sn = (t == 0.0f)? 0.0f: g/t; + s[j] = t; + f = cs*e[j] + sn*s[j+1]; + s[j+1] = -sn*e[j] + cs*s[j+1]; + g = sn*e[j+1]; + e[j+1] = cs*e[j+1]; + if (j < m-1) { + for (i = 0; i < m; i++) { + t = cs*U[i][j] + sn*U[i][j+1]; + U[i][j+1] = -sn*U[i][j] + cs*U[i][j+1]; + U[i][j] = t; + } + } + } + e[p-2] = f; + iter = iter + 1; + } + break; + + // Convergence. + + case 4: { + + // Make the singular values positive. + + if (s[k] <= 0.0f) { + s[k] = (s[k] < 0.0f ? -s[k] : 0.0f); + + for (i = 0; i <= pp; i++) + V[i][k] = -V[i][k]; + } + + // Order the singular values. + + while (k < pp) { + float t; + if (s[k] >= s[k+1]) { + break; + } + t = s[k]; + s[k] = s[k+1]; + s[k+1] = t; + if (k < n-1) { + for (i = 0; i < n; i++) { + t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] = t; + } + } + if (k < m-1) { + for (i = 0; i < m; i++) { + t = U[i][k+1]; U[i][k+1] = U[i][k]; U[i][k] = t; + } + } + k++; + } + iter = 0; + p--; + } + break; + } + } +} + +void pseudoinverse_m4_m4(float Ainv[4][4], float A[4][4], float epsilon) +{ + /* compute moon-penrose pseudo inverse of matrix, singular values + below epsilon are ignored for stability (truncated SVD) */ + float V[4][4], W[4], Wm[4][4], U[4][4]; + int i; + + transpose_m4(A); + svd_m4(V, W, U, A); + transpose_m4(U); + transpose_m4(V); + + zero_m4(Wm); + for(i=0; i<4; i++) + Wm[i][i]= (W[i] < epsilon)? 0.0f: 1.0f/W[i]; + + transpose_m4(V); + + mul_serie_m4(Ainv, U, Wm, V, 0, 0, 0, 0, 0); +} diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index a92f80e35c7..6b5bf7743ef 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -25,10 +25,6 @@ * ***** END GPL LICENSE BLOCK ***** * */ -#include -#include -#include -#include #include "BLI_math.h" @@ -904,12 +900,12 @@ void quat_to_eul(float *eul,float *quat) /* XYZ order */ void eul_to_quat(float *quat,float *eul) { - float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss; + float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss; - ti = eul[0]*0.5f; tj = eul[1]*0.5f; th = eul[2]*0.5f; - ci = (float)cos(ti); cj = (float)cos(tj); ch = (float)cos(th); - si = (float)sin(ti); sj = (float)sin(tj); sh = (float)sin(th); - cc = ci*ch; cs = ci*sh; sc = si*ch; ss = si*sh; + ti = eul[0]*0.5f; tj = eul[1]*0.5f; th = eul[2]*0.5f; + ci = (float)cos(ti); cj = (float)cos(tj); ch = (float)cos(th); + si = (float)sin(ti); sj = (float)sin(tj); sh = (float)sin(th); + cc = ci*ch; cs = ci*sh; sc = si*ch; ss = si*sh; quat[0] = cj*cc + sj*ss; quat[1] = cj*sc - sj*cs; @@ -923,8 +919,8 @@ void rotate_eul(float *beul, char axis, float ang) float eul[3], mat1[3][3], mat2[3][3], totmat[3][3]; eul[0]= eul[1]= eul[2]= 0.0f; - if(axis=='x') eul[0]= ang; - else if(axis=='y') eul[1]= ang; + if(axis=='X') eul[0]= ang; + else if(axis=='Y') eul[1]= ang; else eul[2]= ang; eul_to_mat3(mat1,eul); @@ -1029,7 +1025,7 @@ void mat3_to_compatible_eul(float *eul, float *oldrot,float mat[][3]) /* Euler Rotation Order Code: * was adapted from - ANSI C code from the article + ANSI C code from the article "Euler Angle Conversion" by Ken Shoemake, shoemake@graphics.cis.upenn.edu in "Graphics Gems IV", Academic Press, 1994 @@ -1242,9 +1238,9 @@ void rotate_eulO(float beul[3], short order, char axis, float ang) float eul[3], mat1[3][3], mat2[3][3], totmat[3][3]; eul[0]= eul[1]= eul[2]= 0.0f; - if (axis=='x') + if (axis=='X') eul[0]= ang; - else if (axis=='y') + else if (axis=='Y') eul[1]= ang; else eul[2]= ang; @@ -1303,11 +1299,11 @@ void eulO_to_gimbal_axis(float gmat[][3], float *eul, short order) freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. + misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Author: Ladislav Kavan, kavanl@cs.tcd.ie @@ -1507,3 +1503,13 @@ void copy_dq_dq(DualQuat *dq1, DualQuat *dq2) memcpy(dq1, dq2, sizeof(DualQuat)); } +/* lense/angle conversion (radians) */ +float lens_to_angle(float lens) +{ + return 2.0f * atan(16.0f/lens); +} + +float angle_to_lens(float angle) +{ + return 16.0f / tan(angle * 0.5f); +} diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 2452de0dc4c..9baf897c830 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -25,10 +25,6 @@ * ***** END GPL LICENSE BLOCK ***** * */ -#include -#include -#include -#include #include "BLI_math.h" @@ -59,6 +55,16 @@ void interp_v3_v3v3(float target[3], const float a[3], const float b[3], const f target[2]= s*a[2] + t*b[2]; } +void interp_v4_v4v4(float target[4], const float a[4], const float b[4], const float t) +{ + float s = 1.0f-t; + + target[0]= s*a[0] + t*b[0]; + target[1]= s*a[1] + t*b[1]; + target[2]= s*a[2] + t*b[2]; + target[3]= s*a[3] + t*b[3]; +} + /* weight 3 vectors, * 'w' must be unit length but is not a vector, just 3 weights */ void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]) @@ -77,6 +83,14 @@ void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3]; } +void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]) +{ + p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2]; + p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2]; + p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2]; + p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2]; +} + void mid_v3_v3v3(float *v, float *v1, float *v2) { v[0]= 0.5f*(v1[0] + v2[0]); diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c index 7fb6b8f6059..33d7f7cdd6d 100644 --- a/source/blender/blenlib/intern/math_vector_inline.c +++ b/source/blender/blenlib/intern/math_vector_inline.c @@ -66,7 +66,7 @@ MINLINE void copy_v3_v3(float r[3], const float a[3]) r[2]= a[2]; } -MINLINE void copy_v4_v4(float r[4], float a[4]) +MINLINE void copy_v4_v4(float r[4], const float a[4]) { r[0]= a[0]; r[1]= a[1]; @@ -97,45 +97,45 @@ MINLINE void swap_v4_v4(float a[4], float b[4]) /********************************* Arithmetic ********************************/ -MINLINE void add_v2_v2(float *r, float *a) +MINLINE void add_v2_v2(float *r, const float *a) { r[0] += a[0]; r[1] += a[1]; } -MINLINE void add_v2_v2v2(float *r, float *a, float *b) +MINLINE void add_v2_v2v2(float *r, const float *a, const float *b) { r[0]= a[0] + b[0]; r[1]= a[1] + b[1]; } -MINLINE void add_v3_v3(float *r, float *a) +MINLINE void add_v3_v3(float *r, const float *a) { r[0] += a[0]; r[1] += a[1]; r[2] += a[2]; } -MINLINE void add_v3_v3v3(float *r, float *a, float *b) +MINLINE void add_v3_v3v3(float *r, const float *a, const float *b) { r[0]= a[0] + b[0]; r[1]= a[1] + b[1]; r[2]= a[2] + b[2]; } -MINLINE void sub_v2_v2(float *r, float *a) +MINLINE void sub_v2_v2(float *r, const float *a) { r[0] -= a[0]; r[1] -= a[1]; } -MINLINE void sub_v2_v2v2(float *r, float *a, float *b) +MINLINE void sub_v2_v2v2(float *r, const float *a, const float *b) { r[0]= a[0] - b[0]; r[1]= a[1] - b[1]; } -MINLINE void sub_v3_v3(float *r, float *a) +MINLINE void sub_v3_v3(float *r, const float *a) { r[0] -= a[0]; r[1] -= a[1]; @@ -181,48 +181,70 @@ MINLINE void mul_v2_v2(float r[2], const float a[2]) r[1] *= a[1]; } -MINLINE void mul_v3_v3(float r[3], float a[3]) +MINLINE void mul_v3_v3(float r[3], const float a[3]) { r[0] *= a[0]; r[1] *= a[1]; r[2] *= a[2]; } -MINLINE void madd_v3_v3fl(float r[3], float a[3], float f) +MINLINE void mul_v4_fl(float r[4], float f) +{ + r[0]*= f; + r[1]*= f; + r[2]*= f; + r[3]*= f; +} + +MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f) +{ + r[0] += a[0]*f; + r[1] += a[1]*f; +} + +MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f) { r[0] += a[0]*f; r[1] += a[1]*f; r[2] += a[2]*f; } -MINLINE void madd_v3_v3v3(float r[3], float a[3], float b[3]) +MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3]) { r[0] += a[0]*b[0]; r[1] += a[1]*b[1]; r[2] += a[2]*b[2]; } -MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], const float f) +MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f) { r[0] = a[0] + b[0]*f; r[1] = a[1] + b[1]*f; } -MINLINE void madd_v3_v3v3fl(float r[3], float a[3], float b[3], float f) +MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f) { r[0] = a[0] + b[0]*f; r[1] = a[1] + b[1]*f; r[2] = a[2] + b[2]*f; } -MINLINE void madd_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]) +MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]) { r[0] = a[0] + b[0]*c[0]; r[1] = a[1] + b[1]*c[1]; r[2] = a[2] + b[2]*c[2]; } -MINLINE void mul_v3_v3v3(float *v, float *v1, float *v2) +MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f) +{ + r[0] += a[0]*f; + r[1] += a[1]*f; + r[2] += a[2]*f; + r[3] += a[3]*f; +} + +MINLINE void mul_v3_v3v3(float *v, const float *v1, const float *v2) { v[0] = v1[0] * v2[0]; v[1] = v1[1] * v2[1]; @@ -305,6 +327,14 @@ MINLINE float len_v3v3(const float a[3], const float b[3]) return len_v3(d); } +MINLINE float len_squared_v3v3(const float a[3], const float b[3]) +{ + float d[3]; + + sub_v3_v3v3(d, b, a); + return dot_v3v3(d, d); +} + MINLINE float normalize_v2_v2(float r[2], const float a[2]) { float d= dot_v2v2(a, a); @@ -371,14 +401,14 @@ MINLINE float normalize_v3(float n[3]) return normalize_v3_v3(n, n); } -MINLINE void normal_short_to_float_v3(float *out, short *in) +MINLINE void normal_short_to_float_v3(float *out, const short *in) { out[0] = in[0]*(1.0f/32767.0f); out[1] = in[1]*(1.0f/32767.0f); out[2] = in[2]*(1.0f/32767.0f); } -MINLINE void normal_float_to_short_v3(short *out, float *in) +MINLINE void normal_float_to_short_v3(short *out, const float *in) { out[0] = (short)(in[0]*32767.0f); out[1] = (short)(in[1]*32767.0f); @@ -414,7 +444,7 @@ MINLINE int compare_v3v3(float *v1, float *v2, float limit) MINLINE int compare_len_v3v3(float *v1, float *v2, float limit) { - float x,y,z; + float x,y,z; x=v1[0]-v2[0]; y=v1[1]-v2[1]; diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index 343589d9a41..141e5438bc9 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -35,11 +35,6 @@ #endif #include -#include "BLI_blenlib.h" - -#ifdef HAVE_CONFIG_H -#include -#endif /* local */ static float noise3_perlin(float vec[3]); @@ -204,8 +199,15 @@ float hashvectf[768]= { /* IMPROVED PERLIN NOISE */ /**************************/ -#define lerp(t, a, b) ((a)+(t)*((b)-(a))) -#define npfade(t) ((t)*(t)*(t)*((t)*((t)*6-15)+10)) +static float lerp(float t, float a, float b) +{ + return (a+t*(b-a)); +} + +static float npfade(float t) +{ + return (t*t*t*(t*(t*6.0f-15.0f)+10.0f)); +} static float grad(int hash, float x, float y, float z) { @@ -908,11 +910,11 @@ float g[512+2][3]= { #define DOT(a,b) (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]) #define setup(i,b0,b1,r0,r1) \ - t = vec[i] + 10000.; \ - b0 = ((int)t) & 255; \ - b1 = (b0+1) & 255; \ - r0 = t - (int)t; \ - r1 = r0 - 1.; + t = vec[i] + 10000.; \ + b0 = ((int)t) & 255; \ + b1 = (b0+1) & 255; \ + r0 = t - (int)t; \ + r1 = r0 - 1.; static float noise3_perlin(float vec[3]) @@ -1491,7 +1493,7 @@ float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves * ``offset'' is the zero offset, which determines multifractality (NOT USED??) */ /* this one is in fact rather confusing, - * there seem to be errors in the original source code (in all three versions of proc.text&mod), + * there seem to be errors in the original source code (in all three versions of proc.text&mod), * I modified it to something that made sense to me, so it might be wrong... */ float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis) { diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index fe43960b770..423bf452a4d 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -29,20 +29,14 @@ * various string, file, list operations. */ -#include -#include #include #include #include -#include -#include /* for log10 */ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_userdef_types.h" -#include "BLI_dynamiclist.h" #include "BLI_fileops.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -50,21 +44,13 @@ #include "BLI_storage_types.h" #include "BKE_utildefines.h" +#include "BKE_blender.h" // BLENDER_VERSION +#include "GHOST_Path-api.h" - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifndef WIN32 -#include -#else -#include -#endif - #ifdef WIN32 +#include #ifdef _WIN32_IE #undef _WIN32_IE @@ -75,29 +61,22 @@ #include "BLI_winstuff.h" -#endif - - -#ifndef WIN32 -#include -#endif - -#ifdef __APPLE__ -#include -#include -#endif +#else /* non windows */ #ifdef __linux__ #include "binreloc.h" #endif +#endif /* WIN32 */ + /* local */ static int add_win32_extension(char *name); +static char *blender_version_decimal(void); /* implementation */ -int BLI_stringdec(char *string, char *head, char *start, unsigned short *numlen) +int BLI_stringdec(const char *string, char *head, char *tail, unsigned short *numlen) { unsigned short len, len2, lenlslash = 0, nums = 0, nume = 0; short i, found = 0; @@ -124,8 +103,8 @@ int BLI_stringdec(char *string, char *head, char *start, unsigned short *numlen) if (found) break; } } - if (found){ - if (start) strcpy(start,&string[nume+1]); + if (found) { + if (tail) strcpy(tail, &string[nume+1]); if (head) { strcpy(head,string); head[nums]=0; @@ -133,22 +112,22 @@ int BLI_stringdec(char *string, char *head, char *start, unsigned short *numlen) if (numlen) *numlen = nume-nums+1; return ((int)atoi(&(string[nums]))); } - if (start) strcpy(start, string + len); + if (tail) strcpy(tail, string + len); if (head) { strncpy(head, string, len); - head[len] = 0; + head[len] = '\0'; } if (numlen) *numlen=0; return 0; } -void BLI_stringenc(char *string, char *head, char *start, unsigned short numlen, int pic) +void BLI_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic) { char fmtstr[16]=""; if(pic < 0) pic= 0; sprintf(fmtstr, "%%s%%.%dd%%s", numlen); - sprintf(string, fmtstr, head, pic, start); + sprintf(string, fmtstr, head, pic, tail); } @@ -270,7 +249,7 @@ void BLI_cleanup_file(const char *relabase, char *dir) short a; char *start, *eind; if (relabase) { - BLI_convertstringcode(dir, relabase); + BLI_path_abs(dir, relabase); } else { if (dir[0]=='/' && dir[1]=='/') { if (dir[2]== '\0') { @@ -369,10 +348,8 @@ void BLI_cleanup_file(const char *relabase, char *dir) } -void BLI_makestringcode(const char *relfile, char *file) +void BLI_path_rel(char *file, const char *relfile) { - char * p; - char * q; char * lslash; char temp[FILE_MAXDIR+FILE_MAXFILE]; char res[FILE_MAXDIR+FILE_MAXFILE]; @@ -420,11 +397,18 @@ void BLI_makestringcode(const char *relfile, char *file) { /* find the prefix of the filename that is equal for both filenames. This is replaced by the two slashes at the beginning */ - p = temp; - q = file; - while (*p == *q) { + char *p= temp; + char *q= file; + + while ((*p == *q)) { ++p; ++q; + /* dont search beyond the end of the string + * in the rare case they match */ + if ((*p=='\0') || (*q=='\0')) { + break; + } } + /* we might have passed the slash when the beginning of a dir matches so we rewind. Only check on the actual filename */ @@ -542,7 +526,7 @@ static void ensure_digits(char *path, int digits) } } -int BLI_convertstringframe(char *path, int frame, int digits) +int BLI_path_frame(char *path, int frame, int digits) { int ch_sta, ch_end; @@ -559,7 +543,7 @@ int BLI_convertstringframe(char *path, int frame, int digits) return 0; } -int BLI_convertstringframe_range(char *path, int sta, int end, int digits) +int BLI_path_frame_range(char *path, int sta, int end, int digits) { int ch_sta, ch_end; @@ -576,7 +560,7 @@ int BLI_convertstringframe_range(char *path, int sta, int end, int digits) return 0; } -int BLI_convertstringcode(char *path, const char *basepath) +int BLI_path_abs(char *path, const char *basepath) { int wasrelative = (strncmp(path, "//", 2)==0); char tmp[FILE_MAX]; @@ -638,7 +622,7 @@ int BLI_convertstringcode(char *path, const char *basepath) char *lslash= BLI_last_slash(base); if (lslash) { int baselen= (int) (lslash-base) + 1; - /* use path for for temp storage here, we copy back over it right away */ + /* use path for temp storage here, we copy back over it right away */ BLI_strncpy(path, tmp+2, FILE_MAX); memcpy(tmp, base, baselen); @@ -677,7 +661,7 @@ int BLI_convertstringcode(char *path, const char *basepath) * Should only be done with command line paths. * this is NOT somthing blenders internal paths support like the // prefix */ -int BLI_convertstringcwd(char *path) +int BLI_path_cwd(char *path) { int wasrelative = 1; int filelen = strlen(path); @@ -715,7 +699,7 @@ int BLI_convertstringcwd(char *path) } -/* copy di to fi, filename only */ +/* 'di's filename component is moved into 'fi', di is made a dir path */ void BLI_splitdirstring(char *di, char *fi) { char *lslash= BLI_last_slash(di); @@ -762,76 +746,50 @@ char *BLI_gethome(void) { ret = getenv("HOME"); if(ret) { - sprintf(dir, "%s\\.blender", ret); - if (BLI_exists(dir)) return dir; + sprintf(dir, "%s\\%s", ret, blender_version_decimal()); + if (BLI_is_dir(dir)) return dir; } /* else, check install dir (path containing blender.exe) */ - BLI_getInstallationDir(dir); - - if (BLI_exists(dir)) + if(BLI_getInstallationDir(dir)) { - strcat(dir,"\\.blender"); - if (BLI_exists(dir)) return(dir); + sprintf(dir, "%s", dir, blender_version_decimal()); + if (BLI_is_dir(dir)) return(dir); } - /* add user profile support for WIN 2K / NT */ + /* add user profile support for WIN 2K / NT. + * This is %APPDATA%, which translates to either + * %USERPROFILE%\Application Data or since Vista + * to %USERPROFILE%\AppData\Roaming + */ hResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, appdatapath); if (hResult == S_OK) { - if (BLI_exists(appdatapath)) { /* from fop, also below... */ + if (BLI_is_dir(appdatapath)) { /* from fop, also below... */ sprintf(dir, "%s\\Blender Foundation\\Blender", appdatapath); BLI_recurdir_fileops(dir); - if (BLI_exists(dir)) { - strcat(dir,"\\.blender"); - if(BLI_exists(dir)) return(dir); + if (BLI_is_dir(dir)) { + sprintf(dir,"%s\\%s", dir, blender_version_decimal()); + if(BLI_is_dir(dir)) return(dir); } } hResult = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, appdatapath); if (hResult == S_OK) { - if (BLI_exists(appdatapath)) + if (BLI_is_dir(appdatapath)) { /* from fop, also below... */ sprintf(dir, "%s\\Blender Foundation\\Blender", appdatapath); BLI_recurdir_fileops(dir); - if (BLI_exists(dir)) { - strcat(dir,"\\.blender"); - if(BLI_exists(dir)) return(dir); + if (BLI_is_dir(dir)) { + sprintf(dir,"%s\\%s", dir, blender_version_decimal()); + if(BLI_is_dir(dir)) return(dir); } } } } -#if 0 - ret = getenv("USERPROFILE"); - if (ret) { - if (BLI_exists(ret)) { /* from fop, also below... */ - sprintf(dir, "%s\\Application Data\\Blender Foundation\\Blender", ret); - BLI_recurdir_fileops(dir); - if (BLI_exists(dir)) { - strcat(dir,"\\.blender"); - if(BLI_exists(dir)) return(dir); - } - } - } -#endif - - /* - Saving in the Windows dir is less than desirable. - Use as a last resort ONLY! (aphex) - */ - - ret = getenv("WINDOWS"); - if (ret) { - if(BLI_exists(ret)) return ret; - } - - ret = getenv("WINDIR"); - if (ret) { - if(BLI_exists(ret)) return ret; - } return "C:\\Temp"; /* sheesh! bad, bad, bad! (aphex) */ #endif @@ -840,7 +798,7 @@ char *BLI_gethome(void) { /* this function returns the path to a blender folder, if it exists * utility functions for BLI_gethome_folder */ -/* #define PATH_DEBUG */ /* for testing paths that are checked */ +// #define PATH_DEBUG /* for testing paths that are checked */ static int test_data_path(char *targetpath, char *path_base, char *path_sep, char *folder_name) { @@ -851,7 +809,7 @@ static int test_data_path(char *targetpath, char *path_base, char *path_sep, cha BLI_make_file_string("/", targetpath, tmppath, folder_name); - if (BLI_exists(targetpath)) { + if (BLI_is_dir(targetpath)) { #ifdef PATH_DEBUG printf("\tpath found: %s\n", targetpath); #endif @@ -884,11 +842,12 @@ static int gethome_path_local(char *targetpath, char *folder_name) i = s - bprogname + 1; BLI_strncpy(bprogdir, bprogname, i); - /* try release/folder_name (CWD relative) */ - if(test_data_path(targetpath, BLI_getwdN(cwd), "release", folder_name)) + /* try release/folder_name (BIN relative) */ + if(test_data_path(targetpath, bprogdir, "release", folder_name)) return 1; - if(test_data_path(targetpath, bprogdir, "release", folder_name)) + /* try release/folder_name (CWD relative) */ + if(test_data_path(targetpath, BLI_getwdN(cwd), "release", folder_name)) return 1; /* try ./.blender/folder_name */ @@ -950,6 +909,274 @@ char *BLI_gethome_folder(char *folder_name, int flag) return NULL; } + +/* NEW stuff, to be cleaned up when fully migrated */ +/* ************************************************************* */ +/* ************************************************************* */ + +// #define PATH_DEBUG2 + +static char *blender_version_decimal(void) +{ + static char version_str[5]; + sprintf(version_str, "%d.%02d", BLENDER_VERSION/100, BLENDER_VERSION%100); + return version_str; +} + +static int test_path(char *targetpath, char *path_base, char *path_sep, char *folder_name) +{ + char tmppath[FILE_MAX]; + + if(path_sep) BLI_join_dirfile(tmppath, path_base, path_sep); + else BLI_strncpy(tmppath, path_base, sizeof(tmppath)); + + BLI_make_file_string("/", targetpath, tmppath, folder_name); + + if (BLI_is_dir(targetpath)) { +#ifdef PATH_DEBUG2 + printf("\tpath found: %s\n", targetpath); +#endif + return 1; + } + else { +#ifdef PATH_DEBUG2 + printf("\tpath missing: %s\n", targetpath); +#endif + //targetpath[0] = '\0'; + return 0; + } +} + +static int test_env_path(char *path, char *envvar) +{ + char *env = envvar?getenv(envvar):NULL; + if (!env) return 0; + + if (BLI_is_dir(env)) { + BLI_strncpy(path, env, FILE_MAX); + return 1; + } else { + path[0] = '\0'; + return 0; + } +} + +static int get_path_local(char *targetpath, char *folder_name) +{ + extern char bprogname[]; /* argv[0] from creator.c */ + char bprogdir[FILE_MAX]; + char cwd[FILE_MAX]; + char *s; + int i; + +#ifdef PATH_DEBUG2 + printf("get_path_local...\n"); +#endif + + + /* use argv[0] (bprogname) to get the path to the executable */ + s = BLI_last_slash(bprogname); + i = s - bprogname + 1; + BLI_strncpy(bprogdir, bprogname, i); + + /* try EXECUTABLE_DIR/folder_name */ + if(test_path(targetpath, bprogdir, "", folder_name)) + return 1; + + /* try CWD/release/folder_name */ + if(test_path(targetpath, BLI_getwdN(cwd), "release", folder_name)) + return 1; + + /* try EXECUTABLE_DIR/release/folder_name */ + if(test_path(targetpath, bprogdir, "release", folder_name)) + return 1; + + /* try EXECUTABLE_DIR/2.5/folder_name - new default directory for local blender installed files */ + if(test_path(targetpath, bprogdir, blender_version_decimal(), folder_name)) + return 1; + + /* try ./.blender/folder_name -- DEPRECATED, need to update build systems */ + if(test_path(targetpath, bprogdir, ".blender", folder_name)) + return 1; + + return 0; +} + +static int get_path_user(char *targetpath, char *folder_name, char *envvar) +{ + char user_path[FILE_MAX]; + const char *user_base_path; + + user_path[0] = '\0'; + + if (test_env_path(targetpath, envvar)) + return 1; + + user_base_path = (const char *)GHOST_getUserDir(); + if (user_base_path) { + BLI_snprintf(user_path, FILE_MAX, BLENDER_USER_FORMAT, user_base_path, blender_version_decimal()); + } + + if(!user_path[0]) + return 0; + +#ifdef PATH_DEBUG2 + printf("get_path_user: %s\n", user_path); +#endif + + /* try $HOME/folder_name */ + return test_path(targetpath, user_path, NULL, folder_name); +} + +static int get_path_system(char *targetpath, char *folder_name, char *envvar) +{ + char system_path[FILE_MAX]; + const char *system_base_path; + + system_path[0] = '\0'; + + if (test_env_path(targetpath, envvar)) + return 1; + + system_base_path = (const char *)GHOST_getSystemDir(); + if (system_base_path) { + BLI_snprintf(system_path, FILE_MAX, BLENDER_SYSTEM_FORMAT, system_base_path, blender_version_decimal()); + } + + if(!system_path[0]) + return 0; + +#ifdef PATH_DEBUG2 + printf("get_path_system: %s\n", system_path); +#endif + + /* try $BLENDERPATH/folder_name */ + return test_path(targetpath, system_path, NULL, folder_name); +} + +/* get a folder out of the 'folder_id' presets for paths */ +/* returns the path if found, NULL string if not */ +char *BLI_get_folder(int folder_id, char *subfolder) +{ + static char path[FILE_MAX] = ""; + char search_path[FILE_MAX]; + + switch (folder_id) { + case BLENDER_DATAFILES: /* general case */ + BLI_join_dirfile(search_path, "datafiles", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_user(path, search_path, "BLENDER_USER_DATAFILES")) break; + if (get_path_system(path, search_path, "BLENDER_SYSTEM_DATAFILES")) break; + return NULL; + + case BLENDER_USER_DATAFILES: + BLI_join_dirfile(search_path, "datafiles", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_user(path, search_path, "BLENDER_USER_DATAFILES")) break; + return NULL; + + case BLENDER_SYSTEM_DATAFILES: + BLI_join_dirfile(search_path, "datafiles", subfolder); + if (get_path_system(path, search_path, "BLENDER_SYSTEM_DATAFILES")) break; + return NULL; + + case BLENDER_CONFIG: /* general case */ + BLI_join_dirfile(search_path, "config", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_user(path, search_path, "BLENDER_USER_CONFIG")) break; + if (get_path_system(path, search_path, "BLENDER_SYSTEM_CONFIG")) break; + return NULL; + + case BLENDER_USER_CONFIG: + BLI_join_dirfile(search_path, "config", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_user(path, search_path, "BLENDER_USER_CONFIG")) break; + return NULL; + + case BLENDER_SYSTEM_CONFIG: + BLI_join_dirfile(search_path, "config", subfolder); + if (get_path_system(path, search_path, "BLENDER_SYSTEM_CONFIG")) break; + return NULL; + + case BLENDER_SCRIPTS: /* general case */ + BLI_join_dirfile(search_path, "scripts", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_user(path, search_path, "BLENDER_USER_SCRIPTS")) break; + if (get_path_system(path, search_path, "BLENDER_SYSTEM_SCRIPTS")) break; + return NULL; + + case BLENDER_USER_SCRIPTS: + BLI_join_dirfile(search_path, "scripts", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_user(path, search_path, "BLENDER_USER_SCRIPTS")) break; + return NULL; + + case BLENDER_SYSTEM_SCRIPTS: + BLI_join_dirfile(search_path, "scripts", subfolder); + if (get_path_system(path, search_path, "BLENDER_SYSTEM_SCRIPTS")) break; + return NULL; + + case BLENDER_PYTHON: /* general case */ + BLI_join_dirfile(search_path, "python", subfolder); + if (get_path_local(path, search_path)) break; + if (get_path_system(path, search_path, "BLENDER_SYSTEM_PYTHON")) break; + return NULL; + + case BLENDER_SYSTEM_PYTHON: + BLI_join_dirfile(search_path, "python", subfolder); + if (get_path_system(path, search_path, "BLENDER_SYSTEM_PYTHON")) break; + return NULL; + } + + return path; +} + +static char *BLI_get_user_folder_notest(int folder_id, char *subfolder) +{ + static char path[FILE_MAX] = ""; + char search_path[FILE_MAX]; + + switch (folder_id) { + case BLENDER_USER_DATAFILES: + BLI_join_dirfile(search_path, "datafiles", subfolder); + get_path_user(path, search_path, "BLENDER_USER_DATAFILES"); + break; + case BLENDER_USER_CONFIG: + BLI_join_dirfile(search_path, "config", subfolder); + get_path_user(path, search_path, "BLENDER_USER_CONFIG"); + break; + } + if ('\0' == path[0]) { + return NULL; + } + return path; +} + +char *BLI_get_folder_create(int folder_id, char *subfolder) +{ + char *path; + + /* only for user folders */ + if (!ELEM(folder_id, BLENDER_USER_DATAFILES, BLENDER_USER_CONFIG)) + return NULL; + + path = BLI_get_folder(folder_id, subfolder); + + if (!path) { + path = BLI_get_user_folder_notest(folder_id, subfolder); + if (path) BLI_recurdir_fileops(path); + } + + return path; +} + + +/* End new stuff */ +/* ************************************************************* */ +/* ************************************************************* */ + + + #ifdef PATH_DEBUG #undef PATH_DEBUG #endif @@ -1018,7 +1245,7 @@ void BLI_make_exist(char *dir) { a = strlen(dir); #ifdef WIN32 - while(BLI_exists(dir) == 0){ + while(BLI_is_dir(dir) == 0){ a --; while(dir[a] != '\\'){ a--; @@ -1032,7 +1259,7 @@ void BLI_make_exist(char *dir) { } } #else - while(BLI_exist(dir) == 0){ + while(BLI_is_dir(dir) == 0){ a --; while(dir[a] != '/'){ a--; @@ -1049,8 +1276,8 @@ void BLI_make_exist(char *dir) { void BLI_make_existing_file(char *name) { - char di[FILE_MAXDIR], fi[FILE_MAXFILE]; - + char di[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE]; + strcpy(di, name); BLI_splitdirstring(di, fi); @@ -1154,25 +1381,38 @@ int BLI_testextensie(const char *str, const char *ext) return (retval); } -/* - * This is a simple version of BLI_split_dirfile that has the following advantages... - * - * Converts "/foo/bar.txt" to "/foo/" and "bar.txt" +int BLI_replace_extension(char *path, int maxlen, const char *ext) +{ + int a; + + for(a=strlen(path)-1; a>=0; a--) + if(path[a] == '.' || path[a] == '/' || path[a] == '\\') + break; + + if(path[a] != '.') + a= strlen(path); + + if(a + strlen(ext) >= maxlen) + return 0; + + strcpy(path+a, ext); + return 1; +} + +/* Converts "/foo/bar.txt" to "/foo/" and "bar.txt" * - wont change 'string' * - wont create any directories * - dosnt use CWD, or deal with relative paths. * - Only fill's in *dir and *file when they are non NULL * */ -void BLI_split_dirfile_basic(const char *string, char *dir, char *file) +void BLI_split_dirfile(const char *string, char *dir, char *file) { - int lslash=0, i = 0; - for (i=0; string[i]!='\0'; i++) { - if (string[i]=='\\' || string[i]=='/') - lslash = i+1; - } + char *lslash_str = BLI_last_slash(string); + int lslash= lslash_str ? (int)(lslash_str - string) + 1 : 0; + if (dir) { if (lslash) { - BLI_strncpy( dir, string, lslash+1); /* +1 to include the slash and the last char */ + BLI_strncpy( dir, string, lslash + 1); /* +1 to include the slash and the last char */ } else { dir[0] = '\0'; } @@ -1183,128 +1423,6 @@ void BLI_split_dirfile_basic(const char *string, char *dir, char *file) } } - -/* Warning, - * - May modify 'string' variable - * - May create the directory if it dosnt exist - * if this is not needed use BLI_split_dirfile_basic(...) - */ -void BLI_split_dirfile(char *string, char *dir, char *file) -{ - int a; -#ifdef WIN32 - int sl; - short is_relative = 0; - char path[FILE_MAX]; -#endif - - dir[0]= 0; - file[0]= 0; - -#ifdef WIN32 - BLI_strncpy(path, string, FILE_MAX); - BLI_char_switch(path, '/', '\\'); /* make sure we have a valid path format */ - sl = strlen(path); - if (sl) { - int len; - if (path[0] == '/' || path[0] == '\\') { - BLI_strncpy(dir, path, FILE_MAXDIR); - if (sl > 1 && path[0] == '\\' && path[1] == '\\') is_relative = 1; - } else if (sl > 2 && path[1] == ':' && path[2] == '\\') { - BLI_strncpy(dir, path, FILE_MAXDIR); - } else { - BLI_getwdN(dir); - strcat(dir,"\\"); - strcat(dir,path); - BLI_strncpy(path,dir,FILE_MAXDIR+FILE_MAXFILE); - } - - // BLI_exist doesn't recognize a slashed dirname as a dir - // check if a trailing slash exists, and remove it. Do not do this - // when we are already at root. -jesterKing - a = strlen(dir); - if(a>=4 && dir[a-1]=='\\') dir[a-1] = 0; - - if (is_relative) { - printf("WARNING: BLI_split_dirfile needs absolute dir\n"); - } - else { - BLI_make_exist(dir); - } - - if (S_ISDIR(BLI_exist(dir))) { - - /* copy from end of string into file, to ensure filename itself isn't truncated - if string is too long. (aphex) */ - - len = FILE_MAXFILE - strlen(path); - - if (len < 0) - BLI_strncpy(file,path + abs(len),FILE_MAXFILE); - else - BLI_strncpy(file,path,FILE_MAXFILE); - - if (strrchr(path,'\\')) { - BLI_strncpy(file,strrchr(path,'\\')+1,FILE_MAXFILE); - } - - if ( (a = strlen(dir)) ) { - if (dir[a-1] != '\\') strcat(dir,"\\"); - } - } - else { - a = strlen(dir) - 1; - while(a>0 && dir[a] != '\\') a--; - dir[a + 1] = 0; - BLI_strncpy(file, path + strlen(dir),FILE_MAXFILE); - } - - } - else { - /* defaulting to first valid drive hoping it's not empty CD and DVD drives */ - get_default_root(dir); - file[0]=0; - } -#else - if (strlen(string)) { - if (string[0] == '/') { - strcpy(dir, string); - } else if (string[1] == ':' && string[2] == '\\') { - string+=2; - strcpy(dir, string); - } else { - BLI_getwdN(dir); - strcat(dir,"/"); - strcat(dir,string); - strcpy((char *)string,dir); - } - - BLI_make_exist(dir); - - if (S_ISDIR(BLI_exist(dir))) { - strcpy(file,string + strlen(dir)); - - if (strrchr(file,'/')) strcpy(file,strrchr(file,'/')+1); - - if ( (a = strlen(dir)) ) { - if (dir[a-1] != '/') strcat(dir,"/"); - } - } - else { - a = strlen(dir) - 1; - while(dir[a] != '/') a--; - dir[a + 1] = 0; - strcpy(file, string + strlen(dir)); - } - } - else { - BLI_getwdN(dir); - strcat(dir, "/"); - file[0] = 0; - } -#endif -} - /* simple appending of filename to dir, does not check for valid path! */ void BLI_join_dirfile(char *string, const char *dir, const char *file) { @@ -1312,6 +1430,9 @@ void BLI_join_dirfile(char *string, const char *dir, const char *file) if(string != dir) /* compare pointers */ BLI_strncpy(string, dir, FILE_MAX); + + if (!file) + return; sl_dir= BLI_add_slash(string); @@ -1320,6 +1441,12 @@ void BLI_join_dirfile(char *string, const char *dir, const char *file) } } +/* like pythons os.path.basename( ) */ +char *BLI_path_basename(char *path) +{ + char *filename= BLI_last_slash(path); + return filename ? filename + 1 : path; +} /* Produce image export path. @@ -1332,7 +1459,7 @@ void BLI_join_dirfile(char *string, const char *dir, const char *file) Logic: - if an image is "below" current .blend file directory, rebuild the - same dir structure in dest_dir + same dir structure in dest_dir For example //textures/foo/bar.png becomes [dest_dir]/textures/foo/bar.png. @@ -1363,7 +1490,7 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char if (rel) rel[0]= 0; - BLI_split_dirfile_basic(base_dir, blend_dir, NULL); + BLI_split_dirfile(base_dir, blend_dir, NULL); if (src_dir[0]=='\0') return 0; @@ -1371,10 +1498,10 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char BLI_strncpy(path, src_dir, sizeof(path)); /* expand "//" in filename and get absolute path */ - BLI_convertstringcode(path, base_dir); + BLI_path_abs(path, base_dir); /* get the directory part */ - BLI_split_dirfile_basic(path, dir, base); + BLI_split_dirfile(path, dir, base); len= strlen(blend_dir); @@ -1479,7 +1606,7 @@ void BLI_where_am_i(char *fullname, const char *name) /* linux uses binreloc since argv[0] is not relyable, call br_init( NULL ) first */ path = br_find_exe( NULL ); if (path) { - strcpy(fullname, path); + BLI_strncpy(fullname, path, FILE_MAXDIR+FILE_MAXFILE); free(path); return; } @@ -1555,7 +1682,7 @@ void BLI_where_is_temp(char *fullname, int usertemp) { fullname[0] = '\0'; - if (usertemp && BLI_exists(U.tempdir)) { + if (usertemp && BLI_is_dir(U.tempdir)) { strcpy(fullname, U.tempdir); } @@ -1563,7 +1690,7 @@ void BLI_where_is_temp(char *fullname, int usertemp) #ifdef WIN32 if (fullname[0] == '\0') { char *tmp = getenv("TEMP"); /* Windows */ - if (tmp && BLI_exists(tmp)) { + if (tmp && BLI_is_dir(tmp)) { strcpy(fullname, tmp); } } @@ -1571,14 +1698,14 @@ void BLI_where_is_temp(char *fullname, int usertemp) /* Other OS's - Try TMP and TMPDIR */ if (fullname[0] == '\0') { char *tmp = getenv("TMP"); - if (tmp && BLI_exists(tmp)) { + if (tmp && BLI_is_dir(tmp)) { strcpy(fullname, tmp); } } if (fullname[0] == '\0') { char *tmp = getenv("TMPDIR"); - if (tmp && BLI_exists(tmp)) { + if (tmp && BLI_is_dir(tmp)) { strcpy(fullname, tmp); } } @@ -1613,29 +1740,7 @@ char *get_install_dir(void) { } } -/* - * returns absolute path to the app bundle - * only useful on OS X - */ -#ifdef __APPLE__ -char* BLI_getbundle(void) { - CFURLRef bundleURL; - CFStringRef pathStr; - static char path[MAXPATHLEN]; - CFBundleRef mainBundle = CFBundleGetMainBundle(); - - bundleURL = CFBundleCopyBundleURL(mainBundle); - pathStr = CFURLCopyFileSystemPath(bundleURL, kCFURLPOSIXPathStyle); - CFStringGetCString(pathStr, path, MAXPATHLEN, kCFStringEncodingASCII); - CFRelease(pathStr); - CFRelease(bundleURL); - return path; -} -#endif - #ifdef WITH_ICONV -#include "iconv.h" -#include "localcharset.h" void BLI_string_to_utf8(char *original, char *utf_8, const char *code) { diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index 9e1dd096528..4c5177a403e 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -20,11 +20,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include -#include "MEM_guardedalloc.h" #include "DNA_meshdata_types.h" @@ -33,10 +29,10 @@ #include "BLI_pbvh.h" #include "BKE_DerivedMesh.h" -#include "BKE_mesh.h" -#include "BKE_utildefines.h" +#include "BKE_mesh.h" /* for mesh_calc_normals */ +#include "BKE_global.h" /* for mesh_calc_normals */ -#include "gpu_buffers.h" +#include "GPU_buffers.h" #define LEAF_LIMIT 10000 @@ -96,6 +92,11 @@ struct PBVHNode { unsigned int uniq_verts, face_verts; char flag; + + float tmin; // used for raycasting, is how close bb is to the ray point + + int proxy_count; + PBVHProxyNode* proxies; }; struct PBVH { @@ -126,6 +127,9 @@ struct PBVH { #ifdef PERFCNTRS int perf_modified; #endif + + /* flag are verts/faces deformed */ + int deformed; }; #define STACK_FIXED_DEPTH 100 @@ -228,10 +232,21 @@ static void update_node_vb(PBVH *bvh, PBVHNode *node) node->vb= vb; } +//void BLI_pbvh_node_BB_reset(PBVHNode* node) +//{ +// BB_reset(&node->vb); +//} +// +//void BLI_pbvh_node_BB_expand(PBVHNode* node, float co[3]) +//{ +// BB_expand(&node->vb, co); +//} + + /* Adapted from BLI_kdopbvh.c */ /* Returns the index of the first element on the right of the partition */ static int partition_indices(int *prim_indices, int lo, int hi, int axis, - float mid, BBC *prim_bbc) + float mid, BBC *prim_bbc) { int i=lo, j=hi; for(;;) { @@ -247,7 +262,7 @@ static int partition_indices(int *prim_indices, int lo, int hi, int axis, } void check_partitioning(int *prim_indices, int lo, int hi, int axis, - float mid, BBC *prim_bbc, int index_of_2nd_partition) + float mid, BBC *prim_bbc, int index_of_2nd_partition) { int i; for(i = lo; i <= hi; ++i) { @@ -279,8 +294,8 @@ static void grow_nodes(PBVH *bvh, int totnode) /* Add a vertex to the map, with a positive value for unique vertices and a negative value for additional vertices */ static int map_insert_vert(PBVH *bvh, GHash *map, - unsigned int *face_verts, - unsigned int *uniq_verts, int vertex) + unsigned int *face_verts, + unsigned int *uniq_verts, int vertex) { void *value, *key = SET_INT_IN_POINTER(vertex); @@ -309,7 +324,7 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) GHash *map; int i, j, totface; - map = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); + map = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "build_mesh_leaf_node gh"); node->uniq_verts = node->face_verts = 0; totface= node->totprim; @@ -334,8 +349,8 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) /* Build the vertex list, unique verts first */ for(iter = BLI_ghashIterator_new(map), i = 0; - !BLI_ghashIterator_isDone(iter); - BLI_ghashIterator_step(iter), ++i) { + !BLI_ghashIterator_isDone(iter); + BLI_ghashIterator_step(iter), ++i) { void *value = BLI_ghashIterator_getValue(iter); int ndx = GET_INT_FROM_POINTER(value); @@ -352,21 +367,28 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) if(node->face_vert_indices[i] < 0) node->face_vert_indices[i]= -node->face_vert_indices[i] + node->uniq_verts - 1; - node->draw_buffers = - GPU_build_mesh_buffers(map, bvh->verts, bvh->faces, - node->prim_indices, - node->totprim, node->vert_indices, - node->uniq_verts, - node->uniq_verts + node->face_verts); + if(!G.background) { + node->draw_buffers = + GPU_build_mesh_buffers(map, bvh->verts, bvh->faces, + node->prim_indices, + node->totprim, node->vert_indices, + node->uniq_verts, + node->uniq_verts + node->face_verts); + } + + node->flag |= PBVH_UpdateDrawBuffers; BLI_ghash_free(map, NULL, NULL); } static void build_grids_leaf_node(PBVH *bvh, PBVHNode *node) { - node->draw_buffers = - GPU_build_grid_buffers(bvh->grids, node->prim_indices, + if(!G.background) { + node->draw_buffers = + GPU_build_grid_buffers(bvh->grids, node->prim_indices, node->totprim, bvh->gridsize); + } + node->flag |= PBVH_UpdateDrawBuffers; } /* Recursively build a node in the tree @@ -381,7 +403,7 @@ static void build_grids_leaf_node(PBVH *bvh, PBVHNode *node) */ void build_sub(PBVH *bvh, int node_index, BB *cb, BBC *prim_bbc, - int offset, int count) + int offset, int count) { int i, axis, end; BB cb_backing; @@ -578,6 +600,15 @@ void BLI_pbvh_free(PBVH *bvh) } } + if (bvh->deformed) { + if (bvh->verts) { + /* if pbvh was deformed, new memory was allocated for verts/faces -- free it */ + + MEM_freeN(bvh->verts); + MEM_freeN(bvh->faces); + } + } + MEM_freeN(bvh->nodes); MEM_freeN(bvh->prim_indices); MEM_freeN(bvh); @@ -626,13 +657,12 @@ static PBVHNode *pbvh_iter_next(PBVHIter *iter) { PBVHNode *node; int revisiting; - void *search_data; /* purpose here is to traverse tree, visiting child nodes before their parents, this order is necessary for e.g. computing bounding boxes */ while(iter->stacksize) { - /* pop node */ + /* pop node */ iter->stacksize--; node= iter->stack[iter->stacksize].node; @@ -647,10 +677,7 @@ static PBVHNode *pbvh_iter_next(PBVHIter *iter) if(revisiting) return node; - /* check search callback */ - search_data= iter->search_data; - - if(iter->scb && !iter->scb(node, search_data)) + if(iter->scb && !iter->scb(node, iter->search_data)) continue; /* don't traverse, outside of search zone */ if(node->flag & PBVH_Leaf) { @@ -670,6 +697,34 @@ static PBVHNode *pbvh_iter_next(PBVHIter *iter) return NULL; } +static PBVHNode *pbvh_iter_next_occluded(PBVHIter *iter) +{ + PBVHNode *node; + + while(iter->stacksize) { + /* pop node */ + iter->stacksize--; + node= iter->stack[iter->stacksize].node; + + /* on a mesh with no faces this can happen + * can remove this check if we know meshes have at least 1 face */ + if(node==NULL) return NULL; + + if(iter->scb && !iter->scb(node, iter->search_data)) continue; /* don't traverse, outside of search zone */ + + if(node->flag & PBVH_Leaf) { + /* immediately hit leaf node */ + return node; + } + else { + pbvh_stack_push(iter, iter->bvh->nodes+node->children_offset+1, 0); + pbvh_stack_push(iter, iter->bvh->nodes+node->children_offset, 0); + } + } + + return NULL; +} + void BLI_pbvh_search_gather(PBVH *bvh, BLI_pbvh_SearchCallback scb, void *search_data, PBVHNode ***r_array, int *r_tot) @@ -721,12 +776,105 @@ void BLI_pbvh_search_callback(PBVH *bvh, pbvh_iter_begin(&iter, bvh, scb, search_data); while((node=pbvh_iter_next(&iter))) - if(node->flag & PBVH_Leaf) + if (node->flag & PBVH_Leaf) hcb(node, hit_data); pbvh_iter_end(&iter); } +typedef struct node_tree { + PBVHNode* data; + + struct node_tree* left; + struct node_tree* right; +} node_tree; + +static void node_tree_insert(node_tree* tree, node_tree* new_node) +{ + if (new_node->data->tmin < tree->data->tmin) { + if (tree->left) { + node_tree_insert(tree->left, new_node); + } + else { + tree->left = new_node; + } + } + else { + if (tree->right) { + node_tree_insert(tree->right, new_node); + } + else { + tree->right = new_node; + } + } +} + +static void traverse_tree(node_tree* tree, BLI_pbvh_HitOccludedCallback hcb, void* hit_data, float* tmin) +{ + if (tree->left) traverse_tree(tree->left, hcb, hit_data, tmin); + + hcb(tree->data, hit_data, tmin); + + if (tree->right) traverse_tree(tree->right, hcb, hit_data, tmin); +} + +static void free_tree(node_tree* tree) +{ + if (tree->left) { + free_tree(tree->left); + tree->left = 0; + } + + if (tree->right) { + free_tree(tree->right); + tree->right = 0; + } + + free(tree); +} + +float BLI_pbvh_node_get_tmin(PBVHNode* node) +{ + return node->tmin; +} + +void BLI_pbvh_search_callback_occluded(PBVH *bvh, + BLI_pbvh_SearchCallback scb, void *search_data, + BLI_pbvh_HitOccludedCallback hcb, void *hit_data) +{ + PBVHIter iter; + PBVHNode *node; + node_tree *tree = 0; + + pbvh_iter_begin(&iter, bvh, scb, search_data); + + while((node=pbvh_iter_next_occluded(&iter))) { + if(node->flag & PBVH_Leaf) { + node_tree* new_node = malloc(sizeof(node_tree)); + + new_node->data = node; + + new_node->left = NULL; + new_node->right = NULL; + + if (tree) { + node_tree_insert(tree, new_node); + } + else { + tree = new_node; + } + } + } + + pbvh_iter_end(&iter); + + if (tree) { + float tmin = FLT_MAX; + traverse_tree(tree, hcb, hit_data, &tmin); + free_tree(tree); + } +} + static int update_search_cb(PBVHNode *node, void *data_v) { int flag= GET_INT_FROM_POINTER(data_v); @@ -752,11 +900,11 @@ static void pbvh_update_normals(PBVH *bvh, PBVHNode **nodes, /* subtle assumptions: - We know that for all edited vertices, the nodes with faces - adjacent to these vertices have been marked with PBVH_UpdateNormals. + adjacent to these vertices have been marked with PBVH_UpdateNormals. This is true because if the vertex is inside the brush radius, the bounding box of it's adjacent faces will be as well. - However this is only true for the vertices that have actually been - edited, not for all vertices in the nodes marked for update, so we + edited, not for all vertices in the nodes marked for update, so we can only update vertices marked with ME_VERT_PBVH_UPDATE. */ @@ -861,7 +1009,7 @@ static void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, } } -static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode) +static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode, int smooth) { PBVHNode *node; int n; @@ -876,7 +1024,8 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode) bvh->grids, node->prim_indices, node->totprim, - bvh->gridsize); + bvh->gridsize, + smooth); } else { GPU_update_mesh_buffers(node->draw_buffers, @@ -936,9 +1085,6 @@ void BLI_pbvh_update(PBVH *bvh, int flag, float (*face_nors)[3]) if(flag & (PBVH_UpdateBB|PBVH_UpdateOriginalBB|PBVH_UpdateRedraw)) pbvh_update_BB_redraw(bvh, nodes, totnode, flag); - if(flag & PBVH_UpdateDrawBuffers) - pbvh_update_draw_buffers(bvh, nodes, totnode); - if(flag & (PBVH_UpdateBB|PBVH_UpdateOriginalBB)) pbvh_flush_bb(bvh, bvh->nodes, flag); @@ -972,9 +1118,10 @@ void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *tot GHashIterator *hiter; GHash *map; void *face, **faces; - int i, tot; + unsigned i; + int tot; - map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "pbvh_get_grid_updates gh"); pbvh_iter_begin(&iter, bvh, NULL, NULL); @@ -1004,8 +1151,8 @@ void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *tot faces= MEM_callocN(sizeof(void*)*tot, "PBVH Grid Faces"); for(hiter = BLI_ghashIterator_new(map), i = 0; - !BLI_ghashIterator_isDone(hiter); - BLI_ghashIterator_step(hiter), ++i) + !BLI_ghashIterator_isDone(hiter); + BLI_ghashIterator_step(hiter), ++i) faces[i]= BLI_ghashIterator_getKey(hiter); BLI_ghashIterator_free(hiter); @@ -1073,6 +1220,18 @@ void BLI_pbvh_node_get_original_BB(PBVHNode *node, float bb_min[3], float bb_max copy_v3_v3(bb_max, node->orig_vb.bmax); } +void BLI_pbvh_node_get_proxies(PBVHNode* node, PBVHProxyNode** proxies, int* proxy_count) +{ + if (node->proxy_count > 0) { + if (proxies) *proxies = node->proxies; + if (proxy_count) *proxy_count = node->proxy_count; + } + else { + if (proxies) *proxies = 0; + if (proxy_count) *proxy_count = 0; + } +} + /********************************* Raycast ***********************************/ typedef struct { @@ -1087,16 +1246,13 @@ typedef struct { static int ray_aabb_intersect(PBVHNode *node, void *data_v) { RaycastData *ray = data_v; - float bb_min[3], bb_max[3], bbox[2][3]; + float bbox[2][3]; float tmin, tmax, tymin, tymax, tzmin, tzmax; if(ray->original) - BLI_pbvh_node_get_original_BB(node, bb_min, bb_max); + BLI_pbvh_node_get_original_BB(node, bbox[0], bbox[1]); else - BLI_pbvh_node_get_BB(node, bb_min, bb_max); - - copy_v3_v3(bbox[0], bb_min); - copy_v3_v3(bbox[1], bb_max); + BLI_pbvh_node_get_BB(node, bbox[0], bbox[1]); tmin = (bbox[ray->sign[0]][0] - ray->start[0]) * ray->inv_dir[0]; tmax = (bbox[1-ray->sign[0]][0] - ray->start[0]) * ray->inv_dir[0]; @@ -1106,8 +1262,10 @@ static int ray_aabb_intersect(PBVHNode *node, void *data_v) if((tmin > tymax) || (tymin > tmax)) return 0; + if(tymin > tmin) tmin = tymin; + if(tymax < tmax) tmax = tymax; @@ -1116,21 +1274,21 @@ static int ray_aabb_intersect(PBVHNode *node, void *data_v) if((tmin > tzmax) || (tzmin > tmax)) return 0; - + + if(tzmin > tmin) + tmin = tzmin; + + // XXX jwilkins: tmax does not need to be updated since we don't use it + // keeping this here for future reference + //if(tzmax < tmax) tmax = tzmax; + + node->tmin = tmin; + return 1; - - /* XXX: Not sure about this? - if(tzmin > tmin) - tmin = tzmin; - if(tzmax < tmax) - tmax = tzmax; - return ((tmin < t1) && (tmax > t0)); - */ - } -void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitCallback cb, void *data, - float ray_start[3], float ray_normal[3], int original) +void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitOccludedCallback cb, void *data, + float ray_start[3], float ray_normal[3], int original) { RaycastData rcd; @@ -1143,37 +1301,24 @@ void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitCallback cb, void *data, rcd.sign[2] = rcd.inv_dir[2] < 0; rcd.original = original; - BLI_pbvh_search_callback(bvh, ray_aabb_intersect, &rcd, cb, data); + BLI_pbvh_search_callback_occluded(bvh, ray_aabb_intersect, &rcd, cb, data); } -/* XXX: Code largely copied from bvhutils.c, could be unified */ -/* Returns 1 if a better intersection has been found */ static int ray_face_intersection(float ray_start[3], float ray_normal[3], float *t0, float *t1, float *t2, float *t3, float *fdist) { - int hit = 0; + float dist; - do - { - float dist = FLT_MAX; - - if(!isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t1, t2, - &dist, NULL, 0.1f)) - dist = FLT_MAX; - - if(dist >= 0 && dist < *fdist) { - hit = 1; - *fdist = dist; - } - - t1 = t2; - t2 = t3; - t3 = NULL; - - } while(t2); - - return hit; + if ((isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t1, t2, &dist, NULL, 0.1f) && dist < *fdist) || + (t3 && isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t2, t3, &dist, NULL, 0.1f) && dist < *fdist)) + { + *fdist = dist; + return 1; + } + else { + return 0; + } } int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], @@ -1218,6 +1363,8 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], for(i = 0; i < totgrid; ++i) { DMGridData *grid= bvh->grids[node->prim_indices[i]]; + if (!grid) + continue; for(y = 0; y < gridsize-1; ++y) { for(x = 0; x < gridsize-1; ++x) { @@ -1304,9 +1451,18 @@ int BLI_pbvh_node_planes_contain_AABB(PBVHNode *node, void *data) return 1; } -void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3]) +void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smooth) { - BLI_pbvh_update(bvh, PBVH_UpdateNormals|PBVH_UpdateDrawBuffers, face_nors); + PBVHNode **nodes; + int totnode; + + BLI_pbvh_search_gather(bvh, update_search_cb, SET_INT_IN_POINTER(PBVH_UpdateNormals|PBVH_UpdateDrawBuffers), + &nodes, &totnode); + + pbvh_update_normals(bvh, nodes, totnode, face_nors); + pbvh_update_draw_buffers(bvh, nodes, totnode, smooth); + + if(nodes) MEM_freeN(nodes); if(planes) { BLI_pbvh_search_callback(bvh, BLI_pbvh_node_planes_contain_AABB, @@ -1317,3 +1473,145 @@ void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3]) } } +void BLI_pbvh_grids_update(PBVH *bvh, DMGridData **grids, DMGridAdjacency *gridadj, void **gridfaces) +{ + bvh->grids= grids; + bvh->gridadj= gridadj; + bvh->gridfaces= gridfaces; +} + +float (*BLI_pbvh_get_vertCos(PBVH *pbvh))[3] +{ + int a; + float (*vertCos)[3]= NULL; + + if (pbvh->verts) { + float *co; + MVert *mvert= pbvh->verts; + + vertCos= MEM_callocN(3*pbvh->totvert*sizeof(float), "BLI_pbvh_get_vertCoords"); + co= (float*)vertCos; + + for (a= 0; atotvert; a++, mvert++, co+= 3) { + copy_v3_v3(co, mvert->co); + } + } + + return vertCos; +} + +void BLI_pbvh_apply_vertCos(PBVH *pbvh, float (*vertCos)[3]) +{ + int a; + + if (!pbvh->deformed) { + if (pbvh->verts) { + /* if pbvh is not already deformed, verts/faces points to the */ + /* original data and applying new coords to this arrays would lead to */ + /* unneeded deformation -- duplicate verts/faces to avoid this */ + + pbvh->verts= MEM_dupallocN(pbvh->verts); + pbvh->faces= MEM_dupallocN(pbvh->faces); + + pbvh->deformed= 1; + } + } + + if (pbvh->verts) { + /* copy new verts coords */ + for (a= 0; a < pbvh->totvert; ++a) { + copy_v3_v3(pbvh->verts[a].co, vertCos[a]); + } + + /* coordinates are new -- normals should also be updated */ + mesh_calc_normals(pbvh->verts, pbvh->totvert, pbvh->faces, pbvh->totprim, NULL); + } +} + +int BLI_pbvh_isDeformed(PBVH *pbvh) +{ + return pbvh->deformed; +} +/* Proxies */ + +PBVHProxyNode* BLI_pbvh_node_add_proxy(PBVH* bvh, PBVHNode* node) +{ + int index, totverts; + + #pragma omp critical + { + + index = node->proxy_count; + + node->proxy_count++; + + if (node->proxies) + node->proxies= MEM_reallocN(node->proxies, node->proxy_count*sizeof(PBVHProxyNode)); + else + node->proxies= MEM_mallocN(sizeof(PBVHProxyNode), "PBVHNodeProxy"); + + if (bvh->grids) + totverts = node->totprim*bvh->gridsize*bvh->gridsize; + else + totverts = node->uniq_verts; + + node->proxies[index].co= MEM_callocN(sizeof(float[3])*totverts, "PBVHNodeProxy.co"); + } + + return node->proxies + index; +} + +void BLI_pbvh_node_free_proxies(PBVHNode* node) +{ + #pragma omp critical + { + int p; + + for (p= 0; p < node->proxy_count; p++) { + MEM_freeN(node->proxies[p].co); + node->proxies[p].co= 0; + } + + MEM_freeN(node->proxies); + node->proxies = 0; + + node->proxy_count= 0; + } +} + +void BLI_pbvh_gather_proxies(PBVH* pbvh, PBVHNode*** r_array, int* r_tot) +{ + PBVHNode **array= NULL, **newarray, *node; + int tot= 0, space= 0; + int n; + + for (n= 0; n < pbvh->totnode; n++) { + node = pbvh->nodes + n; + + if(node->proxy_count > 0) { + if(tot == space) { + /* resize array if needed */ + space= (tot == 0)? 32: space*2; + newarray= MEM_callocN(sizeof(PBVHNode)*space, "BLI_pbvh_gather_proxies"); + + if (array) { + memcpy(newarray, array, sizeof(PBVHNode)*tot); + MEM_freeN(array); + } + + array= newarray; + } + + array[tot]= node; + tot++; + } + } + + if(tot == 0 && array) { + MEM_freeN(array); + array= NULL; + } + + *r_array= array; + *r_tot= tot; +} diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c index 4e469ad3834..7c14cfd3426 100644 --- a/source/blender/blenlib/intern/rand.c +++ b/source/blender/blenlib/intern/rand.c @@ -37,10 +37,6 @@ #include "BLI_threads.h" #include "BLI_rand.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(WIN32) && !defined(FREE_WINDOWS) typedef unsigned __int64 r_uint64; diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c index 959d8be466f..5466acdba9f 100644 --- a/source/blender/blenlib/intern/rct.c +++ b/source/blender/blenlib/intern/rct.c @@ -36,11 +36,6 @@ */ #include "DNA_vec_types.h" -#include "BLI_blenlib.h" - -#ifdef HAVE_CONFIG_H -#include -#endif int BLI_rcti_is_empty(rcti * rect) { @@ -147,6 +142,27 @@ void BLI_translate_rctf(rctf *rect, float x, float y) rect->ymax += y; } +/* change width & height around the central location */ +void BLI_resize_rcti(rcti *rect, int x, int y) +{ + rect->xmin= rect->xmax= (rect->xmax + rect->xmin) / 2; + rect->ymin= rect->ymax= (rect->ymax + rect->ymin) / 2; + rect->xmin -= x / 2; + rect->ymin -= y / 2; + rect->xmax= rect->xmin + x; + rect->ymax= rect->ymin + y; +} + +void BLI_resize_rctf(rctf *rect, float x, float y) +{ + rect->xmin= rect->xmax= (rect->xmax + rect->xmin) * 0.5f; + rect->ymin= rect->ymax= (rect->ymax + rect->ymin) * 0.5f; + rect->xmin -= x * 0.5f; + rect->ymin -= y * 0.5f; + rect->xmax= rect->xmin + x; + rect->ymax= rect->ymin + y; +} + int BLI_isect_rctf(rctf *src1, rctf *src2, rctf *dest) { float xmin, xmax; diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c index e430f78a100..d1150748dff 100644 --- a/source/blender/blenlib/intern/scanfill.c +++ b/source/blender/blenlib/intern/scanfill.c @@ -35,21 +35,13 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" -#include "DNA_mesh_types.h" #include "BLI_editVert.h" #include "BLI_listbase.h" #include "BLI_math.h" -#include "BLI_scanfill.h" -#include "BLI_callbacks.h" #include "BKE_utildefines.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* callbacks for errors and interrupts and some goo */ static void (*BLI_localErrorCallBack)(char*) = NULL; static int (*BLI_localInterruptCallBack)(void) = NULL; @@ -187,7 +179,7 @@ static void *new_mem_element(int size) if(cur) { if(size+offs < blocksize) { adr= (void *) (cur->data+offs); - offs+= size; + offs+= size; return adr; } } @@ -306,7 +298,7 @@ static short testedgeside(float *v1, float *v2, float *v3) float inp; inp= (v2[cox]-v1[cox])*(v1[coy]-v3[coy]) - +(v1[coy]-v2[coy])*(v1[cox]-v3[cox]); + +(v1[coy]-v2[coy])*(v1[cox]-v3[cox]); if(inp<0.0) return 0; else if(inp==0) { @@ -383,7 +375,7 @@ static ScFillVert *addedgetoscanlist(EditEdge *eed, int len) /* find location in list */ scsearch.v1= eed->v1; sc= (ScFillVert *)bsearch(&scsearch,scdata,len, - sizeof(ScFillVert), vergscdata); + sizeof(ScFillVert), vergscdata); if(sc==0) printf("Error in search edge: %p\n",eed); else if(addedgetoscanvert(sc,eed)==0) return sc; diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index f21e5ef5575..3315e9645d4 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -76,7 +76,6 @@ #endif #ifdef WIN32 -#include #include #include #include "BLI_winstuff.h" @@ -90,8 +89,6 @@ #include "BLI_listbase.h" #include "BLI_linklist.h" -#include "BLI_path_util.h" -#include "BLI_storage.h" #include "BLI_storage_types.h" #include "BLI_string.h" #include "BKE_utildefines.h" @@ -204,14 +201,6 @@ double BLI_diskfree(char *dir) #endif } -static int hide_dot= 0; - -void BLI_hide_dot_files(int set) -{ - if(set) hide_dot= 1; - else hide_dot= 0; -} - void BLI_builddir(char *dirname, char *relname) { struct dirent *fname; @@ -237,17 +226,12 @@ void BLI_builddir(char *dirname, char *relname) while ((fname = (struct dirent*) readdir(dir)) != NULL) { len= strlen(fname->d_name); - if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0); /* ignore .file */ - else if(hide_dot && len && fname->d_name[len-1]=='~'); /* ignore file~ */ - else if (((fname->d_name[0] == '.') && (fname->d_name[1] == 0) )); /* ignore . */ - else { - dlink = (struct dirlink *)malloc(sizeof(struct dirlink)); - if (dlink){ - strcpy(buf+rellen,fname->d_name); - dlink->name = BLI_strdup(buf); - BLI_addhead(dirbase,dlink); - newnum++; - } + dlink = (struct dirlink *)malloc(sizeof(struct dirlink)); + if (dlink){ + strcpy(buf+rellen,fname->d_name); + dlink->name = BLI_strdup(buf); + BLI_addhead(dirbase,dlink); + newnum++; } } @@ -308,10 +292,8 @@ void BLI_adddirstrings() struct direntry * file; struct tm *tm; time_t zero= 0; - - file = &files[0]; - for(num=0;nummode1, types[0]); @@ -340,43 +322,43 @@ void BLI_adddirstrings() #endif #ifdef WIN32 - strcpy(files[num].owner,"user"); + strcpy(file->owner,"user"); #else { struct passwd *pwuser; - pwuser = getpwuid(files[num].s.st_uid); + pwuser = getpwuid(file->s.st_uid); if ( pwuser ) { - strcpy(files[num].owner, pwuser->pw_name); + BLI_strncpy(file->owner, pwuser->pw_name, sizeof(file->owner)); } else { - sprintf(files[num].owner, "%d", files[num].s.st_uid); - } + snprintf(file->owner, sizeof(file->owner), "%d", file->s.st_uid); + } } #endif - tm= localtime(&files[num].s.st_mtime); + tm= localtime(&file->s.st_mtime); // prevent impossible dates in windows if(tm==NULL) tm= localtime(&zero); - strftime(files[num].time, 8, "%H:%M", tm); - strftime(files[num].date, 16, "%d-%b-%y", tm); + strftime(file->time, 8, "%H:%M", tm); + strftime(file->date, 16, "%d-%b-%y", tm); /* * Seems st_size is signed 32-bit value in *nix and Windows. This * will buy us some time until files get bigger than 4GB or until * everyone starts using __USE_FILE_OFFSET64 or equivalent. */ - st_size= files[num].s.st_size; + st_size= file->s.st_size; if (st_size > 1024*1024*1024) { - sprintf(files[num].size, "%.2f GB", ((double)st_size)/(1024*1024*1024)); + sprintf(file->size, "%.2f GB", ((double)st_size)/(1024*1024*1024)); } else if (st_size > 1024*1024) { - sprintf(files[num].size, "%.1f MB", ((double)st_size)/(1024*1024)); + sprintf(file->size, "%.1f MB", ((double)st_size)/(1024*1024)); } else if (st_size > 1024) { - sprintf(files[num].size, "%d KB", (int)(st_size/1024)); + sprintf(file->size, "%d KB", (int)(st_size/1024)); } else { - sprintf(files[num].size, "%d B", (int)st_size); + sprintf(file->size, "%d B", (int)st_size); } strftime(datum, 32, "%d-%b-%y %H:%M", tm); @@ -392,15 +374,13 @@ void BLI_adddirstrings() sprintf(size, "%10d", (int) st_size); } - sprintf(buf,"%s %s %s %7s %s %s %10s %s", file->mode1, file->mode2, file->mode3, files[num].owner, files[num].date, files[num].time, size, - files[num].relname); + sprintf(buf,"%s %s %s %7s %s %s %10s %s", file->mode1, file->mode2, file->mode3, file->owner, file->date, file->time, size, + file->relname); - files[num].string=MEM_mallocN(strlen(buf)+1, "filestring"); - if (files[num].string){ - strcpy(files[num].string,buf); + file->string=MEM_mallocN(strlen(buf)+1, "filestring"); + if (file->string){ + strcpy(file->string,buf); } - - file++; } } @@ -452,18 +432,20 @@ int BLI_filepathsize(const char *path) int BLI_exist(char *name) { - struct stat st; #ifdef WIN32 + struct _stat64i32 st; /* in Windows stat doesn't recognize dir ending on a slash To not break code where the ending slash is expected we don't mess with the argument name directly here - elubie */ char tmp[FILE_MAXDIR+FILE_MAXFILE]; - int len; + int len, res; BLI_strncpy(tmp, name, FILE_MAXDIR+FILE_MAXFILE); len = strlen(tmp); if (len > 3 && ( tmp[len-1]=='\\' || tmp[len-1]=='/') ) tmp[len-1] = '\0'; - if (stat(tmp,&st)) return(0); + res = _stat(tmp, &st); + if (res == -1) return(0); #else + struct stat st; if (stat(name,&st)) return(0); #endif return(st.st_mode); @@ -519,3 +501,14 @@ void BLI_free_file_lines(LinkNode *lines) { BLI_linklist_free(lines, (void(*)(void*)) MEM_freeN); } + +int BLI_file_older(const char *file1, const char *file2) +{ + struct stat st1, st2; + + if(stat(file1, &st1)) return 0; + if(stat(file2, &st2)) return 0; + + return (st1.st_mtime < st2.st_mtime); +} + diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index dd1d0a3bd4f..c344d8c0711 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -32,7 +32,6 @@ * */ -#include #include #include #include @@ -221,10 +220,10 @@ int BLI_strcaseeq(const char *a, const char *b) /* strcasestr not available in MSVC */ char *BLI_strcasestr(const char *s, const char *find) { - register char c, sc; - register size_t len; + register char c, sc; + register size_t len; - if ((c = *find++) != 0) { + if ((c = *find++) != 0) { c= tolower(c); len = strlen(find); do { @@ -235,8 +234,8 @@ char *BLI_strcasestr(const char *s, const char *find) } while (sc != c); } while (BLI_strncasecmp(s, find, len) != 0); s--; - } - return ((char *) s); + } + return ((char *) s); } diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index 371fae3dda2..726ed817f8b 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -28,15 +28,11 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include -#include #include +#include #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "BLI_blenlib.h" #include "BLI_gsqueue.h" @@ -56,6 +52,12 @@ #include #endif +#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) +/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */ +extern pthread_key_t gomp_tls_key; +static void *thread_tls_data; +#endif + /* ********** basic thread control API ************ Many thread cases have an X amount of jobs, and only an Y amount of @@ -103,7 +105,11 @@ A sample loop can look like this (pseudo c); static pthread_mutex_t _malloc_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _image_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _preview_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _custom1_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_t mainid; static int thread_levels= 0; /* threads can be invoked inside threads */ /* just a max for security reasons */ @@ -127,6 +133,11 @@ static void BLI_unlock_malloc_thread(void) pthread_mutex_unlock(&_malloc_lock); } +void BLI_threadapi_init(void) +{ + mainid = pthread_self(); +} + /* tot = 0 only initializes malloc mutex in a safe way (see sequence.c) problem otherwise: scene render will kill of the mutex! */ @@ -134,7 +145,7 @@ static void BLI_unlock_malloc_thread(void) void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot) { int a; - + if(threadbase != NULL && tot > 0) { threadbase->first= threadbase->last= NULL; @@ -147,12 +158,20 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot) tslot->do_thread= do_thread; tslot->avail= 1; } - - if(thread_levels == 0) - MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread); - - thread_levels++; } + + if(thread_levels == 0) { + MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread); + +#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) + /* workaround for Apple gcc 4.2.1 omp vs background thread bug, + we copy gomp thread local storage pointer to setting it again + inside the thread that we start */ + thread_tls_data = pthread_getspecific(gomp_tls_key); +#endif + } + + thread_levels++; } /* amount of available threads */ @@ -181,6 +200,22 @@ int BLI_available_thread_index(ListBase *threadbase) return 0; } +static void *tslot_thread_start(void *tslot_p) +{ + ThreadSlot *tslot= (ThreadSlot*)tslot_p; + +#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) + /* workaround for Apple gcc 4.2.1 omp vs background thread bug, + set gomp thread local storage pointer which was copied beforehand */ + pthread_setspecific (gomp_tls_key, thread_tls_data); +#endif + + return tslot->do_thread(tslot->callerdata); +} + +int BLI_thread_is_main(void) { + return pthread_equal(pthread_self(), mainid); +} void BLI_insert_thread(ListBase *threadbase, void *callerdata) { @@ -190,7 +225,7 @@ void BLI_insert_thread(ListBase *threadbase, void *callerdata) if(tslot->avail) { tslot->avail= 0; tslot->callerdata= callerdata; - pthread_create(&tslot->pthread, NULL, tslot->do_thread, tslot->callerdata); + pthread_create(&tslot->pthread, NULL, tslot_thread_start, tslot); return; } } @@ -203,8 +238,8 @@ void BLI_remove_thread(ListBase *threadbase, void *callerdata) for(tslot= threadbase->first; tslot; tslot= tslot->next) { if(tslot->callerdata==callerdata) { - tslot->callerdata= NULL; pthread_join(tslot->pthread, NULL); + tslot->callerdata= NULL; tslot->avail= 1; } } @@ -217,8 +252,8 @@ void BLI_remove_thread_index(ListBase *threadbase, int index) for(tslot = threadbase->first; tslot; tslot = tslot->next, counter++) { if (counter == index && tslot->avail == 0) { - tslot->callerdata = NULL; pthread_join(tslot->pthread, NULL); + tslot->callerdata = NULL; tslot->avail = 1; break; } @@ -231,8 +266,8 @@ void BLI_remove_threads(ListBase *threadbase) for(tslot = threadbase->first; tslot; tslot = tslot->next) { if (tslot->avail == 0) { - tslot->callerdata = NULL; pthread_join(tslot->pthread, NULL); + tslot->callerdata = NULL; tslot->avail = 1; } } @@ -252,11 +287,11 @@ void BLI_end_threads(ListBase *threadbase) } } BLI_freelistN(threadbase); - - thread_levels--; - if(thread_levels==0) - MEM_set_lock_callback(NULL, NULL); } + + thread_levels--; + if(thread_levels==0) + MEM_set_lock_callback(NULL, NULL); } /* System Information */ @@ -301,8 +336,14 @@ void BLI_lock_thread(int type) pthread_mutex_lock(&_image_lock); else if (type==LOCK_PREVIEW) pthread_mutex_lock(&_preview_lock); + else if (type==LOCK_VIEWER) + pthread_mutex_lock(&_viewer_lock); else if (type==LOCK_CUSTOM1) pthread_mutex_lock(&_custom1_lock); + else if (type==LOCK_RCACHE) + pthread_mutex_lock(&_rcache_lock); + else if (type==LOCK_OPENGL) + pthread_mutex_lock(&_opengl_lock); } void BLI_unlock_thread(int type) @@ -311,8 +352,14 @@ void BLI_unlock_thread(int type) pthread_mutex_unlock(&_image_lock); else if (type==LOCK_PREVIEW) pthread_mutex_unlock(&_preview_lock); + else if (type==LOCK_VIEWER) + pthread_mutex_unlock(&_viewer_lock); else if(type==LOCK_CUSTOM1) pthread_mutex_unlock(&_custom1_lock); + else if(type==LOCK_RCACHE) + pthread_mutex_unlock(&_rcache_lock); + else if(type==LOCK_OPENGL) + pthread_mutex_unlock(&_opengl_lock); } /* Mutex Locks */ diff --git a/source/blender/blenlib/intern/time.c b/source/blender/blenlib/intern/time.c index b0a284c4074..0992e08b28f 100644 --- a/source/blender/blenlib/intern/time.c +++ b/source/blender/blenlib/intern/time.c @@ -26,14 +26,9 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#include "PIL_time.h" - -#ifdef HAVE_CONFIG_H -#include -#endif #ifdef WIN32 - +#include "PIL_time.h" #include double PIL_check_seconds_timer(void) diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c new file mode 100644 index 00000000000..cc115d52928 --- /dev/null +++ b/source/blender/blenlib/intern/uvproject.c @@ -0,0 +1,191 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include + +#include "MEM_guardedalloc.h" + +#include "DNA_camera_types.h" +#include "DNA_object_types.h" + +#include "BLI_math.h" + +typedef struct UvCameraInfo { + float camangle; + float camsize; + float xasp, yasp; + float shiftx, shifty; + float rotmat[4][4]; + float caminv[4][4]; + short do_persp, do_pano, do_rotmat; +} UvCameraInfo; + +void project_from_camera(float target[2], float source[3], UvCameraInfo *uci) +{ + float pv4[4]; + + copy_v3_v3(pv4, source); + pv4[3]= 1.0; + + /* rotmat is the object matrix in this case */ + if(uci->do_rotmat) + mul_m4_v4(uci->rotmat, pv4); + + /* caminv is the inverse camera matrix */ + mul_m4_v4(uci->caminv, pv4); + + if(uci->do_pano) { + float angle= atan2f(pv4[0], -pv4[2]) / (M_PI * 2.0); /* angle around the camera */ + if (uci->do_persp==0) { + target[0]= angle; /* no correct method here, just map to 0-1 */ + target[1]= pv4[1] / uci->camsize; + } + else { + float vec2d[2]= {pv4[0], pv4[2]}; /* 2D position from the camera */ + target[0]= angle * (M_PI / uci->camangle); + target[1]= pv4[1] / (len_v2(vec2d) * uci->camsize); + } + } + else { + if (pv4[2]==0.0f) pv4[2]= 0.00001f; /* don't allow div by 0 */ + + if (uci->do_persp==0) { + target[0]= (pv4[0]/uci->camsize); + target[1]= (pv4[1]/uci->camsize); + } + else { + target[0]= (-pv4[0]*((1.0f/uci->camsize)/pv4[2])) / 2.0f; + target[1]= (-pv4[1]*((1.0f/uci->camsize)/pv4[2])) / 2.0f; + } + } + + target[0] *= uci->xasp; + target[1] *= uci->yasp; + + /* adds camera shift + 0.5 */ + target[0] += uci->shiftx; + target[1] += uci->shifty; +} + +/* could rv3d->persmat */ +void project_from_view(float target[2], float source[3], float persmat[4][4], float rotmat[4][4], float winx, float winy) +{ + float pv[3], pv4[4], x= 0.0, y= 0.0; + + mul_v3_m4v3(pv, rotmat, source); + + copy_v3_v3(pv4, source); + pv4[3]= 1.0; + + /* rotmat is the object matrix in this case */ + mul_m4_v4(rotmat, pv4); + + /* almost project_short */ + mul_m4_v4(persmat, pv4); + if(fabs(pv4[3]) > 0.00001) { /* avoid division by zero */ + target[0] = winx/2.0 + (winx/2.0) * pv4[0] / pv4[3]; + target[1] = winy/2.0 + (winy/2.0) * pv4[1] / pv4[3]; + } + else { + /* scaling is lost but give a valid result */ + target[0] = winx/2.0 + (winx/2.0) * pv4[0]; + target[1] = winy/2.0 + (winy/2.0) * pv4[1]; + } + + /* v3d->persmat seems to do this funky scaling */ + if(winx > winy) { + y= (winx - winy)/2.0; + winy = winx; + } + else { + x= (winy - winx)/2.0; + winx = winy; + } + + target[0]= (x + target[0]) / winx; + target[1]= (y + target[1]) / winy; +} + +/* 'rotmat' can be obedit->obmat when uv project is used. + * 'winx' and 'winy' can be from scene->r.xsch/ysch */ +UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, float winy) +{ + UvCameraInfo uci; + Camera *camera= ob->data; + + uci.do_pano = (camera->flag & CAM_PANORAMA); + uci.do_persp = (camera->type==CAM_PERSP); + + uci.camangle= lens_to_angle(camera->lens) / 2.0f; + uci.camsize= uci.do_persp ? tanf(uci.camangle) : camera->ortho_scale; + + if (invert_m4_m4(uci.caminv, ob->obmat)) { + UvCameraInfo *uci_pt; + + /* normal projection */ + if(rotmat) { + copy_m4_m4(uci.rotmat, rotmat); + uci.do_rotmat= 1; + } + else { + uci.do_rotmat= 0; + } + + /* also make aspect ratio adjustment factors */ + if (winx > winy) { + uci.xasp= 1.0f; + uci.yasp= winx / winy; + } + else { + uci.xasp= winy / winx; + uci.yasp= 1.0f; + } + + /* include 0.5f here to move the UVs into the center */ + uci.shiftx = 0.5f - camera->shiftx; + uci.shifty = 0.5f - camera->shifty; + + uci_pt= MEM_mallocN(sizeof(UvCameraInfo), "UvCameraInfo"); + *uci_pt= uci; + return uci_pt; + } + + return NULL; +} + +void project_from_view_ortho(float target[2], float source[3], float rotmat[4][4]) +{ + float pv[3]; + + mul_v3_m4v3(pv, rotmat, source); + + /* ortho projection */ + target[0] = -pv[0]; + target[1] = pv[2]; +} + + +void project_camera_info_scale(UvCameraInfo *uci, float scale_x, float scale_y) +{ + uci->xasp *= scale_x; + uci->yasp *= scale_y; +} diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c index 78267528e21..2b04a49e848 100644 --- a/source/blender/blenlib/intern/voxel.c +++ b/source/blender/blenlib/intern/voxel.c @@ -25,18 +25,12 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#include #include "BLI_voxel.h" #include "BKE_utildefines.h" - -#if defined( _MSC_VER ) && !defined( __cplusplus ) -# define inline __inline -#endif // defined( _MSC_VER ) && !defined( __cplusplus ) - -static inline float D(float *data, int *res, int x, int y, int z) +BM_INLINE float D(float *data, int *res, int x, int y, int z) { CLAMP(x, 0, res[0]-1); CLAMP(y, 0, res[1]-1); @@ -58,7 +52,7 @@ float voxel_sample_nearest(float *data, int *res, float *co) } // returns highest integer <= x as integer (slightly faster than floor()) -inline int FLOORI(float x) +BM_INLINE int FLOORI(float x) { const int r = (int)x; return ((x >= 0.f) || (float)r == x) ? r : (r - 1); @@ -66,7 +60,7 @@ inline int FLOORI(float x) // clamp function, cannot use the CLAMPIS macro, it sometimes returns unwanted results apparently related to gcc optimization flag -fstrict-overflow which is enabled at -O2 // this causes the test (x + 2) < 0 with int x == 2147483647 to return false (x being an integer, x + 2 should wrap around to -2147483647 so the test < 0 should return true, which it doesn't) -inline int _clamp(int a, int b, int c) +BM_INLINE int _clamp(int a, int b, int c) { return (a < b) ? b : ((a > c) ? c : a); } @@ -94,9 +88,9 @@ float voxel_sample_trilinear(float *data, int *res, float *co) const float w[2] = {1.f - dz, dz}; return w[0] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[0]] + u[1] * data[xc[1] + yc[0] + zc[0]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] ) ) - + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] ) ); + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] ) ) + + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] ) + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] ) ); } return 0.f; @@ -120,14 +114,14 @@ float voxel_sample_triquadratic(float *data, int *res, float *co) const float w[3] = {dz*(0.5f*dz - 1.f) + 0.5f, dz*(1.f - dz) + 0.5f, 0.5f*dz*dz}; return w[0] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[0]] + u[1] * data[xc[1] + yc[0] + zc[0]] + u[2] * data[xc[2] + yc[0] + zc[0]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] + u[2] * data[xc[2] + yc[1] + zc[0]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[0]] + u[1] * data[xc[1] + yc[2] + zc[0]] + u[2] * data[xc[2] + yc[2] + zc[0]] ) ) - + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] + u[2] * data[xc[2] + yc[0] + zc[1]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] + u[2] * data[xc[2] + yc[1] + zc[1]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[1]] + u[1] * data[xc[1] + yc[2] + zc[1]] + u[2] * data[xc[2] + yc[2] + zc[1]] ) ) - + w[2] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[2]] + u[1] * data[xc[1] + yc[0] + zc[2]] + u[2] * data[xc[2] + yc[0] + zc[2]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[2]] + u[1] * data[xc[1] + yc[1] + zc[2]] + u[2] * data[xc[2] + yc[1] + zc[2]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[2]] + u[1] * data[xc[1] + yc[2] + zc[2]] + u[2] * data[xc[2] + yc[2] + zc[2]] ) ); + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] + u[2] * data[xc[2] + yc[1] + zc[0]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[0]] + u[1] * data[xc[1] + yc[2] + zc[0]] + u[2] * data[xc[2] + yc[2] + zc[0]] ) ) + + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] + u[2] * data[xc[2] + yc[0] + zc[1]] ) + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] + u[2] * data[xc[2] + yc[1] + zc[1]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[1]] + u[1] * data[xc[1] + yc[2] + zc[1]] + u[2] * data[xc[2] + yc[2] + zc[1]] ) ) + + w[2] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[2]] + u[1] * data[xc[1] + yc[0] + zc[2]] + u[2] * data[xc[2] + yc[0] + zc[2]] ) + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[2]] + u[1] * data[xc[1] + yc[1] + zc[2]] + u[2] * data[xc[2] + yc[1] + zc[2]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[2]] + u[1] * data[xc[1] + yc[2] + zc[2]] + u[2] * data[xc[2] + yc[2] + zc[2]] ) ); } return 0.f; @@ -177,21 +171,21 @@ float voxel_sample_tricubic(float *data, int *res, float *co, int bspline) } return w[0] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[0]] + u[1] * data[xc[1] + yc[0] + zc[0]] + u[2] * data[xc[2] + yc[0] + zc[0]] + u[3] * data[xc[3] + yc[0] + zc[0]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] + u[2] * data[xc[2] + yc[1] + zc[0]] + u[3] * data[xc[3] + yc[1] + zc[0]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[0]] + u[1] * data[xc[1] + yc[2] + zc[0]] + u[2] * data[xc[2] + yc[2] + zc[0]] + u[3] * data[xc[3] + yc[2] + zc[0]] ) - + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[0]] + u[1] * data[xc[1] + yc[3] + zc[0]] + u[2] * data[xc[2] + yc[3] + zc[0]] + u[3] * data[xc[3] + yc[3] + zc[0]] ) ) - + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] + u[2] * data[xc[2] + yc[0] + zc[1]] + u[3] * data[xc[3] + yc[0] + zc[1]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] + u[2] * data[xc[2] + yc[1] + zc[1]] + u[3] * data[xc[3] + yc[1] + zc[1]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[1]] + u[1] * data[xc[1] + yc[2] + zc[1]] + u[2] * data[xc[2] + yc[2] + zc[1]] + u[3] * data[xc[3] + yc[2] + zc[1]] ) - + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[1]] + u[1] * data[xc[1] + yc[3] + zc[1]] + u[2] * data[xc[2] + yc[3] + zc[1]] + u[3] * data[xc[3] + yc[3] + zc[1]] ) ) - + w[2] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[2]] + u[1] * data[xc[1] + yc[0] + zc[2]] + u[2] * data[xc[2] + yc[0] + zc[2]] + u[3] * data[xc[3] + yc[0] + zc[2]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[2]] + u[1] * data[xc[1] + yc[1] + zc[2]] + u[2] * data[xc[2] + yc[1] + zc[2]] + u[3] * data[xc[3] + yc[1] + zc[2]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[2]] + u[1] * data[xc[1] + yc[2] + zc[2]] + u[2] * data[xc[2] + yc[2] + zc[2]] + u[3] * data[xc[3] + yc[2] + zc[2]] ) - + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[2]] + u[1] * data[xc[1] + yc[3] + zc[2]] + u[2] * data[xc[2] + yc[3] + zc[2]] + u[3] * data[xc[3] + yc[3] + zc[2]] ) ) - + w[3] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[3]] + u[1] * data[xc[1] + yc[0] + zc[3]] + u[2] * data[xc[2] + yc[0] + zc[3]] + u[3] * data[xc[3] + yc[0] + zc[3]] ) - + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[3]] + u[1] * data[xc[1] + yc[1] + zc[3]] + u[2] * data[xc[2] + yc[1] + zc[3]] + u[3] * data[xc[3] + yc[1] + zc[3]] ) - + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[3]] + u[1] * data[xc[1] + yc[2] + zc[3]] + u[2] * data[xc[2] + yc[2] + zc[3]] + u[3] * data[xc[3] + yc[2] + zc[3]] ) - + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[3]] + u[1] * data[xc[1] + yc[3] + zc[3]] + u[2] * data[xc[2] + yc[3] + zc[3]] + u[3] * data[xc[3] + yc[3] + zc[3]] ) ); + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] + u[2] * data[xc[2] + yc[1] + zc[0]] + u[3] * data[xc[3] + yc[1] + zc[0]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[0]] + u[1] * data[xc[1] + yc[2] + zc[0]] + u[2] * data[xc[2] + yc[2] + zc[0]] + u[3] * data[xc[3] + yc[2] + zc[0]] ) + + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[0]] + u[1] * data[xc[1] + yc[3] + zc[0]] + u[2] * data[xc[2] + yc[3] + zc[0]] + u[3] * data[xc[3] + yc[3] + zc[0]] ) ) + + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] + u[2] * data[xc[2] + yc[0] + zc[1]] + u[3] * data[xc[3] + yc[0] + zc[1]] ) + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] + u[2] * data[xc[2] + yc[1] + zc[1]] + u[3] * data[xc[3] + yc[1] + zc[1]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[1]] + u[1] * data[xc[1] + yc[2] + zc[1]] + u[2] * data[xc[2] + yc[2] + zc[1]] + u[3] * data[xc[3] + yc[2] + zc[1]] ) + + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[1]] + u[1] * data[xc[1] + yc[3] + zc[1]] + u[2] * data[xc[2] + yc[3] + zc[1]] + u[3] * data[xc[3] + yc[3] + zc[1]] ) ) + + w[2] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[2]] + u[1] * data[xc[1] + yc[0] + zc[2]] + u[2] * data[xc[2] + yc[0] + zc[2]] + u[3] * data[xc[3] + yc[0] + zc[2]] ) + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[2]] + u[1] * data[xc[1] + yc[1] + zc[2]] + u[2] * data[xc[2] + yc[1] + zc[2]] + u[3] * data[xc[3] + yc[1] + zc[2]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[2]] + u[1] * data[xc[1] + yc[2] + zc[2]] + u[2] * data[xc[2] + yc[2] + zc[2]] + u[3] * data[xc[3] + yc[2] + zc[2]] ) + + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[2]] + u[1] * data[xc[1] + yc[3] + zc[2]] + u[2] * data[xc[2] + yc[3] + zc[2]] + u[3] * data[xc[3] + yc[3] + zc[2]] ) ) + + w[3] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[3]] + u[1] * data[xc[1] + yc[0] + zc[3]] + u[2] * data[xc[2] + yc[0] + zc[3]] + u[3] * data[xc[3] + yc[0] + zc[3]] ) + + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[3]] + u[1] * data[xc[1] + yc[1] + zc[3]] + u[2] * data[xc[2] + yc[1] + zc[3]] + u[3] * data[xc[3] + yc[1] + zc[3]] ) + + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[3]] + u[1] * data[xc[1] + yc[2] + zc[3]] + u[2] * data[xc[2] + yc[2] + zc[3]] + u[3] * data[xc[3] + yc[2] + zc[3]] ) + + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[3]] + u[1] * data[xc[1] + yc[3] + zc[3]] + u[2] * data[xc[2] + yc[3] + zc[3]] + u[3] * data[xc[3] + yc[3] + zc[3]] ) ); } return 0.f; diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c index 194a164216a..f2261546f5c 100644 --- a/source/blender/blenlib/intern/winstuff.c +++ b/source/blender/blenlib/intern/winstuff.c @@ -28,10 +28,6 @@ * Windows-posix compatibility layer, windows-specific functions. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #include @@ -225,21 +221,21 @@ int check_file_chars(char *filename) #include char* dirname(char *path) { - char *p; - if( path == NULL || *path == '\0' ) - return "."; - p = path + strlen(path) - 1; - while( *p == '/' ) { - if( p == path ) - return path; - *p-- = '\0'; - } - while( p >= path && *p != '/' ) - p--; - return - p < path ? "." : - p == path ? "/" : - (*p = '\0', path); + char *p; + if( path == NULL || *path == '\0' ) + return "."; + p = path + strlen(path) - 1; + while( *p == '/' ) { + if( p == path ) + return path; + *p-- = '\0'; + } + while( p >= path && *p != '/' ) + p--; + return + p < path ? "." : + p == path ? "/" : + (*p = '\0', path); } /* End of copied part */ diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h index 811b7e88f82..d6418f426c8 100644 --- a/source/blender/blenloader/BLO_readfile.h +++ b/source/blender/blenloader/BLO_readfile.h @@ -122,6 +122,17 @@ BLO_blendfiledata_free( char* BLO_idcode_to_name( int code); + +/** + * Convert an idcode into a name (plural). + * + * @param code The code to convert. + * @return A static string representing the name of + * the code. + */ + char* +BLO_idcode_to_name_plural( + int code); /** * Convert a name into an idcode (ie. ID_SCE) @@ -205,7 +216,7 @@ int BLO_has_bfile_extension(char *str); /* return ok when a blenderfile, in dir is the filename, * in group the type of libdata */ -int BLO_is_a_library(char *path, char *dir, char *group); +int BLO_is_a_library(const char *path, char *dir, char *group); struct Main* BLO_library_append_begin(const struct bContext *C, BlendHandle** bh, char *dir); void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, char *name, int idcode, short flag); diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h index 435091b49e0..9ec03c4e4d4 100644 --- a/source/blender/blenloader/BLO_undofile.h +++ b/source/blender/blenloader/BLO_undofile.h @@ -1,5 +1,5 @@ /* - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h index a95e5867c7e..182c582cc0f 100644 --- a/source/blender/blenloader/BLO_writefile.h +++ b/source/blender/blenloader/BLO_writefile.h @@ -35,10 +35,12 @@ struct MemFile; struct Main; struct ReportList; -extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports); +extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports, int *thumb); extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags, struct ReportList *reports); extern int BLO_write_runtime(struct Main *mainvar, char *file, char *exename, struct ReportList *reports); +#define BLEN_THUMB_SIZE 128 + #endif diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c index 083b57cf2b6..38e9a584952 100644 --- a/source/blender/blenloader/intern/readblenentry.c +++ b/source/blender/blenloader/intern/readblenentry.c @@ -28,10 +28,6 @@ * .blend file reading entry point */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "BLI_storage.h" /* _LARGEFILE_SOURCE */ #include @@ -41,18 +37,12 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_ghash.h" #include "BLI_linklist.h" #include "DNA_genfile.h" #include "DNA_sdna_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_ID.h" -#include "DNA_material_types.h" -#include "BKE_utildefines.h" // for ENDB #include "BKE_main.h" #include "BKE_library.h" // for free_main @@ -80,41 +70,44 @@ typedef struct { unsigned short code; - char *name; + char *name, *plural; int flags; #define IDTYPE_FLAGS_ISLINKABLE (1<<0) } IDType; +/* plural need to match rna_main.c's MainCollectionDef */ static IDType idtypes[]= { - { ID_AC, "Action", IDTYPE_FLAGS_ISLINKABLE}, - { ID_AR, "Armature", IDTYPE_FLAGS_ISLINKABLE}, - { ID_BR, "Brush", IDTYPE_FLAGS_ISLINKABLE}, - { ID_CA, "Camera", IDTYPE_FLAGS_ISLINKABLE}, - { ID_CU, "Curve", IDTYPE_FLAGS_ISLINKABLE}, - { ID_GD, "GPencil", IDTYPE_FLAGS_ISLINKABLE}, - { ID_GR, "Group", IDTYPE_FLAGS_ISLINKABLE}, - { ID_ID, "ID", 0}, - { ID_IM, "Image", IDTYPE_FLAGS_ISLINKABLE}, - { ID_IP, "Ipo", IDTYPE_FLAGS_ISLINKABLE}, - { ID_KE, "Key", 0}, - { ID_LA, "Lamp", IDTYPE_FLAGS_ISLINKABLE}, - { ID_LI, "Library", 0}, - { ID_LT, "Lattice", IDTYPE_FLAGS_ISLINKABLE}, - { ID_MA, "Material", IDTYPE_FLAGS_ISLINKABLE}, - { ID_MB, "Metaball", IDTYPE_FLAGS_ISLINKABLE}, - { ID_ME, "Mesh", IDTYPE_FLAGS_ISLINKABLE}, - { ID_NT, "NodeTree", IDTYPE_FLAGS_ISLINKABLE}, - { ID_OB, "Object", IDTYPE_FLAGS_ISLINKABLE}, - { ID_SCE, "Scene", IDTYPE_FLAGS_ISLINKABLE}, - { ID_SCR, "Screen", 0}, - { ID_SEQ, "Sequence", 0}, - { ID_SO, "Sound", IDTYPE_FLAGS_ISLINKABLE}, - { ID_TE, "Texture", IDTYPE_FLAGS_ISLINKABLE}, - { ID_TXT, "Text", IDTYPE_FLAGS_ISLINKABLE}, - { ID_VF, "VFont", IDTYPE_FLAGS_ISLINKABLE}, - { ID_WO, "World", IDTYPE_FLAGS_ISLINKABLE}, - { ID_WV, "Wave", 0}, + { ID_AC, "Action", "actions", IDTYPE_FLAGS_ISLINKABLE}, + { ID_AR, "Armature", "armatures", IDTYPE_FLAGS_ISLINKABLE}, + { ID_BR, "Brush", "brushes", IDTYPE_FLAGS_ISLINKABLE}, + { ID_CA, "Camera", "cameras", IDTYPE_FLAGS_ISLINKABLE}, + { ID_CU, "Curve", "curves", IDTYPE_FLAGS_ISLINKABLE}, + { ID_GD, "GPencil", "gpencil", IDTYPE_FLAGS_ISLINKABLE}, /* rename gpencil */ + { ID_GR, "Group", "groups", IDTYPE_FLAGS_ISLINKABLE}, + { ID_ID, "ID", "ids", 0}, /* plural is fake */ + { ID_IM, "Image", "images", IDTYPE_FLAGS_ISLINKABLE}, + { ID_IP, "Ipo", "ipos", IDTYPE_FLAGS_ISLINKABLE}, /* deprecated */ + { ID_KE, "Key", "keys", 0}, + { ID_LA, "Lamp", "lamps", IDTYPE_FLAGS_ISLINKABLE}, + { ID_LI, "Library", "libraries", 0}, + { ID_LT, "Lattice", "lattices", IDTYPE_FLAGS_ISLINKABLE}, + { ID_MA, "Material", "materials", IDTYPE_FLAGS_ISLINKABLE}, + { ID_MB, "Metaball", "metaballs", IDTYPE_FLAGS_ISLINKABLE}, + { ID_ME, "Mesh", "meshes", IDTYPE_FLAGS_ISLINKABLE}, + { ID_NT, "NodeTree", "node_groups", IDTYPE_FLAGS_ISLINKABLE}, + { ID_OB, "Object", "objects", IDTYPE_FLAGS_ISLINKABLE}, + { ID_PA, "ParticleSettings", "particles", 0}, + { ID_SCE, "Scene", "scenes", IDTYPE_FLAGS_ISLINKABLE}, + { ID_SCR, "Screen", "screens", 0}, + { ID_SEQ, "Sequence", "sequences", 0}, /* not actually ID data */ + { ID_SO, "Sound", "sounds", IDTYPE_FLAGS_ISLINKABLE}, + { ID_TE, "Texture", "textures", IDTYPE_FLAGS_ISLINKABLE}, + { ID_TXT, "Text", "texts", IDTYPE_FLAGS_ISLINKABLE}, + { ID_VF, "VFont", "fonts", IDTYPE_FLAGS_ISLINKABLE}, + { ID_WO, "World", "worlds", IDTYPE_FLAGS_ISLINKABLE}, + { ID_WM, "WindowManager", "window_managers", 0}, + { ID_WV, "Wave", "waves", 0}, /* deprecated */ }; static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]); @@ -166,7 +159,14 @@ int BLO_idcode_from_name(char *name) return idt?idt->code:0; } + +char *BLO_idcode_to_name_plural(int code) +{ + IDType *idt= idtype_from_code(code); + return idt?idt->plural:NULL; +} + /* Access routines used by filesel. */ BlendHandle *BLO_blendhandle_from_file(char *file) @@ -239,10 +239,19 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype) for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { if (bhead->code==ofblocktype) { ID *id= (ID*) (bhead+1); - if ( (GS(id->name) == ID_MA) || (GS(id->name) == ID_TE)) { - new_prv = MEM_callocN(sizeof(PreviewImage), "newpreview"); - BLI_linklist_prepend(&previews, new_prv); - looking = 1; + switch(GS(id->name)) + { + case ID_MA: /* fall through */ + case ID_TE: /* fall through */ + case ID_IM: /* fall through */ + case ID_WO: /* fall through */ + case ID_LA: /* fall through */ + new_prv = MEM_callocN(sizeof(PreviewImage), "newpreview"); + BLI_linklist_prepend(&previews, new_prv); + looking = 1; + break; + default: + break; } } else if (bhead->code==DATA) { if (looking) { @@ -293,7 +302,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype) LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh) { FileData *fd= (FileData*) bh; - GHash *gathered= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + GHash *gathered= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "linkable_groups gh"); LinkNode *names= NULL; BHead *bhead; @@ -377,7 +386,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil /* makes lookup of existing images in old main */ blo_make_image_pointer_map(fd, oldmain); - bfd= blo_read_file_internal(fd, ""); + bfd= blo_read_file_internal(fd, filename); /* ensures relinked images are not freed */ blo_end_image_pointer_map(fd, oldmain); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index b4baae443cb..96bb83df11b 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -38,10 +38,10 @@ #include // for fabs #ifndef WIN32 - #include // for read close - #include // for MAXPATHLEN + #include // for read close + #include // for MAXPATHLEN #else - #include // for open close read + #include // for open close read #include "winsock2.h" #include "BLI_winstuff.h" #endif @@ -104,31 +104,25 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" -#include "BLI_storage_types.h" // for relname flags #include "BLI_cellalloc.h" +#include "BLI_edgehash.h" -#include "BKE_animsys.h" #include "BKE_anim.h" #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_brush.h" -#include "BKE_cdderivedmesh.h" -#include "BKE_cloth.h" #include "BKE_colortools.h" #include "BKE_constraint.h" #include "BKE_context.h" #include "BKE_curve.h" -#include "BKE_customdata.h" #include "BKE_deform.h" -#include "BKE_depsgraph.h" #include "BKE_effect.h" /* give_parteff */ #include "BKE_fcurve.h" #include "BKE_global.h" // for G #include "BKE_group.h" #include "BKE_image.h" -#include "BKE_ipo.h" #include "BKE_lattice.h" -#include "BKE_library.h" // for wich_libbase +#include "BKE_library.h" // for which_libbase #include "BKE_main.h" // for Main #include "BKE_mesh.h" // for ME_ defines (patching) #include "BKE_modifier.h" @@ -143,13 +137,10 @@ #include "BKE_sca.h" // for init_actuator #include "BKE_scene.h" #include "BKE_screen.h" -#include "BKE_softbody.h" // sbNew() -#include "BKE_bullet.h" // bsbNew() #include "BKE_sequencer.h" #include "BKE_texture.h" // for open_plugin_tex #include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND -#include "BKE_idprop.h" - +#include "BKE_ipo.h" #include "BKE_sound.h" //XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes @@ -205,10 +196,10 @@ READ - read file - read SDNA - per LibBlock - - read recursive - - read associated direct data - - link direct data (internal and to LibBlock) - - free file + - read recursive + - read associated direct data + - link direct data (internal and to LibBlock) + - free file - join all Mains - link all LibBlocks and indirect pointers to libblocks - initialize FileGlobal and copy pointers to Global @@ -230,12 +221,12 @@ READ // only used here in readfile.c #define SWITCH_LONGINT(a) { \ - char s_i, *p_i; \ - p_i= (char *)&(a); \ - s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ - s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ - s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ - s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ + s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ + s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ + s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } /***/ @@ -440,7 +431,7 @@ static void split_libdata(ListBase *lb, Main *first) mainvar= first; while(mainvar) { if(mainvar->curlib==id->lib) { - lbn= wich_libbase(mainvar, GS(id->name)); + lbn= which_libbase(mainvar, GS(id->name)); BLI_remlink(lb, id); BLI_addtail(lbn, id); break; @@ -518,7 +509,7 @@ static Main *blo_find_main(FileData *fd, ListBase *mainlist, const char *name, c // printf("blo_find_main: converted to %s\n", name1); for (m= mainlist->first; m; m= m->next) { - char *libname= (m->curlib)?m->curlib->filename:m->name; + char *libname= (m->curlib)?m->curlib->filepath:m->name; if (BLI_streq(name1, libname)) { if(G.f & G_DEBUG) printf("blo_find_main: found library %s\n", libname); @@ -531,7 +522,7 @@ static Main *blo_find_main(FileData *fd, ListBase *mainlist, const char *name, c lib= alloc_libblock(&m->library, ID_LI, "lib"); strncpy(lib->name, name, sizeof(lib->name)-1); - BLI_strncpy(lib->filename, name1, sizeof(lib->filename)); + BLI_strncpy(lib->filepath, name1, sizeof(lib->filepath)); m->curlib= lib; @@ -970,11 +961,11 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports) FileData *blo_openblenderfile(char *name, ReportList *reports) { gzFile gzfile; - + errno= 0; gzfile= gzopen(name, "rb"); - if (NULL == gzfile) { - BKE_report(reports, RPT_ERROR, "Unable to open"); + if (gzfile == Z_NULL) { + BKE_reportf(reports, RPT_ERROR, "Unable to open \"%s\": %s.", name, errno ? strerror(errno) : "Unknown erro reading file"); return NULL; } else { FileData *fd = filedata_new(); @@ -1007,7 +998,7 @@ FileData *blo_openblendermemory(void *mem, int memsize, ReportList *reports) FileData *blo_openblendermemfile(MemFile *memfile, ReportList *reports) { if (!memfile) { - BKE_report(reports, RPT_ERROR, "Unable to open"); + BKE_report(reports, RPT_ERROR, "Unable to open blend "); return NULL; } else { FileData *fd= filedata_new(); @@ -1071,7 +1062,7 @@ int BLO_has_bfile_extension(char *str) return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend")||BLI_testextensie(str, ".blend.gz")); } -int BLO_is_a_library(char *path, char *dir, char *group) +int BLO_is_a_library(const char *path, char *dir, char *group) { /* return ok when a blenderfile, in dir is the filename, * in group the type of libdata @@ -1088,7 +1079,7 @@ int BLO_is_a_library(char *path, char *dir, char *group) dir[len-1]= 0; /* Find the last slash */ - fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\'); + fd= BLI_last_slash(dir); if(fd==0) return 0; *fd= 0; @@ -1100,7 +1091,7 @@ int BLO_is_a_library(char *path, char *dir, char *group) char *gp = fd+1; // in case we have a .blend file, gp points to the group /* Find the last slash */ - fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\'); + fd= BLI_last_slash(dir); if (!fd || !BLO_has_bfile_extension(fd+1)) return 0; /* now we know that we are in a blend file and it is safe to @@ -1194,6 +1185,7 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain) { Image *ima= oldmain->image.first; Scene *sce= oldmain->scene.first; + int a; fd->imamap= oldnewmap_new(); @@ -1203,6 +1195,9 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain) oldnewmap_insert(fd->imamap, ibuf, ibuf, 0); if(ima->gputexture) oldnewmap_insert(fd->imamap, ima->gputexture, ima->gputexture, 0); + for(a=0; arenders[a]) + oldnewmap_insert(fd->imamap, ima->renders[a], ima->renders[a], 0); } for(; sce; sce= sce->id.next) { if(sce->nodetree) { @@ -1220,11 +1215,11 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) OldNew *entry= fd->imamap->entries; Image *ima= oldmain->image.first; Scene *sce= oldmain->scene.first; - int i; + int i, a; /* used entries were restored, so we put them to zero */ for (i=0; iimamap->nentries; i++, entry++) { - if (entry->nr>0) + if (entry->nr>0) entry->newp= NULL; } @@ -1242,6 +1237,8 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) } ima->gputexture= newimaadr(fd, ima->gputexture); + for(a=0; arenders[a]= newimaadr(fd, ima->renders[a]); } for(; sce; sce= sce->id.next) { if(sce->nodetree) { @@ -1362,7 +1359,8 @@ static void test_pointer_array(FileData *fd, void **mat) #else long long *lpoin, *lmat; #endif - int len, *ipoin, *imat; + int *ipoin, *imat; + size_t len; /* manually convert the pointer array in * the old dna format to a pointer array in @@ -1527,6 +1525,7 @@ static void direct_link_curvemapping(FileData *fd, CurveMapping *cumap) for(a=0; acm[a].curve= newdataadr(fd, cumap->cm[a].curve); cumap->cm[a].table= NULL; + cumap->cm[a].premultable= NULL; } } @@ -1542,6 +1541,7 @@ static void lib_link_brush(FileData *fd, Main *main) brush->id.flag -= LIB_NEEDLINK; brush->mtex.tex= newlibadr_us(fd, brush->id.lib, brush->mtex.tex); + brush->image_icon= newlibadr_us(fd, brush->id.lib, brush->image_icon); brush->clone.image= newlibadr_us(fd, brush->id.lib, brush->clone.image); } } @@ -2085,7 +2085,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) ntree->init= 0; /* to set callbacks and force setting types */ ntree->owntype= NULL; - ntree->timecursor= NULL; + ntree->progress= NULL; ntree->adt= newdataadr(fd, ntree->adt); direct_link_animdata(fd, ntree->adt); @@ -2224,6 +2224,12 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) /* always rebuild to match proxy or lib changes */ rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib); + if (ob->proxy && pose->proxy_act_bone[0]) { + Bone *bone = get_named_bone(arm, pose->proxy_act_bone); + if (bone) + arm->act_bone = bone; + } + for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) { lib_link_constraints(fd, (ID *)ob, &pchan->constraints); @@ -2241,7 +2247,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose) } if(rebuild) { - ob->recalc= OB_RECALC; + ob->recalc= OB_RECALC_ALL; pose->flag |= POSE_RECALC; } } @@ -2673,7 +2679,8 @@ static void direct_link_image(FileData *fd, Image *ima) ima->anim= NULL; ima->rr= NULL; ima->repbind= NULL; - ima->render_text= newdataadr(fd, ima->render_text); + memset(ima->renders, 0, sizeof(ima->renders)); + ima->last_render_slot= ima->render_slot; ima->packedfile = direct_link_packedfile(fd, ima->packedfile); ima->preview = direct_link_preview_image(fd, ima->preview); @@ -2766,7 +2773,7 @@ static void direct_link_curve(FileData *fd, Curve *cu) cu->bev.first=cu->bev.last= NULL; cu->disp.first=cu->disp.last= NULL; cu->editnurb= NULL; - cu->lastselbp= NULL; + cu->lastsel= NULL; cu->path= NULL; cu->editfont= NULL; @@ -2845,6 +2852,7 @@ static void direct_link_texture(FileData *fd, Tex *tex) tex->vd= newdataadr(fd, tex->vd); if(tex->vd) { tex->vd->dataset = NULL; + tex->vd->ok = 0; } tex->nodetree= newdataadr(fd, tex->nodetree); @@ -3040,6 +3048,7 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) part->pd= newdataadr(fd, part->pd); part->pd2= newdataadr(fd, part->pd2); + direct_link_animdata(fd, part->adt); direct_link_partdeflect(part->pd); direct_link_partdeflect(part->pd2); @@ -3050,6 +3059,7 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) link_list(fd, &part->dupliweights); part->boids= newdataadr(fd, part->boids); + part->fluid= newdataadr(fd, part->fluid); if(part->boids) { BoidState *state; @@ -3077,6 +3087,7 @@ static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase for(; pt; pt=pt->next) pt->ob=newlibadr(fd, id->lib, pt->ob); + psys->parent= newlibadr_us(fd, id->lib, psys->parent); psys->target_ob = newlibadr(fd, id->lib, psys->target_ob); if(psys->clmd) { @@ -3084,6 +3095,7 @@ static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase * pointcache should /w cloth should be added in 'ParticleSystem' - campbell */ psys->clmd->point_cache= psys->pointcache; psys->clmd->ptcaches.first= psys->clmd->ptcaches.last= NULL; + psys->clmd->coll_parms->group= newlibadr(fd, id->lib, psys->clmd->coll_parms->group); } } else { @@ -3145,7 +3157,7 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) psys->childcachebufs.first = psys->childcachebufs.last = NULL; psys->frand = NULL; psys->pdd = NULL; - + direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache); if(psys->clmd) { @@ -3570,7 +3582,7 @@ static void direct_link_latt(FileData *fd, Lattice *lt) /* ************ READ OBJECT ***************** */ static void lib_link_modifiers__linkModifiers(void *userData, Object *ob, - ID **idpoin) + ID **idpoin) { FileData *fd = userData; @@ -3616,13 +3628,17 @@ static void lib_link_object(FileData *fd, Main *main) if(ob->proxy->id.lib==NULL) { ob->proxy->proxy_from= NULL; ob->proxy= NULL; - printf("Proxy lost from object %s lib %s\n", ob->id.name+2, ob->id.lib->name); + + if (ob->id.lib) + printf("Proxy lost from object %s lib %s\n", ob->id.name+2, ob->id.lib->name); + else + printf("Proxy lost from object %s lib \n", ob->id.name+2); } else { /* this triggers object_update to always use a copy */ ob->proxy->proxy_from= ob; /* force proxy updates after load/undo, a bit weak */ - ob->recalc= ob->proxy->recalc= OB_RECALC; + ob->recalc= ob->proxy->recalc= OB_RECALC_ALL; } } ob->proxy_group= newlibadr(fd, ob->id.lib, ob->proxy_group); @@ -3648,7 +3664,8 @@ static void lib_link_object(FileData *fd, Main *main) for(a=0; atotcol; a++) ob->mat[a]= newlibadr_us(fd, ob->id.lib, ob->mat[a]); ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd); - + ob->duplilist= NULL; + ob->id.flag -= LIB_NEEDLINK; /* if id.us==0 a new base will be created later on */ @@ -3679,7 +3696,7 @@ static void lib_link_object(FileData *fd, Main *main) else if(sens->type==SENS_MESSAGE) { bMessageSensor *ms= sens->data; ms->fromObject= - newlibadr(fd, ob->id.lib, ms->fromObject); + newlibadr(fd, ob->id.lib, ms->fromObject); } sens= sens->next; } @@ -3806,6 +3823,7 @@ static void lib_link_object(FileData *fd, Main *main) if(clmd) { clmd->sim_parms->effector_weights->group = newlibadr(fd, ob->id.lib, clmd->sim_parms->effector_weights->group); + clmd->coll_parms->group= newlibadr(fd, ob->id.lib, clmd->coll_parms->group); } } @@ -3837,6 +3855,8 @@ static void direct_link_pose(FileData *fd, bPose *pose) link_list(fd, &pose->chanbase); link_list(fd, &pose->agroups); + pose->chanhash= NULL; + for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) { pchan->bone= NULL; pchan->parent= newdataadr(fd, pchan->parent); @@ -3912,6 +3932,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) FluidsimModifierData *fluidmd = (FluidsimModifierData*) md; fluidmd->fss= newdataadr(fd, fluidmd->fss); + fluidmd->fss->fmd= fluidmd; fluidmd->fss->meshSurfNormals = 0; } else if (md->type==eModifierType_Smoke) { @@ -4020,24 +4041,35 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) else if (md->type==eModifierType_MeshDeform) { MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; - mmd->bindweights= newdataadr(fd, mmd->bindweights); - mmd->bindcos= newdataadr(fd, mmd->bindcos); + mmd->bindinfluences= newdataadr(fd, mmd->bindinfluences); + mmd->bindoffsets= newdataadr(fd, mmd->bindoffsets); + mmd->bindcagecos= newdataadr(fd, mmd->bindcagecos); mmd->dyngrid= newdataadr(fd, mmd->dyngrid); mmd->dyninfluences= newdataadr(fd, mmd->dyninfluences); mmd->dynverts= newdataadr(fd, mmd->dynverts); + mmd->bindweights= newdataadr(fd, mmd->bindweights); + mmd->bindcos= newdataadr(fd, mmd->bindcos); + if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) { int a; + if(mmd->bindoffsets) + for(a=0; atotvert+1; a++) + SWITCH_INT(mmd->bindoffsets[a]) + if(mmd->bindcagecos) + for(a=0; atotcagevert*3; a++) + SWITCH_INT(mmd->bindcagecos[a]) + if(mmd->dynverts) + for(a=0; atotvert; a++) + SWITCH_INT(mmd->dynverts[a]) + if(mmd->bindweights) for(a=0; atotcagevert*mmd->totvert; a++) SWITCH_INT(mmd->bindweights[a]) if(mmd->bindcos) for(a=0; atotcagevert*3; a++) SWITCH_INT(mmd->bindcos[a]) - if(mmd->dynverts) - for(a=0; atotvert; a++) - SWITCH_INT(mmd->dynverts[a]) } } } @@ -4054,9 +4086,11 @@ static void direct_link_object(FileData *fd, Object *ob) /* weak weak... this was only meant as draw flag, now is used in give_base too */ ob->flag &= ~OB_FROMGROUP; - - /* editmode doesn't get saved in files, so should get cleared when reloading... */ - ob->mode &= ~(OB_MODE_EDIT|OB_MODE_PARTICLE_EDIT); + + /* loading saved files with editmode enabled works, but for undo we like + to stay in object mode during undo presses so keep editmode disabled */ + if(fd->memfile) + ob->mode &= ~(OB_MODE_EDIT|OB_MODE_PARTICLE_EDIT); ob->disp.first=ob->disp.last= NULL; @@ -4310,8 +4344,8 @@ static void lib_link_scene(FileData *fd, Main *main) base->object= newlibadr_us(fd, sce->id.lib, base->object); if(base->object==NULL) { - printf("LIB ERROR: base removed\n"); BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: Object lost from scene:'%s\'\n", sce->id.name+2); + if(G.background==0) printf("LIB ERROR: base removed from scene:'%s\'\n", sce->id.name+2); BLI_remlink(&sce->base, base); if(base==sce->basact) sce->basact= 0; MEM_freeN(base); @@ -4320,7 +4354,11 @@ static void lib_link_scene(FileData *fd, Main *main) SEQ_BEGIN(sce->ed, seq) { if(seq->ipo) seq->ipo= newlibadr_us(fd, sce->id.lib, seq->ipo); - if(seq->scene) seq->scene= newlibadr(fd, sce->id.lib, seq->scene); + if(seq->scene) { + seq->scene= newlibadr(fd, sce->id.lib, seq->scene); + seq->scene_sound = sound_scene_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); + } + if(seq->scene_camera) seq->scene_camera= newlibadr(fd, sce->id.lib, seq->scene_camera); if(seq->sound) { seq->scene_sound = NULL; if(seq->type == SEQ_HD_SOUND) @@ -4329,7 +4367,7 @@ static void lib_link_scene(FileData *fd, Main *main) seq->sound= newlibadr(fd, sce->id.lib, seq->sound); if (seq->sound) { seq->sound->id.us++; - seq->scene_sound = sound_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs); + seq->scene_sound = sound_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); } } seq->anim= 0; @@ -4357,8 +4395,7 @@ static void lib_link_scene(FileData *fd, Main *main) srl->light_override= newlibadr_us(fd, sce->id.lib, srl->light_override); } /*Game Settings: Dome Warp Text*/ -// sce->r.dometext= newlibadr_us(fd, sce->id.lib, sce->r.dometext); // XXX deprecated since 2.5 - sce->gm.dome.warptext= newlibadr_us(fd, sce->id.lib, sce->gm.dome.warptext); + sce->gm.dome.warptext= newlibadr(fd, sce->id.lib, sce->gm.dome.warptext); sce->id.flag -= LIB_NEEDLINK; } @@ -4450,8 +4487,12 @@ static void direct_link_scene(FileData *fd, Scene *sce) seq->plugin= newdataadr(fd, seq->plugin); seq->effectdata= newdataadr(fd, seq->effectdata); - if (seq->type & SEQ_EFFECT) { + if(seq->type & SEQ_EFFECT) seq->flag |= SEQ_EFFECT_NOT_LOADED; + + if(seq->type == SEQ_SPEED) { + SpeedControlVars *s= seq->effectdata; + s->frameMap= NULL; } seq->strip= newdataadr(fd, seq->strip); @@ -4698,6 +4739,7 @@ static void lib_link_screen(FileData *fd, Main *main) if(sc->id.flag & LIB_NEEDLINK) { sc->id.us= 1; sc->scene= newlibadr(fd, sc->id.lib, sc->scene); + sc->animtimer= NULL; /* saved in rare cases */ sa= sc->areabase.first; while(sa) { @@ -4778,6 +4820,11 @@ static void lib_link_screen(FileData *fd, Main *main) SpaceImage *sima= (SpaceImage *)sl; sima->image= newlibadr_us(fd, sc->id.lib, sima->image); + + /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data + * so fingers crossed this works fine! + */ + sima->gpd= newlibadr_us(fd, sc->id.lib, sima->gpd); } else if(sl->spacetype==SPACE_NLA){ SpaceNla *snla= (SpaceNla *)sl; @@ -4853,7 +4900,7 @@ static void *restore_pointer_by_name(Main *mainp, ID *id, int user) { if(id) { - ListBase *lb= wich_libbase(mainp, GS(id->name)); + ListBase *lb= which_libbase(mainp, GS(id->name)); if(lb) { // there's still risk of checking corrupt mem (freed Ids in oops) ID *idn= lb->first; @@ -4916,7 +4963,10 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) View3D *v3d= (View3D*) sl; BGpic *bgpic; - v3d->camera= restore_pointer_by_name(newmain, (ID *)v3d->camera, 1); + if(v3d->scenelock) + v3d->camera= NULL; /* always get from scene */ + else + v3d->camera= restore_pointer_by_name(newmain, (ID *)v3d->camera, 1); if(v3d->camera==NULL) v3d->camera= sc->scene->camera; v3d->ob_centre= restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1); @@ -4974,7 +5024,7 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) sfile->op= NULL; } else if(sl->spacetype==SPACE_IMASEL) { - SpaceImaSel *simasel= (SpaceImaSel *)sl; + SpaceImaSel *simasel= (SpaceImaSel *)sl; if (simasel->files) { //XXX BIF_filelist_freelib(simasel->files); } @@ -4992,6 +5042,17 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) SpaceImage *sima= (SpaceImage *)sl; sima->image= restore_pointer_by_name(newmain, (ID *)sima->image, 1); + + sima->scopes.waveform_1 = NULL; + sima->scopes.waveform_2 = NULL; + sima->scopes.waveform_3 = NULL; + sima->scopes.vecscope = NULL; + sima->scopes.ok = 0; + + /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data + * so assume that here we're doing for undo only... + */ + sima->gpd= restore_pointer_by_name(newmain, (ID *)sima->gpd, 1); } else if(sl->spacetype==SPACE_NLA){ SpaceNla *snla= (SpaceNla *)sl; @@ -5254,13 +5315,23 @@ static void direct_link_screen(FileData *fd, bScreen *sc) SpaceImage *sima= (SpaceImage *)sl; sima->cumap= newdataadr(fd, sima->cumap); - sima->gpd= newdataadr(fd, sima->gpd); - if (sima->gpd) - direct_link_gpencil(fd, sima->gpd); if(sima->cumap) direct_link_curvemapping(fd, sima->cumap); + sima->iuser.scene= NULL; sima->iuser.ok= 1; + sima->scopes.waveform_1 = NULL; + sima->scopes.waveform_2 = NULL; + sima->scopes.waveform_3 = NULL; + sima->scopes.vecscope = NULL; + sima->scopes.ok = 0; + + /* WARNING: gpencil data is no longer stored directly in sima after 2.5 + * so sacrifice a few old files for now to avoid crashes with new files! + */ + //sima->gpd= newdataadr(fd, sima->gpd); + //if (sima->gpd) + // direct_link_gpencil(fd, sima->gpd); } else if(sl->spacetype==SPACE_NODE) { SpaceNode *snode= (SpaceNode *)sl; @@ -5271,6 +5342,10 @@ static void direct_link_screen(FileData *fd, bScreen *sc) } snode->nodetree= snode->edittree= NULL; } + else if(sl->spacetype==SPACE_TIME) { + SpaceTime *stime= (SpaceTime *)sl; + stime->caches.first= stime->caches.last= NULL; + } else if(sl->spacetype==SPACE_LOGIC) { SpaceLogic *slogic= (SpaceLogic *)sl; @@ -5292,7 +5367,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc) } else if(sl->spacetype==SPACE_CONSOLE) { SpaceConsole *sconsole= (SpaceConsole *)sl; - //ConsoleLine *cl; + ConsoleLine *cl, *cl_next; link_list(fd, &sconsole->scrollback); link_list(fd, &sconsole->history); @@ -5300,9 +5375,17 @@ static void direct_link_screen(FileData *fd, bScreen *sc) //for(cl= sconsole->scrollback.first; cl; cl= cl->next) // cl->line= newdataadr(fd, cl->line); - //for(cl= sconsole->history.first; cl; cl= cl->next) - // cl->line= newdataadr(fd, cl->line); - + /*comma expressions, (e.g. expr1, expr2, expr3) evalutate each expression, + from left to right. the right-most expression sets the result of the comma + expression as a whole*/ + for(cl= sconsole->history.first; cl; cl= cl_next) { + cl_next= cl->next; + cl->line= newdataadr(fd, cl->line); + if (cl->line == NULL) { + BLI_remlink(&sconsole->history, cl); + MEM_freeN(cl); + } + } } else if(sl->spacetype==SPACE_FILE) { SpaceFile *sfile= (SpaceFile *)sl; @@ -5336,8 +5419,8 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main) for(newmain= fd->mainlist.first; newmain; newmain= newmain->next) { if(newmain->curlib) { - if(strcmp(newmain->curlib->filename, lib->filename)==0) { - printf("Fixed error in file; multiple instances of lib:\n %s\n", lib->filename); + if(strcmp(newmain->curlib->filepath, lib->filepath)==0) { + printf("Fixed error in file; multiple instances of lib:\n %s\n", lib->filepath); change_idid_adr(&fd->mainlist, fd, lib, newmain->curlib); // change_idid_adr_fd(fd, lib, newmain->curlib); @@ -5352,8 +5435,8 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main) } } /* make sure we have full path in lib->filename */ - BLI_strncpy(lib->filename, lib->name, sizeof(lib->name)); - cleanup_path(fd->relabase, lib->filename); + BLI_strncpy(lib->filepath, lib->name, sizeof(lib->name)); + cleanup_path(fd->relabase, lib->filepath); // printf("direct_link_library: name %s\n", lib->name); // printf("direct_link_library: filename %s\n", lib->filename); @@ -5386,8 +5469,8 @@ static void fix_relpaths_library(const char *basepath, Main *main) /* Libraries store both relative and abs paths, recreate relative paths, * relative to the blend file since indirectly linked libs will be relative to their direct linked library */ if (strncmp(lib->name, "//", 2)==0) { /* if this is relative to begin with? */ - strncpy(lib->name, lib->filename, sizeof(lib->name)); - BLI_makestringcode(basepath, lib->name); + strncpy(lib->name, lib->filepath, sizeof(lib->name)); + BLI_path_rel(lib->name, basepath); } } } @@ -5546,10 +5629,10 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID /* do after read_struct, for dna reconstruct */ if(bhead->code==ID_ID) { - lb= wich_libbase(main, GS(id->name)); + lb= which_libbase(main, GS(id->name)); } else { - lb= wich_libbase(main, bhead->code); + lb= which_libbase(main, bhead->code); } BLI_addtail(lb, id); @@ -6359,10 +6442,10 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) ar->v2d.cur= ar->v2d.tot; ar->v2d.min[0]= 0.0f; - ar->v2d.min[1]= 0.0f; + ar->v2d.min[1]= 0.0f; ar->v2d.max[0]= MAXFRAMEF; - ar->v2d.max[1]= FLT_MAX; + ar->v2d.max[1]= FLT_MAX; ar->v2d.minzoom= 0.01f; ar->v2d.maxzoom= 50; @@ -6402,7 +6485,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) break; } case SPACE_FILE: - { + { // SpaceFile *sfile= (SpaceFile *)sl; ar->v2d.tot.xmin = ar->v2d.tot.ymin = 0; ar->v2d.tot.xmax = ar->winx; @@ -6578,6 +6661,30 @@ static void do_version_mtex_factor_2_50(MTex **mtex_array, short idtype) } } +static void do_version_mdef_250(FileData *fd, Library *lib, Main *main) +{ + Object *ob; + ModifierData *md; + MeshDeformModifierData *mmd; + + for(ob= main->object.first; ob; ob=ob->id.next) { + for(md=ob->modifiers.first; md; md=md->next) { + if(md->type == eModifierType_MeshDeform) { + mmd= (MeshDeformModifierData*)md; + + if(mmd->bindcos) { + /* make bindcos NULL in order to trick older versions + into thinking that the mesh was not bound yet */ + mmd->bindcagecos= mmd->bindcos; + mmd->bindcos= NULL; + + modifier_mdef_compact_influences(md); + } + } + } + } +} + static void do_version_constraints_radians_degrees_250(ListBase *lb) { bConstraint *con; @@ -6606,6 +6713,40 @@ static void do_version_constraints_radians_degrees_250(ListBase *lb) } } +/* NOTE: this version patch is intended for versions < 2.52.2, but was initially introduced in 2.27 already */ +static void do_version_old_trackto_to_constraints(Object *ob) +{ + /* create new trackto constraint from the relationship */ + if (ob->track) + { + bConstraint *con= add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_TRACKTO); + bTrackToConstraint *data = con->data; + + /* copy tracking settings from the object */ + data->tar = ob->track; + data->reserved1 = ob->trackflag; + data->reserved2 = ob->upflag; + } + + /* clear old track setting */ + ob->track = NULL; +} + +static void do_versions_seq_unique_name_all_strips( + Scene * sce, ListBase *seqbasep) +{ + Sequence * seq = seqbasep->first; + + while(seq) { + seqbase_unique_name_recursive(&sce->ed->seqbase, seq); + if (seq->seqbase.first) { + do_versions_seq_unique_name_all_strips( + sce, &seq->seqbase); + } + seq=seq->next; + } +} + static void do_versions(FileData *fd, Library *lib, Main *main) { /* WATCH IT!!!: pointers from libdata have not been converted */ @@ -6747,8 +6888,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Tex *tex = main->tex.first; while (tex) { if ((tex->rfac == 0.0) && - (tex->gfac == 0.0) && - (tex->bfac == 0.0)) { + (tex->gfac == 0.0) && + (tex->bfac == 0.0)) { tex->rfac = 1.0; tex->gfac = 1.0; tex->bfac = 1.0; @@ -6762,8 +6903,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Tex *tex = main->tex.first; while (tex) { if ((tex->rfac == 0.0) && - (tex->gfac == 0.0) && - (tex->bfac == 0.0)) { + (tex->gfac == 0.0) && + (tex->bfac == 0.0)) { tex->rfac = 1.0; tex->gfac = 1.0; tex->bfac = 1.0; @@ -6953,7 +7094,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Object *ob= main->object.first; while(ob) { ob->scaflag = ob->gameflag & (64+128+256+512+1024+2048); - /* 64 is do_fh */ + /* 64 is do_fh */ ob->gameflag &= ~(128+256+512+1024+2048); ob = ob->id.next; } @@ -7065,8 +7206,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) bRaySensor *rs; bCollisionSensor *cs; while(ob) { - /* Set anisotropic friction off for old objects, - * values to 1.0. */ + /* Set anisotropic friction off for old objects, + * values to 1.0. */ ob->gameflag &= ~OB_ANISOTROPIC_FRICTION; ob->anisotropicFriction[0] = 1.0; ob->anisotropicFriction[1] = 1.0; @@ -7387,7 +7528,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Object *ob; /* As of now, this insures that the transition from the old Track system - to the new full constraint Track is painless for everyone. - theeth + to the new full constraint Track is painless for everyone. - theeth */ ob = main->object.first; @@ -7424,40 +7565,11 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } - } + } } /* Change Ob->Track in real TrackTo constraint */ - - if (ob->track){ - bConstraint *con; - bConstraintTypeInfo *cti; - bTrackToConstraint *data; - void *cdata; - - list = &ob->constraints; - if (list) - { - con = MEM_callocN(sizeof(bConstraint), "constraint"); - strcpy (con->name, "AutoTrack"); - unique_constraint_name(con, list); - con->flag |= CONSTRAINT_EXPAND; - con->enforce=1.0F; - con->type = CONSTRAINT_TYPE_TRACKTO; - - cti= get_constraint_typeinfo(CONSTRAINT_TYPE_TRACKTO); - cdata= MEM_callocN(cti->size, cti->structName); - cti->new_data(cdata); - data = (bTrackToConstraint *)cdata; - - data->tar = ob->track; - data->reserved1 = ob->trackflag; - data->reserved2 = ob->upflag; - con->data= (void*) data; - BLI_addtail(list, con); - } - ob->track = 0; - } + do_version_old_trackto_to_constraints(ob); ob = ob->id.next; } @@ -7504,7 +7616,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* As of now, this insures that the transition from the old Track system - to the new full constraint Track is painless for everyone.*/ + to the new full constraint Track is painless for everyone.*/ ob = main->object.first; while (ob) { @@ -7540,7 +7652,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } - } + } } ob = ob->id.next; @@ -7960,7 +8072,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if(ob->type==OB_ARMATURE) { if(ob->pose) ob->pose->flag |= POSE_RECALC; - ob->recalc |= OB_RECALC; // cannot call stuff now (pointers!), done in setup_app_data + ob->recalc |= OB_RECALC_ALL; // cannot call stuff now (pointers!), done in setup_app_data /* new generic xray option */ arm= newlibadr(fd, lib, ob->data); @@ -8527,8 +8639,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ima->flag |= IMA_FIELDS; if(tex->imaflag & TEX_STD_FIELD_) ima->flag |= IMA_STD_FIELD; - if(tex->imaflag & TEX_ANTIALI_) - ima->flag |= IMA_ANTIALI; } tex->iuser.frames= tex->frames; tex->iuser.fie_ima= tex->fie_ima; @@ -8583,12 +8693,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } if(main->versionfile <= 243) { Object *ob= main->object.first; - Camera *cam = main->camera.first; Material *ma; - - for(; cam; cam= cam->id.next) { - cam->angle= 360.0f * (float)atan(16.0f/cam->lens) / (float)M_PI; - } for(ma=main->mat.first; ma; ma= ma->id.next) { if(ma->sss_scale==0.0f) { @@ -9661,7 +9766,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* check if top parent has compound shape set and if yes, set this object to compound shaper as well (was the behaviour before, now it's optional) */ Object *parent= newlibadr(fd, lib, ob->parent); - while (parent && parent->parent != NULL) { + while (parent && parent != ob && parent->parent != NULL) { parent = newlibadr(fd, lib, parent->parent); } if(parent) { @@ -9759,7 +9864,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if(sAct->sound) { sound = newlibadr(fd, lib, sAct->sound); - sAct->flag = sound->flags | SOUND_FLAGS_3D ? ACT_SND_3D_SOUND : 0; + sAct->flag = sound->flags & SOUND_FLAGS_3D ? ACT_SND_3D_SOUND : 0; sAct->pitch = sound->pitch; sAct->volume = sound->volume; sAct->sound3D.reference_distance = sound->distance; @@ -9791,9 +9896,20 @@ static void do_versions(FileData *fd, Library *lib, Main *main) { char str[FILE_MAX]; BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name); - BLI_convertstringcode(str, G.sce); + BLI_path_abs(str, G.sce); seq->sound = sound_new_file(main, str); } + /* don't know, if anybody used that + this way, but just in case, upgrade + to new way... */ + if((seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) && + !(seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) + { + + snprintf(seq->strip->proxy->dir, + FILE_MAXDIR, "%s/BL_proxy", + seq->strip->dir); + } } } } @@ -9803,11 +9919,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main) do_versions_gpencil_2_50(main, screen); } - /* old Animation System (using IPO's) needs to be converted to the new Animato system - * (NOTE: conversion code in blenkernel/intern/ipo.c for now) - */ - //do_versions_ipos_to_animato(main); - /* shader, composit and texture node trees have id.name empty, put something in * to have them show in RNA viewer and accessible otherwise. */ @@ -9928,7 +10039,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) void *olddata = ob->data; ob->data = me; - if(me && me->id.lib==NULL && me->mr) /* XXX - library meshes crash on loading most yoFrankie levels, the multires pointer gets invalid - Campbell */ + if(me && me->id.lib==NULL && me->mr && me->mr->level_count > 1) /* XXX - library meshes crash on loading most yoFrankie levels, the multires pointer gets invalid - Campbell */ multires_load_old(ob, me); ob->data = olddata; @@ -10298,22 +10409,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main) { Scene *sce= main->scene.first; while(sce) { - Sequence *seq; - if(sce->r.frame_step==0) sce->r.frame_step= 1; if (sce->r.mblur_samples==0) sce->r.mblur_samples = sce->r.osa; - if(sce->ed && sce->ed->seqbasep) - { - seq=sce->ed->seqbasep->first; - while(seq) { - seqbase_unique_name_recursive(&sce->ed->seqbase, seq); - seq=seq->next; - } + if (sce->ed && sce->ed->seqbase.first) { + do_versions_seq_unique_name_all_strips( + sce, &sce->ed->seqbase); } - + sce= sce->id.next; } } @@ -10822,9 +10927,304 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } /* sequencer changes */ } + + if (main->versionfile <= 251) { /* 2.5.1 had no subversions */ + bScreen *sc; + + /* Blender 2.5.2 - subversion 0 introduced a new setting: V3D_RENDER_OVERRIDE. + * This bit was used in the past for V3D_TRANSFORM_SNAP, which is now deprecated. + * Here we clear it for old files so they don't come in with V3D_RENDER_OVERRIDE set, + * which would cause cameras, lamps, etc to become invisible */ + for(sc= main->screen.first; sc; sc= sc->id.next) { + ScrArea *sa; + for(sa= sc->areabase.first; sa; sa= sa->next) { + SpaceLink *sl; + for (sl= sa->spacedata.first; sl; sl= sl->next) { + if(sl->spacetype==SPACE_VIEW3D) { + View3D* v3d = (View3D *)sl; + v3d->flag2 &= ~V3D_RENDER_OVERRIDE; + } + } + } + } + } + + if (main->versionfile < 252 || (main->versionfile == 252 && main->subversionfile < 1)) { + Brush *brush; + Object *ob; + Scene *scene; + bNodeTree *ntree; + + for (brush= main->brush.first; brush; brush= brush->id.next) { + if (brush->curve) brush->curve->preset = CURVE_PRESET_SMOOTH; + } + + /* properly initialise active flag for fluidsim modifiers */ + for(ob = main->object.first; ob; ob = ob->id.next) { + ModifierData *md; + for(md= ob->modifiers.first; md; md= md->next) { + if (md->type == eModifierType_Fluidsim) { + FluidsimModifierData *fmd = (FluidsimModifierData *)md; + fmd->fss->flag |= OB_FLUIDSIM_ACTIVE; + fmd->fss->flag |= OB_FLUIDSIM_OVERRIDE_TIME; + } + } + } + + /* adjustment to color balance node values */ + for(scene= main->scene.first; scene; scene= scene->id.next) { + if(scene->nodetree) { + bNode *node=scene->nodetree->nodes.first; + + while(node) { + if (node->type == CMP_NODE_COLORBALANCE) { + NodeColorBalance *n= (NodeColorBalance *)node->storage; + n->lift[0] += 1.f; + n->lift[1] += 1.f; + n->lift[2] += 1.f; + } + node= node->next; + } + } + } + /* check inside node groups too */ + for (ntree= main->nodetree.first; ntree; ntree=ntree->id.next) { + bNode *node=ntree->nodes.first; + + while(node) { + if (node->type == CMP_NODE_COLORBALANCE) { + NodeColorBalance *n= (NodeColorBalance *)node->storage; + n->lift[0] += 1.f; + n->lift[1] += 1.f; + n->lift[2] += 1.f; + } + node= node->next; + } + } + } + + /* old-track -> constraints (this time we're really doing it!) */ + if (main->versionfile < 252 || (main->versionfile == 252 && main->subversionfile < 2)) { + Object *ob; + + for (ob = main->object.first; ob; ob = ob->id.next) + do_version_old_trackto_to_constraints(ob); + } + + if (main->versionfile < 252 || (main->versionfile == 252 && main->subversionfile < 5)) { + bScreen *sc; + + /* Image editor scopes */ + for(sc= main->screen.first; sc; sc= sc->id.next) { + ScrArea *sa; + for(sa= sc->areabase.first; sa; sa= sa->next) { + SpaceLink *sl; + for (sl= sa->spacedata.first; sl; sl= sl->next) { + if(sl->spacetype==SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)sl; + scopes_new(&sima->scopes); + } + } + } + } + } + /* put 2.50 compatibility code here until next subversion bump */ { + Object *ob; + Scene *scene; + bScreen *sc; + Tex *tex; + + for (sc= main->screen.first; sc; sc= sc->id.next) { + ScrArea *sa; + for (sa= sc->areabase.first; sa; sa= sa->next) { + SpaceLink *sl; + for (sl= sa->spacedata.first; sl; sl= sl->next) { + if (sl->spacetype == SPACE_NODE) { + SpaceNode *snode= (SpaceNode *)sl; + ListBase *regionbase; + ARegion *ar; + + if (sl == sa->spacedata.first) + regionbase = &sa->regionbase; + else + regionbase = &sl->regionbase; + + if (snode->v2d.minzoom > 0.09f) + snode->v2d.minzoom= 0.09f; + if (snode->v2d.maxzoom < 2.31f) + snode->v2d.maxzoom= 2.31f; + + for (ar= regionbase->first; ar; ar= ar->next) { + if (ar->regiontype == RGN_TYPE_WINDOW) { + if (ar->v2d.minzoom > 0.09f) + ar->v2d.minzoom= 0.09f; + if (ar->v2d.maxzoom < 2.31f) + ar->v2d.maxzoom= 2.31f; + } + } + } + else if (sl->spacetype == SPACE_TIME) { + SpaceTime *stime= (SpaceTime *)sl; + + /* enable all cache display */ + stime->cache_display |= TIME_CACHE_DISPLAY; + stime->cache_display |= (TIME_CACHE_SOFTBODY|TIME_CACHE_PARTICLES); + stime->cache_display |= (TIME_CACHE_CLOTH|TIME_CACHE_SMOKE); + } + } + } + } + + do_version_mdef_250(fd, lib, main); + + /* parent type to modifier */ + for(ob = main->object.first; ob; ob = ob->id.next) { + if(ob->parent) { + Object *parent= (Object *)newlibadr(fd, lib, ob->parent); + if(parent) { /* parent may not be in group */ + if(parent->type==OB_ARMATURE && ob->partype==PARSKEL) { + ArmatureModifierData *amd; + bArmature *arm= (bArmature *)newlibadr(fd, lib, parent->data); + + amd = (ArmatureModifierData*) modifier_new(eModifierType_Armature); + amd->object = ob->parent; + BLI_addtail((ListBase*)&ob->modifiers, amd); + amd->deformflag= arm->deformflag; + ob->partype = PAROBJECT; + } + else if(parent->type==OB_LATTICE && ob->partype==PARSKEL) { + LatticeModifierData *lmd; + + lmd = (LatticeModifierData*) modifier_new(eModifierType_Lattice); + lmd->object = ob->parent; + BLI_addtail((ListBase*)&ob->modifiers, lmd); + ob->partype = PAROBJECT; + } + else if(parent->type==OB_CURVE && ob->partype==PARCURVE) { + CurveModifierData *cmd; + + cmd = (CurveModifierData*) modifier_new(eModifierType_Curve); + cmd->object = ob->parent; + BLI_addtail((ListBase*)&ob->modifiers, cmd); + ob->partype = PAROBJECT; + } + } + } + } + + /* initialise scene active layer */ + for (scene= main->scene.first; scene; scene=scene->id.next) { + int i; + for(i=0; i<20; i++) { + if(scene->lay & (1<layact= 1<tex.first; tex; tex= tex->id.next) { + /* if youre picky, this isn't correct until we do a version bump + * since you could set saturation to be 0.0*/ + if(tex->saturation==0.0f) + tex->saturation= 1.0f; + } + + { + Curve *cu; + for(cu= main->curve.first; cu; cu= cu->id.next) { + cu->smallcaps_scale= 0.75f; + } + } + + for (scene= main->scene.first; scene; scene=scene->id.next) { + if(scene) { + Sequence *seq; + SEQ_BEGIN(scene->ed, seq) { + seq->sat= 1.0f; + } + SEQ_END + } + } + } + + { + /* GSOC 2010 Sculpt - New settings for Brush */ + + Brush *brush; + for (brush= main->brush.first; brush; brush= brush->id.next) { + /* Sanity Check */ + + // infinite number of dabs + if (brush->spacing == 0) + brush->spacing = 10; + + // will have no effect + if (brush->alpha == 0) + brush->alpha = 0.5f; + + // bad radius + if (brush->unprojected_radius == 0) + brush->unprojected_radius = 0.125; + + // unusable size + if (brush->size == 0) + brush->size = 35; + + // can't see overlay + if (brush->texture_overlay_alpha == 0) + brush->texture_overlay_alpha = 33; + + // same as draw brush + if (brush->crease_pinch_factor == 0) + brush->crease_pinch_factor = 0.5f; + + // will sculpt no vertexes + if (brush->plane_trim == 0) + brush->plane_trim = 0.5f; + + // same as smooth stroke off + if (brush->smooth_stroke_radius == 0) + brush->smooth_stroke_radius= 75; + + // will keep cursor in one spot + if (brush->smooth_stroke_radius == 1) + brush->smooth_stroke_factor= 0.9f; + + // same as dots + if (brush->rate == 0) + brush->rate = 0.1f; + + /* New Settings */ + if (main->versionfile < 252 || (main->versionfile == 252 && main->subversionfile < 5)) { + brush->flag |= BRUSH_SPACE_ATTEN; // explicitly enable adaptive space + + // spacing was originally in pixels, convert it to percentage for new version + // size should not be zero due to sanity check above + brush->spacing = (int)(100*((float)brush->spacing) / ((float)brush->size)); + + if (brush->add_col[0] == 0 && + brush->add_col[1] == 0 && + brush->add_col[2] == 0) + { + brush->add_col[0] = 1.00; + brush->add_col[1] = 0.39; + brush->add_col[2] = 0.39; + } + + if (brush->sub_col[0] == 0 && + brush->sub_col[1] == 0 && + brush->sub_col[2] == 0) + { + brush->sub_col[0] = 0.39; + brush->sub_col[1] = 0.39; + brush->sub_col[2] = 1.00; + } + } + } } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ @@ -10833,6 +11233,15 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* don't forget to set version number in blender.c! */ } +#if 0 // XXX: disabled for now... we still don't have this in the right place in the loading code for it to work +static void do_versions_after_linking(FileData *fd, Library *lib, Main *main) +{ + /* old Animation System (using IPO's) needs to be converted to the new Animato system */ + if(main->versionfile < 250) + do_versions_ipos_to_animato(main); +} +#endif + static void lib_link_all(FileData *fd, Main *main) { oldnewmap_sort(fd); @@ -10907,7 +11316,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead) return bhead; } -BlendFileData *blo_read_file_internal(FileData *fd, char *file) +BlendFileData *blo_read_file_internal(FileData *fd, const char *filename) { BHead *bhead= blo_firstbhead(fd); BlendFileData *bfd; @@ -10919,13 +11328,13 @@ BlendFileData *blo_read_file_internal(FileData *fd, char *file) bfd->main->versionfile= fd->fileversion; bfd->type= BLENFILETYPE_BLEND; - strncpy(bfd->main->name, file, sizeof(bfd->main->name)-1); + strncpy(bfd->main->name, filename, sizeof(bfd->main->name)-1); while(bhead) { switch(bhead->code) { case DATA: case DNA1: - case TEST: + case TEST: /* used as preview since 2.5x */ case REND: bhead = blo_nextbhead(fd, bhead); break; @@ -10979,6 +11388,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, char *file) blo_join_main(&fd->mainlist); lib_link_all(fd, bfd->main); + //do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010) lib_verify_nodetree(bfd->main, 1); fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */ @@ -11075,8 +11485,8 @@ char *bhead_id_name(FileData *fd, BHead *bhead) static ID *is_yet_read(FileData *fd, Main *mainvar, BHead *bhead) { const char *idname= bhead_id_name(fd, bhead); - /* wich_libbase can be NULL, intentionally not using idname+2 */ - return BLI_findstring(wich_libbase(mainvar, GS(idname)), idname, offsetof(ID, name)); + /* which_libbase can be NULL, intentionally not using idname+2 */ + return BLI_findstring(which_libbase(mainvar, GS(idname)), idname, offsetof(ID, name)); } static void expand_doit(FileData *fd, Main *mainvar, void *old) @@ -11130,7 +11540,7 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old) /* this is actually only needed on UI call? when ID was already read before, and another append happens which invokes same ID... in that case the lookup table needs this entry */ oldnewmap_insert(fd->libmap, bhead->old, id, 1); - // commented because this can print way too much + // commented because this can print way too much // if(G.f & G_DEBUG) printf("expand: already read %s\n", id->name); } } @@ -11572,7 +11982,6 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) PartEff *paf; int a; - expand_doit(fd, mainvar, ob->data); for (md=ob->modifiers.first; md; md=md->next) { @@ -11745,6 +12154,7 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) SEQ_BEGIN(sce->ed, seq) { if(seq->scene) expand_doit(fd, mainvar, seq->scene); + if(seq->scene_camera) expand_doit(fd, mainvar, seq->scene_camera); if(seq->sound) expand_doit(fd, mainvar, seq->sound); } SEQ_END @@ -11939,7 +12349,7 @@ static void give_base_to_groups(Main *mainvar, Scene *scene) base= scene_add_base(scene, ob); base->flag |= SELECT; base->object->flag= base->flag; - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; scene->basact= base; /* assign the group */ @@ -11998,6 +12408,7 @@ static void append_named_part(const bContext *C, Main *mainl, FileData *fd, char ob->lay = scene->lay; } } + ob->mode= 0; base->lay= ob->lay; base->object= ob; ob->id.us++; @@ -12055,7 +12466,9 @@ static Main* library_append_begin(const bContext *C, FileData **fd, char *dir) /* which one do we need? */ mainl = blo_find_main(*fd, &(*fd)->mainlist, dir, G.sce); - mainl->versionfile= (*fd)->fileversion; /* needed for do_version */ + /* needed for do_version */ + mainl->versionfile= (*fd)->fileversion; + read_file_version(*fd, mainl); return mainl; } @@ -12128,13 +12541,13 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in read_libraries(*fd, &(*fd)->mainlist); /* make the lib path relative if required */ - if(flag & FILE_STRINGCODE) { + if(flag & FILE_RELPATH) { /* use the full path, this could have been read by other library even */ - BLI_strncpy(mainl->curlib->name, mainl->curlib->filename, sizeof(mainl->curlib->name)); + BLI_strncpy(mainl->curlib->name, mainl->curlib->filepath, sizeof(mainl->curlib->name)); /* uses current .blend file as reference */ - BLI_makestringcode(G.sce, mainl->curlib->name); + BLI_path_rel(mainl->curlib->name, G.sce); } blo_join_main(&(*fd)->mainlist); @@ -12146,7 +12559,10 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in /* give a base to loose objects. If group append, do it for objects too */ if(scene) { - if(idcode==ID_GR) { + if(idcode==ID_SCE) { + /* dont instance anything when linking in scenes, assume the scene its self instances the data */ + } + else if(idcode==ID_GR) { if (flag & FILE_LINK) { give_base_to_objects(mainvar, scene, NULL, 0); } else { @@ -12245,10 +12661,34 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) if(fd==NULL) { /* printf and reports for now... its important users know this */ - printf("read library: %s\n", mainptr->curlib->name); - BKE_reportf(basefd->reports, RPT_INFO, "read library: '%s'\n", mainptr->curlib->name); + BKE_reportf(basefd->reports, RPT_INFO, "read library: '%s', '%s'\n", mainptr->curlib->filepath, mainptr->curlib->name); + if(!G.background && basefd->reports) printf("read library: '%s', '%s'\n", mainptr->curlib->filepath, mainptr->curlib->name); - fd= blo_openblenderfile(mainptr->curlib->filename, basefd->reports); + fd= blo_openblenderfile(mainptr->curlib->filepath, basefd->reports); + + /* allow typing in a new lib path */ + if(G.rt==-666) { + while(fd==NULL) { + char newlib_path[240] = { 0 }; + printf("Missing library...'\n"); + printf(" current file: %s\n", G.sce); + printf(" absolute lib: %s\n", mainptr->curlib->filepath); + printf(" relative lib: %s\n", mainptr->curlib->name); + printf(" enter a new path:\n"); + + if(scanf("%s", newlib_path) > 0) { + strcpy(mainptr->curlib->name, newlib_path); + strcpy(mainptr->curlib->filepath, newlib_path); + cleanup_path(G.sce, mainptr->curlib->filepath); + + fd= blo_openblenderfile(mainptr->curlib->filepath, basefd->reports); + + if(fd) { + printf("found: '%s', party on macuno!\n", mainptr->curlib->filepath); + } + } + } + } if (fd) { fd->reports= basefd->reports; @@ -12267,8 +12707,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) else mainptr->curlib->filedata= NULL; if (fd==NULL) { - printf("ERROR: can't find lib %s \n", mainptr->curlib->filename); - BKE_reportf(basefd->reports, RPT_ERROR, "Can't find lib '%s'\n", mainptr->curlib->filename); + BKE_reportf(basefd->reports, RPT_ERROR, "Can't find lib '%s'\n", mainptr->curlib->filepath); + if(!G.background && basefd->reports) printf("ERROR: can't find lib %s \n", mainptr->curlib->filepath); } } if(fd) { @@ -12285,8 +12725,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) append_id_part(fd, mainptr, id, &realid); if (!realid) { - printf("LIB ERROR: can't find %s\n", id->name); - BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filename); + BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath); + if(!G.background && basefd->reports) printf("LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath); } change_idid_adr(mainlist, basefd, id, realid); @@ -12321,9 +12761,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) ID *idn= id->next; if(id->flag & LIB_READ) { BLI_remlink(lbarray[a], id); - - printf("LIB ERROR: can't find %s\n", id->name); - BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filename); + BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath); + if(!G.background && basefd->reports)printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath); change_idid_adr(mainlist, basefd, id, NULL); MEM_freeN(id); diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index cc3643c0364..8e391fa438e 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -108,7 +108,7 @@ struct Main; void blo_join_main(ListBase *mainlist); void blo_split_main(ListBase *mainlist, struct Main *main); -BlendFileData *blo_read_file_internal(FileData *fd, char *file); +BlendFileData *blo_read_file_internal(FileData *fd, const char *filename); FileData *blo_openblenderfile(char *name, struct ReportList *reports); FileData *blo_openblendermemory(void *buffer, int buffersize, struct ReportList *reports); diff --git a/source/blender/blenloader/intern/undofile.c b/source/blender/blenloader/intern/undofile.c index d52646cbe00..40b03a78f34 100644 --- a/source/blender/blenloader/intern/undofile.c +++ b/source/blender/blenloader/intern/undofile.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,10 +28,6 @@ * .blend file reading entry point */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include #include #include diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 356d5e5d4f2..590a331c426 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -62,16 +62,13 @@ Any case: direct data is ALWAYS after the lib block - write library block - per LibBlock - write the ID of LibBlock +- write TEST (128x128, blend file preview, optional) - write FileGlobal (some global vars) - write SDNA - write USER if filename is ~/.B.blend */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include #include #include @@ -614,11 +611,11 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches) for(; pm; pm=pm->next) { writestruct(wd, DATA, "PTCacheMem", 1, pm); if(pm->index_array) - writedata(wd, DATA, sizeof(int) * pm->totpoint, pm->index_array); + writedata(wd, DATA, MEM_allocN_len(pm->index_array), pm->index_array); for(i=0; idata[i] && pm->data_types & (1<totpoint, pm->data[i]); + writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]); } } } @@ -652,6 +649,9 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase) for(; state; state=state->next) write_boid_state(wd, state); } + if(part->fluid && part->phystype == PART_PHYS_FLUID){ + writestruct(wd, DATA, "SPHFluidSettings", 1, part->fluid); + } } part= part->id.next; } @@ -1232,10 +1232,10 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; int size = mmd->dyngridsize; - writedata(wd, DATA, sizeof(float)*mmd->totvert*mmd->totcagevert, - mmd->bindweights); + writestruct(wd, DATA, "MDefInfluence", mmd->totinfluence, mmd->bindinfluences); + writedata(wd, DATA, sizeof(int)*(mmd->totvert+1), mmd->bindoffsets); writedata(wd, DATA, sizeof(float)*3*mmd->totcagevert, - mmd->bindcos); + mmd->bindcagecos); writestruct(wd, DATA, "MDefCell", size*size*size, mmd->dyngrid); writestruct(wd, DATA, "MDefInfluence", mmd->totinfluence, mmd->dyninfluences); writedata(wd, DATA, sizeof(int)*mmd->totvert, mmd->dynverts); @@ -1267,6 +1267,14 @@ static void write_objects(WriteData *wd, ListBase *idbase) write_sensors(wd, &ob->sensors); write_controllers(wd, &ob->controllers); write_actuators(wd, &ob->actuators); + + if (ob->type == OB_ARMATURE) { + bArmature *arm = ob->data; + if (arm && ob->pose && arm->act_bone) { + strcpy(ob->pose->proxy_act_bone, arm->act_bone->name); + } + } + write_pose(wd, ob->pose); write_defgroups(wd, &ob->defbase); write_constraints(wd, &ob->constraints); @@ -1627,10 +1635,6 @@ static void write_images(WriteData *wd, ListBase *idbase) } write_previews(wd, ima->preview); - - /* exception: render text only saved in undo files (wd->current) */ - if (ima->render_text && wd->current) - writedata(wd, DATA, IMA_RW_MAXTEXT, ima->render_text); } ima= ima->id.next; } @@ -2115,7 +2119,15 @@ static void write_screens(WriteData *wd, ListBase *scrbase) writestruct(wd, DATA, "SpaceLogic", 1, sl); } else if(sl->spacetype==SPACE_CONSOLE) { + SpaceConsole *con = (SpaceConsole*)sl; + ConsoleLine *cl; + + for (cl=con->history.first; cl; cl=cl->next) { + writestruct(wd, DATA, "ConsoleLine", 1, cl); + writedata(wd, DATA, cl->len+1, cl->line); + } writestruct(wd, DATA, "SpaceConsole", 1, sl); + } else if(sl->spacetype==SPACE_USERPREF) { writestruct(wd, DATA, "SpaceUserPref", 1, sl); @@ -2381,9 +2393,19 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) writestruct(wd, GLOB, "FileGlobal", 1, &fg); } +/* preview image, first 2 values are width and height + * second are an RGBA image (unsigned char) + * note, this uses 'TEST' since new types will segfault on file load for older blender versions. + */ +static void write_thumb(WriteData *wd, int *img) +{ + if(img) + writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img); +} + /* if MemFile * there's filesave to memory */ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFile *current, - int write_user_block, int write_flags) + int write_user_block, int write_flags, int *thumb) { BHead bhead; ListBase mainlist; @@ -2398,6 +2420,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil mywrite(wd, buf, 12); write_renderinfo(wd, mainvar); + write_thumb(wd, thumb); write_global(wd, write_flags, mainvar); /* no UI save in undo */ @@ -2449,7 +2472,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil } /* return: success (1) */ -int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports) +int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports, int *thumb) { char userfilename[FILE_MAXDIR+FILE_MAXFILE]; char tempname[FILE_MAXDIR+FILE_MAXFILE+1]; @@ -2460,7 +2483,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report file = open(tempname,O_BINARY+O_WRONLY+O_CREAT+O_TRUNC, 0666); if(file == -1) { - BKE_report(reports, RPT_ERROR, "Unable to open file for writing."); + BKE_reportf(reports, RPT_ERROR, "Can't open file %s for writing: %s.", tempname, strerror(errno)); return 0; } @@ -2468,8 +2491,8 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report if(write_flags & G_FILE_RELATIVE_REMAP) { char dir1[FILE_MAXDIR+FILE_MAXFILE]; char dir2[FILE_MAXDIR+FILE_MAXFILE]; - BLI_split_dirfile_basic(dir, dir1, NULL); - BLI_split_dirfile_basic(mainvar->name, dir2, NULL); + BLI_split_dirfile(dir, dir1, NULL); + BLI_split_dirfile(mainvar->name, dir2, NULL); /* just incase there is some subtle difference */ BLI_cleanup_dir(mainvar->name, dir1); @@ -2481,14 +2504,14 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report makeFilesAbsolute(G.sce, NULL); } - BLI_make_file_string(G.sce, userfilename, BLI_gethome(), ".B25.blend"); + BLI_make_file_string(G.sce, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE); write_user_block= BLI_streq(dir, userfilename); if(write_flags & G_FILE_RELATIVE_REMAP) makeFilesRelative(dir, NULL); /* note, making relative to something OTHER then G.sce */ /* actual file writing */ - err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags); + err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb); close(file); /* rename/compress */ @@ -2541,7 +2564,7 @@ int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int wr { int err; - err= write_file_handle(mainvar, 0, compare, current, 0, write_flags); + err= write_file_handle(mainvar, 0, compare, current, 0, write_flags, NULL); if(err==0) return 1; return 0; @@ -2637,7 +2660,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777); if (outfd != -1) { - write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags); + write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL); if (write(outfd, " ", 1) != 1) { BKE_report(reports, RPT_ERROR, "Unable to write to output file."); @@ -2723,7 +2746,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo datastart= lseek(outfd, 0, SEEK_CUR); - write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags); + write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL); if (!handle_write_msb_int(outfd, datastart) || (write(outfd, "BRUNTIME", 8)!=8)) { BKE_report(reports, RPT_ERROR, "Unable to write to output file."); diff --git a/source/blender/blenpluginapi/iff.h b/source/blender/blenpluginapi/iff.h index 9378cdc9134..b8628b00575 100644 --- a/source/blender/blenpluginapi/iff.h +++ b/source/blender/blenpluginapi/iff.h @@ -35,123 +35,19 @@ #include "util.h" #include "externdef.h" -#define IB_rect (1 << 0) -#define IB_planes (1 << 1) -#define IB_cmap (1 << 2) -#define IB_test (1 << 7) +struct ImMetaData; -#define IB_fields (1 << 11) -#define IB_yuv (1 << 12) -#define IB_zbuf (1 << 13) -#define IB_rgba (1 << 14) - -#define JP2 (1 << 18) - -#define AMI (1 << 31) -#define PNG (1 << 30) -#define Anim (1 << 29) -#define TGA (1 << 28) -#define JPG (1 << 27) -#define BMP (1 << 26) -#ifdef WITH_QUICKTIME -#define QUICKTIME (1 << 25) -#endif -#define RADHDR (1<<24) - -#define RAWTGA (TGA | 1) - -#define JPG_STD (JPG | (0 << 8)) -#define JPG_VID (JPG | (1 << 8)) -#define JPG_JST (JPG | (2 << 8)) -#define JPG_MAX (JPG | (3 << 8)) -#define JPG_MSK (0xffffff00) - -#define AM_ham (0x0800 | AMI) -#define AM_hbrite (0x0080 | AMI) -#define AM_lace (0x0004 | AMI) -#define AM_hires (0x8000 | AMI) -#define AM_hblace (AM_hbrite | AM_lace) -#define AM_hilace (AM_hires | AM_lace) -#define AM_hamlace (AM_ham | AM_lace) - -#define RGB888 1 -#define RGB555 2 -#define DYUV 3 -#define CLUT8 4 -#define CLUT7 5 -#define CLUT4 6 -#define CLUT3 7 -#define RL7 8 -#define RL3 9 -#define MPLTE 10 - -#define DYUV1 0 -#define C233 1 -#define YUVX 2 -#define HAMX 3 -#define TANX 4 - -#define AN_c233 (Anim | C233) -#define AN_yuvx (Anim | YUVX) -#define AN_hamx (Anim | HAMX) -#define AN_tanx (Anim | TANX) - -#define IS_amiga(x) (x->ftype & AMI) -#define IS_ham(x) ((x->ftype & AM_ham) == AM_ham) -#define IS_hbrite(x) ((x->ftype & AM_hbrite) == AM_hbrite) - -#define IS_lace(x) ((x->ftype & AM_lace) == AM_lace) -#define IS_hires(x) ((x->ftype & AM_hires) == AM_hires) -#define IS_hblace(x) ((x->ftype & AM_hblace) == AM_hblace) -#define IS_hilace(x) ((x->ftype & AM_hilace) == AM_hilace) -#define IS_hamlace(x) ((x->ftype & AM_hamlace) == AM_hamlace) - -#define IS_anim(x) (x->ftype & Anim) -#define IS_hamx(x) (x->ftype == AN_hamx) -#define IS_tga(x) (x->ftype & TGA) -#define IS_png(x) (x->ftype & PNG) -#define IS_bmp(x) (x->ftype & BMP) -#define IS_radhdr(x) (x->ftype & RADHDR) -#define IS_tim(x) (x->ftype & TIM) -#define IS_tiff(x) (x->ftype & TIFF) -#define IS_openexr(x) (x->ftype & OPENEXR) -#define IS_jp2(x) (x->ftype & JP2) - - -#define IMAGIC 0732 -#define IS_iris(x) (x->ftype == IMAGIC) - -#define IS_jpg(x) (x->ftype & JPG) -#define IS_stdjpg(x) ((x->ftype & JPG_MSK) == JPG_STD) -#define IS_vidjpg(x) ((x->ftype & JPG_MSK) == JPG_VID) -#define IS_jstjpg(x) ((x->ftype & JPG_MSK) == JPG_JST) -#define IS_maxjpg(x) ((x->ftype & JPG_MSK) == JPG_MAX) - -#define AN_INIT an_stringdec = stringdec; an_stringenc = stringenc; - -#define IB_MIPMAP_LEVELS 10 - -struct MEM_CacheLimiterHandle_s; +#define IB_MIPMAP_LEVELS 20 +#define IB_FILENAME_SIZE 1023 typedef struct ImBuf { struct ImBuf *next, *prev; /**< allow lists of ImBufs, for caches or flipbooks */ short x, y; /**< width and Height of our image buffer */ - short skipx; /**< Width in ints to get to the next scanline */ unsigned char depth; /**< Active amount of bits/bitplanes */ - unsigned char cbits; /**< Amount of active bits in cmap */ - unsigned short mincol; /**< smallest color in colormap */ - unsigned short maxcol; /**< Largest color in colormap */ - int type; /**< 0=abgr, 1=bitplanes */ - int ftype; /**< File type we are going to save as */ - unsigned int *cmap; /**< Color map data. */ unsigned int *rect; /**< pixel values stored here */ - unsigned int **planes; /**< bitplanes */ + unsigned int *crect; /**< color corrected pixel values stored here */ int flags; /**< Controls which components should exist. */ int mall; /**< what is malloced internal, and can be freed */ - short xorig, yorig; /**< Cordinates of first pixel of an image used in some formats (example: targa) */ - char name[1023]; /**< The file name assocated with this image */ - char namenull; /**< Unused don't want to remove it thought messes things up */ - int userflags; /**< Used to set imbuf to Dirty and other stuff */ int *zbuf; /**< z buffer data, original zbuffer */ float *zbuf_float; /**< z buffer data, camera coordinates */ void *userdata; /**< temporary storage, only used by baking at the moment */ @@ -159,34 +55,43 @@ typedef struct ImBuf { unsigned int encodedsize; /**< Size of data written to encodedbuffer */ unsigned int encodedbuffersize; /**< Size of encodedbuffer */ - float *rect_float; /**< floating point Rect equivilant */ + float *rect_float; /**< floating point Rect equivalent + Linear RGB color space - may need gamma correction to + sRGB when generating 8bit representations */ int channels; /**< amount of channels in rect_float (0 = 4 channel default) */ float dither; /**< random dither value, for conversion from float -> byte rect */ - - struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */ - struct ImgInfo * img_info; - int refcounter; /**< Refcounter for multiple users */ - int index; /**< reference index for ImBuf lists */ - + short profile; /** color space/profile preset that the byte rect buffer represents */ + char profile_filename[256]; /** to be implemented properly, specific filename for custom profiles */ + + /* mipmapping */ struct ImBuf *mipmap[IB_MIPMAP_LEVELS]; /**< MipMap levels, a series of halved images */ + int miplevels; + + /* externally used flags */ + int index; /* reference index for ImBuf lists */ + int userflags; /* used to set imbuf to dirty and other stuff */ + struct ImMetaData *metadata; + + /* file information */ + int ftype; /* file type we are going to save as */ + char name[IB_FILENAME_SIZE]; /* filename associated with this image */ + + /* memory cache limiter */ + struct MEM_CacheLimiterHandle_s *c_handle; /* handle for cache limiter */ + int refcounter; /* reference counter for multiple users */ } ImBuf; LIBIMPORT struct ImBuf *allocImBuf(short,short,uchar,uint,uchar); LIBIMPORT struct ImBuf *dupImBuf(struct ImBuf *); LIBIMPORT void freeImBuf(struct ImBuf*); -LIBIMPORT short converttocmap(struct ImBuf* ibuf); - LIBIMPORT short saveiff(struct ImBuf *,char *,int); -LIBIMPORT struct ImBuf *loadiffmem(int *,int); LIBIMPORT struct ImBuf *loadifffile(int,int); LIBIMPORT struct ImBuf *loadiffname(char *,int); LIBIMPORT struct ImBuf *testiffname(char *,int); LIBIMPORT struct ImBuf *onehalf(struct ImBuf *); -LIBIMPORT struct ImBuf *onethird(struct ImBuf *); -LIBIMPORT struct ImBuf *halflace(struct ImBuf *); LIBIMPORT struct ImBuf *half_x(struct ImBuf *); LIBIMPORT struct ImBuf *half_y(struct ImBuf *); LIBIMPORT struct ImBuf *double_x(struct ImBuf *); @@ -196,17 +101,11 @@ LIBIMPORT struct ImBuf *double_fast_y(struct ImBuf *); LIBIMPORT int ispic(char *); -LIBIMPORT void dit2(struct ImBuf *, short, short); -LIBIMPORT void dit0(struct ImBuf *, short, short); - LIBIMPORT struct ImBuf *scaleImBuf(struct ImBuf *, short, short); LIBIMPORT struct ImBuf *scalefastImBuf(struct ImBuf *, short, short); -LIBIMPORT struct ImBuf *scalefieldImBuf(struct ImBuf *, short, short); -LIBIMPORT struct ImBuf *scalefastfieldImBuf(struct ImBuf *, short, short); LIBIMPORT void de_interlace(struct ImBuf *ib); LIBIMPORT void interlace(struct ImBuf *ib); -LIBIMPORT void gamwarp(struct ImBuf *ibuf, double gamma); LIBIMPORT void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height); diff --git a/source/blender/blenpluginapi/intern/pluginapi.c b/source/blender/blenpluginapi/intern/pluginapi.c index 28bc06eaea0..9e739f7927d 100644 --- a/source/blender/blenpluginapi/intern/pluginapi.c +++ b/source/blender/blenpluginapi/intern/pluginapi.c @@ -118,11 +118,6 @@ LIBEXPORT void freeImBuf(struct ImBuf* ib) IMB_freeImBuf(ib); } -LIBEXPORT short converttocmap(struct ImBuf* ibuf) -{ - return IMB_converttocmap(ibuf); -} - LIBEXPORT short saveiff(struct ImBuf *ib, char *c, int i) @@ -130,11 +125,6 @@ LIBEXPORT short saveiff(struct ImBuf *ib, return IMB_saveiff(ib, c, i); } -LIBEXPORT struct ImBuf *loadiffmem(int *mem,int flags) -{ - return IMB_loadiffmem(mem, flags); -} - LIBEXPORT struct ImBuf *loadifffile(int a, int b) { @@ -158,16 +148,6 @@ LIBEXPORT struct ImBuf *onehalf(struct ImBuf *ib) return IMB_onehalf(ib); } -LIBEXPORT struct ImBuf *onethird(struct ImBuf *ib) -{ - return IMB_onethird(ib); -} - -LIBEXPORT struct ImBuf *halflace(struct ImBuf *ib) -{ - return IMB_halflace(ib); -} - LIBEXPORT struct ImBuf *half_x(struct ImBuf *ib) { return IMB_half_x(ib); @@ -203,20 +183,6 @@ LIBEXPORT int ispic(char * name) return IMB_ispic(name); } -LIBEXPORT void dit2(struct ImBuf *ib, - short a, - short b) -{ - IMB_dit2(ib, a, b); -} - -LIBEXPORT void dit0(struct ImBuf *ib, - short a, - short b) -{ - IMB_dit0(ib, a, b); -} - /* still the same name */ /* void (*ditherfunc)(struct ImBuf *, short, short){} */ @@ -234,21 +200,6 @@ LIBEXPORT struct ImBuf *scalefastImBuf(struct ImBuf *ib, return IMB_scalefastImBuf(ib, x, y); } - -LIBEXPORT struct ImBuf *scalefieldImBuf(struct ImBuf *ib, - short x, - short y) -{ - return IMB_scalefieldImBuf(ib, x, y); -} - -LIBEXPORT struct ImBuf *scalefastfieldImBuf(struct ImBuf *ib, - short x, - short y) -{ - return IMB_scalefastfieldImBuf(ib, x, y); -} - /* Extra ones that some NaN (read Ton) plugins use, * even though they aren't in the header */ @@ -258,11 +209,6 @@ LIBEXPORT void interlace(struct ImBuf *ibuf) IMB_interlace(ibuf); } -LIBEXPORT void gamwarp(struct ImBuf *ibuf, double gamma) -{ - IMB_gamwarp(ibuf,gamma); -} - LIBEXPORT void de_interlace(struct ImBuf *ib) { IMB_de_interlace(ib); @@ -334,15 +280,11 @@ int pluginapi_force_ref(void) GET_INT_FROM_POINTER( allocImBuf ) + GET_INT_FROM_POINTER( dupImBuf ) + GET_INT_FROM_POINTER( freeImBuf ) + - GET_INT_FROM_POINTER( converttocmap ) + GET_INT_FROM_POINTER( saveiff ) + - GET_INT_FROM_POINTER( loadiffmem ) + GET_INT_FROM_POINTER( loadifffile ) + GET_INT_FROM_POINTER( loadiffname ) + GET_INT_FROM_POINTER( testiffname ) + GET_INT_FROM_POINTER( onehalf ) + - GET_INT_FROM_POINTER( onethird ) + - GET_INT_FROM_POINTER( halflace ) + GET_INT_FROM_POINTER( half_x ) + GET_INT_FROM_POINTER( half_y ) + GET_INT_FROM_POINTER( double_x ) + @@ -350,17 +292,12 @@ int pluginapi_force_ref(void) GET_INT_FROM_POINTER( double_fast_x ) + GET_INT_FROM_POINTER( double_fast_y ) + GET_INT_FROM_POINTER( ispic ) + - GET_INT_FROM_POINTER( dit2 ) + - GET_INT_FROM_POINTER( dit0 ) + GET_INT_FROM_POINTER( scaleImBuf ) + GET_INT_FROM_POINTER( scalefastImBuf ) + - GET_INT_FROM_POINTER( scalefieldImBuf ) + - GET_INT_FROM_POINTER( scalefastfieldImBuf ) + GET_INT_FROM_POINTER( hnoise ) + GET_INT_FROM_POINTER( hnoisep ) + GET_INT_FROM_POINTER( turbulence ) + GET_INT_FROM_POINTER( turbulence1 ) + GET_INT_FROM_POINTER( de_interlace ) + - GET_INT_FROM_POINTER( interlace ) + - GET_INT_FROM_POINTER( gamwarp ); + GET_INT_FROM_POINTER( interlace ); } diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt index b20ac35b575..2118af0a7aa 100644 --- a/source/blender/bmesh/CMakeLists.txt +++ b/source/blender/bmesh/CMakeLists.txt @@ -2,7 +2,7 @@ FILE(GLOB SRC intern/*.c operators/*.c) SET(INC . intern - ../makesdna ../blenkernel ../blenlib ../../../intern/guardedalloc ../editors/include ../editors/mesh) + ../makesdna ../makesrna ../blenkernel ../blenlib ../../../intern/guardedalloc ../editors/include ../editors/mesh) BLENDERLIB(bf_bmesh "${SRC}" "${INC}") diff --git a/source/blender/bmesh/bmesh_operator_api.h b/source/blender/bmesh/bmesh_operator_api.h index 2bf091a3cf7..0b5075d4e66 100644 --- a/source/blender/bmesh/bmesh_operator_api.h +++ b/source/blender/bmesh/bmesh_operator_api.h @@ -392,7 +392,7 @@ BM_INLINE void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, char *slotname, if (!slot->data.ghash) { slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, - BLI_ghashutil_ptrcmp); + BLI_ghashutil_ptrcmp, "bmesh op"); } BLI_ghash_insert(slot->data.ghash, element, mapping); @@ -461,4 +461,4 @@ BM_INLINE void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, char *slotname, } #endif -#endif /* _BMESH_OPERATOR_H */ \ No newline at end of file +#endif /* _BMESH_OPERATOR_H */ diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c index 83ed4e87a5a..9204052b81d 100644 --- a/source/blender/bmesh/intern/bmesh_operators.c +++ b/source/blender/bmesh/intern/bmesh_operators.c @@ -110,7 +110,7 @@ void BMO_Init_Op(BMOperator *op, char *opname) op->exec = opdefines[opcode]->exec; /*memarena, used for operator's slot buffers*/ - op->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + op->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "bmesh operator"); BLI_memarena_use_calloc (op->arena); } @@ -216,7 +216,7 @@ void BMO_CopySlot(BMOperator *source_op, BMOperator *dest_op, char *src, char *d if (!dest_slot->data.ghash) { dest_slot->data.ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, - BLI_ghashutil_ptrcmp); + BLI_ghashutil_ptrcmp, "bmesh operator 2"); } BLI_ghashIterator_init(&it, source_slot->data.ghash); diff --git a/source/blender/bmesh/intern/bmesh_walkers.c b/source/blender/bmesh/intern/bmesh_walkers.c index f57ebddb649..5e824feb53a 100644 --- a/source/blender/bmesh/intern/bmesh_walkers.c +++ b/source/blender/bmesh/intern/bmesh_walkers.c @@ -164,7 +164,7 @@ void BMW_Init(BMWalker *walker, BMesh *bm, int type, int searchmask, int flag) walker->flag = flag; walker->bm = bm; walker->restrictflag = searchmask; - walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 1"); switch(type){ case BMW_SHELL: @@ -622,7 +622,7 @@ static void loopWalker_begin(BMWalker *walker, void *data){ lwalk->startv = lwalk->lastv; BLI_ghash_free(walker->visithash, NULL, NULL); - walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 2"); BLI_ghash_insert(walker->visithash, owalk.cur, NULL); } @@ -720,7 +720,7 @@ static void faceloopWalker_begin(BMWalker *walker, void *data) lwalk->nocalc = 0; BLI_ghash_free(walker->visithash, NULL, NULL); - walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 3"); BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL); } @@ -799,7 +799,7 @@ static void edgeringWalker_begin(BMWalker *walker, void *data) lwalk->l = lwalk->l->radial_next; BLI_ghash_free(walker->visithash, NULL, NULL); - walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 4"); BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL); } diff --git a/source/blender/bmesh/operators/bmesh_dupeops.c b/source/blender/bmesh/operators/bmesh_dupeops.c index 9abdc763c98..b67ff66097d 100644 --- a/source/blender/bmesh/operators/bmesh_dupeops.c +++ b/source/blender/bmesh/operators/bmesh_dupeops.c @@ -169,8 +169,8 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target) int maxlength = 0; /*initialize pointer hashes*/ - vhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + vhash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh dupeops v"); + ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh dupeops e"); /*initialize edge pointer array*/ for(f = BMIter_New(&faces, source, BM_FACES_OF_MESH, source); f; f = BMIter_Step(&faces)){ @@ -569,4 +569,4 @@ static void delete_context(BMesh *bm, int type){ BM_remove_tagged_edges(bm, DEL_INPUT); BM_remove_tagged_verts(bm, DEL_INPUT); } -} \ No newline at end of file +} diff --git a/source/blender/bmesh/operators/createops.c b/source/blender/bmesh/operators/createops.c index 61e0bcc3085..df98229998a 100644 --- a/source/blender/bmesh/operators/createops.c +++ b/source/blender/bmesh/operators/createops.c @@ -130,7 +130,7 @@ EPath *edge_find_shortest_path(BMesh *bm, BMEdge *edge, EdgeData *edata, PathBas { BMIter iter; BMEdge *e; - GHash *gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + GHash *gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "createops find shortest path"); BMVert *v1, *v2; BMVert **verts = NULL; BLI_array_declare(verts); diff --git a/source/blender/bmesh/operators/subdivideop.c b/source/blender/bmesh/operators/subdivideop.c index e273a03b17a..ca2f5208589 100644 --- a/source/blender/bmesh/operators/subdivideop.c +++ b/source/blender/bmesh/operators/subdivideop.c @@ -876,9 +876,11 @@ void esubdivide_exec(BMesh *bmesh, BMOperator *op) BLI_array_empty(verts); pat = facedata[i].pat; - if (!pat && facedata[i].totedgesel == 2) { /*ok, no pattern. we still may be able to do something.*/ + + if (!pat && facedata[i].totedgesel == 2) { int vlen; + /*ok, no pattern. we still may be able to do something.*/ BLI_array_empty(loops); BLI_array_empty(splits); diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 3e1898a64d9..7a994d6b418 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed. + * + * ***** END GPL LICENSE BLOCK ***** + */ #include #include #include @@ -359,6 +382,8 @@ public: std::vector nor; std::vector norind; + bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL); + create_normals(nor, norind, me); // openMesh(geoId, geoName, meshId) @@ -370,12 +395,15 @@ public: // writes for normal coords createNormalsSource(geom_id, me, nor); - int has_uvs = CustomData_has_layer(&me->fdata, CD_MTFACE); + bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE); // writes for uv coords if mesh has uv coords - if (has_uvs) { - createTexcoordsSource(geom_id, (Mesh*)ob->data); - } + if (has_uvs) + createTexcoordsSource(geom_id, me); + + if (has_color) + createVertexColorSource(geom_id, me); + // COLLADASW::Vertices verts(mSW); verts.setId(getIdBySemantics(geom_id, COLLADASW::VERTEX)); @@ -389,11 +417,11 @@ public: for(int a = 0; a < ob->totcol; a++) { // account for NULL materials, this should not normally happen? Material *ma = give_current_material(ob, a + 1); - createPolylist(ma != NULL, a, has_uvs, ob, geom_id, norind); + createPolylist(ma != NULL, a, has_uvs, has_color, ob, geom_id, norind); } } else { - createPolylist(false, 0, has_uvs, ob, geom_id, norind); + createPolylist(false, 0, has_uvs, has_color, ob, geom_id, norind); } closeMesh(); @@ -408,14 +436,11 @@ public: void createPolylist(bool has_material, int material_index, bool has_uvs, + bool has_color, Object *ob, std::string& geom_id, std::vector& norind) { -#if 0 - MFace *mfaces = dm->getFaceArray(dm); - int totfaces = dm->getNumFaces(dm); -#endif Mesh *me = (Mesh*)ob->data; MFace *mfaces = me->mface; int totfaces = me->totface; @@ -479,6 +504,11 @@ public: ); til.push_back(input3); } + + if (has_color) { + COLLADASW::Input input4(COLLADASW::COLOR, getUrlBySemantics(geom_id, COLLADASW::COLOR), has_uvs ? 3 : 2); + til.push_back(input4); + } // sets polylist.setVCountList(vcount_list); @@ -501,6 +531,9 @@ public: if (has_uvs) polylist.appendValues(texindex + j); + + if (has_color) + polylist.appendValues(texindex + j); } } @@ -545,6 +578,42 @@ public: } + void createVertexColorSource(std::string geom_id, Mesh *me) + { + if (!CustomData_has_layer(&me->fdata, CD_MCOL)) + return; + + MFace *f; + int totcolor = 0, i, j; + + for (i = 0, f = me->mface; i < me->totface; i++, f++) + totcolor += f->v4 ? 4 : 3; + + COLLADASW::FloatSourceF source(mSW); + source.setId(getIdBySemantics(geom_id, COLLADASW::COLOR)); + source.setArrayId(getIdBySemantics(geom_id, COLLADASW::COLOR) + ARRAY_ID_SUFFIX); + source.setAccessorCount(totcolor); + source.setAccessorStride(3); + + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + param.push_back("R"); + param.push_back("G"); + param.push_back("B"); + + source.prepareToAppendValues(); + + int index = CustomData_get_active_layer_index(&me->fdata, CD_MCOL); + + MCol *mcol = (MCol*)me->fdata.layers[index].data; + MCol *c = mcol; + + for (i = 0, f = me->mface; i < me->totface; i++, c += 4, f++) + for (j = 0; j < (f->v4 ? 4 : 3); j++) + source.appendValues(c[j].b / 255.0f, c[j].g / 255.0f, c[j].r / 255.0f); + + source.finish(); + } + std::string makeTexcoordSourceId(std::string& geom_id, int layer_index) { char suffix[20]; @@ -592,8 +661,8 @@ public: source.setAccessorCount(totuv); source.setAccessorStride(2); COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.push_back("X"); - param.push_back("Y"); + param.push_back("S"); + param.push_back("T"); source.prepareToAppendValues(); @@ -862,7 +931,7 @@ public: Object *ob_arm = get_assigned_armature(ob); bArmature *arm = (bArmature*)ob_arm->data; - const std::string& controller_id = get_controller_id(ob_arm); + const std::string& controller_id = get_controller_id(ob_arm, ob); COLLADASW::InstanceController ins(mSW); ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id)); @@ -1005,9 +1074,9 @@ private: TransformWriter::add_node_transform(node, mat, NULL); } - std::string get_controller_id(Object *ob_arm) + std::string get_controller_id(Object *ob_arm, Object *ob) { - return translate_id(id_name(ob_arm)) + SKIN_CONTROLLER_ID_SUFFIX; + return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + SKIN_CONTROLLER_ID_SUFFIX; } // ob should be of type OB_MESH @@ -1041,7 +1110,7 @@ private: if (!me->dvert) return; std::string controller_name = id_name(ob_arm); - std::string controller_id = get_controller_id(ob_arm); + std::string controller_id = get_controller_id(ob_arm, ob); openSkin(controller_id, controller_name, COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob))); @@ -1433,7 +1502,7 @@ public: char src[FILE_MAX]; char dir[FILE_MAX]; - BLI_split_dirfile_basic(mfilename, dir, NULL); + BLI_split_dirfile(mfilename, dir, NULL); BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.sce, image->name, dir); @@ -1441,7 +1510,7 @@ public: // make absolute source path BLI_strncpy(src, image->name, sizeof(src)); - BLI_convertstringcode(src, G.sce); + BLI_path_abs(src, G.sce); // make dest directory if it doesn't exist BLI_make_existing_file(abs); @@ -1509,18 +1578,27 @@ public: else { ep.setIndexOfRefraction(1.0f); } + + COLLADASW::ColorOrTexture cot; + // transparency - ep.setTransparency(ma->alpha); - // emission - COLLADASW::ColorOrTexture cot = getcol(0.0f, 0.0f, 0.0f, 1.0f); - ep.setEmission(cot); + // Tod: because we are in A_ONE mode transparency is calculated like this: + ep.setTransparency(1.0f); + cot = getcol(0.0f, 0.0f, 0.0f, ma->alpha); ep.setTransparent(cot); + + // emission + cot=getcol(ma->emit, ma->emit, ma->emit, 1.0f); + ep.setEmission(cot); + // diffuse cot = getcol(ma->r, ma->g, ma->b, 1.0f); ep.setDiffuse(cot); + // ambient cot = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f); ep.setAmbient(cot); + // reflective, reflectivity if (ma->mode & MA_RAYMIRROR) { cot = getcol(ma->mirr, ma->mirg, ma->mirb, 1.0f); @@ -1528,15 +1606,16 @@ public: ep.setReflectivity(ma->ray_mirror); } else { - cot = getcol(0.0f, 0.0f, 0.0f, 1.0f); + cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f); ep.setReflective(cot); - ep.setReflectivity(0.0f); + ep.setReflectivity(ma->spec); } + // specular if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) { cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f); ep.setSpecular(cot); - } + } // XXX make this more readable if possible @@ -1640,12 +1719,28 @@ public: // most widespread de-facto standard. texture.setProfileName("FCOLLADA"); texture.setChildElementName("bump"); +#ifdef WIN32 // currently, Windows builds are using revision 746 of OpenCollada while Linux and Mac are using an older revision 721 + ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture)); +#else ep.setExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture)); +#endif } } // performs the actual writing ep.addProfileElements(); + bool twoSided = false; + if (ob->type == OB_MESH && ob->data) { + Mesh *me = (Mesh*)ob->data; + if (me->flag & ME_TWOSIDED) + twoSided = true; + } + if (twoSided) + ep.addExtraTechniqueParameter("GOOGLEEARTH", "double_sided", 1); + ep.addExtraTechniques(mSW); + ep.closeProfile(); + if (twoSided) + mSW->appendTextBlock("1"); closeEffect(); } @@ -1902,7 +1997,7 @@ protected: addSampler(sampler); std::string target = translate_id(ob_name) - + "/" + get_transform_sid(fcu->rna_path, -1, axis_name); + + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true); addChannel(COLLADABU::URI(empty, sampler_id), target); closeAnimation(); @@ -2050,7 +2145,7 @@ protected: if (axis > -1) axis_name = axis_names[axis]; - std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name); + std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false); BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str()); @@ -2321,24 +2416,47 @@ protected: return source_id; } - std::string get_transform_sid(char *rna_path, int tm_type, const char *axis_name) + // for rotation, axis name is always appended and the value of append_axis is ignored + std::string get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) { + std::string tm_name; + + // when given rna_path, determine tm_type from it if (rna_path) { char *name = extract_transform_name(rna_path); if (strstr(name, "rotation")) - return std::string("rotation") + std::string(axis_name) + ".ANGLE"; - else if (!strcmp(name, "location") || !strcmp(name, "scale")) - return std::string(name); - } - else { - if (tm_type == 0) - return std::string("rotation") + std::string(axis_name) + ".ANGLE"; + tm_type = 0; + else if (!strcmp(name, "scale")) + tm_type = 1; + else if (!strcmp(name, "location")) + tm_type = 2; else - return tm_type == 1 ? "scale" : "location"; + tm_type = -1; } - return NULL; + switch (tm_type) { + case 0: + return std::string("rotation") + std::string(axis_name) + ".ANGLE"; + case 1: + tm_name = "scale"; + break; + case 2: + tm_name = "location"; + break; + default: + tm_name = ""; + break; + } + + if (tm_name.size()) { + if (append_axis) + return tm_name + std::string(".") + std::string(axis_name); + else + return tm_name; + } + + return std::string(""); } char *extract_transform_name(char *rna_path) @@ -2364,6 +2482,9 @@ protected: } } } + + // keep the keys in ascending order + std::sort(fra.begin(), fra.end()); } void find_rotation_frames(Object *ob, std::vector &fra, const char *prefix, int rotmode) diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h index 1a0c292a3dd..bb6d400fdf1 100644 --- a/source/blender/collada/DocumentExporter.h +++ b/source/blender/collada/DocumentExporter.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ struct Scene; class DocumentExporter diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 33c9a061cda..a415b90ff08 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory. + * + * ***** END GPL LICENSE BLOCK ***** + */ // TODO: // * name imported objects // * import object rotation as euler @@ -174,6 +197,59 @@ static float get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigne return array.getDoubleValues()->getData()[index]; } +// copied from /editors/object/object_relations.c +static int test_parent_loop(Object *par, Object *ob) +{ + /* test if 'ob' is a parent somewhere in par's parents */ + + if(par == NULL) return 0; + if(ob == par) return 1; + + return test_parent_loop(par->parent, ob); +} + +// a shortened version of parent_set_exec() +// if is_parent_space is true then ob->obmat will be multiplied by par->obmat before parenting +static int set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true) +{ + if (!par || test_parent_loop(par, ob)) + return false; + + Object workob; + Scene *sce = CTX_data_scene(C); + + ob->parent = par; + ob->partype = PAROBJECT; + + ob->parsubstr[0] = 0; + + if (is_parent_space) { + // calc par->obmat + where_is_object(sce, par); + + // move child obmat into world space + float mat[4][4]; + mul_m4_m4m4(mat, ob->obmat, par->obmat); + copy_m4_m4(ob->obmat, mat); + } + + // apply child obmat (i.e. decompose it into rot/loc/size) + object_apply_mat4(ob, ob->obmat); + + // compute parentinv + what_does_parent(sce, ob, &workob); + invert_m4_m4(ob->parentinv, workob.obmat); + + ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA; + par->recalc |= OB_RECALC_OB; + + DAG_scene_sort(sce); + DAG_ids_flush_update(0); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); + + return true; +} + typedef std::map > TexIndexTextureArrayMap; class TransformReader : public TransformBase @@ -273,6 +349,23 @@ public: { unit_converter->dae_matrix_to_mat4(m, ((COLLADAFW::Matrix*)tm)->getMatrix()); } + + void dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3]) + { + dae_vector3_to_v3(((COLLADAFW::Translate*)tm)->getTranslation(), v); + } + + void dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3]) + { + dae_vector3_to_v3(((COLLADAFW::Scale*)tm)->getScale(), v); + } + + void dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3]) + { + v[0] = v3.x; + v[1] = v3.y; + v[2] = v3.z; + } }; // only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid @@ -324,8 +417,7 @@ private: std::map geom_uid_by_controller_uid; std::map joint_by_uid; // contains all joints std::vector root_joints; - - std::vector armature_objects; + std::map joint_parent_map; MeshImporterBase *mesh_importer; AnimationImporterBase *anim_importer; @@ -358,6 +450,7 @@ private: Object *ob_arm; COLLADAFW::UniqueId controller_uid; + Object *parent; public: @@ -367,7 +460,8 @@ private: joint_data(skin.joint_data), unit_converter(skin.unit_converter), ob_arm(skin.ob_arm), - controller_uid(skin.controller_uid) + controller_uid(skin.controller_uid), + parent(skin.parent) { copy_m4_m4(bind_shape_matrix, (float (*)[4])skin.bind_shape_matrix); @@ -376,7 +470,7 @@ private: transfer_int_array_data_const(skin.joint_indices, joint_indices); } - SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(NULL) {} + SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(NULL), parent(NULL) {} // nobody owns the data after this, so it should be freed manually with releaseMemory template @@ -433,13 +527,11 @@ private: joint_data.push_back(jd); } - // called from write_controller - Object *create_armature(const COLLADAFW::SkinController* co, Scene *scene) + void set_controller(const COLLADAFW::SkinController* co) { - ob_arm = add_object(scene, OB_ARMATURE); - controller_uid = co->getUniqueId(); + // fill in joint UIDs const COLLADAFW::UniqueIdArray& joint_uids = co->getJoints(); for (unsigned int i = 0; i < joint_uids.getCount(); i++) { joint_data[i].joint_uid = joint_uids[i]; @@ -451,7 +543,21 @@ private: // now we'll be able to get inv bind matrix from joint id // joint_id_to_joint_index_map[joint_ids[i]] = i; } + } + // called from write_controller + Object *create_armature(Scene *scene) + { + ob_arm = add_object(scene, OB_ARMATURE); + return ob_arm; + } + + Object* set_armature(Object *ob_arm) + { + if (this->ob_arm) + return this->ob_arm; + + this->ob_arm = ob_arm; return ob_arm; } @@ -479,10 +585,12 @@ private: return controller_uid; } + // check if this skin controller references a joint or any descendant of it + // // some nodes may not be referenced by SkinController, // in this case to determine if the node belongs to this armature, // we need to search down the tree - bool uses_joint(COLLADAFW::Node *node) + bool uses_joint_or_descendant(COLLADAFW::Node *node) { const COLLADAFW::UniqueId& uid = node->getUniqueId(); std::vector::iterator it; @@ -493,7 +601,7 @@ private: COLLADAFW::NodePointerArray& children = node->getChildNodes(); for (unsigned int i = 0; i < children.getCount(); i++) { - if (this->uses_joint(children[i])) + if (uses_joint_or_descendant(children[i])) return true; } @@ -503,14 +611,17 @@ private: void link_armature(bContext *C, Object *ob, std::map& joint_by_uid, TransformReader *tm) { - Object workob; Scene *scene = CTX_data_scene(C); ModifierData *md = ED_object_modifier_add(NULL, scene, ob, NULL, eModifierType_Armature); ((ArmatureModifierData *)md)->object = ob_arm; - tm->decompose(bind_shape_matrix, ob->loc, ob->rot, NULL, ob->size); - + copy_m4_m4(ob->obmat, bind_shape_matrix); + object_apply_mat4(ob, ob->obmat); +#if 1 + ::set_parent(ob, ob_arm, C); +#else + Object workob; ob->parent = ob_arm; ob->partype = PAROBJECT; @@ -519,6 +630,11 @@ private: ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA; + DAG_scene_sort(scene); + DAG_ids_flush_update(0); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); +#endif + ((bArmature*)ob_arm->data)->deformflag = ARM_DEF_VGROUP; // create all vertex groups @@ -560,16 +676,55 @@ private: } } } - - DAG_scene_sort(scene); - DAG_ids_flush_update(0); - WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); } bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node) { return get_pose_channel(ob_arm->pose, get_joint_name(node)); } + + void set_parent(Object *_parent) + { + parent = _parent; + } + + Object* get_parent() + { + return parent; + } + + void find_root_joints(const std::vector &root_joints, + std::map& joint_by_uid, + std::vector& result) + { + std::vector::const_iterator it; + for (it = root_joints.begin(); it != root_joints.end(); it++) { + COLLADAFW::Node *root = *it; + std::vector::iterator ji; + for (ji = joint_data.begin(); ji != joint_data.end(); ji++) { + COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid]; + if (find_node_in_tree(joint, root)) { + if (std::find(result.begin(), result.end(), root) == result.end()) + result.push_back(root); + } + } + } + } + + bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root) + { + if (node == tree_root) + return true; + + COLLADAFW::NodePointerArray& children = tree_root->getChildNodes(); + for (unsigned int i = 0; i < children.getCount(); i++) { + if (find_node_in_tree(node, children[i])) + return true; + } + + return false; + } + }; std::map skin_by_data_uid; // data UID = skin controller data UID @@ -753,7 +908,7 @@ private: for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) { SkinInfo& skin = sit->second; - if (skin.uses_joint(joint)) { + if (skin.uses_joint_or_descendant(joint)) { bPoseChannel *pchan = skin.get_pose_channel_from_node(joint); if (pchan) { @@ -821,7 +976,70 @@ private: // - exit edit mode // - set a sphere shape to leaf bones - Object *ob_arm = skin.get_armature(); + Object *ob_arm = NULL; + + /* + * find if there's another skin sharing at least one bone with this skin + * if so, use that skin's armature + */ + + /* + Pseudocode: + + find_node_in_tree(node, root_joint) + + skin::find_root_joints(root_joints): + std::vector root_joints; + for each root in root_joints: + for each joint in joints: + if find_node_in_tree(joint, root): + if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end()) + root_joints.push_back(root); + + for (each skin B with armature) { + find all root joints for skin B + + for each joint X in skin A: + for each root joint R in skin B: + if (find_node_in_tree(X, R)) { + shared = 1; + goto endloop; + } + } + + endloop: + */ + + SkinInfo *a = &skin; + Object *shared = NULL; + std::vector skin_root_joints; + + std::map::iterator it; + for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { + SkinInfo *b = &it->second; + if (b == a || b->get_armature() == NULL) + continue; + + skin_root_joints.clear(); + + b->find_root_joints(root_joints, joint_by_uid, skin_root_joints); + + std::vector::iterator ri; + for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) { + if (a->uses_joint_or_descendant(*ri)) { + shared = b->get_armature(); + break; + } + } + + if (shared != NULL) + break; + } + + if (shared) + ob_arm = skin.set_armature(shared); + else + ob_arm = skin.create_armature(scene); // enter armature edit mode ED_armature_to_edit(ob_arm); @@ -833,12 +1051,23 @@ private: // min_angle = 360.0f; // minimum angle between bone head-tail and a row of bone matrix // create bones + /* + TODO: + check if bones have already been created for a given joint + */ + + std::vector::iterator ri; + for (ri = root_joints.begin(); ri != root_joints.end(); ri++) { + // for shared armature check if bone tree is already created + if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), *ri) != skin_root_joints.end()) + continue; - std::vector::iterator it; - for (it = root_joints.begin(); it != root_joints.end(); it++) { // since root_joints may contain joints for multiple controllers, we need to filter - if (skin.uses_joint(*it)) { - create_bone(skin, *it, NULL, (*it)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data); + if (skin.uses_joint_or_descendant(*ri)) { + create_bone(skin, *ri, NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data); + + if (joint_parent_map.find((*ri)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent()) + skin.set_parent(joint_parent_map[(*ri)->getUniqueId()]); } } @@ -872,10 +1101,15 @@ public: // root - if this joint is the top joint in hierarchy, if a joint // is a child of a node (not joint), root should be true since // this is where we build armature bones from - void add_joint(COLLADAFW::Node *node, bool root) + void add_joint(COLLADAFW::Node *node, bool root, Object *parent) { joint_by_uid[node->getUniqueId()] = node; - if (root) root_joints.push_back(node); + if (root) { + root_joints.push_back(node); + + if (parent) + joint_parent_map[node->getUniqueId()] = parent; + } } #if 0 @@ -904,14 +1138,17 @@ public: create_armature_bones(skin); - // link armature with an object + // link armature with a mesh object Object *ob = mesh_importer->get_object_by_geom_uid(*get_geometry_uid(skin.get_controller_uid())); - if (ob) { + if (ob) skin.link_armature(C, ob, joint_by_uid, this); - } - else { + else fprintf(stderr, "Cannot find object to link armature with.\n"); - } + + // set armature parent if any + Object *par = skin.get_parent(); + if (par) + set_parent(skin.get_armature(), par, C, false); // free memory stolen from SkinControllerData skin.free(); @@ -972,10 +1209,8 @@ public: const COLLADAFW::UniqueId& skin_id = controller->getUniqueId(); if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) { - COLLADAFW::SkinController *co = (COLLADAFW::SkinController*)controller; - - // to find geom id by controller id + // to be able to find geom id by controller id geom_uid_by_controller_uid[skin_id] = co->getSource(); const COLLADAFW::UniqueId& data_uid = co->getSkinControllerData(); @@ -984,9 +1219,7 @@ public: return true; } - Object *ob_arm = skin_by_data_uid[data_uid].create_armature(co, scene); - - armature_objects.push_back(ob_arm); + skin_by_data_uid[data_uid].set_controller(co); } // morph controller else { @@ -1011,7 +1244,7 @@ public: for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) { SkinInfo& skin = it->second; - if (skin.uses_joint(node)) + if (skin.uses_joint_or_descendant(node)) return skin.get_armature(); } @@ -1023,19 +1256,6 @@ public: BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", get_joint_name(node)); } -#if 0 - void fix_animation() - { - /* Change Euler rotation to Quaternion for bone animation */ - std::vector::iterator it; - for (it = armature_objects.begin(); it != armature_objects.end(); it++) { - Object *ob = *it; - if (!ob || !ob->adt || !ob->adt->action) continue; - anim_importer->change_eul_to_quat(ob, ob->adt->action); - } - } -#endif - // gives a world-space mat bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint) { @@ -1108,7 +1328,7 @@ private: } #endif - void getUV(int uv_set_index, int uv_index[2], float *uv) + void getUV(int uv_index[2], float *uv) { switch(mVData->getType()) { case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: @@ -1159,7 +1379,7 @@ private: } #endif - void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, int uv_set_index, + void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, unsigned int *tris_indices) { int uv_indices[4][2]; @@ -1174,12 +1394,12 @@ private: uv_indices[i][1] = uv_index * 2 + 1; } - uvs.getUV(uv_set_index, uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_set_index, uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_set_index, uv_indices[2], mtface->uv[2]); + uvs.getUV(uv_indices[0], mtface->uv[0]); + uvs.getUV(uv_indices[1], mtface->uv[1]); + uvs.getUV(uv_indices[2], mtface->uv[2]); } - void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, int uv_set_index, + void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, int index, bool quad) { int uv_indices[4][2]; @@ -1194,11 +1414,11 @@ private: uv_indices[i][1] = uv_index * 2 + 1; } - uvs.getUV(uv_set_index, uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_set_index, uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_set_index, uv_indices[2], mtface->uv[2]); + uvs.getUV(uv_indices[0], mtface->uv[0]); + uvs.getUV(uv_indices[1], mtface->uv[1]); + uvs.getUV(uv_indices[2], mtface->uv[2]); - if (quad) uvs.getUV(uv_set_index, uv_indices[3], mtface->uv[3]); + if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]); #ifdef COLLADA_DEBUG /*if (quad) { @@ -1323,7 +1543,7 @@ private: vert += 3; } - filldisplist(&dispbase, &dispbase); + filldisplist(&dispbase, &dispbase, 0); int tottri = 0; dl= (DispList*)dispbase.first; @@ -1398,6 +1618,13 @@ private: // allocate UV layers unsigned int totuvset = mesh->getUVCoords().getInputInfosArray().getCount(); + // for (i = 0; i < totuvset; i++) { + // if (mesh->getUVCoords().getLength(i) == 0) { + // totuvset = 0; + // break; + // } + // } + for (i = 0; i < totuvset; i++) { CustomData_add_layer(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface); //this->set_layername_map[i] = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i); @@ -1454,11 +1681,23 @@ private: set_face_indices(mface, indices, false); indices += 3; +#if 0 for (k = 0; k < totuvset; k++) { - // get mtface by face index and uv set index - MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k); - set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false); + if (!index_list_array.empty() && index_list_array[k]) { + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k); + set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false); + } } +#else + for (k = 0; k < index_list_array.getCount(); k++) { + int uvset_index = index_list_array[k]->getSetIndex(); + + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index); + set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, false); + } +#endif test_index_face(mface, &me->fdata, face_index, 3); @@ -1490,11 +1729,23 @@ private: // set mtface for each uv set // it is assumed that all primitives have equal number of UV sets +#if 0 for (k = 0; k < totuvset; k++) { - // get mtface by face index and uv set index - MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k); - set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0); + if (!index_list_array.empty() && index_list_array[k]) { + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k); + set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0); + } } +#else + for (k = 0; k < index_list_array.getCount(); k++) { + int uvset_index = index_list_array[k]->getSetIndex(); + + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index); + set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0); + } +#endif test_index_face(mface, &me->fdata, face_index, vcount); @@ -1530,11 +1781,24 @@ private: set_face_indices(mface, tri_indices, false); +#if 0 for (unsigned int l = 0; l < totuvset; l++) { - // get mtface by face index and uv set index - MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, l); - set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices); + if (!index_list_array.empty() && index_list_array[l]) { + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, l); + set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices); + } } +#else + for (unsigned int l = 0; l < index_list_array.getCount(); l++) { + int uvset_index = index_list_array[l]->getSetIndex(); + + // get mtface by face index and uv set index + MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index); + set_face_uv(&mtface[face_index], uvs, *index_list_array[l], uv_indices); + } +#endif + test_index_face(mface, &me->fdata, face_index, 3); @@ -1884,77 +2148,50 @@ private: std::vector& fcurves = curve_map[curve->getUniqueId()]; - if (dim == 1) { - FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve"); - - fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED); - // fcu->rna_path = BLI_strdupn(path, strlen(path)); - fcu->array_index = 0; - //fcu->totvert = curve->getKeyCount(); - - // create beztriple for each key - for (i = 0; i < curve->getKeyCount(); i++) { - BezTriple bez; - memset(&bez, 0, sizeof(BezTriple)); - - // intangent - // bez.vec[0][0] = get_float_value(intan, i + i) * fps; - // bez.vec[0][1] = get_float_value(intan, i + i + 1); - - // input, output - bez.vec[1][0] = get_float_value(input, i) * fps; - bez.vec[1][1] = get_float_value(output, i); - - // outtangent - // bez.vec[2][0] = get_float_value(outtan, i + i) * fps; - // bez.vec[2][1] = get_float_value(outtan, i + i + 1); + switch (dim) { + case 1: // X, Y, Z or angle + case 3: // XYZ + case 16: // matrix + { + for (i = 0; i < dim; i++ ) { + FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve"); - bez.ipo = U.ipo_new; /* use default interpolation mode here... */ - bez.f1 = bez.f2 = bez.f3 = SELECT; - bez.h1 = bez.h2 = HD_AUTO; - insert_bezt_fcurve(fcu, &bez, 0); - } - - calchandles_fcurve(fcu); - - fcurves.push_back(fcu); - } - else if(dim == 3) { - for (i = 0; i < dim; i++ ) { - FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve"); + fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED); + // fcu->rna_path = BLI_strdupn(path, strlen(path)); + fcu->array_index = 0; + //fcu->totvert = curve->getKeyCount(); - fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED); - // fcu->rna_path = BLI_strdupn(path, strlen(path)); - fcu->array_index = 0; - //fcu->totvert = curve->getKeyCount(); - - // create beztriple for each key - for (unsigned int j = 0; j < curve->getKeyCount(); j++) { - BezTriple bez; - memset(&bez, 0, sizeof(BezTriple)); + // create beztriple for each key + for (unsigned int j = 0; j < curve->getKeyCount(); j++) { + BezTriple bez; + memset(&bez, 0, sizeof(BezTriple)); - // intangent - // bez.vec[0][0] = get_float_value(intan, j * 6 + i + i) * fps; - // bez.vec[0][1] = get_float_value(intan, j * 6 + i + i + 1); + // intangent + // bez.vec[0][0] = get_float_value(intan, j * 6 + i + i) * fps; + // bez.vec[0][1] = get_float_value(intan, j * 6 + i + i + 1); - // input, output - bez.vec[1][0] = get_float_value(input, j) * fps; - bez.vec[1][1] = get_float_value(output, j * 3 + i); + // input, output + bez.vec[1][0] = get_float_value(input, j) * fps; + bez.vec[1][1] = get_float_value(output, j * dim + i); - // outtangent - // bez.vec[2][0] = get_float_value(outtan, j * 6 + i + i) * fps; - // bez.vec[2][1] = get_float_value(outtan, j * 6 + i + i + 1); + // outtangent + // bez.vec[2][0] = get_float_value(outtan, j * 6 + i + i) * fps; + // bez.vec[2][1] = get_float_value(outtan, j * 6 + i + i + 1); - bez.ipo = U.ipo_new; /* use default interpolation mode here... */ - bez.f1 = bez.f2 = bez.f3 = SELECT; - bez.h1 = bez.h2 = HD_AUTO; - insert_bezt_fcurve(fcu, &bez, 0); + bez.ipo = U.ipo_new; /* use default interpolation mode here... */ + bez.f1 = bez.f2 = bez.f3 = SELECT; + bez.h1 = bez.h2 = HD_AUTO; + insert_bezt_fcurve(fcu, &bez, 0); + } + + calchandles_fcurve(fcu); + + fcurves.push_back(fcu); } - - calchandles_fcurve(fcu); - - fcurves.push_back(fcu); } + break; + default: + fprintf(stderr, "Output dimension of %d is not yet supported (animation id = %s)\n", dim, curve->getOriginalId().c_str()); } for (std::vector::iterator it = fcurves.begin(); it != fcurves.end(); it++) @@ -2225,8 +2462,10 @@ public: { float mat[4][4]; TransformReader::get_node_mat(mat, node, &uid_animated_map, ob); - if (ob) - TransformReader::decompose(mat, ob->loc, ob->rot, NULL, ob->size); + if (ob) { + copy_m4_m4(ob->obmat, mat); + object_apply_mat4(ob, ob->obmat); + } } #if 0 @@ -2332,7 +2571,9 @@ public: Object *par_job = NULL) { bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE; + bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX; bool is_joint = node->getType() == COLLADAFW::Node::JOINT; + COLLADAFW::Node *root = root_map.find(node->getUniqueId()) == root_map.end() ? node : root_map[node->getUniqueId()]; Object *ob = is_joint ? armature_importer->get_armature_for_joint(node) : object_map[node->getUniqueId()]; const char *bone_name = is_joint ? get_joint_name(node) : NULL; @@ -2350,7 +2591,7 @@ public: unsigned int i; - // find frames at which to sample plus convert all keys to radians + // find frames at which to sample plus convert all rotation keys to radians for (i = 0; i < tms.getCount(); i++) { COLLADAFW::Transformation *tm = tms[i]; COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); @@ -2367,7 +2608,7 @@ public: std::vector& curves = curve_map[bindings[j].animation]; bool xyz = ((type == COLLADAFW::Transformation::TRANSLATE || type == COLLADAFW::Transformation::SCALE) && bindings[j].animationClass == COLLADAFW::AnimationList::POSITION_XYZ); - if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3)) { + if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3) || is_matrix) { std::vector::iterator iter; for (iter = curves.begin(); iter != curves.end(); iter++) { @@ -2392,16 +2633,11 @@ public: } } - sort(frames.begin(), frames.end()); - float irest_dae[4][4]; float rest[4][4], irest[4][4]; if (is_joint) { - if (is_joint) - get_joint_rest_mat(irest_dae, root, node); - else - evaluate_transform_at_frame(irest_dae, node, 0.0f); + get_joint_rest_mat(irest_dae, root, node); invert_m4(irest_dae); Bone *bone = get_named_bone((bArmature*)ob->data, bone_name); @@ -2415,18 +2651,18 @@ public: invert_m4_m4(irest, rest); } - char rna_path[200]; - Object *job = NULL; #ifdef ARMATURE_TEST - FCurve *job_curves[4]; + FCurve *job_curves[10]; job = get_joint_object(root, node, par_job); #endif if (frames.size() == 0) return job; + std::sort(frames.begin(), frames.end()); + const char *tm_str = NULL; switch (tm_type) { case COLLADAFW::Transformation::ROTATE: @@ -2438,29 +2674,51 @@ public: case COLLADAFW::Transformation::TRANSLATE: tm_str = "location"; break; + case COLLADAFW::Transformation::MATRIX: + break; default: return job; } - if (is_joint) { - char joint_path[200]; + char rna_path[200]; + char joint_path[200]; + + if (is_joint) armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path)); - BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str); - } - else { - strcpy(rna_path, tm_str); - } // new curves - FCurve *newcu[4]; - unsigned int totcu = is_rotation ? 4 : 3; + FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale + unsigned int totcu = is_matrix ? 10 : (is_rotation ? 4 : 3); for (i = 0; i < totcu; i++) { - newcu[i] = create_fcurve(i, rna_path); + + int axis = i; + + if (is_matrix) { + if (i < 4) { + tm_str = "rotation_quaternion"; + axis = i; + } + else if (i < 7) { + tm_str = "location"; + axis = i - 4; + } + else { + tm_str = "scale"; + axis = i - 7; + } + } + + if (is_joint) + BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str); + else + strcpy(rna_path, tm_str); + + newcu[i] = create_fcurve(axis, rna_path); #ifdef ARMATURE_TEST if (is_joint) - job_curves[i] = create_fcurve(i, tm_str); + job_curves[i] = create_fcurve(axis, tm_str); #endif } @@ -2471,11 +2729,12 @@ public: float fra = *it; float mat[4][4]; + float matfra[4][4]; - unit_m4(mat); + unit_m4(matfra); // calc object-space mat - evaluate_transform_at_frame(mat, node, fra); + evaluate_transform_at_frame(matfra, node, fra); // for joints, we need a special matrix if (is_joint) { @@ -2486,15 +2745,18 @@ public: // calc M calc_joint_parent_mat_rest(par, NULL, root, node); - mul_m4_m4m4(temp, mat, par); + mul_m4_m4m4(temp, matfra, par); // evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra); // calc special matrix mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL); } + else { + copy_m4_m4(mat, matfra); + } - float val[4]; + float val[4], rot[4], loc[3], scale[3]; switch (tm_type) { case COLLADAFW::Transformation::ROTATE: @@ -2506,35 +2768,64 @@ public: case COLLADAFW::Transformation::TRANSLATE: copy_v3_v3(val, mat[3]); break; + case COLLADAFW::Transformation::MATRIX: + mat4_to_quat(rot, mat); + copy_v3_v3(loc, mat[3]); + mat4_to_size(scale, mat); + break; default: break; } - // add 4 or 3 keys + // add keys for (i = 0; i < totcu; i++) { - add_bezt(newcu[i], fra, val[i]); + if (is_matrix) { + if (i < 4) + add_bezt(newcu[i], fra, rot[i]); + else if (i < 7) + add_bezt(newcu[i], fra, loc[i - 4]); + else + add_bezt(newcu[i], fra, scale[i - 7]); + } + else { + add_bezt(newcu[i], fra, val[i]); + } } #ifdef ARMATURE_TEST if (is_joint) { - evaluate_transform_at_frame(mat, node, fra); - switch (tm_type) { case COLLADAFW::Transformation::ROTATE: - mat4_to_quat(val, mat); + mat4_to_quat(val, matfra); break; case COLLADAFW::Transformation::SCALE: - mat4_to_size(val, mat); + mat4_to_size(val, matfra); break; case COLLADAFW::Transformation::TRANSLATE: - copy_v3_v3(val, mat[3]); + copy_v3_v3(val, matfra[3]); + break; + case MATRIX: + mat4_to_quat(rot, matfra); + copy_v3_v3(loc, matfra[3]); + mat4_to_size(scale, matfra); break; default: break; } - for (i = 0; i < totcu; i++) - add_bezt(job_curves[i], fra, val[i]); + for (i = 0; i < totcu; i++) { + if (is_matrix) { + if (i < 4) + add_bezt(job_curves[i], fra, rot[i]); + else if (i < 7) + add_bezt(job_curves[i], fra, loc[i - 4]); + else + add_bezt(job_curves[i], fra, scale[i - 7]); + } + else { + add_bezt(job_curves[i], fra, val[i]); + } + } } #endif } @@ -2556,7 +2847,7 @@ public: #endif } - if (is_rotation) { + if (is_rotation || is_matrix) { if (is_joint) { bPoseChannel *chan = get_pose_channel(ob->pose, bone_name); chan->rotmode = ROT_MODE_QUAT; @@ -2585,7 +2876,7 @@ public: unit_m4(m); - if (!evaluate_animation(tm, m, fra)) { + if (!evaluate_animation(tm, m, fra, node->getOriginalId().c_str())) { switch (type) { case COLLADAFW::Transformation::ROTATE: dae_rotate_to_mat4(tm, m); @@ -2611,89 +2902,147 @@ public: } } - bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra) + // return true to indicate that mat contains a sane value + bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id) { const COLLADAFW::UniqueId& listid = tm->getAnimationList(); + COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); - if (animlist_map.find(listid) != animlist_map.end()) { - const COLLADAFW::AnimationList *animlist = animlist_map[listid]; - const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings(); + if (type != COLLADAFW::Transformation::ROTATE && + type != COLLADAFW::Transformation::SCALE && + type != COLLADAFW::Transformation::TRANSLATE && + type != COLLADAFW::Transformation::MATRIX) { + fprintf(stderr, "animation of transformation %d is not supported yet\n", type); + return false; + } - if (bindings.getCount()) { - for (unsigned int j = 0; j < bindings.getCount(); j++) { - std::vector& curves = curve_map[bindings[j].animation]; - COLLADAFW::AnimationList::AnimationClass animclass = bindings[j].animationClass; - COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); - bool xyz = ((type == COLLADAFW::Transformation::TRANSLATE || type == COLLADAFW::Transformation::SCALE) && bindings[j].animationClass == COLLADAFW::AnimationList::POSITION_XYZ); + if (animlist_map.find(listid) == animlist_map.end()) + return false; - if (type == COLLADAFW::Transformation::ROTATE) { - if (curves.size() != 1) { - fprintf(stderr, "expected 1 curve, got %u\n", curves.size()); - } - else { - if (animclass == COLLADAFW::AnimationList::ANGLE) { - COLLADABU::Math::Vector3& axis = ((COLLADAFW::Rotate*)tm)->getRotationAxis(); - float ax[3] = {axis[0], axis[1], axis[2]}; - float angle = evaluate_fcurve(curves[0], fra); - axis_angle_to_mat4(mat, ax, angle); + const COLLADAFW::AnimationList *animlist = animlist_map[listid]; + const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings(); - return true; - } - else { - // TODO support other animclasses - fprintf(stderr, " animclass %d is not supported yet\n", bindings[j].animationClass); - } - } + if (bindings.getCount()) { + float vec[3]; + + bool is_scale = (type == COLLADAFW::Transformation::SCALE); + bool is_translate = (type == COLLADAFW::Transformation::TRANSLATE); + + if (type == COLLADAFW::Transformation::SCALE) + dae_scale_to_v3(tm, vec); + else if (type == COLLADAFW::Transformation::TRANSLATE) + dae_translate_to_v3(tm, vec); + + for (unsigned int j = 0; j < bindings.getCount(); j++) { + const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[j]; + std::vector& curves = curve_map[binding.animation]; + COLLADAFW::AnimationList::AnimationClass animclass = binding.animationClass; + char path[100]; + + switch (type) { + case COLLADAFW::Transformation::ROTATE: + BLI_snprintf(path, sizeof(path), "%s.rotate (binding %u)", node_id, j); + break; + case COLLADAFW::Transformation::SCALE: + BLI_snprintf(path, sizeof(path), "%s.scale (binding %u)", node_id, j); + break; + case COLLADAFW::Transformation::TRANSLATE: + BLI_snprintf(path, sizeof(path), "%s.translate (binding %u)", node_id, j); + break; + case COLLADAFW::Transformation::MATRIX: + BLI_snprintf(path, sizeof(path), "%s.matrix (binding %u)", node_id, j); + break; + default: + break; + } + + if (animclass == COLLADAFW::AnimationList::UNKNOWN_CLASS) { + fprintf(stderr, "%s: UNKNOWN animation class\n", path); + continue; + } + + if (type == COLLADAFW::Transformation::ROTATE) { + if (curves.size() != 1) { + fprintf(stderr, "expected 1 curve, got %u\n", curves.size()); + return false; } - else if (type == COLLADAFW::Transformation::SCALE || type == COLLADAFW::Transformation::TRANSLATE) { - if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3)) { - bool animated = true; - bool scale = (type == COLLADAFW::Transformation::SCALE); - float vec[3] = {0.0f, 0.0f, 0.0f}; - if (scale) - vec[0] = vec[1] = vec[2] = 1.0f; - - switch (animclass) { - case COLLADAFW::AnimationList::POSITION_X: - vec[0] = evaluate_fcurve(curves[0], fra); - break; - case COLLADAFW::AnimationList::POSITION_Y: - vec[1] = evaluate_fcurve(curves[0], fra); - break; - case COLLADAFW::AnimationList::POSITION_Z: - vec[2] = evaluate_fcurve(curves[0], fra); - break; - case COLLADAFW::AnimationList::POSITION_XYZ: - vec[0] = evaluate_fcurve(curves[0], fra); - vec[1] = evaluate_fcurve(curves[1], fra); - vec[2] = evaluate_fcurve(curves[2], fra); - break; - default: - fprintf(stderr, "<%s> animclass %d is not supported yet\n", scale ? "scale" : "translate", animclass); - animated = false; - break; - } - - if (animated) { - if (scale) - size_to_mat4(mat, vec); - else - copy_v3_v3(mat[3], vec); - } - - return animated; - } - else { - fprintf(stderr, "expected 1 or 3 curves, got %u, animclass is %d\n", curves.size(), animclass); - } + // TODO support other animclasses + if (animclass != COLLADAFW::AnimationList::ANGLE) { + fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass); + return false; } - else { - // not very useful for user - fprintf(stderr, "animation of transformation %d is not supported yet\n", type); + + COLLADABU::Math::Vector3& axis = ((COLLADAFW::Rotate*)tm)->getRotationAxis(); + float ax[3] = {axis[0], axis[1], axis[2]}; + float angle = evaluate_fcurve(curves[0], fra); + axis_angle_to_mat4(mat, ax, angle); + + return true; + } + else if (is_scale || is_translate) { + bool is_xyz = animclass == COLLADAFW::AnimationList::POSITION_XYZ; + + if ((!is_xyz && curves.size() != 1) || (is_xyz && curves.size() != 3)) { + if (is_xyz) + fprintf(stderr, "%s: expected 3 curves, got %u\n", path, curves.size()); + else + fprintf(stderr, "%s: expected 1 curve, got %u\n", path, curves.size()); + return false; + } + + switch (animclass) { + case COLLADAFW::AnimationList::POSITION_X: + vec[0] = evaluate_fcurve(curves[0], fra); + break; + case COLLADAFW::AnimationList::POSITION_Y: + vec[1] = evaluate_fcurve(curves[0], fra); + break; + case COLLADAFW::AnimationList::POSITION_Z: + vec[2] = evaluate_fcurve(curves[0], fra); + break; + case COLLADAFW::AnimationList::POSITION_XYZ: + vec[0] = evaluate_fcurve(curves[0], fra); + vec[1] = evaluate_fcurve(curves[1], fra); + vec[2] = evaluate_fcurve(curves[2], fra); + break; + default: + fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass); + break; } } + else if (type == COLLADAFW::Transformation::MATRIX) { + // for now, of matrix animation, support only the case when all values are packed into one animation + if (curves.size() != 16) { + fprintf(stderr, "%s: expected 16 curves, got %u\n", path, curves.size()); + return false; + } + + COLLADABU::Math::Matrix4 matrix; + int i = 0, j = 0; + + for (std::vector::iterator it = curves.begin(); it != curves.end(); it++) { + matrix.setElement(i, j, evaluate_fcurve(*it, fra)); + j++; + if (j == 4) { + i++; + j = 0; + } + } + + COLLADAFW::Matrix tm(matrix); + dae_matrix_to_mat4(&tm, mat); + + return true; + } } + + if (is_scale) + size_to_mat4(mat, vec); + else + copy_v3_v3(mat[3], vec); + + return is_scale || is_translate; } return false; @@ -2922,7 +3271,7 @@ public: } /** This method will be called if an error in the loading process occurred and the loader cannot - continue to to load. The writer should undo all operations that have been performed. + continue to load. The writer should undo all operations that have been performed. @param errorMessage A message containing informations about the error that occurred. */ virtual void cancel(const COLLADAFW::String& errorMessage) @@ -2970,13 +3319,14 @@ public: COLLADAFW::Transformation::TransformationType types[] = { COLLADAFW::Transformation::ROTATE, COLLADAFW::Transformation::SCALE, - COLLADAFW::Transformation::TRANSLATE + COLLADAFW::Transformation::TRANSLATE, + COLLADAFW::Transformation::MATRIX }; unsigned int i; Object *ob; - for (i = 0; i < 3; i++) + for (i = 0; i < 4; i++) ob = anim_importer.translate_animation(node, object_map, root_map, types[i]); COLLADAFW::NodePointerArray &children = node->getChildNodes(); @@ -3039,13 +3389,10 @@ public: void write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par) { Object *ob = NULL; + bool is_joint = node->getType() == COLLADAFW::Node::JOINT; - if (node->getType() == COLLADAFW::Node::JOINT) { - - if (node->getType() == COLLADAFW::Node::JOINT) { - armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT); - } - + if (is_joint) { + armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT, par); } else { COLLADAFW::InstanceGeometryPointerArray &geom = node->getInstanceGeometries(); @@ -3079,27 +3426,23 @@ public: // XXX empty node may not mean it is empty object, not sure about this else { ob = add_object(sce, OB_EMPTY); + rename_id(&ob->id, (char*)node->getOriginalId().c_str()); } // check if object is not NULL if (!ob) return; - object_map[node->getUniqueId()] = ob; - - // if par was given make this object child of the previous - if (par && ob) { - ob->parent = par; - - // doing what 'set parent' operator does - par->recalc |= OB_RECALC_OB; - ob->parsubstr[0] = 0; - - DAG_scene_sort(sce); - } + object_map[node->getUniqueId()] = ob; } anim_importer.read_node_transform(node, ob); + if (!is_joint) { + // if par was given make this object child of the previous + if (par && ob) + set_parent(ob, par, mContext); + } + // if node has child nodes write them COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes(); for (unsigned int i = 0; i < child_nodes.getCount(); i++) { @@ -3407,7 +3750,7 @@ public: char dir[FILE_MAX]; char full_path[FILE_MAX]; - BLI_split_dirfile_basic(filename, dir, NULL); + BLI_split_dirfile(filename, dir, NULL); BLI_join_dirfile(full_path, dir, filepath.c_str()); Image *ima = BKE_add_image_file(full_path, 0); if (!ima) { diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h index 5dee101eb2d..babf8f65d7f 100644 --- a/source/blender/collada/DocumentImporter.h +++ b/source/blender/collada/DocumentImporter.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ struct Main; struct bContext; diff --git a/source/blender/collada/SConscript b/source/blender/collada/SConscript index 6a1c71c9c86..b86e7312698 100644 --- a/source/blender/collada/SConscript +++ b/source/blender/collada/SConscript @@ -1,4 +1,30 @@ #!/usr/bin/python +# $Id$ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2006, Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Arystanbek Dyussenov, Nathan Letwory. +# +# ***** END GPL LICENSE BLOCK ***** + Import ('env') sources = env.Glob('*.cpp') diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index 5aed51c0ba2..a519db3332c 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ #include "BKE_main.h" #include "BKE_scene.h" #include "BKE_context.h" diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h index cccca072b40..1c724bef6a6 100644 --- a/source/blender/collada/collada.h +++ b/source/blender/collada/collada.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ #ifndef BLENDER_COLLADA_H #define BLENDER_COLLADA_H diff --git a/source/blender/collada/collada_internal.h b/source/blender/collada/collada_internal.h index 278cd37ac66..242fce749c4 100644 --- a/source/blender/collada/collada_internal.h +++ b/source/blender/collada/collada_internal.h @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ #ifndef BLENDER_COLLADA_H #define BLENDER_COLLADA_H diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt index 58c3f5d6088..2e2de166b6e 100644 --- a/source/blender/editors/CMakeLists.txt +++ b/source/blender/editors/CMakeLists.txt @@ -15,83 +15,44 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# # Contributor(s): Jacques Beaurain. # # ***** END GPL LICENSE BLOCK ***** -FILE(GLOB SRC */*.c) - -SET(INC ../windowmanager - ../editors/include ../editors/interface - ../../../intern/guardedalloc ../../../intern/memutil - ../blenlib ../makesdna ../makesrna ../blenkernel - ../include ../imbuf ../render/extern/include - ../../../intern/bsp/extern - ../../../intern/decimation/extern ../blenloader ../python - ../../kernel/gen_system ../readstreamglue - ../../../intern/elbeem/extern ../bmesh - ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include ../../../intern/smoke/extern - ../../../intern/audaspace/intern - ../nodes - ../gpu - ../blenfont - ../ikplugin -) - -ADD_DEFINITIONS(-DGLEW_STATIC) - -IF(WITH_GAMEENGINE) - ADD_DEFINITIONS(-DGAMEBLENDER) -ENDIF(WITH_GAMEENGINE) - -IF(WITH_INTERNATIONAL) - ADD_DEFINITIONS(-DINTERNATIONAL) -ENDIF(WITH_INTERNATIONAL) - -IF(WITH_OPENEXR) - ADD_DEFINITIONS(-DWITH_OPENEXR) -ENDIF(WITH_OPENEXR) - -IF(WITH_OPENJPEG) - ADD_DEFINITIONS(-DWITH_OPENJPEG) -ENDIF(WITH_OPENJPEG) - -IF(WITH_QUICKTIME) - SET(INC ${INC} ../quicktime ${QUICKTIME_INC}) - ADD_DEFINITIONS(-DWITH_QUICKTIME) -ENDIF(WITH_QUICKTIME) - -IF(WITH_FFMPEG) - SET(INC ${INC} ${FFMPEG_INC}) - ADD_DEFINITIONS(-DWITH_FFMPEG) -ENDIF(WITH_FFMPEG) - -IF(WITH_OPENMP) - ADD_DEFINITIONS(-DPARALLEL=1) -ENDIF(WITH_OPENMP) - -IF(NOT WITH_ELBEEM) - ADD_DEFINITIONS(-DDISABLE_ELBEEM) -ENDIF(NOT WITH_ELBEEM) - -IF(WITH_PYTHON) - SET(INC ${INC} ${PYTHON_INC}) -ELSE(WITH_PYTHON) - ADD_DEFINITIONS(-DDISABLE_PYTHON) -ENDIF(WITH_PYTHON) - -IF(WIN32) - SET(INC ${INC} ${PTHREADS_INC}) -ENDIF(WIN32) - -IF(WITH_BUILDINFO) - ADD_DEFINITIONS(-DNAN_BUILDINFO) -ENDIF(WITH_BUILDINFO) - -BLENDERLIB(bf_editors "${SRC}" "${INC}") +ADD_SUBDIRECTORY(animation) +ADD_SUBDIRECTORY(armature) +ADD_SUBDIRECTORY(curve) +ADD_SUBDIRECTORY(datafiles) +ADD_SUBDIRECTORY(gpencil) +ADD_SUBDIRECTORY(interface) +ADD_SUBDIRECTORY(mesh) +ADD_SUBDIRECTORY(metaball) +ADD_SUBDIRECTORY(object) +ADD_SUBDIRECTORY(physics) +ADD_SUBDIRECTORY(render) +ADD_SUBDIRECTORY(screen) +ADD_SUBDIRECTORY(sculpt_paint) +ADD_SUBDIRECTORY(sound) +ADD_SUBDIRECTORY(space_action) +ADD_SUBDIRECTORY(space_api) +ADD_SUBDIRECTORY(space_buttons) +ADD_SUBDIRECTORY(space_console) +ADD_SUBDIRECTORY(space_file) +ADD_SUBDIRECTORY(space_graph) +ADD_SUBDIRECTORY(space_image) +ADD_SUBDIRECTORY(space_info) +ADD_SUBDIRECTORY(space_logic) +ADD_SUBDIRECTORY(space_nla) +ADD_SUBDIRECTORY(space_node) +ADD_SUBDIRECTORY(space_outliner) +ADD_SUBDIRECTORY(space_script) +ADD_SUBDIRECTORY(space_sequencer) +ADD_SUBDIRECTORY(space_sound) +ADD_SUBDIRECTORY(space_text) +ADD_SUBDIRECTORY(space_time) +ADD_SUBDIRECTORY(space_userpref) +ADD_SUBDIRECTORY(space_view3d) +ADD_SUBDIRECTORY(transform) +ADD_SUBDIRECTORY(util) +ADD_SUBDIRECTORY(uvedit) diff --git a/source/blender/editors/animation/CMakeLists.txt b/source/blender/editors/animation/CMakeLists.txt new file mode 100644 index 00000000000..d5eef6bbd34 --- /dev/null +++ b/source/blender/editors/animation/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/guardedalloc +) + +BLENDERLIB(bf_editor_animation "${SRC}" "${INC}") diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index 3e711ccc2c1..09fbdf2d70d 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -25,68 +25,40 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include -#include -#ifdef HAVE_CONFIG_H -#include -#endif #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" #include "DNA_particle_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" -#include "DNA_constraint_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_mesh_types.h" #include "DNA_material_types.h" -#include "DNA_texture_types.h" #include "DNA_meta_types.h" #include "DNA_node_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" #include "DNA_world_types.h" #include "RNA_access.h" -#include "RNA_define.h" - -#include "BKE_animsys.h" -#include "BKE_action.h" #include "BKE_curve.h" -#include "BKE_depsgraph.h" -#include "BKE_fcurve.h" #include "BKE_key.h" -#include "BKE_material.h" -#include "BKE_object.h" #include "BKE_context.h" -#include "BKE_utildefines.h" #include "UI_interface.h" #include "UI_interface_icons.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "ED_anim_api.h" #include "ED_keyframing.h" -#include "ED_keyframes_edit.h" // XXX move the select modes out of there! -#include "ED_screen.h" -#include "ED_space_api.h" #include "BIF_gl.h" @@ -620,10 +592,32 @@ static int acf_object_icon(bAnimListElem *ale) Object *ob= base->object; /* icon depends on object-type */ - if (ob->type == OB_ARMATURE) - return ICON_ARMATURE_DATA; - else - return ICON_OBJECT_DATA; + + switch (ob->type) { + case OB_LAMP: + return ICON_OUTLINER_OB_LAMP; + case OB_MESH: + return ICON_OUTLINER_OB_MESH; + case OB_CAMERA: + return ICON_OUTLINER_OB_CAMERA; + case OB_CURVE: + return ICON_OUTLINER_OB_CURVE; + case OB_MBALL: + return ICON_OUTLINER_OB_META; + case OB_LATTICE: + return ICON_OUTLINER_OB_LATTICE; + case OB_ARMATURE: + return ICON_OUTLINER_OB_ARMATURE; + case OB_FONT: + return ICON_OUTLINER_OB_FONT; + case OB_SURF: + return ICON_OUTLINER_OB_SURFACE; + case OB_EMPTY: + return ICON_OUTLINER_OB_EMPTY; + default: + return ICON_OBJECT_DATA; + } + } /* name for object */ @@ -2362,8 +2356,8 @@ static void dummy_olddraw_gpencil () case SPACE_VIEW3D: { /* this shouldn't cause any overflow... */ - //sprintf(name, "3DView:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func.. - strcpy(name, "3dView"); + //sprintf(name, "View3D:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func.. + strcpy(name, "View3D"); special= ICON_VIEW3D; } break; @@ -2864,7 +2858,7 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float /* callback for (normal) widget settings - send notifiers */ static void achannel_setting_widget_cb(bContext *C, void *poin, void *poin2) { - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); } /* callback for widget settings that need flushing */ @@ -2878,7 +2872,7 @@ static void achannel_setting_flush_widget_cb(bContext *C, void *ale_npoin, void short on = 0; /* send notifiers before doing anything else... */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); /* verify animation context */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -2942,7 +2936,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag); if (done) - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); } } @@ -2984,7 +2978,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag); if (done) - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); } /* free the path */ @@ -3212,6 +3206,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b */ if ((draw_sliders) && ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_SHAPEKEY)) { /* adjust offset */ + // TODO: make slider width dynamic, so that they can be easier to use when the view is wide enough offset += SLIDER_WIDTH; /* need backdrop behind sliders... */ diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index 26dd0285a2f..21bdb591df9 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -25,63 +25,28 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_math.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_particle_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_constraint_types.h" #include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_meta_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" #include "RNA_access.h" #include "RNA_define.h" -#include "BKE_animsys.h" #include "BKE_action.h" -#include "BKE_depsgraph.h" #include "BKE_fcurve.h" -#include "BKE_key.h" -#include "BKE_material.h" -#include "BKE_object.h" #include "BKE_context.h" #include "BKE_global.h" -#include "BKE_utildefines.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "ED_anim_api.h" #include "ED_keyframes_edit.h" // XXX move the select modes out of there! #include "ED_screen.h" -#include "ED_space_api.h" #include "WM_api.h" #include "WM_types.h" @@ -877,7 +842,7 @@ static int animchannels_rearrange_exec(bContext *C, wmOperator *op) rearrange_action_channels(&ac, mode); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -974,7 +939,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) /* do groups only first (unless in Drivers mode, where there are none) */ if (ac.datatype != ANIMCONT_DRIVERS) { /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* delete selected groups and their associated channels */ @@ -1013,7 +978,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) /* now do F-Curves */ if (ac.datatype != ANIMCONT_GPENCIL) { /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* delete selected F-Curves */ @@ -1033,7 +998,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) } /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1073,7 +1038,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op) ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype); /* hide all channels not selected */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_UNSEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_UNSEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1089,7 +1054,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* make all the selected channels visible */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1110,7 +1075,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op) /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1148,11 +1113,11 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; /* get list of all channels that selection may need to be flushed to */ - filter= ANIMFILTER_CHANNELS; + filter= (ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* See if we should be making showing all selected or hiding */ @@ -1183,7 +1148,7 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op) BLI_freelistN(&all_data); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1250,7 +1215,8 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode, } /* filter data that we're working on */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS); + // XXX: noduplis enabled so that results don't cancel, but will be problematic for some channels where only type differs + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS); if (onlysel) filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -1313,7 +1279,7 @@ static int animchannels_setflag_exec(bContext *C, wmOperator *op) setflag_anim_channels(&ac, setting, mode, 1, flush); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1447,7 +1413,7 @@ static int animchannels_expand_exec (bContext *C, wmOperator *op) setflag_anim_channels(&ac, ACHANNEL_SETTING_EXPAND, ACHANNEL_SETFLAG_ADD, onlysel, 0); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1489,7 +1455,7 @@ static int animchannels_collapse_exec (bContext *C, wmOperator *op) setflag_anim_channels(&ac, ACHANNEL_SETTING_EXPAND, ACHANNEL_SETFLAG_CLEAR, onlysel, 0); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1529,7 +1495,7 @@ static int animchannels_deselectall_exec(bContext *C, wmOperator *op) ANIM_deselect_anim_channels(&ac, ac.data, ac.datatype, 1, ACHANNEL_SETFLAG_ADD); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -1631,7 +1597,7 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op) borderselect_anim_channels(&ac, &rect, selectmode); /* send notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -1710,7 +1676,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh if (adt) adt->flag |= ADT_UI_SELECTED; } - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; case ANIMTYPE_OBJECT: @@ -1749,7 +1715,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh if ((adt) && (adt->flag & ADT_UI_SELECTED)) adt->flag |= ADT_UI_ACTIVE; - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; @@ -1785,7 +1751,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh ale->adt->flag |= ADT_UI_ACTIVE; } - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; @@ -1820,7 +1786,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh if (agrp->flag & AGRP_SELECTED) ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, agrp, ANIMTYPE_GROUP); - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; case ANIMTYPE_FCURVE: @@ -1842,7 +1808,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh if (fcu->flag & FCURVE_SELECTED) ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE); - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; case ANIMTYPE_SHAPEKEY: @@ -1860,7 +1826,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh kb->flag |= KEYBLOCK_SEL; } - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; case ANIMTYPE_GPDATABLOCK: @@ -1870,7 +1836,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh /* toggle expand */ gpd->flag ^= GP_DATA_EXPAND; - notifierFlags |= ND_ANIMCHAN_EDIT; + notifierFlags |= (ND_ANIMCHAN|NA_EDITED); } break; case ANIMTYPE_GPLAYER: @@ -2039,6 +2005,7 @@ void ED_keymap_animchannels(wmKeyConfig *keyconf) /* delete */ WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", BACKSPACEKEY, KM_PRESS, 0, 0); /* settings */ WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_toggle", WKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c index 3f461889485..5312e97c604 100644 --- a/source/blender/editors/animation/anim_deps.c +++ b/source/blender/editors/animation/anim_deps.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,14 +26,11 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include #include -#include #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_object_types.h" #include "DNA_node_types.h" @@ -47,21 +44,13 @@ #include "BKE_context.h" #include "BKE_depsgraph.h" #include "BKE_global.h" -#include "BKE_main.h" #include "BKE_node.h" -#include "BKE_scene.h" #include "BKE_sequencer.h" -#include "BKE_screen.h" #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" #include "ED_anim_api.h" -#include "ED_screen.h" - -#include "WM_api.h" -#include "WM_types.h" /* **************************** depsgraph tagging ******************************** */ @@ -101,7 +90,7 @@ void ANIM_list_elem_update(Scene *scene, bAnimListElem *ale) else { /* in other case we do standard depsgaph update, ideally we'd be calling property update functions here too ... */ - DAG_id_flush_update(id, OB_RECALC); // XXX or do we want something more restrictive? + DAG_id_flush_update(id, OB_RECALC_ALL); // XXX or do we want something more restrictive? } } @@ -117,7 +106,7 @@ void ANIM_id_update(Scene *scene, ID *id) adt->recalc |= ADT_RECALC_ANIM; /* set recalc flags */ - DAG_id_flush_update(id, OB_RECALC); // XXX or do we want something more restrictive? + DAG_id_flush_update(id, OB_RECALC_ALL); // XXX or do we want something more restrictive? } } diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c index 9d723c1b8f5..f5f50e10bcb 100644 --- a/source/blender/editors/animation/anim_draw.c +++ b/source/blender/editors/animation/anim_draw.c @@ -25,47 +25,22 @@ * * ***** END GPL LICENSE BLOCK ***** */ - -#include -#include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" #include "BLI_math.h" -#include "BKE_animsys.h" -#include "BKE_action.h" #include "BKE_context.h" -#include "BKE_global.h" -#include "BKE_fcurve.h" -#include "BKE_main.h" #include "BKE_nla.h" #include "BKE_object.h" -#include "BKE_screen.h" -#include "BKE_utildefines.h" #include "ED_anim_api.h" #include "ED_keyframes_edit.h" -#include "ED_types.h" -#include "ED_util.h" - -#include "WM_api.h" -#include "WM_types.h" #include "RNA_access.h" #include "BIF_gl.h" -#include "BIF_glutil.h" #include "UI_interface.h" #include "UI_resources.h" @@ -257,20 +232,22 @@ void ANIM_draw_cfra (const bContext *C, View2D *v2d, short flag) /* Draw dark green line if slow-parenting/time-offset is enabled */ if (flag & DRAWCFRA_SHOW_TIMEOFS) { Object *ob= (scene->basact) ? (scene->basact->object) : 0; - - // XXX ob->ipoflag is depreceated! - if ((ob) && (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0f)) { - vec[0]-= give_timeoffset(ob); /* could avoid calling twice */ + if(ob) { + float timeoffset= give_timeoffset(ob); + // XXX ob->ipoflag is depreceated! + if ((ob->ipoflag & OB_OFFS_OB) && (timeoffset != 0.0f)) { + vec[0]-= timeoffset; /* could avoid calling twice */ - UI_ThemeColorShade(TH_CFRAME, -30); + UI_ThemeColorShade(TH_CFRAME, -30); - glBegin(GL_LINE_STRIP); - /*vec[1]= v2d->cur.ymax;*/ // this is set already. this line is only included - glVertex2fv(vec); + glBegin(GL_LINE_STRIP); + /*vec[1]= v2d->cur.ymax;*/ // this is set already. this line is only included + glVertex2fv(vec); - vec[1]= v2d->cur.ymin; - glVertex2fv(vec); - glEnd(); + vec[1]= v2d->cur.ymin; + glVertex2fv(vec); + glEnd(); + } } } @@ -332,11 +309,11 @@ AnimData *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale) /* ------------------- */ /* helper function for ANIM_nla_mapping_apply_fcurve() -> "restore", i.e. mapping points back to action-time */ -static short bezt_nlamapping_restore(BeztEditData *bed, BezTriple *bezt) +static short bezt_nlamapping_restore(KeyframeEditData *ked, BezTriple *bezt) { /* AnimData block providing scaling is stored in 'data', only_keys option is stored in i1 */ - AnimData *adt= (AnimData *)bed->data; - short only_keys= (short)bed->i1; + AnimData *adt= (AnimData *)ked->data; + short only_keys= (short)ked->i1; /* adjust BezTriple handles only if allowed to */ if (only_keys == 0) { @@ -350,11 +327,11 @@ static short bezt_nlamapping_restore(BeztEditData *bed, BezTriple *bezt) } /* helper function for ANIM_nla_mapping_apply_fcurve() -> "apply", i.e. mapping points to NLA-mapped global time */ -static short bezt_nlamapping_apply(BeztEditData *bed, BezTriple *bezt) +static short bezt_nlamapping_apply(KeyframeEditData *ked, BezTriple *bezt) { /* AnimData block providing scaling is stored in 'data', only_keys option is stored in i1 */ - AnimData *adt= (AnimData*)bed->data; - short only_keys= (short)bed->i1; + AnimData *adt= (AnimData*)ked->data; + short only_keys= (short)ked->i1; /* adjust BezTriple handles only if allowed to */ if (only_keys == 0) { @@ -374,16 +351,16 @@ static short bezt_nlamapping_apply(BeztEditData *bed, BezTriple *bezt) */ void ANIM_nla_mapping_apply_fcurve (AnimData *adt, FCurve *fcu, short restore, short only_keys) { - BeztEditData bed; - BeztEditFunc map_cb; + KeyframeEditData ked; + KeyframeEditFunc map_cb; /* init edit data * - AnimData is stored in 'data' * - only_keys is stored in 'i1' */ - memset(&bed, 0, sizeof(BeztEditData)); - bed.data= (void *)adt; - bed.i1= (int)only_keys; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.data= (void *)adt; + ked.i1= (int)only_keys; /* get editing callback */ if (restore) @@ -392,7 +369,7 @@ void ANIM_nla_mapping_apply_fcurve (AnimData *adt, FCurve *fcu, short restore, s map_cb= bezt_nlamapping_apply; /* apply to F-Curve */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, map_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, fcu, NULL, map_cb, NULL); } /* *************************************************** */ @@ -434,12 +411,12 @@ float ANIM_unit_mapping_get_factor (Scene *scene, ID *id, FCurve *fcu, short res /* ----------------------- */ /* helper function for ANIM_unit_mapping_apply_fcurve -> mapping callback for unit mapping */ -static short bezt_unit_mapping_apply (BeztEditData *bed, BezTriple *bezt) +static short bezt_unit_mapping_apply (KeyframeEditData *ked, BezTriple *bezt) { /* mapping factor is stored in f1, flags are stored in i1 */ - short only_keys= (bed->i1 & ANIM_UNITCONV_ONLYKEYS); - short sel_vs= (bed->i1 & ANIM_UNITCONV_SELVERTS); - float fac= bed->f1; + short only_keys= (ked->i1 & ANIM_UNITCONV_ONLYKEYS); + short sel_vs= (ked->i1 & ANIM_UNITCONV_SELVERTS); + float fac= ked->f1; /* adjust BezTriple handles only if allowed to */ if (only_keys == 0) { @@ -458,8 +435,8 @@ static short bezt_unit_mapping_apply (BeztEditData *bed, BezTriple *bezt) /* Apply/Unapply units conversions to keyframes */ void ANIM_unit_mapping_apply_fcurve (Scene *scene, ID *id, FCurve *fcu, short flag) { - BeztEditData bed; - BeztEditFunc sel_cb; + KeyframeEditData ked; + KeyframeEditFunc sel_cb; float fac; /* calculate mapping factor, and abort if nothing to change */ @@ -471,9 +448,9 @@ void ANIM_unit_mapping_apply_fcurve (Scene *scene, ID *id, FCurve *fcu, short fl * - mapping factor is stored in f1 * - flags are stored in 'i1' */ - memset(&bed, 0, sizeof(BeztEditData)); - bed.f1= (float)fac; - bed.i1= (int)flag; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.f1= (float)fac; + ked.i1= (int)flag; /* only selected? */ if (flag & ANIM_UNITCONV_ONLYSEL) @@ -482,7 +459,7 @@ void ANIM_unit_mapping_apply_fcurve (Scene *scene, ID *id, FCurve *fcu, short fl sel_cb= NULL; /* apply to F-Curve */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, sel_cb, bezt_unit_mapping_apply, NULL); + ANIM_fcurve_keyframes_loop(&ked, fcu, sel_cb, bezt_unit_mapping_apply, NULL); // FIXME: loop here for samples should be generalised // TODO: only sel? diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index 2bd4ab34fa5..a9c9830f07f 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -46,18 +46,11 @@ */ #include -#include -#include "DNA_listBase.h" -#include "DNA_ID.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" #include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_group_types.h" #include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_key_types.h" @@ -65,19 +58,17 @@ #include "DNA_mesh_types.h" #include "DNA_meta_types.h" #include "DNA_node_types.h" -#include "DNA_object_types.h" #include "DNA_particle_types.h" #include "DNA_space_types.h" #include "DNA_sequence_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_windowmanager_types.h" #include "DNA_world_types.h" #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -86,26 +77,12 @@ #include "BKE_global.h" #include "BKE_group.h" #include "BKE_key.h" -#include "BKE_object.h" #include "BKE_material.h" #include "BKE_node.h" #include "BKE_sequencer.h" -#include "BKE_screen.h" #include "BKE_utildefines.h" #include "ED_anim_api.h" -#include "ED_types.h" -#include "ED_util.h" - -#include "WM_api.h" -#include "WM_types.h" - -#include "BIF_gl.h" -#include "BIF_glutil.h" - -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" /* ************************************************************ */ /* Blender Context <-> Animation Context mapping */ @@ -116,12 +93,12 @@ /* Note: there's a similar function in key.c (ob_get_key) */ Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction) { - Scene *scene= ac->scene; - Object *ob; - Key *key; + Scene *scene= ac->scene; + Object *ob; + Key *key; - ob = OBACT; - if (ob == NULL) + ob = OBACT; + if (ob == NULL) return NULL; /* XXX pinning is not available in 'ShapeKey' mode... */ @@ -151,7 +128,7 @@ Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction) return key; } - return NULL; + return NULL; } /* Get data being edited in Action Editor (depending on current 'mode') */ @@ -820,7 +797,7 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s /* ----------------------------------------- */ /* NOTE: when this function returns true, the F-Curve is to be skipped */ -static int skip_fcurve_selected_data(FCurve *fcu, ID *owner_id, int filter_mode) +static int skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode) { if (GS(owner_id->name) == ID_OB) { Object *ob= (Object *)owner_id; @@ -837,9 +814,8 @@ static int skip_fcurve_selected_data(FCurve *fcu, ID *owner_id, int filter_mode) /* check whether to continue or skip */ if ((pchan) && (pchan->bone)) { - /* if only visible channels, skip if bone not visible */ - // TODO: should we just do this always? - if (filter_mode & ANIMFILTER_VISIBLE) { + /* if only visible channels, skip if bone not visible unless user wants channels from hidden data too */ + if ((filter_mode & ANIMFILTER_VISIBLE) && !(ads->filterflag & ADS_FILTER_INCL_HIDDEN)) { bArmature *arm= (bArmature *)ob->data; if ((arm->layer & pchan->bone->layer) == 0) @@ -910,7 +886,7 @@ static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bAct * - this will also affect things like Drivers, and also works for Bone Constraints */ if ( ((ads) && (ads->filterflag & ADS_FILTER_ONLYSEL)) && (owner_id) ) { - if (skip_fcurve_selected_data(fcu, owner_id, filter_mode)) + if (skip_fcurve_selected_data(ads, fcu, owner_id, filter_mode)) continue; } @@ -969,6 +945,13 @@ static int animdata_filter_action (bAnimContext *ac, ListBase *anim_data, bDopeS FCurve *lastchan=NULL; int items = 0; + /* don't include anything from this action if it is linked in from another file, + * and we're getting stuff for editing... + */ + // TODO: need a way of tagging other channels that may also be affected... + if ((filter_mode & ANIMFILTER_FOREDIT) && (act->id.lib)) + return 0; + /* loop over groups */ // TODO: in future, should we expect to need nested groups? for (agrp= act->groups.first; agrp; agrp= agrp->next) { @@ -1731,7 +1714,7 @@ static int animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data, /* add NLA tracks - only if expanded or so */ if (!(filter_mode & ANIMFILTER_VISIBLE) || FILTER_SKE_OBJD(key) || (filter_mode & ANIMFILTER_CURVESONLY)) - items += animdata_filter_nla(ac, anim_data, ads, adt, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob); + items += animdata_filter_nla(ac, anim_data, ads, adt, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)key); }, { /* drivers */ /* include shapekey-expand widget? */ @@ -2128,11 +2111,14 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo /* firstly, check if object can be included, by the following factors: * - if only visible, must check for layer and also viewport visibility + * --> while tools may demand only visible, user setting takes priority + * as user option controls whether sets of channels get included while + * tool-flag takes into account collapsed/open channels too * - if only selected, must check if object is selected * - there must be animation data to edit */ // TODO: if cache is implemented, just check name here, and then - if (filter_mode & ANIMFILTER_VISIBLE) { + if ((filter_mode & ANIMFILTER_VISIBLE) && !(ads->filterflag & ADS_FILTER_INCL_HIDDEN)) { /* layer visibility - we check both object and base, since these may not be in sync yet */ if ((sce->lay & (ob->lay|base->lay))==0) continue; @@ -2536,6 +2522,65 @@ static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim return 1; } +/* ----------- Cleanup API --------------- */ + +/* Remove entries with invalid types in animation channel list */ +static int animdata_filter_remove_invalid (ListBase *anim_data) +{ + bAnimListElem *ale, *next; + int items = 0; + + /* only keep entries with valid types */ + for (ale= anim_data->first; ale; ale= next) { + next= ale->next; + + if (ale->type == ANIMTYPE_NONE) + BLI_freelinkN(anim_data, ale); + else + items++; + } + + return items; +} + +/* Remove duplicate entries in animation channel list */ +static int animdata_filter_remove_duplis (ListBase *anim_data) +{ + bAnimListElem *ale, *next; + GHash *gh; + int items = 0; + + /* build new hashtable to efficiently store and retrieve which entries have been + * encountered already while searching + */ + gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "animdata_filter_duplis_remove gh"); + + /* loop through items, removing them from the list if a similar item occurs already */ + for (ale = anim_data->first; ale; ale = next) { + next = ale->next; + + /* check if hash has any record of an entry like this + * - just use ale->data for now, though it would be nicer to involve + * ale->type in combination too to capture corner cases (where same data performs differently) + */ + if (BLI_ghash_haskey(gh, ale->data) == 0) { + /* this entry is 'unique' and can be kept */ + BLI_ghash_insert(gh, ale->data, NULL); + items++; + } + else { + /* this entry isn't needed anymore */ + BLI_freelinkN(anim_data, ale); + } + } + + /* free the hash... */ + BLI_ghash_free(gh, NULL, NULL); + + /* return the number of items still in the list */ + return items; +} + /* ----------- Public API --------------- */ /* This function filters the active data source to leave only animation channels suitable for @@ -2551,7 +2596,6 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode /* only filter data if there's somewhere to put it */ if (data && anim_data) { - bAnimListElem *ale, *next; Object *obact= (ac) ? ac->obact : NULL; /* firstly filter the data */ @@ -2596,16 +2640,12 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode break; } - /* remove any weedy entries */ - // XXX this is weedy code! - for (ale= anim_data->first; ale; ale= next) { - next= ale->next; - - if (ale->type == ANIMTYPE_NONE) { - items--; - BLI_freelinkN(anim_data, ale); - } - } + /* remove any 'weedy' entries */ + items = animdata_filter_remove_invalid(anim_data); + + /* remove duplicates (if required) */ + if (filter_mode & ANIMFILTER_NODUPLIS) + items = animdata_filter_remove_duplis(anim_data); } /* return the number of items in the list */ diff --git a/source/blender/editors/animation/anim_intern.h b/source/blender/editors/animation/anim_intern.h index 5602bff77ce..274d33e4833 100644 --- a/source/blender/editors/animation/anim_intern.h +++ b/source/blender/editors/animation/anim_intern.h @@ -33,12 +33,6 @@ /* list of builtin KeyingSets (defined in keyingsets.c) */ extern ListBase builtin_keyingsets; -/* for builtin keyingsets - context poll */ -short keyingset_context_ok_poll(bContext *C, KeyingSet *ks); - -/* Main KeyingSet operations API call */ -short modifykey_get_context_data (bContext *C, ListBase *dsources, KeyingSet *ks); - /* Operator Define Prototypes ------------------- */ /* Main Keyframe Management operators: @@ -71,6 +65,9 @@ void ANIM_OT_keying_set_remove(struct wmOperatorType *ot); void ANIM_OT_keying_set_path_add(struct wmOperatorType *ot); void ANIM_OT_keying_set_path_remove(struct wmOperatorType *ot); +/* KeyingSet general operators */ +void ANIM_OT_keying_set_active_set(struct wmOperatorType *ot); + /* .......... */ /* Driver management operators for UI buttons (RMB menu) */ diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c index 0f29c274535..b71e9ac3507 100644 --- a/source/blender/editors/animation/anim_ipo_utils.c +++ b/source/blender/editors/animation/anim_ipo_utils.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -33,31 +33,16 @@ */ -#include -#include -#include - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_key_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_view3d_types.h" -#include "BKE_animsys.h" -#include "BKE_key.h" #include "BKE_utildefines.h" -#include "UI_resources.h" -#include "ED_anim_api.h" - #include "RNA_access.h" -#include "RNA_types.h" /* ----------------------- Getter functions ----------------------- */ diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index 2888a95f704..65c67691560 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,18 +26,11 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include #include #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_view2d_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "DNA_object_types.h" #include "RNA_access.h" @@ -47,9 +40,7 @@ #include "BLI_blenlib.h" #include "BKE_context.h" -#include "BKE_global.h" #include "BKE_fcurve.h" -#include "BKE_utildefines.h" #include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -67,10 +58,10 @@ #include "ED_markers.h" #include "ED_screen.h" -#include "ED_types.h" #include "ED_util.h" #include "ED_numinput.h" #include "ED_object.h" +#include "ED_types.h" /* ************* Marker API **************** */ @@ -404,7 +395,7 @@ functions: exit() cleanup, send notifier - cancel() to escpae from modal + cancel() to escpae from modal callbacks: @@ -1078,7 +1069,7 @@ static void MARKER_OT_delete(wmOperatorType *ot) static int ed_marker_make_links_scene_exec(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); - Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "type")); + Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene")); TimeMarker *marker, *marker_new; if(scene_to==NULL) { @@ -1119,8 +1110,9 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", ""); + prop= RNA_def_enum(ot->srna, "scene", DummyRNA_NULL_items, 0, "Scene", ""); RNA_def_enum_funcs(prop, RNA_scene_itemf); + ot->prop= prop; } @@ -1209,6 +1201,7 @@ void ED_marker_keymap(wmKeyConfig *keyconf) WM_keymap_verify_item(keymap, "MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "MARKER_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_verify_item(keymap, "MARKER_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, 0, 0); #ifdef DURIAN_CAMERA_SWITCH diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index 4e310e27c5f..11ba3cfffed 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,22 +29,12 @@ #include #include -#include "MEM_guardedalloc.h" - #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" - -#include "BLI_blenlib.h" #include "BKE_context.h" -#include "BKE_utildefines.h" #include "BKE_sound.h" -#include "UI_interface.h" #include "UI_view2d.h" #include "RNA_access.h" @@ -53,9 +43,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_markers.h" #include "ED_screen.h" #include "anim_intern.h" @@ -82,6 +69,7 @@ static void change_frame_apply(bContext *C, wmOperator *op) /* set the new frame number */ CFRA= RNA_int_get(op->ptr, "frame"); FRAMENUMBER_MIN_CLAMP(CFRA); + SUBFRA = 0.f; /* do updates */ sound_seek_scene(C); @@ -374,6 +362,8 @@ void ED_operatortypes_anim(void) WM_operatortype_append(ANIM_OT_keying_set_remove); WM_operatortype_append(ANIM_OT_keying_set_path_add); WM_operatortype_append(ANIM_OT_keying_set_path_remove); + + WM_operatortype_append(ANIM_OT_keying_set_active_set); } void ED_keymap_anim(wmKeyConfig *keyconf) diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c index ababa25917a..3fc228e1c15 100644 --- a/source/blender/editors/animation/drivers.c +++ b/source/blender/editors/animation/drivers.c @@ -27,45 +27,18 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include #include -#include -#include #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" -#include "BLI_math.h" -#include "BLI_dynstr.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_object_types.h" -#include "DNA_material_types.h" -#include "DNA_scene_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_animsys.h" -#include "BKE_action.h" -#include "BKE_constraint.h" #include "BKE_depsgraph.h" #include "BKE_fcurve.h" -#include "BKE_utildefines.h" #include "BKE_context.h" -#include "BKE_report.h" -#include "BKE_key.h" -#include "BKE_material.h" - -#include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_keyframes_edit.h" -#include "ED_screen.h" -#include "ED_util.h" #include "UI_interface.h" @@ -74,7 +47,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" /* ************************************************** */ /* Animation Data Validation */ @@ -225,27 +197,42 @@ short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index, { AnimData *adt; FCurve *fcu; + int success= 0; /* get F-Curve * Note: here is one of the places where we don't want new F-Curve + Driver added! * so 'add' var must be 0 */ /* we don't check the validity of the path here yet, but it should be ok... */ - fcu= verify_driver_fcurve(id, rna_path, array_index, 0); adt= BKE_animdata_from_id(id); - /* only continue if we have an driver to remove */ - if (adt && fcu) { - /* remove F-Curve from driver stack, then free it */ - BLI_remlink(&adt->drivers, fcu); - free_fcurve(fcu); - - /* done successfully */ - return 1; + if(adt) { + if(array_index == -1) { + FCurve *fcu_iter= adt->drivers.first; + while((fcu= iter_step_fcurve(fcu_iter, rna_path))) { + /* store the next fcurve for looping */ + fcu_iter= fcu->next; + + /* remove F-Curve from driver stack, then free it */ + BLI_remlink(&adt->drivers, fcu); + free_fcurve(fcu); + + /* done successfully */ + success |= 1; + } + } + else { + fcu= verify_driver_fcurve(id, rna_path, array_index, 0); + if(fcu) { + BLI_remlink(&adt->drivers, fcu); + free_fcurve(fcu); + + success = 1; + } + } } - - /* failed */ - return 0; + + return success; } /* ************************************************** */ @@ -436,33 +423,21 @@ static int remove_driver_button_exec (bContext *C, wmOperator *op) PropertyRNA *prop= NULL; char *path; short success= 0; - int a, index, length, all= RNA_boolean_get(op->ptr, "all"); + int index, all= RNA_boolean_get(op->ptr, "all"); /* try to find driver using property retrieved from UI */ memset(&ptr, 0, sizeof(PointerRNA)); uiAnimContextProperty(C, &ptr, &prop, &index); + + if (all) + index= -1; if (ptr.data && prop) { path= RNA_path_from_ID_to_property(&ptr, prop); - - if (path) { - if (all) { - length= RNA_property_array_length(&ptr, prop); - - if(length) index= 0; - else length= 1; - } - else - length= 1; - - for (a=0; a -#include -#include -#include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" -#include "BLI_math.h" #include "BLI_blenlib.h" -#include "BLI_editVert.h" -#include "BLI_rand.h" -#include "BKE_animsys.h" -#include "BKE_action.h" #include "BKE_context.h" -#include "BKE_curve.h" -#include "BKE_customdata.h" -#include "BKE_depsgraph.h" #include "BKE_fcurve.h" -#include "BKE_object.h" -#include "BKE_global.h" -#include "BKE_nla.h" -#include "BKE_scene.h" -#include "BKE_screen.h" -#include "BKE_utildefines.h" - -#include "BIF_gl.h" #include "WM_api.h" #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" + +/* ********************************************** */ +/* UI STUFF */ // XXX! -------------------------------- /* temporary definition for limits of float number buttons (FLT_MAX tends to infinity with old system) */ #define UI_FLT_MAX 10000.0f -/* ********************************************** */ - #define B_REDR 1 #define B_FMODIFIER_REDRAW 20 @@ -122,7 +95,7 @@ static void delete_fmodifier_cb (bContext *C, void *fmods_v, void *fcm_v) /* send notifiers */ // XXX for now, this is the only way to get updates in all the right places... but would be nice to have a special one in this case - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } /* --------------- */ @@ -252,14 +225,14 @@ static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm /* add the settings */ col= uiLayoutColumn(layout, 1); - uiItemR(col, "", 0, &ptr, "function_type", 0); - uiItemR(col, NULL, 0, &ptr, "additive", UI_ITEM_R_TOGGLE); + uiItemR(col, &ptr, "function_type", 0, "", 0); + uiItemR(col, &ptr, "additive", UI_ITEM_R_TOGGLE, NULL, 0); col= uiLayoutColumn(layout, 0); // no grouping for now - uiItemR(col, NULL, 0, &ptr, "amplitude", 0); - uiItemR(col, NULL, 0, &ptr, "phase_multiplier", 0); - uiItemR(col, NULL, 0, &ptr, "phase_offset", 0); - uiItemR(col, NULL, 0, &ptr, "value_offset", 0); + uiItemR(col, &ptr, "amplitude", 0, NULL, 0); + uiItemR(col, &ptr, "phase_multiplier", 0, NULL, 0); + uiItemR(col, &ptr, "phase_offset", 0, NULL, 0); + uiItemR(col, &ptr, "value_offset", 0, NULL, 0); } /* --------------- */ @@ -280,15 +253,15 @@ static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, shor /* before range */ col= uiLayoutColumn(split, 1); - uiItemL(col, "Before:", 0); - uiItemR(col, "", 0, &ptr, "before_mode", 0); - uiItemR(col, NULL, 0, &ptr, "before_cycles", 0); + uiItemL(col, "Before:", 0); + uiItemR(col, &ptr, "before_mode", 0, "", 0); + uiItemR(col, &ptr, "before_cycles", 0, NULL, 0); /* after range */ col= uiLayoutColumn(split, 1); - uiItemL(col, "After:", 0); - uiItemR(col, "", 0, &ptr, "after_mode", 0); - uiItemR(col, NULL, 0, &ptr, "after_cycles", 0); + uiItemL(col, "After:", 0); + uiItemR(col, &ptr, "after_mode", 0, "", 0); + uiItemR(col, &ptr, "after_cycles", 0, NULL, 0); } /* --------------- */ @@ -303,20 +276,20 @@ static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short RNA_pointer_create(id, &RNA_FModifierNoise, fcm, &ptr); /* blending mode */ - uiItemR(layout, NULL, 0, &ptr, "modification", 0); + uiItemR(layout, &ptr, "modification", 0, NULL, 0); /* split into 2 columns */ split= uiLayoutSplit(layout, 0.5f, 0); /* col 1 */ col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &ptr, "size", 0); - uiItemR(col, NULL, 0, &ptr, "strength", 0); + uiItemR(col, &ptr, "size", 0, NULL, 0); + uiItemR(col, &ptr, "strength", 0, NULL, 0); /* col 2 */ col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &ptr, "phase", 0); - uiItemR(col, NULL, 0, &ptr, "depth", 0); + uiItemR(col, &ptr, "phase", 0, NULL, 0); + uiItemR(col, &ptr, "depth", 0, NULL, 0); } /* --------------- */ @@ -497,11 +470,11 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh /* general settings */ col= uiLayoutColumn(layout, 1); uiItemL(col, "Envelope:", 0); - uiItemR(col, NULL, 0, &ptr, "reference_value", 0); + uiItemR(col, &ptr, "reference_value", 0, NULL, 0); row= uiLayoutRow(col, 1); - uiItemR(row, "Min", 0, &ptr, "default_minimum", 0); - uiItemR(row, "Max", 0, &ptr, "default_maximum", 0); + uiItemR(row, &ptr, "default_minimum", 0, "Min", 0); + uiItemR(row, &ptr, "default_maximum", 0, "Max", 0); /* control points header */ // TODO: move this control-point control stuff to using the new special widgets for lists @@ -553,16 +526,16 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor /* x-minimum */ col= uiLayoutColumn(split, 1); - uiItemR(col, NULL, 0, &ptr, "use_minimum_x", 0); - uiItemR(col, NULL, 0, &ptr, "minimum_x", 0); + uiItemR(col, &ptr, "use_minimum_x", 0, NULL, 0); + uiItemR(col, &ptr, "minimum_x", 0, NULL, 0); /* y-minimum*/ col= uiLayoutColumn(split, 1); - uiItemR(col, NULL, 0, &ptr, "use_minimum_y", 0); - uiItemR(col, NULL, 0, &ptr, "minimum_y", 0); + uiItemR(col, &ptr, "use_minimum_y", 0, NULL, 0); + uiItemR(col, &ptr, "minimum_y", 0, NULL, 0); } - /* row 2: minimum */ + /* row 2: maximum */ { row= uiLayoutRow(layout, 0); @@ -571,18 +544,50 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor /* x-minimum */ col= uiLayoutColumn(split, 1); - uiItemR(col, NULL, 0, &ptr, "use_maximum_x", 0); - uiItemR(col, NULL, 0, &ptr, "maximum_x", 0); + uiItemR(col, &ptr, "use_maximum_x", 0, NULL, 0); + uiItemR(col, &ptr, "maximum_x", 0, NULL, 0); /* y-minimum*/ col= uiLayoutColumn(split, 1); - uiItemR(col, NULL, 0, &ptr, "use_maximum_y", 0); - uiItemR(col, NULL, 0, &ptr, "maximum_y", 0); + uiItemR(col, &ptr, "use_maximum_y", 0, NULL, 0); + uiItemR(col, &ptr, "maximum_y", 0, NULL, 0); } } /* --------------- */ +/* draw settings for stepped interpolation modifier */ +static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, short width) +{ + uiLayout *col, *subcol; + PointerRNA ptr; + + /* init the RNA-pointer */ + RNA_pointer_create(id, &RNA_FModifierStepped, fcm, &ptr); + + /* block 1: "stepping" settings */ + col= uiLayoutColumn(layout, 0); + uiItemR(col, &ptr, "step_size", 0, NULL, 0); + uiItemR(col, &ptr, "offset", 0, NULL, 0); + + /* block 2: start range settings */ + col= uiLayoutColumn(layout, 1); + uiItemR(col, &ptr, "use_frame_start", 0, NULL, 0); + + subcol = uiLayoutColumn(col, 1); + uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_start")); + uiItemR(subcol, &ptr, "frame_start", 0, NULL, 0); + + /* block 3: end range settings */ + col= uiLayoutColumn(layout, 1); + uiItemR(col, &ptr, "use_frame_end", 0, NULL, 0); + + subcol = uiLayoutColumn(col, 1); + uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_end_frame")); + uiItemR(subcol, &ptr, "frame_end", 0, NULL, 0); +} + +/* --------------- */ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifiers, FModifier *fcm) { @@ -611,10 +616,10 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie uiBlockSetEmboss(block, UI_EMBOSSN); /* expand */ - uiItemR(subrow, "", 0, &ptr, "expanded", UI_ITEM_R_ICON_ONLY); + uiItemR(subrow, &ptr, "expanded", UI_ITEM_R_ICON_ONLY, "", 0); /* checkbox for 'active' status (for now) */ - uiItemR(subrow, "", 0, &ptr, "active", UI_ITEM_R_ICON_ONLY); + uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", 0); /* name */ if (fmi) @@ -628,7 +633,7 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie /* 'mute' button */ - uiItemR(subrow, "", 0, &ptr, "muted", UI_ITEM_R_ICON_ONLY); + uiItemR(subrow, &ptr, "muted", UI_ITEM_R_ICON_ONLY, "", 0); uiBlockSetEmboss(block, UI_EMBOSSN); @@ -669,6 +674,10 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie case FMODIFIER_TYPE_NOISE: /* Noise */ draw_modifier__noise(box, id, fcm, width); break; + + case FMODIFIER_TYPE_STEPPED: /* Stepped */ + draw_modifier__stepped(box, id, fcm, width); + break; default: /* unknown type */ break; @@ -677,3 +686,81 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie } /* ********************************************** */ +/* COPY/PASTE BUFFER STUFF */ + +/* Copy/Paste Buffer itself (list of FModifier 's) */ +static ListBase fmodifier_copypaste_buf = {NULL, NULL}; + +/* ---------- */ + +/* free the copy/paste buffer */ +void free_fmodifiers_copybuf (void) +{ + /* just free the whole buffer */ + free_fmodifiers(&fmodifier_copypaste_buf); +} + +/* copy the given F-Modifiers to the buffer, returning whether anything was copied or not + * assuming that the buffer has been cleared already with free_fmodifiers_copybuf() + * - active: only copy the active modifier + */ +short ANIM_fmodifiers_copy_to_buf (ListBase *modifiers, short active) +{ + short ok = 1; + + /* sanity checks */ + if ELEM(NULL, modifiers, modifiers->first) + return 0; + + /* copy the whole list, or just the active one? */ + if (active) { + FModifier *fcm = find_active_fmodifier(modifiers); + + if (fcm) { + FModifier *fcmN = copy_fmodifier(fcm); + BLI_addtail(&fmodifier_copypaste_buf, fcmN); + } + else + ok = 0; + } + else + copy_fmodifiers(&fmodifier_copypaste_buf, modifiers); + + /* did we succeed? */ + return ok; +} + +/* 'Paste' the F-Modifier(s) from the buffer to the specified list + * - replace: free all the existing modifiers to leave only the pasted ones + */ +short ANIM_fmodifiers_paste_from_buf (ListBase *modifiers, short replace) +{ + FModifier *fcm; + short ok = 0; + + /* sanity checks */ + if (modifiers == NULL) + return 0; + + /* if replacing the list, free the existing modifiers */ + if (replace) + free_fmodifiers(modifiers); + + /* now copy over all the modifiers in the buffer to the end of the list */ + for (fcm= fmodifier_copypaste_buf.first; fcm; fcm= fcm->next) { + /* make a copy of it */ + FModifier *fcmN = copy_fmodifier(fcm); + + /* make sure the new one isn't active, otherwise the list may get several actives */ + fcmN->flag &= ~FMODIFIER_FLAG_ACTIVE; + + /* now add it to the end of the list */ + BLI_addtail(modifiers, fcmN); + ok = 1; + } + + /* did we succeed? */ + return ok; +} + +/* ********************************************** */ diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c index 011422eb65c..2290909325e 100644 --- a/source/blender/editors/animation/keyframes_draw.c +++ b/source/blender/editors/animation/keyframes_draw.c @@ -34,26 +34,17 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_dlrbTree.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_mesh_types.h" @@ -61,11 +52,7 @@ #include "DNA_meta_types.h" #include "DNA_node_types.h" #include "DNA_particle_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" #include "DNA_world_types.h" -#include "DNA_view2d_types.h" #include "BKE_action.h" #include "BKE_depsgraph.h" @@ -80,16 +67,11 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "UI_interface.h" -#include "UI_interface_icons.h" #include "UI_resources.h" #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_keyframing.h" #include "ED_keyframes_draw.h" -#include "ED_screen.h" -#include "ED_space_api.h" /* *************************** Keyframe Processing *************************** */ @@ -258,7 +240,7 @@ static BezTriple *abk_get_bezt_with_value (ActBeztColumn *abk, float value) /* look over each BezTriple in this container */ for (i = 0; i < abk->numBezts; i++) { /* only do exact match for now... */ - if (i >= sizeof(abk->bezts)/sizeof(BezTriple)) { + if (/*i >= MAX_ABK_BUFSIZE*/0) { // TODO: this case needs special handling } else { @@ -301,7 +283,7 @@ static void add_bezt_to_keyblocks_list(DLRBT_Tree *blocks, DLRBT_Tree *beztTree, abk= (ActBeztColumn *)BLI_dlrbTree_search_prev(beztTree, compare_abk_bezt, beztn); /* if applicable, the BezTriple with the same value */ prev= (abk) ? abk_get_bezt_with_value(abk, beztn->vec[1][1]) : NULL; - + /* check if block needed - same value(s)? * -> firstly, handles must have same central value as each other * -> secondly, handles which control that section of the curve must be constant diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c index ca1df14e14c..3175e9e34a7 100644 --- a/source/blender/editors/animation/keyframes_edit.c +++ b/source/blender/editors/animation/keyframes_edit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -35,10 +35,8 @@ #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_mesh_types.h" @@ -47,7 +45,6 @@ #include "DNA_meta_types.h" #include "DNA_node_types.h" #include "DNA_particle_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_world_types.h" @@ -64,7 +61,7 @@ /* This file defines an API and set of callback-operators for non-destructive editing of keyframe data. * * Two API functions are defined for actually performing the operations on the data: - * ANIM_fcurve_keys_bezier_loop() + * ANIM_fcurve_keyframes_loop() * which take the data they operate on, a few callbacks defining what operations to perform. * * As operators which work on keyframes usually apply the same operation on all BezTriples in @@ -87,56 +84,66 @@ /* This function is used to loop over BezTriples in the given F-Curve, applying a given * operation on them, and optionally applies an F-Curve validation function afterwards. */ -short ANIM_fcurve_keys_bezier_loop(BeztEditData *bed, FCurve *fcu, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb) +// TODO: make this function work on samples too... +short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, FCurve *fcu, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb) { - BezTriple *bezt; - int i; - + BezTriple *bezt; + short ok = 0; + int i; + /* sanity check */ if (ELEM(NULL, fcu, fcu->bezt)) return 0; - + /* set the F-Curve into the editdata so that it can be accessed */ - if (bed) { - bed->fcu= fcu; - bed->curIndex= 0; - } - + if (ked) { + ked->fcu= fcu; + ked->curIndex= 0; + ked->curflags= ok; + } + /* if function to apply to bezier curves is set, then loop through executing it on beztriples */ - if (bezt_cb) { + if (key_cb) { /* if there's a validation func, include that check in the loop * (this is should be more efficient than checking for it in every loop) */ - if (bezt_ok) { + if (key_ok) { for (bezt=fcu->bezt, i=0; i < fcu->totvert; bezt++, i++) { - if (bed) bed->curIndex= i; + if (ked) { + /* advance the index, and reset the ok flags (to not influence the result) */ + ked->curIndex= i; + ked->curflags= 0; + } /* Only operate on this BezTriple if it fullfills the criteria of the validation func */ - if (bezt_ok(bed, bezt)) { + if ( (ok = key_ok(ked, bezt)) ) { + if (ked) ked->curflags= ok; + /* Exit with return-code '1' if function returns positive * This is useful if finding if some BezTriple satisfies a condition. */ - if (bezt_cb(bed, bezt)) return 1; + if (key_cb(ked, bezt)) return 1; } } } else { for (bezt=fcu->bezt, i=0; i < fcu->totvert; bezt++, i++) { - if (bed) bed->curIndex= i; + if (ked) ked->curIndex= i; /* Exit with return-code '1' if function returns positive - * This is useful if finding if some BezTriple satisfies a condition. - */ - if (bezt_cb(bed, bezt)) return 1; + * This is useful if finding if some BezTriple satisfies a condition. + */ + if (key_cb(ked, bezt)) return 1; } } - } + } /* unset the F-Curve from the editdata now that it's done */ - if (bed) { - bed->fcu= NULL; - bed->curIndex= 0; - } + if (ked) { + ked->fcu= NULL; + ked->curIndex= 0; + ked->curflags= 0; + } /* if fcu_cb (F-Curve post-editing callback) has been specified then execute it */ if (fcu_cb) @@ -149,7 +156,7 @@ short ANIM_fcurve_keys_bezier_loop(BeztEditData *bed, FCurve *fcu, BeztEditFunc /* -------------------------------- Further Abstracted (Not Exposed Directly) ----------------------------- */ /* This function is used to loop over the keyframe data in an Action Group */ -static short agrp_keys_bezier_loop(BeztEditData *bed, bActionGroup *agrp, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb) +static short agrp_keyframes_loop(KeyframeEditData *ked, bActionGroup *agrp, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb) { FCurve *fcu; @@ -159,7 +166,7 @@ static short agrp_keys_bezier_loop(BeztEditData *bed, bActionGroup *agrp, BeztEd /* only iterate over the F-Curves that are in this group */ for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcu->next) { - if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, fcu_cb)) + if (ANIM_fcurve_keyframes_loop(ked, fcu, key_ok, key_cb, fcu_cb)) return 1; } @@ -167,7 +174,7 @@ static short agrp_keys_bezier_loop(BeztEditData *bed, bActionGroup *agrp, BeztEd } /* This function is used to loop over the keyframe data in an Action */ -static short act_keys_bezier_loop(BeztEditData *bed, bAction *act, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb) +static short act_keyframes_loop(KeyframeEditData *ked, bAction *act, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb) { FCurve *fcu; @@ -177,7 +184,7 @@ static short act_keys_bezier_loop(BeztEditData *bed, bAction *act, BeztEditFunc /* just loop through all F-Curves */ for (fcu= act->curves.first; fcu; fcu= fcu->next) { - if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, fcu_cb)) + if (ANIM_fcurve_keyframes_loop(ked, fcu, key_ok, key_cb, fcu_cb)) return 1; } @@ -185,7 +192,7 @@ static short act_keys_bezier_loop(BeztEditData *bed, bAction *act, BeztEditFunc } /* This function is used to loop over the keyframe data of an AnimData block */ -static short adt_keys_bezier_loop(BeztEditData *bed, AnimData *adt, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +static short adt_keyframes_loop(KeyframeEditData *ked, AnimData *adt, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag) { /* sanity check */ if (adt == NULL) @@ -197,13 +204,13 @@ static short adt_keys_bezier_loop(BeztEditData *bed, AnimData *adt, BeztEditFunc /* just loop through all F-Curves acting as Drivers */ for (fcu= adt->drivers.first; fcu; fcu= fcu->next) { - if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, fcu_cb)) + if (ANIM_fcurve_keyframes_loop(ked, fcu, key_ok, key_cb, fcu_cb)) return 1; } } else if (adt->action) { /* call the function for actions */ - if (act_keys_bezier_loop(bed, adt->action, bezt_ok, bezt_cb, fcu_cb)) + if (act_keyframes_loop(ked, adt->action, key_ok, key_cb, fcu_cb)) return 1; } @@ -211,7 +218,7 @@ static short adt_keys_bezier_loop(BeztEditData *bed, AnimData *adt, BeztEditFunc } /* This function is used to loop over the keyframe data in an Object */ -static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +static short ob_keyframes_loop(KeyframeEditData *ked, Object *ob, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag) { Key *key= ob_get_key(ob); @@ -221,13 +228,13 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez /* firstly, Object's own AnimData */ if (ob->adt) { - if (adt_keys_bezier_loop(bed, ob->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, ob->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } /* shapekeys */ if ((key && key->adt) && !(filterflag & ADS_FILTER_NOSHAPEKEYS)) { - if (adt_keys_bezier_loop(bed, key->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, key->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } @@ -243,7 +250,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez continue; /* add material's data */ - if (adt_keys_bezier_loop(bed, ma->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, ma->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -255,7 +262,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez Camera *ca= (Camera *)ob->data; if ((ca->adt) && !(filterflag & ADS_FILTER_NOCAM)) { - if (adt_keys_bezier_loop(bed, ca->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, ca->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -265,7 +272,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez Lamp *la= (Lamp *)ob->data; if ((la->adt) && !(filterflag & ADS_FILTER_NOLAM)) { - if (adt_keys_bezier_loop(bed, la->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, la->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -277,7 +284,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez Curve *cu= (Curve *)ob->data; if ((cu->adt) && !(filterflag & ADS_FILTER_NOCUR)) { - if (adt_keys_bezier_loop(bed, cu->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, cu->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -287,7 +294,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez MetaBall *mb= (MetaBall *)ob->data; if ((mb->adt) && !(filterflag & ADS_FILTER_NOMBA)) { - if (adt_keys_bezier_loop(bed, mb->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, mb->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -297,7 +304,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez bArmature *arm= (bArmature *)ob->data; if ((arm->adt) && !(filterflag & ADS_FILTER_NOARM)) { - if (adt_keys_bezier_loop(bed, arm->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, arm->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -307,7 +314,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez Mesh *me= (Mesh *)ob->data; if ((me->adt) && !(filterflag & ADS_FILTER_NOMESH)) { - if (adt_keys_bezier_loop(bed, me->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, me->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -322,7 +329,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez if (ELEM(NULL, psys->part, psys->part->adt)) continue; - if (adt_keys_bezier_loop(bed, psys->part->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, psys->part->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } } @@ -331,7 +338,7 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez } /* This function is used to loop over the keyframe data in a Scene */ -static short scene_keys_bezier_loop(BeztEditData *bed, Scene *sce, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +static short scene_keyframes_loop(KeyframeEditData *ked, Scene *sce, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag) { World *wo= (sce) ? sce->world : NULL; bNodeTree *ntree= (sce) ? sce->nodetree : NULL; @@ -342,19 +349,19 @@ static short scene_keys_bezier_loop(BeztEditData *bed, Scene *sce, BeztEditFunc /* Scene's own animation */ if (sce->adt) { - if (adt_keys_bezier_loop(bed, sce->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, sce->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } /* World */ if (wo && wo->adt) { - if (adt_keys_bezier_loop(bed, wo->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, wo->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } /* NodeTree */ if (ntree && ntree->adt) { - if (adt_keys_bezier_loop(bed, ntree->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + if (adt_keyframes_loop(ked, ntree->adt, key_ok, key_cb, fcu_cb, filterflag)) return 1; } @@ -363,7 +370,7 @@ static short scene_keys_bezier_loop(BeztEditData *bed, Scene *sce, BeztEditFunc } /* This function is used to loop over the keyframe data in a DopeSheet summary */ -static short summary_keys_bezier_loop(BeztEditData *bed, bAnimContext *ac, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -379,7 +386,7 @@ static short summary_keys_bezier_loop(BeztEditData *bed, bAnimContext *ac, BeztE /* loop through each F-Curve, working on the keyframes until the first curve aborts */ for (ale= anim_data.first; ale; ale= ale->next) { - ret_code= ANIM_fcurve_keys_bezier_loop(bed, ale->data, bezt_ok, bezt_cb, fcu_cb); + ret_code= ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb); if (ret_code) break; @@ -393,7 +400,7 @@ static short summary_keys_bezier_loop(BeztEditData *bed, bAnimContext *ac, BeztE /* --- */ /* This function is used to apply operation to all keyframes, regardless of the type */ -short ANIM_animchannel_keys_bezier_loop(BeztEditData *bed, bAnimListElem *ale, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +short ANIM_animchannel_keyframes_loop(KeyframeEditData *ked, bAnimListElem *ale, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag) { /* sanity checks */ if (ale == NULL) @@ -403,29 +410,29 @@ short ANIM_animchannel_keys_bezier_loop(BeztEditData *bed, bAnimListElem *ale, B switch (ale->datatype) { /* direct keyframe data (these loops are exposed) */ case ALE_FCURVE: /* F-Curve */ - return ANIM_fcurve_keys_bezier_loop(bed, ale->key_data, bezt_ok, bezt_cb, fcu_cb); + return ANIM_fcurve_keyframes_loop(ked, ale->key_data, key_ok, key_cb, fcu_cb); /* indirect 'summaries' (these are not exposed directly) * NOTE: must keep this code in sync with the drawing code and also the filtering code! */ case ALE_GROUP: /* action group */ - return agrp_keys_bezier_loop(bed, (bActionGroup *)ale->data, bezt_ok, bezt_cb, fcu_cb); + return agrp_keyframes_loop(ked, (bActionGroup *)ale->data, key_ok, key_cb, fcu_cb); case ALE_ACT: /* action */ - return act_keys_bezier_loop(bed, (bAction *)ale->key_data, bezt_ok, bezt_cb, fcu_cb); + return act_keyframes_loop(ked, (bAction *)ale->key_data, key_ok, key_cb, fcu_cb); case ALE_OB: /* object */ - return ob_keys_bezier_loop(bed, (Object *)ale->key_data, bezt_ok, bezt_cb, fcu_cb, filterflag); + return ob_keyframes_loop(ked, (Object *)ale->key_data, key_ok, key_cb, fcu_cb, filterflag); case ALE_SCE: /* scene */ - return scene_keys_bezier_loop(bed, (Scene *)ale->data, bezt_ok, bezt_cb, fcu_cb, filterflag); + return scene_keyframes_loop(ked, (Scene *)ale->data, key_ok, key_cb, fcu_cb, filterflag); case ALE_ALL: /* 'all' (DopeSheet summary) */ - return summary_keys_bezier_loop(bed, (bAnimContext *)ale->data, bezt_ok, bezt_cb, fcu_cb, filterflag); + return summary_keyframes_loop(ked, (bAnimContext *)ale->data, key_ok, key_cb, fcu_cb, filterflag); } return 0; } /* This function is used to apply operation to all keyframes, regardless of the type without needed an AnimListElem wrapper */ -short ANIM_animchanneldata_keys_bezier_loop(BeztEditData *bed, void *data, int keytype, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +short ANIM_animchanneldata_keyframes_loop(KeyframeEditData *ked, void *data, int keytype, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag) { /* sanity checks */ if (data == NULL) @@ -435,22 +442,22 @@ short ANIM_animchanneldata_keys_bezier_loop(BeztEditData *bed, void *data, int k switch (keytype) { /* direct keyframe data (these loops are exposed) */ case ALE_FCURVE: /* F-Curve */ - return ANIM_fcurve_keys_bezier_loop(bed, data, bezt_ok, bezt_cb, fcu_cb); + return ANIM_fcurve_keyframes_loop(ked, data, key_ok, key_cb, fcu_cb); /* indirect 'summaries' (these are not exposed directly) * NOTE: must keep this code in sync with the drawing code and also the filtering code! */ case ALE_GROUP: /* action group */ - return agrp_keys_bezier_loop(bed, (bActionGroup *)data, bezt_ok, bezt_cb, fcu_cb); + return agrp_keyframes_loop(ked, (bActionGroup *)data, key_ok, key_cb, fcu_cb); case ALE_ACT: /* action */ - return act_keys_bezier_loop(bed, (bAction *)data, bezt_ok, bezt_cb, fcu_cb); + return act_keyframes_loop(ked, (bAction *)data, key_ok, key_cb, fcu_cb); case ALE_OB: /* object */ - return ob_keys_bezier_loop(bed, (Object *)data, bezt_ok, bezt_cb, fcu_cb, filterflag); + return ob_keyframes_loop(ked, (Object *)data, key_ok, key_cb, fcu_cb, filterflag); case ALE_SCE: /* scene */ - return scene_keys_bezier_loop(bed, (Scene *)data, bezt_ok, bezt_cb, fcu_cb, filterflag); + return scene_keyframes_loop(ked, (Scene *)data, key_ok, key_cb, fcu_cb, filterflag); case ALE_ALL: /* 'all' (DopeSheet summary) */ - return summary_keys_bezier_loop(bed, (bAnimContext *)data, bezt_ok, bezt_cb, fcu_cb, filterflag); + return summary_keyframes_loop(ked, (bAnimContext *)data, key_ok, key_cb, fcu_cb, filterflag); } return 0; @@ -487,50 +494,113 @@ void ANIM_editkeyframes_refresh(bAnimContext *ac) /* ************************************************************************** */ /* BezTriple Validation Callbacks */ -static short ok_bezier_frame(BeztEditData *bed, BezTriple *bezt) +/* ------------------------ */ +/* Some macros to make this easier... */ + +/* run the given check on the 3 handles + * - check should be a macro, which takes the handle index as its single arg, which it substitutes later + * - requires that a var, of type short, is named 'ok', and has been initialised ot 0 + */ +#define KEYFRAME_OK_CHECKS(check) \ + { \ + if (check(1)) \ + ok |= KEYFRAME_OK_KEY; \ + \ + if (ked && (ked->iterflags & KEYFRAME_ITER_INCL_HANDLES)) { \ + if (check(0)) \ + ok |= KEYFRAME_OK_H1; \ + if (check(2)) \ + ok |= KEYFRAME_OK_H2; \ + } \ + } + +/* ------------------------ */ + +static short ok_bezier_frame(KeyframeEditData *ked, BezTriple *bezt) { + short ok = 0; + /* frame is stored in f1 property (this float accuracy check may need to be dropped?) */ - return IS_EQ(bezt->vec[1][0], bed->f1); + #define KEY_CHECK_OK(_index) IS_EQ(bezt->vec[_index][0], ked->f1) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); + #undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } -static short ok_bezier_framerange(BeztEditData *bed, BezTriple *bezt) +static short ok_bezier_framerange(KeyframeEditData *ked, BezTriple *bezt) { + short ok = 0; + /* frame range is stored in float properties */ - return ((bezt->vec[1][0] > bed->f1) && (bezt->vec[1][0] < bed->f2)); + #define KEY_CHECK_OK(_index) ((bezt->vec[_index][0] > ked->f1) && (bezt->vec[_index][0] < ked->f2)) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); + #undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } -static short ok_bezier_selected(BeztEditData *bed, BezTriple *bezt) +static short ok_bezier_selected(KeyframeEditData *ked, BezTriple *bezt) { - /* this macro checks all beztriple handles for selection... */ - return BEZSELECTED(bezt); + /* this macro checks all beztriple handles for selection... + * only one of the verts has to be selected for this to be ok... + */ + if (BEZSELECTED(bezt)) + return KEYFRAME_OK_ALL; + else + return 0; } -static short ok_bezier_value(BeztEditData *bed, BezTriple *bezt) -{ +static short ok_bezier_value(KeyframeEditData *ked, BezTriple *bezt) +{ + short ok = 0; + /* value is stored in f1 property * - this float accuracy check may need to be dropped? * - should value be stored in f2 instead so that we won't have conflicts when using f1 for frames too? */ - return IS_EQ(bezt->vec[1][1], bed->f1); + #define KEY_CHECK_OK(_index) IS_EQ(bezt->vec[_index][1], ked->f1) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); + #undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } -static short ok_bezier_valuerange(BeztEditData *bed, BezTriple *bezt) +static short ok_bezier_valuerange(KeyframeEditData *ked, BezTriple *bezt) { + short ok = 0; + /* value range is stored in float properties */ - return ((bezt->vec[1][1] > bed->f1) && (bezt->vec[1][1] < bed->f2)); + #define KEY_CHECK_OK(_index) ((bezt->vec[_index][1] > ked->f1) && (bezt->vec[_index][1] < ked->f2)) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); + #undef KEY_CHECK_OK + + /* return ok flags */ + return ok; } -static short ok_bezier_region(BeztEditData *bed, BezTriple *bezt) +static short ok_bezier_region(KeyframeEditData *ked, BezTriple *bezt) { /* rect is stored in data property (it's of type rectf, but may not be set) */ - if (bed->data) - return BLI_in_rctf(bed->data, bezt->vec[1][0], bezt->vec[1][1]); + if (ked->data) { + short ok = 0; + + #define KEY_CHECK_OK(_index) BLI_in_rctf(ked->data, bezt->vec[_index][0], bezt->vec[_index][1]) + KEYFRAME_OK_CHECKS(KEY_CHECK_OK); + #undef KEY_CHECK_OK + + /* return ok flags */ + return ok; + } else return 0; } -BeztEditFunc ANIM_editkeyframes_ok(short mode) +KeyframeEditFunc ANIM_editkeyframes_ok(short mode) { /* eEditKeyframes_Validate */ switch (mode) { @@ -555,32 +625,32 @@ BeztEditFunc ANIM_editkeyframes_ok(short mode) /* Assorted Utility Functions */ /* helper callback for _cfrasnap_exec() -> used to help get the average time of all selected beztriples */ -short bezt_calc_average(BeztEditData *bed, BezTriple *bezt) +short bezt_calc_average(KeyframeEditData *ked, BezTriple *bezt) { /* only if selected */ if (bezt->f2 & SELECT) { /* store average time in float 1 (only do rounding at last step) */ - bed->f1 += bezt->vec[1][0]; + ked->f1 += bezt->vec[1][0]; /* store average value in float 2 (only do rounding at last step) * - this isn't always needed, but some operators may also require this */ - bed->f2 += bezt->vec[1][1]; + ked->f2 += bezt->vec[1][1]; /* increment number of items */ - bed->i1++; + ked->i1++; } return 0; } /* helper callback for columnselect__keys() -> populate list CfraElems with frame numbers from selected beztriples */ -short bezt_to_cfraelem(BeztEditData *bed, BezTriple *bezt) +short bezt_to_cfraelem(KeyframeEditData *ked, BezTriple *bezt) { /* only if selected */ if (bezt->f2 & SELECT) { CfraElem *ce= MEM_callocN(sizeof(CfraElem), "cfraElem"); - BLI_addtail(&bed->list, ce); + BLI_addtail(&ked->list, ce); ce->cfra= bezt->vec[1][0]; } @@ -589,11 +659,11 @@ short bezt_to_cfraelem(BeztEditData *bed, BezTriple *bezt) } /* used to remap times from one range to another - * requires: bed->data = BeztEditCD_Remap + * requires: ked->data = KeyframeEditCD_Remap */ -void bezt_remap_times(BeztEditData *bed, BezTriple *bezt) +void bezt_remap_times(KeyframeEditData *ked, BezTriple *bezt) { - BeztEditCD_Remap *rmap= (BeztEditCD_Remap*)bed->data; + KeyframeEditCD_Remap *rmap= (KeyframeEditCD_Remap*)ked->data; const float scale = (rmap->newMax - rmap->newMin) / (rmap->oldMax - rmap->oldMin); /* perform transform on all three handles unless indicated otherwise */ @@ -607,16 +677,18 @@ void bezt_remap_times(BeztEditData *bed, BezTriple *bezt) /* ******************************************* */ /* Transform */ -static short snap_bezier_nearest(BeztEditData *bed, BezTriple *bezt) +/* snaps the keyframe to the nearest frame */ +static short snap_bezier_nearest(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) bezt->vec[1][0]= (float)(floor(bezt->vec[1][0]+0.5)); return 0; } -static short snap_bezier_nearestsec(BeztEditData *bed, BezTriple *bezt) +/* snaps the keyframe to the neares second */ +static short snap_bezier_nearestsec(KeyframeEditData *ked, BezTriple *bezt) { - const Scene *scene= bed->scene; + const Scene *scene= ked->scene; const float secf = (float)FPS; if (bezt->f2 & SELECT) @@ -624,41 +696,44 @@ static short snap_bezier_nearestsec(BeztEditData *bed, BezTriple *bezt) return 0; } -static short snap_bezier_cframe(BeztEditData *bed, BezTriple *bezt) +/* snaps the keyframe to the current frame */ +static short snap_bezier_cframe(KeyframeEditData *ked, BezTriple *bezt) { - const Scene *scene= bed->scene; + const Scene *scene= ked->scene; if (bezt->f2 & SELECT) bezt->vec[1][0]= (float)CFRA; return 0; } -static short snap_bezier_nearmarker(BeztEditData *bed, BezTriple *bezt) +/* snaps the keyframe time to the nearest marker's frame */ +static short snap_bezier_nearmarker(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) - bezt->vec[1][0]= (float)ED_markers_find_nearest_marker_time(&bed->list, bezt->vec[1][0]); + bezt->vec[1][0]= (float)ED_markers_find_nearest_marker_time(&ked->list, bezt->vec[1][0]); return 0; } -static short snap_bezier_horizontal(BeztEditData *bed, BezTriple *bezt) +/* make the handles have the same value as the key */ +static short snap_bezier_horizontal(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) { - // XXX currently this snaps both handles to the nearest horizontal value, but perhaps user just wants to level out handles instead? - bezt->vec[0][1]= bezt->vec[2][1]= (float)floor(bezt->vec[1][1] + 0.5f); + bezt->vec[0][1]= bezt->vec[2][1]= bezt->vec[1][1]; + if ((bezt->h1==HD_AUTO) || (bezt->h1==HD_VECT)) bezt->h1= HD_ALIGN; if ((bezt->h2==HD_AUTO) || (bezt->h2==HD_VECT)) bezt->h2= HD_ALIGN; } return 0; } -static short snap_bezier_value(BeztEditData *bed, BezTriple *bezt) +/* value to snap to is stored in the custom data -> first float value slot */ +static short snap_bezier_value(KeyframeEditData *ked, BezTriple *bezt) { - /* value to snap to is stored in the custom data -> first float value slot */ if (bezt->f2 & SELECT) - bezt->vec[1][1]= bed->f1; + bezt->vec[1][1]= ked->f1; return 0; } -BeztEditFunc ANIM_editkeyframes_snap(short type) +KeyframeEditFunc ANIM_editkeyframes_snap(short type) { /* eEditKeyframes_Snap */ switch (type) { @@ -681,9 +756,9 @@ BeztEditFunc ANIM_editkeyframes_snap(short type) /* --------- */ -static short mirror_bezier_cframe(BeztEditData *bed, BezTriple *bezt) +static short mirror_bezier_cframe(KeyframeEditData *ked, BezTriple *bezt) { - const Scene *scene= bed->scene; + const Scene *scene= ked->scene; float diff; if (bezt->f2 & SELECT) { @@ -694,7 +769,7 @@ static short mirror_bezier_cframe(BeztEditData *bed, BezTriple *bezt) return 0; } -static short mirror_bezier_yaxis(BeztEditData *bed, BezTriple *bezt) +static short mirror_bezier_yaxis(KeyframeEditData *ked, BezTriple *bezt) { float diff; @@ -706,7 +781,7 @@ static short mirror_bezier_yaxis(BeztEditData *bed, BezTriple *bezt) return 0; } -static short mirror_bezier_xaxis(BeztEditData *bed, BezTriple *bezt) +static short mirror_bezier_xaxis(KeyframeEditData *ked, BezTriple *bezt) { float diff; @@ -718,25 +793,25 @@ static short mirror_bezier_xaxis(BeztEditData *bed, BezTriple *bezt) return 0; } -static short mirror_bezier_marker(BeztEditData *bed, BezTriple *bezt) +static short mirror_bezier_marker(KeyframeEditData *ked, BezTriple *bezt) { /* mirroring time stored in f1 */ if (bezt->f2 & SELECT) { - const float diff= (bed->f1 - bezt->vec[1][0]); - bezt->vec[1][0]= (bed->f1 + diff); + const float diff= (ked->f1 - bezt->vec[1][0]); + bezt->vec[1][0]= (ked->f1 + diff); } return 0; } -static short mirror_bezier_value(BeztEditData *bed, BezTriple *bezt) +static short mirror_bezier_value(KeyframeEditData *ked, BezTriple *bezt) { float diff; /* value to mirror over is stored in the custom data -> first float value slot */ if (bezt->f2 & SELECT) { - diff= (bed->f1 - bezt->vec[1][1]); - bezt->vec[1][1]= (bed->f1 + diff); + diff= (ked->f1 - bezt->vec[1][1]); + bezt->vec[1][1]= (ked->f1 + diff); } return 0; @@ -744,7 +819,7 @@ static short mirror_bezier_value(BeztEditData *bed, BezTriple *bezt) /* Note: for markers and 'value', the values to use must be supplied as the first float value */ // calchandles_fcurve -BeztEditFunc ANIM_editkeyframes_mirror(short type) +KeyframeEditFunc ANIM_editkeyframes_mirror(short type) { switch (type) { case MIRROR_KEYS_CURFRAME: /* mirror over current frame */ @@ -767,7 +842,7 @@ BeztEditFunc ANIM_editkeyframes_mirror(short type) /* Settings */ /* Sets the selected bezier handles to type 'auto' */ -static short set_bezier_auto(BeztEditData *bed, BezTriple *bezt) +static short set_bezier_auto(KeyframeEditData *ked, BezTriple *bezt) { if((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) { if (bezt->f1 & SELECT) bezt->h1= HD_AUTO; /* the secret code for auto */ @@ -785,7 +860,7 @@ static short set_bezier_auto(BeztEditData *bed, BezTriple *bezt) } /* Sets the selected bezier handles to type 'vector' */ -static short set_bezier_vector(BeztEditData *bed, BezTriple *bezt) +static short set_bezier_vector(KeyframeEditData *ked, BezTriple *bezt) { if ((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) { if (bezt->f1 & SELECT) bezt->h1= HD_VECT; @@ -805,7 +880,7 @@ static short set_bezier_vector(BeztEditData *bed, BezTriple *bezt) /* Queries if the handle should be set to 'free' or 'align' */ // NOTE: this was used for the 'toggle free/align' option // currently this isn't used, but may be restored later -static short bezier_isfree(BeztEditData *bed, BezTriple *bezt) +static short bezier_isfree(KeyframeEditData *ked, BezTriple *bezt) { if ((bezt->f1 & SELECT) && (bezt->h1)) return 1; if ((bezt->f3 & SELECT) && (bezt->h2)) return 1; @@ -813,7 +888,7 @@ static short bezier_isfree(BeztEditData *bed, BezTriple *bezt) } /* Sets selected bezier handles to type 'align' */ -static short set_bezier_align(BeztEditData *bed, BezTriple *bezt) +static short set_bezier_align(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f1 & SELECT) bezt->h1= HD_ALIGN; if (bezt->f3 & SELECT) bezt->h2= HD_ALIGN; @@ -821,7 +896,7 @@ static short set_bezier_align(BeztEditData *bed, BezTriple *bezt) } /* Sets selected bezier handles to type 'free' */ -static short set_bezier_free(BeztEditData *bed, BezTriple *bezt) +static short set_bezier_free(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f1 & SELECT) bezt->h1= HD_FREE; if (bezt->f3 & SELECT) bezt->h2= HD_FREE; @@ -830,7 +905,7 @@ static short set_bezier_free(BeztEditData *bed, BezTriple *bezt) /* Set all selected Bezier Handles to a single type */ // calchandles_fcurve -BeztEditFunc ANIM_editkeyframes_handles(short code) +KeyframeEditFunc ANIM_editkeyframes_handles(short code) { switch (code) { case HD_AUTO: /* auto */ @@ -851,21 +926,21 @@ BeztEditFunc ANIM_editkeyframes_handles(short code) /* ------- */ -static short set_bezt_constant(BeztEditData *bed, BezTriple *bezt) +static short set_bezt_constant(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) bezt->ipo= BEZT_IPO_CONST; return 0; } -static short set_bezt_linear(BeztEditData *bed, BezTriple *bezt) +static short set_bezt_linear(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) bezt->ipo= BEZT_IPO_LIN; return 0; } -static short set_bezt_bezier(BeztEditData *bed, BezTriple *bezt) +static short set_bezt_bezier(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) bezt->ipo= BEZT_IPO_BEZ; @@ -874,7 +949,7 @@ static short set_bezt_bezier(BeztEditData *bed, BezTriple *bezt) /* Set the interpolation type of the selected BezTriples in each F-Curve to the specified one */ // ANIM_editkeyframes_ipocurve_ipotype() ! -BeztEditFunc ANIM_editkeyframes_ipo(short code) +KeyframeEditFunc ANIM_editkeyframes_ipo(short code) { switch (code) { case BEZT_IPO_CONST: /* constant */ @@ -888,21 +963,21 @@ BeztEditFunc ANIM_editkeyframes_ipo(short code) /* ------- */ -static short set_keytype_keyframe(BeztEditData *bed, BezTriple *bezt) +static short set_keytype_keyframe(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) BEZKEYTYPE(bezt)= BEZT_KEYTYPE_KEYFRAME; return 0; } -static short set_keytype_breakdown(BeztEditData *bed, BezTriple *bezt) +static short set_keytype_breakdown(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) BEZKEYTYPE(bezt)= BEZT_KEYTYPE_BREAKDOWN; return 0; } -static short set_keytype_extreme(BeztEditData *bed, BezTriple *bezt) +static short set_keytype_extreme(KeyframeEditData *ked, BezTriple *bezt) { if (bezt->f2 & SELECT) BEZKEYTYPE(bezt)= BEZT_KEYTYPE_EXTREME; @@ -910,7 +985,7 @@ static short set_keytype_extreme(BeztEditData *bed, BezTriple *bezt) } /* Set the interpolation type of the selected BezTriples in each F-Curve to the specified one */ -BeztEditFunc ANIM_editkeyframes_keytype(short code) +KeyframeEditFunc ANIM_editkeyframes_keytype(short code) { switch (code) { case BEZT_KEYTYPE_BREAKDOWN: /* breakdown */ @@ -928,23 +1003,45 @@ BeztEditFunc ANIM_editkeyframes_keytype(short code) /* ******************************************* */ /* Selection */ -static short select_bezier_add(BeztEditData *bed, BezTriple *bezt) +static short select_bezier_add(KeyframeEditData *ked, BezTriple *bezt) { - /* Select the bezier triple */ - BEZ_SEL(bezt); + /* if we've got info on what to select, use it, otherwise select all */ + if ((ked) && (ked->iterflags & KEYFRAME_ITER_INCL_HANDLES)) { + if (ked->curflags & KEYFRAME_OK_KEY) + bezt->f2 |= SELECT; + if (ked->curflags & KEYFRAME_OK_H1) + bezt->f1 |= SELECT; + if (ked->curflags & KEYFRAME_OK_H2) + bezt->f3 |= SELECT; + } + else { + BEZ_SEL(bezt); + } + return 0; } -static short select_bezier_subtract(BeztEditData *bed, BezTriple *bezt) +static short select_bezier_subtract(KeyframeEditData *ked, BezTriple *bezt) { - /* Deselect the bezier triple */ - BEZ_DESEL(bezt); + /* if we've got info on what to deselect, use it, otherwise deselect all */ + if ((ked) && (ked->iterflags & KEYFRAME_ITER_INCL_HANDLES)) { + if (ked->curflags & KEYFRAME_OK_KEY) + bezt->f2 &= ~SELECT; + if (ked->curflags & KEYFRAME_OK_H1) + bezt->f1 &= ~SELECT; + if (ked->curflags & KEYFRAME_OK_H2) + bezt->f3 &= ~SELECT; + } + else { + BEZ_DESEL(bezt); + } + return 0; } -static short select_bezier_invert(BeztEditData *bed, BezTriple *bezt) +static short select_bezier_invert(KeyframeEditData *ked, BezTriple *bezt) { - /* Invert the selection for the bezier triple */ + /* Invert the selection for the whole bezier triple */ bezt->f2 ^= SELECT; if (bezt->f2 & SELECT) { bezt->f1 |= SELECT; @@ -957,7 +1054,7 @@ static short select_bezier_invert(BeztEditData *bed, BezTriple *bezt) return 0; } -BeztEditFunc ANIM_editkeyframes_select(short selectmode) +KeyframeEditFunc ANIM_editkeyframes_select(short selectmode) { switch (selectmode) { case SELECT_ADD: /* add */ @@ -982,11 +1079,11 @@ BeztEditFunc ANIM_editkeyframes_select(short selectmode) /* ----------- */ -static short selmap_build_bezier_more(BeztEditData *bed, BezTriple *bezt) +static short selmap_build_bezier_more(KeyframeEditData *ked, BezTriple *bezt) { - FCurve *fcu= bed->fcu; - char *map= bed->data; - int i= bed->curIndex; + FCurve *fcu= ked->fcu; + char *map= ked->data; + int i= ked->curIndex; /* if current is selected, just make sure it stays this way */ if (BEZSELECTED(bezt)) { @@ -1017,11 +1114,11 @@ static short selmap_build_bezier_more(BeztEditData *bed, BezTriple *bezt) return 0; } -static short selmap_build_bezier_less(BeztEditData *bed, BezTriple *bezt) +static short selmap_build_bezier_less(KeyframeEditData *ked, BezTriple *bezt) { - FCurve *fcu= bed->fcu; - char *map= bed->data; - int i= bed->curIndex; + FCurve *fcu= ked->fcu; + char *map= ked->data; + int i= ked->curIndex; /* if current is selected, check the left/right keyframes * since it might need to be deselected (but otherwise no) @@ -1059,7 +1156,7 @@ static short selmap_build_bezier_less(BeztEditData *bed, BezTriple *bezt) } /* Get callback for building selection map */ -BeztEditFunc ANIM_editkeyframes_buildselmap(short mode) +KeyframeEditFunc ANIM_editkeyframes_buildselmap(short mode) { switch (mode) { case SELMAP_LESS: /* less */ @@ -1074,10 +1171,10 @@ BeztEditFunc ANIM_editkeyframes_buildselmap(short mode) /* ----------- */ /* flush selection map values to the given beztriple */ -short bezt_selmap_flush(BeztEditData *bed, BezTriple *bezt) +short bezt_selmap_flush(KeyframeEditData *ked, BezTriple *bezt) { - char *map= bed->data; - short on= map[bed->curIndex]; + char *map= ked->data; + short on= map[ked->curIndex]; /* select or deselect based on whether the map allows it or not */ if (on) { diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c index 1784c6ef32c..abced485769 100644 --- a/source/blender/editors/animation/keyframes_general.c +++ b/source/blender/editors/animation/keyframes_general.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -36,14 +36,9 @@ #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_curve_types.h" -#include "DNA_key_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "RNA_access.h" #include "BKE_action.h" #include "BKE_fcurve.h" @@ -100,8 +95,8 @@ void delete_fcurve_keys(FCurve *fcu) { int i; - if(fcu->bezt==NULL) /* ignore baked curves */ - return; + if(fcu->bezt==NULL) /* ignore baked curves */ + return; /* Delete selected BezTriples */ for (i=0; i < fcu->totvert; i++) { @@ -505,7 +500,7 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data) * - skip if no selected keyframes found (so no need to create unnecessary copy-buffer data) * - this check should also eliminate any problems associated with using sample-data */ - if (ANIM_fcurve_keys_bezier_loop(NULL, fcu, NULL, ANIM_editkeyframes_ok(BEZT_OK_SELECTED), NULL) == 0) + if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, ANIM_editkeyframes_ok(BEZT_OK_SELECTED), NULL) == 0) continue; /* init copybuf item info */ diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index d0675dc42ba..f60181d7f6c 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -40,15 +40,11 @@ #include "BLI_dynstr.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" #include "DNA_key_types.h" -#include "DNA_object_types.h" #include "DNA_material_types.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -67,7 +63,6 @@ #include "ED_keyframing.h" #include "ED_keyframes_edit.h" #include "ED_screen.h" -#include "ED_util.h" #include "UI_interface.h" @@ -76,7 +71,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "anim_intern.h" @@ -136,8 +130,11 @@ bAction *verify_adt_action (ID *id, short add) /* init action if none available yet */ // TODO: need some wizardry to handle NLA stuff correct - if ((adt->action == NULL) && (add)) - adt->action= add_empty_action("Action"); + if ((adt->action == NULL) && (add)) { + char actname[sizeof(id->name)-2]; + BLI_snprintf(actname, sizeof(actname), "%sAction", id->name+2); + adt->action= add_empty_action(actname); + } /* return the action */ return adt->action; @@ -182,16 +179,8 @@ FCurve *verify_fcurve (bAction *act, const char group[], const char rna_path[], grp= action_groups_find_named(act, group); /* no matching groups, so add one */ - if (grp == NULL) { - /* Add a new group, and make it active */ - grp= MEM_callocN(sizeof(bActionGroup), "bActionGroup"); - - grp->flag = AGRP_SELECTED; - strncpy(grp->name, group, sizeof(grp->name)); - - BLI_addtail(&act->groups, grp); - BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), sizeof(grp->name)); - } + if (grp == NULL) + grp= action_groups_add_new(act, group); /* add F-Curve to group */ action_groups_add_channel(act, grp, fcu); @@ -231,27 +220,16 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag) if (replace) { /* sanity check: 'i' may in rare cases exceed arraylen */ if ((i >= 0) && (i < fcu->totvert)) { - /* take care with the handletypes and other info if the replacement flags are set */ - if (flag & INSERTKEY_REPLACE) { - BezTriple *dst= (fcu->bezt + i); - float dy= bezt->vec[1][1] - dst->vec[1][1]; - - /* just apply delta value change to the handle values */ - dst->vec[0][1] += dy; - dst->vec[1][1] += dy; - dst->vec[2][1] += dy; - - // TODO: perform some other operations? - } - else { - char oldKeyType= BEZKEYTYPE(fcu->bezt + i); - - /* just brutally replace the values */ - *(fcu->bezt + i) = *bezt; - - /* special exception for keyframe type - copy value back so that this info isn't lost */ - BEZKEYTYPE(fcu->bezt + i)= oldKeyType; - } + /* just change the values when replacing, so as to not overwrite handles */ + BezTriple *dst= (fcu->bezt + i); + float dy= bezt->vec[1][1] - dst->vec[1][1]; + + /* just apply delta value change to the handle values */ + dst->vec[0][1] += dy; + dst->vec[1][1] += dy; + dst->vec[2][1] += dy; + + // TODO: perform some other operations? } } /* keyframing modes allow to not replace keyframe */ @@ -259,14 +237,14 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag) /* insert new - if we're not restricted to replacing keyframes only */ BezTriple *newb= MEM_callocN((fcu->totvert+1)*sizeof(BezTriple), "beztriple"); - /* add the beztriples that should occur before the beztriple to be pasted (originally in ei->icu) */ + /* add the beztriples that should occur before the beztriple to be pasted (originally in fcu) */ if (i > 0) memcpy(newb, fcu->bezt, i*sizeof(BezTriple)); /* add beztriple to paste at index i */ *(newb + i)= *bezt; - /* add the beztriples that occur after the beztriple to be pasted (originally in icu) */ + /* add the beztriples that occur after the beztriple to be pasted (originally in fcu) */ if (i < fcu->totvert) memcpy(newb+i+1, fcu->bezt+i, (fcu->totvert-i)*sizeof(BezTriple)); @@ -311,17 +289,19 @@ int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag) BezTriple beztr; int a; - /* set all three points, for nicer start position */ + /* set all three points, for nicer start position + * NOTE: +/- 1 on vec.x for left and right handles is so that 'free' handles work ok... + */ memset(&beztr, 0, sizeof(BezTriple)); - beztr.vec[0][0]= x; + beztr.vec[0][0]= x-1.0f; beztr.vec[0][1]= y; beztr.vec[1][0]= x; beztr.vec[1][1]= y; - beztr.vec[2][0]= x; + beztr.vec[2][0]= x+1.0f; beztr.vec[2][1]= y; beztr.ipo= U.ipo_new; /* use default interpolation mode here... */ beztr.f1= beztr.f2= beztr.f3= SELECT; - beztr.h1= beztr.h2= HD_AUTO; // XXX what about when we replace an old one? + beztr.h1= beztr.h2= U.keyhandles_new; /* use default handle type here */ //BEZKEYTYPE(&beztr)= scene->keytype; /* default keyframe type */ /* add temp beztriple to keyframes */ @@ -342,18 +322,9 @@ int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag) /* set handletype and interpolation */ if ((fcu->totvert > 2) && (flag & INSERTKEY_REPLACE)==0) { BezTriple *bezt= (fcu->bezt + a); - char h1, h2; - - /* set handles (autohandles by default) */ - h1= h2= HD_AUTO; - - if (a > 0) h1= (bezt-1)->h2; - if (a < fcu->totvert-1) h2= (bezt+1)->h1; - - bezt->h1= h1; - bezt->h2= h2; /* set interpolation from previous (if available) */ + // FIXME: this doesn't work if user tweaked the interpolation specifically, and they were just overwriting some existing key in the process... if (a > 0) bezt->ipo= (bezt-1)->ipo; else if (a < fcu->totvert-1) bezt->ipo= (bezt+1)->ipo; @@ -846,15 +817,21 @@ short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, fl short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag) { PointerRNA id_ptr, ptr; - PropertyRNA *prop; + PropertyRNA *prop = NULL; FCurve *fcu; int array_index_max= array_index+1; int ret= 0; /* validate pointer first - exit if failure */ + if (id == NULL) { + printf("Insert Key: no ID-block to insert keyframe in (Path = %s) \n", rna_path); + return 0; + } + RNA_id_pointer_create(id, &id_ptr); if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { - printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path); + printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", + (id)? id->name : "", rna_path); return 0; } @@ -903,21 +880,27 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_ /* will only loop once unless the array index was -1 */ for (; array_index < array_index_max; array_index++) { - /* make sure the F-Curve exists */ - fcu= verify_fcurve(act, group, rna_path, array_index, 1); + /* make sure the F-Curve exists + * - if we're replacing keyframes only, DO NOT create new F-Curves if they do not exist yet + * but still try to get the F-Curve if it exists... + */ + fcu= verify_fcurve(act, group, rna_path, array_index, (flag & INSERTKEY_REPLACE)==0); - /* set color mode if the F-Curve is new (i.e. without any keyframes) */ - if ((fcu->totvert == 0) && (flag & INSERTKEY_XYZ2RGB)) { - /* for Loc/Rot/Scale and also Color F-Curves, the color of the F-Curve in the Graph Editor, - * is determined by the array index for the F-Curve - */ - if (ELEM4(RNA_property_subtype(prop), PROP_TRANSLATION, PROP_XYZ, PROP_EULER, PROP_COLOR)) { - fcu->color_mode= FCURVE_COLOR_AUTO_RGB; + /* we may not have a F-Curve when we're replacing only... */ + if (fcu) { + /* set color mode if the F-Curve is new (i.e. without any keyframes) */ + if ((fcu->totvert == 0) && (flag & INSERTKEY_XYZ2RGB)) { + /* for Loc/Rot/Scale and also Color F-Curves, the color of the F-Curve in the Graph Editor, + * is determined by the array index for the F-Curve + */ + if (ELEM4(RNA_property_subtype(prop), PROP_TRANSLATION, PROP_XYZ, PROP_EULER, PROP_COLOR)) { + fcu->color_mode= FCURVE_COLOR_AUTO_RGB; + } } + + /* insert keyframe */ + ret += insert_keyframe_direct(ptr, prop, fcu, cfra, flag); } - - /* insert keyframe */ - ret += insert_keyframe_direct(ptr, prop, fcu, cfra, flag); } return ret; @@ -945,7 +928,7 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_ if ELEM(NULL, id, adt) { printf("ERROR: no ID-block and/or AnimData to delete keyframe from \n"); return 0; - } + } /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); @@ -1059,9 +1042,13 @@ static int modify_key_op_poll(bContext *C) if (ELEM(NULL, sa, scene)) return 0; - /* if Outliner, only allow in DataBlocks view */ - if (so && (so->outlinevis != SO_DATABLOCKS)) - return 0; + /* if Outliner, don't allow in some views */ + if (so) { + if (ELEM4(so->outlinevis, SO_GROUPS, SO_LIBRARIES, SO_VERSE_SESSION, SO_VERSE_SESSION)) + return 0; + if (ELEM3(so->outlinevis, SO_SEQUENCE, SO_USERDEF, SO_KEYMAP)) + return 0; + } /* TODO: checks for other space types can be added here */ @@ -1073,7 +1060,6 @@ static int modify_key_op_poll(bContext *C) static int insert_key_exec (bContext *C, wmOperator *op) { - ListBase dsources = {NULL, NULL}; Scene *scene= CTX_data_scene(C); KeyingSet *ks= NULL; int type= RNA_int_get(op->ptr, "type"); @@ -1098,38 +1084,26 @@ static int insert_key_exec (bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* get context info for relative Keying Sets */ - if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) { - /* exit if no suitable data obtained */ - if (modifykey_get_context_data(C, &dsources, ks) == 0) { - BKE_report(op->reports, RPT_ERROR, "No suitable context info for active Keying Set"); - return OPERATOR_CANCELLED; - } - } - /* try to insert keyframes for the channels specified by KeyingSet */ - success= modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + success= ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); if (G.f & G_DEBUG) BKE_reportf(op->reports, RPT_INFO, "KeyingSet '%s' - Successfully added %d Keyframes \n", ks->name, success); /* report failure or do updates? */ - if (success) { + if (success == MODIFYKEY_INVALID_CONTEXT) { + BKE_report(op->reports, RPT_ERROR, "No suitable context info for active Keying Set"); + return OPERATOR_CANCELLED; + } + else if (success) { /* if the appropriate properties have been set, make a note that we've inserted something */ if (RNA_boolean_get(op->ptr, "confirm_success")) BKE_reportf(op->reports, RPT_INFO, "Successfully added %d Keyframes for KeyingSet '%s'", success, ks->name); /* send notifiers that keyframes have been changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } else BKE_report(op->reports, RPT_WARNING, "Keying Set failed to insert any keyframes"); - - - /* free temp context-data if available */ - if (dsources.first) { - /* we assume that there is no extra data that needs to be freed from here... */ - BLI_freelistN(&dsources); - } /* send updates */ DAG_ids_flush_update(0); @@ -1139,6 +1113,8 @@ static int insert_key_exec (bContext *C, wmOperator *op) void ANIM_OT_keyframe_insert (wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name= "Insert Keyframe"; ot->idname= "ANIM_OT_keyframe_insert"; @@ -1154,60 +1130,20 @@ void ANIM_OT_keyframe_insert (wmOperatorType *ot) /* keyingset to use * - here the type is int not enum, since many of the indicies here are determined dynamically */ - RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1); + prop= RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1); + RNA_def_property_flag(prop, PROP_HIDDEN); /* confirm whether a keyframe was added by showing a popup * - by default, this is enabled, since this operator is assumed to be called independently */ - RNA_def_boolean(ot->srna, "confirm_success", 1, "Confirm Successful Insert", "Show a popup when the keyframes get successfully added"); + prop= RNA_def_boolean(ot->srna, "confirm_success", 1, "Confirm Successful Insert", "Show a popup when the keyframes get successfully added"); + RNA_def_property_flag(prop, PROP_HIDDEN); } /* Insert Key Operator (With Menu) ------------------------ */ /* This operator checks if a menu should be shown for choosing the KeyingSet to use, - * then calls the + * then calls the menu if necessary before */ -static void insert_key_menu_prompt (bContext *C) -{ - Scene *scene= CTX_data_scene(C); - KeyingSet *ks; - uiPopupMenu *pup; - uiLayout *layout; - int i = 0; - - pup= uiPupMenuBegin(C, "Insert Keyframe", 0); - layout= uiPupMenuLayout(pup); - - /* active Keying Set - * - only include entry if it exists - */ - if (scene->active_keyingset) { - uiItemIntO(layout, "Active Keying Set", 0, "ANIM_OT_keyframe_insert_menu", "type", i++); - uiItemS(layout); - } - else - i++; - - /* user-defined Keying Sets - * - these are listed in the order in which they were defined for the active scene - */ - if (scene->keyingsets.first) { - for (ks= scene->keyingsets.first; ks; ks= ks->next) - uiItemIntO(layout, ks->name, 0, "ANIM_OT_keyframe_insert_menu", "type", i++); - uiItemS(layout); - } - - /* builtin Keying Sets */ - i= -1; - for (ks= builtin_keyingsets.first; ks; ks= ks->next) { - /* only show KeyingSet if context is suitable */ - if (keyingset_context_ok_poll(C, ks)) { - uiItemIntO(layout, ks->name, 0, "ANIM_OT_keyframe_insert_menu", "type", i--); - } - } - - uiPupMenuEnd(C, pup); -} - static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) { Scene *scene= CTX_data_scene(C); @@ -1215,7 +1151,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) /* if prompting or no active Keying Set, show the menu */ if ((scene->active_keyingset == 0) || RNA_boolean_get(op->ptr, "always_prompt")) { /* call the menu, which will call this operator again, hence the cancelled */ - insert_key_menu_prompt(C); + ANIM_keying_sets_menu_setup(C, op->type->name, "ANIM_OT_keyframe_insert_menu"); return OPERATOR_CANCELLED; } else { @@ -1229,6 +1165,8 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) void ANIM_OT_keyframe_insert_menu (wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name= "Insert Keyframe Menu"; ot->idname= "ANIM_OT_keyframe_insert_menu"; @@ -1244,24 +1182,26 @@ void ANIM_OT_keyframe_insert_menu (wmOperatorType *ot) /* keyingset to use * - here the type is int not enum, since many of the indicies here are determined dynamically */ - RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1); + prop= RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1); + RNA_def_property_flag(prop, PROP_HIDDEN); /* confirm whether a keyframe was added by showing a popup * - by default, this is disabled so that if a menu is shown, this doesn't come up too */ // XXX should this just be always on? - RNA_def_boolean(ot->srna, "confirm_success", 0, "Confirm Successful Insert", "Show a popup when the keyframes get successfully added"); + prop= RNA_def_boolean(ot->srna, "confirm_success", 0, "Confirm Successful Insert", "Show a popup when the keyframes get successfully added"); + RNA_def_property_flag(prop, PROP_HIDDEN); /* whether the menu should always be shown * - by default, the menu should only be shown when there is no active Keying Set (2.5 behaviour), * although in some cases it might be useful to always shown (pre 2.5 behaviour) */ - RNA_def_boolean(ot->srna, "always_prompt", 0, "Always Show Menu", ""); + prop= RNA_def_boolean(ot->srna, "always_prompt", 0, "Always Show Menu", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); } /* Delete Key Operator ------------------------ */ static int delete_key_exec (bContext *C, wmOperator *op) { - ListBase dsources = {NULL, NULL}; Scene *scene= CTX_data_scene(C); KeyingSet *ks= NULL; int type= RNA_int_get(op->ptr, "type"); @@ -1286,38 +1226,27 @@ static int delete_key_exec (bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* get context info for relative Keying Sets */ - if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) { - /* exit if no suitable data obtained */ - if (modifykey_get_context_data(C, &dsources, ks) == 0) { - BKE_report(op->reports, RPT_ERROR, "No suitable context info for active Keying Set"); - return OPERATOR_CANCELLED; - } - } - /* try to insert keyframes for the channels specified by KeyingSet */ - success= modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_DELETE, cfra); + success= ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_DELETE, cfra); if (G.f & G_DEBUG) printf("KeyingSet '%s' - Successfully removed %d Keyframes \n", ks->name, success); /* report failure or do updates? */ - if (success) { + if (success == MODIFYKEY_INVALID_CONTEXT) { + BKE_report(op->reports, RPT_ERROR, "No suitable context info for active Keying Set"); + return OPERATOR_CANCELLED; + } + else if (success) { /* if the appropriate properties have been set, make a note that we've inserted something */ if (RNA_boolean_get(op->ptr, "confirm_success")) BKE_reportf(op->reports, RPT_INFO, "Successfully removed %d Keyframes for KeyingSet '%s'", success, ks->name); /* send notifiers that keyframes have been changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } else BKE_report(op->reports, RPT_WARNING, "Keying Set failed to remove any keyframes"); - /* free temp context-data if available */ - if (dsources.first) { - /* we assume that there is no extra data that needs to be freed from here... */ - BLI_freelistN(&dsources); - } - /* send updates */ DAG_ids_flush_update(0); @@ -1474,7 +1403,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op) DAG_ids_flush_update(0); /* send notifiers that keyframes have been changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED; @@ -1544,7 +1473,7 @@ static int delete_key_button_exec (bContext *C, wmOperator *op) DAG_ids_flush_update(0); /* send notifiers that keyframes have been changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED; diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index 63323a8519d..1c06266a148 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -40,18 +40,12 @@ #include "BLI_dynstr.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_object_types.h" -#include "DNA_material_types.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_animsys.h" #include "BKE_action.h" +#include "BKE_context.h" #include "BKE_constraint.h" #include "BKE_depsgraph.h" #include "BKE_fcurve.h" @@ -61,11 +55,8 @@ #include "BKE_key.h" #include "BKE_material.h" -#include "ED_anim_api.h" #include "ED_keyframing.h" -#include "ED_keyframes_edit.h" #include "ED_screen.h" -#include "ED_util.h" #include "UI_interface.h" @@ -74,7 +65,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "anim_intern.h" @@ -174,6 +164,10 @@ static int remove_active_keyingset_exec (bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No active Keying Set to remove"); return OPERATOR_CANCELLED; } + else if (scene->active_keyingset < 0) { + BKE_report(op->reports, RPT_ERROR, "Cannot remove built in Keying Set"); + return OPERATOR_CANCELLED; + } else ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); @@ -256,14 +250,8 @@ static int remove_active_ks_path_exec (bContext *C, wmOperator *op) KS_Path *ksp= BLI_findlink(&ks->paths, ks->active_path-1); if (ksp) { - /* NOTE: sync this code with BKE_keyingset_free() */ - { - /* free RNA-path info */ - MEM_freeN(ksp->rna_path); - - /* free path itself */ - BLI_freelinkN(&ks->paths, ksp); - } + /* remove the active path from the KeyingSet */ + BKE_keyingset_free_path(ks, ksp); /* the active path should now be the previously second-to-last active one */ ks->active_path--; @@ -331,6 +319,10 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op) scene->active_keyingset= BLI_countlist(&scene->keyingsets); } + else if (scene->active_keyingset < 0) { + BKE_report(op->reports, RPT_ERROR, "Cannot add property to built in Keying Set"); + return OPERATOR_CANCELLED; + } else ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); @@ -412,6 +404,10 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No active Keying Set to remove property from"); return OPERATOR_CANCELLED; } + else if (scene->active_keyingset < 0) { + BKE_report(op->reports, RPT_ERROR, "Cannot remove property from built in Keying Set"); + return OPERATOR_CANCELLED; + } else ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); @@ -467,644 +463,91 @@ void ANIM_OT_keyingset_button_remove (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -/* ************************************************** */ -/* KEYING SETS - EDITING API */ +/* ******************************************* */ -/* UI API --------------------------------------------- */ +/* Change Active KeyingSet Operator ------------------------ */ +/* This operator checks if a menu should be shown for choosing the KeyingSet to make the active one */ -/* Build menu-string of available keying-sets (allocates memory for string) - * NOTE: mode must not be longer than 64 chars - */ -char *ANIM_build_keyingsets_menu (ListBase *list, short for_edit) +static int keyingset_active_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) { - DynStr *pupds= BLI_dynstr_new(); - KeyingSet *ks; - char buf[64]; - char *str; - int i; - - /* add title first */ - BLI_dynstr_append(pupds, "Keying Sets%t|"); - - /* add dummy entries for none-active */ - if (for_edit) { - BLI_dynstr_append(pupds, "Add New%x-1|"); - BLI_dynstr_append(pupds, " %x0|"); - } - else - BLI_dynstr_append(pupds, "No Keying Set%x0|"); - - /* loop through keyingsets, adding them */ - for (ks=list->first, i=1; ks; ks=ks->next, i++) { - if (for_edit == 0) - BLI_dynstr_append(pupds, "KS: "); - - BLI_dynstr_append(pupds, ks->name); - BLI_snprintf( buf, 64, "%%x%d%s", i, ((ks->next)?"|":"") ); - BLI_dynstr_append(pupds, buf); - } - - /* convert to normal MEM_malloc'd string */ - str= BLI_dynstr_get_cstring(pupds); - BLI_dynstr_free(pupds); - - return str; + /* call the menu, which will call this operator again, hence the cancelled */ + ANIM_keying_sets_menu_setup(C, op->type->name, "ANIM_OT_keying_set_active_set"); + return OPERATOR_CANCELLED; } +static int keyingset_active_menu_exec (bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + int type= RNA_int_get(op->ptr, "type"); + + /* simply set the scene's active keying set index, unless the type == 0 + * (i.e. which happens if we want the current active to be maintained) + */ + if (type) + scene->active_keyingset= type; + + /* send notifiers */ + WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL); + + return OPERATOR_FINISHED; +} + +void ANIM_OT_keying_set_active_set (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Active Keying Set"; + ot->idname= "ANIM_OT_keying_set_active_set"; + + /* callbacks */ + ot->invoke= keyingset_active_menu_invoke; + ot->exec= keyingset_active_menu_exec; + ot->poll= ED_operator_areaactive; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* keyingset to use + * - here the type is int not enum, since many of the indicies here are determined dynamically + */ + RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1); +} /* ******************************************* */ -/* KEYING SETS - BUILTIN */ +/* REGISTERED KEYING SETS */ -#if 0 // XXX old keyingsets code based on adrcodes... to be restored in due course +/* Keying Set Type Info declarations */ +ListBase keyingset_type_infos = {NULL, NULL}; -/* ------------- KeyingSet Defines ------------ */ -/* Note: these must all be named with the defks_* prefix, otherwise the template macro will not work! */ - -/* macro for defining keyingset contexts */ -#define KSC_TEMPLATE(ctx_name) {&defks_##ctx_name[0], NULL, sizeof(defks_##ctx_name)/sizeof(bKeyingSet)} - -/* --- */ - -/* check if option not available for deleting keys */ -static short incl_non_del_keys (bKeyingSet *ks, const char mode[]) -{ - /* as optimisation, assume that it is sufficient to check only first letter - * of mode (int comparison should be faster than string!) - */ - //if (strcmp(mode, "Delete")==0) - if (mode && mode[0]=='D') - return 0; - - return 1; -} - -/* Object KeyingSets ------ */ - -/* check if include shapekey entry */ -static short incl_v3d_ob_shapekey (bKeyingSet *ks, const char mode[]) -{ - //Object *ob= (G.obedit)? (G.obedit) : (OBACT); // XXX - Object *ob= NULL; - char *newname= NULL; - - if(ob==NULL) - return 0; - - /* not available for delete mode */ - if (strcmp(mode, "Delete")==0) - return 0; - - /* check if is geom object that can get shapekeys */ - switch (ob->type) { - /* geometry? */ - case OB_MESH: newname= "Mesh"; break; - case OB_CURVE: newname= "Curve"; break; - case OB_SURF: newname= "Surface"; break; - case OB_LATTICE: newname= "Lattice"; break; - - /* not geometry! */ - default: - return 0; - } - - /* if ks is shapekey entry (this could be callled for separator before too!) */ - if (ks->flag == -3) - BLI_strncpy(ks->name, newname, sizeof(ks->name)); - - /* if it gets here, it's ok */ - return 1; -} - -/* array for object keyingset defines */ -bKeyingSet defks_v3d_object[] = -{ - /* include_cb, adrcode-getter, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "Loc", ID_OB, 0, 3, {OB_LOC_X,OB_LOC_Y,OB_LOC_Z}}, - {NULL, "Rot", ID_OB, 0, 3, {OB_ROT_X,OB_ROT_Y,OB_ROT_Z}}, - {NULL, "Scale", ID_OB, 0, 3, {OB_SIZE_X,OB_SIZE_Y,OB_SIZE_Z}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "LocRot", ID_OB, 0, 6, - {OB_LOC_X,OB_LOC_Y,OB_LOC_Z, - OB_ROT_X,OB_ROT_Y,OB_ROT_Z}}, - - {NULL, "LocScale", ID_OB, 0, 6, - {OB_LOC_X,OB_LOC_Y,OB_LOC_Z, - OB_SIZE_X,OB_SIZE_Y,OB_SIZE_Z}}, - - {NULL, "LocRotScale", ID_OB, 0, 9, - {OB_LOC_X,OB_LOC_Y,OB_LOC_Z, - OB_ROT_X,OB_ROT_Y,OB_ROT_Z, - OB_SIZE_X,OB_SIZE_Y,OB_SIZE_Z}}, - - {NULL, "RotScale", ID_OB, 0, 6, - {OB_ROT_X,OB_ROT_Y,OB_ROT_Z, - OB_SIZE_X,OB_SIZE_Y,OB_SIZE_Z}}, - - {incl_non_del_keys, "%l", 0, -1, 0, {0}}, // separator - - {incl_non_del_keys, "VisualLoc", ID_OB, INSERTKEY_MATRIX, 3, {OB_LOC_X,OB_LOC_Y,OB_LOC_Z}}, - {incl_non_del_keys, "VisualRot", ID_OB, INSERTKEY_MATRIX, 3, {OB_ROT_X,OB_ROT_Y,OB_ROT_Z}}, - - {incl_non_del_keys, "VisualLocRot", ID_OB, INSERTKEY_MATRIX, 6, - {OB_LOC_X,OB_LOC_Y,OB_LOC_Z, - OB_ROT_X,OB_ROT_Y,OB_ROT_Z}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Layer", ID_OB, 0, 1, {OB_LAY}}, // icky option... - {NULL, "Available", ID_OB, -2, 0, {0}}, - - {incl_v3d_ob_shapekey, "%l%l", 0, -1, 0, {0}}, // separator (linked to shapekey entry) - {incl_v3d_ob_shapekey, "", ID_OB, -3, 0, {0}} -}; - -/* PoseChannel KeyingSets ------ */ - -/* array for posechannel keyingset defines */ -bKeyingSet defks_v3d_pchan[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "Loc", ID_PO, 0, 3, {AC_LOC_X,AC_LOC_Y,AC_LOC_Z}}, - {NULL, "Rot", ID_PO, COMMONKEY_PCHANROT, 1, {KAG_CHAN_EXTEND}}, - {NULL, "Scale", ID_PO, 0, 3, {AC_SIZE_X,AC_SIZE_Y,AC_SIZE_Z}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "LocRot", ID_PO, COMMONKEY_PCHANROT, 4, - {AC_LOC_X,AC_LOC_Y,AC_LOC_Z, - KAG_CHAN_EXTEND}}, - - {NULL, "LocScale", ID_PO, 0, 6, - {AC_LOC_X,AC_LOC_Y,AC_LOC_Z, - AC_SIZE_X,AC_SIZE_Y,AC_SIZE_Z}}, - - {NULL, "LocRotScale", ID_PO, COMMONKEY_PCHANROT, 7, - {AC_LOC_X,AC_LOC_Y,AC_LOC_Z,AC_SIZE_X,AC_SIZE_Y,AC_SIZE_Z, - KAG_CHAN_EXTEND}}, - - {NULL, "RotScale", ID_PO, 0, 4, - {AC_SIZE_X,AC_SIZE_Y,AC_SIZE_Z, - KAG_CHAN_EXTEND}}, - - {incl_non_del_keys, "%l", 0, -1, 0, {0}}, // separator - - {incl_non_del_keys, "VisualLoc", ID_PO, INSERTKEY_MATRIX, 3, {AC_LOC_X,AC_LOC_Y,AC_LOC_Z}}, - {incl_non_del_keys, "VisualRot", ID_PO, INSERTKEY_MATRIX|COMMONKEY_PCHANROT, 1, {KAG_CHAN_EXTEND}}, - - {incl_non_del_keys, "VisualLocRot", ID_PO, INSERTKEY_MATRIX|COMMONKEY_PCHANROT, 4, - {AC_LOC_X,AC_LOC_Y,AC_LOC_Z, KAG_CHAN_EXTEND}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_PO, -2, 0, {0}} -}; - -/* Material KeyingSets ------ */ - -/* array for material keyingset defines */ -bKeyingSet defks_buts_shading_mat[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "RGB", ID_MA, 0, 3, {MA_COL_R,MA_COL_G,MA_COL_B}}, - {NULL, "Alpha", ID_MA, 0, 1, {MA_ALPHA}}, - {NULL, "Halo Size", ID_MA, 0, 1, {MA_HASIZE}}, - {NULL, "Mode", ID_MA, 0, 1, {MA_MODE}}, // evil bitflags - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "All Color", ID_MA, 0, 18, - {MA_COL_R,MA_COL_G,MA_COL_B, - MA_ALPHA,MA_HASIZE, MA_MODE, - MA_SPEC_R,MA_SPEC_G,MA_SPEC_B, - MA_REF,MA_EMIT,MA_AMB,MA_SPEC,MA_HARD, - MA_MODE,MA_TRANSLU,MA_ADD}}, - - {NULL, "All Mirror", ID_MA, 0, 5, - {MA_RAYM,MA_FRESMIR,MA_FRESMIRI, - MA_FRESTRA,MA_FRESTRAI}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Ofs", ID_MA, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}}, - {NULL, "Size", ID_MA, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}}, - - {NULL, "All Mapping", ID_MA, COMMONKEY_ADDMAP, 14, - {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z, - MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z, - MAP_R,MAP_G,MAP_B,MAP_DVAR, - MAP_COLF,MAP_NORF,MAP_VARF,MAP_DISP}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_MA, -2, 0, {0}} -}; - -/* World KeyingSets ------ */ - -/* array for world keyingset defines */ -bKeyingSet defks_buts_shading_wo[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "Zenith RGB", ID_WO, 0, 3, {WO_ZEN_R,WO_ZEN_G,WO_ZEN_B}}, - {NULL, "Horizon RGB", ID_WO, 0, 3, {WO_HOR_R,WO_HOR_G,WO_HOR_B}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Mist", ID_WO, 0, 4, {WO_MISI,WO_MISTDI,WO_MISTSTA,WO_MISTHI}}, - {NULL, "Stars", ID_WO, 0, 5, {WO_STAR_R,WO_STAR_G,WO_STAR_B,WO_STARDIST,WO_STARSIZE}}, - - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Ofs", ID_WO, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}}, - {NULL, "Size", ID_WO, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}}, - - {NULL, "All Mapping", ID_WO, COMMONKEY_ADDMAP, 14, - {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z, - MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z, - MAP_R,MAP_G,MAP_B,MAP_DVAR, - MAP_COLF,MAP_NORF,MAP_VARF,MAP_DISP}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_WO, -2, 0, {0}} -}; - -/* Lamp KeyingSets ------ */ - -/* array for lamp keyingset defines */ -bKeyingSet defks_buts_shading_la[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "RGB", ID_LA, 0, 3, {LA_COL_R,LA_COL_G,LA_COL_B}}, - {NULL, "Energy", ID_LA, 0, 1, {LA_ENERGY}}, - {NULL, "Spot Size", ID_LA, 0, 1, {LA_SPOTSI}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Ofs", ID_LA, COMMONKEY_ADDMAP, 3, {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z}}, - {NULL, "Size", ID_LA, COMMONKEY_ADDMAP, 3, {MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z}}, - - {NULL, "All Mapping", ID_LA, COMMONKEY_ADDMAP, 14, - {MAP_OFS_X,MAP_OFS_Y,MAP_OFS_Z, - MAP_SIZE_X,MAP_SIZE_Y,MAP_SIZE_Z, - MAP_R,MAP_G,MAP_B,MAP_DVAR, - MAP_COLF,MAP_NORF,MAP_VARF,MAP_DISP}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_LA, -2, 0, {0}} -}; - -/* Texture KeyingSets ------ */ - -/* array for texture keyingset defines */ -bKeyingSet defks_buts_shading_tex[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "Clouds", ID_TE, 0, 5, - {TE_NSIZE,TE_NDEPTH,TE_NTYPE, - TE_MG_TYP,TE_N_BAS1}}, - - {NULL, "Marble", ID_TE, 0, 7, - {TE_NSIZE,TE_NDEPTH,TE_NTYPE, - TE_TURB,TE_MG_TYP,TE_N_BAS1,TE_N_BAS2}}, - - {NULL, "Stucci", ID_TE, 0, 5, - {TE_NSIZE,TE_NTYPE,TE_TURB, - TE_MG_TYP,TE_N_BAS1}}, - - {NULL, "Wood", ID_TE, 0, 6, - {TE_NSIZE,TE_NTYPE,TE_TURB, - TE_MG_TYP,TE_N_BAS1,TE_N_BAS2}}, - - {NULL, "Magic", ID_TE, 0, 2, {TE_NDEPTH,TE_TURB}}, - - {NULL, "Blend", ID_TE, 0, 1, {TE_MG_TYP}}, - - {NULL, "Musgrave", ID_TE, 0, 6, - {TE_MG_TYP,TE_MGH,TE_MG_LAC, - TE_MG_OCT,TE_MG_OFF,TE_MG_GAIN}}, - - {NULL, "Voronoi", ID_TE, 0, 9, - {TE_VNW1,TE_VNW2,TE_VNW3,TE_VNW4, - TE_VNMEXP,TE_VN_DISTM,TE_VN_COLT, - TE_ISCA,TE_NSIZE}}, - - {NULL, "Distorted Noise", ID_TE, 0, 4, - {TE_MG_OCT,TE_MG_OFF,TE_MG_GAIN,TE_DISTA}}, - - {NULL, "Color Filter", ID_TE, 0, 5, - {TE_COL_R,TE_COL_G,TE_COL_B,TE_BRIGHT,TE_CONTRA}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_TE, -2, 0, {0}} -}; - -/* Object Buttons KeyingSets ------ */ - -/* check if include particles entry */ -static short incl_buts_ob (bKeyingSet *ks, const char mode[]) -{ - //Object *ob= OBACT; // xxx - Object *ob= NULL; - /* only if object is mesh type */ - - if(ob==NULL) return 0; - return (ob->type == OB_MESH); -} - -/* array for texture keyingset defines */ -bKeyingSet defks_buts_object[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {incl_buts_ob, "Surface Damping", ID_OB, 0, 1, {OB_PD_SDAMP}}, - {incl_buts_ob, "Random Damping", ID_OB, 0, 1, {OB_PD_RDAMP}}, - {incl_buts_ob, "Permeability", ID_OB, 0, 1, {OB_PD_PERM}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Force Strength", ID_OB, 0, 1, {OB_PD_FSTR}}, - {NULL, "Force Falloff", ID_OB, 0, 1, {OB_PD_FFALL}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_OB, -2, 0, {0}} // this will include ob-transforms too! -}; - -/* Camera Buttons KeyingSets ------ */ - -/* check if include internal-renderer entry */ -static short incl_buts_cam1 (bKeyingSet *ks, const char mode[]) -{ - Scene *scene= NULL; // FIXME this will cause a crash, but we need an extra arg first! - /* only if renderer is internal renderer */ - return (scene->r.renderer==R_INTERN); -} - -/* check if include external-renderer entry */ -static short incl_buts_cam2 (bKeyingSet *ks, const char mode[]) -{ - Scene *scene= NULL; // FIXME this will cause a crash, but we need an extra arg first! - /* only if renderer is internal renderer */ - return (scene->r.renderer!=R_INTERN); -} - -/* array for camera keyingset defines */ -bKeyingSet defks_buts_cam[] = -{ - /* include_cb, name, blocktype, flag, chan_num, adrcodes */ - {NULL, "Lens", ID_CA, 0, 1, {CAM_LENS}}, - {NULL, "Clipping", ID_CA, 0, 2, {CAM_STA,CAM_END}}, - {NULL, "Focal Distance", ID_CA, 0, 1, {CAM_YF_FDIST}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - - {incl_buts_cam2, "Aperture", ID_CA, 0, 1, {CAM_YF_APERT}}, - {incl_buts_cam1, "Viewplane Shift", ID_CA, 0, 2, {CAM_SHIFT_X,CAM_SHIFT_Y}}, - - {NULL, "%l", 0, -1, 0, {0}}, // separator - - {NULL, "Available", ID_CA, -2, 0, {0}} -}; - -/* --- */ - -/* Keying Context Defines - Must keep in sync with enumeration (eKS_Contexts) */ -bKeyingContext ks_contexts[] = -{ - KSC_TEMPLATE(v3d_object), - KSC_TEMPLATE(v3d_pchan), - - KSC_TEMPLATE(buts_shading_mat), - KSC_TEMPLATE(buts_shading_wo), - KSC_TEMPLATE(buts_shading_la), - KSC_TEMPLATE(buts_shading_tex), - - KSC_TEMPLATE(buts_object), - KSC_TEMPLATE(buts_cam) -}; - -/* Keying Context Enumeration - Must keep in sync with definitions*/ -typedef enum eKS_Contexts { - KSC_V3D_OBJECT = 0, - KSC_V3D_PCHAN, - - KSC_BUTS_MAT, - KSC_BUTS_WO, - KSC_BUTS_LA, - KSC_BUTS_TEX, - - KSC_BUTS_OB, - KSC_BUTS_CAM, - - /* make sure this last one remains untouched! */ - KSC_TOT_TYPES -} eKS_Contexts; - - -#endif // XXX old keyingsets code based on adrcodes... to be restored in due course - -/* Macros for Declaring KeyingSets ------------------- */ - -/* A note about this system for declaring built-in Keying Sets: - * One may ask, "What is the purpose of all of these macros and static arrays?" and - * "Why not call the KeyingSets API defined in BKE_animsys.h?". The answer is two-fold. - * - * 1) Firstly, we use static arrays of struct definitions instead of function calls, as - * it reduces the start-up overhead and allocated-memory footprint of Blender. If we called - * the KeyingSets API to build these sets, the overhead of checking for unique names, allocating - * memory for each and every path and KeyingSet, scattered around in RAM, all of which would increase - * the startup time (which is totally unacceptable) and could lead to fragmentation+slower access times. - * 2) Since we aren't using function calls, we need a nice way of defining these KeyingSets in a way which - * is easily readable and less prone to breakage from changes to the underlying struct definitions. Further, - * adding additional entries SHOULD NOT require custom code to be written to access these new entries/sets. - * Therefore, here we have a system with nice, human-readable statements via macros, and static arrays which - * are linked together using more special macros + struct definitions, allowing for such a generic + simple - * initialisation function (init_builtin_keyingsets()) compared with that of something like the Nodes system. - * - * -- Joshua Leung, April 2009 - */ - -/* Struct type for declaring builtin KeyingSets in as entries in static arrays*/ -typedef struct bBuiltinKeyingSet { - KeyingSet ks; /* the KeyingSet to build */ - int tot; /* the total number of paths defined */ - KS_Path paths[64]; /* the paths for the KeyingSet to use */ -} bBuiltinKeyingSet; - - /* WARNING: the following macros must be kept in sync with the - * struct definitions in DNA_anim_types.h! - */ - -/* macro for defining a builtin KeyingSet */ -#define BI_KS_DEFINE_BEGIN(name, keyingflag) \ - {{NULL, NULL, {NULL, NULL}, name, KEYINGSET_BUILTIN, keyingflag}, - -/* macro to finish defining a builtin KeyingSet */ -#define BI_KS_DEFINE_END \ - } - -/* macro to start defining paths for a builtin KeyingSet */ -#define BI_KS_PATHS_BEGIN(tot) \ - tot, { - -/* macro to finish defining paths for a builtin KeyingSet */ -#define BI_KS_PATHS_END \ - } - -/* macro for defining a builtin KeyingSet's path */ -#define BI_KSP_DEFINE(id_type, templates, prop_path, array_index, flag, groupflag) \ - {NULL, NULL, NULL, "", id_type, templates, prop_path, array_index, flag, groupflag} - -/* macro for defining a builtin KeyingSet with no paths (use in place of BI_KS_PAHTS_BEGIN/END block) */ -#define BI_KS_PATHS_NONE \ - 0, {0} - -/* ---- */ - -/* Struct type for finding all the arrays of builtin KeyingSets */ -typedef struct bBuiltinKSContext { - bBuiltinKeyingSet *bks; /* array of KeyingSet definitions */ - int tot; /* number of KeyingSets in this array */ -} bBuiltinKSContext; - -/* macro for defining builtin KeyingSet sets - * NOTE: all the arrays of sets must follow this naming convention! - */ -#define BKSC_TEMPLATE(ctx_name) {&def_builtin_keyingsets_##ctx_name[0], sizeof(def_builtin_keyingsets_##ctx_name)/sizeof(bBuiltinKeyingSet)} - - -/* 3D-View Builtin KeyingSets ------------------------ */ - -static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] = -{ - /* Simple Keying Sets ************************************* */ - /* Keying Set - "Location" ---------- */ - BI_KS_DEFINE_BEGIN("Location", 0) - BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Keying Set - "Rotation" ---------- */ - BI_KS_DEFINE_BEGIN("Rotation", 0) - BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Keying Set - "Scaling" ---------- */ - BI_KS_DEFINE_BEGIN("Scaling", 0) - BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "scale", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Compound Keying Sets *********************************** */ - /* Keying Set - "LocRot" ---------- */ - BI_KS_DEFINE_BEGIN("LocRot", 0) - BI_KS_PATHS_BEGIN(2) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Keying Set - "LocRotScale" ---------- */ - BI_KS_DEFINE_BEGIN("LocRotScale", 0) - BI_KS_PATHS_BEGIN(3) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "scale", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Keying Sets with Keying Flags ************************* */ - /* Keying Set - "VisualLoc" ---------- */ - BI_KS_DEFINE_BEGIN("VisualLoc", INSERTKEY_MATRIX) - BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Keying Set - "Rotation" ---------- */ - BI_KS_DEFINE_BEGIN("VisualRot", INSERTKEY_MATRIX) - BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END, - - /* Keying Set - "VisualLocRot" ---------- */ - BI_KS_DEFINE_BEGIN("VisualLocRot", INSERTKEY_MATRIX) - BI_KS_PATHS_BEGIN(2) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) - BI_KS_PATHS_END - BI_KS_DEFINE_END -}; - -/* All Builtin KeyingSets ------------------------ */ - -/* total number of builtin KeyingSet contexts */ -#define MAX_BKSC_TYPES 1 - -/* array containing all the available builtin KeyingSets definition sets - * - size of this is MAX_BKSC_TYPES+1 so that we don't smash the stack - */ -static bBuiltinKSContext def_builtin_keyingsets[MAX_BKSC_TYPES+1] = -{ - BKSC_TEMPLATE(v3d) - /* add more contexts above this line... */ -}; - - -/* ListBase of these KeyingSets chained up ready for usage - * NOTE: this is exported to keyframing.c for use... - */ +/* Built-In Keying Sets (referencing type infos)*/ ListBase builtin_keyingsets = {NULL, NULL}; -/* Utility API ------------------------ */ +/* --------------- */ -/* Link up all of the builtin Keying Sets when starting up Blender - * This is called from WM_init() in wm_init_exit.c - */ -void init_builtin_keyingsets (void) +/* Find KeyingSet type info given a name */ +KeyingSetInfo *ANIM_keyingset_info_find_named (const char name[]) { - bBuiltinKSContext *bksc; - bBuiltinKeyingSet *bks; - int bksc_i, bks_i; + KeyingSetInfo *ksi; - /* loop over all the sets of KeyingSets, setting them up, and chaining them to the builtins list */ - for (bksc_i= 0, bksc= &def_builtin_keyingsets[0]; bksc_i < MAX_BKSC_TYPES; bksc_i++, bksc++) - { - /* for each set definitions for a builtin KeyingSet, chain the paths to that KeyingSet and add */ - for (bks_i= 0, bks= bksc->bks; bks_i < bksc->tot; bks_i++, bks++) - { - KeyingSet *ks= &bks->ks; - KS_Path *ksp; - int pIndex; - - /* loop over paths, linking them to the KeyingSet and each other */ - for (pIndex= 0, ksp= &bks->paths[0]; pIndex < bks->tot; pIndex++, ksp++) - BLI_addtail(&ks->paths, ksp); - - /* add KeyingSet to builtin sets list */ - BLI_addtail(&builtin_keyingsets, ks); - } + /* sanity checks */ + if ((name == NULL) || (name[0] == 0)) + return NULL; + + /* search by comparing names */ + for (ksi = keyingset_type_infos.first; ksi; ksi = ksi->next) { + if (strcmp(ksi->idname, name) == 0) + return ksi; } + + /* no matches found */ + return NULL; } - -/* Get the first builtin KeyingSet with the given name, which occurs after the given one (or start of list if none given) */ -KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, char name[]) +/* Find builtin KeyingSet by name */ +KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, const char name[]) { KeyingSet *ks, *first=NULL; - /* sanity checks - any name to check? */ + /* sanity checks any name to check? */ if (name[0] == 0) return NULL; @@ -1124,145 +567,240 @@ KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, char name[]) return NULL; } +/* --------------- */ + +/* Add the given KeyingSetInfo to the list of type infos, and create an appropriate builtin set too */ +void ANIM_keyingset_info_register (const bContext *C, KeyingSetInfo *ksi) +{ + KeyingSet *ks; + + /* create a new KeyingSet + * - inherit name and keyframing settings from the typeinfo + */ + ks = BKE_keyingset_add(&builtin_keyingsets, ksi->name, 1, ksi->keyingflag); + + /* link this KeyingSet with its typeinfo */ + memcpy(&ks->typeinfo, ksi->idname, sizeof(ks->typeinfo)); + + /* add type-info to the list */ + BLI_addtail(&keyingset_type_infos, ksi); +} + +/* Remove the given KeyingSetInfo from the list of type infos, and also remove the builtin set if appropriate */ +void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi) +{ + Scene *scene = CTX_data_scene(C); + KeyingSet *ks, *ksn; + + /* find relevant builtin KeyingSets which use this, and remove them */ + // TODO: this isn't done now, since unregister is really only used atm when we + // reload the scripts, which kindof defeats the purpose of "builtin"? + for (ks= builtin_keyingsets.first; ks; ks= ksn) { + ksn = ks->next; + + /* remove if matching typeinfo name */ + if (strcmp(ks->typeinfo, ksi->idname) == 0) { + BKE_keyingset_free(ks); + BLI_freelinkN(&scene->keyingsets, ks); + } + } + + /* free the type info */ + BLI_freelinkN(&keyingset_type_infos, ksi); +} + +/* --------------- */ + +void ANIM_keyingset_infos_exit () +{ + KeyingSetInfo *ksi, *next; + + /* free type infos */ + for (ksi=keyingset_type_infos.first; ksi; ksi=next) { + next= ksi->next; + + /* free extra RNA data, and remove from list */ + if (ksi->ext.free) + ksi->ext.free(ksi->ext.data); + BLI_freelinkN(&keyingset_type_infos, ksi); + } + + /* free builtin sets */ + BKE_keyingsets_free(&builtin_keyingsets); +} + +/* ******************************************* */ +/* KEYING SETS API (for UI) */ + +/* Getters for Active/Indices ----------------------------- */ /* Get the active Keying Set for the Scene provided */ KeyingSet *ANIM_scene_get_active_keyingset (Scene *scene) { - if (ELEM(NULL, scene, scene->keyingsets.first)) + /* if no scene, we've got no hope of finding the Keying Set */ + if (scene == NULL) return NULL; /* currently, there are several possibilities here: * - 0: no active keying set * - > 0: one of the user-defined Keying Sets, but indices start from 0 (hence the -1) - * - < 0: a builtin keying set (XXX this isn't enabled yet so that we don't get errors on reading back files) + * - < 0: a builtin keying set */ if (scene->active_keyingset > 0) return BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); - else // for now... - return NULL; + else + return BLI_findlink(&builtin_keyingsets, (-scene->active_keyingset)-1); } +/* Get the index of the Keying Set provided, for the given Scene */ +int ANIM_scene_get_keyingset_index (Scene *scene, KeyingSet *ks) +{ + int index; + + /* if no KeyingSet provided, have none */ + if (ks == NULL) + return 0; + + /* check if the KeyingSet exists in scene list */ + if (scene) { + /* get index and if valid, return + * - (absolute) Scene KeyingSets are from (>= 1) + */ + index = BLI_findindex(&scene->keyingsets, ks); + if (index != -1) + return (index + 1); + } + + /* still here, so try builtins list too + * - builtins are from (<= -1) + * - none/invalid is (= 0) + */ + index = BLI_findindex(&builtin_keyingsets, ks); + if (index != -1) + return -(index + 1); + else + return 0; +} + +/* Menu of All Keying Sets ----------------------------- */ + +/* Create (and show) a menu containing all the Keying Sets which can be used in the current context */ +void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[]) +{ + Scene *scene= CTX_data_scene(C); + KeyingSet *ks; + uiPopupMenu *pup; + uiLayout *layout; + int i = 0; + + pup= uiPupMenuBegin(C, title, 0); + layout= uiPupMenuLayout(pup); + + /* active Keying Set + * - only include entry if it exists + */ + if (scene->active_keyingset) { + uiItemIntO(layout, "Active Keying Set", 0, op_name, "type", i++); + uiItemS(layout); + } + else + i++; + + /* user-defined Keying Sets + * - these are listed in the order in which they were defined for the active scene + */ + if (scene->keyingsets.first) { + for (ks= scene->keyingsets.first; ks; ks= ks->next) { + if (ANIM_keyingset_context_ok_poll(C, ks)) + uiItemIntO(layout, ks->name, 0, op_name, "type", i++); + } + uiItemS(layout); + } + + /* builtin Keying Sets */ + i= -1; + for (ks= builtin_keyingsets.first; ks; ks= ks->next) { + /* only show KeyingSet if context is suitable */ + if (ANIM_keyingset_context_ok_poll(C, ks)) + uiItemIntO(layout, ks->name, 0, op_name, "type", i--); + } + + uiPupMenuEnd(C, pup); +} + /* ******************************************* */ /* KEYFRAME MODIFICATION */ -/* KeyingSet Menu Helpers ------------ */ +/* Polling API ----------------------------------------------- */ -/* Extract the maximum set of requirements from the KeyingSet */ -static int keyingset_relative_get_templates (KeyingSet *ks) +/* Check if KeyingSet can be used in the current context */ +short ANIM_keyingset_context_ok_poll (bContext *C, KeyingSet *ks) { - KS_Path *ksp; - int templates= 0; - - /* loop over the paths (could be slow to do for a number of KeyingSets)? */ - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { - /* add the destination's templates to the set of templates required for the set */ - templates |= ksp->templates; + if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) { + KeyingSetInfo *ksi = ANIM_keyingset_info_find_named(ks->typeinfo); + + /* get the associated 'type info' for this KeyingSet */ + if (ksi == NULL) + return 0; + // TODO: check for missing callbacks! + + /* check if it can be used in the current context */ + return (ksi->poll(ksi, C)); } - return templates; -} - -/* Check if context data is suitable for the given Keying Set */ -short keyingset_context_ok_poll (bContext *C, KeyingSet *ks) -{ - // TODO: - // For 'relative' keyingsets (i.e. py-keyingsets), add a call here - // which basically gets a listing of all the paths to be used for this - // set. - - return 1; } -/* KeyingSet Context Operations ------------ */ +/* Special 'Overrides' Iterator for Relative KeyingSets ------ */ -/* Get list of data-sources from context (in 3D-View) for inserting keyframes using the given relative Keying Set */ -static short modifykey_get_context_v3d_data (bContext *C, ListBase *dsources, KeyingSet *ks) +/* 'Data Sources' for relative Keying Set 'overrides' + * - this is basically a wrapper for PointerRNA's in a linked list + * - do not allow this to be accessed from outside for now + */ +typedef struct tRKS_DSource { + struct tRKS_DSource *next, *prev; + PointerRNA ptr; /* the whole point of this exercise! */ +} tRKS_DSource; + + +/* Iterator used for overriding the behaviour of iterators defined for + * relative Keying Sets, with the main usage of this being operators + * requiring Auto Keyframing. Internal Use Only! + */ +static void RKS_ITER_overrides_list (KeyingSetInfo *ksi, bContext *C, KeyingSet *ks, ListBase *dsources) { - bCommonKeySrc *cks; - Object *obact= CTX_data_active_object(C); - int templates; - short ok= 0; + tRKS_DSource *ds; - /* get the templates in use in this KeyingSet which we should supply data for */ - templates = keyingset_relative_get_templates(ks); - - /* check if the active object is in PoseMode (i.e. only deal with bones) */ - // TODO: check with the templates to see what we really need to store - if ((obact && obact->pose) && (obact->mode & OB_MODE_POSE)) { - /* Pose Mode: Selected bones */ -#if 0 - //set_pose_keys(ob); /* sets pchan->flag to POSE_KEY if bone selected, and clears if not */ - - /* loop through posechannels */ - //for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) { - // if (pchan->flag & POSE_KEY) { - // } - //} -#endif - - CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) - { - /* add a new keying-source */ - cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc"); - BLI_addtail(dsources, cks); - - /* set necessary info */ - cks->id= &obact->id; - cks->pchan= pchan; - - if (templates & KSP_TEMPLATE_CONSTRAINT) - cks->con= constraints_get_active(&pchan->constraints); - - ok= 1; - } - CTX_DATA_END; + for (ds = dsources->first; ds; ds = ds->next) { + /* run generate callback on this data */ + ksi->generate(ksi, C, ks, &ds->ptr); } - else { - /* Object Mode: Selected objects */ - CTX_DATA_BEGIN(C, Object*, ob, selected_objects) - { - /* add a new keying-source */ - cks= MEM_callocN(sizeof(bCommonKeySrc), "bCommonKeySrc"); - BLI_addtail(dsources, cks); - - /* set necessary info */ - cks->id= &ob->id; - - if (templates & KSP_TEMPLATE_CONSTRAINT) - cks->con= constraints_get_active(&ob->constraints); - - ok= 1; - } - CTX_DATA_END; - } - - /* return whether any data was extracted */ - return ok; } -/* Get list of data-sources from context for inserting keyframes using the given relative Keying Set */ -short modifykey_get_context_data (bContext *C, ListBase *dsources, KeyingSet *ks) +/* Add new data source for relative Keying Sets */ +void ANIM_relative_keyingset_add_source (ListBase *dsources, ID *id, StructRNA *srna, void *data) { - ScrArea *sa= CTX_wm_area(C); + tRKS_DSource *ds; - /* for now, the active area is used to determine what set of contexts apply */ - if (sa == NULL) - return 0; - -#if 0 - switch (sa->spacetype) { - case SPACE_VIEW3D: /* 3D-View: Selected Objects or Bones */ - return modifykey_get_context_v3d_data(C, dsources, ks); - } + /* sanity checks + * - we must have somewhere to output the data + * - we must have both srna+data (and with id too optionally), or id by itself only + */ + if (dsources == NULL) + return; + if (ELEM(NULL, srna, data) && (id == NULL)) + return; - /* nothing happened */ - return 0; -#endif - - /* looking into this code, it doesnt use the 3D view - Campbell */ - return modifykey_get_context_v3d_data(C, dsources, ks); -} + /* allocate new elem, and add to the list */ + ds = MEM_callocN(sizeof(tRKS_DSource), "tRKS_DSource"); + BLI_addtail(dsources, ds); + + /* depending on what data we have, create using ID or full pointer call */ + if (srna && data) + RNA_pointer_create(id, srna, data, &ds->ptr); + else + RNA_id_pointer_create(id, &ds->ptr); +} /* KeyingSet Operations (Insert/Delete Keyframes) ------------ */ @@ -1270,8 +808,9 @@ short modifykey_get_context_data (bContext *C, ListBase *dsources, KeyingSet *ks * by the KeyingSet. This takes into account many of the different combinations of using KeyingSets. * Returns the number of channels that keyframes were added to */ -int modify_keyframes (Scene *scene, ListBase *dsources, bAction *act, KeyingSet *ks, short mode, float cfra) +int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingSet *ks, short mode, float cfra) { + Scene *scene= CTX_data_scene(C); KS_Path *ksp; int kflag=0, success= 0; char *groupname= NULL; @@ -1291,201 +830,101 @@ int modify_keyframes (Scene *scene, ListBase *dsources, bAction *act, KeyingSet else if (mode == MODIFYKEY_MODE_DELETE) kflag= 0; - /* check if the KeyingSet is absolute or not (i.e. does it requires sources info) */ - if (ks->flag & KEYINGSET_ABSOLUTE) { - /* Absolute KeyingSets are simpler to use, as all the destination info has already been - * provided by the user, and is stored, ready to use, in the KeyingSet paths. + /* if relative Keying Sets, poll and build up the paths */ + if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) { + KeyingSetInfo *ksi = ANIM_keyingset_info_find_named(ks->typeinfo); + + /* clear all existing paths + * NOTE: BKE_keyingset_free() frees all of the paths for the KeyingSet, but not the set itself */ - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { - int arraylen, i; - - /* get pointer to name of group to add channels to */ - if (ksp->groupmode == KSP_GROUP_NONE) - groupname= NULL; - else if (ksp->groupmode == KSP_GROUP_KSNAME) - groupname= ks->name; + BKE_keyingset_free(ks); + + /* get the associated 'type info' for this KeyingSet */ + if (ksi == NULL) + return MODIFYKEY_MISSING_TYPEINFO; + // TODO: check for missing callbacks! + + /* check if it can be used in the current context */ + if (ksi->poll(ksi, C)) { + /* if a list of data sources are provided, run a special iterator over them, + * otherwise, just continue per normal + */ + if (dsources) + RKS_ITER_overrides_list(ksi, C, ks, dsources); else - groupname= ksp->group; - - /* init arraylen and i - arraylen should be greater than i so that - * normal non-array entries get keyframed correctly - */ - i= ksp->array_index; - arraylen= i; - - /* get length of array if whole array option is enabled */ - if (ksp->flag & KSP_FLAG_WHOLE_ARRAY) { - PointerRNA id_ptr, ptr; - PropertyRNA *prop; + ksi->iter(ksi, C, ks); - RNA_id_pointer_create(ksp->id, &id_ptr); - if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop) && prop) - arraylen= RNA_property_array_length(&ptr, prop); - } - - /* we should do at least one step */ - if (arraylen == i) - arraylen++; - - /* for each possible index, perform operation - * - assume that arraylen is greater than index - */ - for (; i < arraylen; i++) { - /* action to take depends on mode */ - if (mode == MODIFYKEY_MODE_INSERT) - success += insert_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag); - else if (mode == MODIFYKEY_MODE_DELETE) - success += delete_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag); - } - - /* set recalc-flags */ - if (ksp->id) { - switch (GS(ksp->id->name)) { - case ID_OB: /* Object (or Object-Related) Keyframes */ - { - Object *ob= (Object *)ksp->id; - - ob->recalc |= OB_RECALC; - } - break; - } - - /* send notifiers for updates (this doesn't require context to work!) */ - WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); - } + /* if we don't have any paths now, then this still qualifies as invalid context */ + if (ks->paths.first == NULL) + return MODIFYKEY_INVALID_CONTEXT; + } + else { + /* poll callback tells us that KeyingSet is useless in current context */ + return MODIFYKEY_INVALID_CONTEXT; } } - else if (dsources && dsources->first) { - /* for each one of the 'sources', resolve the template markers and expand arrays, then insert keyframes */ - bCommonKeySrc *cks; + + /* apply the paths as specified in the KeyingSet now */ + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + int arraylen, i; + short kflag2; - /* for each 'source' for keyframe data, resolve each of the paths from the KeyingSet */ - for (cks= dsources->first; cks; cks= cks->next) { - /* for each path in KeyingSet, construct a path using the templates */ - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { - DynStr *pathds= BLI_dynstr_new(); - char *path = NULL; - int arraylen, i; - - /* set initial group name */ - if (cks->id == NULL) { - printf("ERROR: Skipping 'Common-Key' Source. No valid ID present.\n"); - continue; - } - else - groupname= cks->id->name+2; - - /* construct the path */ - // FIXME: this currently only works with a few hardcoded cases - if ((ksp->templates & KSP_TEMPLATE_PCHAN) && (cks->pchan)) { - /* add basic pose-channel path access */ - BLI_dynstr_append(pathds, "pose.bones[\""); - BLI_dynstr_append(pathds, cks->pchan->name); - BLI_dynstr_append(pathds, "\"]"); - - /* override default group name */ - groupname= cks->pchan->name; - } - if ((ksp->templates & KSP_TEMPLATE_CONSTRAINT) && (cks->con)) { - /* add basic constraint path access */ - BLI_dynstr_append(pathds, "constraints[\""); - BLI_dynstr_append(pathds, cks->con->name); - BLI_dynstr_append(pathds, "\"]"); - - /* override default group name */ - groupname= cks->con->name; - } + /* since keying settings can be defined on the paths too, extend the path before using it */ + kflag2 = (kflag | ksp->keyingflag); + + /* get pointer to name of group to add channels to */ + if (ksp->groupmode == KSP_GROUP_NONE) + groupname= NULL; + else if (ksp->groupmode == KSP_GROUP_KSNAME) + groupname= ks->name; + else + groupname= ksp->group; + + /* init arraylen and i - arraylen should be greater than i so that + * normal non-array entries get keyframed correctly + */ + i= ksp->array_index; + arraylen= i; + + /* get length of array if whole array option is enabled */ + if (ksp->flag & KSP_FLAG_WHOLE_ARRAY) { + PointerRNA id_ptr, ptr; + PropertyRNA *prop; + + RNA_id_pointer_create(ksp->id, &id_ptr); + if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop) && prop) + arraylen= RNA_property_array_length(&ptr, prop); + } + + /* we should do at least one step */ + if (arraylen == i) + arraylen++; + + /* for each possible index, perform operation + * - assume that arraylen is greater than index + */ + for (; i < arraylen; i++) { + /* action to take depends on mode */ + if (mode == MODIFYKEY_MODE_INSERT) + success += insert_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2); + else if (mode == MODIFYKEY_MODE_DELETE) + success += delete_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2); + } + + /* set recalc-flags */ + if (ksp->id) { + switch (GS(ksp->id->name)) { + case ID_OB: /* Object (or Object-Related) Keyframes */ { - /* add property stored in KeyingSet Path */ - if (BLI_dynstr_get_len(pathds)) - BLI_dynstr_append(pathds, "."); - - /* apply some further templates? */ - if (ksp->templates & KSP_TEMPLATE_ROT) { - /* for builtin Keying Sets, this template makes the best fitting path for the - * current rotation mode of the Object / PoseChannel to be used - */ - if (strcmp(ksp->rna_path, "rotation")==0) { - /* get rotation mode */ - short rotmode= (cks->pchan)? (cks->pchan->rotmode) : - (GS(cks->id->name)==ID_OB)? ( ((Object *)cks->id)->rotmode ) : - (0); - - /* determine path to build */ - if (rotmode == ROT_MODE_QUAT) - BLI_dynstr_append(pathds, "rotation_quaternion"); - else if (rotmode == ROT_MODE_AXISANGLE) - BLI_dynstr_append(pathds, "rotation_axis_angle"); - else - BLI_dynstr_append(pathds, "rotation_euler"); - } - } - else { - /* just directly use the path */ - BLI_dynstr_append(pathds, ksp->rna_path); - } + Object *ob= (Object *)ksp->id; - /* convert to C-string */ - path= BLI_dynstr_get_cstring(pathds); - BLI_dynstr_free(pathds); + ob->recalc |= OB_RECALC_ALL; // XXX: only object transforms only? } - - /* get pointer to name of group to add channels to - * - KSP_GROUP_TEMPLATE_ITEM is handled above while constructing the paths - */ - if (ksp->groupmode == KSP_GROUP_NONE) - groupname= NULL; - else if (ksp->groupmode == KSP_GROUP_KSNAME) - groupname= ks->name; - else if (ksp->groupmode == KSP_GROUP_NAMED) - groupname= ksp->group; - - /* init arraylen and i - arraylen should be greater than i so that - * normal non-array entries get keyframed correctly - */ - i= ksp->array_index; - arraylen= i+1; - - /* get length of array if whole array option is enabled */ - if (ksp->flag & KSP_FLAG_WHOLE_ARRAY) { - PointerRNA id_ptr, ptr; - PropertyRNA *prop; - - RNA_id_pointer_create(cks->id, &id_ptr); - if (RNA_path_resolve(&id_ptr, path, &ptr, &prop) && prop) - arraylen= RNA_property_array_length(&ptr, prop); - } - - /* for each possible index, perform operation - * - assume that arraylen is greater than index - */ - for (; i < arraylen; i++) { - /* action to take depends on mode */ - if (mode == MODIFYKEY_MODE_INSERT) - success+= insert_keyframe(cks->id, act, groupname, path, i, cfra, kflag); - else if (mode == MODIFYKEY_MODE_DELETE) - success+= delete_keyframe(cks->id, act, groupname, path, i, cfra, kflag); - } - - /* free the path */ - MEM_freeN(path); + break; } - /* set recalc-flags */ - if (cks->id) { - switch (GS(cks->id->name)) { - case ID_OB: /* Object (or Object-Related) Keyframes */ - { - Object *ob= (Object *)cks->id; - - ob->recalc |= OB_RECALC; - } - break; - } - - /* send notifiers for updates (this doesn't require context to work!) */ - WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); - } + /* send notifiers for updates (this doesn't require context to work!) */ + WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } } diff --git a/source/blender/editors/armature/CMakeLists.txt b/source/blender/editors/armature/CMakeLists.txt new file mode 100644 index 00000000000..9e22bbd7d44 --- /dev/null +++ b/source/blender/editors/armature/CMakeLists.txt @@ -0,0 +1,39 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/guardedalloc + ../../../../intern/opennl/extern +) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_armature "${SRC}" "${INC}") diff --git a/source/blender/editors/armature/Makefile b/source/blender/editors/armature/Makefile index 0291bcb1830..4838282de92 100644 --- a/source/blender/editors/armature/Makefile +++ b/source/blender/editors/armature/Makefile @@ -50,7 +50,6 @@ CPPFLAGS += -I../../imbuf CPPFLAGS += -I../../python CPPFLAGS += -I../../gpu CPPFLAGS += -I../../makesrna -CPPFLAGS += -I../../render/extern/include CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include # own include diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 9d0db52d007..fadb4f234d9 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -107,6 +107,8 @@ void POSE_OT_group_remove(struct wmOperatorType *ot); void POSE_OT_group_remove(struct wmOperatorType *ot); void POSE_OT_group_assign(struct wmOperatorType *ot); void POSE_OT_group_unassign(struct wmOperatorType *ot); +void POSE_OT_group_select(struct wmOperatorType *ot); +void POSE_OT_group_deselect(struct wmOperatorType *ot); void POSE_OT_paths_calculate(struct wmOperatorType *ot); void POSE_OT_paths_clear(struct wmOperatorType *ot); @@ -130,6 +132,7 @@ void SKETCH_OT_draw_stroke(struct wmOperatorType *ot); void SKETCH_OT_draw_preview(struct wmOperatorType *ot); void SKETCH_OT_finish_stroke(struct wmOperatorType *ot); void SKETCH_OT_cancel_stroke(struct wmOperatorType *ot); +void SKETCH_OT_convert(struct wmOperatorType *ot); void SKETCH_OT_select(struct wmOperatorType *ot); /* ******************************************************* */ diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index ba2c6597e43..7abf8575921 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,13 +31,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -47,14 +40,12 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" #include "ED_armature.h" #include "ED_screen.h" -#include "ED_object.h" #include "ED_transform.h" #include "armature_intern.h" @@ -105,6 +96,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(SKETCH_OT_draw_preview); WM_operatortype_append(SKETCH_OT_finish_stroke); WM_operatortype_append(SKETCH_OT_cancel_stroke); + WM_operatortype_append(SKETCH_OT_convert); WM_operatortype_append(SKETCH_OT_select); /* POSE */ @@ -134,6 +126,8 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_group_remove); WM_operatortype_append(POSE_OT_group_assign); WM_operatortype_append(POSE_OT_group_unassign); + WM_operatortype_append(POSE_OT_group_select); + WM_operatortype_append(POSE_OT_group_deselect); WM_operatortype_append(POSE_OT_paths_calculate); WM_operatortype_append(POSE_OT_paths_clear); @@ -198,14 +192,16 @@ void ED_keymap_armature(wmKeyConfig *keyconf) /* Armature -> Etch-A-Ton ------------------------ */ WM_keymap_add_item(keymap, "SKETCH_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SKETCH_OT_delete", DELKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "SKETCH_OT_finish_stroke", SELECTMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "SKETCH_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "SKETCH_OT_finish_stroke", RIGHTMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SKETCH_OT_cancel_stroke", ESCKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "SKETCH_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); + // Already part of view3d select + //WM_keymap_add_item(keymap, "SKETCH_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); /* sketch poll checks mode */ - WM_keymap_add_item(keymap, "SKETCH_OT_gesture", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", ACTIONMOUSE, KM_PRESS, 0, 0); - kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "SKETCH_OT_gesture", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", LEFTMOUSE, KM_PRESS, 0, 0); + kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); RNA_boolean_set(kmi->ptr, "snap", 1); WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, 0, 0); kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, KM_CTRL, 0); @@ -242,6 +238,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ARMATURE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_extrude_move", EKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_extrude_forked", EKEY, KM_PRESS, KM_SHIFT, 0); @@ -265,7 +262,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) /* special transforms: */ /* 1) envelope/b-bone size */ - kmi= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0); + kmi= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE); /* 2) set roll */ kmi= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", RKEY, KM_PRESS, KM_CTRL, 0); @@ -286,9 +283,9 @@ void ED_keymap_armature(wmKeyConfig *keyconf) kmi= WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "unselected", 1); WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); - + WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_apply", AKEY, KM_PRESS, KM_CTRL, 0); - + // TODO: clear pose WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0); @@ -342,12 +339,13 @@ void ED_keymap_armature(wmKeyConfig *keyconf) /* special transforms: */ /* 1) envelope/b-bone size */ - kmi= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0); + kmi= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE); - // XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith + /* keyframes management */ WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_insert_menu", IKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_delete_v3d", IKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_verify_item(keymap, "ANIM_OT_keying_set_active_set", IKEY, KM_PRESS, KM_CTRL|KM_SHIFT|KM_ALT, 0); /* Pose -> PoseLib ------------- */ /* only set in posemode, by space_view3d listener */ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index eeb256a8be5..7a2d26af4ed 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -34,22 +34,10 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_ID.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_modifier_types.h" -#include "DNA_ipo_types.h" -#include "DNA_curve_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -72,7 +60,6 @@ #include "BKE_subsurf.h" #include "BKE_utildefines.h" #include "BKE_modifier.h" -#include "PIL_time.h" #include "BIF_gl.h" #include "BIF_generate.h" @@ -88,7 +75,6 @@ #include "ED_mesh.h" #include "ED_object.h" #include "ED_screen.h" -#include "ED_transform.h" #include "ED_util.h" #include "ED_view3d.h" @@ -102,7 +88,6 @@ #endif /* ************* XXX *************** */ -static int okee() {return 0;} static void BIF_undo_push(const char *msg) {} /* ************* XXX *************** */ @@ -154,7 +139,7 @@ static void bone_free(bArmature *arm, EditBone *bone) BLI_freelinkN(arm->edbo, bone); } -void ED_armature_edit_bone_remove(bArmature *arm, EditBone* exBone) +void ED_armature_edit_bone_remove(bArmature *arm, EditBone *exBone) { EditBone *curBone; @@ -471,8 +456,8 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) /* Do the adjustments */ for (ebone= arm->edbo->first; ebone; ebone=ebone->next) { - sub_v3_v3v3(ebone->head, ebone->head, cent); - sub_v3_v3v3(ebone->tail, ebone->tail, cent); + sub_v3_v3(ebone->head, cent); + sub_v3_v3(ebone->tail, cent); } /* Turn the list into an armature */ @@ -483,9 +468,7 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) copy_m3_m4(omat, ob->obmat); mul_m3_v3(omat, cent); - ob->loc[0] += cent[0]; - ob->loc[1] += cent[1]; - ob->loc[2] += cent[2]; + add_v3_v3(ob->loc, cent); } else ED_armature_edit_free(ob); @@ -493,9 +476,10 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) /* ---------------------- */ -static EditBone *editbone_name_exists (ListBase *edbo, char *name) +/* checks if an EditBone with a matching name already, returning the matching bone if it exists */ +static EditBone *editbone_name_exists (ListBase *edbo, const char *name) { - EditBone *eBone; + EditBone *eBone; for (eBone=edbo->first; eBone; eBone=eBone->next) { if (!strcmp(name, eBone->name)) @@ -508,9 +492,9 @@ static EditBone *editbone_name_exists (ListBase *edbo, char *name) void unique_editbone_name (ListBase *edbo, char *name, EditBone *bone) { EditBone *dupli; - char tempname[64]; - int number; - char *dot; + char tempname[64]; + int number; + char *dot; dupli = editbone_name_exists(edbo, name); @@ -545,7 +529,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob) /* apply current transform from parent (not yet destroyed), * then calculate new parent inverse matrix */ - ED_object_apply_obmat(ob); + object_apply_mat4(ob, ob->obmat); what_does_parent(scene, ob, &workob); invert_m4_m4(ob->parentinv, workob.obmat); @@ -906,6 +890,8 @@ int join_armature_exec(bContext *C, wmOperator *op) BLI_remlink(&opose->chanbase, pchan); BLI_addtail(&pose->chanbase, pchan); + free_pose_channels_hash(opose); + free_pose_channels_hash(pose); } ED_base_object_free_and_unlink(scene, base); @@ -1109,6 +1095,7 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel) /* free any of the extra-data this pchan might have */ free_pose_channel(pchan); + free_pose_channels_hash(ob->pose); /* get rid of unneeded bone */ bone_free(arm, curbone); @@ -1816,6 +1803,7 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op) if (curBone && (curBone->flag & BONE_SELECTED) && (arm->layer & curBone->layer)) { free_pose_channel(pchan); + free_pose_channels_hash(obedit->pose); BLI_freelinkN (&obedit->pose->chanbase, pchan); } else { @@ -1937,10 +1925,6 @@ void ED_armature_deselectall(Object *obedit, int toggle, int doundo) } ED_armature_sync_selection(arm->edbo); - if (doundo) { - if (sel==1) BIF_undo_push("Select All"); - else BIF_undo_push("Deselect All"); - } } @@ -1964,7 +1948,7 @@ int mouse_armature(bContext *C, short mval[2], int extend) ED_armature_deselectall(obedit, 0, 0); /* by definition the non-root connected bones have no root point drawn, - so a root selection needs to be delivered to the parent tip */ + so a root selection needs to be delivered to the parent tip */ if(selmask & BONE_SELECTED) { if(nearBone->parent && (nearBone->flag & BONE_CONNECTED)) { @@ -2045,15 +2029,6 @@ void ED_armature_edit_free(struct Object *ob) } } -void ED_armature_edit_remake(Object *obedit) -{ - if(okee("Reload original data")==0) return; - - ED_armature_to_edit(obedit); - -// BIF_undo_push("Delete bone"); -} - /* Put armature in EditMode */ void ED_armature_to_edit(Object *ob) { @@ -3691,7 +3666,7 @@ static int armature_subdivs_exec(bContext *C, wmOperator *op) void ARMATURE_OT_subdivs(wmOperatorType *ot) { static EnumPropertyItem type_items[]= { - {0, "SIMPLE", 0, "Simple", ""}, + {0, "SIMPLE", 0, "Simple", ""}, {1, "MULTI", 0, "Multi", ""}, {0, NULL, 0, NULL, NULL}}; @@ -3849,7 +3824,7 @@ static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBo VECCOPY(selbone->head, actbone->tail); selbone->rad_head= actbone->rad_tail; - add_v3_v3v3(selbone->tail, selbone->tail, offset); + add_v3_v3(selbone->tail, offset); /* offset for all its children */ for (ebone = edbo->first; ebone; ebone=ebone->next) { @@ -3857,8 +3832,8 @@ static void bone_connect_to_new_parent(ListBase *edbo, EditBone *selbone, EditBo for (par= ebone->parent; par; par= par->parent) { if (par==selbone) { - add_v3_v3v3(ebone->head, ebone->head, offset); - add_v3_v3v3(ebone->tail, ebone->tail, offset); + add_v3_v3(ebone->head, offset); + add_v3_v3(ebone->tail, offset); break; } } @@ -3958,11 +3933,11 @@ static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *even } CTX_DATA_END; - uiItemEnumO(layout, NULL, 0, "ARMATURE_OT_parent_set", "type", ARM_PAR_CONNECT); + uiItemEnumO(layout, "ARMATURE_OT_parent_set", NULL, 0, "type", ARM_PAR_CONNECT); /* ob becomes parent, make the associated menus */ if (allchildbones) - uiItemEnumO(layout, NULL, 0, "ARMATURE_OT_parent_set", "type", ARM_PAR_OFFSET); + uiItemEnumO(layout, "ARMATURE_OT_parent_set", NULL, 0, "type", ARM_PAR_OFFSET); uiPupMenuEnd(C, pup); @@ -4212,7 +4187,7 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot) /* props */ RNA_def_enum(ot->srna, "direction", direction_items, - BONE_SELECT_PARENT, "Direction", ""); + BONE_SELECT_PARENT, "Direction", ""); RNA_def_boolean(ot->srna, "extend", 0, "Add to Selection", ""); } @@ -4228,8 +4203,8 @@ static void fix_connected_bone(EditBone *ebone) /* if the parent has moved we translate child's head and tail accordingly*/ sub_v3_v3v3(diff, ebone->parent->tail, ebone->head); - add_v3_v3v3(ebone->head, ebone->head, diff); - add_v3_v3v3(ebone->tail, ebone->tail, diff); + add_v3_v3(ebone->head, diff); + add_v3_v3(ebone->tail, diff); return; } @@ -4357,28 +4332,28 @@ void ARMATURE_OT_align(wmOperatorType *ot) static int bone_looper(Object *ob, Bone *bone, void *data, int (*bone_func)(Object *, Bone *, void *)) { - /* We want to apply the function bone_func to every bone + /* We want to apply the function bone_func to every bone * in an armature -- feed bone_looper the first bone and * a pointer to the bone_func and watch it go!. The int count * can be useful for counting bones with a certain property * (e.g. skinnable) */ - int count = 0; + int count = 0; - if (bone) { + if (bone) { /* only do bone_func if the bone is non null */ - count += bone_func(ob, bone, data); + count += bone_func(ob, bone, data); /* try to execute bone_func for the first child */ - count += bone_looper(ob, bone->childbase.first, data, bone_func); + count += bone_looper(ob, bone->childbase.first, data, bone_func); /* try to execute bone_func for the next bone at this * depth of the recursion. */ - count += bone_looper(ob, bone->next, data, bone_func); - } + count += bone_looper(ob, bone->next, data, bone_func); + } - return count; + return count; } /* called from editview.c, for mode-less pose selection */ @@ -4496,28 +4471,28 @@ void ED_pose_deselectall (Object *ob, int test, int doundo) static int bone_skinnable(Object *ob, Bone *bone, void *datap) { - /* Bones that are deforming - * are regarded to be "skinnable" and are eligible for - * auto-skinning. - * - * This function performs 2 functions: - * - * a) It returns 1 if the bone is skinnable. - * If we loop over all bones with this - * function, we can count the number of - * skinnable bones. - * b) If the pointer data is non null, - * it is treated like a handle to a - * bone pointer -- the bone pointer - * is set to point at this bone, and - * the pointer the handle points to - * is incremented to point to the - * next member of an array of pointers - * to bones. This way we can loop using - * this function to construct an array of - * pointers to bones that point to all - * skinnable bones. - */ + /* Bones that are deforming + * are regarded to be "skinnable" and are eligible for + * auto-skinning. + * + * This function performs 2 functions: + * + * a) It returns 1 if the bone is skinnable. + * If we loop over all bones with this + * function, we can count the number of + * skinnable bones. + * b) If the pointer data is non null, + * it is treated like a handle to a + * bone pointer -- the bone pointer + * is set to point at this bone, and + * the pointer the handle points to + * is incremented to point to the + * next member of an array of pointers + * to bones. This way we can loop using + * this function to construct an array of + * pointers to bones that point to all + * skinnable bones. + */ Bone ***hbone; int a, segments; struct { Object *armob; void *list; int heat; } *data = datap; @@ -4540,62 +4515,65 @@ static int bone_skinnable(Object *ob, Bone *bone, void *datap) return segments; } } - return 0; + return 0; } static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data) { - /* This group creates a vertex group to ob that has the - * same name as bone (provided the bone is skinnable). + /* This group creates a vertex group to ob that has the + * same name as bone (provided the bone is skinnable). * If such a vertex group aleady exist the routine exits. - */ + */ if (!(bone->flag & BONE_NO_DEFORM)) { if (!defgroup_find_name(ob,bone->name)) { ED_vgroup_add_name(ob, bone->name); return 1; } - } - return 0; + } + return 0; } static int dgroup_skinnable(Object *ob, Bone *bone, void *datap) { - /* Bones that are deforming - * are regarded to be "skinnable" and are eligible for - * auto-skinning. - * - * This function performs 2 functions: - * - * a) If the bone is skinnable, it creates - * a vertex group for ob that has - * the name of the skinnable bone - * (if one doesn't exist already). - * b) If the pointer data is non null, - * it is treated like a handle to a - * bDeformGroup pointer -- the - * bDeformGroup pointer is set to point - * to the deform group with the bone's - * name, and the pointer the handle - * points to is incremented to point to the - * next member of an array of pointers - * to bDeformGroups. This way we can loop using - * this function to construct an array of - * pointers to bDeformGroups, all with names - * of skinnable bones. - */ - bDeformGroup ***hgroup, *defgroup; + /* Bones that are deforming + * are regarded to be "skinnable" and are eligible for + * auto-skinning. + * + * This function performs 2 functions: + * + * a) If the bone is skinnable, it creates + * a vertex group for ob that has + * the name of the skinnable bone + * (if one doesn't exist already). + * b) If the pointer data is non null, + * it is treated like a handle to a + * bDeformGroup pointer -- the + * bDeformGroup pointer is set to point + * to the deform group with the bone's + * name, and the pointer the handle + * points to is incremented to point to the + * next member of an array of pointers + * to bDeformGroups. This way we can loop using + * this function to construct an array of + * pointers to bDeformGroups, all with names + * of skinnable bones. + */ + bDeformGroup ***hgroup, *defgroup= NULL; int a, segments; struct { Object *armob; void *list; int heat; } *data= datap; + int wpmode = (ob->mode & OB_MODE_WEIGHT_PAINT); + bArmature *arm= data->armob->data; - if (!(ob->mode & OB_MODE_WEIGHT_PAINT) || !(bone->flag & BONE_HIDDEN_P)) { + if (!wpmode || !(bone->flag & BONE_HIDDEN_P)) { if (!(bone->flag & BONE_NO_DEFORM)) { if (data->heat && data->armob->pose && get_pose_channel(data->armob->pose, bone->name)) segments = bone->segments; else segments = 1; - - if (!(defgroup = defgroup_find_name(ob, bone->name))) - defgroup = ED_vgroup_add_name(ob, bone->name); + + if(!wpmode || ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED))) + if (!(defgroup = defgroup_find_name(ob, bone->name))) + defgroup = ED_vgroup_add_name(ob, bone->name); if (data->list != NULL) { hgroup = (bDeformGroup ***) &data->list; @@ -4608,7 +4586,7 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *datap) return segments; } } - return 0; + return 0; } static void add_vgroups__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s) @@ -4721,7 +4699,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m selected = MEM_callocN(numbones*sizeof(int), "selected"); for (j=0; j < numbones; ++j) { - bone = bonelist[j]; + bone = bonelist[j]; dgroup = dgrouplist[j]; /* handle bbone */ @@ -4769,7 +4747,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m selected[j] = 1; /* find flipped group */ - if (mirror) { + if (dgroup && mirror) { char name[32]; BLI_strncpy(name, dgroup->name, 32); @@ -4786,7 +4764,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m } /* create verts */ - mesh = (Mesh*)ob->data; + mesh = (Mesh*)ob->data; verts = MEM_callocN(mesh->totvert*sizeof(*verts), "closestboneverts"); if (wpmode) { @@ -4802,7 +4780,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m } else if (modifiers_findByType(ob, eModifierType_Subsurf)) { /* is subsurf on? Lets use the verts on the limit surface then. - * = same amount of vertices as mesh, but vertices moved to the + * = same amount of vertices as mesh, but vertices moved to the * subsurfed position, like for 'optimal'. */ subsurf_calculate_limit_positions(mesh, verts); vertsfilled = 1; @@ -4825,9 +4803,9 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m dgroupflip, root, tip, selected, mat4_to_scale(par->obmat)); } - /* free the memory allocated */ - MEM_freeN(bonelist); - MEM_freeN(dgrouplist); + /* free the memory allocated */ + MEM_freeN(bonelist); + MEM_freeN(dgrouplist); MEM_freeN(dgroupflip); MEM_freeN(root); MEM_freeN(tip); @@ -4867,12 +4845,7 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op) Object *ob= CTX_data_active_object(C); KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scaling"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; + short autokey = 0; /* only clear those channels that are not locked */ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) { @@ -4885,13 +4858,12 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op) /* do auto-keyframing as appropriate */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); - /* clear any unkeyed tags */ if (pchan->bone) pchan->bone->flag &= ~BONE_UNKEYED; + + /* tag for autokeying later */ + autokey = 1; } else { /* add unkeyed tags */ @@ -4901,6 +4873,16 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op) } CTX_DATA_END; + /* perform autokeying on the bones if needed */ + if (autokey) { + /* insert keyframes */ + ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + + /* now recalculate paths */ + if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) + ED_pose_recalculate_paths(C, scene, ob); + } + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* note, notifier might evolve */ @@ -4930,12 +4912,7 @@ static int pose_clear_loc_exec(bContext *C, wmOperator *op) Object *ob= CTX_data_active_object(C); KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; + short autokey = 0; /* only clear those channels that are not locked */ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) { @@ -4949,13 +4926,12 @@ static int pose_clear_loc_exec(bContext *C, wmOperator *op) /* do auto-keyframing as appropriate */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); - /* clear any unkeyed tags */ if (pchan->bone) pchan->bone->flag &= ~BONE_UNKEYED; + + /* tag for autokeying later */ + autokey = 1; } else { /* add unkeyed tags */ @@ -4965,6 +4941,16 @@ static int pose_clear_loc_exec(bContext *C, wmOperator *op) } CTX_DATA_END; + /* perform autokeying on the bones if needed */ + if (autokey) { + /* insert keyframes */ + ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + + /* now recalculate paths */ + if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) + ED_pose_recalculate_paths(C, scene, ob); + } + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* note, notifier might evolve */ @@ -4994,12 +4980,7 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op) Object *ob= CTX_data_active_object(C); KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; + short autokey = 0; /* only clear those channels that are not locked */ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) { @@ -5079,7 +5060,7 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op) VECCOPY(pchan->eul, eul); } } - } + } // Duplicated in source/blender/editors/object/object_transform.c else { if (pchan->rotmode == ROT_MODE_QUAT) { pchan->quat[1]=pchan->quat[2]=pchan->quat[3]= 0.0f; @@ -5097,13 +5078,12 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op) /* do auto-keyframing as appropriate */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); - /* clear any unkeyed tags */ if (pchan->bone) pchan->bone->flag &= ~BONE_UNKEYED; + + /* tag for autokeying later */ + autokey = 1; } else { /* add unkeyed tags */ @@ -5113,6 +5093,16 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op) } CTX_DATA_END; + /* perform autokeying on the bones if needed */ + if (autokey) { + /* insert keyframes */ + ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + + /* now recalculate paths */ + if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) + ED_pose_recalculate_paths(C, scene, ob); + } + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* note, notifier might evolve */ @@ -5528,7 +5518,7 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep) // TODO: should we be using the database wide version instead (since drivers may break) if (ob->adt) { /* posechannels only... */ - BKE_animdata_fix_paths_rename(&ob->id, ob->adt, "pose.bones", oldname, newname); + BKE_animdata_fix_paths_rename(&ob->id, ob->adt, "pose.bones", oldname, newname, 0, 0, 1); } } } @@ -5596,8 +5586,8 @@ static int armature_autoside_names_exec (bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) { BLI_strncpy(newname, ebone->name, sizeof(newname)); - bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]); - ED_armature_bone_rename(arm, ebone->name, newname); + if(bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis])) + ED_armature_bone_rename(arm, ebone->name, newname); } CTX_DATA_END; @@ -5613,7 +5603,7 @@ static int armature_autoside_names_exec (bContext *C, wmOperator *op) void ARMATURE_OT_autoside_names (wmOperatorType *ot) { static EnumPropertyItem axis_items[]= { - {0, "XAXIS", 0, "X-Axis", "Left/Right"}, + {0, "XAXIS", 0, "X-Axis", "Left/Right"}, {1, "YAXIS", 0, "Y-Axis", "Front/Back"}, {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"}, {0, NULL, 0, NULL, NULL}}; @@ -5793,7 +5783,7 @@ EditBone * test_subdivideByCorrelation(Scene *scene, Object *obedit, ReebArc *ar lastBone = subdivideArcBy(arm, arm->edbo, iter, invmat, tmat, nextAdaptativeSubdivision); } - return lastBone; + return lastBone; } float arcLengthRatio(ReebArc *arc) @@ -5880,7 +5870,7 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg) ED_armature_to_edit(obedit); - arcBoneMap = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + arcBoneMap = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "SkeletonFromReebGraph gh"); BLI_markdownSymmetry((BGraph*)rg, rg->nodes.first, scene->toolsettings->skgen_symmetry_limit); diff --git a/source/blender/editors/armature/editarmature_generate.c b/source/blender/editors/armature/editarmature_generate.c index b92e1652b4e..c48e7686ca9 100644 --- a/source/blender/editors/armature/editarmature_generate.c +++ b/source/blender/editors/armature/editarmature_generate.c @@ -34,7 +34,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" #include "DNA_armature_types.h" @@ -61,7 +60,7 @@ void setBoneRollFromNormal(EditBone *bone, float *no, float invmat[][4], float t sub_v3_v3v3(tangent, bone->tail, bone->head); project_v3_v3v3(vec, tangent, normal); - sub_v3_v3v3(normal, normal, vec); + sub_v3_v3(normal, vec); normalize_v3(normal); @@ -103,7 +102,7 @@ float calcArcCorrelation(BArcIterator *iter, int start, int end, float v0[3], fl IT_peek(iter, i); sub_v3_v3v3(v, iter->p, v0); project_v3_v3v3(d, v, n); - sub_v3_v3v3(v, v, d); + sub_v3_v3(v, d); dt = len_v3(d) - avg_t; @@ -250,7 +249,7 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st { VECCOPY(p, dv); mul_v3_fl(p, f); - add_v3_v3v3(p, p, vec0); + add_v3_v3(p, vec0); } else { @@ -266,7 +265,7 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st VECCOPY(p, dv); mul_v3_fl(p, lengthLimit); - add_v3_v3v3(p, p, head); + add_v3_v3(p, head); } return i - 1; /* restart at lower bound */ diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c index b3960c3cfd5..c2e21755f94 100644 --- a/source/blender/editors/armature/editarmature_retarget.c +++ b/source/blender/editors/armature/editarmature_retarget.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,23 +29,13 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "PIL_time.h" -#include "DNA_ID.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -68,7 +58,6 @@ #include "BIF_retarget.h" -#include "PIL_time.h" //#include "mydevice.h" #include "reeb.h" // FIX ME @@ -327,8 +316,8 @@ static RigGraph *newRigGraph() rg->head = NULL; - rg->bones_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); - rg->controls_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); + rg->bones_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "newRigGraph bones gh"); + rg->controls_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "newRigGraph cont gh"); rg->free_arc = RIG_freeRigArc; rg->free_node = NULL; @@ -572,7 +561,7 @@ static RigGraph *cloneRigGraph(RigGraph *src, ListBase *editbones, Object *ob, c RigControl *ctrl; RigGraph *rg; - ptr_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + ptr_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "cloneRigGraph gh"); rg = newRigGraph(); diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c index 6d1d26865af..a1af68458f6 100644 --- a/source/blender/editors/armature/editarmature_sketch.c +++ b/source/blender/editors/armature/editarmature_sketch.c @@ -26,14 +26,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_view3d_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_object_types.h" #include "DNA_armature_types.h" -#include "DNA_userdef_types.h" #include "RNA_define.h" #include "RNA_access.h" @@ -55,7 +49,6 @@ #include "ED_screen.h" #include "BIF_gl.h" -#include "UI_resources.h" //#include "BIF_screen.h" //#include "BIF_space.h" //#include "BIF_mywindow.h" @@ -175,7 +168,7 @@ void BIF_makeListTemplates(const bContext *C) BLI_ghash_free(TEMPLATES_HASH, NULL, NULL); } - TEMPLATES_HASH = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp); + TEMPLATES_HASH = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "makeListTemplates gh"); TEMPLATES_CURRENT = 0; for ( base = FIRSTBASE; base; base = base->next ) @@ -575,8 +568,8 @@ void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end) { float d_rgb[3] = {1, 1, 1}; - VECCOPY(rgb, color); - sub_v3_v3v3(d_rgb, d_rgb, rgb); + copy_v3_v3(rgb, color); + sub_v3_v3(d_rgb, rgb); mul_v3_fl(d_rgb, 1.0f / (float)stk->nb_points); for (i = 0; i < stk->nb_points; i++) @@ -614,7 +607,7 @@ void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end) glPopMatrix(); - add_v3_v3v3(rgb, rgb, d_rgb); + add_v3_v3(rgb, d_rgb); } } @@ -1012,7 +1005,7 @@ void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float viewray(ar, v3d, pval, ray_start, ray_normal); mul_v3_fl(ray_normal, distance * progress / length); - add_v3_v3v3(stk->points[i].p, stk->points[i].p, ray_normal); + add_v3_v3(stk->points[i].p, ray_normal); progress += delta ; } @@ -1635,7 +1628,7 @@ int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture) sub_v3_v3v3(isect->p, gesture->points[s_i + 1].p, gesture->points[s_i].p); mul_v3_fl(isect->p, lambda); - add_v3_v3v3(isect->p, isect->p, gesture->points[s_i].p); + add_v3_v3(isect->p, gesture->points[s_i].p); BLI_addtail(list, isect); @@ -2161,7 +2154,7 @@ void sk_applyGesture(bContext *C, SK_Sketch *sketch) /********************************************/ -void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) +int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) { ViewContext vc; rcti rect; @@ -2206,7 +2199,10 @@ void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) } + return 1; } + + return 0; } void sk_queueRedrawSketch(SK_Sketch *sketch) @@ -2308,7 +2304,7 @@ void sk_drawSketch(Scene *scene, View3D *v3d, SK_Sketch *sketch, int with_names) } } -#if 1 +#if 0 if (sketch->depth_peels.first != NULL) { float colors[8][3] = { @@ -2478,7 +2474,8 @@ void BIF_sk_selectStroke(bContext *C, short mval[2], short extend) if (sketch != NULL && ts->bone_sketching & BONE_SKETCHING) { - sk_selectStroke(C, sketch, mval, extend); + if (sk_selectStroke(C, sketch, mval, extend)) + ED_area_tag_redraw(CTX_wm_area(C)); } } @@ -2565,6 +2562,17 @@ SK_Sketch* viewcontextSketch(ViewContext *vc, int create) return sketch; } +static int sketch_convert(bContext *C, wmOperator *op, wmEvent *event) +{ + SK_Sketch *sketch = contextSketch(C, 0); + if (sketch != NULL) + { + sk_convert(C, sketch); + ED_area_tag_redraw(CTX_wm_area(C)); + } + return OPERATOR_FINISHED; +} + static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event) { SK_Sketch *sketch = contextSketch(C, 0); @@ -2597,8 +2605,8 @@ static int sketch_select(bContext *C, wmOperator *op, wmEvent *event) if (sketch) { short extend = 0; - sk_selectStroke(C, sketch, event->mval, extend); - ED_area_tag_redraw(CTX_wm_area(C)); + if (sk_selectStroke(C, sketch, event->mval, extend)) + ED_area_tag_redraw(CTX_wm_area(C)); } return OPERATOR_FINISHED; @@ -2671,6 +2679,7 @@ static int sketch_draw_modal(bContext *C, wmOperator *op, wmEvent *event, short RNA_boolean_set(op->ptr, "snap", snap); break; case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: dd->mval[0] = event->mval[0]; dd->mval[1] = event->mval[1]; sk_draw_stroke(C, sketch, stk, dd, snap); @@ -2866,6 +2875,21 @@ void SKETCH_OT_cancel_stroke(wmOperatorType *ot) // ot->flag= OPTYPE_UNDO; } +void SKETCH_OT_convert(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "convert"; + ot->idname= "SKETCH_OT_convert"; + + /* api callbacks */ + ot->invoke= sketch_convert; + + ot->poll= ED_operator_sketch_full_mode; + + /* flags */ + ot->flag= OPTYPE_UNDO; +} + void SKETCH_OT_finish_stroke(wmOperatorType *ot) { /* identifiers */ diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index 74793900f65..98986aa4663 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -33,7 +33,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" #include "DNA_object_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -45,6 +44,7 @@ #include "BLI_memarena.h" #include "BKE_DerivedMesh.h" +#include "BKE_modifier.h" #include "BKE_utildefines.h" #ifdef RIGID_DEFORM @@ -52,13 +52,10 @@ #include "BLI_polardecomp.h" #endif -#include "RE_raytrace.h" - #include "ONL_opennl.h" #include "BLO_sys_types.h" // for intptr_t support -#include "ED_armature.h" #include "ED_mesh.h" #include "meshlaplacian.h" @@ -66,7 +63,7 @@ /* ************* XXX *************** */ static void waitcursor(int val) {} -static void progress_bar() {} +static void progress_bar(int dummy_val, const char *dummy) {} static void start_progress_bar() {} static void end_progress_bar() {} static void error(char *str) { printf("error: %s\n", str); } @@ -108,8 +105,7 @@ struct LaplacianSystem { float *p; /* values from all p vectors */ float *mindist; /* minimum distance to a bone for all vertices */ - RayObject *raytree; /* ray tracing acceleration structure */ - RayFace *faces; /* faces to add to the ray tracing struture */ + BVHTree *bvhtree; /* ray tracing acceleration structure */ MFace **vface; /* a face that the vertex belongs to */ } heat; @@ -390,36 +386,72 @@ float laplacian_system_get_solution(int v) /************************* Heat Bone Weighting ******************************/ /* From "Automatic Rigging and Animation of 3D Characters" - Ilya Baran and Jovan Popovic, SIGGRAPH 2007 */ + Ilya Baran and Jovan Popovic, SIGGRAPH 2007 */ #define C_WEIGHT 1.0f #define WEIGHT_LIMIT_START 0.05f #define WEIGHT_LIMIT_END 0.025f #define DISTANCE_EPSILON 1e-4f +typedef struct BVHCallbackUserData { + float start[3]; + float vec[3]; + LaplacianSystem *sys; +} BVHCallbackUserData; + +static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit) +{ + BVHCallbackUserData *data = (struct BVHCallbackUserData*)userdata; + MFace *mf = data->sys->heat.mface + index; + float (*verts)[3] = data->sys->heat.verts; + float lambda, uv[2], n[3], dir[3]; + + mul_v3_v3fl(dir, data->vec, hit->dist); + + if(isect_ray_tri_v3(data->start, dir, verts[mf->v1], verts[mf->v2], verts[mf->v3], &lambda, uv)) { + normal_tri_v3(n, verts[mf->v1], verts[mf->v2], verts[mf->v3]); + if(lambda < 1.0f && dot_v3v3(n, data->vec) < -1e-5f) { + hit->index = index; + hit->dist *= lambda; + } + } + + mul_v3_v3fl(dir, data->vec, hit->dist); + + if(isect_ray_tri_v3(data->start, dir, verts[mf->v1], verts[mf->v3], verts[mf->v4], &lambda, uv)) { + normal_tri_v3(n, verts[mf->v1], verts[mf->v3], verts[mf->v4]); + if(lambda < 1.0f && dot_v3v3(n, data->vec) < -1e-5f) { + hit->index = index; + hit->dist *= lambda; + } + } +} + /* Raytracing for vertex to bone/vertex visibility */ static void heat_ray_tree_create(LaplacianSystem *sys) { MFace *mface = sys->heat.mface; + float (*verts)[3] = sys->heat.verts; int totface = sys->heat.totface; int totvert = sys->heat.totvert; int a; - sys->heat.raytree = RE_rayobject_vbvh_create(totface); - sys->heat.faces = MEM_callocN(sizeof(RayFace)*totface, "Heat RayFaces"); + sys->heat.bvhtree = BLI_bvhtree_new(totface, 0.0f, 4, 6); sys->heat.vface = MEM_callocN(sizeof(MFace*)*totvert, "HeatVFaces"); for(a=0; aheat.faces+a; + float bb[6]; - RayObject *obj = RE_rayface_from_coords( - rayface, &sys->heat, mf, - sys->heat.verts[mf->v1], sys->heat.verts[mf->v2], - sys->heat.verts[mf->v3], mf->v4 ? sys->heat.verts[mf->v4] : 0 - ); - RE_rayobject_add(sys->heat.raytree, obj); + INIT_MINMAX(bb, bb+3); + DO_MINMAX(verts[mf->v1], bb, bb+3); + DO_MINMAX(verts[mf->v2], bb, bb+3); + DO_MINMAX(verts[mf->v3], bb, bb+3); + if(mf->v4) { + DO_MINMAX(verts[mf->v4], bb, bb+3); + } + + BLI_bvhtree_insert(sys->heat.bvhtree, a, bb, 2); //Setup inverse pointers to use on isect.orig sys->heat.vface[mf->v1]= mf; @@ -427,12 +459,14 @@ static void heat_ray_tree_create(LaplacianSystem *sys) sys->heat.vface[mf->v3]= mf; if(mf->v4) sys->heat.vface[mf->v4]= mf; } - RE_rayobject_done(sys->heat.raytree); + + BLI_bvhtree_balance(sys->heat.bvhtree); } static int heat_ray_source_visible(LaplacianSystem *sys, int vertex, int source) { - Isect isec; + BVHTreeRayHit hit; + BVHCallbackUserData data; MFace *mface; float end[3]; int visible; @@ -441,27 +475,24 @@ static int heat_ray_source_visible(LaplacianSystem *sys, int vertex, int source) if(!mface) return 1; - /* setup isec */ - memset(&isec, 0, sizeof(isec)); - isec.mode= RE_RAY_SHADOW; - isec.lay= -1; - isec.orig.ob = &sys->heat; - isec.orig.face = mface; - isec.skip = RE_SKIP_CULLFACE; - - copy_v3_v3(isec.start, sys->heat.verts[vertex]); + data.sys= sys; + copy_v3_v3(data.start, sys->heat.verts[vertex]); if(sys->heat.root) /* bone */ - closest_to_line_segment_v3(end, isec.start, + closest_to_line_segment_v3(end, data.start, sys->heat.root[source], sys->heat.tip[source]); else /* vertex */ copy_v3_v3(end, sys->heat.source[source]); - sub_v3_v3v3(isec.vec, end, isec.start); - isec.labda = 1.0f - 1e-5; - madd_v3_v3v3fl(isec.start, isec.start, isec.vec, 1e-5); + sub_v3_v3v3(data.vec, end, data.start); + madd_v3_v3v3fl(data.start, data.start, data.vec, 1e-5); + mul_v3_fl(data.vec, 1.0f - 2e-5); - visible= !RE_rayobject_raycast(sys->heat.raytree, &isec); + /* pass normalized vec + distance to bvh */ + hit.index = -1; + hit.dist = normalize_v3(data.vec); + + visible= BLI_bvhtree_ray_cast(sys->heat.bvhtree, data.start, data.vec, 0.0f, &hit, bvh_callback, (void*)&data) == -1; return visible; } @@ -525,10 +556,8 @@ static void heat_set_H(LaplacianSystem *sys, int vertex) /* compute H entry */ if(numclosest > 0) { - if(mindist > 1e-5) - h= numclosest*C_WEIGHT/(mindist*mindist); - else - h= 1e10f; + mindist= maxf(mindist, 1e-4f); + h= numclosest*C_WEIGHT/(mindist*mindist); } else h= 0.0f; @@ -550,9 +579,9 @@ void heat_calc_vnormals(LaplacianSystem *sys) normal_tri_v3( fnor,sys->verts[v1], sys->verts[v2], sys->verts[v3]); - add_v3_v3v3(sys->heat.vnors[v1], sys->heat.vnors[v1], fnor); - add_v3_v3v3(sys->heat.vnors[v2], sys->heat.vnors[v2], fnor); - add_v3_v3v3(sys->heat.vnors[v3], sys->heat.vnors[v3], fnor); + add_v3_v3(sys->heat.vnors[v1], fnor); + add_v3_v3(sys->heat.vnors[v2], fnor); + add_v3_v3(sys->heat.vnors[v3], fnor); } for(a=0; atotvert; a++) @@ -590,9 +619,8 @@ static void heat_laplacian_create(LaplacianSystem *sys) static void heat_system_free(LaplacianSystem *sys) { - RE_rayobject_free(sys->heat.raytree); + BLI_bvhtree_free(sys->heat.bvhtree); MEM_freeN(sys->heat.vface); - MEM_freeN(sys->heat.faces); MEM_freeN(sys->heat.mindist); MEM_freeN(sys->heat.H); @@ -620,13 +648,24 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, LaplacianSystem *sys; MFace *mface; float solution, weight; - int *vertsflipped = NULL; + int *vertsflipped = NULL, *mask= NULL; int a, totface, j, bbone, firstsegment, lastsegment, thrownerror = 0; - /* count triangles */ + /* count triangles and create mask */ + if(me->editflag & ME_EDIT_PAINT_MASK) + mask= MEM_callocN(sizeof(int)*me->totvert, "heat_bone_weighting mask"); + for(totface=0, a=0, mface=me->mface; atotface; a++, mface++) { totface++; if(mface->v4) totface++; + + if(mask && (mface->flag & ME_FACE_SEL)) { + mask[mface->v1]= 1; + mask[mface->v2]= 1; + mask[mface->v3]= 1; + if(mface->v4) + mask[mface->v4]= 1; + } } /* create laplacian */ @@ -663,6 +702,9 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, /* clear weights */ if(bbone && firstsegment) { for(a=0; atotvert; a++) { + if(mask && !mask[a]) + continue; + ED_vgroup_vert_remove(ob, dgrouplist[j], a); if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0) ED_vgroup_vert_remove(ob, dgroupflip[j], vertsflipped[a]); @@ -681,6 +723,9 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, if(laplacian_system_solve(sys)) { /* load solution into vertex groups */ for(a=0; atotvert; a++) { + if(mask && !mask[a]) + continue; + solution= laplacian_system_get_solution(a); if(bbone) { @@ -725,6 +770,9 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, /* remove too small vertex weights */ if(bbone && lastsegment) { for(a=0; atotvert; a++) { + if(mask && !mask[a]) + continue; + weight= ED_vgroup_vert_weight(ob, dgrouplist[j], a); weight= heat_limit_weight(weight); if(weight <= 0.0f) @@ -742,6 +790,7 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, /* free */ if(vertsflipped) MEM_freeN(vertsflipped); + if(mask) MEM_freeN(mask); heat_system_free(sys); @@ -751,7 +800,7 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, #ifdef RIGID_DEFORM /********************** As-Rigid-As-Possible Deformation ******************/ /* From "As-Rigid-As-Possible Surface Modeling", - Olga Sorkine and Marc Alexa, ESGP 2007. */ + Olga Sorkine and Marc Alexa, ESGP 2007. */ /* investigate: - transpose R in orthogonal @@ -808,7 +857,7 @@ static void rigid_add_half_edge_to_rhs(LaplacianSystem *sys, EditVert *v1, EditV mul_v3_fl(rhs, 0.5f); mul_v3_fl(rhs, w); - add_v3_v3v3(sys->rigid.rhs[v1->tmp.l], sys->rigid.rhs[v1->tmp.l], rhs); + add_v3_v3(sys->rigid.rhs[v1->tmp.l], rhs); } static void rigid_add_edge_to_rhs(LaplacianSystem *sys, EditVert *v1, EditVert *v2, float w) @@ -1032,17 +1081,25 @@ typedef struct MeshDeformBind { /* direct solver */ int *varidx; - - /* raytrace */ - RayObject *raytree; } MeshDeformBind; +typedef struct MeshDeformIsect { + float start[3]; + float vec[3]; + float labda; + + void *face; + int isect; + float u, v; + +} MeshDeformIsect; + /* ray intersection */ /* our own triangle intersection, so we can fully control the epsilons and * prevent corner case from going wrong*/ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3], - float vert1[3], float vert2[3], float *isectco, float *uvw) + float vert1[3], float vert2[3], float *isectco, float *uvw) { float edge1[3], edge2[3], tvec[3], pvec[3], qvec[3]; float det,inv_det, u, v, dir[3], isectdir[3]; @@ -1099,63 +1156,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3], return 1; } -/* blender's raytracer is not use now, even though it is much faster. it can - * give problems with rays falling through, so we use our own intersection - * function above with tweaked epsilons */ - -#if 0 -static MeshDeformBind *MESHDEFORM_BIND = NULL; - -static void meshdeform_ray_coords_func(RayFace *face, float **v1, float **v2, float **v3, float **v4) -{ - MFace *mface= (MFace*)face; - float (*cagecos)[3]= MESHDEFORM_BIND->cagecos; - - *v1= cagecos[mface->v1]; - *v2= cagecos[mface->v2]; - *v3= cagecos[mface->v3]; - *v4= (mface->v4)? cagecos[mface->v4]: NULL; -} - -static int meshdeform_ray_check_func(Isect *is, RayFace *face) -{ - return 1; -} - -static void meshdeform_ray_tree_create(MeshDeformBind *mdb) -{ - MFace *mface; - float min[3], max[3]; - int a, totface; - - /* create a raytrace tree from the mesh */ - INIT_MINMAX(min, max); - - for(a=0; atotcagevert; a++) - DO_MINMAX(mdb->cagecos[a], min, max) - - MESHDEFORM_BIND= mdb; - - mface= mdb->cagedm->getTessFaceArray(mdb->cagedm); - totface= mdb->cagedm->getNumTessFaces(mdb->cagedm); - - mdb->raytree= RE_ray_tree_create(64, totface, min, max, - meshdeform_ray_coords_func, meshdeform_ray_check_func); - - for(a=0; araytree, mface); - - RE_ray_tree_done(mdb->raytree); -} - -static void meshdeform_ray_tree_free(MeshDeformBind *mdb) -{ - MESHDEFORM_BIND= NULL; - RE_ray_tree_free(mdb->raytree); -} -#endif - -static int meshdeform_intersect(MeshDeformBind *mdb, Isect *isec) +static int meshdeform_intersect(MeshDeformBind *mdb, MeshDeformIsect *isec) { MFace *mface; float face[4][3], co[3], uvw[3], len, nor[3], end[3]; @@ -1194,7 +1195,7 @@ static int meshdeform_intersect(MeshDeformBind *mdb, Isect *isec) len= len_v3v3(isec->start, co)/len_v3v3(isec->start, end); if(len < isec->labda) { isec->labda= len; - isec->hit.face = mface; + isec->face = mface; isec->isect= (INPR(isec->vec, nor) <= 0.0f); is= 1; } @@ -1207,7 +1208,7 @@ static int meshdeform_intersect(MeshDeformBind *mdb, Isect *isec) static MDefBoundIsect *meshdeform_ray_tree_intersect(MeshDeformBind *mdb, float *co1, float *co2) { MDefBoundIsect *isect; - Isect isec; + MeshDeformIsect isec; float (*cagecos)[3]; MFace *mface; float vert[4][3], len, end[3]; @@ -1215,21 +1216,15 @@ static MDefBoundIsect *meshdeform_ray_tree_intersect(MeshDeformBind *mdb, float /* setup isec */ memset(&isec, 0, sizeof(isec)); - isec.mode= RE_RAY_MIRROR; /* we want the closest intersection */ - isec.lay= -1; isec.labda= 1e10f; VECADD(isec.start, co1, epsilon); VECADD(end, co2, epsilon); sub_v3_v3v3(isec.vec, end, isec.start); -#if 0 - /*if(RE_ray_tree_intersect(mdb->raytree, &isec)) {*/ -#endif - if(meshdeform_intersect(mdb, &isec)) { len= isec.labda; - mface=(MFace*)isec.hit.face; + mface=(MFace*)isec.face; /* create MDefBoundIsect */ isect= BLI_memarena_alloc(mdb->memarena, sizeof(*isect)); @@ -1747,7 +1742,7 @@ static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, else mdb->weights= MEM_callocN(sizeof(float)*mdb->totvert*mdb->totcagevert, "MDefWeights"); - mdb->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + mdb->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "harmonic coords arena"); BLI_memarena_use_calloc(mdb->memarena); /* make bounding box equal size in all directions, add padding, and compute @@ -1772,11 +1767,6 @@ static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, progress_bar(0, "Setting up mesh deform system"); -#if 0 - /* create ray tree */ - meshdeform_ray_tree_create(mdb); -#endif - totinside= 0; for(a=0; atotvert; a++) { copy_v3_v3(vec, mdb->vertexcos[a]); @@ -1787,7 +1777,7 @@ static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, /* free temporary MDefBoundIsects */ BLI_memarena_free(mdb->memarena); - mdb->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + mdb->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "harmonic coords arena"); /* start with all cells untyped */ for(a=0; asize3; a++) @@ -1799,11 +1789,6 @@ static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, for(x=0; xsize; x++) meshdeform_add_intersections(mdb, x, y, z); -#if 0 - /* free ray tree */ - meshdeform_ray_tree_free(mdb); -#endif - /* compute exterior and interior tags */ meshdeform_bind_floodfill(mdb); @@ -1867,6 +1852,7 @@ static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, BLI_memarena_free(mdb->memarena); } +#if 0 static void heat_weighting_bind(Scene *scene, DerivedMesh *dm, MeshDeformModifierData *mmd, MeshDeformBind *mdb) { LaplacianSystem *sys; @@ -1934,8 +1920,9 @@ static void heat_weighting_bind(Scene *scene, DerivedMesh *dm, MeshDeformModifie mmd->bindweights= mdb->weights; } +#endif -void mesh_deform_bind(Scene *scene, DerivedMesh *dm, MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[][4]) +void mesh_deform_bind(Scene *scene, MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[][4]) { MeshDeformBind mdb; MVert *mvert; @@ -1962,25 +1949,32 @@ void mesh_deform_bind(Scene *scene, DerivedMesh *dm, MeshDeformModifierData *mmd mul_v3_m4v3(mdb.vertexcos[a], mdb.cagemat, vertexcos + a*3); /* solve */ +#if 0 if(mmd->mode == MOD_MDEF_VOLUME) harmonic_coordinates_bind(scene, mmd, &mdb); else heat_weighting_bind(scene, dm, mmd, &mdb); +#else + harmonic_coordinates_bind(scene, mmd, &mdb); +#endif /* assign bind variables */ - mmd->bindcos= (float*)mdb.cagecos; + mmd->bindcagecos= (float*)mdb.cagecos; mmd->totvert= mdb.totvert; mmd->totcagevert= mdb.totcagevert; copy_m4_m4(mmd->bindmat, mmd->object->obmat); - /* transform bindcos to world space */ + /* transform bindcagecos to world space */ for(a=0; aobject->obmat, mmd->bindcos+a*3); + mul_m4_v3(mmd->object->obmat, mmd->bindcagecos+a*3); /* free */ mdb.cagedm->release(mdb.cagedm); MEM_freeN(mdb.vertexcos); + /* compact weights */ + modifier_mdef_compact_influences((ModifierData*)mmd); + end_progress_bar(); waitcursor(0); } diff --git a/source/blender/editors/armature/meshlaplacian.h b/source/blender/editors/armature/meshlaplacian.h index 4e5fbec9c82..640eb33c945 100644 --- a/source/blender/editors/armature/meshlaplacian.h +++ b/source/blender/editors/armature/meshlaplacian.h @@ -78,7 +78,7 @@ void rigid_deform_end(int cancel); /* Harmonic Coordinates */ -void mesh_deform_bind(struct Scene *scene, struct DerivedMesh *dm, +void mesh_deform_bind(struct Scene *scene, struct MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[][4]); diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c index 1aa7ea07078..21b99bc10c0 100644 --- a/source/blender/editors/armature/poseSlide.c +++ b/source/blender/editors/armature/poseSlide.c @@ -39,15 +39,10 @@ #include "BLI_dynstr.h" #include "BLI_dlrbTree.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_object_force.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -63,21 +58,15 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "BIF_gl.h" -#include "ED_anim_api.h" #include "ED_armature.h" #include "ED_keyframes_draw.h" -#include "ED_keyframing.h" -#include "ED_keyframes_edit.h" #include "ED_screen.h" #include "armature_intern.h" diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c index e2fc2bd4088..c9a80318050 100644 --- a/source/blender/editors/armature/poseUtils.c +++ b/source/blender/editors/armature/poseUtils.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -39,15 +39,10 @@ #include "BLI_dynstr.h" #include "BLI_dlrbTree.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_object_force.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -62,23 +57,15 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "RNA_types.h" #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "BIF_gl.h" -#include "ED_anim_api.h" #include "ED_armature.h" -#include "ED_keyframes_draw.h" #include "ED_keyframing.h" -#include "ED_keyframes_edit.h" -#include "ED_screen.h" #include "armature_intern.h" @@ -229,27 +216,28 @@ void poseAnim_mapping_autoKeyframe (bContext *C, Scene *scene, Object *ob, ListB /* insert keyframes as necessary if autokeyframing */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; tPChanFCurveLink *pfl; - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; - /* iterate over each pose-channel affected, applying the changes */ for (pfl= pfLinks->first; pfl; pfl= pfl->next) { + ListBase dsources = {NULL, NULL}; bPoseChannel *pchan= pfl->pchan; - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - /* insert keyframes */ + /* add datasource override for the PoseChannel so KeyingSet will do right thing */ + ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan); + + /* insert keyframes + * - these keyingsets here use dsources, since we need to specify exactly which keyframes get affected + */ if (pchan->flag & POSE_LOC) - modify_keyframes(scene, &dsources, NULL, ks_loc, MODIFYKEY_MODE_INSERT, cframe); + ANIM_apply_keyingset(C, &dsources, NULL, ks_loc, MODIFYKEY_MODE_INSERT, cframe); if (pchan->flag & POSE_ROT) - modify_keyframes(scene, &dsources, NULL, ks_rot, MODIFYKEY_MODE_INSERT, cframe); + ANIM_apply_keyingset(C, &dsources, NULL, ks_rot, MODIFYKEY_MODE_INSERT, cframe); if (pchan->flag & POSE_SIZE) - modify_keyframes(scene, &dsources, NULL, ks_scale, MODIFYKEY_MODE_INSERT, cframe); + ANIM_apply_keyingset(C, &dsources, NULL, ks_scale, MODIFYKEY_MODE_INSERT, cframe); + + /* free the temp info */ + BLI_freelistN(&dsources); } } } diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 02194035ee9..408a2e1e599 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -39,15 +39,10 @@ #include "BLI_dynstr.h" #include "BLI_dlrbTree.h" -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_object_force.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -63,7 +58,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "WM_api.h" @@ -331,19 +325,14 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt) static int poselib_add_exec (bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); bAction *act = poselib_validate(ob); bArmature *arm= (ob) ? ob->data : NULL; bPose *pose= (ob) ? ob->pose : NULL; - bPoseChannel *pchan; TimeMarker *marker; int frame= RNA_int_get(op->ptr, "frame"); char name[64]; - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - /* sanity check (invoke should have checked this anyway) */ if (ELEM3(NULL, ob, arm, pose)) return OPERATOR_CANCELLED; @@ -373,25 +362,12 @@ static int poselib_add_exec (bContext *C, wmOperator *op) /* validate name */ BLI_uniquename(&act->markers, marker, "Pose", '.', offsetof(TimeMarker, name), sizeof(marker->name)); - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; - - /* loop through selected posechannels, keying their pose to the action */ - for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) { - /* check if available */ - if ((pchan->bone) && (arm->layer & pchan->bone->layer)) { - if (pchan->bone->flag & BONE_SELECTED || pchan->bone==arm->act_bone) { - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - - /* KeyingSet to use depends on rotation mode (but that's handled by the templates code) */ - if (poselib_ks_locrotscale == NULL) - poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); - modify_keyframes(scene, &dsources, act, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)frame); - } - } - } + /* KeyingSet to use depends on rotation mode (but that's handled by the templates code) */ + if (poselib_ks_locrotscale == NULL) + poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); + + /* make the keyingset use context info to determine where to add keyframes */ + ANIM_apply_keyingset(C, NULL, act, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)frame); /* store new 'active' pose number */ act->active_marker= BLI_countlist(&act->markers); @@ -728,8 +704,8 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld) bAction *act= pld->act; bActionGroup *agrp; - BeztEditData bed; - BeztEditFunc group_ok_cb; + KeyframeEditData ked; + KeyframeEditFunc group_ok_cb; int frame= 1; /* get the frame */ @@ -741,15 +717,15 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld) /* init settings for testing groups for keyframes */ group_ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); - memset(&bed, 0, sizeof(BeztEditData)); - bed.f1= ((float)frame) - 0.5f; - bed.f2= ((float)frame) + 0.5f; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.f1= ((float)frame) - 0.5f; + ked.f2= ((float)frame) + 0.5f; /* start applying - only those channels which have a key at this point in time! */ for (agrp= act->groups.first; agrp; agrp= agrp->next) { /* check if group has any keyframes */ - if (ANIM_animchanneldata_keys_bezier_loop(&bed, agrp, ALE_GROUP, NULL, group_ok_cb, NULL, 0)) { + if (ANIM_animchanneldata_keyframes_loop(&ked, agrp, ALE_GROUP, NULL, group_ok_cb, NULL, 0)) { /* has keyframe on this frame, so try to get a PoseChannel with this name */ pchan= get_pose_channel(pose, agrp->name); @@ -784,13 +760,6 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData bAction *act= pld->act; bActionGroup *agrp; - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &pld->ob->id; - /* start tagging/keying */ for (agrp= act->groups.first; agrp; agrp= agrp->next) { /* only for selected action channels */ @@ -798,21 +767,30 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData pchan= get_pose_channel(pose, agrp->name); if (pchan) { - // TODO: use a standard autokeying function in future (to allow autokeying-editkeys to work) - if (IS_AUTOKEY_MODE(scene, NORMAL)) { - /* Set keys on pose - * - KeyingSet to use depends on rotation mode - * (but that's handled by the templates code) + if (autokeyframe_cfra_can_key(scene, &pld->ob->id)) { + ListBase dsources = {NULL, NULL}; + KeyingSet *ks = NULL; + + /* get KeyingSet to use + * - use the active KeyingSet if defined (and user wants to use it for all autokeying), + * or otherwise key transforms only */ - // TODO: for getting the KeyingSet used, we should really check which channels were affected if (poselib_ks_locrotscale == NULL) poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); + + if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset)) + ks = ANIM_scene_get_active_keyingset(scene); + else + ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - - /* now insert the keyframe */ - modify_keyframes(scene, &dsources, NULL, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA); + /* now insert the keyframe(s) using the Keying Set + * 1) add datasource override for the PoseChannel + * 2) insert keyframes + * 3) free the extra info + */ + ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); /* clear any unkeyed tags */ if (pchan->bone) @@ -828,7 +806,7 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData } /* send notifiers for this */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } /* Apply the relevant changes to the pose */ @@ -876,7 +854,7 @@ static void poselib_preview_apply (bContext *C, wmOperator *op) /* get search-string */ index= pld->search_cursor; - if (IN_RANGE(index, 0, 64)) { + if (index >= 0 && index <= 64) { memcpy(&tempstr[0], &pld->searchstr[0], index); tempstr[index]= '|'; memcpy(&tempstr[index+1], &pld->searchstr[index], 64-index); diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index 8f0a4de758e..d0a898b1b61 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -38,18 +38,9 @@ #include "BLI_dynstr.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_curve_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "BKE_anim.h" #include "BKE_idprop.h" @@ -78,22 +69,18 @@ #include "WM_types.h" #include "ED_armature.h" -#include "ED_anim_api.h" #include "ED_keyframing.h" -#include "ED_object.h" #include "ED_mesh.h" #include "ED_screen.h" -#include "ED_transform.h" /* for autokey TFM_TRANSLATION, etc */ -#include "ED_view3d.h" #include "UI_interface.h" #include "armature_intern.h" /* ************* XXX *************** */ -static int pupmenu() {return 0;} -static void error() {}; -static void BIF_undo_push() {} +static int pupmenu(const char *dummy) {return 0;} +static void error(const char *dummy) {}; +static void BIF_undo_push(const char *dummy) {} /* ************* XXX *************** */ /* This function is used to indicate that a bone is selected and needs keyframes inserted */ @@ -277,19 +264,26 @@ void POSE_OT_paths_calculate (wmOperatorType *ot) void ED_pose_clear_paths(Object *ob) { bPoseChannel *pchan; + short skipped = 0; if ELEM(NULL, ob, ob->pose) return; - /* free the motionpath blocks */ + /* free the motionpath blocks, but also take note of whether we skipped some... */ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { - if (pchan->mpath) { + if (pchan->mpath) { + if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { animviz_free_motionpath(pchan->mpath); pchan->mpath= NULL; } + else + skipped = 1; } } + + /* if we didn't skip any, we shouldn't have any paths left */ + if (skipped == 0) + ob->pose->avs.path_bakeflag &= ~MOTIONPATH_BAKE_HAS_PATHS; } /* operator callback for this */ @@ -697,7 +691,7 @@ void pose_copy_menu(Scene *scene) /* copy constraints to tmpbase and apply 'local' tags before * appending to list of constraints for this channel */ - copy_constraints(&tmp_constraints, &pchanact->constraints); + copy_constraints(&tmp_constraints, &pchanact->constraints, TRUE); if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) { bConstraint *con; @@ -806,7 +800,7 @@ void pose_copy_menu(Scene *scene) /* copy constraints to tmpbase and apply 'local' tags before * appending to list of constraints for this channel */ - copy_constraints(&tmp_constraints, &const_copy); + copy_constraints(&tmp_constraints, &const_copy, TRUE); if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) { bConstraint *con; @@ -842,14 +836,14 @@ void free_posebuf(void) { if (g_posebuf) { bPoseChannel *pchan; - + for (pchan= g_posebuf->chanbase.first; pchan; pchan= pchan->next) { if(pchan->prop) { IDP_FreeProperty(pchan->prop); MEM_freeN(pchan->prop); } } - + /* was copied without constraints */ BLI_freelistN(&g_posebuf->chanbase); MEM_freeN(g_posebuf); @@ -898,12 +892,6 @@ void POSE_OT_copy (wmOperatorType *ot) /* ---- */ -/* Pointers to the builtin KeyingSets that we want to use */ -static KeyingSet *posePaste_ks_locrotscale = NULL; /* the only keyingset we'll need */ - -/* transform.h */ -extern void autokeyframe_pose_cb_func(struct bContext *C, struct Scene *scene, struct View3D *v3d, struct Object *ob, int tmode, short targetless_ik); - static int pose_paste_exec (bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); @@ -912,13 +900,6 @@ static int pose_paste_exec (bContext *C, wmOperator *op) char name[32]; int flip= RNA_boolean_get(op->ptr, "flipped"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; - /* sanity checks */ if ELEM(NULL, ob, ob->pose) return OPERATOR_CANCELLED; @@ -953,6 +934,10 @@ static int pose_paste_exec (bContext *C, wmOperator *op) if (pchan->rotmode > 0) { VECCOPY(pchan->eul, chan->eul); } + else if (pchan->rotmode == ROT_MODE_AXISANGLE) { + VECCOPY(pchan->rotAxis, chan->rotAxis); + pchan->rotAngle = chan->rotAngle; + } else { QUATCOPY(pchan->quat, chan->quat); } @@ -967,14 +952,14 @@ static int pose_paste_exec (bContext *C, wmOperator *op) else if (pchan->rotmode == ROT_MODE_AXISANGLE) { /* quat/euler to axis angle */ if (chan->rotmode > 0) - eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,chan->eul, chan->rotmode); + eulO_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, chan->eul, chan->rotmode); else - quat_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,chan->quat); + quat_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, chan->quat); } else { /* euler/axis-angle to quat */ if (chan->rotmode > 0) - eulO_to_quat( pchan->quat,chan->eul, chan->rotmode); + eulO_to_quat(pchan->quat, chan->eul, chan->rotmode); else axis_angle_to_quat(pchan->quat, chan->rotAxis, pchan->rotAngle); } @@ -991,77 +976,74 @@ static int pose_paste_exec (bContext *C, wmOperator *op) else if (pchan->rotmode == ROT_MODE_AXISANGLE) { float eul[3]; - axis_angle_to_eulO( eul, EULER_ORDER_DEFAULT,pchan->rotAxis, pchan->rotAngle); + axis_angle_to_eulO(eul, EULER_ORDER_DEFAULT, pchan->rotAxis, pchan->rotAngle); eul[1]*= -1; eul[2]*= -1; - eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,eul, EULER_ORDER_DEFAULT); - - // experimental method (uncomment to test): -#if 0 - /* experimental method: just flip the orientation of the axis on x/y axes */ - pchan->quat[1] *= -1; - pchan->quat[2] *= -1; -#endif + eulO_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, eul, EULER_ORDER_DEFAULT); } else { float eul[3]; - quat_to_eul( eul,pchan->quat); + quat_to_eul(eul, pchan->quat); eul[1]*= -1; eul[2]*= -1; - eul_to_quat( pchan->quat,eul); + eul_to_quat(pchan->quat, eul); } } - /* ID property */ - if(pchan->prop) { - IDP_FreeProperty(pchan->prop); - MEM_freeN(pchan->prop); - pchan->prop= NULL; - } - - if(chan->prop) { - pchan->prop= IDP_CopyProperty(chan->prop); - } - - /* auto key, TODO, fix up this INSERTAVAIL vs all other cases */ - if (IS_AUTOKEY_FLAG(INSERTAVAIL) == 0) { /* deal with this case later */ - if (autokeyframe_cfra_can_key(scene, &ob->id)) { - - /* Set keys on pose - * - KeyingSet to use depends on rotation mode - * (but that's handled by the templates code) - */ - // TODO: for getting the KeyingSet used, we should really check which channels were affected - if (posePaste_ks_locrotscale == NULL) - posePaste_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); - - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - - modify_keyframes(scene, &dsources, NULL, posePaste_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA); - - /* clear any unkeyed tags */ - if (chan->bone) - chan->bone->flag &= ~BONE_UNKEYED; - } - else { - /* add unkeyed tags */ - if (chan->bone) - chan->bone->flag |= BONE_UNKEYED; + /* ID properties + * - only free the existing properties if the channel we're copying from has them + * NOTE: this means that if the pose depends on some pchan property, the pose may not be ok, + * but this is better than loosing all the setting you've painstakingly added... + */ + if (chan->prop) { + /* free the old properties since we want to replace them now */ + if (pchan->prop) { + IDP_FreeProperty(pchan->prop); + MEM_freeN(pchan->prop); + pchan->prop= NULL; } + + /* now copy over the new copy of the properties */ + pchan->prop= IDP_CopyProperty(chan->prop); + } + + /* keyframing tagging */ + if (autokeyframe_cfra_can_key(scene, &ob->id)) { + ListBase dsources = {NULL, NULL}; + KeyingSet *ks = NULL; + + /* get KeyingSet to use + * - use the active KeyingSet if defined (and user wants to use it for all autokeying), + * or otherwise key transforms only + */ + if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset)) + ks = ANIM_scene_get_active_keyingset(scene); + else + ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); + + /* now insert the keyframe(s) using the Keying Set + * 1) add datasource override for the PoseChannel + * 2) insert keyframes + * 3) free the extra info + */ + ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); + + /* clear any unkeyed tags */ + if (chan->bone) + chan->bone->flag &= ~BONE_UNKEYED; + } + else { + /* add unkeyed tags */ + if (chan->bone) + chan->bone->flag |= BONE_UNKEYED; } } } } - - if (IS_AUTOKEY_FLAG(INSERTAVAIL)) { - View3D *v3d= CTX_wm_view3d(C); - autokeyframe_pose_cb_func(C, scene, v3d, ob, TFM_TRANSLATION, 0); - autokeyframe_pose_cb_func(C, scene, v3d, ob, TFM_ROTATION, 0); - autokeyframe_pose_cb_func(C, scene, v3d, ob, TFM_TIME_SCALE, 0); - } - + /* Update event for pose and deformation children */ DAG_id_flush_update(&ob->id, OB_RECALC_DATA); @@ -1070,13 +1052,13 @@ static int pose_paste_exec (bContext *C, wmOperator *op) } else { /* need to trick depgraph, action is not allowed to execute on pose */ + // XXX: this is probably not an issue anymore where_is_pose(scene, ob); ob->recalc= 0; } /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); // XXX not really needed, but here for completeness... return OPERATOR_FINISHED; } @@ -1265,8 +1247,8 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op) pose_add_group(ob); /* add selected bones to group then */ - // NOTE: unfortunately, we cannot use the context-iterators here, since they might not be defined... - CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) { + CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) + { pchan->agrp_index= pose->active_group; done= 1; } @@ -1308,7 +1290,6 @@ static int pose_group_unassign_exec (bContext *C, wmOperator *op) Object *ob; bArmature *arm; bPose *pose; - bPoseChannel *pchan; short done= 0; /* since this call may also be used from the buttons window, we need to check for where to get the object */ @@ -1324,20 +1305,14 @@ static int pose_group_unassign_exec (bContext *C, wmOperator *op) arm= ob->data; /* find selected bones to remove from all bone groups */ - // NOTE: unfortunately, we cannot use the context-iterators here, since they might not be defined... - // CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) - for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) { - /* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */ - // NOTE: sync this view3d_context() in space_view3d.c - if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) { - if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone)) { - if (pchan->agrp_index) { - pchan->agrp_index= 0; - done= 1; - } - } + CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) + { + if (pchan->agrp_index) { + pchan->agrp_index= 0; + done= 1; } } + CTX_DATA_END; /* notifiers for updates */ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); @@ -1364,6 +1339,102 @@ void POSE_OT_group_unassign (wmOperatorType *ot) ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } +static void pose_group_select(bContext *C, Object *ob, int select) +{ + bPose *pose= ob->pose; + + CTX_DATA_BEGIN(C, bPoseChannel*, pchan, visible_pose_bones) + { + if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) { + if (select) { + if (pchan->agrp_index == pose->active_group) + pchan->bone->flag |= BONE_SELECTED; + } + else { + if (pchan->agrp_index == pose->active_group) + pchan->bone->flag &= ~BONE_SELECTED; + } + } + } + CTX_DATA_END; +} + +static int pose_group_select_exec (bContext *C, wmOperator *op) +{ + ScrArea *sa= CTX_wm_area(C); + Object *ob; + + /* since this call may also be used from the buttons window, we need to check for where to get the object */ + if (sa->spacetype == SPACE_BUTS) + ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + else + ob= CTX_data_active_object(C); + + /* only continue if there's an object, and a pose there too */ + if (ELEM(NULL, ob, ob->pose)) + return OPERATOR_CANCELLED; + + pose_group_select(C, ob, 1); + + /* notifiers for updates */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; +} + +void POSE_OT_group_select (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Bones of Bone Group"; + ot->idname= "POSE_OT_group_select"; + ot->description= "Select bones in active Bone Group"; + + /* api callbacks */ + ot->exec= pose_group_select_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int pose_group_deselect_exec (bContext *C, wmOperator *op) +{ + ScrArea *sa= CTX_wm_area(C); + Object *ob; + + /* since this call may also be used from the buttons window, we need to check for where to get the object */ + if (sa->spacetype == SPACE_BUTS) + ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + else + ob= CTX_data_active_object(C); + + /* only continue if there's an object, and a pose there too */ + if (ELEM(NULL, ob, ob->pose)) + return OPERATOR_CANCELLED; + + pose_group_select(C, ob, 0); + + /* notifiers for updates */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; +} + +void POSE_OT_group_deselect (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Deselecte Bone Group"; + ot->idname= "POSE_OT_group_deselect"; + ot->description= "Deselect bones of active Bone Group"; + + /* api callbacks */ + ot->exec= pose_group_deselect_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + /* ********************************************** */ static int pose_flip_names_exec (bContext *C, wmOperator *op) @@ -1428,8 +1499,8 @@ static int pose_autoside_names_exec (bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) { BLI_strncpy(newname, pchan->name, sizeof(newname)); - bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]); - ED_armature_bone_rename(arm, pchan->name, newname); + if(bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis])) + ED_armature_bone_rename(arm, pchan->name, newname); } CTX_DATA_END; @@ -1445,7 +1516,7 @@ static int pose_autoside_names_exec (bContext *C, wmOperator *op) void POSE_OT_autoside_names (wmOperatorType *ot) { static EnumPropertyItem axis_items[]= { - {0, "XAXIS", 0, "X-Axis", "Left/Right"}, + {0, "XAXIS", 0, "X-Axis", "Left/Right"}, {1, "YAXIS", 0, "Y-Axis", "Front/Back"}, {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"}, {0, NULL, 0, NULL, NULL}}; @@ -1477,7 +1548,7 @@ void pose_activate_flipped_bone(Scene *scene) if(ob==NULL) return; - if(ob->mode && OB_MODE_WEIGHT_PAINT) { + if(ob->mode & OB_MODE_WEIGHT_PAINT) { ob= modifiers_isDeformedByArmature(ob); } if(ob && (ob->mode & OB_MODE_POSE)) { @@ -1747,13 +1818,7 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); - - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; + KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); /* loop through all selected pchans, flipping and keying (as needed) */ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) @@ -1766,20 +1831,18 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *op) pchan->quat[2]= -pchan->quat[2]; pchan->quat[3]= -pchan->quat[3]; - /* perform auto-keying - * NOTE: paths don't need recalculation here, since the orientations shouldn't have changed - */ + /* tagging */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* Set keys on pose - * - KeyingSet to use depends on rotation mode - * (but that's handled by the templates code) + ListBase dsources = {NULL, NULL}; + + /* now insert the keyframe(s) using the Keying Set + * 1) add datasource override for the PoseChannel + * 2) insert keyframes + * 3) free the extra info */ - KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation"); - - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); /* clear any unkeyed tags */ if (pchan->bone) diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c index 59a8744f305..02e96bcf70a 100644 --- a/source/blender/editors/armature/reeb.c +++ b/source/blender/editors/armature/reeb.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,14 +31,9 @@ #include // for qsort #include -#include "PIL_time.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" #include "DNA_object_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_armature_types.h" #include "BKE_context.h" @@ -53,13 +48,10 @@ //#include "BDR_editobject.h" -#include "ED_mesh.h" -#include "ED_armature.h" //#include "BIF_interface.h" //#include "BIF_toolbox.h" //#include "BIF_graphics.h" #include "BIF_gl.h" -#include "UI_resources.h" #include "BKE_global.h" #include "BKE_utildefines.h" @@ -357,7 +349,7 @@ ReebArc * copyArc(ReebGraph *rg, ReebArc *arc) memcpy(cp_arc->buckets, arc->buckets, sizeof(EmbedBucket) * cp_arc->bcount); /* copy faces map */ - cp_arc->faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + cp_arc->faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "copyArc gh"); mergeArcFaces(rg, cp_arc, arc); /* find corresponding head and tail */ @@ -500,11 +492,11 @@ void repositionNodes(ReebGraph *rg) VECCOPY(p, ((ReebArc*)arc)->buckets[0].p); mul_v3_fl(p, 1.0f / arc->head->degree); - add_v3_v3v3(arc->head->p, arc->head->p, p); + add_v3_v3(arc->head->p, p); VECCOPY(p, ((ReebArc*)arc)->buckets[((ReebArc*)arc)->bcount - 1].p); mul_v3_fl(p, 1.0f / arc->tail->degree); - add_v3_v3v3(arc->tail->p, arc->tail->p, p); + add_v3_v3(arc->tail->p, p); } } } @@ -641,7 +633,7 @@ void addVertToBucket(EmbedBucket *b, float co[3]) void removeVertFromBucket(EmbedBucket *b, float co[3]) { mul_v3_fl(b->p, (float)b->nv); - sub_v3_v3v3(b->p, b->p, co); + sub_v3_v3(b->p, co); b->nv--; mul_v3_fl(b->p, 1.0f / (float)b->nv); } @@ -1112,7 +1104,7 @@ void REEB_AxialSymmetry(BNode* root_node, BNode* node1, BNode* node2, struct BAr BLI_mirrorAlongAxis(p, root_node->p, nor); /* average with node1 */ - add_v3_v3v3(node1->p, node1->p, p); + add_v3_v3(node1->p, p); mul_v3_fl(node1->p, 0.5f); /* mirror back on node2 */ @@ -1830,7 +1822,7 @@ int filterSmartReebGraph(ReebGraph *rg, float threshold) efa->tmp.fp = saacos(fabs(angle)); #endif #else - add_v3_v3v3(avg_vec, avg_vec, efa->n); + add_v3_v3(avg_vec, efa->n); #endif } @@ -2449,7 +2441,7 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2) arc->flag = 0; // clear flag on init arc->symmetry_level = 0; - arc->faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + arc->faces = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "createArc gh"); if (node1->weight <= node2->weight) { diff --git a/source/blender/editors/armature/reeb.h b/source/blender/editors/armature/reeb.h index a4fc74bdd0d..3bebc423235 100644 --- a/source/blender/editors/armature/reeb.h +++ b/source/blender/editors/armature/reeb.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/curve/CMakeLists.txt b/source/blender/editors/curve/CMakeLists.txt new file mode 100644 index 00000000000..ab45d73a2de --- /dev/null +++ b/source/blender/editors/curve/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/guardedalloc +) + +BLENDERLIB(bf_editor_curve "${SRC}" "${INC}") diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h index a9a9b5619ff..10c1bd84262 100644 --- a/source/blender/editors/curve/curve_intern.h +++ b/source/blender/editors/curve/curve_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -33,13 +33,13 @@ struct wmOperatorType; /* lorem.c */ -char *ED_lorem; +extern char *ED_lorem; /* editfont.c */ enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL }; enum { CASE_LOWER, CASE_UPPER }; enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD, - PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE }; + PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE }; void FONT_OT_text_insert(struct wmOperatorType *ot); void FONT_OT_line_break(struct wmOperatorType *ot); @@ -66,6 +66,9 @@ void FONT_OT_change_spacing(struct wmOperatorType *ot); void FONT_OT_open(struct wmOperatorType *ot); void FONT_OT_unlink(struct wmOperatorType *ot); +void FONT_OT_textbox_add(struct wmOperatorType *ot); +void FONT_OT_textbox_remove(struct wmOperatorType *ot); + /* editcurve.c */ void CURVE_OT_hide(struct wmOperatorType *ot); void CURVE_OT_reveal(struct wmOperatorType *ot); @@ -85,6 +88,19 @@ void CURVE_OT_tilt_clear(struct wmOperatorType *ot); void CURVE_OT_smooth(struct wmOperatorType *ot); void CURVE_OT_smooth_radius(struct wmOperatorType *ot); +void CURVE_OT_primitive_bezier_curve_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_bezier_circle_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_nurbs_curve_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_nurbs_circle_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_nurbs_path_add(struct wmOperatorType *ot); + +void SURFACE_OT_primitive_nurbs_surface_curve_add(struct wmOperatorType *ot); +void SURFACE_OT_primitive_nurbs_surface_circle_add(struct wmOperatorType *ot); +void SURFACE_OT_primitive_nurbs_surface_surface_add(struct wmOperatorType *ot); +void SURFACE_OT_primitive_nurbs_surface_tube_add(struct wmOperatorType *ot); +void SURFACE_OT_primitive_nurbs_surface_sphere_add(struct wmOperatorType *ot); +void SURFACE_OT_primitive_nurbs_surface_donut_add(struct wmOperatorType *ot); + void CURVE_OT_de_select_first(struct wmOperatorType *ot); void CURVE_OT_de_select_last(struct wmOperatorType *ot); void CURVE_OT_select_all(struct wmOperatorType *ot); @@ -96,7 +112,7 @@ void CURVE_OT_select_previous(struct wmOperatorType *ot); void CURVE_OT_select_more(struct wmOperatorType *ot); void CURVE_OT_select_less(struct wmOperatorType *ot); void CURVE_OT_select_random(struct wmOperatorType *ot); -void CURVE_OT_select_every_nth(struct wmOperatorType *ot); +void CURVE_OT_select_nth(struct wmOperatorType *ot); void CURVE_OT_switch_direction(struct wmOperatorType *ot); void CURVE_OT_subdivide(struct wmOperatorType *ot); diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index e672e7148b8..8f826d318b6 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,13 +32,6 @@ #include "MEM_guardedalloc.h" #include "DNA_curve_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -48,7 +41,6 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" @@ -57,7 +49,6 @@ #include "ED_screen.h" #include "ED_transform.h" -#include "UI_interface.h" #include "curve_intern.h" @@ -90,6 +81,9 @@ void ED_operatortypes_curve(void) WM_operatortype_append(FONT_OT_open); WM_operatortype_append(FONT_OT_unlink); + + WM_operatortype_append(FONT_OT_textbox_add); + WM_operatortype_append(FONT_OT_textbox_remove); WM_operatortype_append(CURVE_OT_hide); WM_operatortype_append(CURVE_OT_reveal); @@ -105,7 +99,20 @@ void ED_operatortypes_curve(void) WM_operatortype_append(CURVE_OT_shade_smooth); WM_operatortype_append(CURVE_OT_shade_flat); WM_operatortype_append(CURVE_OT_tilt_clear); - + + WM_operatortype_append(CURVE_OT_primitive_bezier_curve_add); + WM_operatortype_append(CURVE_OT_primitive_bezier_circle_add); + WM_operatortype_append(CURVE_OT_primitive_nurbs_curve_add); + WM_operatortype_append(CURVE_OT_primitive_nurbs_circle_add); + WM_operatortype_append(CURVE_OT_primitive_nurbs_path_add); + + WM_operatortype_append(SURFACE_OT_primitive_nurbs_surface_curve_add); + WM_operatortype_append(SURFACE_OT_primitive_nurbs_surface_circle_add); + WM_operatortype_append(SURFACE_OT_primitive_nurbs_surface_surface_add); + WM_operatortype_append(SURFACE_OT_primitive_nurbs_surface_tube_add); + WM_operatortype_append(SURFACE_OT_primitive_nurbs_surface_sphere_add); + WM_operatortype_append(SURFACE_OT_primitive_nurbs_surface_donut_add); + WM_operatortype_append(CURVE_OT_smooth); WM_operatortype_append(CURVE_OT_smooth_radius); @@ -120,7 +127,7 @@ void ED_operatortypes_curve(void) WM_operatortype_append(CURVE_OT_select_more); WM_operatortype_append(CURVE_OT_select_less); WM_operatortype_append(CURVE_OT_select_random); - WM_operatortype_append(CURVE_OT_select_every_nth); + WM_operatortype_append(CURVE_OT_select_nth); WM_operatortype_append(CURVE_OT_switch_direction); WM_operatortype_append(CURVE_OT_subdivide); @@ -140,9 +147,10 @@ void ED_keymap_curve(wmKeyConfig *keyconf) keymap->poll= ED_operator_editfont; /* only set in editmode font, by space_view3d listener */ - RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", BKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_BOLD); - RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_ITALIC); - RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", UKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_UNDERLINE); + RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", BKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_BOLD); + RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_ITALIC); + RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", UKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_UNDERLINE); + RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", PKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_SMALLCAPS); RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_SEL); RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_SEL); @@ -188,8 +196,8 @@ void ED_keymap_curve(wmKeyConfig *keyconf) /* only set in editmode curve, by space_view3d listener */ keymap= WM_keymap_find(keyconf, "Curve", 0, 0); keymap->poll= ED_operator_editsurfcurve; - - WM_keymap_add_item(keymap, "OBJECT_OT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); + + WM_keymap_add_menu(keymap, "INFO_MT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", LEFTMOUSE, KM_CLICK, KM_CTRL, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, 0, 0); @@ -203,9 +211,10 @@ void ED_keymap_curve(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CURVE_OT_extrude", EKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CURVE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "CURVE_OT_make_segment", FKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "CURVE_OT_cyclic_toggle", CKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_cyclic_toggle", CKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "CURVE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CURVE_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CURVE_OT_tilt_clear", TKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "TRANSFORM_OT_tilt", TKEY, KM_PRESS, KM_CTRL, 0); @@ -225,6 +234,6 @@ void ED_keymap_curve(wmKeyConfig *keyconf) /* menus */ WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0); - ED_object_generic_keymap(keyconf, keymap, TRUE); + ED_object_generic_keymap(keyconf, keymap, 2); } diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 2d68d19c589..90bec418e0e 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -43,15 +43,9 @@ #include "BLI_dynstr.h" #include "BLI_rand.h" -#include "DNA_curve_types.h" #include "DNA_key_types.h" -#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_curve.h" @@ -68,8 +62,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_anim_api.h" -#include "ED_curve.h" #include "ED_keyframes_edit.h" #include "ED_object.h" #include "ED_screen.h" @@ -83,6 +75,12 @@ #include "RNA_access.h" #include "RNA_define.h" +/* Undo stuff */ +typedef struct { + ListBase nubase; + void *lastsel; +} UndoCurve; + void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus); static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short selstatus); @@ -332,7 +330,7 @@ void make_editNurb(Object *obedit) editnurb= cu->editnurb= MEM_callocN(sizeof(ListBase), "editnurb"); nu= cu->nurb.first; - cu->lastselbp= NULL; /* for select row */ + cu->lastsel= NULL; /* for select row */ while(nu) { newnu= duplicateNurb(nu); @@ -397,6 +395,8 @@ void CU_select_swap(Object *obedit) BezTriple *bezt; int a; + cu->lastsel= NULL; + for(nu= editnurb->first; nu; nu= nu->next) { if(nu->type == CU_BEZIER) { bezt= nu->bezt; @@ -504,8 +504,8 @@ void CURVE_OT_separate(wmOperatorType *ot) static short isNurbselUV(Nurb *nu, int *u, int *v, int flag) { /* return u!=-1: 1 row in u-direction selected. U has value between 0-pntsv - * return v!=-1: 1 collumn in v-direction selected. V has value between 0-pntsu - */ + * return v!=-1: 1 collumn in v-direction selected. V has value between 0-pntsu + */ BPoint *bp; int a, b, sel; @@ -610,9 +610,9 @@ static void translateflagNurb(ListBase *editnurb, short flag, float *vec) a= nu->pntsu; bezt= nu->bezt; while(a--) { - if(bezt->f1 & flag) add_v3_v3v3(bezt->vec[0], bezt->vec[0], vec); - if(bezt->f2 & flag) add_v3_v3v3(bezt->vec[1], bezt->vec[1], vec); - if(bezt->f3 & flag) add_v3_v3v3(bezt->vec[2], bezt->vec[2], vec); + if(bezt->f1 & flag) add_v3_v3(bezt->vec[0], vec); + if(bezt->f2 & flag) add_v3_v3(bezt->vec[1], vec); + if(bezt->f3 & flag) add_v3_v3(bezt->vec[2], vec); bezt++; } } @@ -620,7 +620,7 @@ static void translateflagNurb(ListBase *editnurb, short flag, float *vec) a= nu->pntsu*nu->pntsv; bp= nu->bp; while(a--) { - if(bp->f1 & flag) add_v3_v3v3(bp->vec, bp->vec, vec); + if(bp->f1 & flag) add_v3_v3(bp->vec, vec); bp++; } } @@ -662,7 +662,7 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag) if(obedit && obedit->type==OB_SURF); else return OPERATOR_CANCELLED; - cu->lastselbp= NULL; + cu->lastsel= NULL; nu= editnurb->first; while(nu) { @@ -895,9 +895,12 @@ static void adduplicateflagNurb(Object *obedit, short flag) Nurb *nu, *newnu; BezTriple *bezt, *bezt1; BPoint *bp, *bp1; + Curve *cu= (Curve*)obedit->data; int a, b, starta, enda, newu, newv; char *usel; + cu->lastsel= NULL; + nu= editnurb->last; while(nu) { if(nu->type == CU_BEZIER) { @@ -929,9 +932,9 @@ static void adduplicateflagNurb(Object *obedit, short flag) bezt1++; } - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { if(starta!=0 || enda!=nu->pntsu-1) { - newnu->flagu &= ~CU_CYCLIC; + newnu->flagu &= ~CU_NURB_CYCLIC; } } } @@ -966,9 +969,9 @@ static void adduplicateflagNurb(Object *obedit, short flag) bp1++; } - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { if(starta!=0 || enda!=nu->pntsu-1) { - newnu->flagu &= ~CU_CYCLIC; + newnu->flagu &= ~CU_NURB_CYCLIC; } } @@ -1507,11 +1510,15 @@ void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatu Nurb *nu; BPoint *bp; BezTriple *bezt; + Curve *cu; int a; short sel; - + if(obedit==0) return; - + + cu= (Curve*)obedit->data; + cu->lastsel= NULL; + for(nu= editnurb->first; nu; nu= nu->next) { sel= 0; if(nu->type == CU_BEZIER) { @@ -1827,6 +1834,8 @@ static int select_inverse_exec(bContext *C, wmOperator *op) BezTriple *bezt; int a; + cu->lastsel= NULL; + for(nu= editnurb->first; nu; nu= nu->next) { if(nu->type == CU_BEZIER) { bezt= nu->bezt; @@ -1882,29 +1891,29 @@ void CURVE_OT_select_inverse(wmOperatorType *ot) * @param None */ -static int subdivide_exec(bContext *C, wmOperator *op) +static void subdividenurb(Object *obedit, int number_cuts) { - Object *obedit= CTX_data_edit_object(C); Curve *cu= obedit->data; ListBase *editnurb= curve_get_editcurve(obedit); Nurb *nu; BezTriple *prevbezt, *bezt, *beztnew, *beztn; BPoint *bp, *prevbp, *bpnew, *bpn; float vec[15]; - int a, b, sel, amount, *usel, *vsel; + int a, b, sel, amount, *usel, *vsel, i; + float factor; // printf("*** subdivideNurb: entering subdivide\n"); for(nu= editnurb->first; nu; nu= nu->next) { amount= 0; if(nu->type == CU_BEZIER) { - /* - Insert a point into a 2D Bezier curve. - Endpoints are preserved. Otherwise, all selected and inserted points are - newly created. Old points are discarded. - */ + /* + Insert a point into a 2D Bezier curve. + Endpoints are preserved. Otherwise, all selected and inserted points are + newly created. Old points are discarded. + */ /* count */ - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { a= nu->pntsu; bezt= nu->bezt; prevbezt= bezt+(a-1); @@ -1915,7 +1924,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) bezt= prevbezt+1; } while(a--) { - if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) amount++; + if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) amount+=number_cuts; prevbezt= bezt; bezt++; } @@ -1925,7 +1934,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) beztnew = (BezTriple*)MEM_mallocN((amount + nu->pntsu) * sizeof(BezTriple), "subdivNurb"); beztn= beztnew; - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { a= nu->pntsu; bezt= nu->bezt; prevbezt= bezt+(a-1); @@ -1940,37 +1949,46 @@ static int subdivide_exec(bContext *C, wmOperator *op) beztn++; if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) { - memcpy(beztn, bezt, sizeof(BezTriple)); - - /* midpoint subdividing */ - mid_v3_v3v3(vec, prevbezt->vec[1], prevbezt->vec[2]); - mid_v3_v3v3(vec+3, prevbezt->vec[2], bezt->vec[0]); - mid_v3_v3v3(vec+6, bezt->vec[0], bezt->vec[1]); - - mid_v3_v3v3(vec+9, vec, vec+3); - mid_v3_v3v3(vec+12, vec+3, vec+6); - - /* change handle of prev beztn */ - VECCOPY((beztn-1)->vec[2], vec); - /* new point */ - VECCOPY(beztn->vec[0], vec+9); - mid_v3_v3v3(beztn->vec[1], vec+9, vec+12); - VECCOPY(beztn->vec[2], vec+12); - /* handle of next bezt */ - if(a==0 && (nu->flagu & CU_CYCLIC)) {VECCOPY(beztnew->vec[0], vec+6);} - else {VECCOPY(bezt->vec[0], vec+6);} - - beztn->radius = (prevbezt->radius + bezt->radius)/2.0f; - beztn->weight = (prevbezt->weight + bezt->weight)/2.0f; - - beztn++; + float prevvec[3][3]; + + memcpy(prevvec, prevbezt->vec, sizeof(float) * 9); + + for (i = 0; i < number_cuts; i++) { + factor = 1.0f / (number_cuts + 1 - i); + + memcpy(beztn, bezt, sizeof(BezTriple)); + + /* midpoint subdividing */ + interp_v3_v3v3(vec, prevvec[1], prevvec[2], factor); + interp_v3_v3v3(vec+3, prevvec[2], bezt->vec[0], factor); + interp_v3_v3v3(vec+6, bezt->vec[0], bezt->vec[1], factor); + + interp_v3_v3v3(vec+9, vec, vec+3, factor); + interp_v3_v3v3(vec+12, vec+3, vec+6, factor); + + /* change handle of prev beztn */ + VECCOPY((beztn-1)->vec[2], vec); + /* new point */ + VECCOPY(beztn->vec[0], vec+9); + interp_v3_v3v3(beztn->vec[1], vec+9, vec+12, factor); + VECCOPY(beztn->vec[2], vec+12); + /* handle of next bezt */ + if(a==0 && i == number_cuts - 1 && (nu->flagu & CU_NURB_CYCLIC)) {VECCOPY(beztnew->vec[0], vec+6);} + else {VECCOPY(bezt->vec[0], vec+6);} + + beztn->radius = (prevbezt->radius + bezt->radius)/2; + beztn->weight = (prevbezt->weight + bezt->weight)/2; + + memcpy(prevvec, beztn->vec, sizeof(float) * 9); + beztn++; + } } prevbezt= bezt; bezt++; } /* last point */ - if((nu->flagu & CU_CYCLIC)==0) memcpy(beztn, prevbezt, sizeof(BezTriple)); + if((nu->flagu & CU_NURB_CYCLIC)==0) memcpy(beztn, prevbezt, sizeof(BezTriple)); MEM_freeN(nu->bezt); nu->bezt= beztnew; @@ -1980,14 +1998,14 @@ static int subdivide_exec(bContext *C, wmOperator *op) } } /* End of 'if(nu->type == CU_BEZIER)' */ else if (nu->pntsv==1) { - /* - All flat lines (ie. co-planar), except flat Nurbs. Flat NURB curves - are handled together with the regular NURB plane division, as it - should be. I split it off just now, let's see if it is - stable... nzc 30-5-'00 - */ + /* + All flat lines (ie. co-planar), except flat Nurbs. Flat NURB curves + are handled together with the regular NURB plane division, as it + should be. I split it off just now, let's see if it is + stable... nzc 30-5-'00 + */ /* count */ - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { a= nu->pntsu; bp= nu->bp; prevbp= bp+(a-1); @@ -1998,7 +2016,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) bp= prevbp+1; } while(a--) { - if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) amount++; + if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) amount+=number_cuts; prevbp= bp; bp++; } @@ -2009,7 +2027,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) (BPoint*)MEM_mallocN((amount + nu->pntsu) * sizeof(BPoint), "subdivNurb2"); bpn= bpnew; - if(nu->flagu & CU_CYCLIC) { + if(nu->flagu & CU_NURB_CYCLIC) { a= nu->pntsu; bp= nu->bp; prevbp= bp+(a-1); @@ -2024,19 +2042,20 @@ static int subdivide_exec(bContext *C, wmOperator *op) bpn++; if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) { - // printf("*** subdivideNurb: insert 'linear' point\n"); - memcpy(bpn, bp, sizeof(BPoint)); - bpn->vec[0]= (prevbp->vec[0]+bp->vec[0])/2.0; - bpn->vec[1]= (prevbp->vec[1]+bp->vec[1])/2.0; - bpn->vec[2]= (prevbp->vec[2]+bp->vec[2])/2.0; - bpn->vec[3]= (prevbp->vec[3]+bp->vec[3])/2.0; - bpn++; + // printf("*** subdivideNurb: insert 'linear' point\n"); + for (i = 0; i < number_cuts; i++) { + factor = (float)(i + 1) / (number_cuts + 1); + + memcpy(bpn, bp, sizeof(BPoint)); + interp_v4_v4v4(bpn->vec, prevbp->vec, bp->vec, factor); + bpn++; + } } prevbp= bp; bp++; } - if((nu->flagu & CU_CYCLIC)==0) memcpy(bpn, prevbp, sizeof(BPoint)); /* last point */ + if((nu->flagu & CU_NURB_CYCLIC)==0) memcpy(bpn, prevbp, sizeof(BPoint)); /* last point */ MEM_freeN(nu->bp); nu->bp= bpnew; @@ -2048,54 +2067,54 @@ static int subdivide_exec(bContext *C, wmOperator *op) } } /* End of 'else if(nu->pntsv==1)' */ else if(nu->type == CU_NURBS) { - /* This is a very strange test ... */ - /** - Subdivide NURB surfaces - nzc 30-5-'00 - + /* This is a very strange test ... */ + /** + Subdivide NURB surfaces - nzc 30-5-'00 - - Subdivision of a NURB curve can be effected by adding a - control point (insertion of a knot), or by raising the - degree of the functions used to build the NURB. The - expression + Subdivision of a NURB curve can be effected by adding a + control point (insertion of a knot), or by raising the + degree of the functions used to build the NURB. The + expression - degree = #knots - #controlpoints + 1 (J Walter piece) - degree = #knots - #controlpoints (Blender - implementation) - ( this is confusing.... what is true? Another concern - is that the JW piece allows the curve to become - explicitly 1st order derivative discontinuous, while - this is not what we want here... ) + degree = #knots - #controlpoints + 1 (J Walter piece) + degree = #knots - #controlpoints (Blender + implementation) + ( this is confusing.... what is true? Another concern + is that the JW piece allows the curve to become + explicitly 1st order derivative discontinuous, while + this is not what we want here... ) - is an invariant for a single NURB curve. Raising the degree - of the NURB is done elsewhere; the degree is assumed - constant during this opration. Degree is a property shared - by all controlpoints in a curve (even though it is stored - per control point - this can be misleading). - Adding a knot is done by searching for the place in the - knot vector where a certain knot value must be inserted, or - by picking an appropriate knot value between two existing - ones. The number of controlpoints that is influenced by the - insertion depends on the order of the curve. A certain - minimum number of knots is needed to form high-order - curves, as can be seen from the equation above. In Blender, - currently NURBs may be up to 6th order, so we modify at - most 6 points. One point is added. For an n-degree curve, - n points are discarded, and n+1 points inserted - (so effectively, n points are modified). (that holds for - the JW piece, but it seems not for our NURBs) - In practice, the knot spacing is copied, but the tail - (the points following the insertion point) need to be - offset to keep the knot series ascending. The knot series - is always a series of monotonically ascending integers in - Blender. When not enough control points are available to - fit the order, duplicates of the endpoints are added as - needed. - */ + is an invariant for a single NURB curve. Raising the degree + of the NURB is done elsewhere; the degree is assumed + constant during this opration. Degree is a property shared + by all controlpoints in a curve (even though it is stored + per control point - this can be misleading). + Adding a knot is done by searching for the place in the + knot vector where a certain knot value must be inserted, or + by picking an appropriate knot value between two existing + ones. The number of controlpoints that is influenced by the + insertion depends on the order of the curve. A certain + minimum number of knots is needed to form high-order + curves, as can be seen from the equation above. In Blender, + currently NURBs may be up to 6th order, so we modify at + most 6 points. One point is added. For an n-degree curve, + n points are discarded, and n+1 points inserted + (so effectively, n points are modified). (that holds for + the JW piece, but it seems not for our NURBs) + In practice, the knot spacing is copied, but the tail + (the points following the insertion point) need to be + offset to keep the knot series ascending. The knot series + is always a series of monotonically ascending integers in + Blender. When not enough control points are available to + fit the order, duplicates of the endpoints are added as + needed. + */ /* selection-arrays */ usel= MEM_callocN(sizeof(int)*nu->pntsu, "subivideNurb3"); vsel= MEM_callocN(sizeof(int)*nu->pntsv, "subivideNurb3"); sel= 0; - /* Count the number of selected points. */ + /* Count the number of selected points. */ bp= nu->bp; for(a=0; apntsv; a++) { for(b=0; bpntsu; b++) { @@ -2108,9 +2127,16 @@ static int subdivide_exec(bContext *C, wmOperator *op) } } if( sel == (nu->pntsu*nu->pntsv) ) { /* subdivide entire nurb */ - /* Global subdivision is a special case of partial - subdivision. Strange it is considered separately... */ - bpn=bpnew= MEM_mallocN( (2*nu->pntsu-1)*(2*nu->pntsv-1)*sizeof(BPoint), "subdivideNurb4"); + /* Global subdivision is a special case of partial + subdivision. Strange it is considered separately... */ + + /* count of nodes (after subdivision) along U axis */ + int countu= nu->pntsu + (nu->pntsu - 1) * number_cuts; + + /* total count of nodes after subdivision */ + int tot= ((number_cuts+1)*nu->pntsu-number_cuts)*((number_cuts+1)*nu->pntsv-number_cuts); + + bpn=bpnew= MEM_mallocN( tot*sizeof(BPoint), "subdivideNurb4"); bp= nu->bp; /* first subdivide rows */ for(a=0; apntsv; a++) { @@ -2119,41 +2145,43 @@ static int subdivide_exec(bContext *C, wmOperator *op) bpn++; bp++; if(bpntsu-1) { - *bpn= *bp; prevbp= bp-1; - bpn->vec[0]= (prevbp->vec[0]+bp->vec[0])/2.0; - bpn->vec[1]= (prevbp->vec[1]+bp->vec[1])/2.0; - bpn->vec[2]= (prevbp->vec[2]+bp->vec[2])/2.0; - bpn->vec[3]= (prevbp->vec[3]+bp->vec[3])/2.0; - bpn++; + for (i = 0; i < number_cuts; i++) { + factor = (float)(i + 1) / (number_cuts + 1); + *bpn= *bp; + interp_v4_v4v4(bpn->vec, prevbp->vec, bp->vec, factor); + bpn++; + } } } - bpn+= (2*nu->pntsu-1); + bpn+= number_cuts * countu; } /* now insert new */ - bpn= bpnew+(2*nu->pntsu-1); - bp= bpnew+(4*nu->pntsu-2); + bpn= bpnew+((number_cuts+1)*nu->pntsu - number_cuts); + bp= bpnew+(number_cuts+1)*((number_cuts+1)*nu->pntsu-number_cuts); prevbp= bpnew; for(a=1; apntsv; a++) { - for(b=0; b<2*nu->pntsu-1; b++) { - *bpn= *bp; - bpn->vec[0]= (prevbp->vec[0]+bp->vec[0])/2.0; - bpn->vec[1]= (prevbp->vec[1]+bp->vec[1])/2.0; - bpn->vec[2]= (prevbp->vec[2]+bp->vec[2])/2.0; - bpn->vec[3]= (prevbp->vec[3]+bp->vec[3])/2.0; - bpn++; + for(b=0; b<(number_cuts+1)*nu->pntsu-number_cuts; b++) { + BPoint *tmp= bpn; + for (i = 0; i < number_cuts; i++) { + factor = (float)(i + 1) / (number_cuts + 1); + *tmp= *bp; + interp_v4_v4v4(tmp->vec, prevbp->vec, bp->vec, factor); + tmp += countu; + } bp++; prevbp++; + bpn++; } - bp+= (2*nu->pntsu-1); - bpn+= (2*nu->pntsu-1); - prevbp+= (2*nu->pntsu-1); + bp+= number_cuts * countu; + bpn+= number_cuts * countu; + prevbp+= number_cuts * countu; } MEM_freeN(nu->bp); nu->bp= bpnew; - nu->pntsu= 2*nu->pntsu-1; - nu->pntsv= 2*nu->pntsv-1; + nu->pntsu= (number_cuts+1)*nu->pntsu-number_cuts; + nu->pntsv= (number_cuts+1)*nu->pntsv-number_cuts; makeknots(nu, 1); makeknots(nu, 2); } /* End of 'if(sel== nu->pntsu*nu->pntsv)' (subdivide entire NURB) */ @@ -2161,7 +2189,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) /* subdivide in v direction? */ sel= 0; for(a=0; apntsv-1; a++) { - if(vsel[a]==nu->pntsu && vsel[a+1]==nu->pntsu) sel++; + if(vsel[a]==nu->pntsu && vsel[a+1]==nu->pntsu) sel+=number_cuts; } if(sel) { /* V ! */ @@ -2170,29 +2198,30 @@ static int subdivide_exec(bContext *C, wmOperator *op) for(a=0; apntsv; a++) { for(b=0; bpntsu; b++) { *bpn= *bp; - bpn++; + bpn++; bp++; } if( (apntsv-1) && vsel[a]==nu->pntsu && vsel[a+1]==nu->pntsu ) { - prevbp= bp- nu->pntsu; - for(b=0; bpntsu; b++) { - /* - This simple bisection must be replaces by a - subtle resampling of a number of points. Our - task is made slightly easier because each - point in our curve is a separate data - node. (is it?) - */ - *bpn= *prevbp; - bpn->vec[0]= (prevbp->vec[0]+bp->vec[0])/2.0; - bpn->vec[1]= (prevbp->vec[1]+bp->vec[1])/2.0; - bpn->vec[2]= (prevbp->vec[2]+bp->vec[2])/2.0; - bpn->vec[3]= (prevbp->vec[3]+bp->vec[3])/2.0; - bpn++; - prevbp++; - bp++; + for (i = 0; i < number_cuts; i++) { + factor = (float)(i + 1) / (number_cuts + 1); + prevbp= bp- nu->pntsu; + for(b=0; bpntsu; b++) { + /* + This simple bisection must be replaces by a + subtle resampling of a number of points. Our + task is made slightly easier because each + point in our curve is a separate data + node. (is it?) + */ + *bpn= *prevbp; + interp_v4_v4v4(bpn->vec, prevbp->vec, bp->vec, factor); + bpn++; + + prevbp++; + bp++; + } + bp-= nu->pntsu; } - bp-= nu->pntsu; } } MEM_freeN(nu->bp); @@ -2204,12 +2233,12 @@ static int subdivide_exec(bContext *C, wmOperator *op) /* or in u direction? */ sel= 0; for(a=0; apntsu-1; a++) { - if(usel[a]==nu->pntsv && usel[a+1]==nu->pntsv) sel++; + if(usel[a]==nu->pntsv && usel[a+1]==nu->pntsv) sel+=number_cuts; } if(sel) { /* U ! */ - /* Inserting U points is sort of 'default' Flat curves only get */ - /* U points inserted in them. */ + /* Inserting U points is sort of 'default' Flat curves only get */ + /* U points inserted in them. */ bpn=bpnew= MEM_mallocN( (sel+nu->pntsu)*nu->pntsv*sizeof(BPoint), "subdivideNurb4"); bp= nu->bp; for(a=0; apntsv; a++) { @@ -2218,20 +2247,20 @@ static int subdivide_exec(bContext *C, wmOperator *op) bpn++; bp++; if( (bpntsu-1) && usel[b]==nu->pntsv && usel[b+1]==nu->pntsv ) { - /* - One thing that bugs me here is that the - orders of things are not the same as in - the JW piece. Also, this implies that we - handle at most 3rd order curves? I miss - some symmetry here... - */ + /* + One thing that bugs me here is that the + orders of things are not the same as in + the JW piece. Also, this implies that we + handle at most 3rd order curves? I miss + some symmetry here... + */ + for (i = 0; i < number_cuts; i++) { + factor = (float)(i + 1) / (number_cuts + 1); prevbp= bp- 1; *bpn= *prevbp; - bpn->vec[0]= (prevbp->vec[0]+bp->vec[0])/2.0; - bpn->vec[1]= (prevbp->vec[1]+bp->vec[1])/2.0; - bpn->vec[2]= (prevbp->vec[2]+bp->vec[2])/2.0; - bpn->vec[3]= (prevbp->vec[3]+bp->vec[3])/2.0; + interp_v4_v4v4(bpn->vec, prevbp->vec, bp->vec, factor); bpn++; + } } } } @@ -2239,7 +2268,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) nu->bp= bpnew; nu->pntsu+= sel; makeknots(nu, 1); /* shift knots - forward */ + forward */ } } } @@ -2248,6 +2277,14 @@ static int subdivide_exec(bContext *C, wmOperator *op) } /* End of 'if(nu->type == CU_NURBS)' */ } +} + +static int subdivide_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + int number_cuts= RNA_int_get(op->ptr, "number_cuts"); + + subdividenurb(obedit, number_cuts); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); DAG_id_flush_update(obedit->data, OB_RECALC_DATA); @@ -2267,6 +2304,8 @@ void CURVE_OT_subdivide(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_int(ot->srna, "number_cuts", 1, 1, 100, "Number of cuts", "", 1, 100); } /******************** find nearest ************************/ @@ -2423,8 +2462,8 @@ static int convertspline(short type, Nurb *nu) else if(type==CU_NURBS) { nu->type = CU_NURBS; nu->orderu= 4; - nu->flagu &= CU_CYCLIC; /* disable all flags except for cyclic */ - nu->flagu += 4; + nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */ + nu->flagu |= CU_NURB_BEZIER; makeknots(nu, 1); a= nu->pntsu*nu->pntsv; bp= nu->bp; @@ -2473,11 +2512,11 @@ static int convertspline(short type, Nurb *nu) nu->orderu= 4; nu->orderv= 1; nu->type = type; - if(nu->flagu & CU_CYCLIC) c= nu->orderu-1; + if(nu->flagu & CU_NURB_CYCLIC) c= nu->orderu-1; else c= 0; if(type== CU_NURBS) { - nu->flagu &= CU_CYCLIC; /* disable all flags except for cyclic */ - nu->flagu += 4; + nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */ + nu->flagu |= CU_NURB_BEZIER; makeknots(nu, 1); } } @@ -2737,7 +2776,7 @@ static void make_selection_list_nurb(ListBase *editnurb) bp= nu->bp; a= nu->pntsu; while(a--) { - add_v3_v3v3(nus->vec, nus->vec, bp->vec); + add_v3_v3(nus->vec, bp->vec); bp++; } mul_v3_fl(nus->vec, 1.0/(float)nu->pntsu); @@ -2798,6 +2837,10 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu if( is_u_selected(nu1, nu1->pntsu-1) ); else { + /* For 2D curves blender uses orderv=0. It doesn't make any sense mathematically. */ + /* but after rotating orderu=0 will be confusing. */ + if (nu1->orderv == 0) nu1->orderv= 1; + rotate_direction_nurb(nu1); if( is_u_selected(nu1, nu1->pntsu-1) ); else { @@ -2818,6 +2861,7 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu /* 2nd nurbs: u = 0 selected */ if( is_u_selected(nu2, 0) ); else { + if (nu2->orderv == 0) nu2->orderv= 1; rotate_direction_nurb(nu2); if( is_u_selected(nu2, 0) ); else { @@ -2863,8 +2907,8 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu /* merge */ origu= nu1->pntsu; nu1->pntsu+= nu2->pntsu; - if(nu1->orderu<3) nu1->orderu++; - if(nu1->orderv<3) nu1->orderv++; + if(nu1->orderu<3 && nu1->orderupntsu) nu1->orderu++; + if(nu1->orderv<3 && nu1->ordervpntsv) nu1->orderv++; temp= nu1->bp; nu1->bp= MEM_mallocN(nu1->pntsu*nu1->pntsv*sizeof(BPoint), "mergeBP"); @@ -2939,7 +2983,7 @@ static int merge_nurb(bContext *C, wmOperator *op) BLI_freelistN(&nsortbase); return OPERATOR_CANCELLED; } - + while(nus2) { merge_2_nurb(op, editnurb, nus1->nu, nus2->nu); nus2= nus2->next; @@ -2992,7 +3036,7 @@ static int make_segment_exec(bContext *C, wmOperator *op) /* find both nurbs and points, nu1 will be put behind nu2 */ for(nu= editnurb->first; nu; nu= nu->next) { - if((nu->flagu & CU_CYCLIC)==0) { /* not cyclic */ + if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic */ if(nu->type == CU_BEZIER) { bezt= nu->bezt; if(nu1==0) { @@ -3156,12 +3200,18 @@ int mouse_nurb(bContext *C, short mval[2], int extend) if(bezt) { - if(hand==1) select_beztriple(bezt, SELECT, 1, HIDDEN); - else if(hand==0) bezt->f1|= SELECT; - else bezt->f3|= SELECT; + if(hand==1) { + select_beztriple(bezt, SELECT, 1, HIDDEN); + cu->lastsel= bezt; + } else { + if(hand==0) bezt->f1|= SELECT; + else bezt->f3|= SELECT; + + cu->lastsel= NULL; + } } else { - cu->lastselbp= bp; + cu->lastsel= bp; select_bpoint(bp, SELECT, 1, HIDDEN); } @@ -3169,8 +3219,13 @@ int mouse_nurb(bContext *C, short mval[2], int extend) else { if(bezt) { if(hand==1) { - if(bezt->f2 & SELECT) select_beztriple(bezt, DESELECT, 1, HIDDEN); - else select_beztriple(bezt, SELECT, 1, HIDDEN); + if(bezt->f2 & SELECT) { + select_beztriple(bezt, DESELECT, 1, HIDDEN); + if (bezt == cu->lastsel) cu->lastsel = NULL; + } else { + select_beztriple(bezt, SELECT, 1, HIDDEN); + cu->lastsel= bezt; + } } else if(hand==0) { bezt->f1 ^= SELECT; } else { @@ -3178,10 +3233,12 @@ int mouse_nurb(bContext *C, short mval[2], int extend) } } else { - if(bp->f1 & SELECT) select_bpoint(bp, DESELECT, 1, HIDDEN); - else { + if(bp->f1 & SELECT) { + select_bpoint(bp, DESELECT, 1, HIDDEN); + if (cu->lastsel == bp) cu->lastsel = NULL; + } else { select_bpoint(bp, SELECT, 1, HIDDEN); - cu->lastselbp= bp; + cu->lastsel= bp; } } @@ -3284,7 +3341,7 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo for(nu= editnurb->first; nu; nu= nu->next) { if(isNurbsel(nu)) { nu->orderv= 4; - nu->flagv |= CU_CYCLIC; + nu->flagv |= CU_NURB_CYCLIC; makeknots(nu, 2); } } @@ -3357,7 +3414,6 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) copy_m3_m4(mat, obedit->obmat); invert_m3_m3(imat,mat); - view3d_operator_needs_opengl(C); findselectedNurbvert(editnurb, &nu, &bezt, &bp); if(bezt==0 && bp==0) return OPERATOR_CANCELLED; @@ -3396,13 +3452,13 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) nu->pntsu++; if(mode=='e') { - VECCOPY(newbezt->vec[0], bezt->vec[0]); - VECCOPY(newbezt->vec[1], bezt->vec[1]); - VECCOPY(newbezt->vec[2], bezt->vec[2]); + copy_v3_v3(newbezt->vec[0], bezt->vec[0]); + copy_v3_v3(newbezt->vec[1], bezt->vec[1]); + copy_v3_v3(newbezt->vec[2], bezt->vec[2]); } else { - VECCOPY(newbezt->vec[1], location); - sub_v3_v3v3(newbezt->vec[1],newbezt->vec[1], obedit->obmat[3]); + copy_v3_v3(newbezt->vec[1], location); + sub_v3_v3(newbezt->vec[1], obedit->obmat[3]); mul_m3_v3(imat,newbezt->vec[1]); sub_v3_v3v3(temp, newbezt->vec[1],temp); add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp); @@ -3444,11 +3500,11 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) makeknots(nu, 1); if(mode=='e') { - VECCOPY(newbp->vec, bp->vec); + copy_v3_v3(newbp->vec, bp->vec); } else { - VECCOPY(newbp->vec, location); - sub_v3_v3v3(newbp->vec, newbp->vec, obedit->obmat[3]); + copy_v3_v3(newbp->vec, location); + sub_v3_v3(newbp->vec, obedit->obmat[3]); mul_m3_v3(imat,newbp->vec); newbp->vec[3]= 1.0; } @@ -3477,7 +3533,7 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, wmEvent *event) { RegionView3D *rv3d= CTX_wm_region_view3d(C); ViewContext vc; - float location[3]; + float location[3] = {0.0f, 0.0f, 0.0f}; short mval[2]; if(rv3d && !RNA_property_is_set(op->ptr, "location")) { @@ -3587,7 +3643,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op) bp= nu->bp; while(a--) { if( bp->f1 & SELECT ) { - nu->flagu ^= CU_CYCLIC; + nu->flagu ^= CU_NURB_CYCLIC; break; } bp++; @@ -3598,7 +3654,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op) bezt= nu->bezt; while(a--) { if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) { - nu->flagu ^= CU_CYCLIC; + nu->flagu ^= CU_NURB_CYCLIC; break; } bezt++; @@ -3611,7 +3667,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op) bp= nu->bp; while(a--) { if( bp->f1 & SELECT ) { - nu->flagu ^= CU_CYCLIC; + nu->flagu ^= CU_NURB_CYCLIC; makeknots(nu, 1); /* 1==u type is ignored for cyclic curves */ break; } @@ -3626,11 +3682,11 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op) if( bp->f1 & SELECT) { if(direction==0 && nu->pntsu>1) { - nu->flagu ^= CU_CYCLIC; + nu->flagu ^= CU_NURB_CYCLIC; makeknots(nu, 1); /* 1==u type is ignored for cyclic curves */ } if(direction==1 && nu->pntsv>1) { - nu->flagv ^= CU_CYCLIC; + nu->flagv ^= CU_NURB_CYCLIC; makeknots(nu, 2); /* 2==v type is ignored for cyclic curves */ } break; @@ -3699,7 +3755,7 @@ void CURVE_OT_cyclic_toggle(wmOperatorType *ot) static int select_linked_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - RegionView3D *rv3d= CTX_wm_region_view3d(C); + RegionView3D *rv3d= ED_view3d_context_rv3d(C); ViewContext vc; Nurb *nu; BezTriple *bezt; @@ -3786,7 +3842,7 @@ static int select_row_exec(bContext *C, wmOperator *op) if(editnurb->first==0) return OPERATOR_CANCELLED; - if(cu->lastselbp==NULL) + if(cu->lastsel==NULL) return OPERATOR_CANCELLED; /* find the correct nurb and toggle with u of v */ @@ -3794,7 +3850,7 @@ static int select_row_exec(bContext *C, wmOperator *op) bp= nu->bp; for(v=0; vpntsv; v++) { for(u=0; upntsu; u++, bp++) { - if(bp==cu->lastselbp) { + if(bp==cu->lastsel) { if(bp->f1 & SELECT) { ok= 1; break; @@ -3805,11 +3861,11 @@ static int select_row_exec(bContext *C, wmOperator *op) } if(ok) { - if(last==cu->lastselbp) { + if(last==cu->lastsel) { direction= 1-direction; setflagsNurb(editnurb, 0); } - last= cu->lastselbp; + last= cu->lastsel; bp= nu->bp; for(a=0; apntsv; a++) { @@ -4215,37 +4271,128 @@ void CURVE_OT_select_random(wmOperatorType *ot) RNA_def_boolean(ot->srna, "extend", FALSE, "Extend Selection", "Extend selection instead of deselecting everything first."); } -/********************** select every nth *********************/ +/********************* every nth number of point *******************/ -static int select_every_nth_exec(bContext *C, wmOperator *op) +static int point_on_nurb(Nurb *nu, void *point) +{ + if (nu->bezt) { + BezTriple *bezt= (BezTriple*)point; + return bezt >= nu->bezt && bezt < nu->bezt + nu->pntsu; + } else { + BPoint *bp= (BPoint*)point; + return bp >= nu->bp && bp < nu->bp + nu->pntsu * nu->pntsv; + } +} + +static void select_nth_bezt(Nurb *nu, BezTriple *bezt, int nth) +{ + int a, start; + + start= bezt - nu->bezt; + a= nu->pntsu; + bezt= nu->bezt + a - 1; + + while (a--) { + if (abs(start - a) % nth) { + select_beztriple(bezt, DESELECT, 1, HIDDEN); + } + + bezt--; + } +} + +static void select_nth_bp(Nurb *nu, BPoint *bp, int nth) +{ + int a, startrow, startpnt; + int dist, row, pnt; + + startrow= (bp - nu->bp) / nu->pntsu; + startpnt= (bp - nu->bp) % nu->pntsu; + + a= nu->pntsu * nu->pntsv; + bp= nu->bp + a - 1; + row = nu->pntsv - 1; + pnt = nu->pntsu - 1; + + while (a--) { + dist= abs(pnt - startpnt) + abs(row - startrow); + if (dist % nth) { + select_bpoint(bp, DESELECT, 1, HIDDEN); + } + + pnt--; + if (pnt < 0) { + pnt= nu->pntsu - 1; + row--; + } + + bp--; + } +} + +int CU_select_nth(Object *obedit, int nth) +{ + Curve *cu= (Curve*)obedit->data; + ListBase *nubase= cu->editnurb; + Nurb *nu; + int ok=0; + + /* Search nurb to which selected point belongs to */ + nu= nubase->first; + while (nu) { + if (point_on_nurb(nu, cu->lastsel)) { + ok= 1; + break; + } + nu= nu->next; + } + + if (!ok) return 0; + + if (nu->bezt) { + select_nth_bezt(nu, cu->lastsel, nth); + } else { + select_nth_bp(nu, cu->lastsel, nth); + } + + return 1; +} + +static int select_nth_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - ListBase *editnurb= curve_get_editcurve(obedit); - int n= RNA_int_get(op->ptr, "n"); - - select_adjacent_cp(editnurb, n, 1, SELECT); - select_adjacent_cp(editnurb, -n, 1, SELECT); - + int nth= RNA_int_get(op->ptr, "nth"); + + if (!CU_select_nth(obedit, nth)) { + if (obedit->type == OB_SURF) { + BKE_report(op->reports, RPT_ERROR, "Surface hasn't got active point"); + } else { + BKE_report(op->reports, RPT_ERROR, "Curve hasn't got active point"); + } + + return OPERATOR_CANCELLED; + } + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); return OPERATOR_FINISHED; } -void CURVE_OT_select_every_nth(wmOperatorType *ot) +void CURVE_OT_select_nth(wmOperatorType *ot) { /* identifiers */ - ot->name= "Select Every Nth"; - ot->idname= "CURVE_OT_select_every_nth"; - + ot->name= "Select Nth"; + ot->description= ""; + ot->idname= "CURVE_OT_select_nth"; + /* api callbacks */ - ot->exec= select_every_nth_exec; + ot->exec= select_nth_exec; ot->poll= ED_operator_editsurfcurve; - + /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - /* properties */ - RNA_def_int(ot->srna, "n", 2, 2, INT_MAX, "N", "Select every Nth element", 2, 25); + RNA_def_int(ot->srna, "nth", 2, 2, 100, "Nth Selection", "", 1, INT_MAX); } /********************** add duplicate operator *********************/ @@ -4255,6 +4402,7 @@ static int duplicate_exec(bContext *C, wmOperator *op) Object *obedit= CTX_data_edit_object(C); adduplicateflagNurb(obedit, 1); + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); return OPERATOR_FINISHED; } @@ -4429,10 +4577,10 @@ static int delete_exec(bContext *C, wmOperator *op) bezt2= bezt+1; if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) ; else { /* maybe do not make cyclic */ - if(a==0 && (nu->flagu & CU_CYCLIC) ) { + if(a==0 && (nu->flagu & CU_NURB_CYCLIC) ) { bezt2= bezt+(nu->pntsu-1); if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) { - nu->flagu &= ~CU_CYCLIC; + nu->flagu &= ~CU_NURB_CYCLIC; WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); DAG_id_flush_update(obedit->data, OB_RECALC_DATA); } @@ -4455,10 +4603,10 @@ static int delete_exec(bContext *C, wmOperator *op) bp2= bp+1; if( bp2->f1 & 1 ) ; else { /* maybe do not make cyclic */ - if(a==0 && (nu->flagu & CU_CYCLIC) ) { + if(a==0 && (nu->flagu & CU_NURB_CYCLIC) ) { bp2= bp+(nu->pntsu-1); if( bp2->f1 & SELECT ) { - nu->flagu &= ~CU_CYCLIC; + nu->flagu &= ~CU_NURB_CYCLIC; WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); DAG_id_flush_update(obedit->data, OB_RECALC_DATA); } @@ -4483,14 +4631,14 @@ static int delete_exec(bContext *C, wmOperator *op) BLI_remlink(editnurb, nu); freeNurb(nu); nu = NULL; } - else if(nu1->flagu & CU_CYCLIC) { /* cyclic */ + else if(nu1->flagu & CU_NURB_CYCLIC) { /* cyclic */ bezt = (BezTriple*)MEM_mallocN((cut+1) * sizeof(BezTriple), "delNurb1"); memcpy(bezt, nu1->bezt,(cut+1)*sizeof(BezTriple)); a= nu1->pntsu-cut-1; memcpy(nu1->bezt, bezt2, a*sizeof(BezTriple)); memcpy(nu1->bezt+a, bezt, (cut+1)*sizeof(BezTriple)); - nu1->flagu &= ~CU_CYCLIC; + nu1->flagu &= ~CU_NURB_CYCLIC; MEM_freeN(bezt); calchandlesNurb(nu); } @@ -4525,14 +4673,14 @@ static int delete_exec(bContext *C, wmOperator *op) BLI_remlink(editnurb, nu); freeNurb(nu); nu= NULL; } - else if(nu1->flagu & CU_CYCLIC) { /* cyclic */ + else if(nu1->flagu & CU_NURB_CYCLIC) { /* cyclic */ bp = (BPoint*)MEM_mallocN((cut+1) * sizeof(BPoint), "delNurb5"); memcpy(bp, nu1->bp,(cut+1)*sizeof(BPoint)); a= nu1->pntsu-cut-1; memcpy(nu1->bp, bp2, a*sizeof(BPoint)); memcpy(nu1->bp+a, bp, (cut+1)*sizeof(BPoint)); - nu1->flagu &= ~CU_CYCLIC; + nu1->flagu &= ~CU_NURB_CYCLIC; MEM_freeN(bp); } else { /* add new curve */ @@ -4572,8 +4720,8 @@ static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event) if(obedit->type==OB_SURF) { pup= uiPupMenuBegin(C, "Delete", 0); layout= uiPupMenuLayout(pup); - uiItemEnumO(layout, NULL, 0, op->type->idname, "type", 0); - uiItemEnumO(layout, NULL, 0, op->type->idname, "type", 2); + uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 0); + uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 2); uiPupMenuEnd(C, pup); } else { @@ -4737,7 +4885,6 @@ int join_curve_exec(bContext *C, wmOperator *op) } /************ add primitive, used by object/ module ****************/ - Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) { static int xzproj= 0; /* this function calls itself... */ @@ -4848,7 +4995,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) nu->pntsu= 5; nu->pntsv= 1; nu->orderu= 5; - nu->flagu= 2; /* endpoint */ + nu->flagu= CU_NURB_ENDPOINT; /* endpoint */ nu->resolu= 8; nu->bp= callocstructN(BPoint, 5, "addNurbprim3"); @@ -4887,7 +5034,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) if (!force_3d) nu->flag |= CU_2D; nu->pntsu= 4; nu->bezt= callocstructN(BezTriple, 4, "addNurbprim1"); - nu->flagu= CU_CYCLIC; + nu->flagu= CU_NURB_CYCLIC; bezt= nu->bezt; bezt->h1= bezt->h2= HD_AUTO; @@ -4924,7 +5071,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) nu->pntsv= 1; nu->orderu= 4; nu->bp= callocstructN(BPoint, 8, "addNurbprim6"); - nu->flagu= CU_CYCLIC; + nu->flagu= CU_NURB_CYCLIC; bp= nu->bp; for(a=0; a<8; a++) { @@ -5046,7 +5193,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) mul_m4_v3(mat,bp->vec); bp++; } - nu->flagu= 4; + nu->flagu= CU_NURB_BEZIER; makeknots(nu, 1); BLI_addtail(editnurb, nu); /* temporal for spin */ @@ -5072,8 +5219,8 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) float tmp_vec[3] = {0.f, 0.f, 0.f}; if(newname) { - rename_id((ID *)obedit, "SurfDonut"); - rename_id((ID *)obedit->data, "SurfDonut"); + rename_id((ID *)obedit, "SurfTorus"); + rename_id((ID *)obedit->data, "SurfTorus"); } xzproj= 1; @@ -5109,6 +5256,318 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) return nu; } +static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf) { + + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb; + Nurb *nu; + int newob= 0; + int enter_editmode; + unsigned int layer; + float loc[3], rot[3]; + float mat[4][4]; + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; + + if (!isSurf) { /* adding curve */ + if(obedit==NULL || obedit->type!=OB_CURVE) { + Curve *cu; + obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE, layer); + newob = 1; + + cu= (Curve*)obedit->data; + cu->flag |= CU_DEFORM_FILL; + if(type & CU_PRIM_PATH) + cu->flag |= CU_PATH|CU_3D; + } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); + } else { /* adding surface */ + if(obedit==NULL || obedit->type!=OB_SURF) { + obedit= ED_object_add_type(C, OB_SURF, loc, rot, TRUE, layer); + newob = 1; + } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); + } + + ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); + + nu= add_nurbs_primitive(C, mat, type, newob); + editnurb= curve_get_editcurve(obedit); + BLI_addtail(editnurb, nu); + + /* userdef */ + if (newob && !enter_editmode) { + ED_object_exit_editmode(C, EM_FREEDATA); + } + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); + + return OPERATOR_FINISHED; +} + +static int curve_prim_add(bContext *C, wmOperator *op, int type) { + return curvesurf_prim_add(C, op, type, 0); +} + +static int surf_prim_add(bContext *C, wmOperator *op, int type) { + return curvesurf_prim_add(C, op, type, 1); +} + +/* ******************** Curves ******************* */ + +static int add_primitive_bezier_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_BEZIER|CU_PRIM_CURVE); +} + +void CURVE_OT_primitive_bezier_curve_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Bezier"; + ot->description= "Construct a Bezier Curve"; + ot->idname= "CURVE_OT_primitive_bezier_curve_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_bezier_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_bezier_circle_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_BEZIER|CU_PRIM_CIRCLE); +} + +void CURVE_OT_primitive_bezier_circle_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Circle"; + ot->description= "Construct a Bezier Circle"; + ot->idname= "CURVE_OT_primitive_bezier_circle_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_bezier_circle_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_curve_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_NURBS|CU_PRIM_CURVE); +} + +void CURVE_OT_primitive_nurbs_curve_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Nurbs Curve"; + ot->description= "Construct a Nurbs Curve"; + ot->idname= "CURVE_OT_primitive_nurbs_curve_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_curve_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_circle_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_NURBS|CU_PRIM_CIRCLE); +} + +void CURVE_OT_primitive_nurbs_circle_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Nurbs Circle"; + ot->description= "Construct a Nurbs Circle"; + ot->idname= "CURVE_OT_primitive_nurbs_circle_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_circle_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_curve_path_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_NURBS|CU_PRIM_PATH); +} + +void CURVE_OT_primitive_nurbs_path_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Path"; + ot->description= "Construct a Path"; + ot->idname= "CURVE_OT_primitive_nurbs_path_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_curve_path_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +/* **************** NURBS surfaces ********************** */ +static int add_primitive_nurbs_surface_curve_exec(bContext *C, wmOperator *op) +{ + return surf_prim_add(C, op, CU_PRIM_CURVE|CU_NURBS); +} + +void SURFACE_OT_primitive_nurbs_surface_curve_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Surface Curve"; + ot->description= "Construct a Nurbs surface Curve"; + ot->idname= "SURFACE_OT_primitive_nurbs_surface_curve_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_surface_curve_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_surface_circle_exec(bContext *C, wmOperator *op) +{ + return surf_prim_add(C, op, CU_PRIM_CIRCLE|CU_NURBS); +} + +void SURFACE_OT_primitive_nurbs_surface_circle_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Surface Circle"; + ot->description= "Construct a Nurbs surface Circle"; + ot->idname= "SURFACE_OT_primitive_nurbs_surface_circle_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_surface_circle_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_surface_surface_exec(bContext *C, wmOperator *op) +{ + return surf_prim_add(C, op, CU_PRIM_PATCH|CU_NURBS); +} + +void SURFACE_OT_primitive_nurbs_surface_surface_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Surface Patch"; + ot->description= "Construct a Nurbs surface Patch"; + ot->idname= "SURFACE_OT_primitive_nurbs_surface_surface_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_surface_surface_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_surface_tube_exec(bContext *C, wmOperator *op) +{ + return surf_prim_add(C, op, CU_PRIM_TUBE|CU_NURBS); +} + +void SURFACE_OT_primitive_nurbs_surface_tube_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Surface Tube"; + ot->description= "Construct a Nurbs surface Tube"; + ot->idname= "SURFACE_OT_primitive_nurbs_surface_tube_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_surface_tube_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_surface_sphere_exec(bContext *C, wmOperator *op) +{ + return surf_prim_add(C, op, CU_PRIM_SPHERE|CU_NURBS); +} + +void SURFACE_OT_primitive_nurbs_surface_sphere_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Surface Sphere"; + ot->description= "Construct a Nurbs surface Sphere"; + ot->idname= "SURFACE_OT_primitive_nurbs_surface_sphere_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_surface_sphere_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_surface_donut_exec(bContext *C, wmOperator *op) +{ + return surf_prim_add(C, op, CU_PRIM_DONUT|CU_NURBS); +} + +void SURFACE_OT_primitive_nurbs_surface_donut_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Surface Donut"; + ot->description= "Construct a Nurbs surface Donut"; + ot->idname= "SURFACE_OT_primitive_nurbs_surface_donut_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_surface_donut_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + /***************** clear tilt operator ********************/ static int clear_tilt_exec(bContext *C, wmOperator *op) @@ -5162,49 +5621,87 @@ void CURVE_OT_tilt_clear(wmOperatorType *ot) /****************** undo for curves ****************/ -static void undoCurve_to_editCurve(void *lbu, void *lbe, void *obdata) +static void *undo_check_lastsel(void *lastsel, Nurb *nu, Nurb *newnu) { - ListBase *lb= lbu; - ListBase *editnurb= lbe; - Nurb *nu, *newnu; - - freeNurblist(editnurb); - - /* copy */ - for(nu= lb->first; nu; nu= nu->next) { - newnu= duplicateNurb(nu); - BLI_addtail(editnurb, newnu); + if (nu->bezt) { + BezTriple *lastbezt= (BezTriple*)lastsel; + if (lastbezt >= nu->bezt && lastbezt < nu->bezt + nu->pntsu) { + return newnu->bezt + (lastbezt - nu->bezt); + } + } else { + BPoint *lastbp= (BPoint*)lastsel; + if (lastbp >= nu->bp && lastbp < nu->bp + nu->pntsu*nu->pntsv) { + return newnu->bp + (lastbp - nu->bp); + } } + + return NULL; } -static void *editCurve_to_undoCurve(void *lbe, void *obdata) +static void undoCurve_to_editCurve(void *ucu, void *cue) { - ListBase *editnurb= lbe; - ListBase *lb; + Curve *cu= cue; + UndoCurve *undoCurve= ucu; + ListBase *undobase= &undoCurve->nubase; + ListBase *editbase= cu->editnurb; Nurb *nu, *newnu; + void *lastsel= NULL; + + freeNurblist(editbase); - lb= MEM_callocN(sizeof(ListBase), "listbase undo"); - /* copy */ - for(nu= editnurb->first; nu; nu= nu->next) { + for(nu= undobase->first; nu; nu= nu->next) { newnu= duplicateNurb(nu); - BLI_addtail(lb, newnu); + + if (lastsel == NULL) { + lastsel= undo_check_lastsel(undoCurve->lastsel, nu, newnu); + } + + BLI_addtail(editbase, newnu); } - return lb; + + cu->lastsel= lastsel; } -static void free_undoCurve(void *lbv) +static void *editCurve_to_undoCurve(void *lbe, void *cue) { - ListBase *lb= lbv; - - freeNurblist(lb); - MEM_freeN(lb); + Curve *cu= cue; + ListBase *nubase= cu->editnurb; + UndoCurve *undoCurve; + Nurb *nu, *newnu; + void *lastsel= NULL; + + undoCurve= MEM_callocN(sizeof(UndoCurve), "undoCurve"); + + /* copy */ + for(nu= nubase->first; nu; nu= nu->next) { + newnu= duplicateNurb(nu); + + if (lastsel == NULL) { + lastsel= undo_check_lastsel(cu->lastsel, nu, newnu); + } + + BLI_addtail(&undoCurve->nubase, newnu); + } + + undoCurve->lastsel= lastsel; + + return undoCurve; +} + +static void free_undoCurve(void *ucv) +{ + UndoCurve *undoCurve= ucv; + + freeNurblist(&undoCurve->nubase); + + MEM_freeN(undoCurve); } static void *get_data(bContext *C) { Object *obedit= CTX_data_edit_object(C); - return curve_get_editcurve(obedit); + return obedit->data; } /* and this is all the undo system needs to know */ diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c index 0511558f544..ded908a52b9 100644 --- a/source/blender/editors/curve/editfont.c +++ b/source/blender/editors/curve/editfont.c @@ -46,8 +46,6 @@ #include "DNA_vfont_types.h" #include "DNA_scene_types.h" #include "DNA_text_types.h" -#include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_curve.h" @@ -66,7 +64,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_curve.h" #include "ED_object.h" #include "ED_screen.h" #include "ED_util.h" @@ -320,7 +317,7 @@ void FONT_OT_insert_lorem(wmOperatorType *ot) { /* identifiers */ ot->name= "Insert Lorem"; - ot->description= "Insert placeholder text"; + ot->description= "Insert placeholder text"; ot->idname= "FONT_OT_insert_lorem"; /* api callbacks */ @@ -387,7 +384,7 @@ static int paste_file_exec(bContext *C, wmOperator *op) char *path; int retval; - path= RNA_string_get_alloc(op->ptr, "path", NULL, 0); + path= RNA_string_get_alloc(op->ptr, "filepath", NULL, 0); retval= paste_file(C, op->reports, path); MEM_freeN(path); @@ -396,7 +393,7 @@ static int paste_file_exec(bContext *C, wmOperator *op) static int paste_file_invoke(bContext *C, wmOperator *op, wmEvent *event) { - if(RNA_property_is_set(op->ptr, "path")) + if(RNA_property_is_set(op->ptr, "filepath")) return paste_file_exec(C, op); WM_event_add_fileselect(C, op); @@ -408,7 +405,7 @@ void FONT_OT_file_paste(wmOperatorType *ot) { /* identifiers */ ot->name= "Paste File"; - ot->description= "Paste contents from file"; + ot->description= "Paste contents from file"; ot->idname= "FONT_OT_file_paste"; /* api callbacks */ @@ -420,7 +417,7 @@ void FONT_OT_file_paste(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH); } /******************* paste buffer operator ********************/ @@ -457,7 +454,7 @@ void FONT_OT_buffer_paste(wmOperatorType *ot) { /* identifiers */ ot->name= "Paste Buffer"; - ot->description= "Paste text from OS buffer"; + ot->description= "Paste text from OS buffer"; ot->idname= "FONT_OT_buffer_paste"; /* api callbacks */ @@ -568,7 +565,7 @@ static short next_word(Curve *cu) { short s; for(s=cu->pos; (cu->str[s]) && (cu->str[s]!=' ') && (cu->str[s]!='\n') && - (cu->str[s]!=1) && (cu->str[s]!='\r'); s++); + (cu->str[s]!=1) && (cu->str[s]!='\r'); s++); if(cu->str[s]) return(s+1); else return(s); } @@ -578,7 +575,7 @@ static short prev_word(Curve *cu) if(cu->pos==0) return(0); for(s=cu->pos-2; (cu->str[s]) && (cu->str[s]!=' ') && (cu->str[s]!='\n') && - (cu->str[s]!=1) && (cu->str[s]!='\r'); s--); + (cu->str[s]!=1) && (cu->str[s]!='\r'); s--); if(cu->str[s]) return(s+1); else return(s); } @@ -614,9 +611,10 @@ static int kill_selection(Object *obedit, int ins) /* 1 == new character */ /******************* set style operator ********************/ static EnumPropertyItem style_items[]= { - {CU_BOLD, "BOLD", 0, "Bold", ""}, - {CU_ITALIC, "ITALIC", 0, "Italic", ""}, - {CU_UNDERLINE, "UNDERLINE", 0, "Underline", ""}, + {CU_CHINFO_BOLD, "BOLD", 0, "Bold", ""}, + {CU_CHINFO_ITALIC, "ITALIC", 0, "Italic", ""}, + {CU_CHINFO_UNDERLINE, "UNDERLINE", 0, "Underline", ""}, + {CU_CHINFO_SMALLCAPS, "SMALL_CAPS", 0, "Small Caps", ""}, {0, NULL, 0, NULL, NULL}}; static int set_style(bContext *C, int style, int clear) @@ -656,7 +654,7 @@ void FONT_OT_style_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Style"; - ot->description= "Set font style"; + ot->description= "Set font style"; ot->idname= "FONT_OT_style_set"; /* api callbacks */ @@ -667,7 +665,7 @@ void FONT_OT_style_set(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_enum(ot->srna, "style", style_items, CU_BOLD, "Style", "Style to set selection to."); + RNA_def_enum(ot->srna, "style", style_items, CU_CHINFO_BOLD, "Style", "Style to set selection to."); RNA_def_boolean(ot->srna, "clear", 0, "Clear", "Clear style rather than setting it."); } @@ -694,7 +692,7 @@ void FONT_OT_style_toggle(wmOperatorType *ot) { /* identifiers */ ot->name= "Toggle Style"; - ot->description= "Toggle font style"; + ot->description= "Toggle font style"; ot->idname= "FONT_OT_style_toggle"; /* api callbacks */ @@ -705,7 +703,7 @@ void FONT_OT_style_toggle(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_enum(ot->srna, "style", style_items, CU_BOLD, "Style", "Style to set selection to."); + RNA_def_enum(ot->srna, "style", style_items, CU_CHINFO_BOLD, "Style", "Style to set selection to."); } /******************* copy text operator ********************/ @@ -737,7 +735,7 @@ void FONT_OT_text_copy(wmOperatorType *ot) { /* identifiers */ ot->name= "Copy Text"; - ot->description= "Copy selected text to clipboard"; + ot->description= "Copy selected text to clipboard"; ot->idname= "FONT_OT_text_copy"; /* api callbacks */ @@ -768,7 +766,7 @@ void FONT_OT_text_cut(wmOperatorType *ot) { /* identifiers */ ot->name= "Cut Text"; - ot->description= "Cut selected text to clipboard"; + ot->description= "Cut selected text to clipboard"; ot->idname= "FONT_OT_text_cut"; /* api callbacks */ @@ -826,7 +824,7 @@ void FONT_OT_text_paste(wmOperatorType *ot) { /* identifiers */ ot->name= "Paste Text"; - ot->description= "Paste text from clipboard"; + ot->description= "Paste text from clipboard"; ot->idname= "FONT_OT_text_paste"; /* api callbacks */ @@ -865,7 +863,7 @@ static int move_cursor(bContext *C, int type, int select) if((select) && (cu->selstart==0)) cu->selstart = cu->selend = cu->pos+1; while(cu->pos>0) { if(ef->textbuf[cu->pos-1]=='\n') break; - if(ef->textbufinfo[cu->pos-1].flag & CU_WRAP ) break; + if(ef->textbufinfo[cu->pos-1].flag & CU_CHINFO_WRAP) break; cu->pos--; } cursmove=FO_CURS; @@ -876,7 +874,7 @@ static int move_cursor(bContext *C, int type, int select) while(cu->poslen) { if(ef->textbuf[cu->pos]==0) break; if(ef->textbuf[cu->pos]=='\n') break; - if(ef->textbufinfo[cu->pos].flag & CU_WRAP ) break; + if(ef->textbufinfo[cu->pos].flag & CU_CHINFO_WRAP ) break; cu->pos++; } cursmove=FO_CURS; @@ -962,7 +960,7 @@ void FONT_OT_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Cursor"; - ot->description= "Move cursor to position type"; + ot->description= "Move cursor to position type"; ot->idname= "FONT_OT_move"; /* api callbacks */ @@ -989,7 +987,7 @@ void FONT_OT_move_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Select"; - ot->description= "Make selection from current cursor position to new cursor position type"; + ot->description= "Make selection from current cursor position to new cursor position type"; ot->idname= "FONT_OT_move_select"; /* api callbacks */ @@ -1031,7 +1029,7 @@ void FONT_OT_change_spacing(wmOperatorType *ot) { /* identifiers */ ot->name= "Change Spacing"; - ot->description= "Change font spacing"; + ot->description= "Change font spacing"; ot->idname= "FONT_OT_change_spacing"; /* api callbacks */ @@ -1076,7 +1074,7 @@ void FONT_OT_change_character(wmOperatorType *ot) { /* identifiers */ ot->name= "Change Character"; - ot->description= "Change font character code"; + ot->description= "Change font character code"; ot->idname= "FONT_OT_change_character"; /* api callbacks */ @@ -1119,7 +1117,7 @@ void FONT_OT_line_break(wmOperatorType *ot) { /* identifiers */ ot->name= "Line Break"; - ot->description= "Insert line break at cursor position"; + ot->description= "Insert line break at cursor position"; ot->idname= "FONT_OT_line_break"; /* api callbacks */ @@ -1209,7 +1207,7 @@ void FONT_OT_delete(wmOperatorType *ot) { /* identifiers */ ot->name= "Delete"; - ot->description= "Delete text by cursor position"; + ot->description= "Delete text by cursor position"; ot->idname= "FONT_OT_delete"; /* api callbacks */ @@ -1351,7 +1349,7 @@ void FONT_OT_text_insert(wmOperatorType *ot) { /* identifiers */ ot->name= "Insert Text"; - ot->description= "Insert text at cursor position"; + ot->description= "Insert text at cursor position"; ot->idname= "FONT_OT_text_insert"; /* api callbacks */ @@ -1366,6 +1364,99 @@ void FONT_OT_text_insert(wmOperatorType *ot) RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position."); } + +/*********************** textbox add operator *************************/ +static int textbox_poll(bContext *C) +{ + Object *ob = CTX_data_active_object(C); + + if (!ED_operator_object_active_editable(C) ) return 0; + if (ob->type != OB_FONT) return 0; + + return 1; +} + +static int textbox_add_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_active_object(C); + Curve *cu= obedit->data; + int i; + + if (cu->totbox < 256) { + for (i = cu->totbox; i>cu->actbox; i--) cu->tb[i]= cu->tb[i-1]; + cu->tb[cu->actbox]= cu->tb[cu->actbox-1]; + cu->actbox++; + cu->totbox++; + } + + WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + return OPERATOR_FINISHED; +} + +void FONT_OT_textbox_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Textbox"; + ot->description= "Add a new text box"; + ot->idname= "FONT_OT_textbox_add"; + + /* api callbacks */ + ot->exec= textbox_add_exec; + ot->poll= textbox_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + +} + + + +/*********************** textbox remove operator *************************/ + + + +static int textbox_remove_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_active_object(C); + Curve *cu= obedit->data; + int i; + int index = RNA_int_get(op->ptr, "index"); + + + if (cu->totbox > 1) { + for (i = index; i < cu->totbox; i++) cu->tb[i]= cu->tb[i+1]; + cu->totbox--; + if (cu->actbox >= index) + cu->actbox--; + } + + WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + + return OPERATOR_FINISHED; +} + +void FONT_OT_textbox_remove(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Remove Textbox"; + ot->description= "Remove the textbox"; + ot->idname= "FONT_OT_textbox_remove"; + + /* api callbacks */ + ot->exec= textbox_remove_exec; + ot->poll= textbox_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "The current text box.", 0, INT_MAX); + + +} + + + /***************** editmode enter/exit ********************/ void make_editText(Object *obedit) @@ -1487,7 +1578,7 @@ void FONT_OT_case_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Case"; - ot->description= "Set font case"; + ot->description= "Set font case"; ot->idname= "FONT_OT_case_set"; /* api callbacks */ @@ -1530,7 +1621,7 @@ void FONT_OT_case_toggle(wmOperatorType *ot) { /* identifiers */ ot->name= "Toggle Case"; - ot->description= "Toggle font case"; + ot->description= "Toggle font case"; ot->idname= "FONT_OT_case_toggle"; /* api callbacks */ @@ -1567,7 +1658,7 @@ static int open_exec(bContext *C, wmOperator *op) PointerRNA idptr; char str[FILE_MAX]; - RNA_string_get(op->ptr, "path", str); + RNA_string_get(op->ptr, "filepath", str); font = load_vfont(str); @@ -1616,12 +1707,12 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) } path = (font && font->name)? font->name: U.fontdir; - if(RNA_property_is_set(op->ptr, "path")) + if(RNA_property_is_set(op->ptr, "filepath")) return open_exec(C, op); open_init(C, op); - RNA_string_set(op->ptr, "path", path); + RNA_string_set(op->ptr, "filepath", path); WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; @@ -1642,7 +1733,7 @@ void FONT_OT_open(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|FTFONTFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|FTFONTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH); } /******************* delete operator *********************/ diff --git a/source/blender/editors/datafiles/B.blend.c b/source/blender/editors/datafiles/B.blend.c deleted file mode 100644 index d8553e30a6a..00000000000 --- a/source/blender/editors/datafiles/B.blend.c +++ /dev/null @@ -1,10668 +0,0 @@ -/* DataToC output of file <_B25_blend> */ - -int datatoc_B_blend_size= 341204; -char datatoc_B_blend[]= { - 66, 76, 69, 78, 68, 69, 82, 95,118, 50, 53, 49, 82, 69, 78, 68, 32, 0, 0, 0, -168, 93,199,191, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 16, 1, 0, 0,180, 92,199,191,199, 0, 0, 0, 1, 0, 0, 0, - 32, 32, 32, 48, 0, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 8, 71,112, 10,240,212,114, 10, 0, 16, 0, 0,128, 0, 4, 0, - 47,104,111,109,101, 47,105,100,101, 97,115,109, 97,110, 52, 50, 47, 46, 66, 50, 53, 46, 98,108,101,110,100, 0, 20, 93,199,191, - 60, 94,199,191,192, 93,199,191, 76, 97,173, 0, 20, 93,199,191,127, 14,189, 8,232, 93,199,191, 60, 94,199,191, 0, 0, 0, 0, - 1,128,173,251, 76,103,199,191, 41,207,126, 8, 96,166,190, 11,168, 93,199,191, 32, 0, 0, 0,255,255,255,255, 60, 94,199,191, -255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244,175,205, 8,136, 93,199,191,114,209,126, 8,104,160,222, 10, -168, 93,199,191, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 32, 0, 0, 0, -168, 93,199,191, 0, 0, 0, 0, 1, 0, 0, 0, 40,120,113, 11, 76,103,199,191,216, 93,199,191, 46,216,126, 8,104,160,222, 10, - 82, 69, 78, 68, 32, 0, 0, 0,168, 93,199,191, 48,208,115, 10,244,175,205, 8, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 0, 0,164, 0, 0, 0,176,233,110, 10,103, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,234,110, 10,128,234,110, 10, -128,234,110, 10,128,234,110, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,110,115, 10, 24,110,115, 10, 24,110,115, 10, 32,111,115, 10, - 32,111,115, 10, 32,111,115, 10, 68, 65, 84, 65,148, 0, 0, 0,128,234,110, 10,104, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,144,111,115, 10, 1, 0, 0, 0, 0, 0, 0, 0, 8, 71,112, 10, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, - 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, 26, 0,254, 4,214, 2, - 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,136,189,163, 10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 88,138,164, 10,144,140,184, 11,144,140,184, 11,144,101,164, 10,152,102,164, 10,160,103,164, 10,160,103,164, 10, - 24,104,164, 10, 96,142,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 64,235,110, 10,193, 0, 0, 0, - 1, 0, 0, 0,176,172,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 65,110,105,109, 97,116,105,111,110, 0, - 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,235,110, 10, 56,240,110, 10, -120,240,110, 10, 88,248,110, 10,160,248,110, 10,240,156,111, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,235,110, 10,194, 0, 0, 0, - 1, 0, 0, 0, 56,236,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 56,236,110, 10,194, 0, 0, 0, 1, 0, 0, 0,120,236,110, 10,248,235,110, 10, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,120,236,110, 10,194, 0, 0, 0, 1, 0, 0, 0,184,236,110, 10, 56,236,110, 10, 0, 0, 0, 0, -254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184,236,110, 10,194, 0, 0, 0, 1, 0, 0, 0,248,236,110, 10, -120,236,110, 10, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,236,110, 10,194, 0, 0, 0, - 1, 0, 0, 0, 56,237,110, 10,184,236,110, 10, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 56,237,110, 10,194, 0, 0, 0, 1, 0, 0, 0,120,237,110, 10,248,236,110, 10, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,120,237,110, 10,194, 0, 0, 0, 1, 0, 0, 0,184,237,110, 10, 56,237,110, 10, 0, 0, 0, 0, - 32, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184,237,110, 10,194, 0, 0, 0, 1, 0, 0, 0,248,237,110, 10, -120,237,110, 10, 0, 0, 0, 0, 32, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,237,110, 10,194, 0, 0, 0, - 1, 0, 0, 0, 56,238,110, 10,184,237,110, 10, 0, 0, 0, 0, 32, 4, 52, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 56,238,110, 10,194, 0, 0, 0, 1, 0, 0, 0,120,238,110, 10,248,237,110, 10, 0, 0, 0, 0,254, 4, 52, 1, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,120,238,110, 10,194, 0, 0, 0, 1, 0, 0, 0,184,238,110, 10, 56,238,110, 10, 0, 0, 0, 0, - 0, 0, 84, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184,238,110, 10,194, 0, 0, 0, 1, 0, 0, 0,248,238,110, 10, -120,238,110, 10, 0, 0, 0, 0, 32, 4, 84, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,238,110, 10,194, 0, 0, 0, - 1, 0, 0, 0, 56,239,110, 10,184,238,110, 10, 0, 0, 0, 0,192, 1, 84, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 56,239,110, 10,194, 0, 0, 0, 1, 0, 0, 0,120,239,110, 10,248,238,110, 10, 0, 0, 0, 0,192, 1,187, 2, 1, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,120,239,110, 10,194, 0, 0, 0, 1, 0, 0, 0,184,239,110, 10, 56,239,110, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184,239,110, 10,194, 0, 0, 0, 1, 0, 0, 0,248,239,110, 10, -120,239,110, 10, 0, 0, 0, 0,192, 1, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,239,110, 10,194, 0, 0, 0, - 1, 0, 0, 0, 56,240,110, 10,184,239,110, 10, 0, 0, 0, 0, 32, 4, 48, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 56,240,110, 10,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248,239,110, 10, 0, 0, 0, 0,254, 4, 48, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,120,240,110, 10,195, 0, 0, 0, 1, 0, 0, 0,192,240,110, 10, 0, 0, 0, 0, 56,236,110, 10, -120,236,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,240,110, 10,195, 0, 0, 0, 1, 0, 0, 0, - 8,241,110, 10,120,240,110, 10, 56,236,110, 10,248,236,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 8,241,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 80,241,110, 10,192,240,110, 10,120,236,110, 10, 56,237,110, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,241,110, 10,195, 0, 0, 0, 1, 0, 0, 0,152,241,110, 10, 8,241,110, 10, -248,236,110, 10, 56,237,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,241,110, 10,195, 0, 0, 0, - 1, 0, 0, 0,224,241,110, 10, 80,241,110, 10,248,235,110, 10,120,237,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,224,241,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 40,242,110, 10,152,241,110, 10,184,236,110, 10,120,237,110, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40,242,110, 10,195, 0, 0, 0, 1, 0, 0, 0,112,242,110, 10, -224,241,110, 10, 56,237,110, 10,184,237,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,242,110, 10, -195, 0, 0, 0, 1, 0, 0, 0,184,242,110, 10, 40,242,110, 10,120,237,110, 10,248,237,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,184,242,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 0,243,110, 10,112,242,110, 10,184,236,110, 10, - 56,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,243,110, 10,195, 0, 0, 0, 1, 0, 0, 0, - 72,243,110, 10,184,242,110, 10,248,237,110, 10, 56,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 72,243,110, 10,195, 0, 0, 0, 1, 0, 0, 0,144,243,110, 10, 0,243,110, 10,248,235,110, 10,120,238,110, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,243,110, 10,195, 0, 0, 0, 1, 0, 0, 0,216,243,110, 10, 72,243,110, 10, -184,237,110, 10,184,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,243,110, 10,195, 0, 0, 0, - 1, 0, 0, 0, 32,244,110, 10,144,243,110, 10,120,237,110, 10,184,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 32,244,110, 10,195, 0, 0, 0, 1, 0, 0, 0,104,244,110, 10,216,243,110, 10,120,238,110, 10,184,238,110, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,244,110, 10,195, 0, 0, 0, 1, 0, 0, 0,176,244,110, 10, - 32,244,110, 10,120,238,110, 10,248,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176,244,110, 10, -195, 0, 0, 0, 1, 0, 0, 0,248,244,110, 10,104,244,110, 10,184,238,110, 10,248,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,248,244,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 64,245,110, 10,176,244,110, 10,248,236,110, 10, - 56,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,245,110, 10,195, 0, 0, 0, 1, 0, 0, 0, -136,245,110, 10,248,244,110, 10,184,237,110, 10, 56,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -136,245,110, 10,195, 0, 0, 0, 1, 0, 0, 0,208,245,110, 10, 64,245,110, 10,248,238,110, 10, 56,239,110, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,245,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 24,246,110, 10,136,245,110, 10, -120,238,110, 10,120,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,246,110, 10,195, 0, 0, 0, - 1, 0, 0, 0, 96,246,110, 10,208,245,110, 10,248,238,110, 10,184,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 96,246,110, 10,195, 0, 0, 0, 1, 0, 0, 0,168,246,110, 10, 24,246,110, 10,120,239,110, 10,184,239,110, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,246,110, 10,195, 0, 0, 0, 1, 0, 0, 0,240,246,110, 10, - 96,246,110, 10,248,237,110, 10,248,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,246,110, 10, -195, 0, 0, 0, 1, 0, 0, 0, 56,247,110, 10,168,246,110, 10,184,237,110, 10,248,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 56,247,110, 10,195, 0, 0, 0, 1, 0, 0, 0,128,247,110, 10,240,246,110, 10, 56,237,110, 10, - 56,240,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,247,110, 10,195, 0, 0, 0, 1, 0, 0, 0, -200,247,110, 10, 56,247,110, 10, 56,238,110, 10, 56,240,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -200,247,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 16,248,110, 10,128,247,110, 10,248,239,110, 10, 56,240,110, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,248,110, 10,195, 0, 0, 0, 1, 0, 0, 0, 88,248,110, 10,200,247,110, 10, -248,236,110, 10,120,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,248,110, 10,195, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 16,248,110, 10, 56,239,110, 10,184,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 96, 0, 0, 0,160,248,110, 10,197, 0, 0, 0, 1, 0, 0, 0,128,251,110, 10, 0, 0, 0, 0,248,236,110, 10, 56,236,110, 10, -120,236,110, 10, 56,237,110, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, 7, 7,255, 4, - 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 80,172,111, 10, 80,172,111, 10, 48,249,110, 10, 88,250,110, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,249,110, 10,198, 0, 0, 0, - 1, 0, 0, 0, 88,250,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 88,250,110, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,249,110, 10, 0, 0, 0, 0, 0,240,109, 69, - 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, - 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, - 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,128,251,110, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 29,111, 10, -160,248,110, 10,120,237,110, 10,248,237,110, 10, 56,238,110, 10,184,236,110, 10, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, - 0, 0, 0, 0, 51, 1, 0, 0, 4, 4,222, 0, 52, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 21,111, 10, - 56, 28,111, 10, 16,252,110, 10, 56,253,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 16,252,110, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,253,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, 0, 0, 94, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221, 0, 0, 0, - 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,222, 0, 31, 0,222, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 21, 1, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,253,110, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 16,252,110, 10, 0, 0, 0, 0, 0, 0, 94, 67, 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 77, 67, 1,128,138,195, - 0, 0, 0, 0,205, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,222, 0, 21, 1,205, 0, - 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, - 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 21, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,254,110, 10, -240, 19,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,254,110, 10, -196, 0, 0, 0, 1, 0, 0, 0,208,255,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, - 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,205, 0, 36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208,255,110, 10,196, 0, 0, 0, 1, 0, 0, 0, 64, 1,111, 10, - 96,254,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,115, 99,101,110,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,115, 99,101,110,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 63, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 64, 1,111, 10,196, 0, 0, 0, 1, 0, 0, 0,176, 2,111, 10,208,255,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 85,110,105,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 50,255, 63, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176, 2,111, 10,196, 0, 0, 0, - 1, 0, 0, 0, 32, 4,111, 10, 64, 1,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,107,101,121, -105,110,103, 95,115,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,107,101,121, -105,110,103, 95,115,101,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75,101,121,105,110,103, 32, 83,101,116,115, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213,254, 63, 1, 69, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 32, 4,111, 10,196, 0, 0, 0, 1, 0, 0, 0,144, 5,111, 10,176, 2,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,112,104,121,115,105, 99,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,112,104,121,115,105, 99,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71,114, 97,118,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,254, 63, 1, 36, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -144, 5,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 7,111, 10, 32, 4,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100, -101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, -205, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0, 7,111, 10,196, 0, 0, 0, 1, 0, 0, 0, -112, 8,111, 10,144, 5,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,205, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,112, 8,111, 10,196, 0, 0, 0, 1, 0, 0, 0,224, 9,111, 10, 0, 7,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140,254,205, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224, 9,111, 10, -196, 0, 0, 0, 1, 0, 0, 0, 80, 11,111, 10,112, 8,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, - 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,205, 0, 58, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80, 11,111, 10,196, 0, 0, 0, 1, 0, 0, 0,192, 12,111, 10, -224, 9,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,205, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,192, 12,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 48, 14,111, 10, 80, 11,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 35,253,205, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48, 14,111, 10,196, 0, 0, 0, - 1, 0, 0, 0,160, 15,111, 10,192, 12,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101, -114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101, -114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,253,205, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,160, 15,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 16, 17,111, 10, 48, 14,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243,252,205, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 16, 17,111, 10,196, 0, 0, 0, 1, 0, 0, 0,128, 18,111, 10,160, 15,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,252, -205, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 18,111, 10,196, 0, 0, 0, 1, 0, 0, 0, -240, 19,111, 10, 16, 17,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, - 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, - 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105, -111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,205, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,240, 19,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 18,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,195,252,205, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 96, 21,111, 10, -164, 0, 0, 0, 1, 0, 0, 0, 56, 28,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0, -160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112, 22,111, 10,198, 0, 0, 0, 1, 0, 0, 0,152, 23,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152, 23,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112, 22,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 24,111, 10, - 68, 65, 84, 65, 72, 3, 0, 0,192, 24,111, 10,158, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, - 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, - 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195, -115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, - 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 56, 28,111, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 21,111, 10,112, 22,111, 10,152, 23,111, 10, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, -159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 96, 29,111, 10,197, 0, 0, 0, 1, 0, 0, 0, 16, 40,111, 10, -128,251,110, 10,248,235,110, 10,120,238,110, 10,184,238,110, 10,120,237,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, - 0, 0, 0, 0, 83, 0, 0, 0, 15, 15, 32, 4, 84, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32,111, 10, -232, 38,111, 10,240, 29,111, 10, 24, 31,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,240, 29,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 31,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,140, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,132, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 32, 4, 26, 0, 32, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 31,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -240, 29,111, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, - 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 18, 0, 0, 0, 57, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, - 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 32, 4, 58, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, - 26, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 58, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 64, 32,111, 10, -174, 0, 0, 0, 1, 0, 0, 0,232, 38,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 32, 33,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 72, 34,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,203, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 88, 6, 26, 0, 88, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72, 34,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 32, 33,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, - 26, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 35,111, 10, 68, 65, 84, 65, 72, 3, 0, 0,112, 35,111, 10, -158, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, -226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 91,138, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, - 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232, 38,111, 10,159, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 64, 32,111, 10, 32, 33,111, 10, 72, 34,111, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 96, 0, 0, 0, 16, 40,111, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 55,111, 10, 96, 29,111, 10,248,237,110, 10,248,239,110, 10, - 56,240,110, 10, 56,238,110, 10, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 53, 1, 0, 0, 47, 2, 0, 0, 3, 3,222, 0, -251, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 42,111, 10, 72, 54,111, 10,160, 40,111, 10,200, 41,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 40,111, 10,198, 0, 0, 0, - 1, 0, 0, 0,200, 41,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 94, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, - 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,222, 0, 26, 0,222, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 33, 4, 0, 0,254, 4, 0, 0, 22, 2, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,200, 41,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 40,111, 10, 0, 0, 0, 0, 0,128,131, 67, - 0, 0,228,194, 0, 0, 0, 0, 0, 0,100, 66, 0, 0,131, 67, 0, 0, 79,195, 0, 0, 0, 0,205, 0, 0, 0,222, 0, 0, 0, - 18, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, - 18, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,222, 0,225, 0,205, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 53, 1, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 1, 0, 0,240, 42,111, 10,168, 0, 0, 0, 1, 0, 0, 0,112, 47,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 44,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 68, 65, 84, 65, 12, 0, 0, 0, 32, 44,111, 10,221, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 88, 44,111, 10, - 68, 65, 84, 65,156, 0, 0, 0, 88, 44,111, 10,220, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,240,212,114, 10, - 19, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 20, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 21, 0, 1, 0, 1, 0, 1, 0, -240,212,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,229,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,240,114, 10, 0, 0, 0, 0, - 1, 0, 1, 0, 16, 31,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,176,248,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 56, 13,115, 10, - 0, 0, 0, 0, 1, 0, 1, 0,168,244,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 72,226,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, -152,236,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,225,114, 10, 68, 65, 84, 65,248, 0, 0, 0, 32, 45,111, 10,198, 0, 0, 0, - 1, 0, 0, 0, 72, 46,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, - 0, 0, 67, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,137, 67, - 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,195, 0, 26, 0,195, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 4, 0, 0,247, 4, 0, 0, 69, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 72, 46,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32, 45,111, 10, 0, 0, 0, 0, 0, 0,150, 67, - 0,192,116,196, 0, 0, 0, 0, 0, 0, 0, 0,205, 85,150, 67,223,204, 35,196, 26, 85,207,195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, - 0, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 4, 6, 0,195, 0,156, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, 95, 2, 0, 0,250, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,112, 47,111, 10,164, 0, 0, 0, 1, 0, 0, 0, 72, 54,111, 10, -240, 42,111, 10, 32, 45,111, 10, 72, 46,111, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,128, 48,111, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 49,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 49,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -128, 48,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, - 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 50,111, 10, 68, 65, 84, 65, 72, 3, 0, 0,208, 50,111, 10, -158, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, -226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, - 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72, 54,111, 10,159, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,112, 47,111, 10,128, 48,111, 10,168, 49,111, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 96, 0, 0, 0,112, 55,111, 10,197, 0, 0, 0, 1, 0, 0, 0,168, 79,111, 10, 16, 40,111, 10,248,238,110, 10, 56,239,110, 10, -184,237,110, 10,184,238,110, 10, 0, 0, 0, 0,193, 1, 0, 0, 31, 4, 0, 0, 85, 0, 0, 0,186, 2, 0, 0, 1, 1, 95, 2, -102, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75,111, 10,200, 78,111, 10, 0, 56,111, 10,176, 70,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0, 56,111, 10,198, 0, 0, 0, - 1, 0, 0, 0, 40, 57,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0,192, 23, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0, 95, 2, 26, 0, 95, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 1, 0, 0, 31, 4, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 95, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 40, 57,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 80, 58,111, 10, 0, 56,111, 10, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0,193, 1, 0, 0,111, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 76, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 58,111, 10,198, 0, 0, 0, 1, 0, 0, 0,120, 59,111, 10, - 40, 57,111, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0, 31, 4, 0, 0, -111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, - 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 59,111, 10, -198, 0, 0, 0, 1, 0, 0, 0,176, 70,111, 10, 80, 58,111, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,180, 0,148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 4, 0, 0, 31, 4, 0, 0,111, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,160, 60,111, 10, 64, 69,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,160, 60,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 16, 62,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 62,254,163, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16, 62,111, 10, -196, 0, 0, 0, 1, 0, 0, 0,128, 63,111, 10,160, 60,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80, -101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,252,163, 0, 58, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 63,111, 10,196, 0, 0, 0, 1, 0, 0, 0,240, 64,111, 10, - 16, 62,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,112,114,111, -112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,112,114,111, -112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235,252,163, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,240, 64,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 96, 66,111, 10,128, 63,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,211,252,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96, 66,111, 10,196, 0, 0, 0, - 1, 0, 0, 0,208, 67,111, 10,240, 64,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, - 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, - 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73, -109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187,252,163, 0, 0, 0, 20, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208, 67,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 64, 69,111, 10, 96, 66,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101, -110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101, -110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, 97,116,105,111,110,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,163,252,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 64, 69,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208, 67,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,116,101,109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255, -163, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176, 70,111, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,120, 59,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0, - 31, 4, 0, 0,111, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 2, 76, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 71,111, 10, 68, 65, 84, 65, 72, 3, 0, 0, -216, 71,111, 10,158, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25,134,144, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190, -142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65, -111,121,173,192,248,209,213, 64, 0, 0,128, 63,178,157,229, 62,215, 62,232,190, 48,180, 81,191,184,158, 81,191,117, 90,127, 63, -158,227, 95, 62, 26, 63,185, 62, 35, 44,185, 62,145,180,109,188,243, 90,129, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,240,191, 62,110,116, 85, 63, 80,185, 70,188, 0, 0, 82,180,206, 44,182,190, -198,158, 47, 62, 36,239, 74, 63, 0, 0, 8,179, 67,108,117,194,183,204,216, 65,104,156, 5,194,212,247,159,192,235, 62,114, 66, - 59,254,213,193,157,225, 3, 66, 55, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,178,157,229, 62,215, 62,232,190, 48,180, 81,191,184,158, 81,191,117, 90,127, 63, -158,227, 95, 62, 26, 63,185, 62, 35, 44,185, 62,145,180,109,188,243, 90,129, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,255,189, 88, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255,189, 88, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,189, 88, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,234,108, 69, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255,255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 32, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 75,111, 10, -159, 0, 0, 0, 1, 0, 0, 0,200, 78,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 3, 0,255,255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,120, 76,111, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 77,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 77,111, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,120, 76,111, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4, -122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, -200, 78,111, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 75,111, 10,120, 76,111, 10,160, 77,111, 10, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, - 68, 65, 84, 65, 96, 0, 0, 0,168, 79,111, 10,197, 0, 0, 0, 1, 0, 0, 0, 8,116,111, 10,112, 55,111, 10,120,238,110, 10, -120,239,110, 10,184,239,110, 10,248,238,110, 10, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 85, 0, 0, 0,255, 0, 0, 0, - 2, 2,192, 1,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 84,111, 10, 40,115,111, 10, 56, 80,111, 10, -176, 83,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56, 80,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 96, 81,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 93, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,224, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,192, 1, 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,192, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 96, 81,111, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 82,111, 10, 56, 80,111, 10, 0, 0, 0, 0, - 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,254,194, 0, 0, 0, 0,200, 0, 0, 0, -217, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,145, 0,200, 0,127, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,111, 0, 0, 0,255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,145, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136, 82,111, 10,198, 0, 0, 0, 1, 0, 0, 0, -176, 83,111, 10, 96, 81,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, -191, 1, 0, 0,111, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -176, 83,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 82,111, 10, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, - 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, -144, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0, -144, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,231, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,191, 1, 0, 0,111, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,231, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216, 84,111, 10,163, 0, 0, 0, 1, 0, 0, 0,160, 89,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 85,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224, 85,111, 10, 22, 1, 0, 0, - 1, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 40, 86,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 80, 87,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 3, 26, 0,160, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 87,111, 10,198, 0, 0, 0, 1, 0, 0, 0,120, 88,111, 10, - 40, 86,111, 10, 0, 0, 0, 0, 0, 0, 44, 67, 0,128,100,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 67, 0,128,100,196, - 0, 0, 0, 0,172, 0, 0, 0,189, 0, 0, 0, 18, 0, 0, 0,163, 3, 0, 0, 0, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,171, 0, 0, 0, 18, 0, 0, 0,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,189, 0,164, 3,172, 0, -146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 88,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 87,111, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, - 0, 0,168,191, 0, 0, 20, 64, 0, 0,169,191, 0,128, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3, 0, 0, 0, 0, 0, 0,164, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,160, 3,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,160, 12, 0, 0,160, 89,111, 10,169, 0, 0, 0, 1, 0, 0, 0,176,111,111, 10,216, 84,111, 10, 40, 86,111, 10, -120, 88,111, 10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112,102,111, 10, -198, 0, 0, 0, 1, 0, 0, 0,152,103,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 42, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,168, 2, 26, 0,168, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,168, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,152,103,111, 10,198, 0, 0, 0, 1, 0, 0, 0,192,104,111, 10,112,102,111, 10, 0, 0, 0, 0, - 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,164, 3, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,192,104,111, 10,198, 0, 0, 0, 1, 0, 0, 0, -232,105,111, 10,152,103,111, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, - 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, -120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 2, 0, 0,111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -232,105,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 16,107,111, 10,192,104,111, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,167, 2, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,107,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,105,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,111, 0, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 2,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,108,111, 10, 68, 65, 84, 65, 72, 3, 0, 0, 56,108,111, 10,158, 0, 0, 0, - 1, 0, 0, 0,226,225,191, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, - 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, - 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, - 0, 0,128, 63,192, 90, 29, 63,208,249,224,190,222,160, 81,191,184,158, 81,191,253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, - 35, 44,185, 62,232,229,162,188,206,156,122, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65,250, 8,140, 62,174,189, 27, 63,224, 25, 17,188, 0, 64,153,181,195, 13,188,190,191, 73, 53, 62, 99,126, 81, 63, - 0,128,163, 53,215,104, 25,196,134,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,159, 87,135,195,205,209,166, 67, -151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63,192, 90, 29, 63,208,249,224,190,222,160, 81,191,184,158, 81,191,253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, - 35, 44,185, 62,232,229,162,188,206,156,122, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, - 0, 0, 0, 0,172,148, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176,111,111, 10,159, 0, 0, 0, 1, 0, 0, 0, - 40,115,111, 10,160, 89,111, 10,112,102,111, 10, 16,107,111, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -216,112,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,114,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,114,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216,112,111, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 40,115,111, 10,174, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,176,111,111, 10,216,112,111, 10, 0,114,111, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, - 8,116,111, 10,197, 0, 0, 0, 1, 0, 0, 0,240,156,111, 10,168, 79,111, 10,120,239,110, 10,248,236,110, 10, 56,239,110, 10, -184,239,110, 10, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 1, 1, 0, 0,186, 2, 0, 0, 12, 12,192, 1,186, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,120,111, 10, 16,156,111, 10,152,116,111, 10,232,118,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,116,111, 10,198, 0, 0, 0, 1, 0, 0, 0, -192,117,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 98, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,224, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, - 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,192, 1, - 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, 1, 0, 0, 1, 1, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -192,117,111, 10,198, 0, 0, 0, 1, 0, 0, 0,232,118,111, 10,152,116,111, 10, 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,199,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, -159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, - 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,160, 1,200, 0,142, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 27, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,200, 0,160, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232,118,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192,117,111, 10, - 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 0,199,195, 0, 0, 0, 0, -231, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, 0, 64, 28, 70, - 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,248, 0,160, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,191, 1, 0, 0, 27, 1, 0, 0, -186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 16,120,111, 10, 23, 1, 0, 0, - 1, 0, 0, 0,192,125,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 2, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,121,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,122,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 78, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,159, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 3, 26, 0,160, 3, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0, 49, 2, 0, 0, - 74, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,122,111, 10,198, 0, 0, 0, - 1, 0, 0, 0,112,123,111, 10, 32,121,111, 10, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 67, 0, 0,219,195, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, - 6, 0,217, 0,200, 1,200, 0,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,216, 0, 0, 0, 75, 2, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0,200, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,112,123,111, 10,198, 0, 0, 0, 1, 0, 0, 0,152,124,111, 10, 72,122,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0,159, 3, 0, 0, 75, 2, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,124,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -112,123,111, 10, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, - 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,199, 1, 0, 0, 18, 0, 0, 0,198, 2, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 18, 0, 0, 0,198, 2, 0, 0, 18, 0, 0, 0,199, 1, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, - 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,199, 2,200, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 3, 0, 0, - 75, 2, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 2,200, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192,125,111, 10, -163, 0, 0, 0, 1, 0, 0, 0,136,130,111, 10, 16,120,111, 10, 32,121,111, 10,152,124,111, 10, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,200,126,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,200,126,111, 10, 22, 1, 0, 0, 1, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,127,111, 10,198, 0, 0, 0, 1, 0, 0, 0, - 56,128,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,104, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65, - 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 3, - 26, 0,160, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -159, 3, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 56,128,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,129,111, 10, 16,127,111, 10, 0, 0, 0, 0, 0, 0, 44, 67, 0,128,100,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 67, 0,128,100,196, 0, 0, 0, 0,172, 0, 0, 0,189, 0, 0, 0, 18, 0, 0, 0, -163, 3, 0, 0, 0, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,171, 0, 0, 0, 18, 0, 0, 0, -163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,189, 0,164, 3,172, 0,146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,129,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56,128,111, 10, - 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0,168,191, 0, 0, 20, 64, 0, 0,169,191, 0,128, 20, 64, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,160, 3, 0, 0, 0, 0, 0, 0,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0,111, 0, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 12, 0, 0,136,130,111, 10,169, 0, 0, 0, - 1, 0, 0, 0,152,152,111, 10,192,125,111, 10, 16,127,111, 10, 96,129,111, 10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,143,111, 10,198, 0, 0, 0, 1, 0, 0, 0,128,144,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 42, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,167, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,168, 2, 26, 0,168, 2, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0, 85, 0, 0, 0, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,144,111, 10,198, 0, 0, 0, - 1, 0, 0, 0,168,145,111, 10, 88,143,111, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, - 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0,164, 3, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,168,145,111, 10,198, 0, 0, 0, 1, 0, 0, 0,208,146,111, 10,128,144,111, 10, 0, 0, 0, 0, 0, 0, 16, 67, - 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208,146,111, 10,198, 0, 0, 0, 1, 0, 0, 0,248,147,111, 10, -168,145,111, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, - 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0, -104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,167, 2, 0, 0, -111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248,147,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208,146,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,168, 2,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,149,111, 10, - 68, 65, 84, 65, 72, 3, 0, 0, 32,149,111, 10,158, 0, 0, 0, 1, 0, 0, 0,226,225,191, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, - 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, - 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, - 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, - 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,192, 90, 29, 63,208,249,224,190,222,160, 81,191, -184,158, 81,191,253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, 35, 44,185, 62,232,229,162,188,206,156,122, 63,129, 63,228,190, - 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,250, 8,140, 62,174,189, 27, 63,224, 25, 17,188, - 0, 64,153,181,195, 13,188,190,191, 73, 53, 62, 99,126, 81, 63, 0,128,163, 53,215,104, 25,196,134,132,135, 67, 37, 9,167,195, -136,252, 71,194, 3, 54, 25, 68,159, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, - 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,192, 90, 29, 63,208,249,224,190,222,160, 81,191, -184,158, 81,191,253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, 35, 44,185, 62,232,229,162,188,206,156,122, 63,129, 63,228,190, - 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, - 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,172,148, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,152,152,111, 10,159, 0, 0, 0, 1, 0, 0, 0, 16,156,111, 10,136,130,111, 10, 88,143,111, 10,248,147,111, 10, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,192,153,111, 10,198, 0, 0, 0, 1, 0, 0, 0,232,154,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, -101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232,154,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192,153,111, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, -112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, - 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,180, 0, 0, 0, 16,156,111, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,152,111, 10,192,153,111, 10, -232,154,111, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240,156,111, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 8,116,111, 10,248,239,110, 10,184,237,110, 10, 56,237,110, 10, 56,240,110, 10, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, - 49, 2, 0, 0,186, 2, 0, 0, 1, 1,222, 0,138, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,163,111, 10, - 64,171,111, 10,128,157,111, 10,168,158,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,128,157,111, 10,198, 0, 0, 0, 1, 0, 0, 0,168,158,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,194, 67, 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 1, 0, 0, - 0, 0, 0, 0, 23, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,132, 1, 24, 0,132, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 49, 2, 0, 0, 49, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,158,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -128,157,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, - 49, 2, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0,138, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,159,111, 10, 68, 65, 84, 65, 72, 3, 0, 0,208,159,111, 10, -158, 0, 0, 0, 1, 0, 0, 0, 23,255, 13, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,109,100, 64, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62, -149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190, -152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, - 56, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, - 77,255,170, 64, 0, 0,128, 63, 2,201,194, 63, 61,254,144,191,244,250, 39,191, 8,165, 39,191,142,164,206, 63,250,192,142, 63, -180,164, 28, 63,149, 84, 28, 63,177,153,196,188,189,133, 76, 64, 8,108,228,190, 50,247,227,190, 81, 21, 64,191,119, 24,172,191, -216, 49, 49, 65,152, 9, 52, 65,231, 70,158, 62, 24,234,167, 62,160,206,159,187, 0, 0,170,180,243, 26,182,189,252, 74,179, 61, -195,111,128, 62, 0, 0,124, 51,211,120, 21,194,144, 5, 2, 66, 10,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193, -158,101,210, 65,173, 40,160, 64,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62, -149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190, -152, 9, 52,193, 0, 0,128, 63, 2,201,194, 63, 61,254,144,191,244,250, 39,191, 8,165, 39,191,142,164,206, 63,250,192,142, 63, -180,164, 28, 63,149, 84, 28, 63,177,153,196,188,189,133, 76, 64, 8,108,228,190, 50,247,227,190, 81, 21, 64,191,119, 24,172,191, -216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 2, 35,171,190, 0, 0, 32, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 13,133, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,163,111, 10,159, 0, 0, 0, - 1, 0, 0, 0,192,166,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,112,164,111, 10,198, 0, 0, 0, 1, 0, 0, 0,152,165,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,194, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 1, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,132, 1, 26, 0,132, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 5, 0, 0,128, 7, 0, 0,249, 3, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 1, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,165,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -112,164,111, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,185, 67, 0, 0, 62,195, - 0, 0, 0, 0,115, 1, 0, 0,132, 1, 0, 0, 18, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0,114, 1, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,114, 1, 0, 0, 18, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,132, 1,208, 0,115, 1, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 5, 0, 0,128, 7, 0, 0, - 41, 3, 0, 0,248, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 1,208, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 1, 0, 0,192,166,111, 10, -168, 0, 0, 0, 1, 0, 0, 0, 64,171,111, 10, 72,163,111, 10,112,164,111, 10,152,165,111, 10, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,167,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,240,167,111, 10,221, 0, 0, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 13, 0, 0, 0, 40,168,111, 10, 68, 65, 84, 65,156, 0, 0, 0, 40,168,111, 10,220, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0,240,212,114, 10, 19, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 20, 0, 0, 0, 1, 0, 1, 0, -240,212,114, 10, 21, 0, 1, 0, 1, 0, 1, 0,240,212,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,229,114, 10, 0, 0, 0, 0, - 1, 0, 1, 0,160,240,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 16, 31,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,176,248,114, 10, - 0, 0, 0, 0, 1, 0, 1, 0, 56, 13,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,168,244,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, - 72,226,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,236,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,225,114, 10, 68, 65, 84, 65, -248, 0, 0, 0,240,168,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 24,170,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, 0, 0, 67, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,195, 0, 26, 0,195, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, 69, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,170,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -240,168,111, 10, 0, 0, 0, 0, 0, 0,150, 67, 0,192,116,196, 0, 0, 0, 0, 0, 0, 0, 0,205, 85,150, 67,223,204, 35,196, - 26, 85,207,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 4, 6, 0,195, 0,156, 0,195, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, - 95, 2, 0, 0,250, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0,156, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 64,171,111, 10, -164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192,166,111, 10,240,168,111, 10, 24,170,111, 10, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,176,172,111, 10,193, 0, 0, 0, 1, 0, 0, 0, 8, 71,112, 10, - 64,235,110, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111,109,112,111,115,105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,173,111, 10,168,176,111, 10,232,176,111, 10,208,182,111, 10, - 24,183,111, 10, 24, 31,112, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,173,111, 10,194, 0, 0, 0, 1, 0, 0, 0,168,173,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,173,111, 10,194, 0, 0, 0, - 1, 0, 0, 0,232,173,111, 10,104,173,111, 10, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -232,173,111, 10,194, 0, 0, 0, 1, 0, 0, 0, 40,174,111, 10,168,173,111, 10, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 40,174,111, 10,194, 0, 0, 0, 1, 0, 0, 0,104,174,111, 10,232,173,111, 10, 0, 0, 0, 0, -254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,174,111, 10,194, 0, 0, 0, 1, 0, 0, 0,168,174,111, 10, - 40,174,111, 10, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,174,111, 10,194, 0, 0, 0, - 1, 0, 0, 0,232,174,111, 10,104,174,111, 10, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -232,174,111, 10,194, 0, 0, 0, 1, 0, 0, 0, 40,175,111, 10,168,174,111, 10, 0, 0, 0, 0, 20, 4, 64, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 40,175,111, 10,194, 0, 0, 0, 1, 0, 0, 0,104,175,111, 10,232,174,111, 10, 0, 0, 0, 0, -254, 4, 64, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,175,111, 10,194, 0, 0, 0, 1, 0, 0, 0,168,175,111, 10, - 40,175,111, 10, 0, 0, 0, 0, 20, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,175,111, 10,194, 0, 0, 0, - 1, 0, 0, 0,232,175,111, 10,104,175,111, 10, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -232,175,111, 10,194, 0, 0, 0, 1, 0, 0, 0, 40,176,111, 10,168,175,111, 10, 0, 0, 0, 0, 20, 4, 20, 1, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 40,176,111, 10,194, 0, 0, 0, 1, 0, 0, 0,104,176,111, 10,232,175,111, 10, 0, 0, 0, 0, - 0, 2, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,176,111, 10,194, 0, 0, 0, 1, 0, 0, 0,168,176,111, 10, - 40,176,111, 10, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,176,111, 10,194, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,104,176,111, 10, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -232,176,111, 10,195, 0, 0, 0, 1, 0, 0, 0, 48,177,111, 10, 0, 0, 0, 0,168,173,111, 10,232,173,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,177,111, 10,195, 0, 0, 0, 1, 0, 0, 0,120,177,111, 10,232,176,111, 10, -168,173,111, 10,104,174,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,177,111, 10,195, 0, 0, 0, - 1, 0, 0, 0,192,177,111, 10, 48,177,111, 10,232,173,111, 10,168,174,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,192,177,111, 10,195, 0, 0, 0, 1, 0, 0, 0, 8,178,111, 10,120,177,111, 10,104,174,111, 10,168,174,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,178,111, 10,195, 0, 0, 0, 1, 0, 0, 0, 80,178,111, 10, -192,177,111, 10, 40,174,111, 10, 40,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,178,111, 10, -195, 0, 0, 0, 1, 0, 0, 0,152,178,111, 10, 8,178,111, 10,232,174,111, 10, 40,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,152,178,111, 10,195, 0, 0, 0, 1, 0, 0, 0,224,178,111, 10, 80,178,111, 10,168,174,111, 10, -104,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,178,111, 10,195, 0, 0, 0, 1, 0, 0, 0, - 40,179,111, 10,152,178,111, 10,104,174,111, 10,104,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 40,179,111, 10,195, 0, 0, 0, 1, 0, 0, 0,112,179,111, 10,224,178,111, 10,232,174,111, 10,104,175,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,179,111, 10,195, 0, 0, 0, 1, 0, 0, 0,184,179,111, 10, 40,179,111, 10, -168,174,111, 10, 40,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,179,111, 10,195, 0, 0, 0, - 1, 0, 0, 0, 0,180,111, 10,112,179,111, 10,104,174,111, 10,168,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 0,180,111, 10,195, 0, 0, 0, 1, 0, 0, 0, 72,180,111, 10,184,179,111, 10,104,175,111, 10,232,175,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,180,111, 10,195, 0, 0, 0, 1, 0, 0, 0,144,180,111, 10, - 0,180,111, 10,168,175,111, 10,232,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,180,111, 10, -195, 0, 0, 0, 1, 0, 0, 0,216,180,111, 10, 72,180,111, 10,168,175,111, 10, 40,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,216,180,111, 10,195, 0, 0, 0, 1, 0, 0, 0, 32,181,111, 10,144,180,111, 10,232,175,111, 10, - 40,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,181,111, 10,195, 0, 0, 0, 1, 0, 0, 0, -104,181,111, 10,216,180,111, 10,104,173,111, 10,104,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -104,181,111, 10,195, 0, 0, 0, 1, 0, 0, 0,176,181,111, 10, 32,181,111, 10,104,176,111, 10,168,176,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176,181,111, 10,195, 0, 0, 0, 1, 0, 0, 0,248,181,111, 10,104,181,111, 10, - 40,174,111, 10,168,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,181,111, 10,195, 0, 0, 0, - 1, 0, 0, 0, 64,182,111, 10,176,181,111, 10,232,174,111, 10,168,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 64,182,111, 10,195, 0, 0, 0, 1, 0, 0, 0,136,182,111, 10,248,181,111, 10, 40,176,111, 10,104,176,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136,182,111, 10,195, 0, 0, 0, 1, 0, 0, 0,208,182,111, 10, - 64,182,111, 10,232,175,111, 10,168,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,182,111, 10, -195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,182,111, 10,104,173,111, 10,168,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 96, 0, 0, 0, 24,183,111, 10,197, 0, 0, 0, 1, 0, 0, 0,248,185,111, 10, 0, 0, 0, 0,104,174,111, 10, -168,173,111, 10,232,173,111, 10,168,174,111, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, - 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,168, 70,112, 10,168, 70,112, 10,168,183,111, 10, -208,184,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,183,111, 10, -198, 0, 0, 0, 1, 0, 0, 0,208,184,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,208,184,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,183,111, 10, 0, 0, 0, 0, - 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0, -129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,248,185,111, 10,197, 0, 0, 0, 1, 0, 0, 0, -168,196,111, 10, 24,183,111, 10,168,176,111, 10,232,174,111, 10, 40,175,111, 10, 40,174,111, 10, 0, 0, 0, 0, 21, 4, 0, 0, -254, 4, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 15, 15,234, 0, 64, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -216,188,111, 10,128,195,111, 10,136,186,111, 10,176,187,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,136,186,111, 10,198, 0, 0, 0, 1, 0, 0, 0,176,187,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0,192,116, 68, 0, 0, 0, 0, 0, 0,208, 65, 0,128,190, 67, 0,192, 25, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,234, 0, 26, 0,234, 0, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176,187,111, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,136,186,111, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, 18, 0, 0, 0, 37, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,234, 0, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0, -254, 4, 0, 0, 26, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 38, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, -216,188,111, 10,174, 0, 0, 0, 1, 0, 0, 0,128,195,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,184,189,111, 10,198, 0, 0, 0, 1, 0, 0, 0,224,190,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,203, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 88, 6, 26, 0, 88, 6, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224,190,111, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,184,189,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 6, 0, 0, 26, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,111, 10, 68, 65, 84, 65, 72, 3, 0, 0, - 8,192,111, 10,158, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87,213,108, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, - 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87,213,108, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, 91,138, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, - 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87,213,108, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,195,111, 10, -159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216,188,111, 10,184,189,111, 10,224,190,111, 10, 1, 0, 0, 0, 51, 51, 51, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 96, 0, 0, 0,168,196,111, 10,197, 0, 0, 0, 1, 0, 0, 0,120,230,111, 10,248,185,111, 10,232,174,111, 10, -104,175,111, 10,168,174,111, 10, 40,175,111, 10, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0, 65, 0, 0, 0,186, 2, 0, 0, - 4, 4,234, 0,122, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,216,111, 10, 80,229,111, 10, 56,197,111, 10, - 96,198,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,197,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 96,198,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 55, 0, 0,106, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, - 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,234, 0, 31, 0,234, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0,156, 2, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,234, 0, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 96,198,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56,197,111, 10, 0, 0, 0, 0, - 0, 0,105, 67, 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 88, 67, 0,192, 22,196, 0, 0, 0, 0,217, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 90, 2, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -216, 0, 0, 0, 0, 0, 0, 0, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,234, 0, 91, 2,217, 0, 91, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0, 65, 0, 0, 0,155, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,199,111, 10, 88,215,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,136,199,111, 10,196, 0, 0, 0, 1, 0, 0, 0, -248,200,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101, -120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101, -120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,216, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,248,200,111, 10,196, 0, 0, 0, 1, 0, 0, 0,104,202,111, 10,136,199,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,135,255,216, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,104,202,111, 10, -196, 0, 0, 0, 1, 0, 0, 0,216,203,111, 10,248,200,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,216, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216,203,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 72,205,111, 10, -104,202,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,216, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 72,205,111, 10,196, 0, 0, 0, 1, 0, 0, 0,184,206,111, 10,216,203,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 58,254,216, 0, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,184,206,111, 10,196, 0, 0, 0, - 1, 0, 0, 0, 40,208,111, 10, 72,205,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, - 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, - 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,216, 0,102, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40,208,111, 10,196, 0, 0, 0, 1, 0, 0, 0,152,209,111, 10,184,206,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,253,216, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -152,209,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 8,211,111, 10, 40,208,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102, -111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,253, -216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8,211,111, 10,196, 0, 0, 0, 1, 0, 0, 0, -120,212,111, 10,152,209,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112, -114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112, -114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243,252,216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,120,212,111, 10,196, 0, 0, 0, 1, 0, 0, 0,232,213,111, 10, 8,211,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,219,252,216, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,232,213,111, 10, -196, 0, 0, 0, 1, 0, 0, 0, 88,215,111, 10,120,212,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109, -112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,216, 0, 0, 0, - 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 88,215,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -232,213,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,252,216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -224, 0, 0, 0,200,216,111, 10,164, 0, 0, 0, 1, 0, 0, 0,120,222,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,217,111, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0,219,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0,242, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,128,241, 67, - 0, 0,208, 65, 0,128,241, 67, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,228, 1, 27, 0,228, 1, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 5, 0, 0,128, 7, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 1, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 0,219,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 40,220,111, 10,216,217,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 40,220,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 80,221,111, 10, - 0,219,111, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, - 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80,221,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,220,111, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, - 18, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,227, 1, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, - 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 8, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,224, 0, 0, 0,120,222,111, 10,165, 0, 0, 0, 1, 0, 0, 0, 80,229,111, 10,200,216,111, 10,216,217,111, 10, - 80,221,111, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,223,111, 10, -198, 0, 0, 0, 1, 0, 0, 0,176,224,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,176,224,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,223,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216,225,111, 10, 68, 65, 84, 65, 72, 3, 0, 0,216,225,111, 10,158, 0, 0, 0, 1, 0, 0, 0, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, -237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80,229,111, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -120,222,111, 10,136,223,111, 10,176,224,111, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,230,111, 10, -197, 0, 0, 0, 1, 0, 0, 0,208, 7,112, 10,168,196,111, 10,104,176,111, 10, 40,176,111, 10,232,175,111, 10,168,176,111, 10, - 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 1, 1, 19, 2, 20, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88,250,111, 10,240, 6,112, 10, 8,231,111, 10,184,245,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,231,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,232,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 4, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 19, 2, 26, 0, 19, 2, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 2, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,232,111, 10, -198, 0, 0, 0, 1, 0, 0, 0, 88,233,111, 10, 8,231,111, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0,250, 0, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 88,233,111, 10,198, 0, 0, 0, 1, 0, 0, 0,128,234,111, 10, 48,232,111, 10, 0, 0, 0, 0, - 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,234,111, 10,198, 0, 0, 0, 1, 0, 0, 0, -184,245,111, 10, 88,233,111, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, - 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, -130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, - 19, 4, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168,235,111, 10, 72,244,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -168,235,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 24,237,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110, -115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,254, -163, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24,237,111, 10,196, 0, 0, 0, 1, 0, 0, 0, -136,238,111, 10,168,235,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236,253,163, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,136,238,111, 10,196, 0, 0, 0, 1, 0, 0, 0,248,239,111, 10, 24,237,111, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,112,114,111,112,101,114,116,105,101,115, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,112,114,111,112,101,114,116,105,101,115, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,153,252,163, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248,239,111, 10, -196, 0, 0, 0, 1, 0, 0, 0,104,241,111, 10,136,238,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129,252,163, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,104,241,111, 10,196, 0, 0, 0, 1, 0, 0, 0,216,242,111, 10, -248,239,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, - 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, - 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73,109, 97,103,101, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,252,163, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,216,242,111, 10,196, 0, 0, 0, 1, 0, 0, 0, 72,244,111, 10,104,241,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 81,252,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 72,244,111, 10,196, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,216,242,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,116,101,109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,163, 0, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,245,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,234,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 2,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,246,111, 10, 68, 65, 84, 65, 72, 3, 0, 0,224,246,111, 10,158, 0, 0, 0, - 1, 0, 0, 0, 37,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249,173,116, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, - 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, - 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, - 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, - 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, - 0, 0,128, 63, 4, 6,158, 63,214, 78,155,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,203,232,152, 63,180,164, 28, 63, -149, 84, 28, 63, 1,127,159,188,123, 18, 91, 64, 8,108,228,190, 50,247,227,190,222,212, 27,191,168, 86,184,191,216, 49, 49, 65, -152, 9, 52, 65, 80, 25,195, 62,218,249,206, 62, 0,237,196,187, 0, 0, 96,179,234, 2,170,189,191, 98,167, 61, 1,208,111, 62, - 0, 0,224, 49,254,120, 21,194,182, 5, 2, 66, 70,136,213,193,239,214,159,192, 5, 39, 19, 66, 15,174,255,193,217,101,210, 65, -219, 40,160, 64,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, - 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, - 0, 0,128, 63, 4, 6,158, 63,214, 78,155,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,203,232,152, 63,180,164, 28, 63, -149, 84, 28, 63, 1,127,159,188,123, 18, 91, 64, 8,108,228,190, 50,247,227,190,222,212, 27,191,168, 86,184,191,216, 49, 49, 65, -152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 2, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, - 0, 0, 0, 0,223, 34, 9, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,250,111, 10,159, 0, 0, 0, 1, 0, 0, 0, -208,253,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -128,251,111, 10,198, 0, 0, 0, 1, 0, 0, 0,168,252,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,192, 59, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,238, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,239, 2, 26, 0,239, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,252,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,251,111, 10, - 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68, 40, 57, 61,194,146,211, 11, 68,174,122,214, 66, 82, 97,202, 67, -222, 2, 0, 0,239, 2, 0, 0, 18, 0, 0, 0,121, 1, 0, 0, 0, 0, 0, 0,221, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,221, 2, 0, 0, 18, 0, 0, 0,121, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, -205,204, 76, 62, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,239, 2,122, 1,222, 2,104, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0,239, 5, 0, 0, 26, 0, 0, 0, -147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 2,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0,208,253,111, 10,175, 0, 0, 0, - 1, 0, 0, 0,144, 3,112, 10, 88,250,111, 10,128,251,111, 10,168,252,111, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,242,199, 78, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -240,254,111, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 0,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, - 0, 0,216, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0, 0,224,189, 68, 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 0,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 64, 1,112, 10,240,254,111, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 1,112, 10,198, 0, 0, 0, - 1, 0, 0, 0,104, 2,112, 10, 24, 0,112, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, - 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,104, 2,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 1,112, 10, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0,162, 3, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, - 18, 0, 0, 0,162, 3, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,144, 3,112, 10,165, 0, 0, 0, 1, 0, 0, 0,240, 6,112, 10, -208,253,111, 10,240,254,111, 10,104, 2,112, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,160, 4,112, 10,198, 0, 0, 0, 1, 0, 0, 0,200, 5,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 5,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -160, 4,112, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, - 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, - 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, -127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,240, 6,112, 10, -174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144, 3,112, 10,160, 4,112, 10,200, 5,112, 10, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, - 96, 0, 0, 0,208, 7,112, 10,197, 0, 0, 0, 1, 0, 0, 0, 24, 31,112, 10,120,230,111, 10,168,175,111, 10,104,174,111, 10, -104,175,111, 10,232,175,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 16, 16, 20, 4, -166, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 10,112, 10, 56, 30,112, 10, 96, 8,112, 10,136, 9,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96, 8,112, 10,198, 0, 0, 0, - 1, 0, 0, 0,136, 9,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0,128,130, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, - 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0, 20, 4, 26, 0, 20, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 4, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,136, 9,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 8,112, 10, 0, 0, 32,193, 0, 0, 0, 68, - 0, 0, 32,193, 0, 0, 0, 68,110,142,241,195, 55,199,120, 68,240, 80,128,193,136, 2, 4, 68, 3, 4, 0, 0, 20, 4, 0, 0, - 18, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, - 18, 0, 0, 0,139, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, - 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 20, 4,140, 1, 3, 4,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0,176, 10,112, 10,175, 0, 0, 0, 1, 0, 0, 0,112, 16,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 61,181, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 11,112, 10,198, 0, 0, 0, - 1, 0, 0, 0,248, 12,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, - 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,248, 12,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 14,112, 10,208, 11,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32, 14,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 72, 15,112, 10, -248, 12,112, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, - 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72, 15,112, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32, 14,112, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, - 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, - 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,224, 0, 0, 0,112, 16,112, 10,165, 0, 0, 0, 1, 0, 0, 0,192, 26,112, 10,176, 10,112, 10,208, 11,112, 10, - 72, 15,112, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 17,112, 10, -198, 0, 0, 0, 1, 0, 0, 0,168, 18,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,232, 4, 26, 0,232, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,232, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,168, 18,112, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 19,112, 10,128, 17,112, 10, 0, 0, 0, 0, - 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 19,112, 10,198, 0, 0, 0, 1, 0, 0, 0, -248, 20,112, 10,168, 18,112, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, - 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, -120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0, -128, 7, 0, 0,251, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -248, 20,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 22,112, 10,208, 19,112, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32, 22,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248, 20,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 23,112, 10, 68, 65, 84, 65, 72, 3, 0, 0, 72, 23,112, 10,158, 0, 0, 0, - 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 7, 36, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, - 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, - 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, - 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, - 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,128, 32,182, 69,129, 32,190,250,186,154, 61,170,205,178, 62, - 0, 64, 1, 53,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67, -151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, - 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, - 0, 0, 0, 0,218,210,190, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,192, 26,112, 10,159, 0, 0, 0, 1, 0, 0, 0, - 56, 30,112, 10,112, 16,112, 10,128, 17,112, 10, 32, 22,112, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -232, 27,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 29,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16, 29,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232, 27,112, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 56, 30,112, 10,174, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,192, 26,112, 10,232, 27,112, 10, 16, 29,112, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, - 24, 31,112, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208, 7,112, 10,104,173,111, 10,168,175,111, 10, 40,176,111, 10, -104,176,111, 10, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 6, 6, 0, 2, 20, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 35,112, 10,200, 69,112, 10,168, 31,112, 10,248, 33,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 31,112, 10,198, 0, 0, 0, 1, 0, 0, 0, -208, 32,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, - 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 0, 2, - 26, 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -208, 32,112, 10,198, 0, 0, 0, 1, 0, 0, 0,248, 33,112, 10,168, 31,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248, 33,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208, 32,112, 10, - 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0,191, 0, 0,192, 63, 0, 0, 64, 60, 0, 0,125, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, 26, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 12, 0, 0, 32, 35,112, 10,169, 0, 0, 0, - 1, 0, 0, 0, 64, 50,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240, 47,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 49,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 49,112, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,240, 47,112, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,144, 82, 89,194, - 41,149, 13, 68,176,122,214, 66, 82, 97,202, 67,239, 2, 0, 0, 0, 3, 0, 0, 18, 0, 0, 0,121, 1, 0, 0, 0, 0, 0, 0, -238, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,238, 2, 0, 0, 18, 0, 0, 0,121, 1, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, - 0, 0, 0, 3,122, 1,239, 2,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 2, 0, 0, 26, 0, 0, 0,147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -244, 0, 0, 0, 64, 50,112, 10,175, 0, 0, 0, 1, 0, 0, 0, 0, 56,112, 10, 32, 35,112, 10,240, 47,112, 10, 24, 49,112, 10, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 24,227, 78, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96, 51,112, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 52,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136, 52,112, 10,198, 0, 0, 0, - 1, 0, 0, 0,176, 53,112, 10, 96, 51,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,176, 53,112, 10,198, 0, 0, 0, 1, 0, 0, 0,216, 54,112, 10,136, 52,112, 10, 0, 0,112,196, 0, 0,112, 68, - 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216, 54,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -176, 53,112, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, - 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, -112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 0, 56,112, 10, -165, 0, 0, 0, 1, 0, 0, 0, 80, 66,112, 10, 64, 50,112, 10, 96, 51,112, 10,216, 54,112, 10, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16, 57,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 58,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,157, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,232, 4, 26, 0,232, 4, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0, -225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56, 58,112, 10, -198, 0, 0, 0, 1, 0, 0, 0, 96, 59,112, 10, 16, 57,112, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 96, 59,112, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 60,112, 10, 56, 58,112, 10, 0, 0, 0, 0, - 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0,251, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136, 60,112, 10,198, 0, 0, 0, 1, 0, 0, 0, -176, 61,112, 10, 96, 59,112, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, - 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, -122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, -128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -176, 61,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 60,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 62,112, 10, 68, 65, 84, 65, 72, 3, 0, 0,216, 62,112, 10,158, 0, 0, 0, 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 7, 36, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 68,239,209, 62, 51,177,205,190, -184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, - 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63, -176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, - 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,180,157,229, 62,169,203,131,191, -222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62,147,180,109,188,102,208, 18, 64, -129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63, -224,246, 70,188, 0,128, 32,182, 69,129, 32,190,250,186,154, 61,170,205,178, 62, 0, 64, 1, 53,215,104, 25,196,135,132,135, 67, - 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190, -184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, - 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,180,157,229, 62,169,203,131,191, -222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62,147,180,109,188,102,208, 18, 64, -129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190, -237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,218,210,190, 58, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 80, 66,112, 10,159, 0, 0, 0, 1, 0, 0, 0,200, 69,112, 10, 0, 56,112, 10, 16, 57,112, 10, -176, 61,112, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, - 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 67,112, 10,198, 0, 0, 0, 1, 0, 0, 0, -160, 68,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, - 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, - 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -160, 68,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120, 67,112, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, - 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, - 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,200, 69,112, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 66,112, 10, -120, 67,112, 10,160, 68,112, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 8, 71,112, 10,193, 0, 0, 0, 1, 0, 0, 0, -120,184,112, 10,176,172,111, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 71,112, 10,128, 74,112, 10,192, 74,112, 10, -136, 79,112, 10,208, 79,112, 10,224,136,112, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,251, 69, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 71,112, 10,194, 0, 0, 0, 1, 0, 0, 0, - 0, 72,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0, 72,112, 10, -194, 0, 0, 0, 1, 0, 0, 0, 64, 72,112, 10,192, 71,112, 10, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, - 20, 0, 0, 0, 64, 72,112, 10,194, 0, 0, 0, 1, 0, 0, 0,128, 72,112, 10, 0, 72,112, 10, 0, 0, 0, 0,254, 4,214, 2, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,128, 72,112, 10,194, 0, 0, 0, 1, 0, 0, 0,192, 72,112, 10, 64, 72,112, 10, - 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 72,112, 10,194, 0, 0, 0, 1, 0, 0, 0, - 0, 73,112, 10,128, 72,112, 10, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0, 73,112, 10, -194, 0, 0, 0, 1, 0, 0, 0, 64, 73,112, 10,192, 72,112, 10, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, - 20, 0, 0, 0, 64, 73,112, 10,194, 0, 0, 0, 1, 0, 0, 0,128, 73,112, 10, 0, 73,112, 10, 0, 0, 0, 0, 24, 4, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,128, 73,112, 10,194, 0, 0, 0, 1, 0, 0, 0,192, 73,112, 10, 64, 73,112, 10, - 0, 0, 0, 0, 24, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 73,112, 10,194, 0, 0, 0, 1, 0, 0, 0, - 0, 74,112, 10,128, 73,112, 10, 0, 0, 0, 0, 24, 4, 48, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0, 74,112, 10, -194, 0, 0, 0, 1, 0, 0, 0, 64, 74,112, 10,192, 73,112, 10, 0, 0, 0, 0,254, 4, 48, 2, 0, 0, 0, 0, 68, 65, 84, 65, - 20, 0, 0, 0, 64, 74,112, 10,194, 0, 0, 0, 1, 0, 0, 0,128, 74,112, 10, 0, 74,112, 10, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,128, 74,112, 10,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 74,112, 10, - 0, 0, 0, 0, 24, 4, 68, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192, 74,112, 10,195, 0, 0, 0, 1, 0, 0, 0, - 8, 75,112, 10, 0, 0, 0, 0, 0, 72,112, 10, 64, 72,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 8, 75,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 80, 75,112, 10,192, 74,112, 10, 0, 72,112, 10,192, 72,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80, 75,112, 10,195, 0, 0, 0, 1, 0, 0, 0,152, 75,112, 10, 8, 75,112, 10, - 64, 72,112, 10, 0, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152, 75,112, 10,195, 0, 0, 0, - 1, 0, 0, 0,224, 75,112, 10, 80, 75,112, 10,192, 72,112, 10, 0, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,224, 75,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 40, 76,112, 10,152, 75,112, 10,192, 71,112, 10, 64, 73,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40, 76,112, 10,195, 0, 0, 0, 1, 0, 0, 0,112, 76,112, 10, -224, 75,112, 10,128, 72,112, 10, 64, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 76,112, 10, -195, 0, 0, 0, 1, 0, 0, 0,184, 76,112, 10, 40, 76,112, 10,192, 72,112, 10,128, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,184, 76,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 0, 77,112, 10,112, 76,112, 10, 0, 73,112, 10, -128, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0, 77,112, 10,195, 0, 0, 0, 1, 0, 0, 0, - 72, 77,112, 10,184, 76,112, 10, 64, 73,112, 10,192, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 72, 77,112, 10,195, 0, 0, 0, 1, 0, 0, 0,144, 77,112, 10, 0, 77,112, 10,128, 73,112, 10,192, 73,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 77,112, 10,195, 0, 0, 0, 1, 0, 0, 0,216, 77,112, 10, 72, 77,112, 10, - 0, 73,112, 10, 0, 74,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216, 77,112, 10,195, 0, 0, 0, - 1, 0, 0, 0, 32, 78,112, 10,144, 77,112, 10,128, 72,112, 10, 0, 74,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 32, 78,112, 10,195, 0, 0, 0, 1, 0, 0, 0,104, 78,112, 10,216, 77,112, 10,192, 73,112, 10, 0, 74,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104, 78,112, 10,195, 0, 0, 0, 1, 0, 0, 0,176, 78,112, 10, - 32, 78,112, 10,192, 71,112, 10, 64, 74,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 78,112, 10, -195, 0, 0, 0, 1, 0, 0, 0,248, 78,112, 10,104, 78,112, 10,192, 72,112, 10, 64, 74,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,248, 78,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 64, 79,112, 10,176, 78,112, 10,128, 73,112, 10, -128, 74,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64, 79,112, 10,195, 0, 0, 0, 1, 0, 0, 0, -136, 79,112, 10,248, 78,112, 10, 64, 73,112, 10,128, 74,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -136, 79,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 79,112, 10, 64, 74,112, 10,128, 74,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,208, 79,112, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 82,112, 10, 0, 0, 0, 0, -192, 72,112, 10, 0, 72,112, 10, 64, 72,112, 10, 0, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0, -214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0,192, 9, 94, 10, 24,184,112, 10, 24,184,112, 10, - 96, 80,112, 10,136, 81,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 32, 96,219, 10,152,154,220, 10, 68, 65, 84, 65,248, 0, 0, 0, - 96, 80,112, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 81,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 94, 10,200,200,116, 11,200,200,116, 11, 0, 0, 0, 0, 0, 0, 0, 0,176,184,192, 11,240,112,164, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136, 81,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 80,112, 10, - 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, -112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, -214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,120, 10, 94, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176, 82,112, 10,197, 0, 0, 0, - 1, 0, 0, 0,208,110,112, 10,208, 79,112, 10, 64, 73,112, 10,192, 73,112, 10, 0, 74,112, 10,128, 72,112, 10, 0, 0, 0, 0, - 25, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 47, 2, 0, 0, 4, 4,230, 0, 48, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 6, 94, 10,208,102,112, 10,168,109,112, 10, 64, 83,112, 10,104, 84,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 24,231,222, 10, - 64,208,208, 10, 68, 65, 84, 65,248, 0, 0, 0, 64, 83,112, 10,198, 0, 0, 0, 1, 0, 0, 0,104, 84,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,102, 67, 0, 0, 0, 0, 0, 0,248, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,230, 0, 31, 0,230, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,254, 4, 0, 0, 17, 2, 0, 0, - 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 0, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 9, 94, 10, 32,139,112, 11, 32,139,112, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 88,112,199, 11, 32,116,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104, 84,112, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 64, 83,112, 10, 0, 0, 0, 0, 0, 0,101, 67, 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, -249,255, 84, 67,252, 63, 4,196, 0, 0, 0, 0,213, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, - 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, - 6, 0,230, 0, 17, 2,213, 0, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,139,113, 11, 1, 0, 0, 0, 0, 0, 0, 0, - 25, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, 0, 17, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 7, 94, 10,168,230,184, 11, -184,231,112, 11,144, 85,112, 10, 96,101,112, 10, 48, 17,184, 11,104,119,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,144, 85,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 87,112, 10, 0, 0, 0, 0, 24, 8, 94, 10, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,220,255,212, 0, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0, 87,112, 10,196, 0, 0, 0, - 1, 0, 0, 0,112, 88,112, 10,144, 85,112, 10, 0, 14,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101, -110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101, -110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,212, 0, 61, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,112, 88,112, 10,196, 0, 0, 0, 1, 0, 0, 0,224, 89,112, 10, 0, 87,112, 10, -152, 17,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,253,212, 0,240, 1, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -224, 89,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 80, 91,112, 10,112, 88,112, 10,152, 19,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101, -110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, -212, 0,203, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80, 91,112, 10,196, 0, 0, 0, 1, 0, 0, 0, -192, 92,112, 10,224, 89,112, 10, 48, 23,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108, -105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108, -105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,212, 0, 58, 0, 20, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,192, 92,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 48, 94,112, 10, 80, 91,112, 10, 72, 30,220, 10, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,164,253,212, 0,102, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48, 94,112, 10, -196, 0, 0, 0, 1, 0, 0, 0,160, 95,112, 10,192, 92,112, 10,224, 33,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,253,212, 0,105, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,160, 95,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 16, 97,112, 10, - 48, 94,112, 10,144, 42,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,252,212, 0,168, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 16, 97,112, 10,196, 0, 0, 0, 1, 0, 0, 0,128, 98,112, 10,160, 95,112, 10,144, 44,220, 10, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,243,252,212, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 98,112, 10,196, 0, 0, 0, - 1, 0, 0, 0,240, 99,112, 10, 16, 97,112, 10,144, 46,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, - 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, - 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,238,251,212, 0,237, 0, 20, 0, 0, 0, - 4, 0, 6, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,240, 99,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 96,101,112, 10,128, 98,112, 10, -168, 51,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,252,212, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 96,101,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 99,112, 10, 48, 25,220, 10, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, - 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, -212, 0, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,208,102,112, 10,164, 0, 0, 0, 1, 0, 0, 0, -168,109,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0,128, 43,117, 11,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,224,103,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,105,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,105,112, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,224,103,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0, -108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,106,112, 10, 68, 65, 84, 65, 72, 3, 0, 0, - 48,106,112, 10,158, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, - 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, - 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,109,112, 10, -159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208,102,112, 10,224,103,112, 10, 8,105,112, 10, 1, 0, 0, 0, 51, 51, 51, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 96, 0, 0, 0,208,110,112, 10,197, 0, 0, 0, 1, 0, 0, 0,128,121,112, 10,176, 82,112, 10,192, 71,112, 10, - 64, 74,112, 10,128, 74,112, 10, 64, 73,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, - 15, 15, 24, 4, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,233, 93, 10,176,113,112, 10, 88,120,112, 10, 96,111,112, 10, -136,112,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,187,221, 10, 64,209,222, 10, 68, 65, 84, 65,248, 0, 0, 0, 96,111,112, 10, -198, 0, 0, 0, 1, 0, 0, 0,136,112,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,140, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,131, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 24, 4, 26, 0, 24, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 4, 26, 0, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,234, 93, 10, - 56, 91,117, 11, 56, 91,117, 11, 0, 0, 0, 0, 0, 0, 0, 0,232,255,209, 10,152,122,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,136,112,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,111,112, 10, 0, 0, 64,192, - 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, - 23, 4, 0, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, - 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 24, 4, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 26, 0, 0, 0, 67, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 42, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216,233, 93, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,123,164, 10, -232,126,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,176,113,112, 10,174, 0, 0, 0, 1, 0, 0, 0, - 88,120,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,114,112, 10, -198, 0, 0, 0, 1, 0, 0, 0,184,115,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,203, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 88, 6, 26, 0, 88, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,184,115,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,114,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 26, 0, 0, 0, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,224,116,112, 10, 68, 65, 84, 65, 72, 3, 0, 0,224,116,112, 10,158, 0, 0, 0, 1, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, -161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 91,138, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,120,112, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -176,113,112, 10,144,114,112, 10,184,115,112, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,128,121,112, 10, -197, 0, 0, 0, 1, 0, 0, 0,224,136,112, 10,208,110,112, 10,192, 73,112, 10,128, 73,112, 10, 0, 73,112, 10, 0, 74,112, 10, - 0, 0, 0, 0, 25, 4, 0, 0,254, 4, 0, 0, 49, 2, 0, 0,186, 2, 0, 0, 3, 3,230, 0,138, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88,231, 93, 10, 96,124,112, 10,184,135,112, 10, 16,122,112, 10, 56,123,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, -208,233,221, 10, 56,177,209, 10, 68, 65, 84, 65,248, 0, 0, 0, 16,122,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,123,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,102, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,230, 0, 26, 0,230, 0, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 4, 0, 0,254, 4, 0, 0, -161, 2, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 0, 26, 0, 7, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,232, 93, 10,208,132,164, 10,208,132,164, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0,154, 14, 11, 24,130,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,123,112, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16,122,112, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 86, 67, 0, 0,188,194, 0, 0, 0, 0,213, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,111, 0, 0, 0, - 0, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,212, 0, 0, 0, 18, 0, 0, 0,111, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 0, 0, 2, 0, 3, 3, - 0, 0, 0, 4, 6, 0,230, 0,112, 0,213, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 4, 0, 0,254, 4, 0, 0, 49, 2, 0, 0,160, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,230, 0,112, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,232, 93, 10, - 8,122,184, 11, 8,122,184, 11, 0, 0, 0, 0, 0, 0, 0, 0,128,247,209, 10, 88,132,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 4, 1, 0, 0, 96,124,112, 10,168, 0, 0, 0, 1, 0, 0, 0,224,128,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 45,128, 11,248, 45,128, 11,144,125,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, -144,125,112, 10,221, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,200,125,112, 10, 68, 65, 84, 65,156, 0, 0, 0, -200,125,112, 10,220, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,240,212,114, 10, 19, 0, 0, 0, 1, 0, 1, 0, -240,212,114, 10, 20, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 21, 0, 1, 0, 1, 0, 1, 0,240,212,114, 10, 0, 0, 0, 0, - 1, 0, 1, 0,208,229,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,240,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 16, 31,115, 10, - 0, 0, 0, 0, 1, 0, 1, 0,176,248,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 56, 13,115, 10, 0, 0, 0, 0, 1, 0, 1, 0, -168,244,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 72,226,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,236,114, 10, 0, 0, 0, 0, - 1, 0, 1, 0,160,225,114, 10, 68, 65, 84, 65,248, 0, 0, 0,144,126,112, 10,198, 0, 0, 0, 1, 0, 0, 0,184,127,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, 0, 0, 67, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,195, 0, 26, 0,195, 0, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, - 69, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,127,112, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,126,112, 10, 0, 0, 0, 0, 0, 0,150, 67, 0,192,116,196, 0, 0, 0, 0, - 0, 0, 0, 0,205, 85,150, 67,223,204, 35,196, 26, 85,207,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0,155, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 3, 0, - 2, 0, 0, 4, 6, 0,195, 0,156, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, 95, 2, 0, 0,250, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,224, 0, 0, 0,224,128,112, 10,164, 0, 0, 0, 1, 0, 0, 0,184,135,112, 10, 96,124,112, 10,144,126,112, 10, -184,127,112, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240,129,112, 10, -198, 0, 0, 0, 1, 0, 0, 0, 24,131,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 24,131,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,129,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 64,132,112, 10, 68, 65, 84, 65, 72, 3, 0, 0, 64,132,112, 10,158, 0, 0, 0, 1, 0, 0, 0, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, -237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,135,112, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -224,128,112, 10,240,129,112, 10, 24,131,112, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,224,136,112, 10, -197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,121,112, 10, 64, 74,112, 10,192, 72,112, 10,128, 73,112, 10,128, 74,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 69, 0, 0, 0,186, 2, 0, 0, 1, 1, 24, 4,118, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0,232,234, 93, 10,192,179,112, 10, 56,183,112, 10,112,137,112, 10, 32,175,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, -152,213,220, 10, 56, 2,222, 10, 68, 65, 84, 65,248, 0, 0, 0,112,137,112, 10,198, 0, 0, 0, 1, 0, 0, 0,152,138,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,131, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 4, 26, 0, 24, 4, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, - 69, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4, 26, 0, 9, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,243, 93, 10, 40, 78,192, 11, 40, 78,192, 11, 0, 0, 0, 0, - 0, 0, 0, 0,184,114,164, 10,152,137,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,138,112, 10, -198, 0, 0, 0, 1, 0, 0, 0,224,159,112, 10,112,137,112, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0,128,254,195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,242,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,227, 1, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,227, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,228, 1,143, 0,228, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,215, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,160, 0,228, 1, 10, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,240, 93, 10, -160,187,126, 11, 24, 41,128, 11,192,139,112, 10,112,158,112, 10,224,116,164, 10,192,139,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,192,139,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 48,141,112, 10, 0, 0, 0, 0,152,240, 93, 10, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108, 95,115,104,101,108,102, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108, 95,115,104,101,108,102, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84,111,111,108, 32, 83,104,101,108,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,196,255,143, 0, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,141,112, 10, -196, 0, 0, 0, 1, 0, 0, 0,160,142,112, 10,192,139,112, 10,208, 62,223, 10, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84, -111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,254,143, 0,165, 1, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,160,142,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 16,144,112, 10, - 48,141,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104, -101,100,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104, -101,100,105,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,101,115,104, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,252,143, 0,244, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 16,144,112, 10,196, 0, 0, 0, 1, 0, 0, 0,128,145,112, 10,160,142,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, 95,111,112,116,105,111,110, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,109,101,115,104,101,100,105,116, 95,111,112,116,105,111,110, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77,101,115,104, 32, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,124,252,143, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128,145,112, 10,196, 0, 0, 0, - 1, 0, 0, 0,240,146,112, 10, 16,144,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111, -111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111, -111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226,253,143, 0, 54, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,240,146,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 96,148,112, 10,128,145,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111, -111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111, -111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46,253,143, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 96,148,112, 10,196, 0, 0, 0, 1, 0, 0, 0,208,149,112, 10,240,146,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114,111, -107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45,252, -143, 0,233, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208,149,112, 10,196, 0, 0, 0, 1, 0, 0, 0, - 64,151,112, 10, 96,148,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, - 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, - 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,252,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0, 64,151,112, 10,196, 0, 0, 0, 1, 0, 0, 0,176,152,112, 10,208,149,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 80,114,111,106,101, 99,116, 32, 80, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,223,252,143, 0,155, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,152,112, 10, -196, 0, 0, 0, 1, 0, 0, 0, 32,154,112, 10, 64,151,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182,252,143, 0,149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 32,154,112, 10,196, 0, 0, 0, 1, 0, 0, 0,144,155,112, 10, -176,152,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,118,101,114,116, -101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,118,101,114,116, -101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246,252,143, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,144,155,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 0,157,112, 10, 32,154,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 91,254,143, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,157,112, 10,196, 0, 0, 0, - 1, 0, 0, 0,112,158,112, 10,144,155,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111, -111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111, -111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,101,105,103,104,116, 32, 84,111,111,108,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,255,143, 0,124, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,112,158,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,157,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97, -105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97, -105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,252,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -224,159,112, 10,198, 0, 0, 0, 1, 0, 0, 0,120,162,112, 10,152,138,112, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, - 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 95, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 11, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184,241, 93, 10, 32,107,184, 11, 32,107,184, 11, 8,161,112, 10, 8,161,112, 10, 48,121,164, 10,232,141,164, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8,161,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64,242, 93, 10, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, 0,116, 32, 77,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -120,162,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,175,112, 10,224,159,112, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,143,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,102,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, -171, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, -171, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,172, 3,163, 0,154, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 4, 0, 0, 23, 4, 0, 0, 95, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 40,236, 93, 10, 0, 0, 0, 0, 0, 0, 0, 0,160,163,112, 10,176,173,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,160,163,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 16,165,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,254,163, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 16,165,112, 10,196, 0, 0, 0, 1, 0, 0, 0,128,166,112, 10,160,163,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97, -115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,251, -163, 0, 58, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128,166,112, 10,196, 0, 0, 0, 1, 0, 0, 0, -240,167,112, 10, 16,165,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, - 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, - 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235,252,163, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,240,167,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 96,169,112, 10,128,166,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,208,251,163, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,169,112, 10, -196, 0, 0, 0, 1, 0, 0, 0,208,170,112, 10,240,167,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117, -110,100, 32, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,251,163, 0, 0, 0, - 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208,170,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 64,172,112, 10, - 96,169,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95, -111,114,105,101,110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95, -111,114,105,101,110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, 97,116,105,111, -110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,251,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 64,172,112, 10,196, 0, 0, 0, 1, 0, 0, 0,176,173,112, 10,208,170,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,109,101,115,104,100,105,115,112,108, 97,121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,109,101,115,104,100,105,115,112,108, 97,121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77,101,115,104, 32, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23,252,163, 0,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,173,112, 10,196, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 64,172,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,116,101,109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,163, 0, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,175,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,162,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0, 23, 4, 0, 0, 95, 0, 0, 0, -186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 3, 92, 2, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,235, 93, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40,162,164, 10,176,161,164, 10, 0, 0, 0, 0, 72,176,112, 10, 68, 65, 84, 65, 72, 3, 0, 0, 72,176,112, 10,158, 0, 0, 0, - 1, 0, 0, 0,255,255,139, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235,211,205, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, - 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, - 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, - 0, 0,128, 63,177,157,229, 62, 44, 97, 37,191, 48,180, 81,191,184,158, 81,191,115, 90,127, 63,218,109,159, 62, 26, 63,185, 62, - 35, 44,185, 62,143,180,109,188,159, 57,184, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65, -214,211,111, 65,159,240,191, 62, 99,116, 85, 63, 32,181, 70,188, 0, 0, 80,179,241,212,127,190,115,160,246, 61,242,125, 14, 63, - 0, 0, 48,179, 67,108,117,194,184,204,216, 65,105,156, 5,194,213,247,159,192,235, 62,114, 66, 60,254,213,193,158,225, 3, 66, - 56, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63,177,157,229, 62, 44, 97, 37,191, 48,180, 81,191,184,158, 81,191,115, 90,127, 63,218,109,159, 62, 26, 63,185, 62, - 35, 44,185, 62,143,180,109,188,159, 57,184, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65, -214,211,111, 65,239, 39, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 39, 20, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 39, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, - 0, 0, 0, 0,174,243, 6, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, - 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,192,179,112, 10,159, 0, 0, 0, 1, 0, 0, 0, - 56,183,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -232,180,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 16,182,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,182,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,180,112, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 56,183,112, 10,174, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,192,179,112, 10,232,180,112, 10, 16,182,112, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, -120,184,112, 10,193, 0, 0, 0, 1, 0, 0, 0,168,107,113, 10, 8, 71,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97, -109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48,185,112, 10,112,188,112, 10,176,188,112, 10, 80,194,112, 10,152,194,112, 10,128, 79,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, -240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 48,185,112, 10,194, 0, 0, 0, 1, 0, 0, 0,112,185,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,112,185,112, 10,194, 0, 0, 0, 1, 0, 0, 0,176,185,112, 10, 48,185,112, 10, 0, 0, 0, 0, - 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176,185,112, 10,194, 0, 0, 0, 1, 0, 0, 0,240,185,112, 10, -112,185,112, 10, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240,185,112, 10,194, 0, 0, 0, - 1, 0, 0, 0, 48,186,112, 10,176,185,112, 10, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 48,186,112, 10,194, 0, 0, 0, 1, 0, 0, 0,112,186,112, 10,240,185,112, 10, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,112,186,112, 10,194, 0, 0, 0, 1, 0, 0, 0,176,186,112, 10, 48,186,112, 10, 0, 0, 0, 0, -254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176,186,112, 10,194, 0, 0, 0, 1, 0, 0, 0,240,186,112, 10, -112,186,112, 10, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240,186,112, 10,194, 0, 0, 0, - 1, 0, 0, 0, 48,187,112, 10,176,186,112, 10, 0, 0, 0, 0, 20, 4, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 48,187,112, 10,194, 0, 0, 0, 1, 0, 0, 0,112,187,112, 10,240,186,112, 10, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,112,187,112, 10,194, 0, 0, 0, 1, 0, 0, 0,176,187,112, 10, 48,187,112, 10, 0, 0, 0, 0, -254, 4, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176,187,112, 10,194, 0, 0, 0, 1, 0, 0, 0,240,187,112, 10, -112,187,112, 10, 0, 0, 0, 0,124, 3, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240,187,112, 10,194, 0, 0, 0, - 1, 0, 0, 0, 48,188,112, 10,176,187,112, 10, 0, 0, 0, 0,124, 3,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 48,188,112, 10,194, 0, 0, 0, 1, 0, 0, 0,112,188,112, 10,240,187,112, 10, 0, 0, 0, 0,212, 0, 20, 1, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0,112,188,112, 10,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,188,112, 10, 0, 0, 0, 0, -212, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176,188,112, 10,195, 0, 0, 0, 1, 0, 0, 0,248,188,112, 10, - 0, 0, 0, 0,112,185,112, 10,176,185,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,188,112, 10, -195, 0, 0, 0, 1, 0, 0, 0, 64,189,112, 10,176,188,112, 10,112,185,112, 10, 48,186,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 64,189,112, 10,195, 0, 0, 0, 1, 0, 0, 0,136,189,112, 10,248,188,112, 10,176,185,112, 10, -112,186,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136,189,112, 10,195, 0, 0, 0, 1, 0, 0, 0, -208,189,112, 10, 64,189,112, 10, 48,186,112, 10,112,186,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -208,189,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 24,190,112, 10,136,189,112, 10, 48,186,112, 10,176,186,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,190,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 96,190,112, 10,208,189,112, 10, -176,186,112, 10,240,186,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,190,112, 10,195, 0, 0, 0, - 1, 0, 0, 0,168,190,112, 10, 24,190,112, 10,240,185,112, 10, 48,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,168,190,112, 10,195, 0, 0, 0, 1, 0, 0, 0,240,190,112, 10, 96,190,112, 10,240,186,112, 10, 48,187,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,190,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 56,191,112, 10, -168,190,112, 10, 48,185,112, 10,176,186,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,191,112, 10, -195, 0, 0, 0, 1, 0, 0, 0,128,191,112, 10,240,190,112, 10, 48,185,112, 10, 48,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,128,191,112, 10,195, 0, 0, 0, 1, 0, 0, 0,200,191,112, 10, 56,191,112, 10,112,186,112, 10, -112,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200,191,112, 10,195, 0, 0, 0, 1, 0, 0, 0, - 16,192,112, 10,128,191,112, 10,240,185,112, 10,112,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 16,192,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 88,192,112, 10,200,191,112, 10,240,186,112, 10,112,187,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,192,112, 10,195, 0, 0, 0, 1, 0, 0, 0,160,192,112, 10, 16,192,112, 10, -176,187,112, 10,240,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,192,112, 10,195, 0, 0, 0, - 1, 0, 0, 0,232,192,112, 10, 88,192,112, 10,112,186,112, 10,240,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,232,192,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 48,193,112, 10,160,192,112, 10,112,187,112, 10,176,187,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,193,112, 10,195, 0, 0, 0, 1, 0, 0, 0,120,193,112, 10, -232,192,112, 10,176,186,112, 10, 48,188,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,193,112, 10, -195, 0, 0, 0, 1, 0, 0, 0,192,193,112, 10, 48,193,112, 10,176,187,112, 10, 48,188,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,192,193,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 8,194,112, 10,120,193,112, 10, 48,186,112, 10, -112,188,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,194,112, 10,195, 0, 0, 0, 1, 0, 0, 0, - 80,194,112, 10,192,193,112, 10,240,187,112, 10,112,188,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 80,194,112, 10,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,194,112, 10, 48,188,112, 10,112,188,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,152,194,112, 10,197, 0, 0, 0, 1, 0, 0, 0,120,197,112, 10, 0, 0, 0, 0, - 48,186,112, 10,112,185,112, 10,176,185,112, 10,112,186,112, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0, -214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 72,107,113, 10, 72,107,113, 10, - 40,195,112, 10, 80,196,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 40,195,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 80,196,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80,196,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,195,112, 10, - 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, -112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, -214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,197,112, 10,197, 0, 0, 0, - 1, 0, 0, 0, 72,231,112, 10,152,194,112, 10, 48,187,112, 10,240,186,112, 10,112,187,112, 10,240,185,112, 10, 0, 0, 0, 0, - 21, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 4, 4,234, 0, 20, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152,217,112, 10, 32,230,112, 10, 8,198,112, 10, 48,199,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,198,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,199,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, 0, 0,106, 67, 0, 0, 0, 0, 0, 0,248, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,234, 0, 31, 0,234, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0,245, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,199,112, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 8,198,112, 10, 0, 0, 0, 0, 0, 0,105, 67, 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, -254,255, 88, 67,254,255,116,195, 0, 0, 0, 0,217, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, - 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, - 6, 0,234, 0,245, 0,217, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88,200,112, 10, 40,216,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 88,200,112, 10,196, 0, 0, 0, 1, 0, 0, 0,200,201,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,220,255,216, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,200,201,112, 10,196, 0, 0, 0, - 1, 0, 0, 0, 56,203,112, 10, 88,200,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101, -110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101, -110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,216, 0, 61, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 56,203,112, 10,196, 0, 0, 0, 1, 0, 0, 0,168,204,112, 10,200,201,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -168,204,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 24,206,112, 10, 56,203,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101, -110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, -216, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24,206,112, 10,196, 0, 0, 0, 1, 0, 0, 0, -136,207,112, 10,168,204,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108, -105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108, -105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,216, 0, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,136,207,112, 10,196, 0, 0, 0, 1, 0, 0, 0,248,208,112, 10, 24,206,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,164,253,216, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248,208,112, 10, -196, 0, 0, 0, 1, 0, 0, 0,104,210,112, 10,136,207,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,253,216, 0,105, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,104,210,112, 10,196, 0, 0, 0, 1, 0, 0, 0,216,211,112, 10, -248,208,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,253,216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,216,211,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 72,213,112, 10,104,210,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,243,252,216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 72,213,112, 10,196, 0, 0, 0, - 1, 0, 0, 0,184,214,112, 10,216,211,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, - 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, - 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,252,216, 0, 0, 0, 20, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,184,214,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 40,216,112, 10, 72,213,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,216, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 40,216,112, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,214,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,252, -216, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,152,217,112, 10,164, 0, 0, 0, 1, 0, 0, 0, - 72,223,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,168,218,112, 10,198, 0, 0, 0, 1, 0, 0, 0,208,219,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0,242, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, 1, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,128,241, 67, 0, 0,208, 65, 0,128,241, 67, 0, 0,208, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,228, 1, 27, 0,228, 1, 27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208,219,112, 10,198, 0, 0, 0, 1, 0, 0, 0, -248,220,112, 10,168,218,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, -128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -248,220,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,222,112, 10,208,219,112, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,222,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248,220,112, 10, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, 18, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0,227, 1, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, - 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0,112, 0, 0, 0, -235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 72,223,112, 10,165, 0, 0, 0, - 1, 0, 0, 0, 32,230,112, 10,152,217,112, 10,168,218,112, 10, 32,222,112, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,224,112, 10,198, 0, 0, 0, 1, 0, 0, 0,128,225,112, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,225,112, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 88,224,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,226,112, 10, 68, 65, 84, 65, - 72, 3, 0, 0,168,226,112, 10,158, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, - 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 32,230,112, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72,223,112, 10, 88,224,112, 10,128,225,112, 10, 1, 0, 0, 0, - 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72,231,112, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 20,113, 10,120,197,112, 10, - 48,185,112, 10,176,186,112, 10,240,186,112, 10, 48,187,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, - 19, 1, 0, 0, 17, 17, 20, 4, 20, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,236,112, 10, 64, 19,113, 10, -216,231,112, 10,152,235,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -216,231,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,233,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,233,112, 10,198, 0, 0, 0, 1, 0, 0, 0,152,235,112, 10,216,231,112, 10, - 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,122,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,122,195, 0, 0, 0, 0, -203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,250, 0,203, 0,250, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,250, 0, 0, 0, 4, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,234,112, 10, 40,234,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40,234,112, 10,196, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111, -112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111, -112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,101,114,116,105,101,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,203, 0, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,235,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,233,112, 10, - 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67, 4, 0, 39,195, 0,224,180, 68, 1, 0,224,194, 0, 0,176, 67, - 39, 3, 0, 0, 56, 3, 0, 0, 18, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 38, 3, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 38, 3, 0, 0, 18, 0, 0, 0,249, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, - 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 56, 3,250, 0, 39, 3,232, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 3,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 52, 0, 0, 0,192,236,112, 10,176, 0, 0, 0, - 1, 0, 0, 0,152,240,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 32,237,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,238,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,238,112, 10,198, 0, 0, 0, 1, 0, 0, 0,112,239,112, 10, 32,237,112, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, -147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112,239,112, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 72,238,112, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0,128,191, - 0, 0, 0, 64, 0, 0,116,190, 0,128,158, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,122, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 2, 0, 0, 26, 0, 0, 0,147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -160, 12, 0, 0,152,240,112, 10,169, 0, 0, 0, 1, 0, 0, 0,184,255,112, 10,192,236,112, 10, 32,237,112, 10,112,239,112, 10, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,253,112, 10,198, 0, 0, 0, - 1, 0, 0, 0,144,254,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, - 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,144,254,112, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,253,112, 10, 0, 0, 32,193, 0, 0, 0, 68, - 0, 0, 32,193, 0, 0, 0, 68,144, 82, 89,194, 41,149, 13, 68,176,122,214, 66, 82, 97,202, 67,239, 2, 0, 0, 0, 3, 0, 0, - 18, 0, 0, 0,121, 1, 0, 0, 0, 0, 0, 0,238, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,238, 2, 0, 0, - 18, 0, 0, 0,121, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, - 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 3,122, 1,239, 2,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 26, 0, 0, 0,147, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0,184,255,112, 10,175, 0, 0, 0, 1, 0, 0, 0,120, 5,113, 10, -152,240,112, 10,104,253,112, 10,144,254,112, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 24,227, 78, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216, 0,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 2,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, - 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 0, 2,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 40, 3,113, 10,216, 0,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 40, 3,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 80, 4,113, 10, - 0, 2,113, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, - 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 4,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 3,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, - 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, - 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,224, 0, 0, 0,120, 5,113, 10,165, 0, 0, 0, 1, 0, 0, 0,200, 15,113, 10,184,255,112, 10,216, 0,113, 10, - 80, 4,113, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136, 6,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,176, 7,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,232, 4, 26, 0,232, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,232, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,176, 7,113, 10,198, 0, 0, 0, 1, 0, 0, 0,216, 8,113, 10,136, 6,113, 10, 0, 0, 0, 0, - 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216, 8,113, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 10,113, 10,176, 7,113, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, - 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, -120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0, -128, 7, 0, 0,251, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 0, 10,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 40, 11,113, 10,216, 8,113, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 40, 11,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 10,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 12,113, 10, 68, 65, 84, 65, 72, 3, 0, 0, 80, 12,113, 10,158, 0, 0, 0, - 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 7, 36, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, - 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, - 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, - 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, - 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,128, 32,182, 69,129, 32,190,250,186,154, 61,170,205,178, 62, - 0, 64, 1, 53,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67, -151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, - 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, - 0, 0, 0, 0,218,210,190, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 15,113, 10,159, 0, 0, 0, 1, 0, 0, 0, - 64, 19,113, 10,120, 5,113, 10,136, 6,113, 10, 40, 11,113, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -240, 16,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 18,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 18,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 16,113, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 64, 19,113, 10,174, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,200, 15,113, 10,240, 16,113, 10, 24, 18,113, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, - 32, 20,113, 10,197, 0, 0, 0, 1, 0, 0, 0, 40, 46,113, 10, 72,231,112, 10,176,187,112, 10,240,187,112, 10,112,186,112, 10, -112,187,112, 10, 0, 0, 0, 0,125, 3, 0, 0,254, 4, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 9, 9,130, 1,166, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,113, 10, 0, 45,113, 10,176, 20,113, 10,216, 21,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176, 20,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -216, 21,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,193, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,181, 67, 0, 0,200, 65, - 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,130, 1, - 26, 0,130, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,125, 3, 0, 0, -254, 4, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130, 1, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -216, 21,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176, 20,113, 10, 0, 0, 0, 0, 0,128,181, 67, 0, 0, 0, 0, - 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68, 0, 0, 0, 0,126, 86, 5, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, -139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, - 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,130, 1,140, 1,130, 1,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,125, 3, 0, 0,254, 4, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,130, 1,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,124, 2, 0, 0, 0, 23,113, 10,171, 0, 0, 0, 1, 0, 0, 0,248, 27,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 25,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,208, 26,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,182, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,161, 67, 0, 0,200, 65, 0,128,161, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,108, 1, 26, 0,108, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 4, 0, 0,160, 5, 0, 0, 41, 1, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,108, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,208, 26,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168, 25,113, 10, 0, 0, 0, 0, - 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,173, 67, 0, 0,210,195, 0, 0, 0, 0, 91, 1, 0, 0, -108, 1, 0, 0, 18, 0, 0, 0,181, 1, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, - 90, 1, 0, 0, 18, 0, 0, 0,181, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,108, 1,182, 1, 91, 1,164, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,160, 5, 0, 0, 67, 1, 0, 0,248, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 1, 0, 0,248, 27,113, 10,168, 0, 0, 0, 1, 0, 0, 0, -120, 32,113, 10, 0, 23,113, 10,168, 25,113, 10,208, 26,113, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 29,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 40, 29,113, 10,221, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, - 96, 29,113, 10, 68, 65, 84, 65,156, 0, 0, 0, 96, 29,113, 10,220, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -240,212,114, 10, 19, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 20, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 21, 0, 1, 0, - 1, 0, 1, 0,240,212,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,229,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,240,114, 10, - 0, 0, 0, 0, 1, 0, 1, 0, 16, 31,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,176,248,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, - 56, 13,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,168,244,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 72,226,114, 10, 0, 0, 0, 0, - 1, 0, 1, 0,152,236,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,225,114, 10, 68, 65, 84, 65,248, 0, 0, 0, 40, 30,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 80, 31,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,162, 67, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, - 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 68, 1, 30, 0, 68, 1, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 6, 0, 0,128, 7, 0, 0,252, 3, 0, 0, 25, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 1, 30, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 80, 31,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 30,113, 10, 0, 0, 0, 0, - 0, 0,153, 67, 0, 0,137,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,153, 67,253,127,198,195, 0, 0, 0, 0, 51, 1, 0, 0, - 68, 1, 0, 0, 18, 0, 0, 0,158, 1, 0, 0, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, - 50, 1, 0, 0, 18, 0, 0, 0,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 68, 1,159, 1, 51, 1,141, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 6, 0, 0,128, 7, 0, 0, 93, 2, 0, 0,251, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,120, 32,113, 10,164, 0, 0, 0, 1, 0, 0, 0, - 40, 38,113, 10,248, 27,113, 10, 40, 30,113, 10, 80, 31,113, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,136, 33,113, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 34,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0,242, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, 1, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,128,241, 67, 0, 0,208, 65, 0,128,241, 67, 0, 0,208, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,228, 1, 27, 0,228, 1, 27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176, 34,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -216, 35,113, 10,136, 33,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, -128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -216, 35,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 37,113, 10,176, 34,113, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0, 37,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216, 35,113, 10, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, 18, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0,227, 1, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, - 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0,112, 0, 0, 0, -235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 40, 38,113, 10,165, 0, 0, 0, - 1, 0, 0, 0, 0, 45,113, 10,120, 32,113, 10,136, 33,113, 10, 0, 37,113, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56, 39,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 40,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96, 40,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 56, 39,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 41,113, 10, 68, 65, 84, 65, - 72, 3, 0, 0,136, 41,113, 10,158, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, - 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 0, 45,113, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 38,113, 10, 56, 39,113, 10, 96, 40,113, 10, 1, 0, 0, 0, - 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 40, 46,113, 10,197, 0, 0, 0, 1, 0, 0, 0,128, 79,113, 10, 32, 20,113, 10, - 48,188,112, 10,112,188,112, 10,240,187,112, 10,176,187,112, 10, 0, 0, 0, 0,213, 0, 0, 0,123, 3, 0, 0, 21, 1, 0, 0, -186, 2, 0, 0, 1, 1,167, 2,166, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 66,113, 10,160, 78,113, 10, -184, 46,113, 10,104, 61,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -184, 46,113, 10,198, 0, 0, 0, 1, 0, 0, 0,224, 47,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 56, 0,192, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,167, 2, 26, 0,167, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,213, 0, 0, 0,123, 3, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224, 47,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 8, 49,113, 10,184, 46,113, 10, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0, -143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213, 0, 0, 0,213, 0, 0, 0, 47, 1, 0, 0, -186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,140, 1, 0, 0, 5, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8, 49,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 48, 50,113, 10,224, 47,113, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0, -231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, - 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -213, 0, 0, 0,123, 3, 0, 0, 47, 1, 0, 0, 47, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 48, 50,113, 10,198, 0, 0, 0, 1, 0, 0, 0,104, 61,113, 10, 8, 49,113, 10, 0, 0, 0, 0, 0, 0, 35, 67, - 0,192,108,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 23,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, - 18, 0, 0, 0,111, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 18, 0, 0, 0,111, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123, 3, 0, 0,123, 3, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 51,113, 10,248, 59,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 88, 51,113, 10,196, 0, 0, 0, 1, 0, 0, 0,200, 52,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,254,163, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,200, 52,113, 10,196, 0, 0, 0, 1, 0, 0, 0, 56, 54,113, 10, 88, 51,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,236,253,163, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 56, 54,113, 10,196, 0, 0, 0, - 1, 0, 0, 0,168, 55,113, 10,200, 52,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,252,163, 0, 59, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 55,113, 10,196, 0, 0, 0, 1, 0, 0, 0, 24, 57,113, 10, 56, 54,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129,252,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, - 24, 57,113, 10,196, 0, 0, 0, 1, 0, 0, 0,136, 58,113, 10,168, 55,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107, -103,114,111,117,110,100, 32, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,252, -163, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,136, 58,113, 10,196, 0, 0, 0, 1, 0, 0, 0, -248, 59,113, 10, 24, 57,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102, -111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102, -111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, - 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,252,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,248, 59,113, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 58,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 73,116,101,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,196,255,163, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104, 61,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48, 50,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,213, 0, 0, 0,123, 3, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,167, 2,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 62,113, 10, - 68, 65, 84, 65, 72, 3, 0, 0,144, 62,113, 10,158, 0, 0, 0, 1, 0, 0, 0,190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167,147,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167,147,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,149, 53,207, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,126,177,113, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,121,195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,167,147,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,149, 53,207, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 6, 63,156, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, - 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 8, 66,113, 10,159, 0, 0, 0, 1, 0, 0, 0,128, 69,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48, 67,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 88, 68,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, -149, 1, 0, 0,174, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 68,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48, 67,113, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68, - 56,205,190,195,156,102, 95, 68,160,228,244, 64,110, 44,252, 67, 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,106, 2, 0, 0, - 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,106, 2, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 4, 0, 0, 24, 6,107, 2, 7, 6, 89, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,175, 1, 0, 0, 25, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 6,107, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,244, 0, 0, 0,128, 69,113, 10,175, 0, 0, 0, 1, 0, 0, 0, 64, 75,113, 10, 8, 66,113, 10, 48, 67,113, 10, - 88, 68,113, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,193, 67, 81, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 70,113, 10,198, 0, 0, 0, 1, 0, 0, 0,200, 71,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, - 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, 0, 0,208, 65, 0,224,189, 68, - 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 27, 0,240, 5, - 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, - 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 27, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 71,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,240, 72,113, 10,160, 70,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,240, 72,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 74,113, 10,200, 71,113, 10, 0, 0,112,196, - 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, - 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 74,113, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,240, 72,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, - 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,240, 5, -163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,163, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, - 64, 75,113, 10,165, 0, 0, 0, 1, 0, 0, 0,160, 78,113, 10,128, 69,113, 10,160, 70,113, 10, 24, 74,113, 10, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 76,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -120, 77,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, - 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, - 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -120, 77,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 76,113, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, - 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, - 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,160, 78,113, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 75,113, 10, - 80, 76,113, 10,120, 77,113, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,128, 79,113, 10,197, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 40, 46,113, 10,176,186,112, 10, 48,186,112, 10,112,188,112, 10, 48,188,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 3, 3,212, 0,166, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96, 82,113, 10,104,106,113, 10, 16, 80,113, 10, 56, 81,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 16, 80,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 81,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 84, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 83, 67, 0, 0,200, 65, 0, 0, 83, 67, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,212, 0, 26, 0,212, 0, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211, 0, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56, 81,113, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 16, 80,113, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 80, 66, 0, 0,119, 67, - 0, 0,189,195, 0, 0, 0, 0,195, 0, 0, 0,212, 0, 0, 0, 18, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 18, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,212, 0, -140, 1,195, 0,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 0,140, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 1, 0, 0, - 96, 82,113, 10,168, 0, 0, 0, 1, 0, 0, 0,208, 93,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 83,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,144, 83,113, 10,221, 0, 0, 0, - 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,200, 83,113, 10, 68, 65, 84, 65,156, 0, 0, 0,200, 83,113, 10,220, 0, 0, 0, - 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,240,212,114, 10, 19, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 20, 0, 0, 0, - 1, 0, 1, 0,240,212,114, 10, 21, 0, 1, 0, 1, 0, 1, 0,240,212,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,229,114, 10, - 0, 0, 0, 0, 1, 0, 1, 0,160,240,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 16, 31,115, 10, 0, 0, 0, 0, 1, 0, 1, 0, -176,248,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 56, 13,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,168,244,114, 10, 0, 0, 0, 0, - 1, 0, 1, 0, 72,226,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,236,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,225,114, 10, - 68, 65, 84, 65,248, 0, 0, 0,144, 84,113, 10,198, 0, 0, 0, 1, 0, 0, 0,184, 85,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0,128, 68, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 84, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,212, 0, 26, 0,212, 0, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211, 0, 0, 0, 41, 1, 0, 0, 66, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184, 85,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -224, 86,113, 10,144, 84,113, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, -255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, - 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 67, 1, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,182, 1, - 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -224, 86,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 8, 88,113, 10,184, 85,113, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, - 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211, 0, 0, 0, 67, 1, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8, 88,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 48, 89,113, 10,224, 86,113, 10, - 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0, -163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211, 0, 0, 0,211, 0, 0, 0, 67, 1, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48, 89,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 8, 88,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,211, 0, 0, 0, 67, 1, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, 0,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 90,113, 10, 68, 65, 84, 65, - 72, 3, 0, 0, 88, 90,113, 10,158, 0, 0, 0, 1, 0, 0, 0,121, 92,163, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18,131,187, 0, 0, 0,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,121, 92,163, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 15,150, 72, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,149, 53,207, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,121,195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,121, 92,163, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149, 53,207, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,159, 55,242, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -208, 93,113, 10,159, 0, 0, 0, 1, 0, 0, 0, 72, 97,113, 10, 96, 82,113, 10,144, 84,113, 10, 48, 89,113, 10, 1, 0, 0, 0, - 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248, 94,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 96,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,149, 1, 0, 0, -174, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32, 96,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,248, 94,113, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68, 56,205,190,195, -156,102, 95, 68,160,228,244, 64,110, 44,252, 67, 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,106, 2, 0, 0, 0, 0, 0, 0, - 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,106, 2, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, - 0, 0, 24, 6,107, 2, 7, 6, 89, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 6, 0, 0,175, 1, 0, 0, 25, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 6,107, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -244, 0, 0, 0, 72, 97,113, 10,175, 0, 0, 0, 1, 0, 0, 0, 8,103,113, 10,208, 93,113, 10,248, 94,113, 10, 32, 96,113, 10, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,193, 67, 81, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104, 98,113, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 99,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144, 99,113, 10,198, 0, 0, 0, - 1, 0, 0, 0,184,100,113, 10,104, 98,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,184,100,113, 10,198, 0, 0, 0, 1, 0, 0, 0,224,101,113, 10,144, 99,113, 10, 0, 0,112,196, 0, 0,112, 68, - 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224,101,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -184,100,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, - 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, -112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 8,103,113, 10, -165, 0, 0, 0, 1, 0, 0, 0,104,106,113, 10, 72, 97,113, 10,104, 98,113, 10,224,101,113, 10, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,104,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,105,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, -101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,105,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 24,104,113, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, -112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, - 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,180, 0, 0, 0,104,106,113, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,103,113, 10, 24,104,113, 10, - 64,105,113, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 6, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,168,107,113, 10,193, 0, 0, 0, 1, 0, 0, 0,152, 41,114, 10, -120,184,112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,108,113, 10,224,111,113, 10, 32,112,113, 10, 80,118,113, 10, -152,118,113, 10,248, 12,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,108,113, 10,194, 0, 0, 0, 1, 0, 0, 0,160,108,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,108,113, 10,194, 0, 0, 0, - 1, 0, 0, 0,224,108,113, 10, 96,108,113, 10, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -224,108,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 32,109,113, 10,160,108,113, 10, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 32,109,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 96,109,113, 10,224,108,113, 10, 0, 0, 0, 0, -254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,109,113, 10,194, 0, 0, 0, 1, 0, 0, 0,160,109,113, 10, - 32,109,113, 10, 0, 0, 0, 0, 0, 0,187, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,109,113, 10,194, 0, 0, 0, - 1, 0, 0, 0,224,109,113, 10, 96,109,113, 10, 0, 0, 0, 0,254, 4,187, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -224,109,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 32,110,113, 10,160,109,113, 10, 0, 0, 0, 0,244, 3,187, 2, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 32,110,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 96,110,113, 10,224,109,113, 10, 0, 0, 0, 0, -244, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,110,113, 10,194, 0, 0, 0, 1, 0, 0, 0,160,110,113, 10, - 32,110,113, 10, 0, 0, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,110,113, 10,194, 0, 0, 0, - 1, 0, 0, 0,224,110,113, 10, 96,110,113, 10, 0, 0, 0, 0,244, 3, 28, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -224,110,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 32,111,113, 10,160,110,113, 10, 0, 0, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 32,111,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 96,111,113, 10,224,110,113, 10, 0, 0, 0, 0, -248, 1, 28, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,111,113, 10,194, 0, 0, 0, 1, 0, 0, 0,160,111,113, 10, - 32,111,113, 10, 0, 0, 0, 0,244, 3, 12, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,111,113, 10,194, 0, 0, 0, - 1, 0, 0, 0,224,111,113, 10, 96,111,113, 10, 0, 0, 0, 0,254, 4, 12, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, -224,111,113, 10,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160,111,113, 10, 0, 0, 0, 0,248, 1,187, 2, 1, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 32,112,113, 10,195, 0, 0, 0, 1, 0, 0, 0,104,112,113, 10, 0, 0, 0, 0,160,108,113, 10, -224,108,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,112,113, 10,195, 0, 0, 0, 1, 0, 0, 0, -176,112,113, 10, 32,112,113, 10,160,108,113, 10, 96,109,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -176,112,113, 10,195, 0, 0, 0, 1, 0, 0, 0,248,112,113, 10,104,112,113, 10,224,108,113, 10,160,109,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,112,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 64,113,113, 10,176,112,113, 10, - 96,109,113, 10,160,109,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,113,113, 10,195, 0, 0, 0, - 1, 0, 0, 0,136,113,113, 10,248,112,113, 10,160,109,113, 10,224,109,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,136,113,113, 10,195, 0, 0, 0, 1, 0, 0, 0,208,113,113, 10, 64,113,113, 10, 32,109,113, 10, 32,110,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,113,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 24,114,113, 10, -136,113,113, 10, 96,108,113, 10, 96,110,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,114,113, 10, -195, 0, 0, 0, 1, 0, 0, 0, 96,114,113, 10,208,113,113, 10, 96,109,113, 10, 96,110,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 96,114,113, 10,195, 0, 0, 0, 1, 0, 0, 0,168,114,113, 10, 24,114,113, 10,224,109,113, 10, -160,110,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,114,113, 10,195, 0, 0, 0, 1, 0, 0, 0, -240,114,113, 10, 96,114,113, 10, 32,110,113, 10,160,110,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -240,114,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 56,115,113, 10,168,114,113, 10, 96,108,113, 10,224,110,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,115,113, 10,195, 0, 0, 0, 1, 0, 0, 0,128,115,113, 10,240,114,113, 10, - 32,110,113, 10,224,110,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,115,113, 10,195, 0, 0, 0, - 1, 0, 0, 0,200,115,113, 10, 56,115,113, 10, 96,110,113, 10, 32,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,200,115,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 16,116,113, 10,128,115,113, 10,160,110,113, 10, 32,111,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,116,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 88,116,113, 10, -200,115,113, 10,224,110,113, 10, 32,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,116,113, 10, -195, 0, 0, 0, 1, 0, 0, 0,160,116,113, 10, 16,116,113, 10, 32,110,113, 10, 96,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,160,116,113, 10,195, 0, 0, 0, 1, 0, 0, 0,232,116,113, 10, 88,116,113, 10,224,109,113, 10, - 96,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,116,113, 10,195, 0, 0, 0, 1, 0, 0, 0, - 48,117,113, 10,160,116,113, 10,160,109,113, 10,160,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 48,117,113, 10,195, 0, 0, 0, 1, 0, 0, 0,120,117,113, 10,232,116,113, 10, 32,109,113, 10,160,111,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,117,113, 10,195, 0, 0, 0, 1, 0, 0, 0,192,117,113, 10, 48,117,113, 10, - 96,111,113, 10,160,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,117,113, 10,195, 0, 0, 0, - 1, 0, 0, 0, 8,118,113, 10,120,117,113, 10, 96,109,113, 10,224,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 8,118,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 80,118,113, 10,192,117,113, 10,224,109,113, 10,224,111,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,118,113, 10,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 8,118,113, 10, 32,111,113, 10,224,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,152,118,113, 10, -197, 0, 0, 0, 1, 0, 0, 0,120,121,113, 10, 0, 0, 0, 0, 96,109,113, 10,160,108,113, 10,224,108,113, 10,160,109,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, 56, 41,114, 10, 56, 41,114, 10, 40,119,113, 10, 80,120,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 40,119,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 80,120,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, -188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80,120,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,119,113, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 96, 0, 0, 0,120,121,113, 10,197, 0, 0, 0, 1, 0, 0, 0, 72,155,113, 10,152,118,113, 10, 32,110,113, 10, - 96,111,113, 10,160,111,113, 10, 32,109,113, 10, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 11, 2, 0, 0, - 4, 4, 10, 1, 12, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,141,113, 10, 32,154,113, 10, 8,122,113, 10, - 48,123,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,122,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 48,123,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,133, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, - 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 10, 1, 31, 0, 10, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0,237, 1, 0, 0, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 48,123,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,122,113, 10, 0, 0, 0, 0, - 0,128,132, 67, 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0,255,255,120, 67,255,127,246,195, 0, 0, 0, 0,249, 0, 0, 0, - 10, 1, 0, 0, 0, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -248, 0, 0, 0, 0, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 10, 1,237, 1,249, 0,237, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 0, 0, 0, 0,236, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,124,113, 10, 40,140,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 88,124,113, 10,196, 0, 0, 0, 1, 0, 0, 0, -200,125,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101, -120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101, -120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,248, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0,200,125,113, 10,196, 0, 0, 0, 1, 0, 0, 0, 56,127,113, 10, 88,124,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,135,255,248, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 56,127,113, 10, -196, 0, 0, 0, 1, 0, 0, 0,168,128,113, 10,200,125,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,248, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168,128,113, 10,196, 0, 0, 0, 1, 0, 0, 0, 24,130,113, 10, - 56,127,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,248, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 24,130,113, 10,196, 0, 0, 0, 1, 0, 0, 0,136,131,113, 10,168,128,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 58,254,248, 0, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,136,131,113, 10,196, 0, 0, 0, - 1, 0, 0, 0,248,132,113, 10, 24,130,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, - 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, - 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,248, 0,102, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248,132,113, 10,196, 0, 0, 0, 1, 0, 0, 0,104,134,113, 10,136,131,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,253,248, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -104,134,113, 10,196, 0, 0, 0, 1, 0, 0, 0,216,135,113, 10,248,132,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102, -111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,253, -248, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216,135,113, 10,196, 0, 0, 0, 1, 0, 0, 0, - 72,137,113, 10,104,134,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112, -114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112, -114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243,252,248, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0, 72,137,113, 10,196, 0, 0, 0, 1, 0, 0, 0,184,138,113, 10,216,135,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,238,251,248, 0,237, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,184,138,113, 10, -196, 0, 0, 0, 1, 0, 0, 0, 40,140,113, 10, 72,137,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109, -112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,248, 0, 0, 0, - 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40,140,113, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -184,138,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,252,248, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -224, 0, 0, 0,152,141,113, 10,164, 0, 0, 0, 1, 0, 0, 0, 72,147,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,142,113, 10,198, 0, 0, 0, - 1, 0, 0, 0,208,143,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0,242, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,128,241, 67, - 0, 0,208, 65, 0,128,241, 67, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,228, 1, 27, 0,228, 1, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 5, 0, 0,128, 7, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 1, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,208,143,113, 10,198, 0, 0, 0, 1, 0, 0, 0,248,144,113, 10,168,142,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248,144,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,146,113, 10, -208,143,113, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, - 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,146,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248,144,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, - 18, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,227, 1, 0, 0, 18, 0, 0, 0,123, 1, 0, 0, - 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 8, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,224, 0, 0, 0, 72,147,113, 10,165, 0, 0, 0, 1, 0, 0, 0, 32,154,113, 10,152,141,113, 10,168,142,113, 10, - 32,146,113, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,148,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,128,149,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,128,149,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,148,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,168,150,113, 10, 68, 65, 84, 65, 72, 3, 0, 0,168,150,113, 10,158, 0, 0, 0, 1, 0, 0, 0, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, -237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, -103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,154,113, 10,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 72,147,113, 10, 88,148,113, 10,128,149,113, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72,155,113, 10, -197, 0, 0, 0, 1, 0, 0, 0,120,187,113, 10,120,121,113, 10,224,110,113, 10, 32,111,113, 10,160,110,113, 10, 32,110,113, 10, - 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 0, 0, 0, 0, 27, 1, 0, 0, 18, 18,251, 1, 28, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40,158,113, 10,152,186,113, 10,216,155,113, 10, 0,157,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,155,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,157,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,253, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,251, 1, 26, 0,251, 1, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,157,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216,155,113, 10, 0, 0, 0, 0, 0, 0,253, 67, 0, 0, 0, 0, 0, 0, 48, 65, - 0, 0, 0, 0, 0, 0,245, 67, 0, 0, 0, 0, 0, 0,129, 67,234, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, - 2, 0, 0, 4, 10, 0,251, 1, 2, 1,234, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 26, 0, 0, 0, 27, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,251, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,112, 1, 0, 0, 40,158,113, 10,179, 0, 0, 0, 1, 0, 0, 0, 24,162,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 62, 62, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200,159,113, 10,198, 0, 0, 0, 1, 0, 0, 0,240,160,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128,251, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 26, 0,240, 5, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240,160,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,200,159,113, 10, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,128,192, 67, 0, 6,188, 63, -254,176,189, 68, 0, 0, 0, 0, 0,128,192, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, - 10, 0,240, 5,130, 1,240, 5,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 26, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -124, 2, 0, 0, 24,162,113, 10,171, 0, 0, 0, 1, 0, 0, 0, 16,167,113, 10, 40,158,113, 10,200,159,113, 10,240,160,113, 10, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,192,164,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -232,165,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,190, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, - 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, - 26, 0,240, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -232,165,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192,164,113, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, - 0, 0, 0, 68,134,137,182,195,195, 68, 91, 68, 30,222,207, 66,116, 8,204, 67,223, 5, 0, 0,240, 5, 0, 0, 18, 0, 0, 0, -129, 1, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 18, 0, 0, 0, -129, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, 10, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,240, 5,130, 1,223, 5,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 26, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 5,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0, 16,167,113, 10,175, 0, 0, 0, 1, 0, 0, 0,208,172,113, 10, 24,162,113, 10, -192,164,113, 10,232,165,113, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 58, 52, 81, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,168,113, 10,198, 0, 0, 0, 1, 0, 0, 0, - 88,169,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0,190, 68, - 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, 0, 0,208, 65, - 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, - 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 27, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 88,169,113, 10,198, 0, 0, 0, 1, 0, 0, 0,128,170,113, 10, 48,168,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,170,113, 10,198, 0, 0, 0, 1, 0, 0, 0,168,171,113, 10, 88,169,113, 10, - 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70, -172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,171,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,128,170,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, - 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 18, 0, 0, 0, -239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, 0, 0, 32, 65, - 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -224, 0, 0, 0,208,172,113, 10,165, 0, 0, 0, 1, 0, 0, 0, 32,183,113, 10, 16,167,113, 10, 48,168,113, 10,168,171,113, 10, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224,173,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 8,175,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,232, 4, 26, 0,232, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 2, 0, 0,128, 7, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 8,175,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,176,113, 10,224,173,113, 10, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,176,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,177,113, 10, - 8,175,113, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0, -251, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, - 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,177,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,128,178,113, 10, 48,176,113, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,128,178,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,177,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,168,179,113, 10, 68, 65, 84, 65, 72, 3, 0, 0,168,179,113, 10,158, 0, 0, 0, 1, 0, 0, 0, - 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 7, 36, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, - 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0, -185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, -180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62, -147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, -217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,128, 32,182, 69,129, 32,190,250,186,154, 61,170,205,178, 62, 0, 64, 1, 53, -215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67,151,254, 71, 66, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, -180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62, -147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, -218,210,190, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,183,113, 10,159, 0, 0, 0, 1, 0, 0, 0,152,186,113, 10, -208,172,113, 10,224,173,113, 10,128,178,113, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,184,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,112,185,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,112,185,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72,184,113, 10, 0, 0, 64,192, - 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, - 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,152,186,113, 10,174, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 32,183,113, 10, 72,184,113, 10,112,185,113, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,187,113, 10, -197, 0, 0, 0, 1, 0, 0, 0,184,215,113, 10, 72,155,113, 10, 32,111,113, 10,224,111,113, 10,224,109,113, 10,160,110,113, 10, - 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 29, 1, 0, 0,186, 2, 0, 0, 1, 1,251, 1,158, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 72,197,113, 10,216,214,113, 10, 8,188,113, 10,168,192,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,188,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,189,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,253, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,251, 1, 26, 0,251, 1, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, - 29, 1, 0, 0, 54, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,189,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 88,190,113, 10, 8,188,113, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,249, 1, 0, 0,249, 1, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0,132, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 88,190,113, 10,198, 0, 0, 0, 1, 0, 0, 0,128,191,113, 10, 48,189,113, 10, 0, 0, 0, 0, - 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 55, 1, 0, 0, 55, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,191,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -168,192,113, 10, 88,190,113, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, - 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, -122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 3, 0, 0, -243, 3, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -168,192,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,191,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,251, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208,193,113, 10, 68, 65, 84, 65, 72, 3, 0, 0,208,193,113, 10,158, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,240,182, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190, -184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, - 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63, -176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, - 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,178,157,229, 62,242,252, 18,191, -222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,179,141, 62, 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,225,188,163, 63, -129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63, - 0,247, 70,188, 0,192, 32,182, 15,232,143,190,210,186, 10, 62, 44, 83, 32, 63, 0,192, 24, 54,215,104, 25,196,133,132,135, 67, - 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,158, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190, -184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, - 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,178,157,229, 62,242,252, 18,191, -222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,179,141, 62, 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,225,188,163, 63, -129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190, -237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,138, 93,108, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 72,197,113, 10,159, 0, 0, 0, 1, 0, 0, 0,192,200,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, - 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112,198,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -152,199,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,253, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, - 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,251, 1, - 26, 0,251, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0, -243, 3, 0, 0, 29, 1, 0, 0, 54, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -152,199,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112,198,113, 10, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, - 0,192, 22, 68,125, 79, 21, 68,131,112,102, 68,133, 83, 49, 67, 62,214,212, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, -131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, - 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,251, 1,132, 1,251, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,251, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,124, 2, 0, 0,192,200,113, 10,171, 0, 0, 0, 1, 0, 0, 0,184,205,113, 10, 72,197,113, 10, -112,198,113, 10,152,199,113, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,203,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,144,204,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,240, 5, 26, 0,240, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,157, 1, 0, 0,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,144,204,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,203,113, 10, 0, 0, 32,193, - 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,132,137,182,195,194, 68, 91, 68,112,158, 93, 65, 8, 19,249, 67,223, 5, 0, 0, -240, 5, 0, 0, 18, 0, 0, 0, 91, 2, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -222, 5, 0, 0, 18, 0, 0, 0, 91, 2, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, - 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,240, 5, 92, 2,223, 5, 74, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,183, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0,184,205,113, 10,175, 0, 0, 0, 1, 0, 0, 0, -120,211,113, 10,192,200,113, 10,104,203,113, 10,144,204,113, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 52, 81, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,206,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0,208,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, - 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, - 0,224,189, 68, 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 0,208,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 40,209,113, 10,216,206,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 40,209,113, 10,198, 0, 0, 0, 1, 0, 0, 0, - 80,210,113, 10, 0,208,113, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, - 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 80,210,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,209,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, -162, 3, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0, -162, 3, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,120,211,113, 10,165, 0, 0, 0, 1, 0, 0, 0,216,214,113, 10,184,205,113, 10, -216,206,113, 10, 80,210,113, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -136,212,113, 10,198, 0, 0, 0, 1, 0, 0, 0,176,213,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176,213,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,212,113, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,216,214,113, 10,174, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,120,211,113, 10,136,212,113, 10,176,213,113, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, -184,215,113, 10,197, 0, 0, 0, 1, 0, 0, 0,232,247,113, 10,120,187,113, 10, 96,108,113, 10, 96,110,113, 10, 32,111,113, 10, -224,110,113, 10, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 27, 1, 0, 0, 18, 18,248, 1, 28, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,218,113, 10, 8,247,113, 10, 72,216,113, 10,112,217,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,216,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -112,217,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,231, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,252, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, - 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,248, 1, - 26, 0,248, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -112,217,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72,216,113, 10, 0, 0, 0, 0, 0,128,251, 67, 0, 0, 0, 0, - 0, 0, 65, 67, 0, 0, 0, 0, 0,128,243, 67, 0, 0, 0, 0, 0, 0,129, 67,231, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, - 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,248, 1, 2, 1,231, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 26, 0, 0, 0, 27, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,112, 1, 0, 0,152,218,113, 10,179, 0, 0, 0, 1, 0, 0, 0,136,222,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112,121,116,104,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,220,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,221,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,251, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 26, 0,240, 5, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,221,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56,220,113, 10, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,128,192, 67, - 0, 6,188, 63,254,176,189, 68, 0, 0, 0, 0, 0,128,192, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0,129, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, - 0, 0, 0, 4, 10, 0,240, 5,130, 1,240, 5,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 26, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 5,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,124, 2, 0, 0,136,222,113, 10,171, 0, 0, 0, 1, 0, 0, 0,128,227,113, 10,152,218,113, 10, 56,220,113, 10, - 96,221,113, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,225,113, 10,198, 0, 0, 0, - 1, 0, 0, 0, 88,226,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0,190, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, - 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,240, 5, 26, 0,240, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 88,226,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,225,113, 10, 0, 0, 32,193, 0, 0, 0, 68, - 0, 0, 32,193, 0, 0, 0, 68,134,137,182,195,195, 68, 91, 68, 30,222,207, 66,116, 8,204, 67,223, 5, 0, 0,240, 5, 0, 0, - 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, - 18, 0, 0, 0,129, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,205,204, 76, 62, 72,225,154, 63, - 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,240, 5,130, 1,223, 5,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 26, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0,128,227,113, 10,175, 0, 0, 0, 1, 0, 0, 0, 64,233,113, 10, -136,222,113, 10, 48,225,113, 10, 88,226,113, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 58, 52, 81, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,228,113, 10,198, 0, 0, 0, - 1, 0, 0, 0,200,229,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, - 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,224,189, 68, - 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,200,229,113, 10,198, 0, 0, 0, 1, 0, 0, 0,240,230,113, 10,160,228,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240,230,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 24,232,113, 10, -200,229,113, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, - 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, - 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,232,113, 10, -198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,230,113, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, - 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, - 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 18, 0, 0, 0,162, 3, 0, 0, - 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,224, 0, 0, 0, 64,233,113, 10,165, 0, 0, 0, 1, 0, 0, 0,144,243,113, 10,128,227,113, 10,160,228,113, 10, - 24,232,113, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80,234,113, 10, -198, 0, 0, 0, 1, 0, 0, 0,120,235,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,232, 4, 26, 0,232, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,232, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,120,235,113, 10,198, 0, 0, 0, 1, 0, 0, 0,160,236,113, 10, 80,234,113, 10, 0, 0, 0, 0, - 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0, -160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,236,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -200,237,113, 10,120,235,113, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, - 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, -120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0, -128, 7, 0, 0,251, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -200,237,113, 10,198, 0, 0, 0, 1, 0, 0, 0,240,238,113, 10,160,236,113, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, -121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240,238,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200,237,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,240,113, 10, 68, 65, 84, 65, 72, 3, 0, 0, 24,240,113, 10,158, 0, 0, 0, - 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 7, 36, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, - 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, - 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, - 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, - 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,128, 32,182, 69,129, 32,190,250,186,154, 61,170,205,178, 62, - 0, 64, 1, 53,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67, -151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, - 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, - 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 95, 27,254, 62, 9, 46,185, 62, - 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, - 0, 0, 0, 0,218,210,190, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,243,113, 10,159, 0, 0, 0, 1, 0, 0, 0, - 8,247,113, 10, 64,233,113, 10, 80,234,113, 10,240,238,113, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -184,244,113, 10,198, 0, 0, 0, 1, 0, 0, 0,224,245,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224,245,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,244,113, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0, -248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 8,247,113, 10,174, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,144,243,113, 10,184,244,113, 10,224,245,113, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, -232,247,113, 10,197, 0, 0, 0, 1, 0, 0, 0,248, 12,114, 10,184,215,113, 10, 96,111,113, 10,224,109,113, 10,160,109,113, 10, -160,111,113, 10, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 13, 2, 0, 0,186, 2, 0, 0, 3, 3, 10, 1,174, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,250,113, 10,208, 11,114, 10,120,248,113, 10,160,249,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120,248,113, 10,198, 0, 0, 0, 1, 0, 0, 0, -160,249,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,133, 67, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, - 0,128,149, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 10, 1, - 26, 0, 10, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0, -254, 4, 0, 0, 13, 2, 0, 0, 38, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -160,249,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,248,113, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,121, 67, 0, 0, 2,195, 0, 0, 0, 0,249, 0, 0, 0, 10, 1, 0, 0, 18, 0, 0, 0, -147, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0, -147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, - 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 10, 1,148, 0,249, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 39, 2, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 1,148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 4, 1, 0, 0,200,250,113, 10,168, 0, 0, 0, 1, 0, 0, 0, 72,255,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,251,113, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, - 12, 0, 0, 0,248,251,113, 10,221, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 48,252,113, 10, 68, 65, 84, 65, -156, 0, 0, 0, 48,252,113, 10,220, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,240,212,114, 10, 19, 0, 0, 0, - 1, 0, 1, 0,240,212,114, 10, 20, 0, 0, 0, 1, 0, 1, 0,240,212,114, 10, 21, 0, 1, 0, 1, 0, 1, 0,240,212,114, 10, - 0, 0, 0, 0, 1, 0, 1, 0,208,229,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,160,240,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, - 16, 31,115, 10, 0, 0, 0, 0, 1, 0, 1, 0,176,248,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 56, 13,115, 10, 0, 0, 0, 0, - 1, 0, 1, 0,168,244,114, 10, 0, 0, 0, 0, 1, 0, 1, 0, 72,226,114, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,236,114, 10, - 0, 0, 0, 0, 1, 0, 1, 0,160,225,114, 10, 68, 65, 84, 65,248, 0, 0, 0,248,252,113, 10,198, 0, 0, 0, 1, 0, 0, 0, - 32,254,113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,150, 67, - 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, - 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 1, - 31, 0, 44, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 4, 0, 0, -160, 5, 0, 0,218, 2, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 31, 0, - 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 32,254,113, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248,252,113, 10, 0, 0, 0, 0, 0,128,141, 67, 0, 0, 62,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,141, 67, 0, 0,246,194, 0, 0, 0, 0, 27, 1, 0, 0, 44, 1, 0, 0, 18, 0, 0, 0, -140, 0, 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 18, 0, 0, 0, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 44, 1,141, 0, 27, 1,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,117, 4, 0, 0,160, 5, 0, 0, 77, 2, 0, 0,217, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 44, 1,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 72,255,113, 10,164, 0, 0, 0, 1, 0, 0, 0,248, 4,114, 10,200,250,113, 10, -248,252,113, 10, 32,254,113, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 88, 0,114, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 1,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, - 0, 0,216, 65, 0, 0, 0, 0, 0, 0,242, 67, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0, 0,128,241, 67, 0, 0,208, 65, 0,128,241, 67, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,228, 1, 27, 0,228, 1, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,228, 1, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 1,114, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 2,114, 10, 88, 0,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,112, 0, 0, 0, -235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 2,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,208, 3,114, 10,128, 1,114, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, - 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,208, 3,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168, 2,114, 10, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0,123, 1, 0, 0, 18, 0, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,227, 1, 0, 0, - 18, 0, 0, 0,123, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 5, 0, 0,128, 7, 0, 0,112, 0, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,248, 4,114, 10,165, 0, 0, 0, 1, 0, 0, 0,208, 11,114, 10, - 72,255,113, 10, 88, 0,114, 10,208, 3,114, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 8, 6,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 48, 7,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48, 7,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 8, 6,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, - 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 8,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, 88, 8,114, 10, -158, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, -226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, - 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 11,114, 10,159, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,248, 4,114, 10, 8, 6,114, 10, 48, 7,114, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 96, 0, 0, 0,248, 12,114, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,247,113, 10, 96,110,113, 10, 96,109,113, 10, -224,111,113, 10, 32,111,113, 10, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 29, 1, 0, 0,186, 2, 0, 0, 9, 9,248, 1, -158, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 15,114, 10, 88, 40,114, 10,136, 13,114, 10,176, 14,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136, 13,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,176, 14,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 73, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0,252, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, - 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,248, 1, 26, 0,248, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,247, 1, 0, 0, 29, 1, 0, 0, 54, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,176, 14,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 13,114, 10, 0, 0, 0, 0, 0,224,189, 68, - 0, 0, 0, 0, 0,192, 22, 68,236,140, 21, 68, 20, 51,102, 68,120, 83, 49, 67, 68,214,212, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, - 0, 0, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, - 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,248, 1,132, 1,248, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,124, 2, 0, 0,216, 15,114, 10,171, 0, 0, 0, 1, 0, 0, 0,208, 20,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,120,231,114, 10, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,231, 1, 0, 0,243, 1, 0, 0,122, 1, 0, 0,124, 1, 0, 0, -231, 1, 0, 0,243, 1, 0, 0, 4, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -128, 18,114, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 19,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 26, 0,240, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,157, 1, 0, 0,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 19,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 18,114, 10, - 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,132,137,182,195,194, 68, 91, 68,112,158, 93, 65, 8, 19,249, 67, -223, 5, 0, 0,240, 5, 0, 0, 18, 0, 0, 0, 91, 2, 0, 0, 0, 0, 0, 0,222, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,222, 5, 0, 0, 18, 0, 0, 0, 91, 2, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, -205,204, 76, 62, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,240, 5, 92, 2,223, 5, 74, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,183, 1, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,244, 0, 0, 0,208, 20,114, 10,175, 0, 0, 0, - 1, 0, 0, 0,144, 26,114, 10,216, 15,114, 10,128, 18,114, 10,168, 19,114, 10, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 57, 52, 81, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -240, 21,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 23,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 67, 0, 0, 0, 0, - 0, 0,216, 65, 0, 0, 0, 0, 0, 0,190, 68, 0, 0, 0, 0, 0, 0,216, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0, 0,224,189, 68, 0, 0,208, 65, 0,224,189, 68, 0, 0,208, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,240, 5, 27, 0,240, 5, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240, 5, 27, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 23,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 64, 24,114, 10,240, 21,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,239, 5, 0, 0,112, 0, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 24,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,104, 25,114, 10, 24, 23,114, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, - 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,104, 25,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 24,114, 10, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0,162, 3, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,239, 5, 0, 0, - 18, 0, 0, 0,162, 3, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 5, 0, 0,112, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 5,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,144, 26,114, 10,165, 0, 0, 0, 1, 0, 0, 0,224, 36,114, 10, -208, 20,114, 10,240, 21,114, 10,104, 25,114, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,160, 27,114, 10,198, 0, 0, 0, 1, 0, 0, 0,200, 28,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,232, 4, 26, 0,232, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 28,114, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 29,114, 10, -160, 27,114, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, - 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0, -251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, - 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240, 29,114, 10, -198, 0, 0, 0, 1, 0, 0, 0, 24, 31,114, 10,200, 28,114, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, - 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 24, 31,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 64, 32,114, 10,240, 29,114, 10, 0, 0, 0, 0, - 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0, -180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 32,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 24, 31,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0, -128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 33,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, -104, 33,114, 10,158, 0, 0, 0, 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, 7, 36, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, - 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190, -142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65, -111,121,173,192,248,209,213, 64, 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, - 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,128, 32,182, 69,129, 32,190, -250,186,154, 61,170,205,178, 62, 0, 64, 1, 53,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68, -160, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, - 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,218,210,190, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224, 36,114, 10, -159, 0, 0, 0, 1, 0, 0, 0, 88, 40,114, 10,144, 26,114, 10,160, 27,114, 10, 64, 32,114, 10, 1, 0, 0, 0, 51, 51, 51, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 8, 38,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 48, 39,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48, 39,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 8, 38,114, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4, -122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, - 88, 40,114, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224, 36,114, 10, 8, 38,114, 10, 48, 39,114, 10, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, - 83, 78, 0, 0,140, 0, 0, 0,152, 41,114, 10,193, 0, 0, 0, 1, 0, 0, 0,160,109,114, 10,168,107,113, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 42,114, 10, 16, 44,114, 10, 80, 44,114, 10, 32, 47,114, 10,104, 47,114, 10, 40, 82,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 80, 42,114, 10,194, 0, 0, 0, 1, 0, 0, 0,144, 42,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 42,114, 10,194, 0, 0, 0, 1, 0, 0, 0,208, 42,114, 10, - 80, 42,114, 10, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 42,114, 10,194, 0, 0, 0, - 1, 0, 0, 0, 16, 43,114, 10,144, 42,114, 10, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 16, 43,114, 10,194, 0, 0, 0, 1, 0, 0, 0, 80, 43,114, 10,208, 42,114, 10, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 80, 43,114, 10,194, 0, 0, 0, 1, 0, 0, 0,144, 43,114, 10, 16, 43,114, 10, 0, 0, 0, 0, - 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 43,114, 10,194, 0, 0, 0, 1, 0, 0, 0,208, 43,114, 10, - 80, 43,114, 10, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 43,114, 10,194, 0, 0, 0, - 1, 0, 0, 0, 16, 44,114, 10,144, 43,114, 10, 0, 0, 0, 0,132, 2,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 16, 44,114, 10,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208, 43,114, 10, 0, 0, 0, 0,132, 2, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 80, 44,114, 10,195, 0, 0, 0, 1, 0, 0, 0,152, 44,114, 10, 0, 0, 0, 0,144, 42,114, 10, -208, 42,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152, 44,114, 10,195, 0, 0, 0, 1, 0, 0, 0, -224, 44,114, 10, 80, 44,114, 10,144, 42,114, 10, 80, 43,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -224, 44,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 40, 45,114, 10,152, 44,114, 10,208, 42,114, 10,144, 43,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40, 45,114, 10,195, 0, 0, 0, 1, 0, 0, 0,112, 45,114, 10,224, 44,114, 10, - 80, 43,114, 10,144, 43,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 45,114, 10,195, 0, 0, 0, - 1, 0, 0, 0,184, 45,114, 10, 40, 45,114, 10, 80, 43,114, 10,208, 43,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,184, 45,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 0, 46,114, 10,112, 45,114, 10, 80, 42,114, 10, 16, 44,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0, 46,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 72, 46,114, 10, -184, 45,114, 10, 80, 42,114, 10, 80, 43,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72, 46,114, 10, -195, 0, 0, 0, 1, 0, 0, 0,144, 46,114, 10, 0, 46,114, 10,208, 43,114, 10, 16, 44,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,144, 46,114, 10,195, 0, 0, 0, 1, 0, 0, 0,216, 46,114, 10, 72, 46,114, 10,144, 43,114, 10, -208, 43,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216, 46,114, 10,195, 0, 0, 0, 1, 0, 0, 0, - 32, 47,114, 10,144, 46,114, 10, 16, 43,114, 10, 16, 44,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 32, 47,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216, 46,114, 10, 16, 43,114, 10,144, 43,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,104, 47,114, 10,197, 0, 0, 0, 1, 0, 0, 0, 72, 50,114, 10, 0, 0, 0, 0, - 80, 43,114, 10,144, 42,114, 10,208, 42,114, 10,144, 43,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0, -214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 64,109,114, 10, 64,109,114, 10, -248, 47,114, 10, 32, 49,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -248, 47,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 49,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32, 49,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248, 47,114, 10, - 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, -112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, -214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72, 50,114, 10,197, 0, 0, 0, - 1, 0, 0, 0, 40, 82,114, 10,104, 47,114, 10, 80, 42,114, 10, 80, 43,114, 10,208, 43,114, 10, 16, 44,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0,131, 2, 0, 0, 0, 0, 0, 0,186, 2, 0, 0, 6, 6,132, 2,187, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,192, 55,114, 10, 72, 81,114, 10,216, 50,114, 10,152, 54,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216, 50,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 52,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 33, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,131, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,132, 2, 26, 0,132, 2, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0, 52,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,152, 54,114, 10,216, 50,114, 10, 0, 0, 0, 0, 0, 0, 91, 67, 0, 0, 40,196, 0, 0, 0, 0, 0, 0, 0, 0, -254,255, 74, 67,254, 63, 40,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,160, 2, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,160, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, - 6, 0,220, 0,161, 2,203, 0,161, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0,161, 2, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 53,114, 10, 40, 53,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0, 40, 53,114, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,196,255,202, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152, 54,114, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 52,114, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,102,102, 38,190, -205,204,148, 63, 51, 51, 13,191,154,153,198, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 1, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, 0,131, 2, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168, 1,161, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -160, 12, 0, 0,192, 55,114, 10,169, 0, 0, 0, 1, 0, 0, 0,208, 77,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144, 68,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,184, 69,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 42, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,168, 2, 26, 0,168, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,167, 2, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,184, 69,114, 10,198, 0, 0, 0, 1, 0, 0, 0,224, 70,114, 10,144, 68,114, 10, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,164, 3, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224, 70,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 8, 72,114, 10, -184, 69,114, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0, -111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, - 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8, 72,114, 10, -198, 0, 0, 0, 1, 0, 0, 0, 48, 73,114, 10,224, 70,114, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,167, 2, 0, 0,167, 2, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 48, 73,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 72,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 2,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 74,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, 88, 74,114, 10,158, 0, 0, 0, 1, 0, 0, 0, -226,225,191, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, - 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0, -185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, -192, 90, 29, 63,208,249,224,190,222,160, 81,191,184,158, 81,191,253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, 35, 44,185, 62, -232,229,162,188,206,156,122, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, -250, 8,140, 62,174,189, 27, 63,224, 25, 17,188, 0, 64,153,181,195, 13,188,190,191, 73, 53, 62, 99,126, 81, 63, 0,128,163, 53, -215,104, 25,196,134,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,159, 87,135,195,205,209,166, 67,151,254, 71, 66, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, -192, 90, 29, 63,208,249,224,190,222,160, 81,191,184,158, 81,191,253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, 35, 44,185, 62, -232,229,162,188,206,156,122, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, -172,148, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 77,114, 10,159, 0, 0, 0, 1, 0, 0, 0, 72, 81,114, 10, -192, 55,114, 10,144, 68,114, 10, 48, 73,114, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248, 78,114, 10, -198, 0, 0, 0, 1, 0, 0, 0, 32, 80,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 32, 80,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248, 78,114, 10, 0, 0, 64,192, - 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, - 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 72, 81,114, 10,174, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,208, 77,114, 10,248, 78,114, 10, 32, 80,114, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 40, 82,114, 10, -197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 50,114, 10, 16, 44,114, 10,208, 43,114, 10,144, 43,114, 10, 16, 43,114, 10, - 0, 0, 0, 0,133, 2, 0, 0,254, 4, 0, 0, 0, 0, 0, 0,186, 2, 0, 0, 1, 1,122, 2,187, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232,104,114, 10, 96,108,114, 10,184, 82,114, 10, 72,100,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184, 82,114, 10,198, 0, 0, 0, 1, 0, 0, 0,224, 83,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 30, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,122, 2, 26, 0,122, 2, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133, 2, 0, 0,254, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 2, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224, 83,114, 10, -198, 0, 0, 0, 1, 0, 0, 0,232, 87,114, 10,184, 82,114, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 64, 10,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 10,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0, 41, 2,143, 0, 41, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,133, 2, 0, 0, 36, 3, 0, 0,146, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,160, 0, 41, 2, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 85,114, 10,120, 86,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 64, 1, 0, 0, 8, 85,114, 10,196, 0, 0, 0, 1, 0, 0, 0,120, 86,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108, 95,115,104,101,108,102, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108, 95,115,104,101,108,102, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84,111,111,108, 32, 83,104,101,108,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,196,255,143, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,120, 86,114, 10, -196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 85,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84, -111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,254,143, 0,165, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232, 87,114, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 90,114, 10, -224, 83,114, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 91, 90,242,194, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133, 2, 0, 0, 36, 3, 0, 0, - 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0, - 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 89,114, 10, - 16, 89,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16, 89,114, 10, -196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, - 0, 97,121,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 90,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,100,114, 10, -232, 87,114, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, - 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0, -251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,254, 4, 0, 0, - 26, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, - 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 91,114, 10, -216, 98,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 91,114, 10, -196, 0, 0, 0, 1, 0, 0, 0, 24, 93,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, - 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122,254,163, 0,110, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24, 93,114, 10,196, 0, 0, 0, 1, 0, 0, 0,136, 94,114, 10, -168, 91,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,254,163, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 64, 1, 0, 0,136, 94,114, 10,196, 0, 0, 0, 1, 0, 0, 0,248, 95,114, 10, 24, 93,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,213,252,163, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248, 95,114, 10,196, 0, 0, 0, - 1, 0, 0, 0,104, 97,114, 10,136, 94,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100, -118,105,101,119, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,252,163, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,104, 97,114, 10,196, 0, 0, 0, 1, 0, 0, 0,216, 98,114, 10,248, 95,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97, -103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97, -103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165,252,163, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, -216, 98,114, 10,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104, 97,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, - 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110, -115,102,111,114,109, 32, 79,114,105,101,110,116, 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141,252, -163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,100,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,128, 90,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 3, 0, 0, -254, 4, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 1,161, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,101,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, -112,101,114, 10,158, 0, 0, 0, 1, 0, 0, 0,193,198,198, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, - 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190, -142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64, -136, 95,161,191,147,231,198, 63, 0, 0,128, 63, 12, 2, 35, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,130, 71,181, 63, -140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 49,192,168,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0,101, 98, 82, 64, 0, 25, 95, 64,101, 47,135, 62,134, 86, 22, 63, 32,243, 11,188, 0, 0,160,179,195, 15,188,190, -132, 75, 53, 62,216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 17,173,201, 64,181,148,248,192,202,247,159,192,233, 74, 87, 65, -247, 46,190,192, 88,106,234, 64, 44, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63, 12, 2, 35, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,130, 71,181, 63, -140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 49,192,168,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0,101, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, - 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0,116, 16, 50, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232,104,114, 10, -159, 0, 0, 0, 1, 0, 0, 0, 96,108,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 16,106,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,107,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,107,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 16,106,114, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4, -122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, - 96,108,114, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,104,114, 10, 16,106,114, 10, 56,107,114, 10, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, - 83, 78, 0, 0,140, 0, 0, 0,160,109,114, 10,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152, 41,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88,110,114, 10, 24,113,114, 10, 88,113,114, 10, 32,118,114, 10,104,118,114, 10,184,192,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 88,110,114, 10,194, 0, 0, 0, 1, 0, 0, 0,152,110,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,110,114, 10,194, 0, 0, 0, 1, 0, 0, 0,216,110,114, 10, - 88,110,114, 10, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,216,110,114, 10,194, 0, 0, 0, - 1, 0, 0, 0, 24,111,114, 10,152,110,114, 10, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 24,111,114, 10,194, 0, 0, 0, 1, 0, 0, 0, 88,111,114, 10,216,110,114, 10, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 88,111,114, 10,194, 0, 0, 0, 1, 0, 0, 0,152,111,114, 10, 24,111,114, 10, 0, 0, 0, 0, - 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,111,114, 10,194, 0, 0, 0, 1, 0, 0, 0,216,111,114, 10, - 88,111,114, 10, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,216,111,114, 10,194, 0, 0, 0, - 1, 0, 0, 0, 24,112,114, 10,152,111,114, 10, 0, 0, 0, 0,254, 4, 84, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 24,112,114, 10,194, 0, 0, 0, 1, 0, 0, 0, 88,112,114, 10,216,111,114, 10, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 20, 0, 0, 0, 88,112,114, 10,194, 0, 0, 0, 1, 0, 0, 0,152,112,114, 10, 24,112,114, 10, 0, 0, 0, 0, - 52, 2,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,112,114, 10,194, 0, 0, 0, 1, 0, 0, 0,216,112,114, 10, - 88,112,114, 10, 0, 0, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,216,112,114, 10,194, 0, 0, 0, - 1, 0, 0, 0, 24,113,114, 10,152,112,114, 10, 0, 0, 0, 0, 52, 2, 84, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, - 24,113,114, 10,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216,112,114, 10, 0, 0, 0, 0,254, 4, 64, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 88,113,114, 10,195, 0, 0, 0, 1, 0, 0, 0,160,113,114, 10, 0, 0, 0, 0,152,110,114, 10, -216,110,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,113,114, 10,195, 0, 0, 0, 1, 0, 0, 0, -232,113,114, 10, 88,113,114, 10,152,110,114, 10, 88,111,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, -232,113,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 48,114,114, 10,160,113,114, 10,216,110,114, 10,152,111,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,114,114, 10,195, 0, 0, 0, 1, 0, 0, 0,120,114,114, 10,232,113,114, 10, - 88,111,114, 10,152,111,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,114,114, 10,195, 0, 0, 0, - 1, 0, 0, 0,192,114,114, 10, 48,114,114, 10,152,111,114, 10,216,111,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,192,114,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 8,115,114, 10,120,114,114, 10, 88,110,114, 10, 24,112,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,115,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 80,115,114, 10, -192,114,114, 10, 88,111,114, 10, 88,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,115,114, 10, -195, 0, 0, 0, 1, 0, 0, 0,152,115,114, 10, 8,115,114, 10, 24,112,114, 10,152,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,152,115,114, 10,195, 0, 0, 0, 1, 0, 0, 0,224,115,114, 10, 80,115,114, 10,152,112,114, 10, -216,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,115,114, 10,195, 0, 0, 0, 1, 0, 0, 0, - 40,116,114, 10,152,115,114, 10, 88,112,114, 10,216,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 40,116,114, 10,195, 0, 0, 0, 1, 0, 0, 0,112,116,114, 10,224,115,114, 10,216,111,114, 10, 24,113,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,116,114, 10,195, 0, 0, 0, 1, 0, 0, 0,184,116,114, 10, 40,116,114, 10, - 24,111,114, 10, 24,113,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,116,114, 10,195, 0, 0, 0, - 1, 0, 0, 0, 0,117,114, 10,112,116,114, 10, 24,112,114, 10, 24,113,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 0,117,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 72,117,114, 10,184,116,114, 10, 88,110,114, 10, 24,111,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,117,114, 10,195, 0, 0, 0, 1, 0, 0, 0,144,117,114, 10, - 0,117,114, 10,152,111,114, 10, 88,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,117,114, 10, -195, 0, 0, 0, 1, 0, 0, 0,216,117,114, 10, 72,117,114, 10,216,111,114, 10,216,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,216,117,114, 10,195, 0, 0, 0, 1, 0, 0, 0, 32,118,114, 10,144,117,114, 10, 88,111,114, 10, -152,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,118,114, 10,195, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,216,117,114, 10,216,111,114, 10,152,112,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, -104,118,114, 10,197, 0, 0, 0, 1, 0, 0, 0, 72,121,114, 10, 0, 0, 0, 0, 88,111,114, 10,152,110,114, 10,216,110,114, 10, -152,111,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,144,212,114, 10,144,212,114, 10,248,118,114, 10, 32,120,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248,118,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 32,120,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, - 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, - 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 32,120,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,248,118,114, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, - 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72,121,114, 10,197, 0, 0, 0, 1, 0, 0, 0,248,131,114, 10,104,118,114, 10, - 88,110,114, 10, 24,112,114, 10, 24,113,114, 10, 24,111,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 63, 0, 0, 0, 15, 15,255, 4, 64, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,124,114, 10,208,130,114, 10, -216,121,114, 10, 0,123,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -216,121,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,123,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,140, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,123,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216,121,114, 10, - 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,254, 4, 0, 0, 18, 0, 0, 0, 37, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, -205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,255, 4, 38, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 26, 0, 0, 0, - 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 40,124,114, 10,174, 0, 0, 0, - 1, 0, 0, 0,208,130,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 8,125,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,126,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,203, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 88, 6, 26, 0, 88, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,126,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,125,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 26, 0, 0, 0, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,127,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, 88,127,114, 10,158, 0, 0, 0, - 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, - 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, - 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 91,138, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67, -129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, - 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, - 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208,130,114, 10,159, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 40,124,114, 10, 8,125,114, 10, 48,126,114, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, -248,131,114, 10,197, 0, 0, 0, 1, 0, 0, 0,208,151,114, 10, 72,121,114, 10, 24,112,114, 10,152,112,114, 10,216,111,114, 10, - 24,113,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 65, 0, 0, 0, 83, 1, 0, 0, 8, 8,255, 4, 19, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,137,114, 10,240,150,114, 10,136,132,114, 10, 0,136,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,132,114, 10,198, 0, 0, 0, 1, 0, 0, 0, -176,133,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 39, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, - 0, 96,191, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, - 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -254, 4, 0, 0, 65, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -176,133,114, 10,198, 0, 0, 0, 1, 0, 0, 0,216,134,114, 10,136,132,114, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,121,195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,121,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, -248, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, -248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,249, 0,203, 0,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 35, 4, 0, 0,254, 4, 0, 0, 91, 0, 0, 0, 83, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,220, 0,249, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,134,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,136,114, 10,176,133,114, 10, - 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70, -172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 0, 0, 83, 1, 0, 0, - 83, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,136,114, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,216,134,114, 10, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, - 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0, - 34, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 4, 0, 0, 18, 0, 0, 0,248, 0, 0, 0, 0, 0, 32, 65, - 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 8, 0, 35, 4,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34, 4, 0, 0, 91, 0, 0, 0, 83, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 35, 4,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -224, 0, 0, 0, 40,137,114, 10,165, 0, 0, 0, 1, 0, 0, 0,120,147,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,138,114, 10,198, 0, 0, 0, - 1, 0, 0, 0, 96,139,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0,128,191, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,252, 5, 26, 0,252, 5, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,251, 5, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -252, 5, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0, 96,139,114, 10,198, 0, 0, 0, 1, 0, 0, 0,136,140,114, 10, 56,138,114, 10, 0, 0, 0, 0, 0, 0, 15, 67, - 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, - 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,223, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,113, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,140,114, 10,198, 0, 0, 0, 1, 0, 0, 0,176,141,114, 10, - 96,139,114, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 5, 0, 0, -111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, - 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176,141,114, 10, -198, 0, 0, 0, 1, 0, 0, 0,216,142,114, 10,136,140,114, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,251, 5, 0, 0,251, 5, 0, 0,111, 0, 0, 0,223, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,216,142,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176,141,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 5, 0, 0,111, 0, 0, 0,223, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 5,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,144,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, 0,144,114, 10,158, 0, 0, 0, 1, 0, 0, 0, - 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 79,145, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, - 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0, -185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, -178,157,229, 62,241,130,233,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 14, 28, 97, 63, 9, 46,185, 62, 35, 44,185, 62, -145,180,109,188,119, 15,130, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, -112,240,191, 62,108,116, 85, 63, 80,184, 70,188, 0, 0, 46,180,159, 49,181,189,125,172, 46, 61, 7,213, 73, 62, 0, 64,143,180, -182,107, 25,196, 13,135,135, 67, 70, 12,167,195, 71, 0, 72,194,225, 56, 25, 68, 38, 90,135,195,237,212,166, 67, 84, 2, 72, 66, - 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0, -162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, -178,157,229, 62,241,130,233,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 14, 28, 97, 63, 9, 46,185, 62, 35, 44,185, 62, -145,180,109,188,119, 15,130, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 13,114,156, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120,147,114, 10,159, 0, 0, 0, 1, 0, 0, 0,240,150,114, 10, - 40,137,114, 10, 56,138,114, 10,216,142,114, 10, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,148,114, 10, -198, 0, 0, 0, 1, 0, 0, 0,200,149,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,200,149,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160,148,114, 10, 0, 0, 64,192, - 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, - 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0,240,150,114, 10,174, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,120,147,114, 10,160,148,114, 10,200,149,114, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,208,151,114, 10, -197, 0, 0, 0, 1, 0, 0, 0,184,192,114, 10,248,131,114, 10,152,112,114, 10, 88,111,114, 10, 88,112,114, 10,216,112,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, 85, 1, 0, 0,186, 2, 0, 0, 2, 2, 52, 2,102, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,157,114, 10,216,191,114, 10, 96,152,114, 10,216,155,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,152,114, 10,198, 0, 0, 0, 1, 0, 0, 0,136,153,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 93, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 13, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 52, 2, 26, 0, 52, 2, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, - 85, 1, 0, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 2, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,153,114, 10, -198, 0, 0, 0, 1, 0, 0, 0,176,154,114, 10, 96,152,114, 10, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,157,195, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, - 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, - 0, 0, 0, 4, 6, 0,217, 0, 76, 1,200, 0, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,111, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,217, 0, 76, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,176,154,114, 10,198, 0, 0, 0, 1, 0, 0, 0,216,155,114, 10,136,153,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, 51, 2, 0, 0,111, 1, 0, 0,186, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,155,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,176,154,114, 10, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0, 90, 1, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 90, 1, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0,111, 18,131, 58,111, 18,131, 58, - 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 91, 1, - 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, - 51, 2, 0, 0,111, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 1, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, - 0,157,114, 10,163, 0, 0, 0, 1, 0, 0, 0,200,161,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8,158,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,158,114, 10, 22, 1, 0, 0, 1, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80,158,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,120,159,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 38, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, - 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,152, 2, 26, 0,152, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,151, 2, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,120,159,114, 10,198, 0, 0, 0, 1, 0, 0, 0,160,160,114, 10, 80,158,114, 10, 0, 0, 0, 0, 0, 0, 55, 67, - 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 67, 0,128, 4,196, 0, 0, 64,193, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,180, 0, 0, 0, - 18, 0, 0, 0, 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 8, 0, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,181, 0, 24, 2,181, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180, 0, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181, 0, 24, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,160,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -120,159,114, 10, 0, 0, 32,193, 0, 0,104, 68,171,170, 67,195, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68,171,170, 67,195, - 0, 0, 0, 0,210, 1, 0, 0,227, 1, 0, 0, 18, 0, 0, 0, 23, 2, 0, 0, 0, 0, 0, 0,209, 1, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,209, 1, 0, 0, 18, 0, 0, 0, 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, - 0, 64, 28, 70, 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,227, 1, 24, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181, 0, 0, 0,151, 2, 0, 0, -251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,227, 1, 24, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,200,161,114, 10, - 23, 1, 0, 0, 1, 0, 0, 0, 80,166,114, 10, 0,157,114, 10, 80,158,114, 10,160,160,114, 10, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,240,212,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 2, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,162,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,164,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 3, 26, 0,160, 3, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0, - 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,164,114, 10, -198, 0, 0, 0, 1, 0, 0, 0, 40,165,114, 10,216,162,114, 10, 0, 0, 0, 0, 0, 0, 44, 67, 0,128,100,196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 44, 67, 0,128,100,196, 0, 0, 0, 0,172, 0, 0, 0,189, 0, 0, 0, 18, 0, 0, 0,163, 3, 0, 0, - 0, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,171, 0, 0, 0, 18, 0, 0, 0,163, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 0, 6, 0,189, 0,164, 3,172, 0,146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 40,165,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,164,114, 10, 0, 0, 0, 0, - 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0,168,191, 0, 0, 20, 64, 0, 0,169,191, 0,128, 20, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 3, 0, 0, 0, 0, 0, 0,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 3, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 12, 0, 0, 80,166,114, 10,169, 0, 0, 0, 1, 0, 0, 0, - 96,188,114, 10,200,161,114, 10,216,162,114, 10, 40,165,114, 10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 32,179,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,180,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 42, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,168, 2, 26, 0,168, 2, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0, 85, 0, 0, 0,110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,180,114, 10,198, 0, 0, 0, 1, 0, 0, 0, -112,181,114, 10, 32,179,114, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, -255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, - 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,164, 3, - 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, -112,181,114, 10,198, 0, 0, 0, 1, 0, 0, 0,152,182,114, 10, 72,180,114, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, - 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, - 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,182,114, 10,198, 0, 0, 0, 1, 0, 0, 0,192,183,114, 10,112,181,114, 10, - 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0, -163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 2, 0, 0,167, 2, 0, 0,111, 0, 0, 0, - 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,192,183,114, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,152,182,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,167, 2, 0, 0,111, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168, 2,164, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,184,114, 10, 68, 65, 84, 65, - 72, 3, 0, 0,232,184,114, 10,158, 0, 0, 0, 1, 0, 0, 0,226,225,191, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, - 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, - 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, - 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, -164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,192, 90, 29, 63,208,249,224,190,222,160, 81,191,184,158, 81,191, -253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, 35, 44,185, 62,232,229,162,188,206,156,122, 63,129, 63,228,190, 42, 61,228,190, - 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,250, 8,140, 62,174,189, 27, 63,224, 25, 17,188, 0, 64,153,181, -195, 13,188,190,191, 73, 53, 62, 99,126, 81, 63, 0,128,163, 53,215,104, 25,196,134,132,135, 67, 37, 9,167,195,136,252, 71,194, - 3, 54, 25, 68,159, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, - 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,192, 90, 29, 63,208,249,224,190,222,160, 81,191,184,158, 81,191, -253,253,174, 63,140,225, 88, 62, 9, 46,185, 62, 35, 44,185, 62,232,229,162,188,206,156,122, 63,129, 63,228,190, 42, 61,228,190, - 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, -214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,172,148, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 96,188,114, 10,159, 0, 0, 0, 1, 0, 0, 0,216,191,114, 10, 80,166,114, 10, 32,179,114, 10,192,183,114, 10, 1, 0, 0, 0, - 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,189,114, 10,198, 0, 0, 0, 1, 0, 0, 0,176,190,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0, -126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176,190,114, 10,198, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,136,189,114, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192, -246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, - 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, - 8, 0,152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 4,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -180, 0, 0, 0,216,191,114, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,188,114, 10,136,189,114, 10,176,190,114, 10, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184,192,114, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208,151,114, 10, -216,112,114, 10, 88,112,114, 10,152,111,114, 10,216,111,114, 10, 0, 0, 0, 0, 53, 2, 0, 0,254, 4, 0, 0, 85, 1, 0, 0, -186, 2, 0, 0, 8, 8,202, 2,102, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,197,114, 10,176,211,114, 10, - 72,193,114, 10,192,196,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 72,193,114, 10,198, 0, 0, 0, 1, 0, 0, 0,112,194,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 15, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,128, 50, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65, 0, 64, 50, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,202, 2, 26, 0,202, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0,254, 4, 0, 0, 85, 1, 0, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,202, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112,194,114, 10,198, 0, 0, 0, 1, 0, 0, 0,152,195,114, 10, 72,193,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,254, 4, 0, 0,111, 1, 0, 0, -186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,195,114, 10,198, 0, 0, 0, - 1, 0, 0, 0,192,196,114, 10,112,194,114, 10, 0, 0,112,195, 0, 0,112, 67, 0, 0, 7,195, 0, 0, 7, 67,105, 42,145,196, -105, 42,145, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, - 0, 0,202, 2, 76, 1,202, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 2, 0, 0,254, 4, 0, 0,111, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 2, 76, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,192,196,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,195,114, 10, 0, 0, 0, 0, 0, 0,122, 67, - 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, - 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, - 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,232,197,114, 10,165, 0, 0, 0, 1, 0, 0, 0, 56,208,114, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -248, 0, 0, 0,248,198,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,200,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, - 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,232, 4, 26, 0,232, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,225, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,200,114, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,201,114, 10, -248,198,114, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, - 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, - 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0,153, 2, 0, 0, -251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 2, 0, 0, 5, 0, - 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,201,114, 10, -198, 0, 0, 0, 1, 0, 0, 0,112,202,114, 10, 32,200,114, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, - 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, - 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,153, 2, 0, 0,128, 7, 0, 0,251, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0,112,202,114, 10,198, 0, 0, 0, 1, 0, 0, 0,152,203,114, 10, 72,201,114, 10, 0, 0, 0, 0, - 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0, -180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,203,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,112,202,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 2, 0, 0, -128, 7, 0, 0,251, 1, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 24, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,204,114, 10, 68, 65, 84, 65, 72, 3, 0, 0, -192,204,114, 10,158, 0, 0, 0, 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, 7, 36, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, - 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190, -142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65, -111,121,173,192,248,209,213, 64, 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, - 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63,224,246, 70,188, 0,128, 32,182, 69,129, 32,190, -250,186,154, 61,170,205,178, 62, 0, 64, 1, 53,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68, -160, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63, -143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,180,157,229, 62,169,203,131,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, - 95, 27,254, 62, 9, 46,185, 62, 35, 44,185, 62,147,180,109,188,102,208, 18, 64,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, - 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65, -214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,218,210,190, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,208,114, 10, -159, 0, 0, 0, 1, 0, 0, 0,176,211,114, 10,232,197,114, 10,248,198,114, 10,152,203,114, 10, 1, 0, 0, 0, 51, 51, 51, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,248, 0, 0, 0, 96,209,114, 10,198, 0, 0, 0, 1, 0, 0, 0,136,210,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64,129, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,147, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,152, 4, 26, 0,152, 4, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0,101, 0, 0, 0,126, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,210,114, 10,198, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 96,209,114, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, - 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,151, 4, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, - 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,152, 4, -122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 4, 0, 0,127, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4,122, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, -176,211,114, 10,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56,208,114, 10, 96,209,114, 10,136,210,114, 10, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, - 83, 67, 0, 0,168, 5, 0, 0,240,212,114, 10,156, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,200,218,114, 10, 0, 0, 0, 0,152,236,114, 10,208,229,114, 10, 0, 0, 0, 0, 0, 0, 0, 0,104,220,114, 10, -248,220,114, 10,104,220,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,221,114, 10,168,216,113, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, - 32, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 25, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, - 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, - 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,225,114, 10, 40,225,114, 10, - 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 47, 47, 98, 97, 99,107, 98,117,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,173, 2, 95, 0,154,153,217, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78, - 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, - 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,216, 41, 76, 10, 0, 0, 0, 0, 0, 0, 0, 0,184, 42,115, 10, 1, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, - 0, 0, 0, 0, 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, -180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0, 68, 65, 84, 65, - 76, 0, 0, 0,200,218,114, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 64,219,114, 10, 64,219,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 76, 0, 0, 0, 64,219,114, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,110,101,116,119, -111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,184,219,114, 10,184,219,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 76, 0, 0, 0,184,219,114, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,101,114,118, -101,114, 95, 97,100,100,114,101,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48,220,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 68, 65, 84, 65, - 12, 0, 0, 0, 48,220,114, 10, 0, 0, 0, 0, 1, 0, 0, 0, 91,100,101,102, 97,117,108,116, 93, 0, 0, 0, 68, 65, 84, 65, - 28, 0, 0, 0,104,220,114, 10,132, 0, 0, 0, 1, 0, 0, 0,176,220,114, 10, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0,188, 1, 46, 1,160,240,114, 10, 68, 65, 84, 65, 28, 0, 0, 0,176,220,114, 10,132, 0, 0, 0, 1, 0, 0, 0, -248,220,114, 10,104,220,114, 10, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 61, 2,244, 1,168,244,114, 10, 68, 65, 84, 65, - 28, 0, 0, 0,248,220,114, 10,132, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176,220,114, 10, 1, 0, 0, 0, 3, 0, 0, 0, - 0, 4, 0, 0, 98, 0,106, 1,152,236,114, 10, 68, 65, 84, 65,136, 1, 0, 0, 64,221,114, 10,152, 0, 0, 0, 1, 0, 0, 0, -248,222,114, 10,152,223,114, 10, 56,224,114, 10, 0, 0,128, 63, 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, - 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,224,114, 10, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, - 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 10,215, 35, 60,205,204,204, 61, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61,102,102,166, 63, 0, 0,192, 63, 0, 0,240, 65, - 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 67, 2, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0,248,222,114, 10,151, 0, 0, 0, 1, 0, 0, 0, 80,223,114, 10, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0, 80,223,114, 10, 0, 0, 0, 0, 1, 0, 0, 0, 88, 78,115, 10, - 8, 41,115, 10, 8, 98,115, 10,160, 81,115, 10,136, 45,115, 10, 16, 75,115, 10, 96, 55,115, 10, 68, 65, 84, 65, 44, 0, 0, 0, -152,223,114, 10,151, 0, 0, 0, 1, 0, 0, 0,240,223,114, 10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,200,200,255,128, - 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0, -240,223,114, 10, 0, 0, 0, 0, 1, 0, 0, 0, 88, 78,115, 10, 8, 41,115, 10, 8, 98,115, 10,160, 81,115, 10,136, 45,115, 10, - 16, 75,115, 10, 96, 55,115, 10, 68, 65, 84, 65, 48, 0, 0, 0, 56,224,114, 10,150, 0, 0, 0, 1, 0, 0, 0,152,224,114, 10, - 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152,224,114, 10, 0, 0, 0, 0, 1, 0, 0, 0, -168, 58,115, 10,120, 91,115, 10,232, 84,115, 10,128, 68,115, 10, 56, 65,115, 10,200, 71,115, 10,240, 61,115, 10,208, 48,115, 10, - 68, 65, 84, 65, 16, 0, 0, 0,232,224,114, 10, 0, 0, 0, 0, 1, 0, 0, 0,168, 58,115, 10,192, 94,115, 10, 24, 52,115, 10, - 48, 88,115, 10, 68, 65, 84, 65, 72, 0, 0, 0, 40,225,114, 10,138, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82,101,110,100,101,114, 76, 97,121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 67, 65, 0, 0,120, 0, 0, 0,160,225,114, 10, 29, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,145,137, 68, 66,205,204,204, 61, 0, 0,200, 66, - 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,140, 1, 0, 0, 72,226,114, 10, 41, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0,228,114, 10, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,128,229,114, 10, 68, 65, 84, 65, 8, 1, 0, 0, 0,228,114, 10, 78, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63, -242, 4, 53,191,243, 4, 53, 63, 56,229,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,229,114, 10, 76, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,128,229,114, 10, - 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0,120, 1, 0, 0,208,229,114, 10,131, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 99, 80, 61, -114, 99, 80, 61,114, 99, 80, 61, 0, 0, 0, 0,199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,128, 63, -205,204, 76, 61, 0, 0, 5, 0, 3, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 0, 0,120, 0, 0, 0,120,231,114, 10, - 27, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 1, 0, 0, 0, 32,232,114, 10, 32,232,114, 10, 32,232,114, 10, 32,232,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,104,232,114, 10,255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 32,232,114, 10, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 17, 77, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 82, 70, 68, 65, 84, 65, 4, 0, 0, 0,168, 17, 77, 10, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 0, 79, 66, 0, 0,220, 3, 0, 0,152,236,114, 10,120, 0, 0, 0, 1, 0, 0, 0,160,240,114, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,225,114, 10, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, - 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, - 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, - 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63,125,103,133, 51,176,219,194,178, 0, 0, 0, 0,190, 32, 66, 51, 1, 0,128, 63,168,200,153, 51, 0, 0, 0, 0, - 32,206, 18,179,126,126,149, 50, 1, 0,128, 63, 0, 0, 0, 0,241,251,133, 52,172,182, 27,180,174,236,252, 51, 0, 0,128, 63, - 0, 0,128, 63,157,190,215, 49,167,170, 4, 52, 0, 0, 0,128,129,116,157,178, 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, - 73,254, 67, 51,243, 97,106, 49, 0, 0,128, 63, 0, 0, 0,128, 3, 0, 64, 52,183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, - 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63, -205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, - 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,160,240,114, 10, -120, 0, 0, 0, 1, 0, 0, 0,168,244,114, 10,152,236,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112, -104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 97,112, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 31,115, 10, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,141, 77, 10,232,203, 77, 10, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,222,149, 47, 63, 52, 70, 58, 63,179, 56, 49,188, 0, 0, 0,128, - 86,126,162,190,227,251,159, 62, 56, 53,101, 63, 0, 0, 0,128, 7,165, 39, 63,149, 84, 28,191, 50,247,227, 62, 0, 0, 0,128, -110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, - 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, - 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 64, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,158, 93, 10,168, 91,112, 11, - 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,240,141, 77, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 4, 0, 0, 0,232,203, 77, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,168,244,114, 10, -120, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160,240,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72,226,114, 10, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64, -183,178,128, 63,112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61, -229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0, -221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0, -154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 35,233,134, 49,251,110, 17,179, 0, 0, 0, 0, - 49,158,141, 50, 1, 0,128, 63,126,214,237, 50, 0, 0, 0, 0,155,248, 28,178,199,139, 96,177,254,255,127, 63, 0, 0, 0, 0, - 80,136,159,178,192, 4,158,178,209,114,143,179, 0, 0,128, 63, 53,236,148,190,222,102, 69,191, 37,255, 16, 63, 0, 0, 0,128, - 24,134,116, 63, 57,174, 76,190,240,161, 95, 62, 0, 0, 0,128,235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, 0, 0, 0,128, -208, 19, 13, 63,234, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, - 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, - 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 65, 0, 0,160, 2, 0, 0,176,248,114, 10, 44, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 50, 0,205,204, 76, 62, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 4, 0, 67, 0, 0, 3, 67, 0, 0, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0,128, 64, 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, -128,251,114, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,252,114, 10, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63, -111,148, 26, 63,111,148, 26, 63,205,204, 76, 61,205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, -128,251,114, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 13,115, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 2, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,144, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 32, 0, 0, 0,184,252,114, 10, - 19, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 8,253,114, 10, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0, 8,253,114, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 2, 51, 2, 2, 2, 51, 6, 6, 6,153, 6, 6, 6,153, 6, 6, 6,153, - 4, 4, 4,102, 3, 3, 3,102, 2, 2, 2, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 3, 51, 8, 8, 8,153, 11, 11, 11,204, 13, 13, 13,255, 12, 12, 12,255, 12, 12, 12,255, 11, 11, 11,255, 10, 10, 10,255, - 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 4, 4, 4,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 3, 3, 51, 10, 10, 10,153, - 18, 18, 18,255, 20, 20, 20,255, 22, 22, 22,255, 23, 23, 23,255, 22, 22, 22,255, 20, 20, 20,255, 19, 19, 19,255, 16, 16, 16,255, - 14, 14, 14,255, 11, 11, 11,255, 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 8, 8, 8,204, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,102, 19, 19, 19,204, 27, 27, 27,255, - 31, 31, 31,255, 32, 32, 32,255, 33, 33, 33,255, 33, 33, 33,255, 31, 31, 31,255, 30, 30, 30,255, 27, 27, 27,255, 25, 25, 25,255, - 22, 22, 22,255, 19, 19, 19,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, - 4, 4, 4,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,153, 29, 29, 29,255, 37, 37, 37,255, 40, 40, 40,255, - 42, 42, 42,255, 42, 42, 42,255, 43, 43, 43,255, 41, 41, 41,255, 40, 40, 40,255, 38, 38, 38,255, 36, 36, 36,255, 33, 33, 33,255, - 30, 30, 30,255, 27, 27, 27,255, 24, 24, 24,255, 20, 20, 20,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, - 10, 10, 10,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 37, 37, 37,255, 44, 44, 44,255, 48, 48, 48,255, 50, 50, 50,255, - 51, 51, 51,255, 51, 51, 51,255, 50, 50, 50,255, 49, 49, 49,255, 48, 48, 48,255, 45, 45, 45,255, 43, 43, 43,255, 41, 41, 41,255, - 37, 37, 37,255, 34, 34, 34,255, 31, 31, 31,255, 28, 28, 28,255, 24, 24, 24,255, 20, 20, 20,255, 15, 15, 15,255, 11, 11, 11,255, - 10, 10, 10,255, 11, 11, 11,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 41, 41, 41,255, 50, 50, 50,255, 54, 54, 54,255, 57, 57, 57,255, 58, 58, 58,255, - 59, 59, 59,255, 59, 59, 59,255, 58, 58, 58,255, 57, 57, 57,255, 55, 55, 55,255, 53, 53, 53,255, 51, 51, 51,255, 48, 48, 48,255, - 45, 45, 45,255, 41, 41, 41,255, 38, 38, 38,255, 35, 35, 35,255, 31, 31, 31,255, 27, 27, 27,255, 23, 23, 23,255, 17, 17, 17,255, - 12, 12, 12,255, 11, 11, 11,255, 11, 11, 11,255, 5, 5, 5,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36,204, 53, 53, 53,255, 59, 59, 59,255, 63, 63, 63,255, 65, 65, 65,255, 66, 66, 66,255, - 66, 66, 66,255, 66, 66, 66,255, 65, 65, 65,255, 64, 64, 64,255, 62, 62, 62,255, 60, 60, 60,255, 57, 57, 57,255, 54, 54, 54,255, - 51, 51, 51,255, 48, 48, 48,255, 44, 44, 44,255, 41, 41, 41,255, 37, 37, 37,255, 33, 33, 33,255, 29, 29, 29,255, 24, 24, 24,255, - 19, 19, 19,255, 13, 13, 13,255, 11, 11, 11,255, 12, 12, 12,255, 3, 3, 3, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 19, 19,102, 56, 56, 56,255, 64, 64, 64,255, 68, 68, 68,255, 71, 71, 71,255, 73, 73, 73,255, 74, 74, 74,255, - 74, 74, 74,255, 73, 73, 73,255, 72, 72, 72,255, 71, 71, 71,255, 69, 69, 69,255, 67, 67, 67,255, 64, 64, 64,255, 61, 61, 61,255, - 58, 58, 58,255, 54, 54, 54,255, 50, 50, 50,255, 47, 47, 47,255, 43, 43, 43,255, 39, 39, 39,255, 34, 34, 34,255, 30, 30, 30,255, - 25, 25, 25,255, 19, 19, 19,255, 13, 13, 13,255, 12, 12, 12,255, 10, 10, 10,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 54, 54,255, 66, 66, 66,255, 72, 72, 72,255, 77, 77, 77,255, 79, 79, 79,255, 81, 81, 81,255, 81, 81, 81,255, - 81, 81, 81,255, 80, 80, 80,255, 79, 79, 79,255, 77, 77, 77,255, 75, 75, 75,255, 73, 73, 73,255, 70, 70, 70,255, 67, 67, 67,255, - 63, 63, 63,255, 60, 60, 60,255, 56, 56, 56,255, 52, 52, 52,255, 49, 49, 49,255, 44, 44, 44,255, 40, 40, 40,255, 35, 35, 35,255, - 30, 30, 30,255, 24, 24, 24,255, 18, 18, 18,255, 12, 12, 12,255, 12, 12, 12,255, 6, 6, 6,102, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 22, 22,102, 67, 67, 67,255, 76, 76, 76,255, 81, 81, 81,255, 84, 84, 84,255, 87, 87, 87,255, 88, 88, 88,255, 88, 88, 88,255, - 88, 88, 88,255, 87, 87, 87,255, 86, 86, 86,255, 84, 84, 84,255, 82, 82, 82,255, 79, 79, 79,255, 76, 76, 76,255, 73, 73, 73,255, - 69, 69, 69,255, 65, 65, 65,255, 62, 62, 62,255, 58, 58, 58,255, 54, 54, 54,255, 49, 49, 49,255, 45, 45, 45,255, 40, 40, 40,255, - 35, 35, 35,255, 29, 29, 29,255, 23, 23, 23,255, 16, 16, 16,255, 12, 12, 12,255, 12, 12, 12,204, 0, 0, 0, 0, 0, 0, 0, 0, - 49, 49, 49,204, 76, 76, 76,255, 84, 84, 84,255, 89, 89, 89,255, 92, 92, 92,255, 94, 94, 94,255, 95, 95, 95,255, 95, 95, 95,255, - 95, 95, 95,255, 94, 94, 94,255, 93, 93, 93,255, 91, 91, 91,255, 88, 88, 88,255, 85, 85, 85,255, 82, 82, 82,255, 79, 79, 79,255, - 75, 75, 75,255, 71, 71, 71,255, 67, 67, 67,255, 63, 63, 63,255, 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, 45, 45, 45,255, - 40, 40, 40,255, 34, 34, 34,255, 28, 28, 28,255, 21, 21, 21,255, 13, 13, 13,255, 14, 14, 14,255, 0, 0, 0, 0, 14, 14, 14,102, - 70, 70, 70,255, 85, 85, 85,255, 92, 92, 92,255, 97, 97, 97,255,100,100,100,255,102,102,102,255,102,102,102,255,103,103,103,255, -102,102,102,255,101,101,101,255, 99, 99, 99,255, 97, 97, 97,255, 94, 94, 94,255, 91, 91, 91,255, 88, 88, 88,255, 84, 84, 84,255, - 81, 81, 81,255, 77, 77, 77,255, 72, 72, 72,255, 68, 68, 68,255, 64, 64, 64,255, 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, - 44, 44, 44,255, 39, 39, 39,255, 32, 32, 32,255, 25, 25, 25,255, 17, 17, 17,255, 13, 13, 13,255, 7, 7, 7,102, 24, 24, 24,102, - 80, 80, 80,255, 93, 93, 93,255,100,100,100,255,104,104,104,255,107,107,107,255,109,109,109,255,109,109,109,255,109,109,109,255, -109,109,109,255,107,107,107,255,106,106,106,255,103,103,103,255,100,100,100,255, 97, 97, 97,255, 94, 94, 94,255, 90, 90, 90,255, - 86, 86, 86,255, 82, 82, 82,255, 77, 77, 77,255, 73, 73, 73,255, 69, 69, 69,255, 64, 64, 64,255, 59, 59, 59,255, 54, 54, 54,255, - 49, 49, 49,255, 43, 43, 43,255, 36, 36, 36,255, 29, 29, 29,255, 21, 21, 21,255, 14, 14, 14,255, 10, 10, 10,153, 29, 29, 29,102, - 89, 89, 89,255,100,100,100,255,107,107,107,255,112,112,112,255,114,114,114,255,116,116,116,255,116,116,116,255,116,116,116,255, -115,115,115,255,114,114,114,255,112,112,112,255,110,110,110,255,107,107,107,255,104,104,104,255,100,100,100,255, 96, 96, 96,255, - 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255, 68, 68, 68,255, 63, 63, 63,255, 58, 58, 58,255, - 52, 52, 52,255, 46, 46, 46,255, 40, 40, 40,255, 33, 33, 33,255, 24, 24, 24,255, 17, 17, 17,255, 13, 13, 13,204, 46, 46, 46,153, - 95, 95, 95,255,107,107,107,255,114,114,114,255,118,118,118,255,121,121,121,255,122,122,122,255,123,123,123,255,123,123,123,255, -122,122,122,255,122,122,122,255,120,120,120,255,118,118,118,255,114,114,114,255,110,110,110,255,106,106,106,255,101,101,101,255, - 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255, 68, 68, 68,255, 62, 62, 62,255, - 56, 56, 56,255, 50, 50, 50,255, 44, 44, 44,255, 36, 36, 36,255, 28, 28, 28,255, 19, 19, 19,255, 12, 12, 12,204, 47, 47, 47,153, -101,101,101,255,113,113,113,255,120,120,120,255,125,125,125,255,127,127,127,255,129,129,129,255,130,130,130,255,130,130,130,255, -131,131,131,255,131,131,131,255,131,131,131,255,129,129,129,255,125,125,125,255,120,120,120,255,113,113,113,255,108,108,108,255, -103,103,103,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 82, 82, 82,255, 77, 77, 77,255, 72, 72, 72,255, 66, 66, 66,255, - 60, 60, 60,255, 54, 54, 54,255, 47, 47, 47,255, 39, 39, 39,255, 31, 31, 31,255, 22, 22, 22,255, 12, 12, 12,204, 48, 48, 48,153, -106,106,106,255,118,118,118,255,126,126,126,255,131,131,131,255,134,134,134,255,135,135,135,255,137,137,137,255,138,138,138,255, -142,142,142,255,147,147,147,255,149,149,149,255,148,148,148,255,142,142,142,255,133,133,133,255,124,124,124,255,115,115,115,255, -108,108,108,255,102,102,102,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 81, 81, 81,255, 75, 75, 75,255, 69, 69, 69,255, - 63, 63, 63,255, 57, 57, 57,255, 49, 49, 49,255, 42, 42, 42,255, 33, 33, 33,255, 24, 24, 24,255, 9, 9, 9,153, 32, 32, 32,102, -109,109,109,255,123,123,123,255,131,131,131,255,136,136,136,255,140,140,140,255,142,142,142,255,144,144,144,255,148,148,148,255, -156,156,156,255,168,168,168,255,176,176,176,255,177,177,177,255,168,168,168,255,153,153,153,255,137,137,137,255,124,124,124,255, -114,114,114,255,107,107,107,255,101,101,101,255, 96, 96, 96,255, 90, 90, 90,255, 85, 85, 85,255, 79, 79, 79,255, 72, 72, 72,255, - 66, 66, 66,255, 59, 59, 59,255, 52, 52, 52,255, 44, 44, 44,255, 35, 35, 35,255, 26, 26, 26,255, 10, 10, 10,153, 17, 17, 17, 51, -110,110,110,255,127,127,127,255,136,136,136,255,142,142,142,255,145,145,145,255,148,148,148,255,151,151,151,255,159,159,159,255, -174,174,174,255,195,195,195,255,212,212,212,255,216,216,216,255,204,204,204,255,179,179,179,255,154,154,154,255,135,135,135,255, -121,121,121,255,112,112,112,255,106,106,106,255, 99, 99, 99,255, 94, 94, 94,255, 88, 88, 88,255, 82, 82, 82,255, 76, 76, 76,255, - 69, 69, 69,255, 62, 62, 62,255, 54, 54, 54,255, 46, 46, 46,255, 37, 37, 37,255, 26, 26, 26,255, 6, 6, 6,102, 0, 0, 0, 0, -107,107,107,255,130,130,130,255,140,140,140,255,146,146,146,255,150,150,150,255,153,153,153,255,158,158,158,255,169,169,169,255, -191,191,191,255,219,219,219,255,246,246,246,255,254,254,254,255,237,237,237,255,204,204,204,255,170,170,170,255,145,145,145,255, -127,127,127,255,117,117,117,255,110,110,110,255,103,103,103,255, 97, 97, 97,255, 91, 91, 91,255, 85, 85, 85,255, 78, 78, 78,255, - 71, 71, 71,255, 64, 64, 64,255, 55, 55, 55,255, 47, 47, 47,255, 37, 37, 37,255, 25, 25, 25,255, 3, 3, 3, 51, 0, 0, 0, 0, - 65, 65, 65,153,129,129,129,255,142,142,142,255,149,149,149,255,154,154,154,255,157,157,157,255,163,163,163,255,176,176,176,255, -199,199,199,255,232,232,232,255,255,255,255,255,255,255,255,255,255,255,255,255,220,220,220,255,181,181,181,255,151,151,151,255, -132,132,132,255,121,121,121,255,113,113,113,255,106,106,106,255,100,100,100,255, 94, 94, 94,255, 87, 87, 87,255, 80, 80, 80,255, - 73, 73, 73,255, 65, 65, 65,255, 57, 57, 57,255, 48, 48, 48,255, 38, 38, 38,255, 16, 16, 16,153, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 21, 21, 51,127,127,127,255,143,143,143,255,152,152,152,255,157,157,157,255,161,161,161,255,165,165,165,255,177,177,177,255, -198,198,198,255,227,227,227,255,253,253,253,255,255,255,255,255,250,250,250,255,217,217,217,255,181,181,181,255,153,153,153,255, -135,135,135,255,124,124,124,255,117,117,117,255,110,110,110,255,103,103,103,255, 96, 96, 96,255, 89, 89, 89,255, 82, 82, 82,255, - 74, 74, 74,255, 66, 66, 66,255, 57, 57, 57,255, 48, 48, 48,255, 35, 35, 35,255, 10, 10, 10,153, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 93, 93, 93,204,141,141,141,255,153,153,153,255,159,159,159,255,163,163,163,255,167,167,167,255,174,174,174,255, -188,188,188,255,209,209,209,255,228,228,228,255,234,234,234,255,224,224,224,255,200,200,200,255,173,173,173,255,151,151,151,255, -136,136,136,255,127,127,127,255,119,119,119,255,112,112,112,255,105,105,105,255, 98, 98, 98,255, 91, 91, 91,255, 83, 83, 83,255, - 75, 75, 75,255, 66, 66, 66,255, 57, 57, 57,255, 46, 46, 46,255, 24, 24, 24,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 20, 20, 51,134,134,134,255,151,151,151,255,160,160,160,255,164,164,164,255,167,167,167,255,171,171,171,255, -178,178,178,255,189,189,189,255,200,200,200,255,202,202,202,255,195,195,195,255,180,180,180,255,163,163,163,255,148,148,148,255, -137,137,137,255,129,129,129,255,121,121,121,255,114,114,114,255,107,107,107,255, 99, 99, 99,255, 91, 91, 91,255, 83, 83, 83,255, - 74, 74, 74,255, 65, 65, 65,255, 55, 55, 55,255, 41, 41, 41,255, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49,102,145,145,145,255,157,157,157,255,164,164,164,255,167,167,167,255,170,170,170,255, -172,172,172,255,176,176,176,255,180,180,180,255,179,179,179,255,174,174,174,255,165,165,165,255,155,155,155,255,145,145,145,255, -137,137,137,255,130,130,130,255,122,122,122,255,115,115,115,255,107,107,107,255, 99, 99, 99,255, 91, 91, 91,255, 82, 82, 82,255, - 73, 73, 73,255, 63, 63, 63,255, 50, 50, 50,255, 22, 22, 22,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,149,149,149,255,160,160,160,255,166,166,166,255,168,168,168,255, -169,169,169,255,170,170,170,255,169,169,169,255,167,167,167,255,164,164,164,255,158,158,158,255,151,151,151,255,144,144,144,255, -137,137,137,255,130,130,130,255,123,123,123,255,115,115,115,255,106,106,106,255, 98, 98, 98,255, 89, 89, 89,255, 80, 80, 80,255, - 70, 70, 70,255, 58, 58, 58,255, 27, 27, 27,153, 3, 3, 3, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,153,150,150,150,255,160,160,160,255,165,165,165,255, -167,167,167,255,167,167,167,255,166,166,166,255,163,163,163,255,160,160,160,255,155,155,155,255,149,149,149,255,143,143,143,255, -137,137,137,255,129,129,129,255,121,121,121,255,113,113,113,255,105,105,105,255, 96, 96, 96,255, 86, 86, 86,255, 76, 76, 76,255, - 63, 63, 63,255, 38, 38, 38,204, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,147,147,147,255,157,157,157,255, -161,161,161,255,163,163,163,255,162,162,162,255,160,160,160,255,157,157,157,255,152,152,152,255,147,147,147,255,141,141,141,255, -135,135,135,255,127,127,127,255,119,119,119,255,110,110,110,255,101,101,101,255, 91, 91, 91,255, 80, 80, 80,255, 66, 66, 66,255, - 32, 32, 32,153, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134,134,134,255, -148,148,148,255,154,154,154,255,155,155,155,255,154,154,154,255,152,152,152,255,147,147,147,255,142,142,142,255,136,136,136,255, -130,130,130,255,122,122,122,255,114,114,114,255,104,104,104,255, 93, 93, 93,255, 81, 81, 81,255, 54, 54, 54,204, 22, 22, 22,102, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 73, 73,153,103,103,103,204,137,137,137,255,140,140,140,255,140,140,140,255,137,137,137,255,133,133,133,255,127,127,127,255, -120,120,120,255,113,113,113,255,102,102,102,255, 91, 91, 91,255, 64, 64, 64,204, 28, 28, 28,102, 6, 6, 6, 51, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46,102, 72, 72, 72,153, 72, 72, 72,153, 92, 92, 92,204, 88, 88, 88,204, - 81, 81, 81,204, 54, 54, 54,153, 35, 35, 35,102, 16, 16, 16, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0, - 40, 1, 0, 0, 56, 13,115, 10, 39, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,144, 14,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -144, 14,115, 10, 19, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0,224, 14,115, 10, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0,224, 14,115, 10, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, - 77, 69, 0, 0, 40, 1, 0, 0, 16, 31,115, 10, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80,241, 78, 10,152, 38,115, 10, 64, 39,115, 10, 0, 0, 0, 0,232, 33,115, 10, 88, 36,115, 10, 0, 0, 0, 0,120, 40,115, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 32,115, 10, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 34,115, 10, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 37,115, 10, 3, 0, 0, 0, 5, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 51, - 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 4, 0, 0, 0, 80,241, 78, 10, 0, 0, 0, 0, 1, 0, 0, 0,176,248,114, 10, 68, 65, 84, 65, 84, 1, 0, 0,104, 32,115, 10, - 82, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,232, 33,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -192, 0, 0, 0,232, 33,115, 10, 60, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, - 26,182,255,127, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255,127, 1, 0, 0, 0, - 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,250,255,127,191, 3, 0,128, 63, - 0, 0,128,191, 26,182,230, 73, 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73, -230, 73,255,127, 1, 0, 0, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255,127, 1, 0, 0, 0, - 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,255,255,127,191, 0, 0,128, 63, - 0, 0,128, 63, 26,182,230, 73,230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,216, 34,115, 10, 82, 1, 0, 0, - 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 36,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0, - 88, 36,115, 10, 57, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, - 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, - 84, 1, 0, 0, 24, 37,115, 10, 82, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 38,115, 10, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 39,115, 10, 6, 0, 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 40,115, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,152, 38,115, 10, 56, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 8, 1, 0, 0, 64, 39,115, 10, 67, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120, 40,115, 10, 61, 0, 0, 0, 24, 0, 0, 0, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 66, 82, 0, 0,132, 1, 0, 0, 8, 41,115, 10, 81, 1, 0, 0, 1, 0, 0, 0,136, 45,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 82, 65,100,100, 0,104, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,240, 43,115, 10, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63, -205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 1, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, - 84, 41,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,240, 43,115, 10, - 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, - 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 40, 45,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 40, 45,115, 10, 76, 1, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, - 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,136, 45,115, 10, - 81, 1, 0, 0, 1, 0, 0, 0,208, 48,115, 10, 8, 41,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46, - 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 56, 47,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 1, 4, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,212, 45,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 56, 47,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, - 46,189,194, 61,112, 48,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,112, 48,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,208, 48,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, 24, 52,115, 10, -136, 45,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 0,128, 50,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, - 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 8, 0, 0, 0, - 68, 65, 84, 65, 8, 1, 0, 0, 28, 49,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, - 8, 1, 0, 0,128, 50,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,184, 51,115, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -184, 51,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, - 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, -132, 1, 0, 0, 24, 52,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, 96, 55,115, 10,208, 48,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200, 53,115, 10, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 3, 0, 68, 65, 84, 65, 8, 1, 0, 0,100, 52,115, 10, - 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,200, 53,115, 10, 78, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, - 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 0, 55,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 0, 55,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0, 96, 55,115, 10, 81, 1, 0, 0, - 1, 0, 0, 0,168, 58,115, 10, 24, 52,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, 0, 48, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 16, 57,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 1, 6, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,172, 55,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 16, 57,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, - 72, 58,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0, 72, 58,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,168, 58,115, 10, 81, 1, 0, 0, 1, 0, 0, 0,240, 61,115, 10, 96, 55,115, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68,114, 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 88, 60,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 0, 0, 68, 65, 84, 65, - 8, 1, 0, 0,244, 58,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, - 88, 60,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, - 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,144, 61,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,144, 61,115, 10, - 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, - 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0, -240, 61,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, 56, 65,115, 10,168, 58,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, - 97,116,116,101,110, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,160, 63,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 7, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 60, 62,115, 10, 32, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,160, 63,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, - 14,215,126,191, 46,189,194, 61,216, 64,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216, 64,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0, 56, 65,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, -128, 68,115, 10,240, 61,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0,232, 66,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 5, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,132, 65,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 8, 1, 0, 0,232, 66,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, - 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 32, 68,115, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 48, 0, 0, 0, 32, 68,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, - 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0,132, 1, 0, 0,128, 68,115, 10, 81, 1, 0, 0, 1, 0, 0, 0,200, 71,115, 10, 56, 65,115, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,101, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 48, 70,115, 10, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63, -205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 4, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, -204, 68,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 48, 70,115, 10, - 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, - 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,104, 71,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,104, 71,115, 10, 76, 1, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, - 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,200, 71,115, 10, - 81, 1, 0, 0, 1, 0, 0, 0, 16, 75,115, 10,128, 68,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,121,101,114, 0, - 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,120, 73,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 6, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 20, 72,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,120, 73,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, - 46,189,194, 61,176, 74,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,176, 74,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0, 16, 75,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, 88, 78,115, 10, -200, 71,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 0,192, 76,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, - 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 5, 0, 0, - 68, 65, 84, 65, 8, 1, 0, 0, 92, 75,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, - 8, 1, 0, 0,192, 76,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, - 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,248, 77,115, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, -248, 77,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, - 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, -132, 1, 0, 0, 88, 78,115, 10, 81, 1, 0, 0, 1, 0, 0, 0,160, 81,115, 10, 16, 75,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 77,105,120, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8, 80,115, 10, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,164, 78,115, 10, - 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 8, 80,115, 10, 78, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, - 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 64, 81,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 64, 81,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,160, 81,115, 10, 81, 1, 0, 0, - 1, 0, 0, 0,232, 84,115, 10, 88, 78,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,108,116,105,112,108,121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 80, 83,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 1, 3, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,236, 81,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 80, 83,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, -136, 84,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 48, 0, 0, 0,136, 84,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,232, 84,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, 48, 88,115, 10,160, 81,115, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, -152, 86,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0, -102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 3, 0, 0, 0, 68, 65, 84, 65, - 8, 1, 0, 0, 52, 85,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, -152, 86,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, - 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,208, 87,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,208, 87,115, 10, - 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, - 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0, - 48, 88,115, 10, 81, 1, 0, 0, 1, 0, 0, 0,120, 91,115, 10,232, 84,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109, -101, 97,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,224, 89,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 2, 0, 68, 65, 84, 65, 8, 1, 0, 0,124, 88,115, 10, 32, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,224, 89,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, - 14,215,126,191, 46,189,194, 61, 24, 91,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24, 91,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0,120, 91,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, -192, 94,115, 10, 48, 88,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 49, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0, 40, 93,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 2, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,196, 91,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 68, 65, 84, 65, 8, 1, 0, 0, 40, 93,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, - 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 96, 94,115, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 48, 0, 0, 0, 96, 94,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, - 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 82, 0, 0,132, 1, 0, 0,192, 94,115, 10, 81, 1, 0, 0, 1, 0, 0, 0, 8, 98,115, 10,120, 91,115, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,112, 96,115, 10, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63, -205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 1, 0, 68, 65, 84, 65, 8, 1, 0, 0, - 12, 95,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,112, 96,115, 10, - 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, - 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,168, 97,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,168, 97,115, 10, 76, 1, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, - 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,132, 1, 0, 0, 8, 98,115, 10, - 81, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192, 94,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97, - 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,184, 99,115, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63,205,204, 76, 62, 1, 2, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 84, 98,115, 10, 32, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,184, 99,115, 10, 78, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, - 46,189,194, 61,240,100,115, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,240,100,115, 10, 76, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82,232, 11, 0, 0, 0, 85, 7, 9,192, 0, 0, 0, 1, 0, 0, 0, 33,152, 65, 0, - 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112, -111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, - 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, - 2, 0, 94, 1, 8, 0, 0, 0, 3, 0, 0, 0, 48, 52, 6, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, - 68,172, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0,104,113,115, 10, - 40,138,115, 10,160,162,164, 10,160,162,164, 10,112,243,164, 10,112,243,164, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 0, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63, -205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191, -154,153,153, 62,102,102,102, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, - 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, - 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 15, 0, 8, 0, 10, 0, -250, 0, 0, 0,100, 0,100, 0, 0, 0, 2, 0, 0, 0, 0, 0, 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,144, 24, 0, 0,104,113,115, 10,189, 0, 0, 0, 1, 0, 0, 0, 40,138,115, 10, 0, 0, 0, 0, - 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, - 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, - 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, - 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, - 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, - 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, - 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, - 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,160,160,160,255,255,255,255,255, 0, 0, 25, 0,236,255, 0, 0, - 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0, - 25, 25, 25,255,128,128,128,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0, 5, 0,251,255, 0, 0, - 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, -115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255,180, 0,255,255,153, 0,230,255, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, - 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, -255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, - 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 76, 76,255, 0, 0, 0, 0,250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,130,130,130,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, - 0, 0, 0, 0, 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, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,250,250,250,255,250,250,250,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, - 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255, -255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, - 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, - 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, -255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, - 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, - 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, - 3, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, - 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255, -255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, - 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128, -255,140, 0,255, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, - 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255, -109,145,131,255,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, -255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 34,221,221,255, - 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, -110,110,110,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -132,132,132,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,195,195,195,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, - 0, 0, 0, 0, 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, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255, -255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, -255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, - 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, - 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, -255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, - 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, - 0, 0, 0, 0, 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, 4, 0, 0, -155,155,155,160,100,100,100,255,108,105,111,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, - 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, -255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, - 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, - 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, - 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, - 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, - 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, -255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, - 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, - 96,128,255,255,255,255,255,255, 0,170, 0,255,220, 96, 96,255,220, 96, 96,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, - 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0, -169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, - 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0, -244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0, -111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0, -141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, - 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 24, 0, 0, 40,138,115, 10,189, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -104,113,115, 10, 82,111,117,110,100,101,100, 0, 0,101,119, 32, 85,115,101,114, 32, 84,104,101,109,101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 1, 0, 25, 0, -231,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0, -241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0, -241,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, - 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, - 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0, -241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0, -236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 46,124,217,204,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 25, 0, -236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255, -255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,175,175,175, 51, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0, -255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 51, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255, -217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, - 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, - 34,221,221,255, 0, 0, 0, 0,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 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, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,130, 0,255, - 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, -255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30, -200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,100, -143,143,143,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255, -135,177,125,255,255,255,255,255,255,255,255,255,255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,130, 0,255, 2, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255, -255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0, -255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,158,158,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,178,178,178,100,255,130, 0,100, - 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255,135,177,125,255,255,255,255,255, -255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,143,143,143,255, -200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,204,255,255,170,204, - 96,192, 64,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,143,143,143,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255, -178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228,156,198,255,255,255,170,255, 96,192, 64,255, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255, -255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0, -255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,130, 0,255, 0, 0, 0,255,144,144, 48,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255, -162, 95,111,255,109,145,131,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60,255,133, 0,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,195,195,195,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,127,112,112,100, 0, 0, 0, 0, - 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, -255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30, -200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,153,153,153,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255, -198,119,119,255,255, 0, 0,255, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255, -255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0, -255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,158,158,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255, 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, -143,143,143,255, 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,130, 0,255, - 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 10, -255,130, 0, 60,255,138, 48,255, 34,221,221,255, 0, 0, 0, 0,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 0,150,150,150,255,129,131,144,255,127,127,127,255,142,138,145,255,120,145,120,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255, -102,255,102,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, - 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, 34,221,221,255, 0, 0, 0, 0,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, -255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, - 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, - 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, - 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, - 0, 0, 0, 0,244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, - 0, 0, 0, 0,111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, - 0, 0, 0, 0,141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, - 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,236,218, 0, 0,160,161,188, 11, 0, 0, 0, 0, 1, 0, 0, 0, - 83, 68, 78, 65, 78, 65, 77, 69,118, 11, 0, 0, 42,110,101,120,116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102, -105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,119, 0,120,109,105,110, 0,120,109, 97,120, 0,121,109,105, -110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,112, 0,118, 97,108, 0,118, 97,108, 50, 0,116, -121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0, -100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,101,119,105,100, 0, 42,108,105, 98, 0,110, 97, -109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, - 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105, -108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, - 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0,112, 97,100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, - 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, - 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116, -121,112,101, 0,116,111,116,118,101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115, -107, 0,115,108,105,100,101, 95,109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114, -105,118,101,114, 0, 99,117,114,118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112, -111,115, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116, -115, 0,118,103,114,111,117,112, 91, 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, - 0, 42, 97,100,116, 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105, -122,101, 0, 98,108,111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112, -104, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0,115,116, 97,114, -116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, 42,110, 97,109, -101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99,117,114, 99, 0, -115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95,112,111,115, 0, -117,110,100,111, 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122,101, 0,115,101, -101,107, 0,112, 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 97,110,103,108,101, 0, 99,108,105,112,115,116, 97, 0, - 99,108,105,112,101,110,100, 0,108,101,110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119,115,105,122, -101, 0,115,104,105,102,116,120, 0,115,104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 89, 70, 95, 97,112, -101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115, 0, 89, 70, 95, - 98,107,104,114,111,116, 0, 42,100,111,102, 95,111, 98, 0,102,114, 97,109,101,110,114, 0,102,114, 97,109,101,115, 0,111,102, -102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116,105, 95, -105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,109,101,110,117,110,114, 0, 42,115, 99,101,110,101, 0,105, - 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, 0,115,111,117,114, 99, -101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114, -101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101, -112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,114,101,118,105,101,119, 0, 42,114,101,110,100, -101,114, 95,116,101,120,116, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109, -115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0, 97,115,112,120, 0, - 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116, -121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,114,111,106, -120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122, -101, 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, 97,112, -116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, 95,111, -117,116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55, 93, 0,114, 0,103, 0, - 98, 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, 97, 99, - 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105,114,114, -102, 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101,109,105, -116,102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108,102, 97, - 99, 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, 0, 99, -111,108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0,114,101, -102,108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, 97, 99, - 0,107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,108,105,102,101, -102, 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97, 99, 0,115,104, 97,100, -111,119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, 98,108,101,110,100,102, - 97, 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, - 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, - 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, - 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105, -111,110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97,116, 91, - 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, 99, 97, -108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, 0,108, - 97,115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115,111,102, -116,110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112,111,105, -110,116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, -111, 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111,105,110, -116, 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0,110,111, -105,115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97,100, 51, - 91, 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0, 42, 99,111, 98, 97, 0, -114,101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,102,111,114,109, 97,116, - 0,101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,108,116,105,112,108,105, -101,114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104, 91, 50, 52, 48, 93, 0, - 42,100, 97,116, 97,115,101,116, 0,110,111,105,115,101,115,105,122,101, 0,116,117,114, 98,117,108, 0, 98,114,105,103,104,116, - 0, 99,111,110,116,114, 97,115,116, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115, -105,122,101, 0,109,103, 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101, -115, 0,109,103, 95,111,102,102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0, -110,115, 95,111,117,116,115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, - 95,119, 52, 0,118,110, 95,109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0, -110,111,105,115,101,100,101,112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0, -110,111,105,115,101, 98, 97,115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111, -112,121,109,105,110, 0, 99,114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101, -114, 0, 97,102,109, 97,120, 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100, -105,115,116, 0,110, 97, 98,108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105, -110, 0, 42,101,110,118, 0, 42,112,100, 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0, -114,111,116, 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109, -111,100,101, 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119, -112, 97,100, 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101, -110,100, 0,104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115, -104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104, -114,101,115,104, 0,112, 97,100, 53, 91, 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114, -115, 0,102,105,108,116,101,114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, - 95,115, 97,109,112, 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97, -109,112, 95,116,121,112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, - 97, 95,115,105,122,101,121, 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, -114, 97,121, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115, -116,101,112, 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, - 0,104,111,114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98, -114,105,103,104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, - 95,108,105,103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105, -116,121, 0, 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101, -120,116,105,110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, - 99,116,111,114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107, -121, 95, 99,111,108,111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 0, 89, 70, 95,110,117,109,112,104,111,116,111,110,115, 0, - 89, 70, 95,110,117,109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,113,109, - 99, 0, 89, 70, 95, 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99, 98,108, -117,114, 0, 89, 70, 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,108,111, -119,111,102,115, 0, 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120, 91, 49, - 56, 93, 0,112,114, 95,116,101,120,116,117,114,101, 0,112, 97,100, 91, 51, 93, 0,100,101,110,115,105,116,121, 0,101,109,105, -115,115,105,111,110, 0,115, 99, 97,116,116,101,114,105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115, -115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,116,114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0, -114,101,102,108,101, 99,116,105,111,110, 95, 99,111,108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0, -100,101,112,116,104, 95, 99,117,116,111,102,102, 0, 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95, -116,121,112,101, 0,115,104, 97,100,101,102,108, 97,103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99, -104,101, 95,114,101,115,111,108,117,116,105,111,110, 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109, -115, 95,105,110,116,101,110,115,105,116,121, 0,109,115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116, -121,112,101, 0,115,112,101, 99,114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0, -109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, - 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112, -101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114, -101,115,110,101,108, 95,109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95, -116,114, 97, 0,102,114,101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105, -116, 0,116,120, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, - 95,116,114, 97, 0,104, 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103, -108,111,115,115, 95,116,114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111, -115,115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104, -114,101,115,104, 95,116,114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105, -114, 0,102, 97,100,101,116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102, -108, 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102, -108, 97,114,101,115,105,122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97, -110,100, 95,115,116, 97, 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116, -114, 97,110,100, 95,115,117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119, -105,100,116,104,102, 97,100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, - 0,108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0, -112,114, 95,116,121,112,101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0, -100,105,102,102, 95,115,104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115, -115, 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42, -114, 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, - 97,109,112,105,110, 95,115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101, -110,100, 95,115,112,101, 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99, -111,108, 0,114, 97,109,112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0, -102,104, 0,114,101,102,108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111, -100,101, 0,115,115,115, 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95, -101,114,114,111,114, 0,115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, - 97, 99, 0,115,115,115, 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, - 0,115,115,115, 95,102,108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117, -114,101,100, 0,103,112,117,109, 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, - 0,106, 49, 0,107, 49, 0,105, 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0, -113,117, 97,116, 91, 52, 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0, -115, 0, 42,109, 97,116, 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101, -109,115, 0, 42, 42,109, 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114, -101,110,100,101,114,115,105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, - 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0, -104,105,100,101, 0,118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114, -101,115,111,108,117, 0,114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, - 0,102,108, 97,103,118, 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101, -114,112, 0,114, 97,100,105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,104, 0, -110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, - 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42,112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97, -119,102,108, 97,103, 0,116,119,105,115,116, 95,109,111,100,101, 0,112, 97,100, 91, 50, 93, 0,116,119,105,115,116, 95,115,109, -111,111,116,104, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, - 0,101,120,116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110, -117, 0, 42,108, 97,115,116,115,101,108, 98,112, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108, -105,110,101,100,105,115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108, -112,111,115, 0,117,108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42, -115,116,114, 0, 42,115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, - 52, 93, 0, 42,118,102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, - 98,105, 0,115,101,112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42, -116, 98, 0,115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105, -110,102,111, 0,101,102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, - 0, 42,109,118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116, -105, 99,107,121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109, -101,115,104, 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111, -116,102, 97, 99,101, 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97, -103, 0, 99,117, 98,101,109, 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0, -115,117, 98,100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97, -103,101, 0,117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117, -110,119,114, 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, - 98,119,101,105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, - 51, 93, 0,110,111, 91, 51, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105, 0,115, - 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,109,105, -100, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, 0, 42, -118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,110,116, - 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,118,108, - 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, 97,115, -101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97, 99,101, -115, 0, 42,111,108,100, 95,101,100,103,101,115, 0, 42,101,114,114,111,114, 0,109,111,100,105,102,105,101,114, 0,115,117, 98, -100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109, 67, 97, 99,104,101, 0, 42,109, - 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,103,116,104, 0,114, 97,110,100, -111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101, -110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116, 95,111, 98, 0,111,102,102,115, -101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,116, 0,102,105,116, 95,116,121, -112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,115, 0,116,111,108,101,114, 97, -110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, - 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, - 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101, 91, 51, 50, 93, 0, 42,100,111, -109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,109,101, 0, 42,116,101,120,116,117,114,101, 0,115, -116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,101,108, 0,116,101,120,109, 97, -112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118,108, 97,121,101,114, 95,110, 97,109,101, 91, 51, - 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42, -105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112, -101, 99,116,121, 0,112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97, -116, 0, 42,111, 98,106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101, -105,103,104,116, 0,110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116, -105,109,101,111,102,102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116, -105, 0, 42,112,114,101,118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105, -110,118, 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100, -101,120, 0,102,111,114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, - 0, 42, 99,111,108,108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104, -101,115, 0, 42,120, 0, 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, - 42, 99,117,114,114,101,110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117, -109,118,101,114,116,115, 0,110,117,109,102, 97, 99,101,115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, - 99,102,114, 97, 0,111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, - 99,101, 0,103,114,105,100,115,105,122,101, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111, -115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117, -101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122, -101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110, -100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,115,121,115, 0,116, -111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,111,115, -105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103, -114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,116,111,116,108,118, -108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116, - 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107, - 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102, - 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111, -114,105,103,105,110, 79,112,116,115, 0, 99,114,101, 97,115,101, 95,105,110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117, -116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116, -115,118, 0,111,112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102, -118, 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0, -108, 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, - 0, 42,115, 99,117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0, -112, 97,114,115,117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111, -120,121, 95,103,114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111, -115,101,108,105, 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115, -116,114, 97,105,110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,101,114,115, - 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108, 0,100,108, -111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,100, -113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,105,115, 91, 51, 93, 0,114, -111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111, -110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102,108, - 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, 0, -110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99, 97,102,108, 97,103, 0,115, - 99, 97,118,105,115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110, 0,100,117,112,111,102,102, - 0,100,117,112,115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105, -110,101,114,116,105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105, -110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101, -115,115,105,110,103, 84,104,114,101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116, 0,100,116,120, 0,101,109, -112,116,121, 95,100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115, -105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116, -114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100, -101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102, -116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110, -115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108, -101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,102,108,117,105,100,115,105, -109, 70,108, 97,103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,110,114, 0,115,104, 97,112,101, -102,108, 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, - 83,101,116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, - 70,105,110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, - 97,116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117, -114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110, -105,109, 97,116,101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99, -116, 0,102,111,114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, - 0,107,105,110,107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109, -112, 0,102, 95,102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0, -109,105,110,100,105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0, -112,100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112, -100,101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107, -110,101,115,115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, - 95,115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109, -112, 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, - 97,109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111, -105,115,101, 0,119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, - 91, 51, 93, 0,102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,105, -110,100,101,120, 95, 97,114,114, 97,121, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,115,116,101,112, - 0,115,105,109,102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100, -105,116,102,114, 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, - 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0,109,101,109, - 95, 99, 97, 99,104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83, -116,105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, - 0,112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116, -105,111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0, -107, 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, - 95, 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, - 0,107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105, -111,110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108, -100,105,110,103, 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0, -109,115,103, 95,108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101, -100, 86, 71, 95, 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108, -105,109,105,116, 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, - 97,108,102,114,105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0, -118,101,114,116,103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102, -117,122,122,121,110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, - 71, 95, 83,112,114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, - 97,108, 0,115,111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101, -121, 0,115,101, 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, - 98, 97,108,108,115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108, -111,111,112,115, 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, - 97,115,116,105, 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, - 97,114,115,116,105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, - 99,116,111,114, 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0, -108,115, 99, 97,108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97, -100,118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101, -118,105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111, -100,101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97, -108,117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110, -101,110,116, 0,103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, - 97,110,105,109, 69,110,100, 0,103,115,116, 97,114, 0,109, 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0, -105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122, 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117, -114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, - 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100, -111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114, -116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, - 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117, -114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114, -116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, - 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115, 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, - 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110, -103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102, -111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, - 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, - 0,104,111,114, 98, 0,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97, -109, 98,107, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101, 0,108, -105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, - 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,121,115, -105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112, 0,112, -104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,115,116, - 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, - 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116, 0,115, -116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,102,101, -110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,102, 97, - 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, - 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, - 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,111,114, - 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,101, 99, -116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50, 0, 97, -111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115, 97,109, -112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,112,112, -114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,115, -101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109,115, 0, 99, - 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97,110,100,108, -101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0,100,119, 66, -121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114,108,101, 97, -118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, 80, 97,114, -109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, - 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0, 99,111, -100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,116,104, 0, 99,111,100,101, 99, 84, -101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, - 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121, 70,114, 97,109,101, 82, 97,116,101, - 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97, -116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0, 97, -117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, - 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95, -112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105, -110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114, 0, -100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,105, -103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,112, - 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0, 42, -113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,111, -100,101, 99,100, 97,116, 97, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97, -112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100,103, -101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, 0, -121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,114,116, 50, 0,102,114, 97,109,101, 95, -115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116, - 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,115, 0,121,112, 97,114, -116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,117, 98,105,109,116,121,112, -101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,100, 49, 0,114,112, 97,100, - 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99,101, 95,111,112,116,105,111,110,115, 0,114, 97,121,116,114, - 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,114,101,115, 0, 97,108,112, -104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116, 0,115, 97,102,101,116, -121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0, 97, 99,116,108, 97,121, 0, -109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,115, 95,115,101, 99, 95, - 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,112,111,115,116,103, 97, -109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114, 95,105,110,116,101,110, -115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0, 98, 97,107,101, 95,109, -111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,115,112, 97, 99,101, 0, - 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,115,116, 0, 98, 97,107, -101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, - 99, 97, 99,104,101, 0, 71, 73,109,101,116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99, -116, 0, 89, 70, 95, 65, 65, 0, 89, 70,101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, - 95, 99,108, 97,109,112,114,103, 98, 0,121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100, -101,112,116,104, 0, 71, 73,112,105,120,101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99, -111,117,110,116, 0, 71, 73,109,105,120,112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, - 0, 89, 70, 95,114, 97,121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97, -109,112,108,101,115, 0,121,102,112, 97,100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114, -101,102,105,110,101,109,101,110,116, 0, 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, - 70, 95,103, 97,109,109, 97, 0, 89, 70, 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, - 70, 95, 65, 65,112,105,120,101,108,115,105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,100, 0, 98, 97, 99, -107, 98,117,102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102, -111,110,116, 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, - 91, 52, 93, 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,105,109,112,108,105,102,121, 95,102,108, 97,103, 0,115,105, -109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,121, 95,115,104, 97,100,111,119,115, 97, -109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, 0,115,105,109,112,108,105,102, -121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,110,101,111,110, 98,108, 97, 99,107, 0, - 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106,112, 50, 95,100,101,112,116,104, - 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,101, 0,100,111,109,101, 97,110,103,108, -101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111,109,101,116,101,120,116, 0, -101,110,103,105,110,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,101,114, 99, 0,115,117, 98,115,117,114,102, - 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,120, 0, 97,111, 95,101,114,114,111,114, 0, -116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116, 0, 99,111,108, 91, 51, 93, 0,109, 97,116, -109,111,100,101, 0,102,114, 97,109,105,110,103, 0,114,116, 49, 0,100,111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, - 0,101,121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,109,101,114, 97, 0, 42, 42, 98,114,117,115,104,101,115, - 0, 97, 99,116,105,118,101, 95, 98,114,117,115,104, 95,105,110,100,101,120, 0, 98,114,117,115,104, 95, 99,111,117,110,116, 0, - 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95, 99,117,114,115,111,114, 95, 99,111,108, 91, 52, - 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109, 97,108, 95, 97,110,103,108,101, 0, - 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, - 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101, -114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115, -116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, - 51, 93, 0,112,105,118,111,116, 91, 51, 93, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,108,101,116, 95,115, -116,114,101,110,103,116,104, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101, -118, 0, 42,118,112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, - 99,111,114,110,101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105, -109,105,116, 0,100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105, -116, 0,110,111,114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0, -114,105,110,103,115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95, -114, 97,100,105,117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97, -114,103,105,110, 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105, -103,110, 0,117,118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116, -109,111,100,101, 0,117,118, 95,112, 97,100, 91, 50, 93, 0, 97,117,116,111,105,107, 95, 99,104, 97,105,110,108,101,110, 0,105, -109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,115,105, -122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,114,101,115,104, 0, 97,117, -116,111,107,101,121, 95,109,111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,101,116,111,112,111, 95,109, -111,100,101, 0,114,101,116,111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,101, 95,100,105,118, 0,101, -108,108,105,112,115,101, 95,100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116, 0,109,117,108,116,105,114, -101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0, -115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116, -104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, - 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110, -103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105, -116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, - 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101, -116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100, -105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103, -101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0, -115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116, -105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101, -116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107, -103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, - 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108, -108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, - 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112, 95,109,111,100,101, 0,115, -110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,111,114,116,105,111,110, 97, -108, 0,112,114,111,112, 95,109,111,100,101, 0, 97,117,116,111, 95,110,111,114,109, 97,108,105,122,101, 0,105,110,116,112, 97, -100, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117, -114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,115, 99, 97,108,101, 95,108,101, -110,103,116,104, 0,115,121,115,116,101,109, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0, 42,119,111,114,108,100, 0, 42,115, -101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116, 0, 99,117,114,115,111,114, 91, 51, - 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, 0, 42,101, -100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97, -110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110, -100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, - 0,100, 97,103,105,115,118, 97,108,105,100, 0,100, 97,103,102,108, 97,103,115, 0,106,117,109,112,102,114, 97,109,101, 0,112, - 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0, -103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,115, 95,115,101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118, -105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118, -105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105, -110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, -111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, - 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111, -109, 0,118,105,101,119, 98,117,116, 0,116,119,100,114, 97,119,102,108, 97,103, 0,114,102,108, 97,103, 0,118,105,101,119,108, -111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112, 95,108,111, 99, 97,108, 91, - 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101,116,111, -112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111,116, -104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105,101, -119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,112, 97,100,102, 0,114,101,103,105,111, -110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, 99,107, -104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 98, -103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, - 50, 93, 0,108, 97,121, 97, 99,116, 0,100,114, 97,119,116,121,112,101, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111, -117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105, -100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103, 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115, -101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102, -108, 97,103, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 97,102,116,101,114,100,114, 97,119, 0,122, 98, -117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,102,105,108,116,101,114, 0, 42,112,114,111, -112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,104,111,114, 0,109, 97,115,107, 0,109,105, -110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109, 97,120,122,111,111,109, 0,115, 99,114,111, -108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,107,101,101,112,122,111,111,109, 0,107,101, -101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121, 0,111,108,100,119,105,110,120, 0,111,108, -100,119,105,110,121, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97, 98, 95, -110,117,109, 0,116, 97, 98, 95, 99,117,114, 0, 42,115, 99,114,101,101,110, 0,118, 50,100, 0, 42, 97,100,115, 0,103,104,111, -115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109, 97,105,110, - 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,114,101,118, -105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,114,101,110, -100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109, 0,116,105, -116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,101, -102,105,108,101, 91, 56, 48, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,111,111, -107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,112, 0, -109,101,110,117, 0,102,112, 95,115,116,114, 91, 56, 93, 0, 42,112,117,112,109,101,110,117, 0, 42,112, 97,114, 97,109,115, 0, - 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110,101, -120,116, 0, 42,111,112, 0, 42,108,111, 97,100,105,109, 97,103,101, 95,116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 0, -114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,114, 0,116,114,101, -101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51, 50, 93, 0,115, -101, 97,114, 99,104, 95,116,115,101, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0,100,111, 95, 0,111,117,116,108,105, -110,101,118,105,115, 0,115,116,111,114,101,102,108, 97,103, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114, 0, 99,117,114, -116,105,108,101, 0,105,109,116,121,112,101,110,114, 0,108,111, 99,107, 0,112,105,110, 0,100,116, 95,117,118, 0,115,116,105, - 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 99,101,110,116,120, 0, 99,101,110,116,121, 0,104,105,115, -116, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,108,104,101,105,103,104,116, 0, 99,119, -105,100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114, -115, 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0,111,118,101,114,119,114,105,116,101, - 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,110,101, 0,116,120,116,115, 99,114,111,108, -108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,108,117,103,105,110,115, 0,102,105,110,100, -115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50, 53, 54, 93, 0, 42,112,121, 95,100,114, 97, -119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115, -101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, - 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, - 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0,114,101,100,114, 97,119,115, 0, 42,105,100, - 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, - 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,116, -105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,114,111, -108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,114,101, -116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41, 40, 41, - 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,102, -117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112, 0, 42, -105,109,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,114,112,116, 95,109, 97,115,107, 0,115, 99, -114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,110, -103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,101,108, 95,101,110,100, 0,102,105,108,101, -110, 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116, 95,105,100, 0,114, 95,116,111, 95, -108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99, 0, 98,111,108,100, 0,115,104, 97, -100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,108,112,104, 97, 0,115,104, 97,100, -111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,112,108, 97, 98,101,108, 0,119,105, -100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,111,111,109, 0,109,105,110,108, 97, - 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115, 0, 99,111,108,117,109,110,115,112, - 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112, 97, 99,101, 0, 98,117,116,116,111, -110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,110,101,108,115,112, 97, 99,101, 0, -112, 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,110,101, 91, 52, 93, 0,105,110,110, -101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109, 91, 52, 93, 0,116,101,120,116, 91, - 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,104, 97,100,101,116,111,112, 0,115, -104, 97,100,101,100,111,119,110, 0,105,110,110,101,114, 95, 97,110,105,109, 91, 52, 93, 0,105,110,110,101,114, 95, 97,110,105, -109, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 95, -115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105, -118,101,110, 95,115,101,108, 91, 52, 93, 0,119, 99,111,108, 95,114,101,103,117,108, 97,114, 0,119, 99,111,108, 95,116,111,111, -108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100,105,111, 0,119, 99,111,108, 95,111,112,116,105, -111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,117,109, 0,119, 99,111,108, 95,110,117,109, -115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108, 95,112,117,108,108,100,111,119,110, 0,119, - 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,110,117, 95,105,116,101,109, 0,119, 99,111, -108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,108, 95,108,105,115,116, 95,105,116,101,109, - 0,119, 99,111,108, 95,115,116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, - 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,104, -101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, - 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, - 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95, -116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, - 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97, -110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, - 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115, -104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, - 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103, -114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114, -109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0, -101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, - 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, - 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111, -116, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,111,114,109, 97,108, 91, 52, 93, 0, - 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, - 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,100,115, - 95, 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110, -115,111,108,101, 95,111,117,116,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, - 99,111,110,115,111,108,101, 95,105,110,102,111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, - 0, 99,111,110,115,111,108,101, 95, 99,117,114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, - 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112, 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115, -121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116, 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0, -115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101, -110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, - 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115, -104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110, -100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116, -101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 51, 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0, -115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105, -112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, - 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, - 0,116,108,111,103,105, 99, 0,116,117,115,101,114,112,114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, - 50, 48, 93, 0, 97, 99,116,105,118,101, 95,116,104,101,109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, - 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105, -114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114, 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, - 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, - 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54, 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0, -115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 91, 50, 52, 48, 93, 0, 97, -110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95,109,105,110, 95,103,114,105,100,115,105, -122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115,105,111,110,115, 0,100, 98,108, 95, 99, -108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,101,115, 99,114, -111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102, 0,118,105,101, -119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111,100,101,118,105, 99,101, 0, 97,117,100, -105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100,105,111, 99,104, 97,110,110,101,108,115, - 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,116,104,114,101, -115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115, 0,117,105,102, -111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0, 97,100,100,111,110,115, 0,107,101,121, - 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,109,101,109,111, -114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,100,101, 97,110, -100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116, 98, 95,108,101, -102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116, -119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,105,122,101, 0, -116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,116,114, 97,116, -101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,119,109,112, 97,100, 0,109,101,109, 99, 97, 99,104,101,108,105,109, -105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109,101,115,101,114,118,101,114,112,111,114, -116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116,101,114, 95,100,105, 97, 0,114,118,105, -115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95,102,105,108,101,115, 0,115,109,111,111, -116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0,110,100,111,102, 95,112, 97,110, 0,110,100, -111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0,105,112,111, 95,110,101,119, 0, 99,111,108,111,114, - 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, - 97,105,116, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49, - 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,118,101,114,116, - 98, 97,115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, - 0,102,117,108,108, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,104, 0,100, -111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,117,114,115, -111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,115,117, 98, -119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116, 0,104, 97, -110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,121,112,101, - 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114, 97,119,110, - 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,108, 97, - 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,110, 97,112, - 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100, 97,116, 97, - 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108, 97,115,116, - 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114, 99,104, 91, - 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,101, 0,104, -101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0, 97, 99,116, -105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,100, 0,114, -101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110, -101,108,115, 0, 42,104,101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115, -116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, - 0,109,105,110,115,117, 98,118,101,114,115,105,111,110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99, -101,110,101, 0,102,105,108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,102, 0,110, 97,109,101, 91, 56, 48, 93, 0, 42, -105, 98,117,102, 0, 42,105, 98,117,102, 95, 99,111,109,112, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0,110, -114, 0, 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, - 0,103, 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,115, 97,116,117,114, 97,116,105,111,110, 0,100,105,114, - 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116, 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42, -115,116,114,105,112,100, 97,116, 97, 0,111,114,120, 0,111,114,121, 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111, -114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 0, 42,116, -115,116,114,105,112,100, 97,116, 97, 95,115,116, 97,114,116,115,116,105,108,108, 0, 42,116,115,116,114,105,112,100, 97,116, 97, - 95,101,110,100,115,116,105,108,108, 0, 42,105, 98,117,102, 95,115,116, 97,114,116,115,116,105,108,108, 0, 42,105, 98,117,102, - 95,101,110,100,115,116,105,108,108, 0, 42,105,110,115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, - 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97, -114,116,111,102,115, 0,101,110,100,111,102,115, 0,109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101, -110,100,100,105,115,112, 0,109,117,108, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, - 0, 42,115,116,114,105,112, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,102, 97,100,101,114, - 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0, 42,115,111,117,110, -100, 0, 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, - 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116, 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102, -115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111, -112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115, -101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100, -105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,105,114, 91, 50, 53, 54, 93, 0,101,100,103,101, 87,105, -100,116,104, 0,102,111,114,119, 97,114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109, -112, 0,102, 66,111,111,115,116, 0,100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, - 83, 99, 97,108,101,120, 73,110,105, 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, - 97,108,101,121, 70,105,110, 0,120, 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73, -110,105, 0,114,111,116, 70,105,110, 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95, -115, 99, 97,108,101, 0, 42,102,114, 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, - 86, 97,108,105,100, 70,114, 97,109,101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116, -111,116,112, 97,114,116, 0,110,111,114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120, -102, 97, 99, 0,114, 97,110,100,108,105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, - 97,120,108,101,110, 0,100,101,102,118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, - 99,104,105,108,100, 91, 52, 93, 0,109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115, -116, 97,116,105, 99,115,116,101,112, 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0, -102,108, 97,103, 50,110,101,103, 0,118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, - 51, 50, 93, 0,118,103,114,111,117,112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, - 99, 0,117,115,101,100, 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0, -108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101, -116, 78, 97,109,101, 91, 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, - 50, 93, 0,109, 97,120,118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, - 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97, -109,101, 91, 51, 50, 93, 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, - 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, - 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112, -101, 0,112,117,108,115,101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97, -112, 0,106,111,121,105,110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116, -116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, - 42,109,121,110,101,119, 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, - 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, - 51, 50, 93, 0, 98,108,101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115, -116,114,105,100,101, 97,120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0,115,110,100,110,114, 0,112, 97,100, - 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49, 93, 0, 42,109,101, 0,108, -105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, - 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93, - 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97, -110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0,109,105,110, - 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93, - 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93, - 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0,105,110,116, 95, - 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0,102,108,111, 97, -116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,111, 79, 98,106,101, 99,116, - 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110,105,110, 97, -109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0, 42,115,117, 98,116, 97,114, -103,101,116, 0,103,111, 0, 97, 99, 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97, -120,114,111,116,115,112,101,101,100, 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,108,116,100, 97,109,112, 0, -115,112,101,101,100,100, 97,109,112, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,114,101,102,101, -114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110, 99,101, 0,114,111,108,108, -111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, - 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103, 97,105,110, 0, 42,110,101, -119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, - 0, 42, 99, 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100,108,101, 0, 42, 97,114,101, 97, 0, 42, -108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, 0, 42,112,114, -111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97,105,108, 91, 51, - 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93, 0, 97,114,109, - 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,120,119,105,100,116,104, 0,122,119, -105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,104,101, 97,100, 0,114, 97,100, 95,116, 97, -105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0, 42,101,100, 98,111, 0, 42, 97, 99,116, - 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,101,116, 99,104, 0,108, 97,121,101,114, 95, -112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115, -116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, - 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,111,105,110, -116,115, 0,115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,115,116, 95,115, -102, 0,103,104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99, 0,103,104,111, -115,116, 95,116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,103, 0,112, 97, -116,104, 95,116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,108, 97,103, 0, -112, 97,116,104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,102, 0,112, 97, -116,104, 95, 98, 99, 0,112, 97,116,104, 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108, 97,103, 0,115, -101,108,101, 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42, 99,104,105,108, -100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116,115, 0, 42,100,117, 97,108, 95,113,117, 97,116, - 0, 42, 98, 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95, -109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, - 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108, -105,109,105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99, -104, 0,105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 42, 99,117,115,116,111, -109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0, 99,104, 97,110, 98, 97,115,101, 0,112,114,111,120,121, 95,108, 97,121,101, -114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, - 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,107,115,111,108,118,101, -114, 0, 42,105,107,100, 97,116, 97, 0, 42,105,107,112, 97,114, 97,109, 0,110,117,109,105,116,101,114, 0,110,117,109,115,116, -101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,114, 0,102,101,101,100, 98, 97, - 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,115, 0, 99,104, 97,110,110,101, -108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97, 99, -116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112, 0, -102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101, 0, 42,103,114,112, 0,116,101, -109,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,101,110, -102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,101,114,114, -111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,116, 79,114, -100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,111, -111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,108, -101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,119, -101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115, 0, 99,104, - 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,115, -101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51, 93, - 0,108,111, 99,107,102,108, 97,103, 0,111,102,102,115,101,116, 95,102, 97, 99, 0,102,111,108,108,111,119,102,108, 97,103, 0, -118,111,108,109,111,100,101, 0,112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105, -118, 88, 0,112,105,118, 89, 0,112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105, -116, 91, 54, 93, 0,109, 97,120, 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, - 52, 93, 91, 52, 93, 0,102,114,111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109, -105,110, 91, 51, 93, 0,102,114,111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, - 97,120, 91, 51, 93, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51, - 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111, -100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101, -108,101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, - 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111, -117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115, -111, 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0, -115,116, 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110, -100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95, -110,111,100,101, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105, -119,105,100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117, -115,116,111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, - 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111, - 0, 42,102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100, -101,115, 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105, -116, 0,115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42, -111,119,110,116,121,112,101, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 41, 40, 41, 0, - 40, 42,115,116, 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, - 42,116, 98,104, 0, 42,116, 99,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112, -108,101,115, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,110,116,121, 0, 98, -111,107,101,104, 0,103, 97,109,109, 97, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,110, 95,119,105,100,116,104, - 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,101,110,116,101,114, - 95,121, 0,115,112,105,110, 0,105,116,101,114, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105, -103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,115, 97,116, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101, -110,103,116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0, 99, -111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,114,111,116, 97,116,105,111,110, 0,103, 97,109, 99,111, - 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,117,114, 0, 98,116,104,114,101,115,104, 0, 42, -100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,102,115, 0, 99,111,108,109,111,100, 0,109,105,120, 0, -116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0, -115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108, -101, 0,109, 97,120,116, 97, 98,108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, - 42, 99,117,114,118,101, 0, 42,116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0, 99,117,114,114, 0, - 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119, -109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97, -116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, - 93, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0,106,105,116,116,101,114, 0,115,109, -111,111,116,104, 95,115,116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, - 95,102, 97, 99,116,111,114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0, -118,101,114,116,101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, - 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95, -109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116, -111,116,115,105,122,101, 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111, -116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,110,117, -109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115, -101,116, 0,114,116, 91, 50, 93, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98,111,105,100, 0, -100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,105,114, 95,105,110,100,101,120, 0, 97, -108,105,118,101, 0, 42, 98,111,105,100,115, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0, 97,118,101,109,111, -100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,100,114, 97,119, 95, -115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,114,101,110, 95,115,116,101,112, 0,104, - 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115,116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97, -100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111,109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97, -108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105, -116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, - 95,111,102,102,115,101,116, 91, 50, 93, 0,115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112, -108,105,102,121, 95,114, 97,116,101, 0,115,105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105, -109,112,108,105,102,121, 95,118,105,101,119,112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, - 0,101,102,102, 95,104, 97,105,114, 0,103,114,105,100, 95,114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, - 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116,102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118, -101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97, -115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0,114,101, 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, - 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101, -110,103,116,104, 0, 99,104,105,108,100, 95,110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114, -101,110,116,115, 0, 99,104,105,108,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105, -108,100,114, 97,100, 0, 99,104,105,108,100,102,108, 97,116, 0, 99,108,117,109,112,112,111,119, 0,114,111,117,103,104, 49, 0, -114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104, 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114, -111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104, 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95, -115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,110,103,116,104, 95,116,104,114,101,115, 0, 98,114, 97,110, - 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, - 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112, -115, 0,100,117,112,108,105,119,101,105,103,104,116,115, 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, - 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0, 42,112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, - 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104, -101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104,101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, - 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,117,116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42, -108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,114, 97,109,101, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, - 97, 99,104,101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0, -116,111,116,107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, - 51, 50, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101, -114,100, 97,116, 97, 0, 42,101,102,102,101, 99,116,111,114,115, 0, 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97, -110,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114,117, 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, - 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117, 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, - 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95, -115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115, 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108, -100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111,111,116,104, 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116, -105,111,110, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,101, 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114, -105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,112,101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118, -103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,112, 95,115,116,114,117, 99,116, 0,112,114,101,115,101,116,115, - 0,114,101,115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115, -101,108,102, 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111, -111,112, 95, 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, - 99,107,110,101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109, -101, 0,103,115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, - 98,117,102,102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0, 42,116,121,112,101,115,116,114, 0, 42, -109,101,115,115, 97,103,101, 0,108,105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101,118, -101,108, 0, 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111, -119,115, 0,105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100, -111, 95,100,101,112,116,104, 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0, -106,111, 98,115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105, -103,115, 0, 42,100,101,102, 97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101, -116,105,109,101,114, 0, 42,103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,110,101,119,115, - 99,114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119, -105,110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,100, -100,109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, - 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119, -100, 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,101, -115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,116, - 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,116, -121,112,101, 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100, 0, -107,109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98, 97, -115,101,110, 97,109,101, 91, 54, 52, 93, 0,102,105,108,116,101,114, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, - 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116, -115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99, -111,101,102,102,105, 99,105,101,110,116,115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, - 0, 97,109,112,108,105,116,117,100,101, 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115, -101, 95,111,102,102,115,101,116, 0,118, 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102, -111,114,101, 95,109,111,100,101, 0, 97,102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101, -115, 0, 97,102,116,101,114, 95, 99,121, 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, - 99, 97,116,105,111,110, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0, -116,114, 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95, -116, 97,114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, - 93, 0, 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105, -110,100,101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50, - 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97, -112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101, -120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,116,101,109,112,108, 97,116,101,115, 0,103,114, -111,117,112,109,111,100,101, 0,112, 97,116,104,115, 0,107,101,121,105,110,103,102,108, 97,103, 0, 97, 99,116,105,118,101, 95, -112, 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114,105, -112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111,100, -101, 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0,114, -117,108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105, -100, 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0, -119, 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116, -101, 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117, -108,101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115, -116, 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105, -110,103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97, 99, 99,117,114, 97, 99,121, 0, 97,105,114, 95,109,105,110, 95,115, -112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97, -105,114, 95,109, 97,120, 95, 97,118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97, -110,100, 95,106,117,109,112, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110, -100, 95,109, 97,120, 95, 97, 99, 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115, -111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116, -101,115, 0, 42,115,109,100, 0, 42,102,108,117,105,100, 0, 42,102,108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108, -108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101,120, 95,119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, - 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, 49, 91, 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109, -112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, 93, 0, 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0, -118,105,101,119,115,101,116,116,105,110,103,115, 0,110,111,105,115,101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0, -100,105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95,119,116, 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117, -109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, 99,104,101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111, -105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, 99, 97, 99,104,101,115, 91, 50, 93, 0,118,101,108,111, 99,105,116, -121, 91, 51, 93, 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102, -108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42, -112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52, 93, 0, 0, 0, - 84, 89, 80, 69,202, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0, -105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100, - 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, - 99, 50,102, 0,118,101, 99, 50,105, 0,118,101, 99, 50,100, 0,118,101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51, -100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, 99, 52,100, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, - 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97, -114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118, -101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105, -112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101, -120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108, -101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, - 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, - 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, - 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68, - 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117, -114,118,101, 77, 97,112,112,105,110,103, 0, 87, 97,118,101, 0, 86,111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, - 97,116,101,114,105, 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101, -116, 97, 69,108,101,109, 0, 66,111,117,110,100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, - 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, - 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99, -101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, - 83,116,105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97, -116, 97, 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68, -101,102,111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111, -111,112, 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116, -121, 0, 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, - 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, - 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108, -116,105,114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77, -111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, - 67,117,114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, - 97,116, 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105, -101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112, -108,105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101, -114, 68, 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70, -108,111,119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105, -115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105, -102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109, -111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102, -105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100, -121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, - 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, - 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100, -105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101, -114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115, -104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101, -110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, - 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, - 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111, -100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, -117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105, -102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107, -119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100, -105,102,105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, -111,108,105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102, -111,114,109, 71,114,111,117,112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, - 80,111,115,101, 0, 98, 71, 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77, -111,116,105,111,110, 80, 97,116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102, -108,101, 99,116, 0, 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, - 0, 82, 78, 71, 0, 69,102,102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 0, - 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105,110,116, 0, 66, -111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65, -118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 81, -117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111,100,101, - 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, - 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0, 71, 97,109,101, 68,111, -109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97,114,107, -101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103, -115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, - 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, 0, 83, 99, -117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, - 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69,100,105, -116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, - 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,116,111,112,111, 86,105, -101,119, 68, 97,116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,116,111,114, -101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,101,119, 50, - 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 98, 83, 99,114,101,101,110, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111, -112,101, 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83, -101,108,101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119, -109, 79,112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84, -114,101,101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103, -101, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,101,120,116, 0, 83, - 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99, -101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,111,103,105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110, -115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101, 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80, -114,101,102, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,108,101, 0,117,105, 83,116,121,108,101, 0,117, -105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,101,116, 83,116, 97,116,101, 67,111,108,111,114, -115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111, -108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0, 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101, -114, 68,101,102, 0, 83, 99,114, 86,101,114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, - 84,121,112,101, 0,117,105, 76, 97,121,111,117,116, 0, 83, 99,114, 65,114,101, 97, 0, 83,112, 97, 99,101, 84,121,112,101, 0, - 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83, -116,114,105,112, 69,108,101,109, 0, 84, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116, -114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83, -116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110, - 99,101, 0, 98, 83,111,117,110,100, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111, -119, 86, 97,114,115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97, -114,115, 0, 83,112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, - 69,102,102, 0, 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114, -111,112,101,114,116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, - 98, 84,111,117, 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114, -111,112,101,114,116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101, -108, 97,121, 83,101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97, -114, 83,101,110,115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, - 0, 98, 65,114,109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, - 98, 83,101,110,115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110, -115,111,114, 0, 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, - 98, 65, 99,116,117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99, -116,105,111,110, 65, 99,116,117, 97,116,111,114, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110, -100, 51, 68, 0, 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99, -116,117, 97,116,111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, - 65, 99,116,117, 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116, -117, 97,116,111,114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, - 65, 99,116,117, 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103, -101, 65, 99,116,117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108, -105,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, - 98, 80, 97,114,101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, - 65,114,109, 97,116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 70,114,101,101, 67, 97,109,101,114, 97, 0, 83,112, 97, 99, -101, 83,111,117,110,100, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,114,109, 97,116,117,114, -101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 98, - 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,112, 0, 83,112, 97, 99, -101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105, -110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,115,116,114, 97,105,110, -116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 75,105,110,101,109, - 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,111,110,115,116,114, 97,105, -110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 97,116,101, 76,105,107, -101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110, -116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, - 67,111,110,115,116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99, -116,105,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, - 80, 97,116,104, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67, -108, 97,109,112, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109, -105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, - 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, - 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, - 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78, -111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, - 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,117,105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84, -121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 78,111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78, -111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97, -116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, - 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0, 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, - 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68, -101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, - 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,110,115, 68,105,115,116, 0, 78,111,100,101, 67,111,108, -111,114, 66, 97,108, 97,110, 99,101, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, - 80,111,105,110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, - 68, 97,116, 97, 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105, -114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111, -105,100, 68, 97,116, 97, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114, -103,101,116, 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,104,116, 0, 80, 97,114,116,105, 99,108,101, - 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110, -103,115, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, - 99,108,101, 68,114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, - 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82, -101,112,111,114,116, 0, 82,101,112,111,114,116, 76,105,115,116, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, - 0,119,109, 87,105,110,100,111,119, 0,119,109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, - 83,117, 98, 87,105,110,100,111,119, 0,119,109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, - 0, 80,111,105,110,116,101,114, 82, 78, 65, 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84, -121,112,101, 0, 70, 77,111,100,105,102,105,101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111, -100, 95, 70,117,110, 99,116,105,111,110, 71,101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, - 68, 97,116, 97, 0, 70, 77,111,100, 95, 69,110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, - 77,111,100, 95, 80,121,116,104,111,110, 0, 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115, -101, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97,110,110,101,108, - 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97,105,114, - 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0, 75, 83, - 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73,100, 65, -100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111, 97,108, - 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66,111,105, -100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114, 97,103, -101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101, 0, 70, - 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 84, 76, 69, 78, 1, 0, 1, 0, 2, 0, 2, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 8, 0, 12, 0, 8, 0, 4, 0, 8, 0, 8, 0, 16, 0, 12, 0, 12, 0, 24, 0, - 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 20, 0, 76, 0, 52, 0, 40, 2, 0, 0, 32, 0,140, 0,220, 3, 92, 0, 36, 0, 56, 0, - 84, 0,112, 0,124, 0, 56, 0, 24, 0, 40, 0,120, 0, 12, 0,120, 0, 36, 0,168, 5,128, 1, 0, 0, 0, 0, 0, 0, 8, 1, - 40, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0, 72, 0, 24, 1,152, 0,132, 0,140, 1, 8, 1, 56, 0, 88, 0,160, 2, 76, 0, - 60, 1, 0, 0,108, 0,104, 0,148, 0, 56, 0, 8, 0, 16, 0, 92, 1, 0, 0, 0, 0, 0, 0, 40, 1, 20, 0, 44, 0, 60, 0, - 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0, 28, 0, 84, 0, 32, 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 0, - 0, 1, 32, 0, 12, 0, 16, 0, 64, 0, 24, 0, 12, 0, 40, 0, 56, 0, 72, 0, 92, 0,100, 0, 72, 0,100, 0,120, 0, 68, 0, - 64, 0,112, 0, 64, 0, 76, 0,188, 0, 48, 0,168, 0,152, 0,156, 0, 64, 0, 96, 0,108, 0,188, 0,104, 0,216, 0, 56, 0, - 84, 0, 0, 0,136, 0, 28, 0,240, 1,104, 0, 0, 0, 80, 0, 0, 0, 0, 0, 68, 0, 8, 0, 8, 0,224, 0, 80, 0,124, 1, - 76, 0, 68, 0, 64, 0, 64, 0,168, 1,112, 0,108, 0, 56, 0,112, 0,188, 0, 40, 0, 0, 0, 92, 0,112, 0, 72, 0, 48, 0, - 20, 0,120, 0,144, 0, 88, 1,208, 0,180, 0, 0, 0, 68, 0, 92, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,120, 1, 28, 0, -176, 0,144, 0, 40, 0, 60, 0, 24, 0, 72, 0, 40, 4, 56, 0, 20, 0, 16, 0,100, 0, 84, 0, 24, 0,132, 1, 36, 0, 16, 0, -156, 0, 80, 0, 48, 0, 44, 0,136, 1, 32, 0, 8, 0, 16, 0, 24, 2, 0, 0, 0, 0, 72, 0, 72, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,248, 0, 40, 0,148, 0, 48, 0,140, 0,216, 0, 24, 0,224, 0,224, 0,204, 1, 60, 0, 0, 0,120, 0, 0, 0, - 4, 1, 12, 0, 12, 0,160, 12, 24, 12,200, 0,124, 2, 80, 2, 40, 0,180, 0,244, 0, 52, 0,148, 2, 28, 0,112, 1, 24, 0, - 16, 1, 32, 0,224, 0, 32, 0, 32, 0, 80, 2, 40, 1, 16, 0,144, 24, 72, 0, 56, 0,232, 11, 20, 0, 24, 0, 64, 1, 0, 0, - 0, 0, 96, 0, 0, 0,248, 0, 0, 0, 16, 1, 80, 0, 28, 0, 16, 0, 8, 0, 52, 0,252, 0,240, 0,168, 1,204, 0, 12, 1, - 16, 0, 12, 0, 24, 0, 52, 0, 16, 0, 20, 0, 16, 0, 24, 0, 56, 1, 0, 0, 56, 0, 52, 0, 48, 0, 8, 0, 44, 0, 72, 0, -104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 68, 0, 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, - 92, 0, 68, 0, 32, 0, 80, 0, 16, 0, 76, 0,108, 0, 84, 0, 28, 0, 96, 0, 56, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, - 12, 0, 8, 0, 80, 0, 40, 0,196, 0, 24, 0, 16, 1,144, 0, 16, 0,204, 1, 4, 0, 40, 0,104, 0,224, 0, 64, 0, 44, 0, - 72, 0,116, 0, 60, 0,112, 0, 16, 0, 52, 0, 44, 0, 44, 0, 44, 0, 36, 0, 68, 0, 64, 0, 44, 0, 44, 0, 20, 0, 52, 0, - 96, 0, 12, 0,108, 0, 92, 0, 28, 0, 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0,180, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, - 32, 0, 8, 0, 72, 0, 32, 0, 12, 0, 44, 0, 20, 0, 68, 0,240, 0, 24, 0, 56, 0, 52, 0, 20, 0, 64, 0, 28, 0, 20, 0, -180, 0,196, 1, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 24, 0, 24, 0,164, 0,148, 0,216, 0, - 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 96, 0, 0, 0, 88, 0, 20, 0, 24, 0, 16, 0, 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, - 48, 0,208, 1, 28, 1, 16, 0, 68, 0, 0, 1, 20, 0,160, 0, 88, 0, 96, 0, 88, 0, 20, 0, 56, 0, 48, 0, 68, 0, 56, 0, - 92, 0, 64, 0, 56, 0, 96, 0, 0, 0, 0, 0, 83, 84, 82, 67,144, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1, 0, - 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0, 9, 0, 4, 0, 13, 0, 2, 0, - 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 2, 0, 4, 0, 5, 0, 4, 0, 6, 0, - 16, 0, 2, 0, 8, 0, 5, 0, 8, 0, 6, 0, 17, 0, 3, 0, 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 18, 0, 3, 0, - 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 19, 0, 3, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 20, 0, 4, 0, - 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 4, 0, 8, 0, 21, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, - 7, 0, 8, 0, 22, 0, 4, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 8, 0, 8, 0, 23, 0, 4, 0, 4, 0, 9, 0, - 4, 0, 10, 0, 4, 0, 11, 0, 4, 0, 12, 0, 24, 0, 4, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, - 25, 0, 4, 0, 9, 0, 13, 0, 12, 0, 14, 0, 4, 0, 15, 0, 4, 0, 16, 0, 26, 0, 10, 0, 26, 0, 0, 0, 26, 0, 1, 0, - 0, 0, 17, 0, 0, 0, 18, 0, 2, 0, 19, 0, 0, 0, 20, 0, 4, 0, 21, 0, 25, 0, 22, 0, 4, 0, 23, 0, 4, 0, 24, 0, - 27, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 27, 0, 25, 0, 28, 0, 26, 0, 0, 0, 27, 0, 2, 0, 28, 0, 2, 0, 19, 0, - 4, 0, 29, 0, 26, 0, 30, 0, 28, 0, 8, 0, 27, 0, 31, 0, 27, 0, 32, 0, 29, 0, 33, 0, 0, 0, 34, 0, 0, 0, 35, 0, - 4, 0, 36, 0, 4, 0, 37, 0, 28, 0, 38, 0, 30, 0, 6, 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0, - 2, 0, 43, 0, 4, 0, 44, 0, 31, 0, 6, 0, 32, 0, 45, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 17, 0, 2, 0, 19, 0, - 0, 0, 48, 0, 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 49, 0, 35, 0, 50, 0, 24, 0, 51, 0, 24, 0, 52, 0, - 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 56, 0, 2, 0, 19, 0, 2, 0, 57, 0, - 7, 0, 11, 0, 7, 0, 12, 0, 4, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 7, 0, 61, 0, 31, 0, 62, 0, 36, 0, 7, 0, - 27, 0, 31, 0, 12, 0, 63, 0, 24, 0, 64, 0, 2, 0, 46, 0, 2, 0, 65, 0, 2, 0, 66, 0, 2, 0, 37, 0, 37, 0, 16, 0, - 37, 0, 0, 0, 37, 0, 1, 0, 7, 0, 67, 0, 7, 0, 61, 0, 2, 0, 17, 0, 2, 0, 47, 0, 2, 0, 68, 0, 2, 0, 19, 0, - 4, 0, 69, 0, 4, 0, 70, 0, 9, 0, 2, 0, 7, 0, 71, 0, 0, 0, 20, 0, 0, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0, - 38, 0, 13, 0, 27, 0, 31, 0, 39, 0, 75, 0, 37, 0, 76, 0, 0, 0, 77, 0, 4, 0, 78, 0, 7, 0, 61, 0, 12, 0, 79, 0, - 36, 0, 80, 0, 27, 0, 81, 0, 2, 0, 17, 0, 2, 0, 82, 0, 2, 0, 83, 0, 2, 0, 19, 0, 40, 0, 6, 0, 40, 0, 0, 0, - 40, 0, 1, 0, 0, 0, 84, 0, 0, 0, 85, 0, 4, 0, 23, 0, 4, 0, 86, 0, 41, 0, 10, 0, 41, 0, 0, 0, 41, 0, 1, 0, - 4, 0, 87, 0, 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, - 42, 0, 15, 0, 27, 0, 31, 0, 0, 0, 93, 0, 4, 0, 90, 0, 4, 0, 94, 0, 12, 0, 95, 0, 40, 0, 96, 0, 40, 0, 97, 0, - 4, 0, 98, 0, 4, 0, 99, 0, 12, 0,100, 0, 0, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, 9, 0,104, 0, 8, 0,105, 0, - 43, 0, 3, 0, 4, 0,106, 0, 4, 0,107, 0, 9, 0, 2, 0, 44, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, - 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 2, 0,119, 0, 2, 0,120, 0, 7, 0,121, 0, 36, 0, 80, 0, - 32, 0,122, 0, 45, 0, 13, 0, 4, 0,123, 0, 4, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, 2, 0,127, 0, 2, 0,128, 0, - 2, 0, 19, 0, 2, 0,129, 0, 2, 0,130, 0, 2, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 46, 0,134, 0, 47, 0, 32, 0, - 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,135, 0, 48, 0,136, 0, 49, 0,137, 0, 50, 0,138, 0, 2, 0,129, 0, 2, 0, 19, 0, - 2, 0,139, 0, 2, 0, 17, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,140, 0, 2, 0,141, 0, 2, 0,142, 0, 2, 0,143, 0, - 2, 0,144, 0, 2, 0,145, 0, 2, 0,146, 0, 4, 0,147, 0, 4, 0,148, 0, 43, 0,149, 0, 30, 0,150, 0, 0, 0,151, 0, - 7, 0,152, 0, 4, 0,153, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0, 7, 0,158, 0, 7, 0,159, 0, - 51, 0, 63, 0, 2, 0,160, 0, 2, 0,161, 0, 2, 0,162, 0, 2, 0,163, 0, 32, 0,164, 0, 52, 0,165, 0, 0, 0,166, 0, - 0, 0,167, 0, 0, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0, 7, 0,171, 0, 7, 0,172, 0, 7, 0,173, 0, 2, 0,174, 0, - 2, 0,175, 0, 2, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 7, 0,182, 0, - 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0, 57, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0,189, 0, - 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0, 7, 0,196, 0, 7, 0,197, 0, - 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0, 7, 0,204, 0, 7, 0,205, 0, - 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, - 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0, 7, 0,217, 0, 7, 0,218, 0, 7, 0,219, 0, 7, 0,220, 0, 7, 0,221, 0, - 53, 0, 15, 0, 0, 0,222, 0, 9, 0,223, 0, 0, 0,224, 0, 0, 0,225, 0, 4, 0,226, 0, 4, 0,227, 0, 9, 0,228, 0, - 7, 0,229, 0, 7, 0,230, 0, 7, 0,231, 0, 4, 0,232, 0, 9, 0,233, 0, 9, 0,234, 0, 4, 0,235, 0, 4, 0, 37, 0, - 54, 0, 6, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,236, 0, 7, 0, 67, 0, 4, 0, 64, 0, 55, 0, 5, 0, - 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,237, 0, 54, 0,231, 0, 56, 0, 17, 0, 32, 0,164, 0, 47, 0,238, 0, - 57, 0,239, 0, 7, 0,240, 0, 7, 0,241, 0, 2, 0, 17, 0, 2, 0,242, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,243, 0, - 4, 0,244, 0, 2, 0,245, 0, 2, 0,246, 0, 4, 0,129, 0, 4, 0,140, 0, 2, 0,247, 0, 2, 0,248, 0, 58, 0, 22, 0, - 2, 0, 19, 0, 2, 0,249, 0, 7, 0,250, 0, 7, 0,251, 0, 2, 0,139, 0, 2, 0,252, 0, 4, 0,253, 0, 4, 0,254, 0, - 32, 0,164, 0, 4, 0,255, 0, 2, 0, 0, 1, 2, 0, 1, 1, 9, 0, 2, 1, 7, 0, 3, 1, 7, 0, 4, 1, 2, 0, 5, 1, - 2, 0, 6, 1, 2, 0, 7, 1, 2, 0, 8, 1, 7, 0, 9, 1, 7, 0, 10, 1, 55, 0, 11, 1, 59, 0, 11, 0, 4, 0, 12, 1, - 4, 0, 13, 1, 2, 0, 14, 1, 2, 0, 19, 0, 2, 0, 15, 1, 2, 0, 16, 1, 32, 0,164, 0, 7, 0, 17, 1, 4, 0, 18, 1, - 0, 0, 19, 1, 7, 0, 20, 1, 52, 0, 61, 0, 27, 0, 31, 0, 39, 0, 75, 0, 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, - 7, 0, 24, 1, 7, 0, 25, 1, 7, 0, 26, 1, 7, 0, 27, 1, 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, - 7, 0, 32, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, - 7, 0, 40, 1, 2, 0, 41, 1, 2, 0, 42, 1, 2, 0, 43, 1, 2, 0, 44, 1, 2, 0, 45, 1, 2, 0, 46, 1, 2, 0, 47, 1, - 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,242, 0, 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 7, 0, 51, 1, 4, 0, 52, 1, - 4, 0, 53, 1, 2, 0, 54, 1, 2, 0, 55, 1, 2, 0, 15, 1, 2, 0,127, 0, 4, 0, 23, 0, 4, 0,124, 0, 4, 0,125, 0, - 4, 0,126, 0, 7, 0, 56, 1, 7, 0, 57, 1, 7, 0,189, 0, 45, 0, 58, 1, 60, 0, 59, 1, 36, 0, 80, 0, 47, 0,238, 0, - 53, 0, 60, 1, 55, 0, 11, 1, 56, 0, 61, 1, 30, 0,150, 0, 58, 0, 62, 1, 59, 0, 63, 1, 0, 0, 64, 1, 0, 0,181, 0, - 61, 0, 8, 0, 7, 0, 65, 1, 7, 0, 66, 1, 7, 0,172, 0, 4, 0, 19, 0, 7, 0, 67, 1, 7, 0, 68, 1, 7, 0, 69, 1, - 32, 0, 45, 0, 62, 0, 84, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 70, 1, 2, 0,175, 0, - 2, 0, 71, 1, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, - 7, 0, 75, 1, 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 7, 0, 82, 1, - 63, 0, 83, 1, 2, 0,249, 0, 2, 0, 70, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, - 7, 0, 87, 1, 7, 0, 88, 1, 2, 0, 89, 1, 2, 0, 90, 1, 2, 0, 91, 1, 2, 0, 92, 1, 0, 0, 93, 1, 0, 0, 94, 1, - 2, 0, 95, 1, 2, 0, 96, 1, 2, 0, 97, 1, 2, 0, 98, 1, 2, 0, 99, 1, 7, 0,100, 1, 7, 0,101, 1, 7, 0,102, 1, - 7, 0,103, 1, 2, 0,104, 1, 2, 0, 43, 0, 2, 0,105, 1, 2, 0,106, 1, 2, 0,107, 1, 2, 0,108, 1, 7, 0,109, 1, - 7, 0,110, 1, 7, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1, 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1, - 7, 0,118, 1, 7, 0,119, 1, 7, 0,120, 1, 2, 0,121, 1, 2, 0,122, 1, 4, 0,123, 1, 4, 0,124, 1, 2, 0,125, 1, - 2, 0,126, 1, 2, 0,127, 1, 2, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, 2, 0,133, 1, - 2, 0,134, 1, 36, 0, 80, 0, 51, 0,135, 1, 2, 0,136, 1, 2, 0,137, 1, 30, 0,150, 0, 64, 0, 2, 0, 27, 0, 31, 0, - 36, 0, 80, 0, 65, 0, 18, 0, 7, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, 7, 0,141, 1, 7, 0,142, 1, 7, 0,143, 1, - 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 7, 0,147, 1, 2, 0,148, 1, 2, 0,149, 1, 2, 0,150, 1, 2, 0,151, 1, - 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 66, 0,124, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,156, 1, - 2, 0, 19, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1, 7, 0,160, 1, - 7, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, 7, 0,168, 1, - 7, 0,169, 1, 7, 0,170, 1, 7, 0,171, 1, 7, 0,172, 1, 7, 0,173, 1, 7, 0,174, 1, 7, 0,175, 1, 7, 0,176, 1, - 65, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, - 2, 0,185, 1, 2, 0,186, 1, 2, 0,187, 1, 0, 0,188, 1, 0, 0,189, 1, 7, 0,190, 1, 7, 0,191, 1, 2, 0,192, 1, - 2, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1, 7, 0,196, 1, 7, 0,197, 1, 2, 0,198, 1, 2, 0,199, 1, 4, 0, 70, 1, - 4, 0,200, 1, 2, 0,201, 1, 2, 0,202, 1, 2, 0,203, 1, 2, 0,204, 1, 7, 0,205, 1, 7, 0,206, 1, 7, 0,207, 1, - 7, 0,208, 1, 7, 0,209, 1, 7, 0,210, 1, 7, 0,211, 1, 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 0, 0,215, 1, - 7, 0,216, 1, 7, 0,217, 1, 7, 0,218, 1, 4, 0,219, 1, 0, 0,220, 1, 0, 0,105, 1, 0, 0,221, 1, 0, 0, 64, 1, - 2, 0,222, 1, 2, 0,223, 1, 2, 0,136, 1, 2, 0,224, 1, 2, 0,225, 1, 2, 0,226, 1, 7, 0,227, 1, 7, 0,228, 1, - 7, 0,229, 1, 7, 0,230, 1, 7, 0,231, 1, 2, 0,160, 0, 2, 0,161, 0, 55, 0,232, 1, 55, 0,233, 1, 0, 0,234, 1, - 0, 0,235, 1, 0, 0,236, 1, 0, 0,237, 1, 2, 0,238, 1, 2, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1, 51, 0,135, 1, - 60, 0, 59, 1, 36, 0, 80, 0, 67, 0,242, 1, 30, 0,150, 0, 7, 0,243, 1, 7, 0,244, 1, 7, 0,245, 1, 7, 0,246, 1, - 7, 0,247, 1, 2, 0,248, 1, 2, 0, 70, 0, 7, 0,249, 1, 7, 0,250, 1, 7, 0,251, 1, 7, 0,252, 1, 7, 0,253, 1, - 7, 0,254, 1, 7, 0,255, 1, 7, 0, 0, 2, 7, 0, 1, 2, 2, 0, 2, 2, 2, 0, 3, 2, 4, 0, 4, 2, 4, 0,122, 1, - 12, 0, 5, 2, 68, 0, 4, 0, 27, 0, 31, 0, 0, 0, 6, 2, 69, 0, 2, 0, 43, 0,149, 0, 70, 0, 26, 0, 70, 0, 0, 0, - 70, 0, 1, 0, 71, 0, 7, 2, 4, 0, 8, 2, 4, 0, 9, 2, 4, 0, 10, 2, 4, 0, 11, 2, 4, 0, 12, 2, 4, 0, 13, 2, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 14, 2, 2, 0, 15, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 16, 2, - 7, 0, 17, 2, 7, 0, 18, 2, 7, 0, 19, 2, 7, 0, 20, 2, 7, 0, 21, 2, 7, 0, 22, 2, 7, 0, 23, 0, 7, 0, 23, 2, - 7, 0, 24, 2, 72, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0, 7, 2, 12, 0, 25, 2, 12, 0, 26, 2, 12, 0, 27, 2, - 36, 0, 80, 0, 66, 0, 28, 2, 0, 0, 19, 0, 0, 0, 29, 2, 2, 0, 30, 2, 2, 0,174, 0, 2, 0, 37, 0, 7, 0, 65, 1, - 7, 0,172, 0, 7, 0, 66, 1, 7, 0, 31, 2, 7, 0, 32, 2, 7, 0, 33, 2, 70, 0, 34, 2, 35, 0, 11, 0, 7, 0, 35, 2, - 7, 0, 36, 2, 7, 0, 37, 2, 7, 0,251, 0, 2, 0, 55, 0, 0, 0, 38, 2, 0, 0, 39, 2, 0, 0, 40, 2, 0, 0, 41, 2, - 0, 0, 42, 2, 0, 0, 43, 2, 34, 0, 7, 0, 7, 0, 44, 2, 7, 0, 36, 2, 7, 0, 37, 2, 2, 0, 40, 2, 2, 0, 43, 2, - 7, 0,251, 0, 7, 0, 37, 0, 73, 0, 21, 0, 73, 0, 0, 0, 73, 0, 1, 0, 2, 0, 17, 0, 2, 0, 45, 2, 2, 0, 43, 2, - 2, 0, 19, 0, 2, 0, 46, 2, 2, 0, 47, 2, 2, 0, 48, 2, 2, 0, 49, 2, 2, 0, 50, 2, 2, 0, 51, 2, 2, 0, 52, 2, - 2, 0, 53, 2, 7, 0, 54, 2, 7, 0, 55, 2, 34, 0, 49, 0, 35, 0, 50, 0, 2, 0, 56, 2, 2, 0, 57, 2, 4, 0, 58, 2, - 74, 0, 5, 0, 2, 0, 59, 2, 2, 0, 45, 2, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 70, 0, 75, 0, 4, 0, 7, 0, 5, 0, - 7, 0, 6, 0, 7, 0, 8, 0, 7, 0, 60, 2, 76, 0, 68, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0, 7, 2, 12, 0, 61, 2, - 12, 0, 26, 2, 12, 0, 62, 2, 32, 0, 63, 2, 32, 0, 64, 2, 32, 0, 65, 2, 36, 0, 80, 0, 77, 0, 66, 2, 38, 0, 67, 2, - 66, 0, 28, 2, 12, 0, 68, 2, 7, 0, 65, 1, 7, 0,172, 0, 7, 0, 66, 1, 2, 0,174, 0, 2, 0, 43, 0, 2, 0, 69, 2, - 2, 0, 70, 2, 2, 0, 71, 2, 7, 0, 72, 2, 7, 0, 70, 0, 2, 0, 73, 2, 2, 0, 30, 2, 2, 0, 19, 0, 2, 0, 74, 2, - 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2, 2, 0, 48, 2, 2, 0, 49, 2, 2, 0, 78, 2, 2, 0, 79, 2, 4, 0, 80, 2, - 34, 0, 81, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 67, 0, 2, 0, 82, 2, 7, 0, 83, 2, 7, 0, 84, 2, 7, 0, 85, 2, - 7, 0, 86, 2, 7, 0, 87, 2, 7, 0, 88, 2, 7, 0, 89, 2, 7, 0, 90, 2, 7, 0, 91, 2, 7, 0, 92, 2, 0, 0, 93, 2, - 78, 0, 94, 2, 79, 0, 95, 2, 0, 0, 96, 2, 68, 0, 97, 2, 68, 0, 98, 2, 68, 0, 99, 2, 68, 0,100, 2, 4, 0,101, 2, - 7, 0,102, 2, 4, 0,103, 2, 4, 0,104, 2, 75, 0,105, 2, 4, 0,106, 2, 4, 0,107, 2, 74, 0,108, 2, 74, 0,109, 2, - 80, 0, 41, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0, 7, 2, 12, 0,110, 2, 36, 0, 80, 0, 38, 0, 67, 2, 66, 0, 28, 2, - 81, 0,111, 2, 82, 0,112, 2, 83, 0,113, 2, 84, 0,114, 2, 85, 0,115, 2, 86, 0,116, 2, 87, 0,117, 2, 88, 0,118, 2, - 80, 0,119, 2, 89, 0,120, 2, 90, 0,121, 2, 91, 0,122, 2, 91, 0,123, 2, 91, 0,124, 2, 4, 0, 54, 0, 4, 0,125, 2, - 4, 0,126, 2, 4, 0,127, 2, 4, 0,128, 2, 2, 0,174, 0, 2, 0,129, 2, 7, 0, 65, 1, 7, 0,172, 0, 7, 0, 66, 1, - 7, 0,130, 2, 4, 0, 69, 2, 2, 0,131, 2, 2, 0, 19, 0, 2, 0,132, 2, 2, 0,133, 2, 2, 0, 30, 2, 2, 0,134, 2, - 92, 0,135, 2, 93, 0,136, 2, 83, 0, 8, 0, 9, 0,137, 2, 7, 0,138, 2, 4, 0,139, 2, 0, 0, 19, 0, 0, 0,140, 2, - 2, 0, 70, 1, 2, 0,141, 2, 2, 0,142, 2, 81, 0, 7, 0, 4, 0,143, 2, 4, 0,144, 2, 4, 0,145, 2, 4, 0,146, 2, - 2, 0, 45, 2, 0, 0,147, 2, 0, 0, 19, 0, 85, 0, 5, 0, 4, 0,143, 2, 4, 0,144, 2, 0, 0,148, 2, 0, 0,149, 2, - 2, 0, 19, 0, 94, 0, 2, 0, 4, 0,150, 2, 7, 0, 37, 2, 86, 0, 3, 0, 94, 0,151, 2, 4, 0,152, 2, 4, 0, 19, 0, - 84, 0, 6, 0, 7, 0,153, 2, 2, 0,154, 2, 2, 0, 45, 2, 0, 0, 19, 0, 0, 0,149, 2, 0, 0, 71, 2, 87, 0, 4, 0, - 0, 0,236, 0, 0, 0,182, 0, 0, 0,183, 0, 0, 0,184, 0, 95, 0, 6, 0, 47, 0,137, 2, 0, 0, 19, 0, 0, 0,140, 2, - 2, 0, 70, 1, 2, 0,141, 2, 2, 0,142, 2, 96, 0, 1, 0, 7, 0,155, 2, 97, 0, 5, 0, 0, 0,236, 0, 0, 0,182, 0, - 0, 0,183, 0, 0, 0,184, 0, 4, 0, 37, 0, 88, 0, 1, 0, 7, 0,156, 2, 89, 0, 2, 0, 4, 0,157, 2, 4, 0, 17, 0, - 82, 0, 7, 0, 7, 0,138, 2, 47, 0,137, 2, 0, 0, 19, 0, 0, 0,140, 2, 2, 0, 70, 1, 2, 0,141, 2, 2, 0,142, 2, - 98, 0, 1, 0, 7, 0,158, 2, 99, 0, 1, 0, 4, 0,159, 2,100, 0, 1, 0, 0, 0,160, 2,101, 0, 1, 0, 7, 0,138, 2, -102, 0, 3, 0, 4, 0,161, 2, 0, 0, 92, 0, 7, 0,162, 2,103, 0, 4, 0, 7, 0,236, 0, 7, 0,182, 0, 7, 0,183, 0, - 7, 0,184, 0,104, 0, 1, 0,103, 0,139, 2,105, 0, 5, 0, 4, 0,163, 2, 4, 0,164, 2, 0, 0, 19, 0, 0, 0, 45, 2, - 0, 0, 71, 2,106, 0, 2, 0, 4, 0,165, 2, 4, 0,164, 2,107, 0, 10, 0,107, 0, 0, 0,107, 0, 1, 0,105, 0,166, 2, -104, 0,167, 2,106, 0,168, 2, 4, 0, 54, 0, 4, 0,126, 2, 4, 0,125, 2, 4, 0, 37, 0, 84, 0,169, 2, 92, 0, 14, 0, - 12, 0,170, 2, 84, 0,169, 2, 0, 0,171, 2, 0, 0,172, 2, 0, 0,173, 2, 0, 0,174, 2, 0, 0,175, 2, 0, 0,176, 2, - 0, 0,177, 2, 0, 0, 19, 0, 91, 0,122, 2, 91, 0,124, 2, 2, 0,178, 2, 0, 0,179, 2, 93, 0, 8, 0, 4, 0,180, 2, - 4, 0,181, 2, 81, 0,182, 2, 85, 0,183, 2, 4, 0,126, 2, 4, 0,125, 2, 4, 0, 54, 0, 4, 0, 37, 0,108, 0, 7, 0, -108, 0, 0, 0,108, 0, 1, 0, 4, 0, 17, 0, 4, 0, 70, 1, 0, 0, 20, 0, 46, 0,134, 0, 0, 0,184, 2,109, 0, 7, 0, -108, 0,185, 2, 2, 0,186, 2, 2, 0,170, 2, 2, 0,187, 2, 2, 0, 90, 0, 9, 0,188, 2, 9, 0,189, 2,110, 0, 3, 0, -108, 0,185, 2, 32, 0,164, 0, 0, 0, 20, 0,111, 0, 5, 0,108, 0,185, 2, 32, 0,164, 0, 0, 0, 20, 0, 2, 0,190, 2, - 0, 0,191, 2,112, 0, 5, 0,108, 0,185, 2, 7, 0, 88, 0, 7, 0,192, 2, 4, 0,193, 2, 4, 0,194, 2,113, 0, 5, 0, -108, 0,185, 2, 32, 0,195, 2, 0, 0, 72, 0, 4, 0, 70, 1, 4, 0, 19, 0,114, 0, 13, 0,108, 0,185, 2, 32, 0,196, 2, - 32, 0,197, 2, 32, 0,198, 2, 32, 0,199, 2, 7, 0,200, 2, 7, 0,201, 2, 7, 0,192, 2, 7, 0,202, 2, 4, 0,203, 2, - 4, 0,204, 2, 4, 0, 90, 0, 4, 0,205, 2,115, 0, 5, 0,108, 0,185, 2, 2, 0,206, 2, 2, 0, 19, 0, 7, 0,207, 2, - 32, 0,208, 2,116, 0, 3, 0,108, 0,185, 2, 7, 0,209, 2, 4, 0, 90, 0,117, 0, 10, 0,108, 0,185, 2, 7, 0,210, 2, - 4, 0,211, 2, 4, 0, 37, 0, 2, 0, 90, 0, 2, 0,212, 2, 2, 0,213, 2, 2, 0,214, 2, 7, 0,215, 2, 0, 0,216, 2, -118, 0, 3, 0,108, 0,185, 2, 7, 0, 37, 0, 4, 0, 17, 0,119, 0, 6, 0,108, 0,185, 2,120, 0,217, 2,121, 0,218, 2, -122, 0,219, 2, 7, 0,220, 2, 4, 0, 17, 0,123, 0, 11, 0,108, 0,185, 2, 52, 0,221, 2, 7, 0,222, 2, 4, 0,223, 2, - 0, 0,216, 2, 7, 0,224, 2, 4, 0,225, 2, 32, 0,226, 2, 0, 0,227, 2, 4, 0,228, 2, 4, 0, 37, 0,124, 0, 10, 0, -108, 0,185, 2, 32, 0,229, 2, 47, 0,230, 2, 4, 0, 90, 0, 4, 0,231, 2, 7, 0,232, 2, 7, 0,233, 2, 0, 0,227, 2, - 4, 0,228, 2, 4, 0, 37, 0,125, 0, 3, 0,108, 0,185, 2, 7, 0,234, 2, 4, 0,235, 2,126, 0, 5, 0,108, 0,185, 2, - 7, 0,236, 2, 0, 0,216, 2, 2, 0, 19, 0, 2, 0,237, 2,127, 0, 8, 0,108, 0,185, 2, 32, 0,164, 0, 7, 0,236, 2, - 7, 0,251, 0, 7, 0,106, 0, 0, 0,216, 2, 2, 0, 19, 0, 2, 0, 17, 0,128, 0, 21, 0,108, 0,185, 2, 32, 0,238, 2, - 0, 0,216, 2, 52, 0,221, 2, 32, 0,226, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,239, 2, 7, 0,240, 2, 7, 0,241, 2, - 7, 0, 75, 2, 7, 0,242, 2, 7, 0,243, 2, 7, 0,244, 2, 7, 0,245, 2, 4, 0,225, 2, 4, 0,228, 2, 0, 0,227, 2, - 7, 0,246, 2, 7, 0,247, 2, 7, 0, 43, 0,129, 0, 7, 0,108, 0,185, 2, 2, 0,248, 2, 2, 0,249, 2, 4, 0, 70, 0, - 32, 0,164, 0, 7, 0,250, 2, 0, 0,216, 2,130, 0, 10, 0,108, 0,185, 2, 32, 0,164, 0, 0, 0,251, 2, 7, 0,252, 2, - 7, 0,253, 2, 7, 0,245, 2, 4, 0,254, 2, 4, 0,255, 2, 7, 0, 0, 3, 0, 0, 20, 0,131, 0, 1, 0,108, 0,185, 2, -132, 0, 7, 0,108, 0,185, 2, 46, 0,134, 0,133, 0, 1, 3,134, 0, 2, 3,135, 0, 3, 3,136, 0, 4, 3, 12, 0, 5, 3, -137, 0, 13, 0,108, 0,185, 2, 84, 0, 6, 3, 84, 0, 7, 3, 84, 0, 8, 3, 84, 0, 9, 3, 84, 0, 10, 3, 84, 0, 11, 3, - 81, 0, 12, 3, 4, 0, 13, 3, 4, 0, 14, 3, 7, 0,220, 2, 7, 0, 37, 0,138, 0, 15, 3,139, 0, 7, 0,108, 0,185, 2, - 84, 0, 6, 3, 84, 0, 16, 3,140, 0, 17, 3,141, 0, 15, 3, 4, 0, 18, 3, 4, 0, 13, 3,142, 0, 4, 0,108, 0,185, 2, - 32, 0,164, 0, 4, 0, 19, 3, 4, 0, 37, 0,143, 0, 2, 0, 4, 0, 20, 3, 7, 0, 37, 2,144, 0, 2, 0, 4, 0,125, 0, - 4, 0, 21, 3,145, 0, 21, 0,108, 0,185, 2, 32, 0,164, 0, 0, 0,216, 2, 2, 0, 22, 3, 2, 0, 19, 0, 2, 0, 70, 1, - 2, 0, 37, 0, 7, 0, 23, 3, 7, 0, 24, 3, 4, 0, 54, 0, 4, 0, 25, 3,144, 0, 26, 3,143, 0, 27, 3, 4, 0, 28, 3, - 4, 0, 29, 3, 4, 0, 30, 3, 4, 0, 21, 3, 7, 0, 31, 3, 7, 0, 32, 3, 7, 0, 33, 3, 9, 0, 34, 3,146, 0, 8, 0, -108, 0,185, 2,147, 0, 35, 3,140, 0, 17, 3, 4, 0, 36, 3, 4, 0, 37, 3, 4, 0, 38, 3, 2, 0, 19, 0, 2, 0, 57, 0, -148, 0, 8, 0,108, 0,185, 2, 32, 0, 45, 0, 2, 0,255, 0, 2, 0, 19, 0, 2, 0,206, 2, 2, 0, 57, 0, 7, 0, 39, 3, - 7, 0, 40, 3,149, 0, 5, 0,108, 0,185, 2, 4, 0, 41, 3, 2, 0, 19, 0, 2, 0, 42, 3, 7, 0, 43, 3,150, 0, 8, 0, -108, 0,185, 2, 0, 0, 44, 3, 0, 0, 45, 3, 0, 0,176, 2, 0, 0, 46, 3, 0, 0, 47, 3, 0, 0, 90, 0, 0, 0, 71, 2, -151, 0, 3, 0,108, 0,185, 2,152, 0, 48, 3,136, 0, 4, 3,153, 0, 10, 0,108, 0,185, 2, 32, 0, 49, 3, 32, 0, 50, 3, - 0, 0, 51, 3, 7, 0, 52, 3, 2, 0, 53, 3, 2, 0, 54, 3, 0, 0, 55, 3, 0, 0, 56, 3, 0, 0,191, 2,154, 0, 9, 0, -108, 0,185, 2, 32, 0, 57, 3, 0, 0, 51, 3, 7, 0, 58, 3, 7, 0, 59, 3, 0, 0, 70, 1, 0, 0,206, 2, 0, 0, 60, 3, - 0, 0, 37, 0,155, 0, 1, 0,108, 0,185, 2,156, 0, 8, 0,108, 0,185, 2, 0, 0,216, 2, 7, 0,125, 0, 7, 0, 61, 3, - 7, 0, 62, 3, 7, 0, 63, 3, 4, 0, 19, 0, 0, 0, 92, 0,157, 0, 27, 0, 27, 0, 31, 0, 2, 0, 46, 2, 2, 0, 47, 2, - 2, 0, 64, 3, 2, 0, 19, 0, 2, 0, 65, 3, 2, 0, 66, 3, 2, 0, 67, 3, 2, 0, 70, 0, 0, 0, 68, 3, 0, 0, 69, 3, - 0, 0, 70, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 71, 3, 7, 0, 72, 3, 7, 0, 73, 3, 7, 0, 74, 3, 7, 0, 75, 3, - 7, 0, 76, 3, 34, 0, 77, 3, 36, 0, 80, 0, 38, 0, 67, 2, 86, 0,116, 2, 7, 0, 78, 3, 7, 0, 79, 3,157, 0, 80, 3, -158, 0, 3, 0,158, 0, 0, 0,158, 0, 1, 0, 0, 0, 20, 0, 71, 0, 3, 0, 7, 0, 81, 3, 4, 0, 19, 0, 4, 0, 37, 0, - 32, 0,126, 0, 27, 0, 31, 0, 39, 0, 75, 0,159, 0, 82, 3, 2, 0, 17, 0, 2, 0, 83, 3, 4, 0, 84, 3, 4, 0, 85, 3, - 4, 0, 86, 3, 0, 0, 87, 3, 32, 0, 38, 0, 32, 0, 88, 3, 32, 0, 89, 3, 32, 0, 90, 3, 32, 0, 91, 3, 36, 0, 80, 0, - 77, 0, 66, 2, 71, 0, 7, 2,160, 0, 92, 3,160, 0, 93, 3,161, 0, 94, 3, 9, 0, 2, 0,162, 0, 95, 3,163, 0, 96, 3, -164, 0, 97, 3, 12, 0, 98, 3, 12, 0,110, 2, 12, 0, 26, 2, 12, 0, 99, 3, 12, 0,100, 3, 4, 0, 70, 1, 4, 0,101, 3, - 66, 0, 28, 2, 0, 0,102, 3, 4, 0, 30, 2, 4, 0,103, 3, 7, 0, 65, 1, 7, 0,104, 3, 7, 0,105, 3, 7, 0,172, 0, - 7, 0,106, 3, 7, 0, 66, 1, 7, 0,107, 3, 7, 0, 16, 2, 7, 0,108, 3, 7, 0,109, 3, 7, 0,110, 3, 7, 0,111, 3, - 7, 0,112, 3, 7, 0,113, 3, 7, 0,252, 2, 7, 0,114, 3, 7, 0,240, 0, 4, 0,115, 3, 2, 0, 19, 0, 2, 0,116, 3, - 2, 0,117, 3, 2, 0,118, 3, 2, 0,119, 3, 2, 0,120, 3, 2, 0,121, 3, 2, 0,122, 3, 2, 0,123, 3, 2, 0,124, 3, - 2, 0,125, 3, 2, 0,126, 3, 4, 0,127, 3, 4, 0,128, 3, 4, 0,129, 3, 4, 0,130, 3, 7, 0,131, 3, 7, 0,102, 2, - 7, 0,132, 3, 7, 0,133, 3, 7, 0,134, 3, 7, 0,135, 3, 7, 0,136, 3, 7, 0,215, 0, 7, 0,137, 3, 7, 0,138, 3, - 7, 0,139, 3, 7, 0,140, 3, 2, 0,141, 3, 0, 0,142, 3, 0, 0,143, 3, 0, 0,144, 3, 0, 0,145, 3, 7, 0,146, 3, - 7, 0,147, 3, 12, 0,148, 3, 12, 0,149, 3, 12, 0,150, 3, 12, 0,151, 3, 7, 0,152, 3, 2, 0,157, 2, 2, 0,153, 3, - 7, 0,139, 2, 4, 0,154, 3, 4, 0,155, 3,165, 0,156, 3, 2, 0,157, 3, 2, 0,247, 0, 7, 0,158, 3, 12, 0,159, 3, - 12, 0,160, 3, 12, 0,161, 3, 12, 0,162, 3,166, 0, 62, 1,167, 0,163, 3, 67, 0,164, 3, 2, 0,165, 3, 2, 0,166, 3, - 2, 0,167, 3, 2, 0,168, 3, 7, 0,131, 2, 2, 0,169, 3, 2, 0,170, 3,152, 0,171, 3,140, 0,172, 3,140, 0,173, 3, - 4, 0,174, 3, 4, 0,175, 3, 4, 0,176, 3, 4, 0, 70, 0, 12, 0,177, 3, 12, 0,178, 3, 12, 0,179, 3,168, 0, 14, 0, -168, 0, 0, 0,168, 0, 1, 0, 32, 0, 38, 0, 7, 0,252, 2, 7, 0, 67, 1, 7, 0,253, 2, 7, 0,245, 2, 0, 0, 20, 0, - 4, 0,254, 2, 4, 0,255, 2, 4, 0,180, 3, 2, 0, 17, 0, 2, 0,181, 3, 7, 0, 0, 3,169, 0, 12, 0,169, 0, 0, 0, -169, 0, 1, 0, 32, 0, 45, 0, 4, 0,182, 3, 4, 0,157, 2, 4, 0,183, 3, 4, 0, 17, 0, 4, 0,184, 3, 7, 0, 67, 1, - 7, 0,185, 3, 7, 0,186, 3, 7, 0,155, 2,166, 0, 40, 0, 4, 0, 19, 0, 2, 0,187, 3, 2, 0,188, 3, 2, 0,245, 2, - 2, 0,189, 3, 2, 0,190, 3, 2, 0,191, 3, 2, 0,192, 3, 2, 0,193, 3, 7, 0,194, 3, 7, 0,195, 3, 7, 0,196, 3, - 7, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3, 7, 0,204, 3, - 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, 7, 0,211, 3, 7, 0,212, 3, - 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, 7, 0,219, 3, 7, 0,220, 3, - 52, 0,165, 0,170, 0,221, 3, 7, 0,222, 3, 4, 0,194, 2,171, 0, 5, 0, 67, 0,242, 1, 7, 0,223, 3, 7, 0,224, 3, - 2, 0, 19, 0, 2, 0,225, 3,172, 0, 9, 0,172, 0, 0, 0,172, 0, 1, 0, 4, 0,226, 3, 4, 0,227, 3, 4, 0,228, 3, - 4, 0, 19, 0, 4, 0,229, 3, 9, 0,230, 3, 9, 0,231, 3,136, 0, 19, 0,136, 0, 0, 0,136, 0, 1, 0, 4, 0, 19, 0, - 4, 0,232, 3, 4, 0,233, 3, 4, 0,234, 3, 4, 0,235, 3, 4, 0,236, 3, 4, 0,237, 3, 4, 0,227, 3, 4, 0,157, 2, - 4, 0, 57, 0, 0, 0,238, 3, 0, 0,239, 3, 0, 0,240, 3, 0, 0,241, 3, 12, 0,242, 3,173, 0,243, 3, 9, 0,244, 3, -174, 0, 1, 0, 7, 0, 44, 2,165, 0, 30, 0, 4, 0, 19, 0, 7, 0,245, 3, 7, 0,246, 3, 7, 0,247, 3, 4, 0,248, 3, - 4, 0,249, 3, 4, 0,250, 3, 4, 0,251, 3, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, 7, 0,255, 3, 7, 0, 0, 4, - 7, 0, 1, 4, 7, 0, 2, 4, 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4, - 7, 0, 9, 4, 7, 0, 10, 4, 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 4, 0, 14, 4, 4, 0, 15, 4, 7, 0, 16, 4, - 7, 0,137, 3,167, 0, 54, 0, 4, 0,227, 3, 4, 0, 17, 4,175, 0, 18, 4,176, 0, 19, 4, 0, 0, 37, 0, 0, 0, 20, 4, - 2, 0, 21, 4, 7, 0, 22, 4, 0, 0, 23, 4, 7, 0, 24, 4, 7, 0, 25, 4, 7, 0, 26, 4, 7, 0, 27, 4, 7, 0, 28, 4, - 7, 0, 29, 4, 7, 0, 30, 4, 7, 0, 31, 4, 7, 0, 32, 4, 2, 0, 33, 4, 0, 0, 34, 4, 2, 0, 35, 4, 7, 0, 36, 4, - 7, 0, 37, 4, 0, 0, 38, 4, 4, 0,126, 0, 4, 0, 39, 4, 4, 0, 40, 4, 2, 0, 41, 4, 2, 0, 42, 4,174, 0, 43, 4, - 4, 0, 44, 4, 4, 0, 82, 0, 7, 0, 45, 4, 7, 0, 46, 4, 7, 0, 47, 4, 7, 0, 48, 4, 2, 0, 49, 4, 2, 0, 50, 4, - 2, 0, 51, 4, 2, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 2, 0, 55, 4, 2, 0, 56, 4,177, 0, 57, 4, 7, 0, 58, 4, - 7, 0, 59, 4,136, 0, 60, 4, 12, 0, 5, 3,171, 0, 61, 4, 7, 0, 62, 4, 7, 0, 63, 4, 7, 0, 64, 4, 0, 0, 65, 4, -152, 0, 49, 0,151, 0, 66, 4, 2, 0, 17, 0, 2, 0, 67, 4, 2, 0, 68, 4, 2, 0, 69, 4, 7, 0, 70, 4, 2, 0, 71, 4, - 2, 0, 72, 4, 7, 0, 73, 4, 2, 0, 74, 4, 2, 0, 75, 4, 7, 0, 76, 4, 7, 0, 77, 4, 7, 0, 78, 4, 7, 0, 79, 4, - 7, 0, 80, 4, 7, 0, 81, 4, 4, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 7, 0, 85, 4, 80, 0, 86, 4, 80, 0, 87, 4, - 80, 0, 88, 4, 0, 0, 89, 4, 7, 0, 90, 4, 7, 0, 91, 4, 36, 0, 80, 0, 2, 0, 92, 4, 0, 0, 93, 4, 0, 0, 94, 4, - 7, 0, 95, 4, 4, 0, 96, 4, 7, 0, 97, 4, 7, 0, 98, 4, 4, 0, 99, 4, 4, 0, 19, 0, 7, 0,100, 4, 7, 0,101, 4, - 7, 0,102, 4, 84, 0,103, 4, 7, 0,104, 4, 7, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 7, 0,108, 4, 7, 0,109, 4, - 7, 0,110, 4, 4, 0,111, 4,178, 0, 78, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,175, 0, 2, 0, 71, 1, 2, 0,105, 1, - 2, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 7, 0,117, 4, 7, 0,118, 4, 7, 0,119, 4, - 7, 0,120, 4, 7, 0,163, 1, 7, 0,165, 1, 7, 0,164, 1, 7, 0,121, 4, 4, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, - 7, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,128, 4, 7, 0,129, 4, 2, 0,130, 4, 2, 0, 70, 1, 2, 0,131, 4, - 2, 0,132, 4, 2, 0,133, 4, 2, 0,134, 4, 2, 0,135, 4, 2, 0,136, 4, 7, 0,137, 4, 7, 0,138, 4, 7, 0,139, 4, - 7, 0,140, 4, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4, 7, 0,147, 4, - 7, 0,148, 4, 2, 0,149, 4, 2, 0,150, 4, 2, 0,151, 4, 2, 0,152, 4, 7, 0,153, 4, 7, 0,154, 4, 7, 0,155, 4, - 7, 0,156, 4, 2, 0,157, 4, 2, 0,158, 4, 2, 0,159, 4, 2, 0,160, 4, 7, 0,161, 4, 7, 0,162, 4, 7, 0,163, 4, - 7, 0,164, 4, 7, 0,165, 4, 7, 0,166, 4, 7, 0,167, 4, 2, 0,168, 4, 2, 0,169, 4, 2, 0,170, 4, 2, 0,171, 4, - 2, 0,172, 4, 2, 0, 19, 0, 7, 0,173, 4, 7, 0,174, 4, 36, 0, 80, 0, 51, 0,135, 1, 2, 0,136, 1, 2, 0,137, 1, - 30, 0,150, 0,179, 0, 8, 0,179, 0, 0, 0,179, 0, 1, 0, 4, 0,115, 3, 4, 0,175, 4, 4, 0, 19, 0, 2, 0,176, 4, - 2, 0,177, 4, 32, 0,164, 0,180, 0, 13, 0, 9, 0,178, 4, 9, 0,179, 4, 4, 0,180, 4, 4, 0,181, 4, 4, 0,182, 4, - 4, 0,183, 4, 4, 0,184, 4, 4, 0,185, 4, 4, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0, 37, 0, 0, 0,189, 4, -181, 0, 5, 0, 9, 0,190, 4, 9, 0,191, 4, 4, 0,192, 4, 4, 0, 70, 0, 0, 0,193, 4,182, 0, 10, 0, 4, 0,194, 4, - 4, 0,195, 4, 4, 0,196, 4, 4, 0,197, 4, 4, 0,198, 4, 4, 0,199, 4, 4, 0,200, 4, 4, 0,201, 4, 4, 0,202, 4, - 4, 0,203, 4,183, 0, 15, 0, 4, 0, 17, 0, 4, 0,196, 4, 4, 0,204, 4, 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, - 7, 0,208, 4, 4, 0,209, 4, 4, 0, 90, 0, 4, 0,210, 4, 4, 0,211, 4, 4, 0,212, 4, 4, 0,213, 4, 4, 0,214, 4, - 26, 0, 30, 0,184, 0, 7, 0, 4, 0,215, 4, 7, 0,216, 4, 7, 0,217, 4, 7, 0,218, 4, 4, 0,219, 4, 2, 0, 19, 0, - 2, 0, 37, 0,185, 0, 11, 0,185, 0, 0, 0,185, 0, 1, 0, 0, 0, 20, 0, 66, 0,220, 4, 67, 0,221, 4, 4, 0,115, 3, - 4, 0,222, 4, 4, 0,223, 4, 4, 0, 37, 0, 4, 0,224, 4, 4, 0,225, 4,186, 0,136, 0,180, 0,226, 4,181, 0,227, 4, -182, 0,228, 4,183, 0,229, 4, 4, 0, 18, 3, 4, 0,126, 0, 4, 0, 39, 4, 4, 0,230, 4, 4, 0,231, 4, 4, 0,232, 4, - 4, 0,233, 4, 2, 0, 19, 0, 2, 0,234, 4, 7, 0,102, 2, 7, 0,235, 4, 7, 0,236, 4, 7, 0,237, 4, 7, 0,238, 4, - 7, 0,239, 4, 2, 0,240, 4, 2, 0,241, 4, 2, 0,242, 4, 2, 0,243, 4, 2, 0,246, 0, 2, 0,244, 4, 2, 0,245, 4, - 2, 0,246, 4, 2, 0,247, 4, 2, 0,248, 4, 2, 0, 92, 1, 2, 0,106, 0, 2, 0,249, 4, 2, 0,250, 4, 2, 0,251, 4, - 2, 0,252, 4, 2, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 93, 1, 2, 0, 2, 5, - 2, 0, 3, 5, 2, 0, 4, 5, 2, 0, 5, 5, 4, 0, 6, 5, 4, 0, 70, 1, 4, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, - 2, 0, 10, 5, 2, 0,122, 1, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, 2, 0, 14, 5, 24, 0, 15, 5, 24, 0, 16, 5, - 23, 0, 17, 5, 12, 0, 18, 5, 2, 0, 19, 5, 2, 0, 20, 5, 7, 0, 21, 5, 7, 0, 22, 5, 7, 0, 23, 5, 7, 0, 24, 5, - 4, 0, 25, 5, 7, 0, 26, 5, 7, 0, 27, 5, 7, 0, 28, 5, 7, 0, 29, 5, 2, 0, 30, 5, 2, 0, 31, 5, 2, 0, 32, 5, - 2, 0, 33, 5, 2, 0, 34, 5, 2, 0, 35, 5, 7, 0, 36, 5, 7, 0, 37, 5, 7, 0, 38, 5, 2, 0, 39, 5, 2, 0, 40, 5, - 2, 0, 41, 5, 2, 0, 42, 5, 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 2, 0, 47, 5, 2, 0, 48, 5, - 4, 0, 49, 5, 4, 0, 50, 5, 4, 0, 51, 5, 4, 0, 52, 5, 4, 0, 53, 5, 7, 0, 54, 5, 4, 0, 55, 5, 4, 0, 56, 5, - 4, 0, 57, 5, 4, 0, 58, 5, 7, 0, 59, 5, 7, 0, 60, 5, 7, 0, 61, 5, 7, 0, 62, 5, 7, 0, 63, 5, 7, 0, 64, 5, - 7, 0, 65, 5, 7, 0, 66, 5, 7, 0, 67, 5, 0, 0, 68, 5, 0, 0, 69, 5, 4, 0, 70, 5, 2, 0, 71, 5, 2, 0,239, 1, - 0, 0, 72, 5, 7, 0, 73, 5, 7, 0, 74, 5, 4, 0, 75, 5, 2, 0, 76, 5, 2, 0, 77, 5, 7, 0, 78, 5, 7, 0, 79, 5, - 2, 0, 80, 5, 2, 0, 81, 5, 7, 0, 82, 5, 2, 0, 83, 5, 2, 0, 84, 5, 4, 0, 85, 5, 2, 0, 86, 5, 2, 0, 87, 5, - 2, 0, 88, 5, 2, 0, 89, 5, 7, 0, 90, 5, 7, 0, 70, 0, 42, 0, 91, 5, 0, 0, 92, 5,187, 0, 9, 0,187, 0, 0, 0, -187, 0, 1, 0, 0, 0, 20, 0, 2, 0, 93, 5, 2, 0, 94, 5, 2, 0, 95, 5, 2, 0, 43, 0, 7, 0, 96, 5, 7, 0, 70, 0, -188, 0, 7, 0, 2, 0,211, 2, 2, 0, 70, 1, 2, 0,109, 0, 2, 0, 97, 5, 7, 0, 98, 5, 7, 0, 70, 0, 42, 0, 99, 5, -189, 0, 5, 0, 7, 0,100, 5, 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 0,239, 1,190, 0, 28, 0, 7, 0,128, 4, - 7, 0,129, 4, 2, 0, 70, 1, 2, 0, 19, 0, 2, 0,101, 5, 2, 0,137, 1, 2, 0,131, 4, 2, 0,132, 4, 2, 0,133, 4, - 2, 0,134, 4, 2, 0,135, 4, 2, 0,136, 4,189, 0,102, 5, 2, 0,240, 4, 2, 0,241, 4, 2, 0,242, 4, 2, 0,243, 4, - 2, 0,246, 0, 2, 0,244, 4, 2, 0,103, 5, 2, 0,245, 4,188, 0,104, 5, 2, 0,105, 5, 2, 0,247, 4, 2, 0,250, 4, - 2, 0,251, 4, 7, 0,106, 5, 7, 0, 43, 0,191, 0, 6, 0,191, 0, 0, 0,191, 0, 1, 0, 4, 0,226, 3, 0, 0,238, 3, - 4, 0, 19, 0, 32, 0,107, 5,192, 0, 6, 0,193, 0,108, 5, 4, 0,109, 5, 4, 0,110, 5, 9, 0,111, 5, 0, 0,112, 5, - 4, 0, 90, 0,194, 0, 6, 0,192, 0,113, 5, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0,114, 5, 2, 0,115, 5, 9, 0,116, 5, -195, 0, 6, 0, 2, 0,106, 0, 2, 0,222, 2, 2, 0,232, 3, 2, 0,117, 5, 4, 0, 19, 0, 4, 0, 37, 0,196, 0, 14, 0, - 2, 0, 19, 0, 2, 0,118, 5, 2, 0,119, 5, 2, 0,120, 5,195, 0,121, 5, 9, 0,116, 5, 7, 0,122, 5, 7, 0, 57, 0, - 4, 0,123, 5, 4, 0,124, 5, 4, 0,125, 5, 4, 0,126, 5, 46, 0,134, 0, 32, 0,164, 0,197, 0, 4, 0,197, 0, 0, 0, -197, 0, 1, 0, 0, 0,127, 5, 7, 0,128, 5,198, 0, 6, 0,192, 0,113, 5, 7, 0,129, 5, 4, 0, 90, 0, 0, 0,130, 5, - 0, 0,131, 5, 0, 0,191, 2,199, 0, 7, 0,192, 0,113, 5, 2, 0, 19, 0, 2, 0, 37, 0, 4, 0, 36, 0, 4, 0,132, 5, - 86, 0,133, 5, 9, 0,116, 5,200, 0, 74, 0,199, 0,134, 5,199, 0,135, 5,198, 0, 82, 3, 7, 0,136, 5, 2, 0,137, 5, - 2, 0,138, 5, 7, 0,139, 5, 7, 0,140, 5, 2, 0,232, 3, 2, 0,141, 5, 7, 0,142, 5, 7, 0,143, 5, 7, 0,144, 5, - 2, 0,145, 5, 2, 0,123, 5, 2, 0,146, 5, 2, 0,147, 5, 2, 0,148, 5, 2, 0,149, 5, 7, 0,150, 5, 7, 0,151, 5, - 7, 0,152, 5, 2, 0,153, 5, 2, 0,154, 5, 2, 0,155, 5, 2, 0,156, 5, 2, 0,157, 5, 2, 0,158, 5, 2, 0,159, 5, -194, 0,160, 5,196, 0,161, 5, 7, 0,162, 5, 7, 0,163, 5, 7, 0,164, 5, 2, 0,165, 5, 2, 0,166, 5, 0, 0,167, 5, - 0, 0,168, 5, 0, 0,169, 5, 0, 0,170, 5, 0, 0,171, 5, 0, 0,172, 5, 2, 0,173, 5, 7, 0,174, 5, 7, 0,175, 5, - 7, 0,176, 5, 7, 0,177, 5, 7, 0,178, 5, 7, 0,179, 5, 7, 0,180, 5, 7, 0,181, 5, 7, 0,182, 5, 7, 0,183, 5, - 2, 0,184, 5, 0, 0,185, 5, 0, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 32, 0,189, 5, 0, 0,190, 5, 0, 0,191, 5, - 0, 0,192, 5, 0, 0,193, 5, 0, 0,194, 5, 0, 0,195, 5, 0, 0,196, 5, 0, 0,197, 5, 2, 0,198, 5, 2, 0,199, 5, - 2, 0,200, 5, 2, 0,201, 5, 2, 0,202, 5, 4, 0,203, 5, 4, 0,204, 5,201, 0, 8, 0, 4, 0,205, 5, 4, 0,206, 5, - 4, 0,207, 5, 4, 0,208, 5, 4, 0,209, 5, 4, 0,210, 5, 4, 0, 54, 0, 4, 0,126, 2,202, 0, 3, 0, 7, 0,211, 5, - 2, 0,212, 5, 2, 0, 19, 0,203, 0, 2, 0, 7, 0,213, 5, 4, 0, 19, 0, 46, 0, 40, 0, 27, 0, 31, 0, 39, 0, 75, 0, - 32, 0,107, 5,178, 0,214, 5, 46, 0,215, 5, 47, 0,238, 0, 12, 0,216, 5,179, 0,217, 5, 32, 0,218, 5, 7, 0,219, 5, - 7, 0,220, 5, 7, 0,221, 5, 7, 0,222, 5, 4, 0,115, 3, 2, 0, 19, 0, 2, 0, 64, 1, 60, 0, 59, 1,204, 0,223, 5, -200, 0,224, 5,205, 0,225, 5,186, 0,182, 0,184, 0,226, 5, 12, 0,100, 0, 12, 0,227, 5, 9, 0,228, 5, 9, 0,229, 5, - 9, 0,230, 5,206, 0,231, 5, 2, 0,232, 5, 2, 0,233, 5, 2, 0,247, 0, 2, 0,234, 5, 4, 0,235, 5, 4, 0,236, 5, - 12, 0,237, 5,189, 0,102, 5,190, 0,238, 5,202, 0,239, 5,162, 0, 95, 3,203, 0,240, 5,207, 0, 11, 0,207, 0, 0, 0, -207, 0, 1, 0, 47, 0,238, 0, 45, 0, 58, 1, 7, 0, 90, 2, 7, 0, 91, 2, 7, 0,106, 0, 7, 0,241, 5, 2, 0,242, 5, - 2, 0, 19, 0, 7, 0, 70, 0,208, 0, 39, 0, 7, 0,243, 5, 7, 0,244, 5, 7, 0,245, 5, 7, 0,246, 5, 7, 0,247, 5, - 7, 0,248, 5, 7, 0,249, 5, 7, 0,250, 5, 7, 0,251, 5, 7, 0, 77, 1, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, - 7, 0,255, 5, 7, 0,171, 0, 2, 0, 0, 6, 2, 0, 1, 6, 2, 0, 2, 6, 2, 0, 37, 0, 2, 0, 3, 6, 2, 0, 4, 6, - 2, 0, 5, 6, 2, 0,242, 5, 7, 0, 6, 6, 7, 0, 7, 6, 71, 0, 8, 6,162, 0, 95, 3,208, 0, 9, 6,209, 0, 10, 6, -210, 0, 11, 6,211, 0, 12, 6,212, 0, 13, 6,213, 0, 14, 6, 7, 0, 15, 6, 2, 0, 16, 6, 2, 0, 17, 6, 7, 0, 18, 6, - 7, 0, 19, 6, 7, 0, 20, 6,214, 0, 55, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, - 2, 0, 24, 6, 7, 0,251, 5, 7, 0, 77, 1, 7, 0, 43, 0, 4, 0, 25, 6, 2, 0, 5, 6, 2, 0,242, 5, 32, 0,107, 5, - 32, 0, 26, 6, 12, 0, 27, 6,207, 0, 28, 6,214, 0, 9, 6, 0, 0, 29, 6, 4, 0,115, 3, 4, 0, 30, 6, 2, 0, 31, 6, - 2, 0, 70, 0, 2, 0, 32, 6, 2, 0, 33, 6, 2, 0,239, 1, 2, 0, 19, 0, 2, 0, 29, 2, 2, 0, 34, 6, 7, 0,112, 0, - 7, 0, 35, 6, 7, 0, 18, 6, 7, 0, 20, 6, 7, 0, 36, 6, 7, 0, 37, 6, 7, 0,171, 0, 7, 0,219, 5, 2, 0, 38, 6, - 2, 0,122, 1, 2, 0, 39, 6, 2, 0, 40, 6, 2, 0, 41, 6, 2, 0, 42, 6, 2, 0, 43, 6, 2, 0, 44, 6, 2, 0, 45, 6, - 2, 0, 2, 6, 4, 0, 46, 6, 12, 0, 47, 6, 2, 0, 48, 6, 2, 0,140, 2, 2, 0, 49, 6, 0, 0, 50, 6, 0, 0, 51, 6, - 9, 0, 52, 6,162, 0, 95, 3,216, 0, 25, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 0, 53, 6, 23, 0, 54, 6, 23, 0, 55, 6, - 7, 0, 56, 6, 7, 0, 57, 6, 7, 0, 58, 6, 7, 0, 59, 6, 2, 0, 60, 6, 2, 0, 61, 6, 2, 0, 62, 6, 2, 0, 63, 6, - 2, 0, 64, 6, 2, 0, 19, 0, 2, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 68, 6, 2, 0, 69, 6, 2, 0, 33, 6, - 7, 0, 70, 6, 7, 0, 71, 6, 4, 0, 72, 6, 4, 0, 73, 6,215, 0, 6, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, - 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6,217, 0, 8, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, - 7, 0, 23, 6, 2, 0, 24, 6,218, 0, 74, 6, 46, 0,134, 0,219, 0, 14, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, - 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6,216, 0, 75, 6,220, 0, 76, 6, 12, 0, 77, 6, 2, 0, 70, 1, 2, 0, 78, 6, - 4, 0, 19, 0, 7, 0, 79, 6, 4, 0, 33, 6,221, 0, 20, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, - 7, 0, 23, 6, 2, 0, 24, 6,209, 0, 10, 6,216, 0, 75, 6, 2, 0, 80, 6, 2, 0, 81, 6, 2, 0, 82, 6, 2, 0, 83, 6, - 2, 0, 65, 6, 2, 0, 84, 6, 0, 0, 19, 0, 0, 0,137, 1, 9, 0, 66, 2, 4, 0, 85, 6, 4, 0, 86, 6, 27, 0, 87, 6, -222, 0, 18, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6,216, 0, 75, 6, - 7, 0, 90, 2, 7, 0, 91, 2, 2, 0, 80, 6, 2, 0, 88, 6, 2, 0, 89, 6, 2, 0, 90, 6, 4, 0, 19, 0, 7, 0, 91, 6, - 4, 0,242, 5, 4, 0, 37, 0,162, 0, 95, 3,223, 0, 16, 0, 0, 0, 92, 6, 0, 0, 93, 6, 0, 0, 94, 6, 0, 0, 95, 6, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 96, 6, 2, 0, 97, 6, 2, 0,182, 1, 2, 0, 98, 6, 4, 0, 99, 6, 4, 0,100, 6, - 2, 0,101, 6, 2, 0,102, 6, 0, 0,103, 6, 0, 0,104, 6,224, 0, 16, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, - 4, 0, 22, 6, 4, 0, 37, 0,223, 0,105, 6,225, 0,106, 6, 12, 0,107, 6, 12, 0,108, 6,226, 0,109, 6,213, 0,110, 6, -227, 0,111, 6, 2, 0,112, 6, 2, 0,113, 6, 2, 0,114, 6, 2, 0, 70, 0,228, 0, 17, 0,215, 0, 0, 0,215, 0, 1, 0, - 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6,216, 0, 75, 6, 12, 0,115, 6,229, 0,116, 6, 0, 0,117, 6, -230, 0,118, 6, 4, 0,119, 6, 4, 0,120, 6, 2, 0, 19, 0, 2, 0,121, 6, 2, 0,122, 6, 2, 0, 37, 0,231, 0, 30, 0, -215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6, 47, 0,230, 2, 45, 0, 58, 1, - 63, 0,123, 6, 2, 0,133, 0, 2, 0,124, 6, 2, 0, 70, 0, 2, 0,125, 6, 4, 0, 19, 0, 2, 0,126, 6, 2, 0,127, 6, - 2, 0,128, 6, 2, 0,239, 1, 0, 0,129, 6, 0, 0,130, 6, 0, 0,131, 6, 0, 0, 33, 6, 7, 0, 90, 2, 7, 0, 91, 2, - 7, 0, 91, 6, 7, 0,122, 1, 7, 0,132, 6, 7, 0,133, 6,162, 0, 95, 3,232, 0,134, 6,233, 0, 11, 0,215, 0, 0, 0, -215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6, 2, 0, 78, 6, 2, 0, 19, 0, 4, 0, 37, 0, -220, 0, 76, 6,216, 0, 75, 6,234, 0, 27, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, - 2, 0, 24, 6, 42, 0,135, 6, 4, 0,136, 6, 4, 0,137, 6, 2, 0, 90, 0, 2, 0,133, 0, 2, 0,138, 6, 0, 0,139, 6, - 0, 0,140, 6, 4, 0,141, 6, 4, 0,142, 6, 4, 0,143, 6, 4, 0,144, 6, 2, 0,145, 6, 2, 0,146, 6, 7, 0,147, 6, - 23, 0,148, 6, 23, 0,149, 6, 4, 0,150, 6, 4, 0,151, 6, 0, 0,152, 6, 0, 0,153, 6,235, 0, 10, 0, 27, 0, 31, 0, - 9, 0,154, 6, 9, 0,155, 6, 9, 0,156, 6, 9, 0,157, 6, 9, 0,158, 6, 4, 0, 90, 0, 4, 0,159, 6, 0, 0,160, 6, - 0, 0,161, 6,236, 0, 10, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6,235, 0,162, 6, - 2, 0, 90, 0, 2, 0,133, 0, 4, 0, 43, 0, 9, 0,163, 6,237, 0, 8, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, - 4, 0, 22, 6, 7, 0, 23, 6,216, 0, 75, 6, 4, 0, 19, 0, 4, 0,164, 6,238, 0, 23, 0,215, 0, 0, 0,215, 0, 1, 0, - 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6,216, 0, 75, 6, 27, 0,165, 6, 27, 0, 81, 0, 2, 0, 19, 0, - 2, 0,133, 0, 7, 0,166, 6, 9, 0,167, 6, 7, 0, 90, 2, 7, 0, 91, 2, 7, 0,168, 6, 7, 0,169, 6, 60, 0, 59, 1, - 60, 0,170, 6, 4, 0,171, 6, 2, 0,172, 6, 2, 0, 37, 0,162, 0, 95, 3,239, 0, 10, 0,215, 0, 0, 0,215, 0, 1, 0, - 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6, 2, 0, 19, 0, 2, 0,124, 3, 4, 0, 37, 0,162, 0, 95, 3, -240, 0, 42, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6,216, 0, 75, 6, -225, 0,106, 6, 0, 0, 92, 6, 0, 0, 93, 6, 0, 0, 94, 6, 2, 0, 17, 0, 2, 0,102, 6, 2, 0, 19, 0, 2, 0, 96, 6, - 9, 0,167, 6, 4, 0, 99, 6, 4, 0,173, 6, 4, 0,174, 6, 4, 0,100, 6, 23, 0,175, 6, 23, 0,176, 6, 7, 0,177, 6, - 7, 0,178, 6, 7, 0,179, 6, 7, 0,166, 6, 2, 0,180, 6, 2, 0,237, 0, 2, 0,182, 1, 2, 0, 98, 6, 2, 0, 37, 0, - 2, 0, 43, 0, 2, 0,181, 6, 2, 0,182, 6, 9, 0,183, 6, 9, 0,184, 6, 9, 0,185, 6, 9, 0,186, 6, 9, 0,187, 6, - 2, 0,188, 6, 0, 0,104, 6, 57, 0,189, 6,241, 0, 7, 0,241, 0, 0, 0,241, 0, 1, 0, 4, 0,190, 6, 4, 0, 23, 0, - 0, 0, 84, 0, 4, 0,191, 6, 4, 0, 17, 0,242, 0, 16, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, - 7, 0, 23, 6, 2, 0, 24, 6, 4, 0, 17, 0, 4, 0,192, 6, 4, 0, 19, 0, 4, 0,138, 6, 12, 0,193, 6, 12, 0,194, 6, - 0, 0,195, 6, 0, 0,196, 6, 4, 0,197, 6, 4, 0,198, 6,243, 0, 5, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, - 4, 0, 22, 6, 4, 0, 37, 0,244, 0, 7, 0,244, 0, 0, 0,244, 0, 1, 0, 0, 0,199, 6, 2, 0,200, 6, 2, 0,201, 6, - 2, 0,202, 6, 2, 0, 37, 0,245, 0, 12, 0, 2, 0,201, 6, 2, 0,203, 6, 2, 0,204, 6, 0, 0,191, 2, 2, 0,205, 6, - 2, 0,206, 6, 2, 0,207, 6, 2, 0,208, 6, 2, 0,209, 6, 2, 0, 65, 6, 7, 0,210, 6, 7, 0,211, 6,246, 0, 18, 0, -246, 0, 0, 0,246, 0, 1, 0, 0, 0,238, 3,245, 0,212, 6,245, 0,213, 6,245, 0,214, 6,245, 0,215, 6, 7, 0,216, 6, - 2, 0,217, 6, 2, 0,218, 6, 2, 0,219, 6, 2, 0,220, 6, 2, 0,221, 6, 2, 0,222, 6, 2, 0,223, 6, 2, 0,224, 6, - 2, 0,225, 6, 2, 0,226, 6,247, 0, 10, 0, 0, 0,227, 6, 0, 0,228, 6, 0, 0,229, 6, 0, 0,230, 6, 0, 0,231, 6, - 0, 0,232, 6, 2, 0,233, 6, 2, 0,234, 6, 2, 0,235, 6, 2, 0, 37, 0,248, 0, 8, 0, 0, 0,236, 6, 0, 0,237, 6, - 0, 0,238, 6, 0, 0,239, 6, 0, 0,240, 6, 0, 0,241, 6, 7, 0,241, 5, 7, 0, 37, 0,249, 0, 17, 0,247, 0,242, 6, -247, 0,243, 6,247, 0,244, 6,247, 0,245, 6,247, 0,246, 6,247, 0,247, 6,247, 0,248, 6,247, 0,249, 6,247, 0,250, 6, -247, 0,251, 6,247, 0,252, 6,247, 0,253, 6,247, 0,254, 6,247, 0,255, 6,247, 0, 0, 7,248, 0, 1, 7, 0, 0, 2, 7, -250, 0, 77, 0, 0, 0, 3, 7, 0, 0, 4, 7, 0, 0,231, 6, 0, 0, 5, 7, 0, 0, 6, 7, 0, 0, 7, 7, 0, 0, 8, 7, - 0, 0, 9, 7, 0, 0, 10, 7, 0, 0, 11, 7, 0, 0, 12, 7, 0, 0, 13, 7, 0, 0, 14, 7, 0, 0, 15, 7, 0, 0, 16, 7, - 0, 0, 17, 7, 0, 0, 18, 7, 0, 0, 19, 7, 0, 0, 20, 7, 0, 0, 21, 7, 0, 0, 22, 7, 0, 0, 23, 7, 0, 0, 24, 7, - 0, 0, 25, 7, 0, 0, 26, 7, 0, 0, 27, 7, 0, 0, 28, 7, 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, - 0, 0, 33, 7, 0, 0, 34, 7, 0, 0, 35, 7, 0, 0, 36, 7, 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, - 0, 0, 41, 7, 0, 0, 42, 7, 0, 0, 43, 7, 0, 0, 44, 7, 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, - 0, 0, 49, 7, 0, 0, 50, 7, 0, 0, 51, 7, 0, 0, 52, 7, 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, - 0, 0, 57, 7, 0, 0, 58, 7, 0, 0, 59, 7, 0, 0, 60, 7, 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, - 0, 0, 65, 7, 0, 0, 66, 7, 0, 0, 67, 7, 0, 0, 68, 7, 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, - 0, 0, 73, 7, 0, 0, 74, 7, 0, 0, 75, 7, 0, 0, 76, 7, 0, 0, 77, 7, 0, 0, 78, 7,251, 0, 5, 0, 0, 0, 79, 7, - 0, 0, 27, 7, 0, 0, 29, 7, 2, 0, 19, 0, 2, 0, 37, 0,252, 0, 25, 0,252, 0, 0, 0,252, 0, 1, 0, 0, 0, 20, 0, -249, 0, 80, 7,250, 0, 81, 7,250, 0, 82, 7,250, 0, 83, 7,250, 0, 84, 7,250, 0, 85, 7,250, 0, 86, 7,250, 0, 87, 7, -250, 0, 88, 7,250, 0, 89, 7,250, 0, 90, 7,250, 0, 91, 7,250, 0, 92, 7,250, 0, 93, 7,250, 0, 94, 7,250, 0, 95, 7, -250, 0, 96, 7,250, 0, 97, 7,250, 0, 98, 7,251, 0, 99, 7, 4, 0,100, 7, 4, 0, 37, 0,253, 0, 3, 0,253, 0, 0, 0, -253, 0, 1, 0, 0, 0,101, 7,254, 0, 5, 0, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,139, 2, 7, 0,102, 7, 7, 0, 44, 2, -255, 0, 81, 0, 4, 0, 19, 0, 4, 0,103, 7, 4, 0,104, 7, 0, 0,105, 7, 0, 0,106, 7, 0, 0,107, 7, 0, 0,108, 7, - 0, 0,109, 7, 0, 0,110, 7, 0, 0,111, 7, 0, 0,112, 7, 0, 0,113, 7, 4, 0,114, 7, 2, 0,115, 7, 2, 0,116, 7, - 2, 0,117, 7, 2, 0,118, 7, 4, 0,119, 7, 4, 0,120, 7, 4, 0,121, 7, 4, 0,122, 7, 2, 0,123, 7, 2, 0,124, 7, - 4, 0,125, 7, 4, 0,126, 7, 4, 0,127, 7, 4, 0,128, 7, 4, 0,129, 7, 4, 0,193, 6, 4, 0,130, 7, 2, 0,131, 7, - 2, 0,132, 7, 2, 0,133, 7, 2, 0,134, 7, 12, 0,135, 7, 12, 0,136, 7, 12, 0,137, 7, 12, 0,138, 7, 12, 0,139, 7, - 0, 0,140, 7, 2, 0,141, 7, 2, 0,142, 7, 2, 0,143, 7, 2, 0,144, 7, 2, 0,145, 7, 2, 0,146, 7, 2, 0,147, 7, - 2, 0,148, 7,254, 0,149, 7, 2, 0,150, 7, 2, 0,151, 7, 2, 0,152, 7, 2, 0,153, 7, 2, 0,154, 7, 2, 0,155, 7, - 2, 0,156, 7, 2, 0,157, 7, 4, 0,158, 7, 4, 0,159, 7, 2, 0,160, 7, 2, 0,161, 7, 2, 0,162, 7, 2, 0,163, 7, - 2, 0,164, 7, 2, 0,165, 7, 2, 0,166, 7, 2, 0,167, 7, 2, 0,168, 7, 2, 0,169, 7, 2, 0,170, 7, 2, 0,171, 7, - 2, 0,172, 7, 2, 0, 70, 0, 2, 0,173, 7, 2, 0,174, 7, 0, 0,175, 7, 0, 0,176, 7, 7, 0,177, 7, 2, 0,165, 5, - 2, 0,166, 5, 55, 0,178, 7,218, 0, 21, 0, 27, 0, 31, 0, 12, 0,179, 7, 12, 0,180, 7, 12, 0,181, 7, 12, 0, 21, 6, - 46, 0,134, 0, 46, 0,182, 7, 2, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7, - 2, 0,189, 7, 2, 0,190, 7, 2, 0,191, 7, 2, 0,192, 7, 4, 0, 70, 0,213, 0,193, 7, 9, 0,194, 7, 2, 0,195, 7, - 0, 1, 5, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1,196, 7, 13, 0,197, 7, 4, 0, 19, 0, 1, 1, 7, 0, 1, 1, 0, 0, - 1, 1, 1, 0, 0, 1,198, 7, 0, 1,199, 7, 2, 0, 16, 5, 2, 0, 19, 0, 4, 0, 37, 0, 2, 1, 25, 0, 2, 1, 0, 0, - 2, 1, 1, 0, 3, 1,200, 7, 4, 1,111, 6, 0, 0,201, 7, 0, 0,202, 7, 0, 0,203, 7, 2, 0,204, 7, 2, 0,205, 7, - 2, 0,206, 7, 2, 0,207, 7, 2, 0,208, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, - 4, 0,212, 7, 2, 1,213, 7, 9, 0,214, 7, 4, 0,215, 7, 4, 0,216, 7, 4, 0,217, 7, 4, 0,218, 7, 0, 0,219, 7, - 5, 1, 22, 0, 5, 1, 0, 0, 5, 1, 1, 0, 0, 1,198, 7, 0, 1,199, 7, 0, 1,220, 7, 0, 1,221, 7,218, 0,222, 7, - 23, 0, 52, 0, 0, 0, 22, 6, 0, 0,223, 7, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0,224, 7, 2, 0, 37, 0, 2, 0,186, 7, - 2, 0,191, 6, 2, 0, 19, 0, 6, 1,200, 7, 12, 0,225, 7, 12, 0, 21, 6, 12, 0,226, 7, 12, 0,227, 7, 7, 1, 22, 0, - 7, 1, 0, 0, 7, 1, 1, 0,216, 0, 75, 6, 23, 0,228, 7, 23, 0,229, 7, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0,230, 7, - 2, 0,231, 7, 2, 0,232, 7, 2, 0, 19, 0, 7, 0, 86, 2, 2, 0,206, 7, 2, 0,207, 7, 2, 0,185, 7, 2, 0,190, 7, - 8, 1,200, 7, 12, 0,233, 7, 12, 0,234, 7, 12, 0,226, 7, 0, 0,235, 7, 9, 0,236, 7, 9, 1, 12, 0, 0, 0,237, 7, - 2, 0,238, 7, 2, 0,239, 7, 2, 0,240, 7, 2, 0,241, 7, 2, 0, 3, 5, 2, 0,254, 4,218, 0,242, 7, 46, 0,243, 7, - 4, 0,244, 7, 4, 0,245, 7, 0, 0, 35, 0, 10, 1, 1, 0, 0, 0,246, 7, 11, 1, 8, 0, 57, 0,247, 7, 57, 0,248, 7, - 11, 1,249, 7, 11, 1,250, 7, 11, 1,251, 7, 2, 0,129, 0, 2, 0, 19, 0, 4, 0,252, 7, 12, 1, 4, 0, 4, 0,136, 6, - 4, 0,253, 7, 4, 0,141, 6, 4, 0,254, 7, 13, 1, 2, 0, 4, 0,255, 7, 4, 0, 0, 8, 14, 1, 7, 0, 7, 0, 1, 8, - 7, 0, 2, 8, 7, 0, 3, 8, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,123, 4, 7, 0, 4, 8, 15, 1, 6, 0, 0, 0, 5, 8, - 0, 0, 94, 6, 49, 0,137, 0, 2, 0,106, 0, 2, 0, 2, 5, 4, 0, 37, 0, 16, 1, 21, 0, 16, 1, 0, 0, 16, 1, 1, 0, - 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 6, 8, 4, 0, 7, 8, 4, 0, 8, 8, 10, 1, 9, 8, 0, 0, 5, 8, - 4, 0, 10, 8, 4, 0, 11, 8, 15, 1, 89, 3, 12, 1, 12, 8, 13, 1, 13, 8, 14, 1, 14, 8, 11, 1, 15, 8, 11, 1, 16, 8, - 11, 1, 17, 8, 57, 0, 18, 8, 57, 0, 19, 8, 17, 1, 12, 0, 0, 0, 6, 2, 9, 0,223, 0, 0, 0,224, 0, 4, 0,227, 0, - 4, 0,235, 0, 9, 0,228, 0, 7, 0,230, 0, 7, 0,231, 0, 9, 0, 20, 8, 9, 0, 21, 8, 9, 0,232, 0, 9, 0,234, 0, - 18, 1, 45, 0, 18, 1, 0, 0, 18, 1, 1, 0, 9, 0, 22, 8, 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17, 0, - 4, 0, 23, 0, 4, 0, 88, 0, 4, 0, 23, 8, 4, 0, 24, 8, 4, 0, 7, 8, 4, 0, 8, 8, 4, 0, 25, 8, 4, 0,246, 0, - 4, 0, 26, 8, 4, 0, 27, 8, 7, 0, 28, 8, 7, 0, 29, 8, 4, 0,126, 0, 4, 0, 30, 8, 16, 1, 31, 8, 36, 0, 80, 0, - 46, 0,134, 0, 49, 0,137, 0, 7, 0, 32, 8, 7, 0, 33, 8, 17, 1, 60, 1, 18, 1, 34, 8, 18, 1, 35, 8, 18, 1, 36, 8, - 12, 0, 37, 8, 19, 1, 38, 8, 9, 0, 39, 8, 7, 0,247, 3, 7, 0, 37, 0, 7, 0, 40, 8, 7, 0, 41, 8, 4, 0, 42, 8, - 7, 0, 43, 8, 9, 0, 44, 8, 4, 0, 45, 8, 4, 0, 46, 8, 4, 0, 47, 8, 7, 0, 48, 8, 20, 1, 4, 0, 20, 1, 0, 0, - 20, 1, 1, 0, 12, 0, 49, 8, 18, 1, 50, 8,204, 0, 6, 0, 12, 0, 51, 8, 12, 0, 37, 8, 12, 0, 52, 8, 18, 1, 53, 8, - 0, 0, 54, 8, 0, 0, 55, 8, 21, 1, 4, 0, 7, 0, 56, 8, 7, 0,109, 0, 2, 0, 57, 8, 2, 0, 58, 8, 22, 1, 6, 0, - 7, 0, 59, 8, 7, 0, 60, 8, 7, 0, 61, 8, 7, 0, 62, 8, 4, 0, 63, 8, 4, 0, 64, 8, 23, 1, 13, 0, 7, 0, 65, 8, - 7, 0, 66, 8, 7, 0, 67, 8, 7, 0, 68, 8, 7, 0, 69, 8, 7, 0, 70, 8, 7, 0, 71, 8, 7, 0, 72, 8, 7, 0, 73, 8, - 7, 0, 74, 8, 4, 0,234, 2, 4, 0, 75, 8, 4, 0, 76, 8, 24, 1, 2, 0, 7, 0,100, 5, 7, 0, 37, 0, 25, 1, 5, 0, - 7, 0, 77, 8, 7, 0, 78, 8, 4, 0, 90, 0, 4, 0,192, 2, 4, 0, 79, 8, 26, 1, 6, 0, 26, 1, 0, 0, 26, 1, 1, 0, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 80, 8, 2, 0, 57, 0, 27, 1, 8, 0, 27, 1, 0, 0, 27, 1, 1, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 2, 0, 80, 8, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,126, 0, 28, 1, 45, 0, 28, 1, 0, 0, 28, 1, 1, 0, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 80, 8, 2, 0,242, 0, 2, 0, 33, 4, 2, 0, 81, 8, 7, 0, 82, 8, 7, 0, 89, 0, - 7, 0,247, 2, 4, 0, 83, 8, 4, 0, 82, 0, 4, 0,194, 2, 7, 0, 84, 8, 7, 0, 85, 8, 7, 0, 86, 8, 7, 0, 87, 8, - 7, 0, 88, 8, 7, 0, 89, 8, 7, 0,244, 2, 7, 0, 57, 1, 7, 0, 90, 8, 7, 0, 91, 8, 7, 0, 37, 0, 7, 0, 92, 8, - 7, 0, 93, 8, 7, 0, 94, 8, 2, 0, 95, 8, 2, 0, 96, 8, 2, 0, 97, 8, 2, 0, 98, 8, 2, 0, 99, 8, 2, 0,100, 8, - 2, 0,101, 8, 2, 0,102, 8, 2, 0, 29, 2, 2, 0,103, 8, 2, 0, 26, 2, 2, 0,104, 8, 0, 0,105, 8, 0, 0,106, 8, - 7, 0,240, 0, 29, 1,107, 8, 67, 0,242, 1, 30, 1, 16, 0, 30, 1, 0, 0, 30, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, - 2, 0, 80, 8, 2, 0,242, 0, 7, 0,239, 2, 7, 0,240, 2, 7, 0,241, 2, 7, 0, 75, 2, 7, 0,242, 2, 7, 0,243, 2, - 7, 0,108, 8, 7, 0,244, 2, 7, 0,246, 2, 7, 0,247, 2,230, 0, 5, 0, 2, 0, 17, 0, 2, 0,252, 7, 2, 0, 19, 0, - 2, 0,109, 8, 27, 0,165, 6,229, 0, 3, 0, 4, 0, 69, 0, 4, 0,110, 8,230, 0, 2, 0, 31, 1, 7, 0, 31, 1, 0, 0, - 31, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,111, 8, 32, 1, 5, 0, 0, 0, 20, 0, - 7, 0, 77, 1, 7, 0,112, 8, 4, 0,113, 8, 4, 0, 37, 0, 33, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 43, 0, - 2, 0, 70, 0, 34, 1, 4, 0, 0, 0, 20, 0, 66, 0,114, 8, 7, 0, 77, 1, 7, 0, 37, 0, 35, 1, 6, 0, 2, 0,115, 8, - 2, 0,116, 8, 2, 0, 17, 0, 2, 0,117, 8, 0, 0,118, 8, 0, 0,119, 8, 36, 1, 5, 0, 4, 0, 17, 0, 4, 0, 37, 0, - 0, 0, 20, 0, 0, 0,120, 8, 0, 0,121, 8, 37, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 38, 1, 4, 0, - 2, 0,122, 8, 2, 0,123, 8, 2, 0, 19, 0, 2, 0, 37, 0, 39, 1, 6, 0, 0, 0, 20, 0, 0, 0,124, 8, 2, 0,125, 8, - 2, 0,244, 2, 2, 0, 70, 1, 2, 0, 70, 0, 40, 1, 5, 0, 0, 0, 20, 0, 7, 0,109, 0, 7, 0,125, 4, 2, 0, 19, 0, - 2, 0,206, 2, 41, 1, 3, 0, 0, 0, 20, 0, 4, 0,194, 2, 4, 0,122, 8, 42, 1, 7, 0, 0, 0, 20, 0, 7, 0,125, 4, - 0, 0,126, 8, 0, 0,127, 8, 2, 0, 70, 1, 2, 0, 43, 0, 4, 0,128, 8, 43, 1, 4, 0, 0, 0,129, 8, 0, 0,130, 8, - 4, 0, 17, 0, 7, 0,210, 2, 44, 1, 3, 0, 32, 0,131, 8, 0, 0,132, 8, 0, 0,133, 8, 45, 1, 18, 0, 45, 1, 0, 0, - 45, 1, 1, 0, 2, 0, 17, 0, 2, 0,134, 8, 2, 0, 19, 0, 2, 0,135, 8, 2, 0,136, 8, 2, 0,137, 8, 2, 0, 43, 0, - 2, 0, 70, 0, 0, 0, 20, 0, 9, 0, 2, 0, 46, 1,138, 8, 32, 0, 45, 0, 2, 0,117, 5, 2, 0, 40, 8, 2, 0,139, 8, - 2, 0, 37, 0, 47, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,140, 8, 2, 0, 19, 0, 2, 0,206, 2, 2, 0,141, 8, - 4, 0,142, 8, 4, 0,143, 8, 4, 0,144, 8, 4, 0,145, 8, 4, 0,146, 8, 48, 1, 1, 0, 0, 0,147, 8, 49, 1, 4, 0, - 42, 0,135, 6, 0, 0,101, 7, 4, 0, 70, 1, 4, 0, 19, 0, 46, 1, 18, 0, 46, 1, 0, 0, 46, 1, 1, 0, 46, 1,148, 8, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,149, 8, 2, 0,137, 8, 2, 0,134, 8, 2, 0,150, 8, 2, 0, 70, 0, 2, 0,239, 1, - 0, 0, 20, 0, 9, 0, 2, 0, 50, 1,138, 8, 45, 1,151, 8, 2, 0, 15, 0, 2, 0,152, 8, 4, 0,153, 8, 51, 1, 3, 0, - 4, 0,220, 2, 4, 0, 37, 0, 32, 0, 45, 0, 52, 1, 12, 0,160, 0,154, 8, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 82, 8, - 4, 0, 89, 0, 0, 0, 20, 0, 0, 0,155, 8, 2, 0,156, 8, 2, 0,157, 8, 2, 0,158, 8, 2, 0,159, 8, 7, 0,160, 8, - 53, 1, 13, 0, 2, 0, 19, 0, 2, 0,161, 8, 4, 0, 43, 0, 4, 0, 70, 0, 2, 0,162, 8, 7, 0,247, 3, 7, 0,163, 8, - 19, 1, 38, 8, 54, 1,164, 8, 2, 0, 17, 0, 2, 0,122, 1, 2, 0,235, 5, 2, 0,165, 8, 55, 1, 11, 0, 4, 0,220, 2, - 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 45, 0, 80, 0,166, 8, 0, 0, 20, 0, 7, 0,167, 8, 7, 0,168, 8, 7, 0,132, 3, - 2, 0,169, 8, 2, 0,170, 8, 56, 1, 5, 0, 2, 0, 17, 0, 2, 0, 43, 0, 4, 0, 37, 0, 46, 0,134, 0, 32, 0,107, 5, - 57, 1, 5, 0, 4, 0, 37, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,120, 8, 32, 0, 45, 0, 58, 1, 13, 0, 2, 0, 19, 0, - 2, 0, 17, 0, 2, 0,134, 8, 2, 0,133, 3, 7, 0,171, 8, 7, 0,172, 8, 7, 0,137, 1, 7, 0,145, 3, 7, 0,104, 3, - 7, 0,107, 3, 7, 0,173, 8, 7, 0,174, 8, 32, 0,175, 8, 59, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0, 82, 8, - 4, 0, 89, 0, 0, 0, 20, 0, 0, 0,155, 8, 2, 0, 43, 0, 2, 0, 70, 0, 2, 0,239, 1, 2, 0,122, 1, 60, 1, 8, 0, - 32, 0, 45, 0, 7, 0,241, 2, 7, 0,176, 8, 7, 0,177, 8, 7, 0, 37, 0, 2, 0, 43, 0, 2, 0,206, 2, 7, 0, 70, 0, - 61, 1, 12, 0, 2, 0, 17, 0, 2, 0, 70, 1, 2, 0, 19, 0, 2, 0,244, 2, 2, 0,220, 2, 2, 0,178, 8, 4, 0, 37, 0, - 7, 0,179, 8, 7, 0,180, 8, 7, 0,181, 8, 7, 0,182, 8, 0, 0,183, 8, 62, 1, 9, 0, 2, 0, 19, 0, 2, 0, 17, 0, - 4, 0, 82, 8, 4, 0, 89, 0, 0, 0, 20, 0, 2, 0,137, 1, 2, 0, 64, 0, 2, 0,184, 8, 2, 0,185, 8, 63, 1, 7, 0, - 4, 0,194, 2, 4, 0,186, 8, 4, 0,187, 8, 4, 0,188, 8, 7, 0,189, 8, 7, 0,190, 8, 0, 0,126, 8, 64, 1, 7, 0, - 0, 0,191, 8, 32, 0,192, 8, 0, 0,132, 8, 2, 0,193, 8, 2, 0, 43, 0, 4, 0, 70, 0, 0, 0,133, 8, 65, 1, 6, 0, - 2, 0, 19, 0, 2, 0, 17, 0, 4, 0, 82, 8, 4, 0, 89, 0, 0, 0,194, 8, 0, 0,195, 8, 66, 1, 1, 0, 4, 0, 19, 0, - 67, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,196, 8, 7, 0,197, 8, 42, 0,135, 6, 68, 1, 4, 0, - 0, 0, 71, 2, 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 45, 0, 69, 1, 2, 0, 4, 0, 17, 0, 4, 0, 55, 6, 70, 1, 6, 0, - 0, 0,129, 8, 0, 0,130, 8, 4, 0, 17, 0, 7, 0, 37, 2, 32, 0, 49, 3, 32, 0,198, 8, 50, 1, 10, 0, 50, 1, 0, 0, - 50, 1, 1, 0, 50, 1,148, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,134, 8, 2, 0,199, 8, 0, 0, 20, 0, 9, 0, 2, 0, - 32, 0, 45, 0, 71, 1, 10, 0, 7, 0,132, 3, 7, 0,200, 8, 7, 0,201, 8, 7, 0,202, 8, 7, 0,203, 8, 4, 0, 19, 0, - 7, 0,178, 8, 7, 0,204, 8, 7, 0,205, 8, 7, 0, 37, 0, 54, 1, 8, 0, 7, 0,206, 8, 7, 0,207, 8, 7, 0,208, 8, - 7, 0,209, 8, 7, 0,210, 8, 7, 0,211, 8, 7, 0,212, 8, 7, 0,213, 8, 19, 1, 16, 0, 27, 0, 31, 0, 0, 0,222, 0, - 43, 0,149, 0, 9, 0,223, 0, 43, 0,214, 8, 36, 0, 80, 0, 7, 0,247, 3, 7, 0,215, 8, 7, 0,163, 8, 7, 0,206, 8, - 7, 0,207, 8, 7, 0,216, 8, 4, 0, 90, 0, 4, 0, 37, 0, 9, 0,217, 8, 9, 0,218, 8, 72, 1, 15, 0,215, 0, 0, 0, -215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 5, 1,219, 8,216, 0, 75, 6, 19, 1, 38, 8, 2, 0, 70, 1, - 2, 0,161, 8, 2, 0, 90, 2, 2, 0, 91, 2, 2, 0, 19, 0, 2, 0,127, 6, 4, 0, 70, 0, 73, 1, 6, 0, 73, 1, 0, 0, - 73, 1, 1, 0, 32, 0, 45, 0, 9, 0,220, 8, 4, 0,247, 0, 4, 0, 37, 0, 67, 0, 4, 0, 27, 0, 31, 0, 12, 0,221, 8, - 4, 0,131, 0, 7, 0,222, 8, 74, 1, 27, 0, 74, 1, 0, 0, 74, 1, 1, 0, 26, 0,223, 8, 74, 1, 38, 0, 12, 0,224, 8, - 0, 0, 20, 0, 7, 0,225, 8, 7, 0,226, 8, 7, 0,227, 8, 7, 0,228, 8, 4, 0, 19, 0, 7, 0,229, 8, 7, 0,230, 8, - 7, 0,231, 8, 7, 0, 77, 1, 7, 0, 37, 2, 7, 0,232, 8, 7, 0,192, 2, 7, 0,233, 8, 7, 0,234, 8, 7, 0,235, 8, - 7, 0,236, 8, 7, 0,237, 8, 7, 0,172, 0, 4, 0,131, 0, 2, 0,146, 5, 2, 0,137, 1, 75, 1, 25, 0, 27, 0, 31, 0, - 39, 0, 75, 0, 12, 0,238, 8, 12, 0,239, 8, 12, 0,240, 8, 74, 1,241, 8, 9, 0,242, 8, 9, 0,243, 8, 4, 0, 19, 0, - 4, 0, 31, 6, 2, 0,248, 2, 2, 0, 85, 6, 4, 0, 37, 0, 4, 0,131, 0, 4, 0,244, 8, 2, 0,245, 8, 2, 0,246, 8, - 2, 0,247, 8, 2, 0,248, 8, 4, 0,249, 8, 4, 0,250, 8, 4, 0,251, 8, 4, 0,252, 8, 4, 0,253, 8, 4, 0,254, 8, - 76, 1, 2, 0, 7, 0,153, 2, 4, 0, 19, 0,164, 0, 5, 0, 76, 1,255, 8, 4, 0,192, 2, 4, 0, 0, 9, 4, 0, 1, 9, - 4, 0, 19, 0,163, 0, 16, 0, 4, 0, 2, 9, 4, 0, 3, 9, 4, 0, 4, 9, 4, 0, 5, 9, 2, 0, 6, 9, 2, 0, 7, 9, - 2, 0, 8, 9, 2, 0,247, 0, 2, 0, 9, 9, 2, 0, 10, 9, 2, 0, 11, 9, 2, 0, 12, 9, 4, 0, 13, 9, 4, 0, 14, 9, - 4, 0, 15, 9, 4, 0, 16, 9, 77, 1, 44, 0, 77, 1, 0, 0, 77, 1, 1, 0, 26, 0,223, 8, 12, 0,159, 3, 0, 0, 20, 0, - 2, 0, 19, 0, 2, 0, 17, 9, 2, 0, 18, 9, 2, 0, 19, 9, 2, 0,118, 3, 2, 0, 20, 9, 4, 0, 73, 2, 4, 0,251, 8, - 4, 0,252, 8, 74, 1, 21, 9, 77, 1, 38, 0, 77, 1, 22, 9, 12, 0, 23, 9, 9, 0, 24, 9, 9, 0, 25, 9, 9, 0, 26, 9, - 7, 0, 65, 1, 7, 0,172, 0, 7, 0, 27, 9, 7, 0, 16, 2, 7, 0,109, 3, 7, 0,111, 3, 2, 0,141, 3, 2, 0, 37, 0, - 7, 0, 28, 9, 7, 0, 29, 9, 7, 0,114, 3, 7, 0, 30, 9, 7, 0, 31, 9, 7, 0, 32, 9, 7, 0, 33, 9, 7, 0, 34, 9, - 7, 0, 35, 9, 7, 0, 36, 9, 7, 0, 37, 9, 7, 0, 66, 2,164, 0, 97, 3, 32, 0, 38, 9, 77, 1, 39, 9,161, 0, 12, 0, - 12, 0, 40, 9, 2, 0, 19, 0, 2, 0, 41, 9, 7, 0,102, 2, 7, 0, 42, 9, 7, 0, 43, 9, 12, 0, 44, 9, 4, 0, 45, 9, - 4, 0, 46, 9, 9, 0, 47, 9, 9, 0, 48, 9,163, 0, 96, 3, 78, 1, 1, 0, 4, 0, 46, 9, 79, 1, 12, 0, 4, 0, 46, 9, - 7, 0,146, 8, 2, 0, 49, 9, 2, 0, 50, 9, 7, 0, 51, 9, 7, 0, 52, 9, 2, 0, 53, 9, 2, 0, 19, 0, 7, 0, 54, 9, - 7, 0, 55, 9, 7, 0, 56, 9, 7, 0, 57, 9, 80, 1, 7, 0, 80, 1, 0, 0, 80, 1, 1, 0, 12, 0, 58, 9, 4, 0, 19, 0, - 4, 0, 59, 9, 0, 0,238, 3,251, 0, 60, 9,160, 0, 7, 0, 27, 0, 31, 0, 12, 0, 61, 9, 12, 0, 40, 9, 12, 0, 62, 9, - 12, 0,100, 0, 4, 0, 19, 0, 4, 0, 63, 9,220, 0, 5, 0, 27, 0, 64, 9, 12, 0, 40, 9, 67, 0, 65, 9, 4, 0, 66, 9, - 4, 0, 19, 0, 81, 1, 13, 0,215, 0, 0, 0,215, 0, 1, 0, 12, 0, 21, 6, 4, 0, 22, 6, 7, 0, 23, 6, 2, 0, 24, 6, -216, 0, 75, 6,160, 0, 92, 3,220, 0, 67, 9, 0, 0, 70, 1, 0, 0, 78, 6, 2, 0, 19, 0, 7, 0, 68, 9, 82, 1, 8, 0, - 82, 1, 0, 0, 82, 1, 1, 0, 80, 1, 69, 9, 36, 0, 80, 0, 12, 0, 98, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0, 70, 9, - 83, 1, 5, 0, 83, 1, 0, 0, 83, 1, 1, 0, 36, 0, 80, 0, 2, 0, 19, 0, 0, 0, 71, 9, 84, 1, 14, 0, 84, 1, 0, 0, - 84, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 72, 9, 0, 0, 73, 9, 0, 0, 71, 9, 7, 0, 74, 9, - 7, 0, 75, 9, 4, 0, 37, 0, 36, 0, 80, 0, 7, 0, 76, 9, 7, 0, 77, 9, 85, 1, 9, 0, 85, 1, 0, 0, 85, 1, 1, 0, - 32, 0, 78, 9, 0, 0,251, 2, 7, 0, 79, 9, 2, 0, 80, 9, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 81, 9, 86, 1, 7, 0, - 42, 0,135, 6, 26, 0,223, 8, 4, 0, 19, 0, 4, 0, 82, 9, 12, 0, 83, 9, 32, 0, 78, 9, 0, 0,251, 2, 87, 1, 15, 0, - 32, 0, 78, 9, 2, 0, 84, 9, 2, 0, 19, 0, 2, 0, 85, 9, 2, 0, 86, 9, 0, 0,251, 2, 32, 0, 87, 9, 0, 0, 88, 9, - 7, 0, 89, 9, 7, 0, 37, 2, 7, 0, 90, 9, 7, 0, 91, 9, 2, 0, 17, 0, 2, 0, 70, 1, 7, 0, 77, 1, 88, 1, 6, 0, - 32, 0, 78, 9, 7, 0,255, 8, 2, 0, 92, 9, 2, 0, 93, 9, 2, 0, 19, 0, 2, 0, 94, 9, 89, 1, 6, 0, 32, 0, 78, 9, - 4, 0, 95, 9, 4, 0, 96, 9, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,251, 2, 90, 1, 4, 0, 32, 0, 78, 9, 4, 0, 19, 0, - 4, 0, 95, 9, 0, 0,251, 2, 91, 1, 4, 0, 32, 0, 78, 9, 4, 0, 19, 0, 4, 0, 95, 9, 0, 0,251, 2, 92, 1, 4, 0, - 32, 0, 78, 9, 4, 0, 19, 0, 4, 0, 95, 9, 0, 0,251, 2, 93, 1, 2, 0, 32, 0, 78, 9, 0, 0,251, 2, 94, 1, 10, 0, - 32, 0, 78, 9, 4, 0, 97, 9, 7, 0,125, 0, 4, 0, 19, 0, 2, 0,130, 6, 2, 0, 98, 9, 2, 0, 43, 0, 2, 0, 70, 0, - 7, 0, 99, 9, 0, 0,251, 2, 95, 1, 10, 0, 32, 0, 78, 9, 2, 0, 17, 0, 2, 0, 41, 4, 4, 0, 88, 0, 4, 0, 89, 0, - 7, 0,176, 8, 7, 0,177, 8, 4, 0, 37, 0,160, 0,154, 8, 0, 0,251, 2, 96, 1, 4, 0, 32, 0, 78, 9, 4, 0,119, 3, - 4, 0,100, 9, 0, 0,251, 2, 97, 1, 4, 0, 32, 0, 78, 9, 4, 0,119, 3, 4, 0, 37, 0, 0, 0,251, 2, 98, 1, 6, 0, - 32, 0, 78, 9, 7, 0,125, 0, 7, 0,101, 9, 4, 0,102, 9, 2, 0,119, 3, 2, 0,120, 3, 99, 1, 6, 0, 32, 0, 78, 9, - 4, 0,103, 9, 4, 0,104, 9, 7, 0,105, 9, 7, 0,106, 9, 0, 0,251, 2,100, 1, 16, 0, 32, 0, 78, 9, 32, 0, 22, 9, - 4, 0, 17, 0, 7, 0,107, 9, 7, 0,108, 9, 7, 0,109, 9, 7, 0,110, 9, 7, 0,111, 9, 7, 0,112, 9, 7, 0,113, 9, - 7, 0,114, 9, 7, 0,115, 9, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 0,101, 1, 3, 0, 32, 0, 78, 9, - 4, 0, 19, 0, 4, 0, 29, 2,102, 1, 5, 0, 32, 0, 78, 9, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,116, 9, 0, 0,251, 2, -103, 1, 10, 0, 32, 0, 78, 9, 0, 0,251, 2, 2, 0,117, 9, 2, 0,118, 9, 0, 0,119, 9, 0, 0,120, 9, 7, 0,121, 9, - 7, 0,122, 9, 7, 0,123, 9, 7, 0,124, 9,104, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, - 7, 0,125, 9, 7, 0,126, 9, 2, 0, 19, 0, 2, 0, 29, 2,105, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, - 7, 0, 12, 0, 7, 0,125, 9, 7, 0,126, 9, 2, 0, 19, 0, 2, 0, 29, 2,106, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, - 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,125, 9, 7, 0,126, 9, 2, 0, 19, 0, 2, 0, 29, 2,107, 1, 7, 0, 32, 0, 78, 9, - 0, 0,251, 2, 7, 0, 77, 1, 7, 0, 86, 1, 2, 0, 19, 0, 2, 0, 70, 1, 4, 0, 37, 0,108, 1, 5, 0, 32, 0, 49, 3, - 7, 0, 77, 1, 2, 0, 53, 3, 0, 0, 55, 3, 0, 0,127, 9,109, 1, 10, 0,109, 1, 0, 0,109, 1, 1, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 0, 0,128, 9, 7, 0, 21, 1, 7, 0, 22, 1, 2, 0, 58, 9, 2, 0,129, 9, 32, 0, 45, 0,110, 1, 22, 0, -110, 1, 0, 0,110, 1, 1, 0, 2, 0, 19, 0, 2, 0, 70, 1, 2, 0,130, 9, 2, 0,131, 9, 36, 0, 80, 0,160, 0,154, 8, - 32, 0,164, 0, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,132, 9, 7, 0,133, 9, 7, 0,134, 9, 7, 0,135, 9, 7, 0,237, 2, - 7, 0,136, 9, 7, 0,156, 8, 7, 0,137, 9, 0, 0,138, 9, 0, 0,139, 9, 12, 0,100, 3,111, 1, 8, 0, 7, 0, 44, 2, - 7, 0,176, 8, 7, 0,177, 8, 9, 0, 2, 0, 2, 0,140, 9, 2, 0,141, 9, 2, 0,142, 9, 2, 0,143, 9,112, 1, 18, 0, -112, 1, 0, 0,112, 1, 1, 0,112, 1,144, 9, 0, 0, 20, 0,111, 1,145, 9, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,146, 9, - 2, 0,147, 9, 2, 0,148, 9, 2, 0,149, 9, 4, 0, 43, 0, 7, 0,150, 9, 7, 0,151, 9, 4, 0,152, 9, 4, 0,153, 9, -112, 1,154, 9,113, 1,155, 9,114, 1, 33, 0,114, 1, 0, 0,114, 1, 1, 0,114, 1,156, 9, 0, 0, 20, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 2, 0, 6, 8, 2, 0, 40, 8, 2, 0,157, 9, 2, 0,133, 0, 2, 0,147, 9, 2, 0,252, 7, 12, 0,149, 8, - 12, 0,158, 9, 27, 0,165, 6, 9, 0,159, 9, 7, 0,150, 9, 7, 0,151, 9, 7, 0, 75, 2, 7, 0,160, 9, 2, 0,161, 9, - 2, 0,162, 9, 7, 0,163, 9, 7, 0,164, 9, 2, 0,165, 9, 2, 0,166, 9, 9, 0,167, 9, 24, 0,168, 9, 24, 0,169, 9, - 24, 0,170, 9,115, 1,150, 0,116, 1,171, 9,117, 1,172, 9,113, 1, 8, 0,113, 1, 0, 0,113, 1, 1, 0,114, 1,173, 9, -114, 1,174, 9,112, 1,175, 9,112, 1,154, 9, 4, 0, 19, 0, 4, 0, 37, 0, 60, 0, 22, 0, 27, 0, 31, 0, 39, 0, 75, 0, -162, 0, 95, 3, 12, 0,176, 9, 12, 0,177, 9,111, 1,178, 9, 12, 0,179, 9, 4, 0, 17, 0, 4, 0,180, 9, 4, 0,181, 9, - 4, 0,182, 9, 4, 0, 19, 0, 4, 0, 37, 0, 12, 0,183, 9,117, 1,184, 9, 4, 0,185, 9, 9, 0,186, 9, 9, 0,187, 9, - 4, 0,188, 9, 9, 0,189, 9, 9, 0,190, 9, 9, 0,191, 9,118, 1, 6, 0, 4, 0,124, 0, 4, 0,126, 0, 4, 0,252, 7, - 0, 0,192, 9, 0, 0,193, 9, 2, 0, 37, 0,119, 1, 16, 0, 2, 0,206, 7, 2, 0,207, 7, 2, 0,194, 9, 2, 0,201, 8, - 2, 0,195, 9, 2, 0, 68, 0, 7, 0,236, 2, 7, 0,196, 9, 7, 0,197, 9, 2, 0, 92, 1, 0, 0,198, 9, 0, 0,199, 9, - 2, 0,200, 9, 2, 0, 37, 0, 4, 0,201, 9, 4, 0,202, 9,120, 1, 9, 0, 7, 0,203, 9, 7, 0,204, 9, 7, 0,216, 8, - 7, 0,109, 0, 7, 0,205, 9, 7, 0, 91, 6, 2, 0,206, 9, 0, 0,207, 9, 0, 0, 37, 0,121, 1, 4, 0, 7, 0,208, 9, - 7, 0,209, 9, 2, 0,206, 9, 2, 0, 37, 0,122, 1, 3, 0, 7, 0,210, 9, 7, 0,211, 9, 7, 0, 15, 0,123, 1, 7, 0, - 0, 0, 6, 2, 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 2, 5, 2, 0,196, 4, 4, 0,126, 0, 4, 0, 39, 4,124, 1, 7, 0, - 7, 0,212, 9, 7, 0,213, 9, 7, 0,214, 9, 7, 0, 86, 2, 7, 0,215, 9, 7, 0,216, 9, 7, 0,217, 9,125, 1, 4, 0, - 2, 0,218, 9, 2, 0,219, 9, 2, 0,220, 9, 2, 0,221, 9,126, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,127, 1, 2, 0, - 0, 0,166, 0, 0, 0,222, 9,128, 1, 1, 0, 0, 0, 20, 0,129, 1, 10, 0, 0, 0,223, 9, 0, 0,224, 9, 0, 0, 84, 6, - 0, 0,225, 9, 2, 0,194, 9, 2, 0,226, 9, 7, 0,227, 9, 7, 0,228, 9, 7, 0,229, 9, 7, 0,136, 9,130, 1, 2, 0, - 9, 0,230, 9, 9, 0,231, 9,131, 1, 11, 0, 0, 0, 2, 5, 0, 0, 17, 0, 0, 0,206, 9, 0, 0,109, 0, 0, 0,232, 9, - 0, 0,106, 0, 0, 0, 71, 2, 7, 0,233, 9, 7, 0,234, 9, 7, 0,235, 9, 7, 0,236, 9,132, 1, 8, 0, 7, 0,115, 8, - 7, 0,125, 0, 7, 0,199, 9, 7, 0,158, 2, 7, 0,237, 9, 7, 0,236, 0, 7, 0,238, 9, 4, 0, 17, 0,133, 1, 4, 0, - 2, 0,239, 9, 2, 0,240, 9, 2, 0,241, 9, 2, 0, 37, 0,134, 1, 6, 0, 7, 0,242, 9, 7, 0,200, 2, 7, 0,243, 9, - 7, 0, 1, 8, 7, 0, 2, 8, 7, 0, 3, 8,135, 1, 1, 0, 0, 0, 20, 0,136, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, - 2, 0, 19, 0, 2, 0,244, 9,137, 1, 10, 0, 2, 0,227, 3, 2, 0, 19, 0, 7, 0,125, 4, 7, 0,245, 9, 7, 0,246, 9, - 7, 0,247, 9, 7, 0,248, 9,136, 1,249, 9,136, 1,250, 9,136, 1,251, 9, 63, 0, 9, 0, 4, 0, 19, 0, 4, 0, 64, 0, - 24, 0,252, 9, 24, 0,253, 9,137, 1,254, 9, 7, 0,255, 9, 7, 0, 0, 10, 7, 0, 1, 10, 7, 0, 2, 10,232, 0, 9, 0, - 4, 0, 58, 9, 4, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0, 6, 10, 7, 0, 10, 0, 7, 0, 12, 0, 4, 0,129, 0, - 4, 0, 19, 0,138, 1, 4, 0, 47, 0,230, 2, 7, 0, 7, 10, 7, 0,171, 1, 7, 0, 37, 0,193, 0, 18, 0, 27, 0, 31, 0, -138, 1, 8, 10, 63, 0,249, 9, 51, 0, 9, 10, 2, 0, 19, 0, 2, 0,241, 5, 4, 0,106, 0, 7, 0, 10, 10, 7, 0, 83, 2, - 4, 0, 11, 10, 7, 0, 12, 10, 7, 0, 13, 10, 7, 0, 14, 10, 7, 0,171, 1, 0, 0, 15, 10, 0, 0, 16, 10, 0, 0, 17, 10, - 0, 0, 70, 0,139, 1, 10, 0, 4, 0, 17, 0, 4, 0,125, 0, 4, 0, 19, 0, 4, 0,181, 3, 4, 0, 18, 10, 4, 0, 19, 10, - 4, 0, 20, 10, 0, 0, 92, 0, 0, 0, 20, 0, 9, 0, 2, 0,140, 1, 1, 0, 0, 0, 35, 0, 91, 0, 7, 0,139, 1, 21, 10, - 4, 0, 22, 10, 4, 0, 23, 10, 4, 0, 24, 10, 4, 0, 37, 0, 9, 0, 25, 10,140, 1, 26, 10,141, 1, 5, 0, 7, 0,153, 2, - 7, 0,220, 2, 7, 0, 37, 2, 2, 0,129, 2, 2, 0, 37, 0,142, 1, 5, 0, 7, 0,153, 2, 7, 0, 27, 10, 7, 0, 28, 10, - 7, 0, 29, 10, 7, 0,220, 2,143, 1, 5, 0, 32, 0, 30, 10,144, 1, 22, 0, 7, 0,213, 5, 7, 0, 31, 10, 7, 0, 57, 0, -145, 1, 7, 0, 4, 0, 32, 10, 4, 0, 33, 10, 4, 0, 34, 10, 7, 0, 35, 10, 7, 0, 36, 10, 7, 0, 37, 10, 7, 0, 57, 0, -146, 1, 8, 0,146, 1, 0, 0,146, 1, 1, 0, 32, 0, 45, 0, 4, 0,255, 0, 2, 0, 19, 0, 2, 0, 70, 1, 7, 0,220, 2, - 7, 0,123, 8,147, 1, 6, 0,147, 1, 0, 0,147, 1, 1, 0, 32, 0, 45, 0, 2, 0,205, 2, 2, 0, 19, 0, 2, 0, 38, 10, -148, 1, 17, 0,142, 1,175, 3,142, 1, 39, 10,141, 1, 40, 10,142, 1,107, 8,143, 1, 41, 10, 4, 0, 82, 0, 7, 0,220, 2, - 7, 0,247, 2, 7, 0, 42, 10, 4, 0, 32, 10, 4, 0, 43, 10, 7, 0, 36, 10, 7, 0, 37, 10, 7, 0,106, 0, 4, 0, 44, 10, - 2, 0, 19, 0, 2, 0, 45, 10,149, 1,110, 0, 27, 0, 31, 0, 39, 0, 75, 0,150, 1, 46, 10,171, 0, 61, 4, 4, 0, 19, 0, - 2, 0, 17, 0, 2, 0,117, 9, 2, 0, 47, 10, 2, 0, 48, 10, 2, 0,141, 3, 2, 0, 49, 10, 2, 0, 50, 10, 2, 0, 51, 10, - 2, 0, 52, 10, 2, 0, 53, 10, 2, 0, 54, 10, 2, 0, 55, 10, 2, 0,245, 4, 2, 0,125, 5, 2, 0, 56, 10, 2, 0, 57, 10, - 2, 0, 58, 10, 2, 0, 59, 10, 2, 0, 60, 10, 2, 0, 26, 2, 2, 0,100, 8, 2, 0, 75, 8, 2, 0, 61, 10, 2, 0, 62, 10, - 2, 0,191, 3, 2, 0,192, 3, 2, 0, 63, 10, 2, 0, 64, 10, 2, 0, 65, 10, 2, 0, 66, 10, 7, 0, 67, 10, 7, 0, 68, 10, - 7, 0, 69, 10, 2, 0, 75, 5, 2, 0, 70, 10, 7, 0, 71, 10, 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 82, 8, 7, 0, 89, 0, - 7, 0,247, 2, 7, 0, 88, 8, 7, 0, 74, 10, 7, 0, 75, 10, 7, 0, 76, 10, 4, 0, 83, 8, 4, 0, 81, 8, 4, 0, 77, 10, - 7, 0, 84, 8, 7, 0, 85, 8, 7, 0, 86, 8, 7, 0, 78, 10, 7, 0, 79, 10, 7, 0, 80, 10, 7, 0, 81, 10, 7, 0, 82, 10, - 7, 0, 57, 0, 7, 0, 83, 10, 7, 0, 84, 10, 7, 0, 85, 10, 7, 0, 86, 10, 7, 0,132, 3, 7, 0,106, 0, 7, 0, 87, 10, - 7, 0, 88, 10, 7, 0, 89, 10, 7, 0, 90, 10, 7, 0, 91, 10, 7, 0, 92, 10, 7, 0, 93, 10, 4, 0, 94, 10, 4, 0, 95, 10, - 7, 0, 96, 10, 7, 0, 97, 10, 7, 0, 98, 10, 7, 0, 99, 10, 7, 0,100, 10, 7, 0,210, 0, 7, 0,101, 10, 7, 0,218, 3, - 7, 0,216, 3, 7, 0,217, 3, 7, 0,102, 10, 7, 0,103, 10, 7, 0,104, 10, 7, 0,105, 10, 7, 0,106, 10, 7, 0,107, 10, - 7, 0,108, 10, 7, 0,109, 10, 7, 0,110, 10, 7, 0,111, 10, 7, 0,112, 10, 7, 0,113, 10, 7, 0,114, 10, 4, 0,115, 10, - 4, 0,116, 10, 67, 0,164, 3, 12, 0,117, 10, 67, 0,118, 10, 32, 0,119, 10, 32, 0,120, 10, 36, 0, 80, 0,166, 0, 62, 1, -166, 0,121, 10,147, 0, 44, 0,147, 0, 0, 0,147, 0, 1, 0,149, 1,122, 10,148, 1,123, 10,145, 1, 22, 9,173, 0,243, 3, - 9, 0,244, 3,151, 1,124, 10,151, 1,125, 10, 12, 0,126, 10, 12, 0,127, 10,132, 0,128, 10,140, 0,129, 10,140, 0,130, 10, - 32, 0,131, 10, 32, 0,132, 10, 32, 0, 38, 0, 12, 0, 83, 9, 0, 0, 20, 0, 7, 0,240, 0, 7, 0, 18, 3, 7, 0,133, 10, - 4, 0,194, 2, 4, 0, 57, 0, 4, 0, 19, 0, 4, 0, 83, 8, 4, 0,134, 10, 4, 0,135, 10, 4, 0,136, 10, 2, 0,247, 0, - 2, 0,137, 10, 2, 0,138, 10, 2, 0,139, 10, 0, 0,140, 10, 2, 0,141, 10, 2, 0,142, 10, 2, 0,143, 10, 9, 0,144, 10, -136, 0, 60, 4, 12, 0, 5, 3, 12, 0,145, 10,152, 1,146, 10,153, 1,147, 10, 7, 0,148, 10,134, 0, 35, 0,154, 1,217, 8, - 7, 0, 30, 4, 7, 0,149, 10, 7, 0,150, 10, 7, 0,213, 5, 7, 0,142, 3, 7, 0,132, 3, 7, 0,151, 10, 7, 0, 85, 2, - 7, 0,152, 10, 7, 0,153, 10, 7, 0,154, 10, 7, 0,155, 10, 7, 0,156, 10, 7, 0,157, 10, 7, 0, 31, 4, 7, 0,158, 10, - 7, 0,159, 10, 7, 0,160, 10, 7, 0, 32, 4, 7, 0, 28, 4, 7, 0, 29, 4, 7, 0,161, 10, 7, 0,162, 10, 4, 0,163, 10, - 4, 0, 90, 0, 4, 0,164, 10, 4, 0,165, 10, 2, 0,166, 10, 2, 0,167, 10, 2, 0,168, 10, 2, 0,169, 10, 2, 0,170, 10, - 2, 0,171, 10,171, 0, 61, 4,135, 0, 8, 0,154, 1,172, 10, 7, 0,173, 10, 7, 0,174, 10, 7, 0,243, 1, 7, 0,175, 10, - 4, 0, 90, 0, 2, 0,176, 10, 2, 0,177, 10,155, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,178, 10, -156, 1, 6, 0,156, 1, 0, 0,156, 1, 1, 0,155, 1,255, 8, 4, 0,253, 0, 2, 0,179, 10, 2, 0, 19, 0,157, 1, 5, 0, -157, 1, 0, 0,157, 1, 1, 0, 12, 0,180, 10, 4, 0,181, 10, 4, 0, 19, 0,158, 1, 9, 0,158, 1, 0, 0,158, 1, 1, 0, - 12, 0,124, 0,157, 1,182, 10, 4, 0, 19, 0, 2, 0,179, 10, 2, 0,183, 10, 7, 0, 91, 0, 0, 0,184, 10,162, 0, 6, 0, - 27, 0, 31, 0, 12, 0, 18, 5, 4, 0, 19, 0, 2, 0,185, 10, 2, 0,186, 10, 9, 0,187, 10,159, 1, 7, 0,159, 1, 0, 0, -159, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 23, 0, 0, 0,188, 10, 0, 0,189, 10,160, 1, 5, 0, 12, 0,190, 10, - 4, 0,191, 10, 4, 0,192, 10, 4, 0, 19, 0, 4, 0, 37, 0,161, 1, 17, 0, 27, 0, 31, 0,162, 1,193, 10,162, 1,194, 10, - 12, 0,195, 10, 4, 0,196, 10, 2, 0,197, 10, 2, 0,198, 10, 12, 0,199, 10, 12, 0,200, 10,160, 1,201, 10, 12, 0,202, 10, - 12, 0,203, 10, 12, 0,204, 10, 12, 0,205, 10,163, 1,206, 10, 12, 0,207, 10,213, 0,208, 10,162, 1, 31, 0,162, 1, 0, 0, -162, 1, 1, 0, 9, 0,209, 10, 4, 0,184, 7, 2, 0,210, 10, 2, 0, 37, 0,218, 0, 74, 6,218, 0,211, 10, 0, 0,212, 10, - 2, 0,213, 10, 2, 0,214, 10, 2, 0,206, 7, 2, 0,207, 7, 2, 0,215, 10, 2, 0,216, 10, 2, 0,181, 3, 2, 0,191, 6, - 2, 0,217, 10, 2, 0,218, 10, 2, 0,185, 9,164, 1,219, 10,165, 1,220, 10,166, 1,221, 10, 4, 0,222, 10, 4, 0,223, 10, - 9, 0,224, 10, 12, 0,200, 10, 12, 0,226, 7, 12, 0,225, 10, 12, 0,226, 10, 12, 0,227, 10,167, 1, 17, 0,167, 1, 0, 0, -167, 1, 1, 0, 0, 0,228, 10, 26, 0, 30, 0, 2, 0,229, 10, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,230, 10, 2, 0,231, 10, - 2, 0,232, 10, 2, 0,233, 10, 2, 0,234, 10, 2, 0, 19, 0, 2, 0,235, 10, 2, 0, 31, 0, 2, 0, 37, 0,168, 1,236, 10, -169, 1, 10, 0,169, 1, 0, 0,169, 1, 1, 0, 12, 0,237, 10, 0, 0,228, 10, 2, 0,238, 10, 2, 0,239, 10, 2, 0, 19, 0, - 2, 0,240, 10, 4, 0,241, 10, 9, 0,242, 10,163, 1, 8, 0,163, 1, 0, 0,163, 1, 1, 0, 0, 0,228, 10, 0, 0,243, 10, - 0, 0,244, 10, 12, 0,138, 7, 4, 0,245, 10, 4, 0, 19, 0,226, 0, 14, 0,226, 0, 0, 0,226, 0, 1, 0, 0, 0,228, 10, - 26, 0, 30, 0,170, 1,200, 7, 9, 0,246, 10, 9, 0,247, 10,168, 1,236, 10,160, 1,248, 10, 12, 0,249, 10,226, 0,250, 10, - 4, 1,111, 6, 2, 0, 19, 0, 2, 0,137, 1,171, 1, 8, 0,171, 1, 0, 0,171, 1, 1, 0, 9, 0, 2, 0, 9, 0,251, 10, - 0, 0,238, 3, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0,252, 10,172, 1, 5, 0, 7, 0,253, 10, 4, 0,254, 10, 4, 0,255, 10, - 4, 0, 70, 1, 4, 0, 19, 0,173, 1, 6, 0, 7, 0, 0, 11, 7, 0, 1, 11, 7, 0, 2, 11, 7, 0, 3, 11, 4, 0, 17, 0, - 4, 0, 19, 0,174, 1, 5, 0, 7, 0,176, 8, 7, 0,177, 8, 7, 0,220, 2, 2, 0, 40, 2, 2, 0, 41, 2,175, 1, 5, 0, -174, 1, 2, 0, 4, 0, 54, 0, 7, 0, 4, 11, 7, 0,176, 8, 7, 0,177, 8,176, 1, 4, 0, 2, 0, 5, 11, 2, 0, 6, 11, - 2, 0, 7, 11, 2, 0, 8, 11,177, 1, 2, 0, 42, 0,162, 6, 26, 0,223, 8,178, 1, 3, 0, 24, 0, 9, 11, 4, 0, 19, 0, - 4, 0, 37, 0,179, 1, 6, 0, 7, 0,106, 0, 7, 0,222, 2, 7, 0, 10, 11, 7, 0, 37, 0, 2, 0,246, 0, 2, 0, 11, 11, -180, 1, 6, 0, 27, 0,165, 6, 0, 0, 12, 11, 0, 0, 13, 11, 2, 0, 14, 11, 2, 0, 19, 0, 4, 0, 15, 11,181, 1, 7, 0, -181, 1, 0, 0,181, 1, 1, 0, 0, 0,238, 3,180, 1, 16, 11, 2, 0, 17, 11, 2, 0, 17, 0, 7, 0, 61, 0,182, 1, 7, 0, - 12, 0, 18, 11, 0, 0, 19, 11, 9, 0, 20, 11, 7, 0, 61, 0, 7, 0,252, 10, 4, 0, 17, 0, 4, 0, 19, 0,183, 1, 3, 0, - 7, 0, 21, 11, 4, 0, 19, 0, 4, 0, 37, 0,184, 1, 15, 0,184, 1, 0, 0,184, 1, 1, 0, 80, 1, 69, 9,182, 1, 62, 0, - 12, 0,100, 3, 35, 0, 50, 0,183, 1, 22, 11, 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, 2, 0, 15, 1, 4, 0, 23, 11, - 0, 0, 12, 11, 4, 0, 24, 11, 7, 0, 25, 11,185, 1, 2, 0, 0, 0, 26, 11, 0, 0, 27, 11,186, 1, 4, 0,186, 1, 0, 0, -186, 1, 1, 0,160, 0, 49, 3, 12, 0, 28, 11,187, 1, 24, 0,187, 1, 0, 0,187, 1, 1, 0, 12, 0, 29, 11,160, 0,154, 8, -186, 1, 30, 11, 12, 0, 31, 11, 12, 0,100, 3, 0, 0,238, 3, 7, 0,252, 10, 7, 0, 32, 11, 7, 0, 88, 0, 7, 0, 89, 0, - 7, 0,132, 9, 7, 0,133, 9, 7, 0,237, 2, 7, 0,136, 9, 7, 0,156, 8, 7, 0,137, 9, 2, 0, 33, 11, 2, 0, 34, 11, - 2, 0, 43, 0, 2, 0, 17, 0, 4, 0, 19, 0, 4, 0, 70, 0,188, 1, 6, 0,188, 1, 0, 0,188, 1, 1, 0, 12, 0, 29, 11, - 4, 0, 19, 0, 4, 0,157, 2, 0, 0,238, 3,189, 1, 10, 0,189, 1, 0, 0,189, 1, 1, 0, 27, 0,165, 6, 0, 0, 35, 11, - 4, 0, 15, 11, 4, 0, 36, 11, 0, 0, 12, 11, 4, 0, 23, 11, 2, 0, 19, 0, 2, 0, 37, 11,190, 1, 7, 0,190, 1, 0, 0, -190, 1, 1, 0, 12, 0, 38, 11, 0, 0,238, 3, 2, 0, 19, 0, 2, 0, 39, 11, 4, 0, 40, 11,191, 1, 5, 0,191, 1, 0, 0, -191, 1, 1, 0, 0, 0, 12, 11, 4, 0, 23, 11, 7, 0,210, 2, 39, 0, 12, 0,160, 0, 92, 3,160, 0, 41, 11,186, 1, 30, 11, - 12, 0, 42, 11,187, 1, 43, 11, 12, 0, 44, 11, 12, 0, 45, 11, 4, 0, 19, 0, 4, 0,247, 0, 2, 0, 46, 11, 2, 0, 47, 11, - 7, 0, 48, 11,192, 1, 2, 0, 27, 0, 31, 0, 39, 0, 75, 0,193, 1, 5, 0,193, 1, 0, 0,193, 1, 1, 0, 4, 0, 17, 0, - 4, 0, 19, 0, 0, 0, 20, 0,194, 1, 6, 0,193, 1, 49, 11, 32, 0, 45, 0, 4, 0, 50, 11, 7, 0, 51, 11, 4, 0, 52, 11, - 4, 0, 58, 9,195, 1, 3, 0,193, 1, 49, 11, 4, 0, 50, 11, 7, 0, 53, 11,196, 1, 8, 0,193, 1, 49, 11, 32, 0, 45, 0, - 7, 0, 65, 1, 7, 0, 54, 11, 7, 0, 18, 3, 7, 0,216, 8, 4, 0, 50, 11, 4, 0, 55, 11,197, 1, 5, 0,193, 1, 49, 11, - 7, 0, 56, 11, 7, 0, 40, 8, 7, 0,243, 2, 7, 0, 57, 0,198, 1, 3, 0,193, 1, 49, 11, 7, 0,216, 8, 7, 0, 57, 11, -144, 1, 4, 0, 7, 0, 58, 11, 7, 0, 89, 10, 2, 0, 59, 11, 2, 0, 70, 1,199, 1, 14, 0,199, 1, 0, 0,199, 1, 1, 0, - 12, 0, 60, 11, 12, 0, 61, 11, 12, 0, 62, 11, 0, 0, 20, 0, 4, 0, 31, 0, 4, 0, 19, 0, 4, 0, 63, 11, 7, 0, 64, 11, - 4, 0, 52, 11, 4, 0, 58, 9, 7, 0,247, 3, 7, 0,245, 2,150, 1, 23, 0, 4, 0, 50, 11, 4, 0, 65, 11, 7, 0, 66, 11, - 7, 0, 57, 0, 7, 0, 67, 11, 7, 0,241, 2, 7, 0, 58, 11, 7, 0, 68, 11, 7, 0,222, 2, 7, 0, 69, 11, 7, 0,125, 4, - 7, 0, 70, 11, 7, 0, 71, 11, 7, 0, 72, 11, 7, 0, 73, 11, 7, 0, 74, 11, 7, 0, 75, 11, 7, 0, 76, 11, 7, 0, 77, 11, - 7, 0, 78, 11, 7, 0, 79, 11, 7, 0, 80, 11, 12, 0, 81, 11,120, 0, 36, 0,119, 0, 82, 11,200, 1, 83, 11, 67, 0, 84, 11, - 67, 0,118, 10, 67, 0, 85, 11,201, 1, 86, 11, 48, 0,165, 0, 48, 0, 87, 11, 48, 0, 88, 11, 7, 0, 89, 11, 7, 0, 90, 11, - 7, 0, 91, 11, 7, 0, 92, 11, 7, 0, 93, 11, 7, 0, 70, 9, 7, 0, 94, 11, 7, 0,171, 1, 7, 0, 95, 11, 4, 0, 96, 11, - 4, 0, 97, 11, 4, 0, 98, 11, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0, 99, 11, 2, 0,100, 11, 2, 0,101, 11, 4, 0,102, 11, - 7, 0,222, 2, 4, 0,103, 11, 7, 0,104, 11, 4, 0,105, 11, 4, 0,106, 11, 4, 0,107, 11,136, 0,108, 11, 12, 0,109, 11, -171, 0, 61, 4,121, 0, 11, 0,119, 0, 82, 11,147, 0, 35, 3, 7, 0,138, 1, 7, 0, 70, 9, 7, 0,110, 11, 7, 0,111, 11, - 2, 0,112, 11, 2, 0,113, 11, 2, 0,114, 11, 2, 0, 17, 0, 4, 0, 37, 0,122, 0, 13, 0,119, 0, 82, 11,138, 0, 15, 3, -140, 0, 17, 3, 7, 0,255, 8, 7, 0,115, 11, 7, 0,116, 11, 7, 0, 67, 1, 7, 0,117, 11, 4, 0, 92, 9, 4, 0, 13, 3, - 2, 0, 17, 0, 2, 0, 37, 0, 4, 0, 70, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}; diff --git a/source/blender/editors/datafiles/Bfont.c b/source/blender/editors/datafiles/Bfont.c index bbef7d1e2c3..324bcffde77 100644 --- a/source/blender/editors/datafiles/Bfont.c +++ b/source/blender/editors/datafiles/Bfont.c @@ -28,10 +28,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - int datatoc_Bfont_size= 25181; char datatoc_Bfont[]= {"\x80\x01\xe4\x01\x00\x00\x25\x21\x50\x53\x2d\x41\x64\x6f\x62\x65\x46\x6f\x6e\x74\x2d\x31\x2e\x30\x3a\x20\x42\x66\x6f\x6e\x74\x20\x30\x30\x31\x2e\x30\x30\x31\x0a\x31\x31\x20\x64\x69\x63\x74\x20\x62\x65\x67\x69\x6e\x0a\x2f\x46\x6f\x6e\x74\x49\x6e\x66\x6f\x20\x31\x30\x20\x64\x69\x63\x74\x20\x64\x75\x70\x20\x62\x65\x67\x69\x6e\x0a\x2f\x76\x65\x72\x73\x69\x6f\x6e\x20\x28" \ diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt new file mode 100644 index 00000000000..d37ee338733 --- /dev/null +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -0,0 +1,26 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public LicenseS +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC "") + +BLENDERLIB(bf_editor_datafiles "${SRC}" "${INC}") diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c index 64d2659dcb2..f4afe8b0252 100644 --- a/source/blender/editors/datafiles/blenderbuttons.c +++ b/source/blender/editors/datafiles/blenderbuttons.c @@ -1,6570 +1,6560 @@ /* DataToC output of file */ -int datatoc_blenderbuttons_size= 210034; +int datatoc_blenderbuttons_size= 209697; char datatoc_blenderbuttons[]= { -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, - 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, - 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108, -101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20, -145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, - 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, - 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179, -100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15, -234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0, -160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, - 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, - 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, - 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40, -206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243, -253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126, -209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, - 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253, -108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230, -143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, - 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116, -192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, - 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, - 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, - 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, - 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, - 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61, -212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171, -104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171, -198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78, -216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, - 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70, -210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51, -228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85, -163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173, -162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, - 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152, -231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85, -243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168, -135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179, -120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, - 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, - 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, - 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27, -161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, - 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, - 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, - 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231, -155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, - 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25, -176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135, -217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, - 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27, -198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, - 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, - 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, - 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65, -129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, - 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135, -133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, - 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54, -110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, - 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209, -136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, - 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118, -203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, - 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225, -146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, - 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235, -220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27, -135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13, -217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, - 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, - 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237, -199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, - 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29, -103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, - 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99, -206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154, -175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, - 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203, -187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243, -209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253, -233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147, -191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163, -223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, - 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, - 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 3, 41,157, 73, 68, 65, 84,120,218,236, 93,119,152, 19, 69, 31,126,103,179,233, -185,222, 27, 28,119,244,222,145,222,139,210,145,206,135, 32, 98,161,136, 21, 4, 11, 74,145,162, 72, 85, 16, 59,160, 72, 85, 16, - 84,138,210,123,239, 85,234,221,113,189,167,151,157,239,143,203,198, 92, 72, 46, 57, 56, 16,113,222,231,217, 39,217,246,238,204, -238,148,119,126,243,155, 25, 66, 41, 5, 3, 3, 3, 3, 3, 3, 3, 3, 67,217,131, 48,161,197,192,192,192,192,192,192,192,240, - 96,192,149,246,134,205,155, 55,251,172,204, 8, 33, 29,125,229,180,111,109, 30,117,206, 7, 24,119, 90,134,156,109,236,156, 31, -252, 75,194,217,230, 81,229, 20,227,235, 43,111,105, 56,125, 77, 83,165, 12, 39, 45,235,112, 62, 40,206,178,202, 71,110,194, 73, - 31,192,119,255,224, 95, 18,206, 54,143, 26,167,107,250,241,133,183,180,156,190,164,169,123, 8, 39, 45,235,112, 62, 40,206,251, -205, 71, 37,132,147,222,111, 90,242,240,237, 63,192,127, 8,252,131, 18, 89,165, 65,183,110,221,136, 19, 63,121, 84, 57,157,223, -131,200, 95,150, 97, 45, 67,236, 44,107, 78,151,247, 89, 86,248,160, 91,183,110,100,243,230,205,187, 0,180, 41,203,184,151,197, -119,119,137,107,153,240,150, 86,100,149,150,179,172,210,253,131,230, 44,171,188,228,202, 89, 22,233,222,221,119,127,128,223,168, -172,194, 89, 38,121,233, 65,164,121, 55,233,231,190,121, 93, 57,203, 34, 47,185,114,150, 69,186,127, 24,156,101,145,151,220,113, -150, 69,186,247,244,237,153, 69,235,225, 10, 2,215, 12,222,246, 81, 22, 68, 15, 74,108,250,106,129,121, 20, 56,203,248, 27,125, - 96,231, 44,203,214, 77,219,178,250, 70, 15, 34,189, 59,115,150, 21,191, 43, 79, 89,124, 39,119,156,247, 27, 94, 15,225, 44,243, -184,223,111,186,127, 88,156,101,252,141,202, 36, 47,185,112,182, 45,227,198, 64, 91,167,253, 15,202,146,179,172,242,146,155,112, -222,247,119,114,199,121,191,225,245, 16,206, 50,143,123, 89,212, 33, 15,138,247,177,181,104, 61, 72,145,245,160, 42,181,178,228, -126, 16, 86,157, 7,101,121, 43, 43,171,142, 27,222, 93,101, 72,183,179,172,195,105, 15, 31,121, 80,214,215, 71, 29, 44, 47,177, -188,244,168,229, 37,119,233,166, 91,183,110, 31,108,222,188,249,253, 71,173, 17,237,204, 89, 86,130,200, 77,220,239, 43, 47,185, -222, 91, 22,121,201, 11, 39,121, 16,241, 47,235,252,196,132, 86, 41, 44, 69,101,220, 50, 65, 25, 91, 96, 30, 88,188,203, 56,156, -109, 31,132,133,240, 1,160,204,195,105,111, 41,191,255, 0,226,254,111,121,167, 44, 47,177,188,244,200,229, 37,151, 52,217,182, - 12, 45, 69,101,106,121,118,229, 44,139,103, 56,115,148, 85, 26,125,208,113, 47,203,188,244, 32,190,253,191, 14,148,210, 7,182, - 1,232,200, 56, 25, 39,227,100,156,140,147,113, 50, 78,198,249, 95,221, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 60, 16,176,121, -180, 24, 24, 24, 24, 24, 24, 24, 24, 30,182,208,138,141,141,221,164, 86,171, 43,121,186, 81,171,213,222, 73, 73, 73,105,199, 94, - 33, 3, 3,131,215,130,134, 16, 14,127,143,114, 22, 0, 80,202, 90,121, 12, 12, 12,255, 1,120,116,134, 87, 40, 20,137, 23, 46, - 92,168, 34, 8, 2,108, 54, 27,172, 86,171,227,215,100, 50,161,117,235,214,165,118,164,143,138,138,218, 45,145, 72, 42,148,230, - 30,155,205,118, 43, 53, 53,181,101, 9, 5,248,126, 0,137,132, 16,231, 99, 37,254, 2, 72, 49,155,205, 13, 74,226, 36,132, 36, -186,242,121,224, 18,255,151,200, 25, 20, 20,116,148,231,249, 56,119, 92,158,254, 11,130,112, 45, 61, 61,189, 57, 75,166, 15, 7, - 81, 81, 81,187,121,158, 47,117,250,188,115,231,142,199,244, 25, 19, 19,115,130,227,184,152, 82, 80, 74, 4, 65,184,116,231,206, -157,150,158,132,136,152,230,189, 8,155, 98,255, 9, 33, 73, 86,171,181,145,183,124, 84, 18,151,155, 52, 90, 34,167,179,200,226, -121,126, 86, 68, 68,196, 40,157, 78,103, 0, 64, 37, 18, 9, 13, 13, 13, 21,195, 6, 0,176, 90,173, 25, 57, 57, 57,181, 89, 74, -100, 96, 96,248, 79, 8, 45, 65, 16, 56,163,209,136,203,151, 47,195, 67,121,111,187,135,231, 85, 57,246,199,182, 8,255,136, 72, - 88,205,102,104,194,194, 29,220,105,231,207,194,106, 49,195,106, 50,161,124,227,166, 98, 37,134,154, 53,107, 74,188,112,198,205, -158, 61, 59,194,223,223, 31, 6,131, 1, 6,131, 1, 70,163, 17, 6,131, 1, 38,147, 9, 38,147, 9,102,179, 25,102,179, 25, 86, -171, 21, 70,163, 17,219,183,111,247, 22,246,184, 15, 63,252, 48, 34, 32, 32,192,193, 39,110, 34,167,200,107,177, 88, 96, 48, 24, -240,231,159,127,150,200,201,243,124, 92, 74, 74, 74,132, 76, 38, 3,165, 20,130, 32,184,115, 46, 44,134,138, 21, 43,154, 89, 18, -125,168,168,242,225,202,205, 17,129, 42, 5,172,130,128,238,117, 43, 58, 78, 92,251,106, 13,168,213, 6,193,106, 69,229,177, 67, -129, 34,147, 12,106,212,168, 81, 98,250,164,148,198,127,184,114,115,144,175,156,153,153,153,250,234,213,171,167,160,104,232,179, - 39,139, 79,156, 94,175,143, 16,195,224, 42,136, 56,142, 43,182,109,217,178, 5,221,187,119,247, 22,247,184,215, 94,123, 45,194, - 98,177,192,100, 50,193,104, 52,194, 98,177,192,106,181, 58, 54,155,205,230,216, 76, 38, 19, 14, 29, 58,228,171, 37,107,118,167, - 78,157, 70,108,222,188, 89,243,243,207, 63,107, 42, 84,168, 0,153, 76, 6,137, 68, 2,137, 68, 2,142,227,192,243, 60,158,120, -226, 9,194,146, 32, 3, 3,195,127, 70,104, 25,141,198,235,245,235,215,167,246,255,177, 10,133, 66,230, 82,128,198, 84,169, 82, -229,146,235,125,222,186, 20,253, 35, 34, 49,169, 92, 8, 0, 96,242,205, 44, 71, 5,241, 81,243,122,142,107,166, 38,231, 1, 0, - 84, 42, 21,136,115, 51,218, 3, 52, 26, 13, 58,117,234, 4,185, 92,142, 70,141, 26, 65, 42,149,186,221,100, 50, 25,164, 82,169, - 47,149, 3,252,252,252, 48,101,202, 20, 81, 36, 65,163, 84,224,229,230,141,160, 4,197, 23,103,175,192, 36, 80,240, 60,239,216, -124,225,148,201,100, 56,115,230, 12,120,158,135, 68, 34,113,252,138,255, 55,110,220,136,126,253,250,129,231,121,168, 84, 42,224, - 63, 52,207,200,163,130, 64,149, 2,195,150,252, 4, 0,184, 61,111,172,227,219, 29, 26, 61,217,113, 77,252, 11, 3, 64, 8,129, - 84, 42, 5,199,113,101,198,153,157,157,173, 31, 52,104,208, 94,127,127,255, 45,249,249,249,240, 34,224,112,251,246,109,240, 60, -239, 49,189,115, 28,135,185,115,231,226,234,213,171, 62,197,221, 96, 48,224,203, 47,191,132,205,102, 43,198, 43,254,119, 61,230, -163,200,154,222,185,115,231,161,155, 55,111, 14, 38,132,224,211, 79, 63,133, 76, 38, 67,215,174, 93, 17, 26, 26,138,173, 91,183, - 66, 38,147, 97,194,132, 9, 44,241, 49, 48, 48,148, 4, 41,128,122, 0,194,237,134,158, 2, 0, 65, 78,231, 51,236,191,225, 78, -251, 71,220,240, 52,182, 95, 35,158, 23,247, 77, 0,228,110,142,103, 1, 80,217, 55, 35,128,253, 0,106, 57, 61, 71,188, 15,158, -158,203, 3, 69,235, 15, 1,216, 9,160,173, 56,137,222,157, 59,119,158,114,178,172, 92,184,116,233, 82, 53, 81,243,216,187, 16, -101, 86,171,181,138,216,157, 40, 90,139, 58,118,236, 88, 98, 11,223,106, 54,223, 37, 64,220,105, 41,119,221, 21,158, 4,140,217, -108,198,128, 1, 3,138,190,132,135, 74,199,121,243, 65,187,193,100, 50,129,231,121, 84, 45, 23,142,247,186,212, 71, 19,106,129, -182,144,192,154,167, 69, 47, 63, 11, 46,212,104,128,165,183, 50,112, 51,191, 16, 60,207,251,196, 41, 8,130, 71,145, 37,145, 72, -176,100,201, 18, 12, 26, 52, 8, 18,137,196, 39, 62,134,178,135, 85, 16,220,166, 67, 79,105,214,151,239,228, 11,103,118,118,182, -190,123,247,238, 7, 21, 10,197,178,200,200,200,148,164,164, 36,175, 66,203, 85,252,184, 54, 42, 62,249,228, 19, 44, 92,184, 16, -237,218,181,243, 41,156, 70,163, 17,132, 16, 44, 93,186,244,174,115,211,166, 77,187,235,121, 37,113,218, 27, 72, 92, 76, 76,204, -232,223,127,255, 61, 64,188, 54, 44, 44, 12, 82,169, 20,181,107,215,134,191,191, 63,246,238,221, 11,155,205,230,115,190,100, 96, - 96,120,124,225, 78,139, 56,161,245,164, 73,147, 26,205,154, 53,107, 70,179,102,205,126,220,191,127,255, 74, 66,200, 38,167, 50, -177,187,189,236,217,228,180,223,216, 69,244, 72, 1,132, 19, 66, 54,137,215, 59,239, 59, 29,239, 8, 64, 46,238, 79,154, 52,169, -214,172, 89,179,102, 76,156, 56,241,237,153, 51,103,202, 38, 77,154, 84,103,214,172, 89, 51,196,231,184, 11,135, 59,139, 86,137, -179, 10,139,221,136, 23, 47, 94,132, 55,255, 85, 74,105,137,165,165, 38, 44,220, 97,201,154, 26, 31,234, 56, 62, 37, 41,215, 81, -129, 45,106, 88, 9, 26,141, 6, 93,166,126,236,147,165,200,100, 50, 33, 61, 61,221, 97,101,240,182,249,202,169, 86, 41,177,253, -181,218,184,157, 37,199, 7, 7,178,177,249,228, 85, 72,165, 82, 60, 89,163, 54,158,146,249,227,221,120, 57, 94,187,114, 3, 22, - 31,125,122, 41,165,110, 5,150,248, 95,236, 66, 97, 66,235,159, 67,247,186, 21, 29, 86,167, 67,254, 29, 28,199,251,105,207, 56, -190,201, 27, 75, 62, 2, 0,180,107,240, 4,124,241,231,246,198,153,149,149,165,111,217,161,237, 46,155,222,244,221,208,161, 67, -175,239,216,177, 67,229, 83,243,206,141,208, 18,173,182,162,200,226,121, 30, 38,147,201,167,184,155, 76, 38,143,249, 67, 38,147, -149,218,162, 5, 0, 90,173,214,180, 97,195, 6, 44, 90,180, 8,161,161,161,232,220,185, 51,162,163,163,177,102,205, 26, 80, 74, - 49,118,236, 88,168, 84, 42,209,122,205, 18, 32, 3,195,127, 27, 37,105, 17,197,172, 89,179,102,184, 10, 25,231,125,103, 1,229, - 34,166,156,197, 90, 45, 47,245,255, 38, 87,241, 36, 62,151, 16,178,105,230,204,153,221,189,132, 35,195,147,208, 42,113,250,126, -163,209,120,189,110,221,186, 62,169, 9,157, 78,151,234, 77,108,184,107,213, 59, 91, 9,252,252,252,160, 9,240, 3,231, 99,185, -107,177, 88, 28, 66,101,219,182,109, 80,169, 84,232,218,181,235,125, 89,180,204,102, 51,228, 50, 41,184,176, 72, 12,155,183, 3, - 89, 5,122, 71, 5,179,243,218,117, 28, 79, 75,199,107,205, 58, 64,163, 74, 71,161,201,228,147,229, 77, 16,132,187, 68, 22,207, -243, 24, 48, 96,128,195,154,224,236,183, 2,214,117,248,143,193, 93,250,116, 61, 46,184, 88,170,238,133, 51, 43, 43, 75,223,189, -123,247,131, 54,189,233,187,228,228,228,131, 0,148, 77,154, 52, 41,181,208, 18, 5,150, 84, 42,197,220,185,115,177,112,225, 66, -199,121, 95,133,150,213,106, 45, 38,160,174, 92,185, 82,236, 89,174,194,174,164,110, 83, 74, 41, 37,132, 8, 0,132,196,196, 68, -199, 61, 81, 81, 81, 8, 10, 10,130, 32, 8, 16, 4, 1, 74,165, 18, 42,149, 10, 50,153,140, 37, 58, 6, 6,134,146,180,136,126, -226,196,137,111, 19, 66, 54,217, 45, 75,103, 75, 16, 84,238,208,216, 69,172,101,120, 40,187,186,187, 19, 91,206,255, 69, 76,154, - 52,169,150,155,112, 28,241, 40,180, 92,166,221, 47, 6,231,110,196,178,170,196, 74,170,200,252,130, 2,160,210,104, 32,145,112, - 32,132, 80,111, 92,102,179,217, 81,240,143, 26, 53,170, 68,191, 21, 95,253,169,204,102, 51, 56, 94,130, 59, 81, 9,176,113,123, - 28,247,138, 27,199, 75,113, 51,170, 26, 36, 23, 79, 64,234, 99,133,235,106,209, 26, 59,118, 44,190,252,242, 75,112, 28,231,120, - 39, 60,207,163,114,229,202,184,126,253, 58,203,113,143,136,200,242,116,220,102, 19,124,182,194,184,187, 46, 43, 43, 75,223,191, -127,255, 93,121,121,121,223,213,172, 89,243, 10,138,166, 63,224,124,229,227,121,190,152,192, 18, 69,214,130, 5, 11,138,137, 34, -139,197,226, 83, 67,192, 98,177,220, 37,120,230,204,153, 83,236, 23, 0,154, 55,111,238,147,101, 24, 0,229, 56,142,202,100, 50, -116,234,212, 9,117,234,212,193,207, 63,255, 12, 65, 16, 48,102,204, 24,168, 84, 42,204,159, 63, 31, 86,171, 21,179,103,207,102, - 22, 45, 6, 6,134,146,180,136,113,230,204,153,103,103,206,156,233,176, 44,185, 90,180, 60, 81,218, 69, 85,184, 40,210, 80,228, -107,117,164,132,186,186,187, 39, 1,230,124,108,214,172, 89, 51,220,132,195,181,187,242,225,175,117,152,122,238, 12, 62,110, 81, - 31, 64,241,238,194, 37, 79, 84,131,198, 79, 3,141,191, 31,250,111,220, 3, 0,246, 66,127,162, 79, 22, 45, 81,104,101,101,101, -149, 40,178, 74, 99,209,226,228, 60,214,198,229,128,202,165,224, 77,150, 98, 66, 75,194, 75,113, 59, 52, 1,156, 84, 6,222,102, -245,137,147, 82,122, 87, 87,225,240,225,195, 65, 8,113,140, 16,171, 91,183,174, 51, 23,171,121, 30,118,250, 60,250, 21, 46,172, - 27, 13, 0,104,169,213, 58,190,197,135,117,255, 30,223, 49,239,204, 46,135,245,113, 42,222,188, 39,206,172,172, 44,125,147,234, -181, 14,202, 66, 2,191,187,117,235,214, 65, 0,220,192,129, 3,131,234,214,173,235, 83,158, 20, 7, 87,184,138, 44,103, 75,150, -248,107,177, 88,124,138,187,232, 43,229, 13, 98, 55,162,183, 52, 79, 41,165, 33, 33, 33,224, 56, 14, 1, 1, 1,240,243,243,115, -140,184, 85, 42,149, 80,171,213, 14,255, 78, 31,133, 27, 3, 3,195,127, 23,193,162,208,177,139,165, 98,150, 38, 74,105,119,103, - 49,228,169, 11,209,110,129,218,237,205,176,102, 23,104,110, 33, 90,214, 92,202,228, 77,158, 68, 26, 47, 42, 72,231,223,232,232, -232,223,252,252,252, 18,124,141,125,105, 38, 47,181, 89,204,119, 89,182, 8, 33,240,243,247,131,202, 79, 3,149,191,159, 71,171, - 87, 73, 66, 75,180, 20,137,149,206,178,101,203,224,231,231,135,103,159,125,182,212, 62, 90, 14,161, 37,227,176, 85,241, 39, 36, -114,190,152,200,226,121, 30, 18,169, 20,169,126,209,224,164, 82,240, 86,223,172,100,121,121,121,224,121, 30,239,189,247,158,163, - 5,239, 44,178, 74, 19,103,134, 7, 3,106,179,220,101,133,242,100,125,189, 87, 78,209,146, 37, 11, 9,252,174, 90,181,106, 14, - 75,150, 90,173, 22, 71,155,122, 5,199,113,110, 69,150,235, 8, 65,158,231,139,210,178,151,209,145,206, 22,173,153, 51,103, 58, -120,157, 45, 89, 34, 74,147,143,196,176,238,218,181, 11,199,143, 31,199,168, 81,163,160, 82,169,176,112,225, 66, 88,173, 86, 76, -155, 54, 13, 42,149, 10,114,185,156, 37, 62, 6, 6,102,205, 42,166, 69, 92,144,225,226, 7, 69, 92, 68, 77,134, 59,129,229,220, - 77,232,244,223,226,134,215,228,210,165,232,122, 92,252,205,154, 57,115,230, 14,209,146,229,116,188, 88, 56,188, 90,180, 20, 10, - 69,194,229,203,151, 29,147,149,150,244,107, 50,153,208,174, 93, 59,159, 45, 99,226,168, 67,158,151, 20, 19, 22,106,127, 63,168, - 3,252,161,242,243,115, 21, 28,196, 91, 33, 46,182,136,157,133,214,251,239,191, 15,158,231,241,229,151, 95, 2, 0,222,124,243, - 77,159,125,180, 68, 78,216, 8,146,232, 95,168, 63,175, 31, 76,223, 91,144,182,239, 20,120,158, 71, 68,211,167, 32, 52,233, 7, -157,202, 15,188,205,234,243,168,195,236,236,108, 92,191,126, 29, 18,137, 4,175,191,254,122,177,185,142, 92, 71,178,109,219,182, -141, 89,180,254, 9,161, 37, 88,125, 18, 85,165,177, 58, 58,115,138, 62, 89,121,121,121,223,221,186,117,235, 16, 0,110,232,208, -161, 65,106,181, 26, 95,127,253,181, 14,128,124,205,154, 53, 42,111,162, 72, 76, 55,222, 68,150, 84, 42, 45, 74,203,190,196,157, - 22,159,178,196,155, 99,188, 47,105, 94, 12, 43, 33, 4, 54,155, 13, 42,149,170,152, 37, 75,169, 84, 66,161, 80,176,132,199,192, -192,224, 13, 71, 74,113,109, 99, 39,209,116,228, 30,121,143,148, 85,192,121, 79, 66,195,104, 52,226,252,249,243,190,242,248, 60, -121,105,185, 70, 79, 96,106,114, 30, 8, 33,248,162,121, 77,104, 2,252,160,214,104,208,247,231, 93,142,130,251,204,140, 55,161, -208,248, 33,166, 85,103,159, 10,114,177,235,208, 89,104,229,230,230, 66, 42,149, 98,250,244,233,224, 56, 14,179,103,207, 70,108, -108, 44,238,220,185,131, 53,107,214,248,100,209,146,216, 36,136,126,166, 58,212,195, 3, 17,240, 76,107, 4,119,122, 31,201, 38, - 30,251, 13,106,180, 54,156,131,124,235, 2,152, 4,155,207, 35,176,172, 86, 43,118,237,218,229,234,240, 14, 74,169, 99,214,125, -139,197, 2,179,217,140,217,179,103,131,173, 80,242,240, 17,221,116, 44,194, 27,189, 4, 0,216, 56,243, 57,199,241,247,206,252, -157, 62,231,126, 95,180, 0, 64,181, 10,157, 75,197,153,149,149,165,127,178, 93,243,221, 6, 65,250,109,237,218,181,139, 89,178, -148, 74, 37,177,239,251, 36,174, 57,142,131, 68, 34,185,171,187,208,147,216,242,197, 71,203,106,181, 58, 38, 18, 45,201,159,241, - 94, 44, 90,207, 61,247, 28,162,163,163, 29,150,172,169, 83,167, 66,165, 82, 97,210,164, 73,176, 88, 44, 88,176, 96, 1, 75,124, - 12, 12, 12,255,132, 40,123,224,112, 91,146, 26, 12,134, 27,117,234,212,129,135,115,177, 74,165, 82,234, 82, 72,199, 84,169, 82, -229,146,107, 23, 34, 33,164, 35,165,116,187,187, 66,157, 16, 2,255, 0,127, 40,253, 52, 80,187, 88,177,148,254, 1, 80,248,249, -129,147, 73,221, 85, 8,119,113,138,190, 37,206, 66, 75,220,242,242,242, 32,149, 74,177,104,209, 34, 4, 4, 4,192,104, 52,122, -229, 20, 43, 29,137, 68, 2,221,237, 2, 92,152,177, 29,114,229,126, 84,234, 60, 8,209, 82, 21,100,123,215, 67,111,179,148, 56, - 97,169, 59,206, 42, 85,170, 96,242,228,201,119, 77,235,224, 9,177,177,177, 94,227,126,191, 96,156,238, 57, 75, 26, 21, 43, 66, -160, 54,119,215,185,229, 20, 45, 89, 6, 65,250,237,245,235,215, 69, 75, 86,160, 90,173,198,231,159,127,174, 3,192, 77,155, 54, - 77, 29, 31, 31, 47,241, 37, 45, 73, 36, 18,204,155, 55,207,173, 79,150, 59,209, 85,154,124,228,124,111,155, 54,109,220, 78, 88, -234, 78,188,185,227, 20,195, 26, 26, 26,234,176,100,217,108, 54,199,104, 67,113,246,121, 79,141, 10,150, 62, 25, 39,227,252,239, -112, 62,174,112, 91,203,167,164,164, 60,233,233,134, 74,149, 42, 93,190,124,249,114,101,113, 41, 14,123,193, 41, 51, 24, 12, 85, -154, 55,111,238,213,180, 35, 8, 2, 20, 10, 5, 40,165,104, 63,121, 22, 8, 7,112, 40, 94,137, 69,180,232, 0,137,132,135, 80, -180,212,135,215, 81,135,122,189,190, 88,229,224,110, 43, 44, 44,132,209,104,244,121, 54,111,131,193, 80,108, 10, 6, 66, 5,220, -252, 99,245, 93,163, 15,197,205, 87,191, 29,165, 82, 89,172,235,167, 36,120,155,147,140,161,236, 33, 14, 88, 0,128,170,205,187, - 66, 16,108,160, 54, 91,177,101,146,170, 39, 60, 9,129,218, 96,182,232, 96, 52, 26,189,153, 29, 73,102,102,166,190,127,255,254, -187, 0,124,211,171, 87,175, 75, 40, 26,241, 66,253,252,252, 20, 82,169, 84, 0,144, 13,128,230,228,228, 4, 38, 39, 39, 11, 6, -131,161,188,183,112,110,222,188, 25,231,207,159, 71,171, 86,173,138, 45, 7, 37, 90, 69,157,103,119,247, 37,125,138,221,229,238, -102,132,247, 36,228,124,133, 68, 34, 65, 96, 96, 32,100, 50, 25,166, 79,159, 14,153, 76, 6,181, 90, 13, 0, 88,176, 96,129, 99, -242, 85, 6, 6, 6,134,255,140,208,242, 86,110,150,208,173, 88, 98, 23,162,213,106, 77,138,143,143, 47,213,195,108, 54, 91,154, - 23,225,150,180,102,205, 26,153,179, 21,194,219, 47,165, 52,205, 75,101,155,180,113,227, 70,153, 59,235,134,167, 5,166,189,113, -218,108,182,164, 10, 21, 42,120,180,152,184,131,197, 98, 73,102, 73,244,225,193,102,179,149,144, 62,223,185,215,244,121,165,106, -213,170,201, 65, 65, 65,191, 70, 70, 70,102,237,219,183, 47,180,113,227,198,161,206,215, 52,110,220, 56,218,229, 54, 19, 60,175, -115, 8, 66, 72, 82,175, 94,189,220,166,121, 81, 52,185, 73,159, 73,222,210,252,225,195,135,101,206,247,123,226,119,202, 71, 73, - 62, 8,215,155,245,235,215,231,156,121, 60,165,125,139,197,146,193, 82, 33, 3, 3,195,127, 94,104,233,245,250,219,117,234,212, -177,122, 56,119,171,164,123, 51, 51, 51, 27,149,117, 4,204,102,115,243,127, 3,103, 70, 70, 70, 35,150,220, 30,109, 60,136,111, -148,150,150,214,164,172, 57,173, 86,107,153,167, 79,139,197,210,252, 65,188,211,172,172,172,102, 44,101, 49, 48, 48, 48,161, 85, - 10,248, 58,141, 3, 3, 3, 3, 3, 3, 3, 3,195,127, 29, 28,123, 5, 12, 12, 12, 12, 12, 12, 12, 12, 15, 6, 4, 69,171, 84, -223,133,210,140, 38, 32,132,116, 44,237,131,189,241, 51, 78,198,201, 56, 25, 39,227,100,156,140,243,241,227,244,198,253,216,141, -102, 20, 71, 83, 61,136, 13, 64, 71,198,201, 56, 25, 39,227,100,156,140,147,113, 50,206,255,234,198,186, 14, 25, 24, 24, 24, 24, - 24, 24, 24, 30, 16,120,246, 10,254, 25, 16, 66, 36,148, 82, 91, 25, 82, 6, 3,240,180, 96,156, 9, 64,206,189, 4, 19,128,204, -190,137, 19, 29, 89, 0,152,237,155, 15, 83,215, 79,225, 82, 82,130,107, 81,155,180, 49, 37, 68, 42, 8, 56, 89,190,124,185, 19, -192,147, 38, 0,240,139,170, 81,195, 79,163,234,104, 52,155, 18, 20, 82,249,249, 92,109,225, 54, 67,218,165, 27, 44,133, 48, 48, -252, 35,229, 82, 15, 0, 83,236,121,127, 38,165,116, 53,123, 43, 12, 12, 15, 72,104,249,251,251, 31,229, 56, 46,206,219,252, 60, - 78, 25, 20, 54,155, 45, 41, 59, 59,187,145,143, 25,154, 7,208,223,207,207,175,157, 84, 42,109, 1, 0, 22,139,101, 95, 97, 97, -225, 14, 0,107, 40,165,214,123, 44, 40, 2, 0, 12, 0, 48,196,126,232, 7, 0,171, 41,165,249,247,200, 87, 39, 48, 48,112,157, - 84, 42,165,153,153,153, 77, 1, 32, 52, 52,244,160,197, 98, 33,249,249,249,125, 41,165,167, 75,201,199, 73,165,210,185,173, 90, -181,106, 77, 8,249,134, 82,186,168,140,190,165,130,227, 56,183, 2, 69, 16,132, 10,247,192, 39, 3, 16,184,104,209,162,208, 21, - 43, 86,212, 79, 74, 74,170, 13, 0,113,113,113,103,134, 14, 29,122,226,229,151, 95,206, 2,144,103, 23, 92, 30,145,146, 18, 92, - 43, 61,245,218,168,180,244,243, 3, 0, 32, 42,186,246,106,137,132,147,197,198, 30, 63,160, 14, 27, 18, 86,181, 90,197,151,126, -252,122,145,172, 66, 66, 57,252,185,255,120,189,151, 95,121,187,150, 50,178,234, 39, 76,108, 61, 60, 4, 4, 4, 28,229, 56, 46, -174,164, 60,238, 46,207,219,108,182,164,172,172,172, 70,158, 56,121,158,143, 43,169,188,112,119, 76, 16,132,107, 25, 25, 25,110, -167,154, 8, 12, 12, 60,192,243,124,130,175, 92,226,175,213,106, 77,242, 52,181, 76, 96, 96,224, 81,137, 68, 18, 87, 82, 60,221, -157, 19, 4,225, 90,122,122,186,167,112,222, 21,247,178, 8,231,189,112,150, 20, 78,177, 60, 2,176, 32, 52, 52,244,137,172,172, -172,255, 1,120, 59, 63, 63,191,174, 68, 34, 65, 72, 72,200,219,132,144,171,129,129,129, 95,229,229,229,237, 7,240, 10,165, 84, - 96, 57,134,129,161,140,132, 22,199,113,113,201,201,201, 17, 26,141, 6,192,223,235,241,137,139, 73, 11,130, 0, 74,169,227,215, -106,181,162,122,245,234,190,138,141,218, 1, 1, 1,107, 39, 77,154, 84,190,127,255,254,114,113,169,153,148,148,148, 42,235,214, -173,251,223,244,233,211,223, 39,132,244,163,148,158,241, 85,188, 0,232, 0, 96,120,253,250,245,159,158, 58,117,170,172,125,251, -246,176,217,108,248,245,215, 95, 91, 77,155, 54,109, 17, 33,100, 61,128,239, 0,252,225,107, 97, 65, 8,105, 25, 21, 21,181,114, -239,222,189,209,215,175, 95,183,245,239,223,127, 21, 0, 28, 61,122, 52,209,102,179,145,166, 77,155,110, 38,132, 12,166,148,238, - 45,197, 59,127,122,220,184,113, 3,199,142, 29, 27,241,236,179,207,142, 0,176,200,254, 44, 98,127,207,165, 93,224,208, 97,201, -162,148,202, 74,184, 46,170, 20,150, 45,205,245,235,215,131,155, 55,111, 62, 58, 61, 61,253, 53,103,222,180,180, 52, 28, 59,118, -204, 60, 99,198,140,121,251,247,239, 95,156,144,144,144, 3, 64,235,137,136,218,164,141,211,210,207, 15,104,221,108, 81, 32, 0, -172,217, 56,122,208,225, 19, 25,254,155,126, 95,250, 63,185, 82,102, 92,241,197, 60, 89,229, 74, 21,176,243,232, 21, 28, 58,159, - 77,106,183,236,206,231,109, 90,222, 9,192, 82,150, 61, 31, 14, 36, 18, 73,108, 82, 82, 82,132, 90,173,118,187,112,188,139, 95, -134, 56, 1, 42,170, 84,169,226,185, 96,225,249,184,228,228,228, 8,165, 82,233, 40, 59, 92,203, 12,177, 92,113,164, 21, 74, 81, -181,106, 85,115, 9,101, 82,252,173, 91,183, 34,212,106,181,131,199, 93,248, 92, 5, 71,213,170, 85, 75,138,123,177,112,250,194, - 73, 41, 69,229,202,149,109,222,226, 46,174,128,225, 45,222, 34,103, 66, 66, 2, 45, 13,167, 47,225,172, 88,177,162,217,203,231, - 95,112,233,210,165,177,229,202,149, 67,229,202,149,247, 63,241,196, 19, 1, 26,141, 6,191,255,254, 59,106,212,168, 81, 43, 32, - 32,224,208,154, 53,107,164, 19, 38, 76,168,247,237,183,223, 2,192,203, 44,199, 48, 48,148,145,208, 34,132, 64,163,209, 96,213, -170, 85, 30,151,227,112,254, 95,190,124,121,159, 30, 72, 8,105,148,144,144,176,107,239,222,189,170,232,232,191, 39,196, 54,153, - 76, 8, 14, 14,198,152, 49, 99,228, 61,122,244,168,220,185,115,231,131,132,144, 54,148,210,163, 94,248,158, 14, 15, 15,255,244, -189,247,222,139, 28, 56,112, 32, 66, 67,139, 77,186,141,254,253,251,163,111,223,190,178, 75,151, 46, 13, 90,182,108,217,160, 37, - 75,150,164, 18, 66, 94,166,148,174, 47,137, 87,173, 86,247,170, 84,169,210,231,123,247,238,141,136,136,136, 64, 98, 98, 34, 55, - 97,194,132,202, 85,170, 84, 81,197,197,197,113,119,238,220,193,207, 63,255, 28, 59,120,240,224,181,114,185,252, 37,147,201,180, -193,135,184,203, 67, 67, 67,223,126,233,165,151,194,242,243,243,173,199,142, 29,187, 44, 30,151,203,229,211,154, 53,107,214,152, - 16,242, 61,165,244,171,123,177,100,217,173,118,174,107,153, 88,196,243, 62, 90,182,228, 39, 79,158, 12,105,214,172,217,122,163, -209,216, 96,212,168, 81,183,102,204,152,161, 10, 8, 8, 8, 0, 64,242,243,243,115,166, 76,153, 98,154, 63,127,254, 91, 53,106, -212,232,112,224,192,129,167,235,213,171,103,177,139,184,187,133, 22, 33,142,240,220, 78,206,192,174,253,130,124,242,164, 55,227, - 62,250, 48,225,230,145,115,183, 5, 94, 21,128, 95,118,159, 69, 90, 86, 33,126, 59,112, 14, 81,161,254, 68,166,144,214, 10,138, -171,213, 38, 47,249,220,110,202, 86,214,126,224, 32,132, 64,173, 86,227,151, 95,126,185,107,233, 42,119,203, 90,241, 60,143,160, -160, 32,175,171, 27, 40,149, 74,108,219,182,205,237,218,139,238,150,244, 9, 12, 12, 4, 74, 88, 84,155, 16, 2,165, 82,137,125, -251,246,129,227, 56,183, 75, 3,185, 30,211,104, 52,224, 74, 88,235, 74,228,220,189,123,183, 87, 46,241,215,207,207, 15, 0, 36, - 37,102, 74,133, 2,123,247,238,245, 24,103,215,255,126,246,245, 94,189,113,238,219,183,175,216,210, 95,174, 75,130, 57,239,107, - 52, 26, 71, 3,206, 99, 43, 45, 56,184,105, 92, 92, 28, 14, 31, 62,140, 53,107,214,132,212,170, 85, 11, 87,174, 92, 1, 33, 4, - 51,102,204, 32, 53,107,214,148,166,166,166,162, 85,171, 86,248,233,167,159,154,179,220,194,240, 15, 66, 10,160, 30,128,112, 20, -173, 66, 83, 0, 32,200, 94,247,200, 1,100, 1, 80,217, 55, 35,128, 66, 0, 97,246,123, 51,237,101,139,179, 64,200, 64,241,197, -167, 27,219,185,197, 21, 42,194,157,206,137,207,112,221,119,253,117,203,205, 3,192,230,205,155,197,202,172,109,183,110,221,118, - 21,139,153, 15, 34, 75, 92,167,204, 53, 79,187, 89, 96, 86,161,209,104,214, 29, 60,120, 80, 21, 30,254,119, 28,140, 70, 35, 10, - 10, 10, 80, 88, 88,136,130,130, 2,248,251,251, 99,205,154, 53,170, 14, 29, 58,172, 35,132, 84,161,148, 26, 61,113, 2,152,119, -231,206,157, 72,171,213, 10,185, 92,238,169, 37,140,234,213,171,227,237,183,223, 70,151, 46, 93,162,218,181,107, 55, 15,192,250, - 18, 56,161, 86,171, 63, 63,118,236, 88,132, 90,173,198,229,203,151,145,148,148,132, 55,222,120,163,156, 32, 8,184,125,251, 54, -174, 92,185,130,228,228,100, 44, 91,182, 44,162,119,239,222,159, 3,216, 80, 82,220,237, 24,245,218,107,175, 85, 11, 14, 14,230, - 62,254,248,227, 92,173, 86,251,153,253,248,228,133, 11, 23, 62,211,186,117,235,136,145, 35, 71, 82, 66,200, 10, 74,233, 93,194, -197,133,211,157, 37,203, 6,224,130,203,109,213, 93, 44, 93, 81,246, 68,152,235,134,147, 0, 8,236,220,185,243,235, 70,163,177, -193,222,189,123,175,182,104,209, 34, 30,192, 29, 49,241, 5, 6, 6,106,230,205,155, 23,217,189,123,247, 75,237,219,183,111,208, -185,115,231,215, 51, 50, 50,102,216,207, 83, 87, 78, 65,192,201,168,232,218,171,119, 31,120,121,192,206,125, 38,217,155,175,188, -127,171,124,185, 10,121, 39, 47,103,219,206, 93,203, 64,129,222,138, 62,237,139, 22, 48,111, 90,187, 60, 62, 93,181, 23, 99, 94, -125, 71,186,126,245,242,190, 87, 41, 52, 0, 54,151,240, 62,239, 11,140,243,111,177, 33, 8, 2,164, 82, 41,158,122,234, 41, 16, - 66,238, 90,203, 83, 42,149,226,192,129, 3,104,223,190, 61,164, 82, 41,158,123,238, 57,159, 56,121,158, 71,231,206,157, 29,235, - 40, 58,243,185,138, 6,119,154,192, 53,238,148, 82,240, 60, 15,142,227, 60, 46,164,237,202,233,173, 92, 18,195, 89, 18,151,243, - 57,111,225, 20,173, 73,190,138, 44, 95, 57,197,112,242, 60,143,230,205,155,227,196,137, 19, 37,138, 46,119,250,210, 53,238, 57, - 57, 57,195,170, 84,169,178,123,209,162, 69, 33, 0,144,149,149,229, 88,240, 94, 34,145,224,226,197,139, 48,153, 76,248,224,131, - 15,204,249,249,249, 35, 89, 62, 98,156, 15,146,179, 36, 45, 2,160,245,164, 73,147, 26,205,154, 53,107, 70,179,102,205,126,220, -191,127,255, 74, 66,200, 38, 74,105,119,241,119,210,164, 73,181,102,205,154, 53, 99,226,196,137,111,207,156, 57,243, 44, 33,100, - 19, 0,184,238,219,195,223,221, 69,196,133,139, 60,246, 60, 87,236, 90,119,251,174,191, 30,184,255,182,104,117,235,214,141,216, - 35, 73,156, 11, 53, 95,133,150, 47,107,247,241, 60, 63,118,198,140, 25,145, 37,137,172,194,194, 66,164,164,164, 32, 62, 62, 30, -207, 61,247, 92,228,162, 69,139,198, 2,152, 83, 2,173, 76, 34,145,224,240,225,195, 72, 79, 79, 71,157, 58,117,144,144,144, 80, -236,130,191,254,250, 11,191,254,250, 43,114,115,115,209,176, 97, 67,160,200,255,200, 45,234,213,171,247, 65,245,234,213, 59,119, -238,220,217,170, 82,169,112,242,228, 73, 52,104,208, 0,171, 86,173, 66,249,242,229,161, 86,171,113,233,210, 37,212,169, 83, 7, -187,118,237, 66,120,120, 56,234,215,175,111,109,216,176,225,158,236,236,236, 29, 55,110,220,248,192, 67,203, 89, 22, 27, 27,251, -254,139, 47,190, 40, 79, 73, 73, 17,190,251,238,187,189,148,210,189,132,144,177,239,188,243,206,136, 46, 93,186, 68, 28, 63,126, - 60,239,200,145, 35,135,220,137, 44, 31, 45, 89, 86,215, 74,201,102,179, 25,245,122,189,201,104, 52, 90, 56,142,187, 65, 8, 49, -217,108, 54, 79,125, 62,202,225,195,135, 87,204,204,204, 28,243,234,171,175, 94,183,139,172,139, 40,114,128, 7, 0, 88,173, 86, - 99, 97, 97, 97,126,179,102,205,226, 7, 15, 30,124,117,229,202,149, 99,134, 15, 31,190,230,187,239,190, 43, 4,160,119, 37, 44, - 95,190,220, 9,137,132,147,105, 11, 66,174,173, 93,243,213,107,191,110, 28, 91,238,246,237,228,202,161, 97,225, 90,153, 95,120, -202,154, 31,190, 61, 10,192,148,146,145,143,211,127,165, 66, 42,149,224,252,237, 60,180,126,178,191,244,234,229, 15, 91,138, 66, -139,225,129,130,138,139, 80,239,220,185,179, 68,139,214,129, 3, 7, 32,149, 74,161, 82,169, 48,127,254,252, 18, 73, 69, 97, 32, - 90,139,188,137, 25,142,227, 74, 44, 71, 68,177, 33, 46,244,238,186,125,246,217,103,120,245,213, 87,139, 61,195, 46, 54,136, 55, - 78, 79,225,139,175, 80, 1,233,105,105,197,142,249,178, 40,189,205,102,131, 84, 42,197,151, 95,126,137,238,221,187, 99,211,166, - 77, 37,254, 62,245,212, 83,224, 56,142,250,242, 62,155, 55,111, 14,179,217,236, 8,243,197,139, 23,221,242, 46, 89,178,196,155, - 37,179, 7,128, 41, 13, 26, 52, 8,104,215,174, 29,118,239,222,141,190,125,251, 26,205,102,243,101,123,157, 80,117,209,162, 69, -242, 99,199,142, 33, 52, 52, 84,122,235,214,173,111, 8, 33,204, 65,158,225,129,194,157, 22, 17,235,188, 89,179,102,205,112, 21, - 49,206, 16,207, 19, 66, 54,205,156, 57,179,187,179, 40,114,222,119,178, 58, 57,139,184, 90,206, 22, 41,103, 17,229, 73, 64,185, -212,183,206,215,103,184, 21, 90,246,136,181,117,182, 2,137,133,175, 55,145,229,169,229,232,138,192,192,192,174,125,250,244,113, -136, 28,131,193,224, 16, 88,162,200, 18,247, 47, 93,186,132, 70,141, 26,201, 2, 3, 3,187,122, 17, 90,162,136, 67, 76, 76, 12, - 50, 51, 51,113,230,204, 25,196,199,199,195, 98,177, 96,203,150, 45,200,203,203,131, 84, 42,133, 76, 38,131,217, 92,178,203, 66, -245,234,213,159, 90,177, 98, 69,163,229,203,151,231,136, 45,186, 31,126,248, 1,148, 82,132,135,135, 67,167,211, 33, 45, 45, 13, - 59,118,236,128,213,106,133,159,159, 31, 18, 19, 19,229,189,122,245,106, 57,101,202, 20, 41,128, 15, 60, 80, 55,239,219,183,111, - 96, 64, 64, 0, 94,121,229, 21,106, 54,155,103, 18, 66,154,247,237,219,247,253,151, 95,126, 57,244,198,141, 27,166,231,159,127, -254,176,217,108,254,216, 94, 8, 74, 41,165, 22, 47, 45, 10,143,150, 44,139,197, 34,190,211,235,133,133,133, 8, 11, 11,139,247, -226,195, 5, 0,178,125,251,246, 53, 7, 32,153, 54,109,154, 18, 64,154,179,200, 50,153, 76, 40, 44, 44,132, 86,171,181,228,229, -229,165,143, 31, 63,222,186,114,229, 74,137,253,158,243,238,132, 22,240,164,169,102, 77,141,156, 82,201, 59, 75,151, 46,245,235, -210,165, 11,231,231,231,135,130,130,130,128,223,126,255,221,175, 67,187,150,137, 51,102,125,180, 53, 32,174, 78,218,190,147,215, -144,156,154, 7,147,197,130,196,232,192, 34,123, 24,195, 3,135,125, 32,139,195,162,229, 44, 42,118,239,222,141, 39,159,124,210, -145,215,101, 50, 89, 49,203,151, 55, 78,158,231,241,228,147, 79,222,101,225,217,185,115,167, 91,235,147, 55, 56,139, 34, 87,113, -228, 78,128,113, 28, 7,111,189,207,162, 53,207,157,216,114,182,234,187,136, 55,111,173,125,240, 60,143,151, 95,126, 25, 82,169, - 20, 19, 38, 76, 0,207,243,168, 95,191, 62,120,158, 71,179,102,205, 32,149, 74,209,190,125,251, 82,199,253,224,193,131,104,208, -160,129, 35, 76,245,235,215, 71,227,198,141,193,243, 60, 90,181,106, 5,169, 84,138,206,157, 59,251,194,249,118, 65, 65, 65, 93, - 63, 63, 63, 92,186,116, 9, 18,137, 4,132,144, 43,148,210,186, 0,240,226,139, 47, 94,213,233,116, 21, 13, 6, 3, 94,124,241, - 69, 98, 50,153,234, 76,152, 48,225, 29, 0, 76,104, 49, 60, 48,184,106, 17, 39,232, 39, 78,156,248, 54, 33,100,147,104,161,114, -181, 60,185,219,119, 83, 54,137, 98, 72,236,218,107,236, 34,226,196,110,191,110, 37,220,107,114, 17, 86,174, 93,135, 71,124,182, -104,137,133,175,175, 66,203, 27, 12, 6, 67,189,136,136, 8,143, 34,203,249,215,100, 50, 33, 33, 33, 1, 6,131,161, 94,105, 43, -141,232,232,104,152,205,102,124,245,213, 87,144,201,100,144,201,254,214, 23, 38, 83,201,198,162,115,231,206, 93, 63,120,240, 96, -131,134, 13, 27, 6,255,244,211, 79, 25,109,218,180, 9,239,210,165, 11, 84, 42, 21,244,122, 61, 44, 22, 11,154, 54,109,138,234, -213,171, 35, 41, 41, 9,191,253,246, 91,102,149, 42, 85,194, 14, 29, 58, 36,164,166,166,222, 44,129,186, 83,135, 14, 29, 64, 8, -193,239,191,255,158, 73, 41, 61,162, 84, 42,127,253,240,195, 15,131, 77, 38,147, 48,116,232,208, 91,217,217,217,175, 2, 48, 43, - 20,138,133,157, 59,119,110, 38,145, 72,190,183,217,108,243, 75,155, 80, 93,223,173, 86,171,133, 82,169,244,101, 42, 9,105,118, -118,118,109, 0,208,104, 52, 33, 0,174, 58, 82,184, 94, 95, 76, 12,155, 76, 38, 67, 72, 72,136, 6, 0,236,247, 72, 61,124,143, -112,181, 90,189,246,230,205,107,254,206,254,115, 65, 65, 65, 24, 50,120, 48,215,162,121,115,121,221,122,245, 58,191,251,201,242, - 85, 49,161, 1,166,196,152, 80, 88,108, 22,108,223,186, 69,160,130,101, 43, 43,118, 30,142,208, 18,197,134,171, 69, 75, 42,149, - 98,215,174, 93,119, 29,147,201,100,248,226,139, 47,124, 18, 6,162,168,242,212,117,230,210,213, 69,188, 9, 24,169, 84, 10,137, - 68,130, 47,191,252, 18,130, 32,224,181,215, 94, 43,214,157,232,204,239, 99, 23,136,227,158,234,239, 11, 0, 76, 72,154,171,112, -220,239, 26, 94,251, 61, 62, 89,201, 22, 45, 90,228,147, 69,171, 91,183,110, 94,133,171,115, 15,131,115,184, 78,156, 56,225,150, -119,233,210,165, 94,223,167,205,102,195,230,205,155, 29, 34, 85,196,123,239,189,247, 98, 92, 92, 92,228,158, 61,123,144,154,154, - 10,173, 86,139,194,194, 66, 52,109,218, 52,177, 99,199,142, 39, 83, 83, 83,111,156, 59,119,174, 15,203, 61, 12, 15,209,162,101, -156, 57,115,230,217,153, 51,103,186,181, 88,185, 90,150, 74,178, 60, 57, 9,172, 35,176,119, 25, 78,156, 56,241,109, 20,185,213, - 28,241,225, 94,185,107,215, 97,137,134, 32, 23, 21, 57,197, 93,225,235, 75,247,161,143,230,116,158, 16, 2,131,193,224, 86, 96, - 57,139, 3,179,217,140,236,236,108,216,108,182,123,158,235,203, 93, 75,214,155,208, 58,115,230,204,179, 35, 70,140, 72, 9, 12, - 12,172,155,145,145,145, 46, 8, 66,251, 3, 7, 14,132,243, 60,143,128,128, 0, 4, 4, 4,224,215, 95,127,133, 90,173,198,203, - 47,191,156,110,179,217,118,251,251,251,135,234,245,250, 83,169,169,169,239,122, 84, 48, 82,105,231, 86,173, 90,225,216,177, 99, -200,201,201,217, 70, 8,169, 63,114,228,200, 39,203,149, 43, 71, 62,252,240, 67,195, 95,127,253, 53, 31, 64,186, 70,163, 89,177, - 98,197,138,118, 13, 27, 54,244, 31, 58,116, 40, 8, 33, 75, 41,165, 6, 95,227,172,213,106,139, 9,172,252,252,124, 20, 20, 20, - 64,163,209, 88,125,124,103, 82, 20,249, 90,137,254, 86,142,111, 99,183,102,137,223,135,242, 60, 79,139, 46,161, 82, 79,124, 26, -141,102,218,242,229,203, 85,174,131, 20,108, 54, 27,210,210,210, 16, 16, 16,128,247,222,125, 87, 54,245,141,145, 13, 36,126,145, - 7, 56,142,192,100,166,185, 84, 48,109,209,166, 13,220,195,138,157,135, 3, 81, 24,244,236,217,243,174,238, 66,153, 76,134,109, -219,182,161,119,239,222,142,134, 75,195,134, 13,189, 54,174, 68, 97,208,163, 71, 15,135,101,104,203,150, 45,110,187,253, 68,139, -148, 47,130, 80,188,118,220,184,113,224,121, 30,159,126,250, 41, 94,127,253,117,112, 28,135,185,115,231,130,227, 56, 76,158, 60, -217,103,145,233, 44, 96,110,124, 84,244, 27,247,122, 62,178,150, 68, 2, 0,252, 3, 2,196, 8,149,170,236,225,121,222, 97,201, -170, 87,175, 30,164, 82, 41,154, 53,107, 6,158,231, 29,150,172,174, 93,187, 58,191, 71,234, 11, 39,207,243,184,124,249,178, 35, -204,205,154, 53, 43,102,201,226,121, 30,221,186,117,243, 37,152, 51,130,130,130,166, 84,175, 94,189,198,188,121,243,164, 18,137, - 4, 29, 58,116,168,250,252,243,207,223, 12, 13, 13, 13,157, 54,109,154,218,205, 61, 42, 0,117,107,212,168,161, 97,185,134,225, - 1, 90,180,166,184, 57, 21,236,236,115, 85,138,134,228, 38,231,235, 69, 14, 87,113,100,183,144,237,246,198,229,238, 94,111,224, - 69, 5, 89,146, 73,221, 23,161,101, 55, 59,151,248, 48,181, 90,125, 58, 61, 61,189,153, 74,165, 42, 38,178,220, 9, 46,137, 68, -130,212,212, 84,168,213,234,211,101,249, 17,189,117, 29,218, 69,205, 27, 78, 47,182, 99,215,174, 93,191,219,182,109, 91,244,246, -237,219,113,232,208, 33,132,135,135, 99,209,162, 69,119,210,210,210,158,165,148,110,243,229,185, 21, 43, 86,172,237,231,231,135, -125,251,246, 1,192, 46, 0, 35,199,140, 25, 67, 44, 22, 11,150, 44, 89,162, 5,240,123, 80, 80,208,230, 53,107,214, 52,168, 91, -183,174,124,251,246,237,249,135, 14, 29,250,195, 71,145,101, 19, 4,225, 46,129,229,252, 78,253,253,253,125,177,104, 89, 2, 3, - 3,207,228,231,231,247,215,235,245,249, 10,133,194, 63, 63, 63,223,232, 44,176, 68,126,158,231,165,151, 47, 95, 78, 1,144, 24, - 24, 24,120, 6, 78, 93,140,197, 18, 24,207,119,232,208,161, 3,239,250, 13,210,210,210,144,154,154, 10,179,217,140,134, 13, 27, - 18, 9,177, 72,178,111,157,122,145, 21, 51,255,136, 69,139,138,121, 93, 28, 37,232,110,164,225,150, 45, 91, 28,251, 28,199,193, - 62,220,223,171, 40,218,182,109, 91,137, 14,235, 46, 93,135, 94, 77,227,226,245,139, 23, 47, 46, 90,222,194,110,201,226, 56, 14, - 19, 39, 78,132, 66,161,192,135, 31,126,136,137, 19, 39,130,231,121,175, 93,135,206, 2,166,194, 4,157,115,227,168, 40, 83,216, -253,161, 8, 33,206, 98,139,248, 42,222, 74,178,230,249,210, 19,224,204, 41,222,167, 84, 42, 61, 58,194,187,112,146, 18,226,253, - 11, 33,228, 90,116,116,244,190,102,205,154, 5, 30, 61,122, 20,115,231,206,149, 25,141,198,242,219,183,111,119, 60,215,221,251, -210,106,181, 42,150,115, 24, 30,132, 53,171,132,211, 25, 46,254, 85,196,185, 27,175,132, 95,215,235,225,116,204,153, 55,195,165, - 30,115, 62,238, 42,174, 92,159,225,124, 77,134, 71,139,150,183,194,194,155,224,242,197,162,165,211,233,254,248,253,247,223, 27, - 15, 30, 60,152, 47,169,219, 80,171,213, 34, 50, 50, 18,103,207,158,181,234,116,186, 63,124,176,148,149,153,208,114, 83,168,108, -143,138,138,146, 88, 44, 22, 84,174, 92, 25,177,177,177, 48, 24, 12,200,205,205,149,248, 42,178, 8, 33,178, 70,141, 26, 73, 0, - 32, 55, 55, 23, 40, 26,106, 90,181, 74,149, 42, 56,118,236, 24,178,179,179,215, 3,232, 50,101,202,148,134, 77,155, 54,149,173, - 90,181, 74, 55,106,212,168,245, 22,139,229, 3, 31,173, 17, 38,171,213,154,192,113,156, 57, 55, 55, 55,217,249,125, 70, 70, 70, -134,104, 52, 26,146,150,150,102,241, 69,104,213,173, 91,247,240,173, 91,183, 48,109,218,180,140, 25, 51,102, 84, 41, 40, 40,200, -201,203,203,179, 58,139, 45,131,193,192,133,133,133, 41,150, 44, 89,162, 2,128,186,117,235, 30,246, 36,180,180, 90,109, 57,181, -250,239,134,177,209,104, 68,106,106, 42, 82, 83, 83,145,150,150,134,130,130, 2, 36, 38, 38, 66,167,211,197,179, 98,230, 31, 19, - 90,197,186,207,156,243,183,115, 69, 94,154,188,238, 44, 96,122,246,236,233,240,237, 18, 45,100,226,182,118,237, 90, 87, 7,115, -159,132,214,226,197,139, 49,110,220, 56, 40,149, 74,204,155, 55,175, 88,215,161,171, 56, 16, 4,129,248, 18,247,132,183,244, 72, - 93, 24, 2,169, 84,138,208, 81,105,197,186,232,220, 8, 14,159,194, 57, 99,198,140, 50,233, 58,116,230,140,143, 47,202, 42, 95, -126,249, 37,250,247,239,143, 61,123,246,220,115,215, 97,173, 90,181,126,216,180,105, 83,224,185,115,231,144,159,159,143,140,140, - 12, 24,141, 70, 36, 37, 37,121,236, 21,176,151,229, 74,150,115, 24, 30, 50,142, 60,100,222, 50,123, 30,239,165, 2,247, 89,104, -249, 98,209, 50, 26,141,243, 94,121,229,149, 49, 29, 59,118, 12,241,247,247, 71, 74, 74,202, 93, 34,171,176,176, 16,126,126,126, -208,235,245,216,184,113, 99,190,209,104,156,231, 77, 28, 88, 44, 22, 68, 68, 68, 32, 51, 51, 19,130, 7,255,105,142,227,160, 82, -169, 80, 88, 88, 8, 79,162,160,164, 10,195,108, 54,195, 98,177,192, 98,177,192,108, 54,163,148,211, 59,169,197,137, 95,181, 90, - 45, 0,104, 99, 98, 98, 42, 43,149, 74, 92,191,126, 29, 40, 26,217,215,241,201, 39,159,148,102,101,101,209,231,159,127,126, 47, -165,244, 69, 47,179,227,155,118,239,222,157, 0, 0, 42,149,234, 18, 0, 36, 37, 37, 89,114,115,115,139, 89, 10,213,106, 53,237, -221,187,119, 52,165, 20,187,119,239, 78,144,201,100, 20, 30,230,188, 2, 96,216,176, 97,195,185,192,192,192,149,179,102,205, 26, -220,189,123,247,179,181,107,215, 78,208,106,181,233,122,189, 94,111, 48, 24,168, 68, 34,145, 5, 7, 7, 43,183,110,221,122,245, -192,129, 3, 29, 3, 2, 2, 86,110,216,176,225, 28, 0,183,150, 55,141, 70,147,164,211,233, 42,136,223,212, 89,100,165,166,166, -130, 82,138,107,215,174, 65,173, 86,223, 98,229,200, 63, 7,177, 81,229,106,121,113, 61,230,171,200,114, 22, 6, 91,183,110, 45, -113, 14, 45, 95, 57,157, 69,209,235,175,191,142,133, 11, 23,222,101,209,250,240,195, 15, 1, 0,239,190,251,174,207, 62, 90,162, -245, 42,117, 97, 8,162,198,101, 23, 11, 59, 0, 16, 49,124,165,156,210,141,231,121, 76,155, 54,237, 46, 39,117,231,174, 61, 31, -187,248,138,133, 51, 61, 61, 29, 60,207, 35, 36, 36, 4, 67,134, 12, 65,231,206,157, 29, 93,144,165,229,189,112,225,194,190,183, -222,122,171, 78,173, 90,181, 48,125,250,244,236,160,160, 32,255, 23, 94,120,129,207,205,205, 37, 37, 89,180,152,208, 98, 96, 40, - 3,161, 37,102, 48, 95, 71, 29,186, 43, 44, 9, 33, 29,157,231,218,160,148,230, 17, 66,134,116,234,212,233,167,213,171, 87,171, - 42, 86,172,136, 11, 23, 46, 32, 59, 59, 27, 38,147, 9, 50,153, 12,209,209,209,200,205,205,197,183,223,126,171,215,233,116, 67, - 40,165,121, 37,113, 2,120,167, 81,163, 70,159,207,153, 51, 71, 89,191,126,125,100,103,103,163,176,176,176,216, 44,214, 1, 1, - 1, 80,169, 84, 56,124,248, 48,182,108,217,162, 7,240,142, 23, 78,119,106, 14,102,179,217, 33,184,188, 9, 45, 23, 78,141,104, -213,209,233,116, 0, 96, 41, 87,174, 92, 20, 0, 92,187,118, 13, 0,110, 36, 38, 38, 78,169, 88,177, 34, 89,177, 98, 5,165,148, -110,113, 39,178, 92, 56,179, 91,181,106,149, 3, 32,202,100, 50,201, 0, 32, 47, 47,207, 28, 22, 22, 22,161, 80, 40, 4,149, 74, - 37, 40,149, 74, 33, 37, 37,197,106,181, 90,101, 0,208,170, 85, 43, 19,128, 84, 56,249,130,184,112, 10, 0,242,151, 46, 93, 58, -101,232,208,161,205,154, 55,111, 94,107,244,232,209,103,158,127,254,121, 46, 54, 54, 54,184,160,160,192,112,229,202,149,156, 79, - 62,249,164,224,224,193,131, 29,165, 82,233,205,165, 75,151, 78, 1,144,111,191,247, 46, 78,171,213,250,199,246,237,219,159,237, -222,189, 59,159,156,156,140,180,180, 52,135,200, 74, 75, 75, 67,245,234,213,113,224,192, 1,155,217,108,222, 94,138,247, 89, 86, -150, 28,198, 89,212, 8,161, 98, 94,247, 36,176,196,198,148,175,156,206,162,168,127,255,254,197,172, 88, 50,153, 12,235,214,173, -115, 91,110,184,153,225,188,163,235,124, 82, 98,152,222,122,235,173, 98,162,237,189,247,222,243, 24, 52,111,239, 83,228,201,251, - 50,182,248,168, 67, 15,249,188,164,112,138,101,167, 84, 42,197,123,239,189,231,179, 69, 11, 46, 62, 90,238, 56,197,184,183,105, -211, 6, 58,157,206, 33,100, 61, 89,180,188,189, 79,155,205, 54,110,225,194,133, 52, 32, 32,224,137,252,252,252,255,221,186,117, -107,153, 78,167,107,146,151,151, 87,162, 69,203,104, 52, 42, 88, 62, 98,156, 15, 98, 46,173,255,148,208,178, 87,146, 40, 87,174, - 92,177,181,179, 56,142, 43,182,149,198,207,192,158,113,183, 18, 66,158,110,209,162,197,247,227,198,141,243,175, 95,191,190,180, - 66,133, 10,208,106,181,184,126,253, 58,206,158, 61,107,221,176, 97, 67,190, 78,167,251, 31,165,116,171, 15,124,203, 9, 33, 91, -186,116,233, 50,185,105,211,166, 47,189,255,254,251,146,170, 85,171, 34, 47, 47, 15,193,193,193,136,136,136,192,197,139, 23,177, -113,227, 70, 91,102,102,230,231, 0,166, 82, 74, 51, 74,219,224, 55,155,205, 24, 52,104, 16, 4, 65,192,252,249,243, 65, 8, 41, - 77,243,214,108, 54,155, 41, 0,146,153,153, 9, 0, 58,251,236,210,184,114,229, 10, 0,220, 76, 72, 72,240, 7,128,237,219,183, - 19, 0,190, 46,233, 67,157, 45, 91,213,171, 87,191,238, 90, 56,138,150, 44,209, 10, 6,239, 11, 65, 27, 6, 12, 24,144,174,211, -233,186,188,254,250,235,147, 23, 47, 94, 60,120,241,226,197,119, 93, 20, 16, 16,176,114,238,220,185, 83, 7, 12, 24,144,238,201, -154,101,183,224,189, 59,108,216,176, 1,167, 79,159,246, 87, 42,149,208,106,181,200,202,202,130,217,108, 70, 98, 98, 34,210,211, -211,177,124,249,242, 2,189, 94,255, 1,203,142,255, 12,156,133,129, 39,171,150, 55,145, 85,146, 85,231,151, 95,126,113, 59, 71, - 85,105, 57, 93,197,134,175,115, 91,149,212, 40, 18,167,165,113, 55,101, 68,105,202, 53,119,188, 60,207,227,227,143, 63,118, 76, -218,234,206,146, 85, 26,139,150,200, 25, 18, 18, 82,100, 38,183, 47,153,212,173, 91,183,123,230,181, 47, 71,246,178,211, 51,102, -140, 31, 63,126, 74,245,234,213,171, 2, 80, 56,191, 3,182, 72, 3, 3, 67, 25, 11, 45,155,205,150, 84,173, 90,181, 98, 5,156, -183,197, 76, 45, 22, 75,146,143,153,123, 11, 33, 36,113,238,220,185,175,104, 52,154,142, 58,157,174,142,189,224, 56,173,213,106, -183, 27,141,198, 5,165, 89, 4,218, 46,156,198, 18, 66,230,119,233,210,229,195,246,237,219,247,123,227,141, 55, 8,165, 20, 75, -150, 44,161,127,253,245,215, 90, 0,239, 80, 74,255,186,151,151, 20, 18, 18,114,238,219,111,191,141,252,233,167,159, 96,177, 88, -176, 96,193, 2,248,251,251,159, 43, 69,248,210,121,158,255,174,121,243,230,207, 28, 56,112, 96, 57,165,244,148, 92, 46, 95,214, -178,101,203, 97, 7, 14, 28,248,129, 82,122,150,231,249,101, 77,155, 54, 29,118,228,200,145, 53,148,210, 19,165, 8,158,195,178, -101,181,186,239,105,116,103,201,242,130,252, 17, 35, 70,152, 71,140, 24,241,198,128, 1, 3,190, 58,114,228, 72,147,220,220,220, - 58, 0, 16, 20, 20,116,186,113,227,198,135, 87,175, 94,125,209,110,201, 50,120,251, 54,132,144,222,117,234,212, 89, 63,125,250, -116, 77,173, 90,181,248,202,149, 43,227,198,141, 27, 56,115,230,140,245,155,111,190, 41,212,235,245, 61, 41,165, 57, 44, 59,254, -115, 66,139, 82,138,160,160,160, 98,141, 40,113,200,127,105,187, 11,157, 43,102,113,169, 30, 87, 94, 79,156, 37, 77,155, 32,194, -207,207,207, 49,185,169, 47, 46, 11,130, 80,242,124,108,148, 82, 7,167,184,249, 32,178,188,142, 16,180, 47,129,227, 51,167, 47, -211, 59,104, 52, 26, 88, 44, 22, 7,175, 15, 35, 63, 73, 41,191,217, 47, 0,126,169, 92,185,242, 21, 0,149,152,184, 98, 96,120, -128, 66, 43, 59, 59,187,209,131,124,176, 93, 72, 77,181,111,101,197,249, 23,128, 1,132,144, 57,127,254,249,167,216,143, 48,205, -219,122,137,222,112,225,194,133,238, 82,169,244,139,149, 43, 87, 54,165,148, 34, 48, 48,240,224,141, 27, 55, 94, 40, 13,135,213, -106, 29, 65, 8, 25, 35,142, 34, 52,153, 76, 35, 8, 33,175, 80, 74, 11,157,206, 59,246, 75, 27,117, 0, 70, 74,105,140,135,243, -198, 82,136, 44,135,101, 11,128,105,245,234,213,133, 0, 78,226,239,121,178, 44,246,205, 0,167,238, 66, 47,223,101, 7, 33,164, -242,123,239,189, 55, 67, 34,145,116,208,106,181,177, 26,141,230,182,213,106,253, 67,167,211,189, 67, 41,205, 98, 89,241,159,131, -201,100, 74,174, 86,173, 26,239,174, 1, 85, 82, 69, 94, 82,195,202,102,179, 37, 85,169, 82,197,107,227,204, 13,103,114, 9,233, -232,102, 98, 98, 34,231, 43,151, 8,179,217,156, 94, 82, 56, 19, 19, 19, 81, 90, 78,111,113, 79, 72, 72,112, 27,119, 47,130, 48, -185,132,242,227,158, 56, 75,122,159, 37, 65,175,215,231,132,135,135, 23, 26, 12, 6,169,209,104,148, 90,173,214, 98,230, 71,149, - 74,149,193,114, 14, 3,195,125, 10,173,127, 51,236,194,170, 71, 25,242, 25, 1, 60, 83, 6, 60, 6,151,253,194,146,246, 75,137, - 7, 97, 17, 18, 0,232,202,232, 29,102, 2,120,158,101,185, 71, 15,153,153,153, 79,148, 53,103, 86, 86, 86,153, 55,212, 50, 50, - 50,154, 61,128,184, 55,250,175,114,150,132,228,228,228, 39, 88,206, 96, 96, 40, 27,112,236, 21, 48, 48, 48, 48, 48, 48, 48, 48, - 60, 24, 16, 0, 29,221,157, 40,205,104, 2, 66, 72,199,210, 62,216, 27, 63,227,100,156,140,147,113, 50, 78,198,201, 56, 31, 63, - 78,111,220,143,221,104, 70, 74,233, 3,219, 0,116,100,156,140,147,113, 50, 78,198,201, 56, 25, 39,227,252,175,110,172,235,144, -129,129,129,129,129,129,129,225, 1,129, 9, 45, 6, 6, 6, 6, 6, 6, 6, 6, 38,180, 24, 24, 24,254,141, 32,132, 84, 45, 95, -190,252,249,106,213,170, 37, 19, 66,134, 63,224,103, 13,105,214,172, 89,150, 82,169,220, 74, 8,169,202,222, 62, 3, 3, 3, 19, - 90, 12, 12, 12,143,181,200,170, 83,167,206,222, 11, 23, 46, 84,223,190,125,123, 76,108,108,236, 71, 15,242,121,141, 26, 53,154, -189,103,207,158,144,223,127,255,189, 83, 84, 84,212,238,123, 17, 91,132,144,170,241,241,241,231,171, 85,171,150, 68, 8, 25, 82, -198,239, 99,120,243,230,205,179, 21, 10,197, 22, 38, 4, 25,254, 3,249,191, 54, 33,164, 14, 19, 90, 12, 12, 12, 12, 15, 80,100, -237,223,191, 63,212, 96, 48,224,194,133, 11,200,200,200, 56,241, 32,159,121,233,210,165,156,253,251,247, 35, 46, 46, 14, 63,252, -240, 67,120, 66, 66,194,158,210, 8, 26, 49,204,231,207,159,175,190,125,251,246,216,136,136,136, 79,202, 50,124, 77,154, 52,249, -112,207,158, 61,193, 91,183,110,237, 28, 30, 30,190,155,137, 45,134,199, 48,223, 43, 8, 33,207,112, 28,119,184,118,237,218,167, -107,213,170,117,138,227,184, 3,132,144,254,132, 16,254, 63,249, 78,196, 37, 22, 54,111,222,188, 11, 0,186,117,235,214,134, 37, - 21, 6, 6,134,251, 44,108,107,213,170, 85,235,224,193,131, 7,213,122,189, 30,107,214,172,193,251,239,191,111,201,206,206,222, - 3, 64,235,230,150, 35, 0, 62,243,101,233, 45, 66, 72, 0,128, 49, 0, 26,187, 57,173, 9, 9, 9,105, 53,101,202, 20,233,147, - 79, 62, 9,131,193,128,190,125,251, 26, 46, 93,186, 84,159, 82,122,201, 87, 97,168,215,235,113,244,232, 81,244,236,217,115,171, -197, 98,233, 82, 86,239, 37, 48, 48,240,236, 47,191,252, 82, 51, 38, 38, 6,215,174, 93,195,176, 97,195, 50,210,210,210, 90,123, - 11, 27, 3,195,191, 32,207, 87, 0,240,146,159,159,223,200,182,109,219, 6,247,236,217, 19,161,161,161,176, 90,173,184,125,251, - 54, 54,109,218,132,253,251,247,167,152, 76,166,133, 0,190,164,148,230,186,227,121, 28,181, 8,161,148, 98,243,230,205, 20, 64, - 91,123,228,118,177, 36,195,192,192,112,159,133,238,126,157, 78,215, 76,167,211,161,160,160, 0,229,202,149,131, 84, 42,117,123, -109,122,122, 58,246,237,219,135,151, 95,126,249, 92,106,106,106,235,146,214,189, 36,132, 4, 55,104,208, 96,255,142, 29, 59,170, -250,251,251, 59,142, 11,130, 0,179,217, 12,139,197, 2,179,217, 12,163,209, 8,163,209, 8,185, 92, 14,149, 74,133,144,144,144, - 51,148,210, 58,190,138,172,227,199,143, 99,232,208,161, 25, 89, 89, 89,101, 42,130, 8, 33, 85, 35, 34, 34,118, 47, 95,190, 60, - 60, 49, 49, 17,183,110,221,194,115,207, 61,151,121,243,230,205, 86, 76,108, 49,252,139,243,251,196,167,159,126,250,195,200,200, - 72,174,118,237,218,136,142,142,134,209,104,132, 94,175, 7,165, 20, 60,207,131, 82,138,188,188, 60,236,222,189, 27, 59,118,236, - 48,230,228,228,124, 11, 96, 1,165,244,178,147,200,122, 44,181,136, 67,104,117,235,214,141,176,228,194,192,192, 80, 70, 5,239, -233,188,188,188,218, 70,163, 17, 90,173,214,167,123,174, 93,187,134,225,195,135,159, 75, 77, 77,109,225,206,178, 69, 8, 9,104, -208,160,193,161,221,187,119, 87, 53, 24, 12,200,207,247,190,238,188, 92, 46,135, 82,169, 68,104,104,232, 1, 74,105,115, 79, 45, -241,218,181,107, 31, 61,112,224, 64,136, 94,175,199,137, 19, 39, 48,100,200, 16,115,118,118,246, 94,184,183,190, 1, 64, 54,138, -214, 81,189,233,134, 47, 30,192, 43, 0, 42,120,184, 87, 19, 30, 30,222,114,197,138, 21,178,138, 21, 43, 66,167,211,161,127,255, -254,217,151, 46, 93,106, 76, 41,189,206, 82, 15,195,191, 48,191, 95,186,112,225, 66, 21,155,205,134,204,204, 76, 24,141, 70,232, -116, 58,135,208,146, 72, 36,160,148,194,106,181, 58, 26, 70,199,142, 29,195,246,237,219,233,181,107,215,222,167,148, 78, 19,133, -214,227,168, 69,120,150, 68, 24, 24, 24, 30, 0, 6, 52,105,210,228,196,111,191,253,166,148,203,229,216,184,113,163,199,174,195, -200,200,200, 90,203,150, 45, 75, 72, 76, 76,196,162, 69,139,106,246,237,219,119, 12,128, 25,110, 56,199,236,216,177,163,170,193, - 96,192,137, 19, 39, 48,108,216,176,235,105,105,105,103, 93, 69, 76, 66, 66, 66,171, 79, 62,249, 68,218,176, 97, 67,228,231,231, -163, 83,167, 78, 58, 0, 47,149, 16,214,177, 59,119,238, 12,209,235,245, 40, 40, 40, 64,219,182,109,145,149,149, 37, 3,208,222, -211, 13,122,189, 30, 21, 42, 84,168, 10,224, 46,241, 22, 26, 26,250,245,173, 91,183,218,169, 84,170, 18, 95,144,217,108, 70, 82, - 82, 18,130,130,130,176,105,211,166,144, 74,149, 42,189, 11, 96, 4, 75, 58, 12,255, 70,152, 76, 38,252,248,227,143,104,208,160, - 1,106,212,168,129,194,194, 66,135,232, 50,153, 76, 14,145, 5, 0, 28,199,161,113,227,198,168, 82,165, 10,121,237,181,215,134, - 0,152,246, 56,191, 27, 81,104, 77, 97, 62, 90, 12, 12, 12,101, 5, 74,233, 37, 66, 72,253,142, 29, 59,238, 89,187,118,109, 88, -215,174, 93, 81,169, 82, 37,105,159, 62,125,194,181, 90,109, 7,151,214,112,240,176, 97,195,142,222,190,125, 59,193,126,168,177, - 7,218,198,254,254,254,162,111,211,245,180,180,180, 70,174,221,140, 10,133, 98,203,201,147, 39,165,114,185, 28, 71,142, 28,193, -240,225,195, 51,175, 95,191,238,173, 91, 46,200,100, 50, 65, 34,145, 0, 0,146,146,146,188,198,239,214,173, 91, 16, 4,193,232, -238, 28,199,113,138, 99,199,142, 33, 38, 38,166, 68, 14,142,227, 32,147,201,156, 15,229,178,148,195,240, 47,133,197,100, 50,161, - 81,163, 70,184,126,253, 58,142, 29, 59,230, 16, 92,153,153,153, 72, 73, 73, 41,118,241,225,195,135,113,252,248,113,180,110,221, -218,149,231,177,212, 34,188, 61, 66, 31,108,222,188,153, 9, 44, 6, 6,134,178, 22, 91,173,122,244,232,177,123,249,242,229,225, -229,202,149,131,191,191,127,128,155,235,114, 8, 33,103,165, 82,105,130,175,220,105,105,105,103,221,249,114, 69, 69, 69,213, 55, -153, 76, 56,126,252, 56,134, 12, 25,146, 97,247,249,242,230,251, 52,189, 67,135, 14, 61,182,110,221, 26,162, 84, 42,113,246,236, - 89, 95,186, 14,111, 0, 88,224,238, 68, 70, 70,198,144,214,173, 91,191, 7, 32,196,195,189,154, 42, 85,170,180, 60,122,244,168, -140, 16,130, 27, 55,110,160,127,255,254,217, 0, 62,101,169,134,225, 95,138,201, 79, 63,253,244, 55, 99,198,140, 9,108,218,180, - 41,146,146,146, 28,130,171,126,253,250,168, 91,183, 46,254,250,235, 47,108,217,178, 5,199,143, 31,135, 66,161, 64,165, 74,149, - 80, 56,231, 19,224, 19, 88, 68,146,199, 85,139, 56, 70, 29, 50, 48, 48, 48, 60,144, 66,134,144,170, 50,153,108,126,120,120,120, -189,228,228,228,215, 41,165, 63,184,156, 15,238,215,175,223,217, 85,171, 86, 69,223,184,113, 3, 21, 43, 86,220, 72, 41,237,229, -134,103, 3,165,180,231,181,107,215,208,162, 69, 11,183, 22, 45, 66,200,240,168,168,168,169, 5, 5, 5,121, 58,157,174,191,175, - 14,230,132,144,170,149, 43, 87,222,179,113,227,198, 48,181, 90,141,243,231,207, 63, 48,103,248,106,213,170,237, 61,124,248,112, -168, 84, 42,197,145, 35, 71, 48,108,216, 48,230, 12,207,240, 56,228,115,127, 0,227, 19, 19, 19,223, 28, 53,106,148,162,102,205, -154, 72, 74, 74, 66, 70, 70, 6,114,114,114,112,240,224, 65, 0, 64,108,108, 44, 98, 99, 99,113,241,226, 69,236,219,183, 47,191, -176,176,112, 4,165,244,167,199,250,221, 48,161,197,192,192,240,144, 11,228,120, 56, 57,139,247,235,215,175,209,138, 21, 43,162, -179,178,178,112,232,208, 33,244,237,219,247, 29, 74,233, 12, 55,247,189,157,154,154,250, 33, 0,156, 57,115,198,213, 71,203,163, -115,122,105, 68, 80,133, 10, 21,246,172, 89,179, 38, 44, 52, 52, 20, 23, 46, 92, 64,255,254,253,207,106,181,218,218,101, 21,119, -181, 90,189, 53, 53, 53,181,147, 76, 38,195,129, 3, 7, 48,100,200, 16, 54,189, 3,195,227,150,191, 35, 0,188, 91,179,102,205, -151, 70,142, 28,201,199,199,199, 35, 57, 57, 25,127,254,249, 39, 42, 85,170,132,219,183,111, 99,199,142, 29,166,140,140,140,249, - 0,102, 81, 74,243, 30,251,151,242, 32, 87,172, 6, 91,217,156,113, 50, 78,198,121,247,117, 91,206,157, 59, 71, 69,216,108, 54, -154,156,156, 76,183,110,221, 74,163,162,162,206, 2, 8,112,199, 9, 32,160, 70,141, 26, 23, 46, 94,188, 72,111,221,186, 69,205, -102,179,131,227,194,133, 11, 20,192,174,251, 13, 39,128,170,177,177,177,233, 59,119,238,164, 23, 47, 94,164, 81, 81, 81,183,203, - 50,238, 21, 42, 84, 72,207,200,200,160,127,254,249, 39, 13, 15, 15, 79, 7, 80,149,165, 37,198,249, 56,114,218, 27, 82, 43, 26, - 54,108,104, 91,184,112, 33,125,233,165,151,104,124,124,188, 13,192,215, 0, 98, 31,164,246,120,212, 54, 54,234,144,129,129,225, - 97, 67,113,240,224, 65, 40, 20, 10,199,129, 83,167, 78, 57,207,163,149,239,161, 81,152, 79, 8,105,209,181,107,215, 61, 11, 23, - 46,172, 97,177, 56, 92, 59,176,115,231, 78, 0, 48,150, 65,195,243, 18, 33,164,117,151, 46, 93, 22,132,134,134,214, 75, 77, 77, -157, 92,150, 17,191,113,227,198,235,117,234,212,153, 81, 80, 80,144, 95,154,174, 77, 6,134,127,161, 17,231, 6,128,161,132,144, -143,142, 29, 59,246, 14, 0, 10, 96, 58,165,244,252,127,237, 93, 48,161,197,192,192,240,176, 49,252,249,231,159,119,117, 22,247, -105,102,120,187,227,124,243,110,221,186,185,206, 12,239,209, 57,253, 94,196, 22,128,206, 15,168,242,249, 1,192, 15, 44, 9, 48, -252,135, 4,215, 89, 0, 3,255,203,239,128, 9, 45, 6, 6,134,135, 93,240,222, 4,240,220,125,220,159, 15,247,243,108, 49, 48, - 48, 48, 60,114, 96,139, 74, 51, 48, 48, 48, 48, 48, 48, 48, 48,161,197,192,192,192,192,192,192,192,240,239, 2, 1,208,209,221, - 9, 74,233,118,159, 73, 8,233, 88,218, 7,123,227,103,156,140,147,113, 50, 78,198,201, 56, 25,231,227,199,233,141,187, 52,250, -227, 95, 1, 31,135,113, 18, 54,244,149,113, 50, 78,198,201, 56, 25,167, 47,156,246, 70, 60, 65, 81,175, 9, 39,238, 63,226,211, - 17,144, 71, 53,238,255, 21,206,255,228,244, 14,132, 16,199,203, 34,132, 8, 0, 4, 90, 6, 51,156, 18, 66,196, 15, 81, 38,124, - 12, 15,192,212, 89,244,141,200,223,122,156,125, 39, 6, 6,134, 82,149, 29, 18,167,202,214, 6,192, 70, 8,193,163, 86,150,148, -101, 61,247, 32,226,254, 95,230,124, 92,192,151,244,194, 36, 18,201,214,176,176,176,118,153,153,153,130,253, 56,228,114, 57, 56, -142,131, 84, 42,213, 23, 20, 20, 4,220,195,199,248, 58, 50, 50,114,120, 86, 86,150,192,113, 28,148, 74, 37, 8, 33, 14,206,220, -220,220,128,127,250,165, 84,168, 80, 33, 71,175,215,251,185, 30, 87, 42,149,134,155, 55,111,250,255, 23, 10, 74,153, 76,246,116, - 72, 72, 72, 80, 70, 70, 6, 21, 23,191,149, 72, 36,226, 66,184,214,220,220,220,239,124,229, 11, 9, 9, 57, 28, 18, 18, 18, 36, -222, 79, 8, 65, 86, 86, 86,110, 90, 90, 90, 19, 0, 80,169, 84,251, 52, 26, 77, 40,207,243,144, 72, 36,144, 72, 36,208,233,116, - 89,153,153,153, 45, 88,181,245,239,196,218,181,107, 37, 93, 98,159,171,196, 83,125, 93,142,163,129,130, 64,242,172, 68,117,106, - 75,242,215, 87,125,185,191, 95,191,126, 54,246, 22, 31, 30, 20, 10,197,252,200,200,200,145,133,133,133, 58, 66, 8, 37,132,160, -168, 26,192, 93,191, 54,155, 45, 41, 51, 51,179,145,151,202, 86, 42,151,203,231, 70, 69, 69, 13,211,233,116, 58, 59, 31, 37,132, - 32, 58, 58,186, 24, 31, 0, 88, 44,150,164,140,140,140, 70,190,132, 53, 34, 34, 98,169, 74,165,250,159, 78,167,211,218,133,145, -115, 15,141,115,101,254, 87, 70, 70, 70, 43,111,194, 64, 46,151, 47,136,140,140,124,214, 30,119, 16, 66,104,120,120,248,125,199, - 61, 50, 50,114,152, 86,171, 45, 22,247,136,136, 8,183,156,158,226,238,142,211, 57,156,132, 16,132,135,135,223,119, 56, 31, 69, -206,199, 94,104, 1,224, 8, 33, 27, 90,180,104,209,118,215,174, 93,220,133, 11, 23,184,234,213,171,195,102,179, 65, 16,138,210, -117, 92, 92,156,250, 30, 42,240,101,173, 90,181, 26,180,123,247,110,110,195,134, 13, 92,227,198,141, 65, 8,129,205,102,131,205, -102, 67,237,218,181, 85,247, 41, 16,252,120,158,127, 77, 46,151,183,177, 90,173, 53, 0, 64, 42,149,158, 55, 26,141,187,172, 86, -235, 60, 74,105,161, 47, 60,102,179, 89,157,158,158,126,215,187, 73, 76, 76,148,223,107,216, 2, 2, 2,246,115, 28,151,232,120, -193,118,193,225, 46, 51,139,191,148,210,107, 25, 25, 25,205, 61,113, 6, 7, 7, 59, 56, 61,113,184, 30, 19, 4,225, 90,122,122, -122,115, 47, 34,171,111,171, 86,173, 2,183,111,223, 78,110,223,190, 77, 84, 42, 21, 4, 65,128,205,102,131,197, 98, 65,205,154, - 53, 75, 53, 45, 72, 80, 80, 80,192,196,137, 19, 43, 61,245,212, 83, 88,183,110, 29,158,121,230, 25,180,108,217,242,178,120, 94, -163,209,132,158, 59,119,174, 74, 72, 72, 8,116, 58, 29,242,242,242,208,169, 83,167,127,125,230,106,218,160,220,116,194, 17,199, - 92, 81,212,106,203, 62,120, 50,249,221,251,229, 13, 10, 10, 58, 46,151,203, 35,197,239,202,113,156,219,111,237,124,204, 96, 48, -164,101,102,102, 54,240,146,127, 42, 0,232, 33,145, 72, 42,243, 60, 95, 13, 64, 5,171,213, 26, 9, 0, 50,153, 44, 77, 34,145, -220,176, 88, 44, 23, 77, 38,211, 21, 0,191,216, 39, 36,116,139, 46,177,207, 85, 34, 86, 93,191, 2,163,208, 85, 93,113, 86, 85, -221, 95, 19, 47,169, 21,186, 95,187,196, 62,183,214, 87,177,245, 15, 54, 52,170, 2, 88,141,162, 5,165, 95,178,207, 3,116, 63, -124,177, 0,122, 2,168, 42,147,201, 18,204,102,115, 38,128, 99, 0,182, 83, 74, 47, 19, 66,226,195,195,195,127, 16, 4,193,152, -149,149,245,156,187,101,132,154, 53, 42,127,148,227,184, 56,216,101,132, 64,109, 73, 7,142,222, 46,147, 10, 74, 34,145, 44,232, -211,167,207,179,107,215,174, 85, 31, 59,118, 76, 93,163, 70, 13, 71,249, 36, 8, 2, 92, 13, 17, 9, 9, 37,174,253, 77, 0,240, - 28,199,205,239,215,175,223,224, 21, 43, 86,168,111,222,188,169,142,137,137,113,112, 58,139, 56, 17, 49, 49, 49, 62,133, 53, 52, - 52,244,235,167,158,122,106,232,242,229,203,165, 27, 55,110, 84,133,133,133, 33, 52, 52, 20, 50,153,236,174,107, 91,180,104, 33, -120,161,227, 56,142, 91,208,171, 87,175,161,171, 86,173, 82, 31, 58,116, 72, 93,187,118,109, 72, 36,146,251,142,123,239,222,189, - 7,255,248,227,143,234,211,167, 79,171, 43, 87,174, 12,142,227,192,113,220, 93,124, 28,199,161, 92,185,114, 62,113,246,236,217, -115,240,234,213,171,213,199,143, 31, 87, 87,171, 86,205,241, 62,157,186,237, 74, 29,206, 71,156,243,241, 21, 90,118, 51,234,138, - 22, 45, 90,116,217,181,107,151, 4, 0,142, 31, 63,142,236,236,108,196,198,198,194,207,207, 15, 10,133, 2, 6,131,129,150,178, -176,249,218, 46,178,164, 0,176,254,127,189,113, 77, 10,188,156,110,130, 76, 38,195, 95,127,253, 5,137, 68, 66,239,163, 48,107, - 29, 16, 16,176,252,167,159,126, 10,110,208,160, 1,151,153,153,137,132,132, 4,100,103,103, 55,217,189,123,119,195,231,158,123, -238, 57, 66,200, 51,148,210,221,190,114,254,250,235,175,208,104, 52, 80,171,213,208,104, 52, 48,153, 76,228,158, 95, 52,207,199, -221,184,113, 35,194,207,207, 15,130, 32, 56, 54,151,254,109, 7, 4, 65, 64,149, 42, 85,204, 94, 10,200,184,155, 55,111, 70,168, - 84, 42, 80, 74,139,241,217,108, 54, 40, 20, 10,231,150, 3,108, 54, 27, 18, 19, 19,205,222, 44, 89,162,200, 2,128,149, 43, 87, - 34, 42, 42, 10, 17, 17, 17,208,104, 52, 80,169, 84,197, 42,118, 31, 11,114,116,233,210, 5, 31,124,240, 1,102,205,154,133,241, -227,199, 23, 43,104,165, 82, 41, 66, 66, 66,240,251,239,191, 35, 32, 32, 0,241,241,241,144, 74,165,255,126,203, 32, 71, 66, 14, - 28,189,229,176,208, 62,217,190, 58,223,180, 97,252, 98,251, 23, 6,199, 1,130, 80, 84,117, 18, 2,106,181, 8, 57, 71, 78, 37, - 79,246,225,125,198,220,188,121, 51,194,121,102,245,146, 96,179,217, 16, 27, 27, 43,241,146,127,186,214,170, 85,107,253,232,209, -163,101,149, 43, 87, 38, 50,153, 12, 60,207,131,231,121, 49, 61,198, 83, 74,227, 5, 65,104,155,150,150, 70, 23, 45, 90,244, 17, - 33,164, 15,165,244, 87,183,233,157,234,235, 22, 24,133,174,123, 78,160, 73,191,142,111,225,247, 53, 19,155,180,170, 47,192, 95, -173,191, 10,224,145, 21, 90,132,144,170,181,106,213, 58,113,232,208, 33,165,217,108, 70,211,166, 77, 15, 18, 66, 26,222,203, 12, -238,132,144, 96, 0,159, 76,154, 52,105,232,232,209,163, 37, 65, 65, 65,144,203,229, 40, 40, 40,192,213,171, 87,135,125,247,221, -119,148, 16,242, 25, 0,255, 27, 55,110, 52, 59,124,248, 48,218,181,107,247, 10,128,215,238, 86, 4,146,184,125,135,175, 71,136, -251, 61,187,212,145, 53,111, 28,159, 86,212, 32,115,189,154, 66,176, 9, 73,135, 78, 36, 53,242, 33,140, 31, 61,253,244,211, 67, -214,174, 93,235, 7, 0, 75,150, 44,193,211, 79, 63,141,144,144, 16,168,213,106,200,100, 50, 72,165,210, 98,191, 94, 44, 68, 18, - 0, 31, 13, 28, 56,176,223,138, 21, 43,252, 1, 96,197,138, 21,232,221,187, 55, 66, 67, 67,225,239,239, 15,185, 92, 14,137, 68, - 82,234,111, 19, 26, 26,250,117,203, 38, 77, 70, 44, 95,190, 28, 0,240,206,171,175,226,169, 39,158,128,159, 90, 5,181, 74, 14, -241, 93,200, 37, 82, 60,249,242, 56,111,241,230, 0,204,121,250,233,167, 7,172, 90,181,202, 31, 0,142, 29, 59,134,244,244,116, - 68, 70, 70, 66,165, 82, 65, 46,151, 59,226, 76, 8,129, 74,165,242, 41,238, 79, 63,253,116,191, 31,127,252,209, 31, 0,150, 45, - 91,134, 46, 93,186, 56,226,174, 80, 40, 32,147,201,138,109,174,162,211, 29,103,159, 62,125,250,173, 94,189,218, 31, 0,190,251, -238, 59,116,236,216, 17,193,193,193,142,247, 41,114,149,230, 27, 61,202,156,143,181,208, 18,125,167, 34, 35, 35, 7,236,217,179, -135,115, 18, 9, 80, 40, 20, 80, 40, 20,144,203,229,142,238,195, 82, 20, 56, 36, 50, 50,114,248,238,221,187, 29, 55,153,232, 93, -166,235, 82, 87,224, 78,252, 29,219,181,107,247,227,166, 77,155,148, 50,153, 12,122,189, 30,103,207,158, 69, 96, 96, 32,228,114, - 57,122,245,234, 37,105,209,162, 69,104,219,182,109,215, 17, 66, 6,251, 50,162,129, 82, 10, 63, 63,191, 98, 66,235,126,187,152, - 85, 42, 21, 54,110,220, 8,137, 68,226,182, 0,115,254, 31, 17, 17,225, 75,188,161, 80, 40,176,127,255,126, 72, 36, 18, 72,165, - 82,240, 60, 15,169, 84,138,205,155, 55,227,141, 55,222, 64,102,102, 38, 8, 33,144, 74,165,240,247,247,218,235, 73, 66, 66, 66, -130, 68,145, 37,138, 32,149, 74, 5,169, 84, 74,120,158, 39, 98,215, 30, 33,132,248,218,231,206,113, 28,190,255,254,123,204,158, - 61, 27, 19, 38, 76,192,210,165, 75, 81,183,110, 93,103, 17,138,252,252,124, 4, 7, 7, 35, 56, 56, 24, 74,165,242,158,211,194, -163, 4,215,183, 51,119,222, 66, 53, 4,138, 34, 39, 16, 1, 16, 0, 10, 10,129, 10, 72, 75,190,138,247, 63,248,216,231,218, 71, -161, 80, 96,223,190,125, 14, 49,196,243, 60, 8, 33,112, 22, 72,226, 22, 21, 21,229,149, 79, 38,147, 77,249,249,231,159,229,223, -127,255, 61, 86,173, 90,229, 72, 91, 26,141, 6, 65, 65, 65, 8, 13, 13,117,108,113,113,113,228,155,111,190,145,213,173, 91,119, - 10,128, 95,221,127,115, 26,168,174, 56,171,106,191,142,111, 1, 0,250,189, 69,145,115,249,195,122, 92,238,228,192, 71, 89,100, -213,169, 83,103,239,254,253,251,149, 58,157, 14,130, 32,224,215, 95,127, 85,119,236,216,113, 15, 33,164, 85,105,197, 86,133, 10, - 21, 54,238,223,191,191, 69,120,120, 56,242,242,242,144,159,159, 15,139,197, 2,137, 68,130,248,248,120,124,244,209, 71,164, 87, -175, 94, 99,135, 13, 27,102, 80,169, 84,162,101,163,130,167,242,200, 25,139, 62, 93, 28, 68,105, 81,250,161, 2, 45,246,155,157, -126, 3,175,190,254,190, 79, 97, 44, 87,174,220, 75,235,214,173,243,115,182, 44, 57,139, 0,231, 50, 74,220, 60, 9, 3,187, 85, -131, 43, 95,190,252,136, 31,126,248,193,193, 25, 22, 22,230, 40,151,120,158, 7,199,113,216,179,103, 15,102, 78,153,132,224,240, - 24, 44,252,116,137,215,112, 70, 68, 68, 44,237,218,181,235,255,150, 45, 91,230, 56, 86,167, 98, 69,116,107,241, 4, 34,194, 2, - 16, 22, 92, 84,182, 81,129,224,212,197,235, 94,235, 35, 0, 92,185,114,229,158, 91,179,102,141,159,115,131, 80,140, 43, 0,232, -116, 58,135, 21,223,100, 50,161, 81,163, 70, 62,197,221,153, 83,180,182,137,162,205,181,172, 23, 27, 50, 37,113,150, 43, 87,110, -132, 40,132, 1, 32, 36, 36,164, 24,135, 84, 42,197,154,223,151,223, 85, 55,220, 47,103,105,191,187, 43,231,141, 27, 55, 48, 99, -198, 12, 71,153, 36, 90,245, 8, 33,136,141,141,197,194,133, 11, 75,226,116,135,198, 0,194,157,246, 77, 0,228, 78,191, 25, 40, - 90, 97,194,245, 58,241,184, 20, 64, 61,251, 57, 27,128, 2, 0, 65,110,248, 60,241,100,162,104, 25,161,112,151,235, 93,159,227, - 94,104,109,222,188,153, 2,192,198,141, 27,219,245,236,217,115, 95,102,102,166,112,225,194, 5,238,216,177, 99,144, 74,165,136, -136,136, 64,227,198,141,197,110, 53, 72,165, 82,104, 52, 26, 18, 20, 20,148, 38, 86,188,226, 75,116,238,107,119, 18, 52, 92,118, -118,182,176,109,219, 54,110, 69,159,206, 48, 81,160,254,123, 51,209,165,123,119,108,137,149, 67, 2,160,201,133, 76,168,213,106, - 94, 42,149, 90,196,143, 33,114, 58,251,110,185,138, 36, 66,136,191, 70,163,249,230,151, 95,126, 81,114, 28,135,130,130, 2, 8, -130,128, 22, 45, 90,128,227, 56,156, 57,115, 6,239,188,243, 14,214,175, 95,143,159,127,254, 89,213,160, 65,131,111, 8, 33, 53, - 40,165, 5, 78,133,216,118,119,137,212,223,223, 31,106,181,218, 33,180,196, 56, 59,155,192,197,235, 41,165,201,153,153,153, 13, - 75,226,180,217,108,232,221,187, 55, 8, 33,144, 72, 36,197, 10, 31,231, 95,153, 76,134, 51,103,206,220,149, 8,221, 9, 68, 65, - 16,208,178,101, 75, 0,128, 90,173,134,159,159,159,184,238, 27, 0,160,126,253,250, 48,153, 76, 8, 11, 11,195,249,243,231,221, - 21,224,197, 56, 51, 50, 50,104, 74, 74, 10, 89,177, 98, 5,164, 82, 41, 66, 67, 67,161, 86,171,201,242,229,203, 39,201,100,178, - 56,131,193, 32,152, 76, 38,200,229,242,133,162,117,139,231,121,109, 94, 94, 94,168, 39, 78,137, 68,130,209,163, 71,227,205, 55, -223,196,210,165, 75,241,226,139, 47,222,101,241, 50, 24, 12, 8, 11, 11,115,136, 45, 95,226,126,255, 66,232, 1,115, 10, 20,103, -143,111,193,185,211,219, 33,216, 4,216, 4, 10, 74,109, 16,172,192,177,109, 7,171,220,185,150, 18, 75, 65, 1,123, 7,135, 34, -175,208,218, 54, 76, 81, 13,192,134,157,153,198,249,222,210, 39,207,243,176, 88, 44,248,229,151, 95,112,245,234, 85,108,221,186, - 21,122,189,222,241, 30,155, 53,107,134, 17, 35, 70,184, 21, 90,174,156,148,210,101,183,111,223,174,223,178,101, 75,146,155,155, -139,220,220, 92,232,245,122,216,108, 54, 88,173, 86,240, 60, 15,165, 82, 9,149, 74,133,200,200, 72, 24, 12, 6,106, 52, 26,151, -121,226, 20, 4,146,167,251,107,226,165,223,215, 76,108,210,239, 45,138,181,179, 9, 42,149, 87,232,254, 56,234, 63, 98,195,222, -241,157, 0, 80,193,174, 29, 56,128, 90,108, 66,230,155,147, 62, 25,251,208,191,209,221, 34, 43, 84,175,215,163,160,160,168,120, -144,203,229, 88,187,118,109, 88,143, 30, 61,118, 19, 66, 90,123, 18, 91,238, 56,253,253,253,227, 37, 18, 9,206,156, 57,131,207, - 63,255, 28,127,252,241, 7,210,210,210,114, 98, 98, 98, 2,219,182,109,203,189,250,234,171,168, 95,191, 62,190,253,246, 91,165, - 55, 78, 74, 41,110, 92,222,131, 27, 87,246, 66, 16,168,147, 85,220,253,127,234, 99,220,181, 90,173,225,196,137, 19,126, 95,125, -245, 21, 34, 34, 34,144,144,144, 0,181, 90, 13,165, 82, 89,172,146,117,174,120,189,229, 77,189, 94,111,184,113,227,134,223,143, - 63,254,136,208,208, 80, 84,168, 80, 1,106,181, 26,114,185,220,209, 32, 88,177, 98, 5, 86,126, 48, 4, 55, 46,158, 70,239,110, -157,188,134, 83,173, 86,255,111,217,178,101,197, 76, 32,145,193,193,224,165, 28, 36, 82,130,224, 14,125, 0, 0, 57,127,254,228, -113,118, 72, 23, 78, 82, 80, 80, 96, 56,116,232,144,223,209,163, 71, 33, 8, 2, 42, 84,168, 0,157, 78,135,128,128, 0, 71,252, -183,109,219,134, 94,189,122,225,251,239,191, 71,179,102,205,188,198,189,176,176,208,112,250,244,105,191, 31,126,248, 1, 33, 33, - 33, 40, 87,174,156, 35,238,226, 38,149, 74, 33,145, 72,144,152,152,136,188,188, 60,248,249,249,121,253, 70,199,142, 29,243,251, -225,135, 31, 16, 28, 28,140,184,184, 56,135,197, 77, 20, 71,179, 23,127, 80,140, 67, 73,162,239,155,179,180,223,221,149,179,119, -239,222,168, 84,169, 18, 2, 2, 2,160,209,104, 28,220, 37,113,138, 90, 4, 64,219,110,221,186,237,114,249,132,225,132,144, 77, - 78,207,239, 78, 8,217,228,252,235,233, 58,251,223,214,147, 38, 77,106, 52,107,214,172, 25,205,154, 53,251,113,255,254,253, 43, - 61,241,121,226,153, 52,105, 82,173, 89,179,102,205,112,190,222,205,115, 60, 91,180,186,117,235, 70,236,145,228, 1,160,122,245, -234,200,206,206,134, 66,161, 64,227,198,141,145,153,153, 9, 63, 63, 63,200,100, 50, 80, 74, 49,118,236, 88,201,248,241,227, 35, - 56,142,131,213,106,117, 20,252, 30,250,218, 5,142,227,208,188,121,115,156,181,247, 8,117,233,222, 29,113,113,113, 16,157, 60, -148, 74, 37,198,142, 29, 75,222,120,227, 13, 94,180,102, 80, 74,161,215,235, 17, 29, 29,173, 42,161, 75,238,213,117,235,214, 5, -138, 38,121,177,235, 76, 34,145,224,194,133, 11,152, 51,103, 14,134, 13, 27,134, 91,183,110, 33, 38, 38, 6,111,190,249,166,223, -172, 89,179, 94, 5, 48,213, 91,129,236,231,231,231, 16, 89,106,181, 26,175,190,250, 42,223,162, 69,139, 8, 63, 63, 63,248,251, -251, 67,236, 6,180,217,108,168, 88,177,162, 87,105, 46, 8, 2,182,108,217, 2,158,231,189, 90,180,236, 9,208, 39,206, 67,135, - 14, 57, 68,154,115, 43,137, 16,130,179,103,207, 58, 68,157, 15,156,148,227, 56,104, 52, 26, 68, 69, 69, 65,165, 82, 65,173, 86, -147, 31,127,252,241,221,132,132,132,232, 55,222,120,131,203,207,207,231,154, 55,111,142,167,159,126,154, 23, 4, 1,102,179, 25, -181,106,213,242,106,121,219,181,107, 23, 62,255,252,115,188,248,226,139,110, 45, 90,162,179,100, 64,192, 63, 62, 22,162,204, 32, - 0, 48, 91, 45,208, 21,234, 29, 93,187, 54,155, 13,167,119,158,172,114,237,228,229, 90,155,126,252, 94, 10, 0,134,157, 63, 57, -223, 22,253,244,226,213, 85,219,134,200, 14,237,204, 54, 31,242,102, 41, 28, 55,110, 28, 38, 79,158,140,129, 3, 7, 98,219,182, -109,120,231,157,119,240,220,115,207, 21,179,104,249, 2,139,197,242,197, 51,207, 60,243,226,218,181,107,171,189,245,214, 91,156, -104,209, 82,171,213,162,143, 23,140, 70, 35,244,122, 61, 46, 94,188, 40, 60,255,252,243,151, 76, 38,211, 23,158,248,172, 68,117, - 74,173,208,253, 90, 49,142,171,164,189,254,177,127,203, 39, 42,232,137,170, 97, 94,159,170, 29,105,215,225, 21,130, 65, 41,168, - 0, 8, 20, 48, 26,181, 24, 59,246, 21,201, 63,245,157,156, 69,150,193, 96,192,137, 19, 39,208,174, 93, 59,220,190,125, 27,231, -207,159, 71,149, 42, 85,176,124,249,242,240,193,131, 7,151, 40,182, 92,113,250,244,233, 73,245,234,213, 91, 80, 88, 88,152, 93, - 88, 88,184, 0,192, 74, 74,105, 46, 33,164,198,213,171, 87, 23,109,217,178,165,213,251,239,191, 47,113,241,209,145,120, 50,143, - 90, 44, 86,232,245,198, 18, 5,150,184, 79,169,224,107,220,105,181,106,213,208,163, 71, 15, 72,165, 82, 71, 99,205,185,219,204, - 85,112,149, 84,126, 0, 16, 8, 33,136,137,137, 65,215,174, 93, 33,147,201,138,113,138, 21,107,215,174, 93, 49,110,234,123,248, - 98, 92,123,124,254, 76, 21,116,156,158, 86, 98, 56,117, 58, 93,225,142, 29, 59, 84,111,190,248, 34,234, 85,174,140,176,128, 0, -148,143, 12,135, 74, 33,135,204, 57, 76,196,187,145,157, 82, 74, 9, 33,130, 68, 34, 65,237,218,181,145,150,150,134,235,215,175, -227,250,245,235,224, 56, 14, 45, 91,182,116, 88, 97,174, 92,185,130,169, 83,167,194,104, 52,250, 28,247,202,149, 43,163,125,251, -246,144,203,229, 80,171,213,197,186, 12,197,119, 90, 80, 80,128, 74,149, 42, 97,195,134, 13,168, 90,181,170, 87,206,234,213,171, -163, 77,155, 54,197,222,167, 74,165,114,212, 27, 0,112,251, 80,161,227, 25,177,177,177,165,226,220,122,248, 22,190,218,182, 3, - 70,147,128,124,157,165,216, 13,209, 97, 1,216,251,195, 91, 62,197, 93,228,252,242,203, 47,145,155,155,235, 40,131, 68,163,137, -104,164, 40, 87,174, 28,150, 44,113,111,201,116,210, 34,196,195,247,235,238, 99,131, 74,188, 78, 76, 92,138, 89,179,102,205,112, -189,223, 27,159,243,121,151,251, 77, 46,226, 44,205,167,174, 67,177,126, 16, 51, 67,108,108, 44, 68, 63, 16, 49,163, 56, 10, 82, -171, 21,235,215,175, 71, 68, 68,132, 99, 11, 12, 12,244,152,176, 69, 63,162,113, 25, 69, 46, 66,191,199,200,112, 3, 64,183, 12, -234,240, 35,177,217,108, 88,183,110, 29,156,133,140,191,191,127,137,221, 72,114,185,188,109,227,198,141, 57,163,209,120,151,200, -154, 53,107, 22, 6, 15, 30,140,170, 85,171, 66, 16, 4, 20, 22, 22,162, 93,187,118,210,133, 11, 23,182, 45,141,208, 82,171,139, -252,254, 77, 38, 19,118,238,220,137,224,224, 96,132,134,134, 34, 36, 36, 4,254,254,254,226,200, 73,234, 77,108, 80, 74,209,187, -119,111, 71,226,115,182, 98,185,138,174,253,251,247,251,212, 37, 71, 41,197, 19, 79, 60, 1,141, 70, 3, 63, 63, 63,248,249,249, - 97,203,150, 45,142,107,154, 52,105, 2, 65, 16, 16, 17, 17,129, 3, 7, 14,148,216,253, 73, 41,165, 50,153,204,113,189, 84, 42, - 37,203,151, 47,159,148,152,152, 24,253,250,235,175,115, 18,137, 4,199,143, 31,199,185,115,231, 80,161, 66, 5,159,125,182,114, -115,115,239, 76,154, 52,201, 54,105,210, 36, 0, 64,173, 90,181,144,155,155,155, 46,158,207,207,207,207,234,220,185,115, 49,191, -141,204,204,204,172,127,189,208, 18, 4, 88,205, 86,232, 12, 6, 20, 22,232, 28,214,161,244,148,180,160,183,222,120, 77, 58,103, -236,179, 0,128, 55,230,127,138,130,165,127, 23,100, 63,189, 49, 40,162,207, 39,171, 38, 2,232,229,165,242,129,209,104, 68,124, -124, 60, 14, 31, 62,140,130,130, 2,116,236,216,177,152,197, 84,124,167,222, 76,244,148, 82, 19, 33,164, 69,247,238,221,143,204, -155, 55,175, 98,141, 26, 53,136, 86,171,133, 78,167,131,243,239,233,211,167,233,202,149, 43,175,233,116,186,230,148, 82,147, 39, -190, 45,201, 95, 95,237, 18,251,220,218, 63,142, 75,186, 71, 84,186, 20,144,156, 83,209,154,149,172,208,230,235, 47, 26,108,244, - 28,168, 13,176, 65, 0,181, 10,176,217,187,189,254, 41,168, 84,170, 69,123,247,238, 13, 53, 24, 12, 56,118,236, 24,134, 14, 29, -106,202,204,204,148, 3,192,255,254,247, 63,211,138, 21, 43,228,149, 42, 85,194,242,229,203,195,159,126,250,233, 53, 0,106,251, - 88,208,127, 15,224,123,215,227,161,161,161, 11,111,221,186,213,214,217,231, 71,108,172, 2,112,219,168,164, 2, 96,177, 88,160, -215, 27,145,151, 87, 0,147,217, 98, 47, 51, 5,216,108, 86,251,175, 0,171,189, 28,149,203,120,255,134,117,162, 11, 41,165,224, - 8,201, 61,122,250, 78, 57, 79,229,146,167, 46, 46, 95,172, 89,110, 96, 19, 71,153,133,134,134, 66, 42,149,226,251,239,191,199, -169,125, 91, 32,151, 80,216,172, 22, 88, 45,102,216, 44, 38, 72, 37, 18,252,113,252, 58, 58, 85,247, 62,144,155, 16, 66,195,194, -194,208,173, 89, 51,116,111,214,172,104,120, 27,207,195, 79,161,128, 90,166, 44,178,100, 1,160, 54, 14,240, 45, 41, 9, 98, 56, - 35, 35, 35,113,244,232, 81,140, 27, 55, 14,179,103,207,134, 74,165,114,140,126,190,112,225, 2, 86,175, 94,141, 78,157, 58,149, - 58,238,162, 5,111,226,196,137, 72, 73, 73,193,252,249,243,209,176, 97, 67, 72,165, 82,228,230,230,162,121,243,230, 72, 75, 75, -243,137,211,185,123, 79, 46,151, 23,179, 62,137, 2,176,180,223,200,153,243,217,222,209,216,184,111, 37, 8, 8, 14,254,240, 90, -177,186,104,201,170, 61,165,230,156, 60,121,114,177,112,250, 98,205, 42, 69,195,104,147, 47, 98,203,233,186, 99,162,177,117,226, -196,137,111, 19, 66, 54, 77,156, 56,241,237,153, 51,103,158,245,133,207,195,249,205,162, 46,116, 58,118,204,103,161, 69, 41,165, -114,185, 28,130, 32, 20, 19, 87,174,142,183,162, 41,208,217,212,232, 77, 20, 8,130,224, 72, 20,174,205, 54,137, 68,130, 3, 7, - 14,224,192,129, 3,197,142,127,245,213, 87, 37, 86,228, 86,171,181,134,191,191,127, 49,107,150, 76, 38,195,196,137, 19, 49,116, -232, 80,135,200,146,201,100,248,238,187,239,208,168, 81, 35,152, 76,166, 26, 94,252, 85,116, 81, 81, 81,156, 88, 16,105, 52, 26, - 50,110,220, 56,137,213,106,117,188, 19,113, 19,125,215,188, 37, 26,113, 20,203,214,173, 91,125,178,104,249,234,163, 68, 41,197, -201,147, 39,139,137, 55,113,212, 12, 0,156, 60,121,210,225,191,229, 11,167, 68, 34,129,205,102,131, 74,165, 34, 50,153,140,200, -100,178, 56, 81,100, 73, 36, 18,199,247,118,246,217,243, 22,247,228,228,228,118, 37,157, 79, 79, 79,127,108,167,113, 48, 91, 44, -208,235, 76, 40, 40,212, 99,202,204,111,139, 14, 78,193, 33, 0,135, 90,188, 52, 14,163,187,116,106,239,226, 7,224, 75, 65,227, -168, 28,215,173, 91, 7,169, 84,138, 13, 27, 54, 32, 32, 32, 0, 61,123,246, 68, 64, 64, 0,222,122,235, 45, 12, 28, 56,208,103, -139,150, 61, 45,229, 17, 66, 90,188,250,234,171, 71, 62,254,248,227,242,229,202,149,131,201,100,130,217,108,134,201,100,194,213, -171, 87,177,114,229,202,219, 58,157,174, 5,165, 52,207, 27,223,150,228,175,175,174,223,253, 70, 74,199,129, 79,235, 47,164,253, -142,212,212, 44, 88,173,201, 16,108, 86,152,173, 69, 35,152,109, 86, 43,172, 86, 27,100, 50, 73,192,199, 31,190,182, 77, 0, 5, -199, 17, 83,191,126,253,158,122, 88,223, 40, 40, 40,168, 86, 70, 70, 6, 46, 95,190,140, 97,195,134,165,102,101,101,157, 7,208, - 1, 0,178,178,178,246, 14, 29, 58,180,198,178,101,203,162, 18, 18, 18,224,231,231, 23,224,195,247,241, 3, 48, 26, 64,103,187, - 31,136,136,108, 0,211,194,195,195, 21,199,142, 29,187,203,250,191,123,247,110, 0, 56,228,222,100, 96,183,104, 25, 12,200,200, -202,193,200,151,222,117,152, 18, 0, 90, 76, 92, 80, 80,140,122, 25, 74, 0,200, 76,187,138,103, 71,142, 83,120,107, 16,184,171, - 8, 75,225,163,227,108, 41,114,164, 81, 63, 63,191,162,238,183, 13, 43,177,249,147,151, 0,155, 25,212,162, 7,204, 58,192, 92, - 8,193,164, 3,145,169, 0,139,222, 39,161,229,231,231, 7, 63,149, 10, 17, 65, 65, 69,147, 64, 74, 36,144, 74,121, 8, 22,128, -216,136, 67,144, 10, 54,159,210, 58, 13, 11, 11,131, 32, 8, 80,169, 84,184,113,227, 6, 70,143, 30, 13,179,217,140,222,189,123, -195,100, 50,193, 96, 48, 64,175,215, 35, 49, 49, 17, 58,157,206,167,184,139,229,188,216,251,243,218,107,175,161, 81,163, 70,152, - 58,117, 42, 38, 76,152,128,196,196, 68,140, 26, 53, 10, 43, 87,174, 68,173, 90,181, 74,228,117,126,159, 34,167,248, 93, 92,187, -248, 0,148,250, 27,185,114, 22,141, 15,192, 93,223,253,149,103, 58,148,154,115,214,172, 89,200,200,200,184,203,146, 37,254,143, -141,141,197,226,197,139,239,181,235, 95,180, 30, 69,186, 51,136,185,177, 68, 53, 70,145,239,148,113,230,204,153,103,103,206,156, -217,157, 16,178,105,230,204,153,221, 75,176,104,117,243, 98,241,234,134, 34,159, 44,159,192,187,244,141,182,117,182,148,136, 21, -169, 88,161, 59, 23,242,106,181, 26,235,215,175,135, 56, 2,196,249,154,146,132,214,175,225,118,211,177,221,146,229,188,223,163, - 71, 15, 36, 36, 36, 20,179,102,169, 84,170, 18, 19,143, 32, 8,184,121,243, 38,206,158, 61,139,166, 77,155, 34, 47, 47, 15, 82, -142,195, 27,167, 79,163,230, 51,207,192,100,183,208,200,229,114,188,248,226,139, 62, 57,180, 95,191,126, 61,216,121, 63, 44, 44, - 44,169, 85,171, 86,177,135, 15, 31,118, 56,200,219,187,213, 28,130,195, 23, 17, 67, 41, 69,223,190,125,139, 89,177,156, 69,150, -243,246,251,239,191,251,212,117, 72, 41, 69,171, 86,173, 28,214, 44,127,127,127,252,252,243,207,142,111,213,186,117,235, 34,127, -134,200, 72,159, 56,197,120,216, 29,224, 97, 48, 24,132,130,130, 2,238,216,177, 99,144,203,229, 14, 11,158, 74,165,130, 82,169, -132, 66,161,184,167, 17, 68,255, 5, 80, 42,192,100,177, 64,175,215,163,176,176,104,102,145,171,103,214, 21, 23, 98,198,252,123, -230, 23,173, 86, 5, 5, 5,248,227,143, 63,240,211, 79, 63,161, 97,195,134,119, 57,195,251, 98,209,114, 74, 79, 25,132,144,150, -227,199,143, 63, 56,125,250,244,152,144,144, 16,152,205,102,220,186,117, 11,223,124,243, 77,138, 78,167,107, 73, 41,205,240,253, - 37, 0, 22,139, 21, 6,157, 17,121,249, 5,248,224,195,239, 60, 38, 61, 0,200, 78,191,136, 30, 61,251,203, 31,230,119, 74, 73, - 73,121,189,101,203,150, 31, 22, 20, 20,228,234,116,186,254, 0,230, 56, 27, 14,179,178,178, 90,245,236,217,115, 94, 72, 72, 72, -195,244,244,244,183,125,160,156,120,227,198,141,183,227,227,227,139, 29,180, 91, 31,171,166,167,167, 15,105,221,186,245,123, 0, - 66,156, 78,251, 3,216, 10, 96,177,167,180, 36,118, 29, 22, 22,234, 17, 16, 20,141,228,235,187,188, 6, 68, 38, 49,128, 10,130, -215, 6,160, 59, 43,150,115,249, 84,138,244, 67, 69,159, 64,177,194,126,170,239, 51,120,106,244, 44,168,165,192,140,103, 91, 32, - 49, 8,128, 42, 4,178,214,111,129, 4,217,223,209,232, 95,124,226,159,240,249,231, 56,126,185,104,102,152,184,240,112,140, 31, - 56, 16,212, 2,236, 63,119, 14,171,118,236,192,192,118,237,160, 86, 42,125,110,176,136,141,240,171, 87,175, 98,255,254,253,168, - 94,189, 58,174, 92,185, 82,108, 26, 10, 74,169, 79,241,167,148, 82,113, 16,147, 66,161,128, 84, 42, 69,106,106, 42,186,119,239, -238,104,232,239,218,181, 11,227,199,143,199,136, 17, 35,208,182,109, 91,183,126,179,174,156,225,225,225, 14, 3,130,235, 64, 5, -231,238,220,210,124, 35,119,156, 34,238,245,187, 59,115, 78,159, 62,221,237,128, 10, 95, 56,157,181, 72, 9, 56,230, 98, 77,130, -232, 47, 37, 10, 35,215,125, 0,193,226,177,137, 19, 39,190,237,235,125,206,251,162, 69,172, 52, 93,152, 14,161,213,173, 91, 55, -226,174,178, 21,205,200,238,160,209,104, 48,102,204, 24, 76,158, 60, 25, 97, 97, 97, 94,125,107, 68, 37, 91, 18,126,249,229,238, -204,182, 97,195, 6,111, 93,135, 23, 2, 3, 3, 27,181,107,215, 14,121,121,121,184,125,251, 54, 52, 26, 13,106,126,242, 9, 78, -143, 30,141,122,159,127, 14,174,125,123,199,100,171,167, 79,159,134, 74,165,186, 80, 90, 11,130,191,191, 63,130,131,131, 29,125, -238,162,224,114,178,104, 81, 31, 18, 35,126,253,245, 87,183,173,198,123,241,209, 18, 11,129,131, 7, 15, 22,243,207,114, 22, 62, - 7, 15, 30,116, 88,180,196,219,124,233,242, 82,169, 84, 84,228, 83,171,213, 8, 9, 9,129, 66,161,128, 74,165, 42, 38,178,124, -177,230,121,155,144, 84,165, 82, 29,214,104, 52, 65,226,121,169, 84,138,130,130,130,220,172,172,172, 38,255,234,174, 67, 80, 88, -205, 86,232,245, 6, 20, 22,232,203,156, 95, 28,152,178,126,253,122, 60,241,196, 19,119,137, 44,241, 93,223, 67,139, 49,137, 16, -210,118,193,130, 5,135,230,206,157, 27, 92, 88, 88,136,111,191,253, 54,175,176,176,176, 45,165, 52,169, 84, 92, 2,133,197,108, -134,206, 96,132,182,176,232, 29,252,117,118,221, 35, 38,136,233, 74, 0, 43, 93, 45,134, 78,231,255, 2,208,189, 20,148, 79,196, -199,199, 35, 53, 53,181,216,193,155, 55,111,194,102,179, 25,237,243,100, 61,231,244, 60, 9,165,212,230,173,236, 48,219,187, 14, - 11, 11,139,172, 32, 6,109,102,217,164, 83,187,216,240,228,147,117, 47, 93, 60,226, 72,103,137, 68,130,177, 99,199,226,244,169, - 83,232, 16,147,143,196, 40,127,208,252,100,200,218,191,143,147, 25, 42,204,153,247,107,169,185, 87, 59, 13,246,153,179,122,181, -219,115,127,245,234, 85,170,184, 95,186,116, 9, 42,149, 10, 54,155,237,174,250,166,180,241,119, 22, 48,243,230,205,195,248,241, -227,241,221,119,223,225,244,233,211,168, 87,175, 30, 58,118,236,136,244,244,116,156, 58,117, 10, 70,163,209,231,112, 58,251,205, - 93,186,118, 14,219,247,255,134,155, 73,215,145,146,122,251,158,191,187, 51,167,171,208, 90,191,253, 4,250,118,106,112, 79,156, - 31,124,240, 1,210,211,211,139, 89,178,156, 7,144,121,178,104,185,106, 17, 23,100,186,248, 66,137,251, 38, 23,209,227,186,239, -122, 61, 0,164, 3,144,120,185,207,117, 63,115,230,204,153, 59, 69, 75,152,157, 87,226,205, 63,203,109,215,161, 40,138,196,140, -226,106,169, 18,255,107, 52, 26,248,251,251,195,223,223, 31, 1, 1, 1, 94, 45, 69,162,208,106,117,173,160,152,175,151,104,217, - 2,128, 17, 35, 70,220,101,209,114,158,216,211, 29,140, 70,227,174, 93,187,118,213,239,209,163,135,228,194,133, 11,144, 72, 36, - 16, 4, 1,166,102,205, 80,239,243,207,113,230,181,215,208,230,198, 13, 24,204,102, 40,149, 74,108,217,178,197,172,211,233,118, -149,182,220,112, 22, 90, 26,141, 6,129,129,129, 14,161,225,139, 74, 23, 51,111, 73,254, 15,226,230, 60, 24,192,151, 76, 45, 86, -168,206,126, 57,132, 16,232,245,122,135, 83,167, 47, 86, 71,231,174, 67,231, 12,200,113, 28,130,130,130, 28,133,135,104,209,242, -213,154,231,109, 66, 82,181, 90, 29,112,241,226,197, 74,226,244, 19,153,153,153,104,223,190,253,229,127,189, 73, 75, 0,204, 86, - 27, 10,245, 6, 20,234,117,101, 70, 43,166,181,239,191,255, 30, 87,175, 94,133,217,108,198,204,153, 51,239, 18, 88,165,113,134, -119,147,174,174, 54,104,208, 64,120,242,201, 39,113,240,224, 65, 40, 20, 10, 11,165,180,212,243, 95, 9, 84,128,217,106,133, 65, -175, 71,161, 86,251, 95, 49,102, 58, 84,245,249,243,231, 97, 50,153, 48,117,234, 84,219,145, 35, 71,118, 2,120,201,254, 13, 57, - 0, 67,218,180,105, 51,173, 91,183,110, 65,132,144, 87, 40,165,223,149,148,207, 45, 86,187,104, 47,195,247, 40,166, 37, 79,101, -210,189, 76,179,226, 92,177, 10,130,128, 23,158,127, 30, 29, 99,242,209,167, 97, 56,180,119, 46, 67, 29, 24, 14, 18, 84, 1,115, -230,253,138,179,215,124,118,197,164, 0,240,100,155, 94,168, 91,253,238,233,193, 90,118, 40,106,147,237,253,227, 48,210, 50, 83, - 74, 29,119,173, 86,235,209,114,229,171, 69, 75,228, 20,167, 89,145, 74,165,168, 95,191, 62,170, 84,169,130,157, 59,119,162, 65, -131, 6,184,114,229, 10,174, 92,185,130, 27, 55,110,224,244,233,211,200,201,201, 41,245, 55,250,121,235, 42,228, 20,100, 67, 46, -147, 35, 59, 55, 19, 55,147,175, 35, 50, 52,234,190,191,187,136,106,221, 62, 0, 0,196,132, 7,150, 74,104, 57,115,126,244,209, - 71,119,137,247, 50,152,178,231,176,151,253,210,222,255,208,192,123,176, 18,233, 67, 66, 66, 84,206,253,171, 28,199, 33, 48, 48, -144,204,158, 61, 91,194,113, 28,252,253,253, 17, 24, 24, 8,209, 92,232, 13,114,185, 92, 95,161, 66, 5,149,152, 16,197,140, 24, - 16, 16, 32,153, 61,123, 54,249,234,171,175, 60, 90,185,188,248,104,205, 29, 58,116,232,115, 73, 73, 73,193, 17, 17, 17,184,115, -231, 14,228,114,121, 81,230,104,215, 14,173,174, 93,131,185,200,231, 8,151, 46, 93,194, 23, 95,124,161, 53, 26,141,115, 75,251, -162,252,252,252, 16, 26, 26,234,232, 50, 20, 45, 58, 78,162,209, 39, 23,204,146, 76,244, 98, 11,240, 94,186,144, 92,197,214, 75, - 47,189, 84, 76,116,249, 10,153, 76,102, 21,103,126,231, 56, 14,102,179, 25, 13, 26, 52, 64,122,122,186, 35,211, 56, 91,242,124, - 17, 90,222, 38, 36,229,121, 30, 38,147, 9,173, 91,183, 6, 33, 4,159,126,250,233,227,209, 29, 41, 8,196,207, 47, 20, 49, 49, - 85, 17, 30, 97,128, 32,148,221,170, 50, 86,171, 21,163, 70,141, 42,102,193, 18, 71, 54,138, 93,255,148, 82, 88, 44,150,123,158, -252, 85,204,215,247, 51,127, 28, 5, 28, 93, 94, 90,173,225, 95,247, 9, 35, 34, 34,154, 18, 66, 54,184, 28,206, 6, 48,205,221, - 12,238,118, 56, 62,244,237,219,183,209,165, 75, 23,252,246,219,111,146,159,126,250,169,195,198,141, 27,207, 85,170, 84,233,246, -128, 1, 3,202,189,248,226,139,138,214,173, 91, 35, 51, 51, 19, 13, 27, 54,156, 2,160, 4,161,101,127,143, 6, 35,180,218,178, -183,142,150,212,224,187, 31, 1, 55,121,242,123,232, 24,157,139,222,245, 2,177,108,211, 62, 12,169,175, 2, 76,138, 82,243,137, - 97, 9,137, 73, 64,133, 90, 77,239, 58,175, 8, 40,234,178,171, 80,171, 41,184,219, 87, 74, 29,119,231, 48,187,150,151,247, 98, -209,115,126,159, 35, 71,142,196, 91,111,189,133,206,157, 59,227,202,149, 43,216,189,123, 55,174, 92,185,130,113,227,198,161, 86, -173, 90,168, 87,175, 94,169, 56, 55,110, 95,139,252,194, 60,112,132, 67,118, 94, 22, 12, 70, 61, 38,140,154,124,223,223, 93,196, -245,237, 51, 1, 0,235,182, 29,191,103,206,119,222,121, 7,169,169,169,197, 44, 89,247,227,151,245,111,135, 91,161,149,149,149, -229,182, 31, 48, 60, 60, 60,173, 83,167, 78, 17,119,238,220,129,159,159,159, 87,145, 69, 8,233, 40,206,181,145,154,154,234,150, -211,223,223,223,220,169, 83, 39,105,116,116,116,177,209,134, 26,141,230,174, 76,230,202,105,175, 4, 10, 8, 33, 47,180,104,209, - 98,217,239,191,255,174,174, 82,165, 10,242,243,243, 65, 41,197,119,223,125,135,177, 99,199, 66,169, 84,226,210,165, 75,232,217, -179,167, 78,167,211,189,224, 60,135,150, 59, 78, 79, 45, 52,113, 86,124, 55, 34,171,196,184, 59,103,214, 5, 11, 22, 96,198,140, - 25,120,251,237,146, 93, 61,150, 46, 93, 10,184,116,243,185,227,164,148, 98,206,156, 57,101,198,153,149,149,245,157,139, 53,234, -211, 62,125,250,240,183,111,223, 46, 38,174,156, 55, 55, 5, 83, 49, 78,111, 19,146, 74, 36, 18, 68, 70, 70, 98,250,244,233, 8, - 13, 13, 69, 84, 84,212, 93,150, 24,111,223,232, 30, 43,131, 7,202,105,163,194,177,143,103,189,215,242,219, 21, 27,165, 10, 57, -112, 96,247, 58,228,231, 20,239, 78, 50,154,255, 30, 74, 45,111,208, 1,166,227,127,248, 20, 78,163,209,136,143, 62,250, 8, 31, -124,240, 1, 62,248,224, 3, 95,190,251,125,197,221, 23,177,229,150, 83,160, 68,173, 9,134, 82, 19,131,154,181,130, 33, 80,235, - 35,245,141, 60,224,200,225,195,135,123,134,134,134, 34, 41, 41, 41, 92, 42,149,246, 44,102,174,210,235, 81,161, 66,133,170, 0, -154,123,227, 28, 55,110,156,241,221,119,223, 85, 12, 26, 52, 8,125,250,244,193,160, 65,131, 20, 50,153,172, 50,165, 20,102,179, - 25, 73, 73, 73,248,227,143, 63,144,145,145,113,161,164,112, 10,148, 18,149, 58, 8, 74, 77, 52,106,214, 14,130, 32, 88,203, 36, -238, 98, 37,232,106,205, 42,229,132,212,110,203, 58, 0, 56,242,199, 6, 76,126,173, 54,190,219,124, 8, 11, 15, 3,117,131,210, - 81, 51, 60, 3, 66,198, 5,188, 57,164, 17,230,252,112, 20, 0,176,123,151,215,111, 84,226,252,200, 6,189,249,190,226,238,108, -185,114,126,142, 55, 31, 45,119,156, 98, 35,177,160,160, 0,185,185,185, 88,182,108, 25,158,125,246, 89,164,167,167,227,198,141, - 27,184,124,249, 50,126,252,241, 71,199,104,246,210,126,163, 55,158,127, 7,239,206,121, 29, 20, 20,213, 42,213,196,196,209, 31, -160,113,221,102,247,253,221, 93,225,205,154, 85, 18,231,252,249,243,239, 41, 45,253,167,132, 86, 73,173, 10,142,227, 16, 22, 22, -230, 72, 36,206, 9,240, 94, 90,190, 18,137, 4, 86,171,213,225,251, 35,110, 0,208,163, 71, 15,252,242,203, 47,190,140,164,248, -157, 16,242,191, 26, 53,106,124, 51,101,202, 20,191, 54,109,218,240, 49, 49, 49,104,220,184, 49, 46, 93,186,132,205,155, 55, 91, - 22, 47, 94,172,213,233,116, 35, 40,165,219,238,165,124, 18,151,180,113,222, 74,211,234, 49,155,205,183,175, 92,185, 18, 61,103, -206, 28, 9,199,113,152, 63,127,190, 35, 83,138, 19,190, 58, 99,247,238,221, 86, 65, 16, 74,236,170,177, 88, 44,183,175, 92,185, - 18,253,201, 39,159, 72, 8, 33, 14, 78,142,227,224,188,128,115,105, 56,221,137, 76,113, 96,132,187,205, 93,216,221,125,227,146, - 38, 36,229,121, 30,151, 46, 93,194,228,201,147, 65, 8,193,186,117,235, 30,139,204,117,250, 66,230, 87,245,106, 70, 4,247,120, -170,101, 29, 16, 2,179,233,238,217, 16,252,114, 10, 29, 34,171,207, 39,171,240,211, 27, 3,125, 17, 61, 87,247,238,221, 27,242, -209, 71, 31,241, 18,137, 4,243,230,205, 43, 54,105,176,235,119,223,179,103,143,245, 94,186,253,196,252,108, 54,155,161,215,223, -155, 21,133, 82,186,127,230,135,239,118, 90,254,253,175, 82, 66, 76, 56,176,107, 29,242,114,221,187, 51,200,165, 60,190, 90,182, -222, 42,147, 74,110,255,195,159,238,179,222,189,123, 15, 90,180,104, 81, 77,119, 39,111,223,190, 13, 65, 16, 74,114,174,185, 97, - 48, 24,144,156,156, 12,157, 78,183,118,210,164, 73,230, 95,127,253,245,185,167,159,126, 26,245,234,213, 67,116,116, 52,238,220, -185,131,171, 87,175, 98,217,178,101,116,223,190,125,107, 1,140,241,242, 30, 55,204,250,240,221, 97,203,126,248, 85,206, 17, 51, - 14,236, 94,135, 60, 23,209,126,183,117, 90,138,175,191, 91,111,150,201,164, 23,189,149,235,206,214,172,178,172, 24,123, 14, 29, -141, 62, 11, 22,162, 98,227, 46,152, 53,187, 35,190,254,176, 63,230, 62, 41,131,121,205, 16,212,237,183, 28, 43,167,118, 5, 0, -196,124,237,163,181,132,151,225,150, 27,139, 85,110,158,210, 46,110, 74,103, 53, 21,227, 94, 82, 25, 94, 90,139, 22,199,113, 72, - 72, 72, 64,197,138, 21,209,162, 69, 11, 52,104,208, 0,237,218,181,195,169, 83,167,112,234,212, 41,140, 27, 55,206,163,200,242, -229, 27,181,109,222, 9,135, 90, 93,188,239,111,227,250,221,203, 2,190,164,165,209,163, 71, 3,192,127,202,186,197,223,203, 75, - 20, 19,230,253, 46, 73, 35,114,154, 76, 38, 71,151,156,243,188, 76,162,115,188,143, 35,250,182, 17, 66,106,189,247,222,123,175, - 41,149,202,118, 58,157,174,170,221, 34,115,201,104, 52,238,208,235,245,243, 40,165,185,247, 19, 86,231,233, 28,220, 5,161,164, -123,115,114,114,186,116,233,210,101, 27,207,243, 9,174, 11,254,186,203,200,130, 32,220, 72, 75, 75, 43,113,136,123, 86, 86, 86, -151,206,157, 59,187,229,116, 87, 64,248,194,233,238,251, 8,130,224, 81,100,249, 82, 16,121,155,144,148,231,121,104, 52, 26,252, -252,243,207, 8, 11, 11,123,172, 50,216,201,115,233, 31,149,116,190,109,152, 98, 23,128,240, 62,159,172,186,181, 51,211, 20,223, - 54, 76,126,243,167, 55, 6,150, 47,233,158,204,204,204,206,207, 62,251,236,111, 60,207, 39,184,190,127,119,223,194,106,181, 94, - 79, 77, 77, 45,245,116, 9,148, 82, 92,188,120, 81, 24, 57,114,100,102, 70, 70, 70,255,123,137,255,196,201, 11,231,206,152, 50, - 54,244,201, 78, 77, 27,131, 3, 76,158,157,127, 41, 1, 40, 47,149,220, 30,255,246,252,231,255,201,111, 70, 41,205, 39,132,180, -232,219,183,239, 24, 20, 13, 13,191, 75, 72, 1, 88, 80, 2,197,130,114,229,202,213,150, 72, 36, 10, 0,147, 41,165, 55, 9, 33, -159,237,219,183,175, 51,128, 39, 36, 18, 73,180,205,102, 75, 70,209,154,143,171, 40,165, 39,189,167,163,180, 23,235,213, 8,143, -123,178,227, 19, 93, 64, 8, 53,153,140, 94, 26, 72,160,160,148,202,100,210,139,135, 79,166,212,245,102,173,183,175,192, 81,230, - 93,246, 99,198,140,193,152, 49, 99, 28,233,233,211, 79, 91, 97,237,153,189,232, 87, 55, 9,198, 47, 90,130, 4,148,247,185,193, - 7, 0,239,188, 55,178, 44, 45,155,197, 6,105,149,149,143,150, 68, 34, 65,102,102, 38, 46, 93,186,132,180,180, 52,232,116, 58, -156, 63,127, 30,102,179, 25, 57, 57, 57,168, 93,187,246, 61,135,179,172,190,209, 63,201,249, 95,236, 62, 44,149,208,178, 90,173, - 73,222, 86, 89,183, 88, 44,165, 26,149, 36,149, 74, 13, 85,170, 84, 33,238, 70, 39,136,255, 53, 26,141,222,199, 2, 50, 23,192, -100, 0,147,237,235, 89, 33, 59, 59,251,190,213,160,205,102, 75,137,143,143,151,120, 18, 48,246,119,147,230, 37,108, 90, 0,205, -202,184, 66, 40,115, 78, 55,223, 71, 91,189,122,117,135,175,151,235,156, 40,246,197, 86, 75,244,206,245, 54, 33,169, 86,171,189, -211,165, 75, 23,155,243,121,231, 9, 77, 31,107, 16,122,179,235,160,231,226,119,102,154,226, 1, 64, 20, 91,240,236,255, 3, 74, -169, 30, 64,155, 7, 29,180,107,215,174,153,158,120,226,137,239, 11, 10, 10, 70, 83, 74,239,217,155,255,237,247, 63,125,251,223, -246, 89, 40,165,249, 0,102,220,227,189, 55, 1,180,119, 57,118, 18,192,201,251, 9,211,201,243, 25,101, 62,183,152,213,106, 77, -170, 88,177, 98,169, 44, 55,222,202,120,139,197, 82, 98, 61,113, 22,129,120,251, 32, 80,180, 76, 92,150, 79,156, 6,131, 33,187, - 89,179,102,210, 82,198, 45,221,215,184, 71, 71, 71, 35, 38, 38,198,241, 43,194,245,184,183,112, 90,173,214,164,184,184, 56,132, -133,133,121,156,241,221,213, 39,203, 23,206,178,254, 70, 37,113,198,196, 44, 47,115,206,178,210, 11,255, 9,161, 37,174, 97, 88, -150, 72, 75, 75,123, 32,107,174,208,178, 48,183,253,109, 57,106,140,255, 40,178,178,178, 66,239,151,195,219,132,164,105,105,105, -237,254,171,239,119,103,134,105,248, 93,199,236,162,235,159,134, 86,171, 45,239,109,218, 1, 79,232,215,175,159, 13, 12,143, 60, - 50, 51, 51,203,188, 76,127, 16,245, 68,118,118,118,157,255,106,220, 31, 68, 56,255, 45,156,143, 11,152,151, 26, 3, 3,131,167, -198, 10, 19, 75, 12, 12, 12, 12,247, 9, 2,160,163,135, 66,214,231,145, 62,132,144,142,247, 80,136,111,103,156,140,147,113, 50, - 78,198,201, 56, 25,231,127,139,211, 27,119, 89,143, 52,126, 20, 90,173, 15,108, 3,208,145,113, 50, 78,198,201, 56, 25, 39,227, -100,156,140,243,191,186,177,174, 67, 6, 6, 6, 6, 6, 6, 6,134, 7, 4, 38,180, 24, 24, 24, 24, 24, 24, 24, 24,152,208, 98, - 96, 96, 96, 96, 96, 96, 96, 96, 66,139,129,129,129,129,129,129,129,129,129, 9, 45, 6, 6, 6, 6, 6, 6, 6,134, 7, 7, 82, -134,243,122, 50, 48, 48, 48, 48, 48, 48, 48, 48,184, 10,173,205,155, 55, 59,212, 86,183,110,221, 8,123, 45, 12, 12, 12, 12, 12, - 12, 12, 15, 19,143,171, 22,225,153,192, 98, 96, 96, 96, 96, 96, 96,120, 20,240, 56,106, 17,206,157,146,100, 96, 96, 96, 96, 96, - 96, 96,120,216,120, 28,181, 8,247, 56,171, 72, 6, 6, 6, 6, 6, 6,134,127, 15, 30, 71, 45,194,124,180, 24, 24, 24, 24, 24, - 24, 24,254,113,252,155,181, 8, 33,132, 2, 0,165,148,136,251,142,255,108,212, 33, 3, 3, 3, 3, 3, 3, 3,195,189, 9, 44, - 74, 41,241,244,203,132, 22, 3, 3, 3, 3, 3, 3, 3, 67, 25, 9, 46,241, 63,240,183,117,139,123,192, 15,238,200, 56, 25, 39, -227,100,156,140,147,113, 50, 78,198,249, 56, 67, 20, 85,226,127,231,125,158,189, 30, 6, 6, 6, 6, 6, 6, 6,134,251, 22,159, -212,157,240, 98, 66,139,129,129,129,129,129,129,129,225, 62, 69,150,179,184,114,222,103,107, 29, 50, 48, 48, 48, 48, 48, 48, 48, - 60, 32, 48,139, 22, 3, 3, 3, 3, 3, 3, 3,195,125, 64, 28,105,232,188,207,132, 22, 3, 3, 3, 3, 3, 3, 3, 67, 25,138, - 45,119,199, 9,128,142, 30,110,216,238, 43,249,189,140, 62,240,198,207, 56, 25, 39,227,100,156,140,147,113, 50,206,199,143,211, - 27,119,105,244,199,163, 2, 66, 72, 27, 0, 59, 1,180,181,255,254, 45,188, 40,165, 15,108, 3,208,145,113, 50, 78,198,201, 56, - 25, 39,227,100,156,140,243,113,222,138,228,212,223,191,206, 27,115,134,103,240,166,210,121, 66, 8,127,175,231, 31, 22, 39, 3, - 3, 3, 3, 3,195, 63, 92, 95, 82,241,215,217, 95,139,247,112,113,101, 0,111, 3, 8,116, 58,124,152, 82, 58,211,229,186, 31, - 0,168,157, 14,105, 1, 76,165,148, 94,241, 33, 76, 50, 59,191,194,190, 9, 0, 12, 0,140, 0, 10, 0, 88,216,103,251,199, 19, - 77, 51, 0,221,237,255, 55, 81, 74, 15,148,230,252,195,226,124, 88,136,137,137, 81, 5, 7, 7,119, 62,126,252,184,252,252,249, -243,216,179,103, 15,253,234,171,175,204, 57, 57, 57, 91, 83, 82, 82,244, 44,197, 60, 22,105,190, 11,128,137,246,221, 89,148,210, - 45,247,201, 71,212,106,245, 56,141, 70,211, 85,161, 80,196, 88,173, 86,162,211,233, 82,180, 90,237, 54,171,213,250, 9,165, 84, -184, 7,206, 94, 33, 33, 33,207, 85,171, 86,173,242,141, 27, 55,146, 83, 82, 82,126, 0,176, 6, 64,255,152,152,152, 33, 21, 42, - 84,136,189,120,241,226,149,236,236,236,175, 41,165, 27,254,169,112, 50, 48,252,151,224,201, 63,203,163,208, 2, 48,153, 82, 58, -196, 37, 35,222,117, 81,251,246,237,123,110,221,186, 85, 45, 8, 2,196, 77,165, 82, 89, 1, 12,247, 18,166,208,253,251,247,199, -143, 30, 61,186, 79, 74, 74, 74,163,130,130,130, 38, 0,160, 86,171, 15, 69, 68, 68, 28, 89,176, 96,193,143,157, 59,119, 78,178, - 11,174, 82, 89, 74,164, 82,233,179,193,193,193, 93,173, 86,107, 3, 74, 41,164, 82,233,241,156,156,156, 45, 22,139,229,107, 74, -105,169,197, 27, 33, 68,206,243,252, 24,133, 66,209,197,106,181,214, 1, 0,158,231, 79, 27,141,198, 45, 86,171,245, 51, 74,169, -233, 30, 56,149,114,185,124, 76, 64, 64, 64, 39,147,201, 84, 7, 0,228,114,249,233,252,252,252,109, 38,147,233, 51, 74,169,225, - 17,168,112,120, 0,221, 41,165, 82, 0,144, 72, 36,189,154, 53,107, 22, 79, 8, 17,196,249, 65, 56,142,171,111,179,217, 56,251, -245,221, 9, 33, 71, 40,165,214,210,112, 62,241,196, 19,229,120,158,167,246,153,116, 57,142,227,234,150,134,179,172, 16, 30, 30, - 62, 67, 16,132,152,146,174, 9, 12, 12,108,116,252,248,241,106,171, 87,175,182,125,241,197, 23,185, 35, 70,140,240, 27, 61,122, - 52,255,233,167,159,126, 6,224, 21,215,235,195,194,194,230,114, 28, 23,230,203,243, 5, 65,200,204,204,204,124,157, 21, 87,255, - 56, 38, 46,222, 94,208,154, 82, 96, 76, 39,127, 14,192,125, 9,173,216,216,216,101,195,134, 13, 27, 84,167, 78, 29,158, 82, 10, -139,197, 2,163,209, 88,237,192,129, 3,109,215,173, 91,215, 8, 64,255, 82,230,203,231,223,122,235,173,233,211,166, 77, 11,147, - 74,165,196, 98,177, 84, 90,189,122,117,131, 23, 95,124,241,213,165, 75,151,150, 27, 48, 96,128,191,120,124,242,228,201,141, 9, - 33,137,148,210, 79, 30,118, 56, 25, 24,254,131,141,180, 54, 40,238,163, 53,133, 82,250, 65, 73, 66, 75, 99,191, 49, 13,192, 97, -209,162,229,122,209,159,127,254,185,145,231,121,209,162,213, 68,171,213, 70,186, 88,193,220,161,194,208,161, 67,155,173, 93,187, -118,198,128, 1, 3, 82,213,106,117,149,167,159,126,186,128, 16, 34, 89,189,122,117,253,138, 21, 43,170,122,244,232, 49,180,125, -251,246,111,252,246,219,111,123, 0,100,248, 24,201,154, 33, 33, 33,235, 63,250,232,163,248, 46, 93,186,200,194,194,194, 64, 41, - 69, 74, 74, 74,236,230,205,155,159,156, 50,101,202, 27,132,144,222,148,210,115,165,120,113,141, 85, 42,213,218, 41, 83,166, 68, - 63,249,228,147,124, 84, 84, 20, 12, 6, 3,206,159, 63,223,113,203,150, 45,173,151, 46, 93,250, 10, 33,164, 31,165,244, 72, 41, - 56,155, 4, 6, 6,174,251,246,173,183, 34,155, 62,251, 44, 31, 18, 18, 2, 74, 41, 50, 50, 50, 58,238, 93,190,188,237,168,143, - 62,122,133, 16,210,151, 82,122,248, 81, 74, 68,114,185,156, 91,177, 98, 69, 61,185, 92, 14, 0, 48,153, 76,168, 85,171,214,125, -173,174, 46,149, 74,185, 79, 62,249,164, 1,207,243, 48,155,205, 66, 65, 65, 1,125,250,233,167,185,127, 40,147,196,165,164,164, - 4,202,100, 50,183,231,109, 54, 27, 90,183,110,157, 32,147,201,240,201, 39,159, 88, 50, 51, 51,235, 47, 90,180,232,248,202,149, - 43,195, 62,251,236,179,126,238,132, 22,199,113, 97, 73, 73, 73,110, 57,109, 54, 27,204,102, 51,172, 86, 43, 76, 38, 19,106,212, -168,193, 74,170, 71, 3,241, 0,240,235, 41, 3, 0,132,220, 47,153, 70,163,169, 62,120,240, 96, 62, 35, 35, 3, 82,169, 20,102, -179, 25,169,169,169,168, 85,171,150,228,251,239,191,175, 90, 90,190, 74,149, 42,141,152, 53,107, 86,248,175,191,254,106, 94,177, - 98,133,169, 83,167, 78,210, 17, 35, 70, 4,180,110,221,186, 70, 92, 92, 28,247,205, 55,223, 24,183,109,219,102, 25, 58,116,168, -124,230,204,153,225,155, 55,111,238, 1,224,147,135, 29, 78, 6,134,255, 32,118,186, 46, 42, 13,160, 68,161, 37,226, 48,165,180, - 23, 0,200,100,178,250,229,202,149, 91,102,181, 90,163,236, 86,157, 84,169, 84,250,137,217,108, 62, 97,175,168, 54, 8,130,208, -211,155, 37,107,232,208,161,205,126,251,237,183, 57, 7, 14, 28,200,203,202,202,138,218,184,113,163,225,141, 55,222,184, 1, 0, -215,174, 93, 75,236,209,163, 71,236,216,177, 99,147, 58,119,238,188,160, 93,187,118, 47,239,216,177, 99, 27,138,186, 36, 75, 20, - 89,181,106,213,218,191,123,247,110,255,160,160,160,226,170,174, 66, 5,188,252,242,203,178,158, 61,123, 86,236,208,161,195, 62, - 66, 72, 43, 74,233, 25, 95, 4, 81,229,202,149,183,255,249,231,159,126,193,193,193,200,205,205, 69,106,106, 42,116, 58, 29, 2, - 2, 2, 48, 96,192, 0, 89,155,150, 45,202,141, 29,247,202,118, 66, 72, 71, 95,196, 22, 33,164, 73,139,154, 53,183,175,156, 57, -211,207,114,235, 22, 84, 42, 21, 10, 11, 11, 1, 0,254,254,254,104,148,144,192, 31, 93,190, 60,118,200,132, 9, 34,231, 67, 23, - 91,132, 16,133,221, 12,106, 36,132,108,146, 72, 36,189,228,114, 57,215,171, 87, 47,108,223,190,157, 24, 12, 6, 30, 0,148, 74, -165,181, 87,175, 94, 80,169, 84, 48,153, 76, 2,128, 77,158, 44, 79,238, 56,165, 82, 41,215,174, 93, 59,221,225,195,135,179, 69, - 78,181, 90,109,105,215,174, 93,168, 92, 46, 87, 89,173, 86, 90, 18,231, 3, 18,147,184,122,245,106,177, 99, 5, 5, 5,200,200, -200, 64, 86, 86, 22,140, 70, 35,114,115,115, 33, 8, 2, 81,169, 84, 25,130, 32,128,227,138,140,111,158, 56,101, 50, 25, 46, 93, -186, 84,236,152,213,106,133, 86,171,133,209,104,132,217,108, 70, 65, 65,129,202,223,223,191,114,205,154, 53,147, 0,108,200,206, -206,254, 36, 53, 53,245, 38, 43,183,254, 17,220,218,116,194, 80, 30,128, 9,192,245, 50,224, 19, 0, 96,207,158, 61, 72, 75, 75, - 67,102,102, 38, 50, 50, 50, 16, 23, 23,135,123,233,142,187,122,245,234,226,218,181,107,147,179,103,207,110, 1,240,233,234,213, -171,135,103,103,103, 79, 28, 63,126,124,200,199, 31,127,156, 61, 97,194,132, 89, 0,190, 91,189,122,245, 75,213,171, 87,239,122, -225,194,133,165,255, 68, 56, 25, 24, 30, 0, 26, 3, 8,183,255,207,180,151,187,161, 78,251,167,236,249, 86,188,206, 4, 64,238, -230, 87,132,184,159, 1,224,136,211,125,226,254,189,212,159,212,249,215,209,232, 6,128,205,155, 55, 83,113,115,119,115,100,100, -228,184,246,237,219,207, 57,118,236, 88,141, 59,119,238, 4,223,185,115, 39,248,216,177, 99, 53,218,183,111, 63, 39, 50, 50,114, -156,120,157,221,227, 30, 78,251,206, 67, 52,101,251,247,239,143, 95,191,126,253,172,237,219,183,231,213,175, 95,223,244,231,159, -127, 90, 59,119,238,156, 14,192, 10,192,218,185,115,231,244, 29, 59,118,216,154, 54,109,170,250,237,183,223,110,239,219,183,111, -238,218,181,107, 35, 1, 72, 60,112,130, 16, 34, 13, 10, 10,250,121,215,174, 93,119,137, 44,103,148, 43, 87, 14,155, 54,109, 10, - 8, 10, 10,218, 64, 8,145,149, 16, 78, 16, 66,148, 74,165,114,221,142, 29, 59,252,252,253,253,145,158,158, 14,169, 84,138,136, -136, 8,228,229,229, 33,245,206, 29,220,188,124, 25,156,201,132,121, 31, 78,243, 87,169, 84,107, 9, 33,114,111,156,129,129,129, -235, 86,206,152,225,151,181,125, 59, 78, 78,159, 14,179,217,236,232,114, 53,155,205,216, 55,122, 52, 50,254,248, 3,223, 76,158, -236, 23, 24, 24,184,142, 16,162, 44,137,179, 44,224,204, 73, 8, 25, 13, 32, 27, 64, 54, 33,100, 52,165,244, 64,173, 90,181,142, -157, 63,127, 30,173, 90,181,194,154, 53,107,234,142, 31, 63,126,244,248,241,227, 71,175, 89,179,166,110,171, 86,173,112,254,252, -121,212,170, 85,235,152,179, 47,149, 47,156,187,118,237, 66,251,246,237,115,214,172, 89,147, 56,121,242,228, 25,147, 39, 79,158, -177,106,213,170,138,237,219,183,207,153, 63,127,190,177, 36,206, 7, 17,119,103, 75,147,243, 38, 8,127,215, 49, 49, 49, 49,233, -235,215,175,199,128, 1, 3, 56,185, 92,126,103,224,192,129,138,189,123,247, 82, 0,155, 74, 19, 78,131,193, 0,189, 94, 15,173, - 86,139,107,215,174,169, 62,250,232,163,150, 31,124,240, 65,165,237,219,183,199,190,253,246,219,163,194,195,195,143, 71, 69, 69, -197, 63,236,184, 51, 78, 0, 64, 42, 0,179,189,113,119,243,126, 56, 59,116,232, 80,187, 82,165, 74,145,171,207, 6, 35, 71, 86, - 13,130, 44, 8,130, 44, 8,182,208,198,184, 42,127, 10,229,203,151,143,244,247,247,111, 86, 26, 78, 74,233,138, 51,103,206, 60, - 65, 41,253,128, 82,154, 69, 41,157, 51, 97,194,132, 41,132,144, 61, 19, 38, 76,152, 70, 41,157, 99, 63, 62,253,252,249,243, 77, - 41,165, 43,255,137,112,178,180,196, 56,239, 5, 94,180, 72, 56, 33,100, 19, 33,100,211,164, 73,147,218, 1, 8,117,217,111,238, -124, 29, 0,185,187, 95,113,115, 58, 30, 14,160,155,211,125,225,247,248, 62,136,235, 86, 76,104, 1, 64,183,110,221, 72,183,110, -221,196, 19,135, 9, 33, 27, 1, 28,150,201,100,245,235,213,171,215,235,247,223,127,247, 15, 15,255,251,249,225,225,225, 88,187, -118,173,127,205,154, 53,123,201,100,178,250, 0, 14, 7, 4, 4,108,132,155, 46, 70, 59,130, 70,143, 30,221,231,153,103,158,201, -175, 95,191, 62, 0,228,158, 59,119, 78,221,180,105, 83,173,213,106, 37, 86,171,149, 52,109,218, 84,123,238,220, 57,181,197, 98, - 41,104,220,184,177,166, 67,135, 14, 55, 94,127,253,245,161, 0,148, 37,196,111,240,236,217,179,227,130,131,131, 75,122, 1, 40, - 40, 40, 64,100,100, 36, 70,143, 30, 29, 37,149, 74,159, 43,233,133,241, 60, 63,102,246,236,217, 17, 65, 65, 65,200,201,201, 65, - 92, 92, 28, 76, 38, 19, 46, 93,186, 4,131,182, 16,150,130,124, 88,242,115,145,241,215, 21, 4, 73,121, 12,237,217, 61,146,231, -249, 49, 94,172, 37, 99,190,158, 48, 33,210,116,227, 6,174,173, 89, 3,155,245,110, 67,141,213,108,198,233, 47,191,132, 33, 41, - 9,179, 70,142,140,148,203,229, 99, 30,178, 37,235, 99, 74,169,138, 82,170, 34,132, 44,104,222,188,249,247, 42,149,106,244,204, -153, 51,187,108,221,186,245,201,221,187,119,183,181, 90,173, 82,171,213, 42,221,179,103, 79, 43,131,193,192, 43, 20, 10,240, 60, - 79,125,229,108,214,172,217, 50,149, 74, 53,106,201,146, 37, 93,118,236,216, 49,244,232,209,163, 99,108, 54,155,220,102,179,201, -143, 30, 61,250,162, 94,175,151, 82, 74,109,158, 56, 31, 54,164, 82, 41,100, 50, 25, 84, 42, 21, 90,182,108,249,215, 87, 95,125, -101,137,139,139,147,174, 91,183, 46, 56, 38, 38, 70,243,233,167,159,230, 22, 20, 20,204,246,149,207,108, 54,195,104, 52, 66,175, -215,195, 96, 48,224,207, 63,255, 76, 24, 59,118, 44,111, 48, 24,108, 61,122,244,200,182, 88, 44,198, 9, 19, 38, 4,132,132,132, -188,193, 26,176,255, 8,172, 0, 10,237, 66,203,232,156,150, 9, 33,117, 68,235,172, 47,200,205,205, 93,250,245,215, 95,199,113, -138, 32,236, 53,117,197,143,194, 20,108, 13,252, 20,233,241,111, 34, 34,174, 18, 6, 13, 26, 20, 65, 41,253,180, 12, 42,188, 69, -148,210,214,148,210, 5,247,114,255,131, 14, 39, 33, 36,222,207,207,111, 77, 64, 64,192, 94, 63, 63,191, 53,132,144,248,251,141, -115,231,202,164, 99,175, 26,146,164,206,149, 8,237, 85, 67,146,212,185,114,233,231,122, 98,120, 52,225,162, 69,156,145, 65, 41, -237, 78, 41,237, 62,107,214,172, 25, 78,233, 95,220, 87,249,152, 95,186, 83, 74,187,187,164,209, 77,101, 80,135, 82,215,205,161, - 41,156,149,164, 24, 57,231,209,133,229,202,149, 91,182,108,217, 50,127, 87,210, 59,119,238, 32, 63, 63, 31,239,190,251,174,255, - 51,207, 60,243,202,237,219,183,135,121, 9,135, 60, 53, 53,181,193,144, 33, 67,148,102,179, 57, 71, 16, 4, 46, 63, 63,159, 15, - 12, 12,180,137, 23, 4, 6, 6,218,242,242,242,164, 90,173, 86, 98,179,217,140,207, 60,243,140,124,228,200,145,141,156, 45, 90, -119, 73,220,240,240, 78, 93,187,118,149,123, 58,111,177, 88,160,213,106,161,213,106, 97, 54,155,209,178,101, 75,197, 87, 95,125, -213, 25,192, 18, 79,247, 40, 20,138, 78,157, 58,117,146,102,103,103, 35, 48, 48, 16, 55,111,222,196,245,235,215, 97, 44, 44,132, -185, 48, 31,230,194, 2, 88, 11,242, 65,243,243,144,117,229, 34,154, 86,175, 38,251, 65,161,232, 2, 96,174, 39,206,128,128,128, - 78, 77,135, 15,231, 53, 26, 13,218, 14, 41, 26,103,240, 91,245,234,160, 54, 27, 4,155, 13, 54,171, 21, 93, 46, 93,130,197, 98, - 1,199,113,104,156,157,205, 7, 44, 95,222, 9,192,156,127, 34,177, 43, 20, 10,126,197,138, 21,131,229,114, 57, 40,165,196,100, - 50, 97,235,214,173,247,205,185,124,249,242,161, 34,167,217,108,166,181,107,215,190, 43, 67, 25,141, 70,250,168,100,122,185, 92, - 14,165, 82, 9,179,217,140, 10, 21, 42,232,135, 12, 25,178,255,195, 15, 63, 44,207,113,156, 70, 38,147,253,158,149,149, 53, 35, - 37, 37,229,154,175,124, 22,139, 5, 38,147, 9, 38,147, 9,122,189, 30,127,253,245, 87, 84, 66, 66, 2, 25, 61,122,180, 77,167, -211, 37, 46, 92,184,240,234,214,173, 91,213,179,103,207,126, 26,192,203,172,216,125,120,176, 91,165, 3,203,135,242, 90,169, 4, -133, 0,252,237,162,224,105, 66, 72,211, 26, 53,106, 4,159, 63,127, 62,135, 16,114, 16,192,143,148,210, 59, 37,241, 9,130, 64, - 4, 65,192,139, 77,114, 49,186,153, 4, 22, 75, 30,242,242,242,112,243,230, 77,156, 59,119, 14,135, 14,157,187,167,112, 42,149, -202,231,252,252,252, 58, 43,149,202, 10, 86,171,149, 43, 44, 44,188,169,211,233,182, 11,130,176,148,186,118, 43,248,128, 7, 21, - 78, 17, 26,141,230,163,183,223,126,187, 69, 96, 96, 32, 78,156, 56,145,184,106,213,170,143,112,159,206,245, 74, 41,247,205,220, -249,159,198,198, 70, 4,225,212,238, 95, 98,103,124,190,250, 27, 0,113, 44, 21,255,251,225,172, 69, 92,112, 4, 64, 55,251,104, -244,238,247,145,207,239,235,254,146, 44, 90,174, 11, 75,223, 37,180, 60, 68, 12, 86,171, 53,202,217,146, 69, 41,197,157, 59,119, -144,156,156,140,140,140, 12, 4, 7, 7,195,108, 54, 71,249, 82,207, 22, 20, 20, 52, 9, 13, 13,213, 73,165, 82,163, 94,175,135, - 90,173, 22,164, 82, 41,181, 63,135,216, 71, 45,218,140, 70, 35,225,121,222,226,239,239,239,103, 52, 26,171,161, 4, 95, 50, 74, -105,147,208,208, 80,183,231,140, 70, 35, 10, 11, 11,161,213,106, 81, 88, 88, 8,163,209,136,200,200, 72, 88,173,214, 6, 37, 54, -105,173,214, 58,225,225,225, 72, 73, 73,129, 74,165, 66, 82, 82, 18, 76,133, 5, 48, 23, 20,192,170,205,135, 45, 47, 15, 66,126, - 62, 4,109, 62, 44, 38, 29, 98,171, 84,135, 56, 34,209, 19, 76, 38, 83,157,208,208, 80,104,181,127,187,155, 81,187,192,178, 90, -173,176,218,157,163,197,238,196,176,176, 48,136, 35, 18, 31, 6,236,254, 83,227, 57,142, 91,160, 80, 40,248, 81,163, 70,225,206, -157, 59,197,210,196,168, 81,163, 28, 62, 89,173, 91,183,222,163, 84, 42,173, 25, 25, 25, 48, 26,141, 82, 95, 56, 43, 84,168,112, -243,221,119,223, 61,108, 50,153,226, 98, 98, 98,130,140, 70,163,190,106,213,170, 49, 42,149, 42,210,100, 50,217, 26, 53,106,180, - 84,165, 82, 89, 10, 11, 11,169,213,106, 37,143, 66,166, 39,132,128, 16, 82,244,141,172, 86,132,133,133,105, 51, 51, 51, 15,229, -228,228, 12,190, 23, 62,139,197, 34,142,232,130, 94,175, 7,165, 20, 39, 78,156,128, 82,169,148,218,108,182,179, 86,171, 85, 45, -149, 74,193,217,157,191, 24, 30,218,119,110, 91, 45, 72, 62,119,102,211,136,160,122, 61, 52, 90,181, 92,162, 21,110,214,171,240, -237,199,231, 86, 61, 51,244, 57,255,169, 83,167,198,135,133,133, 41,175, 94,189,106,152, 54,109, 90,194,138, 21, 43,136,183, 70, -208,173, 91,183,126,122,251,237,183, 67,186,118,237,154,168, 80, 40, 72, 94, 94, 30, 50, 50, 50,144,150,150,134,235,215,175,211, - 83,167, 78,253,101, 52, 26,215,148, 38,156, 49, 49, 49, 95,141, 29, 59,246,153,134, 13, 27, 74, 69, 11,169, 86,171,173,191,107, -215,174,158,191,253,246, 91, 43, 0,165, 78,151,183,111,223, 94,243,206, 59,239,104,158,122,234,169,106, 10,133,130, 43,139,112, - 58,131,227,184, 72, 63, 63, 63,108,223,190, 29, 65, 65, 65,224, 56, 46,242,126,191,151,193, 44,196,198, 68,133,194,176,111, 46, -170,133,199,195, 96, 22, 98, 89, 42,126,124, 44, 90, 30, 78, 53, 22, 45, 82, 94,196,146,126,226,196,137,111, 19, 66, 54, 77,156, - 56,241,109,119, 22, 45,251, 95,155,243,117, 78,215, 27,203, 90,108,149,106, 82, 72, 65, 16,144,156,156,140,148,148, 20, 36, 39, - 39, 35, 43, 43, 11, 28,199,149, 56,127,132,115, 24, 8, 33,194,182,109,219,130,247,239,223,175,109,220,184,113,174,232,255, 98, -181, 90,137,197, 98, 33,118,191, 24,114,243,230, 77,217,222,189,123,131, 46, 92,184, 16,137, 34,135, 53,193, 75,228,238, 58, 38, - 10, 44,231,205, 96, 48, 64,169, 84,250, 20, 87,177, 34, 60,113,236, 88,145,200, 42, 44,176,119, 25,230,193,150,159, 7,170, 45, -128,220,102,129, 28, 20,196,160,243,249,253, 57, 67, 20, 89,102,187,208, 50,153, 76,176, 88, 44, 16, 4, 1, 86,171,245,161, 39, -112, 74,233,226,250,245,235, 55,248,233,167,159, 70, 36, 39, 39,223,117,190,119,239,222,120,249,229,151, 49,118,236,216, 11,221, -186,117, 59,245,203, 47,191, 96,204,152, 49, 16, 4,161, 30, 33, 36,143, 82,250, 91, 73,156, 19, 39, 78, 60,122,251,246,237,157, -151, 47, 95, 30, 21, 17, 17,161,168, 83,167,206,149, 58,117,234, 72,126,250,233,167,200,231,159,127,254,216,147, 79, 62,121,227, -143, 63,254, 8,217,190,125,187, 82, 16,132,134,132,144,228,127,122, 30, 45,163,209,232,176, 64, 25, 12, 6,152,205,102,160, 4, -231,119,111,105, 83,252,182, 86,171, 85,228, 38, 63,253,180, 30,123,246,236,225,206,157, 59, 27, 55,106,212,104,209,225,158,149, -184, 15, 71, 96, 61, 37,231,200, 23,227,235,133, 42,223,168, 27,170,149,243,164,240,210, 23,111, 23, 94, 47, 31,160,141, 44,167, - 54,197, 37, 4,197,204,152,241, 97,244,133, 11, 23,141,239,190,251,238,249,129, 3, 7, 70,188,241,198, 27, 53,214,173, 91,215, -138, 16,242, 53,165, 52,215, 3,175,114,248,240,225, 7, 35, 34, 34, 18, 62,255,252,243,244,219,183,111, 7, 91, 44, 22,141,217, -108, 22,180, 90,237,117,189, 94,191,221,108, 54,111,167,148, 30, 43, 77,120,253,253,253,235, 14, 31, 62, 92,154,155,155, 11,251, -104, 93,164,167,167,163, 69,139, 22,146,141, 27, 55,214,188,151,119,144,157,157, 61,151, 16,178,115,229,202,149,157, 3, 2, 2, - 26, 42, 20,138, 40, 0,182,130,130,130, 52,173, 86,123,242, 94,194, 89,172,156,179,217,210,142, 29, 59, 86, 49, 32, 32, 0,183, -110,221,130,205,102, 75,187,223,239,166,148,113,183, 79,239,222, 88,174,122, 88, 2,246,238, 63, 8,165,140,187,205, 82,243, 99, - 15,209,135, 10,206, 2,202,141, 64,218, 63,115,230, 76,213,172, 89,179, 48,115,230,204,179,238, 44, 90,162,224,154, 57,115,230, - 89,241, 58,167,235,119,223, 71,121,226,217,162, 85,130,130, 4,207,243,169, 25, 25, 25,193, 65, 65, 65, 14,129,149,146,146,130, -148,148, 20,200,229,114,220,188,121, 19,114,185,252,142, 47,141, 16,149, 74,117,180,126,253,250, 85,175, 93,187, 38,155, 54,109, - 90,185, 99,199,142, 5,180,104,209,162,182, 74,165,178, 81, 74, 97, 48, 24,184,243,231,207,251,205,153, 51, 39,182, 73,147, 38, -166, 38, 77,154, 28, 95,189,122,181, 30, 37, 76, 94, 74, 8, 57,124,231,206,157,196, 10, 21, 42,136,162,173,152,184,114, 22, 92, - 64, 81,151, 39,207,243,199, 75, 10, 40,207,243,167, 47, 93,186,212, 81,173, 84,192, 84,144, 15,115, 97, 62,172, 5, 5,176, 21, -228,193,150,151, 7,104,243, 33,183, 90, 33,181, 89,160, 82, 42,145,156,148, 4,158,231, 79,151,196, 41,151,203, 79,167,165,165, -117, 12, 10, 10,114, 84,162, 22,171,181,104,179,217, 96,178, 90, 29, 22, 45,169, 84,138,219,183,111, 67, 46,151,159,126,216, 41, -153,227, 56,155, 56,133,131,135,120, 32, 50, 50, 82,104,218,180, 41,198,140, 25, 3,155,205,102,255, 12,164, 45, 33,100, 47,165, -180,208, 19,167, 32, 8,220,249,243,231,251, 92,189,122, 85, 34,149, 74,185, 39,158,120,162, 86,203,150, 45, 77,114,185, 28, 50, -153,140, 47, 44, 44,244,223,190,125,187,210, 98,177, 16, 59,231, 67,155, 71, 75, 76, 59,119, 53,141,236, 78,235,122,189, 30,133, -133,133,200,201,201,225, 85, 42, 85,213,218,181,107, 31, 52,153, 76,107,172, 86,235, 55,215,174, 93,203,247,196,105, 23,102, 14, -209, 37, 8, 2, 40,165,176,217,108,176, 88, 44,144,201,100,194,174, 93,187, 49,103,222, 71, 88,246,205, 10,218,179,103, 79,178, -113,227, 70, 8,130,144,196,202,213,135,130, 79,114,127,252, 80, 9,171, 77,107,220,181,178,240,251,203,249,218,169,223,207, 63, -106,146, 75,242, 27,181,137,172,147,152, 80, 85, 18, 20, 20,204, 45, 89,186, 32,235,135, 21,107,175,222,186,117, 43,255,179,207, - 62,107, 86,181,106,213,192,147, 39, 79,198, 2,112, 43,180,212,106,117,229,231,158,123,110,120, 78, 78,142,108,217,178,101,171, -239,220,185,115, 20,192, 57, 74,169,214,169,236,234, 70, 8,249, 14, 69, 35,159, 34,237,229,220, 94, 74,233,180,146,218,107,132, - 16,236,216,177,227,174,209,129,194,253,169,243,160, 74,149, 42, 13,184,118,237,218,158,212,212,212,190,110,242,253,212, 42, 85, -170,116, 57,123,246,236, 20, 74,233,175,165, 33,214,233,116, 19,214,174, 93,251,177, 68, 34,137,177,217,108, 41,122,189,126,194, -125, 91,180, 44,194,200,153, 75, 86,125,169, 55,217,202,171,228,146, 91, 6,139,240, 60, 75,202,143,181, 53, 11,176,251,104,137, -255, 1, 16,151,253,147,246,255, 38,167,107, 51,156,172, 88, 38, 23, 43,152,187,115, 25,184,199,201,210,221,141, 56, 20, 69,151, -167,153,225, 39, 1,104, 2,224,176, 84, 42, 93,240,204, 51,207,204,249,225,135, 31,252,243,243,243,145,150,150,134,244,244,116, -240, 60,143,128,128, 0, 44, 94,188, 88,159,150,150,182,192,249, 30,215, 25,228,197,188, 17, 22, 22,118,116,197,138, 21, 81, 95, -124,241, 5, 63,108,216,176,155,221,186,117,171,182,120,241,226,107, 50,153,140,218,108, 54, 98, 52, 26,201,139, 47,190, 88,113, -222,188,121, 55, 36, 18,137,122,192,128, 1, 68,163,209, 28, 70,145,131,170,251, 55,159,145,177,237,231,159,127,238,243,250,235, -175, 43, 76, 38,147, 91, 75,150,120, 44, 40, 40, 8,251,246,237, 51,229,228,228,108,245, 98,197,216,246,251,175,155, 91,255,111, -224, 64,153,165, 32, 31,150,130,124, 88,243,243, 97, 43,200, 5, 41,204,135,212,102,133, 74, 38, 32, 42, 78, 9,171,222, 15,155, -143,156,180, 24,141,198, 18, 39, 54,204,207,207,223,182,119,217,178,182, 77,226,227,249,125,227,198,193,108,177,224,169, 75,151, - 28,226,202,108, 54, 99, 67,157, 58,176, 17,130,122, 47,188,128, 43, 86,171, 53, 63, 63,127,219,163,152, 25, 78,157, 58,149, 62, -100,200,144, 99,130, 32, 52, 40,141,117, 71,132,159,159, 95, 65, 97, 97, 33, 50, 51, 51,109, 89, 89, 89, 6, 0, 72, 79, 79,207, -217,184,113,227,121, 65, 16,154,220, 11,103, 89,192, 98,177,220,101,141,178,217,108, 69, 86,199, 34,203,129,124,243,230,205,173, -207,159, 63, 47, 59,115,230, 12,246,236,217, 83,239,135, 31,126,152, 20, 31, 31, 95,231,230,205,155,169,222,196,155,187, 73,127, - 97,247, 63, 92,189,114, 13, 94,122,233, 37,146,154,154,138, 31,127,252, 17,222, 38, 79,101, 40, 51,104, 97,181,169, 76,187, 86, - 22,118,251,245, 86,193,129, 59,250,105, 0,182, 80,189,149,150, 43, 87,238, 84,195,134,193, 97, 0, 96, 52,216,162, 42, 87,174, -220,134,231,121,185, 61, 13, 55, 12, 13, 13, 93, 12,160,165,155,242, 83, 50,112,224,192,166, 17, 17, 17,245,127,251,237,183,147, -119,238,220, 57, 75, 41, 61,228,122, 93,197,138, 21,223,189,112,225, 66, 99,169, 84, 74,188,164, 17, 0, 64,219,182,109,171,198, -199,199,135,254,122, 57, 16,249,178, 74,160,146, 60,128, 87,194, 22, 84, 23, 55,101, 53, 16, 23,119, 48, 52, 40, 40,168, 94,110, -110,238,201, 82, 86, 16,237,250,244,233,243,205,178,101,203,226,218,180,105, 67, 9, 33,156,235,148, 14, 21, 43, 86,236,124,224, -192,129, 6,207, 63,255,252,231,246,209,195, 62, 59, 15, 83, 74,111, 2,232, 87,150, 31,109,235, 21,186, 29,246, 57,207, 24,254, - 51, 56,242,128,174, 45, 19,220,203,204,240, 77, 4, 65,232,201,113, 28,204,102,243,204,200,200,200, 13, 3, 6, 12,232, 61,105, -210, 36,191,208,208, 80,135, 37,107,241,226,197,250,235,215,175,175, 51,155,205, 39, 8, 33,147, 83, 82, 82,122,198,196,120,172, - 31, 10, 22, 46, 92,184,170, 71,143, 30,195, 94,120,225, 5,125,157, 58,117, 2,170, 85,171,166,219,191,127,191, 95,167, 78,157, -242, 37, 18, 9,221,183,111,159,127,197,138, 21, 13,132, 16,197, 31,127,252,145,117,240,224,193,138, 51,103,206,252, 26, 69,195, -173, 61, 97,229,244,233,211,223,237,217,179,103,197,208,208, 80,228,231,231, 23, 19, 91,226,127,165, 82,137,212,212, 84,172, 95, -191,254,142,197, 98,249,218,139,101,227,179, 79, 23, 47,121,165, 93,211, 39, 98, 3,212, 42,164, 38,221,132, 45, 47, 7,208, 22, - 66,110,181, 64, 37,167,136,173,164, 6, 47,209,224,106,106, 33,150,237, 63,146,106,181, 90, 63, 43,137,211,100, 50,125,246,242, -188,121,175, 28, 88,178, 36, 54,190,127,127,156, 91,190,220,209, 85, 40, 10, 45, 27, 33, 40,223,161, 3,184,192, 64,204,248,252, -243, 52,147,201,244,217,195, 78, 44,130, 32, 72, 76, 38, 83, 73,241,128, 32, 8, 73,231,206,157, 91, 69, 8, 41, 32,132,180,181, -159,218,233,206,154,229,204,201,113,156, 80,163, 70,141,159, 34, 35, 35,251, 0,208,214,168, 81,227, 39,133, 66,209,222,100, 50, - 61, 33, 8, 66,210,137, 19, 39,214, 19, 66, 82, 9, 33, 98,171,227,161,206,163,101,177, 88, 48,121,242,100,204,154, 53, 11, 19, - 39, 78,116,196, 87,236, 62,204,205,205, 77,216,187,119,175,108,215,174, 93,244,243,207, 63,207, 26, 54,108, 88,208, 11, 47,188, - 16,244,197, 23, 95,188, 6, 96,130, 39,206, 9, 19, 38,224,243,207, 63,199, 75, 47,189,116,183,202,146, 72,132,164,164,219, 48, - 24, 12,116,225,194,133, 41, 82,169, 52,248,235,175,191, 86, 61,255,252,243,132,149,171, 15, 5,239,168,134,188,247,170,189,140, - 89, 64, 41,221, 41,158, 8, 8, 8, 80,253,244,211,207, 60, 0,172, 91,187, 94, 74, 41, 13, 20, 39,152,253,254,251,239,149, 45, - 90,180,136,240, 80,224,218,148, 74,165,113,246,236,217,161, 35, 71,142,124,242,207, 63,255, 12, 38,132, 52, 5,112, 20, 64,154, - 93, 92, 71, 0, 56, 23, 22, 22, 22,176,122,245,234,216,206,157, 59,107,188, 5,180,160,160,224,235, 85,171, 86, 85,152,183, 55, - 16,191,106,251,224,182,208, 31, 52,136, 34, 36,162, 0, 53,252,110, 97,240,224,193, 49, 11, 22, 44,248, 18, 64,195, 82,136,172, -193,189,123,247,158,181,108,217,178,152,145, 35, 71,166, 30, 63,126, 60, 13,192, 50, 55,130, 47,243,153,103,158,185,179,124,249, -242,104, 74,233, 18, 66,136,156, 82,186,142, 37, 31, 6, 6, 71, 94,106,131,162, 25,225,239, 18, 95,196,157,127, 19, 33,100,131, -213,106,237,201,243,252, 70,231, 9, 75, 35, 35, 35, 95, 49,153, 76,209,132, 16, 42,147,201, 82,211,210,210, 22, 56, 79, 88,154, -148,148,212, 51, 46, 46,206,113,143,125,210, 77,231,185, 54, 2,158,122,234,169,142, 7, 14, 28, 88,180,105,211,166,244,130,130, - 2,191,181,107,215,170,102,205,154,117, 83, 16, 4,250,214, 91,111,197,119,233,210, 69,103,179,217,238,188,240,194, 11, 21, 19, - 18, 18, 94,184,112,225,194,118,103,161,229,134, 19,132,144,154,149, 42, 85,218,183,110,221,186,128,160,160, 32,164,167,167, 35, - 59, 59, 27, 90,173, 22, 54,155, 13, 82,169, 20, 25, 25, 25,152, 54,109, 90,126, 74, 74,202, 93, 19,150,122,224,108, 82, 33, 54, -118,219,130, 41,147,253,131,120, 14, 89, 23,207,195,154,147, 5,169,213,130,114, 53, 3, 33,147,171,112,229, 82, 1, 94, 91,185, -190,224, 86,118,238, 93, 19,150,122,226,108, 84,185,242,246,207,199,143,247, 51,220,190,141,232,103,159,133, 78,167,131,217,108, - 6,199,113,248,107,193, 2,200,194,195,241,238,234,213,218,179,183,110,117,112,157,176,212, 29,103, 25, 36, 14, 7, 39, 33,100, - 52, 33,196,225, 12,223,187,119,239, 98,215,254,252,243,207, 88,178,100, 9,140, 70,163,149, 82,250, 10,165,116, 49, 33,196,207, -158,160, 10,189,113, 86,168, 80,225, 86,173, 90,181,142,216,108, 54,222, 46, 50,232,185,115,231, 26, 94,191,126,189,156, 11, 39, -111,231,180, 62,172,184,135,134,134, 46,248,237,183,223, 42, 68, 68, 68, 16,231, 25,219,237, 66, 17, 0, 48,102,204,152, 14, 7, - 15, 30, 84,212,175, 95,223,152,153,153,217, 56, 60, 60,252,207, 21, 43, 86,132, 13, 24, 48, 32,229,236,217,179,177,174,156, 97, - 97, 97,115,214,173, 91, 87,169, 82,165, 74,156,104, 21,115,237,158, 28, 49, 98, 68,199, 21, 43, 86,200,251,244,233, 99,212,106, -181,145,254,254,254, 87,215,173, 91, 23,214,171, 87,175,212,179,103,207, 70, 63,140,184, 51, 78,247,168, 85,171,214,149,179,103, -207, 86, 18,247,245,122, 61, 50, 50, 50,144,153,153,137,160,160, 32,116,234,212,233,175,235,215,175, 87,114,199, 73, 8,169,223, -175, 95,191, 41, 95,126,249,101, 71,141, 70, 35,219,189,123,183,118,251,246,237,134,155, 55,111, 90, 45, 22, 11,141,142,142,230, - 91,182,108,169,236,218,181,171, 70,161, 80,112,239,189,247, 94,230,135, 31,126, 24, 70, 8, 89, 41, 46,127,230,202,217,160, 65, -131, 67,191,255,254,123, 19, 66, 8, 36, 18, 9, 76, 38, 51,114,115,115,145,156,156,132,115,231,206,225,192,129, 3,216,186,117, -235,201,194,194,194,250, 62,230,247, 80, 0,187,141, 70, 99, 53,185, 92,238,179,176,183,217,108,224,121,254, 34,128,206,148,210, - 36,150,150, 24, 39,195,223,254, 89,165,114,134,183, 11,176, 38,132,144, 13,246, 67,135, 93,167,112, 32,132, 76, 34,132, 76,118, -178,130,121, 11, 75,254,111,191,253,182,167, 99,199,142, 99, 58,116,232, 48,175,115,231,206,119,238,220,185,147, 56,119,238,220, - 56,171,213,106, 62,119,238, 28,119,245,234,213,155, 71,143, 30,173, 84,165, 74,149, 23, 46, 92,184,176,203,139, 53, 75, 12,235, - 57, 66, 72,139,118,237,218,173,127,225,133, 23,202, 55,109,218, 84, 30, 20, 20, 4,158,231,113,237,218, 53,156, 60,121,210,180, -122,245,234,164,220,220, 92,159,151,224,161,148, 30, 38,132,116, 26, 48,246,149,117, 47,244,238, 17,246, 68,181,170,242,232,232, -104, 64,175,199,197, 91,169, 56,120,241,164,249,171, 61, 7, 51,140, 70, 99, 95, 95,151,224,177,115,118,108, 63,126,252,186,169, -255,251, 95, 36,238,220,225,163,163,163, 33,151,203,113,253,250,117, 92, 21, 4,235,236,165, 75,211,242,243,243, 31,250, 18, 60, -226,156, 87,130, 32,240, 0,160, 82,169,240,242,203, 47,195,121,201,157, 37, 75,150, 64,175,215, 3, 0, 79, 8,249,152, 16,242, -141, 39, 43,150, 7,206,242,191,254,250,107,121,103,206,234,213,171,187,227, 52, 62,236, 76,146,157,157,253,238, 83, 79, 61, 53, -147,231,121,143,179,222, 6, 7, 7,163,160,160, 0, 86,171,213,150,156,156,124, 49, 56, 56, 24, 82,169, 20,148, 82,183,249, 40, - 43, 43,235,221,190,125,251, 78,231, 56, 46,194, 19,103, 64, 64,192,205, 63,255,252,179,242,243,207, 63,207,125,251,237,183,215, - 70,142, 28,169,248,243,207, 63,109,148,210,245,172,232,122,180,224,220, 40,181, 55,226,104, 9,215,158, 32,132,204, 59,122,244, -104,248,152, 49, 99, 18,255,247,191,255, 5,180,107,215,206,207,249, 26,189, 94, 47,252,242,203, 47,218, 37, 75,150,228,237,217, -179,231,198,136, 17, 35,154,162,200,191,196, 45,110,221,186,181,121,198,140, 25,129, 93,187,118,173, 2,192,225,159,149,145,145, -129,155, 55,111,226,204,153, 51, 55,205,102,243,198, 82,196, 39,139, 16, 50,117,208,160, 65, 31, 47, 95,190, 60,102,228,200,145, -169,171, 87,175, 62,131,162, 9,134, 93, 17,212,187,119,239, 58,203,151, 47,143, 30, 57,114,100, 42,128,105,148, 82,230, 71,200, -192,240, 55,218,186,250,105,149,232,163, 5, 32, 79, 16, 4, 24, 12,134, 72, 65, 16,122, 10,130, 0, 63, 63, 63,119,215, 53, 73, - 73, 73,233,233,188,168, 52,188, 44,151, 3, 32, 99,251,246,237,219, 86,174, 92,217,225,173,183,222,250, 95,110,110,110,147, 83, -167, 78, 53, 5, 0,169, 84,122, 64,163,209, 28,154, 57,115,230,179, 19, 38, 76,200,240, 69,100,185,136,173, 26,115,230,204, 41, -179, 69,165,237,194,168,242,103,107,214,143,249, 90,161,232,228,178,168,244, 54,251,162,210,134,123,225, 28,255,229,151, 99, 2, -214,172,121,100, 23,149, 54, 26,141,214, 62,125,250,124,205,113,156, 96,111,197,242, 70,163,241, 89,148,114,164,170, 43,103,239, -222,189,191,149, 72, 36, 86,187,165,136, 51, 26,141,207,221, 15,103, 25, 86,162,133, 0,198,150,116, 77,237,218,181, 87,108,220, -184,113, 72,207,158, 61,109,102,179, 57,189, 71,143, 30,252,161, 67,135, 40,199,113,219, 61,112, 26, 1,188, 89, 18,103, 84, 84, - 84,252,167,159,126,122,124,220,184,113, 1, 43, 87,174, 12,217,187,119,175,109,225,194,133,249,217,217,217,159,176,114,235,209, -130, 84, 42,133, 90,173,134,201,100, 66, 70, 70, 6,188, 77, 89, 69, 41,221, 65, 8,233, 58,126,252,248,167,199,143, 31,223, 53, - 42, 42,170, 98,133, 10, 21,212, 28,199, 33, 57, 57,217,154,146,146,146,110,177, 88,182, 1, 88, 15, 0, 21, 43, 86,124, 6,192, - 87,158,248,178,178,178,166, 19, 66,118, 44, 95,190,188,155, 70,163,169,161, 84, 42, 67, 44, 22, 11, 87, 80, 80,144,173,215,235, -207, 27, 12,134, 77,148,210,253,165, 76,247,171, 9, 33,153,195,134, 13,251,102,217,178,101,113,215,174, 93, 43, 56,122,244,232, - 83,174,215,213,168, 81, 99,239,242,229,203,163,159,127,254,249, 59,171, 87,175, 46,149,143, 22, 3,195,127,164, 33,182, 11, 30, -252,139, 61, 85,112, 51,228,114, 57, 15,251,226,210,162, 69,203,205,117,135, 93,124,178,242, 0,204,240, 33, 76,218,193,131, 7, - 95, 31, 60,120,240,199,246, 48, 72, 80, 52,133,131, 21, 69, 30,255,102,120,153,210,193, 67, 68,173, 0,190,180,111,101,245,242, - 12, 40,154, 47,103,206,163,204, 89, 6, 97, 50, 18, 66,198, 19, 66, 62,182, 31, 26,127,226,196,137,197, 46, 22,170, 83,206,231, -189, 89,158,220,113,158, 60,121,210,149,243, 76,105, 56,255, 73,228,230,230,190,242,233,167,159, 30,158, 56,113,162, 98,248,240, -225, 56,115,230, 12,102,205,154,101,204,205,205, 93,121,175,156,169,169,169, 55,163,162,162, 26,204,159, 63,255,141,121,243,230, -245, 34,132,176,181, 14, 31, 17,232,245,250,191,234,214,173, 11, 82,228,176, 68,173, 86,171, 99,180,168,125,134,255,191,124,177, - 26, 1, 88,106,223, 64, 8, 9, 65,209, 40,195, 44, 74,169,107, 67,114,188, 15,124, 7, 0, 28, 40,227,188,191,131, 16,242,236, -213,171, 87,103,252,245,215, 95,110,133,218,149, 43, 87,118,182,108,217,210,255,212,169, 83,239, 80, 74, 55,179,212,193,192,224, - 59,120, 15, 25,239, 10,128,255,249,144, 65,103,222,199,179,109, 62, 88,191, 24, 30,174,216, 90, 76, 8,249,198,201, 26, 83,170, -243, 15,139,243,159, 66, 82, 82, 82, 14, 0,199, 82, 36,137,137,137,119,249,177,221,171,216, 66,209, 44,240,108, 38,248, 71, 8, -215,174, 93,123,234, 1,228,177,236, 71, 52,239,239, 4,208,212,211,121,139,197, 50, 25,192,100,150, 42, 24, 24, 74, 15, 54,251, - 52,131,107,129,107, 44, 73,240,120, 59,255,176, 56, 25, 24, 24, 24, 24, 24, 30, 21,184, 89,235,176,141,227, 28,128,142, 30, 42, -191,237,165,120, 64,169, 23,244,244,198,207, 56, 25, 39,227,100,156,140,147,113, 50,206,199,143,211,137,123,158,135, 83, 23, 93, -248,190,248, 55, 10, 47,199,232, 67, 74,233, 3,219, 0,116,100,156,140,147,113, 50, 78,198,201, 56, 25, 39,227,188,199,231,188, -240, 48,158, 83,198, 97,166, 0,218,136,251, 60, 24, 24, 24, 24, 24, 24, 24, 24, 24,202, 4, 62,205,163,181,118,237, 90,137,248, -127,208,160, 65, 35,108, 54,155, 99,216,187, 68, 34,249,244,199, 31,127,252,166,164,135,244,235,215,207, 86, 18,167, 59,120,123, -142, 59,206, 90, 85, 3, 71,133, 6,170, 95,201,205,211,205,191,150, 98,219, 99, 48, 24,106,136,231,148, 74,229,249,111,190,249, -230,114, 89,135,115,196,136, 17, 85, 92,159, 83, 33, 78,218, 54,196, 95,249,114,118,110,225,220, 51,151, 11,190, 96,201,236,193, -162,127,255,254,165,186,254,250,245, 32, 28, 71, 52, 2, 52, 50, 20,106, 45,176, 29,123, 60,124,122,163,163,163,171, 5, 4, 4, - 12, 5, 80, 83,167,211, 69,168,213,234,116, 0,231,242,243,243, 87,220,185,115,231,162,175, 60,109, 19,200, 77, 0,229,237,187, -183,118, 94,167,241,190,156,243,134, 46,149,136,129, 2, 10, 66, 96,222,114,133, 58, 22,208,124,178, 50, 49, 8,244,238,227, 93, - 42, 19, 19,165,144, 17,192,184,229, 42, 85, 62, 46,233,149, 16, 18, 0,160, 19,128, 90, 0, 78, 1,216, 74, 41,213,177,156,204, -192,240,248,192,117,162, 82,231,125,222,131,152,104, 45,227,201, 34, 10, 26, 4,208, 80,163,209, 40,149,203,229, 48,153, 76, 80, -171, 85,159,189, 56,114,196, 20,112,200,181, 88,241,242, 55,223,124,115,207, 43, 93,151,230, 57,253,250,245,219,225,122,127,112, -128,106,250,206, 95,222, 10,110,221,109,246, 44,211,245,204, 9, 5, 5, 5,156, 66,161,128,209,104, 68, 96, 96, 96,139, 81, 47, -188,208,144,147, 82,147, 76,166,217, 63,111,222,188,212,123, 13,231,107,175,189, 22,101, 54, 27,154, 11,130, 32, 55,153, 76, 10, -215,231, 4,170, 53,179,119,254,242,150,186, 77,247, 89, 83, 0, 48,161,245, 8,161, 72,100, 69,225,213,193, 79,224,163,113, 29, - 17,212,118,246,227,144,161, 37,137,137,137, 99,226,227,227, 7, 46, 93,186, 84,150,152,152, 8,165, 82, 9,189, 94, 31,253,215, - 95,127, 69,143, 26, 53,170, 77,197,138, 21, 87, 93,187,118,237, 51, 74,169,205, 7,202,242, 59,191,123, 15, 0,208, 98,232,180, -242,132,144, 55, 1,232, 0,160, 77,133,191,207,181, 29, 62,173, 60, 33,100, 60,138,143, 22,190, 67, 41,117, 59, 73, 38, 5,228, -155,150,207, 65,207,103,222,228, 9, 33,163,196,227, 93,171, 0,191,127,191, 0, 79, 14,122,165,216,241, 46, 21,193,255,178,124, - 14,186, 63,243,166,199, 85,205,159,172,194, 89, 4,129,122,180,196,115, 28,177,110,185, 66,221, 45, 48,156, 70, 41,221,226,230, - 93,118, 65,209,130,206,110,175,239, 94,157, 79, 51, 91,108,110, 39,156,149, 73, 37,233,155, 46, 88,239,186,119,120, 3, 98,177, -216,138,202, 86, 25, 15, 91, 96, 96,224,206,119,222,121,135,239,222,189, 59,190,250,234,171,150, 95,124,241,197, 11,132,144, 63, - 0,108,164,148, 94,101,185,148,129,225,241, 21, 92, 30,133, 22, 47,193,231, 27,215,125, 83, 41, 45, 61, 19,195,158,127, 3, 43, - 87,174, 68, 78, 78, 14,130,131,131, 33,151,201,164,243, 63,126, 47, 42, 32, 64, 19, 53,236,133, 9,159, 3,168,118,175, 1, 42, -229,115, 42,223, 21, 33,251,132,166,188,132,147,202,229,114,110,213,170, 85,200,205,205, 69, 80, 80, 16,228,114, 41, 55,111,214, - 36, 85, 64,128,159,234,185,209, 19, 91, 2, 88,115,175,225, 52,153, 10, 91,254,180,242,155,128,140,140, 12, 12,127,105, 2, 92, -159, 35,147,201,108, 98,197,194,146,217, 63,135,204,204, 76, 0, 64, 88, 88,152,139,200,106,138,121,175,119,198,107,115,183, 66, -103, 48,253,235,227,153,152,152, 56,166,127,255,254, 3,167, 79,159, 46,227,184,162,129,195, 90,173, 22,122,189, 30,177,177,177, -216,185,115,167,236,221,119,223, 29,248,243,207, 63, 3,192,194,210,242,159, 61,123,182, 66,249,242,229, 13, 0,208,163,142,191, -235,185,120,241, 28, 0,248,251,251,123,229, 11, 13,210, 24,207,158, 61, 88, 83,188,111, 76,135, 88,155,135,227, 6, 0,234,146, -184, 4,129,242, 91, 23,141,242,120,254,249,233, 63, 88, 79,173,217, 83, 45, 49, 49, 81,239,124,220,195,132,203, 0, 16, 89, 88, - 88, 88,222,245,160,120,189,217, 98,139,240,244,188,206, 47, 47,113, 43,192, 44, 54,240, 63,252,240, 3, 0,224,147, 55,135, 72, -190, 60,148,201,243,124, 81, 81,251,241,199, 31, 99,234,212,169,242, 45, 91,182,116, 93,190,124,121, 87, 66,200,124, 79, 66,149, -129,129,225,223, 39,178,156,127, 75, 20, 90, 28, 33,254, 1,254,126,232, 55,248, 69,252,246,219,239,104,221,186,181,227, 92, 66, - 66, 2,250,247,237,133, 31,191,155, 7, 0,254,247, 19,168,251,125, 78, 78,158,246,253, 39, 7, 46,154,118, 43,181,240,192,166, - 77,155,208,170, 85,171, 98,247, 15, 30,208, 15,223,127,253, 49, 40,165,178,251,122,121,148,147,249, 7,104, 48,104,216, 75,112, -247,156, 23,134,247,222,212,165,255,130,142,105, 89,218,121, 44,169, 61, 92, 92,184,112, 1, 70,163, 17, 1, 1, 1,144, 74,165, - 80, 4,149, 71, 10,223, 4, 25, 36, 17,233, 17, 58,188,222, 49, 18,159,188,218, 14,175,205,221,138,249, 43, 15,162, 1, 82,255, -213,241,141,142,142,174, 22, 31, 31, 95, 76,100, 21, 20, 20,160,176,176, 16,249,249,249, 40, 40, 40, 0,199,113,152, 48, 97,130, -108,215,174, 93, 3,163,163,163,183,251,208,141,120,171,197,208,105, 69, 98, 67, 34, 45,156, 60,121,178, 49, 34, 34,194,168, 86, -171, 41, 47, 83, 20,180, 29, 62,205, 31, 0, 56, 94, 86, 48,127,254,124, 83,108,108,172,129,231,121,249, 43,175,188,226,211,244, - 48, 70,163,145, 58,115,154, 76, 70,199,241,217,179,103,155, 34, 35, 35,141,106,181,154,154,205,190,139,224,211,215,179,161,144, - 73,160,144, 73,160,148, 75,225, 95,161, 49, 20, 57,103, 96,181, 90,241,209, 71, 31,153,163,162,162, 76,106,181,154,202,229,114, -217,184,113,227,188,134,115,196,136, 17, 52, 40, 40,200,172, 86,171,101, 83,167, 78,189,107,118,231, 63, 79, 37, 67, 37,151, 66, -173,224, 81, 57, 33, 14, 10,170,247, 57,172, 18, 73,113,111, 4,133, 66,129,150, 45, 91,162,102,205,154,216,176, 97, 67, 91, 0, - 76,104, 49, 48,252,203,225,106,197,186, 75,104,109,222,188,185, 13,236,171, 78,119,235,214,173,104,181,105, 80,140, 31,211, 23, -207, 13, 31, 4,155, 77,112, 44, 55, 65, 56,130,209,207,118,133, 32,216,124,121,176,215, 33,158,165,125,142, 51, 39, 37,156, 4, - 0, 42,197, 71,211, 23,158,251, 31,108,130, 80, 52, 13, 42, 0, 72,128, 23,135, 63, 89,116,172, 12,194, 41,129, 13,111,140,122, - 26,238,158, 83,173, 82, 12,103, 53, 27, 64,156, 22,123,124, 16,139,109, 50,206,226,216,191,127, 63,212,106, 53,134, 12, 25,130, -113,227,198,193,198, 7, 97,237,129, 44,188,181,248, 0,116, 70, 51, 6,183,171,128,215,255, 87, 7,175,207,255,211, 33,178, 18, - 18,114,255,213,113, 15, 8, 8, 24,186,116,233,210,187, 68, 86, 90, 90, 26, 87, 88, 88, 8,179,217, 44, 20, 20, 20,192,102,179, - 97,226,196,137,210,119,223,125,119, 40, 33,100,170,157,199,232,142,115,231,117, 26, 79, 8, 25,127,246,236,217,248,119,222,121, -199,220,190,125,251, 91, 9, 9, 9, 90,137, 68,130,232,232,232, 5,157, 58,117, 10,153, 62,125,186,185,107,215,174, 55, 36, 18, - 9, 42, 87,174,172, 61,115,230, 76, 60, 0,149,175,113,119,230,252,230,207, 79,197, 86, 31, 58,117,234,116,179,114,229,202, 90, -137, 68,130,203,191,204,166,190,190, 79, 41,207,161, 74,108,160,216,140, 4, 84,126, 64, 78,209,110,167, 78,157,146,170, 85,171, - 86,200,113, 28, 78,159, 62, 29, 7, 64,233,141, 83,165, 82, 89, 6, 15, 30,124,235,226,197,139,119, 93, 15, 0,188,132, 67,211, -106,118, 3, 86,108, 3, 32,105,175,199,112, 74, 37,176,190, 59,102, 8, 31,164, 4, 20,254, 97,198,252,252,124, 4, 4, 4, 20, - 89,200,204,102,156, 56,113, 2,205,154, 53,107,179,102,205,154, 93, 44,191, 51, 78,198,249, 55,220,105,145,127,155, 53, 75, 20, - 92,238,124,180,118,186, 70,202,102,179, 34,161,124, 36,102,191, 55, 2, 54,155, 0,155,205, 6,171,253,215,102,179,193, 98, 54, -151, 73,224,238,231, 57,193, 1,170,233,191,175,122, 57,184,125,239,143, 59,204,124,103,248, 54,155, 13, 16, 4, 11, 44, 22,192, - 38, 88, 32,216,108,176, 88,202,166,171,200, 34, 8,136,143,139,194,204,119,134,195,245, 57, 43,126, 92,211,227,207,141, 19,212, -173,187,207,122, 3,192, 71, 76,219, 63, 28, 75,150, 90,173,198,138, 21, 43,208,184,113, 99, 0,192,158, 75, 86,188,181,248, 0, -182,204,108,129, 22, 53, 67,145,158,107,196, 43,159,157,196,111, 7,210,239, 18, 89,255, 98,212, 76, 76, 76, 44, 38,178,230,204, -153, 19,182,120,241,226, 88, 0,232,219,183,111,114,135, 14, 29, 50, 47, 93,186,132,232,232,104,146,153,153,217, 13,192, 43,246, -140, 63,158, 82,186,216, 3,175,182,124,249,242,134,240,240,112,163, 40,136, 56,142, 3,207,243, 40, 95,190,188, 33, 34, 34,194, - 88,185,114,101,173, 76, 38, 3,199,113, 16,133,158,143, 5, 16, 36, 18, 9, 68, 78, 87,107,143,200, 89, 26, 72,121,167,235,233, -221, 22, 36,142,227,220, 62,207, 19,148, 74, 37, 5,224,241,122, 9,231, 84, 60,242, 37,123, 8,124,119,156, 74, 9, 33, 59, 41, -165, 56,126,252, 56,174, 93,187, 6,153, 76,134,168,168, 40, 76,157, 58, 21, 70, 99,145,222,237,223,191,127, 27, 0,167, 89,110, -102, 96,112, 96,231,191, 77, 96,185, 90,181,220,249,104,113,110,212,164, 67, 0, 21,137, 29, 55,226,199, 98,133,197, 98, 6,188, - 44,170,234,171,208,242,244, 28,155, 77, 40,241, 57,162,143,150, 32, 80,222,173,200, 18, 4, 88, 45,150, 50,121,129,130,205, 2, - 65,176,192,221,115, 8,225,108,246, 2, 95,198,242,201,195,129,209,104,196,160, 65,131, 28, 34, 11, 0, 50, 11, 44,208, 25, 45, -104, 81, 51, 20, 13,219,245, 71, 68,144, 2,171,119, 39, 35, 34, 72,253,184,136, 44,232,116,186, 8,165, 82, 9,173, 86,235,176, -100, 45, 94,188, 56,214,100, 50,113, 38,147,137, 91,189,122, 77,220,202,109,151,202,173,216,114,169,220,210,245,199,202,229,228, -228,213,164,148,170, 40,165, 42, 0, 31, 19, 66, 20, 37,241,203,100, 50,135, 64,113, 22, 64, 10,133,226,158, 4,140,163,160,177, -139, 51,153, 76,230,246,184,107,247,154, 55,200,156,133, 22,104,145, 85,203, 69,108, 73, 36, 18,136,190, 81,222, 32,151,203, 29, -113,119, 7, 94,226,244, 60, 73,233, 93, 49,205,102, 51, 10, 11, 11,145,155, 91,204,162, 10, 81, 4, 51, 48, 48,184,215, 34,255, - 86,177, 85,172,252,112, 85,147,176,175, 62,109,181,152,221,138,159, 53,191,236,195,173, 84, 45,162,194, 14,131,122, 88,169,218, - 19, 6, 14, 28,248, 93,116,116,180, 99, 61, 45,133,202, 47,244,133,151, 63,128,213,106,134,191,138,195,243, 67,159, 44, 38,178, -138, 44, 90, 38,120,146,115, 57,121,218,247,159,236,191,112, 90, 96, 64,232, 1, 87,241, 51,115,217,177,126, 57,249,198, 56,142, - 59,130, 28, 18,109,235,255,226, 7, 35,156, 10,247, 83,171,150, 76,126,221,231, 23, 71, 56,105,191, 81, 11, 94,160,188, 95, 13, - 53, 87,176,251,173,225, 79,252,228, 44,230, 66, 66, 66, 54,117,238, 55,191, 99, 90, 54,243,209,122, 88,144,203,229, 24, 55,110, - 92,177, 99, 97,254, 82,168, 21, 82,236, 59,151,137, 99, 59,214, 96,207,217, 76, 40,101, 18,132,211,107,143, 77,188,213,106,117, -186, 78,167,139,214,235,245,200,207,207, 71,126,126,126,113, 65, 32,149,146, 23, 94, 26, 27, 38,149,201, 97, 49,155,240,219,138, - 15,189,114,182, 77, 32, 55,219, 84, 64,249, 30,117,252, 33,145,202, 11,206, 37, 38, 46,224,121, 30, 28,199,225,151,207,222,122, -101,253,220,151,253, 1,224,212,166,207,242, 7, 77,248,116, 33,199,113, 48, 26,141,138,210,132,251,246,237,219,113, 70,163,209, - 96, 23,104,162,105, 29,215,175, 95, 47,103, 52, 26,245,206,199,125,129, 74,237, 15, 4, 37, 0,234,136,187,172,103, 55,110,220, -136,177, 88, 44, 58,158,231, 97, 50,153,124, 82, 69, 28,199,201, 78,159, 62, 29, 39, 8,130,219,235,107, 86,140, 1,162,234, 0, -242,192,210, 20,184, 62, 93,227,174, 5,204,192,240, 95,183,108,161,148,250,226, 81, 16, 88,238,254, 59, 11,173,182,155, 55,111, -166,206, 45, 68,171,197, 98, 23, 89,127,139, 30,155, 77, 64, 74,134, 1,151, 46, 93,198,252,249,243,177,239,224,155,129,211,167, - 79, 87,188,251,238,187,198,129, 3, 7,206, 21, 4,161, 46,199,113,167,250,245,235,231,182,149, 38, 8, 66,185, 99,199,142, 37, -138,251, 22,139, 5,254,254,254,240,247,247, 71,181,202,113,119,137, 44,155,205, 6,115, 9, 93,135,162,143, 22,161, 2,181, 88, -108,176, 9,130, 67,252,228,228, 27,227, 54,110, 63, 94,201,233,242,170,226,159,150,141,107,120, 22,131,163,166, 58,226,177,106, -201,228,215,167,127,245,149, 34,199, 22, 62,110, 80,191,231,106,245, 31, 52, 20,131,159,126,170,141,209,100,218, 32,225,168, 96, -113, 60, 15, 28, 40,138,249,104, 49, 60, 56,100,102,102, 66,175,215, 35, 40, 40,168, 88,133, 21,173,209, 98,194,128, 42,232,244, -214, 94, 24,204, 54, 40,164, 28, 94,233, 21,143, 67, 63,175, 70,166, 49,211, 49, 26,241, 95,142,115, 87,175, 94,141, 46, 87,174, - 28,242,243,243, 97,181, 90,133,190,125,251, 38,243,188, 52,142,151, 74, 73,247, 65, 99,133,212,212, 20, 11,199, 73, 64,169, 13, - 79,245, 31, 69, 20, 74,149,204,108, 50, 89, 1,140,247,176,166,164,243, 20, 14,254,157, 58,117, 10, 17, 71, 2,174,159,251,178, -191,211,185,128,134, 13, 27,134, 56,143, 58,244, 81, 20,147,129, 3, 7,170,202,151, 47, 79, 0,224,200,138,119, 68,235, 25,233, -209,163,135,178,124,249, 34, 63,252, 63, 62,243,125, 77,237, 48, 53, 5,242,174, 3,121, 55,238,178,100,245,232,209, 67,145,152, -152, 88,170,188,104,119,128,247, 56,119,151,134,183, 2,169,199,125,226, 26,222,128, 88,222,105, 13,126,238, 83, 28,228,126,161, -198,166,111,109, 57,196,196, 22, 3,131, 79,112,209, 34,255, 30,216,215, 54,220, 9,160,173,253, 23,197,124,180,186,117,235,182, -171,152,122,164,128,197,106,190, 75,100,217,108, 54, 72,137, 17,243,231,207,199,171,175,190, 10, 0,178,215, 95,127,253,167,233, -211,167,247, 17, 4,161, 46,165,180, 21, 33,164,164, 86,227,206,232,232,232, 52, 74,169,148,227,184, 86,159,125,246, 89, 72,215, -174, 93,225,239,239, 15, 42,208,187, 68,150,205, 38,192,108, 54,193,147, 73, 43, 56, 64, 53,253,247, 53,227,130,219,247,250,184, -131, 77, 16,182,137, 34, 75,176,217, 0,161,232,166,172,244,100,108,253,109, 3, 62, 95,242,121, 14, 8,189, 0, 10,129,227,184, - 83,158,194, 40, 8, 66,221,189, 71,206,183,106,217,184, 6,166,127,245,149,226,236,177, 59, 63,141,125,237,237, 90,253, 7, 13, -197,154, 31, 87,128,179,230, 30,119, 22, 89, 54,139,128,188,156,204, 30, 59,152,143,214, 63, 6,139,197,130,156,156, 28, 88, 10, -115,208, 40, 90,139, 15,250, 71, 32, 45,199, 0,169,160, 67,245,128,116,236,200,190, 1,181, 90,253, 88,196, 53, 63, 63,127,197, -168, 81,163,218,236,222,189, 91,198,113, 28,242,243,243,209,174, 93,187,204, 12, 33, 86,249,194, 75, 99,195, 82, 82,146,173, 1, - 42,222, 40,147, 73,145,158,158, 46,180,233, 58, 68, 63,104,196,171, 49,175,190, 51,115,105,202,190,197,139,125,121,134,243, 72, - 64,215,115, 95,126,249,165, 41, 54, 54,214,160, 80, 40,228,195,135, 15,247,169,255,208,100, 50,209,217,179,103, 27, 93, 71, 23, -154, 76, 38, 58,127,254,124, 83, 92, 92,156, 81,165, 82, 81,139,197,187,223, 39,199, 17,235,243,211,127,176, 90,173,214, 98, 86, - 44, 81,100, 89, 4, 82,184,104,209, 34,115, 92, 92,156, 73,173, 86, 83,133, 66, 33,243, 37,156, 99,199,142,165,193,193,193,102, -141, 70, 35,155, 48, 97,194,125,141, 58,180,216,192, 79,255,204, 49,189,131,194,223,223, 31, 5, 5, 5,142,176, 70, 71, 71, 51, -177,197,192,224, 6,119,105,145,127,153, 21,206,147,143,150, 91, 7, 6, 1, 40, 76, 75,207,140, 8,139,172, 0,171,213,106,223, - 44,176, 90, 44, 24,247,226, 32,204, 93,178, 8, 0, 68,177,213,233,245,215, 95,255, 9, 46,254, 94,238,176,106,213,170,105,175, -191,254,122, 64, 90, 90,218,150,239,190,251, 46,100,200,144, 33, 24, 63,126, 60, 62,254,248, 99, 72,229, 74,132,132,151,115, 60, - 71,124,110,102, 70, 54, 40,104,161, 91, 5,105,247,209,162, 20,124,104,120, 60, 44, 54, 11, 4,139, 5, 22,139, 5, 68, 82, 20, -181,173,191,109,192,144,103,199, 66,170, 8, 8,254,116,254, 71,250, 90,141,162,251,188, 59,114,164,209,187, 60, 5,119,246,216, -157,159,198,190, 58,161,147, 40,178,214,173, 88,114,225,147,137,189, 86, 42,228,188,227, 57, 22, 65, 0,199, 73,152,143,214, 67, - 68, 88, 88, 24, 50, 50, 50,144,155,155, 11,141, 70,131,172,172, 44,100,103,103, 35, 55, 55, 23,198,252, 28,132,218,114, 65,172, -217,224,121, 30,233,183,139,124, 0, 31, 19,107, 22,238,220,185,115,177, 98,197,138,171,222,126,251,237, 65, 19, 39, 78,148, 10, -130,128, 75,151, 46, 1,132, 80,169, 76, 14,142,227, 32,149,242,200,203,203, 23,212,126, 65,119,204, 84,162,150,202,254,207,222, -117,135, 71, 81,188,225,119,246,122,201,165,247,132,132,208,146,144,208,165, 19,138, 84,233, 82,164, 23,145, 38, 77, 16,233,210, - 20, 65,154, 72,147, 34, 2,210,225,135,210,165, 72,239, 16,122, 8, 37,144,222,123,114,185,203,213,157,223, 31,228,226, 17, 83, -238, 66, 20,197,125,159,103,159,189,155,221,125,119,102,118,119,246,221,111,190,249, 70, 4,134, 39, 44,109,152,112, 76,235, 97, -175,194, 59, 48,124, 97,174,105, 36,160, 80, 40,196,245,253,203,115, 90, 15,251,202, 22, 0,132, 98,105,102,135, 14, 29,162,107, -214,172,153,119,251,246,109, 95, 20, 25,117, 88,204,243,105,232, 57,108, 26, 79, 38,149,228,181,111,223, 62,198,196, 25,117,122, -109,206,224, 79,103, 19,194, 19,229,117,237,218, 53, 58, 56, 56, 56,143,199,227,225,241,161,165, 57, 61,135, 77,147,144, 63,198, -244,254, 9, 39,159,211,145,247,247, 95, 10, 88,180,104,145,190,115,231,206,177, 38,127,177,168,168, 40,207, 46, 93,186,136,191, -251,238, 59,125,151, 46, 93,226,106,213,170,165,100, 24, 6,161,161,161,222,165, 89,170, 76,144, 74,165,250, 17, 35, 70,196, 60, -124,248,176, 92,163, 14,203, 66,165, 74,149,192,178, 44,218,180,105,131,252,252,124,206,178,197,129,195, 59,136,162,113,180, 74, -141, 12,175, 55,232,199,143,158,180, 96, 45, 64,108,204, 90,129, 63, 12, 75, 20,100,234,212,207,229, 0,164, 38,177, 53,121,242, -228,204,178, 50, 97, 38,178,222, 27, 56,112, 32,102,206,156,137, 21, 43, 86, 24,151, 45, 91,198,123,242, 44, 82, 55,236,211,121, - 89, 69,206, 3, 10,170,100,245,236,248,226,248, 50,179,243,230,133,116, 89,178, 32, 62, 89,117,121,216,216, 57,133,173,151, 17, - 64, 14,241, 48, 2,192,134, 31,126,200, 19,136,109,229,125,251, 15, 6,128,246,107, 87, 45,253,229,107,252, 88,182,216,162, 36, -112,252,228,105, 14, 38,145,181,238,187, 69, 15,237, 72,242,154, 9,159,135,233,205,207, 3, 0,142, 10,252, 18,210,101, 73,199, -148,140,188,239,185, 91,237,239,129, 86,171,197,234,213,171, 49,103,206, 28,100,100,100, 32, 45, 45, 13,153,153,153,133,139, 82, -169,132,187,187, 59,126,251,237,183, 63,249, 49,253,219,241,242,229,203,117,135, 15, 31,198,133, 11, 23,250,205,152, 49, 67,224, -238,238, 78,236,236,146,137, 94,167, 5, 64,105,106,106, 42, 43,179,177, 79,116,118,243,142, 73, 72, 74, 9,212,235,180, 96,141, -186, 18,189,205, 11,194, 59, 76,125,244,232, 81,229,229,203,151,107,205, 71, 2,246,159,182,118,117,131, 6, 13, 28,215,172, 89, -163,237,218,181,107,180,201,121,221, 18,103,248, 83, 47, 48,233,209,163, 7, 65, 69, 57, 91,143, 90,190,197,196,105, 62, 26,177, -219,231, 27,183, 84,175, 94,221, 49, 56, 56, 56,186, 52,222, 42, 85,170,168, 61, 60, 60,180, 1, 1, 1, 74,129, 64,240,202,146, -165,215,171,170, 84,169,194,186,185,185,105,107,214,172,169,180,214,105, 95, 42,149, 82,147, 85,172, 56, 88, 51,234, 80,192,131, - 97,224,192,129,133,145,225,167, 86,175,158, 56,120,240, 96,143, 41, 83,166, 96,203,150, 45,184,114,229, 74, 70,209, 99, 90,181, -106,133,139, 23, 47, 46, 0, 48,143,123,186, 57,112,248,247,161,204, 56, 90, 69,177,117,235,142,223, 97,230,211, 84, 28,190,254, -250,107,113,129, 37,171,253,103,159,125, 6,181, 90,237, 80,140,186,107,103,138,181, 81,156,200, 90,186,116,233,110, 74,169, 55, -128, 22, 70, 35,123, 99,243,143, 91,219, 88,160, 24, 11, 57, 41, 97,120, 12, 67,148, 34, 1,189,251,195,166, 45, 59,205,247, 43, -112,126,247, 7,193,253,181,171,150,170, 1,180, 47, 42,182,250,244,233,163, 42,202,105,194,152,177, 99, 10, 69,214,218, 85, 75, - 79, 7,191,231,243,225,156, 79,190, 42, 86,156,125, 53,111,180,156, 97, 72, 51,115, 31,173,226, 56, 43, 64, 45,115,156, 5, 16, -139,197,216,179,103, 15, 66, 66, 66, 80,167, 78, 29,100,100,100, 64,169, 84, 66,169, 84, 22, 90,189, 30, 63,126,140,232,232,104, -136,197,226,119,170,236, 5,211,234,172,246,240,240, 56, 51,119,238,220,193,105,105,105, 93, 50, 51,179,156,142,110,253, 10,157, -250,142, 37,173, 58, 15,200,211, 82,190, 36, 46, 49, 57,224,252,241, 93,142, 39,246,174,131, 78,171, 29, 77,200, 15,225,166,240, - 14,197,228, 83,101, 10,227, 16, 16, 16,144,103, 46, 84,124,124,124,242, 61, 61, 61, 53,193,193,193,133,233,197,141,230, 43,174, -236,214,114, 22,248,127,229,149, 85,159, 38,209, 86, 52,108,132, 76, 38,131, 73,124, 89,147, 79,243,209,150,197, 54,148,101,140, - 58, 52,231,220,118,135, 10,204,183,109, 35,132,183, 99,199,142,118, 59,118,236,120, 15,192, 93, 0,167, 0,232, 11,142, 43,116, -154,167,148,206, 7, 48,159,123,222, 57,206,255, 42,231,191,220,154,213, 10, 5,190, 89, 5,104, 77, 41,189, 80,162,208, 42, 11, - 38,199,119, 0,204,228,201,147, 51,213,106,181,195,224,193,131, 75, 61, 38, 41, 41,105,203,246,237,219, 95, 19, 89,189,122,245, - 26,126,224,192,129, 51, 41, 41, 41,229, 42,152,131,173,244,235, 11, 71,166, 59,180,234,186,228, 51, 0,203,138,151,153, 96,131, -223,243,248,112,237,170,165,191, 20, 17, 91, 63, 3,232, 85, 92,125, 1, 64,135, 15,122, 96,215,214,181, 38,223, 46,233,195,219, -241, 39,250,221, 89, 88,236,104, 69,123, 27,241,194,130,124, 76, 1,231,163,245,183, 32, 48, 48, 16, 87,175, 94,197,216,177, 99, -209,182,109, 91,244,232,209, 3,149, 42, 85,130, 88, 44,198,139, 23, 47,112,233,210, 37,188,124,249, 18, 42,149, 10,117,234,212, -121, 39,235, 32, 49, 49,241, 73, 65, 48,210, 73,166,175, 41,177, 68, 42, 28,240,241,103,222,133,163, 14,247,174,131, 38, 95, 13, - 0,124, 66,200, 50, 66,200, 79, 37, 56,196,191, 18, 20,124,190,240,222,189,123,190, 38,171,149, 78,167, 19,155,210,111,223,190, -237,107,138,173,149,159,159,111,241,168,195,191,138,243,193,131, 7,222,166,209,145,166,209,133,124, 62, 95, 24, 26, 26,234,109, -226,212,104, 52, 22,141, 58, 20,137, 68,194,123,247,238,121, 27,141,198, 10, 27,117, 88, 68, 24,159, 44, 88, 76,141,178, 73,100, -153,124, 58,184,110, 67, 14, 28,254,221, 56, 95,116, 82,105,147,158, 40,151,208, 50, 57,190, 91,161,244,248,149, 43, 87,238,208, -191,127,255,215, 68, 86,159, 62,125,140, 7, 15, 30, 60,239,225,225,145,204, 48,204, 19,107,243, 81,232,163, 5, 8,138,110, 99, - 24,230,126,139,134, 53,193, 48,204,253, 57,159,124,162,249, 26, 63,190, 38,182, 14,253,178,175, 99, 73,237, 34, 0, 56,185,122, - 97,224,240,241, 24, 56,124,188, 3,128,230, 64,201,163, 21, 75,203, 7,135,191, 14,205,154, 53, 67,120,120, 56, 78,159, 62,141, -139, 23, 47, 66,165, 82,129, 16, 2,169, 84, 10,173, 86, 11,177, 88,252,206,138,172,146,160,211,233, 12, 51, 22, 44,223,206,227, - 11, 13, 44,171, 35, 58,157,238, 99,107,158,243, 25, 51,102, 48, 40,198,247,106,194,132, 9,197,166,191, 45,206, 89,179,102, 21, - 59, 74,112,194,132, 9,165,142, 30, 44, 9,159,127,254,121,133,141, 58,180, 80,124,113,130,138, 3,135,119,207,170, 85,236,208, -189,114, 9, 45,134, 97,238, 23, 51,186,144, 0,160,197,141,232,163,148, 26,120, 60,222, 2,123,123,251,209,121,121,121,191,245, -234,213,107,114,159, 62,125,140,192, 43, 7,249,242, 22, 42, 51, 59,111, 94,235,110,223, 78,201, 82,106,214, 20,221, 86,212,242, -100, 18, 91,235,190, 95,186,254,151, 3,123,250, 36, 37,196,173, 47,169,108, 37, 9,170,146, 70, 43,102,231,168, 23,180,238,246, -237,103,153, 57,106,206, 71,235, 45, 88,182, 76, 40, 58,169,244,127, 1,148, 82, 13, 33,228, 11, 66,136,201,162,251,197,203,115, -223,175,255,227,193, 95,253,192,124, 91, 41,214,172, 68, 75, 38,136, 46,238,184,210,182,253, 5,156,201,165, 76, 16, 93, 26,146, -173,228, 75, 6, 0,161,128,151, 82,210,228,209, 66, 1, 47,165,130,174,161, 41,192,225, 2,238,137,230,192,225, 95,219, 22, 91, -231,163,101, 18, 65, 37,161,164, 56, 89,165,193,104, 52,126, 11,224,219,138, 44,216,195,103,185,155, 0,108,178,116,255, 2,159, -172,161, 5, 75,241,249, 76,127,100,117,217,250,244,233,179, 1,192, 6,238, 86,251,123,176,127,255,126,174, 18, 94,127,192,215, - 19, 66,126, 50, 9, 47, 75,183, 21,217,239,240, 95,144,175,191,130,243,228,223,201,119, 52,220,224,246,182, 27,105, 14, 28, 56, -252,243, 81,156, 53,171,212, 81,135, 28, 56,112,248,215,137, 45, 77,121,182,113,224,192,129, 3,135,138,251, 88, 42,206,215,146, - 0,104, 87,194, 65, 22,143, 38, 32,132,180, 43, 71,166,206,112,156, 28, 39,199,201,113,114,156, 28, 39,199,249,223,226, 44,139, -219,252,120, 66,200, 40, 74,233, 38,252, 11, 80,226,128, 22, 74,233, 95,182, 0,104,199,113,114,156, 28, 39,199,201,113,114,156, - 28, 39,199, 89,206,243,140,250, 59,206, 83, 1,249,164, 69, 23,211, 54,174,235,144,195, 95, 14,111,111,111,176, 44, 11,134, 97, - 16, 23, 23,199, 85, 8, 7, 14, 28, 56,112,120,167, 96,181, 51, 60,135, 98, 76,130,190, 61,231,128,197,172, 87,127,176,148,198, -252, 58,255, 93, 43, 99,223,190,125,121,214,236, 31, 25,105,207,220,129,199, 10, 91,185,176,155, 50, 79,191,194, 24, 58,119, 77, -113,251,177, 44,139, 35, 71,142,160, 91,183,110, 38,243, 42, 0,192,195,195, 3, 71,142, 28, 41,220,175, 65,131, 6,133,193, 27, - 57,112,224,240, 23,183,105, 14, 65,149, 64,200,199, 0,253, 99,216, 37, 75,195,104,214,227,173,175,237,103, 95,115, 56, 24, 18, -100,150,164, 6,197,102,154, 25, 22, 91, 66,247,137,233,133, 99, 31, 17, 17,225, 91,173, 90,181,104, 0, 89, 69,118,251,211, 54, - 90,202,195, 79, 8, 33,206, 85,234, 15,145, 73,100,159,106,181, 90, 63, 27,133, 34, 37, 35, 61,117, 67, 70,204,131,117,102,187, -217,222,184,113,195,163,113,227,198, 9, 0,114,203,226,228,192,161, 66,159,167, 63, 7, 44,173, 56,103,120, 82,163,183, 31, 12, -204, 80, 80, 12, 2,193, 61,250,114,127,239,114,241, 84,235,229, 5,150,223, 8, 64,125,128,214,151, 75, 37,245,212, 90, 93, 10, - 75,233, 16, 26,177,247,174,213,124, 85,250, 30, 3,208,185,132,173, 11,232,203,125,214, 9, 37,150,206,190,117,241,160,216, 94, - 70, 80,173, 65,175,105, 48,139,224,252, 6, 23, 70, 10, 96, 24, 33,164,173, 76, 38,171,161, 82,169,162, 40,165, 15, 0,172,167, -148, 38,148,147,147, 1, 48,194, 70, 46,239,228,171, 16,213,143, 73,203,142,207,213, 27, 47, 1, 88, 70, 41,205,172,168,155,234, -149,200,114,223,244,217,128,198,195,150, 78,108, 7,251,214,223, 78, 3,176,166,180, 99, 24,134, 25,233,233,233,233,231,229,229, - 21,185,182,123,221,205,227, 15,223, 67,143, 30, 61, 0, 96, 36,203,178,126, 94, 94, 94,145,132,144,205,150,182,141,132, 16, 15, - 0,124, 74,105,108,193,127, 57,128, 96, 0, 85, 0,188, 4,240,136, 82,154,247,134,215,232, 95,193,233,237,237,237,201,178,236, - 39,110,110,110, 93,146,147,147,143, 49, 12,243, 99, 92, 92, 92,194, 91,110,123, 54,154,252, 43, 44, 93, 3, 24,109,205, 9,164, - 82,105,114,126,126,190, 43, 0, 72, 36,146, 20,181, 90,253,151,141, 18,252, 59,207,245,247,188, 25, 48,242,212,229, 71,157,204, -147, 58,180, 8, 42,230,193, 37, 65,167, 46,135,181,124,125,191, 96, 99,113,109, 96, 65,244, 85, 44, 88,176,128, 44, 92,184,112, -120,213,170, 85,171, 51, 12,243,116,238,220,185,175,133,190, 41,186,109,222,188,121,127, 68,110, 45,134,211,219,191,217,161,126, -253,251,182, 30, 55,106,152,141,151,139, 13, 18,211,242,156,126,216,178, 99,249,142, 29,187,186,126,210,175,125, 39, 0,248,234, -171,175,122, 86,170, 84,169, 50,143,199,139,252,242,203, 47,127, 46,141,147, 3,135,191, 0,214, 77, 42, 93,230,243, 25,212, 87, -142,124,218, 7, 32,195, 90, 53,109,208, 98,244,144,110,132,242, 36, 24, 48,114,186,193,106,174,202,195,197,224,169,191,174, 29, - 28, 52,185,111,183,118,204,123,193,149,225,225, 98, 7, 48, 2,108, 60, 30,229,180,102,233,151,235, 1, 52, 46, 71, 54, 59,191, -184,182, 27,137, 89, 70, 16, 2, 16, 2, 48, 4, 80,230,179,232,208,115,232, 60,235,133, 18, 97,236,101, 4,147,119,231, 3, 0, -239,141,219, 56, 66,234,187,184,184,172,155, 56,113,162, 67,237,218,181, 61, 36, 18,137, 76,173, 86, 87,143,136,136,240,155, 51, -103, 78,123, 66,200, 18, 74,233, 65, 43, 57,125,170,121,123,238, 91, 51,121, 68,163, 58, 85,124, 33,208, 42,193,106,242, 42, 61, -139,120,222,116,204,250,253, 35, 9, 33,253,203, 51,101, 66, 90, 90, 26, 1, 0,103,103,103,250,186,200,106, 50,236,187, 41, 29, - 48,121,229, 41,168,242,181, 59, 75, 58, 62, 33, 33,193,100,217,242, 59,114,228, 72, 80,183,110,221,208,200,207, 27, 55,186,165, -162,225,161, 56, 0, 40, 76,183,162,172, 11, 1,204, 42,104,135,119,241,120,188,211,237,218,181,243,251,228,147, 79, 72,131, 6, - 13, 16, 26, 26, 90,101,247,238,221,237,248,124,126,164,209,104,124, 0,224, 41,165, 84,111, 33,183, 0,128, 63,143,199,171,253, - 79,230,244,244,244,148,106,181,218,161,222,222,222,163,186,119,239, 94,187, 91,183,110,196,223,223, 31, 79,158, 60,105,112,226, -196,137,121,117,235,214,125, 16, 23, 23,183, 73, 36, 18,109, 79, 72, 72, 80,191,133, 47,188, 81, 0, 60, 11, 12, 28, 11, 44, 88, - 39, 0, 88, 64, 41, 77,180,244, 28,249,249,249,174,166,247, 40, 33,196,245,175, 44,143, 53,231, 34,132, 60, 38,132, 56, 22,252, - 70,105,107,134, 97, 96, 48, 24,242, 12, 6, 67,213, 50, 56,253, 1, 48, 86,100,153, 82, 74, 75, 11, 4, 45, 5,128, 14,205,131, - 50, 64, 16,102,178,104, 21,243,145, 25, 86, 40,192, 40,130, 78, 93, 9,115,124,205, 10, 86, 4, 11, 22, 44, 32,243,230,205,195, -252,249,243,187, 1, 8, 97, 89,246, 82, 96, 96,224,234,215, 40, 89,182,112,219,188,121,243,190, 95,176, 96, 1, 1, 80,172, 32, -114,172, 92,119,240,135, 31,246,104,189,104,246, 4,155,248,116, 29,238, 69,170,225,104, 35,196,188, 47,198,138, 52, 26,125,211, -245, 63,239, 24,181,118,201,244,205, 70,163,241,125, 0,239, 25,141,198,219, 0,126, 46,141,147, 3,135,191, 0,173,173,154, 84, -186,132,135,156,160,106,239,150, 48, 98,152,111, 37,183, 62, 19, 63,249, 72, 26, 28, 88, 13,249,176, 65, 84,154, 17,199,143,158, - 0,128,189,214, 89,157,250,189,199, 23, 98,251,210,249, 95, 4,132, 52, 10,198,195,120, 61,110,199, 27,161,138,212,131,199,232, - 97,100, 41, 64,145, 95,222, 82,199,101, 26,112,249,169, 22, 12, 1,120, 12,192, 48, 4, 60,166,156,100,172,246,217, 87, 91,239, - 4,167, 37,179, 0,171,125,246,134, 47,160,247,107,212,168,177,106,225,194,133,238,201,201,201,142,183,111,223,134, 88, 44,134, -131,131, 3,223,211,211, 51, 96,213,170, 85,217, 19, 38, 76,248,130, 16,114,151, 82, 26,101, 33,103, 96,231,247,106, 95,221,180, -244, 43, 59,253,141, 19,200,218,243, 63,240, 24, 10,161,220, 6,126, 82, 41, 78,124, 88,205,177,207,209,200,131,132,144, 64, 74, -105,124, 89,124,225,225,225, 60,141, 70,211,223,214,214,182,137, 64, 32,112, 19,219,251,176, 9,252, 70,233,169,164,202,203, 20, - 87, 85,203, 41,237,220, 58,173,248,172, 13, 38,175, 60,133, 85,187,175,111,171,143,164,185,214,212, 65,214,173,115,184,151,249, -231, 75,235, 46, 23, 88, 82, 86, 7, 0,211,181, 90, 45, 35, 20, 10,137, 68, 34, 25,188,104,209, 34,221,128, 1, 3, 10, 29,192, - 66, 66, 66, 16, 18, 18, 66,114,115,115,171,156, 59,119,174,202,142, 29, 59, 12,132,144,199,148,210, 67, 37, 91, 44,100, 49,249, -249,234, 74, 18,169, 84,245,195,250,245, 43, 90,182,108,201,154,207,147, 88, 30, 78, 0,176,183,183,223, 92,163, 70, 13, 50,115, -230,204,132,138,226,244,243,243, 59, 21, 18, 18,210,166, 67,135, 14,252,230,205,155,195,211,211,179,112,155,179,179, 51, 66, 66, - 66, 72,108,108,108,157, 75,151, 46,173, 63,117,234,212,106, 63, 63,191,115,145,145,145, 29,254,206, 86,167,192, 82, 5, 43,132, -211,166, 98, 2, 33,255, 59,141, 69,132,216,108,220,184,209,213, 52, 39,163, 94,175,135,209,104, 44, 92,155, 22,150,101, 97, 52, - 26,177,104,209, 34,163,133,117,154,135,130,224,208,102, 11, 91,220, 90, 36, 18, 89, 22,185,151, 32,204, 67,156, 85, 83, 46,151, -251, 2,232, 92,163, 70,141,233,230,155,171,187,188, 90,231,229,229, 69, 39,106,236,195, 0,180, 44,237,118, 95,184,112,225,208, -249,243,231,247,192, 31,115, 86,214,238,219,183,239,185, 34,251,213, 46, 88,231, 17, 66,206, 51, 12,115, 4,192, 86, 0,127,178, -186,203,100, 54,163, 39,126,250,137, 77, 92,154, 14, 95, 31, 76,195,214,139, 57, 24, 26,162,192,228, 15,236, 48,112, 64, 63,249, -254,255, 29, 24, 13, 96,179,217, 33, 79, 2, 3, 3, 73,120,120, 56, 39,178,222, 45, 52, 4,224, 98,246, 95, 11,192, 52,101, 86, - 90,193,115,225, 84, 36,221,124, 63,211, 58,181, 32,221,165,224, 56,106,198,155, 10,224, 86, 57,219,187, 11, 5,121,248, 19,248, - 0,112,236,216, 49,218,165, 75, 23, 98, 90, 23,223,178,247, 57, 62, 98, 64,247, 78, 93,218, 54, 3, 35,113,192,179, 20,224, 90, - 12, 5,159,209,131, 1,197,141, 43,231, 40,248,236,246, 34, 39, 46,209,122, 66,252,250,124, 94,187, 86,240,183, 63, 46,157,196, -123,156,194,199,214, 75, 42,232,242,149, 72, 77,138, 65, 74, 66, 52, 18,227, 94, 34, 62,230,229, 3,128,204,179,148,243,207, 5, - 7,140,108,193, 55, 32,139,130,250, 44,118,228,101,217,156,186,188,240, 42,254,193,193,153, 34, 35,160,203, 11,183,160,210,207, -148,208, 0,183,175, 86,173,218,178,217,179,103,123, 63,122,244,200, 54, 47, 47, 47,239,196,137, 19, 23,162,163,163,221,220,221, -221, 99,199,142, 29,219,204,203,203,203,181,103,207,158,178,125,251,246,205, 6,240,137, 5,156,193,221,155,212,187,182,101,245, -119,242,244,253,107,160,141,184,143,227,137,121,184,146,172,162, 85,236,196,100,124, 29, 23,216,136,249,248,170,185,167, 77,231, - 95, 34,190, 5, 48,176, 52,206,171, 87,175,122,200,100,178,149, 3, 7, 14,244,156, 56,113,162,200,200,183,231, 31,184,150,110, - 55,125,253, 53, 79,149, 70,199, 27,208,166, 50,166, 12,170,141, 41,171,206,154, 68,214, 40, 63,191, 44,182, 56, 78,111,111,239, -145, 44,203,250, 21,252,173,108, 90,183,189,156,187,216,236,148,133,233, 68,225,188,216,211,211, 19, 12,195, 68,198,197,197,109, -182,244, 26, 73, 36,197,207,158,226,224,224,128, 86,173, 90, 33, 48, 48,144,223,178,101,203,218, 0, 14,149,196,169,211,105, 61, - 88,150, 66,161, 80, 72,157,156,156, 28, 20, 10, 69,186, 78,167,123, 35, 78, 0,112,116,116,236,221,170, 85, 43,254,238,221,187, -211, 34, 35, 35,111, 12, 24, 48,224,165,173,173,237,107,214, 95,185, 92,142,234,213,171,227,203, 47,191,228,119,234,212,169, 76, - 78, 55, 55,183,246, 59,118,236, 0, 33,164,240,165, 93, 20,190,190,190,112,119,119, 71,231,206,157,249,189,123,247,110, 95,222, -231,200,138,134,230, 76, 49, 22,173, 5,175,139,217,146,187,223,138,219,223,130,235,158, 98,178, 46, 73, 36,146,148,242,228,179, - 8, 74,236,238, 20,139,197,133, 86,168,162,231, 42,142,147, 97, 24,204,153, 51, 7,132, 16, 8, 4, 2, 8,133,194, 98,215,173, - 91,183,182, 54,159,177,132, 16, 70, 40, 20, 78,231,243,249,159,104, 52, 26,111,137, 68,146, 96, 52, 26,183,105, 52,154, 69, 5, - 22, 81,251,226,238,221,146, 56,229,114,185,239,179,103,207,106,148, 84, 41, 26,141, 6,181,107,215, 6, 52,120, 92, 26,103, 68, - 68,132,111,213,170, 85,253, 1,152,166,104,187, 72, 41,109,105,246,223, 28, 23, 41,165, 31, 20,252,126,250,226,197, 11, 95,147, -208, 50,231,212,235,116,126,222,174,182,184, 23,165,198,214,139, 57,248,125,182, 39,218, 46, 74, 64,175,250,124, 4,250,216,192, -160,211,251,247,237,219,119, 59, 0,255,130,151,100,207,190,125,251, 6,240,120,188,179, 0,126, 5,144,253,119,221,243, 28,231, -155,161, 12, 45,226, 66, 8, 57,106,118,254,174,166,255, 51,102,204,152,181,120,241,226, 71,132,144,163,230,233,230,251,153,175, - 11,218,155,163,148,210,174, 51,103,206, 12, 94,178,100,201, 55,166,125,255, 10,133,104, 77,215,161,109,106,190, 28,151, 98,108, -193,231, 25,193,103, 8,248, 60, 0,148, 32, 58, 42, 2,185, 57, 89,151,233,203,255, 69, 90,102,201,234,219,188,110,189,218, 75, -119,173,154,198,252,116, 73,133,172,188,124,132,223, 61,143, 91,231,127, 77, 50, 26,140,191,130,208,219, 0, 19,138,151,236, 19, - 74,247, 27,203,127, 35,224,149, 85, 12,164,136,216,122,107, 95,185, 31, 4, 4, 4, 44,158, 51,103,142,239,221,187,119, 21, 57, - 57, 57,169, 59,119,238,124,162,209,104,238, 2,248, 62, 38, 38,166,213,247,223,127, 47, 91,190,124,121,135,218,181,107,251,239, -223,191, 95,101, 1,103,157, 47,134, 13,188,246,201,196,207, 36,143,247,173,131,232,113, 40,230,220, 79, 51,254,158,168,154, 13, - 96, 21, 98,149,205, 83,243, 13,167,191,107, 85,137,169,172, 16,162,154,189,168,117, 89,150, 44,153, 76,182,114,199,142, 29,190, - 13, 27, 54,100, 0,224,210, 83,131,120,250,250,107,158, 39, 23, 55, 39,205,131,156,144,146,165,193,164,117,247,112,226, 90,202, -111, 69, 69,214,159, 12,129, 5,221,133,230,105, 71,142, 28,145, 1,248,147, 51,136,121,122,105,221,136,148,210, 76, 66,200,183, - 34,145,104, 14, 33,132, 54,108,216,240, 94,173, 90,181,148, 14, 14, 14, 80,171,213,208,104, 52, 16, 10,133, 80,171,213,136,142, -142,198,141, 27, 55,224,224,224, 96,213,181, 82, 42,149, 80, 40, 20, 96, 89,246,141, 57,141, 70, 35,217,176, 97,131,252,209,163, - 71,242, 3, 7, 14,184, 77,158, 60, 57,189,102,205,154,183,251,245,235,247,220,213,213, 85,115,255,254,125, 92,189,122, 21,153, -153,153,104,210,164,137, 69,156, 90,173, 22,124, 62, 31,106,181, 26, 98,177, 24,124, 62, 31, 6,131, 1, 44,203, 22,138, 47,165, - 82,137,140,140, 12, 8,133, 66,104,181,218,191,253,126, 55, 89,180,204, 81, 90,247, 91,113,251,151,133,138,246,147, 42,173,187, - 51, 43, 43, 75,106,111,111, 63,221, 18, 11, 29, 33, 4, 60, 30, 15, 66,161, 16,132, 16,180,108,217, 18, 35, 70,140, 64,253,250, -245, 17, 17, 17,129, 61,123,246,224,214,173, 91, 16, 8, 4,133,251, 91,220, 63,209,186, 53, 79, 34,145, 92,237,222,189,123,240, -236,217,179, 37,149, 43, 87,198,227,199,143,125,150, 44, 89, 50,253,204,153, 51, 61, 8, 33,239, 81, 74,217,178,173,244, 5, 93, -130,175,186, 11, 59,107, 52, 26, 60,126,252,216,154, 99,254,132,106,213,170, 69, 51, 12,243,156,101,217, 75, 0,106, 83, 74, 91, - 18, 66, 78, 0,144, 23,217, 53,143, 82,250, 1, 33, 36, 7,192, 3,134, 97,158,178, 44, 27, 93,156, 59,149, 66,161, 72,141, 75, -201,113,115,178,145, 96, 72, 11, 27,180, 93,148,128, 62,239,137, 33, 22, 18, 60,137, 76, 66,181,170,149,201,189,203,135,222, 43, - 16, 89, 13, 19, 19, 19, 1,224, 61, 0,145,177,177,177, 30, 38,161,197,225,221, 64, 81, 49,100, 18, 80,139, 23, 47,238, 90,156, -184, 42,230,217,124, 45,125,201,146, 37,223,152,253,207,124,131,182,163, 21, 94,119,134,111, 93, 96,229,250, 67,104, 29, 59,118, -172,116, 5,194,162,215,209,131,187,175,183,213, 17,223,224, 6, 45,204,172, 67, 20,161, 55,174, 2,160,219, 44,202,140,103, 55, - 41, 35,147,111,219,240,205, 4,102,227,121, 21, 98, 19, 82,112,245,248, 54,164, 38, 70,109, 5,232,100,250,114,127,206, 27, 55, -150, 85,250, 6,187, 58, 59, 33, 95, 71,193, 82, 0,127, 18, 91,111, 69,100,117,243,247,247, 95,120,237,218, 53,223,252,252,124, -197,149, 43, 87,178,118,236,216,241, 92,171,213,254, 72, 41,221, 89,176,207,225,180,180,180,175, 40,165, 80, 40, 20,124,129, 64, - 32, 45,205,153,147, 16, 82,255,139, 79,134, 94,254,118,195, 22,201,243,135,247,240,253,129,227,200, 82,169,140,231, 83,212, 61, - 41,165, 71, 11,246, 57,123, 39, 77, 29, 79, 65, 43, 9, 24, 2, 15,185,192,157, 16, 34,161,148,230,151,240,229, 58, 96,224,192, -129,158, 38,145, 5, 0,105,185,122,190, 74,163,231, 53, 15,114, 66,131, 54,125, 17,122,110, 63,246, 93,140, 71, 85, 23,217, 69, - 63,121, 86,169, 53,202, 48, 76,164,153,104,170,124,228,200, 17, 89,183,110,221, 84, 0,204,187, 68,255,148,206, 48, 76,100, 25, - 15,219, 92, 66,136,219,246,237,219, 25,189, 94,175,140,136,136,128,187,187, 59,220,220,220, 96,103,103,135,240,240,112,252,254, -251,239,120,242,228, 9, 88,150, 69,221,186,117,173,186, 94,233,233,233,184,127,255, 62, 58,119,238, 50, 57, 53, 53,197,214,193, -209, 41,239,242,165,139,203,203,195,201,178, 44, 1,128,224,224, 96, 4, 7, 7, 75,226,227,227,189,143, 30, 61,234,250,245,215, - 95,199,248,250,250,238, 82,171,213,175, 89, 14, 44, 21, 90, 5,194,165, 80, 4, 74, 36, 18, 8,133, 66,228,228,228, 32, 57, 57, - 25,185,185,185,175,250,114,236,237,223,138,208, 42,206, 66, 85,145,251,255,149,226,176, 56, 49, 69, 8, 25, 4, 96,186,133,101, -129,193, 96,128, 80, 40, 68,227,198,141,177,102,205, 26,220,186,117, 11,191,254,250, 43,124,124,124, 48,108,216, 48, 48, 12,131, - 71,143, 30, 89,155, 69,246,218,181,107,211,123,246,236, 25,188,125,251,118, 73,116,116, 52,158, 60,121, 2,123,123,123,172, 89, -179, 70, 60,106,212,168,106,231,206,157,155, 11, 96, 89,153,101, 53, 27, 93,232,233,233,249, 81,237,218,181,255,180,143,187,187, -187,221,201,147, 39, 93, 77, 2,172,232,136,196, 98,144, 53,119,238,220,239, 2, 3, 3, 87, 21,116, 23,134, 0,144, 83, 74, 91, - 31, 56,112,128, 0, 64,159, 62,125, 40, 33,196,244, 66,122,176,127,255,254, 54,225,225,225,116,254,252,249,197,182,115,169, 41, -137, 27,190, 91,179,241,187,111, 23,124, 33,154,210,217, 14,125,222, 19, 64, 34, 36,176,149, 9,176,104,245,102,253,157, 27, 23, -239,123,120,120, 28, 5,208, 51, 49, 49, 17, 30, 30, 30, 74, 0, 79,121, 60, 94,164,209,104, 76,224,124,225,255, 93, 40, 78,139, - 20, 88,149, 19,139, 19, 74,229, 17,106,230, 22, 47, 19,102,206,156, 25,188,120,241,226,155,111, 34,178,204,157,224, 9, 33,148, - 16,210,154, 82,122,161,240,101, 90, 98,151, 97,161,237,139,241,112,119,115,118,156, 49,172, 57, 88, 22, 48, 24, 1,131,145, 34, - 79,165,198,227,135,183, 84,144,144, 3, 22,229, 72, 44, 90,250,245,236,207,170,220,139, 99,144,144,169,195,133, 67, 27,105,106, - 98, 84,111,250,114,223,199, 21, 37,178,220, 93,157,207,239,222,248, 21,110,189,212,194,200,190,210, 89, 44, 75, 11,127,191,133, - 23, 78,117,103,103,231,229,215,175, 95,175, 44, 22,139, 21,207,158, 61, 51,238,223,191, 63, 65,171,213,174, 55,137,172, 2, 12, -106,208,160,129, 94, 46,151, 67,169, 84,106,116, 58,157,178, 20,145,229,221,186,126,157,139,223,110,216, 34,201,215,106,145,173, -214,128,231,228,250,154,200, 42, 64,179, 54, 53,188,188,136, 68, 1, 10, 32, 42, 71,151, 80,146,200, 2, 0,145, 72,212,110,226, -196,137,230,253,219,112, 86, 8, 12, 50,177,192,120, 37, 44,141, 13, 61,183, 31,151, 30,165,177, 18, 33,207,232, 66, 95, 86, 41, -171,236,113,113,113,155, 19, 18, 18,102, 38, 36, 36,204, 52, 19, 87, 81, 0,102,214,180, 19,254, 41, 61,200, 94, 52, 51, 33, 33, - 97, 38,203,178,155, 45,168,218,132,129, 3, 7,198, 5, 5, 5,101, 7, 6, 6,102,167,167,167, 35, 44, 44, 12,153,153,153,248, -254,251,239,241,248,241, 99,176,236, 43, 29, 88, 92, 55,138, 5, 2, 9,153,153, 25, 54,148, 82,100,102,164,203,103,207,158,109, - 87, 30, 78,163,209,248,218,179,229,229,229,133,177, 99,199, 10, 85, 42,149,125, 76, 76,140,173,249, 54, 75, 57,181, 90,109, 97, - 40, 12, 74, 41,180, 90, 45,178,179,179,161,213,106,241,252,249,243, 66,145, 85,112,254,183,102,209, 50,253,150, 74,165,201, 38, - 7, 81,137, 68, 2, 66, 72,113,221,111, 21, 18,253,217,116, 46, 66, 8,149, 74,165,201,229, 16,135,101,150,199,194,235, 14,161, - 80,136, 17, 35, 70,224,230,205,155,136,136,136, 0,143,199, 67, 94, 94, 30, 84, 42, 21,218,183,111, 15,145, 72,100,173, 69,139, - 10,133,194, 65,179,102,205,146, 68, 70, 70, 34, 45, 45,205,228, 76, 15,163,209,136,201,147, 39, 75,197, 98,241, 32,107, 77,247, - 9, 9, 9, 29,159, 61,123,230, 95,116, 73, 74, 74,202, 54,247, 41, 44, 47, 14, 28, 56, 64,250,244,233, 67,251,244,233, 67, 77, -130,203, 82,100,197,133,109,248,245,240,209,211,159,127,185, 84,169,202,203, 69, 85, 79, 41,148,185,217, 88,180,248, 91,253,181, -107,151,206, 79,159, 60,166,233,254,253,251,151, 0,120, 90,112,200,211,253,251,247, 15,253,242,203, 47,127, 70, 65,152, 7, 14, -255, 30, 20,167, 69,204,159,189,138,232,222, 43,142,163,160,251, 80, 90, 78, 74,211,136,195, 86, 38,225, 85, 32,186,206,191,102, -209, 42,181,241,169,214,175,158,155,179,211,185,237,107, 23,216, 28,125, 8,196,197, 70, 33, 53, 49, 26,239, 53,109,141,199, 15, -239,129,213, 27, 15,210,103,251,203, 28,158, 78,252,250,214, 8,172, 25,244,105,171,166,181,176,244,168, 18,207, 66, 79, 34, 43, - 53,113, 45,141,220,119,176, 34, 46, 16,169,210, 55,216,205,197,249,252,207,235, 22, 58,158, 8, 99, 16, 27, 27,133, 67, 63,175, -130, 94,247, 39, 93,113,220,234,198,155,213,138,148, 89,201,208,230, 26, 33, 97, 84, 18, 43, 47,234,115, 23, 23,151,237,223,125, -247,221,152,166, 77,155,202, 6, 12, 24,240, 44, 51, 51,243,107, 74,233, 62,179, 6,254,125,127,127,255,169,107,215,174,173, 22, - 27, 27,139,223,127,255,253, 25,128,219,165,112,198,241,120,188,245,191,255,188,249, 11,105,149, 0,124, 63,235,115,195,129, 91, - 97,221, 41,165, 39,204, 56, 3,219,213,174,113,244,235,169,227, 24,246,206,111,184, 31,157,140,151,217,154,223, 75,226, 76, 75, - 75, 35,106,181,186,178,189,189,189,249,121,224, 33,207,211, 76,251,168, 70, 66,251,233,151, 61,243,117, 70,136, 5, 12,157,212, -195, 55,225,198,175,251,156,210, 52,105,196, 52, 26,209, 90, 60, 83, 26,193,231,243,225,234,250, 71, 15, 82, 88,166, 85, 99, 31, -108,110,222,188,201,240,120,188,215, 4,186,185,133,200, 90, 75,145, 53,176,148,179,168,208, 50,193, 96, 48,144,242,114,106, 52, -154, 98, 99,142, 21,231,171,197,178,236, 95, 82,126,107, 44, 84,230, 93,134, 38,127,186,252,252,124, 87,169, 84,154,108,234,254, -171, 40,139,214,155,140, 68, 44,173,251,210,154,252, 49, 12, 3,150,101, 33, 20, 10, 81,183,110, 93, 28, 61,122, 20,142,142,142, -176,181,181,133,173,173, 45,164, 82, 41,156,156,156, 10,133, 22,195, 88, 60, 74,135,106, 52, 26, 31, 31, 31, 31, 60,127,254, 28, - 18,137,164,112, 17,139,197, 8, 14, 14, 70, 94, 94,158,215,219,179,221,255, 53, 24,217,175, 93,143,117, 59,126, 25,114,244,232, -177, 79,117,154,252, 90, 1, 1,254,244,246,181,115,247,167, 79, 30,211,137,147, 38,255, 45,152,172, 81,230,190, 86, 51,102,204, -152, 85, 94,190, 25, 51,102,204, 42,206,194, 85, 94,193,133, 87, 93,125,166, 53, 10,133,150, 73, 65, 22,167, 36, 77, 34,107,235, -154,249,182,191,220, 5,226,226, 34,113,122,223,234, 92,189, 78,155,201,178,122,223,151, 79,238, 1, 12,182, 89,148, 5,134, 54, -234,209,185, 13, 57,253, 72,139,156,172, 84, 60,189,125, 50, 10,106,209,204,138, 20, 89,219,215, 45,112, 60,242,144, 32, 54, 54, - 10, 39,246,172,202,214, 27,116,239,211,151,251,239,190, 9,247, 96,145,168, 71,191,154,246, 93, 63, 9, 73,128,145, 24, 49,232, -113,248, 7,158, 33,164, 71,194,165,210, 71,134,153, 35, 53, 53,117,145,141,141, 13,179,108,217,178,143,243,243,243,231, 83, 74, - 15,152,221, 56,237,171, 86,173,186,116,195,134, 13,222, 49, 49, 49,162,203,151, 47,103,156, 63,127,158, 2, 88, 92,198, 11,124, - 26, 33,132, 87,191,178,215,132, 59, 81,241,221, 41,165,191,153,113, 6,119,109, 16,116,101,203,226,185, 10,253,149, 3, 80, 38, -198, 98,230,149,184, 28, 0, 22,215,183, 94,175, 71,102,102, 38,244,202, 76,195,123, 30,121,217,243,251,186,106,146, 51,243,249, - 2, 86,101, 8,180, 77,209,156,203,136,226,201,100,178,114,215,171, 80, 36,130, 94,175,135,151,151, 87, 97, 90, 78,174, 18,132, - 16,120,120,120,148,245,176, 45, 4, 48,185, 89,179,102,164,113,227,198, 55, 86,173, 90,117,170, 52,177, 82, 30,139, 86, 89,176, -148,147,101, 89,166,132,250, 37,229,229, 52,183,104,149, 37,180,222,166, 69,171, 56,209, 98, 46, 18,205,133, 80,121,124,180,254, - 74,113,104,141, 8, 43,134,167,208,162,117,239,222, 61, 84,170, 84, 9, 58,157, 14, 10,133, 2, 10,133, 2, 54, 54, 54,200,205, -205,133, 64, 32,128,149,101,102, 37, 18, 73, 76, 88, 88,152,191,139,139, 11,140, 70,227,107, 98,235,217,179,103,144,203,229,241, -214, 90,180, 60, 61, 61, 79, 22,140, 58,124, 13,238,238,238,118, 21, 81,175,230,150,172, 62,125,250,148,235,195,108,221,226, 47, -118, 0,216,209,183,111,223,237, 15,174, 29,123,207,195,195,227, 88, 96, 96, 32, 1, 0,110,132,225,187,101,205, 42,161,135, 45, -181,136, 37, 74,107,246, 63, 21, 0, 41,248,159,106, 38,196,204,127,107,139, 73, 75, 95,188,120,241, 57, 51,255,174,212, 55, 44, -130, 41,196,195,107,190,208,252,178, 44, 89,174, 78,142,231,126,252,126,190,237,190, 80, 32, 62, 54, 18, 23, 14,174,201, 54, 24, -117,239,131,165,137,215,206, 28, 60, 0, 2, 21, 94, 30,184, 0,236,179,160,137, 64,253,250, 53,125,241,235, 35, 61, 82,227,158, -129, 82,118, 43, 77,254, 89,245,198,141, 99,129,200,218,186,102,190,227, 47,247, 8,226, 98, 35,113,122,223,234,108,131, 81,247, -126,121,130,157,154,240, 9, 33, 14, 60,185,100,253,144, 14, 13, 63,242,173,234, 13,150,234,193, 10, 41,122, 77,115,230, 63,189, -163,250,213,167, 3,111, 31,171,100, 63,141,187,102, 89, 32, 80,165, 82,249, 21, 33,228, 23, 74,233, 99,179, 6,249,131,106,213, -170,125,243,195, 15, 63, 84,142,143,143, 87,220,185,115, 39,103,211,166, 77,145, 44,203, 46,164,148,150, 57,138,138, 82,250, 57, - 33,228, 71,243,120, 57,132,144, 58, 95,124, 60,240,218,192,225,159, 72, 34,207,236,128, 67,228, 99, 76,189,146, 96,124,154,169, - 29, 64, 41, 77, 42,137,203,217,217,153,166,166,166, 70,101,101,101,249,203,229,114,164,167,167, 35, 35, 35, 3, 89, 89, 89,208, -228,100, 26,156,140, 89,121,196,144, 1, 62,159,143,148, 88, 3,140, 70, 99, 82, 89,214,172,146, 70, 29, 2, 88,172, 86,171, 77, - 34,171, 48,221,214,214,118,177,173,173,173,201, 71,107,115, 9, 47, 49, 83,120, 7, 82, 16,222,161,201,111,191,253, 22,222,169, - 83,167,184,226,196,138, 88, 44, 70,126,190,117, 81, 66, 74, 26,197, 88, 30,206,146, 44, 90, 69,211,173,225, 52,117, 95,154,156, -224,139,166,155,192,227,241,192,178,236,159,210,255,110,209, 98, 62, 58,176, 60, 34,231, 53,235,114, 25,129, 67,203, 51, 18,177, -162, 45, 90,166,107, 33, 20, 10,113,248,240, 97, 12, 31, 62, 28, 70,163, 17, 50,153, 12, 54, 54, 54,144,203,229, 56,120,240, 32, - 76,225, 31,172,201,162, 94,175,223,185,120,241,226, 89, 27, 54,108,144, 82, 74, 33, 18,137, 10,133,214,252,249,243,213, 58,157, -110,167, 37, 66,171, 48,226, 59, 75,195,170,187,148, 62,234,176,184, 99, 74,240,215,178, 95,184,112,225, 80,150,101,123,160, 72, - 8,135, 34,251,189, 22,250,161,180,240, 14, 0, 28, 22, 46, 92, 56,146,101, 89,211, 0,154,215, 70, 23,154,237,103,122,151,248, -247,237,219,119,123,209, 81,135, 28,254,245,184,245, 15,206, 91,107,179, 64,165,164,160,189, 40, 20, 92,252,146, 69, 86,223, 64, - 87, 39,231,115,155, 87,205,183,221,117, 19, 72,136,125,137,171,135,215,102, 27, 89,189,185,120,105, 97,101,203, 91,223,211,213, - 30, 25,215,213,200, 73,139, 1, 40,238,188,185,200,234, 87,221,213,217,233,252,150,213,243, 29,247,223,101, 16, 31, 19,137,243, - 5, 98,240, 77, 68,214, 96,145,168, 71,112, 13,239, 45,253, 63,104,238, 96, 71, 12, 48, 68,135,227,199, 97, 31, 33,180,155, 14, -205,251,217,161, 81,103, 5,170,213,147,124,116,124,115, 70, 91,207, 16,242,137,165,214,173, 34, 34,171, 91,229,202,149, 23,220, -184,113,195,151,101, 89,197,133, 11, 23,114, 55,108,216,240, 50, 63, 63,127, 53,165,244,152, 21, 47, 7,115,145, 85,127,198,168, - 97,151,191,249,225, 71, 73, 88,232, 45, 44,221,121, 4,106,189,214,120, 50, 78,217,215,188, 91,177, 20, 75,201,153,213,171, 87, - 87,158, 51,103,142, 40, 35, 35, 3,105,105,105,200,204,204, 44, 92,148, 74, 37,220,221,221,241,219,111,191,233,114,114,114,174, - 91,240,178,169,240, 81,135,197, 65,161, 80, 64, 40, 20, 66,167,211, 21, 90,180,196, 98, 49,236,236,236,144,158,158,142,189,123, -247, 2, 64, 70,169, 22, 54,161, 40,145, 97, 72, 37,169, 76,166,145, 72, 36,108,113, 86, 53,107, 57, 11, 16,247,193, 7, 31,120, - 47, 92,184, 80,210,160, 65,131, 63, 89,180,202,195, 73, 41, 85,117,232,208, 65,182,122,245,106,248,250,250, 66,171,213,190, 38, -168, 24,134,129, 80, 40, 68,108,108, 44,190,254,250,107, 80, 74, 85,127,119,203, 99, 46, 90,204,197, 80,129, 15,213,159,132,144, -165, 22,163,178,186, 6,173, 29,137,104, 46,220,196, 98, 49,178,178,178,164,132,144, 65, 37, 68,176,183,216,162,101, 18, 90,143, - 31, 63,198,246,237,219,209,185,115,103, 56, 56, 56, 32, 51, 51, 19,251,246,237, 67,120,120, 56, 68, 34, 17, 8, 33,214, 88,181, -216,198,141, 27,127,123,233,210,165,110, 3, 6, 12, 8,154, 58,117,170,180, 86,173, 90,120,250,244, 41, 22, 46, 92,152, 31, 26, - 26, 26,161, 86,171, 23,194,146,192,166, 5, 17,223, 77,193, 72, 45, 26,117, 88,228,152,162, 40, 33,188,195, 7, 37,176,153,135, -126,120, 45,188,131, 57,174, 94,189,234, 87,185,114,229, 64,188, 26, 73,104,122,225,154,143, 46,124,237,101,156,152,152,216, 16, -220,168, 67, 14,127,111, 91,119,129, 16, 82, 24,176,212, 36,190,254, 52,234,240,207, 71,146,201, 3,134,141,178,221,121,147, 32, - 54, 58, 2,183,143,175, 47, 42,178, 44,105,108,218,153,199,218,144, 72,229,181, 88,242,106, 56,115, 78, 90, 44, 64,121, 86, 11, -173,162,156,160,236,231, 3,134,142,114,220,125,155, 32, 33,246, 5,174, 28, 90,103,181,200, 50,231, 28, 44, 18,125, 41,224,145, - 57, 93, 90,214, 23,182,168, 87, 3,242,148, 40, 36,197, 37, 96,239,227,212,140,136, 76,205, 39, 87,136, 14,209, 47, 52, 63,118, - 30,233,232,232,224, 46, 64,215, 49, 78,142,215,143,228,252,234,245, 62,163,163, 58,186, 56,225, 50,157, 95,108, 62,255,124,206, -234,182,182,182,203, 66, 67, 67, 93, 36, 18,137,237,237,219,183,141, 27, 55,110,140,205,207,207, 95, 78, 41,221, 99, 81,217,255, -188,221,187, 97,141,170, 23,190, 89,183, 89,162,204, 83, 33, 79,171,131,216,205,195,248,203,181,135,189, 75, 10,128, 89,148, 83, - 44, 22,239,222,179,103, 79,231,144,144, 16,223, 58,117,234, 48, 25, 25, 25, 80, 42,149, 80, 42,149, 38,171, 23, 30, 63,126,204, - 70, 71, 71,199,139,197,226, 50,243, 89, 81,163, 14,205, 57,205,194, 59,204, 2,192, 16, 66,110,221,187,119, 79,217,169, 83, 39, - 72,165, 82,228,229,229,193,199,199, 7, 6,131, 1,199,143, 31, 71,104,104,104, 30,203,178, 23, 0,220, 43,173,236,106,181,202, -135, 16,194,168, 85,170,186, 67,135, 14,109, 53,101,202,148,215,134,164,187,186,186,194,209,209,209, 42, 78, 0,200,200,200,168, -249,219,111,191,125,118,239,222,189,207, 59,119,238,108, 55,107,214, 44,177,159,159, 31,140, 70, 35, 83, 94,206,204,204, 76,187, - 59,119,238, 44,111,209,162,197,184, 78,157, 58,241,191,249,230, 27,216,217,217,193,104, 52, 66, 42,149, 34, 39, 39, 7, 11, 23, - 46,196,229,203,151, 13,148,210,117,217,217,217, 83,173,185,151,202,105,193,122,141,179, 36, 11, 80, 73, 66,168,184,253,255,142, -124, 22, 17,110,176,183,183,159, 14, 96,122, 9, 17,236, 97,233,179,105, 18, 90, 60, 30, 15, 81, 81, 81,216,184,113,227,159,226, -104,153,194, 63, 20,199, 93, 66,217,233,249,243,231,141,132,144,166,183,111,223,158, 62,100,200,144, 79,242,242,242,188,229,114, -121,130, 94,175,223,166, 86,171, 77,113,180,132,214,180, 33,121,121,121,209,197,141, 58, 44,186, 15, 96, 95, 42,103,145,240, 14, -175,133,112, 40,114,216,107,161, 31,138,134,119, 48,231,108,214,172, 89, 36,195, 48, 79, 10,186,224,159,160,200,232, 66, 51, 78, -255,196,196,196,134, 30, 30, 30, 23, 0,200,138,142, 58,252, 59,238, 37,142,243,191, 45,182, 80, 90,192,210,226,143,130,228,204, -141, 40,136,164, 25,184,255,251, 86,171, 69, 86,113,208,228,171, 34,230,238,142,169,167,213,228, 35, 47, 59,249, 41,141,220,147, -242,230, 87, 27,242, 51,183,162, 33,145,103,225,238,153,159,178,140,198,252,247,105,196,255,238,149,159, 14, 51,127, 56,113, 64, - 72,236, 28,113,255,179,225, 72,200,202,195,137,151,153,251,168, 74,243,233,142,130,185, 2,189,155,146, 75, 91,102, 39,173, 15, -233,101,247,145,179,151, 0, 43,191,216, 6,201, 12, 39, 97,163,182, 45, 45,158, 3,209,228, 32,255,253,247,223,143, 13, 9, 9, -177,249,232,163,143,158,101,100,100,188,230, 32, 95,142, 11, 29, 71, 8,249,225,216,134, 21, 95, 56,213,110,130,181, 95, 78, 51, -238,190,246,176,232, 40,196, 82, 17, 24, 24,104,188,122,245,234,148,177, 99,199,174,108,219,182,173, 87,143, 30, 61,132,149, 42, - 85,130, 88, 44,198,139, 23, 47,112,233,210, 37,221,203,151, 47,227, 85, 42,213,148, 58,117,234,148, 25,227, 44, 46, 46,110,179, - 72, 36, 66, 88, 88, 24, 90,181,106,181,184,192, 98, 21,117,245,234,213,153, 57, 57, 57,200,201,201, 65,255,254,253, 11,211,199, -143, 31, 63,179,106,213,170,200,200,200, 40,171,172,115, 9, 33, 27,240,106,174,195,164, 29, 59,118, 52, 61,116,232, 80,211,201, -147, 39, 11, 59,119,238,140,235,215,175,227,244,233,211, 58,157, 78,119, 13,192, 53, 75,167,181, 41,136, 63,116,135, 16,242,112, -233,210,165, 77,121, 60, 94, 97,196,251,176,176, 48,108,221,186,181, 60,156, 6, 0,203, 9, 33, 63,236,216,177, 99,238,153, 51, -103, 62, 30, 58,116,168,173, 94,175,199,227,199,143,241,211, 79, 63,149,151,243, 51, 23, 23,151, 57,199,143, 31,223,118,234,212, -169,158,131, 7, 15,102, 38, 78,156,136, 53,107,214,224,127,255,251, 31,107, 52, 26, 15, 9, 4,130,161,169,169,169,121,111,169, -225,217, 84, 48,173,206, 38, 43,230, 60, 44,147,247, 77,186, 6, 45,204,119,226, 27, 55, 75, 5,229,104,221,186,117,161,149,145, - 82,250,154, 95,157, 73, 96, 89,219,117, 8,192,190,224, 62, 93,135, 87,243,139,154, 71,133,231,225,143,200,241,150, 50, 6, 37, -106,236,195,160,193,227,210, 39,149,182, 7, 40,130,202, 96,203,154, 59,119,238,119,243,230,205,251,174,104, 8, 7,243,157,138, -134,126, 88,176, 96, 1, 74, 10,239, 0, 32,115,238,220,185,223, 22,180, 79,164,160,187,240, 61, 20,140, 46, 52,227,220, 94,144, - 46,155, 63,127,254, 16, 0,165,113,114,224,240,183,161, 20, 31, 45, 58, 43,236,210,110, 61, 0, 39, 16,102, 38,125,177, 55,236, -141, 27, 48,150,206, 56,187,107,254, 26, 80,100, 82,163, 97,122,133,148,128,229,205, 14,187,180,139, 5,136, 61, 8, 51,131,190, -248,223, 27,231,147,216, 57, 34,119,225, 88,252,239, 81, 2, 77,202,211,127,184, 67,171,125,205, 26, 84,224,147,213,207, 51,132, -236,117,240, 20,252,242,217,251, 78,228, 88,198, 16,171,207,147,154,154,250,141,141,141, 13,111,249,242,229, 31,171,213,234,215, - 28,228,223,224, 37, 49,141, 16,194,107, 84,221,119,194,205,231,209, 61, 44,233, 46, 44,138,102,205,154, 37,134,135,135, 15, 60, -125,250,244,128,139, 23, 47,182, 83,169, 84,149, 9, 33,144, 74,165, 81, 90,173,246,140, 88, 44,222,109,137,200, 50,127,161,152, - 79, 17, 3, 0, 57, 57, 57,200,205,205,125, 45, 12, 1,240,202,191, 42, 53, 53, 21, 62, 62, 62,214,190, 16, 47, 18, 66, 66, 23, - 46, 92,216,114,225,194,133,117, 11,172, 66, 23,203,219,101, 86, 32,120, 46, 74,165,178, 4, 66,136,183, 80, 36,206,187,122,245, -234,153, 55,228, 84, 21, 88, 74, 86,174, 92,185,114,145, 92, 46,111, 24, 22, 22,246,251,155,112, 22,136,168,222, 78, 78, 78,158, -219,183,111,223,191,101,203,150, 38,124, 62,255, 58, 33,164,111, 86, 86,214,219,158, 84,122, 52, 44,155,227,176, 76,139,145, 37, - 22,177,242,226,175, 16,110, 70,163, 81, 57,103,206,156,148,162,194,171,168,245,202,244, 95,167,211,229, 91,248, 44, 89, 51,138, -178, 12,145, 65,148, 0,240,106,238,194, 87,211,234, 88, 58,169, 52,128, 18,231,206,156, 55,111, 30, 93,176, 96, 1, 97, 24,230, - 16,128,167, 12,195, 60, 47,234,172,110,190,109,193,130, 5,152, 55,111, 30,157, 63,191,228,111, 84, 19,103,120,120, 56,229,241, -120,191, 3,136,228,241,120, 81,230,188,230,233,166, 99, 74,227,228,192,225,173, 11, 45,250,114,127, 44,128,225, 21,250,165, 24, -185,255, 12, 94, 57, 50, 86, 28,103,212,158,104, 0,131, 43,138,143, 5,150,125,210,168,245, 23, 0, 8, 5, 86, 22, 21, 89,230, - 72,184, 68, 15,121, 52, 39,139, 27,181,109, 57,185,192, 26,246,141,181,231, 43,206, 65,190, 2,196,214,159, 28,228,173, 69, 96, - 96,160, 17,192, 14, 0, 59,138, 78, 42, 93,142,151, 14,164, 82,105, 97, 55, 34,195, 48,145, 89, 89, 89, 48, 89,180,204,211, 11, -234, 4,118,118,118,229, 21, 50, 39, 8, 33,167, 40,165,198,138,168, 75,181, 90, 85,169,224, 5,199,171, 40,206,130, 65, 14,159, - 84, 36,103,122,122,122, 2,128,102,213,170, 85, 19, 69, 68, 68,104,255, 41, 13, 76, 69, 88,135,254,106, 84,180,112, 43,248, 96, -168,249, 23,212,229,211, 10, 38,252,169, 67,139, 32, 30,204, 99, 7,149, 53,169,180, 73,160, 81,252, 84, 66, 30, 41,121,165, 36, - 41,128,237, 47, 94,188,240,101, 89, 54,186, 24,203,210,107,219,230,207,159,143,146, 98, 6, 22,225, 4,128, 95, 99, 99, 99, 61, -141, 70, 99, 98, 17,222,215,210, 75,227,228,192,225, 31, 98,209,250,111, 98,167, 86, 59, 15,192, 60, 75,247, 79,188, 66,103, 3, -152,253,134, 13,232,227,138, 46, 71,121, 68,214,254,253,251,141,127, 69,157,234,245,175,122,195,204,231, 46, 52,199,144, 33, 67, - 54, 87,112,217,141,127, 65,125,254, 43, 56,255, 73, 34,139,195, 63, 27, 52, 51, 44, 22,192,151,101,238, 87,118, 52,248, 63, 9, -163,130,159,153, 0, 50, 75,208, 58,165,109, 43,141, 19, 0,114, 0,228, 20,115,108, 73,233, 28, 56,188, 85, 48, 92, 21,112,224, -192,129, 3, 7, 14, 28, 56,252, 53, 32, 0,218,149,240, 5, 97,241,104, 2, 66, 72,187,114,124,205,159,225, 56, 57, 78,142,147, -227,228, 56, 57, 78,142,243,191,197, 89, 22,119,209,209,203, 21, 53, 61,215,223, 42,174,204,243,109, 26, 9,243, 87, 44, 0,218, -113,156, 28, 39,199,201,113,114,156, 28, 39,199,201,113,150,243, 60,163,254,142,243,252,149, 11,231,163,197,129, 3, 7, 14, 28, - 56,252,139,208,222,159,120,240,141, 96, 78, 68,208,248,138,224,251,160, 26,241, 2,128,138,226,251, 47,130, 16,226, 1,160,139, - 89,210, 49,211, 96, 32, 78,104,253,123, 47,106,117, 0,179, 0,216,153, 37,223,164,148, 46, 46,178,223, 46, 0,230, 19, 18,230, - 1, 88, 72, 41,125,110,205,249,120, 60,222,226,150, 45, 91,126,122,249,242,229, 21,122,189,126, 97, 57,242,235,235,225,225,241, - 45, 33,164, 1, 0, 1, 33,228, 69,114,114,242, 98,189, 94,127,230, 13,234,160,138,187,187,251, 18, 0,245, 24,134, 17, 16, 66, - 34,146,147,147,191,214,235,245,231,223,128, 83,225,230,230,214,156, 82,234, 14,128, 39, 16, 8,210,227,227,227,111,148,119,244, - 92,223, 5,225,194,156, 60,131, 0, 0,108,229,124,253,254,121,129, 58, 75,211,184,187,156, 3,135,255,124, 67,207, 43,154,212, -177, 42, 22, 17,138,169, 70,128,116,172, 66, 86,159,140,196,212, 18,143, 47,110,192, 77, 17,206,142, 85,177,136,210, 87, 28, 29, -171,145,229, 39, 95,148, 49,184,203, 2, 78, 19, 54, 1,204, 40, 75, 38, 56,255, 11, 6, 6,189, 5,116, 49,239,226, 44, 8,192, -188,169, 76,161,213,223,159,120, 24,249,224,239, 15,163,177,166,151, 16,128,186, 0,170, 3,120, 14,224, 30,165, 52,247, 13, 5, -195,191,130,243, 31,136,185,148,210,129, 69,202,253,167,157,222,127,255,253,238,167, 78,157,146,153,166,103, 97, 89, 22, 82,169, -212, 0, 96,152, 21,245,233, 58, 96,192,128, 25, 63,254,248, 35, 62,250,232,163, 57,132,144,239, 40,165, 74, 75,143,119,116,116, -236, 83,165, 74,149, 53,155, 55,111,118,105,210,164, 41, 17,137, 68,120,241, 34,194,123,244,232,209,181,220,220,220, 14, 37, 39, - 39,127, 98,109,225,157,156,156, 6, 85,173, 90,117,229,198,141, 27,157, 91,180,104, 1, 66, 8, 66, 67, 67,189, 63,251,236,179, -186,238,238,238,123,146,146,146,198, 89,203,233,236,236, 92,163,106,213,170,109,214,174, 93, 43,109,222,188, 57, 36, 18, 9,238, -221,187,103, 51,102,204, 24,119,119,119,247,199, 73, 73, 73, 23,172, 21, 89, 15, 66,143,244, 52,232, 52, 75, 1,128, 47, 20, 79, -107,250, 93,206,145,140,208,139,221,202, 74,235,187, 0,191,114, 98,139, 3, 7, 14,230, 24,228, 9,119, 74,241,197,169,159,190, -100, 0,160,195,199, 95, 77, 28,228,137, 21, 59, 19,144, 84, 65,124, 83,135,122, 97,205,246,120, 36,191, 73, 62, 55, 1,204,103, -124,254,196, 70,141, 27, 59,143,191,114, 37, 66, 7,108,251,143, 24, 64, 70, 21,151, 94,162,208,234, 19, 68, 22,130,143, 89, 0, -200, 7,213,201,158,211,145,188, 75,237,219,183,175, 54, 98,196, 8, 82,191,126,125,132,134,134,214,216,179,103, 79, 23, 62,159, - 31, 97, 52, 26, 67, 1, 60,178, 52,170, 53, 33, 68, 0, 32,152,199,227, 53,248, 39,115,254,195, 33, 47, 40,119, 50,128,155, 38, -139, 86,209,157,206,158, 61,123,152,207,231,155, 44, 90,141,242,242,242,220,138, 88,193, 44, 65,101,189, 94,143, 39, 79,158,128, - 97, 24, 1, 0, 63,252,121, 74,141,146,174,139,183,183,183,247,250,107, 55, 67,157, 8, 95,138,204,124, 0,249, 58,136,108,220, -240,227,214, 29,142, 83, 38,141,235,109,107,107,123, 41, 39, 39,231,103, 43,110,102, 63, 31, 31,159,239,238,223,191,239, 36,147, -201,192,178, 44,114,115,115,225,238,238,142,205,155, 55,219, 79,153, 50,101,160, 84, 42, 61,175, 86,171,255,103,141, 56,175, 90, -181,106,155,135, 15, 31, 74, 77, 19, 74,107,181, 90,120,123,123, 99,215,174, 93,226,137, 19, 39,214, 20,139,197,113, 26,141,230, -165,165,156, 57,121, 6,129, 65,167, 89,186,125,221,252, 74, 0, 48,116,220,252,165,162, 92,219,227,150,164,229,228, 25,142, 1, -224,132, 22,135,191,251, 69,209,192,217,217,249, 64, 90, 90,218, 5, 0,159, 84, 68, 8, 18, 66,136, 39,159,207,247,163,148,218, - 23,252,207, 50, 24, 12,145,148,210,114, 7,212,117,174,214,166, 27,196,178,225,160,108, 93, 6, 0, 97,152,123, 70,157,106,107, -218,211,115, 71,222,136, 83, 36,253, 24,160,117, 25,128, 37, 12,115,159, 53,168, 54,167,134,159, 59,241, 79,185, 62,215,179,225, - 95,213,221,242,137, 49, 43,130,175,127, 21,120, 48, 44,152, 93, 81,176,184, 91,113, 2,208,121,210,164, 73,238,227, 62,253,148, - 12, 31, 54,172,250,133,203,151, 73, 43,107,102, 43,248, 23,162, 52,135,253, 98,133, 86,223, 32,226, 0, 96,250,158, 53,179, 24, - 62,143, 71, 6, 76, 90, 60,112,203,186,229, 76,251,110,125, 11,187, 79, 66, 66, 66, 16, 18, 18, 66,150, 46, 93, 90,253,247,223, -127,175,190,107,215, 46, 3, 33,228, 62,165,116,111, 73, 39,235, 84,141,168, 89, 64,210, 37,128,159, 55,224,203,159, 55, 54,110, -220, 24, 98,177, 24,111,194, 9, 0, 29,170,243, 94,118,110, 92,237,254,128, 9,115,163,155, 52,105, 70, 43,130,243, 95,132,155, -148,210, 30, 5, 13,152,131,143,143, 79,115,131,193, 32, 1, 0, 62,159,159, 15, 96, 2, 45,152, 58,136, 16,114,136,101,217,238, - 86, 52,144, 12,128,121,221,187,119,159, 51,126,252,120,248,248,248, 96,226,196,137,208,235,245,161,132,144,185, 0,150,148, 21, - 16,208,213,213,117,238,250,245,235, 29,249, 34, 57,234, 79,143, 68, 98,150, 1, 0, 96, 35, 6, 14,143,165,152, 56,113,162,237, -237,219,183,191, 6, 96,177,208,114,117,117, 93,184,121,243,102, 71,153, 76, 6, 74, 41,148, 74, 37,114,115,115, 11,231,100, 28, - 55,110,156,237,227,199,143,191, 5, 96,177,208,114,115,115,107,190,118,237, 90,169, 68, 34,129, 82,169, 20,234,116, 58,146,155, -155, 11,149, 74, 69,181, 90,173,110,194,132, 9,226, 71,143, 30,181, 6,240, 18, 28,254, 41,162,128, 7,224, 67,129, 64,208,171, - 90,181,106,239, 61,127,254,252,174,193, 96, 56, 8,224,224,155,126, 76, 17, 66,218,122,122,122, 46, 74, 72, 72, 88, 75, 41,221, -241, 95,169, 83, 55, 55,183,131, 87,175, 94,173,180,126,253,250, 97, 43, 86,172, 56,110,205, 51, 84,194,199,111,211, 70,141, 26, - 57,247,234,213, 75,224,238,238, 14,149, 74,133,136,136, 8,217,153, 51,103, 92, 36, 18, 73,186, 70,163,185,102,205,181,114,246, -111,110, 3,190,237,158,166,109,218,181,248,168,247,135, 10, 55, 39, 59,168,181, 70, 60,143, 78,244,249,237,248,225, 86,158,181, -186, 92,213,233,178,251,167, 61,189,162,180,150,179, 77,167,174, 45,218,181,109,171,176,179,183, 67,118,158, 14, 47,162,226,125, -207,157, 62, 18,226, 81,171,203, 69,150,232, 7, 39, 63, 56,165,122,155,215,102, 34,192,207,147, 56,213,169,219,172,254,237, 14, - 35,190,126,143, 82, 10,134, 98,117, 81,107,214, 68,128,191, 26, 48, 88,203, 7, 74, 41, 33, 88,110,110,205, 42,236, 86,100, 64, - 58,250,161,244,110, 74,211,251, 24, 16,219, 59, 58, 54, 30, 51,106, 20,201,205,201,193,189,123,247, 84, 69, 69,214,119, 94, 16, - 94,100, 80,249, 80, 44,158,189, 75,214,172,162, 93,135,166,255, 22,199,209,146,201,100,197,166,219,217,217,161, 77,155, 54, 88, -188,120, 49, 31, 64,131, 34, 10,239,245, 73, 86, 1,241,209, 13, 51, 97, 39, 23, 51, 62, 62, 62, 10, 91, 91,219, 55,230,124,149, -200,250, 53,243,161, 31,220,250,121,214,176, 51,187, 86, 6,231,229,102, 9,138,238, 98, 99, 99, 3,127,127,127,204,153, 51,199, - 50,206, 55, 87,183,127, 43,167,135,135, 71, 64, 72, 72, 72,131,179, 23, 46,216, 39, 36, 36,136, 19, 18, 18,196,167,206,158,181, -111,218,180,105, 3, 15, 15,143, 0, 51, 14,107,242,249,213,186,117,235,230, 30, 58,116,136, 9, 9, 9,129,131,131, 3,218,180, -105,131,227,199,143,243, 87,172, 88,241, 13,128, 57,101,229,147, 97,152, 22, 33, 33, 33, 4,148, 34, 41,219,128, 27,139, 3,112, -111,121, 32,114,243, 41, 50,178,115,160, 86,231, 67, 38,147, 73, 10,186,123, 45, 45,123,179,166, 77,155, 18, 0,133,226, 42, 55, -247,213,162, 84,230, 65,171,213, 65, 44, 22, 43, 8, 33, 18, 75, 57, 41,165,238,205,155, 55, 7, 0,232,116,186,194, 47,188,172, -172, 44,146,157,157, 13,173, 86, 11,129, 64, 32, 36,132,240, 45,229,180,149,243,245,124,161,120,218,208,113,243, 99,135,142,155, - 31,203, 23,138,167,105, 21, 57, 70, 75,210,108,229,124,253,219,188, 63, 9, 33, 46, 60, 30,239,167,106,213,170, 61,230,241,120, -219, 9, 33,238,111,194, 73, 8,105, 72, 8,249, 70, 38,147,157,169, 89,179,102,172, 92, 46, 63, 75, 8, 89, 66, 8,105, 90, 30, - 78, 66,136, 72, 38,147,157,253,230,155,111,246,223,189,123,247,163,223,127,255,221,239,193,131, 7,189,151, 46, 93,186,199,198, -198,230, 18, 33, 68,246, 38,207,166,159,159,223,150, 27, 55,110, 52,108,214,172,217,143,132, 16,113, 69, 60,239,132, 16, 30, 33, -164, 30,177,112,174,161,191,251,186, 19, 66, 60,235,215,175, 95, 73, 34,145,160, 93,187,118, 0,208,250, 13, 57,155,142, 25, 51, -198,125,202,148, 41,130,123,247,238,225,199, 31,127,196,161, 67,135,144,146,146,130,174, 93,187, 10,223,127,255,125,119,177, 88, -220,212, 42, 78,190,237,158, 73,159, 77,238,244,197,196,145,138,251, 49, 58,108, 61, 19,131, 95,175, 37, 34, 69, 37, 66,183,222, - 67,237, 58,246,232,215, 81, 36,182,219, 99, 45,231,140,233,211, 59,141,250,120,160, 34, 44,145,197,225,235, 73,184,254, 36, 27, - 6,129, 61, 58,247,254,196,161,110,243, 78, 93,248, 16,108,123,219,215,104, 51,208,100,210,164, 73, 46,211,150,239,188,226,217, -240,195,213,169,153, 8, 49, 23, 62, 53, 0,123, 71,185,252,195, 39,173, 90,141,148,190,154,243,177, 84,206,215,248, 26,244, 88, -147,146,137,150,230,254, 89, 45, 29, 81,189,160, 91,145,119,234,167, 47, 25, 74, 48,113,144, 39,220,203,202,231,121,224,163, 73, -147, 39, 11,236, 28, 28,176,110,221, 58,104,242,242, 94,243,153,109, 91, 9,157,206,200,248,113, 85, 2,189, 31,183,241, 37,151, -222,193, 15,192, 81, 37, 90,180,142, 29, 59, 70,187,116,233, 66, 0, 96,127, 24,205,236, 19, 68,190,237, 55,254,155, 57,132, 33, -180,114,112,179, 48,175,170, 65,121, 78, 78, 78, 80,169, 84,208,104, 52, 16, 10,133,200,207,207, 71, 76, 76, 12,174, 95,191, 14, - 7, 7, 7,171, 50,147,147,147, 3, 27, 27, 27,216,216,216, 84, 8,231,204, 97,237,196, 47, 98, 83,197, 39,175,159,111,245,253, -167,255,107, 82,181, 94,235, 7,109,251, 77,124,104,235,226,153,255,224,193, 3, 92,189,122, 21,153,153,153,104,220,184,241,187, -114, 61,111, 22,180,215, 55, 9, 33, 14, 33, 33, 33,222, 39,207, 92,116, 80,230,179,182, 81,201,122, 1,203,178,144,201, 60, 12, -123, 15, 28,206,254,168,119, 55, 66, 8, 73, 1,112,179, 64,220,222, 44,227, 70,145, 0, 8,232,211,167,207,140, 79, 63,253, 20, - 17, 17, 17, 24, 57,114,164,250,230,205,155,233,205,154, 53,115,218,188,121,179,116,202,148, 41,184,112,225,194, 60, 66,200, 47, - 0, 34, 41,165,249, 37, 52, 26, 66,161, 80, 8, 67,129,108,208, 25,217, 66,125,159,147,147, 3,170,206,132, 80, 40,228, 1,112, - 1, 96,145, 31, 29,203,178, 66,129, 64, 80, 40,178, 98,146,115, 16,147,162, 66,142, 82, 11,181,218, 0,173,154,130, 39,115,226, - 3, 81,110, 0,162, 44,172, 79,158, 68, 34,129,193, 96, 40,156,127,209,100, 41,211,106,181,200,206,206, 6,143,199,179, 1, 96, - 11, 32,195, 18,194, 87, 78,238,248,181,160, 27, 16,183,118,118,119,126,126,108,166,174,207,252,199,133,105,182,114,190,254,192, -148,154, 60, 39,239,186,151,235,125,180, 45,208,148,246, 54,253,179, 8, 33, 98, 23, 23,151,115,251,247,239,175, 89,189,122,117, - 68, 70, 70, 6,246,237,219,183, 49, 33,164,158,181,115, 50, 18, 66,100, 12,195,124, 59,124,248,240, 79, 7, 12, 24, 64,106,212, -168, 1, 62,159, 15,131,193,224, 29, 17, 17,209,102,223,190,125,211,249,124,254,102,163,209,248,185,165,126,127,132, 16, 70, 36, - 18,237,221,184,113, 99,203,198,141, 27, 99,251,246,237,184,121,243, 38,219,176, 97, 67,102,200,144, 33,240,245,245,109, 60,100, -200,144, 95, 9, 33,157,203, 99,217, 34,132,248, 14, 26, 52,168, 18,143,199, 67,179,102,205,132, 87,175, 94,173, 15,224,234, 27, -214,169,141,183,183,247,133,214,173, 91,215, 59,115,230,204, 29, 66, 72,107,107,252, 28, 9, 33, 61, 60, 61, 61,151,218,217,217, - 57, 88,209,198,170,226,227,227,167, 90, 49,135,106,147, 6, 13, 26, 32, 58, 58, 26, 1, 1, 1, 16, 10,133, 77, 9, 33,163, 1, -116, 2, 48,219,154, 25, 44, 8, 33,158, 77,155, 54,117,110,221,186, 53, 89,178,100, 9, 0, 64, 32, 16,192,104, 52,130, 97, 24, - 8, 4, 2, 4, 6, 6,146,151, 47, 95, 58, 18, 66, 60, 45,233, 70,116,174,214,166, 91,179,182,157, 90,180,108, 92,135, 89,113, -224, 57,140,172, 17, 60, 98, 0,159,176, 96,245, 98,136,133, 60,212, 8,126,143,247,228,209,253,198,206,254,237,187,165, 61, 61, -125,196, 18,206, 78,221,186,135,212, 12,168,193,124,255,235, 11,100,197, 63, 54,198,135, 95, 76, 99,120, 12,106, 54,120,223,185, - 70, 80, 61, 94,189,198,173, 5, 9,145,143,218, 56, 86,111,213, 46,227,249,133, 51,111,227,153, 92, 0,240,188,189,156, 63,236, -218,190,181, 48, 49, 33, 33,111,223,129, 35, 15, 85,122, 92, 7,128, 11, 0,233, 12,212,169,221,168, 81,171,205, 75,150, 56,121, -120,120, 8, 6, 15, 24, 96,216,116,231,206,157, 81,128,177, 36, 62,103,119,247,118, 99,198,140,225, 37, 38, 36,208,125, 7,143, - 61, 48,241, 1,128, 12,168, 93,199, 59,176, 43,242,158, 88,213, 77,217, 13, 16,185,185,187,215, 28, 61,122, 52,146, 18, 18,176, -125,199, 14,101, 62,112,205,100,197, 58,204,195,218,160,170,238,195,167,125,210,157, 84,242,112,198,152,121,155,154,182,209,165, - 84, 61,135, 63, 44, 91,230, 90,228,223, 42,178,138,138,173, 18,191,206, 15,132,209,185,182, 34,226,183,111,223,110, 38, 53, 87, -151, 23, 17, 17, 1,103,103,103,120,120,120,192,206,206, 14, 97, 97, 97, 56,123,246, 44,158, 62,125, 10,150,101, 81,183,110, 93, -171, 50,148,150,150,134,251,247,239,195,193,193,161,194, 56,171, 86,114,193,248, 74, 46,194,228,244, 28,225,153,155, 79, 27,111, -154,217, 59,136, 9,236,189, 37, 63,255, 15, 13,160,213,190, 27, 51,148,152,143, 46,244,241,241,105,190,117,235, 86,161,198, 0, - 69,141,209,215,150,229,229, 27,229, 0, 32,151,240,242, 66,151,250,127,254,213, 87, 95,229,125,252,241,199,129, 49, 49, 49,139, -203,226, 21,137, 68,139, 62,248,224,131, 47, 40,165,130, 73,147, 38, 1, 0,134, 14, 29,154,115,253,250,245, 26,148,210, 20, 66, -136,231,136, 17, 35,158,157, 59,119, 78, 54,121,242,100,158,193, 96, 8,227,243,249,148, 16,178,144, 82, 58,191, 40, 31,195, 48, -183,239,220,185, 83,217,211,215, 31,190, 78, 12, 66,230,188,154,174,205, 73,198, 34, 46,234, 5,194, 31,220,132,187,187,187,157, -135,135,199,227,128,128, 0, 93,124,124,252,116,165, 82,185,190,180, 60, 10,133,194,123,161,161,161, 30,190,190,190, 80, 42,149, -136, 75, 85, 97,226, 65, 25,114,212,175,140, 24, 2,168, 81,175,146,191, 66,202,104,111,186,185,185,233,180, 90,237,151, 89, 89, - 89,165, 78, 35, 34, 16, 8,210, 31, 60,120, 96,227,227,227,131,252,252,124,154,145,145, 65,242,242,242,144,155,155, 75,142, 29, - 59,214, 51, 49, 49,177,161,159,159, 31,241,246,246, 94, 88,189,122,117,117,124,124,252, 72, 75,124,192,246,207, 11,212, 17, 66, -140,124, 62,127,197,168, 81,163, 62,250,229,151, 95,110, 31,152, 95,179, 7,165, 84, 87,240, 64,218, 5, 7, 7,159,172, 83, 39, -200,115,199,242,218,171, 41,165,203,254, 1,183,215,240, 89,179,102,213,116,116,116,196,152, 49, 99,176, 96,193, 2,204,157, 59, -183,250,152, 49, 99, 70, 1,248,206,138, 70, 71,234,238,238,126,235,251,239,191, 15,108,222,188, 57,142, 31, 63,142,221,187,119, -227,229,203,151, 6, 63, 63, 63,126,227,198,141, 49,111,222, 60,116,236,216,113,228,132, 9, 19, 90, 17, 66,234, 91, 40, 62, 62, -158, 55,111, 94,143, 22, 45, 90, 96,216,176, 97,154,243,231,207,127, 4,224,212,233,211,167,223,191,112,225,194,129,157, 59,119, - 74,191,249,230,155,118, 83,166, 76, 25, 3, 96, 77, 57,202,223,179,101,203, 87,115, 40,183,104,209, 2, 75,151, 46,237,248, 38, - 66,139, 16, 34,114,114,114, 58,182,125,251,246,122,254,254,254, 24, 60,120,112,253,143, 62,250,232, 24, 33,164, 61,165,212,162, - 6,201,203,203,235,219, 67,135, 14, 85, 43,169,103,161, 56,104, 52, 26,199, 15, 63,252,112, 9, 0,171,132,214,174, 93,187, 48, -117,234, 84,212,173, 91,183, 78,147, 38, 77, 54,140, 30, 61, 26,125,250,244,105, 75, 8,113,163,148,230, 89, 66,196,231,243,253, -186,118,237, 42, 56,120,240,224, 43,235, 72,203,150,104,215,174, 29, 30, 62,124,136,203,151, 47,131,199,227, 65, 46,151,163,121, -243,230,162,132,132, 4, 63, 0,101, 10, 45, 70, 44, 27,222,163,107,103,197,225,235,137, 48,178, 6,188, 87,205, 22,141, 3, 93, -241, 36, 46, 7,161,143,227, 96,212, 10, 97,235,232,132,166,173, 58, 56, 38,197,191, 28, 14,160,108,127, 45,177,108,120,175, 30, - 93,108, 14, 95, 75, 64, 86, 66, 56,125,126,243,151,179,250,252,188,145, 0,112,251,247, 61, 27,220,157,164,237,107, 52,120,143, -215,186,125,119,135,131,187,147,134, 3,120, 43, 66,235, 66, 37,108,244, 21,164, 13,157, 54, 48,132, 10, 28,188,111, 42,244,250, -181,166,109, 29,129, 14,211,103,205,106,242,201,168, 81, 18,150,101,177,243,231,159,115,238,223,185,243,164,180,209,126,107, 1, -223,143,122,244, 16, 43,108,109,241,217,196,137, 80,232,245,231, 10,171, 4,104,251,217, 23, 95, 52, 31, 55,110,156,116,195,194, - 79,111,119, 28,241,117, 3,150, 82, 82, 92, 55,101, 81,156, 1, 26,142,232,209, 3, 10, 91, 91, 76,154, 52, 9, 68,167, 59,105, -218,118,148,143,115, 31,247, 12,105, 60,176, 91, 11, 16, 16,236, 62,122, 25,207,163, 83, 31,156, 75,196,139,119,228,157,108,157, -143,150, 9,185, 58, 36,183,237,210, 27,119,238,220, 1, 0,164,167,167, 35, 61, 61, 29,213,170, 85,195,154, 53,175,183, 95,229, - 17, 48, 44,203, 86, 56, 39, 0,184, 57,217, 98,112,231, 70,252,203,247,119, 75,242, 82, 83, 37, 54, 54, 54,249,239,154,208, 50, -135,193, 96,144,248,249,249, 33, 71, 13,146,173,210,219,164,237,121,101,241,119,238,127,222, 70,171,213, 50, 54, 54, 54,208,104, - 52, 18, 11, 94, 8,130, 30, 61,122,124,177,119,239, 94, 65,120,120, 56,170, 86,173, 10,157, 78,135,235,215,175,199, 21, 76,132, - 12, 74,105, 2,143,199, 75, 96, 89,182,122,221,186,117,177,120,241, 98, 4, 6, 6,146,206,157, 59, 79, 47, 16, 91,175, 61,220, -137,137,137,223,142, 30, 61,250,253,125, 7,126,113,220,216, 79,141,156,236, 28, 40,149, 74,220,187,123, 27, 25,201,249,216,180, -105, 19, 36, 18, 41, 1, 32, 76, 73, 73, 22, 78,158, 60,121,181,183,183,119,167,184,184,184,174, 37,229, 51, 33, 33, 97,209,184, -113,227,154,238,217,179,199, 62, 55, 55, 23,106,117, 62, 50,242,100,120,188,234,213, 60,190, 53, 63,123,140,117,107,215, 51,181, - 43,203,157, 85, 42, 21, 62,253,244,211,149,158,158,158,205, 19, 18, 18, 70,148,196, 25, 31, 31,127, 99,252,248,241,110, 59,119, -238,148,104,181, 90,157,209,104,132, 90,173,102,246,236,217, 51,189,114,229,202, 14,155, 55,111, 38, 18,137,180, 96,223, 56,225, -216,177, 99,247,186,187,187,239, 76, 74, 74, 26, 86, 86,119, 17,143,199, 91,181, 99,199,142, 33,253,250,245, 83, 36, 38, 38, 6, - 29, 58,116, 72, 12, 64, 93,176,139, 71,251,246,237, 43, 47, 95,190,220, 37, 56, 56,120, 58, 33, 68, 64, 41,253,230,109,222, 79, -206,206,206, 19,122,244,232,129, 37, 75,150,224,200,145, 35, 83, 28, 29, 29, 87, 46, 88,176, 0,158,158,158,227, 9, 33,171,172, -152,168,119,217,119,223,125, 23, 24, 24, 24,136,161, 67,135,106,207,156, 57, 51, 11,192,175, 0,162, 47, 93,186,228,179,109,219, -182,110,123,247,238, 93,242,253,247,223, 75,214,172, 89, 83,173,119,239,222,171, 0,140, 40,243,249,118,115,155, 60, 96,192, 0, - 44, 95,190, 28,231,207,159,239, 77, 41, 61, 94,176,233, 4, 33,164,219, 55,223,124,243,251,156, 57,115,240,221,119,223, 77,178, - 86,104, 17, 66,108,106,214,172,249,101,167, 78,157,112,233,210, 37,132,132,132,160,105,211,166, 83, 8, 33,171, 41,165,105,229, - 16, 89,140,141,141,205,222,173, 91,183,134, 84,174, 92, 25, 95,127,253, 53,190,248,226, 11,108,217,178, 37,100,240,224,193,123, - 9, 33,189,138, 62, 51,197,193,206,206,206, 70, 38,147, 97,250,244,233,244,229,203,151,153,101,237, 95,169, 82, 37,135,149, 43, - 87, 18, 7, 7, 7, 59, 75, 69,177, 68, 34,105, 86,171, 86, 45,204,155, 55, 15,167, 79,159,198,156, 57,115, 80,171, 86, 45, 68, - 71, 71,163,127,255,254,178,217,179,103,247, 1,176,213,194,151,142,157,147,147, 19, 82, 82, 82, 32, 16, 8,208,188,121,115,252, -250,235,175,208,104, 52,112,117,117, 69, 86, 86, 22, 26, 53,106,100, 18,101,118, 22,190,202,106, 57, 59,218, 33,229, 81, 60,248, - 48,160, 65, 13,103,156,123,152, 14,157,158,133,171,147, 61,146, 82,146,209,164,150, 55,180, 90, 31, 80,202,214,178,132, 81,196, - 99, 26,136, 37, 82,100,228,166, 33,254,241,249,116,157, 81, 51, 58,235,229,229, 88, 0,112,172,218,114,244,237,203,167,111,247, -237,210,210, 85,153, 87, 9,132,178,141,222,198,243,216,215, 7,149,228, 18,254,208,163, 27,103, 18, 3,203,226,131, 17,139, 26, -118,114,131, 10,201,128, 11,224,215,183,127,255,102,159,127,254,185,232, 89, 68, 4, 59,121,226,196,172,187,183,110,157,255, 13, -184, 93, 26,167, 18,168,222,190,125,123, 48, 0,126, 59,117, 42, 47, 13,136, 3, 0, 55,160, 82,247, 15, 63,108, 57,107,198, 12, -209,139,168, 40,246,122,132,242,240,139, 20,186,184,153, 35,238,239,137,126,181, 79,105, 48, 2,181, 77,188, 39, 79,158,164,234, -130,124,180,174,132,241, 29,155, 7, 55, 30,210,163, 37,226,146,210,177,244,199,195,120,240, 44,241,164, 19,139, 65,239,202,123, -184,180, 8,246,140, 5, 15,204,159,210, 84,170, 63,247, 30,188,169,128,249, 43, 56,139,195,187, 40,180, 76, 48, 77,222,172,213, -179,208,234, 89,211, 87, 45,212,106,181,165,138, 92,127,242,228,201,237, 19, 39, 78,196,202,149, 43,241,236,217, 51, 8,133, 66, -212,170, 85,203,131, 16, 98, 99,178,192, 52,104,208,192,149, 97, 24, 60,121,242, 4, 43, 86,172,192,199, 31,127, 76,175, 94,189, -186,165,184, 23, 6,165,244,110, 70, 70,198,218,209, 35, 63,206,202, 76,142,129, 94,157,137,148,248, 23,208,228,101,225,235,197, -223, 66,165,231, 35, 41, 91,135,164,108, 29, 24,177, 35, 54,108,222,202,171, 89,179,102, 39, 62,159,223,181,148,124, 94, 79, 78, - 78,222, 60,118,236,216,172,164,164,164,194,242,105,245, 20, 90,253,235,247,171, 76, 38,195,170, 85,171,236,106,212,168,209, 67, - 32, 16,180, 41,133, 51, 49, 54, 54, 54,124,236,216,177,218,228,228,100,100,103,103,227,240,225,195,221, 42, 87,174,236,176,100, -217, 74,146,167,227, 35, 41, 75,135,164, 44, 29, 68, 54,174,216,123,224, 23,158,191,191,255, 64,129, 64,208,180, 44,145,181,115, -231,206, 33,253,250,245, 83, 44, 91,182, 44,227,208,161, 67,235, 40,165,230, 23,228,201,170, 85,171,246,237,221,187, 55,247,139, - 47,190,112, 92,186,116,233, 20, 66,200,172,183,216, 88,180,233,215,175, 95, 0,203,178,216,191,127,255, 3, 74,233,119,191,252, -242,203, 45,141, 70,131,254,253,251,251, 21,116, 35, 89,194,211,112,224,192,129,159,134,132,132,224,179,207, 62,211,157, 57,115, -166, 1,165,116, 37,165, 52,138,190, 66, 52,165,116,245,133, 11, 23,234, 78,152, 48, 65,211,168, 81, 35, 12, 27, 54,236, 99, 66, - 72, 72, 25,188,205, 6, 12, 24, 16,200,178, 44,246,236,217,115,223, 76,100,153,174,227,217, 3, 7, 14, 92,215,106,181, 24, 52, -104, 80, 21, 66,200,251, 86,148, 93, 40, 22,139,247,127,245,213, 87,246,241,241,241, 24, 50,100,136,230,201,147, 39,152, 63,127, -190,212,206,206,238,184,233, 25,176, 6, 98,177,120,211, 15, 63,252,208,163,118,237,218, 24, 59,118,172,118,253,250,245, 19, 63, -253,244, 83,109,131, 6, 13,176,110,221,186, 30, 34,145,200,170,169, 69, 18, 18, 18,178,194,194,194,156,202, 90,226,226,226,146, - 45, 44,179, 76,161, 80, 92, 11, 14, 14,206,169, 85,171,214,123, 6,131, 1, 97, 97, 97, 47,182,111,223,206,214,170, 85, 11,107, -215,174,197,210,165, 75,209,181,107, 87,240,120,188, 62,214,228, 53, 47, 47, 15, 18,137, 4, 66,161, 16,161,161,161,208,104, 52, -144,201,100,144, 72, 36,224,241,120,176,183,183,135, 66,161, 0, 44, 28,141, 70, 8,104,142, 74, 15,129,128, 1,159, 97, 17, 30, -157, 13,157,158,133, 68,200,131,128, 79, 0,202,194, 94, 46,128, 68,196, 3, 67, 8,107, 33, 39,178,243,116, 16, 9, 25, 8,132, - 34,194, 24,140,210,194,151, 35,223, 40,149, 74, 69,196,217, 86, 12,137,240, 31, 52, 45, 48,121, 85, 95,195, 1,129,220,199,231, -163,229, 43, 86,136,114,148, 74,244,238,221, 59, 35,234,214,173, 29,106,224, 86,171, 50,234,148,225,243,107,180,110,213, 10,161, -119,238, 32, 55, 51,243, 57,240,202, 57, 94,228,233,217,111,213,170, 85, 34,117,126, 62,122,247,234,149,245,236,242,229,157,177, - 74, 28,181, 68,100, 1, 0, 79, 40,116, 55,241,102,103,102,102, 2,175, 66, 72,184,185,216, 44, 25, 55,176, 35,114, 85,249,152, -246,237, 14,246, 78,120,226,248, 75,113,232,242, 75, 2,178,223,165,119, 48, 33,100,148,249, 98,145, 69,203,100,117,178, 68,172, -104, 52,154, 10, 23, 64,111,202, 89,156, 72,124, 83,206,127, 34,248,124,126,254,211,167, 79, 69,182, 78,158,172,147, 66,144, 89, -249,227,203,118, 0,224,104,195,207,214, 25,245,108, 66, 66, 2,196, 98,113,190, 37, 92,249,249,249, 35, 9, 33, 95, 3, 8,226, -243,249, 71,183,110,221, 74,118,236,216,225, 48, 96,192,128, 8, 66, 72,124,112,112,176,239,214,173, 91,109, 1, 96,245,234,213, -116,239,222,189, 29,241, 42,100, 70,137, 38,229,164,164,164,249, 2,129,224,234,184,113,227,214,136, 68, 34, 7,185, 92,238,116, -233,210, 37,146,175,163,104, 56, 43,186,112, 36,162,173,148,193,197,153,182, 24, 53,106, 20,239,241,227,199,139, 1, 28, 45,133, -115,186, 88, 44,190,244,236,217,179,149,118,222,245, 92,228,190,179,236, 26,207,124, 2, 0,240,117, 22,128, 41,104, 23,179,178, -178,144,154,154,138, 79, 63,253,212, 33, 34, 34, 98, 58,128,115, 37,113,198,197,197, 93, 16,139,197,113,143, 30, 61,106, 45, 16, - 8, 68,114,185,188,225,181,107,215, 72,190,150, 69,157,233,209,200, 80,190,202,167,163, 13, 31,183,191,114,195,248,241,227,249, -207,159, 63,255, 22, 64,139, 98, 27, 51,134, 89,106, 46,178,166, 77,155,118, 15, 64, 21, 66,200,107, 93,163, 70,163,145, 12, 26, - 52,232, 33,128, 90, 95,124,241,133, 35,165,116, 10, 33, 36,131, 82,186,241,239,190,151,108,109,109,151,140, 30, 61, 26,123,247, -238, 69,102,102,230, 42, 0,200,201,201,249,110,215,174, 93,123, 70,142, 28,137,159,127,254,121, 9, 33,228, 55, 11,172, 90, 31, -244,239,223, 31, 39, 78,156,192,239,191,255,254, 37,165, 52,172,132,103,244, 25, 33,100,250,161, 67,135,190, 31, 48, 96, 0,126, -250,233,167, 78, 0, 74,115,144,109,223,177, 99, 71, 28, 63,126, 28,233,233,233,235,138,219, 33, 43, 43,107,253,225,195,135,155, -116,236,216, 17,139, 23, 47,110, 15,224,172, 5, 13,100,160,157,157,221,214,239,191,255,190, 97,237,218,181, 49,112,224,192,124, -157, 78,215,233,139, 47,190, 56,178,123,247,110,197,246,237,219,223, 27, 53,106,212, 13, 66,200, 39,148,210,235, 22,189,116,120, -188,111,214,172, 89, 51,162,117,235,214,152, 50,101,138,225,228,201,147,221, 41,165,167, 8, 33, 17,211,166, 77, 59,182, 98,197, - 10,222,242,229,203, 71,240,120,188, 84,163,209,248,182,196,245, 87,171, 87,175,110,210,161, 67, 7,188,120,241, 2,215,175, 95, -135, 78,167,251,249,218,181,107, 23,171, 87,175,254,149, 86,171, 61, 34,151,203,135, 42, 20,138,224,122,245,234,189, 79, 8,145, - 89,226,167, 71, 8,201,138,136,136,144,187,186,186, 66, 32, 16,224,254,253,251,112,117,117, 5, 0,164,164,164,160, 86,173, 90, -224,241,120,200,202,202, 2, 96,217,203,150, 16,230, 65, 68, 84, 66, 21, 71,133, 28, 48, 74,112,247, 73, 28, 92,156, 29, 96, 36, - 12,146,146, 18, 81, 47,192, 27,132, 16,100,165, 39,129, 16,242,208, 18, 78, 35,101, 67, 99, 18, 82,188,156, 20, 98,212,110,210, -193,233,218,111,169, 59,236,170,182, 24,197,231, 17,158, 88, 98,187,113,196,176, 97,206, 44, 75,145,149,158, 12, 62,195,220,124, - 27, 23,104,127, 12, 98, 91, 85,149,220,237, 48,226,235,122,132,130,170,117,216,254, 83, 50, 50,101, 64,189,213,179,103,219, 59, - 57, 59, 99,224,192,129,108,122,124,252, 25, 21, 96, 81, 96,229, 42,213,171,187,217, 40, 20,184,114,229, 10,120, 64, 36, 0,108, - 1, 2,151, 78,155,230,228,234,238,142,143, 71,140, 96,147, 99, 98,206,170, 45,232,210,125,141,183,106, 85,129,137,151, 41,224, - 77,228, 97,226, 23,221, 67,196,114,169, 24,223,108,248, 5,177,105,121,123,174, 37, 98,195,187,104,236, 40,211,162, 85,146,243, -217, 43,167,106, 89,169, 98, 69, 34,145, 20, 90, 83,172,248,210,171,112,206,178,240, 87,112,190, 69,229, 60,147, 16,114,136, 16, - 50, 51, 54, 54, 54,124,196,136, 17, 58,131, 78,147,123,245,235, 42, 51,238, 44,174, 60,246,218,124,143,177,191, 78,180,155,161, -202,206,200, 93,189,122,181, 62, 54, 54, 54,220,252,152, 50,110,150, 24, 74,233,241,109,219,182,173,223,191,127, 63,106,213,170, -133,176,176, 48,215,188,188,188,250, 15, 31, 62,116, 12, 12, 12,196,142, 29, 59,176,119,239,222,149,148,210,211,165,137, 44, 51, -107,219,153,196,196, 68,255,232,232,232,106,246,246,246,122,123,123,123, 20, 29,137,152,163,102,145,158,149, 13, 71, 71, 39,216, -218,218,250,149,197,169,209,104,142, 39, 38, 38,214, 96, 29, 2, 90,214, 72, 91,149, 29,250, 77, 37,132,126, 83, 9,199,167,123, -194,195, 94,132,204,204, 76,164,166,166, 34, 53, 53, 21,132, 16,232,245,250,154, 22,112,190, 76, 72, 72,248, 49, 38, 38,230,144, -155,155, 27, 20, 10, 5, 40,128,164, 44, 61,238, 45, 15,196,189,229,129, 72,202,210, 35, 39, 55, 23,149, 43, 87,134, 66,161,168, - 85, 82,151,145,151,151, 87,231,126,253,250, 41, 0,160, 64, 64,181,165,148,142, 45,102, 25, 99, 48, 24,154,155,246,157, 58,117, -170, 35,128,142,127,243,253,196, 35,132,140, 27, 57,114,228,123, 18,137, 4,107,215,174,125, 9, 96,167,169,173, 95,191,126,253, - 19, 0,152, 56,113, 98, 48,128, 41,164,132, 72,208, 38, 8,133,194, 6, 53,107,214,196,181,107,215, 0,224,151, 50, 78,127,224, -234,213,171,168, 94,189, 58, 36, 18, 73,195, 50,246,245,171, 84,169, 18,158, 60,121, 2, 0,119, 75,216,231,238,147, 39, 79, 80, -169, 82, 37, 16, 66,252, 44, 40,123,143, 14, 29, 58, 60, 56,119,238, 92,195,102,205,154, 97,196,136, 17,218, 27, 55,110,116,166, -148, 94,188,123,247,110,155, 65,131, 6,229,213,168, 81, 3, 23, 46, 92, 8, 28, 52,104,208, 85, 30,143,247,181, 5,156, 31, 47, - 92,184,112,102,207,158, 61,177,112,225, 66,186,111,223,190,129,148,210, 83, 5,207,215,201, 61,123,246, 12, 89,180,104, 17,237, -213,171, 23, 22, 44, 88, 48,147, 16, 50,182, 12,235, 80,182,209,104, 68, 94, 94,158, 69, 38,121, 75,247,119,118,118,254,160, 67, -135, 14,152, 51,103, 14,188,188,188,112,228,200, 17, 10,224, 40,165,244,146, 70,163,105, 73, 41, 93,145,151,151,247,235,181,107, -215,208,190,125,123, 33, 94,159, 98,164, 68, 24, 12,134,168,115,231,206,233,156,156,156,224,237,237, 13, 31, 31, 31,228,229,229, - 33, 43, 43, 11,181,106,213, 66,147, 38, 77,144,151,151,135,163, 71,143,234,178,178,178, 44, 26,176, 98,208,230,109, 63,125,236, - 96,182,147, 66, 12,111, 87, 59, 84,246,114,132, 50, 43, 13,169, 73, 9,104, 80,211, 7,173, 26, 84, 70, 90,182, 22, 39,143, 30, -204,204,205, 85,109,183,168, 23, 64,163,218,122,230,183, 35,217, 14, 10, 33,252, 3,130, 49,104,196,196,122,245,234, 55, 62,221, -168, 81,243,147,203,150,124, 83,167,109,211,154, 36, 46, 45, 31, 39,142,254,146,153,157,147,179,245,109,180,245, 11, 0, 94,190, - 93,141,139,235, 14,133,254, 24,212,105,228,143,225,113, 88, 5, 0,122, 30, 47,176,243, 7, 31, 32, 46, 46, 14, 7,247,239, 79, - 84, 1,247, 45,229,147, 74,165, 12, 0,100,103,103, 67,252,106,182, 16, 24,128,128, 46, 93,186, 32, 53, 45, 13,187,118,238, 76, - 61, 1,220,177, 38,159,221, 0,145, 76,250,202, 32,152,157,157, 13, 2,228, 0, 0,225,163,115,163, 90,213,145,154,145,131,115, - 55,195,149,149,213,248,180, 52,158,127,171, 35,124,105, 62, 90,101,217, 67,211,166, 76,153, 2,177, 88, 12, 15, 15,143, 66,113, -100, 18, 43, 34,145, 8, 30, 30, 30, 48, 24, 12,216,179,103, 15, 0,148,234,195,192, 0,154,238, 99, 23,179, 26, 61, 85, 9, 4, -130, 10,225, 44,176, 28,104,122, 79,251,137,253,237,106,241,131, 98,202,195,249, 47, 64,163,130,152, 88,141, 40,165,153, 81, 81, - 81,113, 31,245,238,158, 29, 29,241, 40, 41, 47, 43, 33, 49, 39, 61, 54, 49,246,229,195,164, 89,211,167,100,199,197,197,197, 22, -196,210,106,148,144,144,208, 29,128,165,190, 6, 83, 62,250,232,163, 31, 70,142, 28, 73,239,221,187, 7, 0, 8, 13, 13,197,176, - 97,195,232,144, 33, 67, 86, 1,152, 81,142,124,231,169,213,234,215,172, 33, 58, 35, 91,216,229,151,147,147,131,132,132, 4,104, -181, 90,139, 21,241,179,147,203,159,102, 68,221,214, 7,251,202, 17,236, 43, 71, 96, 37, 25,136, 65, 89, 40,178, 82, 83, 83,145, -156,156, 12, 0,249, 86,228, 51, 71,163,209,188,150, 79,243,174,201,156,156, 28, 36, 37, 37,193,104, 52,106, 75,120,232,216,248, -248,248,147,123,247,238,205, 5,128,101,203,150,101, 16, 66,126, 39,132,252, 80,204,178,129,207,231, 95, 49,237,187,124,249,242, - 12, 0,199,255, 70,145,213,179,118,237,218,153, 51,103,206, 92, 59,105,210, 36,108,216,176, 1,137,137,137, 51, 40,165, 6, 83, - 89,210,210,210,166,173, 91,183, 14,195,135, 15,199,220,185,115,151,215,175, 95, 63,135, 16, 82,162,127,133,139,139,139, 55,159, -207,199,157, 59,119,114, 40,165, 47,202,104,160,146,238,220,185,147, 76, 8,129,135,135, 71,213,210,246,117,116,116,172,166, 80, - 40, 16, 31, 31, 15, 20,124, 49, 23,131,168,132,132, 4, 42, 18,137,224,233,233, 89,189,172,242, 59, 56, 56, 76,251,241,199, 31, -249,143, 30, 61, 66,219,182,109,227, 46, 92,184,208,158, 82,122,190, 32,111,119, 66, 67, 67, 67,218,180,105,243,244,244,233,211, -248,246,219,111, 73,221,186,117,199,150,197,233,235,235, 59,230,227,143, 63,198,154, 53,107,176,113,227,198,177,148,210,253, 69, -202,188,123,221,186,117, 19, 55,110,220,136, 17, 35, 70,192,207,207,175, 84, 95,149,232,232,232,233,173, 91,183, 14,125,246,236, -153, 69, 51, 30, 88,178, 63, 33,164, 77,227,198,141,171,169,213,106,108,221,186,245, 69,181,106,213,110,237,223,191,127, 10,165, -180,232, 11,251,215,131, 7, 15, 98,240,224,193,168, 91,183,238, 86, 66,200, 0, 11, 94, 58, 9,209,209,209,105,247,239,223,103, -121, 60, 30,188,189,189,209,185,115,103,244,239,223, 31,117,235,214, 69, 74, 74, 10, 46, 94,188,200, 70, 68, 68,164, 89, 26,184, - 52,237,233,185, 35,145,145, 79,175,220,185,113, 81,207,231, 49,240,241,112,196,135,237,234,225,147, 62,205,209, 32,208, 11,209, - 41,106,156, 61,123, 90, 31, 25,249,226,154, 37, 35, 14, 77,156,225, 97,247,175, 62,186,115,217, 32,224, 19, 4, 6,212,192,156, - 89,211, 28, 22,205,155,110, 95,163,170, 15,238,191,204,198,233, 83, 39,244, 9,113,177,231,222,214,136,195, 11,128,208, 70, 76, -228, 60,134,129,145, 17,231,241, 10, 2, 25,215, 10, 10,242,119,115,119,199,177, 99,199,192, 0,143,173,226,179,121,213, 11,174, - 84, 42, 97,226,171, 22, 16, 16,224,227,235,139,227,199,142,129,199,178,143, 91, 89, 25, 96,244, 9, 32, 51,231, 37, 64,254,167, -149,160,168, 86,201, 53,192,193, 78,142, 27,247,159, 67,163,167, 55,119,102, 66,133,119, 16, 69,187, 13,173,233, 58, 92,182, 97, -195,134, 70, 63,254,248, 99,251, 41, 83,166,216, 12, 29, 58, 20, 18,137, 4, 42,149, 10,222,222,222, 48, 26,141,248,237,183,223, -112,251,246,109, 37,203,178,167, 81, 36,108, 0, 33,164,157,121,172,141,223, 34,168,244, 85, 16, 76, 85,163, 67,125,251, 86, 8, - 39, 0,216, 60,103,109,211, 43,107,119,172,222,127,185,215,174,147,119,200,103, 3, 90, 49, 13, 2, 42, 1, 0,220,220,220, 96, -107,107,107, 53,103, 5, 84,250, 95,206,105,222,173,155,152,152,248,132, 16,146, 50,114,228,200, 64,147,227,187, 88, 44,206,143, -141,141, 13, 55, 5, 44, 45,122, 76, 89,249, 44, 24, 25,247, 41, 33,228,112,118,118,246,201, 47,190,248, 2,139, 22, 45,194,145, - 35, 71, 66, 40,165, 87,202, 83,118, 74,169,209,207,207, 47,235,230,205,155,110,213,107,214, 71, 21, 87, 1, 90,126,249, 12,148, - 82, 56,201, 40,114,179, 50,112,247,238, 29,228,230,230,222,176, 38,159,158,158,158, 89, 41, 41, 41,206,174,174,174,200,200,200, - 64, 90, 90, 90,161,200,202,204,204, 68, 70, 70, 6, 37,228,245,152, 45,101,112,230, 85,171, 86, 77, 21, 30, 30, 46,114,171, 84, - 29, 85, 93,133,104, 60,235, 9, 64, 41,124, 28, 25,228,230,100,225,218,181,107,200,206,206, 62, 95, 18, 39,203,178,159, 15, 26, - 52,136, 7, 96,200, 23, 95,124,225, 8,160,238,180,105,211, 78, 23, 29, 89, 40, 16, 8,190,219,177, 99, 71, 45, 83, 23,227,244, -233,211, 87, 82, 74,127,252,187,238, 37, 39, 39,167,207,143, 29, 59,166,208,233,116, 88,189,122, 53, 86,174, 92,185,133, 82,250, -191, 34,245,113,140,199,227,173, 99, 24,102,220,248,241,227, 49,122,244,104,217,123,239,189, 55,197,204,234,245, 26,103,124,124, -252,156, 6, 13, 26,204, 77, 73, 73,177,200,177,255,217,179,103,163, 26, 52,104, 48, 39, 37, 37,101,105,105,215, 72, 46,151,203, -141, 70, 35, 34, 35, 35, 51, 41,165,217, 37, 92,187,252, 26, 53,106,196, 27,141, 70,111,153, 76,230, 88,214,253,153,153,153,249, -205,123,239,189, 55, 63, 57, 57,249, 20,128,175,139,134, 42,161,148,222, 35,132, 4, 79,154, 52,105,194,146, 37, 75,122, 37, 37, - 37,237, 41,139, 51, 58, 58,250,155, 54,109,218,124,249,244,233,211,109, 37,117, 1, 83, 74,215, 18, 66,116, 59,118,236, 24, 27, - 25, 25,185,184, 52, 78, 74,233, 81,148,210,149, 94, 12,119,177,251,155,115,242,120,188,105, 75,150, 44, 97, 54,108,216, 0, 74, -233,114,131,193, 80, 82, 62,239,243,120,188,237,205,155, 55, 31,186,127,255,126, 73,112,112,240,104, 0,187,203,186, 63, 53, 26, -205,245,171, 87,175, 54,137,138,138,114,110,211,166,141,208,244,129,146,149,149,133,163, 71,143,234, 34, 34, 34,210,242,242,242, -174, 91,211,134, 24,180, 57, 3,174,158, 61,180, 59,234,217,195,166,173, 59,245,112,208,234,188, 33, 78,231, 33, 43, 61, 9,191, - 29, 61,152, 25, 25,249,226,154, 74,149, 53,192, 26, 78,157, 38,187,255,181,115,135,247,196, 69,134, 55,105,217,166,179, 67,190, -214, 23, 98, 33,131,244,228,120,252,118,236, 80, 70,100,228,203, 75,249,122,205,176,183,213,206,243,252,240, 53, 47,233,246,200, - 49,221,234, 65,234,224,125, 87, 0,172,110, 14, 72,157,221,220,132, 5,207, 14,108,128,104, 75, 57,147, 1, 81,245,130, 94, 42, -149, 74, 5, 1,160, 29, 14, 8, 92, 92, 92,164, 0,240,244,233, 83,200,128, 24,107,243,169, 4,228, 50, 51, 94, 6, 80,165,243, -225, 85,205, 86, 78, 0, 32, 46, 41, 29, 90, 61,174,224, 29,133,201,162, 85,156, 83,124, 89,193, 23, 89, 0,215, 9, 33,119,150, - 46, 93,218,242,135, 31,126,104, 53,121,242,100,209, 7, 31,124,128, 91,183,110,225,204,153, 51, 90,141, 70,115, 1,192, 69,211, -112,117, 11, 50, 83,225,156,251, 95,237,247, 81, 35, 47,226,168, 99,213,191,204,249,225, 68,139,202,238,246,212, 96,100,201,195, -135, 15,113,245,234, 85,171, 57,255, 37, 23, 22, 0, 26, 17, 66, 14, 21, 36,221, 44, 26,194,161,160,187,176,145,153, 21,172, 60, -167,186,203,231,243,105, 64, 64, 0, 41,152,158, 38,236, 77,242,157,148,148, 52,112,250,244,233,167,246, 29,248,133,127,112,188, - 20,217, 89,217,175, 26,224,236, 44,164, 39, 39,224,236,217,179,186,212,212,212,209,214,112,166,166,166,126, 58, 96,192,128,125, -187,119,239,118,204,204,204, 44, 20, 90,153,153,153, 96, 89, 22, 91,182,108, 73, 77, 78, 78,158,109, 13,103, 98, 98,226,136, 47, -190,248,226,192,174, 61, 7,248,167,103, 56, 64,105,138, 62,159,151,141,244,148, 68, 28, 57,114, 68,147,150,150, 54,169,148,235, - 99, 36,132,124, 54,104,208, 32,152,196,214,181,107,215, 38, 18, 66,214,154, 94,230,132,144, 42,159,127,254,249, 0, 51, 63,174, -149,127,247,168,195,244,244,244, 69, 77,154, 52, 89,153,154,154,250, 82,167,211,237,167,148, 22, 27,165,223,104, 52,142, 39,132, - 92, 93,187,118,109,127,103,103,103,183,164,164,164, 37,214,190,232,223,116,255,152,152,152,153, 13, 26, 52,152,149,146,146,178, -164,180,253,158, 63,127, 62,174, 96,191,165, 22,156,251, 24,128, 99,101,236, 99,192,171,208, 22,223, 89, 88,158, 67, 0, 14, 89, -216, 56,111,122, 27,237,135,209,104, 92, 86,187,118,109,137,193, 96, 56, 93,150, 63, 32,203,178,163, 38, 79,158, 28, 55,117,234, -212,122, 70,163,209,210, 58,208, 3,184, 68, 8,241, 76, 75, 75,243, 3, 96, 15, 0,124, 62, 63, 43, 43, 43,171, 92, 83,240, 20, - 68,124,239,234,236,223,190,219,254,109,107,134, 83,214, 88,151, 16, 2, 30,195,187,151,171, 84,109,181,212,146, 85, 12,103, 23, -103,255,246,221,146,227,163, 63,166,172,177, 46, 64, 88, 62,159,185,159,171, 84,109, 78, 13, 63,253,214,166,224, 25,234, 5, 55, - 30,193,248, 83, 63,125, 73, 0,160,253,199, 95,213,171,108, 15, 27, 67, 22,178, 80,208,150, 39, 38, 38,194, 1,200,180,148, 83, - 6, 24,116, 5, 62,209,153, 25, 25,144, 1,234, 68,128, 87,224,119, 73,146,147,146, 96, 99, 5, 95,225, 7, 35,160, 43,194,155, - 13, 64,108,114,231,204,200,201, 3, 44,143,107,248,175,180,104, 21,253, 93, 40,184, 40,165, 22, 47,120, 53,191,222,135, 0, 22, - 23,172,229,101,236,223,238,109,112, 54,241,128,127,187,106, 36,188,115, 0, 63, 3, 64,159,138,224,180,118,249,171, 57, 1,108, -211,106,181, 52, 63, 63,159,170, 84, 42,170, 84, 42, 41,128, 67,197, 28,115, 40, 33, 33,129,198,197,197,209,152,152, 24, 26, 21, - 21, 69, 1,236,180, 54,159,182,182,182, 63,246,237,219,215, 40, 16, 8,214, 84, 68,217, 29, 29, 29, 23, 55,110,220, 88,247,253, -247,223,211, 95,127,253,149,110,222,188,153,142, 31, 63,158,214,170, 85, 75, 99,111,111, 63,160, 60,156,238,238,238,115, 2, 2, - 2,210,183,108,217, 66,119,238,220, 73, 87,173, 90, 69,103,207,158,109,244,246,246, 78, 82, 40, 20, 29,203,195,233,234,234,186, -169, 69,139, 22,186, 77,155, 54,209,211,167, 79,211, 93,187,118,209,207, 63,255,156, 6, 6, 6,106,228,114,121,111, 75, 56, 1, -240,248,124,254,138, 49, 99,198, 36,121,122,122, 30, 43,178, 77, 22, 20, 20,116,107,208,160, 65, 9, 0,166,191, 43,247, 39,199, -201,113,114,156,111,206, 57,196, 11,158,237,171,192, 64, 47,126, 73,233,197, 47,105,187, 42, 96, 7,122,194,139, 2, 60,153, 80, -216,191, 85, 72,200,114, 33,208,159, 2,188, 98,151,226,242, 9,240, 36, 60, 94,159,230,141, 27, 47, 23, 2, 3, 76,251, 74,120, -188, 62,173, 66, 66,150, 11,120,188,193, 37,242,149,194, 73, 1,158,144,207,159,222,188,105,211, 21,124, 96,150, 41,237,253, 42, -228,241,231,157, 42,209, 16, 95,242,124,176, 43,100,165,113,150, 80, 31,163, 42,186,142,255,238,165,188, 55, 2,191,162,111,194, -127, 11,231, 63, 72,104, 85, 47,232,182, 57,100,182,204, 44,230,152,153, 69,246,217, 6,160,122, 57,235, 83, 90,145,101, 7, 80, -219,217,217,249, 68,245,234,213, 83, 43, 87,174,156,224,224,224,176, 27,128,247, 27,114, 6,187,187,187,255,236,230,230,246,204, -195,195,227,190,179,179,243,119, 0, 92,222,132, 83, 32, 16, 52,118,115,115, 59,239,231,231,151,229,235,235,155,236,236,236,188, - 7,128,155,181,156, 0, 60, 80, 76,163, 2, 64, 8,192,131,123,233,112,156, 28, 39,199, 89, 84,192,116,168,138, 37,237,171,192, -208,190, 10,140, 29,252,240,157,185, 64,233, 10, 72,203, 43,138,134, 1,226,162,251,151,201, 87, 6, 39, 5,120,205, 0,155,162, -199,116,246, 70,144, 37,156,255,102,161,101,202,103, 65, 59, 63,202, 60,223,252,242,152,200, 76, 78,178, 21,220, 13,246,175,224, -252, 7,117, 27, 62, 7,202, 14,246,102, 30, 65,190, 2,206,169,174,224, 50, 60, 0,240, 65, 5,115, 62, 2, 48,164, 34, 57,117, - 58,221, 13, 88, 56,239, 91, 25,121, 75, 44,197, 23, 46, 17, 28, 56,112,224,240,122,227, 96, 60, 9,204,104,239, 79, 86,243,141, - 96, 78,188,160,241,230,155,143,252, 17,248,216, 42, 78, 0,216, 90,204,244, 60,229,226, 51,227, 4,128, 43,192,159,102,119, 56, -246,134,238, 38,255,178,119,115, 34,128, 77, 86,197,209,226,192,129, 3, 7, 14, 28, 56,188, 61,156,126, 74,185, 15,177,127, 62, -142, 21,153,227,176,208,239,147, 0,104, 87,130, 42,179,120, 36, 5, 33,164, 93, 57, 84,223, 25,142,147,227,228, 56, 57, 78,142, -147,227,228, 56,255, 91,156,102,220, 37, 13,172,120, 82,132,239,173, 12, 24,169, 40, 16,203,167, 45, 43, 7,249,191, 52,108, 2, -199,201,113,114,156, 28, 39,199,201,113,114,156,127, 47,231,191, 90, 76,189,110,205,122, 77, 32,114, 93,135, 28, 56,112,224,192, -129, 3, 7, 14,111,128,210,172,110,156,208,226,192,129, 3, 7, 14, 28, 56,112,120, 3, 16, 66, 60,240,106,138,170, 99, 5,107, -206,162,197,129, 3, 7, 14, 28, 56,112,224, 80, 65,232, 66, 41,221, 84, 92,100,120,134,171, 27, 14, 28, 56,112,224,192,129, 3, -135, 55,131,201, 79,203,218,185, 14, 57,112,224,192,129, 3, 7, 14, 28, 56,148,130,210,124,180, 94, 27,117,120,236,216, 49,218, -165, 75, 23,194, 85, 25, 7, 14, 28, 56,112,224,192,225,109,224,223,168, 69,204, 44, 88,199,138, 6,167,230, 44, 90, 28, 56,112, -224,192,129, 3, 7, 14,111, 0,147, 69,171,160,219,240,181, 52, 78,104,113,224,192,129, 3, 7, 14, 28, 56,188, 1, 74,179,104, - 49,192, 43, 51, 29, 87, 77, 28, 56,112,224,192,129, 3,135,183,133,127,179, 22,161,148,110, 42, 88,254, 52, 93,146,105,212, 97, -235,130, 2,182,230, 46, 53, 7, 14, 28, 56,112,224,192,225, 45,224, 95,171, 69, 8, 33, 30, 5,221,134, 30,127,218,246, 87, 78, -193,195,129, 3, 7, 14, 28, 56,112,224,240,174,195, 20, 63,171,184, 56, 90,156,208,226,192,129, 3, 7, 14, 28, 56,112,120, 67, -161, 85, 52,173,208, 65,158, 19, 90, 28, 56,112,224,192,129, 3, 7, 14,127, 13,254,210,200,240,132,144,118, 28, 39,199,201,113, -114,156, 28, 39,199,201,113,114,156,239, 58, 76, 17,225,139, 90,183,184,240, 14, 28, 56,112,224,192,129, 3, 7, 14,111, 40,178, -204,125,179,204,255,115,115, 29,114,224,192,129, 3, 7, 14, 28, 56,252, 69,224, 44, 90, 28, 56,112,224,192,129, 3, 7, 14,111, - 0,211,136, 67,243,255,156,208,226,192,129, 3, 7, 14, 28, 56,112,168, 64,177, 85, 92, 58,215,117,200,129, 3, 7, 14, 28, 56, -112,224,240, 6, 40,234, 0,111,254,159, 0,104, 87,130, 50, 59, 99,197, 9,172, 30,125, 80, 22, 63,199,201,113,114,156, 28, 39, -199,201,113,114,156,239, 30,103, 89,220,214,232,143,127,146,208, 42,201, 25, 30,148,210,191,108, 1,208,142,227,228, 56, 57, 78, -142,147,227,228, 56, 57, 78,142,243, 93, 94, 0,120, 0, 24,101,182,120,152,182,113, 62, 90, 28, 56,252,219,113,128,240,144, 25, -224, 7, 74, 61,193, 19, 37, 34,241,193, 11,204,163,236, 27,115, 38, 7,249, 66,170,119,131, 65,146,138,228,251, 47,223,152,147, - 3, 7, 14, 28,222, 81, 20, 76, 38, 93,172,143, 22, 39,180, 56,112,248,183, 35, 53,208, 31,124, 44, 6, 3, 15, 80, 93, 4, 92, -130, 22, 3,120,248,198,156, 66,246,107, 24, 25,111, 80,221, 83,184, 6, 44, 1, 16,198, 85, 54, 7, 14, 28, 56, 88,135,191,221, - 25, 94, 32, 16, 36, 19, 66, 88,177, 88,124,176,184, 89,174, 57,112,168, 40, 16, 66, 60,164, 82,233, 65, 66, 8, 43, 20, 10,147, -223,201, 66,238,168, 45, 3, 99,252, 64,171,103,189,126,123,144,229,170,210, 24,253,193, 24, 58,227, 39,127,155, 55,226,228,147, - 14,249, 58,214,103,231, 77,149, 91,158,214, 80, 19, 20,111,198,249,199, 53,177, 23,137, 68,191, 17, 66,156,185, 59,244,221, 68, - 16, 33,239, 53, 20, 8,166,214, 36,228,125, 66, 8,225,106,132, 3, 39,180,254,102, 24, 12, 6,215,216,216, 88,178,121,243,230, -238,182,182,182, 17, 2,129, 96, 38, 33, 68,248, 95,169,112,133, 66,113,213,206,206, 46,217,222,222, 62,217,206,206,238, 78, 89, -233,239,168, 0,242,119,117,117,141,118,114,114,122,106,158,238, 90,183, 87,179, 26, 45,134,206,115, 14,238,217,234, 13,249,133, - 2,129, 96,166,157,157, 93,196,166, 77,155,186,135,135,135, 19,189, 94,239,250, 78, 86,102, 62,235, 6,134,215,230, 81,162, 74, -150,152,163,119, 11,141, 82, 41, 0, 94,107,104, 81,254,143,152,108,214, 13,160,239,223,139, 83,203,175,102,184,184, 93,122,161, -177, 5,195,180, 65, 62,113,127,227, 6,135, 97,198,178, 44,219, 94, 40, 20,126,198, 53,191,239, 38, 68, 12,211,252,106,247,238, - 95, 79,175, 83,103, 66, 32,208,173, 56,177, 69, 94, 97, 98,205,154, 53, 79, 16, 66,250, 87, 96,219,242,109, 96, 96, 96, 60, 33, -100, 18,119, 37, 56,252,205,239,181,250,166, 15,252,130,105,120, 60,172, 22, 90,125,171,144,230, 3,171,146, 11,253,170,144,220, -254, 85,137,114, 72, 85,114,185, 79, 21,242,126,121, 50,228,237,237,141,102,205,154,241, 98, 98, 98,164,147, 38, 77,154, 39, 22, -139, 35, 9, 33, 29,203,195, 37,147,201,110,203,229,242, 88,129, 64,240, 90, 94,228,114,249,109, 27, 27,155, 88,129, 64,208,214, - 60,221,214,214,246,170,157,157, 93,178,173,173,237,157, 18,132,208,109, 59, 59,187,100,133, 66,113,219, 60, 93, 32, 16,180, 85, - 40, 20,113,182,182,182, 69,211,223,183,181,181,141, 45,154, 94, 18, 4, 2,129,119,108,108,172,107, 92, 92,156,171, 72, 36,114, - 51, 79,143,137,137,113,141,141,141,125, 45,221, 26, 8, 4,130,247,109,108,108, 98,229,114,249,237,226,210,139,150,169, 36,152, -213,221,251,150,164, 91, 43,178, 58,116,232,112, 57, 49, 49,209,199,222,222,222,222,124,155,163,157,125,199,159,183,172,155,210, -163,115,135,177,174, 65, 31,214, 46, 39,127, 71,177, 88, 28, 57,121,242,228,121,113,113,113,210,198,141, 27,243,132,194,119, 84, -199, 31, 8, 18,130,176, 45, 89, 74, 93, 30,199,231,187,116,233,222,151,127, 55, 86,237,162, 55, 26, 29, 1, 94,107,108,171, 44, - 46, 23, 39, 95, 31,194, 82,234,246,123,148,192,165,205, 71, 19,120,103,163,248, 46,122,163,209, 9, 12, 90,149,139,243,143,107, - 35,224,241,120, 83, 86,172, 88,193, 0, 24, 79, 8, 17,253,151, 26,226,198, 94,196,171,109,117,254,205, 6,158,164,121, 5, 54, -238,193,114,185,252, 54, 33,196,255,159, 82, 78, 45,203, 62,217,243,242,229,201,193,213,170,117,157, 94,167,206,240,162, 98,171, -224,247,244, 37, 75,150, 12,121,244,232,145, 75,149, 42, 85, 70, 19, 66,152, 10,168,139, 85, 75,150, 44,153,246,232,209, 35, 79, - 63, 63,191, 5, 21,193,201,225,159,165,225, 1,180, 1,208, 5, 64, 91, 0,141, 10,126, 55, 44, 88,186,224, 85, 20, 5,243,117, -195,130, 99, 77,219, 27,151,192,209,165,152,227, 26,154,165,155,255, 47,250,219,132,250, 5,235, 46, 5,163, 13,187, 20,110,161, -148,226,232,209,163,212,124, 93,116,233,231,135,249, 19,154,121,169, 30, 31,217, 69,149,177, 47,105,102,248, 93,122,119,211, 55, -116, 66, 67, 23,213,192, 42,248,214, 74,207,124, 74, 41,165, 59,119,238,164,103,207,158,165, 89, 89, 89, 52, 44, 44,140, 54,106, -212, 72, 45,147,201,126, 7,224,103, 13,159, 66,161, 72,254,253,247,223,105,135, 14, 29,178,109,108,108,150, 3, 96, 40,165,176, -181,181, 77,190,114,229, 10,237,208,161, 67,182, 66,161, 88, 5,128, 71, 41, 69,239,222,189, 83, 40,165,212,197,197, 37,161, 56, -190, 30, 61,122,100, 82, 74,169,157,157, 93,114, 65,126,121, 10,133, 98,213,184,113,227,148,183,110,221,162, 14, 14, 14,166,116, -198,214,214,118,249,248,241,227,149,161,161,161,133,233,101, 45,142,142,142,177, 70,163,145, 30, 57,114,132,186,186,186, 22,230, -193,193,193, 33,214,104, 52,210, 67,135, 14,149,152,183, 82,234,148,177,177,177, 89, 54,120,240,224,220,168,168, 40,234,228,228, -148,108,150,190,124,232,208,161,185, 49, 49, 49,212,217,217,217,162, 60, 58, 57, 57, 37, 95,189,122,149,246,234,213, 43,199,188, - 78,157,156,156,146,175, 93,187,102, 74, 95,102, 74, 47,109,241,244,244, 28,237,234,234,154,224,234,234,154, 96,111,111,191,200, -195,195, 35, 41, 53, 53,149, 82, 74,105,213,170, 85, 83, 40,165,112,169,243, 97,179,234,205,135,204,115, 13,238, 62,121,195,254, -107, 55, 46, 62, 76, 79,173,211,126,236, 50,187, 58, 61,236,172,168, 3, 63,137, 68,242,123,203,150, 45,213, 81, 81, 81, 84,169, - 84,210,219,183,111,211, 75,151, 46,209,199,143, 31,211,130,251,238,221, 26,233,178, 46,200,155,110, 12,216, 19, 54,215, 39,252, -226,146, 78,122, 26,117,150,238, 26,238,162,191, 48,217, 43,130,254, 16,248, 63,186,177,102,165,114,113,254, 80,115,215,253,217, - 62, 79,214, 44,152,168,143,142,142,166, 83,135,118, 50,156,154,224,245,130,110, 8,220, 95, 46,206, 63,174,209,128, 15, 63,252, - 80, 25, 19, 19, 67,131,130,130,242,120, 60,222,136,255,202,136,164, 70,158,240,106,231, 47,138,191,191,115, 42,219, 45, 88,150, - 94,223, 3,205, 43, 96,148, 83,176,171,171,107,218,182,109,219,168, 66,161, 72, 1,224,255, 15, 25,125, 69, 2,129,238,219,235, -212, 57,196,246,233, 99,220, 94,167,206,161, 64,160, 59, 94,133, 19, 34, 0,102, 44, 93,186, 52, 84,175,215,135,110,221,186, 53, -180,123,247,238,161, 0,166,190,225, 57,191,255,246,219,111,169, 94,175,167, 91,183,110,165,221,187,119,167, 0, 86, 91,122,188, -141,141, 77,245,218,181,107,239, 8, 10, 10,138,169, 91,183,174,182,102,205,154,249,254,254,254, 81,193,193,193,219,196, 98,177, - 31, 55,170,238,239, 89,202,208, 34,141,102,204,152, 49, 19, 0,157, 49, 99,198, 76, 74,105,151,130,118,189,139,249,239,162,107, - 74,105, 59,243,255,197,113,152,150,226, 56,139, 59, 71,145,223, 69, 71, 29,122, 20,252, 31, 85,184,205, 84,168,163, 71,143,182, - 58,122,244,232,133,162,133,235, 91, 5,205, 38, 52,243, 82,171, 83, 19,233,195,111, 62,163,231,218,120,211, 43,173,221,233,211, - 41, 31,210,196,157,171,232,167,245, 28, 84,125,170,160,141,181, 66,235,224,193,131,244,208,161, 67,244,248,241,227,244,225,195, -135, 52, 61, 61,157,238,220,185,211,232,228,228,164, 22,139,197, 75, 0, 72, 45,225,179,181,181, 77,166,148, 82,141, 70, 67, 23, - 45, 90,148,175, 80, 40,238, 0,112, 43, 16, 74, 52, 43, 43,139, 46, 89,178, 36,223,206,206,238, 62, 0, 79,103,103,231,216,151, - 47, 95, 82, 55, 55,183, 98,197,140,131,131, 67,242,147, 39, 79,168,131,131, 67, 50, 0, 47, 7, 7,135,135,135, 15, 31,214, 81, - 74,105, 92, 92, 28,117,116,116, 76, 6,224,230,228,228,116,247,232,209,163, 58, 74, 41, 77, 72, 72,160,142,142,142, 22, 11, 45, -181, 90, 77, 79,157, 58,245, 90, 30, 76,233, 39, 78,156,120, 77,128, 89, 80,159,110,118,118,118,161,123,247,238,213, 26,141, 70, -250,240,225, 67,106,103,103,151, 12,192,205,222,222,254,206,254,253,251,181, 70,163,145,134,135,135, 91, 44, 6, 43, 87,174,156, - 66, 41,165, 6,131,129,110,216,176, 65, 99,170, 83, 83,186, 86,171,165,235,215,175,215,216,218,218,134, 2,112, 43,141,203,217, -217, 57, 65,171,213,210,172,172, 44,218,184,113, 99,229,149, 43, 87,104, 78, 78, 14,165,148,210, 2, 62, 4,180, 26,241,213,141, -103,202,156,143,167,173,219,231,215,104,224, 55, 39,111,198,199,253,248,235,237, 80,231,224, 30,157, 44, 40,191, 84, 40, 20, 46, -241,240,240,200, 63,123,246,172, 81,171,213,210,231,207,159,211,171, 87,175,210,235,215,175,211,219,183,111,211,135, 15, 31,190, -123, 66,107, 63,120,116, 99, 64, 15,186, 49, 32,116,219, 96,231,180,220, 59,187, 41, 61, 61,137,190,248,170, 10,157,219, 73,145, -203,110, 12, 8,165, 27, 3,251,208,249,173,248, 86,113,110,170,217,141,110, 12, 8,253,182,175,111,250,221,208, 91,244,194,133, - 11,116,253,170,165,116, 66, 59,175, 60,118, 99, 64, 40,253,161,102, 47,171, 56,205, 22,177, 88,252,236,242,229,203,244,226,197, -139,116,193,130, 5, 84, 38,147,197,188,121, 61,212, 20,210, 31,252,125,233,102,255, 86,116, 75, 13, 15,122,190,124,121,251,171, - 69, 86,123,127, 81, 92,218,221, 95, 41,205,120, 78,147,150, 7,209, 78, 1,130, 55, 18, 91, 5, 34, 43, 53, 42, 42,138, 38, 37, - 37,209,149, 43, 87, 82, 91, 91,219,127,180,216, 10, 0,122, 0,152,185,108,217,178, 66,145,181,110,221,186,208, 7, 15, 30,132, -250,248,248, 28,127,131,115,173, 94,182,108, 89,161,200, 90,183,110, 29,125,240,224, 1,245,245,245,141, 45,235,216,193,131, 7, -203,154, 53,107, 22, 58,104,208, 32,213,182,109,219,104, 84, 84, 20,189,127,255, 62, 93,182,108, 25,157, 55,111, 30,253,233,167, -159,104,175, 94,189,242, 26, 55,110,124,163, 79,159, 62, 18, 43,243,198,167,148,138, 10, 22, 1,165,212, 36, 52,249, 0, 4,166, -143,127,110,121, 93,104,149,164, 69, 74, 18, 83, 37, 9,172,162,219, 74, 17, 98,165, 10,182,178,206, 87, 84, 84, 21,183,152,155, - 86,207,119,233,210,229, 79,190, 49,124,138,133,163, 62,255, 74, 18,185,109, 37,146,247,174, 5, 47, 43, 25,130,220,116,104, 46, - 31,131,254,242, 97, 12,105,218, 84, 42, 37,228,107,107,109,128, 18,137, 4, 82,169, 20, 98,177, 24, 89, 89, 89,120,241,226, 5, -154, 53,107,198,220,190,125, 91, 50,106,212,168, 73, 82,169, 52,134, 16,210,211, 2,115, 49, 0,224,234,213,171, 24, 57,114,164, -120,199,142, 29,117, 93, 92, 92,238, 25,141, 70, 17, 0,132,135,135,163, 95,191,126,226,221,187,119,215,242,244,244,188,163,211, -233,100, 98,177, 24, 60, 30,175, 68, 62,145, 72, 4,189, 94, 47,174, 81,163,198,253,123,247,238, 5,119,237,218, 85, 16, 29, 29, -141,151, 47, 95, 66,175,215,139,252,253,253, 31,220,185,115,167,110,151, 46, 93, 4,177,177,177,136,142,142,134,165, 62,159,132, - 16,104,181, 90,136,197, 98, 48, 12,243, 90,186, 70,163,129, 72, 36,178,152, 75, 32, 16,188, 31, 24, 24,248,224,222,189,123,245, -123,244,232, 33,188,117,235, 22,226,226,226, 96, 52, 26, 69, 53,107,214,124,112,239,222,189,122,221,187,119, 23,222,191,127, 31, -201,201,201,175,157,175, 12, 63, 26, 0,192,189,123,247, 48,104,208, 32,209,111,191,253, 86,207,195,195,227,190,193, 96, 16, 1, -192,131, 7, 15,208,175, 95, 63,209,201,147, 39,235, 87,170, 84,233,126, 25, 93,137, 60, 0,208,235,245, 24, 61,122,180,220,214, -214, 22,177,177,177, 96, 89, 22, 70,163, 17, 0,144,158,153,254,224,222,131,135,225, 67, 6,244,109,165,214,105, 52,215,110,222, -126, 92,181,178,175, 55, 33,180,114, 25,117,217, 83, 38,147,197,124,251,237,183,147, 35, 35, 35,197, 1, 1, 1,204,253,251,247, -145,149,149, 5,145, 72, 4,137, 68, 2,177, 88, 12,129, 64,240,238, 25,209,115,130,156,192,162,125,116,170, 86, 44,182,247, 86, -216,120,248, 3, 49, 23, 81,197, 69, 12, 30,195,147,220,122,169,146, 3,180, 61,124,210,156,172,227,100,219,191, 76,209,138,245, -142,181,108, 60,189,125,144,158,158,142, 74, 85, 3,145, 47,114, 17, 93,125,158,103, 3, 98, 37,231, 31,215, 42,164, 70,141, 26, -238,213,171, 87, 71, 90, 90, 26,234,215,175, 15, 7, 7, 7, 7, 66, 72,251,114,215,193,182,202, 98,228,160, 57,192, 44,135,145, - 44,128,158,191, 24,207, 83,235, 99, 83,131,127,204, 5,111,236, 69,188,108,109, 68,215,119,239,217,235,229,228, 83, 19, 56,246, - 49,220,236,197,216, 50,182,190,163,139,157,248, 80,121,186, 17, 9, 33,193,110,110,110,103,111,220,184,225, 44,145, 72,112,231, -206, 29, 4, 5, 5, 97,229,202,149, 46, 14, 14, 14, 23,255, 9,221,136,148, 82, 26, 14, 28,249,246,254,253,173, 59, 34, 34,142, - 14,174, 86,173,235, 32,127,255, 69, 99,250,247, 31, 49,113,226, 68, 44, 93,186, 20,135, 14, 29, 66,243,230,205, 49,106,212, 40, -125, 76, 76,204,246,114,118, 23,174, 93,190,124,249,132, 73,147, 38, 21,229,212, 69, 71, 71,127, 91,218,177,193,193,193,222,207, -158, 61,139,159, 50,101, 74,253, 29, 59,118, 72,101, 50, 25,178,178,178,176,121,243,102,204,156, 57, 19,132, 16, 80, 74,241,211, - 79, 63,201,134, 15, 31,222, 40, 34, 34, 34,190,114,229,202,150,184,117, 16, 0, 18, 0,178,130, 69, 14, 64,182,123,247,110,187, - 30, 61,122,216, 22,164, 73, 1, 72, 9, 33, 98,112, 40,138, 98,181,136,217, 53, 63, 90,228, 94,235, 90, 52,173,232, 54, 74,105, -215,210, 56,172,188,183,139, 59,223,177,162,145,225, 95,123,167,154,253,110,125,236,216,177, 11,127, 34, 5,234,184,251, 5, 32, -251,244,126, 72,249, 4, 82, 94,193,194, 39, 96, 94, 60, 64, 37,137, 0,122, 74,131,203, 35,180, 76, 98, 75, 42,149, 66, 40, 20, - 66,169, 84, 66,175,215, 99,214,172, 89,226,211,167, 79, 59, 49, 12,243,191,178,120,204, 5,211,211,167, 79, 81,179,102, 77,114, -228,200, 17,183,241,227,199, 75, 1, 64, 36, 18, 33, 59, 59, 27,213,171, 87, 39, 39, 78,156,112,157, 61,123,182, 77,105, 98,134, - 16, 2,161, 80,136, 73,147, 38, 73,111,222,188,233,232,233,233,137, 23, 47, 94, 32, 35, 35, 3, 54, 54, 54,152, 52,105,146,244, -198,141, 27, 46,158,158,158,136,138,138, 66,118,118, 54,108,108,108,172, 22, 90, 66,161,240,181, 99, 8, 33,208,233,116, 16,137, - 68, 22, 11, 34, 59, 59,187, 93,161,161,161, 46,118,118,118,184,127,255, 62, 12, 6, 3,236,236,236, 48, 97,194, 4,105,104,104, -168,139,189,189, 61,194,195,195, 77,150, 63,171,242, 8, 0, 44,203, 34, 60, 60, 28,149, 43, 87,198,197,139, 23, 93,199,140, 25, - 35, 49,165, 63,127,254, 28,222,222,222,184,120,241,162,171, 92, 46,223, 85, 18, 23,203,178, 72, 76, 76,196,163, 71,143,240,226, -197, 11,164,166,166, 34, 45, 45, 13,185,185,185, 48, 24, 12,175,252,236,114,115,142,237,222,119,228,158, 84, 42,149, 5,249,215, -240,121,240, 48, 44, 69, 42,149,202,124,125,124,252, 9, 89,192,148,146,207,255, 69, 68, 68, 56, 13, 31, 62, 92,248,236,217, 51, - 36, 36, 36, 64, 32, 16, 20,222, 91,166, 69, 44,126,199,218, 50, 66, 8,136,182, 6, 8,169,127,253, 69,158, 99, 72,215, 1, 66, -188,252, 13, 96,245, 0,195, 71,235, 58,222,252, 67, 15,242,220, 64, 81, 7, 26, 4, 2, 22, 92,120, 66, 8,160,171, 14,144,247, - 78, 61, 51, 56, 53,255,112,172, 48, 62, 62, 30, 66,161, 16, 98,177, 24,245,223,239,205,223,125, 79,239, 14,130,186,208, 33,192, - 34, 78, 51, 72,165,210, 47,231,205,155, 39, 55,231, 28, 49, 98,132,220,206,206,110, 94,185, 69, 86,158,172, 41, 12,116,210,163, -120, 85,229, 69,199,146,106, 70,164,168, 3, 64,233, 20, 64, 95,239, 77,197, 22, 33,164,181, 68, 34,121, 73, 8,105,241, 70, 34, - 75, 33,186,182,103,207, 94, 47,199, 74,175, 68, 22, 12,249,128, 64, 10,119, 23,123,108,153,220,198,209,197, 94,106,149,216, 42, - 16, 89,191, 95,191,126,221, 89, 34,145, 32, 52, 52, 20, 66,161, 16, 18,137, 4,181,107,215,198,198,141, 27, 93, 28, 29, 29,255, - 81, 98,107,201,253,251,219, 22, 63,122,244,116, 70,112,112, 96, 79,185,220,113,220,160, 65,118,179,103,207, 62,122,248,240,225, -173, 93,186,116, 73,187,121,243,230,119,148,210,253, 86, 94, 31, 66, 8, 89,183, 98,197,138,113, 38,225, 54,123,246,236,159, 14, - 31, 62,188,184, 75,151, 46,137, 55,111,222,156, 66, 41, 93, 87, 26,135, 82,169, 60, 60,103,206, 28,187, 15, 63,252,208,244, 31, -151, 47, 95,198,246,237,219, 33,151,203, 95,219,183,123,247,238, 24, 57,114,164,131, 86,171, 45,245,157,228,230,230,214,246,250, -245,235, 65, 0,132, 0,196, 38,161,245,240,225, 67,251,156,156, 28,123, 27, 27, 27,123, 15, 15, 15,133, 73,108,125,248,225,135, -246, 2,129,160, 5, 56,160, 44, 45, 98, 46,116, 44, 73, 43,239,254,150,138,173, 34,255, 19, 75,154,231,240, 53,161,213,165, 75, -151, 11, 0, 90, 22,183,147, 46, 35, 25, 98, 24, 33,229, 17,200,120,102, 98, 11, 44,248,217, 41, 40,207, 0,222,162, 47, 67,169, - 84, 10,137, 68, 2,129, 64, 0,189, 94,143,236,236,108,171, 68,129,173,173, 45,108,108,108,160, 86,171, 97, 48, 24, 32,145, 72, - 76, 98, 4,182,182,182, 16, 8, 4,133, 47,225,162,214,164,162,214, 28,161, 80, 8,185, 92,142,196,196, 68, 68, 71, 71,131,101, - 89,216,216,216, 64, 46,151, 67, 36, 18, 33, 33, 33, 1, 9, 9, 9,160,148, 66, 46,151, 67, 46,151, 91, 44,142, 0,192,104, 52, - 66, 36,250,179, 31,176, 94,175,183,202,162,101, 48, 24,240,248,241, 99,196,196,196, 64, 34,145, 20,150, 85, 44, 22,227,249,243, -231, 72, 74, 74,130, 76, 38,131,173,173, 45,236,236,236, 44,230, 53,149, 69,161, 80, 64, 42,149, 34, 51, 51, 19, 42,149,170,176, - 78,109,109,109, 33,151,203,145,157,157,141,148,148,148, 82,203,110, 52, 26,145,144,144,128,212,212, 84,196,198,198, 34, 45, 45, -173, 80,108,177,236,155,199,191,188,120,241, 34, 94,188,120, 97,234,154, 42,188,190,230,107, 83,190,223, 25,172, 15,182,131, 94, -208, 33, 77,169, 23,167,234,132,118,110,193,237,128,151, 39, 0,134, 15, 72, 28,208,164, 86, 21, 68,103, 26,229, 79,146,181, 18, - 16,116,196, 58,127, 7,139, 56,141,130,246,169,185,122,113,148,206,197,182,102,157, 6, 72, 78, 78,134, 88, 44,134, 88, 44,198, -123,205,219,225,101,186, 81, 22, 22,175,150,129,162,131, 69,156,127, 60,163, 85,109,108,108,154,182,104,209,130,152,115,118,238, -220, 25,132,144,218,132,144, 64,171,202,191,166,154, 8, 58, 89, 19,240,233,164,176, 68,149,231,161,135,249,254,221,122,246,118, -252,254, 76, 74,205,199, 73, 26, 63, 80,253,231,160,186, 6,229, 21, 91,132,144, 86, 10,133,226,232,154, 53,107,252, 36, 18,201, - 9, 66, 72, 72,121,120,108,164,188, 13, 95,142, 27,224,229, 96, 18, 89,122, 21,192,151, 2, 2, 41,192,151,194,221,213, 25, 95, -143,108,239, 40,147, 8, 14, 90, 33, 88,119,175, 91,183,206,165,168,200, 50, 45,245,235,215,199,220,185,115, 93, 28, 29, 29,119, -189,229,111,129, 14,246,246,246, 59,218,181,107,119, 61, 65,161, 24,153,216,160,129,232,119, 59,187,236,182,217,217,118,190, 15, - 31,234, 2,128, 7, 0,214,199,198,198,118,178, 84,100, 17, 66,250,219,217,217,133,182,107,215, 78,167, 80, 40, 98, 86,174, 92, -249,233,248,241,227,177,116,233, 82,204,153, 51,103, 51,128, 79, 40,165,179, 98, 99, 99, 61,203, 18, 89, 0,144,148,148, 52,112, -250,244,233,105,105,105,105, 0,128,218,181,107, 35, 43, 43, 11, 83,167, 78,197,103,159,125, 6, 0,168, 87,175, 30, 40,165, 72, - 78, 78,198,242,229,203,147,147,146,146,134,149,209,182,199,238,223,191,191,145, 78,167,243, 46,232, 30, 20,103,101,101,217,102, -100,100, 40,116, 58,157,156,101, 89,185,189,189,189, 13, 0,217,144, 33, 67,248, 97, 97, 97, 53, 13, 6, 67, 60,167,173,254, 64, -105, 90,164,156, 56,246, 38,150,171,226, 44, 98, 37,220,159,165, 91,180,186,116,233, 66,204,215,175, 89,140, 8,238,199,220,190, - 8,199,224, 6,175, 89,179,100, 60, 2,169,173, 29, 94,198, 70, 67, 8,242,200,218, 66,152,132, 85, 81,177,149,157,157,141,177, - 99,199,170, 63,250,232,163,116,150,101,123, 91, 42, 10,236,236,236, 96,103,103,135,176,176, 48,218,171, 87,175,228,149, 43, 87, -170,205,133,214,211,167, 79,105,135, 14, 29, 82,230,205,155,167, 44, 77,104,153, 44, 90, 75,150, 44, 81,183,110,221, 58,245,209, -163, 71,212, 36,166,108,108,108,176,124,249,114,117,155, 54,109,146,111,221,186, 69, 77,105,214, 88,180, 24,134, 41, 20, 90,230, -199, 48, 12, 3,150,101,173, 18, 90,121,121,121, 3,187,116,233,146, 28, 30, 30, 78, 77,229,180,179,179,195,202,149, 43,213,237, -219,183, 79,126,244,232, 17, 53,165,217,218,218, 90, 44, 6, 77,231, 87, 40, 20,176,181,181, 69, 88, 88, 24,237,208,161, 67,242, -234,213,171,243,205,211, 31, 63,126, 76,187,119,239,158,156,155,155, 59,176, 52,139,214,139, 23, 47, 10, 45, 88,249,249,249, 72, - 75, 75, 67,108,108,108, 97,215,161, 90,110,219,105,192, 71,221,234,170,213,106, 85,216,211,103, 49,181,107, 5,185,170,213,106, - 85,116, 76,204, 83, 74,231,177,165, 60, 8,189, 63,254,248,227,244,153, 51,103,170,115,114,114,138, 21, 89,166,245, 59, 5,134, -117, 7,161, 45, 46, 61, 83,218,183,239,214, 79, 68,146,110, 2, 58, 37, 32,118, 0,196, 14,224,203,157,240, 65, 72, 61,222,182, -235, 57,238,160,108, 51, 8,197,222,101,114, 10,168, 27,192,134,156,126,154,239,208,162,207, 4, 81, 70, 70, 6,120, 60, 94,161, - 40,146,201,229,104,219,115, 8,243,211, 77,141, 59, 64,155,131,240,188, 45,205,174, 72, 36,154,246,229,151, 95, 10, 51, 51, 51, -193, 48,204, 31,156, 50, 25,198,140, 25, 35,182,181,181,157, 99,113,217, 15, 4, 9, 33, 16, 55, 1,232,103, 79,146,242, 61, 15, - 63, 80, 7,124,190,100,139, 52,184, 94, 35,140,110,237, 42, 93,114, 44, 37,248, 94,172,186, 10, 96,156, 12,131,246, 61,107,197, - 22, 33, 36, 68,161, 80, 28,187,125,251,182,172,115,231,206, 88,190,124,185, 92, 42,149,158, 32,132, 88,221,240,231, 41,141,227, - 23,174,254, 57,249,254,119, 29, 1, 93,222, 43,129,101,182,164, 40, 89,204,221,114, 54, 91,175,167, 3, 44,229, 84,171,213, 67, - 63,249,228,147,244,131, 7, 15,254, 73,100, 73, 36, 18, 68, 70, 70, 98,209,162, 69, 25, 25, 25, 25,195,222,166,200, 26, 63,126, -252,162,184,184,184,128,211,167, 79,243, 83, 83, 83, 93, 87,252,248, 99,246,129,236,236,140,197, 15, 31, 62,153, 85,171, 86,141, - 25,117,234, 12, 43, 41,244, 67, 73, 34,107,220,184,113,187,227,226,226,234,159, 57,115, 70,144,154,154,234, 61,110,220, 56, 44, - 91,182, 12,115,230,204,217, 8, 96, 52, 45,112,150,177, 20, 90,173,246, 73,102,102,102,215,142, 29, 59,102,101,102,102,162, 78, -157, 58,232,214,173, 27,220,221,221,225,233,233,137, 30, 61,122,192,223,223, 31,233,233,233, 24, 48, 96, 64, 70,106,106,106, 71, - 74,233,139,210, 56,211,211,211, 35,118,237,218,245,116,194,132, 9,245,227,226,226,106, 2,112,202,205,205,149,231,230,230,138, -181, 90,173,212,193,193,193,161, 94,189,122,206,163, 70,141,178,185,123,247,110,205,184,184, 56, 37,128,104, 78, 94, 21,138,172, - 18,181, 8,128,212, 2,193,163, 45,178, 78, 45, 99,155,165,199, 22,251,219,130,253, 94, 19, 91,230,203,159, 44, 90, 37, 65, 7, -204,221,190,127, 91,190,200,167, 58,236, 2,234, 66, 38,145, 64, 42, 18, 65,234,224, 4, 13,203,226,199,200, 36, 85, 30,165,115, -172,173, 80,243,110, 67,137, 68, 2, 30,143,135,245,235,215, 27,154, 54,109,154,127,246,236,217, 53, 42,149,202,135, 82,250,171, - 53,162, 96,245,234,213,170, 73,147, 38,221, 75, 73, 73,169, 43,145, 72,180,166,244, 53,107,214,168,134, 12, 25,242, 48, 46, 46, -174,190, 76, 38, 83,149,228,159,101, 46,180,196, 98,177, 38, 37, 37,165,209,136, 17, 35,194,215,175, 95,159, 39,147,201, 32,151, -203, 33, 22,139,181, 41, 41, 41,117, 63,253,244,211,123,203,150, 45, 83, 73,165, 82,200,229,114,171,186,229, 40,165,127, 18, 84, -230,233,150, 66,175,215,159, 77, 73, 73,169, 59,105,210,164,187,223,127,255,125,158, 73, 0,153,231,113,197,138, 21, 42, 27, 27, - 27,171, 44, 90,166,253,228,114, 57, 86,173, 90,165,154, 48, 97,194,189,148,148,148,186, 98,177, 88,107,150,158, 55,126,252,248, -187, 41, 41, 41,117,245,122,253,217, 82,190,240,140, 57, 57, 57,224,243,249,120,248,240,161, 70, 40, 20,130, 97, 24, 60,127,254, -188, 80,104, 57, 58, 58, 6,213,173, 93, 43,240,231,221,251, 47, 72,133, 98,113,211, 70,239,213,124, 17, 21, 29, 71, 41,137, 42, -227,139,227,215,252,252,124,159,203,151, 47,175,233,216,177, 99,254,230,205,155, 13,124, 62,255, 79, 47,159,119, 79,104, 65, 6, - 2,233,179, 20,141, 66,194, 24, 8,158,254,250, 74,100, 73,236, 1,137, 3, 32,113,128,151,151, 55,110, 70,170, 20, 96, 32,130, -209,130, 24, 98,148,202, 65, 32,123,152, 12,133, 64, 36, 37, 73, 73, 73,133,130,200,180,248, 85,175,137, 59,209, 74, 27, 16, 42, - 6, 15,214,132, 32,233,234,228,228,196, 79, 76, 76,252, 19,103, 80, 80, 16, 79,175,215, 91, 30,218, 37,193,232, 1,176,227,158, - 38,229,123,252,114, 47, 47, 96,242,226,159,164, 82, 99, 22,112,123, 53,130,171,122, 98,114,159,122,162,217,135, 83,131,111, 69, -169,170,130, 71, 71,131, 85,186, 88, 33, 16, 90, 40, 20,138, 19,183,110,221,146, 41, 20, 10,188,120,241, 2,141, 26, 53,194,166, - 77,155,100, 50,153,236, 56, 33,164,181, 53,151,233,122, 18,141, 86,230, 26,155, 78,219, 31,147,116, 63,209,240,154,200, 74,205, -163,248,228,219,195, 89,153, 57,249,189,175,197,148,252,252, 20,115,207,223,205,202,202,234, 48,103,206,156,244,212,212,212,215, -238,241,232,232,104,147, 32,104, 77, 41,125,244,182,110, 79, 59, 59,187, 65,139, 23, 47,198,173, 91,183,208,185,115,103, 92,188, -120, 17, 25, 25, 25,216,115,226,196,179, 93,207,158,205, 50,249,108, 21, 23,250,161, 36,216,218,218,126,190,120,241, 98,220,190, -125,187,144, 51, 61, 61, 29,139, 23, 47,142, 3, 48,214, 90,145,101, 66,114,114,242,205, 39, 79,158,116,172, 83,167,206,227, 53, -107,214,196,121,120,120,176,163, 70,141,194, 39,159,124, 2, 23, 23, 23,227,170, 85,171, 98, 66, 66, 66, 30, 70, 68, 68,180,203, -203,203,123, 96,193,245,161,105,105,105, 87, 55,109,218,116,253,253,247,223,151, 13, 29, 58,212,229,208,161, 67, 78, 42,149,202, - 83, 44, 22,187,106,181, 90,209,227,199,143,121, 7, 14, 28,112, 15, 11, 11,139, 84,171,213, 55,203,155,247,255, 32,110, 21, 88, -167,206, 20, 89,223, 42, 99,155,165,199,150,244,187,172,253,204,175,255, 38,243,197,124, 67,153,203,160,170,152, 63,166,150, 66, -117,117,112, 19,154, 52,170, 5, 77,238, 87,147, 94,110,229, 72, 71, 84, 35,121, 67,203, 25,222, 33, 62, 62,158, 38, 39, 39,211, -244,244,116,186,119,239, 94,234,238,238,158,167, 80, 40,172, 14,239,224,238,238,158,156,147,147, 67, 27, 54,108,152,225,226,226, - 82, 24,138,192,195,195, 35, 57, 47, 47,143, 54,105,210, 36,195,213,213,117, 21, 10, 70,120,120,123,123,199, 82, 74,169,175,175, -111, 66, 73,124, 6,131,129,186,187,187,155, 66, 36, 8, 28, 29, 29,127,104,220,184,113, 70,114,114, 50,245,240,240, 40, 12,157, -224,226,226,178,188, 81,163, 70,175,165, 91,144,223,216,184,184, 56, 26, 23, 23, 71, 43, 85,170,148, 96,158, 30, 29, 29, 77,163, -163,163,169,183,183,183,213,225, 29, 92, 92, 92,150, 21,205, 75,121,243,232,227,227,147,172, 86,171,105,179,102,205, 94,171, 83, - 31, 31,159,228,252,252,124, 83,186, 69,225, 29,164, 82,233,104,137, 68,146, 32,145, 72, 18,196, 98,241,162,202,149, 43,167,236, -219,183,143,174, 90,181,138, 42, 20,138, 87,225, 29,130,186, 55,173,222,108,216, 44,151,160, 30,159,191, 73,120, 7,133, 66,241, -187,187,187,123,222,129, 3, 7,168, 70,163,161,122,189,158,154,128,119,105,212,225, 38,255,234,244,135,192,195, 17, 11,253,194, - 38,181,148,229, 63,248,186, 46,165,255,251,144,210,227,159, 80,122,118, 26,189,185,113, 20,109,230, 39, 54, 94,153, 90,233, 41, -221, 16,240,139, 69, 33, 25, 54,213,174, 78,127, 8, 60,254,108,129, 95,216,208, 16,207,252, 31,215,175,162, 55,110,220,160, 15, - 31, 62,164, 47, 94,188,160,199,127,221, 71,155, 85,149,189,226,252, 33,240,176, 53, 97, 30, 0, 52, 23,139,197,202,149, 43, 87, -210,235,215,175, 23,114, 30, 62,124,152,202,100, 50, 21, 96,225,168,101,128,208, 31,130,122, 26,214, 7, 92,154,221,222, 38, 55, -253,232, 52, 74, 31,108,163,116, 83, 48,165, 91, 27, 83,186,175, 11,165, 71,134,209,235,171,250,208,230,126, 66, 61,221, 16,112, -145,110, 12,106,111,105, 62, 5, 2, 65,206,193,131, 7,105, 66, 66, 2,189,120,241, 34,189,125,251, 54, 13, 15, 15,167, 49, 49, - 49,244,216,177, 99, 84, 32, 16,228, 3,176,122, 84, 99, 99, 55,248,182,171, 33, 76,188,183,164, 57,165,135, 6,208,212, 93,131, -104,215, 90,138,140, 38,149,248,239,191,193, 72,187,122, 78, 78, 78,105,199,142, 29,163,145,145,145,244,194,133, 11,212,213,213, - 53, 13, 64,240,219,190, 63,219,181,107,119,131, 82, 26,218,185,115,231, 80, 0,191,181,107,215, 46,244,229,203,151,161,141, 26, - 53,186,142, 82, 66, 63,148,198,217,182,109, 91, 29,165,148,118,238,220,153, 2, 72,104,215,174, 29,125,249,242, 37,109,212,168, -145,182,130, 70, 73,242, 0, 12, 19, 8, 4, 63, 58, 58, 58,158,115,112,112, 56,203,227,241, 54, 1, 24,108, 73, 59, 87, 10,167, - 39,128, 32, 0,239, 21, 44, 53, 11,210,184, 17,135,255,165, 9,167, 45,221,177,143, 31,154, 15,175, 74, 46, 12,172,130,220, 1, - 85,160,252,184, 26,185,220,219, 15,239, 91, 59,187,183, 73,104,101,100,100,208,187,119,239,210, 86,173, 90,229,201,229,242,120, - 0, 29,203, 51, 99,184,179,179,243,109, 87, 87,215, 88, 62,255,245, 70,203, 44,189,173,121,186,171,171,235, 85, 15, 15,143,100, - 23, 23,151, 59,197,113, 58, 59, 59,223,246,240,240, 72,118,118,118,190,109,126, 28,143,199,235,236,236,236, 28, 95, 52,157,207, -231,191,239,234,234, 26, 91, 52, 29, 37,204,108,238,238,238, 30,155,144,144, 64, 83, 83, 83,169,143,143, 79, 66, 81, 1,150,148, -148,244,154, 0,179,102,182,244,146,242, 82, 82,122, 73,156, 22,212,169,213,215,221,108,155,191,151,151, 87,202,138, 21, 43,168, -141,141, 77,138,249,182,128,150, 31,127,121,227,153, 50,231,147,233, 63,236,115,169,217,179,118,121,102,138, 7,208, 81, 46,151, -199,183,105,211, 38,239,249,243,231,165, 10, 45,252, 75,102,180,255, 19,231,254,154, 66,186,177,102,115,186,161,230,177,240,121, -190,143,135, 53,150,107, 66, 87,116,166,244,236, 52,122,253,135, 79,104, 83, 63,209, 43, 65,180, 49,240, 4,253,201,191, 37, 93, - 93, 85,100, 17,231,143,213, 66,232,198,192, 19, 97,115,125, 31,127,216,192, 69,187,123,219, 70,250,252,249,115,122,248,192, 46, -218,164, 74,129,200,218, 80,243, 20,253,161,102, 27,139, 56,139, 17, 91, 91,182,108,161,207,159, 63,167,191,252,242,139, 69, 34, -235, 53, 78, 51,161, 53,179,157, 77,214, 39,141, 37,154, 1,245, 68,218, 30,193, 66, 93,135,234, 66, 67, 51, 95,190,177,174, 7, -195,214,116, 1,237, 16, 32,213,208, 13, 1, 23,233,134,154, 29, 45,205,167, 72, 36,138,129, 89, 76,157,162,139, 88, 44, 78, 45, - 73,104,149,117,221, 27,187,193,183,157,191, 56,241,247,133,239,211,110,117, 20,233,150,136,172,178, 56, 1,212,115,118,118, 78, -219,186,117, 43,117,115,115, 75,181, 68,100,253, 29,247,167,157,157,221, 14,165, 82, 25,122,242,228,201,208,118,237,218,133,238, -216,177, 35,244,242,229,203,161, 50,153,108, 71, 73,161, 31,106, 22,105,255,139,114,218,218,218,134,230,230,230,210,147, 39, 79, -210,118,237,218,209, 29, 59,118,208,203,151, 47, 83,153, 76, 22,250,143,122, 54, 57,206,255,174,152,122, 21, 67,235,181,197,106, -161, 85, 81, 23, 2, 0,205,202,202,162,147, 39, 79,214, 74, 36, 18,149, 80, 40,156, 9, 64,248, 95,185, 9,157,157,157,175,186, -185,185, 37,187,185,185,189, 38,246,204,211,157,157,157,239,188,203, 15, 32, 0,127,161, 80, 24, 45, 16, 8,158,154,167,187, 4, -117,111, 90,173,249,208, 57,110,193,221, 63,120,147,124, 2, 16, 10,133,194,153, 18,137, 68, 53,117,234, 84,173, 82,169,124,183, -132, 22,165,160,171,171,138, 76, 98,235,193, 28,223,240,110,181,100,186, 77, 83, 58,208,166,149,139,136,172,173,190, 98,171, 56, - 11,196,214,221,217, 62,225,109,252,109, 12,139,231, 76,166, 77,170, 72, 95, 23, 89,214,112, 22, 17, 91, 50,153, 44,119,222,188, -121, 22, 91,178,254,196,249, 99,128, 15,221, 24,184,227,149,136, 42, 99,249, 33, 96, 51, 93, 27,224,243, 79,185,238,141,221,224, -219,214, 95,252,200, 82, 75,150, 37,156, 0,234, 57, 56, 56, 60,182,212,146,245,119,148, 29, 64,135, 49, 99,198,132,190,124,249, - 50,244,197,139, 23,161,151, 47, 95, 14,237,217,179,103, 40,128, 14,197,197,217,210,245,234,165,169,199, 48,147,203,224,236, 63, -102,204, 24,250,242,229, 75,250,226,197, 11,122,249,242,101,218,179,103, 79, 10,160, 63, 39, 96, 56,161,245, 79, 95,248,127,119, - 39,171, 68, 34, 73,177,183,183,119,177,177,177, 57,150,159,159, 63,129, 82,154,248, 95,234,100, 78, 77, 77,109,102, 77,250,187, - 8, 74,233, 83, 0,190, 69,211, 83, 30, 29,186, 6,224, 90, 5,240,235, 0, 44, 38,132,108,223,184,113,227,154,229,203,151,247, -148, 72, 36,169,239, 84, 37, 78,136,208, 98, 77,181,219, 16,137,150,212,242,146,205,248,178, 51, 37,139, 79, 94,245, 93,218,203, - 53,166, 89, 53,121, 36, 4,236,183, 32,154,155, 24, 22,165,177,146,243, 38,164,250, 37,117, 43,201,102,124,211, 3,228,219, 19, -219,124,151,245,116,138,105, 86,213, 38, 6, 20,223, 66,172,186,102, 21,231,235,215,229, 10, 33,228,131, 21, 43, 86,108, 87,169, - 84, 35, 41,165,231,172, 38, 81, 48, 73,200,211,207,131,158, 87, 11, 20,162, 82, 78,166, 2,195,123,136, 20,252, 99, 38, 19,191, -158, 68,163, 1, 4, 87,240,179,116,183,160, 59,234,159,244,124,159, 34,132, 96,215,174, 93,131, 2, 3, 3,171,134,133,133,189, - 80,169, 84, 59, 41,165,167,204,125,153, 8, 33, 71,190,189,127, 63,111,109, 88,216, 21, 45,203, 94, 41,131,115, 79, 1,231,231, -129,129,129,193, 97, 97, 97,143, 84, 42,213, 10, 74,233, 30,206,117,137,195, 63, 29,127,187,208, 82,171,213,110, 92,181,115,248, -155, 26,252, 68, 0,189,222,217, 2,154,137,173, 6, 62,210, 9, 7,199, 72, 85,160, 36, 14, 2,118,149,213, 34,171, 24,177,213, -200, 87,250,217, 47,163,165, 42, 80, 36,129,226,187, 55, 17, 89,230, 98, 11, 64,149,114, 19,244, 9,211, 1,136, 4, 33, 81,152, -143,146,157,168,231,163,240,179,155,195,219, 17, 91, 0, 78,149,177, 15, 5,112,182, 96,177,132,115, 15, 0, 78, 88,113,224,132, - 22, 7, 14, 28,254,102,177,117, 32,232, 22,210,120, 83,193,160, 10, 96,136, 70,158, 33, 9, 19,162,180,111,200,121, 3,105,100, - 18,120,240,135,200, 16, 1,165, 54, 9, 99,222,128,243, 47,120,147,227,149,239, 84,241,152,199,221, 26, 28, 56,112,248,251, 64, - 8, 25,101, 62,210,208,252, 63, 39,180, 56,112,248,183,227,149,149, 39,174, 96,249,231,114,114,224,192,129,195,127, 76,112, 1, -175,230,100,106, 87,194, 7,227, 25, 43,136,219,149,227,131,244, 12,199,201,113,114,156, 28, 39,199,201,113,114,156,255, 45,206, -178,184,173,209, 31,255, 36,129, 85, 76, 57, 54,153,126,252,173,163, 14, 57, 78,142,147,227,228, 56, 57, 78,142,147,227,228, 56, -255, 43, 11, 3, 14,255,102, 19,101, 9,203, 43, 83, 37, 33,197,239,195,129, 3, 7, 14, 28, 56,112,168,208,247,113,253,130,181, - 71,193, 20, 60, 30,166,109,111,213, 71, 75,230,236,239, 1, 62, 83,135,176, 52, 16, 0, 40, 67,194, 97, 96,239,171,210,158,190, -113,200, 7,133, 87,128, 35,133,104, 63,129,182,111,110,252,147,140, 55,229,171, 29, 96,215,203,205, 89, 49, 40, 41, 61,123,251, -195,240,220, 67,214, 28,107,111, 95,217, 78,226,232,208, 71,163,211,215, 18, 9,133, 49,186,172,156, 77, 25, 25, 17,185, 21, 91, -155, 20,243,231,131, 28, 77,188, 67,132,178,235,140,211, 2, 33, 81,206, 87, 82,101, 98, 40,235,151, 21, 73, 15, 28,232, 67, 1, - 78,100,113,224,192,129, 3, 7, 14,127, 1,234, 3,184, 3,160, 11,165,116, 83, 65, 87, 98,233,206,240,149,131, 67,110, 73, 36, - 82, 63, 0, 96, 41, 5, 75,129,188,156,172,208,196,136, 91, 29, 1,192,197,175,193, 73,129,196,182, 1, 75, 95,109, 55,178,128, - 65,151, 31,153, 29,117,189,161, 37, 57,178,113, 13,248,176, 93,135,118,189,186,118,237, 18, 80,187, 86,237,106, 0,240,224,225, -131,136,163, 71,143, 61,177,113, 13, 56,168, 76,121,242,203,155,201, 14,201, 87,239,189, 87,175,197,237,219,119, 22, 2, 24,247, -166, 53,232,228,100, 51,225,212,255,166,182,108,219,107,185, 28,128, 85, 66, 75,226,232,208,167, 71,183, 78,245,190,152, 56,134, -249,100,234, 55,126,183,174,156, 95,170,240,172,149, 69, 89,253,169,188,228,126,151, 74,155, 56,217, 18,204,159, 79,201,206,140, -223,152, 85, 91,191,114, 80,103, 68,244,163,172,177, 31, 33, 4, 60,145,236,128, 75,213, 22,251,236, 91, 79,201,164, 20,218,210, - 6,105,113,224,192,129, 3, 7, 14, 28,202,141, 99, 5,226,234, 88,209, 13, 37, 10, 45,137, 68,234,119,253,252, 81,199, 95, 46, -199, 2, 0,218,213,119,199,172,175,215,116, 32,132, 60, 1,128,238,159,204,247, 95, 56,115, 34,174, 62, 74, 1,165, 20,245,170, - 59,225,131, 30,125, 45,202,141,212, 61,168, 97,191,143, 62, 26, 56,117,234,231,221,159, 63,127, 30,181,123,247,238, 75, 0, 16, -210,178,101,245,111,190,249,230,163,229, 14,142, 98,169,123, 80,188, 58, 41,236, 86,121, 74, 43,245,170,230, 21, 84,163,206,160, -189, 63,173, 97, 90,119,236, 61, 64,234, 85,109,177, 58, 62, 34,222,146, 99, 93, 92, 92, 38, 9, 4, 2, 59, 0, 96,217, 63,244, - 79,213, 74, 60,119, 0, 48, 24, 89,133,163, 87, 96, 46, 79, 40, 49,138,197,194,176, 92,165,114,123,118, 92,216,143,165,113,106, -244,250,224,207,198, 14,103,238,190, 72,135, 95,112, 8,111,213,226,217, 96,141,122,135,201, 51,191,238,115,251,198, 94, 0,243, - 46,148,247,202,122,121, 53,225,125,181,216,166, 61, 33, 24,230,219,244,227,158, 11,183, 29, 16,188, 87,221, 22, 26, 61,139, 19, -161,233, 77,127,248,238,171,101, 87,126,232,114,132,124,155,188, 17,192,239,148, 82,150,123, 30, 56,112,224,192,129, 3,135,138, - 67, 65,220,198, 77,102,255, 55,149, 41,180, 0,192, 70,202,199,147,151, 73, 0, 0,123, 41, 48, 97,244, 80,164,167,165,250,107, - 13, 44, 62, 30, 58, 24,119,194, 19,241, 36, 50, 21,148, 82,248,123,203, 44,206, 16, 15,236,123, 31,143,248,184,213,201, 83,167, -110,126, 57,231,203,159, 9,121, 21, 13,124,227,166,205, 77,231,206,155, 59,114,240,208,193,237, 15, 28, 56,240, 8, 69,102,198, -182, 20,124,162, 88,179,108,201, 34, 81, 92, 90,126,254,164,169, 51,216,207,167, 76, 90, 5,160,183, 37,199, 10, 4, 2,187,184, -184, 56, 27,134,121,221,125,237,219, 69, 51, 46,182,239,181,252, 89, 84, 76,214,221,147,135, 15, 55, 12, 10, 10, 66, 92,124, 82, -243,165,223,111,168,235, 81,173,225,240,220, 28,117,175,188,212,176, 98,163, 80,139, 5,130, 71, 11,150,254, 80,143,181,175,206, -204, 26,217, 25,193,213, 60, 17,159,146,133,150, 29,187,243, 67,111,221,234, 0,160,188, 66,171,143,150, 77,169,251,205,246, 27, -109,123, 54,243,124,143, 97,120, 80,170,245, 72,205,214,192,200, 2, 33, 53,237,208,105,199,247,252,140, 60,253,135, 95,255, 47, -246,195,107,171,187, 38, 19, 66,198, 83, 74, 15,114,143, 5, 7, 14, 28, 56,112,224, 80, 49, 40,109,212, 33, 3, 0,199,142, 29, - 43,182, 79,201,104,164,120, 18,153,136, 39,145,137,184, 25,158, 10, 29, 21, 96,213,210, 5, 88,177,120, 30, 50,212, 12,126,185, - 26,139,167,145, 73,120, 26,153,132,180, 76,101,113, 10,239,181, 33,154, 43,150,200,234,175, 90,101,183,172, 67, 75,121,107, 71, - 7, 7,135,103,143,126,206,155, 59, 37,185,230,130,207, 98,133, 2,173, 56, 78,110, 35,111,182,127,255,190, 32, 55, 23, 87,185, -141,141, 98,154,220,187,222, 22,123,251,186,118,165,113, 22,133,204,173,102,247,238, 93, 58,189,239,238,238,198,142, 89, 21, 26, - 94,171,102,160,190, 70,245, 26,205,101,110,254,221, 75, 81,162,133,156, 44,203,130, 97, 24, 36, 39, 39, 35, 33, 33, 1, 47, 95, -190,196,211,167, 79, 17, 27, 27,149,204, 82, 42, 48,130,101, 60, 60,188,193,231,139,224, 87,217, 23, 63,172, 90, 44,251,122,254, -172, 70, 18,185,232, 16, 49,243, 52, 55,231,204,207,200, 60,112,252,183, 83,241, 39,118,255, 96, 4,128,148, 76, 37,206,222,122, -142, 59, 97,177,214, 42,230,162,101,175, 28, 31,253, 60,199, 16,121,140,183,112,246,231,177,151, 47, 95,137,202,206,213, 34, 87, -165,131, 42, 95, 15,141,214, 8,189,145,133,175,139, 4,191,206,168,133,195,231,238,187, 17, 66,190,179,166, 62,203,169,236, 57, - 78,142,147,227,228, 56, 57, 78,142,211, 42,148,164, 69,254, 37, 22,173, 77, 69, 23,211,182, 82, 71, 29, 70,196,102,224,201,203, - 36, 52, 8,244, 66,181,202, 30,184,249, 52, 19, 59,207,198, 98,203,201,104,156,189,151, 10,150,175, 64, 82, 14,240, 44, 42, 25, -207,162,211,202,116, 1,226,137, 5,253, 62,251, 44,123,106,237,160,156, 38,231, 79, 76,128,151,203,179,160,233,211,179, 38,240, -196,130,126, 14,149, 20,187,103, 76,157, 60, 72, 33,147,137,180, 26, 45,170, 86,241,149, 76, 28, 63, 97, 56,113, 16,239,182,180, -160,182,222, 65, 14, 98,169,244,199,175,231, 79, 19,127,247,203,179,152, 60, 45,242, 14, 94, 75,126,241,249,140,185, 25,124,129, -228, 7, 91,239, 32, 7, 75,185,244,122, 61, 52, 26, 13,180, 90, 45,116, 58, 29,226, 99, 31,119,255,253,151, 47, 58, 86,169,228, -216, 81, 44,145,128, 2,200, 81, 27,240, 50, 81,133, 54,109,219,243, 26,212,175, 31,108,227, 81,115, 68,113, 92, 89, 89, 81,217, - 44,229, 41,142,254,186,139,183,239,244, 93,252,124,244, 22, 14,157,187,139,155, 23, 78, 24, 40,171, 47,156,166, 66,225, 89,195, - 95,225, 89, 39, 90,225, 85, 55,185,112,241,174,125,187,212, 58,229, 49,180, 77,219,118,103, 70,143,155,120, 94,149,155,158,242, -227,154, 5,241,169, 9, 81,143,197, 66, 98,144,137,121, 80,230, 27,176,237,247, 4,244, 89,124, 15, 97, 49, 74, 80, 74,133,220, -183, 7, 7, 14, 28, 56,112,224, 80,177, 22, 45,179,197,195,124, 91,137, 93,135,249,249,234,200,222,253, 6,195,195,213,221,166, - 71,235, 97,194,208,136, 44,164, 38, 70,227,249,211,135, 80,229,235, 33,116,168, 2, 72,220, 81,217,207, 23,247,159, 28,210,173, - 94,118, 76,201, 26, 52,145, 37,241,245,232,225,233,237,225, 34,103,150, 45,245,185,254,244, 73,102,131, 93,115,182, 98,224, 64, - 27,231,101, 75,125,174, 71,189,144, 51, 50, 9,109, 54,124,232, 0,194, 16,138,233,211,167,162, 71,215, 78,248,120,248, 16,178, -125,251,182, 38,150, 22,148,133, 96,237,204,217, 11, 68,201, 89, 6,237,205,167, 74,141, 76, 46,149, 94,121,166,204, 11,246,243, -145,118,238, 53, 44,225,216,254, 31,191, 3, 48,212, 18, 46,147,192,210,235,245,208,233,116, 0, 96, 4, 0,134,121,181, 78,207, -213, 34, 37, 75,131,228, 44, 13, 12, 70, 22,189,250, 13,149,222,186,125,111, 40,128, 18,252,181, 88, 86,111,208,227,224,233, 59, -136,191,117,128, 37, 12, 47,219,228, 12,111, 18, 89,238,238, 62, 23,187,246, 26,226, 34,146,188,234,134,205,205,211, 96,251,134, -165,165,230,147, 33,132,178, 70, 67,150, 65,175,207,171, 90,165,106,124, 96, 80, 93,201,229,243, 39,187, 95, 57,115, 80,105,168, - 58,196, 62, 34, 42, 17, 60,129, 24, 60,161, 4, 26, 29,231, 12,207,129, 3, 7, 14, 28, 56, 84, 52,138, 78,191, 67, 8, 65,153, - 83,240, 68, 61,186,212, 16, 0, 2, 26,118, 76,183,145,240, 29,249, 12, 65,114, 92, 4,182, 47,159, 4,150,165,232, 60,114, 25, - 20,126,238,144, 10,121,208, 40,211,149,233,207,207, 59,149,174,246,244,237,215,109,140,247,251,116,108, 85,219, 93,187,148, 2, - 0,216,181, 75, 41, 24, 59,166,146,237,250,141,145,126,141, 91, 52, 0, 53, 26,209,181, 71,111,244,235,223, 15, 81, 73, 42,252, -239, 98, 12,242,212, 90,139,230, 87,147,185,212,172,235,234,233,213,233,179, 97,157,228,124, 30, 33, 53,124,237,120,177,169,122, - 3,143, 39, 48, 30,185,149,157,208,171, 87,127,231,179,199,247,189, 47,115,169, 89, 87,149,250,248, 94, 89,124, 26,141, 6, 70, -163, 17, 26,141, 6,122,189, 30,142,206, 85,142,183,239,189, 60, 46, 49, 41,247, 88, 82,102,126,227, 60,189, 1,201, 89, 26,164, -100,105,144,149,167,131,187,194, 1, 6,189,182,118, 41, 23,225,231,158,189, 7, 15, 1,192, 16,198,176, 53, 55,225,241, 83,211, - 54,147,200,234,212, 99,160,203,197,208, 8, 60,191,125, 34,147,178, 6,253,171,138, 99,139,157, 2, 69,226,221,180,160, 94, 65, -121, 4,172,144, 79,244, 60,134, 97,117, 58,165,222,213,213,229,236,133,179,191,117,203, 55,188, 0, 79, 40, 46, 60, 70,173, 53, -114, 79, 3, 7, 14, 28, 56,112,224,240, 23,192,204, 79,235, 88,129,115, 60, 94, 19, 90,166,190,209, 46, 93,186,252, 41,216, 82, -124,114, 6,156,108,248,112,241,244,195,160, 73, 43,240,243,119, 83, 96, 52,234, 65, 41, 96, 48, 90, 54,136,141, 82,193,233,113, - 99,253, 2, 43,251,241, 92, 6, 13,148,169,119,238, 82, 73, 7, 13,148,169,107,213,118,202, 30, 55,214, 47, 50, 55,223,167,185, -193,104,196,149, 71, 41,120, 24,153,141,135, 81, 57,176,145, 90, 30,230,139, 39, 18,142, 93,186,100,177,144,207, 35,228, 81,180, - 82, 25,151,110, 80,242, 4, 2,157, 76, 42,162, 90,202,215, 68,165,209,244,182, 61,135,171,143,236,248,126, 4,128,241, 37,241, -152, 70, 26,154, 44, 89,166, 53,165,148, 18,128,101,137,209, 24,151,150, 15,165, 78,143,228,204, 63,132, 22, 49,148,220,115,170, -240,172,225,111,103,235,248, 27,143,199, 19, 83, 10,232,117,134,143, 20,158, 53, 58,230, 38, 60,123,106, 46,178,174, 63, 74, 64, -196,221, 51,201, 70,157,106,112, 94,114,248,239,150, 95, 92, 80, 30, 15, 44,143, 33, 44, 33, 96, 5, 12,213,130, 82,182,104,142, - 84,156,208,226,192,129, 3, 7, 14,255, 96,148,166, 69,254,233, 48, 89,176,138,181,104,149, 86, 32, 74,129,103,209,105,168,236, -237, 2,239,202,213,240,244,241,253, 63,182, 1, 48, 24, 45,235,142, 58,116, 40, 33,110,229, 74, 59,118,202,148,236,166, 75,151, -250, 92, 27, 59,166,146, 93,173,218, 78,217,211,166,197, 52, 93,185,210,238,218,233,235, 2, 35, 45,136,215,101,138,205, 85, 16, -230,223, 66, 48,141,234, 6, 85,225, 45,216,245, 44,230,247, 7,185, 41, 66,161, 80,239,238, 32, 33, 10, 27, 17,143,199, 8, 68, - 26, 61,163,241, 15,174,207, 59,194,188,138,222, 90,150,208, 42,218,117,152,158, 26,209,253,212,255,166,214,106,221,115,153, 99, -124,170, 26,217, 90, 94, 97,215, 33,143, 33,120,240, 56, 26,224, 9, 31, 22,199,105,171,112, 60,185,123,231,207, 62, 43,151, 46, -130,206, 96,196,184, 41, 95, 98,248,208,193, 39, 21,158, 53, 58,250,248, 5,132, 94, 58,178, 85,214,113,204, 15,136,126,114, 59, -201,160,201,217, 99,141,200, 42, 20, 91, 0, 53, 82,150,201,200,204,177,209, 24, 32, 65, 49,186, 79,163,227, 34, 59,112,224,192, -129, 3,135,127, 38,254,141,226,234, 15,131,199,107,163, 14,139,183,104,149, 6, 95,111, 55,220,120, 24,137,218,129, 85, 96,103, -171, 64,120, 68, 28,120,140, 0, 12, 1,244, 6,203,197, 16,213,233,247,174, 92,105,135,232, 72, 57,179,254,135, 72,191,113, 99, -253, 34, 87,174,180,187, 70,117,250,189, 0, 6, 83,250,106,238, 69, 83,128, 84,163, 21,186,128,178,250, 74,110,142, 50,222,237, - 23,121,233, 12,195,211, 56,217, 73, 88, 39, 59, 49,227,164, 16, 9,132, 2, 30,107,160,140,206,219,213, 47,159,178,108, 93, 75, -248,204,187, 14,141, 70, 35, 8, 97,140, 5, 66, 76, 30,155,174, 70,118, 62, 15,201, 89, 26,100,230,234, 80,195, 75,142, 51,103, - 15,168,140,122,245,174,226,184,120, 2,161, 93, 53, 63,111,204,250,106, 37,212, 26, 35,158,197, 43, 33, 20,139,221,221,220,131, -239, 13,254,116,134,120,226,166, 8,140,120,223, 9, 83, 46, 69,196,171,146, 37, 51,172,185,184, 70,163, 17,234,124,173, 48, 57, - 45,211, 33, 39, 55,207, 86, 42, 17,171, 93, 28,237,210,138,219, 55,159,179,104,113,224,192,129, 3, 7, 14, 21, 14,115, 31,173, -162,176, 72,104,217,200, 36,160, 60, 9, 46,133, 70, 32, 32,168, 14,182, 29,190,137,234,181,155, 32, 49,215, 0, 10,198,226,128, -227,159,207, 80,221, 1,112,167, 71, 15, 79,239, 15, 63,244,106, 79,169,224,244,250, 13,217,113, 0,240,195,158, 86,160, 0, 88, -150,130, 82,128,178,175, 4,151,229,114,146, 31, 29,153,152, 83,217,207, 93,142,176, 56,157, 70, 46, 22, 50, 14,114, 17,207,197, - 78, 36, 20,242,249, 48, 82,162, 73, 76,140,208, 16, 32,202, 18,186,162, 93,135, 50, 27,143,227,109,123, 46, 75,141,138,201,190, - 93, 35, 67, 85, 55, 91, 39, 2,165, 64, 13, 47, 57, 30, 94, 63,102, 76,142,127,254, 76,157,252,100, 67,113, 92, 44, 11,158,206, -192,226,222,139,108,100,229,233,145,165,212,161,121,155,110,194,230,237,186,227,210,195, 52,176, 6, 61,150,110, 62,150,107,164, -250,126,148,134,233,173, 40, 52,115,227,206, 35,239,212,204, 60,177,128,207,207, 10,172,238,251, 82, 36, 20, 24,114,114,114, 68, -175,239,197,131, 92, 42, 66,134, 82, 15, 0,122,238,145,224,192,129, 3, 7, 14, 28, 42, 14, 5, 35, 13,187,224, 85,100,248, 46, -230,226,203,162, 73,165,141, 44,133,179,147, 35, 36,114, 91, 68, 38,235,144, 75, 92,145,169,162, 48, 26, 95, 89,180,216,146, 79, -220,174,184,244, 67,135, 18,226,126,253, 53,117,203,161, 67, 9,102,142,222,127, 88,178, 10,215, 44,181,152,147, 80,227,153,195, - 39,206,103,119,111,236,226,192,240,120,106,161,128,209,240,133, 60,157,144,207,232,133,124, 70,235,102, 43,224,157, 63,178, 71, - 68, 9,206,151,197,153,159,159,143,118,237,218,161,115,231,206,232,209,163, 7,250,246,237, 11,127,255,154,174, 12,143,104, 41, - 97, 89, 23, 81, 46,170,185, 16,240,243, 99,241,251,158,111, 85, 15,175,252,122,207,168,201,239, 70,205,250, 58, 95,227,164,148, -205,200,214, 32, 95,103, 68,166, 82,135,204, 60, 29, 12, 46, 77,241,235,213, 4,168,181, 70, 68,135, 30, 80,167, 38,197, 77,202, - 79,126, 22, 89,198,133, 44, 82,118, 26,247,201,199, 67, 83, 21, 18,230,121, 72,179,134,169,206, 78,142, 6,243, 73,163, 9, 33, -144,216,186,194,193, 94,129,200, 59, 39,112,106,105, 91, 53,128,217,150,212,231, 27,222,112, 28, 39,199,201,113,114,156, 28, 39, -199,249, 95, 66,151, 2, 97,213,165,104, 28, 45, 11, 44, 90, 20, 85, 61,228,168,238, 37, 71,190,206, 21,249, 90, 35,242,242,141, -200, 81,233,144,163,210, 35, 50, 73,133,135,135,223, 60,135,175,172, 88,175,166, 61,166, 20, 0,121, 37,240, 44,181,105,137,116, -218,175, 86, 44,253,230,163, 61,245,235,105, 39,118,241,168,116, 63, 82,155, 64, 8,163,102,120,124,189,163,130, 47, 8, 15,191, -159,122,237,226,241,150, 18,131,113, 72,105, 60, 6,131, 33,219,203,203,171,192, 18,245,135,132,172, 89, 77,218,227,202,177,233, - 85, 90,117, 95,234,242,221,162,169, 42,134, 39,100, 9, 95,248,208,168, 87,239, 86, 39, 63,249,129,150,226, 80,198, 8, 37,143, -111,220, 13,107, 98,239, 88, 9,207,227,243,144,151,111,128,206,192,194,193, 70,136,184, 7, 39,117,145,225,183,247,229,198,223, -219,102,125,157,209, 93,132, 16,239, 78,157, 58,246,110,210,164, 41,111,238,220, 47, 17, 16, 16, 0,181, 90, 13,134, 97, 80,169, -114, 53, 68, 62,189,139,235,199,190, 50,170,210,163, 54, 0, 88, 72, 41, 77,229,158, 7, 14, 28, 56,112,224,192,161,194,197,231, - 40,243,117,153,225, 29,204,172, 59,145, 45,218,117, 3,203, 82, 24, 41,192, 26, 11, 44, 79,236, 31,214, 39,163, 62, 63,242, 77, - 51,200,178,198,155,107, 55,109,233, 92,191, 81, 43, 94,144,143, 13,114,210,147,112,253,202, 57, 3, 88,122,205,146,227,211,210, -158, 42,101,238, 53,122,127,212,231,195,253, 67, 63, 30,147,213,178, 77, 27,185,171,171,187, 38, 46, 62, 78,245,211,142,157,250, -147,199, 15,181,100, 97,232,159,150,246, 76, 89, 26, 79, 86, 86,214,247,197,165,183,109, 81,169, 57,128, 42, 60, 62,209,170, 82, -158,202,173, 41, 91, 90,124,108,175,111,190,154, 31, 53,112,228,100, 81, 85,175,106, 72,201,230, 33, 50, 46, 9,225, 23, 15,105, -226,159,222,250, 37, 39,238,206, 8,107,235, 43, 63,238,154, 73,108,197, 1,248,142, 16, 18,220,169, 83,167,142,239,191,255, 62, - 29, 53,106, 20, 40, 5,126,223, 52,150,102, 68, 94, 63, 0, 96, 54,165,244, 5,247, 24,112,224,192,129, 3, 7, 14, 21,143, 55, -242,209,138, 9,123, 21, 79,235,175, 70,110, 82,202,224,109,219,126,254,250,231, 29,123,154,231,107,181, 94, 20,194, 88,163, 65, -123, 65,105,196, 92, 75, 57, 84, 73,207,110, 59, 59,251,215,250,105,243,218,217, 63,109, 89,223, 10,172, 49,144, 0, 81,148,224, -188, 68,111, 28, 90,150,200, 42, 93,200,229,110,108,223,123,185, 58, 61, 93,249,179,181,199,170,210,194,147,108,220,170, 86,218, -184,234,171,101, 12,195,235, 96, 52,178, 2,214,168,127,110,212,229,127,171, 78,125,114,152, 90, 55,188,178,164,139,252, 8,192, - 35, 66, 72,200,217,179,103, 27, 1,248, 30,192, 5, 74,233,109,238, 17,224,192,129, 3, 7, 14, 28,254, 58, 16, 66, 70, 21, 13, - 90,106,177, 69,235,239, 66, 70, 70, 68, 46,128,137,111,202,147,150,246, 84, 9, 96, 70, 69,231,239,193,211,236,255, 1,248, 95, -121,143, 87, 38,191, 72,133,133, 81,233,223, 80,112, 93, 2,112,137,187,237, 57,112,224,192,129, 3,135,183, 43,184, 0, 11,157, -225, 57,112,224,192,129, 3, 7, 14, 28, 56,148, 46,178,204,215,133,233, 0,138, 29, 57, 96,205,204,220,229, 25,125, 80, 22, 63, -199,201,113,114,156, 28, 39,199,201,113,114,156,239, 30,103, 89,220,214,232,143,127,133, 0,171, 0,247,160, 82, 43,177,162, 43, -140,227,228, 56, 57, 78,142,147,227,228, 56, 57,206,119,143,243, 95, 45,166,138, 88,177, 10, 4,227, 63,203, 71,139, 3, 7, 14, - 28, 56,112,248,187,224,236,236,111, 3, 20,250,245,150, 9,185, 75,144, 27, 0,228,165,134, 37,115,181,199,161, 36, 81, 85,156, -143, 86,185,132, 22, 33, 68,192,240, 69,159, 73,164, 54,195, 8, 3, 91,101, 86,154,215,127, 88,197, 18,255,202,242,241,149, 42, -185,180,137,139, 79,222, 30,254, 66,117,232,109,112,218,184, 85,117, 33, 34,135, 95, 8,171,249, 38, 39,238,225,137, 10, 46,163, - 56, 40, 40,168, 30, 0,132,133,133,221,165,148,106,222,148, 83,238, 22, 48,192,193,214,126,180,142,213, 26, 85,121,170, 31,148, - 73, 79, 15, 84,100,158, 21,158, 53,156,192, 87,108,128,209,208, 6, 20, 60,240,248,247,136, 38,255,147,156,212,176, 82,195, 92, -248,244, 88, 28, 56,226,163, 46,115,182,236, 59,246,117,204,161,153,225, 69,183, 59,126,176, 70, 49, 97, 72,135,233,235,246, 28, - 90,146,118,120,154,146,107, 94,172,135, 79,139,129,246, 6,190, 59, 47,225,252,242,116,107,142,243, 14,104,250, 72, 32, 16,184, -232,116,186,148,248,167,215,107, 89,114, 76,165,192,102,119,120, 60,198,211,104, 96,227, 98,159, 92,125,143,171,253,178, 33,117, -173,218, 20, 6,195, 44, 10, 16, 16,254,138,252,244, 23,231,222,132,207,211,211, 83,106,103,103,215,210,214,214,182,146, 76, 38, -147,100,102,102,170, 51, 51, 51, 99,162,163,163,207, 82, 74, 13,111,163,140,114,183,128,153, 68, 64,230, 21,252, 94,144,151,252, -100,113,233,237,107,224,215,132,161, 51, 11,126, 47, 86, 38,135,207,249, 39, 92, 43,137,123,128, 47,143, 98, 34,143,225, 55, 51, -176,250, 69,170,228,167, 71,172, 57,222,209,209,177, 3,159,207,151,154,254, 27, 12, 6,117, 70, 70,198, 41,238, 41, 40,215,123, -114, 84,209,223,229,182,104, 17, 66,120, 2,177,236,242,192,143,199,213, 90, 50,127,134,100,213,150, 95, 33,177,113, 8,203, 87, -102, 6,253, 19, 11,239, 82,181,241,109, 30,195,243, 54, 79, 51,178,198,184,212, 23, 55, 42,164,209, 13,168, 44, 29, 49,123,218, -224, 41, 3, 62,106,231,219,174,235, 36, 2,160, 88, 81,164,240,105,120,149, 16,166, 10, 67, 0,134, 33, 96, 8, 0,208,132,180, - 23, 55,234,151,151,211, 4, 59,215,106, 85, 68, 54, 46, 23, 91,244, 24,231, 30,122,102,231, 54,185, 75, 80,251,188,212,176,251, - 21,112,227,184, 84,171, 86,173,161,191,191,191,211,132, 9, 19,132, 0,240,221,119,223, 85,175, 94,189,122,122, 68, 68,196,173, -242, 6, 63,149,187, 6, 14,254,126,249,194,159, 63,248,160, 51, 18,210,242,176,116,229,186,214, 54,238,254,125, 43, 74,108, 57, - 56, 84,177,229,219, 58, 60,152, 52,109,161,107,167,214, 13,121,202,124, 3,126,187,120, 55,100,231,186,133, 55,109, 93,130, 26, -149, 38,182, 88, 85,246, 28, 55, 27,218,137, 85,101, 3,192,128,162,219,189,108,244,237, 92,164,198, 78, 30, 98,254, 93, 0, 7, -203,204,139, 95,139,147, 2,177,216,151, 97, 24,152,174, 61,143,188,186,254,122,157, 58, 58,238,241,197,142,255,132,231,196,214, -183,113, 18,120,124, 39,134,252,145, 63, 82,112,159, 18, 74,115, 18,159, 94,114,170,128,251,201,174, 86,117,251,224, 46,205, 91, -252,116,225,101,134,220,167,213,228, 99,132, 50,235,163, 47,174,184,103,209, 75, 69, 34,113, 56,114,228,136, 75,167, 78,157,236, -220,106,245,188, 96,201, 49, 54, 34, 73,208,209,163,135,133,157, 58,117,180,226,254, 12,104, 15,134,217, 65, 0, 1,203,210,239, -120, 44,221,167, 76,127, 26, 97,109, 24, 22,153, 91,224, 8, 6,212,226,118,134, 5,185,173, 74, 14,223, 82,222,250, 21, 72,236, -218, 10,132,194,207,170,248,215,174, 31, 31,245,252,118,158, 50,119,165, 62, 63,235,130,213, 68,122,195, 23,103, 46,133,126,192, - 23, 8, 72,167,182,141,121, 0,222, 72,104,185,185,185,245, 92,179,102, 77,213,166, 77,155,154, 94,230,182,251,247,239,119,255, -234,171,175,228,150, 60, 67, 37,220, 75, 94, 46, 46, 46, 62, 34,145,200, 11, 0,180, 90,109,124,106,106,106, 12,165, 52,190,204, -123,194,189,154, 51, 1,127,225,165,139, 23,249, 0, 16, 18,210,242,107,223,144, 9, 14, 60,161,141,186,216,234,208,230,202, 1, - 76,190,126,227, 26, 1,128, 38,141,155,206,144,187, 4,173,125,155,150, 45,169, 91, 96, 99, 6,152,210,188,101,251, 94,253,250, - 15,102,130,107,248,160, 67,251,247,167, 3,176, 74,104,241,249,124,233,205,155, 55,171, 49, 12,195, 51, 24, 12,249, 77,154, 52, -137,121,147,124,121, 5, 52,187, 74,192, 84,210, 25,180,155, 83, 95,220,254,154, 82,202, 22,213, 15,118,149,234,207, 6,143, 63, -146,101,217,216,156,232, 91,205,222, 53,139, 86,177,245,108, 45, 25,195, 23,125, 54, 96,248,167,181, 38,127, 62, 75, 50,105,213, - 89, 28, 91, 55, 35,237,159, 42,178, 0,128,199,240,188, 79,158, 58,233, 42, 19,241, 0, 0,202,124, 3, 62,232,212,169,204,227, -236,253, 26,159,103, 8, 9, 48, 77,104, 99, 52,232, 36,124,129, 40,159, 0, 0,121, 53,138,192,217,179,242, 89, 15, 15, 71,217, -128,143,218,249,238,216,115, 58, 46, 38, 46,189,196, 70,141, 97,120,222,135, 14, 31,113,245,114,146,128,207, 35, 80,170, 13,232, -212,185, 91,177,179, 60,123,120, 56,118, 25,240, 81, 59,223, 93,123,207,196, 36, 38,102, 28, 43,181, 49,247,240,111, 32,183,115, -251,173,215,232,175,156,242, 25, 71,204, 93,244,189,243,197, 19,187, 46,180,234, 50,152,141,142,142,205,167,132,132,101,102, 36, -126,166, 76,124,254,196, 82, 33,109, 99, 99, 83,213,198,198,166,238, 7, 31,124, 32,153, 58,117,170,160,117,235,214,133,219, 71, -141, 26, 37, 60,127,254,188,199,242,229,203, 59,123,122,122,230, 43,149,202,123, 74,165,242, 5,165,212,226, 25,171,221,221, 93, -198,247,254,176, 27,222,239, 53, 14, 70,150, 96,212,167,147,113,242,196,193, 49, 0, 42, 68,104,233,101,182, 95,141, 28, 61,213, -165, 73,195,122,188,133,187,158, 64, 42,226,163,227,123, 1,100,248,132, 57,246, 91, 86, 47,252, 17, 64,171,226, 44, 89,172, 42, -123, 78, 45,103,109,255,238, 77,171,224,240,110,109,127,239,118,211,193,200,236, 10, 45, 91,213, 62,152,168,112,144, 74,215,120, -218,243, 92,197,198,212, 53,213, 62,152,120, 38,226,196,234,220, 82, 95,126, 98,177,239,238, 93,187,106, 56, 40,132,224, 51, 4, - 60, 30, 1,159,199, 32, 95,107, 68,223,143,250, 87,212,151, 20, 79,234, 90,163, 51, 3, 12,127,245,194,198, 86,117,202,179,227, -214, 92, 19,194, 19, 58, 29, 61,252, 11,223,213, 78, 12, 30,143,128,199, 0, 60,134, 32, 42, 89,141, 17, 35,134,219,189,169, 96, -255,160,185,107,195,243,107, 91,117,108, 82,203,177,206,222,107,196,174,201, 7,253,156,210,242,101,195,246, 28, 58,215,223,167, -229,148, 27,148,178,203, 98, 47,173, 42,245, 75, 90,163,209, 36,119,236,244,129, 45,225,203,101,103,126,253, 63,123,231, 29, 30, - 85,209,182,241,123,182,103,179,155,108,122, 37, 9, 16, 8, 9, 37, 64,232,189, 23, 9,189, 55, 81,164,136, 32, 10, 34,210,164, - 40, 32,130,116, 17, 65,154,244, 42,210,123, 87,106, 2,129, 80, 18, 72,239,125, 91,182,151,249,254, 72,194, 27, 49,101, 3,248, -189,175, 58,191,235, 58, 87,178,187,103,239,157,115,206,156,115,238,243,204, 51, 51, 59,218,243, 56, 4, 38, 11,133,217, 66, 97, - 41,158, 27,181,232,124, 37,224,112, 8,168,149, 98,252,248, 15,208,163,231, 59, 26,171,217,154,106,251, 69,142,179,235,204,133, -223,220,245, 38, 43,190, 91,191,245,171, 66, 69,206, 87,241, 79, 93, 19,237, 61,235, 76,211,100,197,216, 60, 15, 6, 7,180,105, - 74,220,163,137,123, 78,220, 66,131,122,117, 97,177, 22,149, 51,184,154, 4,123, 78,222, 66, 72,112, 72, 81,185,173, 20,117,252, -164,104,214,180, 25, 0,188,150,209,226,219, 57,206,239, 16,254,238,162,222, 67,198,194,195,221, 29, 28,106,234,125,225,228,158, -222,124,177,236,115,147, 86,241, 93,213,238, 24,150,151,247, 5,106,181,190,113,122,137,143,143,143,123,179,102,255, 25,142,209, -108, 54,163, 70,141, 26, 72, 75, 75, 11,126,141,186,100,239,237,237, 29,190,105,211, 38,143, 94,189,122,241,189,188,188, 0, 0, -153,153,153,190,103,206,156, 9,243,241,241,201,206,200,200, 56, 73, 41,213,148,167, 97, 49,113, 4, 28, 30,184,118,118,246, 69, -219, 8,194,153, 49,229,221,134,158,222, 62,101, 70,234,115,114, 50,133, 51, 39, 95, 38, 60,158,160,120,125,112, 40,181,146, 10, -162, 68, 93,249,124,190,184,172,207,140, 92,199,150,148, 47, 27,199,225,114,138, 42,171,217,148,147,159, 20, 81,183, 10,145,184, -250,124,161, 96,227,200, 49, 19, 91, 15, 30,216, 15,222,238, 50, 92,184, 17,133, 15,167, 76, 55,153,141,166, 85,175,117,143,228, -114,121,217,217,217,137,206,206,206, 94,111,126,191, 37, 53,207,159, 61,237,113,225,226,165, 89, 43,215,172,155,228, 83,167,157, -201, 74,233,203,121,140,253, 27,116,230,119,235, 61,212,209,163, 86, 75,187,117, 11,198,241,255,105, 17,173,242,204, 86,149, 79, - 34,161,216, 97,232,151, 51, 63,182,251,122,247, 45,156,220,240, 97,110,161, 34,199,253,229,147,130,204, 57, 82,173, 40, 8,123, -157, 66, 58,120, 4,183, 34, 92,222, 68,194,229, 74, 8,135, 8,173, 22,107,138,217, 96, 88,172,201,141,201,120,211, 29, 96,181, - 82, 28,254, 61,187,106, 59,141,162,246,174,253,191,120,120, 58,137,160, 51, 90, 48,108,196,104,236,220,185,211,193, 93, 38,132, -206, 96,198,138,149, 43, 85,234,196,147, 30,137, 41, 5,105, 93,251, 76, 63, 23,151,144,253, 40, 57, 67,119,160,252,131,192,129, -135, 76,132, 37,251, 98,224, 40,230,195,217, 65, 0, 14,231, 15,243, 18,190,108, 46, 76,207, 40, 80,148,210,220, 93,238, 73,231, - 29,218, 67,230,236,179,119,192,196, 37, 78,177,217, 60, 80, 24,241,194,209, 14, 67,223,155,234, 24,232, 37,134,196,142,235, 20, -159,148,230, 61,227,243,207,111,200, 60,106, 53, 87,100,191,136,175,108,187,171, 87,175, 62,176,119,239,222,246,159,125,246, 25, -223,207,207, 15,219,247, 28, 12,104,215, 99, 72,159,244,140, 44, 63, 74, 41, 60, 61, 60, 82,198,191, 63,228,248,169, 83,167,146, - 82, 82, 82,248,203,151, 47,111,241,203, 47,191,212,171,202,147,169,133, 82,232,244, 22, 88,138,111,144, 57, 10,125, 85, 43, 52, -241,245,245, 21,165,165,165,233, 75,162, 12,164,212, 36,143, 82,223,198, 61,186,116,104,193,219,116, 58, 1,106,157, 5, 18, 59, - 62, 18,178, 52,104,218, 56,148,252,100, 49, 55, 42, 75,243,131,161,225,243, 60,165,180,103,223, 86, 53,225,225,108,143,109,223, - 47,193,177,155,241, 61,179,212, 4,110,125,151, 79,244, 22,241,186,185,219, 11,214,119,108, 90,203,171,115,147, 0,220,109, 90, -203,235, 90,196,179,152,208,161,171, 62, 78, 83,243, 47,228,159,254, 88, 85,246,133,135, 3, 23, 7, 1,182,158, 77,130,189, 29, - 15, 18, 59, 30, 36,162,162,191,165,143,255,107, 61,213,250,212,243,227, 90, 45, 31, 56,250,212,251, 96,248,208, 33, 62, 35,135, - 15,161,224,114,112,240,240,241,126,187,119,239,202,144,122, 5,111,177,112,184, 91,181,233,143, 83, 42,221,167, 28,192, 67, 38, -196,231, 91, 30,193, 81,204,135,131, 61, 31,142,246,124,116,110,232, 14, 46,231,181, 47, 60,206, 31,246, 11,236, 21,181,179,107, -167, 96,127,105,208,131, 23,138,199, 31, 44,190,183,230,138,188,211,167,223,175,174,231,170,150, 27,120,243,103,140,231,165,166, -167,119, 58,120,252,106,103,159,230, 31, 60, 51, 27, 11,231,100, 63, 56, 80,102, 4, 55,229,233,239, 97,213, 90, 13,177, 51,170, - 77, 15, 31, 60, 75,173, 85,160, 23, 33, 58, 81, 9,137, 29, 15,210,146,125,107,199,131,196,142, 15,169, 29, 15,233,169, 9,200, - 47,228,222, 72,115,229,116,162, 87,126,175, 82, 19,149,206,104,193,253,120, 53,170, 7, 55,134,183,183, 15, 12,189, 70, 85,191, -125,233,240,175, 18,239,186,223, 20,102, 60,153, 99,171,206,158, 19,183, 48,107,218,196, 8, 2, 68, 22,223,164,195,230, 47,219, -208,228,171, 89,147,255,240,222,140, 69,235,154,188,126, 36,203,113, 94,231, 1, 31, 45,106,215,109, 0, 84,249, 89,248,253,220, - 1,244,232, 61, 8,163,198,126, 2, 39, 39,183, 21,124, 59,217, 3,147, 78,113,233, 79,215, 92,239,186,109, 67, 27,212,221,237, -235,227,227,103,181, 22,205,242, 65, 41,208,182, 67,103,204,252,116, 60,172,148,162, 81, 88,243,206,189,134,127, 76,105,241,108, - 32,185,121,185,133,207,158, 62,238,170,205,122,122,219,230,125,169,211,153,114,114,114,112,255,254,125,196,196,196, 32, 58, 58, - 26,121,121,121,144,201,100,234, 42,214, 39,199,134, 13, 27,142,188,116,233,146,157,179,179,243,203,247, 13, 6, 3, 28, 28, 28, - 48,114,228, 72,126,247,238,221,125,195,195,195,199, 16, 66,246, 80, 74,149,101,233,104,243, 98,211, 29,189, 66,126,236,208,177, -195, 36, 0, 16, 59,122,199,175,223,126, 60,186,194,115, 77,230, 19,208,186,117,155, 90,160, 20, 4,116,109, 97,238,179,204, 10, -162, 68,146, 91,183,110, 5,114,185, 92,222,127,238, 65, 86,252,176,109,127,200,249,235, 15, 7, 46, 91,241,157,157,163, 68,132, - 28,133, 1,227, 70, 13,176,249, 30,108,239, 21,210,171, 77,155, 14,191,126,181,232, 75,158, 84, 34,193,185,219,113,248,248,211, -207,117, 25,137,143,190,163, 86,254,134,194,236,103,217,111,120,171,124, 43, 61,227,130,170, 73,225,208,183,135,221,135,239,246, -181, 51,152, 44,144, 23,154,160, 55, 90, 96,177, 82, 40, 10, 77,120,156,172,130,155,163,240,117,164,155, 1,112, 7,144, 3,224, -238, 43,175, 81,252, 63,202,120,157, 91, 20, 30,129, 43, 0, 3,128,210, 63, 94,242,186,188,247, 75,190,255, 24, 64,221, 98, 77, - 11,128, 59, 0, 10,202, 50, 91,101, 69,185,120, 39, 79,158,164,225,225,225, 47,175,248,175,190,126, 21,145,128,239, 35,145,185, -131,210, 39, 40, 61,129,177,167,119,181,188,141, 63,254,228, 34,115,118, 77, 82, 20,228, 5, 20,255,200, 5, 91,110, 22, 60,194, - 93,213,161, 99,251,238,147, 62,250, 8,193,129,213, 4, 22,139,133, 62,138,137, 55,237,216,186,237, 61,153, 95,232, 26,101,234, -163,121, 37, 33,200,170,246,114,176, 88, 45,169,175, 70,176, 44, 86, 75,234, 43, 59,227,194,159,119, 24,224, 36, 21,226,199,211, - 9,160, 20, 32,160,144, 73,248,216,119, 37, 21,241, 17, 71,148,189, 27, 41, 11, 71, 46, 91,216,185, 83,175,169,151, 30,191,208, - 29,200,206,214,157,165,148,102,150,167,201, 33, 0,143, 75,224,104,207,135,204, 94, 0, 39,137, 0,164,212, 13,172,116,115, 97, -199, 94, 83,207, 95,250, 45,105, 14,128,156,210,249, 80,165, 53,197, 94, 65,205, 28,157,170, 29, 24, 56,105,185,195,195, 84, 51, -120, 92,160,166,151, 24, 46, 14, 2, 24,204, 4,137, 57,198,226, 51,199, 9, 31,207, 88,228, 50,107,250,164, 83,132,212,107, 64, -233, 99, 99, 69,219,174,209,104,132,163, 71,143,230,155, 76, 38,227,200,113,159,116,207,204,204,233,247,195,218,111, 69, 30, 30, -158,208,232,204,136,136,126, 94,247,171,175, 22,213, 60,126,230,202,209,133,159,127,248,107,207,158, 61,101,251,247,239,183, 86, -182, 63,255,240,132,152,149,251,253,182,221,135,118,174,254,110, 41,158, 37, 21, 96,235,166, 13,160, 22,243,143,149,132,101, 47, -148,250,159,206,153, 51, 71,124,244,232,209,106, 18,137, 68,169,209,104,114,254, 16,143,224, 16, 94, 86,190, 6,110, 14, 66, 8, -120, 28,120, 58,219,193, 67, 38, 2,159, 11,112, 8,177,148,165,185,245,192,201,197, 86,141, 2,199,246, 26,134,111,251,126, 9, -198, 78,153,139, 71,185,194, 51, 28,123,217,226,201,195, 7,206,114, 23, 91,122,250, 56,113, 60, 58, 55,169, 14,137,157, 0,179, -167,142, 70,243,136, 68,143, 52,185,117,110,142,150,219, 24,197,147,117,255,233,184,115,138, 34, 88, 14,246,124,156,217,189, 34, -187, 80,145,163, 40,105,146, 51,232,117, 73, 54,134,164, 47,148,241,100, 59,171, 73,227,134, 75, 38, 77,248,128,211,166, 85,115, -202,225,240,145,171, 50, 16, 74,129, 79, 63,254, 16,147, 63, 28,239,149,146,158, 61,127,195,134, 31,231, 73, 61,234,126,173,206, -126,178,176, 34, 77, 14, 41,138, 2, 73,237,120,144,138,139,140,139,212,142, 7,157,193, 2, 66,192,117, 14,104,162, 32, 69,145, -220,244,188,196,178,159,192, 95,213,116,241,175,127,241,124,188, 67, 72,193,129,130,155, 9,233,209,139, 35,162,178,238, 80, 74, -243,253, 59, 76, 31, 99, 52, 83,168,117,102, 36,100,105, 96, 54, 82, 50,246,157, 0,212, 24, 76,130,151,110,139,220, 73, 8,113, - 44, 49,208,175,106,166,222, 60,168,115, 11, 29, 56,108,245,186, 77,119,191, 91, 50,151,155,171, 48,192, 74, 41,236,132, 92,136, -133,188,226,133, 11,109,161, 2, 27, 54,254,148,105, 6, 25, 72,175, 92, 49, 87,165,126,194, 74, 71, 13,232,213,126, 31, 1,132, -132, 35, 72,245, 9,168, 30,208,165,207,123,118, 93,250,142,134,197,108,152, 37,241, 12,185, 92,152,245,244,162, 45,154, 13,234, -213, 5, 1, 34,213, 89,207, 62, 4, 0,169,103,240,143, 33,193, 33, 77, 94,125,175,118,237,224, 38,182, 28,247, 18, 4, 98,199, - 41,206, 46,238,115,131,235, 55,246, 8, 12,237, 64, 28, 92,171, 33, 33,246, 62,246,110,156,191,203,170, 51, 44,186,120,242,192, -146, 53, 91,127, 25,218,165,231, 0,108,251,225,219,217, 0, 46,253,233, 60,178, 90, 71,237,216,178,217,143, 47, 20,193,100,182, -194,100,161, 69,127,205, 22,228,231, 23,192,100,182,194,206,222, 1,102, 43,129,201, 98,133,201,108,133,222, 96,150,124, 56, 58, -252, 35, 0,183,203, 42,103,181,186, 29,207, 10, 68,162, 0,138,162,185,107, 41,165,224,154, 13, 28,111,111,239, 61, 0, 32, 18, -137, 32, 18,137, 96,181, 90, 17,241, 44,103,138,123, 72,215, 73, 40, 54,120, 22,163, 33,169, 32,225, 70,143,242,182,221,203,203, -171,207,171, 38, 75,167,211, 65,173, 86,227,250,205,187,178, 45, 59, 15,245, 76, 72, 74, 13,180, 82,153,222,193, 35,176, 7,128, - 62,229,237, 79,101,230,211,143,252, 90, 77,224,124, 54,121, 76,237,117, 59, 78,220,137, 61,243,245,236,138,170, 68,205,174,179, - 12,159, 77, 28,212,116,217,218,173,177,249, 55, 54, 78,171,236, 24,241,120, 60,126, 78, 78,206,203,243,123,253, 79,123,155, 70, - 62, 75,235,191,102,245, 26,187,136, 56, 21, 30, 38,164, 99, 76, 87,127,252,225, 38, 80,129,166,212,171,150, 91,173, 90, 33,123, - 54,172, 93,198,139, 77,215,225,251, 35,119,112,233,215, 31,175,103,102,223,238, 73, 51,211,181,175,115, 13,121, 83,163, 85,145, -230,229,168, 92,168,117,102,232, 13,102,152,172, 20, 74,141, 9,217,114, 3,148, 26, 35,212, 90, 51,198,116,243, 47,243,123,149, -248, 17,119, 66,200, 9, 74,105,111, 20, 13, 75, 37, 44,245, 26,132,144, 19,197,229,250,195,235, 89,179,102,205,249,230,155,111, -162, 75,214, 45,121,191,100,221,138,222, 47,245,125,215,217,179,103, 55, 88,182,108,217,210, 86,173, 90,237,251,253,247,223,227, -203, 50, 90, 21, 70,180, 74, 54,230,228,201,147,180,146, 39,138, 64,123, 71, 87,145,163,152,143,154, 53,252,241,254,156,109,110, -142, 46,158,217,118, 66, 30,247,244,233, 51, 46,121, 6, 41, 56, 28,110,161,237, 81,172, 58,173,197, 98,251,147, 43, 87,174,196, -240, 62,237,196,201,185, 38,117, 84,178, 54,171,208, 0,179,135,123, 29,225,226,165,203,164,203,150,175,152,124,226,152, 85, 14, - 96, 69,217, 77,124,205,238,113, 73,169, 28, 44, 66, 64,173,150,212,252,132, 59, 77, 1,224, 77,114,177,212, 58, 19,184,197,185, - 53,132, 0, 26,157, 25, 92, 46,201,150, 63, 59,240,120,228,215,139, 59,239,218,119, 62,157,114,156, 84,133,133, 9,246,197,115, - 14, 86, 16, 49, 32, 80,106, 76,144,217,243,225, 36,229, 67, 38, 17,128, 91,234, 36, 43,105, 46,220,181,247, 92, 90, 82, 82,222, -221, 98,147, 85,174, 38,143,203,137,167, 22,147,142, 82,139, 67,239,102,238,240,112, 18,194,219, 89, 4,145,144, 7,147, 25,208, - 26,172,208, 25, 44, 72,204,214, 66,165, 21, 35,180,195,144,154,174,222,247,244,174, 1,205,142,230, 37,221, 29, 88,161, 57,181, - 88,176, 99,207,161,218,233,233, 89,253, 78, 29,221, 45,202, 81,154, 16,149, 88,136,108,185, 30,224,186, 99,193,210,239, 69, 95, - 76,155,208,127,199,222,195, 73, 93,218,181, 72,170,234,126, 45,204,126,186, 43,180,117,248,143,189,123,247, 23, 71,223, 62,133, -216,251, 23,151,168,179,108,207,207, 34,132,112, 14, 30, 60,104,158, 48, 97,130,106,233,210,165,126,199,142, 29,171,145,147,147, -115, 31,128,201,201,201, 41,164, 78,237,128, 7,231,206,156,246, 13,239, 63,132,159,154,171,133,204, 94,128, 0, 15,123,220,188, -126,214, 36, 20,242,203,204, 55, 41,110, 30, 28, 81,173,235, 23, 56,118, 51,190,103,116,158,221,149,241, 31,140, 73, 58,119,237, - 89,222,250,157,231,190,245,149,154,238,219, 89,115,214,223,107, 90,203,107,214,199,163,241,205,186, 93,184, 26,241, 44,187,144, -227,189, 36, 67,111, 62,191,112,216,204,114, 66,233, 69, 6,219, 65,204, 71,161, 50, 71,241, 60,226,116,157,183, 20,169, 30,115, -238,232, 46, 78,190,202,132,148, 92, 29, 73,207, 87,193, 98,165,112,178, 23,192,108,165,144,231,231,146,221,187,118,226,238,221, -155, 28,112, 57,227, 0, 44,172,176,153,139, 20, 53, 21, 74,237,248, 69, 17, 33,113,209, 95,147,197,138,224,218,181,176,121,253, - 42, 71, 55, 15, 79,180,109,223,201,246, 40,181,107, 64,163,125,219,215,227,202,239,145, 29,175,174,249,190,153,212,199,125,157, - 99,181,122,223,201,106,116,211,233,141, 22, 40,228, 5, 16, 26, 82,208,220, 55, 7, 46,246, 22, 36, 42,189,241, 40, 51, 86, 90, - 89, 46, 84,238,195, 35,247,221, 27, 12,152,119,232,248,165,111,122,116,235,136, 71,137, 74,136,133, 60,216, 9,185,176, 19,114, -193, 39, 22,172,218,248,163,169, 64,161,234,157,251,232,104,238,107,212,207, 11,197, 79,191, 69, 55, 57,207, 64,247, 93,235,230, -253, 60,126,230,242, 30, 61, 7,188, 71, 30,221,189, 60, 7,192, 69,219, 30,244,168, 77,239, 89,173,182,223,227,196,142,238,107, -167,207, 91, 49,181,123,239, 33,224,114,121, 48,153, 76, 56,188,127, 23,182,127,191,224,169, 65,157,247, 30,165,212, 74,136,203, -132, 3,187, 54, 14,153, 57,127, 21,105,208,168,121,139, 50,253, 36,151,108,122,247,131,137,195, 60, 61, 61, 29,254, 19,209,162, -168, 19, 92, 15,189,250, 14,194,217, 95,127,193,227,232, 40, 88,105,145, 97,178, 90, 41,228, 5,121,153,102,147, 97, 71,185, 45, - 30,118,118, 1,219,182,239, 12,226,112, 8,140, 38, 43, 12,102, 43,166,125,244,190,225,195, 79,231,180,237,213,189, 67,180,144, - 11,101, 98,114,134,211,205,200, 39,161, 86,190,212,239,131, 25,171, 4, 58,189, 5, 10,141, 9,167,182,150,239,117,196, 46, 1, -173, 26,181,238,255,193,135, 95,110, 22,137,184, 28, 99,253, 58,126,241, 29, 90,214, 79,241,247,113, 83,125,181,236,251,230, 55, -110, 71,246, 26, 58,242, 3,187, 49, 33, 77,136,143,171,216,225,253,145, 3, 26, 74, 92,253,223, 45,204, 75, 46,119,202, 52,190, -189,179,220,191, 70,109,205,127, 34, 70,193, 71, 8, 69,205, 63,220, 56, 9,226, 53,153,207, 6, 2,128,183,143,191,142, 47,114, - 84, 85,193,136, 80, 0, 88,247,211,222,166, 15, 98,210,199,175, 94,189,198, 62, 34, 78,133,251,113, 10,136, 4, 28, 24, 77, 86, - 16, 27,131,218, 86,202,157, 56,119,246, 44,199,130, 66, 11,174, 68,229, 32,250,222,101,106, 80,235, 70,218,155, 29, 7, 74, 60, -131,223, 5, 80, 11,192, 11, 66,232,166,194, 44,175, 95, 41,189, 82,229, 78, 6, 86,107,209,243,178,204,163, 86, 77, 11, 79,212, -139, 47,148,180, 34,132,214, 39, 20,206, 0, 77,203, 43,190,167,218,234,212, 10,179, 98,176,124,233,124,172,221,242, 11,210,243, -116,144, 89, 82,240,235,214,197,248,236,155, 61,208,234,203,207,106,168,204,143,148,101,140, 94, 53, 92, 37,255,151,172,247,205, - 55,223,244,126,229,216,244, 46,231,152,253,105,189,146,239, 47, 91,182,108,105,169,207, 53,182,154,172,151, 70,171,100,163, 42, -217,184, 58,238,222, 1,191,255,122,244,136,115,129,218, 8, 59, 1, 23,254, 53,106, 99,225,250, 95,221,223,105,234,134, 92,163, - 12,123, 55,127,151,175,211,168,246,219,116,177,240, 12,105,225,224,224,112,234,200,225, 95, 16,232,239, 33,216,125, 61, 63, 33, - 50, 94,251, 50,212,171,204, 73, 18,214,112,212,240, 6, 14, 24, 96,127,241,210,229, 79,203, 51, 90, 92,194,173,246,211,206,195, - 30, 14, 98, 62, 8, 1, 84, 90, 51,198,191, 59,232,205,111, 99,212,202,253,224,189, 49, 32,197, 38, 75,153,151,137, 57, 95,124, -164,147,152, 98, 31, 39, 39, 38,167,117,237,243,217, 69,165,154,232,134,141,254,232,238,227,152,111, 10, 42,175,197,166,212, 94, -225,189, 4, 69,145, 3,128, 75, 8,172,212,154, 21, 92, 67,250,241,159,154, 11, 51,245, 63, 85,102,220, 84,105,207,242, 29,188, - 67, 7,239, 90, 57,229, 39, 31, 79, 15, 87,169, 68, 76,165,246, 34, 82, 63, 36, 72,208,178,101,107, 97,141,224,134,130,235, 79, -180, 72,206,209, 34, 62, 93, 1,145,103, 99,222,240,206,239, 96,215,154, 25, 29, 9, 33,156, 87,147, 20, 95,229,252,149, 91,125, -182,108, 92, 45,202,146, 27,241, 52, 89,141,204, 2, 29, 50, 10,244,200,204,215, 65, 42,230,163,125,223, 9,162,147,191,110,234, -211,165, 93,139,117,175,179,123,227,227, 19, 78, 38,166,101, 12,105, 24,214, 28,187,126,222,222,206,217,185,166, 99, 65, 65,188, -210,214,163,179,120,241, 98,225,178,101,203,120,235,215,175, 87,182,108,217,210,107,246,236,217, 61,178,179,179,239, 84,175, 94, - 61,248,236,145, 29,151, 26,183,239,215, 12, 86,163,123,187, 14,157, 4, 34, 43, 15,231, 78,156, 48, 30,216,191, 59, 79,171, 85, -125, 88,161,225,176,151, 45,206, 82, 19,184,251,250, 70, 75,133,150,110, 60,142, 60, 38,255,244,199, 59, 1, 28,169,245,206,212, - 11,151,239, 61,139,105, 26,145,232,113, 41,226,121,118,190,198, 88,231,197,233,233, 21, 94,120,185,132,128,207,229,192, 65,204, - 3,167,248,170,234,224,219,232, 57, 8,113, 47,137,156, 18,144,226,191, 0, 33, 72,207, 79,138,180, 33,103,131, 80, 43, 5,158, -165, 22, 66,173, 43, 10,205, 87,115,179, 71, 78, 86, 42,126, 88,183, 3,145,247,238,162,251, 59,125,177,225,167,221, 24,255,238, - 16, 93,101,106, 28, 78,113, 68,171, 84, 52, 75, 42,230, 1, 32,144, 23,154,112,248, 70, 10,106,213,228,216,124, 99, 0, 0, 7, -169, 61, 20, 42, 45, 56, 2, 7,188,136, 56,101,127,250,242,237,217,243,190, 94,253,121, 65, 70, 84,242,243,135,215, 17,236,166, - 64, 77, 95, 35,162, 51, 29,113, 47,175, 6,130,107, 7,130, 35,184,107,147,118,110,116,232,242, 95, 57,135,123, 55,109, 92,175, - 85,128,135, 19,180, 6, 75,113, 84,139,139,237,219,118, 34, 49, 33,245,131,220,232,163,145,111,195,209,170,179,226,114,236, 60, -131, 38, 63,188,125, 49,126,192,200,201,240,246,245,111, 84,149,180, 5, 91,222,179,216,104,180,132, 18,231,217, 51,230,175,156, -218, 61,124, 48,110, 93,191,136,251,209, 47,208,162, 69, 51,188,211,127, 56, 84,202,252,144,131, 59,215,116, 3,112,150, 39, 50, - 79,109,222,186, 51,177, 90, 44,136,125,250,232, 69, 89, 90,154,244,167,247, 1, 56,254,161,121,202,189,110, 35,169,204,229,190, -222,104, 65, 90, 90, 42,126,251,253, 74, 88,241,122, 54, 35, 18,112,113, 46, 50, 27, 70,147, 21, 70,179, 21,237, 59,116, 51, 8, - 56,250,118, 75, 86,111,107,153,145,158,193,145, 56,186, 89, 93,124,235, 10,188, 69, 70,253,131, 56,133,192,104,178, 34,208, 71, - 82,161,166,187, 79,237,165, 51,102, 76,171,203, 21,136,161, 42,212, 27, 50,210,211,188, 54,239,189,172,126,242,244,161,111, 53, - 15,153,227,183,107, 54, 9,148, 58,130,108,133, 30,249, 42, 37, 25, 57,113,166,207,150,239,191, 25, 5,192,230,185,105, 9, 69, -205,147,231,174,135, 56, 59, 8,136, 90,103,182,230, 41,141,150,145,253, 59,189, 81,221, 41, 54, 89, 19, 86,175, 90, 99, 31, 25, -167,194,131, 56, 5,236, 4, 92, 8, 5, 28, 24, 76, 86,216,114, 58, 17, 66, 56, 53, 27,116,248,176,117,211, 80,156,189,159, 11, - 46,151, 3,173,170, 64,195, 67, 94, 76,211,142,221,237,155, 52,111,137, 78, 29, 59,224,121,204, 51,255, 19,199, 14,119,185,249, -219,213, 76,169, 71,240, 20,117,246,179, 95,170, 84,207, 53, 26,174, 73,232,245,190,183,111,245, 54, 3,135,191, 47, 11,240,247, - 37, 30,110,174, 48, 83, 30, 38,188, 59,200,230, 51,191,200,152, 3,203,190,158, 13,189,222, 0,119, 39, 33, 40, 5,182,173, 91, - 8,131,193, 0, 31, 87, 17, 20,133,166,114,191, 95,153, 31, 41, 47, 10, 85,197,102,232, 19,101,153,173, 87,223, 39,132,156,152, - 53,107,214, 28, 0,116,214,172, 89,115, 74, 94,127,243,205, 55, 90, 0,233, 21, 53, 29,150, 54, 94,188,210, 27, 87,110,161,132, -194, 96, 55,239,128,155,231,206,158,145, 29,125, 96,197,173, 95,238, 33,188,133, 55, 4, 60, 14,236,101, 62,120,144,160,192,201, - 35, 27,229,191,238,219,148,166,215,235, 87, 84,222,214, 28,212,212, 65,226,120,246,231, 93,251,173,110,174,174,156, 31,206,229, -196,229,169,204, 47,155,180, 98,110, 31,179,222, 59,187,217,155,130,156,177,179,179,171,109, 48, 24,156, 43, 59,176,219,206, 37, - 21, 39,241,146,183,113,109, 5,225,114, 45,187,118,239,130,155,163, 16,122,147, 21,179, 62,255, 68, 59,166,187, 84, 62,114,232, -240,206,157,122, 77,189,196,151, 4, 93,108, 29, 22, 68, 27, 55,110, 44,231,114,185,149,234,229,197,223,249, 83,239,138,144, 26, -246,227,230,206, 28, 51,183,140,230, 66,155, 18,119, 85, 25, 15,111, 0,248, 67,132,132,212,170, 37,220,115,240,215, 79, 6, 15, - 29, 54,207,183, 81,127,105, 66,134, 2, 2, 98, 68,179,186,222,184,124,230, 23,154,154, 24, 51,173, 50,147, 5, 0,217, 57,249, -126,238,238,158,136,140, 87, 35, 45, 79,139,204, 98,147,149, 81,160,135, 74,171, 66,195, 0, 31,200, 21, 10,191,215,222,191,192, - 47,103,207,158, 29,210,171,223, 48, 76,253,124, 81,219,173, 27,191,139,146,122,213, 25,171,206,140,185, 98,203,147, 34, 33, 36, -255,139, 47,190,168,245,211, 79, 63,113, 70,141, 26,165, 13, 13, 13,181, 27, 61,122,116,219,157, 59,119,218,217,219,219,105, 31, - 92, 63, 54,111,220,199,179,250,109, 94,187,184, 81, 65, 65, 1, 49,155, 76,167,141, 5, 5,179, 84,149,152,185,228, 95,103, 63, - 37,245, 22,189,215,173,157,251, 49, 23,123, 78,125, 17, 53, 12, 39,245, 22,237,167,143, 23, 24, 95,156, 94,167, 10, 29,186,234, -227,116,185,117,174,142,227,177,164, 50,147, 5, 0, 28, 46,129,193,108,129,131,152, 15, 14,135, 83, 98,226,189,183,239, 63,109, -239, 46, 19,130,207,229,128,199, 45,138,118,230, 42,141,152,252,126, 63,155,159, 4,204, 22, 10,173,193, 12, 77,241,211,161, 74, -153,139,217,159, 79,199, 59,125, 6, 96,220,135,211, 81,160, 5,238,197,171, 96, 52,153, 42, 61, 41, 56,132, 3,141,222,140,177, -221, 3,144,175, 54,162, 80,107,134,193,108,133,189,144, 7, 62,143, 3,137, 29, 15,142,246,124,128, 82, 65,201,197,132,207,231, -235,140, 70,227,174, 10,142, 19,106,248,121, 66,107,226,160,249,176,239,208,181, 85, 29, 68,223, 56,204,187,122,235, 97,205, 79, - 63,159,139, 79,198,247,193,161,167,181,224,226, 17, 0,169, 68, 12, 19,229, 0,176,109,232, 16, 74, 23, 88,189, 67, 6,142,248, -241,167,109,207,190,154, 63,203, 78, 94, 72, 32, 18,112,113,233,226, 5,220,188,125,111,109, 78,244,209, 93,120,139,240, 41,199, -211,209,209, 17,118, 66, 46, 12, 70,189,193,246,212, 5, 10, 10,132, 73, 61,131,127, 44,126,226, 15,179, 88, 81,198,123,149, 27, - 45,190, 88, 54,107,234, 23,139,151,118, 15, 31,140,115, 39, 14,225,224,161,253,150, 86, 61, 63,224,238,222,190, 17,109,187,246, - 69,219,238,195,112,250,151,157,211,249, 98, 89,189, 9,159,124,249,117,251,206,189,112,238,228, 33,100,101,166,174,180,181,188, - 92, 62,153,218,185, 91, 31,232, 12, 22,180,235,210, 27,103,142,255,242, 49,138, 59, 89,216,126, 19,123,229,250, 12,142,121,250, -180,169,252,108,185,129,159,163, 52, 32, 53, 71,131,132, 44, 13,126,221,183,149,218,126,189, 48, 52,107,223,176, 26,127,194,242, - 75, 41,126,213,188,245,124,189, 86, 28,243, 34, 46,100,220,251, 99,248, 53,107,135,112,178, 21,122,228, 40,244,200, 85,232,161, -214,153, 81,187, 90, 16,199,100, 38,173,170,122,156,221,100, 66,254,134,227,241,112,148,240,209, 58,228,245, 59,218, 90,173,214, -255,152,172,213, 69, 38, 43, 42, 94, 1,145,128, 11,145,128, 3,145,128, 11,179,133,218,244,224, 34,246,168,211,107,242,148,143, -124, 12,102, 32, 79, 97, 0,143, 75,224,225,230, 44,105,214,104, 4,182,125,247, 49, 0, 96,252, 23, 63, 96,220,216,209,168, 91, - 63, 20,242,130, 2,175, 17,131,123,173, 6,240,139,173,101, 61,117,238,138,255,185,107,145, 95, 76,158,177, 64, 58,180, 79, 39, -238,253, 56, 5, 50,242,245,120, 17,163,170, 82,228, 13, 0,204, 22, 43, 40, 40,118,236, 63, 1,177,144,135, 28,133, 17,148, 82, - 44, 94,127, 0, 14, 98, 62, 50, 10,138,154,251, 43,162, 34, 63, 82, 81, 68,170, 10,209,198,222, 40,202,229,114,183, 53,162,245, -205, 55,223, 68,127,243,205, 55,101, 70,200, 74, 76,214,107, 79, 42, 45, 20, 74, 67,220, 92,125,110,157, 59,115,202,225,151, 7, - 22, 92,126,144,135,193,237,170, 65,157,159,140, 21,159, 15,205, 39,160, 6, 14,151, 43,215,107, 53, 71,180,218,194, 37,148, 82, - 99,133, 38,203, 59, 56, 76, 34,118,188,176, 97,243,207,102, 55, 15, 15,236,186,158,159, 90, 80,104, 54,253,167,217,202, 68,238, -157,221, 92,211,108, 53,245,212,102,198, 86,250,120,107,165, 16,124,179,241, 87, 0, 20, 86,171, 21,212,106, 5,223, 78, 42,113, -175,213, 42,171,248, 66,103,199,227, 16, 93,233, 43, 0,181,154, 83,115,226, 42, 14,131, 18, 0, 50,123, 62,246, 95, 77, 3,128, - 44,174, 42,226,201,200,161, 69,205,133, 58,131,157,178,126,173, 90,180, 89,179,102,114,177, 88,252,218, 7,187,170,205,133, 54, - 85,160, 23, 47, 12, 0,150,251, 4,183, 27,208, 67,218,176,185,144, 35, 64,147, 96,111, 92, 62,123,148,222, 58,179,109,188, 38, -235,217,207, 54, 86, 68,168,117, 38,164,231,233,144,150,167, 67,102,129, 14,153,249,122,100, 22,232, 64, 8,129,206,240,102,195, -223, 20,102, 63, 59,184,235,231, 45,125,245, 70, 12,111,223,125, 0,166, 47,216, 16,176,235,199,101, 23,196,158, 33,109,108, 73, -180,165,148, 90, 8, 33,137,239,191,255,126,163,189,123,247,114, 27, 52,104,160,125,242,228,137, 61, 0, 43, 0,163, 84,106, 47, -222,250,253, 55,103,155, 55,111,190, 47, 45,230,233, 37, 0, 5,182,116,207,175,222,241,125, 81,136, 99,254, 4,127, 73,235, 30, -129, 94,246,240,151,168,122,132, 72, 31,172,240,232,242,233,210,236,139,107,178, 51,244,230,243, 57, 90,110,227, 52, 53,223,166, - 92, 65,147, 94,151, 52,112,240,112,112, 9, 7, 70,157, 38,169,164,114,121,200,132, 88,184,251, 41,164,118,124, 56,136,121,144, -138,249,104, 91,207, 5, 85,184,158, 81,147,197, 10,141,222, 2,173,222, 12,157,193, 12, 55, 63,103,252,180,235, 32,146,179,181, -248,245,110, 46,158, 37,169, 16, 84, 77, 2, 74, 43,191, 76, 90, 45,166,194, 62,131, 70, 57,112, 57, 4, 92, 14,225,212, 11,169, -131,124,181, 17, 2, 30, 7, 2, 59, 49, 36, 34, 30, 28,197,124, 8, 4,124,100,103,103, 67,175,215,195,223,223,223,174, 98, 43, - 72,225, 32, 21, 35,168,166, 15,140, 38, 51, 78, 93,123,140, 37,211, 6,162, 91,251,166, 32,124, 41,158,234,195,224,224,226, 0, - 43,135, 3,163,217, 10,131,209, 2,128, 83,110,244,205,223,223,191,179, 68, 34,145,104, 52, 26, 85, 82, 82,210,149,140,167, 71, -146, 61,234,247,159,112,230,220,165, 93,189,223,233,134,200,168,104, 28,250,229,216,245, 92, 87,197,140,146,239, 52,104,208,160, -165,155,155,155, 52, 47, 47, 79,249,240,225,195, 59,175,249,244, 75, 36,158, 33,159,182,106,219, 17,106,121, 54,178, 82, 18,108, -126,138,174, 27,224,128, 47,191,217,208, 36,184, 78,112, 19, 11, 45, 50, 94,245,252, 29,240,217,130,117, 77,106, 5,213,105, 82, -210, 33,164,174,191,180, 98,147, 37,113,236,254,238,132,207,190,233, 59,248, 61, 92, 58,119, 12,171,150,124,190, 75, 34,115,175, -235,226, 44,107,220,160,101,119, 92,191,112, 12,118, 14, 94,112,118,245,106, 59,106,236,148,174,131, 71, 77,196,205,235, 23,176, -118,217,156,157, 22,189,106,143, 45,101,149,122, 6,186, 55,110,214,126,164,131,139, 39,228, 10, 21, 28,156, 61, 80,183, 97,179, -145, 82,207,192, 47,212, 89,113, 57,175,123,174, 91, 41,133,222, 72, 81,160, 54, 34, 37, 71,139,196,204, 34,163,101,181, 86, 33, - 39,200, 98, 37, 82, 59, 30,207,197,244,220,255,225,133, 75, 52,192,207,147, 44,255,250,115,174, 17,118,200,145, 23,153,172, 28, -165, 1, 57, 10, 3,212, 58, 19, 92, 36, 60, 88, 45,214, 42, 63,117, 23,168,141,112, 40,206,163,181, 88, 95, 63, 55,124,227,246, -253,193, 15, 98,210,251,175, 90,181,198,254,126,124, 41,147,197, 47,138,102,137, 4, 92, 88,172,214,226, 59, 77, 37, 6,155,199, -159,218,175, 87, 87,164,228,106,139,122, 45,115, 8,130, 66,155,195, 77,108, 69,151, 97,179, 0, 0,125,122, 21, 13, 95, 18,159, - 81,136,227,183,114,128, 63, 38,118, 87,124, 45,214,106,185,155,119,159,252,244,224,129,125, 50,157,133,135, 77,167, 19,161,209, -155, 97, 39,224, 66, 36,224, 66, 44,224,254, 33, 31,187,114,163, 85,148,115,151,156,107,130, 70,167,131, 82,107, 2, 5,112,231, -185, 26, 90,131, 25,138, 66, 19, 90,134, 56,191,233,179,207, 73, 0,225,175, 26,162, 87,205, 82,169,136, 84, 89,220, 45,173, 81, -178,126,121, 70,174,116,206, 22,128, 42,245,224,226,189,234, 28, 75,191, 22, 74, 93,234,202, 92,221,111,157, 57,125, 66,250,203, - 3, 43,174, 68, 21,153, 44,147, 54, 23, 43,191, 24,145,170,148,231,118,162,148,198,217,250, 99, 18,247,122, 13,197,246,246,151, -190, 93,179,201,232,225,233,107, 61,114, 75,158,173,208, 88,254, 16, 67,180,232,245, 28,106,165, 2, 91, 76, 86,113,147,135,113, -193,199, 3, 96,165, 20, 11,215, 28,196,210, 25,195, 32, 21,143,178, 39,132,216, 23,234,204,152,182,104, 11, 86,126,249,129,131, -189,136, 7, 66, 0,157,193,130,119,135, 15,176,173, 2,234,204,120,113,123,175, 90, 21,127,226, 73,233,230,194, 22,109,223,185, -215,162, 69, 11,185,179,179, 51,196, 98,241,127, 34, 21, 54, 94,180,203,234, 93,152, 45, 71,170,131,131, 67, 7, 71, 71,199,210, -122,133,114,185,252,232,235,212, 66,149, 60,247, 82,102,226,195,230,109, 58,245,193,149,179, 71,233,173,211, 91,199, 87,101,140, - 30,103, 23,231,148,136,135, 47,234, 18,226, 82, 20,209, 42, 54, 89, 6,147, 21, 1,158,246, 72, 73,124, 1, 39,153, 44,197, 86, - 61,123,143,144,126,132, 67, 63, 36,160,219,212,153, 49, 7,139, 77,207, 8,137, 87, 72, 84,244,163,251, 75,122,143,156,202,235, - 62,248, 35,238,143,223, 76,153,131, 87,146, 88, 43,192,248,236,217,179,199, 31,124,240, 65,235,155, 55,111, 90, 0,104, 8, 33, - 38, 46,151,107,111, 48, 24, 4,157, 58,117, 82, 60,125,250,244, 42,202, 72, 90,124,149,118, 99, 15,185, 17,145,234,157, 90, 65, -205, 70, 4, 56,168,186,117,106,215, 10,173,234,251, 33,165, 93, 43, 0,152,154,164,150, 6,183,157,180,117,127, 77,247,106,167, -126,220,126,124,233,248, 97, 93,167,249,244, 89,180, 42,253,248,130, 10, 19, 81,147, 31, 95,233, 81,150,141,231,113, 57,112, 16, -243, 33, 21,243,224, 32,230,195,193,142, 15,147,153, 86,229,201,145,154,204,214,162,136,150,193, 12,181,214,140, 75,247,179,144, -169, 48, 64,174, 50, 66,107,180,128,130, 22, 61,141,218,112, 53,207,142,189,225,244,242,216, 7, 52, 81,108, 94,255,157,227,225, - 27,169, 47,123,244,201,236,133,112,176, 47,234,141,125,237,218, 53,184,186, 86,254,180,111,181, 90,113,232,204, 29,172,218,113, - 9,103,182,205,132,157,128,139,134,253, 22,225,189,254, 45, 96,165, 86,188,120, 22,157, 21, 84,175,145, 39,135, 35, 6,135, 16, -232, 77, 86, 0,180,220,253,105, 48, 24, 92,147,147,147,149,181,107,215,246,242,245,245, 29,204,229,114,169, 8,208, 31,221,151, -175,185,120, 98,143,125,161, 86,111,177, 55, 43,182,213,206,208,134, 7, 5, 5,129, 16, 66,221,220,220, 4,151, 46, 93, 82,135, -134,134,186,191,166,201,226,136, 61,234,172, 29, 55,233,211,193,181, 2, 3,113,112,207, 54, 80, 74, 14,219,250,253,221,199,111, -226,235,217,127,236, 97,248,217,130,117, 77, 86, 46,154,250,135,247, 38,205, 94, 85, 97,175, 67,177, 72, 58, 99,224,136, 9,184, -119,231,119,172, 88,244,217, 62,189, 58,255, 61,147,217, 52, 36, 63, 35,126, 95,205,122, 45, 64,141, 42,156, 59,240, 29,134,141, - 30, 47,234,222,123, 48,110, 94,191,128,165,115, 38,237,214,200,179,223,183,117,252, 47, 43,229,127,216,169, 71,127,190, 86,111, -196,186,229,243, 49,113,198, 18,180,236,220,135,255,232,254,173, 15, 1,124,101,235, 54,235,141, 22,116, 10,117, 43, 50,207, 38, - 43,142,197,115,121,101,213, 64, 30,151,112, 26, 7, 58, 65,107, 48, 67,169, 49, 85,124,163, 18,240, 51,229, 10,101,245,239,151, -126,202, 45,212,153,145,163, 48, 32, 91,161, 71,174,252, 63, 6, 43, 87,161, 71,142,194, 0, 62,143, 32, 38, 46, 9, 28, 62,175, -202,249,121, 5,106, 19,154,215,113, 46, 58, 71, 95,179,117,196,196,115,108,113,230,234,131,129,171, 86,173,182,123,144,160, 66, - 84,188,178, 56,146,197,133,136,207,129,176,248,127,139, 21,168,236, 39,100, 30,181,106,142,249, 96,124, 23, 71,169, 24,233,177, -217,224,113,139,134,136,145,121,248, 65, 38,210, 97,202,164, 9,112,115,117, 66,114,174, 30,107,127,137, 65,212,227,231,176,106, -171,182,217,235, 54,237,235, 57,110,242,103, 78, 28,190, 16, 59,207, 38, 20,149,147,107,193,211, 91,199,117,233, 47, 30, 22,170, -149,121, 20,212, 98, 99, 0,128, 80,179,165,168,186, 45, 93, 56, 11,251,118,252,128,179, 17,217, 47,147,183,110, 28, 94,137, 79, -103, 47, 70,174,210, 80, 92,245, 43,142,100,189,242, 58,167, 84, 36,234, 79,175, 75,153,163,178, 94,147,226,215,134,114, 52, 12, -175,152, 43,195, 43,239, 27, 94,209,123, 80,198,195,255,230, 74,155, 14,255,100,138,156, 61, 26,200, 28,100,191,159, 62,125, 92, -114, 52,138,190, 52, 89, 70, 77, 46, 93, 50,181, 79,170, 82,158,211,189, 74, 38,203,163, 78, 3,145, 68,114,117,222,226,181,122, - 79,223,234,230, 83,247,149,121, 42,157,229, 79, 97, 17,129,189,196, 34,145,185,235,156, 2,194, 86,241,181,134,249, 57, 57,143, - 11, 43,139, 60, 89, 41,197,137,219,153,160,180,232, 17,233,192,181, 52, 20, 63,153,195, 98, 45,106, 86, 57,127, 63, 27,188,226, - 60, 20, 91,195,223, 27, 55,253,160, 12, 15, 85, 20,142, 92,186,240,101,115, 97,203, 70, 69,145, 44, 71, 71, 71, 56, 57, 57, 65, - 42,149,194,150,166,195, 18,202,235, 93,232,224,224,208,225,254,253,251,118,142,142,142,224,114,185,208,235,245,168, 95,191,254, -107,157,232, 82,175,144,201,205, 59, 15,152,211,182,115, 31, 92, 58,115,132,222, 58,179,125, 66, 85, 7, 66, 12,239,218,250,248, -215, 95, 47,172, 57,111,201,247, 34, 7, 59, 30,158,168, 13,224, 16,130, 0, 79,123,184, 74, 56,184,114,116,167,110, 88,159,214, - 54, 15,142,231,231,231,187,107,229,250,205,146,149,203, 22,117,114,240, 13,190,164, 74,123,150, 15, 0,133,153, 79,151,219,123, -133, 60,174,246,251,185, 83,141, 58, 12,128,167, 79, 96,183, 42,132,127, 41, 33, 68, 19, 23, 23, 23, 63,111,222,188,224,101,203, -150, 81, 46,151,107, 5, 32, 90,179,102,141, 38, 54, 54,246, 62,138,186,230,162,178,155, 77,151,110,245,167, 73,133,150,150, 46, -246,156,250,129, 94,246,104, 85,191,168, 85,116, 88,120, 91,248,249,251, 35, 46, 83,211, 56, 95, 99,229,171, 13,220,192, 13,155, -162,238,214,112,227,142, 55,107, 13,143, 81,201, 96,178,229,213,217,146, 4,249,146,104,150,131,152, 15,107,209,141,189, 74, 70, - 75,111,180, 64,171,183, 64,107, 48,163,208, 96,129,198, 96,129,149, 22,157, 19,132, 16, 24,205, 86,216,244,216,252, 74,221,119, -116,113, 67, 96,141,162, 94,178, 14,226,162,161, 30, 28,237,249, 69,125,164, 93, 93,225,225,225, 97, 83, 84,212, 96, 44, 58,197, - 13, 38,235,203,102,125,131,209, 12, 74, 41, 98, 98,158,205, 76,140,143,239, 87, 59,168,118,251,122, 13, 27,185,216,139, 56, 0, - 80,174,209,210,104, 52, 22, 7, 7, 7, 15, 23, 23, 23, 78, 90, 90,218, 75,243, 92,187,113, 39,243, 47, 71, 14, 99,224,192, 1, -234, 39,119, 30,188,236,226,174,213,106, 73,155, 54,109, 28,253,252,252, 56,122,189, 94, 89,181,125, 64,136,196,189, 78,127,191, -144,214, 75,222,125,127, 98,157, 78, 93,123,226,242,197,115,248,245,200,222,159, 11,179,159,217, 60,114,118,112,112,200,159,122, - 29,214, 10,170,243,167, 94,135,213,107, 6, 85,104,180,234, 53,108,214,130, 18, 30,206,158, 56, 64,117, 28,227,164,162,132,119, -114, 96,255,198, 47,191, 26,241,225,236, 90,189,250,142,192,187,163,223, 3,143,199,197,149,243,199,177,114,209,244,147,106, 69, -246, 24, 91,210, 4, 0,128,212,171, 39,168,237, 95,253, 19,255, 90, 13, 16,113,235, 58, 94,196, 60,138,126,112,247,102,253,218, -161, 45,225,238, 19,240, 9,169, 87,111, 25,125,252,216, 88,153,142, 65,167, 75,122,111,204,104,148,238,117,216, 42, 44,216,149, -188,122, 2, 0,208,168,178,141, 91,191,155, 22, 91,210,235,208,106, 52, 36,149,167,171, 40,200, 57,116,229,183,219, 51,250,133, -247,228,228, 42, 13, 69, 17, 44,133,161,120,209, 35,183,228,127,165, 30, 65, 62, 82, 60,139,142,176,234, 20,185,135,171,120, 94, -234,222, 27,210,227,113, 73,221,181, 90, 41, 8,160,171,234,249, 77,249,142, 19,150,175, 88,101,247, 32, 94,141,168, 4,101, 81, - 83, 33,159, 91,100,176,248,156,151,166,171,168, 55,123, 37,209, 33,194, 93, 58,118,204,112,228, 42,141,176, 90, 1, 30,151, 83, -188, 8,144,172, 34, 72, 81,105,144, 91,144,131,248,196, 36,200, 51, 95,128,195,225,192,205,167, 14,108, 13, 63, 90,168,208, 91, - 99,160,161,131,195,219,243,142,252,158, 1,123, 17, 15,122, 85, 22, 78,239,255, 46, 71,175, 86, 46,209,106,212, 71,180,121,177, -233,182,110, 59,135,144, 28,165, 90,231, 41,226,115,113,112,199,247, 24,242,222,164,226,157, 82,244,103,230,220,175, 1, 14, 65, -126,129, 10,132,144,170, 70, 73,239, 86,242,250,117,120, 27, 26, 40,203, 92,253,225, 65,161,252,167, 81,122,250,220,153,227,146, - 27,137, 34,220,121,150, 81,108,178,114,172,139, 63, 14, 79, 85, 41,242,123, 80, 74, 99,170, 84, 2, 14,167,199,176,177, 51,162, - 3,235,212,211, 95,126,164, 78,144, 23,154,202,205,115,104, 53,120, 94,244,189,147,235,123, 41, 76,113, 31, 73,125,234, 91,172, -102,243,114, 77,246,179, 69,229, 52, 29, 10, 23,173, 61,248,178,217,240,139,101, 59,139,254,183, 88, 96,161, 86, 80, 43, 48,229, -203,141, 48, 91, 45,176, 90, 44,176, 90, 40, 76, 22,106, 95, 89,113, 61,124,170, 31, 41,120,122, 32,100,228, 87,127,110, 46,116, -114,114,130,171,171, 43, 92, 93, 93, 81, 98,140,222,180,185,208,209,209, 17, 82,169, 20,215,175, 95,135, 88, 44,134, 68, 34,169, -146,110, 41,147,245, 81,179,142,253,190,239,220,247, 3,156, 63,178,137,222,189,118,124,162, 38,235,217, 22,155, 35,244, 22, 11, - 49,153, 76, 8,239,222, 49, 41, 50,250,249,153,185, 51, 62,236,217,186,247, 68, 81,171, 96, 95,232, 12, 22,164, 38,190,192,149, -163,219,117,117,106,122,159,237,210,174, 69,146,201,100,130,197, 98,169,244, 70,174, 51, 24,115,185,124,177,100,248,240,145,252, -187,119,238, 28,150,122,212, 57,104, 33,156, 7,132, 90, 27, 18, 66, 6, 54,108, 88, 23, 70,147, 21, 26,141,178,160,170,219,172, - 82,169,226,183,109,219, 86,115,204,152, 49,246,245,234,213,227,191,120,241, 2, 43, 87,174,204, 83,169, 84,241,182,106,156,187, -246,108, 13,143, 20,196, 10,173,198, 17, 1, 14,170,110,201,109, 91, 97,120,239,182,216,119,242, 6,174, 92,191,137, 36,181,244, -190,218,204, 59,154,146,148,174,175,239,162, 60,220,183, 85,117,238,193, 29, 5,135, 61, 58,205, 30, 74,169,232, 92,206,149, 5, -133,182,223,196, 1,149,214, 4, 71,251,162,241,158, 74, 34, 91, 92, 66,108,118, 68, 4,136,191,126, 51,162, 65,211,160,122,136, -140, 87, 32, 91,174,135, 86,111,134,213, 74, 97, 5,133,171,131, 16,118, 2, 14,146, 19,227, 97,165,198,132, 42, 94, 46,114, 58, -180,239,192, 3, 8, 8,161, 60, 62,143, 7,138,162,241, 21,197, 98,177,218,195,195,195,166,136,150,209,108,198,192,158, 45,208, -178, 89, 67,244,155, 88, 52,102,230,197,159,103,193, 89,202,199,190, 93, 91,144,124,117,245,174,192,214,147,206, 61,122, 24, 61, - 40, 58,242,247,145,239, 52, 17, 55,246,226,165, 11,202,211, 83,171,213,135, 9, 33, 66,129, 64,208,179,125,251,246, 46,135, 15, - 31,150,187,185,185, 89,133, 2, 65, 78,223, 62,189,173,124,129, 32,191,100,221,223,126,251,141, 63,113,226, 68,135,130,130,130, -228,172,172,172,155,148, 82, 83,197, 15,130, 33, 93,193,193, 94, 16, 98, 39, 21,219, 39,181,234, 58,220,167, 89,203, 22,178,254, - 3,135, 64, 36, 20,225,252,185, 51, 88,183,122,217, 1,117,198,147,177, 85,217,147,111,171,215, 97,106,114, 66,188, 70,171, 15, -109,208,180, 35,185,126,238,232, 84, 66,220, 87,115, 69,142,223,117, 29, 56,169, 86,124,186, 26,235,190,153, 9,103,153, 4, 9, - 47,158,106, 99,159, 60,220,104,210, 41,103,218,106,178, 0,192, 62,207, 50,168,213,232,158,206,122,163, 5,215, 46,157,212, 89, -205,214,158, 55,175,158,122, 81,173, 78, 51,187, 6,205,186, 56,231,254,186,101, 32,128,125,149,233,164, 62,249,115, 4,215, 63, -184,121,194,197, 75, 23,100,158, 1,245,185, 4, 4, 70,189, 14, 57,113,119,205,154,172,167, 74, 69,234, 67,155,122,225,230,165, -224,203,217, 11,190,253,168, 89,211,166, 18, 10,187, 63, 68,176, 74, 12, 86,174,210, 0, 55, 7, 33,180,202, 28,196,222, 61,163, -211,228,112, 43, 28,239,204,108, 40,180,207,205,206,122,217,196,166,206,122,214,178,162,245,115,179,179,132,102, 67,161,125,229, -183, 58, 46, 28, 37, 66, 60, 76, 72,123,153,248, 46,226, 23,229,102, 9,249,220,151,121, 90, 37,215,130, 74,232, 40,176,115, 66, - 90,158, 14, 4, 20, 86,139, 25,102,147, 1, 42,165, 18,105,233,153,200,202,204,130, 74, 37,135,189,212, 25, 13, 26, 55,135,131, -196, 14, 15,174, 28, 0,165,212,166,113, 13, 77,132, 31,220,172,101, 59,209,163,196,162, 92, 44, 59, 62,197,241,189,203,242,212, -202,236,118,170,244,152,216,170, 94,139,205, 22,203,133,168,199,177,245,171,121,215, 32,247, 95, 40,176,235,167,245, 48, 20, 71, - 54, 77, 38, 11, 30, 37, 23, 34, 35, 95,131,228,184, 39,212,106,177,252,107, 38,164,230,149, 31, 0, 4,175, 97,131,186,232, 62, -170, 63,126,248, 97, 35,226,226, 19,173, 75,166,246, 74, 86,171,228,239,216,106,178, 74,207,238, 93,152,249,116,249,216, 31, 18, - 82,143, 69,230,115,180,134,138,231,183,178,115, 15, 64,187,177, 43,207,106, 85,249, 66,139, 94,195, 59,190,107,236,222,178, 52, -139, 28, 52, 12, 75, 62, 27, 6,169,152, 7, 66, 8, 74,154, 11, 55,124, 61, 1,246,162,162,182,101,173,222,140, 81,211, 86, 97, -215,170,233,160, 0, 70, 12,185,161, 41,175,156,165,154,246,170, 37, 37,102,167,117,237,243,217, 69,157, 81,164,239, 61, 96,204, -189,166, 77,155,202,197, 98, 49,196, 98, 49, 28, 29, 29,225,236,236, 12, 39, 39,167, 74,183,189,220,193, 72, 75,245, 46,228,112, - 56,224,112, 56,144, 72, 36,144, 74,165,144, 72, 36, 21,106,150,107,178, 58,244,221,208,165,223, 56,156, 63,178,153,222,189,118, -252, 67, 77,214,179,159,108, 61, 70,197,205, 61, 15, 6, 14, 28, 24, 58,113,226, 68,193,130, 25, 19,207,158, 60,119, 37,230,224, -137,205,125, 10, 10,228,126,148, 82, 56,201,100, 41,195,250,180, 62,222,169, 77,179,164,139, 23, 47, 90,247,238,221,171, 39,132, - 60,172,172,156,185,217,217, 63, 95,188,112,105, 97,187, 14, 29,177,101,199,222, 14,209,143,159,116,120,241, 34, 22,126, 1,129, -168, 81, 51, 8, 26,226,140, 75, 87,175, 67, 45,207,254,217,150,114,190, 18,213, 34, 5, 5, 5,191, 15, 27, 54,172,251,141, 27, - 55, 56,195,134, 13,211,228,230,230,254, 86,242, 28, 85, 94, 52,171,180,230,239, 27,251,231, 0,248,185,122,199,247, 15,164, 25, -229,159, 0, 88,230, 31,224,143, 43,215,111,226,230,141,219, 27,115,237,253, 23,141, 29,245,254,132,234,125,185,227,250,182,170, -206,245,112,182,199,158,205, 43,185,199,110, 38,174, 74,204,179,108, 1,240,181, 45,199,232,229,141, 67,101, 68,155,186, 46, 48, - 89, 40,172,180,232,130,235, 96,199, 47,243,194, 91,150, 38,207, 32, 26,251,225,196,137, 47, 26, 52,108,252,233,168,247, 63, 20, - 52, 14,244,195,157,231,114,128, 16,184,120, 73,144,145,145,129,107,135, 54,155, 11,210,158,110,228,114,173, 95, 85,165, 46,229, - 39, 70,214, 46,181,222,132,220,220, 92, 92,185,114, 5, 37, 6,203,221,221,189, 76,163,245,170,102, 94, 86,250,111, 95,175,216, -212,102,252,187, 3,208,187, 99,125, 92,189,251, 2,134,226,241,154, 74,186,146,199,223,252, 81,248,201,176, 64,195, 71, 3,235, - 40,181, 38, 97,226,151, 9,138,107,165,123,197,190,170, 73, 41, 53, 16, 66,142, 61,123,246,172,109,163, 70,141,170,159, 58,117, - 42, 63,250,246,217,169,165,203,241,217,103,159, 73,127,248,225, 7,123, 74,233,111,122,189, 62,206,166,109,231, 96, 79,196,189, -123,174, 70,147, 21,215,111, 63,168,219,165, 77, 99, 88, 41,112,247,238, 93,108,217,186, 69,247, 48,234,254,119,133, 89, 94, 95, -149,103, 94,202,219,159,150, 55,232,117, 88, 90, 51, 35, 45,241,187,243, 39, 15,237,106,214,161, 15, 70, 78,249,234,171, 43, 39, -247, 46,108,210,174, 55,167,110,179,238,136,184,121, 9, 23, 78,157,249,214,168,206, 95, 88,217, 60,164,229,149, 83, 36,182,255, -184, 94,147, 14, 72, 78, 74, 68, 66,236,163,159,181,121,177,233, 82,175,144,159,211, 83,147, 62,172, 89,191, 13,110,156,221, 55, -181, 60,163, 85, 89,157,247,115, 23,111, 62,117,226,216,240,212,212, 31,189, 10,181, 58, 17,165, 84, 39, 18,242, 50,165,156,242, -123,168,255,249,184, 63, 54, 74, 92,106, 12, 28, 50,234,195,147,235,214,173,230,123, 58,217, 35,179, 64, 7,165,214, 8,149,198, - 8, 14, 33,168,237, 35,129, 70,149,143,171,135, 86,152, 12,234,130, 97,148, 62, 55,150,167, 41,245, 12, 89, 12,208, 41,159, 77, -186, 12,161,204,207,167,102,151, 57, 21, 70,235, 84,233, 81,125, 62,155,116, 60,152, 82,218, 69,234, 25,162, 42,153,235,176,172, -109, 39,164,232,252, 30,217,201, 15, 70,115,209,248, 99,102, 43, 96,177, 90,139,163,124, 0,125,217,158, 79, 42,217,118, 98,221, -127,242, 55,164,103,201,161, 53,152,160, 55,152, 97, 52, 89,192,225,114,225,228,236,132,160, 26, 97,144, 57, 57, 34, 43, 51, 29, - 55, 47, 30, 67, 76,212,213,223, 8,197, 34, 77,118,204, 69, 91,142,145, 64,236, 20,236,237,227,197,201, 80, 26, 32, 22,114,113, -255,234, 41,163,201,160,255,206, 22,147, 85,150,166, 60, 47,127,213,167, 51, 62, 31,177,125,219, 14,175,208,154,142, 72,205,213, - 34, 53, 71, 7,149,206, 84,108,196,172,208,171,115, 17,117,105, 71,166, 69,167, 90,245,175, 55, 90,102,163, 78,117,248,204, 29, -215, 89, 11, 87,112,159,191,136, 51, 45,254, 36, 60, 85,171, 86,246,170,114, 36,171, 20,219, 62,170,177,175,106,223, 40, 30,210, -228,171,196,138,159,191, 95,109, 46,164, 86, 88, 41,197,241,219,153, 47,155, 11,173,197,153,151,145, 47,228, 85,106,218,139,122, -166,218,173,213,102,201,158, 62,255,174, 0, 0,184, 92,238,203,165, 36,151, 74,167,211, 25, 94,167,185,240,213,196,119,171,213, - 10, 71, 71, 71,136,197,226, 42, 55, 73, 74, 60,131,135, 55,235,216,239,251, 46,253,199,227,194, 47, 63,209,187, 87,143, 77,210, -100, 63,219, 92,229, 28,133,130,130,104, 66, 72,236,119,223,125,215,120,203,150, 45, 53,103,204,152, 17,183,243,251,133,235, 0, - 32, 47,175,104, 14,224,200,200, 72, 58,105,210, 36,189, 78,167,139, 47, 40, 40,136,168,172, 3, 4, 0,104,115,236,151,110,217, -176,172, 65, 74, 90,198,128,192, 6,205,225, 94,179, 57,188,106,183, 64,129,202,136, 59,207,211, 17,247,228, 34,158, 92, 63,116, - 74, 35, 53, 47,172,106,153, 27, 53,106,228,199,225,112,106,168,213,106,175,122,245,234, 53,146, 72, 36,145,141, 26, 53, 10,227, -241,120,169,247,238,221, 75,172,138, 86,226,149,237,250,234, 29,223, 95,155,164,114,232, 20,151,169, 9, 75, 82, 57, 68,106, 68, -178,233,217, 23,215,232, 61,187,127,183,138, 26,115,163, 15,238, 80, 30,222,179,121, 37,119,212,132,207, 44,143, 20,206,159,240, -196,194,243,223,188, 23, 90,133,102, 41, 78,198, 71, 99,250,253,103,120,135,226, 72, 86,241,255, 54,133,233,229,242, 7, 10, 0, - 95,136,125,234,127,255,232,147,137, 95, 55,108,214,102,116,251,119,134,113,204, 2, 41,206,254,242, 35,141,143,186,116,144, 71, - 45,115, 53, 54,204, 6, 80,105,115,144,193, 80,169,201, 42,179,185, 39, 69,210,241,224,222,173,239, 29,254,229,200, 55,253,251, -246,115,221,240,229, 80,172,216,116, 20, 18,177, 8,212,106,197,176,206,254,131,159,236,237,209,199,207,211,206,247,240,229,212, -107, 83, 86, 63,250, 66,163, 49,198, 84, 22,137, 41, 54,206,215, 29, 28, 28,114,218,182,109,219, 82, 36, 18,145,220,220, 92,158, -135,135,135, 89, 38,147, 25, 82, 83, 83, 53,122,189,254, 48,165,180,176, 42,219,105, 52, 89,145,144,165,195,175, 71, 14,227,193, -237,139,120,242,228,153,234,201,227, 39,235, 9,143,174, 86,103,198,228,191,206,190,179,150,217,235,144, 86,185,215,161, 69,175, -218,179,115,227,226,206, 26,157,254,189, 70,173,195, 81,189,110, 27,142,209,100,193,195,187,151,113,249,208,234, 21, 6, 85,222, -172, 55, 57,198, 62,213,106, 6, 81,174, 16,191, 95, 57, 9,106,181,110, 4, 0,106,181,110,140,188,113,234,195, 22,189,198,193, -197,163,122, 35, 66, 8,169,234,124,143, 0, 32,224,113, 10, 79, 31,222,254, 75, 66, 66, 2,158, 62,125,138,231,207,159, 35, 63, - 63, 31,123,246, 36, 84,233,248, 20,230, 39,156,151,186, 6,246, 24, 52,116,228,241,193,195,223,181,171, 25, 20,202, 9,174,230, - 12, 87, 41, 15,207,158, 39, 34,230, 94,148,245,217,157, 83, 58,163, 50,187,191, 38, 63,161, 92,227, 39,113,175,231, 73, 56,116, - 86,201,220,133,173, 90,181, 9,254,124,201, 55, 45, 93,221, 61,202,188,142,231,229,100, 11,103, 78, 57, 22,124,243,214,239, 54, -205,117,104,181, 88,242, 38,188, 55,204,202, 45,154, 40, 20, 47,227,212,164,232, 96, 23, 61, 76, 21,189, 79,173,230, 74, 35,248, -239, 15,104, 7,179,213,138, 66,173, 17,202, 66, 61, 20, 42, 29, 50,178,243,240, 32, 42, 10, 87,143, 31,195,139,103, 15,226, 77, - 6,195, 57, 14,135, 28,210,100, 62,187, 90,181,150, 38, 94, 77, 87, 23, 23,196,231,171, 97, 39,228, 33, 49,230,158,190, 80,169, -216,253,186,245, 72,147, 27,147, 33,241, 12,238, 62,108,216,240, 51,157,123,244,149, 53,107,221,213,222,205,209, 9, 2, 30, 69, -108, 66, 58, 34,126, 59, 83, 24,247,224,154,210,100, 80,247,124, 27,179,190,252, 47, 99, 83,175, 67,163,190,176,207,136,126, 29, -142,112,185, 60,161,213,106,214, 27, 13,250, 65,111, 98,178,254, 42, 40,181,164,190, 55, 98,192, 31,158, 13,204, 86, 42, 30, 49, -228,172,182,244,179,130,201, 66,237, 71, 12,249, 77, 83,116, 1, 41, 63,177,239,101,211,222,190,243,169, 73, 73,121,119,243,243, -245,151,223,180, 39, 96,233,185, 11, 43,232, 93, 88, 24, 18, 18,242,210, 92,113,185, 92, 88, 44, 22,155, 47, 68, 2,145,120,124, -231,190, 31,144, 11, 71,127,162,119,174, 28,253, 72,147, 29,179,233, 13,218,153,141, 0,110, 19, 66, 30,205,157, 59,183,153,167, -167,167,231,252,249,243,237,148, 74, 37,127,195,134, 13,186,220,220,220, 76,165, 82,121,147, 82,170,181, 93, 51,194, 4, 96,160, -212,179, 78, 39,122,248,167,110, 78,110,190,221,101,238,213,106,201,115,210,226, 21, 57,233,231, 0, 92, 40, 30, 40,178, 74,132, -133,133, 5,114, 56,156, 97, 0, 26, 72, 36,146,218, 82,169, 84, 68, 41, 13, 33,132, 68, 91,173,214,168,122,245,234,157, 0, 80, -165,227,151,120,101,187,190,253, 71, 91,247,230,107,172, 2, 3, 71,176, 55,241,202,118, 61, 0,100,157,155,161, 1,240,171,103, -167, 89, 3,143,221, 76, 92, 23, 93, 32,155,154,125,121,233,177,170,150, 89,158,114,191,246,219,170,255,218,244,232, 84, 0,239, - 73, 60,131, 87, 62,140,188,185,128, 80,240, 45, 48, 47,214,100,197,222,123, 27,250,124, 62, 95,231,235,235, 91,102,239, 66,145, - 72,164,171,248,152, 95, 49, 3,216, 66, 72,199, 29, 71, 14,236,120,239,232,177, 95,191,105,223,165,191,171, 93,181,106,168,225, - 65,176, 99, 86,147,169, 23, 35,115,238,244,253,252,218, 15,113,233,186, 40, 74,105,149,242, 97, 84, 42, 85, 12, 33,164, 64,173, - 86,247,163,148,166, 16, 66,252, 10, 10, 10,238,155, 76,166,135, 85, 54, 4, 86,140,108,213,170,249, 30, 66, 8,143,154,173,203, -111,242,185,123,117, 25, 79, 82, 95,199, 88,148, 38,180,134, 35,166,205, 95,219,164, 86,237, 58, 77, 74,230, 58,172, 95,221, 1, - 19,191, 88,217,164,122,205,160, 38,255,153,255, 80, 90,217, 57, 73, 9, 33, 99,143,108, 93,126, 45,242,214,229, 57,110,222,213, -171,103,166,198, 61, 73,121,126,255,107,179, 86,113,228, 77,143,115,194,243,232,213, 91,190,251, 98, 70, 70, 90,252,150,194,236, -152, 71, 0, 80,152, 29,243,200,222,179,206,151,185,153,169, 51,242,178,227,190,123,221,125, 81, 88, 88,152,190,123,247,110,167, - 54,109,218,112, 60, 61, 61,145,147,147,131,203,151, 47, 91,173, 86,107, 90, 85,181,212,121,113,151, 9,169,229,242,243,166,239, -151, 11, 36, 14,189,204,102,179, 15,165, 0,143,199,203, 48,104,148,103, 84, 28,201,231, 52, 63,161,146,122,105, 37, 0, 56, 37, -115, 23, 90,173, 86,178,124,221,142, 68,190,157, 67,153,243, 35,154,116, 42,123,171,213,106,243, 92,135, 5, 73,247,106,189,181, -155, 53,165,139, 26, 53,109, 57,199,100, 50,234, 80,148, 47,166, 3,160,163, 20,121, 28, 14,185,202,181,154,206, 42,222,224, 97, -138, 16, 56, 82,194,131,131,152, 7, 2, 2,181, 34,159, 86, 37, 39,171,204,227,157,245, 44,154,144,142, 1,167, 13, 7,198, 92, - 58,127,106,136,197, 98,169, 81, 92,115, 18,244,218,194,131,234, 12,231,159, 41,189,107,198, 63,159,147, 37,102,139, 87,193,137, - 29,131,162,185,125,254,167,201,139,191,211,244,109,234,101,100,229,239,232,209,127, 6, 77, 72,204,190,147,156,169,255,185,244, -180, 58,111,170,153,146,146,115,185,184,185, 80,255,231, 8,197,235,245, 46,124,105,140,117,218,111,215,204, 29, 14,157,182,112, -167, 38, 59,102,199,219, 49,177, 84, 11,224, 42, 33, 68,246,209, 71, 31,133, 73,165, 82,126,110,110,238,109, 74,169,226,117, 53, -213, 89, 49,151, 1, 92, 6, 48,235,109,148, 49, 50, 50, 50,174,113,227,198,187, 56, 28, 78, 13, 74,169, 39,165, 84, 86,108,100, -115,121, 60, 94,218,227,199,143,211, 94,107,219,245, 14,167,213, 6,110,144,153, 58,159,249,147,249,112,245, 56,159,148,111,249, -137, 43,177,251,159,201, 49, 40,204,122, 22, 13, 96,208,219,214,173,104,156, 44,219,235,209,127, 12,215,149,147,219,223,227, 8, -101,139,187, 4,235, 52,221, 63, 77,251,250,250,195,156,219,148, 82,213, 27,212,209, 28,161, 80,168, 37,132,248, 9, 4, 2,173, -193, 96,136,122,173,253, 87,100,242,221,223,230,190,179,130,220,107,210,164,105,149,214,183, 33,146,183,163,120,121,171,168, 51, -159,126,141,226,230,239, 63, 68, 40,178, 98, 22, 3, 88,252, 38,218,119,239,222, 61,254,221,119,223, 41,214,173, 91,231,111,177, - 88,236, 13, 6,131, 70,171,213, 38,164,166,166,254,254,122,199,252,133, 1,192, 39,197,203,107, 68, 93,158,102, 74, 61,235,172, -109,221,170,245, 39, 69, 15,232,116,109,194,213,181,211, 42,250,142,212,179,142,182,244,250, 21,205,117,248, 86,143, 75,118,204, - 70, 0, 27,255,186, 72,133, 53,103,228,224,126, 64,241,192,220, 86,179, 57,231,173,200, 22,157,243, 91,241,154,147,164,255, 19, -160,148,102, 0,216, 92,108,152,233, 95,246, 67,182,230,171, 48, 77,166,201, 52,255, 93,154,182,204, 78,192,246, 39,211,252, 43, - 53,197, 62,245,252, 0,192,150, 73,215,203, 91,159,237, 79,250,175, 73,104,183, 97,127, 76, 40,195,108,217, 54, 96, 41,131,193, - 96,252, 5, 79,123, 86,182, 23, 24,255, 77,108, 53, 88,175,187, 62,227, 95,119, 77, 43, 55, 39,154,160,104, 22,236,178,190,100, -179, 83, 37,132,116,125,141, 66, 93, 96,154, 76,147,105, 50, 77,166,201, 52,153,230,191, 75,179, 50,237,191, 99,164,172,140,136, -214,201,226,230,195,162,129,217,254,170, 5, 64, 87,166,201, 52,153, 38,211,100,154, 76,147,105, 50,205,127,211, 2, 96, 66,201, -255, 28, 48, 24, 12, 6,131,193, 96, 48,254, 18, 88,142, 22,131,193, 96, 48, 24, 12,198, 27, 80, 86,211, 33, 51, 90, 12, 6,131, -193, 96, 48, 24,111,129,138,146,225, 89,211, 33,131,193, 96, 48, 24, 12,198, 27, 80, 18,209, 34,132,120, 19, 66, 38,148,142,112, - 49,163,197, 96, 48, 24, 12, 6,131,241, 22,160,148,102,188, 26,221, 34,148, 82,156, 60,121,146,134,135,135, 19, 0,127,248,159, -193, 96, 48, 24, 12, 6,227,255,131,191,179, 23, 33,132,120, 3, 8, 47,189, 57, 37,195, 59,112, 74,111, 32, 59,204, 12, 6,131, -193, 96, 48,254,155,102,235,239, 88,238,146, 72, 86,169,229,229,164,217, 47,141, 86,120,120, 56, 97,102,139,193, 96, 48, 24, 12, -198,127,139,127,162, 23,225,188,186,129,236, 48, 51, 24, 12, 6,131,193,248,111,154,173,127,210,246,176,225, 29, 24, 12, 6,131, -193, 96, 48,222,128,138,114,180, 72,241, 80,241, 12, 6,131,193, 96, 48, 24,140,215, 51, 90, 19, 74,247, 54, 44,253,154, 69,180, - 24, 12, 6,131,193, 96, 48,222,130,217, 42,243,125, 22,209, 98, 48, 24, 12, 6,131,193,248,107,248, 75, 7, 44, 37,132,116,101, -154, 76,147,105, 50, 77,166,201, 52,153, 38,211,252, 39, 83, 50, 34,124,241,255, 19,138,115,182,254,122,163,197, 96, 48, 24, 12, - 6,131,241, 47, 32,156, 82,186,185, 84,110, 86, 56, 51, 90, 12, 6,131,193, 96, 48, 24,111,145,178, 38,151,102, 70,139,193, 96, - 48, 24, 12, 6,227, 45, 26,172,210,175,153,209, 98, 48, 24, 12, 6,131,193,248,139, 96, 70,139,193, 96, 48, 24, 12, 6,227, 47, -130, 0, 40,179,231, 0,165,244,130,205, 34,175,209,251,160, 50,125,166,201, 52,153, 38,211,100,154, 76,147,105,254,243, 52, 43, -211,174,138,255,248,159, 49, 83,255, 25, 25,254,100,241,223,255, 52, 31, 82, 74,255,178, 5, 64, 87,166,201, 52,153, 38,211,100, -154, 76,147,105, 50,205,127,242, 2, 96, 66,233,191,165, 23,214,116,200, 96, 48, 24, 12, 6,131,241,230, 81,173,210,227,104,189, - 28, 37,158, 77,193,195, 96, 48, 24, 12, 6,131,241, 6,148, 53,172, 67, 9, 44,162,197, 96, 48, 24, 12, 6,131,241, 6,188, 58, -207, 97,233,215,204,104, 49, 24, 12, 6,131,193, 96,252, 5,134,139, 25, 45, 6,131,193, 96, 48, 24,140,183,104,178,254, 20,221, - 42,206,146,199,201,147, 39,105,120,120, 56, 97,187,138,193, 96, 48, 24, 12,198,127,131,127,162, 23,225,148,222,176,147, 39, 79, - 82,118,152, 25, 12, 6,131,193, 96,252,183, 76,214,223,209,139, 16, 66,188, 75,122, 27, 22, 47,222, 37,159,177, 94,135, 12, 6, -131,193, 96, 48, 24,111, 70,120,233,158,135,197,205,135,155,153,209, 98, 48, 24, 12, 6,131,193,120, 11,148,149, 8, 15,176, 28, - 45, 6,131,193, 96, 48, 24,255, 35,252, 19,189,200, 75,163,197, 96, 48, 24, 12, 6,131,193,120, 13, 51, 85, 70, 52,171,164, 41, -145, 25, 45, 6,131,193, 96, 48, 24,140,183,100,184, 94, 29, 37,158, 25, 45, 6,131,193, 96, 48, 24,140,191,192,100, 1,127,241, -128,165,132,144,174, 76,147,105, 50, 77,166,201, 52,153, 38,211,100,154,255,116,147, 85,242,151, 77, 42,205, 96, 48, 24, 12, 6, -131,241, 22, 97,147, 74, 51, 24, 12, 6,131,193, 96,252, 69,176, 73,165, 25, 12, 6,131,193, 96, 48,254,159, 13, 23, 51, 90, 12, - 6,131,193, 96, 48, 24,111,209,100,189,106,182, 88,142, 22,131,193, 96, 48, 24, 12,198, 27, 80, 81,142, 22, 1,208,181,156, 47, - 93,168,130,139,235,250, 26,133,186,192, 52,153, 38,211,100,154, 76,147,105, 50,205,127,151,102,101,218, 85,241, 31,255,171,252, - 97,168, 7, 74,233, 95,182, 0,232,202, 52,153, 38,211,100,154, 76,147,105, 50, 77,166,249,111, 90, 0, 76, 40,249,159, 53, 29, - 50, 24, 12, 6,131,193, 96,188, 97, 4,171,188,207,152,209, 98, 48, 24, 12, 6,131,193,120, 3,216, 56, 90, 12, 6,131,193, 96, - 48, 24,127, 17,132, 16,239,226, 17,225, 75,254,134, 49,163,197, 96, 48, 24, 12, 6,131,241,118, 8, 47,142,106,149,252,101, 70, -139,193, 96, 48, 24, 12, 6,227,109, 81,222, 56, 90,132, 82,138,147, 39, 79,210,226,215, 29,195,195,195,175,178,221,197, 96, 48, - 24, 12, 6,227,255,147,127,170, 23,121, 25,209, 10, 15, 15, 39, 0,174,176, 67,205, 96, 48, 24, 12, 6,227,191,193, 63,209,139, -112, 94,113,146, 29,217, 97,102, 48, 24, 12, 6,131,241,223,224,159,232, 69,120,175,184, 72, 6,131,193, 96, 48, 24,140,255, 10, -127, 87, 47, 66, 8,241, 6, 16, 14,224,100,241,223,151, 67, 62,176,113,180, 24, 12, 6,131,193, 96, 48,222,208, 35, 82, 74, 55, -255, 97,234,157, 18, 19, 86, 60, 84, 60,131,193, 96, 48, 24, 12, 6,227, 53, 40,107,100,248, 18,195,197,140, 22,131,193, 96, 48, - 24, 12,198, 95,101,194,152,209, 98, 48, 24, 12, 6,131,193,120, 67, 67, 85, 42,170, 85,186,249,144,243, 23,255,104, 87,166,201, - 52,153, 38,211,100,154, 76,147,105, 50,205,127,186,201,162,148,110, 46, 89, 74,155, 46, 54, 50, 60,131,193, 96, 48, 24, 12,198, - 95, 4,235,117,200, 96, 48, 24, 12, 6,131,241, 6,188, 26,197, 42,221,116,200,140, 22,131,193, 96, 48, 24, 12,198, 91, 48, 91, -101,189,207,154, 14, 25, 12, 6,131,193, 96, 48,222,128,178,134,119, 96, 70,139,193, 96, 48, 24, 12, 6,227, 47, 54, 92, 4, 64, -153, 61, 7, 40,165, 23,170, 32, 92,229,222, 7,149,233, 51, 77,166,201, 52,153, 38,211,100,154, 76,243,159,167, 89,153,118, 85, -252,199,255,178,193,122,217,148, 72, 41,253,203, 22, 0, 93,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,255,173, 11,107, - 58,100, 48, 24, 12, 6,131,193,248,139,176,217,104, 17, 66,220,249,124,254, 28,123,123,251, 31,236,237,237, 55,241,249,252,239, - 8, 33,206, 85,253, 65,169, 84, 58,213,219,219,251,169,183,183,119,106, 64, 64,192, 41, 71, 71,201,167,181,236, 72,123, 66, 8, -255, 45,132,238, 56,132,144, 96, 66,200,167,246,246,246, 79,196, 98,113, 34, 33,100, 23, 33,228, 83, 66,136,219,155,104, 47,246, - 37,131,162, 63,237,127,116,177, 47, 25,244,202,111,134,123,121,121, 93, 39,132,116,127, 91, 7,101,132,132,116, 29, 34, 37,201, - 67,164, 36,121,132,228,245, 7,133,115,116,116, 28,237,227,227,115,211,205,205, 45,205,199,199,231, 55,177, 88, 60,184,138,251, -211,195,203,203,107,133,191,191,127,140,175,175,239,154,226,217,201,255,103,105,111, 71,218,181,178, 35, 57,173, 69, 68,213, 86, - 68,126,104, 45, 34,221,186, 19, 98,255,154,117,169, 45, 33,228,144, 76, 38,187,207,231,243, 79, 16, 66, 6, 22,215,175,129,124, - 62,255,132, 76, 38,187, 79, 8, 57, 68, 8,105,251,154,245,116, 5, 33, 36,141, 16,178,180,248,245,199,254,254,254,170, 70,141, - 26, 37, 54,106,212,104,123, 80, 80,208,187,182,234, 73, 36,146,110,254,254,254,135, 3, 2, 2, 18, 91,183,110,157, 95,173, 90, -181,103,126,126,126, 59,236,236,236, 58,178, 75, 28,131,193, 96,252,151,177, 33, 60,216, 7,192, 55, 0,214, 71, 69, 69, 69, 80, - 74, 35, 40,165, 17, 81, 81, 81, 17, 0,126, 0,176, 12,229,132, 16, 95,125,223,213,213,117,209,226,197,139,117, 25, 25, 25, 52, - 39, 39,135,198,196,196,208,213,243,190,176,246,112,225,209, 64,119,103,141,183,183,247,139,128,106,213,246,213,151,114,190, 0, - 80,171, 42,225, 74, 0,206, 98,177,248,246,188,121,243,212,215,175, 95, 87, 27, 12, 6,181,213,106, 85,167,167,167,171, 47, 92, -184,160,110,211,166,141, 26,192, 52, 0,220,215, 9,129,126,229,131,171,116,235,151,244, 43, 31, 92, 45,253,126, 72, 72,200, 99, -171,213, 74, 7, 13, 26,164, 7,224,251, 38, 97, 85, 95,192,174,190, 35,156, 6, 75,145,101,222,241, 53,165, 27,102,208,193, 18, - 36,191,142,166,135,135,199,175, 83,167, 78, 85,166,165,165, 81,189, 94, 79,147,147,147,233,196,137, 19, 21, 30, 30, 30,187,109, -220,159,174,161,161,161, 89, 55,111,222,180,202,229,114,122,229,202, 21,107,131, 6, 13,178, 0,120, 87, 53,164,236,225,225,177, -217,199,199,231, 84, 85, 22, 15, 15,143, 45, 85, 61, 70, 45, 68, 72, 54, 70, 92,166,244,238, 57,122,108, 80, 43,186,186,105, 53, - 58,208, 69, 40,111, 43,196,199, 29, 0, 94, 21,234,210,144, 14, 29, 58, 20, 62,124,248,208,146,151,151, 71, 31, 63,126,108, 29, - 63,126,188, 14, 64,244,248,241,227,117,143, 31, 63,182,230,229,229,209,135, 15, 31, 90, 58,116,232, 80, 8, 96,156,173,229, 44, -126,184,217,182,112,225, 66, 74, 41,165,139, 23, 47,166, 13, 27, 54,164,157, 59,119,166,106,181,154, 82, 74, 19, 41,165,219,205, -102,243,123,182,104,202,100,178,209, 83,167, 78, 85,107, 52, 26, 90,130,213,106,165,114,185,156,174, 95,191,190,208,203,203,235, - 20, 0, 55,214, 60,193, 52,153, 38,211,100, 77,135,127,105,170,148, 55,128, 9,165,150,151,247,202,202,190, 56,226,139, 47,190, - 40, 49, 85,167,219,182,109,123,231,189,247,222,139,120,239,189,247, 34,218,182,109,123, 5,192,217,123,247,238, 69,204,156, 57, - 51, 2,192,136,138, 14, 4, 0,231,214,173, 91,203, 51, 51, 51,105, 80, 80, 16,173, 94,189, 58,205,204,204,164,148, 82,122,119, - 72, 19,122,177, 46,104,202,181,211,244,220, 47,135,232,120,111, 30,109,231, 45, 51,121,123,121,229,185,185,185, 45, 65,241,156, -140,229, 29, 92, 0, 3,234,214,173,171,138,142,142, 86,199,198,198,170, 23, 45, 90,164,238,220,185,179, 58, 52, 52, 84, 61,112, -224, 64,245,186,117,235,212, 70,163, 81,189,101,203, 22,181,163,163, 99,244,171,102,235, 77,140, 22,143,199, 91, 27, 21, 21, 69, - 95,188,120, 65, 1,172, 40, 79, 19,128,204,201,201,169,167,179,179,243, 52, 39, 39,167,158, 0,100,148, 82, 4, 1,210, 70, 50, -248,127,220, 40, 48,228,196,136,174,181,214,119,109,214,100,176, 3, 71,110,250,126, 6,165,131,252, 95,203,104,201,100,178,209, -159,126,250,169, 74,175,215, 83,141, 70, 67,213,106, 53,213,104, 52, 84,165, 82,209, 17, 35, 70, 40,237,236,236, 6, 84,166,233, -230,230,246,245,181,107,215,204,153,153,153,244,218,181,107,244,212,169, 83,116,195,134, 13, 86, 15, 15,143, 85, 85, 61, 1,189, -188,188,206,159, 59,119, 46, 34, 50, 50, 50,226,246,237,219, 17, 38,147, 41,194,104, 52, 70, 24,141,198,136, 19, 39, 78, 68, 28, - 57,114, 36, 98,255,254,253, 17, 6,131, 33,194, 96, 48, 68,232,245,250,136,154, 53,107,158,169,234, 49,106, 46, 66,138,225,250, - 49, 74, 87, 77,166,138,111, 39, 81,249,244, 94, 52,123, 98,123,250, 67,179,106,180,189, 24,199, 75,215,163,138, 52,249,124,254, -213,196,196, 68,235,236,217,179, 13,245,234,213, 83,140, 29, 59, 86,167,215,235, 41,165,148,234,245,122, 58,118,236, 88, 93,189, -122,245, 20,179,103,207, 54, 36, 36, 36, 88,121, 60,222,133, 42, 24,173,101, 37, 38,235,234,213,171,180, 52,106,181,154,118,238, -220, 57,177, 97,195,134,219,107,212,168, 49,178, 50, 77,169, 84,218,111,214,172, 89,106, 90, 6, 38,147,137,170, 84, 42,154,144, -144, 96,173, 94,189,122, 58, 0, 87,118, 49,103,154, 76,147,105, 50,163,245,151, 25,173, 9,229,189,174,112, 39,206,156, 57, 51, -130, 82, 26, 49,119,238,220,136,226,200,150, 0,128,180,120,225, 1, 24, 62,107,214,172, 8, 74,105,196, 23, 95,124, 17, 1,160, - 79, 5, 70,171,207,193,131, 7,141,107,214,172,161,158,158,158,212,203,203,139,174, 93,187,150, 90,173, 86,154,121, 98, 55,189, - 88, 23,244,201,156, 49,148, 82, 74, 99,150, 76,161, 23,235,130,198,109,252,138,142, 26, 53, 74, 99,111,111, 63,162, 2, 3,227, -210,164, 73, 19,149, 86,171, 85,239,216,177, 67,109,111,111,127, 23, 64, 61, 0,124, 20,245,170,148, 2,120,183, 94,189,122,202, - 71,143, 30,169,247,238,221,171, 6,176,200,198,200, 70, 45, 0,157, 36, 18,201,192, 89,190,252, 88,186,245, 75, 58,203, 19, 15, - 1, 52, 0,224, 94,188,142,207, 23, 95,124, 65, 41,165,212,207,207,239, 90, 57,219, 46, 11, 13, 13,253, 34, 54, 54,118,129,201, -100, 90, 16, 25, 25,185,160, 78,157, 58,179,251,214,244,110,117,116, 68,183, 48,197, 87,147,194,232,202,233,161,223,189,211,188, -235,190, 97, 29, 71,188, 95,195,237,250, 88, 15, 59,205, 80, 25, 87, 53,220,254, 15, 58, 54, 85,108, 95, 95,223,219,201,201,201, - 47,205,149, 74,165,162,105,105,105, 52, 62, 62,158, 94,191,126,157,122,123,123, 95,172, 76,211,203,203,235,113,114,114, 50,221, -184,122, 53, 29,212, 32,132,182,119,114,160, 29,156, 29,104, 83,169, 93, 97, 93,160,105, 85,141,214,253,251,247, 35, 0, 68, 0, -136,200,203,203,139,200,203,203,139, 40, 40, 40,120,249, 30,128, 8,133, 66, 17,161, 80, 40, 34, 12, 6, 67, 68, 96, 96, 96,149, -141, 86, 27, 59,180,105, 97,135,252, 86, 34,104,251,248,186,165, 79,170,233,102,185, 53,162, 21, 45,152,220,153,174, 9,243,165, -109,133,248,216,198,227,222, 71, 40, 20, 94, 1, 48, 3, 0, 23,192,152,158, 61,123,106, 40,165,180,103,207,158, 26, 0, 99,138, -223,255,148,199,227, 93, 0,208,211,150,114, 2,224,212,174, 93,187,176, 36,146, 5,224,247,218,181,107, 23, 54,108,216,144, 54, -108,216,144,250,249,249,169, 0,140,177,245,130, 86,171, 86,173, 24,173, 86,251,210, 0,202,229,114,154,158,158, 78,227,226,226, -104,116,116, 52,189,123,247, 46, 77, 76, 76,164, 7, 14, 28,176, 56, 57, 57,157,100, 23,115,166,201, 52,153, 38, 51, 90,127,157, -209,122,117,249,147,209, 58,113,226, 4,125,229, 75,223,222,187,119, 47, 98,214,172, 89, 17,175, 58,181, 87,197,231,206,157, 91, - 18,245,250,166,130,155,255,150,152,152, 24, 58,102,204, 24, 26, 28, 28, 76,131,131,131,233,123,239,189, 71, 21, 10, 5, 85, 63, -127, 68, 47,214, 5,189, 59,180, 41,165,148, 82,213,147, 72,122,177, 46,104,196,168,214,244,193,131, 7,180, 90,181,106,231, 42, -248,253,227,191,253,246, 91,206,238,221,187, 51, 1,236, 42, 54, 88, 45, 1,172, 21,139,197,219,138,155, 11,171, 3,112, 14, 10, - 10,202,215,104, 52,234, 65,131, 6,169, 1,248, 87,160,217, 33, 56, 56,248,197,150, 45, 91,104,118,118, 54,205,207,207,167,203, -219,212,161,116,235,151,116,113,211,234,214,141, 27, 55,234,103,204,152, 81,232,226,226,114, 2,128,207,160, 65,131,204,148, 82, -218,190,125,251,172,178,244,156,156,156,122,198,198,198, 46,208,233,116, 11,228,114,249,130,252,252,252, 5,199,142, 30, 93,208, -163, 65,157, 49,138,175, 38,133, 29, 29,209, 45,236, 29, 95,231,129,171,186, 55,251, 48,109,246,184, 65,115, 91,215,123,162, 91, -246,201,229, 33, 53, 61, 87,188,206, 1,119,119,119,207,208,235,245, 20,192,159,150, 23, 47, 94, 80, 87, 87,215,228,202, 52, 92, - 92, 92,230,126, 58,124,152,101, 64,117, 95,250, 98,205, 60,106, 58,191,151,154, 78,237,160,207,191,157, 78,251,122,185, 41, 91, - 10, 56,179,108, 45,143,151,151,215,249,219,183,111,255,193,104, 21, 20, 20,148,105,180,148, 74,101,132,193, 96,136,168, 93,187, -246,153, 55,173,248, 45,133, 8,236, 32,230,222,141, 28,211,142,230, 76,234, 76,123,202,248,137,111,112, 18, 13, 7,112, 5,192, -168, 42,126,143, 3, 96, 89,137,161,250,246,219,111, 41,165,148,214,174, 93,187, 16, 0,231, 13,202, 35, 11, 9, 9,137, 31, 55, -110,156,185,110,221,186,217,109,218,180,145,223,185,115,135, 94,189,122,149,158, 58,117,138, 30, 58,116,136, 62,122,244,136,166, -165,165,209,152,152, 24, 26, 30, 30, 46, 7,208,129, 93, 16,217,194, 22,182,252, 47, 47,175,122,145,127, 76,175,195,147, 39, 79, -210,240,240,112,114,242,228, 73, 90,156,172, 43, 3, 96,215,180,105,211,156,101,203,150,173, 44,158,195,135, 52,228,145, 33, 93, -236,249, 15,186,216,243, 31, 52,228,145, 33,132, 16, 66, 41,221,188,100,201,146,175, 27, 54,108,152, 1, 64, 76, 8,241, 42, 39, - 23,172,157,171,171, 43,146,147,147, 33,147,201, 32,147,201,144,156,156, 12, 74, 41,204, 20, 48, 81, 64,111, 52, 66,171,213, 66, -103,165,208, 90, 1,165, 90, 13, 47, 47, 47, 24,141,198,192,114,146,138, 27, 13, 29, 58, 52, 48, 52, 52, 52,103,230,204,153,233, - 0,198, 1,216,246,193, 7, 31,156,255,253,247,223, 67,213,106,117,126,116,116,180,174, 65,131, 6, 61, 1,120,197,198,198,142, - 94,191,126, 61,198,140, 25, 3, 0, 29,202,209,108, 16, 30, 30,126,234,209,163, 71,129,163, 70,141,194,149, 43, 87,176,124,249, -114,228,230,230, 82, 0,208,235,245,212, 98,177, 24, 91,183,110,109, 92,179,102, 77,243,246,237,219,223,174, 89,179, 38, 23, 0, -226,227,227,159,151,163, 89, 39, 32, 32, 0,122,189, 30, 57, 57, 57,120,244,232, 17, 28,100, 50, 68,165,231,122,118, 92,181, 49, -111,206,209,243,252,225,205, 67, 93,166,117,107,163, 95,122,238, 74, 80, 61, 31, 79, 79,131,209,228, 21,147,145,149,254, 58,121, -119, 2,129, 32, 57, 55, 55, 23, 6,131, 1, 90,173, 22, 74,165, 18,121,121,121,200,205,205, 69,122,122, 58, 4, 2,193,139, 74, - 19,233,243,243,175,197,255,118,149, 28,248,241, 91, 4,154,243,193, 59,188, 22,188, 95,127, 64, 45, 67, 14, 54,205,155,232, 96, -112,117, 95, 40,115,116, 44,112,118,118,222, 76, 8,169, 93,153, 94, 88, 88, 24,242,242,242,144,151,151, 7, 87, 87, 87, 56, 59, - 59,195,217,217, 25,114,185, 28, 10,133, 2, 74,165, 18, 65, 65, 65,104,212,168, 17,118,238,220,249, 86,242, 15,111,234,105,156, - 25,150, 73,231,159,165, 67, 32,145,160,166,179, 52,160,185, 3,113,169, 32, 73,189,179, 64, 32, 56,232,234,234,122,142, 16, 50, -153, 16, 34, 33,132, 76,118,117,117, 61,199,231,243,251, 3, 88, 76, 41,221, 93,197, 98, 44, 93,184,112,225, 23,177,177,177,246, - 15, 30, 60,192,204,153, 51,177,104,209, 34, 60,127,254,252,123, 74,169,181,248,119, 63,114,115,115, 59,193,229,114,127, 34,132, -244, 34,132,244,244,241,241,233, 82,137,110,255, 25, 51,102,232,154, 52,105, 18,243,228,201,147,254,191,253,246, 91,211,233,211, -167, 43,146,146,146, 16, 19, 19, 3,111,111,111,248,249,249, 65,173, 86,163,160,160, 0,253,251,247,151, 57, 58, 58,142, 96, 89, -169, 12, 6,227,127,149, 87,189,200,223,137, 87,199,209, 42,253,186,204, 94,135,246,246,246, 11, 35, 34, 34, 90, 53,108,216,144, - 7,224, 0, 0,132,114, 49,184,127,235,198,219,142,110,254,182,225,145, 53,243, 26,246,104, 24,180, 45,148,139,146, 94,108, 39, -154, 54,109,234, 28, 17, 17,209, 90, 36, 18,125, 92, 94,222, 61, 0, 56, 59, 59, 67, 38,147,193,201,201, 9,206,206,206,176, 90, -173, 80,107,116, 40,180, 0, 42,157, 1, 10,133, 2,170,226,215,106,189, 17,133,133,133, 47,191, 91, 6, 29,199,141, 27,151,179, -126,253,250,236,140,140,140,111, 1, 52, 24, 51,102, 76,191,117,235,214,225,210,165, 75,186, 94,193,181, 92,151,180,107,252,117, -189,140,231, 11,130,249, 24, 15,224,218,181,107,215,208,186,117,107, 16, 66,134,149, 37, 40, 22,139,127,216,183,111,159, 56, 58, - 58, 26,181,106,213,138, 30, 54,108,216,144,111,191,253, 54, 80,162,206,191, 1, 0,230,188,204,232, 41, 83,166,124,185,100,201, -146,156,156,156, 28,163, 70,163,241,232,219,183, 47,146,147,147,145,150,150,246,123, 57, 38, 51, 38, 50, 50,146, 42, 20, 10,196, -197,197, 33, 50, 50, 82,252,229,151, 95, 54,183,112, 56,253, 82,225,240,254,152, 54, 77,155,143,106,217, 24,187,111, 62, 16, 92, -127, 22,239,212,180,186,175,243,253,148,140, 26, 38,130, 23,175,115,192, 85, 42,213,218,175,191,254, 90,173, 86,171,145,154,154, -138,135, 15, 31,226,201,147, 39, 72, 76, 76,196,242,229,203,213,249,249,249,235, 42,211,240,177,227,125,182, 98,250, 7,132,247, -248,119,224,193, 85, 64,163, 2,180,106,232,159, 70, 96,251,211, 76,108, 56,252,139, 48, 41, 57,217,105,255,254,253,227,252,253, -253, 35, 8, 33, 65,149,117,186, 0, 0, 14,135,243,106,229, 4,135,195, 81, 1,200,148, 72, 36, 41, 14, 14, 14, 41, 28, 14, 39, -147, 82, 90,248, 54, 42, 63,199, 12, 35,184, 92, 64, 40, 6,135,207,171,232, 36, 25, 50,108,216,176,125, 41, 41, 41, 61,226,226, -226, 90,173, 91,183,238,107, 59, 59,187,168,117,235,214,125, 29, 23, 23,215, 42, 37, 37,165,199,176, 97,195,246, 17, 66,222,173, -202,239,215,174, 93,123,202,130, 5, 11,176,124,249,114, 52,106,212, 8, 65, 65, 65,154,133, 11, 23,174, 5, 48,143, 16,242,113, - 80, 80,208,141, 41, 83,166,140,205,206,206,246, 74, 77, 77,109,244,253,247,223, 79, 92,187,118,109,179,244,244,116,187, 74,164, -219,118,239,222, 29,167, 79,159, 6,128, 12, 74,105, 92, 94, 94,158, 57, 61, 61, 29, 33, 33, 33,104,222,188, 57,212,106, 53,212, -106, 53,228,114, 57, 2, 2, 2, 96,181, 90, 91,177, 75, 57,131,193, 96,252,255, 25,174,114,141,150,157,157,157,115, 88, 88, 24, -106,214,172,233, 92,156,139, 5, 87, 33,111,246,180,113,195,237,165, 17,103, 64, 34, 47, 98, 88,187,250,246,174, 66,222,236,226, -175,240, 2, 2, 2, 68, 97, 97, 97,144, 72, 36,190,229,252,254,149,204,204, 76,132,133,133,193,201,201, 9, 50,153, 12, 97, 97, - 97, 48, 26,141, 80,168, 84, 40,180, 0, 26,147, 21, 10,133, 2,249, 57, 89,208, 88, 0,179,131, 43, 18, 19, 19,193,229,114,227, -203,209,244,174, 85,171, 86, 78, 84, 84, 84, 14,128,107, 0, 62, 92,180,104, 17,102,205,154,133,249,243,231,239,179,207, 72,232, -190,239,244,175,174,123, 22,126,228, 30, 36, 36,195, 1, 24, 83, 82, 82,224,228,228, 4,137, 68, 82,166, 49,104,223,190,125, 19, -137, 68,130, 29, 59,118,208,212,212,212, 54,148,210, 67,148,210,120, 66,138,204,158,152, 3, 5,165,116,109, 68, 68, 68,139, 47, -191,252,242, 89,215,174, 93,249, 45, 91,182,196,226,197,139, 1,224, 68, 89,154,114,185,252,214,187,239,190,107,184,124,249, 50, -158, 62,125, 42, 57,122,244,232,224,197,139, 23,215, 79, 74, 74, 18, 29, 63,117,230,157, 93, 41,202,193,223,158,187,110,183,228, -236,149, 91,110,142,146,122, 53,220, 92, 16,153,148, 38,176,112,113,167,178,131,218, 82,192, 27,215, 73,204,143,108,111,199,205, -232, 36,230, 71, 52, 23,240, 62, 80, 42,149,251,143, 29, 59,118,118,250,244,233,234,236,236,108, 56, 56, 56, 32, 47, 47, 15, 75, -151, 46, 85, 71, 70, 70, 30,214,235,245,199, 43,211,181, 88,105, 19,191,234,254,192,139,168,151,239, 25,173, 20,119, 12, 2,244, -254,240, 19, 4,135,132,192, 96, 48,160, 65,131, 6,100,209,162, 69, 18,153, 76,246,121,165,166,135,243,167,234,102, 38,132,100, - 82, 74,211,212,106,117,170, 88, 44, 78, 18, 8, 4, 73,249,249,249,169,148,210,172,183, 80,225, 57,148,131,207, 90, 55,168, 13, -136,196, 72,202, 83,167,223, 81,209,252,178,214,117,112,112,248, 96,195,134, 13,118, 91,183,110, 53, 77,153, 50, 69, 63,113,226, - 68,190, 86,171,245,152, 56,113, 34,127,202,148, 41,250,173, 91,183,154, 54,108,216, 96, 39,149, 74, 7,190, 78, 89, 76, 38, 19, -162,162,162,190,141,141,141,149, 80, 74, 63, 5,240,201,194,133, 11,199,196,198,198,218,173, 95,191, 30,135, 14, 29,194,161, 67, -135,208,175, 95, 63, 76,157, 58, 21, 11, 22, 44,168,104,187,236, 27, 54,108, 24,230,234,234,138,171, 87,175,166, 83, 74,147, 8, - 33, 77,164, 82,169, 67,191,126,253,208,163, 71, 15,232,116, 58, 24,141,198,151, 70,139,203,229,194,201,201,201,149, 93, 6, 25, - 12, 6,227,175, 53, 89,175,154, 45, 30, 0,148,132,234,194,195,195, 73, 69, 55, 70, 75, 65, 54,228,133, 26, 36, 42, 52, 72, 46, -176,254,225, 51,171,213, 90, 97, 1,210,211,211,143,223,188,121,243,131,176,176, 48, 94,122,122, 81,139, 88, 88, 88, 24, 52, 26, - 13,210, 31,220, 70,161, 21,144,212, 10, 69, 97, 97, 33, 10,158,220,135,180, 97, 43,184,134,143,194,170,245,235,245,121,121,121, - 63,150,165, 41, 20, 10,249,213,170, 85,203,137,143,143, 55, 3,200,151,201,100,221,253,253,253,113,229,202, 21, 0,216, 77,129, - 21,136,188, 12, 92, 61, 2, 90, 20, 82,145, 6, 4, 4, 32, 59, 59, 27,106,181,250, 74, 89,154, 55,111,222,140, 53,153, 76, 13, -250,246,237, 75,126,254,249,231, 3,132,144,249, 0, 30,206,241, 2,247, 65, 74, 22, 10, 45,176, 35,132,116,115,118,118,254,116, -193,130, 5, 93,166, 76,153,130, 99,199,142,225,220,185,115, 70, 20,229,130,221, 44, 35,154,163, 32,132,108,154, 49, 99, 70, 75, - 14,135,243,225,249,243,231,205, 65, 65, 65, 74,163,209,104,169, 19, 28,204,153,191,232, 43,193,228, 15, 39, 56,229,105,240,184, - 71, 29,239,214,132, 0,143,211,178,147, 98, 85, 52,175,162,125,218, 65,196, 59, 49,172, 93,195,246, 31, 12,235, 35,149,212,170, -135,194, 71,183,189, 54, 29, 60,181,170,163,152,215, 59, 75,107,238, 39,147,201, 6, 95,185,114,101,178,193, 96,168, 41, 18,137, - 94,200,229,242, 53, 42,149,170, 82,147,197,227,241,194, 67,253,170, 57,203,243,243, 97, 87, 28,137, 82,154,172,200,213,155,241, -212, 41, 8, 35,170,249,189,108, 6,205,204,204,132,151,151, 23,177, 88, 44,125, 42,210, 60,119,238, 28,122,247,238, 93, 98, 60, - 65, 8, 1, 33, 36, 55, 56, 56, 56, 75, 36, 18,229, 9, 4, 2,229,138, 21, 43,116, 58,157, 14, 60, 30,207,206, 98,177,112,223, -164,194,183,144, 16,143,246, 98,242,195,196,190,157,186, 54,170, 23, 66,175,221,125, 64, 10, 52,186,237, 21, 68, 1,191,175, 93, -187, 54, 47, 63, 63,255, 56,128,167, 38,147,105,207,129, 3, 7,236, 70,143, 30,173, 59,120,240,224, 72, 0,129, 43, 87,174, 28, -172, 86,171, 55, 87,165, 28,207,159, 63,255,126,201,146, 37, 95,204,157, 59, 23, 59,119,238,156, 2, 96, 86,113,164,171,223,130, - 5, 11,176, 98,197, 10,236,220,185,211,250,244,233,211, 83, 86,171,245,249,244,233,211, 27,122,122,122,230,102,100,100, 60, 95, -180,104, 81,121,178, 77,123,246,236,169,191,113,227,134, 80,165, 82, 93, 39,132,124, 58,105,210,164,113, 45, 90,180, 80, 14, 27, - 54, 76,154,159,159, 47,183,183,183, 23,110,217,178,197,153,199,227,161,176,176, 16,132, 16,168, 84, 42, 3,187, 20, 50, 24,140, -255, 85,202,243, 34,127, 7, 94, 78,183, 83,214, 61,181,172, 13,212,104, 52, 89,201,201,201, 33,105,105,105,102, 0,102, 0,200, - 51,152,191, 89,178,229,200,214,129, 45,107, 75, 50, 76, 38, 28,189, 27,173,201, 51,152,191, 41,137, 76,164,165,165,169,146,146, -146, 28,180, 90,173,186,156,223,250,253,135, 31,126,208, 94,190,124,217, 33, 46, 46, 14, 22,139, 5, 77,154, 52, 65, 76, 76, 12, - 10,158, 70, 65, 18,210, 4,146, 14,189, 17, 29,113, 23,145,231, 46, 32, 65,109, 48, 63,155,183, 68,161, 46, 44, 92, 96, 48, 24, -142,150, 37,200,231,243,243,139,182,143, 90, 0, 64,169, 84, 62, 84,171,213,237, 60, 61, 61,241,248,241, 99, 73,161, 5, 83, 7, -207, 94,181,142, 82,106, 17, 20,245, 20,155, 54,108,216, 48,220,187,119, 15, 0,238,149,165,169, 84, 42,167,140, 31, 63,254,242, -142, 29, 59,120,113,113,113, 61,182,110,221,218,227,217,179,103,148,228, 39, 91,110,104,248, 8, 28, 51,181,217,198,128,224,115, -189,123,247,134,183,183, 55,182,108,217,130, 53,107,214,152, 62,250,232,163,216, 53,107,214, 52, 3,176,167,156,131,160, 0,112, -198,205,205,109,114,253,250,245, 85,133,133,133,200,203,203, 67,122,122, 58, 92, 92, 93, 57,102,112, 90,187, 59, 57,237, 57,158, -169,146,240,206,220,194,237,212,140, 10,163, 89,173, 4,188,119,135,119,108,220,254,227,185,179,165,184,113, 20,100,252, 2,208, -173, 95,227,147,247, 6, 59,232,244,123, 58, 52,229,241, 70, 43,204,230, 93, 0, 14, 85,209,145,247,108,215,174,221,190, 37, 75, -150,136,231, 44, 95,130,149, 33,190, 48,231,229, 33, 71,111, 65,174,222, 12,101,193, 83, 60,126, 28, 13, 87, 87, 55, 36, 36, 36, - 64,167,211,225,201,147, 39,148,203,229, 30,175, 44,162, 83,234, 55, 74,154, 11,229, 34,145, 40,143,207,231,103,241,120,188,252, -184,184,184, 66,157, 78, 7, 14,135, 35,177, 88, 44, 98, 27,202, 90,205,205,205,109, 58,128,129, 0,142,169,114,115,215,134,241, -225, 4, 30, 58,214,244,112,125,103,222,196,209,110,254, 62, 30,242,184,216, 23,166, 31,207,254,150,171,211,227,155, 10, 78,146, - 19,165, 35,146,132,144, 79, 14, 30, 60, 56, 14,192,182,226,121,183, 46, 0,216,248, 26,231,223,188,195,135, 15,127, 49,119,238, - 92,136,197,226,151,131,167,138,197, 98, 59, 0,216,187,119, 47, 30, 63,126,220,162, 36, 95, 11,192, 62, 27, 52, 3, 67, 67, 67, -227,142, 28, 57, 34, 4,224, 51,105,210,164, 86,235,214,173,195,123,239,189,151, 19, 29, 29,221,178, 40, 2, 75, 2, 63,252,240, -195, 59, 59,119,238,116,182, 90,173, 40, 40, 40,128,193, 96,136,103,151,114, 6,131,193,204,214, 95, 18,205, 10,163,148, 70, 22, - 15,236, 29, 14,224, 36,165, 52,227, 15, 70,171,100, 3, 1, 64,167,211,125, 31, 16, 16, 32, 3,224, 7,160, 55,128, 99, 15, 45, - 56,132,103,137,136, 74, 72,157, 93, 98,188, 30, 90, 94,222,196,135,222,185,115,199, 80,189,122,245, 7, 0,190, 46,231, 70,166, -116,115,115, 91, 60,125,250,244,165,139, 23, 47,230,241,120, 60, 92,190,124, 25, 55,207,158,180, 62,185,126,155, 36,106, 45, 90, -229,221, 25,105, 60,106,185,229,169,205,127,116, 95,131,195,148,210,212,138, 54,172,176,176, 48,249,249,243,231,194,250,245,235, - 91,238,223,191,239, 70, 41,253,229,212,169, 83,237,102,206,156,137, 43, 87,174,236, 57,175,179,140,160,212,122,128, 16,194, 3, - 48,162, 79,159, 62,159, 14, 30, 60, 24,141, 26, 53, 50, 2,216, 89, 78, 57,111, 16, 66, 70,164,164,164,108,250,252,243,207,157, - 62,255,252,115,112, 56, 28, 82,122, 95,229,230,230,226,193,131, 7, 24, 54,108,152,226,183,223,126,155,218,165, 75,151,177,109, -219,182,197,233,211,167,125,108, 56, 24,191, 63,121,242,100,128, 76, 38, 35,207,159, 63,135, 82,169,196,141, 27, 55,248, 1, 1, - 1,173, 15, 28, 56, 32,170, 89,179, 38,162, 31, 61,194,169, 17, 35,194, 9, 33, 1,148,210,164,178,116,196,124, 50,121,204,144, - 62, 82,253,141,227, 64,228, 53, 0,128, 90,169,130, 54, 33, 10,131,155,215,118,188,242, 36,113, 18,138,122, 97, 86, 9, 23, 23, -151, 79, 86,174, 92, 41, 9, 10, 10,194,103, 75,150, 99,250,220,153,248,208, 35, 0,202,180,100,228, 90, 0,161,189, 61, 22,207, -155,139, 62, 67,134,193,195,195, 3,143, 30, 61,162, 91,182,108, 41, 84, 40, 20, 43,108, 49, 90, 92, 46, 23,132, 16, 0, 40, 84, - 40, 20,106,161, 80,168,224,241,120,121, 22,139, 37,235,196,250,181, 77, 56,121, 89,239, 19, 66,184, 98, 43,231, 68,113,103,139, - 50,243,243,156, 8, 9,168, 21, 24,248,232,167, 45, 91, 36, 45, 90,180, 32,119,239,222,157, 60,105,194,248,113, 3, 67,107,156, -234,223,181, 61,188,188,189,244, 86,163, 65,126,234,216, 9,211,198,131,167,174, 26,136,245,243, 8, 74,181, 85,120, 58,217, 87, -218,244, 16, 66,134, 3, 24, 2,224, 8,165,116, 55, 33,100, 12,128,254, 0, 14,151,151, 32, 79, 8,225, 0,216, 60,104, 80,209, -100, 2, 90,173, 86, 83,242,126,195,134, 13, 75,255,150,181, 42,199,200,222,222,222,193,206,206,238,197,233,211,167,197,195,134, - 13,115, 94,186,116,105,218,123,239,189,231,187,103,207,158,239, 1, 36, 16, 66,130, 1,212, 42, 44, 44,180,112, 56, 28, 4, 7, - 7, 99,195,134, 13,106,139,197,178,141, 93,198, 25, 12,198,223,193,108,253, 13,139, 29, 6, 32, 18, 64,120,113, 7,194, 9, 0, - 42,158, 84, 26,192,146,168,168,168,146, 49,180, 38, 85, 52,188,195,172, 89,179, 34,238,221,187, 23, 1, 96, 89,101,221, 28,121, - 60,222, 47, 31,125,244, 17,245,244,244, 84,123,120,120,252,194,231,114,199,249,137, 17,134,215,232,234, 14,160,221,174, 93,187, -250,125,255,253,247,225, 0, 90, 0,224,251,250,250,166,103,102,102,170,127,251,237, 55,117,155, 54,109,212,110,110,110,217,161, -161,161,234,149, 43, 87,170, 77, 38,147,122,250,244,233,106,188, 50,222, 87, 57,218,118, 0, 38, 11,133,194, 95,234,214,173, 27, - 53,175,111,103,211,242,169,227,232,152,218,238,106, 0,223, 3,248, 8,128, 19, 0,254,224,193,131, 47, 62,121,242,228,108,104, -104,232, 38, 27,116,125,234,215,175,127,105,223,190,125,247,142, 28, 57, 18,241,249,231,159,223,115,117,117, 77,141,141,141,181, -234,116, 58, 90, 80, 80, 64,229,114, 57, 61,121,242,164,197,197,197,101,125,121, 58,237, 68,220, 12,122,110,119,153, 67, 56,164, -204, 29, 69,219, 8, 57,105,175,211, 13, 85, 34,145,228,231,229,229,209,204,204, 76, 26, 23, 23, 71, 15, 31, 62, 76,123,182,110, - 78,247,127, 56,144,238,254,160, 31, 93,209,179, 57,109,225, 96, 87,232,229, 32,189,231,224,224,144,237,228,228,180, 25, 64,237, -202,134,119,208,235,245, 47,135,111,168, 86,173, 90, 68,112,112,240,145,208,208,208, 85,199,142, 29,251,100,245,234,213,253, 58, -213, 8,248, 98,105,143,214, 90,205,133,131, 84,117,224,123, 58,171, 73,144, 46,148,139, 33,229, 14, 23,226,234,178,235,234,149, - 43,214,146, 1, 58,205,102, 51, 61,250,203, 47,116,232, 59,221,162, 20,103,246,254,116,125,193,148,125,211,155, 4, 29,109, 99, -135,225,120,101,160,210,178,150, 48, 41, 92,219, 59,114, 54,244,242,119,201,104, 39,227,124,223,210, 1,206,165,142,217,208,160, -160,160, 56, 74,105, 70, 72, 72, 72, 28,128,221, 33, 33, 33,165, 95,191, 95,217,224,164, 11, 23, 46,164, 40,154, 69,129, 3, 96, -254,146, 37, 75, 34, 40,165, 17,181,107,215,190, 65, 41, 69, 35, 9,220, 58,200, 56, 63,245, 13,244,204,235, 32,227,252,212, 72, -242,231,209,220, 41,165, 8, 16,160, 78, 59,119,251,235,253,106,123,171, 58,250,202,174,237,222,190,117,121,175, 94,189,182, 0, - 88, 15,224,107, 87, 87,215,235,195,135, 15,127,188,115,231,206,199, 43, 87,174, 52,198,198,198,210,177, 99,199, 22,138, 68,162, -175, 89,215,113,182,176,133, 45,108,249,203, 71,134,247,174,202,128,165,125,190,248,226,139, 8, 74,105,201, 88, 90,163,203, 88, -167,239,220,185,115, 35, 40,165, 37,163,195,119,173,108, 64, 51, 0, 11, 55,108,216, 64, 69, 34,209, 79,111, 58, 72, 26, 0,175, -254,253,251,183, 84, 42,149,205, 60, 61, 61,155, 21, 71,157,252,220,220,220,226,246,236,217,163,214,106,181,106, 74,169,218,108, - 54,171,239,221,187,167,238,216,177,163, 26, 69, 67, 64,216, 52, 66,120,233,101,142, 23,110,220,157,247, 1,157,227,133, 27,175, -124,119,212,182,109,219, 78,199,199,199, 31,119,116,116,156,105,227,192,149,126,238,238,238,243, 93, 92, 92,206,186,185,185,205, -113,113,113,201, 48, 26,141,180,160,160,128,198,196,196,208, 43, 87,174,208,155, 55,111, 82, 23, 23,151,212,242,202,217, 69,204, -187, 85,176,124, 50,181,110, 91, 66, 13,235,102, 83, 0, 84,190,122, 22,205,253, 97, 17,189, 59,190, 7,237,104,199,253,253,117, - 6,157,115,114,114,218,252,203, 47,191, 88,159, 63,127, 78, 79,156, 56, 65, 79,158, 60, 73,167, 78,157, 74,235,248,120,235, 91, - 10, 57, 89,237, 68,188,179,175, 51, 96,169, 94,175,143, 80, 42,149, 17,106,181, 58,162,110,221,186, 17,205,155, 55, 63,210,178, -101,203, 85, 7, 15, 30,252,100,233,210,165,253,186, 56,136, 98, 52, 23, 14, 82,250,249, 59,148, 78,110, 75, 95,140,235, 72, 59, -139,121, 15,202,213,244,244, 76, 45, 25,173,189,176,176,144, 94,187,118,141, 94,186,116,137,122,185,185, 41,219,139,185, 19,218, -136,208,161,141, 35,156,108, 45,103, 39, 25,103,251,173, 31,190,177,104, 79,239,164,123,199,188, 99,238,232,196,217, 80,106,189, -253,148,210,140, 65,131, 6, 37, 80, 74, 51, 14, 31, 62,156, 66, 41,205, 24, 56,112, 96, 66,113,104,120, 95, 89,154,175, 12, 78, -186,173,216,100, 77, 94,184,112, 97, 4,165, 52, 98,225,194,133, 17, 64,209, 32,170, 29,100,156, 29,183, 55,173,176,234, 79,238, -160, 7,199,134, 91, 58,200, 56, 59,202, 44,167, 19,239,120,228,182,213,212,112,118, 55,253,101,234, 72, 75, 91, 47,199,171, 65, - 65, 65, 43, 62,249,228,147, 35, 55,111,222,124,104,177, 88, 30,199,197,197, 61, 94,191,126,253,227, 86,173, 90,221,112,117,117, -141, 18, 10,133, 31,177, 65, 17,153, 38,211,100,154,108,192,210,255,206,194,171,160,233,228, 56, 33, 68, 66, 41,157, 62,120,240, - 96, 44, 91,182,108,104,131, 6, 13,134,251,250,250,186, 3, 64,122,122,186, 6,128,114,240,224,193,152, 63,127, 62,150, 47, 95, -190,170, 56,151,229,255, 51,249, 44,147, 16, 82,109,202,148, 41,217, 75,151, 46,181,142, 29, 59, 54,132, 82,250,136, 16, 82,103, -228,200,145,147,121, 60,222,224,128,128,128,208,140,140,140, 28,173, 86,187, 27,192,166,146, 54,211,170, 34,226,192,210,180,186, - 55,206,114, 96, 41,213, 52,244,206,252,249,243,135, 13, 28, 56,208,184,122,245,106,179, 82,169, 60,102, 99,185, 83, 0,124, 85, -242,218,213,213,213,235,193,131, 7, 31,121,120,120,112,226,226,226,160,215,235,241,252,249,115, 43,128, 95,203,211, 80,155,233, -218,141,135,207, 7, 79, 31,213,219, 81,243,244, 62, 4, 92, 46, 76,124, 33, 50,111,157,197,182,107, 79,149,133, 70,172,123,157, -237,148,203,229,223, 77,157, 58,117,228,204,153, 51,237, 2, 2, 2,200,239,191,255,142, 3, 7, 14,232,179,179,179,123, 82, 74, -175,190,238,177,178, 90,173, 16, 10,133, 0,128, 89,179,102,129,195,225,240,179,179,179,133,132, 16, 17, 33,196,158, 16,194, 53, -197, 63,134, 85, 89,128,172, 2, 57, 82,178,228, 21,234, 89,172,214, 3,183,111,223,158,214,184,113, 99,206,221,187,119,145,147, -147,131,231,207,159, 83, 11,165,251,174,106,204,155,171, 90, 62,123, 23,215,254,141,156, 69, 28,225,246,249,104,111,224,112,127, -180, 98, 16,128,201,197, 31,111, 35,132, 8, 0,228,213,173, 91,183,211,147, 39, 79,196,117,235,214,213, 62,125,250,244, 52, 33, -196, 23,192,142, 50,155,119,197,226, 92, 0,185,135, 15, 31, 6,128,241,148, 82, 43, 33,164,201,130, 5, 11, 50,174, 93,187,134, -133, 11, 23,102, 1,216, 0, 0, 82,103,215,190,161, 50, 1, 17,254,188, 16,173,244,224,172,179,210, 50, 59, 23, 72, 61, 60, 59, -215,151,112,192,223,250, 37,154,121, 5,115,132,102, 99,131, 69,139, 22, 93, 83,171,213,250,253,251,247, 27,222,127,255,125,110, -108,108,236, 29, 0,215,139,155, 53,205,172, 33,130,193, 96, 48,254,242, 28,173, 87,135,117, 40, 59, 71,171, 12, 67,176,151, 16, -146,187,124,249,242,206, 0, 28, 15, 30, 60,216,180, 78,157, 58, 0,128,152,152, 24,251,224,224,224,103, 13, 27, 54,124, 2,224, - 22,165,244,184,141,229, 41,185,240, 91,223,210,246, 69,207,156, 57,147,236,220,185,211, 12, 20,153,160,226,155,203, 90, 0,107, - 43,202,243,121, 83,130,130,130,186,125,249,229,151,134,173, 91,183, 90,190,254,250,235, 99,148,210,216,215,209,201,207,207, 95, - 57,122,244,232,145, 11, 22, 44,144, 57, 56, 56,144,168,168, 40,235,182,109,219,148,249,249,249, 43,203,251,206,109,131,121,127, - 7, 17,111,160,188,240, 96,183,161, 97,213, 29,158, 76, 9, 71,204,237,235,216,125,245,177, 42, 54, 95,123,238,174,217,124,224, - 53,205,235,115, 66, 72,163,249,243,231,207, 50, 26,141, 3,249,124,254, 29,165, 82,185,136, 82,250,251,235,238, 39,147,201,148, - 85,179,102,205, 87,127,199,100,181, 90, 41,165,148,111, 54,155, 37, 46, 70,235,201, 5,107,182,126,248,126,176, 76,148,155, 43, -199,207,177, 74,125,169,206, 22,127, 34, 39, 39,103,213,184,113,227,222, 91,176, 96,129,179,163,163, 35,137,142,142,166,251,247, -239, 87,231,228,229, 45,123,157, 50,106, 10,242,207,157, 56,116,112,112, 91,131,153,236, 74, 80, 81, 30,151,156, 46, 85,214,243, - 0,206, 23,159, 76,163, 8, 33,131, 0, 28,165,148,254, 92,161,166, 70,115, 14,128,112,208,160, 65,136,138,138, 26, 10, 96, 47, -128,125, 95,125,245, 85,203,249,243,231, 99,209,162, 69, 88,176, 96, 65, 55, 0,103, 85, 5,121, 39,143,236,219, 61,162,163,201, -196,217,149,168,178,114, 57,228, 84,153,154,185, 89,231, 79,159,191,208,183,153,163, 15,217,124,246,186, 85, 99,165,247,199,140, - 25, 83, 96, 48, 24,206, 2, 88, 7, 32,138, 82,202,122, 23, 50, 24, 12,198,255,111,224,103,115, 25,198,107,115,165, 70,171,248, -203, 23, 0, 92, 32,132,120,181,105,211,102,137, 76, 38,147, 88, 44, 22,228,231,231,167, 1, 88, 83, 28,157,169, 10,251, 21, 10, -197,231, 34,145,232,199,183,180,113, 58, 66,136, 71,221,186,117,249, 0,244,101,124,254,118, 76, 22,197,225,231,177,207, 29, 65, -113,184,228,173,216,216,216,125,161,161,161,253,158, 62,125,250, 27,165,244,212, 27,108, 67, 18, 33,164,241,212,169, 83, 63, 3, -208, 15,192,175,249,249,249, 43,203, 75,132, 47,225,170,222, 60,184, 25,143, 55,242,126, 98,230, 71, 6, 43,173, 33,228,112,226, - 11,141,244,135, 59,102,243,222, 55,220,167,207, 1,140, 45, 94,222,152,220,220,220, 74, 7,249, 36,132,144,171, 47,210,111, 61, - 78,201, 46,171,179, 69, 89,101,204, 32,132, 52,154, 62,125,250,116,171,213, 58,132,195,225,252,146,155,155, 91,233, 62, 43, 55, -146,103,176, 76,251,241,242, 93,193, 26,139,181,171,136,195, 57,171, 54, 89,102,151,243,187,187, 1,216, 52, 58,252,139, 23, 47, -126, 90,180,104, 81,253, 5, 11, 22, 96,227,198,141, 37,221, 46, 47, 44, 88,176, 32,219, 98,177,248, 45, 90,180, 8,155, 54,109, - 50, 3,128,222,100,157,177,245,218,125,206,143, 86,235, 59,124, 14,231,180,222,100,157, 81,166, 41,215,153, 39,175, 59,114,198, -104,180, 90,187,113, 65, 78,103, 24,172,243,244,122,154,200, 46,115, 12, 6,131,241,191, 9,207,214, 21, 41,165,153,111,227,198, - 75, 41,141, 3,224, 56,103,206,156,183,233, 36,179,255,234, 29,245,101, 58,253, 30,192,247, 95,126,187,191,244,239,222, 1, 42, - 31, 84,212, 86,179, 5,224,227,226,197,102,238,154,205,123, 80,206,144, 18,127,179,167, 1, 10,224, 96,241, 98,235,119, 82, 81, - 52,151,229,180, 55,253,253,251, 26,154,129,162, 94,132,111,115,155, 34, 81,212, 11, 5,105,105,105,165,183,243, 97,241,130,146, - 49,229,110, 23,210,108, 0, 35,109, 44,231, 80,118,233, 98, 48, 24,140,255, 29,202,106, 58,172,178,209, 98, 48, 24, 12, 6,131, -193, 96,148,249, 96, 93,110,110, 48, 1,208,181,156, 47,217,156,216, 78, 8,233,250, 26,133,186,192, 52,153, 38,211,100,154, 76, -147,105, 50,205,127,151,102,101,218,255,223, 29,235,254, 63, 92,216, 95, 57,174, 4,235,250,202, 52,153, 38,211,100,154, 76,147, -105, 50,205,127,237,194, 97, 1, 63, 6,131,193, 96, 48, 24,140,215,135, 16, 18, 86,252,215,155, 16, 50,161,120, 42, 30, 0,229, -228,104,241, 91, 44,201, 50,155,205, 30, 0,192,227,241,178, 77,119,230,121, 87,244, 3,124,160,139, 25,248,169, 88,112,188,169, -168, 59,252,171,154,231,205,102,179,115,177,102,129,233,206,188, 30, 21,106, 54, 95,124,246, 15,235,223,158,219,173,140, 45,227, -242,155, 47, 78,127,165,172, 62, 54,239,153,226, 57, 18,255,234,114,254, 93, 52,255,205, 8, 90, 46,201, 50,153,138,234, 17,159, -207,203, 54,222,174,184, 30, 9, 90, 44, 78,255,195,250,183,230,122, 86,164,105, 47, 22,229,213,242,117, 95, 85,145,102, 92,122, -238,244, 66,141,206,181, 34,205,170,158,155,126,222,222, 93, 44,197,231, 38, 23, 24,159,146,158,126,254,127,169, 46, 17, 66,154, - 2,152, 7,192,177,212,219, 81,148,210, 79, 89,173,100, 48, 24,127, 35,202,157,130,167, 76,163,101, 54,155, 61, 34,126, 89,128, - 66, 61,208,229,221,197, 30,129,253, 55,253,169, 87,155, 89, 87, 32,148, 71,239, 15,229,154,148,206,238, 60,163, 99,122,122, 58, - 41,190,112,254, 4,192,191, 12, 77,231,136, 95, 22, 64, 99, 0,218, 15, 95,228,236, 15, 56,230, 8, 4,159,137, 37,146, 78, 90, -173,182, 62, 0,136,197,226,104,109, 97,225,101,119,163,113,229,171,235,151,183,101,165,203,218,121,244, 98,143,144,254,155,166, - 90,172, 86, 97,218,221, 31,219,235,114, 99,121,124,179,126,195, 28,224,244, 2,192, 98,203,158,250,195,239, 14,153,237,202, 7, - 58, 11,237,236, 26, 57, 57, 59,183,179, 82, 90,215,106,181, 18,139,217,252, 88,169, 80, 92,183,154,205, 15,204,134, 66,215,136, - 99,223, 88, 43, 42,231,171,219, 50, 4,224,253, 2, 12,150, 72,165,157,184,124,126,107, 0,176,152, 76,191, 23,170,213,151, 7, - 0,135,108,217,118, 91,247,207,235,174,255,111,195,100, 50,123,196,159, 93, 0,189, 9, 8, 27,244,141, 71,195,145, 63,239, 1, - 0, 67,246, 3, 79,117,236,177, 22, 0, 32,169,213,251,182,200, 43, 44, 11, 0,120, 73, 25, 30, 49, 39,230, 66,111, 2,234,246, - 94,228, 81,153,230,251,243, 15,184,206,156, 48, 80, 4, 0,231, 14,127, 95,231,210,145,141,239, 0, 64,231,129,147, 78,119, 31, - 52, 37, 6, 0,150,111, 62,226,186,239,155,161, 21,106,218,118,110, 42, 4,138,216, 19,181, 13,202, 12, 39, 63, 9,207, 43, 54, - 54,150, 3, 0, 62, 62, 62, 54,157,155,213, 0, 89, 6, 48,153,195,229,182,171, 85,187,118, 24, 0, 26,247,226, 69,164,197,108, -190,225, 13,108,120,203,117,105, 42,165,127, 28,156,181,120, 46, 76, 6,131,193,248, 59,113,178,216, 92,157,124,245,131,114,123, - 29, 22,234,129,171,207,129, 14, 45, 27, 98,194,200, 94,210,210,159, 29,218,180,200, 63,246,238,175, 33, 91,127, 94,201,105,216, -176, 33,226,227,227,109, 42,133,198, 0, 92,137, 5, 32,127,226, 80, 32,145,188, 88,189, 98,133, 99,183,110,221,120, 62, 62, 62, - 32,132, 32, 51, 51,179,229,133, 11, 23,154, 78,155, 54,237, 67,200,159, 20,104, 12, 80, 93,177, 97, 8,208,146,178,214,175, 83, - 29,243,166, 12,149, 1,192,156,119, 55, 52,189,251, 44,203,229,197,139, 23, 93,190,248,226,139, 60,238,229,203, 27,221,128,237, - 89, 64,138, 45,229,220,121,252,182,157, 44, 99,111,224,168, 41, 83, 14,215,174, 93, 91, 26, 16, 16, 64, 28, 28, 28,192,229,114, - 81, 80, 80,224,255,232,209,163,119,238,220,185, 83,120,225,234, 79,194,123,119,250,198,101,219,181,208,217,180,237,218,116,187, -115, 14, 14,209,163, 7, 12,168, 54,116,232, 80,187, 90,181,106, 1, 0, 94,188,120, 17,116,232,208,161,225,135, 15, 31,158, 15, -109,186, 89, 99,128,174,178,109,127,169, 9,192, 14,104,237,228,225, 49,138,203,231,215, 55,155,205,190,197,209,134, 52,139,201, - 20, 45,207,206,222,253,234,250,140, 63,163, 55, 1, 79, 50,128,174,237,194, 48,122, 96, 87, 9, 0,124, 49,108, 73,203,164,132, -231, 2,131,193,128, 58,193,117,219,124,253,205,170,179,224,112,176,235,200,133,151,235,219,162, 25,245, 36, 30, 11,190, 94,141, -244,135,135, 90, 90, 20,207, 59,169,148, 10, 46, 0, 56,202,100, 3, 15,237,223,123,217, 39,116,240,173,231,185, 70,155, 52, 43, - 58, 55,207,236, 95,239,157,250,232,114,189, 31,206,109,227,251,251,251,227,225,195,135, 85, 59, 55, 21,207, 28,172,222,222,143, - 87,126,254,185, 87,251,246,237, 33,149, 74,193,227,241, 96, 54,155,187,222,184,113,163,235,130, 5, 11, 38, 65,241,172,208,214, -115,211, 6, 86, 18, 66, 58,189, 63, 97,170,119,175,126,131, 49,176,103, 27, 86, 17, 25, 12,198,223, 10, 66,200,132,226, 94,135, - 47,123, 30,150,238,133, 88,166,209,226,241,120,217,221,198, 44,245,104,215,162, 1,238, 62,136, 81, 36, 38,103,168, 75, 62,203, -143, 62, 84,167, 95, 27,223,122,215,174, 93,133, 94,175,199,239,191,255,142, 7, 15, 30, 32, 33, 33, 1, 19, 39, 78,212,243,128, -241,229,104, 22,180, 31,190,200, 25,138, 88,105,144,240, 89,141, 11, 79,159,114,117, 58, 29,174, 93,187,134,130,130, 2, 8,133, - 66, 84,171, 86, 13,221,187,119,231, 61,125,250,212,165, 75,183,158,178,246, 61, 71,196, 67, 22,164,230,241,120, 5,229,109, 32, -143,199,203,238,242,238, 98,143,122, 65,213,241, 34, 49, 93, 49,239,155,173,106,171,149,242,226, 18,146,140, 87,175, 94, 69, 88, - 88, 24,206,159, 63,239,154,159,159,255,229,134, 13, 27,230,241,191,253, 97,173,201,144, 55,163, 2,189,130,246,195, 23, 57,187, -102, 31, 12,184,116,230,168, 32, 58, 58, 90,240,227,143, 63, 34, 47, 47, 15, 66,161, 16, 78, 78, 78,240,242,242, 66,157, 58,117, -200,156, 57,115,164,189,123, 71,227,227,241,131, 3,140,129,227,158,149, 87,206,151,219,174, 78,178,119, 83,158,171,117,228,228, - 73, 78,219,182,109,255,240,216, 94,179,102, 77,244,232,209,195,110,212,168, 81,181,134, 14, 31,105,109, 31,254,254, 11, 72, 3, - 52,149,106, 22,166,136, 93, 53, 55,125,186, 14, 31,126,108,209,162, 69, 78, 94, 94, 94,144, 72, 36, 0, 0,133, 66, 81, 45, 49, - 49,177,229,252,249,243, 7,221,142,218,207,107,223, 59, 37, 29, 18, 63,109, 69,251,243,223, 10,159,207,203, 46,137, 34, 57, 72, -196, 5, 41,169, 89,133, 0, 96, 48, 24, 96, 48, 24,160,215,235,241,209,164,137,220,241,131,154,215, 14,104, 55,245,126, 66, 90, - 86,126,221, 11,183, 92, 74,190, 91,153, 38, 79,147, 32,151, 39, 95, 28,191,224,243,207,189, 60, 61,255,211, 34,184,107,231, 78, -110,126,126,126,215, 5, 11, 22,212,163,246, 29,229,117,123, 47,114,170, 72,179,162,115, 83, 30,115,178,198,215, 83,122, 52,218, -244,205, 9, 88, 44, 22,220,188,121, 19,215,174, 93,195,170, 85,171,232,233,211,167, 21,142, 18, 73, 37,231,230, 51,135,182,222, -153,129,223,126,123,152,136, 68, 34,252,250,235,175,120,250,244, 41, 56, 28, 14, 26, 54,108,136,209,163, 71,163,107,215,174, 94, - 19, 38, 76,164,237,123, 14,139,131, 44, 88,245, 38,117,137, 16,194, 1, 48,117,246,130,111,189,223, 29, 55, 25,203,191,158,195, -140, 22,131,193,248,219, 70,179,202, 29,226,129, 82,138, 19, 39, 78,208,226,165, 3,165, 20, 20,224,212,236,191,105,223,193,123, -214,147, 53,251,111,218, 71, 1, 14, 5, 56,142, 64,245,198,141, 27,155,228,114, 57,189,115,231, 14,253,232,163,143, 10,215,174, - 93,123,249,228,201,147,135,204, 70,227, 22, 31,111,239,239, 40,192, 41, 51,243, 30,224, 4, 0, 50,123,123,251,156,228,228,100, -122,234,212, 41,186,112,225, 66,186,123,247,110,122,250,244,105,122,225,194, 5,122,250,244,105,186,111,223, 62, 26, 21, 21, 69, - 99, 98, 98,168, 68, 34,201, 9, 0,100, 21,104,114, 41,192,173,211,255,199, 25,135,239,154, 22, 5,247,223, 52,141, 2, 92,103, - 32,164,113,227,198,150, 67,135, 14,209, 93,187,118,209,159,127,254,153, 70, 69, 69,209,220,220, 92,202, 19, 73,114, 74,190, 87, - 94, 57, 41,192,241,245,245,205,145,203,229,212,207,207,143, 10,133, 66,234,233,233, 73,235,212,169, 67, 91,182,108, 73,223,121, -231, 29, 58,114,228, 72,250,229,151, 95, 82,185, 92, 78,237,236,236,178, 74,190, 87,158,102, 24, 32,150, 72, 36,201, 17, 17, 17, -180, 60,180, 90, 45,205,205,205,165,103,207,158,165, 18,137, 36, 57, 12, 16, 87,164, 41, 6,154,132,134,134,230,228,230,230, 82, -163,209, 72,147,147,147,233,163, 71,143,232,211,167, 79,105,114,114, 50,213,106,181, 47,181, 99, 98, 98,104, 96, 96, 96,142, 24, -104, 82,174,230,191,121, 41,169, 19,175, 44,254,158,158,239,120,121,121,105, 15, 31, 62, 76,211,210,210,232,142, 29, 59, 40, 7, - 88,242,167,117, 43,208, 20, 2,221,219,182,109,107,185,121,243, 38,189,127,255, 62,157, 53,107, 22,237,209,163, 7,237,217,179, - 39, 93,176, 96, 1, 77, 77, 77,165,169,169,169,244,157,119,222,177, 8,129,238,149,213,207,178,206, 77, 25,224,223,187,119,111, -173,209,104,164,113,113,113,180,126,253,250,169, 92, 96,148, 4,168,215, 1, 16, 85, 86, 63,125, 1,103,111,111,239,140,155, 55, -111,210, 35, 71,142,208,128,128,128, 28, 46,240,190, 35, 80,211, 17,168,201, 5,222,175, 89,179,102,206,205,155, 55,105, 94, 94, - 30,245,247,247,207,240, 5,156, 95,183, 46,161,104,130,237,109,179, 23,124, 75,159,165, 22,210,217, 11,190,165, 0,146,139, 7, -116, 61,207,234, 36, 91,216,242,239, 91,254,228, 69,254,105,189, 14,195,195,195, 9,128, 43, 21, 89, 54, 45,151,187,116,249,242, -229, 60,157, 78,135,173, 91,183,170,134, 12, 26,116,176, 67,187,118,113, 53, 2, 2,228,132,195,169,116,238,194, 28,145,232,147, -229,203,151, 59, 25, 12, 6,220,187,119, 15, 77,155, 54,133,151,151, 23,164, 82, 41,164, 82, 41, 60, 60, 60, 16, 28, 28,140,236, -236,108, 56, 56, 56, 96,230,204,153,178, 28,145,232,147,202,116,173, 86,202, 3, 0,139,213, 42, 20, 0, 19, 2,155, 53,187, 55, -127,254,124,142,171,171, 43, 92, 92, 92, 32,149, 74,241,244,233, 83, 24, 12, 6,216,139,237,109, 26,164,149,195,225,112,164, 82, - 41, 46, 93,186,132,169, 83,167,162,117,235,214,112,114,114,130,131,131, 3,234,215,175,143,238,221,187, 99,252,248,241,136,139, -139, 3,177, 33,169,228, 49,143, 55,121,252,248,241, 30, 97, 97, 97,101,126,174,211,233, 32,151,203,145,147,147,131,106,213,170, - 97,240,224,193, 30,143,121,188,201,229,233,185, 2, 94,213,130,130,142,221,185,115,199, 77, 34,145, 96,215,174, 93, 56,122,244, - 40,206,156, 57,131, 83,167, 78,225,196,137, 19,248,245,215, 95,145,147,147, 3, 0, 8, 10, 10,194,129, 3, 7,220,164, 30, 30, - 39, 92, 1, 47,246, 0, 98, 27, 73, 89, 89,231,234,103,102,186,141, 26, 57,242,186, 90,173,198,168, 81,163,176,116,217,178, 57, -124, 27, 71,163, 15, 6,100, 46,222,222,219,191,253,246, 91, 78,102,102, 38, 6, 12, 24,144,187,114,217,178, 15, 34,207,158,173, - 21,113,230, 76,173,165,139, 22,125,208,161, 67,135,220,212,212, 84,236,220,185,147,227,233,239,191, 61, 24,144, 85,181,156, 42, - 96,234,154, 53,107,236,116, 58, 29,186,117,235, 22,103,141,142, 14, 54, 3,123,213,192,211, 43,128,177,178,239,103, 0,147,103, -206,156,233, 37, 18,137,240,217,103,159,229,106,146,146, 26,152,129,159, 21, 64,162, 2, 72, 52, 3, 63,171,226,227, 27,188,251, -238,187,185, 34,145, 8,171, 87,175,246,202,248,207,164,219,182, 70,176,154, 18, 66,142, 17, 66,174, 2, 72,127,127,194,212,247, -195,154,183,194,206, 45, 27,240,205,162, 47,182, 3, 24, 66, 8,217, 13, 96, 6,171,121, 12,198,191, 19, 91,188,200,255,106,243, - 97,185, 45,101, 47,227, 94, 39, 79, 82, 0, 29, 43, 18,114,118,117,109,218,160, 65, 3, 92,187,118, 13,161,161,161,119,156,156, -156,204, 2,145, 8,124, 62, 31,212, 90,249, 28,209, 98,137,164, 75,215,174, 93,121,183,110,221, 66, 96, 96, 32,196, 98, 49,248, -124,254, 31, 22,129, 64, 0,111,111,111, 40,149, 74,116,233,210,133,191,110,221,186, 46,208,235,191,174,244,134, 24,251, 72,154, -115,235,219,145, 63,237,216, 94,179,125,251,246, 80, 40,148,176, 90,173,176,183,183,135,193, 96, 0,143,199, 43,106, 2, 50, 81, -165, 45, 59,205, 98,177, 88,184, 92, 46, 2, 3, 3,177,116,233, 82,232,116, 58, 8, 4, 2, 0,128, 82,169,132, 92, 46,199,163, - 71,143,144,152,152,104,211,124,138, 14, 50, 89,175,161, 67,135, 10,203,250, 76,175,215, 67,161, 80, 64,161, 80, 64, 46,151, 67, -167,211,161, 85,171, 86,194,147, 39, 78,244, 66, 94, 94,153, 19, 75,235,237,236, 6,237,220,185,211, 67, 40, 20, 66,171,213, 66, -165, 82, 33, 37, 37, 5, 73, 73, 73,186,236,236,108,179,131,131, 3, 39, 32, 32,128, 35, 18,137, 68,253,251,247, 39, 74,165, 18, -132, 16,244,238,221,219,117,207,174, 93, 67, 1,172, 98,167,180,109,156, 3,244, 77, 12,134, 62, 45,154, 55,191,116,231,238,221, -176, 79, 62,249, 4, 81, 81, 81,223,218,239,223,127, 85, 3, 60,168,232,187,113,192,228,239, 74, 25, 24,154,148, 20,106, 4,114, - 74,173,146, 24, 16, 31,127,230,221,119,223,125, 24, 21, 21,229,182,122,245,106,175, 33, 3, 6, 76, 6,176,164, 42,101,116,144, -201,154,121,123,123,227,244,233,211, 72, 78, 72,248,194, 12,104,171,242,125, 14,151,219,182,125,251,246,248,245,215, 95,145,154, -148,244,133,249,143,101, 44,122, 80, 2,114,120,113,113, 95,108,223,190,125,219,216,177, 99,193,229,241,218,194,108,174,202,207, -252, 41,241,125,236,196, 79,176,125,243,186,237, 0,198, 81, 74,173,120, 75, 83, 90, 49, 24,140,191,105, 27,156, 13, 94,228,239, - 98,182, 74,154, 18,171, 20,209,242,240,240,240,149, 74,165, 72, 79, 79, 71,221,144,144,108,145, 72, 4, 33,159, 15, 59,161,208, -166, 66,104, 52,154, 80, 31, 31, 31, 40, 20, 10,184,185,185, 65, 32, 16,188, 92,132, 66,225,203,255, 29, 28, 28,192,225,112,224, -239,239, 15,141, 70, 19, 90,169,110,214, 35,143,253,235, 38,125,116,243,234,233,154, 3, 6, 12,132,179,179, 11,252,252,170,193, -195,195, 3, 98,177, 24,126,126,126,168, 85,171, 22, 93,185,114, 37,236, 61, 26,218,116, 33, 47,109,158,120, 60, 30, 44, 22, 11, -178,178,178,240,236,217, 51, 68, 69, 69,225,230,205,155,184,127,255, 62, 84, 42, 21,108,153,183, 90,163,213, 54,226,241,120,101, -154, 44,185, 92, 14,185, 92,254,210,104,229,228,228, 32, 49, 49, 17,234,194,194,198, 21,152,222,129, 13, 26, 52,224, 2,128, 88, - 44, 70,227,198,141,177,105,211, 38,243,241,163, 71,135,213,187,121,211,197,239,236, 89,167,159,126,252,113,216,224,193,131, 45, -183,110,221,130, 82,169,196,147, 39, 79,224,238,238,206, 19,218,217,177,185,242,170, 72, 4, 80,232,166, 82,245,108,221,186,117, -188, 66,161,192,138, 21, 43, 56,124, 7,135,205,139, 0,110,133, 95,228,114,219,180,111,223, 30,199,142, 29, 67,122, 82,210,172, -164, 50, 12, 76, 18,144,147, 28, 23, 55,107,251,246,237,232,222,189, 59, 8,143, 87,229, 68,165,150, 45, 91, 54,176, 90,173,120, -248,240, 33,156,128,219, 85,253,126,173,218,181,195, 74, 34,191, 18,224,122,121,235, 73,128,235,145,145,145, 16,139,197,168, 91, -175, 94,147, 42,254,204, 74, 66, 72,198,216,137,159,224,200,153,223, 0, 0,219, 55,175,203, 42,101,178, 24, 12, 6,139,104,253, - 45, 35, 90, 37,198,170,244,242,242, 65,182,138, 34, 0, 0, 62,159, 15,161, 72, 4,161, 80, 88,100,144, 68,162,170, 56, 62,216, -217,217,189, 52, 86,165, 13, 86,233,255,237,237,237,109, 50, 48, 0, 80,240,252, 76,187,113, 31,140, 21,138, 68, 34, 24, 12,122, - 80, 74, 33, 18,217,193,201,201, 9,129,129,129, 80, 42,149,104,221,166,131, 62, 69, 46, 56,225, 90,183,127,212,235,236, 64,179, -217,140,194,194, 66, 20, 20, 20, 32, 63, 63, 31, 74,165, 18, 90,173,214,230,174,232, 86,171,149,155,146,146,130,189,123,247, 34, - 47, 47, 15, 64, 81,162,117,137,185, 42,249, 27, 31, 31,143, 93,187,118, 33, 33, 33,161, 74,199,167, 93,187,118, 56,113,226, 4, -183, 99,151, 46, 91,206, 7, 4,164,159, 15, 8, 72,239,216,165,203,150, 99,199,142,113,125,125,125,145,152,152,136,123,247,238, -161,160,160, 0,148, 82,214,127,254, 53,120, 1, 20,104,242,243,199,206,153, 51,135, 74,165, 82,172,248,238,187, 70, 75,128, 17, -182, 26, 24, 89, 5, 6, 70,246,102, 6, 6,148, 82, 88,173, 86, 88, 44,150,215,218, 54, 66, 8,225,243,249, 85, 29, 90,129, 84, - 65,255,101,226,251,204, 47,151,226,212,175,135, 74, 62,138,101, 38,139,193, 96,252,221,169,104,174, 67, 94, 41, 7,249,242,111, -121,100,101,101,165, 21, 22, 22,214, 12, 8, 8, 64,106,106,170,135,191,191,127,146,144,207,135, 64, 40, 4,225, 84,238, 9,236, -237,237, 31,166,167,167,183,241,245,245,133,217,108,126,105,170, 94,109, 58, 44,137,210,220,191,127, 31,246,246,246, 15,161,171, -112,228, 4, 88, 12, 5,213,155, 52,105,242, 50, 50,228,228,228, 4, 39, 39, 25, 68, 34, 59,204,157, 59,215,186,122,229,202, 13, -254,157, 23, 41,222,155, 54,135,206, 89,178,229,173,238, 92, 91,111, 76,246,246,246, 15,253,252,252, 90,201,100, 50, 28, 57,114, - 4,137,137,137, 40, 40, 40,128, 70,163,129, 94,175,135, 70,163,129,193, 96,128,157,157, 29,234,213,171, 7, 71, 71, 71, 92,184, -112,225, 33,244,250,178,205,101, 94,222,145,135, 15, 31,182,106,222,188,249,203,136, 74,167, 78,157, 72,167, 78,157,220, 94, 70, -209, 52, 26,228,230,230,226,206,157, 59,184,112,225, 2, 8, 33,136,141,141,181,232,181,218,125,236,180,120, 61,116,192,239,220, -237,219,183,125,248,225,135, 31,180,105,211, 6, 22,224, 29, 0,187,254, 91, 6,166,132,155, 55,111, 62,178, 88, 44,109,234,212, -169, 3, 57,208, 2,192,175, 85, 50,145,207,159, 71,154,205,230, 46,141, 26, 53,194,145,131, 7,219, 1, 72, 44,107,189, 66,160, - 93, 88, 88, 24,180, 90, 45,158, 60,126, 28, 81, 5,147,181,101,246,130,111,223,127,119,220,100,236,220,178, 1,219, 55,175, 75, -217,182,105,173, 31,108,200, 31, 99, 48, 24,255,170,104, 86,165, 94,228,127,145,178,114,180, 74,204, 23,175, 42, 66,138,130,130, -136,200,200,200,154, 77,154, 52,193,150, 45, 91,154,183,110,213, 42, 77, 32, 20,154,133, 2, 1, 56, 54,220, 72,180,133,133, 23, - 47, 94,188,216,162,127,255,254,188, 91,183,110,193,203,203,235,165,209, 42,249,203,227,241, 64, 41,133,189,189, 61,126,249,229, - 23,163,182,176,240, 98,165,209, 34,139,213,194, 41, 54,122,148, 82,200,229,114, 8, 4, 2,172, 90,181, 26,235, 87,174, 28,105, - 1, 14, 5, 73,220, 63, 7, 96,247, 95,187, 65,107, 52,151, 78,157, 58,213,116,254,252,249,252,106,213,170, 65, 46,151,163,160, -160, 0,121,121,121, 80, 42,149, 80, 42,149, 40, 40, 40,128, 92, 46,135,157,157, 29,162,162,162, 76, 58,141,230, 82,121,122, 34, -157,238,240,152, 49, 99,102, 70, 70, 70,122,243,120, 60,152, 76, 38, 88,173, 86, 88,173, 86, 24,141, 70, 60,127,254, 28,209,209, -209,120,250,244, 41,242,243,243,193,231,243,193,229,114,113,255,254,253, 2,137,201,116,144,157,210,175, 15, 31, 56,114,227,198, -141, 15, 70,143, 30, 13,159,106,213, 58, 32, 53,213, 38, 3,115,180, 2, 3,163,120, 13, 3,243, 7, 3,164, 82,221,141,143,143, -111,211,177, 99, 71,120, 87,171,246,109,189,212,212,243,143,171,144,167,101, 49,155,175,223,184,113,163,203,187,239,190,139, 45, - 91,182,124,235, 30, 31,127, 38,231,149,102, 78,119,192,189, 70,173, 90,223,190,255,254,251, 56,119,238, 28, 44,102,243,245, 10, - 46, 58,165, 71,124,175,254,254,132,169,126,175, 36,190,111, 34,132, 76, 1,176,130,213, 40, 6,131,241, 79,142,104, 85,169,233, - 80,108,177,204,158, 49, 99,134,137,195,225, 96,224,192,129, 14,191, 30, 59, 54,248,254,131, 7,129,217,217,217, 78, 22,139,165, - 82, 45,119,189,126,237,140, 25, 51,228, 6,131, 1,193,193,193,200,207,207,135,197, 98, 1,143,199, 3,143,199, 3, 33, 4, 28, - 14, 7, 82,169, 20,145,145,145,216,182,109,155,210, 93,175, 95, 91,233, 77,194, 98,121,184,107,215, 46,112,185, 92,106,103,103, - 7, 66, 8,120, 60, 30, 86,175, 94,157,189, 30, 56, 2, 0, 92, 14,199, 0, 0, 28, 14,177, 53,123,183,210,118, 75,161, 80, 8, -107, 81, 39,128, 74,215,117,214,235,215, 44, 95,190, 92,245,228,201, 19, 20, 22, 22,190,140,190,169,213,234,151,201,245,114,185, - 28,132, 16, 20, 22, 22,226,216,177, 99, 42,103,189,126, 77,121,122,121, 64,102,106,108,108,223,230,205,155,231,197,199,199, 67, -161, 80,224,225,195,135,184,112,225, 2, 14, 28, 56,128,115,231,206,225,249,243,231, 48,155,205,240,245,245, 5,165, 20, 71,143, - 30, 85,152, 85,170,119,242,128, 76,118, 90,148, 79,117, 47,175, 46,158, 30, 30,201,238,110,110,169,213,189,188,186,188,250,185, - 12,136,137,137,137,129,217,108, 70, 96, 96,160, 75, 69,121, 90,212,108,190,113,227,198, 13,188,251,238,187,240,171, 89,115, 89, - 0,224,254,234, 58, 1,128,123, 64,173, 90,203, 74, 12, 12, 53,155,111, 84,181,204, 14,192,186,207, 63,255, 92, 43, 16, 8,176, -127,255,254, 64, 83,237,218, 79,121,192, 8, 41, 16,210, 17, 16, 84,246,125,111, 96,195,151, 95,126,153, 73, 8,193,238,221,187, -221,100,181,106, 61,226, 1, 99,100, 64,117, 25, 80,157, 7,140,145,213,170,245,104,255,254,253,110,102,179, 25,211,166, 77,203, -244, 6, 54, 84, 32, 57,149, 82,218,135, 82,218,158, 82,234,183,109,211, 90,156,250,245, 80,137,201, 26, 71, 41,189, 67, 41, 29, - 77, 41,125,196,106, 28,131,193,248, 39, 67,202,202,131,226,183, 88,146, 5, 80,143, 14, 45, 27,226,238,131,103, 10, 55,103,199, -179, 37,159,229, 71, 31,170,211, 57,212,177,225, 15, 63,252, 0, 62,159,143,148,148, 20, 60,126,252, 24,142,142,142, 24, 57,114, -164, 94,171, 82,245, 45,153,235,144, 16,210,149, 82,122,161, 88,179,104, 62, 53, 69,172,180, 22, 47,170,230,153, 83, 39,184, 50, -153, 12,106,181, 26, 28, 14, 7,118,118,118,176,183,183,135, 88, 44,198,189,123,247, 16,222,167,159, 37,199,190,253,203, 1, 75, - 75,230, 83, 43,173, 9, 66,184, 0,208, 2,176,143, 4, 62,243,240,241,153, 49,111,222, 60,113,143, 30, 61, 32, 16, 8, 80,173, -122, 80,102, 96,207, 21,235, 56, 28, 98, 78,205, 83,206,173, 85,221, 71,246, 56, 54, 17, 0, 41,154, 19,177,120,174,195,178,202, -233,111,184, 26,248,203,207, 43, 29, 27, 55, 46,202, 71,151,203,229,200,202,202, 66,118,118, 54,228,114, 57, 10, 11, 11, 1, 0, - 39, 78,156,192,169,107, 79,149,218,106,131,227,202, 43,231,127,182,253,153,131,143,241,118,141, 61,187,126,230,186,187,187, 35, - 43, 43, 11, 57, 57, 57,144,203,229,208,106,181,176, 88, 44,200,207,207,199,214,237, 63, 91,242,164,237, 19, 74, 6,132,172, 80, -179, 48, 69,236,162,254,205, 55,172, 94, 0,253,224,131, 15, 28, 28, 29, 29, 97,181, 90, 81, 80, 80,128,228,228,100,196,199,199, -227,218,181,107,133,217,114, 3, 10,221,186,165,150, 12, 88, 90,230,254,124,123, 33,212,191,159,102,113, 93, 2, 0, 31,111,239, -244,164,164, 36, 15,139,197, 2, 95, 95, 95,179, 60, 63,127,153, 16, 56,231, 0,100, 0,160,185,192,188, 53,235,214,141,237,215, -175, 31,154, 53,107,150,146,153,149, 85,163,172,186, 4, 66,184,193,128, 76, 83,173, 90,244,157, 59,119,188,146,147,147,241,238, -187,239,230, 38,189,120, 49, 75, 86,156,175,165, 0,218, 5,212,170,181,108,255,254,253,110, 53,107,214, 68,104,104,104,166, 93, -114,114,253,103,128,162,156,250, 89,238,185, 41,143, 57, 89, 99,210,128, 6,205, 62,250,232, 35,152,205,102, 92,187,118, 13,183, -111,223, 70, 82, 82, 18,126,251,237, 55,185,163, 68, 50,172,100,174,195,242,234,231, 59, 65,133,129,187,119,239, 34, 2,129, 0, -219,183,111, 71,100,100, 36, 0, 32, 44, 44, 12,239,191,255, 62,204,102, 51, 70,141, 26, 77, 79, 62, 19,199, 85, 84, 63, 9, 33, - 13, 0,124,135, 34,147,215,140, 82,106, 71, 8, 73, 7,224, 87,149,156, 44, 86, 63,153, 38,211,252,247,104,254, 83,169,116,174, -195,197, 27, 33,251,227, 52, 31,227,211, 15,109, 90,196,107,219,174,125,200,162,133, 11, 56,205,155, 55,135,159,159, 31,194,194, -194,144,156,156, 44,114,114,114,170,108, 62, 53,117,251,158, 35,226, 27, 54,108,232, 52,107,214, 44, 89,247,238,221,249,126,126, -126,160,148, 34, 50, 50, 18, 71,142, 28, 49,110,217,178, 69,169,241,236, 35,143,184,188, 87,109,203,124,106,183, 1, 13,128,175, -170,165,167,111,158, 60,105,210,130,198, 77,154,124,176,112,225, 66,142,212, 94,204, 95, 58,119,156, 29, 0, 44,254,254,128,172, -223,224,145, 88, 83, 27,232, 48,162,236,121,228, 74,151, 51, 57,117,124, 82,175, 1, 93,106,127, 54,101,172,101,232,208,161, 18, - 71, 71, 71,248,249,249,193,217,217, 25,113,113,113, 72, 77, 77,165,199,143, 31, 87,223,188, 31,195, 63,122,238,110,146,157,204, -219,150,121, 9, 85,237,123, 12, 73,232,213,171,151,243,152, 49, 99, 28,154, 54,109,202, 23,137, 68, 16,137, 68,200,202,202,194, -243,231,207,141,199,143, 31, 87,107, 60,222, 41,136,184,188, 95,101,227, 92,135,218,246,195, 23, 61,191,126,126,225,180,232,135, - 15, 71, 91,129, 70, 70,163,209,215, 98,177, 16, 14,135,147, 97,181, 90, 31, 26, 85,170,109,250,176,133,171,217, 92,135,182, 97, -177, 88, 4, 22,139, 5,114,185, 28,231,207,159,231,189,120,241, 98,222,131, 7, 15,230,165,167,167,195,100, 50, 97,208,160, 65, - 8, 11, 11,195,229,203,151,145,147,149,117,188, 34,173,103,128, 66,148,154,250,254,248,241,227, 79,239,218,181,139,243,224,193, - 3,183,237,219,183,111, 45,203,192,140, 30, 61,218,154,149,156,252,190, 30, 80, 84, 80, 63, 43, 58, 55,115,207,236, 95,255,160, -255,192,193,245, 22,206,159,199,111,221,186, 53,220,220,220,208,174, 93, 59, 24,141, 70,167,186,117,235, 86,118,110,170,218,247, - 28, 22,215,168, 81, 35,201,234,213,171,189,198,142, 29,139, 41, 83,166, 0, 0,180, 90, 45,206,157, 59,135,105,211,166,101, 38, -243, 90, 20, 86, 86, 63,139, 35, 85, 37, 6,236, 42,128,246, 0,226, 88,226, 59,131,193,248, 71, 70,173, 8, 9,163,148, 70, 18, - 66,188, 1,132, 3, 56, 73, 41,205, 40,215,104, 1,255,153, 79,237,250,237, 71, 40, 61,205, 71, 17,222,143,205,254, 99, 94, 76, -156,177, 44,148,107, 82, 58,243,137,206, 49, 54, 38,134, 84, 54,231,225,203,249,212,100, 65,106,215,248,125,205,151, 46, 94,252, -201,154, 53,107,186,148, 12,225, 96,111,111,255, 80, 91, 88,120,209, 93,175, 95,171,145, 5, 93,172,234,220,124,169, 64, 22,128, - 73,206, 17, 17,235,122,247, 27,180,220,206, 37,144, 63,103,201, 22, 29,151,195, 49, 60, 79,207,193,154,218,128,196,134, 14,146, - 26, 3, 16, 45,247, 54,103,185, 14,126,246,229,231,159,127,182,248,171,175,154, 75,165,210, 14, 70,179, 57,200,106,181, 2, 86, -107,172,166,176,240, 42, 53, 26,239,232,195,230,175,180,147,121, 83,155,231, 37,116,170,171,114, 73, 56,212,124,199,182,109, 83, - 15, 30, 60,248,167,109,119,213,235,215,105,156,234, 94,176,101,219, 75,175,163, 3,126, 71,118,246,239,229, 86, 2,176,185, 14, -109,126,250,176, 90, 39, 56, 59, 59,239,236,210,165,139, 93,215,174, 93, 17, 30, 30,142,214,173, 91,195,106,181,130, 82, 10,149, - 74,133, 3, 7, 14, 96,249,242,229,177, 53,128,175, 42,211,211, 3, 23, 69,167, 78,189,211,168, 81,163,237, 21, 25,152, 98,147, - 85,105, 78, 98,197,231,166, 40,214, 44,235,155, 56,124,242,210,218, 6,101,134,147,171,189,217, 43,250,209, 67,142,237,231,102, -176,202, 18,121,160,197,160, 1, 3, 38,115,121,188,118,197, 61, 32,233,147,199,143, 35, 74, 38,149, 70,216,251,231,171, 88,151, - 74,198,174, 99,137,239, 12, 6,227,159, 74, 24,128, 72, 0,225,148,210,205,197,201,241,229, 39,195,243,120,188,236,146,168, 15, -143,199,203,142, 59, 58,113,100, 69,234,124,160, 75,113, 36, 11,149,206,117, 88,252,127, 34,160,130, 94,255,245, 31, 6, 35, 45, -213,187,144,255,202,250, 85,217,218, 2,224, 25,204,250,222,200,126, 12, 28,155, 84,164,215,124,241, 23,165,183,169,220,155,236, - 31,126, 87,144,175, 3,174, 67,173,190, 14,181,186,204,164, 93, 62, 79,144, 95, 89, 57, 95,221,246,100, 64,249,166,219,206,171, -226,254,225,189,193,254,252,183,145,150,155,123, 20,128,180,218,137, 19,158,103, 78,156, 24,250,217,244,233,131,188,125,124,106, -185,185,185, 57, 59, 56, 56,112,110,221,186, 21,111,214,233,214, 53, 6,118, 20, 71, 83, 43, 69, 15, 92, 12, 78, 78,174, 63,100, -192,128,201,132,199,107, 91,218,192, 80,179,249,183, 64, 96, 67, 69,145,172,215, 61, 55,253, 68,222, 93,138, 35, 89,224,218,120, -110,166, 22,149, 99, 9,204,230, 37,136,138, 42,163,206, 87,185, 46, 45, 38,132,168,192, 18,223, 25, 12,198, 63,151,147,197,230, -234,228,159, 62,249, 43,231,247, 1,208,149,105, 50,205,127,138,102,145, 87,129, 35,219,159, 76,147,105, 50, 77,166,249,246, 53, -255,169, 11,143,153, 80, 6,195, 54,104, 81,114,186,146,237, 9, 6,131,193, 96,148,166, 84,110, 86,233,123,198,102,160, 40,117, -167,107, 57, 55,149, 11, 85,248,129,174,175,113,211,186,192, 52,153, 38,211,100,154, 76,147,105, 50,205,127,151,102,101,218,127, -199,222,140,132,144, 9, 37,185, 89,175,142,169, 69,108,157,230,230, 53,127,152,117,125,101,154, 76,147,105, 50, 77,166,201, 52, -153,230, 63,154,138, 34, 90, 28,182,123, 24, 12, 6, 3, 88,180,136,112, 0, 66,128, 69, 28,224, 16, 23, 24,194, 45,122,253,250, - 12, 25, 66,202, 28,204,118,234, 40, 23, 7,182,199, 25,140,127, 14,148,210,140,242, 38,149,102, 57, 90,255, 93, 7,236,239,229, -229,181, 9, 0,201,204,204,156, 64, 41, 77,102,123,229,127, 15, 87, 87,215, 46,102,179, 25, 10,133,226,226, 63,113,251,234,215, - 38, 3, 40, 7,117,255,115,197, 64,242,227, 88,186,179,172,117,235, 5,145,119, 65,254, 51, 22, 23,177,226, 73,244,115,250, 75, - 21,234, 60,231,157,174,126, 27, 0,224,244,133,148,201,127,197,184, 90,132,144, 58,238,238,238,103,121, 60, 30,207, 98,177, 76, -202,202,202, 58, 81,190, 17, 26,194, 5, 0, 62,189, 60,219,205, 37,100,214,167, 31, 18,190, 70,191, 77,174,215, 22, 42,184,124, -110,130,136,239,117, 3, 92,223,211, 5,234, 86,143,203,250,254,193,131, 7,203,157,197,187, 65, 16,121, 39,164, 94,189, 62, 77, - 66,197,113,223,173,109,190,166, 67,160, 27, 63, 62,229,190,244,219, 31, 21,155, 28, 93,170,247, 25, 51,204,245, 4,207,158,140, -222,186, 53, 87,205,206, 50,219,249,134, 16, 23, 35, 16,202, 23,137,252, 44,102,179, 39, 1, 40,151,199,203, 50,233,245, 41, 2, - 32,106, 22,165,242,127,186,166, 64, 36,170,102, 49,155, 61, 1,224,127,177,156,140, 63, 82,174,209,114,112,112,184,199,225,112, -170,149,158, 12,183,100, 62,193,146,247, 74,127, 70, 8,129,197, 98, 73,205,207,207,111, 90,133, 11,162, 35,128,161, 0, 74,186, -168,239, 1,112,128, 82,170,124,205, 11,172,163, 64, 32,152, 33,145, 72, 58,107,181,218,250, 0, 32, 22,139,163, 11, 11, 11, 47, - 25,141,198,239, 94, 71,151, 16,194, 3, 48, 68, 42,149,118,226,112, 56,157, 40,165,132, 82,122, 89,173, 86, 95, 2,112,144, 82, -106,126, 13, 77,177,135,135,199,146,144,144,144, 17,179,103,207,206,115,117,117, 13,158, 54,109,218, 93,119,119,247,189,185,185, -185,115, 41,165,218,255,133,202, 65, 8,169,229,229,229,181,135,207,231,115, 83, 82, 82, 58, 1,128,159,159,223,101,131,193, 96, -201,206,206, 30, 73, 41,125, 81, 69, 61, 9,128,150, 82,169,180,169, 84, 42,109,111,177, 88,234, 22,207,207,248, 68,173, 86, 95, - 51, 26,141,247, 0,220,162,148, 22,254, 15,153, 97, 7, 15, 15,143, 93,132, 16, 16, 66,130, 40,165,170,127,220,147, 24, 7,117, - 31, 71, 63, 13,126,105,166,234,135, 84,176, 67,224, 95,198,186, 54, 27,173,206, 29,188,251,244,237,219,141, 3, 0, 6,211,233, - 62,168,226,228,215,182,152,172,129, 3, 7,254,190,107,215, 46,103,189, 94,143, 9, 19, 38,236,145,201,100, 27, 20, 10,197,236, -138,190,231, 40,117,158,182, 98,245, 57,251,162,249,175,225, 97,181, 90, 60,210,210, 94, 4, 61,126,244,123,207,232,232,155, 75, -181, 79, 47,221,178, 18,254, 68, 35,218, 61,181,165, 28,245,106,145,222,253,134, 12, 8,255,234,171,133, 24, 49,108, 68,245,232, -104,157,216,215, 49, 78,152,175,149,212,118,117,247,232,251,213,226, 67,228,198,245,163,125,119,109, 95,116,233,131, 15,220, 58, - 51,179,101,211,177, 37,139,121,188,150,206, 33, 33,237,135, 29, 61, 10,169,159, 31,143, 39, 18,113, 0,192,172,215,251,169, 83, - 82,188,247,247,237,219, 98, 17, 33, 87, 22, 80,122,155,105,254,255,107, 50,170,104,180, 56, 28, 78,181,180,180, 52, 15,137, 68, - 82, 18, 22,131,197, 98,129,197, 98,121, 57,121, 49,165,244,229, 95,179,217,140,144,144, 16,155,158,104, 1,116, 6,240, 94,199, -142, 29, 7,127,247,221,119,252,208,208,208,146, 41, 67,218,205,153, 51,231,123, 66,200, 97, 0, 59, 0, 92,180,245,137,151, 16, -210, 67, 34,145,236, 94,177, 98,133, 99,183,110,221,120, 62, 62, 62, 32,132, 32, 51, 51,179,229,133, 11, 23,154, 78,155, 54,109, - 18, 33,100, 20,165,244,108, 21, 78,236, 6, 14, 14, 14,135, 6, 12, 24, 80,173, 67,135, 14,118,245,234,213,131,197, 98,193,253, -251,247,199,222,187,119,111,248,225,195,135, 23, 16, 66, 6,219, 58, 95, 27, 33,132, 72,165,210, 49,190,190,190, 75,230,207,159, -239, 50,106,212, 40,225,163, 71,143, 10, 2, 3, 3,201,141, 27, 55,220, 15, 28, 56, 48,105,217,178,101, 67, 28, 28, 28,230,170, -213,234,159,169, 13, 9,116,142,142,142,247, 56, 28, 78, 53, 91,140, 48, 0,155,205, 48, 33,164,113,141, 26, 53, 14, 92,191,126, -189, 70, 98, 98,162,165,127,255,254, 59, 1,224,210,165, 75,161, 38,147,137,116,239,222,253, 52, 33,100, 40,165,244,190,141,219, -222,208,197,197,229,215, 17, 35, 70,184,212,170, 85,203,190, 70,141, 26, 68, 34,145,128,203,229, 66,161, 80,248, 60,122,244,168, -235,237,219,183,181, 23, 46, 92,200, 39,132,244,165,148, 70, 85,225, 56,181,246,240,240, 24,205,231,243, 27,152,205,102, 95, 0, -224,241,120,105, 38,147,233, 81,118,118,246, 46, 74,233,239,175,123,130,120,122,122,174, 95,178,100,137, 91,118,118, 54, 93,182, -108,217,122, 0, 99,254,169, 23,131, 61,123, 15,226,222,221,219, 0, 32, 32,132,144, 87,235, 31, 33,132,212, 13,130,224,211, 79, -167,163,105,179, 22, 24, 57, 98, 72,165,154,225, 93,253, 86,240,133, 2, 87,157, 78,247,187, 66,163, 63,232,233,234, 52,116,196, -240,222,177, 0,112,250,204,149,161, 45, 90,184, 92,150,217,139,134,216,217,217,181, 54, 25,140,121, 39, 47,164,124, 94, 21, 83, -229,235,235,123,214,217,217,217, 62, 63, 63, 63, 51, 39, 39,103,227,192,129, 3, 23,239,216,177,195, 57, 62, 62, 30, 41, 41, 41, -248,228,147, 79,164,169,169,169,147, 69, 34,209, 77,189, 94, 95,110,100, 75,165,202, 95, 59,103, 86,191,249, 50,153, 27, 87, 98, -239, 8, 7,153, 11, 2,107, 53, 66,203,214,125,240, 78,248, 7,120, 30, 27,217,114,199,246,175, 34,211,210, 46,124, 35,117,169, -185, 88, 46,175, 81,238,117,169,126, 48,233, 80, 98,178,230,207, 95,136,152,167, 79, 85,137, 9,156,143, 79, 30,229,217,191,211, - 37, 68,100, 54,100, 38,222,184,126,180, 70,219,118,253, 1,160,233,174,237,139, 46, 77, 29,229,210,101,221,238,124, 21,187, 37, -149,127,237,252,138,207, 31,211, 99,245,106,143,176, 73,147, 4,234,132, 4, 99,220,143, 63,106,178,174, 93,179,240, 68, 34,234, -215,179, 39,113,239,212,201,110,210,147, 39,130,223,150, 45,107,191, 84, 40, 12,156, 99, 48,236,102,154,255,127,154,172,142,190, - 76,134,127,153,171, 85,210,124,200,171,224, 75,144, 72, 36,216,191,127, 63,248,124, 62,120, 60, 30,248,124,126,185,255,251,251, -251,219, 82,144,129, 94, 94, 94,223,111,216,176,193,179, 71,143, 30,176,179,179,123,249, 25,151,203, 69,183,110,221,208,181,107, - 87,126,122,122,250,240,253,251,247, 15, 95,186,116,105, 22, 33,100, 10,165,244, 72, 37,186,157,130,131,131,143,156, 59,119, 78, -172,211,233,112,237,218, 53, 20, 20, 20, 64, 40, 20,162, 90,181,106,232,222,189, 59,239,233,211,167, 46,221,186,117, 59, 66, 8, -233, 77, 41,189,108, 67, 89,155,122,120,120, 92, 61,120,240,160, 93,163, 70,141,200,243,231,207, 17, 22, 22, 6, 0, 80, 40, 20, -232,223,191,191,221,168, 81,163,106, 13, 31, 62,252, 22, 33,164, 3,165,244, 94, 37,122, 77,188,188,188,126, 30, 48, 96,128,207, -210,165, 75, 29, 29, 28, 28,144,152,152,152,225,229,229, 21, 84,178,191,135, 15, 31, 46,236,211,167,143,247,242,229,203,215, 30, - 58,116,232,115, 66,200, 24, 74,105, 68, 69,186, 37,134,216,222,222, 30, 89, 89, 89,216,179,103, 15, 38, 79,158, 12, 46,151,139, -236,236,108, 28, 56,112, 0, 31,127,252,113,137,161,177,201, 12, 75, 36,146,174,141, 26, 53,218,122,233,210,165,106, 78, 78, 78, -240,241,241,225,124,249,229,151, 13, 2, 3, 3,197,213,171, 87,231,102,100,100,224,200,145, 35,129,163, 71,143,254,213,206,206, -110,172, 78,167,171,180, 73,205,211,211,115,219,201,147, 39,253,163,163,163,241,227,143, 63, 34, 63, 63, 31, 66,161, 16, 78, 78, - 78,240,242,242, 66, 80, 80, 16,153, 53,107,150,125,159, 62,125,236,167, 76,153,178, 13, 64, 99, 27,142, 81, 35, 15, 15,143, 77, -195,135, 15, 15, 92,180,104,145,147,151,151, 23, 74, 30, 12, 20, 10, 69,181,196,196,196,150,243,231,207, 31,236,233,233, 25,159, -157,157, 61,145, 82,250,160,138, 39, 78,227, 46, 93,186,244,238,223,191, 63, 55, 35, 35, 3,187,118,237,234, 77, 8,105,108,171, -185,252,187,113,239,238,109, 76,248,232, 19,181,143,159,159,224,220,217,173, 3,229,242,122,119,157,196, 69, 19, 82,203,181, 48, -118,238,192,109,214,189,199, 7,130, 94,225,253,213,155,127, 88, 43,181,197,104,241,133, 2,215, 61,187, 87, 37, 95,191,113,175, -193,249, 11,183,123, 14,236,219,151, 10, 4, 78,129, 0,240,249,180, 79,249, 71,142, 29,219,222,173,107,139,244,118,109,155, 38, -143, 28, 53,221,191, 10,199,166, 78,157, 58,117,174, 68, 70, 70,122,138, 68, 34,228,231,231,187,110,222,188,121, 85,219,182,109, - 57,113,113,113,120,250,244, 41, 18, 18, 18,160, 80, 40,208,173, 91, 55,105, 68, 68,196, 70, 0,229, 26, 45, 35,167,243, 18,159, -234,166,117,174, 98, 73, 13,163, 69,233, 65, 77, 25,245,206,159, 60,223,112,223, 46,109,152,167,119, 72,208,123,239, 47,192, 87, -139, 15,243,247,238,249,118,254,197, 11,251, 0, 78,141,242,103, 4,160,104, 61,103,238,108, 40, 85,122,140, 26, 49, 30,163, 71, -140,119,165, 48,120, 83,139, 78, 98,208, 22, 56, 57, 8,158,156,216,176,101,213, 0, 0,213, 74,153,173,139,204,108,149,207, 87, - 60, 94,139,222,223,127,239,222, 96,220, 56,209,131, 69,139, 10,115,175, 93,211,214,238,213,171, 32,236,195, 15,245, 0,160, 74, - 72, 16,196, 44, 88, 96,239,222,190,189,184,213,140, 25,206, 22,131,193,235,107, 66,154,127, 73,233,157,170,106,250, 15, 29,106, -153,191,125,123,179,107,211,167,119, 36, 38, 19,183,103,171, 86,247,151,237,218,149,246, 38,154,111,179,156,233, 87,175,234,243, - 3, 3, 17,214,191,127,158,191,135,135,254,109,110,251,155,148,147,129,146,160, 84, 6,128,146,145,225,139,174, 87,148, 82,156, - 60,121,178, 3,128, 43, 0, 22,133,135,135, 47, 4, 0, 39, 39,167, 44,185, 92,238,113,228,200,145, 74, 77, 22,159,207,135,183, -183, 55,130,130,130,178,179,178,178, 60, 43,184, 56,166, 88,173,214,106,148,210,151,209,151,242,208,235,245,136,141,141, 69,195, -134, 13, 83, 41,165,126, 21, 53,237,216,219,219,199, 61,125,250,212,237,241,227,199,184,119,239, 30, 2, 3, 3,225,236,236, 12, - 62,159, 15,147,201, 4,165, 82,137,224,224, 96,136, 68, 34, 52,105,210, 36,183,176,176, 48,176,162, 38, 32, 66,136, 72, 34,145, -196, 94,189,122,213, 47, 44, 44, 12,119,238,220,129,159,159, 31,188,188,188, 0, 0, 9, 9, 9,184,113,227, 6,122,245,234,133, -200,200, 72, 12, 26, 52, 40,165,176,176, 48,136, 82,170, 47, 79,211,213,213, 53,227,210,165, 75,169,161,161,161,186,194,194, 66, - 78, 86, 86, 22,255,218,181,107,102,149, 74, 37, 85, 40, 20,124,185, 92,206, 87, 42,149,188,194,194, 66, 62,135,195, 17,104,181, - 90,254,197,139, 23,185, 6,131,193,177,162,253, 84,114,156,142, 29, 59,134,208,208, 80, 28, 57,114, 4,159,125,246, 25,126,251, -237, 55,248,249,249,225,224,193,131,152, 49, 99, 6,158, 61,123, 6, 55, 55, 55,212,171, 87,175,194, 99, 4, 0,181,107,215,126, -254,240,225,195, 90, 2,129,160,100, 94,199,146,249,242,144,147,147,131, 23, 47, 94, 32, 45, 45, 13,181,107,215,198,136, 17, 35, - 94,164,166,166,214,174,172,242, 85,171, 86, 45, 39, 58, 58,218,173, 97,195,134,200,202,202,130,147,147, 19,100, 50, 25,156,156, -156, 94,254, 31, 24, 24,136,233,211,167,195,203,203, 43, 91,171,213,122, 86,102,130, 66, 67, 67,207, 94,188,120,209,205,209,209, - 17,153,153,153, 80, 42,149,224,241,120,176,183,183,135,155,155,219, 75, 35, 31, 27, 27,139,240,240,240,220,184,184,184, 30, 85, -136,192,113, 60, 61, 61,159, 70, 69, 69, 5, 81, 74,145,156,156,140,103,207,158,225,163,143, 62,138,213,233,116, 33,255,164, 57, -251, 74,229, 93, 9,198,188, 63, 65, 48,160, 95,107,195,147,232, 19, 68,100,125,134,198, 13, 28, 21, 0,112,255,145, 82,166,231, - 4,163,110,253,222,244,151, 95,127, 23,254,188, 99, 51, 31, 86,120,130,224,217,227, 24,250,117,121,218, 61, 58,251,140,251,244, -211,177, 13, 58,182,237,192, 81, 21, 22,122,108,220,184,186, 73, 92,220, 19, 15, 0, 8, 12,172,155, 61,105,210,180, 8, 7,137, - 36,251,202,141,171,214, 53,107,182, 61, 58,123, 41,125,139, 13,199, 38, 48, 40, 40,232,230,177, 99,199,220, 60, 60, 60, 32,147, -201, 80, 88, 88, 8,163,209,136,199,143, 31,235,246,239,223,111,114,116,116,116,200,204,204,132, 92, 46, 7, 33, 4,199,142, 29, - 75,166,148, 6,188,170, 85,146,163, 5, 0, 31,189, 83,151, 95,175,115,144,179, 64,100, 22,139,249, 49,222, 32, 22, 17,161, 82, -207,211,103,239, 55, 60,125,254,206,200, 1, 3, 63,115,111,215, 97, 0,230,207, 27,108, 74, 79, 79, 14, 51,162,221,211,178,114, -180,234, 6,145,206,253, 7, 13, 24,242,213, 87, 11,177,112,254, 34,156, 56,118, 84, 33,149,112,244,142, 78,124, 89,251,150,109, -116,211, 39,247, 75, 81,171,211,253,190, 90,190,127, 68,120,191,233,213,218,182,235,143, 27,215,143, 98,215,246, 69,247,136,152, -178,102,196, 87, 88, 68,136,179, 83, 96,224,196,169,177,177,130, 7, 11, 23,170,205,233,233, 5, 77,167, 77,203, 45,107,221,212, -243,231, 37, 66, 31, 31, 71,231,190,125, 93,214, 6, 4, 80, 83,118,246,166,178,114,140,202,210,188, 32,149, 58,237, 59,125,186, - 11,229,243, 59,204,252,226, 11,113,239,222,189,161, 84, 42,113,248,240, 97,108,250,241, 71,189,183,183,247, 67,159, 71,143, 34, - 27, 40,149,243,108,213,108, 58,109, 90,174,197, 98, 33, 67,102,204,232, 22,157,144,208, 57, 51, 59,187, 58, 0,120,187,184,164, - 52, 13, 12,188,183,237,196,137,103,235,107,212,176,218, 90,206,159,206,156,241, 60,148,152, 56,206,197,197, 69,156,149,157,205, - 19, 9,133,121, 45,235,213, 59,248,195,220,185, 87,204, 81, 81, 2,187,106,213, 28,101,189,123, 87,121,219,155, 78,155,150,155, -175, 82,241,166, 46, 94,220, 38, 41, 43,171,186, 90,175,175, 45, 87,169,188, 44, 38, 19,199,209,222, 62,175,102,112,112,182,246, -218,181,140,154, 26,205, 39, 63, 81,154,253, 87, 29,235,178,188,200,223, 40,162,245,106,175,195, 63,205,117,120, 37, 60, 60,156, -148,225,204,108,138,102,241,249,252, 63, 52, 83, 85,128,128, 16,130,136,136, 8,184,186,186,194,203,203, 11, 34,209, 31, 39, 31, -204,201,201,193,111,191,253,134, 39, 79,158,160, 81,163, 70, 0,138,158,168,203, 67, 36, 18,125,186,124,249,114, 39,131,193,128, -123,247,238,161,105,211,166, 16,137, 68, 16, 8, 4,127, 48,129,217,217,217,168, 95,191, 62,102,206,156, 41, 91,186,116,233,167, -168, 96,142, 58, 30,143, 55,101,252,248,241, 30, 37, 17,172,148,148, 20, 52,105,210,228,229,231,238,238,238,184,127,255, 62,154, - 54,109,138,106,213,170, 97,240,224,193, 30,187,118,237,154, 2,224,187,242, 52,133, 66, 33, 39, 52, 52,180, 89,113,196, 8, 28, - 14, 39,198,209,209,209,221,211,211, 83,226,232,232,248,167,109,220,190,125,187,156,195,225,152, 42,219,161, 28, 14, 7,153,153, -153,104,208,160, 1, 20, 10, 5, 0,160,176,176, 16,181,107,215,134, 82,169,124,105, 90,125,124,124,160,213, 86,156,250,213,168, - 81,163,133, 33, 33, 33,221, 59,118,236, 40,226,243,249,120,240,224, 1,194,194,194,176,127,255,126,248,251,251,195,222,222, 30, -177,177,177, 8, 13, 13,197,213,171, 87,225,238,238,142,250,245,235,139,154, 52,105,114, 61, 63, 63,255,114, 98, 98,226,194, 10, -202,201,145, 74,165,184,122,245, 42,182,109,219,134,132,132, 4,164,167,167,195,193,193, 1,141, 27, 55, 70,189,122,245,208,186, -117,107,196,198,198,130, 84, 82,153, 8, 33, 94, 65, 65, 65, 39,238,220,185,227, 70, 41,197,174, 93,187,160, 86,171, 97, 48, 24, -192,225,112, 96,103,103, 7,103,103,103,116,238,220, 25,238,238,238, 8, 10, 10,194,129, 3, 7,220,222,121,231,157, 83,197, 17, -169,204,202,246,171,179,179,243, 39, 11, 22, 44,240,243,240,240, 64, 98, 98, 34, 20, 10, 5, 60, 61, 61,209,177, 99, 71,223, 11, - 23, 46,124, 2, 96,245, 63,229, 70, 86,146,248, 78, 8, 33,231,206,110, 29, 24, 84,179, 32,180, 81,176,189,223,145, 19,158,126, -251, 79,100,215, 7,128, 6,117, 61,163, 7,246,182, 79,121, 16,125, 34,229,220,217,163,247,158,196,224,136, 45, 77,219, 10,141, -254,224,249, 11,183,123,134, 53,106, 98, 93,254,237,140,240,201, 31,141, 19,121,120,126,128,172,228,163,184,112, 41,194,127,198, -103,227,221,191, 91,249,211,233,243, 23,110,115, 20, 26,253, 60, 91,202, 91,167,142,255,250, 29, 63,180,118, 83,229, 30,194,243, -167, 66,136, 29, 26, 32, 48,176, 14,148, 74, 37,236,236,236,236, 70,140, 24, 97,153, 61,123,182,198,209,209,209,158, 16,130,203, -151, 47,103, 3,232, 81,153,174,206,195,153, 90,140, 38, 51, 21,114,173,148, 56,104,137, 37, 95,248,232,113, 60,186,119,237,148, -213,182, 69,131,165,179,191, 90, 57, 39,168, 78,152,251,216,113,139,248,139, 23,142,252, 17, 4,237,202,210,121, 18, 75, 47,213, -171, 69,196, 0,194,191,250,122, 33,226,226, 98,157, 39,188, 39, 95,196, 19,137,125, 66, 2,218, 56,252,184,237,114,207,218,181, -107, 84,159, 62,101,240,201, 85,223,175, 10, 47, 29,217,218,177,125,193,175,132,144, 46,244,175, 28,119,231,239, 71,195,209, 39, - 78, 64,157,156,108,202,191,126, 93,215,229,251,239,115,253,122,244, 88,109, 48, 26,221, 74, 46, 21, 28, 66, 64, 74, 82, 39,172, - 86,194,155, 57,147, 67,121, 60,152,156,157,223,155, 5,212,169, 76,243,179,140,140,129, 35,199,141, 11,255,245,204, 25,212,168, - 81,227,229,253,204,201,201, 9, 51,102,204,192,180,105,211, 68,247,239,223,111,126,232,208,161,230,223,173, 88,225, 57, 11, 24, -104, 75, 57,207,221,186,229,252,225, 87, 95,205,109,212,180,169,255,206, 61,123, 68,181,106,213, 2, 0,188,120,241, 34,232,219, -101,203, 2, 26,132,134,102, 45,253,244,211, 29,209,179,103,215, 7,112,189, 34,205,204,107,215, 12,135, 18, 19,199, 93,186,124, -217,169, 65,131, 6, 0,128,103,207,158,121,172, 93,187,118,124,253,193,131, 71,125, 53,105,210,188,222, 58,157,220, 49, 39, 71, -212,123,253,122,222,190, 33, 67, 42,213, 44, 41, 39, 0,116, 28, 59,246,211,118,157, 58,213, 27, 56,110,156,139,191,191, 63,145, - 74,165, 48, 26,141, 72, 79, 79,119,142,142,142,174,117, 66,165, 82,254,114,235,214,174,159,138, 39,139,255,139, 40,211,139,252, -157, 34, 89,101,122,138,226,191, 29, 79,158, 60, 73, 1,116, 12, 15, 15,191, 90,114, 3,183, 88, 44, 54,153, 44, 30,143,135,226, -100, 97, 91, 11,132,220,220, 92,228,230,230,190,108, 58,202,206,206,198,165, 75,151, 16, 27, 27, 11, 62,159, 15,129, 64, 0,163, -177,242, 57,104, 37, 18, 73,215,174, 93,187,242,110,221,186,133,192,192, 64,136,197,226,151,229, 42, 89, 4, 2, 1,188,189,189, -161, 84, 42,209,165, 75, 23,254,186,117,235,186, 86,100,180,100, 50, 89,175,161, 67,135, 10, 75, 94,171,213,106,112,185,220,151, -166, 69,173, 86, 35, 63, 63, 31,114,185, 28, 58,157, 14,173, 90,181, 18,158, 56,113,162, 87, 69, 70,171, 52, 26,141, 70,157,157, -157,237,212,174, 93, 59,231, 29, 59,118, 60,107,213,170, 85,240, 31,106,218,149, 43, 58,157, 78,199,231,112, 56, 54,205,163,183, -123,247,238,151,251, 62, 45, 45, 13, 63,254,248,227,203,207, 98, 99, 99,177,110,221,186,151, 83, 1, 84,116,140, 66, 66, 66,222, -217,181,107, 87,211,157, 59,119, 22,112,185, 92, 60,123,246, 12,123,246,236, 1,165, 20,238,238,238,208,104, 52,200,202,202,194, -229,203,151, 97, 54,155, 33,149, 74,225,235,235,107, 55,101,202,148,182,139, 22, 45,226, 3, 40,215,104, 89, 44, 22, 11,151,203, - 69, 64, 64, 0,230,207,159, 15,157, 78, 7,129,160,200, 95, 42,149, 74,200,229,114, 68, 70, 70, 34, 49, 49, 17,149,221,100,236, -236,236, 6,239,220,185,211, 67, 40, 20, 66,171,213, 66,165, 82, 33, 37, 37, 5, 73, 73, 73,186,236,236,108,179,131,131, 3, 39, - 32, 32,128, 35, 18,137, 68,253,251,247, 39, 37,134,179,119,239,222,174,187,118,237, 26, 86,153, 73, 34,132,184,215,173, 91,119, -206,248,241,227,237, 74,215,217,204,204, 76, 12, 28, 56,208,254,247,223,127,159, 77, 8,217, 67, 41,205,249,135,133,188,169, 92, - 94,239,238,189, 11,207, 66,143,156,240,244, 75, 74,181,180,153,241,249, 74, 30, 0,108,222,244, 77,155, 35, 39,210,126, 11,169, -145,149,114,232,151, 58,119,157,156, 30,211,202, 34,130,157, 59,120,247,241,116,117, 26, 58,176,111, 95,186,113,227,234, 38,147, - 63, 26, 39, 10,168, 51, 3, 0,224,203,247, 64, 23,243,215, 68,163,125, 97,183,113,227,234, 38, 3,251, 14,138, 76, 72, 72,220, -212,165,163,207,129, 75, 87, 51,142, 87, 20, 49,244,112,181,243,181, 23, 21,194, 55,176, 30,130,235, 74,112,255,193, 51, 28, 62, -120, 19,117,235,183,132, 94,175,135,217,108,150,244,233,211, 71,179,127,255,126, 93, 76, 76,140, 74,171,213,118,160,148,198, 84, -182,253,169,169,143,173,193, 94, 45,141, 2,177,200,172, 82, 8, 52,179,230, 29, 26,210,164, 69,247,166,206,222,190,124,119,137, -245,248, 59,221,154,239,217,182,101,254,180,121, 11,246,160, 89,243,238,173,158, 60,187, 94, 15,192,195, 50,205,235, 11,122,162, - 65, 16, 49,199, 61,127, 30,158,148,152,152, 90,199,211,203,240, 66, 78, 77,159,204,250,169, 91,187, 14,131, 27,214,170,219, 94, -248,228,241, 85, 50,127,230,176,189, 95, 45, 95, 53,162,196,108, 93, 60,191,183,195,123,239,221, 20, 2,208, 51,127, 85,252,116, - 46, 18, 85,147, 6,252, 31,123, 87, 29, 94,197,241,118,207,236, 94,191,113,247,132, 32, 73, 32, 4,183,226, 20, 39, 80,164, 88, - 11, 5, 74,209,210, 2,133,226,210, 82,193, 74,129, 22,135,182,184, 59,193, 41, 65,138,123, 18, 32, 16, 36, 16,119,189,190,187, -243,253, 17,249,133, 52,114, 19,168,241,237,121,158,251,220,187,123,119,207,206,236,204,238,156,121,231,157,119,124, 36,207, 54, -110,212, 86,235,209, 35, 29, 0, 12, 70,163,227,179,231,207,109,212,106, 53, 40,165, 48,153, 76,175,248, 16, 23,248, 13, 7, 5, - 4,184,152,195,249,108,246,236,186, 83,166, 76, 65, 66, 66, 2, 56,142,131, 84, 42, 45,254,206, 70,110,110, 46,134, 14, 29,138, -159, 23, 47,110,102, 14, 39,207,243,100,244,188,121, 51,167,206,156, 89,125,212,168, 81, 76,209,119,175,189,189, 61,246,236,221, - 43, 95,185,114,165,231,140,159,127, 30,250,161, 66,241,164, 60,206,148, 26, 53, 96,159,152,168, 42, 16, 89, 0, 16, 16, 16,128, - 53,107,214, 40,134, 15, 31, 46,239,209,163,199,146,219,245,234, 45, 95,218,178,229, 99, 7,127,127,107,185, 66,225,105,238,253, - 4,128,108,157, 46,104,233,242,229,118, 87,175, 94, 69, 98, 98, 34, 18, 18, 18, 10,158,101, 52,110,220,152, 12, 30, 60,216,166, -170,151, 87,147,191,184,184,255,164, 69,254, 67, 22,173,145, 37,188, 83,255,231,163,149,159, 33,146,159, 65, 82,164,113,124, 69, -176,148, 39,180, 42,131,140,140, 12,100,100,100, 96,195,134, 13,144,201,100,133,141, 47, 0, 24, 12, 6,115, 68, 75, 29,119,119, -119,100,102,102,194,223,223,255, 21, 75,150, 76, 38,131, 68, 34,129, 76, 38,131, 66,161,128, 94,175,135,183,183, 55, 52, 26, 77, -157,178, 56,181, 90,109,125,123,123,251,194, 6, 86,175,215, 23,138,172,130,244, 26, 12, 6,164,167,167, 35, 39, 39, 7,217,217, -217,200,205,205,109, 96, 78,126, 5, 65, 64, 88, 88, 88, 84, 64, 64, 64,125,150,101, 97,105,105,105,145,155,155, 91,232, 91,148, -150,150,134, 77,155, 54,229,126,244,209, 71,142,135, 14, 29,210,152, 81,184,248,236,179,207,160, 80, 40,160,209,104,176,122,245, -106,124,254,249,231,144,201,100,200,206,206,198,154, 53,107,240,197, 23, 95, 64, 34,145,192, 96, 48, 96,249,242,229,165, 91, 54, - 34, 34,158, 93,185,114,165, 65,195,134, 13,237,246,239,223,159,220,177, 99, 71,167,206,157, 59, 67,165, 82, 65,171,213,194,100, - 50,161, 89,179,102,168, 89,179, 38,146,146,146,112,236,216,177, 20, 63, 63, 63,199,171, 87,175, 10, 9, 9, 9,209,229, 53,226, - 69, 44,134,224,121, 30,137,137,137,200,200,200, 64,114,114, 50,226,226,226, 16, 19, 19, 3,137, 68,130,242, 58,243, 14, 14, 14, -239, 7, 5, 5,177, 0,160, 82,169, 80,191,126,125,204,156, 57,147,211,106,181,253, 1, 28,203, 63,172,235,250,245,235,247, 95, -188,120, 81,226,238,238,142, 7, 15, 30,192,201,201, 73,162, 84, 42,203, 21, 90,174,174,174,191, 29, 62,124,216,190, 64, 92, 23, -220,103,141, 38,175, 56,250,244,233, 99,191,121,243,230,223, 0,116,123,219, 26, 53, 91, 21,100,245,131,172, 51,119, 30, 73,170, - 61,249,203, 37,146,154, 65,121,157,215,145,163, 32,249, 97,241,164,218,131,122, 90,135,216,170,178,100,229,241,116,237,224,181, -242,189,247, 58, 50, 31, 12,236,254, 72, 38,179,173,182,118,221,215,206,206, 46,195,139,152, 56,173,225,224,104,141,106, 62,114, -178, 39,228,190,243,180,233,223,232,183,110,254,241,201,246, 29, 71,186,200,165,167, 58, 1, 24, 83, 26,119,100, 84,198, 33,141, - 94, 89, 43, 43,245, 46,177,119,105,129,250,245, 2,224,236,148,142,245,191,237,132,111,213,198,208,235,245,176,182,182, 86,243, - 60,111,100, 89,118,171, 57, 34, 11, 0,206,156,201, 16,106,215,206, 48,176,217, 2,247,233,231, 63,244,238,216,245,189,192,119, -223,237, 32,156, 60,117,210,216,162,129, 49,190,107,231,250,137,199, 79,173,124, 20, 31,247,212,175,118,157,150,136, 8, 63,219, - 5, 32, 97, 64,201, 21, 54,236, 17, 61, 94,189, 58, 57,187,115,231, 72, 65, 43,220, 82,125,251,221,189,174,193,193, 67,130, 90, -183,106, 45,156, 58,253,187, 65,142,148,251,214, 45,155,199,126,250, 73,215,253,191,108, 93,222,233,248,177,223,106,100,102, 69, - 31,249,237, 55, 42,138,172,162,157, 52,142,115,145, 40, 20, 76,242,217,179, 92,157,225,195,245, 5,207,163, 90,173,198,193,131, - 7, 33,151,203, 11, 63, 50,153,172,240,183,139,139, 75,193,228, 43,179, 56, 1, 32, 62, 62, 30, 9, 9, 9,176,177,177,129,147, -147, 19, 18, 18, 18,112,233,210, 37, 68, 70, 70, 66, 42,149,162, 75,151, 46, 96, 74,241,109, 46,206,217,111,242,228,142,181,234, -212,241, 46, 46,178, 0,192,104, 52, 34, 45, 45, 13, 61,123,246,100,142, 29, 59,230,122,252,197,139,247,102, 3, 91,203,226,108, - 16, 28,156,154,184,103, 79,137,215,110,216,176, 33,249,227,143, 63, 20, 93, 58,119,158, 56,233,187,239, 86,254,188,121,243, 75, -158,227, 92, 43,146,119,134, 97, 24, 66, 8,188,188,188,144,150,150,134,156,156,188, 17,108, 75, 75, 75,216,217,217,193,100, 50, - 65,160, 84,250, 87,150,117,105, 90,228, 63,210, 81, 93, 87, 32,184,138, 71,134,151,228,143,139, 22,188, 40,218, 22,109, 88, 4, - 65, 48, 75,100, 73,165,210,114,125,174,204,177,114, 21,135, 57, 66,171, 32,173, 74,165,178,240, 65, 43, 42,176, 10,210,201, 48, - 12, 88,150,133, 57, 22,121, 65, 16,216,236,236,108,236,221,187, 23,109,218,180, 41, 28,150,202,204,204, 68, 70, 70, 6, 50, 51, - 51,161,211,233,240,236,217, 51,156, 57,115, 6, 53,106,212, 0,204, 12,254,250,228,201,147, 27,190,190,190,141, 10, 26,241,118, -237,218,121,110,220,184, 49,174, 91,183,110,238,148, 82,204,154, 53, 43,165, 89,179,102,142, 69, 27,249,242,192,178, 44, 46, 93, -186,132, 26, 53,106,128, 82, 10,153, 76,134,135, 15, 31,194,217,217, 25,130, 32, 64, 34,145, 32, 57, 57, 25, 86, 86,101,199, 72, - 12, 11, 11, 27,246,241,199, 31,199,217,216,216,212, 77, 77, 77,141, 87, 40, 20,173,206,159, 63,239,101, 52, 26, 97,109,109, 13, -107,107,107, 28, 61,122, 20,182,182,182,152, 48, 97,194, 11,173, 86,123,201,194,194,194, 69,171,213,222, 77, 72, 72,152, 85,145, -242,230, 56, 14,185,185,185, 72, 79, 79, 71, 90, 90, 26,178,178,178,160,211,233,202, 77, 99, 73,104,213,170, 21,142, 28, 57,194, -206,159, 63,255,151, 39, 79,242, 58,134,213,170, 85,195,132, 9, 19, 88, 15, 15, 15, 60,123,246, 12, 55,110,220,128,209,104, 4, -165,180,204,135, 87, 42,149,182,155, 52,105, 82, 75,111,111,111, 98, 52, 26, 33, 8, 2,244,122, 61, 10,126,191,120,241, 2,181, -106,213, 98,124,124,124,222, 33,132,180, 51,103, 98,133,136, 60, 36,190, 56, 0, 15,169, 51,192, 88,131,106, 15, 32, 53,165,114, -203, 70, 38, 37, 37,125, 55,101,246, 31,195,127, 94,100,116,137,137, 7, 2,130,122,193, 47,176, 61,134, 13,230, 48,127,241, 94, -120,251, 4, 32, 58, 58, 26,237,218,181,147,197,197,197,125, 12, 96,178,185,220,167, 78, 93,225, 79, 30, 61,214,183,223,128, 33, -141, 58,116,232,198,157, 56,113, 20, 97,119, 79,132,127, 60,224,253, 36, 42,228, 16,123, 91,213,173,135, 15,174,251,213,173,223, - 22, 6,142,111, 5,124,181, 8, 64,169, 47,149,168, 40,106,248,250,235,175,153,144, 3,191, 13,254, 96,208,208,122,237,219,119, - 50,157, 56,117, 24, 55, 46,159,186,179,100,209,136,115,243,151,239,106,215,177,203,251,181,157, 92, 46, 29, 13,242,215,127,226, -229, 96, 19, 37,214,148,146, 33, 81, 42, 5,228,191, 23, 25, 66, 64, 41,125, 69,100, 21, 23, 90, 12,195,148,107, 0, 40,202, 89, -180, 45, 42,232, 80,175, 93,187, 22, 10,133, 2,114,185, 28, 82,169,180, 92,247,139,162,156,225,207,158,189,187,105,235, 86, 69, - 73, 34, 43, 53, 53, 21,169,169,169,200,201,201,193,192,129, 3,101, 95, 95,191,222,176, 60, 78,111, 55, 55,189,133, 74,149, 24, - 17, 17,225, 30, 24, 24,248, 74,122,179,178,178,160, 82,169,176,117,219, 54, 89,247,224,224,177,237,143, 30, 93, 2, 32,163,162, -121, 39,132,192,217,217, 25,118,118,118, 32,132,128,227, 56, 36, 36, 36, 32, 60, 60, 28,215,175, 95, 7, 75, 8,247, 87,150,113, - 73, 90,228,191,102,213, 42, 46,178,138, 90,180, 72,105,214, 23,115,133, 22,203,178,149,182,106,149, 6,115,134, 14,213,106,245, -189,184,184,184, 22, 30, 30, 30,224, 56,174, 80,104, 21, 31, 58, 44,176,126,220,190,125, 27,106,181,250, 94,121,156,148,210,119, -154, 52,105,130,125,251,246,225,236,217,179,120,250,244, 41, 52, 26, 13,244,122, 61,180, 90, 45,194,195,195, 33, 8, 2,130,130, -130, 96, 97, 97, 81, 46, 39, 0,228,230,230,198, 75,165,210, 0,149, 74, 85,184,207,205,205, 13,169,169,169,130,201,100,194,166, - 77,155,178, 92, 93, 93, 45, 84, 42,149,217,194,149, 16,130,164,164, 36,120,122,122, 22,250,104,101,103,103,195,217,217,185, 64, - 88, 64,175,215,195,202,202,170,220,161, 67, 74,169, 14,192,164, 34,220,141,251,245,235,183,125,231,206,157, 85, 79,159, 62,141, -171, 87,175,194,201,201, 9,223,127,255,253,211,231,207,159,127, 64, 41,189,254, 23, 84,212,114,143, 73, 77, 77,221,123,239,222, -189,119,154, 52,105, 82,248,150,104,215,174, 29,105,215,174,157, 99, 81, 83,127,114,114, 50,174, 93,187,134,211,167, 79,131, 16, -130, 71,143, 30,241, 90,173,118,123, 25,215,150,249,248,248,108,156, 57,115,166, 37,199,113,133,117, 91,165, 82, 65,169, 84, 66, - 38,147,129,101, 89, 60,127,254, 28, 61,123,246,180, 89,177, 98,197,111,132,144,234,148, 82, 35,222, 18,100,104, 97,188, 29,150, -101, 19, 84,203, 37,124,221,218,249, 45, 70,142, 66,193,208, 33, 23, 84,203, 57,252,118, 88,162, 77, 35,103, 24,109,229,101,243, - 28, 59,253,242, 83,131,233, 88,143, 99,199, 67,251,127, 57,113,130,180, 90,181, 90, 73,167,127,191,233,221,158,251,134, 56, 56, - 90, 35, 53, 37, 11,207, 95, 36,226, 73,180,129, 86,171, 86, 43,233,198,181,123,138,197, 75,151,249,229,106,116,187,126, 63, 23, -127,184,156, 78,153,142, 16,210,107,201, 79,138,115, 67, 62,110, 44, 87,169,220,145,150,114, 15,222,222, 78,232,217,189, 46,126, -221,124, 9, 54, 54,246,112,113,113, 1,195, 48, 22,230,230, 61, 37, 37,133,236,221,113, 97,248, 71, 67, 71, 52,235,220, 41,152, - 59,126, 34, 68,114,246,228,161, 75,191,173,155,177,159,178,185,106, 66,179, 85, 85,124, 93,239, 70, 61,190,253,193,187, 29, 6, - 66, 37,179,170, 1,212, 44,177,194, 22, 78, 48,160,120,193, 48, 80,126, 52,116,100,243,206,157,223,227, 78,156, 56,128, 19, 71, - 55, 95,153, 59,183,202,209,167,177,219,100,151,175,199, 40,123,245, 29,147,126,228,216,125,195,251, 61,124, 35,221, 45,234,107, - 33,226,213,142,164, 68,146,200,233,245, 94,158,157, 59,179,154,232,104,169,165,139, 11, 7, 0, 38,147,169, 92,161, 5, 64, 48, -135,211,220,180,104, 52, 26, 8, 0,103, 14,103, 66, 82, 82,149,252, 78,120, 33, 76, 38, 83,161,200, 74, 77, 77, 69, 70, 70, 6, - 44, 44, 44,144,172,215,187,152,195,217,169,105,211, 77, 95,127,245,213,228, 61,123,247,202,138,138,172,130,143, 84, 42,197,194, - 69,139,100,159,127,249,229,152,177, 18,201,248,138,220,207,130, 78, 59,203,178,144, 72, 36,136,142,142,198,139, 23, 47, 16, 29, - 29,141,232,232,104,168, 84, 42,208, 82,238,231, 27,180,104,145,255,106, 61, 45, 24, 58, 44, 58,132,104, 86,120,135,138, 56,195, -155, 43, 12,120,158,127,163, 66, 43, 55, 55,247,244,153, 51,103,154,246,234,213, 75,114,229,202, 21,184,186,186, 22, 10,173,130, -239,130,225, 40,181, 90,141,253,251,247, 27,115,115,115, 79,151,243, 48,157, 57,122,244,104,163, 57,115,230, 72,135, 13, 27,134, -136,136, 8,140, 26, 53, 10, 25, 25, 25,200,202,202, 66,106,106, 42, 52, 26, 13,154, 54,109, 10,165, 82,137,187,119,239,154, 52, - 26,205,153,114, 26, 7,154,148,148,148,227,228,228,228, 86,252,191,190,125,251,186,172, 90,181, 74,243,224,193, 3, 83,139, 22, - 45,172,205, 21, 28, 5,216,177, 99, 71,161,165, 46, 50, 50, 18,171, 86,173, 42,244,201,186,121,243, 38,126,248,225,135,194,216, -103, 21,180, 50, 94,175, 93,187, 54,103, 50,153, 80,163, 70, 13,120,120,120, 64,167,211, 97,217,178,101,220, 95, 33,178,204,133, - 78,167,219, 51,100,200,144,169,183,110,221,114,147, 72, 36,121, 38,237,252,252, 25,141, 70, 60,126,252, 24,225,225,225,120,240, -224, 1,210,210,210, 10, 59, 2,183,111,223, 78, 55,153, 76,187, 74,227,117,114,114,154,245,235,175,191,186,170,213,234, 87,234, -115,129, 53,180,192, 74,154,156,156, 12, 91, 91, 91,180,111,223,222,249,204,153, 51,179, 0,204,121, 27, 26, 52, 66, 8,121,183, - 13,219,248,243, 79,123,161, 79,119,245,203,125, 71, 98,255,248, 97,241,164,124,103,120,231,240, 62,221, 61, 94,222,121,104,139, -190,189, 15, 52,254,253, 28,137, 41,203,151, 46,223,199,234, 96,211,166,246,103,247, 29, 58,244,219,244, 41, 19,111, 78,158, 52, -194, 73,163,141, 82, 86,243,145, 19, 0,120, 18,109,160,119, 35, 4,221, 15, 75, 38,222,156,191,104, 5,147,152,154, 49,234,234, -213,210,195, 27, 20, 21, 47,181,253,161,172, 86,179, 77,156,159,127, 75,223, 43,151,182,194, 82,173, 69, 64,205,198,232,220,233, - 29,156, 13,189,141,132,100, 29,226,227,227,161,215,235,203, 12,151,240,224,238,254,193,148, 80,111, 66,201, 11,194, 80,229,224, - 33,159,180, 10, 14,126,143, 30, 57,114,136, 59,176,127,235,197, 93, 91,126,218,195,200,164, 18,173,193,198, 64,136, 46, 19, 76, - 88, 68, 78,110, 94,135, 70,170,144,149,110,126,205, 15,236, 26, 88,187,166,235,224, 33,163,108,186,117,237, 73,143, 30, 61, 32, -236,218,185,233,236,174, 13,117,182, 10, 76,150, 44,254,165, 70,145,153,101,202,164, 68,110,155,147, 37,104, 18,159, 84,215,185, - 7,247,125,107, 68,251, 27,235,112,235,245, 49, 57, 47, 95,186,217,183,105,163,120,252,213, 87,106,151,166, 77,117, 36,223,135, -184, 44,161,197,178, 44,192, 48,130, 57,156,230,166, 69,171,213, 66, 0, 76,149,225,228, 56,238, 21,145, 85, 32,180, 10,236, 26, -230,112,174,155, 59,247,138,119,231,206,105,161,161,161, 46,109,219,182, 37,217,217,217,200,206,206,126, 69,108,185,187,187,147, -192,160, 32,245,142,179,103,171,205, 49,243,126,154,147,119,134, 97,254,114,161,245, 95, 70, 73,150,172, 87, 44, 90,165,161,192, -162,101,142,208, 50,211,162,101, 50,153, 76,112,118,118, 70, 74, 74, 74,169, 13, 63,195, 48, 80,169, 84, 5, 99,196,101,206,188, -211,235,245,203, 38, 79,158, 60,174,107,215,174,142, 1, 1, 1, 72, 78, 78,134,139,139, 11,148, 74,101,161,239, 88, 1,223,205, -155, 55,241,235,175,191,102,233,245,250,101,229,112, 46, 93,180,104,209,167,125,250,244,177,119,117,117,133,157,157, 29,238,222, -189, 11, 59, 59, 59,100,101,101,225,225,195,135,176,178,178, 42,244,219, 57,116,232, 80,182, 94,175, 95, 90,142,120,163,231,207, -159, 55, 90, 89, 89,221, 77, 78, 78,102,211,210,210, 36,233,233,233,146,172,172, 44,105,102,102,166,244,248,241,227,142, 54, 54, - 54,154,223,127,255, 61,217,219,219,155,125,250,244, 41,107, 50,153, 24, 51, 26, 71,140, 31, 63, 30, 50,153, 12,122,189, 30,203, -150, 45,195,228,201,147, 11,125,178, 22, 45, 90,132,153, 51,103, 22, 10,231,245,235,215, 87,180,242,192,104, 52,194,100, 50,193, -100, 50,153, 37,126, 95, 7,230, 8,118, 74,105, 2, 33,164,123,147, 38, 77, 78,238,222,189,219, 33, 63, 38, 25, 18, 19, 19,145, -152,152,136,228,228,100,228,228,228,128,227, 56,120,120,120, 32, 49, 49, 17, 7, 14, 28,200,204,206,206,238, 92,214,140, 67,150, -101,135,180,106,213, 74, 82, 60, 13, 5,189,188, 2,241,174, 80, 40, 16, 23, 23,135,118,237,218,201, 67, 67, 67,135,252,215,133, - 86,129,128,169,229, 7, 89,167,206,195,101,181,106, 55, 55,220, 9, 63,242,178,166,111,226,203, 65, 61,173, 67, 0,224,118, 88, -162,205,157,135,182,168, 85,187, 59,237,212,217,174, 81, 98,194,186, 58,129,254,196, 88,214,114, 61, 0, 96,163, 86,244,235,216, -161,105,156,149,133, 5,243,195,146,245,199, 86,175, 94,218,112, 79,200,255,194, 59,252,176, 36, 47,188, 67,199, 14, 77,133, 7, -247, 31,244, 3,176,193, 92,241,210,189,123,143, 91,191,110,252, 21, 15,194,127,119,159, 58,190,174, 60, 45,209, 4,149,165, 23, - 26,213,119,193,186,141,247,112,231,206,157, 4,131,193,208,174,204,186, 68,168,119,120, 68,152,127,157,218,129,174,131,135,140, -180,238,222,189, 39,142, 28, 57,136, 45,155, 54,156,127,127, 96,159, 95, 98,211,179, 88,103,169, 90,166,166,130,156,149,217, 72, -100, 10, 85,146,193,144, 55, 7, 66, 42, 85, 90, 3,253,132, 50, 70, 14, 49,122,228, 32,155,119, 59,244, 68,200,209,131,216,178, -105,221,185,217,181,251,110,240,109, 80,139, 52,109,184,120,140,111, 85, 95,159,220,156,196, 44,134,200,141, 58,157, 96,181,120, -211,243, 31,159,204, 28,242,228, 86, 88,191, 37,226,172,195, 87,112,119, 75,183,110, 77, 62,143,138,146, 57,181,108,169,138, 59, -123, 86,157,191, 18, 73,153, 66, 75, 34,145,128,150, 62,212,245, 10, 39,217,188,153, 1, 80,230, 36, 44,153, 76, 6,141, 70, 3, - 19, 96, 52,135,211,237,196,137,151, 81, 81, 81,126,246,246,246,175,136,172,180,180,180,194,223, 58,157, 14, 26,141, 6, 42,149, - 42,220, 28,206,196,243,231,117, 11,198,143,159,243,193,192,129, 63,157, 62,115, 70,233,224,224,128,204,204,204, 87,132,150,193, - 96,192,187,237,219,203, 22,221,186, 53, 24,192, 92,115,238,167, 75,187,118,229,250, 3,179, 44, 11,225, 47, 30, 58,124, 11, 58, -171, 35, 75, 18, 94, 76,121, 67, 56,230,206, 58, 44,169,129, 36,132,116, 40,182,107,102,163, 70,141,116,145,145,145,240,246,246, - 46, 20, 43, 69,175,105,109,109, 13, 91, 91, 91,220,188,121, 19,223,125,247,157, 22,192,204,178, 56, 41,165,217, 26,141,102, 64, -199,142, 29,181, 18,137, 4, 53,107,214, 44,140,159, 37, 8, 2,228,114, 57, 44, 44, 44,112,235,214, 45,244,232,209, 67,163,209, -104, 6, 20,143,161, 85, 2,103,166, 70,163,249,176, 83,167, 78,154,136,136, 8,180,106,213, 10,119,238,220, 65, 78, 78, 14,114, -114,114,240,236,217, 51, 4, 6, 6, 66,163,209, 96,213,170, 85, 90,141, 70,243, 33,165, 52,179, 44,206,236,236,236, 30,147, 39, - 79,102,183,111,223,238,235,225,225, 81,187,113,227,198, 1,237,219,183,175,222,187,119,111,159,110,221,186,185,249,249,249,233, - 58,119,238,236,212,181,107, 87, 39,141, 70, 35,253,227,143, 63,226, 77, 38, 83,215,114,238,103,161, 56,137,140,140, 44, 28, 42, -148, 72, 36, 72, 73, 73, 41,140,220, 95,240, 82, 42, 73, 8,151,198, 89, 84,108, 23, 8,172, 2,193, 85, 94, 27, 80, 10,103,185, - 13,135, 92, 46, 47,176,120,210,242, 56, 41,165,183,239,223,191,223,177, 77,155, 54,183,135, 15, 31,158,157,144,144, 0, 43, 43, - 43, 84,171, 86, 13,254,254,254,112,116,116,132,209,104,196,254,253,251,115, 15, 28, 56,112, 47, 51, 51,179, 93,241, 24, 90,197, - 57, 25,134,121, 86,210, 75,182,192,154, 85, 32,180,148, 74, 37, 60, 60, 60, 10,238,237,179,138,220,207, 74, 62,188,127, 45,103, -190,128,105,255,110,231,170,221,130,123,217,236, 63,120, 73,254,211,202, 3,247, 26,117,192,122,135, 42, 89,135, 28,170,100, 29, -106,212, 1,235,127, 90,121,224,222,254,131,151,228,221,130,123,217,180,127,183,115,213,136,240, 7, 1,175,172,123, 88, 66, 58, -149, 74,101,243, 86, 45, 27,165,135, 94, 60, 39,204, 95,180,130,121,183,221,251,183, 54,252,178,127,255,134, 95,246,239,127,183, -221,251,183,230, 47, 90,193,132, 94, 60, 39,180,106,217, 40, 93,169, 84, 54, 55, 39,239,163, 71, 14,178, 9,238,214, 19, 71,142, -236,231,246,236, 88,181,104,231,222, 71,109, 62, 25,119, 62, 49, 50,242, 14, 77,138, 57, 1, 41, 19,141,251,247,239,103, 26, 12, -134,118, 37, 57,194,151,196, 57,106,196,160,162, 34,235,130,131,107,171,245,247,239,131, 63,117,234,176,233,204,153, 91,218, 11, -183,147, 50,111, 68,164,164,197, 37,167, 61,205,202, 74, 53, 8, 2, 15,158,231,217,175,191,206,115,216, 45,173,140, 90,180,104, -139,223, 79,111,195,166,141,107, 51, 5, 1,186,190,187,119,243,253,250,125, 69,125,170, 84,241,217,186, 99, 27,233,254, 94, 47, - 27, 10, 8, 61,250,244,180,221,190,115, 59,169, 90,163,106,149,106,213,242, 66,218,252, 39,235,210, 95,192, 57,151,210,244,172, -232,232,115, 55, 87,172,208,187, 12, 24, 96, 47,119,113,177, 6,207,147,130,247,123,105, 31,137, 68,242,138, 5,166, 44, 78, 15, - 71,199,216, 67,135, 14,193,223,223, 31, 30, 30, 30, 40,234, 35, 91, 16,144,219,193,193, 1,123,247,238, 5, 5,110,152,195,217, -192,215,247,230,194, 5, 11, 12,130, 32, 32, 61, 61,253, 79,214,172,244,244,116, 8,130,128,163, 33, 33,134,172,156,156, 77,230, -230,189, 29,203,230,124,208,186,245,252,224,224, 96, 99, 84, 84, 20, 4, 65, 64, 81,203, 86, 82, 82, 18, 44, 45, 45,161,211,235, -189, 8, 33,106,115, 56,147,142, 31,183, 64, 57,239,245,226, 22,173,191,162,220,255,235, 34,171,232,130,210, 69, 69, 87,153, 22, - 45,142,227,224,229,229,245,202,146, 46, 12,195,188,242,169,200,140, 67, 74,233,102, 66,200,137,206,157, 59,207,105,214,172,217, -232, 57,115,230,176, 1, 1, 1,200,204,204,132,157,157, 29,156,157,157,241,240,225, 67, 28, 58,116,136, 79, 73, 73, 89, 3, 96, -158, 57, 83,232, 41,165,103, 9, 33,221,235,214,173,187,115,218,180,105, 54,157, 58,117,146,122,121,121,129, 82,138, 91,183,110, - 97,223,190,125,198, 13, 27, 54,100,229,139,172,179,102,166,245, 36, 33,228,253,174, 93,187,110, 29, 50,100,136, 21,207,243,210, -103,207,158, 65,175,215,195,100, 50,225,197,139, 23,198, 35, 71,142,228,104, 52,154, 65,148,210,147,102,240,221, 36,132, 4,158, - 58,117,106,200, 31,127,252,241,221,240,225,195, 29,218,183,111, 47,227, 56, 14, 23, 47, 94, 76,110,208,160,129,115, 82, 82,146, -113,239,222,189,169, 58,157,110, 38,207,243,102, 45,193, 67, 8, 65, 86, 86, 22, 28, 29, 29,161,215,235, 33, 8, 2, 12, 6, 3, - 44, 45, 45, 11,151, 77,162,148,162, 34,206,245,197,234, 0,107, 52, 26, 49,112,224, 64, 8,130,128,101,203,150,129,227,184, 10, -147,217,216,216,220,184,125,251,118,247,250,245,235, 23,138,151,130, 58,164, 80, 40,224,232,232, 8, 7, 7, 7, 28, 57,114, 4, - 82,169,244,134,153,101,116, 7, 64, 3, 66, 72,243,123,247,238,125, 4,160,190,209,104,244,224,121,158, 48, 12, 19, 79, 41,189, -155,149,149,245,139,185, 75,240, 36, 37, 37,125, 55,116,232,208, 6,219,182,109,179,148, 72,254,247,104, 72, 36, 18, 40, 20, 10, - 20, 4,199,164,148,194, 96, 48, 96,214,172, 89, 89,185,185,185,223,189, 45, 47,138, 70,141,155, 98,221,170,229,150,103,126, 63, -145,124,255, 17,246, 21, 13,225, 96, 43, 7,126, 63, 71, 98, 18, 19,214,213,137,123,249,210,178, 81,227,166,102,113,154, 12,198, -212, 15, 7,125,225,157,191, 4,207,172,103,207,158,175,221,186,249,199, 39, 0,176,120,233, 50,191,196,212,140, 81, 15,238, 63, -232,183,118,237,142,230, 38,131, 49,213, 28,206,255,137,151,173,153,160,208, 81, 74,175, 18, 66,124,123, 12, 56, 62,179, 70, 85, -235,247,146, 82,181,177, 57, 57,154,207, 40,165, 79,204,205,123,203, 22,109,240,251,201,237,216,178,105,107, 22, 21, 88,157,163, -163, 35, 5,128,251,247, 29,233,253,251, 25,244,127,126,197,182,185, 82,122,103,222, 23,159,181,255, 34, 51, 43,109,233,210,149, -101, 7,174,173, 91,175, 25,234,214,107,134,113,159,205,176, 9,172, 93,211, 27, 0,118,239,166,124,144, 31, 57, 60,103,246, 87, -239,205,155,247, 21,178,178,245,152, 55, 47,111,185,158,135, 97, 17, 33, 81, 81,212, 32, 54, 91,175, 98, 14,199, 93,197, 23, 95, -248,105,210,210,156, 90, 78,157,234, 40,249,242, 75,166, 44,103,248,162,207,175, 57,156,215,239,222, 13, 25,245,201, 39,177,115, -231,204,233,188,102,237, 90, 85,157, 58,117,144,144,144,128,154, 53,107,194,195,195, 3,167, 78,157,194,222, 93,187,114, 51,178, -179,103, 2, 88,109, 14,231,230,163, 71, 31, 6,212,174,157,178,118,237, 90,247,224,224, 96,146,155,155,139,204,204, 76,100,102, -102, 66,175,215, 35, 63, 32, 52,141,124,244,232,190,201,100, 90, 99,110,222,249,228,100,229,188,166, 77, 99,100,130,176,240,253, - 62,125, 38,207,251,230, 27, 69,213,170, 85,137, 94,175, 47,180,106, 25,141, 70, 88, 90, 90, 26, 13, 6,131, 3, 0,141, 57,156, -138, 13, 27,184,228,228,100, 56, 57, 57, 21,134,107, 42, 26,151, 48, 59, 59, 27,148, 82, 49,152,110,101, 68, 88,105,109,185,189, -189,253, 13,137, 68,226, 89,212,186, 85,210,218,121, 69,247,153, 76,166,152,228,228,228, 70, 69, 21, 47,165,244,116, 41, 2,161, - 26,128,239,223,125,247,221,247, 39, 77,154, 68, 66, 67, 67,113,224,192, 1,250,228,201,147, 61, 0,102,150,246,146, 44,135,211, - 74,161, 80, 76,176,176,176,232, 80, 16,194, 65,173, 86,223,203,205,205, 61,173,215,235,151,149, 22, 13,190, 28, 78,107,133, 66, - 49,222,194,194,162, 99,118,118,118,125, 0,176,178,178,186,157,155,155,123, 74,175,215, 47, 47,109,161,234,114, 56, 85, 54, 54, - 54,223, 57, 58, 58,126,248,229,151, 95, 58,156, 63,127, 62,254,247,223,127,151,101,100,100,108, 51, 24, 12,165, 46, 42, 93, 18, -167,131,131,195, 13,150,101, 61,255,138, 50, 2,128,122,245,234, 29,233,209,163, 71,240,160, 65,131, 96, 50,153,176,122,245,106, -156, 58,117, 42,228,209,163, 71,221,203,234,141, 22,231, 36,132, 56,122,122,122,134,142, 30, 61,218,103,224,192,129,106, 59, 59, - 59, 72, 36, 18,228,230,230,226,241,227,199,184,117,235, 22, 61,120,240, 96,206,205,155, 55, 99, 52, 26, 77, 91, 74,105,138,185, -247,243,117,122,205,197, 57,165, 82,105, 27, 47, 47,175, 29,115,231,206,181,234,216,177,163,202,193,193, 1, 44,203,194,100, 50, - 33, 62, 62, 30, 97, 97, 97, 56,113,226, 68,238,158, 61,123,114, 83, 83, 83, 7, 82, 74,207,253, 19,233,124,147,156,129,254,100, -118,177,133,162, 75,141,246, 94,214,177,230,164,179,125, 91,247,158,253,222,239,218, 5, 0,118,239, 61,118,252, 76,104,220,193, -202,166,179,188,180,154,195, 89,203,143,157, 27, 30, 17,246, 74, 64,203,218,129, 65,145,181,234,244,249,214, 28,174,130,200,240, -197,243, 94, 36,218,126, 81,155,238, 43,195,172, 5, 11, 79,207,152, 57, 29,223,127, 55, 31, 7,119,239, 15,137,136,162, 71,254, -203,117,233,175,228, 44, 88, 4, 89,237,230,214,122,153, 32, 76,191, 19, 22,102, 89,180,195, 86, 96,121, 46,218,169,116,119,119, - 79,138,139,139,115, 49,135,179,251,207, 63, 27, 53, 22, 22,138,233, 11, 23,182,201,209,233,218,204,155, 55, 79,114,253,250,117, -172, 90,177,130,211,197,196,108, 77, 6,198,151, 52, 26, 82, 22,167,207,248,241,202, 41,171, 86, 13,171, 86,163,134,243, 71, 31, -125, 36,149, 74,165,200,205,205,197,203,151, 47,113,242,196, 9, 67,196,253,251, 17, 89, 89, 89,239, 81, 74,227,204,229,236,254, -243,207, 70,219,106,213,160,118,114,162,103,206,158,181, 25, 53, 97,194,232, 42,190,190, 54,157,187,116,145, 90, 91, 91, 35, 61, - 61, 29,207,158, 61,195,254,253,251,147,114,114,114,220, 41,165,188, 57,156, 91,255,248,163,238,209,115,231,250,126,251,237,183, -242,160,160, 32,216,216,216, 32, 59, 59, 27, 97, 97, 97, 56,119,238,156,126,205,154, 53,153,153,153,153,163, 57,142, 59,244, 87, -149,251,219, 58,116, 72,254, 74, 87, 0,115, 10,130, 16,210, 8,192,236,252,205,111,204, 88, 51,240,173,121,249, 16, 66,188,237, -237,237,215,233,116, 58,170,213,106, 71, 81, 74, 95,252,219,210, 73, 8,145, 52,106,212,104, 85, 82, 82, 82,115, 74, 41,108,108, -108, 46,133,135,135,143,165,148,114, 21,229, 36,132,176, 0,154, 91, 90, 90, 54,181,178,178,106,163,215,235,107,229, 15,191,221, -207,205,205, 61,103, 52, 26,175, 2,184, 68, 41,229,255,201,188,231,167,179,163,187,187,251, 39,130, 32,212, 32,132,216,242, 60, - 15,147,201,148, 33, 8,194,227,204,204,204, 13, 0, 78,253,211,233,124, 83,156,181,107,144,222,148, 65,173,210, 4,193, 43,194, -166,152,128, 32, 2,238,135, 63,166,251, 43, 80,231,153,174, 29,188, 86, 2,121, 51, 19,203, 91,202,232, 21,161,101,134,120,169, -176,200,172, 33, 25, 74, 9,245,126,181,247, 73, 94,212,172,219,123,203,235, 8, 45,115, 81, 59,128,180, 1, 69,115,129,226,234, -253, 71,244,247,183,245, 93,247, 38, 57,231, 19, 98,191,194,206,238, 18, 35,145,184, 2, 96,242,173, 47,130, 64, 8, 79, 9,225, -138, 14,111, 21,237, 88,150,199,105, 4,234, 72, 21, 10, 47,158,227, 92, 18, 0,203,163, 60,223, 80, 71,105,142, 39, 48,251, 22, -165, 15, 43,147, 78, 35, 80,135, 85, 40,188,143, 82,218, 51,217,194,162,110,146, 86,235, 4,128, 90, 90, 88,220,207,202,205,221, -164,211,233, 86,150,176,120,123,185,156, 50,133,194,147,231, 56, 23, 0, 96, 36,146,164,157,122,189, 87,140,181,245, 71, 58,189, -222,199,210,210,210,100, 48, 24,178,116, 58,221, 32,147,201,116,166, 34,121,127,204,113,129,127, 48, 76, 43,163,133,133,131,145, - 16, 11, 3,199, 25, 13, 70,227, 75,157, 78,119, 15,192,143,148,210,168,191,178,220,223, 90, 20,204, 78,251, 43, 62, 0, 58,136, -156, 34,167,200, 41,114,138,156, 34,167,200,249,215,115, 2, 80, 3,240, 6,192,254, 23,243,254, 54,125, 0,140, 44,248, 45, 17, -165,166, 8, 17, 34, 68,136, 16,241, 86, 24, 78, 52, 40,193, 39, 75,196, 63, 11, 2,160, 67, 41, 5,102,182, 73,176, 50,179, 15, -204, 24, 98, 16, 57, 69, 78,145, 83,228, 20, 57, 69, 78,145,243, 45,227, 44,143,251,191, 56, 36, 89,214, 90,135,226,208,161,200, - 41,114,138,156, 34,167,200, 41,114,138,156,226,208,225, 95,244, 97, 32,162, 52,117,234, 66, 8,113,121,211,199,138,120,187,235, - 66, 9,231,122, 16, 66, 60, 42,120,188,155,120,215, 69,136, 16, 33,226,237,192,223, 46,180,204,109,180, 94,179,113,123, 45,225, - 67, 8,153, 79, 8,226,242, 62,100,254,155, 58,214,140,235,186, 59, 57, 57,125, 94,187,118,237,173,174,174,174,227, 8, 33,206, - 21, 60,223,207,194,194, 98,185,165,165,101,168,165,165,101,168,133,133,197,114, 66,136,223, 27, 42, 55, 66, 8, 25,165, 84, 42, -207,186,187,187,199, 42, 20,138,179,132,144,209,164,146, 11, 92, 18, 66, 2, 8, 33,243, 8, 33,223, 16, 66,234, 86,228, 92,151, -160, 94,187,156,131,122,221,117, 14,234, 21,230, 88,231, 61, 63,231,160, 94, 97,206, 65,189,238,186, 4,245,218,245, 23,212,215, - 74,151,111,254,185, 47,242, 62,229,159, 75, 8,249,145, 0, 47, 9, 65,204,235,214, 37, 17, 34, 68,136, 16,241,239, 64,133,156, -225, 61, 60, 60,222,167,148,142, 2, 64, 9, 33,235, 98, 99, 99,247, 86,162,225,153,146,255,123, 17,165,116,250,235, 28,103,198, -185, 75, 41,165,147, 43, 46,210, 48, 69, 16, 40, 3, 0, 12, 67,166,186,184,184,168, 89,150,253,147,131, 33,207,243,106, 66, 48, - 78, 16, 40,201, 63,118, 10, 33,100, 57,165, 52,177, 50,226,112,240,224,193, 75,151, 47, 95,174, 84,171,213,136,142,142,238, 52, -122,244,232, 22,132,144, 47, 40,165,241,229,157,175, 82,169, 62,104,210,180,249, 23, 11, 23, 47,177,116,113,118,182,224,120,193, -248, 44,250,185,122,214,180,201, 77, 85, 42,213,242,178, 22, 83, 46, 46,168, 0,140,148, 72, 36,253,149, 74,101,117,157, 78, 23, -197,113,220, 30,150,101, 59,127,247,221,119, 65,221,186,117, 83,102,101,101,201, 57,142,171,177,101,203,150, 47,126,253,245,215, -174,132,144,158,101, 77,211, 47,176,232, 80, 74, 99,139,236,238, 27, 29, 29,221, 72, 38,147,145,106,213,170, 49, 0,238,150,115, -124, 33, 40,224, 23,126,113,119, 29, 0,168,221,178, 95,100,248,197,221,200,255,253, 23,116, 10, 94,173, 11, 74,165,114,141, 78, -167,123, 81,240,127,126, 58, 19,205, 57,151, 16,242, 83,254,242, 65,141, 0,124,148,127,232,102, 74,233, 13, 66,136,171, 82,161, -152,160,213,233, 8, 0,242, 58,117, 73,132, 8, 17, 34, 68,252,237, 70,164, 6,148,210, 91,249, 35, 18,193, 0, 66, 10,218,238, -138,206, 58,252,244,209,163, 71,150, 0,224,239,239, 63, 22,192,222, 10, 36,226, 79, 13, 79,251,246,237, 27,168, 84,170, 87,162, - 32,107,181, 90, 57, 33,104, 95, 25,241, 82,112, 13,131, 65,207, 72,165,114, 48, 12,249,162,110,221,186, 85, 82, 82, 82,206, 51, - 12,179, 53, 38, 38, 38,189, 18, 55, 15,235,215,175,247,119,115,115,251, 83,180,230,248,248,120,121,207,158,239, 85,136,111, 24, - 33, 10,189, 66,209, 84, 70,136, 27,207,113,182, 0, 32,145, 72,210, 3,108,108, 26,125,255,237,183,106, 66,136,144,154,154, 10, -173, 86,139,137, 19, 39,170, 34, 34, 34,122, 1, 88, 89, 78, 26,253,155,189,211, 98,226,137, 19,199,107,101,165,165,235,214, 47, - 93,123, 83, 43,145,105,124, 3,107,202, 86,173,219,100, 55,114,216,160,207, 8, 33,183, 75, 90,142,164, 24, 15, 3, 96,255,132, - 9, 19,106,119,239,222, 93,158,157,157,173,212,106,181, 85,182,110,221, 58,171, 81,163, 70,150,245,235,215,151,239,216,177,131, -100,102,102,130, 82,170,174, 89,179, 38,237,223,191,191,110,231,206,157,227, 0,252, 84,158,240,101, 89,118, 89, 64, 64,192,220, -252, 60,203,138, 28, 35, 13, 12, 12,180, 0,128,135, 15, 31,126, 77, 8, 38,148, 37,178, 9,240,168,118,203,126, 0, 65,141,240, -139,187,149,181, 91,245,211,129,226, 49, 1, 30,229,119, 8,230, 1, 69,226, 66,189,138,251,177,177,177,149, 90,155, 48, 56,184, - 59, 33,132,236,113,119,119,223,155,148,148,228, 75, 8, 70,152,219, 25, 32,132, 16, 7, 7,135,161, 0,230, 3,248,228,254,253, -251, 13, 0,160, 86,173, 90, 50, 0, 55,172,173,173, 91, 24, 13, 6, 34,190,174, 68,136, 16, 33,226, 63,137, 6, 0,110, 1, 8, - 46,178, 4,207,186,202, 8, 45, 57, 0,156, 63,127, 30, 0, 20,149, 17,125, 69, 5,204,248,241,227,225,230,230, 86, 92,188, 32, - 52,244,236,235,100,246,149,107,124,243,205, 55,150, 25, 25, 25, 29,126,249,229,151,214, 30, 30, 30, 63,196,198,198, 94, 41,235, -100, 74,105, 34, 33,100, 81,190, 5, 2, 10,133, 50,114,244,232,209,183,242,255,174,114,248,240, 97,117,143, 30, 61, 52, 0,158, - 3,128, 66,161,244, 96, 89,198, 63,207,233, 13,139,202, 18,132,253, 8,169, 38,151,203,223, 29,245,243,207, 92,195, 30, 61, 36, - 22, 78, 78, 4, 0,158, 63,120,224,176,104,241,226, 22,233, 79,158,200,181, 14, 14,169,169,185,185,218,200,200, 72, 40, 20, 10, -194,178,108,195,242, 50,108, 97, 97,241,249,183,223, 47,180,200, 74,203,208,234,178,178, 13, 44,103,210, 91,169,212,124, 98, 66, - 82,170,165,202, 66, 51,117,246, 87,242, 79, 71, 12,249, 28,192,216,114,168,198,125,241,197, 23,181,154, 52,105,226,177,107,215, - 46,146,153,153, 9,137, 68, 98, 89,191,126,125, 52,106,212,136,255,253,247,223,137,175,175, 47,130,130,130,112,241,226, 69, 92, -186,116,137, 52,104,208, 64,189,111,223,190,193, 37, 9,173,226,226,154,101,153,137, 53,107,214,172,111, 97, 97, 97,240,247,247, -199,136, 17, 35, 64, 41, 69,135, 14, 29,130, 44, 45, 45,247,230,230,230,202, 31, 62,124,208,186, 60,145,157, 24,118,160, 63, 0, - 56, 7,245,186, 11,160, 14, 40, 30, 39,133, 29,168, 91,228,144, 90, 15, 31, 62,108,150,158,158, 94,232,140, 88,176,128,121,235, -214,173,205,174, 72, 5,117,161, 71,143,238, 83, 1, 66, 58,116,232,144, 49,110,220, 56,230,193,131, 7, 31,246,238,221, 43,232, -209,163,199, 40, 45,157,197,234, 17, 25, 58,116, 88,162,165,165,101, 31,119,119,247,135, 0, 36, 50, 89,161,206,100, 93, 92, 92, -156,234,214,173, 59,198,222,222, 62,137,101, 24,103, 10, 74,203,171, 75, 34, 68,136, 16, 33,226, 95,133,144,124,113, 21, 82,252, - 15, 9, 0,132,132,132,208,255,245,218,131, 73, 89, 13,207,157, 59,119,188, 52, 26, 13,204,105, 4,138, 78,209,164,148, 38,178, - 44,187,138, 97,200, 88, 66, 8,130,130,234, 60, 93,182,108, 89, 73,107,122, 25,130,130,234, 60,101, 89,166, 42,165, 20,132, 48, -171, 5,129, 79, 44,137,179,180,134, 81, 46, 87, 76, 1, 0, 87, 87,183, 39,199,142, 29, 51,244,237,219, 23,139, 23, 47,150, 77, -155, 54,109,178,143,143,207,184,232,232,232,132,210,210,153,191, 61,221,197,197, 69,189,126,253,122,255,209,163, 71,223,138,139, -139,155, 14, 0,238,238,238,243, 1, 4, 2,120, 94,100, 31,214,172,217, 25, 59, 98,196,136,200,196,196,196,233,165,113,190, 79, - 72,117,159,154, 53,223,157,119,254, 60,101,244,122,146,114,225, 66, 86,114, 98,162, 41, 42, 57, 89,189,241,198,141,238,179,230, -207,151,122,121,123, 35,244,208, 33,199, 20,141, 38, 57, 83,175,215, 37, 38, 38, 82,142,227, 46,153,145,247,218,206, 78,206,234, -181, 63,174,190,110, 37,101, 5,103, 79, 15, 34,181,183,151, 48,106,107, 57, 43, 97,244, 85,171,248,201, 1,212, 46,175,140,100, - 50,217,224, 78,157, 58,169,119,238,220, 73,130,130,130, 96,107,107,139, 11, 23, 46,224,246,237,219, 72, 79, 79,103, 76, 38, 19, - 26, 55,110,140,133, 11, 23,194,219,219, 27, 25, 25, 25,120,241,226,133,163, 92, 46,119, 42,227,126,190, 82,159,166, 76,153, 2, - 55, 55, 55,112, 28,135,180,180, 52,112, 28, 7, 75, 75, 75, 0, 64, 76, 76, 12, 14, 29, 58, 88,110, 93, 50, 83, 36,225,157,119, -222,201, 38,132,220, 47,110,209,170, 8,167,135,135,199,142,228,228,148,174,239,190,251, 46,210,211,211, 77, 95,125,245, 21,234, -214,173, 11,127,127,127,115,234,252,116,133, 66,241,139,143,143,207,143,227,199,143,119,179,183,183,135, 94,175,159,149,144,144, -128, 49, 99,198, 0, 0,186,117,235, 86, 87, 42,149, 30, 27, 62,124, 56,124,125,125, 99,211,210,210, 94,220,188,121,115, 68,110, -110,110, 88,101,243,110,230,253, 17, 57, 69, 78,145, 83,228,252, 87,113,154,171, 69,254,141,200, 31, 38, 92, 87,100,123,221, 43, - 66, 43, 56, 56,152,132,132,132, 80, 51, 50,150,234,233,233,233,165, 82,169, 0, 32,181,162, 9,225,121,126,156,163,163, 99,210, -244,233,211, 91,250,251,251, 27,198,141, 27, 23,246,236,217,179,153, 69,143,241,245,245,253,110,197,138, 21,136,140,140,124, 62, -127,254,252,139, 41, 41, 41,223, 84, 48,179,211, 8, 33,203,242,173, 99, 41,135, 14, 29,170,123,254,252,249,177, 75,151, 46,117, -250,244,211, 79,101,159,127,254,249, 32, 0,139,203,227, 97, 89, 86, 83,210,112, 97, 73,112,115,115, 51,148,228,195, 85,128, 30, -132,168,172,229,242,118,243,206,159,167,134,231,207, 53,191, 46, 89, 98,181,246,218,181,185, 38, 74, 93,156,157,157,209,170, 69, -139, 28, 37,203,166, 36, 37, 36, 8,206,213,171,179,207,142, 29,115,212,202,229,113, 59,119,238,204, 76, 77, 77, 61, 80,174, 9, -143,144, 44,129, 82,131,165,167,183,169,111,175,142, 65,215,175,222,126, 96,229,236,200, 52,168, 31, 84,247, 65,228,243,155, 16, - 4, 35, 33, 36,171, 60, 30, 27, 27, 27,255,212,212, 84,100,101,101,193,201,201, 9,203,150, 45,131,171,171, 43, 52, 26, 13,194, -195,195,169,167,167, 39, 57,127,254, 60, 60, 61, 61,145,156,156, 12,131,193,128,236,236,236, 36,189, 94,175, 45, 77,248, 74, 36, -146,223, 24,134, 12, 35,132,160,106,213,106,209, 43, 87,174, 52, 8,130,128, 90,181,106,161,119,239,222,216,183,111, 31,194,195, -195, 11, 44, 79, 6, 31,159, 42,209, 12, 67,124,242,181, 82,165,173, 58, 5, 75,251,196,198,198,246,169,148, 89,148, 16,198,221, -221,125,144,159,159,223,216, 15, 62,248,192, 36,151,203,145,155,155, 91,112, 47, 76, 93,187,118,203,232,209,163,187, 77, 72, 72, - 72,153,233,212,235,245, 79, 92, 92, 92, 62,249,226,139, 47,182,174, 89,179,198,110,230,204,153, 16, 4, 1,148, 82,112, 28, 87, -184,232,183, 32, 8,216,191,127, 63,162,162,162,190, 43, 42,178, 68,136, 16, 33,226,255, 11, 42,160, 69,254,117, 40,226,155,133, -226, 98,235,111,143, 12,207,178,236,218,147, 39, 79,214,111,221,186,181,164,125,251,246, 65,158,158,158, 65, 49, 49, 49, 97, 0, -224,233,233, 25,212,165, 75,151, 32,103,103,103, 44, 95,190, 92,195,178,236,218, 74, 42,203,162,141,222, 45, 55, 55,183, 31,246, -237,219,183,104,212,168, 81,112,117,117, 13,252,187,243,108,173, 80, 52, 24,190,108, 25, 39, 53,153,152,159,127,248,193,122,201, -217,179,139,118,237,222, 45,121,231,157,119, 8,165, 20,247,238,222, 85, 45,252,233, 39,245,192, 94,189,158, 63,124,242,132, 59, -120,226,132, 41, 49, 54, 54, 45, 54, 57,121, 14,165, 52,173, 60,126,147,201,116,249,209,163, 71,238,173,218,188,227,113,238, 90, -216,237,190,189,186,189, 43,149, 48,228,241,243,152, 27,110,174,142, 54,161,103, 79,107, 77, 38,211,229,242,120,114,115,115,159, -113, 28,103, 79, 41,117, 10, 13, 13,133,147,147, 19,210,211,211, 97, 50,153, 96, 48, 24, 12, 26,141, 70,153,154,154, 10,157, 78, - 7,189, 94, 15,107,107,107,220,187,119, 47,145,227,184,223, 75,227,228, 56,110,184, 82,169,252, 70, 42,149,202,101, 50, 89,220, -141, 27, 55,144,149,149, 85,197,214,214,118, 49,199,113,136,139,139,195,249,243,231,191,180,182,182,126, 14, 0, 74,165, 18,114, -185,194, 65,175,215,115,165, 57,195,155,107,209,170, 44,220,220,220,188,171, 86,173, 58,111,234,212, 41,181,234,213,171,143,228, -228,100, 8,130, 0, 11, 11, 11,104, 52, 26, 88, 91, 91,163,121,243,230,207,230,205,155, 23, 79, 41, 70,150, 39, 6, 19, 19, 19, -147, 61, 60, 60,198,141, 26, 53,234, 27,127,127,255,170,148, 82,248,249,249,161, 83,167, 78, 56,118,236, 24, 34, 35, 35,145,155, -155,203, 95,185,114,101,123, 92, 92,220, 97,241,117, 43, 66,132, 8, 17,255, 61,157, 88,224,155, 85,212,154,245,143, 8,173,196, -196,196,100, 79, 79,207,227, 55,111,222,236,222,191,127,127,132,134,134, 14, 5,240, 5, 0, 40, 20,138,161,253,251,247,199,205, -155, 55,241,224,193,131,227,137,137,137,201,111,226,154,114,185, 92,103, 48,228, 25,167,148, 74,165,178,130,167, 87,201, 31, 50, - 4,128, 42,101,236, 43, 21,140, 68,226, 86,167, 75, 23, 73,250,237,219, 89,235,175, 94,253,102,235,214,173,146,150, 45, 91, 18, -147,209, 8, 94, 16, 80,173, 90, 53,210,190, 67, 7,139,223,182,110,181,231,115,115,207,127, 59,117,234,133,117,195,135,231, 68, - 82,250,220,156, 4,234,245,250,159,198,142,249,164,195,217,208, 11, 30,129, 53,171,219, 31, 63,121,246,150,131,131,141,218,191, - 70, 13,139,212,244, 52,126,230,180, 47, 37,122,189,254,231,242,120,180, 90,237,254,211,167, 79,247,242,242,242,114, 10, 11, 11, -131,193, 96, 0,207,243,104,223,190, 61, 40,165, 10, 0,130, 68, 34,193,131, 7, 15, 96, 52, 26,147, 30, 61,122, 20,247,248,241, - 99, 5,128, 5,101,241,234,116,186,232,162,219, 94, 94, 94, 29,131,131,131,193,113, 28,186,116,233,130,131, 7, 15,118,140,136, -136, 88, 82, 84,243,189,110,153,231, 91,200,106,121,120,120,236,203,223,101,150, 19,188,167,167,103,144,159,159,223,154, 5, 11, - 22,200, 60, 61, 61, 65, 41,133,157,157, 45, 52, 26, 13, 82, 82, 82, 17, 24, 24, 8, 47, 47, 47, 44, 88,176, 0, 0,182,155,107, -113,139,141,141,125, 12,160,127, 96, 96,160, 44, 35, 35,163, 81,199,142, 29,151,119,232,208, 1,183,110,221,194,133, 11, 23, 6, - 42, 20,138, 36,163,209,200,185,185,185,141, 36,132, 88, 27,141,198,109, 41, 41, 41,241,226,187, 75,132, 8, 17, 34,254, 19, 40, -240,209, 42,140, 18, 95, 97,139, 86, 96, 96,160, 69,102,102,230, 71, 85,170, 84,145, 3,128, 74,165, 10,172, 94,189,250,228,168, -168,168,236,138,166, 70,163,209,236,218,186,117,107,167, 31,127,252, 81,214,173, 91,183,234,158,158,158, 77, 0,160, 79,159, 62, -213,173,172,172,176,117,235, 86,163, 70,163,121, 99, 49,145, 76, 38, 83,235,198,141, 27, 35, 45, 45, 13,207,159, 63,175,208,176, -204,225,195,135,213,200,243,203, 42,115, 95, 89,224, 12, 6, 59, 91, 15, 15, 38,246,236, 89, 99, 90, 86,150, 91,235, 54,109,136, -201,104, 4,195, 48, 72, 77, 77,197,139, 23, 47, 96, 99,107, 75, 30, 60,122,100,185, 97,202,148,195, 85,234,213,147,243, 6,131, - 67, 5, 68, 69, 46, 33,100,216,103,227, 62,221,191,109,219,118,167,140,172,172, 40,149, 74,173, 87, 40,100,174,227, 63,251,140, - 79, 75, 75, 27, 66, 41,205, 49,131,106,193,182,109,219,186,116,233,210,229,174,183,183,183,115,114,114,178,107, 70, 70, 6,159, -150,150,198, 34,207,215,138, 0,192,217,179,103,145,149,149,197,241, 60,127, 30,192, 60, 74,169,193,220,180, 86,169, 82,197,166, -105,211,166,109,157,156,156,144,153,153, 9, 7, 7, 7,212,175, 95,191,109,149, 42, 85,126,121,254,252,121,230,155,172,245,167, - 78,157,178,162,148, 54,163,148,162, 75,151, 46,102,157,195,243,252,199,193,193,193, 50, 66, 8,180, 90, 13,148, 74, 21, 44, 44, - 44, 97,101,101, 13,127,255, 0,196,197,197,161,115,231,206,134,168,168,168, 85,241,241,241, 21,174,163,153,153,153, 61,155, 55, -111, 62,105,204,152, 49,224, 56, 14, 61,123,246,196,203,151, 47,151, 60,123,246,108,167,187,187,251,160,143, 63,254,216,201,193, -193, 1,147, 38, 77, 82, 1,248, 90,124,119,137, 16, 33, 66,196,191, 31,197,125,180, 74,180,104,149, 53, 38,234,230,230,214,202, -222,222,126,150, 86,171,149, 23, 12,201, 16, 66,228, 78, 78, 78, 7,221,221,221,231,199,197,197, 85,200, 41, 46, 61, 61, 61,203, -205,205,237,224,229,203,151,251,245,233,211, 7,167, 78,157, 26,146, 47,180,112,249,242,101, 60,125,250,244, 96,122,122,122,214, -155,200,188,167,167,103,215,182,109,219,246,105,220,184, 49,142, 28, 57, 2,158,231, 47, 85,228,252,162, 51, 12, 81,194,172,195, -130,125,102,145,177, 44, 8, 33,224, 56, 14, 0,144,146,156,140,200,135, 15,145,150,158, 14,189, 78,135, 92,141,134,247,247,245, -213,102, 26, 12, 82, 2,208, 10, 22,114,180,165,165,229, 11, 77,110,174,179,131,157,189, 86,173, 86, 32, 35, 43, 83,118,227,250, -149, 28, 74,105,148,153, 28, 6, 66, 72,155, 99,199,142,205, 97, 89,182,191,165,165, 37,198,142, 29,203,182,109,219, 22, 50,153, - 12,122,189, 30, 25, 25, 25,216,186,117,107, 50,199,113, 85,243,235,129,165,133,133,197, 38,150,101, 99,178,178,178,102,149,119, - 13,131,193,208,173,123,247,238, 18,131,193,128,111,191,253, 22,115,231,206, 69,151, 46, 93, 36,215,175, 95,239, 6, 96,219,155, -170,244,130, 32,160, 99,199,142, 69,157,225,239,155,115,158, 84, 42, 13,170, 81,163, 6,146,147,147,145,156,156, 12, 39, 39, 39, -184,187,187,195,213,213, 21, 75,150, 44,161,203,151, 47, 63,110, 52, 26, 87, 37, 39, 39, 39, 86,162, 46,142, 28, 58,116,232,200, -126,253,250, 33, 39, 39, 7,151, 47, 95, 70,139, 22, 45,176,104,209, 34,183,243,231,207,127,209,184,113, 99, 72,165, 82,132,134, -134,130,227,184,151,226,171, 75,132, 8, 17,255,223,240, 95,244,207, 42, 15,101, 90,180,188,189,189,109,121,158,255,178, 71,143, - 30, 29,123,245,234,133,206,157, 59,191,242,255,182,109,219,172,246,238,221, 59,223,203,203,171,139,209,104, 92, 80,145,161, 62, - 65, 16,246,111,219,182,173,219, 59,239,188,163,110,215,174, 93, 53, 0, 80, 40, 20,134,109,219,182,105, 4, 65,216, 95,209,140, - 20, 15, 30,233,225,225, 81, 87, 34,145,244,233,222,189,123,221, 97,195,134, 33, 60, 60, 28, 91,183,110,125,236,239,239,127,177, -130,212,207,203,153,117, 56,191, 60,235, 22, 43,151,167,102, 36, 36,216, 90,122,123, 75,237,172,172,226,143, 28, 57,226,213,161, - 67, 7,242,242,229, 75,164,167,167, 67,167,211,225,250,245,235,130, 4,136,150,216,217,145,232,203,151, 9, 43,151, 87,120,178, -129,151,155,157,223,236,105,163,171,232,244,186,218,153,153,153,156, 68, 42,149,122,186,218, 86,168,193,166,148,234, 45, 44, 44, - 26, 1,144, 8,130,160,177,183,183, 87,159, 60,121, 18,114,185, 28,132, 16,212,169, 83, 7, 74,165, 82,102, 97, 97,241, 2, 0, - 92, 93, 93,229,107,215,174,181, 25, 52,104,208,133,242,184, 27, 54,108, 40,245,245,245,125,207,223,223, 31,151, 47, 95, 70, 88, - 88, 88,244,229,203,151,125, 26, 52,104, 0,111,111,239,247, 26, 54,108,184,251,230,205,155,166, 55,212,187,168,148, 51, 60,207, -243, 2, 33, 4, 12,195, 64, 16, 4, 36, 39, 39,163,106,213,170, 88,185,114, 37,150, 45, 91,246,109, 92, 92,220,161,202,164, 39, - 48, 48, 80, 86,191,126,253, 33,253,250,245,195,147, 39, 79, 48,127,254,252,148,248,248,248,179, 39, 78,156,120,127,204,152, 49, -108,139, 22, 45,144,154,154,138,223,126,251,141,187,113,227,198,175, 9, 9, 9,155,197, 87,174, 8, 17, 34, 68,188,197, 66,203, -219,219,187,159, 76, 38,155, 52, 96,192, 0, 54, 32, 32, 0,137,137,137,176,182,182, 54, 17, 66,164, 0, 96,107,107,107, 82,169, - 84, 24, 61,122, 52,234,213,171,215,106,202,148, 41, 45, 60, 60, 60, 86,198,198,198,110, 50,231,194,137,137,137, 26, 55, 55,183, - 61, 99,199,142, 93,112,251,246,173,170, 0,112,237,218,181,167,113,113,113,211, 18, 19, 19, 53, 21, 20, 89, 5, 65, 49,137, 74, -165,186,234,231,231,247,172,107,215,174,214,189,122,245,130,147,147, 19,110,222,188,137,133, 11, 23, 62, 50, 24, 12,115, 66, 67, - 67,185,191,251, 38,115,122,125,194,141, 3, 7,172,218,126,248,161,245,248,224,224, 31, 62, 29, 59,246,199,217,179,103, 75, 2, - 2, 2,136, 70,163,193,213,171, 87,233,222,189,123, 77,191,125,243,205, 50, 88, 88, 72, 47,239,221, 43, 55, 24, 12,209, 21,180, -150,180,233,214,165, 77,192, 15, 63,254, 4,157, 54, 7, 87, 47,133, 32, 61, 61, 25,107,215,237, 11,240,244,244,108, 19, 19, 19, -115,174, 2,247,211,255,212,169, 83,206,148, 82,200,229,114,204,155, 55, 15,238,238,238,176,182,182, 70,118,118, 54,190,248,226, - 11,155, 9, 19, 38,216, 0, 64,120,120,120, 97,120,134,242, 16, 23, 23,215,124,244,232,209, 86, 28,199,225,248,241,227, 6, 66, -200,172,211,167, 79,255, 82,167, 78, 29,121,171, 86,173,172, 54,111,222,220, 2, 64,232,155, 18, 90,149, 60,239,241,201,147, 39, - 27,247,239,223,159, 74,165, 82,146,145,145, 1, 91, 91, 91,172, 92,185, 50, 55, 62, 62, 62,164,210,117,128,227,228,106,181, 90, - 78, 41,197,158, 61,123, 16, 29, 29,253,113, 74, 74, 74,130,139,139,203,190, 47,191,252,114,114, 64, 64,128,239,195,135, 15,163, -179,179,179, 23, 37, 38, 38, 62, 19, 95, 77, 34, 68,136, 16,241,223, 65,129, 19,124,133, 34,195,243, 60, 63,250,196,137, 19,172, - 32, 8, 88,183,110, 29,110,220,184, 65,213,106,245, 44,181, 90,189, 66,165, 82,241, 90,173,118,212,136, 17, 35, 6,205,157, 59, -151,105,213,170, 21, 46, 95,190,204, 84,173, 90,117, 8,128, 77, 69, 46,220,161,172, 88, 27,153,153,153,215, 19, 19, 19,170, 22, - 9, 80, 89, 85,161, 80, 94, 47, 39, 51,175,112,150, 16, 20,179,233,188,121,243,114,221,220,220, 12, 97, 97, 97, 88,179,102,141, -112,227,198,141,179,114,185,124,109, 92, 92,156,222, 28,206, 55,116,211, 11, 57,229, 28,119,115,203,228,201,181, 26,246,236, 41, -124, 50,105, 82,142, 76,165,250,252,135,159,126,154,146,145,157,237, 14, 66,168,131,141, 77,244,186,121,243,230,119,121,239,189, -156,240,115,231,148,183, 79,157,146, 58,153, 76,119, 42,146,206,152,152,152,115,126,213,189,177,113,253,143, 48, 26,245,136,143, -205,211,105, 41,169,153, 40, 75,100,149,196,201,113, 92,230,251,239,191, 47, 3,160, 26, 60,120,176, 60, 41, 41, 9,213,171, 87, - 7, 0,100,101,101, 33, 36, 36, 4, 53,107,214, 4, 0,220,187,119,175,240,119,121,233,180,176,176,120,175, 69,139, 22,136,142, -142, 70,120,120,248,153,184,184,184, 84,119,119,247, 51, 47, 95,190,236,214,184,113, 99,236,223,191,191, 71,105, 66,171,162,101, -100,142,208, 42,137, 83,165, 82, 77,219,183,111,223,199,151, 46, 93,234, 63,121,242,100,105,251,246,237, 1, 0,217,217,217, 26, - 74, 41, 95, 25,206,162,105, 50,153, 76, 16, 4, 1,246,246,246,185,249, 29,142,103, 40, 39,144,236, 95, 93, 63, 69, 78,145, 83, -228, 20, 57,255, 13,156,111, 9,204,143, 12, 79, 41,229, 4, 65, 64,104,104, 40,246,237,219,199, 27,141,198,145,113,113,113,247, -138, 28,242,147,187,187,251,169,247,223,127,127,211,195,135, 15,217,136,136, 8,152,211, 16, 21,133, 78,167, 51, 21, 95,146, 88, -167,211,189,246,208,209,198,141, 27,145,144,144, 96,124,249,242,229,105,142,227,246,191,230,236,197,215,158,117,248, 27,165,250, - 15, 9, 57, 61,183,101,203,142,115, 78,157, 82,124, 50, 99,134,126,232,176, 97, 95,242, 6,131,137,149,201, 4,185,133, 5,195, - 43, 20,210,240,115,231,148,203,199,140,177,215,234,245,199,183, 84,192,193,188,136, 69, 11, 67, 63,153, 8,109, 17,139,214,229, -235,145,168,168, 69, 75,167,211,213,206, 23, 29, 47, 0,184,126,244,209, 71, 16, 4, 1, 90,173, 22,217,217,217,136,139,139,203, - 28, 54,108, 24,159, 47,158, 36,125,250,244,177, 54,135,183, 90,181,106,238, 82,169, 20,199,143, 31,135, 84, 42, 13, 1, 0,169, - 84, 26,114,234,212,169,110, 3, 7, 14,132,135,135, 71, 53, 66, 8,161,229,168, 36,151,160, 94,187, 40,224, 7,130, 26,121, 79, - 60,106, 56, 7,245,186, 75,128, 71,249, 81,227,239, 55,104,208, 0, 48,211, 47,171, 40,242, 39,119, 44,115,116,116,220, 61,101, -202,148,177, 77,155, 54,237, 52,119,238, 92, 2,128,125, 35,214, 77,142,123,173,208, 19, 34, 68,136, 16, 33,226,223,107,213, 42, -105,191,164,140, 19,214,181,105,211,102, 36, 0,150, 16,178, 38, 54, 54,246, 94,241, 99,226,226,226, 34, 61, 60, 60, 22,251,250, -250, 22, 46, 52, 93,145, 68,229, 71,114, 95,200, 48,100, 74,222,118,197, 3, 84, 22, 89,234,100, 10, 0,194, 48,236,166, 91,183, -110,205,120,241,226, 69,114, 69,133, 95, 73,120, 19,179, 14, 1, 96, 27,165,207, 6, 18,114, 98, 82, 80, 80,135, 46, 99,198,160, -110,151, 46,214,238, 62, 62,188,214,104, 20,238, 93,188, 72, 46,237,217, 35,187,125,234,148, 84,171,215, 31,223, 71,233,139,138, -166, 51, 38, 38,230, 92,245,106,158, 39,251,246,233,214,169,154,175, 59, 0,224,201,179, 56,164,164,101,158,172,136,200, 42, 38, -184,122,174, 92,185,242,144, 76, 38,147, 20, 93,202,198,104, 52,166, 21,136, 49, 66,136,251,186,117,235,118, 48, 12, 19, 93, 30, - 95, 68, 68,196,193, 57,115,230,244,121,254,252,249,201, 23, 47, 94, 60, 7,128,232,232,232,231,238,238,238,155,226,227,227,251, - 68, 71, 71,239,165,102,168,144, 98,139, 74, 35,252,226,110, 37,128, 58, 5,139, 74, 87,118, 45,195,162,200, 15,173, 48,203,205, -205,109, 91,167, 78,157, 70, 0,136,125, 29, 62,131,193, 96,210,106,181, 28,207,243, 18,163,209, 72, 13, 6,131, 73,124, 45,137, - 16, 33, 66, 68,133,208, 24, 64,193, 74, 36, 5, 6, 20,167, 98,191, 13,200, 95, 46,176,224,245,155,191,157, 12,224,122, 17,142, -162,251,203, 59, 23, 0, 82, 0,220,205,223, 87,146, 22, 89, 87,218,118,169, 66, 43, 54, 54,118, 47,204, 88, 52,218,220,227,202, - 16, 74,211, 9, 33,203, 11, 68,211,235,114,112, 28,247, 70,214,135, 99, 24,230, 89,143, 30, 61, 42,116,124,121,199,236,160, 52, -250,115, 66, 54, 31,249,249,231,250,199,215,172,241,224, 57,206,129, 0,148,149,203, 83, 13, 6,195,115, 39,147,233, 78, 69, 45, - 89,175, 88, 99,158,196,116, 6, 0, 63, 63, 63,250,248,241, 99, 80, 74, 95,107,246, 6,165,244, 14, 0,175,114,142,137, 3,208, -202, 76, 49,184, 29,192,246, 18, 4,251, 14, 0, 59,204,238, 53, 20, 44, 42, 13, 48, 2, 17,250,214,110,217,111, 15, 0,161, 96, - 81,233, 55,137,248,248,248,135,200,143,243,246, 58,120,254,252,185,222,215,215,119,203,194,133, 11, 7,223,190,125,123,103,108, -108,172, 94,124,103,138, 16, 33, 66, 68,197, 68, 22, 33,228, 72,126,219,211, 61,191,179,127,164,248,239,130, 99, 10,142, 43,122, - 76, 1, 71,241,253,101,157, 11, 0,211,166, 77,155, 49,127,254,124, 53, 0,179, 22, 99, 46, 26,184, 84,242,111,184,123,111, 98, -241,220, 55,189, 0,111, 76, 76,204,250,191, 34,175, 63,229, 9,169, 43,127,229,253,124,244,232, 17,121,155,159,182,130, 69,165, -139, 32,232,191,144,238,103,207,158,173,108,219,182,237,218,216,216, 88, 14, 34, 68,136, 16, 33,162, 34,112, 42, 73, 24,149,162, - 7,186,151,245,127, 49, 65,244,167,227, 74,218, 38,132, 28,153, 63,127,126,119,115, 19, 91,212,162,197,136,101, 39, 66,196,223, -135,127, 98,214,171, 8, 17, 34, 68,136, 40, 85, 16,189, 98,197, 42, 16, 95,197,183,167, 77,155, 54, 3,165, 12, 27,230, 31,227, - 70, 8, 25,153, 63,235,240, 21,127, 45, 2,160, 67, 41, 23, 55,123, 54, 1, 33,164, 67, 37, 50,119, 90,228, 20, 57, 69, 78,145, - 83,228, 20, 57, 69,206,255, 95,156,229,113,151,114,126,112,105, 67,125,101, 13, 35, 22,255, 93,222,185,102, 28, 27, 82, 74, 94, - 70, 22, 93,235,240,149, 53, 15, 11,156,156,255,138, 15,128, 14, 34,167,200, 41,114,138,156, 34,167,200, 41,114,138,156,175,249, -105, 76, 41, 13, 70,222,170, 41,148, 82, 26, 76, 41,237, 50,109,218,180,233, 5,251,166, 77,155, 54,157, 82,218,190,224,184,252, - 99, 10,207, 41,216, 87,252,187,248,190,114,142, 45,237,126,140, 44,250,187,232,246,191,194, 71, 75,132, 8, 17, 34, 68,136, 16, - 33,162, 12, 92, 7,208,184,136,181, 41, 25,192,189,249,243,231,167, 23,241,157, 74, 6,112, 7, 64,189,252,227,146,243, 13, 74, - 69,125,171, 12,249,219,134, 18,142, 49,152,115,108, 41, 86,184,117, 37,253, 6, 32, 10,173,210, 80,223,141,253,198,219,211,185, - 81,161,213, 79, 16, 0, 0, 66,126,244,129,194, 48, 4,130, 0, 74, 41,226,146, 50,110,222, 77,164,179, 43,123,189, 0, 15, 98, -239,172, 84, 46, 19, 40,109,153,191,235, 92,102,170,126, 98, 88, 38,205, 48,151,163,150, 43,169,165,100,240,165, 64, 81, 23, 0, - 24,130,187, 58, 1,139,239, 39,208,251,175,123, 63, 8, 33,164,182, 19, 70,202, 85,234, 1, 54,182,118, 53,210,211, 83, 30, 25, -117,250,221, 17,201, 88, 75, 43, 17, 24,170,186, 61,105, 38, 80,204, 0,192, 72, 25, 44,137, 76,165,103,197, 90, 39, 66,132,136, -191, 9,175, 27, 23,175,164,208, 65,175, 59, 9, 73, 12,176,103,158,216, 42,142,107,102, 30,247,143,161, 66, 66,171,182, 51, 25, - 3,130,175, 0, 80, 80,124, 29,158, 68, 87, 87,232,124,119,210, 65,201,178, 27, 0,176, 58, 35, 63,137, 10, 56, 95, 98,163,206, -160,181, 82,198, 46, 1, 32,232,120,126,120,120,156,249,254, 98, 65,158,164,139, 68, 96,182, 8,148, 74,121,129,110, 2,197, 17, - 75, 25,254,184, 28, 67,117, 21, 73,171,183,167,115,163, 3,215,226, 59,157, 93, 61, 30, 77,235, 86, 7,229, 57, 64, 48, 65,221, -234, 75,156, 89,250, 17,154,214,242, 6, 21, 76,128,192,193,178,235, 15,232, 26,100, 83,233,135, 36,192,131,216,251, 56, 58,135, -173, 95,191,193,213,189, 90, 32, 17, 56, 35, 30, 94, 59, 57,104,194,148, 57,239, 6,217,144, 32,115,196, 86, 61,119,242, 73,245, -170, 1, 95, 78,252,234, 71,214,205,221,203, 66, 48,233,185,132,103,247, 27,252,180,104,206,222,122,238,100,201,157, 56,186,193, - 92, 65, 21,232,132, 81, 18,133,188,159, 74,105, 81, 67,163,201,126,204, 27, 77,187,131,220, 37, 93, 22,255,176,172,126,219,142, -221, 44,249,236, 4,198, 36, 32,112,215,206, 29, 62, 63,175, 92,213,141, 16,242, 30,165, 84,168, 72,158, 5,138, 41,145,155, 71, -118,147, 74, 88, 82,235,227,245, 44,204,156, 50, 91, 28,129, 46,228, 3, 66,203, 15, 47, 65, 9, 46, 68, 36,210,237,149,185, 70, - 45, 23,242, 11,161,240, 7,193, 30, 66,177, 35, 60,137, 38,137,239, 59, 17, 34,222, 46, 48, 12,115, 86, 16,132,118,111,146,147, - 16,210,140, 82,122, 69,188,187,255,191, 81, 49,139, 22,193,183,225, 81, 47,237,192, 27, 81,219,191,218, 55, 0, 42, 36,180,148, - 44,187,233,250,163, 68, 87,112, 70,172,255,110,236, 78,131, 9,224, 76, 70,240,156, 9, 60,103, 2,199, 25,193,155, 76,160, 38, - 61,230,252,122, 22, 48,100,163, 81,144,223, 38, 0,110,230, 94, 67, 74,153, 45, 55, 47,158,180, 39,134, 76,108, 95, 61,255,179, -151,201, 57,159,157,190, 27,151, 82,219,133, 76,143, 72,194,111, 21, 17, 4,103,215,140,199,214,253, 33, 49,203,127,201,125, 32, - 80, 10,123,107, 85,192,160,238,225, 94,155, 15,158,125,185,108,147,238, 1, 0,216, 88,200, 3,134,220,125,228,253, 58,133,224, -172, 84, 46, 91,187,234,103, 87, 55, 7, 21,225, 46, 45, 0,199,243,240,242, 9,102,167,143, 27,228,246,237,210, 13, 75, 1, 12, - 45,235,252,154, 46, 36,208,191,122,173, 73,155, 66, 46,121,231,102, 37, 25, 78,110,155, 17, 5, 61, 76,174, 30,181,164,223,204, -255,145,157, 57,117,252, 23, 53, 93,200,213, 7,137, 52,162,156,151, 2, 83,203, 25, 7,231, 47,248,161,238,187, 93,187, 91, 10, - 57,201,172, 46, 55,199,127,253,175, 27,190,170, 89,183,137,186, 85,144,167, 44,105,247,104,162,205, 78,131,145, 81, 42,222,173, -221,193, 90, 59,120,160,105,253,198,173,227, 0,252, 84,161,238, 96,145, 97,107, 65,168,124,239,146, 80,180,186,125,229,236, 40, - 62,238, 58, 40,111, 2,120, 99,225, 55,120, 19,168,144,247,221,116,244,175, 64, 9, 49,188,204,122, 1, 83,116, 58,125,241,186, - 91, 98, 66,124,227,165, 63,124, 63, 61,208,153, 28, 3,143, 45,247,211,112,174,162, 2, 83,132, 8, 17,255, 94, 16, 66, 56, 74, -169,228, 13,115,118,163,148, 30,125, 77,142, 47, 1,124,146,191,185,129, 82,186,248, 13,164,203, 19,128,107,254,102, 2,165, 52, - 70,172, 1,175,117, 63, 71, 22, 29, 50,124,157, 56, 90, 74, 80, 1,216,211, 11, 0, 84, 21, 77, 8, 5,148, 32, 44, 96,202, 69, -207,174, 29,225,232,236, 10,152, 52,128, 81, 3,152,180,128, 41, 23, 48,105,145, 18, 31, 13, 24,115,129, 39,199,192, 81,170,168, -112,142,245,153, 64,228,110,180,111,224, 13, 39, 27, 37,198,247, 12,116, 92,119, 60,114,195,134,147, 15, 59, 0, 24, 96, 86, 90, - 41, 69,211, 58, 53,176,124, 67,238,131, 67, 55,147, 58, 3, 64,112,125,199,227, 77, 3,125,188,150,109,210, 61, 8,185,155,214, - 5, 0,186, 6,217, 28,107, 18,224,230, 45,188,134,213, 87,160,180,149,123,149, 26,132,191,189, 22, 66, 86, 12,178,178,180,136, -121,182, 25,118, 30, 13, 25, 94, 64,155,242,206, 87,177,152,246,249,204,133, 82, 77, 86,162, 65, 48, 38,243, 78,108, 58, 43,145, - 11, 4,177,231,244, 57, 66, 6, 63,113,228, 71,220,164,217,223, 77, 3, 48,168, 76,235,144, 51,198, 45, 89,178,172, 78,139, 70, - 53,157, 19,246,142, 39, 57,233,137,224, 88,181,162,231, 59, 45, 96,235, 23, 40, 36,134, 46, 33,242,106, 29, 96,235, 80, 13,177, -151,182,225,249,149,125,164,101,131, 62,138,223,182,203, 6,151, 38,180,252,156, 72,203,206,173,155,236,172,230,237,238, 70,169, - 0, 65,160,160, 2,143,143,251,118,194,244, 93, 79,192,243, 60,222,239,220,178,253,194, 81,239, 82, 65, 16, 64,169,128,151, 9, -169,154,223,175, 62,104, 31,149, 70,175,154, 99,169,170,215,172, 93,203,187, 55,175,212, 52, 69, 30, 70,163, 65,243, 31, 16,224, - 98,145, 58,215,242,214,137,223,106, 2,191, 86,246,225, 33,181,156,193, 63, 63,190, 0,222,173, 71,178,107,183, 31,119,202, 76, -142, 29,178,119,243,170,190,171,215,174,221, 10, 96,180,248,138, 17, 33,226,237, 0,165,244,141,139,173,232,232,232,184,215, 17, - 91,158,158,158,173, 1, 44, 42,240,208, 32,132, 44,242,245,245,157,243,191,142,234, 43,125,189, 76,158,231, 7,197,196,196,156, - 47,139,179,123,247,238,238, 0,124,139,112,250, 18, 66,124, 75, 58,214,214,214,150,111,222,188,249,243, 35, 71,142,196,137, 53, -164,226,130,171, 50, 66,235,193,139,221,227, 27,232,227,115, 0,224,129, 25,149,246,149, 33, 63,157,137, 95,176,241,171,143, 22, -212,174, 98,143,236, 92, 3, 78,222,120, 14,158, 55,129,231,184,124,203, 22, 7,158, 51,161,115, 61, 71, 52,215,141,198, 79, 71, - 30,130,227,133,249,101,113, 22,135,145, 10, 31,212,239,208,127,151, 32, 80,185, 66,202,100,250,123, 57, 56, 79,122,191, 30, 51, -190,103,109,104,141, 92,255, 64, 23,242,123, 68, 34, 93,111, 22,167,240,231,144, 71,180,164,125, 60, 87,110,222,203,176, 70, 53, - 29,216,189,163, 53,213,103,194,148,242, 4,217, 26, 19,158,164,154,144,160,203,128,130,196,155,197, 41, 80,212,245,244,112, 83, -255,177,115,234, 51, 7, 54, 75,226,204,114, 50, 57,195,129, 23, 40, 75, 51, 34,244,246, 53, 59, 74, 11,252,182,202, 74,167, 74, -109,245, 81,235, 78,193, 54, 47,182,141, 36, 42,255,206,112,110,224,133,103,231, 55, 34,233,198, 17,164,198, 61, 39,214,186, 12, -184, 56, 84, 71,215, 65, 3,176,120, 64, 99,100,103,101,131,141,143,178,145, 75, 21,182,165,113, 82, 30,131,150, 44,252,206, 77, -194, 50,121,247,179,224,195,155,160,213,235, 1,158,131, 82, 34,128,208,130,255, 76,224, 77, 70,117,221, 62, 83,199, 2,184, 90, - 94,222, 35, 18,233,246,218,206,164, 21, 4, 83, 77,106,210,130, 0, 23,195,147,104,161,248, 9,116, 33, 31, 52,236, 60,172, 21, - 37,184, 80,153, 50, 10,114, 64,247, 70,190,150, 22, 22, 89, 15, 16,179,231, 51, 68, 65, 73, 93, 90,124,130, 15, 62, 30,167, 94, -183,110, 93, 15, 66,200,152,162, 62,106,127,197, 34,171, 34,167,200,249, 95,229,180,177,177,169, 90,165, 74,149, 57, 38,147,169, -181, 76, 38,115, 49, 26,141, 16, 4, 33, 65, 46,151, 95,120,254,252,249,188,204,204,204,167,255,182,188,223,189,123,215,108,177, -101, 14,167, 84, 42,197,195,135, 15, 31,155, 43,182,138,115, 74,165,210, 45, 23, 47, 94,196,174, 93,187, 0, 0,145,145,145,240, -243,243,179, 40,233,220,103,207,158, 89,180,109,219,118, 11,138,173,232, 81,156,243,222,189,123, 85, 15, 31, 62,140, 61,123,246, - 0, 0, 30, 62,124, 8,127,127,255, 18,211,115,241,226, 69,246,195, 15, 63,172, 10, 32,238,175, 46,163,183, 65,100, 21,253,126, - 69,104,133,132,132,208,224,224, 96, 82,252,119, 9,120,226,109, 39,111, 0, 29, 15, 0, 79, 42,154,136,136, 4,186,176,158,155, -180,203,153, 61, 43, 91, 43,101, 12,230,174,159,244, 50, 57, 45,187,153,132, 64, 0, 0,142,130,177,179,148, 95,158, 63,164,158, -119,122,142, 14,135,174,197,158, 15, 79,172,152,137, 52, 60,142,158, 2, 96,251,191,134,146,248, 15, 89,124,106,199,142,105, 93, -234, 78,236, 89, 23, 7, 47, 61,159, 8,160,220,168,239, 84, 16, 64, 5,174,208,249, 61,191,235, 0, 8,175, 46, 10, 44,128,230, -237, 19, 42,102,209,106, 75,136, 36,221, 25, 93,237,213,242, 21,163, 70,141,176, 54, 37, 63, 66,154, 65,134,151,233, 58, 36,104, -165,200,145, 56, 35,246,193, 61,158, 33, 56, 85,126,225, 34,139,114, 58, 91, 59,185, 37, 19,212,113,172, 71,214,241, 25,233,114, -194,177,214,189,191,181, 77, 57,243,227,115, 46, 55, 57,151, 16,148,187,182,158,141,141,173,159, 46,245, 57,155,153,158, 2, 91, -215,218,232,210,191, 59,190, 14, 14, 68,118, 86, 46,146,211, 46,211, 26,110,214, 36,250,194, 86,204,236, 90, 11,169,137,241,208, -155, 0,146,171, 79,211, 25,116, 57,165,222, 71, 6,107, 39, 76,158,242,129,143,155,147, 69,193,164, 2, 42,240,168, 87,171, 26, - 58,182,110,138, 83, 23,255,192,245,123,145, 16,242, 39, 21, 80, 65, 64, 76, 82,122,162,206,200,111,172,208, 13,229, 57, 80,147, -174, 68, 33,134, 74, 12, 25,214,113, 33,106, 30,152,221,172,134,213,240,105,221,125,172, 44, 20, 4, 58, 19, 15,157,193,132,236, - 63, 86,192,161, 74, 29,168,149, 74,210, 0, 90, 9, 0,113,221, 66, 17, 34,138,160, 95,191,126,202,196,196,196,208,224,224,224, -192,142, 29, 59,170, 91,181,106,133,220,220, 92,156, 60,121, 18,185,185,185, 62, 94, 94, 94, 62, 39, 79,158,236,211,172, 89,179, - 8, 79, 79,207,182,187,119,239,174,136, 15,173, 4,255,115,102, 23, 0,112,132, 16,228,239, 35, 0,132,215, 89,231, 86, 46,151, - 35, 58, 58,250,141, 91,182, 98, 99, 99, 31, 87,198,178,149,147,147, 35,243,240,240,128,147,147, 19,120,158, 71,110,110, 46, 14, - 28, 56,128,204,204, 76, 8,130, 0,149, 74,133,111,151,172,199,131, 91,161,184,122,245, 42, 50, 51, 51,101,229,113,198,196,196, -144,122,245,234, 65,175,215,131,227, 56,232,116, 58,156, 62,125,186,112, 91, 34,145, 96,202, 55, 75, 17,121, 35, 20,183,111,223, - 70, 76, 76,204,223,178,218, 72, 5,180,200,191,209, 26,186,174,172, 10,251,183,130,231,185,233,235, 54,237,184, 60,125,244, 0, -140, 27,216,193,107,222,202,125, 29, 34,146,233, 38, 0, 8,116, 34, 67, 6,183,171,225,109,171,150,226,235,109, 55, 0, 74,167, -191,238,245,194, 82,105,100,109, 87, 50,113,255,213,232,208, 25, 3, 26,160,154,155,181, 95,245,234, 68, 30, 21,101,198,154,130, - 2, 7, 59, 75, 69, 64,112,125,199,227, 16, 4,216, 90, 41,106,130,231, 96,107,169, 8,232, 26,100,115, 12, 0,108,213,178,154, - 37, 89,190, 74, 67, 99,111,217, 72,181, 66, 50,210,162,161,155,247,208, 30, 29, 85,221,122,244, 81, 89, 74, 57,164, 94, 61,137, - 44,169, 39, 76,246, 62,208,155,210, 16,243, 52,138, 63,115,229,126,108, 74,182,126, 82,185,201,164, 56, 31,251,244,161, 83,213, -186, 29,237, 82,142,204, 76,170, 58,108,155, 47, 3,129,201,222,218, 59,209,194,185,137,234,218,147,167, 57, 2,253,179, 69,167, - 56,178, 50, 51,159,155,120,184,105,121,137, 85,212,217,223, 48,173,107, 29,164,167, 37, 65,103,228,144,169,229,140,174,182, 74, -133,254,105, 24,244, 70, 14, 6,147, 0,169,173, 7, 78, 94,190,151, 34,152, 76,199, 74,227,140, 74,161,183, 1, 88, 22,221, 87, -221,137,212,155,106,173,186, 13,147, 22,209, 49,113,216, 20,114,185, 65,254,113,149,175,228, 2,151, 55,252, 92,196,146, 69, 40, - 90, 85,198, 9,190,150, 11,105,162, 82,202,126, 94, 52,241,195,192,119,252,237, 21, 66,204,101, 16,193, 8, 11, 94, 2,173,156, -135,141, 87, 53, 8,134,108,170,209,233, 50,194, 1, 49,210,187, 8, 17, 69, 80,179,102, 77, 87, 27, 27,155,240,201,147, 39,219, -247,238,221, 27,251,247,239, 71, 86, 86, 22, 54,110,220,136,101,203,150,225,171,175,190,130,201,100,194,186,117,235,212,123,247, -238,109,178,106,213,170, 24, 31, 31,159,218,209,209,209, 9,229,245, 41, 1, 40, 0, 72,243,219, 46, 2, 64, 56,122,244, 40,186, -117,235,134,163, 71,143, 10,249,251,120, 66,136,137, 82, 90,169,245, 68,229,114, 57,228,114, 57, 50, 51, 51,223,136,216,146, 74, -165,176,180,180,132, 92, 46, 71,118,118,118,133,197, 22,199,113,108, 76, 76, 12, 50, 51, 51,209,177, 71, 15, 44,157, 63, 31,237, -218,181, 67,199,142, 29, 65, 41,197,233,211,167,209,161, 69, 16, 6,188,215, 22,247,239,223, 7,199,113,102,165, 55, 33, 33, 1, -137,137,137,232,210,163, 7,214,175, 90,133,166, 77,155, 34, 32, 32, 0, 28,199, 33, 52, 52, 20,125, 59,183,128,178, 87, 7, 68, - 70, 70,138,149,218, 76,107,214,155,242,209,122,109,132, 37,209, 43,129, 78,228,200,192,206, 77,186,247,104, 25,136,245, 59,207, -124, 23, 24, 72,118, 0,128,131,149,226,219,143,218, 85, 67,196,139,116,156,185, 29,119, 36, 34,249,205,204,214, 16,120, 56, 58, - 88,171, 1, 86, 14,173, 81,224,172,159,160, 92, 7,102,129, 82,168, 91, 79,197,224, 30, 17, 94, 77, 3,189,188, 10,102, 29, 90, -118,251, 17, 67,238, 61,246,110, 28,224,234, 13,222, 4,240, 38, 88, 15,216, 6,124, 99, 81,110, 58, 90, 86, 85,156,154, 58,105, - 98,243,174,189,250,171,228,106, 27,240, 89, 47, 97, 74,184,135,212, 71,231,145,171,246, 67, 66,244, 19,236, 58,113, 53,243, 81, - 76,106, 22,195,224,100, 98,166,254,203,168, 52,154, 83, 30,175,206,132,249,115,102, 78, 10,222,181, 99,167,149,162, 90, 75, 18, -181,162, 91,166, 92,194, 41,156,124, 27, 50, 26,165, 35,253,126,227, 78,235, 92, 3, 22,148,199,163,201,205,218,119,250,228,241, - 1, 53,170,182,180,122,118, 61, 4, 90,157, 30,122, 19, 80,187, 73, 91,240, 60,149, 19,134, 8,214, 44, 75,146, 82,211, 65, 76, -124,226,133, 59,207,226, 47,222,121,194,234,173,202,231,126, 69,221, 19,246,243, 30,109,235, 3, 38, 45,222,107, 93, 7, 75,183, -158,249, 12,192,176,215, 43,228, 60,139, 22, 5, 90,214,118, 38,107, 0,180,188,113, 96, 89,205, 70,189, 38,160, 34, 22,173, 32, - 39,210, 53,168,186,251,111, 75,191,157,106,239,224,233,199, 18,193, 4,234, 90, 23,200,138,161, 36,230, 50,108, 60,154,130,119, -111,129,117, 63,253,144, 35, 8,116, 71,101, 66, 91,136, 16,241, 54, 67,167,211,237, 91,184,112,161,125,247,238,221, 11, 44, 50, -184,124,249, 50, 54,108,216, 0, 11,139, 87,223,147,221,186,117, 3,165,212,126,238,220,185,251, 0,188, 83, 26,103,139, 22, 45, -122,252,244,211, 79,113,245,235,215,127,146, 47,182,100, 0,152,176,176, 48,230,229,203,151,196,206,206,142,186,187,187,155,226, -226,226, 4, 0,252,199, 31,127,204, 90, 90, 90,214,200,201,201, 57, 87, 89,161, 37,151,203,223,136,207,150, 84, 42, 5, 33, 4, -114,185, 28, 50,153, 12,148,210, 10,137, 45,158,231, 37, 71,143, 30,197,141, 27, 55,240, 85,253,250,152,232,225, 1,123,123,123, -132,134,134,130, 82, 10, 11, 11, 11,164,165,165, 97,199,142, 29,120,247,221,119,193,113,156,204, 28,222, 61,123,246,224,230,205, -155,248,166, 81, 35, 76,180,177,129,165,165, 37, 78,159,206, 27, 13, 84, 40, 20,136,142,142,198,233,211,167,209,182,109, 91,177, - 82,191, 38,204,174, 60,109, 9,145, 16, 23,184, 26, 13, 90, 80,142, 2, 4,238,129,129, 68, 22, 17, 65,141, 21,189, 40,195, 96, -230, 79,155,142, 4,255, 56,161, 7, 25,217,179,129,251,188,223,206,142, 1,128,225,239,251,123,168, 21, 18, 44, 63, 24, 65, 25, - 6, 51,223, 68, 6, 3, 3,137,140, 97, 48,166, 99,211, 0,196,101, 24, 16, 21,151,241,123, 4,165,102, 13,245,156,249,113, 48, - 54, 31, 10,125,185,108,179,238, 1,165, 20,182,150,138,128, 33,119,163,188,127, 59,122,243,197,146, 93,186, 7, 84,160,176, 85, - 75,107, 14,187,223,162,220, 89,135,141,189,101, 35,167, 79,253,178, 69,207, 97,147,149,220,131,221, 48, 68,157,128, 96,212, 34, -203, 40, 67, 6,235,138,152, 23, 47,240,253,186, 35, 47,179,114, 13, 3,194,146, 42, 38, 48, 35, 83,104, 78,160, 19,233,253,253, -215, 51, 78,205,255,118,174,165,246, 73,104, 14, 75, 56, 45, 91,165,141,228,219,175,126, 36,217,122, 67,255,168, 52,154, 93, 30, -143,222, 10, 11, 22, 46,249, 41,120,196,160, 62, 15,252,253,218, 56,240,113, 79, 29,116, 89, 89, 73,219,142,223,116,205,239, 41, - 18, 0,136,138, 73, 69,114,102, 46,199,115,166,115, 86, 82,204, 11, 55,199, 58,152,143,106, 46,196,169,119,171,186, 31, 58, 89, -201,160,205,201,128,179,149, 20,157,155, 86,255,176,154, 11,153,250, 36,145, 38, 87, 94,104,153, 64, 77, 90, 92, 89,240,110, 77, -202,155,106,130, 55,193,120,119, 75,197, 45, 99, 4, 19,199,181,182,180,182, 51, 60, 99,144,107, 1,168, 28, 65,172,125, 0, 27, - 95, 34,173,213, 31,113, 79,194,185,207, 62, 28,148,250,244,121,204, 47,142, 42, 44, 22, 95, 33, 34, 68,188,138,232,232,232,143, -166, 79,159,126,177,105,211,166, 46,142,142,142,168, 83,167, 14, 14, 29, 58,132,201,147, 39, 23, 30, 83,191,126,125, 80, 74,145, -150,150,134,133, 11, 23, 38,196,197,197,125, 84, 22,103,120,120,248,131,205,155, 55,183, 14, 12, 12, 52,202,100,178, 12, 0,138, -140,140, 12,101, 90, 90, 26,209,233,116, 16, 4, 65,176,177,177,225,227,226,226, 76, 3, 6, 12,208, 95,186,116,169,122,110,110, -110,244,235, 88,180,188,188,188,194, 82, 83, 83, 51, 9, 33,175, 29,250,161, 64,100, 57, 58, 58, 58,229,228,228, 8, 0,210, 43, - 19,250,129,227, 56, 52,106,212, 8, 39,206,223,194,209, 51,151,144, 21,247, 16, 99, 70,124,132, 58,117,234,224,196,137, 19,149, - 46,179,122,245,234,225,248,233,139,184,120,227, 14,162, 35,239,226,179, 49, 35, 80,187,118,109, 28, 63,126, 92,172,208,230, 35, -164,152,111, 86, 72,113,161,213, 54, 36, 36,164,160,103,254, 39,249, 90,203,137,212,115,175, 33,223, 50,183,107,245, 90,210,142, -115, 65,164, 42,236,246, 59,222, 98,230,247, 43, 30,212,113, 33,131,238, 37,150, 63, 59,236, 21,171, 86, 34, 13,175,237, 76,182, -223,185, 95,243,195,247,154,122, 97,253, 33,245,108, 0,232,223,170, 42,174, 61, 74,198,213,200,164,237,225, 73, 52,252,117,115, - 93,199,133,168, 65,177,125,225,231, 61,219,250,120,186, 98,195,254,139, 32, 4,251,204,106,112, 41,165, 77, 3,125,176,108,115, -241, 25,134,174,222, 75,118,233, 30,156, 8,203,234, 10, 0,157,106, 89, 28,107, 92,221,206,187, 60,203,134, 74, 46, 25,213,181, -207, 96, 37, 23,121, 8,120,126, 26,132,211, 67,107, 20, 16,159,146, 13,141,141, 23, 66, 47,223,209,102,234, 12, 19,194,147, 42, -103,197,139, 72,166, 79,234,187,145, 23, 57,185, 90, 55,181, 83,117, 29,203, 8, 66,142,158,226, 90,196,243,172,240,120,250,208, - 28,142,168, 40,106,120,199,147,180, 90,179,105,215, 28,169, 76,222,159, 37, 32,206,182, 22, 78,107,126,252, 6, 86, 86,150, 16, - 12, 57, 64,110, 50,122,127,250,125,242,189, 88, 99, 85, 0,240,119, 36,150,173,171,201, 54, 73, 24, 18,243,251, 99,195,172,114, -205,171, 38,140, 30,212,185,190, 84, 48,228,226,243,133, 59,177,118,106, 79, 12,110, 95, 75, 26,242, 71,228,104, 0,243, 42, 91, -214,148,231, 64, 77, 90,188, 51,227,252, 3, 2, 92,164, 64,203, 27,187,190,173, 9,220, 50,155,163, 33, 33, 82,137, 27,169, 85, -215,219, 66, 38,196,252, 1, 33,230, 15,202,122,181, 0,241,110, 77,136,107, 35,250,243,162,175,114,215,175,223,112, 82, 96,240, -117,121,161, 50, 68,136,248,255, 10, 74,233, 19, 91, 91,219, 46,221,186,117, 59,115,226,196, 9,251,160,160, 32, 0,192,141, 27, - 55, 0, 0,141, 26, 53,130,191,191, 63, 18, 19, 19, 49,112,224,192,148,248,248,248, 46,148,210, 50,125,126,179,179,179,159,238, -217,179,199, 37, 55, 55,183,254,172, 89,179,146,124,124,124,178,116, 58, 29,201,200,200, 16, 56,142,131,157,157,157,188,126,253, -250,104,222,188,121,206,229,203,151,171,188,124,249, 50, 27,192,243,202,164,191,103,207,158, 56,127, 62,111,210,222,155,136,171, - 37,147,201, 16, 20, 20,228,241,228,201,147,216,252,251,115,165, 18,247,180,240,247,157, 59,119,112,238, 86, 12, 36, 6, 45,228, -201,113,184,178,127, 15,122,140, 26, 11,142,171,188, 23,195,157, 59,119,112,224,244, 21, 88, 40, 36,120,248, 48, 28,123,246,236, -193,152, 49, 99, 94,139,179,146, 40, 83,139,252,203,235,125, 60,128,117,165, 90,180,130,131,131,207,161,132,168,182,213,171, 19, -185, 34, 7,115, 59, 55,242,152,210,191,101,117,214,148, 21, 7,129, 23,192, 74, 1,103, 71,107,108,217,178,189,234,246,157, 59, - 47,215,243,144,254, 36,112,220,204,123,137, 84, 83,129,116,205,253,113,231,197,254, 91, 38,181,149,140,233, 90,211, 30, 0,100, - 18, 6,203, 15,133,115, 0,230,190, 78,134,223,241, 36,202, 28, 19, 70,186, 58,216,204,158,254, 73,176,125,219, 70,254, 56,119, - 53, 12, 63,237,185,124, 94,158,132,205,102,223, 56,193,132,226,250,169,164, 89,135, 16,202,247,187,228,121,234, 42,179,176,131, -241,249, 89,192,168,131, 78,111,196,203, 84, 30, 47,211,116,144,168,101,184, 17, 25,163,117, 72,192,145,202,230,153, 16, 66, 90, - 86, 83,186,207,249,110,137,167, 78,155,195,101,165,167,112, 50,249, 21,169, 90,165,136,175, 8,207,229, 24,170,107, 83, 85,214, - 16, 16, 88,185,146,106,102,124, 49,212, 34, 54,226, 4,106, 48,113, 32,148, 66, 85, 43, 24, 86, 42, 86,214,202, 87,246, 2, 0, -124, 93,109,228, 11,191,158,108, 51, 97,234,215,229,250,128, 5, 18, 34,171,211,216,117, 66,144,143, 29,206,223,124,128,243,247, -162,195,207,223,120, 88,187, 93, 29,119,248,123,218,142, 15, 36,100, 65, 4,173,184,133, 52,175, 96, 56,192,164, 43,156,117, 24, -232, 66, 62,104,220,127, 86,137,179, 13, 75,131, 47, 32, 68,242, 20,132,101, 1,194,228,205,128,124,249, 7, 36,182,213,232,246, - 93, 7, 52, 27, 54,108,254, 38, 34,153,138, 86, 44, 17, 34,202, 65, 70, 70,198, 93,181, 90,221,185,110,221,186, 27, 63,255,252, -115,171, 65,131, 6,185,143, 24, 49,130, 1,128,196,196, 68, 97,217,178,101,113, 63,255,252,115,102, 74, 74,202, 48,163,209,120, -207,156,142, 47, 33,228,210, 47,191,252,146,124,225,194,133,218, 77,154, 52, 81, 52,108,216, 80,176,179,179,147, 40, 20, 10,222, - 96, 48,232, 34, 35, 35,249, 39, 79,158,184,101,100,100, 60, 6, 16, 85,153, 97,253,124,235,213, 60,150,101,231, 80, 74,131,222, -132,143,150, 90,173,118, 7,240,152, 16, 82,163,162,195,134,127,106,176, 37, 18,164,167,167, 67,147, 16, 14,101,204, 35,212,181, - 96, 16,104,103, 9,107,107,235,215, 18, 69,153,153,153, 64,110, 44, 46, 94,188, 3,112, 28,108,108,108, 96, 99, 99,243,183, 11, -173,210,180,200,127, 1,197,103, 26,230,215,219,178,125,180,106, 59,147, 49,118,114, 44, 27, 21, 92, 93,230,235,237, 9,125,204, - 13,220,121,153,131,153,205,154, 68,176, 10, 43,221,168,143,122, 54,234,211,183, 10,218, 54,111, 76,124,221,108,198, 47,248,113, -245,167,181, 93,200,228,240, 68,186,220,156, 68,133, 39,209,167,181,156,201,134,179,119, 99, 70,123,170,181, 16, 4,138,179,247, -226,113,239,121,250,134,251, 73,244,105, 69, 50, 88,219,157,116,144,128,217, 73, 41, 85,218, 88, 88,100,215,175, 87,211,177,195, - 59,245,152, 46,109, 26, 65,198, 2, 23,175,221,193,196, 31,247, 93, 17, 4, 26,124,211,204, 97,195,188, 25,134,175, 10,168,188, - 25,134,166, 87,102, 24, 82, 74,105,222,172,195,178,221,190, 88,150, 36,104,162,175,187, 74, 29,252,160,141, 58,139,231,233, 2, -162,147,178,145, 37,113,133, 62, 54, 22,160,194,139, 80, 74, 43, 93,171, 29, 29, 29,157,171, 6,250, 87, 95,177,105, 15,140,154, - 76, 60, 13,221,136,156,244,120,124,187,230, 80,117, 79, 79,207, 54, 49, 49, 49,231, 42, 80, 97,252,207, 28,217,238, 12, 10,176, - 82, 5, 66, 86,237, 66,138,131, 10,142,106, 25, 4,109, 50, 70, 77, 24,100,211,181,227, 32, 27, 0,136,126,120, 27, 62,106,173, - 89,188, 70, 7,244,233,223, 46,192, 22, 38, 45, 54, 29,191,173, 99,128, 46,155, 79,134, 71,181,171,105,171,236,223,210,199,110, - 94, 92,198,251,168,100, 80,209, 2,139, 86,161,133,175, 18,179, 13,119, 83,202,215,114, 34, 81, 59, 47, 37, 89,244,237,216, 80, - 45,147, 16, 66,115, 98, 65, 85,142, 88,189,105,119,142,220,132,117, 98, 19, 42, 66,132,121,208,104, 52, 55, 9, 33,117,190,252, -242,203, 15,102,204,152,209,218,194,194,162, 42, 0,228,230,230, 62, 53,153, 76,231, 1,108,175,200,236,192,124,225,244,152, 16, -242, 52, 42, 42,202,101,235,214,173,182, 0,148,249,127,235, 0,100, 0, 72,124,157, 25,135, 5,162,138, 16, 50,231, 13, 90, 58, -142,230,115,214,168,204,249, 12,195,240,132, 16, 16, 66,160, 80, 40,112,225,194, 5,244, 11,238,136,251, 33, 25, 8,178,181, 68, -147, 97,163,176,243,212, 41,176, 44, 11, 66, 8, 88,150,173, 80, 59, 34,145, 72,112,241,226, 69, 12, 30,216, 23, 10, 9, 96, 99, - 99,131, 47,191,252, 18, 7, 15, 30,132, 68, 34,174,210, 87,129,114, 94, 87, 32,184,204,143,163, 69, 48,239,212,198,239,101,224, - 77, 56,188,241, 7, 28, 9,203, 49, 60, 76,198,204,128,100, 44,219,131,108, 33,249,199,205,163, 79, 93, 12, 91,252,241,128,238, -234,119,219,117,196,187,109,219, 73,106, 55,110, 51, 27,192,242, 34, 13,118,135,178, 98,109,240, 2,190, 89,119,252,193,168,157, -161,145, 4,198,108, 12,232,212,152,242, 2,190, 41, 71, 4,252,137,211, 70,101,185,243,226,229,203,118, 48,230,224,249,237,223, -149, 85,170, 86, 7,120, 35, 30, 63,126,132,159, 55,237, 23, 66,175, 61,220, 98,224,240,121, 84, 26,205, 53,151, 51, 79, 89,113, -176,177,144, 7,116, 13,178, 57, 38,128,194, 86, 45,171, 73, 5, 30,182,106,105,205, 78,181, 44,142, 81, 74,169,149, 74, 90,147, -242,166,114, 57,181, 6,110,237,166, 95, 55, 44, 25, 62,124,184, 69, 74, 76, 2,226,178,194,144, 35,247,128, 73,237,133,168,219, -231,181, 26, 61, 87,110, 35, 94,214,253, 76, 73, 73, 73,186,121, 53, 13, 59,215,204,135,201,160, 71, 82, 76,158, 86,141, 75,201, -130,181,163,199,229,138,112, 26, 57, 33,179,207,160,145, 50,149, 21, 84,131,251,116,151, 71,165,234,209,192,221, 42,175, 50,229, - 36,227,254,233,139,104,155,155,167,219,158,188,100,224, 83,207,221,172,116, 90, 41,101,159,119,109,232,129,167, 47,226,113, 33, - 60,118,211,147, 84, 26, 87,205,129,108,138,138,203, 24,221,179,153, 55,150, 30,140,248,172, 52,113, 84, 26,103,160, 11,249, 0, - 64,203, 60,103,120, 45, 40,208, 50,208,133,124, 96,206, 76,195,146, 56, 37, 50,124,184,228, 88,244,172,221,215, 83,122, 78,249, -176,149,117,243,230,221,228,224, 12,200,214,234, 77, 17,233, 52,235,117,202,232, 53,122, 74, 34,167,200,249,159,228,204, 23, 61, - 91,242, 63,111,146, 51, 14,197,226, 58,189,110,222,139, 14, 19, 82, 74, 37,249,214,172, 50,157,225,203,227, 44, 58, 76, 72, 41, - 61,154,111,205, 42,211,170, 85,156, 83, 16,132,184, 70,141, 26,217,247,232,209, 3, 60,207,227,209,163, 71,136,126,249, 18, 29, - 70,127, 6, 91, 91, 91,156,191,123, 23, 15, 31, 62,196,156, 57,115, 96, 50,153,112,224,192,129,152,242, 56, 37, 18,137,177,122, -245,234,178, 94,189,122,129,227, 56, 60,121,242, 4,177,177,177,152, 56,113, 34,108,108,108,112,243,230,205, 66,206,148,148, 20, - 72, 36, 18,227,223, 81,151,254,235, 40, 73,100,149, 45,180, 0, 30,188, 9,153,167,230, 98,249, 5, 24,141, 38,212, 12, 79,162, -207,138,252,191,186,174, 3, 57,124, 55,236,193,211,155,127,188, 43, 71,210,189,188,115, 42,128,200, 20, 26,223,216, 75,146, 13, - 99,182, 53,158, 28,195,179,196,236,156,200, 20, 26, 95,209,204, 81,129, 39, 48,106,128,248, 27,184,116,254, 28, 66,175,220,193, -245,123, 15,248, 75, 55, 35,119, 50, 2,190,137, 72,161,143, 42,161, 78, 97, 25,188, 20, 67,239, 61,246,110,236,239,226, 13,158, - 3, 21, 76,176, 25,176, 29,195, 34,154,123, 55,174,102,235,157,103,201, 50,193,238,147,223,129, 37,202, 50,249,174,191, 48,174, -107, 89, 85,241,126,118, 70,106,179,246,109,222,177,176,169,213, 21, 41,143, 35,241,232,206, 69,237,205,176,168, 75,215, 95, 24, - 95,203, 90,226,225,225,209,186,125,155, 0, 12, 24, 53, 29, 70, 77, 38,158,132,254,138,156,180, 4, 92,184,108,137, 7, 89, 89, -239, 0, 48,219,162,117, 41,218, 84, 27, 0, 90,250,202, 94, 88, 65,239,250, 81,247, 30, 80, 16, 29, 4,125, 22,136, 38, 5, 81, -177,134,204,247,215,188,228, 1, 64,173, 32, 18, 11,154,105,109, 14,111,160,143,131,159,154, 53, 97,243,169,112, 8, 66,222,242, - 77,130,128,213,155,127,143, 26,253,205,224, 6, 8,244,182,171, 71, 8, 33, 21, 49,249, 19,138, 86,215,119,126, 93, 83,119,102, - 54, 32, 24,113,113,188,125,205, 86,203,211, 90, 85,214, 50,118, 47,150,198, 2, 24, 93,203,157,172, 29,191,252,248,236, 70,167, - 34, 90, 78,250,164,167, 53,168,184, 0,187, 8, 17, 34,254,126,228,228,228,140, 26, 54,108,216, 90,169, 84,234, 4,128, 8,130, - 0, 65, 16, 36,139, 23, 47,150,242, 60,207, 48, 12,195,179, 44,203, 29, 61,122,212,196,243,124,178, 78,167, 27, 85, 30, 39,199, -113, 81, 99,199,142,173, 94,222, 12,197, 29, 59,118, 64, 34,145, 24, 57,142,139, 18, 75,162,124,145, 85,244,187,168,149,171,244, -198,131,226,235, 22,131,231,206, 5, 64, 64,241, 85, 49,145, 5, 0,184,155, 74,227,106, 59,147,137,181, 27,183,153, 91,112, 78, - 69, 19,167,227,249,190,141,235,248,239, 0, 0, 61,229, 7, 87, 38,131, 89,122,109,255,250,141,223,217, 41, 80, 42,225, 40,221, -192, 8,216,171,227,112,223,156,153,118,165, 33, 46, 41,227,102,193, 66,209, 2,232,255,134, 11,243,195, 56, 80, 74,105,225,112, -225, 15, 74,164,100,234,203,141, 3,117,241,169,190, 99, 99,111,217,200,147,127,220, 30,197,243,212,149,101, 73,130,214,192,173, -125, 93,145, 5, 0, 49, 49, 49,231, 2,157,201,201,187,245, 92, 58, 57,170,243,173, 92, 26, 32, 69,131,147, 49, 73,217,231, 42, -195,153,158,107,234, 57, 99,217,193, 67,114, 41, 43, 1,165,121, 1, 69, 41,133,206,200,167, 21,136,177,186, 14,196,253,203, 3, -220, 14,150, 37,209,229,241, 93,125, 24,191,116,192,130,211,147,195,159,167,111,120,150, 78,195, 0,224, 89, 58, 13,171,225, 64, -102, 71, 37,100, 79, 14,139, 78,255,161,162,126, 21,148,224, 66,227, 1,115,255,180,239,117,239,231,253, 56,122, 7, 64,239,218, -206,164,227,128, 73, 63, 79, 34, 4,226,242, 19, 34, 68,252, 63, 66,129, 85,139, 97,152,121,111,144,243, 40, 33,164, 27,128,199, - 21, 56,231, 42,128, 58,111, 56,111,169, 0, 82,197, 82,126,163,247,180,226, 1, 75,195,147,232,106,152,177,104,180,185,199,149, -122,126, 28, 61, 13,192,225,117, 50,152,207, 97,255, 38,111,218,221, 68, 58,251,175, 40,140,124, 81,245,151,248,250, 68, 36,209, -206, 0,224,231,231, 71, 31, 63,126, 12, 74,233,107, 57, 21,222, 79,166,119, 80,108, 41,135,146,196, 54,128, 86,230,240, 69,166, -208,111,128, 63, 15, 13, 63, 78,165,223, 2,248,182, 82,121,174,100,228,119,179,235, 86, 18, 61, 5,148, 31,157, 95,132, 8, 17, -111,167,216,250, 11, 56,143,138,119,246,237, 67, 89, 1, 75, 25,241,246,188,125,120,244,232, 17,121, 93,145, 37, 66,132, 8, 17, -111, 49,248,215,252,148,168,161, 94,243, 35,226, 45, 17, 92,197,247,137, 66, 75,132, 8, 17, 34, 68,136, 16, 33,226, 13,137,172, -226, 98,139, 0,232, 80,162, 52,175,192,108, 2, 66, 72,135,138, 38,168, 60,126,145, 83,228, 20, 57, 69, 78,145, 83,228, 20, 57, -223, 62,206,242,184,223,186,217,140,180,136,147,243,155,254, 0,232, 32,114,138,156, 34,167,200, 41,114,138,156, 34,167,200,249, - 54,127, 0,140, 44,109, 91, 28, 58, 20, 33, 66,132, 8, 17, 34, 68,136,248,139, 32,198, 6, 18, 33, 66,132, 8, 17, 34, 68,136, -120, 61,148,187,168,180, 8, 17, 34, 68,136, 16, 33, 66,132,136, 74,160,220, 69,165, 69,136, 16, 33, 66,132, 8, 17, 34, 68, 84, - 14,149, 90, 84, 90,132, 8, 17, 34, 68,136, 16, 33, 66, 68,249, 40, 43, 50, 60,169,224,138, 39, 34, 68,136, 16, 33, 66,132, 8, - 17, 34,202,192,159, 34,195,135,132,132,208,162,223, 34, 68,136, 16, 33, 66,132, 8, 17,127, 39,222, 86, 45, 34, 14, 29,138, 16, - 33, 66,132, 8, 17, 34, 68,188, 6, 74,242,209, 18,133,150, 8, 17, 34, 68,136, 16, 33, 66,196, 27, 64, 89, 62, 90, 5, 1, 75, -219,230,155,234,218,138,183, 75,132, 8, 17, 34, 68,136, 16,241, 15,224,173,212, 34,133,206,240, 33, 33, 33, 52, 56, 56,152,136, -229, 44, 66,132, 8, 17, 34, 68,136,248, 39,240, 54,106, 17,113,214,161, 8, 17, 34, 68,136, 16, 33, 66,196,235,136,169, 34,179, - 12,139,111,139,107, 29,138, 16, 33, 66,132, 8, 17, 34, 68,188, 33,193, 85,124, 31,243, 23, 95,176,131,200, 41,114,138,156, 34, -167,200, 41,114,138,156, 34,231,255, 23,145, 85, 92,108,137,179, 14, 69,136, 16, 33, 66,132, 8, 17, 34, 94, 3,230,204, 58, 20, - 33, 66,132, 8, 17, 34, 68,136, 16, 81, 9, 16, 66, 70, 18, 66,186,231,255,238, 94,212,170, 37, 90,180, 68,136, 16, 33, 66,132, - 8, 17, 34, 94, 3,148,210,117,132, 16,183,124,129, 21, 66, 41,141, 23,133,150, 8, 17, 34, 68,136, 16, 33, 66,196, 27, 64, 49, -191,172, 96, 66, 72,225,112,162, 40,180, 68,136, 16, 33, 66,132, 8, 17, 34, 94, 3,101,249,104, 17, 0, 29, 74, 57,233,116, 5, -148, 92,135, 74, 36,234,180,200, 41,114,138,156, 34,167,200, 41,114,138,156,255,191, 56,203,227,174,136,254,248,183,160,164,176, - 14,133,226,139, 82,250,151,125, 0,116, 16, 57, 69, 78,145, 83,228, 20, 57, 69, 78,145, 83,228,252,255,250,121,227,179, 14, 27, - 18,162, 18,141,136,111, 31, 8, 33, 46,132, 16, 23,241, 78,136, 16, 33, 66,132, 8, 17,230, 91,184,222,168,143, 86, 32, 33,159, -124, 18,228,180,166, 14, 33,214,247, 40,213,148,117,172,179,179,243, 90,181, 90, 61, 72,163,209,228, 18, 66,132, 34,166, 54, 0, - 40,186, 46,208,147,164,164,164, 86,229, 93, 91,161, 80, 44,115,113,113,249, 36, 39, 39, 71, 67, 8,161,132, 16, 16, 66, 10, 50, -252,202, 55,207,243, 49, 41, 41, 41,141,254,211,133, 8,176,142, 46, 46,215,164, 44,235, 81,209,115,121, 65,120,150,152,144,240, - 78, 5, 42,204,124, 66, 48, 37,255,247, 34, 74,233,244,183,240,169, 96,205, 57, 44, 8,176,138, 4, 6,240, 12,243,153, 20, 88, -169, 23,132, 53,249, 21,151,175,236,165, 13,215, 72,117, 66, 81,143, 16,216, 80,138, 76, 74,112, 71,222,132, 70,253, 67, 47,135, - 62, 82,169,180,167,181,181,181,101,106,106,234, 57, 0, 59, 0, 12,116,112,112,104,147,149,149,149, 99, 50,153, 14, 82, 74,247, - 85,134,187,117,125, 50, 85, 46,147,126,172, 51,154, 22, 94,188, 77,127,109,219,144, 56,112, 2, 22, 40,101,146, 86,122, 3,183, -232,194, 29,186,161,130,105, 37,121,143, 66,193,171,163,226,235,137,237, 49,179,220, 1,224,128,157,157,191,194,201,250,140, 84, -206, 62,203, 72,204, 25,212, 55, 41,233,101,223,215, 40,247,127, 35,156,156,156,134, 50, 12,243, 29,165, 20, 60,207,207, 76, 77, - 77,221,248,134,234,213, 76, 0,182,249,155, 25,148,210,239, 94,147, 47, 26,128,119,254,230, 11, 74,169,143,216,180, 87,250, 94, -174,222,191,127,255,232,118,237,218, 97,233,210,165, 88,189,122,245,243,228,228,228, 5, 0, 54, 81, 74, 13,127, 55,207,219,136, - 55, 38,180,106, 19,210,109,104,231,166,107,199,245,239, 70, 38, 12,157,165, 41,231, 97,254,165, 75,151, 46,131, 55,109,218, 36, -141,140,140, 84,249,250,250,130, 97,152, 66, 33, 84,244,125, 89,165, 74, 21,161,188,107,179, 44,187,188,119,239,222,195,246,236, -217,163,190,121,243,166,186, 86,173, 90,133,124,130, 32,160,248,251,215,215,215,183, 76, 62, 27, 27,155, 27, 44,203,122,150, 36, -210, 74,251,205,243,124, 76,106,106,106, 35, 51, 42, 99,103, 0,211,204,184,165, 11, 40,165, 39,202, 58, 64,202,178, 30,113,113, -113,206, 21, 45, 43, 47, 47, 47, 99, 5, 30, 30, 23, 66, 48, 69, 16, 40, 3, 0, 12, 67,166, 42,149,202, 53, 58,157,238, 69,193, -255,249,101,150, 88,145, 52,120,120,120,188, 79, 41, 29, 5,128, 18, 66,214,197,198,198,238,173,200,249,214,214,214, 55,228,114, -185,167, 68, 34, 33, 37,149, 75,241,109,158,231,169,209,104,140, 73, 75, 75,171,176,192, 62, 7,144, 46, 64,107,142,101, 39, 56, - 56, 58,182,186,121,242,164, 69, 80, 80, 16,195,178,236,116, 0,107, 94,231,185, 49, 92, 35,213,121, 19,250,105, 77,138,238, 10, -159,175,252,245,209, 95, 69,170,164,250, 35,134,107,100,247,223, 45,182, 8, 33, 67,134, 12, 25, 50, 97,225,194,133,142,114,185, -156,217,181,107,151,255,196,137, 19,251, 44, 93,186,212,177,127,255,254, 86, 6,131, 65,152, 58,117,106, 32, 33,196,153, 82,186, -170, 34,220,205,235,147,102, 1,190,110,115,198, 13,122, 23,147,231,239, 24,215,178, 14, 73, 81, 89,200, 86,191,223,170,186,109, -237,170,118,248,122,237,165,207, 1,108,168, 64, 90,137, 68, 34,121,199,221,221,221, 79,167,211,113,249,157, 55, 90,228,157,144, -119,127, 13, 6, 67, 90, 90,218,238,215,189, 55,147,149,202,166, 77,109, 45, 79,205,253, 96,136, 42, 43, 61,205,101,121,200,161, -187,123,224, 92,183, 47,240,252,109,106, 16, 24,134,249, 46, 54, 54,214,141, 82, 10, 55, 55,183,239, 0,108,124, 67,212,182, 5, -239, 97, 66,136,237, 27,224,243, 46,194,231,253, 6,234,190, 82,194, 48, 99,229, 82,105, 39,158,231,235,228,215,161,123, 6,147, -233, 20, 39, 8, 43, 41,165,186,183, 88, 7, 76, 25, 61,122,116,199, 25, 51,102,248, 78,153, 50, 5, 83,166, 76,169,178,126,253, -250,181,223,127,255,253, 84, 66, 72, 93, 74,105,206,223,204,243,159,183, 96,253, 37, 66, 43,144,144, 70,237,235,213,216, 59,126, -232, 0, 8,123,150, 17, 12,157, 85,166,200,122,167, 81,163,143, 55,109,218, 4, 0, 24,212,179, 39, 58, 53,105, 2, 43, 75, 11, -200,229,121,201, 33,148, 64, 38,149,161,215,196, 47,204,201,220,162, 62,125,250,124,184,103,207, 30, 75, 0, 88,189,122, 53,250, -244,233, 3,123,123,123,168,213,106,200,100, 50, 72,165,210, 87,190,205, 16,110,158,177,177,177,206, 74,165,178, 80,248, 9,130, -240,202,167,200, 56, 53, 56,142,131,159,159,159,185,183,107, 90,102,102,102,235,220,220,220, 50,199,116,171, 86,173, 10, 0, 39, -204, 33,252,238,219,111, 32,112,185,144, 72, 0,142, 3,244, 70, 6, 66, 9,125,123,119,119,119,140, 29, 59, 22,175,179,144,120, -112,112,119, 66, 8,217,227,238,238,190, 55, 41, 41,201,151, 16,140,168,164,165,235,211, 71,143, 30, 89, 2,128,191,191,255, 88, - 0, 21, 18, 90, 18,137,196,243,238,221,187,206, 10,133,162, 84,203,101, 17, 17, 12,163,209,136, 6, 13, 26,112, 21,185,134, 11, -224,157,198, 48, 35,234, 55,108, 56,114,110,175, 94,202,107,215,174, 41, 25,134, 1,199,113, 88,188,120, 49, 71, 41,181, 13, 4, -172, 35,128,172, 50,234,231, 12, 0, 67,243,173,180, 27, 40,165,139, 95,249,159,162,158,214,164,232,254, 36,167, 87,147,166, 85, -166, 34, 34,252, 94,147,106,150, 7, 96, 37,209, 71, 1,248, 91,133,150,181,181,117,207,165, 75,151, 58,109,216,176, 33,235,225, -195,135,198, 53,107,214, 56,141, 26, 53,202,202,104, 52, 98,244,232,209,201, 1, 1, 1,178,165, 75,151, 58,237,219,183,239, 93, - 0, 21, 18, 90, 18,130,111, 6,246,236, 4,157,137,129,201,196, 57,185, 57, 89,109, 25, 63,164,173,148, 82, 3, 54, 31,188, 9, - 19, 39,252, 90, 65, 75,214, 59,125,251,246,173,182,125,251,118,201,131, 7, 15, 36, 53,107,214,132, 32, 8,224,121, 30, 38,147, - 9, 0, 32, 8, 2,106,212,168,241,218,247,229, 99,192,223,209,197,254,212, 59,221,186,170,220,148, 10,216,167, 39, 99,184, 76, - 98,181, 81,173,223, 10,160,249,219,212, 88, 80, 74, 33,145, 72,240,242,229, 75, 56, 59, 59,171,236,237,237,227, 1,124,149,150, -150,182,238, 45,110, 32,155,200, 37,146,189,155,127, 93,238,218,180,121,115,214,197,205, 25,145,143, 94, 64, 66,248, 14,119,175, -223,108,251,241,152, 73,227, 9, 33,239, 83, 74,175,189,109,121,119,107,241,105,111,183,150,159,173, 38, 84,192,215, 43, 14,101, -207, 95,180, 76, 61,122,196, 16,118,226,196,137,240,242,242,242,237,221,187,247, 34, 0, 99,202,229,105,246,105,111,215,230,227, - 86,131, 82,204,253,249, 80,246,247,139,150,169,199, 84,130,231, 63,254,236,172,251,203,132, 86, 32, 33,213,106,123, 57,159,156, - 63,101,140,148, 30,251,141,209,164, 38,161, 52, 41,227,236,236,188,182,107,215,174,131, 54,110,252, 95, 39,233,157,160, 32,244, -126,183, 37,156, 29,108,160,182,144,231, 53, 71, 2,193,157,135,207,204, 18, 4, 94, 94, 94,163,247,238,221,107, 89, 84, 76,200, -100,178,194, 79, 81,145, 85,240, 41,110,249, 40, 9, 74,165, 18,167, 79,159,134, 68, 34, 1,203,178,144, 72, 36,133,159,162,219, - 44,203,194,197,165, 66,174, 75, 11,108,108,108,234,102,103,103, 91,103,100,100,192,219,219, 59, 11,192,221, 34,255,215, 77, 78, - 78,182,174, 8,161,192,229, 98,226,240, 90,144, 26,174,192, 32,109, 2,173,164, 5, 46, 93,191,143, 35, 39,206, 33, 54, 46, 1, - 45,155,213,199, 71, 31,244,197,169, 83,167,192,243,124, 69, 43, 79, 34, 33,100, 81,143, 30,221,167, 2,132,116,232,208, 33, 99, -220,184,113,204,131, 7, 15, 62,236,221,187, 87,208,163, 71,143,243,123,194,100, 10, 33,100,121, 5, 44, 91,114, 0, 56,127,254, - 60, 0, 40, 42, 83,247, 20, 10, 5, 46, 95,190,140,130, 97, 98,134, 97,192, 48, 12, 88,150,197,225,199,142,200, 53, 48,208, 36, -134,225,179,238,222,168, 90,181, 42, 24,166,124,151,196,182,128,242, 18,208,155, 72,165, 19,221,220,221,125,219, 84,171,166, 62, -125,250, 52, 11, 0, 62, 62, 62, 52, 62, 62, 62,227,224,193,131,217, 18, 96,181, 15,165,155,202, 18, 89,222,222,222, 45, 24,134, -249,174,224,158, 19, 66, 22,249,250,250,206, 41, 44, 55, 65,192, 7, 29,237,165,227,199, 79,144, 53,109,155,215, 57,105,218, 99, - 59,178,158,204,175, 69,210,102,216,252,221, 47,138,172,172,172,157, 53,106,212, 96, 83, 83, 83, 47, 1,136, 54,153, 76,211,182, -108,217,226, 60,124,248,240,164,173, 91,183, 46, 0,224,190,112,225,194,182,185,185,185,187, 42,194,219,170, 30,233,214,168,126, - 80, 51,111, 47, 47,156,187,116, 13, 50,185,212,118,236,208,238,176,180,148,224,135, 13, 33, 66,116, 76,218,184, 11,119,232,166, - 10,136,172, 38,125,251,246,245,221,190,125,187, 28, 0,238,222,189,139,132,132, 4, 56, 57, 57, 65,165, 82, 65, 42,149,130,101, - 89, 72,165,210, 55, 34,178,108,188, 28,174, 30, 56,112, 80,101,111,111,139, 21, 95,140,199, 71, 73,137,176,181,178,132, 41, 39, -215,247, 45, 19, 28,254,239,191,255,190,146,231,121,228,230,230, 34, 52, 52,212, 70,165, 82,217,120,122,122,206, 5, 96,182,208, - 82,169, 84,137, 58,157,206, 57,255, 61,154,164,213,106, 93, 0,100, 41, 20,138,130,247,116, 78,254,245,204, 26, 78, 44,101,152, -240, 69, 17, 75,214,139,215,200,115,227, 38,141,235,158,222,183,103,155,101,102,118, 2,108,237,146,192, 32, 19,235,214,173,132, - 74,101,141,185,115,103, 72,158,117,120,215,163,115,183,247, 79, 19, 66, 58,188,117, 98,139,146,117, 29,122, 12,178, 87,169,173, -242,219, 18, 19, 54,174, 31, 15,134, 97, 48,103,206, 28,212,174, 93,123, 36, 33,100, 22,165, 52,173,108, 26,172,171,211,186,191, -189, 92,153, 87,196, 2,111,194,154, 29,147,243,120,166,143,194,192, 30, 85, 71,222,217, 74,142,215,174,134,236,188,118, 5, 90, - 41,131, 23,104, 66,147, 10, 56, 66, 66, 66,218, 4, 7, 7,159, 43,109,251, 63,240,252,184, 1, 8, 46, 73,124, 73, 66, 66, 66, -104,112,112, 48, 41,146,185, 87,182,203, 66,125, 66, 28, 93,108,212,167, 87,127, 53,222, 82,114, 37,132,213,190,120,140, 56, 29, - 95,248,228, 20,159,162,169, 86,171, 7,109,220,184,241, 21, 29,230,237,226, 12,153, 76, 10,169,140,192,182, 85,247,188, 39,238, -194, 17, 16, 66, 75,107,248, 95,225,204,205,205,213,221,190,125,219,114,195,134, 13,112,118,118,134,175,175, 47,212,106, 53,148, - 74,229, 43,226,170,168,224, 42, 46,180,138,115, 22,252, 47,145, 72,192, 48, 12, 78,157, 58, 5,142,227,208,183,111,223, 63,137, - 44,137, 68, 82,162,112, 43,109,122, 42,165,244, 4, 33,228, 46,165,180,117,126, 3,124,151, 82,218,166,200,181, 59, 59, 57, 57, - 77, 3,176,192, 92, 78,150,165, 96,117,151, 32,120, 46,131,228,229,120, 24,164,245,112,246,226, 77,108, 92,187, 20, 0,224, 91, -179, 49,250,245,238, 94,104,141, 51,135,179, 40, 60, 60, 60,118, 36, 39,167,116,125,247,221,119,145,158,158,110,250,234,171,175, - 80,183,110, 93,248,251,251,155, 85, 70,165, 9,184,187,119,239,122,105,181, 90,179,134, 29, 75,226, 36,132, 96,203,150, 45,208, -233,254,108,213,183,107,243, 61, 38,247,241,193,176,207, 54, 97,209,195, 93, 88,181,106, 85,153,121, 87, 3,117,117, 54, 53,150, -203, 89,174,238,130, 25,159, 42, 62,250,232, 35,118,216,176, 97,120,241,226, 5,134, 15, 31,174, 59,117,234,148, 33, 33, 62,254, -160, 92, 16, 86, 24, 95, 21,198,165,114, 42, 20,138,205, 39, 78,156,192,174, 93,121,186, 36, 50, 50, 18,126,126,126, 22,175,136, -228,180,221,200,142, 94,129,171,135, 31,160,105,143,237,184,122,248, 3,240, 25, 33,210, 70,126,200,172,200,253,172, 68,239,235, -116, 9,251,118, 1,216, 85,228,254,170,182,110,221,218, 11,192,161,252,255, 0,224,199,138,112,230, 17, 97, 88,255, 62,189, 32, -145, 89,225,193,227, 24,180,121,167, 1, 92,156,157,113,247,126, 20,162, 99,211, 18, 9,193,208, 46, 45, 20, 11,180, 90,195,172, -243,183,233, 47,229,112, 18, 79, 79, 79,255,221,187,119,203,138, 88,160, 11,159,113,150,101, 11,183, 11,132,119,101,234,103,129, -200,178,242,180,188,250,205,202, 22, 22, 87,239,109,133,159, 79, 55,216,117,235,142, 95, 78,158,196,163,240, 8,157, 65,195,181, -255,187,203,232,175,226, 36,132,248,247,233,211,231,210,182,109,219,108, 95,190,124,137,243,231,207,195,215,215, 23, 26,141,166, -220, 14,111,113, 78,157, 78,231, 92,100, 88,175,192,181,225, 59,131,193, 80, 80, 24, 5, 15, 98,169,195,137,197, 56,255, 52, 76, - 88, 25,159,172, 18,222,243,114,165, 76,182,251,192,190, 29,150, 17, 15,206,163,126,189,102,176,180, 9,132,192, 39, 32, 53, 45, - 7,233,143,227,240,237,183,139, 48,247,171,153, 56,180,127,143,101, 64,173,122,123, 9, 33, 53,138, 14, 35,254,215,203, 29,132, -142, 60,125,120,235,106, 66, 5,104, 19, 31, 40,164,185, 79,213,131, 62,120,159, 29, 48, 96, 0, 14, 29, 58,132,240,240,240,213, -165,137,172,162,156,132, 98,100,216,249, 93,171, 65, 41,180, 73, 15, 20, 50,237, 83,245,144, 15,251,177, 31, 13,236,132, 43,191, - 47, 71,167,250, 79,195,220,157,209, 59, 61,127,240, 80,194, 34, 85,161,196, 31,170,107,228, 74, 17,177, 21, 10,128, 20, 17, 88, -161,248,159, 15,230,127, 1,193,249,209,225, 71, 22,183,110, 73, 42, 35,176, 0,192,159, 16, 75,181, 92,118,117,227,220, 79,221, -213, 47,194, 37,250,176,203,136,211, 11,116,205,115, 78,184, 74,136,234, 38,165,218,226,231,104, 52,154,220,168,168, 40,213,208, -222,189,209, 60, 40, 8,110, 14, 14,168,225,233, 9,149, 66, 14,185, 76, 90,228,189, 92, 33, 21, 73, 3, 2, 2,208,163, 71, 15, - 72,165, 82,168,213,106, 88, 90, 90, 66, 46,151,151,104,205, 50,183,151, 75, 41, 5,203,178, 8, 11, 11, 67,116,116, 52,108,109, -109,241,199, 31,127,160,125,251,246,127,178,106, 21, 21,103, 21, 49,209, 23,111,248, 11,132, 24,204, 28, 50, 44, 0,207, 19,228, -208,122, 80, 62, 31, 7, 13,105, 0,189,158,131, 94,175,199, 47, 23,141,184, 22,149, 11,163,209, 0,189, 94, 95,234, 53,203,184, -183,140,187,187,251, 32, 63, 63,191,177, 31,124,240,129, 73, 46,151, 35, 55, 55, 23, 26,141, 6,225,225,225,166,174, 93,187,101, -244,232,209,221, 38, 36, 36,132, 82,138, 69, 21,244,211, 74,245,240,240,240,202, 31,158, 77,173,100, 15,162, 80,196, 20,199,208, - 31, 35, 32, 97,243,202,100,245,234,213,224,121, 30,148,210, 82, 11, 73, 71,200,153,175,190, 95, 98,179,112,217,175,176,177,119, -193,185,115,231,248,227,199,143,103, 19, 32,242, 81,120,248,143,239, 1, 71,119, 3,198,138,164, 47, 61, 61, 93,229,235,235, 11, - 79, 79, 79, 8,130, 0,147,201, 84,104,125, 73, 77, 77,133, 86,171,133,189, 69, 6,170, 59,120,130,203, 14, 69,124,216,215,112, -179,124,128, 77, 39, 12,166,134,254,184,243, 47, 48,133,255, 6,224,183,215, 39,130,135,179,171, 23, 24,106, 66, 92, 82, 42,122, - 5,119, 2, 43,179,196,179,151, 41,168, 23, 88,205,237,195,247, 90,184,177,132,195,148, 5,219,199, 2,248,165, 60,186,156,156, - 28,254,193,131, 7,184,123, 55, 79,239, 90, 91, 91,195,194,194,226,149,103,156, 97,152,215,178,104, 21,136,172,239, 87,183,183, - 96,164,185,200,226, 79, 99,195,150,155,168, 23,208, 29,107,174, 94,215,241,137,105, 29,126,208,233, 34,255,211,195, 70,110,110, -163, 4, 65,152, 75, 41,205,232,211,167,143,203,246,237,219,237, 98, 99, 99,113,243,230, 77,204,153, 51, 39,153,231,121,142, 82, - 74, 40,165, 95,191,129,186, 36, 20, 17, 88,111,210,138, 32, 85, 43,241,153,163, 53,233, 41, 97,172,125,185,172,156,103, 41, 6, -122, 80,195, 9, 63, 83, 74, 77,101,157,203, 48,204, 39,123,118,174,118,119,116, 18,208,214,233, 93,196, 39, 26,241,253, 23, 67, -144,154,154,141, 95,214,207, 7, 32,135,145, 99,209,186,237,251,112,118,246,192,200, 17, 35, 93, 87,175, 93,243, 41,128, 31,222, - 22,131, 86,252, 31, 43,247, 19, 66, 78, 59, 57, 57,133,127, 58,114,164,147,175,239, 96, 40,149, 74,236,216,177, 3,219, 87,172, -224,151, 1,253,214, 18,114,118, 20,165,251,203,228,185,242, 63,158,241,163, 71, 59,213,170, 53, 26, 10,133, 2,191, 31,255, 13, -186,132, 45,217,193,205, 97,212,232, 16, 92,165, 7,181,127,126,152,164, 73,165,120, 12, 0, 82, 37,226,165, 64, 82, 49,186,255, -154,192, 42,148, 81, 5,126, 90, 5,223,175, 29, 25,158, 74,229,247,214, 79, 24,232,227, 2, 61, 49, 92, 60,140, 88,189,192, 47, -124,100,100,111,101,210,201, 17, 37,136,172,252,138, 45,120,123,123,227,221, 70,141,208,187, 85, 43, 72, 36, 18, 40,229, 50, 88, - 41, 85,160,124,158, 37,171, 96,232,176,140, 54, 17, 37, 89,159, 28, 28, 28, 32,147,201, 10, 5,150,185,214,172,210, 56, 5, 65, -128, 68, 34,193,221,187,119,209,178,101, 75,120,121,121, 97,215,174, 93,232,220,185,243,159,134, 18, 43, 42,178, 10,132, 86,209, - 97,188, 34, 78,242,229, 58,193,255, 73, 36, 24, 8, 82, 12,245, 64, 72, 16, 56, 14,224, 41,160,215,233, 64, 41, 64, 41, 96, 50, - 26,160,211,233, 10,175,105,206,144,172,155,155,155,119,213,170, 85,231, 77,157, 58,165, 86,189,122,245,145,156,156, 12, 65, 16, - 96, 97, 97, 1,141, 70, 3,107,107,107, 52,111,222,252,217,188,121,243,226, 41,197,200,138, 58,195,191,129, 23, 44, 0,224,228, -201,147,175, 12, 27, 22,124,114,227, 99, 48,236,243,173,144, 75,242,134,150, 10,124,120,202,122,239,182,107,221, 2,151,110, 69, -114,159, 76, 89,174,151,166,222, 92,224, 42, 8, 27, 99,128,196,215,104, 92,144,146,146,130,196,196, 68,244,236,213, 11,219,183, -109,195,243,231,207, 17, 24, 24,136,118,237,218,193,217,217, 25,207,159, 63,199,181, 11,122,232,211,211,144,102,184, 9,181, 85, - 83, 28, 56, 23,165,159,189,202, 16,245, 79,189, 45, 8, 33, 61, 1, 12,177,182,182,174,170,209,104,226, 57,142,219, 13, 96, 55, -128,126, 18,137,164,159, 90,173,118,203,202,202,122,138,188,217, 68, 7,203, 29, 74, 82, 42, 29, 20, 74,107, 8,156, 30, 18,137, - 4, 94, 94,190,160,188, 1,233, 89, 90, 12, 29,208, 3,183,238,222,199,241,179, 87, 56,147, 73,248,201,156,219,202,178, 44,245, -247,247, 71, 82, 82, 18,164, 82, 41, 84, 42, 21, 44, 45, 45, 49,125,250,116,172, 88,177,162, 80,100, 85, 86,104,125, 12,248, 91, -123, 91, 94,249,110,101,158,200, 74,136,139, 71, 98,140, 20, 78, 14, 46,248,105,197,178,220,244,231, 9, 77,127, 5,254,211, 34, - 11, 0, 4, 65,248, 58, 54, 54,214, 89, 34,145,184,114, 28,135,151, 47, 95,226,198,141, 27, 24, 55,110, 92, 98,106,106,106, 91, - 74,105,165,242,168, 84, 42,147, 10, 44, 89, 74,165, 50, 9, 40,117, 56, 49,163,136, 37, 43,163, 12,202, 18,135, 9, 9, 33,213, -124, 61,173, 78,173, 95, 58,209,187,113,211,230,140, 90, 98,157,158,243, 56,161,229,197,243,231,154,143, 91,250,203,167,132,144, - 78,148,210, 39,165,145, 42,164,210,174,205, 90,180,144,128, 38, 66, 34,111,137, 69, 11, 7, 32, 57, 37, 11,233,105,217,144,201, - 44, 96, 48,177,224, 5,130,230, 45, 91,225,183, 77, 59, 81,123,196,112, 86, 46,149,118,124,155,132, 86, 62,230,255,252,243,207, -222, 1, 1, 1,216,184,113, 35,206,110,222,140,143, 50, 51,113,142, 97, 88,147, 84,234,120,212,100, 90, 7, 96,191,185, 60,181, -107,215,198,175,191,254,138, 45, 91,182,188, 24,212, 62,105,239,196, 65,112, 54, 26,209,229,230, 67,216, 87,233, 1,220,124, 8, -251,134, 1,168,193, 73,240,152, 16,188, 18, 14, 42, 36, 36,164, 77,209,239,255, 18,242,215, 54, 44,113,136, 93, 2,160,109, 72, - 72, 8, 45,250, 93, 30,161,218,217,127,244,150, 1,239,250, 4, 85,247, 38,166, 93,203,241, 50,151, 51,204,122,104,148, 63,202, -161, 19, 35, 40, 93, 86, 70, 15,130,178, 44, 11, 43,149, 10, 78,182,182,121,102,126,134, 1, 4, 64, 48, 1,132,207, 19, 0, 84, - 32,168,200,164,105, 65, 16, 32,151,203, 75,116,124,175,168,111, 86, 81,206,236,236,108, 60,123,246, 12, 35, 71,142,132, 90,173, - 6, 0, 36, 36, 36,192,199,199, 7, 18,137, 4,177,177,177,248,253,247,223, 81,181,106, 85, 40, 20, 10, 82,193, 66, 41,104,248, -235, 18, 66,206, 1,168, 27, 31, 31,111,237,230,230,134, 10, 91,180, 4, 10,141,158,192, 96,224,241,232,209, 35,196,197,197,225, -217,211,199,104,156,155, 5, 10, 22,148,210, 10, 89,180, 60, 61, 61,131,252,252,252,214, 44, 88,176, 64,230,233,233, 9, 74, 41, -236,236,108,161,209,104,144,146,146,138,192,192, 64,120,121,121, 97,209,162, 69, 0,176,253,239, 22, 89,197,234, 84,161,208, 42, - 42,184, 62,127,207, 27,105,105,150, 96,217,255,205, 62, 45,199, 71, 75, 6, 0,109, 59,245,145,156, 58,126,212,130, 3,230, 37, -176,236, 60, 73,249,229,104,226, 5, 65, 93,218,255, 47, 95,190,132, 84, 42,197,158,221,187,145,150,152,136,122,245,234,161, 73, -147, 38,120,252,248, 49,110,221,186, 5, 7, 7, 7, 56,121,190,131,115, 79,141,136,136,211,194,198,198, 6, 81, 49,204, 63, 22, - 50,128, 16, 50,162, 67,135, 14,115,126,252,241, 71,103, 87, 87, 87,105,114,114,114,192,202,149, 43,235,173, 92,185,114,252,167, -159,126,234,242,233,167,159,218, 57, 57, 57, 73, 18, 18, 18,252,191,248,226,139,134,132,144,170,148,210, 37,101,113, 90, 88, 88, -217,179, 50, 11, 16, 34,129,173,141, 29, 36,114, 11, 8,156, 4,188, 0, 88,219, 56,225,210,173, 61,248,227, 94,246,168,164, 84, -236, 54,227,185,161, 14, 14, 14, 96, 24, 6, 14, 14, 14,127,178, 84,143, 27, 55, 14,235,215,175, 47, 28, 70,172,172,200,250,126, -101,123, 75,146, 47,178, 18, 94, 74, 64,244, 85,113,120,255,229,140,244,231, 9, 45,223, 6,145, 85,240,142,163,148,226,233,211, -167,208,104, 52,184,112,225, 2,190,254,250,235,228,226, 34,203,197,197,101,132,181,181,245, 87, 57, 57, 57,139,226,227,227,151, -151,199,155, 47,162, 94,237, 12,150, 48,156,104,110,136,135,146,134, 9, 9, 33, 82, 47, 55,229,137, 91, 23,182,250,216,208, 59, - 4,209, 35,129, 71, 89,225, 86, 87,157, 91,119,107, 28,204, 52, 88,245, 77,149, 38,163,166,159, 32,132, 4,148,102,217, 18,120, -190,129,133,165, 21,128, 36,220,188, 17, 90, 40,178, 82,211, 50,161, 55,178,208, 27, 8,116, 70, 6,239,118,232,130, 21,107,182, - 32, 54, 41, 13, 5, 51, 18,223, 22, 16, 66,236,131,130,130, 70,247,235,215, 15,243,230,205,195,233, 31,127, 52,140, 33, 36, 75, - 2,208, 16,158,135, 64, 41, 97,204,112, 98, 47,206,243,195, 15, 63,236, 7, 48,112,193, 56,188,147,158,131,161,238, 61,168,125, -149, 30,121,199,246,157, 74, 1,192, 62,249,244,171, 77,102,112,112, 48, 41, 24, 89,171,232, 8,219,191, 29,146,224,224,224,115, - 33, 33, 33, 40,250, 93,214, 9,214,174, 53,187, 77,255,114,220,194,198,157, 91,145,248, 73, 29,145,150,165,227,102, 68, 24,229, - 49,218,178, 69, 86, 81,124,185,114, 37,110, 69,230, 61,199,158,206,206,152,242,225,135,160, 28,240, 71,120, 4,118,158, 62,141, - 1, 29, 58,192, 34,127,198,159,185,214,167,146,172, 88, 69,173, 89, 21,181, 58,101,100,100, 96,247,238,221,104,210,164, 9,212, -106, 53, 36, 18, 9,234,214,173,139,251,247,239,163, 90,181,106, 32,132,224,192,129, 3,232,221,187, 55,158, 60,121,130,119,222, -121,199,178, 50, 66, 43, 34, 34,194,154, 82,218,186,192,250, 81, 89,232,245,122, 60,120,240, 0, 61,122,244,128,157,157, 29, 60, - 60,182,227,244,137,173, 80, 7,125, 4, 66, 80, 33,161,197,243,252,199,193,193,193, 50, 66, 8,180, 90, 13,148, 74, 21, 44, 44, - 44, 97,101,101, 13,127,255, 0,196,197,197,161,115,231,206,134,168,168,168, 85,241,241,241,187, 42,154,214,192,192, 64,139,204, -204,204,143,170, 84,169, 34,207,239,237, 6, 86,175, 94,125,114, 84, 84, 84,118, 69,173, 90, 5, 2,139, 16, 2,150,101, 11,133, -150,132, 97,224,230,234, 92,184,157,239,159, 70,202,224,202,138, 77,213, 43, 0,192,219,219, 27, 43,214, 30, 98,130,131,131, 49, -126,252,120,152, 76, 38,172, 90,149, 55,201,238,131, 15, 62,128,209,104,196,222,189,121,147, 36, 37, 18, 73,153,102,147, 27, 55, -110,224,230,205,155, 48,153, 76,200,204,204,196,177, 99,199,112,238,252,121,236, 56,112, 6,207,159, 62, 70,221, 0, 31, 12, 31, -254, 49,164, 82, 41, 54,109,218,132,150, 45, 91,254,163, 47, 4,169, 84, 58,104,253,250,245,110, 27, 55,110,204, 56,112,224, 64, -110,179,102,205, 20,203,150, 45,115, 94,177, 98,133,147,193, 96,192,132, 9, 19,146,174, 92,185,162,239,213,171,151,197,186,117, -235,220,170, 87,175,222, 17,192,146, 18,238,167, 5,128, 1, 0, 6,183,109, 98, 35,201,200,214, 66,224, 12,120,250,252, 25, 50, -115, 12, 16,120, 35, 94,196,196, 33, 71,199, 35, 53, 45, 27,117, 27,116,250, 57, 52, 52,116, 38, 33,100, 6,165,244, 72,121,233, - 12, 15, 15,199,149, 43, 87,240,252,249,115, 60,125,250,244,149,255, 70,140, 24,129, 45, 91,182, 84,216,162, 85,178,200, 98, 65, -244,213,112,228,192,213,140,164,199,241,111,141,200,202,127, 7,205,117,115,115,155,235,230,230,166, 60,121,242,164, 77,149, 42, - 85,192,113,156,161,184, 37,171,109,219,182,179,214,175, 95,239, 86,173, 90,181,113, 0,150,255, 27,210,206, 48, 24,177,104,245, -104, 71, 43,249,139, 56, 60, 90,146, 31, 75,144, 5, 52, 89, 64,232, 54, 72, 90,204,126, 54,174,215, 84,187,105, 27,231,141, 64, - 25, 51,100,163,158,188,196,234,213, 43, 48,113,194, 80,252,246,203, 34, 8,130, 4,122, 19, 11,111,223,102,208, 27, 5, 16, 70, -130,122, 13, 26,225,108,232, 5, 72, 25, 96,247,198,213,111,149, 41,139, 82,154, 70, 8, 89,117,224,192,129,207,198,143, 31, 15, - 65, 16,228, 95,173, 94,173, 77, 78, 78,158,143, 10,196,191, 42,129,167,247,234,213,171, 35,167,173, 72,222, 63,113, 16,216,231, -135, 73,218,205,135,176,239, 59,149, 98,207, 66,130,134, 1, 72, 83,151,220,196,159, 47,246,253,118, 8,173, 2, 37, 89,244,187, - 36, 52,244,175,246,141,141,189,221,199, 77,234,250, 59, 78, 25, 63, 70,242, 36, 65,135,189, 85, 62,204,249,125,243, 79, 22, 9, -156,226,231,199, 84,187,172, 34, 23,222,249,251,239,133,191, 23,111,223, 94,226,127,241,125,251,154,221, 51, 43,205,138, 85, 81, - 75, 22, 0,168,213,106,219,142, 29, 59,162,125,251,246,120,255,253,247, 11,125,178,234,215,175,143, 29, 59,118,160, 79,159, 62, -184,125,251, 54,220,220,220, 80,179,102, 77,212,172, 89, 19, 71,143, 30,173,104, 5, 7,207,243, 8, 10, 10, 42,152,117, 88, 55, - 38, 38,198,186,178, 5,169,215,235,145,154,154, 10,123,123,123,200,229,114, 52,109,218, 4,159,125,222, 20,142,110,191, 34,168, - 86, 0,114,115,115, 11,167,191,155,209,216, 6,213,168, 81, 3,201,201,201, 72, 78, 78,134,147,147, 19,220,221,221,225,234,234, -138, 37, 75,150,208,229,203,151, 31, 55, 26,141,171,146,147,147, 43,108,201,114,115,115,107,101,111,111, 63, 75,171,213,202,139, -244,112,229, 78, 78, 78, 7,221,221,221,231,199,197,197, 85,100,141, 77, 24,141, 70, 16, 66, 16,242,212, 29,185, 6,130,172,152, -155, 24,255,158,207, 43,194, 75, 42,149,154,227,208,155, 59,112,224, 64,103, 47, 47, 79,188,140, 10,199,158, 61, 20, 63,254,248, - 99,193,172, 72, 68,230,119, 12, 10,182,219,181,107, 7, 95, 95, 95, 84, 36, 72,166, 32, 8,184,123,247, 46,182, 31, 60, 7, 55, -159, 90,120,241,232, 1,110, 29, 61,140, 42, 78,246,168,221,160, 17, 76, 38,211,107,133,222,120, 19, 48,153, 76, 27,252,252,252, -168,193, 96, 56, 7, 96,197,189,123,247,134,198,199,199, 79, 56,116,232,144,123,191,126,253,226, 14, 31, 62,188, 12,192,198,123, -247,238,141,254,246,219,111,219,115, 28, 87,226,108, 65,150,101,127,251,226,139, 47,218,246,235,215,143,200, 24,147,225,228,137, - 77, 18,142, 51,145, 47,103,108,224, 67, 47,158, 99, 56,206, 68,222, 31,248,133,112,244,247,123,204,168,207, 23,243,245,155, 5, - 35, 44, 44,204,181,123,247,238,223, 2, 40, 83,104, 21, 88,170, 74,179, 80,178, 44,139,161, 67,135, 98,199,142, 29,102,231,123, - 56, 80,205,218,199,242,202,247, 43, 59, 88, 18, 73, 78, 17,145, 85, 29, 71, 14, 92,205, 72,124, 20,247, 86,137, 44, 0, 72, 73, - 73, 89, 11, 96,173,189,189,125,162,133,133, 5,178,179,179,255, 84,255, 8, 33,202,128,128, 0,165, 92, 46, 71,167, 78,157,236, -221,220,220, 34, 25,134, 89, 30, 27, 27, 91,170,226, 40,105,152,176,164,225,196,215,153,117,104,231,132,238, 77, 91, 53,176,122, -104, 51,207, 74, 41,209,221,174, 18,169,180, 38, 0, 50,245, 46, 79, 47, 69, 15,200, 34, 73,138,250,141,218, 53,132,181,196,162, -123,105, 66,139, 97,217, 91,153,233, 25, 93,179,178, 13,184,248, 71, 24, 6, 14,168, 1,189,145, 64, 16, 24,228,228,234, 1, 86, - 10, 6,192, 7, 31, 14, 1, 37, 18,164, 37,198,129,101,217,123,120,251, 48,125,244,232,209, 93,103,204,152, 81, 53, 63,254,149, - 79,126,252,171, 41,132,144, 58,180,156,224,227,101,240, 84, 57,188, 99,246,164,131, 23,214,100, 6, 55,215, 62,106, 24, 0, 0, -176,111, 24,128, 52,169, 20,143, 37, 44, 82, 41,133,182,152, 85,171, 77,209,239,255,152,117,240, 21, 39,248,162,219,102,249,104, -249, 85,243,236,210,166,113,163,207,103,206,152,105,117,255, 82, 40,166,125,179,130,250, 53,234,152,189,246,194, 45, 67,142,133, -111,215,236,228, 71,127,152,171, 47, 0,160,203,187,125, 80, 55,176,201,159,254,108,217, 46, 47,150,228,197,179, 55,144,152, 28, -107,118, 99,155, 47, 14, 74,244,201, 50,103, 74,127, 9,166,239,140,176,176, 48,231,152,152,152, 87, 28,223,125,125,125, 65, 8, -193,213,171, 87,113,229,202, 21, 12, 28, 56, 16, 18,137, 4, 82,169, 20,231,206,157,171,144, 53,166,136,117,233, 46,165,180, 13, - 33,164,179,167,167,103,137,179, 13,205,225,210,106,181,200,204,204,196,137, 19, 39, 80,163, 70, 13,124,255,253,247,112,119,115, -193,204,153,147, 32, 8, 2,178,178,178,192,243,188,185, 22, 45,161,192, 90, 36, 8, 2,146,147,147, 81,181,106, 85,172, 92,185, - 18,203,150, 45,251, 54, 46, 46,238, 80, 69,211,232,237,237,109,203,243,252,151, 61,122,244,232,216,171, 87, 47,116,238,220,249, -149,255,183,109,219,102,181,119,239,222,249, 94, 94, 94, 93,140, 70,227,130,196,196,196,100,115,120,127,253, 53, 47,252,146,186, -217, 92, 76,235, 87, 5,131,199,110,194,146, 37,251,160, 80, 40, 94,105,120,231,205,155, 87,166,136, 17, 40,245,147,165, 92,138, -155, 52,245, 7,231,249,243, 79,227,244,233, 36, 48, 12, 3, 55, 55, 55, 48, 12,131,103,207,158,129, 97, 24,248,248,248,128, 97, - 24,196,198,198, 22,248, 4,166, 67,103, 94, 44, 67,134, 97,160,211,233,240,242,197,115,196, 68, 69,194, 50, 43, 1, 78,214,106, -164,135,223, 69,221,225, 35, 10,227, 63,253,195, 61,220, 45, 0,182, 20,217,245, 3, 33,196, 64, 8,121, 31,192,126, 74,105,129, - 69,227,219,252, 79,137,104,214,172, 89,253, 25, 51,102, 72, 11,194,109,184,123,127,199, 25,141, 70, 1, 0, 2,234,182,126, 69, -237, 63,126,252, 24, 75,150, 44, 65,110,110, 46,100,230, 4,186,203, 23,173, 5, 51, 12, 75, 18, 97, 21, 17, 89, 0,224,224,227, -249,243,213,155,231,248, 59, 81,107,180,247, 30, 30, 83,197,191, 96,192, 24,222, 94,145, 85,220,178,229,233,233, 57, 87, 16, 4, - 74, 41,157, 93,228,221,170,240,246,246,190,112,242,228, 73, 7,142,227,240,211, 79, 63,217, 38, 36, 36,216,182,110,221,122, 26, -128, 82,133, 86, 73,195,132, 37, 13, 39,162,200,172, 67,133, 66, 97, 95,214,235,163,248,172, 67,158,135,191,181,149, 45,210, 17, - 3,189,163,169,126,134, 3,151,118, 42,126,196,109,247,232, 6,129, 22,188,169, 42,147,101,128,135,218, 22, 2,165,254,165,118, - 78, 77,166, 99,183,111,222,234,228,237, 85,131, 61,116,228, 60,122,246,238, 7,189,158,129,206, 68, 64, 88, 41, 8, 43, 67,157, -186, 13, 80,179,118, 93, 80, 0, 55,174, 93,226, 12, 38,211,169,183,169,236,221, 91,126, 62,208,189,229,103,203, 65, 5, 90, 66, - 28,173,170,189,123,247,158, 15,224,243,242,120, 92,222,249,124,160,107,243, 60,158,162,113,180,190,248,108, 52,194,175, 73,109, -206,223, 92, 40,235,220, 12, 33,201,167, 9,212,202,255,205, 58,148, 50,149, 15,205,241, 95, 17, 92,102, 9, 45,111,111,111, 91, -103, 75,245,175,159, 14,255,216, 42,250,206,101, 36, 68, 92,197, 31,231, 35,211,119,238,221,151,150,155,154, 52,188, 2, 34,171, -112,152,207,193,181, 10,124,107,253, 89,104, 41, 45,157, 0, 0,190,181,154,128,181,176,169,232,144,199,159,172, 89,149, 17, 89, - 69, 95,216, 37,197,208, 26, 53,106, 20,214,175, 95,143, 22, 45, 90,192,207,207,175,240,101, 95, 81,171, 89,113,235, 82,101,102, - 27, 22, 69,118,118, 54,124,124,124,176,110,221, 58,220,187,119, 15, 86, 86, 86, 24, 56,112, 32,178,179,179, 11, 5,150,185,206, -240,148,210,199, 39, 79,158,108,220,191,127,127, 42,149, 74, 73, 70, 70, 6,108,109,109,177,114,229,202,220,248,248,248,144, 74, -136,172,126, 50,153,108,210,128, 1, 3,216,128,128, 0, 36, 38, 38,194,218,218,218, 68, 8,145, 2,128,173,173,173, 73,165, 82, - 97,244,232,209,168, 87,175, 94,171, 41, 83,166,180,240,240,240, 88, 25, 27, 27,187,169,172,186, 68, 8, 41,108, 80,135, 47,127, - 0,131, 33, 79,168,172, 90,181, 10,249,190,110,255, 27, 34,136,138, 2,204,152,201, 98,105,105, 9, 63, 63,191, 18,203,190, 85, -171, 86,184,113,227, 70,222,208,164, 68, 2,103,103,103,252,241,199, 31,102,205,164, 42, 8, 4, 25, 22, 22,134, 90,190,142,184, -119,250, 36, 28,213, 82,212,115,119,133,103,171, 54,136,140,140,252,199,172, 89,249,177,169,198, 0,232,144, 95, 7, 55, 0, 24, - 85,100,123, 37,165,244,231,138,112,114, 28, 71, 25,134, 33, 47, 95,190, 52,170,213,106, 98,111,111, 47, 81, 40, 20,208,235,245, -133,130,235,241,227,199, 56,114,228, 8, 98, 98, 98, 96,111,111,207,216,216,216,192,104, 52,166,155,195,239,239,239, 15, 87, 87, -215, 87, 28,223,135, 15, 31, 94, 41,145, 53, 20, 8, 90,255,221,130, 42, 10,134,181,169,229,216, 5, 79, 31, 60,211, 49, 6, 40, -255, 63,136, 44, 0, 72, 79, 79, 95, 11, 96,109,193,182,147,147,211, 48,150,101,103,218,216,216,216,156, 59,119,206,214,201,201, -137,108,218,180,201, 52,123,246,236, 12,150,101,211, 9, 33, 75,255,121,113,136,136,148,204, 40, 31,169,157,187,112, 71, 71, 47, - 77,120, 57,173,102,186,180,134, 19,169, 29,132,222, 73,247, 47, 14,227,162,154, 39,198, 39, 48, 20, 66, 68, 25,239,224, 13,211, -102,204,251, 50,242,193, 45,111,165,181, 18,163, 70,207, 64,200,241,179, 32,140, 20, 23, 46, 93,133,193,200, 35, 37, 45, 19, 3, - 62, 24, 4, 79, 55, 71, 68, 92, 57,145,204, 9,194,202,183, 75,100, 11, 43, 58,245, 28,102,167, 80,169,243,239, 9,143, 45,191, - 76, 2,195, 44,199,156, 57,115, 16, 20, 20, 52,150, 16,242,117,121,113,180, 8, 17, 86,212,105,243,129,157, 76,145,199, 67, 5, - 30,235,118, 79,203,143,163, 53, 17, 43,215,238,173, 83,219,247,233, 87,101,197,209,122, 91, 68, 86,209,239,114,133, 86,149, 42, - 85, 20, 22, 82,140,180, 87,201,166,124,250, 97, 47,167,164,168,112,196,220,191,149, 55,188, 96,212, 26,227, 35, 35,252,204,184, -104,135, 98,241, 59,104, 89, 67, 87, 58,157, 9, 21,229, 44,104,112,139, 91,179, 42, 34,178, 74,226, 44, 42,182,138,198,205,242, -242,242,194,252,249,243,203,141,163, 85, 66,222, 11,246,119, 6, 80,183, 64,108, 33,207, 25,190,179, 57, 51, 13, 75,227,116,114, -114, 66,106,106, 94,132,132,182,109,219,162,109,219,255,205,103, 48, 26,141,133, 86, 44, 43, 43,171, 63, 89,180, 74,226, 84,169, - 84,211,246,237,219,247,241,165, 75,151,250, 79,158, 60, 89,218,190,125,251, 2, 49,167,161,102,172,237, 86,156,147,231,249,209, - 39, 78,156, 96, 5, 65,192,186,117,235,112,227,198, 13,170, 86,171,103,169,213,234, 21, 42,149,138,215,106,181,163, 70,140, 24, - 49,232,171,175,190, 98, 90,181,106,133,203,151, 47, 51, 85,171, 86, 29, 2, 96, 83,121,121,191,122,245, 42, 24,134, 1,151,246, - 2, 99,167,237,132,133, 74,130, 7, 15, 30, 32, 45, 45,237, 79, 65, 76,205,185,159, 69, 45, 37, 5,159, 86,173, 90, 21, 14, 67, - 54,109,218, 20, 44,203,226,246,237,219, 37, 14,195, 22,227,164, 14, 14, 14,133,245, 67, 38,147,225,236,217,179,248,230,155,111, -224,109,111,139,244,251,247,224,218,246, 93,116,252,120, 4, 6, 14, 28, 8,150,101, 97,111,111, 95,104,249, 45, 47,239,175,249, - 66, 40,202,249,113,173, 90,181,134, 68, 68, 68,120,214,169, 83,199, 45, 44, 44,172, 93, 80, 80,144,207,189,123,247, 10,182, 21, - 48,195, 55,167, 40,231,245,235,215,247,172, 88,177, 98,244,208,161, 67,101,130, 32,240,209,209,209, 38, 0,196,213,213,149,189, -126,253,186,112,232,208, 33,104,181, 90,120,122,122, 50, 30, 30, 30,228,212,169, 83,194,253,251,247,175, 82, 74,103,152,147,119, -158,231, 95, 9,227, 80,240,123,219,182,109, 21,126,222,171,212,244,255,190,125,235, 0,175,148,184,219,136,143,141, 2,159,233, -100, 60,114,224,176,190, 34, 34,235,111, 40,163,191,147,115,222,163, 71,143, 60,244,122, 61,228,114, 57, 86,173, 90,101,156, 63, -127,126, 68, 74, 74, 74, 75, 90,194,140,242,226,156,149,156,117,152, 86, 6,231,159,102, 29,102,166, 34,228,192,193,235,141, 45, -123,111,192,216,184,228, 66,199, 70, 74,136,253, 62,151,192,150,234, 38,117, 98,153,163,115,153,108, 94, 19, 82, 90, 58, 41,165, - 6, 66, 72,191,222,125, 62, 56,179, 99,199,118,203,217,115,231,226,143,171,247,144,154,145, 3,129,178, 16, 8,193,204,153,179, -225,234,104,143,172,184, 71, 26,189,209,216,187,248, 82, 60,255,245,114, 39,132, 25,119,234,208,166,229, 12,129,144,155,248, 80, -193,102, 71,169, 7, 15,236, 45,233,215,175, 31,246,237,219,135,176,176,176, 53,165,137,172,162,156,148, 50,227,238,157,219,185, -156, 0,130, 54,249,161, 66,146,243, 84, 61,228,195,222,146,129, 3, 7, 98,255,145, 75,216,113,248,233,234,237,135,232,225,183, -185,195, 82,169,200,240, 86, 18,132,181, 12,172,230,209,170, 65,109,165,132,215, 34,230,126, 20,210,114,117, 56, 21, 30,157,193, - 80,166,210,177,117,242, 94,144, 50,188,120,241,232, 79,255,101,100, 40,243, 27,244,138, 45, 43,197, 48,204, 43,214,172,215,177, -100, 21, 77,167,139,139,203, 43,203,185, 20,109,184, 11,124,128, 42, 17,218, 97,218,139, 23, 47,172, 95,188,120, 1, 74, 41,174, - 94,189,106,221,180,105,211,105,175, 99,205,154, 52,105, 82,161,213,170,248,119, 73,251,202, 67,190, 83,250, 50, 71, 71,199,221, - 83,166, 76, 25,219,180,105,211, 78,115,231,206, 37, 0,216, 74, 86, 64, 78, 16, 4,132,134,134, 98,223,190,125,188,209,104, 28, - 25, 23, 23, 87,212,215,225, 39,119,119,247, 83,125,250,244,217,244,240,225, 67, 54, 34, 34, 2,230, 8, 58,173, 86, 11, 63, 63, - 63,112, 28,135,133, 99,189,144,157, 93, 7, 28,199,129,231,121, 88, 88, 88,188,178,206,165, 57,229,196, 48, 12,120,158,255,147, -208,186,122,245, 42, 88,150, 69,203,150, 45,113,235,214,173, 66,139, 86,121, 22, 40,163,209,248,194,197,197,197,101,222,188,121, -133,233, 74, 78, 78,198,201,147, 39,209,236,157,230, 8, 28, 57, 10,113,113,113, 88,186,116, 41,220,221,221,241,253,247,223, 35, - 45, 45, 13, 28,199,253,221,230,244,174, 17, 17, 17,158, 31,126,248, 97,210,189,123,247, 60,143, 28, 57, 98,219,189,123,119,139, - 15, 62,248, 32,233,222,189,123,158,132,144,230,168,160, 19, 52,207,243,211, 9, 33,199,191,255,254,251,105,159,127,254,121,211, -161, 67,135, 74,165, 82,169, 16, 27, 27,203,109,223,190,157,248,249,249, 49, 50,153,140,156, 56,113, 66,184,118,237,218, 21,142, -227, 22, 82, 74, 47, 84,196,226, 92, 84,100,177, 44,107,150,200, 42,142, 9,206,138, 33, 86, 76,114,203, 21,171,230, 51, 1,190, -158,198,205,219, 79,190,188,112,249,209, 19, 86,207, 77,248, 21,120,130,255,135, 96, 89,118, 87,173, 90,181,134,141, 27, 55, 78, -213,185,115,103,197, 87, 95,125,149,153,157,157, 93,162,200, 42,229,185,252,203,103, 29, 2,248,101,250,228, 35, 19,190,168, 51, -172,218, 39,174, 85,112, 58, 55, 9,233, 18,150,177,182,101,208,192,135, 69,118,202, 99,167,195,103, 54, 62, 67, 57,113,217, 40, -165,215, 9, 33, 29,106,215,169,191,119,225,247, 11,157,103, 77,157, 34,221,123,228, 24, 40,103,196,213,115,231, 96, 41,227,233, -253,155,167, 19,245, 70, 67,175,183,113, 9,158,184,139, 63,237, 32,132, 28,180,183,183,191,243,241,208,161,126,181,106,125, 0, -181, 90,141, 61,123,246, 96,203, 79, 63,241,203,128,254,107, 9,185, 53, 42, 47,166, 94,169, 72,188, 92,200,115,123,196,199, 31, -251, 55,104,240, 9,212,106, 53,118,239,222,141, 77,203,150,153,205,243, 31,183,102, 21, 68,134, 15,201,255, 54, 35,142, 22, 67, -178,175, 60,138,206,185,250, 40, 58, 7, 2,165, 2,165,122,134,193,203, 92,163,241,251,200, 39, 49, 39, 42,153, 16, 8,130,128, -111,191, 27,247, 38, 51, 87, 40,126, 42, 59,165,187,132, 70, 34,166,232, 26,105,229, 45, 40, 13, 0, 38,147, 41,198, 76,250, 5, -222,222,127, 90, 3,117, 65,101,211, 90, 48, 28,104,174,200, 50, 55,142, 22, 0,164,164,164,196, 3,152,229,230,230,182,173, 83, -167, 78, 35, 0,196, 86,178,140,214,181,105,211,102, 36, 0,150, 16,178, 38, 54, 54,246, 79, 14,165,113,113,113,145, 30, 30, 30, -139,125,125,125, 11, 23,154, 46,139, 83, 16,132,167,117,234,212, 49,150, 84, 22,165,109, 11,130, 80,110, 25,101,100,100,160, 73, -147, 38,127, 90,211,146, 82,138,232,232,232, 2,139, 83,225,189, 47, 75,192,229,228,228,140,250,236,179,207,214, 74,165, 82,111, - 0,164, 64,228,242, 60,207,254,252,243,207, 74,158,231, 89, 0,132, 97, 24, 78, 42,149,234,246,237,219,199,113, 28,247, 66,175, -215,143,250,155,223, 17,187, 73,222, 82, 12,185, 17, 17, 17, 1,249,150,172,152,176,176,176,219, 59,118,236,112, 2,176,179,146, -117,243, 2,128, 11,132,144, 86,171, 86,173,154, 62,106,212,168, 38, 3, 7, 14,148,180,109,219, 22, 33, 33, 33,124,104,104,232, - 85,173, 86,187,160, 34, 2, 43,191, 44, 51,189,188,188, 10, 5, 87, 57,207,114,153,142,188, 14, 62,138, 21,131,198,184, 43,215, - 45, 56,153,147, 18,103,184,100,202, 49,204,216, 8,132,225,255, 49, 18, 18, 18, 38, 19, 66,102, 47, 93,186, 52,174, 94,189,122, - 10,153, 76,102, 48, 87,100,253,141,214, 3,142, 16,210,237,199,142,125, 15,182,153,249,153,111,199,118, 45,213, 94, 85,156, 61, -238, 71, 37,226,241,229,144,220, 59,135,191,123, 78,245,233, 61, 41,165,156, 25, 92,215, 8, 33, 53, 38, 77,153, 84,176,168,116, -221,246,167, 14,208,255, 71,139, 74,127,187,120,241, 98,191, 90,181,106, 97,207,158, 61, 56,181,117, 43, 6,164,164,224, 44,203, -178,140, 76,230,112,216,104,252, 1,230, 5, 46,254,118,201,146, 37,254, 65, 65, 65,216,181,107, 23, 78,108,218,132,254,149,227, - 41, 13,141, 1, 56, 21, 52, 79, 0, 30, 2,104, 8, 64, 5, 64,143,188,165,157, 28,139, 28,159,154,255, 95,193,255,231, 1,252, -149,142,176,229, 71,134, 47,142,123,143,158, 53,124,211,169,208,106,181,105,126,126,126, 21,154,115,109, 50,153,202, 28,195,229, - 56, 46,166, 90,181,106,102, 91, 45,204, 17, 69,169,169,169,141,254,194, 23,196,107,249, 98,189,210,136, 8,194,115, 55, 55, 55, -161,160,209, 47, 73,132,149,180,143, 2,207, 42,114,157,248,248,248,135, 0,190,168,108, 58, 99, 99, 99,247,194,140, 69,163,205, - 61, 14, 0,210,210,210,222,248, 98,190,132,210,216,175,190,250,170, 66, 2, 27,148,198,150, 81,214,247, 0, 52,253,183,191,101, - 11,150,222, 33,132, 48, 97, 97, 97, 35,242,135,183, 79, 3, 88,147, 31,209,251,117,249, 11, 5,215,186,117,235, 38, 80, 74,145, -149,149,181,172,162, 2,171,176,247,156,152, 24,242,166,242,158,150,104,248,125,251,154,152,119,181, 25,198, 9,235,115, 12,155, - 32,162,160,204,116,206,206,206,191, 13, 30, 60,184, 25,128,141,175,203, 87,210,112,226, 27, 72,227, 51, 66, 72,189,179,147,190, -249,248,172,173, 85, 48,120, 73, 0, 12,204, 97, 24, 82, 67, 0,252,106,142, 85,188,104,126,145, 23,166,100,201,255,167,114,206, -143,127, 53, 97,216,176, 97,152, 61,123, 54, 78,252,240,131,113, 12, 33,153, 82,128, 30,207,235,104, 50, 4,152,106, 46,207,144, - 33, 67, 48,123,246,108, 28, 93,184,176, 82, 60,229,192,137, 16,114, 4, 0,166, 77,155, 54, 99,254,252,249,118,211,167, 79,175, -187, 96,193,130,239,243,183,195, 11,254,207, 47,211,238,211,167, 79,175, 93,228,255,108, 0,215,255,226,251, 89, 98,100,248, 87, -122,236,111,250, 3,160,131,200, 41,114,138,156, 34,167,200, 41,114,138,156, 34,231,107,126,130,243, 36, 75,233,223,165,253, 46, -178, 15,255,196, 71, 34,246,221, 68,136, 16, 33, 66,132, 8, 17,255, 81,171,220,145,215,249,255, 13,166,163,192, 71,171,168,165, -116, 29,144, 55,221,189, 67, 41,166,212,138, 4,142,236, 80, 9,179,239,105,145, 83,228, 20, 57, 69, 78,145, 83,228, 20, 57,255, -127,113,150,199, 93,202,249,193,132,144, 35,148,210,238,165,125, 23, 8,171,226,191,139,236,123, 99,110, 7, 37,228,101,100,105, - 62, 90,226,208,161,200, 41,114,138,156, 34,167,200, 41,114,138,156,255,137,161, 67, 0,116,218,180,105,211,255,109, 67,135, 0, -220, 0,140, 44,250, 49, 99,232,112, 15, 27, 27, 11,107,185, 92, 45, 3, 0,131, 65, 99,244,240, 64, 22,208,247, 31, 91,240, 86, -196,127,214,180,235,146, 47,234, 19,223,228,177, 34, 68,136, 16, 33,226,255, 13,146, 11, 44, 85, 0,146, 1,144,252,109, 67,254, -119,114,126,219, 81,252,247, 43,255,255, 85,160,148,198, 3, 40,113,182,188,164, 52,145,149,146,162,118,148, 72,210,253,121, 94, - 87, 19, 0, 36, 18,230, 65, 74,138, 93,164,163,227,158,148,202,136, 45, 39, 23,151,155, 82,150,245, 48,231, 88, 19,207,199,166, - 36, 38,190, 18, 58,158, 2,255,121,129,103,174,136,120, 29,177,241,119, 8, 21, 39, 39, 39, 23, 23, 23,151,247,172,173,173,223, -201,200,200,184,150,156,156,188,191,180,117, 15, 9, 33,243, 9,193,148,252,223,139, 40,165,211,203, 72,187,217,199,150,112,174, -159, 90,173, 30, 75, 8, 9,202,207,127,152, 70,163, 89, 69, 41,125,244,255, 80,216,170, 0,244,146, 72, 36, 67, 28, 29, 29,155, - 36, 36, 36,124, 69, 41, 93, 90, 73, 46, 9,128, 73,182,182,182, 3,109,109,109,171,166,165,165, 61,201,202,202,218, 5, 96, 9, -165,180,220,169,210, 95,143,119,127,167,109,231,182,179, 66, 79,132,126, 59,119,121,220,229, 63,253, 63,217,221,161, 83,199, 22, -179, 67, 15, 95,154, 55,125, 69,108, 90, 5,211,198, 0, 40, 8,154, 39,228,247, 90,233, 27,190,151, 82, 0, 61, 0,180, 5, 16, - 10,224,176, 57,249, 46,133,171, 25,128, 25,249,105, 94, 66, 41, 61,251, 47,175, 71, 22, 46, 46, 46, 11, 1,244,144, 72, 36, 17, -177,177,177, 35, 41,165, 49,255,112,154, 36,200,155,230, 31,132,188, 48, 28,215,205, 9,225, 96, 14, 28, 29, 29,187, 75, 36,146, -177,249,161, 93, 86,165,164,164, 28,249,183,150,141, 66,161, 88,230,234,234,250,137, 86,171,213, 16, 66,104,209,120,143, 28,199, -197, 36, 39, 39, 55,122, 11, 95,109,215,255,229,207,203,200, 18,196, 87,233,113,180, 98, 99, 97, 45,145,164,251, 39, 37,220, 27, - 16, 23,127,183, 63, 0,184,187,213,221,229,236, 90,103,103,108,172,220,216,184, 99, 31, 75,169, 90,178,138,101,165,245,117, 6, -189,163, 84, 34, 77, 49,114,166,219,140,129,142,141,127,176,175,196, 96,139, 82,150,245,120, 30,121,214,153, 51,166, 65,170,116, -135, 84,229, 93,106,130,221,221,221, 43,149, 81,123,251,234, 86, 70,133,114,130, 84,202,118, 20, 40, 23, 68, 5,128, 33,210, 48, -142, 55,157,145,233,245, 63,166,165, 69,101, 87,246, 38,214,116, 36,174, 20, 24, 8,130,142,160, 56, 69,128, 29, 15, 82,104, 66, - 5, 10,193, 44, 17,241,154, 98,163,232,185, 75, 41,165,147,223,116,101,242,244,244,180,123,255,253,247,151,125,243,205, 55, 42, - 75, 75, 75,242,226,197,139,206, 83,167, 78,109,237,233,233,249, 69, 76, 76, 76, 92,113,209, 71, 8,166, 8, 2,101, 0,128, 97, -200, 84, 23, 23, 23, 53,203,178,127,138,109,196,243,188,154, 16,140, 19, 4, 74,242,143,157, 66, 8, 89,110,142, 96, 84,169, 84, - 31, 52,105,218,252,139,133,139,151, 88,186, 56, 59, 91,112,188, 96,124, 22,253, 92, 61,107,218,228,166, 42,149,106,185, 86,171, -221, 94,137,135,134,176, 44, 59, 64,161, 80,116, 7, 80, 43,127,247,125,189, 94,127,132,231,249,157,230, 54,232,174,174,174,231, - 89,150,173, 82,145,107,243, 60,255, 34, 33, 33,161,101, 37, 31,246,126,222,222,222,191,182,105,211, 70,221,164, 73, 19,200,229, -114,204,158, 61,123, 18,128,165,230, 8, 42,181, 90, 61,192,194,194,162, 90, 78, 78, 78,148, 86,171,221, 43,151,203, 59, 44, 95, -190,220,171, 69,139, 22, 86,137,137,137,132,101, 89,151, 35, 71,142,124,244,211, 79, 63,117, 38,132,180, 47,175,145,203,140,162, -179, 20, 61,106,181,202,140, 58, 59, 11, 64,215,226,255,115, 58,229, 16,202,122,117,215,210, 91, 47, 81,129,169,245,132, 16, 70, - 42,149, 46,119,117,117, 29,166,211,233,116,200,139,189, 70, 93, 92, 92, 10, 27, 28, 0, 48, 24, 12,233,233,233,233, 1,149,184, -143, 1, 0,134,219,218,218, 14,251,242,203, 47,237,186,118,237,138,173, 91,183,126,186,126,253,250,116, 66,200,111, 0,126,161, -148, 62,172, 32,237,148,132,132,132,110, 82,169,148,120,121,121,177, 0,206, 86, 32, 61,254, 0,102,230, 55, 54,171, 40,165, 60, - 33,164, 29,144,247,188, 3, 88, 84, 32,220, 88,150, 93, 21, 16, 16,240,222,253,251,247, 87, 83, 74,191,173,236,179,238,234,234, -186,118,229,202,149,253,123,246,236,201, 38, 39, 39,123,212,171, 87,111, 27,128, 86,111,160, 65,250, 88,161, 80, 76,172, 91,183, -110,224,195,135, 15, 35,179,178,178,150,228,223, 79, 90,198, 57,158, 0, 58,216,218,218,182,159, 57,115,166,101,247,238,221,177, -110,221,186,110,235,215,175,207, 33,132,156, 1,112,250,117, 69,160, 68, 34, 25, 27, 19, 19,227, 72, 41,133,155,155,219, 88,148, -179,184,249, 63, 5,150,101,151, 15, 24, 48, 96,216,182,109,219,212,207,159, 63, 87,123,120,120, 20, 6,207, 38,132, 84,186,253, - 20,241,218, 22,173,117, 5,130,203,172, 56, 90,114,185, 90,198,243,186,154,113,241,119,251,183,110,243,179, 13, 0,156, 63,247, - 89,127,103,215,218, 97,114,185, 58, 82, 97,173,220,215,167, 71,135,250,125,187,183, 33,158,110,206,136,137, 79,114,249,101,199, -137, 46, 71, 78,156,221,135,188, 0, 98, 37,130, 51,166, 65,101, 60,141,135, 23,127,130, 99,219, 56,172, 56, 26,131,203,119,158, - 65,147,153,130, 42,174, 42, 44,158,208, 9,174,118,234, 74,101,210,210,197,191, 29,163, 84,239,252,240,131,193, 54,239,245,170, - 37,245,113,117, 5,165, 10, 68, 70,229, 52, 63,118,242,108,227,189,187,183,143,181,116,241, 31,144,147, 24,105,246,203,173,161, - 59, 81,229, 26,209, 75,194,146,143, 90, 53,173,221,254,131,110,173,152,192, 90, 53, 16, 17,126,191,211,193,223,175, 46, 14,116, - 97,206,112, 60,221,108, 33,195,129,155,113,165, 7,244, 43, 73,112,116,236,216,177,149, 66,161, 48, 22, 61, 78,175,215,203, 8, - 65,179,202,136,141,130,107, 24, 12,122, 70, 42,149,131, 97,200, 23,117,235,214,173,149,146,146,114,150, 16,242,107,108,108,197, -172, 5,159, 19, 34, 79,151, 72, 26, 50, 10,133, 27,111, 48, 56, 0, 0,145,203,211, 61,237,236,234,204,156, 49,195,146,101, 89, - 33, 53, 53, 21, 26,141,134,140, 24, 49, 66, 25, 21, 21,213, 7,192, 79,229,164, 17,235,215,175,247,119,115,115, 51, 20,255, 47, - 62, 62, 94,222,179,231,123,149,121,105,251, 55,123,167,197,196, 19, 39,142,215,202, 74, 75,215,173, 95,186,246,166, 73,169,214, - 87,173, 21, 32, 93,181,110,147,205,200, 97,131, 62, 35,132,220,166,148, 70, 86,128,211, 91,165, 82,237,251,225,135, 31,130,218, -181,107, 39,117,118,118, 70, 98, 98, 34,238,223,191, 31,244,251,239,191,247,218,180,105,211, 36, 66, 72, 31, 74,169, 57, 17,220, -253,206,108,254,213,217,194,222, 1,188,201, 4,247,186, 13, 10,227,155, 61,254,253, 36, 56,163, 17,130,201,132, 90,221,123,229, -153,101, 4, 1,129,129,129,149,138,186, 75, 8,113,175, 93,187,246,150,239,191,255, 94,166,215,235,113,245,234, 85,156, 61,123, - 86,136,143,143, 95, 80,158,200, 34,132,156,156, 59,119,174,103,203,150, 45,173, 82, 82, 82,192,243,188,227,129, 3, 7,198, 54, -104,208,192,218,203,203, 75,190,121,243,102,228,228,228,128,227, 56,251,106,213,170,217,127,240,193, 7,134,205,155, 55, 79, 2, -176,176, 52, 75, 86, 86, 20,157,149, 64,170,117, 9,104, 56, 4, 9,228,120,151, 47,186,186, 29,179,174, 78, 10, 45, 91, 93,171, - 87,183,170, 86,211, 98,170,165,117, 29,251,172,216,211, 83,187, 86,175,190,254, 88, 84,249,157, 33, 66, 8,195, 48,204,242, 62, -125,250,124,184, 99,199, 14,245,253,251,247,213,181,106,213,130, 32, 8,133, 17,248, 11, 2,206,250,249,249, 85,230, 62, 46, 24, - 61,122,244,212,254,253,251,163,110,221,186,133, 65, 81,231,204,153,131,169, 83,167,218,157, 63,127,126,210,246,237,219, 39, 17, - 66, 22, 82, 74,167, 85,164, 45, 47,218, 94, 86, 48, 89, 95, 63,125,250,180,223,190,125,251, 6, 77,153, 50,197, 15,192, 56, 0, -179, 83, 83, 83,219, 0,128,131,131,131, 28,192, 89, 66,200,199, 95,126,249,229,152,105,211,166,161, 91,183,110,179, 9, 33,223, - 85,198,202, 71, 8, 97, 29, 29, 29,187,245,236,217,147, 53,153, 76,176,176,176,128,201,100,170,254,154, 2,139, 0, 88, 57,106, -212,168, 49,163, 71,143,134,157,157, 29, 76, 38,147,255,142, 29, 59,214,207,158, 61,251, 29, 66,200,240,146,210, 74, 8, 25, 50, -102,204,152,247, 7, 15, 30,140, 70,141, 26, 65, 34,201,187,141, 63,252,240, 3,230,205,155,103,121,242,228,201, 94,155, 55,111, -238, 69, 8,217, 75, 41,173,116, 44, 52, 65, 16, 32,145, 72,240,242,229, 75, 56, 59, 59, 43,236,237,237, 79, 16, 66,214,165,166, -166,238,255, 23, 89, 77, 22, 13, 24, 48,224,195,109,219,182, 89, 2,192,226,197,139, 49,113,226, 68,184,184,184,192,210,210, 82, - 84, 59,255, 18,139, 86,241, 56, 90,149, 10,239,160,209,104, 26, 76,255,252, 35, 48, 76, 94,175,177, 70, 85,111,204,159, 49,146, - 28, 60,114,162, 65, 89,231, 73,149,238,120,120,241, 39, 40,188, 38, 64,111,226,112,229,206, 83,156, 90,220, 25, 0,224,223,117, - 38,244,198,246, 5,202,208, 94,174, 82, 45, 50,240,252, 31,112,117,189,138,232,232,228,242, 68,150,147,171,203,145, 53,107, 22, -170,130,170, 7,192,200,153, 16,155, 20, 11, 66, 20,240,244,176,194,199, 67,186, 74,219,180,113,119,252,250,235,181, 33, 22, 78, -254,189,115,147, 35,203, 13, 24, 26,224, 68, 54,182,106,224,215,255,131,224,150,138, 58, 65,181, 33, 83,168,254, 39,192, 26, 53, - 66,195, 70,141,152,105, 57,217, 29,175, 93,191,217,113,207,201, 43,250, 0, 39,178,235, 97, 50, 29, 90, 86, 57, 20, 21, 28,227, -199,143, 71, 65,239,187, 0,137,137,137,248,253,247, 51, 37,158, 99,110, 89, 23,189,198,119,223,125,103,149,158,158,222,117,195, -134, 13,239,186,185,185,125, 23, 31, 31,127,209, 28,146,143, 8,169, 2,133,162,253,176, 37, 75,132,250,239,189,199,218,186,186, - 50, 2,207,147,184, 39, 79, 28,150,254,244, 83,219,180,199,143, 85,185,246,246,105,233, 90,173, 38, 50, 50, 18, 74,165,146, 72, - 36,146,198, 37, 40,252, 68, 66,200, 34,134, 33, 83, 9, 33, 80, 40,148,145,163, 71,143,190,149,255,119,149,195,135, 15,171,123, -244,232,161, 1,240, 60,207, 28,174,244, 96, 89,198, 63,207,129, 16,139,204, 17,152, 22, 22, 22,159,127,251,253, 66,139,172,180, - 12,173, 49, 55,215,228,100,109, 73,136,165, 21,155,149,153,157, 29, 27,159,172,159,249,213, 60,118,212,199,131, 63, 7, 48,214, - 92,145, 85,175, 94,189,107,251,246,237,115,118,112,112, 64, 70, 70, 6, 82, 83, 83,113,237,218, 53, 8,130,128, 62,125,250, 40, -154, 55,109,210, 96,198,204, 89,151, 9, 33,239,152, 35,182, 44,236, 29,177,184,101,253,188,198,250,121,106, 97,249,172,235,215, -189,240,152,121, 49,153, 0, 0,165, 82,249, 58, 75, 72,189,211,190,125,123, 25, 0, 12, 31, 62, 60, 43, 59, 59,123, 62,128,109, -180,140,160,170,249,152, 52,107,214, 44,143,170, 85,171,250,108,219,182, 13, 57, 57, 57, 0,224, 92,181,106, 85, 4, 4, 4,240, -161,161,161,240,247,247,135,149,149, 21,206,159, 63,143, 43, 87,174,160, 97,195,134, 86, 50,153,172,127,105, 66,171,109,231,182, -179, 20, 61,106,181, 10,104, 56, 4,150,214,110, 88,191,125, 39, 30,222,220,212, 74,111,188, 63,107,254, 56,143,193, 90,170, 24, -234,233,103, 53,173, 74,163, 54, 14, 53,106,191, 7,159,134,183, 28,117,252,133,167,179, 63,173,182, 64,162,212,109,154,251, 67, - 92,106,105, 34, 11,192,226, 62,125,250,244,219,177, 99,135, 45, 0,220,187,119, 15,137,137,137,112,114,114,130, 82,169,132, 84, - 42, 45, 92,159,180,146, 24,186,106,213,170, 66,209,198,113, 92,225, 42, 0,106,181, 26,173, 91,183, 70,253,250,245,177,127,255, -254,161, 0,166,149,144,198,150, 77,155, 54,221,234,227,227,227, 85,116,127,112,112, 48, 6, 14, 28, 8, 0,104,211,166, 77,251, -190,125,251,210, 2, 65, 24, 31, 31,159,115,253,250,245,142,148,210,171, 37, 37,136, 97, 24,109,108,108, 44,190,252,242, 75, 60, -123,246,236, 83, 66, 72, 52, 0,165, 92, 46, 47,236, 31, 19, 66,252,107,215,174,189,124,226,196,137,136,138,138, 66, 68, 68,196, -181,202, 14,165, 82, 74,121, 95, 95,223,199, 38,147,169, 17,199,113,208,106,181,232,221,187,183,210,222,222, 62,145,101,217, 7, - 41, 41, 41,131,242,125, 82,204,109,132,148, 0,150,140, 30, 61,122,204,148, 41, 83,112,230,204, 25, 28, 60,120, 16,131, 7, 15, -198,132, 9, 19, 96,105,105, 57,108,194,132, 9,151,145,183,160,121,113,180, 95,181,106, 21,120,158,255,211,179,161, 84, 42,209, -178,101, 75, 4, 6, 6,226,224,193,131,237, 81,100,125,212, 10, 54,146, 62,125,250,244,145, 11,130,128,220,220, 92,132,134,134, - 90,170, 84, 42, 75, 79, 79,207, 17, 0,254, 53, 66,203,199,199,103,244,142, 29, 59, 44,139,142,254, 40, 20, 10, 20,169, 7, 34, -254, 97,139, 86,121, 61,172, 66, 24, 12, 26,163, 68,194, 60,112,119,171,187,235,252,185,207, 10,135, 14, 1,230,129,193,160, 49, - 2, 0, 47, 80,100,105, 56,168, 20, 12,158, 39,100, 35,252, 73, 74, 73, 23,126,101,138,166, 84,229, 13, 69,147,231,160,148,194, - 96,228,161,207, 76,192,252, 16, 13,238,199,232, 96,200, 77,135,193,152,231,134,229,232,232, 40, 57,113,226,216,196,211,167,127, - 31,243,219,111,191,177, 49, 54, 54, 17,200,204,108, 80, 18,167,189,125,117, 43,137,133,106,215,234, 53,179, 85,148,125,130,200, - 23,185,168,225,217, 4,142,182, 94, 72, 72,201,197, 31, 17, 71,241,224,209, 17, 84,117,243,193,132,207,187, 40,191,253,126,219, - 78, 59,187,170,222,233,233, 79,179, 74, 75,103, 62,134,172, 61, 30, 9, 46,237, 9,248,212, 40,240,217,113,127, 22,120, 78,222, -104,216,206, 3, 78, 94,213, 21, 67, 39,204, 27, 2, 96,104, 73,156,148,210, 68,150,101, 87, 51, 12, 25, 67, 8, 65,221,186,245, - 98,150, 44, 89, 98, 44,225,154,198,186,117,235,197,176, 44,227,153,247, 98,103, 86, 9, 2,159, 88, 78, 58, 95, 17, 53,114,185, - 98, 74,158,217,223,237,101, 72, 72,136,177, 95,191,126,248,225,135, 31,228, 83,167, 78,157,233,233,233, 57,188,248,240, 94,113, -206, 62,132,120,123, 84,175,222,233,187, 63,254,160, 82,147,137,164, 93,187,150,149, 17, 31,207, 37,100,103,203,119, 63,120,208, -237,147,201,147,229, 94, 94, 94,184,120,228,136, 67,114,110, 46,205,208,235,181, 25, 25, 25,148,227,184,107,165,228,125,186,139, -139,139,122,253,250,245,254,163, 71,143,190, 21, 23, 23, 55, 61,255, 5, 49, 31, 64, 32,128,231, 69,246, 97,205,154,157,177, 35, - 70,140,136, 76, 76, 76,156, 94, 86, 58,139,160,182,179,147,179,122,251,218,205,119,237,173, 84,140,147,167, 59, 35,181,181,149, -112,114,149, 76, 0,180, 85,189,170, 91, 0,168, 93,202, 61, 59, 93,188,199,173, 82,169,246, 29, 58,116,200, 89, 42,149,130,231, -121, 56, 57, 57,225,217,179,103,200,200,200, 64,118,118, 54,158, 62,184, 15, 95, 47, 47,124, 61,109,170,219,184,169,211,246, 17, - 66, 26, 21,109,204, 74, 92, 0,217,100,252,147,101,175,148,133,200, 95,249, 54,167,220,139,225,217,139, 23, 47, 96,105,105,137, -160,160, 32,203, 63,254,248,227, 66,105, 34,171,216, 34,192,253, 91,180,104, 97,181,125,251,118, 52,108,216, 16, 54, 54, 54, 8, - 13, 13,197,189,123,247, 96, 52, 26,153,156,156, 28, 88, 89, 89, 97,193,130, 5,240,241,241, 65, 86, 86, 22, 94,188,120,225, 32, -149, 74, 29, 75,227, 12, 61, 17,250,109,102,212,217, 89, 9,228,120,151,245,219,119, 98,196, 7, 3,240,127,236, 93,117,120, 84, -199,219, 61,179,190,155,221,184, 11, 9, 26, 32,193,221, 67,144, 34, 1,138,123,209, 66,113,135, 96,197, 9, 45, 14,133, 98,197, -189, 88,113, 39, 72,112,136, 64, 32, 64, 72,136, 18,247,245,123,239,124,127, 68, 26, 66,100, 3,244,251,217,158,231,217,103,247, -238,189,251,238,220,153,185, 51,103,206,204,188,175, 3, 13,191, 99, 94,149, 44,255,174,123,203,159, 41,191, 66, 55,185,105, 93, - 75,247,218,221, 33, 18, 43, 48,113,246, 82,132,133,156,181, 84,102, 5, 77, 32,108,116, 5, 0, 83,138,218,204, 83, 68,120, 21, - 42, 84, 24,125,252,248,113,211, 66, 83, 41, 5, 49, 15, 11, 7,129, 47, 41,224,187, 33,249, 73, 8, 65, 68, 68, 4,236,236,236, -160, 80, 40, 10, 2,136,135,134,134,226,193,131, 7,200,143, 70, 81,130,205, 33,215,174, 93,171, 32,151,203,139, 94,131,228,228, -100, 48, 12, 3, 19, 19, 19,176, 44, 11,157, 78, 7,189, 94, 15,181, 90,173,240,244,244, 28, 15,224, 97,113, 54, 57,142,155,222, -191,127,255,150, 15, 31, 62,172,178,105,211, 38,104,181,218,213, 31, 63,126, 68,159, 62,125,192,113, 28,218,183,111,223,140, 82, -250,122,254,252,249, 0,128,105,211,166,233,115,114,114,126,250,146,123,207,187,127,207,190,125,251, 86,185,126,253, 58, 90,183, -110, 13,141, 70,131, 53,107,214,152,109,219,182,205,108,255,254,253,182,179,103,207,222, 13,160, 83,105, 54,243,202,107,181,131, -131,195,184, 65,131, 6,201,242, 98,152, 98,223,190,125, 88,178,100,201, 17, 0,243, 47, 94,188,184,232,204,153, 51,195, 70,143, - 30,141, 37, 75,150, 76,205, 39, 90,197,217,124,255,254, 61,108,109,109, 97,102,102,150,219, 88,234,116,120,254,252, 57,174, 94, -189,138,154, 53,107, 26,210, 17, 94, 43,133,100,237, 62,124,248,176,105,116,116, 52,110,223,190,141, 74,149, 42, 65,169, 84,150, - 25, 27,246, 91, 7,127, 46,203,166, 74,165, 82, 71, 69, 69, 41,126,249,229, 23, 56, 58, 58,194,205,205, 13, 82,169, 20,132, 16, -232,245,250, 18,195,171, 25,146,206,182,109,137, 32, 57,214,242,123,115, 11,203, 9,148, 82, 65, 70, 70,218,118, 29,210,255,124, -247,142,106,255,191,238,253, 63, 92,209,106, 64, 41,125, 86, 56,230, 97,254, 96, 68, 0, 0,231,207,159,167, 62, 62, 62, 36,255, -221,217, 25,153,201,201,150, 97,118, 14,117,142,218, 57,212,202,139,251,197,123,197,231, 91,134,217,219, 43, 51, 1, 64,199, 80, - 4,188, 74, 71,208,219,143, 8,126,251, 17,114,137, 97,226,139, 70,199,228,238,207,164, 20,234,236,191, 7,173, 58,101, 26, 52, -186,220,229, 30, 90,141, 18, 25, 73, 47, 73,191, 94, 29,165,227,198,141,133,163,163,179,109, 73,246,116, 18,233,212,137,211,186, - 90, 88, 89, 8,113,238,222, 37, 52,171,217, 11, 82,137, 16, 41, 25,106,128, 0,111,194,175, 2,156, 41, 66,194,162,208,180,150, - 9, 58,125,231,161, 56,245,231,235,153, 0, 22, 26,146, 94, 38,230, 17, 68,238, 93, 32,100,245,208, 39,191, 6,151,254, 1,144, - 59, 64, 69, 20, 72,137,255,128, 87,119, 78,228,110, 56, 45, 3, 44,203, 78,176,181,181, 77,159, 63,127,126,219,106,213,170,233, -198,143, 31, 31, 24, 25, 25,249, 73, 88,155,138, 21, 43,174,219,186,117, 43,222,190,125, 27,187, 98,197,138, 91, 73, 73, 73, 11, -202,249,128,250, 18, 66, 54,228, 77,197, 37,159, 62,125,186,161,191,191,255,212, 13, 27, 54,216, 79,154, 52, 73, 60,105,210,164, -145, 0,150,149, 54, 93, 40,151, 72, 58,172,184,125,155, 50, 49, 49,154, 3,155, 55,139,183, 4, 4,204,215,113,156,147,141,157, - 29,105,209,180,105,142, 9,143,151,156,146,144,192,216, 86,169,194,143,184,122,213,154,202,100,113, 23, 47, 94,204,204,206,206, - 46, 49,116, 14,159,207, 87, 22, 55, 93, 88, 28, 28, 29, 29,181,197,173,225, 42,165,114,103,114,148,234, 44, 42, 87,166,223,181, -111, 94,237,237,235,240,112,169,133, 5,223,189, 90,165, 26, 47, 94, 69, 60,162, 44,171, 38,132,100, 26, 98,139,207,231, 15,216, -176, 97, 67, 29, 51, 51, 51,112, 28, 7,115,115,115, 36, 37, 37, 65,171,213, 34, 51, 51, 19,218,172, 12,104, 51, 50, 16,252, 33, - 2, 45,219,182, 69,191,206,223,121,236, 63,253,215, 0, 0, 71, 74,179,235, 84,183, 65,129,146,181,180,162,245,223,115, 65,209, -233, 5,164,235,151, 6,238, 16, 41, 20,232, 56,221,247,107, 26,232,103, 98,177,248, 66,239,222,189,187,206,156, 57,147, 23, 31, - 31,127,137, 16,210,146, 82,250,178, 84, 69, 88,161,168,154,156,156,140,172,172, 44,152,155,155, 99,195,134, 13,176,183,183,135, - 82,169,196,227,199,143,169,139,139, 11,185,121,243, 38, 92, 92, 92,144,156,156, 12,157, 78,135,156,156,156,143, 90,173,182,196, -233,242,188,233,193, 46,211,187, 56, 94,124,253,116, 95,107,103,242,254,113,255, 25, 94,111, 95, 7,191,138,186,114,245,222, 50, - 70, 45,141, 78,143,185, 54,167,114,227,103, 54, 19,102, 45,193,111,171, 23,225,245,195,219,169,246,174,153, 91,100, 68,179,183, -105,199,146,211,155,147,147,163,126,245,234,149,105, 96, 96, 32, 8, 33, 48, 55, 55,135,137,137, 73,177,100,235, 11, 26, 75, 94, -161,255, 65, 78, 78, 14, 68, 34, 17,172,173,173,177,107,215,174,130,142,183, 82,165, 74,165,153,217,222,177, 99,199, 1,174,174, -174,166,133,191,108,220,184, 49,198,142, 29,139,223,127,255, 29, 1, 1, 1,159,196,211,252,248,241, 99,188, 94,175,223, 91, 74, -217,166, 19, 66, 58,247,234,213,235,233,157, 59,119,204,118,237,218, 5,134, 97,138,125,237,220,185, 19, 15, 30, 60, 88, 72, 41, -125,245,133, 29, 70,205, 62,125,250,220, 62,120,240,160, 69, 82, 82, 18,146,147,147,145,157,157,141,156,156, 28,176, 44,139, 26, - 53,106, 16,134, 97,106,148,149,143,124, 62,255,244,230,205,155,187,255,248,227,143, 16, 8, 4,208,106,181,216,188,121, 51,230, -204,153,147, 0, 96, 56,165, 84, 71, 8,153,191,119,239,222, 97, 61,122,244, 64,189,122,245, 60, 74,179,153,157,157,141,236,236, -108, 8,133, 66, 56, 56, 56, 96,249,242,229,208,106,115,155,149,234,213,171, 23, 76,121, 2,216, 94,189,122,245,238, 97, 97, 97, -107, 40,165,191,150,208,206,244,162,148,142, 97, 89, 54,171,119,239,222,214,135, 15, 31, 54,141,141,141,197,211,167, 79,177,112, -225,194, 52,142,227, 88,142,227,136, 74,165,122,111,111,111,255, 84, 34,145,200,148, 74,101,106, 74, 74,202, 74, 74,233,165,127, - 97,103, 78,132, 66, 33, 70,141, 26, 5,129, 64, 0,153, 76, 6,181, 90, 13,189, 94, 95, 64,230, 81,206,105,105,119,119, 83,107, - 1, 68, 63, 86,175,222,102,106,191, 41,221,108, 29,157,156, 97, 97, 38, 65,104,232,203,150, 55,174, 95,221,236, 89,195,118, 27, -167,213,111,123, 21,145,254,143, 7,187, 47,202, 69,254,195,184, 86, 3, 0,207, 80, 40,230, 33,242,118, 33,150,208, 18,245,101, -109,108,254, 76,142,141, 21,235,196, 98,147,176,124,149, 43,151,100,245,101,129,195, 96,116,250,188,134,130,230,189, 12, 36, 90, -122, 22,111, 95,135,224,206,149,191, 96,163,140, 69,242,251,250,128,168, 14,180,170, 12,168,181,186,188,209, 27,139,192,167,215, -145,153,145,138,218,141,186, 1, 60,222,131,146,236,153, 91,147,110, 45, 26,214,229,191,141, 10, 65,227,234,125, 81,197,165, 53, - 62,196,103, 34, 61, 91,131,180, 76, 53,234,215,246, 69, 82,154, 10,153, 74, 53, 94,190,221, 15,103,167, 42, 60, 34, 8,111,111, - 40,209,210,188, 60, 9,205,171, 51, 16,185,181,132,184, 70, 15,240,221, 90, 33, 42,232, 38, 2, 47,174, 71,204,139,187,160, 28, - 11,199,234, 77, 12,125, 72, 54, 95,186,116,169, 73,203,150, 45, 5, 29, 58,116,168,231,228,228, 84, 47, 46, 46, 46, 48, 79,205, -169,215,181,107,215,122,182,182,182,216,184,113,163,138, 16,178,249, 11, 59,219,194,211,109,143,236,237,237, 87,156, 60,121,114, -243,216,177, 99, 97,103,103, 87,167,180,223, 38, 9,133,245,134,175, 92, 73,133,124, 62, 61,242,219,111,162, 37,151, 46,173,221, -179,119,175,168,157,183, 55,161,148,226,249,243,231, 38,191,252,246,155,201,224,239,191,143,252,144,152,200,248, 7, 4,232,226, - 99, 98,178, 18,115,114,150,196,197,197,125,252, 87,212,108,189, 94,127,255,125,196,123,231, 70, 77,235,219, 62, 11,125,255,162, - 83,187, 22, 45,120, 60, 30,239,117,248,135, 0, 91, 91, 51,147,171, 87,174,234,244,122,253,125, 67,108, 73, 36,146,110,237,218, -181, 19,164,165,165,193,201,201, 9, 73, 73, 73,136,141,141,205, 85, 28, 50,210,160,203,200,128, 62, 51, 29,108, 78, 54,222, 63, -126,132,250, 85, 42, 75,142,231, 46,150, 63, 82, 70,153, 20,171, 84, 21, 86,182,196,166,166, 16, 43, 20, 32,229,156, 54, 36,132, -124,111, 97, 97, 49, 39, 61, 61,253, 2,165,116,185, 78,167,155, 56,103,206,156,198,155, 54,109,178, 89,177, 98,133,217,152, 49, - 99,142, 19, 66,234, 83, 74, 53,165,116, 96,239, 24,134,177, 1, 96,119,253,250,117,216,217,217, 33, 35, 35, 35, 95,105,209, 42, -149, 74,105, 74, 74, 10, 52, 26, 13,180, 90, 45,204,204,204,240,228,201,147, 52,134, 97,254, 42, 43,125,102, 85,201,114,141, 46, -116,129,181,135, 60, 78,199, 88,122, 37,166,114,105,139,214,196, 45, 5,176,182, 75,213,170, 59,117,220,237,247,111, 66,206, 90, - 70, 60,190,149, 26,247, 38,167,202,206,243,225, 89,165,228, 35, 37,132,112,132, 16, 90,189,122,117, 36, 37, 37,129,207,231,195, -196,196, 4, 10,133, 2,115,231,206,197,230,205,155,203, 77,180, 8, 33, 82,185, 92,190,146,199,227, 13, 48, 55, 55,183,101, 89, - 22,190,190,190,232,222,189, 59,196, 98, 49,116, 58, 93,129,162,153,175, 82,149,166,116, 80, 74,159, 3, 48, 43,242, 31,222, 54, - 54, 54, 55, 52, 26, 13,194,195,195,113,250,244,233,182,148, 82,255,114, 62,219,225,132,144,206,173, 90,181,218,215,176, 97,195, -170,148, 82,212,169, 83, 7, 3, 7, 14,196,254,253,251, 17, 24, 24,136,140,140, 12,238,234,213,171,123, 0,172, 41,111, 7,158, -151,191, 53,250,244,233,115,247,208,161, 67,150, 41, 41, 41, 80,169, 84,200,201,201,193,241,227,199,209,178,101, 75,216,216,216, -224,224,193,131, 12,165,244,108,105, 36,139,199,227,237,218,182,109, 91,247,209,163, 71, 99,203,150, 45, 56,114,228, 8,122,244, -232,129, 1, 3, 6, 32, 41, 41,201,126,245,234,213,195, 8, 33,187, 0, 44, 26, 56,112, 32,178,179,179,241,248,241,227, 80, 3, -159,121,164,167,167, 35, 61, 61, 29, 50,153,172,240, 51, 70, 0,236, 95,191,126,253,160,169, 83,167,162, 74,149, 42,139,242, 54, - 5,125,182, 75,148,227,184,159, 98, 99, 99, 45, 5, 2,129, 53,195, 48,136,142,142,198,147, 39, 79, 48, 97,194,132,212,212,212, -212,177,148,210, 15,132,144,249,163, 70,141, 90, 62,125,250,244,130,186, 52,125,250,244,115,132,144,206,255,223,106, 78,141, 26, -150,181,196,124,201, 20,145, 72,104,157,150,150, 86,208,118,104,181, 90,104, 52,154, 79,148, 44,145, 72,104,221,164,129,219,121, -149, 50,107,222,139,176,180, 18, 3,164,123, 86,179,168,107, 34, 55,159,234,211,185,223,144,239, 58,247,228, 51,122, 61, 46, 95, - 62,139, 63,254,216, 10,239, 86,213, 81,165, 90, 29, 76,154, 60,197, 92,163,101,124,175, 94,189, 52,167, 69,147,202,151,178, 50, -211,231,150,102,243,127, 28,231,243,200,213,249, 98,167, 14,139,103,144,125, 89,103,103,164,229, 61, 56, 54,150,150,150,191,177, - 44,235, 13,252, 8,161,194, 1, 47,159, 60, 68,106,154, 16, 26, 21, 11,142,230,146, 45,131,136,139, 70,139,219,151,207, 96,195, -250,181, 72, 73, 73, 65,171, 54,109,145, 45,168, 0,215, 10,174, 80,171,148,121, 15, 13,160,211,234, 97,107,239,134,103,207, 2, -245,153, 57, 57, 37, 54, 72, 34,169,206,195,213,190, 58, 52,186,230,144,138,197,200,200,210, 34, 45,143,100, 29,252,179, 63, 52, - 74, 21, 24,173, 14,140, 86, 15, 91,215, 62,168,105,223, 14, 28,123,182, 86,185,178,143, 99,161,139,184, 13, 93,196,109,200,154, - 79,198, 95,126,131,138, 52,128,134,197,221, 77, 76, 76, 76,116,114,114, 58,251,252,249,243, 94,253,251,247,199,205,155, 55,199, - 0, 24,151, 55,125, 51,166,127,255,254,120,254,252, 57, 94,188,120,113, 54, 49, 49,241,155, 4, 94, 21,139,197, 42,141, 38,183, -143, 53, 49, 49,145,150,113,173,115,227,222,189,121, 25,207,158,101,174,191,119,111,209,206, 93,187, 68, 29,218,183, 39,122,134, - 1,199,178,168,230,238, 78,190,251,238, 59,249,254, 99,199,172,249,122,253,131, 89, 19, 39, 94,255,125,232,208,172,135,217,217, -134, 46, 52,175,152, 55,101, 8, 0, 21, 75,249,206, 96,104, 52,154, 77, 63,253, 56,162,131,255,237,187, 21, 92, 43, 56,155, 93, -190,234, 31, 40,145,137,121, 85, 42, 85,229,167,101,164, 10,150, 46,154, 39,211,104, 52,134,146, 86, 15, 27, 27, 27,124,252,248, - 17,111,223,190,133, 70,163,129, 94,175, 7,167,204,129, 54, 45, 29,218,140, 84, 16,181, 10, 18,150,133, 58, 57, 1, 21,171, 84, - 6,254,222,145, 88,230, 84, 84,113, 68, 43,255, 93,106,102, 6,145, 92, 1,158, 80,104,112,112,116, 66, 72,195, 38, 77,154, 28, - 59,113,226,132,104,228,200,145, 77, 9, 33,191,229,117, 16,237, 23, 46, 92,248,232,183,223,126,147,140, 29, 59,182,198,154, 53, -107,134, 1,216, 94,146, 29,181, 90,125,236,252,249,243,131,221,220,220,236,130,131,131,161, 86,171,193,113, 28,186,116,233, 2, - 0, 5,117,230,245,235,215, 42,181, 90,157, 24, 18, 18,146,249,225,195, 7, 45, 12,216, 37,184,104, 99,220,253,233,253, 92,122, -219, 59, 56, 63,144,202, 42, 86,162,217,207,122, 77,239,231,178,122,221,241, 24,245,197,119,239,178, 22, 78,168,178, 42, 39, 43, -104,130,133, 75,246,150,139,103,195, 13,217, 21, 76,243,183,179, 91, 91, 91, 67, 32, 16, 64, 40, 20, 66, 36, 18,129, 16,130,201, -147, 39, 99,199,142, 29,165, 78, 29, 22, 37, 89,166,166,166, 47,150, 44, 89,226, 50,118,236, 88,145, 84, 42, 69, 90, 90, 26, 14, - 30, 60,136, 81,163, 70,225,143, 63,254, 40,118,253, 75, 89, 83, 74,197,168,165, 83,135, 14, 29, 10,173, 86,139,129, 3, 7, 98, -231,206,157, 83, 1,248,151,183,190, 83, 74, 31, 16, 66,220, 3, 3, 3,205, 0,244, 24, 48, 96,192,222, 62,125,250,192,223,223, - 31,103,207,158,109, 11, 32, 12,128, 10,128, 95, 94, 16,103,191,210, 54,130,228,185,112,216,106,107,107,219,163, 86,173, 90,129, -125,250,244,169,125,232,208, 33,139,196,196,196,252,205, 15,136,136,136,192,238,221,187,227,119,237,218,149,201,178,172, 53,143, -199, 59,159,158,158, 62,183,148,233,194, 93,235,215,175, 31,145, 55, 29,136, 19, 39, 78,208,181,107,215,146,133, 11, 23, 34, 45, - 45, 13,222,222,222,216,182,109,219,148,236,236,236,122,107,215,174,253,177, 95,191,126, 88,186,116, 41,114,114,114,214,151, 53, - 88, 41,133,124, 17, 0, 45,214,175, 95,239, 54,117,234, 84,156, 56,113, 2, 13, 27, 54,148,189,127,255,254,119, 0,163,139, 43, - 63, 74, 41,222,191,127, 15,165, 82,137,187,119,239, 98,209,162, 69,105,133, 72,214,148,113,227,198, 45,159, 50,101, 10, 86,174, - 92, 73,131,131,131, 19,251,244,233, 99,191, 99,199, 14,126,181,106,213,166, 32, 55,232,250,255, 11,106,186, 91,175,106,210,216, -107,142,163,115, 53, 28, 60,116, 24,169,169,169, 5,121,146,159, 47,148, 82,100,101,101,225,227,199,143, 48, 55, 51,197,234, 53, -203,187,142, 31, 51,162, 2,114,221, 96,124,222,208, 85,181, 90,211,119,224,232, 25, 3, 7,143, 64,112,224, 83,236,223,187, 29, - 33,193,207, 11,236, 49,122, 29,194, 66,159, 32, 44,244, 9,236, 29,220,240, 93,135,182,100,208,160, 65, 93,134, 14, 30, 96, 11, -224, 31,115, 29,241, 31,172,102,125,230, 71,171,240,154, 45, 65, 89,114, 93, 30,201,122,113,244,232, 81,235, 86,173, 90,241, 25, -134,193,165,203,151, 49, 97,220, 15, 24, 54,212, 23, 58, 88,130,209,138,192,137,164, 6, 37, 70,165, 82,130,130, 34, 39, 39, 7, - 1, 1, 1,160, 28,131,253, 59,214,130, 82,174,128,104, 1, 20, 90,157, 14,206,174, 53,176,117,231, 10, 6, 66,225,163,146,236, -101,166,240, 89, 61, 67, 17,155, 24,133,168,248, 16,152,155,186, 66, 32,116, 69, 74,186, 18, 2,158, 3,244,234,215, 96,243,100, - 85,101, 78, 12, 84,186,175, 43, 63, 54,227,115,245,148,150,163,209, 85,169, 84, 7, 14, 28, 56,208,117,221,186,117, 98, 31, 31, -159,234, 78, 78, 78, 45, 0,160,111,223,190,213,205,204,204,112,224,192, 1,173, 74,165, 58,240, 13, 21,159,118, 77,154, 52, 65, - 90, 90, 26, 34, 34, 34, 2, 75,189, 55,173,214, 90, 97,103,199, 79,188,121, 83,159,148,150, 86,161, 93,187,118, 68,207, 48,224, - 17,130,212,140, 12,124,136,140,132,133,133, 5,121,241,250,181, 98,243,164, 73,167,170,215,174, 45,200,223,145,104, 8,206,158, - 61,107,130,220,117, 89,165,126, 87,206,202,157, 67, 8, 25, 49,113,226,196, 83, 7, 14, 28, 52, 79, 72, 76, 8,147,136,197,140, - 66, 33,117, 26, 58,100,188, 32, 61, 61,125, 48,165, 52,219, 80,123,105,105,105,120,255,254, 61,100, 50, 25, 68, 66, 33, 56,149, - 18,108, 78, 54,212,169, 73,224,235,180, 16,179, 44,172, 76, 36,168, 96,111, 15, 87, 91, 27,131,108,190,189,113,165, 96,225,123, -225,233,194,213, 77, 60, 32,150, 43, 32, 54, 85, 96,252,185, 91,121,163, 81, 17,176,112,153, 33, 36,203,198,217,217,249,175, 67, -135, 14,137,146,146,146,240,252,249,243, 64, 74,105, 6, 33,196, 20, 0, 23, 26, 26,122, 45, 36, 36,164, 91,222,174,187,178,118, -139,173, 61,121,242,100,199, 86,173, 90, 49,149, 42, 85,146, 39, 36, 36,184,166,164,164,144,248,248, 79,215, 58, 95,184,112, 65, -170, 82,169,114, 56,142, 59,133, 92, 63, 80,101,250, 47,154,222,207, 69, 26,240, 12,147,189, 58, 85,172, 99,102, 83, 23,169,204, -179, 58, 15, 2,227, 39, 79,239,231,178,105,221,241, 24,181,140,104,246, 18, 54,186,130, 64,170,222,103, 96,121, 83, 27, 27, 27, -132,134,134, 34, 32, 32, 0, 31, 62,124,192,251,247,239, 63, 33, 84, 99,198,140,193,254,253,251, 13, 82,180,228,114,249,202,197, -139, 23,187, 76,157, 58, 85, 84,136, 20, 97,226,196,137,200,200,200,192,206,157, 59, 49,113,226,196,114,119,252, 69,202,170,114, -199,142, 29,125, 28, 29, 29,145,146,146, 2, 7, 7, 7,180,106,213,170, 59, 33,164, 18,165, 52,226, 11,171,254,248, 78,157, 58, - 45, 95,178,100, 9,244,122, 61, 70,141, 26,133, 55,111,222, 28,123,243,230,205, 6, 87, 87,215,201,179,103,207,182,183,183,183, - 71,255,254,253,229, 0,122,151,100,196,202,202,202,111,251,246,237,131,125,124,124,120, 58,157,174,205,141, 27, 55, 16, 25, 25, - 9,173, 86, 11,134, 97,240,238,221, 59, 76,156, 56, 49, 62, 37, 37,197,139, 82,250,206,128,116,141,156, 63,127,254,136,201,147, - 39,227,151, 95,126,193,226,197,139,247,152,155,155,215,174, 95,191,126,131,197,139, 23, 99,214,172, 89,112,115,115,131,181,181, -117,205,133, 11, 23,122, 76,159, 62, 29,155, 54,109,194,162, 69,139,246, 0,216,253, 37, 25,193,113, 28, 89,181,106, 85,189,245, -235,215, 59,230,147, 44, 30,143,135,163, 71,143,226,217,179,103,221, 75,248,205, 54, 7, 7,135, 49,142,142,142,226,171, 87,175, - 42,220,220,220,192, 48,140, 62,143,100,109,118,117,117,157,240,238,221, 59,248,248,248, 32, 60, 60,252, 0,165,116,152,151,151, - 87,206,244,233,211, 77,100, 50,153,249,255,103, 7,206,231,145,225, 43,151,206,194,227,103,175,113,242,164, 8,143, 31, 63,134, -189,189, 61, 36, 18, 9, 40,165,208,104, 52, 72, 74, 74,130, 94,167, 65,157, 90,149,177,111,215, 42, 36, 38, 38, 1, 60, 82,226, -146, 27,194, 35, 67, 70,252,208, 11,119,238, 94,198,239,191,111, 71,118,118, 78, 9,131,111, 41,170, 85,247,128,179,147, 29,162, - 99,162, 65,120,176,249, 39,239,245, 63,124,234, 48,255,121, 55,204,189, 67, 97, 88, 88, 88,108, 56,114,228,136,181,183,183, 55, - 63, 39, 39, 7, 28,199,161,117,171, 86,152, 60,117, 42,206, 30, 58, 4,247,166, 3, 65,180, 10, 48, 38,134,237,122, 80,171,148, -240,108,208, 2,253,250, 15, 64,212,135, 15,232,212,173, 15,212,106,101,193, 8, 35, 95,209,210,106,117,176,177,171,128, 43, 87, -174,240, 49,106, 84,137,107, 76, 88,157, 56, 40,236,157,186,101,186,234, 25, 2, 30,239,135, 78,163, 67,157, 58, 11,161,227,172, - 97,231, 50, 6,122,253,105,100, 38,221,200,157,198,176,246, 70, 76, 84, 20,120,124,209,139, 47,205, 68, 46, 39,233,171, 26,221, -244,244,244, 12, 39, 39,167, 63, 3, 2, 2,134,244,238,221, 27, 87,174, 92,249, 17, 0,122,247,238,141,128,128, 0,188,127,255, -254,207,244,244,244,140,111, 81,224, 78, 78, 78, 61,188,189,189, 7, 54,110,220, 24,231,206,157, 3,165,244,142, 65, 15,182, 80, - 72,121, 60, 30, 56,142, 3, 1,144,146,158,142, 55,111,222, 32, 37, 57, 25,122,189, 30, 57,217,217,156, 71,245,234,217,148,227, - 76,203,147,158,194, 59, 12, 81,204,174,195,252,239,190,128,108,125, 80, 40, 20, 81, 89,217,217,182,150, 22,150, 89, 98,177,152, - 77, 75, 79,207,120,249, 34, 88,107, 96,231,144,143,208,144,144,144,218,113,113,113,136,138,138, 2,147,147, 5,190, 70, 11,158, - 70,137,246, 45,154, 67, 6, 10, 41, 56, 8, 57, 61,132,124, 33,178,114,119,231,149, 57,221,145, 79,244, 11, 43, 91,132,144,220, -233, 66,185, 28, 98,133,233, 39, 10,151, 33,245, 73, 34,145, 28, 58,126,252,184,163,179,179, 51,150, 46, 93, 10, 23, 23,151,154, -117,234,212, 81,182,110,221, 90,102,111,111, 15, 79, 79, 79,180,104,209, 2, 23, 47, 94, 4,128,119,101,228, 31, 67, 8,249,238, -206,157, 59, 51,238,221,187,215,143, 16, 66,124,125,125,209,185,115,103, 72,165, 82, 40,149, 74,164,165,165, 97,199,142, 29,132, - 82,218, 32, 47,173,110, 82,169,244, 48, 33, 36, 70,165, 82,245, 47,106,115,255,250,186, 78,137,169,220, 40,123, 7,231, 94, 94, -157, 42,214,105,215,169, 3, 42,187,183, 67,187, 78, 81, 0,176,202, 74, 16, 57,112,245,130,218,167,108, 42, 88,237,190,114,233, -234,162, 86, 94,237,230,251,142,181, 92,190,106,123, 90,166, 1, 13, 25, 56,142,251,196,119, 80,209,243,195,134, 13,195,209,163, - 71,203,204, 71, 30,143, 55, 96,236,216,177,162,194,223,229, 79, 25,119,235,214, 13,189,123,247,254,132,104,217,216,216,192,193, -193, 1,145,145,145, 0,144, 98, 96,189,154, 60,114,228, 72,162, 82,169, 48,122,244,104,236,220,185, 19, 3, 7, 14, 36,254,254, -254,147, 1, 76, 45,111,125,231,241,120,171,103,207,158, 61, 99,226,196,137, 72, 77, 77,197,133, 11, 23,208,165, 75, 23, 28, 61, -122,212,246,194,133, 11, 43,189,189,189,193,231,243,113,238,220, 57, 48, 12, 83,170,175, 47,145, 72,212,195,199,199,135, 23, 29, - 29, 13,145, 72,132, 70,141, 26, 33, 38, 38, 6, 74,165, 18,177,177,177,152, 50,101,202,199,148,148,148,182,134, 62, 71, 34,145, -104,234,228,201,147,113,228,200, 17,248,250,250,238, 5, 48, 58, 35, 35,163,223,189,123,247,142,124,255,253,247,136,141,141,197, -169, 83,167,176,104,209, 34, 50,108,216, 48,108,217,178, 5, 83,166, 76,217, 3, 96,116, 41, 59, 36,179, 18, 19, 19,205,171, 86, -173,138,132,132, 4,100,103,103,227,212,169, 83,118, 23, 47, 94,172,228,236,236,108,246,254,253,123,118,217,178,101,226,169, 83, -167, 98,195,134, 13,120,254,252, 57,246,239,223,143,118,237,218, 49,225,225,225,197,170,100,121, 46, 27, 78, 89, 89, 89, 93,149, -203,229,200,202,202,202,223, 89, 58,211,215,215,119,162,159, 95,174,200, 30, 23, 23,135,225,195,135, 15, 37,132,112, 75,150, 44, - 49, 17,137, 68, 80,171,213, 57,255,159, 29, 55,199,114, 0, 56, 84,170,160,192,229,179,187,240, 52, 48, 28, 79, 3, 67, 32,150, -228, 46,130, 87,169,148,104, 80,167, 26,154, 54,106,130,184,248, 88, 28,216,191, 11, 86, 54,206,165,182, 35,148, 82,136, 4, 44, - 60,170, 59,224,208,254,237, 56,119,225, 58,246, 31, 56, 92,176,230, 77, 32, 16,162,126,131,166,104,212,168, 21,194,223,191,195, -174, 93,191,195,214,174,130,113,114,240, 11, 81, 48,117, 88,248,189, 8,243,111,215,170, 85, 43,126,118,118, 54,212,106, 53, 62, -126,252,136,200,200, 72, 88, 88, 90, 32, 60, 46, 2,109, 77,116,248,200,101, 34, 52,240, 5, 75,248,194,231,101, 74,131, 94,245, - 1,175,250,152, 48,114, 96,201,149, 0, 20,114, 51,155,220,169, 27,134,121,139, 77,155, 74, 28, 57, 51,172,254,218,229,171, 55, -154,140, 28,214, 67,120,229,198, 78,232,181, 28, 84,122,115,228,168,181,200,209, 9,193, 51,239, 2, 36,251,131, 47,144,160, 89, -189,106, 56,117,242,162,142, 50,250,235, 6,103,144,125,109, 48, 9, 33,133,136,214,167, 51,122, 82, 83, 43,131,167, 14, 11, 58, - 94,150, 61,122,240,224,193,158,205,155, 55, 55,241,246,246,174,154,215,113,234, 14, 30, 60,168,100, 89,246,104,121, 11,177,168, - 55,120, 71, 71,199, 6, 34,145,104, 96,143, 30, 61, 26,140, 24, 49, 2, 47, 95,190,196,129, 3, 7,194,170, 85,171, 86,170, 15, - 49,190, 88,156,146,157,152,104,161,168, 84, 73, 96,105,106, 26,119,241,194, 5,183, 14, 29, 59,146,168,168, 40,164,164,164, 64, -173, 86,227,121, 96, 32, 21,242,249, 49,196,204,140,247,250,217, 51, 30, 95, 44, 78, 41, 71, 82, 35,203,216,117,232,247,165,234, - 86, 5, 71,203,170,139,124,127,170,172,214,168,107,103,102,102, 50, 2,161, 80,232,226, 96,241,161,156,211,144,231,174, 93,187, -214,179, 67,135, 14,146,176,160,231, 96, 50, 50,160,205, 72,131,136, 99, 97,213,160, 30,248, 58, 13,160,213,195,217,131, 66,157, -110, 2,255,135,175,245, 26,141,166, 76,167,134,249, 68,139, 87,132, 24,136, 21, 10, 72, 76,205, 32, 81, 40,138, 18, 6, 82, 70, -121,155,244,232,209,163,125,179,102,205, 64, 41,197,142, 29, 59,160,211,233,196, 58,157, 14, 90,173, 22, 58,157, 14,153,153,153, -216,191,127, 63,182,110,221,122, 15,192, 30, 3,200, 42, 35, 20, 10, 39, 50, 12, 99, 39,145, 72,116,182,182,182,162, 99,199,142, - 21,184,155,168, 95,191, 62,228,114,185,134, 16,162, 3, 0, 7, 7, 7,253,222,189,123, 5,223,127,255,189,168, 56,123, 53,234, -212,156, 85,153,177,244,146,202, 42, 86, 50,179,169,139,202,238,237, 0, 0, 29,187,141, 68,229,106,174,200, 76, 14,170,164, 86, - 69,246, 18, 9,210, 44, 95,108,138,125, 41,243,169, 61, 34, 39,241,214, 27, 20,191,189,191,216,142,130,199,227,149, 56, 29,107, - 8,201, 34,132,240,204,205,205,109,243,215,249,228,117,192,136,143,143, 71,104,104, 40,106,212,168,129,212,212, 84, 56, 59, 59, - 67,171,213,162,113,227,198, 80,169, 84, 88,191,126, 61,238,222,189,123, 15,121, 59, 35,203,248, 15,153,187,187,251,240, 6, 13, - 26,224,194,133, 11,120,252,248,113,236,229,203,151,157, 91,181,106,133, 74,149, 42,141, 32,132,204,163,180,100, 31,124,197, 77, -245,181,105,211,102,210,196,137, 19, 17, 18, 18,130,159,126,250, 41, 37, 58, 58,250,212,177, 99,199, 70, 47, 90,180,136,215,169, - 83, 39,196,199,199, 99,245,234,213,236,221,187,119,215, 0, 88, 90, 70, 62,190,138,142,142,118, 81,171,213, 72, 77, 77, 5,195, - 48, 80, 42,149,184,120,241, 34,246,239,223,159,144, 71,178,222, 26,154,190,122,245,234,121,242,120, 60, 28, 57,114, 4, 0, 22, - 80, 74, 57, 66,200,169, 94,189,122,197, 46, 91,182,204,121,238,220,185,248,241,199, 31,161,211,233,240,203, 47,191, 96,238,220, -185,231,243, 72, 86,105,141,232, 58, 7, 7,135, 49, 63,253,244, 83,205,233,211,167, 35, 32, 32,192,238,201,147, 39,141,158, 63, -127,142, 10, 21, 42, 32, 37, 37, 69, 96,109,109,141, 13, 27, 54, 96,218,180,105, 39, 0, 36,223,191,127,127,192,251,247,239,253, - 40,165,171,203,200,207,109,206,206,206, 99, 40,165, 84,169, 84, 70,250,250,250,174, 94,177, 98, 5,166, 77,155,134, 23, 47, 94, - 32, 35, 35, 3,166,166,166,100,246,236,217,195, 23, 44, 88,128, 81,163, 70,209,156,156,156,173,255,255,211, 82, 44,148,105, 33, - 96, 53,150,168, 95,167, 6,234,215,174,136,203, 55,158, 2, 0,218,247,105, 5,101, 78, 22,246,238,221,129,183,111,223, 64, 32, - 20,194,194,202,193, 16, 37, 16,218,204, 87, 72,215,197,163,131,119, 35,116,233,212, 22,123,246, 29, 5,163,215, 97,244,200,193, - 72, 75, 79,199,190,125,187, 16,254,254, 29, 4, 66, 33,172,109,254,121, 71,168,165,113,145,255,120,162,101,192,244, 19, 56,142, - 67,108,108, 44,158, 60,121,130,136,136, 8,152,152,152, 64,197,176,220,239,215,238,114,132,136, 98, 56, 74,239, 81,166,192, 75, -241,231, 54, 88, 54,182,144,199, 90,115, 75, 75, 75,177, 70,163, 2,195,232, 11,245, 42, 4, 32,128, 72, 0, 56, 58, 85, 70,116, - 84, 52, 85,171,213,183, 74, 29, 65,105,212, 27,206,156, 58, 62,177, 69,203, 86, 54, 93,218, 47,193,169,211, 11,145,150,153, 9, -181, 78,136, 28,181, 14, 74, 53, 96, 97, 85, 29,141,235,212, 69, 92, 92, 10,130, 30,251,103, 11, 52, 74, 67, 22,138,190,217, 60, -127,164,251,200, 9,179, 32,115,107, 9, 77,232, 41,112,217, 9, 5,138,150, 84, 97, 9, 43, 87, 15,164,231,104,112,252,250, 83, - 0, 48, 56,212, 75, 66, 66,130,210,201,201,233,224,196,137, 19,127,121,250,244,137, 11, 0, 60,125,250, 52, 38, 62, 62,126, 78, - 66, 66,130,178, 60, 5, 88,200, 27, 60, 49, 49, 49,121, 90,173, 90,181, 56, 31, 31, 31,243, 94,189,122,193,198,198, 6,207,159, - 63,135,159,159,223, 43,157, 78, 55,235,214,173, 91,165, 78,245,104,181,218,216,167,167, 79,155,181,253,225, 7,139, 89,221,187, -175,158, 56,113,226,134,165, 75,151, 10,221,221,221,137, 94,167, 67,112,112, 48, 61,116,240,160,126,235,220,185,235,197,114,185, -224,209,153, 51, 66, 70,163,137,253, 87, 87, 98, 23, 23, 23,175,174,157,189, 60,214,172,219, 4,181, 42, 27, 15, 3,206, 35, 45, - 45, 9,219,119,156,244,112,113,113,241,138,137,137,241, 55,148, 0,239,222,189,123, 70,211, 6, 13, 26, 84,169, 80, 1,193, 31, - 34, 32,230, 88,136, 24, 6,124,157, 6, 60, 70,141, 10,181, 41, 8,207, 20,241, 31, 51,177,226,200,159, 33,134, 16,227,154, 93, -123, 96,105, 76, 6, 8, 33, 88,219,188, 54,196,166, 10,136,228, 10,140,255,235, 70, 1, 49, 56,183,116, 46,196, 10, 5,170, 54, -109,101, 64,163, 75,149,166,166,166, 79,130,131,131, 27,215,174, 93, 27, 51,102,204, 64,100,100, 36, 56,142, 67, 66, 66,130, 58, - 62, 62, 62, 54, 41, 41, 41, 18,185,254,127,118, 82, 3, 71, 2, 12,195,216, 61,125,250, 20, 0, 68, 0,112,253,250,117, 56, 57, - 57,193,220,220, 28,153,153,153,152, 53,107,150,228,231,159,127, 6, 0, 60,121,242, 68, 88,152,160, 20, 69,240,211,208, 53,233, - 89, 52,141,102, 63,235,149,202, 60,171,211,174, 83, 52, 58,118, 27,129,171,231,246,224,198,229,107,176, 18, 68, 70, 64,158,117, - 49, 57, 34, 57, 51, 38,199,125,155, 71,195,209,252,248,156,203,219, 38,127,111,201,119,116,228,142,251,110,205, 72, 47, 45,173, -238,238,238,176,183,183, 47, 88,163, 37, 16, 8, 48,106,212, 40, 80, 74, 13, 34, 89,121,249,200,153,153,153, 37,169,213,106,123, -169, 84,138,143, 31, 63,226,221,187,119, 8, 15, 15, 47,112, 29,192,113,156,126,230,204,153,194, 73,147, 38,225,247,223,127,199, -173, 91,183,238, 1, 88, 66, 41, 53,116,176, 54,184,127,255,254,166, 90,173, 22,135, 15, 31,102, 0,116, 59,126,252,248,147,198, -141, 27, 11, 58,119,238,108,186,101,203,150,193, 0,118,150,163,186,203,205,204,204, 68, 58,157, 14, 91,182,108, 65,116,116,180, - 23,165, 52,148, 16,178,173,127,255,254, 91,107,215,174, 93, 45, 36, 36,228, 77,118,118,246,120, 74,105,144, 1,109,209,200, 70, -141, 26, 29,231, 56,206,173, 67,135, 14,242,117,235,214,153,189,126,253, 26, 46, 46, 46,224, 56, 46,184,188, 33,172,222,188,121, - 19, 26, 31, 31,239,209,182,109, 91, 92,188,120,113, 21, 33,100, 37,128, 95,198,141, 27,231,252,225,195, 7, 52,104,208, 0, 86, - 86, 86,120,253,250,117, 86,124,124,252, 86, 0,243,202,242,245, 69, 41,125, 15, 96, 14, 33,164,238,182,109,219, 6, 90, 89, 89, - 53,123,254,252, 57,238,220,185,131, 53,107,214,224,231,159,127, 70,235,214,173, 49, 99,198,140,100, 0, 3,243,166,180, 13,242, -155,151,175,108, 1, 64,163, 70,141,226,252,252,252, 48,122,244,104,250,199, 31,127,108, 60,120,240,224,212,193,131, 7, 23,244, -129,195,135, 15,167, 7, 14, 28, 24, 94,218, 70,128,127, 8,122,157, 78, 11, 51,171,202,200, 78,143, 66, 82,116, 0, 76, 76, 29, -208,169, 93, 61, 40, 85, 90,156, 61,115, 2, 65,193,129,224,241,120,176,119,168, 0, 11, 75, 27,132,133,189, 1,128,151,165,219, -212,193,212,178, 34,178, 51,162,161, 77,124, 10,153,194, 14, 35,126,232, 5,165, 74,135,147,167, 78, 32, 36, 36, 8,124, 62, 31, - 14,142, 21, 96,110,145,107,147,208, 82,109, 26,129,226,253,105,149, 73,180,248,124,254,205, 75,151, 46,245,109,218,180,169,224, -237,219,183,120,251, 54,119,112,147,150,150,198, 16,176,127, 38, 4,157, 30, 84, 10, 9,232,144,191, 59,163,112,236, 66,133,169, -105,236,235, 87,161,246,105,169, 9, 8,124,118, 23,111,195,130, 17, 17, 30, 10,157, 78, 13, 62,143, 7, 30,159,135,138,149,107, -225,238,189, 0,173,154, 97, 2, 74,178, 9, 0,169,169,239,178, 20,246,213, 7, 44, 95, 58,239,220,180, 89,139,101,253,250,254, -142,160,215, 47,145,205, 56,128, 82,192,193, 90,142,250, 85,102, 35, 54, 46, 9, 71,246,108, 81,114, 58,221,144,194, 62,180,138, -179, 9, 0,246,201,240,220,186, 99,207,168,157,251, 15, 45,158, 53,105,172,253,247,189,135, 64,156,250, 18,250,184,167,168,220, -184, 11,136,196, 2, 23,174,220,128,255,147,151, 9, 28, 75, 23,219,167,224,143,178,108, 22,153, 66,188,255,241, 99,188, 75, 33, - 47,240, 46, 18,137,244,126, 25,164,170, 67, 17,191, 66,159,120,156,231,243,121, 13,151, 47, 95,174,183,183,183,215,133,132,132, -224,247,223,127,231,158, 62,125,122,133,199,227,109,142,139,139, 83,151,101,211, 86,175, 15, 60,228,235,235,217,164,119,111, 58, -104,210, 36, 37, 36,146,201,171,215,174,245, 77, 74, 75,115,162, 28, 7, 91, 43,171,152,213,115,231,250,245,237,223, 63,237,197, -221,187,178,128,211,167,101, 98,134,121, 90, 86, 58,191,209,188,119,137, 54, 99, 98, 98,252,221,171,186, 98,239,206,117,208,233, - 52,136,143,205, 21,178,146, 83, 50, 80, 26,201, 42,106, 51,111,215, 85,239, 5, 63,255,252, 96,193,180,169, 14,109,218,119, 64, - 84,224,115,232, 82,147, 64,244, 12,132, 68,128,156, 68, 19, 36, 38,100, 99,206,129, 99,137,217, 74,101,239,162,157, 68, 73,233, -204, 87,172, 36,102,166, 16,201, 21, 16, 43, 76, 63, 81,177,164,102,102, 16,203, 21, 16,136,197,197,169, 52,159,217,204,206,206, -238,211,183,111,223,160, 71,143, 30, 89,142, 30, 61, 26, 45, 90,180,120,166, 82,169,188, 41,165, 89, 95,154,159, 2,129, 32,177, - 97,195,134,118, 66,161,144, 25, 53,106,148, 32, 57, 57,185,192,179,122,118,118, 54, 46, 94,188,136, 26, 53,114,119,245,191,120, -241, 2,181,106,213, 42,209,230,232,217,193,177, 0,150, 78,239,231,178,250, 65, 96,252,100, 0,171, 42, 87,171,128, 27,151,175, -225,206,141, 0,223,102,181,185, 77, 93,135, 52, 94,102,226,221,127,150, 71,195,209,124,133,153, 35,246,157, 60,193, 15,125,186, -107,133, 82, 25, 92, 21,192,204,146,210, 73, 8, 1,165,244, 51, 87, 14,124, 62, 31, 7, 15, 30, 44,239,189, 31,219,185,115,231, -184,159,126,250, 73, 20, 31, 31,143, 87,175, 94, 33, 39, 39, 7, 82,169, 20,151, 47, 95,102, 0,108, 57,120,240,224,229,131, 7, - 15,118, 70,174, 95,156,235,229,169,159,114,185,124, 98,167, 78,157,240,234,213, 43, 60,126,252,248, 4,165, 52,136, 16,114,226, -237,219,183, 3, 90,183,110,141, 61,123,246, 76, 44,137,104,149,100,147,227,184,194, 62,147, 82,243,234,110, 32,128,102,229, 45, -247,188, 5,188, 45, 1,192,218,218, 58,218,222,222,222, 44, 48, 48, 16,174,174,174,208,233,116, 77,203, 91,151, 50, 50, 50,214, -109,222,188,249,143,145, 35, 71, 98,217,178,101, 67,142, 29, 59, 54,164,107,215,174,240,241,241,193,238,221,187, 17, 20, 20,180, -202,144,176, 98,197,221,123, 30,113, 12,242,244,244,156, 80,161, 66, 5,172, 89,179, 6,193,193,193,126, 75,151, 46,157, 27, 20, - 20,132, 26, 53,106, 72, 94,190,124,201,124, 73, 27, 2, 0,102,102,102,102,122,189, 30,167, 79,159,126, 72, 41,157, 70, 8,177, -219,176, 97,195, 64,133, 66,129,212,212, 84, 85, 72, 72,200, 96, 74,233,153,255,239,182,142, 18, 50,127,244,143,147,183,253, 56, -122,176,180, 81,195,250, 80,102,198, 64,149,157, 0,101,214, 71,108,222,121, 5,132,240, 96,107,235, 8, 59, 7, 23,124,248, 16, -133,123,231, 47,104,115,148,170, 13, 98, 61,183,170,116,155,147,114,109, 54,200,181,169,204, 73,132, 42, 59,177,192,166,157,157, - 83,158,205, 15,184, 27,112, 65,173,202,201, 89,167,165,228,215,127,242,222,255,147, 81,238, 88,135,133,145,150,150, 54,101,236, -216,177,222,115,230,204,177,102, 24,134,111,101,101,133, 15, 31, 62, 48,127,254,249,103,106,118,118,246,148, 47, 73,144, 64, 40, - 12,114,175, 94,195,251,251,239,191,103,122,244,232, 46, 26, 58,178,179,192,214,206, 14, 25,233, 41, 8,123,245, 28,175, 95, 62, -133,123,141,122, 88,180,116, 61, 96, 97, 81,102, 32,201,236,132,176,155, 10,251,234,221,150, 44,152,121,180,165,215,119,102, 53, -106,213, 19,213,175,106, 14,157,158, 65, 76, 76, 12,206,156, 14,212,133, 60,185,147,201, 49,218, 1, 57, 73,134,133,224,185,149, - 59, 42,218, 94,199,158, 28, 92,185,122,243,140, 45,219,247,206,154, 51,121,180,188,117,171,142, 8,190,182, 7, 39,206, 29,205, - 81,107,180,171, 69,124,172, 13, 78,166,202,242,230,129, 90,173,214, 21,221, 16,165, 86,171,117, 95, 91,216,187,119,239, 70, 66, - 66,130, 54, 50, 50,242, 18,195, 48,199, 74, 10,246, 92, 28, 54, 81,170,237, 77,200,181, 5,173, 90,117, 94,112,249,178,116,248, -236,217,218, 33, 67,135,206,132, 70,163,131, 88, 76, 5,114, 57, 15, 18,137,240,197,221,187,178,141,227,198, 89, 17,173,246,234, -158, 82,220, 6, 20,131,111,190,235,176,144,162,133,225,163,167, 65, 85, 72,209,186,255, 56, 12,229, 81,180,242, 30,140, 40, 66, - 72,179,201,243, 23,156, 28,208,169,189, 71,109,183,138, 18,219, 74, 21,161,112,112, 64, 74, 82, 18,238, 62,126,173, 95,122,244, -100, 72, 30,201, 50,200,175, 12,199,113,185,139,220, 1,180,159, 50, 7,132,207, 7,242,220, 56,228,239, 28,170,212,184, 5,136, - 64, 0,150,114,208,104, 52,212,128,116,198, 16, 66,250, 12, 25, 50,228,250,185,115,231,120,157, 58,117,170,127,234,212, 41,238, -107,234,142, 94,175,119,201, 35, 92,153, 38, 38, 38,130, 17, 35, 70, 64,175,215, 67,169, 84, 34, 35, 35, 3,161,161,161,154,126, -253,250, 73,242, 8,132,126,192,128, 1,101,182, 31,235,142,199,168,167,247,115,217,100, 37,136, 28,152,153, 28, 84,201, 74, 16, - 25,209,172, 54,183,105,221,241, 24,245,146,105, 22,203,147, 35,253,195,226,115, 46,111,219,119,242, 4,127, 88,175, 62,172,139, -226,141,175,212,142,254,217,174,123,153,141,218,103,206, 73, 13, 33, 89, 69,145,149,149, 53,119,225,194,133, 62,105,105,105, 46, -157, 59,119, 22,121,120,120,224,193,131, 7, 56,119,238, 28,115,255,254,253,232,156,156,156,121,148, 82, 53,128, 43, 95,146,167, -213,171, 87,175, 36, 16, 8,242,167,210,126,203,251,250,183, 83,167, 78, 13, 24, 61,122, 52, 42, 86,172,232, 73, 8,145,208,114, - 60, 71,148,210,130, 89,134,111,220, 81,132,111,220,184,209,217,193,193,129, 92,188,120,145,225,243,249,229, 86,110, 40,165,187, - 9, 33, 77,245,122,253,143, 99,198,140,129,151,151, 23, 24,134,193,129, 3, 7,176,107,215,174, 85,229,137,221, 90, 18,194,194, -194,158, 70, 71, 71,183,153, 57,115, 38,214,172, 89, 51,119,230,204,153,136,142,142, 70, 88, 88,216,243,175,177,155,153,153,169, -138,138,138, 50,105,222,188,121, 35, 87, 87,215,144,225,195,135,215, 26, 61,122, 52, 86,173, 90, 69,111,221,186,213,151, 82,122, -241, 95,209,129,191,122,147,178,191, 78, 21,251,203, 75,151,175,251,185,106,149, 74, 63,141, 26,209,159, 95,221,189, 22,114, 50, - 98, 96,109, 99, 15,151, 10,149,145,148,152,140, 75,151, 46,178,201,201,233,187, 89, 30, 89,242,230, 77, 74,220,215,216,116,118, -169,140,196,196, 68, 92,184,112,129, 77, 79,203,220, 1, 61,111,233,203,200,180, 4, 24, 81,166,146, 85,220, 98,120, 98,200,194, -219,188,157,135, 27,115,221, 59,228,170, 92,105,105,105, 83, 40,165,201,134, 50,115, 82,212,137, 90,191,126, 34,156, 63, 95, 23, -122,125, 51, 11, 83,211,246,148,227, 26,215,171, 87, 79,209,191,127,127,174, 85,171, 22, 98, 51, 51, 51,226,233, 89, 59, 51, 35, - 61,221, 10, 0, 40,192,150,197,162,243,131, 74, 11,248,194, 14, 44,171,171,147,155,214,178,131, 74, 27,194,204,171,216, 19, 91, - 1,135, 69, 60, 66, 70,112,148,238, 97,120, 88, 18,158, 64,147,190,116,244, 84,100,218, 47, 63,228,204,220,242,142,242, 10, 79, - 29,242,120,252,253,142,142,142,243, 98, 98, 98, 18, 41,165,236,151, 42, 27,249, 33,120,186, 77,157,170,111,248,221,119,140, 85, -133, 10, 28,165,148,141,120,250,148,220, 63,115, 70,120,255,204, 25,169, 94,163,185,121,156,210,112, 67,108, 58, 57, 57,249,157, - 61,123,214,224,181, 87,221,187,119,127,153,191,110,203,208,252,172, 90,197,229,114,149, 74,206,223, 85,169,148, 59, 61, 29, 30, - 17,135,240,136,216, 43,239,194, 99, 58,125, 73, 25, 21, 14, 42, 77,242, 92, 56, 80, 3,130, 74, 23,181,105, 99, 99,243, 68, 32, - 16,184,148,231,129,101, 89, 54, 46, 41, 41,169,129,129,233, 28, 84,169, 82,165, 85, 31, 62,124, 56,201,178,236,180,111,161, 16, - 18, 66, 90,240,249,252, 11, 44,203,202,138, 42, 94,249,100,140, 16,226, 38,145, 72, 62, 89, 12, 95,154,205,213, 11,106,255,220, -188,117,235, 94,247,239,220, 57, 53,107,121,200, 39,235,134, 38,247,178, 26, 57,104,194,148, 95, 15,111,217, 56,123,211,169,212, -221,101,170,205,246,246,183, 0,184,231, 19, 46, 3,242,178, 81, 25,202,176,212,212,212,212, 15,192, 0,142,227,108, 8, 33,201, -148,210, 35,133, 72,214, 23,231, 39,159,207, 95, 85,179,102,205, 41,175, 95,191, 62,204, 48,204,168, 66,215,175,169, 90,181,234, -132,200,200,200,223,244,122,253,172,114, 60,239,102,173, 91,183, 78,219,184,113, 35,111,218,180,105,240,247,247,183,162,148,166, -125,163,114,119,176,180,180,252,131,101, 89, 15, 74,233,217,172,172,172,185,148,210,156,242,218,204,115,241, 48,192,217,217,121, -150,187,187,187,251,155, 55,111,130, 98, 99, 99, 87, 23, 85,131,190, 34,157, 62, 61,123,246, 60,187, 97,195, 6, 82,161, 66, 5, - 68, 71, 71, 99,234,212,169,244,244,233,211,221, 41,165,231,191,180, 77, 38,132,204, 31, 55,110,220,242,161, 67,135, 22, 16, 90, - 63, 63, 63,122,254,252,249,225,148,210,253, 95,218,206,127, 75,245,222,179,138,109, 21,202,103, 87,212,171,237,209,247,135, 33, -189,200,253,199,111,240,224,126, 0, 98,226,226, 78,113, 60,222,188,176,176,228, 55, 95,107, 51,224,113, 24, 30, 4, 4,208,248, -184,248,227,160,252, 5, 47,195,147,194,255,191,238,253,191, 65,213, 42,110,234,144,124, 97, 40,172,114, 87, 24, 98,136,183, 90, - 39, 39, 39,164,164, 52,149, 10, 4,173, 36, 18,137, 55,143,207,191,153,154,148, 52,213, 80,162,245, 79, 84,236,207, 58,244,170, - 68, 92, 82, 72,130, 47,177, 89,116, 33,251,151,216, 44,143, 13, 67,109,150, 20, 84,154,211,104,226,172, 25,230,201, 38, 90,114, - 30, 20,181,233,226,226,242, 35,199,113,149, 12, 77, 19,143,199,139,136,137,137,217,249, 37,249,233,238,238, 78,223,190,125, 11, - 74, 41,249,150,229,254, 79,212,165,255, 37,155,251,215,215,117,170, 81,167,230,172,224,167,161,107,242,166, 21, 11,176,100,178, -149,105,171,118,109, 23,222,189,113,107,217,162, 77,169, 89,255,202,116, 18, 66,120,180,188,187, 91,190,208,102,190,147,208,242, -218, 20,137, 68,219,154, 52,105,242,227,131, 7, 15,254, 96, 24,102,204,255, 98,253, 36,132,248,240,249,252,153,213,171, 87,175, - 31, 22, 22,246,156,101,217, 53,165,145,172,114, 12,126,231, 85,170, 84,105,188, 72, 36,146,100,103,103,167,197,197,197, 45,164, -148, 30,251,119,203, 79, 79,119,235, 70,148, 22, 56,221, 94, 17,250, 54,229,209, 55,179, 73, 57,150,163,252,229,175,195,147,159, -253,127,151,251,127, 58,201, 42, 73,229, 18,252,127, 37, 34,159, 40,149,138,184,184,104, 0,209, 0,142,255,187,102,166, 33, 36, -171,156,114, 99,194,191,131,141,162,200, 35, 82, 1,223,194, 86, 81,210,244, 79,226,205,155, 55,196,248,200,255,251,225,135,105, - 65,113, 0,166, 54,242,254,252, 92, 30,185,154,229,221,227, 95,159,206, 47, 33, 89, 95,106,243, 75, 3, 62,235,116,186,159, 8, - 33,211,203,179, 91,241,191, 13,121,164,234,252, 63, 96,119, 37,128,149,255,238,247,255,242, 77,202, 19, 0,221,255,221,109,254, -143,213,201,242, 5,149, 54,194, 8, 35,140, 48,226,223,186, 81, 87, 25,115,193, 8, 35,254,189, 80, 88,213, 42, 76,188, 8,128, - 14, 37, 60,200,215,202, 97,188,195, 23, 52, 20,215,140, 54,141, 54,141, 54,141, 54,141, 54,141, 54,141, 54,255,183,108,254,183, -146,172, 79,200, 85,225,227,252, 93, 79,255,196, 11, 64, 7,163, 77,163, 77,163, 77,163, 77,163, 77,163, 77,163, 77,163,205,255, -230, 23,128, 49, 37, 29, 27,167, 14,141,248,199,177,185, 55,113, 6,128, 73, 39,105,236, 63,113,189, 17, 70, 24, 97,132, 17, 70, -252, 43, 65, 41,221, 81,210,212,225,191,156,104, 17, 66,156,144,235,104,175, 42,128,215, 0,238,148,103,187,114, 49,246,108, 0, -244, 39,132,244,203,187,217,227, 0,142,149,229,138, 34, 31, 50,153, 44, 65,173, 86,219, 1,128, 84, 42, 77, 84,171,213,133, 99, - 25, 16,124, 30, 30,133,230,254, 77,201, 11, 91, 43, 87,174,156,160,209,104,236, 12,248,251, 12, 74,105, 16,143,199, 11, 86, 40, - 20, 55, 94,191,126,125,174, 60,247,222,174, 93,187,225,124, 62,127, 5, 0,176, 44, 59,255,198,141, 27,123,255,193,114,107, 90, -193,201, 97,143, 78,175, 99, 18,146, 82, 23,150,180,117,123,107,119,226, 39, 32,152,149,247,121,245,248,179,165,187,176, 40,239, -245,165,164,175,145, 80, 40,156,104,111,111,223, 37, 38, 38,230, 9,128,217,148,210, 50,189, 26,187,186,186,254, 32, 16, 8,134, -176, 44, 91,133,207,231,135, 51, 12,115, 48, 42, 42,106,191,177, 25, 49,194, 8, 35,140, 48,162, 44,178, 85,220,247,229, 34, 90, - 53,109,136, 3, 5, 6,130,160, 35, 40,174, 18,224,200,171,100,250,209,208,223,251,212, 36,122, 61,147,251,159, 34, 30,216,139, -239,120, 59,124,124,124, 92, 38, 77,154,132, 22, 45, 90,224,193,131, 7,205,119,239,222, 61,146,207,231, 7,113, 28,119, 19,192, - 3, 74, 13,114,165, 32, 7,240, 61,128,193, 93,186,116,233,176, 98,197, 10,126,173, 90,181,160, 82,169,112,235,214,173, 86,171, - 87,175,222, 64, 8,185, 6,224, 16,128, 51,165,249,134, 81,171,213,118,249,156,137, 16, 98,215,183,111,223, 71,133,201, 85, 94, -124, 53, 66, 41,189, 79, 8, 9, 96, 89,246,193,241,227,199,163,107, 18,210,116,108, 37,209,159, 83,222,107, 63,243,153,164,209, -104,236, 78,255,186, 18, 2,137, 4,154,172, 76, 52, 31,241,247, 46,208,171, 63,207, 2,225, 24,240, 65,211,188,151,111, 8, 2, - 16, 28, 23, 23, 23,228,229,229, 21, 81,222, 66,230,243,249, 43, 46, 93,186,228, 72, 41, 69,167, 78,157, 86, 0,248, 71,136, 22, - 33, 68,210,172, 81,189,155,103, 79, 28,150,102,167, 38,160,243,247, 3, 14, 18, 66,134, 83, 74, 79,124, 66,154,186, 18,123, 34, -192,172,113, 43, 15,241, 1, 96,235,188,193,179, 55,116, 34,155,166, 94,166, 31, 9, 33,222, 64, 65,200,166, 95, 41,165, 55,183, -118, 37,246,224, 99,206,184,149,135, 8, 0,252, 62,111,240,172,173, 93,201,198,241, 23,202,183,171,146, 16, 50,126,248,240,225, -155, 86,172, 88,193,119,116,116, 68,108,108,108,103, 79, 79,207,234,132, 16,207,210, 22, 17, 87,170, 84,233,104,219,142, 61, 43, -247,238, 55,208,196,214,198, 18,113,241,201,102, 71, 15,255, 49,182, 82,165, 74, 93, 34, 34, 34, 6, 24,155, 17, 35,140, 48,194, - 8, 35, 74,232,119,190,220,189, 67, 67, 39, 34,203,209,161,167,128, 79,126,104,221,180, 86,251, 65, 93, 91,243, 60, 61,170,225, -229,139,208,239,206,220,120,184,218,211,158,119,157, 97,233,126,185, 8,167,159,198,149,190, 19, 70,207, 64,112,229,244, 33, 0, -192,248,145,131,249,143, 30, 61,170,214,176, 97,195, 2,135,128,237,219,183, 71,251,246,237,201,214,173, 91,235, 93,185,114,165, -222,174, 93,187,116,132,144, 61,101, 56,161,155, 88,181,106,213,213,155, 54,109,146,120,121,121, 65, 34,145, 20,156, 83, 40, 20, -232,222,189, 59,186,119,239,206,143,139,139,235,116,246,236,217, 78,191,254,250,171,150, 16, 50,147, 82,250,155, 33,153,183,112, -225,194, 70,197,124,125,137, 16,242,142, 97,152,231,117,235,214,141,174, 65, 72,181,159,186,182,184, 58,190,165,187,188, 36, 59, - 2,177, 24,251,134,231,246,213,133,137, 86,196,141,139, 80,152,153,166,152,152,154, 6, 1, 8, 6, 16, 68, 41, 13,126,247,238, - 93,168, 7, 33,245,154, 89,242,246,236, 74,101,235,150,131,108, 33, 58, 58, 26,230,230,230,178,182,109,219,198, 19, 66, 22,223, -188,121,115,199, 55,174, 83, 77, 23,207, 26, 47, 74,139, 12,194,199, 87,247, 49,189, 95, 43,147,169,155,255, 90, 6,224, 68,233, - 21,145,199,251, 53,128,243,157,154, 27,140,119, 97, 74, 74,138, 23, 0, 88, 91, 91,139, 1,220, 92,255, 16, 93,167,181, 36,228, - 43, 42,186,136,207,231,111,217,183,111,223,232, 31,126,248, 33, 55,116,196,221,187, 80, 40, 20, 88,186,116,105,197, 25, 51,102, -248,161,132, 64,192,174,174,174, 63,180,237,216,179,242,198, 53,203, 60,179, 82, 51, 52,219,183, 28,123,236, 84,187, 6,111,220, -196, 25,166, 27,117, 26, 7, 87, 87,215, 31,140,202,150, 17, 70, 24, 97,132, 17,229, 81,179,202, 36, 90, 53,108,201,222,214, 13, -220,251, 15,242,105, 37,169, 83,187, 22, 68,146,191, 29, 69, 55,108,212, 8, 13, 27, 53,226,249,102,103,117,124,244,248,105,199, - 63,175, 60,208,212,176, 37,199, 94, 39,209,225,134, 38, 44, 63, 40,237,138,239,237,219,229,164, 39, 74, 1, 64,110, 97,167,158, -119,250,227,141,150, 45, 91,194,197,197, 69,116,253,250,245, 81, 40,221, 95,202,188,215,175, 95, 75,248,252,210,253,161, 58, 57, - 57,161,111,223,190,168, 81,163,134,184,109,219,182,243,240,119, 56,140, 79, 32,149, 74, 19, 9, 33,118, 0, 96,101,101,197, 46, - 94,188,248, 57,165, 5, 51,131,148, 82,122,159,199,227, 61,224, 56,238,225,153, 51,103, 98,106, 17, 98,215,173, 97,141, 59,227, -135,246, 53,161,127,110, 40,145, 36,168, 51, 51,139,253,222, 68, 33, 79,146,201,229, 65, 18, 19,105, 48,128, 32, 0,193,206,206, -206,161,181, 8,113,105, 86,163,210,149,173,211, 6,155, 26,146,151, 13, 27, 54,172,238,237,237, 45,101, 89, 22, 57, 57, 57,248, -253,247,223,205,101, 50,153,121,151, 46, 93, 22, 1, 40,168, 0,158,132,212,233,227,196, 31,179, 56,150,153,240, 5, 68,198,162, -117,243, 70,145,155, 87, 45, 50,107,212,172, 53,222,220, 60,128,212,212, 44,100,164,103,131,227,184,207, 34, 12,143,191, 64, 19, -182,118, 39,171,183,206, 29, 60,135,240,120,164, 94,175,217,232,225,144, 49,153, 16,242, 2,128, 80, 44, 22, 23,212, 67, 66,136, - 83,237,218,181, 87, 87,251,174, 53,126,159, 63, 20,148,227, 40,128,213,134,170, 89,132, 16, 59, 83, 83,211, 51, 87,174, 92,105, -218,184,113, 99, 60,120,240, 0,239,223,191,199,248,241,227,181, 19, 38, 76, 16, 13, 27, 54,140, 76,159, 62,125, 18, 33,228, 79, - 74,233,189,207, 30, 4,129, 96,200,247,189, 7,136,179,211, 51,213, 90,141, 78,107,101, 99,193,105,114,212,202,228,180, 76,245, -128,193, 63,106, 95, 60,123, 56, 4,192,103, 68,235,107,242,211, 8, 35,140, 48,194, 8,131,209, 24,128, 45,128, 36, 0,143,139, - 28, 35,239, 51,138, 57, 78, 70,238,172,148,117, 33, 91,201,200, 93,246, 99,139, 92, 31,159,143, 0,164,125, 77,226, 74,242, 10, - 15,228,121,134,207,115, 80,156,239,168,152, 20, 34, 90,244,117, 18, 5,147, 26, 14, 54,229, 29,216,172,207,195, 39, 17,169, 5, - 50, 84, 44,162,195, 67, 49,124,234, 82,188, 78, 42,217, 35,183, 79, 77,162, 55, 23, 67, 96, 42, 2, 68, 38, 22,154, 65,171, 46, - 7, 52,106,212, 72, 61,207,139,231,227,183, 53, 87,233,154, 62,102, 48,154, 79,251,243,114,120,120, 56,227,228,228,132, 31,126, -248, 1,148,210,110,165,220, 92, 66,214,227, 0,187, 87,221, 90,160, 73, 66,241,203,164,194,194,194,112,251,246,109, 68, 69, 69, -161, 74,149, 42, 24, 53,106, 84, 34,165,212,190, 36,155,157, 59,119,190,245,235,175,191,122,173, 93,187, 54,112,223,190,125, 45, - 75,154,110,242, 36, 68, 94,175,162,195,227, 93,126,115,170,144,139,123,132,202,168,183,176,240, 87,145, 98, 72, 30,141,139,251, - 59,239,126,169,238, 8,185,185, 41,228,102,138,132, 97, 87,158, 20, 40, 89,121,239,175, 27, 18, 98,230,226,104,253,228,200,250, -133,206,188, 27, 71,165,162,237,247, 73, 89, 36,171,109,219,182, 1, 43, 86,172,176,140,139,139,195,181,107,215, 80,177, 98, 69, - 40,149, 74,172, 91,183, 46,254,206,157, 59, 78,121,233,181,111, 82,195, 45,232,247, 25, 35,204, 69,163,126,150,148,183, 34,137, - 4,130,223, 2, 46, 29,157, 96, 46,161, 72,143,123,143,119,161, 47,240,232,101,132,126,255,213, 32, 54, 83,165,241,161,148,222, - 40,238,119, 19, 91,145,106, 55,227,108,207, 94,186,245,216,221,209,209, 17, 99,199,142,197,199,143, 31, 65, 41, 5,199,113, 5, -187, 52,230,205,155,135,234,213,171, 99,248,192, 30, 74, 73,234,211,182,103, 95,210, 39, 6, 86,240,218,110,110,110, 87,110,222, -188,105,239,236,236,140, 59,119,238,224,227,199,143,112,112,112,192,245,235,215,177,106,213,170,125,227,198,141,235,183, 98,197, - 10,233,160, 65,131, 98, 47, 95,190, 92,161,232,154,186,138, 21, 43,134,158,189,124, 71,113,227,212,149,119,150,166, 38,144,219, - 89,131,175, 48, 83, 83, 16,165,131,157,165,104, 64,207,246,213, 34, 35, 35, 61,138,148,255, 87,229,167, 17, 70, 24, 97,132, 17, -127,227,252,249,243,212,199,199,135,228,191, 23,165, 16,132,144,115,121,124, 64, 11, 64, 92,232, 24,132,144,115,121,106,200, 39, -199,190,190,190,243,252,252,252, 94,228, 31,231, 95, 51,119,238,220, 90,171, 86,173, 90,217,188,121,243, 35, 1, 1, 1,139, 1, -188,253, 90,162, 85,146,202,101,208, 26, 45, 38,230, 17, 68,238, 93, 32,100,245,208, 39,191, 6,151,254, 1,144, 59, 64, 69, 20, - 72,137,255,128, 87,119, 78,228,114,195,178, 50,241, 21, 21, 18, 66,174,135,134,134,226,213,171, 87,136,142,142,134,137,137,201, -103,215,221,189,123, 23, 50,153, 12,142,142,142,134, 73,118,218, 79,227,177, 6, 53,116,131,162,185, 23,146, 7,253,132,235,215, -175, 35, 49, 49, 17, 34,145, 8, 98,177, 24, 12,195,148,105,143,199,203,141,248,155,175, 98, 21,119, 77, 91, 66, 4, 46, 86,138, -179, 91, 23, 77,169,196,187,127, 78,168,138,122,139, 56, 53, 11, 11, 67,148, 60,133, 28, 38,114,147,120,153,204,164, 40,201,122, -211,144, 16,161, 92, 33, 61,187,103,249,116, 7,254,179,235, 82,213,219, 32,136,138,177,209,177, 99,199,177, 0, 22, 81, 74,211, -219,182,109,107,191, 98,197, 10,203,216,216, 88,188,124,249, 18,199,142, 29, 75, 98,114,111,148, 80, 74,151, 0, 64,115, 66,164, -174,182, 22,151,127,251,121,138, 41,110, 30, 21, 99,212,207,229,174, 72,230, 30,221,207,247, 25, 54,110,194,166, 41,221,145,147, -165,194,161,171,207,112,233,233,187, 30, 0,238,150,182,238,237,183,187,244, 45, 33,164,125,239,222,189,159,223,190,125,219,102, -215,174, 93, 96, 24,166,216,215,174, 93,187,112,237,206,211,201,148, 26, 76,178,156, 42, 85,170,116,237,225,195,135,182, 38, 38, - 38,184,122,245, 42,210,211,211, 11,148,172,225,195,135,147,244,244,244,129,191,255,254,123,159,200,200,200, 53,119,238,220, 73, - 65,110, 56,168, 79, 42, 2,159,207,127,199, 48,186,154,142, 30,213, 4,253,186,183,110,157,157, 18, 4,133,117, 93,220, 15,124, -119, 54, 61, 45, 69,197,231,243,223, 21,190,254, 91,228,167, 17, 70, 24, 97,132, 17,229, 38, 52,231, 40,165,221, 10, 19,167,162, -132, 43,255,115,254,117,126,126,126,221, 10,147, 48, 0, 88,181,106,213,202, 66,199,202,111,145,182,178, 22,195,183, 37,132, 80, - 0,109,139,187, 72,243,242, 36, 52,175,206, 64,228,214, 18,226, 26, 61,192,119,107,133,168,160,155, 8,188,184, 30, 49, 47,238, -130,114, 44, 28,171, 55, 49, 52, 45,234,154, 53,107, 66,173,206, 93,154,165,209,104, 32,146, 91,170,167,143, 25, 44, 5, 0, 78, - 32,213, 20, 74,180, 65, 6, 77, 91,122,163, 73, 2,197, 35,251, 92, 2,156,175,108, 45, 31, 49, 2, 34,145, 8, 34,145,168, 32, -248,172, 33, 68, 43, 47, 40, 42,184,220,233, 43, 90,220,249, 70, 18,225,161, 35,139, 38, 54,145, 68, 6,139, 53, 33,247, 17,167, -225,232,217, 4,246,188, 33,145,147, 77,228, 38,177, 50, 19,147, 96,153, 66, 94,152,104,189, 3, 0, 42, 20,238, 63,176,100, 98, - 93,121, 66,184, 92,253,248, 58,226,213,156,206,172,120, 51, 75, 46, 94,188,104, 39, 16, 8, 28, 88,150, 69, 84, 84, 20, 94,188, -120,129,141, 27, 55, 38,100,101,101,181,125,250,244,105, 88,161,244,242, 26,203,196,199,246, 47,157, 82, 89, 16,228, 47,213,188, - 11, 41,150,188,149, 6,219, 58,189, 58,245,104, 91,239,252,216,161,243,209,179,235,119, 24,214,214,147, 70,196,165,170, 1, 92, - 53, 36,128, 53,165, 52,150, 16,210,177, 77,155, 54, 7,235,215,175,239, 65, 41, 69,157, 58,117, 48,112,224, 64,236,223,191, 31, -129,129,129,200,204,204,212, 93,185,114,101, 3,165,116,183,129, 15,156,137,165,165,229,165, 27, 55,110,216,154,152,152,224,202, -149, 43, 80,169, 84,112,116,116,196,132, 9, 19,196,171, 86,173,218,151,153,153,217,207,207,207, 79, 26, 17, 17,241,219,229,203, -151, 43, 2,224, 81, 74, 63,171, 4, 90,173,118,199,161,253,123, 55, 77,152, 56,201,249,198,131,151,215, 53,217, 89,230,110,110, -209,153,182,150, 10,211, 13,191, 44,113,213,106,181, 99,139,207,207, 91, 95,148,159, 70, 24, 97,132, 17, 70,124,174, 97,156, 63, -127,190, 68, 46, 82,152, 60, 21, 37, 91,229, 33,105, 0, 84,190,190,190,243, 8, 33,231,242, 20, 47, 21,128,184,127,130,100, 21, - 16, 45, 74,169, 63, 33, 4,148, 82,255, 18,173,112, 44,116, 17,183,161,139,184, 13, 89,243,201,248,203,111, 80,145, 63,249,242, - 16, 97,221,151, 94,189,161,209,104, 4,123,247,238, 45, 88,183, 5, 0, 44,203,126,243, 82, 44, 15,209,202, 35,122,159, 37,162, -146, 68,225,191, 99, 90,191,102,214,172, 82,168,189,123, 22,177, 26,142, 89,243, 86,167,124,156, 78,127,157, 87,130,205,211, 83, -199, 34,250,206, 53,152, 40, 20,209,163,111, 7, 23, 86,177,130, 0,188, 7,128, 74, 82,179,235,199,166, 15,106,229, 32,130, 72, -123,254, 56,226, 52,156,102, 91,164,126,247,198,226, 11, 21,148, 82,188,127,255, 30, 74,165, 18, 1, 1, 1, 56,113,226, 68, 82, - 81,146,149,151,222, 91,127,204, 30,210,212, 44,235,163, 72,251,248, 26,226, 52,156,166,186, 33,228,170,110,175,150, 34, 30,185, - 66,120,124, 89,215,214,158,152,250, 99, 47,172,255,227, 47, 70,107,215,186,219,166, 51, 23,250,103,107,116,243, 12, 33, 89,133, -210, 28, 4,192,147, 16, 34, 1,224, 61,112,224,192, 11,125,250,244,129,191,191, 63,206,158, 61,235, 14, 32, 62, 47,255,151, 2, -176, 71,238,110,196,146, 34,199,243, 68, 34,209,145,107,215,174,213,114,114,114,194,181,107,215,160, 82,169, 48,110,220, 56,237, -196,137, 19, 69,195,135, 15, 39, 25, 25, 25, 5, 74, 86, 64, 64, 64, 74, 73, 36, 11, 0, 98, 98, 98, 46,186,185,185,181,104,211, -166, 77,175,202,238, 53,204,194,179, 50, 19, 77, 76,164,178, 59,254, 55, 69,143, 31,222,251, 45, 38, 38,230, 81,241,249,121,221, -224,252, 52,194, 8, 35,140, 48,162,100,248,248,248,248,159, 63,127, 30, 62, 62, 62,254,101,244, 37,221,190,144, 12,229,255, 78, -232,231,231,247,194,207,207,239, 19,197,235, 43,149,182,162, 83,135,231, 41,165,241,133, 21,173,114,129,205,136,250,252, 6, 56, -174, 60, 55,251,217,119,150,150,150,140, 76, 38,251,132,104,113, 6,218, 76, 61,117, 24,225,227, 7, 23, 40, 89,249,202, 22, 58, - 15,255, 42,162,197,113, 92, 0,128, 79, 18, 33,183,175, 49,232,200,208,142, 45, 61, 43, 59,243,244,199, 54, 34, 70,201,168, 23, -189,214,169, 95,101,209, 30, 47,139, 89,100, 93, 96,147,209, 67, 42,151,125,144, 41,228, 69, 73, 86, 36, 0, 40, 28,170,247,217, - 55,200,187,109,189, 26, 85,121,204,209,117,136, 85,234,179,125, 67,117,186,240, 28,122,178,132, 60, 92,244,221,119,223, 45,178, -182,182,150,110,218,180,201,220,205,205, 13, 12,195,104,139,146, 44,185,125,141, 65, 71,135,119,110, 89,221,193,146,167,255,115, - 51,162, 85,172,114, 99,184,126,223, 54, 3, 72,150,141,185,226,242,182,149,227,101, 38, 18, 33,212,106, 53, 86,109,253, 19, 87, -238,133,116, 75, 10, 62,117, 25,192,229,175,168,147,163,187,117,235,182,126,233,210,165,208,235,245, 24, 53,106, 20,222,189,123, -119,229,245,235,215, 27, 93, 93, 93,103,206,158, 61,219,201,193,193, 1,253,251,247, 23, 1, 24, 94,130,141, 95, 14, 29, 58,212, -173, 94,189,122,240,247,247, 71,122,122, 58, 28, 29, 29, 49,113,226, 68,177,159,159,223,190,204,204,204,126, 43, 87,174,148,190, -127,255,190, 84, 37,235,147,122,205,178,203,183,175, 31, 63,179,113,179, 86,188,183,111,195,152,168, 38, 94,188,155,215,206,222, -182,182,182,222,247, 73,126,142,232, 82,238,252, 52,194, 8, 35,140, 48,226,155,225, 60, 0,159,162, 42, 87, 81, 18,150,175, 88, - 21, 62, 46,122,125,222,121,205,215, 38,168,168,162,149, 71,188, 62, 93,163, 85,120, 17,124, 89,224,114,146, 12, 34, 79,159,177, -213,154, 68, 63,182, 49, 4,243,188,120, 16,201, 45,213,221,151, 94,189, 81,210,181,114,185,220, 96, 69,139,211,168,203, 34, 78, -229, 34, 90,121,107,180, 46, 81, 74, 63, 33, 90, 22, 14, 53,188, 22,204,153,178,161, 85,159,206,188,132, 31,155, 35, 61, 91,163, -153,253,146,225, 98,148,165,147,172,220, 94, 92, 31, 97, 34, 87, 4, 75,229,159,172,203,138, 2, 0,153,125,181, 38,190,211, 38, -109,109, 55,168, 59, 73, 26,215, 10,105,233, 42,205,204, 23, 12,137, 85,209,126, 47, 41,189, 89,156,185,235,215,175,111, 7,176, -189,109,219,182, 9,114,185, 28,217,217,217,159,149, 65,126,122, 91,246,233,204, 75, 24,221, 20,169, 57, 58,205,236, 23, 12,226, - 84,220,145,178, 72,150,173,133,233,229,109, 43,198,155,196,197, 68, 66, 36, 18, 65,161, 80,224,234,221, 96, 36,133,156,254, 26, -130, 5, 62,159,191,120,222,188,121,139, 38, 76,152,128,148,148, 20,156, 61,123, 22, 93,187,118,197,225,195,135,221, 46, 92,184, -176,222,219,219, 27,124, 62, 31,231,206,157,131, 94,175,127, 83, 66,121,246, 26, 51,102,204,204, 62,125,250,224,209,163, 71,136, -143,143,255, 68,201, 74, 79, 79, 31,184,117,235,214, 62, 17, 17, 17,101, 42, 89, 69,208,164, 82,213, 6,162,185, 11,215, 66,163, - 76, 20, 36,197, 62,240,191,126,149,119, 63, 53, 53,213, 4, 64,198,151,230,167, 17, 70, 24, 97,132, 17, 6,171, 90, 37,113,145, -164, 60, 18,149, 84,220,113, 33,130, 85,220, 49, 41,162,130,105,139,156, 15,252, 39,239,201, 32, 69, 75, 96, 95, 27, 76, 66, 72, - 33,162,149,248,201,121,169,169,149, 65, 83,135,122, 6,130,109,187, 11,252,104, 73, 83, 82, 82,164, 54, 54, 54,234,194, 4,193, -196,196, 4, 78, 78, 78, 72, 75, 75,195,142, 29, 59, 0,160,172, 69,209,140, 89,159,161,104, 50,104, 20, 30,187,136, 65,245,186, - 2,101,107,219,136, 17,159,144, 45,145, 72,148,191, 54,172,172, 78,247, 33, 33, 36, 18,192,125, 74, 41,109, 88,189,202, 50,169, - 92, 62,162, 81,221,170, 54, 83,199,143, 22, 70, 36,106,112,163,213,220,244, 63,127,153,163,136,166,138, 9, 31,104,250,189, 50, -236,133,127,255,251,129,162, 74, 86, 76,131,234, 85,230, 75, 77,164, 63, 54,171, 93,221,193,119,250,120, 97, 68,130,134,220,104, - 50, 59,243,196,175,179, 77,222,195,116,102, 52, 77,187,105, 64,241, 44,234,218,181,235, 34, 74, 41,229, 56,110, 33, 0, 20, 78, -239,244,137, 63, 10,195, 63,170,113,189,213,252,180, 19,191,204, 49,141, 70,233,233,181,173,219,171,165,189,165,217,229,109, 43, - 39,152,196,199,126,128, 68, 34,129,169,169, 41,162, 19, 50, 32, 20,240, 85, 95, 83,217, 8, 33, 18, 47, 47,175, 57,227,199,143, - 71,112,112, 48,198,141, 27, 23, 31, 21, 21,117,242,232,209,163,227,126,254,249,103, 65,167, 78,157, 16, 31, 31,143,213,171, 87, -235,239,222,189,187, 18,192,234, 98,235,163, 64, 48,122,217,178,101, 52, 46, 46,142,188,127,255, 30,142,142,142,152, 52,105,146, -120,229,202,149, 5,107,178,202,163,100,229, 35, 38, 38,198,223,189,170, 43,122, 92,220, 0, 70,175,241, 79, 79,137,186,253, 42, - 60,205,223, 74, 44,158,209,170, 97,221, 47,202, 79, 35,140, 48,194, 8, 35,190, 9, 30,151,113,252, 47, 69,113, 83,135,134, 18, -173, 55,155,231,143,116, 31, 57, 97, 22,100,110, 45,161, 9, 61, 5, 46, 59,161, 64,209,146, 42, 44, 97,229,234,129,244, 28, 13, -142, 95,127, 10, 0,111,202,147,176,172,172, 44, 52,108,216, 16, 91,134, 87,111,167,206, 74,145,202, 0,104, 36,102,234,211,226, -214, 55, 46, 92,184,160,228, 56,238, 8,128, 11,101,152, 89, 92,171, 86,173,223,214,174, 93, 43,246, 24, 52, 18,217, 15,238, 20, - 85,167, 32,147,201, 32,145, 72, 16, 20, 20,132, 27, 55,110,104, 1, 44, 46, 35,195, 30, 50, 12, 19,120,228,200,145, 24,247, 42, - 46,157,219, 54,110, 50,121,222, 92, 95,211,151,119,174, 96,225,202,223,184,106,141, 58,101,172, 58,124, 58, 43, 67,225,218, 94, - 25,247,234,185, 1,183, 26, 88,132,100,197,121, 84,118,109,215,188, 65,253, 89, 11, 23,206, 55,123,113,231, 42,126,254,117, 27, -117,175,215, 33,227,215, 19,103, 50,147, 77, 42,126,167, 74, 8,125,100, 72, 30,222,186,117,107, 59,128,237,249,199, 69,211,235, -187,116, 35, 87,189,113,231,180, 85,135, 79,228,100,154,186,118, 40, 45,189,118,158,189, 91, 84,112,180,186,188,121,249, 79, 38, - 31, 99,163, 32,145, 72,160, 80, 40, 16, 21,159,142, 69, 27,142,229,232, 56,174,243, 87,214, 69,137,169,169,169, 68,167,211, 97, -203,150, 45,136,138,138,106, 78, 41,141, 34,132,108, 27, 48, 96,192,166, 58,117,234,212,124,241,226,197,155,236,236,236, 9,148, -210, 87, 37, 25,177,176,176,104,110,107,107, 75,238,223,191,143,159,126,250, 73, 59,105,210, 36,209,176, 97,195, 72, 90, 90,218, -151, 42, 89, 0, 0, 23, 23, 23,175,239,125, 90,160,101,199,113,254, 90,117,250,237,136, 87,251,252,121,244,158,180, 97,253,186, - 95,148,159, 70, 24, 97,132, 17, 70,252,111,160,180,197,240,165, 70,163,246, 2, 4,213,173, 49,182,150,179,232,227,254, 95, 38, -209,172,240, 0,170,122,180,157,102,158,250,145,158, 95, 61,140, 94,216, 60,149,142,243,169, 69,107,218,145,143,213,173, 49,214, - 11, 16,148, 22,221,187,107, 13,232, 59, 86, 5,237, 88, 21,212,167, 58,244, 0,230, 53,104,208,224,244,196, 38,160,244,229, 33, - 74, 95, 30,162, 19,155,128, 2,248, 9,128,194,208,136,225, 0, 28, 1,236,104,216,176, 33,115,243,230, 77,250,186, 95, 7,250, -172,166, 13,157, 48, 97, 2,253,249,231,159,233,224,193,131,169,173,173, 45,131,220,249, 82,199,178,108,246,232,209,195,133, 82, -138, 10, 21, 42, 88, 52,242,168,246, 49,232,250, 89,122,123,255, 38,250,199,196,222,180,105, 29,143,100,135,154,109, 2,101,142, - 53,234, 27, 26,217,220,193,193, 97, 46,165,180, 51,165,212,145, 82, 10,119,119,107, 69,131,154,213,226, 2,175,157,165,119, 14, -252, 70,255,152,216,155, 54,171,235,153,226,226,225,253, 74,106, 87,179,201,151, 70, 75, 47, 54,189,181,107, 38,219, 87,107,241, -188,164,244, 22,182, 89,185, 73,255, 51, 49,113, 9,244,225,195,135,244,194,133, 11,244,206,157, 59,116,255,209, 51,212,181,113, -191,108,155, 58, 61, 91,126,109, 84,119, 0,230, 62, 62, 62,244,205,155, 55,180, 75,151, 46, 20,128,249,151,216, 4,112, 58, 34, - 34,130,134,132,132,208,121,243,230, 81, 0,123,199,143, 31,175,202,200,200,160, 29, 58,116,136, 2,192, 67,145,186,104,104, 58, -171, 84,114, 94,213,171,123,235,197, 19,127,234,227,245,181,249,249, 13,163,194, 27,109, 26,109, 26,109, 26,109,254,215,219,252, - 79,126,229,241,144, 49,133,222, 27,228,159, 43, 85,209,186,149,171, 6,108,175, 99, 79, 14,174, 92,189,121,198,150,237,123,103, -205,153, 60, 90,222,186, 85, 71, 4, 95,219,131, 19,231,142,230,168, 53,218,213, 34, 62,214, 6, 39,211, 50,253, 80,156,127, 69, -133,197,168, 71, 38, 86, 85, 81,224,131,233,109, 26, 64, 41,221, 86, 78, 38, 25, 15, 96, 12, 33,100,173,183,183,247,138, 31, 91, - 54,233, 61,177, 69, 59,232,245,122,236,223,191, 31, 31, 62,124, 56, 9, 96, 62,165,212, 32,197, 45, 56, 56, 56,185, 86,181,138, - 83,172,100,162, 89, 19, 6,247,178, 77,122,247, 18, 49,161,207, 0, 0, 26,141, 74, 31, 31,230, 95,175, 60,233,147,201,100, 15, -109,109,109, 95,219,218,218,166,177,154,236, 49, 82,129,217,194,113, 3,191,183, 75,137,120,133,232, 23,185, 51,163, 26,181, 82, - 23, 29,118,163,230,151, 48,233,138, 21, 43, 74,228, 66,140, 45, 54,189, 90,181,254,227,155,208,250,134,216, 81,106,180, 43,151, -172,223,255,221,242, 89, 35, 36,102,102,102,120, 26,242, 22, 11,215, 29,206, 81,105,245,157,147,130, 78,221,251, 70,172, 31,122, -189,222,224,141, 14, 37, 96, 78,189,122,245,106,172, 88,177,194,125,248,240,225,248, 90, 37,171, 48,222,189,143,241,109,219,182, -173,231,219,215, 79,189,173,100,162,131, 95,147,159, 70, 24, 97,132, 17, 70,252,207,192,135, 82,186, 35,223, 67,124,222, 84,226, - 51, 67,166, 14,115,137, 71, 2, 85, 2, 88, 90,197,158,108,155,187, 98,253, 34, 30,217, 48,130,163,116, 15,195,195,146,240,100, -154,244,149, 29,175,210,167, 38, 97,190,235, 57, 88, 0, 0, 66, 1,152,175,176,245, 6, 64, 31, 66, 72,227,157,247, 30, 45,200, -251,122, 57,165,180, 92,115,185,166, 2,132,180,242,172,226,220,186, 65, 45, 41,159, 85, 33, 38,244, 29, 82,115,212,184,250,226, - 67, 58,143,242,246,148, 55, 93,225,225,225,183, 0,160,118,181,138,161,173, 61,171,186,182,105, 88,203, 68, 72,180,136,121,249, - 20, 25, 42, 45,174,188,248,144, 1, 66,190,120, 65,245,183, 74,239,199,160,211,143,109,235,246,234, 64, 8,185, 54,111,226, 32, -201,162,117, 71,190, 41,201, 2,160,140,141,141, 77, 81, 42,149,214,113,113,113, 90,124,161,147, 56, 74,233, 91, 66, 72,157,169, - 83,167, 46,157, 57,115,230,172, 95,126,249, 69,244, 37,107,178, 74, 66, 90,236,135, 83,109,106,125,187,242, 55,194, 8, 35,140, - 48,226,191, 31,249,235,180,138,174,215, 42,151,123,135,240, 4,154, 4, 96, 66,213,170,100,250,187,119, 84,251,173, 18, 87,156, -210,245,149,228,237, 49,128,238, 95,108,128, 71,178, 30,188,249,144,253,240,205,135,108,112,148,114,148,106,120, 60, 68,231,232, -116, 43,195,194, 99, 46,127, 69, 41,176,143,223, 70,169,158,188,139, 86, 83,142,163, 28,165, 90, 66,240, 81,175,231, 86,134,132, - 71,158,249,119, 72,111, 82,208,169,123, 14,158,189, 91,223,123, 24, 50, 61, 39, 71,247, 91,210,203, 83, 1,223,176, 92,244,132, -144, 33,205,155, 55, 31,201,178,236, 54, 74,169,254, 43,108,105, 1,204, 33,132,156, 12, 14, 14, 62, 22, 16, 16, 16,255, 45, 72, -214, 63, 90,254, 70, 24, 97,132, 17, 70,252, 87,226,139,131, 74,151,132,111, 73,178,254, 29, 17,252, 38,162,225, 63, 97, 55,228, - 77, 68,237,255,132,244,126,124,121,242, 9,128,129,255, 80,101,188, 2,224,202,183, 36,213,132,144, 74, 0,248,223,132,100,253, -131,229,111,132, 17, 70, 24, 97,196,127, 39,190, 58,214,161, 17, 70,252,155,143, 36, 40, 0,198,152, 19, 70, 24, 97,132, 17, 70, -252,139,250,161, 18, 21, 45, 2,160, 67, 9, 63,186, 86, 14, 38,215,225, 11, 18,117,205,104,211,104,211,104,211,104,211,104,211, -104,211,104,243,127,203,230,127, 35, 8, 33,142,200,245, 86, 95,224,181,190,128,124,253,195,219, 29,141, 91, 95,141, 54,141, 54, -141, 54,141, 54,141, 54,141, 54,141, 54,255,219,221, 59,140, 41,252, 94,248,197, 51, 10,126, 70, 24, 97,132, 17, 70,252,131, 35, -125, 73, 94, 32,249, 47, 58,111,132, 17,255, 65,117,189, 96,215, 97,225, 53, 91,130, 47, 48, 84, 45, 79, 9,123,251, 15, 38,118, -162,163,163,227,152,186,117,235,122,136, 68, 34, 94, 86, 86,214,146, 27, 55,110, 44, 46,122, 93,155, 90,194, 39,124, 30, 92, 10, -253, 18, 32,124,128,199, 3, 75, 17,115, 59, 80,217,200, 88,244,255,214,149,210, 77,102,102,251, 23,225,241,197, 44,163, 3,171, -215, 1,248, 59, 28, 19,199, 49, 31, 24,173,186, 83, 73,191,119,172,223,219,149, 97,233, 42,128,219, 74,192, 27, 71,193,253, 78, - 40,111, 28,229, 97, 43,225,240, 19, 4,250,213, 96,132, 51, 5, 34,193,252,184,167,199,163,255, 27,242,236,207, 63,255,228,127, -205,239,251,246,237, 91,108, 0, 81,103,103,231,115, 38, 38, 38, 85, 75,250, 93, 78, 78, 78,124, 92, 92,156,247,127,121,125,108, - 3, 96, 51,128, 90, 69, 78,189, 2, 48,133, 82,122,253,107,255,163, 45, 33, 2,123, 96,172, 8,152, 13, 0, 58,224,215, 4, 96, -251,173,111,180,145,227, 91,192,206,206,238,182, 64, 32,112,207,201,201,201,201,204,204,172, 98,102,102, 22, 46,151,203,229, 12, -195,188, 73, 76, 76,108, 83,206, 60, 29,143,188, 80, 90,132,144, 89,148,210,173,229, 57,111,132, 17,255, 41,248,170, 93,135,132, -144,234, 0,188,242, 94,109, 26, 55,110,108,159,147,147, 3, 66, 72, 2,128,219, 0,252, 1,248, 83, 74,195,190, 69, 98,249,124, -254,154,141, 27, 55,206,152, 52,105, 82, 65, 48,232,160,160,160,226,175,229,193,229,230,217,107,118,143,131,195,208,184, 67,223, - 60,162,197, 3,114,226,225,221,177,201,151, 54,182,166,150,150,150, 75, 8, 33,253,120, 60, 94,153,157, 26,199,113, 44,165,244, -120, 90, 90,218, 34, 74,105, 86,121,254, 75, 33,151,234, 25,150, 45,246, 63, 4,124, 62,155,157,163, 46,209,237,133,181,181,117, - 0,143,199,171, 92, 56, 96,118, 94,250,139,253, 92,248,152, 97,152,152,164,164,164, 70, 6,228,133,148, 39, 16, 77, 33, 68,212, - 17, 60,174, 58, 64, 64,192, 11,227, 88,237, 85,142,209,109,164,148,170,191,134,100, 57, 86,168,114,103,218,252, 85, 46, 33,161, -175, 48,111,226, 96,252,178,121, 47,230, 78, 25,137,141, 59, 14, 99,202,152, 65,240,244,172, 85,170, 13,150,146, 37, 11,167, 12, -241, 94,177,241, 80,227,249, 83, 6,203, 87,108, 60,212,120,254,212,193,138, 21,155, 14, 53,154, 63,117,136, 98,249,166,131,141, - 22, 76, 29, 98,182, 98,211, 33, 29,128, 81, 95,146,206,193,213,157,115, 8,195, 20, 59,218,166, 2,129,230, 80, 88,172,252, 95, -241, 80, 15, 31, 62,188,174, 74,165,122, 58,184, 99,131, 85,245,171, 59,199, 22,119, 77,202,199, 88,231,240,215,207,124,133, 34, - 89,195,239,125,247, 6,149,102, 79, 34,145, 84,126,245,234,149, 59,199,113, 96, 89, 22, 12,195, 20,188,107,181, 90,180,105,211, -230,155,108,156, 33,132,116, 7,176, 36,247, 97,133, 31,165,244,216, 87,216, 82, 8, 4,130,105, 98,177,216,139, 97, 24, 15, 0, - 16, 10,133,161, 26,141,198,159, 97,152,245,148,210,236,114,154,220, 16, 27, 27,235,169, 80, 40,160,211,233, 10, 2,208,243,249, -252,154,174,174,174, 91, 0,184,127,237,253,219, 3, 99, 91,180,106,181,113,216,140, 25,124,213,237,219,216,184,123,247, 6,100, -102, 2,192,150,178,126, 43,145, 72, 46,243,120, 60,183,242,252, 31,199,113, 31, 52, 26, 77,167,242,252, 70, 32, 16,184,199,197, -197,217, 57, 57, 57, 1, 0,228,114,185,188,240,113,121,148, 44, 0,171, 41,165, 50, 0,224,241,120, 27, 91,180,104,209,156, 16, -194, 0,160, 28,199,241, 8, 33,131, 56,142, 19,228, 93,191,154, 16,178,155, 82,170, 49,118,219, 70,252, 39,170, 89, 37,145, 45, - 65, 41, 63,186, 0,192,171,113,227,198,178,129, 3, 7,194,203,203, 11,238,238,238,144, 74,165,185,141,120, 74,138,253,243,231, -207,251,223,190,125,187,255,217,179,103, 65, 8, 81, 1,184, 75, 41, 45,246,161,238,208,189,245, 36,169, 66,178, 9, 0,146, 98, - 82,226, 99,222, 39,110,138,143,143, 95, 77, 11, 69,163, 38,132, 84, 25, 54,108,216,244,201,147, 39,227,220,185,115, 56,124,248, - 48, 52, 26, 13,178,178,178,112,227,198,141,226, 19,170, 76, 68,218,141, 85,128, 60, 2,136,242, 7, 76,236, 0,185,253, 23,103, -150,165,165,229,146, 41, 83,166, 76,245,244,244, 44,240, 98,174,215,235,193, 48, 12,244,122, 61,210,210,210, 48,125,250,244,124, - 6, 11,142,227,112,241,226,197, 73, 99,198,140, 1,128,105,197,217,108,222,200,245, 9,143,240, 92,242,181, 26,202,178, 49,247, -159, 69, 55, 98, 88,150,175, 86,235,138,141, 84, 46,149,138, 74, 37,121, 66,161,208,229,229, 95,127,217,241,196, 98, 80,150, 5, - 56, 14,148,227, 0, 20,122,209,220,239, 40,203,129,234, 89,112, 12, 7, 70,165, 65,147,241,227, 13,169, 52, 45,132, 98,217,225, - 33, 63,206,112,104,218,172,153,176, 98, 5, 39, 48, 44,135,119, 17, 49, 14, 79,159, 60,104,121,124,223,150,113,132,144, 65,148, -210, 47,242,179, 37, 54, 49,187,242,219,239, 59, 93, 30, 63, 15,193,245,155,183,113,237,134, 63, 0,224,242,205, 92,115, 60, 30, -175,172,244, 89, 90,187,123,215,157, 52,178,167,124,249,218, 93,146, 73, 35,123, 10,254,126,223, 41,153, 52,242,123,193,138,245, - 59, 37,147, 70,126, 47, 92,246,235,111,245, 9, 33,150,148,210,180,146,236,149, 84, 70,132, 97, 36, 7,195, 19,248, 0,144,180, -109, 27,244,137,137,112, 90,180, 8, 0, 48,164,138,189,193,211, 29,182,182,182, 79,132, 66,161, 75, 89,215,233,245,250, 50, 73, -240,240,225,195,235,169, 84,170, 39, 12,195, 80,129, 64,224, 59,184,215,119,167, 59,183,174,151, 82,248,154,160,160, 64,235,149, - 43,255,234,121,236,105, 22,237,223,208,244,233,185, 53,195, 27,117,155,185, 55,176,148, 14,153,167,209,104,240,230,205, 27, 20, - 14,242, 94,152,215,126, 97,227,195, 3,176,209,218,218,186,105, 74, 74,202, 16, 0,243, 50, 51, 51,235,242,249,124, 88, 89, 89, -205, 35,132,188, 51, 55, 55,223,149,145,145, 17,144,167, 26,113, 6,218,109, 99,102,102,182,255,212,169, 83,150, 13, 26, 52,224, - 37, 39, 39,163, 82,165, 74, 72, 77, 77,109,114,251,246,237,134,163, 70,141, 26, 69, 8,249,129, 82,122,187, 28,201,173, 97, 98, - 98, 66,135, 13, 27, 70, 88,246,239,219,253,227,143, 63,208,169, 54, 83,245,167,206,114,165, 90, 75, 51,174,191, 49,255, 73, 36, - 18,221,141,140,140,204, 40,111,126,136,128,217,195,102,204,224, 43, 34, 35,161, 8, 12,196,144,204, 76,193, 47,185,234, 86,153, - 68,139,199,227,185,237, 63,188,199, 93, 44, 22,131, 97,152, 2, 50,152,223, 70,233,245,122,232,116, 58,232,245,122,176, 44, 11, -189, 78, 15,191,229,191,126,113, 91,104, 98, 98, 98,226,228,228,148, 96, 98, 98, 98,242, 45, 58, 34,137, 68, 34,216,183,111,223, - 32,177, 88, 12, 0,208,106,181,168, 93,187, 54, 49,118,209, 70,252, 55,145,173,226, 84,174,210, 70,169, 93, 50, 51, 51,193,178, - 44, 76, 77, 77,193,231,243,139, 42, 42,232,216,177, 35,218,180,105,131,129, 3, 7,226,229,203,151,178,129, 3, 7,118, 44, 81, - 25,152,209, 13, 21,220,237,243, 58, 19,206,241,222,249,231,171,254, 88,246,167, 45,128, 25,133, 46, 27, 53,118,236, 88,146,146, -146,130,126,253,250,221,214,104, 52, 61, 40,165,153, 37, 42, 26, 28, 98,188, 7, 14, 1, 71,137,108,253,195,157, 68,171, 86, 81, - 30,143,167,202,159, 58,252,194,140,234,231,228,228,132, 35, 71,142, 64,171,253,220, 93,152,153,153, 25, 94,188,120, 81, 88,129, - 67,179,102,205,248,132,144,126, 37, 17, 45, 66,120, 46,247, 30, 71,218,229, 31,119,235, 88, 75,212,188,145, 91,130,173,181, 41, - 5, 64,230,207,159, 95, 64,220, 0, 96,201,146, 37,134,164, 19, 60,161, 16, 73,254,254,127, 55,196, 2, 30,120, 34, 2, 34, 4, -120,130,220, 89, 84, 80,128,178, 0,199, 0,156, 30,144, 58, 86, 48,196,118, 19,103, 87,247,115, 43,215,109,181,208,232, 41,142, -156,185,142,136,136,247,224,243,120,168, 82,213, 29,223,181,109, 45,108,216,184,121,133, 95, 23,207, 56, 75, 8,233, 66, 41,125, - 84,238,140,230,168,180,170,171, 13,118,253,241, 20,182,150, 10,244,235,217, 21, 50,169, 4,191,108,222,131,229,115, 39,194,189, -138, 27,182,111, 88, 81,226,207,205,205,205,151, 54,168, 83,179,202,158, 99,151,224,213,166,133, 96,239,177,203,104,219,166,165, - 96,207,177, 75,104,235,213, 90,176,247,216, 37,180,109,211, 74,184,247,216, 37, 52,107, 84,167,106, 64, 74,208, 82, 0, 19, 75, -190,231, 34,101,244, 93,110, 25,185, 11, 68, 5, 29, 65,228,184,113, 0, 80, 64,180,202, 3,161, 80,232, 18, 23, 23,103, 87,214, -117,101,169, 6,121, 74,214, 19,134, 97,144,152,152, 72,210,211,211,169,133,133, 69,207, 75,219,231,157,234,212,170, 94, 42, 0, - 4, 6, 6, 90,249,249,173,236,121,244, 73, 38, 84, 15,126, 35, 7,255,242,231,134,244,240,122,114,102,213,240,134,125,251,246, -125, 86,156, 93,141, 70, 19, 81,191,126,125,154,247,217, 89, 34,145,136,138,212, 9, 39,119,119,247,207, 84,107, 3,166, 20, 55, -222,191,127,127,162,167,167, 39,106,214,172, 25,208,180,105, 83, 51,185, 92,142, 75,151, 46,193,195,195,163,150,153,153,217,195, -227,199,143, 11,231,204,153, 83,111,247,238,221, 0, 48,201,128,250,217,193,219,219,251,200,185,115,231,164, 34,145, 8, 42,149, - 10, 47, 94,188,128,185,185, 57,196, 98, 49,190,255,254,123,126,203,150, 45,173,219,182,109,123, 34,111, 48, 96,240, 14, 40,181, - 90, 77,231,205,155, 7, 19, 19, 19,152,152,152, 64, 46,151, 67, 46,151, 67, 33, 5,217, 54,197, 85, 54,121, 71,186,108,218,162, -109,171,246,111, 93,124,211,213,213,245,231,168,168,168,244,242,214, 5,213,237,219, 80, 4, 6, 2,133,158, 93, 67, 97, 46,183, -130,175,175,111, 89,138, 20, 68, 34, 17, 90,180,104, 81,166, 61,107,107,235,147, 2,129,192,190, 72,231, 32,245,245,245,101,195, -194,194,228, 60, 30, 79,206,113, 28,124,125,125, 89,134, 97,164,246,246,246, 1, 28,199, 37, 36, 37, 37,245, 46,203, 54,165, 84, - 67, 8,153,197,227,241, 54, 74, 36, 18, 65,197,138, 21, 63, 44, 92,184,240,126,158,154, 9, 74, 41,175, 98,197,138, 77,100, 50, -153,155, 70,163, 97, 0,204, 50,170, 89, 70,148,130,134,185,162,112, 1,180, 0,196,249, 2,126,110,111, 7,155, 34,223, 3, 64, -114,222, 64,209,190,132,227, 20, 0, 47, 1,212, 0, 96,151,119,238, 49,128,212,242, 38,176, 84, 69,139, 16, 66, 11, 93, 88,208, -177,152,154,154,226,241,227,199, 32,132,192,212,212, 20,102,102,102, 48, 55, 55, 71,102,102, 38, 94,190,124,137, 87,175, 94, 33, - 50, 50, 18,132, 16, 84,169, 82, 5,249, 15, 80, 33, 91, 5, 13,220,161,181,231, 32, 85, 72, 64, 8,208,160, 93, 93,212,109, 83, - 27,141, 31,133, 79,113,114,114,218, 17, 23, 23,247,134, 16, 34,168, 93,187,246,168,102,205,154, 97,221,186,117,208,104, 52,235, -138, 35, 89,133,109,222,126,161,111,148,215, 57,205, 60,112,233,157,201,208,206, 85,149,113,113,113,107,190, 32,115, 62,105,136, -147,147,147, 13,142,197,199,113, 28,210,210,210, 74,181, 89, 84, 33, 88,191,241, 55,139,172,140, 4, 44,251,229, 0,244,122, 61, -102,204,152, 1,142,227, 10, 94,233,233,233, 6,165,147,178, 69, 68, 6, 94,238,139,240, 0, 34, 0, 92, 7,228,242,138,168, 35, -191,129, 80,128,176, 0,138,220, 87, 81,155,132, 16, 41, 95, 36, 59,186,248,151, 77, 22,207, 94,197,224,204,245,103,208,101,198, - 34, 62,240, 20, 0,160, 74,139, 65, 56,166,225,163,105,221,170,152, 58,255, 87,203, 5, 83,127, 56, 74, 8,169, 89,120, 26,209, -144,142,141, 82, 22,203,150, 46,197,142, 77,235,240,235,186, 77,200,204, 72,135, 80,104, 3, 0, 96, 24, 22,108,145,123,251,236, -222, 41,237,188, 96,230, 88,178,113,231, 9,212,174,230,128,179, 87, 3,208,168,150, 27, 46,222,120,132,102,117, 42,225,178,255, - 83, 52,171, 91, 25,254, 15, 94, 96,198,132, 97,228,222,197,189,157,203, 83, 70, 27, 54,252,102,145,149,153,128,115, 43,246, 33, -113,203, 22,124,152, 56, 17, 77,242,174,121, 68, 8, 68, 46, 46,128,168,236, 50, 42,138,208,208, 80,104, 52,154,226, 70,251,240, -240,240, 40,179,220, 85, 42,213, 83,134, 97,104, 66, 66, 2, 73, 72, 72,128, 92, 46, 39, 47, 94,132,176,181,106,213,238, 69, 95, -253,185, 19, 0,252,252, 86,246, 58,246, 52, 19,202,128, 77, 80,221,223, 12, 81,165, 32,222,142, 37, 99,117, 99, 22,109,127, 90, -168,147,251, 36,157,241,241,241, 93,242, 63, 87,169, 82,229, 85, 88, 88, 88,141,252,169,230,188, 41, 68, 17,195, 48,238,249,211, -137, 12,195, 64,163,209,160, 67,135, 14,252,210,238,221,210,210,178,153,135,135, 7,158, 61,123,134, 77,155, 54, 89,121,123,123, -227,237,219,183, 32,132, 96,229,202,149,196,211,211, 83,152,156,156,140, 78,157, 58,225,228,201,147, 45,202,202, 79, 66,136,169, - 92, 46,223,125,246,236, 89, 41,143,199, 67, 86, 86, 22, 56,142, 67,203,150, 45,193,227,241, 16, 18, 18,130,249,243,231,227,228, -201,147, 56,125,250,180,172, 97,195,134,187, 9, 33, 30,133,167,245, 75, 41, 35,170, 86,171,169, 68, 34,129, 68, 34,129, 84, 42, -133, 84, 42,133, 88, 44, 70,182, 26, 24,179,254,131,134, 47,181,225,106,213,111, 85,117,196,228,149,188, 53, 11, 71,222, 0,112, -198,208, 58, 15,228,174,201,218,184,103,207,166, 33, 25, 25, 60, 0,216, 69, 8,167,163,244, 87, 67,158,119, 0,200, 86,103,192, -173,138, 11, 78, 28, 61,141, 62, 3,122, 22, 75,178,132, 66, 17, 68, 66, 33,204,172,228,101,218, 20,137, 68,246,175, 94,189,178, - 22, 10,133,160,148,130,101, 89,232,116,186,132, 5, 11, 22,216,250,248,248,152, 94,188,120,145,231,227,227,195, 89, 90, 90,230, - 60,122,244, 40,145, 97, 24,235,214,173, 91, 27, 92,231, 41,165, 91,235,215,175,223,224,212,169, 83, 35,125,125,125,159,204,156, - 57,115, 89,225,243,171, 87,175, 94,122,225,194, 5,183, 94,189,122,237,127,254,252,249,214,242,180, 33, 95,219,206, 27,109,254, -251,217, 60,127,254,124, 65, 67,236,227,227, 83, 84,237,180, 39,132,156, 43,244,255,221,242,143,125,125,125,231,249,249,249,189, - 32,132,156, 43,252,125,254,117,121,109,199,185,226,142,243,126,107, 53,119,238,220,218,171, 86,173, 90,217,188,121,243, 35, 1, - 1, 1,239,203, 75,180,202, 92,163,149, 79,174, 10, 19,174, 34, 6,144,153,153,137,204,204, 76, 68, 71, 71, 99,219,182,109,121, - 15,180, 16, 2,129, 0, 2,129,160, 96, 61, 67, 73,184,118,246,206,102, 0,155, 27, 54,108, 40, 12,190,127,252,226,236, 29,147, -219, 55,234,208,128,255,244,122,112, 95, 0,203, 1,116, 25, 54,108,152, 13, 0,236,219,183, 47, 25,192,197,127, 5,101,166,148, - 30,127,243,230,205, 84, 71, 71,199,130, 53, 42,133,167, 15, 25,134,129, 84, 42, 69,254, 90, 22,181, 90,141,109,219,182, 49,148, -210,227,165,216, 68,216,139, 27,120,243,226,102,238,239, 56, 14, 28,251,247,239, 23, 47, 94, 92,120,139, 40,198,229, 41, 39,101, -146,188,226,242,156, 22,121, 47,242,253,103,228,236,179,233, 9,209,228,190, 63, 76,116,228,136, 0,127,221,120, 14,161, 80, 8, -174,144,154, 41,228,231,142,150, 95,188,141,131,147,125, 45,244, 24, 52,214,225,212,254,223, 38, 3,248,165,188,121, 93,179,110, -115, 76,153, 58, 21, 59,119,236,192,252, 69, 75, 11, 88, 58,195,178, 96,202, 76, 39,143,215,178,145, 39,178, 83, 98,192,231,243, -209,162,126, 85,240,249,124,180,110, 84, 29,124, 62, 31,173, 26,215,128, 64, 32, 64,219,102,158,168, 86,173, 26, 4, 2, 1,175, -140,114, 71,216,139,235,120,243,226, 86, 33,210, 75, 65, 1,232,226,227, 63,187, 94, 31, 31, 15,234,106, 93,222,186,133, 81,163, - 70,165, 71, 71, 71,235,138,158,171, 80,161,130,232,246,237,219, 22, 37, 76,219, 21, 64, 38,147, 53, 20, 8, 4, 79, 83, 83, 83, - 57, 19, 19, 19, 30,199,177, 92,173, 90,181,249,151,182,207, 59,149,127,205,220,185,243, 78,245,111,104,214,235,192,241,115, 84, - 84,177, 21, 33, 66, 9,243,227,162,237, 34,161, 72,102,144,199,251,252,105,196,215,175, 95,163,172,244, 20, 30,152, 21,135,180, -180,180, 97, 30, 30, 30,183, 55,111,222,108, 69, 8,193,157, 59,119,192,231,243, 11, 94,225,225,225,224,241,120,152, 61,123,182, - 46, 51, 51,115,116, 89,105, 19, 8, 4, 83, 79,156, 56, 97, 46, 22,139,145,149,149, 85,240,220,240,249,124,188,122,245, 10,107, -214,172,193,176, 97,195, 16, 21, 21, 5, 39, 39, 39,204,152, 49, 67,177,106,213,170,169, 0,150, 26,112,235, 65, 90,173,182,145, -137,137, 9,164, 82, 41,242, 9, 23, 0, 92,121, 33, 12, 81, 42,149,117,108,108,108, 28,108,253,207,253,213,194,187, 71, 61,107, - 91,199,230,249, 68,203, 80,188, 3,118, 68,176,236,130, 46,167, 78,217,221, 59,117,138,123,112,246,108,140, 36, 43,107,187,193, -117, 72,207,195,135,240, 24, 52,108,216, 16, 79,159, 62, 69,195,134, 13, 11,147, 38,136,197, 98,136, 68, 34,136, 68, 34,216, 88, - 26,180,132,130,242,120, 60,220,187,119, 15, 44,203, 66,171,213, 66,171,213,194,211,211, 51,245,230,205,155, 10, 0, 8, 15, 15, -167, 67,135, 14, 77,127,248,240, 33,234,215, 47, 61,158,186,131,131,195,109, 62,159, 95,177,200,179,106,217,187,119,111,164,165, -165,117,237,221,187,119,171,188,239, 98,255,252,243,207,161, 0, 32, 22,139,193,227,241, 88, 24,241, 63,143,124,114, 85,152,112, - 21,211,230,116, 43,122, 76, 8, 57,231,231,231,215,173,232,119,133, 73, 85,113,159, 11,255,118,213,170, 85, 43, 11,217, 86,125, -193,108, 88,217,107,180, 8, 33,180,172, 70,179, 52,148, 69,180,242,241,244,233, 83,189,179,179,243,206, 55,207, 35,219, 87,173, - 91, 5, 50,185,228, 59, 66,200,102,137, 68, 50,253,135, 31,126,192,131, 7, 15, 16, 18, 18,242,199,215,134, 83,169, 83,167,206, -101,137, 68,226, 86,194, 52,201,135,224,224,224, 78, 37,116, 12,139,242,214,156,149,184, 24,190,240,122,177,194,139,225, 75,172, - 24, 28,133, 94,167, 71,142, 82,245,119, 39,158, 71,180,114,114,114, 48, 96,192,128, 79, 20,173,196,196, 68, 67, 10, 21,107,206, -156,193,213,227,199,209,181, 94, 61,156,124,244, 8,171,126, 24,140,154,110,206,160, 44, 1, 37, 64,212,225,223,144,146,153,141, - 67,215,239, 33, 53, 75,137, 33,173, 91,195,221,204,166,116,187, 66, 81,199, 38,205,154,139,174, 5,188,132, 80, 40, 0, 15, 28, -168, 94, 9, 39,143,182,224,243,120, 48,183,175, 4,145, 80, 8,161, 80,128,240,232,100,120,212,110, 44, 62, 39,150,118,252, 18, -162, 85,193,173, 18, 88,150,197,176, 97,195,112,228,200, 17, 88, 59,184,193,188, 66,109, 44, 95,183, 3, 93, 59,180, 46,243,254, -243, 71,240, 2,129, 0,124, 62,255,179,247,252,207,134,168,147,148,163,208, 21, 45, 35,142, 2,148,194,101,197, 10,184,172, 88, -129, 71,121,255,233,153,147, 3,149, 74, 5, 52,173, 85, 46,146,165,213,106, 17, 29, 29,173,139,143,143,183, 47,166,131, 74,208, -106,181,101, 18,155,189,123,247, 6, 13, 31, 62,188,145,149,149,213,147,160,192, 64,125,221,122,245,132, 23,183,205, 59,157, 63, -109, 8, 0,245,234,213, 75,157, 55,111,222,233,161,253,186,245,220,234, 59,144, 29,191,116,191, 64, 34,147, 53,234, 54,179,244, - 5,241,133,158,143,136,186,117,235, 82, 67,174, 85, 42,149, 31, 75, 41,163,238, 0,150, 52,104,208,192,204,219,219, 27,183,111, -223, 70,159, 62,125, 52, 58,157,238, 77, 94,163, 90,253,208,161, 67,226,151, 47, 95,194,214,214, 86,248,225,195,135,221,132,144, - 82, 23,200,139,197,226,182,141, 27, 55,230,105, 52,154,207, 72,214,170, 85,171, 48,104,208, 32, 84,175, 94, 29, 28,199, 33, 59, - 59, 27,222,222,222,194, 77,155, 54,181, 53,144,104, 77,169, 89,179,230, 26,228,238, 58, 44,220, 22,134, 2,152,149,167,118,127, -236,214,103,216,139,214, 29,122, 55,170, 88,173,182, 99, 89, 6,237,237,237,231,242,120,188,254, 28,199,241, 51, 51, 51,163,181, -132, 84,243,116,115,179,111,217,179, 39, 50,132, 66,254,198,235,215,121, 9, 89, 89, 10, 0, 6, 77, 65,170,245, 57,112,171,146, -187,212,175,207,128,158,120,250,244, 41,250, 14,236, 5,145, 72, 4,129, 64,152,251,108,138,114, 21, 45, 11, 27, 51,131,234,166, - 94,175, 47,104,195,243,215,121,233,116, 58,228, 47,205, 50, 49, 49, 41, 56,167,209,104, 74, 28,144,231,193,253,216,210,133,118, - 50, 51,115,176,122, 61,106,245,236, 91, 80,167, 31,238,218, 42, 3,199,201,210, 63, 68, 96,210,241,179, 66, 24, 97, 68, 9,170, - 86, 49,106, 86,225,118,229, 92, 81,178,245,165, 32,132,156,243,245,245,157, 7,128,250,250,250,206,203, 63,246,243,243, 83, 1, -136,253, 18,178, 85,156,202, 37,248, 22, 36, 43,127,122,161, 52,180,107,215,110,146,169,169,233, 38, 0,104,212,168, 17,162, 31, -196, 34,250, 65, 44, 60,106,212,106,217,160, 94,163,140, 65,131, 6,193,218,218, 26, 51,103,206,164, 0,254, 40,239,255,135,135, -189, 80, 0,160, 78, 78, 78, 51, 1,192,201,201,169,222,163, 71,143,108, 31, 63,126,140,198,141, 27,255, 45,221,235,116,104,213, -170, 85,105, 29, 98, 22,114,215, 90, 77,251,118, 42, 25, 7,157, 78, 7,165, 82, 5,173, 86, 7, 70,207,129, 97, 24, 52,172,101, -138,253, 59,124,115,191, 99,242,213,179, 92,213,204,197,193, 20, 13,235, 56,232,121, 60,162,122, 28, 24, 95,108,139,169,213,106, - 17,244,225, 3, 2, 35, 35, 1, 0, 61,252, 74, 95,248,186,255,250,109,120,122,122,150,149,218,170, 46, 78, 14,136,187, 26,148, -219,120,171,162,241,248,238, 49,152,154, 42, 0, 0,181,188,134, 64, 36,202, 37, 90, 57, 42, 29,108,106, 84, 0,161,180, 68,183, - 0,114, 43,199,203, 2,145,212,141,178, 28, 40,229, 64, 57, 22,148,114,144,152, 90,155, 76, 26, 55, 18, 28,199,162, 73,147, 38, - 32,124, 62, 88,189, 6,253,186,119, 68, 90, 70, 22,172, 45, 12,235, 36, 68, 34, 17,188,188,188,100, 37,157,127,251,246,173,170, - 48, 49, 43,189,140,244,200,201, 81, 65,163,209, 64,167,101,160,211, 51, 96, 43,139,176,108,193, 96, 48, 58, 6,202,129,205,161, -211, 51,224,166,246,130, 78,171, 71,148, 9,143, 87,207,211, 86,207, 3, 81, 61,123,153,104, 86, 22,209,202, 39, 7, 37,161,184, - 53,129, 37,144,173,192,225,195,135, 55,172, 91,175,222,211,254, 29,234,173, 13, 14,121, 17, 23, 28,242,226,179,235,220,170,215, -139, 24,191,234,200, 12,161, 72,214,208, 80,146, 5,124, 58,141,248,149,152,151,149,149, 85, 87,161, 80, 32, 44, 44, 12,124, 62, - 31,132,144,183,148,210,186, 0, 48,118,236,216,119, 2,129,160, 10,159,207,199,150, 45, 91,136, 64, 32,168,211,188,121,243,121, - 0,142,149, 50,160,243, 48, 53, 53,253, 68,205, 18,137, 68,240,245,245,197,208,161, 67, 11, 72,150, 72, 36,194,222,189,123,209, -168, 81, 35,104,181, 90, 15, 3,201,240, 99, 0,173, 13, 80,252, 72, 30, 57, 47,147,140, 50, 12, 51, 60,165,127,255,106,240,247, - 71,203, 42, 85, 60, 27, 54,108, 8,157,238,111, 65,179, 74,149, 42, 21,178,178,178, 62, 18, 66, 14, 2,216, 74, 41,125, 94, 42, - 41, 82,115,248, 16, 30,147, 63,104, 69,147, 38, 77, 10, 20,172,194,106,150, 72, 36,130, 76,172, 40, 23,209,226,184,220,118, 41, - 43, 43,139,231,239,239,111, 83,179,102, 77, 2, 0, 53,107,214, 36,207,159, 63,183, 50, 49, 49, 73,174, 90,181,106,153, 3, 96, -153,153, 57,246, 14, 31, 0, 0,248,185, 67,231,130,129,209,165, 37,243, 32, 20, 10,209,126,230,188,207,234, 61,199,113,124, 24, - 97, 36, 89,101,144,172,226, 20,173,175,235,155,255, 86,180,252,252,252, 94,248,249,249,125,166,142,149,211, 94,217,138,150, 33, - 83, 1,101, 61,172, 37, 97,221,186,117,168, 83,167, 78,169, 29,209,166, 77,155,112,224,192,129,117,148,210,240,242,254,127,183, -246, 13,106, 97,253,169, 23, 85,170,215, 34, 0,176,116,106,119, 94, 78, 78, 14,238,221,187, 7,115,115,115,188,125,107,152,219, - 47, 66,136,169,185,185,249, 18, 30,143,215,143, 95,116, 7, 64,241, 4,147,229, 56,238,120, 70, 70, 70,137,238, 29, 40, 5,116, -122, 6, 57, 74, 53,180, 90, 45,166,206,254,173,204,116,248, 1, 68,167,205, 18,120,181,105, 46, 43, 73,209,105, 82,167, 45, 38, -252,160,248,172,243,230,243, 0, 30, 15,168,223, 36, 87,113,121,254,232, 5, 56, 14, 96, 57,192,198,206, 18,127, 28, 94, 91,106, - 22, 48, 44,151, 55, 58,102,145,173, 97,225,209,172, 27, 98, 66,253, 11, 20, 36,177, 40,119,202, 88, 36, 20,130,163, 36,215,235, - 67, 73, 68, 72, 44,115, 75,139, 15,119,223,113, 46, 24, 99,186,213,193,159,215,130,208,183, 67, 93,220,124,248, 18,222, 77, 61, -241,226, 77, 36,106,185, 87,196,150,221,199, 65, 41,178,126, 95,191,252,227,223, 29, 26,243,193, 16, 69,235,193,131, 7,170,162, - 42, 86,225,119, 90,118,127, 8, 74,255, 86,180, 84,106, 13,102,206, 53,200,157, 79,110, 25,181,110, 38, 51,228,226,210, 20, 43, - 67,136, 88, 81,101, 11,101,184,103,169, 12,160, 17, 48,231, 95,217,112,178, 44,139,243,231,207, 23,148, 71,113,229, 88,184,236, - 12, 32, 57,248,240,225, 3, 94,188,120,129,102,205,154, 33, 35, 35, 3, 66, 30, 15, 51,130,131,225,249,195, 15,208,138, 68,224, - 56, 14, 98,177, 24, 99,199,142, 53, 56, 63,203,217,154,230,173,115, 99,105, 25,109,201,218,110,221,186, 85, 11,203,201,193,139, - 87,175,208, 97,241, 98, 0,192,133, 11, 23, 62,169, 19,211,167, 79, 23,191,124,249,114,212,147, 39, 79, 70, 17, 66,214, 81, 74, -103,148,216,206, 82, 77,193, 26,173,254,131,251,160, 90,205,202, 56,176,231,112,193,249,233,179,166, 64, 40, 20, 65, 40, 18,194, -194,220,194,160,187,209,235,245, 5,164, 85,169, 84,242, 46, 92,184,224,210,177, 99, 71,209,148, 41, 83, 8, 0, 28, 56,112,128, -183,121,243,102,249,213,171, 87, 69,206,206,206,241,101,146, 75,157,238,179, 50, 38,132, 64, 40, 20, 66, 36, 22, 1, 28, 7, 66, -136,124,245,234,213, 75, 95,188,120,209,184,102,205,154,208,104, 52, 63, 16, 66,158, 25,253,104, 25,145, 63,109, 88, 18,225, 42, -110,173, 85,158, 42, 85, 18,146, 10,175,219, 42,137,168, 21, 94,179, 5, 64, 83,254,102,193,192, 53, 90,197,129,207,231,151,169, - 86,241,120,188, 50,167, 14,167, 79,159, 14, 83, 83,211,146, 58, 32, 26, 28, 28,252, 50, 62, 62,126, 7,165,244,183, 47, 41,156, -115,215,159,189, 88, 50,173, 87, 22,242,230, 86, 45, 44, 44,146,219,181,107,151, 13, 64,119,236,216,167, 3,100,141, 70, 83, 98, - 7,110,110,110,190,100,215,174, 93,147,123,246,236,201, 43,234, 98,160,240,244, 94,254, 75,175,215,227,216,177, 99,147,231,204, -153,131,146, 84,176,252, 78, 92,153,163,130, 42,111, 33,244,187,144, 63, 13, 45,189, 18, 79, 41, 44, 28,225, 82,185,110,137,157, - 9, 79,148,187,134,200,222,245,239, 14,204,212, 84, 10,182, 20,155,132,240,194, 35,163,226,156, 43, 56, 88,225, 93,116, 18,236, - 43,214, 65, 90,236,223,249, 32, 16,240, 33,204,155, 58,180, 48,147, 35, 41, 49, 17, 60, 30,191, 84, 98,188,252,208, 51, 60, 12, -137,196,137,107,207,161, 83,231, 96,253,190, 75,208,105,178,161, 83,231, 64,167,206,125, 95, 57,231, 71, 16,130,143, 58,117,118, -245,242,148,187, 64, 32, 64,211,166, 77, 75, 36, 58,177,177,177, 6, 42, 90,180, 64,209, 82,169,203, 89, 70,134, 61,132,165, 42, - 86,249,231,191,148, 24,228,187,124,144,201,100,141,246,238, 45,217,141, 67,113,112,116,116,188,168, 80, 40, 42, 25,122,125, 57, -156,151,174,180,176,176, 88, 82,179,102, 77,143,245,235,215, 11,249,124, 62,218,183,111, 95,253,199, 31,127,252, 0, 0,117,234, -212,113,202,111, 99,198,143, 31, 79, 31, 60,120, 16,146, 59,198, 40, 25, 98,177,248,149,185,185,121, 35,111,111,111,100,100,100, - 32, 58, 58, 26,114,185, 28,158,107,215, 34,120,252,120,212,219,182, 13,188,118,237, 64, 8,129, 88, 44, 70,112,112, 48,100, 50, -217,171, 82,200, 80, 83, 0,191, 2,104,137,191,167, 11, 41,128,123, 0,102, 83, 74, 31, 22,211,222,241, 0,128,229,184,178, 10, -107,240,204,153, 51,145, 46, 20, 2, 62, 62, 16,133,135, 67,167,211,161, 89,179,102, 5, 42,123,179,102,205, 32, 16, 8, 80,183, -110, 93, 56, 57, 57, 97,203,150, 45,131,241,233, 78,236, 79,160,206,214,225, 67,120, 12,154, 55,111, 94,160, 92,249,248,248, 20, - 40, 90, 66,161,176, 64,217, 34,108,217,196,149, 16, 66, 11, 15,146, 89,150, 37, 2,129, 64, 48,109,218, 52,210,167, 79, 31,170, -213,106, 57,177, 88,204, 59,113,226, 4,185,121,243,166, 32, 39, 39,167,204,129,120,237, 94,253,240,115,199, 92, 81,116,121, 37, - 91, 8, 69, 66,136, 69, 34,204,124, 21, 83, 80, 46,102,123,143,136, 87,173, 90,213,183,102,205,154,185,211,240,128,192,232, 71, -203,136, 50,212,172,164, 34, 36, 73, 91,232, 56, 9, 0,201, 59, 78, 42, 68,168,146,144,187,131,176,113,145,107,243,207,107,139, -188,231,159, 15, 44,111,218, 11,197, 58,252,140,124,149, 54, 34,126,115,255,254,125,247,134, 13, 27, 34, 42, 42,234,179,157,112, -249, 29,151, 92, 46,135, 76, 38, 67, 64, 64, 0, 0,188, 41,201,216,141, 27, 55, 54, 35,215,235, 50, 0,192,201,201,169,185,119, -255,182, 1, 77, 58, 55,198, 33,191,195, 25,241,241,241,117,243,125,232, 16, 66,136,147,147,211, 80,161, 88, 48,160, 74,109, 87, - 47,112,220,175,215,254,186,187,184,180,155,172, 82,189, 86, 54, 0, 85,161, 93,135,107,190,164,160,121, 60, 94,191,158, 61,123, -242, 94,190,124,137, 1, 3, 6,224,192,129, 3, 37, 94, 59,116,232, 80, 28, 57,114, 4, 61,123,246,228,205,157, 59,183, 95, 89, - 68, 43, 87, 45,209,126,179, 74, 25,246, 54, 16,251,143,236, 42,113, 13,146,157, 93,238,122,172,196,196,228,130,239, 26, 55, 44, -125,102,132, 99,180, 87,159, 61,121,212,188, 69,155,246,162,232,132,116,112,140, 6,234,172,191,127,175, 76, 79, 0,101,212, 16, -153, 88,193,193,198, 28, 79,239, 95,209,234,180,234,171,165,217,156,220,179, 22,198,119,247, 0, 40,135, 94, 51,254,192,185,223, - 38, 21,140,160, 91,245,153,130,235,199, 54, 26,188,198,175, 40,132, 66, 33,130,131,131, 85, 37,169, 89,124, 62,191, 76,159, 92, -127,171,142,122, 40,149, 42, 40, 85,234,111, 86, 70,132, 16, 91,123,123,251,223,173,172,172,164,197, 17, 41, 66,136,173,173,173, -237,239,214,214,214, 82, 67,167, 14, 75, 34, 89,121,126,181,158, 12, 31, 62,188, 92,100, 75, 34,145, 84,122,243,230, 77,129,179, -210,210,222,181, 90, 45,188,189,189, 13,114, 94, 74, 41, 61, 75, 8,121,239,232,232,120,207,211,211,211,252,221,187,119, 56,124, -248,176, 72, 40, 20,186,230,183, 31, 89, 89, 89,224,243,249, 72, 76, 76,212, 3, 24, 89,214,212,153, 70,163,241,247,247,247,175, -223,189,123,119,254,171, 87,175,192,231,243,115,211,213,188, 57,234,109,219,134,144,105,211,224, 21, 25, 9,181, 78, 7,169, 84, -138,203,151, 47,235,148, 74,165,127, 73,246,100, 50,217,142,136,136,136, 90, 82,169, 20, 58,157, 14, 28,199,129,199,227, 17,129, - 64,208,202,194,194, 98, 19,128,198,159, 62, 83,118,118, 99,167,255, 82,131,101, 24, 54, 62,234, 93, 82, 89,121,144,146,146,130, -179,103,207,162, 89,179,102,240,242,242, 66,108,108, 44,194,195,195,209,181,107,215,130,107, 2, 3, 3,241,236,217, 51, 84,173, - 90,181,108, 69,143,167, 71,213, 26,149, 32, 18,137,114, 21, 34,161, 40,111,224, 35, 44, 80,178, 68, 66, 17,132, 2, 33,164, 50, -169,193,138, 22, 33, 4, 60, 30, 15,132, 16,200,100,178,252, 65, 54,231,226,226, 18,159,154,154,234, 8,128, 47,147,201,192,178, -172, 65,131,150,252, 62, 34,159,100,137,196,162, 2,101, 11, 0,210,211,211,213, 61,123,246, 60,168,209,104, 70,224, 11, 34,148, - 24,241, 63,137,199,255,162,223, 26,204, 19, 41,165, 59,138, 91, 20, 95, 90, 5,239,218,162, 69,139,109,131, 6, 13,106,191, 97, -195, 6, 40, 20, 10,196,199,199, 23,116,136, 98,177, 24, 21, 42, 84, 64,106,106, 42,182,111,223,142,152,152,152, 27, 0,198, 26, -154,162,248,248,248, 7,111,159,191, 73,241,238,219,194,186, 86,139, 26, 22,209,111, 98,154, 1, 8,200, 35, 89,127, 12,154,222, -117,132,119,239, 38, 16,137,133,136,126,251,241,255,173, 36,249,124, 62,159, 16,130, 1, 3, 6, 24,116,253,192,129, 3,225,239, -239,143,210,166, 25,185,124, 69, 75,169, 70,142,234,219, 13,214, 38, 76, 26,138, 9,147,134, 22,144, 9, 67,166, 94,114, 73,238, -209, 82,136,150,110,195,185,163,219,199, 52,104,210,220,173, 81,173, 74,120,248,228, 57, 14,109,251, 91,100,216,189,121, 41,126, -217,125, 3, 21,236, 45,161,211,228,224,226,159, 59, 63,234, 52,202, 13, 95, 40,202,229,146, 91, 66, 96,160,159,202, 79, 84,212, -124,162, 85,187,118,237, 18, 21,173,212,212, 84, 85, 89, 29, 67, 65, 25,105,245,200,206, 81, 65,165,252, 54, 68,139, 16, 82,175, - 85,171, 86, 87,143, 31, 63,110,109,103,103,135,184,184,184, 79,136, 22, 33,164, 94,203,150, 45,175, 30, 63,126,220,218,222,222, - 30,209,209,209, 6,187, 21, 41,134,100, 33, 41, 41,137,164,165,165,113,150,150,150,229, 34, 91, 60, 30, 15, 26,141, 6,161,161, -161,134,254,173,193, 59,196,204,205,205,247, 30, 57,114,196, 60, 57, 57, 25,124, 62, 31,161,161,161,159,236, 58,204,127,253,241, -199, 31,162, 94,189,122,237, 2, 80,234,182, 54,134, 97,214, 13, 29, 58,116, 84,108,108,172,165,157,157, 29,226,227,227, 33, 22, -139, 65, 41, 5,241,246, 70,235,247,239,161, 99, 89,200,100, 50,132,133,133, 97,199,142, 29, 57, 26,141,102, 93, 9,229, 35, 54, - 49, 49,113, 23,137, 68, 24, 50,100,200, 39,231,246,237,219,135, 30,141,248,141,198,116,148,100, 51,144,106, 18,100, 93, 46,242, -249,124, 50,118,230,175,213,155,182,241,169,253, 58,228,225,187,164,132,152,123,101,220,190, 94,171,213,162,102,205,154,120,252, -248, 49,174, 93,187,134,118,237,218,193,203,203, 11, 65, 65, 65,184,114,229, 10,158, 61,123, 6, 66, 8,172,173,173,243,151, 95, -148,186, 6, 67,171,100,144, 24,151,242,153,122, 85,244, 88, 36, 18, 65,163,210, 25, 84, 70,175, 94,189,194,227,199,143, 11, 92, -203,240,249,124,230,135, 31,126, 0,165,148, 70, 68, 68,192,212,212,148, 14, 31, 62,156, 21, 8, 4, 76,108,108,172,161,117, 63, - 87,189,202, 35, 89, 2,145,240, 19,130,198,113, 92, 86, 96, 96,224, 24, 66, 72, 16, 33,100,117,222,215, 70, 63, 90, 70,252, 39, -227,124,225, 88,135, 6, 41, 90,148,210,247, 0, 58, 16, 66, 6,159, 62,125,122,221,166, 77,155,108,187,117,235,134,180,180, 52, -184,185,185,193,209,209, 17,231,206,157,195,133, 11, 23,146, 89,150,157, 65, 41, 61, 80,204,195,214,161, 36, 95, 27,148, 82,234, -228,228,116, 92,147,157, 61,190,161,151, 7,110, 28,187,227,231,232,232, 56,214,217,217,121,234,240,121,223,143,104,219,179, 49, -194,158, 69,224,193,149, 96, 36, 68, 37, 99,120,235,217,165,218, 44,186, 24,222,194,194, 98,148,137,137,137, 24,128,174,152, 81, -241, 39,187, 14, 11,219,100, 89,150,213,106,181, 56,122,244,168, 65,100,235,240,225,195, 80,171,213, 96,139,204,175, 22,182, 73, - 57, 74, 4, 66, 9,156, 42,212,132, 78,151, 3,142,251, 50,245,166,176,205,252, 17,232, 59,177, 24,118,201,201,120,248,240,161, -161,210,108,169,101, 68, 41, 85, 19, 66,134,108, 92, 49,243,220, 68,223, 95, 45,218,181,168,143,159,215,238,131, 78,183, 27, 60, - 62, 15, 50,137, 8, 13,155,180, 4, 31, 26,252,190,106, 86,186, 50, 51,109, 72,209, 80, 60,159,217, 44,109,134,133, 2, 44,199, -225,218,237, 71, 6,223,123, 65,111,207,178, 16, 8, 4,120,251,246,173,170,184,221,134,124,126,238, 52,103,254, 72,189, 52,155, -148,227,136, 80, 36, 69, 5, 55, 79,104, 53,217,223,164,140,236,236,236,102,157, 58,117,202, 58,223, 85, 66, 80, 80, 16, 8, 33, -161,133,212,145, 89,167, 78,157,178, 86,169, 84, 8, 9, 9,201, 15, 53, 21, 90,158,231, 40, 95,201, 74, 74, 74, 34,241,241,241, - 48, 49, 49,225, 5, 5, 5,105,234,214,173,251, 4,165, 71,126, 40,176,169, 86,171, 35, 75, 90, 63,169, 86,171,157,165, 82,169, -176,200,111,157,220,221,221,195,138, 78, 33, 22,151,206,140,140,140,135,115,230,204,105,216,185,115,103,204,154, 53, 43,213,210, -210,210,244,247,223,127, 23,240,249,124, 50,113,226, 68, 54, 49, 49, 49,123,231,206,157,230,167, 79,159, 70,122,122,122, 64, 89, -247, 78, 41,205, 34,132,140,105,209,162,197,190, 75,151, 46,153,184,187,187, 35, 51, 51, 19,148, 82,236,221,187, 23, 19, 39, 78, -132, 84, 42, 69, 88, 88, 24,122,244,232,161, 84, 42,149, 99,138,174,157, 44,100,147, 16, 66, 40,199,113, 88,184,112, 97,129,115, -210,124,103,165,166, 50,130, 29,211, 43,203,167,236,204,144, 15,254,121,231, 15, 0,192, 50, 12,251, 58,228,225,187,189,191,253, -124, 83, 36, 18,221, 46,163,140,230, 79,153, 50,229,119, 31, 31, 31,153, 66,161, 64,106,106, 42,238,221,187,135,251,247,239,227, -193,131, 7,208,106,181,176,182,182,134,165,165, 37,226,227,227,241,234,213, 43, 21,128,249,165,217, 20,155, 8, 81,165,122,254, -206,223, 92, 5, 75, 88,104,183, 97, 97,117, 75, 36, 20, 26,244, 28,181,105,211, 6, 77,155, 54,205, 39, 64,236,135, 15, 31,226, - 53, 26, 13, 41, 68,250, 99,243, 9,185,171,171, 43,115,224,192, 1, 90,154,205, 7, 59,182,224,210,178,249, 16,139, 68,152, 17, - 26, 93, 64,186,246,181,107, 0,161, 88, 4,143,238,125, 10,247, 3, 91, 9, 33,187,243, 62,107, 12,169,243, 95, 49,240, 49,218, -252, 55,183,249,159, 12, 74,105, 60,128,242,133,224, 41,244,227, 67,132,144,139, 63,254,248,227,170,122,245,234,253,184,126,253, -122, 34, 18,137,176,120,241, 98, 26, 23, 23,183, 39,111, 20,146,246,133, 9,219,115,235,100,192,184, 97,190, 61,201,244, 13,195, - 91, 61,185, 30,242,170, 78, 11,119,212,105,225,142, 39, 55, 94,226,183,121,135, 15,176,122,118, 97,124,124,124, 84, 25,166, 52, - 29, 90,214, 40,186, 24,222,218,255,230,117,235,242,238, 58,228, 56,238,248,225,195,135, 39,247,238,221,155,247,232,209,163,207, -214,100,229,135,221,225, 56, 14, 87,175, 94,133, 78,167,195,158, 61,123, 56,142,227, 74,246,163, 5,122,102,227,134, 85,195,246, -236, 63, 35, 22,139, 8,238,223, 62,129,140,180,210, 85, 58,145, 72,136, 63,246,158,212,137, 68,194,215,197,157,215,233,116,209, -215,175, 95,183,239,196,178, 66, 30,143,247, 25,129, 42, 9,199,143, 31,215,115, 28,247,161,140,114, 9, 32, 68,216,125,249,172, -145,135,125,250,255,104,223,162, 69, 43,161,141,157, 61, 8, 33, 72, 76, 72, 68, 88,200, 35,253,197, 19,187, 18,114,148, 89, 6, -133,224, 25,185,230, 86,193,154, 44, 0,232, 54,113, 83,193,250, 44, 0,232, 62,124, 14,188,155,213, 2, 49, 68,122,250,155,100, -113, 12,195, 64, 46,151,131, 97,152, 98, 93, 60,152,155,155,203,212,106,181, 42,207, 17, 99,169, 82, 17, 5,190,121, 25,177, 44, -235,145,150,150,134,156,156, 28,220,191,127,159,174, 88,177, 34, 41, 41, 41,169, 96,209,166, 94,175,247, 72, 77, 77, 69,118,118, - 54, 2, 2, 2,232,170, 85,171,146, 82, 82, 82,230,149,231, 25,146,201,100,141, 4, 2,193,147,180,180, 52,206,196,196,132,167, -215,235,245,117,235,214,149,200,100, 50,131, 3,170,199,197,197,117, 46,233, 92,213,170, 85,223,188,121,243,166, 26,203,178,133, - 99, 32,138,212,106,181,123,139, 22, 45, 12,153,242,153,178,123,247,110,156, 60,121,178, 73,102,102,230,208, 15, 31, 62,236, 3, -208, 68, 32, 16,224,249,243,231,161,106,181,122, 80,239,222,189,247,166,165,165, 61, 4, 48,197,192,118,227, 18, 33,100,136,135, -135,199,238, 37, 75,150, 40,188,188,188, 4, 78, 78, 78,104,220,184, 49,194,194,194,112,254,252,121,253,214,173, 91,115,148, 74, -229, 72, 74,233,213,210,139, 29,132, 97, 24,136,197,226,130,151, 68, 34,129, 72, 36, 66,150,138, 98,244,218,112, 21, 3,153,106, -221,226, 49,231, 41, 64, 62, 70,135, 39, 39,126,140,126, 72, 8,185, 29, 23, 23,151, 81, 66,158,137,213,106,117,125, 71, 71, 71, - 62, 33,100,131, 78,167, 27, 62,105,210, 36,199,149, 43, 87,162, 70,141, 26, 72, 78, 78,134, 92, 46,135,187,187, 59,146,146,146, -240,232,209, 35, 86,169, 84,110, 3,176,148, 82, 90,234,116,100,122,114, 38, 92, 28, 92, 63, 81, 62, 41,165,160, 44,160,215,176, - 96,117, 20, 90,162,135, 80,168,135, 72, 36, 50,164,179,164, 28,199, 33,205,209, 17, 92, 72, 8, 30, 60,120, 0, 74,105,137,170, - 90,205,154, 53, 13, 40, 32, 14, 98,137,248,147,233, 66, 66, 8, 68, 98, 49,132, 98,209,103, 59,103,140, 42,150, 17,255,237, 48, -116,173, 69, 58,128,177,132,144,125,109,219,182, 61, 71, 41, 21, 34,119, 62,242,206,215,252,121,124,124,252, 83, 39, 39,167,185, -246, 46,150,171,186, 12,109,133, 26,245,221,192, 50, 44,238, 93,120,142, 61, 43, 79, 31,137,141,142, 29,110, 72,236, 51,142,227, -110,182,108, 84,131,135, 66,190,186,157,156,156,184, 47,217,117,152,145,145,177,104,198,140, 25,152, 53,107, 86,185,119, 29,150, -116, 77, 80,104,226,216,122, 30,182, 46,221,187,180,238, 4,194,163, 90,173,166,148,134, 15, 5,158, 75, 69, 34,225,235, 71,129, -113,117,139,187, 46, 41, 41,169,211,136, 17, 35,174, 10, 4,130, 74,229,201,115,142,227, 62, 36, 36, 36,180, 47,187,204,245,247, - 8, 33,238,103,143,108,159,118,233,228,238, 78, 28,199, 86, 37, 0,248, 2,209, 59,189, 78,119, 89,163,202, 92,111,104, 80,233, -213, 99,155, 99,202,198, 43,216, 50,171, 59, 38,173, 58,134, 93, 11, 71, 99,238,218,195,248,117,214, 20,172,216,116, 16, 63, 79, - 25,130,190,131, 71,112,148,240,238, 26,122, 31,124, 62,255,210,246,237,219,135,141, 30, 61,186, 96,211, 2,165,244,147,134, 93, -175,215,171, 56,142,195,182,109,219, 56, 0,151, 74,179,247,105, 25, 17, 90,218,122, 41, 67,203, 40, 51, 51,115,100,243,230,205, -247, 2,144, 80, 74,223,166,165,165,253, 68, 41, 45, 8, 13,149,157,157, 61,178, 69,139, 22,123, 41,165, 18, 66,200,103,231, 13, - 65,158,171,135, 70,150,150,150, 79,242,148, 44,201,151, 44,136, 47, 45,171, 75,153, 86,100, 13,104, 59, 56, 20, 10,171, 67, 8, - 89,217,164, 73,147,194, 65,165, 67, 1, 52, 42,111,162, 40,165, 87, 9, 33,181, 22, 46, 92, 56, 77, 42,149,122, 43,149,202,234, - 0, 32,151,203,195, 52, 26,205, 77,149, 74,181, 62,175,221, 42,205,134,214,196,196, 36,140, 97,152,218,182,182,182,185, 59,106, -243,200, 22, 0,252,245,132,125, 66, 41,211,184,188,105,187,112,225, 66, 69, 75, 75,203,239, 8, 33,125, 41,165, 53,179,178,178, - 52, 11, 23, 46, 12, 56,126,252,120, 70,165, 74,149,186,248,248,248, 16, 43, 43, 43, 60,126,252,152,166,164,164,156, 0, 48,207, -144,157,214, 28,199,125, 88,189,122, 53,202,251,188,151,118, 94,167,211,125,188,112,225,130, 77,231,196, 68, 1,199,113,232,222, -189,251, 39, 4,174, 40, 94,191,126, 13,141, 70, 83,170, 51, 71, 77, 70, 26,218, 77,155, 3,228,237,254,204, 71,174,146, 69, 65, -181, 70, 94,101,196,255, 22,200, 63,178,253,185,156,210,162,147,147,211, 0,169, 92, 50,193,173,186, 99,221,184,240,196,151, 89, - 25,202, 3,241,241,241,219, 41,165,236,151,218, 44,143,195, 82,163,252,251,207,217,252,219,143, 22, 11, 74, 89, 80,142,130, 82, - 14, 28,199,230, 6,188,166, 28, 40,203, 18, 66,112, 87,163,204, 24,109,104, 58, 9, 33,150, 54, 54, 54, 75, 41,165,157,249,124, - 62,175,176, 24, 86,248,115,158,146,117, 41, 41, 41,233,231,162,202,235,127, 98,126,254,249,231,159,197,146,127, 67,119, 29,246, -237,219,151, 45,231,179,121, 83, 46,151, 23,235,152, 51, 39, 39, 39, 42, 46, 46,238,187,127,135,252,204, 87, 67,169, 1, 13, 90, -145, 41,248,114,239, 58, 44,203,102,197,138, 21, 37, 58,157,174, 1, 0,119, 66,136, 5,128, 84,157, 78,119, 57, 41, 41, 41,129, - 16,210, 8,192,194,188,159, 45,163,148, 62,249, 87, 62,239,132, 16,153,141,141,205,110, 30,143,231, 98,200,239, 25,134,209,166, -166,166, 14, 43, 60, 32, 40,108,211,198,198,230,137, 64, 32,112, 49,192, 78, 76,114,114,114, 35, 99,251,105,180,249, 95, 67,166, -138, 44,130, 47,124,252,111,177,219, 35, 46, 46,238, 40,128,163,223,210,102, 73,158,223,141,248,255, 69, 78,106,252, 63, 82, 14, -121,164,105,226,255, 90,126,230, 19,165, 98,190,127, 10,128,252, 3,207,166,247,127, 66,190,208, 47, 28, 49,230, 17,169,214,223, - 50, 45,145,145,145, 26, 0, 1,121,175,162,255,247, 4, 64,247,127,163,124, 83, 1, 24,240,173,236,149, 70,158,140, 48,226,127, - 21,198,109,181, 70, 24, 97,132, 17, 70, 24, 97,132, 17, 95,135,243, 69, 66,240,156,207,255, 64, 0,116, 40, 97,164, 99,176, 36, - 72, 8,233,240, 5, 35,169,107, 70,155, 70,155, 70,155, 70,155, 70,155, 70,155, 70,155,255, 91, 54,255,231,144,239, 56,242,159, -120, 1,232, 96,180,105,180,105,180,105,180,105,180,105,180,105,180,105,180,249,223,252, 2, 48,166,164, 99,158,145,106, 26, 97, -132, 17, 70, 24, 97,132, 17, 70,252, 51, 48,152,104, 41, 28, 60, 60,108, 43,214,219,107, 85,161,110,144, 85,133,186, 65,182, 21, -235,237, 85, 56,120,120,252, 47,102, 26, 33, 68, 70, 8, 25, 44, 20, 10,175, 58, 58, 58,102, 18, 66,166,253,151,222,167, 25, 33, -164, 47, 33,100, 41, 33,164, 23, 33,196,228, 91,218,111, 75,136, 96, 32, 33, 19,134, 17, 18, 53,140,144,168,129,132, 76,104, 75, -200,127,221,186,193, 37, 83,156,154,223,185, 52,228,226,146, 41, 78,205,139, 61, 63,211,201,250,225,213,254, 27,253, 38, 58, 91, -125,163,114, 51,181,183,183,223,225,224,224, 16,105,111,111,255,193,222,222,126, 55, 33,196,220,216,220, 25, 97,132, 17, 70,252, - 99, 56, 79, 8, 25,147,255, 66,161, 53, 90, 2, 0, 56,127,254,188, 23,128, 91, 0,218,250,248,248,248, 23,253,181,149, 91,157, -209, 30, 53,107,204, 90,190,120, 30,113,176,179, 49, 97, 88, 78, 23, 17, 25,237,185,104,249,170, 63,173,220,234,172, 75,253, 16, -188,235, 11, 58, 3,194,231,243, 7, 72, 36,146,110, 0,242, 9, 91,168, 70,163, 57,199,178,236, 81, 67,119, 17, 57, 56, 56,220, -230,243,249, 21,203,243,223, 44,203, 70,125,252,248,177,213, 23,118, 98,253, 92, 93, 93,119,123,121,121,153, 52,105,210, 4, 98, -177, 24, 11, 23, 46,156, 1, 96,189,161, 54,172,172,170,154,234, 36,210,169, 2,177,184, 35,213,107,107, 83, 80,128, 39, 9,225, - 24,205,117,145, 70,179, 46, 53,245, 93,150,129,105,153, 7, 96, 56,114,183,163,239,162,148,174,254,154, 90, 50,188, 1,209,235, -217,220, 58, 33, 18,128, 53, 55, 55,191, 53,127,254,124, 65,183,110,221,176,107,215,174, 86, 59,118,236, 24, 67, 8,185, 14,224, - 47, 74,233,187,175,173,149,246,192,216, 22,173, 90,109, 28, 54, 99, 6, 95,117,251, 54, 54,238,222,189, 1,153,153, 0,176,165, -188,117, 73, 36, 66, 95, 27, 27, 97, 55, 74,209,128, 0,132, 0,207,147, 82,184, 11, 58, 29,123,148,150, 55,190,207,167,182, 7, -227,211,237,248,135,202,107, 35,227, 29, 93, 32,233,238,209, 58,227,221,205, 5, 0,186, 20, 61,207,168,165,195, 40,191, 66, 55, - 21,125, 22, 13, 96,237, 87,146, 44, 19, 91, 91,219,160, 51,103,206,184, 52,105,210, 68, 0, 0, 79,158, 60,249,161, 91,183,110, -237, 8, 33,181, 41,165,153,255, 34,210, 46, 21,240,120, 19,196, 66, 97, 71,150,101,235, 0, 0,159,207, 15,214,234,245, 87, 25, -142,219, 98,168, 79, 54, 35,140, 48,226,191,152,169,148,193, 69,254,157, 97,136,103,248, 91, 62, 62, 62,228,252,249,243, 20, 69, -182,136, 43,236,107,122,214,170,229, 49,227,210,169,125, 21,210, 83,211,213,155,215,236,123,154, 35, 16, 43,221, 61,221, 69,155, -215,175,182,156, 48,101,250, 84,133,125,205,135,217, 9,175, 94,150,163,209,117,149,201,100, 39,215,172, 89, 83,219,219,219, 91, -104,103,103,135,132,132, 4,132,134,134,214,190,113,227, 70,207,125,251,246,205, 32,132,244,166,148, 70, 25, 96,206,253,250,254, -221,118,114, 43,107,176,122, 61,156,234, 54, 40,112,180,247,246,198, 21, 48, 58, 29, 56,189, 30, 30,221,122, 2, 0, 56,142,131, -167,167, 39,255, 75, 50,146, 16,226, 84,171, 86,173, 3, 43, 87,174, 20,105, 52, 26, 60,124,248, 16, 55,111,222,228,226,227,227, - 87, 25,106, 67, 97, 95,221,155, 39,147, 31, 29, 48,228, 71,243,239,187, 85, 22,186,218,219, 2, 48,193,235, 8,166,197,197, 43, - 55, 26,159, 58,186,103,188,194,190,250,128,236,132,176,155,165,147, 53,171,102,132,144, 21,249, 30,162, 9, 33,191, 86,170, 84, -233,231,194,215, 20,141,155, 71, 41,133, 64, 32, 72,200,202,202, 26,144,156,156,252,172,168, 77, 61, 11,193,161, 67,185, 60, 98, -193,132,193,252,187,119,239,202, 61, 61, 61, 53, 0,176,122,245,106, 44, 93,186, 84,124,249,242,229,174,251,247,239,239, 74, 8, -217, 64, 41,253,235,107, 42,166, 8,152, 61,108,198, 12,190, 34, 50, 18,138,192, 64, 12,201,204, 20,252, 2,204, 46, 15,209, 34, -132, 84,118,112, 16,254, 57, 99,250, 8,143, 42, 85,155,137, 68, 34,155,220, 32,222,218,228,234, 81, 81,207,250,174,250,101,135, - 47, 33,164, 15,165,244,173,129,246, 4, 0,150, 0,144, 2, 88, 0, 96, 97, 82, 82,146, 59,203,178,112,112,112, 88, 72, 8, 57, - 13, 96,185,173,173, 45, 77, 74, 74,154, 67, 41,101, 74, 83,178, 50,223,209, 5, 31, 73,149,206, 53, 26, 14,195, 71,114,169,243, -244, 46,142, 23,205,170,146,229,139, 54,198,221, 7,128, 46, 85,171,154, 86,169, 41,159,163, 48,171, 99,149, 25,123,109, 78,151, -170, 85,119, 94,124,103, 24,209, 46, 74, 54, 1,192,201,201,105,245,254,253,251, 43, 52,109,218,180,160,142,215,175, 95,159,191, -122,245,106,231,105,211,166,109, 0, 48,194, 64,123,213,109,109,109, 47,179, 44,171, 73, 73, 73,169,158,255,189, 93,189,222, 45, -172, 77,229,237,147,210,178,110, 39,191, 56,237,111,160,173, 38, 82,145,232,196, 95, 7, 54, 58,214,111,218,156,167,176,177,131, - 58, 54, 14,217,122, 93,135,155,247, 30,180, 29, 51, 97,246,148,188, 50,122,100,236,106,140, 48,226,127, 26, 37,114,145,255,100, - 8, 10, 49,201, 98, 21, 36,137, 68,236,187,104,254, 28,146,158,146,174, 82,103,102,105,245,106,181,154, 39,162,234,224,151,239, - 19,121, 2,126,250,180, 41,147, 77,125,231,206,247, 5, 48,196, 80,146, 85,175, 94,189, 71, 39, 79,158,180,179,178,178, 66, 70, - 70, 6, 82, 82, 82,240,232,209, 35, 80, 74,209,187,119,111, 73,211,198,141, 27, 44, 88,184,240, 62, 33,164,185, 33,100, 75,110, -101,131,213,173,114, 99,209,254, 28,153,146,255, 63,216,209,175, 91,193, 53, 75, 99, 50, 0, 0, 82,169,180, 32, 32,241, 23,160, -121,251,246,237, 69, 0, 48,106,212,168,204,172,172, 44, 63, 0,135, 40,165, 6, 69, 90, 85,216, 87,247,182,113,116, 58,247,251, -182,213,178, 58, 85,221,161,211, 51,248,240, 49, 14, 2,161, 5, 92, 92, 68, 24, 49,164,163,176, 77, 11, 43,155, 21,203,118,156, -151,219, 86,239,149,147, 20,118,185, 36, 91, 22, 22, 22,251,142, 30, 61,138, 99,199,142, 1, 0,194,194,194,224,238,238, 46, 47, - 43, 13, 33, 33, 33, 85,122,244,232,113, 4, 64,181,178,174, 45,234, 24, 95, 34,145,160, 85,171, 86,240,244,244,196,153, 51,103, -218, 2,248,235,107, 43,160,234,246,109, 40, 2, 3, 1,255,242, 15, 94, 8, 33,149, 27, 54,116,123,112,225,252, 1,155,243, 23, - 66,177,118,237,110,188,123,151, 43,180, 85,169, 82, 5,131, 7,245, 19, 6, 7, 7,212,234,219,119,112, 0, 33,164, 21,165, 52, -204, 0,179, 75,118,238,220, 57,175, 82,165, 74,232,219,183,111,191, 90,181,106, 57,152,153,153, 97,251,246,237,112,116,116,172, -162,213,106,223,158, 57,115,198,233,227,199,143,152, 60,121, 50, 0,204, 40,201, 80,219, 78,109, 23, 72,186,123,180,174,209,112, - 24, 20,102,142,216,121,248, 40, 94, 63,221,215, 90,163, 11, 93,224, 55,209,121,168,138, 74,134,187,184,155,250, 86,108,228,101, - 93,173, 86, 15,184, 53,124,102,163,102,239,188, 95, 56,161,202, 42,129, 84,189,111,209,154,184,148,207,238,185,223,159,252,218, -153,175,172, 66,174, 34,133,210, 69, 92, 30,193, 42,104,144, 88,138, 30,109,218,180, 41, 40,184,200,200, 72,104, 52, 26,120,120, -120,240,180, 90,173,183,129,249, 90,253,187,239,190,187,123,225,194, 5,235,234,213,171,127, 18, 18,198,193,218,162,147,255,201, - 13,147, 87,108, 60, 88,211,206,179, 87,122,226,203, 83,193,101,145,172,150,205, 26, 94,187,120,242,128,130,100, 71, 67,108,145, - 12,112, 41, 8, 63,242, 7,136,137, 21, 6,140,155, 46,240,110,223,206,185, 99,151, 62,215, 8, 33,237, 41,165,143,141,125,141, - 17, 70,252, 79,171, 90,244,191,237,158, 10,136, 86, 33, 22,249, 9, 56,202,213,181,183,179,150,109, 88,179,247, 49, 95,167,213, -202, 45,204,181, 66,115, 51,142,152,154,243,117, 90,125,182, 91, 21, 55, 49, 71,185,186, 37, 72,105,215,138,142,186,101, 50,217, -201,191,254,250,203, 78, 40, 20,130,227, 56,216,218,218, 34, 34, 34, 2,233,233,233,200,202,202,194,187,208, 80, 84,114,173,128, -197,190,115, 28, 39,207,241, 61, 73, 8,105, 84,120, 26,177,184,109,163,172, 94, 87,180,113, 47, 41,136,240, 39,239,165,217, 44, - 1, 17, 81, 81, 81, 80, 40, 20,168, 93,187,182,226,222,189,123,119, 74, 34, 89, 69,109, 90, 89, 85, 53, 21, 40,100,199,182,254, -190, 80,166,211,135,224,101,120, 42,106, 84,106, 13,123,107, 87,196,165,106,241,224,209, 95, 8, 9, 58,132,170,206,174,152, 56, -174,157,116,213,234, 63,143, 90, 90, 86,118, 77, 75,123,159, 89,156,205,204,204, 76, 69,229,202,149,225,234,154, 27,247,140,101, - 89,188,124,249, 18, 44,203, 22, 28, 23,126,223,123,226, 6,152,204, 15, 24,246,195, 15, 72, 73, 73, 81, 20,103, 83,200, 7, 51, -125,204, 96,129, 76, 8,136,229, 86,218,236,236,236, 2,117, 80,167,211,225,249,243,231,104,222,188,185,215,241,227,199,253,203, -144, 80, 13,202, 79, 29,240,235,198, 61,123, 54, 13,201,200,224, 1,192, 46, 66, 56, 29,165,191, 26, 90,151,236,236,132, 39, 46, - 93,220,111,195,231,189,130,149,249, 47,120,244,232, 3,116,186,220,244,166,164, 36, 98,210,132, 76,136,132,166, 56,115,230,160, -181,135, 71,171, 19,121, 83,103, 92, 25,233,148, 94,188,120, 17,147, 38, 77,194,203,151, 47,157,248,124, 62, 30, 62,124, 8,153, - 76,134, 53,107,214,240, 61, 60, 60,156,228,114, 57, 46, 93,186,132,132,132, 4, 82, 90, 58,111, 93,190,181, 60,227,221,205, 5, - 31,201,165,206, 59, 15, 31,197,143,131, 6,192,129,134,223, 49,175, 74,150,127,215,189,229,207,148, 95,161,155,220,180,174,165, -123,237,238, 16,137, 21,152, 56,123, 41,194, 66,206, 90, 42,179,130, 38, 16, 54,186, 2,242, 98,255,125, 18, 84,249,120, 95,118, -211,225,128,134, 87, 93, 31,187, 57, 53, 28,251, 16, 64,208,223, 68,171,138,128,240, 88,243,124,245,242,237,219,183,120,247,238, - 29, 4, 2, 1, 84, 42, 21, 24,134, 41, 54,157,206,206,206, 99, 25,134,249, 57,175,156,247, 58, 58, 58,142, 60,112,224,128,117, - 97,162,157,175,100,165,166,103,166, 5, 60,126,241,122,250,216,190,109,111, 63, 8,137,182,168,215, 51, 42, 61,240,116, 70, 9, -101, 36,149,137,197, 39, 46,157, 58,168,208,191,191, 1,185, 71, 91, 8, 21,238, 96,245,177, 80,166,229, 32,235, 93, 60, 52,191, -255,134,250, 19,166,225,236,233, 63, 21,181,234, 52, 58, 78, 8,113,167,148,106,191,224,217, 44,143,196,111,180,105,180,105,180, -249,111,104,179, 52, 46, 2,160, 33, 0,251,188,207, 41,200, 93, 50, 99, 3, 32, 25,185,225,192,236, 1,104, 1,136, 11,253,166, -232,113,225,107,139, 30, 23,254,156,146,247,217, 46,239,253, 49,128,212, 50, 6,149,142, 0,124,144,187, 54,203, 39, 47,143, 12, -243, 12, 79, 8, 47,147,101, 57,137,200,214, 78, 61,170,127,251, 58, 87,174, 61,121,110, 98, 99, 38,232,212,182,129,215,163,224, -247,247, 9,143,232, 9,225, 25,180,238,131,207,231, 15,216,176, 97, 67, 29, 51, 51, 51,112, 28, 7,115,115,115, 36, 37, 37, 65, -171,213, 34, 35, 35, 3,154,172, 76,232,178, 50, 17, 24, 29,137,150, 94,109,209,167,243,119, 30, 7, 79,255, 53, 0,192,145,210, -236, 58,213,109, 80,160,100, 45,173,104,253,183, 52, 17,157, 94, 64,186,126,105,224, 14,145, 66,129,142,211,125,191,166, 98, 61, - 19,139,197, 23,123,247,238,221,101,230,204,153,188,248,248,248, 75,132,144,150,148,210, 50,167, 77,117, 18,233,212,241, 83,187, - 89, 90, 42, 40,142, 95,253, 11,109, 26, 12,130,137,152,143,148, 76, 29, 8, 1, 66, 95,156, 4, 33, 86, 8, 10,139, 71,235,250, -102,248,174,147,135,226,244,159,161, 51,241,247,250,160,207,138, 38, 45, 45, 13,137,137,137,208,235,245,208,235,245,232,219,175, - 31,246,239,219,135,156,156, 28,168, 84, 42,104,181, 90,176, 44, 11, 30,143,135,171,231,142, 35,250,125, 40, 90, 52,111,142,146, - 36,217,189,207,168,144, 16,242,224,245,235,215, 8, 13, 13, 69, 76, 76, 12,164, 82, 41, 28, 28, 28,176,116,233, 82,104, 52,185, - 49,202,250,245,235,231, 5, 32,248,107, 31,168,119,192,142, 8,150, 93,208,229,212, 41,187,123,167, 78,113, 15,206,158,141,145, -100,101,109, 55,228,183, 34, 17,250,174,254,117, 92, 13,185, 92,142,152,168, 13,168, 89, 83,132, 25,211,172,225,247, 75, 50, 0, - 96,242, 36, 23, 52,110,100,131,204,244, 63, 97, 99, 55, 15,155, 54, 77,169, 58,124,248,186, 31, 0,236, 45,195,244,130,191,254, -250,171,143,187,187,187,243,179,103,207,136, 88, 44,134, 76, 38,131, 76, 38,131, 84, 42, 69, 98, 98, 34, 34, 34, 34,232,234,213, -171, 99,145, 59,181, 88, 34,242,166, 7,187, 76,239,226,120,241,245,211,125,173,157,249,239, 3,251, 76,108, 21, 25,244,224, 89, -214,149,171,247,150, 49,106,105,116,122,204,181, 57,149, 27, 63,179,153, 48,107, 9,126, 91,189, 8,175, 31,222, 78,181,119,205, -220, 34, 35,154,189, 77, 59, 22,163,146,181, 93, 34,152,176,176, 63, 51,118,120, 31,139,179,246, 1, 99, 47, 8, 72,210,199,228, -167,107, 16,241, 76, 37,169,214, 96,104,245, 42, 60,237,141, 27, 55,100,109,218,180,129, 90,173, 46, 80, 38, 15, 28, 56,192, 49, - 12, 83,236,116,180, 78,167,251, 57, 54, 54,214, 81,165, 82,161,115,231,206,147,215,172, 89, 35,207,143, 81,199,178,236, 39, 74, -214,242,245,251, 47, 79,253,121,203,205,203, 71,126,113, 90,238, 59,178,237,144,137, 43,110,162,132, 56,146, 2, 30,111,194,217, - 83,187, 29,164,150,122,200,172,190,131, 58, 65,133,215, 59,126,132, 50, 83,141,198,203,151, 0, 16, 67,171,231, 97,123,247,190, - 16, 90, 59, 97,209,232,145, 78,243,183,239, 28, 7, 96,131,113, 92,111,132, 17, 70, 20,129, 61, 33,228, 28, 0,248,250,250,206, -243,243,243,123, 65, 8, 57, 71, 41,237,150, 71,116,206, 81, 74,187,229, 95,147,215,103,127,118,156,127,109,209,227,162,159,231, -206,157, 91,107,213,170, 85, 43,155, 55,111,126, 36, 32, 32,224,125, 89, 68, 11,185,241,159,119, 20, 13,197, 3,228,237, 58,244, -241,241, 33,133,223, 63, 81,180, 56,238,246,219,247,145,202,239, 58, 52,117, 57,231, 31,252,120,196, 8,159,246, 3,186,183,233, - 20, 17,149, 18, 90,213,205,193,230,197,139, 96, 51,142,227,110, 27,146, 75, 18,137,164, 91,187,118,237, 4,105,105,105, 48, 49, - 49, 65, 82, 82, 18, 98, 99, 99,161,211,233,160,206, 72,135, 38, 35, 29,234,244, 52,232, 50,210,240,238,201, 35,212,173, 90, 69, -146,183, 88,190, 44, 2, 84,172, 82, 85, 88,217, 18,155,154, 66, 98,106, 10, 82,206,105, 67, 66,200,247,150,150,150, 15, 8, 33, - 11,242, 58,165, 9,115,230,204, 73,230, 56, 14, 43, 86,172, 48, 83, 40, 20,199, 9, 33,146,178,236,152,218,242,187, 53,175, 95, -155,247, 42, 34, 8,173,234, 13, 67,245,202, 93, 17,145,160, 66,114,150, 14,137,233, 58, 52,110,179, 25, 21,235, 45, 65,133,250, -126, 8,253,144, 10, 39,103,119, 30, 4,146, 82,131, 63, 71, 71, 71,127,114,124,228,240, 97, 40,149, 74, 84,173, 90, 21,131, 6, - 13,194,156, 57,115, 48,104,208, 32, 56, 57, 57, 97, 72,255, 30, 88,180,104, 17, 62,126,252, 88, 86, 82, 53,213,171, 87,215,184, -185,185,105,220,220,220, 52, 58,157, 14,217,217,217, 72, 79, 79, 47,154,223, 83,202,253,148,216,219,207,117,116,116, 12,178,183, -183,127, 33,149, 74, 47, 60, 39,228,149,218,205,205,190,101,207,158,196,179,127,127,254, 7,153,140,248, 3, 10, 67,108,217, 88, - 9,125,188,219,117, 17,167,167,237, 6,144, 43, 82,141, 28, 97,139,187,254,181,112,239, 78, 35, 76,154, 80, 21,132, 39, 5,225, -137,161,204,185,129,166, 77,154,139, 44, 44, 72,183, 50,202,122, 48,128,231, 45, 91,182,116,154, 56,113, 34,145, 72, 36,152, 60, -121,178,110,244,232,209,111, 6, 13, 26,244,230,250,245,235,172,155,155, 27, 42, 84,168, 64, 42, 84,168,224, 8,224,121,222,111, - 74,133, 89, 85,178, 92,163, 11,189, 99,225, 46,127,207,194,166, 69,182, 94,210,119,209,154,184,148,101, 91,194,215, 70,188, 86, - 86,121,253,240,118,202,155,144,179, 92,196,227, 91,201,113,111,178,170, 44,219, 18,190,118,238,111,177,197, 62,212,254,254,224, - 78,158,243,215, 41,115,148,130,158,221,189,149, 99, 71, 13,168,110,165,168,117, 0,206,223,213,171,232,234, 50,100,209,202, 77, -186,209,227,166,234,118,253,177,155,102,101,101, 33, 51, 51, 19,155, 54,109, 98,206,158, 61, 27,203,178,236,212,146,198, 64, 0, -160,215,235, 49,118,236, 88,185,153,153, 25,162,163,163, 11, 20, 81, 0,136, 79, 74, 9,190,247, 56,228,213,244,159,250,121,229, -104, 52,154,203,183,158,132,122,186,187,185, 16, 66, 75,220,136, 34, 22, 10, 59, 54,106,218,148, 79,105, 58,136,192, 21,239,246, -173, 70,230,199, 84,100, 38,166,130, 47,148,131,129, 4,122, 78, 12,139,186, 77, 16,246,248, 25,156,109,237, 5, 18,161,208, 24, - 58,203, 8, 35,254, 71, 81, 26, 23, 41, 76,150, 86,173, 90,181,178,180,243,133,222,181, 69,142, 11,136, 84, 81, 18, 86,248, 51, - 0,172, 90,181,106, 37,165,180, 91, 64, 64,192, 97, 0, 42, 3,249,194,152,252,247,194, 94,226,203,100, 29,124,181,214,111,230, -156, 5,176, 52,151,153, 55,105,224,238,112,230,146,255,147,219, 1, 79, 66, 43, 86,176,177,165,122,173,229,175,235,126,115, 33, - 74,149,161,139,193, 61,108,108,108,160,211,233,240,246,237, 91,196,196,196, 64,167,211,129,201,201,129, 38, 61, 29,234,180, 52, -176, 57, 89, 16,177, 44, 84, 73,137,176, 54,145, 2,127,239, 72, 44,235, 6,139, 37, 90,249,239, 82, 51, 51, 72, 76,205,192, 19, - 10,139,157, 86, 44,193,102,195, 38, 77,154, 28, 11, 9, 9,105,218,161, 67,135,101,132, 16,115, 74,233,135,216,216,216,246, 11, - 23, 46,212,216,219,219, 99,236,216,177, 53, 0, 12, 43,147,100,138,181, 30,110, 14, 53, 80,189,202, 48, 84,172,208, 14,233, 57, -122, 36,101,234,145,152,174,195,246,205,205,113, 98, 87, 19,220, 61,209, 26, 33,151, 59, 34, 93,239, 0,133,211,247,160,172,182, - 86,105, 54,175, 94,189,138,165, 75,151, 98,217,178,101, 88,177, 98, 5,150, 45, 91,134,216,216, 88,212,174, 93, 27, 81, 81, 81, -184,120,241, 34,226,227,227, 97, 99, 99,131, 71,143, 30, 97,253,250,245,184,123,247,174, 33,202,157, 65,215, 16, 66,202, 53,151, -206, 48,204,240,248,158, 61,235, 36, 88, 89,121, 54,104,208,160,203,228,201,147,171,180,108,217,178,224,124,149, 42, 85, 92,101, - 50,217, 71, 66,200, 46, 66, 72,253,210,108,113, 64, 3, 91,219,218,208,106, 94,229,149,149, 16,132, 72,209,174, 99, 40, 90,182, -126, 2,157, 94, 4, 30,145,128,199,147,130, 97, 82, 96,105,233, 4, 74, 73,237, 50,146,184, 48, 41, 41,201,253,218,181,107,188, -136,136, 8, 72,165, 82, 0,136, 92,188,120,241,111,107,215,174,125,105,109,109,205,158, 59,119, 14,167, 79,159, 70,183,110,221, -248,163, 71,143,118,175, 80,161,194,182,178,238,123,209,198,184,251,135,214, 93, 28, 40,212, 91,214,151,202, 42, 86, 66,142,226, -251, 9,109,109,229, 0,112,241,221,187, 44, 59,215,204, 85, 57, 89, 65, 81, 22, 46,217,191,148,181, 16,158,210, 69,220,211, 55, -175, 30, 28, 58,117, 41, 35, 49, 33, 77,216,160, 78, 45,149,223,210, 89,162,138,149,170,253,186,104,206, 79, 14,177,153,210,244, -142,147, 47,190, 58,121,233, 81,246,208, 17, 63, 50,163,198, 76, 84, 95,188,116,245, 20,199,113,117, 74,218,113,200,113, 28,226, -227,227,241,226,197, 11,132,135,135, 35, 41, 41, 9,201,201,201,200,202,202, 42,152,110, 52,201,202, 60,255,219,158,179,129,114, -153,204,164,105, 29,119,215,135,207, 94, 38,202,101, 50, 19,247, 74,174,213, 9, 89, 82,108, 59,194,178,108, 29,169,137, 12, 0, - 65,122,200,109,100,167,101, 35, 59, 61, 27, 89,169,217,208,232,248, 80,107,120, 80,105,121,112,243,250, 14,217, 57,106,100,167, -100,128, 99,217,122,198,238,198, 8, 35,140, 40,165, 95, 62,231,235,235, 59,207,192,203, 13,158,222, 44, 74,188,124,125,125,231, - 17, 66,206,205,157, 59,183, 22, 12, 88,211, 76, 41,221, 81,244,149,127,174, 76,247, 14,201,201, 97,217,102,182,158,189,167,205, -254,249,226,225, 63, 54,219,105, 52,202, 40,107, 75, 5,171, 48, 17,219,140, 26,187, 2, 89,217,105,189,178, 83, 13,223, 37,149, -150,150,134,247,239,223, 67, 38,147, 65, 36, 20,130, 85,169,192,170,114,160, 74, 75, 1, 79,167,129,136,101, 97,101, 34,131,155, -147, 3, 42,218, 59, 24,100,243,237,141, 43, 5, 11,223, 11, 79, 23,174,110,226, 1,177, 92, 1,177,169, 2,227,207,221, 2, 0, -136, 68, 34, 96,225, 50, 67, 10,211,198,217,217,249,175, 67,135, 14,137,146,146,146,240,252,249,243, 64, 74,105, 6, 33,196, 20, - 0, 23, 26, 26,122, 45, 36, 36,164,155,187,187, 59, 0, 84, 45,203, 94,102, 50,143,213, 51, 20,209, 31, 35, 17, 17,243, 12, 86, -230,149, 33, 52,169,142,196,116, 29, 36,178,202,208,107,254,158,125, 84,103,126,128, 74,103,216,198, 72,173, 86, 11,134, 97,192, - 48, 12,180, 90, 45,198,140, 25,131,123, 1, 1, 56,114,250, 58,222,191, 11, 67,141, 74, 14,248,225,135,161,104,210,164, 9, 2, - 2, 2, 74,181, 53,188, 1,209,207,111, 3,193,186, 46, 60,136, 21,214,154,102,115, 46, 63, 52,132,108, 81, 74,137, 1,249,185, -182, 91,183,110,213,194,114,114,240,226,213, 43,116, 88,188, 24, 0,112,225,194,133, 79,238,101,250,244,233,226,151, 47, 95,142, -122,242,228,201, 40, 66,200, 58, 74,105,241,139,205, 41,112,254,252,125,252,244,211, 75, 36, 37,229,174,215, 62,122,248,111, 94, - 26,241, 94,135,206, 62,185, 51, 90, 22, 22, 22, 88,183,174,182, 65,249,201,178, 44,118,236,216, 81, 48, 93, 8, 0, 2,129,160, -229,244,233,211,123, 23,119,125,181,106,213, 68,101,217,156,222,207, 69,250,252,131,108,130,121,181,138,181,204,108,234, 34, 69, -255,172,246,179,216,248, 73,211,251,185,108, 88,119, 60, 70, 45, 35,154,189,132,141,174, 32,144,170,247, 25,146,198,119, 23, 55, -105, 45, 42,142,216,247, 49, 41,115,254,196, 31, 7, 91,155, 89,216,229,236,250,205,207,146,199,231,209,191,158,232,210,107, 85, -177,182,248,190,217,198,236,159,166, 45,124,166,101,162, 39, 34,250,175,176,210, 92, 92,176, 44,139,184,184, 56, 36, 37, 37, 33, - 42, 42, 10,201,201,201,121,207,126,242,103, 59, 87,203,217, 32, 66, 21, 21,133, 15,167,118,161,226,208,161,104,188,108, 41, 88, - 78, 0,149,146,197,186, 22,237,145,150,161,130,134, 35,112,106,216, 2, 63, 94,184, 3, 30,101,129,237, 91,140, 61,137, 17, 70, -252,143,194, 16,247, 14,249,132,200,207,207,175,219,183,254,255,194,100,203,207,207,239,133,159,159,159,193,255, 85,116,202,176, -240,113,153,238, 29, 0, 32, 51,233,101,184,181, 91,221,184, 28, 85,142,137,189,157,173,198, 68, 42,225, 50, 50,179,248,207,130, - 3,117,217,241,111, 95,151,227, 62, 66, 67, 66, 66,106,199,197,197, 33,234,195, 7, 48,170, 28,240, 52, 90, 80,181, 18, 29, 90, -181,128, 20,128,148, 71, 32,226,116, 16,240,197,200,202,206, 4,128,208, 50, 59, 71,189,254, 51,101,139, 16, 2,177,169, 41,196, -114, 57,196, 10,211, 79, 20, 46, 67, 20, 27,137, 68,114,232,248,241,227,142,206,206,206, 88,186,116, 41, 92, 92, 92,106,214,169, - 83, 71,217,186,117,107,153,189,189, 61, 60, 61, 61,209,162, 69, 11, 92,188,120, 17, 0,202,244, 41,165,103,164, 65,175, 35,209, - 50, 57, 53, 0,119,110,253, 14,173, 74,131, 6, 94,191, 67, 39,168, 8,219, 90, 75,192,189, 61, 0,229,199, 51,185,234,129, 67, -119,196, 68, 69,130,240,197, 47, 12, 85,158,242, 63, 7, 6, 6,226,240, 25,127, 56,186,121, 32,234,205, 43,188,186,121, 13,247, -108,173,225,230,225, 89, 48, 13, 84, 98, 26, 89, 8,150,111, 41,112,239, 32, 73, 77, 77,149, 88, 89, 89,105,242,243,206,209,209, -241,107,200,214,224,153, 51,103, 34, 93, 40, 4,124,124, 32, 10, 15,135, 78,167, 67,179,102,205,208,184,113, 99, 0, 64,179,102, -205, 32, 16, 8, 80,183,110, 93, 56, 57, 57, 97,203,150, 45,131, 81,194,174, 62, 30,193,115,134, 73,169, 89,165, 74,149, 2,162, -181,111,127, 18,158, 61,233, 8, 2, 49, 54,253,246,183, 55, 7, 87, 87, 87,124,140, 15, 7, 33, 52,164,140, 52, 46,115,112,112, - 88,232,232,232, 88,101,237,218,181,124,169, 84,138,113,227,198, 85,206,206,206,174,152, 39, 37, 99,238,220,185,185, 42,213,162, - 69, 88,188,120, 49, 52, 26,141,178, 36, 99,251,215,215,117, 74, 76,229, 70,217, 59, 56,247,242,182,169, 88,167, 93,167, 14,168, -236,222, 14,237, 58, 69, 1,192, 74, 43, 65,100,255,213, 11,106,159,178,169, 96,181,251,202,165,171,139, 90,121,181,155,239, 59, -214,114,249,170,237,105,101,174,121,204,248,176, 55,235,181,120,192,250,205,219,246,175,255,121,238, 20,105, 84,146, 54, 45, 54, -141,102, 43, 36, 2, 69, 85,123,162,152, 52,123,217,251,184,184,240, 25,136,190, 84,230, 78, 75,142,227, 16, 30, 30, 94,176,166, - 79,173, 86, 35, 39, 39, 7,209,209,209, 5,117, 70, 37, 55,235, 60,113, 68,247,122, 57, 42,149,242, 97,240,155,168, 5,147,135, - 52,207, 81,169,148,111, 34,162,194, 40,221, 88, 44, 27,227,241,120,193,202, 44,101, 7,101,186, 26, 73,207, 95,195,165,189, 27, -244, 12,129,150, 97,145,148,146, 5, 13, 3,176, 60, 33,106,245,255, 1, 44, 17, 32, 57, 46, 22, 60, 62, 63,208,216,221, 24, 97, -196,255, 44,202,116,239, 64, 8, 57,215,188,121,243, 35,133, 85,167,252,207, 0, 52, 0, 74, 91,202,147, 84,152, 76,229, 79, 39, -150,244, 63, 69,236, 26, 58,192,252,108,141, 86,153,238, 29,242,126, 72,234,213,113,115, 90,189,104,136, 11,199, 48, 53, 18,147, - 19, 24,129, 64, 34,172, 96,174,138, 47, 79, 14,106, 52,154,115,215,174, 93,235,217,177, 99, 71,201,155,224, 64,104, 51, 50,160, -205, 72,135,144, 99, 96, 37,107, 4,158, 78, 3,162,213,194,185, 38, 7,117,150, 12,254,247, 66,244, 26,141,230,156,161, 68,139, -199,231,127,186, 46, 75,161,128,196,212, 12, 18,133,162,232,212, 34, 41, 35,163, 76,122,244,232,209,190, 89,179,102,160,148, 98, -199,142, 29,208,233,116, 98,157, 78, 7,173, 86, 11,157, 78,135,204,204, 76,236,223,191, 31, 91,183,110,189, 7, 96, 79,153,157, - 25,163,189,118,249,234,141, 38, 35,135,116, 19, 94, 56,183, 14,140,150,133,138,184, 32, 39, 71,143,108,173, 9, 88,235,161, 64, -194,121,240, 5, 82, 52,175, 91, 25,103,254, 60,169, 3,163,185,110, 32, 11,255, 68, 21,138,142,138, 68,204,187, 48, 40, 50, 63, -194,214,204, 4,202,240, 48, 52,248, 97,216, 23,169, 19, 21, 42, 84, 0,199,113,240,246,246, 46, 88, 92,253,165,100, 43, 37, 37, - 5,103,207,158, 69,179,102,205,224,229,229,133,216,216, 88,132,135,135,163,107,215,174, 5,215, 4, 6, 6,226,217,179,103,168, - 90,181,116,145, 48, 57, 85,127, 33, 38,250,121,191,239,191,255, 94,244,224,193, 3, 80, 74,225,238,110, 6, 51, 83, 57, 8, 79, - 2, 15, 15, 59, 0,185, 99,128,182,109,219, 34, 51, 51,156, 73, 75,163, 23,202,200,199, 67,132,144,211, 90,173,246,109,155, 54, -109,156,222,189,123,135,105,211,166, 9,142, 30, 61,154, 47, 37,195,215,247,211,205, 20, 42, 85,201, 83,247, 53,234,212,156, 85, -153,177,244,146,202, 42, 86, 50,179,169,139,202,238,237, 0, 0, 29,187,141, 68,229,106,174,200, 76, 14,170,164, 86, 69,246, 18, - 9,210, 44,131, 54,197,190,148,249,212, 30,161, 78,188,245, 6,128, 33, 14,128,169,234,205,209,132, 40,225,208, 99,167,255,186, - 56,182,107,183, 30, 66, 61,203, 48,181,221,132, 22,199, 79,157, 79,140,253, 16,181, 17, 81,151, 66,254,214,255, 74, 85,241,216, -204,204, 76,200,229,114,132,132,132,104,124,124,124, 36, 60, 30, 15,111,223,190, 45, 32, 90,118, 54, 86,158, 45, 27,215,174,185, -124,253,254,203,114,137, 68,210,169,109, 35,143,151,111, 62,196, 80, 74, 34, 75, 84, 91,245,250,171,193,207, 3,189,109,157,170, -241,195,111, 61,128,117,235,174,208,104,120, 80,105, 57,104, 24,128,225,139,224, 88,191, 41, 44,170,122,128, 2,120,252,224,158, - 94,163,215, 95, 54,246, 53, 70, 24,241, 63,173,106,209,210, 72, 82,222,231, 84, 0,145,126,126,126,201,133,212,166, 36, 0,129, - 0,234,229, 93,151, 84,228,119, 73,200,221, 61,216,184,144,157,164, 66,132,171,240,103,109,145,107, 12, 26, 0, 22, 94,163, 85, - 44,209, 42,101, 75, 37,108,108,108,236, 26, 52,104, 84,117,231, 31,199, 64, 41,197,235,103,107,144,150,248, 10, 11, 87,222,175, -234,226,226,226, 21, 19, 19,227,111, 72, 34, 88,150, 61,186,123,247,238, 25, 77, 27, 54,104, 80,201,197, 5,129,145, 17, 16, 81, - 22, 34,150, 5, 79,167,129,128,213,194,165, 54, 11, 30, 81, 32, 46, 46, 3,171, 14, 29, 11, 97, 89,246,104, 89,118,107,118,237, -129,165, 49, 25, 32,132, 96,109,243,218, 16,155, 42, 32,146, 43, 48,254,175, 27, 5,228,234,220,210,185, 16, 43, 20,168,218,180, -108,135,240,148, 82,165,169,169,233,147,224,224,224,198,181,107,215,198,140, 25, 51, 16, 25, 25, 9,142,227,144,144,144,160,142, -143,143,143, 77, 74, 74,138, 4,112, 10,192, 78, 67, 60,143,139, 52,234, 13,231, 78,236,155,216,188,149,151,205,247,189,182,226, -244,159,211,145,158,145, 9, 37, 35, 67,142,154, 65,142,134, 15, 43,235, 58,104, 90,183, 46,226, 98, 19,241,226,193,229,108,129, - 70,185,166, 60, 21,148, 16,130,103,207,158,161,138,147, 41,194,238,248,195,198, 68,136,122, 78, 14,112,106,217,170,192,191, 84, -105, 16,242,193, 12, 30, 60,184,192, 51,252,119,223,125, 23, 49,116,232, 80,199,233,211,167,227,143, 63,254,192,189,123,247, 62, - 91,160,237,229,229,133,219,183,111, 47, 1,176,168, 44, 81, 79,171,213,162,102,205,154,120,252,248, 49,174, 93,187,134,118,237, -218,193,203,203, 11, 65, 65, 65,184,114,229, 10,158, 61,123, 6, 66, 8,172,173,173,161,207, 37,207,250,146,140,233,116, 56,254, -203,175,187,231,173, 95,191,181,214,144, 33, 67,112,226,196, 17,140, 28, 81, 3,132, 39, 1, 33, 18,244,232, 94, 3, 75,151, 61, - 70,211,166,109, 97, 99, 35,196,250,117,103,222,171, 84,236,126, 3,178,113,249,149, 43, 87,156,212,106, 53,210,211,211,169, 66, -161, 32, 41, 41,185, 59, 90,139, 83,180,148, 74,165,180, 36, 67,193, 79, 67,215,164,103,209, 52,154,253,172, 87, 42,243,172, 78, -187, 78,209,232,216,109, 4,174,158,219,131, 27,151,175,193, 74, 16, 25, 1,121,214,197,228,136,228,204,248, 28,247,109, 30, 13, - 71,243, 99,114, 46,111,155,252,189, 37,223,209,145, 59,238,187, 53, 35,189,148, 58, 74, 9, 33, 36,245,229,129,191, 78, 81,244, -104,209,188,105,181,218,174,142,226,180,228, 68,250,231,153,139, 33,186,136, 19,103,243, 9, 86, 89, 81, 22, 40,165, 75,125,125, -125,127,206,251,188,119,193,130, 5,163, 87,173, 90,101,251,241,227,199,130, 53, 90,137,201,169, 55, 90,248, 76, 98, 83,210, 51, -180,187,215,207,238, 43,147, 74,196, 11, 86,237,190,165,231,227, 65, 73,118, 25,142,219,210,127,218,194, 41,111, 94, 63,115,174, - 40, 19,227,204,236, 69, 8,188,114, 19,122,158, 8, 63, 93,123, 8,141,142, 69,122,114, 10,174,143,154, 0,133,189, 37,182,222, - 58,145,192,113,220,239,198,174,198, 8, 35,254,119, 81, 10, 23, 41,206,199, 94,130, 1,215, 61, 54,192,206, 87,163,168,138, 85, - 24, 6,109,193, 75, 78, 78, 78,188,125,251, 33,110,157, 91, 14,255,115,203,241,226, 89, 32,226, 98,181,136, 77, 80,195,204,204, -236,126, 41, 29,127,135,162,157,131, 82,169,236,189, 96,225,207, 31,165, 50, 19,180,105,223, 30, 14,182,118, 48, 17, 9,193,103, - 56,240,137, 16,217, 73, 22, 8, 11, 82, 98,206,238, 3,137,217, 74,101,239,162,157, 68, 81,155,133, 73, 6, 33, 4, 18, 51, 83, -136, 21,166,144,152,154,125, 50,141, 40, 53, 51,131,212,212, 12, 2,177,184,184, 69,243,159,217,204,206,206,238,211,183,111,223, -180,140,140, 12,140, 30, 61, 26,254,254,254,207, 46, 95,190,108, 22, 24, 24, 40, 75, 76, 76,172, 70, 41,253,142, 82,186,189, 36, -146, 85,212,102,106,234,187, 44,202,104, 6,248,253, 60, 85,165,102,172,209,111,216, 81,200,121,209, 96, 88, 14, 20,128,147,149, - 24, 45, 59, 44, 67,162,182, 5,142,110, 91,161,228,116,234, 33,133,125,104, 21,181, 73, 41,165,246,246,246,159,229,193,181,107, -215,208,175,111, 31,116,234,213, 19,182,149,170,192,174, 67, 87,116, 26,253, 19,182,109,219, 6, 30,143, 7, 27, 27,155, 79, 20, -142,194, 54,247, 62,163,194, 67, 65,148, 28, 10,162,100,207, 83, 42, 0,240,195,129, 3, 7,126,169, 87,175,222,205,123,247,238, -173, 1, 48,160,240,127, 21, 74,203,226,194,106, 86, 9,101, 52,127,202,148, 41,170, 55,111,222, 64, 46,151,131, 97, 24,220,187, -119, 15, 91,183,110,197,218,181,107,241,236,217, 51, 88, 91, 91,163,106,213,170,208,104, 52,120,252,248,177, 10,192,252, 82,234, - 18,151,148,196,244,217,180,105, 85, 74,183,110,173,177,123,247,111,112,112,104, 1,161,192, 1, 2,161, 45,228,138,154,216,181, -243, 23,116,233,210, 0,127,157, 57,150,154,156,194,244, 41,234,197,189,132,116,170, 31, 62,124,136,109,219,182,161,111,223,190, -177,253,250,245, 99, 51, 50, 50, 10, 20,173,252,104,236,139,243,214,152,105, 52, 26, 73, 73, 54, 71,207, 14,142,157,181, 60,100, -105,194,199,216,102,254, 55,239, 15,190,113,249, 26,222,191,185,129, 27,151,175,225,206,141, 0,223,132,143,177,205, 26, 52,169, - 46,234, 61,122,226,172,125, 39, 79,240, 21,102,142,216,119,242, 4,127,208,164,169, 43, 26,117,106, 55,191,172, 58,159, 87,142, - 52, 59, 49, 97,238,202, 53,155,179, 25,157,154,183,122,227,150, 56, 85, 82,252,124,228,111,197, 44, 65,205, 42,108, 83,169, 84, -110, 87,169, 84, 78, 42,149,202, 73,173, 86,207,143,140,140,108, 51, 99,198,140, 36,150,101, 11,212,210,196, 23,103,238,135,222, -217,179,210,206,198, 82,214,162,113,173, 26,235,182,255,121, 43, 42, 58,225, 96,190, 15,173, 18,202, 72,157,173, 82,247,233,217, -123,104, 78,122,154, 6,205,167,250,130,147, 42,160, 97, 1, 61,229,131, 33, 2, 4, 47, 95, 7,153,149, 41, 14, 69, 60, 85,102, -232,117,125, 10,251,208, 42,227,222,191, 24, 70,155, 70,155, 70,155,255,158, 54,255,147, 65, 8,113, 44, 28,235, 48,207,175,214, -223,138, 86, 89, 91, 42,157,157,157,219,124,223,163, 3,218,118, 91, 0, 74, 41, 94, 61,253, 21,105, 73,175,225,236, 32, 65,120, - 84,102,115, 0,254,134, 38,134, 82, 26, 69, 8,105, 54,101,254,130,147,253,190,107,239, 81,187, 82, 37, 73,197,138,110,144,219, -217, 33, 57, 57, 9,119, 31,188,212,175, 56,124, 60, 36,143,100, 25, 18,130, 7, 28,199,229, 46,114, 7,208,126,202, 28, 16, 62, - 31,200,115,227,144,223, 49, 86,106,220, 2, 68, 32, 0, 75, 57,104, 52, 26,106, 64, 58, 99, 8, 33,125,134,252, 31,123,215, 29, - 30, 85,241,181,223,185,119,123,205,166,119, 2, 4, 82,232,132, 46,189, 8, 72,232, 82, 68,122, 71, 44,136,130,160,160,116,148, - 31, 10, 34, 42, 32, 29, 81,169, 42,189, 74,232, 29,169,161, 5, 2,233,109,211,147,173,247,206,247, 7,217,117, 9, 41,187, 33, - 40,250,237,121,158,155,205,221,187,251,238,244,121,231,204,153,115, 6, 15, 62,178,123,247,110,166, 75,151, 46, 13,119,238,220, -201, 63, 79, 69,228,165,220,249, 67,233, 29,218,125,254,244,113,191, 52,239,208, 91, 29, 82,167,177,168,113, 85, 22, 70, 19, 65, - 98,194, 35,236,222,113,222,120,243,220,129, 28,106,214, 13,204, 79, 43, 59, 4,143,209,104,124, 92,179,102, 77,239, 21, 43, 86, - 88,141,225, 57,142, 67,122,122, 58,206,156, 57,131,122, 77,154,161,214,136, 81, 72, 75, 75,195,178,101,203, 80,165, 74, 21,244, -232,209, 3, 90,173, 22,102,179,249,177,157,117,197, 1, 56, 80,116, 61, 69,104,139, 20, 42,180,188,109,195, 26, 53,106,136,117, - 58, 93, 67, 95, 95, 95,150, 16,178,212, 96, 48, 12,159, 62,125,186,239,130, 5, 11, 16, 22, 22,134,244,244,116, 40, 20, 10,132, -132,132, 32, 45, 45, 13,231,207,159,231, 10, 10, 10, 86, 0,152, 67, 41, 77, 43, 39,125,247, 8, 33,205,223,125,247,173, 29, 95, -124, 62, 46, 68,167,111, 39,118,115,107, 5, 74,205, 72, 75,139, 69,110,206, 41,227,220, 57,235,238,167,164,154,250, 82, 74,239, -218, 89, 77,159,189,253,246,219, 64, 81, 8,158,152,152,152, 43,181,106,213, 10, 41, 77,163,101,143,124,181, 53, 94, 7,224,167, -255,189,255,202,251, 57,233, 87, 67,220, 4,177, 15,155,215,229,151,125,181, 53, 94, 55,251,125,205,188,244,216,168, 59, 73,249, - 7, 86,108,216,177,157, 29,214,231,117, 46, 64,121,119,154,212,139,110,235,208,163,220,250,161, 13, 27, 54, 12, 36, 68, 91, 61, - 53,227,246,197,145,163,199, 13,112, 17, 21,238,109, 16,144, 81,131,169, 18, 33,189,124,249,242, 67,123, 99,134, 22,195,189, 67, - 8,105, 51,125,250,244, 3,148,210,167,108, 19, 82,211,181, 71, 91,116,127,155,102,101,101, 95, 73,189,249,219, 53, 59,176,206, - 19, 66, 58,214,173, 23,177,253,139, 5,159,123,183,123,239, 3,193,157, 63,142, 1,156, 9,143,162,142,129,147, 24,248,175, 78, - 31, 74,201, 54, 26,251, 56,189,194, 59,197, 41, 78,109, 86, 89, 92,228,101, 79,126,113, 99,120, 20,197, 62, 20,216,243,237,248, -248,248,168, 26,193, 1, 7,239,220,105,211,185, 74,128, 39, 0, 32,230, 97, 34, 18, 82,244, 7,237,221, 54, 44,129,108, 53,222, -180,107,239, 64,137, 68,210,157, 20,185,112,160, 21, 8, 42,109, 54,155,227,171, 85,171, 86,202,211,146, 93, 61,113, 28,151, 98, -103, 58,143, 17, 66,134,212,168, 81,227,243, 71,143, 30,237,160,148,230, 63,111, 77,228,165,220,249,195,205,173, 70,240,233,195, -219, 39,157, 61,182,187, 19, 53, 27,234, 1, 0, 17,136, 29, 10, 42,157,151,151, 55,110,194,132, 9, 43,133, 66, 97, 21, 20,217, -156, 89,108,176, 56,142, 99,141, 70,163,148,227, 56, 22, 0, 97, 24,198, 44, 20, 10,117, 59,118,236, 48,155,205,230,199,122,189, -126,220,115,168, 71, 29,234, 0,123,247,238,173,234,234,234,218,153, 16,210,143, 82, 26,158,155,155,171,159, 57,115,230,233,173, - 91,183,230, 84,171, 86,173,107,100,100, 36,113,115,115,195,133, 11, 23,104, 70, 70,198, 54, 0,159, 80, 74, 99, 28, 72, 79, 12, - 33,164,193,184,241,223,191,225,230,182, 50,146, 82, 52, 0, 5, 33, 12,174,101,103,243,123, 11, 10,184, 31,139, 8,163,189,120, -230, 98,154,180,185,215,175, 95, 95, 7, 64, 88,146,141,150, 67, 34,207,251, 93, 87, 24,251, 58, 81, 22,236,252,234,235,120, 29, - 0,124,182, 36, 43, 27,192,234,119,251,184,241,183, 46,173, 94,228,175,190, 59,245,235,157,218,181,246,192, 69, 68, 68, 4, 51, - 12, 51, 16, 64, 93, 47, 73, 86, 77, 79,113, 54, 71, 8,109, 79, 8,227, 1,224,106,237,218,181,119, 3,136,175, 96, 61,223, 1, - 16, 84,252,253,212, 27,191,157, 1,112,198, 65,172,243,132,144,154,239,127, 56,121,162, 88, 40,124, 21, 28, 87,127,238,175, 91, -169, 51,168,180, 83,156,226,148,255,152, 86,107,108, 73,239, 11,236, 5,184, 31, 19,223, 5, 0, 66, 66, 66,232,189,123,247, 28, -158,112, 75, 90,141,227,137,199,247,159,159, 7, 39, 61, 61,189,241,139, 44, 56, 74,233, 79, 0,126,170, 76,204, 34, 34, 53,167, -232,170,104,186,174, 1,104,246, 79, 54, 42,139, 86, 11, 79,130, 48,151, 40,157, 59,119,126,100, 52, 26, 15, 3,136, 35,132,104, - 0,104,141, 70,227, 1,147,201,148, 66, 8,105,252,213, 87, 95, 89, 60,223,207,165,148, 94,172, 96, 58,120, 0,155,139,174,202, -206,227,102, 63, 63,191,201,238,238,238, 53,116, 58,157, 88,167,211,137,108,215, 0, 50,153, 44,205, 94, 44,141,138,172, 23, 9, - 50,221, 53, 42,242, 12,145,114,243,199,246,194,252,235, 97,110,254,216,110, 47,222,229,203,151, 99, 26, 54,108,184,137, 97,152, -106,148, 82,111,128,186, 80,138, 52, 74,105,186, 64, 32, 72,184,121,243,102,194,203, 50, 0, 21, 17,169,197, 69,151, 83,156,226, - 20,167,252,167,164, 44, 27, 45,129,163, 96,119,239,222, 37,206, 34,117,138, 45,217, 42,235,121,108,108,172, 30,192,233,162,171, -248,119, 47, 2,232,241,178,231, 49, 49, 49, 49,162, 50,112, 70, 79,189,150, 0, 96, 82,227, 18, 66, 59,127,182, 76,155, 11, 96, - 74,251,158,142, 97, 94,185,114,229, 49,128,199,206,150,232, 20,167, 56,197, 41,255,156,148,164,205,178, 59,214,161, 83,156,226, - 20,167, 56,197, 41, 78,113,138, 83, 74, 23, 11,169, 42,201,143, 22, 1,208,169,148, 47,217,237,186,190, 34,167, 15,202,195,119, - 98, 58, 49,157,152, 78, 76, 39,166, 19,211,137,249,223,195,252,175, 74, 73, 36, 11, 0, 72, 5, 14, 37, 57,242,163,157, 42,187, -192,157,152, 78, 76, 39,166, 19,211,137,233,196,116, 98,254,247, 48,255,237, 36,171, 4,194,233,220, 58,116,138, 83,156,242,255, - 91,182,109,219,102, 87, 80,209, 55,166,174,238,174, 84,186,206,204,203,201,254,252,231,197, 35,119, 90,222,239,215,175, 31,231, - 44, 69,167, 56,197, 41, 21, 50,134, 15, 14, 14,172,205,112,124, 75, 74, 25,150, 50,212, 68,114, 10,127,185,175,213, 62,229,118, -160, 74,149, 42, 26, 33,131, 30,132, 82, 5, 33, 60,199,179,204,169,152,152,184,155, 14, 48, 64,177,171,171,235,219, 34,145,168, -147,193, 96, 8, 96, 24, 38, 94,175,215, 31, 46, 40, 40, 88, 94,220,113,225, 63, 41, 97, 97, 97,131,142, 29, 59,166,105,213,170, -149, 94, 38,147,153, 11, 11, 11, 5,251,247,239,151,188,246,218,107, 89,247,238,221,171,208,137, 68,127,127,255, 14,171, 87,175, -174,222,165, 75, 23,212,172, 89, 51,127,224,192,129,162, 22, 45, 90,136, 70,143, 30,253, 32, 33, 33,225,168,131, 76,186, 54, 33, -100, 35, 33,132,229,121,126,104,209,137,196, 23,193,216, 25,134, 97,198, 17, 66,250, 80, 74,131, 9, 33, 49,148,210,157, 60,207, -175,180,199, 59,126, 9,120,175, 3,232,198, 48, 76, 4, 0,240, 60,127, 25,192, 94, 74,233,246,231, 72,227, 11,195,148,203,229, - 13, 1,160,160,160,224, 74,101, 97, 18, 66, 26, 22,117,210, 10, 97, 18, 66, 70,200,100,178, 49, 0, 80, 88, 88,248, 3,165,116, -157,195,137, 89, 89,139, 70,204,142, 6, 0, 92,254, 44, 28, 0,224,208,253,184, 91,196,145,223, 42, 9,207, 33,140,103,203,160, -219,224,193,131, 23,252,248,227,143,159, 81, 74,127,123, 17,109,223,199, 39,112,249,151, 95,175,242,155,244,246,168,207,241, 36, - 34, 68,153, 82,135,144, 87,197, 44,219,211,192,113, 39,110, 2, 91, 1, 8,220,220,220, 6,137,197,226, 54, 6,131,193, 87, 32, - 16, 36, 25, 12,134,227,217,217,217, 63, 81, 74, 77,207,157,192,104,226,106, 44,128, 15,225,255,138,243, 70, 25,232, 69,114, 36, - 35,156,102,190, 4,171,125, 6, 79,252,237,152, 0,172,169,136, 59, 15,150,101, 39,249,249,249,245,201,201,201, 41, 96, 89,150, - 62,129, 37, 79,254, 0, 96, 24,134,240, 60,159,154,145,145, 49,244,255,145, 22, 37,168,168, 92,171, 22,189, 37, 4,224, 13,224, - 42,128, 73,148,210, 60, 39, 5,250,219,234,162,184, 70,107, 15,165, 52,201, 74,180,108,220,221,183,139,140,140,140, 10, 14, 14, -172,221,175,119,223, 5,227,199, 77, 32, 44,203,224,250,141, 27,130, 55,135,142,232,236,230,230,230,175,212,235,107,129, 16,190, - 64, 42,189,110, 50, 25, 19,182,254,244,163, 42, 60, 44,140,227, 56, 30, 43, 86,126,255, 90,112,112,224,199,246,144, 45, 66, 72, -168,143,143,207,198,105,211,166,249,244,236,217,147,245,241,241, 65,108,108,172,230,231,159,127, 14,251,230,155,111, 6, 16, 66, -134, 22,249,242,113, 52,179,173,125,220,152,206, 42, 25,233,136, 92, 14,185, 38, 28, 73, 46,196, 65, 74,233,137,138, 22, 96, 65, - 65,193, 59, 5, 5, 5,205,154, 52,105, 66,215,172, 89, 67,134, 15, 31, 78, 9, 33,164,176,176,112, 61, 42,232,250, 65,161, 80, -124,219,165, 75,151,144,144,144,144,152,251,247,239,119,219,178,101,203,222, 97,195,134, 5, 43, 20,138,187, 0, 66, 29,132, 91, -151,145,145,209,160,176,176, 16, 1, 1, 1,107, 0, 52,122, 1,141,136,176, 44,187,211,223,223,159, 46, 90,180,232,183, 6, 13, - 26,120,107,181, 90,243,148, 41, 83, 58,157, 61,123,246, 53, 66, 72, 79,123,201, 22, 33,196,149, 16,178,210,199,199,199,227,243, -207, 63,191,215,184,113,227,171, 18,137, 68,124,247,238, 93,249,228,201,147,223,103, 24,102, 0,165,116, 28,165,246, 79, 16, 22, - 76,127,127,127,143, 5, 11, 22,196, 70, 68, 68, 92, 23,137, 68,162,187,119,239, 42, 62,250,232,163, 73, 21,197,100, 24,102, 69, -139, 22, 45, 92, 63,251,236,179, 91, 97, 97, 97,167, 89,150, 21,199,199,199, 51,179,102,205,122,155,101,217,254, 60,207,143,175, - 72, 58,189,189,189, 93,103,205,154,117,171, 69,139, 22,103, 69, 34,145,232,246,237,219,204,180,105,211,222,118, 36,157,238,238, -238,237,221,221,221, 87, 37, 39, 39, 11, 0,192,215,215,183,105,141, 26, 53,190,177,141,105,105, 49, 13, 48,153, 76,185, 58,157, -110,112, 70, 70, 70,137,142,112,135, 79, 95,214, 3, 0,190, 49, 90,238,159,188,150,119, 15,172,216,101, 79,190, 35,124, 9, 5, -128, 65, 31, 44,238,253,228,245,201,251, 95,230, 3, 2,129,128,223,232, 75,232,229, 36,251, 93,198, 16, 66,122,117,232,208, 97, -214,209,163, 71,191,111,215,174,221, 71,155, 54,109,242,138,139,139,251,130, 16, 18,248,198, 27,111, 12, 63,114,228,200,194,180, -180,180,109,149,213,254,197, 34,137,132, 48, 4, 50,169, 92,109,207,231,133, 12,211,253,116,175, 94, 99,126,184,125, 59,226,155, -232,232,234,249,190,190,205,222,125,247, 93,239,190,125,251, 50,129,129,129,184,119,239,158,251,166, 77,155,106,253,240,195, 15, -125, 8, 33,239, 81, 74, 31, 61, 15,201,202,207, 66, 61,189, 1, 17,148, 66,243, 87, 25, 33, 75, 98,196,101, 69, 52,185,246, 18, -144,173, 79,215,173, 91,247,217,189,123,247,176,112,225, 66, 0, 88,238,224,248, 51,185, 79,159, 62,145, 59,118,236,144,109,221, -186, 85,214,164, 73, 19,248,248,248,160,104, 49,101,117, 76, 93,189,122,245,255, 87,147,187,187,187,251,154, 7, 15, 30,180, 87, - 40, 20, 79,189, 31, 19, 19,211, 48, 36, 36, 36, 27,192, 7,142, 18, 55, 79, 79,207,205, 60,207,235, 51, 50, 50, 70, 1,128, 74, -165,250, 81,161, 80,184, 38, 37, 37,125,252,162, 22, 50, 86,102, 82,140,139,252,155, 53, 90, 37, 58, 44,181,141,152,205,112,124, -203,241,227, 38,144,129,131,222, 72,190, 23,243,128, 23, 8,197,131,246, 31, 56, 32,175, 93,187, 54,163, 95,190, 28,230,180, 52, -152,222,127,255,149,195,135, 15,155,250, 15, 26, 82, 40,100,201,186,224,234,213,228,191,252,244,179,207,142,237,219, 90, 2,184, - 89,158, 38,203,199,199,103,227,177, 99,199,252,171, 87,175,142,172,172, 44,196,198,198, 34, 63, 63, 31, 3, 6, 12, 16,182,108, -217,210,191, 95,191,126, 27, 9, 33,173,236,213,108, 17, 66,188,107, 6, 8,118,127,249,233,128,208,215, 58,183, 84,248, 7,214, - 0, 77,214, 33,238,126,116,147,221,199,206,190, 27,162, 97,238,220,203,166,221, 41,165, 41,142, 22, 96,122,122,250,212, 62,125, -250,108,111,223,190,189,167, 68, 34,129,159,159, 31,233,217,179,103,106, 98, 98,226,236,231, 32, 46, 40, 90,133,113,182,175,197, -195, 3,217, 41, 1,174,174,174,112,117,117, 5, 0,255,231, 93,121,106, 52,154,229, 42,149,170, 95, 78, 78, 78, 33,195, 48,148, - 16, 66, 21, 10,133,204,213,213,245,207, 91,209,119,252,244,122,125,205,197, 75,127,248,186, 67,235, 6,234, 67,135, 14,161,111, -223,190,244,224,193,131,227, 0,124,111,231,111,172,236,211,167, 79,193,204,153, 51,117,247, 98, 98,253,111,221,137, 33, 10,169, -152,247,240,240, 16,158, 63,127, 94,176,100,201, 18,233,172, 89,179, 86, 2,232,231, 64,186, 87,190,241,198, 27,198, 15, 63,252, - 48,233,246,189, 7, 94,215,110,221,163, 74,169,208,236,225,225,206,158, 61,123,150,175, 8, 38,195, 48, 43,166, 78,157,154, 51, -110,220,184,204, 12,109,182, 79,102, 78, 30,149, 8, 89,147,143,143,143,224,183,223,126,211,111,222,188,153, 25, 51,102,204, 10, - 0,253, 29, 40,226, 21, 61,123,246,204,157, 54,109, 90,214,221,152,135, 62,215,110,222,129, 92, 34, 52,121,123,123,177, 23, 46, - 92, 48, 46, 94,188,152,153, 55,111,158, 93,233, 84, 40, 20, 27,182,108,217, 34,248,237,183, 39, 99,223,153, 51,103,152,224,224, - 96,185,237,103, 10,117,122, 48, 4, 72, 79, 79,151,183,104,209, 98, 3,128,128,103, 72,208,236,104, 12,159, 14,188,243,206, 59, - 73,142,182,151, 8,223,119,113,185, 28,247,183,252,138, 90,116,208, 7,139,123, 11, 4, 2,126,204,152, 49,201,197,159,235,116, - 58, 2,160,103,132, 3,100,171, 91,183,110,159,236,217,179,167,198,166, 77,155,190,218,188,121,179, 1, 0,164, 82,169,199,207, - 63,255,188,112,192,128, 1, 24, 48, 96,192, 76, 0,149, 70,180, 56,202, 25, 1, 64, 34,149, 72,162,163,163, 73,120,120,120,153, -198,173, 70,158,191,248,195,237,219,141,223, 10, 15,111,162,229,249,154,162,215, 94,203,155, 60,121,114,122, 78, 78, 14, 98, 99, - 99, 97, 52, 26, 49,124,248,112,182, 93,187,118,126, 3, 6, 12, 88, 70, 8,121,157, 82,106,180, 67,171,179,216,223,223,127,108, -118,118,118,158, 69,171, 83,171,154, 74,208,166,161, 89, 82,191,166, 73, 44, 98,205,162, 30,239,243,228,224,114,146, 31, 94, 29, - 39, 1, 64, 84,128, 52, 17,240,220, 68,203, 37,144, 84,231,132,152,231, 89, 85,254,106, 90, 76,193,103,121,143,232,242,178, 52, -182, 10,133,162,119,126,126,254,182,162,201, 57,180,123,247,238, 56,123,246, 44, 0,180, 4,176,156, 16,210,129, 97,152, 55,121, -158, 95, 77, 41, 45, 43,148,219,187,189,122,245,122,117,199,142, 29, 42, 0,216,182,109, 27, 76, 38, 19,130,131,131, 33, 18,137, - 32, 22,139, 33, 20, 10,173,209, 65,254, 63, 9,195, 48,146,171, 87,175,194,207,207,175,120, 59, 1,128, 54, 21,128,156, 25, 19, - 19,211,226,210,165, 75,104,223,190,253,204,122,245,234,117,141,138,138,242,201,200,200, 64,251,246,237,151, 1,248,237, 69,231, -201,150,139,252,103,234,169, 24,147,108,247,132,153, 49, 44,203, 50,120, 16, 19,107,106,223,190,227,176,199,143, 31, 43,155, 53, -107,198, 8,133, 66,228, 31, 61, 10,221,133, 11, 80, 42,149,232,211,167,143,240,248,241,227,106,181, 82, 61,250,225,131,135,185, - 44,203,128, 82,166, 92,155, 7, 87, 87,215,183, 63,254,248, 99,159,144,144, 16,152,205,102,171, 71,115,179,217,140,184,184, 56, - 40,149, 74, 12, 29, 58,212, 75, 46,151,191,109,231, 36, 91, 53, 52,216,235,242,177,189, 43, 27, 77, 30,223, 77, 17, 42, 63, 4, - 69,220,123, 80,110,123, 11,181, 18,247, 99, 90,239,102,138,131,223,206,140,168,225,231,118,153, 16, 82,213,209, 66,210,233,116, - 39,175, 95,191, 62, 58, 42, 42,138, 7,128, 63,254,248,131,222,186,117,107,220,243,172, 66,121,158, 71, 86, 86, 22,120,158,103, -139,238, 45,175,255,168,122, 95,173, 86,175,232,218,181,235, 27,143, 30, 61,146,237,219,183,207,253,241,227,199, 30, 15, 31, 62, -244, 12, 13, 13, 21, 44, 92,184,112,143, 78,111,100, 77, 28, 53,152, 57, 83,110,210,141, 27, 49,153, 41, 41,151,215,174, 93, 91, - 72, 8,233, 99,231,111,188,238,235,235,235, 62,125,250,116, 16,161,188,105, 88,173,122, 33,172, 80,230,194, 8,197, 46,133,133, - 58,238,193,131, 7,113,211,167, 79,175,214,160, 65, 3,191,162,237, 53,187, 48,253,252,252, 60, 62,252,240, 67, 8, 36,170,134, -245, 27, 68,212, 16, 75, 20, 42, 86, 40, 83, 53,107,214,172, 93, 76, 76, 76,226,180,105,211,124,155, 52,105,226, 16,102,147, 38, - 77, 92,199,140, 25, 99,150,202, 84, 45,170, 87, 15,174, 85,191, 78,173,200,208,208,208,222, 2,129,192,156,150,150,246,104,232, -208,161,190, 61,122,244,240,118, 4,211,203,203,203,117,218,180,105,230,192,160,224, 46, 93, 94,237,220, 92, 36, 83,185, 8,196, - 10, 77, 65,129,142,187,125,251,246,163, 25, 51,102,248, 54,108,216,208,203, 30,204,130,130, 2,161,135,135, 7,234,214,173,139, -218,193,193,200,206,206,198,142, 29, 59,176,110,221, 58,172, 94,189, 26, 63,253,244, 19, 26,183,234, 12,149, 74,133,196,196, 68, -228,228,228, 8,255,238, 54,197,175,168, 69,191, 49,140,237, 57, 97,194,132,196, 49, 99,198, 36,203,100, 50,190,248,229,230,230, -198, 13, 30, 60, 56,101,232, 71, 75,123, 90,182, 22,203,210,100,117,236,216,241,234,222,189,123,239,111,218,180, 9,181,107,215, - 70,151, 46, 93,196, 0,240,246,219,111,139, 7, 12, 24,128, 45, 91,182, 96,219,182,109, 55, 67, 67, 67, 79, 17, 66,122,217,147, -206,161, 67,135,182,234,223,191,255,137,254,253,251, 95, 25, 56,112,224,170,113,227,198, 61, 53,115, 37, 37,198, 95, 52, 24, 12, -104, 16,209, 68, 62,119,205,185,193,229,225,221, 2, 54,173,138,142, 94,247,249,141, 27,143,102,214,174,173, 9,122,248,208,109, -253,226,197, 30,150, 32,221, 38,147, 9,113,113,113,112,117,117,197,224,193,131, 61, 36, 18,201, 80, 59,218,207,146, 94,189,122, -141,120,252,248,177,242,135, 31,126,240,189,114,229,138, 95, 82, 82,146,239,145,195, 7, 60,167,124,240,182,202, 69, 41, 22, 39, -166, 61, 33,170, 15, 19,161,136,126,128, 86,148, 66, 99,187,157, 88,161,113,193,143,200,228,129,228,155, 26,173, 52,119, 62,220, -210,112,224,180, 95, 27,186,122, 4, 74, 63, 46, 35,157,245, 23, 45, 90,180,117,215,174, 93,131, 90,181,106,181,157, 16, 34, 43, -225, 51,210,198,141, 27,239,216,178,101,203,136,214,173, 91,159, 36,132,212, 45,117, 21, 25, 16,208,231,215, 95,127,117,183,220, -123,120,120, 64, 42,149, 62, 67,178, 68, 34, 17, 24,134,193,255, 39, 73, 75, 75,123,179, 77,155, 54, 91,187,117,235,166,191,116, -233, 18,210,210,210,224,239,111, 93,107, 39, 87, 0,210, 77, 46,151, 35, 48, 48, 16, 33, 33, 33,131,142, 31, 63,238, 99, 50,153, -240,240,225, 67,164,166,166, 94,254, 59,242,100,203, 69,254, 77, 82, 44,206,225, 88, 0,123,158, 33, 90, 69,177,133,142, 1, 0, - 37, 36,255,234,245,235, 66, 86, 44, 30,242,227,230,205, 18,145, 72,132, 71,143, 30,225,230,205,155, 40, 56,114, 4,133,167, 79, - 35, 37, 37, 5,121,121,121,240,246,246,198,202, 53,107, 20, 6,142,142,188,125,231, 14, 75,153,191,236, 13, 74, 59,145, 32,145, - 72, 58,245,237,219,183, 84, 66,150,152,152,136,110,221,186, 9, 89,150,237, 84,130,122,238,112,177,204, 17, 63, 79,178,235,200, -246,185,190,190,226,155,192,189,201, 64,238,101,128,234, 1,179, 1, 72,184, 6,236,153,141,160,188,104,114, 96,238, 48, 31,127, -185, 96, 23, 41,166, 54,178,227,120,107,112,120,120,248,234, 33, 67,134, 48, 0,208,161, 67, 7, 18, 30, 30,190,138, 16, 18, 92, -134, 26,241,112, 57,147,228,217,204,204, 76, 12, 24, 48,192,189, 70,141, 26,135, 7, 12, 24,224,110,121,191,162,152, 22,109,114, -157, 58,117, 50,100, 50,217, 79,132,144,114, 7, 88, 91, 76,141, 70,179,188, 91,183,110,253, 54,111,222, 44, 2,128, 99,199,142, - 97,215,174, 93,184,113,227, 6,238,222,189,203, 71, 68, 68,120, 46, 93,189,117,197,242,239, 55, 44,233,221,178,129, 95,187,166, - 17,181,148,121,153,121,222,222,222, 45, 41,165,193,118,166,179,219,236,217,179,111,222,186,255,200,133, 17, 8, 5, 34,161, 64, -162, 86, 43,188, 93, 85,138, 0, 55,185,212, 95,194, 16,101, 65, 65, 65,242, 79, 63,253,196, 3,232,102, 47,230,220,185,115, 31, -220,186,247, 72, 67, 24,129, 64, 40, 16,138,148, 74,185,230,181, 46,237,155, 0,128, 8, 84,148,147,147,147,178,110,221, 58,163, - 35,152,159,125,246,217,117,109, 86,158,171, 64, 40, 20, 10, 4,172,181, 44, 21, 50,153,167, 92, 34, 17,235,245,250,132,175,191, -254,186,208, 17,204,217,179,103,223,188,125,255,177, 27, 67, 8, 75, 8, 35, 80,171, 20,238,238, 46,114, 79, 79,165,204, 67, 46, - 96,197, 57, 57, 57, 9, 27, 55,110,180, 11,211,104, 52,138, 82, 82, 82,112,235,214, 45, 4, 54,105,130, 67,135, 14,161, 74,149, - 42, 24, 48, 96, 0,222,120,227, 13,200,100, 50,116,104, 81, 15,211,167, 79,199,253,251,247, 97, 52, 26, 37, 37, 97, 90,237,164, -138,137,159,159,223,165,242,218,143,237,119,139,167, 51,194,151,208,111, 12, 99,123,218, 18,172,210,240,221,220,220,184,146,180, - 93,197, 49,187,117,235,246,201,145, 35, 71,106,108,220,184,177,231,208,161, 67, 79,110,220,184, 17,205,155, 55,199,173, 91,183, - 80,173, 90, 53,172, 95,191, 30,111,188,241,198,201,101,203,150,245,188,116,233, 82,131,234,213,171,127, 92, 30,230,192,129, 3, - 39, 54,108,216,240,104,114,114,114, 11,173, 86, 91,119,199,142, 29, 35,251,244,233,243, 96,208,160, 65, 29,173, 26, 45,147,105, -243,158,223,183, 35,178,103, 95,132,213,169,187, 98,248,199,155,234,149,133, 73, 41,165, 55,128, 85,235,146,146,210, 54,235,116, - 5, 3,132, 66,185,252,220, 57,183,109,223,127,239, 97,123,210, 59, 33, 33, 1, 61,122,244, 16,138, 68,162,214,101,165,147, 16, -178,168,119,239,222, 3,118,236,216,225,106,209,234,156, 62,125, 26,215,174, 93, 67,108,108, 44,178,178,178,208,113, 92, 30, 38, - 44,124,130, 61, 97, 33, 69,231,183,169,162,130, 99,136, 85,228, 65,196,199, 93, 45, 56, 53,242,235,176,183,199,174,168, 45, 80, -186, 9,241,227, 71,119,145,114, 79,183,173,148,116,146, 22, 45, 90,108,234,223,191, 63, 49, 24, 12, 48, 24, 12, 6, 74,105, 97, - 73,216,254,254,254,210,250,245,235, 99,220,184,113,140, 90,173, 94, 86, 90, 58,243,243,243,245,123,247,238,197,208,161, 67,241, -222,123,239,161,102,205,154,112,117,117,133, 80, 40,196,134, 77,191,120,188, 49,114,124,104,163, 86,109, 26,212,110,212,188,126, -174,158,109, 34,146,187,141, 33, 37,108, 13,188,136, 19,114, 47, 3,102,189,122,245, 90,157, 63,127, 94,210,166, 77, 27, 60,122, -244, 8, 66,161,117, 61,197, 61, 79, 58,103,207,158, 45,209,233,116,248,243,207, 63, 49,108,216,176, 4,163,209,248,254,139,206, -123,113, 46,242,111, 18, 74,233,170, 98, 87, 82,105, 26,173,217, 0, 96,226,177,107,200,176,145, 5,187,119,239,150,139,197, 98, - 60,122,244, 8, 73, 73, 73,216,176,110, 29,215,193,203, 43,183,139,191,127,206,134,117,235,168,193, 96, 0,165, 20,225,225,225, -232,215,175,159,236,245, 1,131, 82, 73, 78,225, 47,118, 48, 63, 95,203,254,250,200,145, 35,159,121, 62,101,202, 20,168,213,106, - 16, 66,124,236,200, 95,255,119,103,247, 14,112,173,174, 73,161,201, 27,180, 96,165,128, 64, 5, 8,212,128,212, 5,144,168, 0, -177, 28,250, 75, 71,181, 12,237, 18,219,183,245, 40,127, 7,183,122,224,231,231, 55,243,232,209,163,158,151, 46, 93,162, 57, 57, - 57, 72, 74, 74,162, 11, 22, 44,240,244,243,243,155, 89,209, 74, 73, 76, 76,156, 27, 25, 25,153, 50,108,216, 48,151,253,251,247, - 7, 14, 27, 54,204, 37, 50, 50, 50, 37, 49, 49,113,238,243, 84,182, 72, 36, 98,111,220,184,225, 54,111,222,188, 55, 0, 92,172, - 91,183,110, 70, 64, 64,192,197, 34,163,201, 50, 69,165, 82, 89, 73,150, 69,187, 38, 16, 8, 32, 20, 10,225,231,231,103,208,106, -181, 92,235, 70,193,178,112, 23,198,228, 39, 17,201,220,100,210, 0,149,218,165, 89, 70, 70,198, 85, 66,136, 93,241, 9, 9, 33, - 13,155, 54,109, 42,228,168,144,159, 48,164,131,223,219, 35,218,123,125, 55,111, 76,149,175,231,142,245, 95, 52,107,116,248,220, -169,131,219, 51, 60,175,171, 86,173,154,143,197,160,221, 14,245,121, 68,227,198,141, 5, 60,132,184,117, 39, 54,229, 81,124, 66, -238,171,237, 90, 88, 53,151,181, 27, 70,116,241,244,244,108, 19, 30, 30,222,216, 94,159, 48, 50,153,172, 97, 88, 88,152,128, 97, -133,196,221, 85, 21,168, 82,202,188, 45,207,212, 26,205, 43,110,158,158,253, 25, 74,179,125,125,125,189,100, 50, 89, 67, 7,242, - 46,224, 33,130,183,151,155,139,167,135, 70,217,165,125,203,154, 45, 94,105, 17, 90,175, 89,243, 22,117, 26, 53,126,157,152,205, - 57,193,193,193, 94, 22, 35,249,178, 68,175,215, 75, 55,111,222,140,121,243,230,161,126, 80, 16,252,253,253,225,229,229,133,211, -167, 79,227,252,249,243,112,117,117, 69,106,106, 42, 22, 47, 94,140,157, 59,119,194,104, 52,170, 28,109, 79,246,144,173,178,196, -108, 54, 51,197, 9, 86,105,248, 50,153,140,183, 24,201,151, 38,123,247,238,221,100,209,100, 77,154, 52,169,213,210,165, 75, 79, - 70, 71, 71, 67,169, 84,226,252,249,243, 24, 57,114,228,201,101,203,150,181, 26, 63,126, 60,214,173, 91,135, 7, 15, 30,172, 41, - 11,111,224,192,129,179, 70,143, 30,253,117, 84, 84, 20,227,237,237, 13, 87, 87, 87,244,238,221, 27,107,214,172, 17,152,205,230, -181,253,251,247,191,210,191,127,255, 43, 92,220,193, 79,182,174, 94,112,250,250,213, 43,152,248,238,135, 98,131,217, 52,205,142, -129,151, 22, 42,149,185,230, 54,109,180, 91, 76,166,130,129, 34,145,220,229,202, 21,183, 93,107,215, 90,201,214,244,233,211,225, -226,226, 2, 60, 49, 96, 70, 25, 90,157,177, 59,119,238,180,142,135,238,238,238, 16,139,197, 16,137, 68, 16, 10,133, 96, 89, 22, -135, 87, 40,240,253,244, 39,252,226,251,233, 4, 7,151,147,231,138,205,170, 8, 32,117, 93,189,197, 87,222, 90, 95,167, 65,221, -142,238, 56,253,115, 50, 22, 68, 94,138, 63,191, 37,109,178, 46,181,212, 80, 74,141,166, 76,153, 82, 59, 53, 53, 21, 23, 46, 92, -192,133, 11, 23,230,149, 82, 54,186,223,127,255,253,139,188,188, 60, 84,175, 94, 29,189,122,245,106, 67, 8,105, 82, 74,191, 65, -227,198,141,209,163, 71, 15,180,111,223, 30,245,235,215,135,193,104, 22,246, 31, 50, 54,236,198,131, 52,255, 5,139, 23,200,143, -254,177,131, 57,121, 50,138,221,180,253,160, 75,139,246,157,191, 22,169,124,207, 18,185,135,239,127, 93,163, 37,149, 74,151, 70, - 69, 69,249, 24,141, 70, 92,191,126, 29,239,189,247,222,243,198, 12,181, 42, 64, 2, 3, 3,113,236,216, 49, 12, 30, 60, 88,151, -146,146,114,230,239,202,147, 45, 23,249,175,136,192,134, 65, 90,229,241,227,199, 89,110,110,110,254, 97, 97, 97,140,193, 96,120, -178, 37,177,109, 27,183,122,237,218, 61, 58,157,238, 93, 0,162,229,223,125,183,194, 63, 32,160,253,144,161, 67,137,201,100, 66, -100,100,164,120,247,238,221,238,247, 83, 82,202, 13,136, 92,124,181, 49,124,248,112, 44, 93,186, 20, 0,240,206, 59,239, 88, 85, -235,196, 14,131, 37,165, 11,186,117,233,222, 88, 29,167,248, 70,109,124,197,148, 87,245,190,234,172, 34, 79,214, 24,140, 88, 0, - 41, 11,222,104, 50,223, 77,237,115,241,254,221, 90,181,101,218,140,106,157,234,180,197,234, 67, 27,187, 1,216, 98,247,170, 78, - 46,111,170, 84, 42,113,241,226, 69,109,227,198,141,179, 40,165, 46,115,231,206,245,144,203,229, 77,159,131,253, 62, 36,132,180, -105,217,178,229,219, 12,195,116,226,121,254,112, 74, 74,202,114, 74,233, 67, 59, 39,237, 9, 0, 62,131,141, 29,138,193, 96, 0, -195, 48,160,148, 98,224,192,129,152, 62,125,122,237,107,215,174,225,232,209,163,110,157, 58,117, 58, 75, 8,201, 2, 48,138, 82, - 90,162,214, 44, 39, 39,167,240,252,249,243,178,163, 71,143,130,231,121,184,185,185, 65,173, 86, 67, 34,145,160,119,239,222,202, -105,211,166,117, 60,112,224, 64,106, 78,213, 42,172, 52, 41, 33, 95,162, 84,170,224,227,223,122,252,160, 55,163, 41,165, 59, 29, - 24, 28,196, 50,129, 89, 71, 56, 61,179,232,211,101,140, 92, 36, 34, 82,145, 0, 18,190, 0,159,124, 49,159,136, 40, 39,128,131, -251,243, 34,145, 72,164,146,192,192,138, 89,147,156,160, 82,156,195,177, 44, 43,150,138,160, 47,237,185,144, 97, 24,134, 97, 68, - 0,204,246, 98, 74, 36, 18,145, 74, 66, 75,197,148,177,132, 37,132,136,241,228,116,214, 51, 18,225, 75,168,141, 22, 73,111, 75, -138, 91,183,110,141, 61, 71, 47, 98,219,174,195, 72,127,116, 21, 51, 62,154,132, 38, 77,154, 96,247,238,221,101,166,201, 98,163, - 85,154,118,217,207,207,239, 82, 98, 98, 98,163,210,190, 91,146,141, 22,191,162, 22, 29,250,209,210,158, 37,105,169, 74,196,255, -212,229, 9, 86, 25, 54, 90,132,144, 94,173, 91,183,158,184,121,243,102, 67,215,174, 93,197, 3, 7, 14, 68,221,186,117, 91,141, - 24, 49, 2, 0,208,169, 83, 39, 44, 93,186,180,213,136, 17, 35,240,203, 47,191, 96,199,142, 29,250,118,237,218,125, 68, 8, 73, -160,148,238, 45, 9,147,231,249, 30, 43, 87,174, 44,174, 41,132,217,108,134,201,100,242, 53,155,205,190, 69, 99, 17,190,254,122, - 89,250,193, 3,187,241,209,199,179,225,229,233,211,208,206, 54, 68,134,127,248, 97,250,250,197,139,177,248,151, 95,240, 97,181, -106,242,141, 55,111,226,160, 78,135, 45, 71,143,166, 23,253, 78,185,182,153,249,249,249,133,123,247,238, 85,111,217,178, 5, 26, -141, 6, 53,107,214,132,155,155, 27,132, 66, 33, 24, 86, 6, 86,228,138,176, 58, 77, 1,156, 7, 0, 84,243, 67,126,120,117,156, - 36, 4, 89,148, 41,189, 13,151,218, 71,131, 72, 85,239, 32,105,212,196,117,117, 53,106, 47, 17,246, 47,127,140, 3,223,196,237, -212,165,227, 43,152,113,187,140,195, 26,141,171, 87,175,142,212,212, 84,236,221,187, 55, 31,192,151,165,253, 6,207,243, 95,124, -247,221,119, 83, 62,254,248, 99, 73,120,120, 56, 0, 52, 4,112,161, 68,210,167, 80,192,223,223,223, 74, 44, 7, 14, 27, 31, 60, -110,242,120, 89,159,206,237, 33, 16,120, 32, 43,223,132,140, 92, 19, 92, 61,148,248,104,114,127,233,225,198,254, 77, 86, 46,251, -241,119, 66, 72, 19,250, 34,157, 69,254,195,226,238,238,222, 48, 35, 35, 3, 15, 31, 62,196,176, 97,195, 18,210,211,211, 15,229, -231,231,143, 76, 76, 76, 4, 0,109, 5, 32,173,100,190, 97,195,134,104,218,180, 41, 6, 12, 24, 32, 45, 40, 40,232, 31, 28, 28, -236, 15,224,149, 23,153,159,226, 92,228, 63, 69,180, 74,156, 16, 76,166, 48,253,138, 21,200, 63,124, 24,226,131, 7,177,197,207, - 47, 79,167,211,125, 64, 41,141, 43, 26,244, 38,173, 91,191,254, 84,207, 51,103,212,134,232,104, 4, 95,187, 6,161, 70,211,208, -209, 4,172, 93,187, 22, 57, 57, 57,200,206,206, 6, 0,124,243,205, 55,200,201,201,129,197,150,161,220, 12,136,208,202,199,171, - 26,146,113, 23,188,128, 81,198,134, 21, 52, 87,234, 84,137,254,143,189,243,179, 25,127, 68, 63,106,166, 40,204, 48, 52, 39,172, - 1,186,244, 2,248,183,172, 9, 1, 4,173, 28, 73,163,101,223, 95, 32, 16,104,239,220,185,211, 35, 52, 52,116, 23, 0,143,231, -181, 7,160,148,222, 3,240,110, 5, 73,192,103, 15, 30, 60,240, 90,179,102,205,219,115,231,206,165,182, 68,203,242,191, 64, 32, - 0,165, 20, 46, 46, 46, 16, 10,133,222,167, 79,159,246,110,214,172,217,183, 69, 3, 90, 73,249,164,117,235,214,197,131, 7, 15, - 32, 16, 8,224,226,226, 2,222,108,196,236,201,227,193,177, 18,193,212,169, 83, 27,246,237,219,247,250,154, 53,107, 76,234, 22, - 45, 95,201,200,200,184, 49,113,240,144,235,191,253,246,155,129,231,249,149,118,230,249,202,221,187,119,217, 0, 63,111,150,154, - 11,120,133, 8,144, 94,253,154,138,149, 62,144, 10, 88, 42, 34, 12, 36, 82,153,203,195,248,248, 12,158,231,111,217,131,201,243, -252,229, 7, 15, 30,200,188,189,220, 5, 5,133,134, 60,153,144,138, 99, 47, 95,140,169, 26,209, 56, 24, 0,116,151,207, 31,147, -132,213,146,197,166,164, 41,170, 85,171,102, 23,102, 97, 97,225,149,132,132, 4,214,219,219, 91,240, 40, 46,254,119,141, 82,225, -169,214,104,154, 3,128, 49, 55,251, 60,163,215,167,177, 66,129,119, 90, 70,134,182,176,176,240,129,189,121,191,127,255,190,192, -215,215,139,221,127,240,200, 46,111,185,196, 75, 37, 22,168, 37,132, 16, 57, 75,114, 68,102, 62, 93, 42,151,123, 61,140,143,215, - 82, 74, 75,213, 16,126,158, 53,164,207,147,250,154,253,139, 13, 54,174, 94,189,138,125, 39,111, 65, 65, 13, 32,186,108, 28, 92, -247, 3, 6, 79,253,248,185,237,254,202, 35, 91, 21,210,102,173,172,117,169, 24, 62, 18,203, 49,132, 31, 60,120,240,236, 77,155, - 54, 89, 13, 80,110,221,186,133, 14, 29, 58, 88,182, 57,208,165, 75, 23, 52,107,214, 12,183,110,221, 66, 72, 72, 8,142, 30, 61, - 42, 97, 89, 86, 50,100,200,144, 5, 0,246,150,151,222, 85,171, 86, 97,228,200,145, 37, 25, 86,223, 7,160, 35,174,225,121,211, - 63,223,224,161,205, 72, 71,106, 90,242, 21,123,203,129, 16,130,225, 31,126,152,190,210, 96,192,230,115,231, 48, 84,161,144,175, -191,119, 15,145,205,154,161, 94,135, 14,233,246,140,117, 22,173,142, 78,167,131, 80, 40,132, 90,173,134,187,187, 59, 68, 34, 17, - 88,161, 31, 4,226, 6, 96, 68, 34, 68,180,110,128,197, 31, 40, 10,134,189,134,101,132, 32, 75, 34,198,101,145,188,100, 91, 29, - 66, 8, 81, 84, 65,111, 74,145, 83, 16,135, 63, 44,132, 68, 83,149,184, 40,213,194,131,163,191, 13,215,168,189, 68,216,183,236, - 17, 14,126, 27,191, 93,151,140, 25, 0,238,151,117,186, 88, 34,145,212,211,104, 52,136,139,139,195,227,199,143,111,150,101,224, - 79, 41, 45,104,209,162, 69,140, 68, 34,169,237,233,233, 9, 0,213, 75, 75, 39,207,243, 86, 59,172,141,155,183,122, 52,108, 19, - 44,125,181, 85,109,108,216, 53, 31,111,245, 95, 6, 33, 75,192,113, 70,124,181,180, 59, 56,125, 30,250,247, 28, 75,218,118, 10, -105,112,120,151, 97, 52,128, 31,254,171, 68, 43, 62, 62,254,221, 54,109,218, 44,200,205,205,205,204,207,207, 31, 12, 0,213,171, - 87, 15, 98, 24, 70, 2, 96,110, 25,237, 41, 8, 37,187,133, 16, 93,187,118, 13, 42,149, 10, 9, 9,127,197,164,143,139,139, 3, -207,243,122, 56,165,172, 62, 26, 65, 41,189, 76, 8,241, 5, 16, 9, 27,247, 14, 76,145,170,174,237,158, 61,123,232,158, 61,123, -218, 90, 39, 47, 74,121,179, 86, 11,170,127, 82,182, 66,161,144, 2,176, 61,209, 36,215,104, 52, 68, 24, 16, 0, 34,121, 98,250, - 65,109,246,132,159, 87, 76, 38,251, 92,203,240, 28, 88, 16, 35,168,141, 18, 35, 95, 74, 48,223,163, 35,222, 21,207, 68,178, 88, - 99,219,179, 1, 51, 5, 7,158,117, 48, 57, 52, 63, 63, 31,102,179,217,181, 70,141, 26,123,204,102,179,171,101,107,224,159,170, - 84,142,227, 98, 88,150,197,219,111,191, 13,139,246,199, 96, 48, 32, 57, 57, 25,122,189, 30, 6,131, 1, 15, 30, 60, 64,118,118, - 54, 12, 6, 3,110,220,184,129,234,213,171,131,101, 89,223, 50, 26, 10,165,148, 34, 48, 48, 16, 85,171, 86, 5, 75, 40, 86, 47, -154,133, 79,222, 27,143, 55,170,243, 88,187,252, 43,180,107,215,174, 86,181,106,213, 90, 8, 4, 2,206,199,199, 71,180, 99,199, -142,223, 57,142,235,237,128, 31,173,189,211,167, 79,175, 90,167, 78, 29, 47,141, 90,101,146,136, 89,136, 77,249, 84,162,207,160, -130,130,116, 4, 6, 6,153, 33,147,135, 12, 29, 58,148,179,103,114,180, 96,126,240,193, 7,190,225,225,225, 46,174, 26, 85,190, - 88,200,166,138, 64,211,179,175, 94, 56, 11, 0, 98, 79, 47, 29,164,242,218,195,134, 13, 51, 59,130, 57,115,230,204,234,158,158, -158, 26, 6, 52,151, 51, 26,255,218,111,215, 27, 50,136, 80, 88, 8,145,184,241, 59,239,188, 67, 28,193,156, 50,101, 74,181,218, -181,107,107, 52,106, 69,158, 64,200, 38,137,120, 62, 73, 10, 62, 89,104, 48,102, 74, 61, 61, 10, 32, 87, 70, 12, 29, 58,180, 84, - 76,139, 54,107,218,180,105,113,197,136, 55,180, 90, 45,116,201,215, 33, 74,136, 70, 3,165, 16, 77, 60, 93, 33,145, 72,172, 71, -223, 75,107,174,165,217,104,149, 68,182,236,253,110,227, 57,101,108, 1,174,172,117,169,184,223,172, 34,252, 50,251,211,143, 63, -254,248,113,251,246,237, 83,187,116,233, 98,216,179,103, 15, 8, 33, 56,122,244, 40, 18, 18, 18,208,165, 75, 23, 80, 74, 45,167, -218,112,229,202, 21,116,234,212,201,208,166, 77,155,132, 31,127,252,241, 51,123, 42,103,228,200,145, 48,153, 76,200,203,203,131, - 86,171,197,238,221,187,209,160, 65, 3, 42,151,203,251,178,129,157,231,247, 31,253,241, 43,117,235, 55,196,183,203, 22, 27,196, - 2,225,231, 14, 14,194, 24,246,193, 7,233,217, 17, 17,218,141,249,249, 5,195,213,106,121,141,184, 56,183,139, 7, 14,120, 24, -141, 70,187, 48, 44, 90,157,128,128, 0, 43,201, 18,137, 68, 16,136, 61,193, 42,234, 65,236,222, 5,114,159,190,248,227,178, 68, -239,162,192, 78,149, 18,251, 21, 26,148,234,218, 65, 30,136,249,175, 12,244,221,209,242, 13,223, 35,242, 42, 88, 67, 8, 97, 8, - 33, 12, 21,144, 29, 35,190, 10,173,225, 89, 85,134, 51, 91,147,113,240,219,248, 95,117,201,152, 5,224, 94,121,253,220,104, 52, -234, 56,142, 3,195, 48, 16, 8, 4,182, 54,162,167,126,253,245, 87, 92,188,120, 17, 0,172,110,123,114,115,115, 57,150,101, 33, -149, 74, 1, 64, 89,198,120, 7,161, 80, 8,161, 80,136, 99,103,143,187,191,241,122,119,114,250,207, 67,104,217, 96, 16, 50,242, -140, 72,201, 54, 34,171, 0,168,211,100, 6,234,118,218,137,171, 15,114,209,176,126, 93,150, 21, 43,134,253,203, 39,239, 32, 47, - 47,175,211, 30, 30, 30, 71, 9, 33, 65,132,144, 32,181, 90,125,202,207,207, 47,154, 16,210,139, 82,250, 91, 98, 98, 98,120, 94, - 94, 94, 75, 74,233, 35, 74,233,163,244,244,244, 14,169,169,169,175,148,117, 88,203,221,221,125, 77, 78, 78,206, 36,142,227,122, - 22, 93,175,113, 28,215,240,238,221,187,181, 27, 54,108,120, 51, 56, 56,248, 74,112,112,240,190,224,224,224,223,131,131,131,127, -111,223,190,253, 82,139,187,135, 23, 41, 37,113,145,127,145, 88, 76, 93, 34,139, 92, 61, 68, 90,231,140,162,215, 99,197, 13,208, -204, 18,201, 13,243,196,137,208,252,254, 59,132,119,239, 98,196,176, 97,106,185, 92,190,140, 16,210,136, 16,210, 82,169, 84,126, - 59,107,214, 44,149,199,194,133,240, 59,126, 28,177,187,119,195, 36, 20, 94,168, 72,234, 10, 11, 11, 33, 16, 8,172,154, 24,133, - 66, 1,142,227,138,184, 91, 57,132,195,140, 51, 9, 41,209, 16,163, 42,120,208,188,253, 57,109,206, 13,138,153,225,181, 59,167, -122,200,189,124, 81,200, 28,207,230, 94,203,130, 90,157,203, 39,130, 60,177, 70,138,199,143,227,192,129,119,104,191, 89,167,211, -101,231,231,231,163, 97,195,134,238, 23, 47, 94,172,209,160, 65, 3,183,162,247,207, 63,103, 39,106,225,239,239,191, 53, 32, 32, -224,161,191,191,255, 86, 66, 72, 11, 7,190,190,230,196,137, 19, 96, 89, 22,179,102,205, 66,110,110, 46,140, 70, 35, 50, 50, 50, -240,248,241, 99, 24, 12, 6,196,199,199,227,246,237,219, 48, 24, 12,136,141,141,133, 94, 95,254,130,132,231,121,168,213,106,232, - 10,243,240,253,252, 79, 48,115,218,100,100,223,191,132,248,196, 20,104, 92, 20,120,247,221,119, 89, 87, 87, 87,158,227,184,170, -102,179,185, 19,199,113, 43,236, 37,156, 69, 78, 11, 79, 6, 6, 6,214, 93,180,104, 81,237, 79,230,175, 16,169, 5,121, 84,162, -146,242, 98,149,132,138,107, 53,199,200, 25,203, 68, 95, 47,249,242,206,153, 51,103, 18,236,113,222,105,193,140,136,136, 8, 77, - 72, 72,104, 16, 30, 30, 30,230, 17, 84, 77, 34,241,245,207, 18,249, 86,201,161,122,221, 57,226, 95,165,245,138, 21, 43,174,159, - 58,117, 42,209, 17, 76,133, 66, 81,107,195,134, 13,117,189,189,189,235, 10,101, 50,105, 65,118,246, 22,115, 65,254, 86, 86,227, - 42,101,212,154,215,118,238,220,121,105,251,246,237,201,142, 96,134,132,132,132,207,159, 63,191, 78,189,122,245,234,248, 84,175, - 33,145,249, 7,102, 72, 3,130, 50,100,245, 26, 72, 16, 80,181,235,183,223,126,123,229,204,153, 51,118, 97,178, 44,107,102, 24, - 6, 66,161, 16,114,185, 28,251,247,239,199,196,209,131, 16,232,239,142,176,240,112,116,124,107, 18,182,111,223,110,181,225, 97, - 89,182,212, 25,125,253,194,119,119, 69,248,146, 75, 88, 89,235, 18, 86,214,186, 20,225, 75, 46,149, 74,182,138,158,151,244, 25, -187, 70,163, 82,236,176,202, 35, 91,148,210,189,199,142, 29,251, 98,248,240,225,226,110,221,186,225,220,185,115, 24, 57,114,228, -201, 29, 59,118, 0, 0,206,157, 59,135,247,223,127,255,228,145, 35, 71, 48,126,252,120,116,232,208, 65,124,226,196,137,111,237, -241,253, 99, 54,155,177,118,237, 90,152,205,102, 40,149, 74,184,185,185,161,123,247,238,184,126,253,250,248,117,235,214, 69,179, - 66,225,155,145, 61, 95,199,158,223,119,224,246,141,235,227,215, 47, 24,226,176, 83, 96,134, 97,208,109,216,176,244,244, 58,117, -180,235,115,114, 10, 70,185,186,202,195,147,147,221,254,216,186,213,195,142,246, 67, 56,142,179,146, 43, 11,233,176, 92, 2,177, - 39, 4,138,186, 16,168,154,224,234, 61,145, 73,216,148, 94, 22, 53,166,183,202,242,159, 37, 20, 51, 35,251,126, 82, 29,125, 63, -169,142, 94, 83,171,141,144, 87,193,106, 69, 21, 76,232,246, 94,213,246,193, 77, 92,144,147,106,196,238,175, 98, 31,233, 50,176, - 16,192,109,123,250, 57,207,243, 55, 19, 18, 18, 32, 22,139, 81,165, 74,149, 80, 66,136,197, 46,112,205,152, 49, 99,222,153, 51, -103,206,100, 0,115,138,242,164,108,223,190,125,157,188,188, 60,220,189,123, 23, 0, 46,150, 81,247,214, 83,134,218,156, 88, 73, - 53,191,122,104, 80,107, 28, 92, 93,235, 35, 65,107, 64,162,214,128,213,223,247,198,165, 19,243,112,241,224, 80, 60, 74, 78,134, -204,167, 15, 56,179,190,238,191, 92, 81, 50, 51, 38, 38,166,197,214,173, 91,219, 3,152, 89,175, 94,189, 51,143, 31, 63,126,229, -248,241,227, 97, 1, 1, 1,203, 42, 10,106,113, 11, 17, 27, 27,251,212, 85,228, 22,194, 64, 41,141,160,148,118,163,148,246, 42, -186,222,127, 46, 95,111,246,203,177,127,171, 49, 60,128, 61,197, 79, 27, 22, 39, 90,182,142,194, 80,195,205, 77,101, 50, 25,227, - 15, 29, 58,100,100, 24, 6,114,185, 28,195, 71,142,100,190,255,238,187,214,131, 90,180, 56, 58,246,213, 87,247, 29, 61,114, 36, -162, 89,179,102,160,148,130, 97, 24,252,242,203, 47,133, 58, 93, 97, 70,149, 42, 85, 52,246, 12, 26,182, 29, 40, 39, 39,199, 74, -180,178,179,179,225,237,237,109,247,214, 97,126, 14, 14, 31,217,127, 41,147,114,111, 61,238,118,111,137,241,243,228,222,205,178, -120, 78,144,205,153,144, 93, 72,145,171,131,224, 28,227,214,108,120, 72, 31,227,131, 78,205,110, 71, 69,159,206,208,113, 58,135, - 78, 75,164,166,166,126,210,191,127,255, 12, 95, 95, 95,162, 86,171,225,239,239,207,244,234,213, 43, 61, 46, 46,110, 78, 69,107, -196,195,195,227,141,246,237,219,239, 74, 72, 72,232, 23, 21, 21, 85,245,248,241,227,253,218,183,111,191,203,195,195,227, 13, 59, - 33,182,124,252,241,199,249, 98,177, 24,205,155, 55, 71,110,110, 46,138, 78,249,148,121,149, 55, 17, 0,128, 72, 36,194,202, 69, -159, 97,230,180,201,208, 70,159,195,213,147,135,112, 44,153, 96,198,252, 47, 33, 18,137, 42,228,235, 43,196, 75, 81,175,158,159, -234,214,251, 35, 7, 38, 78,159, 54, 77,117,229,202, 21,225, 59,239,189, 79, 99,147,180, 16,119, 91,204,162,237, 39,204,159,249, -158,136,124,173, 35,102,205,252,176, 30,165,116, 92,121,152,181,189, 20,245,234,250,169,110,126, 56,118, 80,204,123,239,189, 39, -251,252,243,207,117, 45, 90,180, 40, 76, 73, 73,145, 41, 92,221,194, 5, 46,154,186,177, 73,201,202, 22, 45, 90, 60,120,235,173, -183,178, 28,197,156, 49, 99,134,252,192,129, 3,130,254,253,251,155, 51, 51, 51,149, 66,153,172, 33,145, 72,155,166,101,102,186, -244,235,223,255, 94,191,126,253, 10,120,158, 31,239, 8,230,167,159,126, 42,191,125,251,182,160, 69,139, 22,166,228,228,100,149, -194,221,163, 1,171,113,107,242, 48, 41, 69,221,180, 89,179,251,239,188,243, 78,126, 89,233,180, 37, 41, 42,149, 42,161,101,203, -150,248,234,171,175,240,245,215, 95,163,107,215,174,184,126,227, 58, 34,223,153,140,218, 19,222,199,239,167,207, 34, 33, 33, 1, -115,231,206, 69,131, 6, 13, 32, 18,137,110,151, 8, 58,238, 22,185,156, 68,201,229, 36, 74, 48,238, 22,177,220,151, 74,134,230, -100,227,169,207,151, 32, 23, 63, 45, 89,211, 21,225, 75, 46,149,101,135, 85, 30,217,234,215,175,223, 68,139, 11,135, 81,163, 70, -157, 92,182,108, 89,171, 81,163,158, 44,180,155, 55,111,142,121,243,230,181,154, 49, 99,198,201,249,243,231,163, 99,199,142, 8, - 14, 14, 46,247,224, 11,199,113, 48,155,205, 24, 52,104, 16,204,102, 51,210,210,210,112,231,206, 29,172, 90,181, 10,148, 82, 41, - 0,248,250, 5, 52, 22,139,197,248,243,242,133,130,153,163,154,253,232,192, 98,138,216, 46, 98,242,242,242,208,111,194,132,244, -248,154, 53,181, 43,210,211, 11, 70,187,186,202,171, 61,122,228,166, 50, 24,252,203,178, 73, 37,132,128,231,121, 43,177,178, 16, -174,226, 87,209, 68,105,151, 24, 11,248,189,199, 55, 37, 2, 0,218, 12,241, 67,175,169,213, 70,248,134,200,191,105, 61,248,137, -210,123,251,188, 24,154,155,200,125, 14, 19,110, 58,160,177, 62,119,238,220, 57,104, 52, 26,244,239,223, 95,194, 48,204,194,162, -113, 94, 71, 41, 93, 78, 41, 93, 98,193,146, 72, 36,139,135, 14, 29,202,100,101,101,225,234,213,171, 0,112,164,180,113,137, 82, -106,205,123,158,150,128,227,197, 56,117,121, 63, 14, 30,223,134,135, 9,105,120,148,170, 3, 4, 46,208,229,199,195, 88,152, 0, - 67,214,101,228,232,229,255,133, 29,169, 23,226,110,225, 5,184,133,168, 76,173,214,191,210,166,142, 82,154,100,123,218,208,214, -129,105, 73, 14, 75, 65,213,178,129,219,190,253,222,165,255,160, 33,249, 13, 26, 52,112,245,247,247, 7, 33, 4,189,251,244, 33, -237,163,162, 84, 66, 63, 63,184, 55,106,100,221,142, 56,124,232, 16,246,239,223,159,191,231,215,157,254, 35, 71,143,238, 1, 96, - 67, 25, 3,134,160, 70,141, 26,214,223, 77, 74, 74,130, 68, 34,177,218, 68,228,228,228,192,211,211, 19, 73, 73, 73,176, 83, 81, -178,113,250,180,179,211, 82,155,125, 82,189,153, 74, 72,246,229, 39,131,163, 20, 66,194, 1,133, 20, 38, 14,208,155, 40, 26, 87, - 99,221, 14, 22,154, 93,119,159,219,241, 0,192, 70, 7, 53, 90,127, 16, 66,198,241, 60,191, 13, 0, 19, 21, 21,197,223,188,121, -115,162,189,134,235, 37,170,237,229,242,169, 71,143, 30,117,155, 58,117,106,230,238,221,187,179,187,119,239,238,178,106,213, 42, -183, 14, 29, 58, 76, 5,240,179, 29,149, 90, 72, 8,217, 16, 23, 23, 55,177, 73,147, 38,208,106,181, 48, 26,141,184,116,233, 18, - 66, 66, 66,112,241,226, 69,132,134,134,226,194,133, 11, 8, 11, 11, 3,199,113,208,233,116,224,121,158, 43,111, 48,215,166,167, - 1, 25,143,145,120,110, 31,238, 92,187,132,163,137, 4,203,127,222,133, 42, 85,171, 87,200, 79, 77,152,183,162,142,191,151,251, -193,207,103,127,234, 21,251,199, 47,216,177,118, 57,127,108,223,190,218, 98, 21,198,181, 29, 52,233,117,131, 9, 65, 0,196,175, - 52,107,130,110,174,183, 57,121, 85, 36, 31,185, 81,182, 39,235, 48,111, 69, 29, 63, 79,247, 3,255, 91, 56, 71,117,127,255,122, -108, 89,249, 21,221,190,233,167, 6, 58,160, 89,157, 58,117,186, 49, 12,163, 1,160, 43,178,243,178, 43,180, 77, 73,152,135,119, -237,138,208, 1,205,126,251,237,183,110,114,185,220, 7,128,169,160,160, 32,230,121, 48,143,236,222, 29, 97, 73, 39, 33,196, 11, -128,145, 82,122, 31, 14,134,224, 25, 48, 96,192,188,247,223,127,127, 26,199,113,158,150,247, 76, 38, 19,187,120,241, 98, 1,207, -243, 44,165,212,200, 48,140,241,192,129, 3,156,217,108, 78,212,233,116, 19,158,103, 32,121,253,245,215,113,246,236,217,217,120, -114, 8,195, 94,109,245, 83,118, 90,101,109, 83,218,131, 31, 21, 21, 53,247,205, 55,223,156,254,243,207, 63,223, 89,182,108, 89, -207,241,227,199,227,151, 95,126, 65,205,154, 53,241,231,159,127,226,147, 79, 62, 1,128, 86, 51,102,204,248,125,205,154, 53,193, -177,177,177,139,203, 75,163,201,100,130,217,108,198, 79, 63,253,132,222,189,123,195,211,211, 19,126,126,126, 32,132,252, 49,122, -244,232,239, 0,128, 37,172, 8, 0,244, 58,189, 62, 60,188,137,221, 26,220,224,224, 96,235, 88,151,156,156,108, 61, 41,216,249, -205, 55,211, 87,127,254, 57,126, 44, 44,196,104, 87, 87,121,124, 64,128,239,239,247,239,143, 37,132,172, 42, 77,115,100,209,234, -148, 71,178,236,213, 48, 23, 38,225,227, 95, 23, 60,244, 1,208,181,205, 16, 63,180, 25,226,135, 38,189,188, 8,195, 18, 92, 59, -152,129,235,135,181,219, 77, 57,248,195,145,112, 57,148,210,155,238,238,238,191,183,109,219,182,103,173, 90,181, 48,102,204,152, -183, 68, 34,145,200,100, 50,189,103,113,243, 64, 8,113, 97, 24,102,206,186,117,235,198,186,185,185,225,196,137, 19, 56,126,252, -248, 31,148,210,199,165,141, 75, 0,172, 62,179,170, 4,134,234,110,199,230,201, 83, 19, 78,225,228,137, 95, 81,179,193, 36,200, -124,122,192, 45,124, 62,140,209, 95,195,144,113, 16,110,129,221, 17, 31,123, 31,172, 64,114, 29,255, 17,177,184, 91,184,126,253, -122,137,238, 22, 28,149,122,245,234,181, 58,126,252,184, 68,167,211,225,216,177, 99,104,218,212,122,182,235, 31,141,223,105,203, - 69,254, 77, 82, 86, 80,233, 18,103, 77,194, 19, 97, 88,104, 40, 39, 98,176,174,119,143, 30, 5, 87,174, 92,177,174,250,116,231, -207, 35,127,255,126,112, 28, 7, 74, 41,142, 71, 69, 97,232,144, 33,121, 66,150,172,174, 86,173, 42, 37,244, 47,223, 45, 37, 29, -165, 23,137, 68,253,251,247,239,111, 29,124,226,226,226,160, 80, 40, 32, 22,139,193,243, 60,204,102, 51, 88,150,133,139,139, 11, -204,102,179,161,132,204,116, 42,150, 17, 19,167,205,239,183, 38,114,112,146, 95,158,145,142,211, 84, 67,144, 72,102,237,156, 62, -106,130,158, 13,132,240, 16,164,210, 35,139, 95, 77,228,245, 25,253,138,199, 22, 43,239,200, 63, 33, 36,180,126,253,250,223, 13, - 29, 58,148, 1,128, 78,157, 58, 49,245,235,215,255,134, 16, 18, 90,198,119,202,196,148, 74,165, 18, 0,216,181,107,151,246,206, -157, 59, 93,119,237,218,165,181,125,223, 78,204, 85,139, 22, 45,130, 92, 46,135,217,108,134,193, 96,176,218,103,217,190, 26,141, - 70,120,120,120, 96,207,158, 61,224, 56,110, 79,121,233, 12, 12,170, 10,226, 89, 3, 27,118, 29,197,241,116,145,195, 36,203, 22, -179,166,175, 50,204,199,195,253,208,255, 22,204,245,204,188,119, 9,241,241,241,244,192,254, 61,103, 10, 41, 77,200,202,161, 51, - 51,243,104, 88,129,158, 74,155, 6,227,241,161,149, 31,209, 25,109, 96, 66, 9,167, 6,109, 49,235,248, 42,195,252, 61,221, 15, -124,249,191, 5,170,172,123,151,144,148,156,140,189,123,118, 93, 41,164, 52,129, 82,186,157, 82, 58,130,227,184,186, 28,199,213, -165,148,142, 40,141,188, 56,138,153,159,159, 95, 47, 63, 63,191, 94,101, 98,242, 60, 95,143,231,121,187, 49,109,137,202,146, 37, - 75,162,147,146,146,134,166,166,166,118,177, 92,153,153,153,157,242,242,242,218, 21, 20, 20,180, 46, 92, 82,213, 37, 63, 63,223, - 43, 55, 55,215,183,176,176,176, 49,165,244,146,189,237,211, 86,108,189, 78, 39, 38, 38,206, 74, 76, 76, 36,229,165,147, 25,127, -139,108,254,242,195, 95, 87,174, 92,233,251, 60,248,197,211,153,150,150,182,237,167,159,126,106, 88,189,122,245,224, 17, 35, 70, - 96,197,138, 21, 88,182,108,153, 30, 0,214,172, 89,163,183,209,100, 5, 62,124,248,176, 73, 73,219,134, 79,165,147, 97, 54,118, -238,220,153, 30, 63,126, 28,189,123,247,182, 58, 18,253,225,135, 31, 96, 54,155,115, 58,118,236,200, 3, 64,161,174, 32,135,242, - 20, 6, 99,201,251,239, 37,149,167, 88, 44,126,205,214, 95,160,197, 25,179, 88, 44, 6,165, 20, 97,173, 90,165,103, 53,104,160, - 93,155,157, 93, 48,171, 94, 61,245,216,240,240, 17,181,128, 33, 37, 97, 18, 66,158,210,234, 20,191,236,213,100,217, 98, 82, 74, - 83, 11, 19, 49,230,215, 5, 15,247, 91, 52, 91, 82,165, 0,186, 92, 51,118,126,254, 48, 77,151,134, 31, 0, 60,118, 4, 19, 0, -180, 90,237, 59,159,127,254,185,222,213,213, 21,175,191,254, 58,230,207,159, 63,186, 85,171, 86,217,222,222,222,103, 67, 66, 66, -174, 13, 28, 56, 48,233,210,165, 75,239,180,111,223, 30,119,239,222,197,151, 95,126,153,149,153,153, 57,184, 44, 76, 66,136, 85, -147,215, 43,178,147,246,251,111,190,226, 59,182,157, 8,185, 76, 13,147, 48, 16,218, 60, 19, 50,243, 41, 12,146,102, 16,139, 36, -232,210,162, 14,206, 30, 88, 95,192, 25,242, 55, 84,164,205, 59, 48,185,190,104,204, 74,113,183, 80, 60,157,149,225, 22,226, 69, -228,253,223, 44, 37,248,209,122, 90,163,101, 57, 82,105,121, 37,132,231, 56,142, 71,181,234,213, 84,177, 15, 31, 47, 31, 48,160, -255,168,110,221, 34,229,145,145,145,210, 58,209, 79,182, 46,118,237,218,133, 29, 59,118, 20, 28, 60,120, 48, 71, 34,100,215, 4, - 86, 9,244,230, 56, 30,132,240,101,178, 97,149, 74,245,222,199, 31,127, 44,203,206,206,198,178,101,203,248,134, 13, 27, 50, 10, -133, 2, 70,163, 17,107,214,172, 49,213,169, 83, 71,200, 48, 12,178,179,179,193, 48,204,109, 59, 51,120,149, 16,210,229,187,246, -125,119, 52,121,123,164,123,237,246,175,184,182, 11,244,135,169, 17, 69, 98,220, 67,220, 57,114, 48,243,198,129,165, 25,208,165, -244,165,148,222,116,180, 0,253,252,252, 62, 59,120,240,160,215, 59,239,188, 67,117, 58, 29,121,252,248, 49, 93,176, 96,129,215, -152, 49, 99, 62, 3,240, 70, 69,251, 83, 86, 86, 22, 8, 33,124, 81,163,181,172,250,137, 3, 21,123,157, 16,242, 91,159, 62,125, -122,117,236,216, 17,209,209,209,214, 45, 66, 91,162,101, 57,125,184,112,225,194, 44, 0,211,203,195, 21, 10,133, 88,182, 97, 27, -178, 50,211,225,237,237, 7,169, 76, 86, 97,143,203, 98,134,153,245,197,220, 79,189,210,111,157, 37,215,207, 28,229,183, 94, 77, - 73, 53,115,180,100,143,255,185,137,180,136,253,151,189,154, 97,216, 89, 95, 44,152,227, 98,217,214,252,249,114, 82, 14,225,232, - 59,207,213, 75,254, 45,152,127,179,248,249,249, 33, 49, 49,145,248,249,249, 81,203,182, 94,105, 68,235,153, 6,254,100,187,140, -148,181,109, 88, 81,252, 7, 15, 30, 44,104,212,168,209,135,119,239,222,221, 90,187,118,237,241, 0,170,232,245,250,172, 25, 51, -102,252,111,205,154, 53,163,236,209,100, 1,192, 47,191,252,178,116,228,200,145,251,123,244,232,241, 17,207,243,245,109, 38,145, - 7, 94, 94, 94,214, 45,220,180,148,228,105,227, 70, 13,154,150,151,151,105,183,159, 59,165, 82, 57,118,198,140, 25,210,252,252, -124,124,251,237,183,124,157, 58,117, 24,203,162,104,211,166, 77,230,208,208, 80, 65,255,137, 19,211,151, 36, 39, 99,222,137, 19, -249,211,234,214,109,184,246,206,157,198, 37,105,220, 45, 11,199,146, 52, 89, 22,179,139, 10, 78, 14,137,132,144, 49,191, 46,120, -248, 3,128,174,175, 12,240,193,111,139, 30, 34, 51,214,240, 63,152,113,223,158,176, 64, 37, 96,198, 19, 66,186,164,164,164,252, -246,233,167,159,186, 52,110,220, 24,117,235,214, 21, 42,149,202,102, 22,119, 49,217,217,217, 56,124,248, 48, 86,172, 88, 97,184, -113,227, 70, 31, 74,105,169,219, 85, 28,199,165,134,134,134, 90,202,129, 18, 66, 50,114,244,196,101, 75,173,102,202, 17,227,182, -146,147, 23, 78, 35,209,200, 67,111,226, 81,173,122, 4,218,117, 93,130,223,247, 93,227, 18, 99,111,222, 52, 21,102,174,254,151, -207,223, 47,196,221,194, 11,112, 11, 81,105,218, 44,219,215,255,138,148,216, 67,121,150, 57,181, 98,229,247,175,253,242,211,207, - 62, 44,203,248,220,143,137,185,208,179,111,191,132, 67,135, 14,185,137, 92, 92,154, 2,224, 13,227,199,159, 49,234, 11,181,187, -127,251, 45,168, 90,181,170, 13,138,130, 74, 83,158,101, 78,149,245,131,121,121,121,249, 39, 78,156, 40,152, 62,125, 58,137,139, -139,219,236,237,237, 61,112,223,190,125,202,190,125,251, 22, 70, 71, 71,111,247,241,241,233,213,190,125,123,213,135, 31,126,168, -207,203,203, 91,238, 64,231,190, 73, 8,169,117,254,211,197,111,158, 95,244,253,171, 16,176, 45,161, 23, 2,188,233, 20,140,185, -135, 0,108,166,148,154, 43, 82, 72, 10,133,162,129, 92, 46,199,149, 43, 87, 50,155, 53,107,102,208,233,116,162,249,243,231,187, - 43, 20,138, 6,207, 49,192,209,204,204, 76,240, 60, 47, 0, 64,138, 94,193, 59,126, 22,255,141,158, 61,123,254,182,101,203,150, -206,145,145,145, 8, 14, 14,134,201,100, 66,104,104, 40, 12, 6, 3, 66, 66, 66,160,215,235, 49,123,246,108,100,103,103, 79, 46, - 43, 88, 49, 33, 4,102,179,217,106,108,235, 31, 16,244,196, 79,207,115,184,177, 80, 8,153,224,219,187,215, 34, 53, 35,157,223, -242,103, 74, 74,129,145,235,114, 55, 53,255, 70,241,207, 21,112,200,111, 63,226,221, 4, 0,208,243, 40, 51,226,188, 66,140,224, - 59,123,126, 64, 74,106, 58,126,185,156,148,149,111,228,187,222, 46, 1,211,161,116,254, 75, 48, 35,102, 71,163,223,187,246,127, -246,242,184,138,255,150,189,132,170, 52,185,156, 68, 9,191,162, 22,197,202,181, 37,250,200,122, 30,252, 34, 77,213,111, 69,237, - 54,110,208,160, 65,211, 30, 62,124, 56,183,200, 95,214, 74, 71,176,214,174, 93,123, 23,192,200,178, 62,243,243,226,145, 59, 1, -236,116, 4, 55, 55, 55, 87,119,233,210, 37,221,135, 31,126, 72,226,226,226,246,249,248,248,116,222,191,127,191,188,111,223,190, -250,235,215,175, 31,241,243,243,107,211,169, 83, 39,229,222,115,231, 18, 10,238,223,223,189,251,225,195, 0, 19,207,239, 46,171, -127, 86, 38,201, 42, 78,182,118,206,123,248,197,111, 95, 60,236,196,235,177,221,144,137, 51, 0,226,159, 3,243, 56, 33,164,246, -144, 33, 67,182,116,239,222,253,149,218,181,107,163, 74,149, 42,184,115,231, 14,210,210,210,112,245,234, 85,236,218,181,107,151, - 78,167, 43, 55,160,118, 70, 70,198, 51,225,137,136,204,221,111,253,183,179,118, 93, 56,217, 52,180,117,228,112, 89, 93, 63, 30, - 6, 35, 69,220,163,251,152, 61,115,117, 65,210,163,187, 55,141,102, 99,159,255,128, 15,173,227, 49, 49, 49, 17, 44,203, 86,170, -187,133,138,186,133,112, 74, 37, 18,173,152,152,184,155,193,193,129, 31,239,216,190,173, 37,165, 12, 75, 9,201,215,104, 92,119, - 61,126,252, 56,203,246,115, 53,220,220, 84, 35,199,140, 28, 72,120, 34, 36,132,231,120,150, 57, 21, 19, 19, 87,166,198,200, 96, - 48,140, 27, 56,112,224, 50,185, 92, 62, 67,171,213, 94,209,104, 52,127, 54,104,208, 96, 46,165,116,102, 97, 97,225,111, 42,149, -234,220, 43,175,188, 50, 63, 40, 40,104, 41,165,244,162,131,157,219,140, 39,246, 97, 27, 42, 89,149, 59,135, 82,234, 34, 16, 8, -178,175, 93,187,246, 83, 88, 88,216, 32, 74,169, 11, 33, 36,187,162,152, 58,157,238,157,172,172, 44,143,177, 99,199,154, 86,173, - 90, 21, 54,124,248,240,105, 55,110,220, 16,234,116,186, 24, 7,243,172, 39,132,244, 26, 48, 96,192,106,161, 80,216,145, 97, 24, -194,243, 60,181,121, 14, 74, 41, 56,142,251,189,188,114,225, 56, 46,161, 86,173, 90, 79,173,160, 75,178,207, 53,153, 76, 9,118, - 79, 54, 6,110,210,247, 71,111, 44,212,153, 40, 53,243,116,220,237,148,252, 18,143,156,157,191, 77,235,216,141,169,227, 39, 45, - 59,112,115,161,222,196,243,102,158,142, 47, 13,211,161, 73,241, 95,130, 9, 0,211, 52,155,118, 98,229, 38,171, 97,188,101, 59, -177,248,125,101,138, 69,235, 4, 7, 61, 54, 51,227,159, 24,203,151, 71,248, 42,138, 95,156,116, 57, 42,253,250,245,123, 97,246, - 40, 70,163,241,147,158, 61,123,206,213,104, 52,255, 75, 75, 75,187,162,209,104,110,134,135,135, 79,226,121,126,105, 65, 65,193, - 46,149, 74,213,163, 73,147, 38,147,171, 86,173,186, 62,150,210,245,229,245, 77,139, 86, 7, 0,181,244, 75, 11,145,176, 37, 20, - 38,147, 41,190, 2,101,152, 72, 8,249, 0, 64, 53, 60,113,192,123,143, 82,250, 92,101, 67, 41, 77, 4,208,146, 16, 82, 29, 64, - 71, 60,241,223,151, 5,224, 1,128,139,148,210,171, 21,198, 46,204, 72, 36,132, 52,186,117,249,196,248, 59, 55, 47,191,105, 57, - 93,200,178,226,235,156,177, 96,131,169, 48,115,245,127,196, 81,233,172,144,144, 16, 23, 0,245, 1,164,224, 47, 71,198,177, 0, -190,174,140,133,138,141,116,112, 82,162,231,226, 9, 99,109,183, 11,159,122,246, 34,219, 34, 33,164, 83,101,199, 67,114, 98, 58, - 49,157,152, 78, 76, 39,166, 19,211,137,249,223,195,252,183, 19,173, 18, 8,237,170, 82, 53, 90, 78,113,138, 83,156,226, 20,167, - 56,197, 41, 78,177, 95, 74,213,104, 1,232, 84,202, 23,236,102,170, 21, 57,125, 80, 30,190, 19,211,137,233,196,116, 98, 58, 49, -157,152, 78,204,255, 30,230,255, 55,113,110, 29, 58, 49,157,152, 78, 76, 39,166, 19,211,137,233,196,252,199, 49,255,213,100,202, -185,117,232, 20,167, 56,197, 41, 78,113,138, 83,156,242, 98,196, 66,170, 74, 50,138,119, 18, 45,199, 89, 43, 3,224, 45, 0,253, - 0,212, 0,112, 31,192, 54, 0,223, 57, 16,166,194, 22, 79, 13, 96, 26,128,150,120, 18,189,254, 1,128, 19, 0, 62,167,148,230, - 57, 75,188,100,241,244,244,252, 88, 40, 20,106,128, 39,161, 77, 44,175,182,255,115, 28,151,149,157,157,189,224, 5,181, 3,214, -222, 83, 89,150,180,218,166,205,246,213,100, 50,189,176,116, 58,229,165, 29, 71, 66,221,220,220,126,212,106,181,131, 41,165,119, -156, 37,226,148,255,146,120,121,121,141, 55, 26,141, 51, 68, 34,209,252,212,212,212,239,255, 31,245,235, 18, 79, 30, 90,137,214, -158, 61,123,162, 0, 32, 50, 50,178, 45, 0,168, 84,170,211, 12,195, 84, 47,250, 50,128,191, 98,225, 21, 63,250,111,121,229,121, -254, 65, 70, 70, 70,169, 14,212,228,114,249,105,150,101,171, 19, 66,192, 48,140,245, 50,153, 76, 42,150,101,115, 75,193,140,215, -106,181,141, 95,146, 66, 36, 0,118,187,186,186,234,230,206,157,251, 93,187,118,237, 2, 19, 19, 19,205, 83,167, 78,109,243,231, -159,127, 70, 18, 66, 94,115,132,108, 17, 66, 90, 16, 66,214, 55,108,216,112,231,176, 97,195,182, 52,107,214, 76,156,145,145,161, -218,182,109,155,255,134, 13, 27, 46, 17, 66, 6, 59,234,226,226, 95,208, 16, 5,165,249, 51, 43,235, 89,113, 17, 10,133,154,248, -248,120, 85,209, 74,194, 66,172, 96, 50,153, 96, 50,153,144,159,159,143, 6, 13, 26, 84,122,250,125,125,125, 35, 8, 33,203, 67, - 66, 66, 26,251,249,249, 93, 0, 48, 49, 49, 49,241, 79, 71,210,106, 54,155, 65, 41,181,166,179,118,237,218,206,145,217,177, 54, - 52, 90, 44, 22,119, 13, 9, 9,105,170,215,235, 51, 31, 60,120,112,158,227,184, 79,203,114,122,233, 32,190, 11,128, 79, 37, 18, - 73,179, 26, 53,106, 4,222,189,123, 55,206,104, 52,158, 3, 48,135, 82,154, 93, 25, 36,171,109,219,182, 39,191,253,246, 91,247, - 9, 19, 38,156, 36,132,180,114,146, 45,167,252, 83, 82,165, 74, 21, 77,126,126,254,106, 0, 17, 66,161,208, 71, 42,149, 66, 38, -147, 37, 75, 36,146, 43, 50,153,108,212,201,147, 39,179, 28,197,228, 56,238,211,216,216, 88,159,230,205,155, 47,170, 91,183,238, -236,244,244,116,157,209,104, 60,146,153,153, 57,153, 82,154, 83,214,119,139,115,145,127, 19,201,178,125, 45, 26,239,255,218, 58, - 44,138, 43,212,238, 41, 6, 38, 16, 4,196,198,198,122,169, 84, 42,112, 28,103,213, 22, 88, 38, 53, 91,219,174, 34, 63, 77, 8, - 15, 15, 55,150, 51,225, 4,198,199,199,123, 41,149, 74,235,123, 70,163, 17, 62, 62, 62,124, 66, 66,130,151, 84, 42,125,234,243, - 6,131, 1, 1, 1, 1, 47,147, 47,148,183,220,220,220,178, 31, 63,142,107,160,211, 27,231,140,121,103,250,199,131,251,189,234, -122,250,244,105,254,181,215, 94,211, 71, 69, 69,189, 5, 96,185,157,149,226, 66, 8,217, 48,117,234,212,217, 82,185,218,253,232, -233,155,250, 13,219,246, 36, 52, 12,173, 70, 38, 79,158,204,190,251,238,187,199, 35, 34, 34,126, 36,132, 52,114, 68,179,165, 82, -169,246, 75, 36,146,170, 44,203,194,104, 52, 62,214,106,181,157, 95,162,134,216, 16,192,101, 66, 72, 4,165,244,138,189,207,202, -146,140,140, 12, 20, 22, 22, 62,115,213,174, 93, 27,149,109,127, 72, 8, 17, 4, 6, 6,254,182,112,225, 66,255,228,164, 36,124, -181,100, 73,115, 0,223, 1,104,110,207,247, 83, 83, 83,159, 73,103,120,120, 56,156,226, 80, 29, 76,155, 61,123,246,194, 55,223, -124, 19, 28,199,161,176,176,208,239,222,189,123,117,102,204,152,209,135, 16,210,148, 82, 26,243,156,248,158, 33, 33, 33,209,147, - 38, 77,114,107,218,180, 41,138,162, 84,248,157, 56,113,162,249,154, 53,107,134, 18, 66,194, 41,165,105,207,243, 27,110,110,110, - 63,254,240,195, 15,238,114,185, 28,191,255,254,187,123,199,142, 29, 79, 16, 66, 90, 87,148,108, 17, 66, 24,119,119,247,119, 1, -116,224,121, 94, 12,224, 92,102,102,230, 60, 71,189,186, 19, 66,124,149, 74,229,118,134, 97,170, 21, 91, 96,123, 16, 66,210, 45, -239, 17, 66,188,120,158, 63, 83,214,162,218, 41,255, 14,241,240,240, 24,157,155,155,251,173, 68, 34, 17,185,186,186, 66, 46,151, - 67, 32, 16, 64, 32, 16, 84,145, 72, 36, 85, 36, 18, 73,183, 14, 29, 58, 76, 60,122,244,104,153, 30,246, 95,137,240, 25, 1,134, -204, 97, 9,195, 2, 64,237, 16,119,181,139,139, 11,230,204,153,163,232,213,171,151, 2, 0, 78,158, 60, 57,108,248,240,225, 29, - 9, 33,117, 75, 35, 91, 37,113,145,127,139,148,118,226,240, 41,141, 86,100,100,100, 84,177, 78, 7,153, 76,134, 45, 91,182,128, -101,217,167,162,198,151,244,127,149, 42, 85,202, 77,136, 69, 35,182,107,215, 46,168,213,106,184,184,184, 88, 39, 26,137, 68,130, - 35, 71,142, 64, 40, 20, 66, 32, 16, 64, 40, 20,162,113,227,198, 40, 35,160,253, 11,145,254,117, 8, 5,128,173,111, 63, 73, 87, -255,229, 79,156, 64,110,125, 59, 28,173,107,200,208,239,221, 89, 3, 11,116,198, 38, 0,242,179, 50, 51, 51, 47,236,216,145,216, - 48, 52, 84,244,227,143, 63, 54,245,247,247,239,103, 47,209, 2, 48,173, 81,163, 70,219, 89,153,139,199,176,225, 35,134,141, 18, - 48,198,161,227, 62,156, 31,151,148,158, 63,118,236,216, 29,191,255,254,251,176, 47,190,248,226,214,148, 41, 83,166, 1,248,196, -222,244,139,197,226,170,247,238,221, 11,225,121, 30,245,234,213,123,105,194, 24, 88,136, 20,165, 20,132,144,167, 8, 85, 89,207, -202, 19,139, 6,171,164,171,178,197,223,223, 63,124,200,144, 33, 30,218,244,116,124,181,100,137,229,237,198,229,109, 35, 90,182, - 8, 13, 6, 3, 94,127,253,245, 33, 28,199, 9, 44, 36, 80,175,215, 27,178,179,179,117, 54, 39,123,210, 40,165,175,218, 81,158, -213, 21, 10,197,255, 0, 68, 20, 22, 22,250, 3,128, 66,161, 72,224,121,126,103,126,126,254, 39,150, 0,190, 21,168,167, 64, 0, -117, 80,122, 40, 40,186,112,225,194,187,211,166, 77,139,249,187, 49, 9, 33, 85,189,189,189, 23,244,239,223, 31,123,246,236,193, -222,189,123, 77, 50,153, 76, 48,124,248,112, 50,113,226, 68,215, 73,147, 38,117,195,115, 56,113, 44,146,110,179,103,207,118,171, - 85,171, 22,182,109,219,134,171, 87,175, 22,134,132,132,200,218,181,107, 7,129, 64,224,246,241,199, 31,191, 6, 96,253,243,252, -128, 86,171,157,247,225,135, 31,110,248,233,167,159, 84, 15, 30, 60,192,242,229,203, 61, 6, 14, 28, 24, 69, 8,105,107, 47,217, - 34,132, 72, 0,188, 11,160, 61,203,178,173,135, 15, 31,110,126,231,157,119,132, 12,195,152,150, 44, 89,226,185,102,205,154,129, - 30, 30, 30, 17,233,233,233,121,118, 96, 49, 0,230,140, 26, 53,106,228, 31,127,252,225,122,254,252,121,177,187,187,187,117,129, - 93,244,234,101,105,179,102,179, 25,225,225,225, 1,255, 5,162,193,178,172,145,231,121, 33, 0, 41,165, 84, 95,222,253,127,137, -100,185,187,187, 79,200,204,204,252,206,199,199, 7,222,222,222,207,204,181,122,189, 30, 82,169, 84,228,227,227,243, 67,239,222, -189,133,191,254,250,107,169, 91,128,132, 37,159,254,254,243, 92,127, 55, 87, 21, 0, 96,233,138, 3, 5, 0,240,235,175,191, 34, - 49, 49, 17,174,174,174,168, 91,183, 46, 59,119,238, 92,223,201,147, 39,127, 5, 96, 84,105, 88,197,185,200,191, 73,163,101, 75, -182,108,239,203,180,209,226,121,222, 26,176,212, 66,168, 44, 36,168,248,255,182, 43, 32, 27,134,119,184, 88, 66, 72, 94, 94,158, -149,100,169,213,106, 20, 77,174, 48,153, 76,207,224,114, 28, 7, 66, 8, 45, 11,179,148, 12, 79, 0,112,132, 82,122,223, 78, 38, -106,197,220,250,118, 56, 54, 72,166, 14,178,184, 80,239,246,225,147,215, 13, 0, 78, 63, 28,181,252,219,182,109,253,223,157,185, -108, 86, 97, 70, 98,250,199, 67,122, 84, 13,241,113,151, 41,178, 82,179,221,194,194,186,224,137, 71,101,123,211,217,102,216,176, - 97, 27, 15,158,141, 37, 82,169, 72, 36, 96, 89, 97,171,122,161,238,129, 46,172,139, 10,112,137,139,185,123,122,196,136, 17,245, -166, 76,153,210,218,145,188, 51, 12, 3,181, 90,141,141, 27, 55,130,177, 35,118,206,139, 56, 53, 82, 66,189, 11, 44, 68, 74,171, -213, 98,207,158, 61,136,140,140,188, 76, 8,137, 40,250,200,101, 74, 41,114,114,114,144,148,148, 4, 95, 95,223,203,132, 16,161, -237, 54, 98,113, 76,139, 86,213, 66,170,134, 15, 31, 62,196,108, 54, 11,108, 6,137,226, 4,230, 25, 18, 99,111,222,253,252,252, - 14, 2,120,149,101, 89, 24,116, 58,195,255,190,252,210,246,241, 69, 91,146, 85, 26,166, 37,173, 28,199, 9, 46, 95,190, 44,180, -244, 25, 0, 66, 0, 10, 0, 30,148, 82, 48, 12,115,205,142,242, 12,151,203,229,167,119,237,218,165,110,220,184, 49, 17,139,197, - 48,155,205,184,126,253,122,224, 23, 95,124, 49,238,240,225,195,175, 17, 66,106, 23, 15,158,110,103,189,215, 57,113,226, 68,126, -112,112,112,137,196, 49, 39, 39, 71, 16, 26, 26,218, 22, 64,204, 63,128, 25,159,146,146,210,251,213, 87, 95, 29,159,156,156, 28, -109, 54,155, 63, 2, 80,215,195,195,227,114,223,190,125, 33,147,201,218,219, 67,180,202,170,119, 47, 47,175, 94,175,188,242, 10, -150, 47, 95,142, 47,190,248,162, 19,165,244, 8, 33,164, 99, 78, 78,206,225,158, 61,123, 66,163,209,244, 46,137,104,217,219,150, - 8, 33,161,109,218,180,249, 97,206,156, 57,170, 61,123,246, 32, 36, 36, 4,185,185,185,248,224,131, 15,188, 62,251,236,179, 99, -132,144,118, 22,178, 85, 26, 38, 33,164,182, 68, 34, 89,255,211, 79, 63, 41,131,131,131,131, 69, 34, 17, 19, 28, 28, 12,173, 86, - 11,157, 78, 39,153, 63,127,126, 61,153, 76,246,231,215, 95,127,189, 30, 64,223,114,218, 18, 3, 96,222,202,149, 43,199,143, 29, - 59, 86, 51,100,200, 16,206, 96, 48, 60,181,192,150,203,229, 79, 45,174,195,194,194,236,206,123, 81,244, 12, 53, 0,141, 35,219, -174,101,228, 61, 27,128,196,218,121,132, 66, 72,165, 82, 72,165, 82, 72, 36, 18,220,190,125,123,166, 84, 42, 93, 98, 59, 22,151, -133, 73,254,154,180, 26, 16, 66,206,179, 44, 91,230,125,113,211,144,191, 99,252, 44, 33,205, 1,132,144,165, 0,218, 63, 25,242, -153, 40, 15, 15,143,247,146,147,147, 31,217,139,233,231,231,231,158,151,151,247,181,175,175, 47,188,189,189,173,115,135,191,191, - 63, 76, 38, 19, 82, 82, 82, 64, 41, 69, 86, 86, 22,228,114, 57,252,252,252,190, 30, 55,110,220,182,149, 43, 87,102,148,136,201, -227,139,158, 3,103,124,202,178, 44, 3, 0,172, 64,169,156, 52, 29,168, 90,181, 42, 90,181,106, 5,157, 78,135,236,236,108,212, -169, 83, 71, 64, 8, 25,198, 48,140,154, 82,250, 61,165,244,232,127, 80,235, 94,170, 49,252,236,226,251,162,132, 16,240, 60, 15, -129, 64,240, 20,209, 42,126, 89, 72, 81, 81,123, 37,229,173,156, 12, 6,131,149,100,185,184,184, 88, 73,154,217,108, 46,141,104, - 85,132,169,215,231,121,190, 58, 33,100,165,189,100,171,184, 12, 27, 54,236, 25,123,143,201,147, 39,199,167,166,166,210,215,187, - 52, 80, 68,239, 75, 76,170,225,170,148,121,170, 84,213,164,174,110,154,140,140,140, 51, 0, 52, 14,252, 68,205, 70,141, 26,201, - 54,236, 56, 17, 63,230,253,133,115, 27, 7,187,171,235, 7,120,184,250,184,200,196, 74,134,228, 75,205,166,120, 55, 55,183,144, - 10,172,208, 0, 0, 26,141, 6, 2,129,224,165,208,104, 81, 74,205,132,144, 8, 66,200,229, 61,123,246,160, 89,179,102, 86,178, -101, 33, 33,217,217,217,184,126,253, 58,218,180,105, 3, 0, 17,246,216,106,241, 60, 15,163,209, 8,163,209,104, 37, 48, 34,145, -232, 25, 2, 99,249, 44,203,178,215, 42,152,133,185,174,174,174,109,218,183,111, 47,254,121,203, 22, 49,165, 52, 31, 79, 2, 95, -231, 81, 90, 74,128,236, 98, 98, 54,155,173, 90, 54,161, 80,136,199,143, 31, 91, 39, 46,139,102,184,248,214,121,105, 34,145, 72, - 62,252,229,151, 95,212, 77,155, 54, 37, 25, 25, 25,224,121,222, 58, 72,126,247,221,119,210,126,253,250,249, 95,186,116,233, 99, - 84, 32,156, 13, 0, 82, 26, 33, 2, 0,181, 90,109, 6,192, 84, 6,166,217,108, 38, 45, 91,182,156,146,158,158, 94,175,176,176, -112,190, 61,237, 8,192,239, 69,151,101, 76,249, 51, 58, 58,186,112,192,128, 1,178,106,213,170, 53,123,222,182, 26, 26, 26,218, - 66, 40, 20,226,220,185,115,122, 0,150,149,117,212,213,171, 87,245,125,251,246,149, 4, 6, 6,182,112, 96,192, 13, 13, 15, 15, - 63,228,229,229, 37,179,104,131,250,247,239, 47, 92,181,106,149, 42, 33, 33, 1, 70,163, 17,211,166, 77, 67,247,238,221,225,225, -225,129,201,147, 39,123, 47, 90,180,232, 71, 0,141,202,192,148,138,197,226,141,247,238,221, 11,241,245,245,149,157, 61,123, 22, -245,235,215, 71,122,122, 58,146,147,147,145,151,151,135,228,228,100,140, 26, 53,202,235,171,175,190,242,179, 67,147,101, 37, 89, -171, 86,173,202,218,190,125, 59,187,122,245,106,149,237, 2,187,248,226,186,164, 69,181, 29,146, 37, 18,137, 32,151,203, 53, 89, - 89, 89,217,207, 81, 69, 18, 0, 98, 91,146, 37,145, 72, 32,145, 72, 32,149, 74,159, 43, 46,235,191,100, 18,247, 39,132,220, 20, -137, 68, 18,185, 92, 46, 98, 24, 6, 18,137,164,139,155,155,219,141,206,157, 59,215, 61,120,240, 96,172, 61, 56, 58,157,110,163, - 68, 34, 17,122,121,121, 1, 0, 66, 66, 66, 80,191,126,125,228,231,231,243,217,217,217,208,104, 52,204,163, 71,143, 80, 88, 88, -136,164,164, 36, 4, 5, 5, 9, 25,134,217, 8,224,181,146,240, 78, 93, 74, 90, 1, 96,133,229,222,211,211, 51, 5,128,204,114, - 47,149, 74,225,239,239,143,132,132, 4,168, 84, 42,246,179,207, 62,235,187,101,203,150, 62,132,144, 97,148,210, 77, 54, 80,179, -255,173, 54, 90, 22,146,101,251,250, 20,209,138,140,140,156,181,103,207,158,182, 37, 77,100, 69,251,181,165,106,178, 44,151, 61, - 29,143, 16, 2,142,227,224,237,237, 13,185, 92, 14,185, 92,110,217,243, 7,199,113,207,224, 23,173,240, 29,206,172, 66,161,192, -155,111,190, 73,191,255,254,251,241, 69,100,235,158,189,223,237,191, 60,218,170,197, 42, 46,181,107,215, 62,253,241,199, 31,247, -250,227,143, 63, 18, 26, 7, 87, 19, 40, 18, 31,229, 73,213, 26, 13, 2,170, 68, 14,239,221,247, 42,158,156, 62,180, 87,238,229, -230,230,202,106, 4,200, 13, 12,163, 35, 85, 36, 2,149,175, 66, 36,241,113,117,245, 23, 25,244,169,106, 87, 87,177, 94,175,207, - 2,144, 89, 22,136, 90,173, 62, 32,145, 72,130, 88,150, 5,203,178,240,240,240,112,161,148, 66,163,209, 32, 32, 32, 64, 25, 22, - 22,118, 71, 32, 16,128, 97, 24,228,229,229, 61,122,248,240, 97,151,242, 18,230,234,234,122, 64, 34,145, 4, 49, 12, 3, 66, 8, - 88,150,181, 30, 92,176,252,207,178, 44, 8, 33, 40, 40, 40,176, 11,147, 82,122,133, 16, 18, 17, 25, 25,105, 37, 91,251,246,237, - 67,215,174, 93,145,149,149,133, 27, 55,110,216,146, 44,187,182, 13,109,141,223, 41,165, 16,137, 68,184,125,251,246, 83, 91,218, -150, 75,165, 82, 85,184,243,184,185,185,157,236,223,191, 63,126,248,225, 7, 74, 41, 37, 0, 20,132,144,250, 46, 46, 46,183,111, -222,188,105,151, 29, 12,165, 20, 70,227, 95, 31,181,180,113,219,254,229, 0,153,238,210,168, 81, 35,146,157,157,109, 33,144,214, - 5, 17,203,178,248,246,219,111,101, 77,155, 54,157, 33,149, 74,167,136, 68,162, 28,147,201,244,179, 78,167,155, 79, 41,205,122, -153, 6,165,214,173, 91,191, 31, 23, 23,215, 61, 40, 40,104,215,115,144,120,218,164, 73, 19, 3, 0, 25,203,178,194, 74, 24, 40, -217,162,182,165,179,144,125, 74,169,185, 81,163, 70,186,162, 73,158,181, 23,203,195,195,227,199,189,123,247, 6, 4, 5, 5,193, -100, 50,193,108, 54, 35, 47, 47, 15, 81, 81, 81,208,235,245, 48,155,205, 8, 9, 9,193,167,159,126,170,123,239,189,247,164, 43, - 87,174, 76,205,203,203, 27, 92, 14,236,123,219,182,109, 83,248,250,250,202, 10, 11, 11, 17, 19, 19,131, 70,141, 26, 33, 55, 55, - 23,249,249,249, 40, 40, 40,128,209,104, 68, 78, 78,142,134,227, 56, 67, 57, 88, 51,109, 73,214,184,113,227,174,137,197,226, 70, -239,188,243, 14,226,227,227,173,125,126,204,152, 49,240,246,246, 46, 62,214, 59,196,180, 4, 2, 1, 36, 18, 9, 68, 34, 81, 86, - 80, 80, 16, 8, 33,210,216,216,216,138,108,197,169, 1,228, 8,133, 66,177, 45,193,146, 72, 36, 56,119,238,220,199, 98,177,184, - 68,109, 86, 89,237,199,145,251,151, 96, 34, 95, 42, 18,137, 36,110,110,110, 34,155,121, 90,164, 84, 42,225,229,229,181, 28, 64, - 55, 59,243,221,208,205,205,205, 58,190, 55,104,208, 0,113,113,113, 59,179,179,179,135,166,166,166,130, 97,152,141, 12,195,244, -177,240,128,204,204, 76, 4, 6, 6, 54, 44, 13,175,101, 35,223,241, 32,212,170,209,170, 93,211, 77, 89,108,158,130, 90,173,198, -195,135, 15,145,159,159, 79,239,222,189, 75, 38, 76,152, 64, 12, 6,195, 58, 66,200, 25, 74,233,131,178,184,200,191, 65, 42,100, -163,101, 41,224,210,136, 85,113,226,101, 15, 33, 50, 24, 12,202, 70,141, 26,241,150, 9,220,114, 1, 32,165, 17,173, 34,205,129, -195, 34, 20, 10, 85, 19, 38, 76,200,253,254,251,239,199, 17, 66, 86, 81, 74,239, 86,180, 0,119,109,255,201,251,139, 79,167,125, -234,230, 87,173,198,148, 41, 51, 5, 61,122,244, 56,187, 97,195, 6,206,173, 86,183,142, 71, 15,108,242,254,250,131,169,251,246, -238,221, 11, 60, 49,140,182, 87, 78,238,222,189,219,103,242,187, 19,241,233,135,239,237, 87,135,120,136,149,196, 77, 33,213,231, -167, 41, 65, 11, 37, 53,195,187,239,216,181, 43, 9,192,165,178, 64,100, 50, 89,208,221,187,119, 67,108,137,132,209,104,132, 70, -163,193,134, 13, 27, 60, 85, 42,149,167, 82,169,132, 64, 32, 64,253,250,245,237,213,152, 4,221,185,115, 39, 68,165, 82,161,160, -160, 0,122,189, 30, 38,147, 9, 60,207,131, 16, 2,161, 80, 8,177, 88, 12,133, 66,225,208,201, 62, 91,178,181,111,223, 62,212, -169, 83, 7,153,153,153,136,142,142,118,152,100,217,106,137,108,237,177, 4, 2, 1,126, 12, 14,198,152,196, 68, 43,129, 89,234, -226,130, 79,121,190, 66,117, 95,175, 94, 61,122,234,212, 41,236,223,191, 31, 61,123,246, 36,191,253,246,155,145,227, 56, 81, 66, - 66,130,221,218, 49,158,231,173,105,181,140,219,182, 4,203, 81,162,101, 54,155, 85, 98,177, 24, 58,157,206,186,181,111,123, 85, -175, 94, 29, 90,173, 86,144,147,147, 35, 72, 76, 76,148,207,155, 55,239,157, 99,199,142,249, 2, 24,244, 79, 14, 68,223,127,255, -125,208,152, 49, 99, 30, 11, 4, 2,218,181,107,215, 33,143, 30, 61,234,237,235,235,123,228,143, 63,254,248, 18, 64,168,163,120, -158,158,158, 23, 5, 2, 65,128, 82,169, 20,109,221,186,213,148,155,155, 43,242,242,242, 74,177, 16, 91, 75, 89,155, 76,166,248, -236,236,236,198,246,224,121,122,122,138,190,249,230, 27, 83, 70, 70,134,200,199,199, 39,197,130,163, 80, 40, 68, 91,183,110, 53, -229,228,228,136, 52, 26,205,197,172,172,172,114,241,210,211,211, 7, 15, 27, 54,236,196,145, 35, 71, 60, 88,150,197,163, 71,143, -144,145,145, 1,141, 70,131,141, 27, 55, 34, 40, 40, 8,219,182,109,211,106,181,218,209,255,251,223,255,102,228,229,229,217,227, -234,161, 77,179,102,205,130,178,178,178,160,209,104,144,159,159,143,139, 23, 47,162,118,237,218, 72, 76, 76, 4,195, 48,208,104, - 52,248,238,187,239, 10, 8, 33,218,114,198,142,222, 99,199,142,213, 0,192,216,177, 99, 53, 99,199,142, 45,113,130,107,209,162, - 5,150, 47, 95,238,208,162,186,184,150,221, 66,138,108,200,145,174, 69,139, 22, 56,118,236,216, 84, 71,200, 17,165,212, 32, 20, - 10,159, 34, 88, 54,255,155, 29,109, 67, 28,199,137,138,108, 68,137, 61,247, 47,129,180,149,201,100,162,226,111, 22, 20, 20,136, -124,125,125, 91, 59, 64,124,221,101,178, 39, 10,167,160,160, 32,100,103,103,115, 6,131, 97,224,198,141, 27, 77, 0,208,168, 81, -163,129, 28,199,233,204,102, 51, 43, 22,139,145,159,159, 15, 47, 47, 47,247, 82, 1, 25,124,244,251,207,243,124,138,219,104,249, -250,250, 34, 34, 34, 2,122,189, 30, 73, 73, 73,136,138,138, 50,113, 28,183,249,251,239,191,231, 61, 61, 61, 71,190,254,250,235, -236,165, 75,151,222, 6,240,126, 89, 92,228,223,162,205, 42,141,108, 89, 78, 29,182, 5,112, 12, 64, 59, 75, 38,109,183, 14,203, -210,100, 57,178,202, 97, 89, 54, 43, 62, 62, 94,161, 80, 40,172,239,153, 76, 38,248,249,249,241, 60,207,147,226,191, 83, 65, 21, -245, 83,100,107,250,244,233, 89,223,125,247,221, 80,216,105, 80,190,245,237,112,108, 40, 70,178, 86,124, 49,103,249, 55, 95,204, -115,187,191,127, 29, 86, 47, 91,204,113, 28, 46,213,171, 87,175,117, 94, 94,158,192, 69, 97, 66,122, 22,246,225,137, 31, 45,106, -103,133, 48, 0,214,158, 63,127,254, 82,183,110,221, 78,173,253,101,135, 91, 98, 76,204, 25, 73, 78,122,146,186,102,136, 64,228, - 31,212, 39, 87,167, 19, 13, 28, 56,208, 19,192,235,101, 97, 49, 12,131,152,152, 24,196,198,198, 66,169, 84, 66,165, 82, 65,169, - 84, 66,173, 86, 67,165, 82, 65,165, 82, 57, 92,134, 12,195,128,227, 56,108,223,190, 29,114,185, 28, 10,133,226,169,203, 66,178, -158,167,110,186,118,237, 10,173, 86, 11,165, 82,105,221,238,116, 68, 44, 54, 90, 6,131, 1, 6,131, 1, 70,163,145, 3, 32, 20, - 8, 4, 24, 21, 31,111,213,242, 56, 66, 96,138, 75,253,250,245,233,153, 51,103,112,234,212, 41,228,231,231,227,155,111,190,129, -175,175,111, 7, 0, 51, 29,197,178, 49,210,231,114,114,114,132, 57, 57, 57, 86,237,160, 80, 40,180,106, 15,236,157, 28, 4, 2, -129,117, 53,106,185,108,181, 90, 44,203,194,219,219, 27, 62, 62, 62, 88,177, 98,133,168, 90,181,106,221,255,201, 65,104,209,162, - 69, 53,151, 46, 93,186,102,195,134, 13,251, 6, 15, 30,188,229,250,245,235, 35, 92, 92, 92,174, 29, 61,122,116,158, 68, 34,225, - 43,216,191, 3, 18, 19, 19,189,108,223,226,121, 94,110, 54,155,173,196,182,160,160, 0,117,235,214,181, 27,239,230,205,155,114, - 0,152, 55,111,158, 16,128,220, 98, 12,110,193, 44, 40, 40, 16,214,174, 93,219, 46, 67,112, 74,233, 29, 66, 72,235, 78,157, 58, -157, 62,116,232,144,107, 80, 80, 16, 18, 18, 18,144,144,144,128,154, 53,107, 98,193,130, 5,249, 57, 57, 57, 45,139,200,213,111, -118,102,219,207,213,213, 85,248,248,241, 99,152,205,102, 52,108,216, 16,223,125,247, 29, 6, 14, 28,136,186,117,235, 34, 39, 39, - 7, 55,111,222,196,250,245,235, 93, 69, 34, 81,153, 99, 71, 97, 97,225,111,171, 86,173, 10, 44,174,209, 26, 50,100,136, 34, 37, - 37,197,218, 38,231,204,153,243,212,184,236,200, 46, 67,209,214, 86,169, 87, 69,196,108, 54,171,165, 82,105,142, 68, 34, 17, 91, -236,179,162,162,162, 28,214,102,217, 46, 0, 29,185,255, 39,197, 66, 90,139,139, 88, 44,134,143,143,143,221, 56, 18,137,132, 88, -198, 70,179,217,140,236,236,108,206,215,215,215,186,189,127,249,242,101,174,106,213,170, 28,203,178,172, 88, 44, 6, 33, 4,114, -185,188,212, 1,159,114,116, 78,143,129, 51,173,167, 14, 25,161, 66, 61,105,250,147, 69,255,229,203,151, 97, 52, 26, 17, 21, 21, -101,250,223,255,254,151,152,149,149, 53, 9,128,224,192,129, 3,195,166, 78,157,202,122,121,121, 89,237,104, 75,226, 34,255, 54, -178, 85,146,150,203, 50, 11, 29,139,140,140, 36, 69, 71, 43,137,133,224, 80, 74,159, 33, 87,165, 17,175,162,206, 71,202,235,116, - 44,203, 98,255,254,253, 86, 66, 96, 57,117, 72, 41, 69,101, 19, 45,119,119,247,252,102,205,154,169,227,226,226,126,170,168, 38, -107,197, 23,115,150, 47,156,251,153,155,246,214, 89,196, 39, 38, 65,155,106,186,116,242,218,195,157, 0,118, 2, 0, 86,214, 58, -134,113,183,190,181, 23,179,150,167,188, 65, 61, 63,213,206, 87,187,117, 15, 28, 48,246,125,230,173,183,222,106, 53,108,216,176, -236,193,131, 7,191,171, 84, 42, 67,141, 70, 99,230,142, 61,123, 98, 7, 12, 24, 80,141,227,184, 97,229,249, 28, 49,153, 76,143, -250,246,237,107, 45, 91, 31, 31, 31,245,207, 63,255,236,173, 82,169, 48,100,200,144,180,216,216, 88,235,118, 81,110,110,238, 35, -123,210,104, 52, 26, 31, 53,104,208,160,212,237, 66,139, 70,210, 17,204,162,186,180,158, 46,204,200,200,192,237,219,183, 33, 16, - 8,208,188,121,115,156, 60,121, 18,173, 90,181,114,232,196,161, 78,167, 67, 80, 80, 16,116, 58, 29,242,243,243, 11, 0, 72, 54, - 86,171, 6, 0,120, 59, 35, 3, 23,255,247, 63,156, 93,184,176, 66,237,168, 65,131, 6,244,220,185,115,184,118,237, 26,244,122, - 61, 70,143, 30,141,162,109, 67, 0,232,236, 64,158,131,125,124,124,186,118,235,214,205, 15, 0,242,243,243,201,249,243,231, 33, -149, 74, 65, 8, 65, 82, 82, 18,118,237,218,133,132,132, 4, 16, 66,224,234,234, 26, 64, 8,169, 70, 41,125, 88,198,196, 64, 30, - 62,124,136,207, 63,255, 28, 60,207, 99,234,212,169, 8, 9, 9,177, 18,172, 71,143, 30, 97,222,188,121,224, 56, 14,159,125,246, - 25,106,214,172, 9,147,201, 36,117,196, 79, 89,101,203,228,201,147,239,239,220,185,115, 95, 92, 92,220,107, 95,124,241, 69, 91, - 66, 8, 63,101,202,148,207,213,106, 53,247, 60,184,153,217,185,184,125,239,145,149, 8, 21,191, 60, 61,220, 28,198,187, 27, 19, -103,253, 62,199,217,226,113,112,119,115,117, 52,137, 5, 38,147, 41,191, 79,159, 62,154,237,219,183,147,154, 53,107,226,193,131, - 7,150,197,105, 65, 5, 92, 58, 36,104,181,218, 16,150,101, 69,247,238,221, 67,213,170, 85,209,172, 89, 51,204,159, 63, 31,233, -233,233, 48,155,205,240,242,242,226, 77, 38,211,101,131,193,112,188, 28,172, 57,227,198,141, 19, 1, 24, 95,164,217,170, 55,105, -210, 36,126,241,226,197,184,124,249,178,117, 60,182, 53,134,119,116,235,208, 86,235,100,123, 69, 69, 69, 77, 21,139,197, 20,192, - 57, 0, 14, 17,109, 74,169,161, 74,149, 42,197,177,205, 47,203,100,251, 34, 79, 50,250,250,250, 70,169, 84,170,238,153,153,153, - 79,105,181, 90,182,108,105,244,246,246, 62, 97, 47,142, 82,169,204,100, 89,214, 29, 0, 18, 18, 18,160, 80, 40, 68, 49, 49, 49, - 11, 9, 33,211, 0,160, 90,181,106, 11,181, 90,173,168, 90,209,120,234,227,227, 3,131,193, 80,170, 25,203,233,203,201,235, 0, -172,179,153,123,147,178,179,179,101,139, 23, 47,206, 91,184,112, 97, 33,199,113,122, 0, 71,179,178,178,172,126,180,170, 86,173, -154, 45, 20, 10,221, 52, 26,141,191, 13,212, 51, 92,228,191,176,125,104,235,176,148,150,240,165, 18, 53, 89, 37,145, 45,123,180, - 18,132, 16, 20, 22, 22, 62,165, 29,177,156, 58, 44,137,104, 21, 77,232, 21,218, 58, 44, 34, 89,178,159,127,254,121,243,178,101, -203, 78,217,251, 61, 91, 27,173,149, 95,206,253,194, 66,178,174,158, 58,132,223,162,179,211,167, 46, 92,178,180,162,149, 80,219, - 83, 81,223,199,219,227,216,255, 22,204, 81,223,223,191, 30, 91, 86,126, 69,175, 94,184,208,244,194,133, 11, 67, 39, 78,156, 88, -165,168, 97,105, 1,252, 9, 96,128, 61,167,116,210,210,210,158,178,143, 10, 9, 9,185,163,209,104,188,165, 82, 41, 98, 98, 98, -242,110,220,184,225,240,150, 76,113,204, 74, 98,250, 79,145,172, 27, 55,110,160,125,251,246, 0,128,147, 39, 79,162,101,203,150, - 14,145, 45,147,201,148, 85,171, 86, 45,171,118, 43, 59, 59,155, 7,128,177, 73, 73, 88,229,235, 11,129, 64,128,179, 11, 23,226, - 19,147, 9,243,133,142,153,238, 52,108,216,144, 94,184,112, 1,177,177,177, 48,155,205,232,213,171,151, 45,201,114, 36,207,117, -195,195,195, 15, 31, 61,122,212, 83,169, 84, 34, 63, 63, 31,121,121,121, 24, 62,124, 56, 6, 14, 28, 8,189, 94,143,173, 91,183, -226,247,223,127,135, 74,165, 66,126,126, 62,242,243,243, 93, 35, 35, 35, 79, 19, 66,218,148,102, 91, 72, 41,165, 93,186,116,193, -137, 19, 39,192,178, 44,154, 54,109,138,140, 12,235, 97, 32,120,123,123,151,244,140, 45,234,239,255,200,132, 36, 16, 8,104, 84, - 84,212, 23,109,219,182, 69, 92, 92,220,107,141, 26, 53,250,102,196,136, 17, 9,207,139,235,234,162, 66,131,218,193,208,235,245, -208,235,245,240,243,243, 67,110,110, 46,238,223,191, 15,189, 94, 15,111, 47,141,195,120, 17,117,107, 90,241,188,188,188,144,159, -159,143,135, 15, 31,194, 96, 48,192,195,195,213,145,250, 15,236,210,165,203, 31,155, 55,111,118, 95,191,126,189,161, 93,187,118, -226,111,190,249,134,168,213,106,164,166,166, 86, 52,203, 81, 39, 79,158, 12,234,212,169, 83,216,173, 91,183, 16, 21, 21, 5,131, -193,128,136,136, 8,220,189,123, 23, 45, 90,180, 64, 94, 94,222,185, 11, 23, 46,252,110,199,164,192, 19, 66,102,140, 27, 55, 14, - 22,178,117,226,196, 9, 36, 37, 37, 65,165, 82, 61, 67,180, 44,182,143, 98,177, 24, 0,252,236,212,156, 88, 79, 5, 22,105,158, - 62,209,104, 52, 70, 0, 75,159,167, 45, 62,126,252, 88, 82,191,126,125,189, 84, 42, 21, 23,145,182, 37,255, 84,219, 46,161,222, -159,235, 36, 99, 89,226,227,227, 51,201,195,195,163, 83,245,234,213,145,146,146, 34, 18,139,197,104,217,178,165,177, 73,147, 38, - 70, 31, 31,159,183,237,197,145, 72, 36,183, 68, 34, 81,155, 39,139, 9, 14,143, 31, 63, 6,165,116,106,221,186,117,223,203,205, -205, 69, 70, 70,134, 88,173, 86, 91, 23,213, 97, 97, 97,208,235,245,183, 28, 32,155,115,170, 86,173, 58, 67, 36, 18,205, 79, 75, - 75,251,190,132, 50, 18, 55,104,208, 64, 45, 18,137, 96, 52, 26,159, 34,155, 37,113,145,127, 51,201,122,138,104,217,176,200,226, -234,244,114,183, 13,237,181,209, 34,132,192, 96, 48, 64,161, 80, 88,183,164,108, 61,193,151, 68,180, 42, 34,129,129,129,104,214, -172,153,108,203,150, 45, 63, 46, 94,188,248,116, 69, 48,182,109,222,228,235,194, 23, 4, 38,158,219,139, 59,215, 46, 97,231,205, -172,244,169, 11,151,188,219,227,245, 65, 41,197,137,217,214,113,229,227,133,122, 41,234,250,123,187, 31,251,114,209, 66,181,246, -214, 89, 36, 37, 39, 99,239,185, 11,151, 12,148,222, 4, 48,181,178, 42,219,246,244, 90, 69, 73,234, 11, 24,120,172,238, 29,210, -211,211,113,243,230, 77, 11,201,138, 0,128, 86,173, 90, 93,182,144,173, 75,151, 46,161, 81,163, 70,207,184,119,120, 70,243,144, -153,185,160,216,111,116, 2,224, 97, 33,252, 2,129, 0, 45,103,204,112,152,100, 17, 66, 40,199,113,208,106,181,150,149, 98,133, - 72, 86,209,160,248,225,209,163, 71, 61,215,174, 93,155,179, 97,195,134, 12,158,231,133, 13, 26, 52, 8,104,220,184, 49,217,184, -113, 35, 0, 96,192,128, 1,152, 58,117, 42,110,220,184, 1,133, 66,129, 86,173, 90,113,179,102,205,242,154, 52,105,210,219,120, -226, 39,233, 25,225, 56, 78, 84,173, 90,181, 35, 0, 58,220,186,117, 11, 0, 78, 83, 74, 91, 90,158,151,245,204, 14,225,115,115, -115,133, 42,149,170, 68,215, 16,162, 39,199, 58, 29,221,234,179, 98,158, 58,117,234,243, 47,191,252,114,231, 7, 31,124,112,239, - 57, 49, 75,212,104,117,239,222, 29,133,122, 35,226, 83,178,193,113,102, 20, 26, 83, 29,198,179,213,104,117,239,222, 29, 5, 58, - 3, 30, 39,105, 97, 54,115,200, 45, 52,219,219,142,228,175,190,250,234,129,159,127,254,217,231,204,153, 51,224, 56,142,191,123, -247,238,195, 62,125,250,168,167, 76,153,226,110, 99,131,234,168, 44, 27, 52,104, 80,191, 83,167, 78,105,195,194,194,220,206,157, - 59,135,212,212, 84,152,205,102,116,232,208, 1, 98,177,248,241,194,133, 11, 69, 0,150,217, 57, 57, 88,200,150,241,194,133, 11, - 99,206,158, 61,235,230,230,230, 38,230,195,195,145,116,232, 16,182,111,223,254,204,119, 86,174, 92, 9, 0,118,121,225,183,104, -156,206,159, 63, 95, 41, 4,171,248,118, 89, 69,183, 31,255,173,114,238,220,185,132,137, 19, 39,214, 86,171,213, 75, 91,183,110, -221,222,221,221,157,113,117,117,141,242,247,247,127,175,126,253,250,143, 28,152, 39, 70, 40, 20,138,251,102,179,153,205,203,203, - 67,126,126, 62, 0,192,108, 54,139, 25,134, 65,181,106,213,172,202,147,166, 77,155,194,199,199,135,139,142,142, 30, 97, 47,126, -106,106,234, 83,167, 16, 75,144,113, 45, 91,182, 20,232,245,122,196,198,198,158,180,125, 80, 26, 23,121,217,165, 66, 65,165, 25, -134, 1,165, 20,210,198,141, 75,237,112, 37,116, 62, 82,124,242,179,245,181, 97, 57, 93, 56,102,204, 24,235,103, 46, 93,186,100, - 53,138,239,213,171,215, 83,152,231,207,159,127,134,108,217, 19, 49, 60, 53, 53,245,214,214,173, 91, 47, 44, 90,180,232,156,157, - 5,100,197,180,216,104,245,123,115, 72,210,242,207, 63,189,190, 97,215,209,186, 73,133, 52,105,234,194, 37, 31, 20, 39, 89,246, - 98,214,242, 81,214, 10,240,114,143, 90,188,104,161,139, 69, 59,246,243,229,228,108,152,233, 56, 7, 43,178,220,188,219,106, 22, - 9, 33,124,101, 96, 86,160,193, 61,133,105,235,222, 33, 41, 41,201, 74,178,108, 28,150, 70,180,106,213,234,114, 17,201,178, 60, - 51, 87, 36,157, 2,129, 0, 31,228,229, 65, 32, 16,160,221,236,217,232, 48,119,174,195,121,231, 56, 14, 2,129, 0, 33, 33, 33, - 14,147, 44, 91, 76, 66, 72,203,130,130, 2,172, 95,191, 62,247,222,189,123,193,213,171, 87,159,180,110,221,186, 37,114,185,252, -169,239, 20, 20, 20,160, 71,143, 30,248,254,251,239,209,165, 75, 23,211,136, 17, 35, 36, 12,195,116, 42, 43,157,177,177,177,227, - 58,118,236,184, 82,167,211, 9, 50, 50, 50,198,217,251,172,188,188,111,221,186,245, 94, 72, 72, 72, 91,148,238,194,129, 7,112, -230,121, 48,151, 46, 93, 10, 0, 97,207,131, 89,154, 70,235,151, 95,126, 1,207,243, 8,244,209, 64,175,215,163,120, 89,151,135, - 89, 92,163,181,101,203, 22,240, 60,143, 42,190,110, 48, 24, 12,176, 24, 16,151,135,233,238,238,254,213,134, 13, 27, 2,162,163, -163, 17, 31, 31,143, 37, 75,150, 60,202,202,202,234,150,149,149, 37,153, 53,107,214,177, 55,223,124,211,155,231,121,189,163,125, -147, 82,170, 39,132,140,120,229,149, 87, 54,206,155, 55,239, 65,120,120,120,149,150, 45, 91,106, 50, 50, 50,210,174, 92,185,242, -112,229,202,149, 74,179,217, 60,162,180, 45,169, 82, 48,121, 0,179, 8, 33,223,107, 52,154,157,177,177,177, 77,107,102,102,178, -126,132,160,105,211,166, 79,153, 14, 48, 12,131, 19, 39, 78,128,231,249,251,246,148,103, 66, 66,194,236, 34,109,170, 67, 4,203, -158,254,126,254,252,249,233, 69,216, 23,236,193,254, 59,198, 58,139,198,217,145,123, 71,211,249,237,183,223,198,163,152,127, 52, - 71,211,121,254,252,249,216, 78,157, 58,205,245,246,246,158, 37,149, 74,145,150,246, 36,216,129, 69,243,104,153,175, 27, 55,110, -140, 46, 93,186,224,206,157, 59,115,103,204,152, 17,251, 60,229, 89,180,224, 14, 6, 48,180, 99,199,142, 83,250,245,235,135,111, -191,253, 22,148,210, 53,255, 5, 18, 92,110, 80,233,200,200, 72, 98,251, 90,180, 53, 19,119,255,254,125, 95,219, 14,103, 27,163, -208,210,233, 44, 6,117,199,143, 31, 55,219,118,190, 82, 86,226,113,167, 78,157,242, 62,116,232,144,208, 82,161, 69, 70,157,124, - 98, 98, 34,115,236,216, 49,171,118, 76, 32, 16, 32, 42, 42,202,108, 52, 26, 31, 59,154,225, 59,119,238, 44,171,140,130, 59,126, - 35,246,189, 3,123,127,245,104,222,172,117,150,218,205,173,196,142,108,241, 32, 95,102, 3, 19, 48,243,191, 88, 48, 71, 99, 33, - 89,191, 92, 78,206,210,233,185,246,183,210, 10,174, 86,118,101,231,230,230,198, 90, 78, 23,230,229,229, 61,126,137, 26,225, 21, - 66, 72,132,175,175,239,101, 20, 59, 93,104,121,214,168, 81,163,103,158, 57,164, 54,225,121,184,184,184, 88, 7, 9, 71,237,178, - 8, 33,212,178,149, 93,148, 46,242,156,121, 62,117,253,250,245,170,195,135, 15, 87,133,132,132,196, 16, 66,132,163, 70,141, 50, -250,248,248,136, 78,158, 60,105, 2, 64,218,182,109, 43, 72, 78, 78,166, 9, 9, 9,218,158, 61,123,230,142, 25, 51,198,253,207, - 63,255, 20,243, 60,127,184, 28,236, 7, 0, 58, 58,250,172, 60,233,215,175, 95, 12, 74,112, 28,250, 60,242, 34, 48, 45,162,205, -202, 65, 76,108, 66,145, 7,115, 30,220,163, 20,171, 93,149,201,100,134, 54, 39,195, 97,141,214,253,135, 9, 69, 33,199, 56,112, - 92, 98, 17,222, 19,131,120,154, 89, 96,143,182,160,213,210,165, 75,187, 49, 12,195,156, 61,123, 86,191,104,209,162,184,180,180, -180, 94,148,210,199, 69,237,172,221,250,245,235,127,180,195,149, 67,105,117,127,147, 16,210,226,163,143, 62,122, 23, 64, 43, 0, - 85, 0, 60, 6,112, 18,192,178,138,122, 48,167,148,166, 18, 66, 58,119,235,214,237, 16,203,178,213,108,250,145, 7,128,116,155, -126,225,149,146,146,242,154,157,176, 75, 94,224,176,178, 4, 47,161,252, 91, 78, 50, 30, 62,124,120,118,239,222,189, 5, 65, 65, - 65, 31, 7, 5, 5, 49,153,153,153,200,203,203, 3,195, 48,240,241,241, 65,157, 58,117,224,227,227,195,223,186,117,107,193, 71, - 31,125, 84,174, 79,190,218,181,107, 7,155, 76,166, 26, 12,195, 4, 3, 8,166,148, 6, 19, 66,130, 1,184, 21,105,198,212, 85, -171, 86, 21, 52,111,222, 28,205,154, 53,195,177, 99,199,176,109,219,182,117,148,210, 3,182,218,172,226, 92,228,101,144,155,141, - 73, 91,194,227, 24,101,208,174,246, 69, 26,117, 43,130,208, 90,151,159,157, 31,202, 13, 42,253,204,128,147,153,217,165,132, 14, -103, 11,248,212, 43,207,243,177,229,117,190,204,204,204, 46,239,189,247,222, 33,150,101,171, 89, 52, 85,102,179, 89,175,213,106, -223,106,215,174,221,119, 66,161, 80, 98,139,203,243,252,163,148,148,148,191, 53, 86, 95,113, 63, 90, 93,186,245, 78,127, 94, 76, -165,136,169,113,103,207, 15, 72, 73, 77,199, 47,151,147, 51,115, 13, 92,187, 59,105,249,215, 95, 68,250, 99, 99, 99,187,190,196, -140,255, 74,105, 91,130,101, 61,179, 83,210,236,112, 72,154, 86, 78,250, 72, 17,217,170,148, 78,158,156,156,188,120,198,140, 25, -157, 23, 44, 88,224,185,111,223, 62,117,209,111,160,111,223,190,169,215,175, 95,111, 13, 64,162,211,233, 14, 47, 88,176,192,115, -206,156, 57,238, 0,220,139, 6,153,148,148,148,148,229,112, 74,153, 98, 50,153,226,235,212, 10,179,212,221, 83, 46, 29,108,255, - 55,155,205,241,142,224,149,132, 99,123,207,113, 92,124, 57, 90,229, 15,154, 53,107,198,126,240,193, 7, 41,251,246,237,179, 4, -210, 45,176,105,103,119, 80,134, 83, 82, 59,251,146, 30,192,162,162,171, 50,251,104, 62,128, 22,206,214,245,252, 99,157, 35,247, -255,148,252,250,235,175, 51, 7, 14, 28,184,222,205,205,109, 83,112,112,112,152,183,183,183, 90, 38,147, 65,175,215,231, 26, 12, -134,219,119,238,220, 25, 60, 99,198,140, 7,246, 96,173, 95,191,158, 5, 32,226,121, 94,202, 48,140, 2,128,154, 16,226,106, 33, - 90,132, 16, 24,141, 70,196,198,198,226,147, 79, 62,225,142, 28, 57,242, 63, 0,159, 57,144,220, 38, 0, 60,109,198,113, 79, 0, - 6, 60,113, 96,155, 86,164,217,124, 33, 66,120, 28,171,117,153,146, 91, 17,164, 84, 35,253,114,131, 74,255, 93, 29,174, 28,204, -160,151,165,147, 12,211, 47,250, 9, 43, 23, 61, 21,231,208, 66,194, 74,188, 47,103, 3, 48,187,208, 60,113,217,129, 27,139,245, -102,202, 27,205,252,200, 59,169,249, 55,255, 31, 15, 64,230,138, 60,179, 3,247,213, 74, 74, 31,169,196,188, 94, 39,132,188, 50, -113,226,196,153,114,185,188, 41, 0, 20, 20, 20,156, 77, 76, 76,156,107, 57, 85, 88,222,115,167,148,193,154,211,210, 26,191,140, -120, 6,131,225,189, 87, 94,121,229,107,142,227,190, 52,153, 76, 39,157, 53,229,148,151, 89,126,249,229,151, 7,150,121,185,127, -255,254, 44, 0,108,221,186,213,225,211,192,195,135, 15,231,138, 2,153,235, 0,228, 3,200,193, 19,135,219, 4, 0,242,243,243, - 51, 19, 19, 19,111,113, 28,119, 11,192,143, 21, 56,113,235, 73, 8,217, 77, 41,237, 94, 52,118,238,166,148,118,183,125,239, 69, -139, 13,217, 42,105,188, 47,223, 24,222, 41, 79,100,235,141,191, 38,218,226, 4,170,188,251,210,228,118,114, 94,212,243,174, 96, -157,242,175, 37,150, 49, 0,134, 85,244,185, 83,254,149,117,254, 24, 64, 47,103, 73, 56,229, 95, 55,255, 85,128, 96, 89,228,230, -205,155, 47,204, 68,224,159, 22,219,109,194,146,182, 12, 45, 82,146, 54,203, 73,180,156,226, 20,167, 56,197, 41, 78,113,138, 83, -202, 34,145, 69, 54, 90, 86, 18, 85,100,171, 85,156,100,217,146, 43,219,123, 2,160, 83, 41,171, 50, 71, 78, 19,116,170,192,170, -239,176, 19,211,137,233,196,116, 98, 58, 49,157,152, 78,204,255, 95,152, 21,148,200,114,182, 14,247,188, 40,162,101, 49,126,191, - 25, 65,102,213,190, 76,103,149,100, 12, 95, 22,209,122,202,216,179,178, 47, 0,157,156,152, 78, 76, 39,166, 19,211,137,233,196, -116, 98, 58, 49,159,243,106, 63,109,218,180,233,120, 18,255,152, 78,155, 54,109, 58,165, 52,242, 9,141,161,145, 47,242,183,111, - 52, 66,219,155, 13, 65, 45,215,141, 70,104, 91, 74,153,140,181, 92,182,239, 59,183, 14,157,226, 20,167, 56,197, 41, 78,113,202, -203, 46,167, 23, 46, 92, 88,176,112,225, 66,139,225,123, 26, 0, 82,164,205, 74,123,145, 63, 92,180, 77, 88,238, 65,169,114, 67, -240,252,221, 66, 8,241, 99, 4,162, 33, 66,145,164, 61, 40, 95, 7, 0,192,176, 55, 56,131,238, 15,179,217,184,137, 82,154, 88, - 81,236, 90,132,212,170,169,145,253,174,231, 56, 81, 92,174,161,223, 45, 74,207, 87, 4,167, 63, 33, 45, 37, 98,241, 65,137, 70, - 83,162,151, 66,125, 86, 86,161,222, 96,232,188,149,210, 83,206, 62,224, 20,167, 56,197, 41, 78,249, 55, 8, 33, 68,225,234,234, -122,132, 97,152, 32,155,247, 80,210,255, 0,192,113, 92,146, 86,171,237, 76, 41, 77,255, 59, 49,139,137, 1,192,249,151,161,252, - 28,221, 58, 20, 0, 79,197, 22, 42, 55, 98,118,184,175,178,117, 88,112,208,230,196,228,148,203, 57, 58,195,168,219, 9,185, 90, - 71, 19, 41, 16, 73,199,104, 60,124,230,191, 49,226, 61,247,144,208, 48, 18, 24,232, 15, 80,224,113, 92,188,247,253,123,119, 59, -110,217,176,108,178, 72, 42,253,196,168,211,253,224, 48,243, 36, 68, 17,164,148,156,252, 97,218,155, 26, 1,204, 24, 52,111,243, -254,218,132, 4,222,124,226, 90,194, 33,146,165,113,119, 63,176,240,240, 97,153,107,145, 3, 80, 27,214,250, 36,190,222,213,171, -178,143, 59,119, 62,208,159,144, 46, 78,178,245,159, 28,140,124,212,106,245, 36,161, 80,216,206,104, 52, 6,137,197,226, 56,142, -227,162, 50, 51, 51,151, 82, 74, 19,156, 37,228, 20,167,148,219,135, 74, 13,100,254, 79, 6, 57, 7, 0,149, 74,117,145, 97,152, - 0, 91, 18, 96,241,239, 88,220, 79,164,141,191,200, 7, 25, 25, 25,175,148,145,223, 96, 55, 55,183,239, 0, 52, 41,207, 97,114, -209, 86,211, 5,173, 86,251, 86,209,233,227,146,240, 84,174,174,174,179, 9, 33,253, 25,134, 41, 55,160, 48,207,243, 28,165,116, -107,102,102,230,103,148,210,220,210, 62,231,234,234,122, 56, 58, 58,186,137,151,151, 87,185, 90, 26,179,217,140,199,143, 31,123, - 54,109,218,244, 56,128,240, 23,137,233, 8, 23,249, 39,165,172,147,135, 37,114, 30,203, 63,246, 70,204,230,121, 12, 89, 59,255, - 45,255,164, 71,247,252,199, 45,248, 41, 52,220, 67,222, 46, 58,189, 32,217,222, 31, 20,203, 84,191,183,234,208,189,253,132,119, - 63, 80, 92,185,126, 27, 7,143,157, 65, 78,190, 30, 44,195, 64,163,146, 35, 52,180, 6, 89,178,106,187,199,186, 21, 75,190,148, - 41, 53,145,133,121, 89, 61, 29,201,144, 66, 46,248,100,106,159,166, 10,119, 55, 14,224, 57,124,216,173,129,226,227,221,151, 63, - 1, 48,221, 97,146,117,228,136, 60, 53, 37, 5,115,252,252, 32, 48,155, 33,101, 24, 72, 9,129,148, 97,160,144, 74,209,117,205, - 26,204,221,183, 79, 62,243,181,215,156,100,235, 63, 38, 42,149,106, 68,104,104,232,162,213,171, 87,187, 87,175, 94, 29, 10,133, - 2, 90,173,214,227,206,157, 59, 13,223,127,255,253, 97, 46, 46, 46, 51,178,179,179, 87, 58, 75,202, 41, 78, 41,149,116, 52, 4, - 80, 98,144,248,178,158,253, 93,194, 48, 76, 64, 66, 66,130,151, 92, 46, 7,199,113, 69,209, 0,120,235, 66,218, 54, 82, 78,145, -163, 90,132,135,135, 27,203, 25, 55,190, 77, 77, 77,237,100, 27, 10,173,172,136, 59, 9, 9, 9,157,106,215,174,253, 45,128,206, -165,144,151,217,239,190,251,238,164,186,117,235, 90,180, 64, 69, 81, 16,158,188,166,167,167, 99,226,196,137,214,223,224,121, 30, -135, 14, 29,122,119,196,136, 17, 0,240,126, 25,121, 15,242,242,242, 34, 69, 1,197, 75,149, 89,179,102, 97,214,172, 89, 88,182, -108, 25, 17, 10,133,154,114,202,179, 82, 48,237,229, 34,255,132, 6,171,184,135,248, 98, 31,219, 83, 44,222,225,158,103,136,150, -221,141,147,242,123,231, 45, 93, 61,106,206,240, 86,100,237,251,157, 66,198, 47, 59,124,166,182,159,172,205,205,196,194, 56, 59, - 52, 89, 35,155,183,121,173,221,196, 73, 83, 21, 63,253,122, 20,119,110, 93, 69,244,201,159,159,250, 76,227,206, 35,144,156,158, -139, 17, 19, 62, 84, 18, 86,208, 78, 36,149,143, 52,234, 10,214,218,169,205,242,174,237, 38,127,167,121,211, 58,194, 4,217, 29, -248,184,202,208,170, 81, 77, 97,224,129,107,239,212, 38,228,235,155,148,150, 27,171,176, 56,201, 90,253,230,155,104,109, 50,193, -139,101,193, 18, 2, 22, 0, 67, 8,116,122, 61, 46, 12, 25,130,166, 27, 55,226,179, 93,187,228,179,123,244,112,152,108,201,229, -242,117,133,133,133, 95, 84,192,113,219, 63, 57,120,134,170, 84,170, 79,114,114,114,134,188, 68,105,242, 5,144, 86, 66,124, 68, - 17, 0, 13,165,212,161,200,194, 82,169,116,204,160, 65,131,150, 44, 95,190, 92,158,146,146,130,196,196, 68,112, 28, 7,169, 84, -138,144,144, 16,114,248,240, 97,247,169, 83,167, 46, 86,171,213,146,156,156,156,175, 29, 72, 39, 35, 20, 10,135,187,185,185,245, -246,246,246,246, 74, 75, 75, 75,203,204,204,220,165,215,235,215, 86,116,101, 95,132, 57,184,106,213,170,189,253,252,252,188, 19, - 18, 18,210,227,227,227,127,215,235,245,235,138, 98,216, 61, 79,153,214, 71,145,183,122, 0, 73, 85,171, 86,189,241,240,225,195, -212, 74,196, 76,172, 90,181,234, 77, 71, 49, 9, 33, 10, 0, 91, 0,248,149,243,209, 68, 0, 3,168,131,218,108,167, 84, 30,201, - 42, 10,105,245, 20,161, 42,235,217,223, 45, 50,153, 12, 63,255,252, 51,132, 66, 33,132, 66, 33, 50, 51, 51, 17, 16, 16, 96,189, - 23,137, 68,214,255,171, 84,169, 82, 46, 30,199,113, 77, 89,150, 69, 94, 94, 30, 56,142,179, 94, 89, 89, 89,160,148, 66, 34,145, -128,227,158,132,115,178,121,222,180,140,114,236,239,231,231,135,159,126,250, 9, 6,131,225,153,231,106,181, 26,215,175,255, 21, -100,132,101, 89, 52,107,214,140, 33,132,244, 47,139,104, 17,242,196,233,230,216,177, 99,193,178,236, 83,241, 44,109, 47,142,227, - 48,107,214, 44,216,134, 38,251, 59, 49, 95,186,118, 93,134,135,120, 74,105, 18,128, 18,109,180,152,178, 64,195,125,148,111, 77, -126,243,213,130, 25,163, 34,233,199,195, 58,211,143,222,108, 71, 95,107, 83,239, 87, 86, 32, 32,231,110, 62, 70,128, 11,176,110, - 98,147,160, 64, 15,197,245,186,238,170,208, 18, 84,163,182, 1,165,253,228, 10,245,231,111,189,247,161,114,207,241,107,120, 28, -247,248, 25,146, 5, 0, 23, 15,174, 67, 82, 98, 2, 46, 71,199, 99,240,200,183,149,106,181,230,115, 66,136, 95, 73,152,197,197, - 69, 37,250,223,180, 1,173,164,121,166, 68,228,186, 2,108,176, 24, 66,121, 62,166,118,175, 47, 81,171, 68,139,202, 80,225, 90, - 49, 37, 98,241,193,133,135, 15, 91, 73, 86, 75,189, 30, 18,142,131,153,227,172, 36,203, 96, 54,163,208, 96,128,111, 94, 30,238, -143, 24, 1,106, 50, 97,198,206,157,114,137, 88,124,208,158,116,218,172, 0,186,169,213,234, 99,132,144, 80,123, 42,249, 69, 28, -153,117,208,141, 71,168, 74,165, 58, 70, 8,121,237,101, 72, 39, 33,132, 33,132,204, 27, 53,106,212,165, 26, 53,106, 28, 45, 34, - 86,150,103,130, 26, 53,106, 28, 30, 53,106,212, 21, 66,200, 44, 66, 8, 99, 39,166,191,159,159,223,252,229,203,151,203,239,222, -189,139,132,132, 4,152, 76, 38, 12, 26, 52, 8, 28,199,161,176,176, 16, 6,131, 1, 95,124,241,133,194,221,221,253, 19, 66, 72, -144, 61,121, 39,132,176, 46, 46, 46,235, 55,108,216, 48,246,225,195,135, 62,127,252,241, 7,115,237,218, 53,239, 47,191,252,114, -132,187,187,251,198,162,128,171, 14,149, 39, 33,132,241,245,245, 93,251,219,111,191,189,117,253,250,245,128, 29, 59,118, 8,207, -158, 61,235,187, 98,197,138,209,190,190,190, 27, 9, 33,108, 69,234,136, 16,210, 80, 46,151,119,156, 50,101, 10,127,250,244,233, -132,211,167, 79, 39, 44, 89,178, 4,173, 91,183,110, 57,119,238,220,136, 10, 98, 54, 82,169, 84, 29,166, 76,153,194,159, 56,113, - 34,241,220,185,115,241,139, 23, 47,102, 58,116,232,208,106,193,130, 5,245, 29,196,220,114,250,244,233,182,113,113,113,213,227, -227,227,171,197,199,199, 87,141,143,143,175,154,144,144, 16,148,148,148, 84, 37, 57, 57, 57, 48, 53, 53, 53, 48, 42, 42,170, 21, -128,205, 47, 91, 63,250,175, 99, 22,181,229,203,148, 82,104,181, 90,236,217,179, 7, 69,218,171,134,182, 36, 43, 39, 39, 7, 73, - 73, 73,150,103,130,127, 32,157,224, 56,206, 74,164, 14, 29, 58,132, 81,163, 70, 65,171,213, 90,223, 19, 8, 4,214,255, 45,223, - 41, 15,211,162,121,226, 56, 14,231,206,157,195,184,113,227,176,100,201, 18,108,222,188, 25,187,119,239,134, 86,171,181,146, 45, -179,217, 92, 46,102,122,122, 58,120,158,183, 55,143,200,206,206,182,187,222,109, 9,144, 64, 32,120,134, 20, 89, 46, 71,218,210, -243, 96,190,204, 82,154, 71,120,123,196,218,184,139, 84,117,237,108, 31,134, 85,245,249,100,209,164,254, 50,112, 70, 80, 83, 33, - 96, 44, 0,140,121,224, 13, 5, 32, 34, 25, 96, 42,132,167, 68,139, 45, 19,194,212, 31,253, 20,115,171,150,167, 58,242, 86, 90, -206,254, 18, 73,133, 64, 52,184,255,240,119,221,227, 83,115,144,144,146, 13,150,249,107,222,139,232, 52, 28, 2,150,193,249, 3, - 79, 20, 87, 12,203, 34, 59, 95,143,172, 60, 35,250, 13,159,228,246,195,146, 79, 7, 3,248,162,172,140,212, 35, 36,164,133,159, - 91,159,218,181,171, 48,183, 36,209,136,120,237, 36, 56, 30,160, 39,122,160, 97,166, 23, 27,126, 80,220,167, 30, 33,243,175, 81, -122,183, 44, 28,137, 70, 35,115,173, 95, 31,115,252,252,208,198,100,130,136, 82,188,154,146,130,171,147, 38, 65,191,125, 59, 24, - 0,162,215, 95, 71,251,165, 75,113,220,207, 15, 62,133,133,200,154, 60, 25,158,251,247, 67,164, 86,203, 28, 41,124,145, 72,100, - 92,189,122,181,223,232,209,163,143, 17, 66,218,189,204,154, 45, 66, 72,168,155,155,219,177,207, 63,255,220,123,230,204,153, 73, -149,132,233,173, 80, 40,182,230,231,231, 79,114,116, 69, 91, 68,156,230,173, 92,185,114,252,216,177, 99, 53,163, 71,143,166,247, -239,223,215, 0,176,104, 71, 60, 91,183,110, 93, 99,245,234,213, 62, 77,154, 52,121,119,220,184,113, 34, 66,200,140,242,180, 60, - 74,165,114,194,234,213,171, 61,210,211,211,145,151,151,103, 29,100,227,227,227, 33,147,201,172, 65,213,133, 66, 33, 62,255,252, -115,247, 9, 19, 38, 76, 2, 48,169,188,244, 74, 36,146,225,223,125,247, 93,205, 46, 93,186, 8, 98, 99, 99,193, 48, 12, 36, 18, - 9,222,124,243, 77, 97, 65, 65, 65,208,156, 57,115,198, 2,248,206,145, 50, 16, 10,133,131, 87,173, 90, 21,218,178,101, 75, 65, -116,116, 52, 90,180,104,129,243,231,207,227,245,215, 95, 23,230,230,230, 86,155, 58,117,234,168,210, 86, 88,101,105,157,228,114, -121,221, 63,254,248, 35, 46, 48, 48,208, 58,176, 84,171, 86,141,139,140,140,212, 70, 71, 71,135,157, 57,115, 38,163, 69,139, 22, -143, 29,192,244,151,203,229,225,123,247,238, 77,154, 51,103, 78,199,149, 43, 87,246, 2,128,166, 77,155,254, 62,119,238,220,163, - 90,173,182,206,137, 19, 39,180,173, 91,183,142,183, 19,210,207,215,215,151,155, 56,113,162,178,172, 15,173, 89,179, 38, 11, 64, - 21, 66, 72,245,162, 64,219, 78,249, 27,132, 82,106, 38,132, 68, 16, 66, 46,239,217,179, 7,205,154, 53,195,158, 61,123, 16, 25, - 25,121,217,150, 12, 92,191,126, 29,109,218,180, 1,158, 4,146,255, 71,108,181, 56,142,131, 64, 32, 64,124,124, 60,214,172, 89, -131, 5, 11, 22, 32, 36, 36, 4, 38,147,233, 25,178, 85, 68,136,236, 82,193,152,205,102, 92,184,112, 1,155, 54,110,196,140, 79, - 62,129, 74,165, 2, 0, 24,141, 70,104, 51, 51, 33,149, 74,173,100,172,156,178,220,122,239,222,189, 73, 1, 1, 1, 79,109, 25, - 90, 94,139,198, 44,240, 60, 15,179,217, 12,157, 78,135, 37, 75,150,152, 41,165, 91,203,233,147, 86, 82, 52,105,210, 36,232,245, -127,197, 33,175, 95,100,147, 92,181,106, 85, 52,104,208,192,122,207, 48, 12,181, 23,243,135, 87,234,162,208,230,211, 97,179, 22, - 3, 0, 2, 2, 2, 16, 22, 22, 6, 95, 95,223, 82, 49, 75,226, 34,255,180, 20,183,201,170,144,141, 86,105,145,178,111, 61, 76, -254, 98,244,212,197,139, 21, 82, 86,248, 94,239,122,168,162, 17, 1, 50, 55,136,218,124, 4,162,121,178,144,167,218, 7,192,193, -143,240,101, 31, 45, 51,246, 71,221,175, 53,220,220, 60,239,107,181,207, 24,225, 9, 69,210,246,193, 53, 67,201,227, 36, 45, 4, - 2, 1, 20, 46, 30,120,165,247,251, 96, 89, 6, 74,141, 7, 8, 87,248, 23, 35,102, 88, 8, 88, 1,180,185,133,168, 90,189, 38, - 35,145,202,218,151, 71,180,212, 46,194,239,166, 12,124, 69,154, 97,142,135,172,138, 20,156,101, 58,245, 19,131,113,207,197, 7, - 93, 67,100, 99,127,191,246, 29,128, 14,246, 20, 12,107, 54,195,139,101, 97,164, 20, 87, 39, 77, 66,196,170, 85,184,108, 33,134, -171, 86,225,242,216,177,112, 19, 10, 33, 97, 24, 80,147,233,153, 61,125, 59, 39, 32,244,238,221, 27,233,233,233,222,159,124,242, - 73,133,201,150, 76, 38,219, 68, 8,233, 38, 20, 10,141,132, 16, 48, 12, 99, 13, 2,110,249,223,104, 52,138, 88,150,221,155,158, -158,238,240,150, 31, 33, 36,212,213,213,245,216,233,211,167,189, 21, 10, 5,102,205,154, 85, 41, 36, 75,165, 82,157, 29, 53,106, - 84,149, 77,155, 54,237, 39,132,116,181,151,108, 21, 39, 89,171, 86,173,202, 90,179,102,205, 15,182, 91,132,148,210, 36, 66,200, -218, 38, 77,154,188, 53,118,236, 88, 13,128,241,227,198,141, 67,121,100, 75, 34,145,180, 11, 14, 14,126,106, 85, 43,145, 72, 0, - 0, 10,133, 2, 46, 46, 46, 16,137, 68,208,235,245,136,136,136, 32, 98,177,184,149, 61,105, 86,169, 84,221,250,244,233, 35, 56, -117,234, 20,146,147,147,225,226,226, 2,133, 66, 1,142,227, 48,102,204, 24,209,210,165, 75, 95,115,148,104, 5, 6, 6,246,234, -216,177,163,224,198,141, 27,120,248,240, 33,244,122, 61,238,220,185, 3,181, 90,141,161, 67,135,138, 22, 45, 90,212,195, 81,162, - 5,160,238,216,177, 99, 83,108, 73,150, 69, 20, 10, 5, 9, 13, 13,213,186,187,187, 55, 2,240,216, 17,204,183,223,126, 59,117, -225,194,133,109, 14, 31, 62,252,145,229,205,195,135, 15, 79, 5,128,175,191,254,250,132,167,167,103, 35, 0,246, 18, 45, 80, 74, -249, 55,222,120,227,145, 88, 44,134, 80, 40,132, 88, 44,126,234, 18,137, 68, 96, 24, 70,101,233,206,255, 85, 82, 67, 8,105, 2, -224, 43, 60, 57,145,245, 9,165,244,220, 75, 66,182,174, 16, 66, 34, 34, 35, 35,173,100,107,223,190,125,232,218,181, 43,178,178, -178,112,227,198, 13, 91,146,245, 79,217,104,129,231,121, 8,133, 66, 44, 94,188, 24, 70,163, 17, 63,254,248, 35,182,109,219,246, -212, 24,170, 86,171,177,108,217, 50,135,182,185, 56,142,195,250,245,235,241,209,212,169, 86,146, 85,180,184,134,143,183, 55,220, - 61, 60, 16, 19, 19, 83, 46,209,202,204,204,252,108,215,174, 93, 40,203, 24,126,215,174, 93,214,255,109,141,225,237,154,231, 88, - 22,122,189, 30,175,190,250, 87,168,216,183,223,126,219,250,191, 86,171, 5,203,178,150,178, 32,246, 98, 22, 82,160,183,244,175, -247,186,125,240,193, 83, 26,186,210, 48, 75,227, 34, 47,163,118,171,132, 83,135, 17,148,210,203, 69, 38, 18,145, 0,246, 20,109, - 39,150,109,163,117, 55, 53,127,185,128, 36, 53, 88, 56,177,243,240, 42, 94, 46,160,121, 41, 16,117,248, 12,127,166,201,176,120, -201, 94, 0,192,135,111, 54, 70,253, 78,243, 96, 88,215, 25,147, 90,176,226, 33,241,250, 41, 0,102, 62,219,241,248,240, 0,127, - 63,252,121,255, 58, 4, 44, 11,177,139, 7, 92,220,188,193,155, 13,200, 78,125,136, 99, 59,190, 5, 0,172, 92,191, 21, 12,195, - 64, 32, 96,161, 55,112, 8,169,226, 7,158,231,195,203, 74,103,109, 66, 94,233, 27,234,219, 44, 48, 72, 67,110,184, 62, 68,168, -151,251,211, 31,104, 40, 65, 72,162,146,180, 80,202,154,214, 38,228,149,155,148,158, 46, 87, 3,193, 48, 96, 8,129, 92, 36,130, -126,251,118, 92, 46, 34, 88, 0,112,121,236, 88, 48,191,254, 10,149, 68, 2,150, 16, 8,138, 84,208, 21,233,232, 0, 16, 22, 22, -134,149, 43, 87,122, 79,152, 48,161, 66,100, 75,167,211,205, 87,171,213, 29,215,174, 93,235,221,167, 79,159,103,158,223,191,127, - 31,109,218,180, 73, 73, 78, 78,158,255, 60, 36, 75,163,209, 32, 46, 46,238,185,247,213, 45, 36,235,208,161, 67, 65, 1, 1, 1, -136,136,136,240,252,240,195, 15, 29, 33, 91, 51,109, 73,214,184,113,227,174, 1,240, 34,132, 20, 39, 42,164,232, 89, 61, 27,178, -149, 13, 96, 81, 25, 43,209, 32,133, 66,129,212,212, 84, 12, 31, 62, 28,119,239,254,165, 0,245,243,243,179,174,244, 98, 98, 98, -224,233,233, 9, 66,136,151, 61,121,246,244,244,244, 54, 24, 12, 24, 57,114, 36,226,226,254, 50,103,244,247,247,183,148,169,135, -163,229,232,237,237,237, 93, 88, 88,136,214,173, 91, 67,167,211, 1, 0, 6, 12, 24, 0,161, 80,136,212,212, 84, 8,133, 66,143, - 10, 84,143, 71,100,100,100,169,174, 85,212,106,181,209,213,213,181,150,131,152,238, 61,122,244, 72, 88,181,106,213, 51, 7, 91, -206,159, 63,223,211,205,205,237,176,155,155, 91,168,131,152,188, 45,169, 18,137, 68, 79, 17, 45,161, 80, 8,134, 97,120,252,247, -229,127, 0, 44,167,224,190, 7,208,224, 37,210,108, 89,201,214,190,125,251, 80,167, 78, 29,100,102,102, 34, 58, 58,250, 31, 39, - 89, 54,196, 4, 2,129,192,186, 72,150, 74,165,136,136,136,176,146, 44, 66, 8, 10, 10, 10, 32, 16, 8, 44,227,181, 93,131, 95, - 86, 86, 22,124,125,124,160, 82,169, 80, 51, 36, 4,247,138,198, 17,203,255, 18,137, 4,132, 16,152,205,230,242,202, 48, 23, 79, -108,173,222,175,236,234,177,144,162, 50, 85,199,126,126,224,121,222, 50,230,211,202,192,244,240,240, 64, 94, 94,158,189,152, 47, -165,148,162,209,138, 0,112, 25, 64, 36,165,116, 85,145, 97,252, 83,238, 29,218, 2, 56, 6,155, 35,149,132, 16,166,150,183,114, -205,194, 9, 29,135,119,174,227,129,194,180,135,144,170, 60, 64, 52, 85,177,120,201, 94,220,120,144, 1, 0, 88,188,249, 34,126, -154,211, 13,144,185, 33,204, 37, 29, 62, 42, 65,159,146,136, 22, 1, 37, 60,165, 16,176, 76,209,222, 45, 11,150,101,160, 77, 75, -194,210,207,198, 23,145,172,109,216,115, 34, 26, 1,193,117,254,218,199, 37, 4,160,101, 55,110, 79, 23,209,170, 9,125,155,203, - 82, 72, 18, 52,126,114, 72,165,197,248,163,171, 8,164, 42,131,137,237, 2,228, 23,118,233, 86, 1, 40,119,162,144, 50,204, 19, -227,119, 66, 74, 52,100, 99,138,158,177,132, 60,241,254,202, 59, 62,166, 91, 8,139, 82,169,132,183,183, 55, 22, 44, 88,224, 61, -109,218,180, 31,225, 96, 0,106, 74,233, 29, 66, 72,187, 49, 99,198, 28,203,200,200,240, 14, 11, 11,131, 82,169,132, 82,169, 68, - 74, 74, 10,250,245,235,151,146,156,156, 92, 81,109,217,198, 81,163, 70,121,139, 68, 34,220,191,127, 31,110,110,110, 86,130, 88, - 81,146,165, 86,171,207, 30, 62,124, 56,168, 70,141, 26,184,125,251, 54,106,213,170,133, 45, 91,182,120, 14, 26, 52,200, 46,178, - 37,147,201,122, 23, 17, 39,140, 29, 59, 86, 51,118,236,216,182, 0,218,150,247,219, 99,199,142,213,188,255,254,251, 61,202, 34, - 90, 66,161, 48, 78,171,213,250,200,100, 50,236,216,177, 3, 74,165, 18,114,185, 28,126,126,126,208,106,181,144,203,229,160,148, -194,100, 50, 89, 6,139, 12,123,242,157,150,150,150,194,113, 92,224,254,253,251,145,150,246,151,111,189,160,160, 32,100,103,103, -131,227,184,116, 71,203, 50, 49, 49, 49,133, 16, 18,248,231,159,127, 34, 54, 54, 22, 93,187,118,197,175,191,254,138,198,141, 27, - 3, 0, 12, 6, 67, 69,156,248,113, 44,203,210, 50,234,143, 0,112,173, 76,204,162,201,203, 33, 76,158,231,121, 11,201,178,125, -181, 37, 95,229,252,230,127, 69, 92,108,215, 9, 47,107, 34,187,118,237, 10,173, 86, 11,165, 82,249, 82,217,231, 88, 52, 90,179, -103,207,198,248,241,227,225,237,237,141,143, 62,250, 8, 2,129,192,122,217,238, 12, 56, 34, 94,222,222,101, 62,183, 24,196,151, - 51, 94,170, 92, 92, 92,102, 51, 12,211,159,181,163,224, 56,142,227,120,158,223,154,157,157, 93,166,123, 7,139,225,186, 61,117, - 97, 91, 6,229,164,245,185, 49, 75,226, 34, 47,131, 20, 63,109, 88,146, 70, 11,127,157, 58,124, 38, 20,144, 37,151,199,138, 84, -118,199,108, 73,214,231,227,219, 15,239, 92,199, 21,191, 31, 57, 7,145, 49, 11, 48,228,150, 81,195, 38, 16,145, 2,222, 46,194, -128, 18, 43,129, 97,111,199, 39, 36,194,221, 85, 89, 68,178,138, 46,134, 65,253, 58, 79, 22,179,123, 78, 68, 35,160,122, 29, 8, - 88, 22, 2,150,133, 82, 38, 65, 74,114, 18, 4, 2,230,118,105, 63, 91, 79, 64,250,246, 13, 13,172,234,234, 46, 68,186,167, 1, -190,222,242,146, 63,216, 72,133, 0, 95, 49,186,184, 75,131,234, 9, 72,223,114,136,139,149,104, 25,205,102,136, 94,127,221,186, - 93,120,121,236, 88, 68,172, 90, 5,174, 87, 47,228, 27,141, 79,169,138, 29, 21, 75,131,180, 16,162,153, 51,103,166,100,100,100, - 12,174,224,234,241, 78,102,102,102,187, 79, 62,249, 36, 37, 61, 61, 29,114,185, 28, 73, 73, 73,207, 69,178, 0,160,176,176,112, -232,170, 85,171, 82,142, 29, 59, 6,165, 82, 9,149, 74, 85, 97,162,101,209,100,125,246,217,103, 85, 2, 3, 3, 17, 19, 19, 3, - 23, 23, 23,184,187,187,163,126,253,250, 56,117,234,148,103, 96, 96,224,254, 34,131,217,178,210,244,219,170, 85,171,178, 0, 96, -213,170, 85, 89,132,144, 40, 66,200, 10, 66,200,247,197,174, 21,132,144, 40,219,207, 22, 22, 22,238, 44, 11,219, 96, 48, 68, 69, - 71, 71, 83,185, 92, 14,150,101, 97, 52, 26, 33,149, 74,173,245,149,147,147,131,194,194, 39,219,220,151, 46, 93,130,201,100, 58, -105, 79,222,115,115,115,247,173, 91,183,206, 20, 24, 24,136,122,245,234,161, 81,163, 70,104,209,162, 5,130,130,130, 48,123,246, -108, 67,126,126,254,190, 10, 16,173, 61, 91,182,108, 49, 5, 6, 6,162, 81,163, 70,144, 72, 36,168, 95,191, 62,252,252,252,176, - 96,193, 2, 67,118,118,246,190, 10, 84,211,227,235,215,175,179,101,144, 92, 53,128, 20, 7, 49,227, 46, 92,184,192, 54,111,222, -252,247,226, 15,154, 54,109,250,187, 82,169,116, 1,224,168,221, 31,181, 37, 87, 18,137,196,122, 89,222, 23, 8, 4,255, 31, 52, - 90,147, 0, 92, 3, 16, 3,224,163,151, 41, 97,182,134,239, 25, 25, 25,136,142,142,198,165, 75,151,208,188,121,115,156, 60,121, - 18, 40, 50,144,255, 7,211, 7, 74, 41,132, 66, 33,194,194,194,240,254,251,239, 99,239,222,189,184,115,231, 14, 76, 38,147,149, - 8, 89,108, 50, 29,209,104,137, 68, 34,120,123,123,195,100, 50, 89,181, 89, 0,112,239,238, 93, 8, 4, 2,240, 60, 15,131,193, - 80,174, 70,203,197,197,101,246,234,213,171,223, 77, 79, 79,247, 77, 75, 75,243,178,189, 82, 82, 82,188,146,146,146,188, 18, 18, - 18,188,226,226,226,188, 30, 61,122,228,245,240,225, 67,223, 47,190,248,226, 93, 23, 23,151,217,246,206, 65,245,235,215,199,219, -111,191,109,189,150, 47, 95,110,189,142, 29, 59,230,176,241, 58,203,178, 8,155,181, 24,221,210,168,245,218,235, 73,172,215,141, - 15,199,149,133,249, 20, 23,121,105,218,114,209,105, 67,219,192,210, 37,204,193, 73,148,210, 85,150,237, 66, 91,231,165,197,141, -225, 1, 0,225, 62,242,121,159,143,105, 51,252,213, 90, 46,248,237,200, 69,204,217,249,224,118,200,112,207,176, 26,174,105,224, -211,162,241,225,155,141,177,120,243, 69, 0, 79,182, 14,249,212, 27,160,153, 49,160,170, 64, 60,212,166,151,184,237, 96, 54,232, -142, 62,184,127,183,125, 88,221, 38, 76,114,122,222, 83,199, 63, 35,218,245, 3, 33, 4,254,213,235,128, 21, 8,192,178, 12, 4, - 44, 11,141, 90,138,232, 63,255,228,245,133,133, 71, 75,194,108, 71,136,192, 71, 41, 94,254,102,151,250,210, 68,113, 42, 60,125, - 21, 16, 9,159,144, 0,250,160, 95,177, 25, 66, 0,212, 85, 97, 68,130,187,236,104,138,110,121, 59, 66,126, 63, 86,138, 1, 38, -207,243, 80, 74, 36,208,233,245, 40, 52,155,209,110,233, 82,235,118, 33, 67, 8,174, 0,168,183,116, 41, 78,111,223, 14,181, 88, - 12, 72, 36,118,159, 10, 41, 73,163,149,146,146,130, 1, 3, 6, 60, 23, 33,178,213,108, 77,152, 48,225,216,130, 5, 11,188,103, -206,156, 89,105,152, 31,125,244,209,177,205,155, 55,123, 87,171, 86,173,194,141, 85,169, 84, 78,229,121, 94,179,104,209,162,228, - 47,191,252, 18,197,237,201,138,136,142, 68,163,209, 44, 6,208,190, 12,168, 57,227,198,141, 19, 1, 24, 95,164,217,170, 55,110, -220,184,211,148,210, 25,197,202,119,214,202,149, 43, 7,216,108, 49,174, 0,176,180,172, 52,230,228,228,124,255,254,251,239,143, - 60,126,252,184,135, 84, 42, 5, 33, 4, 34,145, 8, 53,107,214,180,158,162, 17, 10,133,160,148,226,131, 15, 62, 72, 79, 77, 77, -181,203,189,131, 94,175, 95, 63,103,206,156,246,133,133,133, 65, 35, 70,140, 16,185,186,186, 34, 37, 37, 5, 95,125,245,149, 97, -253,250,245,113,249,249,249,142,218, 82,193,100, 50,173,255,244,211, 79,219,229,229,229, 85, 31, 61,122,180, 40, 59, 59, 27,133, -133,133,152, 50,101,138, 97,237,218,181,241,133,133,133, 14, 59,252,109,209,162,197,253, 71,143, 30,181, 42, 40, 40,200,148,203, -229,197,181,125, 68,161, 80, 52, 1,176,209, 17,204,136,136,136,152,199,143, 31, 55,159, 55,111, 94,148,201,100, 18,158, 63,127, -190,151,133,100,125,243,205, 55,199,164, 82,105, 71, 56,110,180,207, 75, 36,146,167, 52, 88,197,255, 23, 8, 4,255,121,141, 22, -165,244, 24,158,184,204,120,169,164, 56,201,186,113,227, 6,218,183,127,210,165, 79,158, 60,137,150, 45, 91,226,228,201,147,104, -213,170,213, 63,234,222,193, 66,180, 4, 2, 1, 6, 13, 26,132, 78,157, 58,161, 74,149, 42, 79,157, 54,180,252,239, 8,217, 48, -155,205,168, 91,183, 46,244, 6, 3, 68, 34,145,117,107, 82, 32, 16,192,211,203, 11,247,239,223,183, 75,163,197, 48, 76,255,222, -189,123, 51, 55,111,222,196,192,129, 3,177,105,211,166, 82, 63, 59,100,200, 16,252,252,243,207,232,221,187, 55, 51,125,250,244, - 50,221, 59, 88,140,208,237,201,147,101,158, 46, 79,163, 87, 89,152,182, 92,228,101, 19, 27,215, 14, 37,181,249,177, 37,180,175, - 85, 79, 17, 45, 27, 39, 97,168,238, 41, 31,209,169,166, 0,191, 29,189,136, 57,191, 61, 94,207, 81,186, 99,199,229,204,221, 31, -181, 4,140, 91,223, 68,253,126, 27,159,108, 23, 2,224, 83,111,192,184,117, 8,136,220, 3, 39, 18,132,200, 46, 52,238, 41,185, -225, 25, 55,253,250,227,183,239, 55,255,174,149,167,175,151, 11,180,217,133, 86,178,117,249,216, 54, 0, 64,223,113,243, 33, 96, -159,108, 41,170,149, 82,200, 68, 44,182,111,248, 58,221,104,212,149,216,186,114,133,204,248,233,175,212,116, 17, 43, 76,200,241, -161,168,227,249,215,161, 63, 82,125,219,179,132,171,161, 43, 60,110,100,226,205, 26, 74,245,215, 55,179,198, 3, 88,254,204,132, -152,149, 85,152,245,231,159,178,174,171, 87,227,252,208,161,240,231, 56, 68,249,249,193, 77, 40,132,139, 68, 2,134, 16, 20,238, -222,141,211, 59,118,192, 91, 34, 1, 84, 42,152,231,206,133, 62, 58, 26,166,220,220, 66, 71,137,214,189,123,247,158, 91,235, 84, - 18, 49,154, 54,109,218,143, 25, 25, 25,131, 43, 19,115,232,208,161,199,142, 28, 57,226, 93, 81,156,220,220,220,201, 0, 38, 87, - 66,122,120, 66,200,140, 34,199,120,227,199,142, 29,171,185,112,225,194, 72, 66,200,119,150,213, 4, 33,196,107,212,168, 81, 99, -138,145,172,114, 79, 29, 82, 74, 31, 43,149,202,185,147, 39, 79,158,255,229,151, 95, 42, 45,134,239, 87,175, 94,133,217,108,134, - 80, 40, 4,199,113, 24, 53,106, 84, 94, 70, 70,198,226,210, 60, 58,151,128,107, 38,132, 12,153, 63,127,254,168,175,191,254,186, - 59,203,178,158, 28,199,165, 21, 22, 22,238, 47, 44, 44, 92, 85,145, 83, 87, 69,229, 48,108,230,204,153,195,150, 44, 89,210,155, - 97, 24, 47,179,217,156,158,155,155,187,171,176,176,176, 66,190,185, 78,159, 62,157,246,221,119,223, 61, 72, 75, 75, 11, 15, 8, - 8,200, 86, 42,149, 6,131,193,192,202,100, 50,181, 66,161,136, 0,112, 6,192, 45, 71, 48, 47, 93,186,148,188, 98,197,138, 88, -189, 94, 31,182, 98,197,138, 19,106,181,250, 8, 33,132,136, 68, 34, 87,153, 76,214, 30, 64, 20,128,123,142, 96, 50, 12,195,219, -106,175,138,219,103,137,197,226,255, 47, 54, 90, 47,157,216,186,119, 72, 79, 79,199,205,155, 55, 45, 36, 43, 2, 0, 90,181,106, -117,217, 66,182, 46, 93,186,132, 70,141, 26, 93, 38,132, 8,255,238,147,135,182, 26, 45, 11,161,170, 82,165,138,245,222,246,178, -177,209,178, 75, 56,142,131, 72, 36,130, 64, 32,128,175,159,159,245,183, 40,165,184,127,255, 62,180, 90,173, 93, 68,139,101, 89, -150, 16,130,129, 3, 7,218,245,187,111,188,241, 6,162,162,162,192,218,201, 10, 89,150, 69,213,170, 85,237,218,121,129,157,246, - 84, 44,203, 34, 32, 32,160,194,152,182, 92,228,101, 34, 88, 37,253, 95, 18,169, 42, 73, 74, 52,134,143, 73, 45,156, 55,228,171, - 83,211,111, 37,235,118, 68,167, 20,188, 15,128,110,189, 33, 63, 88,223,147,237,220, 57, 52, 30,250, 85,173, 64,212, 79,156,183, -209,188, 36, 16,133, 55,226,121,127,204,250,253,118,178, 25,100, 81, 41,137, 72, 20, 73,229, 51, 54,172,254,230,203, 81, 19, 62, - 80,222,136, 73, 65,118,158, 30, 44,203,216, 14,158, 16, 8, 88,168, 21, 82, 4,250,184, 96,243, 15, 95,229,230,230,100,205, 44, - 45,238, 97, 21,149,104, 92,199, 38, 53, 36, 34,223,124,132,213, 27, 0, 86,250,151,147, 89,154, 92,202,238, 96,203,131,120,237, -113,190,244,215,199,249,227, 74, 36, 90, 6, 67,231, 79,186,116, 57, 48,103,239, 94,121,211,245,235, 17, 51,106, 20,252, 10, 11, - 33, 41,218, 74,100, 8,129, 82, 36,130, 82, 36,122, 66,178,150, 44, 65,161,217,140,165, 67,135, 22,232, 13,134, 46, 14,106, 36, - 68,109,219,182,173, 52,146,101, 75,140,224,160,157,151,189,100,171, 83,167, 78,199, 40,165,146,151, 96, 37,111, 33, 91,198, 11, - 23, 46,140, 57,113,226, 68, 12,158, 14, 44,154,117,226,196,137,152,209,163, 71,147, 53,107,214,172, 5,240,169,189, 14, 60,243, -242,242,190,209,104, 52,104,211,166,205,167, 11, 23, 46,116,111,220,184, 49,188,188,188,144,155,155,139, 75,151, 46, 97,210,164, - 73,218,156,156,156,133,153,153,153, 95, 58,152,102,174, 72,115,179,170, 50,203, 1,192,186,162,171, 82,228,173,183,222,186, 26, - 19, 19,147,225,233,233,217, 76, 36, 18,213,195, 19, 59,160,100, 0,107, 29, 37, 68, 22, 25, 63,126,252,159, 49, 49, 49,233,254, -254,254,205,139, 48, 53, 0, 18, 0,172,174, 0,102,226,197,139, 23, 3,154, 52,105,194, 8,133, 66,202,178, 44,132, 66, 33, 21, - 8, 4,180,200,174,134, 2,192,174, 93,187, 36, 0,180,112,202,223,221, 55,173,238, 29,146,146,146,172, 36,203,198, 97,105, 68, -171, 86,173, 46, 23,145, 44,203, 51,243, 63,148, 86,204,153, 51, 7, 43, 87,174, 68,121, 30,205,139, 78,247,145,242,240, 44, 26, - 45,142,227, 96, 52, 26,113,227,198, 13,171,207, 46,203,118,161,197,181,131,217,108, 46,243,180, 58,199,113,156,193, 96,192, 47, -191,252, 98, 23,217,250,233,167,159,160,211,233,192,149,195,224,108, 93, 49, 52,104,208, 0, 90,173,214,122,216, 39, 34,226, 47, - 87,121, 70,163,209, 33,226,106,193, 12, 11, 11, 67,122,122, 58, 60, 60,158,156,199, 9, 28,250,151,178,199,156,255,223,244, 31, - 92,150, 70,139,216,235,146,160,129, 70,227,162, 23,155,118,246,172, 35,105,215, 63,194, 5,213,125, 84, 16,138,164, 72,204, 49, -227,240,173, 28,172, 62,150, 28, 87,104,226,186,223, 73,205,191, 94, 22,142, 84,225,178,191,241, 43,157, 90, 14, 29, 51, 73,145, -167,231, 16, 27,251, 8,105,169, 73, 96, 8, 3, 95,255, 0, 4, 5, 85,133, 76,204, 96,211,170, 47,243, 47,159, 62,114, 42, 55, - 71,219,181, 52,172,238, 26,241,233, 37,175,183,108, 30, 28,172, 34, 48,155, 0,206, 4,152, 77, 0, 95,244,106,121,143,127,186, -205,221,188,153, 69,167, 95,209,158,221,157,101, 40, 49,102, 85,127, 66, 90,106,220,220, 14,204,218,181, 75,206, 27,141,200,152, - 60, 25,114,179, 25,210,162, 85, 9, 0, 64, 34,129,121,238,220, 39, 36,107,200,144,130,236,172, 44,135, 67,240,120,122,122,174, - 75, 79, 79,255,215,121,134,119,119,119,255,164, 34,110, 34, 94, 96,154,188, 0,100, 81, 74,141, 37,172,172, 61, 45, 90,174, 10, -224, 86,245,244,244,156,206, 48, 76, 11, 74,169, 59,195, 48,153, 60,207,159, 73, 77, 77,253,130, 82,122,223, 57,165,254, 99,245, -109,241, 12, 95,222, 62,118, 42,128,247, 0,228, 82, 74, 99,157, 37,247,183,215, 83, 67, 60, 57,133, 85,106, 8, 30,252,131, 39, - 15,221,221,221,207, 29, 56,112,160,113,245,234,213, 25, 91, 51, 6,139,175, 60,203,246,150, 64,240, 68, 31,113,252,248,113,243, -192,129, 3,207, 36, 39, 39,183, 41, 13, 83,173, 86, 31,188,118,237,218,171,217,217,217,207, 16, 42, 91, 79,241,150,251,252,252, -124, 76,152, 48,225, 80, 78, 78, 78,137, 33,120, 52, 26,205,146, 47,191,252,242,221,190,125,251, 50, 22,119, 20,182,151, 37, 92, -144,229, 50, 26,141,216,184,113, 35,255,245,215, 95, 47,203,202,202, 42,117,235,208,207,207, 47, 46, 49, 49, 49,192,226,106,193, - 30,167,162, 85,171, 86, 77,138,141,141,245,251, 59, 49,255,173,132,171,184,118,139, 56,226,251,137, 16, 66,194,188, 20, 3, 40, -208,159, 1, 95,151, 33, 68,108,166,184, 3,138,131,114, 65,193,119,151, 18,169, 93, 91,103, 34,185,124,162, 74,233,250, 89,223, -193,111,187, 87, 13, 14, 33,222,190,254, 32, 96,144,146,156,128, 71, 15,238,210,157, 63,126,155,145,159,163,157, 93, 80,144,247, -109, 89, 56,181, 9, 9,174,166, 22,109, 21,115, 8,133, 37, 31,197,226, 83, 61,195, 48, 1, 24,133,204,237,216, 92,211,128,155, -101,108,251, 88,200,214,140,157, 59,229,226,208,208,103, 28,197,241, 60, 15,125,116, 52,150, 14, 29, 90, 33,146,229, 20,167, 56, -229,185, 7,180,234, 40,223, 71,150, 9, 64,252, 63, 25,188,248,255,121, 29,189,180, 65,165, 9, 33, 10, 55, 55,183, 35, 44,203, - 6, 89, 52, 50,182, 54, 67, 37, 4,148,142, 77, 73, 73,233, 72, 41, 45, 40, 3, 51, 88,165, 82,125,203,113, 92, 83,123,130, 74, -179, 44,123, 62, 55, 55,119, 98, 89, 65,165, 95,196,169, 67, 15, 15,143,251,143, 30, 61, 10,182,156,162,182,157, 43,139,151, 3, - 0,220,187,119, 15,109,219,182,125,148,148,148, 84,245,239,196,124, 89,165, 20, 63, 90,207,175,209,122, 1,141,220, 79, 36, 81, - 14, 19,203,164, 29,120,147, 57, 12, 4, 16, 8,133,183, 13,186,194,163,250,194,188, 13,165,109, 23,254,157,210,159,144,150, 18, -177,248,160, 72,173,150,149, 84, 78,166,220,220, 66,189,193,208,217, 73,178,156,226, 20,167, 56,197, 41,255, 34, 2, 28,234,230, -230,118, 64, 40, 20, 74,108,201,100,241,255, 45, 98, 54,155,117,105,105,105, 93,203,218,125,121, 17,152,255,153,242,118,148,104, -237,217,179,135,218,235,189,149, 16,210,201,158,152, 85, 54,134,111,229,250,206,248,167, 49, 95, 96,222,203,245,138,235, 0,102, - 91, 60, 57, 30, 59, 59, 50, 50,114,214,191, 32,157,149, 89, 71,149,138,105,169,115,123,113, 29,193,180,183, 77, 57,152, 78,187, -218,253,203,128,105, 79, 95,170, 96, 58,203,108,163, 21,172,247, 50,251,210, 75,148,206,202,172,163, 74,193, 44,222,126,236,193, -117, 20,211,158,190, 84,129,116,150,219,238, 95, 22,204,231, 29, 67,202, 72,103,169,109,212,222,182, 84, 74,221,151, 59, 55,189, -172,154, 44, 0,176,248,211, 42,174,209, 42,205, 32, 94,224, 40,201,122, 17,137,183,157,116, 96,167,159,146,127, 2,179, 34,132, -203,145,180, 86,162, 28,171,108,204, 98,229, 89, 89, 50,171,104, 64,143,130, 29, 14, 71, 29,201,123,101,212,123,177,188, 86, 10, -174, 45,102,101,149,101, 73,131, 98,101,166,243, 69, 96, 86, 86, 95, 42,142, 89, 25,237,190,164,122,127,129,117, 84, 89,233,172, -148,190,244, 34,218,124, 9,237,231,185,113,139, 99, 86, 70, 95, 42,142, 89, 25,237,254,239,192,172,140,190, 84, 18,102,101,180, -251,210,234,254,223,170,153,178,108, 23, 22, 17, 46, 82, 2,249,124,106,251,208, 66,188,152,138, 20,218,139,144, 23, 17, 72,178, -178, 9,209,139, 34,155,123,246,236,161, 69, 76,255,165,199,172,228, 58,154, 85,132, 89,153, 43,155,118,149, 85, 71, 47,162,189, -219, 98, 86, 22,126,113,156,202,168,167,146, 48,159, 55,189,165,164,179,210,243,254,188,237,254,239,194,172,228, 58,170,148,190, - 84, 12,179, 93, 37, 47, 6,218,217,220,207,170, 76,204,202,234, 75, 37,164,243,185,235,169, 36,204,231, 77,111, 41,233,172,244, -188, 87,198, 28,242,162,112,255, 41,141,214,173, 8, 66, 41, 83,114,155, 40,114, 88,106,189, 42,164,209,122,145, 36,235, 69, 77, -106,149,137,253, 34,180, 58, 47, 74,243, 86, 89, 90,157, 18,112,163, 42, 17,238, 88,101,167,179, 40,125,228,101,118,122,231,236, - 75,206,190,244,255,169, 47,149,212,110, 34, 35, 35,103,237,217,179,231,179,151,169,157, 23,199,172, 44, 66, 84, 66,222,159,171, - 47, 21,255,110,101,244,165,114, 48,201,139,200,127,101,247,167,191, 83,163, 85, 26,201, 42,237,153,224,101,201,128,165,145, 84, -242,202, 4,149,172,129,121, 97,249,174,228,116,182,123, 17, 26,194, 23, 32,149,158,206,162,149,242,103, 47, 32,239,255,150, 50, -117,246, 37,103, 95,122,233,250, 82,177, 54,217,174, 18, 53, 69,149,170,121, 46,142, 89, 25,191, 97,139, 81, 89,109,244, 69,231, -189, 50,251,210,139,168,251,127,155,252,223, 0, 44,215, 33,254,211,200, 76,208, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +137, + 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, + 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111, +116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222, +244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, + 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123, +163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17, +224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7, +190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, + 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127, +230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, + 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, + 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153, +178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, + 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, + 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, + 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228, +228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, + 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, + 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0, +176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104, +131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68, +160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, + 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61, +112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33, +193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70, +186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, + 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, + 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18, +129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81, +194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, + 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218, +100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, + 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, + 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221, +149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25, +119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10, +149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227, +169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, + 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217, +124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, + 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, + 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83, +217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76, +111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53, +113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140, +105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76, +199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, + 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167, +185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103, +183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222, +154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23, +103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157, +155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, + 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, + 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, + 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246, +178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14, +133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209, +220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, + 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23, +152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, + 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145, +188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49, +131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201, +107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43, +205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, + 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107, +129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, + 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102, +210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, + 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97, +215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251, +179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, + 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, + 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, + 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242, +207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, + 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156, +187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221, +189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, + 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5, +143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, + 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30, +190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208, +167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, + 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 3, 40, 76, + 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183, 87,114,119,201,165, 55, 18, 72,161, 67, 0,105, 10, 72,239, 66, + 40, 22, 4, 17, 69,108, 63,105, 22, 4, 65, 17,165,131, 34, 85, 69,196, 6, 40,210, 68, 16, 80,138, 72,239, 69,122,135, 0,233, + 61,151,235,109,231,247, 71,110,207,203,113, 45, 16, 80, 96,222,247,237,119,183,237,237,204,206,236,236,219, 55,141, 33,132,128, +130,130,130,130,130,130,130,130,162,242,193,210, 91, 64, 65, 65, 65, 65, 65, 65, 65,241, 31,193,134, 13, 27, 42, 98,129,117,246, +151,211,190,180,251,175,115,222,197,184,147, 74,228,108,103,231,252,248, 62, 9,103,187,255, 42,167, 16,223, 10,240,118,174, 72, + 62,170,172,251,233, 20, 78, 82,217,225,188, 91,156,149,245, 28,185, 9, 39,185, 11,233,254,241,125, 18,206,118,255, 53, 78,215, +252,227, 39,111,133, 56,253,204, 83, 21, 13, 39,169,236,112,222, 45,206, 59,125,142,188,132,147,220,105, 94,242,144,246, 31,227, + 33, 1, 33, 4,220, 93, 20, 89,126, 35, 53, 53,149,113,226,103,254,171,156,206,247, 65,224,175,204,176, 86, 34,118, 84, 54,167, +203,253,172, 44,124,156,154,154,202,108,216,176, 97, 39,128,118,149, 25,247,202, 72,119,151,184, 86, 10,239,109,136,172, 10,113, + 86, 86,190,191,219,156,149,245, 44,185,114, 86, 70,190,119,151,238,119, 49,141, 42, 43,156,149,242, 44,221,141, 60,239, 38,255, +220, 49,175, 43,103,101, 60, 75,174,156,149,145,239,239, 5,103,101, 60, 75,238, 56, 43, 35,223,123, 74,251,135,205,160, 98,111, +231,166,221, 69,167,172,253,127, 89, 16,221, 45,177, 89, 1, 7,230, 95,231,172,228, 52,250,216,206, 89,153, 95, 55,237, 43, 43, +141,238, 70,126,119,230,172, 44,126, 87,158,202, 72, 39,119,156,119, 26, 94, 15,225,172,244,184,223,105,190,191, 87,156,149,156, + 70,149,242, 44,185,112,182,175,228,143,129,246, 78,235, 31, 87, 38,103,101, 61, 75,110,194,121,199,233,228,142,243, 78,195,235, + 33,156,149, 30,247,202,120,135,220, 45,222, 7, 26,119,171,250,172,178, 57, 43,200,253, 64,113, 86,176,122,166,243, 93, 72,251, +127, 53,156,149,201,233, 26,198,202,172,238,185,155,225,172, 76,206, 10,132,245,129,227,188,223,210,253,191,120, 63, 61,241,221, + 73,181,148, 39,119,244,110,132,179, 50, 57,253,228,126, 32, 56,239, 32,237, 31, 40, 84,184,234,240, 94, 8,184, 74,254, 50, 65, + 37, 59, 48,119, 83,184, 86,102, 56,219,223, 13,135,240, 46,160,210,195,105,255, 82,254,232, 46,196,253,126,185,167,244, 89,162, +207,210,127,238, 89,114,201,147,237, 43,209, 41,170, 84,231,217,149,179, 50,174,225,204, 81, 89,121,244,110,199,189, 50,159,165, +187,145,246, 20,119,224, 66, 80, 78,202, 73, 57, 41, 39,229,164,156,148,243,161,229,124,224, 64, 8,161,195, 59, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,220, 71,240,218, 70,171, 74,149, 42, 27, 20, 10, 69, 13, 79,251,181, 90,109, + 86, 86, 86, 86, 7,122, 27,255, 61,208, 52,162,184,143,192,226,159, 94,206, 60, 0, 98, 95, 40, 40, 40, 40, 30,104,120, 20, 90, + 50,153, 44,249,220,185,115,181,120,158,135,205,102,131,213,106,117,252,154, 76, 38,180,109,219,182,194, 13,233,163,163,163,119, +137, 68,162,196,138,156, 99,179,217,110,228,228,228,180,246,114,200, 62, 0,201, 12,243, 79,155, 64,225,191,167, 95, 0,153, 22, +139,165,137, 55, 78,134, 97,146, 93,249, 60,112, 9,255,189,114, 6, 7, 7, 31,225, 56, 46,222, 29,151,167,255, 60,207, 95,205, +203,203,107,117, 47,211,232, 97, 70,116,116,244, 46,142,227, 42,156, 63,179,179,179, 61,230,207,216,216,216,227, 44,203, 86,169, + 0,165,136,231,249, 11, 89, 89, 89,173,189, 8,145,125, 0,146,189,145,184,230, 39,134, 97,210,109, 54, 91, 51, 95,207,145, 55, + 46, 55,121,212, 23,167, 67,100,113, 28, 55, 35, 42, 42,234, 13,157, 78,103, 0, 64, 68, 34, 17,113, 10, 27, 0,192,106,181,230, + 21, 23, 23, 55,160, 57,145,130,130,226,161, 16, 90, 60,207,179, 70,163, 17, 23, 47, 94,132,135,249, 16,109,183,113,189, 90, 71, +255,220, 26, 21, 20, 21, 13,171,217, 12,101, 68,164,131, 59,231,236,105, 88, 45,102, 88, 77, 38, 84,107,222, 66, 8, 3,234,213, +171, 39,242,193, 25, 63,115,230,204,168,160,160, 32, 24, 12, 6, 24, 12, 6, 24,141, 70, 24, 12, 6,152, 76, 38,152, 76, 38,152, +205,102,152,205,102, 88,173, 86, 24,141, 70,108,219,182,205,102,177, 88,188,114, 78,157, 58, 53, 74,165, 82, 57,248,132, 69,224, + 20,120, 45, 22, 11, 12, 6, 3,182,111,223,238,149,147,227,184,248,204,204,204, 40,137, 68, 2, 66, 8,120,158, 7, 33,164,220, +226,138,234,213,171,155,189, 5,242, 46,165,209,195,140, 90, 83,151,111,140, 10,150,203, 96,229,121,164, 54,170,238,216,113,245, +155, 85, 32, 86, 27,120,171, 21, 53,135, 15,114,108,175, 91,183,174,215,252, 73, 8, 73,152,186,124, 99,136,191,156, 5, 5, 5, +250, 58,117,234,100,162,108,112, 63, 79, 66, 43, 94,175,215, 71,217,249,111, 17, 68, 44,203,150, 91, 54,111,222,140,212,212, 84, + 95,113,143,127,251,237,183,163, 44, 22, 11, 76, 38, 19,140, 70, 35, 44, 22, 11,172, 86,171, 99,177,217,108,142,197,100, 50,225, +224,193,131,254, 58, 89, 51,187,116,233, 50,100,227,198,141,202, 95,127,253, 85,153,152,152, 8,137, 68, 2,145, 72, 4,145, 72, + 4,150,101,193,113, 28, 30,123,236, 49,134,102, 65, 10, 10,138,135, 70,104, 25,141,198,107,141, 27, 55, 38,246,255,113, 50,153, + 76,226,242,149, 91,165,102,205,154, 23, 92,207,243, 85, 93, 21, 20, 21,141,113, 85,195, 0, 0, 19,174, 23, 56, 94, 16,159,180, +122,196,113,204,164,140, 18, 0,128, 92, 46, 7,227,252, 25,237, 1, 74,165, 18, 93,186,116,129, 84, 42, 69,179,102,205, 32, 22, +139,221, 46, 18,137, 4, 98,177,216,231, 77, 97, 24, 6,129,129,129,152, 56,113,162, 32,146,160, 12,144, 97, 68,171,102, 8, 0, +193,215,167, 47,193,196, 19,112, 28,231, 88,252,225,148, 72, 36, 56,117,234, 20, 56,142,131, 72, 36,114,252, 10,255,215,175, 95, +143,103,158,121, 6, 28,199, 65, 46,151, 3, 62, 70, 14,118, 78, 35,147,201, 20, 43,149, 74,205, 0, 4,113, 38, 97, 24, 38,230, +118,210,232, 97, 70,176, 92,134, 23, 23,174, 5, 0,220,156, 51,220,145,118, 7,135, 78,112, 28,147,240,218,179, 96, 24, 6, 98, +177, 24, 44,203, 86, 26,103, 97, 97,161,126,192,128, 1,123,130,130,130, 54,171,213,106,248, 16,112,184,121,243, 38, 56,142,243, +152,223, 89,150,197,236,217,179,113,249,242,101,191,226,110, 48, 24,176,120,241, 98,216,108,182,114,188,194,127,215,109,126,138, +172, 41, 93,187,118, 29,180,113,227,198, 80,134, 97,240,249,231,159, 67, 34,145,160, 71,143, 30, 8, 15, 15,199,150, 45, 91, 32, +145, 72, 48,102,204, 24,154,249, 40, 40, 40,188,149,121, 98, 0,143, 0,136,180,155, 8,165, 0, 66,156, 14,201,179,255, 70, 10, +235, 12,195, 28,118,195,211,220,126, 76, 30,195, 48,135,157,214, 77, 0,164,110,182, 23, 0,144,219, 23, 35,202,220,255, 20,167, +235, 8,231,193,211,117, 57,160,108,254, 33, 0, 59, 0,180, 79, 77, 77,221, 9, 0,217,217,217, 79,100,103,103, 3, 0,146,147, +147,207, 93,184,112,161,142,160,121,236,213, 83, 18,171,213, 90, 75,168,170, 18,220,162,206,157, 59,123,253,194,183,154,205,183, + 8, 16,119, 90,202, 93,117,133, 39, 1, 99, 54,155,241,236,179,207, 2,128,199,151,142,243,226,135,118,131,201,100, 2,199,113, +168, 93, 53, 18, 31,118,107,140, 71,137, 5, 90, 13, 3,107,137, 22,125, 2, 45, 56, 87,175, 9, 22,221,200,195,117,181, 6, 28, +199,249,197,201,243,188, 71,145, 37, 18,137,176,112,225, 66, 12, 24, 48, 0, 34,145,200, 47, 62,231, 52, 74, 74, 74,218,120,225, +194,133,112,134, 97,140,246, 52,146, 89,173, 86,149,213,106, 13,183,217,108,225, 21, 73,163,135, 25, 86,158,119,155, 15, 61,229, + 89,127,210,201, 31,206,194,194, 66,125,106,106,234, 1,153, 76,182, 36, 58, 58, 58, 51, 61, 61,221,167,208,114, 21, 63,174, 31, + 21,159,125,246, 25,230,207,159,143, 14, 29, 58,248, 21, 78,163,209, 8,134, 97,176,104,209,162, 91,246, 77,158, 60,249,150,235, +249,224,100, 0,176, 85,170, 84, 25,250,199, 31,127,168,132, 99, 35, 34, 34, 32, 22,139,209,160, 65, 3, 4, 5, 5, 97,207,158, + 61,176,217,108,126, 63,151, 20, 20, 20, 15, 46,220,105, 17, 39,180, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251, +246,237, 91,206, 48,204, 6,167, 50, 49,213, 94,190,110, 16,214, 9, 33,205,157, 69,143, 93,172, 69, 50, 12,179, 65, 56,222,121, + 93,248, 37,132,116, 6, 32, 21,214,199,141, 27,151, 50, 99,198,140,105, 99,199,142,125,127,250,244,233,146,113,227,198, 53,156, + 49, 99,198, 52,225, 58,238,194,225,206,209,242, 58,247,148, 80, 69,117,254,252,121, 79, 85, 84,206, 47, 0,175,165,165, 50, 34, +210,225,100, 77, 74, 8,119,108,159,152, 94,236,120,129, 45,104, 90, 3, 74,165, 18,221, 38,125,234,151, 83,100, 50,153,144,155, +155,235,112, 25,124, 45,254,114, 42,228, 1,216,246,118, 3,220, 44,144,226,227,253,133,216,248,247,101,136,197, 98,116,175,215, + 0, 79, 72,130, 48, 62, 65,138,183, 47,165,193, 66,252,107,211, 75, 8,113, 43,176,132,255, 66, 21,138,191, 66,203, 37,141,110, + 26, 12,134,130,139, 23, 47,234,249,178, 23,187,156, 16, 18,202, 48, 76,169,221,229,138,245, 55,141, 30,102,164, 54,170,238,112, +157, 14, 6,117,114,108,127, 70,123,202,145, 38,163, 22,126, 2, 0,232,208,228, 49,159,207,131, 63,156, 5, 5, 5,250,214,157, +218,239,180,233, 77, 63, 12, 26, 52,232,218, 95,127,253, 37,247, 39,172,238,132,150,224,218, 10, 34,139,227, 56,152, 76, 38,191, +226,110, 50,153, 60, 62, 31, 18,137,228,118, 28, 45,104,181, 90,211,186,117,235,176, 96,193, 2,132,135,135,163,107,215,174,136, +141,141,197,170, 85,171, 64, 8,193,240,225,195, 33,151,203, 5,247,154,102, 64, 10,138,135, 27,222,180,136,108,198,140, 25,211, + 92,133,140,243,186,179,128,114, 17, 83,206, 98, 45,197,199,251,127,131,171,120, 18,174,203, 48,204,134,233,211,167,167,250, 8, + 71,158, 39,161,229,117, 72,124,163,209,120,173, 81,163, 70,126,169, 9,157, 78,151,237, 75,108,184,251,170,119,118, 9, 2, 3, + 3,161, 84, 5,130,245,179,220,181, 88, 44, 14,161,178,117,235, 86,200,229,114,244,232,209,227,142, 28, 45,179,217, 12,169, 68, + 12, 54, 34, 26, 47,206,249, 11, 5,165,122,199, 11,102,199,213,107, 56,150,147,139,183, 91,118,130, 82,158, 11,141,201,228,151, +243,198,243,252, 45, 34,139,227, 56, 60,251,236,179, 14, 55,193,185,221, 10,188, 84, 29,134,135,135, 31,225, 56, 46,222, 41,141, + 2,146,147,147,129,127,218,245, 48, 60,207,107, 66, 66, 66,126, 1, 80,133, 16, 18, 15, 32,200,159, 52,162,112,159, 63, 93,183, +243, 46, 78,213,237,112, 22, 20, 20,232, 83, 83, 83, 15,216,244,166, 31, 50, 50, 50, 14, 0, 8,120,244,209, 71, 43, 44,180, 4, +129, 37, 22,139, 49,123,246,108,204,159, 63,223,177,223, 95,161,101,181, 90,203, 9,168, 75,151, 46,149,187,150,171,176,243, 81, +109, 74, 80,214,187,144, 79, 78, 78,118,156, 19, 19, 19,131,144,144, 16,240, 60, 15,158,231, 17, 16, 16, 0,185, 92, 14,137, 68, + 66, 51, 29, 5, 5,133, 55, 45,162, 31, 59,118,236,251, 12,195,108,176, 59, 75,167,189, 8, 42,119,218,163,185,139, 88,203,243, +112, 92,170, 59,177,229,252, 95,192,184,113,227, 82, 92,195,225,174,186,210, 81,170,186, 12,187, 95, 14,206, 85, 84,149,245, 18, +243,246, 34, 11, 12, 81, 65,174, 84, 66, 36, 98,193, 48, 12,241,197,101, 54,155, 29, 5,255, 27,111,188,225,181,221,138,191,237, +169,204,102, 51, 88, 78,132,172,152, 36,216,216,221,142,115,133,133,229,196,184, 30, 83, 7,162,243,199, 33,246,243,133,235,234, +104, 13, 31, 62, 28,139, 23, 47, 6,203,178,142,123,194,113, 28,106,214,172,137,107,215,174,121,229,226, 56, 46,254,250,245,235, + 81,206,247, 81, 16,177,132, 16,216,108, 54, 84,175, 94,221,112,241,226,197, 55,233,163,123,103, 34,203,211,118,155,141,247,219, +133,113,119, 92, 65, 65,129,190, 95,191,126, 59, 75, 74, 74,126,168, 95,191,254, 37,148, 31, 2,193, 39, 31,199,113,229, 4,150, + 32,178,230,205,155, 87, 78, 20, 89, 44, 22,191, 62, 4, 44, 22,203, 45,130,103,214,172, 89,229,126, 1,160, 85,171, 86,126, 57, +195, 0, 8,203,178, 68, 34,145,160, 75,151, 46,104,216,176, 33,126,253,245, 87,240, 60,143, 97,195,134, 65, 46,151, 99,238,220, +185,176, 90,173,152, 57,115, 38,117,180, 40, 40, 40,188,105, 17,227,244,233,211, 79, 79,159, 62,221,225, 44,185, 58, 90, 30,222, +187, 61,237,162, 42, 82, 16,105, 0,140,238, 4,145, 59,151,204, 85,128, 57,111,155, 49, 99,198, 52,215,112,184, 86, 87,150, 19, + 90,247, 10,217,103, 78,225,211,199, 27, 3, 40, 95, 93,184,240,177, 58, 80, 6, 42,161, 12, 10, 68,191,245,187, 1,192, 94,232, +143,245,203,209, 18,132, 86, 65, 65,129, 87,145, 85, 17, 71,139,149,114, 88, 29, 95, 4, 34, 21,131, 51, 89,202, 9, 45, 17, 39, +198,205,240, 36,176, 98, 9, 56,155,213, 47, 78, 66,200, 45, 85,133,131, 7, 15, 6,195, 48,142, 30, 98,141, 26, 53,114,230, 98, +124,189, 28, 71,135,149,181,193,115,173,142,157,153,111,160, 79,236,237,228,207, 35,223,224,220,154,161, 0,128,214, 90,173, 35, + 45,166, 54,250,167,239,192,156, 83, 59, 29,238,227, 36,188,123, 91,156, 5, 5, 5,250, 71,235,166, 28,144,132, 5,255,112,227, +198,141, 3, 0,216,254,253,251,135, 52,106,212,200,175,103, 82,232, 92,225, 42,178,156,157, 44,225,215, 71, 15, 91, 39,225,104, +243, 75, 64, 9,213,136,126,228,121, 34,228,109,149, 74,133,192,192, 64, 71,143,219,128,128, 0, 40, 20, 10, 71,251, 78, 63,133, + 27, 5, 5,197,195,139, 80, 65,232,216,197, 82, 57,167,201,222,182, 42,213,121,221,157,227,101,119,160,118,249, 40, 95, 55,218, + 5,154, 91, 8,206,154,203, 57, 27, 60,137, 52, 78, 80,144,206,191, 49, 49, 49,191, 7, 6, 6, 38,249, 27,251,138,244, 98,179, + 89,204,183, 56, 91, 12,195, 32, 48, 40, 16,242, 64, 37,228, 65,129, 30, 93, 47,111, 66, 75,112,138,132,151,206,146, 37, 75, 16, + 24, 24,136,151, 94,122,169,194,109,180, 28, 66, 75,194, 98,139,108, 59, 68, 82,174,156,200,226, 56, 14, 34,177, 24,217,129,177, + 96,197, 98,112, 86,255, 92,178,146,146, 18,112, 28,135, 15, 63,252,208,241, 5,239, 44,178, 42, 18,103,111, 96, 25, 70,112,183, +100, 53,106,212,120,151, 97,152, 4, 0,137, 90,173, 86,150,149,149,213,145, 62,175, 94,148,129,205,114,139, 11,229,201,125,189, + 93, 78,193,201,146,132, 5,255, 80,167, 78, 29,135,147,165, 80, 40,132,222,166,190,211,152,101,221,138, 44,215, 30,130, 28,199, +149,229,101, 31,189, 35,157, 29,173,233,211,167, 59,120,157,157, 44, 1, 21,121,142,132,176,238,220,185, 19,199,142, 29,195, 27, +111,188, 1,185, 92,142,249,243,231,195,106,181, 98,242,228,201,144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,156, 22,113, + 65,158, 75, 59, 40,198, 69,212,228,185, 19, 88,206,213,132,194,127,134, 97, 44,110,120, 77, 46, 85,138,174,219,133,223,130,233, +211,167,255, 37, 56, 89, 78,219,203,133,195,167,163, 37,147,201,146, 46, 94,188,232, 24, 8,211,219,175,201,100, 66,135, 14, 29, +252,118,198,132, 94,135, 28, 39, 42, 39, 44, 20, 65,129, 80,168,130, 32, 15, 12,116, 21, 28,140,175, 66, 92,248, 34,118, 22, 90, + 31,125,244, 17, 56,142,195,226,197,139, 1, 0,239,190,251,174,223,109,180, 4, 78,216, 24,164,147, 43,104, 60,231, 25,152,126, +180, 32,103,239, 9,112, 28,135,168, 22, 79,128,127,244, 25,232,228,129,224,108, 86,191,123, 29, 22, 22, 22,226,218,181,107, 16, +137, 68,120,231,157,119,202,141,117,228,218,147,109,235,214,173, 62,227,238,206,201,250,232, 70,161,131, 71, 46,151,179, 39, 78, +156, 72,226,121, 62, 89,175,215,215,104,213,170, 21, 79, 31,101, 31,162,136,183,250, 37,170,252,205,159,174,156, 66,155,172,146, +146,146, 31,110,220,184,113, 16, 0, 59,104,208,160, 16,133, 66,129,111,191,253, 86, 7, 64,186,106,213, 42,185, 47, 81, 36,228, + 27, 95, 34, 75, 44, 22,151,229,101,127,226, 78,202, 15, 89,226,171, 97,188, 63,121, 94, 8, 43,195, 48,176,217,108,144,203,229, +229,156,172,128,128, 0,200,100, 50,154,241, 40, 40, 40,124,149, 37,135,253, 46,199, 9,105,238, 36,170, 14,223, 14,111, 69,174, +231, 11,156, 39,161, 97, 52, 26,113,246,236, 89,127,121,252, 30, 24,179,106,179,199, 48, 41,163, 4, 12,195,224,235, 86,245,161, + 84, 5, 66,161, 84,226,233, 95,119, 58, 10,238, 83,211,222,133, 76, 25,136, 42,109,186,250, 85,144, 11, 85,135,206, 66,171,184, +184, 24, 98,177, 24, 83,166, 76, 1,203,178,152, 57,115, 38,226,226,226,144,149,149,133, 85,171, 86,249,229,104,137,108, 34,196, +190, 80, 23,138,193,193, 80,189,208, 22,161, 93, 62, 66,134,137,195, 62,131, 2,109, 13,103, 32,221, 50, 15, 38,222,230,119, 15, + 44,171,213,138,157, 59,119,186, 54,120,119,180,169,178, 90,173,176, 88, 44, 48,155,205,152, 57,115,166, 63, 61, 60,111, 73, 55, +225, 30,218, 7, 65, 21, 93,184,112, 33,146, 16, 18, 6, 32, 24, 64, 62,125, 92,189, 35,182,197,112, 68, 54,251, 31, 0, 96,253, +244,151, 29,219, 63, 60,245, 79,254,156,253, 99,217, 4, 0,117, 18,187, 86,136,179,160,160, 64,223,189, 67,171, 93, 6, 94,252, +125,131, 6, 13,202, 57, 89, 1, 1, 1,140,125,221, 47,187,140,101, 89,136, 68,162, 91,170, 11, 61,137, 45,127,218,104, 89,173, + 86,199, 64,162,222,218, 51,222,142,163,245,242,203, 47, 35, 54, 54,214,225,100, 77,154, 52, 9,114,185, 28,227,198,141,131,197, + 98,193,188,121,243,104,230,163,160,160,184,231,162,236, 94,192,109, 73,106, 48, 24,210, 26, 54,108, 8, 15,251,226, 2, 2, 2, +196, 46,145,170, 82,179,102,205, 11,110,170, 16, 59, 3,216,230,174, 80,103, 24, 6, 65,170, 32, 4, 4, 42,161,112,113,177, 2, +130, 84,144, 5, 6,130,149,184, 45,204,111,225, 20,218,150, 56, 11, 45, 97, 41, 41, 41,129, 88, 44,198,130, 5, 11,160, 82,169, + 96, 52, 26,125,114, 10, 47, 29,145, 72, 4,221,205, 82,156,155,182, 13,210,128,125,168,209,117, 0, 98,197,114, 72,246,252, 2, +189,205,226,107,192,210, 91, 56,107,213,170,133, 9, 19, 38,220, 50,172,131, 39,196,197,197,249,140,187,171,147, 53,187,126, 53, + 72,164, 18,140, 58,115, 19, 70,163,145, 25, 48, 96, 0, 15, 64, 15, 32, 79,175,215,223,240,231,126, 86, 2,238,123, 78,111,189, + 98, 5,240,196,230, 78,192,184,229, 20,156, 44, 3, 47,254,254,218,181,107,130,147, 21,172, 80, 40,240,213, 87, 95,233, 0,176, +147, 39, 79, 86, 36, 36, 36,136,252,201, 75, 34,145, 8,115,230,204,113,219, 38,203,157,232,170,200,115,228,124,110,187,118,237, +220, 14, 88,234, 65,188,221,194, 41,132, 53, 60, 60,220,225,100,217,108, 54, 71,111, 67, 97,244,121, 47, 31, 21, 52,127, 82, 78, +202,249,240,112, 62,144,112, 91, 2,103,101,101,117,247,116, 66,245,234,213, 47, 94,188,120,177,166, 48, 21,135,189,224,148, 24, + 12,134, 90,173, 90,181,242,105,237,240, 60, 15,153, 76, 6, 66, 8, 58, 78,152, 1,134, 5, 88,148,127,137, 69, 61,222, 9, 34, + 17, 7,190,108,170, 15,159,189, 14,245,122,125,185,151,131,187, 69,163,209,192,104, 52,250, 61,154,183,193, 96, 40, 55, 4, 3, + 67,120, 92,255,115,229, 45,189, 15,133,197,223,118, 59, 1, 1, 1,229,170,126,124, 56, 86,140, 63,142,150,115,213,163, 68, 42, + 1, 39, 17, 11,142, 86,233,165, 75,151,250,209,108,238, 63,132, 14, 11, 0, 80,187, 85, 15,240,188, 13,196,102, 43, 55, 77, 82, +221,164,238,224,137, 13,102,139, 14, 70,163,209,215,176, 39, 76,126,126,190,190, 95,191,126, 59, 1,124,215,167, 79,159, 11, 40, + 27, 93,152, 4, 6, 6,202,196, 98, 49, 15,160, 16, 0, 41, 42, 42, 10,206,200,200,224, 13, 6, 67, 53, 95,225,220,184,113, 35, +206,158, 61,139, 54,109,218,148,155, 14, 74,112, 69,157, 71,119,247, 39,127, 10,213,229,238, 70,132,247, 36,228,252,133, 72, 36, + 66,112,112, 48, 36, 18, 9,166, 76,153, 2,137, 68, 2,133, 66, 1, 0,152, 55,111,158, 99,240, 85, 10, 10, 10,138,135, 70,104, +249, 42, 55,189, 84, 43,122,173, 66,180, 90,173,233, 9, 9, 9, 21,186,152,205,102,203,241, 33,220,210, 87,173, 90, 37,113,118, + 33,124,253, 18, 66,114,124,188,108,211,215,175, 95, 47,113,231,110,120,154, 96,218, 23,167,205,102, 75, 79, 76, 76,244,232,152, +184,131,197, 98,201,240, 37, 90,103,228,233,203,137,132, 81,103,110,122,156, 59,145,194,103, 94,243,146, 63, 63,184,221,252,121, +169,118,237,218, 25, 33, 33, 33,155,162,163,163, 11,246,238,221, 27,222,188,121,243,112,231, 99,154, 55,111, 30,235,114,154, 9, +158,231, 57, 4,195, 48,233,125,250,244,113,155,231, 5,209,228, 38,127,166,251,202,243,135, 14, 29,146, 56,159,239,137,223,233, + 57, 74,247, 67,184, 94,111,220,184, 49,235,204,227, 41,239, 91, 44,150, 60,154, 11, 41, 40, 40, 30,122,161,165,215,235,111, 54, +108,216,208,234, 97,223, 13,111,231, 22, 20, 20, 52,171,236, 8, 88, 44,150, 86,247, 3,103,126,126,126,165,198,221,106,181,166, +219, 7, 40,245,122, 12,205,226,255, 94, 26, 1, 64,110,110,238,163, 0,160,213,106,225,107, 90,157, 10, 8,194, 74,207,159, 86, +171,181,213,221,184,167,133,133,133, 45,105,206,162,160,160,160, 66,171, 2,160,147, 17,255, 55,112, 55, 68, 43, 5, 5, 5, 5, + 5, 5, 69,229,130,165,183,128,130,130,130,130,130,130,130,226,238,128, 65, 89,207, 1,119,168, 72,111,130,206,183,113,237,109, +148,147,114, 82, 78,202, 73, 57, 41, 39,229,124,232, 56,125,113, 63, 48,189, 25,239, 69,123,233,206,148,147,114, 82, 78,202, 73, + 57, 41, 39,229,164,156, 15, 35, 8, 33,180,234,144,130,130,130,130,130,130,130,226,110,129,163,183,224, 95,131, 8, 21, 24, 81, +223, 15,213, 28, 10,192,211,132,113, 38,134, 97,138,110,131,147, 1, 32,177, 47,194, 64, 71, 22, 0,102, 0,102,134, 97,136,111, +142,143,217,204,204,208, 20, 98, 19, 55, 39, 12, 35,230,121,252, 93,173, 90,213,227, 12,243,132, 9, 0,148,209,117,235, 5, 42, +229,157,141,102, 83,146, 76, 44, 61, 91,172,213,108, 53,230, 94, 76,163,217,131,130,226, 95, 65, 47, 0, 19, 81,214,172,100, 58, +128,149,244,150, 80, 80,220, 37,161, 21, 24, 24,120,132,101,217,120, 95,227,243, 8,176,207,101,150, 94, 84, 84,212,172, 2,215, +238, 23, 24, 24,216, 65, 44, 22, 63, 14, 0, 22,139,101,175, 70,163,249, 11,192, 42, 0,214,219,140,147, 10,192,179, 0, 6,218, +215,127,178, 23, 22,234,219,228,107, 24, 28, 28,188, 70, 44, 22,147,252,252,252, 22, 0, 16, 30, 30,126,192, 98,177, 48,106,181, +250,105, 0, 39, 43,200,199,138,197,226,217, 45, 90,180,104,187,123,247,238,239, 0, 44,168,164,180,148,177, 44,235, 86,160,240, + 60,159,120, 27, 34, 75, 2, 32,120,193,130, 5,225,203,150, 45,107,156,158,158,222, 0, 0,226,227,227, 79, 13, 26, 52,232,248, +136, 17, 35, 10, 8, 33, 37, 12,195,152,189,241,100,102,134,166,228,102, 95,125, 35, 39,247,236,179, 0, 16, 19,219, 96,165, 72, +196, 74, 8, 57,186, 95, 17, 49, 48,162,102,141,196,255,253,252,237, 2, 73, 98, 82, 85,108,223,119,236,145, 17,111,190,159,146, + 1,124, 70,197,214,189, 67, 80, 80,208, 17,150,101,227,189, 61,227,238,158,121,155,205,150, 94, 88, 88,216,204, 19, 39,199,113, +241,222,202, 11,119,219,120,158,191,154,159,159,239,118,168, 9,149, 74,181,159,227,184, 36,127,185,132, 95,171,213,154,238,169, +151,174, 74,165, 58, 34, 18,137,226,189,197,211,221, 62,158,231,175,230,229,229,121, 10,231, 45,113,175,140,112,222, 14,167,183, +112, 10,229, 17,128,121,225,225,225,143, 21, 20, 20, 60, 15,224,125,181, 90,221, 72, 36, 18, 33, 44, 44,236,125,147,201,116, 57, + 56, 56,248,155,146,146,146,125, 0,222, 4, 64,231, 75,165,160,168, 44,168, 84,170, 28,141, 70, 67, 4,240, 60, 79, 44, 22, 11, + 49, 26,141, 68,175,215, 19,173, 86, 75, 52, 26, 13, 81,171,213,164,164,164,132, 20, 20, 20,144,200,200, 72,215,193, 27, 61,213, +225, 54, 80,169, 84, 23,103,204,152, 97,188,118,237, 26, 49,155,205,196,108, 54,147,180,180, 52,242,233,167,159, 26, 85, 42,213, + 69, 0, 13, 60,156,219,217, 67, 97,209, 5,192,242,198,141, 27,155, 54,110,220, 72, 12, 6, 3,209,106,181,100,229,202,149,164, +126,253,250, 38, 0,203,237,199,176,126,114, 2, 64,235,152,152,152,244, 43, 87,174,216,182,110,221,106, 14, 14, 14,222, 22, 28, + 28,188, 45, 45, 45,205,118,229,202, 21, 62, 34, 34, 34, 29, 64,235, 10,132, 19, 0,158, 25, 53,106, 84, 78, 90, 90, 26,105,215, +174,221,223, 78,219, 25,248,158,231,174,179, 59, 39,139, 16, 18, 67, 8,137, 69,217, 32,151,183, 44,132,144, 88,251, 49,161,126, +114, 42,175, 94,189, 90, 53, 58, 58,122, 6,195, 48, 38, 87, 62,134, 97, 76,209,209,209, 51,174, 94,189, 90,149, 16,162,244,198, +153,126, 99,225,171,155, 54,118, 42,214, 22,157, 39,218,162,243,228,187,239,219,171, 95, 31,241,252,242,216,234, 77, 22,135,196, +167, 44, 56,123,254,210, 34, 66,200,162,191, 14, 95, 92,244,209,151,191, 47,122,114,196,220,175,194, 19, 26,191, 94,129,251,121, + 39,160,156, 0, 66, 66, 66,178,181, 90, 45, 33,132, 16,155,205, 70,204,102, 51, 49, 26,141, 68,167,211, 17,141, 70, 67, 74, 75, + 75, 29,207,121, 73, 73,137,227,127, 84, 84,148,199,231, 61, 52, 52, 52, 71,175,215,151, 43, 59, 76, 38,147,163,252,208,233,116, + 68,167,211, 17,173, 86,235, 88, 52, 26, 13,169, 82,165,202, 77, 47,225,204, 18,194,201,243, 60,177, 90,173,196,108, 54, 59,120, + 13, 6, 67,185,197,104, 52, 18,163,209, 72, 18, 18, 18,252, 14,167, 63,156, 6,131,129,196,199,199,103,122,226, 12, 11, 11,203, + 49, 24, 12,229, 56,157,227,239,202, 43,172,199,196,196,100, 87,132,211,159,112,122,187,159,118, 44,184,112,225, 2,209,235,245, + 36, 46, 46,174,224,233,167,159,182,216,108, 54,178,113,227, 70,210,184,113, 99,190,125,251,246,230,252,252,124,242,210, 75, 47, + 17, 47, 31,133,244, 57,162,156, 20,158, 77, 11,207,142, 22,195, 48, 80, 42,149, 88,177, 98,133,199,233, 56,156,255, 87,171, 86, +205,223,235, 54, 75, 74, 74,218,185,103,207, 30,121,108,236, 63, 3, 98,155, 76, 38,132,134,134, 98,216,176, 97,210, 94,189,122, +213,236,218,181,235,129,235,215,175,183, 3,112,196, 7,223, 83,145,145,145,159,127,248,225,135,209,253,251,247, 71,120,120,185, + 65,183,209,175, 95, 63, 60,253,244,211,146, 11, 23, 46, 12, 88,178,100,201,128,133, 11, 23,102,107, 52,154, 17, 0,126,241, 70, + 42,151,203,251, 84,169, 82,229,171, 61,123,246, 68, 69, 69, 69, 33, 57, 57,153, 29, 51,102, 76,205, 90,181,106,201,227,227,227, +217,172,172, 44,252,250,235,175,113,207, 61,247,220,234,156,156,156,255,153,205,230,117,126,196, 93, 26, 30, 30,254,254,255,254, +247,191, 8,181, 90,109, 61,122,244,232, 69, 97,187, 84, 42,157,220,178,101,203,230, 59,118,236,248, 17,192, 55,183,227,100, 17, + 66,212,248,167,138, 79,128, 69,216,239,143,179, 69, 8,145,254,253,247,223, 97, 45, 91,182,252,197,104, 52, 54,121,227,141, 55, +110, 76,155, 54, 77,174, 82,169, 84, 0, 24,181, 90, 93, 52,113,226, 68,211,220,185,115,223,171, 87,175, 94,167,253,251,247, 63, + 69, 8,177,216, 5,217,173,124, 12,227, 8,207,205,140, 60,236,220,199, 75, 39,140,123, 55,254,147,169, 73,215, 15,159,185,201, +115,114, 21,126,219,117, 26, 57, 5, 26,252,190,255, 12, 98,194,131, 24,137, 76,156, 18, 28, 87,191, 93, 73,198,153, 93,240, 50, + 66, 58, 69,229,128, 97, 24, 40, 20, 10,252,246,219,111,183, 76, 93,229,110, 90, 43,142,227, 16, 18, 18,226,115,118,131,128,128, + 0,108,221,186,213,237,220,139,238,166,244, 9, 14, 14,134,183,143, 13,134, 97, 16, 16, 16,128,189,123,247,130,101, 89,183, 83, + 3,185,110, 83, 42,149, 96,189,204,117, 37,112,238,218,181,203, 39,151,240, 27, 24, 24, 8,148, 85,253,123,126, 40,101, 50,236, +217,179,199, 99,156, 93,255, 7,218,231,123,245,197,185,119,239,222,114, 83,127,185, 78, 9,230,188,174, 84, 42,193,248, 32, 13, + 13, 13,109, 17, 31, 31,143, 67,135, 14, 97,213,170, 85, 97, 41, 41, 41,184,116,233, 18, 24,134,193,180,105,211,152,250,245,235, +139,179,179,179,209,166, 77, 27,172, 93,187,182,149, 90,173,166, 15, 12,197,191, 37, 88,196, 0, 30, 1, 16,137,178,102, 55,165, + 0, 66, 80, 54,147,134, 20, 64, 1, 0,185,125, 49, 2,208, 0,136,176,159,158,111, 47, 91,156, 5, 66,158,243,228,211,132,144, +230,118,110, 97,134,138, 72,167, 99,133,107,184,174,187,254,186,229,230, 0, 96,195,134, 13,194,203,172,125,106,106,234, 78,231, +200,249, 35,178,132,121,202,220, 60,211,174, 93, 52,101, 74,165,114,205,129, 3, 7,228,145,145,255,196,193,104, 52,162,180,180, + 20, 26,141, 6,165,165,165, 8, 10, 10,194,170, 85,171,228,157, 58,117, 90, 83, 90, 90, 90,203,126,211, 60,113,206,201,202,202, +138,182, 90,173,144, 74,221, 55, 81, 98, 89, 22,117,235,214,197,251,239,191,143,110,221,186,197,116,232,208, 97,142,139,208,186, +165, 43,169, 66,161,248,234,232,209,163, 81, 10,133, 2, 23, 47, 94, 68,122,122, 58, 70,141, 26, 85,149,231,121,220,188,121, 19, +151, 46, 93, 66, 70, 70, 6,150, 44, 89, 18,213,183,111,223,175,220, 8, 45,119,221, 83,223,120,251,237,183,235,132,134,134,178, +159,126,250,105,177, 86,171,253,194,190,125,194,252,249,243, 95,104,219,182,109,212, 43,175,188, 66,246,238,221,187,204,158,112, + 30,239,167,115,155, 44,123, 53, 31,236,153,239,156,203, 57,117,157,246,131, 16, 18, 3,192,200, 48, 76,177, 27, 78, 6, 64,112, +215,174, 93,223, 49, 26,141, 77,246,236,217,115,249,241,199, 31, 79, 0,144, 37,100,190,224,224, 96,229,156, 57,115,162, 83, 83, + 83, 47,116,236,216,177, 73,215,174, 93,223,201,203,203,155, 70, 8,201,115,106,179,229,224,228,121,252, 29, 19,219, 96,229,174, +253, 35,158,221,177,215, 36,121,247,205,143,110, 84,171,154, 88,242,247,197, 66,219,153,171,121, 40,213, 91,241,100,199,178, 9, +204, 91, 52,168,134,207, 87,236,193,176,183, 62, 16,255,178,114,233,211,151, 9,148,154,204, 51, 27,189,220,207, 59, 5,229,132, +163,138, 9, 98,177, 24, 79, 60,241, 4, 24,134,185,101, 46, 79,177, 88,140,253,251,247,163, 99,199,142, 16,139,197,120,249,229, +151,253,226,228, 56, 14, 93,187,118,117,204,163,232,204,231, 42, 26, 60,104,130,109,183,124, 29,114, 28, 88,150,245, 56,145,182, + 43,167,175,114, 73, 8,167, 55, 46,231,125,190,194,105,159,242,200,111,145,229, 47,167, 16, 78,142,227,208,170, 85, 43, 28, 63, +126,220,171,232,242,160, 47,203,197,189,168,168,232,197, 90,181,106,237, 90,176, 96, 65, 24, 0, 20, 20, 20, 56, 38,188, 23,137, + 68, 56,127,254, 60, 76, 38, 19, 62,254,248, 99,179, 90,173,126,133, 62, 71,148,243,110,114,122,211, 34, 0,218,142, 27, 55,174, +217,140, 25, 51,166,181,108,217,242,231,125,251,246, 45,103, 24,102, 3, 33, 36, 85,248, 29, 55,110, 92,202,140, 25, 51,166,141, + 29, 59,246,253,233,211,167,159,102, 24,102, 3, 0,184,174,219,203,146, 84, 23, 17, 23, 41,240,216,159,185,114,199,186, 91,119, +253,117,199,237, 16, 90, 0,144,154,154,202,216, 35,201, 56, 23,106,254, 10, 45,127,230,238,227, 56,110,248,180,105,211,162,189, +137, 44,141, 70,131,204,204, 76, 36, 36, 36,224,229,151, 95,142, 94,176, 96,193,112,171,213, 58,203, 11,173, 68, 36, 18,225,208, +161, 67,200,205,205, 69,195,134, 13,145,148,148, 84,238,128, 43, 87,174, 96,211,166, 77, 40, 46, 46, 70,211,166, 77,129,178,198, +221,110,209,168, 81,163,143,235,214,173,219,149,101, 89,171, 92, 46,199,223,127,255,141, 38, 77,154, 96,197,138, 21,168, 86,173, + 26, 20, 10, 5, 46, 92,184,128,134, 13, 27, 98,231,206,157,136,140,140, 68,227,198,141,173,106,181,122,119, 97, 97,225, 95,215, +175, 95,255,216, 83, 56,227,226,226, 62,122,253,245,215,165,153,153,153,252, 15, 63,252,176, 7,192, 30, 0,195, 63,248,224,131, + 33,221,186,117,139, 58,118,236, 88,201,225,195,135, 15,122, 16, 89,254, 56, 89, 86,215,151,146,205,102, 51,234,245,122,147,209, +104,180,176, 44,155,198, 48,140,201,102,179,213,242,100, 66, 12, 30, 60,184,122,126,126,254,176,183,222,122,235,154, 93,100,157, + 71, 89, 3,120, 0,128,213,106, 53,106, 52, 26,117,203,150, 45, 19,158,123,238,185,203,203,151, 47, 31, 54,120,240,224, 85, 63, +252,240,131, 6,128,222,149,176, 90,181,170,199, 69, 34, 86,162, 45, 13,187,186,122,213, 55,111,111, 90, 63,188,234,205,155, 25, + 53,195, 35, 34,181,146,192,200,204, 85, 63,125,127, 4,128, 41, 51, 79,141,147, 87,178, 33, 22,139,112,246,102, 9,218,118,239, + 39,190,124,113,106,107, 0, 27,233,183,220,221,255, 88, 20, 38,161,222,177, 99,135, 87, 71,107,255,254,253, 16,139,197,144,203, +229,152, 59,119,174, 87, 82, 65, 24, 8,110,145, 47, 49, 35, 76,142,238,205,125,226,121,222, 49,209,187,235,242,197, 23, 95,224, +173,183,222, 42,119, 13,187,216, 96,124,113,122, 10, 95, 66, 98, 34,114,115,114,202,109,243,103, 82,122,155,205, 6,177, 88,140, +197,139, 23, 35, 53, 53, 21, 27, 54,108,240,250,251,196, 19, 79,128,101, 89,226,207,253,108,213,170, 21,204,102,179, 35,204,231, +207,159,119,203,187,112,225, 66, 95,193,236, 5, 96, 98,147, 38, 77, 84, 29, 58,116,192,174, 93,187,240,244,211, 79, 27,205,102, +243, 69, 0,232,217,179,103,237, 5, 11, 22, 72,143, 30, 61,138,240,240,112,241,141, 27, 55,190, 3,109, 32, 79,113,151,225, 78, +139, 8,239,188, 25, 51,102, 76,115, 21, 49,206, 16,246, 51, 12,179, 97,250,244,233,169,206,162,200,121, 93,112,157, 92, 68, 92, +138,179, 35,229, 44,162, 60, 9, 40,151,247,173,243,241,121,110,133,150, 61, 98,237,157, 93, 32,161,240,245, 37,178,188,124, 57, +150, 67,112,112,112,143, 39,159,124,210, 33,114, 12, 6,131, 67, 96, 9, 34, 75, 88,191,112,225, 2,154, 53,107, 38, 9, 14, 14, +238, 81, 80, 80, 48,203, 15, 17,135, 42, 85,170, 32, 63, 63, 31,167, 78,157, 66, 66, 66, 2, 44, 22, 11, 54,111,222,140,146,146, + 18,136,197, 98, 72, 36, 18,152,205, 94,219,110,163,110,221,186, 79, 44, 91,182,172,217,210,165, 75,139,132, 47,186,159,126,250, + 9,132, 16, 68, 70, 70, 66,167,211, 33, 39, 39, 7,127,253,245, 23,172, 86, 43, 2, 3, 3,145,156,156, 44,237,211,167, 79,235, +137, 19, 39,138,189, 8,173, 86, 79, 63,253,116,176, 74,165,194,155,111,190, 73,204,102,243,116,251,182,143, 70,140, 24, 17,158, +150,150,102,122,245,213, 87, 15,153,205,230, 79, 5, 51,209, 89,224,120, 72, 88,143, 78,150,197, 98, 17,238,233, 53,141, 70,131, +136,136,136, 4,103,103,203,147, 24,220,187,119,111, 43, 0,162,201,147, 39, 7, 0,200,113, 14,131,201,100,130, 70,163,129, 86, +171,181,148,148,148,228,142, 30, 61,218,186,124,249,114,145,253,156,179,238,132, 22,195, 60, 97, 82,169, 20, 82, 66, 68, 31, 44, + 90,180, 40,176, 91,183,110,108, 96, 96, 32, 74, 75, 75, 85,191,255,241, 71, 96,167, 14,173,147,167,205,248,100,139, 42,190, 97, +206,222,191,175, 34, 35,187, 4, 38,139, 5,201,177,193,101,126, 24,197, 93,135,189, 35,139,195,209,114, 22, 21,187,118,237, 66, +247,238,221, 29,207,186, 68, 34, 41,231,124,249,226,228, 56, 14,221,187,119,191,197,225,217,177, 99,135, 91,247,201, 23,156, 69, +145,171, 56,114, 39,192, 88,150,245, 57, 96,160,224,230,185, 19, 91,206,174,190,139,120,243, 85,205, 1,142,227, 48, 98,196, 8, +136,197, 98,140, 25, 51, 6, 28,199,161,113,227,198,224, 56, 14, 45, 91,182,132, 88, 44, 70,199,142, 29, 43, 28,247, 3, 7, 14, +160, 73,147, 38,142, 48, 53,110,220, 24,205,155, 55, 7,199,113,104,211,166, 13,196, 98, 49,186,118,237,234, 15,231,251,165,165, +165,141, 2, 3, 3,113,225,194, 5,136, 68, 34, 48, 12,115, 9, 64, 35, 0,136,141,141,189,172,211,233,170, 27, 12, 6,188,254, +250,235,140,201,100,106, 56,102,204,152, 15, 12, 6, 3, 21, 90, 20,119, 13,174, 90,196, 9,250,177, 99,199,190,207, 48,204, 6, +193,161,114,117,158,220,173,187, 41,155, 4, 7,234,176,253, 89,109,238, 34,226,242, 24,134, 57, 76, 8,233,233,233, 92, 0, 38, + 23, 97, 85,174,234,208,185,218,208,167,163, 37, 20,190,254, 10, 45, 95, 48, 24, 12,143, 68, 69, 69,121, 20, 89,206,191, 38,147, + 9, 73, 73, 73, 48, 24, 12,143, 84,244,165, 17, 27, 27, 11,179,217,140,111,190,249, 6, 18,137, 4, 18,201, 63,250,194,100,242, +110, 22,157, 57,115,230,218,129, 3, 7,154, 52,109,218, 52,116,237,218,181,121,237,218,181,139,236,214,173, 27,228,114, 57,244, +122, 61, 44, 22, 11, 90,180,104,129,186,117,235, 34, 61, 61, 29,191,255,254,123,126,173, 90,181, 34, 14, 30, 60,200,103,103,103, + 95,247, 66,221,165, 83,167, 78, 96, 24, 6,127,252,241, 71, 62,128,195, 50,153,108,211,212,169, 83, 67, 77, 38, 19, 63,104,208, +160, 27,133,133,133,111, 1, 48, 75,165,210,249,237,218,181,107,185,109,219,182, 31,121,158,159, 91,209,140,234,122,111,181, 90, + 45, 2, 2, 2,252, 25, 74, 66, 92, 88, 88,216, 0, 0,148, 74,101, 24,128,203,142, 28,174,215,151, 19,195, 38,147,201, 16, 22, + 22,166, 4, 0,251, 57, 98, 15,156,145, 86, 43, 86, 95,191,126, 53,200,185,253, 92, 72, 72, 8, 6, 62,247, 28,251,120,171, 86, +210, 70,143, 60,210,117,252,103, 75, 87, 84, 9, 87,153,146,171,132,195, 98,179, 96,219,150,205, 60,225, 45, 91,104,177,115,111, +132,150, 32, 54, 92, 29, 45,177, 88,140,157, 59,119,222,178, 77, 34,145,224,235,175,191,246, 75, 24, 8,162,202, 83,213,153, 75, + 85, 23,227, 75,192,136,197, 98,136, 68, 34, 44, 94,188, 24, 60,207,227,237,183,223, 46, 87,157,232,204,239,151,157,231, 36, 2, +235,126,196, 3, 48, 33,125,182,204,113,190,107,120,237,231,248,229,146, 45, 88,176,192, 47, 71,171,103,207,158, 62,133,171,115, + 13,131,115,184,142, 31, 63,238,150,119,209,162, 69, 62,239,167,205,102,195,198,141, 27, 29, 34, 85,192,248,241,227, 95,151, 74, +165,209,187,119,239, 70,118,118, 54,180, 90, 45, 52, 26, 13, 90,180,104,145,204,178,236,223,217,217,217,105,103,207,158,125,146, + 62, 61, 20,247,208,209, 50, 78,159, 62,253,244,244,233,211,221, 58, 86,174,206,146, 55,231, 73, 16, 88,118, 65, 20, 41,136, 55, +148, 53,171, 57,236,235, 92, 0, 82,215,170, 67,175, 70,144,139,138,156,232,174,240,245,167,250,208, 79, 59,157, 99, 24, 6, 6, +131,193,173,192,114, 22, 7,102,179, 25,133,133,133,176,217,108,183, 61,214,151,187, 47, 89, 95, 66,235,212,169, 83, 47, 13, 25, + 50, 36, 51, 56, 56,184, 81, 94, 94, 94, 46,207,243, 29,247,239,223, 31,201,113, 28, 84, 42, 21, 84, 42, 21, 54,109,218, 4,133, + 66,129, 17, 35, 70,228,218,108,182, 93, 65, 65, 65,225,122,189,254, 68,118,118,246,120,143, 10, 70, 44,238,218,166, 77, 27, 28, + 61,122, 20, 69, 69, 69, 91, 1, 52,126,254,249,231,187, 87,173, 90,149,153, 58,117,170,225,202,149, 43,115, 1,228, 42,149,202, +101,203,150, 45,235,208,180,105,211,160, 65,131, 6, 97,231,206,157,139, 0, 24,252,141,179, 86,171, 45, 39,176,212,106, 53, 74, + 75, 75,161, 84, 42,173,126,222, 51, 49,254,233, 97, 8, 66,136, 35,109,236,110,150,144, 62,132,227, 56,161, 87,163, 39,145, 5, +165, 82, 57,121,233,210,165,114,215, 78, 10, 54,155, 13, 57, 57, 57, 80,169, 84,248,112,252,120,201,164, 81,175, 52, 17, 5, 70, +239,103, 89, 6, 38, 51, 41, 38,188,105,179, 54,167,255,110,224, 99, 90,242,220, 3, 8,194,160,119,239,222,183, 84, 23, 74, 36, + 18,108,221,186, 21,125,251,246,117,124,184, 52,109,218,212,231,199,149, 32, 12,122,245,234,229,112,134, 54,111,222,236,182,218, + 79,112,164,252, 17,132,194,177, 35, 71,142, 4,199,113,248,252,243,207,241,206, 59,239,128,101, 89,204,158, 61, 27, 44,203, 98, +194,132, 9,126,139, 76,103, 1,147,246, 73,217,111,252, 59,106, 20, 44,140, 6, 0, 4,169, 84, 66,132, 42, 84,246,112, 28,231, +112,178, 30,121,228, 17,136,197, 98,180,108,217, 18, 28,199, 57,156,172, 30, 61,122, 56,223, 71,226, 15, 39,199,113,184,120,241, +162, 35,204, 45, 91,182, 44,231,100,113, 28,135,158, 61,123,250, 19,204,105, 33, 33, 33, 19,235,214,173, 91,111,206,156, 57, 98, +145, 72,132, 78,157, 58,213,142,137,137,185,110,181, 90,195, 39, 79,158,172,112,115,142, 28, 64,163,122,245,234, 41,233, 83, 67, +113, 23, 29,173,137,110,118,133, 58,183,185,170,192,135,228, 6,231,227, 5, 14, 87,113,100,119,200,118,249,226,114,119,174, 47, +112,130,130,244,102,169,251, 35,180,236,182,179,215,139, 41, 20,138,147,185,185,185, 45,229,114,121, 57,145,229, 78,112,137, 68, + 34,100,103,103, 67,161, 80,156, 52, 26,141,149,150,136,190,170, 14, 1, 24, 46, 93,186, 52,202,105,189,115,143, 30, 61,126,216, +186,117,107,236,182,109,219,112,240,224, 65, 68, 70, 70, 98,193,130, 5, 89, 57, 57, 57, 47, 1,216,154,159,159,239,243,186,213, +171, 87,111, 16, 24, 24,136,189,123,247, 2,192, 78, 0,175, 12, 27, 54,140,177, 88, 44, 88,184,112,161, 22,192, 31, 33, 33, 33, + 27, 87,173, 90,213,164, 81,163, 70,210,109,219,182,169, 15, 30, 60,248,167,159, 34,203,198,243,252, 45, 2,203,249,158, 6, 5, + 5,249,227,104, 89,130,131,131, 79,169,213,234,126,122,189, 94, 45,147,201,130,212,106,181,209, 89, 96, 9,252, 28,199,137, 47, + 94,188,152, 9, 32, 57, 56, 56,248, 20, 60, 84,115,114, 28,215,169, 83,167, 78,156,107, 26,228,228,228, 32, 59, 59, 27,102,179, + 25, 77,155, 54,101, 68,140, 69, 84,116,243,164,203,176, 14, 84,100,221, 35, 71,139, 8,207,186,208, 75,208, 93, 79,195,205,155, + 55, 59,214, 89,150,197,247,223,127,239,151, 40,218,186,117,171,215, 6,235, 46, 85,135, 62,173,113,225,248, 47,191,252,178,108, +122, 11,187,147,197,178, 44,198,142, 29, 11,153, 76,134,169, 83,167, 98,236,216,177,224, 56,206,103,213,161,179,128, 73, 28,163, +115,254, 56, 42,123, 40,236,237,161, 24,134,113, 22, 91,140,191,226,205,155,155,231, 79, 77,128, 51,167,112, 94, 64, 64,128,199, +134,240, 46,156,222, 46,240, 27,128,171,177,177,177,123, 91,182,108, 25,124,228,200, 17,204,158, 61, 91, 98, 52, 26,171,109,219, +182,205,113, 93,119,247, 75,171,213,202,233,147, 67,113, 55,220, 44, 47,187,243, 92,218, 87, 49,206,213,120, 94,126, 93,143,135, +211, 54,103,222, 60,134, 97, 44,110,174,151,231, 70, 92,185, 94,195,249,152, 60,143,142,150,175,194,194,151,224,242,199,209,210, +233,116,127,254,241,199, 31,205,159,123,238, 57,206, 91,181,161, 86,171, 69,116,116, 52, 78,159, 62,109,213,233,116,127,250,225, +148, 85,166,208,114,197,182,220,220, 92,145,197, 98, 65,205,154, 53, 17, 23, 23, 7,131,193,128,226,226, 98, 17,128,173,126,114, + 72,148, 74,165, 8, 0,138,139,139,129,178,174,166,181,107,213,170,133,163, 71,143,162,176,176,240, 23, 0,221, 38, 78,156,216, +180, 69,139, 22,146, 21, 43, 86,232,222,120,227,141, 95, 44, 22,139, 95, 74,131,231,121,147,213,106, 77, 98, 89,214, 92, 92, 92, +156,225,124, 63,163,163,163,195,148, 74, 37,147,147,147, 99,241, 71,104, 53,106,212,232,208,141, 27, 55, 48,121,242,228,188,105, +211,166,213, 42, 45, 45, 45, 42, 41, 41,177, 58,139, 45,131,193,192, 70, 68, 68,200, 22, 46, 92, 40, 7,128, 70,141, 26, 29,242, + 36,180,180, 90,109, 85,133,226,159, 15, 99,163,209,136,236,236,108,100,103,103, 35, 39, 39, 7,165,165,165, 72, 78, 78,134, 78, +167, 75,160,197,204,191, 38,180,202, 85,159, 57, 63,223,206, 47,242,138, 60,235,206, 2,166,119,239,222,142,182, 93,130, 67, 38, + 44,171, 87,175,118,109, 96,238,151,208,250,242,203, 47, 49,114,228, 72, 4, 4, 4, 96,206,156, 57,229,170, 14, 93,197, 1,207, +243,140, 63,113, 79,122, 79,143,236,249, 97, 16,139,197, 8,127, 35,167, 92, 21,157, 27,193,225, 87, 56,167, 77,155, 86, 41, 85, +135,206,156, 9, 9,101,143,202,226,197,139,209,175, 95, 63,236,222,189,251,182,171, 14, 83, 82, 82,126,218,176, 97, 67,240,153, + 51,103,160, 86,171,145,151,151, 7,163,209,136,244,244,116,143,181, 2,246,178, 60,128, 62, 57, 20,247,184,156, 58,124, 47,121, + 43,243,122,156,143, 23,184,223, 66,203, 31, 71,203,104, 52,206,121,243,205, 55,135,117,238,220, 57, 44, 40, 40, 8,153,153,153, +183,136, 44,141, 70,131,192,192, 64,232,245,122,172, 95,191, 94,109, 52, 26,231,248, 18, 7, 22,139, 5, 81, 81, 81,200,207,207, + 7,239,161,253, 52,203,178,144,203,229,208,104, 52,128,143, 70,230,238, 94, 24,102,179, 25, 22,139, 5, 22,139, 5,102,179,185, +162, 51,114, 43,148, 74,165, 32, 60, 0, 64, 91,165, 74,149,154, 1, 1, 1,184,118,237, 26, 80,214,179,175,115,247,238,221,197, + 5, 5, 5,228,213, 87, 95,221, 67, 8,121, 29,222, 71,199, 55,237,218,181, 43, 9, 0,228,114,249, 5, 0, 72, 79, 79,183, 20, + 23, 23,151,115, 10, 21, 10, 5,233,219,183,111, 44, 33, 4,187,118,237, 74,146, 72, 36, 4,158,123, 53, 26,214,173, 91,119, 38, + 56, 56,120,249,140, 25, 51,158, 75, 77, 77, 61,221,160, 65,131, 36,173, 86,155,171,215,235,245, 6,131,129,136, 68, 34, 73,104, +104,104,192,150, 45, 91, 46,239,223,191,191,179, 74,165, 90,190,110,221,186, 51,158,156, 55,165, 82,153,174,211,233, 18,133, 52, +117, 22, 89,217,217,217, 32,132,224,234,213,171, 80, 40, 20, 55,124, 85,235, 82,220, 61, 8, 31, 85,174,206,139,235, 54,127, 69, +150,179, 48,216,178,101,139,215, 49,180,252,229,116, 22, 69,239,188,243, 14,230,207,159,127,139,163, 53,117,234, 84, 0,192,248, +241,227,253,110,163, 37,184, 87,217,243,195, 16, 51,178,176, 92,216, 1,128, 17,194, 87,177,103, 30, 28,199, 97,242,228,201,183, + 52, 82,119,174,218,243,179,138,175, 92, 56,115,115,115,193,113, 28,194,194,194, 48,112,224, 64,116,237,218,213, 81, 5, 89, 81, +222,115,231,206,237,125,239,189,247, 26,166,164,164, 96,202,148, 41,133, 33, 33, 33, 65,175,189,246, 26, 87, 92, 92,204,120,115, +180,168,208,162,160,168, 4,161, 37, 60, 96,254,246, 58,244, 80, 88,118, 70,249,177, 54, 74,116, 58,221,192, 46, 93,186,172, 93, +185,114,165,188,122,245,234, 56,119,238, 28, 10, 11, 11, 97, 50,153, 32,145, 72, 16, 27, 27,139,226,226, 98,124,255,253,247,122, +157, 78, 55, 16, 64,137, 15,206, 15,154, 53,107,246,213,172, 89,179, 2, 26, 55,110,140,194,194, 66,104, 52, 26,135, 16, 98, 24, + 6, 42,149, 10,114,185, 28,135, 14, 29,194,230,205,155,245, 0, 62,240,193,233, 78,205,193,108, 54, 59, 4,151, 31, 66,203,153, + 83, 41,184, 58, 58,157, 14, 0, 44, 85,171, 86,141, 1,128,171, 87,175, 2, 64, 90,114,114,242,196,234,213,171, 51,203,150, 45, + 35,132,144,205, 30, 68,150,131,147, 97,152, 66, 66, 72, 17,128, 24,147,201, 36, 1,128,146,146, 18,115, 68, 68, 68,148, 76, 38, +227,229,114, 57, 31, 16, 16,192,103,102,102, 90,173, 86,171, 4, 0,218,180,105, 99, 2,144,237, 50, 71,161, 51, 39, 79, 8, 81, + 47, 90,180,104,226,160, 65,131, 90,182,106,213, 42,101,232,208,161,167, 94,125,245, 85, 54, 46, 46, 46,180,180,180,212,112,233, +210,165,162,207, 62,251,172,244,192,129, 3,157,197, 98,241,245, 69,139, 22, 77, 4,160,102, 24,134,119,199,105,181, 90,255,220, +182,109,219, 75,169,169,169, 92, 70, 70, 6,114,114,114, 28, 34, 43, 39, 39, 7,117,235,214,197,254,253,251,109,102,179,121, 91, + 5,238,103,101,129,114,150,125,132, 16,225, 89,247, 36,176,132,143, 41,127, 57,157, 69, 81,191,126,253,202,185, 88, 18,137, 4, +107,214,172,113, 91,110,184,121,174,202,197,221,121,140,175,247,222,123,175,156,104,251,240,195, 15, 61, 22,103,190,238,167,192, + 83,178, 56,174,124,175, 67, 15,207,185,183,112, 10,101,167, 88, 44,198,135, 31,126,232,183,163,133, 91,219,104,221,194, 41,196, +189, 93,187,118,208,233,116, 14, 33,235,201,209,242,117, 63,109, 54,219,200,249,243,231, 19,149, 74,245,152, 90,173,126,254,198, +141, 27, 75,116, 58,221,163, 37, 37, 37, 94, 29, 45,163,209, 40,163,207, 17,229,196,221, 25,159,235,225, 17, 90,246,151, 36,170, + 86,173, 90,110,238, 44,150,101,203, 45, 21,105,103, 96,199,150,139, 23, 47, 62,245,248,227,143,255, 56,114,228,200,160,198,141, + 27,139, 19, 19, 19,161,213,106,113,237,218, 53,156, 62,125,218,186,110,221, 58,181, 78,167,123, 30,128, 63,189,206,150,158, 57, +115,102,115,183,110,221, 38,180,104,209,226,127, 31,125,244,145,168,118,237,218, 40, 41, 41, 65,104,104, 40,162,162,162,112,254, +252,121,172, 95,191,222,150,159,159,255, 21,128, 73,112, 83,135,234,235,131,223,108, 54, 99,192,128, 1,224,121, 30,115,231,206, +133, 63, 19, 42, 59,193,108, 54,155, 9, 0,198,222,158, 75,103, 31, 93, 26,151, 46, 93, 2,128,235, 73, 73, 73, 65, 0,176,109, +219, 54, 6,101,227,107,249,243,133, 79, 8, 33, 14,103,171,110,221,186,215, 92, 11, 71,193,201, 18, 92, 48, 95,225,102, 24,198, + 64, 8,201,213,233,116,221,222,121,231,157, 9, 95,126,249,229,115, 95,126,249,229, 45,199,169, 84,170,229,179,103,207,158,244, +236,179,207,230, 50, 12,227,177, 29,153, 86,171, 29,255,226,139, 47, 62,123,242,228,201,160,128,128, 0,104,181, 90, 20, 20, 20, +192,108, 54, 35, 57, 57, 25,185,185,185, 88,186,116,105,169, 94,175,255,152, 62,142,255, 14,156,133,129, 39, 87,203, 15,145,229, +209,213,249,237,183,223,220,142, 81, 85, 81, 78, 87,177,225,239,216, 86,222, 62,138,132, 97,105,220, 13, 25, 81,193,114,237, 22, + 94,142,227,240,233,167,159, 58, 6,109,117,231,100, 85,196,209, 18, 56,195,194,194,202,108,114,133, 2, 60,207,163,103,207,158, +119,194,203, 3, 24,225, 52,226,251,180,209,163, 71, 79,172, 91,183,110,109, 0, 50,231,123, 80, 65, 23,159,130,130,194,151,208, +178,217,108,233,117,234,212, 41, 87,192,249,154,204,212, 98,177,164,251,121,221,205, 90,173, 54,121,246,236,217,111, 42,149,202, +206, 58,157,174,161,189,224, 56,169,213,106,183, 25,141,198,121,168,216, 36,208,121, 0,134, 31, 56,112, 96,110,183,110,221,166, +118,236,216,241,153, 81,163, 70, 49,132, 16, 44, 92,184,144, 92,185,114,101,181,221,197,186,114, 59, 55, 41, 44, 44,236,204,247, +223,127, 31,189,118,237, 90, 88, 44, 22,204,155, 55, 15, 65, 65, 65,103, 10, 11, 11,253,165,200,221,190,125,251, 15,173, 90,181, +122, 97,255,254,253, 75, 1,156,216,185,115,231,146,214,173, 91,191,184,127,255,254,159, 0,156,254,235,175,191,150,180,104,209, +226,197,195,135, 15,175, 2,112,188, 2,133,175,195,217,178, 90,221,215, 52,122,112,178,188,113,170, 9, 33,230, 33, 67,134,140, +122,246,217,103,191, 57,124,248,240,163,197,197,197, 13, 1, 32, 36, 36,228,100,243,230,205, 15,173, 92,185,242,188,221,201,242, +213, 88, 63, 79,171,213,246,109,216,176,225, 47, 83,166, 76, 81,166,164,164,112, 53,107,214, 68, 90, 90, 26, 78,157, 58,101,253, +238,187,239, 52,122,189,190, 55,128, 34,250, 56,254,123, 66,139, 16,130,144,144,144,114, 31, 81, 66,151,255,138, 86, 23, 58,191, +152,133,169,122, 92,121, 61,113,122, 27, 54, 65, 64, 96, 96,160, 99,112, 83,127,154, 44,240,188,247,241,216, 8, 33, 14, 78, 97, +241, 67,100,249,236, 33,104,159, 2,199,111, 78,127,134,119, 80, 42,149,176, 88, 44, 14, 94, 63,122,126, 86, 84, 45,254, 6,224, + 55,139,197,114, 9, 64, 13, 42,174, 40, 40,238,162,208, 42, 42, 42,106,118,151,175,173, 54, 26,141,147,140, 70,227, 36, 97,131, +193, 96,184, 83,206, 43, 0,158,221,190,125,251,172,237,219,183, 11,245, 8,147,225,123,190, 68,175, 56,119,238, 92,170, 88, 44, +254,122,249,242,229, 45, 8, 33, 8, 14, 14, 62,144,150,150,246, 90, 69, 56,108, 54,219,144,253,251,247, 15,131,189, 45,147,217, +108, 30,178,119,239,222, 55, 81, 54, 31, 19,108, 54,219,144,131, 7, 15, 58,214, 43,248,162, 36,132, 16, 35, 33,164,138,135, 67, +140, 21,116,224, 4,103,203,180,114,229, 74, 13,128,191,241,207, 56, 89, 22,251, 98,112,169, 46,244,134,191,180, 90,109,205, 15, + 63,252,112,154, 72, 36,234,164,213,106,227,148, 74,229, 77,171,213,250,167, 78,167,251, 0,101,115, 84, 81,252, 75, 48,153, 76, + 25,117,234,212,225,220,125, 64,121,123,145,123,251,176,178,217,108,233,181,106,213,242,249,113,230,134, 51,195,139,104,184,158, +156,156,204,250,203, 37,192,108, 54,231,122, 11,103,114,114, 50, 42,202,233, 43,238, 73, 73, 73,110,227,238, 67, 16,122,140,187, +213,106,189, 45, 78,111,247,211, 27,244,122,125, 81,100,100,164,198, 96, 48,136,141, 70,163,216,106,181,150,179, 31,229,114,121, +158, 94,175,167, 15, 15, 5,197,157, 8,173,251, 28, 71, 80, 54,189, 68,101,193,120,242,228,201, 23, 28,246, 84,110,238,237,242, +184, 42, 73,141,143,245,138, 8,163, 74,119,132,236, 66, 74, 87, 73,116,249, 26,141,230, 85, 97, 69,104, 3, 66,241,239,163,160, +160,224,177,202,230, 44, 44, 44,172,244, 15,181,252,252,252,150,119, 33,238,205, 30, 86, 78,111,200,204,204,124,204,135, 16,163, + 15, 14, 5,133,159, 96,233, 45,160,160,160,160,160,160,160,160,184, 59, 96, 80,214,115,192, 29, 42,210,155,160,243,109, 92,123, + 27,229,164,156,148,147,114, 82, 78,202, 73, 57, 31, 58, 78, 95,220, 15, 76,111,198,123,209,206,177, 51,229,164,156,148,147,114, + 82, 78,202, 73, 57, 41,231,195, 8, 66, 8,173, 58,164,160,160,160,160,160,160,160,184, 91,160, 66,139,130,130,130,130,130,130, +130,130, 10, 45, 10, 10,138,251, 20,181,171, 86,173,122,182,118,237,218, 25, 0, 6,223,229,107, 13,108,209,162, 69,129, 76, 38, +219, 2,160, 54,189,245, 20, 20, 20, 84,104, 81, 80, 80, 60,208, 34,171, 97,195,134,123,206,157, 59, 87,119,219,182,109, 85,226, +226,226, 62,185,155, 23,107,214,172,217,204,221,187,119,135,253,241,199, 31, 93, 98, 98, 98,118,221,166,216,170, 93,173, 90,181, +179,181,107,215, 78, 7, 48,176,146,131, 56,184,101,203,150,133, 82,169,116, 51, 21,130, 20, 15, 1, 26, 0,104, 72,133, 22, 5, + 5, 5,197, 93, 20, 89,251,246,237, 11, 55, 24, 12, 56,119,238, 28,242,242,242,142,223,205, 11, 94,184,112,161,104,223,190,125, +136,143,143,199, 79, 63,253, 20,153,148,148,180,187,130,130,166,118,195,134, 13,247,156, 61,123,182,238,182,109,219,226,162,162, +162, 62,171,204,240, 61,250,232,163, 83,119,239,222, 29,186,101,203,150,174,145,145,145,183, 43, 4, 41, 40,254,203,144, 1,120, +129, 97,152, 67, 13, 26, 52, 56,153,146,146,114,130, 97,152,253, 0,250,225,193, 29,187,211, 63,108,216,176, 97,231,134, 13, 27, +118,210, 60, 66, 65, 65, 81, 9, 72, 73, 73, 73,209,106,181, 90,146,151,151, 71, 62,255,252,115, 18, 22, 22,102, 6,240, 39,128, +117,110,150,247, 1,168,252,228, 86,217,143,119,199,243,103, 88, 88,152,249,243,207, 63, 39, 87,175, 94, 37,103,206,156, 33,181, +107,215,214,251, 41,104,106, 55,108,216, 48, 95, 8,243,166, 77,155, 8,199,113,155, 43,243,166,168, 84,170,211,187,118,237, 34, + 87,174, 92, 33, 91,182,108, 33,209,209,209,185, 84,108, 81, 60, 32, 72, 4, 48, 51, 48, 48,176,176, 87,175, 94,228,219,111,191, + 37,235,215,175, 39,191,252,242, 11,153, 51,103, 14,233,208,161, 3,145, 74,165, 25, 0,198, 0, 8,121, 88,180, 8, 33,164,108, + 86,251, 13, 27, 54, 16, 0,237, 1, 32, 53, 53,149,138, 45, 10, 10,138, 59,197, 62,157, 78,215, 82,167,211,161,180,180, 20, 85, +171, 86,133, 88, 44,118,123, 96,110,110, 46,246,238,221,139, 17, 35, 70,156,201,206,206,110, 11,239,243, 94,134, 54,105,210,100, +223, 95,127,253, 85, 59, 40, 40,200,177,145,231,121,152,205,102, 88, 44, 22,152,205,102, 24,141, 70, 24,141, 70, 72,165, 82,200, +229,114,132,133,133,157,130,247, 42, 12,135,251,166,215,235,113,236,216, 49, 12, 26, 52, 40,175,160,160,160, 45,128, 11,149,120, + 95,106, 71, 69, 69,237, 90,186,116,105,100,114,114, 50,110,220,184,129,151, 95,126, 57,255,250,245,235,109, 42,249, 58, 20, 20, +247, 18, 99,159,122,234,169,169,209,209,209,108,131, 6, 13, 16, 27, 27, 11,163,209, 8,189, 94, 15, 66, 8, 56,142, 3, 33, 4, + 37, 37, 37,216,181,107, 23,254,250,235, 47, 99, 81, 81,209,247, 0,230, 1,184,232, 36,178, 30, 56, 45, 82, 78,104,165,166,166, + 50, 52,175, 80, 80, 80, 84, 18, 78,150,148,148, 52, 48, 26,141,208,106,181,126,157,112,245,234, 85, 12, 30, 60,248, 76,118,118, +246,227,112, 63,169,188,170, 73,147, 38, 7,119,237,218, 85,219, 96, 48, 64,173,246, 61,239,188, 84, 42, 69, 64, 64, 0,194,195, +195,247, 3,104,229,233, 75,188, 65,131, 6, 71,246,239,223, 31,166,215,235,113,252,248,113, 12, 28, 56,208, 92, 88, 88,184, 7, +128,167,192, 23,162,108, 30,213,235,110,246, 37, 0,120,211,254,133,239, 14,202,200,200,200,214,203,150, 45,147, 84,175, 94, 29, + 58,157, 14,253,250,245, 43,188,112,225, 66,115, 0,215,104,214,161,184, 15,113,225,220,185,115,181,108, 54, 27,242,243,243, 97, + 52, 26,161,211,233, 28, 66, 75, 36, 18,129, 16, 2,171,213,234,248, 48, 58,122,244, 40,182,109,219, 70,174, 94,189,250,145,253, + 89,122, 32,181, 8, 21, 90, 20, 20, 20,119, 11,181,107,213,170,117,252,247,223,127, 15,144, 72, 36, 88,191,126, 61, 62,250,232, + 35, 75, 97, 97,225,110, 87,241, 18, 29, 29,157,178,100,201,146,164,228,228,100,156, 56,113, 2, 79, 63,253,244, 7, 0,166,185, +225,124, 95,173, 86, 79, 53,155,205, 56,126,252, 56, 94,124,241,197,107, 57, 57, 57,167, 93, 69, 76, 82, 82, 82,155,207, 62,251, + 76,220,180,105, 83,168,213,106, 60,243,204, 51,186,243,231,207,183, 0,112,218, 67, 88, 63, 43, 44, 44,124,199,102,179,161,180, +180, 20,241,241,241,144, 72, 36, 94, 35,167,215,235,145,152,152,184, 63, 47, 47,239, 22,241, 22, 30, 30,190,253,198,141, 27, 29, +228,114,185, 87, 14,179,217,140,244,244,116, 72,165, 82, 24,141, 70,212,168, 81,227,123, 0, 67,104,214,161,184, 31,133,214,223, +127,255, 93,235,231,159,127, 70,147, 38, 77, 80,175, 94, 61,104, 52, 26,135,232, 50,153, 76,176, 88, 44,183,156,164, 86,171,241, +246,219,111, 95,132,189,250,252, 65, 21, 90, 66,195,180,137, 66,157,104,106,106,106, 59,154,103, 40, 40, 40,238,180,224,189,120, +241, 98,227,206,157, 59,239, 94,189,122,117, 68,143, 30, 61, 80,163, 70, 13,241,147, 79, 62, 25,169,211,233, 58, 57, 31,152,147, +147, 19,250,226,139, 47, 30,185,121,243,102,146,125, 83,115, 15,156,205,131,130,130,112,245,234, 85, 65,100, 53,131, 75, 53,163, + 84, 42,221,252,247,223,127,139,165, 82, 41, 14, 31, 62,140,193,131, 7,231, 95,187,118,205, 87,181, 92,136,201,100,130, 72, 36, + 2, 0,164,167,167,251,140,220,141, 27, 55,192,243,188,209,221, 62,150,101,101, 71,143, 30, 69,149, 42, 85,188,114,176, 44,235, + 42,232,138,105,182,161,184, 79, 97, 49,153, 76,104,214,172, 25,174, 93,187,134,163, 71,143, 58, 4, 87,126,126, 62, 50, 51, 51, +203, 29,124,232,208, 33, 28, 59,118, 12,109,219,182,117,229,121, 32,181,136, 67, 57,110,216,176,161,157, 61,114, 59,105,158,161, +160,160,168, 36,212,174, 82,165,202,174,165, 75,151, 70,198,198,198,162, 67,135, 14, 55,179,179,179,171,185, 57,110, 29, 33,164, +247,213,171, 87, 81,189,122,245,245, 0,250,220,206, 49, 9, 9, 9,121,135, 15, 31,142, 56,115,230, 12, 6, 14, 28,152,103,111, +243,229,171,237, 83, 82,221,186,117, 15,111,217,178, 37,140,101, 89,156, 62,125,218,159,170,195, 52,148,181, 47,185,238,102, 95, + 2,128, 15, 1,132,121, 56, 87, 89,171, 86,173,214, 71,142, 28,145, 48, 12,131,180,180, 52,161,234,176,153,157,151,130,226,126, + 67,223, 42, 85,170,124, 55,108,216,176,224, 22, 45, 90, 32, 61, 61, 29, 25, 25, 25, 40, 42, 42, 66,227,198,141,145,146,146,130, + 43, 87,174, 96,243,230,205, 56,118,236, 24,100, 50, 25,226,227,227, 17,184,252,103,124,205,224, 12,128,148, 7, 85,139,220,139, +185, 14, 41, 40, 40, 40,106, 75, 36,146,205,113,113,113,185,112, 63, 46, 85,232, 51,207, 60,147,105,179,217,200,149, 43, 87, 8, +202,122, 15,194,131,208, 34, 87,174, 92, 33,209,209,209, 87, 1,132,186, 57,102,112, 76, 76,204, 77,133, 66,113, 10, 21, 28,214, +161,102,205,154,121,231,207,159, 39, 55,111,222, 36,127,252,241, 7, 9, 15, 15,191, 27, 61, 2,107,215,169, 83, 39,191,180,180, +148, 24, 12, 6,178,107,215, 46,146,144,144,144, 7,218,243,144,226,254, 71, 16,128,201,201,201,201,134, 89,179,102,145,205,155, + 55,147,197,139, 23,147,169, 83,167,146, 81,163, 70,145,150, 45, 91,146,150, 45, 91,146,126,253,250,145,119,222,121,135,116,239, +222,157, 4, 6, 6,150, 0,120,242, 65,190, 41, 84,104, 81, 80, 80,252, 27, 72, 0, 48,199, 46,168,214, 61,243,204, 51,153, 70, +163,145,100,100,100,144, 53,107,214, 16,148, 13,221,224, 14,239,103,103,103,147,236,236,108, 97,104,132,171,248,103, 88,135,111, +237,188,119, 36,130, 18, 19, 19,243,142, 28, 57, 66,210,210,210,200,166, 77,155,136, 93,176, 85, 26,228,114,249, 22,181, 90, 77, + 12, 6, 3,217,190,125, 59, 29,222,129,226, 65, 68, 20,128, 5,245,235,215,183,204,157, 59,151,172, 91,183,142,124,254,249,231, +164,111,223,190,100,204,152, 49,164,127,255,254, 36, 50, 50,210, 8, 96, 6,128,224, 7,253,102,220, 11,161, 69,103, 54,167,156, +148,147,114,186, 98,243,153, 51,103,136, 0,155,205, 70, 50, 50, 50,200,150, 45, 91, 72, 76, 76,204,105,148, 31, 79,203,153, 83, + 85,175, 94,189,115,231,207,159, 39, 55,110,220, 32,102,179,217,193,113,238,220, 57, 2, 96,103, 37,132,179,118, 92, 92, 92,238, +142, 29, 59,200,249,243,231, 73, 76, 76,204,205,202,140,123, 98, 98, 98,110, 94, 94, 30,217,190,125, 59,137,140,140,244, 37,178, +104, 94,162,156,247, 51,103, 34,128,101, 77,155, 54,181,205,159, 63,159,252,239,127,255, 35, 9, 9, 9, 54,251, 71, 81,220,195, +162, 58,157, 27,195, 83, 80, 80, 80,220, 43,200, 14, 28, 56, 0,153, 76,230,216,112,226,196, 9,231,113,180, 60,141,219,160, 62, +123,246,236,227, 61,122,244,216, 61,127,254,252,122,206,189,152,118,236,216, 1, 0,198, 74, 8,219,133,140,140,140,182,221,186, +117,155, 23, 30, 30,254, 72,118,118,246,132,202,140,120, 90, 90,218, 59, 13, 27, 54,156, 86, 90, 90,170,214,233,116,253, 64,199, +206,162,120,112,145, 6, 96,208,209,163, 71, 63, 57,122,244,232, 7, 0, 8,128, 41, 0,206, 62,108, 55,130, 10, 45, 10, 10,138, +123,141,193,175,190,250,170,107, 99,241,195, 0,190,240, 34,178, 4, 20, 93,187,118,173, 85,207,158, 61,135,161,124,239, 68,161, +113,122,101,224,130,201,100,234,234,218, 83,170,146,240, 83,118,118,246, 79, 52, 11, 80, 60, 68, 56, 13,160,255,195,124, 3,168, +208,162,160,160,184,215,184, 14,224,229, 59, 56, 95, 13,247,227,108, 81, 80, 80, 80,252,231, 64, 39,149,166,160,160,160,160,160, +160,160,160, 66,139,130,130,130,130,130,130,130,226,254, 2, 3,207, 61, 7,182, 85,128,231,118,122, 52,108,163,156,148,147,114, + 82, 78,202, 73, 57, 41,231, 67,199,233,139,123, 27, 30, 16,208,225, 29, 40, 39,229,164,156,148,147,114,222, 13, 78,198,190,176, +246, 69, 88,255, 47,199,157,249, 15,199,253, 97,225,124,224,240,111, 14,239, 32, 36, 4,143,178, 46,159, 20,255, 61, 56, 63, 32, +132,166, 19, 5, 5, 69, 5,203, 14,145,211,203,214,102, 95,240, 31, 44, 75,156, 69, 1,127,135,239,165,187, 17,247,135,153,243, +129,128, 55,161,245,136, 82,169,252, 72, 42,149, 38, 51, 12, 99,211,106,181, 39,141, 70,227, 34, 0,251,239,240,154,223, 70, 71, + 71, 15, 46, 40, 40,224, 89,150, 5,203,178, 96, 24, 6, 44,203, 66, 44, 22,235, 75, 74, 74, 84,183, 67, 26,217,160,239,187, 28, +195,140,180, 17,219,162,220, 83,235,167,250,218, 78,225,253,129,145, 72, 36, 79,133,133,133,133,228,229,229, 17,150, 45,107,202, + 39, 18,137,132,137,112,173, 37, 37, 37, 63,248, 75, 22, 26, 26,122, 40, 44, 44, 44, 68, 56,159, 97, 24, 20, 20, 20, 20,231,230, +230, 62, 10, 0, 1, 1, 1,123,149, 74,101, 56,199,113, 16,137, 68, 16,137, 68,208,233,116, 5, 5, 5, 5,143,211,164,184, 63, +177,106,213, 42, 81,183,184,151,107,112, 68,223,136,101, 73, 48,207, 51, 37, 86, 70,126, 98,115,198,183,151,253, 57,191, 95,191, +126, 54,122, 23,239, 29,164, 82,233,220,232,232,232, 87, 52, 26,141,142, 97, 24,194, 48, 12, 24,166,236, 59,203,245,215,102,179, +165, 23, 20, 20, 52,243,241,178, 21, 75,165,210,217, 49, 49, 49, 47,234,116, 58,157,157,207, 45, 47, 0, 88, 44,150,244,252,252, +252,102,126,149,245,145,145,139,228,114,249,243, 58,157, 78,203, 48, 12,239,226, 30, 56,191,204,175,228,231,231,183,241, 37, 12, +164, 82,233,188,232,232,232,151,236,113,119,132,243, 78,227, 30, 29, 29,253,162, 86,171,245,139,211, 75,220,111,225,188, 27,225, +252,143,114, 62,248, 66,171,113,227,198, 63, 31, 60,120,176,150, 88, 44, 6, 0, 24, 12,134,134, 11, 22, 44,120,225,189,247,222, +155, 1, 96,220,109, 94,111, 73,155, 54,109, 6,236,218,181,139, 93,183,110, 29,219,188,121,115, 48, 12, 3,155,205, 6,155,205, +134, 6, 13, 26,200,111, 55, 34,193, 74,197,216, 99, 91,191, 14,120,164,243,171, 35,115,129,169,190,182,123, 19,152, 0,198, 3, + 72,174, 96, 16,242,236,247,229,152, 7,177,177,143,101,217, 10,113,242, 60,127,181,168,168,168,149, 23, 1, 83,233,156,118,145, +245,116,155, 54,109,130,183,109,219,198,220,188,121,147,145,203,229,224,121, 30, 54,155, 13, 22,139, 5,245,235,215,175,144, 19, + 26, 18, 18,162, 26, 59,118,108,141, 39,158,120, 2,107,214,172,193, 11, 47,188,128,214,173, 91, 95,204,205,205, 5, 0, 40,149, +202,240, 51,103,206,212, 10, 11, 11,131, 78,167, 67, 73, 73, 9,186,116,233,130,130,130,130,251,250,225,122,172,113,252, 20,134, +101, 28, 99, 69, 17,171,173,240,224,137,204,241,119,202, 27, 22, 22,118, 76, 38,147, 69,251, 84,203, 78, 47, 50,131,193,144, 83, + 88, 88,216,196,199, 41,137, 0,122,137, 68,162,154, 28,199,213, 1,144,104,181, 90,163, 1, 64, 34,145,228,136, 68,162, 52,139, +197,114,222,100, 50, 93, 2,240, 27,188, 76,128,220, 45,238,229, 26,140, 85,247, 76,169,145,239,161,168, 62,163,182,238,202,216, + 11, 10,153,110, 83,183,184,151, 87,251, 43,182,254, 69,212, 6,176, 18,101, 19, 74,255, 15,101,227, 0,221, 9,226, 0,244, 70, +217,156,143, 73,102,179, 57, 31,192, 81,148,181, 67,185, 8, 32, 33, 50, 50,242, 39,158,231,141, 5, 5, 5, 47,195,205, 68,213, + 45,154, 86, 61,194,178,108,188,224, 9,240,196,150,126,224,104,122,165,188,160, 88,150,157,151,154,154,250,210,234,213,171, 21, + 71,143, 30, 85,212,171, 87,207,241, 65,196,243,252, 45,109, 76,146,146,146,124,185, 26, 28,203,178,115,159,121,230,153,231,150, + 45, 91,166,184,126,253,186,162, 74,149, 42, 14, 78,103,177, 37,160, 74,149, 42,254,230,253,111,187,118,237, 58,104,233,210,165, +226,245,235,215,203, 35, 34, 34, 16, 30, 30, 14,137, 68,114,203,177,143, 63,254, 56,239, 59,234,236,188, 62,125,250, 12, 90,177, + 98,133,226,224,193,131,138, 6, 13, 26, 64, 36, 18,221,113,220,251,246,237,251,220,207, 63,255,172, 56,121,242,164,162,102,205, +154, 16, 76, 5, 87, 62,150,101, 81,181,106, 85,191, 56,123,247,238,253,220,202,149, 43, 21,199,142, 29, 83,212,169, 83,199,113, + 63, 9, 33,183, 29,206,255, 56,231, 67,225,104, 73,205,102, 51,118,238,220, 9,150,101, 17, 22, 22,134,193,131, 7, 99,235,214, +173, 99,183,111,223,190,225, 54,156,173,111,237, 34, 75, 12, 0,191, 60,223, 23, 87,197,192,136, 92, 19, 36, 18, 9,174, 92,185, + 2,145, 72, 84, 97,107, 81, 38,147,189, 72, 8,249, 80,151,113, 88,166,215, 91, 96,200, 60,162,144,203,229,142, 23,128, 46,211, +190, 61,235,136, 66, 46,151, 95, 17,137, 68,147, 53, 26,205, 18, 79,124, 53,107,214,252,241,244,233,211,117,221, 61,184,222,160, +211,233, 80,173, 90,181,132,194,194,194,154,238,246,139,197,226,248,235,215,175, 71, 73,165, 82, 16, 66, 28, 15,177,235,175,240, +223,108, 54,163,126,253,250,102,111,215,244,198,105,181, 90, 17, 16, 16, 0,193,141, 50,153, 76,208,104, 52,190, 56, 25,137, 68, +242,148, 32,178, 0, 96,249,242,229,136,137,137, 65, 84, 84, 20,148, 74, 37,228,114,185,131,211, 95,136, 68, 34,116,235,214, 13, + 31,127,252, 49,102,204,152,129,209,163, 71,151, 43,104,197, 98, 49,194,194,194,240,199, 31,127, 64,165, 82, 33, 33, 33, 1,130, +192,191,175,109, 65,150, 9,219,127,228,134,195,161,237,222,177, 46,247, 88, 19,238, 75,251,171, 18, 44, 11,240,124,217,171,147, + 97, 64,172, 22,190,232,200,201,204, 9,126,220,207, 42,105,105,105, 81,254,222, 35,171,213,138, 42, 85,170,136,124, 28,214, 35, + 37, 37,229,151,161, 67,135, 74,106,214,172,201, 72, 36, 18,112, 28, 7,142,227, 4,129,158, 64, 8, 73,224,121,190,125, 78, 78, + 14, 89,176, 96,193, 39, 59,118,236,120, 18,192, 38,183, 5, 11,209, 55, 42, 53,242, 61,118, 31,199,163,207,116,126, 15,127,172, + 26,251,104,155,198, 60,130, 20,250,203, 0,254,203, 66,171,118, 74, 74,202,241,131, 7, 15, 6,152,205,102,180,104,209,226,192, +133, 11, 23,154,226,246, 70,112, 15, 5,240,217,184,113,227, 6, 13, 29, 58, 84, 20, 18, 18, 2,169, 84,138,210,210, 82, 92,190, +124,249,197, 31,126,248,129,124,245,213, 87, 95, 0, 8, 74, 75, 75,107,121,232,208, 33,116,232,208,225, 77, 0,111,223,170, 8, + 68,241,123, 15, 93,139, 18,214,123,119,107, 40,105,217,140,205, 41,115,113, 92,143, 38,224,109,124,250,161,191, 51,252, 17, 98, +159,244,237,219,119,224,234,213,171, 3, 1, 96,225,194,133,120,234,169,167, 16, 22, 22, 6,133, 66, 1,137, 68, 2,177, 88, 92, +238,215,199,203, 86, 4,224,147,254,253,251, 63,179,108,217,178, 32, 0, 88,182,108, 25,250,246,237,139,240,240,112, 4, 5, 5, + 65, 42,149, 66, 36, 18, 85,248,102,134,133,133,125,219,250,209, 71,135, 44, 93,186, 20, 0,240,193, 91,111,225,137,199, 30, 67, +160, 66, 14,133, 92, 10,225, 94, 72, 69, 98,116, 31, 49,210,167,190, 4, 48,235,169,167,158,122,118,197,138, 21, 65, 0,112,244, +232, 81,228,230,230, 34, 58, 58, 26,114,185, 28, 82,169,212, 17,103,134, 97, 32,151,203,253,138,251, 83, 79, 61,245,204,207, 63, +255, 28, 4, 0, 75,150, 44, 65,183,110,221, 28,113,151,201,100,144, 72, 36,229, 22, 87,209,233,142,243,201, 39,159,124,102,229, +202,149, 65, 0,240,195, 15, 63,160,115,231,206, 8, 13, 13,117,220, 79,129,171, 34,105,244, 31,231,124, 56,132,214,241,227,199, +159, 86, 42,149,211, 1, 68, 74,165,210,144,231,158,123,174,234,144, 33, 67,208,191,127,127,108,223,190,253,245, 10, 10, 45, 38, + 58, 58,122,240,174, 93,187, 28,111,104, 19,185, 69, 48, 85,248, 5,110,199,135, 71, 94,127, 61,102,198,101, 13, 14, 28, 58,143, + 0,176,204,161, 89,179, 34, 13,151, 46,193,102, 50, 97,210,149,210,178,237, 86,194,236,124,103, 68,204, 35,115,191,248, 16,192, + 18, 47, 46,128,204,104, 52,226,226,197,139, 21, 10,196,205,155, 55,193,243,188,209,155,187, 32,145, 72,112,234,212, 41,191,122, + 33, 36, 36, 36,120,123, 0,125,114,110,222,188, 25,163, 70,141,194,249,243,231, 33, 76, 85,226, 7, 39, 19, 22, 22, 22, 34,136, + 44, 65, 4,201,229,114,136,197, 98,134,227, 56, 70,168,218,179, 63, 92,126, 9, 99,150,101,241,227,143, 63, 98,230,204,153, 24, + 51,102, 12, 22, 45, 90,132, 70,141, 26,253,147, 9, 57, 14,106,181, 26,161,161,161, 8, 13, 13, 45, 39, 16,239,103,184, 38,243, +236, 57,243, 21,224, 73, 89, 35, 16,194, 3, 60, 64, 64,192, 19, 30, 57, 25,151,241,209,199,159,250,253,246, 17,139,197,184,116, +233,146, 35, 31, 8,206,176, 32,140,156, 93,131,196,196, 68,159,121, 73, 34,145, 76,252,245,215, 95,165, 63,254,248, 35, 86,172, + 88, 1,134, 97, 32,147,201,160, 84, 42, 17, 18, 18,130,240,240,112,199, 18, 31, 31,207,124,247,221,119,146, 70,141, 26, 77, 84, +171,213,155,220,167, 57, 9, 86, 84,159, 81,251,153,206,239, 1, 0,158,121,143,160,232,226,212, 71,216,226, 9,193,255,101,145, +213,176, 97,195, 61,251,246,237, 11,208,233,116,224,121, 30,155, 54,109, 82,116,238,220,121,247,181,107,215,218, 84, 84,108, 37, + 38, 38,174,223,183,111,223,227,145,145,145, 40, 41, 41,129, 90,173,134,197, 98,129, 72, 36, 66, 66, 66, 2, 62,249,228, 19,166, + 79,159, 62,195, 95,124,241, 69,131, 92, 46, 23,156,141, 68,247,121,169,124,102, 90,240,249,151, 33,132,148,229, 31,194,147,114, +191,133,185,105,120,235,157,143,252, 10, 99,213,170, 85,255,183,102,205,154, 64,103,103,201, 89, 4, 56,139, 44, 97,241, 33, 12, +216,106,213,170, 13,249,233,167,159, 28,156, 17, 17, 17,224, 56, 14, 98,177, 24, 28,199,129,101, 89,236,222,189, 27,211, 39,142, + 67,104,100, 21,204,255,124,161,207,112, 70, 70, 70, 46,234,214,173,219,243, 75,150,252, 83,116, 55,172, 94, 29, 61, 31,127, 12, + 81, 17, 42, 68,132, 6,149,221, 39,158,193,137,243,215,124,190,143, 0,176, 85,171, 86,125,121,213,170, 85,129,206, 31,132, 66, + 92,133,143,103,193,197, 55,153, 76,104,214,172,153, 95,113,119,230, 20,220, 54, 65,180, 9,247, 83,184,142,240,188,250, 8,231, + 16, 65, 8,219, 5,103, 57, 14,177, 88,140, 85,127, 44,245,232,102,223, 46,103, 69,211,221,149, 51, 45, 45, 13,211,166, 77,131, +240,209,230,220, 84, 40, 46, 46, 14,243,231,207,247, 89, 46,185, 60, 3,205, 1, 68, 58,109, 50, 1,144, 58,253,230, 49, 12,115, +216,205,113,194,118,177,189,198, 42, 18,101,237,198, 74, 1,132,184,225,243,196,147,111,127,231, 69,186, 28, 95,238, 58, 30,133, +214,134, 13, 27,132,167,184,125,106,106,234, 78,251,255, 98,153, 76,118, 83,161, 80,196, 0, 40,221,180,105, 19, 94,123,237, 53, +216,173,213,222,193,193,193,167,221,184, 58,199,141, 70,227,123, 0,114,236,155,132, 46,154,108, 97, 97, 33,191,117,235, 86,118, +217,147, 93, 97, 34, 64,227, 15,167,163, 91,106, 42, 54,199, 73, 33, 2,240,232,185,124, 40, 20, 10, 78,173, 86, 91,156,219,109, +185,105,187,181,205, 37, 67,137, 2, 56, 14, 45,246,108,196,168, 61, 27,241,168, 82,138,130,213, 43, 81,186,119, 23, 88,150, 65, + 91,101, 4, 70, 15,220,138, 86, 42, 25,164, 70, 45, 88,150,117,151,179, 29,156, 23, 47, 94,236,167, 82,169,166,187,220, 96,127, +112, 21,101,243, 56,193, 67, 56, 65, 8, 65,163, 70,141,192, 48,140,195, 45, 16, 22,225,161, 19,150, 99,199,220,214, 64,122,228, +180, 87,193, 65,169, 84,226,207, 63,255,116, 28,211,169, 83, 39, 24, 12, 6,132,133,133,249,197,153,151,151, 71, 50, 51, 51,153, +101,203,150, 65, 44, 22, 35, 60, 60, 28, 10,133,130, 89,186,116,233, 56,137, 68, 18,111, 48, 24,120,147,201, 4,169, 84, 58, 95, + 72, 31,142,227,180,106,181, 58,220, 19,167, 72, 36,194,208,161, 67,241,238,187,239, 98,209,162, 69,120,253,245,215,111,113,188, + 12, 6, 3, 34, 34, 34, 28, 98,203,205, 3,120, 55,186,251,222, 93, 78,158,224,244,177,205, 56,115,114, 27,120, 27, 15, 27, 79, + 64,136, 13,188, 21, 56,186,245, 64,173,172,171,153,113, 4,164,172,233, 45, 0, 89,137,198,218, 46, 92, 90, 7,192,186,157, 5, +166,185,190,194,201,113, 28, 12, 6, 3,126,253,245, 87,156, 59,119, 14,155, 54,109,130, 94,175, 71, 68, 68, 4, 66, 66, 66,240, +216, 99,143,225,197, 23, 95, 68, 98, 98,162,207,184, 19, 66,150,220,188,121,179,113,235,214,173,153,226,226, 98, 20, 23, 23, 67, +175,215,195,102,179,193,106,181,130,227, 56, 4, 4, 4, 64, 46,151, 35, 58, 58, 26, 6,131,129, 24,141,198, 37,158, 56,121,158, + 41,209, 93, 25,123,225,143, 85, 99, 31,125,230, 61,130,213, 51, 25,212,168, 38,211,253,121, 36,104,200,186, 61,163,187, 0, 32, + 60,113, 88, 11,196, 98,227,243,223, 29,247,217,240,123,158, 70,183,138,172,112,189, 94,143,210,210,210, 50, 91, 95, 42,197,234, +213,171, 35,122,245,234,181, 43, 51, 51,179,173, 23,177,117, 11,103, 80, 80, 80,130, 72, 36,194,169, 83,167,240,213, 87, 95,225, +207, 63,255, 68, 78, 78, 78, 81,149, 42, 85,130,219,183,111,207,190,245,214, 91,104,220,184, 49,190,255,254,251, 0, 95,156,132, + 16,164, 93,220,141,180, 75,123,192,243,101,174,117,217,226,254, 63,241, 51,238, 90,173,214,112,252,248,241,192,111,190,249, 6, + 81, 81, 81, 72, 74, 74,130, 66,161, 64, 64, 64, 64,185,151,172,243,139,215,215,179,169,215,235, 13,105,105,105,129, 63,255,252, + 51,194,195,195,145,152,152, 8,133, 66, 1,169, 84, 10,142,227,192, 48, 12,150, 45, 91,134,229, 31, 15, 68,218,249,147,232,219, +179,139,207,112, 42, 20,138,231,151, 44, 89, 82,206, 2,137, 14, 13, 5, 39,102, 33, 18, 51, 8,237,244, 36, 0,160,104,251, 90, +111,163, 67, 58,115, 50,165,165,165,134,131, 7, 15, 6, 30, 57,114, 4, 60,207, 35, 49, 49, 17, 58,157, 14, 42,149,202, 17,255, +173, 91,183,162, 79,159, 62,248,241,199, 31,209,178,101, 75,159,113,215,104, 52,134,147, 39, 79, 6,254,244,211, 79, 8, 11, 11, + 67,213,170, 85, 29,113, 23, 22,177, 88, 12,145, 72,132,228,228,100,148,148,148, 32, 48, 48,208,103, 26, 29, 61,122, 52,240,167, +159,126, 66,104,104, 40,226,227,227, 29,142,155, 32,142,102,126,249,113, 57,130, 0, 38,246,142, 57, 43,154,238,174,156,125,251, +246, 69,141, 26, 53,160, 82,169,160, 84, 42, 29,220,222, 56, 61,104, 17,135,222,102, 24,102,131,211, 51,145,202, 48,204, 6,231, + 95, 79,199,217,255,182, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,246,237, 91,238,137,207, 19,207,184,113,227, + 82,102,204,152, 49,205,249,120, 55,215,241,236,104,165,166,166, 50,246, 72, 50, 0,146,154, 54,109,122,120,251,246,237, 97, 65, + 65, 65,142,131,111,220,184,129,226,226, 98, 4, 5, 5,169,102,207,158,173,106,223,190, 61,162,163,163, 29, 95, 0, 23, 47, 94, +172, 95,187,118,109, 53, 0, 87,223,150,103, 89, 22,173, 90,181,194,105,123,109, 71,183,212, 84,196,199,199, 59, 26,121, 4, 4, + 4, 96,248,240,225,204,168, 81,163, 56,193,205, 32,132, 64,175,215, 35, 54, 54, 86,238,205,213, 1,128, 20,125, 62,214,182,111, + 11,150, 1,116,199, 14, 65, 34,101,192,138, 24, 52, 33, 5,248,189, 67, 91, 48, 0, 76,127,239,135, 31, 46,204, 49, 0, 93,238, +142,195, 65,112,249,242,101,191, 28, 45,123,188,152,219,229, 20, 28,141,125,251,246,193,102,179,249,203, 73, 88,150,133, 82,169, + 68, 76, 76, 12,228,114, 57, 20, 10, 5,243,243,207, 63,143, 79, 74, 74,138, 29, 53,106, 20,171, 86,171,217, 86,173, 90,225,169, +167,158,226,132, 42,206,148,148, 20,159,113,217,185,115, 39,190,250,234, 43,188,254,250,235,110, 29, 45,134, 97, 16, 25, 25, 9, +149, 74,133, 7, 5, 60, 0,179,213, 2,157, 70,239,168,210,181,217,108, 56,185,227,239, 90, 87,255,190,152,178,225,231, 31,197, + 0, 96,216,177,214,249,180,216,167,190, 92, 89,187, 93,168,248,224,206, 34,203, 65,111,121,158,227, 56, 12, 30, 60, 24, 51,102, +204,192,243,207, 63,143, 77,155, 54, 97,194,132, 9,120,229,149, 87,110,113,181,124,125, 57, 90, 44,150,175, 95,120,225,133,215, + 87,175, 94, 93,231,189,247,222, 99, 5, 71, 75,161, 80,128, 97, 24, 24, 12, 6, 24,141, 70,232,245,122,156, 63,127,158,127,245, +213, 87, 47,152, 76,166,175, 61, 86, 87, 50,242, 19, 10,153,110, 83,245,120,182,134,246,218,167, 65,173, 31, 75,212, 51,242,166, + 37, 79,214,238, 76,122, 12, 78, 12, 5, 33, 32, 60,192, 19,192,104,212, 98,248,240, 55, 69,255, 98, 82, 57, 68,150,193, 96,192, +241,227,199,209,161, 67, 7,220,188,121, 19,103,207,158, 69,173, 90,181,176,116,233,210,200,231,158,123,110, 87,110,110,110, 91, +127,157,173,147, 39, 79,142,123,228,145, 71,230,105, 52,154, 66,141, 70, 51, 15,192,114, 0,197,151, 47, 95,174,119,249,242,229, + 5,155, 55,111,110,243,209, 71, 31,137, 92,218,232,136, 60,217,163, 22,139, 21,122,189,209,171,192, 18,214, 9,225,253,138, 56, +195, 48,164, 78,157, 58,232,213,171, 23,196, 98, 49, 20, 10, 5, 2, 3, 3,203, 85,155,185, 10, 46,111,229, 7, 0,158, 97, 24, + 84,169, 82, 5, 61,122,244,128, 68, 34, 41,199, 41,228,195, 30, 61,122, 96,228,164, 15,241,245,200,142,248,234,133, 90,232, 60, + 37,199,107, 56,117, 58,157,230,175,191,254,146,191,251,250,235,120,164,102, 77, 68,168, 84,168, 22, 29, 9,185, 76, 10,137,115, +152, 24,191, 76,118, 2,128, 23,137, 68,104,208,160, 1,114,114,114,112,237,218, 53, 92,187,118, 13, 44,203,162,117,235,214, 14, + 23,230,210,165, 75,152, 52,105, 18,140, 70,163,223,113,175, 89,179, 38, 58,118,236, 8,169, 84, 10,133, 66, 81,174,202, 80,184, +167,165,165,165,168, 81,163, 6,214,173, 91,135,218,181,107,251,228,172, 91,183, 46,218,181,107, 87,238,126,202,229,114,135, 40, + 2,128,155, 7, 53,142,107,196,197,197, 85,136,115,203,161, 27,248,102,235, 95, 48,154,120,168,117,150,114, 39,196, 70,168,176, +231,167,247,252,138,187,192,185,120,241, 98, 20, 23, 23, 59,140, 3,225,163, 92, 48, 81,170, 86,173,138,133, 11,221, 59,153, 46, + 90,196,221, 59, 47,213,207,247,173,112,156,144,185,100, 51,102,204,152,230,122,190, 47, 62,231,253, 46,231,155, 92,196, 89, 78, +133,170, 14,101, 50,217,251,127,253,245, 87, 88, 73, 73, 9, 46, 93,186, 4,150,101, 29,117,234, 28,199,193,108, 54,227,202,149, + 43, 8, 11, 11, 67,110,110, 46,100, 50, 25, 68, 34, 17, 76, 38, 19, 0, 52,241,244, 2, 39,132, 96,100, 94, 89, 19,161, 63,170, + 72,144, 6,160,103, 94,217,131, 33, 52,136, 95,179,102, 13, 2, 3, 3, 17, 20, 20,228,248,245, 85,141,116,242,218,101,228,136, + 25,176,251,119,131, 97, 1,150, 1, 24, 17,192,178, 4, 44,195,128,221,191, 11, 12, 3, 40,195, 67, 43, 90, 0,251,106, 24,239, +181, 1,188, 39,247,201,157,139,229,250,127,199,142, 29,240,151,179, 70,141, 26, 8, 12, 12,116, 44,155, 55,111, 46,231,104,217, +108, 54,132,135,135,251,195, 73,202,220, 8, 30, 81, 81, 81, 16,139,197,204,210,165, 75,199, 37, 39, 39,199,190,243,206, 59,172, + 72, 36,194,177, 99,199,112,230,204, 25, 36, 38, 38,250,221,102,171,184,184, 56,107,220,184,113,182,113,227,202,250, 80,164,164, +164,160,184,184, 56, 87,216,175, 86,171, 11,186,118,237, 90,174,221, 70,126,126,254,253,221, 18,222,126, 31,173,102, 43,116, 6, + 3, 52,165, 58,135, 59,148,155,153, 19,242,222,168,183,197,179,134,191, 4, 0, 24, 53,247,115,148, 46,250,167, 32, 91, 59,106, + 64,212,147,159,173, 24, 11,160,143, 55,126,141, 70, 3,131,193,128,234,213,171, 99,223,190,125, 40, 45, 45, 69,247,238,221,193, + 48,140,163,135,104, 5, 96,202,200,200,120, 60, 53, 53,245,240,156, 57,115,170,215,171, 87,143,209,106,181,208,233,116,112,254, + 61,121,242, 36, 89,190,124,249, 85,157, 78,215,202,110,157,187,197,230,140,111, 47,119,139,123,121,245,159,199, 68,169, 81, 53, + 46,168, 50,138,170, 91, 11, 50,100, 90,181,254,188,193, 70,206,128,216, 0, 27,120, 16, 43, 15,155,189,218,235,223,130, 92, 46, + 95,176,103,207,158,112,131,193,128,163, 71,143, 98,208,160, 65,166,252,252,124, 41, 0, 60,255,252,243,166,101,203,150, 73,107, +212,168,129,165, 75,151, 70, 62,245,212, 83,171,180, 90,109, 3, 63,169,127,204,202,202,250,209,117, 99,120,120,248,252, 27, 55, +110,180,119,110,243, 99,181, 90, 29,193,113,251, 96,242,128,197, 98,129, 94,111, 68, 73, 73, 41, 76,102,139,189,204,228, 97,179, + 89,237,191, 60,172,246,114, 84, 42,225,130,154, 52,136,209, 16, 66,192, 50, 76,241,209, 83,217, 85,189,137,118,119, 85, 92,126, +186, 89,174,176, 9,189,204,194,195,195, 33, 22,139,241,227,143, 63,226,196,222,205,144,138, 8,108, 86, 11,172, 22, 51,108, 22, + 19,196, 34, 17,254, 60,118, 13, 93,234, 6,249, 37, 8, 35, 34, 34,208,179,101, 75,164,182,108, 89,214,189,141,227, 16, 40,147, + 65, 33, 9, 40,115,178, 0, 16, 27,235,239, 32, 2,188, 16,206,232,232,104, 28, 57,114, 4, 35, 71,142,196,204,153, 51, 33,151, +203, 29,189,159,207,157, 59,135,149, 43, 87,162, 75,151, 46, 21,142,187,224,224,141, 29, 59, 22,153,153,153,152, 59,119, 46,154, + 54,109, 10,177, 88,140,226,226, 98,180,106,213, 10, 57, 57, 57,126,113, 58, 87,239, 73,165,210,114,238,147, 32, 0, 43,154, 70, +206,156, 47,245,141,197,250,189,203,193,128,193,129,159,222, 46, 39, 10, 23,174,216, 93, 97,206, 9, 19, 38,148, 11,167, 63,110, +150,191,112,113,157,124, 30,199, 48,204, 81,193,108, 29, 59,118,236,251, 12,195,108, 24, 59,118,236,251,211,167, 79, 63,237, 15, +159,187,253, 12,195,108,180,139,176,158, 78,219,142, 86, 72,104, 41, 20,138, 71, 3, 3, 3,113,233,210, 37,116,239,222,221, 84, + 80, 80,112, 65, 44, 22,215,202,207,207,151,229,230,230, 66,167,211,105, 38, 79,158,124, 13,128,188, 69,139, 22, 53,254,252,243, + 79,220,188,121, 19,203,150, 45, 3,128,181,238,219,108,176,224,121,222,145, 41, 92, 63,219, 68, 34, 17,246,239,223,143,253,251, +203, 55,253,250,230,155,111,124,190, 48,158,250,245, 55, 28, 59,118, 12,206,195, 3, 8,255,157,183, 5, 4, 4, 0,222,123,120, +148,131,175,134,241,190, 26,192,187,131,191,109,191,220,245,204,241,132,140,140, 12,143,231,239,223,191,191,156,163,229,139, 83, + 36, 18,193,102,179, 65, 46,151, 51, 18,137,132,145, 72, 36,241,130,200, 18,137, 68,142, 7, 70, 38,147, 65, 38,147,149,251, 74, +245,132,204,204,204, 14,153,153,153, 30,247,231,229,229, 61,158,151,151,135, 7, 17,102,139, 5,122,157, 9,165, 26, 61, 38, 78, +255,190,108,227, 68, 28, 4,112,240,241,255,141,196,208,110, 93, 58, 86,180,154, 90,184,223, 81, 81, 81,216,185,115, 39, 24,134, +193,170, 85,171, 16, 28, 28,140,110,221,186, 65,165, 82, 97,236,216,177,232,215,175, 95, 69, 11,179,146,130,130,130,199,223,122, +235,173,195,159,126,250,105,181,170, 85,171,194,100, 50,193,108, 54,195,100, 50,225,242,229,203, 88,190,124,249, 77,157, 78,247, + 56,128, 18, 95,100,155, 51,190,189,252,203,174, 81,153,157,251, 63,165, 63,151,243, 7,178,179, 11, 96,181,102,128,183, 89, 97, +182,218,202, 28, 62,171, 21, 86,171, 13, 18,137, 72,245,233,212,183,183,242, 32, 96, 89,198, 4,224,137,123,149, 70, 33, 33, 33, + 41,121,121,121,184,120,241, 34, 94,124,241,197,236,130,130,130,179, 0, 58, 1, 64, 65, 65,193,158, 65,131, 6,213, 91,178,100, + 73, 76, 82, 82, 18, 2, 3, 3, 85, 90,173,214, 23,101, 32,128,161, 0,186,162,172, 29,136,128, 66, 0,147, 89,150,149, 29, 61, +122,244,150,158,118,187,118,237, 2,128,131,238,191,128,236,142,150,193,128,188,130, 34,188,242,191,241,255,124, 25,129,148, 19, + 23, 4, 4,111,140, 64, 0, 0,228,231, 92,198, 75,175,140,148,249,250, 32,112,247, 34,172, 64, 27,157,114, 31,106, 66, 30, 13, + 12, 12, 44,171,126, 91,183, 28, 27, 63,251, 31, 96, 51,131, 88,244,128, 89, 7,152, 53,224, 77, 58, 48, 18, 57, 96,209,251, 37, +180, 2, 3, 3, 17, 40,151, 35, 42, 36,164,108, 16, 72,145, 8, 98, 49, 7,222, 2, 48, 54,198, 33, 72,121,255, 6, 6,113,124, + 84,202,229,114,164,165,165, 97,232,208,161, 48,155,205,232,219,183, 47, 76, 38, 19, 12, 6, 3,244,122, 61,146,147,147,161,211, +233,252,226, 19,122, 43, 6, 6, 6, 66, 34,145,224,237,183,223, 70,179,102,205, 48,105,210, 36,140, 25, 51, 6,201,201,201,120, +227,141, 55,176,124,249,114,164,164,164,248,226, 37,206,105, 36,220, 79, 65,108, 57, 87,241, 1,168,112, 26,185,114, 50, 12, 91, + 78,176, 9,203,155, 47,116,170, 48,231,140, 25, 51,144,151,151,119,139,147, 37,252,143,139,139,195,151, 95,126,121,187, 53, 67, +130,123, 20,237,102, 95, 79, 87, 39,138, 16,210,220,222,118,202, 56,125,250,244,211,211,167, 79, 79,101, 24,102,195,244,233,211, + 83, 61, 57, 90,238,120,220,236,247,251,165,197,185,212,141,182,119,222, 41,220,232,176,176, 48, 81,181,106,213, 88,149, 74,133, +226,226, 98, 68, 70, 70,146,188,188,188,254, 10,133,226,227,159,127,254,185,134, 70,163,193,185,115,231, 48,127,254,252,131, 0, +230,121, 19, 90,155, 34,237,214,177,221,201,114, 94,239,213,171, 23,146,146,146,202,185, 89,114,185,220,107,230, 17,246, 9,142, +144, 72, 36, 66,237,218,181,229, 87,175, 94,213, 75, 36, 18,196,199,199,203,179,179,179,245, 18,137,164,194, 61, 93,124, 53,140, +247,213, 0,222,157,240,105,222,188,121, 57, 7,203,249,215,249,255,250,245,235,125, 86, 29, 10,156,245,234,213,115,220,175,160, +160, 32,225, 92, 0, 64,247,238,221,193,243, 60, 34, 34, 34,252,226, 20, 68,173,189, 1, 60, 12, 6, 3, 95, 90, 90,202, 30, 61, +122, 20, 82,169, 20, 65, 65, 65,142,182, 58, 1, 1, 1, 14, 55,147,194, 93,129,192,195,100,177, 64,175,215, 67,163,209, 0, 0, + 46,159, 90, 83, 94,136, 25,213,183,205, 47, 20,176,133,133,133,216,188,121, 51,254,248,227, 15, 52,107,214,204,173,168,174,128, +224,202, 43, 44, 44,108, 61,122,244,232, 3, 83,166, 76,169, 18, 22, 22, 6,179,217,140, 27, 55,110,224,187,239,190,203,212,233, +116,173, 43, 82,192,128, 0, 22,139, 21, 6,157, 17, 37,234, 82,124, 60,245, 7,143, 89, 15, 0, 10,115,207,163, 87,239,126,210, +123,153, 78,153,153,153,239,180,110,221,122,106,105,105,105,177, 78,167,235, 7, 96,150,243,247, 84, 65, 65, 65,155,222,189,123, +207, 9, 11, 11,107,154,155,155,251,190, 31,148, 99,211,210,210,222, 79, 72, 72, 40,183,209,104, 52, 34, 33, 33,161,118,110,110, +238,192,182,109,219,126, 8, 32,204,105,119, 16,128, 45, 0,190,244,148,151,132,170, 67,141, 70, 15, 85, 72, 44, 50,174,237,244, + 25, 16,137,200, 0,194,243, 94,203, 16,225, 3,216,211,226,163,103,220, 45, 65, 21,142, 21, 94,216, 79, 60,253, 2,158, 24, 58, + 3, 10, 49, 48,237,165,199,145, 28, 2, 64, 30, 6, 73,219,247,192,132,216,239,209,208,223,252, 34, 31,243,213, 87, 56,102, 47, +143,227, 35, 35, 49,186,127,127, 16, 11,176,239,204, 25,172,248,235, 47,244,239,208, 1,138,128, 0,191, 63, 88,120,158,135, 68, + 34,193,229,203,151,177,111,223, 62,212,173, 91, 23,151, 46, 93, 42, 55, 12, 5, 33,196,223,248, 59,226, 46,147,201, 32, 22,139, +145,157,157,141,212,212, 84, 72, 36, 18,252,240,195, 15,216,185,115, 39, 70,143, 30,141, 33, 67,134,160,125,251,246, 56,123,246, +172, 95,156,132,144, 91,122, 43,186, 86,231, 86, 52,141, 92, 57, 93,223,251,183,147,238, 2,231,148, 41, 83,220,118,168,240,135, +211,157, 22,113,147,118, 71,157,197,144,224, 60, 57, 11, 35,215,117, 0,161,194,182,177, 99,199,190,239,239,121,206,235,130, 35, + 86,145, 42, 76,135,208, 74, 77, 77, 45, 23,243,194,194,194, 3, 7, 14, 28,168,175, 84, 42,113,254,252,121,169, 74,165,170, 47, + 20,232, 44,203, 98,213,170, 85, 65, 61,122,244,216, 58,107,214,172,120,158,231,145,147,147,131,119,223,125, 87, 99,181, 90, 7, + 0,176,122,122,129,251,114,166,126,251,237,214,135,109,221,186,117,126, 85,129, 8, 66,138,227, 56,132,134,134,234,245,122, 61, + 20, 10, 5, 66, 67, 67,245, 58,157, 14, 74,165, 82,168, 43,102,241, 79, 79, 5, 95,238,147,175,134,241,174, 13,224,125,226,204, +153, 51,126, 29,103,175,106,245, 43,151,167,165,165,121, 44, 72,118,238,220, 9,222, 94,208,250,203,105,255,202, 35,130,240, 83, + 40, 20, 8, 11, 11,131, 76, 38,131, 92, 46, 47, 39,178,100, 50,153,207, 7,199,215,128,164, 1, 1, 1,135,148, 74,101,136,176, + 95, 44, 22,163,180,180,180,184,176,176,240,209,251,186,234, 16, 4, 86,179, 21,122,189, 1,154, 82,125,165,243,155, 76, 38,200, +100, 50, 44, 95,190, 28,143, 63,254, 56, 90,180,104,113,139,200,186, 77,123, 62,189,176,176,176,253,188,121,243, 14,206,158, 61, + 59, 84,163,209,224,251,239,191, 47,209,104, 52,237, 1,164, 87, 72,108,242, 4, 22,179, 25, 58,131, 17, 90, 77,217, 61,184,114, +122,205,127, 45,169,150,103,103,103, 47,247,178,255,138,213,106, 77, 21,198,125,243, 3,143, 37, 36, 36, 32, 59, 59,187,220,198, +235,215,175,195,102,179, 25, 81, 54, 78,214,203,206, 70, 50,254, 25, 61,219,211, 87,124,153, 59,170, 55, 66,163, 41,115, 65, 12, +218,252,202,201,167,118,177,225,169, 77,214,237,228, 33,134, 97, 28,141,190,135, 15, 31,142,147, 39, 78,160, 83, 21, 53,146, 99, +130, 64,212, 25,144,116,252, 8,127,231,201, 49,107,206,166, 10,115,175,116,106, 2, 49,107,229, 74,183,251,174,244,233, 83,161, +184, 95,184,112, 1,114,185, 28, 54,155,237,150,247, 77, 69,227,239, 44, 96,230,204,153,131,209,163, 71,227,135, 31,126,192,201, +147, 39,241,200, 35,143,160,115,231,206,200,205,205,197,137, 19, 39, 96, 52, 26,253, 14,167,115,187,185, 11, 87,207, 96,219,190, +223,113, 61,253, 26, 50,179,111,222,118,186, 59,115,186, 10,173, 95,182, 29,199,211, 93,154,220, 22,231,199, 31,127,140,220,220, +220,114, 78,150,115,185,228,201,209,114,213, 34, 46,200,119,105, 11, 37,172,155, 92, 68,143,235,186,235,241, 0,144, 11, 64,228, +227, 60,215,245,252,233,211,167,239, 16,156, 48, 59,175,200, 87,251,172,114,142,150, 11,102,244,233,211,167,247,252,249,243, 35, + 3, 2, 2, 28, 61,144,198,142, 29,139,209,163, 71,163,122,245,234,136,136,136,136, 11, 9, 9, 65, 65, 65, 1,102,206,156,137, +180,180,180,215,224,102,160, 61, 87,161,213,230,106, 41,164,210,127, 62, 88, 5,103, 11, 0,134, 12, 25,114,139,163, 37, 36,144, + 55, 88, 44, 22,132,135,135, 67,167,211, 65, 36, 18,161,111,223,190,162, 83,167, 78,217,186,117,235,134, 39,159,124, 82,116,226, +196, 9, 91,207,158, 61, 33, 18,137,208,177, 99, 71,245, 47,191,252, 50, 10,192,103,126,136,173, 74,107, 24, 47,100, 50,127,199, + 62,242, 71, 92,122,227,100, 24, 6, 58,157, 14, 28,199, 57, 26,202,251,195, 41, 84, 29, 58, 63,128, 44,203, 34, 36, 36,196, 81, +120, 8,142,150, 32,180,124,241,250, 26,144, 84,161, 80,168,206,159, 63, 95, 67,232,120,145,159,159,143,142, 29, 59, 94, 44, 44, + 44,188,191, 45, 45, 30, 48, 91,109,208,232, 13,208,232,117,149, 70, 43, 60, 15,139, 22, 45,194,217,179,103, 97, 48, 24,176, 96, +193, 2, 71,167, 2,103,145,117, 7,130,235,178, 92, 46,231,187,119,239,142, 3, 7, 14, 64, 38,147, 89,112, 27,227, 95,241,132, +135,217,106,133, 65,175,135,198,119,149,219,131, 2,135,170, 62,123,246, 44, 76, 38, 19, 38, 77,154,100, 59,124,248,240, 14,148, + 13,128, 42, 56,120, 3,219,181,107, 55, 89,169, 84,134,108,220,184,241, 77, 0, 63,120,123,121, 91,172,118,209, 94,137,247,209, +185, 70,192, 93,155,172,219, 25,102,197,249,197,202,243, 60, 94,123,245, 85,116,174,162,198,147, 77, 35,161,205,186, 8, 69,112, + 36,152,144, 68,204,154,179, 9,167,175,250,221, 20,147, 0, 64,247,118,125,208,168,238,173,195,131,181,238, 84,246, 77,182,231, +207, 67,200,201,207,172,112,220,181, 90,173, 71,231,170, 2,142,150,227,153, 19,238, 95,227,198,141, 81,171, 86, 45,236,216,177, + 3, 77,154, 52,193,165, 75,151,112,233,210, 37,164,165,165,225,228,201,147, 40, 42, 42,170,112, 26,253,186,101, 5,138, 74, 11, + 33,149, 72, 81, 88,156,143,235, 25,215, 16, 29, 30,115,199,233, 46,160, 78,207,143, 1, 0, 85, 34,131, 43, 36,180,156, 57, 63, +249,228,147, 91,196,251,157, 14,217,195, 48,204, 33,111,235, 21, 61,255, 94,194,147,208,186,150,151,151,215,162,127,255,254, 99, + 1, 52,183,111, 43, 1,176,114,235,214,173,125,162,162,162, 58,180,108,217,146,147, 74,165,216,183,111, 31,126,249,229,151, 31, + 0,172,240,118, 33,169, 84,170, 79, 76, 76,148, 11, 25, 81,120, 16, 85, 42,149,104,230,204,153,204, 55,223,124,227,209,229,242, +149, 64, 37, 37, 37,208,106,181, 8, 14, 14,134,217,108, 70,247,238,221,109,103,207,158,133, 68, 34, 65,239,222,189,109,103,206, +156,113, 36,244,226,197,139,227,245,122,125,171, 63,254,248,163, 43,128,182, 21,184, 87, 66,195,248, 64,248,217, 0,222,211, 87, +158, 63,240,183, 58,206, 19,231,200,145, 35,111,139, 83, 34,145, 88,133,145,223, 89,150,133,217,108, 70,147, 38, 77,144,155,155, +235,120,104,148, 74,165, 67,100,249, 35,180,124, 13, 72,202,113, 28, 76, 38, 19,218,182,109, 11,134, 97,240,249,231,159, 63, 24, +213,145, 60,207, 4, 6,134,163, 74,149,218,136,140, 50,128,231, 43,119, 86,153, 49, 99,198,148, 19, 83,238, 70, 94, 22,238,255, +237, 64,224,186,147,217,231, 9,224,168,242,210,106, 13,247, 93, 18, 70, 69, 69,181,200,205,205, 93,231,178,185, 16,192,100, 47, + 31,150,142,132,190,121,243, 38,186,117,235,134,223,127,255, 93,180,118,237,218, 78,235,215,175, 63,115,241,226,197,155, 77,154, + 52,169,250,250,235,175,203,218,182,109,139,252,252,124, 52,109,218,116, 98, 70, 70,134, 23,161,101,191,143, 6, 35,180,218,202, +119, 71,221,185, 89,119,242, 98, 20,242,228,132, 9, 31,162,115,108, 49,250, 62, 18,140, 37, 27,246, 98, 96, 99, 57, 96,146, 85, +152, 79, 8, 75, 88,149, 36, 36,166,180,184,101,191, 76, 85, 54,150,107, 98, 74, 11,176, 55, 47, 85, 56,238,206, 97,118, 21, 85, +183,227,232, 57,223,207, 87, 94,121, 5,239,189,247, 30,186,118,237,138, 75,151, 46, 97,215,174, 93,184,116,233, 18, 70,142, 28, +137,148,148, 20, 60,242,200, 35, 21,226, 92,191,109, 53,212,154, 18,176, 12,139,194,146, 2, 24,140,122,140,121, 99,194, 29,167, +187,227,229,191,109, 58, 0, 96,205,214, 99,183,205,249,193, 7, 31, 32, 59, 59,187,156,147,117, 39,237,178,238,119,120, 27, 45, +237, 26,128,215, 92, 55,154, 76,166,160, 73,147, 38,117,137,136,136, 0,195, 48,152, 51,103, 14,194,194,194, 30, 7,112,218,100, + 50,229,107,181,218,209, 78, 34,164, 51,236, 99,109,228,228,228,184,237,183,175,213,106,205, 93,186,116, 17,199,198,198,150,235, +109,168, 84, 42, 61,185, 59, 14, 78, 97,159,213,106,197,152, 49, 99, 48,109,218, 52, 84,171, 86, 13, 61,123,246, 68,106,106, 42, + 24,134, 65,247,238,221,209,179,231, 63, 85,185, 33, 33, 33,146,223,127,255,189, 29,203,178,103,156, 94, 32,229, 56,221, 65,104, + 24,111,177, 88,252,109, 0, 95,142, 83,200,108, 35, 71,142,196,180,105,211,240,254,251,222,155,122,124,245,213, 87,192,173,237, +169,238, 58,103, 97, 97, 97,185,194, 94,161, 80,124,254,228,147, 79,114, 55,111,222, 44, 39,174,156, 23, 55, 5, 81, 57, 78, 95, + 3,146,138, 68, 34, 68, 71, 71, 99,202,148, 41, 8, 15, 15, 71, 76, 76,140,187,129,252,124,166,209,109,224,174,114,218, 8,127, +244,211, 25, 31,182,254,126,217,122,177, 76, 10,236,223,181, 6,234,162,242,213, 73, 70,243, 63, 93,169,165, 77, 58,193,116,236, + 79,191,242,146, 32,166, 63,254,248, 99,124,252,241,199, 94, 3,180,104,209,162, 59,142,187,159, 98,235, 86, 78,158, 48, 10,101, + 40, 2,148, 85, 80, 63, 37, 20, 60,177,254,167,210,200, 3, 14, 31, 58,116,168,119,120,120, 56,210,211,211, 35,197, 98,113,239, +114,118,149, 94,143,196,196,196,218,121,121,121,173,124,113,142, 28, 57,210, 56,126,252,120,217,128, 1, 3,240,228,147, 79, 98, +192,128, 1, 50,137, 68, 82,147, 16, 2,179,217,140,244,244,116,252,249,231,159,200,203,203, 59,231, 45,156, 60, 33,140, 92, 17, +130, 0,101, 44,234, 55, 8, 1,207, 91, 43, 37,238,206,174,184,179,155, 85, 65,145,229, 54,127, 2,192,225, 63,215, 97,194,219, + 13,240,195,198,131,152,127, 8,104, 20,146,139,250,145,121,224,243,206,225,221,129,205, 48,235,167, 35, 0,128, 93, 59,125,166, + 17,241,150, 7, 13,122,243, 29,197,221,217,185,114,190,142, 31,109,180,110,225, 20, 62, 18, 75, 75, 75, 81, 92, 92,140, 37, 75, +150,224,165,151, 94, 66,110,110, 46,210,210,210,112,241,226, 69,252,252,243,207, 80, 40, 20,183,149, 70,163, 94,253, 0,227,103, +189, 3, 2,130, 58, 53,234, 99,236,208,143,209,188, 81,203, 59, 78,119, 87,248,225,102,121,228,156, 59,119,238,237,230,165,135, + 78,104,185, 69, 68, 68,196,128,118,237,218,193, 96, 48, 32, 50, 50, 18,105,105,105, 96, 89,182, 58, 80, 86,133, 23, 23, 23,183, + 50, 47, 47,175,186,191,124, 34,145, 8, 86,171,213,209,246, 71, 88, 0,160, 87,175, 94,248,237,183,223,124,126, 81,196,196,196, +160,106,213,170,120,235,173,183,110,233,229,224,220,211, 65, 46,151, 99,227,198,141,217,133,133,133,133,132,144, 10,117,115, 19, + 26,198,239,217,179,199,239, 6,240,206, 48,155,205, 55, 47, 94,188, 24,187,104,209, 34,145,151,151,159, 3,187,118,237,178,194, + 71, 85,205,221,224,116,247,101, 74, 8,241, 40,178,252, 25, 70,192,215,128,164, 28,199,225,194,133, 11,152, 48, 97, 2, 24,134, +193,154, 53,107, 30,136,135,235,212,249,130,111, 88,150, 13,237,245, 68,235,134, 96, 24,152, 77,183,214, 84, 7, 22,105, 28, 34, +235,201,207, 86, 96,237,168,254,254,136,158,203,187,119,239, 14, 91,180,104, 17,231, 79,186,239,222,189,219, 74, 8,169,112,181, +159,240,194, 49,155,205,208,235,111,207, 69, 33,132,236,155, 62,117,124,151,165, 63,110, 18, 51,140, 9,251,119,174, 65, 73,177, +251,230, 12, 82, 49,135,111,150,252, 98,149,136, 69, 55,255,229,164,251,162,111,223,190, 3, 22, 44, 88, 80,223,221, 78, 63, 58, +193,164, 25, 12, 6,100,100,100, 64,167,211,173, 30, 55,110,156,121,211,166, 77, 47, 63,245,212, 83,120,228,145, 71, 16, 27, 27, +139,172,172, 44, 92,190,124, 25, 75,150, 44, 33,123,247,238, 93, 13, 96,152,143,251,184,110,198,212,241, 47, 46,249,105,147,148, +101,204,216,191,107, 13, 74, 92, 68,251,173,238,180, 24,223,254,240,139, 89, 34, 17,159,247,229, 22, 57,187, 89,149,249, 98,236, + 61,104, 40,158,156, 55, 31,213,155,119,195,140,153,157,241,237,212,126,152,221, 93, 2,243,170,129,104,244,204, 82, 44,159,212, + 3, 0, 80,229, 91, 63,221, 18, 78,130, 27,110, 28,171,226,146, 0,187,184,169,152,107, 42,196,221,155,115, 85, 81, 71,139,101, + 89, 36, 37, 37,161,122,245,234,120,252,241,199,209,164, 73, 19,116,232,208, 1, 39, 78,156,192,137, 19, 39, 48,114,228, 72,111, + 34,203,103, 26,181,111,213, 5, 7,219,156,191,227,180,113, 77,247,202,128, 63,121,105,232,208,161, 0,240, 80,185, 91, 21, 22, + 90,106,181,250, 4,207,243, 13,131,131,131, 5, 71,202,177,239,250,245,235,224,121, 94, 87,209,132, 49,153, 76,194,224,152,229, +198,101, 18, 26,199,123,123,240, 9, 33,182,194,194, 66,180,107,215, 14,109,218,180,113, 84,159, 56, 47, 78,194, 4,107,215,174, + 5, 33,164,194,141,172,157, 26,198,107, 80,193, 6,240, 0,144,155,155,219,173,109,219,182, 91, 57,142,243,107, 22, 77,158,231, +211,114,114,114,158,184,215,156,238,210,135,231,121,143, 34,203,159,130,200,215,128,164, 28,199, 65,169, 84,226,215, 95,127, 69, + 68, 68,196, 3,245,128,157, 56,155,247,137,183,253,237,194,165, 59, 1, 68, 62,249,217,138, 27, 59, 11,204, 9, 79,126,182,226, +250,218, 81,253,171,121, 59, 39, 59, 59,187,107,255,254,253,127,247, 55,221,173, 86,235,181,236,236,236, 10, 15,151, 64, 8,193, +249,243,231,249, 87, 94,121, 37, 63, 47, 47,175,223,237,196,127,236,132,249,179,167, 77, 28, 30,222,189, 75,139,230, 96, 1,147, +231,198,191,132, 1, 8, 39, 22,221, 28,253,254,220, 87,251,245,235,247,111, 38,155, 58, 59, 59,251,241,167,159,126,122, 24,254, +105, 58, 81, 78, 72,193, 67,239,106, 59,230, 85,173, 90,181,129, 72, 36,146, 1,152, 0,224,250,222,189,123,191,216,187,119,111, + 87, 0,143,137, 68,162, 88,155,205,150, 97,255,232, 89, 1,224,111,223,249, 40,247,117, 16, 62,190,123,231,199,186,129, 97,136, +201,100,244,241,129, 4, 2, 66,136, 68, 34, 62,127,248, 68, 86, 35,111, 31, 82, 78, 51,112, 84,122,149,253,176, 97,195, 48,108, +216, 48, 71,126,250,252,243, 54, 88,125,106, 15,158,105,148, 14,227,215,173,193,168,170,249,253,193, 7, 0, 31,124,248, 74,165, +133,205, 57,238,206,142,150,187,231,160, 34,109,180, 68, 34, 17,242,243,243,113,225,194, 5,228,228,228, 64,167,211,225,236,217, +179, 48,155,205, 40, 42, 42, 66,131, 6, 13,110, 59,156,149,149, 70,255, 38,231,195, 88,125, 88, 97,161,101, 54,155, 63, 74, 74, + 74, 18, 7, 4, 4,212,183,217,108, 32,132,192,102,179, 17,187,168,169,112, 47, 60,177, 88,108,168, 85,171, 22,227,174,119,130, +240, 95,169, 84,234,189,184, 37,211, 19, 19, 19,199, 49, 12, 35,242,244, 21, 34,252,231,121,222,198,113,220,244,219,188, 87,119, +218, 48, 94,155,151,151,215,178,146,211,239,110,112,186,166,143,182,110,221,186,142, 25,237, 93,199, 68,177, 79,182,170,245, 33, +206,189, 14, 72,170,213,106,179,186,117,235,102,115,222,239, 60,160,233, 3, 13,134, 92,239, 49,224,229,132,157, 5,230, 4, 0, + 16,196, 22, 8,185,238,229, 44,125,118,118,118,187,187, 29,180,171, 87,175,154, 30,123,236,177, 31, 75, 75, 75,135, 2,184,237, +214,252,239,127,244,249,251,247, 97,202,168, 1, 76,187,205,115,175, 23, 20, 20,116,116,217,246,183, 32,168,132,113,237, 42, 44, +218,207,229, 87,250,216, 98, 86,171, 53,189,122,245,234, 21,114,110, 44, 22, 75,186,175,253,174, 99,132, 57,227, 52,130,241,254, + 1,160,172,243,119,129, 95,156, 6,131,161,176,101,203,150,226, 10,198, 45,215,223,184,199,198,198,162, 74,149, 42,142, 95, 1, +174,219,125,133,211,106,181,166,199,199,199, 35, 34, 34,194,227,136,239,174,109,178,252,225,172,236, 52,242,198, 89,165,202,210, + 74,231,188,221,112, 82,248,135,206,148,147,114, 82,206,251,150, 83, 68,239, 39,229,164,156,148,243, 30,114, 62,112, 32,132,128, +182, 82,163,160,160,240, 4, 27,189, 5, 20, 20, 20, 20,119, 6,198,139, 42,173, 72, 79,159,219, 81,182,219, 40, 39,229,164,156, +148,147,114, 82, 78,202,249,208,113,250,226,174,236,158,198,255, 26,238,100,120,156,187, 41,192, 40, 39,229,164,156,148,147,114, + 82, 78,202,249,240,113, 62,112,160, 85,135, 20, 20, 20, 20, 20, 20, 20, 20,119, 17, 84,104, 81, 80, 80, 80, 80, 80, 80, 80, 80, +161, 69, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20,247, 21, 8, 33,101, 83,240,108,216,176,193, 49,208, 67,106,106, 42, 67,111, 13, 5, 5, 5, 5, + 5, 5,197,189,196,131,170, 69, 56, 42,176, 40, 40, 40, 40, 40, 40, 40,254, 11,120, 16,181, 8,235, 78, 73, 82, 80, 80, 80, 80, + 80, 80, 80,220,107, 60,136, 90,132,125,144, 85, 36, 5, 5, 5, 5, 5, 5,197,253,131, 7,222,209,162,174, 22, 5, 5, 5, 5, + 5, 5,197,191,133,251, 88,139, 16,251,226,188, 78, 65, 65, 65, 65, 65, 65, 65, 65,113,135, 2,203,227, 47,157,235,144,130,130, +130,130,130,130,130,226,246,193,184, 89,191,167,110, 22,157,217,156,114, 82, 78,202, 73, 57, 41, 39,229,164,156, 15, 37, 28,227, +104, 81, 80, 80, 80, 80, 80, 80, 80, 80,220,153,174,114,250,239,112,186,168,208,162,160,160,160,160,160,160,160,184,115,145,197, +184, 91,167,109,180, 40, 40, 40, 40, 40, 40, 40, 40,238, 18,168,163, 69, 65, 65, 65, 65, 65, 65, 65,113,103,112,109, 4, 79,171, + 14, 41, 40, 40, 40, 40, 40, 40, 40, 42, 89,108,185,221,232,169,231,192,182, 10,144,223, 78,239,131,109,148,147,114, 82, 78,202, + 73, 57, 41, 39,229,124,232, 56,125,113,111,195,253,135,118, 0,118, 0,104,111,255, 5, 0,134,144,187, 63,210, 3,237,250, 74, + 57, 41, 39,229,164,156,148,147,114, 82,206, 7, 29,174, 3,150,150,173,208, 1, 75, 41,252, 0, 7,239, 85,204,190,246, 83, 80, + 80, 80, 80, 80, 60,108, 98,139, 56,191, 36,221,161, 38,128,247, 1, 4, 59,109, 59, 4, 96,186,203,113, 63, 1, 80, 56,173,107, + 1, 76, 2,112,201,103,104, 8,145,216,249,101,246,133, 7, 96, 0, 96, 4, 80,202, 48,140,133,166,217,191,142,150, 0, 82,237, +255, 55, 0,216, 95,193,253, 15, 20, 98, 99, 99,229,161,161,161, 93,143, 29, 59, 38, 61,123,246, 44,118,239,222, 77,190,249,230, + 27,115, 81, 81,209,150,172,172, 44, 61,205, 46, 15, 4,186, 1, 24,107,255, 63, 3,192,230, 59,228, 99, 20, 10,197, 72,165, 82, +217, 67, 38,147, 85,177, 90,173,140, 78,167,203,212,106,181, 91,173, 86,235,103,246,114,175,162,232, 19, 22, 22,246,114,157, 58, +117,106,166,165,165,101,100,102,102,254, 4, 96, 21,128,126, 85,170, 84, 25,152,152,152, 24,119,254,252,249, 75,133,133,133,223, + 2, 88,247, 47,134,147,130,226, 97, 2,227,205,141,112,135, 9,132,144,129,229, 24,152, 91, 57, 58,118,236,216,123,203,150, 45, + 10,158,231, 33, 44,114,185,220, 10, 96,176, 15,145, 21,190,111,223,190,132,161, 67,135, 62,153,153,153,217,172,180,180,244, 81, + 0, 80, 40, 20, 7,163,162,162, 14,207,155, 55,239,103, 66, 72, 58,195, 48,165, 21,140, 40, 39, 22,139, 95, 10, 13, 13,237, 97, +181, 90,155, 16, 66, 32, 22,139,143, 21, 21, 21,109,182, 88, 44,223, 2,184, 29,241, 38,229, 56,110,152, 76, 38,235,102,181, 90, + 27, 2, 0,199,113, 39,141, 70,227,102,171,213,250, 5, 0,211,109,112, 6, 72,165,210, 97, 42,149,170,139,201,100,106, 8, 0, + 82,169,244,164, 90,173,222,106, 50,153,190,176, 11,206,127, 27, 28,128, 84, 66,136, 24, 0, 68, 34, 81,159, 71, 31,125, 52,129, + 97, 24,158, 97, 24, 66, 8, 97, 14, 30, 60,216,216,102,179,177,246,252,145, 10,224, 48, 0,235,253,248,132, 68, 68, 68, 76,227, +121,190,138,215, 68, 11, 8,104,118,236,216,177, 58, 43, 87,174,180,125,253,245,215,197, 67,134, 12, 9, 28, 58,116, 40,247,249, +231,159,127,145,149,149,245,166,235,241,225,225,225,179, 89,150,141,240,231,250, 60,207,231, 23, 20, 20,188, 67,203,170,127, 29, + 99,191,220, 86,218,150, 16, 96, 88,151, 32,246, 78,133, 86, 92, 92,220,146, 23, 95,124,113, 64,195,134, 13, 57, 66, 8, 44, 22, + 11,140, 70, 99,157,253,251,247,183, 95,179,102, 77,179,210,210,210,126, 21,164,124,245,189,247,222,155, 50,121,242,228, 8,177, + 88,204, 88, 44,150, 26, 43, 87,174,108,242,250,235,175,191,181,104,209,162,170,207, 62,251,108,144,176,125,194,132, 9,205,103, +204,152,145, 12,224,179,127, 33,156, 20, 20, 15, 27,218,161,124, 27,173,137, 0, 62,246, 38,180,148,246,151,103, 14,202,156, 44, + 56,253, 58,176,125,251,246,245, 28,199, 9,142,214,163, 90,173, 54, 26,229, 93, 48,119, 34, 43,113,208,160, 65, 45, 87,175, 94, + 61,237,217,103,159,205, 86, 40, 20,181,158,122,234,169, 82,134, 97, 68, 43, 87,174,108, 92,189,122,117,121,175, 94,189, 6,117, +236,216,113, 20, 33,100, 55,195, 48,121,126, 70,178,126, 88, 88,216, 47,159,124,242, 73, 66,183,110,221, 36, 17, 17, 17, 32,132, + 32, 51, 51, 51,110,227,198,141,221, 39, 78,156, 56,170,176,176,176, 47,128, 51, 21,184,113,205,229,114,249,234,137, 19, 39,198, +118,239,222,157,139,137,137,129,193, 96,192,217,179,103, 59,111,222,188,185,237,162, 69,139,222,212,235,245,207,216, 5,134,191, +120, 52, 56, 56,120,205,247,239,189, 23,221,226,165,151,184,176,176, 48, 16, 66,144,151,151,215,121,207,210,165,237,223,248,228, +147, 55, 75, 74, 74,158,118,119,191,255, 77, 72,165, 82,118,217,178,101,143, 72,165, 82, 0,128,201,100, 66, 74, 74, 10,243,192, +124,138, 48, 76,124,102,102,102,176, 68, 34,113,187,223,102,179,161,109,219,182, 73, 18,137, 4,159,125,246,153, 37, 63, 63,191, +241,130, 5, 11,142, 45, 95,190, 60,226,139, 47,190,120, 6,192, 45, 66,139,101,217,136,244,244,116,183,156, 54,155, 13,102,179, + 25, 86,171, 21, 38,147, 9,245,234,213,163,197,212,127, 3, 9, 0,176,233,132, 1, 0,194,238,148, 76,169, 84,214,125,238,185, +231,184,188,188, 60,136,197, 98,152,205,102,100,103,103, 35, 37, 37, 69,244,227,143, 63,214,174, 40, 95,141, 26, 53,134,204,152, + 49, 35,114,211,166, 77,230,101,203,150,153,186,116,233, 34, 30, 50,100,136,170,109,219,182,245,226,227,227,217,239,190,251,206, +184,117,235, 86,203,160, 65,131,164,211,167, 79,143,220,184,113, 99,175, 51,103,206,124,118,175,195, 73, 65,241, 16, 98, 7,254, + 25,226, 65,248,245, 42,180,224, 36,174,250, 0,128, 88, 44,110, 28, 29, 29,189,196,106,181,198,216, 93,157,236,156,156,156,207, + 44, 22,203,113,251,177,235,120,158,239,237,203,201, 26, 52,104, 80,203,223,127,255,125,214,254,253,251, 75, 10, 10, 10, 98,214, +175, 95,111, 24, 53,106, 84, 26, 0, 92,189,122, 53,185, 87,175, 94,113,195,135, 15, 79,239,218,181,235,188, 14, 29, 58,140, 32, +132,108,101, 24, 70,235, 75,100,165,164,164,236,219,181,107, 87, 80, 72, 72, 72,185, 29,137,137,137, 24, 49, 98,132,164,119,239, +222,213, 59,117,234,180,247,242,229,203,109, 0,156,242, 71, 16,213,172, 89,115,219,246,237,219, 3, 67, 67, 67, 81, 92, 92,140, +236,236,108,232,116, 58,168, 84, 42, 60,251,236,179,146,118,173, 31,175, 58,124,228,155,219,210, 51, 50, 58,251, 41,182, 30,125, +188,126,253,109,203,167, 79, 15,180,220,184, 1,185, 92, 14,141, 70, 3, 0, 8, 10, 10, 66,179,164, 36,238,200,210,165,113, 3, +199,140,217,118,248,194,133,206,255,146,216,146,217,127,141, 0, 54,136, 68,162, 62, 82,169,148,237,211,167, 15,182,109,219,198, + 24, 12, 6,206,238,238, 88,251,244,233, 3,185, 92, 14,147,201,196,163,172,234,208,122, 63, 63, 37, 82,169, 20,151, 47, 95, 46, +183,173,180,180, 20,121,121,121, 40, 40, 40,128,209,104, 68,113,113, 49,120,158,103,228,114,121, 30,207,243, 96,217, 50, 67,207, + 19,167, 68, 34,193,133, 11, 23,202,109,179, 90,173,208,106,181, 48, 26,141, 48,155,205, 40, 45, 45,149, 7, 5, 5,213,140,136, +136, 72, 7,176,174,176,176,240,179,156,156,156,235,180,220,250, 87,112, 99,195,113, 67, 53,148, 57,213,215, 42,129,143, 7,128, +221,187,119, 35, 39, 39, 7,249,249,249,200,203,203, 67,124,124, 60, 8, 33, 21,174,142,187,124,249,242,151, 13, 26, 52, 96, 78, +159, 62,189, 25,192,231, 43, 87,174, 28, 92, 88, 88, 56,118,244,232,209, 97,159,126,250,105,225,152, 49, 99,102, 0,248, 97,229, +202,149,255,171, 91,183,110,143,115,231,206, 45,250, 55,194, 73, 65, 81,217, 32,132, 52, 7, 16,105, 95,205,183,151,187,225, 78, +235, 39, 24,134, 49, 57, 29,103, 2, 32,117,243, 43, 64, 88,207, 99, 24,230,176,211,121,121, 12,195, 28,190,221, 96,186,252,150, +125,116, 3,192,134, 13, 27,136,176,184, 59, 51, 42, 42,106,100,199,142, 29,103, 29, 61,122,180, 94, 86, 86, 86,104, 86, 86, 86, +232,209,163, 71,235,117,236,216,113, 86, 84, 84,212, 72,167, 27,225,122,234, 54,167,125,146,125,251,246, 37,252,242,203, 47, 51, +182,109,219, 86,210,184,113, 99,211,246,237,219,173, 93,187,118,205,181,191,160,173, 93,187,118,205,253,235,175,191,108, 45, 90, +180,144,255,254,251,239, 55,247,238,221, 59,123,245,234,213,209,132, 16,145, 59, 78, 59,196, 33, 33, 33,191,238,220,185,243, 22, +145,229,140,170, 85,171, 98,195,134, 13,170,144,144,144,117, 0, 36,158,194,105, 71, 64, 64, 64,192,154,191,254,250, 43, 48, 40, + 40, 8,185,185,185, 16,139,197,136,138,138, 66, 73, 73, 9,178,179,178,112,253,226, 69,176, 38, 19,230, 76,157, 28, 36,151,203, + 87,187, 36,160, 91,206,224,224,224, 53,203,167, 77, 11, 44,216,182, 13,127, 79,153, 2,179,217,236,168,114, 53,155,205,216, 59, +116, 40,242,254,252, 19,223, 77,152, 16, 24, 28, 28,188, 6, 64,128, 15,206,202,128, 51,231, 80, 0,133,246,101, 40,128,253, 41, + 41, 41, 71,207,158, 61,139, 54,109,218, 96,213,170, 85,141, 70,143, 30, 61,116,244,232,209, 67, 87,173, 90,213,168, 77,155, 54, + 56,123,246, 44, 82, 82, 82,142,162,124,251,172,187, 29,206,187,198,105,179,217,202, 45, 60,255,207, 59,166, 74,149, 42,185,191, +252,242, 11,158,125,246, 89, 86, 42,149,102,245,239,223, 95,182,103,207, 30, 98, 23,153,126,135,211, 96, 48, 64,175,215, 67,171, +213,226,234,213,171,242, 79, 62,249,164,245,199, 31,127, 92, 99,219,182,109,113,239,191,255,254, 27,145,145,145,199,162,163,163, + 19, 30,132,251,121, 31,114,102, 3, 48,163,172,189,233,245, 59,225,236,216,177, 99,131, 26, 53,106, 68,175, 60, 29,138, 34, 73, + 29,240,146, 16,240,146, 16,216,194,155,227,178,244, 9, 84,171, 86, 45, 58, 48, 48,176,101, 5,195,185,236,244,233,211,143,217, +191,148, 11, 0,204, 26, 51,102,204, 68,134, 97,118,143, 25, 51,102, 50,128, 89,246,237, 83,206,157, 59,215, 2,192,242,127, 41, +156, 52, 47, 81,206, 10,195,135, 22,137,100, 24,102, 3,195, 48, 27,198,141, 27,215, 1, 64,184,203,122, 43,231,227, 0, 72,221, +253, 10,139,211,246, 72, 66, 72, 79,167,243, 34,111, 51,248,140,155,229, 31,161, 5, 0,169,169,169, 76,106,106,170,176,227, 16, +195, 48,235, 1, 28, 18,139,197,141, 31,121,228,145, 62,127,252,241, 71, 80,100,228, 63,215,143,140,140,196,234,213,171,131,234, +215,175,223, 71, 44, 22, 55, 6,112, 72,165, 82,173,247,226,194,132, 12, 29, 58,244,201, 23, 94,120, 65,221,184,113, 99, 0, 40, + 62,115,230,140,162, 69,139, 22, 90,171,213,202, 88,173, 86,166, 69,139, 22,218, 51,103,206, 40, 44, 22, 75,105,243,230,205,149, +157, 58,117, 74,123,231,157,119, 6,185, 17, 28,206,120,110,230,204,153,241,161,161,161,222,148, 48, 74, 75, 75, 17, 29, 29,141, +161, 67,135,198,136,197,226,151,189,221, 45,142,227,134,205,156, 57, 51, 42, 36, 36, 4, 69, 69, 69,136,143,143,135,201,100,194, +133, 11, 23, 96,208,106, 96, 41, 85,195,162, 46, 70,222,149, 75, 8, 17,115, 24,212, 59, 53,154,227,184, 97, 62,220,146, 97,223, +142, 25, 19,109, 74, 75,195,213, 85,171, 96,179,222,106,254, 88,205,102,156, 92,188, 24,134,244,116,204,120,229,149,104,169, 84, + 58,236, 30, 59, 89,159, 18, 66,228,132, 16, 57,195, 48,243, 90,182,108,249,163, 92, 46, 31, 58,125,250,244,110, 91,182,108,233, +190,107,215,174,246, 86,171, 85,108,181, 90,197,187,119,239,110, 99, 48, 24, 56,153, 76, 6,142,227, 8, 30, 80,136,197, 98, 72, + 36, 18,200,229,114,180,110,221,250,202, 55,223,124, 99,137,143,143, 23,175, 89,179, 38,180, 74,149, 42,202,207, 63,255,188,184, +180,180,116,166,191,124,102,179, 25, 70,163, 17,122,189, 30, 6,131, 1,219,183,111, 79, 26, 62,124, 56,103, 48, 24,108,189,122, +245, 42,180, 88, 44,198, 49, 99,198,168,194,194,194, 70,209,111,216,127, 5, 86, 0, 26,187,208, 50,186, 60, 31, 13,157, 28, 95, +159, 40, 46, 46, 94,244,237,183,223,198,179,178, 16,236, 49,245,192,207,252, 68,108, 9,254, 28,185, 9,239, 34, 42,190, 6, 6, + 12, 24, 16, 69, 8,249,188, 18,194,188, 0, 64, 91, 0,243,110,231,228,123, 16,206, 4,165, 82,185, 42, 40, 40,104,143, 82,169, + 92, 5,123,245,236,157,160, 75, 13,116,238, 93,151, 77,239, 82, 29,164,119, 93, 54,189, 75, 13, 58,212,192,131, 2, 23, 45,226, +140, 60, 66, 72, 42, 33, 36,117,198,140, 25,211,156,222,239,194,186,220, 79,103, 44,149, 16,146, 90, 78, 33,149, 9,172, 59, 54, +221,220, 44,101,154,194, 89, 73, 58, 69,206,209,187, 48, 58, 58,122,201,146, 37, 75,130, 92, 25,179,178,178,160, 86,171, 49,126, +252,248,160, 23, 94,120,225,205,244,244,244, 23,125, 4, 66,154,157,157,221,100,224,192,129, 1,102,179,185,136,231,121, 86,173, + 86,115,193,193,193, 54,225,128,224,224, 96, 91, 73, 73,137, 88,171,213,138,108, 54,155,241,133, 23, 94,144,190,242,202, 43,205, + 0,136, 60,145, 70, 70, 70,118,233,209,163,135,212,211,126,139,197, 2,173, 86, 11,173, 86, 11,179,217,140,214,173, 91,203,190, +249,230,155,174,185,185,185, 11, 61, 42, 14,153,172, 75,151, 46, 93,196,133,133,133, 8, 14, 14,198,245,235,215,113,237,218, 53, + 24, 53, 26,152, 53,106,152, 53,165,176,150,170, 65,212, 37, 40,184,116, 30, 45,234,214,145,252, 36,147,117,211,106,181,179, 61, +113,170, 84,170, 46, 45, 6, 15,230,148, 74, 37,218, 15, 44,235,103,240,123,221,186, 32, 54, 27,120,155, 13, 54,171, 21,221, 46, + 92,128,197, 98, 1,203,178,104, 94, 88,200,169,150, 46,237,146,151,151, 55,235,223,200,236, 50,153,140, 91,182,108,217,115, 82, +169, 20,132, 16,198,100, 50, 97,203,150, 45, 15,221, 67, 47,149, 74, 17, 16, 16, 0,179,217,140,196,196, 68,253,192,129, 3,247, + 77,157, 58,181, 26,203,178, 74,137, 68,242, 71, 65, 65,193,180,172,172,172,171,254,242, 89, 44, 22,152, 76, 38,152, 76, 38,232, +245,122, 92,185,114, 37, 38, 41, 41,137, 25, 58,116,168, 77,167,211, 37,207,159, 63,255,242,150, 45, 91, 20, 51,103,206,124, 10, +192, 8, 90,236,222,219,228, 6, 16, 92, 45,156,211,138, 69,208, 0, 8,178,139,130,167, 24,134,105, 81,175, 94,189,208,179,103, +207, 22, 17, 66, 14, 0,248, 25, 64,150, 55, 50,158,231, 25,158,231,241,250,163,197, 24,218, 82, 4,139,165, 4, 37, 37, 37,184, +126,253, 58,206,156, 57,131,131, 7,207,220,238,179,249,114, 96, 96, 96,215,128,128,128, 68,171,213,202,106, 52,154,235, 58,157, +110, 27,207,243,139,224, 82,101,225, 15,238, 86, 56, 5, 40,149,202, 79,222,127,255,253,199,131,131,131,113,252,248,241,228, 21, + 43, 86,124,162,213,106,239,168,113,125,128,152,253,110,246,220,207,227,226,162, 66,112, 98,215,111,113,211,190, 90,249, 29,192, +199,211, 44,124,255,195, 69,139, 56,139,161,195,132,144,158, 12,195,108,112, 21, 74, 21,178,157,238,240,124, 31,142,150,235,196, +210,229,133,150, 7, 5, 9,171,213, 26,227,236,100, 17, 66,144,149,149,133,140,140, 12,228,229,229, 33, 52, 52, 20,102,179, 57, +198,159,242,161,180,180,244,209,240,240,112,157, 88, 44, 54,234,245,122, 40, 20, 10, 94, 44, 22, 19,251,117, 24,123,175, 69,155, +209,104,100, 56,142,179, 4, 5, 5, 5, 26,141,198, 58,240,210,150,140, 16,242,104,120,120,184,219,125, 70,163, 17, 26,141, 6, + 90,173, 22, 26,141, 6, 70,163, 17,209,209,209,176, 90,173, 77,188,126,210, 90,173, 13, 35, 35, 35,145,153,153, 9,185, 92,142, +244,244,116,152, 52,165, 48,151,150,194,170, 85,195, 86, 82, 2, 94,173, 6,175, 85,195, 98,210, 33,174, 86, 93, 8, 61, 18, 61, +193,100, 50, 53, 12, 15, 15,135, 86,251, 79,115, 51, 98, 23, 88, 86,171, 21, 86,123,227,104,161, 58, 49, 34, 34, 2, 66,143,196, +123, 4, 35,128,209, 44,203,206,147,201,100,220, 27,111,188,129,172,172,172,114,121,226,141, 55,222,112,180,201,106,219,182,237, +238,128,128, 0,107, 94, 94, 30,140, 70,163,248, 65,125,232, 25,134, 1,195, 48,101,105,100,181, 34, 34, 34, 66,155,159,159,127, +176,184,184,248,185,219,225,179, 88, 44, 66,143, 46,232,245,122, 16, 66,112,252,248,113, 4, 4, 4,136,109, 54,219,105,171,213, +170, 16,139,197, 96,237,141,191, 40,238, 25,218,215, 9,145,206,158,222, 34, 42,228,145, 94, 74,173, 66, 42,210,242,215, 31, 73, +252,254,211, 51, 43, 94, 24,244,114,208,164, 73,147, 18, 34, 34, 34, 2, 46, 95,190,108,152, 60,121,114,210,178,101,203, 24,148, + 85,211,121,196,141, 27, 55,214,190,255,254,251, 97, 61,122,244, 72,150,201,100, 76, 73, 73, 9,242,242,242,144,147,147,131,107, +215,174,145, 19, 39, 78, 92, 49, 26,141,171, 42, 18,200,216,216,216,111,158,123,238,185, 23,154, 54,109, 42, 22, 28, 82,173, 86, +219,120,231,206,157,189,127,255,253,247, 54, 90,173,182,194,249,242,230,205,155,171, 62,248,224, 3,229, 19, 79, 60, 81, 71, 38, +147,177,149, 17, 78,103,176, 44, 27, 29, 24, 24,136,109,219,182, 33, 36, 36, 4, 44,203, 70,223,105, 98, 25,204,124, 92,149,152, +112, 24,246,206, 70,157,200, 4, 24,204,124, 28,205,194, 15,142,163,229,225, 93,223, 92,112,164,124,136, 37,253,216,177, 99,223, +103, 24,102,195,216,177, 99,223,119,231,104,217,255,218,156,143,115, 58,222, 88,217, 98,171, 66, 3, 77,242, 60,143,140,140, 12, +100,102,102, 34, 35, 35, 3, 5, 5, 5, 96, 89, 22,132, 16,127,122,159, 17,134, 97,248,173, 91,183,134,238,219,183, 79,219,188, +121,243, 98,161,253,139,213,106,101, 44, 22, 11, 99,111, 23,195, 92,191,126, 93,178,103,207,158,144,115,231,206, 69,163,172,193, + 26,239,195, 10,188,101,155, 32,176,156, 23,131,193,128,128,128, 0,255, 84,135,253, 69,120,252,232,209, 50,145,165, 41,181, 87, + 25,150,192,166, 46, 1,209,150, 66,106,179, 64, 10, 2,198,160,243,251,254, 57, 67, 16, 89,102,187,208, 50,153, 76,176, 88, 44, +224,121, 30, 86,235,191,210,174,252,203, 70,141, 26, 53, 89,187,118,237,144,140,140,140, 91,118,246,237,219, 23, 35, 70,140,192, +240,225,195,207,245,236,217,243,196,111,191,253,134, 97,195,134,129,231,249, 71, 0,148, 0,248,253, 65,123,232,141, 70,163,195, +129, 50, 24, 12, 48,155,205,128,151,198,239,190,242,166,144,182, 86,171, 85,224,102,214,174,253, 5,187,119,239,102,207,156, 57, + 29,255,198, 27, 67,133, 6,247,180,196,189, 55,120, 66,202, 50, 95,143,108, 24, 22, 48,170, 81,184, 86,202, 49,154, 11, 95,191, +175,185, 86, 77,165,141,174,170, 48,197, 39,133, 84,153, 54,109,106,236,185,115,231,141,227,199,143, 63,219,191,127,255,168, 81, +163, 70,213, 91,179,102, 77, 27,131,193,240, 45,128, 98, 79,166, 75,239,222,189, 15, 68, 69, 69, 37,125,245,213, 87,185, 55,111, +222, 12,181, 88, 44, 74,179,217,204,107,181,218,107,122,189,126,155,217,108,222, 6,224,104, 69, 2, 27, 20, 20,212,104,240,224, +193,226,226,226, 98,112, 28, 7,179,217,140,220,220, 92, 60,254,248,227,162,245,235,215,215,191,157, 27, 80, 84, 84, 52,251,219, +111,191,221,177,124,249,242,174, 42,149,170,169, 76, 38,139, 1, 96, 43, 45, 45,205,209,106,181,127,223, 78, 56,203,149,115, 54, + 91,206,209,163, 71,171,171, 84, 42,220,184,113, 3, 54,155, 45,231, 78, 19, 45, 64,194,222, 60,185,107,125,213,186, 17, 73,216, +179,239, 0, 2, 36,236, 77, 58,212,215, 3, 15,161, 13, 21,156, 5,148, 27,129,180,111,250,244,233,242, 25, 51,102, 96,250,244, +233,167,221, 57, 90,130,224,154, 62,125,250,105,225, 56,167,227,119,221, 65, 24, 61, 59, 90,158, 20, 36, 80,214,187, 48, 47, 47, + 47, 52, 36, 36,196, 33,176, 50, 51, 51,145,153,153, 9,169, 84,138,235,215,175, 67, 42,149,102,249,243, 17, 34,151,203,143, 52, +110,220,184,246,213,171, 87, 37,147, 39, 79,174,122,244,232, 81,213,227,143, 63,222, 64, 46,151,219, 8, 33, 48, 24, 12,236,217, +179,103, 3,103,205,154, 21,247,232,163,143,154, 30,125,244,209, 99, 43, 87,174,212,195,203,248, 87, 12,195, 28,202,202,202, 74, + 78, 76, 76, 20, 68, 91, 57,113,229, 44,184,128,178, 42, 79,142,227,142,121, 11, 40,199,113, 39, 47, 92,184,208, 89, 17, 32,131, +169, 84, 13,179, 70, 13,107,105, 41,108,165, 37,176,149,148, 0, 90, 53,164, 86, 43,196, 54, 11,228, 1, 1,200, 72, 79, 7,199, +113, 39,189,113, 74,165,210,147, 57, 57, 57,157, 67, 66, 66, 28, 47, 81,139,213, 90,182,216,108, 48, 89,173, 14, 71, 75, 44, 22, +227,230,205,155,144, 74,165, 39,239,117, 78,102, 89,214, 38, 12,225,224, 33, 30,136,142,142,230, 91,180,104,129, 97,195,134,193, +102,179,217,147,129,105, 15, 96, 15,202,218,183,220,151,112, 39,110,133, 70,235,122,189, 30, 26,141, 6, 69, 69, 69,156, 92, 46, +175, 29, 23, 23,119,192,100, 50,173,178, 90,173,223, 93,187,118, 77,237,137,211, 46,204, 28,162,139,231,121, 16, 66, 96,179,217, + 96,177, 88, 32,145, 72,248,157, 59,119, 97,214,156, 79,176,228,187,101,164,119,239,222,204,250,245,235,193,243,124, 58, 45, 87, +239, 9, 62, 43,254,121,106, 0,172, 54,173,113,231,114,205,143, 23,213,218, 73, 63,206, 61, 98,146,138,212,205,218, 69, 55, 76, + 78,170, 45, 10, 9, 9,101, 23, 46,154, 87,240,211,178,213,151,111,220,184,161,254,226,139, 47, 90,214,174, 93, 59,248,239,191, +255,142,243, 36,180, 20, 10, 69,205,151, 95,126,121,112, 81, 81,145,100,201,146, 37, 43,179,178,178,142,160,108,104, 25,231, 30, +212, 61, 1,252,128,178, 42,203,104,123, 57,183, 7,192,100,111,223,107, 12,195,224,175,191,254,186,165,119, 32,127,103,234, 60, +164, 70,141, 26,207, 94,189,122,117,119, 78, 78,206,211,174, 59, 37, 18,201,164, 90,181,106,117, 59,125,250,244, 68, 0,155, 42, + 66,172,211,233,198,172, 94,189,250, 83,145, 72, 84,197,102,179,101,234,245,250, 49,119,236,104, 89,248, 87,166, 47, 92,177, 88, +111,178, 85,147, 75, 69, 55, 12, 22,254, 85,154,149, 31, 92, 55,203,142, 60, 39, 55, 42, 15,101,243, 8, 58,175,255,109,127, 25, +153, 8, 33,194,177,121, 78, 46,150,201,197, 5,115,183, 47,239, 14, 6, 75,119,215,227,144,241,230,104,141, 3,240, 40,128, 67, + 57, 57, 57,243, 94,120,225,133, 89, 63,253,244, 83,144, 90,173, 70, 78, 78, 14,114,115,115,193,113, 28, 84, 42, 21,190,252,242, + 75,125, 78, 78,206, 60,231,115,112,235, 8,242, 0, 96,136,136,136, 56,178,108,217,178,152,175,191,254,154,123,241,197, 23,175, +247,236,217,179,206,151, 95,126,121, 85, 34,145, 16,155,205,198, 24,141, 70,230,245,215, 95,175, 62,103,206,156, 52,145, 72,164, +120,246,217,103, 25,165, 82,121, 8, 94,134, 13,200,203,203,219,250,235,175,191, 62,249,206, 59,239,200, 76, 38,147, 91, 39, 75, +216, 22, 18, 18,130,189,123,247,154,138,138,138,182,248,112, 49,182,254,177,105, 99,219,231,251,247,151, 88, 74,213,176,148,170, + 97, 85,171, 97, 43, 45, 6,163, 81, 67,108,179, 66, 46,225, 17, 19, 31, 0,171, 62, 16, 27, 15,255,109, 49, 26,141, 94, 7, 54, + 84,171,213, 91,247, 44, 89,210,254,209,132, 4,110,239,200,145, 48, 91, 44,120,226,194, 5,135,184, 50,155,205, 88,215,176, 33, +108, 12,131, 71, 94,123, 13,151,172, 86,171, 90,173,222,250, 95,124, 24, 78,156, 56,145, 59,112,224,192,163, 60,207, 55,169,136, +187,243, 95,135,197, 98,185,197,141,178,217,108,101,174, 99,153,115, 32,221,184,113, 99,219,179,103,207, 74, 78,157, 58,133,221, +187,119, 63,242,211, 79, 63,141,171, 86,173, 90,195, 27, 55,110,100,251, 18,111,238, 6,253,133,189,253,225,202,229,171,240,191, +255,253,143,201,206,206,198,207, 63,255, 12, 95,131,167, 82, 84, 26,180,176,218,228,166,157,203, 53, 61, 55,221, 40,221,159,165, +159, 12, 96, 51, 12, 54,114,233, 24, 57,209,180,105,104, 4, 0, 24, 13,182,152,154, 53,107,182,227, 56, 78, 10, 0,129,129,129, + 77,195,195,195,191, 44, 40, 40,104,237, 46, 77, 83, 83, 83, 91, 68, 69, 69, 53,254,253,247,223,255,206,202,202, 58, 13,224,160, +235, 65,213,171, 87, 31,127,238,220,185,230, 98,177,152,241,145, 71, 0, 0,237,218,181,171, 45,147,201,194, 55, 93, 12,134, 90, + 82, 3, 68, 84, 2,112, 1,176,133, 52,194,117, 73, 61,196,199, 31, 8, 47, 42, 42,122,164,164,164,228,239, 10,222,131, 14, 79, + 62,249,228,119, 75,150, 44,137,111,215,174, 29, 57,118,236, 24, 11, 23,123,168,122,245,234, 93,247,239,223,223,228,213, 87, 95, +253,106,197,138, 21, 67, 81,190,167,173, 47, 92,183,143, 55, 88,105,216,122, 25,219, 0, 91,130,221, 51,163,185,248, 33, 64, 69, +134, 92,184,131,225, 25,238, 40,136, 30, 13, 12, 15,219, 31,181,143,137,245,168,197, 98, 57,126,226,196,137,117,207, 62,251,172, +166,160,160, 0,225,225,225, 72, 76, 76, 4,195, 48,248,242,203, 47,245,215,174, 93, 91, 99, 31, 75,235,209,204,204,204,222,118, +177,229, 14,165,243,231,207, 95,177,116,233,210,144,163, 71,143,138,172, 86,171,170, 78,157, 58,186,125,251,246, 5,138,197, 98, + 34,145, 72,248,163, 71,143, 42,170, 87,175,110, 96, 24, 70,246,231,159,127, 22, 28, 56,112,160,218,232,209,163,191, 69, 89,119, +107, 79, 88, 62,101,202,148,140,171, 87,175,194,104, 52, 66,173, 86,163,164,164,196,177, 20, 23, 23,163,164,164, 4, 98,177, 24, +217,217,217,248,229,151, 95,178,236,163,196,123,115, 54,190,248,252,203,133,121, 89, 55,174, 67,165,144,195,170, 46,134,173,164, + 0, 40, 45,129,212, 98,134, 82,108, 67,213, 26,114, 4, 40, 84,200, 81,107,176,100,223,225,108,251, 40,241, 30, 97, 50,153,190, + 24, 49,103, 78,142, 85, 34, 65, 66,191,126, 48,219,171, 10,157,133,150,141, 97, 80,173, 83, 39,176,193,193,152,182,102, 77,142, +125,148,248,123, 10,158,231, 69, 38,147,201, 91, 60,192,243,124,250,217,179,103, 87, 0,216,193, 48, 12, 97, 24,134,160,108,176, + 54,205,253,252, 32, 91, 44, 22, 76,152, 48, 1, 18,137, 4, 19, 38, 76,192, 71, 31,125,132, 89,179,102, 97,225,194,133,248,241, +199, 31,177,113,227,198,164, 61,123,246, 72,118,237,218, 69,166, 79,159,158, 95,189,122,117,209,107,175,189, 22, 34,151,203,223, +246,198, 57,102,204, 24, 4, 5, 5, 97,204,152, 49,248,228,147, 79,240,205, 55,223, 96,221,186,117,216,187,119, 47, 68, 34, 17, +159,158,126, 19, 6,131,129,204,159, 63, 63, 99,221,186,117,250,121,243,230,129,227, 56,134, 22,173,247, 4, 31,200, 7,126,120, + 54,100,241,249, 43,251,179,244, 31, 0,248, 67,248, 34, 85,169, 84,242,181,107,127,229, 0, 96,205,234, 95,196, 23, 46, 92, 8, +254,245,215, 95, 3,162,162,162,240,227,143, 63, 6,200,229,242, 40, 15,156,182,117,235,214, 25,165, 82,105,248, 43,175,188,210, +189,121,243,230,111,217, 63, 68, 59, 1,168,143,178,222,139, 93,174, 92,185,114, 38, 34, 34,226,226,150, 45, 91,180,254, 4,180, +180,180,244,219, 31,126,248, 33,177,208, 22,134, 77,218, 39,177,132,255, 20, 27, 67,190,195,245,132,143,160,168,210, 12,207, 61, +247, 92, 21,155,205,182,184,130,241,127,174,111,223,190, 63, 44, 89,178, 36,254,149, 87, 94,201, 62,118,236, 88, 14,128, 37, 0, +150, 57, 47,231,206,157,203,127,225,133, 23,178, 22, 47, 94, 28,251,236,179,207, 46, 4,240, 52,205, 58, 20, 20,229,191,133,224, +161,215,161,167,194,124,157,213,106,237,205,113,220,122,148, 31,176,244, 77,147,201, 20,203, 48, 12,145, 72, 36,217, 57, 57, 57, +243,156, 7, 44, 77, 79, 79,239, 29, 31, 31,239, 56, 7,101,179,123, 59,143,165,165,122,226,137, 39, 58,239,223,191,127,193,134, + 13, 27,114, 75, 75, 75, 3, 87,175, 94, 45,159, 49, 99,198,117,158,231,201,123,239,189,151,208,173, 91, 55,157,205,102,203,122, +237,181,215,170, 39, 37, 37,189,118,238,220,185,109, 12,195, 56, 11,173,114,156,118,212,175, 81,163,198,222, 53,107,214,168, 66, + 66, 66,144,155,155,139,194,194, 66,104,181, 90,216,108, 54,136,197, 98,228,229,229, 97,242,228,201,234,204,204, 76,119, 3,150, +186,227,124, 52, 49, 46,110,235,188,137, 19,130, 66, 56, 22, 5,231,207,194, 90, 84, 0,177,213,130,170,245,131, 33,145,202,113, +233, 66, 41,222, 94,254, 75,233,141,194, 98,119, 3,150,186,229,108, 86,179,230,182,175, 70,143, 14, 52,220,188,137,216,151, 94, +130, 78,167,131,217,108, 6,203,178,184, 50,111, 30, 36,145,145, 24,191,114,165,246,244,141, 27,157,112,235, 80, 25,238, 56,239, + 20,206,156, 67, 25,134,113, 52,134,239,219,183,111,185, 3,127,253,245, 87, 44, 92,184, 16, 70,163,209, 74, 8,121, 19,192,151, + 0, 2,237,187, 53,247, 48,156,149,206, 25, 22, 22, 54,239,247,223,127, 79,140,138,138, 98,156, 71,108,183,139, 79, 0,192,176, + 97,195, 58, 29, 56,112, 64,214,184,113, 99, 99,126,126,126,243,200,200,200,237,203,150, 45,139,120,246,217,103, 51,207,156, 57, + 19,231,202, 25, 30, 30, 62,107,205,154, 53, 53,106,212,168,193, 10,174,152,107,245,228,144, 33, 67, 58, 47, 91,182, 76,250,228, +147, 79, 26,181, 90,109,116, 80, 80,208,229, 53,107,214, 68,244,233,211, 39,251,204,153, 51,177,247,235,253,124, 16, 56,235,215, +175,127,233,244,233,211, 53,132,117,189, 94,143,188,188, 60,228,231,231, 35, 36, 36, 4, 93,186,116,185,146,150,150, 86,195, 3, +103,227,103,158,121,102,226,226,197,139, 59, 43,149, 74,201,174, 93,187,180,219,182,109, 51, 92,191,126,221,106,177, 88, 72,108, +108, 44,215,186,117,235,128, 30, 61,122, 40,101, 50, 25,251,225,135, 31,230, 79,157, 58, 53,130, 97,152,229, 0, 6,186,227,108, +220,184,241,193, 63,254,248,227, 81,134, 97, 32, 18,137, 96, 50,153, 81, 92, 92,140,140,140,116,156, 57,115, 6,251,247,239,199, +150, 45, 91,254,214,106,181,141,253,140,123, 56,128, 93, 70,163,177,142, 84, 42,245, 91,216,219,108, 54,112, 28,119, 30, 64, 87, + 0,233, 52, 47, 81, 78,138, 50,137, 3, 55,141,225, 9, 33, 94,123,243,193,238, 78,173,179,127,153, 31,114, 51,132,195, 56, 0, + 19,156, 92, 48, 95,118,158,154, 16,178,187,115,231,206,195, 58,117,234, 52,167,107,215,174, 89, 89, 89, 89,201,179,103,207,142, +183, 90,173,230, 51,103,206,176,151, 47, 95,190,126,228,200,145, 26,181,106,213,122,237,220,185,115, 59, 93, 68,150, 39,156,185, +124,249,242,227, 29, 58,116,248,229,181,215, 94,171,214,162, 69, 11,105, 72, 72, 8, 56,142,195,213,171, 87,241,247,223,127,155, + 86,174, 92,153, 94, 92, 92, 92,145, 41,120, 14,165,101,100,116,121,118,248,155,107, 94,235,219, 43,226,177, 58,181,165,177,177, +177,128, 94,143,243, 55,178,113,224,252,223,230,111,118, 31,200, 51, 26,141, 79,195,255, 41,120, 14, 29,185,116,169,115,199,209, +163,215, 76,122,254,249,104,100,101,113,177,177,177,144, 74,165,184,118,237, 26, 46,243,188,117,230,162, 69, 57,106,181,250,223, +152,130, 71, 6,224, 83,158,231, 57, 0,144,203,229, 24, 49, 98, 4,156,167,220, 89,184,112, 33,244,122, 61, 0,112, 12,195,124, + 10,224,187,251,221,197, 18, 80, 88, 88, 56,254,137, 39,158,152,206,113,156,199, 81,111, 67, 67, 67, 81, 90, 90, 10,171,213,106, +203,200,200, 56, 31, 26, 26, 10,177, 88, 12, 66,136,219,231,168,160,160, 96,252,211, 79, 63, 61,133,101, 89, 79,206, 7, 84, 42, +213,245,237,219,183,215,124,245,213, 87,217,239,191,255,254,234, 43,175,188, 34,219,190,125,187,141, 16,242, 11, 45,183,254, 99, +165,168, 83,199, 6,251, 71,156,183,161, 20,142,175, 94,189,122,206,145, 35, 71, 34,135, 13, 27,150,252,252,243,207,171, 58,116, +232, 16,232,124,128, 94,175,231,127,251,237, 55,237,194,133, 11, 75,118,239,222,157, 54,100,200,144, 22,240, 50,119,234,141, 27, + 55, 54, 78,155, 54, 45,184, 71,143, 30,181, 0, 56,218,103,229,229,229,225,250,245,235, 56,117,234,212,117,179,217,188,190, 2, + 81, 42, 0, 48,105,192,128, 1,159, 46, 93,186,180,202, 43,175,188,146,189,114,229,202, 83, 40, 27,176,216, 21, 33,125,251,246, +109,184,116,233,210,216, 87, 94,121, 37, 27,101,237,200,104, 59, 66, 10,138,127,208, 30,183,182,211,242,250, 1,243,131,201,100, + 34, 6,131,129,232,116, 58,162,209,104, 8,220,207, 2,191, 46, 51, 51,147,164,167,167,147, 27, 55,110,144,180,180, 52, 2,224, + 71, 23,197,235,174,192, 82,254,244,211, 79, 53,226,226,226, 38, 42, 20,138,205, 34,145, 72, 45, 18,137,212, 50,153,236,143,240, +240,240,143,102,206,156, 25, 71, 8,145,120, 81,209,158,192,137,197,226, 87,163,162,162,214,133,133,133,165,135,134,134,166, 71, + 69, 69,173, 19,139,197,255, 3, 32,246,161,204, 61, 33,128,227,184,119,149, 74,229, 86,153, 76,150, 43,147,201,114,149, 74,229, + 86,142,227,222,133,247,129, 84,189,114, 74,165,210,119, 35, 35, 35,183,170, 84,170, 92,149, 74,149, 27, 25, 25,185, 85, 42,149, +222, 9,231,157,124,149, 8, 66, 75, 71,236, 96, 24,198,242,200, 35,143,124,213,164, 73,147, 47,155, 52,105,242,101,163, 70,141, +190,102, 24,198, 34,236, 7,160,131,231,193, 27,239,102, 56,255, 53,206,148,148,148,101, 75,151, 46,229,199,143, 31,175,174, 85, +171, 86,225,248,241,227,213, 75,151, 46,229, 83, 82, 82,150,221, 46,103,116,116,116, 66, 74, 74, 74,225,226,197,139,173, 23, 46, + 92, 32,139, 23, 47,182,166,164,164, 20,186,140, 12,255, 64,222,207,255, 58,103,253,250,245, 47, 17, 39,152, 76, 38,146,151,151, + 71, 46, 92,184, 64,118,239,222, 77,226,227,227, 47,249,193, 25, 14,224,117, 0,191,197,196,196,156,107,217,178,229,141,199, 31, +127,252, 70, 66, 66,194, 85,177, 88,188, 31,101, 35,188,167,216,151, 79, 1,212,242,193,217, 50, 36, 36,100, 90,124,124,252,250, +154, 53,107,238, 77, 76, 76,220, 31, 22, 22,182, 33, 32, 32, 96, 6,254, 25, 25,187,162,113,239,240,228,147, 79, 94,215,104, 52, +182,166, 77,155,158,115,119, 82,221,186,117,247,104, 52, 26, 91,255,254,253,211, 1,164,210,188, 68, 57,239, 18,231, 3,253,129, +230,138,154,118,193,180,206,105, 25,231,230,184,113, 46,199,252, 96, 63,215,103, 66, 16, 66, 68,132, 16, 37, 33, 36,152, 16, 18, + 70, 8, 9, 33,132, 4, 18, 66,100,132, 16,150,102,194,127,133,115,168, 93, 64,233,236,255, 93,225,107,255, 3,125, 63,227,226, +226, 66,155, 55,111, 62,124,237,218,181,239, 94,185,114,229,221,181,107,215,190,219,188,121,243,225,113,113,113,161,119, 18,206, +232,232,232,132,122,245,234, 45,168, 91,183,110,122,189,122,245, 22,184,136, 44,154, 63,255, 37,206,164,164,164,223, 27, 54,108, +120,169, 81,163, 70,151, 27, 53,106,116,169,126,253,250,151,234,212,169,115,169,122,245,234,151,170, 86,173,122, 41, 34, 34,226, +247,219, 8,103, 24,128, 88,220, 58, 13,216,191, 29,247,246, 41, 41, 41, 7, 2, 2, 2,220,142, 13,198,113,220,164, 70,141, 26, +157, 68, 89, 79, 73,154,151, 40, 39, 21, 90,149, 32,180,104,134,121,120, 57,101,240, 62,205,136,175,253,244,126, 82, 78,202, 73, + 57, 41, 39,229,164,176, 11, 45, 58,250, 52,133, 43,140,240, 62, 50,174,175,253, 20, 20, 20, 20, 20, 20, 15,157,166,114, 89,218, + 9, 59, 24, 47,170,180, 34,189, 9,110, 71,217,110,163,156,148,147,114, 82, 78,202, 73, 57, 41,231, 67,199, 41, 96,142,135,237, +231, 93,214,191,190, 79,133, 23, 67,171, 14, 41, 39,229,164,156,148,147,114, 82, 78,202,249, 95,225,116,135,215,238, 83,145,213, + 14,240, 49,188, 3, 5, 5, 5, 5, 5, 5, 5, 5, 69,133,225,123, 82,233, 85,171, 86,137,132,255, 3, 6, 12, 24, 98,179,217, +134, 11,235, 34,145,232,243,159,127,254,249, 59,111, 87,232,215,175,159,205, 27,167, 59,248,186,142, 59,206,250,181, 84,111,132, + 7, 43,222, 44, 46,209,205,189,154,105,219,109, 48, 24,234, 9,251, 2, 2, 2,206,126,247,221,119, 23, 43, 59,156, 67,134, 12, +169,229,122,157,196,120,113,251,176,160,128, 17,133,197,154,217,167, 47,105,190,166,121,236, 95, 65, 4,128,212,160, 0, 73,239, +250, 33,146,150,167, 10, 12,251,180,102,219,111, 40,235, 13, 91,244, 32, 70, 56, 38, 38,166,142, 74,165, 26, 4,160,190, 78,167, +139, 82, 40, 20,185, 0,206,168,213,234,101,217,217,217,231,253,229,105,151,136,235, 0,170,217, 87,111,236, 76, 67,130, 63,251, +124,161,107,117, 24, 8, 32, 99, 24,152,183, 92,134, 99, 2,205,110, 53, 96,224,201,173,219,187,214,128,137, 16, 72, 24,192,184, +229, 10, 2, 30,160,164, 82, 1,232,130,178, 33, 28, 78, 0,216,130,178,158,187, 20, 20, 20, 15, 14, 92, 39,148,118,172,115, 30, +196, 68, 91, 9,199, 44, 32, 32, 33, 0, 9, 55, 26,141, 98,169, 84, 10,147,201, 4,133, 66,254,197,235,175, 12,153, 8, 22,197, + 22, 43, 70,124,247,221,119,183, 61,211,117, 69,174, 3,224, 47,215,243, 67, 85,242, 41, 59,126,123, 47,180,109,207,153, 51, 76, +215,242,199,148,150,150,178, 50,153, 12, 70,163, 17,193,193,193,143,191,241,218,107, 77, 89, 49, 49, 73, 36,202,125,115,230,204, +201,190,221,112,190,253,246,219, 49,102,179,161, 21,207,243, 82,147,201, 36,115,189, 78,176, 66, 57,115,199,111,239, 41,218,165, +206,152, 8, 80,161,245, 47, 64,154, 16,170,220, 57,119, 64,251,186, 45,235,215, 4,127,102, 23, 12, 38,115,239, 29,233,154,222, + 31,237,207,124, 39, 93, 99,110, 2, 47, 3, 65,222,135, 16, 37, 39, 39, 15,139,140,140,236,191,104,209, 34, 73,114,114, 50, 2, + 2, 2,160,215,235, 99,175, 92,185, 18,251,198, 27,111,180,147,203,229, 43,174, 94,189,250, 5,252,155, 8,174,218,142, 31, 62, + 4, 0, 60, 62,104,114, 53, 0,239, 58, 9, 1,199,190,246,131, 39, 87, 3, 48, 26,229, 39, 70,206, 2,176,222, 67,169, 35,221, +176,116, 22,122,191,240, 46, 7,224, 13, 71,224, 89,224,143, 31,231,161,251,128, 55,203,109,103, 8,184,223,150,206, 66,234, 11, +239,122,156,213,188, 91, 77,198,194,243,196,163, 19,207,178,140,117,243, 37,226,110,130,225, 28, 0,238,230, 35,237,134,178, 9, +157,221, 30,223,179,142, 40,199,108,177,185, 29,112, 86, 34, 22,229,110, 60,111,187,229,220, 23, 27,195, 98,177,149,149,173, 18, + 14,182,117, 87,131,119,124,240,193, 7, 92,106,106, 42,190,249,230,155,214, 95,127,253,245,107,165,165,165,127,218,239,219,101, +250,248, 82, 80, 60,208,130,203,189,208,226, 68,248,106,253,154,239,106,228,228,230,227,197, 87, 71, 97,249,242,229, 40, 42, 42, + 66,104,104, 40,164, 18,137,120,238,167, 31,198,168, 84,202,152, 23, 95, 27,243, 21,128, 58,183, 27,154, 10, 94,167,166,235,249, +140,125, 14, 68, 78,196,138,165, 82, 41,187, 98,197, 10, 20, 23, 23, 35, 36, 36, 4, 82,169,152,157, 51, 99,156, 92,165, 10,148, +191, 60,116,108,107, 0,171,110, 55,156, 38,147,166,245,218,229,223,169,242,242,242, 48,248,127, 99,224,122, 29,137, 68, 98, 19, + 94, 44, 52,143,253, 43,248, 96,209,136, 23,234, 54, 8, 2,204,167,247, 66, 44, 18, 65, 17, 28,138, 46,156, 8, 34, 6,245, 94, +220,156,246, 62,128,143, 30,148,200, 38, 39, 39, 15,235,215,175, 95,255, 41, 83,166, 72, 88,182,172,227,176, 86,171,133, 94,175, + 71, 92, 92, 28,118,236,216, 33, 25, 63,126,124,255, 95,127,253, 21, 87,175, 94,157, 95, 81,254,211,167, 79, 39, 86,171, 86,205, + 0, 0,189, 26, 6,185,238, 75, 16,246, 1, 64, 80, 80,144, 79,190,240, 16,165,241,244,233, 3,245,133,243,134,117,138,179,121, +216,110, 0,160,240,198,197,243,132,219,178,224, 13,143,251, 95,157,242,147,245,196,170,221,117,146,147,147,245,206,219, 3, 3, + 3, 61,157, 18,173,209,104,170,185,110, 20,142, 55, 91,108, 81,158,174,215,117,196, 66,183, 2,204, 98, 3,247,211, 79, 63, 1, + 0, 62,123,119,160,104,241,193,124,142,227,202,138,218, 79, 63,253, 20,147, 38, 77,146,110,222,188,185,199,210,165, 75,123,172, + 91,183,110,174, 39,161, 74, 65, 65,113, 95,138, 44,231, 95,207, 66,139,101,152, 32, 85, 80, 32,158,121,238,117,252,254,251, 31, +104,219,182,173, 99, 95, 82, 82, 18,250, 61,221, 7, 63,255, 48, 7, 0,130,238, 36, 68,119,122,157,162, 18,237, 71,221,251, 47, +152,124, 35, 91,179,127,195,134, 13,104,211,166, 77,185,243,159,123,246, 25,252,248,237,167,240, 50,202,188, 95, 96, 8, 43, 9, + 82, 41, 49,224,197,255,193,221,117, 94, 27,220,119, 67,183,126,243, 58,231, 20,104,231,208,124,118,239, 81, 35, 38,188,107,195, +186,117, 80,244,203, 23,248,187,216,128,223, 51, 13,120,185,203, 99, 72, 9,147,163,141,213,134, 24,165,184, 99,182,214,242, 64, + 8,173,152,152,152, 58,145,145,145,229, 68, 86,105,105, 41, 52, 26, 13,212,106, 53, 74, 75, 75,193,178, 44,198,140, 25, 35,217, +185,115,103,255,152,152,152,109,126, 84, 35,222,176, 59, 89,128, 72,172,153, 48, 97,130, 49, 42, 42,202,168, 80, 40, 8, 39,145, +149,182, 31, 60, 57, 8, 0, 88, 78, 82, 58,119,238, 92, 83, 92, 92,156,129,227, 56,233,155,111,190,233,215,240, 48, 70,163,145, + 56,115,154, 76, 70,199,246,153, 51,103,154,162,163,163,141, 10,133,130,152,205,254,155,142, 39,175, 21, 66, 38, 17, 65, 38, 17, + 33, 64, 42, 70, 80, 98,115,200,138, 78,193,106,181,226,147, 79, 62, 49,199,196,196,152, 20, 10, 5,145, 74,165,146,145, 35, 71, +250, 12,231,144, 33, 67, 72, 72, 72,136, 89,161, 80, 72, 38, 77,154,116,203,180, 25,219, 79,100, 64, 46, 21, 67, 33,227, 80, 51, + 41, 30, 50,162,247, 59,172, 34, 81,249,214, 8, 50,153, 12,173, 91,183, 70,253,250,245,177,110,221,186,246, 84,104, 81, 80, 60, + 16,240, 56,221, 14, 7, 0, 27, 54,108,104, 7, 96, 7, 0,164,166,166, 50,101,103, 16,140, 30,246, 52, 94, 30, 60, 0, 54, 27, +239, 24,221,148, 97, 25, 12,125,169, 7,120,222,159, 26, 9,223, 93, 60,111,227, 58,255, 76, 82,205,176, 34, 0,168,145, 16, 75, + 94,123,249,121,216,120,254,159,138, 18, 17,240,250,224,238,101,219, 42, 33,156, 34,216, 48,234,141,167,224,238, 58,117,106, 84, + 97,173,102, 3,152,242,147, 61,222,141,201, 54, 41,167, 27,212,175, 26, 91,221,162,215,195, 96,176, 96,201,249, 66,253,214, 12, +109, 20, 27,146,150, 55,239,153, 22, 1,162,188, 76, 36, 4, 73,107,102,107, 45, 15, 68,220, 85, 42,213,160, 69,139, 22,221, 34, +178,114,114,114, 88,141, 70, 3,179,217,204,151,150,150,194,102,179, 97,236,216,177,226,241,227,199, 15,202,206,206,158, 36,104, + 30,119,156,246,118, 87,163, 79,159, 62,157,240,193, 7, 31,152, 59,118,236,120, 35, 41, 41, 73, 43, 18,137, 16, 27, 27, 59,175, + 75,151, 46, 97, 83,166, 76, 49,247,232,209, 35, 77, 36, 18,161,102,205,154,218, 83,167, 78, 37, 0,144,251, 27,119,103,206,239, +182,127, 78, 0,128, 97, 24,116,233,210,229,122,205,154, 53,181, 34,145, 8, 23,127,155, 73,252,189,159, 98,142, 69,173,184, 96, +123, 33,194, 0,242, 64, 71, 75,188, 46, 93,186,164,215,169, 83, 71,195,178, 44, 78,158, 60, 25,143, 91,167,181,186,133, 83, 46, +151, 91,158,123,238,185, 27,231,207,159,119,119, 60, 56, 17,139, 22,117,236, 6, 86, 92, 19, 32,125,143,199,112,138, 69,176,142, + 31, 54,144, 11, 9, 0,100, 65, 17, 70,181, 90, 13,149, 74, 85,230,144,153,205, 56,126,252, 56, 90,182,108,217,110,213,170, 85, + 59,233,243, 78, 57, 41,231, 63,112,167, 69,238, 67, 55,139,113, 90, 47,215, 70,107,135,107,164,108, 54, 43,146,170, 69, 99,230, +135, 67, 96,179,241,176,217,108,176,218,127,109, 54, 27, 44,102,115,165,132,236, 78,174, 19,170,146, 79,249, 99,197,136,208,142, +125, 63,237, 52,253,131,193, 91,109, 54,128,231, 45,176, 88, 0, 27,111, 1,111,179,193, 98,169,156,166, 57, 22,158, 71, 66,124, + 12,166,127, 48, 24,174,215, 89,246,243,170, 94,219,215,143, 81,180, 77,157, 49,234,226,117,221, 39, 84,216,223, 91, 4, 72,100, + 28,225, 2, 96, 50, 89, 81,106,226, 77, 0,180, 6, 11,111, 38,202,136, 0, 0,224, 88,230, 65,234, 93, 91, 63, 57, 57,185,156, +200,154, 53,107, 86,196,151, 95,126, 25, 7, 0, 79, 63,253,116, 70,167, 78,157,242, 47, 92,184,128,216,216, 88, 38, 63, 63,191, + 39,128, 55,237,231,142, 6,240,165, 7, 94,109,181,106,213, 12,145,145,145, 70, 65, 16,177, 44, 11,142,227, 80,173, 90, 53, 67, + 84, 84,148,177,102,205,154, 90,137, 68, 2,150,101, 33, 8, 61,191, 62,243, 24, 6, 34,145, 8, 2,167,171,219, 35,112, 86, 4, + 98,142,189,181,120,115,226,100, 89,214,237,245, 60,230,161,128, 0, 2,192,227,241, 34,214,169,120,228,188,183, 16, 88,114, 28, + 98, 0, 59, 8, 33, 56,118,236, 24,174, 94,189, 10,137, 68,130,152,152, 24, 76,154, 52, 9, 70, 99,153,222,237,215,175, 95, 59, + 0, 39,233, 19, 76, 65,225,192,142,251, 80, 96,185,186, 90,222,219,104,109,216,176,161, 93,106,106,234, 78, 65, 0,149,137, 29, + 55,226,199, 98,133,197, 98, 6, 42, 97, 32, 46,111,215,177,217,120,175,215, 17,218,104,241, 60,225,220,138, 44,158,135,213, 98, +169,148,187,199,219, 44,224,121, 11,220, 93,135, 97, 88,155,189,192,151,208,231,228,222, 35,166, 90, 2,107,169,150,132,221, 86, + 3,226,194,101, 82,228,235,145, 92,187,174,232,184,206,130,189, 39,206, 34, 34, 80,245,192,164,139, 78,167,139, 10, 8, 8,128, + 86,171,117, 56, 89, 95,126,249,101,156,201,100, 98, 1,128,227,196,241,121,124, 92,128,141, 7,130, 85, 89, 40, 42, 42, 9, 39, +132, 48,118,193,243, 41,128,239,224,101,100,127,137, 68,226, 16, 40,206, 2, 72, 38,147,221,150,128, 17, 32,136, 51,137, 68,226, +118,187,107,245,154, 47, 72,156,133, 22, 72,153,171,229, 34,182, 68, 34, 17,132,182, 81,190, 32,149, 74, 29,113,119, 7, 78,228, +116, 61, 81,197,155, 98,154,205,102,104, 52, 26, 20, 23, 23, 35, 32,160,204, 48, 35,132,128, 97,152, 55, 1,188, 69,159, 98, 10, + 10,247, 90,228, 62, 22, 91,238,133, 22,202, 44, 59, 6, 0,172, 22,179, 91,241,179,234,183,189,184,145,173, 69, 76,196, 33, 16, + 47,117,146,238,208,191,127,255, 31, 98, 99, 99, 91, 8,235, 50,121, 96,248,107, 35, 62,134,213,106, 70,144,156,197,171,131,186, +151, 19, 89,101,142,150, 9,158,228, 92, 81,137,246,163,238,253,230, 79, 14, 86,133,239,119, 21, 63,211,151, 28,125,166, 72,109, +140,103,217,195, 40, 98, 98,109,253, 94,255,120,136, 83,225,126, 98,197,194, 9,239,248,237, 7, 50,172,248,153, 55,230,189, 70, +184,192,122, 10,182,116,215,123,131, 31, 91,235, 44,230,194,194,194, 54,116,125,102,110,231,156, 66,218, 70,235,223, 64, 80,112, + 8, 27,223,172, 61,154,189,185, 0,219,199,189, 71,128, 34,132,199,198,177, 29,134, 77, 69, 96,179, 94, 56,240,234, 32, 30, 40, +124, 32,226,170, 80, 40,114,117, 58, 93,172, 94,175,135, 90,173,134, 90,173, 46, 47, 8,196, 98,230,181,255, 13,143, 16, 75,164, +176,152, 77,248,125,217, 84,159,156,194, 16, 14,189, 26, 6, 65, 36,150,150,158, 73, 78,158,199,113, 28, 88,150,197,111, 95,188, +247,230, 47,179, 71, 4, 1,192,137, 13, 95,168, 7,140,249,124, 62,203,178, 48, 26,141,178,138,132,251,230,205,155,241, 70,163, +209, 96, 23,104,130,240,195,181,107,215,170, 26,141, 70,189,243,118,127, 32, 87, 4, 1, 33, 73,128, 34,234, 22,247, 44, 45, 45, +173,138,197, 98,209,113, 28, 7,147,201,228,151, 42, 98, 89, 86,114,242,228,201,120,158,231,221, 30, 95,191,122, 21, 32,166, 33, + 32, 13,246, 59,206,254,140, 8,109, 23, 91, 4, 21, 44, 75, 41, 40, 30,116,103,235, 62,124, 38, 24, 15,255, 29, 66,171,253,134, + 13, 27,136,243, 23,162,213, 98,177,139,172,127, 68,143,205,198, 35, 51,207,128, 11, 23, 46, 98,238,220,185,216,123,224,221,224, + 41, 83,166,200,198,143, 31,111,236,223,191,255,108,158,231, 27,177, 44,123, 2,255, 84, 85,148,119,133,120,190,234,209,163, 71, +147,133,117,139,197,130,160,160, 32, 4, 5, 5,161, 78,205,248, 91, 68,150,205,102,131,217, 75,213,161,208, 70,139, 33, 60,177, + 88,108,176,241,188, 67,252, 20,169,141,241,235,183, 29,171,225,116,120,109,225, 79,235,230,245, 60,139,193, 55, 38, 57,226,177, + 98,225,132,119,166,124,243,141,172,200, 22, 57,114,192, 51, 47,167,244, 27, 48, 8,207, 61,245, 68, 59,163,201,180, 78,196, 18, +222,226,184, 30, 88, 16,184,182,209,162,184, 71,184, 92,172,181,136,101,114, 4,198, 36,226,162,198, 38, 17,137, 68,135,174, 20, +235, 36,172,136, 3,203, 73,112,166,200, 96,121,128,162,123,230,242,229,203,177, 85,171, 86,133, 90,173,134,213,106,229,159,126, +250,233, 12,142, 19,199,115, 98, 49,147, 58, 96, 56,159,157,157,105, 97, 89, 17, 8,177,225,137,126,111, 48,178, 0,185,196,108, + 50, 89, 81, 86,117,232,206,205,114, 30,194, 33,168, 75,151, 46, 97, 66, 79,192, 95,102,143, 8,114,218,167,106,218,180,105,152, +115,175, 67, 63,221, 34,166,127,255,254,242,106,213,170, 49, 0,112,120,217, 7,130,123,198,244,234,213, 43,160, 90,181,178,118, +248,127,126, 49,194,111,206, 8, 5, 1, 74,174, 1, 37,105,183, 56, 89,189,122,245,146, 37, 39, 39, 87,232, 89,180, 55,128,247, + 56,118,151,146,179, 2,217,199,252,226,122,177, 49, 44,113,129,224,102, 63,193, 66, 26, 24,110,108,241,222,230,131, 84,108, 81, + 80,248, 5, 23, 45,114, 95,161,157, 93, 32,182,183,255, 58, 4, 23, 7, 0,118,139,142,113,210, 89,176, 88,205,183,136, 44,155, +205, 6, 49, 99,196,220,185,115,241,214, 91,111, 1,128,228,157,119,222, 89, 59,101,202,148, 39,121,158,111, 68, 8,105,195, 48, +140,183,175,198, 29,177,177,177, 57,132, 16, 49,203,178,109,190,248,226,139,176, 30, 61,122, 32, 40, 40, 8,132, 39,183,136, 44, +155,141,135,217,108,130, 39, 75, 43, 84, 37,159,242,199,170,145,161, 29,251,124,218,201,198,243, 91, 5,145,197,219,108, 0, 95, +118, 82, 65,110, 6,182,252,190, 14, 95, 45,252,170, 8, 12, 57, 7, 2,222, 46, 6,225, 65, 12, 54,218,115,248,108,155,214,205, +235, 97,202, 55,223,200, 78, 31,205, 90, 59,252,237,247, 83,250, 13, 24,132, 85, 63, 47, 3,107, 45, 62,230, 44,178,108, 22, 30, + 37, 69,249,189,254,162,109,180,254, 45,132,109,217,186,149, 25, 52,104, 16, 95, 90, 90, 10,137, 84,202, 91, 44, 22, 81,171, 86, +173,108,111,189,245, 22,155,157,157, 13,117,169,134, 3, 16,134, 7,192,214, 82,171,213,203,222,120,227,141,118,187,118,237,146, +176, 44, 11,181, 90,141, 14, 29, 58,228,231,241,113, 1,175,253,111,120, 68,102,102,134, 85, 37,231,140, 18,137, 24,185,185,185, +124,187, 30, 3,245, 3,134,188, 85,229,173, 15,166, 47,202,218,183,240, 75,127,174,225,220, 19,208,117,223,226,197,139, 77,113, +113,113, 6,153, 76, 38, 29, 60,120,176, 95,245,135, 38,147,137,204,156, 57,211,232,218,187,208,100, 50,145,185,115,231,154,226, +227,227,141,114,185,156, 88, 44,190,219,125,178, 44, 99,125,117,202, 79, 86,171,213, 90,206,197, 18, 68,150,133,103, 52, 11, 22, + 44, 48,199,199,199,155, 20, 10, 5,145,201,100, 18,127,194, 57,124,248,112, 18, 26, 26,106, 86, 42,149,146, 49, 99,198,220, 81, +175, 67,139, 13,220,148, 47, 28,195, 59,200,130,130,130, 80, 90, 90,234, 8,107,108,108, 44, 21, 91, 20, 20,110,112,139, 22,185, + 63, 93, 56,255,198,209,226, 1, 77, 78,110,126, 84, 68,116, 34,172, 86,171,125,177,192,106,177, 96,228,235, 3, 48,123,225, 2, + 0, 16,196, 86,151,119,222,121,103, 45, 0,159,133,217,138, 21, 43, 38,191,243,206, 59,170,156,156,156,205, 63,252,240, 67,216, +192,129, 3, 49,122,244,104,124,250,233,167, 16, 75, 3, 16, 22, 89,213,113, 29,225,186,249,121,133, 32, 32, 26, 15, 62,157,185, +172,144, 2, 23, 30,153, 0,139,205, 2,222, 98,129,197, 98, 1, 35, 42,139,218,150,223,215, 97,224, 75,195, 33,150,169, 66, 63, +159,251,137, 62,165, 89,236,147,227, 95,121,197,232,135, 9,200,158, 62,154,181,118,248, 91, 99,186, 8, 34,107,205,178,133,231, + 62, 27,219,103,185, 76,202, 57,174, 99,225,121,176,172,136,182,209,250,151, 68,150, 76, 38, 91,189,105,211,166, 75, 77,154, 52, + 97,180, 90, 45, 44, 22, 11,242,243,243,177,118,237,218, 51,132, 16,132,134,134, 98,211,166, 77,252,192,129, 3, 87, 27,141,198, +103,238,119,177,149,157,157,125, 94, 46,151,175,120,255,253,247, 7,140, 29, 59, 86,204,243, 60, 46, 92,184, 0, 48, 12, 17, 75, +164, 96, 89, 22, 98, 49,135,146, 18, 53,175, 8, 12,201, 50, 19,145, 66, 44,145,130, 21, 73,188,117, 19,190, 97, 31,140, 20, 44, + 39, 41, 21,122, 2, 74, 36, 18, 28, 88, 53, 75,221,126,240,100, 21, 0, 72,100,242,162,174, 93,187, 94,175, 87,175,158,246,200, +145, 35, 9,184,181,215,161,235,243,105,237, 59,120,140, 72, 33, 15,208,118,233,210,229,134,192,153,182,245,115,245,160,161, 31, + 48,140, 72,170, 77, 77, 77,189,158,146,146,162, 21,137, 68, 56,187,238, 19,117,223,193, 99, 2, 24, 47,131,172,110,190, 68, 94, + 61,177,106,119,157,169, 83,167, 90,122,244,232,113, 83,104, 47,150,150,150, 86,165,103,207,158,178, 57,115,230, 88,122,246,236, +153,222,160, 65, 3, 13,203,178, 56,122,244,104,188, 55,167, 74,128, 92, 46,183,188,252,242,203, 55, 78,157, 58,117,187,189, 14, +189,162,106,213,170,224,121, 30, 29, 58,116,128,193, 96,160,206, 22, 5,197,131, 9,215,113,180, 60,143, 12,111,177, 90,134,191, +254,230,196,207, 1, 38,208,169, 20,248,199, 88, 34, 96,222,125,119,148, 18,128, 92, 16, 91,111,191,253,182,207,105, 78,156, 68, + 86,179,129, 3, 7, 98,220,184,113,248,236,179,207,108,159,126,250,169,232,252,197,107,230,193, 67, 63, 42,118,185, 14, 8,136, +134,183,240,195,221,241, 21,149,104, 63,106,211,115,198,196,140, 28,221,158,193,111,140,119,148, 94, 54, 0,106, 38,214, 6, 0, + 95, 45, 92,168, 21,203, 84,202,126, 3, 6, 1, 64,151,207,231,126,178,118, 10,190,241, 45,182, 8, 83,119,248,219, 99, 66, 5, +145,245,197,156,169,167,130,153,156, 5, 35, 70,157,177, 56, 95, 7, 0,194,130,176,182, 77,207, 25,221,114, 11,181,243,104, 62, +187,119,144, 74,165,147,183,111,223,174,108,216,176, 33, 83, 80, 80, 0,155,173, 44, 69,204,102, 51, 74, 74, 74, 80, 90, 90, 10, +163,209,136,166, 77,155,178,243,231,207, 87,142, 24, 49, 98,178,201,100, 26,122,191,199,251,234,213,171, 95,172, 95,191, 30, 59, +119,238,236, 63,118,236, 88,113, 76, 76, 12, 19, 28,156,195, 88,204, 38, 0,132,228,229,229,241,138,192,144,172,136,232,248, 27, +153,217,185,117, 45,102, 19,120,155,217, 99,107,115,251,240, 14,239,158, 62,125, 58,113,214,172, 89, 38,231,158,128, 3,198,124, + 62,191,105,211,166, 97, 11, 22, 44, 48,165,166,166, 94, 23, 26,175,251,211, 24,126,203, 21,188,121,250,244,201,250,174,156,237, + 95,155,245,173,192,233,220, 27,177,215,168, 69,223,214,172, 89, 51, 44, 37, 37,229,186, 55,222,228,228,100,125,108,108,172,169, + 78,157, 58, 26,177, 88,252,127,246,206, 58, 60,138,171,141,226,103,102, 93,227, 78, 72, 8, 22,197, 37,184, 91,209, 22, 45, 78, + 41, 86,172, 80,138,180,120,161, 80,188, 88,129,150, 2,165,248, 71,139,107,113, 39, 9,193, 18, 36, 16,119,151,117,153,251,253, +145,108,154,132,200,110, 66, 75,105,231,247, 60,243,108, 50,114,246,142,238,153,247,222,251,222,252, 72,150, 94,175,172, 89,179, + 38,227,236,236,172,245,243,243,203,179,180,209,190, 88, 44, 38,166,168, 88,105, 88,210,235,144,199,129, 97,216,176, 97,133,153, +225,103,213,169,147, 56, 98,196, 8,215,153, 51,103, 98,231,206,157,184,121,243,230, 27,102,191,125,251,246,184,118,237,218, 18, +252,139, 18,235,178,176,252,199, 40, 63,143, 86, 73,118,237,218,251, 7,138,180,105, 42,141,101,203,150, 9, 11, 34, 89, 93, 63, +255,252,115,168, 84, 42,219, 82, 86,235,130,130, 92, 27,165,153,172, 85,171, 86,237, 39,132,184, 3,104, 99, 52, 50,119,127,252, +105, 87,199,178,190,111,208,160, 65,111,104, 18,138,230,208, 52,149, 39,224,145, 7, 63,236,216,249,107,177,245,243, 27,191,123, +131,194,195,205, 27, 86,169, 0,116, 45,105,182,240,231, 48, 35,133,154, 38, 38, 78,154, 88,104,178, 54,111, 88,117, 33,160,169, +199, 71,243, 63,253,166, 84,115,246,205,162, 9, 82,154,166, 90,149,104,163,245,134,230, 91,128,213,252,147,142,195,134, 13,107, + 16, 24, 24, 72, 23, 53, 89, 90,173,182, 48,113,167,169,177,120,124,124, 60,218,183,111, 79, 55,104,208,160,222,189,123,247, 58, +226,207,225,156,222,215,125, 55,190,126,253,122,163,139,139,203,197,133, 11, 23,142, 72, 75, 75,235,149,153,153,101,127,114,215, + 55,232, 49,104, 18,213,190,231, 80,133,150,112, 69,113,137,201, 62, 87, 78,239,179, 59,115,112, 11,116, 90,237, 4, 0,225,248, + 51,189, 67, 73, 77,165, 41,141,131,143,143,143,162,168, 81,241,240,240, 80,187,185,185,105, 2, 2, 2, 10,231,151,209,155,239, +141,125,183, 84,179,160,253,151,162,162,227,105, 50,109, 37,211, 70, 72, 36, 18,152,204,151, 37,229, 44,218,219,178,212, 7,101, +197,189, 14, 11, 53, 11,210, 59, 20,243,105,123,247,238,237,178,119,239,222,166, 0, 30, 32,127,172, 67, 61,144, 95,149, 88,164, +209,252,226,130,137,189,223, 89,205,255,170,230,251, 76,123,252,217, 54, 11,200,111,171,117,181, 76,163, 85, 17,166,134,239, 0, +232, 25, 51,102,100,170, 84, 42,219, 17, 35, 70,148,187, 77, 82, 82,210,206, 61,123,246, 20, 51, 89,253,251,247, 31,115,228,200, +145,139, 41, 41, 41,149,218, 43, 91, 43,241,178,171, 39,230,216,182,239,189,242,115, 0,171,203, 8,228, 49, 1, 77, 93, 63,218, +188, 97,213,111, 37,204,214, 47, 0,250,151,229, 74,187,125,208, 15,251,118,109, 54,181,237, 18, 63, 14,138, 63, 51, 36,100,105, +169,189, 21,109,100,194,165, 5,229,152,201,182,209,250,123,224,243,249, 29,230,206,157,203, 87, 40, 20,111,152,172,146, 70, 43, + 39, 39, 7, 15, 31, 62,196,232,209,163,133,161,161,161, 29,116, 58,221,229,127,195, 49, 72, 74, 74,122, 86,144,140,116,186, 41, +133,131, 80, 36,230, 15,253,228,115,247,194, 94,135, 7,183, 64,163, 86, 1, 0,215,156,244, 14, 92, 46,151, 31, 26, 26,234,105, +138, 90,233,116, 58,161,105,126, 80, 80,144,167, 41,183,150, 90,173, 54,187,215,225, 95,165,249,232,209, 35,119, 83,239, 72, 83, +239, 66, 46,151,203, 15, 14, 14,118, 55,105,106, 52, 26,179,122, 29, 10, 4, 2,126,104,104,168,187,209,104,124,107,189, 14,139, + 26, 99,228,143,179, 88,108,172,197,130,182,101, 20, 69, 81,132,173, 54,100, 97,121,239, 41,217, 83,178,252, 65,165, 43,194,212, +240,221,130, 77,184,213,171, 87,239,246,241,199, 31, 23, 51, 89, 3, 7, 14, 52, 30, 61,122,244,138,171,171,107, 50, 77,211,207, + 44, 45, 71, 97, 27, 45,188,241, 6, 9,154,166, 31,182,105,230, 7,154,166, 31,206,255,244, 83,205, 50,252, 84,204,108, 29,251, +237, 80,247,184,204,167,165, 91, 51, 0,246, 78,213, 48,108,204, 20, 12, 27, 51,197, 22, 64,107,160,236,222,138,229,149,131,229, +175,129,162, 40,129,155,155,219, 99,181, 90, 13,138,162,160,209,104, 10, 13, 86,110,110, 46,178,179,179, 11,255,215,233,116, 72, + 77, 77,133,135,135, 7, 40,138,250, 87,183,163,211,233,116,134,185, 75,214,236,225,112,249, 6,134,209, 81, 58,157,238, 19, 75, +238,243,185,115,231,210, 40,165,237,213,212,169, 83, 75,157,255,174, 52,191,250,234,171, 82,123, 9, 78,157, 58,181,220,222,131, +101,241,197, 23, 95,188,181, 94,135,230, 63,190, 88, 88, 88,254,101,148,218,117,175, 82, 70,139,166,233,135,165,244, 46,164, 0, + 16,154,166, 31,150,146,229,192, 16, 19, 19,179,196,198,198,102,130, 66,161, 56,219,191,127,255, 25, 3, 7, 14, 52, 2,249, 13, +228, 43,187, 71,153,217,138, 69, 29,250,124, 55, 51, 43, 79,179,169,228,178,146,145, 39,147,217,218,242,253,170,173,191, 29, 57, + 48, 48, 41, 33,110,107, 89,251, 86,150,161, 42,171,183, 98,118,142,106, 73,135, 62,223,125,158,153,163, 98,219,104,253, 77, 24, +141,198,243, 98,177,152, 50, 13,166, 92, 52,122,149,147,147, 3,165, 82,137,130, 33,105, 0, 0,121,121,121,176,182,182,134,209, +104, 36,255,178, 67,161, 1,240,101, 65,180, 10, 0,190,140,188,178,177,232,181,253,168,232,178,114,162, 89,137,230, 12, 16, 93, +218,118,229, 45,251, 11, 52,147,203, 25, 32,186, 60,146, 45,212, 75, 6, 0, 62,143,147, 82,214,224,209,124, 30, 39,165,156,118, +251, 22,190, 55, 80, 4,192, 18,246,206,102, 97,121,127,223,255,223,213, 23,119, 97, 53, 89, 77, 86,243,111,209, 20, 22, 76,230, + 46, 99,143, 39,171,201,106,178,154,255, 52,205,210, 24,255,158, 24, 45, 82,202, 4, 66, 8,254, 77, 99,192,177,176,252,151,209, + 84,114, 25, 11, 11, 11, 11, 75,213,121, 99, 48,233,162, 11,202,114,165,150,244, 38,168,140,179,189,200,106,178,154,172, 38,171, +201,106,178,154,172,230,127, 78,179, 34,237,162,219,143, 7,176,227, 61, 49, 91,111,152, 44, 66,254,250,214, 42,108, 88,149,213, +100, 53, 89, 77, 86,147,213,100, 53, 89,205,202,194, 86, 29,178,176,176,176,176,176,176,176,252,199,177, 44, 97, 41, 75, 41,120, +244,155, 15, 6, 95, 21, 28,206, 85,136, 61,182,248,223,182,139, 3, 7, 14,228, 88,178,126,100,164, 13, 29, 2,215,181, 86, 82, +126,159, 60,133,126, 45, 19,178,104, 83, 69, 23,162, 67,205,198, 35, 37, 34,201,103, 90,173,214, 75, 38,151,167,100,164,167,110, +203,136,121,180,165,200, 58, 86,119,239,222,117, 13, 12, 12, 76, 0,144, 91,228, 77,129,133,133,229,109, 98,227, 87, 29, 20,245, + 9, 64,254,236,118,201,144,167,200, 14,223, 85,108, 61,107,223, 49,160, 41,255, 34,115, 84, 32,248, 17, 89, 97,177, 21,252,224, +216, 68, 68, 68,120,214,174, 93, 59, 26, 64, 86,201,111, 47,101, 25,123,159,179,188,207,180, 71,241,132,165,133,247, 66,213,141, + 86,157,254, 94, 48,208,163, 64, 48, 28, 20, 66, 17,121,100, 64,165,116,106,125, 84, 13, 12,183, 57,128,198, 0,105, 44, 21,139, + 26,169,180,186, 20,134,144,145,120,117,232,129,197,122, 94, 3, 39,161,236,225, 44,150, 32,242,200, 15, 22,233, 49,228,235,251, +215,142, 10,109, 36, 20,106, 55,233, 63, 27,197, 51, 56, 87, 22, 1,128,182, 52, 77,251, 75, 36, 18, 87,165, 82,153,202, 48, 76, + 44,242,235,167, 51, 43,169, 73, 3, 24, 43,147, 74,123,120,202, 5,141, 99,210,178,227,115,245,198,235,200, 79,232,154,249,182, +174,168,124,147,229,178,227,243,161,129,163, 87, 77,235, 2,155, 14,223,205, 86, 2,229, 25, 45,202,221,187,213,177, 33, 31, 15, +234, 48,121,252,104, 89, 53, 71, 25, 18,211, 20,246, 63,236,220,187,102,239,222,125,189, 63, 29,210,181, 7, 0,124,243,205, 55, + 31, 86,175, 94,189, 6,135,195,137, 92,176, 96,193, 47,139, 22, 45, 34, 84,217, 35,149,187, 22, 92,195,166, 7,190, 20, 64, 0, +128,154, 0, 94, 3,120,130,226, 89,198, 43,195,123,161, 89,173, 90, 53, 55,134, 97, 62,117,118,118,238,149,156,156,124,138,166, +233,159,226,227,227, 19,222,229, 83,135, 16,178,157,162,168,241,132,144, 29, 22,124, 78,176,228, 59, 68, 34, 81,178, 90,173,118, + 42,248, 59, 69,173, 86, 59,255, 85,251,243,119,126,215,223,244,254, 61,238,252,141, 39, 61,138,206,234,214,198,191,148, 39, 10, +229,127,254,198,211,118,197,215, 11, 48,150,241, 12,164, 8, 33, 88,178,100, 9,181,116,233,210, 49,181,106,213,170, 67,211,244, +243,133, 11, 23, 22, 75,125, 83,114, 89,145,251,156, 53, 91, 44,239, 43,150, 13, 42, 93, 33,126, 3,165, 80,147,129, 0, 53,186, +125,179, 70,109, 38,140,236, 67, 17,142, 8, 67,199,205, 49, 88,172,229, 57, 90, 8,142,106, 89,125,127,239, 25,131,250,116,161, +155, 6,212,128,171,163, 53, 64,243,176,253,116,148,253,166, 85, 11,182, 2, 8,172, 68, 41, 23,189,186,189,223, 41, 49,203, 8, +138, 2, 40, 10,160, 41, 32, 79,205,160,219,135,163, 22, 1,248,193,194,167, 18,109, 35,161, 48, 99,191, 26, 0, 56,111,225,164, +212,112,116,116, 28, 51,125,250,116,105, 64, 64,128,141, 72, 36, 18,168,213,106,231,136,136, 8,199, 5, 11, 22, 4,168, 84,170, + 19, 0,238, 91,168,233, 81,219,221,237,208,166, 25, 99,155, 55,168,233, 9,158, 54, 15,140, 70, 81,253, 69,196,203,150, 19,183, + 30, 30,247, 52, 67,253, 49, 42, 49,100, 66, 90, 90, 26, 5, 0, 14, 14, 14,164,184,201,106, 49,122,253,204,110,152,177,238, 60, +148,106,237,175,229,105,216,213,104, 56,226,163,143,250,117, 88,254,245, 84, 89,124,186, 14,161,145, 42,216,201,248, 88,244,229, + 36,129, 70,163,111,185,245,151,189,227, 55,175,156,243,163,209,104,236, 4,160,169,209,104, 12, 2,240,203,146, 37, 75,202,122, +248, 46, 5,240, 85,193, 5,189,143,195,225, 92,232,216,177,163,215,167,159,126, 74, 53,105,210, 4,193,193,193, 53,247,239,223, +223,229,212,169, 83,145, 70,163,241, 17,128,231, 40, 24,246,196, 12,120, 0,188, 57, 28, 78,253,127,178,166,171,171,171, 88,171, +213,142,114,119,119, 31,223,170, 85,171,250,125,250,244,161,188,189,189,241,236,217,179, 38,103,206,156, 89,116,253,250,245, 71, +113,113,113, 59, 4, 2,193,158,196,196, 68,213,223,254, 59, 78, 81,227, 1,184, 21,248,228, 37,102,124, 38, 32, 63,151, 84,162, +185,223,161, 86,171,157, 76,141, 77, 41,138,114,250, 43,247,199,194,239, 10,163, 40,202,174, 96, 93,148,247, 73,211, 52, 12, 6, +131,194,104, 52,214,170, 64,211,187,224, 69,202,108,175, 11,160,188, 68,208, 98, 0,232,214,218, 63, 3, 20,158, 22, 70,180,222, +124,201,124, 90,104,192, 8,252,207,223,124,106, 87, 44, 10, 86,242, 45,118,201, 18,106,209,162, 69, 88,188,120,113, 31, 0,109, + 25,134,185,238,235,235,187,177,152, 36,195, 20, 46, 91,180,104,209,247,229,220,231, 44, 44,239, 11, 29, 96,201,160,210,101,190, +255,212, 26,208, 14, 70,140,246,180,119, 26, 56,237,211,193,226, 0,223,218, 80, 67,134,168, 52, 35, 78,159, 60, 3, 0, 7, 45, +139, 58, 13,110,202,229,170,247,172, 90,252,165, 79,219,230, 1,120, 28,175, 71, 80,188, 17,202, 72, 61, 56,180, 30, 70,134, 0, + 4,234,202,238,117, 92,166, 1, 55,158,107, 65, 83, 0,135, 6,104,154, 2,135,174,164, 24,163,125,241,205,174,144,128,180,100, + 6, 96,180, 47,170,120, 66,252,235,214,173, 59, 98,233,210,165, 54, 73, 73, 73,210,224,224, 96, 8,133, 66,216,218,218,114, 92, + 93, 93,221,214,173, 91,167,154, 54,109, 90, 47,157, 78, 23, 5, 32,205, 76, 77,223,158, 77,235,223,218,177,234, 27,107,253,221, + 51,200, 58,240, 63,112,104, 2,190, 84, 6, 47,177, 24,103, 62,170,109, 55,240,100,228,209,123,201, 10, 95, 0,241, 21,137,133, +135,135,115, 52, 26,205,199, 86, 86, 86, 45,120, 60,158,179,200,182, 6,147,192,109,154,158, 74,213,124,157,226,164,108, 55,179, +139,115,143,181,159,119,196,140,117,231,177, 97,255,157,221,141,145,180,176,188,188,217, 18,137,108,194,180,207, 62,149,197,165, +233,176,236,104, 26,118, 93,203,193,168,182,114,204,248,192, 26,195,134, 14,145, 30,254,223,145, 9, 0,126, 44,178,201, 51, 95, + 95, 95, 42, 60, 60,188,180,135,175, 45,128, 57, 90,173,150,230,243,249,148, 72, 36, 26,177,124,249,114,221,208,161, 67,227, 76, + 43,180,109,219, 22,109,219,182,165,114,115,115,107, 94,190,124,185,230,222,189,123, 13,183,111,223, 14, 3,112,172,236,136,133, + 56, 70,173, 86, 85, 23,137,197,202, 31,182,110, 93,219,174, 93, 59, 70, 40,252, 51,253, 84,101, 52, 1,192,218,218,250, 71, 39, + 39, 39,106,222,188,121, 9,111, 75,179, 70,141, 26,231,155, 55,111,222,177, 91,183,110,220,214,173, 91,195,205,205,173,112,153, +131,131, 3,218,182,109, 75,197,198,198, 54,184,126,253,250,214,243,231,207,111,124,240,224,193,229,168,168,168,110,127,115, 68, +107, 71,129,153, 72,180,112,253,247, 30,138,162,100,219,183,111,119, 50,141,201,168,215,235, 97, 52, 26, 11, 63, 77, 19,195, 48, + 48, 26,141, 88,190,124,185, 81,161, 80,152,115,140, 20, 69,222,154, 77, 19, 83,218,167, 64, 32,112, 48, 37,236,173,224,201,254, +212, 85,152,229, 39,149, 74, 61, 1,244,132, 99,157, 57,197, 87,200,127,127, 86, 40, 20,209,137, 26,155,167, 0,218,149,163,102, +179,116,233,210, 81,139, 23, 47,238, 87, 36, 74, 91,127,208,160, 65, 37,135,189,170, 95,240,169,160, 40,234, 10, 77,211, 39, 0, +236,194, 91,140,186,179,252,187, 32,132, 52, 3,224, 88,100,150, 22,249,181, 66, 40,248,157,164, 0,216,151,152, 95,116, 61,211, +103,106,193,124,199,130,237, 72, 17,221, 84,138,162,238, 87,178,136, 87, 81, 70, 59, 45, 46, 0,156, 60,121,146,244,238,221,155, + 50,125,150,110,138, 6,158, 30, 59,180,111,143, 94,157, 91,129, 22,217,226, 69, 10,112, 59,134,128, 75,235, 65,131,224,238,205, +203, 4, 92,102, 79,137,173,202,142,158,212, 24,240, 69,253, 0,223,239,126, 90, 53,157, 19,150,194,197,174,235, 74,232,212,121, + 72, 77,138, 65, 74, 66, 52, 18,227, 94, 35, 62,230,245, 35,128, 90,100,182,230, 27, 39, 6, 48, 50, 5,239,128, 12, 74,139,232, +153,175,169, 83,132,215,244, 14, 8,200, 20, 24, 1,157, 34,220,140,175, 47, 75,179, 94,157, 58,117,134,126,253,245,215,118, 79, +158, 60, 17, 43,149, 74,205,153, 51,103,158, 69, 69, 69, 89,185,186,186,102, 76,154, 52,169,142,155,155,155, 85,255,254,253, 5, + 7, 14, 28,248, 16,197,187,181,150,165, 25,208,183, 69,163,219, 59, 55,174,151,166, 31,222, 4,109,196, 67,156, 78, 84,224,102, +178,146,212,180, 22, 82, 83, 26, 56, 66, 38,228,226,155,214,110,178,158,191, 69,124,167,103,152, 97,229,105,222,186,117,203, 85, + 34,145,172, 27, 62,124,184,235,212,169, 83,133, 70,174, 13,247,200,237,116,235, 57, 91,111,187, 41, 53, 58,206,208,142, 53, 48, +115,120,125,204,220,112,201,100,178,198,123,121,101, 49, 33, 33,101,107,234,117, 58, 47,119, 39, 43,132, 70,169,176,235, 90, 14, +254,248,218, 13,157,151, 39,160,127, 99, 46,124, 61,100, 48,232,244,222,131, 6, 13,218, 83,240,214,126, 31,192,135,131, 6, 13, +242,225,112, 56,151, 0,252, 94,209, 57, 18,137, 74, 31, 61,197,214,214, 22,237,219,183,135,175,175, 47,183, 93,187,118,245, 75, + 24,152, 98,154, 58,157,214,149, 97, 8,228,114,185,216,222,222,222, 86, 46,151,167,151,246, 67,101,137, 38, 0,216,217,217, 13, +104,223,190, 61,119,255,254,253,105,145,145,145,119,135, 14, 29,250,218,202,202,170, 88,244, 87, 42,149,162, 78,157, 58, 88,176, + 96, 1,183, 71,143, 30, 21,106, 58, 59, 59,119,221,187,119, 47, 40,138, 42,252,209,126, 35, 88,236,233, 9, 23, 23, 23,244,236, +217,147, 59, 96,192,128,174, 81, 81, 81,149,186,143, 44,224, 98, 41, 17,173, 37, 37,206, 83,153,213,111,165,173,111,198,121, 79, + 49, 69,151, 10,244, 80,133,123,179,220,234, 78,145, 72, 84, 24,133, 42,229,187,222,208,164,105, 26,243,231,207, 7, 69, 81,224, +241,120,224,243,249,165,126,118,232,208,193,210,114,198, 82, 20, 69,243,249,252, 57, 92, 46,247, 83,141, 70,227, 46, 18,137, 18, +140, 70,227,110,141, 70,179, 28,128,158, 16, 98, 83,134,201, 42, 85, 83, 42,149,122,190,120,241,162,110, 89, 5,209,104, 52,168, + 95,191, 62,160, 65, 88,121,154, 17, 17, 17,158,181,106,213,242, 6, 96, 26,162,237, 26, 33,164, 93,145,255,139,114,141, 16,242, + 65,193,223,207, 95,189,122,229, 89,187,118,237,204,191,235,250,100, 53,255,121,154, 21,120, 17, 71,138,162, 78, 22,185, 87,123, +155,254,159, 59,119,238, 87, 43, 86,172,120, 66, 81,212,201,162,243,139,174, 87,244,179,224,121,115,146, 16,210,123,222,188,121, + 1, 43, 87,174,252,214,180,238, 95, 97, 18, 45,137,104, 89,165,170,165,184, 30, 99, 5, 46,199, 8, 46, 77,129,203, 1, 64, 40, + 68, 71, 69, 32, 55, 39,235, 6, 34,143, 70,154, 23,201, 26,216,186, 97,195,122,171,246,109,152, 77,255,124, 93,137, 44,133, 26, +225, 15,174,224,254,149,223,147,140, 6,227,239,160, 72, 16, 64, 7,227, 53,243, 12, 56, 82,185, 49, 46, 40,194,205, 55, 90, 5, +230,170,152,217,122,103, 52,240,241,241, 25,178, 96,193, 2,135,144,144, 16, 81,118,118,118,238,190,125,251, 18, 52, 26, 77, 20, +128,115,209,209,209, 62,223,127,255,189, 96,213,170, 85,245,234,213,171,231,122,232,208, 33,109, 41,195, 25,189,161,249,229,232, + 97,183, 63,157,246,185, 40,236,208, 22, 8,194,130, 49,255, 97,154,241,143, 68,229,215, 0, 54, 32, 54,175,117,170,218,112, 97, +125,251,234,116, 13, 57, 31,181,109, 4, 29,194, 51,212,229, 70,178, 36, 18,201,186,189,123,247,122, 54,107,214,140, 6,128,235, +207, 13,194, 57, 91,111,187,157, 91,209,154,106,237,111,143,148, 44, 13,166,111, 9,197,153,219, 41,103, 77, 38,171,162, 66,202, +229,242,212,184,148, 28,103,123,153, 8, 35,219,200,208,121,121, 2, 6, 54, 21, 66,200,167,240, 44, 50, 9,181,107,213,160, 66, +111, 28,107, 90, 96,178,154, 37, 38, 38, 2, 64, 83, 0,145,177,177,177,174,129,129,129,217, 69,228, 50, 1,124, 39, 16, 8,230, + 83, 20, 69,154, 53,107, 22, 90,175, 94,189, 60, 91, 91, 91,168, 84, 42,104, 52, 26,240,249,124,168, 84, 42, 68, 71, 71,227,238, +221,187,176,181,181,181,232, 68,229,229,229, 65, 46,151,131, 97,152, 42,107, 26,141, 70,106,219,182,109,210, 39, 79,158, 72,143, + 28, 57,226, 60, 99,198,140,116, 63, 63,191,160, 33, 67,134,188,116,114,114,210, 60,124,248, 16,183,110,221, 66,102,102, 38, 90, +180,104, 97,150,166, 86,171, 5,151,203,133, 74,165,130, 80, 40, 4,151,203,133,193, 96, 0,195, 48,133,230, 43, 47, 47, 15, 25, + 25, 25,224,243,249,208,106,181,239,226, 13,244,141, 8, 85,121,213,111,149,137,104, 21, 53,106,102,154,172,138, 34, 81,101, 86, +119,102,101,101,137,109,108,108,230, 0, 72,172,232,187, 40,138, 2,135,195, 1,159,207, 7, 69, 81,104,215,174, 29,198,142, 29, +139,198,141, 27, 35, 34, 34, 2, 7, 14, 28,192,253,251,247,193,227,241, 10,215, 55,187,126,162, 67, 7,142, 72, 36,186,213,183, +111,223,128,175,191,254, 90, 84,163, 70, 13,132,133,133,121,172, 92,185,114,206,197,139, 23,251, 41, 20,138,166,166,167, 93,249, + 81,250,130, 42,193,252,234,194,158, 26,141, 6, 97, 97, 97,150,108,243, 6,181,107,215,142,166,105,250, 37,195, 48,215, 1,212, + 39,132,180,163, 40,234, 12,242,219, 37, 22, 69, 65, 8,249,128,162,168, 28, 0,143,104,154,126,206, 48, 76, 52, 27,183, 97, 49, +227,185,210,187,228,255, 20, 69,157, 92,177, 98, 69,239,210,204, 85, 41,247,102,177,249, 43, 87,174,252,182,200,255, 85,137,168, +182, 71,241,198,240, 29, 10,162, 92,127, 26,173,147, 39, 79,150,239, 64, 24,244, 63,121,116,255,157,206, 58,120, 6, 52,105, 91, + 36, 58, 68, 16,124,247, 22, 0,178,219,172,162,184,246, 22,211, 28,238,238,109,223, 78,165,183, 95, 81, 34, 54, 33, 5,183, 78, +239, 70,106, 98,212, 46,128,204, 64,228,145,156, 42,159,137, 26,253,235, 57,217, 59,216,168,117, 4, 12, 1,240,134,217,122, 39, + 52,246,246,246, 30,112,251,246,109, 7,181, 90, 45,186,113,227,134,114,239,222,189, 73, 58,157,238, 10,128,155, 5,235,132,164, +166,166, 14, 42, 48, 38, 28, 46,151, 43,208,233,116,229,181, 93,104,252,229,167,163,110,124,183,109,167,232,229,227, 80,124,127, +228, 52,178,148, 74,227,149, 20,213,135, 0, 76,142,254, 82, 72,154, 42,158,128, 84,231,209, 20, 92,165, 60,151,240, 12,181, 8, + 40,189, 74, 86,163,209, 12, 29, 62,124,184,171,201,100, 1, 64, 90,174,158,171,212,232, 57,173,253,237,209,164,227, 32, 4, 95, + 62,140, 67,215,226, 81,203, 81,114,205, 75,154,101,214, 17, 77, 77, 73,220,182,126,211,246,245,223, 45,249, 82, 48,179,167, 53, + 6, 54,229, 65,196,167, 96, 37,225, 97,249,198, 31,245, 33,119,175, 61,116,117,117, 61, 9,224,195,196,196, 68,184,186,186,230, + 1,120,206,225,112, 34,141, 70, 99,105,141,186, 23, 2,112,222,179,103, 15,173,215,235,243, 34, 34, 34,224,226,226, 2,103,103, +103, 88, 91, 91, 35, 60, 60, 28,127,252,241, 7,158, 61,123, 6,134, 97,208,176, 97, 67,139, 78, 86,122,122, 58, 30, 62,124,136, +158, 61,123,205, 72, 77, 77,177,178,181,179, 87,220,184,126,109, 77,101, 52, 25,134,161, 0, 32, 32, 32, 0, 1, 1, 1,162,248, +248,120,247,147, 39, 79, 58, 45, 91,182, 44,198,211,211,115,159, 74,165, 42, 22, 57, 48,215,104,153,204,133,201, 4,138, 68, 34, +240,249,124,228,228,228, 32, 57, 57, 25,185,185,249,157, 54,109,108,108,222,137,209, 42, 35, 66,245,214,214,255,139,205,225, 27, +213,157, 54, 54, 54,195, 1,204, 49,115, 95, 96, 48, 24,192,231,243, 17, 24, 24,136, 77,155, 54,225,254,253,251,248,253,247,223, +225,225,225,129,209,163, 71,131,166,105, 60,121,242,196,210, 34, 50,183,111,223,158,243,225,135, 31, 6,236,217,179, 71, 20, 29, + 29,141,103,207,158,193,198,198, 6,155, 54,109, 18,142, 31, 63,190,246,229,203,151, 23, 34,191,243, 75,249, 20,233, 93,168, 16, +187, 14,174, 95,191,254, 27,171,184,184,184, 88,159, 59,119,206,169,208,128,149,236,145,248, 38, 89, 11, 23, 46, 92,239,235,235, +187,161,160,186,176, 45, 0, 41, 33,164,195,145, 35, 71, 40, 0, 24, 56,112, 32,161, 40,202,244,131,244,232,240,225,195, 29,195, +195,195,201,226,197,139,217, 54, 90, 44,101,121,145,241,166,123,178, 44, 3,101,137, 81, 43, 26,241, 50, 49,111,222,188,128, 21, + 43, 86,220,171,162,201, 42,250,198, 68, 76,102,171,240,199,180,204, 42,195,194,216, 23,237,234,226,100,111, 55,119,116,107, 48, + 12, 96, 48, 2, 6, 35,129, 66,169, 66,216,227,251, 74,136,168, 35,102, 21, 71, 40, 88,181,236,235,207,107,134,198,209, 72,200, +212,225,234,177,237, 36, 53, 49,106, 0, 34, 15,127,242,118, 76,214,224,250, 46,206, 78, 87,247,111,255,134,190,255, 90, 11, 35, +147,239,179, 24,134, 20,254,253, 14,112,113,116,116, 28,118,231,206, 29, 71,161, 80, 40,122,241,226, 5,115,248,240,225, 76,157, + 78,119,177,136,201, 2,128,214, 77,155, 54, 53,200,100, 50, 40, 20, 10,157, 78,167, 83,151, 99,178,220, 59, 52,110,112,237,187, +109, 59, 69,106,173, 22,217, 42, 13, 56,246, 78, 37, 77, 22, 0,180,234, 88,183, 90, 53, 74, 36, 7, 1, 16,149,163, 75, 40,203, +100, 1,128, 80, 40,236, 50,117,234,212, 98,227,226, 57,200,121, 6,137,144,103,188,249, 52,141, 9,190,124, 24,215,159,164, 49, + 34, 62,199,232, 72, 94,215, 52,247, 0,100,197, 61,221,246,251,241,147, 23,190, 88,176, 42, 79,169,200, 69, 45, 55, 49,242,114, +179,177,124,197,119,250,219,183,175, 95,153, 51, 99, 98,203,195,135, 15,175, 68,126, 99,112, 0,120,126,248,240,225, 81, 11, 22, + 44,248, 5,127,166,121, 40, 73,194,176, 97,195,226,252,253,253,179,125,125,125,179,211,211,211,241,244,233, 83,100,102,102,226, +251,239,191, 71, 88, 88, 24, 76, 17, 65,179,218,170,188,105,144,144,153,153, 33, 35,132, 32, 51, 35, 93,250,245,215, 95, 91, 87, + 70,211,104, 52, 22,187,183,170, 85,171,134, 73,147, 38,241,149, 74,165, 77, 76, 76,140, 85,209,101,230,106,106,181,218,194,140, +195,132, 16,104,181, 90,100,103,103, 67,171,213,226,229,203,151,133, 38,171,224,251,223, 89, 68,203,244,183, 72, 36, 74, 54, 93, +203,166, 42, 56,145, 72,148, 82,214,250, 85,161,200,119,145,130,191, 45, 53,135, 21,238,143,153,231, 29,124, 62, 31, 99,199,142, +197,189,123,247, 16, 17, 17, 1, 14,135, 3,133, 66, 1,165, 82,137,174, 93,187, 66, 32, 16, 88, 26,209, 34,124, 62,127,248, 87, + 95,125, 37,138,140,140, 68, 90, 90,154,169, 49, 61,140, 70, 35,102,204,152, 33, 22, 10,133,195, 45, 13,221, 39, 38, 38,118,127, +249,242,165,119,201, 41, 41, 41, 41,187,104,155,194,202,114,228,200, 17,106,224,192,129,100,224,192,129,196,100,184, 88, 88, 74, +163, 12, 47,178,163,172,136,214,219,136,138,153, 34, 91, 40,232, 32, 82, 9, 76, 38,171,125, 17,227, 69,153, 34, 92,230, 85, 29, +214, 26,220,200,217,222,238,242,158, 45, 75,101, 39, 31, 83,136,139,141, 66,106, 98, 52,154,182,236,128,176,199,161, 96,244,198, +163,120,121,164,226,150,156, 53, 6,214,245,245,245,251,172,125,203,122, 88,117, 50, 15, 47,130,207, 33, 43, 53,113, 51,162, 14, + 31,125, 43,103,200,115, 96, 3,103, 39,187,203,191,108, 89,106,115,230, 41,141,216,216, 40, 28,251,101, 61,209,235, 52, 89, 40, +222,147,203,226,183,102, 49,163, 21,228,101, 37, 67,155,107,132,136, 86,138, 44,172,164, 72, 2,112,125,253,250,245,157, 91,180, +104, 33, 24, 54,108, 88, 82,102,102,230, 49, 0,119,138,172,227, 95,183,110,221,158,155, 54,109,114,142,141,141,197,197,139, 23, +147,144,223,245,191, 44,226,174,133, 62,222,250,199, 47, 63,126, 41,174,233,131,239,191,250,194,112,228,254,211,190, 0,206, 20, + 89,199,183, 75,253,186, 39,151,205,154, 76, 51, 33,103,241, 48, 58, 25,175,179, 53,127,148, 37,152,150,150, 70, 41,149, 74, 79, + 27, 27,155,162, 23, 36, 92,165, 10,205,236,193,117, 19,186,206,185,225,166,214, 25, 33,228,209,100,122, 63,207,132,123,199,142, +216,167,169,211, 40, 83,111,196,138, 24, 55,164, 75,191, 45,123,127, 27,121,242,228,169,207,116, 26,117, 61, 31, 31,111, 18,116, +251,242,195, 57, 51, 38,246,168,228, 25,151,221,187,119,143,230,112, 56,197, 12,122,209, 8,145,165,145, 34, 75, 48, 87,179,164, +209, 50, 97, 48, 24,168,202,106,106, 52,154, 82,135,118, 40,173,173, 22,195, 48,127,201,254, 91, 18,161, 42, 90,101,104,106, 79, +167, 86,171,157, 10,218,108, 57,191,205,136, 86, 85,122, 34,150, 87,125,105, 73,249,104,154, 6,195, 48,224,243,249,104,216,176, + 33, 78,158, 60, 9, 59, 59, 59, 88, 89, 89,193,202,202, 10, 98,177, 24,246,246,246,133, 70,139,166,205,238,165, 67, 52, 26,141, +135,135,135, 7, 94,190,124, 9,145, 72, 84, 56, 9,133, 66, 4, 4, 4, 64,161, 80, 84,195,187,140,221,179,176,252,181,207,149, +147, 69,205, 18, 69, 81, 39,231,206,157,251, 85,101,245,230,206,157,251, 85,105, 17,174, 42, 26,174, 98,209, 45,110, 81, 7, 89, +170,147, 44, 48, 89,187, 54, 47,177,250,237, 1, 16, 23, 23,137, 11,135, 54,230,234,117,218, 76,134,209,123,190,126, 22, 10,208, +216,109, 86, 17,104,210,188, 95,207,142,212,133, 39, 90,228,100,165,226,121,208,185, 40,168, 4,243,222,154,201,114,118,184,188, +103,203, 18,155, 19,143, 41,196,198, 70,225,204,254,239,115,244, 58, 93, 23, 68, 30, 9,170,138,244,112, 62,191, 31,191,122, 76, +239, 79,219, 38,192, 72, 25, 49, 60, 44,252,131,148, 36,244, 75,188, 81,126,207,176,162,164,166,166, 30, 91,191,126, 61,181,122, +245,234,246,106,181,250,127, 0,138,134, 40,235,213,170, 85,235,227, 29, 59,118,216,197,198,198,242,110,220,184,161,184,124,249, + 50, 1,112,162,130,136,203,236,174,159, 76,226, 52,174, 81,109,106, 72, 84,124, 95, 0,103,139, 44, 14,232,221,196,255,230,206, + 21, 11,229,250,155, 71,144,151, 24,139,121, 55,227,114, 0,152,125,188,245,122, 61,178,179,179,161,207, 75, 55, 52,117, 85,100, + 47, 30,228,164, 73,206, 84,115,121,140,210,224,107,149,162,185,156,254,154, 35,145, 72, 44, 58,150, 91, 86,124,185, 23,192,222, + 65,131, 6,237,121,116,251, 84, 83, 87, 87,215, 83,190,190,190, 20, 0,148,209,195,176, 44,150, 2,152,209,170, 85, 43, 42, 48, + 48,240,238,134, 13, 27,206,151,103, 86, 42, 19,209,170, 8,115, 53, 25,134,161,203, 56,190, 84,101, 53,139, 70,180, 42, 50, 90, +239, 50,162, 85,154,105, 41,106, 18,139, 26,161,127, 66,175,195,242,204,148, 37,229, 51,181,147,227,243,249, 8, 13, 13, 69,245, +234,213,161,211,233, 32,151,203, 33,151,203, 33,147,201,144,155,155, 11, 30,143, 7, 11,247,153, 17,137, 68, 49, 79,159, 62,245, +118,116,116,132,209,104, 44,102,182, 94,188,120, 1,169, 84, 26,111,105, 68,203,213,213,245, 92, 65,175,195, 98,184,184,184, 88, +191,141,227, 90, 52,146, 53,112,224, 64,182,138,144,165,220,104, 86, 25, 81,173,212, 18,145, 40,109,145,255, 83,145,159,195,173, +119,193,223, 40,229,111,109, 41,243,210, 87,172, 88,113,185, 72,251,174,212, 42,238,130, 41,197, 67,177, 30, 46,220,138, 34, 89, + 78,118,182,151,127,250,126,177,213,161, 96, 32, 62, 54, 18, 87,143,110,202, 54, 24,117,157,192,144,196,219, 23,143, 30, 1, 5, + 37, 94, 31,185,106,222, 35, 2,141, 27,251,121,226,247, 39,122,164,198,189, 0, 33,204, 46,164,236, 85, 86,249,236,212,234,223, +208,201,206,225,242,174, 77,139,173,127, 11,165, 16, 23, 27,137, 11,135, 54,229, 24,244,202,206,136, 60, 26, 92, 89,217,177,128, + 45, 71, 42,218, 58,160, 67,227,193,158,181,220,193, 16, 61, 24, 62, 65,255,217, 14,220,231, 33,202,223,175,139,178, 15, 49,121, +204,103,241,119,204,107, 64,151,151,151,247, 59,128, 32, 20, 79,175,208,160, 78,157, 58,131,183,110,221,234, 24, 23, 23, 39, 10, + 9, 9, 81,109,223,190, 61,133, 97,152,223, 0,152, 83,149,250, 69, 72, 84,252, 79, 40,158, 47,167,193,151,159, 12,187, 61,108, +204,167,162,200,139,123, 97, 27, 25,134, 89, 55, 19,140,207, 51,181, 67, 11,162,107,165,226,224,224, 64,210,210,210,162,179,178, +178,188,165, 82, 41,210,211,211,145,145,145,129,236,236,108,104,114, 50, 12,246,198, 44, 5,101,200, 0,143,199, 67, 74,172, 30, + 70,163, 49,201,220,104, 22, 0,219,165, 75,151,142, 99, 24,198,148, 17,177, 88,239,194, 34,235,153,174, 7,239, 65,131, 6,237, + 41,210,235, 48,187,168, 22,242,211, 59, 80, 5,233, 29, 90,156, 61,123, 54,188, 71,143, 30,113,165,153, 21,161, 80,104,113, 67, +233,178,122, 49, 86, 70,179,172,136, 86,201,249,150,104,154,170, 47, 77,141,224, 75,206, 55,193,225,112,192, 48, 12,204,232, 84, +241,151,154,150,162,189, 3, 43, 99,114, 74,156,155,114, 19,135, 86,178, 39,226, 91,141,104,153,206, 5,159,207,199,241,227,199, + 49,102,204, 24, 24,141, 70, 72, 36, 18,200,100, 50, 72,165, 82, 28, 61,122, 20,166,244, 15,150,248, 87,189, 94,255,235,138, 21, + 43,190,218,182,109,155,152, 16, 2,129, 64, 80,104,180, 22, 47, 94,172,210,233,116,191,154,101,180, 76, 25,223, 25,242, 84, 42, + 53,148,219,235,176,180,109,202,104,175,101,179,116,233,210, 81, 12,195,244, 67,137, 20, 14, 37,214, 43,150,250,129, 77,239,192, + 98,198,243,228,254, 63,184,120, 38,131, 69, 21,137,100, 21, 26, 46,186, 60,243,226,104,107,115,249,199,239, 23, 91,237,187, 79, + 33,242,245,107, 92,249,223,198,124,147,245,234,208, 3, 68, 31, 73, 70,228,145, 54,120,125,164,187,217,111, 79, 20,213,216,205, +201, 6, 25, 10, 6, 57,105, 49, 0, 65,200,219, 48, 89,142,182,142,151,127,222,180,216,250,240, 3, 26,145,145,145,184,112,104, + 99,182,193,160,238, 84, 21,147, 53,156,207,239, 87,167,174,123,196,252,113,253, 6, 7,214,118,129,125, 76, 56, 78,140, 30,140, +111, 14,124, 4,185, 35, 7,205,123,202, 49,118,185,203, 96,215, 0,225, 75,215, 54,232,103,129,116, 81,147,213,216,203,203,107, +240,157, 59,119, 28,234,215,175, 47,122,246,236,153,122,251,246,237, 41, 42,149,234, 60,128, 80, 11, 52,139,154,172,198,115,199, +143,190,253,221,143,123, 68, 52, 95,128, 85,191,158,192,180,107,113,198, 83,209, 57,131, 80,188, 90,177, 84, 52, 26,205,197, 77, +155, 54,105,104,154, 70, 70, 70, 6,210,210,210,144,146,146, 82,248,153,149,149, 5, 14,135,131, 75,151, 46,105,115,114,114,238, +152, 91,192, 91,183,110,121,197,199,199,251, 38, 38, 38, 54, 45,152,158, 33,191,119,161,172,200,188,166,137,137,137,237, 1,220, + 55,205,143,139,139,171,113,247,238, 93,215,138,244,229,114, 57,248,124,126,177,136,150, 80, 40,132,179,179, 51, 12, 6, 3, 14, + 30, 60, 8, 0, 25,229,105,240,249,130, 68,154,166,192, 16, 70, 35, 18,137, 24, 87, 87,215, 82, 13,150, 37,154, 5,196,125,240, +193, 7,234,224,224,224, 82, 35, 90,149,209, 36,132, 40,187,117,235,134,132,132, 4,136, 68,162,194, 31,107,147,161,162,105, 26, + 66,161, 16, 73, 73, 73,152, 48, 97, 2, 8, 33,202,191,251,201, 83,180, 77, 83,129, 25,162, 0, 80, 5, 70,232,141,118, 90,230, +182,129, 50, 85, 13, 18, 66, 96, 50, 92, 37,150, 23,126,151, 57,217,219, 75,180,233, 26,159,149,149,245, 93,126,113,200,246, 18, +159, 59, 44,248, 81, 40, 52, 90, 97, 97, 97,216,179,103, 15,178,178,178, 32, 16, 8,144,153,153,137,157, 59,119,226,233,211,167, + 16, 8, 4, 48, 29, 11,115,253, 91, 96, 96,224,119,215,175, 95,127, 58,116,232, 80, 85,104,104, 40, 84, 42, 21, 66, 67, 67,209, +189,123,119,245,205,155, 55, 35, 84, 42,213, 82,152, 83,117,104,202,248, 94, 48,188,142, 70,163, 65, 72, 72, 72,169, 83, 89,219, +148, 36, 34, 34,194,211,104, 52,122, 19, 66,218, 18, 66,172, 80,144,194,161,224,255,162,211, 7, 5,203,172, 8, 33,109,141, 70, + 99,157,136,136, 8, 79,214, 78,176,188,167, 92, 45, 98,182, 72, 17,147,117,181,252,136, 22, 67,111,250,105,227, 18,171, 95,239, +209,136,141,142, 64,208,233,173,217, 70, 70,223,201,194,225,112,186,160, 72,174, 13,145, 88, 90,143,161,242,187, 51,231,164,197, + 2,132, 83, 25,163, 85, 76, 19, 12,189,105,231,198,197,214,251,131, 40, 36,196,190,194,205, 99, 91,178, 13, 6, 77,103,188, 62, + 18, 82, 25,205,225,124,254, 2, 30,135,154,223,173,117, 35,126,155, 70,117, 33, 77,137, 66, 82, 92, 2, 14,134,165,102, 68,100, +106, 62,189, 73,233, 16,253, 74,243, 83,207,113,118,118,182, 46, 60,244,158,104,111,119,231, 68,206,239, 20, 79,161, 35, 58,178, + 34,241,102,225,176, 20,197,203,249, 38, 46,114,185,124,104, 80, 80,144,149, 72, 36, 18, 7, 5, 5, 49,219,183,111, 79, 87,169, + 84,167, 1,220, 54,107,223,223,196,189, 89,221, 90, 87,191,221,242,163, 40, 79,161,132, 66,171,131,208,217,213,248,219,237,199, + 3, 80,118, 2,204, 98,154, 66,161,112,255,254,253,251,123,182,107,215,206,179, 94,189,122,116, 70, 70, 6,242,242,242, 10, 27, + 87, 59, 58, 58, 34, 44, 44,140,137,140,140, 76, 16, 10,133, 7,204, 45,103,171, 86,173, 34,105,154,126, 86, 80,141,246, 12, 37, +122, 23, 22, 89,213, 59, 49, 49,177,153,171,171,235, 85, 0,146, 34,189, 14,139,106,154,210, 59,124, 5,128,166, 40,234,126,104, +104,104, 94,143, 30, 61, 32, 22,139,161, 80, 40,224,225,225, 1,131,193,128,211,167, 79, 35, 56, 56, 88,193, 48,204,213, 82,204, +107,177,114,170,213, 42, 15, 0,180, 74,169,108, 56,106,212,168,246, 51,103,206, 44,214, 37,221,201,201, 9,118,118,118, 22,105, + 2, 64, 70, 70,134,223,217,179,103, 63, 15, 13, 13,253,162,103,207,158,214, 95,125,245,149,208,203,203, 11, 70,163,145,174,172, +102,102,102,166,117, 72, 72,200,154, 54,109,218, 76,238,209,163, 7,247,219,111,191,133,181,181, 53,140, 70, 35,196, 98, 49,114, +114,114,176,116,233, 82,220,184,113,195, 64, 8,217,146,157,157, 61,203,194,107, 9, 85,189, 55,203,138, 0,149,149,146,161,140, +245,255,242,114,150,104,211,133,130, 20, 14,115,202,200, 96, 15,115,175,121,147,209,226,112, 56,136,138,138,194,246,237,219,223, +200,163,101, 74,255, 80,134,118,105,251, 78,174, 92,185, 98,164, 40,170,101, 80, 80,208,156,145, 35, 71,126,170, 80, 40,220,165, + 82,105,130, 94,175,223,173, 82,169,150, 35,191, 61, 42,223,146,103,136, 66,161,136, 46,173,215, 97,201,117, 0,155,114, 53, 75, +164,119, 40,150,194,161,196, 54,197, 82, 63,148,146,222,225, 47, 63,239,172,230, 63, 82,243,125, 55, 91,101, 39, 44,125,131,198, +227,121, 60,149,190,254,245, 8,170, 42, 38,235,205,104,137, 90, 25,177,112,127, 76, 35,173, 70, 13, 69,118,242,115, 68, 29, 76, +169,210,110, 21,148,243, 90, 4,133,168,200, 87,184,119,114, 75,126, 57, 95, 31,169,116, 57, 41, 96,222, 15,103,142,240, 41,107, + 59, 60,252,124, 12, 18,178, 20, 56,243, 58,243, 16, 81,106, 62,251, 21,200,196, 13,128, 54,104,174,239,252, 58,105,107,219,254, +214,131, 29,170,241,176,238,203,221, 16,205,181,231, 55,239,220,206,146, 49, 16,147, 68, 34,209,245,239,191,255,190, 75,219,182, +109,133,131, 6, 13, 42,173,129,188,165,196,221,127,241,234,135, 83,219,214,126,105, 95,191, 5, 54, 47,152,109,220,127,251,113, +201, 94,136,229,226,235,235,107,188,117,235,214,204, 9, 19, 38,172,235,210,165,139, 91,223,190,125, 5, 30, 30, 30, 16, 10,133, +120,245,234, 21,174, 95,191,174,125,253,250,117,130, 82,169,156,217,160, 65, 3, 75,114,156,101, 46, 92,184,240,187,130,239,160, + 10,170, 11,155,162,160,119,161,105,165,130,164,165, 77, 1, 72, 22, 47, 94, 60, 18, 0,202,232,246,189, 16,192, 54, 0, 92, 66, + 72,210,222,189,123, 91, 30, 59,118,172,229,140, 25, 51,248, 61,123,246,196,157, 59,119,112,225,194, 5,157, 78,167,187, 93, 96, + 92,205, 29, 42,135, 1, 16, 98, 48, 24, 30,175, 90,181,170, 37,135,195, 89,104, 90,240,244,233, 83,236,218,181,171, 50,154, 6, + 0,107,146,147,147,127,216,187,119,239,194,139, 23, 47,126, 50,106,212, 40, 43,189, 94,143,176,176, 48,252,252,243,207,149,210, +204,206,206,254,220,193,193, 97,254,233,211,167,119,159, 63,127,254,195, 17, 35, 70,208,211,166, 77,195,166, 77,155,240,191,255, +253,143, 49, 26,141,199,120, 60,222,168,180,180, 52,197,187,120,234, 20, 84,195, 37, 88, 56,214, 97,133,186, 85,169, 26, 52,147, +196,170, 10,152,246,163, 67,135, 14,133, 81, 70, 83, 20,174,232, 58, 20, 69, 89, 92,117, 8,192,134, 16,194, 0,216,130,252,241, + 69,139,102,133,231,224,207,204,241,230, 42,250, 39,106,108,158, 66,131,176,242, 7,149,182, 1, 8,252, 43, 80,203, 90,184,112, +225,250, 69,139, 22,173, 47,153,194,161,232, 74, 37, 83, 63, 44, 89,178, 4,108,122, 7,150,127, 43,165, 27,173,144, 29,122,125, +205, 1, 95,125,255,237,236, 69, 6,189, 54,155, 64, 55, 16,175,142,134, 86,245,203, 8, 67,230, 94,218,183,120, 19, 8, 50,137, +209, 48,167,202,165,255,139,202, 73, 89,219, 33,119,233, 36,252,239, 73, 2, 73, 82,232, 63,250, 85,167, 43, 22, 13,202,111,147, +197, 12,185,172,206, 60,104,235,198,251,237,243, 78,246,212,169,140,145, 22,127, 79, 74, 74,202,241,245,235,215,211,107,215,174, +109,175, 84, 42, 75, 54,144,175, 44,179,251, 76,157,203,105, 94,199,115,234,189,151,209,253, 96, 70,117, 97, 73, 90,181,106,149, + 24, 30, 30, 62,236,252,249,243, 67,175, 93,187,214, 69,161, 80,120, 82, 20, 5,137, 68, 18,173,209,104, 46, 10,133,194,253, 22, +154, 44, 0,192,162, 69,139,200,146, 37, 75,168,240,240,112,194,225,112,254, 0, 16,201,225,112,162,138, 54,130, 47, 58,223,180, +205,226,197,139,205,249, 65,188,150,151,151, 23,188,116,233,210,118, 75,151, 46,109, 88, 16, 21,186,134, 63,219,124, 89,138, 30, +192, 53, 62, 95,144, 64, 81,148, 59, 95, 32, 84,220,186,117,235, 98, 21, 53,149, 58,157,110, 78,108,108,236,186,117,235,214, 45, +151, 74,165,205,158, 62,125,250, 71, 85, 52, 11, 76,212, 0, 59, 59, 59,183, 61,123,246, 28,222,185,115,103, 11, 46,151,123,135, +162,168, 65,217,217,217,239,116, 80,233,130, 1,162,151, 88, 48,214,161, 89,186,111, 59, 73,233, 95, 97,220,140, 70, 99,222,252, +249,243, 83, 74, 26,175,146,209, 43,211,255, 5,169, 92,204, 57,166,150,244,162,172,192,184, 80,121, 0,144, 63,118, 97,254,176, + 58,230, 14, 42, 13, 64, 85,209,125, 78,211,244, 49, 0,207,105,154,126, 89,178,163, 75,209,101, 75,150, 44,169,232, 62,103, 97, +121,175, 49,227,201,182,152, 6, 22, 87,182, 37,237,223, 24,174,124, 59,229, 28,198,231, 47,161,129, 47, 1, 80, 4, 88,247,171, + 78,247,117,121, 27,186,180,194,114, 66, 97, 70,193,193,252, 54,233, 38,150, 85, 98,223,171,193,140,241, 7, 45,212,244, 65,249, + 3,202,190,161, 57,112,224, 64, 78, 25, 63,230,197, 6,149, 46,139, 35, 71, 10,179,248,151, 85,206,162,215,155,252,238,221,187, +110,129,129,129,137, 40,222,232,191,180,249,196,194,125,231, 0, 48,190,229,227,249, 94,104,214,170, 85, 75,240,234,213, 43,237, + 63,235,222,100, 53,255,145,154, 54,126,213, 65, 97, 28,138,230, 14, 42, 55,162, 85,196,160, 17,242, 51,178,194, 98,203, 40,167, +233, 62,183,137,136,136,240,172, 93,187,118, 52,128,172, 18,229, 40,109, 25, 97,207,209,127, 94,179, 52,198,163,248, 80,116,239, + 21,165,245, 14,199, 95,112, 34, 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53, 43,107,180,222, 91, 8, 33,160,193,194, +194,194,194,194,194,194,194,242,151, 64,149,227, 74, 45, 9, 9, 86,198,217, 94,100, 53, 89, 77, 86,147,213,100, 53, 89, 77, 86, +243, 63,167, 89,145,118,209,237,223,215,170,195,241, 0,118,176, 85,135,172, 38,171,201,106,178,154,172, 38,171,201,106,254, 83, + 52,203, 50, 44,239, 45,132, 16, 51,199, 58,100, 97, 97, 97, 97, 97, 97,249, 71,208,165, 46, 92,185, 70,208,103, 95,153,213,137, +170, 66,122,212, 66, 53, 0,120, 91,122,255, 81, 92, 1,244, 42,242,255, 41, 20,244,140,103,141,214,251, 75, 29, 0, 95, 1,176, + 46, 50,239, 30,128, 21, 37,214,219, 7,160,232,128,132, 10,228,143, 19,248,210,146, 47,163,105,122, 69,187,118,237, 62,187,113, +227,198, 90,131,193,176,180, 18,229,245,116,117,117,253,142,162,168, 38, 0,120, 20, 69,189, 74, 78, 78, 94, 97, 48, 24,170,210, +107,165,166,139,139,203, 74, 0,141,104,154,230, 81, 20, 21,145,156,156,188,204, 96, 48, 92,169,130,166,220,217,217,185, 53, 33, +196, 5, 0,135,199,227,165,199,199,199,223, 69, 37,115, 43, 13, 92, 28,198,207, 81, 24,120, 0, 96, 37,229,234,143, 44,246,211, +153, 59,143,189,196, 89, 88,254,219,144,252,158,201,197,232, 94, 11,203,137, 1,179,140, 0,213,205, 11, 27,207, 69, 98, 86, 89, +219, 83,165,244,106, 46,169,217,189, 22,150, 27, 73,190, 70,183, 90, 88,115,238, 21,202,237,105,111,142,166,137, 29, 0, 61,222, +140, 81, 10, 40,243,122, 95,255,211,233,133,226, 85,156,133, 85,158,229, 26,173, 33,117,225,106,228,130,123, 36, 12,166,110,188, +114, 0, 13, 11,126,228, 95, 34, 63, 87, 81,110, 21, 11,247,190,104,254,211, 88, 72, 8, 25, 86,236, 98, 45, 37, 15, 81,167, 78, +157,250,158, 63,127, 94, 98, 26,239,142, 97, 24,136,197, 98, 3,128,209, 22,124,151,211,144, 33, 67,230,254,244,211, 79, 24, 60, +120,240,252,147, 39, 79,174, 7,144,103,238,198,182,182,182, 3,109,108,108, 54,253,248,227,143,142, 45, 90,180,164, 4, 2, 1, + 94,189,138,112,159, 48, 97, 66,189,240,240,240, 99, 41, 41, 41,159, 90,186,243,118,118,118,195,109,108,108,214,109,223,190,221, +161, 77,155, 54,160, 40, 10,193,193,193,238,159,127,254,121,195,152,152,152, 3,201,201,201,147, 45,213,180,183,183,175,107,109, +109,221,113,243,230,205,226,214,173, 91, 67, 36, 18, 33, 52, 52, 84, 54,113,226, 68,151,248,248,248,176,228,228,228,171,150,154, +172, 71,193, 39, 62, 52,232, 52,171, 0,128,203, 23,206,110,177,238,246,137, 71,151, 79,244,169,104,222,192,197, 97,191,179,102, +139,133,133,165, 40,195,221,224, 66, 8,190, 60,255,243, 2, 26, 0,186,125,242,205,180,225,110, 88,251,107, 66,217, 99,216, 90, +168, 55,107, 84, 53,108,218, 19,143,228,170,148,115, 7, 64,127,206,229, 78,107, 30, 24,232, 48,229,230,205, 8, 29,176,251, 63, +114,138, 74,173,230, 44,211,104, 13,240,195, 82, 67,126,196,132,234, 81, 27, 7, 46, 68,114,174,119,234,212,169,246,216,177, 99, +169,198,141, 27, 35, 56, 56,184,238,129, 3, 7,122,157, 58,117, 42,194,104, 52, 6, 3,120, 2,243,179, 90,243, 0, 4,112, 56, +156, 38,255,112,205,127, 50,210, 2,115,149,140, 63, 19,157,190,145,240,244,210,165, 75,199,185, 92,174, 41,162,213, 92,161, 80, + 56,151,136,130,153, 67, 13,189, 94,143,103,207,158,129,166,105, 30, 0, 47,188, 57,164, 70, 89,184, 75, 36,146,173,183,239, 5, +219, 83, 92, 49, 50,213, 0,212, 58, 8,100,206,248,105,215, 94,187,153,211, 39, 15,184,114,229,202,245,220,220,220, 95, 44, 40, +143,151, 84, 42, 93,255,240,225, 67,123,137, 68, 2,134, 97,144,155,155, 11, 23, 23, 23,252,248,227,143, 54, 51,103,206, 28,150, +147,147,115, 69,173, 86,255,207, 18,115,110,109,109,221,241,241,227,199, 98,211,128,210, 90,173, 22,238,238,238,216,183,111,159, +112,218,180,105,126, 89, 89, 89,113, 90,173,246,181,185,130, 57, 10, 3,207,160,211,172,218,179,101,113,117, 0, 24, 53,121,241, + 42, 65,174,213,105,115,230,229, 40, 12,167, 0,176, 70,139,229,239,166,137,131,131,195,145,180,180,180,171, 0, 62,197,219,137, + 52,212, 21,137, 68, 13, 24,134,113,161,105, 26, 28, 14, 39, 73,161, 80, 60, 4,240,162,178,130,246,181, 58,244,129, 80, 50, 6, +132,105, 72, 3,160,104, 58,212,168, 83,238, 74,127,113,229, 68,149, 52, 5,226, 79, 0,210,144, 6, 24,138,166, 31, 50, 6,229, +143,105,207,174,156,249,167,156,156, 59,217,240,174,229, 98,254,192,152,111, 67,239,227,154,112,165, 25,208,251,162,204,175, 86, +156, 10,244,156, 62,125,186,203,228,207, 62,163,198,140, 30, 93,231,234,141, 27, 84,123, 75, 70, 43,120, 63, 41,179,193,126,169, + 70,107,160, 31,108, 9, 48,231,192,166,175,104, 46,135, 67, 13,157,190, 98,216,206, 45,107,232,174,125, 6, 21, 86,159,180,109, +219, 22,109,219,182,165, 86,173, 90, 85,231,143, 63,254,168,179,111,223, 62,195,237,219,183, 31, 2, 56, 88,214,151,117,175, 5, + 21, 3,136,248, 60,174, 98,232,130, 95,182, 7, 6, 6, 66, 40, 20,162, 42,154, 0,208,181, 54,253,154,103, 87,243,225,208,169, + 11,163, 91,180,104, 69,222,134,230,123,196, 61,160,112, 80,107,219,234,213,171,183, 54, 24, 12, 34, 0,224,114,185,234,216,216, +216,169,200, 31, 27, 16, 0,142, 49, 12,211,215, 2,109, 26,192,162,190,125,251,206,159, 50,101, 10, 60, 60, 60, 48,109,218, 52, +232,245,250,224, 51,103,206, 44, 4,176, 18, 21,220, 60, 78, 78, 78, 11,183,110,221,106,199, 21, 72,209,120, 78, 36, 18,179, 12, + 0, 0,153, 16, 56, 62,137, 96,218,180,105, 86, 65, 65, 65,203, 44, 49, 90, 78, 78, 78, 75,127,252,241, 71, 59,137, 68, 2, 66, + 72,225, 88,140,121,121,121,200,203,203,195,228,201,147,173,194,194,194,190,179,196,104, 57, 59, 59,183,222,188,121,179, 88, 36, + 18, 33, 47, 47,143,175,211,233,168,220,220, 92, 40,149, 74,162,213,106,117, 83,167, 78, 21, 62,121,242,164, 67, 98, 98,226,107, +176,252, 83,224, 0,248,136,199,227,245,175, 93,187,118,211,151, 47, 95, 62, 48, 24, 12, 71, 1, 28,125, 11, 47, 83,157,221,220, +220,150, 39, 36, 36,108, 6,176,247,191,114, 64,157,157,157,143,222,186,117,171,250,214,173, 91, 71,175, 93,187,246, 52,128,255, + 85, 65,142,207,231,243, 7,180,111,223,190,250,168, 81,163, 4,206,206,206,208,104, 52,136,140,140,180, 58,116,232,144,103,104, +104,104, 92,193,136, 24,102,191, 80,216,215,109, 37, 3,215,234, 64,203, 86,173,219, 12, 30,240,145,220,217,222, 26, 42,173, 17, + 47,163, 19, 61,206,158, 62,222, 62,156, 47,190,165,211,101,127,156,254,226, 86,158,165,154, 29, 59,118,110,211,165,115,103,185, +181,141, 53,178, 21, 58,188,138,138,247,188,124,225, 68, 91, 46, 87,124,141,161,244, 35, 82, 30, 95, 80,190,203,115, 51, 13,224, + 42, 68,246, 13, 26,182,106, 28,212,109,236,178,166,132, 16,208, 4, 27, 75, 70,179,166, 1,220,141,249,195,126, 89,164, 7, 66, + 8, 69, 97, 77,209,104, 86,247, 90, 88, 78, 8,102,129, 6,213,189,130,106, 74, 19,221, 0,161,141,157, 93,224,196,241,227,169, +220,156, 28,132,134,134, 42, 75,154,172,245,213,192,191, 70,163,198,177,216,202,155,237,127,104, 52,171,212,170, 67,179,243,104, + 73, 36,146, 82,231, 91, 91, 91,163, 99,199,142, 88,177, 98, 5, 23, 64,147, 18,139,139, 15,178, 10, 8, 79,110,155, 7,107,169, +144,246,240,240,144, 91, 89, 89, 85, 89, 19, 0, 64, 24,175, 86, 30,228,131,251,191,124, 53,250,226,190,117, 1,138,220, 44, 94, +201, 85,100, 50, 25,188,189,189, 49,127,254,124,243, 52,171,206,223,170,233,226,226,226,211,182,109,219, 38,151,174, 94,181, 73, + 72, 72, 16, 38, 36, 36, 8,207, 95,186,100,211,178,101,203, 38, 46, 46, 46, 62,133,135,234,205,174,166,229,149,243,155, 45, 91, +182, 44, 60,118,236, 24,221,182,109, 91,216,218,218,162, 99,199,142, 56,125,250, 52,119,237,218,181,223, 2,152, 95, 81, 57,105, +154,110,211,182,109, 91, 10,132, 32, 41,219,128,187, 43,124, 16,186,198, 23,185,106,130,140,236, 28,168, 84,106, 72, 36, 18, 17, +242,171,123,205,221,247, 86, 45, 91,182,164, 0, 20,154,171,220,220,252, 41, 47, 79, 1,173, 86, 7,161, 80, 40, 7, 32, 50, 87, +147, 16,226,210,186,117,107, 0,128, 78,167, 43,124,195,203,202,202,162,178,179,179,161,213,106,193,227,241,248,168,184, 93, 99, +161,166,149,148,171,231,242,133,179, 71, 77, 94, 28, 59,106,242,226, 88, 46, 95, 56, 91, 43,207, 49,154, 51,207, 74,202,213,191, +227,235,211,145,166,233,159,107,213,170, 21, 70,211,244, 30, 0, 46, 85,212,108, 6,224, 91,177, 88,124,209,215,215, 55, 86, 34, +145, 92, 42, 48,234, 45, 43,169, 41,144, 72, 36,151,190,253,246,219,195, 15, 30, 60, 24,252,199, 31,127,120, 61,122,244,104,192, +170, 85,171, 14,200,100,178,235, 40,222, 46,209,226,123,211,203,203,107,231,221,187,119,155,181,106,213,234, 39, 0,194,183,116, +191,115, 0, 52,130, 89, 35,114,188,147,243,238,214,184,113,227,234, 34,145, 8, 93,186,116, 1,128, 14, 85,209,228,243,249, 3, +230,207,159, 95,107,193,130, 5,130,196,196, 68, 92,186,116, 9,247,238,221,131,193, 96,192,164, 73,147,132,163, 70,141,170, 41, +151,203, 7, 88, 84, 78,174,213,129,233,159,207,232,241,229,180,113,242,135, 49, 58,236,186, 24,131,223,111, 39, 34, 69, 41, 64, +159, 1,163,172,187,247, 27,210, 93, 32,180, 62, 96,169,230,220, 57,115,122,140,255,100,152,252,105, 34,131,227,119,146,112,231, + 89, 54, 12, 60, 27,244, 28,240,169,109,195,214, 61,122,113,193,219,253,174,207,209,143, 64,139,233,211,167, 59,206, 94,243,235, + 77,183,102, 31,109, 76,205, 68,219,162,198,167, 46, 96, 99, 39,149,126,244,172,125,251,113,226,252,241, 98,203,213, 44,166,215, +164,223,166,148, 76,180, 43,218, 62,171,157, 29,234, 20, 84, 43,114,206,255,188,128, 38, 20,166, 13,119, 43,246, 28, 40,181,156, + 87,128,193,211,103,204,224, 89,219,218, 98,203,150, 45,208, 40, 20,197,218,204,118,174,142, 30, 23, 37,220,184,154,190,238, 97, + 29, 61,169,235,255,194,247,149,241,101, 70,180, 78,158, 60, 73,122,247,238, 77, 1,192,145, 48,100, 14,240,195,119, 67,166,124, + 59,159,162, 41, 82, 35,160,213,211,106,181,252, 21,246,246,246, 80, 42,149,208,104, 52,224,243,249, 80,171,213,136,137,137,193, +157, 59,119, 96,107,107,107, 81, 73,114,114,114, 32,147,201, 32,147,201,222,138,230,188,209, 93,132,175, 98, 83,133,231,238, 92, +105,255,253,103,255,107, 81,171, 81,135, 71,157,135, 76,123,108,229,232,166,126,244,232, 17,110,221,186,133,204,204, 76, 4, 6, + 6,254, 91, 78,230,189,130, 54, 89,247, 0,216,214,174, 93,219,253,220,197,107,182,121,106,198, 42, 42, 89,207, 99, 24, 6, 18, +137,171,225,224,145,227,217,131, 7,244,161,146,146,146, 82, 0,220, 43, 48,183, 21,141,169, 40, 2,224, 51,112,224,192,185,159, +125,246, 25, 34, 34, 34, 48,110,220, 56,213,189,123,247,210, 91,181,106,101,255,227,143, 63,138,103,206,156,137,171, 87,175, 46, + 58,121,242,228,111, 0, 34, 1,148, 58, 86, 27, 33,132,207,231,243, 97, 40,176, 13, 58, 35, 83,232,239,115,114,114, 64, 84,153, +224,243,249, 28, 0,142, 48,179, 29, 29,195, 48,124, 30,143, 87,104,178, 98,146,115, 16,147,162, 68, 78,158, 22, 42,149, 1, 90, + 21, 1, 71, 98,207, 5,162,156, 1, 68,153, 27, 29, 17,137, 68, 48, 24, 12,200,205,205, 47,134, 41, 82,166,213,106,145,157,157, + 13, 14,135, 35, 3, 96, 5, 32,195, 28,193,130, 70,238,191, 23, 84, 3,226,254,175,125, 29, 94,158,154, 87,108,158,149,148,171, + 63, 50,211,143, 99,239,222,240, 70,163,193,187,125, 11,231,189,219,246, 89, 66, 71, 71,199,203,135, 15, 31,246,171, 83,167, 14, + 34, 35, 35,125, 7, 13, 26, 20,152,152,152,216, 8,150,143,201, 40,161,105,250,187, 81,163, 70,125, 54,116,232, 80,170,110,221, +186,224,114,185, 48, 24, 12,238, 17, 17, 17, 29, 15, 29, 58, 52,103,231,206,157, 63, 26,141,198, 47, 96,126,187, 63, 90, 32, 16, + 28,220,190,125,123,187,192,192, 64,236,217,179, 7,247,238,221, 99,154, 53,107, 70,143, 28, 57, 18,158,158,158,129, 35, 71,142, +252, 93,163,209,244,172,100,100,203,179,101,203,150,213, 57, 28, 14, 90,181,106,197,191,117,235, 86, 99, 0,183,170,120, 76,101, +238,238,238, 87, 59,116,232,208,232,226,197,139, 33, 73, 73, 73, 29, 44,216, 95, 0,232,231,230,230,182,202,218,218,218,214,130, +103,172, 50, 62, 62,126, 22,128, 35,102,110,210,162, 73,147, 38,136,142,142,134,143,143, 15,248,124,126, 75,157, 78, 55, 1, 64, + 15, 0, 95, 3, 8,179,160,188,117, 59,119,238, 92,189, 67,135, 14,212,145, 35, 71, 10,219,135,210, 52, 13,131,193, 0, 62,159, +143, 22, 45, 90,208,193,193,193,213,238,223,191, 95, 23,102, 84, 35,218,215,234,208,167, 85,155,246,109,218, 5, 54,160,215, 30, +121, 9, 35, 99, 4,135, 50,128, 75, 49, 96,244, 66, 8,249, 28,212, 13,104,202,121,246,228, 97,160, 86,163,235,147,254,226,226, + 9,115, 52,123,116,235,218,214,207,167, 46,253,253,239,175,144, 21, 31,102,140, 15,191,150, 70,115,104,248, 53,233,228, 80,215, +191, 17,167, 81, 96, 7, 94, 66,228,147,142,106,117,187, 46,153, 17,215, 46,190,139, 27,114, 9,192,113,175,230,240, 81,239,174, + 29,248,137, 9, 9,138, 67, 71, 78, 60, 86,234,113, 7, 0,174, 2, 84, 79,160, 65,253,230,205,219,255,184,114,165,189,171,171, + 43,111,196,208,161,134, 29, 33, 33, 33, 40,163,234,119, 9,192,113,112,113,233, 50,113,226, 68, 78, 98, 66, 2, 57,116,244,212, + 35,147, 30,242,223, 82,234, 55,112,247,237, 13,197, 51,139,170, 41,251, 0, 2,103, 23, 23,191, 9, 19, 38, 32, 41, 33, 1,123, +246,238,205, 83, 3,183, 77, 81,172,227, 28,108,246,175,229, 50,102,246,167,125,169,234,174, 14,152,184,104, 71,203,142,186,148, + 90, 72,252,243,252, 23,245, 34,239,177,201, 26, 95,170,209, 42,201,255,194,176, 80,206,135,215,161, 67,251,233,212, 92,157, 34, + 34, 34, 2, 14, 14, 14,112,117,117,133,181,181, 53,158, 62,125,138, 75,151, 46,225,249,243,231, 96, 24, 6, 13, 27, 54,180,168, + 52,105,105,105,120,248,240, 33,108,109,109,223,154,102,173,234,142,152, 82,221,145,159,156,158,195,191,120,239,121,224,142,121, + 3,252,105,223, 1, 59,139, 14, 18,171,213,106,241, 47,161,176,119, 97,245,234,213, 91,239,218,181,139,175, 49, 64, 94,119,194, +237,213, 10,181, 81, 10, 0, 82, 17, 71, 17,188,202,251,139,111,190,249, 70,241,201, 39,159,248,198,198,198,174, 48, 35,214,191, +188,115,231,206, 95, 18, 66,120,211,167, 79, 7, 0,140, 26, 53, 42,231,206,157, 59,117, 1,164, 92,186,116,201,109,236,216,177, + 47, 46, 95,190, 44,153, 49, 99, 6,199, 96, 48, 60,229,114,185,228,228,201,147, 75, 1, 44,126,227, 23,145,166,131, 66, 66, 66, +106,184,121,122,195,211,158, 70,219,249,207,243, 31,112, 18, 6,113, 81,175, 16,254,232, 30, 92, 92, 92,172, 93, 93, 93,195,226, +226,226,116,241,241,241,115, 20, 10,197,214, 10,202, 24, 26, 28, 28,236,234,233,233,137,188,188, 60,196,165, 42, 49,237,168, 4, + 57,170,252, 32, 6, 15, 42, 52,170,238, 45, 23,211,218,123, 41, 41, 41, 58,173, 86,187, 32, 59, 59,123, 87,121,154, 60, 30, 47, +253,209,163, 71, 50, 15, 15, 15,168,213,106,146,145,145, 65, 41, 20, 10,228,230,230, 82,167, 78,157,250, 48, 49, 49,177,153,151, +151, 23,229,238,238,190, 52, 49, 49, 81, 21, 31, 31, 63,206,156,170,201, 2,195,100,228,114,185,107,199,143, 31, 63,248,183,223, +126, 11, 58,178,216,175, 95,145,234, 18,235,128,128,128,115, 13, 26,248,187,237, 93, 83,127, 35,128,213,255,128,107,107,204, 87, + 95,125,229,103,103,103,135,137, 19, 39, 98,201,146, 37, 88,184,112, 97,157,137, 19, 39,142, 7,176,222, 2, 29,177,139,139,203, +253,239,191,255,222,183,117,235,214, 56,125,250, 52,246,239,223,143,215,175, 95, 27,188,188,188,184,129,129,129, 88,180,104, 17, +186,119,239, 62,110,234,212,169,237, 19, 18, 18, 26,155,105, 62, 62, 89,180,104, 81,191, 54,109,218, 96,244,232,209,154, 43, 87, +174, 12, 6,112,254,194,133, 11,157,174, 94,189,122,228,215, 95,127, 21,127,251,237,183, 93,102,206,156, 57, 17,192,166, 74,236, +255,135,237,218,229,143,161,220,166, 77, 27,172, 90,181,170,123, 21,141,150,192,222,222,254,212,158, 61,123, 26,121,123,123, 99, +196,136, 17,141, 7, 15, 30,124, 42, 51, 51,179, 43, 0,179, 30, 72,213,170, 85,251,238,216,177, 99,181,203,170, 89, 40, 13,141, + 70, 99,247,209, 71, 31,173,140,138,138,178,200,104,237,219,183, 15,179,102,205, 66,195,134, 13, 27,180,104,209, 98,219,132, 9, + 19, 48,112,224,192,206, 79,159, 62,117, 70,126,175,229, 10, 17,137, 68, 13, 62,254,248, 99,193,221,187,119, 1, 0, 1, 1, 1, +104,212,168, 17,162,163,163, 17, 20, 20, 4,141, 70, 3,103,103,103,244,239,223, 95, 20, 21, 21,213, 32, 45, 45,173, 66,163, 69, + 11, 37, 99,250,245,238, 41, 63,126, 39, 17, 70,198,128,166,181,173, 16,232,235,132,103,113, 57, 8, 14,139,131, 81,203,135,149, +157, 61, 90,182,239,102,151, 20,255,122, 76, 58, 80,113,123, 45,161,100, 76,255,126,189,100,199,111, 39, 32, 43, 33,156,188,188, +247,219, 37,189, 90, 49, 14, 0,130,254, 56,176,205,197, 94,220,181,110,147,166,156, 14, 93,251,218, 30,221,159, 52, 38,243,239, + 25,219,239, 13,174, 86,199,118, 79, 94,218,168,217,195,218, 18,158,173,251, 61,185, 94,191,217,180,172, 59,208,109,206, 87, 95, +181,248,116,252,120, 17,195, 48,248,245,151, 95,114, 30,134,132, 60, 27, 15, 48, 19,202,208,219, 12,120, 14,238,215, 79, 40,183, +178,194,231,211,166, 65,174,215, 95, 46, 60, 36, 64,231,207,191,252,178,245,228,201,147,197,219,150,126, 22,212,125,236,178, 38, + 12, 33,148,169,154,114, 95,249,161,184,102, 99,251,245,131,220,202, 10,211,167, 79, 7,165,211,157, 43, 52, 80, 92, 92,254,228, +195,182,129,195,250,180, 1, 5, 10,251, 79,222,192,203,232,212, 71,151, 19,241,234,125,117, 85, 37, 40,179,141, 86,185, 85,135, +185, 58, 36,119,238, 53, 32,177,110,221,186,185,117,234,212,201, 77, 79, 79,199,227,199,143,145,153,153,137, 77,155, 54, 33, 60, + 60, 28, 12,195, 84,218,192, 48, 12,131,183,173, 9, 0,206,246, 86, 24,209,179, 57, 87,163, 86,136, 82, 83, 83,139, 85, 31,253, +139,140, 86, 33, 6,131, 65,228,229,229, 5, 26,160,178,149,122, 89,210,190,118, 84,210,190,118, 84,182, 82, 47,211,106,181,180, + 76, 38,131, 70,163, 17,153, 33,197,251,224,131, 15,190,252,237,183,223,120,203,151, 47, 71,189,122,245,160,211,233,112,231,206, +157, 56, 0, 41, 5,235, 36, 92,187,118, 45,193,100,132, 87,172, 88,129,163, 71,143, 82, 93,186,116,153, 83,218,245,148,152,152, +248,221,132, 9, 19, 50,148,185, 25,216, 62, 68,133, 35, 35, 82,241,115,191,215, 24,106,127, 24, 25,201, 49,216,177, 99, 7, 46, + 92,184, 72,157, 63,127,129,127,229,202, 21,105,175, 94,189, 54, 86,171, 86,237,100,121,133, 76, 72, 72, 88, 62,121,242,228,172, +220,220, 92,228,230,230, 66,165, 82, 35, 67, 1, 60, 90,231,135, 71,235,252,160,102,196,216,178,121, 43,253,232,209, 35,135,215, +175, 95,187,245,233,211,103,157,171,171,235,206,242, 52,227,227,227,239, 78,153, 50, 69,157,147,147, 3,173, 86,171, 51, 26,141, + 90,149, 74,165, 63,112,224,192, 12,123,123,251,150,167, 79,159,230, 93,184,112,145,123,229,202, 85,254,165, 75,151,172, 59,118, +236,120,208,217,217,121,183, 57,145, 50, 14,135,179, 97,239,222,189, 99,182,108,217,226, 28, 24, 24,232, 95,162, 42,202,181,107, +215,174, 53,126,249,229,151,106,171, 86,173,154,131,252, 14, 40,239, 20, 7, 7,135,169,253,250,245,195,150, 45, 91,112,226,196, +137,153, 27, 55,110,196, 7, 31,124, 0, 55, 55,183, 41, 48,191,218, 11, 0, 86,175, 95,191,222,215,215,215, 23,163, 70,141,210, +142, 27, 55,238,139, 93,187,118,121, 93,191,126,157,191,123,247,238, 26, 19, 39, 78,156, 62,108,216, 48,117,205,154, 53,177,105, +211,166,218, 52, 77,111, 48,235,254,118,118,158, 49,116,232, 80,172, 89,179, 6, 87,174, 92, 25,128,252, 31, 84, 45,128, 51, 55, +111,222,236,243,237,183,223, 98,192,128, 1,112,119,119,159, 94,153,200,147,159,159,223,130, 30, 61,122,224,250,245,235,104,220, +184, 49, 90,182,108, 57, 19,128, 67, 37, 15, 39, 45,147,201, 14,238,218,181,171,109,141, 26, 53,176,108,217, 50,212,170, 85, 11, + 59,119,238,108, 43,149, 74, 15,194,204,230, 27,214,214,214, 50,137, 68,130, 57,115,230,144, 1, 3, 6,100, 84, 52,205,156, 57, +147, 8,133, 66,216,218,218, 90,155,107,138, 69, 34, 81,171,122,245,234,225,206,157, 59,184,112,225, 2,230,207,159,143, 25, 51, +102, 32, 53, 53, 21, 31,127,252,177, 4,192, 64, 11,246,219,201,209,209, 17, 57, 57,249,227,194,215,171, 87, 15, 15, 30, 60, 64, +106,106, 42,220,221,221,145,148,148, 4,123,123,123,120,123,123,131, 97, 24, 39,243, 36, 73, 61, 7, 59,107,164,100,106,192,133, + 1, 77,234, 58,224,242,227,116,196,164,106,225,100,111,131,164,148, 84, 84,179, 23,161,122,117, 15, 16,194,212, 51,203, 1,115, +232, 38, 66,145, 24, 25,185, 58,196,135, 93, 73,215, 25, 53, 19,178, 34,111,198,102, 69,222,140,213,105,212, 19,130,110, 92, 72, +175,225, 44, 70,245,234,213, 65, 17,166,249,187,184, 31, 7,121,160,186, 84,204, 29,117,225,231, 5,212,201, 31,231, 81,154,244, +152,102, 61,156,243, 35,203,142,128,215,160,143, 63,110,245,197, 23, 95,136,146,147,147,153, 97, 67,134,100, 44, 95,188,248,226, +217, 10, 94, 12,242,128, 58, 93,187,118, 5, 13,224,236,249,243,138, 36, 32, 14, 0,156,129,234,125, 63,250,168,221, 87,115,231, +138,211,210,211,153, 59, 17,121,199,195, 83, 72,127, 59, 35,188,204,105,159,101, 4,234,155,116,207,157, 59, 71, 84, 64, 16, 0, +116,168,142, 41,221, 90, 7, 4,142,236,215, 14,137, 41,153,152,190,252,103,108, 59,116,245,156,181,158,116,250, 23,253, 20,143, +175,148,209, 42,168,250,121, 99,158, 82,249,102,237, 65, 85, 13,204, 95,161, 89, 26,255, 70,163,101, 66,175,207,175, 37,209,234, + 25,104,245,140,233,173, 22, 42,149,202,108,137,115,231,206,237,153, 54,109, 26,214,173, 91,135, 23, 47, 94,128,207,231,163, 94, +189,122,174, 0,100,166,103,126,147, 38, 77,156,104,154,198,179,103,207,176,118,237, 90,124,242,201, 39,228,214,173, 91, 59, 81, +122,190,148, 7, 25, 25, 25,155, 39,140,251, 36, 43, 51, 57, 6,122, 85, 38, 82,226, 95, 65,163,200,194,178, 21,223, 65,169,231, + 34, 41, 91,135,164,108, 29,104,161, 29,182,253,184,139,227,231,231,215,131,195,225,244, 46,167,156,119,146,147,147,127,156, 52, +105, 82, 86, 82, 82, 82,225,254,105,245, 4, 90,125,241,235, 85, 34,145, 96,195,134, 13,214,117,235,214,237,199,229,114, 59,150, +163,153, 24, 27, 27, 27, 62,105,210, 36,109,114,114, 50,178,179,179,113,252,248,241, 62, 53,106,212,176, 93,185,122, 29,165,208, +113,145,148,165, 67, 82,150, 14, 2,153, 19, 14, 30,249,141,227,237,237, 61,140,203,229,182,172,200,100,253,250,235,175, 35,135, + 12, 25, 34, 95,189,122,117,198,177, 99,199,182, 0, 40,122, 66,158,109,216,176,225,208,193,131, 7,115,191,252,242, 75,187, 85, +171, 86,205,124,199,102,171,227,144, 33, 67,124, 24,134,193,225,195,135, 31, 1, 88,255,219,111,191,221,215,104, 52,248,248,227, +143,189, 10,170,145,204,161,217,176, 97,195, 62,107,219,182, 45, 62,255,252,115,221,197,139, 23,155, 0, 88,135,252,170, 92, 2, + 32, 26,192,198,171, 87,175, 54,156, 58,117,170,166,121,243,230, 24, 61,122,244, 39, 0,218, 86,160,219,106,232,208,161,190, 12, +195,224,192,129, 3, 15, 1,156, 46,177,252,210,145, 35, 71,238,104,181, 90, 12, 31, 62,188, 38, 0, 75, 30,228,124,161, 80,120, +248,155,111,190,177,137,143,143,199,200,145, 35, 53,207,158, 61,195,226,197,139,197,214,214,214,167,139,220, 3,102, 35, 20, 10, +119,252,240,195, 15,253,234,215,175,143, 73,147, 38,105,183,110,221, 58,237,179,207, 62,211, 54,105,210, 4, 91,182,108,233, 39, + 16, 8, 44, 26, 90, 36, 33, 33, 33, 43, 44, 44,204,190,162, 41, 46, 46,206,220,238,249, 18,153, 76,118, 59, 32, 32, 32,167, 94, +189,122, 77, 13, 6, 3,158, 62,125,250,106,207,158, 61, 76,189,122,245,176,121,243,102,172, 90,181, 10,189,123,247, 6,135,195, + 49,219,104,113, 56, 28,232,116, 58, 72, 36, 18,112,185, 92,188,122,245,202,148, 90, 6,124, 62, 31, 0, 32,149, 74, 33, 22,139, + 65,211,180, 89,189,209, 40, 10, 36, 71,169, 7,143, 71,131, 75, 51, 8,143,206,134, 78,207, 64,196,231,128,199,165, 0,194,192, + 70,202,131, 72,192, 1, 77, 81,140,153,154,200, 86,232, 32,224,211,224,241, 5, 20,109, 48,138, 11,127, 28,185, 70,177, 88, 44, +160, 28,172,132, 16,241,255, 65,195, 2, 83,249, 13,203,199, 0, 60,169,135,199,224, 53,107,215, 10,114,242,242, 48, 96,192,128, +140,168,251,247,247,170,128,251,237, 43,232,164, 68,115,185,117, 59,180,111,143,224,144, 16,228,102,102,190, 4,242, 27,199, 11, +220,220,134,108,216,176, 65,160, 82,171, 49,160,127,255,172, 23, 55,110,252, 26,155,135,147, 7,162,243,141, 88,133,231,157,207, +119, 49,233,102,103,102,102, 2,249, 41, 36,156, 29,101, 43, 39, 15,235,142, 92,165, 26,179,191,219,203,132,132, 39, 78,185, 30, +135, 94,191, 37, 32,251, 95,246, 51, 60,190,196, 4,192,140,132,165,166,232, 82, 69,102, 69,163,209,188,117, 3, 84, 85,205,210, + 76, 98, 85, 53,255,137,112,185, 92,245,243,231,207, 5, 86,246,110,140,189,156,151, 89,227,147, 27,214, 0, 96, 39,227,102,235, +140,122, 38, 33, 33, 1, 66,161, 80,109,102,117,195,184, 29, 59,118, 44, 3,224,207,229,114, 79,238,218,181,139,218,187,119,175, +237,208,161, 67, 35,194,194,194,226, 3, 2, 2, 60,119,237,218,101, 5, 0, 27, 55,110, 36, 7, 15, 30,236,142,252,148, 25,101, +230,113, 73, 78, 78, 94,156,158,158,126,107,242,228,201,155, 4, 2,129,173, 84, 42,181,191,126,253, 58,165,214, 17, 52,251, 42, +186,176, 39,162,149,152,198,181,121, 86, 24, 63,126, 60, 39, 44, 44,108, 69,124,124,252,201,114, 52,231,100,101,101, 93,127,241, +226,197, 58,107,247, 70,142, 82,207,175,172, 3,231, 61, 3, 0,120, 58,240, 64, 23, 60, 23,179,178,178,144,154,154,138,207, 62, +251,204, 54, 34, 34, 98, 78,124,124,252,229,114,162, 90, 87,211,210,210,226,158, 60,121,210,129,199,227, 9,164, 82,105,179,219, +183,111, 83,106, 45,131, 6,115,162,145,145,151, 95, 78, 59, 25, 23, 65,223, 56, 99,202,148, 41,220,151, 47, 95,126,151,152,152, +216,166,212,135, 25, 77,175, 42,106,178,102,207,158, 29, 10,160, 38,128, 98, 85,163, 70,163,145, 26, 62,124,248, 99, 0,245,190, +252,242, 75, 59, 66,200,204, 57,115,230,100, 0,216,254,119, 95, 75, 86, 86, 86, 43, 39, 76,152,128,131, 7, 15, 34, 51, 51,115, + 3, 0,228,228,228,172,223,183,111,223,129,113,227,198,225,151, 95,126, 89,153,154,154,122, 22, 21,119,213,254,224,227,143, 63, +198,153, 51,103,240,199, 31,127, 44, 0,240,180,140,245, 94, 92,191,126,125,206,177, 99,199,190, 31, 58,116, 40,126,254,249,231, + 30, 0,202,107, 32,219,181,123,247,238, 56,125,250, 52,210,211,211,183,148,182, 66, 86, 86,214,214,227,199,143,183,232,222,189, + 59, 86,172, 88,209, 21,192, 37, 51,118,221,215,218,218,122,215,247,223,127,223,172,126,253,250, 24, 54,108,152, 90,167,211,245, +248,242,203, 47, 79,236,223,191, 95,190,103,207,158,166,227,199,143,191, 91,144,243,237,142, 89,161, 44,154,254,118,237,218,181, + 99, 59,116,232,128,153, 51,103, 26,206,157, 59,215, 23,192,249,179,103,207, 70,204,158, 61,251,212,218,181,107, 57,107,214,172, + 25, 59,125,250,244, 84,134, 97,222,149,185,254,102,227,198,141, 45,186,117,235,134, 87,175, 94,225,206,157, 59,208,233,116,191, +220,190,125,251, 90,157, 58,117,190,209,106,181, 39,164, 82,233, 40,185, 92, 30,208,168, 81,163, 78, 65, 65, 65, 18,152,215, 78, + 47, 57, 50, 50,210,198,218,218, 26, 6,131, 1,143, 30, 61,130,135,135, 7,116, 58, 29, 94,191,126,141,250,245,235,131,207,231, + 35, 57, 57, 25, 69,162,229, 21,152, 34,250, 81, 68, 84, 66, 77, 59,185, 20, 48,138,240,224, 89, 28, 28, 29,108, 97,164,104, 36, + 37, 37,162,145,143, 59, 40,138, 66, 86,122, 18, 40,138,122,108,142,166,145, 48,193, 49, 9, 41,213,236,229, 66,212,111,209,205, +254,246,217,212,189, 86, 53, 91,143,231,114, 40,142, 64, 40,219, 62,118,244,104, 7,134, 33,200, 74, 79, 6,151,166,239,189,139, + 19,116, 56, 6,177,237,107,137, 30,116, 27,187,172, 17, 69, 64, 84, 58,236,249, 57, 25,153, 18,160,209,198,175,191,182,177,119, +112,192,176, 97,195,152,244,248,248,139, 74, 51, 19, 43,215,172, 83,199, 89, 38,151,227,230,205,155,224,228,183,177,197, 78,192, +119,213,236,217,246, 78, 46, 46,248,100,236, 88, 38, 57, 38,230,146, 10, 72,176,164,172, 53,107,213,226,153,116,233, 2,221, 68, + 14,166,125,217,183,173, 80, 42, 22,226,219,109,191, 33, 54, 77,113,224,118, 34,182,253, 75,227, 29, 59,202,141,104,149,213,248, + 44,191, 81,181,164, 92,179, 34, 18,137, 10,163, 41, 22,188,233,189,117,205,138,248, 43, 52,223, 33,243, 0, 28, 3, 48, 47, 54, + 54, 54,124,236,216,177, 58,131, 78,147,123,107, 89,205,185, 33, 43,106, 76,186,189,216,117,210,239,211,172,231, 42,179, 51,114, + 55,110,220,168,143,141,141, 13, 47,186, 77, 5,218, 49, 0, 78,239,222,189,123,235,225,195,135, 81,175, 94, 61, 60,125,250,212, + 73,161, 80, 52,126,252,248,177,157,175,175, 47,246,238,221,139,131, 7, 15,174, 3,112,161, 60,147,101,194, 96, 48, 92, 76, 74, + 74,242,142,142,142,174,109, 99, 99,163,183,177,177, 65,201,158,136, 57, 42, 6,233, 89,217,176,179,179,135,149,149,149,151, 25, +230,252,116, 82, 82, 82, 93,198,214,167, 93,221,180, 13,217,193,223, 86, 71,240,183,213,113,122,142, 27, 92,109, 4,200,204,204, + 68,106,106, 42, 82, 83, 83, 65, 81, 20,244,122,189,159, 25,154,175, 19, 19, 19,127,138,137,137, 57,230,236,236, 12,185, 92, 14, + 2, 32, 41, 75,143,208, 53,190, 8, 93,227,139,164, 44, 61,114,114,115, 81,163, 70, 13,200,229,242,178,170, 40,232,106,213,170, +245, 28, 50,100,136, 28, 0, 10, 12, 84,103, 66,200,164, 82,166,137, 6,131,161,181,105,221, 89,179,102,217, 1,232,254, 55, 95, + 79, 28, 0,147,199,141, 27,215, 84, 36, 18, 97,243,230,205,175, 1,252,106,122,214,111,221,186,245, 25, 0, 76,155, 54, 45, 0, +192, 76,148,145, 9,186, 48, 52,196,231, 55,241,243,243,195,237,219,183, 1,224,183, 10,190,251,200,173, 91,183, 80,167, 78, 29, +136, 68,162,102, 21,172,235, 85,189,122,117, 60,123,246, 12, 0, 30,148,177,206,131,103,207,158,229, 87,247, 80,148,151, 25,251, +222,175, 91,183,110,143, 46, 95,190,220,172, 85,171, 86, 24, 59,118,172,246,238,221,187, 61, 1, 92,123,240,224, 65,199,225,195, +135, 43,234,214,173,139,171, 87,175,250, 14, 31, 62,252, 22, 77,211,203,204,208,252,100,233,210,165,243, 62,252,240, 67, 44, 93, +186,148, 28, 58,116,104, 24,128,243, 5,203,206, 29, 56,112, 96,228,242,229,203, 73,255,254,253,177,100,201,146,121, 0, 38,149, + 39,166, 80, 40,178,141, 70, 35, 20, 10,133, 89, 33,121,115,215,119,112,112,248,160, 91,183,110,152, 63,127, 62,170, 85,171,134, + 19, 39, 78, 16, 0, 39, 1, 92,215,106,181,237, 0,172, 85, 40, 20,191,223,190,125, 27, 93,187,118,229,163,248, 16, 35,229,125, +255,163,125,251,246,105,172,173,173,225,233,233,137,154, 53,107, 34, 41, 41, 9, 81, 81, 81,168, 95,191, 62,154, 52,105, 2,131, +193,128,159,126,250, 73,157,155,155,107, 86, 78, 62,131, 86,177,231,194,169,163,217,246,114, 33,220,157,172, 81,163,154, 29,242, +178,210,144,154,148,128, 38,126, 30,104,223,164, 6,210,178,181, 56,119,242,104,102,110,174,114,143, 89, 33,124,141,114,215,197, +179, 39,178,109,229,124,120,251, 4, 96,248,216,105,141, 26, 53, 14,188,208,188,121,235,115,171, 87,126,219,160,115, 75, 63, 42, + 46, 77,141, 51, 39,127,203,204,206,201,217,245, 46, 30,244, 75, 0,142,218,186,238,181, 45,199,130,127,242,239, 49,238,167,240, + 56,108, 0, 0, 61,135,227,219,243,131, 15, 16, 23, 23,135,163,135, 15, 39, 42,129,135,230,234,137,197, 98, 26, 0,178,179,179, + 33, 44,104,119,103, 0,124,122,245,234,133,212,180, 52,236,251,245,215,212, 51, 64,136, 37,229,236, 3, 8, 36,226,252,128, 96, +118,118, 54, 40, 32, 7, 0, 40, 46,122, 54,175, 87, 7,169, 25, 57,184,124, 47, 60,175,134, 10,159,149,167,243, 30, 55,132,175, + 92, 27, 45, 0,105, 51,103,206,132, 80, 40,132,171,171,107,161, 57, 50,153, 21,129, 64, 0, 87, 87, 87, 24, 12, 6, 28, 56,112, + 0, 0,210,202,125,195, 3, 52,125, 39,173, 96, 52,122,162,228,241,120,111, 69,179,224,205, 81, 51, 96,246,207,204,217, 91,165, +119,138,169,140,230,123, 64,243,130,156, 88,205, 1,100, 70, 69, 69,197, 13, 30,208, 55, 59, 58,226, 73,146, 34, 43, 33, 49, 39, + 61, 54, 49,246,245,227,164,175,230,204,204,142,139,139,139, 69,126, 46,173,230, 9, 9, 9,166,109,204, 97,230,224,193,131,127, + 24, 55,110, 28, 9, 13, 13, 5, 0, 4, 7, 7, 99,244,232,209,100,228,200,145, 27, 0,204,173, 68,185, 21, 42,149,170, 88, 52, + 68,103,100, 10,171,252,114,114,114,144,144,144, 0,173, 86,107,182, 35,126,113,110,205,243,140,168, 32,125,128,167, 20, 1,158, + 82,248, 86,151,128, 50,228, 21,154,172,212,212, 84,211,155,179,218,130,114,230,104, 52,154, 98,229, 44, 90, 53,153,147,147,131, +164,164, 36, 24,141,198,178,126,200,152,248,248,248,115, 7, 15, 30,204, 5,128,213,171, 87,103, 80, 20,245, 7, 69, 81, 63,148, + 50,109,227,114,185, 55, 77,235,174, 89,179, 38, 3,111, 86,137,253,149,124, 88,191,126,253,204,121,243,230,109,158, 62,125, 58, +182,109,219,134,196,196,196,185,248, 51, 23, 15,147,150,150, 54,123,203,150, 45, 24, 51,102, 12, 22, 46, 92,184,166,113,227,198, + 57, 0,134,151, 37,232,232,232,232,206,229,114, 17, 18, 18,146, 3,224, 85, 5,223,159, 20, 18, 18,146, 76, 81, 20, 92, 93, 93, +107,149,183,162,157,157, 93,109,185, 92,142,248,248,120,160,224,141,185, 20,162, 18, 18, 18,136, 64, 32,128,155,155, 91,157,138, +118,222,214,214,118,246, 79, 63,253,196,125,242,228, 9, 58,119,238, 28,119,245,234,213,174, 0, 76, 93,210, 67,130,131,131,219, +118,236,216,241,249,133, 11, 23,240,221,119,223, 81, 13, 27, 54,156, 84,145,166,167,167,231,196, 79, 62,249, 4,155, 54,109,194, +246,237,219, 39, 1, 56, 92, 98,149,253, 91,182,108,153,182,125,251,118,140, 29, 59, 22, 94, 94, 94,195,203,211,139,142,142,158, +211,161, 67,135,224, 23, 47, 94,152, 53,226,129,153,235,119, 12, 12, 12,172,173, 82,169,176,107,215,174, 87,181,107,215,190,127, +248,240,225,153,120,243, 7,251,247,163, 71,143, 98,196,136, 17,104,216,176,225, 46, 0, 67,205,185, 45,195,194,194, 98, 47, 93, +186,196,240,249,124,120,122,122,162,119,239,222, 24, 54,108, 24, 26, 52,104, 0,157, 78,135,163, 71,143, 50,143, 31, 63,142,211, +106,181,102,229, 82, 74,127,113,229, 68,100,228,243,155, 33,119,175,233,185, 28, 26, 30,174,118,248,168, 75, 35,124, 58,176, 53, +154,248, 86, 67,116,138, 10,151, 46, 93,208, 71, 70,190,186,109, 78,143, 67,147,102,248,211,135,183,158,132,220, 48,240,184, 20, +124,125,234, 98,254, 87,179,109,151, 47,154, 99, 83,183,150, 7, 30,190,206,198,133,243,103,244, 9,113,177,151,223, 85,143,195, +171, 0, 95, 38,164,164, 28,154,134,145, 22, 42, 56, 5, 29,105,234,249,251,123, 59,187,184,224,212,169, 83,160, 45,232, 17,122, + 21,224,203,100,249,181,224,121,121,121, 48,233,213,246,241,241,241,240,244,196,233, 83,167,192, 97,152,176,246, 22, 38, 24,125, +150, 95, 13, 93,168, 75, 1,234,207,170, 67, 94,187,186,147,143,173,181, 20,119, 31,190,132, 70, 79,238,253,154,137,119,154,143, +236, 47,100, 60, 42, 89,117,184,122,219,182,109,205,127,250,233,167,174, 51,103,206,148,141, 26, 53, 10, 34,145, 8, 74,165, 18, +238,238,238, 48, 26,141, 56,123,246, 44,130,130,130,242, 24,134,185,128, 55,211, 6,116, 65,145, 94, 26,231, 94, 65,156,239,183, +148,205,143, 13, 26,244, 86, 52, 1, 64,246,146,177, 74,175,161,221,187,241,240,141,254,251,206,133, 80,159, 15,109, 79, 55,241, +169, 14, 0,112,118,118,134,149,149,149,197,154,111,129,191, 92,179,104,181,110, 82, 82,210,179,164,164,164,148,113,227,198,249, +154, 26,190, 11,133, 66,117, 65, 36, 43,179,180,109,204, 40,167, 14,192,103, 63,253,244,211,241,236,236,236,115, 95,126,249, 37, +150, 47, 95,142, 19, 39, 78,180, 5,112,179,146,251,110,204,204,204,204,186,119,239,158,115, 29,191,198,168,233,196, 67,187, 5, + 47, 64, 8,129,189,132, 32, 55, 43, 3, 15, 30,132, 32, 55, 55,247,174, 37,229,212,233,116, 89, 41, 41, 41, 14, 78, 78, 78,200, +200,200, 64, 90, 90, 90,161,201,202,204,204, 68, 70, 70, 6,161,168, 55,114,182,148,167,169, 72, 73, 73, 81,134,135,135, 11,156, +171,215, 65, 45, 39, 62, 2,191,122, 6, 16, 2, 15, 59, 26,185, 57, 89,184,125,251, 54,178,179,179,175,148,165,201, 48,204, 23, +195,135, 15,231, 0, 24,249,229,151, 95,218, 1,104, 56,123,246,236, 11, 40,209,179,144,203,229,174,223,187,119,111, 61, 83, 21, +227,156, 57,115,214, 1,248,233,239,186,150,236,237,237,191, 56,117,234,148, 92,167,211, 97,227,198,141, 88,183,110,221, 78,188, +153,168,242,212,230,205,155,183,208, 52, 61,121,202,148, 41,152, 48, 97,130,164,105,211,166, 51, 19, 19, 19,127, 45, 77, 51, 62, + 62,126,126,147, 38, 77, 22,166,164,164,124,107,150, 89,126,241, 98,124,147, 38, 77,230,167,164,164,172, 42,239, 28, 73,165, 82, +169,209,104, 68,100,100,100, 38, 80,102,251, 14,117,100,100,100,188,209,104,116,151, 72, 36,118, 21, 93,159,153,153,153,223, 54, +109,218,116,113,114,114,242,121, 0,203, 74, 49,228,161,137,137,137, 1,211,167, 79,159,186,114,229,202,254, 73, 73, 73, 7, 42, +210,140,142,142,254,182, 99,199,142, 11,158, 63,127,190, 27,101, 87, 1,111, 94,178,100,137,110,239,222,189,147, 34, 35, 35, 87, + 84,160,121, 50, 45, 45,237,164, 5,231,183,172,245, 11, 53, 57, 28,206,236,149, 43, 87,210,219,182,109, 3, 33,100,141,209,104, + 44,171,156, 15,127,255,253,247, 61,173, 91,183, 30,117,248,240, 97, 81, 64, 64,192, 4,141, 70,179,191,162,235, 83,169, 84, 30, + 61,124,248,112,255,135, 15, 31,186,143, 26, 53, 74,228,237,237, 13,157, 78,135,196,196, 68,108,219,182, 77,253,248,241,227,184, +172,172,172,163,150, 60, 67, 12,218,156,161,183, 46, 29,219, 31,245,226,113,203, 14, 61,250,217,106,117,238, 16,166,115,144,149, +158,132,179, 39,143,102, 70, 70,190,186,173, 84,102, 13,181, 68, 83,167,201,254,248,246,229,227, 7,226, 34,195, 91,180,235,216, +211, 86,173,245,132,144, 79, 35, 61, 57, 30,103, 79, 29,203,136,140,124,125, 93,173,215,140,126, 87,207,121,142, 23,150,113,146, +130,198, 77,236,211, 8, 98, 91,247, 7, 60, 96, 99,107, 64,236,224,236,204, 47,184,119, 32,203,111,243,104,150,102, 50, 32,168, + 83, 80, 75,165, 84, 42,193, 3,180, 99, 0,158,163,163,163, 24, 0,158, 63,127, 14, 73,126,173,134, 69,229,204, 3,164,146, 34, +186, 52,160, 76,231,162, 90,109, 43, 41, 5, 0,113, 73,233,208,234,203,253,221,120,223,217, 81,196,112,237,168,140, 0, 31, 64, + 23,153, 76,182,124,225,194,133,107,238,222,189,187,166,119,239,222,107,132, 66,225,242,130,131,205, 47,231, 68,252,109,154,205, +220, 96,215,177, 22,117,173, 91,109,138,153,216,214,214, 56, 58, 80,170,237,212,169,211,150, 42,150,179, 42, 55,203, 95,169,121, + 76,175,215, 19,228, 87,219, 29, 67,217, 85,130,243,138, 44, 79,138,137,137, 33, 5,127, 91, 82, 78,135, 33, 67,134, 48,185,185, +185,100,240,224,193, 4, 21, 15,225, 83,174,166, 80, 40,236,216,174, 93, 59,125,114,106, 6,121,246, 58,158,220, 9,126, 74,206, + 93,186, 69, 14, 28, 61, 69, 54,109,217, 78, 26, 52,104,160, 5,224,105,137, 38,151,203,237,212,177, 99,199,244,228,228,100, 18, + 30, 30, 78,174, 93,187, 70,142, 28, 57, 66,182,111,223, 78,126,248,225, 7, 82,189,122,245,100, 0,206,150,104,138,197,226,126, + 31,124,240,129, 62, 43, 71, 73, 34,227,211,201,163,240, 72,114,243,222, 35,114,246,210, 77,242,235,254,195,196,223,223, 95,109, +134, 38,135,195,225,108, 58,112,224, 64, 14, 33,132,244,235,215, 47, 14,197, 19,169,214,252,226,139, 47, 82, 8, 33,100,213,170, + 85,233, 40,189, 33,252, 95,125, 45,245,168, 86,173,218, 51, 62,159,127, 10,192,200, 10,182,251,152,203,229,158,112,113,113,185, + 15,224,163,119,112, 31,245,118,114,114,186, 3,160,162, 17, 14, 76,235,125,248, 47,185,223,255, 10,205, 78, 92, 46,247, 26, 80, +254, 32,194, 69,158,215,223,112, 56,156,211, 0, 58, 91, 88,206,186, 14, 14, 14,131,109,109,109, 63,183,181,181,253,220,201,201, +105,176, 64, 32,168, 91,149,125,183,175,219,165,143, 71,227,190,191, 87,111,216, 43,218,163, 81,239,104,175, 38,253,126,183,175, +219,165, 79, 85, 53, 61,155,244, 59,230,209,168,119,140, 71,163, 62, 81, 53,155,245,251,221,193,167,203, 7,239,242, 28,141,172, + 6,183,174, 53, 97, 32,215, 22, 16,114,109, 1,233, 82, 19, 76, 75, 27,248, 55, 7,228,221,187,116, 89, 75,140,198,181,253, 63, +252,112,109, 29,192,158, 0,156,146, 83,105,154,141, 1,171,194,109,251,245, 91, 91, 11,112,232, 10, 72,218,183,109,187,134, 24, +141,107,135,127,252,241, 90, 15,192,165, 52,189,178, 52, 9,192,169, 6,184, 21,213,117, 0,106, 15,244, 66,192,188, 62, 94,132, + 92, 91, 64,150, 12,242, 38, 77,156, 49,178, 2,205,178, 34, 69,239,109, 68,171,180,182,226, 21, 33, 45,120,184,174, 40,248,148, +190,133,139,240,173,107,182,112,133,119,151,218, 84,120, 79, 31,110, 6,242,187, 36, 75,255,133, 15,201,221, 90,173,150,168,213, +106,162, 84, 42, 73, 94, 94, 94, 73, 3, 85,104,200, 18, 18, 18, 72, 92, 92, 28,137,137,137, 33, 81, 81, 81, 4,127,182,189, 49, +187,156, 86, 86, 86, 63, 13, 26, 52,200,200,227,241, 54,189,141,125,183,179,179, 91, 17, 24, 24,168,251,254,251,239,201,239,191, +255, 78,126,252,241, 71, 50,101,202, 20, 82,175, 94, 61,141,141,141,205,208,202,104,186,184,184,204,247,241,241, 73,223,185,115, + 39,249,245,215, 95,201,134, 13, 27,200,215, 95,127,109,116,119,119, 79,146,203,229,221, 43,163,233,228,228,180,163, 77,155, 54, +186, 29, 59,118,144, 11, 23, 46,144,125,251,246,145, 47,190,248,130,248,250,250,106,164, 82,233, 0, 51, 53, 57, 92, 46,119,237, +196,137, 19,147,220,220,220, 78,149, 88, 38,241,247,247,191, 63,124,248,240, 4, 0,115,254, 69,215, 39,171,201,106,178,154,127, +129,209, 26,230,134,106, 4,224, 72,248,252,143,219,183,109,187,134, 15,124,108,169, 41, 18,113, 56, 3, 91, 7, 6,174,225, 3, + 67, 77,235,138, 56,156,129,237,219,182, 93,195,227,112, 70,148,165, 87,158, 38, 1, 56,124, 46,119, 78,235,150, 45,215,114,129, +175, 76,243, 58,213,164,194,190,232, 81,157,180,245,164, 94,142,112,130,228, 95,108,180, 74,165, 50, 70,171, 48,128,240, 23, 92, +132,239,139,230, 63,229,166,174, 83, 96,152,142, 89, 16,209, 58,134,252, 81,212,235, 84,178,156,226,183,188,239,245, 29, 28, 28, +206,212,169, 83, 39,181, 70,141, 26, 9,182,182,182,251, 1,184, 87, 81, 51,192,197,197,229, 23,103,103,231, 23,174,174,174, 15, + 29, 28, 28,214, 35, 63,235,124,165, 53,121, 60, 94,160,179,179,243, 21, 47, 47,175, 44, 79, 79,207,100, 7, 7,135, 3,165, 68, +178,204,209,116, 69,233, 15, 21,126,193, 50,246, 71,135,213,100, 53, 89,205, 98, 6,166, 91, 45,172,236, 90, 19,134,174, 53, 97, +236,230,133,245, 69, 13, 74,111, 64, 92, 89, 83, 52, 26, 16,150, 92,191, 34,189,138, 52, 9,192,105, 5,200, 74,110,211,211, 29, +254,102,106,190,239, 17, 45,211,115,190, 88, 68,139, 91, 73, 65,195, 95, 80,200,247, 69,243,159,194, 75,148,211, 24,185, 8, 43, +222,226,119,170,222,242, 62, 60, 74, 75, 75,251, 32, 45,237,173,246, 77,120,146,148,148, 52,242,109, 10,234,245,250,187,201,201, +201, 29,222,130, 84, 89, 93,175,117, 48,179, 91, 54, 11, 11,203,127, 7, 10, 48,226, 21,230,118,169,139,141, 92, 35,232,179,175, + 17, 95,162, 75,158,138,170,140,102, 62,198,221,165, 60,227,169,202,150,243, 79,242,222,208,136,195, 83,234,191,115,218, 18,145, +223, 70,203,252, 60, 90, 44, 44, 44, 44, 44, 44, 44,239,142,139, 47,216, 23,177,247,128, 83, 40, 30,125, 59, 85,196,136,150, 25, +250,180,164, 39, 69,101,194,167, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,207,105,154, 40,107,236,212,103, 37,254, +175, 84, 47,190,127, 2, 85,105,163,245, 87, 26, 48, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53,255,123,154,239, 51,101,246, + 58,100,171, 14, 89, 88, 88, 88, 88, 88, 88, 88,170, 70,153, 81, 55,214,104,177,176,176,176,176,176,176,176, 84, 13, 87,228, 15, + 81,117, 10,127, 14, 85,181,131, 53, 90, 44, 44, 44, 44, 44, 44, 44, 44, 85,167, 23,254,236,109, 88, 44,186, 69,179,199,134,133, +133,133,133,133,133,133,165,202,140, 47,242,201,166,119, 96, 97, 97, 97, 97, 97, 97, 97,121, 75,152,215, 51,242,228,201,147,132, + 61, 86, 44, 44, 44, 44, 44, 44, 44,239,138,247,212,139,152,162, 88,197, 70,249, 96,123, 29,178,176,176,176,176,176,176,176, 84, +157, 29, 69, 12, 87,177,121,172,209, 98, 97, 97, 97, 97, 97, 97, 97,169, 26, 38,131,117, 10, 37,134, 84,163, 1,182,202,144,133, +133,133,133,133,133,229,221,242,158,123,145, 29, 5,211, 27,195, 37,153,122, 29,118, 40,216,193, 14,236,169,102, 97, 97, 97, 97, + 97, 97,121, 7,188,207, 94,196, 21,165,180,209, 98, 97, 97, 97, 97, 97, 97, 97, 97,169, 58,227, 75,124, 2,200,111, 12, 79,177, +199,134,133,133,133,133,133,133,133,229,173, 24,173,162,236,248, 59, 6,149,102, 97, 97, 97, 97, 97, 97, 97,249, 79, 66, 8,249, +203, 51,195,179, 35,155,179,154,172, 38,171,201,106,178,154,172, 38,171,249, 95, 96, 60, 74,100,133, 7,216,244, 14, 44, 44, 44, + 44, 44, 44, 44, 44,111,195,100,237, 40,237,127,118,172, 67, 22, 22, 22, 22, 22, 22, 22,150,191, 8, 54,162,197,194,194,194,194, +194,194,194, 82, 53,118,160,148,172,240,172,209, 98, 97, 97, 97, 97, 97, 97, 97,121,123,102,235, 13,216,170, 67, 22, 22, 22, 22, + 22, 22, 22,150,170, 49,190,172,255, 41,148,221,115,224,162, 5, 95, 80,153,222, 7, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86, +147,213,252,207,105, 86,164,125, 17,239, 31,165, 54,134,255, 59,242,104,177, 93, 95, 89, 77, 86,147,213,100, 53, 89, 77, 86,147, +213,252,183, 99, 26,130,199, 52,185, 2,249,121,180,216, 54, 90, 44, 44,239, 57,228, 48, 56,200,244,241, 2, 33,110,224, 8, 18, +145,248,232, 21,181, 24, 76,149, 53,147,253, 61, 33,214, 59,195, 32, 74, 69,242,195,215, 85,213,100, 97, 97, 97,249, 23,147,136, + 50,218,104,177, 70,139,133,229,125, 39,213,215, 27, 92,172, 0, 13, 87, 16, 93, 4, 28,253, 87, 0, 79, 31, 87, 89,147,207, 44, +131,145,118, 7,209, 61,135,147,207, 74,224,217, 83,246, 96,179,176,176,176, 88,198,223,222, 24,158,199,227, 37, 3, 96, 68, 34, +209, 81,176,163, 92,179,252,181,184, 22, 92,103, 76,193,117,103, 9, 50, 46,151,187, 80, 34,145, 92, 22, 10,133, 41, 66,161, 48, + 69, 42,149, 94,230,114,185, 11, 1,200,254, 41, 59, 72,126,169, 39, 1,109,252, 64,171,103,170,157,125,148,229,164,212, 24,189, + 65, 27,122,146,157,117,101, 85,210,228, 82,221,212, 58,198,227,215,123, 74,103,133,214,224, 7,130, 42,105, 22,193,134,207,231, +159, 5,224,192, 94,158,255, 78,252,128,166, 77,185,220, 89,190, 64, 39,128, 29, 79,151,133,229,111, 55, 90,122,189,222, 41, 45, + 45,141,218,179,103, 79, 95,107,107,235, 8, 46,151, 59, 15, 0,255,191,114,192,101, 50,217, 45, 43, 43,171,100,107,107,235,100, + 43, 43,171,144,138,230,255, 75,241,118,116,116,140,182,179,179,123, 94,116,166, 99,131,143, 90,213,105, 61,114,145,189,127,191, +246, 85,212,231,115,185,220,121,214,214,214, 17,123,246,236,233, 27, 31, 31, 79,233,245,122, 39, 11,182,111,103,107,107, 27,118, +247,238,221, 5,105,105,105,237, 99,239,236,116, 76,186,187,221, 49,250,202,218, 14, 65,167, 55, 45,176,177,177,126, 10,160,221, + 63,226, 72,170, 25,103,208,156,142, 79, 18,149,146,196, 28,189,115,112,148, 82, 14,112, 58, 64, 91,133,151,152,108,198, 25, 32, +157, 66,227, 84,210, 91, 25,142,206,215, 95,105,172, 64,211, 29,161,166, 92,170,252,192,161,233, 73, 12,195,116,229,243,249,159, +179,143,223,127, 39, 2,154,110,125,171,111,223,101,115, 26, 52,152,234, 11,244, 41,195,108, 81, 0,166,249,250,250,158, 1,240, +241, 91,252,250,239,124,124,124,226, 1, 76,103,207, 4,203,223, 76, 99,211, 11, 62,138,180,209,178,200,104, 13,244, 66,235,161, + 53,113,117,176, 23,114,135,212, 68,222,136,154,184, 49,192, 11,157, 42, 83, 26,123,123,123,180,107,215,142, 19, 31, 31, 47,254, +226,139, 47, 22,137, 68,162, 72, 0,221, 43,163, 37, 22,139,131, 36, 18, 73, 44,151,203, 45, 86, 22,137, 68, 18, 36,149, 74, 99, +185, 92,110,231,162,243,229,114,249, 45, 43, 43,171,100,185, 92, 30, 82,134, 17, 10,178,178,178, 74,150,201,100, 65, 69,231,115, +185,220,206, 50,153, 44, 78, 46,151,151,156,223, 73, 46,151,199,150,156, 95, 22, 60, 30,207, 61, 54, 54,214, 41, 46, 46,206, 73, + 32, 16, 56, 23,157, 31, 19, 19,227, 20, 27, 27, 91,108,190, 37,112,185,220, 78, 82,169, 52, 86, 34,145, 4,149, 54,191,228, 62, +149, 69,145, 99,215,201,156,249,150,154,172,110,221,186,221, 72, 76, 76,244,176,177,177,177, 41,186,192,206,218,166,251, 47, 59, +183,204,236,215,179,219, 36, 71,191, 15,235, 87, 82,191,187, 72, 36,138,252,226,139, 47, 22,197,199,199,139, 91,182,108,201,161, +105,139,222, 39,186,244,235,215,239, 88,114,114,114,181,134, 13, 27,114, 12, 6, 3,158, 28, 95, 8,201,195,207, 33,138,220,134, +234,226, 84,110,196,133,149,238,221, 58, 52, 61,134,119,220, 24,148, 28,246,227,131, 98,218, 49,132, 56,134,197,171, 29,123,245, + 29,196,125, 16,171,114,212, 27,141,118, 0,167, 3,217,229, 41,172,148, 38, 87,223,150, 33,196,249,143, 40,158, 99,199,193, 83, + 57,151,162,184,142,122,163,209, 30, 52,218, 87, 70,179,232,229,207,225,112,102,174, 93,187,150, 6, 48, 5,128,224,191,244, 20, +110,238,134,106,157,106,115,238, 53,118, 69,235,183, 40, 27, 80,112,191,123,255, 83,246, 83,203, 48,207, 14,188,126,125,110, 68, +237,218,189,231, 52,104, 48,166, 20,179, 69, 1,152,179,114,229,202,145, 79,158, 60,113,172, 89,179,230,132,183,244,210,191, 97, +229,202,149,179,159, 60,121,226,230,229,229,181, 4,108,250,162,127, 21,132, 16, 1, 33,164, 35, 33,164, 23, 33,164, 51, 33,164, +121,193,223,205, 10,166, 94,132,144, 46, 37, 62,155, 21,108,107, 90, 30, 88,134, 70,175,146,219, 21,217,166,228,255,197,254, 46, +197,104,245, 66,126, 91,173, 94,197,118,224,228,201,147,164,232,103, 73,134,120, 97,241,212, 86,213,148, 97, 39,246,145,188,216, +215, 36, 51,252, 1,121,176,227, 91, 50,181,153,163,114, 88, 77,124,103,249,241, 34,228,230,205,155,228,201,147, 39, 36, 47, 47, +143,188,120,241,130, 4, 6, 6,170, 36, 18,201, 31, 0,188, 44, 17,147,203,229,201,127,252,241, 7,233,214,173, 91,182, 76, 38, + 91, 99,186,185,172,172,172,146,111,222,188, 73,186,117,235,150, 45,151,203, 55, 0,224, 0,192,128, 1, 3, 82, 8, 33,196,209, +209, 49,161, 52,189,126,253,250,101, 18, 66,136,181,181,181,169,170,137, 35,151,203, 55, 76,158, 60, 57,239,254,253,251,196,214, +214,214, 52,159,182,178,178, 90, 51,101,202,148,188,224,224,224,162,243,203,197,206,206, 46,214,104, 52,146, 19, 39, 78, 16, 39, + 39,167,194, 50,216,218,218,198, 26,141, 70,114,236,216,177, 50,203, 86, 94,160, 64, 38,147,173, 30, 49, 98, 68,110, 84, 84, 20, +177,183,183, 79, 46, 50,127,205,168, 81,163,114, 99, 98, 98,136,131,131,131, 89,101,180,183,183, 79,190,117,235, 22,233,223,191, +127, 78,209, 99,106,111,111,159,124,251,246,109,211,252,213,230, 60,200,220,220,220, 38, 56, 57, 57, 37, 56, 57, 57, 37,216,216, +216, 44,119,117,117, 77, 74, 77, 77, 37,132, 16, 82,171, 86,173,148,162,145, 44,167,128,190, 51,182, 29,190,125,247,218,227,244, +212, 6, 93, 39,173,182,110,208,207,218,130, 99,224, 37,145, 72,254,104,223,190,189, 42, 54, 54,150, 40, 20, 10,242,240,225, 67, +114,243,230, 77,242,242,229, 75, 2,192,156, 62,182,114,153, 76, 22,175,209,104, 24,141, 70,195,164,166,166, 26, 83, 82, 82,140, +225,107, 92, 9,249,153, 87, 56,101, 29,235, 67,146,174,173, 96,172,100,146, 56, 0,242,119,246,224,217,226,239, 78,182,251, 28, +120,186,208, 35,252,218,202, 30,122, 18,117,137,236, 27,227,168,191, 58,163, 90, 4,249,193,247,127,100,187, 95,245, 74,105,254, +224,183,239,225,215, 30,207, 54, 45,153,166,143,142,142, 38,179, 70,245, 48,156,159, 90,237, 21,217,230,123,184, 50,154, 69, 24, +250,209, 71, 31,229,197,196,196, 16,127,127,127, 5,135,195, 25,251, 95, 50, 89, 93,188, 5,241, 15,127,157,197,244, 9,144,164, +191, 37,179, 21,224,228,228,148,182,123,247,110, 34,151,203, 83,254, 65,102,139,242, 5,250,238,105,208,224, 24, 51,112,160,113, + 79,131, 6,199,124,129,190, 5, 6,139, 2, 48,119,213,170, 85,193,122,189, 62,120,215,174, 93,193,125,251,246, 13, 6, 48,171, +138,223,249,253,119,223,125, 71,244,122, 61,217,181,107, 23,233,219,183, 47, 1,176,209,220,141,101, 50, 89,157,250,245,235,239, +245,247,247,143,105,216,176,161,214,207,207, 79,237,237,237, 29, 21, 16, 16,176, 91, 40, 20,122,129,229,111,161, 60, 47, 66, 8, +105, 62,119,238,220,121, 0,200,220,185,115,231, 17, 66,122, 21,248,137, 94, 69,255, 46,249,105, 50, 79,166,255, 75,211, 48, 77, +165,105,150,246, 29, 37,190, 7,101, 68,178,198, 23,148,251,207,157, 59,121,242,100,251,147, 39, 79, 94, 45,185,115,131,106,162, +213,212, 86,213, 84,170,212, 68,242,248,219,207,201,229,142,238,228,102, 7, 23,242,124,230, 71, 36,241,215, 13,228,179, 70,182, +202,129, 53,209,209, 82,163, 21, 28, 28, 76,130,131,131, 73, 72, 72, 8,137,140,140, 36,217,217,217,228,224,193,131, 70,123,123, +123,149, 80, 40, 92, 9, 64,108,142,152,149,149, 85, 50, 33,132,104, 52, 26,178,124,249,114,117, 65,164,202,217,218,218, 58,153, + 16, 66,178,178,178,200,202,149, 43,213,214,214,214, 15, 1,184, 57, 56, 56,196,190,126,253,154, 56, 59, 59,151,106,102,108,109, +109,147,159, 61,123,102, 50, 78,213,108,109,109, 31, 31, 63,126, 92, 71, 8, 33,113,113,113,196,206,206, 46, 25,128,179,189,189, +253,131,147, 39, 79,234, 8, 33, 36, 33, 33,193, 52,223, 44,163,165, 82,169,200,249,243,231,139,149,193, 52,255,204,153, 51,197, + 12,152, 25, 56, 91, 91, 91, 7, 31, 60,120, 80,107, 52, 26,201,227,199,143, 77, 38,209,217,198,198, 38,228,240,225,195, 90,163, +209, 72,194,195,195,205, 54,131, 53,106,212, 72, 33,132, 16,131,193, 64,182,109,219,166, 49, 29, 83,211,124,173, 86, 75,182,110, +221,170,177,178,178, 10, 6, 80,110,244,205,193,193, 33, 65,171,213,146,172,172, 44, 18, 24, 24,152,119,243,230, 77,146,147,147, + 67, 8, 33,164, 70,141, 26, 41, 0,224,211,126,236, 55,119, 95,228,229,124, 50,123,203, 33,175,230,195,190, 61,119, 47, 62,238, +167,223,131,130, 29, 2,250,245, 48, 39,168, 41, 20, 10, 87,186,186,186,170,175, 95,191,110,212,233,116, 36, 38, 38,134,132,132, +132, 20, 94, 99,143, 30, 61, 50,203,104,113,185,220,133,119,239,222,213, 25,141, 70, 38, 45, 45,205,152,146,146, 98, 76, 73, 73, + 49,148, 52, 90,228,103, 30, 73, 59, 51,142,156,218, 49, 93,203,231,243, 23,190,155,104, 22, 56,100,187, 79, 63,178,221, 39,120, +247, 8,135,180,220,144,253,132, 92,152, 78, 94,125, 83,147, 44,236, 33,207,101,182,251, 4,147,237,190, 3,201,226,246, 92,139, + 52,119,248,245, 33,219,125,130,191, 27,228,153,254, 32,248, 62,185,122,245, 42,217,186, 97, 21,153,218,165,154,130,217,238, 19, + 76,126,240,235,111,137,102, 81,132, 66,225,139, 27, 55,110,144,107,215,174,145, 37, 75,150, 16,137, 68, 18,243, 54,162,122,228, + 7,111, 79,242,163,119,123,178,179,174, 43,185,210,254, 31,215,193,167,185, 27,170,117,245, 22,196,165, 61,248,157,144,140,151, + 36,105,141, 63,233,225,195,171,170,217, 10,112,114,114, 74,141,138,138, 34, 73, 73, 73,100,221,186,117,196,202,202,234, 31,109, +182,124,128,126, 0,230,173, 94,189,186,208,100,109,217,178, 37,248,209,163, 71,193, 30, 30, 30,167,171,240, 93, 27, 87,175, 94, + 93,104,178,182,108,217, 66, 30, 61,122, 68, 60, 61, 61, 99, 43,218,112,196,136, 17,146, 86,173, 90, 5, 15, 31, 62, 92,185,123, +247,110, 18, 21, 21, 69, 30, 62,124, 72, 86,175, 94, 77, 22, 45, 90, 68,126,254,249,103,210,191,127,127, 69, 96, 96,224,221,129, + 3, 7,138, 44,140, 40,112, 11,162, 48, 2, 66, 8,143, 16, 98, 50,154, 92, 0, 60,211,203, 63, 75,113,163, 85,150, 23, 41,203, + 76,149,101,176, 74, 46, 43,199,136,149,107,216,204,248,190, 66, 83, 85,198,117, 80, 44, 34,113,165,119,239,222,237,223,248,241, + 33, 88, 58,254,139,111, 68,145,187,215, 33,249,224,102,112,178,146,193,203, 77,135,230,198, 41,232,111, 28,199,200,150, 45,197, + 98,138, 90,102,233, 1, 21, 8, 4, 16, 8, 4,224,243,249, 80, 42,149, 72, 72, 72, 64,155, 54,109,232,144,144, 16,209,132, 9, + 19,166,139,197,226, 24, 0, 31, 86,120, 55, 83,249, 17,233, 91,183,110, 97,220,184,113,194,189,123,247, 54,116,116,116, 12, 53, + 26,141, 2, 0, 8, 15, 15,199,144, 33, 67,132,251,247,239,175,231,230,230, 22,162,211,233, 36, 66,161, 16, 28, 14,167, 76, 61, +129, 64, 0,189, 94, 47,172, 91,183,238,195,208,208,208,128,222,189,123,243,162,163,163,241,250,245,107,232,245,122,129,183,183, +247,163,144,144,144,134,189,122,245,226,197,198,198, 34, 58, 58,186,176, 28,230,148, 87,171,213, 66, 40, 20,162,104,149, 22, 69, + 81,208,104, 52, 16, 8, 4,102,107,113,185,220, 78,190,190,190,143, 66, 67, 67, 27,247,235,215,143,127,255,254,125,196,197,197, +193,104, 52, 10,252,252,252, 30,133,134,134, 54,234,219,183, 47,255,225,195,135, 72, 78, 78,134,185, 85,104,166,245, 66, 67, 67, + 49,124,248,112,193,217,179,103, 27,185,186,186, 62, 52, 24, 12, 2, 0,120,244,232, 17,134, 12, 25, 34, 56,119,238, 92,227,234, +213,171, 63,172,160, 42,145, 3, 0,122,189, 30, 19, 38, 76,144, 90, 89, 89, 33, 54, 54, 22, 12,195,192,104, 52, 2, 0,210, 51, +211, 31,133, 62,122, 28, 62,114,232,160,246, 42,157, 70,115,251, 94, 80, 88,173, 26,158,238, 20, 69,106, 84, 80,212, 15,165, 82, +105,204,154, 53,107,102, 68, 69, 69, 9,125,125,125,233, 87,175, 94, 33, 55, 55, 23,124, 62,191,240, 26, 51,119,191, 5, 2, 65, + 7,127,127,127,174, 90,173, 6,195, 48, 0, 64,104,154, 46,245,100,136,178,110,192,207,217,192, 19,139,197, 29,222,201, 19, 41, +199,223, 30, 12,186, 70,167,106,133, 66, 27,119,185,204,213, 27,136,185,134,154,142, 66,112,104,142,232,254,107,165, 20, 32, 93, +225,145,102,111,153, 38,211,245,117,138, 86,168,183,171, 39,115,115,247, 64,122,122, 58,170,215,242,133, 90,224, 40,184,245, 82, + 33, 3,101,161,230,159,180,173, 91,183,174, 75,157, 58,117,144,150,150,134,198,141, 27,195,214,214,214, 22, 64,215, 74,155,172, + 93,158, 66,228,160, 53, 64,175,129,145, 90, 2, 61,119, 5, 94,166, 54, 38,219, 27,243,254, 73, 38,203, 74, 38,184,179,255,192, +193,106,246, 30,126,192,169, 79,224,108, 35,196,206, 73,141,237, 28,173,133,199, 42,105,182, 2,156,157,157, 47,221,189,123,215, + 65, 36, 18, 33, 36, 36, 4,254,254,254, 88,183,110,157,163,173,173,237,181,127,136,217, 34,225,192,137,239, 30, 62,220,181, 55, + 34,226,228,136,218,181,123, 15,247,246, 94, 62,241,227,143,199, 78,155, 54, 13,171, 86,173,194,177, 99,199,208,186,117,107,140, + 31, 63, 94, 31, 19, 19,179,167,146,223,179,121,205,154, 53, 83,167, 79,159, 94, 82, 83, 23, 29, 29, 93,110,109,139,191,191,191, +251,139, 23, 47,226,103,206,156,217,120,239,222,189, 98,137, 68,130,172,172, 44,252,248,227,143,152, 55,111, 30, 40,138, 2, 33, + 4, 63,255,252,179,100,204,152, 49,205, 35, 34, 34,226, 61, 61, 61, 43,108,214, 65, 8,161, 8, 33, 34, 0,146,130, 73, 10, 64, +178,127,255,126,235,126,253,250, 89, 21,204, 19, 23, 76, 66,176,148,164, 84, 47, 82,228,183,242,100,137,227,221,187,228,188,146, +203, 8, 33,189,203,211,176,208, 64,151,246,125,167,202, 51, 91, 69,127,129, 58,148,234, 34,129, 6, 46, 94, 62,200,190,112, 24, + 98, 46, 5, 49,167, 96,226, 82,160, 95, 61, 66,117, 17, 15,122, 66, 2, 42,107,180, 76, 19,143,199,131, 82,169,132,209,104,196, +188,121,243,132,231,207,159,183,167,105,250,127, 21,233, 20, 53, 76,207,159, 63,135,159,159, 31,117,226,196, 9,231, 41, 83,166, +136, 77,223,147,157,157,141, 58,117,234, 80,103,206,156,113,250,250,235,175,101,229,153, 25,138,162,192,231,243, 49,125,250,116, +241,189,123,247,236,220,220,220,240,234,213, 43,100,100,100, 64, 38,147, 97,250,244,233,226,187,119,239, 58,186,185,185, 33, 42, + 42, 10,217,217,217,144,201,100, 22, 27, 45, 62,159, 95,108, 27,138,162,160,211,233, 44, 50, 6,214,214,214,251,130,131,131, 29, +173,173,173,241,240,225, 67, 24, 12, 6, 88, 91, 91, 99,234,212,169,226,224,224, 96, 71, 27, 27, 27,132,135,135,131, 16, 2, 43, + 43, 43,139,202, 8, 0, 12,195, 32, 60, 60, 28, 53,106,212,192,181,107,215,156, 38, 78,156, 40, 50,205,127,249,242, 37,220,221, +221,113,237,218, 53, 39,169, 84,186,175, 44, 45,134, 97,144,152,152,136, 39, 79,158,224,213,171, 87, 72, 77, 77, 69, 90, 90, 26, +114,115,115, 97, 48, 24, 0, 0,146,220,156, 83,251, 15,157, 8, 21,139,197, 18,127,239,186, 30,143, 30, 63, 77, 17,139,197, 18, + 79, 15, 15,111, 96, 49, 93,142, 33,252, 95,116,116,180,253,152, 49, 99,248, 73, 73, 73,200,204,204, 4,151,203,125,227,218, 18, + 8,204,107, 10,100, 48, 24,252, 68, 34, 17,165,211,233, 10, 35, 96, 2,129, 0, 51,246, 41,225,191, 16,197,166,143, 55,164,128, + 24,245,208,106,181,126,127,251, 47, 24, 64,129,210,214, 5, 69, 53,190,243, 74, 97,215,182,247, 80, 62, 94,159, 5, 24, 61, 64, +115,209,161,129, 59,247,216, 35,133, 51, 8, 26, 64, 3, 95, 66, 42,238,249, 69, 0, 10,208,213, 1,168,166,231, 95, 24,236, 91, +127, 52,137, 31, 31, 31, 15, 62,159, 15,161, 80,136,198,157, 6,112,247,135,234, 93, 64,161, 33,116,240, 49, 71,179, 88,216, 81, + 44, 94,176,104,209, 34,105, 81,205,177, 99,199, 74,173,173,173, 23, 85,218,100, 41, 36, 45, 97, 32,211,159,196, 43,107, 44, 63, +149,228, 23,145,162,242, 1, 33, 51, 1,125,163,183, 96,182, 58, 8,133,194,215, 0,218, 84,201,100,201, 5,183, 15, 28, 56, 88, +205,174,122,190,201,130, 65, 13,240,196,112,113,180,193,206, 25, 29,237, 28,109,196,150,154,173, 0,103,103,231, 63,238,220,185, +227, 32, 18,137, 16, 28, 28, 12, 62,159, 15,145, 72,132,250,245,235, 99,251,246,237,142,118,118,118,255, 40,179,181,242,225,195, +221, 43,158, 60,121, 62, 55, 32,192,247, 67,169,212,110,242,240,225,214, 95,127,253,245,201,227,199,143,239,234,213,171, 87,218, +189,123,247,214, 3, 56,108,105,196, 12,192,150,181,107,215, 78, 54, 25,183,175,191,254,250,231,227,199,143,175,232,213,171, 87, +226,189,123,247,102, 2,216, 82,158, 64, 94, 94,222,241,249,243,231, 91,127,244,209, 71,166,255,113,227,198, 13,236,217,179, 7, + 82,169,180,216,186,125,251,246,197,184,113,227,108,181, 90,109,185,191, 73, 78, 78, 78,157,239,220,185,227,143,252, 14, 94, 66, +147,209,122,252,248,177, 77, 78, 78,142,141, 76, 38,179,113,117,117,149,155,204,214, 71, 31,125,100,195,229,114,219,128, 5, 21, +121,145,162, 70,199,156,121,149, 93,223, 92,179, 85, 98, 86,153, 57,180,138, 25,173,222,189,123, 95, 69, 25, 61,169,116, 25,201, + 16,194, 8, 49,135,130,132, 83,196,108,129, 1, 55, 59, 5, 84, 37, 58,240,150,246, 99, 40, 16, 8,192,225,112,160,213,106,145, +158,158,110,145, 41,176,178,178,130, 76, 38,131, 74,165,130,193, 96,128, 72, 36, 50,153, 17, 88, 89, 89,129,199,227,129,199,227, + 65, 36, 18,189, 17, 77, 42, 25,205,225,243,249,144, 74,165, 72, 76, 76, 68,116,116, 52, 24,134,129, 76, 38,131, 84, 42,133, 64, + 32, 64, 66, 66, 2, 18, 18, 18, 64, 8,129, 84, 42,133, 84, 42,133, 37, 13,174,141, 70, 99,169, 63,254,122,189,222,162,136,150, +193, 96, 64, 88, 88, 24, 98, 98, 98, 32, 18,137, 10,247, 85, 40, 20,226,229,203,151, 72, 74, 74,130, 68, 34,129,149,149, 21,172, +173,173,205,214, 53,237,139, 92, 46,135, 88, 44, 70,102,102, 38,148, 74,101,225, 49,181,178,178,130, 84, 42, 69,118,118, 54, 82, + 82, 82,202,221,119,163,209,136,132,132, 4,164,166,166, 34, 54, 54, 22,105,105,105,133,102,171, 32,106, 84,181,192, 78, 78, 14, +210,211,211, 11, 35,145,101, 77,230,192, 48, 12,114,115,115,113,231,206, 29,138, 97, 24,100,101,101, 49,169, 73, 73,198,207, 18, + 4, 56,182,248, 7,114,240,236, 3,245,254,211,193,170,163,127, 60, 81,109, 57,250, 72, 37, 10, 92, 98,120, 39,143,161,173, 1, +214,208,243,186,165,229,233,133,169, 58,190,181,115, 64, 23,224,245, 25,128,230, 2, 34, 91,180,168, 87, 19,209,153, 70,233,179, +100,173, 8, 20,186, 99,139,183,173, 89,154, 70, 94,215,212, 92,189, 48, 74,231,104,229,215,160, 9,146,147,147, 33, 20, 10, 33, + 20, 10,209,180,117, 23,188, 78, 55, 74,158,198,171, 36, 32,232,102,150,230,159,212,146,201,100, 45,219,180,105, 67, 21,213,236, +217,179, 39, 40,138,170, 15,192,215,162,135,220,198, 90, 2,232, 36, 45,192, 37,211,159, 38, 42,221,142, 61, 86,123,247,249,112, +128,221,247, 23, 83,252,194,146, 52, 94, 32,250, 47, 64,116, 77,170, 96,182,218,203,229,242,147,155, 54,109,242, 18,137, 68,103, + 0,180,173,140,136, 76,204,217,182, 96,242,208,106,182, 38,147,165, 87, 2, 92, 49,192, 19, 3, 92, 49, 92,156, 28,176,108, 92, + 87, 59,137,136,119,212, 2,195,186,127,203,150, 45,142, 37, 77,150,105,106,220,184, 49, 22, 46, 92,232,104,103,103,183,239, 29, +255, 88,118,179,182,182,222,219,165, 75,151, 59, 9,114,249,184,196, 38, 77, 4,127, 88, 91,103,119,206,206,182,246,124,252, 88, +231, 3, 60, 2,176, 53, 46, 46,174,135, 5, 38,235, 99, 43, 43,171,224,206,157, 59,235,228,114,121,204,186,117,235, 62,155, 50, +101, 10, 86,173, 90,133,249,243,231,255, 8,224, 83, 0, 95,197,197,197,185, 85,100,178, 0, 32, 41, 41,105,216,156, 57,115,210, +210,210,210, 0, 0,245,235,215, 71, 86, 86, 22,102,205,154,133,207, 63,255, 28, 0,208,168, 81, 35, 16, 66,144,156,156,140, 53, +107,214, 36, 39, 37, 37,141,174,224,217, 30,123,248,240,225,230, 58,157,206, 29,249,213,131,194,172,172, 44,171,140,140, 12,185, + 78,167,147, 50, 12, 35,181,177,177,145, 1,144,140, 28, 57,146,251,244,233, 83, 63,131,193, 16,207,122,171, 63, 41,207,139, 84, + 6,138,162, 78, 85, 37,114, 85, 90, 68,172, 12,202,143,104,245,238,221,155, 42,250, 89, 44, 98, 68,225, 97, 76,208, 53,216, 5, + 52, 41, 22,205,146,112, 40,136,173,172,241, 58, 54, 26,124, 80, 79,222,150,209,202,204,204,196,103,159,125,166, 26, 54,108, 88, + 58,195, 48, 3,204, 53, 5,214,214,214,176,182,182,198,211,167, 79, 73,255,254,253,147,215,173, 91,167, 42,106,180,158, 63,127, + 78,186,117,235,150,178,104,209,162,188,242,140,150, 41,162,181,114,229, 74, 85,135, 14, 29, 82,159, 60,121, 66, 76,102, 74, 38, +147, 97,205,154, 53,170,142, 29, 59, 38,223,191,127,159,152,230, 89, 18,209,162,105,186,208,104, 21,221,134,166,105, 48, 12, 99, +145,209, 82, 40, 20,195,122,245,234,149, 28, 30, 30, 78, 76,251,105,109,109,141,117,235,214,169,186,118,237,154,252,228,201, 19, + 98,154,103,101,101,101,182, 25, 52,125,191, 92, 46,135,149,149, 21,158, 62,125, 74,186,117,235,150,188,113,227, 70,117,209,249, + 97, 97, 97,164,111,223,190,201,185,185,185,195,202, 51, 47,166,234, 60,131,193, 0,181, 90,141,180,180, 52,196,198,198, 22, 86, + 29,170,164, 86, 61,134, 14,238,211, 80,165, 82, 41,159, 62,127, 17, 83,191,158,191,147, 74,165, 82, 70,199,196, 60, 7, 22, 51, +229,104, 15, 8, 8, 8, 72,255,236,179,207, 84,153,153,153, 85, 54, 90, 2,129, 32,156,203,229,146,182,109,219, 18,173, 86, 75, + 98, 99, 99,245,105,153,153, 6,223,111,191, 37, 79,102,204,160,196, 65, 65, 66,153, 76, 70, 21,104,210,175, 94,189, 98,196, 98, +113,248,223,254, 36,162, 25, 23, 80,164,205,245, 23,121, 54, 93,251, 12, 17, 80, 73,247, 0, 93, 30, 32,180, 5,132,182,224, 74, +237,241, 65,219, 70,156,221,119,114, 92, 64,152, 86,224, 11,221, 43,212,228, 17,103,128,105,123,225,185,218,182,205,192,169,130, +140,140, 12,112, 56,156, 66, 83, 36,145, 74,209,249,195,145,244,207,247, 52, 46, 0,105, 13,138,227,110,193,189, 62,123,193,130, + 5,252,204,204, 76,208, 52,253,167,166, 68,130,137, 19, 39, 10,173,172,172,230,155,253,240, 59,236,199, 7, 79,216, 2, 32,159, + 63, 75, 82,187, 29,127,164,242,249, 98,229, 78,113, 64,163,230,152,208,193, 73,188,242, 84, 74, 64,104,172,170, 38, 96,156, 1, +131,182,105, 37,204, 86, 91,185, 92,126, 42, 40, 40, 72,210,179,103, 79,172, 89,179, 70, 42, 22,139,207, 84,230,193,175,200, 51, + 78, 89,186,241,151,228,135,235,187, 3, 58, 69,190,193, 42, 50,165,228, 49, 88,184,243, 82,182, 94, 79,134,154,171,169, 82,169, + 70,125,250,233,167,233, 71,143, 30,125,195,100,137, 68, 34, 68, 70, 70, 98,249,242,229, 25, 25, 25, 25,163,223,165,201,154, 50, +101,202,242,184,184, 56,159, 11, 23, 46,112, 83, 83, 83,157,214,254,244, 83,246,145,236,236,140, 21,143, 31, 63,251,170, 94,189, +186,115, 27, 52, 24, 93, 78,234,135, 82, 77,214,228,201,147,247,199,197,197, 53,190,120,241, 34, 47, 53, 53,213,125,242,228,201, + 88,189,122, 53,230,207,159,191, 29,192, 4,152,215,225,229,207, 0,130, 78,247, 44, 51, 51,179,119,247,238,221,179, 50, 51, 51, +209,160, 65, 3,244,233,211, 7, 46, 46, 46,112,115,115, 67,191,126,253,224,237,237,141,244,244,116, 12, 29, 58, 52, 35, 53, 53, +181, 59,128, 87,229,105,166,167,167, 71,236,219,183,239,249,212,169, 83, 27,199,197,197,249, 1,176,207,205,205,149,230,230,230, + 10,181, 90,173,216,214,214,214,182, 81,163, 70, 14,227,199,143,151, 61,120,240,192, 47, 46, 46, 46, 15, 64, 52,107,175, 10, 77, + 86,153, 94, 4, 64,106,129,225,209,150,248, 76,173, 96,153,185,219,150,250,183, 25,235,149, 52, 91, 69,167, 55,170, 14, 75,191, + 24,129,133,123, 14,239, 86, 11, 60,234,192,218,167, 33, 36, 34, 17,196, 2, 1,196,182,246,208, 48, 12,126,138, 76, 82, 42, 8, +153,111,233, 1, 45,249, 67, 72, 81, 20, 54,111,222,108,104,217,178,165,250,210,165, 75,155, 84, 42,149, 7,128,223, 45, 49, 5, + 27, 55,110, 84, 78,159, 62, 61, 52, 37, 37,165,161, 72, 36,210,154,230,111,218,180, 73, 57,114,228,200,199,113,113,113,141, 37, + 18,137,178,172,246, 89, 69,141,150, 80, 40,212,164,164,164, 52, 31, 59,118,108,248,214,173, 91, 21, 18,137, 4, 82,169, 20, 66, +161, 80,155,146,146,210,240,179,207, 62, 11, 93,189,122,181, 82, 44, 22, 67, 42,149, 90, 84, 45, 71, 8,121,195, 80, 21,157,111, + 46, 6,131,225, 82, 74, 74, 74,195,233,211,167, 63,248,254,251,239, 21, 38, 3, 84,180,140,107,215,174, 85,202,100, 50,139, 34, + 90,166,245,164, 82, 41, 54,108,216,160,156, 58,117,106,104, 74, 74, 74, 67,161, 80,168, 45, 50, 95, 49,101,202,148, 7, 41, 41, + 41, 13, 13, 6,195,165,114,222,240,140, 57, 57, 57,224,114,185,120,252,248,177,134,207,231,131,166,105,188,124,249,178,208,104, +217,217,217,249, 55,172, 95,207,247,151,253,135,175,138,249, 66, 97,203,230, 77,253, 94, 69, 69,199, 17, 66, 69, 85, 80,212,223, + 85, 42,149,199,165, 75,151, 54,181,108,217, 82,189,121,243,102, 67, 89,145, 45,115,208,104, 52, 87, 67, 66, 66,244, 34,145,136, + 74, 76, 76, 52,112, 56, 28, 24,141, 70,162,105,222, 92, 83,255,251,239,201,211,185,115, 41, 43,169,148,203,231,243, 33,145, 72, +168,179,103,207,106,149, 74,229,213,191,223,104, 65, 2, 10,226, 23, 41, 26,185,136, 54, 80,120,254,123,190,201, 18,217, 0, 34, + 91, 64,100,139,106,213,220,113, 47, 82, 41, 7, 13, 1,140,102,228, 16, 35, 68, 10, 10,146,199,201,144,243, 4, 98, 42, 41, 41, +169,208, 16,153, 38,175, 58,126, 8,137,206,147,129, 34, 66,112, 96, 73, 10,146,222,246,246,246,220,196,196,196, 55, 52,253,253, +253, 57,122,189,222,252,212, 46, 9, 70, 87,128,153,252, 60, 73,237,250, 91,168,194,103,198,138,159,197, 98, 99, 22, 16,180, 17, + 1,181,220, 48, 99, 96, 35,193,215,199, 83, 3,238, 71, 41,107,129, 67, 38,128,201,115,180,160,156,109,228,114,249,153,251,247, +239, 75,228,114, 57, 94,189,122,133,230,205,155, 99,199,142, 29, 18,137, 68,114, 26,128, 69,237,241,238, 38, 35, 58, 47,215,216, +114,246,225,152,164,135,137,134, 98, 38, 43, 85, 65,240,233,119,199,179, 50,115,212, 3,238,196,150,125,255,148,194,131,172,172, +172,110,243,231,207, 79, 79, 77, 77, 45,102,178,162,163,163, 77,134,160, 3,128, 39,239,234,199,210,218,218,122,248,138, 21, 43, +112,255,254,125,244,236,217, 19,215,174, 93, 67, 70, 70, 6, 14,156, 57,243, 98,223,139, 23, 95,153,218,108,149,145,250,161, 84, +172,172,172,190, 88,177, 98, 5,130,130,130, 10, 53,211,211,211,177, 98,197,138, 56, 0,147, 44, 53, 89, 38, 82, 82, 82,238, 61, +123,246,172,123,131, 6, 13,194, 54,109,218, 20,231,234,234,202,140, 31, 63, 30,159,126,250, 41, 28, 29, 29,141, 27, 54,108,136, +105,219,182,237,227,136,136,136, 46, 74,165,242,145, 57,239, 2,105,105,105,183,118,236,216,113,167, 83,167, 78,146, 81,163, 70, + 57, 30, 59,118,204, 94,169, 84,186, 9,133, 66, 39,173, 86, 43, 8, 11, 11,227, 28, 57,114,196,229,233,211,167,145,106,181,250, + 94,101,203,254, 95,131,162,168,251, 20, 69,157,162, 40,234, 98,137,207,251,229, 45,179, 96,219,178,254, 46,119,189, 18,197,220, + 81, 98, 50,159,225,181,176,120, 98, 61,185,242,214,136, 22, 36,105,124, 27,146, 60,196,143,220,104,111, 71,198,214,166, 20,163, + 42,153,222, 65,165, 82, 21, 78, 71,143, 30, 37, 46, 46, 46, 10,185, 92,110,113,122, 7, 23, 23,151,228,156,156, 28,210,172, 89, +179, 12, 71, 71,199,194, 84, 4,174,174,174,201, 10,133,130,180,104,209, 34,195,201,201,105, 3, 10, 26,101,187,187,187,199, 18, + 66,136,167,167,103, 66, 89,122, 6,131,129,184,184,184,152,122,232,241,236,236,236,126, 8, 12, 12,204, 72, 78, 78, 38,174,174, +174,133,169, 19, 28, 29, 29,215, 52,111,222,188,228,252,138,202, 27, 27, 23, 23, 71,226,226,226, 72,245,234,213, 19,138,206,143, +142,142, 38,209,209,209,196,221,221,221,226,244, 14,142,142,142,171, 75, 41, 75,165,202,232,225,225,145,172, 82,169, 72,171, 86, +173,138, 29, 83, 15, 15,143,100,181, 90,109,154,111, 86,122, 7,177, 88, 60, 65, 36, 18, 37,136, 68,162, 4,161, 80,184,188, 70, +141, 26, 41,135, 14, 29, 34, 27, 54,108, 48,117, 73,135,163,127,223,150,117, 90,141,254,202,209,191,223, 23, 85, 73,239, 32,151, +203,255,112,113,113, 81, 28, 61,122,180,216,245,165, 82,169,204, 78,239, 32, 22,139,227,242,242,242,152,228,228,100,253,205,155, + 55,149, 65, 65, 65,202,199,143, 31, 43, 35, 35, 35, 85,233, 41, 41,186,228,228,100, 85,118,118,182, 38, 52, 52, 84, 35,145,188, +155,244, 14,100,135,119, 29,242,131,239,241,136,165, 94, 79,167,183,147,168, 31, 45,107, 72,200,255, 62, 34,228,244,167,132, 92, +154, 77,238,109, 31, 79, 90,121, 9,141, 55,103, 85,127, 78,182,249,252,102, 78, 74, 6,178,163,126, 29,242,131,239,233, 23, 75, +188,158,142,106,235,166,254,105,235, 6,114,247,238, 93,242,248,241, 99,242,234,213, 43,114,250,247, 67,164, 85, 45, 73,190,230, + 15,190,199, 45, 76,243,208, 90, 40, 20,230,173, 91,183,142,220,185,115,167, 80,243,248,241,227, 68, 34,145, 40, 1,243,122, 45, + 19,128, 34, 63,248,127,104,216,234,115,253,235,174,178,220,244,147,179, 9,121,180,155,144, 29, 1,132,236, 10, 36,228, 80, 47, + 66, 78,140, 38,119, 54, 12, 36,173,189,248,122,178,205,231, 26,217,238,111,118, 99,123, 30,143,151,115,244,232, 81,146,144,144, + 64,174, 93,187, 70,130,130,130, 72,120,120, 56,137,137,137, 33,167, 78,157, 34, 60, 30, 79,141, 74, 12, 91, 22,232, 12,207, 46, +117,249,137,161, 43, 91, 19,114,108, 40, 73,221, 55,156,244,174, 39,207,104, 81,189, 74,249,232, 26,217,219,219,167,157, 58,117, +138, 68, 70, 70,146,171, 87,175, 18, 39, 39,167, 52, 0, 1,239,250, 7,177, 75,151, 46,119, 9, 33,193, 61,123,246, 12, 6,112, +182, 75,151, 46,193,175, 95,191, 14,110,222,188,249, 29,148,159,250,161, 76, 58,119,238,172, 35,132,144,158, 61,123, 18, 0, 9, + 93,186,116, 33,175, 95,191, 38,205,155, 55,215,190,165, 98,115, 0,140,230,241,120, 63,217,217,217, 93,182,181,181,189,196,225, +112,118, 0, 24,129,202,231,227,226, 0,112, 3,224, 15,160,105,193,228, 87, 48,143,237,113,248, 31,161, 48,189,131, 57, 12,244, + 66,235, 49,181,168,171,195,106, 34,119,104, 77,228,125, 82,155, 50, 39, 97,105,151,178,140, 22,195, 48,228,249,243,231,164, 99, +199,142, 10,169, 84, 26, 15,243, 19,150, 22,211,116,112,112, 8,114,114,114,122, 35,137,102,145,249,197, 18,150, 58, 57, 57,221, +114,117,117, 77,118,116,116, 12, 41, 77,211,193,193, 33,200,213,213, 53,217,193,193,161, 88,114, 79, 14,135,211,211,193,193, 33, +190,228,124, 46,151,219,201,201,201, 41,182,228,252, 50,246, 29, 46, 46, 46,177, 9, 9, 9, 36, 53, 53,149,120,120,120, 36,148, + 52, 96, 73, 73, 73,197, 12,152, 57,154, 21,149,165,156, 50,150,170,105,198, 49,173,204,121, 55,225, 93,173, 90,181,148,181,107, +215, 18,153, 76,150, 82,116,129, 79,187, 79, 22,220,125,145,151,243,233,156, 31, 14,149,146,176,212,220,228,160,221,165, 82,105, +124,199,142, 29, 21,207,159, 63, 39, 12,195, 16,134, 97,202, 50, 90,165,105,246,104,218,180,105,122, 90, 90,154, 49, 55, 55,215, + 16, 27, 27,171,121,253,250,181,106,217,178,101,186,212,212, 84,117, 94, 94,158,246,225,195,135, 26, 87, 87,215, 84, 0, 61, 44, + 61, 71,149,253,237, 42, 89,125, 70,182,251,181, 38,219,252, 78,133, 47,242, 12, 27, 29, 40,213, 4,175,237, 73,200,165,217,228, +206, 15,159,146,150, 94,130,124, 67,180,221,247, 12,249,217,187, 29,217, 88, 75, 96,150,230, 79,181,219,146,237,190,103,158, 46, +244, 12,251,168,137,163,118,255,238,237,228,229,203,151,228,248,145,125,164, 69,205, 2,147,181,205,239, 60,249,193,175,163, 57, +154,165,153,173,157, 59,119,146,151, 47, 95,146,223,126,251,205, 92,147,213,165, 52,163, 53,175,139, 44,235,211, 64,145,102,104, + 35,129,182, 95, 0, 95,215,173, 14,223,208,202,147,107,108,232, 74, 51,126,142, 32,221,124,196, 26,178,205,231, 26,217,230,215, +221,220,114, 10, 4,130, 24, 20,201,169, 83,114, 18, 10,133,169,229, 24,173, 46, 21,154, 45,111, 97,226, 31, 75, 59,145, 62, 13, +228,233,102,154,172,138,174,165, 70, 14, 14, 14,105,187,118,237, 34,206,206,206,169,102,154,172,191,252,250,180,182,182,222,155, +151,151, 23,124,238,220,185,224, 46, 93,186, 4,239,221,187, 55,248,198,141, 27,193, 18,137,100,175, 41, 56, 81,210,108,249,189, +249,252,239, 82, 34,162, 21,156,155,155, 75,206,157, 59, 71,186,116,233, 66,246,238,221, 75,110,220,184, 65, 36, 18, 73,112,101, +203,249, 87,236, 59,171,249,159,102,124, 41,147,101, 70,235, 45,158, 8,162, 86,171,201,172, 89,179,180, 34,145, 72,201,231,243, + 45, 29,130,231,189,190, 8, 29, 28, 28,110, 57, 59, 59, 39, 59, 59, 59, 23, 51,123, 69,231, 59, 56, 56,132,252,203,111, 64,111, + 62,159, 31,205,227,241,138, 15,193,227,223,183,101,237,214,163,230, 59, 7,244,253,160,138,229,228,243,249,252,121, 34,145, 72, + 57,107,214, 44,109, 94, 94,158, 37, 70, 11, 0,186, 74, 36,146,248, 61,123,246,168, 94,188,120,161,207,200,200, 48,220,189,123, + 87, 31, 20, 20,164, 93,188,120,113,174, 68, 34,137, 71,217,105, 9,254,150,227, 73, 54,214, 18,152,204,214,163,249,158,225,125, +234, 73,116, 59,102,118, 35, 45,107,148, 48, 89,101,103,114, 47, 93,179,192,108, 61,248,218, 35,188,163,183,204,176, 98,254, 12, +210,162,166,184,184,201,178, 64,179,164,217,146, 72, 36,185,139, 22, 45,178, 36,146, 85,220, 16,254,228,227, 65,182,251,238,205, + 55, 81, 21, 76, 63,248,252, 72, 54,251,120,252, 83,238,163, 64,103,120,118,246, 22, 62,177, 32,146,101, 78, 57, 27,217,218,218, +134, 89, 16,201,250, 59,246,189,219,196,137, 19,131, 95,191,126, 29,252,234,213,171,224, 27, 55,110, 4,127,248,225,135,193, 0, +186, 21, 89,167,208,108,233,250,247,215, 52,162,233, 25, 21,104,126, 60,113,226, 68,242,250,245,107,242,234,213, 43,114,227,198, + 13,242,225,135, 31, 18, 88, 54,124, 15,107,138, 88,163,245, 78, 34, 90,127,245,128,159, 93, 0, 92, 44, 58, 67, 36, 18, 37,171, +213,106, 71,153, 76,246,123, 94, 94,222, 84,228,119,139,172,146,230, 95, 81, 78, 86,243, 95,161,233, 42,147,201, 54,229,229,229, +125, 40, 18,137, 82,213,106,181,179, 5,154, 54, 66,161,112,134, 72, 36,234,168, 84, 42,189, 1, 64, 42,149, 62,215,104, 52,151, + 85, 42,213,122, 0, 89,239,122,223,201,198, 90, 2, 8, 4, 77, 65, 48, 55, 56, 70, 81,115,197,185, 12,207,153,157,108, 99, 90, +213,150, 70,130,199,124, 7, 74,115,143, 26, 19,173,177, 88, 83, 76, 53,135,145, 55,247, 94,148,178,198,119, 23,114, 61,191,232, + 40,139,105, 85, 75, 22, 3,130,239, 32, 84,222,182, 84,179,164,217,146, 74,165,123, 20, 10,197, 56, 0,151, 45,221,119,114,216, +143, 15,133,190, 26,244,156,122, 32,229, 12,225, 67,136, 18, 52,231, 49,146,144, 76, 45, 14,211,177,247,209,223,174,217, 77, 38, +147, 13,247,245,245,173,245,244,233,211, 87, 74,165,242, 87, 0,231, 75,172, 67,249, 2, 29, 37, 92,110, 67,149,193,112, 45, 12, + 8,170, 64,243, 99,153, 76,246,133,175,175,111,192,211,167, 79,159, 40,149,202,181, 0, 14,176,231,232, 95,165,249,175, 52, 90, +127,123, 22,101,211,143, 93, 94, 94, 30,123, 6, 88,254,106, 18,243,242,242,250, 23, 92,119,150,110,155,165,209,104, 22,106, 52, +154,133, 40,104, 63,146,153,153,249,143,106,180, 74, 77,123,165, 37, 27,107, 5, 65, 32, 88,217,196, 67, 60,245,232, 68,177, 18, +132,138, 3,143,217, 80,129,201,170, 72,243, 30,196,250,149,205, 61,197,159,255, 54, 65,172, 4, 65, 18, 8,214, 87, 96,178,204, +229,166, 66,161,168, 89,233,125, 30, 20,166, 3, 16, 73,128, 40, 44, 46,231, 69,113, 49, 8,197, 54, 50,126,151,156,207,203,203, + 59,127,239,222,189,114,127,131,194,129, 75, 48,152,221, 25,224, 64, 94, 94,222,129, 10, 52, 89, 88,254,113,112,217, 67,192,194, + 82,241, 75,201, 63,181, 96,212,180, 87, 90,114,216,239, 62,210, 56,179, 64,163, 38, 96,136,134,194,144, 68, 77,139,214, 86, 81, +243, 46,210,168,233,224,192, 27, 2, 67, 4,242,180, 73,212,164,104,237, 63,102,191, 1,130,197,172,145, 98, 97, 97,249,199, 48, + 30,197,123, 26, 22,254,207, 26, 45, 22,150,247,156,130, 40, 79, 92,193,244,143,213,100, 97, 97, 97,249, 15, 26, 46, 80, 40,187, + 65,155, 37,117,175,149,105, 20,119,145,213,172,148, 38, 7,128, 53, 0, 27,228, 15,227, 96,234, 38, 92, 81,154,141, 15, 0,232, +217,227,201,106,178,154,172, 38,171,201,106,190, 99,205,138,180,223,199,182, 95,165,101,134,223,241,174,122, 29,178,154,149,167, + 59,123, 60, 89, 77, 86,147,213,100, 53, 89,205,127,169,230,191, 14, 66, 72,165, 19,177,177,188, 27, 68,236, 33, 96, 97, 97, 97, + 97, 97,249,199,209,184,224,211, 21,249,209, 45, 87,211,130,119,218, 70, 75,108, 95,215, 21, 92,186, 1,197, 16, 95, 0, 32, 52, + 21, 14, 3,243, 80,149,254, 34,177,170,218, 50, 55,111, 59, 2,193, 97, 10,218, 65,121, 9,207, 51,170,170, 87,207,219,170,191, +179,131,124,120, 82,122,246,158, 39,207,242,142, 89,178,173,181,181,167,181,200,206,118,160, 70,167,175, 39,224,243, 99,116, 89, + 57, 59, 50, 51, 95,229, 86,162, 24,118,229, 45, 92,188,152, 80, 39, 19, 67, 40,190, 68, 71,219, 91,241,169, 60,228,145,188, 68, + 25,227,149, 21, 73,142, 28, 25, 68, 44, 61, 55, 20,141, 14, 82,185,188,137, 80, 36,105, 46,145,219,214,101, 8,144,145, 28, 31, +165,213, 27,110, 24,181,202, 96,194,224,202,219, 56, 87, 44, 44, 44, 44, 44, 44,255, 2,163, 21, 2,160, 23,242,219,104, 85,220, + 24,222,211,191,205,125,145, 72,236, 5, 0, 12, 33, 96, 8,160,200,201, 10, 78,122, 21,212, 29, 0, 28,106, 52, 62,199, 19, 89, + 53, 97, 72,254,114, 35, 3, 24,116,234,200,156,232,187,205,204, 41,145,212,209,251,163, 78, 93, 58,247,239,221,187,151, 79,253, +122,245,107, 3,192,163,199,143, 34, 78,158, 60,245,236,210, 69,234,168, 34,245,249,111, 85,217, 99, 2,209, 55, 77,155, 54,106, + 19, 20, 20,178, 20,192,228,170, 30, 65,123,123,217,212,243,255,155,213,174,115,255, 53, 82,192, 50,163, 37,178,179, 29,216,175, + 79,143, 70, 95, 78,155, 72,127, 58,235, 91,175,251, 55,175,172,146,185, 6,100, 17, 70,127, 94,145, 60,228,122,121, 3, 39,151, +244,143,101, 25,172, 95, 51,206,210, 27,118,181,180, 85,101, 68, 12, 33,140,113, 8, 69, 81,224, 8, 36, 71, 28,107,181, 57,100, +211, 97,102, 38, 0,179,123,140, 89,185,250,119,113,114,117, 63, 58,228,147, 25, 34,137,181, 51, 23, 28, 62, 0, 10, 9, 81, 97, +184,116, 96,133,237,231, 75,118, 54,190,249, 48,218,240,199,255,182,168, 41, 62,175,191, 50,241, 41,155, 75,133,133,133,133,133, +229,191,204,169, 2,115,117,170,228,130, 50,141,150, 72, 36,246,186,115,229,164,221,111, 55, 98, 1, 0, 93, 26,187,224,171,101, +155,186,237,221, 24,244, 12, 0, 90,118,234,237,189,116,222, 52,220,122,146, 2, 66, 8, 26,213,177,199, 7,253, 6,153,103, 60, +156,253,154, 13, 28, 56, 96,216,172, 89, 95,244,125,249,242,101,212,254,253,251,175, 3, 64,219,118,237,234,124,251,237,183,131, +215,216,218, 9, 15, 30,249, 95,188, 58, 57,236,126,101,246, 86,228, 86,171,154, 79,221,154,195, 15,254,188,137,238,208,125,192, +208, 40, 40, 86,168, 19, 94,197,155,179,173,131,131,195,116, 30,143,103, 13, 0, 12,243,167,255,209,233,136, 11, 0, 24,140,140, +220,214,205, 39,151,195, 23, 25,133, 66,254,211,220,188,188, 61, 57,241, 97, 63,149,167,169,209,235, 3, 62,159, 52,134,126,240, + 42, 29, 94, 1,109, 57, 27, 86,124, 13,198,168,183,157, 49,111,217,192,160,187, 7,161, 72,198, 85, 51,119,141, 87,114, 70,181, +106, 45, 56,223,172,144,117,165, 40,140,246,108,249,201,135, 75,119, 31,225, 53,173, 99, 5,141,158,193,153,224,244,150, 63,172, +255,102,245,205, 31,122,157, 0,176, 29,192, 31, 0, 42, 52,117,118,246,118,191, 78,159,191, 94,166,208,254,153,166,168,192,100, +225,199, 61,135, 17, 26,203,192,215,199,151,235, 50,125,149,108,251,178,241,187,149,249, 99,119,177,176,176,176,176,176,252, 87, + 73, 68,241,222,134, 59, 42, 52, 90, 0, 32, 19,115,241,236,117, 18, 0,192, 70, 12, 76,157, 48, 10,233,105,169,222, 90, 3,131, + 79, 70,141, 64, 72,120, 34,158, 69,166,130, 16, 2,111,119,137,217,165,225,128,105,250,201,216, 79,218,159, 59,127,254,222,130, +249, 11,126,161, 40,220, 6,128,237, 59,126,108,185,112,209,194,113, 35, 70,141,232,122,228,200,145, 39, 0, 42,101,180,184,148, +124,211,234,149,203, 5,113,105,106,245,244, 89,115,153, 47,102, 78,223, 0, 96,128, 89, 78,134,199,179,142,139,139,147,209,116, +241,230,107,223, 45,159,123,173,107,255, 53, 47,162, 98,178, 30,156, 59,126,188,153,191,191, 63,226,226,147, 90,175,250,126, 91, +195, 51,231,196, 99,114,115, 84,253,149,105, 97,165, 14,218, 44,228,241,158, 44, 89,245, 67, 35,198,166, 14,253,213,184,158, 8, +168,237,134,248,148, 44,180,235,222,151, 27,124,255,126, 55,192,108,163, 85, 50, 65,227, 64, 45,147,210,240,219, 61,119, 59,127, +216,202,173, 41, 77,115,144,167,210, 35, 53, 91, 3, 35, 3,180,245,179, 70,143,189,223,115, 51, 20,250,143,150,253, 47,246,163, +219, 27,123, 39,171,179, 19,166, 0, 56, 90,254,215, 16, 59,119, 39, 43, 60,139,205, 45,213,100, 41,212, 6, 0, 0,159, 99, 4, + 5, 98,207,222, 95, 44, 44, 44, 44, 44,255,113, 74,237,117, 8, 20,140, 74,126,242,228,201, 82,219,239, 24,141, 4,207, 34, 19, +241, 44, 50, 17,247,194, 83,161, 35, 60,108, 88,181, 4,107, 87, 44, 66,134,138,198,111,183, 98,241, 60, 50, 9,207, 35,147,144, +150, 89,106,166,247, 98, 85, 74,107, 86,136, 27,175, 95,111,181,186, 91, 59,105, 7, 59, 91, 91,219, 23, 79,126, 81, 44,156,153, +236,183,228,243, 88, 62, 79, 43,140,147,202,164,173, 14, 31, 62,228,239,236,232, 36,149,201,228,179, 37,213, 26,238,180,182,110, + 96, 93,158,102, 73,196, 78,190,125,251,246,234,209,201,197,197,153,153,184, 33, 56,188,158,159,175,190,110,157,186,173,197, 78, +117,251,150,179, 89,161, 38,195, 48,160,105, 26,201,201,201, 72, 72, 72,192,235,215,175,241,252,249,115,196,198, 70, 37, 51,132, +240,140, 96,104, 87, 87,119,112,185, 2,120,213,240,196, 15, 27, 86, 72,150, 45,254,170,185, 72, 42, 56, 86,194, 8, 21,106,170, + 51, 50,143,156, 62,123, 62,254,204,254, 31,140, 0,144,146,153,135, 75,247, 95, 34,228,105,172,165, 39,178,100, 10,135, 26,241, +209, 47,115, 12,145,167, 56, 75,191,254, 34,246,198,141,155, 81,217,185, 90,228, 42,117, 80,170,245,208,104,141,208, 27, 25,120, + 58,138,240,251,220,122, 56,126,249,161, 51, 69, 81,235, 43, 58,158, 26,141,222,216,198, 87,138,161, 29,171,195,215, 93,138,248, +103,183, 49,125,254,122, 4,189,214, 32, 51, 51, 11,122, 69, 26,152,188, 56,164, 69,134,192, 96, 52,146,138,206,251, 91,130,213, +100, 53, 89, 77, 86,147,213,252, 23,107,150,229, 69,222, 19,118,148, 50,161,208,104,149, 69, 68,108, 6,158,189, 78, 66, 19,223, +106,168, 93,195, 21,247,158,103,226,215, 75,177,216,121, 46, 26,151, 66, 83,193,112,229, 72,202, 1, 94, 68, 37,227, 69,116, 90, +133,249,179, 57, 66,222,144,207, 63,207,158, 85,223, 63,167,197,149, 51, 83, 81,205,241,133,255,156, 57, 89, 83, 57, 66,222, 16, +219,234,242,253,115,103,205, 24, 46,151, 72, 4, 90,141, 22,181,106,122,138,166, 77,153, 58,134,178, 21,238, 55,119, 47,229,213, +252,108,133, 98,241, 79,203, 22,207, 22,174,255,237, 69,140, 66, 11,197,209,219,201,175,190,152,187, 48,131,203, 19,253, 32,175, +230,103,107,174,150, 94,175,135, 70,163,129, 86,171,133, 78,167, 67,124,108, 88,223, 63,126,251,178,123,205,234,118,221,133, 34, + 17, 8,128, 28,149, 1,175, 19,149,232,216,185, 43,167, 73,227,198, 1, 50, 87,191,177,165,105,101,103, 71,103, 51,132, 35, 63, +249,251, 62,206,161, 11, 15,240,203,201,251, 56,118,249, 1,238, 93, 61, 99, 32,140,190,112,252, 47,153,107, 29,111,153,107,253, +104,153, 91,131,228,194,169, 90,189,160,114,143, 41,135, 38, 29, 59,119,185, 56, 97,242,180, 43,202,220,244,148,159, 54, 45,137, + 79, 77,136, 10, 19,242, 41,131, 68,200, 65,158,218,128,221,127, 36, 96,224,138, 80, 60,141,201, 3, 33,164,194, 1,188, 25, 96, +230,144,177, 95, 26,245, 58, 29,124, 60,100,216,183, 99, 37,250,118,108,136, 78,245,109,209,172,182, 20, 18,174, 6, 79,194,159, +225,192,190,221, 6,134,161,191, 96, 95,100, 88, 88, 88, 88, 88,216,136, 86,225,228, 90,116, 65,153, 85,135,106,181, 42,114,192, +144, 17,112,117,114,145,245,235, 48,154, 31, 28,145,133,212,196,104,188,124,254, 24, 74,181, 30,124,219,154,128,200, 5, 53,188, + 60,241,240,217, 49,221,198,213,167,242, 24,131, 38,178, 44,189,190,125, 93,221, 95,134, 83,244,234, 85, 30,119,158, 63,203,108, +178,111,254, 46, 12, 27, 38,115, 88,189,202,227, 78,212, 43, 41, 45, 17,145, 86, 99, 70, 13,165,104,138, 96,206,156, 89,232,215, +187, 7, 62, 25, 51,146,218,179,103,119,139, 44, 51,247,146, 1,111,243,188,175,151, 8,146,179, 12,218,123,207,243, 52, 18,169, + 88,124,243, 69,158, 34,192,203, 67,220,179,255,232,132, 83,135,127, 90, 15, 96,148, 57, 90, 38,131,165,215,235,161,211,233, 0, +192, 8, 0, 52,157,255,153,158,171, 69, 74,150, 6,201, 89, 26, 24,140, 12,250, 15, 25, 37,190, 31, 20, 58, 10, 64, 25,237,181, + 24, 70,111,208,227,232,133, 16,196,223, 63,194, 80, 52, 39,187, 72, 99,120,200, 92,235,120,187,184,120, 92,235,221,127,164,163, + 64,148, 95, 13,155,171,208, 96,207,182, 85,229,150,147,166, 40,194, 24, 13, 89, 6,189, 94, 81,171,102,173,120, 95,255,134,162, + 27, 87,206,245,189,121,241,104,158,161,214, 72,155,136,168, 68,112,120, 66,112,248, 34,104,116,230,189, 44, 36,191,188,179, 5, + 0, 53,246,179, 89, 27,102,124,249, 21,103,230,198,235,208,170,149,208,168, 20,200,201,206,132,152,171,199,147, 91,199, 13,196, +168,159,161, 72,124,176,133,189,191, 88, 88, 88, 88, 88,254,227,148, 28,126,167,112, 94,153, 70, 43,250,233,141,102, 0,224,221, +180, 91,186, 76,196,181,227,210, 20,146,227, 34,176,103,205,116, 48, 12, 65,207,113,171, 33,247,114,129,152,207,129, 38, 47, 61, + 47, 35,226,106,185,109,117, 40, 74,223,117,203,246,120,175,207, 38,213,178,218,183, 47,143, 7, 0,251,246,229,241, 38, 77,172, +110,181,117,123,164, 87, 96,155, 38, 32, 70, 35,122,247, 27,128, 33, 31, 15, 65, 84,146, 18,255,187, 22, 3,133, 74,107, 86,111, + 57,177,131,111, 67, 7,123,199, 30,159,143,238, 33,229,114, 40,170,174,167, 53, 39, 54, 85,111,224,112,120,198, 19,247,179, 19, +250,247,255,216,225,210,233, 67,157,140, 14,190, 13, 85,105,225,161, 21,233,105, 52, 26, 24,141, 70,104, 52, 26,232,245,122,216, + 57,212, 60,221,117,192,154,184,196,164,220, 83, 73,153,234, 64,133,222,128,228, 44, 13, 82,178, 52,200, 82,232,224, 34,183,133, + 65,175,173, 95,150, 30, 33,228,151, 15, 7,140, 24, 9,128,166,104,195,174,188,196,240,231,249, 75,254, 52, 89, 61,250, 13,115, +188, 22, 28,129,151, 65,103, 50, 9, 99,200,207,226, 78, 49,113,229, 31, 87, 16, 14, 5,134,207,165,244, 28,154,102,116,186, 60, +189,147,147,227,165,171,151,206,246, 81, 27, 94,129,195, 23, 22,174,171,210, 26,205,190, 98,146, 95,222,217, 12, 0,223,111,220, +176,182, 85,215, 97,252,171, 33,145, 80,233,129,150,141,189,241,251,193, 31, 53,132,232,191, 84, 36, 62,216,204,222, 91, 44, 44, + 44, 44, 44, 44,197, 12,214, 41,228, 55,142, 47, 30,209, 50,213,141,246,238,221,187,100,131,107,196, 39,103,192, 94,198,133,163, +155, 23,134, 79, 95,139, 95,214,207,132,209,168, 7, 33,128,193,104, 94,102, 2, 66,120, 23, 38, 79,242,242,173,225,197,113, 28, + 62, 76,162,250,117,159, 82, 60,124,152, 68, 85,175,190,125,246,228, 73, 94,145,185,106,143,214, 6,163, 17, 55,159,164,224,113, +100, 54, 30, 71,229, 64, 38, 54, 63,205, 23, 71,192,159,180,106,229, 10, 62,151, 67, 81, 79,162,243,242,226,210, 13,121, 28, 30, + 79, 39, 17, 11,136,150,112, 53, 81,105, 36,189,243,135, 99, 84, 39,246,126, 63, 22,192,148,178,116, 76, 61, 13, 77,145, 44,211, + 39, 33,132, 80, 0,195, 80, 70, 99, 92,154, 26,121, 58, 61,146, 51,255, 52, 90,148,161,236,154, 83,153,107, 29,111, 43,185,236, + 44,135,195, 17, 18, 2,232,117,134,193,112,173,211, 61, 47,241,229,243,162, 38,235,206,147, 4, 68, 60,184,152,108,212, 41, 71, + 40, 83,158,253, 97,238,190, 83, 20, 8,135, 3,134, 67, 83, 12, 69,129,225,209, 68, 11, 66,152,146, 37, 82, 90, 96,180, 76,102, + 75,192,227,204, 63,127, 96,189,211, 39,189,252,112,240, 90,190,231, 83,231,166,230, 40,226, 89,147,197,194,194,194,194,242,118, + 41,207,139,188, 71, 81,173, 55, 35, 90,229,237, 16, 33,192,139,232, 52,212,112,119,132,123,141,218,120, 30,246,240,207,101, 0, + 12, 70,243,170,163,142, 31, 79,140, 91,187,214,138,153, 57, 51,187,229,170, 85, 30,183, 39, 77,172,110, 93,175,190,125,246,236, +217, 49, 45,215,173,179,190,125,225, 14,207, 72, 10,242,117,153,114,115, 89, 54, 70, 16,221,188,161,127, 77,206,146,125, 47, 98, +254,120,148,155,194,231,243,245, 46,182, 34, 74, 46, 19,112, 56, 52, 79,160,209,211, 26,239,128,198,156, 19, 52,213,184, 60, 21, +147,209, 42, 89,117,152,158, 26,209,247,252,255,102,213,235,240,225,106,187,248, 84, 21,178,181,156,194,170, 67, 14, 77,225, 81, + 88, 52,192,225, 63, 46, 77,211, 74,110,119,110,255,175,191,120,172, 91,181, 28, 58,131, 17,147,103, 46,192,152, 81, 35,206,193, +181, 78,119, 15, 47,159,224,235, 39,118, 73,186, 79,252, 1,209,207,130,146, 12,154,156, 3,150,152,172, 66,179, 5, 16, 35, 97, +232,140,204, 28,153,198, 0, 17, 74,241,125, 26, 29, 83,169, 43, 39, 79,101,192,137,187, 73, 56,249,219, 1, 88,203,165,236,147, +128,133,133,133,133,229,173,243,158,154, 43,148, 48, 87, 64, 89, 17,173,242,240,116,119,198,221,199,145,168,239, 91, 19,214, 86, +114,132, 71,196,129, 67,243, 64, 83,128,222, 96,190, 25, 34, 58,253,193,117,235,172, 17, 29, 41,165,183,254, 16,233, 53,121,146, + 87,228,186,117,214,183,137, 78,127, 16,192, 8, 66,242,199, 5, 50, 37, 72, 53, 90,224, 11, 8,163,175,238,108, 39,225, 4,189, + 82,164,211, 52, 71, 99,111, 45, 98,236,173,133,180,189, 92,192,227,243, 56,140,129,208, 58,119, 39, 47, 53, 97,152,134,230,232, + 21,173, 58, 52, 26,141,160, 40,218, 88, 96,196,164,177,233, 42,100,171, 57, 72,206,210, 32, 51, 87,135,186,213,164,184,120,233, +136,210,168, 87,237, 43, 77,139,195,227, 91,215,246,114,199, 87,223,172,131, 74, 99,196,139,248, 60,240,133, 66, 23,103,151,128, +208, 17,159,205, 21, 78,219, 17,129,177,157,236, 49,243,122, 68,188, 50, 89, 52,215,146, 51,107, 52, 26,161, 82,107,249,201,105, +153,182, 57,185, 10, 43,177, 72,168,114,180,179, 78, 43,109, 93,181,133, 17, 45, 19, 18, 17, 23,125, 90,184, 64,173, 27, 10,149, +198,128, 91,127, 28,101,159, 8, 44, 44, 44, 44, 44, 44,127,178,163,172, 5,102, 25, 45,153, 68, 4,194, 17,225,122,112, 4,124, +252, 27, 96,247,241,123,168, 83,191, 5, 18,115, 13, 32,160, 43,236,109,104, 98,214, 60, 85, 8,128,144,190,125, 37,238, 31,125, + 84,173, 43, 33,188, 11, 63,108,207,137, 3,128,154,245,242,101, 24,134,128, 16,128, 48,249,134,203,108, 40,110,116,100, 98, 78, + 13, 47, 23, 41,158,198,233, 52, 82, 33,159,182,149, 10, 56,142,214, 2, 62,159,203,133,145, 80,154,196,196, 8, 13, 5, 68,153, + 35, 87,178,234, 80, 34,115, 61,221,249,195,213,169, 81, 49,217, 65,117, 51,148, 13,179,117, 2, 16, 2,212,173, 38,197,227, 59, +167,140,201,241, 47, 95,168,146,159,109, 43, 77,139, 97,192,209, 25, 24,132,190,202, 70,150, 66,143,172, 60, 29, 90,119,236,195, +111,221,165, 47,174, 63, 78, 3, 99,208, 99,213,143,167,114,141, 68, 63, 4, 8,211, 91,176,211,244,221,144, 39,238,169,153, 10, + 33,143,203,205,242,173,227,249, 90,192,231, 25,114,114,114, 4,197,215,226, 64, 42, 22, 32, 35, 79, 15, 0,122, 75,175,158,108, +133, 30,199,239, 36,225,196,209,253, 16,139,197, 32,236, 13,197,194,194,194,194,194, 82, 20, 87,228, 15,191,115,170,224,179,208, +124,153, 53,168,180,145, 33,112,176,183,131, 72,106,133,200,100, 29,114, 41, 39,100, 42, 9,140,198,252,136, 86, 57,129,167, 82, + 71,247, 62,126, 60, 49,238,216,177,180,157,199,143, 39, 22,105,232,253,103, 36,171,240,147, 33,102,107, 82,196,120,241,248,153, + 43,217,125, 3, 29,109,105, 14, 71,197,231,209, 26, 46,159,163,227,115,105, 61,159, 75,107,157,173,120,156, 43, 39, 14, 8, 8, +133, 43, 21,105,170,213,106,116,233,210, 5, 61,123,246, 68,191,126,253, 48,104,208, 32,120,123,251, 57,209, 28, 74, 75, 40,134, +113, 20,228,162,182, 35, 5,174, 58, 22,127, 28,248, 78,249,248,230,239,161, 70,141,186, 15,138, 91,206, 63, 53, 9, 97, 50,178, + 53, 80,235,140,200,204,211, 33, 83,161,131,193,177, 37,126,191,149, 0,149,214,136,232,224, 35,170,212,164,184,233,154,148,151, +145, 21,156,138, 57,197,255, 37,113,159,126, 50, 42, 85, 46,162, 95,182,109,213, 44,213,193,222,206, 64, 81,127, 70, 94, 41,138, +130,200,202, 9,182, 54,114, 68,134,156,193,249, 85,157, 85, 0,190, 54,231,120, 22,197, 74,194, 69,223, 64, 23,244,233, 63, 20, +245, 91,116, 55,199, 88,179, 35,218,179,154,172, 38,171,201,106,178,154,255, 37, 76, 99, 28,154, 62,205,203, 12,111, 50, 64,181, + 92,165,168, 83, 77, 10,181,206, 9,106,173, 17, 10,181, 17, 57, 74, 29,114,148,122, 68, 38, 41,241,248,120,213, 75,152, 31,197, +202,207,248, 73, 8, 0, 42,223,224,153, 27, 61, 17,232,180,223,172, 93,245,237,224, 3,141, 27,105,167,245,114,173,254, 48, 82, +155, 64, 81,180,138,230,112,245,118,114, 46, 47, 60,252, 97,234,237,107,167,219,137, 12,198,145,202,114,116, 12, 6, 67,118,181, +106,213, 0, 20, 31,130,199,175,182,184,223,205, 83,115,106,182,239,187,202,113,253,242, 89, 74,154,195,103, 40, 46,255,177, 81, +175,218,175, 74,126,246, 3,202,177, 31, 52, 95, 20,118,247,193,211, 22, 54,118,213,241, 50, 94, 1,133,218, 0,157,129,129,173, +140,143,184, 71,231,116,145,225, 65,135,242, 18, 30,238,174,196, 97,219,247, 60,236,177,123,143, 30,221, 7,180,104,209,146,179, +112,225, 2,248,248,248, 64,165, 82,129,166,105, 84,175, 81, 27,145,207, 31,224,206,169,111,140,202,244,168,109, 0,150, 2, 72, +181,244, 75,210,114,180, 56, 19,148,130, 83,191, 29, 4,135, 39, 96,111, 39, 22, 22, 22, 22, 22,150, 55, 25, 95,226,115,135, 89, + 70, 75,173, 86, 71,182,233,210, 7, 12, 67, 96, 36, 0, 99, 44,136, 60, 49,127, 70,159,140,122,117,100, 85, 75,199, 48,198,123, +155,119,236,236,217,184,121,123,142,191,135, 12, 57,233, 73,184,115,243,178, 1, 12,185,109,206,246,233,233, 47,242,196,206,117, + 6, 12, 30,248,209,225, 81,159, 76,204,106,215,177,163,212,201,201, 69, 19, 23, 31,167,252,121,239,175,250,115,167,143,181, 99, + 96,248, 56, 61,253,101, 94,121, 58,217,217,217,223,151, 54, 95, 40,144,181, 6, 80,147,195,165,180,170,212, 23, 22,181, 8, 79, +139,143,237,255,237, 55,139,163,134,141,155, 33,168, 85,173, 54, 82,178, 57,136,140, 75, 66,248,181, 99,154,248,231,247,127,203, +137, 11, 25,107,166, 84, 98, 41,243,226, 0,172,191,115,231,118, 64,143, 30, 61,186,119,234,212,137,140, 31, 63, 30,132, 0,127, +236,152, 68, 50, 34,239, 28, 65,126, 20,235, 85, 37,207, 75,244,181,219, 15,236, 6,181,107,202,181,151,143,197,206,131,167,245, + 32, 76, 52,123, 63,177,176,176,176,176,176, 20, 82,249, 54, 90,177, 97,249,249,180,254,106,114,147, 82, 70,236,222,253,203,178, + 95,246, 30,104,173,214,106,171, 17,240, 99,141, 6,237,213, 60, 35, 22,154,171,161, 74,126, 25,100,111, 95,183,222,207, 63,110, +254,250,231,157, 91,219,131, 49,250, 82, 64, 20,161,112, 69,164, 55,142,170,200,100,149,107,150,210,114,183,119, 29,176, 70,149, +158,158,247,139,165,219,170,210,159, 37,209, 28, 93,245,237, 27,190, 89, 77,211,156,110, 70, 35,195, 99,140,250,151, 70,157,250, + 59, 85,234,179,227, 48,187,149, 27, 50,202, 89,246, 4,192,147, 75,151, 46,181,189,116,233, 82,115, 0,223, 35,127, 12,197,160, +170,156, 23, 77,122,110,231, 47,103,125,249,199, 23,160, 60, 25,134,192, 96,100,162,249, 42,101,103,246,158, 98, 97, 97, 97, 97, + 97, 41,100, 60,222, 76, 90,106, 94, 68,235,239, 34, 51,243, 85, 46, 50, 49,173,170, 58,233,233, 47,242, 0,188,209,115, 79, 89, + 69,221,199, 47,114,254,135, 23, 57,255,171,236,246,138,148,215,169,192,235, 81, 85, 44,134, 57, 13,217,175, 23, 76,111,133,180, +180, 48, 5,210, 16,200,222, 67, 44, 44, 44, 44, 44, 44, 22, 27, 46,243, 26,195,179,176,176,176,176,176,176,176,176, 84,104,178, +138,126, 2,200,111,123, 94, 86,207, 1, 75, 70,230,174, 76,239,131,139,172,102,149, 53,121, 0, 4, 0,100, 0, 42,170,210,236, +142,130,241, 26,217,227,201,106,178,154,172, 38,171,201,106,190, 67,205,138,180, 47,226, 95,130,101,137,215, 43, 7,219,245,149, +213,100, 53, 89, 77, 86,147,213,100, 53, 89,205,127, 59,227, 75,153, 64, 8,249,231,180,209, 98, 97, 97, 97, 97, 97,249,187,176, +183,175, 43, 3, 10,219,245, 86,136,196,193,207, 25, 0,148,105, 97,201,236,209, 99, 41,133,162,227, 28,190,149, 54, 90, 60,154, + 43,248, 82, 34,183, 15,147, 90,219,199,255,199, 15, 46,229, 93, 67, 58,181,107, 59,175,223,125,106,138,251, 89,178,161,196,209, +123,151, 75,237,192, 24,169,147,247, 84,184, 54, 22, 87,165, 16, 82,167,154,142,178,234, 77,111,202,171, 5,124,240, 23,236,163, +208,223,223,191,165,191,191,127, 75, 0,194,183, 33, 40,113,242, 30,234, 94,167,197, 53,167, 90,141, 46, 75,157,235, 14,124,219, + 5,150,185,214,177,151, 85,111,242, 63,153, 91,131, 76,153,107,131, 28,153,123,147,171,114, 7,191, 90, 21,109, 87,189,239,183, +190, 75,246, 63,222, 95,189,239,183,190,165, 45,183,237,177, 81,190,232,192,139,229,246,125,190,147,177,207,149,202, 81,189,245, + 80, 27,215,246, 95,216, 91,186, 93, 53,239, 22, 79,106, 4,180, 77,113,171, 27,248,216,220,109,220,125, 90,134,120,250,183, 78, +118,247,110, 25,196, 30,121,243, 16, 57,214,108, 41,178,245, 56, 37,180,245, 56, 45,180,171,217,177,170,122,174,174,174, 98, 95, + 95,223, 30, 45, 90,180,152,208,185,115,231,207, 27, 53,106, 52,222,211,211,179, 27,222, 97,103, 44,137,147,247, 60, 13,143, 74, +211,240,168, 52,137,147,247,188,138,159,175, 62,203, 40,218,152, 64,209,198, 4,169,147,207,178,127,202,185, 18, 58,123,123, 74, +156,188,215,201, 93,252,239,137,157,234,246,177,116,123, 91, 91,219,110,142,142,142, 31,154, 38, 91, 91,219,110,236, 29, 80,105, + 10,163, 88, 37,254,174,212,133,206,225, 9, 37, 55,134,125, 50,185,222,202,197,115, 69, 27,118,254,142, 13,203,103, 61,213, 40, +178,252,255,137,123,238, 80,179,121, 16,135,230,184, 23,157,103,100,140,113,105,175,239, 53,125, 27,250, 62, 53,196, 99,191,158, + 61, 98,230,208,193, 93, 60,187,244,158, 78, 61,123,173, 58,102,190, 69, 67,195, 67,255,251,173,250,181, 43,151, 55,238,220,185, + 99,105,170,193,103, 29, 79,200,221,156, 19,251, 36,203,146, 50, 88, 57,214,170,201,149, 58, 92,107,211,111,178, 75,240,197, 95, +119, 27,181, 76, 87,101, 90,145,209,191, 43,143, 99,237,218,181,155,113, 56, 28,251,169, 83,167,242, 1, 96,253,250,245,117,140, + 70, 99,122, 68, 68,196,125, 84, 34,249,105,190,193,244, 25,241,253,234, 37,191,124,240, 65, 79, 36,164, 41,176,106,221,150, 14, +103, 79, 30, 26,164, 72,126,113,228,109,156, 19, 27, 27, 47, 43,240,229,143,166,207, 94,234,212,163, 67, 51, 78,158,218,128,179, +215, 30,180,253,117,203,210,123,128, 95,243,220,180,176, 50,115,138, 49,202,236,249,206, 50,210,131, 81,102, 3,192,208, 55,126, +236,101,250, 46,142, 98, 99, 15, 87, 33,247, 65, 58, 80,225,160,143, 54, 53, 90,159,227, 9,133,158, 52, 77,131,166, 0,154,166, +192,161,168,252,113, 66,117,170,232,248,240,235,221,255, 9,247,137,220,163,121, 18, 56, 92,123,154,250,179,124, 20, 93,240, 73, + 72, 78,210,139, 27,246,111,225,107,172,235,213,177, 9,104, 93, 71,241,243,213,215, 25, 82,110,187,207, 79, 81,132,222, 26,115, +125, 93,168, 89, 6, 64, 36,178, 61,113,226,132, 99,143, 30, 61,172,157, 2,250, 93, 53,103, 27, 1, 39,207,255,228,201,227,252, + 30, 61,186, 91,112,125,122,119, 5, 77,239,165, 0, 30,195,144,245, 28,134, 28,202, 75,127, 30, 1, 88, 54,250,148,216,201,103, + 44, 13, 98,246,115,134, 1, 21,164, 74,121,182,179,178, 7,151, 43,180,234,204,227,243, 63,175,233, 93,191,113,124,212,203, 32, + 69, 94,238, 58,131, 38,251,170,197, 66,122,195,151, 23,175, 7,127,192,229,241,168, 30,157, 3, 57, 26,224,114, 85, 78,186,179, +179,243,135,155, 54,109,170,213,178,101, 75, 0,128,193, 96,176, 58,124,248,176,203, 55,223,124, 35,125,254,252,121,101, 7, 78, +173,230,232,232,232, 33, 16, 8,170, 1,128, 86,171,141, 79, 77, 77,141, 1, 80,225,139,191,212,185,150, 3, 8,150, 94,191,118, +141, 11, 0,109,219,182, 91,230,209,102,138, 45,135, 47, 83,149,122, 56,180,185,210,172,136,203, 51,238,220,189, 77, 1, 64,139, +192,150,115, 37, 14,126,155,223,101,100, 75,228,228, 19, 72, 3, 51, 91,180,237,210,127,200,199, 35,232,128,186, 30,232,214,181, +211, 28, 21,112,194,162,107,134,203, 21,223,187,119,175, 54, 77,211, 28,131,193,160,110,209,162, 69, 76, 85,202,229,230,221,242, + 22, 5,186,186,206,160,253, 49,245, 85,208, 50,224,141,129, 99, 56,214,213, 27,127, 13, 14,119, 28,195, 48,177,185, 49, 65,173, +254,133, 17,173, 55,143,179,165, 74, 52, 87,240,249,208, 49,159,213,155,241,197, 87,162,233, 27, 46,225,212,150,185,105,255, 84, +147, 5, 0, 28,154,227,126,238,252, 57, 39,137,128, 3, 0,200, 83, 27,240, 65,143, 30, 21,255, 34,212,104,126,133,166, 40, 31, +211,128, 54, 70,131, 78,196,229, 9,212, 84,190, 65, 2, 5,192,193,173,198, 37,103,195, 13,201,208,193, 93, 60,247, 30,184, 16, + 23, 19,151,110,241, 67,141,226,240,209,162, 93, 55,116,233,218,221,250,222,221, 91, 75,119,108,251, 97,158, 65,167,255,129,209, + 51,235,212, 25, 47, 19, 42,124,152,187,212,109, 34,144, 57,156,237, 63,225, 27,123, 53,109,135,133,203,191,119,184,118,102,223, +213,248,216,134, 76,116,116,172,154, 80,212,211,204,140,196,207, 21, 73, 17,207,204, 61,100, 50,153,172,150, 76, 38,107,216,160, + 65, 3,209,172, 89,179,120, 29, 58,116,248,211,178,143, 31,207,191,114,229,138,235,154, 53,107,122, 62,124,248, 80,157,151,151, + 23,154,151,151,247, 10, 22, 52,180,119,113,113,156, 50,224,163, 62,232,212,127, 50,140, 12,133,241,159,205,192,185, 51, 71, 39, + 2,120, 43, 70, 75, 47,177,250,102,220,132, 89,142, 45,154, 53,226, 44,221,247, 12, 98, 1, 23,221,155,250, 80, 99,166,206,183, +217,185,113,233, 79, 72, 67,251,210, 34, 89,140, 50,123,126, 61, 7,237,199,125, 91,214,196,241,253,218,143,209,121, 54,104,137, +245,178,216,227, 95,133, 3, 64,173, 30, 83,229, 66, 99,234, 38, 55, 27,142,147,208,152,186,169, 86,143,169, 23, 95,157,221,148, + 91, 94, 89,120, 66,161,231,254,125,251,234,218,202,249,224,210, 20, 56, 28, 10, 92, 14, 13,181,214,136, 65,131, 63,126,107,151, +185,216,169,110, 79, 26, 24,147,255,131,141, 93,170,148, 23,167, 45, 57, 39, 20,135,111,127,242,248,111, 92, 39,107, 33, 56, 28, + 10, 28, 26,224,208, 20,162,146, 85, 24, 59,118,140,117, 85, 13,251, 7,173,157,154,125, 57,196,167,123,139,122,118, 13, 14,222, +166,172, 91,124, 48,196, 62, 77, 45, 25,125,224,216,229,143, 73,219, 25,119, 9, 97, 86,199,221,248,254,124,121, 34, 26,141, 38, +185,123,143, 15,172, 40,174, 84,114,241,247,221,237,184, 52, 5,189,145,192, 96, 36, 48, 22,140,141, 74, 21,188,193,208, 52, 5, +194, 16,140, 27, 55, 22,221,123,124,160,100, 12, 76,156,249, 15, 57,122,239,217,139, 55, 29, 53,122, 6,107, 54,237, 92,170,200, + 78, 93,250, 58,220, 62, 42, 47, 59,109,134, 42,229,133,217,227, 96,208, 32, 77, 99, 95, 61,158,176,239,228, 29,212,243,247,131, +145,201, 47,167,143,187, 20,251, 78,221,129,175,143,111,126,185, 25, 2,239,234, 50, 52,107,218, 12, 0, 42,101,180,184, 66,249, +194,246,189, 70, 44,233, 61,232, 19, 56, 57, 58,130, 38,250,222, 23, 79,237,235,189,107,235,234, 47, 13,234,156, 53, 22,137, 17, + 99,225,239, 2, 97,152, 42, 71,157,220,220,220, 28,155, 53,251, 51, 29,163,193, 96,128,151,151, 23,226,227,227,125, 42,243,158, +230,234,234,218,107,209,162, 69, 78, 61,123,246,228,185,184,184, 0, 0,146,146,146,170,157, 61,123,182,241,162, 69,139, 82, 18, + 19, 19, 79,161,156,140, 62, 70, 61,205,167,185,224,136, 68,146,252,125, 4, 69,207,154, 50,178,129,179,171,155,166,180,245, 83, + 83,147, 4,179, 39, 95,166,184, 92,126,193,250,160, 9, 97,168,114,162, 68, 93,120, 60, 94,169, 53, 20, 58,142, 85, 11,194,179, +254,148,230,208,249, 23,171, 65,159,154, 25, 19,226,103, 65, 36, 46,128, 39,224,255, 48, 96,200, 39,173, 6,246,239, 7, 87, 71, +107, 92,188,241, 16, 19,167,204,212, 27,116,250,117,149,122,120,112, 56,220,148,148,148, 40, 91, 91, 91,151,170,255,222, 82, 53, + 47,156, 59,227,116,241,143, 75,115,215,110,216, 56, 73,167, 53,232, 25, 66, 10,199, 49, 22,139,133,188,174,189, 7, 91, 57,213, +110, 33,218,184,232, 83,222,191, 48,162,181,227,173, 24, 45,129, 88, 62,120,193,236,169,162,111,126,189,131, 83, 91, 38,166, 41, +115,210, 28, 11,223, 20,172,108, 66, 20, 57, 89,141, 43, 83, 66,153,163,119, 75,138,195,157, 64,113, 56, 82,138,166, 4,140,145, +137, 53,104,181,203, 84,233, 47, 18,171,186,247, 12, 67,240,191, 91, 41,150, 25, 32,130, 58,123, 15,254,230,244,127,246,206, 58, + 60,138,227,255,227,239, 61,215,184, 39, 36, 1, 66, 66,176, 0,193,221, 61, 56,197,165, 56,133,210, 66,105,129, 66,177, 2,165, + 80,188,180, 64, 41, 80,164,184, 6,119, 43,154, 64, 32, 64, 18,136,251,197, 46,231,126,243,251, 35,210, 64,163,208,254,190,149, +121, 61,207, 61,201,222,237,189,111,118,119,118,247,189,159,249,204,140,155,189, 0, 58,163, 5,195, 70,140,198,158, 61,123,108, + 92,236,248,208, 25,204, 88,179,118,173, 82,149,112,198, 53, 33, 57, 47,181,107,223,217, 23, 99,227,101,207,146,210,117,135,170, + 90, 54,189,209, 2,133,198, 12,141,158,133,128,250,205,176,102, 93, 29, 97, 82, 98,220,236,221,187,118,204,124,254,156,189,199, +202,102, 45,213,165,191, 72, 46,245,164,115,111,208,195,214,193,233,215,129, 83, 86,216,199,200, 56, 32, 48,226,181,173, 16, 67, +199,205,180,245,115, 23, 65, 34,100,219,199, 37,166,122,204,249,252,243,219,177, 22,210, 92,145, 21, 27, 87, 81,121,170, 87,175, + 62, 40, 36, 36, 68,252,217,103,159,113,189,189,189,177,107,255, 97,223,118, 61, 62,232,155,150,158,233, 77, 8,129,155,171,107, +242,164, 15, 63, 56,125,246,236,217,196,228,228,100,238,234,213,171, 91, 28, 63,126,188, 94, 70, 70, 70,165,159, 76, 45,132, 64, +167,183,192, 82,120,131,204,202,215, 87,217,159,122,121,121, 9, 82, 83, 83,245, 37,162, 12,204,239,129, 66,166, 71,151, 14, 45, + 56,219,206,197, 67,165,179, 64, 34,228, 34, 62, 83,131,166,141,131,152,159, 44,230, 70,165, 9, 78, 24,218,103,161,155,148,244, +236,215,170, 38, 92, 29,196,216,249,253, 10,156,186, 27,215, 51, 83,197, 96, 51, 97, 79,241, 16,112,186, 73,172,233,155, 59, 54, +173,229,222,185,137, 47, 30, 54,173,229,126, 51, 44, 42, 90,244,193,218,143, 83, 85,220,203,121,231,103, 42, 75,191,240,176,224, +104,195,195,207, 23, 18, 33, 22,114, 32, 17,114, 32, 17, 20,252,101,177,152,247,123,170,245,168,235,205,182, 90, 38,176,217,156, + 9,195,135,126,224, 57,114,248, 7, 4,108, 22, 14, 31, 61,221,127,223,190,189,233, 38,163, 97,135,133,197,254,185,172,250,243, +198, 14,101, 1,174,118,124,124,190,227, 25,108, 69, 92,216,136,185,176, 21,115,209,185,161, 11,216,239, 62, 8,140,195,212,254, +126,189,167, 14,172,222, 41,208, 71, 26,240,228,117,254,243, 9,203, 31,109,184, 46,239,244,233,247,235,235, 57,169,228, 6,206, +162, 57,147, 56, 41,105,105,157, 14,159,190,209,217, 98, 24, 31,101, 54,170,191,204,138, 56, 92,106, 84, 56, 37,234,110,176, 87, +203, 33, 66,163,202,244,244, 73, 84, 74,173, 60,189, 0,145, 9, 10, 72,132, 28, 72,139,246,173,144, 3,137,144, 11,169,144,131, +180,148,120,228,170,217,183, 83,157, 88,157,112,227,174,185, 42, 5,215, 25, 45,120, 28,167, 66,245,192,198,240,240,240,132,161, +247,168,234,247,175, 30, 61,249,224,198,137,111, 52, 25, 47,191,172,172,206,254,208,123,152, 55,107, 74, 24, 3,132, 23,222,164, +131, 23,173,218,210,100,217,188,233,111,188, 55,103,233,166, 38,239, 30,201,178, 89,216,121,224, 71, 75,219,117, 27, 8,101,110, + 38,126,187,120, 8, 61, 66, 6, 99,212,248, 79, 96,111,239,188,102,221,242, 47,158,152,245,138,171,127,184,230,186,215,105, 27, +212,160,238, 62, 47, 79, 79,111,171,181, 96,150, 15, 66, 0,149, 50, 31, 95,124, 58, 9, 86, 66,208, 40,184,121,103, 97,187,110, +132, 20,206, 6,146,157,147,173,142,122,249,188,171, 78, 22,117,191,210,251, 82,167, 51,101,101,101,225,241,227,199,136,142,142, + 70,100,100, 36,114,114,114, 96,103,103,167, 82,171,213, 85, 10,222, 55,108,216,112,228,213,171, 87,133, 14, 14, 14,197,111, 26, + 12, 6,216,216,216, 96,228,200,145,220,238,221,187,123,245,233,211,103,236,179,103,207,246, 3, 80,148, 90,158,220, 87,105, 54, +110,129, 91, 59,116,236, 48, 13, 0, 68,182, 30,113,155,119,157,142, 44,247,129,214,206,211,183,117,235, 54,181, 64, 8, 24,144, +141,154,156,232,140,114,162, 68,146,123,247,238,249,177,217,108,206,239,247, 32, 43,126,216,121,176,206,165, 91, 79, 7,173, 90, +243,157,208, 86, 34, 64, 86,190, 1, 19, 71, 13,172,244, 61, 88,228, 22,216,187,117,235,246, 39,151, 45,253,138, 35,149, 72,112, +241,126, 44, 62,254,244,115, 93,122,194,179,239,136,149,187, 69,147, 21, 45,123,207, 91,229,159,210, 61, 46,160,154, 20, 54,253, +122, 8,167,142,233, 39, 52,152, 44,144,171, 77,208, 27, 45,176, 88, 9,242,213, 38, 60, 79, 82,194,217,182,234, 83,185, 17, 66, +154, 1,112, 1,144,197, 48,204,195,146,203, 69, 15,116, 69,222,248,173,229,236,194,251,131, 19, 0, 3, 10,122,234, 23, 87,159, +194,229,178,222, 47,250,254,115, 0,117, 11, 53, 45, 0, 30, 48, 12,147, 87,134,217,250, 67,148,139, 19, 26, 26, 74, 66, 66, 66, +138,175,248,111, 47,191,141,128,199,245,148,216,185,128,144, 23, 40, 57,129,177,171,187, 87,206,119,235, 54, 56,206,248,104, 74, +162, 66,158,235, 91,248,246,229,202,220, 44, 56, 12,123, 93,135, 54, 45,187, 79,251,232, 35, 4,250, 85,227, 89, 44, 22,242, 44, + 58,206,180,251,231,157,227,110,222,229,111, 80,164, 60, 91, 88, 34, 4, 89,165,110,159, 22,171, 37,229,237, 8,150,197,106,121, +251,233,246, 15,154, 12, 3,216, 75,249,216,122, 46, 30,132, 0, 12, 8,236, 36, 92, 28,184,158,130,184,176, 99,138,144, 70, 10, +245,200, 85, 75, 58,119,234, 61,243,234,243,215,186, 67, 50,153,238, 2,128,140,242, 52, 75,191,160, 91,161, 55, 90, 96, 50,155, +113,228,244,105,244,236,220, 2,173, 91,183, 64,251,118,173, 57,143,194, 34,198,127, 52,109,146, 55,126,239,221, 81,172, 41,116, +243,111, 38,181,115, 62, 52,104,218,106,155,167, 41,102,112,216, 64, 77,119, 17, 28,109,120, 48,152, 25, 36,100, 25, 11,207, 28, +123,124, 60,103,169,227,188,217,211,206, 42,178,248, 13,128, 23,198,242,182, 93,163,209,240, 71,143, 30,205, 53,153, 76,198,145, + 19, 63,233,158,145,145,213,255,135,141,223, 10, 92, 93,221,160,209,153, 17, 22,249,170,238,178,101, 75,107,158, 62,127,253,196, +146,207,167,158,236,217,179,167,221,193,131, 7,173, 21,237,207, 55,158, 16, 51,179,191,223,185,239,200,158,245,223,173, 68, 84, + 98, 30,126,222,182, 5,196, 98,222, 90,193,174, 42,169, 73, 70,143, 30, 45, 58,113,226, 68,181,148,148, 20,133, 70,163,201,122, + 35, 30,193, 98, 56,153,185, 26, 56,219,240,193,227,176,224,230, 32,132,171,157, 0, 92, 54,192, 98, 24, 75,105,154, 63, 31, 58, +179,220,170,201,199,169, 95, 13,195,119,126,191, 2,227,103, 44,192,179,108,254,121,150,216,110,249,244,225,131,230,185,136, 44, + 61, 61,237, 89,174,157,155, 84,135, 68,200,195,252,153,163,209, 60, 44,193, 53, 85,110, 93,144,165,101, 55, 94,122,190,120,178, +238,203,111, 6, 71, 10, 34, 88, 54, 98, 46,206,239, 91, 35, 83,231,103,229, 23, 53,201, 25,244,186,196, 74, 86,227,203,165, 60, +217,206,107, 28, 84,127,197,180,201, 19, 88,109, 90, 53, 39, 44, 22, 23,217, 74, 3, 67, 8,240,233,199, 83, 49,125,234, 36,247, +228, 52,217,162, 45, 91,182, 46,188,122,137,124,173,206,122,185,164, 60, 77, 22, 83, 16, 5,146, 10, 57,144,138, 10,140,139, 84, +200,129,206, 96, 1,195,128,109,239, 19,156,207, 20, 68,114,211,114, 19,203,124, 2,127, 67,211,209,167,254,149, 75,113, 54,117, +242, 14,229,221,141, 79,139, 92, 30, 22,145,249, 0, 64,174,119,123,251,177, 70, 51,129, 74,103, 70,124,166, 6,102, 35, 97,198, +247,242, 69,141, 33, 76,224,202,157,225,123,206, 69,192,182,196, 69,255, 13,205,212,123, 71,116, 78, 13, 6, 14, 91,191,105,219, +195,239, 86, 44, 96,103,231, 27, 96, 37, 4, 66, 62, 27, 34, 62,167,240,197,134, 86,157,143, 45, 63,254,148, 97, 6, 51, 8, 55, +110,152,171, 82, 63, 97, 37,163, 6,246,110,127,128, 1,248, 12,139,151,226,233, 91,221,183, 75,223,113,194, 46,253, 70,195, 98, + 54,204, 11,187, 69,174,105,100, 81, 87, 42,163,217,160, 94, 93, 48, 64,184, 90, 22, 61, 21, 0, 36,174,181,183,214, 9,172,211, +228,237,247,252,253, 3,155, 84,230,184, 23, 71, 74,133, 54, 51, 28, 28, 93, 22, 4,214,111,236,154,153,167,103,108,156,170, 33, + 62,230, 49,126,253,113,209, 94,171,206,176,244,202,153, 67, 43, 54,252,124,124,104,151,158, 3,177,243,135,111,231,231,164, 23, + 27,173,203, 37,162, 85,163,118,239,216,238,205,229, 11, 96, 50, 91, 97,178,144,130,191,102, 11,114,115,243, 96, 50, 91, 33, 20, +219,192,108,101, 96,178, 88, 97, 50, 91,161, 55,152, 37, 83, 71,247,249, 72, 7,220, 47,173,156, 94,117, 58, 92,224, 9, 4,190, + 4, 5,115,215, 18, 66, 16,159,161,101,121,120,120,236, 7, 0,129, 64, 0,129, 64, 0,171,213,138,176,168,172, 25,206,129,181, +167,161,208,224, 89,140,134, 68,121,194,157, 30,101,109,187,187,187,123,223,183, 77,150, 78,167,131, 74,165,194,173,187, 15,237, +118,236, 57,210, 51, 62, 49,197,207, 74,236,244, 54,174,126, 61,148,178,216,190,101,237, 79,101,102,212, 71,182, 45, 39,177, 62, +155, 62,214,127,211,238,208, 7,175, 46, 44, 47, 55, 79,171, 70,151,185,134,207,166, 12,110,186,106,227,207, 49,121,119,182,206, +170,232, 24,113, 56, 28,110, 86, 86, 86,241,249,189,249,167, 95,155,134, 71,165, 14,216,176,126,131, 48, 44, 86,137,167,241,105, + 24,219,213,167,224, 9,167, 18,199, 93,226,230,231, 92,179, 86,173,253, 91, 54,174,226,196,164,233,240,253,177, 7,184,122,114, +235,173, 12,217,253,158,200, 76,215,190,203, 53,228, 79, 48, 90,101,106, 94,139,200,134, 74,103,134,222, 96,134,201, 74,160,208, +152, 32,147, 27,160,208, 24,161,210,154, 49,182,155, 79,169,223,171,192,143,184, 48, 12, 19, 74, 8, 9, 33,132,116, 5,192, 47, + 90, 46,184,103, 51,161,133,134,236,141,229,121,243,230,125,249,205, 55,223, 68, 22,173, 91,244,126,209,186,229,189, 95,226,251, + 78,243,231,207,111,176,106,213,170,149,173, 90,181, 58,240,219,111,191,197, 1,200,171,108,243, 33,167,228,198,132,134,134, 86, +180,163,253,140, 38,163,192, 86,196, 69,205, 26, 62,248,240,203,157,206,191,172,154, 32, 19,242, 57,236,115,231,206, 57,230, 24, +164, 96,177,216,149,126, 68,145,186, 4,180,230,241,248,103,214,174, 93,139,225,125,219,137,146,178, 77,170,136, 36,109,166,218, + 0,179,171, 75,109,254,242,149,171,164,171, 86,175,153, 30,122,202, 42, 87,101, 62, 95, 83,122, 19, 95,211, 71,108,166, 68, 14, + 22,195,128, 88, 45, 41,121, 9, 15,155, 2,192,251,228, 98,169,116, 38,176, 11,115,107, 24, 6,208,232,204, 96,179, 25,153, 60, +234,208,243,145, 95, 47,239,188,247,192,165, 52,194,178, 87,170,213,241, 98, 20,204, 57, 88,101,116, 6, 11,244, 38, 11, 34,159, +132,161,125,203,122,104,221,180, 14, 52, 58, 11, 52,122, 51,106,212, 10, 4, 0,231, 82, 15, 28,155, 21, 71, 44, 38, 29, 33, 22, +155,144,102, 46,112,181,231,195,195, 65, 0, 1,159, 3,147, 25,208, 26,172,208, 25, 44, 72,144,105,161,212,138, 16,212,225,131, +154, 78, 30,143,244, 25, 9,162, 19,185, 73,143, 6,149,107, 78, 45, 22,236,222,127,196, 63, 45, 45,179,255,217, 19,251, 4, 89, + 10, 19, 34, 18,212,144,201,245, 0,219, 5,139, 87,126, 47,152, 59,107,242,128,221,191, 30, 77,236,210,174, 69, 98, 85,183, 89, +147, 21,181,247,208,225, 35, 91, 67, 66, 6,136, 34,239,159, 69,204,227, 43, 43,212,178, 42,229,103,177, 26, 53,106,100,158, 60, +121,178,114,229,202,149,222,167, 78,157,170,145,149,149,245, 24,128,201,222,222,190, 78,109,127,223, 39, 23,207,159,243,234, 51, +224, 3,110, 74,182, 22,118, 98, 30,124, 93,197,184,123,235,130,137,207,231,150,154,111, 82,216, 60, 56, 2, 93,190,192,169,187, +113, 61, 35,115,132,215, 39, 77, 24,155,120,241,102, 84,206,230, 61, 23,191,245,146,154, 30, 11,173, 89,155, 31, 53,173,229, 62, +239,227,209,248,102,211, 94,220, 8,139,146,169, 89, 30, 43,210,245,230, 75,101,135,210, 1, 14,155,129,141,136, 11,181, 34, 43, +255,117,248,249,218,127, 82,152,122,236,197, 19,123, 89,185, 74, 19,146,179,117, 76, 90,174, 18, 22, 43,129,189,152, 7,179,149, + 64,158,155,205,236,219,187, 7, 15, 31,222,101,129,205,154, 8, 96, 73,185, 59,148, 41,104, 42,148, 10,185, 5, 17, 33, 81,193, + 95,147,197,138, 64,255, 90,216,190,121,157,173,179,171, 27,218,182,175,124,110,180,141,147,111,163, 3,187, 54,227,250,111,225, + 29,111,108,248,190,153,212,211,101, 19,195, 88,190, 3,129, 78,111,180, 32, 95,158, 7,190, 33, 25,205,189,178,224, 40,182, 32, + 65,225,129,103, 25, 49,210,138, 46,248, 57,207,142, 63,102,200,128,133, 71, 78, 95,253,166, 71,183,142,120,150,160,128,136,207, +129,144,207,134,144,207, 6,151,177, 96,221,143, 91, 77,121,249,202,144,156,200,147,217,239, 80, 63, 47, 23, 62,253, 22,152, 59, +139,202,101,239,166,133,191, 76,250, 98,117,143,158, 3,199, 49,207, 30, 94,251, 82, 3, 92,169,220,131, 30,169,212,123, 86,107, +229,239,113, 66, 27,231,141, 51,231, 46,159,217, 61,228, 3,176,217, 28,152, 76, 38, 28, 61,184, 23,187,190, 95,252,210,160,202, + 25, 7,192,106,144,177, 39, 31,218,251,227, 7, 95, 44, 90,199, 52,104,212,188,197,181,244, 63, 78, 71,107,101, 51,219,198, 76, +152, 50,204,205,205,205,230,247,136, 22, 65,237,192,122,232,221,111, 48, 46,156, 60,142,231,145, 17,176,146, 2,195,100,181, 18, +200,243,114, 50,204, 38,195,238, 50, 91, 60,132, 66,223,157,187,246, 4,176, 88, 12,140, 38, 43, 12,102, 43,102,125,244,161, 97, +234,167, 95,182,237,221,189, 67, 36,159, 13, 69, 66, 82,186,253,221,240, 23, 65, 86,174,212,123,194,156,117, 60,157,222,130,124, +141, 9,103,127, 46,219,235, 8, 29,124, 90, 85,111,210,123,194,212,175,182, 11, 4,108,150,177,126,109,239,184, 14, 45,235, 39, +251,120, 58, 43,151,173,250,190,249,237,251,225,189,135,142,156, 32, 28, 91,167, 9,227,233, 36,178,249,112,228,192,134, 22,179, +113,140, 38, 55,185,204,241, 5,185, 98, 7,185, 79, 13,127,205,239, 17,163,218,199, 24,130,154,111, 56, 15, 6,113,218,204,232, + 65, 0,224,225,233,163,227, 10,108,149, 85,136,192, 16, 0,216,244,211,175, 77,159, 68,167, 77, 90,191,126,131, 56, 44, 86,137, +199,177,249, 16,240, 88, 48,154,172, 96, 42, 25,212,182, 18,246,148, 5,243,231,217,230,169, 45,184, 30,145,133,200, 71,215,136, + 65,165, 27, 41, 54,219, 14,130,171,205, 24, 0,181, 0,188,102, 24,178, 77,157,233,126, 18,184, 97,174,106,189,183, 90, 11,158, +151,109, 93,252,106, 90, 56,130,222, 92,190,164, 21,195,144,250, 12,129, 3, 64, 82,115, 11,239,169,149,117,106,234,204,104,172, + 94,185, 8, 27,119, 28, 71, 90,142, 14,118,150,100,156,252,121, 57, 62,251,102, 63,180,250,178,179, 26, 42,242, 35,165, 25,163, +183, 13, 87,209,255, 69,235,125,243,205, 55, 33,111, 29,155,144, 50,142,217, 31,214, 43,250,254,170, 85,171, 86,150,248, 92, 83, + 89,147, 85,108,180,138, 54,170, 2,179, 85,219,197,195,247,183,147, 39,142, 57,228,169,140, 16,242,216,240,169,225,143, 37,155, + 79,186,244,106,234,140,108,163, 29,126,221,254, 93,174, 78,163, 60, 88,169,139,133,107, 96, 11,145, 84,114,246,216,209,227,240, +243,113,229,237,187,149, 27, 31, 30,167, 45, 14,245, 42,178, 18,249, 53,108, 53,156, 65, 3, 7,138,175, 92,189,246,169, 10, 40, +213,104,177, 25,118,181,159,246, 28,117,181, 17,113,193, 48,128, 82,107,198,164, 49,131,223,255, 54, 70,172,236, 9,227,198,130, + 41, 52, 89,138,156, 12,124, 57,247, 35,157,196, 20,243, 60, 41, 33, 41,181,107,223,207,174, 40, 84,140,110,216,232,143, 30, 62, +143,254, 38, 79,163,121,183, 73,126,244, 6, 11,244, 70, 43, 98, 99, 95, 99,214,216,110,224,178, 89, 96,179,173, 5,201,210,230, +178, 43,163, 42, 45, 58, 23,238,188, 33,123,215,206,248,201,211,205,213, 73, 42, 17, 17,169, 88,192,212,175, 19,192,107,217,178, + 53,191, 70, 96, 67,222,173, 23, 90, 36,101,105, 17,151,150, 15,129, 91, 99,206,240,206,189,176,119,195,156,142,185, 73,143, 88, +248, 99,146,226, 27, 92,186,126,175,239,142, 31,215, 11, 50,229, 70,188, 76, 82, 33, 35, 79,135,244, 60, 61, 50,114,117,144,138, +184,104,223,111,178,224,204,201,109,125,187,180,107,177,233, 93,182, 59, 46, 46,254, 76, 66,106,250, 7, 13,131,155, 99,239, 47, +187,218,217,219,215,176,149,203,227, 21,149, 61, 58,203,151, 47,231,175, 90,181,138,179,121,243,102, 69,203,150, 45,221,231,207, +159,223, 67, 38,147, 61,168, 94,189,122,224,133, 99,187,175, 54,110,223,191, 25,172, 70,151,118, 29, 58,241, 4, 86, 14, 46,134, +134, 26, 15, 29,220,151,163,213, 42,167,150,107, 56,196,118,203, 51, 85, 12, 92,188,188, 34,165,124, 75, 55, 14, 75, 30,157,119, +126,230,158, 60,224,152, 95,207,143, 47, 95,123, 20, 21,221, 52, 44,193,245,106,216, 43, 89,174,198, 88, 59,246,252,103,229, 94, +120,217, 12, 3, 46,155, 5, 27, 17, 7,172,194,171,170,212,179,225, 43, 48,140, 75, 81,228,148, 1, 83,248, 23, 96, 24,164,229, + 37, 61,174, 68,206, 6, 67,172, 4,136, 74, 81, 67,165, 43, 8,205, 87,115, 22, 35, 43, 51, 5, 63,108,218,141,240, 71, 15,209, +189, 87, 63,108,249,105, 31, 38,141,249, 64, 87,209,211, 15,139, 85, 24,209, 42, 17,205,146,138, 56, 0, 24,200,213, 38, 28,189, +157,140, 90, 53, 89,149,190, 49, 0,128,141, 84,140,124,165, 22, 44,158, 13, 94,135,157, 21,159,187,118,127,254,194,175,215,127, +158,151, 30,145,244,234,233, 45, 4, 58,231,163,166,151, 17,145, 25,182,120,148, 83, 3,129,254,126, 96,241, 30, 86, 74, 59, 59, + 50,104,245, 73,214,209,144,166,141,235,181,242,117,181,135,214, 96, 41,140,106,177,177,107,231, 30, 36,196,167, 76,200,121,126, + 50,252,207,112,180,106, 89, 92,150,192,213,127,250,211,251, 87,226, 6,142,156, 14, 15, 47,159, 70,242,164,199,149, 78, 91,168, +204,123,150, 74, 26, 45,158,216,126,254,172, 5,223,206,236,222,103, 8,238,221,186,130,199,145,175,209,162, 69, 51,244, 26, 48, + 28, 74, 69,110,157,195,123, 54,116, 51,107,148, 23, 56, 2,243,204,230,173, 59, 51, 86,139, 5, 49, 47,159,189, 46, 77, 75,155, + 30,245,248,110,122,148,237, 27,205, 83,206,117, 26, 73,237, 28, 31,235,141, 22,164,166,166,224,206,111,215,131,181,233, 81,143, +171,178,191, 4, 60, 54, 46,134,203, 96, 52, 89, 97, 52, 91,209,190, 67, 55, 3,143,165,111,183, 98,253,206,150,233,105,233, 44, +137,173,179,213,209,171, 46,207, 67, 96,212, 63,137,205,231, 25, 77, 86,248,121, 74,202,213,116,241,244, 95, 57,103,206,172,186, +108,158, 8, 74,181,222,144,158,150,234,190,253,215,107,170, 23, 47,159,122, 85,115,181,179,253,118,195, 54,158, 66,199, 64,150, +175, 71,174, 82,193,140,156,242,133,231,142,239,191, 25, 85,158,209, 42, 37, 93,164,230,153,139,183,234, 56,216,240, 24,149,206, +108,205, 81, 24, 45, 35, 7,188, 95,167,203, 66,147, 53,121,253,186, 13,226,240, 88, 37,158,196,230, 67,200, 99,131,207, 99,193, + 96,178,162,146,167, 19,203,221,213,125,106,235,166, 65,184,240, 56, 27,108, 54, 11, 90,101,158,134,131,156,232,166, 29,187,139, +155, 52,111,137, 78, 29, 59,224, 85,116,148, 79,232,169,163, 93,238,222,185,145, 97, 54,214,158,161,206,138, 62, 94,165,192,130, + 70,195, 54,241,221, 63,244,240,170,222,102,208,240, 15,237,124,125,188, 24, 87,103, 39,152, 9, 7,147,199, 12,174,244,153, 95, + 96,204,129, 85, 95,207,135, 94,111,128,139, 61, 31,132, 0, 59, 55, 45,129,193, 96,128,167,147, 0,249,234,178,103,147,171,200, +143,148, 21,133,170, 82,238, 73, 9, 51, 86,222,251, 12,195,132,206,155, 55,239, 75, 0,100,222,188,121, 95, 22, 45,127,243,205, + 55, 90, 0,105, 21, 52, 29,110,127,195,104, 21,109, 92,217,103, 55, 47,208,217,201,227,238,197, 11,231,237, 78, 60,177,226,222, +241, 71,232,211,194, 3, 60, 14, 11, 98, 59, 79, 60,137,207,199,153, 99, 63,202, 79, 30,216,150,170,215,235,215, 84,220,214,236, +223, 84, 42,150, 92,248,101,239, 65,171,179,147, 19,235,135,139, 89,177, 57, 74,115,113,147, 86,244,253, 83,214, 71, 23,182,123, + 16, 48,231,133, 66,161,191,193, 96,112,168,232,192,238,188,152, 88,152,196,203,252, 25,215, 86, 48,108,182,101,239,190,189,112, +182,229, 67,111,178, 98,222,231,159,104,199,118,151,202, 71, 14, 29,222,185, 83,239,153, 87,185,146,128, 43,173,131, 3, 72,227, +198,141,229,108, 54,187, 82,169, 20,174,174,174, 75, 88, 44,214, 8, 62,159,111, 99, 48, 24,148, 6,171, 78,172,214, 25,160, 51, + 2, 26,141, 14, 92, 94,129, 89,228,178, 25,104,117, 6,104,180,134,242, 79,140,140,103,183, 1,212, 86,148,136, 41, 93,121,225, +199,223,127,248,228, 39, 67,134, 14, 91,232,213,104,128, 52, 62, 61, 31, 60,198,136,102,117, 61,112,237,252,113,146,146, 16, 61, +171, 34,147, 5, 0,178,172, 92,111, 23, 23, 55,132,199,169,144,154,163, 69, 70,161,201, 74,207,211, 67,169, 85,162,161,175, 39, +228,249,249,222,239,188,127,129,227, 23, 46, 92,248,160,119,255, 97,152,249,249,210,182, 63,255,248, 93,132,132,207, 29,175,206, +140,185, 94, 25,163,245,236,217,179,220,185,115,231,214,250,233,167,159, 88,163, 70,141,210, 6, 5, 5, 9, 71,143, 30,221,118, +207,158, 61, 66,177, 88,168,125,114,235,212,194,137, 31,207,235,191,125,227,242, 70,121,121,121,140,217,100, 58,103,204,203,155, +167,170,192,204, 37,159,250,242,229,226, 88,227,184,110,237, 92, 78, 57,138, 89,245, 5,196, 48, 28,117,151, 28,196,139, 37,198, +216,243,155,149,162, 15,214,126,156, 38,183, 46,208,177, 92, 87, 84,100,178, 0,128,197,102, 96, 48, 91, 96, 35,226,130,197, 98, + 21,153,120,143, 93, 7,207,137, 93,236,248,224,178, 89,224,176, 25, 40, 52, 38,100, 43,140,152,254, 97,255, 74, 63, 9,152, 45, + 4, 90,131, 25,154,194,167, 67,165, 34, 27,243, 63,159,141, 94,125, 7, 98,226,212,217,200,211, 2,143,226,148, 48,154, 76, 21, +158, 20, 44,134, 5,141,222,140,241,221,125,145,171, 50, 66,173, 53,195, 96,182, 66,204,231,128,203, 97, 65, 34,228,192, 86,204, + 5, 8,225, 21, 93, 76,184, 92,174,206,100, 50,237, 45,231,137, 30, 53,188,221,160, 53,177,208,124,216,119,232,218,170, 54, 34, +111, 31,229,220,184,247,180,230,167,159, 47,192, 39,147,250,226,200,203, 90,112,116,245,133, 84, 34,130,137,176, 0,144, 74, 38, +236, 45,177,178,140, 3, 71,108,253,105,103,212,178, 69,243,132,114, 53, 3, 1,143,141,171, 87, 46,227,238,253, 71, 27,179,159, +159,220,139, 63, 17, 46, 97,185,217,218,218, 66,200,103,195, 96,212, 27, 42,159,186, 64, 64,128, 96,137,107,237,173,133, 79,252, +193, 22, 43, 74,121,175, 98,163,197, 17,218,206,155,241,249,178,149,221,251, 12,193,197,208, 35, 56,124,228,160,165, 85,207, 9, +236,125,187,126, 68,219,174,253,208,182,251, 48,156, 59,190,103,182,218,202,212,155, 60,115,225,215,237, 59,247,198,197, 51, 71, +144,153,145,178,182,178,229,101,115,153,153,157,187,245,133,206, 96, 65,187, 46, 33, 56,127,250,248,199, 40,236,100, 81,249,155, +216, 91,215,103,176,204,179,103,205,228,202,228, 6,110,150,194,128,148, 44, 13,226, 51, 53, 56,121,224,103, 82,249,235,133,161, + 89,251,134,213,184,147, 87, 95, 77,246,174,230,161,231,234,181,162,232,215,177,117, 38,126, 56,150, 91,211,191, 14, 75,150,175, + 71, 86,190, 30,217,249,122,168,116,102,248, 87, 11, 96,153,204, 76,171,170, 30,103,103, 59, 62,119,203,233, 56,216, 74,184,104, + 93,231,221, 59,218, 90,173,214,223, 77,214,250, 2,147, 21, 17,151, 15, 1,143, 13, 1,143, 5, 1,143, 13,179,133, 84,234,193, + 69,228, 90,187,247,244, 25, 31,121, 26,204, 64, 78,190, 1, 28, 54, 3, 87,103, 7, 73,179, 70, 35,176,243,187,143, 1, 0,147, +230,254,128,137,227, 71,163,110,253, 32,200,243,242,220, 71, 12,233,189, 30,192,241,202,150,245,236,197,235, 62, 23,111,134,207, +157, 62,103,177,116,104,223, 78,236,199,177,249, 72,207,213,227,117,180,178, 74,145, 55, 0, 48, 91,172, 32, 32,216,125, 48, 20, + 34, 62, 7, 89,249, 70, 16, 66,176,124,243, 33,216,136,184, 72,207, 43,104,238, 47,143,114,253, 72, 57, 17,169, 42, 68, 27, 67, + 80,144,203,229, 82,217,136,214, 55,223,124, 19,249,205, 55,223,148, 26, 33, 43, 97,178,222,109, 82,105, 30, 79, 82,199,214,201, +249,222,197,243,103,109,142, 63,177,224,218,147, 28, 12,105, 87, 13,170,220, 36,172,249,124,104, 46, 3, 98, 96,177,217,114,189, + 86,115, 76,171, 85,175, 0, 96, 44,183,210,184,215, 14,150, 8,165,151,183,108,255,197,236,236,234,138,189,183,114, 83,242,212, +102,211,239,205, 86, 38,230,209,133,237, 53,205, 86, 83, 79, 93,230,171,135, 21, 61,137, 91, 9,120,223,252,120, 18, 0,129,213, +106, 5,177, 90,193, 21, 74, 37,206,126, 45, 51, 11, 47,116, 66, 14,139,209,149,188, 2, 16,171, 57, 37, 59,174,252, 48, 40, 3, +192, 78,204,197,193, 27,169, 0,144,201, 86,134,189, 24, 57,180,160,185, 80,103, 16, 42,234,215,170, 69,154, 53,107, 38, 23,137, + 42, 53,252, 21,219,205,205,237,193,194,133, 11,235, 76,156, 56, 81,192,231,243, 97, 54,155, 29,183,109,223,110,221,190, 98, 18, + 6,125,188, 5, 60,190, 0, 90,157, 17, 92, 46, 7,121,249, 42,200, 21, 26, 40, 53,166,170,215,160,216, 88, 67, 22,176,250,196, +113,254,192, 30,210,134,205,249, 44, 30,154, 4,122,224,218,133, 19,228,222,249,157,147,180,178,232, 95, 42, 89, 17,161,210,153, +144,150,163, 67,106,142, 14, 25,121, 58,100,228,234,145,145,167, 3,195, 48,208, 25,204,239,117,227, 82,203,162, 14,239,253,101, + 71, 63,189, 17,195,219,119, 31,136,217,139,183,248,238,221,186,234,114, 28, 97,181,169,100,162,173, 37, 50, 50, 50,225,195, 15, + 63,108,244,235,175,191,178, 27, 52,104,160,125,241,226,133,184,208, 68, 26,165, 82,177,232,231,239,191,185,208,188,121,243, 3, +169,209, 47,175, 22,182,167, 87,120, 97,247,237, 48, 78, 32, 50,134, 79,246,145,180,238,225,231, 46,134,143, 68,217,163,142,244, +201,154,156,206,159,172,204,186,186, 81,150,174, 55, 95,202,210,178, 27,167,170,184,149,202,193, 51,233,117,137,131,134, 12, 7, +155, 97,193,168,211, 36, 22, 85, 46, 87, 59, 62,150,236,123, 9,169,144, 11, 27, 17, 7, 82, 17, 23,109,235, 57,162, 10,215, 51, + 98,178, 88,161,209, 91,160,213,155,161, 51,152,225,236,237,128,159,246, 30, 70,146, 76,139,147, 15,179, 17,149,168, 68, 64, 53, + 9, 8,169,248, 50,105,181,152,212,125, 7,143,178, 97,179, 24,176, 89, 12,171, 94,157,218,200, 85, 25,193,227,176,192, 19,138, + 32, 17,112, 96, 43,226,130,199,227, 66, 38,147, 65,175,215,195,199,199, 71, 88,190, 21, 36,176,145,138, 16, 80,211, 19, 70,147, + 25,103,111, 62,199,138, 89,131,208,173,125, 83, 48, 92, 41, 94,234,131, 97,227,104, 3, 43,139, 5,163,217, 10,131,209, 2,128, +165, 43, 75,207,219,219,187,179, 68, 34,145,104, 52, 26,101, 82, 82,210,245,140,168,227, 73, 22,118,255,201,231, 47, 94,221, 27, +210,171, 27,194, 35, 34,113,228,248,169, 91,217, 78,249,115,138,190, 83,191,126,253,150,206,206,206,210,156,156, 28,197,179,103, +207, 30,188,235,115, 1, 97,177, 62,109,213,182, 35, 84,114, 25, 50,147,227, 43,253, 20, 93,215,215, 6, 95,125,179,165, 73, 96, +237,192, 38, 22, 82, 96,188,234,249,216,224,179,197,155,154,212, 10,168,221,164,168, 67, 72, 93,159,242,135,101,227,136,109,186, +143,153, 56,251,155,126, 67,198,225,234,197, 83, 88,183,226,243,189, 18, 59,151,186,142, 14,118,141, 27,180,236,142, 91,151, 79, + 65,104,227, 14, 7, 39,247,182,163,198,207,232, 58,100,212, 20,220,189,117, 25, 27, 87,125,185,199,162, 87,238,175, 76, 89, 37, +174, 53, 93, 26, 5, 55, 31,105,227,232, 6,121,190, 18, 54, 14,174,168,219,176,217,200,231, 79,244,115,213,178,184,172,119, 54, + 29,132, 64,111, 36,200, 83, 25,145,156,165, 69, 66, 70,129,209,178, 90,171,144, 19,100,177, 50, 82, 33,135,227,104,122,229,243, +244,242, 85,226,235,237,198,172,254,250,115,182, 17, 66,100,201, 11, 76, 86,150,194,128,172,124, 3, 84, 58, 19, 28, 37, 28, 88, + 45,214, 42, 63,117,231,169,140,176, 17,115, 97, 39,230, 85, 58,202, 88, 26, 63,238, 58, 24,248, 36, 58,109,192,186,117, 27,196, +143,227, 74,152, 44,110, 65, 52, 75,192, 99,195, 98,181, 2,149, 56,227,185, 28,238,204,254,189,187, 34, 57, 91, 91,208,107,153, +197, 32, 32,168, 57,156, 69, 86,116, 25, 54, 15, 0,208,183,119, 65,106, 91, 92,186, 26,167,239,101, 1,111, 38,118,151,127, 45, +214,106,217,219,247,157,249,244,240,161, 3,118, 58, 11, 7,219,206, 37, 64,163, 55, 67,200, 99, 67,192, 99, 67,196, 99,191,145, +143, 93,177,209, 42,200,185, 75,202, 54, 65,163,211, 65,161, 53,129, 0,120,240, 74, 5,173,193,140,124,181, 9, 45,235, 56,188, + 95, 32,132, 97,206, 16, 66,250,188,109,136,222, 54, 75, 37, 34, 82,165,105, 60, 44,169, 81,180,126, 89, 70,174,100,206, 22,128, + 42,245,224,226,188,237, 28, 75, 46,243, 36, 14,117,237,108,236,238,157, 63, 23, 42, 61,254,196,138,235, 17, 5, 38,203,164,205, +198,218,185, 35, 82, 20,242,236, 78, 0, 98, 43,251, 99, 98,231,186, 13,133,124,193,213,111, 55,108, 51,186,186,121, 89,143,221, +147,203,242, 53,150, 55,220,132, 69,175,103, 17, 43,225,233, 50, 95, 85,170, 13,129,197, 98,140,139, 63, 30, 8, 43, 33, 88,178, +225, 48, 86,206, 25, 6,169,104,148,152, 97, 24,177, 90,103,198,172,165, 59,176,246,171, 9, 54, 98, 1, 7, 12, 83,144, 19, 53, +102,248,192,202, 85, 64,157, 25,175,239,255,170, 82,198,133,190, 40,217, 92,216,162,109,175, 71, 45, 90,180,144, 59, 56, 56, 64, + 36, 18,253, 30,169, 40, 3, 55, 55,183,175, 22, 47, 94, 28, 56,117,234,212,226,193, 62, 57, 28, 14,166,127,244, 17,203, 98, 33, + 56,119,110, 39, 92,170, 7,227,212,165,123,232,217,185, 25, 84, 26, 29,114,229, 74, 88,193,126,231,138,168,148,103, 95,205, 72, +120,218,188, 77,167,190,184,126,225, 4,185,119,238,231, 73, 85, 25,163,199,193,209, 33, 57,236,233,235,186, 12,227, 88, 16,209, + 42, 52, 89, 6,147, 21,190,110, 98, 36, 39,188,134,189,157, 93,114,101,245, 68, 46,129,253, 25, 22,153,202,128,236, 84,103,198, + 28, 6, 64,212,233, 47, 70, 28,222,191, 61, 34,242,217,227, 21, 33, 35,103,114,186, 15,249,136,189,245,155, 25, 95, 2,168,236, +192,123,198,168,168,168,231, 19, 38, 76,104,125,247,238, 93, 11, 0, 13,195, 48, 38, 54,155, 45, 54, 24, 12,188, 78,157, 58,229, +191,124,249,242, 6, 74, 79, 90,124,131,182, 31, 30,118,102, 4,202, 94,124,171,113,132,175,141,178, 91,167,118,173,208,170,190, + 55,146,219,181, 2,128,153,137, 42,105,160,174,214,142,131, 38,179,232,236,214, 93,167, 87, 78, 26,214,117,214, 94,206,146,117, +233,161, 75,202, 77, 68, 77,126,113,163, 71,105, 54,158,195,102,193, 70,196,133, 84,196,129,141,136, 11, 27, 33, 23, 38, 51,169, +202,147, 35, 49,153,173, 5, 17, 45,131, 25, 42,173, 25, 87, 31,103, 34, 35,223, 0,185,210, 8,173,209, 2, 2, 82,240, 52, 90, +137,171,121,214,171, 59,246, 69,119, 82,123,159,224,252,237,155,191,179, 61,122, 59,165,184, 71,159,157,152, 15, 27,113, 65,111, +236,155, 55,111,194,201,169,226,167,125,171,213,138, 35,231, 31, 96,221,238,171, 56,191,243, 11, 8,121,108, 52,236,191, 20,227, + 6,180,128,149, 88,241, 58, 42, 50, 51,160, 94, 35, 55, 22, 75, 4, 22,195, 64,111,178, 2, 32,101,238, 79,131,193,224,148,148, +148,164,240,247,247,119,247,244,244, 28,194,102,179, 9,148,143,245, 39, 14,228,106,174,132,238, 23,171,181,122,139,216,156,191, +211, 63, 93,219, 7,254,254, 96, 24,134,216,218,218,242,174, 94,189,170, 10, 10, 10,114,121,199, 83,137, 37,114,173,189,113,226, +180, 79,135,212,242,243,195,225,253, 59, 65, 8,115,180,178, 95,222,119,250, 46,190,158,255,102, 15,195,207, 22,111,106,178,118, +233,204, 55,222,155, 54,127, 93,185,189, 14, 69, 2,233,156, 65, 35, 38,227,209,131,223,176,102,233,103, 7,244,170,220,113, 38, +179,233,131,220,244,184, 3, 53,235,181, 0, 49, 42,113,241,208,119, 24, 54,122,146,160,123,200, 16,220,189,117, 25, 43,191,156, +182, 79, 35,151,125,136, 74, 38, 57, 91, 9,119,106,167, 30, 3,184, 90,189, 17,155, 86, 47,194,148, 57, 43,208,178,115, 95,238, +179,199,247,166, 2, 88, 86,233,116, 8,163, 5,157,130,156, 11,204,179,201,138, 83,113,108, 78,105, 53,144,195,102, 88,141,253, +236,161, 53,152,161,168,224,161,146,195,227,102,200,243, 21,213,191, 95,249, 41, 91,173, 51, 35, 43,223, 0, 89,190, 30,217,242, +223, 13, 86,118,190, 30, 89,249, 6,112, 57, 12,162, 99, 19,193,226,114,170,156,159,151,167, 50,161,121,109,135,130,115,244, 29, + 91, 71, 76, 28,219, 22,231,111, 60, 25,180,110,221,122,225,147,120, 37, 34,226, 20,133,145, 44, 54, 4, 92, 22,248,133,255, 91, +172, 5,185,145,229, 97,235,226, 87,115,236,152, 81, 93,108,165, 34,164,197,200,192, 97, 23, 12, 17, 99,231,234, 13, 59,129, 14, + 51,166, 77,134,179,147, 61,146,178,245,216,120, 60, 26, 17,207, 95,193,170,173,218,102,111,218,118,160,231,196,233,159,217,179, +184,124,236,185, 16, 95, 80, 78,182, 5, 47,239,157,214,165,189,126,170, 86, 41,114, 8,136,165,146, 57,200, 12, 49, 91, 10,170, +219,202, 37,243,112, 96,247, 15,184, 16, 38, 43,174,129,183,143,174,197,167,243,151, 35, 91, 97, 64,105,245,178, 60, 63, 2, 32, +171, 68, 36,234, 15,203, 37,204, 81,105,203, 76,225,178,161, 12, 13,195, 91,230,202,240,214,251,134,183,244, 74, 27,251,111,123, +133, 77,135,127, 48, 69,246, 46, 13,196, 66,201,111,231,206,157,150,156,136, 32,197, 38,203,168,201, 38, 43,102,246, 77, 81,200, +179,186, 87,201,100,185, 4, 52, 16,136, 5, 55, 22, 46,223,168,119,243,170,110, 62,251, 88,145,163,212, 89,204,127,204, 65,144, + 88, 36,118, 46, 58, 14, 95,176,142,171, 53, 44,202,206,126,161,174, 40,242,100, 37, 4,161,247, 51, 64, 72,193, 35,210,161,155, +169, 40,124, 50,135,197, 90,208,172,114,233,177, 12,156,194, 60,148,202,134,191,127,220,246,131,162, 79, 80,190,122,228,202, 37, +197,205,133, 45, 27, 21, 68,178,108,109,109, 97,111,111, 15,169, 84,138,138,154, 14, 25,134, 25, 51,113,226,196, 63, 60,253,203, +100, 50,116,237,210, 9,155,127,248, 9,141,186,140,197,165, 59, 23, 96, 52, 89,209,176,158, 31,170,123, 58, 32, 57, 83,249, 78, + 39,186,196, 45,112,122,243, 78, 3,190,108,219,185, 47,174,158, 63, 70,238,157,223, 53,185,170, 3, 33,246,233,218,250,244,215, + 95, 47,169,185,112,197,247, 2, 27, 33, 7, 47, 84, 6,176, 24, 6,190,110, 98, 56, 73, 88,184,126, 98,143,110, 88,223,214,149, + 30, 28,207,219,219,107,239,218,205,219, 37,107, 87, 45,237,244, 40,140,185,170, 74,139,206, 5, 0, 77,102,212,234,151,192,243, +106,191, 93, 60,219,168,195, 64,184,121,250,117,139,203,124, 89,105,179, 1, 64, 19, 27, 27, 27,183,112,225,194,192, 85,171, 86, + 17, 54,155,109, 5, 32,216,176, 97,131, 38, 38, 38,230, 49, 10,186,230,162,162,155, 77,151,110,245,103, 73,249,150,150,142, 98, + 86,125, 63,119, 49, 90,213, 47,104, 21, 29,214,167, 45,188,125,124, 16,155,161,105,156,171,177,114, 85, 6,182,223,150,109, 17, + 15,107, 56,179, 39,153,181,134,231, 0, 78,190, 67,179,105,113,130,124, 81, 52,203, 70,196,133,181,160,174, 84,201,104,233,141, + 22,104,245, 22,104, 13,102,168, 13, 22,104, 12, 22, 88, 73,193, 57,193, 48, 12,140,102, 43, 42,245,216,252, 86,221,183,117,116, +134, 95, 13, 6,182,226,130,178,217, 22, 14,247,192, 0,112,114,114,130,171,171,107,165,162,162, 6, 99,193, 41,110, 48, 89,139, +155,245, 13, 70, 51, 8, 33,136,142,142,250, 34, 33, 46,174,191,127,128,127,251,122, 13, 27, 57,138, 5, 44, 0, 40,211,104,105, + 52, 26,139,141,141,141,171,163,163, 35, 43, 53, 53,181,216, 60,251, 55,238,100, 62,126,236, 40, 6, 13, 26,168,122,241,224, 73, +113, 23,119,173, 86,203,180,105,211,198,214,219,219,155,165,215,235, 21, 85, 61, 76, 18,151,218, 3, 28,156, 28, 87,140,249,112, + 74,237, 78, 93,123,226,218,149,139, 56,121,236,215, 95, 52, 89,209, 23, 43, 43, 18, 24, 88,231, 15,189, 14,107, 5,212,254, 67, +175,195,234, 53, 3,202, 53, 90,245, 26, 54,107, 65, 24, 14, 46,132, 30, 34, 58,150,113, 26, 0,171, 69,167, 60,116,240,199,175, +150,141,152, 58,191, 86,239,126, 35, 48,102,244, 56,112, 56,108, 92,191,116, 26,107,151,206, 62,163,202,151,141,173, 76,154, 64, + 65,232,173, 46,207, 75,228,253,137, 79,173, 6, 8,187,119, 11,175,163,159, 69, 62,121,120,183,190,127, 80, 75,184,120,250,126, +146,232,204, 94,133, 23, 47,140, 21,201, 24,116,186,196,113, 99, 71,163,100,175,195, 86,193,129, 78,204,219, 39, 0, 0,141, 82, +102,252,249,187, 89, 49, 69,189, 14,173, 70, 67, 98, 89,186,249,121, 89, 71,174,223,185, 63,167,127,159,158,172,108,133,161, 32, +130,149,111, 40,124,233,145, 93,244,191, 66,143, 0, 79, 41,162, 34,195,172,186,252,236,163, 85, 60, 47,117,227, 62,232,241,188, +168,238, 90,173, 4, 12,160,171,114,179, 20,215,118,242,234, 53,235,132, 79,226, 84,136,136, 87, 20, 52, 21,114,217, 5, 6,139, +203, 42, 54, 93, 5,189,217, 43,136, 14, 49,236,149,227,199, 14, 71,182,194, 8,171, 21,224,176, 89,133, 47, 30,146,148, 12,146, +149, 26,100,231,101, 33, 46, 33, 17,242,140,215, 96,177, 88,112,246,172, 93,233,145,164, 45,132,239,161, 49,144,160, 33,125,218, +115,142,253,150, 14,177,128, 3,189, 50, 19,231, 14,126,151,165, 87, 41, 86,104, 53,170, 99,149, 25,207,241,247, 20, 4, 38, 75, +161,210,185, 9,184,108, 28,222,253, 61, 62, 24, 55,237,141,171,239, 23, 11,190, 6, 88, 12,114,243,148, 96, 24, 38,171,106,215, + 37,230, 97,121,203,239, 24, 25,123,111,141, 82,204,214, 31, 31, 20,202,126, 26, 37,231, 46,158, 63, 45,185,157, 32,192,131,168, +244, 66,147,149,101, 93,254,113,159, 20,101,126,110, 15, 0,209, 85,123, 46,100,245, 24, 54,126, 78,164, 95,237,122,250,107,207, + 84,241,114,181,169,204, 60,135, 86, 67, 22, 70, 62, 58,179,185,119,190, 41,246, 35,137, 71, 61,139,213,108, 94,173,205,138, 94, + 90, 70,211, 33,127,233,198,195,197,205,134,115, 87,237, 41,248,223, 98,129,133, 88, 65,172,192,140,175,126,132,217,106,129,213, + 98,129,213, 66, 96,178, 16,113, 69,197,117,245,172,126, 44,239,229,161, 58, 35,151,253,177,185,208,222,222, 30, 78, 78, 78,112, +114,114,130,173,173,109,133, 70,139,203,229, 74, 57,156, 55,119,117, 98, 98, 34, 18, 18, 18, 96,107,107, 11, 98, 53,193, 96, 2, + 26,180,236,142,167,175,159,225,242,237,199, 32, 86, 11, 36,210,170,207,242, 34,113, 11,252,168, 89,199,254,223,119,238, 55, 1, +151,142,109, 35, 15,111,158,158,162,149, 69,239,168,116,132,222, 98, 97, 76, 38, 19,250,116,239,152, 24, 30,249,234,252,130, 57, + 83,123,182, 14,153, 34,104, 21,232, 5,157,193,130,148,132,215,184,126, 98,151,174,118, 77,143, 11, 93,218,181, 72, 52,153, 76, +176, 88, 44, 21,222,200,117, 6, 99, 54,155, 43,146, 12, 31, 62,146,251,240,193,131,163, 18,151,128,195, 22,134,245,132, 33,214, +134, 12, 33,131, 26, 54,172, 11,163,201, 10,141, 70,145, 87,213,109, 86, 42,149,113, 59,119,238,172, 57,118,236, 88,113,189,122, +245,184,175, 95,191,198,218,181,107,115,148, 74,101, 92,101, 53, 46,222,140,218,192, 97,242, 98,138, 34, 90, 73,109, 91, 97,120, + 72, 91, 28, 56,115, 27,215,111,221, 69,162, 74,250, 88,101,230,156, 72, 78, 76,211,215,119, 84, 28,237,215,170, 58,251,240,238, +188,163,145, 29,231, 13, 37, 68,112, 49,251,198, 18,117,229, 79,110, 64,169, 53,193, 86, 92, 48,222, 83, 81,100,139,205, 48,149, +118, 68, 12, 16,119,235,110, 88,131,166, 1,245, 16, 30,151, 15,153, 92, 15,173,222, 12,171,149,192, 10, 2, 39, 27, 62,132, 60, + 22,146, 18,226, 96, 37,198,248, 42,222, 42,178, 58,180,239,192, 1, 24, 48, 12,225,112, 57, 28, 16, 20,140,175, 40, 18,137, 84, +174,174,174,149,138,104, 25,205,102, 12,234,217, 2, 45,155, 53, 68,255, 41, 5, 99,102, 94,249,101, 30, 28,164, 92, 28,216,187, + 3,201, 55, 55,236,173,217,106,234,197,103, 79, 35, 7, 71,134,255, 54,178, 87, 19, 81, 99,119, 78, 26,175,172, 48,169, 90,173, + 62, 10,128,207,227,241,122,182,111,223,222,241,232,209,163,114,103,103,103, 43,159,199,203,234,215, 55,196,202,229,241,114,139, +214,189,115,231, 14,119,202,148, 41, 54,121,121,121, 73,153,153,153,119, 1,152,202,127, 16, 12,236, 10, 22,126, 5,195, 8,165, + 34,113, 98,141, 26,126,158,205, 90,182,176, 27, 48,232, 3, 8,248, 2, 92,186,120, 30,155,214,175, 58,164, 74,127, 49,190, 42, +123,242,207,234,117,152,146, 20, 31,167,209,234,131, 26, 52,237,200,220,186,120, 98,166, 17,206,235,217, 2,227,119, 93, 7, 77, +171, 21,151,166,194,166,111,190,128,131,157, 4,241,175, 95,106, 99, 94, 60,253,209,164, 83,124, 81,105,147, 5, 64,156, 99, 25, +220,106,116, 79, 7,189,209,130,155, 87,207,232,172,102,107,207,187, 55,206,190,174, 86,187,153,176, 65,179, 46, 14,217, 39,119, + 12,210, 0, 7, 42,210, 73,125,249,199, 8, 46, 49,200,227,175, 92,189,108,231,230, 91,159,205,128,129, 81,175, 67, 86,236, 67, +179, 38,243,165, 66,145,250,172, 82,189,112,115,146,241,213,252,197,223,126,212,172,105, 83, 9,129,240,141, 8, 86,145,193,202, + 86, 24,224,108,195,135, 86,145,133,152,135,231,117,154, 44,118,185,227,157,153, 13,106,113,182, 44,147,255,123, 58, 67,116,203, +242,214,207,150,101,242,205, 6,181,184,226, 91, 29, 27,182, 18, 62,158,198,167, 22, 39,190, 11,184, 5,185, 89,124, 46,187, 56, + 79,171,232, 90, 80, 1, 29,121, 66,123,164,230,232,192,128,192,106, 49,195,108, 50, 64,169, 80, 32, 53, 45, 3,153, 25,153, 80, + 42,229, 16, 75, 29,208,160,113,115,216, 72,132,120,114,253, 16, 8, 33,149, 26,215,208,196,112, 3,155,181,108, 39,120,150, 80, +144,139, 37,228, 18,156,254,117, 85,142, 74, 33,107,167, 74,143,137,169,234,181,216,108,177, 92,142,120, 30, 83,191,154, 71, 13, +230,241,235,124,236,253,105, 51, 12,133,145, 77,147,201,130,103, 73,106,164,231,106,144, 20,251,130, 88, 45,150,203,248,143,192, + 41, 59, 0, 8, 78,195, 6,117,209,125,212, 0,252,240,195,143,136,141, 75,176,174,152,217, 59, 73,165,148,247,170,130,201,234, +138,194,177, 54, 52,153, 81,171,181, 14,205, 82, 78,133,231,178,180, 6, 82,110,130,143,208,197, 23,237,198,175,189,160, 85,230, +242, 45,122, 13,231,244,222,241,191,150,166, 89,224,160, 97, 88,241,217, 48, 72, 69, 28, 48, 12,131,162,230,194, 45, 95, 79,134, + 88, 80,208,182,172,213,155, 49,106,214, 58,236, 93, 55, 27, 4,192,136, 15,110,107,202, 42, 39, 10,230, 46,156,225,129, 7,213, + 18, 19,100,169, 93,251,126,118, 69,103, 20,232, 67, 6,142,125,212,180,105, 83,185, 72, 36,130, 72, 36,130,173,173, 45, 28, 28, + 28, 96,111,111, 95,225,182,155, 76, 38,149,193, 96,112,226,243,249,176, 90,173,136,143,143, 71,124,124, 60,242,243,243,145,149, +149, 5,181, 74, 97,126,112,229, 48,167, 65,171,222,240,244, 11,130,111, 64, 35,112,217, 12, 56, 28, 22,174,159,250,169,172,114, +150,110,178, 58,244,219,210,165,255, 68, 92, 58,182,157, 60,188,121,122,170, 86, 22,253, 83,101,143, 81, 97,115,207,147, 65,131, + 6, 5, 77,153, 50,133,183,120,206,148, 11,103, 46, 94,143, 62, 28,186,189,111, 94,158,220,155, 16, 2,123, 59,187,228, 97,125, + 91,159,238,212,166, 89,226,149, 43, 87,172,191,254,250,171,158, 97,152,167,229,105, 22, 92,164,100,191, 92,185,124,117, 73,187, + 14, 29,177, 99,247,175, 29, 34,159,191,232,240,250,117, 12,188,125,253, 80,163,102, 0, 52,140, 3,174,222,184, 5,149, 92,246, + 75,101,202,249, 86, 84,139,201,203,203,251,109,216,176, 97,221,111,223,190,205, 26, 54,108,152, 38, 59, 59,251, 78,137, 40, 22, +169, 72,243,238,214,129, 89, 0,126,241,237, 48,238, 80,170, 81,254, 9,128, 85, 62,190, 62,184,126,235, 46,238,222,190,255, 99, +182,216,103,233,248, 81, 31, 78,174,222,143, 61,177, 95,171,234,108, 87, 7, 49,246,111, 95,203, 62,117, 55, 97, 93, 66,142,101, +199,170, 27, 75,190,174,204, 49, 42,190,113, 40,141,104, 83,215, 17, 38, 11,129,149, 20, 92,112,109,132,220,178, 46,188,127,208, +228, 24, 4,227,167, 78,153,242,186, 65,195,198,159,142,250,112, 42,175,177,159, 55, 30,188,146, 3, 12, 3, 71,119, 9,210,211, +211,113,243,200,118,115, 94,234,203, 31,217,108,235,178, 42,236, 79,228, 37, 62,246, 47,177, 56, 57, 59, 59, 27,215,175, 95, 71, +145,193,114,113,113, 41,203,104,189,161,153,147,153,118,231,235, 53,219,218, 76, 26, 51, 16, 33, 29,235,227,198,195,215, 48, 20, +142,215, 84,212,149, 60,238,238, 86,254, 39,195,252, 12, 31, 13,170,173,208,154,248, 9, 95,197,231,223, 68,193, 28,172,214, 50, +202,105,200,205,205, 61, 21, 21, 21,213,182, 81,163, 70,213,207,158, 61,155, 27,121,255,194,204,146,133,248,236,179,207,164, 63, +252,240,131,152, 16,114,199, 96, 48,196, 86,106,219, 89,216, 31,246,232,145,147,209,100,197,173,251, 79,234,118,105,211, 24, 86, + 2, 60,124,248, 16, 59,126,222,161,123, 26,241,248, 59,117,166,251,178,114,204, 75,169,251,211,242,126,189, 14,139, 53,211, 83, + 19,190,187,116,230,200,222,102, 29,250, 98,228,140,101,203,174,159,249,117, 73,147,118, 33,172,186,205,186, 35,236,238, 85, 92, + 62,123,254, 91,163, 42,119, 9, 42,206, 29, 41,181,156, 2,145,248,227,122, 77, 58, 32, 41, 49, 1,241, 49,207,126,209,229,190, + 74, 75,124,205,254, 37, 45, 37,113,106,205,250,109,112,251,194,129,153,229, 24,173,114,235,188,183,139,104,251,217,208, 83,195, + 83, 82,182,186,171,181, 58, 1, 33, 68, 39,224,115, 50,164, 44,229, 65, 69,165,203,249,194,152,149, 86,125,208, 7,163,166,158, +217,180,105, 61,215,205, 94,140,140, 60, 29, 20, 90, 35,148, 26, 35, 88, 12, 3,127, 79, 9, 52,202, 92,220, 56,178,198,100, 80, +229, 13, 3, 94, 27,203,210,148,184, 6, 46,207,123,117,117,198,103,211,174,129,111,231,237, 89,163,243,252,114,163,117,202,212, +199,125, 63,155,118, 58,144, 16,210, 69,226, 26,168, 84,203,162, 22,150,181,237, 12, 83,112,126,143,236,228, 13,163,185, 96,252, + 49,179, 21,176, 88,173,133, 81, 62,128, 20,183,231, 51, 21,108, 59, 99, 61,120,230, 14,210, 50,229,208, 26, 76,208, 27,204, 48, +154, 44, 96,177,217,176,119,176, 71, 64,141, 96,216,217,219, 34, 51, 35, 13,119,175,156, 66,116,196,141, 59, 12,193, 82,109, 86, +204,149,202, 28, 35,158,200, 62,208,195,211,157,149,174, 48, 64,196,103,227,241,141,179, 70,147, 65,255, 93, 37, 77,214, 31, 52, +229, 57,185,235, 62,157,243,249,136, 93, 59,119,187, 7,213,180, 69, 74,182, 22, 41, 89, 58, 40,117,166, 66, 35,102,133, 94,149, +141,136,171,187, 51, 44, 58,229, 58,252, 71, 40,211,104,153,141, 58,229,209,243, 15,156,230, 45, 89,195,126,245, 58,214,180,252, +147, 62, 41, 90,149,162,119,149, 35, 89, 37,216, 53,189,230,129,191, 98, 35,254,208, 92, 72,172,176, 18,130,211,247, 51,138,155, + 11,173,133,153,151,225,175,203,159, 70,176,228,220,133, 29,123,207,188, 20, 17,165,220,167,213,102,218,189,124,245, 93, 30, 0, +176,217,236,226, 87, 81,110,150, 78,167, 51, 84,208,132,178,231,167,159,126,154, 59,117,234, 84, 65,114,114, 50, 94,191,126, 13, +185, 92, 14,161, 80,136,243,231,207,155, 96, 53,127, 23,113,251,120,124, 84,216,197, 69,129, 77,187, 87, 11,106,213, 27, 98,177, + 4, 28, 82,249,100, 76,177,107,237,225, 77, 59,244,251,190,203,128, 73,184,124,252, 39,242,240,198,169,105,218,172,232,237, 85, +221,151,114,185, 60, 18, 64,204,119,223,125,215,120,199,142, 29, 53,231,204,153, 19,187,231,251, 37,155, 0, 32, 39, 39, 7, 0, + 16, 30, 30, 78,166, 77,155,166,215,233,116,113,121,121,121, 97,168,160, 3, 4, 0,104,179,196, 43,119,108, 89,213, 32, 57, 53, +125,160, 95,131,230,112,169,217, 28,238,254, 45,144,167, 52,226,193,171, 52,196,190,184,130, 23,183,142,156,213, 72,205, 75, 80, +197,241,141, 27, 53,106,228,205, 98,177,106,168, 84, 42,247,122,245,234, 53,146, 72, 36,225,141, 26, 53, 10,230,112, 56, 41,143, + 30, 61, 74,168,138, 86,226,141,221,122,223, 14,227, 54, 38, 42,109, 58,197,102,104,130, 19,149, 54,225, 26,129,221,236,172,171, + 27,245,187,216, 94,235,136, 49, 59,242,240,110,197,209,253,219,215,178, 71, 77,254,204,242, 44,223,225, 19,142,136,127,169,106, +225,106, 86,250, 71, 99,251,255, 62,188, 67, 97, 36,171,240,255, 74,133,233,243,243, 35,242, 1,204,141,120,206,253,254,217, 39, + 83,190,110,216,172,205,232,246,189,134,177,204, 60, 41, 46, 28,223, 74,226, 34,174, 30,230, 16,203, 2,109, 37,102, 3,168,176, + 57,200, 96,168,140,201,250, 99, 25,147, 37, 29, 15,255,250,243,184,163,199,143,125, 51,160, 95,127,167, 45, 95, 13,197,154,109, + 39, 32, 17, 9, 64,172, 86, 12,237,228, 61,100,209,196, 58,125,189,221,132, 94, 71,175,165,220,156,177,254,217, 92,141,198, 24, + 93,137, 72, 12,201,206,206,190, 37,149, 74,179,218,182,109,219, 82, 32, 16, 48,217,217,217, 28, 87, 87, 87,179,157,157,157, 33, + 37, 37, 69,163,215,235,143, 2,168,210,176,227, 70,147, 21,241,153, 58,156, 60,118, 20, 79,238, 95,193,139, 23, 81,202, 23,207, + 95,108,102, 56,100,189, 58, 51, 38, 23,168,242, 3, 62,172,165,246, 58, 36, 85,238,117,104,209, 43,247,239,249,113,121,103,141, + 78, 63,174, 81,235, 62,168, 94,183, 13,203,104,178,224,233,195,107,184,118,100,253, 26,163, 42,119,222,251, 28, 99,207,106, 53, + 3, 8,155,143,223,174,159, 1,177, 90,127, 4, 0, 98,181,254, 24,126,251,236,212, 22,189, 39,194,209,181,122, 35,121, 82, 56, +131,119, 24, 61,156,199, 97,169,207, 29,221,117, 60, 62, 62, 30, 47, 95,190,196,171, 87,175,144,155,155,139,253,251,227,171,116, +124, 52,121, 9,151,162,159,179,122, 12, 30, 58,242,244,144,225, 99,132, 53, 3,130, 88,129,213, 28,224, 36,229, 32,234, 85, 2, +162, 31, 69, 88,163, 30,156,213, 25, 21,178, 1,218,188,132, 50,141,159,216,185,174, 27, 96,153, 87, 52,119, 97,171, 86,109, 2, + 63, 95,241, 77, 75, 39, 23,215, 82,175,227, 57, 89, 50,254, 23, 51, 78, 5,222,189,247, 91,165,230, 58,180, 90, 44, 57,147,199, + 13,179,178, 11, 38, 10, 69,113,156,186,112,239, 21, 60, 76, 21,188, 79,172,230, 10, 35,248, 31, 14,108, 7,179,213, 10,181,214, + 8,133, 90,143,124,165, 14,233,178, 28, 60,137,136,192,141,211,167,240, 58,234, 73,156,201, 96,184,200, 98, 49, 71,180,153,209, + 55,170,214,210,196,169,233,228,232,136,184, 92, 21,132,124, 14, 18,162, 31,233,213,138,252,125,239, 90,143,180, 57, 49,233, 50, + 54,211,125,216,176,225,231, 59,247,232,103,215,172,117, 87,177,179,173, 61,120, 28,130,152,248, 52,132,221, 57,175,142,125,114, + 83, 97, 50,168,122,254, 25,179,190,252,205,169,184,215,161, 81,175,238, 59,162,127,135, 99,108, 54,135,111,181,154,245, 70,131, +126,240,251,152,172,191, 10, 66, 44, 41,227, 70, 12,124,227,217,192,108, 37,162, 17, 31, 92,208,150,124, 86, 48, 89,136,120,196, + 7,119, 52, 5, 23,144,178, 19,251, 60, 60, 28,251, 20,205, 93,152,152,152,243, 48, 55, 87,127, 13, 64,138, 78,167,123,231, 50, +102,102,102,126,189, 98,197,138, 16,141, 70, 83,167, 99,199,142, 2, 91, 91, 91,228,228,228,224,226,197,139,166,208,208,208,231, + 50,153,108, 17, 32, 51,107, 17,252, 75,132,238,248,216,168, 71, 23, 23,213,105,218,163, 90, 80,235,222,149,191,152, 9, 68,147, + 58,247,155,192, 92, 62,241, 19,121,112,253,196, 71,218,172,152,109,239,177, 91,141, 58,157,238,190, 78,167,123,182, 96,193,130, +102,110,110,110,110,139, 22, 45, 18, 42, 20, 10,238,150, 45, 91,116,217,217,217, 25, 10,133,226, 46,202,201,167,249, 35,225,166, +252, 84, 12, 58,119,244,167, 78,228,232, 79,221,236,157,189,186,219,185, 84,171, 37,207, 74,141,203,207, 74,187, 8,224,114,225, + 64,145, 85,162,113,227,198,126, 12,195, 12, 3,208, 64, 34,145,248, 75,165, 82, 1, 33,164, 14,195, 48,145, 86,171, 53,162, 94, +189,122,161,207,159, 63,175,210, 96,178,137, 55,118,235,189, 3,219,252,154,171,177,242, 12, 44,222,175,137, 55,118,235, 1, 64, +118,233,115, 13,128,147,207, 59,206, 29,116,234,110,194,166,200, 60,187,153, 89,215,191, 57, 85,213, 50,231,167, 60,241,255,179, +234,191, 46,253,121, 10,128,113, 17,143,176,246,105,248,221,197, 12, 1,215, 2,243,114,173,236,213,163, 63, 67,159,203,229,234, +188,188,188, 74,237, 93, 40, 16, 8,116,122,125,121, 1,148, 27,102, 85, 58,118, 0, 29,118, 31, 59,180,123,220,137, 83, 39,191, +105,223,101,128,147,176, 90, 53,212,112,101,176,123, 94,147,153, 87,194,179, 30,244,251,252,230, 15,177,105,186, 8, 84, 49, 31, + 70,165, 82, 69, 3,200, 83,169, 84,253, 9, 33,201, 12,195,120,231,229,229, 61, 54,153, 76, 79,171,108, 8,172, 24,217,170, 85, +243,253, 12,195,112,136,217,186,250, 46,151,253,171, 46,253, 69, 10,222,115, 90,146,160, 26,182,152,181,104, 99,147, 90,254,181, +155, 20,205,117, 88,191,186, 13,166,204, 93,219,164,122,205,128, 38,191,207,127, 88, 97,154, 0, 49,105,242,198, 31,251,121,245, +205,240,123,215,190,116,246,168, 94, 61, 35, 37,246, 69,242,171,199, 95, 91,116,138, 99,239,123,156,227, 95, 69,174,223,241,221, +220, 57,233,169,113, 59, 52, 89, 49,207, 0, 64,147, 21,243,236, 69, 24,190,202,206, 72,153,147, 35,139,253,238, 93,247,133, 90, +173, 78,219,183,111,159,125,155, 54,109, 88,110,110,110,200,202,202,194,181,107,215,172, 86,171, 53,181,202, 90,185,113,215,212, +185,140,227, 47,219,190, 95,205,147,216,244, 54,155,205,158,132, 0, 28, 14, 39,221,160, 81,156, 87,178, 36,159, 35, 47, 65, 87, +254, 61,195,202, 0, 96, 21,205, 93,104,181, 90,153,213,155,118, 39,112,133, 54,165, 14,134,104,210, 41,197, 86,171,181,210,115, + 29,202,147,194,106,253, 89,231, 55, 67,200,210, 70, 77, 91,126,105, 50, 25,117,133,231,135, 14,128,142, 16,228,176, 88,204, 13, +182,213,116, 65,241, 30, 15, 83, 12, 3, 91,194,112, 96, 35,226,128, 1, 3, 85,126, 46,169, 74, 78, 86,169,134, 88, 22, 29,169, +145,117,240, 61,103, 56, 52,246,234,165,179, 31, 88, 44,150, 26,133, 49,131,120,189, 86,125, 88,149,238,240, 11,240,200,140,127, + 63,103,138,204, 22,243, 23,255, 80,165,154, 81,254, 78,154,129, 53, 69,253,171,121,185,141,141, 79,144, 61,136, 77,214,252,130, + 55,167,213,121,159,114,178,221,220,220,190, 98, 24,102, 52,159,207,151, 26, 12, 6, 53, 33,100, 79,102,102,230,215,248,195,228, +191,193, 92,145,171,118, 44, 95, 40, 94,104,212,169,127,211,200,162, 71, 86,180,237, 98,151,218,221,133, 18,201, 92,157, 86,189, + 71,147, 25,189,251, 79,222,159,118, 2,129, 32, 88, 42,149,114,179,179,179,239, 3,200,255, 59, 29,247, 70,141, 26,249,176, 88, +172, 26, 86,171,213, 13,128, 29, 10,122,133,100,115, 56,156,212,194,136, 22,169,170,102,219, 15, 15, 59,119,233, 86,127,214,197, +155, 81, 27, 10,155, 21,139,241, 26,178, 78, 56,186,119,167,207,126, 57,118,178,180, 94,135,255,184, 58,255,255,167,217,129, 35, +245,200, 30,199,226,219, 45,239, 18,168,211,100,167,165, 78,187,245, 52,235, 62, 0,229,251,148,147,199,227,141, 50, 26,141, 34, + 30,143,167, 53, 26,141,251,254, 46,219, 46,114, 13,156,192, 2,169,244,204, 20, 86, 48,143,222,234,180,242,111,169, 75,236,160, +160,160,118, 60, 30,207,199, 98,177,136, 13, 6,131, 70,171,213,198, 39, 36, 36,252,134,178, 39, 62,255, 75,203, 41,113, 13, 88, +207,227, 9, 62, 1, 0,163, 81,191, 81, 45,139,153, 85,222, 23,203, 89,255, 31,125,140,156,107, 52,141,225,176,185, 46, 40, 28, +152,219,106, 54,103,101,198, 61, 12,248, 31,150,243, 95, 7, 33,228, 47,255,141,174, 84,147,106, 82, 77,170, 89, 10, 44,186, 63, +169,230,255, 82, 83,232, 81,215, 91,232, 81,183,210,131, 46,151,177, 62,221,159,148, 34, 38,151,242, 2, 33, 4, 28,186,111, 40, + 20,202,255, 0, 43,221, 5,148,255, 37,186,244, 23,201,127,229,250,148,255, 28,101,230, 68, 51,229,184,210,170,132, 4,223,197, +217, 94,166,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 34,237,127, 98,147,228,228,183,150,207, 0, 72,167, 77,135, + 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,187,104,254,155, 40,110, 58,100,209,125, 65,161, 80, 40, 20, 10,133,242,215, 64, +115,180, 40, 20, 10,133, 66,161, 80,222,143,210,154, 14,169,209,162, 80, 40, 20, 10,133, 66,249, 19, 40, 51, 25,158, 54, 29, 82, + 40, 20, 10,133, 66,161,188, 31, 69, 17, 45, 15,148, 24,222,129, 26, 45, 10,133, 66,161, 80, 40,148, 63,143,116,148, 22,221, 10, + 13, 13, 37,165,253, 79,161, 80, 40, 20, 10,133,242,255,193, 63,220,139,148,140,100, 77, 46, 92,126,179,215, 33, 53, 88, 20, 10, +133, 66,161, 80,254, 46,102,235, 31, 70, 81, 36,171,232, 85, 60,105,118,177,209, 10, 9, 9, 97,168,217,162, 80, 40, 20, 10,133, +242,191,226,223,232, 69, 88,111,111, 32, 61,204, 20, 10,133, 66,161, 80,254,151,102,235,223,180, 61,116,120, 7, 10,133, 66,161, + 80, 40,148,247,195, 3, 64,159, 18,203,103, 80,162,249,144, 66,161, 80, 40, 20, 10,133,242,238, 76, 46,109,153, 16, 66, 35, 90, + 20, 10,133, 66,161, 80, 40,127,129,217,162, 80, 40, 20, 10,133, 66,161,252, 85,252,127, 76, 42, 77,103, 54,167,154, 84,147,106, + 82, 77,170, 73, 53,169,230,191,157,162,113,180,128, 18,227,104, 1,116,100,120, 10,133, 66,161, 80, 40,148,247,165, 15, 10,198, +207,154, 92,248,183, 15, 53, 90, 20, 10,133, 66,161, 80, 40,127, 46,127,152,126,135, 26, 45, 10,133, 66,161, 80, 40,148, 63,215, + 96,109,167, 70,139, 66,161, 80, 40, 20, 10,229, 47,134, 26, 45, 10,133, 66,161, 80, 40,148,191, 8, 6,101,247, 28,184, 92, 5, +157,119,233,125,112,153,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180, 47,227,159, 71,209,200,240,103,240,123, + 34,252,118, 66,254,250,105, 27,105,215, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,153,252,214, 95, 0,255, 63,227, +104, 81, 40, 20, 10,133, 66,161,252,215,204, 86,177,225,162, 83,240, 80, 40, 20, 10,133, 66,161,188, 31,219,203,250,128, 70,180, + 40, 20, 10,133, 66,161, 80,222,143,201,101, 45, 83,163, 69,161, 80, 40, 20, 10,133,242,215, 24, 46,106,180, 40, 20, 10,133, 66, +161, 80,254, 68,147, 53,185,212, 79, 67, 67, 67, 9,221, 71, 20, 10,133, 66,161, 80,254, 87,252,219,188, 72,241,240, 14, 69, 27, + 70,205, 22,133, 66,161, 80, 40,148,255,165,201,250,135,122, 17, 15,252,222,219,112,114,225, 50, 8, 33,180,215, 33,133, 66,161, + 80, 40, 20,202,123,210, 7,111,246, 60,156, 92,180, 76,141, 22,133, 66,161, 80, 40, 20,202,251, 51,185,220, 79,105,179, 33,133, + 66,161, 80, 40,148,255, 37,255,198, 28, 45,134, 30, 86, 10,133, 66,161, 80, 40,148,247,162,180,104,214,255,203, 92,135, 20, 10, +133, 66,161, 80, 40,255, 73,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 95, 96,178,138,140,214, 95, 61, 96, 41,157,217,156,106, + 82, 77,170, 73, 53,169, 38,213,164,154,255, 21,147, 85,114,136, 7, 0,180,215, 33,133, 66,161, 80, 40, 20,202,251, 66, 39,149, +166, 80, 40, 20, 10,133, 66,249,139,160,147, 74, 83, 40, 20, 10,133, 66,161,252, 63, 27, 46,106,180, 40, 20, 10,133, 66,161, 80, +254, 68,147,245,134,217,162, 57, 90, 20, 10,133, 66,161, 80, 40,239, 71,153, 57, 90, 12,202,238, 57,112,185, 10, 63,240, 46,189, + 15, 46, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246,101,252,243,153,140,255,167, 1, 75,105,215, 87,170, + 73, 53,169, 38,213,164,154, 84,147,106,254,215,152, 12, 20,140,163, 69,155, 14, 41, 20, 10,133, 66,161, 80,254, 4, 99, 85, 26, +212,104, 81, 40, 20, 10,133, 66,161,188, 31,116, 28, 45, 10,133, 66,161, 80, 40,148,191, 8, 15, 20, 68,181,138,254, 6, 83,163, + 69,161, 80, 40, 20, 10,133,242,231,208, 7, 5, 81,173,162,191,212,104, 81, 40, 20, 10,133, 66,161,252,137,148, 58,142, 22, 3, + 0,161,161,161, 69,253, 15, 59,134,132,132,220,160,251,138, 66,161, 80, 40, 20,202,255, 39,255, 70, 47, 66, 8,249, 61,162, 21, + 18, 18,194, 0,184, 78, 15, 53,133, 66,161, 80, 40,148,255, 5,255, 70, 47,194,122,203, 73,118,164,135,153, 66,161, 80, 40, 20, +202,255,130,127,163, 23,225,188,229, 34, 41, 20, 10,133, 66,161, 80,254, 39,252,131,189,136, 7, 10, 18,225,207, 20,254, 5, 10, +135,124,160,227,104, 81, 40, 20, 10,133, 66,161,188, 31, 69,189, 13, 39,227,173, 49,181,104, 20,139, 66,161, 80, 40, 20, 10,229, +253, 40,109,100,248,255,151,185, 14, 41, 20, 10,133, 66,161, 80,254,147,208,185, 14, 41, 20, 10,133, 66,161, 80,254, 28, 74, 70, +181,182,255,127,253, 40,157,217,156,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 37,147, 85,188,252,198, 56, 90, 20, 10,133, + 66,161, 80, 40,148, 63, 23,218,116, 72,161, 80, 40, 20, 10,133,242,126, 20,245, 56, 44,185, 76,141, 22,133, 66,161, 80, 40, 20, +202,159,104,182,254, 0,109, 58,164, 80, 40, 20, 10,133, 66,121, 63, 38,151,245, 1, 53, 90, 20, 10,133, 66,161, 80, 40,127,145, +225, 98, 80,118,207,129,203, 85, 16,126,151,222, 7,151,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,172, 72,251, 50, +254,121,252,207, 6, 44,165, 93, 95,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,132, 14,239, 64,161, 80, 40, 20, 10,133, +242, 23, 82, 21,163,229,194,225,112,190, 20,137, 68, 63,136, 68,162,109, 28, 14,231, 59, 0, 14, 85,253, 65,137, 68, 50,211,221, +221,253,165,187,187,123,138,143,143,207, 89, 27, 27,241,167,126, 2,180, 7,192,253,147,182, 39, 16,192,167, 34,145,232,133, 80, + 40, 76, 0,176, 23,192,167, 0,156,223, 71,248,107, 79, 12,126,246, 73,255, 19, 95,123, 98,240, 91, 31,245,113,115,115,187, 5, +160,251,159,117, 80,134,139,209,117,136, 4, 73, 67, 36, 72, 26, 46,126,247,167, 6, 27, 27,155,209, 30, 30, 30,119,157,156,156, + 82, 61, 60, 60,238, 8,133,194, 33, 85,148,112,117,115,115, 91,227,237,237, 29,237,233,233,185, 1, 5,179,147,255,109,105, 39, + 64,187,150, 2,100,181,226, 67,217,134,143, 31, 90,241,209,173, 27, 32,126, 71,185,182, 0,142,216,218,218, 62,230,112, 56,161, + 0, 6, 21,214,175, 65, 28, 14, 39,212,214,214,246, 49,128, 35,133,235,189, 75, 61, 93, 3, 32, 21,192,202,194,229,143,189,189, +189,149, 13, 27, 54, 76,104,216,176,225, 46,127,127,255, 49,149, 21, 19,139,197,221,188,189,189,143,250,248,248, 36,180,106,213, + 42,215,203,203, 43,170, 90,181,106,187, 5, 2, 65, 71,122,137,163, 80, 40,148,191, 63,125, 1,124, 3, 96,115, 68, 68, 68, 24, + 33, 36,140, 16, 18, 22, 17, 17, 17, 6,224, 7, 0,171, 80,118, 8,241,141,247,157,156,156,150, 46, 95,190, 92,151,158,158, 78, +178,178,178, 72,116,116, 52, 89,191,112,174,181,135, 35,135,248,185, 56,104, 60, 60, 60, 94,251, 86,171,118,160,190,148, 53, 23, + 64,173,202,104,150,192, 65, 36, 18,221, 95,184,112,161,234,214,173, 91, 42,131,193,160,178, 90,173,170,180,180, 52,213,229,203, +151, 85,109,218,180, 81, 1,152, 5,128, 93, 5,205, 98,150,121,226, 6,249,249, 43,178,204, 19, 55, 74,190, 95,167, 78,157,231, + 86,171,149, 12, 30, 60, 88, 15,192,171, 42,154,111,227, 5, 8,235,219,194,126,136, 20,153,230,221, 95, 19,178,101, 14, 25, 34, + 65,210,187,104,186,186,186,158,156, 57,115,166, 34, 53, 53,149,232,245,122,146,148,148, 68,166, 76,153,146,239,234,234,186,175, +146,219,238, 20, 20, 20,148,121,247,238, 93,171, 92, 46, 39,215,175, 95,183, 54,104,208, 32,179,146,102,171,235, 91,101,217,238, +233,233,121,182, 42, 47, 87, 87,215, 29, 85, 61, 70, 45, 4, 72, 50,134, 93, 35,228,225, 69,114,106,112, 43,178,190,105, 53, 50, +200,145, 47,111,203,199,199, 29, 74, 31,202,164, 44,205, 15, 58,116,232,160,126,250,244,169, 37, 39, 39,135, 60,127,254,220, 58, +105,210, 36, 29,128,200, 73,147, 38,233,158, 63,127,110,205,201,201, 33, 79,159, 62,181,116,232,208, 65, 13, 96, 98, 21,202,201, + 2,176,115,201,146, 37,132, 16, 66,150, 47, 95, 78, 26, 54,108, 72, 58,119,238, 76, 84, 42, 21, 33,132, 36, 16, 66,118,153,205, +230,113,149,209,180,179,179, 27, 61,115,230, 76,149, 70,163, 33, 69, 88,173, 86, 34,151,203,201,230,205,155,213,238,238,238,103, +203,120,200,160, 77, 30, 84,147,106, 82,205,191,155,230, 63, 25, 15, 20,228,105, 21,189, 60,128,130,166,195,138, 24, 49,119,238, +220, 34, 83,117,174,109,219,182, 15,198,141, 27, 23, 54,110,220,184,176,182,109,219, 94, 7,112,225,209,163, 71, 97, 95,124,241, + 69, 24,128, 17, 21, 28, 8,135,214,173, 91,203, 51, 50, 50, 72, 64, 64, 0,169, 94,189, 58,201,200,200, 32,132, 16,242,240,131, + 38,228, 74, 93,144,228,155,231,200,197,227, 71,200, 36, 15, 14,105,231, 97,103,242,112,119,207,113,118,118, 94,129,130,164,253, +242, 14,238,192,186,117,235, 42, 35, 35, 35, 85, 49, 49, 49,170,165, 75,151,170, 58,119,238,172, 10, 10, 10, 82, 13, 26, 52, 72, +181,105,211, 38,149,209,104, 84,237,216,177, 67,101,107,107, 27, 89,138,217,122,103,163,197,225,112, 54, 70, 68, 68,144,215,175, + 95,147,194, 40, 69, 89,154,118,246,246,246, 61, 29, 28, 28,102,217,219,219,247, 4, 96, 7, 0, 1,128,180,145, 29,124, 62,110, +228, 87, 39,116, 68,215, 90,155,187, 54,107, 50,196,134, 37, 55,125, 63,135,144,193, 62,239,100,180,236,236,236, 70,127,250,233, +167, 74,189, 94, 79, 52, 26, 13, 81,169, 84, 68,163,209, 16,165, 82, 73, 70,140, 24,161, 16, 10,133, 3, 43,210,116,118,118,254, +250,230,205,155,230,140,140, 12,114,243,230, 77,114,246,236, 89,178,101,203, 22,171,171,171,235,186,170,158,128,238,238,238,151, + 46, 94,188, 24, 22, 30, 30, 30,118,255,254,253, 48,147,201, 20,102, 52, 26,195,140, 70, 99, 88,104,104,104,216,177, 99,199,194, + 14, 30, 60, 24,102, 48, 24,194, 12, 6, 67,152, 94,175, 15,171, 89,179,230,249,170, 30,163,230, 2, 36, 27,110,157, 34,100,221, +116,146,255,237, 52, 34,159,221,155,200,166,180, 39, 63, 52,171, 70,218,139,112,250,173,122, 84,166, 38,151,203,189,145,144,144, + 96,157, 63,127,190,161, 94,189,122,249,227,199,143,215,233,245,122, 66, 8, 33,122,189,158,140, 31, 63, 94, 87,175, 94,189,252, +249,243,231, 27,226,227,227,173, 28, 14,231,114, 21,202,185,170,200,100,221,184,113,131,148, 68,165, 82,145,206,157, 59, 39, 52, +108,216,112, 87,141, 26, 53, 70, 86,164, 41,149, 74,251,207,155, 55, 79, 69, 74,193,100, 50, 17,165, 82, 73,226,227,227,173,213, +171, 87, 79, 3,224, 68, 47,230, 84,147,106, 82, 77,106,180,254, 50,202,156,130,167,220,157,248,197, 23, 95,132, 17, 66,194, 22, + 44, 88, 16, 86, 24,217,226, 1,144, 22,190, 56, 0,134,207,155, 55, 47,140, 16, 18, 54,119,238,220,162,117,202, 58, 16,125, 15, + 31, 62,108,220,176, 97, 3,113,115,115, 35,238,238,238,100,227,198,141,196,106,181,146,140,208,125,228, 74, 93,144, 23, 95,142, + 37,132, 16, 18,189, 98, 6,185, 82, 23, 36,246,199,101,100,212,168, 81, 26,177, 88, 60,162,156,131,235,216,164, 73, 19,165, 86, +171, 85,237,222,189, 91, 37, 22,139, 31, 2,168,135,130,166, 72,166,176,172, 99,234,213,171,167,120,246,236,153,234,215, 95,127, + 85, 1, 88, 90,201, 10, 83, 11, 64, 39,137, 68, 50,104,158, 23, 55,134,252,252, 21,153,231,134,167, 0, 26, 0,112, 41, 92,199, +115,238,220,185,132, 16, 66,188,189,189,111,150,161,105, 23, 20, 20, 52, 55, 38, 38,102,177,201,100, 90, 28, 30, 30,190,184,118, +237,218,243,251,213,244,104,117, 98, 68,183,224,252,101,211,130,201,218,217, 65,223,245,106,222,245,192,176,142, 35, 62,172,225, +124,107,188,171, 80, 51,212,142,173,124,171,233,176, 82, 21,219,203,203,235,126, 82, 82, 82,177,185, 82, 42,149, 36, 53, 53,149, +196,197,197,145, 91,183,110, 17, 15, 15,143, 43, 21,105,186,187,187, 63, 79, 74, 74, 34, 63,174, 95, 79, 6, 55,168, 67,218,219, +219,144, 14, 14, 54,164,169, 84,168,174, 11, 52,173,170,209,122,252,248,113, 24,128, 48, 0, 97, 57, 57, 57, 97, 57, 57, 57, 97, +121,121,121,197,239, 1, 8,203,207,207, 15,203,207,207, 15, 51, 24, 12, 97,126,126,126, 85, 54, 90,109,132,104,211, 66,136,220, + 86, 2,104,251,122, 57,167, 77,171,233,108,185, 55,162, 21,201,155,222,153,108, 8,246, 34,109,249,248,184,146,154,125,249,124, +254,117, 0,115, 10, 77,249,216,158, 61,123,106, 8, 33,164,103,207,158, 26, 0, 99, 11,223,255,180,208,100,245,172,100, 57, 89, +254,254,254,234,162, 72, 22,128,223,252,253,253,213, 13, 27, 54, 36, 13, 27, 54, 36,222,222,222,202, 66,237, 74, 93,208,106,213, +170, 21,173,213,106,139, 13,160, 92, 46, 39,105,105,105, 36, 54, 54,150, 68, 70, 70,146,135, 15, 31,146,132,132, 4,114,232,208, + 33,139,189,189,253, 25,122, 49,167,154, 84,147,106, 82,163,245,151, 26,173,183, 95,111, 26,173,208,208,208,183,109,215,183,143, + 30, 61, 10,155, 55,111, 94, 24,202, 25,136, 11,192,228, 5, 11, 22, 20, 69,189,190, 41,231,230,191, 35, 58, 58,154,140, 29, 59, +150, 4, 6, 6,146,192,192, 64, 50,110,220, 56,146,159,159, 79, 84,175,158,145, 43,117, 65, 30, 14,109, 74, 8, 33, 68,249, 34, +156, 92,169, 11, 18, 54,170, 53,121,242,228, 9,169, 86,173,218,197,114,126,255,244,157, 59,119,178,246,237,219,151,129,130,124, + 44, 46,128,150, 0, 54,138, 68,162,157, 40,104, 46,172, 14,192, 33, 32, 32, 32, 87,163,209,168, 6, 15, 30,172, 2,224, 83,142, +102,135,192,192,192,215, 59,118,236, 32, 50,153,140,228,230,230,146,213,109,106, 19,242,243, 87,100,121,211,234,214, 31,127,252, + 81, 63,103,206, 28,181,163,163, 99, 40, 0,207,193,131, 7,155, 9, 33,164,125,251,246,153,165,137,217,219,219,247,140,137,137, + 89,172,211,233, 22,203,229,242,197,185,185,185,139, 79,157, 56,177,184, 71,131,218, 99,243,151, 77, 11, 62, 49,162, 91,112, 47, + 47,135, 65,235,186, 55,155,154, 58,127,226,224, 5,173,235,189,208,173,250,228,218, 7, 53,221,214,188,203,209,118,113,113, 73, +215,235,245, 4,192, 31, 94,175, 95,191, 38, 78, 78, 78, 73, 21,105, 56, 58, 58, 46,248,116,248, 48,203,192,234, 94,228,245,134, +133,196,116,233, 87, 98, 58,187,155,188,250,118, 54,233,231,238,172,104,201, 99,205,171,108,121,220,221,221, 47,221,191,127,255, + 13,163,149,151,151, 87,170,209, 82, 40, 20, 97, 6,131, 33,204,223,223,255,252,251,214,250,150,124,248,117, 16,177, 31,134,143, +109, 71,178,166,117, 38, 61,237,184, 9,239, 33, 55, 28,192,117, 0,163,170,248, 61, 22,128, 85, 69,134,234,219,111,191, 37,132, + 16,226,239,239,175,198,251,141, 99,103, 87,167, 78,157,184,137, 19, 39,154,235,214,173, 43,107,211,166,141,252,193,131, 7,228, +198,141, 27,228,236,217,179,228,200,145, 35,228,217,179,103, 36, 53, 53,149, 68, 71, 71,147, 62,125,250,200, 1,116,160,215, 66, + 10,133,242,119,166, 20, 47,242,143,166,184,215, 97,104,104, 40, 9, 9, 9, 97, 74,108,160, 29, 0, 97,211,166, 77,179, 86,173, + 90,181, 22, 5,195,202, 51, 65,108,124,208, 89,196,121,210, 89,196,121, 18,196,198, 7,133, 17,163,237, 43, 86,172,248,186, 97, +195,134,233, 0, 68, 0,220,203,248,177,118, 78, 78, 78, 72, 74, 74,130,157,157, 29,236,236,236,144,148,148, 4, 66, 8,204, 4, + 48, 17, 64,111, 52, 66,171,213, 66,103, 37,208, 90, 1,133, 74, 5,119,119,119, 24,141, 70,191, 50,182,161,209,208,161, 67,253, +130,130,130,178,190,248,226,139, 52, 20,228,202,236,156, 48, 97,194,165,223,126,251, 45, 72,165, 82,229, 70, 70, 70,234, 26, 52, +104,208, 19,128,123, 76, 76,204,232,205,155, 55, 99,236,216,177, 40,231,166,211,160, 79,159, 62,103,159, 61,123,230, 55,106,212, + 40, 92,191,126, 29,171, 87,175, 70,118,118, 54, 1, 0,189, 94, 79, 44, 22,139,177,117,235,214,198, 13, 27, 54, 52,111,223,190, +253,253,154, 53,107,178, 1, 32, 46, 46,238, 85,105,130, 12,195,212,246,245,245,133, 94,175, 71, 86, 86, 22,158, 61,123, 6, 27, + 59, 59, 68,164,101,187,117, 92,247, 99,206,151, 39, 46,113,135, 55, 15,114,156,213,173,141,126,229,197,235, 1,245, 60,221,220, + 12, 70,147,123,116,122,102,218,187, 28, 88, 30,143,151,148,157,157, 13,131,193, 0,173, 86, 11,133, 66,129,156,156, 28,100,103, +103, 35, 45, 45, 13, 60, 30,239,117, 69, 26,182,185,185, 55,227,238,220, 96, 14,109,253, 22,126,230, 92,112,142,110, 4,231,228, + 15,168,101,200,194,182,133, 83,108, 12, 78, 46, 75,108,109,108,242,236,237,237,183, 3,240,175, 72, 47, 56, 56, 24, 57, 57, 57, +200,201,201,129,147,147, 19, 28, 28, 28,224,224,224, 0,185, 92,142,252,252,124, 40, 20, 10, 4, 4, 4,160, 81,163, 70,216,179, +103,207,159, 82,193,239, 25, 16,107,134,101,218,165,168, 52,240, 36, 18,212,116,144,250, 54,147,194,177,156,175,116,230,114,185, +135, 29, 29, 29, 47, 2,152, 14, 64, 2, 96,186,163,163,227, 69, 46,151, 59, 0,192,114, 0,251,170, 88,140,149, 75,150, 44,153, + 27, 19, 19, 35,126,242,228, 9,190,248,226, 11, 44, 93,186, 20,175, 94,189,250, 30,128,181,112,157,143,156,156,156, 66, 89, 44, +214, 79, 0,122, 3,232,233,225,225,209,165, 2,221, 1,115,230,204,209, 53,105,210, 36,250,197,139, 23, 3,238,220,185,211,116, +246,236,217,249,137,137,137,136,142,142,134,135,135, 7,188,189,189,161, 82,169,144,151,151,135, 1, 3, 6,216,217,218,218,142, +160,151,113, 10,133,242,119, 54, 89,111,121,145,127, 90, 68,171,212,229, 82,159,168,197, 98,241,146,176,176,176, 86, 13, 27, 54, +228, 0, 56, 4, 0, 65,108, 12, 25,208,186,241,206, 19,219,191,109,120,108,195,194,134, 61, 26, 6,236, 12, 98,163,168, 23, 91, +104,211,166, 77, 29,194,194,194, 90, 11, 4,130,143,203, 50,118, 0,224,224,224, 0, 59, 59, 59,216,219,219,195,193,193, 1, 86, +171, 21, 42,141, 14,106, 11,160,212, 25,144,159,159, 15,101,225,178, 74,111,132, 90,173, 46,254,110, 41,116,156, 56,113, 98,214, +230,205,155,101,233,233,233,223, 2,104, 48,118,236,216,254,155, 54,109,194,213,171, 87,117,189, 3,107, 57,173,104,215,248,235, +122,233,175, 22, 7,114, 49, 9,192,205,155, 55,111,162,117,235,214, 96, 24,102, 88,105,130, 34,145,232,135, 3, 7, 14,136, 34, + 35, 35, 81,171, 86,173,200, 97,195,134,125,240,237,183,223,250, 73, 84,185,183, 1,192,156,147, 17, 57, 99,198,140,175, 86,172, + 88,145,149,149,149,101,212,104, 52,174,253,250,245, 67, 82, 82, 18, 82, 83, 83,127, 43,195,100, 70,135,135,135,147,252,252,124, +196,198,198, 34, 60, 60, 92,244,213, 87, 95, 53,183,176, 88,253, 83, 96,243,225,216, 54, 77,155,143,106,217, 24,251,238, 62,225, +221,138,138,179,111, 90,221,203,225,113,114,122, 13, 19,131,215,239,114,180,149, 74,229,198,175,191,254, 90,165, 82,169,144,146, +146,130,167, 79,159,226,197,139, 23, 72, 72, 72,192,234,213,171, 85,185,185,185,155, 42,210,240, 20,114, 62, 91, 51,123, 2,195, +121,254, 27,240,228, 6,160, 81, 2, 90, 21,244, 47,195,176,235,101, 6,182, 28, 61,206, 79, 76, 74,178, 63,120,240,224, 68, 31, + 31,159, 48, 0, 1, 21,185,122, 0, 96,177, 88,111,155, 80,176, 88, 44, 37,128, 12,137, 68,146,108, 99, 99,147,204, 98,177, 50, + 8, 33,234, 63,163,230,179,204, 48,130,205, 6,248, 34,176,184,229, 78,237,249,193,176, 97,195, 14, 36, 39, 39,247,136,141,141, +109,181,105,211,166,175,133, 66, 97,196,166, 77,155,190,142,141,141,109,149,156,156,220, 99,216,176, 97, 7, 0,140,169,202,239, +251,251,251,207, 88,188,120, 49, 86,175, 94,141, 70,141, 26, 33, 32, 32, 64,179,100,201,146,141, 0, 22, 2,248,216,223,223,255, +246,140, 25, 51,198,203,100, 50,247,148,148,148, 70,223,127,255,253,148,141, 27, 55, 54, 75, 75, 75, 19, 86, 32,221,182,123,247, +238, 56,119,238, 28, 0,164, 3,136,205,201,201, 49,167,165,165,161, 78,157, 58,104,222,188, 57, 84, 42, 21, 84, 42, 21,228,114, + 57,124,125,125, 97,181, 90, 91,209, 75, 57,133, 66,161,252,191, 26,174,210,141,150, 80, 40,116, 8, 14, 14, 70,205,154, 53, 29, + 80,216, 91,203,137,207,153, 63,107,226,112,177, 52,236, 60,152,240, 43, 24,214,174,190,216,137,207,153, 95,248, 21,142,175,175, +175, 32, 56, 56, 24, 18,137,196,171,140, 31,191,158,145,145,129,224,224, 96,216,219,219,195,206,206, 14,193,193,193, 48, 26,141, +200, 87, 42,161,182, 0, 26,147, 21,249,249,249,200,205,202,132,198, 2,152,109,156,144,144,144, 0, 54,155, 29, 87,134,166, 71, +173, 90,181,178, 34, 34, 34,178, 0,220, 4, 48,117,233,210,165,152, 55,111, 30, 22, 45, 90,116, 64,156, 30,223,253,192,185,147, + 78,251,151,124,228, 18,192,103,134, 3, 48, 38, 39, 39,195,222,222, 30, 18,137,164, 84, 99,208,190,125,251, 38, 18,137, 4,187, +119,239, 38, 41, 41, 41,109, 80,208,133, 63,142, 97, 10,204,158,136,133,124, 0, 27,195,194,194, 90,124,245,213, 87, 81, 93,187, +118,229,182,108,217, 18,203,151, 47, 7,128,208,210, 52,229,114,249,189, 49, 99,198, 24,174, 93,187,134,151, 47, 95, 74, 78,156, + 56, 49,100,249,242,229,245, 19, 19, 19, 5,167,207,158,239,181, 55, 89, 49,228,219,139,183,132, 43, 46, 92,191,231,108, 43,169, + 87,195,217, 17,225,137,169, 60, 11, 27, 15, 42, 58,162, 45,184,236,137, 29,133,156,240,118, 2, 86,122, 71, 33, 39,172, 25,151, + 61, 65,169, 84, 30, 60,117,234,212,133,217,179,103,171,100, 50, 25,108,108,108,144,147,147,131,149, 43, 87,170,194,195,195,143, + 26, 12,134,211, 21,233, 90,172,164,137,119,117, 31,224,117, 68,241,123, 70, 43,193, 3, 3, 15, 33, 83, 63, 65, 96,157, 58, 48, + 24, 12,104,208,160, 1,179,116,233, 82,137,157,157,221,231, 21,154, 30,214, 31,170,155,153, 97,152, 12, 66, 72,170, 74,165, 74, + 17,137, 68,137, 60, 30, 47, 49, 55, 55, 55,133, 16,146,249,103,248, 44,194,194,103,173, 27,248, 3, 2, 17, 18,115, 84,105, 15, + 85,200, 45,109, 69, 27, 27,155, 9, 91,182,108, 17,254,252,243,207,166, 25, 51,102,232,167, 76,153,194,213,106,181,174, 83,166, + 76,225,206,152, 49, 67,255,243,207, 63,155,182,108,217, 34,148, 74,165,131,222,165, 32, 38,147, 9, 17, 17, 17,223,190,122,245, + 74,130,130,225, 70, 62, 89,178,100,201,216,152,152, 24,225,230,205,155,113,228,200, 17, 28, 57,114, 4,253,251,247,199,204,153, + 51,177,120,241,226,242,228,196, 13, 27, 54, 12,118,114,114,194,141, 27, 55,210, 0, 36, 2,104, 34,149, 74,109,250,247,239,143, + 30, 61,122, 64,167,211,193,104, 52, 22, 27, 45, 54,155, 13,123,123,123, 39,122, 13,164, 80, 40,148,191,220,100,189, 97,182, 56, + 0, 80, 20,170, 11, 9, 9, 97,202,187, 49, 90,242,100,144,171, 53, 72,200,215, 32, 41,207,250,198,103, 86,171,181,220, 95, 79, + 75, 75, 59,125,247,238,221, 9,193,193,193,156,180,180,130, 22,177,224,224, 96,104, 52, 26,164, 61,185, 15,181, 21,144,212, 10, +130, 90,173, 70,222,139,199,144, 54,108, 5,167, 62,163,176,110,243,102,125, 78, 78,206,214,210, 52,249,124, 62,183, 90,181,106, + 89,113,113,113,102, 0,185,118,118,118,221,125,124,124,112,253,250,117, 0,216, 71,128, 53, 8,191, 6,220, 56, 6, 82, 16, 82, +145,250,250,250, 66, 38,147, 65,165, 82, 93, 47, 77,243,238,221,187, 49, 38,147,169, 65,191,126,253,152, 95,126,249,229,144, 66, +161, 88, 4,224,169,222, 10,246,147,228, 76,168, 45, 16, 2,232,230,224,224,240,233,226,197,139,187,204,152, 49, 3,167, 78,157, +194,197,139, 23,141, 40,200, 5,187, 91,138,108,126,108,108,236,182, 57,115,230,180,100,177, 88, 83, 47, 93,186,100, 14, 8, 8, + 80, 24,141, 70, 75,237,192, 64,214,162,165,203,120,211,167, 78,182,207,209,224,121,143,218, 30,173, 25, 6,120,158, 42, 75,124, +165, 66, 78,121,251,180, 61,159, 29, 58,160, 77,195,246, 19,134,245,149, 74,106,213,131,250,217,125,247,109,135,207,174, 19,133, +199,132,220,144,201,250,159, 58,117,106,200,245,235,215,167, 27, 12,134,154, 2,129,224,181, 92, 46,223,160, 82,169, 42, 52, 89, +108, 54,187,143,222,163,154,131, 60, 55, 23,194,194, 72,148,194,100, 69,182,222,140,151,246, 1, 24, 81,205,187,184, 25, 52, 35, + 35, 3,238,238,238,140,197, 98,233, 91,158,230,197,139, 23, 17, 18, 18, 82,100, 60,193, 48, 12, 24,134,201, 14, 12, 12,204, 20, + 8, 4, 57, 60, 30, 79,177,102,205, 26,157, 78,167, 3,135,195, 17, 90, 44, 22,246,251,212,246,230, 98,184, 10, 8,243,195,148, +126,157,186, 54,170, 87,135,220,124,248,132,201,211,232,118,149, 19, 5,252,222,223,223,159,147,155,155,123, 26,192, 75,147,201, +180,255,208,161, 67,194,209,163, 71,235, 14, 31, 62, 60, 18,128,223,218,181,107,135,168, 84,170,237, 85, 41,199,171, 87,175,190, + 95,177, 98,197,220, 5, 11, 22, 96,207,158, 61, 51, 94,189,122, 53,175, 48,210,213,127,241,226,197, 88,179,102, 13,246,236,217, + 99,125,249,242,229, 89,171,213,250,106,246,236,217, 13,221,220,220,178,211,211,211, 95,149, 35,219,180,103,207,158,250,219,183, +111,243,149, 74,229, 45, 0,159, 78,155, 54,109, 98,139, 22, 45, 20,195,134, 13,147,230,230,230,202,197, 98, 49,127,199,142, 29, + 14, 28, 14, 7,106,181, 26, 12,195, 64,169, 84, 26,232,117,144, 66,161,252, 93, 41,203,139,252, 67, 40,243,222,192, 41,109, 3, + 53, 26, 77,102, 82, 82, 82,157,212,212, 84, 51, 0, 51, 0,228, 24,204,223,172,216,113,236,231, 65, 45,253, 37,233, 38, 19, 78, + 60,140,212,228, 24,204, 69,201,239,230,212,212, 84,101, 98, 98,162,141, 86,171, 85,149,241, 91,191,253,240,195, 15,218,107,215, +174,217,196,198,198,194, 98,177,160, 73,147, 38,136,142,142, 70,222,203, 8, 72,234, 52,129,164, 67, 8, 34,195, 30, 34,252,226, +101,196,171, 12,230,168,133, 43,242, 85,106,245, 98,163,209,120,162, 52, 65, 46,151,155, 11,128, 16, 66, 44, 0,160, 80, 40,158, +170, 84,170,118,110,110,110,120,254,252,185, 68,109,193,204, 33,243,215,109, 34,132, 88,120, 5,189,185,102, 13, 27, 54, 12,143, + 30, 61, 2,128, 71,165,105, 42, 20,138, 25,147, 38, 77,186,182,123,247,110, 78,108,108,108,143,159,127,254,185, 71, 84, 84, 20, + 97,114,147, 44,183, 53, 92,248,141,157,217,236, 71,223,192,139, 33, 33, 33,240,240,240,192,142, 29, 59,176, 97,195, 6,211, 71, + 31,125, 20,179, 97,195,134,102, 50,153,108,127, 25,219,159, 47,151,203,207, 59, 57, 57, 77,175, 95,191,190, 82,173, 86, 35, 39, + 39, 7,105,105,105,112,116,114, 98,153,193,106,237, 98,111,191,255,116,134, 82,194, 57,127, 15,247, 83,210,203,141,102,181,228, +178,199, 12,106,223,184,253,199, 11,230, 75,113,251, 4,152, 73,139, 65,126,254, 26,159,140, 27, 98,163,211,239,239,160,126,146, + 48, 58, 76,161,216,171, 80, 40,142, 84,177,178,244,108,221,186,245,129, 21, 43, 86,136,190, 92,189, 2,107,235,120,193,156,147, +131, 44,189, 5,217,122, 51, 20,121, 47,241,252,121, 36,156,156,156, 17, 31, 31, 15,157, 78,135, 23, 47, 94, 16, 54,155,125,186, +162,136, 78, 17, 37,154, 11,229, 2,129, 32,135,203,229,102,114, 56,156,220,216,216, 88,181, 78,167, 3,139,197,146, 88, 44, 22, + 81, 37,202, 90,205,217,217,121, 54, 10, 6, 19, 61,165,204,206,222, 24,204,133, 61, 56,232,232,235,236,212,107,225,148,209,206, + 62,158,174,242,216,152,215,166,173, 23,238,100,235,244,101,119,214, 0, 16,154,155,155, 91, 28,145, 60,124,248,240, 39,135, 15, + 31,158, 8, 96, 39, 10,230,221,186, 44,151,203,127,124,135,147,111,225,209,163, 71,231, 46, 88,176, 0, 34,145,168,120,240, 84, +145, 72, 36, 4,128, 95,127,253, 21,207,159, 63,111,129,194,124, 45,171,213,122, 32, 61, 61,189, 34, 77,191,160,160,160,216, 99, +199,142,241, 1,120, 78,155, 54,173,213,166, 77,155, 48,110,220,184,172,200,200,200,150, 0,226, 0,248, 77,157, 58,245,193,158, + 61,123, 28,172, 86, 43,242,242,242, 96, 48, 24,226,232,165,156, 66,161, 80,179,245,151, 16, 12, 32, 28, 5,227,103,245, 1,112, + 6, 5,105, 29,101,226, 93,232,206, 46, 0,232, 87,116,127, 44, 35, 25, 30, 40,232,145,117, 30,192, 79, 0,220,202, 18,117,114, +114,250,124,236,216,177,166,148,148, 20,146,145,145, 65,142, 28, 57, 66,102, 77, 24,107,233, 86,203,211, 90,203,211, 77,237,226, +226, 18,237,225,236,184,171,177, 24,179, 0, 84,171,196,134,141,141,138,138,154, 60,118,236,216, 9,133,191, 59,225,192,129, 3, +170, 75,151, 46,169,216,108,118, 40, 10,134,118, 40, 50,148, 99,250,246,237,171,210,235,245,170,192,192,192, 92, 20, 36,238,151, +197,144,142, 29, 59,230,157, 59,119,142, 88, 44,150, 63,140, 81,148,149,149, 69, 46, 94,188, 72,218,180,105, 35, 7, 48,186, 75, +151, 46,215,239,220,185,115,189,109,219,182, 71, 43, 42,176,179,179,243,252, 39, 79,158, 60, 74, 72, 72, 8, 59,115,230, 76,216, +254,253,251,195,166, 78,157,250,180, 97,195,134,218,152,152, 24,171,217,108, 38, 79, 30, 63, 38,129,181,107,171, 1,248,150,165, +211, 89,196,121,160,216,241, 53,209, 45, 31, 71,116, 3,188, 9, 0,162, 92,247, 57,201,156,209,149, 68, 79,239, 69, 58, 9,217, +119,223,165,166, 56, 58, 58, 94,120,244,232, 17, 81, 42,149,228,217,179,103,100, 76, 72, 15,114,119, 98, 87,114,190,135, 63,217, +211,161, 6, 89,215,189, 33,233,209,161, 29,249,225,135, 31,200,177, 99,199,200,252,249,243,173,206,206,206, 74,148,147,163,229, +238,238,126,233,208,161, 67, 97, 0,194,216,108,118,152, 66,161, 8, 83, 42,149,167,147,147,147,183, 4, 6, 6,206,173, 95,191, +254,200, 58,117,234,116,238, 84,195,119,110, 23, 27, 65,116, 87, 91,225,235,218, 82,241, 58,252,113,220,171, 98,236, 0,223, 90, +126,126,202, 27, 55,110, 88,245,122, 61,185,117,235,150,181,110,237, 0,221,218,161, 61,143,198,239, 88,117, 84,119,238,151, 11, +154,147,219,239, 28,254, 48, 36,162,163,152,245, 75, 43, 73,241,112, 28,239,202,112, 0, 39,240,123,175,195,177, 0, 78,162,252, + 94,136, 44, 0, 59,151, 47, 95, 94,178,167, 33, 0,176, 26, 54,108, 24, 70, 8, 9,107,216,176, 97, 88, 85, 11, 34, 22,139,103, +159, 58,117,106,137,143,143,207,234, 97,195,134,237,144,203,229,103, 70,142, 28, 25,129,130,206, 32, 12, 10,102, 71,232, 91,173, + 90,181,172,240,240,112,114,253,250,117, 50,120,240, 96, 37,143,199, 27, 69, 47,227, 20, 10,133,242,151, 48,185,180,191, 21,141, +163,181, 34, 34, 34,162,104, 12,173,105,229,137,207,155, 55, 47,236,209,163, 71, 97, 40, 24, 37,190, 92, 56, 28,206,241,143, 62, +250,136,184,185,185,169, 92, 93, 93,143,115,217,236,137,222, 34, 4,227,221,186,186,183,219,187,119,111,255,239,191,255,190, 15, +128, 22, 0,184, 94, 94, 94,105, 25, 25, 25,170, 59,119,238,168,218,180,105,163,114,118,118,150, 5, 5, 5,169,214,174, 93,171, + 50,153, 76,170,217,179,103,171,240,199,241,190, 74, 67, 8, 96, 58,159,207, 63, 94,183,110,221,136,133,253, 58,155, 86,207,156, + 72,198,250,187,168, 0,124, 15,224, 35, 0,246, 0,184, 67,134, 12,185,242,226,197,139, 11, 65, 65, 65,219, 42,161,235, 89,191, +126,253,171, 7, 14, 28,120,116,236,216,177,176,207, 63,255,252,145,147,147, 83, 74, 76, 76,140, 85,167,211,145,188,188, 60, 34, +151,203,201,153, 51,103, 44,142,142,142,155,203,220,112, 1, 59,157, 92,220, 87,234, 16, 14,201, 11, 70,145, 54,124, 86,234,187, +212, 20,137, 68,146,155,147,147, 67, 50, 50, 50, 72,108,108, 44, 57,122,244, 40,233,217,186, 57, 57, 56,117, 16,217, 55,161, 63, + 89,211,179, 57,105, 97, 35, 84,187,219, 72, 31,217,216,216,200, 42,211,235,208,221,221,253,146, 94,175, 47, 30,190,161, 90,181, +106, 97,129,129,129,199,130,130,130,214,157, 58,117,234,147,245,235,215,247,239, 84,195,119,238,202, 30,173,181,154,203,135,137, +242,208,247,100, 94,147, 0, 93,161,153, 47, 21, 47, 39,199,189, 55,174, 95,183, 22,153, 95,179,217, 76, 78, 28, 63, 78,134,246, +234, 22,145,127,254,215,159,110, 45,158,113, 96,118,147,128, 19,109,132, 24, 94,158, 97, 43,126, 20,145,194,169,189, 45,107, 75, +111, 31,199,244,118,118,172,239, 91,218,188, 49,189,212,208,128,128,128, 88, 66, 72,122,157, 58,117, 98, 1,236,171, 83,167, 78, +201,229, 15,203,144, 45, 30,156,116,201,146, 37,164,240,252, 96, 1, 88,180, 98,197,138, 48, 66, 72,152,191,191,255,109, 0,104, + 36,129,115, 7, 59,214, 79,253,252,220,114, 58,216,177,126,106, 36, 41,125,202, 40, 95, 30,106,183,115, 17,223,234,239,239,161, +236,232,101,119,115,223,174,159, 87,247,238,221,123, 7,128,205, 0,190,118,114,114,186, 53,124,248,240,231,123,246,236,121,190, +118,237, 90, 99, 76, 76, 12, 25, 63,126,188, 90, 32, 16,124, 77,175,131, 20, 10,133,242,151, 81, 52, 50,188, 71, 85,140, 86,223, +185,115,231,134, 17, 66,138,198,210, 26, 93,202, 58,253, 22, 44, 88, 16, 70, 8, 41, 26, 29,254,237, 1,204, 74, 27,208,108,201, +150, 45, 91,136, 64, 32,248,233, 29, 55,166,164,166,251,128, 1, 3, 90, 42, 20,138,102,110,110,110,205, 10, 35, 87,222,206,206, +206,177,251,247,239, 87,105,181, 90, 21, 33, 68,101, 54,155, 85,143, 30, 61, 82,117,236,216, 81, 85,226,169,191,162,114,190,193, +151,238,184,253,112,225, 4,242,165, 59,110,191,245,209,168,157, 59,119,158,139,139,139, 59,109,107,107,251, 69, 37, 53,189, 93, + 92, 92, 22, 57, 58, 58, 94,112,118,118,254,210,209,209, 49,221,104, 52,146,188,188, 60, 18, 29, 29, 77,174, 95,191, 78,238,222, +189, 75, 28, 29, 29, 83,202, 42,103, 23, 17,231, 94,222,234,233,196,186,115, 5, 49,108,154, 79, 0, 16,249,250,121, 36,251,135, +165,228,225,164, 30,164,163,144,253,219, 59,236, 79,216,219,219,111, 63,126,252,184,245,213,171, 87, 36, 52, 52,148,156, 57,115, +134,204,156, 57,147,212,246,244,208,183,228,179, 50,219, 9, 56, 23,222,101,192, 82,189, 94, 31,166, 80, 40,194, 84, 42, 85, 88, +221,186,117,195,154, 55,111,126,172,101,203,150,235, 14, 31, 62,252,201,202,149, 43,251,119,177, 17, 68,107, 46, 31, 38,228,243, + 94,132, 76,111, 75, 94, 79,236, 72, 58,139, 56, 79,202,212,116,115, 75, 41, 26,173, 93,173, 86,147,155, 55,111,146,171, 87,175, + 18,119,103,103, 69,123, 17,123,114, 27, 1, 58,180,177,133,125,101,203,217,201,142,181,235,222, 15,223, 88,180,231,246,144, 95, +199,246, 50,119,180,103,109, 41,177,222, 65, 66, 72,250,224,193,131,227, 9, 33,233, 71,143, 30, 77, 38,132,164, 15, 26, 52, 40, +158, 16,146, 14,224, 64,105,154,111, 13, 78,186,179,208,100, 77, 95,178,100, 73, 24, 33, 36,108,201,146, 37, 97, 64,193, 32,170, + 29,236, 88,187,239,111, 91, 99,213,159,217, 77, 14,143,239, 99,233, 96,199,218, 93,106, 57,237, 57,167,195,119,174, 39,134, 11, +251,200,241,153, 35, 45,109,221,109,111, 4, 4, 4,172,249,228,147, 79,142,221,189,123,247,169,197, 98,121, 30, 27, 27,251,124, +243,230,205,207, 91,181,106,117,219,201,201, 41,130,207,231,127, 84,209, 49,250,147,160,154, 84,147,106, 82, 77, 74, 9, 8, 33, + 40,175,191,251,233,111,191,253, 86, 66, 8,153, 61,100,200, 16,172, 90,181,106,104,253,250,245,135,123,121,121,185, 0, 64, 90, + 90,154,230,217,179,103,138, 33, 67,134, 96,209,162, 69, 88,189,122,245, 58, 20,228,178,252,127,146,113,226,196,137,106, 51,102, +204,144,173, 92,185,210, 58,126,252,248, 58, 0,158,101,103,103,215, 30, 57,114,228,116, 14,135, 51,196,215,215, 55, 40, 61, 61, + 61, 75,171,213,238, 3,176, 13, 21,180,153,150,133,128, 5, 75,211,234, 30,184,192,130,165,196,219,189, 22, 45, 90, 52,108,208, +160, 65,198,245,235,215,155, 21, 10,197,169, 74,202, 37,103,101,101, 45, 43, 90,112,116,116,116,127,242,228,201, 71,174,174,174, +172,216,216, 88,232,245,122,188,122,245,202,138,130,166,169, 82, 81,153,201,198, 31,143, 94, 10,156, 61, 42,196, 86,243,242, 49, +120,108, 54, 76, 92, 62, 50,238, 93,192,206,155, 47, 21,106, 35, 54,189,203,118,202,229,242,239,102,206,156, 57,242,139, 47,190, + 16,250,250,250, 50,191,253,246, 27, 14, 29, 58,164,151,201,100, 61, 1,220,248,125,232,167,170, 97,181, 90,193,231,243, 1, 0, +243,230,205, 3,139,197,226,202,100, 50, 62,195, 48, 2,134, 97,196, 12,195,176, 77,113,207, 97, 85,228, 33, 51, 79,142,228, 76, +121,185,122, 22,171,245,208,253,251,247,103, 53,110,220,152,245,240,225, 67,100,101,101,225,213,171, 87,196, 66,200,129,155, 90, + 75, 65, 82,162,190,242,229, 19, 59, 58, 13,104,228, 32, 96,241,119, 45, 66,123, 3,139,189,213,138,193, 40, 24, 75, 11, 0,118, + 50, 12,195, 3,144, 83,183,110,221, 78, 47, 94,188, 16,213,173, 91, 87,251,242,229,203,115, 12,195,120, 1,216, 93,154,166, 72, + 36,202, 6,144,125,244,232, 81, 0,152,132,130,157,215,100,241,226,197,233, 55,111,222,196,146, 37, 75, 50, 1,108, 1, 0,169, +131, 83,191, 32, 59, 30,195,255,101, 9, 90,233,193,218,100, 37,165, 70, 93,165,174,110,157,235, 75, 88,224,254,252, 21,154,185, + 7,178,248,102, 99,131,165, 75,151,222, 84,169, 84,250,131, 7, 15, 26, 62,252,240, 67,118, 76, 76,204, 3, 0,183, 0, 28, 69, + 97,142, 37,133, 66,161, 80,254, 82,222, 30,214,161,194, 28,173,183, 93,235, 42, 0, 63, 70, 69, 69, 21, 79, 42, 29, 21, 21, 21, + 6, 96, 43, 10, 70,131,239, 91, 5,199,187,176, 48,162,181,237, 29, 55,230,109, 77, 97,112,112,176,232,197,139, 23, 60,148, 62, +225, 49,243, 14,154,127,160,180,185, 14, 3, 2, 2, 54,152, 76,166, 99, 91,183,110, 61,204,102,179, 71,190,135,219,247,245,247, +247,207,219,191,127,191, 53, 52, 52,148, 44, 92,184,208,226,225,225,145,135, 63,230,104,189,161,217,158,207, 62, 50,167,142,151, +226,209,232,182,228,245, 39,253,200,173, 81, 29,201,100, 47,169,162,189,144,125,232, 61,159, 74,252,237,236,236,118,138, 68, 34, +133,173,173,237, 37, 0,173,223,231, 24, 57, 57, 57,237,113,119,119,191, 84,242,229,230,230,118,204,197,197,229,123,103,103,231, +133,246,246,246, 83,252,132,252,245,159,212,246,212, 69, 12,168, 75, 46,183,113, 33,163,156,249,111, 55, 29,190, 93, 78, 15, 63, + 63,191,156,189,123,247, 90, 79,159, 62, 77,230,207,159,111,173, 94,189,186, 2,229,228,181,149, 27,209,178,103, 31, 58, 50,168, +165, 53,179,143, 23, 89, 85,199,198,218,201,129, 93, 86, 15,197, 81,133, 6,120,108, 69,154,181,106,213,218, 74, 8,217,181,124, +249,242, 93,248,125, 46,208,110, 75,151, 46, 93, 76, 8, 89,188,116,233,210,197, 0,122, 0, 64,123, 59,214,222,125,253,155, 90, +210,122,123,146,111,234, 72, 45,237,237, 88,123, 75,141,100, 58,114, 78,156,156,216,199,154, 62,177, 13, 89,228, 47,177,180,116, + 20, 92,225,243,249,159,160, 32,226,220, 28, 0,159, 62, 53, 83, 77,170, 73, 53,105, 68,235,239, 97,188, 42, 51,169,116, 73,220, + 29, 29, 29,119,214,172, 89,243,176,175,175,239, 97,169, 84,186, 14, 5, 73,243, 85, 61, 16,126, 43, 86,172, 80,216,217,217, 53, +250, 19, 15,174, 43, 0, 47,252,113,226,220, 63,173,194, 44,243,192,140,152, 47,134, 62, 89,230,129, 25, 37,222,110, 94,167, 78, +157,111, 80, 48,154,247,251, 86, 66, 95, 71, 71,199,205,142,142,142, 41,133,185, 89,190,149,209,108,202,102,143,236, 36,100,255, +214,154,207,202,232, 36,228,220,105,198,102,143,248,135,158,128,229,117,182, 40, 75,179,154,179,179,243,122, 71, 71,199, 52,103, +103,231,205, 85, 52, 89,111,104, 54, 18,193,163,179, 61,251, 68,107, 27, 70,221,217,142,125,180,169,184,236, 78, 29, 85,216,246, +224, 37, 75,150,140, 35,132,140,243,244,244, 28, 82,194,248, 7, 45, 90,180, 40,132, 16, 18, 82, 52, 2,124,115, 49, 92, 59,218, +179,247,183,177,101,228, 29,237,217,251,155,139,225, 90, 86, 57, 59,217,179, 15,181,177,101,228,237,109, 89,251,125, 4,168, 78, + 47,230, 84,147,106, 82, 77,106,180,254, 29, 70,139, 86, 24,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,163, 85,186,177, 42, +249,242, 40, 50, 90, 28,186,111, 40, 20, 10,133, 66,161, 80,222,139, 50, 7, 44,101,202,113,165, 85, 73,108,127, 23,103,123,153, +106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180,255,191, 59,214,253,101,208,166, 67,170, 73, 53,169, 38,213,164, +154, 84,147,106,254, 93, 52,255,117, 16, 66,222,105,144, 80, 10,133, 66,161, 80, 40, 20,202,239, 4, 23,254, 45, 30,184,180, 40, +154, 85,106,142, 22,167,249,242, 76,179,217,236, 10, 0, 28, 14, 71,102,122,176,208,163, 60,117, 46,208,197, 92, 48,253, 14, 56, +192, 36, 51,112,169, 20,205, 75,102,179,217,161, 80, 51,207,244, 96, 97,143,114, 53,155, 47,191, 80,114,125,243,131,133,221,254, +224, 20, 1, 54,183,249,242,180,183,202,234, 89,217,189,194,224,141, 49,177,254,178,114,254, 83, 52,255,203,112, 91, 44,207, 52, +153, 10,234, 17,151,203,145, 25,239,151, 95,143,120, 45,150,167,149, 92,223,116,127,161, 91,121,154, 98,145, 32,167,150,151,203, +186,242, 52, 99,211,178,103,171, 53, 58,167,242, 52,171,122,110,122,123,120,116,177, 20,158,155,108, 96, 82, 74,122,250,165,191, + 89, 93,106, 10, 96, 33, 0,219, 18,239, 69, 0,248,148,214, 74, 10,133,242, 15, 51, 90,225, 40,152,231,112,123,161,217,218, 94, +166,209, 50,155,205,174, 97,199, 23, 67,173, 7,186,140, 89,238,234, 55, 96,219, 31, 38, 74, 54,235,242,248,242,200,131, 65,108, +147,194,193,133, 99,180, 77, 75, 75, 99, 0,128, 97,152,159, 0,248,148,162,233, 16,118,124, 49, 52, 6,160,253,240,165, 14, 62, +128,109, 22,143,247,153, 72, 34,233,164,213,106,235, 3,128, 72, 36,138,212,170,213,215, 92,140,198,181,111,175, 95,214,150,149, + 44,107,231,209,203, 93,235, 12,216, 54,211, 98,181,242, 83, 31,110,109,175,203,142,225,112,205,250, 45, 95, 2,231, 22,151, 98, +170,202,208,251,253,119, 63,152,239,196, 5, 58,243,133,194, 70,246, 14, 14,237,172,132,212,181, 90,173,140,197,108,126,174,200, +207,191,101, 53,155,159,152, 13,106,167,176, 83,223, 88,203, 43,231,219,219,242, 1,192, 57, 14, 12,145, 72,165,157,216, 92,110, +107, 0,176,152, 76,191,169, 85,170,107, 3,129, 35,149,217,246,202,238,159,119, 93,255,191,134,201,100,118,141,187,176, 24,122, + 19, 16, 60,248, 27,215,134, 35,127,217, 15, 0, 6,217, 19, 55, 85,204,169, 22, 0, 32,169, 21,114, 95,224, 30,156, 9, 0,156, +196,116,215,232,208, 5,208,155,128,186, 33, 75, 93, 43,210,252,112,209, 33,167, 47, 38, 15, 18, 0,192,197,163,223,215,190,122, +236,199, 94, 0,208,121,208,180,115,221, 7,207,136, 6,128,213,219,143, 57, 29,248,102,104,185,154,149, 59, 55,243,121,249, 49, +161,254, 6, 69,186,189,183,132,227, 30, 19, 19,195, 2, 0, 79, 79,207, 74,157,155,213, 0,187,116, 96, 58,139,205,110, 87,203, +223, 63, 24, 0,137,125,253, 58,220, 98, 54,223,246, 0,182,252,201,117,105, 38, 33,111, 14,206,202, 48, 12,173,144, 20, 10,229, +159,198,153, 66,115,117,230, 15, 15,179,101,125, 67,173, 7,110,188, 2, 58,180,108,136,201, 35,123, 75, 75,126,118,100,219, 82, +159,152,135, 39,235,252,252,203, 90, 86,195,134, 13, 17, 23, 23, 87,169, 82,104, 12,192,245, 24, 0,242, 23, 54,121, 18,201,235, +245,107,214,216,118,235,214,141,227,233,233, 9,134, 97,144,145,145,209,242,242,229,203, 77,103,205,154, 53, 21,242, 23,121, 26, + 3,148,215, 99, 42,214, 45, 42,107,253,218,213,177,112,198, 80, 59, 0,248,114,204,150,166, 15,163, 50, 29, 95,191,126,221,101, +238,220,185, 57,236,107,215,126,116, 6,118,101, 2,201,149, 41,231,158,211,247,133,118,233,191,250,141,154, 49,227,168,191,191, +191,212,215,215,151,177,177,177, 1,155,205, 70, 94, 94,158,207,179,103,207,122, 61,120,240, 64,125,249,198, 79,252, 71, 15,250, +197,202,132, 45,116,149,218,118,109,154,240,162,141, 77,228,232,129, 3,171, 13, 29, 58, 84, 88,171, 86, 45, 0,192,235,215,175, + 3,142, 28, 57, 50,252,232,209,163,139,160, 77, 51,107, 12,208, 85,180,237,197,154, 0,132, 64,107,123, 87,215, 81,108, 46,183, +190,217,108,246, 42,140, 54,164, 90, 76,166, 72,185, 76,182,239,237,245, 41,127, 68,111, 2, 94,164, 3, 93,219, 5, 99,244,160, +174, 18, 0,152, 59,108, 69,203,196,248, 87, 60,131,193,128,218,129,117,219,124,253,205,186, 11, 96,177,176,247,216,229,226,245, + 43,163, 25,241, 34, 14,139,191, 94,143,180,167, 71, 90, 90,242, 95,117, 82, 42,242,217, 0, 96,107,103, 55,232,200,193, 95,175, +121, 6, 13,185,247, 42,219, 88, 41,205,242,206,205,243, 7, 55,123,164, 60,187, 86,239,135,139, 59,185, 62, 62, 62,120,250,244, +105,213,206,205,252, 40, 27,171,135,199,243,181,159,127,238,222,190,125,123, 72,165, 82,112, 56, 28,152,205,230,174,183,111,223, +238,186,120,241,226,105,200,143, 82, 87,246,220,172, 4,107, 25,134,233,244,225,228,153, 30,189,251, 15,193,160,158,109,104, 69, +164, 80, 40,255, 52,138,162, 87, 37,123, 30,110, 47,215,104,113, 56, 28, 89,183,177, 43, 93,219,181,104,128,135, 79,162,243, 19, +146,210, 85, 69,159,229, 70, 30,169,221,191,141, 87,189,155, 55,111, 64,175,215,227,183,223,126,195,147, 39, 79, 16, 31, 31,143, + 41, 83,166,232, 11,155, 14, 75,211,204,107, 63,124,169, 3,242, 99,164, 1,252,168, 26,151, 95,190,100,235,116, 58,220,188,121, + 19,121,121,121,224,243,249,168, 86,173, 26,186,119,239,206,121,249,242,165, 99,151,110, 61,237,218,247, 28, 17, 7,187, 0, 21, +135,195,201, 43,107, 30, 17, 14,135, 35,235, 50,102,185,107,189,128,234,120,157,144,150,191,240,155,159, 85, 86, 43,225,196,198, + 39, 26,111,220,184,129,224,224, 96, 92,186,116,201, 41, 55, 55,247,171, 45, 91,182, 44,228,126,251,195, 70,147, 33,103, 14,202, +214,203,107, 63,124,169,131,147,236,176,239,213,243, 39,120,145,145,145,188,173, 91,183, 34, 39, 39, 7,124, 62, 31,246,246,246, +112,119,119, 71,237,218,181,153, 47,191,252, 82, 26, 18, 18,137,143, 39, 13,241, 53,250, 77,140, 42,171,156,197,219,174, 74, 20, + 59, 43, 46,214, 58,118,230, 12,171,109,219,182,111, 60,182,215,172, 89, 19, 61,122,244, 16,142, 26, 53,170,214,208,225, 35,173, +237,251,124,248, 26, 82, 95, 77,133,154,234,100,145,147,230,174,103,215,225,195, 79, 45, 93,186,212,222,221,221, 29, 18,137, 4, + 0,144,159,159, 95, 45, 33, 33,161,229,162, 69,139, 6,223,143, 56,200,105, 31,146,156, 6,137,183,182,188,253,249, 95,133,203, +229,200,138,162, 72, 54, 18, 81, 94,114, 74,166, 26, 0, 12, 6, 3, 12, 6, 3,244,122, 61, 62,154, 54,133, 61,105,112,115,127, +223,118, 51, 31,199,167,102,230,214,189,124,207,177,232,187,166, 10, 52, 57,154,120,185, 60,233,202,164,197,159,127,238,238,230, +246,123,139,224,222, 61,123,216,185,185,185, 93, 23, 47, 94, 92,143,136, 59,202,235,134, 44,181, 47, 79,179,188,115, 83, 30,125, +166,198,215, 51,122, 52,218,246, 77, 40, 44, 22, 11,238,222,189,139,155, 55,111, 98,221,186,117,228,220,185,115,249,182, 18,201, + 36,148,123,110, 70,217,180,245,200,240,251,246,219,163,140, 64, 32,192,201,147, 39,241,242,229, 75,176, 88, 44, 52,108,216, 16, +163, 71,143, 70,215,174, 93,221, 39, 79,158, 66,218,247, 28, 22, 11,187, 64,229,123,214, 37, 22,128,153,243, 23,127,235, 49,102, +226,116,172,254,250, 75,106,180, 40, 20,202, 63, 57,154, 85,230, 16, 15, 8, 13, 13, 37,133,175, 14, 0, 64, 0, 86,205, 1,219, + 14, 28,126,100, 61, 83,115,192,182, 3, 4, 96, 17,128,101, 11, 84,111,220,184,177, 73, 46,151,147, 7, 15, 30,144,143, 62,250, + 72,189,113,227,198,107,103,206,156, 57, 98, 54, 26,119,120,122,120,124, 71, 80,122,130, 61, 1, 88,190,128,157, 88, 44,206, 74, + 74, 74, 34,103,207,158, 37, 75,150, 44, 33,251,246,237, 35,231,206,157, 35,151, 47, 95, 38,231,206,157, 35, 7, 14, 28, 32, 17, + 17, 17, 36, 58, 58,154, 72, 36,146, 44, 95,192,174, 28, 77, 54, 1,216,181, 7,108,157,115,244,161,105,105,224,128,109,179, 8, +192,118, 0,234, 52,110,220,216,114,228,200, 17,178,119,239, 94,242,203, 47,191,144,136,136, 8,146,157,157, 77, 56, 2, 73, 86, +209,247,202, 42, 39, 1, 88, 94, 94, 94, 89,114,185,156,120,123,123, 19, 62,159, 79,220,220,220, 72,237,218,181, 73,203,150, 45, + 73,175, 94,189,200,200,145, 35,201, 87, 95,125, 69,228,114, 57, 17, 10,133,153, 69,223, 43, 75, 51, 24, 16, 73, 36,146,164,176, +176, 48, 82, 22, 90,173,150,100,103,103,147, 11, 23, 46, 16,137, 68,146, 20, 12,136,202,211, 20, 1, 77,130,130,130,178,178,179, +179,137,209,104, 36, 73, 73, 73,228,217,179,103,228,229,203,151, 36, 41, 41,137,104,181,218, 98,237,232,232,104,226,231,231,151, + 37, 2,154,148,165,249, 95,166,168, 78,188,253,242,113,115,235,229,238,238,174, 61,122,244, 40, 73, 77, 77, 37,187,119,239, 38, + 44, 96,197,219,235,149,167,201, 7,186,183,109,219,214,114,247,238, 93,242,248,241, 99, 50,111,222, 60,210,163, 71, 15,210,179, +103, 79,178,120,241, 98,146,146,146, 66, 82, 82, 82, 72,175, 94,189, 44,124,160,123, 69,245,179,180,115,211, 14,240, 9, 9, 9, +209, 26,141, 70, 18, 27, 27, 75,234,215,175,159,194, 6, 70, 73,128,122, 29, 0, 65, 69,245,211, 11,112,240,240,240, 72,191,123, +247, 46, 57,118,236, 24,241,245,245,205, 98, 3, 31,218, 2, 53,109,129,154,108,224,195,154, 53,107,102,221,189,123,151,228,228, +228, 16, 31, 31,159,116, 47,192,225, 61,234, 18, 11,192,206,249,139,191, 37, 81, 41,106, 50,127,241,183, 4, 64, 18, 41,200, 30, +189, 68,107, 36,133,242,223,227,109, 47,242,143,191,175, 16,242,102,175,195,144,144, 16, 6,192,245,242,190,164,101,179, 87,174, + 94,189,154,163,211,233,240,243,207, 63, 43, 63, 24, 60,248,112,135,118,237, 98,107,248,250,202, 25, 22,171,194,217,134,179, 4, +130, 79, 86,175, 94,109,111, 48, 24,240,232,209, 35, 52,109,218, 20,238,238,238,144, 74,165,144, 74,165,112,117,117, 69, 96, 96, + 32,100, 50, 25,108,108,108,240,197, 23, 95,216,101, 9, 4,159, 84,164,107,181, 18, 14, 0, 88,172, 86, 62, 15,152,236,215,172, +217,163, 69,139, 22,177,156,156,156,224,232,232, 8,169, 84,138,151, 47, 95,194, 96, 48, 64, 44, 18, 87,106,144, 86, 22,139,197, +146, 74,165,184,122,245, 42,102,206,156,137,214,173, 91,195,222,222, 30, 54, 54, 54,168, 95,191, 62,186,119,239,142, 73,147, 38, + 33, 54, 54, 22, 76, 37,146, 74,158,115, 56,211, 39, 77,154,228, 26, 28, 28, 92,234,231, 58,157, 14,114,185, 28, 89, 89, 89,168, + 86,173, 26,134, 12, 25,226,250,156,195,153, 94,150,158, 19,224, 94, 45, 32,224,212,131, 7, 15,156, 37, 18, 9,246,238,221,139, + 19, 39, 78,224,252,249,243, 56,123,246, 44, 66, 67, 67,113,242,228, 73,100,101,101, 1, 0, 2, 2, 2,112,232,208, 33,103,169, +171,107,168, 19,224, 78, 79,233,202,145,152,153,121,177,126, 70,134,243,168,145, 35,111,169, 84, 42,140, 26, 53, 10, 43, 87,173, +250,146, 11,204,170,204,247, 3, 1, 59, 71, 15,143, 93,223,126,251, 45, 43, 35, 35, 3, 3, 7, 14,204, 94,187,106,213,132,240, + 11, 23,106,133,157, 63, 95,107,229,210,165, 19, 58,116,232,144,157,146,146,130, 61,123,246,176,220,124,124,118, 5, 2,118, 85, + 45,167, 18,152,185, 97,195, 6,161, 78,167, 67,183,110,221, 98,173,145,145,129,102,224, 87, 21,240,242, 58, 96,172,232,251,233, +192,244, 47,190,248,194, 93, 32, 16,224,179,207, 62,203,214, 36, 38, 54, 48, 3,191,228, 3, 9,249, 64,130, 25,248, 69, 25, 23, +215, 96,204,152, 49,217, 2,129, 0,235,215,175,119, 79,255,125,210,237,202,210, 20,192, 41, 0, 55, 0,164,125, 56,121,230,135, +193,205, 91, 97,207,142, 45,248,102,233,220, 93, 0, 62, 96, 24,102, 31,128, 57,180,230, 81, 40,255, 77, 42,227, 69,254,166, 76, + 46,235, 3, 78, 73, 39, 9,160, 99,121, 42, 14, 78, 78, 77, 27, 52,104,128,155, 55,111, 34, 40, 40,232,129,189,189,189,153, 39, + 16,128,203,229,130, 88, 43,244, 89, 16, 73, 36, 93,186,118,237,202,185,119,239, 30,252,252,252, 32, 18,137,192,229,114,223,120, +241,120, 60,120,120,120, 64,161, 80,160, 75,151, 46,220, 77,155, 54,117,129, 94,255,117,133, 55,196,152,103,210,172,123,223,142, +252,105,247,174,154,237,219,183, 71,126,190, 2, 86,171, 21, 98,177, 24, 6,131, 1, 28, 14,167,160, 9,200, 68, 20,149,217, 99, + 22,139,197,194,102,179,225,231,231,135,149, 43, 87, 66,167,211,129,199,227, 1, 0, 20, 10, 5,228,114, 57,158, 61,123,134,132, +132, 4,144, 74,140, 72,102, 99,103,215,123,232,208,161,165, 78,248,171,215,235,145,159,159,143,252,252,124,200,229,114,232,116, + 58,180,106,213,138,127, 38, 52,180, 55,114,114,214,150,250, 29,161,112,240,158, 61,123, 92,249,124, 62,180, 90, 45,148, 74, 37, +146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, 8, 6, 12, 24,192, 40, 20, 10, 48, 12,131, +144,144, 16,167,253,123,247, 14,133,193,176,142,158,210,149,227, 34,160,111, 98, 48,244,109,209,188,249,213, 7, 15, 31, 6,127, +242,201, 39,136,136,136,248, 86,124,240,224, 13, 13,240,164,188,239,198, 2,211,191, 43, 97, 96, 72, 98, 98,144, 17,200, 42,177, + 74,130,111, 92,220,249, 49, 99,198, 60,141,136,136,112, 94,191,126,189,251, 7, 3, 7, 78, 7,176,162, 42,101,180,177,179,107, +230,225,225,129,115,231,206, 33, 41, 62,126,174, 25,208, 86, 41,188,196,102,183,109,223,190, 61, 78,158, 60,137,148,196,196,185, +230, 55,203, 88,240,160, 4,100,113, 98, 99,231,238,218,181,107,231,248,241,227,193,230,112,218,194, 92,165,134,195, 63, 36,190, +143,159,242, 9,118,109,223,180, 11,192, 68, 0, 86, 0, 15,104,141,163, 80,254,219, 81,173,138,188,200, 63,200,108,109, 7, 80, +181,136,150,171,171,171,151, 84, 42, 69, 90, 90, 26,234,214,169, 35, 19, 8, 4,224,115,185, 16,242,249,149, 42,129, 70,163, 9, +242,244,244, 68,126,126, 62,156,157,157,193,227,241,138, 95,124, 62,191,248,127, 27, 27, 27,176, 88, 44,248,248,248, 64,163,209, + 4, 85,168,155,249,204,245,224,166,105, 31,221,189,113,174,230,192,129,131,224,224,224, 8,111,239,106,112,117,117,133, 72, 36, +130,183,183, 55,106,213,170, 69,214,174, 93, 11,177,107,195, 74, 93,200, 75,154, 39, 14,135, 3,139,197,130,204,204, 76, 68, 69, + 69, 33, 34, 34, 2,119,239,222,197,227,199,143,161, 84, 42, 43, 53,242,171, 70,171,109,196,225,112, 74, 53, 89,114,185, 28,114, +185,188,216,104,101,101,101, 33, 33, 33, 1, 42,181,186,113, 57,166,119, 80,131, 6, 13,216, 0, 32, 18,137,208,184,113, 99,108, +219,182,205,124,250,196,137, 97,245,238,222,117,244,190,112,193,254,167,173, 91,135, 13, 25, 50,196,114,239,222, 61, 40, 20, 10, +188,120,241, 2, 46, 46, 46, 28,190, 80, 56,148,158,206, 85, 35, 12, 80, 59, 43,149, 61, 91,183,110, 29,151,159,159,143, 53,107, +214,176,184, 54, 54,219,151,150,209,196, 87, 12,155,221,166,125,251,246, 56,117,234, 20,210, 18, 19,231, 37,150, 98, 96, 18,129, +172,164,216,216,121,187,118,237, 66,247,238,221,193,112, 56, 85, 78, 84,106,217,178,101, 3,171,213,138,167, 79,159,194, 30,184, + 95,213,239,215,242,247, 15, 46,138,252, 74,128, 91,101,173, 39, 1,110,133,135,135, 67, 36, 18,161,110,189,122, 77,170,248, 51, +107, 25,134, 73, 31, 63,229, 19, 28, 59,127, 7, 0,176,107,251,166,204, 18, 38,139, 66,161,208,136,214, 63, 53,162, 85,100,172, + 74,190,240,134,209,170,164,249, 0, 0,112,185, 92,240, 5, 2,240,249,252, 2,131, 36, 16, 84, 90,131, 97, 24, 8,133,194, 98, + 99, 85,210, 96,149,252, 95, 44, 22, 87,122,232,250,188, 87,231,219, 77,156, 48,158, 47, 16, 8, 96, 48,232, 65, 8,129, 64, 32, +132,189,189, 61,252,252,252,160, 80, 40,208,186, 77, 7,125,178,156, 23,234, 84,119, 64,196,187,236, 61,179,217, 12,181, 90,141, +188,188, 60,228,230,230, 66,161, 80, 64,171,213, 86,186, 43,186,213,106,101, 39, 39, 39,227,215, 95,127, 69, 78, 78, 14,128,130, + 68,235, 34,115, 85,244, 55, 46, 46, 14,123,247,238, 69,124,124,124,149,142, 79,187,118,237, 16, 26, 26,202,238,216,165,203,142, + 75,190,190,105,151,124,125,211, 58,118,233,178,227,212,169, 83,108, 47, 47, 47, 36, 36, 36,224,209,163, 71,200,203,203, 3, 33, +132,246,159,127, 7, 94, 3,121,154,220,220,241, 95,126,249, 37,145, 74,165, 88,243,221,119,141, 86, 0, 35, 42,107, 96,236,202, + 49, 48,118,239,103, 96, 64, 8,129,213,106,133,197, 98,121,167,109, 99, 24,134,225,114,185, 85, 29, 90,161, 42, 43, 23, 39,190, +127,241,213, 74,156, 61,121,164,232,253, 24,106,178, 40, 20,202,191,128, 50, 19,225, 57, 37, 28,100,241,223,178,200,204,204, 76, + 85,171,213, 53,125,125,125,145,146,146,226,234,227,227,147,200,231,114,193,227,243,193,176, 42,246, 4, 98,177,248,105, 90, 90, + 90, 27, 47, 47, 47,152,205,230, 98, 83,245,118,211, 97, 81,148,230,241,227,199, 16,139,197, 79,161, 43,119,228, 4, 88, 12,121, +213,155, 52,105, 82, 28, 25,178,183,183,135,189,189, 29, 4, 2, 33, 22, 44, 88, 96, 93,191,118,237, 22,159,206, 75,243,199,205, +250,146,124,185, 98,199,159,186,103, 43,123, 99, 18,139,197, 79,189,189,189, 91,217,217,217,225,216,177, 99, 72, 72, 72, 64, 94, + 94, 30, 52, 26, 13,244,122, 61, 52, 26, 13, 12, 6, 3,132, 66, 33,234,213,171, 7, 91, 91, 91, 92,190,124,249, 41,244,250,210, +205,101, 78,206,177,167, 79,159,182,106,222,188,121,113, 68,165, 83,167, 78, 76,167, 78,157,156,139,163,104, 26, 13,178,179,179, +241,224,193, 3, 92,190,124, 25, 12,195, 32, 38, 38,198,162,215,106, 15,208,115,226,221,208, 1,191,177,119,237,218, 57,117,234, +212, 9,109,218,180,129, 5,232, 5, 96,239,255,208,192, 0, 0,238,222,189,251,204, 98,177,180,169, 93,187, 54,228, 64, 11, 0, + 39,171,100, 34, 95,189, 10, 55,155,205, 93, 26, 53,106,132, 99,135, 15,183, 3,144, 80,218,122,106,160, 93,112,112, 48,180, 90, + 45, 94, 60,127, 30, 86, 5,147,181, 99,254,226,111, 63, 28, 51,113, 58,246,236,216,130, 93,219, 55, 37,239,220,182,209, 27,149, +200, 31,163, 80, 40,255,169,104, 86,133, 94,228,111,202,228,178,204, 23,167, 42, 42,249,121,121, 97,225,225,225, 53,155, 52,105, +130, 29, 59,118, 52,111,221,170, 85, 42,143,207, 55,243,121, 60,176, 42,113, 35,209,170,213, 87,174, 92,185,210, 98,192,128, 1, +156,123,247,238,193,221,221,189,216,104, 21,253,229,112, 56, 32,132, 64, 44, 22,227,248,241,227, 70,173, 90,125,165,194,104,145, +197,106, 97, 21, 26, 61, 66, 8,228,114, 57,120, 60, 30,214,173, 91,143,205,107,215,142,180, 0, 71, 2, 36, 46,159, 3, 16,254, +207,110,208, 26,205,213,179,103,207, 54, 93,180,104, 17,183, 90,181,106,144,203,229,200,203,203, 67, 78, 78, 14, 20, 10, 5, 20, + 10, 5,242,242,242, 32,151,203, 33, 20, 10, 17, 17, 17, 97,210,105, 52, 87,203,210, 19,232,116, 71,199,142, 29,251, 69,120,120, +184, 7,135,195,129,201,100,130,213,106,133,213,106,133,209,104,196,171, 87,175, 16, 25, 25,137,151, 47, 95, 34, 55, 55, 23, 92, + 46, 23,108, 54, 27,143, 31, 63,206,147,152, 76,135, 13,244,156,126,103,184,192,177,219,183,111, 79, 24, 61,122, 52, 60,171, 85, +235,128,148,148, 74, 25,152, 19,229, 24,152,252,119, 51, 48,191, 27, 32,165,242, 97, 92, 92, 92,155,142, 29, 59,194,163, 90,181, +111,235,165,164, 92,122, 94,133, 60, 45,139,217,124,235,246,237,219, 93,198,140, 25,131, 29, 59,118,124,235, 18, 23,119, 62,235, +173,102, 78, 23,192,165, 70,173, 90,223,126,248,225,135,184,120,241, 34, 44,102,243,173,114, 36, 75,142,248, 94,253,195,201, 51, +189,223, 74,124,223,198, 48,204, 12, 0,107,104,141,162, 80, 40,255,230,136, 86,149,154, 14, 69, 22,203,252, 57,115,230,152, 88, + 44, 22, 6, 13, 26,100,115,242,212,169, 33,143,159, 60,241,147,201,100,246, 22,139,165, 66, 45, 23,189,126,227,156, 57,115,228, + 6,131, 1,129,129,129,200,205,205,133,197, 98, 1,135,195, 1,135,195, 1,195, 48, 96,177, 88,144, 74,165, 8, 15, 15,199,206, +157, 59, 21, 46,122,253,198, 10,111, 18, 22,203,211,189,123,247,130,205,102, 19,161, 80, 8,134, 97,192,225,112,176,126,253,122, +217,102,224, 24, 0,176, 89, 44, 3, 0,176, 88, 76,101,179,119, 43,108,183,228,243,249,176, 22,116, 2,168,112, 93, 7,189,126, +195,234,213,171,149, 47, 94,188,128, 90,173, 46,142,190,169, 84,170,226,228,122,185, 92, 14,134, 97,160, 86,171,113,234,212, 41, +165,131, 94,191,161, 44,189, 28, 32, 35, 37, 38,166, 95,243,230,205,115,226,226,226,144,159,159,143,167, 79,159,226,242,229,203, + 56,116,232, 16, 46, 94,188,136, 87,175, 94,193,108, 54,195,203,203, 11,132, 16,156, 56,113, 34,223,172, 84,246,202, 1, 50,232, + 57, 81, 54,213,221,221,187,184,185,186, 38,185, 56, 59,167, 84,119,119,239,242,246,231,118, 64,116,116,116, 52,204,102, 51,252, +252,252, 28,203,203,211, 34,102,243,237,219,183,111, 99,204,152, 49,240,174, 89,115,149, 47,224,242,246, 58,190,128,139,111,173, + 90,171,138, 12, 12, 49,155,111, 87,181,204, 54,192,166,207, 63,255, 92,203,227,241,112,240,224, 65, 63,147,191,255, 75, 14, 48, + 66, 10,212,233, 8,240, 42,250,190, 7,176,229,171,175,190,202, 96, 24, 6,251,246,237,115,182,171, 85,235, 25, 7, 24,107, 7, + 84,183, 3,170,115,128,177,118,181,106, 61, 59,120,240,160,179,217,108,198,172, 89,179, 50, 60,128, 45,229, 72,206, 36,132,244, + 37,132,180, 39,132,120,239,220,182, 17,103, 79, 30, 41, 50, 89, 19, 81,144,244, 62, 26,192, 51, 90,227, 40, 20,202,191,153, 82, +195, 80,156,230,203, 51, 1,226,218,161,101, 67, 60,124, 18,149,239,236, 96,123,161,232,179,220,200, 35,181, 59, 7,217, 54,252, +225,135, 31,192,229,114,145,156,156,140,231,207,159,195,214,214, 22, 35, 71,142,212,107,149,202,126, 37,230, 58,236, 10,224,114, +161,102,193,124,106,249, 49,210, 90,156,136,154,231,207,134,178,237,236,236,160, 82,169,192, 98,177, 32, 20, 10, 33, 22,139, 33, + 18,137,240,232,209, 35,244,233,219,223,146, 37,110,255,251,128,165,191,207,167, 86,172, 89, 52,214, 80, 11, 64, 28, 14,124,230, +234,233, 57,103,225,194,133,162, 30, 61,122,128,199,227,161, 90,245,128, 12,191,158,107, 54,177, 88,140, 57, 37, 71,177,160, 86, +117, 79,187,231, 49, 9, 0, 24,153,233,193, 66,207, 18,115, 29,254,161,156, 62,134, 27,126,199,127, 89,107,219,184,113, 65, 62, +186, 92, 46, 71,102,102, 38,100, 50, 25,228,114, 57,212,106, 53, 0, 32, 52, 52, 20,103,111,190, 84,104,171, 13,137, 45,171,156, +191,111,123,148,141,167,241,126,141,253,123,127, 97,187,184,184, 32, 51, 51, 19, 89, 89, 89,144,203,229,208,106,181,176, 88, 44, +200,205,205,197,207,187,126,177,228, 72,219,199, 23, 15, 8, 89,158,166, 58, 89,228,168,186,227, 21, 92,207,151, 76,152, 48,193, +198,214,214, 22, 86,171, 21,121,121,121, 72, 74, 74, 66, 92, 92, 28,110,222,188,169,150,201, 13, 80, 59,119, 75, 41, 30,176,180, + 20,205, 63,145,127,156,102,201,113,171, 60, 61, 60,210, 18, 19, 19, 93, 45, 22, 11,188,188,188,204,242,220,220, 85,124,224,162, + 13,144, 14,128,100, 3, 11, 55,108,218, 52,190,127,255,254,104,214,172, 89,114, 70,102,102,141,210,234, 18, 1,216,129,128,157, +166, 90,181,200, 7, 15, 30,184, 39, 37, 37, 97,204,152, 49,217,137,175, 95,207,179, 43,204,215,202, 7,218,249,214,170,181,234, +224,193,131,206, 53,107,214, 68, 80, 80, 80,134, 48, 41,169,126, 20,144, 95, 70,253, 44,243,220,148, 71,159,169, 49,109, 96,131, +102, 31,125,244, 17,204,102, 51,110,222,188,137,251,247,239, 35, 49, 49, 17,119,238,220,145,219, 74, 36,195, 74,204,117, 88,106, +253,236, 21,160,246,219,183,111, 47,195,227,241,176,107,215, 46,132,135,135, 3, 0,130,131,131,241,225,135, 31,194,108, 54, 99, +212,168,209,228, 76,148, 40,182,188,250, 9,160, 1,128,239, 80, 96,242,154, 17, 66,132, 12,195,164, 1,240, 70,213,114,178,104, +253,164,154, 84,243,191,163,249,175,162,220, 73,165, 75,206,167,182,252, 71,216,189, 57,205,199,164,180, 35,219,150,114,218,182, +107, 95,103,233,146,197,172,230,205,155,195,219,219, 27,193,193,193, 72, 74, 74, 18,216,219,219, 87, 52,159,154,170,125,207, 17, +113, 13, 27, 54,180,159, 55,111,158, 93,247,238,221,185,222,222,222, 32,132, 32, 60, 60, 28,199,142, 29, 51,238,216,177, 67,161, +113,235, 43, 15,187,246,171,170, 50,243,169,221, 7, 52, 0,150, 85, 75, 75,219, 62,125,218,180,197,141,155, 52,153,176,100,201, + 18,150, 84, 44,226,174, 92, 48, 81, 8, 0,203,191, 63,100,215,127,200, 72,108,240, 7, 58,140, 40,125, 30,185,146,229, 76, 74, +153,148,216,123, 96, 23,255,207,102,140,183, 12, 29, 58, 84, 98,107,107, 11,111,111,111, 56, 56, 56, 32, 54, 54, 22, 41, 41, 41, +228,244,233,211,170,187,143,163,185, 39, 46, 62, 76, 20,218,121, 84,102, 94, 66,101,251, 30, 31,196,247,238,221,219, 97,236,216, +177, 54, 77,155, 54,229, 10, 4, 2, 8, 4, 2,100,102,102,226,213,171, 87,198,211,167, 79,171, 52,174,189,242,194,174, 29, 84, + 86,114,174, 67,109,251,225, 75, 95,221,186,180,100, 86,228,211,167,163,173, 64, 35,163,209,232,101,177, 88, 24, 22,139,149,110, +181, 90,159, 26,149,202,157,250,224, 37,235,233, 92,135,149,195, 98,177,240, 44, 22, 11,228,114, 57, 46, 93,186,196,121,253,250, +245,194, 39, 79,158, 44, 76, 75, 75,131,201,100,194,224,193,131, 17, 28, 28,140,107,215,174, 33, 43, 51,243,116,121, 90, 81, 64, +190, 32, 37,229,195, 73,147, 38,157,219,187,119, 47,235,201,147, 39,206,187,118,237,250,185, 52, 3, 51,122,244,104,107,102, 82, +210,135,122, 32,191,156,250, 89,222,185,153,125,254,224,230, 39, 3, 6, 13,169,183,100,209, 66,110,235,214,173,225,236,236,140, +118,237,218,193,104, 52,218,215,173, 91,183,162,115, 83,217,190,231,176,216, 70,141, 26, 73,214,175, 95,239, 62,126,252,120,204, +152, 49, 3, 0,160,213,106,113,241,226, 69,204,154, 53, 43, 35,137,211, 66, 93, 81,253, 44,140, 84, 21, 25,176, 27, 0,218, 3, +136, 5, 77,124,167, 80, 40,255, 78,138, 38,149,246, 64,193,196,210,103, 80,240,112, 94,241, 92,135,183,238, 63, 67,201,105, 62, + 10,240,120,110,246, 25,251,122,202,156, 85, 65,108,147,194,129,203,232,108, 99,162,163,153,138,230, 60, 44,158, 79,205, 46, 64, +229, 20,119,160,249,202,229,203, 63,217,176, 97, 67,151,162, 33, 28,196, 98,241, 83,173, 90,125,197, 69,175,223,168,177, 11,184, + 82,213,185,249, 82,128, 76, 0,211, 28,194,194, 54,133,244, 31,188, 90,232,232,199,253,114,197, 14, 29,155,197, 50,188, 74,203, +194, 6,127, 64, 82,137, 14,146, 26, 3, 16, 41,247, 48,103, 58, 13,137,250,234,243,207, 63, 91,190,108, 89,115,169, 84,218,193, +104, 54, 7, 88,173, 86,192,106,141,209,168,213, 55,136,209,248, 64, 31,188,104,173,208,206,131, 84,122, 94, 66,251,186, 74,199, +248, 35,205,119,239,220, 57,243,240,225,195,127,216,118, 39,189,126,147,198,190,238,229,202,108,123,201,117,116,192,111,144,201, +126, 43, 47,116, 73,231, 58,172, 28, 28,171,117,178,131,131,195,158, 46, 93,186, 8,187,118,237,138, 62,125,250,160,117,235,214, +176, 90,173, 32,132, 64,169, 84,226,208,161, 67, 88,189,122,117, 76, 13, 96, 89, 69,122,122,224,138,224,236,217, 94,141, 26, 53, +218, 85,158,129, 41, 52, 89, 21,230, 36,150,127,110, 10, 98,204,118,253, 18,134, 79, 95,233,111, 80,164,219, 59,137,205,238,145, +207,158,178, 42,127,110, 6, 42, 45,225,135, 90, 12, 30, 56,112, 58,155,195,105, 87,216, 3,146,188,120,254, 60,172,104, 82,105, + 4,127,120,169,138,117,169,104,236, 58,154,248, 78,161, 80,254,237, 70,171, 15, 10,242,181,138,167,228, 41,115,174,195,162,168, + 15,135,195,145,197,158,152, 50,178, 60,117, 46,208,165, 48,146,133, 10,231, 58, 44,252, 63, 1, 80, 66,175,255,250,141,193, 72, + 75,244, 46,228,190,181,126, 85,134, 69,204, 3,162, 96,214,135, 64,246, 28, 56, 53,173, 64,175,249,242,185, 37,183,169,204,155, +236, 27,191,203,203,213, 1,183,160, 82,221,130, 74, 85,106,210, 46,151,195,203,173,168,156,111,111,123, 18,160,120,223,109,127, + 91,179, 66,243,240, 30,251,243,191, 70,106,118,246, 9, 0,210,106,161,161,110,231, 67, 67,135,126, 54,123,246, 96, 15, 79,207, + 90,206,206,206, 14, 54, 54, 54,172,123,247,238,197,153,117,186, 77,141,129,221,133,209,212, 10,209, 3, 87, 2,147,146,234,127, + 48,112,224,116,134,195,105, 91,210,192, 16,179,249,142, 31,176,165,188, 72,214,187,158,155,222, 2,143, 46,133,145, 44,176,129, + 73,149,169, 27, 41, 5,229, 88, 1,179,121, 5, 34, 34, 74,169,243, 85,174, 75,203, 25,134, 81,130, 38,190, 83, 40,148,127, 47, + 69,243, 29,158,249,255,254,225,174, 84,147,106,254,139, 52,217, 40,232, 69, 71,247, 39,213,164,154, 84,147,106, 82,202,165,104, +174, 67, 14,221, 21, 20, 74,165,177,224,247,102, 48, 10,133, 66,161, 80,138, 40,202,205, 42,201,118,160, 32,117,167, 44, 87, 90, +149,222, 4,239,226,108, 47, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246, 63,177, 55, 99, 81, 78, 86,113, +110, 86,101,103,183,121, 95,104, 88,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255,118, 60, 10, 77, 86,241,171,168,233,144, + 69,247, 13,133, 66,161, 0, 75,150,128, 69, 8, 24, 66,150,176, 8, 57,204, 38,100, 8,155, 16,188,215, 84, 32, 67,134,148, 62, +152,237,199, 35, 29,108,232, 30,167, 80,254, 85,164,163,140, 73,165,105,142,214,255, 22, 31,119,119,247,109, 0,152,140,140,140, +201, 0,146,232, 46,249,251,225,232,232,216,197,108, 54, 67,161, 80, 92,249, 55,110, 95,189, 90, 24, 72, 88,168, 91,252, 6, 65, +210,139, 87,216, 83,218,186,117,253, 49, 6,204,239, 99,113, 49, 86,188,120,254, 26,199,171,240,115,172, 94, 93,189,183, 0,192, +185,203,201,211,241,215,140,171, 85,219,197,197,229, 2,135,195,225, 88, 44,150,105, 50,153, 44,180,108, 35, 52,132, 13, 0, 92, +114,109,190, 60,195,117,222,167, 83, 25,174, 70,191, 83,174,215,170,243,217, 92,118,188,128,235,126,123,202,120,214,185, 60, 85, +171,231,165,125,255,200,145, 35,101,206,226, 93,223, 31,189, 88,150,122,125,131, 27,196,197,126,183,177,249,134, 14,126,206,220, +184,228,199,210,111,183,230,111,227,219,251,246, 29, 51,148, 9,229,136,153,209, 59,119,230,168,232, 89, 86,121, 86, 2,142, 70, + 32,136, 43, 16,120, 91,204,102, 55, 6, 32,108, 14, 39,211,164,215, 39,243,128,136,249,128,252,223,174,201, 19, 8,170, 89,204, +102, 55, 0,248, 59,150,147,242, 38,101, 26, 45,169, 84,250,136,197, 98, 85, 43, 57, 25,110,209,124,130, 69,239,149,252,140, 97, + 24, 88, 44,150,148,188,188,188,166, 85,248,125, 91, 0, 67, 1, 20,117, 81,223, 15,224, 16,222, 61,225,216,150,199,227,205,145, + 72, 36,157,181, 90,109,125, 0, 16,137, 68,145,106,181,250,170,209,104,252,238, 29,117, 57, 0, 62,144, 74,165,157, 88, 44, 86, + 39, 66, 8, 67, 8,185,166, 82,169,174, 2, 56, 12,224, 93, 70, 74, 16,185,186,186,174,112,116,116, 28, 49,127,254,252, 28, 39, + 39,167,192, 89,179,102, 61,204,205,205,253, 53, 59, 59,123, 1,170, 48, 71,221, 95, 76, 45,119,119,247,253, 92, 46,151,157,156, +156,220, 9, 0,188,189,189,175, 25, 12, 6,139, 76, 38, 27, 9,224,117, 21,245, 36, 0, 90, 74,165,210,166, 82,169,180,189,197, + 98,169, 91, 56, 63,227, 11,149, 74,117,211,104, 52, 62, 2,112, 15,128,250,111,116,142,216,112, 56,156,189,133,117, 61, 0,128, +242,223,118, 17, 32, 44,212,125, 30,249, 50,176,216,120,213,175, 83,246,202, 12,124, 74, 89,183,210, 70,171,115, 7,143,190,253, +250,117, 99, 1,128,193,116,174,239,213, 27,233, 39,255,108,147, 53,104,208,160,223,246,238,221,235,160,215,235, 49,121,242,228, +253,151, 47, 95,222,162, 80, 40,230,151,123,225,144, 58,204, 90,179,254,162,152, 97, 88, 0,224,106,181, 90, 92, 83, 83, 95, 7, + 60,127,246, 91,207,200,200,187, 43,181, 47,175,222,179, 50,220, 41, 70,180,123, 89,153, 66,212,245, 67, 72,223,193, 3,251, 44, + 91,182, 4, 35,134,141,168, 30, 25,169, 19,121,217,198,242,115,181, 18,127, 39, 23,215,126,203,150, 31, 97,110,223, 58,209,111, +239,174,165, 87,199,143,119,234, 76,205, 86,165, 96,150,115, 56, 45,237,252,253,219, 15, 59,113, 2, 82,111,111, 14, 71, 32, 96, + 1,128, 89,175,247, 86, 37, 39,123, 28,236,215,175,197,146,232,232,235, 75,128,251, 84,243,127,162, 73,169,138,209, 98,177, 88, +213, 82, 83, 83, 93, 37, 18, 73,193,197,152, 16, 88, 44, 22, 88, 44,150,226,201,139, 9, 33,197,127,205,102, 51,234,212,169, 83, +169, 39, 90, 0,157, 1,140,235,216,177,227,144,239,190,251,142, 27, 20, 20, 84, 52,101, 72,187, 47,191,252,242,251,240,240,240, +163, 0,118,163, 96,240,198,202, 62,241,246,144, 72, 36,251,214,172, 89, 99,219,173, 91, 55,142,167,167, 39, 24,134, 65, 70, 70, + 70,203,203,151, 47, 55,157, 53,107,214, 52,181, 90, 61, 10,192,133, 42,236,159, 6, 54, 54, 54, 71, 6, 14, 28, 88,173, 67,135, + 14,194,122,245,234,193, 98,177,224,241,227,199,227, 31, 61,122, 52,252,232,209,163,139,149, 74,229, 16, 84,126,190, 54, 70, 42, +149,142,181,181,181, 93,177,104,209, 34,199, 81,163, 70,241,159, 61,123,150,231,231,231,199,220,190,125,219,229,208,161, 67,211, + 86,173, 90,245,129, 66,161, 88,160, 82,169,126, 65, 37,230, 80,180,177,177,121,196, 98,177,170, 85,198, 8, 3,168,138, 25,110, + 92,163, 70,141, 67,183,110,221,170,145,144,144, 96, 25, 48, 96,192, 30, 0,184,122,245,106,144,201,100, 98,186,119,239,126, 46, + 37, 37,101, 40,128,199,149,220,246,134,142,142,142, 39, 71,140, 24,225, 88,171, 86, 45,113,141, 26, 53, 24,137, 68, 2, 54,155, +141,252,252,124,207,103,207,158,117,189,127,255,190,246,242,229,203,185,122,189,190, 31,128,136, 42, 28,167,214,174,174,174,163, +185, 92,110, 3,179,217,236, 5, 0, 28, 14, 39,213,100, 50, 61,147,201,100,123, 1,252,246,174, 39,136,155,155,219,230, 21, 43, + 86, 56,203,100, 50,178,106,213,170,205, 74,165,114,236,191,245, 98,176,255,215,195,120,244,240, 62, 80, 48,109, 14, 83, 74,253, + 99, 0,240, 62,253,116, 54,154, 54,107,129,145, 35, 62,168, 80,179,119,151,106,107,184,124,158,147, 78,167,251, 45, 95,163, 63, + 44, 17, 11,135,142, 24, 30, 18, 3, 0,231,206, 95, 31,218,188,185,195, 53, 59,177,224, 3,161, 80,216,218,100, 48,230,156,189, +146,242,121, 85, 76,149,151,151,215, 5, 7, 7, 7,113,110,110,110, 70, 86, 86,214,143,125,251,246, 93,190,123,247,110,135,184, +184, 56, 36, 39, 39,227,147, 79, 62,145,166,164,164, 76,143,136,136,184,107, 48, 24,202,140,108, 41,149,185, 27,191,156,215,127, +145,157,157, 51, 91, 34,182,133,141,157, 35,252,106, 53, 66,203,214,125,209,171,207, 4,188,138, 9,111,185,123,215,178,240,212, +212,203,223, 72, 29,107, 46,151,203,107,148,121, 93,170, 87, 27, 29,250, 13, 44, 48, 89,139, 22, 45, 65,244,203,151,202,132,120, +214,199,103, 78,112,196,189,186,212, 17,152, 13, 25, 9,183,111,157,168,209,182,221, 0, 0,104,186,119,215,210,171, 31,143,116, +232,178,121,127,158,146,222,146,202,190,118, 46,227,114,199,246, 88,191,222, 53,120,218, 52,158, 42, 62,222, 24,187,117,171, 38, +243,230, 77, 11, 71, 32, 32,222, 61,123, 50, 46,157, 58, 9,167,189,120,193,187,179,106, 85,123,238,210,165,126, 11,140,198,125, + 84,243,255, 85,243,191, 78, 81, 18,124,201,222,135,219,203, 53, 90, 12,195, 64, 34,145,224,224,193,131,224,114,185,224,112, 56, +224,114,185,101,254,239,227,227, 83,153,130, 12,114,119,119,255,126,203,150, 45,110, 61,122,244,128, 80, 40, 44,254,128,205,102, +163, 91,183,110,232,218,181, 43, 55, 45, 45,109,248,193,131, 7,135,175, 92,185, 50, 83, 46,151,207, 64,225,196,208,229,208, 41, + 48, 48,240,216,197,139, 23, 69, 58,157, 14, 55,111,222, 68, 94, 94, 30,248,124, 62,170, 85,171,134,238,221,187,115, 94,190,124, +233,216,173, 91,183, 99,209,209,209, 33, 0,174, 85,162,172, 77, 93, 93, 93,111, 28, 62,124, 88,216,168, 81, 35,230,213,171, 87, + 8, 14, 14, 6, 0,228,231,231, 99,192,128, 1,194, 81,163, 70,213, 26, 62,124,248, 61,153, 76,214, 1,192,163, 10,244,154,184, +187,187,255, 50,112,224, 64,207,149, 43, 87,218,218,216,216, 32, 33, 33, 33,221,221,221, 61,160,104,127, 15, 31, 62,156,223,183, +111, 95,143,213,171, 87,111, 60,114,228,200,231, 50,153,108, 44,128,176,114, 93,107,161, 33, 22,139,197,200,204,204,196,254,253, +251, 49,125,250,116,176,217,108,200,100, 50, 28, 58,116, 8, 31,127,252,113,145,161,169,148, 25, 22,139,197, 93,253,253,253,127, +190,122,245,106, 53,123,123,123,120,122,122,178,190,250,234,171, 6,126,126,126,162,234,213,171,179,211,211,211,113,236,216, 49, +191,209,163, 71,159, 76, 74, 74, 26,175,215,235, 43,108, 82,115,115,115,219,121,230,204, 25,159,200,200, 72,108,221,186, 21,185, +185,185,224,243,249,176,183,183,135,187,187, 59, 2, 2, 2,152,121,243,230,137,251,246,237, 43,158, 49, 99,198, 78,131,193,208, +184, 18,199,168,145,171,171,235,182, 78,157, 58,249, 45, 93,186,212,222,221,221, 29, 69, 15, 6,249,249,249,213, 18, 18, 18, 90, + 46, 90,180,104,200,163, 71,143,226,100, 50,217, 20, 0, 79,170,120,226, 52,174, 87,175, 94,200,128, 1, 3,216,233,233,233,216, +187,119,111,136, 82,169,108, 92, 5,115,249,143,226,209,195,251,152,252,209, 39, 42, 79,111,111,222,197, 11, 63, 15, 58,114,188, +246, 67,123, 81,193,132,212,114, 45,140, 67, 6, 70, 55,235,222, 99, 2,175,119,159, 1,170,237, 63,108,148, 86,198,104,113,249, + 60,167,253,251,214, 37,221,186,253,168,193,165,203,247,123, 14,234,215,143,240,120,246,126, 0,240,249,172, 79,185,199, 78,157, +218,213,173,107,139,180,118,109,155, 38,141, 28, 53,219,167, 10,197,173, 93,187,118,237,235,225,225,225,110, 2,129, 0,185,185, +185, 78,219,183,111, 95,215,182,109, 91, 86,108,108, 44, 94,190,124,137,248,248,120,228,231,231,163, 91,183,110,210,176,176,176, + 31, 1,148,105,180,140,172,206, 43, 60,171,155, 54, 57,137, 36, 53,140, 22,133, 43, 49,165,215,187,116,230, 82,195, 3,123,181, +193,110, 30,117, 2,198,125,184, 24,203,150, 31,229,254,186,255,219, 69, 87, 46, 31, 0, 88, 53,202,158, 17,128,160,245,151, 11, +230, 67,161,212, 99,212,136, 73, 24, 61, 98,146, 19,129,193,131, 88,116, 18,131, 54,207,222,134,247, 34,116,203,142,117, 3, 1, + 84, 43, 97,182,174, 80,179, 85, 54,203, 56,156, 22, 33,223,127,239,210, 96,226, 68,193,147,165, 75,213,217, 55,111,106,253,123, +247,206, 11,158, 58, 85, 15, 0,202,248,120, 94,244,226,197, 98,151,246,237, 69,173,230,204,113,176, 24, 12,238,203,150, 45,107, +190,168, 96,242,242, 42,105,250, 12, 29,106, 89,180,107, 87,179,155,179,103,119,100, 76, 38,118,207, 86,173, 30,175,218,187, 55, +245,125, 52,255,204,114,166,221,184,161,207,245,243, 67,240,128, 1, 57, 62,174,174,250, 63,115,219,223,167,156,148, 98,138,114, +181, 38,151,124, 66, 69,104,104,104, 7, 0,215, 1, 44, 13, 9, 9, 89, 2, 0,118,118,118,153,114,185,220,245,216,177, 99, 21, +154, 44, 46,151, 11, 15, 15, 15, 4, 4, 4,200,100, 50,153, 91, 57, 5, 72,182, 90,173,213, 8, 33,197,209,151,178,208,235,245, +136,137,137, 65,195,134, 13, 83, 80, 48, 17,109,153, 65, 29,177, 88, 28,251,242,229, 75,231,231,207,159,227,209,163, 71,240,243, +243,131,131,131, 3,184, 92, 46, 76, 38, 19, 20, 10, 5, 2, 3, 3, 33, 16, 8,208,164, 73,147,108,181, 90,237, 87, 65, 19,144, + 64, 34,145,196,220,184,113,195, 59, 56, 56, 24, 15, 30, 60,128,183,183, 55,220,221,221, 1, 0,241,241,241,184,125,251, 54,122, +247,238,141,240,240,112, 12, 30, 60, 56, 89,173, 86, 7, 0,208,151, 37,232,232,232,152,126,245,234,213,148,160,160, 32,157, 90, +173,102,101,102,102,114,111,222,188,105, 86, 42,149,210,252,252,124,174, 92, 46,231, 42, 20, 10,142, 90,173,230,178, 88, 44,158, + 86,171,229, 94,185,114,133,109, 52, 26,203, 29, 32,179,232, 56,157, 58,117, 10, 65, 65, 65, 56,118,236, 24, 62,251,236, 51,220, +185,115, 7,222,222,222, 56,124,248, 48,230,204,153,131,168,168, 40, 56, 59, 59,163, 94,189,122, 21, 29, 35,212,170, 85,235,213, +211,167, 79,107,241,120,188,162,121, 29,139,230,203, 67, 86, 86, 22, 94,191,126,141,212,212, 84,248,251,251, 99,196,136, 17,175, + 83, 83, 83,253, 43,170,121, 94, 94, 94, 89,145,145,145,206, 13, 27, 54, 68,102,102, 38,236,237,237, 97,103,103, 7,123,123,251, +226,255,253,252,252, 48,123,246,108,184,187,187,203,116, 58,157, 91, 69, 38, 40, 40, 40,232,194,149, 43, 87,156,109,109,109,145, +145,145, 1,133, 66, 1, 14,135, 3,177, 88, 12,103,103,231, 98, 35, 31, 19, 19,131, 62,125,250,100,199,198,198,246,168,130, 73, + 98,185,185,185,189,140,136,136, 8, 32,132, 32, 41, 41, 9, 81, 81, 81,248,232,163,143, 98,116, 58, 93, 29,252,139,230,236, 43, +145,119,197, 27,251,225,100,222,192,254,173, 13, 47, 34, 67, 25,129, 53, 10,141, 27,216,230, 3,192,227,103, 10, 59, 61, 43, 16, +117,235,135,144,227, 39,127,227,255,178,123, 59, 23, 86,184,129, 65,212,139, 24,124, 93,150,118,247, 78, 30, 19, 63,253,116,124, +131,142,109, 59,176,148,106,181,235,143, 63,174,111, 18, 27,251,194, 21, 0,252,252,234,202,166, 77,155, 21,102, 35,145,200,174, +223,190, 97,221,176, 97,231,179,139,215,210,119, 84,162,200,126, 1, 1, 1,119, 79,157, 58,229,236,234,234, 10, 59, 59, 59,168, +213,106, 24,141, 70, 60,127,254, 92,119,240,224, 65,147,173,173,173, 77, 70, 70, 6,228,114, 57, 24,134,193,169, 83,167,146, 0, +248,190, 45, 84,148,163, 5, 0, 31,245,170,203,173,215, 57,192,129, 39, 48,139, 68,220,104, 15, 48, 22, 1, 67,164,110,231, 46, + 60,110,120,238,210,131,145, 3, 7,125,230,210,174,195, 64, 44, 90, 56,196,148,150,150, 20,108, 68,187,151,165,229,104,213,241, + 71,231, 1,131, 7,126,176,108,217, 18, 44, 89,180, 20,161,167, 78,228, 75, 37, 44,189,173, 61,215,174,125,203, 54,186,217,211, +251, 39,171, 84,105,222,203, 86, 31, 28,209,167,255,236,106,109,219, 13,192,237, 91, 39,176,119,215,210, 71,140,136,208,102,196, +183, 88, 2, 56,216,251,249, 77,153, 25, 19,195,123,178,100,137,202,156,150,150,215,116,214,172,236,210,214, 77,185,116, 73,194, +247,244,180,117,232,215,207,113,163,175, 47, 49,201,100,219, 74,203, 49, 42, 77,243,178, 84,106,127,224,220,185, 46,132,203,237, +240,197,220,185,162,144,144, 16, 40, 20, 10, 28, 61,122, 20,219,182,110,213,123,120,120, 60,245,124,246, 44,188,129, 66,177,176, +178,154, 77,103,205,202,182, 88, 44,204, 7,115,230,116,139,140,143,239,156, 33,147, 85, 7, 0, 15, 71,199,228,166,126,126,143, +118,134,134, 70,109,174, 81,195, 90,217,114,254,116,254,188,219,145,132,132,137,142,142,142,162, 76,153,140, 35,224,243,115, 90, +214,171,119,248,135, 5, 11,174,155, 35, 34,120,194,106,213,108,237, 66, 66,170,188,237, 77,103,205,202,206, 85, 42, 57, 51,151, + 47,111,147,152,153, 89, 93,165,215,251,203,149, 74,119,139,201,196,178, 21,139,115,106, 6, 6,202,180, 55,111,166,215,212,104, + 62,217, 1,200,254,170, 99, 93,154, 23,249, 7,241,246, 56, 90,103, 8, 33,111,204,117,120, 61, 36, 36,228, 15,189,107, 8, 33, +149,138,102,113,185,220, 55,154,169,202,129,199, 48, 12,194,194,194,224,228,228, 4,119,119,119, 8, 4,111, 78, 62,152,149,149, +133, 59,119,238,224,197,139, 23,104,212,168, 81, 81, 51, 70,217,142, 72, 32,248,116,245,234,213,246, 6,131, 1,143, 30, 61, 66, +211,166, 77, 33, 16, 8,192,227,241,222, 48,129, 50,153, 12,245,235,215,199, 23, 95,124, 97,183,114,229,202, 79,245,122,125,153, + 79,164, 28, 14,103,198,164, 73,147, 92,139, 34, 88,201,201,201,104,210,164, 73,241,231, 46, 46, 46,120,252,248, 49,154, 54,109, +138,106,213,170, 97,200,144, 33,174,123,247,238,157, 97, 54,155,191, 43, 75,147,207,231,179,130,130,130,154, 1,128, 68, 34, 1, +139,197,138,182,181,181,117,113,115,115,147,216,218,218,254, 97, 27,119,237,218, 37,103,177, 88,166, 10,221, 0,139,133,140,140, + 12, 52,104,208, 0,249,249,249, 0, 0,181, 90, 13,127,127,127, 40, 20,138, 98,211,234,233,233, 9,173,182,252,212,175,134, 13, + 27, 46,169, 83,167, 78,119,137, 68, 34,224,114,185,120,242,228, 9,130,131,131,113,240,224, 65,248,248,248, 64, 44, 22, 35, 38, + 38, 6, 65, 65, 65,184,113,227, 6, 92, 92, 92, 80,191,126,125,129,171,171,235,173,220,220,220,107,137,137,137, 75,202, 41, 39, + 75, 42,149,226,198,141, 27,216,185,115, 39,226,227,227,145,150,150, 6, 27, 27, 27, 52,110,220, 24,245,234,213, 67,235,214,173, + 17, 19, 19, 3,166,226,202,228, 30, 16, 16, 16,250,224,193, 3,103, 66, 8,246,238,221, 11,149, 74, 5,131,193, 0, 22,139, 5, +161, 80, 8, 7, 7, 7,116,238,220, 25, 46, 46, 46, 8, 8, 8,192,161, 67,135,156,123,245,234,117, 86, 38,147, 53, 6,144, 81, +209,126,117,112,112,248,100,241,226,197,222,174,174,174, 72, 72, 72, 64,126,126, 62,220,220,220,208,177, 99, 71,175,203,151, 47, +127, 98, 50,153,214,255, 91,110,100, 37, 18,223,153,139, 23,126, 30, 20, 80, 51, 47,168, 81,160,216,251, 88,168,155,247,193, 80, + 89,125, 0,104, 80,215, 45,114, 80,136, 56,249, 73,100,104,242,197, 11, 39, 30,189,136,198, 49, 84,162,105, 59, 95,163, 63,124, +233,242,253,158,193,141,154, 88, 87,127, 59,167,207,244,143, 38, 10, 92,221, 38, 32, 51,233, 4, 46, 95, 13,243,153,243,217, 36, +151,239,214,254,116,238,210,229,251,172,124,141,126, 97,229, 66, 89, 62,155,119,255,208,218, 89,153,125, 4,175, 94,242, 33,178, +105, 0, 63,191,218, 80, 40, 20, 16, 10,133,194, 17, 35, 70, 88,230,207,159,175,177,181,181, 21, 51, 12,131,107,215,174,201, 0, +244,168, 72, 87,231,234, 64, 44, 70,147,153,240,217, 86,194,216,104, 25, 75, 46,255,217,243, 56,116,239,218, 41,179,109,139, 6, + 43,231, 47, 91,251,101, 64,237, 96,151,241, 19,151,114,151, 47, 25,185, 21, 12,218,149,166,243,242, 21,174, 50,135,143,139, 0, +244, 89,246,245, 18,196,198,198, 56, 76, 30, 39, 95,202, 17,136, 60,235,248,182,177,217,186,243, 90, 79,127,255, 26,213,103,207, + 24,114,102,221,247,235,250,148,140,108,237,222,181,248, 36,128, 46,149,217,183,255, 33, 26,142, 14, 13,133, 42, 41,201,148,123, +235,150,174,203,247,223,103,123,247,232,177,222, 96, 52, 58, 23, 93, 42, 88, 12, 3,166, 40,117,194,106,101, 56, 95,124,193, 34, + 28, 14, 76, 14, 14,227,144,151, 87,187, 34,205,207,210,211, 7,141,156, 56,177,207,201,243,231, 81,163, 70,141,226,251,153,189, +189, 61,230,204,153,131, 89,179,102, 9, 30, 63,126,220,252,200,145, 35,205,191, 91,179,198, 13,192,160,202,148,243,226,189,123, + 14, 83,151, 45, 91,208,168,105, 83,159, 61,251,247, 11,106,213,170, 5, 0,120,253,250,117,192,183,171, 86,249, 54, 8, 10,202, + 92,249,233,167,187, 35,231,207,175, 15,224, 86,121,154, 25, 55,111, 26,142, 36, 36, 76,188,122,237,154,125,131, 6, 13, 0, 0, + 81, 81, 81,174, 27, 55,110,156, 84,127,200,144, 81,203,166, 77, 91, 24,162,211,201,109,179,178, 4, 33,155, 55,115, 14,124,240, + 65,133,154, 69,229, 4,128,142,227,199,127,218,174, 83,167,122,131, 38, 78,116,244,241,241, 97,164, 82, 41,140, 70, 35,210,210, +210, 28, 34, 35, 35,107,133, 42,149,138,227,247,238,237,133,197,210,237, 47, 60,214,165,122,145,127, 88, 36,235,143,158,162,240, +111,199,208,208, 80, 2,160, 99, 72, 72,200,141,162, 27,184,197, 98,169,148,201,226,112, 56, 96, 24,166,178,102, 11,132, 16,100, +103,103, 35, 59, 59,187,184,233, 72, 38,147,225,234,213,171,136,137,137, 1,151,203, 5,143,199,131,209, 88,241, 28,180, 18,137, +164,107,215,174, 93, 57,247,238,221,131,159,159, 31, 68, 34, 81,113,185,138, 94, 60, 30, 15, 30, 30, 30, 80, 40, 20,232,210,165, + 11,119,211,166, 77, 93,203, 51, 90,118,118,118,189,135, 14, 29,202, 47, 90, 86,169, 84, 96,179,217,197,166, 69,165, 82, 33, 55, + 55, 23,114,185, 28, 58,157, 14,173, 90,181,226,135,134,134,246,206,201,201,249,174, 50,219,175,209,104, 84, 50,153,204,190, 93, +187,118, 14,187,119,239,142,106,213,170, 85,224, 27, 53,237,250,117,157, 78,167,227,178, 88,172, 74,205,163,183,111,223,190,226, +125,159,154,154,138,173, 91,183, 22,127, 22, 19, 19,131, 77,155, 54, 21, 79, 5, 80,222, 49,170, 83,167, 78,175,189,123,247, 54, +221,179,103, 79, 30,155,205, 70, 84, 84, 20,246,239,223, 15, 66, 8, 92, 92, 92,160,209,104,144,153,153,137,107,215,174,193,108, + 54, 67, 42,149,194,203,203, 75, 56, 99,198,140,182, 75,151, 46,229,150,103,180, 44, 22,139,133,205,102,195,215,215, 23,139, 22, + 45,130, 78,167, 3,143, 87,224, 47, 21, 10, 5,228,114, 57,194,195,195,145,144,144, 0, 82,193, 40,111, 66,161,112,200,158, 61, +123, 92,249,124, 62,180, 90, 45,148, 74, 37,146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, + 8, 6, 12, 24,192, 20, 25,206,144,144, 16,167,189,123,247, 14, 51, 24, 12, 21,153, 36, 23,119,119,247, 47, 39, 77,154, 36, 44, + 89,103, 51, 50, 50, 48,104,208, 32,241,111,191,253, 54, 95,161, 80,236, 7,144,245, 47,187,161,145, 35,199,107, 63,124,116, 57, + 42,232, 88,168,155,119, 98,138,165,205,156,207,215,114, 0, 96,251,182,111,218, 28, 11, 77,189, 83,167, 70,102,242,145,227,181, + 31, 58, 56,188,168,200, 8,176, 58,119,240,232, 43, 17, 11,135, 14,234,215,143,252,248,227,250, 38,211, 63,154, 40,240,173, 61, +167, 32,194,201,117, 69, 23,243,215,140, 70,251, 90,248,227,143,235,155, 12,234, 55, 56, 60, 62, 62, 97, 91,231, 14,130, 67, 87, +111,164,159, 46, 47, 98,232,234, 36,244, 18, 11,212,240,242,171,135,192,186, 18, 60,126, 18,133,163,135,239,162,110,253,150,208, +235,245, 48,155,205,146,190,125,251,106, 14, 30, 60,168,139,142,142, 86,106,181,218, 14, 0,162, 43,218,248,148,148,231,214, 64, +247,150, 70,158, 72, 96, 86,230,243, 52,243, 22, 30,249,160, 73,139,238, 77, 29, 60,188,184, 46, 18,235,233, 94,221,154,239,223, +185, 99,209,172,133,139,247,163, 89,243,238,173, 94, 68,221,170, 7,224,105,169,230, 53, 22,161,172,163,199,205,177,175, 94,245, + 73, 76, 72, 72,169,237,230,110,120, 45, 39,166, 79,230,253,212,173, 93,135, 33, 13,107,213,109,207,127,241,252, 6,179,232,139, + 97,191, 46, 91,189,110, 68,145,217,186,114,233,215, 14,227,198,221,229,239,222, 93,118,116,252,191, 6, 79, 32,168, 38,245,245, +229,196,239,222,173,245,235,219, 55, 15, 0, 12, 70,163,115,124, 66,130,157, 88, 44, 6, 33, 4, 38,147,233,141, 28,226,162,188, +225, 6,129,129,110,149,209,140,255,234,171,134, 95,124,241, 5, 50, 50, 50, 96, 54,155,193,229,114,223,190,102, 67,173, 86, 99, +220,184,113,216,188,102, 77,203,202,104, 90, 44, 22,102,234,178,101, 11,230, 46, 88, 80,107,202,148, 41,172,146,215, 94, 71, 71, + 71, 28, 57,122,148,191,101,203,150,106, 95,110,222, 60,110,164, 64, 16, 11,189,190, 92,205,108,127,127, 56,102,102,138,138, 76, + 22, 0, 4, 6, 6, 98,235,214,173,130, 9, 19, 38,240,251,246,237,187,246,113,163, 70, 27,215,183,109,251,202,169,118,109, 91, +190, 64, 80,173, 34,205,162,253, 9, 0, 74,157,174,193,250,141, 27, 29,238,223,191,143,204,204, 76,100,100, 20, 60,143, 50, 12, +131,102,205,154, 49,163, 71,143,182,171,233,237,221, 28, 22,203, 95,121,184,255,224, 69,254, 65, 76, 46,229,189,223,115,180, 10, + 55,136, 41,220, 64,166,196,205,241, 13,195, 82,145,209,122, 23,228,114, 57,228,114, 57,118,236,216, 1, 30,143, 87,124,243, 5, + 0,131,193, 80, 25,211, 18,228,233,233,137,252,252,124,212,174, 93,251,141, 72, 22,143,199, 3,135,195, 1,143,199,131, 64, 32, +128, 94,175,135,143,143, 15, 52, 26, 77, 80,121,154, 90,173,182,177,163,163, 99,241, 13, 86, 95, 88, 89,245,122,125,113,121, 13, + 6, 3,242,242,242,160, 82,169,160, 84, 42,161, 86,171,131, 43,179,189, 86,171, 21,207,158, 61,123, 29, 24, 24,216,152,205,102, + 67, 42,149, 74,212,106,117,113,110, 81,110,110, 46,126,249,229, 23,245,152, 49, 99,156, 79,157, 58, 85,161,209, 98, 24, 6, 31, +127,252, 49, 4, 2, 1, 52, 26, 13,126,252,241, 71,204,156, 57, 19, 60, 30, 15, 74,165, 18, 91,183,110,197,236,217,179,193,225, +112, 96, 48, 24,176,113,227,198, 50,181,158, 63,127, 30,127,239,222,189,224, 38, 77,154, 56, 28, 63,126, 60,171, 91,183,110, 46, + 61,122,244,128, 72, 36,130, 86,171,133,201,100, 66,203,150, 45, 81,167, 78, 29,200,100, 50,156, 59,119, 46, 59, 32, 32,192,249, +254,253,251,214,140,140,140,196, 10,204, 53, 41, 17, 49,132,197, 98, 65,102,102, 38,228,114, 57,178,178,178,144,150,150,134,148, +148, 20,112, 56,156, 10, 71,211,117,114,114, 26,220,160, 65, 3, 54, 0,136, 68, 34, 52,110,220, 24, 11, 22, 44, 48,107,181,218, +161, 0,206, 21,174,214,235,167,159,126, 58,126,251,246,109,142,167,167, 39, 94,190,124, 9, 23, 23, 23,142, 80, 40,172,208,104, +185,187,187,239, 58,125,250,180, 99,145,185, 46,218,207, 26, 77,193,225, 24, 52,104,144,227,158, 61,123,118,153,205,230,222,255, +182,155,154,189, 8,188,198, 13,108,243, 15,134,202,234,207,249,124, 45,167, 78,131,130,135,215,201, 83,192,249,110,205,103,245, + 71,245,183, 61, 99, 47, 82,240, 42,210,233,213,213,123, 75,191,126,221, 88, 35,134,135,196,240,120,246,126,219,182, 47,117,117, +117,155, 80,194,134,217,194,201,217, 22,126,190,124,230,200,153, 23,174,243,230,127,173,223,183,103, 93,236,175, 7, 66,123,242, +185,151,186,159,187,156, 60,173, 44,237,232,215,242, 83, 26,189,176,174, 34, 39,130,113,116,107,131,198,141, 2,225,234,146,135, +159,118, 29, 68,141,154,205,160,215,235, 97,107,107, 43,182, 88, 44, 70, 54,155,189,175, 50, 38, 11, 0,174, 92,145, 91,235,215, +151, 27,216, 74,171,121,250,204,239, 6,118,235,213,175, 94,231,206, 93,173, 23, 47,253, 31,123, 87, 29, 31,197,241,190,159,221, + 61,205,197,229,226, 2, 4, 8, 4,130, 21,105,113,215, 80,164, 88, 11, 5, 74,209,210, 2,133, 34, 69, 75, 5, 41,180, 64,113, +104, 11, 20,119, 8, 30, 74,112, 13, 18, 15, 36, 16,191,184, 92,114,126, 43,191, 63, 34,223, 4, 34,119,129, 26,191,125, 62,159, +253,236,221,222,238,115, 51, 59,179, 59,207,188,243,206, 59, 23, 13, 29, 90, 25, 20,253,250,180,204, 56,127,105,211, 83, 69,218, +243,134, 77,155,117, 68,100,196,149,190, 28,135,112,130,168,220,250, 20,241, 12,231,181,108,228,149,131, 7, 39,177, 26,246,161, +197,119,223,135,245, 27, 48, 96,108, 64,231, 78,157,217, 75,193,127,234,197,200,142,178,233,216, 62,245,179, 79,251, 29,255,117, +239,250,222,231,207,253,222,160, 64,153, 24,196,139,172,151, 58,105, 52,237, 34,144, 72,200,172, 43, 87,232,102, 19, 38,232, 74, +159, 71,153, 76,134,147, 39, 79, 66, 44, 22,151,109, 34,145,168,236,179,139,139, 11,136,146,105,164,166,112, 2,128, 66,161, 64, +122,122, 58,108,109,109, 33,151,203,145,158,158,142, 91,183,110, 33, 54, 54, 22, 66,161, 16,125,251,246, 5, 89,133,111,243,203, +156,195,231,204,233,229,223,172,153,247,203, 34, 11, 0, 12, 6, 3,114,115,115, 49,104,208, 32,242,220,185,115,174,231,147,146, +222, 7,176,183, 58,206, 86, 3, 6,228,100, 28, 57, 82,233,127,191,243,206, 59,196,205,155, 55, 37,125,251,244,153, 53,251,251, +239, 55,253,178,103, 79, 50, 67,211,174,230,228,157, 36, 73,146, 32, 8,120,121,121, 33, 55, 55, 23, 69, 69,197, 35,216, 86, 86, + 86,176,183,183,135,209,104, 4,203,113,194,191,178,172,171,210, 34,255, 17,108, 47, 39,184,182,191, 98,209, 42,201, 20, 0,116, + 45,223,176,176, 44,107,146,200, 18, 10,133, 53,250, 92,153, 98,229,122, 25,166, 8,173,210,180, 74,165,210,178, 7,173,188,192, + 42, 77, 39, 73,146,160, 40,202,164,144,248, 44,203, 82,133,133,133, 56,122,244, 40,186,116,233, 82, 54, 44, 85, 80, 80,128,252, +252,124, 20, 20, 20, 64,171,213,226,197,139, 23,184,124,249, 50, 26, 52,104, 0,192,180,224,175,241,241,241, 15,234,214,173,219, +186,180, 17,239,214,173,155,231,174, 93,187,210,250,247,239,239,206,113, 28, 22, 45, 90,148,253,238,187,239, 58,149,111,228,107, + 2, 69, 81,184,117,235, 22, 26, 52,104, 0,142,227, 32, 18,137, 16, 19, 19, 3,103,103,103,176, 44, 11,129, 64,128,172,172, 44, + 88, 91, 87, 31, 35, 49, 60, 60,124,252, 39,159,124,146,102,107,107,219, 60, 39, 39, 71, 33,145, 72, 58, 93,187,118,205,203, 96, + 48,192,198,198, 6, 54, 54, 54, 56,123,246, 44,236,236,236, 48,115,230,204, 36,141, 70,115,203,210,210,210, 69,163,209, 60, 73, + 79, 79, 95,100, 78,121,211, 52, 13,149, 74,133,188,188, 60,228,230,230, 66,169, 84, 66,171,213,214,152,198,202,208,169, 83, 39, + 4, 5, 5, 81, 43, 86,172,248, 53, 62, 62, 30, 0,224,235,235,139,153, 51,103, 82, 30, 30, 30,120,241,226, 5, 30, 60,120, 0, +131,193, 0,142,227,170,125,120, 5, 2, 65,183,143, 63,254,184,163,183,183, 55, 97, 48, 24,192,178, 44,116, 58, 29, 74, 63, 39, + 37, 37,193,223,223,159,244,241,241,121, 47, 62, 62,190, 27, 76,155, 88,193, 3, 64, 70,210, 9,120, 8,157, 1,210, 6,156,230, + 4,114,178,107, 23,197, 37, 51, 51,243,251,185,139,111, 78,248,101,181,193, 37, 69, 1, 52, 10, 24,140,134, 77,122, 96,252, 24, + 26, 43,126, 60, 10,111,159, 70, 72, 76, 76, 68,183,110,221, 68,105,105,105,159, 20, 21, 21,205, 49,149,251,210,165, 59,204,197, +179,231,134, 13, 31, 57,182,117,207,158,253,233, 11, 23,206, 34,252,201,133,136, 79, 70,126,144,201,177, 69,132,131,157,197,195, +152,232,251, 13,155,183,236, 10, 61,205,116, 2,150,173, 6,150,113, 85, 63,239,208,159, 57,227, 70,158, 57,241,251,152, 15, 71, +143,107,209,163, 71,111,227,133, 75,167,241,224,246,165,199,107, 87, 79,188,186, 98,253,161,110,189,250,126,208, 84,238,114,235, +108,128,159,238, 83, 47, 71,219,184, 29,187,114,249,202, 82,217,179, 41,149,178, 40,121, 47,146, 4, 1,142,227, 42,136,172,151, +133, 22, 73,146, 53, 26, 0,202,115,150,111,139, 74, 59,212,219,182,109,131, 68, 34,129, 88, 44,134, 80, 40,172,209,253,162, 60, +103,196,139, 23,221,119,239,221, 43,169, 76,100,229,228,228, 32, 39, 39, 7, 69, 69, 69, 24, 53,106,148,232,155,251,247,223, 65, +137,235, 71, 85,156,222,110,110, 58, 75, 11,139,140,200,200, 72,247, 38, 77,154, 84, 72,175, 82,169,132,133,133, 5,246,238,219, + 39, 10, 28, 48, 96, 90,143,179,103,215,162,134,248, 87,149,229,157, 32, 8, 56, 59, 59,195,222,222, 30, 4, 65,128,166,105,164, +167,167, 35, 34, 34, 2,247,239,223, 7, 69, 16,244, 95, 89,198,149,105,145,255,160, 85,107,123,165, 67,135, 85,141,137,154, 35, +180, 40,138,170,181, 85,171, 42,152, 50,116, 40,147,201,194,210,210,210, 58,120,120,120,128,166,233, 50,161,245,242,208, 97,169, +245,227,209,163, 71,144,201,100, 97, 90,173,182, 90, 78,142,227,222,107,219,182, 45,142, 29, 59,134, 43, 87,174,224,249,243,231, + 80,171,213,208,233,116,208,104, 52,136,136,136, 0,203,178, 8, 8, 8,128,165,165, 37,100, 50, 89,152, 78, 87,125, 71, 84,165, + 82, 41,132, 66, 97, 35, 11, 11,139,178, 99,110,110,110,200,201,201, 97,141, 70, 35,118,239,222,173,116,117,117,181,180,176,176, + 48, 89,184, 18, 4,129,204,204, 76,120,122,122,150,249,104, 21, 22, 22,194,217,217,185, 84, 88, 64,167,211,193,218,218,186,198, +161, 67, 0,218,103,207,158,205, 46,247,189,205,240,225,195,247, 31, 60,120,176, 94,112,112, 48,238,222,189, 11,185, 92,142, 31, +126,248,225,121, 66, 66,194,135, 0,238,103,102,190, 89,191, 72, 83,234, 80, 78, 78,206,209,176,176,176,247,218,182,109, 91,246, +150,232,214,173, 27,209,173, 91, 55,167,242,166,254,172,172, 44,220,187,119, 15,193,193,193, 32, 8, 2, 79,159, 62,101, 52, 26, +205,254,234, 70, 41, 60, 60, 60,118, 45, 92,184,208,138,166,233,178,186,109, 97, 97, 1,169, 84, 10,145, 72, 4,138,162,144,144, +144,128, 65,131, 6,217,110,220,184,241,119,157, 78, 87, 31,128, 1,111, 9,242, 53, 48, 60, 10, 87,218, 6,248,187, 68,108,223, +182,162,195,164,201, 40, 29, 58,164, 3,252,157, 35, 30,133,103,216,182,118,174, 57,191,231,130,147, 63,211, 27,207, 13, 60,119, + 62,100,196, 87,179,102, 10,125,125,253, 51,131,255, 12,245,238, 65,127, 75, 56, 58,217, 32, 39, 91,137,132,164, 12,196, 39,234, + 57, 95, 95,255,204, 7,247,194, 36, 63,254,188,174,161, 74,173, 45, 29, 58,172,182,158, 94,191,245,124,240,218, 13,146,171, 99, + 63,105, 35,182,176,112, 71,110,118, 24,188,189,229, 24, 20,216, 28,191,237,185, 5, 91, 91, 7,184,184,184,128, 36, 73, 75, 83, +243,158,157,157, 77, 28, 61,112,125,194,199,227, 38,190,219,167,247, 0,250,252,133, 51,130, 43, 23, 79,221,250,125,251,215,199, + 57, 74, 37, 35,184, 66,139, 58,117, 93,159,196, 61,123,244, 97,247,158,163, 96, 33,178,110, 0, 52,174,180,194,150, 77, 48,224, +144,116,236,224, 50,233,199,227, 38,181,239,211,231,125,250,194,133, 19,184,112,118,207,157,165, 75,235,156,125,158,186, 79,116, +251,126,138,116,240,176,169,121, 65,231,162,244, 31, 12,172, 27,235,110,217, 82, 3, 60,231, 85, 85,249,142,164, 64,144, 65,235, +116, 94,158,125,250, 80,234,196, 68,161,149,139, 11, 13, 0, 70,163,177, 70,161,133, 42,134,160, 95,230, 52, 53, 45,106,181, 26, +108, 21,177, 19, 95,230, 76,207,204,172, 83,210, 9, 47,131,209,104, 44, 19, 89, 57, 57, 57,200,207,207,135,165,165, 37,178,116, + 58, 23, 83, 56,123,183,107,183,251,155,101,203,230, 28, 57,122, 84, 84, 94,100,149,110, 66,161, 16,171, 86,175, 22,125,241,213, + 87, 83,167, 9, 4, 51, 64,211, 38,223,207,210, 78, 59, 69, 81, 16, 8, 4, 72, 76, 76, 68, 82, 82, 18, 18, 19, 19,145,152,152, + 8, 11, 11, 11,112,127,241, 36,160,255,176,127, 86,169,200, 42,191, 47,179,114, 85, 27,222,193, 28,103,120, 83,133, 1, 99,198, +248,174, 41, 66, 75,165, 82, 5, 95,190,124,185,221,224,193,131, 5,119,238,220,129,171,171,107,153,208, 42,221,151, 14, 71,201, +100, 50, 28, 63,126,220,160, 82,169,130,107,120,152, 46,159, 61,123,182,245,146, 37, 75,132,227,199,143, 71,100,100, 36, 38, 79, +158,140,252,252,124, 40,149, 74,228,228,228, 64,173, 86,163, 93,187,118,144, 74,165,120,242,228,137, 81,173, 86, 95,174,193, 98, +199,101,102,102, 22,201,229,114,183,151,127, 27, 54,108,152,203,230,205,155,213,209,209,209,198, 14, 29, 58,216,152, 42, 56, 74, +113,224,192,129, 50, 75, 93,108,108, 44, 54,111,222, 92,230,147, 21, 26, 26,138, 53,107,214,148,197, 62, 51, 19,247,179,179,179, +105,163,209,136, 6, 13, 26,192,195,195, 3, 90,173, 22,235,214,173,163, 1,220,255,167,106,179, 86,171, 61, 50,118,236,216,121, + 15, 31, 62,116, 19, 8, 4,197, 38,237,146,252, 25, 12, 6, 60,123,246, 12, 17, 17, 17,136,142,142, 70,110,110,110, 89, 71,224, +209,163, 71,121, 70,163,241, 80, 85,188,114,185,124,209,111,191,253,230, 42,147,201, 42,212,231, 82,107,104,169,149, 52, 43, 43, + 11,118,118,118,232,209,163,135,243,229,203,151, 23,233,116,186, 37,111, 73,155, 70, 12, 27, 18,219,230,139,207, 6, 99,104,160, + 44,249, 88, 80,234,205, 53, 63,206, 46,113,134,119,142, 24, 26,232,145,252, 56,198, 14,195,134,156,104, 3, 32, 5,213, 59,108, +179,127, 94, 85,156,108,219,214,254,202,177, 83,167,126, 95, 48,119, 86,232,156,217, 19,229,106, 77,156,212,215, 71, 76, 0, 64, +124,162,158,123, 18,201,106,215,172,157, 21,186, 98,245, 70, 50, 35, 39,127,242,189,123, 85,135, 55, 40, 47, 94, 72, 18, 82,223, +198, 93,210, 26,250,117,172,123,231,214, 94, 88,201, 52,104,212,184, 13,250,244,126, 15, 87, 66, 30, 33, 61, 75, 11,133, 66, 1, +157, 78, 87,109,184,132,232, 39,199,199,112, 4,231, 77,112, 68, 18, 65,114,210, 49, 99, 63,237, 52, 96,192,251, 92, 80,208, 41, +250,196,241,189, 55, 14,253,177,225, 8, 41, 18, 10, 52,122, 91, 61, 65,104, 11, 64,134, 71, 22,169,138, 59, 52, 66,137,168,106, +243,107, 73, 96,215, 38, 77, 27,187,142, 25, 59,217,182,127,191, 65,220,217,179, 39,216, 67, 7,119, 95, 57,180,179,217, 94,150, + 84,138, 20,201,106, 73,129,210, 88,192, 17, 98,187, 34, 37,171,206,136,175,175,117, 31, 48,204, 0, 28,225,213, 85,249,118, 64, +167, 75, 41, 74, 78,118,115,232,210, 69,242,108,217, 50,153, 75,187,118, 90,162,196,135,184, 58,161, 69, 81, 20, 64,146,172, 41, +156,166,166, 69,163,209,128, 5,140,181,225,164,105,186,130,200, 42, 21, 90,165,207,139, 41,156,219,151, 46,189,227,221,167, 79, +110, 72, 72,136, 75,215,174, 93,137,194,194, 66, 20, 22, 22, 86, 16, 91,238,238,238, 68,147,128, 0,217,129, 43, 87,124, 77,189, +159,166,228,157, 36,201,191, 92,104,253,199,177,189, 74,235, 97,117, 87,149, 90,180, 76, 17, 90, 38, 90,180,140, 70,163, 17,206, +206,206,200,206,206,174,178,225, 39, 73, 18, 22, 22, 22,165, 99,196,213,206,188,211,233,116,235,230,204,153, 51,189, 95,191,126, + 78,141, 26, 53, 66, 86, 86, 22, 92, 92, 92, 32,149, 74,203,124,199, 74,249, 66, 67, 67,241,219,111,191, 41,117, 58,221,186, 26, + 56,127, 94,189,122,245,103, 67,135, 14,117,112,117,117,133,189,189, 61,158, 60,121, 2,123,123,123, 40,149, 74,196,196,196,192, +218,218,186,204,111,231,212,169, 83,133, 58,157,238,231, 26,196, 27,119,237,218, 53,131,181,181,245,147,172,172, 44, 42, 55, 55, + 87,144,151,151, 39, 80, 42,149,194,130,130, 2,225,249,243,231,157,108,109,109,213,127,254,249,103,150,183,183, 55,245,252,249, +115,202,104, 52,214,168, 94, 9,130,192,140, 25, 51, 32, 18,137,160,211,233,176,110,221, 58,204,153, 51,167,204, 39,107,245,234, +213, 88,184,112, 97,153,112,222,177, 99,135, 89, 53,135,227, 56, 24, 12, 6, 24,141, 70, 24,141, 70,147,196,239,235,192, 68,193, +158,254,244,233,211,192,182,109,219, 94, 60,124,248,176, 99, 73, 76, 50,100,100,100, 32, 35, 35, 3, 89, 89, 89, 40, 42, 42, 2, + 77,211,240,240,240, 64, 70, 70, 6, 78,156, 56, 81, 80, 88, 88,216, 7,213,204, 56,164, 40,106,108,167, 78,157, 4, 47,167,161, +180,151, 87, 42,222, 37, 18, 9,210,210,210,208,173, 91, 55,113, 72, 72,200, 88, 0,255,105,161, 85, 62,188, 67,239, 62, 19, 68, +254, 77,219,235, 31, 71, 4, 37, 55,174,155,145, 60,122,144,205, 25, 0,120, 20,158, 97,251, 56,198, 14,254, 77, 3,185,222,125, +236, 91,103,164,111,111, 6,192, 80,221,114, 61, 0, 96, 43,147, 12,239,213,179, 93,154,181,165, 37,185,102,237,142,115, 91,182, +252,252,206,145, 51,255, 11,239,176,102,109,113,120,135, 94, 61,219,177,209, 81,209,195, 1,236, 52, 85,188, 4, 6, 14,124,248, +219,174,223, 16, 29,241,167,251,188, 25,205,197,185, 25, 70, 88, 88,121,161,117, 75, 23,108,223, 21,134,199,143, 31,167,235,245, +250,110,213,214,111,130,243,142,136, 12,247,107,214,180,137,235,152,177,147,108, 2, 3, 7, 33, 40,232, 36,254,216,189,243,218, + 7,163,134,254,154,154,167,164,156,133, 50,145,140, 99,197,148,200, 86, 32,146, 88,100,234,245,197,115, 32,132, 66,169, 13, 48, +188,218,134,103,202,164,209,182,221,123, 14,194,153,179, 39,241,199,238,237, 87, 23, 55, 29,182,179,110, 43,127,162,221, 59, 63, + 78,173, 91,175,174,143,170, 40, 67, 73, 18, 98,131, 86,203, 90,255,184, 59,225,167,248,133, 99,227, 1,172, 5, 63,235,176, 60, +158,252,209,191,127,219, 47,226,226, 68,242,142, 29, 45,210,174, 92,145,149,172, 68, 82,173,208, 18, 8, 4,224,170, 30,234,170, +192, 73,236,217, 67, 2,168,118, 18,150, 72, 36,130, 90,173,134,177,106, 11,118, 5, 78,183, 11, 23,146,227,226,226, 26, 58, 56, + 56, 84, 16, 89,185,185,185,101,159,181, 90, 45,212,106, 53, 44, 44, 44, 34, 52,149,143,136, 84,224,204,184,118, 77,187,114,198, +140, 37, 31,142, 26,181, 33,248,242,101,169,163,163, 35, 10, 10, 10, 42, 8, 45,189, 94,143,238, 61,122,136, 86, 63,124, 56, 6, + 74,229, 82, 83,238,167, 75,183,110, 53,250, 3, 83, 20, 5,246, 47, 30, 58,124, 11, 48,169, 50,225, 69,214, 52,132, 99,234,172, +195, 42, 26,200,151, 87,247, 94,216,186,117,107,109,108,108, 44,188,189,189,203,196, 74,249,255,180,177,177,129,157,157, 29, 66, + 67, 67,241,253,247,223,107, 0, 44,172,129,179, 80,173, 86,143,236,213,171,151, 70, 32, 16,160,113,227,198,101,241,179, 88,150, +133, 88, 44,134,165,165, 37, 30, 62,124,136,129, 3, 7,170,213,106,245, 72,188, 26, 67,235,101,206, 2,181, 90,253, 81,239,222, +189,213,145,145,145,232,212,169, 19, 30, 63,126,140,162,162, 34, 20, 21, 21,225,197,139, 23,104,210,164, 9,212,106, 53, 54,111, +222,172, 81,171,213, 31, 1, 40,168,142,179,176,176,112,224,156, 57,115,168,253,251,247,215,245,240,240,104,218,166, 77,155, 70, + 61,122,244,168, 63,100,200, 16,159,254,253,251,187, 53,108,216, 80,219,167, 79, 31,121,191,126,253,228,106,181, 90,120,243,230, + 77,133,209,104,236, 87, 67, 58,203,196, 73,108,108,108,217, 80,161, 64, 32, 64,118,118,118, 89,228,254,210,151, 82, 21, 66,184, +103, 77, 98,187, 84, 96,149, 10, 46, 19,252,220, 42,227,172,241, 34,177, 88, 92,106,241,228, 76,224,124, 20, 21, 21,213,171, 75, +151, 46,143, 38, 76,152, 80,152,158,158, 14,107,107,107,248,250,250,194,207,207, 15, 78, 78, 78, 48, 24, 12, 56,126,252,184,234, +196,137, 19, 97, 5, 5, 5,221,240,106, 12,173,158, 47,221,199, 23,149,189,100, 75,173, 89,165, 66, 75, 42,149,194,195,195,163, +244,222,190, 48,231,126,214, 18,127, 45,103,137,128,233,209,189, 79,189,254, 3, 6,219, 30, 63,121, 75,188, 97,211,137,176,214, + 61,177,195,177,142,242,148, 99, 29,229,169,214, 61,177, 99,195,166, 19, 97,199, 79,222, 18,247, 31, 48,216,182, 71,247, 62,245, + 34, 35,162, 27,149, 95,247,176,178,116, 74,165,210,246,157, 58,182,206, 11,185,113,149, 93,177,122, 35,217,189,219, 7, 15,119, +254,122,252,248,206, 95,143, 31,239,222,237,131,135, 43, 86,111, 36, 67,110, 92,101, 59,117,108,157, 39,149, 74,219,155,146,247, + 41,147, 70,219, 14,232, 63, 8, 65, 65,199,233, 35, 7, 54,175, 62,120,244,105,151, 79,167, 95,203,136,141,125,204,101,166, 92, +128,144, 76, 68, 84, 84, 84, 65,137,200,138, 53,133,115,242,196,209,229, 69,214,117, 71,215, 78, 59,162,162,192, 92,186,116,218, +120,249,242, 67,205,245, 71,153, 5, 15, 34,179,115,211,178,114,159, 43,149, 57,122,150,101,192, 48, 12,245,205, 55,101, 14,187, +149,150, 81,135, 14, 93,241,103,240, 62,236,222,181,173,128,101,161, 29,126,228, 8, 51,124,248, 50,206,167, 78, 29,159,189, 7, +246, 17,129,239, 15,182,229, 0,118,224,208, 65,118,251, 15,238, 39,234, 53,168, 87,199,215,183, 44,164,205,127,175, 46,253, 5, +156,203,128, 60,101, 98,226,213,208,141, 27,117, 46, 35, 71, 58,136, 93, 92,108,192, 48, 68,233,251,189,170, 77, 32, 16,188,108, +129,169,146,211,195,201, 41,245,212,169, 83,240,243,243,131,135,135, 7,202,251,200,150, 6,228,118,116,116,196,209,163, 71,193, + 85, 12, 78, 93, 37,103,171,186,117, 67, 87,173, 92,169,103, 89, 22,121,121,121,175, 88,179,242,242,242,192,178, 44,206,158, 57, +163, 87, 22,175, 4, 98, 82,222,187, 81, 84,209,135,157, 59,175, 24, 48, 96,128, 33, 46, 46, 14, 44,203,162,188,101, 43, 51, 51, + 19, 86, 86, 86,208,234,116, 94, 0,100,166,112,102,158, 63,111,137, 26,222,235,149, 88,180,254,138,114,255,175,139,172,242, 11, + 74, 79, 50,201,162, 69,211, 52,188,188,188, 42, 44,233, 66,146,100,133,205,204, 25,135,123, 34, 35, 35, 47,244,233,211,103,201, +187,239,190, 59,101,201,146, 37, 84,163, 70,141, 80, 80, 80, 0,123,123,123, 56, 59, 59, 35, 38, 38, 6,167, 78,157, 98,178,179, +179,183, 2, 88, 14,211,166,208, 95,121,250,244,105, 96,243,230,205, 15,206,159, 63,223,182,119,239,222, 66, 47, 47, 47,112, 28, +135,135, 15, 31,226,216,177, 99,134,157, 59,119, 42, 75, 68,150,169,206,203, 23,211,210,210, 62,232,215,175,223,222,177, 99,199, + 90, 51, 12, 35,124,241,226, 5,116, 58, 29,140, 70, 35,146,146,146, 12, 65, 65, 65, 69,106,181,122, 52,128,139, 38,240,133,230, +231,231, 55,185,116,233,210,216,155, 55,111,126, 63, 97,194, 4,199, 30, 61,122,136,104,154,198,141, 27, 55,178, 90,181,106,229, +156,153,153,105, 56,122,244,104,142, 86,171, 93,200, 48,140, 73, 75,240, 16, 4, 1,165, 82, 9, 39, 39, 39,232,116, 58,176, 44, + 11,189, 94, 15, 43, 43,171,178,101,147, 56,142,131, 57,206,245, 47,213, 1,202, 96, 48, 96,212,168, 81, 96, 89, 22,235,214,173, + 3, 77,211,102,147,217,218,218, 62,120,244,232, 81, 96,203,150, 45,203,196, 75,105, 29,146, 72, 36,112,114,114,130,163,163, 35, +130,130,130, 32, 20, 10, 31,212,228,239, 86,130,199,217,217,217,173, 46, 93,186,212, 62, 44, 44,236, 99, 0, 45, 13, 6,131, 7, +195, 48, 4, 73,146, 10,142,227,158, 40,149,202, 95, 97,226, 18, 60,153,153,153,223,143, 27, 55,174,213,190,125,251,172, 4,130, +255, 61, 26, 2,129, 0, 18,137, 4,165,193, 49, 57,142,131, 94,175,199,162, 69,139,148, 42,149,234,251,183,229, 45,209,186, 77, + 59,108,223,188,222,234,242,159, 23,178,162,158,226, 88, 37, 33, 28, 82, 50,210,183, 55, 75, 75, 78,182,106,221,166,157, 73,156, + 70,189, 33,231,163,209, 95,122,151, 44,193,179,232,197,139,132,109,123,247,252, 20, 15, 0, 63,254,188,174, 97, 70, 78,254,228, +232,168,232,225,219,182, 29,104,111,212, 27,114, 76,225,252,159,120,217, 91, 0, 14, 90, 0,119, 31,134,101,212, 29, 56,242,252, +194, 6,245,108,222,207,204,209,164, 22, 21,169, 63, 7, 16,111,106,222, 59,118,232,130, 63, 47,238,199, 31,187,247, 42, 57,150, +210, 58, 57, 57,113, 0, 16, 21,229,196, 69, 69,229,115,255,243, 43,182, 83, 9,185,199,203,191,252,188,199,151, 5,202,220,159, +215,109,174,126, 40,165,121,139,119,209,188,197,187,152,254,249,215,182, 77,154, 54,246, 6,128, 35, 71,192, 52,109, 16,121,122, +201,226,101,239, 47, 95,190, 12,202, 66, 29,150, 47, 47, 94,174, 39, 38, 60,242, 76,124, 60,244,124,155, 85, 17, 75,104,250, 46, +190,252,178,161, 58, 55, 87,222,113,222, 60, 39,193, 87, 95,145,213, 57,195,151,127,126, 77,225,188,255,228,201,153,201,159,126, +154,186,116,201,146, 62, 91,183,109,179,104,214,172, 25,210,211,211,209,184,113, 99,120,120,120,224,210,165, 75, 56,122,232,144, + 42,191,176,112, 33,128, 45,166,112,238, 57,123, 54,166, 81,211,166,217,219,182,109,115, 31, 48, 96, 0,161, 82,169, 80, 80, 80, +128,130,130, 2,232,116, 58,148, 4,132,230, 98,159, 62,141, 50, 26,141, 91, 77,205, 59,147,149, 37, 93,222,174, 93,138,136,101, + 87,125, 48,116,232,156,229,223,126, 43,169, 87,175, 30,161,211,233,202,172, 90, 6,131, 1, 86, 86, 86, 6,189, 94,239, 8, 64, +109, 10,167,100,231, 78, 58, 43, 43, 11,114,185,188, 44, 92, 83,249,184,132,133,133,133,224, 56,142, 15,166, 91, 11, 84,169,144, +236,237,237, 31, 8, 4, 2,207,242,214,173,202,214,206, 43,127,204,104, 52,166,100,103,103,183,126, 73,241, 86,229, 15,229, 11, +224,135,238,221,187,127, 48,123,246,108, 34, 36, 36, 4, 39, 78,156,224,226,227,227,143,148, 88,177,226,171,233,233, 84,197,105, + 45,145, 72,102, 90, 90, 90,246, 44, 13,225, 32,147,201,194, 84, 42, 85,112,201,112, 97, 97, 45, 56,109, 36, 18,201, 12, 75, 75, +203, 94, 37,203,175,192,218,218,250,145, 74,165,186,164,211,233,214,163,234,133,170,171,227,180,176,181,181,253,222,201,201,233, +163,175,190,250,202,241,218,181,107,138, 63,255,252, 83,148,159,159,191, 79,175,215, 87,183,168,244, 43,156, 14, 14, 14, 15, 40, +138,242,252,139,202, 8,205,155, 55, 15, 26, 56,112,224,128,209,163, 71,195,104, 52, 98,203,150, 45,184,116,233,210,153,103,207, +158, 5,214,208, 27,125,153,211,201,211,211, 51,100,202,148, 41, 62,163, 70,141,146,217,219,219, 67, 32, 16, 64,165, 82,225,217, +179,103,120,248,240, 33,119,242,228,201,162,208,208,208, 20,181, 90,221, 21, 64,182, 25,247,243,117,122,205, 21, 56, 5, 2, 65, + 23, 47, 47,175, 3, 75,151, 46,181,238,213,171,151,133,163,163, 35, 40,138,130,209,104,132, 66,161, 64,120,120, 56, 46, 92,184, +160, 58,114,228,136, 42, 39, 39,103, 20,128,171,255, 68, 58,223, 36,167,127, 67, 44,126,105,161,232, 42,163,189,215,112,110,141, +233,236,222,197,109,208,240, 15,250,245, 5,128,195, 71,207,157, 55, 97, 81,233, 42,211, 89, 83, 90, 77,225,108,220,128, 92, 26, + 17, 25, 94, 33,160,101,211, 38, 1,177,254,205,134,126,103, 10, 81,185,200,240, 21,242, 94,110, 56,182,188, 77,183,194, 48,171, +191, 47, 2, 7, 13, 31, 50,224,235,133, 11,240,195,247, 43,112,242,240,241, 51, 81,241, 21,150, 9,250,207,213,165,191,152,147, +248, 78, 32,120, 87,230,230,214,121, 29,203, 46,120, 28, 30,110, 85,190,195, 86,106,121, 46,223,169,116,119,119,207, 84, 40, 20, + 46,166,112, 6,254,242,139, 65,109,105, 41, 89,176,106, 85,151, 34,173,182,203,242,229,203, 5,247,239,223,199,230,141, 27,105, +109, 74,202,222, 44, 96, 70, 21,163, 33, 85,114,250,204,152, 33,157,187,121,243,120,223, 6, 13,156, 63,254,248, 99,161, 80, 40, +132, 74,165, 66,114,114, 50, 46, 94,184,160,143,140,138,138, 84, 42,149,239, 3, 72, 51,149, 51,240,151, 95, 12,118,190,190,144, +201,229,220,229, 43, 87,108, 39,207,156, 57,165, 78,221,186,182,125,250,246, 21,218,216,216, 32, 47, 47, 15, 47, 94,188,192,241, +227,199, 51,139,138,138,220, 1, 48,166,112,238,189,121,179,249,217,171, 87,135,125,247,221,119,226,128,128, 0,216,218,218,162, +176,176, 16,225,225,225,184,122,245,170,110,235,214,173, 5, 5, 5, 5, 83, 24,134, 57,245, 23,150,251,219, 96,213, 42,197,246, +210,209,159,191,218,195,223,148,130,104, 13, 96,113,201,231,111, 81,243,154,129,111,211,203,199,219,193,193, 97,187, 86,171,229, + 52, 26,205,100, 0, 73,255,194,116, 10, 90,183,110,189, 57, 51, 51,179, 61,199,113,176,181,181,189, 21, 17, 17, 49, 13, 85,204, +188,169,129,147, 2,208,222,202,202,170,157,181,181,117, 23,157, 78,231, 95, 50,252, 22,165, 82,169,174, 26, 12,134,187, 37,214, + 39,230, 31,206, 59, 5,160,151,187,187,251,167, 44,203, 54, 32, 8,194,142, 97, 24, 24,141,198,124,150,101,159, 21, 20, 20,236, + 4,112,233, 95,144,206, 55,194,217,164, 62,134,112, 36,252,171, 18, 4, 21,132,214, 75, 2,130, 96, 17, 21, 25,135,227,102,164, +147,236,215,211,107, 19, 80, 60, 51, 17, 53, 59,215,254, 79,104,153, 32, 94,204, 22,153,245,169,113, 28,193, 85,224, 36, 56, 34, +169,113,243, 33,127,188,142,208, 50, 21, 77,252,208, 5, 28,218,179, 28,238, 70, 63,195,159,111,241,187,238,141,113,254, 0, 56, +108,180,183,191, 69, 10, 4,174, 0,200, 18,235, 11,203, 18, 4,195, 17, 4, 93,126,120,235,165,142,101,181,156, 6,160,153, 80, + 34,241, 98,104,218, 37, 29,176, 58,203, 48,239,104, 57,174,200, 19, 88,252, 8,136,169, 77, 58, 13, 64, 51, 74, 34,241, 62,203, +113,131,178, 44, 45,155,103,106, 52,114, 0,156,149,165,101,148, 82,165,218,173,213,106, 55,225,213,145,139, 26, 57, 69, 18,137, + 39, 67,211, 46, 0, 64, 10, 4,153, 7,117, 58,175, 20, 27,155,143,181, 58,157,143,149,149,149, 81,175,215, 43,181, 90,237,104, +154,166, 47,155,147,247,103, 52,221,228, 38, 73,118, 50, 88, 90, 58, 26, 8,194, 82, 79,211, 6,189,193,144,172,213,106,195, 0, +252, 4, 32,238, 47, 46,247,183, 10,166,132,147,122, 83, 15, 11,207,201,115,242,156, 60, 39,207,201,115,242,156,127, 61,167, 12, +128,119, 73,103,241,191,152,247,183,202,186, 85, 58,251, 95,192,223, 11, 30, 60,120,240,224,193,227,173,128, 26,149,248,100,241, +248,103, 65, 84,163, 74,205, 49, 9,214, 70,217, 6,243,156, 60, 39,207,201,115,242,156, 60, 39,207,249,255,142,179, 38,238,255, +226,144,228, 43,107, 29,114, 28,183,253,239,248, 99,222,252,203,115,242,156, 60, 39,207,201,115,242,156, 60,231,255, 59,148, 14, + 29,146,252,173,168, 18, 46, 37,219,155, 62,151,199,219, 93, 23, 94,134, 71,201,102,206,249,110,252, 45,231,193,131, 7,143,183, + 3,255,132,208, 50,181,209,122,157,198,237,117,133,207, 10,130, 64, 26, 65, 32, 13,192,138, 55,120,110, 77,112,119,114,114,250, +162, 73,147, 38,123, 93, 92, 92,166, 3,112, 54,243,250,134, 50,153,108,189,165,165,101,136,165,165,101,136, 76, 38, 91, 15,160, +225, 27, 42, 55, 2,192,100,137, 68,114,197,205,205, 45, 85, 44, 22, 95, 1, 48, 5,181,159,185,218, 8,197,113,210,190, 5,208, +220,156, 11,157,155, 14, 58, 36,111, 58,232,137,188,233,160,112,199,128,129, 13,229, 77, 7,133,203,155, 14,122,226,220,116,208, +161,191,160,190,190, 78,249,174, 32, 8, 36, 17, 4,146, 76,188,246, 39, 2, 72, 38, 8,164,188,129,186,196,131, 7, 15, 30, 60, +254,107,112,119,119,255,192,205,205, 45,216,205,205,237,146,187,187,251, 7, 38, 92,210,179,146,134,135, 33, 8, 48, 53, 52, 36, +213,157, 87,147,185,178,252,181,107, 76,204, 90,121, 78, 23,130, 0,195,149,128, 32,192, 58, 59, 59,111,112,115,115, 91,241,242, +230,236,236,188,129, 32,192,150, 59,151, 41, 39,240,204, 53,171,186,140, 25, 51,230,112, 94, 94, 94,144, 94,175, 15,122,250,244, +105, 80,215,174, 93, 15,190,100,221,168,146, 83, 42,149,126,216,182, 93,251,208,171, 55,238, 62,141,125,150,144, 22, 25,243, 60, +225,244,249,203,247, 3,154, 53,191, 39,149, 74, 63, 52,163,140, 8, 0,147, 5, 2,193, 21, 43, 43,171, 20,129, 64,112, 5,192, + 84,138,162, 78,173, 92,185, 50, 33, 34, 34, 34,227,230,205,155,249, 87,175, 94, 77,157, 48, 97,194, 51,130, 32, 78, 87, 34,216, +123, 86, 98,165,121,217,170,179, 36, 49, 49,241,188, 66,161,184, 96, 97, 97,241,189, 9,231,151,113,202,155, 14,122,146, 89, 96, +224, 50, 11, 12,156,188,233, 32,174,220,231, 39,102,222,243,154,202,232,149,186, 32,145, 72,188,107, 16,244, 61,171,186, 22,128, +107,201,111,173, 1,252, 82,178,149, 78, 61,119,149, 74, 36,111,170, 46,189,137,188,243,156, 60, 39,207,201,115,254,221,156,255, +101,180, 42,217,187,161,216, 95,203,173,182,179, 14, 63,123,250,244,169, 21, 0,248,249,249, 77, 3,112,212, 28, 33, 65, 16,152, +203,178, 28, 9, 0, 36, 73,204,235,214,173,123, 43, 11, 11,139, 10, 81,144, 53, 26,141,248,202,149, 63,123,176, 44, 71,148,156, + 55,151,227,176, 30, 64,134,169,255,161,215,235, 72,161, 80, 12,146, 36,190, 12, 8,104, 86, 39, 59, 59,251, 26, 73,146,123, 83, + 83, 83,243,204, 54,227, 16, 4,118,236,216,225,231,230,230,246, 74,180,102,133, 66, 33, 30, 52,232,125,179,248,198, 1, 18,157, + 68,210, 78, 68, 16,110, 12, 77,219, 1,128, 64, 32,200,187, 47, 22,183,254,225,187,239,100, 4, 65,176, 57, 57, 57,208,104, 52, +152, 53,107,150, 69,100,100,228,224,236,236,236, 77, 53,208,250, 53,111,209,106,214,133, 11,231,253,149,185,121,218, 29, 63,111, + 11,213, 8, 68,234,186, 77, 26,139, 54,111,223,109, 63,105,252,232,207,163,163, 35, 30,161,242,229, 72,202,131, 4,112,124,230, +204,153, 77, 3, 3, 3,197,133,133,133, 82,141, 70, 83,103,239,222,189,139, 90,183,110,109,213,178,101, 75,241,129, 3, 7,136, +130,130, 2,112, 28, 39,107,220,184, 49, 55, 98,196, 8,237,193,131, 7,167, 3,216, 80,141,240,157, 91,124, 47,201,117,141, 26, + 53, 90, 10, 0, 79,159, 62, 21,149,187,199, 66,127,127,127, 75, 0,136,137,137,249,134,227,216,153, 0,192,113, 88, 13, 96, 65, + 37,166,181,167, 77, 59, 14, 7, 8, 52,136,184,113, 88,218,180,211,112, 45, 56, 60, 35,128,167, 37, 29,130,229, 64,185,184, 80, + 21, 17,149,150,150, 86,171,181, 9, 7, 12, 8, 36, 8,130, 56, 18, 26, 26,122, 52, 51, 51,179, 46,203, 50, 19,171, 75,231, 75, +245,136,112,116,116, 28,151,157,157,189, 2,192,167, 81, 81, 81,173, 0,192,223,223, 95, 4,224,129,141,141, 77, 7,131, 94, 79, +240,239, 42, 30, 60,120,240,248,207, 10,173,135, 0, 6,224,127, 75,240,108, 7, 96,182,208, 18, 3,192,181,107,215, 0, 64, 82, +139,132, 16,229, 5,204,140, 25, 51,224,230,230,246,178,120, 65, 72,200,149,215,201,108,133,255,248,246,219,111,173,242,243,243, +123,254,250,235,175,157, 57,142, 91,147,150,150,118,167,134,235, 51, 56, 14,171, 73,146,152, 71, 16, 4, 36, 18,105,236,148, 41, + 83, 30,150,252, 86,231,244,233,211,178,129, 3, 7,170, 1, 36, 0,128, 68, 34,245,160, 40,210,175, 88,185, 98,117,117,130,112, + 24,224, 75,139,197,221, 39,255,242, 11,253,206,192,129, 2, 75,185,156, 0,128,132,232,104,199,213, 63,254,216, 33, 47, 62, 94, +172,113,116,204,201, 81,169, 52,177,177,177,144, 72, 36, 4, 69, 81,239,212,148, 97, 75, 75,203, 47,190,251, 97,149,165, 50, 55, + 95,163, 85, 22,234, 41,218,168,179,182,144, 49, 25,233,153, 57, 86, 22,150,234,121,139,151,137, 63,155, 56,246, 11,149, 74, 53, +173, 6,170,233, 95,126,249,165,127,219,182,109, 61, 14, 29, 58, 68, 20, 20, 20, 64, 32, 16, 88,181,108,217, 18,173, 91,183,102, +254,252,243, 79,162,110,221,186, 8, 8, 8,192,141, 27, 55,112,235,214, 45,162, 85,171, 86,178, 99,199,142,141, 49, 26,141, 27, +106, 18,215, 20, 69,206,106,220,184,113, 75, 75, 75, 75,189,159,159, 31, 38, 78,156, 8,142,227,208,179,103,207, 0, 43, 43,171, +163, 42,149, 74, 28, 19, 19,221,185, 38,145,157, 25,113,114, 68,169,101, 11, 64, 51,112,120,150, 21,113,178,121,185, 83,252, 99, + 98, 98,222,205,203,203, 43,115, 70, 44, 93,192,188,115,231,206,230,212,165, 12,142,195,234,129, 3, 3,231, 1, 4,209,179,103, +207,252,233,211,167,147,209,209,209, 31, 13, 25, 50, 56,224,233,211,103,168, 38,157,229,235, 17, 49,110,220,248, 12, 43, 43,171, +161, 71,142, 28,137, 81, 40, 20, 2,145,168, 76,103, 82,206,206,206,114, 63, 63,191,169, 14, 14, 14,153, 20, 73, 58,115,224,184, +154,234, 18, 15, 30, 60,120,240,248, 87,225, 76,137,184, 58,243,242, 15, 2, 0, 8, 10, 10, 42, 11, 95, 26, 24, 24, 88,101,175, +154,227,184,140,199,143, 31,123,169,213,106,112, 28,103, 74, 35, 80,126,138,102, 6, 65,144,155, 73,146,152, 70, 16, 4, 2, 2, +154, 61, 95,183,110, 93,101,107,122,233, 3, 2,154, 61,167, 40,178, 30,199,113, 32, 8,114, 11,199,177, 25, 85,112, 86,218, 48, +138,197,146,185, 0,224,234,234, 22,127,238,220, 57,253,176, 97,195,240,227,143, 63,138,230,207,159, 63, 71, 32, 16, 76, 79, 74, + 74, 74,175, 38,157, 0,176, 64, 46,119,150,237,216,177,195,111,202,148, 41, 15, 21, 10,197, 2, 0,112,115,115, 91, 1,160, 9, +128,132,114,199,176,117,235,193,212,137, 19, 39,198,102,102,102, 46,168,138,115, 40, 80,223,171,113,227,238,203,175, 93,227, 72, +157,142,200,190,126, 93,153,149,145, 97,140,203,202,146,237,122,240, 32,112,209,138, 21, 66, 47,111,111,132,156, 58,229,148,173, + 86,103, 21,232,116,218,140,140, 12,142,166,233, 91, 38,228,189,169,179,220, 89,182,237,167, 45,247,173,133, 20,235,236,233, 65, + 8, 29, 28, 4,164,204, 70, 76, 9, 72, 93,189, 58, 13,197, 0,154,214, 84, 70, 34,145,104, 76,239,222,189,101, 7, 15, 30, 36, + 2, 2, 2, 96,103,103,135,235,215,175,227,209,163, 71,200,203,203, 35,141, 70, 35,218,180,105,131, 85,171, 86,193,219,219, 27, +249,249,249, 72, 74, 74,114, 18,139,197,114,163,209, 88,213,253,172, 80,159,230,206,157, 11, 55, 55, 55,208, 52,141,220,220, 92, +208, 52, 13, 43, 43, 43, 0, 64, 74, 74, 10, 78,157, 58,105, 74, 93,170, 17, 28,199,225,189,247,222, 43, 36, 8, 34,234,101,139, +150, 57,156, 30, 30, 30, 7,178,178,178,251,117,239,222, 29,121,121,121,198,101,203,150,161,121,243,230,240,243,243, 51, 37,157, + 11, 68, 34,241,175, 62, 62, 62, 63,205,152, 49,195,205,193,193, 1, 58,157,110, 81,122,122, 58,166, 78,157, 10, 0,232,223,191, +127,115,161, 80,120,110,194,132, 9,168, 91,183,110,106,110,110,110, 82,104,104,232, 68,181, 90, 29, 94,219,188,155, 8,158,147, +231,228, 57,121,206,127, 21,167,169, 90,228, 95, 10, 69,169, 5,171, 4,219, 43, 8,173,192,192, 64, 34, 40, 40,136, 51, 33, 99, + 57,158,158,158, 94, 22, 22, 22, 0,144, 99,110, 42, 88,150,157,238,232,232,152,185, 96,193,130,142,126,126,126,250,233,211,167, +135, 39, 36, 36, 44, 44,127, 78,157, 58,117,190,223,184,113, 35, 98, 99, 99, 19, 86,172, 88,113, 35, 39, 39,199,220,117,204,230, +115, 28,214,149, 88,199,178, 79,157, 58,213,252,218,181,107,211,126,254,249,103,249,103,159,125, 38,250,226,139, 47, 70, 3,248, +177, 38, 18,138,162,212,149, 13, 23, 86, 6, 55, 55, 55, 61, 69, 81, 85, 6,137, 11, 4, 44,164, 98,113,183,229,215,174,113,250, +132, 4,245,111,107,215, 90,111,187,119,111,169,145,227, 92,156,157,157,209,169, 67,135, 34, 41, 69,101,103,166,167,179,206,245, +235, 83, 47,206,157,115,210,136,197,105, 7, 15, 30, 44,200,201,201, 57, 81,163, 9,143, 32,148, 44,199,233,173, 60,189,141,195, + 6,247, 10,184,127,247, 81,180,181,179, 19,217,170,101, 64,243,232,216,132, 80,176,172,129, 32, 8,101, 77, 60,182,182,182,126, + 57, 57, 57, 80, 42,149,144,203,229, 88,183,110, 29, 92, 93, 93,161, 86,171, 17, 17, 17,193,121,122,122, 18,215,174, 93,131,167, +167, 39,178,178,178,160,215,235, 81, 88, 88,152,169,211,233,170, 90,155, 49,131, 36,169,223, 73,146, 24, 79, 16, 4,234,213,243, + 77,220,180,105,147,158,101, 89,248,251,251, 99,200,144, 33, 56,118,236, 24, 34, 34, 34, 74, 45, 79,122, 31,159, 58,137, 36, 73, +248,148,104,165, 90, 91,117, 74,151,246, 73, 75, 75, 27, 90,203,135,134,116,119,119, 31,221,160, 65,131,105, 31,126,248,161, 81, + 44, 22, 67,165, 82,149,222, 11, 99,191,126,253,243, 7, 14, 12,180, 61,115,230, 76,181,233,212,235,245,241, 5, 5, 5,159,126, +249,229,151,123,183,110,221,106,191,112,225, 66,176, 44, 11,142,227, 64,211,116,217,162,223, 44,203,226,248,241,227,136,139,139, +251,254, 37,145,197,131, 7, 15, 30,255, 47, 96,134, 22,249, 55,194, 13,197,195,134,120, 89,108,253,237,145,225, 41,138,218,118, +241,226,197,150,157, 59,119, 22,244,232,209, 35,224,252,249,243, 1,169,169,169,225, 37,214,131,128, 30, 61,122, 4, 56, 59, 59, + 99,253,250,245,106,138,162,182,213,242,111,202, 26,189,244,244,244,135, 0,214, 28, 59,118,108,245,228,201,147,225,234,234,218, + 68,161, 80,252,173,121,182,145, 72, 90, 77, 88,183,142, 22, 26,141,228, 47,107,214,216,172,189,114,101,245,161,195,135, 5,239, +189,247, 30,193,113, 28,194,158, 60,177, 88,181, 97,131,108,212,224,193, 9, 49,241,241,244,201, 11, 23,140, 25,169,169,185,169, + 89, 89, 75, 0,228,214,196,111, 52, 26,111, 63,125,250,212,189, 83,151,247, 60,174,222, 11,127, 52,108,112,255,238, 66, 1, 73, + 60, 75, 72,121,224,230,234,100, 27,114, 37, 88, 99, 52, 26,111,215,196,163, 82,169, 94,208, 52,237,192,113,156, 60, 36, 36, 4, +114,185, 28,121,121,121, 48, 26,141,208,235,245,122,181, 90, 45,205,201,201,129, 86,171,133, 78,167,131,141,141, 13,194,194,194, + 50,104,154,254,179, 42, 78,134, 97, 38, 72, 36,146,111,133, 66,161, 88, 36, 18,165, 61,120,240, 0, 74,165,178,142,157,157,221, +143, 52, 77, 35, 45, 45, 13,215,174, 93,251,202,198,198, 38, 1, 0,164, 82, 41,196, 98,137,163, 78,167,163, 1,164,214,246,158, +191,206, 26, 83,174,174,174,222, 22, 22, 22,203,231,205,155,235,223,162, 69, 75,100,101,101,129,101, 89, 88, 90, 90, 66,173, 86, +195,198,198, 6,237,219,183,127,177,124,249,114, 5,199, 97, 82, 77, 98, 48, 51, 51, 51, 75, 32, 16, 76,159, 60,121,242,183,126, +126,126,245, 56,142, 67,195,134, 13,209,187,119,111,156, 59,119, 14,177,177,177, 80,169, 84,204,157, 59,119,246, 43, 20,138,211, +252,235,150, 7, 15, 30, 60,254,115,120,197, 55,171,130, 69,235,239, 68,102,102,102, 86,116,116,244,249,208,208,208,192, 17, 35, + 70, 32, 36, 36,100, 28,128, 47, 1, 64, 34,145,140, 27, 49, 98, 4, 66, 67, 67, 17, 29, 29,125, 62, 51, 51, 51,235, 77,252,167, + 88, 44,214,234,245,197,198, 41,169, 84, 42, 53,243,242, 58, 37, 67,134, 0, 80,167,154, 99, 85,155, 70, 4, 2,183,102,125,251, + 10,242, 30, 61, 82,238,184,123,247,219,189,123,247, 10, 58,118,236, 72, 24, 13, 6, 48, 44, 11, 95, 95, 95,162, 71,207,158,150, +191,239,221,235,192,168, 84,215,190,155, 55,239,250,246, 9, 19,138,158,150,248,129,213, 4,157, 78,183, 97,218,212, 79,123, 94, + 9,185,238,209,164,113,125,135,243, 23,175, 60,116,116,180,149,249, 53,104, 96,153,147,151,203, 44,156,255,149, 64,167,211,253, + 82, 19,143, 70,163, 57, 30, 28, 28, 60,216,203,203, 75, 30, 30, 30, 14,189, 94, 15,134, 97,208,163, 71, 15,112, 28, 39, 1,192, + 10, 4, 2, 68, 71, 71,195, 96, 48,100, 62,125,250, 52,237,217,179,103, 18, 0, 43,107, 72, 95,162, 78,167, 67, 84, 84,241,168, +157,167,167,103,175, 1, 3, 6,128,166,105,244,237,219, 23, 39, 79,158,236, 21, 21, 21,181,182,188,230,123,221, 50, 47,177,144, +249,187,187,187, 31, 43, 57,100,146, 19,188,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, 61, 61,193,113, 28,236,237,237, +160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,166, 90,220,210,210,210,158,165,165,165,141,200, +204,204, 20,229,231,231,183,238,213,171,215,250,158, 61,123,226,225,195,135,184,126,253,250, 40,137, 68,146,105, 48, 24,104, 87, + 87,215, 73, 4, 65,216, 24, 12,134,125, 57, 57, 57, 10,254,221,197,131, 7, 15, 30,255, 9,148,250,104,161,220,222, 60,139,150, +191,191,191,101, 66, 66,194,199,117,234,212, 17, 3,128,133,133, 69, 19, 95, 95,223, 57,241,241,241,133,230,166, 70,173, 86, 31, +218,187,119,111,239,159,126,250, 73,212,191,127,255,250,199,142, 29,107, 11, 0,253,251,247,175,111,109,109,141,189,123,247, 26, +212,106,245, 27,139,137,100, 52, 26, 59,183,105,211, 6,185,185,185, 72, 72, 72, 48,107, 88,230,244,233,211, 50, 20,251,101, 85, +123,172, 58,208,122,189,189,157,135, 7,153,122,229,138, 33, 87,169,116,235,220,165, 11, 97, 52, 24, 64,146, 36,114,114,114,144, +148,148, 4, 91, 59, 59, 34,250,233, 83,171,157,115,231,158,174,211,162,133,152,209,235, 29,205, 72,166, 42, 59, 51, 99,252,231, +211, 63, 59,190,111,223,126,121,190, 82, 25,103, 97, 33,211, 73, 36, 34,215, 25,159,127,206,228,230,230,142, 5, 80,100, 2,207, +202,125,251,246,245,237,219,183,239, 19,111,111,111,231,172,172, 44,215,252,252,124, 38, 55, 55,151, 66,177,175, 21, 1, 0, 87, +174, 92,129, 82,169,164, 25,134,185,134,226, 88, 88,122, 83, 19,234,227,227, 99,219,186,117,235,174,114,185, 28, 5, 5, 5,112, +116,116, 68,203,150, 45,187, 82, 20,245,107, 98, 98, 98,193,155,172,245,151, 46, 93,178,230, 56,238, 93,142,227,208,183,111, 95, +147,174, 97, 24,230,147, 1, 3, 6,136, 8,130,128, 70,163,134, 84,106, 1, 75, 75, 43, 88, 91,219,192,207,175, 17,210,210,210, +208,167, 79, 31,125, 92, 92,220,102,133, 66, 97,118, 29, 45, 40, 40, 24,212,190,125,251,217, 83,167, 78, 5, 77,211, 24, 52,104, + 16,146,147,147,215,190,120,241,226,160,187,187,251,232, 79, 62,249, 68,238,232,232,136,217,179,103, 91, 0,248,134,127,119,241, +224,193,131,199,127, 2, 47,251,104,189,106,209,170,110, 76,212,213,213,181, 19, 65, 16,139, 52, 26,141,184,116, 72,134, 32, 8, +177, 92, 46, 63,169,209,104, 86, 40, 20, 10,179,156,226,242,243,243,149,207,159, 63, 63,121,251,246,237,225, 67,135, 14,197,165, + 75,151,198, 2,192,208,161, 67,113,251,246,109, 60,127,254,252,100,126,126,190,242, 77,228,220,195,195,163, 95,151, 46, 93,134, +182,105,211, 6, 65, 65, 65, 96, 24,230,150, 57,215,151,159, 97,136, 74,102, 29,150, 30, 51,137,140,162, 64, 16, 4,104,154, 6, + 0,100,103,101, 33, 54, 38, 6,185,121,121,208,105,181, 80,169,213,140, 95,221,186,154, 2,189, 94, 72, 0,230,142,125, 37,134, +222,191,147,164, 86,169,156, 29,237, 29, 52, 50,153, 4,249,202, 2,209,131,251,119,138, 0,196,153,200,161,231, 56,174,203,185, +115,231,150, 80, 20, 53,194,202,202, 10,211,166, 77,163,186,118,237, 10,145, 72, 4,157, 78,135,252,252,124,236,221,187, 55,139, + 97,152,122, 37,215, 88,201,100,178,221, 20, 69,165, 20, 22, 22, 46,170,241, 15,244,250,254,129,129,129, 2,189, 94,143,239,190, +251, 14, 75,151, 46, 69,223,190,125, 5,247,239,223,239, 15, 96,223,155,170,241, 44,203,162, 87,175, 94,229,157,225,163, 76,185, + 78, 40, 20, 6, 52,104,208, 0, 89, 89, 89,200,202,202,130, 92, 46,135,187,187, 59, 92, 93, 93,177,118,237, 90,110,253,250,245, +231, 13, 6,195,230,236,236,236,140, 90,212,197, 73, 99,199,142,157, 52,124,248,112, 20, 21, 21,225,246,237,219,232,208,161, 3, + 86,175, 94,237,118,237,218,181, 47,219,180,105, 3,161, 80,136,144,144, 16,208, 52,157,204,191,183,120,240,224,241,255, 13,255, + 81,255,172,106, 81,173, 69,203,203,203,203,142, 97,152,175, 6, 12, 24,208,107,240,224,193,232,211,167, 79,133,223,247,237,219, +103,125,244,232,209, 21, 27, 54,108,232,107, 48, 24, 86,154, 51,212,199,178,236,241,125,251,246,245,127,239,189,247,100,221,186, +117,243, 5, 0,137, 68,162,223,183,111,159,154,101,217,227,181,200, 75,105,112,199, 12, 0,112,119,119,111, 46, 16, 8,134,246, +235,215,175,249,248,241,227, 17, 17, 17,129,189,123,247, 62,243,243,243,187,145,145, 97, 86, 27,153, 80,195,172,195, 21, 53, 89, +183, 40,177, 56, 39, 63, 61,221,206,202,219, 91,104,111,109,173, 8, 10, 10,242,234,217,179, 39,145,156,156,140,188,188, 60,104, +181, 90,220,191,127,159, 21, 0,137, 2,123,123, 34,241,246,109,130, 18,139,115, 80,113, 38, 95,141,240,114,179,111,184,120,254, +148, 58, 90,157,182,105, 65, 65, 1, 45, 16, 10,133,158,174,118,201, 49,113,102,141,196,233,100, 50, 89,107, 0, 2,150,101,213, + 14, 14, 14,178,139, 23, 47, 66, 44, 22,131, 32, 8, 52,107,214, 12, 82,169, 84,196,113, 92, 18, 0, 88, 91, 91,139,183,109,219, +102, 59,122,244,232,235, 53, 17,183,106,213, 74, 40,145, 72,222,247,243,243,195,237,219,183, 17, 30, 30,158,120,251,246,109,159, + 86,173, 90,193,219,219,251,125, 55, 55,183,195, 15, 31, 62, 52,190,137,138, 93, 60, 99,213,124,103,120,134, 97, 88,130, 32, 64, +146, 36, 88,150, 69, 86, 86, 22,234,213,171,135, 77,155, 54, 97,221,186,117,223, 41, 20,138, 83,181, 73,143,191,191,191,168, 94, +189,122, 99,135, 15, 31,142,248,248,120,172, 88,177, 34, 91,161, 80, 92,185,112,225,194, 7, 83,167, 78,165, 58,116,232,128,156, +156, 28,252,254,251,239,244,131, 7, 15,126, 75, 79, 79,223,195,191,114,121,240,224,193,227, 45, 22, 90, 94, 94, 94,195, 69, 34, +209,236,145, 35, 71, 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166, +160, 69,139, 22,157,230,206,157,219, 65, 32, 16,108, 74, 75, 75,219,109,202, 31,103,102,102,170, 73,146, 60, 50,109,218,180,149, +143, 30, 61,172, 7, 0,247,238,221,123,158,150,150, 54, 63, 51, 51, 83,109,102, 62, 74,131, 98, 18, 18,137,244,110,195,134, 13, + 95,180,110,221,218,102,240,224,193,144,203,229, 8, 13, 13,197,170, 85,171,158,234,245,250, 37, 87,175, 94,165,255,238,155, 76, +235,116,233, 15, 78,156,176,238,250,209, 71, 54, 51, 6, 12, 88,243,217,180,105, 63, 45, 94,188, 88,208,168, 81, 35, 66,173, 86, +227,238,221,187,220,209,163, 71,141,191,127,251,237, 58, 88, 90, 10,111, 31, 61, 42,214,235,245,137,102, 90, 75,186,116,236,220, +169,209,154,159, 54, 64,171, 41,194,221, 91,103,144,151,151,133,109,219,143, 53,242,240,224,186,164,166,166, 94, 53,149,139, 32, + 8,191, 75,151, 46, 57,115, 28, 7,177, 88,140,229,203,151,195,221,221, 29, 54, 54, 54, 40, 44, 44,196,151, 95,126,105, 59,115, +230, 76, 91, 0,136,136,136, 40, 11,207, 80, 19,210,210,210,218, 79,153, 50,197,154,166,105,156, 63,127, 94, 79, 16,196,162,224, +224,224, 95,155, 53,107, 38,238,212,169,147,245,158, 61,123, 58, 0, 8,121, 83, 66,171,150,215, 61,187,120,241, 98,155, 17, 35, + 70,112, 66,161,144,200,207,207,135,157,157, 29, 54,109,218,164, 82, 40, 20,103,106, 93, 7,104, 90, 44,147,201,196, 28,199,225, +200,145, 35, 72, 76, 76,252, 36, 39, 39, 39,157, 97,152, 99, 95,125,245,213,156, 70,141, 26,213,141,137,137, 73, 44, 44, 44, 92, +157,153,153,249,130,127, 53,241,224,193,131,199,127, 10,165, 78,240,165,179, 15,207,160,120, 56,177,106,161,197, 48,204,148, 11, + 23, 46, 80, 44,203, 98,251,246,237,120,240,224, 1, 39,147,201, 22,201,100,178,141, 22, 22, 22,140, 70,163,153, 60,113,226,196, +209, 75,151, 46, 37, 59,117,234,132,219,183,111,147,245,234,213, 27, 11,160,188,208,234,137,106, 98,109, 20, 20, 20,220,207,200, + 72,175, 87, 46, 64,101, 61,137, 68,122,191,134,204,188,204,249,114, 80,204,118,203,151, 47, 87,185,185,185,233,195,195,195,177, +117,235, 86,246,193,131, 7, 87,196, 98,241, 54,133, 66,161, 51,145,243, 77,160,140, 83, 76,211,161,127,204,153,227,255,206,160, + 65,236,167,179,103, 23,137, 44, 44,190, 88,179, 97,195,220,252,194, 66,119, 16, 4,231,104,107,155,184,125,249,242, 21,125,223, +127,191, 40,226,234, 85,233,163, 75,151,132,114,163,241,177, 57,233, 76, 77, 77,189, 26, 18,114, 29,187,118,252, 4,131, 65, 7, + 69,106,177, 78,203,206, 41, 64, 13, 34,235, 21, 78,154,166, 11, 62,248,224, 3, 17, 0,139, 49, 99,198,136, 51, 51, 51, 81,191, +126,125, 0,128, 82,169,196,153, 51,103,208,184,113, 99, 0, 64, 88, 88, 88,217,231,154,210,105,105,105,249,126,135, 14, 29,144, +152,152,136,136,136,136,203, 10,133, 34, 7,192,229,228,228,228,254,109,218,180,193,241,227,199, 7, 86, 35,180,204, 42, 35, 19, +133,214, 43,156, 22, 22, 22,243,143, 29, 59,246,201,173, 91,183, 70,204,153, 51, 71,216,163, 71, 15, 0, 64, 97, 97,161, 26, 0, + 83, 27,206,242,105, 50, 26,141, 96, 89, 22, 14, 14, 14,170,156,156, 28,100,102,102,190,200,204,204,156, 22, 23, 23, 87, 43,206, + 55, 81, 63,121, 78,158,147,231,228, 57,255, 37,156,111, 3, 76,143, 12,207,113, 28,205,178, 44, 66, 66, 66,112,236,216, 49,198, + 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,233,131, 15, 62,216, 29, 19, 19, 67, 69, 70, 70,130,227, 56,198,156,212, +104,181, 90, 35, 65,188,122,236,117,115,185,107,215, 46,164,167,167, 27,146,147,147,131,105,154, 62,254,154,179, 23, 95,123,214, +225, 46, 64,247,161, 94, 31,188,180, 99,199, 94, 75, 46, 93,146,124,250,245,215,186,113,227,199,127,197,232,245, 70, 74, 36, 98, +197,150,150, 36, 35,145, 8, 35,174, 94,149,174,159, 58,213, 65,163,211,157,223,107,134,131,121,169, 69,171,107,215, 78, 24,247, +233, 44,104,202, 89,180,110,223,143,133,206, 0,179, 44, 90, 58,157,174,169, 66,161,128, 84, 42, 77, 2,224,250,241,199, 31,131, +101, 89,104, 52, 26, 20, 22, 22, 34, 45, 45,173, 96,252,248,241, 76,137,120, 18, 12, 29, 58,212,198, 20, 94, 95, 95, 95,119,161, + 80,136,243,231,207, 67, 40, 20,158, 1, 0,161, 80,120,230,210,165, 75,253, 71,141, 26, 5, 15, 15, 15,223,248,248,120, 2, 53, +248,167, 57, 55, 29,116,136, 3, 26,130, 64,131, 98, 19, 28, 26,200,155, 14,122, 66, 0, 79, 75,162,198, 71,181,106,213, 10, 48, +209, 47,171, 60, 74, 38,119,172, 51, 26,141,135,231,206,157, 59,173, 93,187,118,189,151, 46, 93, 74, 0,160,222,196, 19, 72,211, +244,107,133,158,224,193,131, 7, 15, 30,255,106,171,214, 43,168, 82,104, 17, 4,177,189, 75,151, 46,147, 0, 80, 4, 65,108, 77, + 75, 75, 11,123,249, 28,133, 66, 17,235,238,238,254, 99,221,186,117, 39, 3,224, 8,130,216,110,102,162, 50, 56, 14,171, 72,146, +152, 91, 44,238,106, 21,160,178,116,169,147,185, 0, 8,146,164,118, 63,124,248,240,235,164,164,164, 44, 19, 45, 16,213,226, 77, +204, 58, 4,128,253,192,139,145,137,137, 23,102, 7, 4,244,236, 59,117, 42,154,247,237,107,227,238,227,195,104, 12, 6, 54,236, +198, 13,226,214,145, 35,162, 71,151, 46, 9, 53, 58,221,249,227, 64,146,185,233, 76, 77, 77,189,250,231,149,171, 23,135, 13,237, +223,219,183,174,123,177,104,120,145,134,236,220,130,139,230,136,172,151, 68,239,160, 77,155, 54,157, 18,137, 68,130,242, 75,217, + 24, 12,134, 92,157, 78,215, 20, 0,242,242,242,220,183,111,223,126,128, 36,201,196,154,248, 34, 35, 35, 79, 46, 89,178,100,104, + 66, 66,194,197,228,228,228, 4, 0, 72, 74, 74, 74, 48, 26,141,187, 21, 10,197,208,196,196,196,163, 48, 97, 18, 0, 7, 52,140, +184,113,184, 25, 0, 52,237, 56, 28, 17, 55, 14, 75, 1, 52,107,218,113, 56, 0,160,182,107, 25,150, 71, 73,104,133, 69,183,111, +223,222,215,187,119,239,137,120,141,152, 94, 0,160,215,235,141, 26,141,134,102, 24, 70, 96, 48, 24, 56,189, 94,111,228,223, 73, + 60,120,240,224, 97, 58, 56,142,107, 3, 64, 94,242,181,212,128, 34,127,233,179, 30, 37,203, 5,150,190,126, 75,190,103, 17, 4, +113,191, 28, 71,217,113, 19,174, 5,128,108, 0, 79, 8,130,168,202, 8,178,189,170,239, 85, 10,173,180,180,180,163, 48, 97,209, +104, 83,207,171, 6, 11, 74,214,137, 3,106,191,182, 91, 25, 7,195, 48, 25, 73, 73, 73,175, 93,160, 36, 73,190, 24, 56,112,160, + 89,231,215,116,206, 65, 32,241,115,157,110, 79,208, 47,191,180, 60,191,117,171, 7, 67,211,142, 4,192, 81, 98,113,142, 94,175, + 79,144, 27,141,143,205,181,100, 85,176,198, 60, 79,237, 19,255, 60, 21, 13, 26, 52,224,158, 61,123, 86,108,235,121, 61, 60, 86, +169, 84, 94, 53, 85, 1,181, 90,221,201, 68, 49,184, 63, 53, 53,117,127, 37,130,253,128, 66,161, 56, 96,106,162,202, 22,149, 6, + 72,150, 96,135, 53,237, 56,252, 8, 0,182,116, 81,233, 55,137,244,244,244, 24,148,196,121,123, 29, 36, 38, 38,234, 8,130,248, + 99,213,170, 85, 99, 30, 61,122,116, 48, 45, 45, 77,199,191, 54,121,240,224,193,195, 60,145, 69, 16, 68, 80,201,247,192, 18,163, + 80,208,203,159, 75,207, 41, 61,175,252, 57,165, 28, 47, 31,175,238, 90, 0,152, 63,127,254,215, 43, 86,172,144, 1, 48,117, 49, +230, 90, 47, 42,253, 87, 33,227, 95,194, 81, 94, 20,236,248, 43, 50,250, 11,160, 7, 77,223, 1, 93,206, 39,223,248,102,141, 27, +207,158, 61, 35,222,230, 7,174,116, 81,233,114, 8,248, 47,164, 59, 33, 33, 97,147,183,183,247,182,180,180, 52, 26, 60,120,240, +224,193,195, 28,200, 43, 19, 70, 85,136,178,192,234,126,175,208,113,175,228,188,202,190, 19, 4, 17,180, 98,197,138, 64, 51,210, + 91,102,209, 34,249,178,227,193,227,239,195, 63, 49,235,149, 7, 15, 30, 60,120, 84,142,151,173, 88,165,226,235,229,239,243,231, +207,255, 26,213,143, 56,185,161,216,138,229, 86,242,189,204, 95,139, 64,241,204,129,202, 96,206,108,130,158,181,200, 95, 48,207, +201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,174, 68, 16, 13,168,106,168,175,186, 97,196,151, 63,215,116, +109, 77,231, 18, 4, 81, 85,152,159,210,161,194,178, 61,199,113,219,241, 55,160, 39,207,201,115,242,156, 60, 39,207,201,115,242, +156, 60,231,235,128,227,184, 54, 28,199, 13, 64,241,132, 41,142,227,184, 1, 28,199,245,157, 63,127,254,130,210, 99,243,231,207, + 95,192,113, 92,143,210,243, 74,206, 41,187,166,244,216,203,251,151,143, 85,119,110, 53, 73,156,244,210,231, 73,165,147,200,254, + 45, 62, 90, 60,120,240,224,193,131, 7, 15, 30,149,162,116,198, 96, 57,107, 83, 22,128,176, 21, 43, 86,228,149,243,157,202, 2, +240, 24, 64,139,146,243,178, 74, 68, 90,121,223, 42,125,201,119,125, 37,231,232, 77, 57,183, 10,108,175,226, 51, 47,180,170, 66, + 11, 87,242, 91,111, 79,231,214, 37, 5, 0,142,101, 1, 0,108, 73, 12, 36,174, 52, 24, 18,203,130,227, 56,164,101,230,135,134, +101, 98,113,109,255,207,207, 29, 14,206, 82,233, 58,150,227, 58,150, 28,186, 90,144,163,155, 21,161, 68,190,169, 28,141, 93,224, + 47, 37,241, 21,203,161, 57, 0,144, 4,158,104, 89,252, 24,157, 97,126, 60,169,202,234,121, 83, 57, 38,137, 45,100, 35,109,237, +236, 27,228,229,101, 63, 53,104,117,135, 35,179,176, 13,230,175,203, 8, 95,123,188,203,114,248, 26, 0, 41, 36,177,246,105,174, +201, 51, 57,120,240,224,193,227,117,173, 35,175, 21, 23,143, 32, 8,166, 18, 78,226, 53, 57,249, 0,123, 38,136,173, 74, 14,223, +171,228,216,253,127, 83,186,205, 18, 90, 77,228,152, 10, 2,203, 0,112,224,240, 77,100, 22,182,152,117,189, 27,122, 74, 41,106, + 39, 0, 74,107, 96,102,115, 44,174, 85,122, 51, 73,116,150,138,168,181, 0, 88, 45,195, 76,136, 84,152,238, 47,214,212, 3,125, + 5, 44,249, 7,203,113, 66,134,229,118,131, 67,144,149, 8, 55,239,164, 66,107, 78, 90,189, 61,157, 91,159,184,167,232,125,101, +203, 12,180,107, 94, 31, 28, 67, 3,172, 17,178, 78, 95,225,242,207, 31,163,157,191, 55, 56,214, 8,176, 52,172,250,173, 65,191, + 0, 91, 46, 44,179,118,235, 96,251,185,195,193,199,201, 57,124,199,142,157,174,238,190, 77, 8,150, 54, 32,230,222,197,209, 51, +231, 46,233,222, 20, 5, 1,166,136,173,230,110,248,212,187, 78,163,175,102, 45,251,137,114,115,247,178,100,141, 58, 58,253, 69, + 84,171, 13,171,151, 28, 21,145,137,107,159, 40,176,211,212,186,220, 68,142,201, 2,137,120,184,133,212,178,129, 90, 93,248,140, + 49, 24, 15,147, 66, 65,223, 31,215,172,107,217,181, 87,127, 43,166, 48,157, 52,178,104,114,232,224, 1,159, 95, 54,109,238, 31, +174, 96,222, 7,192,154,147,103,150,195,220,216, 61,147,250, 11, 5, 20,225,255,201, 14, 10,160,107, 37,180,252,157,241, 33,193, +161,198,240, 18, 28,129,235, 81,153,216, 95,155,255,104,236,140, 95, 9, 14,126, 32,112,132,224,112, 32, 50, 11,153,252, 43,143, + 7,143,183, 11, 36, 73, 94, 97, 89,182,219, 27, 22, 6,239,114, 28,119,135,191,187,255,191, 97,158, 69,139,192,119, 17,113,201, +246, 96, 12,104,234,231,251, 45, 96,158,208,146, 82,212,238,251, 79, 51, 92, 65, 27,176,227,251,105, 7,245, 70,128, 54, 26,192, +208, 70, 48,180, 17, 52,109, 0, 99, 52,130, 51,234,176,228,183, 43,128,190, 16,173, 3, 26,238, 6, 24, 55, 83,255, 67,200,145, +127,132,222,184,232, 64,232, 11,176,127,203,138,207,147,179,138, 62, 15,126,146,150,221,196, 89,179, 32, 50, 19,191,155, 35, 8, +174,108,157,129,189,199,207,164,172,255, 85, 21,205,114, 28, 28,108, 44, 26,141, 14,140,240,218,115,242, 74,242,186,221,218,104, + 0,176,181, 20, 55, 26,251,228,169,247,235, 20,130,179, 84,186,110,219,230, 95, 92,221, 28, 45, 8,250,214, 74,208, 12, 3, 47, +159, 1,212,130,233,163,221,190,251,121,231,207, 80,234,198, 85,119,125, 35,103, 52,169, 83,215,127,246,238, 51,183,188, 85,202, + 76,253,197,125, 95,199, 65, 7,163,171,135,191,240,219, 21, 63, 81, 11,231,205,248, 82,207,164,220,141,201, 68,100, 77,239, 26, +127,103,156, 92,177,114, 77,243,238,253, 2,173,216,162, 44, 74,171, 42,242,219,241,219,206,101,141,155,183,149,117, 10,240, 20, +101, 30,158, 66,104, 10,115, 97, 32,165,146,238, 77,123,218,104,198,140, 50,238,216,181,119,122,100, 38, 54,152,147,103,166,220, +176, 53,203,214, 62,234, 58,193,161,211,163, 59, 87, 38, 51,105,247,193, 49, 70,128, 49,148,237,193, 24,193,177,197,251,118, 83, +126, 3, 80, 59,161, 69,114,232, 29,124,227,190, 91, 70,186,162,205,207,107,126, 88,192,221,191,127, 14, 12,254,136,202,197, 85, +115, 5, 38, 15, 30, 60,254,213, 22, 19,154,227, 56,193, 27,230,236,207,113,220,217,215,164,249, 10,192,167, 37,159,119, 2,248, +241, 13, 36,205, 19,128,107,201,231,116, 0, 41,124, 13,120, 45,148,197,205,122,249,187,185, 21, 74, 10,142, 5,142, 12, 6, 0, + 11,115, 83,193, 1, 82, 16, 20, 96, 84, 97, 80,191, 94,112,114,118, 5,140,106,192,160, 6,140, 26,192,168, 2,140, 26,100, 43, + 18, 1,131, 10,136, 63, 7,154,227, 36,102,103, 87, 87, 0,196, 30, 70,143, 86,222,144,219, 74, 49, 99, 80, 19,167,237,231, 99, +119,238,188, 24,211, 51, 50, 19, 35, 77, 74, 43,199,161, 93,179, 6, 88,191, 83, 21,125,250, 97, 86, 31, 0,232,223,194,241,124, +187, 38, 62, 94,235,118,107,163,207,134,229,245, 5,128,190, 77,109,206,181,109,228,230,205,162,246, 86, 95,150,227, 58,185,215, +105, 64, 48,143,182,129, 85,166, 64,169,212, 32,229,197, 30,216,123,188, 67, 50, 44,186,212,116,189, 5,133,249, 95, 44, 92, 37, + 84, 43, 51,244,172, 33,139,145, 83,121,148, 64,204, 18, 72,189,170, 43, 98,243,153, 89,147, 62,166,103, 47,254,126, 62,128,209, +213,241, 52,113,198,244,181,107,215, 53,235,208,186,177,115,250,209, 25, 68, 81, 94, 6,104, 74, 38, 25,244, 94, 7,216, 53,108, +194,102,132,172, 37,196,190, 61, 97,231,232,139,212, 91,251,144,112,231, 24,209,177,213, 80,201,239,251, 69, 99, 0, 67,165, 66, +171,129, 19, 58,246,233,220,246,160,175,183,187, 27,199,177, 96, 89, 14, 28,203,160, 72,107,196,130, 67,241, 96, 24, 6, 31,244, +233,216,195, 82, 76,112, 44,203,130,227, 88, 36,167,231,168,255,188, 27,221, 35, 62, 15,119, 77,177, 84,181,120,183, 91,199, 39, +161,119, 26, 27, 99, 79,163,245,232, 21,209, 4,112,163, 92,157,235,248,240,194,239,141,129,223,106,175,229, 8, 48, 9,231, 87, +194,187,243, 36,106,219,254,243,242,130,172,212,177, 71,247,108, 30,182,101,219,182,189,209,153,152,194,191, 95,120,240,120, 59, +192,113,220, 27, 23, 91,137,137,137,105,175, 35,182, 60, 60, 60, 58,167,166,166,174, 46,245, 86, 33, 8, 98,117,157, 58,117,150, +252,175,163, 90,161,175, 87,192, 48,204,232,212,212,212,107,213,113, 14, 24, 48,192,253,204,153, 51,117,203,113,214, 5, 80,183, +178,115,237,236,236,152,246,237,219, 39,156, 57,115, 38,141,175, 33,181, 18, 92,102, 11,173,232,164,195, 51, 90,233, 20, 69, 0, + 16,109,194,249, 21,134,252,180, 70,102,229,174,101, 31,175,108, 90,199, 1,133, 42, 61, 46, 62, 72, 0,195, 24,193,208,116,137, +101,139, 6, 67, 27,209,167,133, 19,218,107,167, 96, 67, 80, 12,104,134, 93, 81, 29,231,203, 48,112,236,135, 45,123,142, 56,196, +178,156, 88, 34, 36, 11,252,188, 28,157,103,127,208,130,156, 49,168, 41, 52, 6,122,196,190,144,184, 63,163, 50,177,195, 36, 78, +246,213,144, 71, 92,101,199, 24,186,198,188, 87, 99,141,106,215,179,107, 39, 27, 78, 87, 0, 99,118, 60, 10,213, 70,196,231, 24, +145,174,205,135,132, 80,152,196,201,114,104,238,233,225, 38,187,121,112,222, 11, 71, 74, 41,112,166,104,145,152,164,193,176, 28, +197,229, 71,234, 28, 26,247, 18,150,250,109, 85,151, 78, 11,153,245,199,157,123, 15,176, 77,218, 55,137,176,240,235, 3,231, 86, + 94,120,113,109, 23, 50, 31, 4, 33, 39, 45,129,176,209,230,195,197,177, 62,250,141, 30,137, 31, 71,182, 65,161,178, 16,148, 34, +206, 86, 44,148,216, 1,134, 74, 57, 57, 6,163,215,174,250,222, 77, 64,145,197,247,179,116, 99,140,208,232,116, 0, 67, 67, 42, + 96, 65,112,165,191, 25,193, 24, 13,178,230, 67,231, 77, 3,152,187, 53,229, 61, 42, 19,251,155,200,209, 9,172,177, 49,103,212, +128, 0,110, 68,102,253, 79,252,248, 59,227,195,119,250,140,239,196, 17,184, 94,155, 50, 10,112, 68, 96,235,186, 86,150,150,202, +104,164, 28,249, 28,113,144,114, 46, 29, 62,197,135,159, 76,151,109,223,190,125, 32,192, 77, 69, 69, 31,181,191, 98,145, 85,158, +147,231,252, 79,114,218,216,216,212,171, 83,167,206, 18,163,209,216, 89, 36, 18,185, 24, 12, 6,176, 44,155, 46, 22,139,175, 39, + 36, 36, 44, 87, 42,149,207,255,109,121,127,242,228,137, 57, 98,171, 70, 78,161, 80,136,152,152,152,103,102,136,173,224,151,174, +255,227,198,141, 27, 56,116,232, 16, 0, 32, 54, 54, 22, 13, 27, 54,180,172,236,194, 23, 47, 94, 88,118,237,218,245, 15, 0, 94, +213,113,134,133,133,213, 59,125,250, 52,142, 28, 57, 2, 0,136,137,137,129,159,159, 95,165,137,185,113,227, 6,245,209, 71, 31, +213, 3,144,246, 55,148,209,219, 32,178,202,239,255, 39,180,130,130,130,184,192,192, 64,226,229,207,149, 32,222,219, 94,220, 10, + 90, 6, 0,226,205, 77, 65, 84, 6, 86,173,223,115,161,239,229, 35,155, 58, 75, 69, 36,150,238,152,157,156,149, 91,248,174,128, + 40, 30,126,161, 57,144,246, 86,226,219, 43,198,182,240,206, 43,210,226,212,189,212,107,145,153,230,153, 72, 35, 21,184, 4,176, +118,197,223, 24,104, 53,153,126, 99,127,188,116,224,192,252,190,205,103, 13,106,142,147,183, 18,102, 1,116,141, 81,223, 57,150, + 5,199,210,101,206,239, 37, 93, 7,128,173,184, 40, 48, 11,174,248, 24,107,158, 69,171, 11, 32,200,115, 70, 63,107,153,120,227, +228,201, 19,109,140, 89, 79,145,171, 23, 33, 57, 79,139,116,141, 16, 69, 2,103,164, 70,135, 49, 36,129, 75, 53,154, 92, 8, 40, + 57, 90,107,103, 47,182, 34, 3,122, 77,243, 80,158,255, 58, 79, 76,208,148,205,144,239,236,178, 47,255,148, 64,171,178, 84, 4, +129, 26,195,207,219,218,218, 53,212,230, 36, 80, 5,121,217,176,115,109,138,190, 35, 2,241,205,128, 38, 40, 84,170,144,149,123, +155,107,224,102, 67, 36, 94,223,139,133,253,252,145,147,161,128,206, 8, 16, 42, 93,174, 86,175, 45,170,242, 62,146,216, 54,115, +206,220, 15,125,220,228,150,165,147, 10, 56,150, 65, 11,127, 95,244,234,220, 14,151,110,220,196,253,176, 88,176, 37,147, 10, 56, +150, 69, 74,102, 94,134,214,192,236, 50,235,134, 50, 52, 56,163,182, 82, 33,134, 90, 12, 25, 6, 56, 67,198, 0,139,219,212,179, +158, 48, 63,208,199,218, 82, 66, 64,107,100,160,213, 27, 81,120,115, 35, 28,235, 52,131, 76, 42, 37, 90, 65, 35,120, 8,240,235, + 22,242,224, 81, 14,195,134, 13,147,102,100,100,132,120,121,121, 53,233,213,171,151,172, 83,167, 78, 80,169, 84,184,120,241, 34, + 84, 42,149,143,151,151,151,207,197,139, 23,135, 38, 37, 37, 69,122,122,122,118, 61,114,228,136,201, 62,180, 37, 2,136, 42,123, + 5, 3, 52, 65, 16, 40, 57, 70,148, 28,171,245, 58,183, 98,177, 24,137,137,137,111,220,178,149,154,154,250,172, 54,150,173,162, +162, 34,145,135,135, 7,228,114, 57, 24,134,129, 74,165,194,137, 19, 39, 80, 80, 80, 0,150,101, 97, 97, 97,129,239,214,238, 64, +244,195, 16,220,189,123, 23, 5, 5, 5,162,154, 56, 83, 82, 82,136, 22, 45, 90, 64,167,211,129,166,105,104,181, 90, 4, 7, 7, +151,125, 23, 8, 4,152,251,237,207,136,125, 16,130, 71,143, 30, 33, 37, 37,229,111, 89,109,196, 12, 45,242,111, 68,149, 49,179, +254,246, 89,135, 12, 67, 47,216,190,251,192,237, 5, 83, 70, 98,250,168,158, 94,203, 55, 29,235, 25,149,141,221, 0,224,239,132, +177, 99,186, 53,240,182,147, 9,241,205,190, 7, 0,199, 45,120,221,255,139,200, 69,108, 19, 23,118,214,241,187,137, 33, 95,143, +108, 5, 95, 55,155,134,121,226, 92,113,124,188, 9,107, 10,178, 52,236,173, 36,141,250,183,112, 60, 15,150,133,157,181,164, 49, + 24, 26,118, 86,146, 70,125,155,218,156, 3, 0, 27,153,176,113,101,150,175,170,208,218, 75, 56, 73, 38, 17, 76,178,180,182,243, + 30, 55,176,151, 69,255,129, 67, 45,172,132, 52,114,238, 94,132, 82,232, 9,163,131, 15,116,198, 92,164, 60,143, 99, 46,223,137, + 74,205, 46,212,205,174, 49,153, 28,174,165, 62,143,145,215,107,222,203, 62, 59,104, 97,102,189,241,251,234,146, 96,201,194,189, + 67, 50, 44,157,219, 90,220,139,127, 94,196,114,149, 90,116, 42, 64, 89, 80,144, 96,100,224,166, 97, 4,214,113, 87,126,199,252, +126,205,144,151,155, 9,173,129, 70,129,134, 54,184,218, 73, 37,186,231,225,208, 25,104,232,141, 44,132,118, 30,184,120, 59, 44, +155, 53, 26,207, 85,197, 25,159,131, 71,241, 39, 30, 89,149, 63,230,235,132, 22,243,108, 44, 30,193,168, 65, 98, 74, 26,118,159, +185,221, 42, 62, 7,143, 94,167,156, 57,150, 46, 30,126, 46,103,201, 34, 56,116,170,141, 19,124, 99,103,180, 21, 73, 69,191,172, +158,245, 81,147,247,252, 28, 36,108,202,109, 16,172, 1,150,140, 0, 26, 49, 3, 91, 47, 95,176,250, 66, 78,173,213,230, 71, 0, +124,164,119, 30, 60,202,161, 81,163, 70,174,169,169,169, 17,115,230,204,113, 24, 50,100, 8,142, 31, 63, 14,165, 82,137, 93,187, +118, 97,221,186,117, 88,182,108, 25,140, 70, 35,182,111,223, 46, 59,122,244,104,219,205,155, 55,167,120,123,123, 55, 77, 74, 74, + 74,175, 65, 96, 17, 0, 36, 0,132, 37,109, 23, 1,128, 61,123,246, 44,250,247,239,143,179,103,207,178, 37,199, 24, 20,119,126, +106,181,158,168, 88, 44,134, 88, 44, 70, 65, 65,193, 27, 17, 91, 66,161, 16, 86, 86, 86, 16,139,197, 40, 44, 44, 52, 91,108,209, + 52, 77,165,164,164,160,160,160, 0,189, 6, 14,196,207, 43, 86,160, 91,183,110,232,213,171, 23, 56,142, 67,112,112, 48,122,118, + 8,192,200,247,187, 34, 42, 42, 10, 52, 77,155,148,222,244,244,116,100,100,100,160,239,192,129,216,177,121, 51,218,181,107,135, + 70,141, 26,129,166,105,132,132,132, 96, 88,159, 14,144, 14,238,137,216,216, 88,190, 82,155,110,205,122, 35, 62, 90,175,141,136, + 44,220, 97, 79, 94, 13, 26,213,167,109,224,192,142, 77,176,227,224,229,239, 33, 87, 30, 0, 0, 71,157,228,187,143,187,249, 34, + 50, 41, 15,151, 31,165, 5, 69,101,227,141,204,214, 96, 25, 56, 57,218,200, 0, 74, 12,141,129,165,109,226,107,118, 96,102, 57, + 14,178,206,243, 48,102, 96,164, 87,187, 38, 94, 94,165,179, 14,173,250,255,132,177, 97,207,188,219, 52,114,245, 6, 99, 4, 24, + 35,108, 70,238, 3,190,181,172, 49, 29, 29,234,138, 47,205,156, 49,163,125,191,193, 35, 44,196, 50, 91, 48,202,100, 24,211,195, +144,243,244, 26, 84,178,134, 72, 79,140,199,161, 11,119, 11,158,166,228, 40, 73, 18, 23, 51, 10,116, 95,197,231,161,168, 38, 94, +173, 17, 43,150, 44,156, 61,224,208,129,131,214, 18,223,142, 68,220,198,254, 5, 98, 1, 45,145,215,125,135, 84, 75,157,184, 31, +118, 29,180, 81,233,177,178, 38, 30,181, 74,121, 44,248,226,249,145, 13,234,117,180,126,113,255, 12, 52, 90, 29,116, 70,160,105, +219,174, 96, 24, 78, 76,144, 4,107, 67, 81, 68,102, 78, 30, 8, 35,147,113,253,241, 11,197,141,199,241,148,206, 26, 43,171,141, + 46,242,178,186, 39,168, 47, 6,118,109, 9, 24, 53,120,191,115, 51,252,188,247,242,231, 0, 51,254,245, 10,185,216,162,197, 1, + 29,155,200,177,149,227,208,241,193,137,117,141, 91, 15,158, 9,115, 44, 90, 77,157,208,207,191,158,251,239, 63,127, 55,207,193, +209,179, 33, 69,176, 70,112,174,205, 1,101, 10, 71,164,220,134,173, 71, 59, 48,238, 29,176,125,195,154, 34,150,229, 14, 0,224, +167,100,243,224, 81,254,125,164,213, 30, 91,181,106,149, 67, 96, 96, 96,169, 69, 6,183,111,223,198,206,157, 59, 97,105, 89,241, + 61,217,191,127,127,112, 28,231,176,116,233,210, 99, 0,222,171,138,179,125,251,246, 3, 31, 61,122,148,214,178,101,203,248, 18, +177, 37, 2, 64,134,135,135,147,201,201,201,132,189,189, 61,231,238,238,110, 76, 75, 75, 99, 1, 48,159,124,242, 9,117,248,240, +225, 6, 42,149,234,106,109,133,150, 88, 44,126, 35, 62, 91, 66,161, 16, 4, 65, 64, 44, 22, 67, 36, 18,129,227, 56,179,196, 22, +195, 48,130,179,103,207,226,193,131, 7, 88,214,178, 37,102,121,120,192,193,193, 1, 33, 33, 33,224, 56, 14,150,150,150,200,205, +205,197,129, 3, 7,208,189,123,119,208, 52, 45, 50,133,247,200,145, 35, 8, 13, 13,197,183,173, 91, 99,150,173, 45,172,172,172, + 16, 28, 92, 60, 26, 40,145, 72,144,152,152,136,224,224, 96,116,237,218,149,175,212,175, 9,147, 43, 79, 23, 64,144, 75,192,213, +160,215,128,163, 57,128,128,187,191, 63, 68, 81, 81, 21,157,115, 76, 1, 73, 98,225,134,221, 65, 3,126,154, 57,144,152, 52,168, +149,251,242,223,175, 76, 5,128, 9, 31,248,121,200, 36, 2,172, 63, 25,201,145, 36, 22,190,137, 12,250,251, 67, 68,228, 96,106, +175,118,141,144,150,175, 71, 92, 90,254,159, 81, 38, 14,245, 92,254,105, 12,246,156, 10, 73, 94,183, 71, 27,205,113, 28,236,172, + 36,141,198, 62,137,243,254,253,108,104,210,218, 67,218,104,142,229, 96, 39, 19, 54, 30, 31,213,161,198, 89,135,173,189,132,147, +190,156, 61,187,195,160,241,115,164,116,244, 97,232,227, 46,128, 53,104,160, 52,136,144, 79,185, 34, 37, 41, 9, 63,108, 15, 74, + 86,170,244, 35, 35,178,204, 19,152, 79,115, 80, 36, 32,148, 67,126,248,230,235, 75, 43,190, 91,106,165,137, 15, 41,162, 8, 90, + 67,213,233, 34,248,110,217, 79, 68,161, 78, 63, 34, 62, 15,133, 53,241,232,172,177,114,213,218, 13, 3, 38,142, 30, 26,237,215, +176,139, 35,147,246,220, 81,171, 84,102,238, 59, 31,234, 90,210, 83, 36, 0, 32, 46, 37, 7, 89, 5, 42,154,161,141, 87,173,133, + 88, 30,105,138,117,176, 4,245,156, 33, 15,236,216,244, 35,185,181, 8,154,162,124, 56, 91, 11,209,167, 93,253,143,140,247, 98, +231, 61,207, 52, 71,174,189, 44,180,140,224,140, 26,220, 89,217,189, 49,199, 24, 27,131, 49,194,240,228, 15,243, 45, 99, 4,102, + 77,239,108,101, 99,175,127, 65, 66,101, 9, 88, 56,129,176,241, 1,108,235, 18, 66,255, 17, 72,139,143,160, 63,255,104,116,206, +243,132,148, 95,157, 44,222,200,204, 31, 30, 60,222, 42, 36, 38, 38,126,188, 96,193,130, 27,237,218,181,115,113,114,114, 66,179, +102,205,112,234,212, 41,204,153, 51,167,236,156,150, 45, 91,130,227, 56,228,230,230, 98,213,170, 85,233,105,105,105, 31, 87,219, + 65,143,136,136,222,179,103, 79,231, 38, 77,154, 24, 68, 34, 81, 62, 0, 73,126,126,190, 52, 55, 55,151,208,106,181, 96, 89,150, +181,181,181,101,210,210,210,140, 35, 71,142,212,221,186,117,171,190, 74,165, 74,124, 29,139,150,151,151, 87,120, 78, 78, 78, 1, + 65, 16,175, 29,250,161, 84,100, 57, 57, 57,201,139,138,138, 88, 0,121,181, 9,253, 64,211, 52, 90,183,110,141, 11,215, 30,226, +236,229, 91, 80,166,197, 96,234,196,143,209,172, 89, 51, 92,184,112,161,214,101,214,162, 69, 11,156, 15,190,129, 27, 15, 30, 35, + 49,246, 9, 62,159, 58, 17, 77,155, 54,197,249,243,231,249, 10,109, 58,206,160,162,111,214,153,151,133, 86,215,160,160,160,210, +158,249, 43,242,181,177, 19, 90, 8,237,196,127, 44,237, 87,223, 95,216,107, 41, 8,161, 5, 14, 55, 60,223, 97,225, 15, 27,163, + 41,231,196,209,225,153, 53,207, 14,171,240,208,100, 34,130,187, 27,189,255,113, 84,227,143,222,111,231,133, 29,167,100,139, 1, + 96, 68,167,122,184,247, 52, 11,119, 99, 51,247, 71,102, 33,226,117,115, 29,224, 12, 25,147,141,253,171,190, 24,212,213,199,211, + 21, 59,143,223, 0, 65,224,152, 73, 13, 46,199,113,237,154,248, 96,221,158,151,103, 24,186,122,175, 61,164,141,190, 24, 81,216, + 15, 0,122, 53,150,157,107, 83,223,222,155, 43,239,184, 85, 9, 44,196,130,201,253,134,142,145,210,177,167,128,132, 96, 16,180, + 14, 26, 3, 11, 69,118, 33,212,182, 94, 8,185,253, 88, 83,160,213,207,140,204,170,157, 21, 47, 42, 27,241,162,251,143,147,138, + 84, 26, 55,153,188,190,150, 34, 89,182, 72,199,225, 94,100,130, 50, 50, 29, 49,166,112,196,199, 67,255,174, 7,221,105,235,238, + 67, 75,132, 34,241, 8,138, 0,225,108,103, 41,223,250,211,183,176,182,182, 2,171, 47, 2, 84, 89, 24,242,217, 15, 89,225,105, +198,122, 0,208,208, 17, 86,157,234, 9,119, 11, 72, 34,229, 74,156, 97, 81, 77,255, 65, 24, 49,101,116,159,150, 66, 86,175,194, + 23,171, 14, 98,219,188, 65, 24,211,195, 95,120,230,102,236, 20, 0,203,107, 91,214, 28, 67,131, 51,106,240,222,215,215,162, 9, +224, 6, 7,116,124,112,232,187,198,192, 67,147, 57, 90, 1, 66, 70, 64,248, 55,247,182, 20,177, 41, 55,193,166,220,228, 40,175, + 14, 32,188, 59, 19,132,107,107,238,151,213,203, 84, 59,118,236,188,200,146,248,198,132, 80, 25, 60,120,252,127, 69,124, 90, 90, + 90,223,254,253,251, 95,190,112,225,130, 67, 64, 64, 0, 0,224,193,131, 7,197,157,206,214,173,225,231,231,135,140,140, 12,140, + 26, 53, 42, 91,161, 80,244, 69, 13, 62,191,133,133,133,207,143, 28, 57,226,162, 82,169, 90, 46, 90,180, 40,211,199,199, 71,169, +213,106,137,252,252,124,150,166,105,216,219,219,139, 91,182,108,137,246,237,219, 23,221,190,125,187, 78,114,114,114, 33,128,132, +218, 36,126,208,160, 65,184,118,173,120,210,222,155,136,171, 37, 18,137, 16, 16, 16,224, 17, 31, 31,159, 90,210,182,152,253,142, + 47,223,188, 60,126,252, 24, 87, 31,166, 64,160,215, 64,156,149,134, 59,199,143, 96,224,228,105,160,233,218,123, 49, 60,126,252, + 24, 39,130,239,192, 82, 34, 64, 76, 76, 4,142, 28, 57,130,169, 83,167,190, 22,103, 45, 81,173, 22,249,151, 67,129, 42,252,180, + 4, 0, 16, 24, 24,120,181,212, 90, 81, 30,190,190, 16, 75,138,176,180, 87, 43,143,185, 35, 58,214,167,140,202, 52,176, 12, 11, + 74, 8, 56, 59,217,224,143, 63,246,215,219,127,240,224,237,205,155, 54,111, 96,105,122, 97,120, 38,212,102, 36,106,233, 79, 7, +111,140,248, 99,118, 87,193,212,126,141, 29, 0, 64, 36, 32,177,254, 84, 4, 13, 96,233,235,228,246, 93, 15, 72,139,140,152,228, +236,104,187,120,193,167, 3, 28,186,182,246,195,213,187,225,216,112,228,246, 53,113, 38,246,152, 92,185, 89, 35, 94,214, 79,149, +205, 58, 4, 91,179,223, 37,195,112,174, 34, 75,123, 24, 18,174, 0, 6, 45,180, 58, 3,146,115, 24, 36,231,106, 33,144,137,240, + 32, 54, 69,227,152,142,160,215,200, 54, 97, 41,147,186, 47,249,126,173,167, 86, 83, 68, 43,243,178,105,145,248,142, 80,102, 33, + 81,152,227,170,112, 39, 21,218,206,117,133,239, 0, 44, 37,150,114,234,175,191, 28,103,153, 26,121, 1, 13,200, 52, 16, 28, 7, + 11,255, 1,176,182,160, 68, 29,235, 8,147, 0,192,210, 82, 38, 94,245,205, 28,219,153,243,190,169,209, 7,204, 31, 16,249,249, +186,206, 12,240,177,199,181,208,104, 92, 11, 75,140,184,246, 32,166,105,183,102,238,240,243,180,155, 33,206,203, 95, 25, 5,243, + 45,164,197, 5, 67, 3, 70,109,217,172, 67,127,103,124,216,102,196,162,170,102, 27, 86,138,186, 0, 27,203,112, 32, 40, 10, 32, +200,226, 25,144,201, 55, 33,176,243,229,246, 31, 58,161,222,185,115,207,183, 81,217,188, 21,139, 7,143,154, 80, 80, 80,240, 36, + 42, 42,170, 79,243,230,205,119,125,241,197, 23,214,163, 71,143,118,159, 56,113, 34, 9, 0, 25, 25, 25,236,186,117,235,210,126, +249,229,151,130,236,236,236,241, 70,163, 49,204,148, 39, 92,161, 80,220,250,245,215, 95,179,174, 95,191,222,180,109,219,182,146, +119,222,121,135,181,183,183, 23, 72, 36, 18, 70,175,215,107, 99, 99, 99,153,248,248,120,183,252,252,252,103, 0,226, 80,139, 97, +253, 18,235,213,114,138,162,150,112, 28, 23,240, 38,124,180,100, 50,153, 59,128,103, 4, 65, 52, 48,119,216,240,149, 6, 91, 32, + 64, 94, 94, 30,212,233, 17,144,166, 60, 69,115, 75, 18, 77,236,173, 96, 99, 99,243, 90,162,168,160,160, 0, 80,165,226,198,141, +199, 0, 77,195,214,214, 22,182,182,182,127,187,208,170, 74,139,252, 71, 48,169,146, 99,213,251,104, 53,145, 99,170,133, 30,235, + 38, 15,168, 47,170,235,237, 9, 93,202, 3, 60, 78, 46,194,194,119,219, 70, 82, 18,107,237,228,143, 7,181, 30, 58,172, 14,186, +182,111, 67,212,117,179,157,177,242,167, 45,159, 53, 65,246,156,200, 76,172, 55, 37, 69,145, 89,120,206, 34,115,231,149, 39, 41, + 83, 60,101, 26,176, 44,135, 43, 97, 10,132, 37,228,237,140,206,194,115,115,114,215,196, 13, 61, 5, 32, 15,114, 28, 39,181,181, +180, 44,108,226,231,233,212,243,189, 22,100,223, 46,173, 33,162,128, 27,247, 30, 99,214, 79,199,238,176, 44, 55,192,228, 25, 98, + 44,251,138,128, 42,158, 97,104,172, 48,195,144,227, 56,174,120,214, 97,245,110, 95, 20, 69,164,171, 19,239,187, 10, 29, 27, 66, + 19,119, 5, 9,121, 44, 18, 51, 11,161, 20,184, 66,151,154, 10,112,108,210,213,215,112,172,118,114,114,114,174,215,196,175,254, +198,221, 71, 96, 80, 23,224,121,200, 46, 20,229, 41,240,221,214, 83,245, 61, 60, 28,187,164,166,166, 94, 53,227,101,227,119, 57, +104,191, 51, 56,128, 18, 74,112,102,243, 33,100, 59, 90,192, 73, 38, 2,171,201,194,228,153,163,109,251,245, 26,109, 11, 0,137, + 49,143,224, 35,211,152,196,107,112,196,208, 17,221, 26,217,193,168,193,238,243,143,180, 36,208,119,207,197,136,184,110,141,237, +164, 35, 58,250,216, 47, 79,203,255, 0, 57,181, 11, 42, 90,106,209, 42,179,240,213, 98,182,225, 17,128,105,204, 34,238,224,173, + 76,203, 97,189,222,145,137, 4, 4,193, 21,165,130,179,112,194,150,221,135,139,196, 70,108, 7, 15, 30, 60, 76,130, 70,163, 9, +213,104, 52,205,190,250,234,171, 15,191,254,250,235,206,150,150,150,245, 0, 64,165, 82, 61, 55, 26,141,215, 74,158, 79,115,102, + 7,114, 0,158,197,197,197, 61,143,139,139,115,217,187,119,175, 29, 0,105,201,111, 90, 0,249, 0, 50,240, 26, 51, 14, 75, 69, + 21, 65, 16, 75,222,212,125, 40, 21, 85, 4, 65, 52,168,205,245, 36, 73, 50, 4, 65,128, 32, 8, 72, 36, 18, 92,191,126, 29,195, + 7,244, 66,212,153,124, 4,216, 89,161,237,248,201, 56,120,233, 18, 40,138, 2, 65, 16,160, 40,202,172,118, 68, 32, 16,224,198, +141, 27, 24, 51,106, 24, 36, 2,192,214,214, 22, 95,125,245, 21, 78,158, 60, 9,129,128, 95,165,207, 12,108, 47, 39,184, 76,140, +163, 69, 96,249,165, 93, 63,136,192, 24,113,122,215, 26, 4,133, 23,233, 99,178,176,176, 81, 22,214, 29, 65, 33,155,245,211,158, + 41,151,110,132,255,248,201,200, 64, 89,247,110,189,208,189,107, 55, 65,211, 54, 93, 22, 3, 21,132, 86, 79, 84, 19,107,131, 97, +241,237,246,243,209,147, 15,134,196, 18, 48, 20, 98,100,239, 54, 28,195,226,219, 26, 50,243, 10,167,173,133,213,193, 27,183,111, +219,195, 80,132,132, 71,127, 74,235,212,171, 15, 48, 6, 60,123,246, 20,191,236, 62,206,134,220,139,249, 67, 79,227,139,248, 60, +168, 76,229, 44, 86, 86, 52,108, 45,197,141,250, 54,181, 57,199,130,131,157, 76,212,152, 99, 25,216,201,132,141,123, 53,150,157, +227, 56,142,179,182, 16, 54,230, 24, 99,141,156, 26, 61,189,109,247,111, 59,215, 78,152, 48,193, 50, 59, 37, 29,105,202,112, 20, +137, 61, 96,148,121, 33,238,209, 53,141, 90, 71,155,210,136, 87,121, 63,179,179,179, 51, 67,239,230,226,224,214, 21, 48,234,117, +200, 76, 41,214,170,105,217, 74,216, 56,121,220, 78, 77, 77, 53,153,211, 64,179, 5, 67, 71, 79, 18, 89, 88,195, 98,204,208, 64, +113, 92,142, 14,173,220,173,139, 95, 26, 69, 89,136, 10,190,129,174, 37, 62,166,241,201, 36,124, 90,184,155,148, 78,107,169,232, +139,126,239,120,224,121,146, 2,215, 35, 82,119, 63,207, 69, 26, 19,173,216, 29,151,150, 63,101,208,187,222,248,249,100,228,231, +128,113,191, 57,121,247,119,198,135, 28,135,142,197,206,240, 26,112, 64, 71,127,103,124,104,226, 76,195, 87, 56, 5, 34,124,180, +246, 92,226,162,195,247,179, 7,205,253,168,147, 77,251,246,253,197,160,245, 40,212,232,140, 81,249, 80,190, 78, 25,189, 6,120, + 78,158,243,191,202,201, 0,248,195,104, 52,254,145,159,159,255, 38, 57,211,240,106, 92,167,215,202,123,249, 97, 66,142,227, 4, + 37,214,172,154,156,225,171,229, 44, 63, 76,200,113,220,217, 18,107, 86, 77, 86,173, 10,156, 44,203,166,181,110,221,218, 97,224, +192,129, 96, 24, 6, 79,159, 62, 69, 98,114, 50,122, 78,249, 28,118,118,118,184,246,228, 9, 98, 98, 98,176,100,201, 18, 24,141, + 70,156, 56,113, 34,165, 38, 78,129, 64, 96,168, 95,191,190,104,240,224,193,160,105, 26,241,241,241, 72, 77, 77,197,172, 89,179, + 96,107,107,139,208,208,208, 50,206,236,236,108, 8, 4, 2, 67, 37,214,173,191,162, 46,253,215,241,138,200,170, 94,104, 1, 12, + 24, 35, 10, 46, 45,197,250,235, 48, 24,140,104, 28,153,133, 23,145,255,179, 72,109,161,238, 62, 57,253, 36, 60,250,121,232,205, +238, 98,100,134,193,220,158,196,211, 28, 40,172,165,133,133, 48, 20,218, 32,254, 28, 94,100, 20, 22, 61,205,129,194,236, 30, 3, +203, 16, 48,168, 1,197, 3,220,186,118, 21, 33,119, 30,227,126, 88, 52,115, 43, 52,246, 32,201,226,219,168, 28, 60,173, 69, 47, + 4, 86, 3,126,198,184,176,103,222,109,252, 92,188,193,208,224, 88, 35,108, 71,238,199,248,200,246,222,109,124,237,188,139, 45, + 89, 70,216,127,250, 39,176, 86, 90, 45,223,131,100,227,118,241,201, 11, 31, 20,230,231,188,219,163,203,123,150,182,254,253,144, +253, 44, 22, 79, 31,223,208,132,134,199,221,122,144,108,124, 45,107,137,135,135, 71,231, 30, 93, 26, 97,228,228, 5, 48,168, 11, + 16, 31,242, 27,138,114,211,113,253,182, 21,162,149,202,247, 0,152,108,209,186,157, 68, 55, 69, 82, 30, 58,212, 17, 38, 89, 67, +231,250,113,224, 64, 72, 8, 45, 88,157, 18,132, 58, 27,113,169,250,130, 15,182, 38, 51, 0, 32,147, 16, 2, 75,174,192,198, 36, +203,163,143, 99, 67, 25,101,196,158, 75, 17, 96,217,226,229,155, 88, 22, 91,246,252, 25, 55,229,219, 49,173,208,196,219,190,197, +163,212, 76, 2,102,152,252, 9, 14,157,238, 31,252,166,177,246,242, 98,128, 53,224,198, 12,135,198,157,214,231,118, 66, 45,151, +219, 9, 79, 67, 42,128, 41, 16,168,183,205, 88,127,126,113,235, 75,145, 29,103,127, 58,200, 6, 28,191, 0, 59, 15, 30, 60,254, +126, 20, 21, 21, 77, 30, 63,126,252, 54,161, 80, 40, 7, 64,176, 44, 11,150,101, 5, 63,254,248,163,144, 97, 24,146, 36, 73,134, +162, 40,250,236,217,179, 70,134, 97,178,180, 90,237,228,154, 56,105,154,142,155, 54,109, 90,253,154,102, 40, 30, 56,112,160, 84, +100,197,241, 37, 97,146,200, 42,191, 47,179,114, 85,221,120,112,248,166,195,152,165, 75, 1, 16,224,176, 44, 50, 11, 47, 94, 62, + 37, 44, 23,105, 77, 40,195,172,166,109,186, 44, 45,189,198,220,148,105, 25,102, 88,155,102,126, 7, 0, 64,199, 49, 99,106,147, + 59,165, 78, 51,162,101,155,247, 14,178, 28, 39,160, 57,110, 39,201,226,168,150, 70,148, 41, 51,237,170, 66, 90,102,126,104,191, + 0, 91, 14, 40, 30, 50, 44, 27, 46, 44, 9,227,192,113, 28, 87, 54, 92,184, 70,138,236, 2, 93,141,113,160,110,190,208,247,210, +211,247, 39, 93,188,249,104, 50,195,112,174, 20, 69,164,107,244,244,182,215, 21, 89, 0,144,154,154,122, 53,248, 82,234,197, 39, + 45, 92,122, 59,201, 74,172, 92,106, 32, 91,141,139,169, 89, 69, 87,107,195,153,167, 50, 14,250,122,221,201, 83, 98, 33, 37, 0, +199, 21, 7, 20,229, 56,104, 13, 76,238,237, 36,186, 41, 0, 52,115,128,251, 87, 39,232, 3, 20, 69, 36,214,196,119, 55, 70,241, +243,200,149,193,115, 34, 18,242,118, 38,228, 35, 28, 0, 18,242, 17,126,232,198,139,197,113,233,133,115,194, 19,243,214,192, 76, +191, 10,142,192,245, 54, 35,151,190,114,236,117,239,103,180, 2,143, 1, 12, 1, 82,122,141,156,253,203,108,130, 0,191,252, 4, + 15, 30,255,143, 80,106,213, 34, 73,114,249, 27,228, 60, 75, 16, 68,127, 0,207,204,184,236,110, 81, 81, 81,179, 55,156,189, 28, +154,166,115, 76, 57,241, 31,112,136,255,175,226, 31,115, 45,233,201,115,254,253,156, 13, 26, 52,224,204, 16, 44,252,253,228, 57, +121, 78,158,243,255, 21, 39,199,113,212,235,108, 85,112, 18,175,179,241,101,244,159,199,203,206,240,147, 74,141, 19,252,112,200, + 91,136,103,207,158, 17,252, 93,224,193,131, 7,143,202, 65, 16, 4,243, 23,112,242,193,139,121,148, 10,174, 10,214, 45,146,191, + 39, 60,120,240,224,193,131, 7, 15, 30,111, 68,100,149,223, 23,139,112, 84,109,254, 51,103, 54, 65,109, 76,136,193, 60, 39,207, +201,115,242,156, 60, 39,207,201,115,254,191,227,172,137,251,173,152,205, 88, 67, 28,243, 55, 6,222, 31,128,231,228, 57,121, 78, +158,147,231,228, 57,121,206,183, 29, 85,250,104,241, 67,135, 60,120,240,224,193,131, 7, 15, 30,127, 17,120,103,120, 30, 60,120, +240,224,193,131, 7,143,215, 67,141,139, 74,243,224,193,131, 7, 15, 30, 60,120,240,168, 29,170, 95, 84,154, 7, 15, 30, 60,120, +240,224,193,131, 71,173, 97,254,162,210, 60,120,240,224,193,131, 7, 15, 30, 60, 76,194,118,254, 22,240,224,193,131, 7, 15, 30, + 60,120,252, 61,168, 56,235, 48, 40, 40,136, 43,191,231,193,131, 7, 15, 30, 60,120,240,248, 59,241,182,106, 17,126,232,144, 7, + 15, 30, 60,120,240,224,193,227,245, 48,137, 23, 90, 60,120,240,224,193,131, 7, 15, 30,127, 13,170,244,209, 42, 13, 88,218,181, +196, 84,215,149,191, 87, 60,120,240,224,193,131, 7,143,127, 0,111,183, 22,225,253,179,120,240,224,193,131, 7, 15, 30,188, 22, +121, 51, 40,117,134,231,193,131, 7, 15, 30, 60,120,240,224,241,122,224,215, 58,228,193,131, 7, 15, 30, 60,120,240,248,155, 5, +215, 95, 46,180,248,149,205,121, 78,158,147,231,228, 57,121, 78,158,147,231,252,255, 36,178, 42,136, 45,126,214, 33, 15, 30, 60, +120,240,224,193,131,199,235,161,198, 89,135, 60,120,240,224,193,131, 7, 15, 30, 60,106,135, 73, 0, 2, 75, 62, 7,162,156, 85, +139,183,104,241,224,193,131, 7, 15, 30, 60,120,188, 30,182, 3,112, 43, 17, 88,103, 0, 40,120,161,197,131, 7, 15, 30, 60,120, +240,224,241,102, 80,222, 47,107, 64, 57,241,197, 11, 45, 30, 60,120,240,224,193,131, 7,143,215, 68,149, 62, 90, 4,170,158, 57, + 16,108,198, 31,212,102,246, 65, 48,207,201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,198,127, 15,175,132, +117,224, 56,110,251,223,241,199,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,223,225, 47, 11, 88,218, 10,176, +224,111,239, 91, 9,151,146,141, 7, 15, 30, 60,120,240,224, 81, 61,254,154, 89,135,254,192,167,163, 3,228, 91,141,225, 89, 54, +225,128,186,186,115,229,114,249, 54,153, 76, 54, 90,173, 86,171, 8,130, 96,203, 43, 64, 0,229, 23, 7,138,207,202,202,234, 84, +211,127,139,197,226,117, 46, 46, 46,159, 22, 21, 21,169, 9,130,224, 8,130, 0, 65, 16, 0,240,202,158, 97,152,148,156,156,156, +214,255,113,169, 76, 57,185,184,220, 19, 82,148,135,185,151, 50, 44,251, 34, 51, 35,227, 61, 51, 46, 89, 65, 16,152, 91,252,183, + 88, 13, 96,193, 91,215,243, 0, 40, 83,206, 11, 0,172, 99,129,145, 12, 73,126, 46, 4, 54,233, 88,118, 43, 0, 16, 0, 83,219, +255,214,221, 69,125,130, 67, 11,130,128, 45,199,161,128, 35,240, 88,210, 14,113,255,208,173, 24, 42, 20, 10, 7,217,216,216, 88, +229,228,228, 92, 5,112, 0,192, 40, 71, 71,199, 46, 74,165,178,200,104, 52,158, 4,112,172, 54,196,157, 90, 96,158, 88, 36,252, + 68,107, 48,174,186,249, 24,191,117,105, 5, 71,154,197, 74,169, 72,208, 73,167,167, 87,223,120,130,157,102, 82, 18, 37, 91,233, + 59,195,236, 69,197, 14,155, 88,238, 0,112,194,222,222, 79, 34,183,185, 44, 20, 83, 47,242, 51,138, 70, 15,203,204, 76, 30,254, + 26,229,254,111,132,147,147,211, 56,146, 36,191,231, 56, 14, 12,195, 44,204,205,205,221,245,134,168, 23, 2,176, 43,249,156, 15, +224,251,215,228, 75, 4,224, 93,242, 57, 9,128, 15,223,174,215, 26, 91,142, 31, 63, 62,165, 91,183,110,248,249,231,159,177,101, +203,150,132,172,172,172,149, 0,118, 3,208,255, 3, 60, 60,170, 66, 19,160,255,143,125,218, 49,198,223,191,101,203, 29,238, 89, +197,195,252,235,199, 31,127,108,224, 56,142,139,137,137,225,244,122, 61,103, 52, 26, 57,154,166, 57,154,166, 57,163,209, 88,182, +121,120,120,164,190,116,249, 43,156, 36, 73,174,255,224,131, 15, 10, 57,142,227, 30, 60,120,192,105, 52, 26, 78,167,211,113,122, +189,158,211,106,181,156, 70,163,169,176,185,184,184,100, 84,199,105, 99, 99,243,192,222,222, 62,195,222,222, 62,195,193,193, 33, +195,193,193, 33,195,209,209,177,108,115,114,114, 42,219,228,114,121,134, 92, 46,207,112,112,112,120, 80, 83, 58, 75,208, 7,192, + 85, 19,182, 62,149, 92,219,179,188,208,114,115,115,203,224,106, 1, 79, 79,207,100, 19,210, 89, 10, 23,130, 0, 83,122, 45, 65, +128,149, 72, 36,222,229,127,199,171,150,174, 26, 77,202,238,238,238, 31,184,185,185, 5,187,185,185, 93,114,119,119,255,192,132, + 42, 86,129,211,218,218,250,129,147,147, 83,134,171,171,107,102,233,230,230,230, 86, 97,115,119,119, 47,219, 92, 92, 92, 50,236, +237,237,171, 44, 35, 14,160,170,218, 66, 0,129, 4,232, 46,160,168, 32, 23, 23, 23,101, 88, 88, 24,195,113, 28, 71,146,100,106, +233, 57,230,228,253,101,145,165,190,129,133,217, 87, 36,119,139, 94,172, 44,200,190, 34,185,171,190,129,133,186,187,168, 95, 91, + 78, 19, 81, 25,231,216,177, 99,199, 62,206,200,200, 72,205,207,207, 87,108,221,186, 53, 86, 42,149,222,216,186,117,107,108,126, +126,190, 34, 35, 35, 35,117,236,216,177,143, 1, 76, 51,131, 19, 0,240, 94, 11,188, 59, 97,168,155,250,241,137, 49,234,238,109, + 4,143, 58, 4, 32,176,215,123,162,212,141,243,253,213,215,118,116, 84,119,123,135, 12, 55,147,147, 16, 8, 4,237,189,189,189, + 63,145,203,229, 31,151,108, 99, 74, 55, 87, 87,215, 49,174,174,174, 99,236,237,237,135, 87,199,121, 24,160, 76,217,188,164,210, +246,195,235,121,171, 19,151, 47,227,194,102,126,206,125,226,235,165, 28,230,236, 92,231, 31, 40,163,191,148,211,217,217, 57,205, +104, 52,114, 6,131,129,115,116,116, 76,123,131,233, 92,195,113,220, 26,142,227,214, 0, 88,243, 6, 56,203,222,103,102, 8,236, +234, 56,165, 2,146,156, 45, 19,139, 47, 73, 4,130, 76,137, 64,144, 41, 19,139, 47, 9, 72,114, 14, 0,233,191,169,140,254, 2, + 78, 43,185, 92,254,124,221,186,117,156, 90,173,230,212,106, 53,183,110,221, 58, 78, 46,151, 63, 7, 96,101, 6,103,109,121,222, + 38, 11, 86,133,173,116,232,240,141, 88,180,252,129,214,221, 91, 52, 56, 58, 99,220, 72,176, 71,214, 17, 53,244,152,126,125,175, +117,235, 79,118,239,222, 13, 0, 24, 61,104, 16,122,183,109, 11,107, 43, 75,136,197,197,201, 33, 56, 2, 34,161, 8,131,103,125, +105,202,223,175, 30, 60,120,240, 71, 71,142, 28,177, 2,128, 45, 91,182, 96,232,208,161,112,112,112,128, 76, 38,131, 72, 36,130, + 80, 40,172,176,175, 9, 20, 69,121,166,166,166, 58, 75,165,210, 50, 43, 27,203,178, 21,182,242,171,114,211, 52,141,134, 13, 27, +154,122,187,230, 23, 20, 20,116, 86,169, 84,101, 28,149,109,245,234,213, 3,128, 11,166, 16,126,255,221,183, 96,105, 21, 4, 2, +128,166, 1,157,129, 4,203, 85, 42,110, 48,109,218,180,215, 90, 77,124,192,128, 64,130, 32,136, 35,161,161,161, 71, 51, 51, 51, +235,178, 44, 51,177,150,150,174,207,158, 62,125,106, 5, 0,126,126,126,211, 0, 28, 53, 39, 29, 2,129,192,243,201,147, 39,206, + 18,137,164, 74,203,101, 57, 11, 38, 12, 6, 3, 90,181,106, 69,155,243, 31, 46,128,119, 46, 73, 78,108,249,206, 59,147,150, 14, + 30, 44,189,119,239,158,148, 36, 73,208, 52,141, 31,127,252,145,230, 56,206,174, 9, 96, 19, 9, 40,171,161,249, 26,192,184,146, +198, 96, 39,128, 31, 43,168, 5, 14, 45, 52, 70, 73, 96,124,209,224,182,237,234,204, 67,100, 68, 88, 91, 95,171, 19,176, 22,232, +226,128,191,215,170,101, 99, 99, 51,232,231,159,127,150,239,220,185, 83, 25, 19, 19, 99,216,186,117,171,124,242,228,201,214, 6, +131, 1, 83,166, 76,201,106,212,168,145,232,231,159,127,150, 31, 59,118,172,187, 74,165,218,108, 86,121, 17,248,118,212,160,222, +208, 26, 73, 24,141,180,220, 77,110,253,199,140,177, 93,133, 28,167,199,158,147,161, 48,210,236,111,102, 90,178,222, 27, 54,108, +152,239,254,253,251, 5,209,209,209,130,198,141, 27,131,101, 89, 48, 12, 3,163,209, 8, 0, 96, 89, 22, 13, 26, 52,120,237,251, +242, 9,224,231,228,226,112,233,189,254,253, 44,220,164, 18, 56,228,101, 97,130, 72, 96,189, 75,166,219, 11,160,253, 91,101,217, +229, 56, 8, 4, 2, 36, 39, 39,195,217,217,217,130,101, 89, 5,128,101,121,121,121,219,241,246,162,173, 88, 32, 56,186,231,183, +245,174,237,218,183,167, 92,220,156, 17,251, 52, 9, 2,130,233,249,228,126,104,215, 79,166,206,158,161,167,233, 15, 0,220,123, +219, 50,238,218,126,218, 16,130,164,182, 16, 28,139,111, 54,158, 42, 92,177,122,157,108,202,196,177,212,172, 89,179,224,229,229, + 85,119,200,144, 33,171, 1, 76,173,145,167,221,180, 33,160,200, 45,224, 56, 44,253,229, 84,225, 15,171,215,201,166,214,130,231, + 63,142, 42,159,145,215, 22, 90,254,128,111, 83, 47,231,139, 43,230, 78, 21,114,231,126, 39,213, 57,153, 85,158, 43,151,203,183, +245,237,219,119,244,174, 93,255,179, 70,191, 23, 16,128, 33,221, 59,194,217,209, 22, 50, 75,113,113,115,196, 18,120, 28,243,194, + 36, 65,224,229,229, 53,229,232,209,163, 86,229,197,132, 72, 36, 42,219,202,139,172,210,173,180, 1,174, 14, 82,169, 20,193,193, +193, 16, 8, 4,160, 40, 10, 2,129,160,108, 43,255,157,162, 40,184,184,152,229,186,180,210,214,214,182,121, 97, 97,161, 77,126, +126, 62,188,189,189,149, 0,158,148,251,189,121, 86, 86,150,141, 57,132, 44,173,194,172, 9,254, 16,234,239, 64, 47,108, 11,141, +160, 3,110,221,143, 66,208,133,171, 72, 77, 75, 71,199,119, 91,226,227, 15,135,225,210,165, 75, 96, 24,179, 71, 58, 50, 56, 14, +171, 7, 14, 12,156, 7, 16, 68,207,158, 61,243,167, 79,159, 78, 70, 71, 71,127, 52,100,200,224,128,167, 79,159,149, 88, 21,137, +185, 28,135,245, 0, 50, 76,228, 21, 3,192,181,107,215, 0, 64, 82,155,186, 39,145, 72,112,251,246,109,148, 14, 19,147, 36, 9, +146, 36, 65, 81, 20, 78, 63,115,130, 74, 79, 66,157, 17,142,207, 3,189, 81,175, 94, 61,144,100,205, 46,137, 93, 1,233, 45, 96, + 8, 33, 20,206,114,115,119,175,219,197,215, 87, 22, 28, 28, 76, 1,128,143,143, 15,167, 80, 40,242, 79,158, 60, 89, 40, 0,182, +248,112,220,238,234, 68,150,151,151, 87,135,212,212,212,239, 75,239, 57, 65, 16,171,235,212,169,179,164,172,220, 88, 22,203,126, + 83, 9,103,204,152, 41,106,215,117, 17, 0,160,221,192,253, 80,198,175,240, 39,114,191,182,253,187,223, 18, 74,165,242, 96,131, + 6, 13,168,156,156,156, 91, 0, 18,141, 70,227,252, 63,254,248,195,121,194,132, 9,153,123,247,238, 93, 9,192,125,213,170, 85, + 93, 85, 42,213, 33,115,120, 59, 54, 71,255,119,154, 7,188,235,237,229,133,171,183,238, 65, 36, 22,218, 77, 27, 23, 8, 43, 43, + 1,214,236, 60,195, 38,166,228, 78,191,241, 4,187,205, 16, 89,109,135, 13, 27, 86,119,255,254,253, 98, 0,120,242,228, 9,210, +211,211, 33,151,203, 97, 97, 97, 1,161, 80, 8,138,162, 32, 20, 10,223,136,200,178,245,114,188,123,226,196, 73, 11, 7, 7, 59, +108,252,114, 6, 62,206,204,128,157,181, 21,140, 69,170,186,111, 89, 67,225,215,169, 83, 39, 41,195, 48, 80,169, 84, 8, 9, 9, +177,181,176,176,176,245,244,244, 92, 90, 93, 35, 82,201,187, 51, 67,171,213, 58,151,124,206,212,106,181, 46, 0,148, 18,137,164, +244, 61, 93, 84,178, 55,117, 56, 49, 17,175, 14, 19, 38, 17, 4, 81,254, 88,109,209,166,109,155,230,193,199,142,236,179, 42, 40, + 76,135,157,125, 38, 72, 20, 96,251,246, 77,176,176,176,193,210,165, 95, 11, 94,244,236,238,209,167,255, 7,193, 17, 81,177, 61, +223, 58,177,197, 17,219,123, 14, 28,237, 96, 33,179, 46,105, 75,140,216,181, 99, 6, 72,146,196,146, 37, 75,208,180,105,211, 73, + 17, 17, 17,139, 0,228, 86, 79,131,237,205, 58,143,112, 16, 75,139,139,152,101,140,216,122, 96, 78, 49,207,130,201, 24, 53,176, +222,164,175,134, 61, 63,223,212, 23,133, 37, 29,115,141,144, 68, 18,209, 14,101,130, 33, 40, 40,168, 75, 96, 96,224,213,170,190, +255, 7,224,134,255,197,207,170, 32,190, 4, 65, 65, 65, 92, 96, 96, 32, 81, 46,115, 21,190, 87,135, 22,128,147,189,173, 44,120, +203,178, 25, 86,130, 59,103, 40, 77,210, 51,164,105, 43, 52,228, 21,166,104,202,100,178,209,187,118,237,170, 96, 82,242,118,113, +134, 72, 36,132, 80, 68,192,174, 83,113,244,250,252,235, 65, 32,136, 42, 69, 86, 5, 78,149, 74,165,125,244,232,145,213,206,157, + 59,225,236,236,140,186,117,235, 66, 38,147, 65, 42,149, 86, 16, 87,229, 5, 87, 37, 66,171, 2,103,233,239, 2,129, 0, 36, 73, +226,210,165, 75,160,105, 26,195,134, 13,123, 69,100, 9, 4,130,170,132, 91, 85,211, 83, 47, 0,120,194,113, 92,231,146, 6,248, + 9,128, 46,229,126,239, 35,151,203,231, 3, 88,105, 42, 39, 69,113,160,180,183,192,122,174,131, 32,121, 6,244,194, 22,184,114, + 35, 20,187,182,253, 12, 0,168,219,184, 13,134, 15, 9, 44,179,198,153,152,206, 50,120,120,120, 28,200,202,202,238,215,189,123, +119,228,229,229, 25,151, 45, 91,134,230,205,155,195,207,207,207,164, 50,170,162,231,156,241,228,201, 19, 47,141, 70, 3,142,227, + 76, 17,103,175,112, 18, 4,129, 63,254,248, 3, 90,173,246,149,147,237,187,252,128, 57, 67,125, 48,254,243,221, 88, 29,115, 8, +155, 55,111,174, 54,239, 50,160,185,214,182,193,122, 49, 69, 55, 95,249,245,103,146,143, 63,254,152, 26, 63,126, 60,146,146,146, + 48, 97,194, 4,237,165, 75,151,244,233, 10,197, 73, 49,203,110, 52, 84, 20,198, 85,114, 74, 36,146, 61, 23, 46, 92,192,161, 67, +197,186, 36, 54, 54, 22, 13, 27, 54,180,172, 32,146,115, 15,163, 48,113, 35,238,158,142, 70,187,129,251,113,247,244,135, 96,242, +207, 8, 91, 55, 68,129, 57,247,179, 22,168,140,243, 80, 78, 78, 78,153,136,218,187,119,175,197,222,189,123, 7, 3, 56, 5,224, + 16, 0,228,230,230,254,100, 38, 39, 64, 96,252,136,161,131, 33, 16, 89, 35,250, 89, 10,186,188,215, 10, 46,206,206,120, 18, 21, +135,196,212,220, 12,130,192,184, 62,237,197, 43, 53, 26,253,162,235,143,241,107, 13,156,132,167,167,167,223,225,195,135, 69,229, + 44,208,101,207, 56, 69, 81,101,223, 75,133,119,109,234,103,169,200,178,246,180,186,251,237,166, 14,150,119,195,246,162,161, 79, +127,216,247, 15,196,175, 23, 47,226,105, 68,164, 86,175,166,123,252, 3,101,244, 87,113,250, 13, 29, 58,244,214,190,125,251,236, +146,147,147,113,237,218, 53,212,173, 91, 23,106,181,218,148, 14,111, 5, 78,173, 86,235, 92,122, 13, 65, 16,206,165,134,119,189, + 94, 95, 90, 24,165, 15,162, 93,185,243,236,170,225,244, 46,119, 94,169,184,242,121, 3,121, 23, 75, 69,162,195, 39,142, 29,176, +138,140,190,134,150, 45,222,133,149,109, 19,176, 76, 58,114,114,139,144,247, 44, 13,223,125,183, 26, 75,151, 45,196,169,227, 71, +172, 26,249,183, 56,170,167,233, 6, 0,180,111, 77,185, 19,220,164,224,211,123,183, 16, 28, 11, 77, 70,180, 68,168,122, 46, 27, +253,225, 7,212,200,145, 35,113,234,212, 41, 68, 68, 68,108,169, 70,100, 5,151,179,204, 79, 10,191,118,104, 11, 56, 14,154,204, +104,137, 72,243, 92, 54,246,163,225,212,199,163,122,227,206,159,235,209,187,229,243,112,119,103, 12,201, 43,145,216, 2, 10, 57, + 18, 41,110,114,119,113,167,156,216, 10, 1, 64,148, 19, 88, 33,248,159, 15,230,127, 1, 3, 74,132,213,164,151, 59, 38,130,218, + 8, 44, 0,104, 8, 88, 17, 98,209,221, 93, 75, 63,115,151, 37, 69, 8,116,225,183,145,166, 99,185,173, 9, 52,219, 10,176,120, + 8,104, 94,190, 70,173, 86,171,226,226,226, 44,198, 13, 25,130,246, 1, 1,112,115,116, 68, 3, 79, 79, 88, 72,196, 16,139,132, + 21,186,172, 38,143, 33, 16, 4,215,168, 81, 35, 12, 28, 56, 16, 66,161, 16, 50,153, 12, 86, 86, 86, 16,139,197,149, 90,179, 76, +237,229,114, 28, 7,138,162, 16, 30, 30,142,196,196, 68,216,217,217,225,230,205,155,232,209,163,199, 43, 86,173,242,226,204, 28, + 19,125, 37, 13,127,169, 16,187, 96, 14, 23,195, 16, 40,226, 90, 64,154, 48, 29,106,162, 21,116, 58, 26, 58,157, 14,191,222, 48, +224, 94,156, 10, 6,131, 30, 58,157,174,186,255,172, 10,164,187,187,251,232, 6, 13, 26, 76,251,240,195, 15,141, 98,177, 24, 42, +149, 10,106,181, 26, 17, 17, 17,198,126,253,250,231, 15, 28, 24,104,123,230,204, 25,174,100,232, 48,195, 12,238, 28, 15, 15, 15, +175,146,225,217,156,218,212,106,130, 32,202, 68,204,203, 24,247, 83, 36, 4, 84,113,153,108,217,178, 5, 12,195,128,227,184, 42, + 11, 73, 75, 16,151,151,253,176,214,118,213,186,223, 96,235,224,130,171, 87,175, 50,231,207,159, 47, 36,128,216,167, 17, 17, 63, +189, 15,156, 61, 12, 24,204, 73, 95, 94, 94,158, 69,221,186,117,225,233,233, 9,150,101, 97, 52, 26,203,172, 47, 57, 57, 57,208, +104, 52,112,176,204, 71,125, 71, 79,208,133, 33, 80,132,127, 3, 55,171,104,236,190,160, 55,190,227,135,199,255,130, 23,199,239, + 37,219,107,246,154,225,225,236,234, 5,146, 51, 34, 45, 51, 7,131, 7,244, 6, 37,178,194,139,228,108,180,104,226,235,246,209, +251, 29,220, 40,130,198,220,149,251,167, 1,236,175, 53,209, 21, 21, 21, 49,209,209,209,120,242,164, 88,239,218,216,216,192,210, +210,178,194, 51, 78,146,228,107, 89,180, 74, 69,214, 15, 91,122, 88,146, 66, 21,148, 76, 48,118,254, 17,138, 22,141, 2,177,245, +238,125, 45,147,145,219,115,141, 86, 27,123,224, 63,108,204,112,117,117,157,204,178,236, 82,142,227,242, 59,118,236,232,178,127, +255,126,251,212,212, 84,132,134,134, 98,201,146, 37, 89, 12,195,208, 28,199, 17, 28,199,125,243, 6,254,142, 45, 39,176,222, 36, +132, 50, 41, 62,119,178, 33, 6, 9, 72,155,186,180,178,232, 69,182,158, 59,169,166,217, 95, 0, 24,171,125,185,145,228,167, 71, + 14,110,113,119,146,179,232, 42,239, 14, 69,134, 1, 63,124, 57, 22, 57, 57,133,248,117,199, 10, 0, 98, 24,104, 10,157,187,126, + 0,103,103, 15, 76,154, 56,201,117,203,182,173,159,209, 44,187, 6,111, 9,210,111,109, 62, 14, 32, 88, 46,151, 71,124, 54,105, +146,188,110,221, 49,144, 74,165, 56,112,224, 0,246,111,220,200,172, 3,134, 75,128, 43, 83,128,227,213,242,220,253, 31,207,140, + 41, 83,228,254,254, 83, 32,145, 72,240,231,249,223,161, 77,255,163,112, 64,123, 24,212, 90, 12,168, 51,144,115, 72, 56, 77,228, + 10,133,120, 6, 0, 66, 41, 20, 0, 94, 30, 6,251,175, 9,172, 82,156,193,255,102, 26, 78,170, 96,209,170,245,187, 83, 40, 14, +219, 49,115,148,143, 11,116,132,254,198,105,164,234, 88,102,213, 83, 3,245,176,128,155, 19, 85,137,200, 42,169,216,172,183,183, + 55,186,183,110,141, 33,157, 58, 65, 32, 16, 64, 42, 22,193, 90,106, 1,142, 41,182,100,149, 14, 29, 86,211, 38,162, 50,235,147, +163,163, 35, 68, 34, 81,153,192, 50,195,154, 85, 41, 39,203,178, 16, 8, 4,120,242,228, 9, 58,118,236, 8, 47, 47, 47, 28, 58, +116, 8,125,250,244,121,101, 40,209, 92,145, 85, 42,180, 94, 26,198,235, 3,160,212,146,101,150,208,210,234, 9,100,235, 91,128, + 32, 2, 64,211, 0,195, 1, 58,173, 22, 28, 7,112, 28, 96, 52,232,161,213,106,203,254,211,148, 33, 89, 87, 87, 87,111, 11, 11, +139,229,243,230,205,245,111,209,162, 37,178,178,178,192,178, 44, 44, 45, 45,161, 86,171, 97, 99, 99,131,246,237,219,191, 88,190, +124,185,130,227, 48,201, 76,145,245,218, 40,189,231, 23, 47, 94,172, 48,108, 88,186,169, 20, 41, 24,255,197, 94,136, 5,197, 67, + 75,165, 62, 60,213,189,119,187,117,238,128, 91, 15, 99,233, 79,231,174,215, 9,115, 66, 87,186,178,236,174,148,215,200, 23,199, +113,200,206,206, 70, 70, 70, 6, 6, 13, 30,140,253,251,246, 33, 33, 33, 1, 77,154, 52, 65,183,110,221,224,236,236,140,132,132, + 4,220,187,174,131, 46, 47, 23,185,250, 80,200,172,219,225,196,213, 56,221,146, 45,134,184,127,240,133, 49, 8,192, 88, 27, 27, +155,122,106,181, 90, 65,211,244, 97, 0,135, 1, 12, 23, 8, 4,195,101, 50,153,155, 82,169,124,142,226,217, 68, 39,107, 34,179, +144, 74, 29, 37, 82, 27,176,180, 14, 2,129, 0, 94, 94,117,193, 49,122,228, 41, 53, 24, 55,114, 32, 30, 62,137,194,249, 43,119, +104,163,145,221, 96,202,109,165, 40,138,243,243,243, 67,102,102, 38,132, 66, 33, 44, 44, 44, 96,101,101,133, 5, 11, 22, 96,227, +198,141,101, 34,171,182, 66,235, 19,192,207,198,219,234,206,247,155,138, 69, 86,122,154, 2, 25, 41, 66,200, 29, 93,176, 97,227, + 58, 85, 94, 66,122,187,223,128,216,255,122, 35,203,178,236, 55,169,169,169,206, 2,129,192,149,166,105, 36, 39, 39,227,193,131, + 7,152, 62,125,122, 70, 78, 78, 78, 87,212, 50,143, 82,169, 52,179,212,146, 85, 50,116, 88,213,112, 98,126, 57, 75, 86,126, 53, +148, 85, 13, 19,250,214,245,180,190,180,227,231, 89,222,109,218,181, 39,101, 2,155,188,162,103,233, 29,111, 92,187,218,126,250, +207,191,126,150,152, 87,212, 27, 64,124, 85,164, 18,161,176,223,187, 29, 58, 8,192,101, 64, 32,238,136,213,171, 70, 34, 43, 91, +137,188,220, 66,136, 68,150,208, 27, 41, 48, 44,129,246, 29, 59,225,247,221, 7,209,116,226, 4, 74, 44, 20,246,162,245,250,183, + 70,104,149, 96,197, 47,191,252,226,221,168, 81, 35,236,218,181, 11, 87,246,236,193,199, 5, 5,184, 74,146,148, 81, 40,116, 58, +107, 52,110, 71, 13, 66,171, 60, 79,211,166, 77,241,219,111,191,225,143, 63,254, 72, 26,221, 35,243,232,172,209,112, 54, 24,208, + 55, 52, 6, 14,117, 6, 2,161, 49,112,120,167, 17, 26,208, 2, 60, 35,136,138,225,160,130,130,130,186,148,223,255,199,160, 64, + 21, 67,236, 2, 0, 93,131,130,130,184,242,251, 26, 95,156,242,134, 83, 86,244,174,231, 19, 80,223,155, 48, 30, 90,143,100, 21, +173, 95, 20, 99, 16, 63, 45,226,102, 69, 1,235,170,233, 65,112, 20, 69,193,218,194, 2,114, 59,187, 98, 51, 63, 73, 2, 44,192, + 26, 1,130, 41, 22, 0, 28, 75,128, 99,204,122, 97, 64, 44, 22, 87,234,248,110,174,111, 86,121,206,194,194, 66,188,120,241, 2, +147, 38, 77,130, 76, 38, 43, 86,238,233,233,240,241,241,129, 64, 32, 64,106,106, 42,254,252,243, 79,212,171, 87, 15, 18,137,196, + 44,181, 85,206,186,212, 28,197,179, 12,155, 43, 20, 10, 27, 55, 55, 55,152,109,209, 98, 57,168,117, 4,244,122, 6, 79,159, 62, + 69, 90, 90, 26, 94, 60,127,134, 54, 42, 37, 56, 80,224, 56,206, 44,139,150,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, + 61, 61,193,113, 28,236,237,237,160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,127,183,200,122, +169, 78,149, 9,173,242,130,235,139,247,189,145,155,107, 5,138, 34,203,132,115, 13, 62, 90, 34, 0,232,218,123,168,224,210,249, +179,150, 52,176, 60,157,162,150, 11,106, 46, 71, 35,195,178,178,170,126, 79, 78, 78,134, 80, 40,196,145,195,135,145,155,145,129, + 22, 45, 90,160,109,219,182,120,246,236, 25, 30, 62,124, 8, 71, 71, 71,200, 61,223,195,213,231, 6, 68,166,105, 96,107,107,139, +184, 20,242,159, 12, 25, 48,177,103,207,158, 75,126,250,233, 39,103, 87, 87, 87, 97, 86, 86, 86,163, 77,155, 54,181,216,180,105, +211,140,207, 62,251,204,229,179,207, 62,179,151,203,229,130,244,244,116,191, 47,191,252,242,157,224,224,224,122, 0,214, 86, 71, +104,105,105,237, 64,137, 44, 65, 16, 2,216,217,218, 67, 32,182, 4, 75, 11,192,176,128,141,173, 28,183, 30, 30,193,205,176,194, +201,153, 57, 56,108,146,125,172,164,220, 29, 29, 29, 95,177, 84, 79,159, 62, 29, 59,118,236, 40, 27, 70,172,173,200,250, 97, 83, + 15, 43,162, 68,100,165, 39, 11, 64,232,234,225,244,241,219,249,121, 9,233, 29,223, 6,145, 85,250,142,227, 56, 14,207,159, 63, +135, 90,173,198,245,235,215,241,205, 55,223,100,189, 44,178,156,157,157, 39,218,216,216, 44, 43, 42, 42, 90,157,158,158,190,190, +198,142, 95,177,136, 42,253, 92,186,175,116, 56,209,196,164,250, 84,102,201,242,114,147, 94,120,120,125,175,143, 45,247,152, 64, +226, 36,224,169, 50,194,250,174,115,231,254,109, 6,144,173, 54,127, 91,167,237,228, 5, 23,146,149,218, 70, 85, 89,182, 88,134, +105,101,105,101, 13, 32, 19,161, 15, 66,202, 68, 86, 78,110, 1,116, 6, 10, 58, 61, 1,173,129, 68,247,158,125,177,113,235, 31, + 72,205,204, 5,195, 48,205,222, 50,145,229, 16, 16, 16, 48,101,248,240,225, 88,190,124, 57,130,127,250, 73, 63,149, 32,148, 2, +128, 59,195, 48, 96, 57,142, 32, 77,115, 98,175,192,179,102,205,154,227, 0, 70,173,156,142,247,242,138, 48,206,125, 32,231, 80, +103, 96,241,137,195,230,113, 0,224,144, 21, 92,177,201, 12, 12, 12, 36, 74, 71,214,204, 29, 97,251,183, 67, 16, 24, 24,120, 53, + 40, 40, 8,229,247,213, 93, 96,237,210,168,255, 87,179,167,173,106,211,167, 19,161,152,221, 11,185, 74, 45,253,117,164, 65,156, +162,169, 94,100,149,199, 87,155, 54,225, 97,108,241,115,236,233,236,140,185, 31,125, 4,142, 6,110, 70, 68,226, 96,112, 48, 70, +246,236, 9, 75,169,212,100,203, 6,203,178,149, 90,177,202, 91,179,204,181, 58,229,231,231,227,240,225,195,104,219,182, 45,100, + 50, 25, 4, 2, 1,154, 55,111,142,168,168, 40,248,250,250,130, 32, 8,156, 56,113, 2, 67,134, 12, 65,124,124, 60,222,123,239, + 61,171,196,196, 68,179,133, 86,100,100,164, 13,199,113,157, 75,173, 31,181,133, 78,167, 67,116,116, 52, 6, 14, 28, 8,123,123, +123,120,120,236, 71,240,133,189,144, 5,124, 12,130,128, 89, 66,139, 97,152, 79, 6, 12, 24, 32, 34, 8, 2, 26,141, 26, 82,169, + 5, 44, 45,173, 96,109,109, 3, 63,191, 70, 72, 75, 75, 67,159, 62,125,244,113,113,113,155, 21, 10,197, 33,115,211,234,239,239, +111,153,144,144,240,113,157, 58,117,196, 0, 96, 97, 97,209,196,215,215,119, 78,124,124,124,161,185, 86,173, 82,129, 69, 16, 4, + 40,138, 42, 19, 90, 2,146,132,155,171,115,217,247, 18,255, 52,162, 26, 46,101,106,142, 78, 2, 0,222,222,222,216,184,237, 20, + 57, 96,192, 0,204,152, 49, 3, 70,163, 17,155, 55, 23, 79,178,251,240,195, 15, 97, 48, 24,112,244,104,241, 36, 73,129, 64, 80, +173,217,228,193,131, 7, 8, 13, 13,133,209,104, 68, 65, 65, 1,206,157, 59,135,171,215,174,225,192,137,203, 72,120,254, 12,205, + 27,249, 96,194,132, 79, 32, 20, 10,177,123,247,110,116,236,216,241, 31,125, 33, 8,133,194,209, 59,118,236,112,219,181,107, 87, +254,137, 19, 39, 84,239,190,251,174,100,221,186,117,206, 27, 55,110,148,235,245,122,204,156, 57, 51,243,206,157, 59,186,193,131, + 7, 91,110,223,190,221,173,126,253,250,189,104,154,174, 76,104, 89, 2, 24, 9, 96, 76, 94,161, 94,144, 95,168, 1, 75,235,241, + 60,225, 5, 10,138,244, 96, 25, 3,146, 82,210, 80,164,101,144,147, 91,136,230,173,122,255, 18, 18, 18,178,208, 96, 48,124, 13, + 32,168,166,116, 70, 68, 68,224,206,157, 59, 72, 72, 72,192,243,231,207, 43, 42,197,137, 19,241,199, 31,127,152,109,209,170, 92, +100, 81, 32,116,190, 8, 58,113, 55, 63,243,153,226,173, 17, 89, 37,239,160,165,110,110,110, 75,221,220,220,164, 23, 47, 94,180, +173, 83,167, 14,104,154,214,191,108,201,234,218,181,235,162, 29, 59,118,184,249,250,250, 78, 7,176,254,223,144,118,146,196,196, +213, 91,166, 56, 89,139,147,210,240,116,109, 73, 44, 65, 10, 80, 43,129,144,125, 16,116, 88,252, 98,250,224,121,246,243,119, 45, +159,200,130,173,114,134,108, 92,124, 50,182,108,217,136, 89, 51,199,225,247, 95, 87,131,101, 5,208, 25, 41,120,215,125, 23, 58, + 3, 11,130, 20,160, 69,171,214,184, 18,114, 29, 66, 18, 56,188,107,203, 91,166,179,144, 27, 30, 30,190,249,196,137, 19,159,207, +152, 49, 3, 44,203,138,151,109,217,162,201,202,202, 90, 1,243,226, 95,189,204, 51,100,203,150, 45,177,243, 55,102, 29,159, 53, + 26, 84,194,105, 34, 55, 52, 6, 14,195,230,113, 56,178,138,192, 59,141,144, 43,171,188,137,191,246,210,254,237, 16, 90,165, 74, +178,252,190, 50,180,106, 88,239, 91, 91, 7,251, 79, 72,107, 15,167,185, 51,166, 10,226,211,181, 56, 90,231,163,162, 63,247,108, +176, 76,167, 37,191,196, 65,187,206,156, 63, 62,248,231,159,101,159,127,220,191,191,210,223, 20,195,134,153,220, 51,171,202,138, +101,174, 37, 11, 0,100, 50,153, 93,175, 94,189,208,163, 71, 15,124,240,193, 7,101, 62, 89, 45, 91,182,196,129, 3, 7, 48,116, +232, 80, 60,122,244, 8,110,110,110,104,220,184, 49, 26, 55,110,140,179,103,207,154,251,146, 3,195, 48, 8, 8, 8, 40,157,117, +216, 60, 37, 37,197,166,182, 5,169,211,233,144,147,147, 3, 7, 7, 7,136,197, 98,180,107,215, 22,159,127,209, 14, 78,110,191, + 33,192,191, 17, 84, 42, 85,217,244,119, 19, 26,219,128, 6, 13, 26, 32, 43, 43, 11, 89, 89, 89,144,203,229,112,119,119,135,171, +171, 43,214,174, 93,203,173, 95,191,254,188,193, 96,216,156,157,157,109,182, 37,203,213,213,181, 19, 65, 16,139, 52, 26,141,184, + 92, 15, 87, 44,151,203, 79,106, 52,154, 21, 10,133,194,100, 71, 80,130, 32, 96, 48, 24, 64, 16, 4,206, 60,119,135, 74, 79, 64, +153, 18,138, 25,239,251, 84, 16, 94, 66,161,176,198,225, 82,142,227, 84,163, 70,141,114,246,242,242, 68,114, 92, 4,142, 28,225, +240,211, 79, 63,149,206,138, 68,108, 73,199,160,244,123,183,110,221, 80,183,110, 93,112,102,196,202, 96, 89, 22, 79,158, 60,193, +254,147, 87,225,230,227,143,164,167,209,120,120,246, 52,234,200, 29,208,180, 85,107, 24,141,198,215, 10,189,241, 38, 96, 52, 26, +119, 54,108,216,144,211,235,245, 87, 1,108, 12, 11, 11, 27,167, 80, 40,102,158, 58,117,202,125,248,240,225,105,167, 79,159, 94, + 7, 96, 87, 88, 88,216,148,239,190,251,174, 7, 77,211,149,206, 22,164, 40,234,247, 47,191,252,178,235,240,225,195, 9, 17,105, +212, 95,188,176, 91, 64,211, 70,226,171,175,119, 50, 33, 55,174,146, 52,109, 36, 62, 24,245, 37,123,246,207, 48,114,242, 23, 63, + 50, 45,223, 29,128,240,240,112,215,192,192,192,239,140, 70, 99,181, 66,171,212, 82, 85,149,133,146,162, 40,140, 27, 55, 14, 7, + 14,152,238, 65, 53, 1,240,181,241,177,186,243,195,166,158, 86,132,160,168,156,200,170,143,160, 19,119,243, 51,158,166,189, 85, + 34, 11, 0,114,114,114,182, 1,216,198,178,108,134,165,165, 37, 10, 11, 11, 43,171,127,210,176,176, 48,169, 88, 44, 70,239,222, +189, 29,130,131,131, 99, 73,146, 92,159,150,150, 86,165,226,168,108,152,176,178,225, 68,188,198,172, 67,123, 57, 2,219,117,106, +101, 29, 99,187,220, 90, 42,208, 62,170, 19, 43,181, 33, 0, 20,232, 92,158,223, 74, 28,169, 36, 50, 37, 45, 91,119,123, 7, 54, + 2,203,192,124,186,176, 82,161, 69, 82,212,195,130,188,252,126,202, 66, 61,110,220, 12,199,168,145, 13,160, 51, 16, 96, 89, 18, + 69, 42, 29, 64, 9, 65, 2,248,240,163,177,224, 8, 1,114, 51,210, 64, 81, 84, 24,104, 26,111, 25, 22, 76,153, 50,165,223,215, + 95,127, 93,111,238,220,185,152, 59,119,174,207,142, 29, 59,182,253,240,195, 15,115,179,178,178,154,161,134,224,227,213,240,212, + 57,125, 96,241,236,147,215,183, 22, 12,104,175,121,250, 78,163, 98,203,215, 59,141,144, 43, 20,226,153,128, 66, 14,199, 85,116, + 51, 10, 12, 12,236, 82,126,255, 31,195,203, 78,240,101,223, 77,242,209,106, 80,207,163,111,171,150, 1, 95, 44,252,122,161,117, +212,173, 16,204,255,118, 35,215,176,117,175,194,109,215, 31,234,139, 44,235,246, 43,202,126,118,211, 84,125, 1, 0,125,187, 15, + 69,243, 38,109, 95,249,177, 99,183,226, 96,237, 55,174, 60, 64, 70, 86,170,201,141,109,137, 56,168,212, 39,203,148, 41,253, 47, + 67,163,209,228,135,135,135, 59,167,164,164, 84,112,124,175, 91,183, 46, 8,130,192,221,187,119,113,231,206, 29,140, 26, 53, 10, + 2,129, 0, 66,161, 16, 87,175, 94, 53,203, 26, 83,206,186,244, 4,197,179, 14,251,120,122,122, 86, 53,219,176, 70, 46,141, 70, +131,130,130, 2, 92,184,112, 1, 13, 26, 52,192, 15, 63,252, 0,119, 55, 23, 44, 92, 56, 27, 44,203, 66,169, 84,130, 97, 24, 83, + 45, 90,108,169,181,136,101, 89,100,101,101,161, 94,189,122,216,180,105, 19,214,173, 91,247,157, 66,161, 56,101,110, 26,189,188, +188,236, 24,134,249,106,192,128, 1,189, 6, 15, 30,140, 62,125, 42,198, 99,221,183,111,159,245,209,163, 71, 87,108,216,176,161, +175,193, 96, 88,153,153,153,153,101, 10,239,111,191, 21,135, 95,146,189,187, 20,243,135,215,193,152,105,187,177,118,237, 49, 72, + 36,146, 10, 13,239,242,229,203,171, 21, 49, 44,199, 53, 20,101,223, 74,155, 61,111,141,243,138, 21,193, 8, 14,206, 4, 73,146, +112,115,115, 3, 73,146,120,241,226, 5, 72,146,132,143,143, 15, 72,146, 68,106,106,106,169, 79, 96, 30, 42,153,245, 88,121, 47, +156,132, 86,171, 69,114, 82, 2, 82,226, 98, 97,165, 76,135,220, 70,134,188,136, 39,104, 62, 97, 98, 89,252,167,127, 24,127,232, +245,250, 63,202,125, 95,115,250,244,105, 61, 65, 16, 31,160,216, 79,163,212,162,241, 29, 77,211,223, 85, 69,242,238,187,239,182, +252,250,235,175,133,165,225, 54,220,189,191,167, 13, 6, 3, 11, 0,141,154,119,174,160,246,159, 61,123,134,181,107,215, 66,165, + 82, 65, 36, 18,137, 76,185, 15, 44,203,150,205, 48,172, 76,132,153, 35,178, 0,192,209,199,243,151,187,161, 87,153,199,113, 91, + 53, 97, 49,231, 44, 20, 73, 36, 72,253,219, 43,178, 94,182,108,121,122,122, 46,101, 89,150,227, 56,110,113,185,159, 36,222,222, +222,215, 47, 94,188,232, 72,211, 52, 54,108,216, 96,151,158,158,110,215,185,115,231,249, 0,170, 20, 90,149, 13, 19, 86, 54,156, +136,114,179, 14, 37, 18,137,131, 94, 95,165,241,228,149, 89,135, 12, 3, 63, 27,107, 59,228, 33, 5, 58, 39, 99,203,124, 71, 58, +247,146, 98,226, 35,247,196, 86, 77, 44, 25, 99, 61, 82,169,135,135,204, 14, 44,199, 85, 57, 53, 90,103, 52,158,123, 20,250,176, +183,183, 87, 3,234, 84,208, 53, 12, 26, 50, 28, 58, 29, 9,173,145, 0, 65, 9, 65, 80, 34, 52,107,222, 10,141,155, 54, 7, 7, +224,193,189, 91,180,222,104,188,244, 54,149,189, 91,135,207, 71, 17, 4,214,131, 99,185, 74,226,104,213, 27, 50,100,200, 10, 0, + 95,212,196,227,252,238,231,163, 72,178,152,167,124, 28,173, 47, 63,159,130,136,123, 66,219,107,161,171, 68,125,222,197,153,172, + 96, 2, 50,233,255,102, 29, 10,201,215, 10,205,241, 95, 17, 92, 53, 11, 45, 47, 47, 47, 59, 27,137,244,183,207, 38,124, 98,157, +248,248, 54,210, 35,239,226,230,181,216,188,131, 71,143,229,170,114, 50, 39,152, 33,178,202,134,249, 28, 93,235,160,174,255,171, + 66, 75,106, 37, 7, 0,212,245,111, 11,202,210,214,220, 33,143, 87,172, 89,181, 17, 89,229, 95,216,149,197,208,154, 60,121, 50, +118,236,216,129, 14, 29, 58,160, 97,195,134,101, 47,123,115,173,102,149, 88,151,204,158,109, 88, 30,133,133,133,240,241,241,193, +246,237,219, 17, 22, 22, 6,107,107,107,140, 26, 53, 10,133,133,133,101, 2,203, 84,103,120,142,227,158, 93,188,120,177,205,136, + 17, 35, 56,161, 80, 72,228,231,231,195,206,206, 14,155, 54,109, 82, 41, 20,138, 51,181, 16, 89,195, 69, 34,209,236,145, 35, 71, + 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,160, 69,139, 22,157, +230,206,157,219, 65, 32, 16,108, 74, 75, 75,219, 93, 93, 93, 34, 8,162,172, 65,157,176, 62, 26,122,125,113, 3,189,121,243,102, +148,248,186,253,111,136, 32, 46, 14, 48, 97, 38,139,149,149, 21, 26, 54,108, 88,105,217,119,234,212, 9, 15, 30, 60, 40, 30,154, + 20, 8,224,236,236,140,155, 55,111,154, 52,147,170, 52, 16,100,120,120, 56,252,235, 58, 33, 44,248, 34,156,100, 66,180,112,119, +133,103,167, 46,136,141,141,253, 39,173, 89, 4,138,253, 48,122,150,212,193,157, 0, 38,151,251,190, 9,192, 47,230, 16,210, 52, +205,145, 36, 73, 36, 39, 39, 27,100, 50, 25,225,224,224, 32,144, 72, 36,208,233,116,101,130,235,217,179,103, 8, 10, 10, 66, 74, + 74, 10, 28, 28, 28, 72, 91, 91, 91, 24, 12,134, 60, 83,248,253,252,252,224,234,234, 90,193,241,125,194,132, 9,181, 18, 89,227, +128,128, 29,223,175,172, 35, 33, 41, 91,127,167,190,120, 30,253, 66, 75,234, 33,253,255, 32,178, 0, 32, 63, 63,127, 27,128,109, +165,223,157,156,156,198, 83, 20,181, 80,167,211,217, 94,189,122,213, 78, 46,151, 19,187,119,239, 54, 46, 94,188, 56,159,162,168, + 60,130, 32,126,254,231,197, 33, 34,179, 11,226,124,132,246,238,236, 99, 45,119,107,102,242,252,198,121,194, 6,114,162,105, 0, +134,100, 70,221, 24, 79,199,181,207, 80,164,147, 28,216,200,106,222,193, 59,231,127,189,252,171,216,232,135,222, 82, 27, 41, 38, + 79,249, 26,103,206, 95, 1, 65, 10,113,253,214, 93,232, 13, 12,178,115, 11, 48,242,195,209,240,116,115, 66,228,157, 11, 89, 52, +203,110,122,187, 68, 54,187,177,247,160,241,246, 18, 11, 89,201, 61, 97,240,199,175,179, 65,146,235,177,100,201, 18, 4, 4, 4, + 76, 11, 15, 15,255, 6, 53,196,209, 34, 8,118, 99,179, 46, 31,218,139, 36,197, 60, 28,203, 96,251,225,249, 37,113,180,102, 97, +211,182,163,205,154,214,125,190,172,186, 56, 90,111,145,200, 42,191,175, 94,104,249,248,248, 72, 44,133,152, 36,164, 4,115, 63, +251,104,176, 60, 51, 46, 2, 41, 81, 15,139,135, 23, 12, 26, 67,250,211, 40, 83, 66,161,247, 68,197,248, 29, 92,117, 67, 87, 90, +173, 73, 61,250, 10,156,165, 13,238,203,214, 44, 51, 69,214, 43,156,229,197, 86,249,184, 89, 94, 94, 94, 88,177, 98,133, 41,113, +180, 94,206,123, 41,250,160,216, 1,190,188, 51,124, 31, 19, 69, 86,165,156,114,185, 28, 57, 57,197, 17, 18,186,118,237,138,174, + 93,255, 55,159,193, 96, 48,148, 89,177,172,173,173, 43,179,104,189,194,105, 97, 97, 49,255,216,177, 99,159,220,186,117,107,196, +156, 57,115,132, 61,122,244, 40, 21,115,106,152,182,182, 91, 5, 78,134, 97,166, 92,184,112,129, 98, 89, 22,219,183,111,199,131, + 7, 15, 56,153, 76,182, 72, 38,147,109,180,176,176, 96, 52, 26,205,228,137, 19, 39,142, 94,182,108, 25,217,169, 83, 39,220,190, +125,155,172, 87,175,222, 88,160, 66, 16,203, 74,243,126,247,238, 93,144, 36, 9, 58, 55, 9,211,230, 31,132,165,133, 0,209,209, +209,200,205,205,125, 37,136,169, 41,247,179,188,165,164,116,235,212,169, 83,217, 48,100,187,118,237, 64, 81, 20, 30, 61,122, 84, +213, 48,108,121, 78,206,209,209,177,172,126,136, 68, 34, 92,185,114, 5,223,126,251, 45,188, 29,236,144, 23, 21, 6,215,174,221, +209,235,147,137, 24, 53,106, 20, 40,138,130,131,131, 67,153,229,215,132,186,244, 58, 40,207,249,137,191,191,255,216,200,200, 72, +207,102,205,154,185,133,135,135,119, 11, 8, 8,240, 9, 11, 11, 43,253, 46,129,105,190, 57,101,156,247,239,223, 63,178,113,227, +198, 41,227,198,141, 19,177, 44,203, 36, 38, 38, 26, 1, 16,174,174,174,212,253,251,247,217, 83,167, 78, 65,163,209,192,211,211, +147,244,240,240, 32, 46, 93,186,196, 70, 69, 69,221,229, 56,238,107, 83,242,206, 48, 76,133, 48, 14,165,159,247,237,219,103,246, +243, 94,167,177,223, 15, 61, 58, 55,242,202, 78,123, 4, 69,106, 28,152, 2,185, 33,232,196,105,157,153, 34,235,175, 46,163,191, +147,115,249,211,167, 79, 61,116, 58, 29,196, 98, 49, 54,111,222,108, 88,177, 98, 69,100,118,118,118, 71, 84, 62,163,188, 2,103, + 45,103, 29,230, 86,195,249,202,172,195,130, 28,156, 57,113,242,126, 27,171, 33, 59, 49, 45, 45,171,204,177,145, 35, 8,135, 99, + 46, 77, 58,202,218, 54, 75, 37,207, 46, 37, 11, 25,245,153,106,242,174,215,232,245,195,135, 12,253,240,242,129, 3,251,173, 22, + 47, 93,138,155,119,195,144,147, 95, 4,150,163,192, 18, 4, 22, 46, 92, 12, 87, 39, 7, 40,211,158,170,117, 6,195, 16, 84,140, +161,245,159, 47,119,130, 32,167, 95, 58,181,123, 61, 73,128, 85,101,196, 72,168,194, 56,217,152, 81, 67, 4,195,135, 15,199,177, + 99,199, 16, 30, 30,190,181, 26,145, 85,198,201,113,228,244,176,171, 7,215, 19, 0,171,201,138,145, 8,138,158,203,198,126, 52, + 68, 48,106,212, 40, 28, 15,186,133, 3,167,159,111, 57,112, 26,167,241,118,195,252,200,240,214, 2,132,119,108,226,235,209,169, + 85, 83,169,128,209, 32, 37, 42, 14,185, 42, 45, 46, 69, 36,230,147, 28, 89,235,216, 58,197, 47, 72, 17,146,146,158, 86,210,179, +146,150, 52,232, 90,179, 56, 73,146,172, 96,205,122, 29, 75, 86,249,116,186,184,184, 84, 88,206,165,124,195, 93,234, 3, 84,139, +208, 14,243,147,146,146,108,146,146,146,192,113, 28,238,222,189,107,211,174, 93,187,249,175, 99,205,154, 61,123,118,153,213,234, +229,125,101,199,106, 66,137, 83,250, 58,163,209,120,120,238,220,185,211,218,181,107,215,123,233,210,165, 4,204, 88,128,247, 37, +107, 14,205,178, 44, 66, 66, 66,112,236,216, 49,198, 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,105,232,208,161,187, + 99, 98, 98,168,200,200, 72,112, 92,205,243, 78, 53, 26, 13, 26, 54,108, 8,154,166,177,106,154, 23, 10, 11,155,129,166,105, 48, + 12, 3, 75, 75,203, 50, 43, 94,121,241, 92, 83, 61, 98, 24,230, 21,161,117,247,238, 93, 80, 20,133,142, 29, 59,226,225,195,135, +101, 22,173,154, 44, 80, 6,131, 33,201,197,197,197,101,249,242,229,101,233,202,202,202,194,197,139, 23,241,238,123,237,209,100, +210,100,164,165,165,225,231,159,127,134,187,187, 59,126,248,225, 7,228,230,230,130,166,233,191,219,156,222, 47, 50, 50,210,243, +163,143, 62,202, 12, 11, 11,243, 12, 10, 10,178, 11, 12, 12,180,252,240,195, 15, 51,195,194,194, 60, 9,130,104, 15, 51,157,160, + 89,150, 93,176,112,225,194,243, 63,252,240,195,252, 47,190,248,162,221,184,113,227,132, 66,161,144, 77, 77, 77,165,247,239,223, + 79, 52,108,216,144, 20,137, 68,196,133, 11, 23,216,123,247,238,221,161,105,122, 21,128,235,230, 88,156,203,139, 44,138,162, 76, + 21, 89, 21, 48,211, 89, 50,214,154,204,234,184,113,243, 10,178, 81, 93, 79,195,158,253, 23,147,175,223,126, 26, 79,233,232,153, +191, 85, 19, 26,224,109, 6, 69, 81,135,252,253,253,199, 79,159, 62,221,162, 79,159, 62,146,101,203,150, 21, 20, 22, 22, 86, 37, +178, 42,233, 48,255, 45,179, 14,127, 93, 48, 39,104,230,151,205,198,251,126,234, 90, 7,193,170, 76,228, 9, 40,210,198,142, 68, + 43, 31, 10,133,217,207,228,167, 47,239,122, 1,160,166,184,108,247, 67,159,132,247,108,218,172,229,209, 85, 63,172,114, 94, 52, +111,174,240,104,208, 57,112,180, 1,119,175, 94,133,149,136,225,162, 66,131, 51,116, 6,253, 96,188,133, 75,240, 40,110,254,114, + 0,192, 73, 7, 7,135,199,159,140, 27,215,208,223,255, 67,200,100, 50, 28, 57,114, 4,127,108,216,192,172, 3, 70, 72,128,135, + 83,106,136,167,151,121,167,140,231,209,196, 79, 62,241,107,213,234, 83,200,100, 50, 28, 62,124, 24,187,215,173, 51,153,231, 63, +142,210,200,240,103,240,191, 8,241, 53,248,104,145, 68,225,157,167,137, 69,119,159, 38, 22,129,229, 56,150,227,116, 36,137,100, +149,193,240,195,211,231,169,181, 18, 5,165, 67,135,223,125, 63,253,205,141,121,148, 19, 63,181,157,210, 93,137,200, 74, 41,191, + 70, 90,249, 70,186,170,207, 70,163, 49,197, 68,250,149,222,222,222,175, 28,171,189,233,151, 51, 75,100,153, 26, 71, 11, 0,114, +114,114, 20, 0, 22,221,190,125,123, 95,239,222,189, 39, 2, 72,173,101, 25,109,239,210,165,203, 36, 0, 20, 65, 16, 91,211,210, +210,194, 94,121,224, 21,138, 88,119,119,247, 31,235,214,173, 59,185,184, 99, 74,108,175,161, 33,127,222,172, 89, 51, 67,101,101, + 81,213,119,150,101,107, 44,163,252,252,124,180,109,219,246,149, 53, 45, 57,142, 67, 98, 98, 98,169,197,169,236,222, 87, 39,224, +138,138,138, 38,127,254,249,231,219,132, 66,161, 55, 0,162, 84,228, 50, 12, 67,253,242,203, 47, 82,134, 97, 40, 0, 4, 73,146, +180, 80, 40,212, 30, 59,118,140,166,105, 58, 73,167,211, 77,254,155, 95, 16,135,137,226,165, 24, 84,145,145,145,141, 74, 44, 89, + 41,225,225,225,143, 14, 28, 56, 32, 7,112,176,150,188,215,213,106,245,245, 21, 43, 86,116,218,188,121,243,130,201,147, 39,183, + 29, 53,106,148,160,107,215,174, 56,115,230, 12, 19, 18, 18,114, 87,163,209,172, 52, 71, 96,149,148,101,129,151,151, 87,153,224, +170,225, 89,174,214,145,215,209, 71,178,113,244, 84,119,233,246,149, 23,139,178,211,244,183,140, 69,250,175,119, 1,225,248,127, +140,140,140,140, 57, 0, 22,255,252,243,207,105, 45, 90,180,144,136, 68, 34,189,169, 34,235,111, 4,205,230, 23,245,255,169,215, +176,147, 93, 22,126, 94,183, 87,183,142, 50,175, 58,206, 30, 81,113, 25,120,118,251,140,234,241,233,239, 19, 56, 93,222, 32, 0, +166,120,174,223,211, 25, 12, 13,102,207,157, 61, 77, 44, 20,246,102, 24,166,121,143, 75, 39, 56,138,162,194,244, 70,227,165,146, +225, 66,237, 91, 92,228,223,253,248,227,143, 13,253,253,253,113,228,200, 17, 92,218,187, 23, 35,179,179,113,133,162, 40, 82, 36, +114, 60,109, 48,172,129,105, 2,233,187,181,107,215,250, 5, 4, 4,224,208,161, 67,184,176,123, 55, 70,212,142,167,170,182,174, + 13, 0,121,201,215,108, 0, 49, 0,222, 1, 96, 1, 64,135,226,165,157,156,202, 55, 97, 37,191,149,254,126,141, 32,136,191,210, + 17,182,230,200,240, 47, 35,252, 89,194, 59,111, 58, 21, 26,141, 38,183, 97,195,134,102,205,185, 54, 26,141,213,142,225,210, 52, +157,226,235,235,107,178,213,194, 20, 81,148,155,155,219,250, 47, 44,140,215,242,197,170,208,136,176,108,130,155,155, 27, 91,218, +232, 87, 38,194, 42, 59,198, 1, 47,204,249,159,244,244,244, 24, 0, 95,214, 54,157,105,105,105, 71, 97,194,162,209,166,158, 7, + 0,121,121,121,111,124, 49, 95,130,227, 82,151, 45, 91,102,150,192, 6,199, 85, 39, 62,195,138,138,138,218,153,242,223, 6,131, + 1,255, 32, 14,149,108,100,120,120,248, 68,130, 32,250,160,120, 72, 96, 43,222, 76, 52,239,235, 74,165,242,250,234,213,171, 59, +109,223,190,125, 38,199,113, 80, 42,149,235,204, 21, 88,101,189,231,204,204, 51,111, 42,227,185, 25,250, 63,247,111, 77,233,174, +201, 55,204,220, 81,164,223, 13, 30,101,198, 40,142,227,126, 31, 51,102,204,187, 0,118,189, 46, 89, 21,179, 14, 95, 23, 47,216, +188,130, 22, 87,102,127,251,201, 21, 59,235, 1, 96, 4,141,160, 39, 79, 67,159,115, 6,192,111, 48,205,205,161, 44,191, 52,203, +174,165,245,250,181,229, 26,151,255, 15,229,236, 16, 16, 16, 48,115,252,248,241, 88,188,120, 49, 46,172, 89, 99,152, 74, 16, 5, + 66,128, 59, 95,220,209, 36, 9, 96,158,169, 60, 99,199,142,197,226,197,139,113,118,213,170,218,242, 84, 7, 57, 65, 16, 65, 0, + 48,127,254,252,175, 87,172, 88, 97,191, 96,193,130,230, 43, 87,174,252,161,228,123, 68,233,239, 37,109, 93,224,130, 5, 11,154, +150,251,189, 16,192,253,191,248,126, 86, 26, 25,254,175, 70, 79,158,147,231,228, 57,121, 78,158,147,231,228, 57,121,206,215, 1, +199,113, 3,138,119, 85,239,171,250, 92,110,143,191, 57,205,197, 19,161,248,142, 27, 15, 30, 60,120,240,224,193,227,191,136,242, + 86,172,218,252,254, 6, 81,234,163, 85, 30,219,129,226,105,221, 85,169, 82,115,102, 61,212, 70,217, 6,243,156, 60, 39,207,201, +115,242,156, 60, 39,207,249,255,142,179, 38,238, 87,174,231, 56,110, 0, 65, 16, 65, 28,199, 5, 86,181, 47, 21, 86, 47,127, 46, +183,127, 99,110, 7,149,160,212, 55,171,204, 71,235,239, 10,217,195,155, 85,121, 78,158,147,231,228, 57,121, 78,158,147,231,124, + 45,148, 14, 1, 2,224,230,207,159,191,224, 95, 56,116,232, 86, 34,178,202,182, 26,135, 14, 57,238, 48,149,154, 10, 27,177, 88, + 38, 2, 0,189, 94,109,240,240,128,146, 32,134,255,147, 11,222,242,248,111,162,116,186,119,198, 27, 62,151, 7, 15, 30, 60,120, +252,255, 64, 86,169,165, 10, 64, 22, 0,162,228,187,190,100,159, 85, 34,200, 94,254, 92,225,247,191, 16, 10, 84,225,252, 46,168, + 74,100,101,103,203,156, 4,130, 60, 63,134,209, 54, 6, 0,129,128,140,206,206,182,143,229,184,195,217,181, 17, 91, 78,206,206, +161, 66,138,242, 48,229, 92, 35,195,164,102,103,100, 84, 12, 29, 79, 16,111,131,192, 51, 85, 68,188,142,216,248,203,133,138,147, +147,147,139,139,139,203,251, 54, 54, 54,239,229,231,231,223,203,202,202, 58, 94,205,186,135, 43, 8, 2,115,139,235, 21, 86, 3, + 88, 80, 13,181, 57,231,190,140,134, 50,153,108, 26, 65, 16, 1, 37, 15, 88,184, 90,173,222, 12,224,233,255,195, 23,146, 5,128, +193, 2,129, 96,172,147,147, 83,219,244,244,244,101, 0,106, 27,205, 91, 0, 96,182,157,157,221, 72, 59, 59, 59,223,220,220,220, +120,165, 82,121, 8,192, 90, 0, 53, 78,149, 94,246,133,219,123, 93,251,116, 93, 20,114, 33,228,187,101, 27, 20,183, 95,249,125, +182,155, 99,239, 94, 29, 22,135,156,190,181,252,235, 77,105,185,102,166,141, 44,217,128,226,217,145, 28, 94, 13,246,250,186, 16, + 2, 24, 8,160, 43,128, 16, 0,167, 77,201,119, 21,120, 23,192,215, 37,105, 94, 11,224,202,191,188, 30, 89,186,184,184,172, 2, + 48, 80, 32, 16, 68,166,166,166, 78, 2,144,242, 15,167, 73, 0,160, 13,128, 0, 20,135,225,184, 15,211, 66, 56,212, 8, 71, 71, +199, 64,129, 64, 48,173, 36,180,203,230,156,156,156,160,127,107,193,136,197,226,117,174,174,174,159,106, 52, 26, 53, 65, 16, 92, +249,120,143, 52, 77,167,100,103,103,183,126,219, 94,106, 4, 65,220,255,151, 39,113, 82, 37,199,170,142,163,149,154, 10, 27,129, + 32,207, 47, 51, 61,108,100,154,226,201, 8, 0,112,119,107,126,200,217,181,217,193,212, 84,177,193,181,209, 16, 43,161, 76,176, +153,162,132, 45,181,122,157,147, 80, 32,204, 54,208,198, 71,164,158,155,150, 30,115,188,210, 96,139, 66,138,242, 72,136,189,226, + 76, 27,114, 33,148,186, 67,104,225, 93,101,106,221,221,221,107,149, 75,123,123, 95,107,131, 68, 58, 83, 40,164,122,177, 28, 29, +192,177, 0, 73, 8,195,105,198,120, 89,164,211,253,148,151, 23, 95, 88,219, 59,216,200, 17,174, 28, 48, 10, 4,122,129,195, 37, + 2, 56, 16,147,131,116, 51, 40, 76, 21, 17,175, 35, 54,202, 95,251, 51,128, 57,111,186, 38,121,120,120,216, 7, 6, 6,174,251, +246,219,111, 45,172,172,172,136,164,164,164, 62,243,230,205,235,252,224,193,131, 47, 83, 83, 83,211, 94, 22,125, 4,129,185, 44, +203,145, 0, 64,146,196, 60,185,220, 89, 70, 81,212, 43,177,141, 24,134,145,101,101,101, 78,103, 89,142, 40, 57,119, 46,199, 97, +189, 41,130, 81, 42,149,126, 24,208,172,229,151,171,126, 92,107,229,226,236,108, 73, 51,172,225, 69, 98,130,108,209,252, 57,237, +226,158, 61, 93,175,213,106,247,215,230,185,166, 40,106,164, 68, 34, 9, 4,224, 95,114, 44, 74,167,211, 5, 49, 12,115,208,212, + 6,221,197,197,229, 26, 69, 81,117,204,249, 99,134, 97,146, 50, 50, 50, 58,214,178,136,134,123,123,123,255,214,165, 75, 23, 89, +219,182,109, 33, 22,139,177,120,241,226,217, 10,133,162, 38,161, 37, 0, 48, 91, 38,147,141,180,180,180,244, 45, 42, 42,138,211, +104, 52, 71,197, 98,113,207,245,235,215,123,117,232,208,193, 58, 35, 35,131,160, 40,202,229,236,217,179, 31,175, 91,183,174, 15, + 77,211, 61,106,106,228, 10,226,184, 69,146,129,254,157, 10,226,174, 44, 2,208,239,229,223,105,173,116, 44, 71,121, 5,106,184, +135,201, 37,226,195,100,145, 37, 20, 10,215,187,186,186,142,215, 22,199, 10,224, 94,110,112, 0, 64,175,215,231,229,231,231, 55, +170,205, 35, 15, 96,130,157,157,221,248,175,190,250,202,190, 95,191,126,216,187,119,239,103, 59,118,236,200, 83, 42,149,191,163, + 56, 16,102,140,153,156,115,211,211,211,251, 11,133, 66,194,203,203,139,210,104, 52,230, 8, 45, 63, 20, 47,194,124, 31,192,102, + 20,135, 46,232, 6, 20, 63,239, 0, 86,151, 10, 55,146, 36, 55, 55,106,212,232,253,168,168,168, 45, 0,190,171,237,179,238,234, +234,186,109,211,166, 77, 35, 6, 13, 26, 68,101,101,101,121,180,104,209, 98, 95,122,122,122,167, 55,240, 26,249, 68, 34,145,204, +106,222,188,121,147,152,152,152, 88,165, 82,185,182,228,126, 86,247, 76,121, 2,232,105,103,103,215, 99,225,194,133, 86,129,129, +129,216,190,125,123,255, 29, 59,118, 20, 21, 22, 22, 94, 70,177, 79,207,107,137, 64,129, 64, 48, 45, 37, 37,197,137,227, 56,184, +185,185, 77, 3,240,175, 20, 90, 36, 73,174, 31, 58,116,232,248,125,251,246,201, 18, 18, 18,100, 30, 30, 30,101,193,179, 9,130, +168,117,251,201,227,181,177,189,156,224,170, 57,142,150, 88, 44, 19, 49,140,182,113,154,226,201,136,206, 93,126,177, 5,128,107, + 87, 63, 31,225,236,218, 52, 92, 44,150,197, 74,108,164,199,134, 14,236,217,114, 88, 96, 23,194,211,205, 25, 41,138, 76,151, 95, + 15, 92,232, 27,116,225,202, 49, 20, 7, 16,171, 20,180, 33, 23, 22,134, 96,196,220,216, 0,167,174,105,216,120, 54, 5,183, 31, +191,128,186, 32, 27,117, 92, 45,240,227,204,222,112,181,151,213,174,235,229,220,176, 27, 45,144, 28,252,232,195, 49,182,239, 15, +246, 23,250,184,186,130,227, 36,136,141, 43,106,127,238,226,149, 54, 71, 15,239,159,102, 41,108, 56, 82,149,249,212,228,151, 91, + 43, 55, 88,168, 12, 24, 44,160,136,143, 59,180,110,210,227,195,254,157,200, 38,254, 13, 16, 25, 17,213,251,228,159,119,127, 36, +111, 69, 92,166, 25,110,143,165, 8, 39, 30, 42,170, 13,232,247,138,224,232,209,163,103, 39,137, 68, 82, 33,120,146, 78,167, 19, + 93,190, 28,252,110,109,196, 70,233,127,232,245, 58, 82, 40, 20,131, 36,137, 47, 3, 2,154,249,103,103,103, 95, 33, 8,226,183, +180, 52,243,172, 5,159, 3,226, 60,129,224, 29, 82, 34,113, 99,244,122, 71, 0, 32,196,226,188, 23, 36,217,108,225,215, 95, 91, + 81, 20,197,230,228,228, 64,173, 86, 19, 19, 39, 78,148,198,197,197, 13, 77, 77, 77,221, 80, 67,143, 4, 59,118,236,240,115,115, +115,123,101,245, 88,133, 66, 33, 30, 52,232,253,218, 20,189, 95,243, 22,173,102, 93,184,112,222, 95,153,155,167,221,241,243,182, + 80,163, 84,166,171,231,223, 72,184,121,251,110,219, 73,227, 71,127, 30, 29, 29,241, 8,230,173, 87,231,109, 97, 97,113,108,205, +154, 53, 1,221,186,117, 19, 58, 59, 59, 35, 35, 35, 3, 81, 81, 81, 1,127,254,249,231,224,221,187,119,207,214,104, 52, 67, 1, +147, 22, 68,109,120,121,207,111,206,150, 14,142, 96,140, 70,184, 55,111, 85,230, 32,249,236,207,139,160, 13, 6,176, 70, 35,252, + 3, 7,151, 88,147, 57,248,251,251,215, 54,234,174,123,211,166, 77,255,248,225,135, 31, 68, 58,157, 14,119,239,222,197,149, 43, + 87, 88,133, 66, 81, 83, 64, 92, 1, 65, 16, 23,151, 46, 93,234,217,177, 99, 71,235,236,236,108, 48, 12,227,116,226,196,137,105, + 45, 91,182,180,241,242,242, 18,239,217,179, 7, 69, 69, 69,160,105,218,193,215,215,215,225,195, 15, 63,212,239,217,179,103, 54, +128, 85, 85, 89,178,148,113,220, 34, 5,225,219,183,209, 59, 99,145, 78,156,239, 59,171, 47,206,217,212, 39,202, 44, 91,125,125, +125,173,149,169,178,121, 86, 54,205, 28,148,169,193,243,250,250,250,238, 56, 31,111, 82,103,136, 44,105,108, 62, 58,112,224,128, + 44, 42, 42, 74,230,239,239, 15,150,101,203, 34,240,151, 6,156,109,216,176, 97,109,238,227,202, 41, 83,166,204, 27, 49, 98, 4, +154, 55,111, 94, 22, 20,117,201,146, 37,152, 55,111,158,253,181,107,215,102,239,223,191,127,246,241,227,199, 87, 1,152,111,166, + 53,166, 20,230,150,241, 55,207,159, 63, 31,126,236,216,177,209,115,231,206,109, 8, 96, 58,128,197, 57, 57, 57, 93, 74,172, 49, +226, 18,161,245,201,236,217,179,167,206,159, 63, 31,253,251,247, 95,124,247,238,221,239,107,105,229,163,104,154,238, 63,104,208, + 32,202,104, 52,194,210,210, 18, 70,163,177,254,235, 26, 37, 0,108,154, 60,121,242,212, 41, 83,166,192,222,222, 30, 70,163,209, +239,192,129, 3, 59, 22, 47, 94,252, 30,128, 9, 85,164,117,236,212,169, 83, 63, 24, 51,102, 12, 90,183,110, 13,129,160,248, 54, +174, 89,179, 6,203,151, 47,183,186,120,241,226,224, 61,123,246, 12, 62,121,242,228, 81, 84, 92,182,203, 44,176, 44, 11,129, 64, +128,228,228,100, 56, 59, 59, 75, 88,150,189, 64, 16,196,246,220,220,220,227,255,162,198,124,245,240,225,195, 63,218,183,111,159, + 21, 0,252,248,227,143,152, 53,107, 22, 92, 92, 92, 96,101,101,197, 75,157,127,143, 69,107, 82,141, 22,173,154,160, 86,171, 91, + 45,248,226, 99,144,100,113,175,177, 65, 61,111,172,248,122, 18,113, 50,232, 66,171,106,109,240, 82,119,196,220,216, 0,137,215, + 76,232,140, 52,238, 60,126,142, 75, 63,246, 41,110, 45,251, 45,132,206,208,163,180,177,113, 16, 91, 88,172,214, 51,204, 77,184, +186,222, 69, 98, 98, 86, 77, 34, 75,238,234, 18,180,117,235, 42,139,128,250,141, 96,160,141, 72,205, 76, 5, 65, 72,224,233, 97, +141, 79,198,246, 19,118,233,226,238,244,205, 55,219,206,164,179, 24,162,206,126, 90, 99,192, 80, 63, 39,236,106, 21,208,112,196, +135, 3, 58, 74,154, 5, 52,133, 72, 98, 81,246,219, 59,173, 91,227,157,214,173,201,249, 69,133,189,238,221, 15,237,117,228,226, + 29,157,218,152,120, 40, 54, 27,227,106,120,201,148, 9,142, 25, 51,102,192,197,197,165,194, 9, 25, 25, 25,248,243,207,203,149, + 94, 99,198,139,172,236, 63,190,255,254,123,235,188,188,188,126, 59,119,238,236,206,178,236,247,233,233,233, 55, 76, 33, 25, 3, +212, 41,144, 72,122,140, 95,187,150,109,249,254,251,148,157,171, 43,201, 50, 12,145, 22, 31,239,248,243,134, 13, 93,115,159, 61, +179, 80, 57, 56,228,230,105, 52,234,216,216, 88, 72,165, 82, 66, 32, 16,180,169,132, 42,131,227,176,154, 36,137,121, 4, 65, 64, + 34,145,198, 78,153, 50,229, 97,201,111,117, 78,159, 62, 45, 27, 56,112,160, 26, 64, 2, 0, 72, 36, 82, 15,138, 34,253,138, 29, + 8,177,218, 20,129,105,105,105,249,197,119, 63,172,178, 84,230,230,107, 12, 42,149, 81,110, 99, 69, 16, 86,214,148,178,160,176, + 48, 85,145,165, 91,184,108, 57, 53,249,147, 49, 95,168, 84,170,105,166,138,172, 22, 45, 90,220, 59,118,236,152,179,163,163, 35, +242,243,243,145,147,147,131,123,247,238,129,101, 89, 12, 29, 58, 84,210,190, 93,219, 86, 95, 47, 92,116, 59, 57, 53,245, 61, 83, +196,150,165,131, 19,126,236,216,178,184,177, 78,200, 41, 43,159,237,195, 3,203,206, 89,158, 82, 80,106,157,123,157, 37,164,222, +235,209,163,135, 8, 0, 38, 76,152,160, 44, 44, 44, 92, 1, 96, 31,106,142,232, 63,123,209,162, 69, 30,245,234,213,243,217,183, +111, 31,138,138,138, 0,192,185, 94,189,122,240,243,243, 99, 66, 66, 66,224,231,231, 7,107,107,107, 92,187,118, 13,183,111,223, + 70,235,214,173,173, 69, 34,209, 8,131,193, 80,169,208,234,218,167,235, 34,201, 64,255, 78,141,222, 25, 11, 43, 27, 55,236,216, +127, 16, 49,161,187, 59,233, 12, 81,139, 68,204,213, 49, 26, 78, 50, 46, 43,201,106,126,157,214, 93, 28, 27, 52,125, 31, 62,239, + 60,116,210, 50,215,159, 47,234, 85,111,165, 64,170,221,189,108,173, 34,167, 42,145, 5,224,199,161, 67,135, 14, 63,112,224,128, + 29, 0,132,133,133, 33, 35, 35, 3,114,185, 28, 82,169, 20, 66,161,176,108,125,210, 90, 98,220,230,205,155,203, 68, 27, 77,211, +101,171, 0,200,100, 50,116,238,220, 25, 45, 91,182,196,241,227,199,199, 85, 33,180, 58,182,107,215,110,175,143,143,143, 87,249, +131, 42,149, 10,163, 70,141, 2, 0,116,233,210,165,135,133,133, 5, 87, 42, 8, 21, 10, 69,209,253,251,247,123, 1,184, 91,133, +178,212,164,166,166,226,171,175,190,194,139, 23, 47, 62,219,186,117,107, 34, 0,169, 88, 44, 46,235, 31, 3,240,107,218,180,233, +250, 89,179,102, 33, 46, 46, 14,145,145,145,247, 80,251,161, 84,198,210,210,242,153,209,104,108, 77,211, 52, 52, 26, 13,134, 12, + 25, 34, 61,122,244,104, 6, 69, 81,209,217,217,217,163, 81,236,147, 98, 42,164, 0,214, 78,153, 50,101,234,220,185,115,113,249, +242,101,156, 60,121, 18, 99,198,140,193,204,153, 51, 97,101,101, 53,126,230,204,153,183, 81,188,160,249,203,232,177,121,243,102, + 48, 12,243,202,179, 33,149, 74,209,177, 99, 71, 52,105,210, 4, 39, 79,158,236,241, 26, 66,203,167, 99,199,142, 98,150,101,161, + 82,169, 16, 18, 18, 98,101, 97, 97, 97,229,233,233, 57, 17,192,191, 70,104,249,248,248, 76, 57,112,224,128, 85,249,209, 31,137, + 68,130,114,245,128,199, 63,111,209,170,182,135, 85, 6,189, 94,109, 16, 8,200,104,119,183,230,135,174, 93,253,188,108,232, 16, + 32,163,245,122,181, 1, 0, 24,150,131, 82, 77,195, 66, 66, 34, 33,189, 16, 17,241,217,149, 81, 85,152,162, 41,180,240,134,164, +109, 2, 56,142,131,222,192, 64, 87,144,142, 21,103,212,136, 74,209, 66,175,202,131,222, 80,236,134,229,228,228, 36,184,112,225, +220,172,224,224, 63,167,254,254,251,239, 84,138,173,109,100, 33,208,170, 50, 78,123,123, 95,107, 86, 44, 62,180,101,235, 98, 11, +142,138, 71,108,146, 10, 13, 60,219,194,201,206, 11,233,217, 42,220,140, 60,139,232,167, 65,168,231,230,131,153, 95,244,149,126, +247,195,190,131, 34,186,174,119,126,254, 11,101, 85,233, 44,237, 69,109, 59, 31, 11, 58, 55, 30, 76, 78, 28,152,194,180, 87, 78, +176,146,123,227,157,110, 30,144,123,213,151,140,155,185,124, 44, 80, 65,104,149,231,204, 32, 8,114, 11, 73, 18, 83, 9,130, 64, +243,230, 45, 82,214,174, 93, 91, 89, 40,112, 67,243,230, 45, 82, 40,138,244, 44,126,177,147,155, 57,142,205,168, 33,157, 21, 68, +141, 88, 44,153, 91,108,246,119, 75, 62,115,230,140, 97,248,240,225, 88,179,102,141,120,222,188,121, 11, 41,138,154, 80,201,240, + 94, 5,206, 33,128,183, 93,253,250,189,191,191,121,147, 19, 26,141, 68,238,189,123,202,124,133,130, 78, 47, 44, 20, 31,142,142, +238,255,233,156, 57, 98, 47, 47, 47,220, 8, 10,114,204, 82,169,184,124,157, 78,147,159,159,207,209, 52,125,175, 10,206, 5,114, +185,179,108,199,142, 29,126, 83,166, 76,121,168, 80, 40, 22, 0,128,155,155,219, 10, 0, 77, 0, 36,148, 59,134,173, 91, 15,166, + 78,156, 56, 49, 54, 51, 51,115, 65,117,233, 44,135,166,206,114,103,217,254,109,123,158, 56, 88, 91,144,114, 79,119, 82,104,103, + 39,160,197, 22, 34, 22,208,212,243,170,111, 9,160,105, 21,215,190,204, 73, 88, 88, 88, 28, 59,117,234,148,179, 80, 40, 4,195, + 48,144,203,229,120,241,226, 5,242,243,243, 81, 88, 88,136,231,209, 81,168,235,229,133,111,230,207,115,155, 62,111,254, 49,181, + 90,221,250,165,198,236,213, 5,144,141,134, 87, 44,123,149,173, 98,240,242,176,151,137,229, 94, 30, 47,146,146,146, 96,101,101, +133,128,128, 0,171,155, 55,111, 94,175, 70,100,149, 95, 4,120, 68,135, 14, 29,172,247,237,219,135,214,173, 91,195,214,214, 22, + 33, 33, 33, 8, 11, 11,131,193, 96, 32,139,138,138, 96,101,101,133,149, 43, 87,194,219,219, 27,133,133,133, 72, 72, 72,112, 20, + 10,133, 78, 47, 69,180, 47,227, 12,185, 16,242, 93, 65,220,149, 69,233,196,249,190, 59,246, 31,196,196, 15, 71,194,149,139,191, +110, 91,159,248,174,247,192, 14, 75, 56,202, 43,208,210,186,185,125,195,128,129, 16,137,173, 48,125,238,114,196,134,159,182, 87, + 23, 62,249,140, 96,146,189,150,173, 61, 60,163,146,188, 19, 0, 72, 47, 47,175, 79, 15, 31, 62,108, 93,102,122,161,168,178, 53, + 15,203, 47, 2, 95,205,130,239, 53,222, 79,130, 32,240,226,197, 11, 56, 59, 59,195,202,202,170,108, 1,241,168,168, 40,220,185, +115, 7,165,171, 81, 84,193, 57, 58, 56, 56,216,203,210,210,178,194, 9, 28,199, 33, 59, 59, 27, 52, 77, 67, 38,147,129, 97, 24, + 24, 12, 6, 24,141, 70,104,181, 90,171, 38, 77,154, 76, 51, 26,141,119, 43,227,100, 89,246,203, 17, 35, 70,116,184,123,247,174, +239,134, 13, 27,160,215,235,127, 76, 79, 79,199, 7, 31,124, 0,150,101,209,163, 71,143,119, 57,142,139, 89,184,112, 33, 0, 96, +214,172, 89, 70,149, 74, 53,165, 54,121, 47, 65,147,119,222,121,199,247,242,229,203,232,212,169, 19,116, 58, 29,214,172, 89, 99, +179,117,235, 86,155, 61,123,246,200,231,206,157,251, 91, 86, 86, 86,159, 26, 56, 9, 0, 63,186,186,186, 78,237,218,181,171, 69, +201, 26,166,216,189,123, 55,190,249,230,155, 3, 0, 22,158, 59,119,110,233,201,147, 39,199,126,250,233,167,248,230,155,111,102, +230,231,231,239,172,138,243,249,243,231,144,203,229,176,177,177, 41,126, 89, 26, 12,120,244,232, 17, 46, 93,186,132,198,141, 27, +155,146,167,170,210,233, 51,116,232,208,223,246,239,223,111,157,156,156,140,107,215,174,161,110,221,186, 80,171,213,166,172, 13, + 27,252, 23, 52,216, 85,114,106, 52, 26,109, 82, 82,146,213,170, 85,171,224,230,230, 6, 31, 31, 31, 72,165, 82, 16, 4, 1,163, +209, 88, 93, 56,129, 26,211,217,165, 11, 4,217,169,246,131,108,237,236, 63,227, 56, 78, 80, 80,144,183,205,128,252, 35,241,241, +208,255,141,121,255, 47,163, 21,128,135,168,184,230,161,162, 76,104, 5, 5, 5,113,129,129,129, 68,233,222,195, 3,202,236,108, +251, 88,103,215,102, 7,157, 93,155,150,172,251, 69, 70, 83,148,125,172,139,139, 90, 9, 0, 6,154,195,173,232,124, 60,121,150, +142,176,103,233,176,148,152,102,124,209, 25,232, 98,143, 85,142,131,182,232,127,157, 86,131, 58, 15, 58, 67,177,187,135, 94,167, + 70, 65, 86, 36, 49,124, 72, 47,233,212,169,147,225,230,230, 33,175,138,207, 32,145,206,156, 62,171,191,157,131,157, 16, 65, 55, +207,227,221,198, 67, 32,149, 8,145, 83,160, 5, 8,224,105,252, 37,128,181, 70,120,108, 18,218, 53,149,161, 79,111,127,171,227, + 71, 98,230, 0, 88,108, 74,122,233,148,123, 16, 53,236, 7, 33, 99,132, 49, 59, 6,108,126, 34, 96,233, 10, 13, 97,133, 28, 69, + 34,162,175, 31, 53,169,207,200,178,236,103, 78, 78, 78,249, 11, 23, 46,236,218,160, 65, 3,195,180,105,211, 30, 39, 38, 38,126, +249, 82,111,229,167,205,155, 55,227,217,179,103,169,223,127,255,125, 72,118,118,246, 34, 51, 11,122, 62,199, 97, 93,201, 80, 92, +246,137, 19, 39,222,185,122,245,234,204,117,235,214,185,124,254,249,231,226,207, 63,255,252, 19, 0,223, 86, 55, 92,168,148, 72, +122,126,127,237, 26, 71,167,164,232,254,248,229, 23,241,166, 91,183, 22, 26, 88,214,221,201,217,153,104,223,174,157, 74, 70,146, +217, 57, 25, 25,180,220,215,151,122,113,233,146, 35,103, 97,145,118,238,220, 57,101, 81, 81, 81,149, 75,231, 80, 20,165,174,108, +184,176, 50,184,185,185,233, 43,243,225,170,166, 65, 84,178, 28,103,176,171, 87,143,235,221,227,189, 6,207, 98,226,227,165,118, +118, 84,195, 6,117, 27, 69, 68,191,184,199, 49,140,150, 32, 8,165, 73, 99, 37, 20, 53,114,221,186,117,205,108,108,108,192,178, + 44,108,109,109,145,149,149, 5,189, 94, 15,165, 82, 9,125, 97, 1,244, 5, 5, 8, 75,124,129, 14, 93,187,226,255,216,187,234, +240, 40,174,246,123,102,125, 55,187,113, 23, 8, 16, 8, 16, 8, 4,183, 64, 8, 78, 9, 20,247,162,133, 82,130, 67, 9, 80,138, + 20, 8, 45,238, 78,113,183, 18, 92,131, 4,143, 19, 72, 32, 46, 27,247,245, 29,249,253, 17,105, 8,145, 77,160,223,239,251,218, + 61,207,179,207,202,204,156,189,115,239,157,185,103,222,247,189,239, 29,209,175,143,203,177,203,127,142,162, 40,234,116,149,254, +188,150,173, 75, 45, 89,171,235,153,255,229, 11, 74,204, 45, 21, 93,191,181,118, 6, 79, 34, 65,239,249, 62, 95,114,161, 7, 94, +187,118,237,250,208,161, 67,191, 89,184,112, 33, 75, 42,149,222,140,141,141,237, 2,224,109, 85, 7, 73, 36,146,134,153,153,153, + 40, 44, 44,132,177,177, 49,182,110,221, 10,107,107,107,200,229,114,188,122,245,138,113,112,112, 32, 30, 62,124, 8, 7, 7, 7, +100,101,101, 65,163,209, 64,161, 80,164,170,213,234, 74,221,229,197,238,193,254,243,250,225,198,251, 55, 71,187,218, 19, 49,175, + 70, 46,240,248,240, 62,244, 93,194,237, 59, 79,127, 37,149,194,196,220,164,187,139, 27,180, 11,180,152,185,104, 21,118,110, 88, +129,247, 47, 30,101, 91,215,205,223, 37, 34, 84, 71,170, 42,175, 76, 38, 83,190,123,247,206, 48, 56, 56, 24, 4, 65,192,216,216, + 24, 6, 6, 6, 21,138,173, 90,128, 85,214, 2, 37,147,201,192,227,241, 96,110,110,142,131, 7, 15,150, 14,188,245,235,215,175, +138, 99, 95,239,222,189, 71,213,173, 91,215,176,236,143,237,218,181,195,244,233,211,177,103,207, 30, 4, 4, 4,124,178,158,102, +106,106,170, 84,171,213, 86,117,222,185,105,105,105,253,134, 12, 25,242,230,241,227,199, 70, 7, 15, 30, 4, 73,146, 21,190, 14, + 28, 56,128,231,207,159, 47, 7,240,174,150,253,168,233,176, 97,195, 30,157, 56,113,194, 36, 35, 35, 3, 37,125, 67, 38,147,129, +162, 40, 52,105,210,132, 32, 73,178,186,184, 55, 22,155,205,190,188, 99,199,142,129,223,127,255, 61, 56, 28, 14,212,106, 53,118, +236,216,129,197,139, 23,167, 21, 63,148,106, 0, 44, 59,114,228,200,132, 65,131, 6,193,205,205,205,229,193,131,202, 35, 59, 10, + 11, 11, 81, 88, 88, 8, 46,151, 11, 27, 27, 27,172, 89,179, 6,106,117,209,109,165,113,227,198,165,151, 49,128,125,141, 27, 55, + 30, 24, 25, 25,185, 17, 69,177,107,159,193,198,198,102, 8,195, 48,211, 40,138, 42,232,218,181,171,249,169, 83,167, 12,147,147, +147,241,230,205, 27, 44, 95,190, 60,135,166,105,138,166,105, 66,161, 80,196, 88, 89, 89,189, 17, 8, 4, 34,185, 92,158,157,149, +149,181, 14,192,205,255,175,145,156, 32, 8,130,203,229, 98,202,148, 41,224,112, 56, 16,137, 68, 80, 42,149,208,106,181,165, 98, + 30, 53,116, 75, 55,106, 36, 49,231,128,247,189,169, 97,179,185, 35,230,120, 89,218,218,217,195,196, 72,128,136,136,183, 93,238, +223,187,179,131,207,121,191,151, 86,107,247,190,143,203,251,219, 23,187, 47,175, 69,254, 71,133,214,103,107, 30,114, 42,110,204, + 17, 20,195,156,203, 76, 78,230,107,248,124,131,200, 18, 43,151,181,181, 60,159, 32, 70, 80,150,205,191, 5,169,209, 22,223, 40, +152,226,151,142, 66, 75, 75,225,195,251, 48, 60,190,253, 39, 44,228,201,200,140,105, 5,240, 90, 64,173,200,131, 82,173, 41, 22, + 37, 20,130,223,220, 67,126, 94, 54, 92,219,122, 1, 44,214,243,202,248,140,205, 9,175,206,109, 90,178, 63, 36,132,161, 93,227, +225,112,114,232,138,120,105, 62,114, 11, 85,200,201, 87,162,149,171, 15, 50,114, 20,200,151, 43,241,246,195, 49,216,219, 57,177, + 8, 78,116, 79, 93,133,150,234,237, 69,168,222, 93, 1,207,177, 11,248, 77, 6,129,237,232,142,132,144, 7, 8,190,177, 5, 73, +225, 79,192,208, 20,108, 27,183,215,245, 34,217,113,243,230,205,246, 93,186,116,225,244,234,213,203,237,250,245,235,110, 82,169, + 52,184, 88, 96,184,245,234,213,203,205,210,210, 18,219,182,109, 83, 16, 4,177,163,150,141, 93,106, 1, 75, 79, 79,127, 9, 96, +237,197,139, 23,119, 76,159, 62, 29, 86, 86, 86, 45, 82, 82, 82, 42, 61, 48,131,203,117,155,184,110, 29,195,101,179,153,211, 59, +119,242, 86,221,188,185,233,143, 35, 71,120, 61, 60, 61, 9,134, 97, 16, 20, 20,100,240,219,206,157, 6, 99,191,253, 54, 46, 62, + 61,157,244, 15, 8,208, 72,147,146, 10,210,101,178, 85, 82,169, 52,245,255,163,103,107,181,218,103, 49,177, 49,246,109, 59,180, +178, 12,140,136, 9,239,219,163,115,103, 22,139,197,122, 31, 29, 31, 96,105,105,100,112,231,246, 29,141, 86,171,125,166, 11,151, + 64, 32,240,234,209,163, 7, 39, 39, 39, 7,118,118,118,200,200,200, 64,114,114,114,145,197, 33, 47, 7,154,188, 60,104,243,115, + 65,201, 10, 17,243,234, 37, 90, 57, 53, 16,156, 19, 8,188,228,114,121,149, 66,171,228, 41,179,162,133,174, 75,126,227, 27, 26, +130, 47,145,128,168,185,219,240, 91, 19, 19,147,197,185,185,185,215, 1,172,209,104, 52,222,139, 23, 47,110,183,125,251,118,139, +181,107,215, 26, 77,155, 54,237, 92, 97, 97, 97, 43, 20, 45,170, 90,217, 0,246,145, 36, 73,115, 0,214,247,238,221,131,149,149, + 21,242,242,242, 74, 44, 45,106,185, 92, 46,204,202,202,130, 74,165,130, 90,173,134,145,145, 17, 94,191,126,157, 77,146,228,213, +234, 10,103,212,144, 88,163,210, 68,252,108,238, 34, 78,209,144,166, 30,233,217,116,206,202, 77,210,213, 0, 54,245,115,114, 58, +160,161, 31,197, 68,133, 93, 53,141,125,245, 48, 59, 37, 74,230,116,240,122, 76, 85, 49, 90, 12, 0,154, 32, 8,166,113,227,198, +200,200,200, 0,155,205,134,129,129, 1, 36, 18, 9,150, 44, 89,130, 29, 59,118,212, 70,104, 9,197, 98,241, 58, 22,139, 53,138, +197, 98, 89, 82, 20, 5, 31, 31, 31, 12, 28, 56, 16,124, 62, 31, 26,141,166,212,162, 89, 98,165,170,198,210, 17,244,252,249,115, +163,231,207, 63,185,109,121, 90, 88, 88,220, 87,169, 84,136,142,142,198,229,203,151,187, 3,240,175, 97, 91, 71, 7, 5, 5,245, +115,119,119, 63,218,166, 77,155,134, 12,195,160, 69,139, 22, 24, 61,122, 52,142, 29, 59,134,224,224, 96,228,229,229,209,119,238, +220,249, 3,192,198,154,142,225,197,245,219,100,216,176, 97, 79, 78,158, 60,105,154,149,149, 5,133, 66, 1,153, 76,134,115,231, +206,161, 75,151, 46,176,176,176,192,137, 19, 39, 72,134, 97,170,106,123, 22,139,197, 58,184,119,239,222,129, 83,167, 78,197,174, + 93,187,112,250,244,105, 12, 26, 52, 8,163, 70,141, 66, 70, 70,134,245,134, 13, 27, 38, 20,187, 9, 87,140, 30, 61, 26,133,133, +133,120,245,234, 85,132,142,215, 60,114,115,115,145,155,155, 11,145, 72, 84,246, 26, 35, 0, 28,219,178,101,203,152,185,115,231, +194,201,201,105, 69, 76, 76,204, 22, 84, 48, 75,148,166,233, 31,146,147,147, 77, 57, 28,142, 57, 73,146, 72, 76, 76,196,235,215, +175, 49,115,230,204,236,236,236,236,233, 0,226, 1, 44,155, 50,101,202,154,249,243,231,151,246,165,249,243,231,251, 93,191,126, +189,223,127,218,154,211,184,177, 73,115, 62, 91, 48, 39,167,128,109,158,147,147, 83,122,239, 80,171,213, 80,169, 84,159, 88,178, +120, 60,174,121,187, 86,117,175, 41,228, 5, 75,223, 70,229, 86,186, 64,186, 75, 67,227,150, 6, 98,227,185, 93,186,246, 24,215, +167,223, 96, 54,169,213,226,214,173,171, 56,116,104, 55, 60,221, 27,195,169, 81, 11,204,154, 61,199, 88,165, 38,125,238,220,185, +185,216,228,249,227,155, 5,249,185, 75,170,226,252,151,227, 90,177,184,186, 86,161,235,176, 34, 5, 89,156,194, 33,167,248,171, +133,169,169,233, 78,138,162, 60,141,140,140, 64,231, 70,226,237,235, 23,200,206,225, 66,165,160, 64, 51, 69, 98, 75, 39,225,162, + 82,227,209,173, 43,216,186,101, 19,178,178,178,224,222,173, 59, 10, 57,117, 80,183, 78, 93, 40, 21,242,226,139, 6,208,168,181, +176,180,118, 68, 96, 96,176, 54, 95, 38,171,244,134,196, 19,106, 92,234, 90, 55,134, 74,211, 9, 66, 62, 31,121, 5,106,228, 20, +139,172, 19,231, 71, 66, 37, 87,128, 84,107, 64,170,181,176,172, 59, 12, 77,173,123,128,166,174, 54,175, 81,245,209, 20, 52,177, +143,160,137,125, 4, 81,167,217,248,211,119, 76,185,129, 84,183,117,119, 51, 50, 50,210,195,195,195,175, 6, 5, 5, 13, 25, 57, +114, 36, 30, 60,120, 48, 13,192,140, 98,247,205,180,145, 35, 71, 34, 40, 40, 8,225,225,225, 87, 51, 50, 50,210,191, 70,203,243, +249,124,133, 74, 85, 52,198, 26, 24, 24, 8,171,217,215,190,221,208,161,172,188,192,192,252, 45, 79,159,174, 56,112,240, 32,175, + 87,207,158,132,150, 36, 65, 83, 20, 26, 57, 59, 19,125,250,244, 17, 31, 59,123,214,156,173,213, 62, 95,228,237,125,111,207,248, +241, 5, 47,101, 50, 93, 3,205,235, 21,187, 12, 1,160, 94, 21,191,233, 12,149, 74,181,253,135,239, 39,245,242,127,244,164, 78, +221, 58,246, 70,183,238,248, 7, 11, 68,124,150, 83,253,134,236,156,188,108,206,234, 21, 75, 69, 42,149, 74, 87,209,234, 98, 97, + 97,129,212,212, 84,124,248,240, 1, 42,149, 10, 90,173, 22,180, 92, 6,117, 78, 46,212,121,217, 32,148, 10, 8, 40, 10,202,204, + 52,212,115,106, 0,252, 53, 35,177, 90, 87, 84, 69, 66,171,228, 93,104,100, 4,158, 88, 2, 22,151,171,243,226,232, 0,218,180, +111,223,254,236,133, 11, 23,120,147, 39, 79,238,112,247,238,221,157, 0,226,147,147,147,123, 46, 95,190,252,229,206,157, 59, 5, +211,167, 79,111,178,113,227,198, 9, 0,246, 85, 70,162, 84, 42,207, 94,187,118,109,172,163,163,163,117,104,104, 40,148, 74, 37, +104,154, 70,255,254,253,129,162,216, 26, 0,192,251,247,239, 21, 74,165, 50, 61, 44, 44, 44, 63, 62, 62, 94, 3, 29,102, 9,174, +220, 46,125,150,159,250,104,168,181,141,253,115,161,168, 94,125,166, 48,112,200,188,225,246, 27,182,156, 79, 86,222,140,142, 46, +248,185,119,131,245,178,130,144,153, 38, 14,133,187,110,250,197,232, 18, 8, 95, 58,187,208,220,220, 28, 28, 14, 7, 92, 46, 23, + 60, 30, 15, 4, 65, 96,246,236,217,216,191,127,127,117,174,195, 79, 68,150,161,161, 97,248,170, 85,171, 28,166, 79,159,206, 19, + 10,133,200,201,201,193,137, 19, 39, 48,101,202, 20, 28, 58,116,168,194,248, 23, 29, 92, 74,229,173,165,115,199,143, 31, 15,181, + 90,141,209,163, 71,227,192,129, 3,115, 41,138,242,175,197, 37,253, 60, 56, 56,216, 57, 56, 56,216, 8,192,160, 81,163, 70, 29, + 25, 54,108, 24,252,253,253,113,245,234,213,238, 40,154,244,161, 0,224, 11,192,170,248,189,170,235, 83,108,109,109,189,155,166, +233, 65,150,150,150,193,141, 27, 55,118, 61,121,242,164, 73,122,122,122,201,228, 7,196,198,198,226,240,225,195,210,131, 7, 15, +230, 83, 20,101,206, 98,177,174,229,230,230, 46,169, 66,176, 29,220,178,101,203,164, 98,119, 32, 46, 92,184,192,108,218,180,137, + 88,190,124, 57,114,114,114,224,233,233,137,189,123,247,206, 41, 44, 44,116,219,180,105,211,247, 35, 70,140,192,234,213,171, 33, +147,201,182, 84,247,176, 82,133,248, 34, 0,116,222,178,101,139,227,220,185,115,113,225,194, 5,180,105,211, 70, 20, 19, 19,179, + 7,192,212,138,218,143, 97, 24,196,196,196, 64, 46,151,227,201,147, 39, 88,177, 98, 69, 78, 25,145, 53,103,198,140, 25,107,230, +204,153,131,117,235,214, 49,161,161,161,233,195,134, 13,179,222,191,127, 63,187, 81,163, 70,115,228,114,249,127, 76,104, 53,105, +100,182,190, 93,155,174,139,109,237, 27,225,196,201, 83,200,206,206, 46,173,147,146,122, 97, 24, 6, 5, 5, 5, 72, 77, 77,133, +177,145, 33, 54,108, 92,243,205,143,211, 38,213, 65, 81, 26,140,207, 77,150, 78,166, 27,135,141,154,188, 96,244,216, 73, 8, 13, +126,131, 99, 71,246, 33, 44, 52,168,148,143,212,106, 16, 25,241, 26,145, 17,175, 97,109,227,136, 62,189,186, 19, 99,198,140,233, + 63,126,236, 40, 75, 0,127, 91,234,136,255, 97,107, 22,240,121, 30,173,253,159, 8,173,106,204,117, 22,166,166,166,225,103,206, +156, 49,119,119,119,103,147, 36,137,155,183,110, 97,230,140,239, 48, 97,188, 15, 52, 48, 5,169,230,129,230, 9,117, 42,137, 66, + 33, 7, 3, 6, 50,153, 12, 1, 1, 1, 96,104, 18,199,246,111, 2,195,208,165, 66, 11, 96,160,214,104, 96, 95,183, 9,118, 31, + 88, 75,130,203,125, 9,109,197,169,107,242,179,216,148,150,100,144,156,158,128, 4,105, 24,140, 13,235,130,195,173,139,172, 92, + 57, 56, 44, 27,104,149,239, 65, 21, 31, 43,151, 37, 65,161,249,178,246,163, 42,176,158, 50, 53,184,233, 42, 20,138,227,199,143, + 31,255,102,243,230,205,252, 1, 3, 6, 52, 62,127,254,124,103, 0, 24, 48, 96, 64, 99, 35, 35, 35, 28, 63,126, 92,173, 80, 40, +142,127, 69,139, 79,143,246,237,219, 35, 39, 39, 7,177,177,177,193, 85,158,155, 90,109, 46,177,178, 98,167, 63,120,160,205,200, +201,169,211,163, 71, 15, 66, 75,146, 96, 17, 4,178,243,242, 16, 31, 23, 7, 19, 19, 19, 34,252,253,123,201,142, 89,179, 46, 53, +118,117,229,148,204, 72,212, 5, 87,175, 94, 53, 64, 81, 92, 86,149,191,213, 16,178,244,180,212, 73,222,222,222,151,142, 31, 63, + 97,156,150,158, 22, 41,224,243, 73,137, 68,104, 55,126,220,143,156,220,220,220,177, 0, 10,117, 37,203,201,201, 65, 76, 76, 12, + 68, 34, 17,120, 92, 46,104,133, 28,148,172, 16,202,236, 12,176, 53,106,240, 41, 10,102, 6, 2,212,177,182, 70, 93, 75, 11,157, + 56, 63,220,191, 93, 26,248, 94,214, 93,184,161,189, 11,248, 98, 9,248,134, 18,252,232,247,176,248,105,148, 7, 44,255, 85, 23, + 90, 11,123,123,251, 63, 79,158, 60,201,203,200,200, 64, 80, 80, 80, 48,128, 60, 0,134, 0,232,136,136,136,187, 97, 97, 97, 94, +197,179,238,170,155, 45,182,233,226,197,139,189,221,221,221,201,250,245,235,139,211,211,211,235,228,228,228,208, 82,169,244, 19, +147,208,237,219,183, 5, 5, 5, 5, 50,154,166, 47, 21,139,172,106,243, 23,205, 27,110, 47, 12, 8,196,108,143,190,245, 90, 24, + 89,180, 68, 54, 25,216,226,121,176,116,246,188,225,246,219,183,156, 79, 86,138, 8,213, 17,130, 74,172,195, 17, 42,117, 13, 98, +102,128,162, 88,169,128,128, 0,196,199,199, 35, 38, 38,230, 19, 65, 53,109,218, 52, 28, 59,118, 76, 39,139,150, 88, 44, 94,183, +114,229, 74,135,185,115,231,242,202,136, 34,120,123,123, 35, 47, 47, 15, 7, 14, 28,128,183,183,119,141, 7,254,114,104,208,163, + 71,143, 1,182,182,182,200,202,202,130,141,141, 13,220,221,221, 7,250,251,251,215, 7, 16, 91,203,126,255, 99,223,190,125,215, +172, 90,181, 10, 90,173, 22, 83,166, 76, 65, 84, 84,212,217,168,168,168,173,117,235,214,157,253,211, 79, 63, 89, 91, 91, 91, 99, +228,200,145, 98,146, 36,135, 86, 70, 98,102,102,230,187,111,223,190,177, 3, 6, 12, 96,105, 52,154,110,247,239,223, 71, 92, 92, + 28,212,106, 53, 72,146,196,199,143, 31,225,237,237, 45, 45,158,221,248, 81,135,114, 77, 94,182,108,217,164,217,179,103,227,183, +223,126,195,202,149, 43,255, 48, 54, 54,118,109,213,170, 85,235,149, 43, 87, 98,209,162, 69,112,116,116,132,185,185,121,211,229, +203,151,187,204,159, 63, 31,219,183,111,199,138, 21, 43,254, 0,112,184, 54, 21, 65,211, 52,177,126,253,122,183, 45, 91,182,216, +150,136, 44, 22,139,133, 51,103,206, 32, 48, 48,112, 96,116,116,116, 69,199,236,181,177,177,153,102,107,107,203,191,115,231,142, +196,209,209, 17, 36, 73,106,139, 69,214,142,186,117,235,206,252,248,241, 35, 6, 12, 24,128,232,232,232,227, 0, 38, 24, 27, 27, +203,230,207,159,111, 32, 18,137,140,229,114, 57,254, 83, 96,179,136,137,235, 86, 47,194,171,192,247,184,120,145,135, 87,175, 94, +193,218,218, 26, 2,129, 0, 12,195, 64,165, 82, 33, 35, 35, 3, 90,141, 10, 45,154, 55,192,209,131,235,145,158,158, 1,176,136, + 74, 67,110, 8, 22, 49,110,210,119, 67,240,248,201, 45,236,217,179, 15,133,133,178, 74, 30,190,133,104,212,216, 5,246,118, 86, + 72, 76, 74, 4,193,130,197,223,121,174,255,227,174,195,210, 91, 16,116, 73,239, 80, 22, 38, 38, 38, 91, 79,159, 62,109,238,233, +233,201,150,201,100,160,105, 26, 93,221,221, 49,123,238, 92, 92, 61,121, 18,206, 29, 70,131, 80, 75, 64, 26,232, 54,235, 65,169, +144,163, 89,235,206, 24, 49,114, 20, 18,226,227,209,215,107, 24,148, 74,121,233, 19, 70,137, 69, 75,173,214,192,194,170, 14,110, +223,190,205,198,148, 41,111,177,163, 98,163, 4,165,225,135, 68,126, 84,118,201, 85, 4, 34,224,213, 49,104, 84, 26,180,104,177, + 28, 26,218, 28, 86, 14,211,160,213, 94, 70,126,198,253, 34, 55,134,185, 39,146, 18, 18,192, 98,243,194,107, 91,131,180, 44,227, +139,110,186,121,121,121,121, 49, 49, 49,231, 3, 2, 2,198, 13, 29, 58, 20,183,111,223,254, 30, 0,134, 14, 29,138,128,128, 0, +196,196,196,156,207,203,203,203,251, 26,173,109,107,107, 59,168,123,247,238,163,219,181,107, 7, 63, 63, 63, 48, 12,243, 88,167, + 11,155,203,101, 88, 44, 22,104,154, 6, 1, 32, 43, 55, 23, 81, 81, 81,200,202,204,132, 86,171,133,172,176,144,118,105,220,184, +144,161,105,195,154,148,167,236, 12, 67, 84, 48,235,176,228,183, 90,156,106,252,203,231, 79, 19, 10, 10, 11, 45, 77, 77, 76, 11, +248,124, 62,149,147,155,155,247, 54, 60, 84,173,227,224, 80,130,136,176,176, 48,215,148,148, 20, 36, 36, 36,128,148, 21,128,173, + 82,131,165,146,163,103,231, 78, 16,129,129, 16, 52,184,180, 22, 92, 54, 23, 5, 69,179,243,170,117,119, 80,101, 30, 18, 74, 68, + 22, 65, 16, 69,238, 66,177, 24,124,137,225, 39, 22, 46, 93,250,147, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, + 14, 14, 14, 77,237,236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55,160, 67, 29,144, 12,195, +244,121,252,248,241,130,167, 79,159,142, 16,139,197,196,172, 89,179, 56,253,251,247,135, 64, 32,128, 92, 46, 71, 78, 78, 14, 78, +157, 58,149, 73,211,116,201,164, 20,115, 3, 3,131,195, 4, 65,196,202,100,178,185,229, 9,143,110,110, 97,151,158, 77, 79, 97, + 10, 13,134,120,244,173,215,162, 71,223, 94,104,224,220, 3, 61,250, 38, 0,192,122, 51, 78,220,232,223,151,153, 92, 50, 49, 36, + 14,223,190,121,103,133,187, 71,143,101,139, 11, 31,172,249,109,127,110,181,241,116, 4, 65,128,166,233, 79,114, 7,149,223, 62, + 97,194, 4,156, 57,115,166,218,122,100,177, 88,163,166, 79,159,206, 43,103,121, 70,114,114, 50,188,188,188, 48,116,232,208, 79, +132,150,133,133, 5,108,108,108, 16, 23, 23, 7, 0, 89, 58,246,171,217,147, 39, 79, 38, 20, 10, 5,166, 78,157,138, 3, 7, 14, + 96,244,232,209,132,191,191,255,108, 0,115,107,218,217, 89, 44,214,134,159,126,250,105,129,183,183, 55,178,179,179,113,253,250, +117,244,239,223, 31,103,206,156,177,188,126,253,250, 58, 79, 79, 79,176,217,108,248,249,249,129, 36,201, 42,115,125,241,120,188, + 65, 3, 6, 12, 96, 37, 38, 38,130,199,227,161,109,219,182, 72, 74, 74,130, 92, 46, 71,114,114, 50,230,204,153,147,154,149,149, +213, 93,215,235,136,199,227,205,157, 61,123, 54, 78,159, 62, 13, 31, 31,159, 35, 0,166,230,229,229,141,120,250,244,233,233,111, +191,253, 22,201,201,201,184,116,233, 18, 86,172, 88, 65, 76,152, 48, 1,187,118,237,194,156, 57,115,254, 40,182, 58, 85,214,241, + 11,210,211,211,141, 27, 54,108,136,180,180, 52, 20, 22, 22,226,210,165, 75, 86, 55,110,220,168,111,111,111,111, 20, 19, 19, 67, +253,250,235,175,252,185,115,231, 98,235,214,173, 8, 10, 10,194,177, 99,199,208,163, 71, 15, 50, 58, 58,186, 66, 43, 89,113,202, +134, 75, 12,195,220, 17,139,197, 40, 40, 40, 40,185,238, 22,250,248,248,120,251,250, 22, 25,217, 83, 82, 82, 48,113,226,196,241, +247,238,221,163, 61, 61, 61, 13,120, 60, 30,148, 74,165,236, 63, 57,106,211, 20, 13,128, 70,253, 58, 18,220,186,122, 16,111,130, +163,241, 38, 56, 12,124, 65, 81, 16,188, 66, 33, 71,235, 22,141,208,161,109,123,164, 72,147,113,252,216, 65,152, 89,216, 87,121, + 31, 97, 24, 6, 60, 14, 5,151,198, 54, 56,121,108, 31,252,174,223,195,177,227,167, 74, 99,222, 56, 28, 46, 90,181,238,128,182, +109,221, 17, 29,243, 17, 7, 15,238,129,165, 85, 29,189,115,176,150, 40,117, 29,150,125, 47,167,252,123,184,187,187,179, 11, 11, + 11,161, 84, 42,145,154,154,138,184,184, 56,152,152,154, 32, 58, 37, 22,221, 13, 52, 72,165,243, 17, 17, 28, 78, 17,108,110, 80, +117,127, 56,192,163, 21,224,209, 10, 51, 39,143,174,226,145,149,129,216,200,162,200,117, 67,146, 31,176,125, 59, 89,153,208, 34, + 41,237,221, 91,119,238,183,159, 60, 97, 16,247,246,253, 3,208,170,105, 40,180,198,144, 41,213,144,105,184, 96, 25,247, 7, 50, +253,193,230, 8,208,209,173, 17, 46, 93,188,161, 97, 72,237, 61,157, 43,200,218, 21,100, 90, 88, 25,161,149, 94,206,239, 96,166, +179,235,176,116,224,165,168, 51, 39, 78,156, 24,220,169, 83, 39, 3, 79, 79,207,134,197, 3,167,230,196,137, 19,242,226,100,152, + 53,197, 39,217,224,109,108,108, 90,243,120,188,209,253,251,247,111, 61,105,210, 36,188,125,251, 22,199,143, 31,143,108,212,168, +209, 3,169,180,242, 25,217,108, 62, 63,171, 48, 61,221, 68, 82,191, 62,199,212,208, 48,229,198,245,235,142,189,122,247, 38, 18, + 18, 18,144,149,149, 5,165, 82,137,160,224, 96,134,203,102, 39, 17, 70, 70,172,247,129,129, 44, 54,159,159, 85,153,181,177, 2, +196, 85, 51,235,208,183,182,214,173, 58,182,166, 13, 87,248,252,208, 64,169, 82,186,230,231,231,147, 28, 46,151,235, 96, 99, 18, +255,254,163,238,247, 68,149, 74,229,119,247,238,221,193,189,122,245, 18, 68,134, 4,129,204,203,131, 58, 47, 7, 60,154,130, 89, +107, 55,176, 53, 42, 64,173,133,189, 11, 3,101,174, 1,252, 95,188,215,170, 84,170,106,147, 26,150, 8, 45, 86, 57, 97,192,151, + 72, 32, 48, 52,130, 64, 34, 41, 47, 24,170,123,146, 51,232,211,167, 79,207,142, 29, 59,130, 97, 24,236,223,191, 31, 26,141,134, +175,209,104,160, 86,171,161,209,104,144,159,159,143, 99,199,142, 97,247,238,221, 79, 1,252,161,195,233,147, 34,145,232, 91,130, + 32,172, 56, 28,142,220,210,210, 82,124,230,204,153,210,116, 19,173, 90,181,130,161,161, 33, 15,197, 73, 33,173,172,172,184,135, + 14, 29, 50, 25, 56,112,224,163, 10,221, 29, 45,154, 46,106, 64,154,122, 8, 69,245,234, 27, 89,180, 68, 3,231, 30, 0,128,222, + 94,147,209,160, 81, 93,228,103,134,212, 87, 42,226,134,240, 56, 57,166,225,219,147,223,138, 6,184, 78,146,165, 63,140, 66,197, +211,251, 43, 28, 40, 88, 44, 86,165,238, 88, 93, 68, 86,145,102, 97, 89,150,196,249, 0, 64, 86, 86, 22,164, 82, 41, 34, 34, 34, +208,164, 73, 19,100,103,103,195,222,222, 30,106,181, 26,237,218,181,131, 66,161,192,150, 45, 91,240,228,201,147,167, 0,230,232, +240, 31, 34,103,103,231,137,173, 91,183,198,245,235,215,241,234,213,171,228, 91,183,110,217,187,187,187,163,126,253,250,147, 98, + 99, 99,151, 22,187,250,116,133,216,221,221,125,150,183,183, 55,194,194,194,240,195, 15, 63,100, 37, 38, 38, 94, 58,123,246,236, +212, 21, 43, 86,176,250,246,237, 11,169, 84,138, 13, 27, 54, 80, 79,158, 60,217, 8, 96,117, 53,245,248, 46, 49, 49,209, 65,169, + 84, 34, 59, 59, 27, 36, 73, 66, 46,151,227,198,141, 27, 56,118,236, 88, 90,177,200,250,160,107,225,220,220,220,154,177, 88, 44, +156, 62,125, 26, 0,126, 70, 81,198,254, 75, 67,134, 12, 73,254,245,215, 95,237,151, 44, 89,130,239,191,255, 30, 26,141, 6,191, +253,246, 27,150, 44, 89,114,173, 88,100, 85,117, 19,221,108, 99, 99, 51,237,135, 31,126,104, 58,127,254,124, 4, 4, 4, 88,189, +126,253,186,109, 80, 80, 16,234,212,169,131,172,172, 44,142,185,185, 57,182,110,221,138,121,243,230, 93, 0,144,249,236,217,179, + 81, 49, 49, 49,190, 0, 54, 84, 35,218,247,218,219,219, 79, 99, 24,134,145,203,229,113, 62, 62, 62, 27,214,174, 93,139,121,243, +230, 33, 60, 60, 28,121,121,121, 48, 52, 52, 36,126,250,233,167,137, 63,255,252, 51,166, 76,153,194,200,100,178,221,255,233,129, +154, 97, 40,200,115,194, 64,169, 76,209,170, 69, 19,180,114,173,135, 91,247,223, 0, 0,122, 14,115,135, 92, 86,128, 35, 71,246, +227,195,135, 40,112,184, 92,152,152,217,232, 98, 9,132, 58,255, 29,114, 53, 82,244,242,108,139,254,125,187,227,143,163,103, 64, +106, 53,152, 58,121, 44,114,114,115,113,244,232, 65, 68,199,124, 4,135,203,133,185,197,223,159, 8,181, 42, 45,242, 63, 47,180, +116,112, 63,129,166,105, 36, 39, 39,227,245,235,215,136,141,141,133,129,129, 1, 20, 36, 69,239,185,251,132, 38, 8, 94, 18,205, + 48, 79, 25,178, 52, 75,241,231, 28, 20,149, 92, 38, 99,173,177,169,169, 41, 95,165, 82,128, 36,181,101, 70, 21, 2, 32, 0, 30, + 7,176,181,107,128,196,132, 68, 70,169, 84, 62,172,242, 9, 74,165,220,122,229,210, 57,239,206, 93,220, 45,250,247, 92,133, 75, +151,151, 35, 39, 63, 31, 74, 13, 23, 50,165, 6,114, 37, 96, 98,214, 24,237, 90,180, 68, 74, 74, 22, 66, 94,249, 23,114, 84,114, + 93, 2, 69,163,118, 44,155,236, 60,121,230, 34,136, 28,187, 64, 21,113, 9,116, 97, 90,169, 69, 75, 40, 49,133, 89, 93, 23,228, +202, 84, 56,119,239, 13, 80,131,165, 94,210,211,211,229,108, 54,251,132,183,183,247,111,111,222,188,118, 0,128, 55,111,222, 36, + 73,165,210,197,233,233,233, 53,181, 73,151,100,131, 39,132, 66,209,155, 70,141, 26,165,180,109,219,214,120,200,144, 33,176,176, +176, 64, 80, 80, 16,124,125,125,223,105, 52,154, 69,254,254,254, 85,186,122,212,106,117,242,155,203,151,141,186,127,247,157,201, +162,129, 3, 55,120,123,123,111, 93,189,122, 53,215,217,217,153,208,106, 52, 8, 13, 13,101, 78,158, 56,161,221,189,100,201, 22, +190, 88,204,121,121,229, 10,151, 84,169,146,255,191, 59,177,189,189,189,135,123,183,174, 46, 27, 55,111,135, 82, 81,136, 23, 1, +215,144,147,147,129,125,251, 47,186,216,219, 51, 30,201,201,201,254,186, 10,224,195,135, 15, 47,232,208,186,117,107,167, 58,117, + 16, 26, 31, 11, 62, 77,129, 71,146, 96,107, 84, 96,145, 74,212,113,101, 64,176, 12, 33, 77,205,199,218,211,231,195,116, 17,198, + 77,191, 25,132,213, 73,121, 32, 8, 2,155, 58,185,130,111, 40, 1, 79, 44,193,143,127,222, 47, 21, 6,126,171,151,128, 47,145, +160, 97, 7,157, 18,194,203, 31, 60,120,240, 58, 52, 52,180,157,171,171, 43, 22, 44, 88,128,184,184, 56,208, 52,141,180,180, 52, +165, 84, 42, 77,206,200,200,136, 67, 81,254,159, 3,213, 12, 98,101, 85,135,189,191,191,127,169,187,225,222,189,123,176,179,179, +131,177,177, 49,242,243,243, 49,125,250,116,147, 95,126,249, 5, 0,240,250,245,107,148, 21, 40,229, 17,250, 38, 98, 99,110, 1, +147,195, 20, 6, 14,201, 38, 3, 91,244,232,155,136,222, 94,147,112,199,239, 15,220,191,117, 23,102,156,184, 88,136, 11,110,100, +198,102,230, 39,201,156,247,186,180,153,202,150,202,110,237,157, 53, 40,146,109,107, 75,159, 91,178, 39, 63,183,170,178, 58, 59, + 59,195,218,218,186, 52, 70,139,195,225, 96,202,148, 41, 96, 24, 70, 87,145, 85, 60,214,208, 25, 74,165,210, 90, 40, 20, 34, 53, + 53, 21, 31, 63,126, 68,116,116,116,105,234, 0,154,166,181, 11, 23, 46,228,206,154, 53, 11,123,246,236,193,195,135, 15,159, 2, + 88, 5, 64,215,135,181,177, 35, 71,142, 52, 84,171,213, 56,117,234, 20, 9,192,235,220,185,115,175,219,181,107,199,233,215,175, +159,225,174, 93,187,198, 22,183,145,206, 66,203,200,200,136,167,209,104,176,107,215, 46, 36, 38, 38,122, 0,136,120,249,242,229, +222,145, 35, 71,238,118,117,117,109, 20, 22, 22, 22, 85, 88, 88,248, 35,128,144,234,200,210,210,210, 38,183,109,219,246, 28, 77, +211,142,189,122,245, 18,111,222,188,217,232,253,251,247,112,112,112, 0, 77,211,161,168,225, 18, 86, 81, 81, 81, 17, 82,169,212, +165,123,247,238,184,113,227,198,122,138,162,214, 1,248,109,198,140, 25,246,241,241,241,104,221,186, 53,204,204,204,240,254,253, +251, 2,169, 84,186, 27, 69, 75, 18, 85,103,194,141, 1,176,120,239,222,189, 45,247,238,221, 59,218,204,204,172, 99, 80, 80, 16, + 30, 63,126,140,141, 27, 55,226,151, 95,126, 65,215,174, 93,177, 96,193,130, 76, 0,163, 1,144, 49, 49, 49, 58,229,205, 43,177, +108, 1, 64,155, 54,109, 82,124,125,125, 49,117,234, 84,230,208,161, 67,219, 78,156, 56, 49,119,236,216,177,165, 99,224,196,137, + 19,153,227,199,143, 79, 68,209, 50, 76,255, 73,104, 53, 26, 53,140,204, 26,160, 48, 55, 1, 25,137, 1, 48, 48,180, 65,223, 30, +110,144, 43,212,184,122,229, 2, 66, 66,131,193, 98,177, 96,109, 83, 7, 38,166, 22,136,140,140, 2,170,158,109,172,213,104, 52, + 48, 52,173,135,194,188, 68,168,211,223, 64, 36,177,194,164,239,134, 64,174,208,224,226,165, 11, 8, 11, 11, 1,155,205,134,141, +109, 29, 24,155, 20,113, 18, 76,213, 51,152,245, 0, 80, 65, 62,173,106,133, 22,155,205,126,112,243,230,205,225, 29, 58,116,224, +124,248,240, 1, 31, 62, 20, 61,220,228,228,228,144, 4,168,243,233,161, 87,198, 84,113,120, 47, 20,207,206, 40,187,118,161,196, +208, 48,249,253,187, 8,235,156,236, 52, 4, 7, 62,193,135,200, 80,196, 70, 71, 64,163, 81,130,205, 98,129,197,102,161, 94,131, +230,120,242, 52, 64,173, 36,201,128,202, 56,139,202, 17, 93, 32,182,114, 30,181,102,245, 82,191,121,139, 86,138, 70, 12,223,131, +144,247,111, 81, 72,218,128, 97, 0, 27,115, 49, 90, 57,253,132,228,148, 12,156,254, 99,151,156,214,104,198,149,203,161,245, 25, + 39, 0, 88,103,162,217,238,253,127, 76, 57,112,236,228,202, 69,179,166, 91,127, 59,116, 28,248,217,111,161, 77,121,131, 6,237, +250,131, 16,152,224,250,237,251,240,127,253, 54,141,166,152,149,214, 89, 56, 20, 89, 13,103, 89,228,230,230, 62, 75, 77,149, 58, +148,201, 2,239, 32, 16, 8,171,155, 29, 87,158,243,147,140,243,108, 54,171,205,154, 53,107,180,214,214,214,154,176,176, 48,236, +217,179,135,126,243,230,205,109, 22,139,181, 67, 42,149, 42,171,227,180,212,106,131, 79,250,248, 52,107, 63,116, 40, 51,102,214, + 44, 57, 4,130,217, 27, 54,109,242,201,200,201,177, 99,104, 26,150,102,102, 73, 27,150, 44,241, 29, 62,114,100, 78,248,147, 39, +162,128,203,151, 69,124,146,124,163, 67, 57,191, 6, 42,229, 76, 78, 78,246,127,248,240, 49,142, 28,216, 12,141, 70, 5,105,114, + 60, 0, 32, 51, 43, 15,213,136,172,242,156,140, 92, 46, 31,250,243, 47,191, 60,255,121,222, 92,155,110, 61,123, 33, 33, 56, 8, +154,236, 12, 16, 90, 18, 92,130, 3, 89,186, 1,210,211, 10,177,248,248,217,244, 66,185,124,104, 5,131, 68,133,229, 44,177, 88, + 9,140, 12,193, 19, 75,192,151, 24,126, 98,197, 18, 26, 25,129, 47,150,128,195,231, 87, 20,192,253, 25,103, 97, 97,225,176,225, +195,135,135,188,124,249,210,116,234,212,169,232,220,185,115,160, 66,161,240, 4, 80, 80,219,250,164,105, 58,185, 91,183,110, 44, +130, 32, 36,227,198,141, 19,100,100,100,148,102, 86, 47, 44, 44,196,141, 27, 55,208,164, 73,209,172,254,240,240,112, 52,111,222, +188, 82,206,239, 23,135, 37, 3, 88, 61,111,184,253,134,231,193,210,217, 0,214, 55,104, 84, 7,247,111,221,197,227,251, 1, 62, + 29, 93,233,237,223,140,107,247,171,129,231,200, 69, 46,109,166,178, 37, 70,182, 56,122,241, 2, 59,226,205,193,181,114,121,104, + 67,236,185,180,176,178,114, 18, 4, 1,134, 97, 62, 75,229,192,102,179,113,226,196,137,154,158,251,217, 3, 7, 14,204,248,225, +135, 31,120, 82,169, 20,239,222,189,131, 76, 38,131, 80, 40,196,173, 91,183, 72, 0,187, 78,156, 56,113,235,196,137, 19,253, 80, + 52,155,232, 94, 77,250,167, 88, 44,246,238,219,183, 47,222,189,123,135, 87,175, 94, 93, 0, 16, 18, 24, 24,120,225,195,135, 15, +163,186,118,237,138, 63,254,248,195, 91,161, 80, 28,168, 9, 39, 77,211,101,115, 38,149,172,248, 16, 92, 88, 88,216, 49, 32, 32, +160,166,237, 46,205,202,202,234, 82, 44,172, 19,173,173,173,141,130,131,131, 81,183,110, 93,104, 52,154, 14, 53,237, 75,121,121, +121,155,119,236,216,113,104,242,228,201,248,245,215, 95,199,157, 61,123,118,220, 55,223,124,131, 1, 3, 6,224,240,225,195, 8, + 9, 9, 89, 15,221,150, 21,171,232,220, 67, 0,132, 88, 91, 91,207,172, 83,167, 14, 54,110,220,136,208,208, 80,223,213,171, 87, + 47, 9, 9, 9, 65,147, 38, 77, 4, 17, 17, 17,100,109,238, 33, 0, 96,100,100,100,164,213,106,113,249,242,229, 23, 0,230,141, + 27, 55,206,106,235,214,173,163, 37, 18, 9,178,179,179, 21, 97, 97, 97, 99, 1, 92,249, 79,223,235, 24,130, 88, 54,245,251,217, +123,191,159, 58, 86,216,182, 77, 43,200,243,147,160, 40, 76,131,188, 32, 21, 59, 14,220, 6, 65,176, 96,105,105, 11, 43, 27, 7, +196,199, 39,224,233,181,235,106,153, 92,177,149,175,165,215, 87,205, 57,171,136,179,117, 17,167, 92,150, 14, 69, 97,122, 41,167, +149,149, 93, 49,103, 60,158, 4, 92, 87, 42,100,178,205,106,134,248,253,111, 62,247,255,101,212,108,173,195,178,200,201,201,153, + 51,125,250,116,207,197,139, 23,155,147, 36,201, 54, 51, 51, 67,124,124, 60,121,254,252,249,236,194,194,194, 57,181, 41, 13,135, +203, 13,113,110,220,196,243,219,111,191, 37, 7, 13, 26,200, 27, 63,185, 31,199,210,202, 10,121,185, 89,136,124, 23,132,247,111, +223,192,185,137, 27, 86,172,222, 2,152,152, 84,187,144,100,241,178, 58, 94,171,126, 94,120,166,139, 71, 31,163, 38,205,221,120, +173, 26, 26, 67,163, 37,145,148,148,132, 43,151,131, 53, 97,175, 31,231,211,164,122,148, 60, 83,183, 37,120,252, 1, 18, 89,216, +231,106,165, 57,177,110,195,142, 5,187,246, 29, 89,180,120,246, 84,113, 87,247,222, 8,189,251, 7, 46,248,157,145, 41, 85,234, + 13, 60, 54, 54,133,101, 65, 30, 89,195, 58, 80, 42,149,154,242,227,169, 82,169,212,124,105, 75, 31, 62,124, 24,105,105,105,234, +184,184,184,155, 36, 73,158,173, 98,177,231,207,176, 3, 80, 15, 81,169,238,254,236,238,222,239,231, 91,183,132, 19,127,250, 73, + 61,110,252,248,133, 80,169, 52,224,243, 25,142, 88,204,130, 64,192, 13,127,242, 68,180,109,198, 12, 51, 66,173,190,115,164,138, +180, 1, 21,224,171,207, 58, 44,177,104,117,239,222, 21, 19,167,206,131,162,140, 69,235,217,171, 72,168, 52,208,217,162, 85,140, +132,184,196,196,142,179,151,253,124,113, 84,223,158, 46,174,142,245, 4,150,245,235, 65, 98, 99,131,172,140, 12, 60,121,245, 94, +187,250,204,197,176, 98,145,165, 83, 94, 25,154,166,139,130,220, 1,244,156,179, 24, 4,155, 13, 20,167,113, 40,153, 57, 84,191, + 93,103, 16, 28, 14, 40,134,134, 74,165,210, 37,232, 47,233,227,199,143,195,198,141, 27,119,207,207,207,143,213,183,111,223, 86, +151, 46, 93,162,191,164,239, 40, 20,138,142, 0, 32, 20, 10, 99, 77, 76, 76,236, 39, 79,158, 12,173, 86, 11,185, 92,142,188,188, + 60, 36, 37, 37,229, 78,158, 60, 89, 3, 0, 34,145,136, 63,124,248,112,163,234, 56,183,156, 79, 86,206, 27,110,191,221,140, 19, + 55, 58, 63, 51,164,190, 25, 39, 46,182,163, 43,189,125,203,249,100,165,145,157,108, 77,102,156,127,164, 84,118,107,239,209,139, + 23,216, 19,134, 12,163, 28, 36, 81, 62, 66, 43,230,124,117,188, 4, 65,124,150,156, 84, 71,145,245, 9, 10, 10, 10,150, 44, 95, +190,124, 64, 78, 78,142, 67,191,126,253,120, 46, 46, 46,120,254,252, 57,252,252,252,200,103,207,158, 37,202,100,178,165, 0,148, + 0,110,215,166, 78, 27, 55,110, 92,159,195,225,148,184,210,118, 22,255,188,243,210,165, 75,163,166, 78,157,138,122,245,234, 53, +139,136,136, 16,160, 6,215, 17,195, 48,165, 94,134,175, 9,130, 32,162,183,109,219,102,111, 99, 99, 67,220,184,113,131,100,179, +217,181,177,220, 28, 62,120,240, 96, 7,173, 86,251,253,180,105,211,224,225,225, 1,146, 36,113,252,248,113, 28, 60,120, 80, 87, +145, 85, 37, 34, 35, 35,223, 36, 38, 38,118, 91,184,112, 33, 54,110,220,184,100,225,194,133, 72, 76, 76, 68,100,100,100,208,151, +240,230,231,231, 43, 18, 18, 18, 12, 58,117,234,212, 54, 44, 44, 44,204,211,211,179,249,212,169, 83,177,126,253,122,230,225,195, +135,195, 1,220,248,255, 24,189,223,127,200, 62,198,165, 56,183, 86,175,217,252, 75, 67,167,250, 63, 76,153, 52,146,221,216,185, + 57,100,121, 73, 48,183,176,134, 67,157, 6,200, 72,207,196,205,155, 55,168,204,204,220,195, 20,139, 88,245,225, 67,118,202,151, +112,218, 59, 52, 64,122,122, 58,174, 95,191, 78,229,230,228,239,135,150,181, 58, 34, 62, 55, 13,122,232, 98,201,154,134, 42,178, +196, 87, 5, 11, 83, 83,211, 83, 70, 70, 70,105, 70, 70, 70,105,166,166,166,167, 0,157,102, 31,244, 42,115,119, 96,127,242, 26, + 62, 92, 8,161,176, 35, 56,156,249, 38,166,166, 55,140,141,141,179,186,119,239,174,222,187,119,175, 50, 34, 34,156, 78, 78, 78, +100,140,141,141,243, 74,247,175,136,179, 28, 76, 77,157, 12,197,182,205,127, 49,118,104,245, 68, 98,219,172, 64, 98,219,172,192, +216,193,237,169,216,182,217, 74, 83, 83, 39, 67,157,202, 89, 9, 26, 88,193,210,217, 2,187,154, 88, 18, 10,103, 11,236,106, 96, + 5, 75,157,207,189,106,183, 31, 69, 16,160, 80, 52, 13, 27,181,224, 44,225,160,217,108,246, 17, 7, 7, 7, 91,212, 44, 97,221, +103,156,227,129,122,227, 5,130,239,207,249,248, 76,140,125,248,112, 92,126, 76,204,152,188,232,232,145, 65,103,206,140,218, 57, +106,212,248, 49, 2,193,180,225,128,147,174,156,182,182,182,190,111,222,188,241,211,245, 85, 70,120,233, 92,159, 78, 13,236,111, +245,237,213,129,241,158, 62,148,241,158, 62,148,233,219,171, 3,227,212,192,254,214, 23,180, 17,193,102,179, 71, 27, 24, 24,156, + 18, 27, 24,132,138, 13, 12, 66, 13, 12, 12, 78,177,217,236,209,168, 58,134,234, 19, 78,115,115,243,215,214,214,214,105, 53,121, + 89, 88, 88, 4,214,160,156, 99,234,215,175,159,200, 98,177,182,212,240,154,174,138,211, 89, 36, 18, 69,139,197,226,164,178, 47, +145, 72, 84, 54, 49,148,185,129,129,193, 85,177, 88,188, 85, 23,206,223,151, 53,255,229,233,237,153, 33,191, 47,107,254, 75,249, +109,179, 6,155, 78,126,126,111, 85,214,172,193,166,147,117, 41,167,149,149,213, 67, 43, 43, 43,169,149,149,149,212,218,218,186, +202,151,133,133,197,107, 29, 56,133,134,134,134, 91, 13, 13, 13,211,196, 98, 49, 37,145, 72,210,196, 98,241, 22,148, 73,109, 81, +219,250,100,177, 88,235,155, 53,107,166,100,179,217,135,202,109,218,216,176, 97, 67, 37,135,195,217, 80, 67, 78,163,174, 93,187, + 82,193,193,193,140,135,135, 7, 3,192,244, 43,182,187,141,169,169,233, 13, 35, 35,163, 4, 67, 67,195, 29, 0,196,181,228, 36, + 0,140,182,183,183, 15,234,209,163,135,220,222,222, 62, 0,192,183, 95,177,156, 3, 6, 15, 30, 76, 39, 36, 36, 48, 12,195, 48, + 9, 9, 9,204,224,193,131,105, 20, 37,138,252,146,123,242,178, 25, 51,102, 48,207,158, 61, 99,158, 61,123,198, 4, 4, 4, 48, + 3, 6, 12,160, 1,124,247,133,247,121,124,173,115,119,105, 96,225,212,180,145,233,217,177,195,220,233,219, 87,182, 48, 43,150, +254,192,244,246,104,206, 52,105,104,122,209,217,217,220,249,107,112,254,178,116, 58,211,171, 91, 51,218,197,201,244,140, 75, 3, + 11,167,255,240,185,255,163,172, 90, 37, 15,210,127,119,192,217, 95,166,197, 79,197, 82,197,176,179,179, 67, 86, 86, 7, 33,135, +227, 46, 16, 8, 60, 89,108,246,131,236,140,140,185,197,143, 91,212,127,202, 84, 91,229,128,238, 4,126, 21, 75, 18,212,134,243, +147, 64,246, 90,114,214,132, 67, 39,206,202, 22,149,166, 85,170, 20,115,146,124,189, 3, 85,214,193, 39,156,246,246,246,223,211, + 52, 93, 95,215, 2,177, 88,172,216,228,228,228, 3,181,169,207, 70,141, 26, 49,197,238,109,226,107,182,251,223,209,151,254, 77, +156, 71, 55,183,176,107,210,162,233,162,208, 55, 17, 27,139,221,138,165, 88, 57,203,212,208,189, 71,247,229, 79,238, 63,252,117, +229,142,156,130,255,231,115,103, 65,199,152,182,175,192, 89,146, 36,180, 70,156, 92, 46,119,111,251,246,237,191,127,254,252,249, + 33,138,162,166,253, 75,251,231, 0, 54,155,189,176,113,227,198,173, 34, 35, 35,131, 40,138,218,136, 10, 18, 69,214,162,156, 75, +235,215,175,255, 35,143,199, 19, 20, 22, 22,230,164,164,164, 44, 7,112,246,191,173, 62, 93, 26,153,181,101,152,210,164,219,107, +223,125,204,126,249,213, 56, 25,154,162, 25,246,154,200,152,172,192,255,135,118,255,199,136,172, 98,161,181,255, 63,241,199,189, +244,156,122, 78, 61,167,158, 83,207,249,213, 57, 69,250,250,212,115,254, 3, 57,255, 81, 40,177,104,113,244, 85,161,135, 30,122, +232,241, 63, 7,133,190, 10,244,208,227,191, 14,101,173, 90,165,214, 44,162, 10, 85, 90, 19,147, 96,109,148,237, 93, 61,167,158, + 83,207,169,231,212,115,234, 57,245,156,255, 58,206,127,170,200, 42,235, 42,156,166,119, 29,234, 57,245,156,122, 78, 61,167,158, + 83,207,169,231,252,111,226,252, 95, 23, 90, 40, 39,180,244,174, 67, 61,254, 51,216, 62, 4,246, 0, 48,251, 18,146,255,142,253, +245,208, 67, 15, 61,244,208,227,255, 25,251, 81,137,235,240,191, 65,104,217, 1,232,136,162,133,111,223, 3,120, 12, 32,231, 11, +248, 44, 0,140, 36, 8, 98, 4, 0, 48, 12,115, 14, 69,179, 70, 50,117, 57, 88, 40, 20,166, 41,149, 74,171,226,207,233, 74,165, +178,236, 90, 6, 4, 62,159,205,198,148,121, 85,136,250,245,235,167,169, 84, 42, 43, 29,254, 62,143, 97,152, 16, 22,139, 21, 42, +145, 72,238, 71, 70, 70,250,213,228,196, 61, 61, 61, 39,178,217,236,181, 0, 64, 81,212,178, 7, 15, 30, 28,249, 27,219,173, 67, + 29, 59,155, 63, 52, 90, 13,153,150,145,189, 28,159, 39,242, 3, 0,236,242,130, 47, 65, 98, 81,241,231, 13, 51,253,170,206,163, + 83,211,253,171, 64, 91, 46,151,235,109,109,109,221, 63, 41, 41,233, 53,128,159,128,234,179, 26,215,169, 83,231, 59, 14,135, 51, +142,162, 40, 39, 54,155, 29, 77,146,228,137,196,196,196, 99,250,123,136, 30,122,232,161,135, 30, 58,136,173,207, 80, 35,161,213, +196, 28, 54, 12, 48, 26, 4,122,131,193, 29, 2, 56,253, 62, 11,169,186, 30,255, 77, 19,104,181,100,209,127,242, 88,160,110,124, +100,237,239,223,191,191,195,172, 89,179,208,185,115,103, 60,127,254,188,211,225,195,135, 39,159, 61,123, 54,132,166,233, 7, 0, +158, 3, 58,165, 82, 16,163, 40, 79,203,216,254,253,251,247, 90,187,118, 45,187,121,243,230, 80, 40, 20,120,248,240,161,251,134, + 13, 27,182, 62,125,250,244, 46,128,147,197,130,160,210, 5,240,148, 74,165, 85,201, 98,156, 4, 65, 88, 13, 31, 62,252,101, 89, +113, 85,188,190, 26,193, 48,204, 51,130, 32, 2, 40,138,122,126,254,252,249,196, 38, 64,135,233,245,121,231,231,198,106, 28,202, +115,170, 84, 42,171,203,191,175, 3, 71, 32,128,170, 32, 31,157, 38,253, 37,122,239,252,178, 8, 4, 77,130, 13, 38,199,115,205, +214, 16, 0,161, 41, 41, 41, 33, 30, 30, 30,177, 53,109, 97, 54,155,189,246,230,205,155,182, 12,195,160,111,223,190,107, 1,252, + 93, 66, 75,208,177,173,219,131,171, 23, 78, 9, 11,179,211,208,239,219, 81, 39,162, 18,211, 39, 2,184,240,137,104,234, 15,107, +130,192,162, 25,235, 78,178, 1, 96,247,210,177, 63,109,233,131,237,243,110, 35, 21,128,103,177,248, 1,128,223, 1, 60,216,213, + 31,214, 0, 22,207, 88,119,146, 0,128, 61, 75,199, 46,218,213, 31,219,102,222,168,113,218,138, 31, 39, 78,156,184,125,237,218, +181,108, 91, 91, 91, 36, 39, 39,247,107,214,172, 89,227,252,252,252,102,168, 34,136,184, 94,189,122,103,186,246, 24,216, 96,232, +136,209, 6,150, 22,166, 72,145,102, 26,157, 57,117,104, 58,251,217,195,254,113,113,113,163,244,247, 16, 61,244,208, 67, 15, 61, + 42, 65,237, 51,195,183,182,133, 72,166,193, 96, 14,155,248,174, 75,219,102, 61,199,124,211,149,213,204,165, 17,222,134, 71,244, +185,114,255,197, 6, 86, 64,248, 61,146, 98,142,137,121,184, 28, 40,173,122, 38,140,150, 4,231,246,229,147, 69, 35,225,228,177, +236,151, 47, 95, 54,106,211,166, 77,233,210, 48, 61,123,246, 68,207,158, 61,137,221,187,119,187,221,190,125,219,237,224,193,131, +154,123,247,238,253,129,170,243,163,120, 55,108,216,112,195,246,237,219, 5, 30, 30, 30, 16, 8, 4,165, 27, 36, 18, 9, 6, 14, + 28,136,129, 3, 7,178, 83, 82, 82,250, 94,189,122,181,239,239,191,255,174,142,143,143, 95,136,191,178, 52, 87,137,229,203,151, +183,173,224,231,155, 4, 65,124, 36, 73, 50,200,205,205, 45,177, 49,208,104,250, 55,157,239,252,216,197, 89, 60,119,201,225, 10, +121, 56,124, 62,142, 78, 44, 26,171,203, 10,173,216,251, 55, 32, 49, 50,204, 50, 48, 52, 12, 1, 16, 10, 32,132, 97,152,208,232, +232,232,136,166,128, 91, 71, 83,214, 31,135,114,232,150, 53, 16, 91, 72, 76, 76,132,177,177,177,200,195,195, 67, 74, 16,196,202, +135, 15, 31,126,237,128,188, 14, 43, 23,253,200,203,137, 11, 65,234,187,103,152, 63,194,221, 96,238,142, 63,127, 85,170,181, 23, +170, 58,136, 32, 88,172,223, 3,104, 31, 20, 45,198,187, 60, 43, 43,203, 3, 0,204,205,205,249, 0, 30,108,121,129,111,230,117, + 33,190, 36,183, 27,143,205,102,239, 58,124,248,240,212,239,190,251,174,104,233,136, 39, 79, 32,145, 72,176,122,245,234,122, 11, + 22, 44,240, 37, 73,114, 78,101,150,172,174, 61, 6, 54,216,182,241,215,102, 5,217,121,170,125,187,206,190,178,115,109,194,154, +225,189,192,112,155, 70,101, 67, 81,212,119,122,203,150, 30,122,232,161,135, 30, 53,177,102, 85, 43,180, 26, 91,224, 72,107, 87, +231,145, 99, 6,184, 11, 90,184, 54, 7, 79,240, 87,234,150, 54,109,219,162, 77,219,182, 44,159,194,130,222, 47, 95,189,233,125, +254,246,115,149, 92, 27,127, 54, 50, 19, 19,117, 45, 85,201,162,180,107,191,181,238, 33,203, 77, 23, 2,128,216,196, 74,185,244, +114,234,253, 46, 93,186,192,193,193,129,119,239,222,189, 41,213, 8,173,165,239,223,191, 23,176,217, 85,231, 67,181,179,179,195, +240,225,195,209,164, 73, 19,126,247,238,221,151, 86, 38,180,132, 66, 97, 58, 65, 16, 86, 0, 96,102,102, 70,173, 92,185, 50,136, + 41, 2, 0, 48, 12,195, 60, 99,177, 88,207,105,154,126,241,231,159,127, 38, 53, 3,172,250,181,105,242,248,199,241,195, 13,152, +243, 91, 43, 21, 9,202,252,252, 10,127, 55,144,136, 51, 68, 98,113,136,192, 64, 24,138,162,181,188, 66, 29, 28, 28, 34,154, 1, + 14,237,155,212,191,189,123,222, 88,195, 67,211,126,173,182, 46, 91,183,110,221,184,101,203,150, 66,138,162, 32,147,201,176,103, +207, 30, 99,145, 72,100,220,191,127,255, 21,101, 59,128, 11,208, 98,152, 29,123,218,170, 20,106,102, 45, 58,146, 73,215, 78,109, +227,134, 15,236,111,212,182, 99, 87, 68, 61, 56,142,236,236, 2,228,229, 22,130,166,233,207,242,250,204,188,129,180, 93, 94,216, +176,123,201,216,197, 4,139, 69,184, 13,249, 9,131,108,242,102,239,221,187, 55, 28, 0,151,207,231,151,237,135,118, 34,123,215, + 13,141,250,116,197,158,101,227,193,208, 52, 3, 96, 67, 13,172, 89, 86,134,134,134, 87,110,223,190,221,161, 93,187,118,120,254, +252, 57, 98, 98, 98,240,227,143, 63,170,103,206,156,201,155, 48, 97, 2, 49,127,254,252, 89,191,255,254,251,121, 0, 79, 63,187, + 16, 56,156,113,223, 14, 29,197, 47,204,205, 87,170, 85, 26,181,153,133, 9,173,146, 41,229,153, 57,249,202, 81, 99,191, 87,135, + 7,190, 24, 7,224, 51,161,245,133,245,169,135, 30,122,232,161,135, 14, 96, 24,166, 29, 0, 75, 0, 25, 4, 65,188, 42,251,189, +120,151,146,213, 90,202,127,207, 68,145, 87,202,188, 12, 93, 38,138,194,125, 44, 1, 80, 0, 94, 18, 4,145,243,133, 69,172,122, +233, 29, 63, 63, 63,166,236,123, 25,161,197, 48, 12,195,104,179, 62, 50,170,200, 27,140,252,213,129,207, 94,138,240, 11,140,244, +229, 89,230,197,201, 95,152,198, 22, 85,175,194,254, 77, 19,104,199,182, 4, 51,163, 29,152, 57,221, 77,148, 47, 95,190,188, 71, +211,180,159, 79, 87, 48,204,219,147, 12,243,246, 36, 51,175, 19,152,243,231,207,223,244,245,245,245, 59,118,236,152, 31,128,234, +226,148,210, 10, 94, 5, 48, 47,172,192, 84,134,247,239,223, 51,123,247,238,101,150, 44, 89,194, 28, 58,116,136, 65, 53, 25,212, +251,246,237,251, 48, 44, 44,140,153, 48, 97, 66, 16,170, 72, 12,232, 2,136,199,213,179,121,167, 58,179, 85,163,254,174, 5,147, +211, 77, 88,225,249,219,218,218,126, 82,158,245,206, 54,204,206,246,206,204,145,222,109, 82, 25,134,185,201, 48,204,122,134, 97, + 70, 49, 12,211, 4, 0, 90, 3, 70,223,218,154,127, 80,158,221,166, 80, 79,235, 88,237,186,119,173, 91,183,110,188,112,225,194, +108,181, 90,205,196,198,198, 50,251,246,237, 99,238,220,185,195, 92,190,124,153,113,119,119, 79, 41, 83, 94,235,201, 77, 28,211, +212, 7, 87,169,106,211,139,184,108,246,206, 87,119,206, 51, 31, 30,159, 99, 94,158,246,101, 78,252, 60,134,153,245,109, 7,141, +145, 72,160, 4,208,163,178,227,102,118, 65,163, 38,245, 44, 35,227,227,227, 25,141, 70,195, 76,154, 52,137,233,219,183, 47,211, +167, 79, 31,166, 87,175, 94, 76,207,158, 61,153, 30, 61,122, 48,247,239,223,103, 82, 82, 82,152, 94, 93,219,200,188, 92,208,182, + 6, 69,115,117,116,116, 76,141,141,141,101, 52, 26, 13,115,239,222, 61,230,248,241,227,204,189,123,247, 24, 31, 31, 31, 6,192, +145, 25, 51,102, 40,114,114,114,152,190,125,251, 38,161,130,172,241,142,142,142, 17, 97,145,137,137, 91,214, 29,184,127,116,231, +169,251, 23,207,223,185,127,229,214,203,107,151,111,189, 58,251, 34, 56,250,178,163,163, 99, 68, 5,237,255, 69,245,169,135, 30, +122,232,161, 71,245, 90,164, 88,104, 13, 40, 54,118, 12, 96, 24,166, 87,185,239, 3,138,133,211,103,223,125,124,124,150,148,253, + 94,178,143,143,143,207, 18, 0, 76,167, 78,157, 78, 49, 12,211,232, 43, 20,127, 90,249, 87,141,102, 29,146, 73, 47,193,115,238, + 15, 46,165,133, 54,243, 61,232,220,120, 64,108, 3, 5, 33, 65,150, 52, 30,239, 30, 95,168,122, 33,137, 98, 92,127, 15, 46,128, +123, 17, 17, 17,120,247,238, 29, 18, 19, 19, 97, 96, 96,240,217,126, 79,158, 60,129, 72, 36,130,173,173,173,110, 74, 87,253,233, + 56, 23,210,198, 17,146, 78, 30,200, 28,243, 3,238,221,187,135,244,244,116,240,120, 60,240,249,124,144, 36, 89, 45, 31,139, 85, +180,226,111,137, 21,171,162,125, 60, 0,142,192, 76,114,117,247,138, 57,245, 89,207,252,184,138,132, 15, 72, 81, 82,186, 89,242, + 36, 98, 24,136, 13,164, 34,145, 65, 8,138,221,133, 0, 66, 9,130,136,106, 13,112,197, 18,225,213, 63,214,204,183, 97, 7,222, + 19, 42, 62,132, 84,200,209,171, 87,175,233, 0, 86, 48, 12,147,219,178,101, 75,235,181,107,215,154, 38, 39, 39,227,237,219,183, + 56,123,246,108, 6, 89,116,162, 4,195, 48,171, 0,160, 35, 32, 52,177, 52,185,181,243,151, 57,134,120,112,134, 95,155, 94,100, +236, 50,240,218,176, 9, 51,102,110,159, 51, 16,178, 2, 5, 78,222, 9,196,205, 55, 31, 7, 1,120,130, 42,226,222,118, 61,197, + 7, 32,163,231,208,161, 67,131, 30, 61,122,100,113,240,224, 65,144, 36, 89,225,235,224,193,131,184,251,248,205,108, 0,175,117, + 44,150, 93,253,250,245,239,190,120,241,194,210,192,192, 0,119,238,220, 65,110,110,110,169, 37,107,226,196,137, 68,110,110,238, +232, 61,123,246, 12,139,139,139,219,248,248,241,227, 44, 20,173, 5,249, 73, 71, 96,179,217, 31, 73, 82,211,212,214,165, 17,103, +196,192,174, 93, 11,179, 66, 32, 49,111,137,103,193, 31,175,230,230,100, 41,216,108,246,199,178,251,127,141,250,212, 67, 15, 61, +244,208,163,102, 32, 8,194,143, 97, 24, 47,130, 32,252,202,255, 86,254,115,201,126,190,190,190,165,223, 75,142, 89,191,126,253, +186, 50,223,229, 95,169,120, 85, 6,195,119, 47, 86,144,221, 43,218, 73,245,246, 34, 84,239,174,128,231,216, 5,252, 38,131,192, +118,116, 71, 66,200, 3, 4,223,216,130,164,240, 39, 96,104, 10,182,141,219,235, 90, 16,101,211,166, 77,161, 84, 22,133,102,169, + 84, 42,240,196,166,202,249,211,198, 10, 1,128,230, 8, 85,101, 20,172, 78,132,134, 93, 60,209, 62,141,193, 75,235, 34, 67, 69, +251,180,162,227,214, 76,154, 4, 30,143, 7, 30,143, 7,162, 56,244, 71, 23,161, 69, 20,239, 76, 23,185,175, 42, 42, 4, 33, 23, +112, 79,158, 94,225,221, 94, 16, 23,202, 87,133, 61, 67,138,138,102,174,166, 81,215,116, 41,175,129,216, 32, 89,100, 96, 16, 42, +146,136, 75,133, 22, 65, 16, 31, 1,128,225,114,143, 29, 95,229,221, 82,156, 22, 45, 86,190,186, 7,169,146,214, 84, 66,179,234, +198,141, 27, 86, 28, 14,199,134,162, 40, 36, 36, 36, 32, 60, 60, 28,219,182,109, 75, 43, 40, 40,232, 30, 24, 24, 24, 89, 86, 59, + 82, 34,254,217, 99,171,231, 52,224,132,248, 11, 85, 31,195,106,220,123, 44, 92, 7,247, 29,212,221,237,218,244,241,203, 48,248, +155, 62,152,208,189, 25, 19,155,146,173, 4,112,167,216,244, 90, 29,146, 3, 3, 3,123,119,235,214,237, 68,171, 86,173, 92, 24, +134, 65,139, 22, 45, 48,122,244,104, 28, 59,118, 12,193,193,193,200,207,207,215,220,190,125,123, 43,128,195, 58, 22,203,192,212, +212,244,230,253,251,247, 45, 13, 12, 12,112,251,246,109, 40, 20, 10,216,218,218, 98,230,204,153,252,245,235,215, 31,205,207,207, + 31,225,235,235, 43,140,141,141,221,121,235,214,173,122, 40, 90,119,238,179, 78,160, 86,171,247,159, 60,118,100,251, 76,239, 89, +246,247,159,191,189,167, 42, 44, 48,118,116, 76,204,183, 52,149, 24,110,253,109, 85, 93,181, 90, 61,189,226,250,124, 88,171,250, +212, 67, 15, 61,244,208,227, 51, 84,169, 69,202,138,167,242, 98,171, 38, 34, 13,128,194,199,199,103, 41, 65, 16,126, 62, 62, 62, + 75,125,125,125, 21, 0, 82,254, 14,145, 85, 42,180,188,188,188,252,253,252,252,224,229,229,229, 95, 41, 5, 77, 65, 19,251, 8, +154,216, 71, 16,117,154,141, 63,125,199,148, 59,121,186,214,165, 27,184,250,206,125,149, 74,197, 57,114,228, 72,105,220, 22, 0, + 80, 20,245,213, 91,177, 38, 66,171, 88,232,125, 86,136,250, 2,137,255,254,121, 35, 58,154, 83,114,174,250,201, 85, 36,171,104, +114,227, 7,141,252, 85, 46,243,123,101,156,151,231, 78, 71,226,227,187, 48,144, 72, 18,167, 62, 10, 45,181, 98, 21,139,172, 24, + 0,168, 39, 48,188,183,119,206, 96,119, 27, 30,120,234,107,231,144,162,162, 85,123,227,180,135, 43,233,108, 96, 24, 6, 49, 49, + 49,144,203,229, 8, 8, 8,192,133, 11, 23, 50, 42, 16, 89,168, 47,144, 60, 60,244,211,184, 14, 70, 5,169, 60,245,171,187, 72, + 81,209, 58,185,186, 44, 90, 12,238,194, 99, 17,183, 9, 22, 91,212,179, 99, 99,204,253,126, 8,182, 28,250,147, 84, 91,117,245, +218,126,229,250,200, 66,149,102,169,142, 34,171,212,216, 24, 24, 24,216, 44, 48, 48, 80, 0,192,115,244,232,209,215,135, 13, 27, + 6,127,127,127, 92,189,122,213, 25,128,180,120,191,213, 40, 90, 40,251,119, 0,209,149, 25, 30,121, 60,222,233,187,119,239, 54, +183,179,179,195,221,187,119,161, 80, 40, 48, 99,198, 12,181,183,183, 55,111,226,196,137, 68, 94, 94, 94,169, 37, 43, 32, 32, 32, +171, 50,145, 5, 0,201,201,201, 55, 46,156, 61,222,185, 91,183,110, 67, 26, 56, 55, 49,138, 46,200, 79, 55, 48, 16,138, 30,251, + 63,224,189,122,241,116,103,114,114,242,203,138,235,243,158,206,245,169,135, 30,122,232,161, 71,229,208, 73,139,148,179, 76,213, + 4,101,142,227,250,250,250,134,251,250,250,126, 98,241,250, 66,148,159,117,120,173,100, 76,171, 85, 30, 45, 42, 47,225,243, 19, +160,233,154,156,236,103,191,153,154,154,146, 34,145,232, 19,161, 69,235,200,153,125,233, 20,162,127, 28, 91,106,201, 42,177,108, +161,223,196, 47, 18, 90, 52, 77, 7, 0,248,164, 16, 6, 86,141,199,108, 29,232,210,165, 89, 3,123,150,246,236, 54, 36,201, 73, +229,138,247, 26,229,187, 2,102, 80, 68, 5, 65,214,165,156,164, 22, 66,177, 40, 94, 36, 17,151, 23, 89,113, 0, 32,182,118, 30, +182,177,127,147,238,110, 77, 26,178,200, 51,155,145, 44,215, 22,250, 68,104, 52,209, 50,230, 98, 37,117,184,162, 79,159, 62, 43, +204,205,205,133,219,183,111, 55,118,116,116, 4, 73,146,234,242, 34,203,192,170,241,152,109,131, 93,187, 52,182, 49,101,105,207, +239, 64,162,130,146,111,139,214, 30,213, 69,100, 89, 24, 75,110,237, 93,247,163,200, 64,192,133, 82,169,196,250,221,231,113,251, +105,152, 87,102,216,229, 91, 0,110,125, 65,135,156,234,229,229,181,101,245,234,213,208,106,181,152, 50,101, 10, 62,126,252,120, +251,253,251,247,219,234,214,173,187,240,167,159,126,178,179,177,177,193,200,145, 35,121, 90,173,118, 98, 37, 28,191,157, 60,121, +210,203,205,205, 13,254,254,254,200,205,205,133,173,173, 45,188,189,189,249,190,190,190, 71,243,243,243, 71,172, 91,183, 78, 24, + 19, 19, 83,165, 37,235,147,126, 77, 81,107,246,109,249,113, 97,187,142,238,172, 15, 31, 34,201,132,246, 30,172, 7,119,175, 62, + 50, 55, 55, 63,154,144,144,240, 87,125, 14,105, 81,227,250,212, 67, 15, 61,244,208,227,235,128, 32,136,107,197,113, 87,159, 88, +185,202,139,176, 18,139, 85,217,239,229,247, 47,222,254, 53, 30,150,247, 87, 32,188, 62, 77,239,224,229,229,165,243,180,122, 90, +150,161,147,120, 42,143,111,154, 64,107, 47, 1,103,169, 7, 11, 60,177,169,114,224,234, 59,247, 43,219, 87, 44, 22,235,108,209, +162, 85,202,234, 26,165, 70, 66,171, 56, 70,235, 38,195, 48,159, 8, 45, 99,235,198, 30,139,127,154,179,213,125, 88, 63, 86,218, +247,157,144, 91,168, 82,253,244,150,164,147,228, 85,139,172,162, 81, 92, 27,107, 32,150,132, 10,197, 6,101, 69, 86, 2, 0, 8, +173, 26,182, 95, 52,119,230,238, 30, 99, 6, 18, 25, 51,220,145,147,171, 80, 45, 12, 39,137,100, 5, 51, 34, 2,120, 80, 17,221, +253,251,247,247, 1,216,231,225,225,145, 38, 22,139, 81, 88, 88,248, 89, 27,148,148,183,203,176,126,172,180,169, 29,144, 45,211, +168,126, 10, 39,145,162,160, 79, 87, 39,178, 44, 77, 12,111,237, 93,251,163, 65, 74, 82, 28,120, 60, 30, 36, 18, 9,238, 60, 9, + 69,102,248,149, 47, 17, 88, 96,177, 88, 43,125,124,124, 86,204,156, 57, 19, 89, 89, 89,184,122,245, 42,190,249,230, 27,156, 58, +117,202,241,250,245,235, 91, 60, 61, 61,193,102,179,225,231,231, 7,173, 86, 27, 85, 9,205,144,105,211,166, 45, 28, 54,108, 24, + 94,190,124, 9,169, 84,250,137, 37, 43, 55, 55,119,244,238,221,187,135,197,198,198, 86,107,201, 42,135,246,245, 27,182,230, 45, + 89,190, 9, 42,121, 58, 39, 35,249,185,255,189, 59,172,103,217,217,217, 6, 0,242,106, 91,159,122,232,161,135, 30,122,232,108, +213,170, 76,139,100, 20,139,168,140,138,190,151, 17, 88, 21,125, 39,202, 89,193,212,229,182, 7,255,157,231,164,147, 69,139, 99, +237, 10, 50, 45,172,140,208, 74,255,100,187,208,208, 76, 39,215,161,150, 4,103,239,225,210, 60, 90,194,172,172, 44,161,133,133, +133,178,172, 64, 48, 48, 48,128,157,157, 29,114,114,114,176,127,255,126,160,250,160,104,210,104,216,120,180, 31, 51, 5,175, 28, +248, 96,180,154, 82,203,214,222, 73,147, 62, 17, 91, 60, 30,175, 36, 54,172,186, 65,247, 69,177,165,233, 25, 0,166,181,115,131, + 95,133, 98,241, 36,161, 69, 29,139,185, 63, 78,229,198,166,171,112,223,125, 73,238,249,223, 22, 75, 18, 25,201,204, 4,228, 61, +173,134, 47,250,219, 61,199,203, 91,178,146, 90, 57, 55, 88, 38, 52, 16,126,207, 55,171,103,227, 51,255, 71,110,108,154,138,184, +223,254,167,252, 11,191,255,100, 16, 3,195,133, 73,200,125,160, 67,243,172,248,230,155,111, 86, 48, 12,195,208, 52,189, 28, 0, +202,150,119,190,247,247,220,232, 84, 37,238,185, 47,203,185,240,219, 98,195, 68, 84, 93, 94,139, 22,131,187, 88,155, 26,221,218, +187,110,166,129, 52, 57, 30, 2,129, 0,134,134,134, 72, 76,203, 3,151,195, 86,124, 97,127, 19,116,237,218,117,241,143, 63,254, +136,208,208, 80,204,152, 49, 67,154,144,144,112,241,204,153, 51, 51,126,249,229, 23, 78,223,190,125, 33,149, 74,177, 97,195, 6, +237,147, 39, 79,214, 1,216, 80, 97,127,228,112,166,254,250,235,175, 76, 74, 74, 10, 17, 19, 19, 3, 91, 91, 91,204,154, 53,139, +191,110,221,186,210,152,172,154, 88,178, 74,144,156,156,236,127,251,238, 51, 12,186,177, 21,164, 86,229,159,155,149,240,232, 93, +116,142,191, 25,159,191,192,190,117,139, 90,213,167, 30,122,232,161,135, 30, 95,197,138,245,170,170,239,255, 5,168,200,117,168, +147,208,138,218,177,108,178,243,228,153,139, 32,114,236, 2, 85,196, 37,208,133,105,165, 22, 45,161,196, 20,102,117, 93,144, 43, + 83,225,220,189, 55, 0, 16, 85,147, 82, 21, 20, 20,160, 77,155, 54,216, 53,177,113, 15,101, 65,150, 80, 4, 64, 37, 48, 82, 94, +230,119,189,127,253,250,117, 57, 77,211,167, 1, 92,175,134,102,101,243,230,205,119,110,218,180,137,239, 50,102, 50, 10,159, 63, + 46,111, 65,129, 72, 36,130, 64, 32, 64, 72, 72, 8,238,223,191,175, 6,176,178,154, 6,125, 65,146,100,240,153, 51,103,146, 26, + 53,176,239,215,166, 85,203,217, 75,151,248, 24,190,125,124, 27,203,215,237,164, 27,181,237,155,183,254,212,229,130, 60, 73,221, +158, 10,233,251, 32, 29, 78, 53,184,156,200, 74,105, 90,191, 78,143, 86,174,205, 23, 45, 95,190,204, 40,252,241, 29,252,242,251, + 94,198,217,173, 87,222,239, 23,174,228,103, 26,212,235,163, 76,127,247, 82,151, 58,244,247,247,223, 7, 96, 95,201,247,242,229, +245, 89,189,141,110,220,174, 95,206,250, 83, 23,100,249,134,117,123, 85, 85, 94, 75,151, 33,157, 29, 44, 77,111,237, 88,243,131, + 65,106,114, 2, 4, 2, 1, 36, 18, 9, 18,164,185, 88,177,245,172, 76, 67,211,253,190, 84,104, 25, 26, 26, 10, 52, 26, 13,118, +237,218,133,132,132,132, 78, 0, 18, 94,191,126,189,119,212,168, 81,219, 91,180,104,209, 52, 60, 60, 60,170,176,176,112, 38,128, +119,149,145,152,152,152,116,178,180,180, 36,158, 61,123,134, 31,126,248, 65, 61,107,214, 44,222,132, 9, 19,136,156,156,156,218, + 90,178, 0, 0,246,246,246, 30,189,123,118, 68,151,222, 51,252,213,202,220, 71,177,239,142,250,179,152,167,194,218,214,167, 30, +122,232,161,135, 30,255, 26,212, 46, 49,184, 7,192,105,108,142,233,205,237,121,169,199,126,155,197, 20, 68, 7, 48,138,151,251, +152,252, 75,223, 51,215, 54, 76, 96,174,239,152,203,204, 24,208,156,105,106, 69,164, 54, 54,199,116,143,207,133,219, 39,171,123, +127,211, 4,218,222, 13,193,244,110, 8,102, 64, 99,104, 1, 44,109,221,186,245,101,239,246,127,229,209,242,110, 15, 6,192, 15, + 0, 36,149, 20,171,162, 21,195,109, 1,236,111,211,166, 13,249,224,193, 3,230,253,136, 94, 76, 96, 83, 11,102,230,204,153,204, + 47,191,252,194,140, 29, 59,150,177,180,180, 36,139, 43,194,182, 58,206, 65,131, 6, 57, 0, 64,157, 58,117, 76,218,186, 52, 74, + 13,185,119,149,121,116,108, 59,115,200,123, 40,211,161,133, 75,166, 77,211,110,193, 34,219, 38,173,170,169,190, 82, 78, 27, 27, +155, 37, 12,195,244, 99, 24,198, 22, 0,156,157,205, 37,173,155, 54, 74, 9,190,123,149,121,124,124, 39,115,200,123, 40,211,177, +101,179, 44, 7, 23,207,119, 66,171,166,237,117,225,172, 8, 21,150,215,181,105,166,117,163,206, 65, 85,148,183,148,179, 65,251, +145, 87,146, 82,210,152, 23, 47, 94, 48,215,175, 95,103, 30, 63,126,204, 28, 59,115,133,169,219,110, 68,161, 69,139,193, 93,106, +208,117, 42, 43,167,241,128, 1, 3,152,168,168, 40,166,127,255,254, 12, 0,227, 90,114, 94,142,141,141,101,194,194,194,152,165, + 75,151, 50, 0,142,252,248,227,143,138,188,188, 60,166, 87,175, 94, 9,197, 2,139, 83,155,114, 58,213,183, 95, 63,100, 96,215, +149,222, 63, 12,243,248,210,250,252,138,208,115,234, 57,245,156,122,206,127, 3,231,255, 50,108,139,173, 90, 37,239,173,117,202, +163,229, 15,144,200,194, 62, 87, 43,205,137,117, 27,118, 44,216,181,239,200,162,197,179,167,138,187,186,247, 70,232,221, 63,112, +193,239,140, 76,169, 82,111,224,177,177, 41, 44, 11,242,200,106, 74, 81,156, 71,235, 19, 4, 6, 6, 26,152, 53,252, 43, 7,211, +135,162,220,172,123,107,120,130, 82, 0,211,222,188,121,179,201,211,211,115,237,247, 93,218, 15,245,238,220, 3, 90,173, 22,199, +142, 29, 67,124,124,252, 69, 0,203,116,181,184,133,134,134,102, 54,107,232, 56,135,203,230, 44,154, 57,118,136,101,198,199,183, + 72,138, 8, 4, 0,168, 84, 10,109,106,212, 35,183,154, 20, 78, 36, 18,189,176,180,180,124,111,105,105,153,211,184, 65,157,105, + 2,112,151,207, 24,253,173, 85, 86,236, 59, 36,134, 23,121, 70, 85, 74,185, 38, 41,234, 65,211,218,180,174,163,163,163, 64,204, +197,244, 10,203,171, 86,106,211, 62,188,107,165, 11,143, 92,165, 94,183,106,203,177, 62,107, 22, 77, 18, 24, 25, 25,225, 77,216, + 7, 44,223,124, 74,166, 80,107,251,101,134, 94,254, 42,238, 49,134, 97,160,213,106,117,158,232, 80, 9, 22,187,185,185, 53, 89, +187,118,173,243,196,137, 19,241,165,150,172,178,136,142, 77,246,177,175,227,212,236,195,251, 55,158,102, 34,222,137, 47,169, 79, + 61,244,208, 67, 15, 61,254, 53, 24, 80,108,204,153, 86,230, 61, 16, 58, 62,245, 35, 44, 29,114, 0,171, 27,176, 11,247, 46, 89, +187,101, 5,139,216, 58,137,102,152, 63, 72, 22, 86,197,100, 33,227, 11, 11, 39,231,114, 64,246, 25, 60,150, 3, 0, 92, 78,237, + 6,200, 98, 68, 1, 24,118,224,233,203,118, 7,158,190,252,185,248,183, 53, 0,106,228,203, 53,228, 32,204,189,153,147,125,215, +214,205,133,108, 74,129,164,136,143,200,150, 41,113, 39, 60, 62,151,197,176,254,168,105,161, 98, 98, 98, 30, 2,128,181,177, 65, + 68,215,102, 13,235,118,107,211,220,128, 75,168,145,244,246, 13,242, 20,106,220, 14,143,207, 3, 65,212, 58,160,250,107,149, 55, + 45,244,202,171, 63, 65,244, 34, 8,226,238, 82,239, 49,130, 21,155, 79,127, 85,145, 5, 64,158,156,156,156, 37,151,203,205, 83, + 82, 82,212,168,125,146,184, 15,249,249,249, 45,230,206,157,187,122,225,194,133,139,126,251,237, 55, 94,109, 98,178, 42, 67, 78, +114,252,165,110,205,191, 94,251,235,161,135, 30,122,232,241,175,192,180,114,239,208, 89,104,149, 10,134,116,100, 0,152,233,228, +196,204,143,142,134,250,107,149,172, 34, 75,215, 23,226, 21,128,129,181, 62,154, 69, 20, 60,143,138, 47,124, 17, 21, 95, 8,154, + 97,104,134, 81,177, 88, 72,148,105, 52,235,162, 98,146,107, 63,235,142, 32,168, 87, 31, 18, 20,175, 63, 38, 42, 25,154,102,104, +134, 81, 19, 4, 82,181, 90,122, 93,120, 76,252,149,255,134,242,102,134, 94,126,234, 71, 18, 93,159,190, 8,155, 47,147,105,118, +102, 70, 92, 14,248,138,237,162, 13, 13, 13, 29,215,169, 83,167,201, 20, 69,237, 5,160,253, 2, 46, 53, 73,146,139,215,175, 95, +127, 49, 52, 52,244,108, 64, 64,128,244,107,136,172,191,181,253,245,208, 67, 15, 61,244,248,167,162,118,139, 74, 87,134,175, 41, +178,254, 27, 17,246, 33,174,205,223,193, 27,254, 33,206,245,127,161,188,105, 17,151, 94,167, 1,163,255,166,234,189, 77, 81,212, +237,175, 41,170,111,222,188, 89, 31, 21, 44,171,243,223,214,254,122,232,161,135, 30,122,252, 99, 49,173, 50,241,197,209,215,141, + 30,255, 0, 48, 95, 75,100,233,161,135, 30,122,232,161, 71, 45, 80,169, 69,139, 64,229, 51, 7,238,214,224, 15,106, 51,251,224, +174,158, 83,207,169,231,212,115,234, 57,245,156,122,206,127, 29,231, 63, 17,182, 40, 10,136,191, 86,252, 14,134, 97,246,255, 39, +254, 88, 63,245, 85,207,169,231,212,115,234, 57,245,156,122, 78, 61,231, 63, 29,159, 5,194,151,164,119, 96,233,235, 70, 15, 61, +244,208, 67,143,191, 17,130,226, 87,109,183,235,161,199,255,162,216, 42, 21, 92,181,137,209,106, 84,252,254,225,111, 44,172,183, +173,173,237,180,150, 45, 91,186,240,120, 60, 86, 65, 65,193,170, 7, 15, 30,172, 44,191, 83,215,102,156,215,108, 22, 28,254,250, +133, 0, 8, 54,192, 98,129, 98,144,244, 56, 68,209, 86,223,238,255,213,112, 20, 25, 89,254, 73,176,216,124,138,212,128,210,106, + 80, 20,110, 85, 4,154, 38,227, 41,141,170,111,101, 7,219,184, 13,169, 75, 82,244,111, 0,179, 11, 96,253, 8,208,187, 9,112, +102, 48, 32,247, 16, 96,255, 0, 54,243, 59, 40,226, 39, 14,151,189, 68, 26,120, 62,241,159, 80, 97,231,206,157, 99,127,201,241, + 35, 70,140,168,112, 1, 81, 59, 59, 59, 63, 3, 3,131,134,149, 29, 39,147,201,164, 82,169,212,243, 31,222, 31,187, 1,216, 1, +160,121,185,223,223, 1,152, 3,224,222,151,254,129, 7,192,177, 6,166,243,128,159, 0, 64, 3,252,158, 6,236,243,255, 47,138, + 49,180,180,180,124,196,225,112,156,101, 50,153,172,160,160,192,201,208,208, 48, 90, 44, 22,139, 73,146,140,202,200,200,232, 86, + 67,186, 31,241,215, 82, 90,139, 0,236,174,225,118, 61,244,248, 95,193, 23,205, 58,108, 92,116,127,128, 7,128,110,237,218,181, +179,150,201,100,120,247,238, 93, 26,128, 71, 0,252,139, 95,145, 95,163,164, 44, 22,107,227,150, 45, 91, 22,204,154, 53,171,116, + 49,232,144,144, 16,184,185,125,158, 35,148,205,130,195,131,171,119,173, 94,133, 70,162, 93,175,225,197, 66,139, 5,200,164,240, +236,221,190,182, 69, 48, 52, 53, 53, 93, 69, 16,196, 8, 22,139, 85,237,160, 70,211, 52,197, 48,204,185,156,156,156, 21, 0, 10, +106,242, 71, 98, 3,129,150,164,168, 10,255,131,195,102, 83, 50,185,170,210,180, 23,102,102,102, 1, 44, 22,171, 65,217, 5,179, +129, 79, 23,208,174,108, 27, 73,146, 73,153,153,153,186,136, 80, 33,139,195,155, 67, 16,188,222, 96,209,141, 1, 2, 4, 88,145, + 52,165,190, 67,147,154,109, 0,148, 95, 34,178,108,235, 56, 61,158,183,108,189, 67, 88,196, 59, 44,245, 30,139,223,118, 28,193, +146, 57,147,177,109,255, 41,204,153, 54, 6,205,154, 53, 71, 85,203,138,211,224,173, 91, 54,123, 68, 47,223, 93,103,221,151,204, + 28, 33,240,221,117,174,235, 82,239, 81,252,117, 59,207,118, 93,234, 61, 82,224,187,243,172,251,146,217, 35, 68,235,118,159,167, + 1,140,175, 77, 33,199, 56,219,201, 8,146,172,240,105,155,225,112, 84,167,162, 82,196,255, 31, 87,244,196,137, 19, 91, 42, 20, +138, 55, 99,123,183, 94,223,170,177,125,114, 69,251,100,165, 38,219, 71,191, 15,244,225,242, 68,109,190,245, 57, 18, 82,165,201, + 65, 32,104,240,238,221, 59,103,154,166, 65, 81, 20, 72,146, 44,125, 87,171,213,232,214,173,219,215,154, 56, 51, 16,192,170,162, +139, 21,190, 0,206,126, 1,151,132,195,225,204,227,243,249, 30, 36, 73,186, 0, 0,151,203,141, 80,169, 84,254, 36, 73,110, 1, + 80, 88, 67,190,173,201,201,201,205, 36, 18, 9, 52, 26, 77,233, 2,244,108, 54,187,105,221,186,117,119, 41,149, 74,231, 47, 61, +121,107, 96,122,103,119,247,109, 19, 22, 44, 96, 43, 30, 61,194,182,195,135,183, 34, 63, 31, 0,118, 85,119, 44,159,207,191,197, + 98,177, 28,107,242,127, 52, 77,199,171,213,234,190, 53, 57,134,195,225, 56,167,164,164, 88,217,217,217,161,160,160, 0, 98,177, + 88, 92,242,189, 22,150,172, 13, 12,195,136,138,239,237,219, 58,118,236,216,137, 32, 8, 18, 0, 67,211, 52,235,197,139, 23, 99, +104,154,230, 20,223,159, 54, 0, 56, 12, 64,165, 31,179,245,248, 31,181,102,237,175,169,208,186, 14,192,163, 93,187,118,162,209, +163, 71,195,195,195, 3,206,206,206, 16, 10,133, 69, 55,241,172, 44,235,160,160,160,145,143, 30, 61, 26,121,245,234, 85,188,125, +251, 86, 1,224, 9,128, 10, 47,234,158, 94,238,179,132, 18,193,118, 0,200, 72,202,146, 38,197,164,111,151, 74,165, 27, 0,148, + 77, 17,238, 52,126,252,248,249,179,103,207,134,159,159, 31, 78,157, 58, 5,149, 74,133,130,130, 42,244,139, 60, 29, 57,247,215, + 3,226, 88, 32,193, 31, 48,176, 2,196,214,181,174, 41, 83, 83,211, 85,115,230,204,153,219,172, 89,179,210, 44,230, 90,173, 22, + 36, 73, 66,171,213, 34, 39, 39, 7,243,231,207, 47, 26,104, 25, 6, 52, 77,227,198,141, 27,179,166, 77,155,134,156,156,156,121, + 21,113,118,108, 83,231, 53,139, 96, 57,148,216,106, 24,138, 74,122, 30,148,212,150,164, 40,182, 82,169,169,112,165,114,161,144, + 87,165,200,227,114,185, 14,111,255,252,211,138,197,231,131,161, 40,128,166,193,208,116,113,117, 22,191,152,162,223, 24,138, 6, +163,165, 64,147, 52, 72,133, 10,237,127,252, 81,151,170,232,204,229,139, 78,141,251,126,129, 77,135,142, 29,185,245,234,216,129, +164,104,124,140, 77,178,121,243,250,121,151,115, 71,119,205, 80, 43, 10,198, 0,168, 85,158, 45,190,129,209,237,157,123, 14, 56, +188, 10, 10,195,189, 7,143,112,247,190, 63, 0,224,214,131,128, 18,193, 93,109, 83,129, 44,108, 49,103,202, 96,193,250,157,167, +185,115,166, 12, 97,255,182,243, 12,119,246,228,111,217,235,183,159,226,205,158,252, 45,123,253,142, 83,188,217, 83, 6,179,125, +183, 29,106, 9,192, 20, 64, 78,101,100,149,181, 17, 65,146,130, 19,209,105,108, 0,200,216,187, 23,218,244,116,216,173, 88, 1, + 0, 24,231,100,173,179,187,195,194,194,226, 53,151,203,117,168,110, 63,173, 86, 91,173, 8,158, 56,113,162,155, 66,161,120, 77, +146, 36,195,225,112,124,198, 14,233,115,185, 95, 87,183,172,178,251,132,132, 4,155,175, 91,247,231,224,179,111, 10,152,145,109, + 12,223,248,109,156,216,214,107,225,145,224, 42, 6,100,150, 74,165, 66, 84, 84, 20,202, 46,242, 94, 6, 84,109,159,157, 0,108, + 51, 55, 55,239,144,149,149, 53, 14,192,210,252,252,252,150,108, 54, 27,102,102,102, 75,213,106,245, 71, 99, 99,227,131,121,121, +121, 1,197, 86, 35, 93,151, 12,232,102,100,100,116,236,210,165, 75,166,173, 91,183,102,101,102,102,162,126,253,250,200,206,206, +110,255,232,209,163, 54, 83,166, 76,153, 82, 80, 80,240, 93,241,195,160,174,104, 98, 96, 96,192, 76,152, 48,129,160,168,191, 78, +247,208,161, 67,232,235, 74, 54,180, 52, 49,144, 43,213, 76,222,189, 40,227, 31,120, 60,222,147,248,248,248,188,154, 86, 6, 15, +248,105,194,130, 5,108, 73, 92, 28, 36,193,193, 24,151,159,207,249,173,200,186, 85,173,208, 98,177, 88,142,199, 78,253,225,204, +231,243, 65,146,100,169, 24, 44,185, 71,105,181, 90,104, 52, 26,104,181, 90, 80, 20, 5,173, 70, 11,223, 53,191,215,250, 94,104, + 96, 96, 96, 96,107,107,155,102, 96, 96, 96,240, 53, 70, 33,129, 64,192, 57,122,244,232, 24, 62,159, 15, 0, 80,171,213,112,117, +117, 37,244,227,179, 30,255, 48,177,245,153,149,171, 42,161,213, 63, 63, 63, 31, 20, 69,193,208,208, 16,108,246,167,227,190,185, +185, 57,122,247,238,141,110,221,186, 97,244,232,209,120,251,246,173,104,244,232,209,189, 43, 35, 27,187,192, 11,117,156,173,139, + 7, 19,218,246,233,181,160,245,135,126, 61,111,153,154,154,186,160,204,110, 83,166, 79,159, 78,100,101,101, 97,196,136, 17,143, + 84, 42,213, 32, 0,249,149,113, 82, 52,146, 60, 71,143, 3,205, 16,162, 45, 47, 14, 16,106,165,130, 97,177, 88,138, 18,215, 97, +109,106,137, 32,136, 17,118,118,118, 56,125,250, 52,212,234,207,211,133, 25, 25, 25, 33, 60, 60,252, 47,171, 26,155,141,142, 29, + 59,178, 9,130, 24, 1, 96, 94,197,156, 44,135,167,175,226,172, 74,190,123,245,110,206,235,216,134,149,150,146, 38, 99, 0, 16, +203,150, 45, 43, 21,110, 0,176,106,213, 42, 93,202, 9, 22,151,139, 12,127,255,191,110,196, 28, 22, 88, 60, 2, 4, 23, 96,113, +138,188,168, 96, 0,134, 2,104, 18,160,181,128,208,182,142, 46,213,208,222,190,174,179,223,186,205,187, 77, 84, 90, 6,167,175, +220, 67,108,108, 12,216, 44, 22,156, 26, 58,163, 79,247,174,220, 54,237, 58,213,249,125,229,130,171, 41, 9, 31,250, 3,120, 89, +227,138,166, 25, 97,195,186, 22, 56,120,232, 13, 44, 77, 37, 24, 49,248, 27,136,132, 2,252,182,227, 15,172, 89,226, 13,103, 39, + 71,236,219,186,182,210,195,141,141,141, 87,187, 56, 55,116,220,125,244, 26, 92,154, 54,101,239, 62,118, 13, 46,205,138,223,155, +187,176,119, 31,187,134,102,205,155,177,119, 31,187,134,150,205,155,212,123, 45,125,177, 58, 59, 59,219,187,242,250, 44,215, 70, +125,138,218,136, 91, 72,151, 14, 4,113, 51,102, 0, 64,169,208,170, 9,184, 92,174, 67, 74, 74,138, 85,117,251, 85,103, 53, 40, +182,100,189, 38, 73, 18,233,233,233, 68,110,110, 46, 99, 98, 98, 50,248,230,190,165,151,250,186,187,101, 3, 64,112,112,176,153, +175,239,186,193,103, 94,231, 67,241,124, 39,113,226, 79,127,122,220, 32,143,215, 87,214, 79,108,131,226, 37, 33,202, 67,165, 82, +197,182,106,213,138, 41,254,108, 47, 16, 8,120,229,250,155, 93,163, 70,141, 62,179, 90,235,224, 82,220,246,236,217, 51,239,102, +205,154,161,105,211,166, 1, 29, 58,116, 48, 18,139,197,184,121,243, 38, 92, 92, 92,154, 27, 25, 25,189, 56,119,238, 28,119,241, +226,197,110,135, 15, 31, 6,128, 89, 58, 84,103, 47, 79, 79,207,211,126,126,126, 66, 30,143, 7,133, 66,129,240,240,112, 24, 27, + 27,131,207,231,227,219,111,191,101,119,233,210,197,188,123,247,238, 23, 34, 35, 35,199,160, 6, 51,160,148, 74, 37,179,116,233, + 82, 24, 24, 24,192,192,192, 0, 98,177, 24, 98,177, 24, 18, 33,136,189,115,234,138,102,239,207, 21,205, 91,177,119,253,177,221, + 43, 31,212,169, 67,255,146,152,152,152, 91,211,190,160,120,244, 8,146,224, 96,160,204,181,171, 43,140,197,102,240,241,241,169, +206, 34, 5, 30,143,135,206,157, 59, 87,203,103,102,102,118,145,195,225,124,242,100, 74,146,164,208,199,199,135,138,140,140, 20, +179, 88, 44, 49, 77,211,240,241,241,161, 72,146, 20, 90, 89, 89, 5,208, 52,157,150,153,153, 57, 84,135,226,170, 0, 44, 98,177, + 88,219, 4, 2, 1,167, 94,189,122,241,203,151, 47,127, 86,108,205, 4,195, 48,172,122,245,234,181, 23,137, 68,142, 42,149,138, + 68,145,235, 80,111,205,210,163, 66, 48, 12,211,166,200, 40, 92, 10, 53, 0,126,241,231,172,162,209, 14, 22,229,126, 7,128,204, +226, 7, 69,235, 74,190,103, 1,120, 11,160, 9, 0,171,226,109,175, 8,130,200,174, 69, 49, 43,183,104,249,249,249,149, 62,194, +122,121,121,149, 14, 44,134,134,134,120,245,234, 21, 8,130,128,161,161, 33,140,140,140, 96,108,108,140,252,252,124,188,125,251, + 22,239,222,189, 67, 92, 92, 28, 8,130,128,147,147, 19, 74, 46,160, 50, 40,189,193,157,220,228, 7,161, 68, 0,130, 0, 90,247, +104,137,150,221, 92,209,238,101,244,156,215,119,137,253, 82,169, 52, 10, 0,199,213,213,117, 74,199,142, 29,177,121,243,102,168, + 84,170,205,149,136,172, 82,206,199,111,201,182, 0, 96,107,107,187,240,248,205,143, 6,227,251, 53,148, 75,165,210,141,181,168, +156, 79,110,196,153,153,153, 58,175,197, 71,211, 52,114,114,114,170,228, 44,111, 33,216,178,109,167, 73, 65, 94, 26,126,253,237, + 56,180, 90, 45, 22, 44, 88, 0,154,166, 75, 95,185,185,185, 58,149,147,161,168,207,109, 7,172, 34,239, 41,193, 1,234,142, 42, +210, 21, 9,167,119,130, 96, 0,130, 2,240,249,121,149, 31,132,132,108,158,232,204,202,223,182,155, 4,190, 75,194,149,123,129, +208,228, 39, 67, 26,124,169,200,228,216,121, 12,206,170,216,232,208,178, 33,230, 46,251,221,244,231,185,223,157, 81, 43, 10,154, +226, 83, 55,226,221,234, 47, 26, 10,191,174, 94,141,253,219, 55,227,247,205,219,145,159,151, 11, 46,215,162,248, 70, 79,129,162, +168,170,207,157, 97,250,249,204,153, 68,252,182,231, 34,218, 55,179,197,133,155, 47,225,222,202, 17,151,110,191, 70,183, 54,245, +113,229,110, 32,122,116,104,136,235,254, 97,152, 59,125, 12, 49,230,214,225,126, 53,105,163,173, 91,119,154, 20,228,167,193,111, +237, 81,164,239,218,133,120,111,111,180, 47,222,231, 37, 65,128,231,224, 0,240,170,111,163,242,136,136,136,128, 74,165,170,232, +105, 31, 46, 46, 46,213,182,187, 66,161,120, 67,146, 36,147,150,150, 70,164,165,165, 65, 44, 22, 19,225,225, 97, 84,243,230,174, + 67,152,119,231, 15, 0,128,175,239,186, 33,103,223,228, 67, 30,176, 29,138,103, 59,192,171, 31,194,218,191,106,186,102,218,138, +125,111,202, 92,163,159,148, 51, 53, 53,181,127,106,106, 42, 0,160, 65,131, 6,239, 34, 35, 35,155,148,184,154,139, 93,136, 60, +146, 36,157, 75,220,137, 36, 73, 66,165, 82,161, 87,175, 94,236,170,206,221,212,212,180,163,139,139, 11, 2, 3, 3,177,125,251, +118, 51, 79, 79, 79,124,248,240, 1, 4, 65, 96,221,186,117, 68,179,102,205,184,153,153,153,232,219,183, 47, 46, 94,188,216, 57, + 63, 63,191,186,250, 52, 20,139,197,135,175, 94,189, 42,100,177, 88, 40, 40, 40, 0, 77,211,232,210,165, 11, 88, 44, 22,194,194, +194,176,108,217, 50, 92,188,120, 17,151, 47, 95, 22,181,105,211,230,176, 92, 46,119,193,167,110,253,202,218,136, 81, 42,149,140, + 64, 32,128, 64, 32,128, 80, 40,132, 80, 40, 4,159,207, 71,161, 18,152,182, 37, 94,197, 22, 90,208,205, 91,185, 55,156, 52,123, + 29,107,227,242,201,247, 1, 92,209,181,207, 3, 69, 49, 89,219,254,248, 99,251,184,188, 60, 22, 0, 28, 36, 8, 90,195, 48,191, +235,114,189, 3, 64,161, 50, 15,142, 78, 14,184,112,230, 50,134,141, 26, 92,161,200,226,114,121,224,113,185, 48, 50, 19, 87,203, +201,227,241,172,223,189,123,103,206,229,114,193, 48, 12, 40,138,130, 70,163, 73,251,249,231,159, 45, 7, 12, 24, 96,120,227,198, + 13,214,128, 1, 3,104, 83, 83, 83,217,203,151, 47,211, 73,146, 52,239,218,181,107, 77,250,252,238,150, 45, 91,182,190,116,233, +210,100, 31, 31,159,215, 11, 23, 46,252,181,236,198, 13, 27, 54,172,190,126,253,186,227,144, 33, 67,142, 5, 7, 7,239,174,201, + 61,228, 75,239,243,122,206,255, 62,206,202,180, 72, 49,172, 9,130,240, 43,115,207,246, 42,249,238,227,227,179,212,215,215, 55, +156, 32, 8,191,178,191,151,236, 87,252,176,232, 87,209,247,226, 99,205,150, 44, 89,226,186,126,253,250,117,157, 58,117, 58, 29, + 16, 16, 16, 3,160,166, 66,171,234, 24,173,146, 19, 42,123,146,229, 6, 53,228,231,231, 35, 63, 63, 31,137,137,137,216,187,119, +111,241, 5,205, 5,135,195, 1,135,195, 41,141,103,168, 12,247,252,158,236, 0,176,163,117,235,214,220,208,103,231,110,252,180, +127,118,207,182,189, 90,179,223,220, 11, 29,142,162,245, 8,251, 79,152, 48,193, 2, 0,142, 30, 61,154, 9,224,198,255,147,106, + 62, 23, 21, 21, 53,215,214,214,182, 52, 70,165,172,251,144, 36, 73, 8,133, 66,148,196,178, 40,149, 74,236,221,187,151,100, 24, +230, 92, 21,156,136, 12,191,143,168,240, 7, 69,199,209, 52,104,234,175,227, 87,174, 92, 89, 58, 13, 20, 0,102, 20, 91, 78,170, + 21,121, 21,213, 57, 83,238,189,220,239, 12, 69, 85,227,158,224,205, 30,254,157,183, 45, 77,112,240,231,253, 32,112,185, 92,208, +101,172,153, 92,118,209,211,114,248,135, 20,216, 89, 55,199,160, 49,211,109, 46, 29,219, 57,155,212, 40,127,171,105, 93, 55,109, +217, 9,115,230,206,197,129,253,251,177,108,197,234, 82, 5, 64, 82, 20,200,106,203,201, 98,245,234,226, 10,178, 48, 5,108, 54, + 27, 61,218, 55, 4,155,205, 70,239, 78,141,193,102,179,209,183, 75, 83,112, 56, 28,244,115,111,134, 70,141, 26,129,195,225,176, +170,105,119, 68,134,223, 67, 84,248,195, 50,162,151, 1, 3, 64, 35,149,126,182,191, 86, 42, 5, 83,215,188,166,125, 11, 83,166, + 76,201, 77, 76, 76,212,148,223, 86,167, 78, 29,222,163, 71,143, 76, 42,113,219,149, 66, 36, 18,181,225,112, 56,111,178,179,179, +105, 3, 3, 3, 22, 77, 83,116,243,230,174,236,155,251,150, 94, 42,217,103,201,146,165,151, 70,182, 49, 26,114,252,156, 31,195, +171,231, 78, 16, 92, 1,249,253,138,125, 60, 46, 79,212, 6, 80,232,242,240,192, 82,169, 84,120,255,254, 61,170, 43, 15,195, 48, + 85,186,126,114,114,114, 38,184,184,184, 60,218,177, 99,135, 25, 65, 16,120,252,248, 49,216,108,118,233, 43, 58, 58, 26, 44, 22, + 11, 63,253,244,147, 38, 63, 63,127,106,117,101,227,112, 56,115, 47, 92,184, 96,204,231,243, 81, 80, 80, 80,122,221,176,217,108, +188,123,247, 14, 27, 55,110,196,132, 9, 19,144,144,144, 0, 59, 59, 59, 44, 88,176, 64,178,126,253,250,185, 26,141,102,181, 14, + 77, 20,162, 86,171,219, 26, 24, 24, 64, 40, 20,162, 68,112, 1,192,237,112,110,152, 66,161,104, 97,110, 46,183,177,244,247,251, +179,179,231, 32, 55,115, 75,219, 78, 82,169,244, 74, 77,250,192, 71, 96,127, 44, 69,253,220,255,210, 37,171,167,151, 46,209,207, +175, 94, 77, 18, 20, 20,236,211,185, 15,105, 89,136,143, 78, 66,155, 54,109,240,230,205, 27,180,105,211,166,172,104, 2,159,207, + 7,143,199, 3,143,199,131,133,169, 78, 33, 20, 12,139,197,194,211,167, 79, 65, 81, 20,212,106, 53,212,106, 53,154, 53,107,150, +253,224,193, 3, 9, 0, 68, 71, 71, 51,227,199,143,207,125,241,226, 5, 90,181,170,122, 61,117,107,107,235, 71,108, 54,187, 94, +217,223,178,178,178, 76,135, 14, 29,138,156,156,156,111,134, 14, 29,234, 94,124,253, 38,159, 63,127,126, 60, 0,240,249,124,176, + 88, 44, 10,122,252,235, 81,157, 22, 41, 43,148,202, 11, 46, 95, 95, 95,175,242,191,149, 21, 85, 21,125, 46,123,236,250,245,235, +215,149,225, 86,212,162,248,213,199,104,249,249,249, 49, 21, 40, 72,157, 81,157,208, 42, 65, 96, 96,160,214,206,206,238, 64, 84, + 80, 92,207,134, 45,157, 32, 18, 11,250, 0,216, 33, 16, 8,230,127,247,221,119,120,254,252, 57,194,194,194, 14,225, 11,103,225, +184,186,186,222, 18, 8, 4,142,149,184, 73,226,195,194,194,250, 86, 50, 48,172,184,122,245, 42,170, 10,134,191,127,255,126,217, + 65,169,108, 48,124,197, 29,131,102,160,213,104, 33,147, 43,254, 26,196,139,133,150, 76, 38,195,168, 81,163, 62,177,104,165,167, +167, 87,123,126, 4, 65, 96,227,149, 43,184,115,238, 28,190,113,115,195,197,151, 47,177,254,187,177,104,234,104, 15,134, 34,192, + 16, 64,194,169,157,200,202, 47,196,201,123, 79,145, 93, 32,199,184,174, 93,225,108,100, 81, 53, 47,151,215,187,125,199, 78,188, +187, 1,111,193,229,114,192, 2, 13, 70, 43,135,157, 75,119,176, 89, 44, 24, 91,215, 7,143,203, 5,151,203, 65,116, 98, 38, 92, + 92,219,241,253,248,194,222,181, 17, 90,117, 28,235,131,162, 40, 76,152, 48, 1,167, 79,159,134,185,141, 35,140,235,184, 98,205, +230,253,248,166, 87,215,106,207,191,228, 9,158,195,225,128,205,102,127,246, 94,242, 89, 23,235, 36, 67, 51,208,148,111, 35,154, + 1, 24, 6, 14,107,215,194, 97,237, 90,188, 44,254,207,102, 50, 25, 20, 10, 5,208,161,121,141, 68,150, 90,173, 70, 98, 98,162, + 38, 53, 53,213,186,130,237,105,106,181,186, 90, 97,115,228,200,145,144,137, 19, 39,182, 53, 51, 51,123, 29, 18, 28,172,109,233, +230,198,189,177,119,233,229, 18,183, 33, 0,184,185,185,101, 47, 93,186,244,242,248, 17, 94,131,119,251,140,166,126, 92,125,140, + 35, 16,137,218,122, 45, 60, 18,114,106,196,136,234,253, 61, 42, 85,108,203,150, 45, 25, 93,206, 75, 46,151,167, 86,177,121, 32, +128, 85,173, 91,183, 54,242,244,244,196,163, 71,143, 48,108,216, 48,149, 70,163,137, 2,128, 1, 3, 6, 52, 62,121,242, 36,255, +237,219,183,176,180,180,228,198,199,199, 31, 70, 53, 1,242,124, 62,191,123,187,118,237, 88, 42,149,234, 51,145,181,126,253,122, +140, 25, 51, 6,141, 27, 55, 6, 77,211, 40, 44, 44,132,167,167, 39,119,251,246,237,221,117, 20, 90,115,154, 54,109,186, 17, 69, +179, 14,203,222, 11, 35, 80,228,214, 66, 86, 86, 86,106,208,139,123,225, 93,123, 13,109, 91,175,145,171,109, 88,200,155, 42, 9, +173,172,172,150,176, 88,172,145, 52, 77,179,243,243,243, 19,131,212,234, 70,205, 28, 29,173,187, 12, 30,140, 60, 46,151,189,237, +222, 61, 86, 90, 65,129, 4,128, 78, 46, 72,165, 86, 6, 71,167,162, 80,191, 97,163, 6,227,205,155, 55, 24, 62,122, 8,120, 60, + 30, 56, 28,110,209,181,201, 43,178,104,153, 88, 24,233,212, 55,181, 90,109,233, 61,188, 36,206, 75,163,209,160, 36, 52,203,192, +192,160,116,155, 74,165, 2, 65, 16, 85,245, 13,231,179,171,151, 91,137,140,140, 65,105,181,104, 62,120,120,105,159,126,113,112, +183, 8, 52, 45,202,141,143,197,172,115, 87,185,208, 67,143, 74,172, 90, 85,105,145,178, 66,233, 75, 65, 16,132,159,143,143,207, + 82, 0,140,143,143,207,210,146,239,190,190,190, 10, 0,201,181, 20, 91,159, 89,185, 56, 95, 67,100,149,184, 23,170,130,167,167, +231, 44, 67, 67,195,237, 37,223, 19,159, 39, 35,241,121, 50, 92,154, 52,239,210,218,173,109,222,152, 49, 99, 96,110,110,142,133, + 11, 23, 50, 0, 14,213,244,255,163, 35,195, 37, 0, 24, 91, 91,219,133,197, 55,100,183,151, 47, 95, 90,190,122,245, 10,237,218, +181,251,203,116,175,209,192,221,221,189, 42,170,130,226,160,246,121, 95,207, 74, 70, 67,163,209, 64, 46, 87, 64,173,214,128,212, +210, 32, 73, 18,109,154, 27,226,216,126,159,162,223,200, 18,235, 89,145,213,204,193,198, 16,134, 18,174,150,197, 34, 20,175, 67, + 82, 43,188, 99,170,213,106,132,196,199, 35, 56, 46, 14, 0, 48,200,183,234,192,215, 99,247, 30,161, 89,179,102,213,149,182,161, +131,157, 13, 82,238,132, 20,221,188, 21,137,120,245,228, 44, 12, 13, 37, 0,128,230, 30,227,192,227, 21, 9, 45,153, 66, 3,139, + 38,117, 64, 48, 76,165,105, 1, 12, 76,109,110,113,120, 66, 71,134,162,193, 48, 52, 24,154, 2,195,208, 96,115,121, 6,179,102, + 76, 6, 77, 83,104,223,190, 61, 8, 54, 27,148, 86,133, 17, 3,123, 35, 39,175, 0,230, 38,186, 13, 18, 60, 30, 15, 30, 30, 30, +162,202,182,127,248,240, 65, 81, 86,152, 85,221, 70, 90,200,100, 10,168, 84, 42,104,212, 36, 52, 90, 18, 84, 3, 30,126,253,121, + 44, 72, 13, 9,249,232, 78,208,104, 73,208,115,135, 64,163,214, 34,193,128,197,106,233, 98,161,101,129, 80, 4, 69,100, 24, 85, + 39,180, 74,196, 65,101,168, 40, 38,176, 18,177, 21, 60,113,226,196, 54, 45,221,220,222,140,236,229,182, 41, 52, 44, 60, 37, 52, + 44,252,179,253, 28, 27,187,197,254,184,254,244, 2, 46, 79,212,198,107, 97,213,179, 14,203,162,172, 27,241, 11,177,180,160,160, +160,165, 68, 34, 65,100,100, 36,216,108, 54, 8,130,248, 0,160, 37, 0,216,218,218,126,228,112, 56, 78,108, 54, 27,187,118,237, + 34, 56, 28, 78,139, 78,157, 58, 45, 85, 42,149,103,171,120,160,115, 49, 52, 52,252,196,154,197,227,241,224,227,227,131,241,227, +199,151,138, 44, 30,143,135, 35, 71,142,160,109,219,182, 80,171,213, 46, 58,150,247, 21,128,174, 58, 88,252,136, 98,113, 94,173, + 24, 37, 73,114, 98,214,200,145,141,224,239,143, 46, 78, 78,205,218,180,105, 3,141,230, 47,131,166,147,147, 83,157,130,130,130, + 84,133, 66,113, 2, 69,169, 13,130,170, 20, 69, 74, 26,241,209, 69,225,167,111,222,188, 65,251,246,237, 75, 45, 88,101,173, 89, + 60, 30, 15, 34,190,164, 70, 66,139,166,139,238, 75, 5, 5, 5, 44,127,127,127,139,166, 77,155, 18, 0,208,180,105, 83, 34, 40, + 40,200,204,192,192, 32,179, 97,195,134,213, 62, 0,139,140,140,113,100,226, 40, 0,192, 47,189,250,149, 62, 24,221, 92,181, 20, + 92, 46, 23, 61, 23, 46,253,172,223,211, 52,205,134, 30,122,145,165,131, 22,249, 90, 34,171,188, 69,203,215,215, 55,220,215,215, +247, 51,235, 88, 13, 81,189, 69,171,172,233,174,166, 40,185, 88, 43,195,230,205,155,209,162, 69,139, 42, 7,162,237,219,183,227, +248,241,227,155, 1, 68,215,216,228,216,179,117,115,108,185, 20,238,212,184, 57, 1, 0,171,231, 14,100,201,100, 50, 60,125,250, + 20,198,198,198,248,240, 65,231,180, 95,134,198,198,198,171, 88, 44,214, 8,118,249, 25, 0, 21, 11, 76,138,166,233,115,121,121, +121,149,166,119, 96, 24, 64,163, 37, 33,147, 43,161, 86,171, 49,247,167,157,213, 22,194, 23, 32, 52,234, 2,142, 71,183, 78,162, +202, 44, 58,237, 91,116,199,204,239, 36,159, 13,222,108, 22,192, 98, 1,173,218, 23, 89, 92,130, 94,134,131,166, 1,138, 6, 44, +172, 76,113,232,212,166, 42, 69, 62, 73,209,197, 79,199, 20, 10, 85, 20, 92, 58,122, 33, 41,194,191,212,130,196,231, 21,185,140, +121, 92, 46,104,134, 40,202,250, 80,153, 16,226,139, 28,115,164,209,206,251,253, 66, 49,205,171, 5,206,223, 13,193,240, 94, 45, +241,224,197, 91,120,118,104,134,240,168, 56, 52,119,174,135, 93,135,207,129, 97, 80,176,103,203,154,212,191, 6, 52, 50, 94, 23, +139,214,243,231,207, 21,229,173, 88,101,223,153,234,199, 67, 48,204, 95, 22, 45,133, 82,133,133, 75,116, 74,231, 83,212, 70, 93, + 59,138,116,217,185, 42,139,149, 46, 66,172,188,101, 11,213,164,103,105, 0,160, 45,176,248,255,243,198, 73, 81, 20,174, 93,187, + 86,218, 30, 21,181, 99,217,182,211, 65,228, 32, 62, 62, 30,225,225,225,232,216,177, 35,242,242,242,192,101,177,176, 32, 52, 20, +205,190,251, 14,106, 30, 15, 52, 77,131,207,231, 99,250,244,233, 58,215,103, 13,239,206,197,193,220, 84,117,228,155, 58,117,234, +212, 40, 82, 38, 67,248,187,119,232,181,114, 37, 0,224,250,245,235,159,244,137,249,243,231,243,223,190,125, 59,229,245,235,215, + 83, 82, 82, 82, 54, 3, 88, 80,233,125,150, 81,149,198,104,141, 28, 59, 12,141,154, 54,192,241, 63, 78,149,110,159,191,104, 14, +184, 92, 30,184, 60, 46, 76,140, 77,116, 58, 27,173, 86, 91, 42, 90,229,114, 57,235,250,245,235, 14,189,123,247,230,205,153, 51, +135, 0,128,227,199,143,179,118,236,216, 33,190,115,231, 14,207,222,222, 94, 90,173,184,212,104, 62,107, 99,130, 32,192,229,114, +193,227,243, 0,154, 6, 65, 16,226, 13, 27, 54,172, 14, 15, 15,111,215,180,105, 83,168, 84,170,239, 80, 52, 81, 67,159, 71, 75, + 47,182,170,212, 34, 21,197, 90, 21, 91,165, 42, 67, 70,217,184,173,202,132, 90,217,152, 45,212,110, 82,134,110, 49, 90, 21,129, +205,102, 87,107,173, 98,177, 88,213,186, 14,231,207,159, 15, 67, 67,195,202, 6, 32, 38, 52, 52,244,173, 84, 42,221, 15, 96,103, +173, 26,231, 94, 96,248,170,121, 67, 10, 80,236, 91, 53, 49, 49,201,236,209,163, 71, 33, 0,205,217,179,159, 62, 32,171, 84,170, + 74, 7,112, 99, 99,227, 85, 7, 15, 30,156, 61,120,240, 96, 86,249, 20, 3,101,221,123, 37, 47,173, 86,139,179,103,207,206, 94, +188,120, 49,242,242,242,230, 85, 53,136,203,101, 10, 40,138, 3,161, 63,134,157,215,245,166, 94,233, 38,137,137, 45, 28, 26,180, +172,116, 48, 97,241,138, 98,136,172,235,254, 53,128, 25, 26, 10, 65, 85,193, 73, 16,172,232,184,132, 20,251, 58, 54,102,248,152, +152, 1,235,122, 45,144,147,252, 87, 61,112, 56,108,112,139, 93,135, 38, 70, 98,100,164,167,131,197, 98, 87, 41,140,215,156, 12, +196,139,176, 56, 92,184, 27, 4,141, 82,134, 45, 71,111, 66,163, 42,132, 70, 41,131, 70, 89,244,190,110,241,247, 32, 8,164,106, + 85,178,198, 53,105,119, 14,135,131, 14, 29, 58, 84, 42,116,146,147,147,117,180,104, 49,165, 22, 45,133,178,134,109,164,219,147, + 83,149, 22,171,146,237,181, 21, 6, 37, 41, 31, 68, 34, 81,219, 35, 71, 42, 79,227, 80, 17,108,108,108,110, 72, 36,146,250,186, +238, 95,131,228,165,235, 76, 76, 76, 86, 53,109,218,212,101,203,150, 45, 92, 54,155,141,158, 61,123, 54,182,177,177,137, 7,128, +230,205,155,219,149,220, 99,126,252,241, 71,230,249,243,231, 97, 69,207, 24,149,131,207,231,191, 51, 54, 54,110,235,233,233,137, +188,188, 60, 36, 38, 38, 66, 44, 22,163,217,166, 77, 8,253,241, 71,184,237,221, 11, 86,143, 30, 32, 8, 2,124, 62, 31,161,161, +161, 16,137, 68,239,148,202, 74, 83,190,117, 0,240, 59,128, 46,248,203, 93,200, 0,120,138,162,180, 11, 47, 42,184,223,177, 0, +128,162,233,234, 26,107,236,194,133, 11,145,203,229, 2, 3, 6,128, 23, 29, 13,141, 70,131,142, 29, 59,150, 90,217, 59,118,236, + 8, 14,135,131,150, 45, 91,194,206,206, 14,187,118,237, 26, 91,149,208, 82, 22,106, 16, 31,157,132, 78,157, 58,149, 90,174, 6, + 12, 24, 80,106,209,226,114,185,165,150, 45,130,170, 94,184, 18, 4,193,148,125, 72,166, 40,138,224,112, 56,156,121,243,230, 17, +195,134, 13, 99,212,106, 53,205,231,243, 89, 23, 46, 92, 32, 30, 60,120,192,145,201,100,213, 62,136,187, 14, 25,129, 95,122,247, + 47,186,246,235, 91,130,203,227,130,207,227, 97,225,187,164,210,118, 49, 58,114,154,191,126,253,250,225, 77,155, 54, 45,114,195, + 3, 28,125, 30, 45, 61,170, 49,244,100,148, 19, 73,234, 50,223, 51, 0, 16,197,223, 51,202, 8,170, 12,130, 32, 94, 49, 12,211, +174,220,190, 37,219,213,229,222, 75,182, 7,215,162,248, 37,107, 29,126, 38,190,170,122, 34,142,122,246,236,153,115,155, 54,109, +144,144,144,240,217, 76,184,146,129, 75, 44, 22, 67, 36, 18, 33, 32, 32, 0, 0,162, 42, 35,123,240,224,193, 14, 20,101, 93, 46, + 42,145,173,109, 39,207,145,221, 3,218,247,107,135,147,190,167,242,164, 82,105, 75,252,149, 67,135,176,179,179, 27,207,229,115, + 70, 57,185,214,245, 0, 77,255,126,239,234,211,149, 85,157,161, 83,227,230,133, 0, 20, 37,179, 14,107, 57,251, 16, 44, 22,107, +196,224,193,131, 89,111,223,190,197,168, 81,163,112,252,248,241, 74,247, 29, 63,126, 60, 78,159, 62,141,193,131, 7,179,150, 44, + 89, 82,105,122,135, 79,173, 37,234,175,214, 41, 35, 63, 4,227,216,233,131,149,198, 32, 89, 89, 21,197, 99,165,167,103,150,254, +214,174, 77,213,158, 17,154, 84,223, 9,124,253,178, 83,231,110, 61,121,137,105,185,160, 73, 21,148, 5,127, 29, 47,207, 77, 3, + 67, 42,193, 51, 48,131,141,133, 49,222, 60,187,173,214,168,149,119,170,226,156, 61,184, 57,126, 28,232, 2, 48, 52,134, 44, 56, + 4,191,157,179, 74,159,160,221,135,205,193,189,179,219,116,142,241, 43, 15, 46,151,139,208,208, 80, 69,101,214, 44, 54,155,173, + 75, 78,174, 98,171,163, 22,114,185, 2,114,133,242,107,222, 59, 44,173,173,173,247,152,154,154, 10, 43, 17, 82,150,150,150,150, +123,204,205,205,133,186,186, 14, 43, 19, 89,197,121,181, 94, 79,156, 56,177, 70, 98, 75, 32, 16,212,143,138,138, 42, 77, 86, 90, +213,187, 90,173,134,167,167,167,174,201, 75,175, 2,136,177,181,181,125,218,172, 89, 51,227,143, 31, 63,226,212,169, 83, 60, 46, +151, 91,183,228,254, 81, 80, 80, 0, 54,155,141,244,244,116, 45,128,201,168,198,117,166, 82,169,252,253,253,253, 91, 13, 28, 56, +144,253,238,221, 59,176,217,236,162,114,117,234, 4,183,189,123, 17, 54,111, 30, 60,226,226,160,212,104, 32, 20, 10,113,235,214, + 45,141, 92, 46,247,175,140, 79, 36, 18,237,143,141,141,109, 46, 20, 10,161,209,104, 64,211, 52, 88, 44, 22,193,225,112,220, 77, + 76, 76,182, 3,104, 87,174,177,172,220,218,121, 54,161, 72,146,146, 38,124,204,168,174, 2,178,178,178,112,245,234, 85,116,236, +216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, 13, 27, 86,111,209, 99, +105,209,176, 73,125,240,120,188, 34, 11, 17,151, 87,252,224,195, 45,181,100,241,184, 60,112, 57, 92, 8, 69, 66,157, 45, 90, 4, + 65,128,197, 98,129, 32, 8,136, 68,162,146,135,108,218,193,193, 65,154,157,157,109, 11,128, 45, 18,137, 64, 81,148, 78, 15, 45, + 37, 99, 68,137,200,226,241,121,165,150, 45, 0,200,205,205, 85, 14, 30, 60,248,132, 74,165,154,132,218,173, 80,162,199,191, 12, + 4, 65,188,250,255, 56,182, 6, 24, 80, 44,172, 62, 11,138,175,170,131,127,211,185,115,231,189, 99,198,140,233,185,117,235, 86, + 72, 36, 18, 72,165,210,210, 1,145,207,231,163, 78,157, 58,200,206,206,198,190,125,251,144,148,148,116, 31,192,116, 93, 75, 36, +149, 74,159,127, 8,138,202,242, 28,222,217,188,121,231, 38, 38,137, 81, 73, 29,165, 82,105, 64,177,200, 58, 52,102,254, 55,147, + 60,135,182, 7,143,207, 69,226,135, 84,220,187,250,244, 63,210,152,108, 54,155, 77, 16, 4, 70,141, 26,165,211,254,163, 71,143, +134,191,191, 63,170,114, 51,210, 37, 22, 45,185, 18, 50,197,215,123, 88,155, 57,107, 60,102,206, 26, 95, 42, 38,116,113,189, 0, +128,157,221,153, 42,132,150,102,171,223,153,125,211, 90,183,239,228,216,182,121,125,188,120, 29,132,147,123,255, 50, 50, 28,222, +177, 26,191, 29,190,143, 58,214,166,208,168,100,184,113,254, 64,170, 70, 37,223, 90, 75,163, 92,145,184, 37, 8, 48, 12, 93,163, +115, 47, 17, 79, 92, 46, 23,174,174,174,149, 90,180,178,179,179, 21,213, 13, 12,165,109,164,214,162, 80,166,128, 66,254,213,132, +150,155,187,187,251,157,115,231,206,153, 91, 89, 89, 33, 37, 37,165,188,208,114,235,210,165,203,157,115,231,206,153, 91, 91, 91, + 35, 49, 49, 81,231,180, 34, 21,136, 44,100,100,100, 16, 57, 57, 57,180,169,169,105,141,196, 22,139,197,130, 74,165, 66, 68, 68, +132,174,127,171,243, 12, 49, 99, 99,227, 35,167, 79,159, 54,206,204,204, 4,155,205, 70, 68, 68,196, 39,179, 14, 75, 94,135, 14, + 29,226, 13, 25, 50,228, 96,110,110,110,149,211,218, 72,146,220, 60,126,252,248, 41,201,201,201,166, 86, 86, 86,144, 74,165,224, +243,249, 96, 24, 6,132,167, 39,186,198,196, 64, 67, 81, 16,137, 68,136,140,140,196,254,253,251,101,197,169, 98, 42, 52,144, 17, + 4,225,204,227,241, 48,110,220,184, 79, 54, 28, 61,122, 20,131,218,178,219, 90, 26,115, 10, 73, 8, 85,105,162,254, 55,216,108, + 54,225,214,161, 71,227, 14,221, 6,184,190, 15,123,241, 49, 35, 45,169,186,155,146, 86,173, 86,163,105,211,166,120,245,234, 21, +238,222,189,139, 30, 61,122,192,195,195, 3, 33, 33, 33,184,125,251, 54, 2, 3, 3, 65, 16, 4,204,205,205, 75,194, 47,170,140, +193, 80,203, 73,164,167,100,125,102,189, 42,255,157,199,227, 65,165,208,232,212, 70,239,222,189,195,171, 87,175, 74, 83,203,176, +217,108,242,187,239,190, 3,195, 48, 76,108,108, 44, 12, 13, 13,153,137, 19, 39, 82, 28, 14,135, 76, 78,214, 45, 62,184, 68, 84, +149,136, 44, 14,143,251,137, 64,163,105,186, 32, 36, 36,100, 26,128,144, 98, 75, 22,160,207,163,165,199,255, 54,174,225,243,133, +165,171,181,104,197, 0,232,117,234,212,169,177,151, 47, 95,222,188,125,251,118, 75, 47, 47, 47,228,228,228,192,209,209, 17,182, +182,182,240,243,243,195,245,235,215, 51, 41,138, 90, 0,160, 34,211, 79, 47, 84,145,179, 38,249,163,244,156,170,176,240,199, 54, + 30, 46,184,127,246,177,175,141,141,205,116, 54,155, 61,119,226,210,111, 39,117, 31,220, 14,145,129,177,120,126, 59, 20,105, 9, +153,213,114,150, 15,134, 55, 49, 49,153, 98, 96, 96,192, 7,160,169,224,169,184,252,172,195, 82, 78,138,162, 40,181, 90,141, 51, +103,206,232, 36,182, 78,157, 58, 5,165, 82, 9,234,115,255,106, 41, 39, 67, 51, 4,135, 43,128, 93,157,166,208,104,100,160,233, + 90, 79,168, 44,229, 44,121, 2,253,200,231,195, 42, 51, 19, 47, 94,188,208, 77,114, 15, 24, 80, 93, 27, 41,213,202,130,113,219, +214, 46,244,243,246,249,221,164, 71,231, 86,248,101,211, 81,104, 52,135,193, 98,179, 32, 18,240,208,166,125, 23,176,161,194,158, +245,139,114,229,249, 57,227,240,249, 82, 60,159,112, 50, 85,121, 88, 24,128,162,105,220,125,244, 82,231,115, 47, 29,237, 41, 10, + 28, 14, 7, 31, 62,124, 80, 84, 52,219,144,205, 46,114,115,150, 60,169, 87,197,201,208, 52,193,229, 9, 81,199,177, 25,212,170, +194,175,210, 70, 86, 86, 86,139, 46, 93,186,100, 94,146, 42, 33, 36, 36, 4, 4, 65, 68,252,101,113, 44,218,174, 80, 40, 16, 22, + 22,134,144,144, 16,160,104,134,155,206,215, 81,137, 37, 43, 35, 35,131,144, 74,165, 48, 48, 48, 96,133,132,132,168, 90,182,108, +249,186,154,235,187,148, 83,169, 84,198, 85, 22, 63,169, 84, 42,237,133, 66, 33,183,220, 32,106,215,168, 81,163,200, 10, 92,136, +159,149, 51, 47, 47,239,197,226,197,139,219,244,235,215, 15,139, 22, 45,202, 54, 53, 53, 53,220,179,103, 15,135,205,102, 19,222, +222,222, 84,122,122,122,225,129, 3, 7,140, 47, 95,190,140,220,220,220, 0, 29,206,189, 64,169, 84, 78,235,220,185,243,209,155, + 55,111, 26, 56, 59, 59, 35, 63, 63, 31, 12,195,224,200,145, 35,240,246,246,134, 80, 40, 68,100,100, 36, 6, 13, 26, 36,151,203, +229,211,240,121,236,100, 9, 39, 65, 16, 4, 67,211, 52,150, 47, 95, 94,154,156,180, 36, 89,169,161,136,192,254,249, 13,196,115, + 14,228,137,199,254,114,224, 59, 0,160, 72,146,122, 31,246,226,227,145,157,191, 60,224,241,120,143,170,105,163,101,115,230,204, +217, 51, 96,192, 0,145, 68, 34, 65,118,118, 54,158, 62,125,138,103,207,158,225,249,243,231, 80,171,213, 48, 55, 55,135,169,169, + 41,164, 82, 41,222,189,123,167, 0,176,172, 42, 78,190, 1, 23, 78,141, 75,102,254, 22, 89,176,184,101,102, 27,150,181,110,241, +184, 92,157,174,163,110,221,186,161, 67,135, 14, 37, 2,136,138,143,143,151,170, 84, 42,162,140,232, 79, 46, 17,228,117,235,214, + 37,143, 31, 63,206, 84,197,249,124,255, 46,220,252,117, 25,248, 60, 30, 22, 68, 36,150,138,174,163, 61, 90,131,203,231,193,101, +224,176,178,199,238, 70,145,187, 16,229, 68, 86, 85, 99,199, 23, 95,155,122,206,255, 90,206,255,101, 72, 81,139, 37,120, 74,112, + 82,169, 84,222,248,254,251,239,215,187,185,185,125,191,101,203, 22,130,199,227, 97,229,202,149, 76, 74, 74,202, 31,197, 79, 33, + 57,181, 41, 21,195, 48,127, 60,188, 24, 48, 99,130,207, 96, 98,254,214,137,238,175,239,133,189,107,209,217, 25, 45, 58, 59,227, +245,253,183,216,185,244,212,113, 74, 75, 45, 79, 77, 77, 77,168,134, 74,213,171, 75,147,242,193,240,230,254, 15,238,153,215,116, +214, 33, 77,211,231, 78,157, 58, 53,123,232,208,161,172,151, 47, 95,126, 22,147, 85,178,236, 14, 77,211,184,115,231, 14, 52, 26, + 13,254,248,227, 15,154,166,233,202,243,104,129,185,178,109,235,250, 9,127, 28,187,194,231,243, 8, 60,123,116, 1,121, 57, 85, +207,234,226,241,184, 56,116,228,162,134,199,227,190,175,104,187, 70,163, 73,188,119,239,158,117, 95,138,226,178, 88,172,138, 4, + 84,133, 56,119,238,156,150,166,233,248,106,118, 11, 72, 75, 74, 24,184,102,209,228, 83, 3, 70,126,111,221,185,179, 59,215,194, +202, 26, 4, 65, 32, 61, 45, 29,145, 97, 47,181, 55, 46, 28, 76,147,201,117, 91,130,103,242,198,135,165, 49, 89, 0,224,229,189, +189, 52, 62, 11, 0, 6, 78, 92, 12,207,142,205, 65,232, 98,122,250, 75,100,209, 36, 73, 66, 44, 22,131, 36,201, 10, 83, 60, 24, + 27, 27,139,148, 74,165,162, 56, 17, 99,149,166, 34, 6,248,234,109, 68, 81,148, 75, 78, 78, 14,100, 50, 25,158, 61,123,198,172, + 93,187, 54, 35, 35, 35,163, 52,104, 83,171,213,186,100,103,103,163,176,176, 16, 1, 1, 1,204,250,245,235, 51,178,178,178,150, +214,228, 26, 18,137, 68,109, 57, 28,206,235,156,156, 28,218,192,192,128,165,213,106,181, 45, 91,182, 20,136, 68, 34,157, 23, 84, +151, 74,165,253, 42,219,230,228,228, 20, 21, 21, 21,213,136,162,168,178,107, 32,242,148, 74,165,115,231,206,157,117,185,127,204, + 57,124,248, 48, 46, 94,188,216, 62, 63, 63,127,124,124,124,252, 81, 0,237, 57, 28, 14,130,130,130, 34,148, 74,229,152,161, 67, +135, 30,201,201,201,121,129,162, 37,120,116,193,205,200,200,200,113, 46, 46, 46,135, 87,173, 90, 37,241,240,240,224,216,217,217, +161, 93,187,118,136,140,140,196,181,107,215,180,187,119,239,150,201,229,242,201, 0,238, 84,221,236, 32, 72,146, 4,159,207, 47, +125, 9, 4, 2,240,120, 60, 20, 40, 24, 76,221, 20,173, 32, 33, 82,108, 94, 57,237, 26, 3, 16,169,137,209,153,233,169,137, 47, + 8,130,120, 36,149, 74,243, 42,169, 51,190, 82,169,108,197, 48, 12,155, 32,136,173, 26,141,102,226,172, 89,179,108,215,173, 91, +135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,200,192,203,151, 47, 41,185, 92,190, 23,192,106, 20,199,143, 84, +134,220,204,124, 56,216,212,253,196,242,201, 48, 12, 24, 10,208,170, 40, 80, 26, 6,106, 66, 11, 46, 87, 11, 30,143,167,139,229, +137,161,105, 26, 57,182,182,160,195,194,240,252,249,115, 48, 12, 83,169, 85,173,105,211,166, 58,220,216,105,240, 5,252, 79,220, +133, 4, 65,128,199,231,131,203,231, 85, 52,115, 70,111,197,210,227, 31, 13, 93,125,227,185, 0,166, 7, 7, 7, 31,237,222,189, +187, 31,195, 48, 92, 20,249, 35, 31,127,201,159,167,166,166,190, 9,184,246,102,137,181,131,233,250,254,227,221,209,164,149, 35, + 40,146,194,211,235, 65,248, 99,221,229,211,201,137,201, 19,161,195,218,103, 52, 77, 63,232,210,182, 9, 11,101,114,117,219,217, +217,209,181,153,117,152,151,151,183, 98,193,130, 5, 88,180,104, 81,109,102, 29, 86,136,208,119, 25,211, 9, 48, 14, 3,251,119, +237, 11,130,197,168,213,170, 42,110,124, 40,205, 92,202,227,113,223,191, 10,145,182,172,104,191,140,140,140,190,147, 38, 77,186, +195,225,112,234,215,164,206,105,154,142, 79, 75, 75,235, 89,253,158,228, 83,149, 34,223,249,234,233,125,243,110, 94, 60,220,151, +166,169,134, 4, 0, 54,135,247, 81,171,209,220, 82, 41,242,183, 64,199, 69,165, 55, 76,239,132, 57,219,110, 99,215,162,129,152, +181,254, 44, 14, 46,159,138, 37,155, 78,225,247, 69,115,176,118,251, 9,252, 50,103, 28,134,143,157, 68, 51, 4,235,137,174,231, +193,102,179,111,238,219,183,111,194,212,169, 83, 75, 39, 45, 48, 12,243,201,141, 93,171,213, 42,104,154,198,222,189,123,105, 0, + 55,171,226,251,180,141, 8,166,170,120, 41, 93,219, 40, 63, 63,127,114,167, 78,157,142, 0, 16, 48, 12,243, 33, 39, 39,231, 7, +224,175,165,161, 10, 11, 11, 39,119,238,220,249, 8,195, 48, 2,130, 32, 62,219,174, 11,138, 83, 61,180, 53, 53, 53,125, 93,108, +201, 18,212, 38, 32,190,170,170,174,194,173,168,139, 11,145, 6, 48,171, 76,198,247,117,237,219,183, 47,187,168,116, 68, 78, 78, + 78,219, 90,148,235,142, 66,161,104,190,124,249,242,121, 66,161,208, 83, 46,151, 55, 6, 0,177, 88, 28,169, 82,169, 30, 40, 20, +138, 45,168, 62, 55,149,154,166,233, 72,146, 36, 93, 45, 45, 45,139,102,212, 22,139, 45, 0,248,243, 53,245, 26,160,218, 21, 25, +197, 79,234, 92,176,235,215,175,215, 51, 53, 53,237, 67, 16,196,112,134, 97,154, 22, 20, 20,168,150, 47, 95, 30,112,238,220,185, +188,250,245,235,247, 31, 48, 96, 0, 97,102,102,134, 87,175, 94, 49, 89, 89, 89, 23, 0, 44,133, 14, 51,173,105,154,142,223,176, + 97, 3,106,122,189, 87,181, 93,163,209,164, 94,191,126,221,162, 95,122, 58,135,166,105, 12, 28, 56,240, 19, 1, 87, 30,239,223, +191,135, 74,165,170, 50,153,163, 42, 47, 7, 61,230, 45, 6,138,103,127,150,160,200,146,197,128, 81,235,117,149, 30,255, 46,252, +221, 11,122,234,100, 90,180,181,181, 29, 37, 20, 11,102, 58, 54,182,109,153, 18,157,254,182, 32, 79,126, 92, 42,149,238,171,228, + 70,174, 19,103, 13, 19,150,234,205,191,127, 19,231, 95,121,180, 40, 48, 12, 5,134,102,192, 48, 52,104,154, 42, 90,240,154,161, +193, 80, 20, 65, 16,120,162, 86, 84,153, 25,188,124, 57, 77, 45, 44, 44, 86, 51, 12,211,143,205,102,179,202, 26,195,202,126, 46, +182,100,221,204,200,200,248,165, 2,203,235,255, 92,125,158, 59,119,174, 66,241,175,235,172,195, 17, 35, 70, 80, 53,188, 54, 31, +136,197, 98,219,138,182,201,100,178, 4,169, 84,218,231,191,164, 62,203,206, 24,172, 9,103,141,103, 29, 86,199,233,232,232, 40, +208,104, 52,173, 1, 56, 19, 4, 97, 2, 32, 91,163,209,220,202,204,204, 76, 3,208, 22,192,242,226, 99,126, 5,240,250,255,249, +122, 23, 89, 88, 88, 28,102,177, 88, 14,186, 28, 76,146,164, 58, 59, 59,123, 66,185, 7,130, 82, 78,115,115,243,215, 28, 14,199, + 65, 7,158,164,172,172,172,182,250,251,167,158,243, 31,132,242, 65,240,211, 24,134,217,255,159,248,227, 94,122, 78, 61,167,158, + 83,207,169,231,212,115,234, 57,245,156,255, 2,161,133,114, 66, 11, 12,195,232,167,213,234,161,135, 30,122,232,161,135, 30,122, +124, 33,174,149, 19, 91,215, 74, 62, 16, 85,168,210,154,152, 4,107,163,108,239,234, 57,245,156,122, 78, 61,167,158, 83,207,169, +231,252,215,113,254, 43,240,183,172, 76,241,149, 26, 72,207,169,231,212,115,234, 57,245,156,122, 78, 61,231,191,143,243,127, 25, +149,186, 14, 89,250,186,209, 67, 15, 61,244,208, 67, 15, 61,244,248,123,160,179,208, 18, 91, 55,117,177,112,108,121,196,212,161, + 69,136,169, 67,139, 16, 11,199,150, 71,196,214, 77, 93,254,165,245, 38, 2, 48,150,195,225,220,177,177,177,201, 71, 37, 75,239, +252, 3, 96, 4, 96, 56,138,242,251, 12, 1, 96,240, 53,201, 61, 0,206, 40, 96,230,119, 64,194,119, 64,194, 40, 96,166,199, 63, +112, 57,142,149,179,109, 59, 61,186, 49,246,198,202,217,182,157, 42,220,190,192,214,252,249,237, 17,219,214,205,180, 51,251, 74, +127,105,104,101,101,181,223,218,218, 58,206,202,202, 42,222,202,202,234, 48, 0, 99,253,237, 78, 15, 61,244,208,227,111, 67, 73, +140, 86,201,171, 52, 70,139, 3, 0,126,126,126, 30, 0, 30, 2,232,238,229,229,229, 95,254,104,211,186,174, 83, 27, 54,104,184, +104,205,202,165,132,141,149,133, 1, 73,209,154,216,184,196,102, 43,214,172, 63,159,194,231,108,206, 73, 8, 59, 88,139, 66, 17, +108, 54,123,148, 64, 32,240, 2, 80, 34,216, 34, 84, 42,149, 31, 69, 81,103,160,219, 52,109, 88, 91, 91, 63, 98,179,217,245,106, +242,199, 20, 69, 37,164,165,165,185,215,178, 50, 71,212,173, 91,247,176,135,135,135, 65,251,246,237,193,231,243,177,124,249,242, + 5, 82,169,116,139,174, 4,166,166, 78,134, 26,129,112, 46,135,207,239,205,104,213,174, 12, 24,128, 37, 8,163, 73,213, 61,158, + 74,181, 57, 39, 39,186, 64, 71,170,165, 0, 38, 22,215,213, 65, 0, 27,190,164,151, 76,104, 5,173,150, 42,234, 19, 60, 14,168, + 43, 49,198, 15,151, 45, 91,198,241,242,242,194,193,131, 7,221,247,239,223, 63,173,160,160,224, 30,128, 63, 1,124,252,210, 94, +105, 13, 76,239,236,238,190,109,194,130, 5,108,197,163, 71,216,118,248,240, 86, 20,229, 91,218, 85,211,190,196,227, 97,184,133, + 5,215,139, 97,208,154, 0, 8, 2, 8,202,200,162,175,107, 52,212, 25,232,144,139,173, 10,140,197,167,211,241, 79,214,148, 32, +239, 35,243,179, 96,160, 75,215,188,143, 15,126, 6,208,191,252,118, 82, 41,156,192,176,235,120, 41,152,192, 68, 0,155,190,176, + 90, 13, 44, 45, 45, 67,174, 92,185,226,208,190,125,123, 14, 0,188,126,253,250, 59, 47, 47,175, 30, 25, 25, 25,174, 0,242,255, +159,110, 66, 66, 14,139, 53,147,207,229,246,166, 40,170, 5, 0,176,217,236, 80,181, 86,123,135,164,233, 93,208, 49, 39,155, 30, +122,232,241,207, 69,117, 90,228,191, 28,149,102,134, 47, 57, 57,166,236,123, 89,136,173,154, 52,235,216,115,216,251,188, 2,185, + 50, 46, 46, 57,103,254,204,181,119,166,205,217,120,121,211, 1,191,235,254, 47, 34,158,187,180,239,243, 86,108,213,164, 89, 37, +212,149,249,112,235,138, 68,162, 55,187,119,239,214, 68, 70, 70, 50,185,185,185,204,251,247,239,153, 11, 23, 46, 48, 51,102,204, + 80,138, 68,162, 55, 0,234,234,194,105,109,109,157,246,254,254,109, 38, 41, 36,144,137,127,253,130,209,106,181,140, 70,163, 97, + 52, 26, 13,243,246,166, 31, 19,242,231, 69, 38,232,194, 25, 70,173, 86, 51,106,181,154, 81,169, 84, 76,131, 6, 13, 82,116, 44, +103,121,216, 53,111,222, 92,237,231,231,199,156, 63,127,158, 89,176, 96, 1,227,230,230, 70, 1,240,214,245,220,197, 86,206,158, +134,246, 45, 51,166,250,236,210, 92, 11,184,197,132,199, 4, 49,225, 49, 81,204,185,187, 17,204,196,133,219, 53,134,246,110, 25, + 98, 43,103,207,234,206,221,212,212,180, 35, 65, 16, 76, 9, 0, 48,245,234,213, 43, 44,251,170, 91,183,238, 39,175, 58,117,234, + 20,214,175, 95,255,163,185,185,121,235,138, 56,199,180, 0,195,188, 61,201, 48,111, 79, 50,203,186,129, 9, 15, 15,127,206, 48, +204,195,146,151, 66,161,120,120,233,210,165,135,223,126,251,237, 67, 0,131,170,168, 39,157,234,243, 59, 32,161,224,202, 21,134, +217,178,133, 97, 60, 60,152, 8,128,249, 14, 72,168, 33,103, 3, 27, 27,110,208,198, 13,211,212, 87,174,252,193,220,184,113,141, +185,126,221,143,185,124,233, 48,179,117,203, 76,141,181, 53, 55, 12, 64,163, 26,112,114, 0,172, 5,176, 25, 69,150,203,200,140, +140, 12, 38, 53, 53,149, 1, 16, 89,252,219,102, 75, 75,203, 77,168,216,250,214,171,172, 37,107, 94, 63,155, 27, 35,251,187, 51, + 5,121, 41,204,200,254,238,204,188,126, 54,159, 88,182,250, 57, 57, 25,206, 26,216, 34, 35,252,245,113,106,214,192, 22, 25,253, +156,156, 12,107, 89,159, 4,138,214, 9,221,125,255,254,125,146, 41, 3,173, 86,203, 28, 61,122,148, 50, 53, 53,253,163, 6,156, +141, 45, 45, 45,227,205,204,204, 34,203,254,104,217,114, 72,231,166, 93,191, 91, 97,222,236, 91,143, 26,148,179,189,144,199, 75, +186,115,118, 15,149,149, 16,202,168, 21,105, 76,222,135, 64, 38, 41,226, 57,115,116,223,102, 45,159,195, 73, 2,208,254, 75,250, + 82, 13,161,231,212,115,234, 57,255, 11, 57,171,210, 34,255,139,248, 44,189, 67,101, 39, 38, 16,240,125, 86, 44, 91, 76,228,102, +229, 42,148,249, 5,106,173, 82,169,100,241, 24,101,232,219,152,116, 22,135,157, 59,111,206,108, 67,159, 37,203,124,100,192, 56, + 29,255,187,174,155,155,219,203,139, 23, 47, 90,153,153,153, 33, 47, 47, 15, 89, 89, 89,120,249,242, 37, 24,134,193,208,161, 67, + 5, 29,218,181,107,253,243,242,229,207,146,146,147, 59,161,242,129,247, 47,241, 98,102,129, 13,238, 69,107,209,254, 18,151, 85, + 52,234, 16, 4,246,143,240, 42,221,103,117, 82, 94,209, 99,181, 80, 88,186, 32,113, 45,208,169,103,207,158, 60, 0,152, 50,101, + 74,126, 65, 65,129,111,177,133, 67,167,149, 86,197, 86,206,158, 22,182,118,126,123,246,110, 16,181,104,232, 12,141,150, 68,124, +106, 10, 56, 92, 19, 56, 56,240, 48,105, 92,111,110,183,206,102, 22,107,127,221,127, 45,149,198, 16,121,102,212,173,202,184, 76, + 76, 76,142,158, 57,115, 6,103,207,158, 5, 0, 68, 70, 70,194,217,217, 89, 92, 93, 25,194,194,194,156, 6, 13, 26,116, 58, 43, + 43,171, 81,117,251,150, 79,140, 47, 16, 8,224,238,238,142,102,205,154,225,202,149, 43,221,139, 45, 91, 95, 4,197,163, 71,144, + 4, 7, 3,254,181,122,120,105,208,166,141,227,243,235,215,142, 91, 92,187, 30,129, 77,155, 14,227,227,199, 34, 67,155,147,147, + 19,198,142, 25,193, 13, 13, 13,104, 62,124,248,216,128,199,143, 63,186, 23, 11,165,234,176,234,192,129, 3, 75,235,215,175,143, +225,195,135,143,104,222,188,185,141,145,145, 17,246,237,219, 7, 91, 91, 91, 39,181, 90,253,225,202,149, 43,118,169,169,169,152, + 61,123, 54,210,210,210, 22, 84, 70,212,189,111,247,159, 5, 3, 93,186, 54,105, 51, 1, 18, 35, 91, 28, 56,117, 6,239,223, 28, +237,170,210, 68,252,204,163,252,199, 43, 24,193,196,140, 4,137, 79,189,182, 30,230,141,154, 15,130, 99,155, 64, 11, 37,245, 56, +230,231,222, 13,214,115,132,202,163, 43, 55, 73,179, 62, 35, 29,126,142,237,154,255,206, 44,236, 14,178,128,149,116,137,192, 42, +181,214, 50, 24,212,173, 91,183,210,134,139,139,139,131, 74,165,130,139,139, 11, 75,173, 86,123,234, 88,175,141,251,244,233,243, +228,250,245,235,230,141, 27, 55,206,200,206,206, 46,221, 96, 99,110,210,215,255,226,214,217,107,183,157,104,122,140, 33,114, 51, + 34, 46,135, 86,195,213,190, 75,199, 54,119,111, 92, 60, 46, 33, 10, 19,193, 55,201, 4,232, 44, 68,159, 62, 4,194,192, 12,163, +102,204,231,120,246,236, 97,223,187,255,176,187,239,163, 62,246, 4,240, 74,255, 92,175,135, 30,255,106,171, 22,243, 79, 59,167, + 82,161,229,229,229, 69, 84,116,130, 52, 67,183,180,182, 50, 23,109,221,120,228, 21, 91,163, 86,139, 77,140,213, 92, 99, 35,154, + 48, 52,102,107,212,218, 66, 71, 39, 71, 62,205,208, 45, 43,225, 47, 63,197,147, 16,137, 68, 23,255,252,243, 79, 43, 46,151, 11, +154,166, 97,105,105,137,216,216, 88,228,230,230,162,160,160, 0, 31, 35, 34, 80,191,110, 29,172,244, 89,108, 59,123,177,207, 69, +185, 92,222, 22,159,186, 17, 63,155, 54, 74,105, 63, 93, 55,186,100, 9,150,207, 30,249,139,127,171, 96,155,174, 83, 81, 99, 19, + 18, 18, 32,145, 72,224,234,234, 42,121,250,244,233,227, 42, 68,214, 39,156,166,166, 78,134,180,128,127,118,247,158,229, 34,141, + 54, 12,111,163,179,209,164,126, 87, 88,155,215, 69, 74,182, 26,207, 95,254,137,176,144,147,104,104, 95, 23,222, 51,122, 8,215, +111, 56,127,134, 71,214,175,155,155, 27,155, 95, 17,103,126,126,190,164, 65,131, 6,168, 91,183,104,221, 51,138,162,240,246,237, + 91, 80, 20, 85,250,189,236,251,145, 11,247, 65,230,199, 99,194,119,223, 33, 43, 43, 75, 82, 17, 39,151, 13,114,254,180,177, 28, + 17, 23,224,139,205,212,133,133,133,165,211, 83, 53, 26, 13,130,130,130,208,169, 83, 39,143,115,231,206, 85,167,138,116,170, 79, + 13,240,251,182, 63,254,216, 62, 46, 47,143, 5, 0, 7, 9,130,214, 48,204,239,186,246, 37, 43, 43,238,133,155, 55,142, 89,176, + 89,239, 96,102,252, 27, 94,190,140,135, 70, 83, 84,222,172,172,116,204,154,153, 15, 30,215, 16, 87,174,156, 48,119,113,113,191, +144,154,170,113,197,167,110,196,138,202, 41,188,113,227, 6,102,205,154,133,183,111,223,218,177,217,108,188,120,241, 2, 34,145, + 8, 27, 55,110,100,187,184,184,216,137,197, 98,220,188,121, 19,105,105,105, 68, 85,229,124,120,235,225,154,188,143, 15,126, 78, + 37,110,246, 59,112,234, 12,190, 31, 51, 10, 54, 76,244, 99,227,134,196,154, 62, 3,187,252,194,176,235,120,137, 13, 91,154, 58, +187, 14, 4,143, 47,129,247, 79,171, 17, 25,118,213, 84, 94, 16, 50,147,160, 18,235,172,220,116,110,206,103,229, 60, 63,130,154, +114,242,105,155, 59,117, 95, 57, 6, 7, 77,123, 33, 13,220, 31,242,151,208,114,226, 16, 44,202,184,228, 73,234,195,135, 15,248, +248,241, 35, 56, 28, 14, 20, 10, 5, 72,146,172,176,156,118,118,118,211, 73,146,252,165,184,157,143, 8,133,194,201,199,143, 31, + 55, 47, 43,180, 45, 91, 14,233,108,110, 40,238,153,150,158,149, 19,240, 42,252,253,252,233,195,187, 63,122, 30,150,168,225,126, +155,144, 23,114, 37,175,146,250, 20,138,248,252, 11, 55, 47,157,144,104, 99,238, 67,236,210, 29, 92,137, 51, 40,109, 50,228, 57, + 50, 20,124,148, 66,181,103, 39, 90,205,156,135,171,151,207, 75,154,183,104,123, 78,165,213, 58, 3, 80,215,226,218,172, 9,244, +156,122, 78, 61,231,127, 39,103,165, 90,132, 97,152, 54, 0,172,139,191,102, 21,235, 2, 11, 0,153, 40, 90, 69,198,186,248,222, +193, 47,115, 88,249,239,101,247, 45,255,189,236,231,172,226,207, 86,197,239,175, 8,130,200,174,166,232,182, 40, 90,154,240, 90, +241, 59, 80,236, 74,172, 54,240,152, 32, 88,249, 20, 69, 11,120,150, 86,202, 41, 35,123,182,184,125,247,117,144,129,133, 17,167, +111,247,214, 30, 47, 67, 99,158, 17, 44, 66, 75, 16, 44,157,226, 62,216,108,246,168,173, 91,183,182, 48, 50, 50, 2, 77,211, 48, + 54, 54, 70, 70, 70, 6,212,106, 53,242,242,242,160, 42,200,135,166, 32, 31,193,137,113,232,226,209, 29,195,250,245,113, 57,113, +249,207, 81, 20, 69,157,174,138,215,174,101,235, 82, 75,214,234,122,230,127,153, 38, 18,115, 75, 69,215,111,173,157,193,147, 72, +208,123,190,207,151,244,129,192,107,215,174,221, 24, 58,116,104,255,133, 11, 23,178,164, 82,233,205,216,216,216, 46, 0,222, 86, + 43, 42, 4,194,185, 63,206,245, 50, 53,149, 48, 56,119,231, 79,116,107, 61, 6, 6,124, 54,178,242, 53, 32, 8, 32, 34,252, 34, + 8,194, 12, 33,145, 82,116,109,101,132, 62,125, 93, 36,151,207, 71, 44,196, 95,241, 65,159, 53, 77, 78, 78, 14,210,211,211,161, +213,106,161,213,106, 49,124,196, 8, 28, 59,122, 20, 50,153, 12, 10,133, 2,106,181, 26, 20, 69,129,197, 98,225,142,223, 57, 36, +198, 68,160,115,167, 78, 64, 37, 75, 47, 29, 13, 2, 23,192,243,247,239,223, 35, 34, 34, 2, 73, 73, 73, 16, 10,133,176,177,177, +193,234,213,171,161, 82, 21,173, 81, 54, 98,196, 8, 15, 0,161, 95,122, 65,125, 4,246,199, 82,212,207,253, 47, 93,178,122,122, +233, 18,253,252,234,213, 36, 65, 65,193, 62, 93,142,229,241, 48,124,195,239, 51,154,136,197, 98, 36, 37,108, 69,211,166, 60, 44, +152,103, 14,223,223, 50, 1, 0,179,103, 57,160, 93, 91, 11,228,231,158,135,133,213, 82,108,223, 62,167,225,196,137,155,191,147, +203,169, 35,213, 80,255,252,231,159,127, 14,115,118,118,182, 15, 12, 12, 36,248,124, 62, 68, 34, 17, 68, 34, 17,132, 66, 33,210, +211,211, 17, 27, 27,203,108,216,176, 33, 25,192,207, 85, 17,173,220, 46,125, 6,160,255,188,126,184,241,254,205,209,174,246,236, +152,224, 97,222,238,113, 33,207, 3, 11,110,223,121,250, 43,169, 20, 38,230, 38,221, 93,220,160, 93,160,197,204, 69,171,176,115, +195, 10,188,127,241, 40,219,186,110,254, 46, 17,161,170,176,156, 30, 30, 43, 57,182,214,102,228,244,137,195, 76,174, 90, 7, 76, +191,206, 33, 50, 82, 51,223,108, 68,108,160, 66,208,168,245,248,198, 78, 44,245,253,251,247, 69,221,186,117,131, 82,169, 44,181, + 76, 30, 63,126,156, 38, 73,242, 65,133,125, 83,163,249, 37, 57, 57,217, 86,161, 80,160, 95,191,126,179, 55,110,220, 40, 46, 89, +163,142,162,168, 79, 44, 89,107,182, 28,187, 53,247,151, 93, 15,110,157,254,205,110,141,207,228,238,227,188,215, 62, 64, 37,235, + 72,114, 88,172,153, 87, 47, 29,182, 17,154,106, 33, 50,235, 3,101,154, 2,239,247,127, 15,121,190, 18,237,214,172, 2,192,135, + 90,203,194,190,129,195,193, 53,183,195,138,169,147,237,150,237, 59, 48,131,166,233,173,250,231,122, 61,244,208,163, 28,172, 9, +130,240, 3, 0, 31, 31,159,165,190,190,190,225, 4, 65,248, 49, 12,227, 85,108, 64,241, 99, 24,198,171,100,159, 98,113,246,217, +247,146,125,203,127, 47,255,121,201,146, 37,205,215,175, 95,191,174, 83,167, 78,167, 3, 2, 2, 98, 0, 84, 39,180, 6, 20, 11, +171,242, 75,241, 20,205, 58,244,242,242, 34,202,190,127, 98,209,162,233, 71, 31, 98,226,228,125,122,117,112,240,243, 15,125, 53, +105,210,128,158,163, 6,118,235, 27,155,144, 21,209,208,209,198, 34, 60, 60,212,136,166,233, 71,186,212,146, 64, 32,240,234,209, +163, 7, 39, 39, 39, 7, 6, 6, 6,200,200,200, 64,114,114, 50, 52, 26, 13,148,121,185, 80,229,229, 66,153,155, 3, 77, 94, 14, + 62,190,126,137,150, 13,157, 4,197,193,242, 85,162,196,234, 82,222, 82, 85,214,178,197, 55, 52,132,192,208, 16, 68,205,221,134, +223,154,152,152, 60, 47, 25, 84, 53, 26,205,204,197,139, 23,103,210, 52,141,181,107,215, 26, 73, 36,146,115, 0, 4,213,145, 24, + 90,178,189, 58,181,114,101,189,139, 13,129,187,219, 4, 52,110,240, 13, 98,211, 20,200, 44,208, 32, 61, 87,131,118,221,118,160, +158,219, 42,212,105,229,139,136,248,108,216,217, 59,179,192, 17, 84,185,248,115, 98, 98,226, 39,223, 79,159, 58, 5,185, 92,142, +134, 13, 27, 98,204,152, 49, 88,188,120, 49,198,140, 25, 3, 59, 59, 59,140, 27, 57, 8, 43, 86,172, 64,106,106,106,117, 69, 85, + 53,110,220, 88,229,232,232,168,114,116,116, 84,105, 52, 26, 20, 22, 22, 34, 55, 55,183,124,125,207,169,105, 69, 90, 89, 89, 45, +177,177,177, 9,177,178,178, 10, 23, 8, 4,215,131, 8,226,157,210,209,209,186,203,224,193, 68,179,145, 35,217,241, 34, 17,225, + 15, 72,116,225,178, 48,227, 14,240,236,209,159,159,155,115,184,212, 72, 53,121,146, 37,158,248, 55,199,211,199,109, 49,107,102, + 67, 16, 44, 33, 8, 22, 31,114,217,125,116,104,223,137,103, 98, 66, 84,215,151,198, 2, 8,234,210,165,139,157,183,183, 55, 33, + 16, 8, 48,123,246,108,205,212,169, 83,163,198,140, 25, 19,117,239,222, 61,202,209,209, 17,117,234,212, 33,234,212,169, 99, 11, + 32,168,248,152, 42, 97,212,144, 88,163,210, 68, 60, 54,113, 22,199, 80,176,232, 92,168, 21, 12, 95,185, 73,154,181,102,119,204, +166,216,247,114,167,247, 47, 30,101, 69,133, 93,165, 99, 95, 61,204, 76,137, 42,112, 90,179, 59,102,211,210, 93, 41, 21, 94,212, +254,254,160, 47,250,249,107,228, 50, 57,103,240, 64, 79,249,244, 41,163, 26,155, 73,154, 31,135,125, 31,183,122,117, 29,198,173, + 88,183, 93, 51,117,198, 92,205,193, 67,135,153,130,130, 2,228,231,231, 99,251,246,237,228,213,171, 87,147, 41,138,154, 91,217, + 51, 16, 0,104,181, 90, 76,159, 62, 93,108,100,100,132,196,196,196, 82,139, 40, 0, 72, 51,178, 66,159,190, 10,123, 55,255,135, + 17, 30, 50,149, 74,117,235,225,235,136,102,206,142, 14, 4,193, 84, 58, 17,133,207,229,246,110,219,161, 3,155, 97,114, 65,112, +234,226,227,209, 13,200, 79,205, 70,126,122, 54,216, 92, 49, 72, 8,160,165,249, 48,105,217, 30,145,175, 2, 97,111,105,205, 17, +112,185,125,245,227,137, 30,122,252, 59, 81,149, 22, 41, 43,150,214,175, 95,191,174,170,237,101,222,213,229,190,151, 10,169,242, + 34,172,236,103, 0, 88,191,126,253, 58,134, 97,188, 2, 2, 2, 78, 1, 80,232,120, 10,211,202,188, 79,251, 68,104, 85,105,133, + 82,170,125, 23, 46,254, 25,166,198, 34,227,246,173,157,109,174,220,244,127,253, 40,224,117, 68,189, 58, 22,150,140, 86,109,250, +251,230,157, 14,132, 92,177, 94,199, 66,184, 88, 88, 88, 64,163,209,224,195,135, 15, 72, 74, 74,130, 70,163, 1, 41,147, 65,149, +155, 11,101, 78, 14, 40, 89, 1,120, 20, 5, 69, 70, 58,204, 13,132,192, 95, 51, 18,171,177,188, 17, 21, 10,173,146,119,161,145, + 17, 4,134, 70, 96,113,185, 21,186, 21, 43, 65,155,246,237,219,159, 13, 11, 11,235,208,171, 87,175, 95, 81, 52, 69, 62, 62, 57, + 57,185,231,242,229,203, 85,214,214,214,152, 62,125,122, 19, 0, 19,170, 21,153,124,181,139,163, 77, 19, 52,118,154,128,122,117, +122, 32, 87,166, 69, 70,190, 22,233,185, 26,236,219,209, 9, 23, 14,182,199,147, 11, 93, 17,118,171, 55,114,181, 54,144,216,125, + 11,134, 82, 55,175,138,243,206,157, 59, 88,189,122, 53,126,253,245, 87,172, 93,187, 22,191,254,250, 43,146,147,147,225,234,234, +138,132,132, 4,220,184,113, 3, 82,169, 20, 22, 22, 22,120,249,242, 37,182,108,217,130, 39, 79,158, 84,123,210,186,100,179, 45, +222,167, 70,190,116,146, 36, 39, 74, 7, 15,110,145,102,102,214,172,117,235,214,253,103,207,158,237,212,165, 75,151,210,237, 78, + 78, 78,117, 69, 34, 81, 42,138,102, 80,182,170,138,139, 6, 90, 91, 90,186, 66,173,122, 87,220,198, 92, 16,132, 16, 61,122, 71, +160, 75,215,215,208,104,121, 96, 17, 2,176, 88, 66,144,100, 22, 76, 77,237,192, 48,132,107, 53, 69, 92,158,145,145,225,124,247, +238, 93, 86,108,108, 44,132, 66, 33, 0,196,173, 92,185,114,231,166, 77,155,222,154,155,155, 83,126,126,126,184,124,249, 50,188, +188,188,216, 83,167, 78,117,174, 83,167,206,222,234,206,123,229,118,233,179,147,155,111,140,230,106, 77, 91, 9, 69,245,234, 67, + 38,249,246, 71, 15, 11, 49, 0,220,140,142, 46,176,170,155,191, 94, 86, 16,146, 96,226, 80,248,219,205,232,234,102,156,174,164, +223, 68,189,123,126,242,210,205,188,244,180, 28,110,235, 22,205, 21,190,171, 23,241,234,213,111,244,251,138,197, 63,216, 36,231, + 11,115,123,207,190,241,238,226,205,151,133,227, 39,125, 79, 78,153,230,173,188,113,243,206, 37,154,166, 91,160,146, 25,135, 52, + 77, 67, 42,149, 34, 60, 60, 28,209,209,209,200,200,200, 64,102,102, 38, 10, 10, 10, 74,221,141, 6, 5,249,215,118,254,113, 53, + 88, 44, 18, 25,116,104,225, 92,247, 69,224,219,116,177, 72,100,224, 92,191,110, 99, 96,101,133,247, 17,138,162, 90, 8, 13, 68, + 0, 8,228,134, 61, 66, 97, 78, 33, 10,115, 11, 81,144, 93, 8,149,134, 13,165,138, 5,133,154, 5, 71,143, 62, 40,148, 41, 81, +152,149, 7,154,162,220,244,195,141, 30,122,232, 81,197, 88,239,231,227,227,179, 84,199,125,117,118,111,150, 23, 94, 62, 62, 62, + 75, 9,130,240, 91,178,100, 73,115, 84, 62,161,170, 44,246, 87,240, 2,160, 67,122,135,172,172,168, 66, 67,194,101,232,188,159, +126,185,113,234,208, 14, 43,149, 74,158, 96,110, 42,161, 36, 6,124,139, 41,211,215,162,160, 48,103,136, 76,247,116, 4,200,201, +201, 65, 76, 76, 12, 68, 34, 17,120, 92, 46, 40,133, 2,148, 66, 6, 69, 78, 22, 88, 26, 21,120, 20, 5, 51, 3, 17, 28,237,108, + 80,207,218, 70, 39,206, 15,247,111,151, 6,190,151,117, 23,110,104,239, 2,190, 88, 2,190,161, 4, 63,250, 61, 4, 0,240,120, + 60, 96,249,175, 58, 25, 77,236,237,237,255, 60,121,242, 36, 47, 35, 35, 3, 65, 65, 65,193, 0,242, 0, 24, 2,160, 35, 34, 34, +238,134,133,133,121, 57, 59, 59, 3, 64,195,234,200,242, 51, 89,148,150,100,144,152, 26,135,216,164, 64,152, 25, 55, 0,215,160, + 49,210,115, 53, 16,136, 26, 64,171,250,203,251,168,204,143,135, 66,195,214,233,220,213,106, 53, 72,146, 4, 73,146, 80,171,213, +152, 54,109, 26,158, 6, 4,224,244,229,123,136,249, 24,137, 38,245,109,240,221,119,227,209,190,125,123, 4, 4, 4, 84,201, 53, +161, 21,180,246, 18,112, 54,247,103,129, 47, 49, 87,117, 92,124,235, 69,117, 98,139, 32, 8, 6,149,184, 34,203, 97, 83,167, 78, +157, 26, 69,202,100, 8,127,247, 14,189, 86,174, 4, 0, 92,191,126,253,147,115,153, 63,127, 62,255,237,219,183, 83, 94,191,126, + 61, 37, 37, 37,101, 51,128,138,131,205, 25,224,218,181,103,248,225,135,183,200,200,200, 0, 0,156, 57,245,151, 46,141,141,209, +160,223,128, 34,143,150,137,137, 9, 54,111,118,213,169, 62, 41,138,194,254,253,251, 75,221,133, 0,192,225,112,186,204,159, 63, +127,104, 69,251, 55,106,212,136, 87, 29,231,188,225,246,194, 39,193,204, 76,227, 70,245,154, 27, 89,180, 68,150, 54,208, 53, 48, + 89, 58,107,222,112,251,173, 91,206, 39, 43, 69,132,234, 8, 65, 37,214,225, 8,149, 71,117, 41, 99,244,205, 29,234, 44,199,137, + 71, 83, 51,242,151,121,127, 63,214,220,200,196, 74,118,112,167,175, 41,139,205, 98,254,124,173,201,109,238,100,110,242,109,199, +109,133, 63,204, 91, 30,168, 38, 19,189,145,248,103, 36,170, 72,113, 65, 81, 20, 82, 82, 82,144,145,145,129,132,132, 4,100,102, + 22,185, 95, 51, 51, 51, 65,211,244,151,220, 16,161, 72, 72, 64,252,165,131,168, 55,126, 60,218,253,186, 26, 20,205,129, 66, 78, + 97,115,231,158,200,201, 83, 64, 69, 19,176,107,211, 25,223, 95,127, 12, 22, 67, 1,251,118,233, 71, 18, 61,244,248,151, 66,151, +244, 14, 37,130,200,215,215,215,235,107,255,127, 89,177,229,235,235, 27,238,235,235, 91,147,255, 42,239, 50, 44,253, 94, 18,163, +245,176, 76, 0,218,103,131,102, 65,102, 68,244,219,183,156, 20,153, 66,102, 96,109,101,169, 50, 16, 10,232,188,252, 2,118, 96, +104,176, 70,150,250,241,125, 13,206, 35, 34, 44, 44,204, 53, 37, 37, 5, 9,241,241, 32, 21, 50,176, 84,106, 48, 74, 57,122,185, +119,134, 16,128,144, 69,128, 71,107,192, 97,243, 81, 80,152, 15, 0, 17,213, 14,142, 90,237,103,150, 45,130, 32,192, 55, 52, 4, + 95, 44, 6, 95, 98,248,137,133, 75, 23,139,141, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, 14, 14, 14, 77,237, +236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55, 0, 29,114, 74,105, 73, 97,200,251, 56,116, +201,204, 14,192,227,135,123,160, 86,168,208,218, 99, 15, 52,156,122,176,108,190, 10,244,135,227,144,167, 94, 41,178, 30,216, 12, + 68, 82, 66, 28, 8, 54, 63, 92, 87,203, 83,201,231,224,224, 96,156,186,226, 15, 91, 71, 23, 36, 68,189,195,187, 7,119,241,212, +210, 28,142, 46,205, 74,221, 64,149,150,145, 2,103,205,174,162, 52, 81, 63,207, 28, 43,200,206,206, 22,152,153,153,169, 74,234, +206,214,214,246, 75,196,214,216,133, 11, 23, 34,151,203, 5, 6, 12, 0, 47, 58, 26, 26,141, 6, 29, 59,118, 68,187,118,237, 0, + 0, 29, 59,118, 4,135,195, 65,203,150, 45, 97,103,103,135, 93,187,118,141,173, 76,104,177, 8, 4,145,100, 86, 83, 39, 39,167, + 82,161,117,244, 88, 6, 2, 95,247, 6, 1, 62,182,239,252, 80,186,111,221,186,117,145, 42,141, 6, 65, 48, 97,213,148,241, 87, + 27, 27,155,229,182,182,182, 78,155, 54,109, 98, 11,133, 66,204,152, 49,163, 65, 97, 97, 97,189, 98, 83, 50,150, 44, 89, 2, 0, + 88,177, 98, 5, 86,174, 92, 9,149, 74, 37,175,140,236,232,230, 22,118,233,217,244, 20,166,208, 96,136,167, 69,189, 22, 61,250, +246, 66, 3,231, 30,232,209, 55, 1, 0,214,153,113,226, 70,254,190,204,228,146,137, 33,113,248,246,205, 59, 43,220, 61,122, 44, + 91, 92,248, 96,205,111,251,115,171,141,121,204,139, 63, 82,240,158, 63,106,203,142,189,199,182,252,178,100,142, 48, 33, 67,157, +147,156,195, 20, 74, 4, 28, 73, 67,107, 66, 50,235,167, 95, 99, 82, 82,162, 23, 32,241,102,181, 51, 45,105,154, 70,116,116,116, +105, 76,159, 82,169,132, 76, 38, 67, 98, 98, 98,105,159, 81,136,141,250,121, 79, 26,232, 38, 83, 40,228, 47, 66,163, 18,126,158, + 61,174,147, 76,161,144, 71,197, 38, 68, 2,219, 43, 84, 99, 44, 22, 43, 84, 94, 32,239, 37,207, 85, 34, 35,232, 61, 28,122, 58, + 66, 75, 18, 80,147, 20, 50,178, 10,160, 34, 1,138,197, 69,243,145,223,129, 34, 56,200, 76, 73, 6,139,205, 14,198,167, 65,251, +122,232,161,199,191, 7, 85,106,145, 18,139, 86,167, 78,157, 78,151,181, 58,149,124, 6,160, 66,213,161, 60, 25,101,197, 84,137, + 59,177,178,255, 41,199,171, 43, 62,139,209,170, 54,189, 67,201,127,214, 49,206,183,219,176, 98,156, 3, 77,146, 77,210, 51,211, + 72, 14, 71,192,173, 99,172,144,102, 39,232,254,239, 42,149,202,239,238,221,187,131,123,247,238, 45,136, 10, 13,134, 58, 47, 15, +234,188, 92,112,105, 18,102,162,182, 96,105, 84, 32,212,106,216, 55,165,161, 44, 16,193,255,105,152, 86,165, 82,249,233, 42,180, + 88,108,246,167,113, 89, 18, 9, 4,134, 70, 16, 72, 36,229, 93,139,213,137, 2,131, 62,125,250,244,236,216,177, 35, 24,134,193, +254,253,251,161,209,104,248, 26,141, 6,106,181, 26, 26,141, 6,249,249,249, 56,118,236, 24,118,239,222,253, 20,192, 31,213, 14, +102,164,250,238,173, 59,247,219, 79, 30,231,197,189,238,183, 25,164,154,130,130,112,128, 76,166, 69,161,218, 0,148,249,120, 32, +237, 26,216, 28, 33, 58,181,108,128, 43,231, 47,106, 64,170,238,233,168,194, 63,177, 10, 37, 38,196, 33,233, 99, 36, 36,249,169, +176, 52, 50,128, 60, 58, 18,173,191,155, 80, 43,235, 68,157, 58,117, 64,211, 52, 60, 61, 61, 75,131,171,107, 43,182,178,178,178, +112,245,234, 85,116,236,216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, + 13,171, 54, 18,102,102,107,175, 39, 37, 6,141,248,246,219,111,121,207,159, 63, 7,195, 48,112,118, 54,130,145,161, 24, 4, 75, + 0, 23, 23, 43, 0, 69,207, 0,221,187,119, 71,126,126, 52,153,147,195, 92,175,230,116, 79, 2,184,172, 86,171, 63,116,235,214, +205,238,227,199,143,152, 55,111, 30,231,204,153, 51, 37,166,100,248,248,124, 58,153, 66,161,168,220,117,223,164, 69,211, 69, 13, + 72, 83, 15,161,168, 94,125, 35,139,150,104,224,220, 3, 0,208,219,107, 50, 26, 52,170,139,252,204,144,250, 74, 69,220, 16, 30, + 39,199, 52,100,123,242, 91,209, 0,215, 73,202,244,135, 81, 40,114,157, 86,219,236,138,168, 51,105, 9,220,241,103, 47,255,121, + 99,250, 55, 94,131,184, 90,138, 36, 93, 29,185, 38,231, 46, 93, 75, 79,142, 79,216,134,132,155, 97,127,217,255,170,180,226, 81, +249,249,249, 16,139,197, 8, 11, 11, 83, 13, 24, 48, 64,192, 98,177,240,225,195,135, 82,161,101,101, 97,214,172, 75, 59,215,166, +107,182, 28,187, 37, 22, 8, 4,125,187,183,117,121, 27, 21,159,196, 48, 68, 92,165,214, 86,173,246, 78,104, 80,176,167,165, 93, + 35,118,244,195,231, 48,239,250, 13, 84, 42, 22, 20,106, 26, 42, 18, 32,217, 60,216,182,234, 0,147,134, 46, 96, 0,188,122,254, + 84,171,210,106,111,233,199, 26, 61,244,248, 87, 91,181,152,170, 68, 82,241,231,108, 0,113,190,190,190,153,101,172, 77, 25, 0, +130, 1,184, 21,239,151, 81,238,184, 12,130, 32, 94, 49, 12,211,174, 12, 79, 70, 25,193, 85,246,179,186,220, 62,193, 53, 16, 89, +101,223, 63, 21, 90,149, 77,169, 4, 0, 11, 11, 11,171,214,173,219, 54, 60,112,232, 44, 24,134,193,251,192,141,200, 73,127,135, +229,235,158, 53,180,183,183,247, 72, 78, 78,246,215,165, 4, 20, 69,157, 57,124,248,240,130, 14,109, 90,183,174,239,224,128,224, +184, 88,240, 24, 10, 60,138, 2, 75,163, 2,135, 82,195,193,149, 2,139,144, 32, 37, 37, 15,235, 79,158, 13, 43,206, 18, 95, 37, +154,126, 51, 8,171,147,242, 64, 16, 4, 54,117,114, 5,223, 80, 2,158, 88,130, 31,255,188, 95, 42,174,252, 86, 47, 1, 95, 34, + 65,195, 14, 58, 37,132,151, 63,120,240,224,117,104,104,104, 59, 87, 87, 87, 44, 88,176, 0,113,113,113,160,105, 26,105,105,105, + 74,169, 84,154,156,145,145, 17, 7,224, 18,128, 3,208, 33,243, 56, 79,165,220,234,119,225,168,119, 39,119, 15,139,111,135,236, +198,229,243,243,145,155,151, 15, 57, 41,130, 76, 73, 66,166, 98,195,204,188, 5, 58,180,108,137,148,228,116,132, 63,191, 85,200, + 81,201, 55,214,164,131, 18, 4,129,192,192, 64, 56,217, 25, 34,242,177, 63, 44, 12,184,112,179,179,129, 93, 23,247,210,252, 82, + 85,129,203, 6, 57,118,236,216,210,204,240,125,250,244,137, 29, 63,126,188,237,252,249,243,113,232,208, 33, 60,125,250,244,179, + 0,109, 15, 15, 15, 60,122,244,104, 21,128, 21,213, 25,245,212,106, 53,154, 54,109,138, 87,175, 94,225,238,221,187,232,209,163, + 7, 60, 60, 60, 16, 18, 18,130,219,183,111, 35, 48, 48, 16, 4, 65,192,220,220, 28,218, 34,241,172,173,140, 76,163,193,185,223, +126, 63,188,116,203,150,221,205,199,141, 27,135, 11, 23, 78, 99,242,164, 38, 32, 88, 2, 16,132, 0,131, 6, 54,193,234, 95, 95, +161, 67,135,238,176,176,224, 98,203,230, 43, 49, 10, 5,117, 76,135,106, 92,115,251,246,109, 59,165, 82,137,220,220, 92, 70, 34, +145, 16, 89, 89, 69, 51, 90, 43,178,104,201,229,114, 97,101, 68,161,111, 34, 54,230, 22, 48, 57, 76, 97,224,144,108, 50,176, 69, +143,190,137,232,237, 53, 9,119,252,254,192,253, 91,119, 97,198,137,139,133,184,224, 70,102,108,102,190, 84,230,188,215,165,205, + 84,118,146,236,214,222, 89,131, 34,217,182,182,244,185, 37,123,242,115,171, 18, 90, 0,136,236,183,199,255,188,196, 96, 80,231, + 78, 29, 26,185,214,181,229,231,100,166, 51,231,175,220, 8,211,196, 94,184, 90, 70, 96, 49,213, 8,245,213, 62, 62, 62,191, 20, +127, 62,242,243,207, 63, 79, 93,191,126,189,101,106,106,106,105,140, 86,122,102,246,253,206, 3,102, 81, 89,185,121,234,195, 91, +126, 26, 46, 18, 10,248, 63,175, 63,252, 80,203,198,243,202,120, 73,154,222, 53,114,222,242, 57, 81,239, 3,237,235,137,248,184, +242,211, 10, 4,223,126, 0, 45,139,135, 31,238,190,128, 74, 67, 33, 55, 51, 11,247,166,204,132,196,218, 20,187, 31, 94, 72,163, +105,122,143,126,168,209, 67,143,127, 47, 42,211, 34, 4, 65, 84,148, 99, 47,173,130,223, 94, 85,117, 92, 37, 60, 95, 3,149,102, +133,215,105, 10, 94,102,102,102,250,163, 71, 47,240,208,111, 13,252,253,214, 32, 60, 48, 24, 41,201,106, 36,167, 41, 97,100,100, +244,172,138, 67,203,103,142,101,228,114,249,208,159,151,255,146, 42, 20, 25,160, 91,207,158,176,177,180,130, 1,143, 11, 54, 73, +131, 77,112, 81,152, 97,130,200, 16, 57, 22, 31, 62,158, 94, 40,151, 15,173, 96,144,232, 85,153,200, 32, 8, 2, 2, 35, 67,240, + 37,134, 16, 24, 26,125,226, 70, 20, 26, 25, 65,104,104, 4, 14,159, 95, 81, 48,252,103,156,133,133,133,195,134, 15, 31,158,147, +151,151,135,169, 83,167,194,223,223, 63,240,214,173, 91, 70, 33, 33, 33,162,140,140,140, 70, 0,250, 0,216, 87,133,200,250,132, + 51, 39, 39,186,128, 33, 85,163,124,127,153,171, 80,146,230, 24, 49,225, 12,196,172, 68,144, 20, 13, 6,128,157, 25, 31, 93,122, +253,138,116,117,103,156,217,187, 86, 78,107,148,227,202,229,208,250,132,147, 97, 24,198,218,218,250,179, 58,184,123,247, 46, 70, + 12, 31,134,190, 67, 6,195,178,190, 19,172,122,125,131,190, 83,127,192,222,189,123,193, 98,177, 96, 97, 97, 81,126,224, 45,229, + 60, 26, 4,238,169, 80, 16,167, 66, 65, 28, 9, 4, 7,192,119,199,143, 31,255,205,205,205,237,193,211,167, 79, 55, 2, 24, 85, +246,191,202, 96,101, 57,107, 86, 69,109,180,108,206,156, 57,138,168,168, 40,136,197, 98,144, 36,137,167, 79,159, 98,247,238,221, +216,180,105, 19, 2, 3, 3, 97,110,110,142,134, 13, 27, 66,165, 82,225,213,171, 87, 10, 0,203,170,224,164, 51, 50,200, 97,219, +183,175,207,242,242,234,138,195,135,119,194,198,166, 51,184, 28, 27,112,184,150, 16, 75,154,226,224,129,223,208,191,127,107,252, +121,229,108,118,102, 22, 57, 12, 0,169, 67, 95, 82,190,120,241, 2,123,247,238,197,240,225,195,147, 71,140, 24, 65,229,229,229, +149, 90,180, 74, 50,253,174, 44,142, 49, 83,169, 84,130,202, 56,191, 95, 28,150,252,211,218,240,213,105,169,201, 29,253, 31, 60, + 27,123,255,214, 93,196, 68,221,199,253, 91,119,241,248,126,128, 79, 90,106,114,199,214,237, 27,243,134, 78,245, 94,116,244,226, + 5,182,196,200, 22, 71, 47, 94, 96,143,153, 53,119,109,219,190, 61,150, 85,215,231,139,219,145, 41, 76, 79, 91,178,110,227,142, + 66, 82,163,100,109,216,182, 43, 69,145, 33, 93, 86,166, 95, 50,213,245, 79,133, 66,177, 79,169, 84,218, 41,149, 74, 59,149, 74, +181, 44, 46, 46,174,219,130, 5, 11, 50, 40,138, 42,181,150,102,188,253,243,217,187, 39, 71,214, 89, 89,152,138, 58,183,107,222, +100,243,190,243, 15, 19, 18,211, 78,148,201,161, 85, 81, 57,149,133, 10,229,176,193, 67,199,203,114,115, 84,232, 52,215, 7,180, + 80, 2, 21, 5,104, 25, 54, 72,130,131,208, 53,155, 33, 50, 51,196,201,216, 55,242, 60,173,102, 24, 62,205,161, 85,213,185,127, + 9,244,156,122, 78, 61,231,127, 39,231,255, 50,108,241,233, 90,135,182,159, 88,180,170,155, 82,105,111,111,223,237,219, 65,189, +208,221,235,103, 48, 12,131,119,111,126, 71, 78,198,123,216,219, 8, 16,157,144,223, 9,128,127, 13, 10,147, 16,151,152,216,113, +206,178,159, 47,142,232,211,211,197,181,126,125, 65,189,122,142, 16, 91, 89, 33, 51, 51, 3, 79,158,191,213,174, 61,117, 46,172, + 88,100,233,228,152,164,105,186, 40,200, 29, 64,207, 57,139, 65,176,217, 64,113, 26,135,146,129,177,126,187,206, 32, 56, 28, 80, + 12, 13,149, 74,165,203,108,185,164,143, 31, 63, 14, 27, 55,110,220, 61, 63, 63, 63, 86,223,190,125, 91, 93,186,116,233, 75,214, +204,131, 44, 61,234, 1, 0,175,181, 75,166,159,233,216, 99,176,145,115,243,182,188,182,245,216,208,104, 9,164, 36,199,195,239, +226, 75,205,219, 23,183,242, 25, 82, 57, 74,158, 25,245,160, 42, 46,141, 70,147,208,168, 81, 35,235,189,123,247,150, 6,195, 83, + 20,133,204,204, 76, 60,123,246, 12, 45,218,117,128,203,164, 41,200,200,200,192,246,237,219, 81,183,110, 93, 12, 28, 56, 16,217, +217,217, 32, 73, 82, 87,135, 47, 5,224, 86,241, 11,229, 68, 22, 81,188, 4, 80,149,110, 67, 39, 39, 39,190, 82,169,108,197, 48, + 12,155, 32,136,173,106,181,122,226,146, 37, 75,108,215,173, 91,135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200, +200,192,203,151, 47, 41,185, 92,190, 23, 69, 11, 89,103, 84, 83,190, 15, 47, 95,198,118,156, 61,251,199,139,191,173,159,238,172, + 84,117,231,155,153,185,131, 97, 72,100,100,196,161, 32,255,169,230,215,213,127,124, 76, 75,215, 14, 5, 16,165,227, 57,175,240, +246,246, 6, 0, 33,128,159,163,163,163,131, 92, 92, 92,156, 43,179,104,233,130, 45,231,147,149, 0, 78, 13,235,107, 55, 47, 63, + 51,196,217,140, 19, 23,219,209,149,222,190,229,124,178,210,200, 78,182, 38, 51,206, 63, 82, 42,187,181,247,232,197, 11,236, 9, + 67,134, 81, 14,146, 40, 31,161, 21,115, 94, 7,106,198,205,205,173, 14, 65,100, 55, 72,207,122,255,122,242,212,233, 35,141,121, +138,235,110, 14, 89, 13, 89,117, 91, 11, 3, 3, 3, 99, 81,195,153,161,197,136, 76, 78, 78,238,182,100,201,146, 91, 12,195,124, + 18,155,144,158,153,125,191,147,151, 55,147,155,155, 23,148, 17,241,167, 46,185,212, 94,190,124, 19,216,211,181, 69,235, 11,191, +173, 91,111,221,125,206, 2, 78,228,131,135, 0,165, 69,188,255, 67, 80, 2, 53,189, 57,224, 78, 90,158, 70, 51, 4,250,172,240, +122,232,241,175,183,102, 85,165, 69,254,203, 49, 0,149, 4,195,235,124, 50, 78, 13,236,111, 53,113,174,215,167,174,131, 37, 0, + 32, 58, 54, 5,209,177,201,183,163, 99,146,251, 86,163,120, 43,155, 94, 89,186,168, 52, 81,156,194,129,209,109, 81,233, 79, 56, +205,205,205, 95,115, 56, 28,135,154,212, 6, 69, 81, 41,153,153,153,173,117, 44,231,152,250,245,235,175,143,143,143,191, 72,211, +244,188, 26,170,253, 10, 57, 75, 22,149,102,113,248,189, 24, 82,221, 2, 0, 8, 14, 95,151, 69,165,203,114,182,144, 72, 36,251, +184, 92,110,221,146,118, 44,137,193,162, 40,138,173,209,104,132, 20, 69,177, 1, 16, 44, 22,139,228,114,185, 74,130, 32, 72,146, + 36, 19, 84, 42,213,116,252,149,112,180,170,115,175,118,160, 47, 22, 90,168,192,162,117, 23, 0,162,162,162, 26,155,154,154,142, + 34, 8, 98, 56,195, 48, 77, 11, 10, 10, 84,203,151, 47, 15, 60,119,238, 92,126,253,250,245,251, 13, 24, 48,128, 8, 9, 9, 65, + 88, 88, 24,147,149,149,117,190,216,138, 21, 93,195,190,196, 18, 8,216,163,205,204, 88, 3, 24, 6,110, 96, 64, 16, 44,132,230, +229,209,215,229,114,234, 68,177, 96,172,105,255, 44,193,216,122,245,234,253, 17, 27, 27,203,173,204,146, 90,217,185,151,199,239, +203,154,255,220,169,107,215, 97,207, 30, 63,190,244,211,218,240,213,101,183,205, 26,108, 58,121,204,204, 57,191,159,218,181,237, +167, 29,151,115, 14,235, 82,206, 86,173, 90, 57, 17, 4, 49, 10,128, 43,195, 48,141, 24,134, 16, 18, 4,147, 67, 16, 68, 56,128, + 16,181, 90,237,247,246,237,219,164, 47, 56,247,218, 60,225, 86,198, 89,186,168, 52, 40,170, 37, 5, 48, 58, 46, 42,253,159, 46, +167,158, 83,207,169,231,252,255,227,252, 95,198,180, 10, 6, 72,221, 50,195,151, 32, 58, 38,185,111,116, 76, 50, 26, 53,106,196, +124,248,240,161, 70, 34,173,178, 65,154,162,168,211,114,185,252,244,151,144,100,101,101,181,253,155, 43,239, 84,108,108,236,169, +175, 73, 88, 44,164, 86, 23,191,106,139,208,194,194,194, 14,186,238,172,209,104,254,142,186, 33,138,173, 89,171, 42,219,161, 79, +159, 62,241, 26,141,230, 46,128, 68,130, 32, 76, 0,100,107, 52,154, 91, 36, 73,166,125,248,240,161,237,230,205,155, 75, 50,223, +255, 10,224,117, 45,203, 65,171, 84,212,201,148, 20,234,228,223,112,142, 39,213,106,245,124,115,115,243,134, 74,165,146,175, 84, + 42,121,101, 39, 31,136, 68,162,140,170, 2,226,203,194,196,144, 56,194,227,228,152,155, 24, 18,229,133, 20,204,236,113, 65, 33, + 11,107, 98,102,143, 11,186, 22, 44, 40, 40, 40,218,205,205,237, 56,139,197,170,207, 48,140, 53,192, 24, 51, 12, 50, 24,134,201, +228,112, 56,201,111,223,190, 77,254, 47,186, 9, 41, 73,154,222, 72,170,213,127,197, 29,234,103, 23,234,161,135, 30,255, 28, 84, + 26,163,197,169, 41,211,135, 15, 31, 8,125,125,234, 81, 86,108, 85,181, 49, 62, 62, 94, 5, 32,160,248, 85, 30,175, 1, 12,252, +111, 63, 65,169, 84,218,186,178,109,186,138, 44,160, 40,102, 11, 8,155, 91,209,182,149, 59,114, 10,176,227,226,162,154,150, 45, + 56, 56, 56, 1, 58,186,216,245,208, 67, 15, 61,244,248,219, 48,173, 50,241,197,209,215,141, 30,122,232,161,135, 30,122,232,161, +199, 23, 97,127, 25,193,245,137,117,139, 64,229, 51, 7,106,226,123,173,205,236,131,187,122, 78, 61,167,158, 83,207,169,231,212, +115,234, 57,255,117,156,255, 84,124, 34,178,116, 73,142,254, 53,160,159,250,170,231,212,115,234, 57,245,156,122, 78, 61,167,158, +243,223, 32,178, 62,121,149,100, 61,208,187, 14,245,208, 67,143,127, 45,206,157, 59,167,211,162,162,163,127, 58,232, 37,145,152, + 46, 47,204,207, 91,127,122,227,228, 75, 37,191,143, 24, 49,130,210,215,162, 30,122,232,129,218, 4,195, 55,104,224,208,140, 69, +209, 93, 24,134,197,102, 88,140,150,200, 87,156,137,206,201,249, 36,237, 64,157, 58,117, 76,184, 44, 12, 36, 24, 70, 76, 16, 52, + 69,179, 89, 79, 99, 98,146,222,214,160, 96,124, 83, 83, 83,111, 30,143,215, 75,173, 86, 59,176, 88,172, 36,149, 74,117, 87, 46, +151,239,196,231,137, 11,255,223,208,184,113,227, 49, 15, 31, 62, 52,113,119,119, 87,137, 68, 34, 82,161, 80,112,110,222,188,249, +127,236, 93,119, 88, 20,215,219, 61, 51,179,189,194,210,171, 40, 40,138,162, 2,246, 94, 19,141, 93, 99,137,177, 23,212,152, 24, + 53,209,104,162,137,221,104, 76,172,137, 37,118,163,198, 26,123, 55, 98,111,216, 80,177, 75,239, 44,176,176,108,159,153,239, 15, +216,205,138,148, 93,196, 68,127, 31,231,121,134,101,118,103,207,222,153,185,115,239,185,239,125,239,251, 10, 62,250,232,163,236, +103,207,158,149,107, 69,162,151,151, 87,251,245,235,215,251,119,234,212, 9, 53,106,212, 80, 15, 24, 48,128,215,172, 89, 51,222, +168, 81,163, 94, 36, 37, 37,157,181,147,174, 14, 65, 16, 91, 9,130,160, 24,134, 25,130,127, 66, 55, 84, 52, 72,146, 36,199, 16, + 4,209,155,101,217, 0,130, 32,158,179, 44,187,159, 97,152,210, 2,183,150,134,143, 1,116, 33, 73, 50, 12, 0, 24,134,185, 5, +224, 40, 96,251,202,187,127,147, 83, 44, 22,135, 2, 64,126,126,254,237,138,226, 36, 8, 34, 20, 0, 88,150, 45, 47,231,112,145, + 72, 52, 26, 0, 52, 26,205,239,176, 33, 29, 84, 81,176,107,130,216,176,217,209, 0,128, 91, 63, 4, 1, 0,236,217, 39,198, 70, + 19,246,252, 86,113,124,246,112, 20,131, 46,131, 6, 13, 90,240,199, 31,127,252, 0,224,192,219,168,248, 30, 30,190,171,126, 94, +190,206,107,226,231, 35,127, 68, 65, 70,136,210, 31, 72,224, 3, 62, 69,245,208,211,244,133, 7,192,110, 0, 28, 39, 39,167,129, +124, 62,191,181, 94,175,247,228,112, 56,201,122,189,254,124, 78, 78,206, 14,148,146, 1,193,230,235,250, 16, 10, 67, 62, 60, 8, +230,159, 60,111, 44, 9, 29, 79,140, 20,162, 54,178,222,129,102,148, 4,240,101,225,185,110, 64,201,225, 60, 74,107,124, 38,122, +121,121,245, 86,169, 84,249, 20, 69,177, 40, 88,245, 92,240,167,224,115,130, 97,152, 52,165, 82, 57,164, 44, 46, 73, 21,212,226, + 75,136,173,180, 17, 26,147,142, 29,167,142, 71,180,212, 23,205, 89, 96, 8, 11, 84, 35, 41,210,149, 97,152,100, 0,103, 73, 19, + 14,229, 37,225,233, 59,218,185,251, 21, 94,215,170,133,251, 92, 0,238, 0,238, 2,152, 8, 32,175, 82,255,252,107, 40,234, 12, +127, 4, 64,178, 69,104, 89,133,187,111,219,173, 91,183, 8,127,127,159, 58,125,123,245, 89, 48,118,204, 56,130,162, 72, 68,221, +191,207,249,116,200,240, 15, 21, 10,133,183, 84,167,171, 13,130, 96,242,133,194, 40,149, 42, 39,113,247,142, 63,100, 65,181,106, +209, 52,205, 96,205,218,213, 31,237,249,107,223,183, 54,138,173,154, 30, 30, 30, 91,167, 77,155,230,209,163, 71, 15,202,195,195, + 3, 49, 49, 49,142, 59,119,238,172,181,114,229,202,254, 89, 89, 89, 67, 0, 60, 46,199,201,182,242,112, 34, 63,148,137,136, 14, +200,165,145,107,196,153, 20, 13, 78, 2,184, 80,222,171,151,159,159,255, 69,126,126,126,147, 70,141, 26,177, 27, 54,108, 32,134, + 13, 27,198, 18, 4, 65,104, 52,154,205, 0,202, 37,180, 36, 18,201,175,157, 58,117, 10, 12, 12, 12,124,254,236,217,179, 46,187, +118,237, 58, 58,116,232,208, 0,137, 68,242, 4, 64, 77, 59,233, 54,101,102,102,134,104, 52, 26,248,248,248,108, 0,208,224, 45, + 84, 34,130,162,168,253,222,222,222,236,226,197,139, 15,132,132,132,184, 43,149, 74,211,148, 41, 83, 58, 94,189,122,245, 35,154, +166,123,216, 33,182, 20, 4, 65,172,117,119,119,119,249,241,199, 31,159, 54,108,216,240,174, 64, 32,224, 63,121,242, 68, 60,121, +242,228, 73,143, 31, 63,238,207,178,236, 24,192,174, 14, 66, 65, 16,196, 90, 47, 47, 47,151, 5, 11, 22,196,132,133,133, 69,241, +120, 60,222,147, 39, 79, 36,223,124,243,205,196,232,232,232,114,113,146, 36,185,166, 73,147, 38,138, 31,126,248,225, 97,173, 90, +181, 46, 83, 20,197, 79, 72, 72, 32,103,205,154,245,249,169, 83,167,250, 49, 12, 51,182, 60,229,116,115,115, 83,204,154, 53,235, + 97,179,102,205,174,242,120, 60,222,163, 71,143,200,105,211,166,125,254,244,233, 83,155,203,233,228,228,212,142, 32,136,117, 41, + 41, 41, 28, 0,240,244,244,108, 44,151,203, 87, 90,231,180, 52,251, 8, 24,141,198, 92,173, 86, 59, 72,169, 84, 22, 27, 8,119, +216,244, 21,221, 1, 96,165,193,188, 95,240, 90,214, 62,176,230,144, 45, 39, 29,234, 81, 16, 23,239,103,245,136, 94, 0, 48,176, + 48, 85,248,207,106,128,195,225, 48,161, 30, 19,217,219, 41,118,133,140,233,217,190,125,251, 89,103,207,158, 93,221,182,109,219, +111,182,109,219,230, 22, 31, 31,191,232,194,133, 11,190,159,124,242,201,176, 51,103,206, 44,204,200,200,216, 83, 81,149,159,207, + 19, 8, 8,146,128, 72, 40,150,219,114, 60,151, 36,187, 93,238,217,115,244,239,143, 30,133,173,140,142,246, 87,123,122, 54,153, + 48, 97,130,123,159, 62,125, 72, 95, 95, 95, 60,125,250,212,121,219,182,109,181,127,255,253,247,222,217,217,217, 95, 2,136,125, + 19,145,165,206, 70, 61,157, 30, 97, 44, 11, 71,203, 3, 75, 32, 91, 96,192, 45,246, 33,238,189, 3, 98,235,251, 77,155, 54,253, +240,244,233, 83, 44, 92,184, 16, 0, 86,217,249,253,201, 61,123,246,236,186,111,223, 62,209,238,221,187, 69,141, 26, 53,130,135, +135, 7, 10, 7, 83,150,192,212,254,254,254,182, 93, 51, 6, 63, 47, 59, 58,162, 65,148,242, 24,126,237,147,178, 80,228, 3, 83, +243,158,129,189,187, 13, 11,131,131,171, 24, 66, 41, 7,217,153,170,186,143,110,197,119,250,123,215,211, 69, 79, 35,211,127, 84, +199,225,123,148, 28,147,239, 63,129,179,179,243,134, 23, 47, 94,180,147, 72, 36,175,188,255,252,249,243,208,192,192,192, 28, 0, + 95,217, 43,220, 92, 93, 93,183, 51, 12,163,203,204,204, 28, 9, 0, 50,153,236, 15,137, 68,162, 72, 78, 78,254,246,109, 13,100, +204, 40,170, 69,222,115,139,150,197, 95,171,184, 92,135, 4, 73, 51, 45,198,142, 25, 71, 12, 24,248, 73,202,211,231, 47, 24, 14, +151, 63,240,248,137, 19,226, 58,117,234,144,186, 85,171, 96, 74, 79,135,113,210,164,230,167, 79,159, 54,246, 27, 56, 88,195,165, +136, 77, 1,254,213,196,127,238,216,233,177,111,239,158, 22, 0,202, 18, 90,124, 15, 15,143,173,231,206,157,243,246,247,247, 71, +118,118, 54, 98, 98, 98,160, 86,171,209,191,127,127,110,139, 22, 45,188,251,246,237,187, 53, 39, 39,167,165, 29,150, 45,247, 26, + 62,156,195, 99,134,247,169,249,209,135, 45, 36,222,190,213,193,166,104, 17,255, 44,186,209,225,115, 87, 39,108,218,123,244,241, +211, 28,182, 27,138,207,141, 84, 42, 50, 50, 50,166,246,238,221,123,111,187,118,237, 92, 5, 2, 1,188,188,188,136, 30, 61,122, +164, 37, 37, 37,205, 46,183,106, 41, 76, 97, 67,146, 36,109,253, 90, 76,122, 32, 91,224,163, 80, 40,160, 80, 40, 0,192,251, 77, + 71,158,142,142,142,171,100, 50, 89, 95,149, 74,165, 33, 73,146, 37, 8,130,213,235,245, 34,133, 66,113,231, 97,244, 99, 47,157, + 78, 87, 99,201,178,223,151,183,111, 21, 34, 63,117,234, 20,250,244,233,195,158, 60,121,114,140,173,121,234, 8,130, 88,219,187, +119,239,252,153, 51,103,106,159, 62,143,241,126,248,248, 57, 33, 17,242, 25, 23, 23, 23,238,245,235,215, 57, 75,151, 46, 21,206, +154, 53,107, 45,203,178,125,237,184,158,107, 63,249,228, 19,195,215, 95,127,157,252,232,233, 11,183,123, 15,159,178, 82, 33,215, +228,226,226, 76, 93,189,122,149, 41, 15, 39, 73,146,107,166, 78,157,170, 26, 51,102, 76, 86,166, 50,199, 35, 75,149,199, 10,184, +148,209,195,195,131,115,224,192, 1,221,246,237,219,201,209,163, 71,175, 97, 24,166,159, 29,215,119, 77,143, 30, 61,114,167, 77, +155,150,253,228,249, 75,143,123, 15, 30, 67, 44,224, 26,221,221,221,168, 27, 55,110, 24,150, 44, 89, 66,206,155, 55,207,166,114, + 74, 36,146, 45,187,118,237,226, 28, 56, 80,208,246, 93,185,114,133, 12, 8, 8, 16, 91, 31,163,209,234, 64, 18, 64, 70, 70,134, +184, 89,179,102, 91, 0,188, 22,220, 55,108,118, 52,134, 77, 7,190,248,226,139,100,123, 43, 75,152,231,132, 50,143,161, 87, 7, +177, 75,243, 71,244,226,112, 56,204,232,209,163, 83,138,126,174,213,106, 9, 0, 61,176,200,118,177,213,165, 75,151,239,142, 28, + 57, 82,125,219,182,109,191,108,223,190, 93, 15, 0, 66,161,208,101,231,206,157, 11,251,247,239,143,254,253,251,207,220,179,103, + 79,133, 9, 45,154,165, 13, 0, 32, 16, 10, 4,209,209,209, 68, 80, 80, 80,169, 94,174, 6,134,185,249,251,163, 71, 13, 63, 11, + 10,106,164,100,152, 26,188,143, 62,202,155, 60,121,114,134, 74,165, 66, 76, 76, 12, 12, 6, 3,134, 13, 27, 70,181,109,219,214, +171,127,255,254, 43,114,115,115, 63, 6, 96,176,161, 78, 46,241,246,246, 14,207,201,201,201, 51, 91,117, 90, 14,161, 57,173, 67, + 77,130,250, 53,140,124, 30,101,226,117,159,196, 16, 39, 87, 17,234, 32,127, 92, 4, 0, 94, 62,210,237, 28, 12, 20, 11,185, 15, +252,105, 46,230,185,250,136,218,167,199,106,230,168,227, 74, 21, 75, 31, 75, 36,146, 94,106,181,122, 79, 97,231, 92,179, 91,183, +110,184,122,245, 42, 0,180, 40, 20, 90,237, 73,146,252,148, 97,152,245, 0, 74, 75,229, 54,161,103,207,158, 31,236,219,183, 79, + 6, 0,123,246,236,129,209,104, 68, 64, 64, 0,120, 60, 30,248,124, 62,184, 92,174, 37, 59,136,141,240,116,117,117,129,139, 3, + 23, 10, 39,201, 71,223,252,214,147, 83,165,142, 28,105,244,125, 40,217,108,152, 88, 29,120,206, 18,212,234,228,136,176, 15,219, +147,135,214, 68,125,123,232,215,135, 13,243, 73,116, 71, 44,116,239, 74,207, 78,146,164,224,238,221,187,240,242,242,122,229,125, +138,162, 0,160,117, 57, 40,103, 62,127,254,188, 89,100,100, 36,218,181,107, 55,179, 94,189,122,157, 35, 34, 34, 60, 50, 51, 51, +209,174, 93,187, 21, 9, 9, 9, 7,222,246, 57, 89,107,145,255, 21, 83, 23, 89, 68, 73,182, 45, 24, 5,147, 20, 69,145,120,241, + 60,198,216,174, 93,135,161,113,113,113,210, 38, 77,154,144, 92, 46, 23,234,179,103,161,189,113, 3, 82,169, 20,189,123,247,230, +158, 63,127, 94, 46,151,202, 71,189,124,241, 50,151,162, 72,176, 44, 89,166,207,131, 66,161,248,252,219,111,191,245, 8, 12, 12, +132,201,100,178, 68, 52, 55,153, 76,136,143,143,135, 84, 42,197,144, 33, 67,220,196, 98,241,231, 54,158, 71,213,154, 1,110,183, +206, 29, 93,219, 96,242,216, 46,146,154,226, 83,144,196,127, 9,233,158,207, 80, 59,233, 56,166,245,106, 34, 57,249,235,204,176, +234, 94, 78,183,172, 76,172, 54, 67,167,211, 93,140,138,138, 26, 21, 17, 17,193, 0,192,223,127,255,205, 62,124,248,112,204,155, +140, 66, 25,134, 65,118,118, 54, 24,134,161, 10,247,205,175,255,105,125,144,203,229,107, 58,119,238,252, 73,108,108,172,232,216, +177, 99,206,113,113,113, 46, 47, 95,190,116,173, 89,179, 38,103,225,194,133, 71,180, 58, 3,101,164, 89,189,137, 54,230, 38,223, +191,255, 60, 43, 53,245,214,198,141, 27, 53, 4, 65,244,182,241, 55, 62,246,244,244,116,158, 62,125, 58, 8,174,184,113,173,218, +245, 2, 41,174,200,129,228,242, 29, 52, 26, 45,253,226,197,139,248,233,211,167, 87, 11, 9, 9,241, 66,193,244,154, 77,156, 94, + 94, 94, 46, 95,127,253, 53, 56, 2, 89,104,253,144,176,234,124,129, 68, 70,113, 69,178, 38, 77,154,180,125,254,252,121,210,180, +105,211, 60, 27, 53,106,100, 23,103,163, 70,141, 20,163, 71,143, 54, 9, 69,178,102,254,254, 1,181,235, 7,215,238, 90,179,102, +205, 94, 28, 14,199,148,158,158, 30, 59,100,200, 16,207,238,221,187,187,219,195,233,230,230,166,152, 54,109,154,201,215, 47,160, + 83,167, 15, 62,108,202, 19,201, 28, 56,124,137, 99,126,190,150,126,244,232, 81,236,140, 25, 51, 60, 67, 67, 67,221,108,225,204, +207,207,231,186,184,184,160,110,221,186,168, 19, 16,128,156,156, 28,236,219,183, 15,155, 54,109,194,250,245,235,177, 99,199, 14, + 52,108,249, 33,100, 50, 25,146,146,146,160, 82,169,184,255,118,133,162, 87, 7,177, 43,245,225, 61,198,141, 27,151, 52,122,244, +232, 20,145, 72,196, 20,221,156,156,156,232, 65,131, 6,165, 14,249,102, 89, 15,243,212, 98, 25,150,172,187, 71,143, 30,125,182, +109,219, 54,212,169, 83, 7,157, 58,117,226, 3,192,231,159,127,206,239,223,191, 63,118,237,218,133, 61,123,246, 60, 8, 12, 12, +188, 4,160,167, 45,229, 28, 50,100, 72,203,126,253,250, 93,232,215,175,223,237, 1, 3, 6,172, 27, 51,102,204, 43, 61, 87,114, + 82,194, 77,189, 94,143,144,176, 70,226,185, 27,174, 13, 42,139,239, 33,176,109, 93,116,244,166, 31,239,223,143,157, 89,167,142, +163,223,203,151, 78,155,151, 44,113, 49, 39,233, 54, 26,141,136,143,143,135, 66,161,192,160, 65,131, 92, 4, 2,193, 16, 27,138, +185,180,103,207,158,195,227,226,226,164,191,255,254,187,231,237,219,183,189,146,147,147, 61,207,156, 62,225, 58,229,171,207,101, + 14, 82, 62, 63, 41,157, 37, 0,224,101, 18, 36,209, 47,208,146,101,225,104, 61,157, 88, 46,120, 66, 36,242,193,202,234, 45, 29, + 31,127,189, 43,116,192,180,195, 97, 46, 10, 79,193,244, 82,190, 81,127,241,226,197,187, 15, 29, 58, 52,176,101,203,150,123, 1, +136,138, 57, 70,216,176, 97,195,125,187,118,237, 26,222,170, 85,171,139, 0,234,150, 56,138,244,241,233,253,215, 95,127, 57,155, +247, 93, 92, 92, 32, 20, 10, 95, 19, 89, 60, 30, 15, 36, 73,218,125,122,243,119, 14,228, 56,213,214, 33, 42,235, 40,118, 45,190, +139,197, 31, 61, 98, 22, 52,127,169, 91, 53, 36, 26, 39,119,221, 69, 26,238,162,203,103,213, 49,112, 70, 72, 71, 49,141,121,239, + 82, 7,158,158,158,254,105,235,214,173,119,119,233,210, 69, 23, 25, 25,137,244,244,116,120,123, 91,198,218, 41,229,160,116, 18, +139,197,240,245,245, 69, 96, 96,224,192,243,231,207,123, 24,141, 70,188,124,249, 18,105,105,105,183,254,141,115,178,214, 34,239, + 25,138, 58,195, 31,121, 77,104, 21,230, 22, 58, 7, 0, 44, 65,168,239, 70, 69,113, 41, 62,127,240, 31,219,183, 11,120, 60, 30, + 98, 99, 99,241,224,193, 3,228,159, 57, 3,205,229,203, 72, 77, 77, 69, 94, 94, 30,220,221,221,177,118,195, 6,137,158,102, 71, + 60,122,252,152, 98, 73,214,218,223,160,216, 37,158, 2,129,160, 99,159, 62,125, 74, 20,100, 73, 73, 73,232,210,165, 11,151,162, +168,226, 86, 53, 20,229, 36,188, 92,137, 67,103,246,206,245,244,228, 63, 0,158, 78, 6,114,111, 1,172, 14, 48,233,129,196,123, +192,145,217,240,203,139, 38, 78,204, 29,234,225, 45,230, 28, 42, 70, 41,151,181, 20, 53, 32, 40, 40,104,253,224,193,131, 73, 0, +104,223,190, 61, 17, 20, 20,180, 14, 64, 64, 41,223, 57, 93, 70, 39,121, 53, 43, 43, 11,253,251,247,119,174, 94,189,250,233,254, +253,251, 59,155,223, 47, 47,167,217,154, 92,167, 78,157, 76,161, 80,184, 3,176,169,129,181,112, 58, 58, 58,174,234,210,165, 75, +223,237,219,183,243, 0,224,220,185,115, 56,116,232, 16,238,223,191,143, 39, 79,158, 48, 97, 97, 97,174,203,214,239, 94,179,106, +245,150,165,189, 90,132,120,181,109, 28, 86, 91,154,151,149,231,238,238,222,130,101,217, 0, 27,203,217,101,246,236,217, 15, 30, + 62,139,117, 32, 57, 92, 14,143,203, 17,200,229, 18,119,133, 76,226,227, 36, 22,122, 11, 72, 66,154,159,159,159,178, 99,199, 14, + 6, 64, 23, 91, 57,231,206,157,251,226,225,211, 88, 71,130,228,112,184, 28, 46, 79, 42, 21, 59,126,212,169, 93, 35, 0,224,129, +229,169, 84,170,212, 77,155, 54, 25,236,225,252,225,135, 31,162,148,217,121, 10, 14,151,203,229,112, 40,203,181,148,136, 68,174, + 98,129,128,175,211,233, 18,151, 47, 95,174,177,135,115,246,236,217, 15, 30, 61,139,115, 34, 9,130, 34, 8,146, 35,151, 73,156, +157, 29,196,174,174, 82,145,139,152, 67,241, 85, 42, 85,226,214,173, 91,109,226, 52, 24, 12,188,212,212, 84, 60,124,248, 16,190, +141, 26,225,212,169, 83,168, 82,165, 10,250,247,239,143, 79, 62,249, 4, 34,145, 8,237,155,213,195,244,233,211,241,236,217, 51, + 24, 12, 6, 65,113,156,102, 63,169,162,240,242,242,138, 44,171,242, 20,249,238, 43,229, 12,245, 0,187, 82, 31,222,195, 90, 96, +149,196,239,228,228, 68, 23,103,237, 42,202,217,165, 75,151,239,206,156, 57, 83,125,235,214,173, 61,134, 12, 25,114,113,235,214, +173,104,218,180, 41, 30, 62,124,136,106,213,170, 97,243,230,205,248,228,147, 79, 46,174, 88,177,162, 71,100,100,100,136,191,191, +255,183,101,113, 14, 24, 48, 96,124,104,104,232,217,148,148,148,102, 74,165,178,238,190,125,251, 70,244,238,221,251,197,192,129, + 3, 59, 88, 4,163,209,184,253,200,193,189,232,218,163, 15,106, 5,215, 93, 51,236,219,109,245,202,120, 54,217,251,192,186, 77, +201,201,233,219,181,218,252,254, 92,174, 88,124,237,154,211,158,213,171, 93,172,151,124, 39, 38, 38,162,123,247,238, 92, 30,143, +215,170,140,114, 46,238,213,171, 87,255,125,251,246, 41,204, 86,157,203,151, 47,227,222,189,123,136,137,137, 65,118,118, 54, 58, +140,201,195,184,133, 5,220,227, 22,178,248,240,115, 86, 82,206, 54,196, 2, 81, 21,120, 56,203, 57,151, 70, 44,175,245,121,248, +154, 58, 28,169, 19, 23,127,124,243, 4, 25, 47,117,123, 74,224, 36,154, 53,107,182,173, 95,191,126,132, 94,175,135, 94,175,215, + 3, 40, 54,170,175,183,183,183,176,126,253,250, 24, 51,102, 12, 41,151,203, 87,148, 84, 78,181, 90,173, 59,122,244, 40,134, 12, + 25,130, 47,191,252, 18, 53,106,212,128, 66,161, 0,151,203,197,150,109,127,186,124, 50, 98,108,205, 6, 45, 91,135,212,105,208, +180,126,174,142,106,196, 21, 41, 70,151, 96, 13, 41,246,220,243,220, 34, 17,245,242, 10, 86,246, 72, 96,174,111,206,207,155,242, +233, 79,209,143, 34, 82,239,127,219,111, 93, 20,123,165,121,198,182,137,113, 72, 53, 62, 68,171,254,126,240, 15, 85, 76,146,248, + 34,168,188,215,211, 70,216,197, 89,175, 94,189,150,215,175, 95, 23,180,110,221, 26,177,177,177,224,114, 45,227, 41,250, 77,202, + 57,123,246,108,129, 86,171,197,157, 59,119, 48,116,232,208, 68,131,193, 48,233, 77,202,105,143, 69,203,172, 69,222, 51,172, 43, +178, 37,151,100,209,154, 13, 0, 70, 6,135, 6, 15, 29,145,127,248,240, 97, 49,159,207, 71,108,108, 44,146,147,147,177,101,211, + 38,186,189,155, 91,110, 39,111,111,213,150, 77,155, 88,189, 94, 15,150,101, 17, 20, 20,132,190,125,251,138, 62,238, 63, 48,141, + 80,105,254,180, 97,154,199,211, 60,191, 62, 98,196,136,215, 62,159, 50,101, 10,228,114, 57, 8,130,240,176,225,228,250, 77,152, +221,203, 71,225,239,152,202,166,108, 81,130, 18, 2, 28, 25,192,145, 3, 66, 7, 64, 32, 3,248, 98,232, 34,207, 42, 73,182, 83, + 76,159, 86, 35,189, 1,216, 51,213, 3, 47, 47,175,153,103,207,158,117,141,140,140,100, 85, 42, 21,146,147,147,217, 5, 11, 22, +184,122,121,121,205, 44,239, 29, 73, 74, 74,154,219,181,107,215,212,161, 67,135, 58, 28, 63,126,220,119,232,208,161, 14, 93,187, +118, 77, 77, 74, 74,154,251, 38,119,154,199,227, 81,247,239,223,119,154, 55,111,222, 39, 0,110, 6, 7, 7,103,122,123,123,223, + 68,129,211,100,169,144,201,100, 22,145,101,182,174,113, 56, 28,112,185, 92,120,121,121,233,149, 74, 37,221,170, 65,128, 40,200, +129, 52,122, 9,120, 34, 39,145,208, 71, 38,119,104,146,153,153,121,151, 32,136,231, 54, 78,241,133, 54,110,220,152, 75,179, 92, +102,220,224,246, 94,159, 15,111,231,246,219,188,209, 85,150,207, 13,247, 94, 60,107, 84,208,220,169,131,218,145, 12,163,173, 86, +173,154,135,217,161,221, 6,243,121, 88,195,134, 13, 57, 12,184,120,248, 56, 38, 53, 54, 33, 49,247,131,182,205, 44,150,203, 58, +161, 97,157, 92, 93, 93, 91, 7, 5, 5, 53, 36, 8,194,166, 37,201, 34,145, 40,180, 86,173, 90, 28,146,226, 18,206, 10,153,175, + 76, 42,114,183, 76,161, 56, 58, 54,119,114,117,237, 71,178,108,142,167,167,167,155, 72, 36, 10,181,227,220, 57, 12,120,112,119, +115,114,112,117,113,148,118,106,215,162, 70,179,230,205,106,214,107,210,180, 89,112,131,134, 31, 19, 38,147, 42, 32, 32,192,205, +236, 36, 95,134,165, 85,184,125,251,118,204,155, 55, 15,245,253,252,224,237,237, 13, 55, 55, 55, 92,190,124, 25,215,175, 95,135, + 66,161, 64, 90, 90, 26,150, 44, 89,130,253,251,247,195, 96, 48,200,236,173, 79,182,136,173,210, 96, 50,153,200,162, 2,171, 36, +126,145, 72,196,152,157,228, 75,194,209,163, 71,183,153, 45, 89, 19, 39, 78,108,185,108,217,178,139,209,209,209,144, 74,165,184, +126,253, 58, 70,140, 24,113,113,197,138, 21, 45,199,142, 29,139, 77,155, 54,225,197,139, 23, 27, 74,227, 27, 48, 96,192,172, 81, +163, 70, 45,143,136,136, 32,221,221,221,161, 80, 40,208,171, 87, 47,108,216,176,129, 99, 50,153, 54,246,235,215,239,118,191,126, +253,110,211,241, 39,191,219,189,126,193,229,168,187,183, 49,126,194,215,124,189,201, 56,205,134,211,103, 53, 82,105,174,169,117, +107,229, 46,163, 49,127, 0,143, 39,118,184,125,219,233,208,198,141, 22,177, 53,125,250,116, 56, 56, 56, 0, 5, 14,204, 40,197, +170, 19,190,127,255,126, 75,123,232,236,236, 12, 62,159, 15, 30,143, 7, 46,151, 11,138,162,112,122,141, 4,171,167, 23,232,139, +213,211, 9,156, 92, 69,168,223,228,222,137,189, 81, 87,225,206,191,253,217,230,224,144,186, 29,156,113,121,103, 10, 22,116,141, + 76,184,190, 43,125,178, 54, 13, 63,151,240,181, 6, 83,166, 76,169,147,150,150,134, 27, 55,110,224,198,141, 27, 37, 89,128,180, + 7, 15, 30, 92,148,151,151, 7,127,127,127,244,236,217,179, 53,128, 70, 37, 60, 55,104,216,176, 33,186,119,239,142,118,237,218, +161,126,253,250,208, 27, 76,220,126,131,195,107,221,127,145,238,189, 96,201, 2,241,217,191,247,145, 23, 47, 70, 80,219,246,158, +116,104,214,238,195,229, 60,153,231, 85,136,156, 61,109, 57,207,124, 58, 19,161,158, 31, 97,221,153, 9,228,202,115, 67,165, 91, + 14,173, 12,144,201,100,196,173, 27,183,141, 91,126,221, 21, 87, 87,210, 51,237,234,206, 76,228, 19, 41,232, 48,220,159,100,128, +190,239, 74,207, 46, 20, 10,151, 69, 68, 68,120, 24, 12, 6, 68, 69, 69,225,203, 47,191,212,190, 33,165,197, 0,226,235,235,139, +115,231,206, 97,208,160, 65,218,212,212,212, 43,255,214, 57, 89,107,145,255, 21,112,172, 20,164, 5,241,241,241,217, 10,133,194, +187, 86,173, 90,164, 94,175, 47,152,146,216,179,135, 94,191,113,227, 17,173, 86, 59, 1, 0,111,213,111,191,173,241,246,241,105, + 55,120,200, 16,194,104, 52,162,107,215,174,252,195,135, 15, 59, 63, 79, 75,203,181,161,195,121,229,247,134, 13, 27,134,101,203, +150, 1, 0,190,248,226, 11,139,105,157,176,193, 97, 73,234,128, 46,157,186, 53,148,199, 75, 86,202, 13,205,141,121, 85,159,201, +174, 74,242, 68, 13, 65,242, 57, 16, 82, 96, 12, 70,211,147,180,222, 55,159, 61,169, 93, 71,164,204,172,214, 49,184, 13,214,159, +218,218, 37,159,214,238,178,185,193, 17,139, 27, 75,165, 82,220,188,121, 83,217,176, 97,195,108,150,101, 29,230,206,157,235, 34, + 22,139, 27,191,193,181,127,249,248,241,227,214, 45, 90,180,248,156, 36,201,142, 12,195,156, 78, 77, 77, 93, 5,224,165,141,223, + 31, 7,224, 7, 0,150,145,165, 94,175, 7, 73,146, 96, 89, 22, 3, 6, 12,192,244,233,211,235,220,187,119, 15,103,207,158,117, +234,216,177,227, 85, 0,217, 0, 70, 2, 40,214,106,166, 82,169, 52,215,175, 95, 23,157, 61,123, 22, 12,195,192,201,201, 9,114, +185, 28, 2,129, 0,189,122,245,146, 78,155, 54,173,195,137, 19, 39,210, 84, 85,171, 80,194,228, 68,181, 64, 42,149,193,195,187, +213,216,129,159, 70,179, 44,187,223,142,198,129, 47,226,152,180, 4,173, 35, 23,127,191,130, 20,243,120,132,144,199,129,128,201, +199,119,139,230, 19, 60,150,230,192,206,249,121, 30,143,199,147, 9,160,167,248,148, 81, 76,160, 66,162,196, 81, 20,197, 23,242, + 74,246,199,224,146, 36, 73,146, 36, 15,128,205, 73,251, 4, 2, 1, 79, 38, 96, 75,228, 20, 81, 4, 69, 16, 4, 31, 37,172, 68, + 11,245, 0,107,182, 34,241, 39, 60,215, 89,139,226, 86,173, 90,225,200,217,155,216,115,232, 52, 50, 98,239, 98,198, 55, 19,209, +168, 81, 35, 28, 62,124,184,212, 50,153,125,180, 74,178, 46,123,121,121, 69, 38, 37, 37, 53, 40,233,187,165, 77, 25,150, 96,165, +122,157,255,123, 7,132,205,142, 70, 25, 62, 90, 61, 91,181,106, 53,126,251,246,237,250,206,157, 59,243, 7, 12, 24,128,186,117, +235,182, 28, 62,124, 56, 0,160, 99,199,142, 88,182,108, 89,203,225,195,135,227,207, 63,255,196,190,125,251,116,109,219,182,253, +230,220,185,115,137, 40, 88,209,249, 26, 24,134,233,190,118,237,218,162,150, 66,152, 76, 38, 24,141, 70, 79,147,201,228, 89,216, + 22, 97,249,242, 21, 25, 39, 79, 28,198, 55,223,206,134,155,171, 71,168,141,117,136, 24,246,245,215, 25,155,151, 44,193,146, 63, +255,196,215,213,170,137,183, 62,120,128,147, 90, 45,118,157, 61,155, 81,248, 59,101,250,102,170,213,106,205,209,163, 71,229,187, +118,237,130,163,163, 35,106,212,168, 1, 39, 39, 39,112,185, 92,144,148, 8, 20, 79,129, 90,193,141, 1, 92, 7, 0, 84,243,130, + 58,200, 31, 23, 9, 2,217, 44,105,191, 79,145,160, 10,170,186,248, 8, 35,198,111,170,235, 40,119,227,225,248,170, 56,156, 88, + 25,191, 95,155,129, 95, 96,194, 35,148,236,243,213,208,223,223, 31,105,105,105, 56,122,244,168, 26, 40, 81,144,129, 97,152, 69, +191,253,246,219,148,111,191,253, 86, 16, 20, 20, 4, 0,161, 0,110, 20,119,172, 68, 34,129,183,183,183, 69, 88, 14, 24, 58, 54, + 96,204,228,177,162,222, 31,182, 3,135,227,130,108,181, 17,153,185, 70, 40, 92,164,248,102,114, 63,225,233,134,222,141,214,174, +248,227,160, 70,131, 70,192,235,237, 1, 65,224,198,181,187, 23,235, 9,131, 0,130, 4,226,201,191, 65,128, 64, 30, 97, 4, 65, + 81, 44, 77,211,136,139,139, 3,203,178, 24,212,123, 68,124,248,130,125,110, 45, 7,169,224, 91,203, 11, 4,139, 54,239,138, 16, +112,118,118, 14,205,204,204,196,203,151, 47, 49,116,232,208,196,140,140,140, 83,106,181,122, 68, 82, 82, 18, 0, 40,203, 65,105, + 17,243,161,161,161,104,220,184, 49,250,247,239, 47,204,207,207,239, 23, 16, 16,224,157,158,158,222,252,109,158, 79, 81, 45,242, + 63, 37,180,138,125,208,140,198, 90,186, 53,107,160, 62,125, 26,252,147, 39,177,203,203, 43, 79,171,213,126, 5, 32,190,240,193, +159,184,105,243,230, 75, 61,174, 92,145,235,163,163, 17,112,239, 30,184,142,142,161,246, 22, 96,227,198,141, 80,169, 84,200,201, +201, 1, 0,172, 92,185, 18, 42,149, 10, 38, 27, 19,206,114,120,104,233,225, 86, 13, 41,120, 2,134, 67, 74, 99,106,229, 55,149, +106,101, 73,222,113,238,234, 28,210, 27,209,177, 77, 36,154, 76,125, 83,130,210, 67,155,145, 15,239, 22, 53,192, 1,167,165, 61, +101, 52,207,251,115, 56, 28,229,227,199,143,187,215,172, 89,243, 16, 0,151,242,248, 3, 20,193,211,212,212,212, 9,229,249, 34, + 69, 81, 63,188,120,241,194,109,195,134, 13,159,207,157, 59,151,181, 22, 90,230,255, 57, 28, 14, 88,150,133,131,131, 3,184, 92, +174,251,229,203,151,221,155, 52,105,242, 43,195, 48,161, 37,156, 39, 91,183,110, 93,188,120,241, 2, 28, 14, 7, 14, 14, 14, 96, + 76, 6,204,158, 60, 22, 52, 37,224, 76,157, 58, 53,180, 79,159, 62, 81, 27, 54,108, 48,202,155,181,104,158,153,153,121,127,252, +160,193, 81, 7, 14, 28,208, 23,134,120, 40,123,136,207,178,183,159, 60,121, 66,249,120,185, 83,172, 41,159,145,240, 0,225,221, +229, 44, 95,234, 1, 33,135, 98,121, 4, 9,129, 80,228,240, 50, 33, 33,147, 97,152,135,182,112, 50, 12,115,235,197,139, 23, 34, +119, 55,103, 78,190, 70,159, 39,226,178,252,152, 91, 55,159, 87, 13,107, 24, 0, 0,218, 91,215,207, 9,106,213, 22,197,164,166, + 75,170, 85,171,102, 19,167, 70,163,185,157,152,152, 72,185,187,187,115, 98,227, 19, 14, 58, 74, 37,174,114, 71,199,166, 0, 96, +200,205,185, 78,234,116,233, 20,151,227,158,158,153,169,212,104, 52, 47,108, 61,247,103,207,158,113, 60, 61,221,168,227, 39,207, + 28,114, 23, 11,220,100,124,142, 92, 64, 16,132,152, 34, 84, 60, 19,147, 33, 20,139,221, 94, 38, 36, 40, 89,150, 45,209, 66,248, + 99,246,224,222, 5,247,107,246,159, 86,220,184,123,247, 46,142, 93,124, 8, 9,171, 7,161,205,193,201, 77,191, 99,208,212,111, +223,216,239,175, 44,177, 85, 46,107,214,218,218,145, 69,248,145, 92,134, 35,252,160, 65,131,102,111,219,182,205,226,128,242,240, +225, 67,180,111,223,222, 60,205,129, 78,157, 58,161, 73,147, 38,120,248,240, 33, 2, 3, 3,113,246,236, 89, 1, 69, 81,130,193, +131, 7, 47,248,227,143, 63,142,150,105,247, 95,183, 14, 35, 70,140, 40,206,177,250, 25, 0, 45,161, 8,202,155,254,227, 22, 23, +101,102, 6,210,210, 83,110,219,122, 29, 8,130,192,176,175,191,206, 88,171,215, 99,251,181,107, 24, 34,145,136, 55, 63,125,138, +174, 77,154,160, 94,251,246, 25,182,180,117,102,171,142, 86,171, 5,151,203,133, 92, 46,135,179,179, 51,120, 60, 30, 40,174, 23, + 56,252, 16,144, 60, 30,194, 90,133, 96,201, 87,146,252,161, 31, 97, 5, 65, 32, 91,192,199, 45,158,184, 68, 95, 29, 66, 82, 5, +189, 88, 22,170,252,120,252,109, 22, 36, 14,126,112,224,202,184, 39, 71,253, 26,228, 40,119,227,225,216,138, 88,156,252, 53, 97, +175, 54, 5, 51, 10,175, 5, 83,202, 64,162,158,163,163, 35,226,227,227, 17, 23, 23,247, 0,165, 59,248,231, 63,124,248,240,185, + 64, 32,168,227,234,234, 10, 0,254, 37, 13,204, 25,134,177,248, 97,109,221,190,219, 37,180,117,128,240,131,150,117,176,229,208, +124,124,214,111, 5,184, 20, 1,154, 54,224,151,101,221, 64,235,242,208,175, 71, 56,209,166, 99, 96,200,233, 67,250, 81, 70, 77, +214,239,175, 13, 4, 56,152,247,211, 39,151, 29, 5, 82,178, 30, 24,194,209,197,197, 77,194,227,241,224, 44,247,212,127, 59,102, + 82, 50,203,178,150,231,134, 75,241,140,100,174,147, 38, 51, 37, 79,228,200,213, 0, 44, 89,181,124,209,108, 42, 30, 9, 9, 9, + 19, 90,183,110,189, 32, 55, 55, 55, 75,173, 86, 15, 2, 0,127,127,127, 63,146, 36, 5, 0, 74,155, 29,241, 67,241, 97, 33,120, +247,238,221,131, 76, 38, 67, 98, 98,162,181,241, 5, 12,195,188, 51,139, 0,222, 81,132, 1,184, 5,192, 19, 64, 87, 88,133,119, + 32, 11, 77,117,109, 14, 31, 62,204, 30, 62,124,184,141,165,243, 98, 89,198,164, 84,130,213, 21, 92, 91, 46,151,203, 2,176, 94, +209, 36,118,116,116, 36,184, 62, 62, 32, 4, 5,174, 31,108, 5, 46,125, 53, 26,109, 11, 45,195,208,160, 64, 24,192, 90, 13, 90, +212, 66, 2,243, 93, 58, 96, 2,127, 38, 82,248,142,214, 61, 29, 96, 98, 65,131,161,236, 44, 14,171, 86,171, 97, 50,153, 20,213, +171, 87, 63, 98, 50,153, 20,133,157, 27,251, 95,221, 81,154,166,159, 83, 20,133,207, 63,255, 28,102,235,143, 94,175, 71, 74, 74, + 10,116, 58, 29,244,122, 61, 94,188,120,129,156,156, 28,232,245,122,220,191,127, 31,254,254,254,160, 40,202,179,148,198,156,101, + 89, 22,190,190,190,168, 90,181, 42, 40,130,197,250,197,179,240,221,151, 99,241,137, 63,131,141,171,126, 65,219,182,109,107, 87, +171, 86,173, 25,135,195,161, 61, 60, 60,120,251,246,237, 59, 72,211,116, 47,216,222,242, 28,157, 62,125,122,213,224,224, 96, 55, + 71,185,204, 40,224, 83,224, 27,213,172, 64,151,201,114,242, 51,224,235,235,103,130, 72, 28, 56,100,200, 16,186, 36, 43, 68,113, +156, 95,125,245,149,103, 80, 80,144,131,194, 81,166,230,115,169, 52, 30,216,140,156,187, 55,174, 2, 0,223,213, 77, 11,161,184, +206,208,161, 67, 77,246,112,206,156, 57,211,223,213,213,213,145, 4,155, 75, 27, 12,255,204,183,235,244,153, 4,151,171, 1,143, +223,240,139, 47,190, 32,236,225,156, 50,101, 74,181, 58,117,234, 56, 58,202, 37,121, 28, 46,149,204, 99,152,100, 33,152, 20,174, +222,144, 37,116,117,201,135, 88, 26, 54,100,200,144, 18, 57,205,214,172,105,211,166,197, 23, 17,222, 80, 42,149,208,166, 68,129, +151, 24,141, 16, 41, 23,141, 92, 21, 16, 8, 4,150,165,239, 37, 85,215,146,124,180,138, 19, 91,182,126,183,225,156, 82,166, 0, +215,214,142, 44, 26, 55, 43, 41, 41, 9,158,158,158,165, 62, 79,127,252,241,199,183,237,218,181, 75,235,212,169,147,254,200,145, + 35, 32, 8, 2,103,207,158, 69, 98, 98, 34, 58,117,234, 4,150,101,205,171,218,112,251,246,109,116,236,216, 81,223,186,117,235, +196,194,248, 90,101, 98,196,136, 17, 48, 26,141,200,203,203,131, 82,169,196,225,195,135, 17, 18, 18,194,138,197,226, 62,148,239, +135,243,251,141,250,182,121,221,250,161,248,117,197, 18, 61,159,195,253,209,158,231,149, 32, 8, 12,253,234,171,140,156,176, 48, +229, 86,181, 58,127,152, 92, 46,174, 30, 31,239,116,243,196, 9, 23,131,193, 96, 19,135,217,170,227,227,227, 99, 17, 89, 60, 30, + 15, 28,190, 43, 40, 73, 61,240,157, 59, 65,236,209, 7,127,223, 18,232, 28, 36,216, 47,147,226,184,196,177,228,208, 14, 98, 95, +204,111, 62,192,115, 95,139, 79, 60,207,136,171, 96, 67, 97,127, 64,178, 28, 98,223,240, 95,106, 86,119,173, 42,194,149,221, 41, + 56,249,107,194, 95,218, 20,204, 2,240,180,172,231,220, 96, 48,104,105,154, 6, 73,146,224,112, 56,214, 62,129,151,254,250,235, + 47,220,188,121, 19,176, 10,219,147,155,155, 75, 83, 20, 5,161, 80, 8, 0,210, 82,218, 59,112,185, 92,112,185, 92,156,187,122, +222,249,147,143,187, 17,151,239,156, 66,139,144,129,200,204, 51, 32, 53,199,128,236,124, 32,184,209, 12,212,237,184, 31,119, 95, +228, 34,180,126, 93,138,226, 75,134, 22,199,167,125,137,120,117, 28,250,102, 62, 96,106,232, 19, 68,199,174, 28,120,248,224,252, +158,187,247,119,254,118,232,105,243, 70,173,213,133,198, 4,228,229,229,177, 4, 65,176,147, 70,127,251,124,235,136, 44,122,197, +160,187, 12, 71, 39,124,246, 47, 54,245,126,174,174,174,151,157,157,157,207, 22,138, 35, 63,153, 76,118,201,211,211, 51, 26, 5, + 11, 61, 14, 36, 39, 39, 7,169,213,234, 22, 40, 88,156, 21,155,153,153,217,190,208,242, 20, 91,138, 37,108,131, 74,165,154, 72, +211,116,143,194,237, 35,154,166, 67,159, 60,121, 82, 39, 52, 52,244, 65, 64, 64,192,237,128,128,128, 99, 1, 1, 1, 7, 3, 2, + 2, 14,182,107,215,110,153, 57,220,195, 91,158, 54,124, 77,139,188,103, 66, 11,133, 34,107, 93,225, 43, 44, 66, 11,192,185,162, + 14,104, 38,129,224,190,105,252,120, 56, 30, 60, 8,238,147, 39, 24, 62,116,168, 92, 44, 22,175, 64, 65,140,166, 22, 82,169,244, +215, 89,179,102,201, 92, 22, 46,132,215,249,243,136, 57,124, 24, 70, 46,247, 70,121, 74,167,209,104,192,225,112, 44,150, 24,137, + 68, 2,154,166, 81,156,201,247,181, 7,208,132, 43,137,169,209,224,163, 42, 24,176,121,199, 85,173,175, 13,124, 62,195,237,176, +202, 63,240,169,154, 23, 56,199,181,169,219, 10,191,150,215,212, 4, 39,143,239, 40, 68, 92, 92, 60,104, 48,118,205, 55,107,181, +218, 28,181, 90,141,208,208, 80,231,155, 55,111, 86, 15, 9, 9,113, 42,124,255,250, 27,222,152,102, 94, 94, 94,187,189,189,189, + 95,122,121,121,237, 6,208,204,142,239,110,184,112,225, 2, 40,138,194,172, 89,179,144,155,155, 11,131,193,128,204,204, 76,196, +197,197, 65,175,215, 35, 33, 33, 1,143, 30, 61,130, 94,175, 71, 76, 76, 12,116,186,178, 7, 36, 12,195, 64, 46,151, 67,171,201, +195,234,249,223, 97,230,180,201,200,121, 22,137,132,164, 84, 56, 58, 72, 48, 97,194, 4, 74,161, 80, 48, 12,195, 84,165,105,186, + 35,195, 48,107,108,185, 79, 86,245,237,162,175,175,111,221,197,139, 23,215,249,110,254, 26,158,156,147,199, 10,100, 66,134, 47, + 19,176,252,218, 77, 49, 98,198, 10,222,242,165, 63, 63,190,114,229, 74, 34,108, 11,222, 73, 2,184, 24, 22, 22, 86, 51, 49, 49, + 49, 36, 40, 40,168,150,139, 95, 53,129,192,211, 59,155,231, 89, 69,197,234,180,215, 8,239, 42,173,214,172, 89, 19,117,233,210, +165, 36,123, 56, 37, 18, 73,237, 45, 91,182,212,117,119,119,175,203, 21,137,132,249, 57, 57,187, 76,249,234,221,148,163, 66, 72, +202, 29, 63,218,191,127,127,228,222,189,123, 83,236,225, 12, 12, 12, 12,154, 63,127,126,112,189,122,245,130, 61,252,171, 11, 68, +222,190,153, 66, 31,191, 76, 81,189, 16, 1,124,170,118,254,245,215, 95,111, 95,185,114,197, 38, 78,138,162, 76, 36, 73,130,203, +229, 66, 44, 22,227,248,241,227, 24, 63,106, 32,124,189,157, 81, 43, 40, 8, 29, 62,155,136,189,123,247, 90,124,120, 40,138, 42, +177, 71,223,188,112,194,161, 48, 79, 34, 18,107,107, 71, 98,109,237,200, 48, 79, 34,178, 68,177, 85,248,121,113,199,216,212, 26, +149, 48,221,104,131,216, 58,122,238,220,185, 69,195,134, 13,227,119,233,210, 5,215,174, 93,195,136, 17, 35, 46,238,219,183, 15, + 0,112,237,218, 53, 76,154, 52,233,226,153, 51,103, 48,118,236, 88,180,111,223,158,127,225,194,133, 95, 97, 67,236, 31,147,201, +132,141, 27, 55,194,100, 50, 65, 42,149,194,201,201, 9,221,186,117, 67, 84, 84,212,216, 77,155, 54, 69, 83, 92,238,167, 93,123, +124,140, 35, 7,247,225,209,253,168,177,155, 23, 12,182, 59, 40, 48, 73,146,232, 50,116,104, 70, 70,112,176,114,179, 74,149, 63, + 82,161, 16, 7,165,164, 56,253,189,123,183,139, 13, 66,141,160,105,218, 34,174,204,162,195,188,113,248,174,224, 72,234,130, 35, +107,132,187, 79,121, 70, 94, 19,220,226, 55,194,195,210,226,103,113,249,228,136, 62,223,249,163,207,119,254,232, 57,181,218,112, +113, 21,172,151, 84,193,184, 46, 95, 86,109, 23,208,200, 1,170, 52, 3, 14,255, 18, 19,171,205,196, 66, 0,143,108,121,206, 25, +134,121,144,152,152, 8, 62,159,143, 42, 85,170,212, 4, 96,246, 11,220, 48,122,244,232, 47,230,204,153, 51, 25,192,156,194,247, +164,237,218,181, 11,206,203,203,195,147, 39, 79, 0,224,102, 41,214, 96,203, 42, 67,165, 42, 70, 80,205,171, 30, 66,106,143,129, + 66, 81, 31,137, 74, 61,146,148,122,172, 95,221, 11,145, 23,230,225,230,201, 33,136, 77, 73,129,200,163, 55,104,147,174,174, 13, +131,122,175, 59,119,238, 16, 23, 46, 92, 32, 24,134,129,209,104,100,115, 85, 42,246,214,197,139,208, 68, 68, 16,114,185,156,104, +217,184,117,222,230,121, 71,174,239, 95,117,241,166, 33,223,238,129,250,155, 96,230,243,231,207,155,237,222,189,187, 29,128,153, +245,234,213,187, 18, 23, 23,215,252,252,249,243,181,124,124,124, 86,148,151,212, 28, 22, 34, 38, 38,230,149,173, 48, 44,132,190, + 80, 52,116, 41, 20,115, 61, 1, 76,194, 27,172,178,183, 3,231,222, 99,103,248, 35, 40,178,218,176,168,208,178, 14, 20,134, 0, +133, 66,102, 52, 26, 18, 78,157, 58,101, 32, 73, 18, 98,177, 24,195, 70,140, 32, 87,255,246, 91,171,129,205,154,157, 13,255,224, +131, 99,103,207,156, 9,107,210,164, 9, 88,150, 5, 73,146,248,243,207, 63, 53, 90,173, 38,211,215,215,215,209,150, 70,195,250, + 1, 82,169, 84, 22,161,149,147,147, 3,119,119,119,155,167, 14,213, 42,156, 62,115, 60, 50,139,165, 63,139,235,242,116,169,225, +199,148, 94, 77,178, 25,154,147, 67, 27,145,163, 97,145,171, 5,231, 26,233,212,100, 88, 96,111,195,139,142, 77, 30, 69, 68, 95, +206,212,210, 90,187, 86, 75,164,165,165,125,215,175, 95,191, 76, 79, 79, 79, 66, 46,151,195,219,219,155,236,217,179,103, 70,124, +124,252,156,242,222, 17,103,103,231, 79,218,181,107,119, 40, 49, 49,177,111, 68, 68, 68,213,243,231,207,247,109,215,174,221, 33, +103,103,231, 79,108,164,216,245,237,183,223,170,249,124, 62,154, 54,109,138,220,220, 92, 20,174,242, 41,117,179,101,138,148,199, +227, 97,237,226, 31, 48,115,218,100, 40,163,175,225,238,197, 83, 56,151, 66, 96,198,252,159,193,227,241,202, 21,235,171,134,171, +184, 94, 61, 47,217,195, 73, 35, 6, 36, 77,159, 54, 77,118,251,246,109,238, 23, 95, 78, 98, 99,146,149,224,119, 89, 66,161,205, +119,228, 29,181, 43,186,126,212, 1,179,102,126, 93,175, 48,104,103,169,168,237, 42,174, 87,215, 75,246,224,235,240,129,207,191, +252,242, 75,209,143, 63,254,168,109,214,172,153, 38, 53, 53, 85, 36, 81, 56, 5,113, 28, 28,235,198, 36,167, 72,155, 53,107,246, +226,179,207, 62,203,182,151,115,198,140, 25,226, 19, 39, 78,112,250,245,235,103,202,202,202,146,114, 69,162, 80, 66, 32,108,156, +158,149,229,208,183, 95,191,167,125,251,246,205, 47, 12, 88,106, 51,231,247,223,127, 47,126,244,232, 17,167, 89,179,102,198,148, +148, 20,153,196,217, 37,132,114,116,106,244, 50, 57, 85,222,184, 73,147,103, 95,124,241,133,186,180,114, 90,139, 20,153, 76,150, +216,162, 69, 11,252,242,203, 47, 88,190,124, 57, 58,119,238,140,168,251, 81,232,250,197,100,212, 25, 55, 9, 7, 47, 95, 69, 98, + 98, 34,230,206,157,139,144,144, 16,240,120,188, 71,197, 62,143, 99,163,137,219, 41, 32,110,167,128, 32,198, 70, 19,230,253, 18, + 45, 91,115,114, 96,125,124,113,199,221,252,190,120, 75, 87,152, 39, 17, 89,154, 31, 86, 89, 98,171,111,223,190,227,205, 33, 28, + 70,142, 28,121,113,197,138, 21, 45, 71,142, 44, 24,104, 55,109,218, 20,243,230,205,107, 57, 99,198,140,139,243,231,207, 71,135, + 14, 29, 16, 16, 16, 80,230,194, 23,154,166, 97, 50,153, 48,112,224, 64,152, 76, 38,164,167,167,227,241,227,199, 88,183,110, 29, + 88,150, 21, 2,128,167,151, 79, 67, 62,159,143, 59,183,110,228,207, 28,217,228, 15, 59, 44, 89,132,245, 32, 38, 47, 47, 15,125, +199,141,203, 72,168, 81, 67,185, 38, 35, 35,127,148, 66, 33,174, 22, 27,235, 36,211,235,189, 81,138, 95, 34, 65, 16, 96, 24,198, + 34,172,204,130,171,232, 86,216, 81,218, 4, 67, 62,115,244,252,182, 36, 0, 64,235,193, 94,232, 57,181,218,112,207, 64,241,202, + 86,131, 10,140,222,123,231, 61,103,115,147,232, 31, 97,196, 3, 59, 44,214,215,174, 93,187, 6, 71, 71, 71,244,235,215, 79, 64, +146,228, 66,243,120, 21, 5,177,179,150,154,185, 4, 2,193,146, 33, 67,134,144,217,217,217,184,123,247, 46, 0,156, 41,169, 93, + 98, 89,214,114,238,121, 74, 2, 52,195,199,165, 91,199,113,242,252, 30,188, 76, 76, 71,108,154, 22,224, 56, 64,171, 78,128, 65, +147, 8,125,246, 45,168,116, 98,155, 10,204,227,241,210,235,213,171,199, 54,106,212,136,101, 89, 22,207,158, 61, 51,197,196,198, +154,110, 44, 91,198,222, 27, 51,134,144, 61,126,204, 19,137, 68,132,191,191, 63,132, 66, 33, 35, 20, 10, 51,255,197,206,251,173, +132, 91,120, 11, 97, 33, 42,210,170,197,226,253, 68, 50, 94, 93,109,104, 9, 96, 90, 92,192, 82,176,114,209,128, 61,191,174,118, +232, 55,112,176, 58, 36, 36, 68,225,237,237, 13,130, 32,208,171,119,111,162, 93, 68,132,140,235,229, 5,231, 6, 13, 44,211, 17, +167, 79,157,194,241,227,199,213, 71,254,218,239, 61, 98,212,168,238, 0,182,148, 82, 24,142, 64, 32,176,252,110,114,114, 50, 4, + 2,129,197, 39, 66,165, 82,193,213,213, 21,201,201,201,182,102,190,222, 58,125,218,213,105,105, 77,190,243,111, 34,227, 18,199, +212, 41,160, 89, 22, 92,130, 6, 52, 44,140, 52,160, 51,178,104, 88,141,114, 58,169, 49, 41, 14, 95,219,247, 2,192, 86,123,174, +158, 78,167,251,251,246,237,219, 99, 24,134,217, 3,128,140,136,136, 96, 30, 60,120, 48, 30,182, 59,174,191,110,182, 23,139,167, +158, 61,123,214,105,234,212,169, 89,135, 15, 31,206,233,214,173,155,195,186,117,235,156,218,183,111, 63, 53, 51, 51,115,167, 45, +134,192,184,184,184, 45,241,241,241,227, 27, 53,106, 4,165, 82, 9,131,193,128,200,200, 72, 4, 6, 6,226,230,205,155,168, 89, +179, 38,110,220,184,129, 90,181,106,129,166,105,104,181, 90, 48, 12, 67,151,213,152, 43, 51,210,129,204, 56, 36, 93, 59,134,199, +247, 34,113, 54,137,192,170,157,135, 80,165,170,127,185,226,212,212,116, 19, 7,123,186, 58,159,252,113,246,247,110, 49,127,255, +137,125, 27, 87, 49,231,142, 29,171,195,151, 97, 76,155,129, 19, 63,214, 27,225, 7,128,223,188, 73, 35,116, 81, 60,162,197, 85, +145,114,246, 65,233, 1, 22,107,186,137,131,221, 93,156, 79,252,180,112,142,236,217,241,205,216,181,246, 23,118,239,182, 29, 33, + 90,160, 73,112,112,112, 23,146, 36, 29, 1,104, 11,253,188,108, 74,109, 83, 28,231,233, 67,135,194,180, 64,147, 3, 7, 14,116, + 17,139,197, 30, 0,140,249,249,249,207,223,132,243,204,225,195, 97,230,114, 18, 4,225, 6,192,192,178,236, 51,216,153,130,167, +127,255,254,243, 38, 77,154, 52,141,166,105, 87,171,209, 57,181,100,201, 18, 14,195, 48, 20,203,178, 6,146, 36, 13, 39, 78,156, +160, 77, 38, 83,146, 86,171, 29,247, 38,173,200,199, 31,127,140,171, 87,175,206, 70,193, 34, 12, 91,173,213,175,248,105, 21,166, +236, 41, 55,127, 68, 68,196,220, 79, 63,253,116,250,206,157, 59, 31,175, 88,177,162,199,216,177, 99,241,231,159,127,162, 70,141, + 26,184,115,231, 14,190,251,238, 59, 0,104, 57, 99,198,140,131, 27, 54,108, 8,136,137,137, 89, 98,131, 69, 3, 38,147, 9, 59, +118,236, 64,175, 94,189,224,234,234, 10, 47, 47, 47, 16, 4,241,247,168, 81,163,126, 3, 0,138,160,120, 0,160,211,234,116, 65, + 65,141,108,182,224,242,120, 60, 75, 91,151,146,146, 98, 89, 41,248,225,167,159,102,172,255,241, 71,252,161,209, 96,148, 66, 33, + 78,240,241,241, 60,248,236, 89,248,253,130,198,153, 45,205,170, 83,150,200,178,213,165, 65,147,140,111,255, 90,240,210, 3, 64, +231,214,131,189,208,122,176, 23, 26,245,116, 35, 72,138,192,189,147,153,136, 58,173,220,107, 84,225,111,216,151, 46,231,193,194, +133, 11, 15,182,105,211,166, 71,237,218,181, 49,122,244,232,207, 54,110,220,200, 51, 26,141, 95,226,159, 48, 15, 14, 36, 73,206, + 89,187,118,109,184,147,147, 19, 46, 92,184,128,243,231,207,255, 13, 32,174,164,118, 9,128, 37,102, 86, 21,223,154,218, 71, 49, +121,226,180,196, 75,184,120,225, 47,212, 8,153, 8,145, 71,119, 56, 5,205,135, 33,122, 57,244,153, 39,225,228,219, 13, 9, 49, +207, 64,113, 4, 81,101, 57,161,176, 44,123, 63, 33, 33, 33, 32, 32, 32,128,120,249,242,165, 9, 0, 75,211, 52,107,104,213,202, + 88,231,199, 31,185, 81,159,125, 70, 52,127,244,136, 98, 9,130,137,140,140, 4,128,135,255, 69, 47,110, 14,183, 16, 21, 21, 85, + 82,184, 5,187, 80,175, 94,189,150,231,207,159, 23,104,181, 90,156, 59,119, 14,141, 27, 91,214,118,253,167,209,239,173,181,200, +123,134,240, 98,222, 91,247,138, 69,235,149,138,205, 16,220, 90, 53,107,210, 60, 18,155,122,117,239,158,127,251,246,109,203,168, + 79,123,253, 58,212,199,143,131,166,105,176, 44,139,243, 17, 17, 24, 50,120,112, 30,151, 34,214, 87,171, 86,149, 37,216, 87, 98, +183,116, 44,102,244,208,175, 95,191,126,150,198, 39, 62, 62, 30, 18,137, 4,124, 62, 31, 12,195,192,100, 50,129,162, 40, 56, 56, + 56,192,100, 50, 21,103,130, 41,202,105,164,149,234,190, 27,186, 14, 74,246,202, 51,176, 99, 28,171,193,143, 39,178, 60,156, 30, +114, 2, 61, 66,184,112,225,164,177,103,150,124,144,196,232, 50,251,226,245, 21, 93,101, 45,249,175, 89,191,126,253,223,134, 12, + 25, 66, 2, 64,199,142, 29,201,250,245,235,175, 68,233,169,114, 74,229, 20, 10,133, 2, 0, 56,116,232,144,242,241,227,199,157, + 15, 29, 58,164,180,126,223, 70,206,117,139, 23, 47,134, 88, 44,134,201,100,130, 94,175,183,248,103, 89,191, 26, 12, 6,184,184, +184,224,200,145, 35,160,105,250, 72, 89,229,244,245,171, 10,194,181, 58,182, 28, 58,139,243, 25,188,242,136, 44, 11,103,117, 15, + 73, 45, 15, 23,231, 83, 63, 45,152,235,154,245, 52, 18, 9, 9, 9,236,137,227, 71,174,104,129,196,156, 92,204,204, 86,163,150, + 70, 15, 97,227, 0,196,157, 90,251, 13, 59,163, 53,140, 40,126,213,160,133,179,142,135,164,150,183,171,243,137,159,127, 90, 32, +203,126, 26,137,228,148, 20, 28, 61,114,232,182, 22, 48, 79, 55, 14,103, 24,166, 46,195, 48,117, 1, 12, 47, 69,188,216,197,153, +159,159, 95, 47, 63, 63,191, 94, 69,114,178, 44, 91,143,101, 89,155, 57,173,125,162,150, 46, 93, 26,157,156,156, 60, 36, 45, 45, +173,147,121,203,202,202,234,152,151,151,215, 54, 63, 63,191,149,102,105, 85,135,252,252,124,183,188,188, 60, 79,173, 86,219, 16, + 64,164, 29,117,222, 2,235,168,211,201,201,201,179,146,147,147,137,178,202, 73,141,139, 38,182,255,252,245, 95,107,215,174,245, +124, 67,254, 87,202,153,145,145,177,103,231,206,157,161,254,254,254, 1,195,135, 15,199,154, 53,107,176, 98,197, 10, 29, 0,108, +216,176, 65,103,101,201,242,141,137,137,105, 84,194,180, 97, 71, 43,107,201,214, 15, 63,252,144, 61,127,254, 60,122,245,234,101, + 9, 36,250,251,239,191,195,100, 50,169, 58,116,232,192, 0,128, 70,155,175, 98, 25, 22,122, 67,137,243,239,175, 93, 79, 62,159, +255,145,117,188, 64,115, 48,102, 62,159, 15,150,101, 81,171,101,203,140,236,144, 16,229,198,156,156,252, 89,245,234,201,195,131, +130,134,215, 6, 6, 23,199, 73, 16,196, 43, 86,157,162,155, 29,150, 44,235,114,166,105,146, 48,250,175, 5, 47,143,155, 45, 91, + 66, 41, 7,218, 92, 19,246,255,248, 50, 93,155,142,223, 75, 18, 63,165,157,187, 82,169,252,226,199, 31,127,212, 41, 20, 10,124, +252,241,199,152, 63,127,254,168,150, 45, 91,230,184,185,185, 93,173, 81,163,198,189, 1, 3, 6, 36, 71, 70, 70,126,209,174, 93, + 59, 60,121,242, 4, 63,255,252,115,118, 86, 86,214,160,210, 56, 9,130,176, 88,242,122,118,237,168, 92,189,242, 23,166, 67,155, +241, 16,139,228, 48,114,125,161,204, 51, 34, 75,205, 66, 47,104, 2, 62, 79,128, 78,205,130,113,245,196,230,124, 90,175,222, 82, + 86,157,207,203,203,219, 59,108,216, 48, 21,143,199,131, 94,175,103,185, 92, 46, 4, 5,126,199, 12,183,115,103, 67,243, 7, 15, + 76, 52,203, 50, 4, 65,224,171,175,190, 82,103,101,101,237, 44,207,115,100, 7,172, 57, 43, 42,220, 66,199, 34,253, 79, 69,132, +133,120, 27,231,254, 62, 99, 93, 49,219, 63, 22, 45,243,146, 74,243, 43, 65, 48, 52, 77, 51,168,230, 95, 77, 22,243, 50,110, 85, +255,254,253, 70,118,233,210, 85,220,181,107, 87, 97,112,116,193,104,244,208,161, 67,216,183,111, 95,254,201,147, 39, 85, 2, 46, +181,193,183,138,175, 59, 77, 51, 32, 8,166, 84, 53, 44,147,201,190,252,246,219,111, 69, 57, 57, 57, 88,177, 98, 5, 19, 26, 26, + 74, 74, 36, 18, 24, 12, 6,108,216,176,193, 24, 28, 28,204, 37, 73, 18, 57, 57, 57, 32, 73,242,145,141, 39,120, 55, 39, 46,177, +211,111,237,250,236,107,244,249, 8,231, 58,237,154, 43,218,250,122,195,216,128, 69, 82,252, 75, 60, 62,115, 50,235,254,137,101, +153,208,166,246, 65,217,233,129,138,235, 8,126, 56,121,242,164,219, 23, 95,124,193,106,181, 90, 34, 46, 46,142, 93,176, 96,129, +219,232,209,163,127, 72, 74, 74,250,164,156, 55,133,200,206,206, 6, 65, 16, 76, 97, 67, 98, 30,245,219, 51, 47, 23,181,101,203, +150, 3,189,123,247,238,217,161, 67, 7, 68, 71, 71, 91,166, 8,173,133,150,121,245,225,194,133, 11,179, 1, 76, 47,139,148,203, +229, 98,197,150, 61,200,206,202,128,187,187, 23,132, 34, 17,202,187,194,146, 79,146,179, 22,205,253,222, 45,227,225, 85, 34,234, +202, 89,102,247,221,212, 52, 19,205, 22, 31,241, 63, 55,137, 45, 84,255,165,143,102, 72,106,214,162, 5,115, 28,204,211,154, 59, +111, 37,171, 8,154,253,226,141, 30,145,247,133,243, 95,134,151,151, 23,146,147,147, 9, 47, 47, 47,182,208, 71,139, 45, 69,104, +189, 90,193, 11,166,203,136,210,166, 13,203,203,255,226,197,139, 5, 13, 26, 52,248,250,201,147, 39,187,235,212,169, 51, 22, 64, + 21,157, 78,151, 61, 99,198,140,159, 54,108,216, 48,210, 22, 75, 22, 0,252,249,231,159,203, 70,140, 24,113,188,123,247,238,223, + 48, 12, 83,223,170, 99,127,225,230,230,102,153,194, 77, 79, 77,153, 54,102,228,192,105,121,121, 89, 54,199,185,147, 74,165,225, + 51,102,204, 16,170,213,106,252,250,235,175, 76,112,112, 48,105, 30, 20,109,219,182,205, 84,179,102, 77, 78,191,241,227, 51,150, +166,164, 96,222,133, 11,234,105,117,235,134,110,124,252,184, 33, 24,102,107, 73, 86,157,226, 44, 89,102,183,139,114, 34,169, 80, +108,253, 14,160,115,243,254, 30, 56,176,248, 37,178, 98,244, 63,193,132,103,176, 33, 45, 80, 49, 72,216,187,119,111,167,212,212, +212, 3,223,127,255,189, 67,195,134, 13, 81,183,110, 93,174, 84, 42,109, 98, 14, 23,147,147,147,131,211,167, 79, 99,205,154, 53, +250,251,247,239,247, 46,109,186,138,166,233,180,154, 53,107,154,175, 3, 75, 16, 68,166, 74, 71, 56,236,170,221, 68, 58,124,204, +110,226,226,141,203, 72, 50, 48,208, 25, 25, 84,243, 15, 67,219,206, 75,113,240,216, 61, 58, 41,230,193, 3,163, 38,107,189, 13, +229,125,246,244,233,211,253,115,231,206,237,255,205, 55,223,136, 50, 50, 50,104,157, 78,199,236,217,179,135, 26, 62,124, 56,205, +114, 56, 12,143,195,193,151, 95,126,169,201,206,206,254, 11,248, 87, 19, 76,191,149,112, 11,111, 33, 44, 68,133, 89,179,172, 95, +255, 87, 80,236, 19,202, 80,228,165, 53,107, 87,127,244,231,142,157, 30, 20, 69,122, 60,123,254,252, 70,143, 62,125, 19, 79,157, + 58,229,196,115,112,104, 12,128,209,143, 29,123,197,160,211, 40, 15, 31, 56,224, 87,173, 90,213,144,194,164,210, 44, 67,145,151, + 74,251,193,188,188, 60,245,133, 11, 23,242,167, 79,159, 78,196,199,199,111,119,119,119, 31,112,236,216, 49,105,159, 62,125, 52, +209,209,209,123, 61, 60, 60,122,182,107,215, 78,246,245,215, 95,235,242,242,242,236, 73, 60,250,128, 77,207,170,125,253,251, 37, +159, 94, 95,188,250, 3,112,168, 22,208,113, 1,198,120, 9,134,220, 83, 0,182,195,142,120, 71,214,144, 72, 36, 33, 98,177, 24, +183,111,223,206,106,210,164,137, 94,171,213,242,230,207,159,239, 44,145, 72, 66,202,123,225, 89,150,101,179,178,178,192, 48, 12, + 7, 0, 81,248, 10,198,254,181,248,159,244,232,209,227,192,174, 93,187, 62,236,218,181, 43, 2, 2, 2, 96, 52, 26, 81,179,102, + 77,232,245,122, 4, 6, 6, 66,167,211, 97,246,236,217,200,201,201,153,140, 82,114,158, 17, 4, 1,147,201,100,113,182,245,246, +241, 43,136,211,243, 6, 97, 44, 36, 92, 50,224,209,225,141, 72,203,204, 96,118,221, 73, 77,205, 55,208,157,158,166,231,223, 47, +122, 92, 62, 13,117,187,225, 19, 18, 1, 64,199,148,158,113, 94,194, 71,192,227, 35,191, 35, 53, 45, 3,127,222, 74,206, 86, 27, +152,206,143,139,225,180,171,156,239, 9,103,216,236,104,244,157, 96,251,177,111, 2, 91, 5, 85, 73,184,157, 2,226,166,120, 35, +139,181, 27,139,141,145,245,134,252, 7,158, 60,121,114, 0, 0, 30, 60,120, 16, 63,112,224,192,105, 47, 95,190,156, 11,224,104, + 76, 76,204, 90,123,136, 54,110,220,248, 4,192,136,210,142,217,185,100,196,126, 0,251,237,225,205,205,205,213, 70, 70, 70,106, +191,254,250,107, 34, 62, 62,254,152,135,135,199,135,199,143, 31, 23,247,233,211, 71, 23, 21, 21,117,198,203,203,171,117,199,142, + 29,165, 71,175, 93, 75,204,127,246,236,240,225,151, 47,125,140, 12,115,184,180,231,179,130, 69,214, 43, 98,107,255,188,151,139, + 14, 44,122,217,145,209, 97,175, 62, 11, 87, 0, 36,188, 1,231,249, 75,151, 46,213, 25, 60,120,240,174,110,221,186, 53,175, 83, +167, 14,170, 84,169,130,199,143, 31, 35, 61, 61, 29,119,239,222,197,161, 67,135, 14,105,181,218, 50, 19,106, 43,149,202,215,211, + 19, 9,157,188, 54,255, 58,235,208,141,139,141,107,182,234, 58, 76, 84,215,139,129,222,192, 34, 62,246, 25,102,207, 92,159,159, + 28,251,228,129,193,100,232, 13, 27, 23,234,104, 52,154,117,203,151, 47,231, 30, 62,124,184,235,170, 85,171,100,126,126,126, 20, +143,199, 35, 1,176, 55,111,222,100, 39, 76,152,160,206,200,200, 56,162, 82,169,214,253,203,125,244,249,231,207,159,135, 81, 20, + 85,161,225, 22,222, 32, 44, 68, 37, 42, 18,254,254, 62,117,170,251,121,141, 13,168,226, 51,222,223,207,119,104,113, 78,238, 1, + 10,133,204,191,170,119,120, 64, 21,159,241,213,253,188,198,250,251,251,212,177,193,180, 24, 32,151,203,143,121,122,122,134, 2, +128,131,131, 67, 79, 71, 71,199,251, 14, 14, 14, 61, 11, 71,129, 61,165, 82,233,195,224,224,224,209,255,162,185,178, 84,206,154, + 53,107, 14,204,203,203,251,172,102,205,154, 3,205,251,207,158, 61,179,236,151,135,211,215,215,183,195,205,155, 55, 63, 89,178, +100,201,199, 53,106,212,232,185, 96,193,130,143,255,250,235,175, 79,124,124,124, 26,150,131, 83, 0,224, 15, 46,151,155,202,231, +243,211,184, 92,110,170,121,227,112, 56,169, 20, 69,165, 2, 88, 91,130,181,172,163,213, 40,231,162,187,187,123,140,187,187,123, +140,135,135, 71,140,135,135, 71,140,167,167,231,107,155,139,139,203, 69, 91,175,103,144,135,180,101,147, 42,178, 75,245, 60,165, + 23,107,187, 75,130, 42,226, 30, 5,121, 72, 91, 54,174,226,112,169,158,167,236,194,255, 55,206, 80, 15,176,236,154, 32,150, 93, + 19,196,134,122,128, 45,107,191, 34,205,254,158,158,158,172,167,167,231,172,183, 53,149, 80, 2,255,191,254,188, 87, 32,103,128, + 76, 38,219, 89,165, 74, 21,115, 91,215, 93, 46,151,255, 45,149, 74,187, 23,182,117,221, 37, 18, 73, 68,112,112,240,176,178, 56, +157,156,156,110,186,185,185,165, 20,110,201,238,238,238,201,238,238,238,201,110,110,110, 73,110,110,110, 73,174,174,174,137,230, +205,209,209,241,106, 57,207,221, 13, 64, 83, 0, 13, 1,200, 43,240,122,250, 3, 24, 83,216, 6,253, 8, 96, 52,128,250, 21,112, +143, 8,174,200,105,156,192,209,247, 18, 87,234,154,203,149,186,230, 10, 28,124, 46,149,146,130,199, 22,206, 90, 78, 78, 78,243, +229,114,249, 95, 50,153,236,130, 76, 38, 59,224,226,226,178, 0, 64,173,255,168, 46, 73, 1,108, 64, 65,124,166,163, 40,152, 10, + 63,128,130, 69, 5,126,239, 96,157,255,255,140,240, 98, 12, 42,248, 55,162, 64,117,172,228,172,228,172,228,172,228,172,228,172, +228,124, 15, 57,201,202,235, 89, 41,180,236, 20, 90,175,108,102,161,197,169,188, 54,149,168, 68, 37, 42, 81,137, 74,188, 6,166, +242, 18, 84,194, 78, 20, 59,181, 76,148,162, 74,237,137, 53, 85, 30,101,123,186,146,179,146,179,146,179,146,179,146,179,146,179, +146,243,255, 29,231,255, 11,252, 91,201, 99, 42,205,170,149,156,149,156,149,156,149,156,149,156,149,156,149,156,255,235,168,156, + 58,172, 68, 37, 42, 81,137, 74, 84,162, 18,149,120, 75, 88,103, 37,184, 94,153, 66,172, 20, 90,246,131, 4,240, 25,128,190, 0, +170,163, 32,155,253, 30, 0,191,161,124,115,250,114, 0,211, 0,180, 64,193,234,156, 23, 0, 46,160, 96,117, 78, 94,229,229, 46, + 30, 46, 46, 46,223,114,185, 92, 71,160, 32,181,137,249,213,250,127,154,166,179, 85, 42,213,130,183, 84, 4, 10, 54, 70, 80, 54, +151,213,186,108,214,175, 70,163,241,109,150,179, 18,239, 38,106, 58, 57, 57,253,161, 84, 42, 7,193, 42,201,114, 37, 42,241,191, + 0, 87, 87,215,177, 6,131, 97, 6,143,199,155,159,158,158,190,250,255,209,169,191, 38,178, 94, 17, 90,135, 15, 31,142, 0,128, +110,221,186,181, 1, 0, 71, 71,199,203, 36, 73,250,219,243, 11, 12,195,188,200,206,206, 46, 49,128,154,163,163,227,101,138,162, + 94,227, 52, 26,141, 50, 14,135,147, 91,220,119, 76, 38, 83,130, 74,165,106,248,142, 92, 68, 2,192, 97,133, 66,161,157, 59,119, +238,111,109,219,182,245, 77, 74, 74, 50, 77,157, 58,181,245,157, 59,119,186, 2,248,200, 78,177,213,140, 32,136,205,161,161,161, +251,135, 14, 29,186,171, 73,147, 38,252,204,204, 76,217,158, 61,123,188,183,108,217, 18,201, 48,204, 32,148,146,104,245,125, 4, +203,178, 37,230, 74, 44,237,179,162,224,114,185,142, 9, 9, 9, 50,243,247, 10,133, 21,140, 70, 35,140, 70, 35,212,106, 53, 66, + 66, 66, 42,188,252, 30, 30, 30, 97, 4, 65,172,146, 74,165, 13,243,242,242,110, 0, 24,159,156,156,124,199,158,178,154, 76, 38, +176, 44,107, 41,103,157, 58,117, 42, 91,102,251, 48,138,207,231,119, 14, 12, 12,108,172,211,233,178, 94,188,120,113,157,166,233, +239, 81,113, 57,218, 28, 0,124, 47, 16, 8,154, 84,175, 94,221,247,201,147, 39,241, 6,131,225, 26, 10,146, 33,231, 84,132,200, +106,211,166,205,197, 95,127,253,213,121,220,184,113, 23, 47, 92,184,208,178, 82,108, 85,226,191,130,175,175,175,163, 90,173, 94, + 15, 32,140,203,229,122, 8,133, 66,136, 68,162, 20,129, 64,112, 91, 36, 18,141,188,116,233, 82,182,189,156, 52, 77,127, 31, 19, + 19,227,209,180,105,211,197,110,110,110,179, 51, 50, 50,180, 6,131,225, 76, 86, 86,214,100, 0,170,210,190, 91, 84,139,188,103, + 34,203,250, 21,102,209,197, 41, 60, 49, 22, 64,219, 87, 20, 24,135,227, 19, 27, 27,235, 38, 20, 10,193, 48,140,165, 51, 43,186, +153,223,215,235,245,168, 91,183,174,161,140, 14,199, 55, 62, 62,222,141,207,231, 91,222,211,235,245,240,246,246,102, 18, 18, 18, +220, 10,211, 30, 88,160,211,233,224,227,227,243, 46,229, 60,250,204,201,201, 41, 39, 46, 46, 62, 68,171, 51,204, 25,253,197,244, +111, 7,245,253, 64,113,249,242,101,230,163,143, 62,210, 69, 68, 68,124,134,130,196,169, 54, 53,230, 4, 65,108,153, 58,117,234, +108,161, 88,238,124,246,242, 3,221,150, 61, 71, 18, 67,107, 86, 35, 38, 79,158, 76, 77,152, 48,225,124, 88, 88,216, 31, 12,195, + 52,128, 29,150, 45,133, 66,113, 92, 32, 16, 84, 45,188,126,113, 89, 89, 89, 31,190, 75, 53,177, 80, 72,113,240,122,240, 88, 14, + 65, 16,118, 7,148,205,204,204,132, 70,163,121,109,171, 83,167,206,219,112, 68,228,112,185,220, 3, 11, 23, 46,244, 78, 73, 78, +198, 47, 75,151, 54, 69,129, 37,179,169, 45, 95, 78, 75, 75,123,173,156, 65, 65, 65,168,132, 93,152, 54,123,246,236,133,159,126, +250, 41,104,154,134, 70,163,241,122,250,244,105,240,140, 25, 51,122, 63,123,246,172, 49,128,231,111, 58, 24, 15, 12, 12,140,158, + 56,113,162, 83,227,198,141, 81,152,165,194,235,194,133, 11, 77, 55,108,216, 48, 36, 46, 46, 46, 8, 64,250,155,252,128,147,147, +211, 31,191,255,254,187,179, 88, 44,198,193,131, 7,157, 59,116,232,112,225,214,173, 91,173,222, 64,108,145,206,206,206, 19, 0, +180,103, 24,134, 15,224, 90, 86, 86,214, 60,216, 31,213,221, 83, 42,149,238, 37, 73,178,154,213,179, 10,146, 36, 93, 8,130,200, + 48,191, 71, 16,132, 27,195, 48, 87,148, 74,101,243,202,234,248,126,195,217,217,121, 84,106,106,234,175, 2,129,128,167, 80, 40, + 32, 22,139,193,225,112,192,225,112,170, 8, 4,130, 42, 2,129,160, 75,187,118,237,198,255,253,247,223,165, 70,216,111, 22,234, + 62, 28, 36, 49,135, 34, 72, 10, 0, 72,174, 68,238,224,224,128, 57,115,230, 72,122,246,236, 41, 1,128,139, 23, 47, 14, 29, 54, +108, 88,135,132,132,132,186, 37,137,173,226,180,200,123,132, 18,131,217, 90, 39,149,142,120,229,201, 37, 73,240,249,124, 92,189, +122, 21,182, 4, 43, 55,167, 72, 40,181, 53, 40,140, 48,126,231,206, 63, 6, 0,115, 71,195,231,243,113,233,210,171, 65,229,155, + 53,107,102,179,133,163,162,208,183, 78, 65,144,199,221,159, 23,148,171,223,170,130,232,218,187, 63, 15, 66,235,159, 99,209,119, +194,172, 1,249, 90, 67, 35, 0,234,236,172,172,172, 27,251,246, 37,133,214,172,201,251,227,143, 63, 26,123,123,123,247,181, 67, +104, 77,107,208,160,193, 94, 74,228,224, 50,116,216,240,161, 35, 57,164, 97,200,152,175,231,199, 39,103,168,195,195,195,247, 29, + 60,120,112,232,162, 69,139, 30, 78,153, 50,101, 26,128,239,108, 45,191, 80, 40,172,250,232,209,163, 64,154,166, 81,167, 78,157, +119, 49,141, 65, 40, 10,130,239,125, 10, 96, 71,225,123, 3, 81, 16,185, 63, 12,192,109,123, 44, 91,102, 11, 86,113, 91, 69,195, +219,219, 59,104,240,224,193, 46,202,140, 12,252,178,116,169,249,237,134, 40, 99, 26,209,252,252,232,245,122,124,252,241,199,131, +105,154,230,152, 69,160, 78,167,211,231,228,228,104,241,143, 99,105, 58,128, 15,108, 40,142,191, 68, 34,249, 9, 64,152, 70,163, +241, 6, 0,137, 68,146,200, 48,204,126,181, 90,253, 29,254, 73,224,107,247, 0, 23, 64, 48, 74, 78, 5,197, 46, 92,184,240,201, +244,233,211,159,255, 7,156, 85,221,221,221, 23,244,235,215, 15, 71,142, 28,193,209,163, 71,141, 34,145,136, 51,108,216, 48, 98, +252,248,241,138,137, 19, 39,118, 1,176,252, 13,111,115,151,217,179,103, 59,213,174, 93, 27,123,246,236,193,221,187,119, 53,129, +129,129,162,182,109,219,130,195,225, 56,125,251,237,183, 31, 1,216,252, 38, 63,160, 84, 42,231,125,253,245,215, 91,118,236,216, + 33,123,241,226, 5, 86,173, 90,229, 50, 96,192,128,136,184,184,184, 54,118,136, 45, 1,128, 9, 0,218, 81, 20,213,106,216,176, + 97,166, 47,190,248,130, 75,146,164,113,233,210,165,174, 27, 54,108, 24,192,229,114,195, 50, 51, 51,109, 25,164,145, 0,230,140, + 28, 57,114,196,223,127,255,173,184,126,253, 58,223,217,217, 25, 52, 77, 91, 44,197, 12,195,184,153,235,172,201,100, 66, 80, 80, +144,143,213,247, 69,239,171,208, 32, 73,210,192, 48, 12, 23,128, 16,128,174,172,253,255, 37,145,229,228,228, 52, 78,169, 84,254, +230,225,225, 1,119,119,247,215,218, 92,157, 78, 7,161, 80,200,243,240,240,248,189,103,207,158,220, 3, 7, 14,148, 56, 5, 72, + 80,196,247, 7,119,206,245,118, 82,200, 0, 0,203,214,156,200, 7,128,191,254,250, 11, 73, 73, 73, 80, 40, 20,168, 91,183, 46, + 53,119,238, 92,207,201,147, 39,255,146,149,149, 53,178, 36,174,162, 90,228, 61,179,104,173, 43,110,191, 84, 31, 45,150,101, 45, +121,242,108,172,180, 69,223, 58, 93,132,143,208,235,245, 40,106,209, 50, 63,188, 92, 46,183,168,249, 17, 4, 65,176,165,113, 22, +131, 97, 18,137, 36, 68,173, 86,175,180, 99,116,107,225,220,253,121, 16,182, 8,166, 14, 52,103, 34,237,242,117,193,235, 22, 0, +151, 95,142, 92,245,107,155, 54,222, 19,102,174,152,165,201, 76,202,248,118,112,247,170,129, 30,206, 34, 73,118, 90,142, 83,173, + 90,157,138, 88,105,202, 42,103,235,161, 67,135,110, 61,121, 53,134, 16, 10,121, 60, 14, 69,113, 91,214,171,233,236,235, 64, 57, +200, 0,135,248,231, 79, 46, 15, 31, 62,188,222,148, 41, 83, 90,217,193,137,194, 14, 23,219,182,109, 3, 65, 16,164, 61,231, 94, +129, 40,122,223,205, 15,113, 40,128, 91,133,251,219,173, 58,149,237,133,239,221, 50,139,173, 98,172, 94,167,139,138, 23,243,244, +155,209,104,196,176, 97,195, 6,155, 76, 38,142, 85, 35, 81, 84,192, 20, 39, 98,108, 58,119, 79, 79,207,147, 0, 62, 32, 8, 2, +122,173, 86,255,211,207, 63, 91,127,124,179,136,200, 58, 93,210,179,100, 52, 26, 65,211, 52,231,214,173, 91, 92,171,186,206, 5, + 32, 1,224,194,178, 44, 72,146,188,103,195, 61, 10, 18,139,197,151, 15, 29, 58, 36,111,216,176, 33,193,231,243, 97, 50,153, 16, + 21, 21,229,187,104,209,162, 49,167, 79,159,254, 72,173, 86,215,193,235,201,211,109,185,239,193, 23, 46, 92, 80, 7, 4, 4, 20, + 43, 28, 85, 42, 21,167,102,205,154,109, 74, 16, 69,111,155, 51, 33, 53, 53,181,215, 7, 31,124, 48, 54, 37, 37, 37,218,100, 50, +125, 3,160,174,139,139,203,173, 62,125,250, 64, 36, 18,181,211,104, 52,203,223,164,206,187,185,185,245,108,222,188, 57, 86,173, + 90,133, 69,139, 22,117, 4,112, 6, 64, 7,149, 74,117,186, 71,143, 30,112,116,116,236,149,157,157,189,249, 13,158,163,154,173, + 91,183,254,125,206,156, 57,178, 35, 71,142, 32, 48, 48, 16,185,185,185,248,234,171,175,220,126,248,225,135,115,217,217,217,109, +173,158,139,146, 56,235, 8, 4,130,205, 59,118,236,144, 6, 4, 4, 4,240,120, 60, 50, 32, 32, 0, 74,165, 18, 90,173, 86, 48, +127,254,252,122, 34,145,232,206,242,229,203, 55, 3,232, 83, 70, 57, 73, 0,243,214,174, 93, 59, 54, 60, 60,220,113,240,224,193, +180, 94,175,199,174, 93,187, 64, 81, 20,184, 92, 46,196, 98,177, 37,121, 53,143,199, 67,173, 90,175, 5, 73, 63, 88,202,249,230, +160,192, 15,213, 17,246, 77,187,158, 46,133,207, 50,245,193,229,114, 33, 20, 10, 33, 20, 10, 33, 16, 8,240,232,209,163,153, 66, +161,112,105, 9,214,241,215, 56,137,127,212, 69, 8,128,235,101,237,227,117,215,144,183,222,126, 22, 3, 31,130, 32,150, 1,104, + 87,208,237,146, 17, 46, 46, 46, 95,166,166,166,198,218,202,233,233,233,233,156,153,153,185,220,211,211, 19,238,238,238,150,254, +219,219,219, 27, 70,163, 17,169,169,169, 96, 89, 22,217,217,217, 16,139,197,240,242,242, 90, 30, 30, 30,190,103,221,186,117,153, +197,114, 50, 88,212, 99,192,140,239, 41,138, 34, 1,128,226, 72,165, 19,167, 3, 85,171, 86, 69,203,150, 45,161,213,106,145,147, +147,131,224,224, 96, 14, 65, 16, 67, 9,130,144,179, 44,187, 26,192,217,255, 65, 67, 97,137,206,240,179,139,206,139,154,179,197, +243,120, 60,155,132, 86,225,241,101,153, 33, 72,163,209, 8, 30,143,247,138, 69,130, 32, 8,208, 52,253,202,251,102,161, 85, 30, +161, 62,126,252,120,230,247,223,127, 31,155,149,149,181, 6,229,156, 74, 24, 58,116,232,107,254, 30,147, 39, 79, 78, 72, 75, 75, + 99, 63,238, 20, 34,137, 62,150,148, 92, 93, 33, 21,185,202,100,213,132, 10, 39,199,204,204,204, 43,133,141,137,173,168,209,160, + 65, 3,209,150,125, 23, 18, 70, 79, 90, 56,183, 97,128,179,188,190,143,139,194,195, 65,196,151,146,132, 90,104, 50, 38, 56, 57, + 57, 5,218, 91,110,115,187, 32, 22,139, 65,146,228, 59, 97,209,178,154, 46,188,197,178, 44,148, 74, 37,142, 28, 57,130,174, 93, +187,222, 50,139, 16,149, 74,133,228,228,100,120,122,122,222, 42,180,124,148, 57,141,200, 48, 12, 12, 6, 3, 12, 6,131, 69,192, + 88,213, 33,139,128, 49, 31, 75, 81,212,189,114,158,194, 92,133, 66,209,186, 93,187,118,252,157,187,118,241, 89,150, 85,163, 32, +135, 90, 30,203,150,144, 32,187, 8, 76, 38,147,197,202,198,229,114, 17, 23, 23,103,233,184,204,185, 37,133, 66,161,109,166, 12, +129,224,235, 63,255,252, 83,222,184,113, 99, 34, 51, 51, 19, 12,195, 88, 26,201,223,126,251, 77,216,183,111, 95,239,200,200,200, +111,117, 58,221,236,242,220,174,146, 4, 17, 0,200,229,114, 19,108,139,152, 93, 38,167,201,100, 34, 90,180,104, 49, 37, 35, 35, +163,158, 70,163,153,111,203,101, 4,112, 48, 33, 33,193,186, 99,191, 19, 29, 29,173,233,223,191,191,168, 90,181,106, 77, 30, 60, +120,240, 70,117,181,102,205,154,205,184, 92, 46,174, 93,187,166, 3, 96, 30, 89, 71,220,189,123, 87,215,167, 79, 31,129,175,175, +111,179,236,108,155, 93, 86,106, 6, 5, 5,157,114,115,115, 19,153,219, 80, 87, 87, 87,238,186,117,235,100,137,137,137, 48, 24, + 12,152, 54,109, 26,186,117,235, 6, 23, 23, 23, 76,158, 60,217,125,241,226,197,127,228,229,229, 53, 40,205,104,205,231,243,183, + 62,125,250, 52,208,211,211, 83,116,245,234, 85,212,175, 95, 31, 25, 25, 25, 72, 73, 73, 65, 94, 94, 30, 82, 82, 82, 48,114,228, + 72,183, 95,126,249,197,203, 6, 75,150, 69,100,173, 91,183, 46,123,239,222,189,212,250,245,235,101, 92, 46,215, 34,180, 56, 28, +142, 69,104,153,115, 43,150, 99,166, 33,187, 80,180, 57,230,228,228,228,188,193, 45, 18, 0,224, 91,139, 44,129, 64, 0,129, 64, + 0,161, 80,248, 70,121, 89,223, 19,120, 19, 4,241,128,199,227, 9,196, 98, 49,143, 36, 73, 8, 4,130, 78, 78, 78, 78,247,235, +214,173, 91,247,212,169, 83, 49,182,144,104,181,218,173, 2,129,128,235,230,230, 6, 0, 8, 12, 12, 68,253,250,245,161, 86,171, +153,156,156, 28, 56, 58, 58,146,177,177,177,208,104, 52, 72, 78, 78,134,159,159, 31,151, 36,201,173, 40,240, 67,126, 13,151,111, +165,172, 1,176,198,188,239,226,226,146,106,109,233, 20, 10,133,240,246,246, 70, 98, 98, 34,100, 50, 25,245,195, 15, 63,244,217, +181,107, 87,239,203,151, 47, 15, 5,176,205,138,106,246,123,236,163,101, 22, 89,214,175,255, 8,173,110,221,186,205, 58,124,248, +112,155,226, 70,225, 92, 46,183,194,124, 93,204,130, 74, 46,151, 23,181, 90,129, 97,152,146, 44, 90,118,255,142, 80, 40, 20,141, + 27, 55, 46,119,245,234,213,118,139,173,126,171,162, 45, 86,172,215,134,145,117,234, 92,254,246,219,111,123,254,253,247,223,137, + 13, 3,170,113, 36, 73,177,121, 66,185,163, 35,124,170,116, 29,214,171,207, 93, 20,172, 62,180, 21, 79,115,115,115, 69,213,125, +196,122,146,212, 18, 85, 4, 28,153,167,132, 39,240, 80, 40,188,121,122, 93,154, 92,161,224,235,116,186,108,148,146, 4, 26, 0, +220,221,221, 79,136, 68, 34, 63,243,190, 66,161,112, 96, 89, 22, 98,177, 24,158,158,158, 82,138,162, 30, 91, 61, 92,177,169,169, +169,157,202, 42,152,163,163,227, 9,129, 64,224, 71,146, 36, 8,130, 0, 69, 81, 32, 73, 18, 36, 73, 90,254,167, 40, 10, 4, 65, + 32, 63, 63, 63, 54, 38, 38,166,147, 13,231,107, 2, 16, 70, 16,196,173, 35, 71,142,160, 73,147, 38, 56,118,236, 24, 58,119,238, +140,156,156, 28, 68, 69, 69,161,117,235,214, 0,240,169,173,247,220,218,249,221, 60, 40,120,244,232,145, 69,184, 88,111, 50,153, +236, 77, 76,236, 23,251,245,235,135,223,127,255,157, 45, 28, 76, 72, 8,130,168,239,224,224,240,232,225,195,135, 54,249,193,176, + 44, 11,131,225,159, 67,205,157, 87,161, 63,132, 93,201,129, 41,138,234,212,160, 65, 3, 34, 39, 39,199, 44, 32,193,225,112, 64, + 81, 20, 40,138,194,175,191,254, 42,106,220,184,241, 12,129, 64, 48,133,199,227,169,140, 70,227, 78,173, 86, 59, 31, 64,246,187, +212, 34,181,106,213,106, 82,124,124,124, 55, 63, 63,191, 67,111, 64,195, 26,141, 70, 61, 0, 17, 69, 81,220, 10,104,163,168,194, +186,165,181, 18,251,166,194,125, 1, 10,166,137,109,130,139,139,203, 31, 71,143, 30,245,241,243,243,131,209,104,132,201,100, 66, + 94, 94, 30, 34, 34, 34,160,211,233, 96, 50,153, 16, 24, 24,136,239,191,255, 94,251,229,151, 95, 10,215,174, 93,155,150,151,151, + 55,168, 12,218, 47,247,236,217, 35,241,244,244, 20,105, 52, 26, 60,127,254, 28, 13, 26, 52, 64,110,110, 46,212,106, 53,242,243, +243, 97, 48, 24,160, 82,169, 28,105,154,214,151,193, 53,211, 90,100,141, 25, 51,230, 30,159,207,111,240,197, 23, 95, 32, 33, 33, +193,242,204,143, 30, 61, 26,238,238,238,150,103,169,240,249,180,171, 97,230,112, 56, 16, 8, 4,224,241,120,217, 85,170, 84, 1, + 65, 16,194,216,216,216,242, 76,197,201, 1,168,184, 92, 46,223, 90, 96, 9, 4, 2, 92,187,118,237, 91, 62,159,191,212, 30, 95, + 79,182, 72,231, 86,214,254, 59, 48,104, 93,198,227,241, 4, 78, 78, 78, 60,171, 1, 39, 79, 42,149,194,205,205,109, 21,128, 46, + 54,158,119,168,147,147,147,165,125, 15, 9, 9, 65,124,124,252,254,156,156,156, 33,105,105,105, 32, 73,114, 43, 73,146,189,205, +131,212,172,172, 44,248,250,250,134,150,196,215, 60,204, 99, 44, 8,246, 21,139, 86,145, 1, 26,228,114, 57, 94,190,124, 9,181, + 90,205, 62,121,242,132, 24, 55,110, 28,161,215,235, 55, 69, 70, 70, 94, 65,193,106,251, 18,181,200,123, 2,251,125,180,204, 22, + 45, 91, 59, 0,130, 32,202, 28, 77, 24,141, 70,105,112,112,112,113, 14, 95, 68,113, 66,171,112, 58,169, 92, 21,157,203,229,202, +202, 43,182,138,226,208,222, 29,238,139,190,159,246,189,147, 87,181,234, 83,166,204,228,116,239,222,253,234,150, 45, 91,104,167, +218, 93, 58,156, 61,177,205,125,249, 87, 83,143, 29, 61,122, 20, 40,112,140,182, 21, 23, 15, 31, 62,236, 49,121,194,120,124,255, +245,151,199,229,129, 46,124, 41,225, 36, 17,234,212,233, 82,176, 26, 65,141,160,110,251, 14, 29, 74, 6, 16, 89, 26,137, 88, 44, +246,123,240,224, 65,160,245, 66, 2,189, 94, 15,177, 88,140,179,103,207,186,138, 68, 34, 87, 0,208,104, 52,168, 91,183,174,173, + 22, 19,191,199,143, 31, 7,202,100, 50,228,231,231, 67,167,211,193,104, 52,130, 97, 24, 16, 4, 1, 46,151, 11, 62,159, 15,137, + 68, 98,239,202,190,219, 0, 62,237,218,181,235,246, 99,199,142, 33, 56, 56, 24, 89, 89, 89,136,142,142, 54,139, 44,243,180,161, + 77, 48, 91,137,172,253,177, 56, 28, 14,254, 8, 8,192,232,164, 36,139,128, 89,230,224,128,239,153,242,101,211,168, 91,183, 46, +123,241,226, 69, 28, 63,126, 28, 61,122,244, 32, 14, 28, 56, 96,160,105,154,151,148,148,116, 47, 41, 41,201, 38, 14,134, 97, 44, +101, 53,183,219,214, 2,203, 94,161,101, 50,153,100,124, 62, 31, 90,173, 22,102,203,131,245,230,239,239, 15,165, 82,201, 81,169, + 84,156,164,164, 36,241,188,121,243,190, 56,119,238,156,103,110,110,238,192,255,178, 21, 90,189,122,181,223,232,209,163,227, 56, + 28, 14,219,185,115,231,193,177,177,177,189, 60, 61, 61,207,252,253,247,223, 63, 3,168,105, 47,159,139,139,203, 77, 14,135,227, +163, 82,169,120,187,119,239, 54,230,230,230,242, 92, 93, 93, 83,205,109,135,249, 90, 27,141, 70,155, 86, 46,187,184,184,220,204, +200,200,224,173, 92,185,210,152,153,153,201,115,119,119, 79, 53,243,100,103,103,243,118,239,222,109, 84,169, 84, 60, 7, 7,135, +155, 57, 57, 57,101,242,101,100,100, 12, 26, 58,116,232,133, 51,103,206,184, 80, 20,133,216,216, 88,100,102,102,194,209,209, 17, + 91,183,110,133,159,159, 31,246,236,217,163, 84, 42,149,163,126,250,233,167, 25,133, 34,171, 44, 31,173,214, 77,154, 52,241,203, +206,206,134,163,163, 35,212,106, 53,110,222,188,137, 58,117,234, 32, 41, 41, 9, 36, 73,194,209,209, 17,191,253,246, 91, 62, 65, + 16,202,210,136, 68, 34, 81,175,240,240,112, 71, 0, 8, 15, 15,119, 12, 15, 15, 47,182,131,107,214,172, 25, 86,173, 90, 85, 84, +104,217, 51, 48,176, 88,157,172,196,145,182,105,211,166, 56,119,238,220, 84, 59,197,145,222, 44,218,138, 90,179, 4, 2,129,221, +139,105, 24,134,225,161,192,165,129,176,101,255, 29, 64, 27,145, 72,196, 43,250,102,126,126, 62,207,211,211,179,149, 29,194,215, + 89, 36, 42, 48, 56,249,249,249, 33, 39, 39,135,214,235,245, 3,182,109,219,102, 4,128,176,176,176, 1, 52, 77,107, 77, 38, 19, +197,231,243,161, 86,171,225,230,230,230, 92,138,109,244,155,131, 59,231,121, 20,245,209,242,244,244, 68, 88, 88, 24,116, 58, 29, +146,147,147, 17, 17, 17, 97,164,105,122,251,234,213,171, 25, 87, 87,215, 17, 31,127,252, 49, 21, 25, 25,249, 57,128, 73, 37,105, +145,247,204,154,181,174, 68,161, 85,168, 32,207, 1,104, 91,244, 36,139,138,159,210,132, 86, 89, 83,135,124, 62, 63, 59, 46, 46, + 78, 98,221,169,152, 76, 38,120,121,121, 49, 44,203, 18,197, 9,173, 55, 49, 5,115,185, 92,217,244,233,211,179, 87,175, 94, 61, +232,229,203,151,179,108,249,206,238,207,131,176,165,136,200, 90,179,104,206,170,149,139,230, 57, 61, 59,190, 9,235, 87, 44,161, +105, 26,145,245,234,213,107,149,151,151,199,113,144, 24,145,145,141, 99,133, 34,203, 86, 81, 72, 2,216,120,253,250,245,200, 46, + 93,186, 92,218,248,231, 62,167,164,231,207,175, 8, 84, 25,201,242, 26,129, 28,158,183, 95,239, 92,173,150, 55, 96,192, 0, 87, + 0, 31,151,213,136,101,103,103, 35, 37, 37,165,168, 0,195,163, 71,143, 94, 59,214,166,194,145, 36,104,154,198,222,189,123, 33, + 22,139, 33,145, 72, 94,217,204, 34,171,156, 11, 21, 30, 3, 64,231,206,157,161, 84, 42, 33,149, 74,109, 46, 87, 81,241,194,178, + 44,244,122, 61,244,122, 61, 12, 6, 3, 13,128,203,225,112, 48, 50, 33,193, 98,229,177, 71,192, 20, 69,189,122,245,216,203,151, + 47,227,210,165, 75, 80,171,213, 88,185,114, 37, 60, 61, 61,219, 3,152,105, 47,151,149,147, 62,173, 82,169,184, 42,149,202, 98, + 29,228,114,185, 22,235,129,141,150, 60, 30,135,195,177,140, 70,205,155,181, 85,139,162, 40,184,187,187,195,195,195, 3,107,214, +172,225, 85,171, 86,173,219,127,217, 2, 45, 94,188,184,198,178,101,203, 54,108,217,178,229,216,160, 65,131,118, 69, 69, 69, 13, +119,112,112,184,119,246,236,217,121, 2,129,128, 41,231,243,237,147,148,148,228,102,253, 22,195, 48, 98,147,201,100, 17,182,249, +249,249, 54, 15, 48,184, 92,174,207,131, 7, 15,196, 0, 48,111,222, 60, 46, 0,177,217, 25,220,204,153,159,159,207,173, 83,167, +142,143,173,117,253,194,133, 11,173, 58,118,236,120,249,212,169, 83, 10, 63, 63, 63, 36, 38, 38, 34, 49, 49, 17, 53,106,212,192, +130, 5, 11,212, 42,149,170, 5,128,199,121,121,121, 7,108,228,244, 82, 40, 20,220,184,184, 56,152, 76, 38,132,134,134,226,183, +223,126,195,128, 1, 3, 80,183,110, 93,168, 84, 42, 60,120,240, 0,155, 55,111, 86,240,120,188, 82,219, 14,141, 70,115, 96,221, +186,117,190, 69, 45, 90,131, 7, 15,150,164,166,166, 90,234,228,156, 57,115, 94,153, 66,180,167, 77, 46,156,218, 42,113, 43, 15, + 76, 38,147, 92, 40, 20,170, 4, 2, 1,223,236,159, 21, 17, 17, 97,183, 53,171,200, 0,208,158,253,255, 12,102,209, 90, 76,223, + 10, 15, 15, 15,155,121, 4, 2, 1, 97,110, 27, 77, 38, 19,114,114,114,104, 79, 79, 79,203,244,254,173, 91,183,232,170, 85,171, +210, 20, 69, 81,124, 62, 31, 4, 65, 64, 44, 22,151,216,224,179, 52, 59,167,251,128,153,175,172, 58,156, 56, 29, 48, 24, 12,184, +117,235, 22, 12, 6, 3, 34, 34, 34,140, 63,253,244, 83, 82,118,118,246, 68, 0,156, 19, 39, 78, 12,157, 58,117, 42,229,230,230, +214, 49, 45, 45, 13,101,105,145,247, 72,108,189,102,229, 50,247, 66,231,186,117,235, 70, 20, 46,173, 36,204,194,201, 30,161, 85, +248,240,149,217,243, 18, 4,129,228,228,100,203,190,155,155,155,221,191,101, 43,156,157,157,213,205,154, 53,147,101,100,100, 28, + 88,188,120,113,185, 44, 89,107, 22,205, 89,181,112,238, 15, 78,202,135, 87,145,144,148, 12,101,154, 49,242,226,189,151,251, 1, +236, 7, 0,172,173,125,142, 24, 27,253,171,173,156, 65, 46,162, 16, 46,143,179,255,131, 46,221,124,251,135, 79, 34, 63,251,236, +179,150, 67,135, 14,205, 25, 52,104,208, 4,169, 84, 90,211, 96, 48,100,237, 59,114, 36,166,127,255,254,213,104,154, 30,138, 50, + 98,142,104, 52,154,216,182,109,219, 90, 95, 79,249,233,211,167,221, 99, 98, 98, 48,126,252,248,244,196,196,196,108,235, 99,109, + 41,163,193, 96,136, 13, 9, 9, 41,113,186,208, 60,165, 8, 0,185,185,185,177,118, 92,210,129, 40,116,124,207,204,204,196,163, + 71,143,192,225,112,208,180,105, 83, 92,188,120, 17, 45, 91,182,188,101,143, 85, 75,171,213,194,207,207, 15, 90,173, 22,106,181, + 58, 31,128, 96,107,181,106, 0,128,207, 51, 51,113,243,167,159,112,117,225, 66, 88,215,103, 91, 81,191,126,125,246,234,213,171, +184,119,239, 30,116, 58, 29, 70,141, 26, 5, 0, 68, 97,221,181, 39,100, 70, 0, 69, 81,157,187,116,233,226, 5, 0,106,181,154, +184,126,253, 58,132, 66,161,229, 89, 56,116,232, 16, 18, 19, 19, 65, 16, 4, 20, 10,133, 79, 86, 86, 86, 53, 0, 47, 75, 49,251, + 19, 47, 95,190,196,143, 63,254, 8,134, 97, 48,117,234, 84, 4, 6, 6, 90, 4, 86,108,108, 44,230,205,155, 7,154,166,241,195, + 15, 63,160, 70,141, 26, 48, 26,141, 66, 20, 31, 86,227, 95,193,228,201,147,159,237,223,191,255, 88,124,124,252, 71,139, 22, 45, +106, 67, 16, 4, 51,101,202,148, 31,229,114, 57,253, 38,188, 89, 57,185,120,244, 52,214, 34,132,138,110,174, 46, 78,118,243, 61, +121, 30,111,249, 62, 77, 91,243,209,112,118, 82,216, 91,196,124,163,209,168,238,221,187,183,227,222,189,123,137, 26, 53,106,224, +197,139, 23,102,203, 80, 62,236, 15,233,144,168, 84, 42, 3, 41,138,226, 61,125,250, 20, 85,171, 86, 69,147, 38, 77, 48,127,254, +124,100,100,100,192,100, 50,193,205,205,141, 49, 26,141,183, 12, 6,195,249, 50,184,230,140, 25, 51,134, 7, 96,108,161,101,171, +222,196,137, 19,153, 37, 75,150,224,214,173, 91, 22, 11,150,181, 51,188,189, 83,135,214, 86, 39,235, 45, 34, 34, 98, 42,159,207, +103, 1, 92,131,253,129,158,245, 69, 45, 90,229,177,102,189, 45,188,205,149,140,158,158,158, 17, 50,153,172, 91, 86, 86,214, 43, + 86,173, 22, 45, 90, 24,220,221,221, 47,216,202, 35,149, 74,179, 40,138,114, 6,128,196,196, 68, 72, 36, 18,222,243,231,207, 23, +162, 32,120, 54,170, 85,171,182, 80,169, 84,242,170, 21,182,167, 30, 30, 30,208,235,245, 37,186,177, 92,185,157,186, 9,192, 38, +243,190,147,147, 83,114, 78, 78,142,104,201,146, 37,121, 11, 23, 46,212,208, 52,173, 3,112, 54, 59, 59,219, 18, 71, 43, 37, 37, + 37,135,203,229, 58, 57, 58, 58,122,155,133, 86,113, 90,228, 61, 67,201, 22,173, 66, 37,201, 22, 21, 68, 4, 65,188,230,160, 94, +134,208, 42, 83,100,209, 52,253,138,149,193,236,240, 94,220,111, 21,118,234,229,154, 58, 44, 20, 89,194,125,251,246,109, 93,188, +120,241, 53, 91,191,103,237,163,181,246,231,185,139,204, 34,235,238,165, 83, 56, 16,157,147, 49,117,225,210,101,229,189, 3,181, + 93,196,245,221,221,157,207,253,180, 96,142,252,217,241,205,216,181,246, 23,246,238,141, 27,141,111,220,184, 49,100,252,248,241, + 85, 10, 43,150, 18,192, 29, 0,253, 97,195, 42,157,196,196,196, 78, 69, 58,225,199, 60, 30,207, 93, 44, 22, 35, 49, 49, 49,239, +201,147, 39,118, 79,201,100,100,100,116,122, 11, 21,144, 99, 22, 89, 25, 25, 25,120,240,224, 1,218,181,107, 7, 0,184,120,241, + 34, 90,180,104,129,200,200, 72, 52,104,208,224, 22,128, 70, 40, 35, 80,171,209,104,204,174, 93,187,182,197,186,149,147,147,195, + 0, 64,120,114, 50,214,121,122,130,195,225,224,234,194,133,248,206,104,196,124, 59, 5,124, 72, 72, 8,123,253,250,117,196,196, +196,192,100, 50,161,103,207,158, 40,231, 67, 95, 55, 40, 40,232,244,217,179,103, 93,165, 82, 41,212,106, 53,242,242,242, 48,108, +216, 48, 12, 24, 48, 0, 58,157, 14,187,119,239,198,193,131, 7, 33,147,201,160, 86,171,161, 86,171, 21, 93,187,118,189,252,248, +241,227,214, 0,158,150, 32,180,216, 78,157, 58,225,194,133, 11,160, 40, 10,141, 27, 55, 70,102,230, 63,139,129,220,221,221,139, +251,140,250, 47,133, 22,135,195, 97, 35, 34, 34, 22,181,105,211, 6,241,241,241, 31, 53,104,208, 96,229,240,225,195, 19,223,148, + 87,225, 32, 67, 72,157, 0,232,116, 58,232,116, 58,120,121,121, 33, 55, 55, 23,207,158, 61,131, 78,167,131,187,155,163,221,124, + 97,117,107, 88,248,220,220,220,160, 86,171,241,242,229, 75,232,245,122,184,184,216, 37,180,124, 59,117,234,244,247,246,237,219, +157, 55,111,222,172,111,219,182, 45,127,229,202,149,132, 92, 46,135, 85,199, 98, 47, 34, 46, 94,188,232,215,177, 99,199, 90, 15, + 31, 62, 68, 68, 68, 4,244,122, 61,194,194,194,240,228,201, 19, 52,107,214, 12,121,121,121,215,110,220,184,113,208, 22,195, 48, +128, 25, 99,198,140,129, 89,108, 93,184,112, 1,201,201,201,144,201,100,175, 9, 45,179,239, 99,225,170,113, 47, 91, 10,107, 22, + 68, 86,150,167,239, 28, 29, 29, 13, 0,150,149,211,250, 4, 0,136,143,143, 23,212,171, 87, 79, 39, 20, 10,249,133,162,109,233, +155,240, 85, 36, 42, 96, 37, 99,137,240,240,240,152,232,226,226,210,209,223,223, 31,169,169,169, 60, 62,159,143, 22, 45, 90, 24, + 26, 53,106,100,240,240,240,248,220, 86, 30,129, 64,240,144,199,227,181, 46, 24, 76,208,136,139,139, 3,203,178, 83,235,214,173, +251,101,110,110, 46, 50, 51, 51,249,114,185,220, 50,168,174, 85,171, 22,116, 58,221, 67, 59, 44,111,115,170, 86,173, 58,131,199, +227,205,207,200,200, 40, 46, 44, 4,223,209,209, 81,206,227,241, 96, 48, 24, 94, 17,155, 69,181,200,251, 46,178, 94, 17, 90, 86, + 42,242, 21,161, 99,143, 69,203, 22,171,129,217,193,222,122,223, 44,234,138,254, 86,121, 99,104, 57, 56, 56,232,204, 34,107,254, +252,249,215,202,195,177,103,251, 54, 79, 7, 38,223, 55,233,218, 81, 60,190, 23,137,253, 15,178, 51,166, 46, 92, 58,161,251,199, + 3, 83,139, 10, 51, 91, 16,232, 42,174,235,238,230,124,238,231,197, 11,229,202,135, 87,145,156,146,130,163,215,110, 68, 26,128, + 7, 0,166, 86,164,105, 25, 40,152, 58,164, 40,234,157,168,176,133,247,216,226, 12,159,156,156,108, 22, 89, 97, 0,208,178,101, +203, 91,133, 34,203,252, 94,153,177,180,178,179,179,139,166,172,233, 8,192,197,124,254, 28, 14, 7, 45,102,204,176, 91,100, 1, + 96, 35, 35, 35,161, 84, 42,205, 35,197,242,138, 44,120,120,120,124,125,246,236, 89,215,141, 27, 55,170,182,108,217,146,201, 48, + 12, 55, 36, 36,196,167, 97,195,134,196,214,173, 91, 1, 0,253,251,247,199,212,169, 83,113,255,254,125, 72, 36, 18,180,108,217, +146,158, 53,107,150,219,196,137, 19, 63, 79, 77, 77,157, 80,108,239,200, 48, 60,161, 80,120, 6, 64,251,135, 15, 31, 2,192,101, + 20,164,112, 50, 91, 17, 74,252,204,150,206, 55, 55, 55,151, 43,147,201,138, 13, 13,193, 43, 24, 13,217,107,129,176,112, 94,186, +116,233,199,159,127,254,121,255, 87, 95,125,245,244, 13, 57,139,181,104,117,235,214, 13, 26,157, 1, 9,169, 57,160,105, 19, 52, +134, 52,187,249,172, 45, 90,221,186,117, 67,190, 86,143,184,100, 37, 76, 38, 26,185, 26,155,251,114,241, 7, 31,124,112, 98,231, +206,157, 30, 87,174, 92, 1, 77,211,204,147, 39, 79, 94,246,238,221, 91, 62,101,202, 20,231, 55, 88,100,180, 98,224,192,129,125, + 47, 93,186,164,172, 85,171,150,211,181,107,215,144,150,150, 6,147,201,132,246,237,219,131,207,231,199, 45, 92,184,144, 7, 96, +133,173,247,166, 80,108, 25,110,220,184, 49,250,234,213,171, 78, 78, 78, 78,124, 38, 40, 8,201,167, 78, 97,239,222,189,175,125, + 97,237,218,181,128,141, 81,248,205, 22,167,235,215,175, 87,136,192,122,165,167,230,243,203, 61,253,248,190,226,250,245,235,137, +159,125,246, 89, 29,185, 92,190,172, 85,171, 86,237,156,157,157, 73,133, 66, 17,225,237,237,253,101, 72, 72,136,205,179, 11, 92, + 46,119,184, 68, 34,121,102, 50,153,168,188,188, 60,168,213,106, 0,128,201,100,226,147, 36,137,106,213,170, 89,250,146,198,141, + 27,195,195,195,131,142,142,142, 30,110, 43,127,122,122,250, 43,171, 16,139,193,152, 22, 45, 90,112,116, 58, 29, 98, 98, 98, 46, + 90,127, 80,156, 22,121, 79, 16, 94,170,248, 50,159,148,245,201,121,123,123,199, 27,141, 70,246, 1,192,222,185,115,135, 13, 15, + 15, 47,117,211,106,181,172,155,155, 91,114, 49,157, 31,172, 57,117, 58,221, 43,223,211,233,116,172,187,187, 59,173,209,104, 94, +227,212,104, 52,172,143,143, 79, 98,105,156,197, 96,216,237,219,183, 87,127,247,221,119, 77,236,184, 64, 22, 78,118, 77, 16,187, +121,243,230, 79, 88,150,109,211,170,142,223,189,126, 33,238,108,139, 64,183,164,131,123,182, 15, 96, 89,182, 77,209,205, 28,224, +180, 52,206, 32,119, 73,237, 14,193, 85,178,238, 30,223,193,158, 93,242, 5,251,115,207, 64,182,129,143, 44, 59,200, 69,100,111, +142,152, 50,179,165, 7, 7, 7, 63,102, 24,134,213,235,245,108,112,112,240,147,138,224, 44, 7, 74,227, 12, 69,129, 47,219,192, + 98,222, 11,125,131,114,222,101, 89,150, 85, 42,149,108, 94, 94, 30,171,211,233, 88,154,166, 89,107, 0,184,107, 3, 39,107, 48, + 24,216,172,172, 44, 22,182,251,220, 21,203,233,233,233,249,242,249,243,231,108,245,234,213,227, 11,205,241, 19,213,106, 53, 91, + 20,106,181,154,109,215,174, 29,251,228,201, 19,182,106,213,170,218, 39, 79,158,176,158,158,158,143,202, 40,167,191,175,175,239, + 25, 23, 23,151, 8, 0,129,118,124, 86,234,245,220,189,123,119, 0,203,178,163, 88,150, 13, 47, 97, 27,197,178,108,208,127,205, + 89,120,125, 83, 89,150,101,243,243,243, 89,165, 82,201, 38, 37, 37,177,249,249,249,108, 94, 94, 30,123,251,246,109,246,202,149, + 43,236,189,123,247, 88, 39, 39,167, 84, 91, 56,205,124,122,189,158, 85,169, 84,108, 90, 90, 26,171,209,104, 88,181, 90,205, 70, + 69, 69,177, 55,111,222,100, 31, 62,124, 88, 28,223,107,156,206,206,206,107, 83, 82, 82,242, 46, 95,190,156,191,102,205,154,124, + 15, 15,143,135, 0,252, 0,212, 84, 40, 20, 41, 95,124,241, 5, 43,149, 74, 99,203,249, 28,213,225,114,185,183, 23, 45, 90,116, +253,240,225,195,169, 7, 15, 30,212,111,216,176, 33, 97,252,248,241,231, 57, 28,206,109, 0,117,202,249, 28,185, 57, 58, 58, 94, +190,118,237,154, 41, 43, 43,139,205,206,206,102, 85, 42, 21,171, 86,171, 89,141, 70,195,234,245,122,214,104, 52,178,231,207,159, +103,221,221,221,173,167, 37,191, 41,101,144, 53,137,101,217,175, 89,150,229, 84,116, 91,103,197,221,170,162, 56, 43,162,173, 35, + 73,210, 80,216,118, 52, 45,216, 45,125,255,191, 42,103,135, 14, 29,126, 24, 48, 96, 0,219,185,115,103, 54, 44, 44,236,181,173, + 65,131, 6,236,184,113,227,216,195,135, 15,179, 63,253,244,211, 15, 21, 80, 78, 14, 10, 22,189, 44,232,208,161,131,241,194,133, + 11,108,255,254,253, 89, 0,157, 74,211, 34,239,179,224, 50, 47,166, 49,135,119, 32,172, 95, 1,192, 96, 48,196, 63,126,252,216, +179,150,201, 68, 1,192,175,191,254,250,154,149,194, 26, 23, 46, 92, 48, 17, 4,241,172,180, 95, 55, 24, 12,241,103,207,158,117, + 95,181,106, 21,215,202, 4, 12,147,201,196, 36, 37, 37,145, 43, 87,174,124,229,248,115,231,206,153, 76, 38, 83,156,157, 39,185, + 57, 52, 52,116,115, 69, 92,173,243,247, 99,190, 60,113,244, 47,151,166, 77, 90,101,203,157,156,138, 29,133,237,254, 60, 8,196, +216,210,173, 90, 4,135,156,191,104,193, 28, 71,243, 20,228,159,183, 82,178,181, 58,186, 93,116,134,230,110, 69,223,225,188,188, +188, 24,243, 74, 64,181, 90, 29,247, 14, 86,194,219, 40,136,113,101, 42,242, 94, 35,188,161,211, 41,195, 48,112,112,112,176, 88, + 67,203, 97, 17,101,139, 88,210,222,200, 71,128,101,217, 75, 81, 81, 81, 85,135, 13, 27, 38,219,178,101,203,115,154,166,185, 35, + 71,142, 52,120,120,120,240, 46, 94,188,104, 4, 64,180,105,211,134,147,146,146,194, 38, 38, 38, 42,123,244,232,145, 59,122,244, +104,231, 59,119,238,240, 25,134, 41, 43,104,225,139,248,248,248, 14,229,248,172, 84,244,235,215,239, 57,222, 60,141,205, 91,231, + 52, 67,153,173,194,243,152,196,194, 8,230, 12,232,216, 84,139, 95,149,209,104,130, 82,149,105,183, 69,235,217,203,196,194, 20, + 99, 52,104, 58,169,144,175,192, 33,158,205,202, 47,187, 55,225,112, 90,206,154, 53,171, 11, 73,146,228,213,171, 87,117,139, 23, + 47,142, 79, 79, 79,239, 9, 32, 14, 0,178,178,178,218,110,222,188,249, 15, 27, 66, 57,148,132, 7, 70,163,177,217, 55,223,124, + 51, 1, 64, 75, 0, 85, 10,185, 47, 22, 90,178,202, 27,193, 60, 45, 59, 59,251,195, 46, 93,186,156,162, 40,170,154,213,115,228, + 2, 32,195,252, 92,176, 44,235,150,154,154,250,145, 45,132, 4, 65, 44,125, 91, 13,201,219,228,126,195,118,232,189, 88,201,120, +230,204,153,217, 61,123,246,228,248,249,249,125,235,231,231, 71,102,101,101, 33, 47, 47, 15, 36, 73,194,195,195, 3,193,193,193, +240,240,240, 96, 30, 62,124,184, 96,218,180,105,101,198,228,171, 93,187,118,128,209,104,172, 78,146,100, 0,128, 0,150,101, 3, + 8,130, 8, 0,224, 4, 0,114,185, 92, 94,181,106, 85, 78,211,166, 77,209,164, 73, 19,156, 59,119, 14,123,246,236,217, 4,224, +132,181, 53,171,168, 22,121, 23,240, 32, 20,108,157,219, 32,238, 55, 64, 27,130,193, 57,150, 68,219,224, 72, 75,156,189,162, 34, +171,228,164,210,197,152,254, 58,181,111,223,222,242,192,217,208,169,196,148,245,240,165,167,167,119, 26, 62,124,248, 43,156, 52, + 77,235, 50, 51, 51, 63,107,222,188,249,111, 20, 69, 9,138, 84,216,216,180,180,180,127, 53, 87, 95,209, 56, 90,157,186,244,202, +120, 83, 78, 41,143,172,254,248,200,239, 72, 77,203,192,159,183, 82,178,114,245,116,219, 39, 25,249, 81,111,163,252,177,177,177, +157,223,101,169,111, 53,141, 88, 20, 55,237, 73,189, 83, 92,245,178, 33, 32,105, 89, 57,234,136,194,112, 34, 21,242,144,167,164, +164, 44,153, 49, 99,198,135, 11, 22, 44,112, 61,118,236,152,220,124,254,125,250,244, 73,139,138,138,106, 5, 64,160,213,106, 79, + 47, 88,176,192,117,206,156, 57,206, 0,156, 1,160,107,215,174,169,169,169,169,171, 80,137, 82, 97, 52, 26, 19,130,107,215,122, +101,228,104, 30, 0, 90,255,111, 50,153, 18,236,225, 43,142,199,122,159,166,233, 82,249, 40,138,250,170, 73,147, 38,212, 87, 95, +125,149,122,236,216, 49,115, 34, 93,107,133,246,184,140,160,164,182, 64, 7, 96,113,225, 86,145, 80, 43,149,202,102,118,126,135, +174,172,141,197, 14, 40,237,217,255, 79,112,224,192,129,153,253,251,247,223,236,228,228,180, 45, 32, 32,160,150,187,187,187, 92, + 36, 18, 65,167,211,229,234,245,250, 71,143, 31, 63, 30, 52,115,230,204, 23, 54, 89, 56, 54,111,166, 0,240, 24,134, 17,146, 36, + 41, 1, 32, 39, 8, 66, 97, 22, 90, 4, 65,192, 96, 48, 32, 38, 38, 6,223,125,247, 29,125,230,204,153,159, 0,252, 96, 71,223, +209, 8,128,171, 85, 59,238, 10, 64,143,130, 0,182,233, 4, 65,220,120,219,215,139, 96,112,174,206,109, 16, 15, 66, 81, 92, 63, + 81,122, 82,233,146, 30,184,244,244,244,102, 21,253, 16,151,196,153,158,158,238,247,174, 60, 33, 67,117,139,119, 96,237,226, 87, +242, 28,154, 69, 88,113,251,101, 33, 71, 99, 26,191,226,196,253, 37, 58, 19,203, 24, 76,204,136, 39,233,249, 15,254,191,182, 62, +165, 9,169, 55,204,107,249, 65, 69, 21,177, 2, 79, 55, 42, 58, 58,186,249,248,241,227,103,138,197,226,198, 0,144,159,159,127, + 53, 41, 41,105, 46, 10, 87, 21,150,245,121, 37, 74, 70, 70, 70, 70,195,119,145, 79,175,215,127,217,188,121,243,229, 52, 77,255, +108, 50,153, 46,254, 63,184, 21,218,202,218,248,254, 98,215,174, 93, 47, 0, 52, 3,128,190,125,251, 82, 0,176,103,207, 30,187, +197,243,176, 97,195,104,150,101, 13,133,245, 65,141,130,213,133, 89,230, 54, 85,173, 86,103, 37, 37, 37, 61,164,105,250, 33,128, + 63, 96,255,138, 91, 87,130, 32, 14,179, 44,219,173,176,191, 56,204,178,108, 55,235,247,222,182, 85,171,140, 67,202,118,134,175, + 68, 1,246, 60, 0, 81,116, 42,176,172,253,178,240, 56, 85, 29, 1,160, 65,229,213,253,127,137,231, 73, 73, 73, 67,223,224,243, + 74,188,127,136,211,235,245, 61,255, 31,157,111, 78,229, 45,255, 31,233,255,202, 33,176,204,120,248,240,225, 91,115, 17,248,175, + 81,231,246,171, 3,240,162,251, 86, 8, 47, 78,120, 85, 10,173, 74, 84,162, 18,149,168,196,155, 32,187,242, 18, 84,226,127, 25, +102,223, 44,243,126, 9, 62, 90, 69,253,179, 44,251, 4, 74, 94, 57, 96, 79, 86,242,242,172,146, 56, 93,201, 89,201, 89,201, 89, +201, 89,201,249,159,115, 58, 2,168, 10, 96, 81, 25,199, 21, 93, 93,152, 10, 32, 3,128,177,242,122, 86,114,190,129,126,176, 9, + 44,203,118, 45,109,234,144, 32,136, 35,111, 75,104, 89,156,225, 67, 49, 43,248, 54,102,153,247,203, 18, 90, 44,203,174,251, 55, +132, 96,199, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 55, 20, 90,237,166, 77,155, 54, 29, 5,161, 49,216, +105,211,166, 77,103, 89,182,107,193, 71,108,215,183,249,219,247, 27,160,205,131, 80,176,230,237,126, 3,180, 41,225,208,112,171, +237,213,240, 14,149,168, 68, 37, 42, 81,137, 74, 84,162, 18,239, 48, 46, 47, 92,184, 48,127,225,194,133,102,199,247,116, 0, 68, +161,133, 43,253,109,254,112,225, 52,161, 45, 11,165, 74, 79,193,243, 31,192,139,228,240, 6,115,121,130,118, 96,153, 96, 0, 0, + 73,221,167,245,218,191, 77, 38,195, 54, 0, 73,229, 37, 14, 2,106,215,112, 20, 29,212,209, 52, 47, 62, 87,223, 55,186, 32,205, +129,221,232, 11,180, 16,240,249, 39, 5,142,142,162,226, 62,215,101,103,107,116,122,253,135,123,128, 75,149,207, 64, 37, 42, 81, +137, 74, 84,226, 61,129, 68,161, 80,156, 33, 73,210,207,252,134,245,170,239,162, 43,192,105,154, 78, 86, 42,149, 31,162, 96,170, +248,223,228,180,254,190, 30,229,236,203, 43, 26,182, 78, 29,194, 58,188,131, 85, 20,214, 50, 51,102,215,242,144,180,170, 21,224, +183, 61, 41, 37,245,150, 74,171, 31,249, 56, 41, 79,105,111, 33, 41,174, 96,180,204,193,113,254, 39,195,191,116, 14,172, 89,139, +240,245,245, 6, 88, 32, 46, 62,193,253,217,211, 39, 29,118,109, 89, 49, 89,149,163,252,206,168,211,253,110, 47,119,109, 64, 82, + 69, 42,184,248,251,180, 79, 29, 57, 48, 97,224,188,237,199,137, 60,131,239,195,130,229,166,118,137, 44, 71,103,231, 19, 11, 79, +159, 22, 41,234,215,127,229, 51,150,101, 11,242,235,221,189, 43,250,246,195, 15, 79,244, 85, 42, 59, 85,138,173,255, 73,120,200, +229,242,137, 92, 46,183,173,193, 96,240,227,243,249,241, 52, 77, 71,100,101,101, 45, 3,144, 88,121,121, 42, 81,137, 50, 81, 90, +126,205,255, 44,247, 38, 0, 72,165,210,155, 36, 73,250, 88,139, 0,115,206, 94,243,126,209, 87,134, 97, 94, 40,149,202,230,165, +208, 6, 56, 57, 57,253, 6,160, 81, 89,225,106, 10, 99,179,221, 80, 42,149,159,161,228,213,122, 50,133, 66, 49,155, 32,136,126, + 36, 73, 82,101,157, 19,195, 48, 52,203,178,187,179,178,178,126, 0,144, 91,210,113, 10,133,226,116,116,116,116, 35, 55, 55,183, + 50,173, 52, 38,147, 9,113,113,113,174,141, 27, 55, 62,175, 84, 42,131,222, 38,167, 61, 90,228,191, 68, 41,171, 14, 75,172,232, + 0, 94,201, 47, 68,148,126, 35, 49,120,227,252,207,188,147, 99,159,122,143, 89,176,163, 38,225, 76,183,125,148,169, 73,177,245, + 7,121, 66,233,193,102,173, 59,181, 27, 55,225, 43,201,237,168, 71, 56,121,238, 10, 84,106, 29, 40,146,132,163, 76,140,154, 53, +171, 19, 75,215,237,117,217,180,102,233,207, 87, 47,156,234,170, 85,231,244,176, 75,166,139, 57,223, 77,237,221, 88,226,236, 68, + 3, 12,141,175,187,132, 72,190, 61,124,235, 59,228,155,166,219, 45,178,206,156, 17,167,165,166, 98,142,151, 23, 56, 38, 19,132, + 36, 9, 33, 65, 64, 72,146,144, 8,133,232,188, 97, 3,230, 30, 59, 38,158,249,209, 71,149, 98,235,127, 12, 82,169,116,184,151, +151,215,226,245,235,215, 59,251,251,251, 67, 34,145, 64,169, 84,186, 60,126,252, 56,116,210,164, 73, 67,147,147,147,103,168, 84, +170,181,149, 87,170, 18,149, 40, 17,161, 0,110,161, 48,127,169, 29,159,149, 8,161, 80,152,170,213,106,221, 74, 59,134,207,231, +167,233,245,122,247,178,184, 72,146,244, 73, 76, 76,116, 19,139,197,160,105,186, 48, 27, 0, 99, 25, 72, 91,103, 63, 41, 12, 84, +139,160,160, 32, 67,105,156, 50,153,236,215,180,180,180,142,230, 60,129, 86,130,170, 88, 36, 38, 38,118,172, 83,167,206,175,185, +185,185, 31,150, 32, 94,102, 79,152, 48, 97, 98,221,186,117,205, 86,160,194, 44, 8, 5,175, 25, 25, 25, 24, 63,126,188,229, 55, + 24,134,193,169, 83,167, 38, 12, 31, 62, 28, 89, 89, 89,147, 74, 57,119, 63, 55, 55, 55,162, 48,161,120,137,152, 53,107, 22,102, +205,154,133, 21, 43, 86, 16, 92, 46,215,177,140,235, 89, 33,156,182,106,145,255,194,130, 85, 70,100,248, 35,120, 53,188,195,145, +215,132,150,173, 32, 89,230,232,188,101,235, 71,206, 25,214,146,216, 56,169, 99,224,216, 21,167,175,144, 60,182,245,195,100,109, +188, 13,150,172, 17,141,154,119,108, 59,126,226, 84,201,142,191,206,226,241,195,187,136,190,184,243,149, 99, 26,126, 56, 28, 41, + 25,185, 24, 62,238,107, 41, 65,113,218, 94, 56,125, 96,132, 81,167,217,104,163, 53,203,221, 79,192,255,162,105,227, 96,110,162, +232, 49, 60, 20, 34,180,108, 80,131,235,123,226,222, 23,106,152,150, 63, 44, 88, 37, 99,151,200, 90,255,233,167,104,101, 52,194, +141,162, 64, 17, 4, 40, 0, 36, 65, 64,171,211,225,198,224,193,104,188,117, 43,126, 56,116, 72, 60,187,123,119,187,196,150, 68, + 34,185, 77, 16,132, 34, 47, 47,175, 43, 10, 18, 75,191, 15,168, 35,149, 74,143,176, 44,155,165, 86,171, 67,223,161,114,121,162, + 96,142,190,232,232,152,135,130, 21, 85,118,101, 22, 22, 8, 4,163,251,246,237,187,116,213,170, 85,226,212,212, 84, 36, 37, 37, +129,166,105, 8,133, 66, 4, 6, 6, 18,167, 79,159,118,158, 58,117,234,146, 35, 71,142, 8,114,115,115,151,219, 51,176,225,114, +185,235,156,156,156, 62,114,119,119,151,164,165,165,229,103,103,103,159,210,233,116,163, 81,254,180, 41, 36,151,203, 29, 84,181, +106,213, 94, 94, 94, 94,238,137,137,137, 25, 9, 9, 9, 7,117, 58,221, 38,148, 51, 81,179,213, 53,173,143,194,104,245, 0,146, +171, 86,173,122, 63, 38, 38, 38,173, 2, 57,147,170, 86,173,250,160, 28,156, 18, 0,187, 0,120,149,113, 92, 18,128,254,176,211, +154, 93,137,138, 19, 89,133,217, 30,138, 10,170,210, 62, 43, 21, 58,157,206,213, 96, 48,128, 91, 66,178,120,181, 90, 13,153, 76, +230,106,107, 33, 69, 34, 17,118,238,220, 9, 46,151, 11, 46,151,139,172,172, 44,248,248,248, 88,246,121, 60,158,229,255, 42, 85, +170,148,201, 71,211,116, 99,138,162,144,151,151, 7,154,166, 45, 91,118,118, 54, 88,150,133, 64, 32, 0, 77, 23,164,115,178,250, +188,113, 73,124, 4, 65,244,243,242,242,194,142, 29, 59,160,215,235, 95,251, 92, 46,151, 35, 42,234,159, 36, 35, 20, 69,161, 73, +147, 38, 36, 65, 16,253, 0, 76, 42,133,151, 5,128,240,240,112, 80, 20, 5,138,162, 64,146,164,229,127,243, 70,211, 52,102,205, +154, 5, 91,178,118,188, 13,206,119, 13,101, 68,134, 79, 70, 9, 62, 90,100,105,164,181,220, 37,159, 77, 26,216, 49,255,187, 17, + 93,216,233, 67, 62, 96,167, 14,108,195,126,212,186,222, 95, 20,135, 67, 92,123, 16, 7, 31, 7, 96,211,248, 70,126,190, 46,146, +168, 96, 39,105,205, 98, 40,172,151,120,122,137, 37,242, 31, 63,251,242,107,233,145,243,247, 16, 23, 31,247,154,200, 2,128,155, + 39, 55, 33, 57, 41, 17,183,162, 19, 48,104,196,231, 82,185,220,241,199, 34, 13,106,137,203, 70, 29,100,188,159,166,245,111, 41, +204, 51, 38, 33, 87, 1, 80, 1,124,112,197,106, 76,237, 86, 95, 32,151,241, 74, 75, 85, 97,225, 20,240,249, 39, 23,158, 62,109, + 17, 89, 45,116, 58, 8,104, 26, 38,154,182,136, 44,189,201, 4,141, 94, 15,207,188, 60, 60, 27, 62, 28,172,209,136, 25,251,247, +139, 5,124,254, 73, 91,202, 9, 0, 60, 30,207,243,224,193,131, 85,234,213,171,119, 14,182, 7, 51, 61,253, 22,234,142,173,156, + 13, 66, 66, 66, 34,182,110,221, 90,133,199,227,121, 86, 4,167, 80, 40,252, 88, 34,145,164, 11,133,194,143,203, 89, 78, 18,192, +188,145, 35, 71, 70, 86,175, 94,253,108,161,176,178,136,154,234,213,171,159, 30, 57,114,228,109, 0,179, 74,168,235,197,113,122, +123,121,121,205, 95,181,106,149,248,201,147, 39, 72, 76, 76,132,209,104,196,192,129, 3, 65,211, 52, 52, 26, 13,244,122, 61, 22, + 45, 90, 36,113,118,118,254, 14, 5,137,130,109, 57,119,158,131,131,195,147, 45, 91,182,244,125,249,242,165,244,236,217,179, 68, + 84, 84,148,100,201,146, 37, 61,157,157,157, 31, 3, 16,148,227,122,146,158,158,158, 27, 15, 28, 56,240, 89, 84, 84,148,207,190, +125,251,184, 87,175, 94,245, 92,179,102,205, 40, 79, 79,207,173, 0,168,114,222,163, 80,177, 88,220, 97,202,148, 41,204,229,203, +151, 19, 47, 95,190,156,184,116,233, 82,180,106,213,170,197,156, 57,115,194,202,201,217, 64, 38,147,181,159, 50,101, 10,115,225, +194,133,164,107,215,174, 37, 44, 89,178,132,108,223,190,125,203,249,243,231,215,183,147,115,215,229,203,151,219,196,199,199,251, + 39, 36, 36, 84, 75, 72, 72,168,154,144,144, 80, 53, 49, 49,209, 47, 57, 57,185, 74, 74, 74,138,111, 90, 90,154,111, 68, 68, 68, + 75, 0,219,223,177,231,232,255, 3, 39,199, 44,164,148, 74, 37,142, 28, 57,130, 66,235, 85,168,181,200, 82,169, 84, 72, 78, 78, + 54,127,198,177,165,156,114,185,252,204,250,245,235, 89,173, 86,139,156,156, 28,164,165,165, 33, 62, 62, 30,207,158, 61, 67,102, +102, 38, 30, 61,122, 4,177, 88,124,198,150,114, 18, 4, 1,154,166, 45, 66,234,212,169, 83, 24, 57,114, 36,148, 74,165,229, 61, + 14,135, 99,249,223,252,157,178, 56,205,150, 39,154,166,113,237,218, 53,140, 25, 51, 6, 75,151, 46,197,246,237,219,113,248,240, + 97, 40,149, 74,139,216, 50,153, 76,101,114,102,100,100,128, 97,108, 27, 51,177, 44,139,156,156, 28,155,239,187,181, 0,226,112, + 56,175,137, 34,243,102, 79, 93,122, 67,206,119, 22, 54, 68,134, 47,121,132,109,254,167,208, 84,215,246, 21,161, 85,213,227,187, +197, 19,251,137, 64, 27,192, 26, 53,128, 33, 31, 48,228,129,209,231,131,224,137, 0,163, 6,174, 2, 37,118,141,171, 37,255,102, +199,243,135,244, 35,162,107,116, 70,238,241, 98,123, 4, 14,111, 80,191, 97, 19,156, 19,210, 84, 72, 76,205, 1, 69,254,211,239, +133,117, 28, 6, 14, 69,226,250,137, 2,195, 21, 73, 81,200, 81,235,144,157,103, 64,223, 97, 19,157,126, 95,250,253, 32,147, 65, + 91,106,140,151,186, 64, 96,176, 84,218,187, 78,157, 42,228, 67, 65, 52,194, 62,186, 8,154, 1,216, 11,221, 17,154,229, 70, 5, +157,228,247, 86,231, 26,230, 71, 1, 79, 74,181,102, 56, 58,138, 20,245,235, 99,142,151, 23, 90, 27,141,224,177, 44, 62, 72, 77, +197,221,137, 19,161,219,187, 23, 36, 0,222,199, 31,163,221,178,101, 56,239,229, 5, 15,141, 6,217,147, 39,195,245,248,113,240, +228,114, 17,210,109, 91,252, 64, 16, 4,218,182,109,139,211,167, 79, 59,119,238,220,249,196,189,123,247,250,152, 76,166,243,229, +185,137, 14, 14, 14, 55, 57, 28,142, 79, 89,199,153, 76,166,132,156,156, 28,187,211,140,112, 56,156,214, 77,154, 52,217,191,111, +223, 62,133,193, 96,168,144, 81, 8,159,207,239,220,179,103,207,245,171, 87,175,150,143, 26, 53,106,253,225,195,135,243,245,122, +253,113,123, 44, 57, 0,230,173, 93,187,118,108,120,120,184,227,168, 81,163,216,103,207,158, 89, 91,175, 92, 91,181,106, 85,125, +253,250,245, 30,141, 26, 53,154, 48,102,204, 24, 30,128, 25,101, 89,121,164, 82,233,184,245,235,215,187,100,100,100, 32, 47, 47, +207,210,200, 38, 36, 36, 64, 36, 18,129, 36, 73,144, 36, 9, 46,151,139, 31,127,252,209,121,220,184,113, 19,149, 74,229, 68, 27, +172,100,235,126,251,237, 55,215, 15, 63,252,144,124,249,242, 37, 72,146,132, 80, 40,196,167,159,126, 74,106, 52, 26,197,156, 57, +115, 54,171,213,234, 1,246, 92, 67, 46,151, 59,104,221,186,117, 53, 91,180,104,193,137,142,142, 70,179,102,205,112,253,250,117, +124,252,241,199,220,220,220,220,106, 83,167, 78, 29,169,211,233,236,141,227,226, 41, 22,139,235,254,253,247,223,241,190,190,190, +150,134,165, 90,181,106,116,215,174, 93,149,209,209,209,181, 46, 95,190,156,217,188,121,115,123, 18,150,123,139,197,226,160,163, + 71,143, 38,207,153, 51,167,195,218,181,107,123, 2, 64,227,198,141, 15,206,157, 59,247,172, 82,169, 12, 62,127,254,188,178,117, +235,214, 9, 54,242,121,121,122,122,210,227,199,143,151,150,118,208,134, 13, 27,178, 81,144,112,217, 31,192, 11, 84,226,223,130, + 9, 64, 24, 65, 16,183,142, 28, 57,130, 38, 77,154,224,200,145, 35,232,218,181,235, 45,107, 49, 16, 21, 21,133,214,173, 91,163, +208,162,101,147,175, 86, 78, 78,206,180, 89,179,102, 93, 24, 52,104,144,248,149,198,128, 36,225,232,232,136, 46, 93,186,104,213, +106,245, 52, 91, 11, 74,211, 52, 56, 28, 14, 18, 18, 18,176, 97,195, 6, 44, 88,176, 0,129,129,129, 48, 26,141,175,137,173,194, +118,207,166,198,207,100, 50,225,198,141, 27,216,182,117, 43,102,124,247, 29,100, 50, 25, 0,192, 96, 48, 64,153,149, 5,161, 80, +104, 17, 99,101, 8,167,221, 79,159, 62,157,232,227,227,243,202,148,161,249,181,176,205, 2,195, 48, 48,153, 76,208,106,181, 88, +186,116,169,137,101,217,221,101,245, 63,102, 81, 52,113,226, 68,232,116,255, 24,212,235, 23,250, 36, 87,173, 90, 21, 33, 33, 33, +150,125,146, 36, 89, 91, 57,127,111, 94, 23, 26,171,163,107,205, 90, 2, 0,240,241,241, 65,173, 90,181,224,233,233, 89, 34,103, +113, 90,228,191,134, 29,145,225, 75, 22, 90, 37,101,202,126,248, 50,101,209,168,169, 75,150, 72,132, 20,247,203, 94,245, 80,197, +145, 7,136,156,192,107,253, 13, 8,199,130,129, 60,171,124, 1,156,252, 6, 63,247, 86,146,225,127,104,255, 50,208, 10,215,231, + 89, 89,175, 57,225,113,121,194,118, 1, 53,106, 18,113,201, 74,112, 56, 28, 72, 28, 92,208,188,215, 36, 80, 20, 9,169,163, 11, + 8, 90,243,143, 34, 38, 41,112, 40, 14,148,185, 26, 84,245,175, 65, 10,132,162,118,234, 50,132,150,220,129,251,219,148, 1,205, +133,153,166, 4,136,170, 8, 65,155,187, 83, 47, 62, 72,231, 92,124,213, 57, 80, 20,126,240,222,111,200, 49,182,183,229,194, 80, + 38, 19,220, 40, 10, 6,150,197,221,137, 19, 17,182,110, 29,110,153,133,225,186,117,184, 21, 30, 14, 39, 46, 23, 2,146, 4,107, + 52,190, 54,167,111,139,208, 2,128,248,248,120,236,221,187,215,169, 95,191,126,251,163,162,162, 6,217, 41, 54,204, 92, 46,215, +174, 93,115,243,247,247, 47,241,152, 23, 47, 94,160, 97,195,134,118, 79, 79,241,249,252,206,237,219,183,223,177,119,239, 94,135, + 7, 15, 30,192,205,205,237,141,133,150, 64, 32,104,221,177, 99,199, 29, 91,182,108,145,167,167,167, 99,221,186,117,242,238,221, +187,111,143,140,140,236,165,211,233,108, 17,155,175,136,172,117,235,214,101,111,216,176,225,119,188, 58, 69,152,188, 97,195,134, +141,141, 26, 53,250, 44, 60, 60,220, 17,192,216, 66,223,129, 82,197,150, 64, 32,104, 27, 16, 16,240,202,168, 86, 32, 40, 48, 54, + 73, 36, 18, 56, 56, 56,128,199,227, 65,167,211, 33, 44, 44,140,224,243,249, 45,109, 57,103,153, 76,214,177,119,239,222,228,197, +139, 23,145,146,146, 2, 71, 71, 71, 72,165, 82,208, 52,141, 81,163, 70, 81, 75,151, 46,109,171, 86,219, 55,195,229,235,235,219, +179, 67,135, 14,156,251,247,239,227,229,203,151,208,233,116,120,252,248, 49,228,114, 57,134, 12, 25,194, 91,188,120,113,247,196, +196, 68,123,133, 86,221,240,240,240, 84,107,145,101,134, 68, 34, 33,106,214,172,169,116,118,118,110, 0,192, 30,161, 85,247,243, +207, 63, 79, 91,184,112, 97,235,211,167, 79, 91,130, 94,158, 62,125,122, 42, 0, 44, 95,190,252,130,171,171,107, 3, 0,182, 10, + 45,176, 44,203,124,242,201, 39,177,124, 62, 31, 92, 46, 23,124, 62,255,149,141,199,227,129, 36, 73,153,249,113,254, 31, 22, 53, +141, 0,252,130,130,228,186,223, 1,184,246,142,148,235, 54,128,176,174, 93,187, 90,196,214,177, 99,199,208,185,115,103,100,103, +103,227,254,253,251,214, 34,203,158, 4,203,183,141, 70,227,157,157, 59,119, 54,239,215,175, 31, 97,245,124,225,193,131, 7,120, +244,232,209, 45, 91,249, 72,146, 4,195, 48,224,114,185, 88,178,100, 9, 12, 6, 3,254,248,227, 15,236,217,179, 7, 36, 73,130, + 32, 8, 16, 4, 1,185, 92,142, 21, 43, 86,216,213,238,209, 52,141,205,155, 55,227,155,169, 83, 45, 34,171,112, 38, 3, 30,238, +238,112,118,113,193,243,231,207,203, 20, 90, 89, 89, 89, 63, 28, 58,116, 8,165, 57,195, 31, 58,116,200,242,127, 17,103,248,178, +251, 57,138,130, 78,167,195, 7, 31,252,147, 42,246,243,207, 63,183,252,175, 84, 42, 65, 81,148,249, 90, 16,182,114,106, 88,160, +151,240,159,247,186,124,245,213, 43, 22,186,146, 56, 75,210, 34,239,162,117,171, 24,177, 21, 86,104,157,245, 4,208, 21, 5, 62, + 90,201, 64, 25, 62, 90, 79,210,212,171, 56, 68,114,200,194,241, 31, 14,171,226,230, 0, 54, 47, 21,188,246, 63,224, 78,186, 8, + 75,150, 30, 5, 0,124,253,105, 67,212,239, 56, 15,250, 77, 31, 98, 98, 51,138, 63, 56, 65, 55, 5,192,204,215, 27, 70, 38,200, +199,219, 11,119,158, 69,129, 67, 81,224, 59,184,192,193,201, 29,140, 73,143,156,180,151, 56,183,239, 87, 0,192,218,205,187, 65, +146, 36, 56, 28, 10, 58, 61,141,192, 42, 94, 96, 24, 38,168,180,114,214, 6,154,183,117,119,105,226,235,231, 72,220, 87,188, 68, + 77, 55,231, 34, 19, 33, 2, 4, 38, 73,137,102, 82, 81,227,172, 28, 85,243,135,192,229, 50,197, 0, 73,130, 36, 8,136,121, 60, +232,246,238, 45,240,218, 92, 87,208,103,221, 10, 15, 7,249,215, 95,144, 9, 4,160, 8, 2,156, 66, 19,116,121,160, 82,169, 64, + 16, 4,182,109,219,166, 24, 50,100,200,246,251,247,239,135,107,181,218,189,246,112,100,103,103,119,109,209,162,197,217,205,155, + 55,187,122,120,120,188,246,121, 74, 74, 10,134, 13, 27,150,158,157,157,109, 87, 80, 55,161, 80,248,113,207,158, 61,215,111,218, +180, 73,254,244,233, 83,228,229,229,193,213,213,245, 77,235,104,131,166, 77,155,238,223,187,119,175, 67, 74, 74, 10,114,114,114, +160,211,233,176,109,219, 54,199, 46, 93,186,236,141,142,142,238, 12, 32,178, 12,142,153,214, 34,107,204,152, 49,247, 0,184, 1, +248,173,168, 6, 45,252,172,158,149,216,202, 1,176,184,148,145,168,159, 68, 34, 65, 90, 90, 26,134, 13, 27,134, 39, 79,254, 49, +128,122,121,121, 89, 70,122,207,159, 63,135,171,171, 43, 8,130,112,179,229,164, 93, 93, 93,165,122,189, 30, 35, 71,142, 68,124, +124,252, 43,156, 9, 9, 9, 32, 8, 66,108,239,133,116,119,119,119,215,104, 52,104,213,170, 21,180,218,130,188,190,253,251,247, + 7,151,203, 69, 90, 90, 26,184, 92,174, 75, 57,238,143, 75,215,174, 93, 75, 12,173, 34,151,203, 13, 10,133,162,182,157,156,206, +221,187,119, 79, 92,183,110,221,107, 11, 91,174, 95,191,222,195,201,201,233,180,147,147, 83, 77, 59, 57, 25,107, 81,197,227,241, + 94, 17, 90, 92, 46, 23, 36, 73, 50,248,223,199, 79, 0,204,171,224, 86, 3, 8,121,135,202,102, 17, 91,199,142, 29, 67,112,112, + 48,178,178,178, 16, 29, 29, 93, 94,145,101,110,239,190,153, 61,123,246,201, 62,125,250, 72,204,131, 86,145, 72,132,201,147, 39, +107,242,242,242,190,177,171, 18, 49, 12, 56, 28,142,101,144, 44, 20, 10, 17, 22, 22,102, 17, 89, 4, 65, 32, 63, 63, 31, 28, 14, +199,188, 34,145,176,177,140,240,244,240,128, 76, 38, 67,141,192, 64, 60, 45,108, 71,204,255, 11, 4, 2, 16, 4, 1,147,169, 76, + 67, 94,110,161, 83,251,164, 10,190, 55,172, 89, 20,149,106, 58,246,242, 2,195, 48,102,145,201, 86, 4,167,139,139, 11,242,242, +242,108,229,124, 39, 81,130, 69,203, 44,180,186,162,192, 87,235,181,240, 14,109, 0,156,195,171, 75, 42,201,218,238,210, 13, 11, +199,117, 24,246, 97,176, 11, 52,233, 47, 33,148,185,128,112,172,138, 37, 75,143,226,254,139, 76, 0,192,146,237, 55,177, 99, 78, + 23, 64,228,132, 90, 14, 25,240,144,113,122, 63, 74,123, 93,104, 17, 96, 9,134,101,193,161,200,194,185, 91, 10, 20, 69, 66,153, +158,140,101, 63,140, 45, 20, 89,123,112,228, 66, 52,124, 2,130,255,153,199, 37, 8,128, 45,189,114,187, 58,240,214,141,235,211, + 84,148, 74, 36,195,209, 75, 12,161,176,136,126, 84,240, 64, 84, 37, 49,190,173,143,248,198, 33,237,186,135, 57,134, 50, 59, 10, + 33, 73, 22, 56,191, 19, 68,177,206, 61,100,225,103, 20, 65, 20, 68,127,101,236,107,211,205, 66, 94, 36, 18,193, 96, 48,128,162, + 40,172, 92,185,210,177, 99,199,142,191,217, 43,180, 0, 60, 72, 77, 77,237, 50,106,212,168, 99,187,119,239,118,113,113,113,121, +101,244, 48,106,212,168,140,212,212,212, 46,176,211,233,158,203,229,254,182,122,245,106,121, 76, 76, 12,242,243,243, 33, 18,137, + 44,141, 79,121,235,103,227,198,141, 79, 28, 63,126, 92,145,147,147, 3,131,193, 0,145, 72, 4,150,101, 65, 81, 20,254,252,243, + 79,231,110,221,186, 29,141,139,139,107, 95, 90, 89, 69, 34, 81,175, 66,225,132,240,240,112,199,240,240,240, 54, 64,137,145,122, + 45, 8, 15, 15,119,156, 52,105, 82,119,141, 70,179,184,148,115,142, 87, 42,149, 30, 34,145, 8,251,246,237,131, 84, 42,133, 88, + 44,134,151,151, 23,148, 74, 37,196, 98, 49, 88,150,133,209,104, 52, 55, 22,153,182,156,120,122,122,122,158,201,100,114, 56,118, +236, 24, 50, 51,255,249, 74,149, 42, 85,144,157,157, 13,134, 97,242,237,189,152, 73, 73, 73,169, 4, 65,248,222,185,115, 7, 49, + 49, 49,232,220,185, 51,254,250,235, 47, 52,108, 88, 48, 59,172,215,235,203, 19,196,143,166, 40,138, 45,165,222, 18, 0, 20, 21, +201, 89,216,121,217,197,201, 48, 12, 99, 22, 89,214,175,214,226,171,140,223,252, 95,129,131,245, 56,225, 93, 45,100,231,206,157, +161, 84, 42, 33,149, 74, 43,194, 63,231,138, 70,163,121,124,224,192,129, 6, 93,187,118, 5,159,207,199,227,199,143, 17, 25, 25, + 25, 13,224,138,189, 66,139,203,229, 98,246,236,217, 24, 59,118, 44,220,221,221,241,205, 55,223,128,195,225, 88, 54,130, 32, 44, + 22, 46,123,224,230, 94,250,194, 71,179, 67,124, 89,198,112, 7, 7,135,217, 36, 73,246,163,108,184,112, 52, 77,211, 12,195,236, +206,201,201, 41, 53,188,131,217,113,221,150,123, 97,125, 13,202,232,211,222,152,179, 4, 45,242,159,163,232,106,195, 18, 44, 90, +230, 85,135,175,165, 2, 50,159,229,185, 66,147,221, 57,107,145,245,227,216,118,195, 62, 12, 86,224,224,153,107,224, 25,178, 1, +125,110, 41,119,216, 8,130, 39,129,187, 3,183, 88, 95, 33,130,164, 30, 37, 36, 38,193, 89, 33, 45, 20, 89,133, 27, 73,162,126, +112,193, 96,246,200,133,104,248,248, 7,131, 67, 81,224, 80, 20,164, 34, 1, 82, 83,146,193,225,144,143, 74,250,217,186, 20,250, +244,169,233, 91, 85,225,204, 69,134,171, 30,158,238, 37, 24, 6, 26,200,224,227,201, 71, 39,103,161, 95, 93, 10,125, 74,149,229, + 44,107, 17, 90, 6,147, 9,188,143, 63,182, 76, 23,222, 10, 15, 71,216,186,117,160,123,246,132,218, 96,120,197, 84, 92, 94,161, + 37, 18,137,144,155,155,139, 65,131, 6, 41,141, 70,227,103,229,172, 11,145,153,153,153,125, 7, 15, 30,156,105, 22, 48, 6,131, + 1,131, 7, 15,206,204,204,204,236,107,131,149,232, 53, 24,141,198,207, 26, 54,108,168,204,200,200,176,148,179, 60, 13,142, 25, + 78, 78, 78, 71, 54,108,216,224,164,211,233, 96, 50,153, 44,156, 34,145, 8, 20, 69,193,213,213, 21, 59,118,236,112,117,114,114, + 42, 53,103,149, 70,163, 57,176,110,221,186,108, 0, 88,183,110, 93, 54, 65, 16, 17, 4, 65,172, 33, 8, 98,117,145,109, 13, 65, + 16, 17,214,199,106, 52,154,253,165,113,235,245,250,136,232,232,104, 86, 44, 22,131,162, 40, 24, 12, 6, 8,133, 66,139, 73, 92, +165, 82, 65,163, 41,152,230,142,140,140,132,209,104,188,104,203,185,231,230,230,158,217,188,121, 51, 83,165, 74, 21, 4, 7, 7, + 35, 44, 44, 12, 77,155, 54,133,159,159, 31,230,206,157, 75,171,213,234,115,229, 16, 90, 71,118,237,218,101,244,245,245, 69,131, + 6, 13, 32, 16, 8, 80,191,126,125,120,121,121, 97,193,130, 5,250,156,156,156, 99,229,184, 77,113, 81, 81, 81, 84, 41, 34, 87, + 14, 27, 86,239, 22, 65,252,141, 27, 55,168,166, 77,155, 30, 44,250, 65,227,198,141, 15, 74,165, 82, 7,179,137,221,158, 17,185, +181,184, 18, 8, 4,150,205,252, 62,135,195,249,255, 96,209,154, 8,224, 30, 10,226, 48,125,243,142,149,205,226,248,158,153,153, +137,232,232,104, 68, 70, 70,162,105,211,166,184,120,241, 34,240,143,131,188,221,200,201,201,249,102,206,156, 57,106,243, 74,190, +239,190,251, 78,147,155,155,251,141,189,109, 48,203,178,224,114,185,168, 85,171, 22, 38, 77,154,132,163, 71,143,226,241,227,199, + 48, 26,141, 22, 33,100,246,201,180,199,162,197,227,241,224,238,238, 14,163,209,104,177,102, 1,192,211, 39, 79,192,225,112,192, + 48, 12,244,122,125,153, 22, 45, 7, 7,135,217,235,215,175,159,144,145,145,225,153,158,158,238,102,189,165,166,166,186, 37, 39, + 39,187, 37, 38, 38,186,197,199,199,187,197,198,198,186,189,124,249,210,115,209,162, 69, 19, 28, 28, 28,102,219, 82, 78,138,162, + 80,191,126,125,124,254,249,231,150,109,213,170, 85,150,237,220,185,115,118, 59,175, 83, 20,133, 90,179,150,160, 75, 58,107,217, +142,186, 18,150,237,254,215, 99, 74,227, 44,170, 69,222, 9,152, 87, 27, 90, 39,150, 46, 6,230, 85,135,230,182,204,226,182, 81, +212, 25, 30, 0, 16,228, 33,158,247,227,232,214,195, 62,168,237,128, 3,103,110, 98,206,254, 23,143, 2,135,185,214,170,174, 72, + 7,147, 30,141,175, 63,109,136, 37,219,111, 2, 40,152, 58,100,210,238,131,205,122, 14, 86,230,139,151,202,140, 98,167, 29, 76, +122,237,217, 23,207,158,180,171, 85,183, 17,153,146,145,247,202,242,207,176,182,125, 65, 16, 4,188,253,131, 65,113, 56,160, 40, + 18, 28,138,130,163, 92,136,232, 59,119, 24,157, 70,115,182, 56,206, 54, 0,135, 47,226,175,250,180, 83,125, 97, 18, 63, 13,174, +158, 18,240,184, 5,218,145,125,209,183, 72, 15,193, 1,234,202, 48, 60,209, 89,116, 54, 85,187, 74,161, 54, 28,140, 40, 97, 4, +200, 48, 12,164, 2, 1,180, 58, 29, 52, 38, 19,218, 46, 91,102,153, 46, 36, 9, 2,183, 1,212, 91,182, 12,151,247,238,133,156, +207, 7, 4, 2,155, 87,133, 20, 39,180, 50, 50, 50, 48,116,232,208,204,228,228,228, 33,229,241,209, 50, 67,167,211,157, 79, 73, + 73, 25,210,183,111,223,109,251,246,237,115,234,219,183,175, 50, 37, 37,101,136,141,126, 79,175, 65,171,213,238,141,143,143,207, + 31, 58,116,232,214,237,219,183, 59,187,184,184, 88, 70, 34,229,170,172, 4,145,209,161, 67, 7,129, 45,199,149,113,200,156, 66, +231,246,177,133,150,173,122, 99,198,140,185,140, 2,255, 43,107,204, 90,187,118,109,127,171, 41,198, 53, 0,150,149, 70,172, 82, +169, 86, 79,154, 52,105,196,249,243,231, 93,132, 66, 33, 8,130, 0,143,199, 67,141, 26, 53, 44,171,104,184, 92, 46, 88,150,197, + 87, 95,125,149,145,150,150,182,220,198,123, 51,102,206,156, 57,173,181, 90,173, 98,232,208,161,148, 80, 40, 68,106,106, 42,150, + 46, 93, 74,111,218,180, 41, 91,173, 86, 15, 43,135, 16,222,252,253,247,223,183,205,203,203,243, 31, 53,106, 20, 47, 39, 39, 7, + 26,141, 6, 83,166, 76,209,111,220,184, 49, 65,163,209,216, 29,240,183, 89,179,102,207, 98, 99, 99, 91,230,231,231,103,137,197, +226,162,214, 62, 66, 34,145, 52, 2,176,213, 30,206,176,176,176,231,113,113,113, 77,231,205,155, 23, 97, 52, 26,185,215,175, 95, +239,105, 22, 89, 43, 87,174, 60, 39, 20, 10, 59,160,132,101,209,165,212, 17, 70, 32, 16,188, 98,193, 42,250, 63,135,195,249,255, + 96,209, 58,135,130,144, 25,239, 26, 94, 17, 89,247,239,223, 71,187,118,237, 0, 0, 23, 47, 94, 68,139, 22, 45,112,241,226, 69, +180,108,217,210,238, 88, 90,133,248, 91,165, 82,197,158, 59,119,174,142,175,175, 47,174, 92,185,242, 18,192,223,246, 22,210, 44, +180, 56, 28, 14, 6, 14, 28,136,142, 29, 59,162, 74,149, 42,175,172, 54, 52,255,111,143,216, 48,153, 76,168, 91,183, 46,116,122, + 61,120, 60,158,101,106,146,195,225,192,213,205, 13,207,158, 61,179,201,162, 69,146,100,191, 94,189,122,145, 15, 30, 60,192,128, + 1, 3,176,109,219,182, 18,143, 29, 60,120, 48,118,238,220,137, 94,189,122,145,211,167, 79, 47, 53,188,131,217, 9,221,150,115, + 50,247,211,101,181,251, 21,197,105,173, 69,222, 53, 88,133,118, 40, 14,225,197,188,183,238, 21,161,101, 21, 36, 12,254,174,226, +225, 29,107,112,112,224,236, 77,204, 57, 16,183,153,102,217,125,251,110,101, 29,254,166, 5, 96,216,253, 41,234,247,221, 90, 48, + 93, 8,128, 73,187, 15,195,238,193, 32,196, 46,184,144,200, 69,142,198,112,164,248,138,103,216,246,215, 31,191, 78,106,250, 91, + 75, 87, 79, 55, 7, 40,115, 52, 22,177,117,235,220, 30, 0, 64,159, 49,243,193,161, 10,166, 20,229, 82, 33, 68, 60, 10,123,183, + 44,207, 48, 24,180,197,214,174, 92, 46, 57,118,122,243, 26, 14,124,137, 17, 42, 15, 22,193,174,255,100,202, 33,252,247,188, 46, +184, 66, 21,112,185,159,133, 79,171, 75,229,203, 31,100,143,133,145, 89,245, 90,135,152,157,173,201,190,115, 71,212,121,253,122, + 92, 31, 50, 4,222, 52,141, 8, 47, 47, 56,113,185,112, 16, 8, 64, 18, 4, 52,135, 15,227,242,190,125,112, 23, 8, 0,153, 12, +166,185,115,161,139,142,134, 49, 55, 87, 83,142,145, 25,250,247,239,159,145,145,145,209, 87,175,215,159,127,211,138,160,209,104, +142,199,199,199,143,109,214,172,217,111, 70,163,241, 51,141, 70,115,252, 77,248,244,122,253,241,148,148,148,143,251,247,239,191, +103,255,254,253, 46,142,142,142,229,230,202,204,204,108, 88, 65,245,157, 1, 48,163,208,185,125,108,120,120,184,227,141, 27, 55, + 70,108,216,176,225, 55,171,209,132,219,200,145, 35, 71, 23, 17, 89,101,174, 58, 4, 16,151,150,150, 54,119,242,228,201,243,127, +254,249,103,169,217,241,253,238,221,187, 48,153, 76,224,114,185,160,105, 26, 35, 71,142,204,203,204,204, 92,130,146, 35, 58,191, + 86,181, 84, 42, 85,141,121,243,230,109, 88,182,108, 89, 71,138,162, 36, 52, 77,171,243,243,243, 35,180, 90,237, 48,148, 47,142, + 22,147,158,158, 62,116,230,204,153, 67,151, 46, 93,218,139, 36, 73, 55,147,201,148,145,155,155,123, 72,163,209,108, 68, 57,166, +146,174, 92,185,146,254,233,167,159,190, 72, 79, 79, 15,242,241,241,201,145, 74,165,122,189, 94, 79,137, 68, 34,185, 68, 34, 9, + 3,112,133, 32,136,135,246,112,222,186,117, 43,101,212,168, 81, 49, 58,157,174,214,154, 53,107, 46,200,229,242, 51, 4, 65, 16, + 60, 30, 79, 33, 18,137,218, 1,136, 32, 8,226,169, 61,156, 36, 73, 50,214,214,171,162,254, 89,124, 62,255,255,139,143,214,187, + 8, 75,120,135,140,140, 12, 60,120,240,192, 44,178,194, 0,160,101,203,150,183,204, 98, 43, 50, 50, 18, 13, 26, 52,184, 5,128, +107,111,125, 85,169, 84,147, 7, 13, 26,116,188,112,112, 60,185, 28, 3, 63,139,208, 50, 11,170, 42, 85,170, 88,246,173, 55, 43, + 31, 45,155, 64,211, 52,120, 60, 30, 56, 28, 14, 60,189,188, 44,191,197,178, 44,158, 61,123, 6,165, 82,105,147,208,162, 40,138, + 34, 8, 2, 3, 6,216,182, 32,249,147, 79, 62, 65, 68, 68, 4, 40, 27, 85, 33, 69, 81,168, 90,181,106,153,199,152,117,169,173, +156, 62, 62, 62,229,230,180,214, 34,239,146,192, 42,238,255,226, 68, 85, 73, 15,196,107,120,158,166,153, 55,248,151, 75,211, 31, +166,104,247, 69,167,230, 79, 2,192,238,190, 47, 62, 89,223,149,250,240,195,154, 9,208,173,107, 9, 66, 94, 16,188,141,205, 75, + 6, 33,113, 71, 2,227,141, 89, 7, 31,165,152, 64,148,228,255,146,148,151,151, 51, 99,203,250,149, 63,143, 28,247,149,244,254, +243, 84,228,228,233, 64, 81,164,117,227, 9, 14,135,130, 92, 34,132,175,135, 3,182,255,254, 75,110,174, 42,123, 38, 74,200,123, + 88, 69,198, 27,211,161, 81,117, 1,207, 83,141, 90,245,250,131, 18,254, 35, 2,216,148, 18,102, 7, 91,156,196, 71,113,106,225, + 95,113,234, 49,183,179,244,175, 11, 45,189,254,195,239, 58,117, 58, 49,231,232, 81,113,227,205,155,241,124,228, 72,120,105, 52, + 16, 20, 78, 37,146, 4, 1, 41,143, 7, 41,143, 87, 32,178,150, 46,133,198,100,194,178, 33, 67,242,117,122,125, 39,123, 30,242, +204,204, 76,244,236,217, 51, 61, 41, 41,169, 11,202, 49,181, 87, 18,212,106,245, 94, 0,123, 43,138, 79,167,211,157, 79, 72, 72, +248,168,103,207,158, 71,143, 31, 63,238,250,142, 4,153, 51,139, 45,195,141, 27, 55, 70, 95,184,112,225, 57, 94, 77, 44,154,125, +225,194,133,231,163, 70,141, 34, 54,108,216,176, 17,192,247,176, 49,128,167, 90,173, 94,121,234,212, 41,180,110,221,250,251,133, + 11, 23, 58, 55,108,216, 16,110,110,110,200,205,205, 69,100,100, 36, 38, 78,156,168, 84,169, 84, 11,179,179,179,127,182,179,204, + 6,157, 78, 55,216,122, 41,117, 69, 92, 7,157, 78,183, 41, 57, 57,121, 83, 69, 17,142, 31, 63,254,238,179,103,207, 50, 93, 93, + 93,155,240,120,188,122, 40,240, 3, 74, 1,176,209, 94, 65,100,198,184,113,227,238, 60,123,246, 44,195,219,219,187,105, 33,167, + 35, 10,210, 24,173, 47, 7,103,210,205,155, 55,125, 26, 53,106, 68,114,185, 92,150,162, 40,112,185, 92,150,195,225,176,133,126, + 53, 44, 0, 28, 58,116, 72, 0, 64,137, 74,252,219,176,132,119, 72, 78, 78,182, 22, 89,102,171, 85, 88,203,150, 45,111, 21,138, + 44,243,103,229,241, 47, 59,205, 48,204, 27,229,235,101, 89, 22,115,230,204,193,218,181,107, 81, 86, 68,243,194,213,125, 68, 89, +124,102,139, 22, 77,211, 48, 24, 12,184,127,255,190, 37,102,151,121,186,208, 28,218,193,100, 50,149,186, 90,157,166,105, 90,175, +215,227,207, 63,255,180, 73,108,237,216,177, 3, 90,173, 22,116, 25, 10,206, 58, 20, 67, 72, 72, 8,148, 74,165,101,177, 79, 88, +216, 63,161,242, 12, 6,131, 93,194,213,204, 89,171, 86, 45,100,100,100,192,236, 47,236, 59,228, 31, 99,143, 73,253, 63, 27, 63, +184, 68,139,150,205, 61,102,125, 7, 7, 7, 29,223,184,191, 71,176,160,109,191, 48, 7,248,123,200,192,229, 9,145,164, 50,225, +244, 67, 21,214,159, 75,137,215, 24,233,110, 79,210,243,163, 74,227, 17,136,229,199, 27, 54,239,216, 98,200,232,137,146, 60, 29, +141,152,152, 88,164,167, 37,131, 36, 72,120,122,251,192,207,175, 42, 68,124, 18,219,214,253,172,190,117,249,204,165,188,220,172, +206, 37,113,117,117,224, 93, 94,250,113,139,166, 1, 1, 50, 2, 38, 35, 64, 27, 1,147, 17, 96, 10, 95,205,239, 49,175,214,185, + 7, 15,178,217,233,183,149, 87,143,228, 24,138,205, 89,213, 23,104,225,232,228,116, 98,214,161, 67, 98,198, 96, 64,230,228,201, + 16,155, 76, 16, 22,142, 74, 10, 78, 68, 0,211,220,185, 5, 34,107,240,224,252,156,236,108,187, 82,240,184,184,184,220, 36, 8, +194, 37, 61, 61,253,189,138, 12,239,234,234,122,132,101,217,140,140,140,140,134,239, 80,185,220, 0,100, 3, 48, 20, 51,144,112, +133,253,254, 63,102, 84,117,117,117,157, 78,146,100, 51,150,101,157, 73,146,204, 98, 24,230, 74, 90, 90,218, 34, 0,207, 42,251, +211,255, 12,230,200,240,213,202, 56, 46, 13,192,151, 40,112, 10,142,169,188,108,255, 58, 42, 60, 5, 79, 69,194,201,201,233,218, +137, 19, 39, 26,250,251,251,147,214, 14,239,230, 88,121,230,233, 45, 14,167, 64,203,157, 63,127,222, 52, 96,192,128, 43,169,169, +169,173, 75,226,148,201,100, 39,239,221,187,247, 65, 78, 78,206,107,130,202, 58, 82,188,121, 95,173, 86, 99,220,184,113,167, 74, + 74,193,227,224,224,176,244,231,159,127,158,208,167, 79, 31,210, 28,142,194,122, 51,167, 11, 50,111, 6,131, 1, 91,183,110,101, +150, 47, 95,190, 34, 39, 39,167,196,169, 67, 79, 79,207,248,164,164, 36, 31,115,168, 5, 91,130,138, 86,173, 90, 53, 57, 54, 54, +214,235,223,228,124,143, 5,215, 58,107,225,109,175,105,130,168,229, 38,233,207, 2,253, 72, 48,117, 73,130,224,155, 88, 60, 6, +139,147, 98, 78,254,111,183,146, 97,211,212, 25, 87, 36, 26, 47,147, 42,126,232, 51,232,115,231,170, 1,129,132,187,167, 55, 8, +144, 72, 77, 73, 68,236,139, 39,236,254, 63,126,205, 84,171,148,179, 53, 26,245,175,165,241,212, 6, 2,170,201,121,187,249, 52, +106,194, 44,128,138,228,167,122,109,196, 1,192,192, 37, 31,197,228, 26,251, 63, 44,101,218,199, 44,182,102,236,223, 47,230,215, +172,249, 90,160, 56,134, 97,160,139,142,198,178, 33, 67,236, 22, 89,149,168, 68, 37, 42, 4,254, 40, 59, 70,150, 17, 5,241,185, + 76,149,151,235, 63,193, 59,155, 84, 26,128,196,201,201,233, 12, 69, 81,126,102,139,140,181,181,190,152,132,210, 49,169,169,169, + 29, 0,148,182, 66, 56, 64, 38,147,253, 74,211,116, 99, 91,146, 74, 83, 20,117, 61, 55, 55,119, 60, 74, 73, 42,253, 54, 86, 29, + 58, 59, 59, 63,139,141,141, 13, 48,175,162,182,238, 43,139, 91, 89,254,244,233, 83,180,105,211, 38, 54, 37, 37,165,234,191,201, +249,174,162,132, 85,135,225,197,220, 99,251, 44, 90,111, 1, 94, 60,129,116, 40, 95, 36,108,207, 24, 77,181, 64, 0, 28, 46,247, +145, 94,171, 57,171,211,228,109, 65, 9,211,133,255, 38,250, 2, 45, 4,124,254, 73,158, 92, 46, 42, 78,180, 25,115,115, 53, 58, +189,254,195, 74,145, 85,137, 74, 84,162, 18,149,120,143, 80,211,201,201,233, 4,151,203, 21, 88,139,201,162,255,155, 97, 50,153, +180,233,233,233,157, 1, 60,254,151, 57,223,107,216, 19,196,252, 21,216,233,164,214,209, 86,206,194,173,205,187,206,249, 22,207, +157,173, 64,206, 54,133,156,179,222,147,114,182,121, 87, 57,205,231,107, 7,111, 71,123,234, 81, 69, 93, 79,171,114,178, 21, 93, +206,183,197, 89, 81,207, 81, 49,229,100,223,194,125,159,245,158,148,179,205,187,198, 89,180,254,216,200,107, 23,167,141,117,202, +222,114,178, 21, 93,206,183,197,249,166,207, 81, 41,229,100,223,180, 46,149,112,239,103,225, 61,196,131, 80,176, 15, 66,193,222, +111, 80,108,220,198,226, 44, 90, 96, 89, 22,118, 57, 18,190,173,149, 0,230,176,251,133,252,196,187,202,105,125, 29, 42, 50, 85, +192, 91, 72, 59,112,174,162, 57,139, 92,207,138,194,172,194, 21, 38, 17,176, 33,224,168, 61,231, 94, 17,247,189,200,185, 86, 8, +111, 57, 68,150, 93,156, 21, 85,239,223, 54,103, 69, 61, 75, 69, 57, 43,162,222, 23,119,223,223,226, 61,170,168,114, 86,200,179, +244, 54,234,124, 49,245,231,141,121,139,114, 86,196,179, 84,148,179, 34,234,253,191,193, 89, 17,207, 82,113,156, 21, 81,239, 75, +186,247,239,171,133,202, 60, 93, 88, 24,226,129,176, 65,108,173, 3, 0,178, 60, 23,237,109,224,109, 36,146,172,104, 65,244,182, +196,166, 29, 22,152,255,156,179,130,239,209,172, 66,206,138, 28,221,180,173,168,123,244, 54,234,187, 53,103, 69,241, 23,229,169, +136,251, 84, 28,231,155,150,183,132,114, 86,248,185,191,105,189,255,183, 56, 43,248, 30, 85,200,179, 84,132,179,109, 5, 15, 6, +218, 90,237,207,170, 72,206,138,122,150,138, 41,231, 27,223,167,226, 56,223,180,188, 37,148,179,194,207,189, 34,250,144,183,197, +251, 95, 90,180, 88,178,196, 58,177,174,200,246,175, 8,141,255,108, 74,206, 78,238,255, 41, 78, 59,167,103, 58,190,133,123,255, +159,150,179, 34, 57,139,150,177, 34,167,123,222,102, 57, 43,146,211,142,178,254,207,113,190,111,247,253, 93,188,158, 37,241,189, +201,180, 84, 73,214,209,183, 81,206,138,228,180,145,251,127,130,243, 13,238,253,255, 12,202, 53,117,248, 54, 97,190,240, 21, 60, + 50, 65, 5, 91, 96,222,218,121, 87,112, 57,219,190, 13, 11,225, 91, 64,133,151,179,112,164,252,195, 91, 56,247,247,229,154, 86, + 62, 75,149,207,210, 59,247, 44, 21,169,147,109, 43,208, 82, 84,161,150,231,162,156, 21,241, 27,214, 28, 21, 85, 71,223,246,185, + 87,228,179,244, 54,238,253,251,134,255, 27, 0,133,106,237, 30,181,247, 74, 74, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, 0}; diff --git a/source/blender/editors/datafiles/splash.png.c b/source/blender/editors/datafiles/splash.png.c index 353f547dc17..589fc124f4d 100644 --- a/source/blender/editors/datafiles/splash.png.c +++ b/source/blender/editors/datafiles/splash.png.c @@ -1,6610 +1,6389 @@ /* DataToC output of file */ -int datatoc_splash_png_size= 211350; +int datatoc_splash_png_size= 204235; char datatoc_splash_png[]= { -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1,245, 0, 0, - 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71, 68, - 0, 1, 0, 1, 0, 1,178,230,200,110, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, - 0, 0, 7,116, 73, 77, 69, 7,218, 3, 2, 19, 20, 24,177,122,117,152, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,119,188, - 93, 85,157,254,255, 94,107,151, 83,111, 77, 15, 36,144,144, 16, 32, 16, 32,161, 36,128,212,208, 65, 65, 64,197,138,232, 87, 29, - 44,140, 12, 58, 40,138,131,140, 35,234,111,116,196, 2, 72, 19, 29, 20,140, 12, 85,144, 58, 8,130, 6, 12, 37,210, 33,180,144, -158, 91, 79,221,109,173,223, 31,123,175,125,247, 57,247, 6,226,232,188, 70,244,174,215,235,230,150,236,179,203,218,107,173,231, -243, 60,159,178, 4,160,249,179,154, 13, 40, 4, 10, 0, 43,115,194, 8, 64, 0,200,248, 24, 13, 78,242, 9, 7, 8,129, 58,160, - 37,160, 36, 32, 17, 8, 36, 26,139, 16, 32, 57, 43,104, 17,127, 87,233,221, 58,241,223,137, 50, 71,141,183,241,246,247,212,100, - 50,227,226,249,133,208,241,228, 19, 97, 58, 9,197,152,159, 49,255,173,210,255,215,230, 96, 45,147, 15, 89, 45,199,163, 51,231, - 79,230,187, 70,130,144,230,131, 35,199, 65,242,247,236,121, 84,124,140, 14,177,146,191, 42, 32, 20,201, 26,162,227,153,111, 33, -145, 40, 32, 66, 17,162,129, 72, 36,151, 48,151,209, 54,232, 92,114,134, 32, 89, 73,222,170,239, 79,182,189, 37,141, 64, 97,161, -210,126,202,190,163, 8,136,146, 21, 82,141,175,127,227,109, 11,136,252,103,182,214, 1,165,199, 28, 98,170,229,167,104,100,138, - 35,129, 72,143, 28,163,145, 40, 20,106,100, 57,201,172, 58,217, 31,245,248,219, 27,111,227,109,212, 28,252, 51, 22,120, 13, 8, - 51,243,218, 64,154, 17, 64, 31,185,134, 74, 62, 35, 51,199,169,204,185,228, 22, 87, 3,209, 50,131,227,107,106, 84,178,126,168, -150,207, 9, 64,235,246,117, 64,181,221,203, 91,248,189, 9,217,242, 55,173, 19, 66,148,105,162, 5,212,199, 87,191,241,182,229, - 38,254,220,241,209,102,135,199, 11,130, 24,153,216, 98, 20, 46,103,173, 83,141, 75,136, 76,108,237,200,176,118,115,156, 30,185, - 59,171,229, 26,201, 68, 16, 42, 94, 76,198, 71,248,120,251,187,101,234,178,141,203,189, 25,208,201,204,247,228,216,246, 85, 64, -180, 76,196,182, 5, 67,181,124, 90,211,170, 8,200, 49,215,131,204,185,180,218,178, 66,208,118, 29, 57,134,210, 16, 37,134,255, -136, 38,248, 22, 6,118,209,246,128,162,205,112,201,188, 19,161, 71,212,202,184, 63,147,231, 87,111,117,195,102,188,253, 85, 49, -117, 49,106,210,153, 9,108,228, 64,133,212,173, 19, 18, 44,144, 46, 8, 7,116, 8,170, 58, 50,223,179, 43,131, 54,192, 46, 32, - 17,228,210,165, 66, 40,144, 42,195, 14,198,219,120,251,123,110,186,141,189,254, 15, 63,222,242,187, 26, 67,186, 31,219, 60,104, -199,164, 86,208, 31,203,232,142, 89,249, 40,133, 32,115, 2,173, 99, 5,207,102, 44,129, 58,214,242,254,166,108,121, 1, 99,118, -184, 24,233,143,150, 78, 78, 93, 45,227,180,125,188,253, 5, 65, 61, 59,177,163,148, 61,139,140,213,173, 90,199, 97, 10,220, 22, -136, 28, 96,225, 19, 96,227,141,120,197, 68,150,129,144, 57,143,108, 93, 4,198, 1,125,188,253,221,183, 54,137,122,171, 1, 93, -182,126,207, 40,107, 99,177,238,173,193,163,118,150, 46, 90,126, 87, 25,149,142, 17,195, 95,143,196,226,232,118, 96, 75, 72,184, -214,217,245, 32,246, 53, 71, 99, 40, 5,111,105, 91, 44,141, 21,216, 2,115,111,249, 57, 19,227,208, 54, 6,198,219,120,251,139, -128,250,232,129,106, 2,109, 12,184,171,150,197, 33,212, 17, 16,100,128,223,142, 1,221, 88,234, 90,103,228,167, 17,163, 64, 38, - 60, 63, 93, 32,244, 22, 88,198,120, 27,111,127, 71, 77,180, 1,251, 27, 79,137, 49, 96, 58, 43,141,139, 17, 86, 45,199,192, 21, - 61, 6,140,200, 12, 22,169, 55,184,106,202,218,179,103,110,241,197,143, 13,106,145,182, 33, 9,159,149,153,171,136,191, 17, 96, - 23,153,142,213,217, 62,208, 25,227,103,140,247,147,246,219,248,250, 55,222,254,210,160,174,218, 23, 18,161, 50,192, 30, 51,120, - 17,115,243,228, 75,161,117, 3, 21, 53, 98,111,186,116, 64,216,153, 21,195, 72,136, 81,234, 87, 27,147, 61,232,145,235,143,143, -235,241,246,247,220,100,219, 92,108, 81,100, 69,198,216,110,153,181,114,244, 25,244,104,230,167,199,152,239,250, 13,230,191,216, -130, 9, 49, 54, 0, 11, 52,178,197, 48, 25, 61,153, 5, 81, 42,194,135, 9,184,255,109,176, 83, 1, 72, 61,218, 24, 83, 26,116, -146, 17,208,250,118,101,178, 38,142,184, 70,198,131,230,198,219, 95, 28,212, 91, 6,148, 86, 35,211,215,200,102, 66, 17,233,248, -175,217,116, 54, 9, 4, 40,134,149, 71, 36, 3,208, 86,178,240,100,124,242, 99, 44, 20, 34,179, 76,232, 81, 75,203,120, 27,111, -127, 79, 44,125,108,224,220,122,115,188, 45,200, 78,200, 36,200, 93,109,241, 60,186, 13,174,117, 27,227,215, 25, 22, 25, 37,105, - 89,217,251,139,210,136,121, 43, 51,143,227,116, 87,195, 82, 91,131, 97,179,129,118, 18,173,101,124,222,191, 25, 36,147,201, 99, -171, 12,113,145,173,129,134, 25, 85,198,202, 16, 36,115, 76, 52, 62, 21,198, 91,166, 89,192,191,252,121,160, 46,209, 45, 78, 33, -149, 73,139, 1,164, 13, 68, 88, 64,135, 5, 57, 13,239,216,119, 18, 95,252,200,209,188,231,168,189,176,104,178,234,165,205,184, -105,110,170, 64, 74, 7,215, 45, 16, 70, 17,150,165,176,172,120,157,144,201, 60,143, 21,122, 11,133, 68,103, 67,228,183,208,114, -185, 28, 90,107,180,214, 72, 41,145, 82,162,245,214,173, 10, 66,196, 83,205,124,198,113, 28,148, 82, 88,150,149,158,195,252,156, -203,229,226, 62,209,127,155,182,179,235,186, 68, 81,148,246,201, 88,125,225, 56, 78,218, 7,185, 92,142, 40,250,191, 93,114,108, -219, 70, 41, 53,234,125,102,223, 91,246,111,237,199,164, 75,175,148, 8, 33, 90,222,109,246,185,183,230, 62,108,219, 78,251,195, -244,229,214,142,193,177,142,119,109, 7,173,212,152, 18,185, 65,125,203,182,227, 99, 4, 72, 41, 64, 43, 44,145, 17,203,133, 0, -105,141, 56,194, 45, 43,113,100,139,228,191, 44, 84, 50,111,180, 78,156,222, 50,201,158,182,237, 17,153, 88, 58, 49, 80, 27,229, - 45, 49, 18,116,155,251,173,197,128,200, 88,233, 86, 18,211,238,100, 0, 11,172,248,126,156,120, 13, 65, 42, 16, 49, 55,181,237, -183, 86,226,139, 16, 2, 41,101,235, 24, 19, 22, 10, 39, 93,203,192,194, 18, 14, 82, 88,104, 4, 26,176, 44, 23,173, 99,248, 22, -104,138,150,133,165,227,113,144,179,192,215,227, 76,125,188,253, 69, 65, 93,198, 19, 88, 10, 68, 44, 24, 33, 77,180,166,208,241, - 36, 23, 86,146,218, 22, 91,215, 7,236, 92,228, 59,231,253, 19,157, 97, 63,243,182,237,229,152, 67,247,103,187,201, 14,191,255, -253, 42, 58, 11,208, 12, 21,161, 86,132, 81, 4, 82,162,148, 66, 41,157,250,238,140,101,170,176,144, 78, 14,173,130, 55, 4,117, - 33, 4, 97, 24,166,139,183, 1,119,179, 40, 11, 33,222,240,203,117, 93,148, 82,233,103,148, 82, 72, 41,177, 44,171, 5,208,180, -214, 68, 81,212, 2,110,142,227,252,159,131,218,159, 61, 64, 44, 43, 5, 70,243, 44,249,124, 30,219,182,241,125,127,148, 17,147, - 5,208,191,134,103, 55,239,200,117,221, 81,247,151,189,239,177,128,221, 24,128, 66,136,116, 12,228,243,249,150,243,102,207, 55, - 86, 51,134,143,233, 63, 99, 28,154,190, 49,231,223,210,151,185,199,108, 95,154,123, 85,109,128,222, 34,133,155,121,168, 20,182, -227,224,216, 54, 81, 24, 38, 56, 26,139,222,174,109, 19,170, 4,205, 83,205, 94, 39, 64, 47, 65, 90, 49,233, 22, 18, 45, 5,194, -182,146,227, 18,142,168, 20,150,157, 24, 54, 58,169, 58,161,147, 96, 89,203, 78, 28,237, 10,147,132, 54, 42,192, 91,136, 12, 53, - 16,216, 9, 61, 72,204,232, 56,122, 70, 16, 3,185,107,129, 37, 64, 5,241,179, 70, 99, 24, 49,127,165, 96,222,190,238,180, 44, -191,118, 46, 54,132,180, 70,163, 81,132, 40, 84,188,158,218, 14,161,138,192, 18, 88,142,131,214,138, 72,249, 41,127, 15,244,184, -251,113,188,253,197, 65, 93, 36, 50,154, 70,232,168, 37,102, 93,165,242,187,133,219,209,137, 10,234,148, 4,236, 56,189,200,158, - 59, 76, 35, 26,120, 29,171,182,137,104,227,171,236,183,223, 66,142, 61, 96, 39,238,185,231, 49, 34, 9,181, 80, 33,114, 14, 90, -218,137, 81, 16, 79,115,219,178,208,210, 70,233,152, 45,104,173,120,179, 97,109, 22,192,118,182, 99,128,202, 76,182, 45,125,101, - 23,223, 92, 46,151, 26, 8, 74, 41,242,249, 60, 65, 16,164,172,212,178,172,244, 90, 81, 20,189,229, 1, 61, 11,206, 66, 8,242, -249, 60, 97, 24,166, 95, 89, 80, 50, 6,210,150,152,238,255,165, 81,162,148, 74,223, 91,214, 80,105, 7,229,118, 5, 39,171,238, -100,159,221,128,117, 16, 4,127,242,194, 94, 42,149, 82, 99, 40, 59,158,182,244,101, 89, 86,122,159,165, 82,169,229,154,237, 32, -169,219, 13,110, 4, 8,141,237, 56,248,158,135, 0, 28, 57,162,111, 43,165,176,208, 88, 66,101,230, 18, 72,215, 69,171, 76, 97, -153,228,228,150,109,161,163,216,164,150, 86, 18,189,174, 34, 3,191, 96,187,180, 68,184, 43, 5, 58, 74,140,136,214,123,214,105, -168,189,206,220,173,133, 72, 87,145,216, 9, 32,115, 54, 58,242, 65, 7,160,226, 74,121,210,149, 72, 5,142, 99, 19, 69,127,221, -174,183, 44, 59, 31, 61, 48, 50,249,230, 90,129,140,176,164, 70, 74,141,210,154, 72,135,105, 31,105, 34,144, 2,173, 35, 34, 1, -110, 14,162,104, 92,122, 31,111,255, 91,160,174, 69, 26,206, 98, 38,173, 50, 51,216,206, 17, 53, 27,104, 21, 33, 52,108,222,224, -225,134, 27, 88,122,224,126,108, 90,253, 18,229,168, 78,125,221,107,204,152, 57,131,247,159,118, 34, 43, 30,255, 61, 27,251, 3, -148, 14, 9, 2, 63,161,231,241, 68, 15,181, 68, 41, 1,182,140,153, 4, 81,194, 16,244, 86, 45,172,102, 65,206, 50,182,173, 97, -234,134,129, 71, 81,212, 34,185,134, 97,152,254,191,249, 50,108, 46,203,202,222,202, 45, 43, 95,103, 65, 48,151,203,145,203,229, -240,125, 63, 53,114,204,179,106,173, 41, 22,139,233,223,255,175,153,146,185, 47,219,182,145, 82, 18, 69, 81,202,158,219, 23, 96, - 99,164,152,223, 45,203, 34,138, 34,194, 48, 68, 8,129,109,219,169,209,182, 53,239,214,128,179,185,143,236,231,140,177,244, 70, - 95,217,251,204,142, 95,243, 44, 74,169, 84,193,210, 45,128, 78, 10, 8, 81, 24,165,193,170,182, 37, 64,141, 68,174,152, 50,164, - 86, 6,108,165,144, 35,121,209,210, 78, 24,178,138,129, 56, 1, 86, 75,104,108, 5,157, 54, 88, 42,185, 78, 20,101,210, 90, 69, - 2,216, 42, 13,120,205,212,169, 75,190,139,196, 85,167,211,149, 35,214,252,226, 59,177,208, 16, 69,104,192,182,210,186, 53,232, - 80,163, 21,168,232,175, 63,150,166,125,140, 24, 5, 72, 36, 46, 16, 65,128,208, 1,130,216,248,137, 69, 15, 1, 66,140,244,134, - 86,177, 4,106,130, 40,116,156, 71, 16,141, 75,239,227,237,127, 7,212,227, 72,119,187,189, 2,148, 0,149,149,244, 16,184, 82, -147, 19,240,199, 85, 85,158,127,118, 5,135, 47, 93, 74,193, 82, 84, 6, 6, 80, 2,234,205, 26, 39,159,116, 2,229,124,192,239, - 31,126,141, 9, 29, 16,248, 70, 30,204,101,236,253, 8, 28, 11, 34,239, 79, 22,159, 12, 75,219,210,164, 27,139,165, 26,201, 57, -203,246, 10,133, 2, 97, 24,166, 50,108, 59,147,109, 7,193,183,106, 51,128,148, 53,138, 28,199,193,247,253,148, 53, 26, 23,133, -235,186, 41,208,252,181, 40, 21, 89, 64, 55, 96,108, 90, 46,151, 75, 1,188,157, 33,155,191,153,231, 50,159, 51, 32,171, 83, 63, -243,214, 25,148,134,117, 71, 81,148, 94,119,107,198,134,145,239,219, 85, 38, 51,246, 68,150,149,183,115,119, 1,210,146,104,165, -145, 2, 28, 91,160,194, 24, 50,243, 54,216, 10,242,201, 39,138,118,108, 39,107, 5,145,138,226,105,101, 59,160, 52,210,182,209, - 81,132,227, 72,116,152,196,162,107,200, 1,174, 50,187, 48,196,243, 60,210, 42,246,185,107, 53, 34,211,103,214,134,145, 50,210, - 50,117, 5, 88, 9,188,105, 36,134,247,139, 36, 14, 39, 7,228, 53, 20,162,248, 90,174,142,149,248,216,214,183, 19,133,225,173, -209,218, 93, 42,127,210,103,147, 56, 7, 92, 23,162, 16, 61,142,230,227,237,127, 13,212,147,201, 44,218, 42, 60,169,216,160, 68, - 56,110,172, 19, 73, 65,168, 20, 97,226, 38,123,105, 51, 60,240,224, 74,246,218, 99, 14, 51,103,109, 71,223,192, 0,181,202, 32, - 57, 66, 14, 88,184,128, 3,247,153,203,221,119, 60, 70, 61,132, 16, 69, 36,192,202, 23, 80,145, 15, 40,108, 2,116,180,117, 11, -106,150,221, 24,198,179,181, 19,203, 44,166, 74, 41,108,219,198,117,221, 22,224,206,250, 91, 23, 46, 92,200,206, 59,239,204,188, -121,243,240,125,159, 74,165,242,150, 7,245,177,250,209, 0,222,226,197,139,153, 59,119, 46, 59,238,184, 35,245,122,157,193,193, -193, 22, 67,224,175, 73,130, 55,239, 48,235, 50, 48,192,216, 62, 22, 92,215,197,182,109,180,214,216,182, 77, 16, 4, 8, 33,232, -232,232,192,247,125,164,148,116,119,119,211,104, 52,182,234,218,237, 62,213,236,189,188, 89,107, 87, 73, 76,208,103,170, 52,181, -100,129,180,202,238, 96, 64, 93, 97,219, 18, 21,234,145,220,146,132,173,231, 13,188,170,248,111,138, 56, 46, 45, 84, 25, 26, 40, - 37, 68, 1, 66,135, 72, 13,121, 43, 62,253,162,157, 38, 48,119, 66,196,220,105, 57, 80, 1,195,245, 24,237,133,101,161, 84,212, - 2,227,217,152,152,148,165,163, 82,117, 79, 9, 29, 27, 3, 66,164,235,137, 11, 20,128,157, 38,195,206,219, 20,153,214,109,163, -252,144,170, 23,111,227, 18,141,212,152,253,171,159, 59, 70,134,255,115,230,134, 72,203,236,217, 16, 69,177,122, 63, 14,238,227, -109, 12, 84,214,127,222,128,181, 16, 90,165, 49,240,233,162, 47, 70,138, 86,230,138,101,188,122, 51, 57, 30, 80,113,189,247,137, - 14,116,135,240,153,247,238,204,225,123,237, 74,153, 6,225,208, 38,166, 76,157,142, 59,113, 27,154,133, 41,124,232,139,223,226, -191,159, 26,102, 83, 68, 18, 85, 27, 7,203,148,146,115,251,188,177, 95, 41,151,203,225,121, 30,142,227,164, 96, 62, 99,198, 12, - 22, 44, 88,144, 46,234,111,212, 54,108,216,192,171,175,190,202,208,208, 80,202, 66, 13, 83, 50, 0, 97, 36,247,101,203,150,113, -236,177,199, 2,112,206, 57,231,240,141,111,124,227, 45, 63, 64,178,207,154,101, 25, 29, 29, 29, 44, 91,182,140, 35,143, 60, 18, -223,247, 57,239,188,243,248,254,247,191, 79,173, 86,107,145,179,255,154,140,154,246,251,113, 93,151, 32, 8, 88,180,104, 17, 7, - 30,120, 32,243,231,207,103,234,212,169,184,174, 75, 95, 95, 31,107,215,174,229,153,103,158,225,166,155,110, 98,227,198,141,233, - 88,106,239,139,173,109,229,114,153,195, 15, 63,156,122,189, 78,179,217,164, 80, 40,188,169,154, 33,132,160, 82,169,240,187,223, -253,110,212,117,227,251, 9,198,144,220, 71, 76,107, 33, 65, 71, 10, 87, 10,148,210,105, 58, 41,192,158, 59, 78,163,195,242,104, - 84, 6,113,138, 93,172, 90, 51,192,134, 90, 92,197,185, 17, 9,194,200, 74,100, 95, 1,145, 31,203,247,196,160,158,147,240,201, - 15, 30,205,241,251,238, 76,179, 62,204,181,183,220,195,181,247,188, 76, 21,240,128, 72,216,216,249, 2, 97,163,214, 82,199, 61, - 77,193, 18, 54,232,144, 92,114, 47,158, 76,164,126,105,197, 81,112, 81, 72,167,134,201,192,231,255,223, 17, 28,182,255,254, 12, -215,155,252,248,151,183,241,179,123,159,160, 2,248,150,131,138,254,250,119, 41, 51,160,110, 12,200, 63,199,224,213,218,198,205, -229,240,189, 38, 82,130, 82, 33,227,109,188,181,172,217,163,214,129,148,123, 39, 11,133, 48,245,215,117, 98, 89,143,228, 74,218, - 64,167,142, 90,114, 81, 83, 85,222, 88,229, 22,132,126,149,208, 1, 47,128,174, 78,135, 74, 5, 74, 57, 80,245, 56, 99,229,182, - 95, 63,195, 54, 69,201,146,249, 59, 96, 89, 54,149, 13,235,233,182, 92,242, 86,158,203,254,191,175,112,193, 37,215,240,211, 95, - 61, 74, 95, 51,108, 41, 58, 37, 90, 76, 19,147,165,219,250,221, 4, 37, 25,240,149, 82,242,145,143,124,132, 47,159,251, 37,164, -109,109, 21, 83, 82, 74,113,219,109,183,113,227,141, 55,114,213, 85, 87, 97, 89, 22, 97, 24,166, 19, 85, 74, 73,179,217, 76,149, - 0,223,247, 71,129,255, 91,181,101, 93, 9,150,101,165,253, 89,169, 84,112, 93, 23,173,117, 42,191, 27, 64, 55,224,247,215, 0, -232, 89, 32,118, 28, 39,253,121,201,146, 37, 28,125,244,209,124,240,131, 31,100,234,212,169,105,208,154,145,199, 13,163,182, 44, -139, 31,253,232, 71,252,224, 7, 63,224, 43, 95,249, 74,106, 32, 6, 65, 64, 62,159,167,217,108,110,149, 81,148,203,229, 88,178, -100, 9,215, 93,119, 93,250,121,147,254,247,102,237,174,187,238,226,200, 35,143, 76, 85, 33, 51,238,124, 63,204,200,216, 97,106, - 76,199, 63, 56,128,131,214, 35, 46,147,166,231,227, 75,112, 20,204,233,130, 11, 62,249, 65,122,243,113,160,156, 39,108,254,243, -166,219,249,201,175,158,160,234,199,217,211, 18, 29, 7,165,106, 5,216, 72, 59,132, 16,194,100,171,176,109, 38,247, 82,162, 70, - 57,167, 40, 90, 35,249,211,182, 1,155,160,145,108, 16, 58,178,166,164,219,168, 50, 70, 69, 52, 65,124, 98, 97,242,220,227, 86, - 84, 17,229,234, 70,240, 34,156,100, 59, 86,203, 6, 21, 5,163,236,152, 49, 55,148, 73,114,192, 91, 54,148, 74,162,248,205,253, - 69, 38,194, 64, 36,123, 75,168,214, 28,251, 40,251, 89,218,202,219,182, 83,164, 49,168,146, 72, 29, 12,127,190, 9,162,147, 61, -173, 99, 53,228, 47,113,198,241,246, 55, 6,234,173,165, 92, 69,203,228, 75,188, 90,182, 3, 97,136,208, 13,114, 40,122,172, 56, -203,228, 61, 7, 79,229,164, 3, 22, 49,115, 98, 47,145,144,212, 26,117, 10,121, 11,215,141, 32,170,199, 64,106,231,240,237, 60, -158, 40,163,237, 2, 57,183,136,173, 35,108,191,129, 77,147, 66, 94,209,168, 14, 97, 41, 73, 57, 95,192,154, 52, 45, 73,169,177, -241,155, 30, 50, 90,199, 5,103,156,202,210,197,123,112,246, 87,175,100, 77, 37,158, 96,117,108, 34, 44, 52, 17,185, 98, 62, 86, - 2, 52, 20,138,101, 26,245, 42,144,228,163, 43,133, 37, 44,124,207,195, 18,241, 98,216,108,212,144, 86, 44,255,133,161, 74,193, -120,172,133,214,128,243, 49,199, 28,195,241,199, 31,207,251,223,255,126, 78, 62,249,228, 22, 9, 63, 43,235,154, 5,180, 61, 48, - 47, 27, 45, 45,132, 32,151,203,209,108, 54, 91,148,132, 32, 8, 82,169,184,157, 37,143, 5, 82,230,122, 82,202, 81,202,129, 1, - 91, 19,152,213, 46,227,154,123, 55,192,100, 82,190,124,223, 79,217,160,137,106, 55, 96,151,149,146,205,223,219,131,185, 76, 32, -218, 88,242,119,251, 51,153, 32,188,172, 11, 35,123,124, 22, 16,205, 51,155,251,205, 50, 86, 3,114,217,251, 53,159,245, 60, 47, -253,188,231,121,105,240,227,157,119,222, 73,185, 92,110,121,207, 66,136,150,247,111,250, 55,138, 34, 62,249,201, 79,114,204, 49, -199,112,226,137, 39,178,114,229, 74, 92,215, 77,239,233,141,153, 85,124,143,230,218, 70,214, 31,107,156,101,175,217,238, 14, 48, - 6,169, 57, 54,126,102, 13,216, 8, 34,220,100,222,250,105,216,137, 27,131,148,142,203, 47,215, 61, 31,105,187, 68, 90,227,138, -128,163,118,233, 97, 94,248, 18, 93,158, 29,247,141,235,242,193,195,247,228,167,183, 62, 17,143, 87,226, 90,110,158,150, 96,185, - 16, 73,130,208,195, 38, 24, 41,126, 82,171, 83, 14, 45, 44,169,169, 14, 15,142,128,159, 2, 23,176,195, 48,173, 40, 25,136,216, -192, 79,237,237, 92, 44,179,105,131,203,150,157, 68,204,251, 9, 70,117, 16, 18,208,164, 73,111,177, 72, 79,117, 29,157,174,131, -227,106, 34, 1,205,182, 2,240, 70, 9, 48,105,181,161, 16, 4, 42,134, 81, 75, 72, 36, 97,236,250,179, 28,148,116,147, 69,174, -137,163, 99, 23, 64, 21, 55,150, 40,172, 0, 68,136, 8, 21,182, 74, 2, 8, 5,212,180, 76,130,130, 93,192,195, 73, 84,144,209, -121,226,173,101, 93, 5, 2,180,166,100, 89, 28,186, 99, 55,135,204,233,102,193, 54, 29,204,155, 84,164,183, 96, 19, 42, 77, 95, - 61,224,137,117, 53,238,124,190,159,171, 87,108,160,226,189,145,122, 35, 9,194, 96, 36,119,120, 28,207,199,219, 40, 80, 23, 35, - 21,224,172, 12,168,167, 46,181,114, 25,234, 77, 16,130, 66,190,136,108, 12, 19, 69,240,241,183,239,204,251,150,238,195,116,127, - 3,114,232,121,148,147,103, 74,161, 72, 24,122, 68,181, 42,229,130,132,142, 18,212,251,240,101,142, 40,215,141, 31, 88, 52,135, - 66,242,182, 69,167, 3, 42,244,208,145,196,182,108,172,124, 25, 37,108,106,126,132, 86, 2, 39,111, 99,187, 18,155, 6,245,141, - 47,113,208,238,219,113,211,143,191,194, 71,206, 58,159,149,175,130, 69,152,250,233,189,122, 61,206,233, 12, 20,141,122, 29,153, -200,114, 74,141, 86, 32, 36, 36, 59,199,197,171,139,109,219,220,120,227,141,148, 74,165,150, 52,183, 32, 8,144, 82,114,228,145, - 71, 82,171,213, 40,149, 74, 40,165, 56,244,208, 67,185,237,182,219, 56,252,240,195,169, 86,171,111,218,193, 70,246, 55, 6,131, - 73,129,107, 54,155, 72, 41, 83, 96, 48, 96,148, 13,168,202,178,100, 3,204, 89,214,153,141,226,238,234,234, 98,104,104, 40, 5, -203, 32, 8, 82, 86,221,217,217,201,240,240,112, 11, 96, 22,139, 69,124,223, 79,239,195, 28,107, 98, 6,140, 63,217,128,241, 88, -192,154, 85, 42, 12,187,205,102, 21,100, 13, 25,243,153, 48, 12, 83,163,167, 93, 69, 49,199,155,107,154,236, 2,207,243,210, 62, - 48,204,184, 80, 40, 16, 4,193, 40,163, 39,155,153, 96,158, 55,219,103, 65, 16,224,121, 30,229,114,153,102,179,137,101, 89, 60, -250,232,163,220,125,247,221,220,115,207, 61, 60,244,208, 67,120,158,199,180,105,211,216,103,159,125, 56,227,140, 51, 88,186,116, - 41,190,239, 51,107,214, 44,110,190,249,102,230,205,155,151,126,246,205,228,115,147, 5, 97,198,149,121,254, 48, 12,185,242,202, - 43,121,230,153,103,210,194, 52,217, 32, 67, 3,226, 74, 41,214,173, 91, 55,234, 92,113,191,219, 40, 37, 91, 29, 80, 98,180,244, -139, 86,216,150, 75, 16,134,224,218, 56, 17, 28,182,231, 44,166, 57,117,234, 67, 30, 61,157, 29, 12, 55,250,153, 80,236, 97,175, -185,176,226, 85,240,252, 86,126, 27, 43,118,178,165, 28,172,173, 67,116,109,136, 66,185, 72,222, 45, 16, 48, 16,215,144,176, 37, - 34, 84,132,201,167,243, 37,151, 70,205,143,111,211,182, 98,170,233,197,107, 78,148,146,105,145,174, 67,174, 13,126,232, 16,234, -216,165,215,168, 14, 34, 27, 18,173,242, 52, 26, 53, 26, 58,182, 89,132, 99,161, 27, 81,122, 67,165,188,139, 8,124,154, 1, 40, -173,113,108,151, 48, 84, 40, 29, 7,247, 89, 64, 24, 5,241,212,183,115, 41,211, 78, 70, 74, 18,233,175, 64, 7, 88,122,164, 16, - 78,164, 65, 90, 10, 37,108,136, 36,104,135, 64,132, 56,210,176,102, 70,247,127,162, 30, 10, 9,215,189,111,103,142,221,121, 2, - 5,103,180, 50,232, 2, 69,215, 98, 70,119,158,227,118,158,192, 5, 71,204,226, 31,111,121,145,171, 87,108,216,130,191, 52, 81, - 8,244, 22,182,205, 29,111,227,160,142, 21,111,188,162,162,216, 98,181, 51, 99,196,215, 26,106,149,120,210,217,130,122,179, 74, - 17,200, 75,216,105,231, 5, 8,165, 9,106, 27,177,106, 27, 33,223,139, 23,249,212, 27, 62,142,101, 83, 15, 97,232,181,213, 76, -152,216, 67,181,214,135,211, 17,210,217,219, 67,209, 17, 32, 3,132,235, 96,229,243, 84,125, 31,109,217, 88,194,138, 23,142,124, - 46,102,123, 66, 17, 42,159, 82,119,137,230,240, 16,149,234, 58, 38,246, 76,225,151,215,124,151,115,191,118, 17,255,117,251, 42, -234, 42,160, 80,128,106, 3,194,192, 27, 89,240,162, 24,176,165,144, 40,173, 70,188, 7, 9,148, 43, 65,154,127,219,104, 52,248, -192, 7, 62,208, 2,208,237, 81,236,167,158,122, 42, 23, 92,112, 1, 51,103,206, 68, 41,197,226,197,139, 57,235,172,179,248,234, - 87,191,250,166, 29, 28, 4, 1,165, 82,137, 90,173, 70, 16, 4, 20,139, 69,130, 32,192,117,221, 84,174,182, 44, 43, 5,171,118, -182,106, 24,105,187,156,223, 30,108, 53, 52, 52,148,130, 86, 54,135,222,117, 93,134,135,135, 41,149, 74,120,158,135,239,251,184, -174, 75,189, 94, 31, 37, 17, 27, 64, 49, 62,192,108, 78,116,150,149,102,239, 53, 11, 50,217,123,142,229,225,248, 90,190,239,183, -164, 3, 26,163,201,244,181,249,217,220,175,239,251,169, 17, 97, 64,211, 48,119,211, 15,230,254,179,126,242,246,170,129,217,130, - 57,134,229,186,174, 75,161, 80,160, 90,173,242,203, 95,254,146, 31,252,224, 7, 60,253,244,211,233,249,242,249, 60, 66, 8,214, -173, 91,199,109,183,221,198,205, 55,223,204,213, 87, 95,205, 7, 62,240, 1, 0,102,206,156,201,167, 62,245, 41, 46,190,248,226, -150,248,129,173,241,229, 27, 99,198,244,249,117,215, 93,199,131, 15, 62,216,146, 14,153,101,227,230,126,165,148,233, 59,202,250, - 99,227,177, 18,166, 12, 57,106, 1,244,196, 96, 82, 65, 82,191, 37,140,165,102,223,103,222, 20, 88,184,243, 28,162,104,136, 90, -174,192,211, 47,188,202,156,109, 39,210,237, 58,156,124,232,219,120,252,210, 7, 18,192,211, 32,194, 88,211,215,177,230,110, 46, - 17,179,245,128,156,204, 99, 41,137, 37,115, 68, 9, 35, 87, 88,113,245, 55, 0,199,198,111,106,100,105, 34,170,209,128, 72, 97, - 91,177,116,238, 58,121, 60, 21, 37, 5,110, 64,216, 17, 57, 32, 12, 0, 93,163, 96, 9,116, 4,194, 14,176,186,122,177,132,139, -101, 57, 49,172,233, 2,218, 79, 52,255,192, 35,210,154,225,186, 79, 86,255,208, 97, 68,185, 80,160,214,168,196,134,160, 37,240, -148, 34,208, 30, 58,240,176, 93, 7, 79, 37,157,167, 69,236, 87, 80, 30, 66,133, 35, 1,124, 73, 15,199,254,107, 31,132,139, 40, - 79, 68,215, 7,240,117,144, 68, 16,188,113, 59,121,193,228,150,223, 7, 27, 33,143,172, 30,102, 93,197, 39, 84,154, 29, 39, 22, - 89, 60,179, 19,219, 18,116, 21,108,174,122,215, 78,108,219,149,227,107,247,190, 54,218,157,132, 70,162, 80, 58, 54,154,198,107, -191,143,183,209, 90, 78,146, 7,110, 2, 88, 76,216,201,200,254,229,126, 60,177,133, 74, 11, 64, 69, 22,252,247,239, 31,163,110, -119,208, 40, 78,166,222,177, 45,141,142,109,168,119,108, 67,173,107,123,134,202,219,209,232,158, 67,105,214,238, 12, 83,130, 66, - 39, 81, 20,208,172, 14, 98, 41, 31, 41, 20, 94,189,201, 64,213,195,119, 58,241,236,110,134, 84,142,141,158,197, 64,100, 51,172, - 93, 6, 66, 73,159, 23,177,122,195, 70,100, 33,135,147,179,104,214, 54, 83,239,127,149, 11,206,249, 24, 63,252,250,187,153,228, -130,106, 64,193,138,141, 17,161, 20, 57, 55, 94, 20,109,203, 70,109, 33,221, 37,155,207,107, 22,120,179,128, 26,208, 10,195, 48, - 45, 38,115,195, 13, 55,176,116,233,210, 22,137,248,237,111,127,251, 86, 5,188,228,114, 57,106,181, 90,202,100,235,245, 58,150, -101, 81,171,213, 82, 9,214,124, 47, 20, 10, 45,121,210,237,160, 21,134, 33,133, 66, 97,148,244, 62, 86,121, 90, 3,164, 70,170, -246, 60, 47, 53, 8,124,223,167, 80, 40,164, 0,151,101,204, 6, 96,204, 53, 77, 5,181,124, 62,159, 94,211, 92,207,252,110, 12, - 9,147,170,149,101,175,230, 60,217,188,117,115,159,197, 98,145,102,179,153, 30,111,228,125,195,174,179,249,226,157,157,157, 45, -236, 59, 43,223, 91,150,149, 86,240, 51,215, 76, 83,190,146, 84, 67, 99,164,248,190, 79,173, 86,227, 29,239,120, 7, 31,254,240, -135, 89,177, 98, 5,141, 70, 35, 77,117,108, 54,155, 45,108, 95,107,205,105,167,157,198, 51,207, 60, 3, 64,181, 90,229,252,243, -207, 79,213,155, 55,107, 70,129, 49,207, 97, 89, 86,106,196, 24,151,192, 88,174, 28,211, 23, 70, 77, 49, 46,162,108,153, 94,173, - 35, 68, 50, 99,211,197, 93,155,170,110, 17, 22, 1,118,162,116,131,162,100, 9, 58,129,183,239,191, 39, 37, 91, 81,245, 61, 94, -236, 27,230, 39,191,122, 20,225,150,176,162,136, 3,118,154,199, 4, 32, 39,226, 8,243,152, 30,198,224,101, 17,166, 36, 84, 0, -182, 10,200, 89,177,107,139,164,108,140,237,216, 41,125, 21, 18, 44, 21,130, 10,176,130, 6,150,242, 40,171, 6,165,160, 65,175, - 10, 41,120, 85,138,186, 65, 89, 10, 92, 29, 33, 3,159, 48, 52,246,118, 64, 24, 53,227,167,115, 32, 82, 48,212,240,227, 74,120, - 38, 24, 40, 12,112,163, 26, 69, 17, 80, 38,164, 12, 49,233, 72,201, 73, 72,165, 81, 3,153, 35,192,162,158, 36,118,119, 58,208, - 5,184,126,128, 29,129, 43,161, 72,149, 14,134,232, 81, 1, 19,128, 78, 70,246,114,239,236,176,227, 56,130,132,104,235, 90, 29, -217, 53, 25,116,142, 55,220,160, 86, 36, 5,245,128,186, 31,113,213,195,235, 56,242,210, 71,153,112,254,131, 28,121,197, 31, 57, -237, 23,207,241,209, 95, 62,207,129,151, 60,206,142,223,122,152,251, 86, 13,166, 31,189,224,200, 89, 28, 56,171,107,172, 40,151, - 52, 70, 64,142,227,215,120, 27,147,169, 71, 35, 0, 23, 10,149,108,131, 74,186, 99,147,208, 26, 59, 20,136,192, 75,139, 85, 52, - 5, 92,251,155,231,121,232,143,207,179, 67,143,164,232,186, 84, 2,168, 7,154, 92,185, 11,219,145,120,149, 77, 80,139, 56,108, -209, 36,142,217,111, 1,243,166, 79, 37,108, 12, 17,161,241, 67, 69,128,139,236,152,204,186,134,166,119,230, 14, 76,158, 56, 29, -171,216, 1,185, 2,132, 33, 81,109, 16,161, 26, 12, 15,174,101,112, 96, 45,104,143,222,238, 46,242,104,188,234, 90, 14,222,115, - 59, 46,255,247, 15,241,137, 47, 92,205,186,106, 12,236, 94, 4,202,248,107, 29, 25, 79,196, 12,144,107, 49,178, 63,179,201,121, -247, 50,129, 78, 38,151,217,243,188, 84,122,118, 28,135,102,179,201, 43,175,188,194, 37,151, 92,194,153,103,158,137, 82,138, 69, -139, 22,109, 85,244,179, 97,184,198,207,107, 64,190,163,163,131, 74,165, 66,111,111, 47,187,238,186, 43,249,124, 30,223,247,121, -226,137, 39, 24, 24, 24,104, 97,168, 89, 54,219,206,228,180,214,120,158,151,250,213,141,124, 62,121,242,100, 22, 46, 92, 72,165, - 82, 97,227,198,141, 60,247,220,115, 41, 56, 71, 81, 52, 42, 29, 43,235,151, 55,242,240,188,121,243,152, 54,109, 26,249,124,158, - 21, 43, 86,176,121,243,230, 20,112,109,219, 78,153,170,227, 56,105,217,216,108,159, 20,139, 69,234,245, 56,182,162,209,104,160, -181,102,218,180,105,204,159, 63, 63,149,162,159,126,250,105, 54,109,218, 68,185, 92,166, 90,173,166, 18,115, 59, 83, 55,106, 67, -173, 86,107,233, 83,128, 57,115,230, 48,125,250,116, 6, 7, 7,217,176, 97, 3,107,215,174,109,113, 23, 24,101,193,168, 0,150, -101,113,239,189,247,110,177, 12,171,241,123,155,247, 31,134, 33,215, 95,127, 61,159,251,220,231, 40,149, 74, 8, 33, 88,176, 96, - 1, 43, 87,174,252,147, 38,155, 49,176, 76,235,234,234, 74, 1,220,184, 83,218, 51, 50,140,219, 98,172, 56,130,184, 60,171, 9, -216, 74,124,190,216,241,194, 47,130,212,165,150, 84, 78,199,137, 52, 83,128, 99,246,154, 79,212,232, 71, 20, 74, 92,251,223,119, -115,223,203,176,166,191,194,140, 94, 73, 47, 46, 39,238, 55,149, 43,151,175, 39, 82, 35,114,178, 1,114, 19, 42, 22, 75,211, 33, -182, 20, 68, 90, 32,172,152, 24, 40, 63,150,165, 93, 21, 7,228,105, 96, 90,175,195,230,254, 26,197, 4,116,231,244, 66,111,209, -198,178, 93,150,191, 82,167,166,234,212, 19,109,161,145,212, 51, 71,170,148, 60, 7,142,203,102,101, 33,156, 34,121,215,166, 12, - 20,130, 6, 46,113, 92,219,212, 18, 76,155,230,162, 20,172, 89,239,179,190,158,200,230,150, 96, 56,178, 80,185, 14,116, 24, 65, -216,196,214, 13,100, 16,223, 71,183, 3, 67, 1, 20, 5,204,152, 4, 93, 57,137,131,162, 25,193,154, 62, 88,227, 67, 13,232,175, -132,137,111, 50,169, 69,175, 5,170,127, 3,210, 74,140, 95, 49, 54, 95, 50,212,232,162,135,214,242,205,255, 94,205,250,161, 70, - 92, 63,110, 12, 50,240,202, 64,147,163,175, 92,201, 3,255,176, 39,123,109,219, 1,192, 87, 14,223,142,195,126, 52, 50,198,180, -208, 4, 73, 74,176,146, 73,213,206,113,154, 62,222,218, 65,125,100,183, 31,153, 6,119,100, 35,230,164,214, 20, 92, 11, 21,106, - 66,165,227,252,208, 32,142, 41, 89,221,132, 23, 86, 41,138, 78,147, 48,132, 80, 3,108,140,211, 94,128, 93,166,194, 62,251,238, - 71, 79,143,131, 87,171, 34,194, 0,145,207, 81,243, 5, 3, 81,158, 92,215, 4,118, 58,246, 88,232,153, 14, 86, 62, 30,160, 50, -182,244, 45,175, 10,110, 68,247,240,122, 74,235, 94, 98,245, 11, 79, 16, 40,135,218,224, 38, 38,118,119, 99, 9,159,253, 23,204, -225,188,179,223,199,185,223,184,134,161, 70,188,120, 5,201, 28,107, 38,236, 97,108,166, 62,178,121, 99, 46,159,167, 80, 40,208, -104, 52,168,215,235, 45, 1, 76, 89,153, 88, 74, 73, 95, 95,223, 22,131,193,222,200,167,158,245, 19, 71, 81, 68,185, 92,230,236, -179,207,102,233,210,165,236,183,223,126, 41,219, 53,215,126,249,229,151,185,242,202, 43,249,209,143,126,196,198,141, 27,105, 54, -155,233,121,106,181, 26,133, 66,129,115,207, 61,151,253,246,219,143, 70,163,193,221,119,223,205,119,190,243, 29,182,221,118, 91, -222,253,238,119,115,250,233,167,179,203, 46,187,180,184, 0, 94,127,253,117,254,227, 63,254,131,239,125,239,123,105, 89, 91, 3, -182,198,239, 62, 52, 52, 68, 20, 69,156,126,250,233,156,121,230,153,204,157, 59, 55,101,206, 0,207, 62,251, 44,151, 93,118, 25, -215, 92,115, 77, 10,196,198,167,158,141, 1, 48,128,106, 84,137,206,206, 78, 62,244,161, 15,241,241,143,127,156,153, 51,103, 82, - 44, 22, 91, 2,190, 30,123,236, 49,174,185,230, 26,126,246,179,159,165,254, 99, 3,190, 81, 20,241,173,111,125,139,253,246,219, - 15,223,247,185,238,186,235,184,242,202, 43,201,229,114,156,123,238,185,124,254,243,159,167,209,104,164,231,252,245,175,127,205, -177,199, 30,139,231,121,105, 89,213,172, 18,145, 13, 90,107, 47,111,107,228,250,172,159,222,176,232,223,254,246,183,124,241,139, - 95, 76, 93, 11, 83,166, 76, 73,141,132, 55,106, 6,160, 77,156,131, 25, 19,198, 21, 98,206,151,141,162,207, 6, 59,102,207,111, -130, 43,179, 57,239,169,253,109, 50, 64,116, 82,159, 93, 4,105,241, 39,157,128,169, 3, 44,153,237, 50,179,163,128, 8, 5, 3, -145,205,221,143,122, 12, 3,119,252,254, 9, 62,113,226,177,228,134,107,188,243,224,183,113,249, 67,203,176, 37,105, 93, 9, 82, -131, 56, 83,230, 70,107,106,245, 10,194,206,199,229,222,129, 9, 14,156,124,226,225,236,186,109, 55, 5, 2,158,123,234, 69,174, -191,227, 73,118,116,225,148,227,247,231,109,123,236,196,180,238, 18, 34,136, 99, 50, 74,221,147,185,253,129,229,252,215,189, 15, -242,251,151,171,120, 97,108,133, 8,219, 34,244,163, 88, 61,116,242, 80,232,166,232, 22, 81,213, 65,186,128, 41, 54, 44,217,103, - 6,199, 28,117, 0,147,122, 75, 20,243, 57,194, 80,225,107,139,213, 27, 7,185,241,142,251,185,225,161,215,240, 9,104, 54, 42, - 96, 21,192,113,201,135, 13,166,230, 97,241,108, 88, 52,127, 22,187, 45,216,131,174,142,110, 74,110, 25, 25,120,228,168, 99, 57, - 54, 67, 65,129,245, 53,197,127,222,114, 47, 15,172,124,129,215, 43,208,140, 34,132, 19,144,207, 59, 52,171, 53,164,138,213,140, -209,251,160,183, 2,251,153, 55,173, 2, 61, 82,215,222,210,154,104, 12, 96,247, 66,205, 87,238,124,133, 95,157,190, 27, 0, 7, -206,234,166,236, 90, 84,253, 68,135, 17, 25, 23, 75, 82, 93,118, 92,127, 31,111,163, 64, 61,202,142, 8, 45, 71,226, 98, 18,216, -115,243, 46,149,102,188,176, 56, 57, 73, 62, 87,100,120,184, 10,161,128, 32,222,176,165, 25, 40, 92, 2,186, 45,176,162,120, 1, - 57,121,191,153,156,249,193,147,232,240, 55, 83,106, 14, 32,162, 6,181,102,147, 87,215, 87, 9,122,102,178,195, 1, 71,145,223, -235, 48, 34,191,128,204, 79, 32, 84,177,176,100,153, 82,211, 82,145,179, 2,152, 48, 17, 39, 55,153,217, 83,103,243,226, 3,119, - 48,185, 99, 58,213,161,205, 76, 40,231,169,215,251,120,239,137,199,242,220, 75,171,185,248, 39,247,167,213,170,194, 24,145, 17, -142,131, 14,194, 45, 71,167, 2,245,122,179,197,223,107, 22,116, 19,208,100,130,217,148, 82,169, 92,252,167,212,255, 14,130, 32, - 53, 26, 28,199, 97,255,253,247,231,166,155,110, 34,138, 34,122,122,122, 82,153,223, 84,105,115, 93,151, 89,179,102,241,207,255, -252,207,156,118,218,105,124,240,131, 31,228,161,135, 30,106,241, 95,135, 97,200,194,133, 11, 57,228,144, 9,101, 17,251, 0, 0, - 32, 0, 73, 68, 65, 84, 67,208, 90,179,124,249,114,118,219,109, 55,126,244,163, 31,177,120,241,226, 22,101,192,176,205,105,211, -166,241,221,239,126,151, 57,115,230,240,153,207,124,166, 37, 64,175, 84, 42,209,223,223,207,212,169, 83,249,222,247,190,199,201, - 39,159,220, 18,232,213,104, 52, 40, 20, 10,204,158, 61,155,127,255,247,127,231,132, 19, 78,224,136, 35,142, 72,129,209, 60,167, - 1, 30, 3, 56,229,114,153, 37, 75,150,112,205, 53,215, 48,105,210, 36, 6, 7, 7, 83,240, 53, 6,148, 82,138, 61,247,220,147, -221,118,219,141,243,206, 59,143,253,247,223,159, 39,159,124,178,197, 63,191,251,238,187,179,112,225, 66,164,148,220,115,207, 61, -236,176,195, 14,252,238,119,191,163,171,171,171,197, 16, 51, 62,121,195,122,107,181, 90,106,144,152,247,104,216,110, 71, 71, 7, -195,195,195,163,210,238,204, 61,101,125,241,198, 37,145,117,121,100,141,133, 55,106, 89, 63,185,185, 23,243,179, 9,154, 52,198, - 69,251, 38, 47,237, 5,115,198,250, 89,183,248,148, 50,105, 98,118, 60,157,163,136, 52, 72,172, 0, 28,191,223, 66,236,230, 48, - 42, 95,226,254,199,158,102,125, 24,127,234,246,229,155, 56,249,168,136, 41, 82, 50,103, 74, 23,115, 38, 64,125, 0,106, 58,142, - 13, 67,196, 1, 99, 89,155, 95, 0,133, 82,142, 16,129,138, 60,220, 88, 53,103,193,196, 28, 75,103, 79,196, 13,107,172,190,247, - 89, 14,158, 8, 95,248,202,103,177,132,134, 70, 63,101,187,134,146, 17, 94,125,152,234,203,175,113,212,110, 83,217,115,238, 59, -249,201,157,247,115,233,189,175,160, 34,176,115, 22,158, 23,131,186,167, 36,117, 63,150,218,245,208, 58, 14,221, 30,142, 61,100, -111,246,221,107, 79,188,168, 74,193,105, 32,106, 27,105,212,170, 76, 40,119, 48,123, 70, 15,219, 31,191, 39,251,237, 56,133, 47, -253,248, 17,250,241,168, 32,192,143,235, 99, 28,127,208,108, 62,126,220, 98, 74,170, 78,211,139, 51,117, 8, 20, 54, 33, 69,134, -145,126, 64, 94, 91,244,228, 28,190,246,254,131,121,109,104, 9, 95,189,232, 39, 60,182, 22,134,131, 58,126, 80,103, 66, 1, 42, -141,204,122,211,238,223, 51,224,107, 59, 73,144, 0,216,142,131,142,212,200,110, 52, 99,180,223,190, 50, 52, 50, 70,164, 96, 70, -119,142,103, 54,214, 71, 44,134,108,238,158,102,124, 71,151,241, 54,134,252,222,178,111,185, 68,102, 64, 79,161,104, 52,125,114, - 5, 55,150,205,189, 0, 63,172,199,187, 10, 97,129,155, 56,187, 28,176, 27, 1, 50,130,217, 14,124,236,164,189, 57,122,201, 30, - 20,171,107,201,251, 3,248,149,205, 88,182, 34,144, 14, 29, 83,183, 99,218,129, 39,192,110, 7,227,235, 94,154,229, 34,253, 33, - 44, 95,241, 26,143,172,120,140,205,125,253, 56,182,197,188, 57, 51,217,127,209, 2,246,152, 61,129, 66, 71, 25,138,221,204,217, - 87,210,247,228, 67,148, 74,130,202,224,122,186, 38, 78,102,253,107, 47,240,201,211,223,199,157,119,222,207,139,235, 99,203, 89, - 2,218, 22,169, 20, 63,138, 61,137,145,121, 87, 44,142,108,202,146,101, 68, 6,200, 77,112,155, 82,138, 15,124,224, 3,228,243, -121, 60,207,227,142, 59,238,216,170, 13, 61,132, 16, 41, 27,126,247,187,223,205,213, 87, 95,157, 46,242,190,239,243,199, 63,254, -145,123,239,189,151,117,235,214,209,217,217,201,113,199, 29,199,194,133, 11, 41,151,203,148,203,101,110,189,245, 86,150, 46, 93, -202,163,143, 62,138,101, 89, 41,160, 24, 95,183,217, 36,228,214, 91,111,101,250,244,233, 0,252,242,151,191,100,249,242,229, 72, - 41,217,107,175,189, 56,229,148, 83, 82,224,251,244,167, 63,205,154, 53,107,248,246,183,191,157, 42, 8, 38,231,252,156,115,206, - 73,211,245, 12,131,189,249,230,155,121,228,145, 71,240, 60,143,247,189,239,125,236,182,219,110,188,237,109,111,227,246,219,111, -111,217,253,206,228,177, 27,255,186,235,186, 44, 93,186,148,235,175,191, 62, 5,212,174,174, 46, 86,174, 92,201, 45,183,220,146, -246,201,137, 39,158,200,162, 69,139,210, 84,179,135, 30,122,136,131, 15, 62,152, 71, 31,125, 52, 5, 96,219,182,211,231, 45,149, - 74, 60,252,240,195,169, 95,191,209,104,240,216, 99,143, 81,171,213,216,110,187,237, 82,247, 73, 54,253, 46, 27, 68,103,192,115, -120,120, 56, 5,240,108, 90,158,169, 30,151,221, 77, 45,159,207,115,216, 97,135,209,108, 54,211,251,120,244,209, 71, 83, 99,109, -107,128,221,184, 70,130, 32, 72,163,221,115,185, 28, 83,166, 76, 97,251,237,183,103,242,228,201, 12, 14, 14,242,194, 11, 47,176, -126,253,250, 22,240,143,162, 8,215,117, 83, 54,111,152,190,227, 56,113,122,147, 30, 49,194, 33, 66, 51, 34, 9,107, 41,208,241, -238, 74,108, 87,128,131, 22,206,199,242,135,168,217,157,220,249,200,115,212, 19, 92,120,161, 2, 43, 87,111,224,136, 25,147,200, -105,159,119, 28,186,136,167,151,173,136,165,123,157,241, 39,171, 44,118,197,241, 2,205, 48, 68,169,144,124,242,247, 73,118,200, -132,104, 16,217,172,176, 67,111,145, 83, 79, 60, 18,229,123,136, 66,129, 63, 60,253, 28,207, 61,255, 20,145,136, 56,112,241,190, -236, 51,103, 54,245,129, 62,102,116,247,240,254,163,247,163,223, 31,230, 23,191,237,103,184,230,227, 36,133,241,132, 6, 91, 7, -244, 20, 44,230, 76,237, 96,214, 65,243,217,107,209, 98,250, 6,135,249,237, 19,207,177,106,213,115,216, 94,149,189,231,207,101, -247, 93,119,198,174, 15, 51,217,241, 56,116,247, 25,124,232,224,215,184,234,190, 13,212,163, 38, 86,174, 68,228,133, 52, 2, 73, -232,148,104,120, 17,195,181, 6, 47,189,254, 42,207,172,222,192, 80,117,136, 46,171,198,140,137, 29,236, 58,119, 22,115,103,206, -162, 81,221,192,174, 19,167,112,206,251,143,229, 27,151,253,138, 71, 6,160,232,196,128,158,206,113,157,101,235, 42,169,153,145, - 90,197,105,217,220, 72,129, 82, 26, 75, 36,245,120,199, 96,235,237, 30, 61, 75,138, 86, 99,193,184, 68,148, 48,123, 80,143,183, -241, 54, 26,212, 77,253,104,201,200, 62,232, 42, 19,236,225, 53,125,144,144,239,238,161, 57, 84,141,171, 65,185, 5,240, 27, 96, - 53,177, 66, 29,203,237, 19,224,194,207, 28,195,142, 19, 10,200,225,231,200, 11,159,160, 58,136,101, 11, 66, 55, 71, 21,155,109, -247,216, 23,118,222, 3,109,247,176,145, 34,203, 95,108,114,229,117,183,240,210,203,175,146, 43,150,144,150,131, 68,177, 98,205, -147,220,248,192, 19, 28,180,231, 78,156,253,225, 35,233,177,166,192, 20,155, 9,131,131, 12,190,244, 4,174,221,129,223, 12, 40, -217, 57, 66,221,228,115,159, 57,157, 79,126,241,202,212, 36,209,166, 86,114,203,188,105,245,127,233,204,177, 38, 5,203,247,253, -148,137,103, 1,225, 23,191,248, 5,219,108,179, 13, 65, 16,144,203,229,248,225, 15,127,184,117, 29,156,248,103,167, 79,159,206, -247,191,255,253,148,129,173, 89,179,134,143,126,244,163,220,123,239,189, 45, 82,254,249,231,159,207,209, 71, 31,205,207,127,254, -115, 58, 58, 58, 40, 22,139,252,244,167, 63,101,254,252,249,169,162,208,238, 11,255,252,231, 63, 79, 16, 4, 44, 91,182,140, 51, -206, 56,131,161,161,161, 22,176,253,220,231, 62,199, 13, 55,220,192,158,123,238, 73, 20, 69,156,123,238,185, 92,114,201, 37,105, -154,155, 9, 6, 59,243,204, 51,211,223, 31,121,228, 17, 78, 61,245, 84, 86,175, 94,157, 26, 17,223,254,246,183, 57,234,168,163, -248,241,143,127,204,193, 7, 31,156,250,127,219,253,252, 0,179,103,207,230,242,203, 47, 79,127, 95,181,106, 21,231,156,115, 14, -183,220,114, 75, 11, 43,254,218,215,190,198,161,135, 30,202,178,101,203,232,237,237,197,178, 44, 46,190,248, 98,246,221,119,223, -212, 15,158,141,188, 63,235,172,179,112, 93,151,103,159,125,150,243,206, 59,143,101,203,150,181,108,147,106,128, 48,187, 3, 95, -246, 93,102,251, 58,171, 46,100,139, 9,101,175,105, 36,239,119,189,235, 93,105,108,195, 19, 79, 60,145, 6,176,109,173,251,197, -140,175,108,173,249,159,255,252,231,148,203,229, 52, 64,211,180,151, 94,122,137,235,174,187,142,203, 47,191,156, 87, 94,121, 37, -245,199,103,115,239,129,120, 91,206, 68,226,141,163,209, 21,224,225,155,152, 17, 9,126,104, 97, 39, 1,115, 7,238, 53,139,130, - 8,209,142,195,107,195,130,187,254, 24,196,234, 88,222, 98,168, 25,113,195,111, 30,225,232, 79,158, 74,189,127, 19, 7,239,185, - 11, 63, 92,182, 34,102,202, 9,243, 71,197, 88,226, 16,167,133, 70,161, 68, 8, 73,222,141, 3,198,162, 36, 40, 79,122, 85,220, - 40, 71,206, 86,156,112,194, 9,188, 90, 17, 60,179,166,159,239, 94,121, 45,175, 14,198,138,177,176,225,210,223,222,199, 65,219, -223,199,217,167,189,147, 57, 94,133,153, 69,193, 63,158,188,148,199, 31,249, 5,107, 20,244, 5,137,239, 62, 8,153,226, 70,232, -129,213,156,114,252, 33, 12, 89, 93,252,226,190,135,249,230,213, 15,177, 25,104, 38,129,109,229,135, 95, 96,146,124,129,175,125, -238,112,118,159, 86,162,100, 41, 78, 57,242, 64,110,126, 96, 25,235, 34,240, 67, 1,182,195, 90, 49,153,203,239,121,158,223,223, -243, 27,214,111,142, 63, 63,148,248,244,123,115,128,231,209,201,102,142, 94,184,146,143,189,243,104,114, 94,131,185, 19,203,124, -234,253,135,241,177,239,221, 67, 95, 0, 58, 39,169, 7,170,125, 73, 25,113, 97,166,185,127, 50, 1, 95,145, 84,191, 51,229,109, -101,178, 99,122,107,219,109, 90,169,197, 24,124,125,104,100,236,187, 73,105, 95,165, 37, 97, 96, 10,115,143, 39,170,143,183,182, -104, 14, 59, 13,126, 81,241,206, 63, 40, 34,204,206, 79,113, 36,173, 91, 40, 97,217,121,154,131, 67, 73, 2,123,136, 20, 1, 66, - 6,184,190,166, 43,128,195,119, 21,124,231,203,239, 97,146, 91,167,172,134,176,130,126, 26,195,155,176,115, 22,186,152,167, 34, -115,200,222, 25,176,211, 94,224, 78, 98, 64, 21, 88, 93,133,111, 94,254, 51,126,255,226, 90,134,115,221, 84, 11,189,212, 10,189, - 4, 61,211, 8,122,182,165, 94,154,204, 61,143,175,226,171, 63,188,137, 10,146,168,105,195, 54,115, 8,237, 2,110,177,140, 45, - 36, 34,170,147,211, 13,118,219,113,123,230,206, 72, 9, 69,188,117,100,251, 30,217,140, 45, 85,157,115,206, 57,156,117,214, 89, -124,250,211,159,230,179,159,253, 44, 95,252,226, 23, 57,251,236,179, 57,235,172,179,184,235,174,187,168,215,235, 28,124,240,193, -248,190,143,227, 56,156,126,250,233,220,113,199, 29,163, 0,118, 75,242,123, 24,134, 92,113,197, 21,116,117,117,161,148, 98, 96, - 96,128, 61,247,220,147,187,238,186,107, 84,228,119, 46,151,227,246,219,111,231,200, 35,143,164, 82,169,144,203,229,216,101,151, - 93,248,200, 71, 62,146, 50,117, 19,212,102,216,101, 24,134, 44, 95,190,156,143,126,244,163, 12, 14, 14,182,176,248, 48, 12, 89, -189,122, 53,231,157,119, 30,149, 74, 37,149,219, 15, 57,228,144, 22, 38,251,229, 47,127,153,102,179, 73, 16, 4,108,216,176,129, - 19, 78, 56,129, 87, 94,121, 37, 85, 42, 12,144,220,117,215, 93,188,235, 93,239,162, 94,175,167,140, 51,187,185,137, 41,153,251, -173,111,125,139,158,158, 30,132, 16, 12, 13, 13,177,223,126,251,241,235, 95,255, 58,237,151,238,238,238,148,181,222,119,223,125, - 28,115,204, 49,172, 95,191, 30,199,113,216,103,159,125,248,204,103, 62,147, 6,223, 25,208, 53,108,247,153,103,158, 97,233,210, -165, 44, 91,182,172,101, 1,204,110,182,178,181,205, 48,123, 83,135,192,188, 51, 83,152,198,243, 60,190,250,213,175, 50,123,246, -236, 20,164,191,247,189,239,165,121,250, 91,243,254,205,253, 85, 42,149,150,157,217,122,123,123, 83, 64, 31, 30, 30, 78,211,218, -182,217,102, 27,206, 57,231, 28, 86,173, 90,197,217,103,159,221, 18,188,152,117,121,104,147,228, 45, 70, 2,226,226,141,149,194, - 76, 56,155, 77, 87,161, 72, 55,112,204, 33,139,241, 26, 67, 84,253,144, 59, 30,122,140,122,226,146, 13, 66,168, 0,127, 88, 53, -192,154,161, 10,190,142,216,126, 98, 39,135,239,222, 29, 3,184,144, 73, 81,248,228,153,116,172,136,217,118, 9,161,108,208, 46, - 26, 39, 3, 47,241,238, 99, 90, 4, 12,250, 30, 21,219,230, 43, 63,184,150,149,131,208, 15, 12, 72, 88, 29, 65,159,132, 7, 94, -133, 11, 46,253, 47, 26, 88,212,134, 7,216,182, 36,249,224,113,219, 19, 5,201,134, 49,128, 21, 69,224, 55,226, 98, 56,145,226, -254, 21, 79,242,237,255,124,136,117, 64, 31, 37,106,118, 55,235,177, 89, 11,172,145,112,229, 77,191,161,234, 69, 72,191,193,164, - 66,200,254,187,216,116, 91, 49,107,246,149,228,191,238,122,136,139,174,251, 13, 43, 55,199,207, 93, 5,134,237,110,154,178,155, -181, 94,129,205,192, 90,224,134, 71, 61,190,121,197,141,244,123, 80,200,219,204,153, 57,153,109,187,226,117, 36,212,238,155, 71, -191,143, 90,111,222,124,188,156,182,104,106,250,243,163,107,170, 12, 54, 70,212,198, 64, 8, 60, 33, 8,132, 78,107,138,140,183, -241, 54,154, 72,182,196, 91,168,145,210, 76, 72, 80,177, 37, 30,212, 61,242,150, 69,160, 20,142,173,241, 67,141,106, 4, 20, 53, -204, 0, 62,112,228,108, 78, 57,250,109, 76,206,133, 16, 56, 12,245,109,162,163, 84,196, 42,119,224,133,138,193,166, 36, 40, 79, -166,119,187, 69,208, 49, 11,244, 4,124, 95,114,245, 85,183,241,196,170,213,120,197, 78, 10, 26,214, 15, 14,160, 53,116,118,118, - 83,202, 23,232, 46,118,226,228, 92, 30,124,122, 21,143,188,208,199, 65,115, 39, 64, 80,167,115,226, 68, 54, 62,255, 18,211,123, -138, 56, 42, 68,133,117,182,223,102, 26, 11,118,153,195,147,171, 95, 28, 25,236,105,100,143,106,153, 0,178,205,186,253,183,127, -251,183, 22, 6,149, 45,199,105, 10,158,116,116,116,112,245,213, 87,115,197, 21, 87,240,192, 3, 15,164,210,237,214,128,198,190, -251,238,219, 34,223,254,235,191,254, 43,253,253,253, 41,168,230,114,185,116, 65, 55, 69,111,150, 47, 95,206, 85, 87, 93,197, 25, -103,156,129,235,186,156,116,210, 73, 92,113,197, 21, 41, 91, 55,199,153, 0,187, 83, 79, 61, 53,205,181, 54,146,112,182,200,203, -173,183,222,202,171,175,190,202,252,249,243, 9,130,128, 37, 75,150,112,227,141, 55,226, 56, 14,239,126,247,187,217,118,219,109, -211,103,255,210,151,190,148, 6,172, 25,255,119,214,191,124,255,253,247,115,195, 13, 55,240,206,119,190,147, 66,161,144,246,149, - 97,146,115,231,206,229,184,227,142, 75, 13,150,207,125,238,115,105, 97, 28,211,167,102,243, 23,227,251, 95,190,124, 57, 63,251, -217,207, 56,235,172,179, 24, 30, 30,102,233,210,165, 92,116,209, 69, 88,150, 69, 46,151,107,201,209,191,232,162,139, 88,179,102, - 77, 11,160,103,107,106,255, 41,160,110, 2,216,178,145,252, 81, 20,165,105,142, 75,150, 44,225,203, 95,254, 50,141, 70, 3,223, -247,121,237,181,215,248,201, 79,126,210,146,145,176,181,108,189, 92, 46,167,110,131,135, 31,126,152,167,158,122,138, 39,159,124, - 50, 45, 60,115,232,161,135,178,199, 30,123, 48,105,210,164,180,111, 46,188,240, 66,118,218,105, 39, 78, 63,253,244, 84, 73, 48, -197,132,114,249,124, 92,251, 93,203,180,190,250,136,241,106, 96, 30,106,141, 26,243,138,176,221,148, 14, 68,189,137, 91,234,229, - 55,143,254, 10, 63, 81,213,163, 48, 66,184,130, 53, 21,205,239,158,126,142,195,118,157, 13,141, 33,142,218,119, 1,191,122,226, -126, 10, 66, 83, 83,128, 30,217, 62, 38,206,139, 79, 42,172,105,139, 72,151, 98,160, 7,124, 75,226,217,177,175,185,105,229,184, -242,167, 55,241,154, 23, 71,146,171,100, 87, 86, 45,109,154, 82,176,206, 15,248,221, 58,184,241,254, 71,121,239,210,189,169,215, -134, 57,242,109,251,115,241,245,175,208,151,172, 77,121, 39,143, 66, 19, 72, 7,191, 56,137,203,111,190,149,213, 17, 84,132,136, - 61,218,150,139, 14, 45,234, 40,250,148,226,191,159,245,121,125,211, 0, 19,166,231,152,232, 70,116, 4, 33,249, 8,138,118, 64, - 35, 84, 72,203,193,139, 34, 66, 20,205,228, 89,136, 66,144, 57, 4, 22,146, 46,116,206,102,163,215,199, 93, 47,195, 59,214, 87, - 89,178,125, 55,229, 82,142,221,247,216,150,103, 31,120,157,170,175, 16, 78, 9, 29, 84,226,117,115, 20,136,103, 10,195,108,229, -112,220,109,106,137,211,247, 30, 1,245, 31,254,110,237, 22,143, 13,133,122,203,111,235, 60,222,254,151,152,122, 90,123, 33,203, -100, 51, 3, 81, 39,192, 21, 69, 65,108,247,135,154,169,249,120,163,133,157, 74,112,209, 89,135,242,129,131, 23, 48, 81, 13, 83, - 93,255, 10, 97,109,152, 82,177, 8, 72, 42,213, 58, 74,228, 8,172, 60,190,211, 77,121,230, 78, 64,137,208,178, 89, 63, 12, 55, -222,249, 27,172, 66, 23, 50, 95,166,161, 65, 89, 54,218,205, 51, 52, 60,204,218, 53,235,120,105,221, 70, 42,161, 70,148,186,184, -253,190, 7,227,188, 89, 41,113,167, 78,161,238,213,193,142,200,217, 26, 17,214,209, 97,131, 93,119,153,151, 0, 71,242, 79,155, - 41, 43,245,232,186,241, 74,209,178, 56,103, 25,112,118,219, 81,227,255, 93,188,120, 49,147, 39, 79,110,137,104,127, 51,127,234, - 1, 7, 28,144,202,238,149, 74,133,239,126,247,187,105,106,148, 97,131,198,143,109,138,148, 72, 41,185,254,250,235, 83, 38,183, -100,201, 18,138,197, 98, 75, 52,186, 1,201, 21, 43, 86,240,250,235,175,167, 57,236, 89,223,123,118,226,255,225, 15,127, 72,203, -174,238,188,243,206, 41,227,223,119,223,125, 83,137, 56,138, 34,126,242,147,159,164,231, 50,215,111, 87, 37,174,184,226, 10, 10, -133, 66,139,159,218, 48,215,163,142, 58,170,133,157, 94,118,217,101,163,238,217, 40, 6,217,173,112,141,114,209,217,217,201,225, -135, 31,158,166,223, 25, 3,192,182,109, 94,120,225, 5, 46,185,228,146,244,254,218,251,250, 79, 93,232,178, 37,107,133, 16, 45, -125,182,203, 46,187,112,253,245,215, 19, 69, 81,250,172, 70, 49,217, 26,233,221, 60,171, 25, 95,107,214,172,225,204, 51,207,100, -198,140, 25,236,187,239,190,252,211, 63,253, 19,223,255,254,247,249,230, 55,191,201,133, 23, 94,200, 17, 71, 28,193,212,169, 83, - 57,255,252,243,121,233,165,151, 82, 21,228,195, 31,254, 48,167,156,114, 10, 74, 41, 74,165, 82,106,100,121,205,102,226,191, 29, -113,153,169, 54,255,171,235,196,108,247,253, 39,238,141, 21,212,208,150,228,209, 23,158,231,233,213,117, 4, 35, 85,211, 68,194, -190,111,184,251, 97,236,174, 46,162,102,133, 37,187,239,196,172, 14,144,145,142,209,216,211,105, 90,155, 0,252, 48,113,215,105, -139,184, 42,123,124,142, 80, 88,168,164, 84,107, 67, 43,126,245,251,205,148,186, 93, 34,105,199,113, 93,137,129, 64, 4,161,109, -209, 0,238,248,253,139, 12, 69, 14,210,202, 65, 20,178,100,143,237,226,113, 7,132, 74, 33,236, 2,161, 83,102,229,107,125, 60, -189, 57,182, 37,132,180,177, 69, 8,222, 64,172, 14, 56, 69,170, 42, 71, 13,120,230,149, 53, 8,233, 16, 5, 62,199, 31,187,127, -188,156,133, 33, 54, 10,162,128,188,109, 97, 19,167,194,118,218,144,211, 85,122,116, 31, 83,168,210,195, 16,121,175,159, 92,242, -156,143, 62,246, 48,205,198, 16,131,125,235,217,102,106, 79,178,195,157,194, 21,214, 86,176,116,149,137, 46, 84,109,255, 61,178, - 64, 21, 28,201, 79,223,179, 83,234, 67,127, 98,109,149,171, 87,172,127, 83,194, 48,222,198,219, 40,162,226, 91, 54,104,133, 72, - 54, 48,176, 18, 64,143, 72,114,214, 45, 27,108,129,239,135,148,128,178,134, 92, 19, 22, 78,128,175,159,253, 14,166,187, 67,116, - 58,155,169,213, 61, 44,221,164,163,220, 21,111,195,234,251,116, 20,138, 4,104,186,187,187,121,197, 15,160,187, 7,138,157,108, - 4,158, 30,172,227,151,203, 4, 50, 9,211,245, 67,172, 66, 30,183,144,167, 17, 42, 8, 26, 52,241,120,233,181, 97,230,245, 22, -240, 67,149, 84,146, 82, 80,204,211,213, 81,164, 81, 25,164, 80,204,145,147, 22, 3,149, 65,230,239, 52, 15,139, 95,197, 5, 31, -218,230,155, 76,144, 92,106,146, 93,229,146, 66,177, 18,254,229,130, 11,210, 2, 36,166,152,137,235,186, 52, 26, 13,118,216, 97, - 7,142, 57,230,152, 52, 21,235,235, 95,255, 58, 39,159,124, 50,111,127,251,219,233,235,235,219,170, 13, 91,142, 63,254,248, 52, -160,237,182,219,110, 75,101,217,108,213, 48,179, 9, 76,182,116,236,227,143, 63,158,166, 53,117,119,119, 51,111,222, 60,254,248, -199, 63,182,148, 11,181, 44,139,219,110,187,141, 9, 19, 38,164, 41,119, 38,183, 62, 11, 90,174,235,242,228,147, 79,166,192,107, -228,102, 41, 37, 59,236,176, 67,202, 80, 77,164,125,163,209, 72, 89,126,118,227, 18,115,221, 71, 30,121,164, 37,112, 44, 27, 13, -126,236,177,199, 82,175,215, 41, 22,139,105,148,250,208,208,208,168, 13, 73, 12, 59, 54,146,244,175,127,253,235, 20, 48,243,249, - 60,187,238,186, 43,143, 61,246, 88,202,110, 1, 30,121,228, 17,108,219,110,121, 95, 91, 2,242,173,217, 73,205, 40, 37, 89, 48, -119, 28,135, 82,169,196, 79,127,250, 83,166, 77,155,150,246,225,231, 63,255,249,244,250, 91,187, 89,143, 41,202, 19, 69, 17,143, - 61,246, 24, 47,190,248, 98,234, 31, 31, 24, 24,136, 23,244, 66, 1,207,243,210,235, 95,112,193, 5,220,120,227,141,172, 88,177, - 34,237,171,175,127,253,235, 44, 91,182,172, 69, 81,176, 44,135,102, 51,174,174, 62, 42, 8, 58,138, 11, 71,137, 40, 96,162, 5, - 7,238, 57,143,176,222, 71,113,226, 4,238,122,240,161,248,186, 86,108,212, 10, 29,107,234, 57, 96,229,107,176,122, 96,136,201, - 82, 97, 69, 85, 14, 93, 50,151,231,239,124, 1, 47,210,248,140, 84,156, 84,128,176, 21, 82,135, 40,105, 17,201,145,194, 85, 90, -200,212,169,247,252,139, 47, 99, 1,155, 6,125,164,101, 97, 37,184, 22, 69, 65, 26,193, 35,129, 39,214,130,239,246,226,245,247, -211, 53,113, 34,147, 39,245, 98,241, 42, 26, 8,162, 16,223,118, 9,117,129, 59,150, 47, 39,178,193,247,193, 21, 1,182, 54, 37, -178, 2,132,112, 81, 50, 71, 36, 60,214, 14, 54, 25, 86, 57,164,138,216, 80, 9,104, 0, 13,108,138, 34,222,148, 74,135, 1, 5, -192,141, 96,135, 73,208,219, 99, 49,123, 98, 15, 51, 45,240,106,117, 26,197, 78, 2, 25, 33, 85,133, 5, 83,109,102,116, 40,134, -154,138, 25, 19, 59,232,182,193, 11, 67,194,160, 49,106,203,105, 49,230, 24,139,223,144,214,180,250,192,245, 8,241,184,226,228, -121, 44,152, 22,187,124, 26, 65,196,123,127,254, 12,106,107,236,211,241, 50,177,227,173, 29,212, 17, 86,146,131, 58, 82,255,157, -148,185, 43,180,142,208, 65, 68, 57, 15,178, 17,167,171,189,251,128, 14, 62,114,220,161, 76,205,123,132, 3,107,241,109,192,238, - 64,184, 5, 26, 86, 1,191, 94,163,128,133, 37, 5,142,212,248,170,129,136,146,205, 26, 8,200,147,163,187, 35,135, 35, 53, 4, -138,124,161, 64,221,175, 19, 85, 26, 52,130, 68,163, 43,119,146, 67, 99,215, 21,175,188,188,154,206,189, 98, 22,142, 23,130, 16, -248, 94,131, 80,214,193, 5, 81, 42, 66, 51,100,234,180,201,113,105,105, 67, 7,132,213, 18, 78, 42,180, 73,197, 25,153, 88,129, -239,115,225,133, 23,182, 4, 74,101,129,214, 0,195,153,103,158,201,249,231,159, 79, 87, 87, 23,139, 22, 45,226,150, 91,110, 97, -159,125,246,217,170, 78,222,107,175,189,168, 84, 42,116,118,118,178,235,174,187,114,251,237,183,167,209,226,134, 29,230,243,121, -250,251,251, 41, 20, 10, 20, 10, 5,154,205, 38,245,122, 61,245,179, 3, 76,154, 52,169, 5,164, 13, 64, 14, 13, 13,209,215,215, -151,222,191, 1, 96,195,160, 13,104,101,217,180, 1, 96,173, 53, 71, 31,125,116, 10,142,203,151, 47,111,145,166,195, 48, 76,207, -103,130,189, 60,207,163, 90,173,178,114,229, 74, 22, 45, 90,212,242, 44, 90,107,230,207,159,159, 86,144,219, 97,135, 29,184,246, -218,107,211, 2, 53,213,106,149,142,142,142,150, 77, 96, 76, 77,251,206,206,206,150,200,254,114,185, 76, 20, 69,169, 1,100,138, -243,100,171,180,109, 9,188,183,150,197, 24,159,122,246,157,187,174,203,125,247,221,199,130, 5, 11,210,202,113,159,248,196, 39, -184,236,178,203,210,251, 53,234,194,214,180,108,160, 95,165, 82, 25,117,127, 99, 25, 40,207, 62,251, 44, 95,248,194, 23,248,198, - 55,190,129,239,251,236,176,195, 14,156,120,226,137,220,112,195, 13,169,145, 21, 4, 81,194,181,229, 72, 13, 41, 83, 44, 70, 71, - 56,196,245, 34, 14, 94,188, 45,157,110, 64,201, 17, 84,253, 38,203, 31,247,176,129,122,148,200,219,201, 71,243,196, 65, 99,191, -186,251, 62, 62,245,246,131, 9, 2,143, 3,247,217,153,159,221,249, 2, 77,192, 69, 98, 75,133, 86, 73, 25,247, 28, 32, 27,140, -212,163,204,244,171,142,183, 87,121,246,217, 87,113,147,114,239,145,178,176,146, 82,179, 89,239,178,121,147, 79, 63,191,138,195, -118,157,200,107,175,191,206,206, 59,206,196,186,235, 49, 34,160, 88,178,241,253, 6,190,204,209,196,166, 25,142,168,138,153,192, -124, 2,223, 7, 89,192,139,146, 96, 73,160, 88,238, 68, 89,195,148,138, 54, 3,117, 65,217,142, 37,137, 30,224,232, 3,166,243, -158,183, 31,206,180,201, 61,132, 73, 29,251, 9, 94, 3, 75, 43, 26,133, 14,148,235,146,183, 34,104,244,209,236,239,167,212, 53, - 25, 21, 70, 24, 55,119,164,189,173, 27, 99,109,223, 71,234,231,199,161,236,255,118,212, 44,222,179,199,228,116, 62,126,236,250, -231,147, 52,182,241, 54,222,254, 39,160,158,230,166,199, 59, 42,249,109, 3,207,181, 45,180, 31, 33, 27,176, 93, 9,190,112,250, -161, 44,153,221, 75,175,234, 35, 28,218, 76,103,105, 2, 67,195, 77, 84, 97, 42,170,216,193, 55,127,116, 45,219,109, 91,226,136, -197,187, 48,179,199, 69,134, 13,116, 99, 51,189, 57, 9,125, 47,195,196,237,233, 45,230, 89, 50,221,102,209,244, 73,220,253,204, - 16,118,222,161, 40, 11, 68,146,184,166,113,164,144, 10,188, 70, 3, 29, 68,168, 70,196,164,222, 41,241,228, 13, 53, 84, 27, 84, -135,134,153, 56, 41,151,164,119, 68, 56, 82,208,172,180,213,226,150,130, 22,115,215, 20,212,201,152,182,166, 2,155, 1, 65, 3, - 52, 89,208, 19, 66,112,245,213, 87,211,104, 52,184,244,210, 75,241,125,159,189,247,222,155, 79,124,226, 19, 92,114,201, 37,111, -234,179, 53,101, 78, 77, 69,181,153, 51,103,166,185,223, 0,131,131,131,116,119,119,167,215, 51,117,206,219,101, 98,243, 55,195, - 20,179, 27,208,152,133, 62, 43, 35, 27,247,128,169,244,102,234,154,123,158, 71, 62,159,111, 41,158, 98, 2,240, 54,109,218,148, -250,128,179,155,208,152, 10,120, 89,128,202,186, 45,178,236,213, 84, 74,107, 52, 26,204,157, 59,151,185,115,231,182, 68,238, 87, -171, 85,202,229,114,154, 99,158,205, 51, 55,138,129, 49, 70,140,187, 65, 74, 73, 62,159,199,182,227, 93,197, 76,181,186, 55, 98, -224, 91,211,180,214,233,230, 48,190,239, 51,117,234, 84,110,189,245, 86,118,219,109,183, 84,238,254,244,167, 63,205,143,127,252, -227, 22,255,120,182, 62,253, 27, 53, 83,255, 32, 91, 62,215, 24,100,166,236,111,163,209,104,201, 65, 23, 66,208,108, 54,185,236, -178,203, 56,255,252,243,201,231,243,212,106, 53,230,205,155,151,110,243, 27,187, 45, 92, 66,207, 4,184,218, 32, 99,180, 19, 10, - 28, 20, 57,226,220,244,131, 23,239,142, 27,213,137,130, 26, 15, 60,253, 20,235,227,100, 22, 74,201,124,207, 39,219,177,154, 90, -231,127,120,114, 61,125, 7, 13,210, 89,176,153, 57,173,155,125,231,231,184,231, 41,143, 8, 73,168, 70, 98,174, 35,209, 68,200, - 8,139, 16, 75, 52, 82,176,182,148,196, 82,113, 8,110,181, 18, 82,137,160, 80,156,140, 87,247, 9,164, 64, 43, 15,153,179, 80, - 65, 4, 74, 82,116, 52, 58,208,104,175, 70, 56, 28,209,237,120, 20,236, 56,185, 54, 2,164,244,177,116,128,163, 34,186,203, 5, - 20, 80,112, 28,106, 65,128, 7,184,133, 60, 97,195, 79, 44,246,184,126,188, 27,213, 41,138,128,102,101, 0,199,150, 12,215, 67, - 74,110, 17,225, 7,236,214, 13,255,113,238,251,153,217,155,167, 57, 52, 68,109, 83, 13,191,179, 27,237,148, 24,208, 14,142,101, - 83, 81, 2,191,238, 83,140,106,116, 42,176,195, 28, 90,150, 17,185,174,180,124,174,176,200,238, 72, 51,182,251, 37,171,218,180, -179,121, 33, 56,251,192,109, 57,231,144,153,233, 49,103,255,234, 37,174,121,108,227,214,175,224,227, 44,125,188,141, 2,117, 21, -164,190, 30, 45, 77, 85,184,152,213, 58, 64,222,247,201, 1,123,207,112,249,236,105, 39,176,125, 71,136, 93, 93, 67, 62,215,196, - 46, 58, 12,213,129,201,115,120,181, 98,113,225,119,174,101,213, 26,120,199,212, 34, 61,211,103, 49, 52,240, 10, 61, 57,143,142, -188,133,114,124,130,190, 87,113,156, 38,106,104, 29,221,221, 51,248,216, 73,199,179,226,171, 87, 16,214, 6,137,146,197, 53,148, - 18,229, 9,114, 14,104,165,137,134,135, 56, 96,143, 93, 56,230,160,157,112, 34,160,104,195,170,117,216, 82, 17, 5, 30,216, 69, -104,214, 81,178,200,250,245, 27,137,162,216,143,216,136,228,232, 1,223,134,239, 50, 1, 75,195,112, 77,240,153, 9, 68, 51, 12, - 80, 74,201,224,224, 32,151, 93,118, 25, 63,248,193, 15,210,122,233, 39,157,116,210,155,130,122, 24,134,105, 80,149,227, 56,188, -252,242,203,188,252,242,203,228,243,121, 26,141, 6,182,109, 99, 89, 86,202,214,204,130,111,192,216,176, 99, 41, 37,175,189,246, - 90, 10, 20,245,122, 61,101,234, 38,135,121,172,188,105, 3,246,237, 91,191, 26,105,221, 20,212, 49,236,216,244,195, 8, 27,140, - 83,248, 42,149, 74,234,227, 53,247, 48, 48, 48,208,178,163, 92,182, 98,154,137,154, 95,181,106, 85,154, 22, 23,134, 33,165, 82, -137, 40,138,232,239,239,103,202,148, 41, 0,244,245,245,209,211,211,131,239,251,233,245,108,219,102,211,166, 77, 45, 69,129,178, - 64,221,254, 76, 89,246,251,167,248,213, 77,223,155,118,235,173,183,178,104,209,162,244,125, 93,124,241,197, 92,122,233,165, 45, - 69,132,140,113,178, 53, 91,175,182,187, 7,204,150,188,230,221, 25, 55, 71,182,252,171,137,114, 31, 24, 24,224,233,167,159,102, -225,194,133,148, 74, 37,142, 56,226, 8, 46,188,240,194, 22,117, 67, 96,197,195, 90,170, 22, 4, 49,187,155,206,233,134,249,211, -123,232,148,125,136,188,197,236,153,211,249,234, 63,110, 67,195,235, 66, 91,157, 40, 75, 83,173, 12, 48,177,152, 71, 71, 30, 56, -146,124, 56,192,132,188,133,163, 61, 74,193, 16,251,207,159,197,253, 79, 61, 75, 64,152, 74,240, 14, 16,250, 53, 34,153,238,127, -134,101,252,237,218, 66,232,248,190, 92, 39, 46, 54, 52, 84,175,131,200,161,173, 28,232, 40,179, 47,131,164, 30,132,116, 17, 7, -100,250,190,100,194,228, 73,244, 63,247,122, 60,150,128,161,190,205,148,102,110, 75, 19,139,245,107, 95,167,224, 66,197, 15, 8, -113,208, 2,226,215, 96, 37, 17,191, 30, 69, 25, 27,142,150,176,200, 17,146, 19, 58,150,241,253, 58, 51,243,112,209,151, 62, 74, -183,232,163, 49, 48,140,167, 75,252,242,238,223,242,248,250, 77,188,182,161,201,198,245,241,218,208, 32,142, 69,232, 4,222,187, -127,142, 51, 79, 57,129,205, 3,195, 68, 65,132, 35,160,170, 65, 40,209, 6,215, 99,188,255, 55, 24, 27, 31,219,119, 26,223, 60, -118,135,244,247,127,189,231, 85,190,243,192,235,127,210, 2,190, 53, 46,166,241,246,119, 6,234, 78,178,207,176, 22,196, 69, 18, -132, 13, 97,132, 36,164, 64, 44, 83,189,103,201,100,254,223, 59, 15,163, 16,110,198,169,247, 49,177,219, 1,223, 99, 40,176,169, - 79,154,203,163,235, 3,254,237,210,101,188,176, 33,158,222,175, 15, 65,163, 97,211,161,226, 90,201, 66, 53,137, 68,157, 87, 54, -173, 98,110,117, 19,178,119, 42, 97,168, 56,124,241,182,124,229, 83,239,227,242, 95,220,198,115,171, 55,147,155, 60,131, 32, 16, -216, 74,227,134, 17,205,254, 77,236,191,211, 12,254,227,139,239,103,122, 1,100,208, 15,225, 38,214,190,242, 36, 22, 77,114,110, -137, 56,102,223,198,113,114,172, 93,187, 62,142,230, 13,146,103, 81,113, 45,197,100, 95, 35,164, 41,117,169, 69, 10,236,134,237, -102, 1,208, 4,171, 25,144,207,238, 5,126,239,189,247,114,248,225,135,227,186, 46, 7, 29,116,208, 86,119,180,137,150,191,242, -202, 43,249,214,183,190,213,178,177,135, 1,137,177, 2,239,198,218,222,211,200,232, 70, 74, 55,134,199, 88,133, 80, 76,234,149, -217,171, 61, 11,186, 89,127,118, 22,132,204,231,204,177, 89,240, 50,199, 71, 81, 68, 71, 71, 71, 11,195,206,250,153,205, 53, 46, -189,244, 82,190,253,237,111,183,196, 1,100,243,218,179,106, 65,214, 40,105,175,160,102,228,253,172,236,222, 30,125,190,165,197, -109,172,189,234,179,187,184, 25,214,127,201, 37,151,176,104,209,162,244, 51,151, 94,122, 41,103,156,113, 70,203,189,109,169,242, - 91,118,188,100,119,212, 51,129,132,102, 1,206, 86,137,203, 22,148, 49,199,183,215, 72,232,239,239, 79, 85,154,108,182, 69, 60, - 46,117,188,147,154,173, 99, 80, 79, 84,112, 39,137, 29,177,129, 67, 23,108,195,196,160,138, 21,212,193, 9,217, 97, 82, 7,219, - 76,233, 64, 70, 29, 16, 72, 92, 41,169, 85, 67,122, 38,228, 65,118, 50, 52,228,211,233,148, 41, 70,253,224, 85,153, 94,146, 28, -184,243,246, 92, 34,158,101, 80, 67, 93, 64, 78, 66, 46, 2, 11, 65,211,202,161, 68, 30, 45, 70,152,190,214,110,204, 16,100,132, -175,147,128, 66,171,158, 40,101, 26, 81, 44, 32,234, 21,108, 61,226,135,111, 0,158,204,225, 57, 93, 12, 4, 57,194, 66,103,204, -194,129,174,124, 7,126, 0,190, 16,244,116,245,226,249,155,227,109, 77,140,101,174, 35,108, 36, 22, 17, 17, 97,188,171,107,110, - 18, 1, 93,216,106, 51, 46,126,156,143,111,193,145, 11,103, 48,213, 86,104,145,227,245, 90,200, 63, 93,116, 45, 15,175,215, 24, -141,175, 35, 81, 55,250, 19,131,194, 7, 54,135, 46,161, 20,116,149,243,200, 96, 29,185,132,240, 68, 34, 79,164,107, 45,192,173, -199,208,221,157,164,232, 16, 90, 35, 45, 11,148,230,189,123, 76,226,226, 19,231,166,135,126,239,193, 53,156,119,231, 43,227,136, - 52,222,254,236, 38,109, 61, 18, 28, 23, 75,241, 54, 72,129, 13,148,129,147,151, 76,225, 31, 78, 89, 74,174,178,154, 9, 86,157, -137, 19, 58,169, 84,235,244, 7, 46,181,210,116,174,123,224,143,252,243,119,254,139,149, 27,226,148,149, 72,192, 75,235,250,233, -171,132, 20, 58,167,128,175,192,181, 41, 22, 4,118, 52,196,115,203,239,132,168, 31, 91,212,177, 61, 56,245,152, 57,124,247,252, -127,224, 19,239, 58,136,153,197, 97, 38,203,205, 76,162,143, 61,103,148,249,218, 89,167,113,245,119, 79, 99,102, 25,138,193, 32, -200, 77,168,167, 31,164,186,254,121, 38,149, 45, 26,213, 65,194,122, 3,217,217, 75, 35,136, 88,241,232, 74,194,100, 46, 9,105, -183,204, 48, 45, 70,172,102,149,113,183, 54, 26,141, 20,156,140,172,105, 64,208, 44,208,102, 55, 46, 83,134,212, 48,173,108,157, -248, 55,178,164, 31,126,248,225,116,211,149,227,142, 59, 46,101,195,165, 82,105, 84, 25,210,108,238,179,137,254, 54, 32,147,221, - 5,237, 47,101,157,123,158,199,115,207, 61,151, 94,231,248,227,143, 7,160,183,183,183, 5,176, 13,208, 56,142,147,150, 98, 93, -188,120,113,202,234,179, 37,118, 31,124,240,193,244,158,151, 44, 89,146,126,222,196, 6,100,141, 8, 83,227,221,188, 11, 83,147, -126,107,251,119,107, 90,214,128, 49,101,106,205,185, 77, 52,249, 85, 87, 93,197,105,167,157,150,246,235,133, 23, 94,200,103, 63, -251,217, 52,250,223, 24, 27, 70, 77,201,231,243, 45,229,100,179,227, 37, 11,252, 38, 72,206,168, 25,166, 66,158, 25,111,198,189, - 96, 20, 29,115, 79,230, 30,179,217, 23,166,250,221,228,201,147,211,243, 11, 41,147,250,173, 35,238, 37, 91, 75, 44,226,157,200, -222,113,200,219,152,212, 93, 70,219, 57,148,221, 65, 83, 22,168, 71,177, 74,227,196, 85,158,113, 10, 46, 85,191,193,112,208, 68, -230,139,212, 35,135, 74, 93, 64,105, 34, 4, 33, 83, 59, 75,236,191,247, 54, 56,153,121,228, 0, 5,237, 34,148,139, 80, 54,182, - 34,101,234,198, 7, 32, 8, 89,180, 71,188, 7,129, 21, 41,242, 93, 5,112, 93,116, 35, 68,234, 24,176, 93,108,114,196,177, 58, -251, 45, 90, 64, 87, 71,137,117, 27, 55,241,250,134,254,140,151,222, 38,194, 65, 37,241, 3,163,130,100,180,196, 70,225, 50,178, -101,106, 40, 28, 2,145,163,163, 88, 98,120,176, 15, 75,196, 6,207, 49,111,219, 27,215,175, 98, 75,193,178, 91,239,224,177,245, -154, 33,108,194, 92,158, 64, 57,227, 63, 0, 0, 32, 0, 73, 68, 65, 84,208,178,227, 13, 92, 0,223,202,227,137, 56,198, 96,219, - 89,179,241,188, 38, 94,163,138,107,137, 52,130, 32, 24, 67, 98, 31,229, 72, 55,190,126,157,108,113, 29,106, 78,216,101, 2, 63, -126,215, 78,233,123,189,234,145,245,156,121,243,139,255,227,241, 61, 30, 5, 63,222, 90,152,122,154,189, 38,236,248, 43, 94,189, -201, 11, 40, 11, 56,233,152,183, 97,251, 67, 76,232, 42,224, 56,146,161, 64,177, 81, 76,161, 52,125,123, 46,191,254,110,254,243, -206, 87,216,224,143, 4,187,248, 26, 94, 95, 31, 49,136,195,218,186,207,244, 98, 15,146, 10, 5,229,211,173,134, 88,187,122, 37, -205,199,239, 34, 63,251, 0,114,157, 51,129, 50,179,167,249,252,203,199, 15, 67,127,252, 48,214,246, 13,226, 22, 59,233, 40,196, -158,239, 66,164, 41, 91, 21, 80,235,224,153,251, 89,253,135, 95,211, 19,245, 83,202,119,227, 87, 35,236, 98, 23,253, 3, 53,124, -119, 50, 43, 30,127, 53, 94,188, 1, 29,134, 73,121, 70, 29, 7,164,232,196,197,158,153,134, 58, 97, 96,149, 74, 5, 33, 68, 90, - 15,220, 44,198,134,161,154, 96,169, 90,173,198,148, 41, 83, 82, 64,216,154,232,103,173, 53, 79, 61,245, 20,251,236,179, 15,149, - 74,229,255,103,239, 93,131,109,203,170, 50,193,111,140,185,246,222,231,156,123,111,230,189,153,121, 19, 80, 76, 4, 65,208, 20, - 50,161,178,144, 66, 48,149,135,160, 69,116,182, 85, 17, 21,109, 73,135, 73,180, 68,160,118,168, 88,218, 42, 24,104,208, 18,225, - 11,121, 4, 82, 88, 88,180,173, 72,118,241, 80, 40, 1, 5, 73, 72,168, 34,121, 36, 47,121, 35, 5,130, 36,228,139,204,251, 58, -175,189,247,154,115,244,143, 57,199,124,173,185,246, 62,231,102,218,213, 70,221, 77, 92, 86,158,253, 92,107,174, 57,231, 24,227, - 27,223,248, 6,158,240,132, 39,224,216,177, 99,216,222,222,142, 76,102,205,187,107, 20,167, 70, 97,127,127, 31,179,217, 44,194, -210,121,148, 86,171,144,157,239, 99, 58,157,226, 51,159,249, 12, 30,245,168, 71, 1, 0, 30,241,136, 71,196, 8,177, 54,138,121, -121,214,149, 87, 94, 25, 69, 97,116, 44, 52, 90,253,194, 23,190,128,199, 63,254,241, 88, 46,151,248,209, 31,253,209, 40, 1,187, -183,183, 87,136,212,104,234, 33, 71, 25,242, 46,101, 7,109,154,179,210,107,205,106,187,207,157, 59, 55,200,195,239,236,236,224, -213,175,126, 53,174,191,254,250,248,220, 75, 95,250, 82,252,230,111,254,102,129, 26,232,124,168,187,168,229,232,132, 62,159, 67, -162,154,255, 87,165,194, 35, 71,142, 20,154,241,185, 51,164,156,136,157,157,157,200,139,184,246,218,107, 99,186, 69,171, 33,238, -188,243,206, 48,142,132, 9, 77,177,112,228,245,196,201, 67,110, 4,139, 77, 0,255,236, 59, 46,194,241, 99, 51,156,222,219,195, -190,108,226,143,110,120, 11, 62,119, 10,232, 25,232,118,125,229,199,142, 35,240,102, 7, 43, 75,244, 22,216,156, 93, 4,217, 91, -224, 1, 83,139,167,125,239,149,248,193, 71, 61, 12,147,233, 17, 60,229, 95,124, 31,222,250,225,215, 99, 59,160,252, 27, 0,186, -253, 14,199,230, 4,199, 14, 91, 65, 44, 38,232,247,129,177, 4,203, 28, 15,126,192,113, 28, 3,176, 11, 96,251,238,187, 66,168, -176,129,141,110, 11,203,126, 59,246, 75,188,242, 18,224, 36,157,194, 61, 95,249, 28, 30,244,192,239,196, 98,241, 13, 44,161,223, -105, 96,169,131,165,212, 93,209, 0,176,210, 67, 27,203, 26,207, 42, 40,136,115,150, 8, 61, 8, 93,215, 97, 43,160,116, 15, 56, -177,129,249,185, 59, 48,157, 93,138,187,110, 59, 23, 58, 79,246,176,182, 7,109, 0, 91, 22, 88,236, 3,228,246,177,105,128,205, - 30,120,212,119, 93, 1, 67, 11, 56, 8,102, 71,102,216, 13,200,130,136, 23,249,161, 21, 32,187,233, 58,216,222,183, 75,101,102, - 60,253, 59,143,227,134,127,251, 93,177,116,237, 13,159,188, 11,207,126,211, 23, 46, 88,162, 11,143,251, 46, 82, 79,181,173,148, - 52,139,197, 55, 62,232, 0, 92,118,201, 69,184,251,244, 61,216,119,192, 29,219, 75,252,195,185, 14,124,255, 71,226,151, 94,254, - 38,188,226,173, 95,193,237, 11, 96,122,108,130, 37, 0, 51,243,222,235,221, 22,248,235,255,242, 33,208, 69,151, 97,219, 78,177, -232, 25,176,132,205,126, 31, 15,190,216,224,142,191,125, 47,206,125,228,237,192,233,207, 99, 38,223,192,183, 78,183,113, 12,119, -224, 34,220,133,111,157,220,131, 7,118,119,227, 36,182,113, 57,238,193, 49,250, 58,112,230,115,216,251,240, 91,241, 15, 31,121, - 23, 78,204, 22,184,228,232, 4,238,244, 93,152, 94,124, 49, 22, 61,195,205, 46,198, 77, 55,127, 20,183,126,179,232, 73,115,192, -204, 22, 34,123, 91, 13,186,146,181,114,104,124,103,103, 7,143,120,196, 35,240,240,135, 63, 60, 70,152,159,254,244,167, 15,228, - 69,255,213, 95,253, 85, 36,155,205,231,115,252,210, 47,253, 82,220,244,213, 40,104,255,115, 37,202, 49,115, 44,117,210,243,211, -243, 81,245,180,131,228,116,215, 61, 22,139, 5, 62,244,161, 15, 69,232,247,254,247,191, 63,174,187,238,186, 24,141, 3,192,137, - 19, 39, 10,164,226,200,145, 35,184,238,186,235,162, 34, 92,157,239,190,241,198, 27, 35,236,188, 92, 46,241,252,231, 63, 31,139, -197, 2, 93,215, 69,206,128, 66,233,243,249, 28,123,123,123,152, 78,167, 5,153,172,134,155,207,247,225,156,195,230,230,102,212, -122, 87, 7, 74,181,211, 95,249,202, 87,226, 89,207,122, 86, 52,224,127,248,135,127,136,231, 62,247,185,145,239,160,223,161,100, -182,188,223,185, 94,187, 70,239,138,178,228,196, 75,102,198,238,238,110,124,223,206,206, 78,193,240, 87,209,158,154,131, 49,157, - 78,241,236,103, 63, 59,190,182,177,177,129, 91,111,189, 53,222,147,216,122,213,134,194, 48, 59, 5, 92,232,115, 15,193, 81, 0, - 79,250,222,239,193,134, 17, 96,186,137,115, 91,151,225,134, 15, 2,127,243, 5,224, 93,159, 3,222,243, 85,224,166,191, 7,222, -251, 85,193, 77, 95, 92,226,166, 47, 2,239,253, 18,240,246,207,156,197,187,190,188,143,191,252,252, 18,239,248,212,109, 88,110, -120,229,191,239,121,208,253,241,160, 35,136,177, 50, 3,112,189, 68,109,118,159,230, 10,229,110,228,119, 21, 35, 75, 92,186, 57, -193,213, 15, 4,142, 7,115,126,108,131, 1, 44,176,211,251, 58,249,105,112, 64,158,252,207, 46,195,252,155, 95,193,183,156,216, -194,108,218,225,109,239,250, 68,140,136, 45,177, 15,116,193, 17,101,227, 16,168, 39, 49,122, 87, 68,205, 46,188,127,190,236, 65, - 36, 16,231,205,255,197,199, 54,113,226,146,139, 48,223,223,129,237,253,245, 28,219,152,248,237,111, 31,216,223, 15,234,124, 2, -160, 7, 30,243, 29,192, 21,151, 92,132, 13,244,216,156,116, 94,183, 93, 51,120,188,126,126, 50,115,208,230, 39,252,224, 67,142, -227, 77,255,235,149,152,118,254, 59,222,254,249,187,241,227, 7, 45, 93,187,240,184,240, 56,140, 81,143,120, 17,121, 9,216, 16, -172, 99,233,128,175,124,227, 14, 92,122,197, 67,113,183,219,192,252,216,183, 66, 78, 62, 12,207,121,225, 43,240,151, 31, 63,133, - 83,240,240,212,221,231,150,176,147, 41,118,104, 19,187, 4,204, 25,248,139,119,254, 55,220,113,102, 27,219,189,192, 76,143, 1, -188, 9,178, 6, 91,100,113,172,191, 11,253, 87,111,198,206,187,255, 4,248,248,141,192, 61, 95, 3,246,119,128,229, 18,199,142, - 28,195,148,123,224,236, 87,128,197, 87,128,175,127, 16,247,188,247, 6,220,241,185,247,227,136,217,199,209,163, 91,144, 73,135, -125,103,209, 47,123,220,189, 7,204,187,139,241,202,255,235,207,177, 11, 96,223, 1,108, 58, 31,134,136,245, 53,248, 25, 28,166, -245,188, 18, 55, 81, 23,141,169, 18,210,212,192,229,198,253,228,201,147,248,147, 63,249, 19, 48,115,148,139,125,243,155,223,124, - 32,163,254,134, 55,188, 1,119,221,117, 87, 36,229, 61,247,185,207, 45,186,169,229, 70, 91, 13, 90,222, 8, 38,207,235, 43,212, -173,132,178,123,251, 48,198,224, 15,254,224, 15, 10, 35,246,172,103, 61,171,104, 28,163,245,212, 26, 61, 47, 22, 11, 60,239,121, -207,139, 6,166,235,186, 24,165, 79,167, 83,188,238,117,175,139,157,214,136, 8, 63,243, 51, 63,131,107,174,185,166, 48,254,106, -108, 55, 54, 54,162,230,190,222, 3, 29,151,251, 2,141,152, 76, 38, 17,214,215,104, 89,171, 14, 94,254,242,151,227,167,126,234, -167, 96,140,193,230,230, 38, 62,250,209,143,226,215,126,237,215, 10, 3,155, 27, 94,117, 60,116, 28,244,222, 41,194,114,197, 21, - 87,224, 87,126,229, 87,240,188,231, 61, 15,191,252,203,191,140,107,175,189, 22,206, 57, 92,124,241,197,152, 78,167,133,144,143, - 58,100,234,220,108,108,108,196,121,160,176,252,203, 95,254,242,168, 95,112,247,221,119,227,207,254,236,207, 34, 82,162,231, 99, -177,244, 26,226,206,139,185, 24,242,206,248,131, 38,192, 19,174,124, 16, 54,177,196,222,210,226,141,239,254, 48,238, 4,112,118, - 2,156, 97, 47,141,186,111, 60,194,182,107,189, 51,190, 36,192,154, 14,123,152,224,110, 0,239,253,228, 29, 56, 53, 95,130,105, -129,227,221, 41, 60,253,251, 30,228, 73,114,198,175,123, 62,194,216,159, 8,118,102, 14,219, 83,135, 93, 0,115, 0,189,241,197, -239,157,244, 56,209, 9,254,205,211, 30, 27,123,169,219,253,179, 56,122,116, 14,225, 61, 56, 51,135, 65,143,135,108, 2, 63,244, -184, 43,113,242,248, 6,152, 25,239,185,249, 35,184,125,207, 71,195,182, 64,180, 93, 33, 32,133,136,203,217,216, 78,185, 48,179, -228,224,200,129, 57,118,153,199, 61,167,207, 2,166, 3,195,225,234,239,190, 31, 38,128,175,245, 95,250, 15,111, 77,128,139, 54, -189, 3,240,128, 45,224,223,252,203,167, 96,163,183,224,133,133, 89, 58,240,190,239, 70,103,170, 22,171, 18, 49,135,240, 47,108, - 50,174,247, 87,240,248, 7, 29,195,155,127,226,187,177, 49,241,235,252, 61, 95, 58,133,127,253,167,159, 65,127,193,162, 95,120, -220,215, 70, 61,234, 81, 57, 23,196,164,253,166,177,132,207,145,255,250, 75,222,134,215,191,251, 22,252,151,207,223,129,255,240, - 23, 55,225,127,249,153,151,227, 99, 95,245, 98, 14, 61,102, 88, 98, 2,161, 9, 48,221, 0,250,222,171,203,206,128,187, 0,252, -251, 27,222,140,157,201, 37, 88, 76, 79, 96,111, 78,152, 77, 55,177, 60,117, 39, 46, 57, 2,156,232,182,177,188,227, 51, 56,245, -201,247,224,203,111,250, 15,184,253,175,255, 20,123,183,188, 13,219, 31,254,207,216,254,208,159,227,244, 7, 95,143,255,246,167, -191,131, 47,191,245, 63, 98,247,182, 79,227,178, 35,132, 35, 51,198,185,221, 61, 44,164,195,244,232,101,216,199, 38, 54, 78, 94, -129, 87,254,223,111,192,103,191,238, 23,173, 3,176,180,206,231, 26, 67,241, 13,137, 39, 14,101,151, 29, 13,124,215,113,161,136, -150, 43,186, 45,151, 75, 60,252,225, 15,199, 79,254,228, 79,226,131, 31,252, 32,174,190,250,106,236,238,238, 98, 58,157,226,220, -185,115,248,189,223,251,189, 3, 69,138, 0,240, 19, 63,241, 19,177, 21,234,214,214, 22,222,246,182,183,225,201, 79,126,114,209, - 13, 44,135,110,245,115,223,249,157,223,137,231, 63,255,249,248,217,159,253, 89,108,109,109, 69,200,254,216,177, 99, 7, 86, 53, - 91,245,208, 46,100, 47,120,193, 11, 98,142,248,186,235,174,195, 75, 94,242,146, 88, 62,165,121, 94, 34,194,137, 19, 39,240,209, -143,126,180,200,179,171,113,203,161,250, 23,190,240,133,248,230, 55,191, 9,192,235,188,191,235, 93,239,194,147,158,244,164, 24, -177,107,158, 90, 25,246,147,201, 4,199,142, 29,195, 69, 23, 93,132, 95,253,213, 95,197,243,159,255,252, 3,165, 55, 14,146, 79, -215, 6, 45, 57,234,242,154,215,188, 6,207,121,206,115, 48,159,207, 97,173,197,167, 62,245, 41, 60,233, 73, 79,138, 14,140,138, -198,228, 6, 94, 29, 15, 53,190, 26,161,235,235, 15,125,232, 67,241,194, 23,190, 16, 47,122,209,139,240, 27,191,241, 27,120,252, -227, 31, 15, 0, 56,115,230, 12,158,240,132, 39,224, 13,111,120, 3,158,249,204,103, 70, 39, 82,243,237, 74,152,211,241,191,230, -154,107,112,203, 45,183,196,180, 5, 51,227,101, 47,123, 25,238,190,251,238,232,144,236,239,239, 99,177,216,135,133,197,116, 26, -186,173,200, 18, 76, 62,175,252,232,239,154,225, 91, 78,108,193,176, 3,207,182,240,159,223,243, 41,204, 13,208,243, 49, 0, 71, -176,136,198,156,225,192, 88, 4, 62,204,210, 2,224, 13,236, 99, 11,119,246,192, 71, 63,253,121,152,142, 96,150,167,241,244, 39, - 62, 18, 71, 9,232,200,175,160,110,214,193, 18, 65,208, 65,136,179,200, 58, 25,215,126,111,142,199, 93,245, 72,252,212,143, 94, -137,139, 0,220, 31,192,116,187,199,201, 9,112,145, 3,190,125, 11,248,185,159,124, 26,238,119,233,113,204,231, 75,156,182, 19, -188,241,111, 62,135,125, 0,189,105,181, 11,175, 90,206, 58, 7,146, 30, 22,140, 57,216, 43,218,165,228, 6,156, 8,166,155, 71, - 99, 14,252, 93, 31,250, 91,236,200, 4,221,198, 38,158,254,228,107,241,232,203, 59, 92, 10,135,203, 0,156, 20, 96,182,244,122, - 28, 15, 59, 1,252,187,103, 63, 3, 79,253,222,199, 98,185,179, 3, 80,135,197,210,161, 95,166, 86,182, 41,196,230, 70,102, 61, -145, 88,175,126,192, 81,188,245, 89,143,194,209,153,159,247, 31,252,234, 89,252, 79,127,252,105,204,251, 11, 6,253,194,227, 31, - 33,167,206, 81,146,168,135,115, 22,226,177, 52, 44,225, 59, 23,125,126, 23,248,253, 55,126, 30, 54, 44,150,142,125,215,166, 9, - 8,221,230, 12,251,182, 3,250, 5,176,183, 11, 51, 35,216, 37,176,187,239,191,241, 45,159,216,199, 35, 62,252,101, 60,229,170, - 7,226,219,166, 83,108,242, 46, 38,203,185, 95,173,221, 12,199,143, 79,177, 39,167,112,249,116, 10,119,250, 86,204,191,185, 15, - 54, 2,231,124, 68,251,173, 91, 51,184, 77, 3, 50,155,216,223,223,197, 2, 12,230, 13,236, 44,150,152,119, 19,208,214, 73,188, -231, 67,159,193,191,127,237, 7, 49,157, 1, 59,115,132,196, 57, 67, 92,143,131,118, 48, 58,125,250, 52,142, 30, 61,138,157,157, -157, 66,103, 60,135, 69,181, 31,186, 26,179,159,254,233,159,142, 6,118, 45,252, 6,224, 93,239,122, 23,126,225, 23,126, 1,191, -245, 91,191, 5,102,198, 37,151, 92,130,191,249,155,191,193,141, 55,222,136,119,188,227, 29,248,248,199, 63, 30,115,183,155,155, -155,120,236, 99, 31,139,167, 62,245,169,184,234,170,171,176,179,179,131, 23,188,224, 5,216,221,221,141,185,221,188, 12,237,222, - 62,182,183,183,113,195, 13, 55,224,250,235,175,199, 85, 87, 93, 5, 0,184,254,250,235,241,180,167, 61, 13,175,122,213,171,112, -203, 45,183,128,153,241,148,167, 60, 5,207,124,230, 51,241,192, 7, 62, 16,159,250,212,167,224,156,195, 85, 87, 93, 85, 16,192, -250,190,199,137, 19, 39,240,166, 55,189, 9, 87, 92,113, 5,126,255,247,127, 31,206, 57, 28, 59,118, 12, 55,222,120, 35,222,242, -150,183,224, 3, 31,248, 0, 62,255,249,207,199,104,245, 97, 15,123, 24, 46,191,252,114, 60,227, 25,207,192,213, 87, 95, 13, 0, -248,197, 95,252,197,251, 4,126,215, 20,131,242, 36, 0,224,145,143,124, 36,158,245,172,103, 97, 62,159,199,231,206,157, 59,135, - 55,190,241,141, 88, 44, 22,184,248,226,139,177,183,183, 23,175, 75,163,252,173,173, 45,204,102, 51,156, 61,123, 22,175,125,237, -107,241,186,215,189, 46,162, 41, 26, 57, 79, 38,147,168, 9,144, 87, 55,204,102, 51, 60,245,169, 79,197, 15,255,240, 15,227,119, -126,231,119,240,238,119,191, 27, 31,251,216,199,240,217,207,126, 54, 18,233, 30,243,152,199,224,218,107,175,197, 51,158,241, 12, -156, 62,125, 58,246,166,191,229,150, 91,240,162, 23,189, 8,179,217, 12,123,123,123,177, 74, 99,235,232, 38,118,119,247,176,164, - 61,128,124, 46,157, 28,112,241, 12,248,193,107,255, 57,156,221,195, 98,209,227,203,183,127, 3,119,220,227, 57,176,190,229, 26, - 97, 6, 10,117, 33,140, 57, 44,186, 25, 99,177,112, 48,232, 33,110, 15, 18, 50,211,239,184,233,131,248,254, 43, 31,128, 99, 52, -199,183, 95,118, 28,143,127,164,193,123, 63,105, 97, 0,184,197, 18,211,254, 24,156,235, 48,235, 61,185, 86, 35,235,165, 33, 44, -165,195,199,254,246,179,248,182, 71, 60, 6,255,250,135,158,138,239,187,230, 26,252,197,219,223,142,127,184,245, 46, 44,150,192, -119,127,247,165,248,193,239,127, 42,190,253,126,151, 96,185,184, 11,118,114, 63,188,241,198, 15,224,166,175, 0,115, 3, 44,221, - 20, 22, 11, 56,226,224, 60, 36,225,168, 62,236, 90,157,132,210, 84, 24, 88,204, 0, 94,160,115,203, 80,224,226,208,131,112,110, -110,177, 7,128,167,192, 77,159,249, 42,158,240,184,127,142,203,182, 58, 92,212, 89,188,252, 23,255, 45,110,188,249,163,248,200, - 23,255, 14,119,159, 90,226,242, 19,192,149, 87, 62, 28, 15,126,248, 35,241,176,135, 60, 24,183,125,249, 11, 56,243,149,191,199, -183,124,215,119, 96,225, 58,216,206, 37,244, 64, 60, 59, 81, 32,133, 33, 47,218, 89, 11,240,206,103, 63, 10,199, 55,211, 94,242, -165,123,246,240, 91, 63,252,144, 3,205,221,223,123,223,215,240,213, 83,243, 11,150,234,194,227,224, 70,221,128, 33, 65,229, 9, - 34,160,208,112, 97, 65, 64, 31,254,109,247,161,231, 19,123, 72,222, 75, 45, 8, 22,123,187, 0,109, 5, 67,218,131,123,207,215, -233, 54,128,237,125,223,205,233,183, 95,251, 97, 92,126,201, 9, 60,224,202,203,112,231,169, 47,225,242,251, 95, 10,183,115, 6, -203, 9, 99,178, 53, 3,220, 62, 54,205, 2,108,118, 32,178, 7,158,248,218, 24,235, 8, 16,139,165, 24,116,180, 1, 49, 4, 39, - 6,123, 11,135,133,108, 96, 65, 71,113,235,109,187,248,119,191,254, 39,176, 12,156,158,251,133,190,177,121, 20,139,157, 61, 68, -119, 62,195,234, 92, 67, 11,190,183, 14, 71,143, 30, 45, 88,238,170, 42,166,162, 33, 57,100,123,227,141, 55,226, 5, 47,120, 1, -110,190,249,230,162,236,106, 93,164,110,140,193, 75, 94,242, 18,156, 59,119, 14, 47,126,241,139,177,185,185,137,201,100,130,167, - 60,229, 41,120,242,147,159, 28,243,204, 57,251, 93, 35,183, 35, 71,142,196,174, 97,113, 63, 9,209,253, 65, 58,197,173,131,223, -173,181,184,243,206, 59,241,244,167, 63, 29, 31,249,200, 71,112,242,228, 73,108,108,108,224,193, 15,126, 48,126,251,183,127, 59, - 70,188,234,208,156, 58,117, 10,215, 95,127, 61,126,247,119,127, 55,166, 4, 52, 90,101,102,156, 58,117, 10,204, 92, 92,175,170, -200, 93,119,221,117,184,238,186,235, 34,249, 80,157, 39, 53,176,234, 60,105, 69,194,125,241,152, 78,167,176,214, 70,146,156,178, -199,149,232,103,140,137, 81,181,234, 19,228,249,116, 69,109,244,249,221,221, 93,188,255,253,239,143,247,246,232,209,163,216,222, -222,198,222,222, 94, 68, 89,148, 79,160,165,112,251,251,251,177,124,239,242,203, 47,199,143,253,216,143,225,199,127,252,199, 11, -199, 34,119, 64,142, 31, 63, 30,187,251, 61,239,121,207, 3,224, 73,119,121,217,223,238,206, 30, 96, 16, 91,122, 78,125,185, 56, -142, 95, 10, 60,242,209,143,193,233, 83,119, 96,235,200,101,184,233,157,239,192,210, 43, 49,195, 64,112,180,219, 68,223,111,123, -232, 25, 61,122, 48,100,225,213,103,102, 19, 2, 89,193,174,115,152, 3,248,240,151,129,219,247, 13, 46,186,236, 18,108,239,205, -241,189,143,123, 44,110,250,228, 7, 96, 0,156,153, 19, 22,116, 20, 14, 19,136,108, 36,165, 56,114,190, 87, 28, 77,240,241,207, -253, 29,222,243,177,175,224,217,207,126, 14,142, 78, 55,240,211,207,252, 49,236,237,222,131,147, 39,166, 56,115,238, 28,186,205, -139,176,189,183, 11, 59,189, 24, 31,252,219,207,226,149,111,249, 26,206, 0,152,219, 9, 0, 66, 15, 96,206,155,152,211, 17,244, -160, 72,148,115, 33,165,102, 68, 65,248,208,149,142, 8, 61,150,232,105,130,185,153,160,163, 99, 56,231, 58,204,142, 1,119,109, - 3,239,249,210, 28, 15,122,199,205,120,214,255,124, 45,142, 79,151, 56, 49,179,248,151,223,255,221,248,129, 39, 62, 10,211,205, - 45,244,203, 61, 44,133, 65, 71, 46,195,206,206, 14,110,120,243, 95,226,248,140,241,208,239,249, 30,204, 39,155,152,111,248,212, -131, 32,203,233, 13,180, 90,147, 24,141,136,224,228,209, 50,141,244,227,143,190,223,129,231,238,107, 63,126,199, 5,163,126,225, -113, 56,248, 61, 26,244,104, 44,194, 28,101,134,163, 14,251, 50,193,130, 39,216,199, 4,219,174, 67, 31,188,113,223, 12,162, 7, -100, 9,184, 5,140, 0,180,244,211,121, 62,247,243,122,206,190,181,225,175,189,252, 29,248,143,111,126, 31,228,248, 67,176, 61, -223,194,221,139, 45,236, 79, 79,224,172,157, 66, 96,224, 44,195, 78,142,194,110, 92,134,185, 57,142, 61, 62,142, 69,119, 49,150, -152,130,173,192,237,237, 98,139,122,204,183,207, 96,251,220, 62,120,243, 82,188,255, 83, 95,199,255,246, 11,127,140,187,231,192, -174, 67, 60,175,157,157,189, 80, 48, 43,190,172,134,124,102, 97, 50,241, 14,199,116,234,149,201,118,119,151,126, 83, 48, 28,141, -183,178,178, 53,218,210, 77,246,150, 91,110,193, 43, 94,241,138,168,249,126,243,205, 55, 23, 68, 46,149,114, 85, 57,211,186,158, - 90, 97,110, 0,120,205,107, 94,131, 39, 62,241,137,120,213,171, 94,133, 51,103,206, 20,239,175, 37, 92,137, 8,175,127,253,235, -241,156,231, 60, 7, 47,123,217,203,162,241,211,115, 85, 5, 60,102,142, 6, 55,111,116,162, 6, 63, 39,229,233,247, 42,113, 76, -115,196, 68,132,219,111,191, 29,215, 92,115, 13, 94,253,234, 87, 15, 74,230, 52,239,253,190,247,189, 15,143,126,244,163,241,177, -143,125, 44,190, 71,149,225,148, 4,167, 53,249, 68,132, 63,250,163, 63,194, 19,159,248, 68,188,244,165, 47,141,112,188,126,159, -158,147, 66,221,203,229, 18,127,253,215,127,141,159,255,249,159,199,139, 95,252,226,120, 93,103,207,158,141,231,169,215,112,208, -146, 62, 21,217,201, 37,114, 53, 50,174,199, 40,103,228,215,205, 97,114, 7, 78,225,115,157, 55,218,209, 77,101,110,213, 81,210, -116, 11, 0,124,246,179,159,197,115,159,251, 92,124,250,211,159,142,186, 2, 10,189,231,240,190, 58, 32, 55,220,112, 3,126,228, - 71,126, 4,207,121,206,115,138, 74,132, 66,139, 32, 91,184, 19,238, 32, 61,176, 49, 3,254,197, 19,190, 23,119,205, 25, 59,155, -151,227,214,126,134, 27,255,246, 43, 56,235,128,217,116,134, 9,122,244,189,239,152,231,216, 43,209, 9, 38, 0,207, 0, 98,204, -151, 18,250,180,123,198,250,237, 0,222,254,233, 59,113, 43, 46,197,233,233, 73, 60,230, 9, 79,193,244, 24,240, 77, 0,187,155, -247,199,238,209, 7,225, 78,123, 20,238,200, 37,209,135,238,200, 43,162,187,201, 12,115, 58,130,183,125,114,142, 95,127,241,171, -240,249, 91,239,129,157, 30,193,198,145,139,112,234,212, 41,204, 38, 6,196,140,219, 78,239,225, 21,111,184, 17,207,127,213,205, -248,178, 5,246,103,132,238,200,209, 16, 58, 0,223,220,103,156,157, 94,142,179,230, 98,204, 67,133,142,241, 18, 20,232,242,190, - 77,179, 13,223,177,174, 51,216,193, 12,167,236, 12,219,211, 75,112,143, 59,130, 61,204, 0,222,196, 46,128, 63,125,239,223,227, -119,255,248, 47,240,197,123,246,112,143,179,144,163, 83, 96, 54,195,153,249, 2,230,232, 9,208, 69,151,225, 29, 31,248, 4,126, -238,255,124, 37,254,211, 71, 23,248, 34, 54,112,247,229, 15,196, 87, 38, 71,240, 13,153,160, 15, 29,232,148,127,180,234, 33,255, - 31, 72,190, 93, 16,159,185,240, 40,246,188,141, 96,199,123,245,118, 13,135, 62,228, 93,138,118,149,101, 42, 46,104, 55,167,134, - 40,125,248, 47,237,203,174, 57, 53,104,196,233, 28,238,215, 1,155, 75,224,113,223, 6,252,220,179,127, 24, 87, 92,113, 25,110, -187,251, 14, 92,122,108, 19,199,250,109, 28, 49, 2,154, 76,225,216,192, 65, 96, 97, 1,219,195,217, 30, 19, 2,156, 16,206,236, - 89,200,236, 18,220,181, 55,193,235,222,114, 35,222,116,211, 41,108,195, 59, 13,243,232, 40,135,220, 86,252,219,203,102, 26, 2, -102,179, 14,123, 65,180, 89, 0,204,166, 71, 48, 95, 44,144,228, 47,214,195,232,218,223, 91,163,211, 90, 99, 93,137,117,106,164, -114, 37,180,220,105,200, 13,219, 15,252,192, 15,224,234,171,175,142, 13, 86,206,158, 61,139,219,111,191, 29, 95,253,234, 87,241, -129, 15,124, 32,150,210,169,129,211, 6, 47,250,251, 99,186,231,121,109,179, 74,188,230, 15,141,248,114, 65,152,173,173,173,104, -160,174,190,250,106, 92,117,213, 85, 56,113,226, 4,142, 31, 63,142, 59,238,184, 3,111,125,235, 91,241,245,175,127,189, 16, 77, - 81, 88, 59,103,226, 43,107,191, 46,241,218,216,216,192,163, 30,245, 40, 60,238,113,143,195,201,147, 39,177,187,187,139,253,253, -125,124,237,107, 95,195,233,211,167,113,243,205, 55, 23, 37,103, 26,217,182,148,242, 90,215, 52,246,216,216,216,136, 13, 83,148, -208,151,223,191,131, 58, 7,122, 31, 55, 54, 54, 10, 5, 61,173,117,207, 83, 16, 26,189,231, 14,150, 70,252, 91, 91, 91,120,244, -163, 31,141,107,174,185, 6,211,233, 52, 50,233,207,157, 59,135,207,126,246,179,248,196, 39, 62,129,187,238,186,107,189, 90,152, - 46, 83, 11,204,204, 6, 76,191,128, 19, 47, 15,123, 82,211,101, 29,112, 87,239, 69, 99,122, 24,204,132,176,101,166,216,182,187, - 1, 70,246, 53,224,190, 87,122,143,110,185, 68, 7, 96, 30,214,210, 6, 44,166, 16,156, 12, 41,185,109, 3,156,115, 30,229,218, -132,175,133,159,194,115,104,108,248,251, 37,255,199,143,224,218, 7,122, 17,171, 63,248,243,143,224,255,249,175,119,248,115, 1, -240,192,203,128, 71, 60,244, 82, 92,186, 5,136,157,227,214, 91,183,241,119,183, 1, 95,220,245,228,189,185, 1,122,199, 0, 25, - 76,186, 9,204, 98, 23,151, 79, 1, 89,248,223,217, 9,255,176, 53,193,246,238, 18, 27,225,119, 23,188, 9,152, 77,192, 46, 64, -110, 27, 39, 1, 92, 6, 79,220,227, 77,224,139,115, 6,120, 11, 27, 44,152, 44,118,112, 4,158,184,247,125, 87, 2,151, 93,114, - 4, 71,143,222, 15,219,187, 61,110,187,237, 54,124,253,206, 37,110, 59, 7,156,177, 30,221,235,197, 19,232,118,151,192,116, 11, - 56,179, 27, 64, 64, 54, 88, 58, 90, 81,109,227,130,192, 21,195,245,254,191,143,204, 38,216,159, 47,177,184, 15,107,203, 47, 24, -245, 11,143, 98, 91,240,162,141,236, 69, 30,137,125, 87,182, 56, 91, 28,224,122, 64, 44, 76,152,160,158,122,166, 76, 79, 23,159, - 87, 35,111, 85, 89,221,179,239, 48,155, 26,200,190,141, 27,192, 38,128, 31,250,129,203,241,175,126,244,105,120,208,177, 14, 15, -216,191, 7, 27,118, 15, 75, 11,236, 45,151,112,232,209, 77, 24,147, 14, 16,211,225,246,179,115,108, 94,254, 32,124,249,180,195, - 91,222,253, 97,188,243,253, 95,194,215,238, 81,200,205, 27,245, 62, 8, 80,164,166,144,145,219, 94, 68, 52, 19,227, 13,208,222, -238, 18, 78,124,175,120, 39,171,115,239,106,176, 21, 26,175,107,167,213,216,107,151, 47, 53, 22,185, 82, 90,110, 20,148, 96,149, - 71,139,181, 81,100,102, 28, 59,118, 12,103,206,156,137,239,205,141, 80,173,123,174,101, 90, 26, 29,107,228, 87, 47,118,141, 66, - 21,202,213,207,168,236,109,171, 46, 92, 13,170,166, 35,242,154,245,186,187,156, 26,243, 26,165,168,213,224,234,177, 1,188,216, -205, 61,247,220, 83, 84, 2, 44, 22,139,120,142, 10, 81, 43,235,252,192, 80, 84, 16,244,209,207, 28, 61,122, 20,243,249, 60,138, -255,172,227, 69, 28, 57,114,164,208,102,175,199,179,117, 46,122,125,185,132,111, 43,226,175,255,174,191,175, 53, 78, 3,163,206, - 29,224, 0, 35, 6, 91,102, 2,107,189, 35,177, 73, 94, 88,230,116, 31,214,199,198, 17, 96,190,128,113, 22,157, 97,204,165, 7, -102, 83,208,158,243, 45, 64, 39, 29,128, 37,166, 75, 79,180, 91,120, 19, 15,208, 20,144,125, 28, 11,235,124,159,124,219, 83,200, - 17, 44, 23, 11,108,208, 18,212, 1,115, 54,152,244, 22,151, 89,224,119,255,247,239,199,211, 30,114, 20,204, 83,252,222,159,127, - 28,127,252,190,175,122,131, 29, 86,230,230, 12, 96,235,165,234,143,134,231,239, 1, 48, 55, 27, 62,244, 94, 44, 0,233,209, 25, -130, 88,193, 52, 40,228,197,250,243,112,217, 11, 23, 0, 57, 6, 22, 54,210,215,208,113,143,153,179, 80,208,155,166,192, 61,214, - 11,231,146, 88, 24,183,192, 81,227, 73,129,121, 54,124,138,132,248, 45,209,133, 22,178, 61, 64, 22, 8, 85, 5, 36,128,113,137, -120,235,195,130, 46,124,143,107, 26,119,189, 14, 66, 86, 14, 8, 96,121, 31, 24,118, 17, 58, 48,119,232,194,227,127,144,156,186, - 45, 58, 60,113,105,208,165, 15, 18,140,190, 45,171,178, 91,189, 88,141,159,162, 14, 46,230,181, 60,223,156, 61,160, 47,158,193, - 50, 95, 88,108,108, 77,176,191,187, 68, 31,140,250,127,186,233, 78,188,225,166, 63,197, 67, 79, 0,255,234,177, 39,112,197,241, - 99,184,255, 3,191, 13,151,158,188,204,111,100,251,251, 56,125,230, 30,220,179,125, 14, 95, 63,189,141, 55,191,243,191,226,115, -119, 0,123,236,163,132, 30,192,214, 6,225,220,190, 4, 24, 44,103,159, 74,185,160, 58, 6, 27, 96,177,112, 88, 90,192,237,205, - 33, 66, 96,120, 3, 40,117,226,189,122,168,161,203,235,199,243, 8, 74, 13,169, 70,113,121, 71, 51,221,164, 53,194,238,251,190, - 48,230,106,240,114,153, 84,173, 63, 63,115,230, 76,252,125,173,171,214, 77, 94, 13,186,170,219,141, 25, 57,109,128,178,189,189, - 29, 85,203,234,238,102, 53, 28,237, 91,122,154,168, 59,223, 18,133,201,197,113,114,248, 58, 55,126,121, 23, 57,189, 62,117, 62, -244,187,183,182,182,226,103, 20, 98, 86,216, 90,157,142,188,231,124,237,104,213,209,240, 88,132,173, 61,228,251,190, 47,222,175, -186,235,171, 30,185,209, 87,199, 78,243,230,121,223,128, 35, 71,142,196, 38, 58,122,189,173,190,235, 57,122,161,206,160,166, 81, -244,222, 40, 18,176,210,160,135,169, 78, 78, 96,120, 10,103, 13,118,173,192,132,226,173, 51, 2,244, 22,192, 69, 23, 3,123, 11, -111, 1, 1, 76, 54,166,152, 47,247, 3, 34,215, 65, 16,206,143, 60, 94,103,145,243,184,125, 23, 49,179,113, 20,243,253,179, 56, - 50,243,109, 34, 22, 11,191, 63, 76, 38, 71,177,223,159,243,249, 45,199,232,173,245,171,110,105,177, 49,157, 66,120, 3,180,185, -137, 61, 0, 59, 96,200,236, 34,223,150,125,177,173, 46, 3,108,128,210,157,217, 10, 36,158, 30, 96,241, 56,161, 21, 88, 48,246, -196,160, 51, 29,140, 88,144, 91,132,249,168,197,108,161,104, 7,189, 7, 7,157, 64,156, 69, 79, 4, 51, 97, 44,172,197,124, 1, - 95,188, 59,241, 91, 90, 15,198,105, 27,174, 47,196, 1,100, 39,216, 67, 23,154,211,204, 32, 52,131, 19,235, 17, 12,218, 5,172, -151,154,165,192, 47, 50, 97,116, 60, 58,217, 50,170,233, 57,235, 66,133,173, 75,251,231,164,235,192,206,161,119, 12,129,131,131, - 11,123,234, 97,114,167, 4, 87,181,126,189,240,184,240,232, 98,100, 29, 22,117,130,219, 5, 16, 23, 13,250,160,109,111, 88, 12, - 34, 30,158,154, 5,153,200, 14, 14, 61, 12, 22, 8, 26,148,236,176,223,219, 40, 33, 41, 6,216,183,222, 48,127,113, 9,252,250, - 59, 79, 97,214,157, 66,199,255, 0, 18,160,119,126,143,232,157,110, 41,169,249,138, 56,239,119,240,100, 3,167,233, 40,196, 44, - 1,187,139, 36,216, 56, 60,207,222,101, 95, 36,254,187, 25,226, 57,171,174, 42,143, 89, 19,173,215,134, 62,207, 9,235,251,212, -136,183,186,153, 41, 4,171,155,187, 18,225,212,248,231, 16,115,173,137,190,179,179, 51,136, 22,245,123,149,168,166, 81,179, 58, - 25,185, 65,169,115,200,185,196,169,254,142,254,102, 30,141,231,117,216,122, 46,234,156,228,176,120,158, 90, 80, 53,180,250,161, -141, 74,244,253,154, 86,200, 17,131,220, 49, 80, 49,154,156, 64,152, 59, 32,235, 12,122,126,239,242,146,182, 58,125,178,206, 41, - 80,164, 65,127, 59, 63, 31, 77,201,168,241,215,223,104, 33, 53,250, 93,234,224,141,233,239,215,122,240, 43, 3,117,177,222, 56, -132, 4,152,193, 12,211,201, 6,246,101,215,175,233,189, 69, 74, 73, 89,193,124,127, 31, 98,130, 3,191, 92,122, 99, 71,136, 77, -157,108,232,177,206,161, 7, 56, 83, 15,183, 63,199, 36,112,101, 12,124,147, 19, 0,232,151,251,232, 96,176,180, 64,199, 51,108, -177,197,134,115,152,153, 14,189, 3, 78,239,156,197, 78,191,136,209,175,204,151,222, 28,210, 81, 76,197, 97, 66, 61,118,101, 23, -214, 2,189, 91,122, 5, 72, 6, 96, 45,172,243,196,220,141,233, 6,246,247, 45,122, 11,175, 14,199, 6, 91, 51,131,253,253, 5, -140, 1,200,116, 88, 46,250, 32,240,210,195,176,129,117,192, 92, 8,243,133, 0,221, 4, 52, 17,144,237, 33,139,189, 24,188, 76, - 55,142, 98,177,127, 22, 83, 7,108,116, 0, 19, 97, 41,115,104,105,160,145, 57, 4,140,126,238, 60, 89,104,226,199,100, 58,221, - 68,215, 19,196,237,198,110,117, 10,179, 23,123, 9,149,240, 56,153, 14,204,132,101, 31, 74,134,173, 11, 77,109, 76, 64, 62,189, -130,134, 17,221, 71, 19, 42,177,192, 4,210,113, 8,186,122,192, 90,108,193, 97, 54, 33,156, 93,212, 77,111, 47, 60,254,135, 55, -234,146, 71,230,240, 6,144, 50,187, 13,205,181, 71,232, 61,108, 0,170,228, 20,176, 36, 11,192,128, 65, 48, 32, 21, 95,112,234, -210, 58, 88,242, 18,178, 29, 1, 52, 35,204,231,130,221, 93,255,250, 57,117,108,245,100, 12,128,201,212, 63,185,232, 49, 51,201, - 67,118, 4,236, 47,122,127, 14,221, 20,176,187,225,124, 29, 50,229,105,191, 72, 8,224, 73,104,241, 8,159, 89,112,193,214, 76, -201,171, 83,205,215,176,215, 53, 90,172,235,199,235, 77, 87, 13,182, 70, 95, 90,158,166,125,192, 53,210,207, 29, 2,141,250,180, - 19, 91,222,229, 44,135,206,243,104, 57,135,196,115,227,158,127,175, 18,213,244,253,218, 25, 77,207, 69,141,142, 26, 19,101,128, -231,145,162, 70,248,122,158,202, 76,207,127, 55, 23,172,209,207,182,154,186,232,127,231,206,129,230,145,243,136, 92,191, 91, 63, -147,167, 43,242,243, 86,103,227, 32, 37,133, 74, 62, 83, 56,188,174,167, 63, 72,190, 50, 55,172, 74,126,203, 59,233,233,181,181, -154,239,228,136, 72, 75,145, 78, 81, 8,157, 7, 26,181,231,247,111,213, 99,102, 66, 95,111,233,130,129,112,216, 95, 46,209,251, -254,171,222, 98,237,247,232, 28,192, 33, 29,181,112,240,140,186,249, 34, 57,241, 46, 25, 34,143,182, 5, 67,229,230,222, 33,167, - 14,108, 28, 22,189, 67, 15, 96, 26,112, 59,130, 5,195,161,119,115, 44, 67,212, 72,232, 48,153,110, 97,134, 9, 22, 86,231, 5, -176, 12, 10,120, 93,128,140,151, 34, 32,222, 64,239, 22, 62,220, 54,228, 43,105,172, 55,114,189, 0,178,191, 11,160, 3,179,129, - 19, 66,239, 8,103,247, 22,209,226, 49, 4,196, 12,113, 14,126,104, 45, 8,126, 28, 45, 49,224, 44, 4, 61,102,236, 3,144,133, - 3,168,235,176, 88,248,186, 91, 7, 96,222, 3,132, 69,112,138,124,192,204,178, 12,193, 12,193,145, 71, 19, 22,115, 96,223,245, - 97,159,243,242,176,235, 2,130,110, 50, 65,191, 92,162,183, 61,152, 60, 95,201, 7, 66,126,191, 34,221,112, 41,236, 90, 65, 3, -204, 74, 74, 32, 10, 59,128, 39, 33,138, 50, 0,150, 62,232, 89, 92,128,221, 47, 60, 26,115, 46,184,240, 48, 1, 70,175,251,255, - 46, 49,129, 96,154,197,192, 11,159, 75, 23,237,200,228, 95,234, 49,131,197, 12,147, 0,255,117,216,133,117, 61,120, 22,186,166, - 77, 12,236,146,112,174,247,204,147,173, 41, 97,190,240, 11, 7,198, 11, 88,244, 78,162,175, 64,232,193,112,232, 24,176,125, 56, -203, 40,142, 33,224,141, 37,220,124, 27, 94, 62,163,132,188,242,169,238, 22, 54,110, 86,198, 76, 64,110, 9, 88,192,138,131, 4, -249,198, 21,232,123,220, 96,115, 57,207,214,166,171, 6,187,150, 22,173,115,187,121, 51,150,188,229,107, 30,229,181, 12, 78,158, -119,215,163,126,143,146,244,212,248,169, 1, 84, 99,163, 36,174,220,200,232,249,230, 29,226, 52,250,212, 72, 81,107,246,119,118, -118,138,107,209,154,236,253,253,253, 98, 12,212, 0,235,115, 42,252,146, 71,255, 57,159, 32, 79,103,212,237,110,107, 3,169,207, -231,149, 1, 7, 41, 41, 84, 98, 91,173,159,159, 27,232,149, 11, 36,180,155,213,223,207,175,119,107,107, 43,222,139,220, 96, 43, -227,190,206,153,231,165,114,185, 35,150, 55,117, 81, 72,255, 32, 45, 53, 67, 80,235, 35,181, 73, 15, 76, 54, 48, 93, 58,184,229, -158, 55,185, 22,192,238, 57, 79,164, 19,224, 40, 8,232, 4,231,122, 96,219,147,214, 92, 0, 0, 32, 0, 73, 68, 65, 84,119,103, - 7, 64,135,141, 0, 57,247, 75,191,178, 5,155, 0, 77, 0, 44, 33, 88, 98, 99,234,217,240,187, 54,160,120,129,153,182,176, 61, -152, 8, 34,193,176,201, 18, 75,237,186,198, 19, 44,123, 1,216, 96,107,211,151,186, 81,239, 96,204,110,209, 83, 92, 0, 44, 92, - 7,134,175,177,119,139, 5,132,217, 39,204, 13,195,245, 75,108,248, 46,238,232, 93, 31,224,246,206,159, 95, 55,241,192,119, 63, - 7, 4, 48,179, 13, 88, 43, 65,193,205,133, 77, 7,152,109, 78, 49,223,247,123,136,254,176,244,190, 90,103, 58, 97,236, 89,135, -158, 8,100,142, 0,112, 16,235, 83, 91,100,129,205, 9, 65,122,129, 19,192, 46,252,103,187,205, 45,244,203, 96,136,237,220,243, - 25, 86,100,181,157,166, 42,133,130,211, 65, 96, 99,124,129,142,235, 61,236,174,113, 82,224, 42,245,228,188, 83, 70, 30,188,128, -181,192,114,223, 71, 59,204,193,193,177,112,114, 33,155,126,225,209,222, 23, 74, 56, 15,165,132,130, 68,242, 25, 71, 87, 94,245, -158, 57, 66,245,254,171, 36, 40, 58,169,105, 53,136, 62,128,159,152, 93,104,237, 10,131,189,197, 50, 68, 2,128, 91, 10,250,165, - 64, 28, 5,223, 24,152,146,193, 20, 38, 26,121, 11,130,227, 73, 4,166,104,185,231,153,174, 43,160, 73,117,163,205,100, 10, 16, - 99, 49, 95,122,104,145, 61, 99,213,115, 0, 36, 66,199,173,127, 90,114,164,198, 87, 55, 99,141,190, 52,250,211,141, 56, 87, 87, -211, 28,178,126, 62,143,102,245,189,121, 39,178, 28,222,213,168,148,136, 98,158, 93,127, 71,235,160,213,112, 43,171, 90, 85,201, -212,129, 80,242,158, 26,201, 60, 71,157, 71,150, 57, 36,175,186,227,234, 60,236,236,236, 20,173, 67, 39,147, 9,250,190, 47,250, -185,251,210, 64, 19,207, 51,111, 56,163, 93,216,114,231, 33,255, 91,211, 0,154, 91,174,219,208,230,198, 93, 13,121,171,228,108, -213, 67, 53,253, 53, 77,145,215,213,139, 72,154, 3,141,227, 50, 68, 89,122,244,243,201,223,215,221, 61,239, 44, 45,251,208,214, - 54,140,131, 32, 68,221,147,174,128, 98,245,251, 20,130, 5,251,200, 84, 32,254,187, 67,174,201,137,131, 64,252,231, 9,229,191, -236,251,162,228, 49,133,152,110,177,141,189,229,190,239,162, 54, 73,101, 95, 27,161, 12,126, 31,130,253, 62,149,164,110, 24, 19, -215,187,129,210,204,184,224,168,236, 47,108,208, 57, 39, 31,110, 75,128, 7, 58,134,131,245,111, 13,231,166, 46,255,221,110, 3, -223,112, 23,227,116,119, 25,182,251, 73,218,104, 66, 10,155,179,235,240,249,100, 95, 86, 59,209, 60,159,115,193, 35, 9,156, 25, -202,134,128,148,192,211, 1,206,161, 11,235,199, 46, 22,128,181, 16, 31,167,251,255,103, 96,190,167, 78,160,114,129, 0, 54,254, - 4, 22, 75,141, 32, 12,164,183,144,222, 34,150,187, 79,128,189,165,248,136, 89, 82, 8,212,207,119, 35,121, 88,235,233, 92, 13, -189,231, 70,125,185, 4,119, 29,120, 50,137,247,205, 58,183,162,211, 34, 69,227,157,127, 55,177,231, 7,193, 57, 56,107,125,126, -127,146,174,169, 57, 79, 14,250,160,127,162,199, 11,143,177,219,217,137,207, 9,185,129,208,161,207, 60,119,144,130,192, 33,160, - 32, 3, 81, 68,197,146,216,167, 20,120,240, 40,224,169,144, 19, 74,250,142, 32, 56, 24, 40,225, 14,133, 59,145,104,111, 54, 62, - 67, 32,109,133, 30,156, 11,215, 80,115,170,175,161,244,155,235,212,130,110,140, 99,132,169, 58,194,173,159,187, 15,110,192,154, -215,199,223, 33, 20,206,229,208,139, 56, 87,228,185,183,215,194, 13,194,197, 97,206,101, 77,172, 33, 24,133,179, 35, 21, 36, 31, -139,131, 12, 48, 21, 9,207,116,254, 84,253, 46,141, 28,243,239,169, 63,223,122,223,202,235,103, 28,136,216,209, 60, 47, 23,197, -162,188,229,227, 64, 90,203, 32, 55,109,128, 18,242,228, 46,188, 95,200, 15, 26, 7,142, 9, 2, 18, 38, 20,184, 48,186, 58, 92, - 95,134, 0, 49,121,204,177,212,181,235,128,126,233, 87,255,253,142,205,240, 61, 15,251,118,124,219,229,199, 33, 34,248,240,167, -191,136,111,124,243, 52,206,206,253, 74,229, 80, 34,198,240, 61, 26,150,214,105,152,154,109,218,156, 82,130,217,244,142, 6,172, -224,144,187,116, 62,121, 62, 80,207,191, 78,118, 55,255,110,125, 95,137, 40, 20,215, 77,237,247,158,151,177, 25, 36,227,185,189, - 46,138,215, 27,215,133, 67,204,159,124, 47, 59,223,133,123, 64, 82, 31, 69, 37,192,240,211,245, 26, 21, 89,253,125,235,246, 90, - 89,191,188,215,157,223,170, 61,125,237,235,247,114,247,148,198,158, 54,102,127, 14, 16,151,235, 57,241,127, 87,242,228,127,111, -167, 75,254,145, 1,172,117,236,106,186,151,163, 31, 55,232,241,164,240,202, 5,152,255,126,107, 2,181,206,191,120, 31,153,161, - 49, 60,212,125,118, 16, 90, 49, 78, 78, 86,158,207,129,200,142,180,194, 72,255,163, 77,234,132,106, 9, 13,143,190, 22,171, 94, -148,116,160,117,146,198,223,157,223,226,202,157, 14, 25, 62, 53,216,148,243,243,150,106, 19, 17,155,148,228, 20, 1,232, 60, 87, -100,105, 5, 71, 54,167,216,221, 91,120,116,128, 0,230, 46,228,217, 25,196, 12, 39,146, 12,216,170, 13, 76, 52, 98,175,238,191, -220, 23, 55,209,173,156, 34,107,253,187,243,253, 48,225,208,140,247, 81,163,151,137, 72,149,183,199,173,156, 18,242, 79, 57,242, -149,245, 54,100,221,240,186, 3, 26,253,181,227,127, 47,141,250,125, 4,182,135, 45,153, 58,185, 55,145,231, 58,170,200,189, 53, -106,185, 39, 73,231, 49,251,214,253,126,125,254,131, 69,145, 49,186, 91,207,223,219,168,253,190,242,244,254, 9, 65, 67,135, 58, -247,123,131,100,228,142, 15,137,191,215,165, 61,119,163, 27, 0, 73,251,251, 15, 27,217, 28,196, 40,184,149, 88,211,122,251,124, -216,185,225, 50, 87,158,170,248,150,170,205,194, 69,242,155,126, 95,121,150,134, 12,172, 44,131,194,164, 39,148, 90,113, 35,231, -225,235, 78, 92, 72,126, 57,184, 67,205,131,182, 31,198,231,109, 79,243,251,175,215,175, 71, 19,240, 70, 10,110,127,253,122,142, - 7,156,255,239,175,119,204,152,120,176,199,172,154,131, 60,178, 62,232, 60,247,111, 28,112,253, 29,116, 93,196,243,201, 22,219, - 63,166,120,206,186,243,114, 43, 87,221,193,175,231,124,127,255, 48,223,219,250,174,182, 35,126, 31, 68,234,114,175, 6,229,255, - 47, 14,223,216,178, 93,125,204,181,218,207, 7, 62,225,193,182,122,184,163, 8, 65,200, 5, 88,112,120, 36,152,230,243,241,184, -230,188, 15,146,114, 56, 72,240,187,202,121,171,131, 45, 34, 26,125,191, 66,200, 38,176,146,173,179,135,244, 99,235,249,231,154, -206, 6,143, 44,180,250, 58,235,133, 86,111,162,235,156, 82, 87,189, 78,135,220,172,221,136, 81,112, 7, 88,171,116,128,241, 25, -235, 62,150,198,137,177, 68, 63, 24, 71, 14, 6,127, 25, 34,121,130,169,170,224,187,236,250,213,221, 26,206,111, 42, 42,194, 93, -112, 10, 28, 56,164,236,206,111,213,212, 87,229, 64,161,172,236,176,199,123,119, 6,174,233, 92,158,207,195,196,121, 87, 30,109, - 37, 3,126,144,245,251, 79,233,184,126, 92,204, 96, 29, 74,150, 58,150, 67,204, 35, 27, 37,215,112,159, 29,169,218,255,199,214, -193, 42,183,178, 30,135,238,241,143,125,252,121, 27, 36, 71, 7,136,132,215,177,147,207, 35,167,155,255,230, 58,246,242,170,243, -115, 33, 15, 75,154,152,172, 48, 82, 98,192,246,206,167,208, 26,175, 11,220,218,210,168,117, 99,104, 6, 77, 33, 14,126,116, 36, -112, 86,198, 49, 94, 18, 95, 94,216, 56,239,248,247,154,115, 30, 59,255,220,232, 31,196,168,183, 92, 71, 71, 24,117,138,116, 92, -234,215,245, 82, 56,240, 43, 56,144,209, 76, 21, 1,232,209,132,252,108, 46,157, 75,228,169, 84, 32, 23, 98,199,225,181,177, 12, -249, 20, 68,190,144, 9, 76,209, 25,171,127, 47, 18, 40,129, 65,131, 30, 61,255,114, 78,186,149,175,215,243,151,171,231,114, 61, -255,252,219, 6,200, 18,141, 59, 91,131, 72, 80,146, 91,211,187,154,208,149, 34, 71, 1,124,253, 52, 51, 12, 17, 68, 44,196,186, -129, 54, 62,216, 51,191, 23,125,239,133,159, 58, 95,246,234,156, 11,156,144, 52, 63,253,118,144,102,148,196, 22,202,158,105, 15, - 16,132, 4, 36,254,254,139,117, 99, 83, 63,166, 57,198,254,206,205, 26, 11,193,194,121, 65, 23,146,120, 52,224,226,239,250,232, -156,196,243, 35, 26,174, 99, 34, 30,172, 91,125, 31,139,248,244,133, 12,239,215,216,188,170,231, 49,113, 40,137,101, 19, 73,164, - 74,138,213,127, 53,198, 92,207,235, 85,227,183,110, 60, 13,113,241,124,254,186,131, 20,159,215,191,243,231,235,239, 59,236,177, -119,237,125, 74,255,206,171, 85,106,116, 85,200, 55, 29,203,207, 15, 78, 70,207,175,126,221, 65,214,206, 63,221,167, 70,175,131, -202,253, 95,234,249, 47, 67,183, 75,215,129, 27,217,191,187,218, 40,142, 77,174,209,141, 90,100,208,253,236,190,132,199, 91, 68, -181,226, 28,248,252,225, 19, 19,114, 42,113, 35,209,244,115,216, 1,197,165,239, 39,165,236,102, 76,102,130,193,230,198,228, 94, - 37,198, 89,232, 94, 57, 5, 34, 7,103, 5,140,166, 12, 72, 14,101,212, 87,157,147, 70,210, 92, 17,114,198, 38,117,220,248, 71, - 34,251, 92, 48,134, 2,174,164,223,239, 8, 62, 39, 27,238, 75, 52,186,193, 3,102,241,162, 34,138,136, 80,128,135,245,125, 68, - 38,116, 19, 47,175, 87, 2, 59,139,144, 12,147,126, 62,215, 45, 40,126,175,218,116, 89,218,112, 35,115,105,208,205, 8,146, 66, -194, 32, 18, 16,165, 72,213, 51,191, 3, 66, 4, 3, 33,192,245, 54,108, 30, 97,147, 13,248, 91,174,149, 40, 21,236,238, 90, 76, - 26, 73,177,140,191,191,254,175,153,153,120,231,221,249,117, 46, 46,149,128, 10, 1,231,246,118, 49,153, 78,125,126,220,122,242, -235, 70, 55, 73, 27, 42, 19, 32, 12,203, 2, 51,241,154,238,190,130, 67,208, 75, 15, 54, 60,152, 83,249,126, 34, 13, 84, 35, 39, -135,210,164, 59, 84, 80, 33, 92,174, 1,189,127, 34,130,201,136,113, 48, 97,126,181,142, 66, 50,106,136,117,127, 26,115,210, 56, - 32, 78,254,126, 87,206,106, 56, 26, 98,128, 3,114, 21,156, 73, 50, 28, 29, 1, 99,130,168, 81, 54, 39,243,127,214, 90, 63, 31, - 10, 35, 69,201, 88, 29,194,168,214, 70, 57,150, 24,229, 28,145,112,148,112,116,193,232,213,198,112,204,152,175, 53,130,131,253, - 35,145,167, 91,251, 86,199,156,173,235,114, 78, 57,132,230, 67, 4,144, 84,125,247, 68,113, 24,130, 85, 39, 95,247,177,176,207, - 73, 92,107,136, 21, 26,245,145,214,189, 14,206,198, 87,215, 49,197,251, 68,162, 71,196,163, 39,196, 74,216,195,134,198,189, 35, - 41, 39,220,112, 19,226,149,176,169,136,172,206, 5, 50, 29, 16,126, 62, 63,163,126, 80, 67, 54,118,254, 57,122,219, 52, 46,141, - 5, 25,191,147,220,129,234,164, 87, 62, 44,157,119,126, 66,199,223,172,249,253,129,135,154,157,255, 24, 87,224,124, 28,140,218, -120,143, 25,251,252, 56,246,157, 6,109,226, 15, 19,129,195,130, 96, 2,168, 43, 35,113,147, 25,110,170,224,252,226,245,248, 25, - 41, 12, 92, 94,206, 72, 85,230, 86, 35,239,220,112,115,195,152,107, 4,229, 29,195, 10,150, 46,156, 29, 6,137,141, 89, 73,228, -206,165,254,190,184, 16,241, 73,104,141, 44, 97,124,252,166,211,117, 93,145,142,200, 35, 47, 53, 6,146,149,192,213,240,115, 28, -127, 75,131, 10, 2, 47,182, 20, 16, 57,167,247,203,101, 6,147,112, 98,235, 24,132, 24,206,245,232, 21,144,119, 12, 97,194, 36, -116, 64, 20,241,247,140,141,143,234, 69, 4,142, 28, 38,147,105, 73,212,164,161,163,170,207,217,204,160, 75,110,148,121,181, 81, - 23,150,241, 72, 77, 4,134,199, 95, 59, 28,210,214, 54,234,181, 83, 90,238, 39,169, 76,175, 78, 43,233,177, 11, 34, 89, 6, 4, - 97, 42, 94, 7, 0,211,233,205, 13,243,214,185, 98,124, 98,201,108,101,212, 40,116,210, 59, 48,204, 45,226,231,122,118,212,249, - 93, 71,234,121,164, 43,153, 81, 87, 99, 47,185, 83, 32,222, 70,232,250,212, 35,135,121,172,231, 61,118, 94, 30,201,225, 2, 86, -207,157,190,126,217, 23,247,178,248,111, 0,206, 16, 92, 88,107,249,218, 31,204, 67,100,234,166,162,133,135, 94,115,224,222, 61, -124,221, 25, 19,188,243,208, 56,186,176,215,233, 49, 62, 79, 46, 56,122, 85,164,222,138,148,242,201, 39,107, 24,169,113,240,207, -215,168,157, 7,251,240,190, 34, 89,144, 12, 61,227,149, 48,138, 70,144,234, 73,129,209,145,129,176, 59, 47,248,200,111, 58,116, -175,145,140, 85,227,207,204, 43, 55, 43, 95,103,238,154,112, 89, 61, 46,245,235, 7,137,212, 91,198,190, 5,223,229,207, 55,239, -121,123,112,176,180,203,104,164,153,120, 16, 65,119, 1,126,215, 8,153,179,205, 67, 55, 20,245,154, 37, 84, 10, 20,146,183,209, - 25,144, 44,239,173, 81, 63, 48, 97, 83,108, 70,196, 1, 18,141,149,150, 38, 25,114,150, 80, 67,237, 35,114, 98,175,214, 66,112, - 69, 68, 94,112, 54, 48,140,212, 83,196,174,169, 2,191,197,249,104, 45,155, 55,182, 52,140, 6,229, 49,236,213, 80, 88,202, 27, - 3, 42, 54,180, 41, 7,194, 88, 48, 46,130, 12,102,101,160,183,190,175, 98,199,140,217,108, 35, 9, 42, 89, 11,129, 96, 50,157, - 97,105, 83,167, 66, 43,128,115,130,142, 59,175,124,184, 44,225, 81, 71,229, 57,187, 60,255, 41, 82, 70,235, 0,156, 91,191,105, -166,247,211,224,104, 50, 10,187,191,239,213,184,172, 9, 58, 52, 18, 92, 5,151,143, 31,195, 60, 83, 53,193,240,124,167,169,163, -108, 77, 9,188,204,156, 83,157, 9, 53,204,115, 91,124,167, 70,111,164,250, 24,189, 61, 47,103,229, 32, 72, 95,174,176, 57, 48, -152, 34, 43, 3,130,132, 42,135,190, 25,185, 19, 31, 68, 5,136, 40,104, 54, 12,124,222,112,100, 56, 1, 68,236,232,181,173, 66, - 26, 69, 4,174,247, 78,135, 20,105,153, 12,181,117,146,170, 46,194,126, 72, 1, 49,145,144, 62, 92,233,116, 56,183,250,117, 97, -228,197,152,121,144,204, 49, 85,168,243, 32, 56,244,113,126,152,184, 30,243,253,179,235, 40,229,228,114,168,104,204,168,231, 27, -174, 91, 65,130,138,239,147,131,211,112,206,103,194,117,102, 77,127,237,117,193, 61,115, 17, 57, 38,216, 37,192, 51,213,235, 28, -115,193,222, 83, 34, 17, 56,241, 34, 30, 90, 30,124,208, 99,216,233,207, 59,109,177, 42,210,173,157, 38,138, 11,166, 69,167,242, -158,162, 16, 13,137, 28, 58, 30,213,235,102,196,217,200,157,129, 26,230,108,230,232,196,134,250,101,138,199,218,105,203, 35,224, - 26,125,232, 12, 39, 56, 48,207,197,135,239,153,134,249,193, 85, 68, 85,212,183, 83, 70,152,203,210, 5, 30,204,176,213, 52,114, - 49,202, 98, 73,157,138, 57, 71, 8,136,253,249,178,148,223, 21,115,169,190, 67, 32,169,114, 83, 72,249, 16,115, 48,246, 20, 96, -120, 10, 68, 31, 10,185,108, 59,164, 8,137, 41,230,195, 74,196,134, 86, 44, 16,146,176,185,101, 70, 46, 68, 90, 68,222,249,225, - 16,160, 57,120, 1, 23, 27, 34,112, 53,248, 16,223,109,137, 1, 76,121, 18, 54, 77,139, 46,196, 56, 66, 4, 19,218, 50, 19,145, - 23,143,225, 36, 36, 36,217,140,140, 96, 82,232,173, 96,197,249, 84, 75,133,162,152, 53, 37,151,181,129,137,247, 55,156, 67,141, - 68, 30,118, 15, 98,208, 74, 84, 47,170, 9,162,218, 15, 67,138,195, 35,153,237, 61,119, 21,183, 34,138, 74,113,185, 86,108,180, -122,227, 1, 80,217,167,193,172, 69,228,234,207,229,159, 31,164, 55,100,164,104,191,129, 98, 20,231,166, 67, 66,228,123,124,132, -165,230,141,118,216, 31,116,169, 72,114,194,157,248, 68,232, 88, 52,158,183,188, 30,162,170, 4, 10, 72, 3,235,188, 22, 63, 55, - 56,114,198, 36, 34, 36,122,132,225,136,152, 0,237, 52, 69, 76, 47,100,156,131, 65,206, 62,219,183,226, 28, 41, 74,112,218,129, -118,156, 39, 97,255,175, 35,251,174, 5, 11,141, 77,234, 22,105,199, 29, 38, 42, 63, 4,204, 62, 86, 74,118, 95, 63,162, 39, 20, -115,100, 85,238, 44,131, 76,135, 71, 31,229,214, 17, 80,126,172, 61,175,218,145,185, 55,156, 2,111,232,184,204, 65,202, 97, 74, - 12, 13, 76,195, 35, 51,209,235, 31, 70,118,249,249,183, 88,234,156,195,191,202, 61, 40, 34,137,218,105, 72,145,125,107,226,182, -136,110,249,220,235,196,198, 77,178,128,191,165, 97,160,179,107,210,180,144,227,112,190,168, 4,109,194,174, 66, 89, 63, 1,132, -136, 58,119, 28, 58, 78, 70,213, 80,136,196, 57,207,215,122, 66,148, 71, 19,242,136, 28, 32,161, 0,207,154, 2, 46, 79,215,111, -194,253, 52,225, 44,186,193, 12, 34,152,132,246, 48, 13, 8, 62,241,136,241,146, 44,191, 65,132,200, 63,187,161, 66,129,159,173, - 4, 75, 69, 50,200,239,120,204, 41,255, 30, 27,139,146,255, 46, 31,117, 51, 24, 57,146,148, 95,127, 64, 29,212,168,185, 80, 62, -231,244, 28, 66,174, 48, 16,209, 72,180,196, 76, 89,231,129,136, 6,110, 16,139, 18,241,136, 77, 23,137, 69, 57,113, 45, 63,230, -175, 75,194,132,189, 4,238, 10,162, 82, 94,236,239, 9,117,158,104, 39,236,197,126, 28, 9, 58, 37,214,133,191, 75,226,157,215, -201, 24, 19,191, 42,200,168, 35,220,147,117,233,201,220,144,181,141,122, 34,186, 42, 12, 29,225,232, 28,182, 15, 6, 84, 95,207, -159,175, 97,250,252,111,206,190, 95,197,154,244,121, 23,174, 41, 15,154,148,163,197, 89, 9,234,224,249, 44, 61,225,156,172, 76, -157,180,158,171, 29, 11, 19,246, 3, 14,199, 98,175, 49,165, 81,173,131, 95, 17, 25,160,173,254,185,210,233, 17, 22,159,183, 55, - 62,226, 78,118,129, 32,224,181,200,110, 51, 40,210,156, 62, 73,145,134, 13,232,145, 4, 7, 97,200, 95, 38,106, 87, 22, 83, 5, - 17,229,175, 31, 6, 30,167, 92,252, 34,159,160, 7, 12,180, 73, 92,243,125, 7,115, 10,120,232,204, 28, 58, 35,178,174, 78,241, -240,233,133,214,231,155, 11, 58,192,231, 69,126,116, 69,218,164, 73,228,161,213,206, 91, 30,201,180,190,147, 43,156,157,197,167, - 20,184,130, 47, 41, 35,172,149, 70,199, 68, 99,212,204, 73, 18, 53,141,189,122,196,236, 42,130, 11, 39,131, 27,191,131,105,148, -195, 97,186,100,164,162,225,113, 73,165,208, 7, 50, 46,122,240, 57,196,201,129, 56,199,153,195, 64,196, 62,178,165,208,222, 55, -192,237,145,175,162,145,120, 24, 43, 29,255,124,179,106, 70,109, 50, 22,177, 81,212, 93, 45,140, 54,123,130,143, 49,156,233,171, - 53, 88,189,209,129, 30, 18,214,172, 72, 48,246,174, 16,121,113, 49,194,204, 54,173,194, 17, 64, 84,143, 75, 24, 8,146, 86,107, -110,228,145,156, 34, 27,210, 81, 66, 18, 58, 55,123,163,235, 2,121,200, 49,135,102, 48, 20,175, 84,104, 88,226, 89,150,156,154, - 96,136,169,153,198,144,236,251, 60, 18,146, 35, 34,233,115, 34,185, 81, 7,106,118, 50,137, 4,167, 78,171, 78,252,102,155, 31, -153,253,252,227,192,222, 55, 12,244,241,252,199,170, 76, 66,225, 83, 6, 73, 87, 59,195,202,245, 89,167, 43,234, 72,155,132,124, -169,150, 34,149, 78, 70,255, 30, 59,214, 92, 25, 93,255,202,169,148,176,190, 11, 68, 52, 70,194,105,206,168, 62,168, 19, 95, 5, - 81,192,212,245, 63, 69,118,148,192,217, 66, 88,242,231, 21, 17,203,100,116, 77,204,140, 99,192,151,201,155,120,213, 70, 61,190, - 54,194,149,200,199, 88,217,247,227,169, 9,106,114,141, 86, 29, 45, 36, 17, 87, 3, 44, 31,255, 39,130,142, 70,148,136,206,215, - 8, 29,134, 61, 95, 37,175,214,230,207, 15, 27,129,175,255,172,196, 5,126,190,200,192,189, 5, 18,238,237,120, 18,243,192,163, -175,255,187, 5,223, 68, 35,187,130,185,159,195,147,173, 60, 21, 5,136,153,165,145,238,160, 70,196,156, 59, 11, 38,192, 69, 38, -193,250,173,247,213, 34, 48,121, 29,184,102,157,115, 52, 36,207,205,229,185,245,218,169,241,139,196, 69,164,195, 71,157,214, 71, -130,145, 33,109, 3, 59, 89,225,117, 14, 57, 53,160, 35, 19, 96,119,142, 80,124, 92,240,172,204, 84,223,172, 4,148, 80, 21, 10, -134, 63,158,147,147, 48,142,237,244, 0,168,237,228,228,121,102,225,161,123, 47, 46,116, 68,140, 34, 47, 20,151,155,136, 3, 76, - 14,215, 83, 17,137,123,227,207, 96, 86, 99,102, 42,242, 16, 69,148, 42, 23,239,112, 97,163,211, 70, 79, 49,185,147, 79, 89,114, -213,166,230, 34,177,137, 69,224,130,234,176, 31, 34,111, 8,157, 48, 96,124,254, 17,200,142, 97, 28, 29, 49, 88, 52, 77,198,190, - 26, 62,252,237,141,146,203, 34,100,175, 54,111, 66,189,187,209,116,154, 88, 88, 18,176, 88,127, 14,206,134,116,155, 70,136, 18, -190,215,193,177,135,109,149, 56,168,249,113, 32,211,166,207,165,106,195,243,254,125,193,193, 35,100,185,125, 30,205,253, 82, 16, -213, 31,202,159, 39, 56,127,172,170, 36,186, 30,132,166, 65, 7,124,183, 56,229, 79,136, 43, 9, 98,146,149,194,217, 8,239,151, -196,197, 8, 65, 51,197,223,138,100,205,144,222,140,207,103, 71,135,108,114, 40, 47, 72,114, 14,133, 12,242,232,241,124, 50,198, -159,100,108,244, 60,130,175,141, 97, 78, 56, 44,136,134, 89,212,189,202,168,215,134,189,216, 71,149,216, 23, 22,152,117,206,119, - 13, 20,129,169,114,238, 53,146,161, 17,118,171,244, 81,157, 70, 19,254,230,192, 47, 48,129, 17,175,115,215, 85,251,114, 55, 22, -193,181,160,138,166,113,169,101, 60, 15, 27,137,210,189, 51,122,247,246, 51,126, 13,186, 17, 25, 78, 28, 64, 92,102, 77,206,109, - 77,206, 92,232,176,138,124,181,243,225,162, 99,225,239, 87, 35, 93, 26,239,111,249,223, 33,155,190,218,105, 72, 95,146,177,230, -147,138, 20,139,140, 87, 48,200,144, 72,148,143,187,103,189,202,202, 72,157, 70, 17,134,112,118, 84, 3,201,149,211, 50,114,109, - 20,242,213, 66, 4, 38, 23, 33, 87,114, 90, 55,237,255, 78, 81,185,191,108, 67, 12, 54,222, 88, 18, 11, 76, 32,188, 69,214,110, - 48,250,113,211,208, 69, 47, 24, 48,242, 91,232, 23,143, 16, 5, 87,214,197,115, 80,104, 35, 23, 35, 77,141, 48,181, 55,186,214, -119,139,164, 72, 51, 42,188,107,173, 56,165, 57,164, 17, 1, 18, 55, 63,161, 67, 89,122,197, 80,202,231, 59,161,216, 58,212, 85, -115, 79, 13,183,214,165,199,156,108,158,226,160,148, 35,207,231,169,227,220, 33,201,137,110,136,229,124, 90, 13,129,112,254,250, -183, 19,231, 83, 76,226, 60,114, 34, 8, 8,138,119,119,148,201, 77, 17,117,148,112, 15,210,149, 39,182,179,150,188,166,223, 24, -164, 65,105, 60,184,168,255,219, 59, 29, 90,117,208,200,233,231,198,153, 80, 56, 15,241, 61,194, 49, 23,172, 71, 91, 85,110, 40, - 25, 79,130, 46, 64, 62,118,214, 97, 37,201,108,237,254,191,130, 79,112, 16,180, 86,207,233,124, 57, 85, 9, 41, 11, 14,111,109, - 26,195,139, 92, 25,223, 88,234,202,235,200,140, 52,138,114,230, 65, 79,140,160, 69,194, 58,243,184, 67, 71,117,164, 77, 85,245, - 79,170,132, 25,136,138, 73, 89,159, 16,234, 6,224,180, 78, 61,236, 81, 20, 29, 64,127,236, 14, 99, 16, 15, 26, 73,175,186,193, -247,165, 65, 94,245,249,131, 54, 95,105,201, 48,230,159, 61,108, 36,125, 62,215,115, 24,249,234, 85, 11,166,133, 78,212,247, 98, - 48, 41,113, 48,100,165, 53, 22,134,124, 68,215,132,237,199, 54,181, 60,215,158,193,229,241,152,193,244, 17, 54, 43,114,236,101, - 20, 63,233,180, 52, 12,131, 82, 46, 48, 29,128,116,228, 74, 80,158,173,207, 97,135,134, 41, 28, 88,238, 74,124, 51,196, 5, 84, -199,209,227,167, 24,141,197,231, 40, 56, 60,164,117,197, 50,172,223, 15,236,249,242,158,180,199,189,134,224, 37, 52,116,113,164, -231,152,229,133, 99, 13,175,100,209, 52, 7, 24,210,196, 40,203,185, 84, 82,164,198,197,136,223, 64, 56,230,200, 17,196, 94,184, -218,120, 57, 57,148,228, 81, 19, 7,129, 21,242,240, 41, 5, 56, 61, 26, 98, 10,145,149,111,221,236, 55, 34,142,114,242,181,241, -211, 14,133,166,128, 83, 51, 35,165, 80, 63,169,156,171, 11,196, 36,223,138, 74, 72,192, 70,217,251, 20, 57, 28,162,117,201, 33, -245,104, 40,109,138,168,162, 92, 39,110, 16, 37, 51, 85,164,205, 17,163,158,111,250, 45,131,225, 57, 60, 93, 97,192, 21, 66,205, -245, 48,114, 7,187, 72,143,132, 31,228,148,191,140, 37, 87, 49,138,182,222,184, 56,231,154, 98, 41, 98, 15,175, 51,114, 24, 68, -117, 45, 11,222,201,154,244, 30,175,225,117,153,102, 89, 97, 43,141, 56, 76,227,185, 34, 31,190, 78, 7,165,249,122,230,140,145, -146,241, 66, 74,202,251,218, 28,239,143,230,236,115,206, 85, 57,246,218,185,178,230,111, 12,145, 31, 31,136, 74, 72,159, 84,145, -186, 11,181, 61, 10, 9, 21, 37, 49,160, 34,211, 35,141,168,130,153,238,149, 65,203,149, 74, 91, 6,233, 48,117,224, 77,196, 97, -229, 57, 80,164, 32,173,235,210, 51,254, 88, 87, 83, 51,238, 84,184,208, 32,131,238,197, 98,146, 53,147,121,165,131, 37,128,225, - 58,253, 49,178, 8,169,117, 30, 62,146,101,172, 32,243,213,245,230, 84,193, 8, 46, 43, 21,171, 8,117,145,229,209,242,160, 67, -169,137, 9,145,186,166,107, 99, 91,221,112,164,177, 69,169, 78,132, 40, 93,197,133,242,176, 14, 41, 19,204,152,176, 9,132,172, - 96,148, 65, 96,131,162, 30, 94,175, 51,214,202, 71, 99,174, 40,134, 75,228,202, 12,130, 69,128,137,135, 14, 81, 59, 79, 58,140, -242, 77, 32, 47,185, 84, 55, 92,229,238,136, 40, 70,186, 45, 44,173,135, 20,185, 58,143,200,148, 17, 74,100,245, 74, 14, 25,151, -162, 66, 66,128, 21, 31,255,250, 90,102,223,172,197,101, 48,179,136,175,203, 87,155,229,115,170,166,161, 63, 30, 88,193,121, 90, -133, 74,196,136,201,159,175, 80, 94, 71,207, 33, 18, 74, 71, 95,217,199, 65, 49,174,126,189,220, 11,114,230,118, 50,236, 52,186, -199, 8,214, 43,193,173, 51, 74,190, 28, 32,149,211,165,127,109, 22,121,254, 26,133,129, 79,221, 26, 41, 32, 77, 17,186,139,208, -180, 39, 94, 75,138,228,213,249,165,180, 7, 30, 38, 64, 59, 76,240, 53,150,231,174,157, 9,230,213,234,121,131,231, 66, 58,132, - 70, 94,207,157,226,218,168, 39, 39, 55,212,123,143,238,185,178,114, 47,207, 91,119, 39,133, 68, 77,237,174, 31, 63,211, 24, 43, - 23,184, 2,130,164, 75, 33, 89,222,156,200, 31,109,176,207, 28,156, 57,221,189, 59,114, 18,137, 13,210, 32, 58,172, 34, 66, 20, - 39,186, 66,150, 20, 81,214,177, 60, 2, 65,221,104, 68, 86,145,104, 60,215,208,146, 93,172,143, 99, 50,141, 40, 96, 69, 9, 37, - 70, 52, 26,253,174, 54,180,231,175,253,110, 16, 75,137,239, 21, 71, 33,103,111,183,162,241, 81,148, 98,196,231,105,141,197, 32, -226, 15,151,213, 49,129,132,214,194,116,140,118, 73, 85,202, 73, 86, 11, 51,188,222,117, 93,170, 1, 47, 60,111,239, 17, 78,120, -168, 96,110,144,148,216, 44,146, 17,205,161,109, 71, 21,162, 16, 12, 70, 82,131,243,231, 96,140,137,100, 76,147, 69,226,185, 1, -175,141,186,214,177,114, 76,237, 36,114,156,207,143,101,130, 36, 35,233, 15, 30, 25,207, 90, 40,199,115, 18,204, 32,151,154,195, -172,188, 98,110,137,184, 56, 15, 40,115,224,148, 24,199,161,164, 51,231, 45,248, 72,153, 34,140, 46,148,120,232, 86,244, 24, 32, - 81, 36, 4, 64, 66,194, 93,192, 16,178, 48,162,249,126,110,212, 57,167,251,175,136, 90, 62, 47,160,185, 69,117, 28, 76,181,230, -212,103, 36, 7, 22,142,200,131, 64,162,138,227, 32, 53, 70,165, 19, 43, 18,106, 22, 71,114,170, 9, 70, 15,191,193, 18,156,180, -113,221, 1, 20,218,222, 37, 12,111,201,197,163, 56,106,231,217,179, 92, 44, 65,249, 20, 33, 85, 36, 54, 29,195, 62, 44,204,190, -125,110,208, 90,240,185, 88, 23, 29,114,225,213,245,244, 5, 82, 52, 2, 65,175,151,149,174, 81, 83,138,243,201, 81,137,172,213, - 10,122,190,254,183, 84,212, 43,100,154, 45,129,196,141,166, 57,156,115, 69,192, 74, 25, 57,212, 59,162,238, 80, 65,101, 45,222, -228, 13,185, 79,119, 57,215,135, 32,193,129,201, 4,131, 76,197,124,208, 35,131,125,207,142,236, 27, 69,108,132,219, 37, 87,176, - 11,156,158, 58,181,101, 66,237,132, 35,129,191,245,254,197,142, 36,108,202, 40,143, 12, 21,244, 32, 15, 45, 86, 10, 85,186,169, -115, 32, 66, 12, 27,133,248, 92,163, 56,149, 65, 76,141, 24,172,216, 64,100,241, 23,175, 57,193,148, 75,240,131, 36,206, 22,172, -211,210,104,151, 50,154,249,113,200,110, 29, 23,196,119,206,139,103,208, 72,125,160, 46,110,213, 2, 31, 66,132,221,161,224,167, -246,116, 63,248,231, 90,181,138,174,170,119,212,201, 80,231,150, 91,147, 94,133, 27, 10, 57,215,108,131, 53, 76, 77,130,136, 26, - 23, 35,156, 72,113,141, 69,239, 66,157,183, 33,207,198,174, 9, 59,100,120, 96,252,137, 8, 65, 40,206, 55, 6,225, 97, 68,204, -204,158, 69,156, 11,195,168, 81, 14,165,101, 32, 7,187,176,163,169, 6,245,172,148, 96, 37, 34, 89,126, 60,147,226, 84,200, 61, -254, 94,166,189,110,204,128,140,199,226, 50,144,136,139,247, 15,136,112,236,218,249, 87,105,167,144,202, 98, 3,207, 41,136,141, - 38,168,156, 80, 66,101,111, 4,169,164, 96, 69, 4, 83,211,149,145,122, 30,237,231,169,148,176, 17,218, 88, 91,239,161,116,238, - 76, 42,117,114, 46,152, 77,129, 17,138, 50,187,245, 61, 87,149, 57, 27,196,117,184, 70,187, 50, 61, 5,221,176, 25, 82,104, 24, -136, 8, 12,153,136, 26,104,148,228,170,156, 59, 73, 57, 40,194, 37,159, 65, 68,224,216, 85, 26,220, 56, 16,167, 38, 5, 54,236, - 69,130, 88, 10,177, 32,128, 96,168, 43,229,127, 93,218,143, 28, 0, 49,132, 30,126, 83,230,112,238, 12, 9, 94,235,200,253, 11, -149, 2, 16,237,120, 39, 49,227, 42,226, 32,228, 32, 46,180,190,233, 5, 68,158, 40, 72, 76, 33,136,242, 42,108, 66,192,212,152, -178,180, 81, 74, 49,213,146, 40, 43,141,136,149,171,253,114, 69, 62,189, 85, 58,109, 40, 18,101, 37,200,221,170, 14,134,131,175, - 78, 41,186,231, 17,101, 70,213,133,232,222,140, 34,164,198,240,160,130, 43, 50,225,213,203,164,132,102, 20,239, 21, 31,180, 20, -215,224,164,224,148,120,135,223,247,210, 48,193,244, 17, 83,172,130,240,226, 84, 28,231, 69,180, 83, 46,148, 52,170,168,147,243, - 41, 43,103, 5,196, 8, 13,139, 4,189,181, 69,151, 94,226,212, 58, 73,136,189,200,147,132, 52, 83, 16, 64,233, 90,140,191, 60, - 90, 42, 74, 41,164,212,178,213,144, 71,114, 26,102,118, 20, 27,208,165,176,241,123,157,107,160, 67, 23,181,211,253,141,207, 13, -181,198,176, 82, 29,181, 92,136, 26, 81,242,170,163,172,124, 93,215, 44,173,129,157,200,201,136, 81,148,162,142,180, 30,195,188, -161,192,125,193, 45, 24, 24, 78, 42,163,186, 24, 49, 74,233, 69,115, 35,114, 14, 73,221,130,168, 54,204,155,215, 37,106, 40, 96, -243, 14,220,188,110,181, 76,174,104,103,234, 63, 99, 37,117, 59,202,115,146,122,238, 26, 17,147, 36,182,183,158,175, 39,162,121, - 8,138, 57,206,140,148,203, 9, 48,177, 26,250,141,233, 36,131,193, 75,163,232,200,231, 25,147, 83,148,177,147, 11,231,197, 27, -116,102, 83,148,156, 17, 4,211,188,238,156,210,152, 70, 34,206,136, 16, 8, 53,208,213, 22,247,160,165, 77, 80,111,150, 93,100, -232,151,210,187, 4, 47,222, 82,232,170, 15,156, 69, 46, 20,171,106, 65, 35, 87, 11,121, 20,134, 26, 81,251, 58, 57,188,226,243, -229, 36,160,130, 0, 22,254, 57,142,155, 42, 67, 96,204,100, 45,210,213,100, 36, 7,148,129,200, 4,113, 18,142,240,228,152,110, - 67,237,172, 4,186,131, 71, 58, 14,224,148, 15,246, 4, 0,157, 25,242, 0,136, 84, 69, 80, 29,190,180,223,228,106,128, 14,192, - 50,204, 35,199, 14, 70, 12, 28, 28,108,206,134,167,100, 84,157, 70,108, 97,140, 29, 3,100,145,141, 69,168,205, 23, 10,154, 68, - 12,154,228,229,138,106, 16,146,163,194, 29,175,188,230, 86,250,109, 21,215,166,197,225, 25, 75, 95,184, 3,242,137, 74,253, 15, -201,120, 53,188,182,122,103, 20, 54, 15,156, 10,114, 73,167,164,197, 91,241, 83, 53, 51,236, 82, 54, 65,242, 42,145,201,206, 80, -231, 29,109, 19,171, 95,188,157, 50,106,223, 52,117,197,126,206,218,168,166,231,225,116, 67,158,147,162,235,135,130,211,149,139, -128,197,170, 23, 2,156,241,205,145,196, 58, 88, 50, 16,235,208,229, 93,158, 14, 98, 72, 6,209, 67,165,104, 84,143,177, 52, 4, -107,242,239, 84,120,100,236,247,214, 17,157, 40,115, 30, 83, 45,112,114, 66,214, 22,138,179, 89,249,189,241, 28, 24,205,136,215, -250,204, 94,220,240, 64, 40,254, 94,149,175,209,156,234, 58,230,232,216,235, 46, 24,178,218, 81, 38,242,249, 41, 15,127, 14,187, -132,149, 57,191, 73, 65, 64, 75,249,167,112,237, 57,177, 70,124, 38,199, 71,180, 1,193, 96,170,212,212, 42,168,206,116, 1,121, - 73,198,160,203,196, 20,122,113, 69,244,239, 13, 56, 71,227,110,173, 45,224,125, 18, 95,166,196,204, 32,167, 37, 37, 73,181,139, -203, 64, 15, 93, 64, 2,242,198, 25,105,252, 24,189,115, 1,241, 41,103,104,100,175,155, 82, 51,158,243,220, 63, 4,134, 77, 51, -239,202, 25,146,213, 90, 23,117,100, 51,150,222, 24, 35, 70, 26,105,111,176, 74,202,113, 84, 66,209,209,113,170,213,214,170,124, - 45,168,202, 41, 75, 90,199,233, 58, 40,228,254,140,175, 52,167,182,162,151, 43,100, 87,195,235, 89, 67, 21, 71,235,171, 67,218, -121, 82, 61,119,142,142,125,129, 2,140, 24,159,186,158, 89,148,223,128, 50, 74, 43,149,206,100,116, 15,244,243,163,234, 55, 80, -145, 26, 91, 58, 15,122,159, 8,128, 13,218,255,204, 20,202, 0,141, 47,163, 11,200, 3,179, 68, 82,162,178,171,213, 76,177, 0, -189,169,244, 41, 64, 77, 71, 68, 26,142,142, 35, 12,122, 20, 30,132, 28, 92,190,159,154, 4,199,177,241, 26, 34,141,180,146,253, -190,174,212,152,107,135,250,128,249,254,120, 95,171,177,161, 49,199, 5, 84, 40, 25, 38,199, 48,200, 92, 83, 57, 87, 59, 13, 64, -157, 52, 57, 69, 36,169,122,194,101,168,158,162,220,225, 23,253,188,168,196,164, 56, 4,202,202,167,243, 42,130,206,163, 6,226, -208,105,195,129,131,176,158, 91,134,127, 0, 79,185,213,158, 83, 77,246,113,144, 3,231,142,155,175,185,213, 93,146,214,149, 87, -140,145, 67,104, 44,106,199,120,195,134,150,124,226,186, 9,198,180, 90, 59,186,254,158,154, 97, 46, 92,146, 25, 19, 4, 29,180, -207,217,148,139, 92,134, 76,242, 90,170,144,131,100, 10,229, 82,136, 97, 25, 8,114, 6,123, 22, 93,135,146, 41, 3,205, 45,250, - 92, 99,199, 4, 43, 12, 56, 7,155,229, 30,163, 2, 23, 58, 36, 6,186,139,138,108, 70,169, 31, 78, 66,221, 55, 71,194,153, 34, - 54,158,195,230, 34,247,194,192, 55, 13,209,218,211, 84,102,230, 82,234,166, 48,128, 20, 26, 98,152, 65, 52, 28,145,130, 46, 57, - 27, 10,195,167,239,149, 32, 19,219, 13,115,226,213,166, 62,214,226,148, 77, 59,167, 62,112,142,171,205,173,230,180, 12,231,117, -158,243,147,230,110, 69, 65,213,171,254, 92, 43,143, 42, 13,129, 15, 3,109,125,201, 89,185, 90, 41,110,147,165, 44,155,173, 55, - 91, 50,165, 99,251,203, 16,194,247,225,191, 13,138,110,150, 92,156, 87, 8, 57, 75, 18, 61, 26,159,195, 20, 19,115,224,142, 28, - 68,120,165,130,151,230,112,155,213, 21,228, 50, 71, 52,148, 76,161,218,188,199, 2,165,240,175, 3, 23,233, 15, 7,159,231,245, -168, 75, 40, 67, 35,138,235, 78, 50, 46,171, 18, 65,221,144,255,154,152, 67,185,131,210,104,117,218,103,138,131, 45,163,186,110, - 31, 78, 72,138,137,233,208,252,184,174,163, 61,199,126,130, 24, 30, 69, 10,162,235,240,124, 92, 96,138, 7,174,151,194,248,160, - 1, 92,111, 98,245,131,234, 17,134,102, 45,156,245, 75, 15, 4,204,218,158,165,238,104,233, 92, 99,117,130, 73,227, 90, 56, 54, -218, 65, 45, 32, 40,131,116,106,246, 53,172, 34,134, 74,108, 68, 86,127, 31,186,196, 69, 68,140, 50,181, 62, 73, 13,102,242,206, -113, 93,221, 26,112,108, 35,105, 25, 29, 9, 53,198,197, 38,100,218, 70, 52,247,248,115, 86,115, 43,103,117, 32,214,252, 8,180, -178,234,179, 7,245, 66,213,219,111,201,160, 10, 81,157, 81, 90,153, 3, 95, 87,231, 78, 89, 14, 75,225,179,252,152, 62, 94,191, - 30, 62,223,117,205,133, 88,200,165,162,172,239, 46,114,227, 13,157, 1, 10,157,152, 40, 68, 34, 5,124, 42, 38,171,113,175, 72, -119, 70,185, 23,161, 89, 14, 1,112,158,163, 41,206,129, 96, 67,217,141,230,235, 4,212,153,184,197, 41,129, 41,180,224, 14,164, -179, 14, 68, 18, 91,148,230, 17, 16, 51, 3,214,198, 70, 41,134, 43,227, 27, 90, 23,114, 70, 74,170,239,151, 52,122, 7,112,136, -234,141, 18,122,242,118,173,156,171,190, 49, 12, 15, 13,108, 78,116,171,197,123, 6,202,137,102,205, 28, 95, 87,242, 51,242, 71, -100,250, 0, 0, 32, 0, 73, 68, 65, 84,194,148,215,235, 92,146, 84,181,226,153,188,101,150,186, 73, 45,102,203, 42,151, 50,226, -167, 1,161,140, 42,102,125,138,192,141,143, 4, 89,138,223,139, 70, 61,212,103, 31, 70, 38, 89, 6,255,243, 91,179, 33, 68, 29, -125, 10,236, 96,101,215,107, 74,194, 16,133,210, 63, 14,198,218,107, 20, 36,162, 90, 91,134,180, 86,242,202,149,214,116,101,249, -249,169, 68,227,106,143,225, 60,125,145,114,211,169,111,134, 27,214,193,199, 8, 12,209,177,246,196,185,176, 6,179,214,169,206, -208,176,118, 32, 35, 58, 23,227, 23,115,178,153, 83,213,153,230,220, 26,171, 25, 31,109,254, 37,126,109,120, 82,104,121, 4,177, -119,238,130,174,123,200,121,168,215,217,144, 15, 93,173, 39,154, 87,127,132, 86, 46,131,198, 92,173, 70, 93, 28, 74, 51,189, 6, -123,152,251, 46,233, 46, 16,181, 16, 53, 87, 16,227,106, 39,195,134,215, 99, 27,105,231,239,179,195,106, 91, 19,239,129,142,111, -144, 67, 78, 55, 57,216,134,128,234, 72,150,199,138,165,160, 73,209, 38,137,228,187, 3, 42,202,141,145,160, 14, 18, 73,183, 34, -143, 34,210,101, 51,186, 97, 29,232,183,120,245,141, 31,211,148,175,143,163,186,202,178, 90,156,199, 90,215,188,222, 3,247,121, - 31, 83,146,170,244,158, 71,211, 15,110,152, 7, 37, 39, 49, 95,157,179,243, 77,163, 30,122, 99, 58, 45,160,222,252,159,230,182, - 91, 77, 18,212,160,120, 34,143,107,230,207,160,155, 17, 44,196, 4, 73, 70,241,245,213,158, 88, 68, 33, 31,200, 85, 46, 90, 2, -185,196,203,145,166, 8,153,161,182,133,136,209, 17,129,103, 93, 97,216,242, 18, 58,134,203, 90,172, 38,213, 58, 18,151,213,106, - 83,145, 94, 40,223,135, 76, 77,142, 98, 23,180,124, 78,119, 97, 19, 30,131,207, 35,252,158,149,225, 52,147,228,135,156,223,181, -179,220, 98, 34,183,144,164,193,166, 77,168,250,168,215,196, 60, 41, 13,251,224,244, 83,164, 84,204, 67,225, 50, 98,207,228, 58, - 29,149, 28,240, 85, 71,104,100, 21, 26, 87, 24,120,102,189, 1,133, 18,188, 20,189, 40,177, 87,141,181,143,176,188, 92, 96, 60, - 18,135,198, 28, 6, 90, 1, 47, 65,131, 93,165, 62, 56, 26,129, 36, 76, 67,217,122,229, 24,149,184, 32,174, 68, 81,113,144,170, -148,100,129,118, 53,212, 30, 7,121,126,205,137, 19,121,174,132, 9, 56, 18,123,168, 91,201,166, 48,222, 48, 88,198,168,214,186, - 4,164,166,112, 74, 80, 55,118,162,162,181,107, 93,237, 4,235,138,231,115,103, 39,111, 5,155, 87, 69,149,223, 35, 33, 82,246, - 78,138, 30,185, 34,226,141, 85, 43,229,218,251,121, 85,147, 30,205, 1,208,217, 98,206,135, 42, 15,201, 26,121,184,128, 52, 81, -134,104,169, 84,180,100,117,230,133,187, 65, 4, 33, 7, 43,201,152, 35,107, 11,172,145,125, 46,227,221, 90,159,206,185,130,156, -236,144,210, 45,117,203,192, 82, 17, 48,104,241,103,208,141,254,102,183,202, 24,174, 82,218, 73,196, 25, 23, 67,192, 66,185,108, - 68, 25, 11, 82, 38,186, 13,115, 86,163,185,186,102,186,181,177,212,240,101,141,111, 80,253,185, 65,111,197,213, 72, 1,141,230, -245, 36,181, 9, 44,216,215, 56,156, 3,180,150,164, 87, 71,234,233,191,253,162,181, 3, 99,145, 27,144,142, 27, 36,186, 44,242, -236,216,164, 82,173, 16,253,166, 40, 87, 39,146,205, 96,220,146, 72,201,196,237, 92,164, 18,244, 38,166, 56, 59,133, 21, 57,144, -118,172,184,226,117, 10, 26,235,144,228,132, 36,197,176, 84,205,192, 1,174, 55,212,229,234,226, 25,144, 30,234,183,213, 40, 35, - 85,116,168, 42, 24,130, 96,140,110,118,154, 92,229,192,203,240, 53,233, 67,248, 61,119,138,152, 11,117,243,134, 70,189,140,212, -248, 39, 94, 68, 75,101,183,126,130,164, 13,139, 82, 37,187, 90, 79,185,174,218,208,242,255,118,131, 92,107, 25,113,107, 41, 26, -175,200, 56,138, 75,115,205,101,173,107, 53,175,207, 68, 81,153,206,247,251, 78,221,233, 40,235, 2, 23, 91, 93, 86,199,200,250, -213, 18,215,160,141,225, 73,148, 89,110, 94, 8,142, 76,104,168, 18,200, 67, 28,228,108,141, 39, 68,165,112, 90,197,116,178,206, -102, 65, 5, 76, 33, 80, 63,222,222,145,203,231, 7, 5,242, 39, 7, 35,171,232, 77,148, 3,166,132, 64, 72,182,105, 59, 72,179, - 61,169,138,139, 36,133, 61, 31,133, 17, 13,243,223, 94,225,176, 76,149, 17,164, 66, 20,202,191, 65, 82,140, 35, 92,226,143,184, -124,109,113, 16, 28, 98, 42, 20,218, 64, 60,232,162,216, 58,198, 70, 48,145, 83,164,168,148,203,212, 7,169, 60, 23,164,123,169, -110, 28, 17,175,117,247, 74, 88,127, 61,234, 90,207,111,137, 65,173, 79, 83, 50,134, 10,126,106,244, 89,218, 14,175,132,186,127, -113, 65,181,190,182, 75, 65, 41,137,164, 76,151, 20,247, 84, 84,121, 46, 67,161, 52,112,247, 61,153,211,178,171,114, 44,142, 60, -227,158,153,195,156,149, 40,244,212, 29, 40,111,189, 34,231,155, 43,129,213,125,125,215,193,223, 57,179,181,213, 26,175,229,217, -172,106, 79,120, 80,216, 61,255, 91,228, 96,185,163, 38,227, 29, 54,148, 84, 84, 30, 42, 82,151, 33,213, 28,110,213,251,175,118, - 74,176, 22,193,240,236, 91, 83,180,118, 40, 34,109,180,197, 81,188,247,232, 89,228,110,185,240, 81, 49,115,242,150,131, 30, 51, -133, 25,153, 75, 16,230, 82,177, 2, 23, 34,193,218,225,177,153, 87,237, 50,114,161,100,164,181, 64,218,202,136, 78, 32,255,219, -156,105,161, 27,226,152, 99, 23,225, 96, 97, 76, 48,168, 4,113,125, 74,149, 84,141,106, 98, 11,212,188, 9, 11,149, 85, 20, 78, - 74,109,114,146, 50,210, 78, 29,156,106,135, 40, 80,237, 98,153, 37,173,117, 10,155,228, 37,231, 86,106, 13,199, 77,196,141,183, - 22,110,230,236, 70,242,159, 45,248, 94,168, 94, 19,146, 85,185, 80,179,181,100, 42,201,227, 65,133,133,132,139,171, 29, 86, 9, - 96,166,132,215,156,120,167, 62,103,245,214, 71,195,101, 46, 84, 75,159,116, 75,119,206,197,122, 95,147,109,250, 94,211, 95, 27, -186,184, 16,165, 75,150,107,215,170,139,176,118, 85,158,142, 66,201, 18, 82,105,168,202,143,198,138,136,168,107,158,109,218,132, - 2,217, 73,193,100,214,221, 12,195,214,165,165,166,126,236,247, 27,198,159, 99,164,237, 95,178,197,157,139,173,138, 51, 4,129, -130, 19, 22,143,168,199, 47,185,160, 68,126,252,227, 76,104,228,194,253,150, 60,108,132, 83, 27, 87, 17,138, 78,183, 54,198,129, -216,172, 94,155, 7, 57,247,200, 25, 42, 72,170, 45, 13, 18, 77,159,153,106, 85,241,129,247,204,214,107,196, 2,118, 73,113,176, -201, 35, 27, 73, 73, 68,135, 44,240, 31,138,126, 24, 89,112, 39,214,181,211,187, 85,121,105, 65,225,147,148,226,138, 72,134,234, - 17,184, 92,230, 91, 9,203,190, 31,130, 31,119,131, 78, 91, 86, 34, 95,200, 7,204, 9, 75, 13,175,103,229, 15,174,134, 87, 50, -195, 80,120, 43,203,126, 85, 28, 16,243,153,131, 92, 62, 97,148,233,154,223, 32, 45, 41,171,219,230, 17, 81,211,123,162, 81,152, - 81, 98,217, 8, 69, 84,162,139,158,118,174,100,198,217,223, 16, 41, 8, 13,122,212, 92,166, 49, 20,107,224,155, 6,156,199,153, -163,174,138, 0,213,136, 43, 60, 67, 69,111,229,212,162,200,235, 45,251, 47,240, 27,144,245, 13, 8,224, 69, 47, 44,106, 29,114, -151,180,177,169,164,227, 68,185,197, 40,208, 66, 89, 61,106,152,148, 46, 83, 91, 10,139,201, 19,221,216, 87,161, 73, 70, 5, 21, - 53,200, 89,205,183,211, 28, 85,102, 76,136,224,156,119,106,144,128,212,104,160, 83, 26, 36,145, 6,213,175, 16, 17,192,250,205, -146,216, 84, 68, 65, 73, 30, 54, 18, 51,133, 40,232,133, 19,167,168,159, 56,214, 81, 67,218, 37, 60, 54,164, 38,138, 22, 38, 26, -157, 57,137, 68,181,122, 62, 14, 20,255,169, 36,134,230,218,233,173,121,207, 35, 4,187,124, 13, 68,163,136,118, 7,175, 8,223, -135, 92,157, 32,181,206, 74, 98, 71, 67,137, 83,202,178,198, 10,103,235,156,212, 90,127,205,101,106,228, 72,130,230, 81,172,141, -191,199,148,136, 85, 81,190,119,146, 27,165, 92, 67, 59,192,239, 5, 98,235, 35, 43, 23, 8,110, 14, 64,223,167,234, 14,237,230, -215, 34,204,197,126,216,217, 62,225,203,201, 25,166,234, 48, 98, 37, 19,229,201,165, 95,171,127, 73,190, 54,193,194, 8, 72, 86, -252, 13,147,241, 64,104, 8,226, 72, 84, 84,195,128,208, 39,161, 53, 41, 1, 96, 83,181, 64,141,156, 28, 19,190,183,142,148,195, -126, 97, 98, 44,143, 90, 68,199,183,166, 13,117,218,218,194,150,178,118,186, 96, 48,183,137,115,138,204,154,137, 25, 13,220, 90, -226, 47,131,136,152,185,161,162,152,191,158,113, 72,178,225, 71,160,229, 38,177, 23,201,106,241,195,124,207,144, 39, 87,233,230, -179,242,193,108,170,117, 79, 36, 63,137,233,113,102, 30,236,239, 89, 53, 56,122,103,147, 29,141,105,164, 20,116,244, 17,201,209, - 84,123,238, 64,155, 32,137,236, 9,169,218,244,166, 59, 76,190,124,192,124, 15, 2, 20,178, 10, 94,116,174, 13,131, 43, 60,216, -117, 43,127,211,134,226,250,220,160,151,249, 93, 94,121,238,147,201,100, 37, 59, 94,178,254,190, 99,100, 58,150, 84,166, 86, 86, - 2, 0, 76,221,234, 49, 90, 65, 4,204,181,192,199, 38,237,170,146, 63, 83, 68, 85, 67,141,129, 34,239,154,137,232,144,238, 2, -193,163,110,106,194, 11,178,197,221, 34,248,233,166,231, 6,158,110,222,133, 10,117,191, 99,242, 61,179,253,198,238,192,212, 85, -240,115, 5,199, 23,141,107,104, 80,125,160,226, 57,130,118,223,105, 31, 9,228,101,104,234,220,165,112,236, 48,218,251,195,136, -182,228, 64,140, 33, 67, 45, 79,125,213,125, 31, 77,121, 49, 13,206,161, 77,196, 9,194, 61,198,140, 34, 78,105,174, 72,211,160, -231,236,100,225,146,176, 83, 55,204, 17,229, 39,196,141,149, 83, 14, 83,157,176,172,145, 75,212,167, 51,107, 6,188, 81,114, 90, - 50,186, 29,220,104, 4,199,177,141,107,236, 14, 71,161,109,165,244,209, 40,171, 38,190,230,195,243,243,166,188, 7, 56,178,238, - 99, 20,144, 26,113,133, 84,179,106,128,171, 35,144, 92,233, 82, 17,140,131,147,226,144, 36,137,211,253,169, 69, 80,184,109,212, -165,228, 54,228,253,218, 99, 78,154, 77,161,228,201, 97, 76,212, 33, 47, 43,103,204, 96,252,146, 81,117,197,122, 75,168, 65,174, - 6,106,170,123,196, 81,110, 92,141, 85,252,126, 2,172,199,253, 75,246,121,133,196, 76,140, 41, 93,137, 12,177,113, 88, 47,238, -213, 78,121,228,101,151,201,194, 82,128,180,245,174,228,138,112,190,255,187,141, 78,143, 1, 3,226,130, 35,152,181,238, 37, 83, -180,240,101, 36,241, 53, 84, 98,104, 14,206,151,252,214,202,114, 74,136, 67,232,195, 16,196,216,188, 88, 83, 70,236,204,130, 54, -202, 82,219, 7, 98,191,175,130,223,149, 20, 64,107,156,130,188,191,246,161,186,168,173,144, 38, 44,212,189,100, 53, 81,111,212, -240, 83, 9,135,183, 35,127, 12, 12,141,126,215,132,205,154,220,142,180,243,232, 97,178, 51, 83,212,247,165, 70,189, 47, 55, 75, -238,234, 60,168, 20,186,253,185, 33, 79, 75, 84, 50,248,217,255,109, 52,219, 76,249,231, 37,146,103, 20,161,136,117,224,245, 88, -134, 72,192,161, 20, 31, 41,154, 86, 4,167,203, 4,177,152, 40, 9, 26, 8,126, 96, 87,117, 82,203,234,196, 67, 19,149,124,222, -172,234,114,150, 8, 29,121, 10, 2,177,196,175,128,225, 37,149,111, 21, 78,169, 80,161, 10,151, 56, 32,169, 85,173,207,213,151, - 12,221,168,179, 14,105, 18, 32,165, 5,191, 53, 28,200,148, 22,144,200, 57, 41, 57, 28,245,151,173,214,246, 71,238, 84,134,177, -145,140, 19, 32,112, 69,237,249,128,104, 7, 90,209, 11, 26, 69, 35, 24, 70, 30, 9,165,177,177,133,115, 25, 34,179, 96, 63,114, -153,206,230,190,209,208,238, 47,235,200, 77,211, 47, 24,148,121, 85, 68, 36,201, 56, 53,185,115, 86,178,212,243,107,105, 35,105, -206,185, 56, 71, 37,111, 86, 36,137, 1,173,206, 16, 7,226,183,230, 91, 53,149,204,106,246, 51,125,251,178,245, 39, 55,175, 41, -223, 87, 83,233,222, 80,126,180,150,177,117,148,250,216, 11,173,129,172,101,245,110,182,238,254,172, 42,135, 54,240,125, 9, 98, -253,117,133, 52,112,227, 88,176,213, 81,246, 17,207,255,187, 73, 70,206, 66,117, 31,244, 80, 68, 71, 40, 32, 13,234,140,178,238, -111,214, 5, 99, 28,248, 51, 89,163, 74,150,144, 30, 12,223,229,209,138,242, 24,123,168,100,198, 31,208,102, 75, 4,215, 25,239, - 12,187,112, 53,138, 74,134,116,141,234,158, 36,154,169, 6,130, 18,245, 60, 10,206, 12,145, 55,234, 99,236,240, 85, 58,226, 53, -148,176,106, 81,178,148, 12,225,243,109,167,218,114, 50, 90,245,224, 7,105,157,154, 27,160, 66, 81,104, 69, 77,122, 25, 37, 7, - 15,142, 19,231,186,217, 47,215,185, 1, 59,181, 28, 55,151, 12,214, 72, 15,223, 85,206, 78, 11, 94,205,189,248,186,131, 17, 87, - 82,175,190, 25,200, 56,210, 32,176, 17, 90,110, 25, 33, 59, 16, 51,145, 65,100, 25,115,248, 13,167, 69,184, 61,190,177, 75, 91, - 38, 99,155, 87, 35,212, 45, 41, 9,101,122, 69,141,120,108,253, 90,177,210, 21,161,169, 81,166,177, 28,120, 34,126, 86, 93,241, -176, 30,221,146, 21,105,157,117, 77, 52,214, 69,244,204, 92,200, 54, 55, 13,123, 3,105,200,149,194, 86, 85, 90, 48, 86,139,131, -104, 52,234, 6,104, 93, 86,195, 44,146,245,124,166, 1,225,104,213,163, 70, 26, 90, 54,167,201,234, 95,195,185, 89,197, 67,168, -157,151,213, 45, 65, 45,198,252, 18, 14,145,127, 49,175, 11, 22,185, 67, 71, 25,106,145,165, 17,234,117, 49, 22,173,107,168,201, -161, 75, 30,178, 28,180,131, 31,123, 10,100, 62, 77,252,119,145, 97,158,162,115, 65,187,116,210,176, 89,139, 40,173,170, 71,231, - 40,223, 93, 62,239, 27,249,248,116,157,196,182,192,153,106, 91,214,222, 57,166,204, 36,249,216,218,135, 28,190, 80,214, 35, 69, - 90,220, 93,251,249, 81, 56,134, 80,138,221,166,116, 29,139, 71, 14, 34,235, 61,254, 24, 5, 78, 4,165,122,195, 88,222, 26, 56, - 59,241, 53, 21, 67, 74,252, 36,145, 60,245,201,208,110,133, 10,255,247, 72, 21, 56, 46, 32,194, 54,244,184, 55,113, 31,247,119, - 71,149,230,242, 92, 98, 94, 94,172,163,219,173, 19,125, 89, 15,201,103, 81,120, 11,186, 70,187,251,206,152,247, 86, 63,250,190, -172,243,108,193,140,245,238,213,210, 30,143, 48, 80,150,239, 77,155,184,107, 27, 22, 41, 37, 88,135,253,188, 57, 65,195, 49,215, -152, 17,137,200,231,233,218,162, 22,154, 51,146, 88,138, 67, 89,239,106, 1,154, 93,160,154, 56, 56,134, 44,249,152, 91,174,152, -209, 92,113, 40,180, 65,118,154,123,174,112, 10,108,188,167,174,128,175,181,150,146,217, 12,140,138, 10,179,148,198,215,203,217, -176, 41, 55,200,190,238,210, 71,101, 14,218, 45,245,181,204,121,203, 73, 41,236,203,220,192,218,183, 32, 35,242,101, 37,135, 49, - 87,139, 82, 36, 63,229,180,131, 55, 14, 42, 96, 57, 47, 3, 42, 89,169, 93, 69,154,164,213,124,147, 28,154, 77,165, 77, 41,175, - 39,133,147,184,226, 54,143, 25, 35, 70,128, 85, 71, 16, 45,219, 16, 65,162, 2,119, 26, 68, 79, 77,162,168, 12,149,191,189, 78, -133, 36, 68, 7, 40,218,179,182,250, 82,215,221,199, 58,234,206,203,193,215,177, 95,246,174, 77, 98, 82,102,124,149,147,173, 59, -194, 9, 86,195,179,171, 12,122,186,167,110,144, 70, 75, 2, 79,195,113, 76,185,111, 19, 24,203,110,112,167,165,209,185,174,137, -251,113,218, 6,120, 80, 58,231,141,148,112, 89,161, 83,236,149,149,224, 75,253,223,195,146,202,198,252,224, 64,140,100, 14, 61, - 23, 72, 69,246, 67,157,186, 18, 21, 40, 59,170, 8, 56, 21,228,219, 81,160, 64, 83, 59, 5,233,178,228,144, 73,102,180, 87,169, -211,229,129,123, 94,165,194, 25, 85, 47,239,182, 38, 49,237, 23,174,137, 76,160,234, 74,176,109,237,222, 35, 74, 32,244,179, 46, -245, 70, 17,216,192, 93,178, 32,235, 2, 11,222, 59, 15,206,229,136,151, 36,135,128,168, 80,103, 77, 68,245,204, 12,132,121,213, -141, 69,127, 7,141,170,187, 64, 28, 27,141,212, 71,132,107, 14,238, 52,208,218, 72,101,101,145,127,150,147,110,245,212, 21,215, - 55, 63,111,178,157,175,104,140, 82,191,215,217, 65,142, 75,203, 91, 40, 39,114, 80,158,241, 75,227,188, 58,231, 78,107, 89,157, -107, 35,249, 1,209,164,252, 62,166,145, 28,173,212,191, 91, 45,142,192,246, 23,117,154,164,174,115, 15,239,115,201, 41,208,242, -139,252,183,156, 27,150,240,181,149,249,218, 78,155,216,172,153, 8,115, 36,231, 73,188,239, 84, 54,101,169,230, 64, 31,157, 62, - 41,238, 77, 50,110,238,192,115,117, 52,154,212, 54,176, 24,151, 63, 38, 89, 19,189,183, 28, 7,114,190, 7, 28,149, 98, 73, 45, - 99, 58,152, 91, 99,232, 92,165,208,168, 13, 69,104, 44,109, 54,144,116, 30,115,212,207,175, 11, 98,171,245,114, 94,219,205,153, -227,116,144,245,193,117, 87, 49,119,126, 45,151,213, 1,245,251,129,137,227,214,106,189, 90,200,254,114,133,126,114,133, 94, 8, -181,141, 55,181, 33,120,202,136, 98,181,211,194, 89,154,195, 53,180, 20, 88,146, 87, 80, 40,253,181, 27,109, 22,221,210,210,243, - 46,118, 87, 35,195, 3, 5, 62, 37, 24,250,239,231,160, 91, 96, 10, 34, 31, 70, 58, 21,214,123, 82,225,112,101,229,136,173,255, -233,116, 43, 26,226, 52, 28, 5, 93,231, 66,130,137,239, 99,231, 7,128, 81,112, 62,234,238,140,186,167, 25,180,101,114,117,221, - 43, 33, 55,159,187,206,249, 84,136, 47,204, 93,250, 8,156, 5, 34, 93,168, 14,209, 74,136,161,109,147,248, 27,170, 39,239, 66, - 80,153,210, 47, 93, 62, 25,155,222,187,180, 73, 54, 57,187,184,222,116,198,154,201,183,140,185, 93,131,191,117,161, 33,197, 24, - 59, 28, 7,236, 1, 60,166,138,135, 40, 35, 58,166, 81, 31,162, 95,148,198, 42,117,233, 89,147,203, 23, 12,244,175,139, 37,219, -165,220,172,200, 56,188, 94,127, 78,138, 92, 80,169, 36,214,146,136,100,137,174,105,169, 97,204,121,137, 90, 99, 33,169, 81,147, - 20,249,147,118,137,114,130,222,150, 70, 79, 39,126,220, 68,130, 81,183, 68,161,121,130,122,152,218,220,165,186, 63,186, 6, 67, -100, 30,171, 40, 28, 10,196, 32,161,143, 82, 56, 91, 10,181,137, 70, 42, 44, 25,113,207,143, 16, 7,209, 12,168,184, 78, 96,182, -231,198, 75,141,163,179,182,130,171,169,106, 67,106,115,232,166, 48,220,209, 37,144,178,113, 77,177, 96, 36,219, 0, 48,174, 69, - 51,102, 80, 41, 33,179, 5, 60,136, 42,221,211, 34, 87, 1, 90,111,157, 28,183,186,127,116, 44,128,202,219,210,102,146,176,182, - 74,239, 8,198, 66,201,202,192, 71,227,181, 38,167,190,146,239, 67,232, 66,151, 56,221, 31,108, 88,112, 92,113, 22, 90, 50,183, -222,216,217,228,208, 0, 25, 92,138,162,111,188, 52,215,185, 65, 42,238,145, 98,159,203,181, 30, 60,140, 61, 18,208, 56,135,162, - 71, 61,101, 61,236,137, 6,233, 9,151,141,171,246,146,151,188,115, 93, 21,249, 74, 6,207,182, 56, 49, 36,201,233,104,201,229, -230, 8, 99,221,250,212,147, 6, 61,191,196,176,143, 98,235,186,117,176,196,122,110,202,254,214, 83, 49,196, 3, 29,135, 22,130, - 59,134,162, 44,173, 75,144,122,222,127, 67,247, 41, 89,195, 21, 11,138,126,104,180,125,174,207,199,160, 81, 61,197, 52,234,248, - 75,208, 97, 64,214,233,205, 57, 47,109,235,143,110,160,232,231,138,107,228, 1, 34,152, 20,252, 56,180, 90,181,129,136,151, 25, -245, 4,107, 83, 36, 10,172,242, 78, 25,148,121,100,237,197,151, 54,166, 12,150,136, 45, 89,179,136, 12,169, 79,236,240,179,195, -252,220,152,215,238, 8, 24, 19, 41,240,178,126,169,143,113,209,231, 88,108,216,220, 75, 15,116,157,167,158, 67,192, 69,238,171, - 42,149, 75,134, 93,138, 30,209, 53,252, 87,239, 26,197,196,202, 74,153,138, 58,225,108,163,202, 39,169, 69, 69, 40,206,189,102, - 12, 69,129, 36,211, 38, 46, 34,200, 85,212,191, 6, 60, 89,187, 29,150,124,211, 17, 39, 46, 54,217,241,231, 71, 69, 90, 64, 28, -141,168,209,185, 1,175,163, 38, 49,229,134, 82,115,106,196,148, 53,116,177, 88, 88,191,209,217, 16,173,199,156, 59,188,119, 76, - 36,177,188,139, 84, 99, 91, 55, 83,114, 49,167,172,127, 67, 76, 56,183, 68,144,204,211, 15, 5,159,160,134,202, 27,178,195,105, - 67,200,230,101,214,170, 83,156,215, 19, 16,105,228, 44, 67, 36,198,149, 67,146, 35, 13,178,170,163, 17,185,140,141, 75,161,217, - 35, 5, 30, 5,103,247, 64,226,249,165,245, 51,222,247,189,172, 52,214,117, 94,117,162,166,132,137,141,233, 56, 56,194,168,206, -131, 42, 41, 90,167,109,145, 61,219,216,203,207, 90,136, 99,239, 9, 6,184,211, 55,133, 13,215, 43, 46, 70,199, 38,193,113,195, -241,162,241, 46,101, 57,250, 84, 56,217, 3,163, 46,195, 52, 6,101,104, 29,208, 14, 58,168, 29,177, 27,148,198,118, 41,136, 90, -247,136, 26, 0,233,190,106, 11, 98,210,251, 23,254,214,133,211, 25, 26,112,158,154,156,146,209,127, 50, 8, 66,180,252,139,180, -151,121,224,218, 80,200, 21,231, 99, 98,136, 87,254,142,238,249, 82,253,203,249, 20,163,251,145, 72,228,212,140, 34,158,177, 34, -168,210,161,208,128,175, 66, 92,106,163, 14,184,136, 60,228,242,187,133,104, 80, 12,218, 4, 14,222,209,112,193, 33, 27,244, 14, -169,213, 65, 3,177,212, 81,219, 46, 6, 53, 7,173,127, 12, 93, 80, 77, 42, 10,213,174, 94,197,166,239, 74, 9, 80, 14, 27,181, - 56, 9,186, 25, 18,197, 30, 84,145, 44,117,238,226, 32, 35,217,208, 39, 86, 85, 35, 46,193,151, 65, 36,145, 27, 11,195, 85,235, - 76, 20, 44,214,252,168,125,216, 85,171, 87, 40,151, 35,212,127, 38,121, 68,217, 38,212, 36, 42, 69, 14,134, 36, 71, 67,149,165, - 40,143, 26,203,156,109,173, 93, 61,140, 99,134, 13, 93, 34,225,163, 34,123,196,188, 82,145, 95, 42,105,239,254,243,136, 45, 3, -173,181,197,152,113, 22,181,250,146, 58,151, 53,161,168,206, 1,101, 29,104,238, 73, 38,120,180,140,160,173, 14,148, 3,250, 92, -136,129, 83, 14, 50, 46, 12, 0,194, 54,178,243,243,190,236, 84,231, 90,101,152, 83, 76, 81,158, 75,227, 67, 26,161,120,205,233, -142, 56,206,190, 80,188, 5, 39,161,186,219, 2,147,137, 73,142,142, 0, 76, 46,238, 28,154,163, 39, 78, 90,248,190,119,178,248, -218,126, 10,139,176,214,236,143,130, 38,101, 89,127,222, 12, 39,206, 49, 21, 31, 18, 23, 38,127,208,152, 35,135, 88,119, 47,233, -121, 10,239, 19,231,127,159,109, 73,158,145,108, 68,148,232, 88, 58, 75, 53,180,105,131,156,110, 24, 39,166, 98,141,208,204,119, -217,227,232,100,132,178, 48, 41, 75,218,234, 60,243,192, 8, 83,189, 62,101, 72, 36,212,249,201, 92,108,170, 26,233,217, 32,212, - 67,146,122, 78,139, 91,198,205,210,115,225,145,241, 67,252,252, 39,202, 17, 7,133,178, 67,250, 37,107,141,220, 34,168, 41, 18, -230, 26,228, 59, 67, 93,138,182, 51, 93,252, 18, 94,231, 1,176, 40, 57, 80, 51,210,250,122,172, 49, 84, 61, 94, 20, 52,237,157, -205,206,145,138, 92, 86, 42, 5,101,246, 58, 11, 97,211, 34,246, 70,133,100,117,122, 51,119,126,202, 42,153, 76,195, 62, 91,149, -172,215,200,193, 40, 7, 20, 36,149,127,165, 20,167, 88, 87,234, 72, 40, 49, 78, 91, 59, 23,142, 78, 66, 52,157, 11,178,190,157, - 26,188, 18, 81, 97, 41, 73,161, 99,149, 92,134,186,162, 18, 37,170,106,230,243,145,104, 20, 65,112, 69,235,241,116,164,138,232, -153,140,188, 39,239,198,106, 12,233,219, 99, 31, 8,140, 62,125,144,130, 3, 91,237, 31,182,161, 99,210,121,212,132, 51, 34,134, - 13,125,143, 75, 88, 93,105,244,146,231,135,156,239, 82, 37, 97,178, 24, 53,234, 32,152,160,227,171,138, 64,169, 52,195,165,249, - 70, 30,126,175, 35,157,194, 68, 51,149, 1, 77,198, 86,116,202,248, 44,152,181, 25, 99, 13, 28, 73, 40,110,164,206,146, 50,163, - 74,163, 30,249, 8,203,156,252,247, 58, 25,207,233, 29,164,142,178, 36,174,149, 16,187,201,224,151,168, 43,173,141,116, 50, 21, - 42,146, 42, 82,202, 39,117, 78,102,204, 75,190,224,187, 87, 17,201,202, 46,113,205,254,202, 13, 78,195,192, 25,162,210,208,232, -253, 83,164, 65,245,181, 93,133,208, 52, 91, 47,142,209,199, 88,226,244, 32, 74,205,104,244, 55,172, 42,218, 5,118,107, 45,251, -104,151,165, 56, 17, 40,240, 28,202,118,214, 67, 44,130, 86, 55, 90,105,102,138,178, 66,131,100,135,117, 83,170, 29, 57,137, 72, -202, 32, 35,152, 79,241,220, 1,164, 6, 33,140,218,165,115, 62,133,144,196, 96, 72,146, 99, 95,246,255, 14, 48, 51, 80, 40,250, -165, 28, 48, 55,248, 40,170,194,231, 29, 89, 19,221,122,202,246,153, 68,172,203,139, 3, 11,148, 74, 29,215, 92, 24,170, 72,181, - 8,166,221, 36, 94,111,138, 18,147, 35,218, 77,120, 16, 0,148,237, 87,185, 77,204,138, 78, 48, 71,150,180, 52,162,110,170,154, -228,180, 34,220, 85, 41, 5,151, 5, 77,173, 71, 30,201,181,248, 21, 28, 24,214, 20,155,154, 4, 94, 3, 83,161,156,200, 35,206, - 3,105,111,251,108, 14,181,100,170,169,154,127,209,177, 17, 20,105,167, 26, 38,167, 74, 6,183,220, 87, 37,138,111,141, 25,205, - 22,106,234, 85, 4, 57,116,231, 91,195,185, 2,173,213,128, 80, 46,137,106,217,107,240,152,107,221,183, 26,252, 56, 42,185, 36, - 28,188,201, 34,237,201,117,107, 96, 46, 80,103,231,134,233,133,184,172,105,216, 27, 69,170, 70, 72, 34,102,208,144,104,216,208, - 69,164,200,105, 70,113,149,138,128, 67, 42,139,202, 62,111,105, 66,212,202,144,224, 93,121, 47,219, 64,170,214,143,156, 24,163, -121,195, 17,106, 71,234, 52, 10,243, 73,244, 62,221,138,242, 21, 29, 60, 83, 45, 90, 71,163,244,137, 17,200,189,126, 63, 85,185, - 56,105, 27,158, 53,253,224,109, 38,177, 73,141,207, 22, 25,158,218,192,181, 78,217,149, 27, 75,167, 50,172, 85,253, 56, 21,199, -225,100,111,117,232,107,142,139,100,203, 39,175,211, 30,192,251,241,130,139,122,105,100,125,149, 3,158, 86, 56, 55, 99,172, 98, -109,125,169,241,162,139,115, 69, 98,228,164,132, 18, 26, 33,105, 41,172,174,117,233,204, 12, 23, 74, 82, 76, 40,100,119, 49,109, -163,240,121,137, 24, 20,117,217,153,117,146, 85, 14, 92,254,249,154,157, 45,109,153,217,250,150,231,155, 10, 53, 61,137,146, 11, - 33,177, 95, 64, 34, 46, 74,204,171, 98,148,119, 98, 86,148,215,141,111,214,229,148, 29, 35,206,249,212, 11,183,114, 82,113,126, -230,155,154,240,144, 87,211,103, 70,195, 57, 7, 97, 14,134, 61,141,103, 20,132,193,176,109,235,180, 43,225,205,193, 53,230, 27, - 55, 13, 37,221, 8,227,164,223,214,218, 25,252,205, 92,164,235,214,237, 70,173,243,107,221,187, 85,198,188,108, 8,101,139,235, - 28, 56,247, 99,191,235,106,197,208,116,254,101,245, 14,183,199, 14,153, 10, 38,211,202, 92,122,139,124,168, 26,231,142, 86, 7, - 80, 44, 88,201,175, 74,206,105, 38, 66, 70, 52, 72, 31,229, 71,229, 4, 80,214, 26,118,180,180,152,218,206,142,206,101, 49, 9, - 73,112, 78, 21, 61,101,216,252, 71, 85, 90,105, 88,130, 46,145,165,143, 97,151,182,188, 67, 85,218,180,185, 24,156,162,142,152, - 92,132,222, 53, 79,105,144, 12, 6, 75,169,230, 21,251, 48,103,202, 40, 92,213, 4, 13, 11, 40, 40,146,158,234,252,228, 74,198, -177,212, 93,128,106,230,172, 28, 40,146, 94,105,232,131, 17, 18, 90, 31,153,143, 9,141,176, 90,133, 86, 94, 91,170,242, 18, 42, - 27,159, 20, 42, 87, 99,250,162, 24,239,147,236, 39,179,203,242,200,114,232, 58,121, 18,172,188,127, 50,210, 71, 60, 23,218, 24, -243,160, 91,206,100,105, 24, 57, 88,193,196, 11, 16,136, 87,170,210, 70, 36,132,228,209, 55, 12, 16,103, 37,120,121, 67, 27, 38, -147,133,214, 33,230,140, 78,150,100,139,105,168, 25,189, 74,190,184,238,202, 37,153, 76,105,107, 51,173,231,111, 46,146,164,205, - 77, 86,229,164, 53, 2, 97,245,252,145,250, 75,231, 92,141, 22,228,122, 16,182, 63,175,236,119, 61,162,121,159,117, 26,243, 63, -190,154,199, 83,247,136, 40, 34, 89, 27,200,113,141, 77, 95, 67, 33,161,114,227, 44,238,127, 86,135,109,209, 46,131, 18,140,215, -181,155, 74,166,116,213, 92, 30, 37,251,174, 64,168, 90, 60,162, 98,124, 12, 55, 13,250,186,231,198,206,115,112,191,198, 2, 38, - 74, 16,122,145,178, 36,106, 50,209, 71,123,120, 96,117,148,222, 50,150,165, 83,146, 20, 75,165,101,140, 87,144,240,106,131,219, - 74,127,228,193, 90,173, 87,104,168, 84,229,107,157,107,206,190,111,143,123,138,220,153,217,247, 67, 8,168, 98,235, 60,164, 53, - 54,201, 64,122,241,153,105,144,105,173,217,154,245, 38, 66,205, 5,234,161, 91,173, 73, 54,129, 59,167,114, 6, 68, 82,104,239, -162, 33, 80,177, 78,163,211,231,240, 80,228, 41, 74,120, 87, 70,176,217,161, 74, 91,110, 67, 76, 28, 44, 58, 16, 84, 62,184, 97, - 40, 35,165, 4, 19,143,123,154, 81, 31, 60, 83,193,203,243,185,241,168, 98, 9, 82, 70,250, 84,221, 23,239, 89,122,248,159,199, - 79,188, 33,124, 66, 49, 34,172,197,134,214, 69, 94,245,120,152, 42,210,138,112,151,164, 77,111,229,247,228,155,119, 70, 18,162, -220, 19,205,238, 93, 52,106,148, 32, 60, 7, 6, 71, 68, 64, 25,224, 28,196, 28, 50, 74, 18, 81,193,181,102,169,202, 28, 99, 9, - 28, 82,207, 98, 9,236,247, 64, 88,115, 40, 57, 22,169,173, 88,237, 52,142, 59,130, 26, 49, 71,248,149,107,141,254,172, 79,122, -171,206,188,112,170,184,106,224,145,202,108,146,207,145,100,123,153, 84,185,139, 74,253,129, 76,172,167,181,185,249, 84, 9,175, -133, 70,235,231,199, 28,132,129, 92,236,136,113,179,118,185, 50, 82,117,153, 20,107,100,174,103,227, 75,157, 41,140,245, 88,253, -121,201, 28,167,178, 27, 87, 5, 98,214,226, 86,171,197,105, 86, 59,216,178, 38, 85,151,231,212,199, 34,113,254,127, 89,123,179, - 94, 89,150,236, 60,236, 91, 43, 34,171,246,112,246, 25,238,216, 19,217, 20,217,205, 9,160,105, 9, 52,197,201,180, 12,129,130, -109, 24, 2,252,226,127,225, 39, 63,251,127, 8,254, 7,124, 52,108,208,134,100,138,176, 9,219, 34, 91, 20,217, 77, 54,217,156, -164,238,190,183,187,239,124,230, 61, 84,101,196,242, 67,196,138, 88, 17, 25,153,181, 47,169,211,184,200,222, 83, 85, 86,102,100, -172,233, 27, 54,130,214, 73, 77,144,133, 88, 81,155, 88,208, 74,165,139,156, 40,114, 17,177,106,113, 27, 77, 80, 31,224,137,172, -127,197, 86, 48,119,220,121, 4,174,168,197,173,161,246, 93, 39, 35,158,213, 44,202, 51,204,204,205,121, 54, 90, 33, 34,105,125, -245, 9,143,206,179, 81,187,138, 35,211, 43, 1, 10,123,166,161, 68, 91,108, 84, 30,105, 43,240,149,178,150,187,126,106,165,220, - 74,164,123, 37,213,105,228,100,181,209,165,109, 19,148, 89, 7, 6,124,240,152,192, 59,222,113,169,238,181, 82,231,178, 18, 92, - 83, 73, 74,151, 49,212,153,224,122,166, 30,140,214,178,245,128,166, 66,255, 24, 3,208, 70, 0,137,225,166,216,203,112,226, 68, -101, 9, 44, 16,198,253,195,177,214, 81, 40,139, 70,186,196,166,120,119, 27,197, 51, 51, 50,214,153,142,173, 90, 19,202, 49, 59, -197,173,101,111, 57,147, 31,117, 9, 20, 19, 1,218,174, 40,249, 20,122,116,227,218, 2,128,243,110,187, 61,187,118, 95, 86,146, -169,254, 60, 34,213, 25,179, 86,210, 67,139,224,193,235,140, 90,174, 2, 32, 37,215, 82,112,108,197, 12, 34,160, 17,231,145, 40, -229,250,158,186, 54, 84,168,112,150, 97, 96,176, 5, 93,114, 71, 6,232,212,142,197,104,117, 4,194,160, 78,231,126, 89, 9, 21, -252, 4, 97, 88,201,241, 90, 69, 39,167, 3,249, 86, 80, 95,204, 48,139, 28,238,186,109,239, 90,119,171, 9,196,134,210, 41, 43, -122, 25, 42,211, 26, 25,171,149,112, 15, 6, 29,221,207, 72, 35, 45,241, 13,182, 3,182,213,238,196,248,111,175, 93,195, 30,179, -178,192,176,240,118,165,189,230, 33,112,159,110, 65, 3, 33, 25, 40, 74, 18, 17, 40, 10,134,186,138, 6,108, 58,124,206, 11,208, -152, 54,207,161,167, 52,247,215,223,238,193,197, 34, 57, 47,126,119,162, 75, 97,239,171,178,176,170,182,122, 13,218,107, 51,117, - 69,231, 43,238, 35,154, 54,126,193,127, 48,151, 34,197, 82,254, 20,197, 54,231, 86, 62,243,248,190, 80,228,188, 70,182, 49, 23, -141,248, 12, 55, 94,214, 82, 32, 17,146,236,179,224, 56, 5,102,206,114,159,237, 28,153,225,153,139,225,189, 35, 5, 43,105,144, - 74, 32,153, 72,104,164, 34, 81,120,225,201,209,167, 1,121,117,184, 56,150, 10,252,177, 52,175,170,181, 31,139,171,211,162, 5, -182,218,242,160, 65, 98, 74, 67,233,202,222,135,154,122,164, 51, 97, 19, 36,181,237, 17,159, 50,179,124, 63,202,177, 57,249, 88, - 61,142,199,137,117, 15,244,145,174, 69,196, 11, 9, 72,155, 24, 48,201,166, 40,144,115,110,177, 49, 45,147,187,165,193,135, 6, - 89,135,126, 83,105,175, 71, 36,110, 55,182, 21,153,207, 53, 32, 93, 17,179,201,149, 39,101, 11, 89,235, 71, 93,100, 30, 81,103, -254,138,209,136,161,117,142, 83,160, 75, 44,149, 63, 15, 1,107,138,206,181, 51,241,145,119,115,159,220,217,153,185,144, 20,185, - 97,244, 82,173, 42, 2, 18,101,152,236, 24,117,131,114, 93, 53, 97,164,190,189,137, 68,227,178, 46,115,165,106, 49,149,244,176, -210, 19,139, 60,110, 65, 98,246,121,189,111,229,190,192,108, 12, 24, 99, 86,214,147,217, 13, 55,253, 34, 64,162, 52,188,149, 64, -108, 45, 77, 89,150,192, 75,182,148, 72, 66,219, 37, 49,128,165, 50, 45,144, 58, 82, 18, 65,226, 73,111, 81, 60,135,130, 56,245, -168,242,160,163, 89,252, 90, 80,166, 46,113,171,123, 73, 29, 13, 53,149,129,193, 54,140,198, 97,253,125, 24,185,253, 45,141, 67, - 42,133, 43, 64, 22,226, 68,182,250, 69, 87,148,149, 78,149,172, 91, 95,219,162,108, 45,168,111,173, 49, 77,240, 34,181,136,125, - 90,136, 15, 69,163, 78, 71,208, 41,157, 72, 52,108, 38,157,115,231,117,146,253, 46, 98, 54,171,210, 49, 87,200,186,236, 54,248, - 59,118, 77,178, 32,221,207,131, 80, 97, 73, 45,146, 62,166,170,208,184, 50,194, 40, 46,161, 25, 74,196, 2,120,153,195,242,161, - 67,229,188,186, 76, 11,114,206,181, 72, 62,138,136,113, 78,214,147,246, 65, 87,125,110,189,105,100,144,216,133, 83, 89,167, 88, -142,167,182,125, 2, 24,223,228, 60, 19,204,242,166,150,147, 92,221, 20,165,169,228, 87,181,218, 87, 90, 81, 49,160,220,140, 64, -237, 49, 18,138, 34, 16, 11, 16,213, 47,221,100,110,222,186,230,148,155, 85,127,143,196,220,108, 12,102,158, 43,149,186,173, 68, -162,206,174, 70,217,102,111, 72,179, 66, 73, 89,123, 16,152,182, 1,113,113, 16,180, 90,177,155,222,241,107,229, 33,235, 81,254, -221, 6,162,170,112,253,195, 59,177, 91, 9,230,153,239, 75,101,199,170, 45,117,181,125, 53,198, 25,182, 22, 87, 85, 49, 22, 5, -189, 16, 36,102, 37,186,123,116, 37,108,171, 13, 65,150,202, 91, 93,181,215, 92, 39,219, 5,129,148,238, 85, 1,148,229,255,146, - 35, 21,157, 20, 87,234, 5,141,214,130,231,201,249,246,160, 51,165,235,111, 43,104,111,123, 43, 32, 83,202,104,245,125,228,115, -118, 0, 70,231,169,123,198,144, 53,145,193, 88, 17,219,221, 20,109, 99,247, 93,206, 16, 66,163,243,176,150, 96,172, 5, 27,171, -104, 57, 12,210,142,151,107,101, 69, 37,115, 40,170,117,226, 26,233,245,223,194, 28, 81, 39,190,178,213, 49,235,139,166, 89,141, -181,250,125, 77,150, 65,110, 20,244, 48, 80,226,179,239,113, 60, 30, 55,215, 87,167,151,217, 2,190,115, 37,189,165, 80, 23, 7, - 51,247, 5,254, 97, 1,174,109, 13,153, 76,238, 84,102,225,145,149,114,150,219,232,144,166,219, 51,107, 82, 24, 67,163, 55,210, -188,111,172,226, 92,107,180, 60, 12,246,103,111,103,158, 41, 43,151, 82, 69, 59, 16, 56,139, 91, 40,215,179, 34,104, 1,113,202, - 67, 68,230,255,102, 62,178,168,125,158,217,196, 73,121,135,220,100, 82,148, 55,109,107,165,103, 13,176,136, 81,124,140,139,216, - 0, 4,193,248, 74, 83,151,125, 15, 31, 30,233,170, 28,211, 2,117, 84, 21,151, 21, 13, 94,220,129,136, 55,149,150, 36,100,202, -148,238,199,230,117,154,239,175,185, 14,229,140,151, 41, 5,130,198,222, 18,105,142,153,102,160,210,100,155,245,161,149, 78,147, -126, 60, 35, 91, 83,230,106, 50,241,145,245,102,215,157, 1, 90,145,147, 34, 36,145, 13,125, 99,151,249,151,121, 56,103, 43, 65, - 67,142, 9, 4, 8,230, 38, 41,177, 76, 86,129, 32,118, 51,213,162,238,148,219, 98,190,204,204,114, 27, 43,115,185, 73,253,182, -157,203,129,190, 42,240,181,244, 29,253, 7,155,181, 7, 0, 0, 32, 0, 73, 68, 65, 84,187, 22, 37, 95, 40, 39,249, 19,197,114, -126,177,153, 53, 42, 96,174, 81,220, 26, 5, 63, 26, 87, 66,222,248,213,107,233,210, 96, 46, 12,186,184,148,119, 68, 5, 32, 85, -223,175,155, 93,231,251,225, 75,128,112,109,149,151,193,133,209, 42,232,161,197,118, 44,158, 21, 43,186, 84, 22,224,188,138,149, - 40, 84, 57, 89,151,190,141,140,113,215,107,165,242,173,137, 35,213,140, 22, 40, 10,114, 86,153,171,153,205,234, 21,238,114, 16, -229, 9,107,197, 67,197,205,109,105, 92, 99,171,254,178,150, 6,126,222,107, 0,180, 81,245, 45,132,213,153,248,102, 27,127, 85, -206,185,251,187,208, 90,195, 46,146,239, 24, 64,102,150, 76,157,235,101, 95,217,247, 12, 14,145,244, 60, 7,164,241,212, 8, 45, -174, 73,170,152,164, 86, 6, 61,249, 30, 20,185, 24, 85,172, 92,103,217, 8,216,171,192,229, 21,147,199,173,235, 94,159,157,118, -108, 59,148,177,205, 95, 79,221,247,109,225, 18, 51,162, 61, 64, 22, 5,141,242,212,123,157,130,158, 99,197,102, 15,168, 51,117, -229,105,151, 25,181, 52, 78, 94,206,248,117,115,153, 7,107,133,193,240,222, 53,155,184,163,182,109, 87, 51,170,176,248,112,101, -147, 84,135, 26, 50,186,226,133,157, 20,155,135, 44,218,246, 82, 92,194,108,138, 13,172,237, 58,116, 27,149, 67,109,241,147, 97, -208, 2,216,164, 50,140,142,210, 49,112, 63,247,235,168,249, 74,148, 58, 70,232, 81,238, 81,150, 47,110,219,235, 3,195,152,173, -234,130,150,222,173,171,139,191,209, 78, 30,209, 75,214,166,227,210, 85, 83, 25,240, 21,251, 74,146,198,210,168,149,109,177, 4, -226, 65, 12, 29, 70,221,242, 64, 70,202,151, 10, 6,193,167,118, 79, 29, 3,192,208,184,242, 12,135,187, 46, 72, 97,109,168,210, - 90,225,133, 87, 71, 61, 91, 97, 16, 39, 22,135,228, 99,181,234,149, 98,141, 91,220, 90,205,251, 82,238, 50,140, 40,133,107,213, -107,191,241,219, 74,164,191, 1,250,156, 13, 3,139, 94, 96,166, 6,192,183,232, 4,172,152, 29,213,153,222,250,185, 46,104, 57, -163,153, 59,104,104, 92,116, 95,239,137,184,105,220, 33,195,205,190, 5,170,201,230,207,239,139, 29, 88,195,173,148,153,231, 90, - 37,124, 98,166,188, 53,155,175,121,160,220,251, 60,215,146,250, 85, 76, 64,148,213,145,130, 42, 48,218,167,127,164,175,174,199, -161,124,245, 9, 32,110, 19,164,141,102, 70,111, 2, 19,105, 16,216,187,239, 53,242,181, 43,215,122,212,137,170, 28,241, 54,240, - 70, 58,125,191,238,230,227,122,114, 66,169,184,141,163, 17, 67, 14,168,243, 60,183,194,100, 29,219,198, 13,240, 12,190,160, 3, -185, 86, 50, 14, 85,254,175, 34, 94, 99, 81,145,170,155,163,169, 42, 58,109,103,187, 81, 85,225,153,148,211, 89,139,206, 57,183, - 31, 84,102,175,255,119, 12, 97,243,161,163,142, 14,164,138,105,150, 87,238,168,117, 41,210,234,210,171,229, 29,181,122,116,250, -245,125,142,154,133, 38,235,195, 92,133,231, 84,161,255,254,232, 72,102, 83, 19, 90, 14, 99, 41,119, 64,220, 10,119,153,168,125, - 31,215,189,190,140,181,105,135,160,160,209,194,222,162,212, 88,140,192,136, 53,161,186,234,128, 44,102,167,154,100,121,200, 48, -249,160,149,135,158, 59, 62,109,114,157,227, 2, 2,227,110,126,230, 76,224, 6,137, 21,254, 66,165, 85,198, 6, 21, 75, 6, 72, - 72, 37,184, 91,218, 96,181,108,164, 82,105,167,249, 22,171,220,107, 86, 96, 75,212, 56,201,193, 94,131,185,158,147, 36, 30, 63, - 6,138, 98,107, 96, 59, 3,245, 30,177, 23, 26,223, 66, 99, 24,100,131, 57, 81,139, 6,174, 93, 11, 90,204,204,135,224, 74,123, - 15, 99, 92, 5,133,246,213,125, 19,208, 68, 81,191,177,237,232,109, 0, 36,183, 0,137,101,140, 97,145,204,100, 48, 16,180,226, -192, 86, 48, 19,232,146,206, 54, 33, 17,202, 82,167,125,235,159,214,129,100,163,241, 4,141,128,179, 27,129,236,100,192,143,178, -100, 5,217,164,130,104, 1,120,107, 69, 47,165, 29,157, 14,238, 55, 97, 76,215, 19,186,191, 33,215,150, 4,237, 2, 47,211,181, -248,197,106,199, 27,141,129, 72, 21, 11,209,107,164,247,224, 87, 13,194, 44, 35,155,224, 78, 57,212,130, 35,143,113, 61, 41,234, -112, 37,163,245,105, 21, 11, 71,127, 63, 7,157,221,115,233,218,166, 53, 58,183, 20, 89, 98, 12,219, 27,131,239,120, 39,173,241, - 70, 53,180,176, 21,122, 53, 29, 32,203,224, 33,194,220, 41,142,245,154,197,250,161,234, 7, 15, 53,195, 1, 35,134,185,177,148, -107,218, 93, 84,145,171,100, 94,223,138, 25, 48, 90,241, 20, 91,193,245,220,223, 5,245, 34,183,139, 85, 21,201,131, 26, 64,141, -126,127,235, 40, 57,129, 41,214,158,162, 77,146,229,247, 71,199,166,181, 91,184,231,230,114, 26,202, 74, 63,195,214,207,192,198, -180,193,242, 25,181,117, 26,239,153,245,159,170, 58,134, 72,210,149,153,109,213, 76,118,195, 74,176,136,199,172,204,108,121, 5, - 64,211,235,156, 83, 49, 33, 81,121, 86, 50,246,176,249,117, 72, 85,205,122, 85,152, 88,214,146, 88, 90, 74,182,210, 76, 6, 9, - 84, 21,250,242,130,114,138,216, 70, 53,130,225,226, 75, 31,154,163,231,218,118, 34, 75, 45,203, 23, 69, 58, 31,248,173,160, 62, -174,150,184, 27, 57,181,247, 99, 28,212,105,181, 11,240,121,170,211, 62,233,219,154, 3, 15,209,211,139,153,232,253,170,213,182, -234,161, 49, 16,107,197,138, 85, 54,218,250,192, 82,136,201,206,237, 71,201,198, 26,127,254,190,215,116,252,153,238,143, 78,167, -141,206,193,125,239,169,244, 34, 87,118,230,126,194, 28, 43, 18,109,118, 34, 11,218,219,252, 30,204,245,228,123,202,132, 12,215, - 42, 85, 33, 24,197, 56,217,148, 44,185,192, 89, 33, 42,165,148,153,164, 7, 53,158,148, 78, 64, 39, 80, 84, 58, 13, 3, 23,182, - 24, 99,193,140, 97,176,190,220,134,151,138, 98,198, 60,115, 73, 46, 99, 39,144,228,156,107, 60, 41, 86, 71, 3,230,186,251, 50, -107, 38,211,182, 86, 23, 42, 17, 56,159, 0, 59,186,225,113, 55,111, 73, 21,171, 51,230,242, 85, 65,204,146,239, 75, 38,205,180, -144,181,164, 21, 16, 6,134,200,216,101, 69, 96, 29,224,116, 76, 64,160,166,186, 77, 1,134, 6,193, 35,140,197, 99,238,137,217, - 17,161,222,102,163,193, 8,156, 58,102,167,221,102,142, 78,178,124,104,109,101,218,143,204, 87, 65, 60,132,129,159,244,198,140, -108,208,174, 60,101,108, 83,146, 39,170, 89,183,206,108, 1,192,115, 59,158,209,142,144,203,218,251,165, 11,212,163,187,215,232, - 73,166, 66,162,234, 69, 82, 90,232,102,236,156, 43,141,152, 3, 63, 13,103,187,125,117, 91,220,219,114,192, 44, 44, 14,219,149, - 64,139, 59, 65,211, 20,235,206,151, 90,141, 4, 50, 72,234, 88,130,121,165,181,172,249,180,203,216,123, 53,121, 88, 55,198, 26, -110,216,158,166, 60, 67,183, 52, 35,197,172,146,172,111,160,253,166, 27,250, 13,158,229,100,117,189, 86,197,234, 88,109,203,106, -248,100,251,220,140,236,116, 83,108, 63,127,171,172, 23,109,203, 40,123,126,143,130,164,157,185,218,215,151,197,239,139, 1,105, -141,208,239, 97,123, 78,123, 66, 18,121, 77,244,197,126, 57,158,193,171,181,242,137, 4,161, 75,182,185,199,194, 80,171,155, 96, - 3, 91,226,129,111, 27,242, 44,208,224, 70,118,181,185, 63, 3, 60,212,104, 44,208,175,177, 89,226,194,130,183, 1,193, 57, 99, -124, 5, 52, 2, 46,165, 3, 96, 10, 17,235,248, 6, 84, 74,221,104,102,142, 16, 65, 25, 61,223,106, 37,212, 27,101,217, 67,139, -132, 82, 0,239,207, 12,229,169,158,215, 92,102,233,188,232,142,140,198,163,214, 80,198,187,158,148, 47,186, 65,214,202,136, 49, - 24, 26,103, 39,160, 0, 12,179, 99,165,165,232, 76,169, 0,142,204, 5,238,145,208, 86, 67,121, 45,131, 91, 84,170, 76,203, 42, - 78,171,245, 30,109, 45, 35,158,116,175, 77, 78,159, 79,101, 78, 43,105, 82, 29,232, 92,241, 83, 85, 52,219, 58, 42,250,177,149, - 63,221,166,116,245, 15,129, 3,134,160, 16,251,121, 79, 85, 40,163,141,116, 84,201, 47,232,100, 3, 0, 14, 81,203,151, 94,173, - 14, 76,107,219,117, 40,104, 53,146, 90, 40,230,105,226,150, 43,242, 68, 11,171,184,144, 30,240, 37, 20,115,135,166, 3,128,229, - 74,156,153, 17, 96,197, 33, 4, 68,174,118, 84, 96,212, 17,225,154,202,197, 21,105, 27, 30, 38, 96,250, 80,243,134, 12,107,164, - 56,236,132, 72, 55,102, 24, 37,158,149,151,239, 22,110, 89,139, 74,154,226,192,155, 57, 25,153,245,247,165, 77,174,105,179, 18, -196, 74,167,103,109,205,244,184, 12,217,152,231,110,117,149,122, 64,156,109, 39,111,206, 72, 27, 60, 9, 3,107,226, 55, 52,126, - 30,176,241,252,172, 37, 46, 91,221,135, 17, 38,130, 78,168,101,182,148,179,251, 41,215,157,242,154, 47,107,239, 68,197,223,119, -149, 74, 18,185,228, 90,150,251,225,186, 36,221,219,207,196,167,187, 26, 91,231,206,113,217, 30,183, 49, 38,198,152,219,244,117, - 38, 31,165,206,198, 25,212, 61,159,220,142,162, 64,205,103,105,252, 21,200, 4,213,197,117, 73,255, 29,143,199, 97, 82, 80, 20, - 41,137, 7, 96,199, 42,159, 44,177,213,175,232,213,235, 92,118,113,179,231, 88,103,234,134,175,156,244,120, 43,223,153,115,191, - 56,237, 27,177,180,189,162,169,214, 98, 86,214, 98,113, 77,170,199, 83, 85,190,170, 52,128,154, 81, 23,159,225,216,150,167, 61, -239,156,101, 25, 60, 4,128,152,104, 96,172,193,139,243,151,109,102,166,247,234,208,227, 35,225, 27,186,167, 58, 20, 97,177, 41, -124,158,132, 64,242, 12,124,180,153, 20, 28, 19,115,215, 38,195, 34, 41, 41,103, 49,176,252,163,242,181,180, 95,163, 53,140, 89, -173, 36, 86,136,248,132, 22,205, 90, 53,138,165, 80,243, 44,114,186,160,161,163,185, 73, 81,103,211, 61, 88, 76, 12, 77,114,196, -108,200, 21, 59, 80,112, 30,105,189,246, 21,117,197,245,150, 22,189, 21,102, 41,116, 71, 49,216,128,132,203, 96,182,157, 7, 35, -133, 44,118, 19, 78,148,207,146,152,116, 45, 50, 34, 74,237,179, 21,160,148,228, 46, 87,179, 9,115, 43, 2, 3,110, 95, 51,218, - 77, 91, 4, 14,174,100,244, 67,160,150,183,152,150,145,225,197,120, 19,229, 19, 22,196,108, 0,176,159,167,205,187,150, 64,210, -125,218,174, 13,128, 79,177, 35,173, 79,125,207,106,239, 41,106, 77,167, 75, 56,207, 42, 59, 85, 56, 83,114,137,145, 31,150, 97, - 53, 30,239,253,188, 15,205, 93, 58,151,180,251, 4,242,181,128,220, 7,245, 17, 26,127,113,255,141,202, 37,101, 29,246,230,245, -227, 18,253,109,131, 23,195,221,115, 76, 52,238,198, 56,114, 11,187,209,173,132,168, 79,156,122,235,214,210, 61,201,236, 24,137, -209, 56, 38, 82, 3,110,102, 16,188, 49,204, 25,157,227, 86,208, 6,128,200,110,209,154,111,126, 39,196, 77,116,124, 0, 53, 34, - 68,250,206, 58, 10, 46,236, 23, 30,119,108,100, 80,180,249,228, 87, 28, 27,203,213, 52,119,203,154,239,121, 35,180,179,136,130, -170, 69,182,145, 3, 55,136,244, 54,179,141,245,100, 85,237,199, 84, 0,110, 37,227, 45,206, 65, 43, 25,100,170,224, 98,211, 14, - 19, 35, 10,186,208,208, 94,201,128,121, 3,177,123,175,192, 76,188,153,169,159,252, 23,129,200, 17, 28, 25,209, 69, 80,160,198, - 79,219,179,203,179,221,234,151,108, 27,253, 50,106,199,163,181,172, 85,241, 3, 43,185,202,212,154,109, 20,148,118, 55, 21,171, -115, 90,202,230, 44,108, 64, 68, 93,123,149,171,196,166, 21, 16,169,247, 39,160, 49,194, 33,105,100,115,123,177, 19,181, 74, 37, - 99,167,168, 18, 50, 89,206, 33,181,192,105,233, 84,182,120,173, 94, 88,132, 12, 18,118,224,190, 85, 13,118,204,220,188,111, 21, -102, 83, 34,134, 24,223,106,206,178,175,156, 90,159, 34, 25, 50,169, 62,228,169,170, 86,127,244,201,237, 16, 16,146,133,163,132, -212, 23, 35,129, 35,135, 10,187,151,148, 20, 83, 76, 40,123,149, 98,178,109,119,243,190,118,253,172,181, 50, 43, 45,111, 32,212, - 90,172,154,165, 83, 63,172,131, 37, 61,127, 13,170, 11,202,231,137, 46,205,231,153,227, 87,221, 10,170,227,171,114, 67,105,147, -114,234,251,249, 58, 58, 25, 79, 65,157,225, 20,236, 80,200, 72,162,100, 57, 91,124,216, 73, 32,145, 16, 73,170, 21,173,105, 87, -203, 56,146,111, 7,103,185, 95, 49,176,205,136, 72,221,170, 72, 17, 44,140,144,215,137, 30, 35, 69, 80,164,178,207, 7, 84, 43, - 93, 82,143, 3,184,180,239,151,117, 68,139,245,156,126,238,192, 14, 73, 59, 84,247,229, 13, 69, 80,116,227, 72, 71,212, 28,193, -132,136, 0, 18,151, 18,196,168, 95, 51, 36,247,236, 21,219, 18, 17,192, 96, 68, 9,101, 63, 36,179,222,137,210, 48, 51, 57,195, - 49, 24, 49, 83, 94, 35,136,125,234, 23, 19, 99,111,246, 79,135, 37, 15,220,254,127,239,167, 14, 88, 89, 5,107, 68,170,108,141, -160,186, 64,182,222, 11, 57, 78, 85, 80, 89, 99, 0,182,207,134, 66, 33,175, 59,128,199,247, 59, 3,204, 72,168, 24,183,212,241, -106,226,146,139,196,100, 55,237, 56, 85,176,109, 91, 91,138, 52, 44,151, 74,190,234,189, 39, 84,173, 52, 65, 4, 70, 37,203, 86, -178, 34, 85,209, 44, 26, 73,215,226,154,102, 20,113,218, 82, 61,150,115,104,130,180,216,115,164,166,253,214,128,227, 70, 89,108, -151,233,159,106, 73,221, 47,170,199, 85,208,202,169,246,155,138,167, 16, 36, 57,220, 17, 64, 46, 59,154,105, 11, 41,204, 89,221, -175,221,172,123,249, 80,155,164, 52,243, 70,179,105, 11,183,103, 25,137, 48,135, 12, 92, 44,193,186,234, 95,215, 13,191, 35,241, - 85, 57,191,102,158, 93, 3,184,113,201,106,230,239,218, 90,170,191,223, 91, 79, 18, 43, 48, 45,189,134, 21,159,161,197, 62, 41, - 96,215,169,244, 81,155,224,197,172,157, 76,177,122,125,219,214, 37,135, 58, 83,170,231, 17,203,154,118, 94,219,115,209,240,243, - 99, 81,159,227, 98,254, 27, 75, 71, 64, 47,167,226, 82,210,165,139,249, 18, 71, 29,212, 34,146,224,112,188,205,215,148,243, 90, -136,217, 63,252,136, 24, 5,142,125,122,102, 98, 76,173,250, 28,212,161, 56, 23,239,234,122,142,154,236,228, 16, 35, 17,192,168, -173, 45,101,180, 48,113,237, 52,160,219,160,153, 7, 1, 88,146,120, 68, 74, 62,168,204,197, 11,251,130, 91,125,125,234,146, 94, - 51,188,107,103,212,107,148,175, 76,249, 36, 81, 59,215, 10, 64,101, 78,126,216, 58, 75, 28, 29,251, 53,209, 24,140, 80,219,242, - 44,174,245,198, 13, 36,170, 97, 12, 87, 71, 44,162,124,109, 37,182, 42,151, 3, 73, 92, 91,233,141,198, 90, 81,176,250,185,239, -179, 31,237,124, 13,110,146, 13, 41, 28, 49, 16, 9,158, 18,119, 60,229, 35,156,174,117,254,126, 10,158, 2,239,125, 78,174,157, - 41, 26,164,180,162, 37,212,189, 95,143,204,118,191,241,247, 74, 74, 88, 71,115, 64,135, 33,202,246,191,186,183,112, 46, 32, 99, - 29, 57,133,188,142, 57, 95,119, 61,198, 56,131, 56,159, 63, 43, 38,133, 11,214, 41,137,153,185,102,223,148,236,127, 30, 67, 62, - 7, 30,139, 94,105,225, 26, 58,246, 85,227,185, 78,132,201,200, 96,199, 98,127,107,198,134,145, 17, 41,164,247,237, 70,160,177, - 88,159, 16,156,112,197,121, 12,239,123, 77,218, 34, 85,203,230, 4,214,155, 17, 66,132,196, 25, 34, 4, 95,179,212,113,112, 11, - 81, 77,236,201, 72,101,218,108,102, 9, 52, 17,147,213,160,107, 41, 47,245,248,151,136,221,252, 49,135,115,192, 69, 22, 19,101, -201,203,206, 96, 60,165,136,233,197,182,199,251,102,200,159,183,165,248,121,126,191, 52,194, 5, 16, 10, 89,196, 39,228, 44, 46, - 36,192,162, 67, 7,191,131, 1,104, 37,169, 66, 27,232, 20, 93, 29,122,139,216, 53,244, 37,121,147, 24,185, 70,248, 0,112, 69, - 6, 53, 85, 47,245,124,137, 76,203,217,104, 3,144,229, 96,219,145, 72,241, 97, 54,109,121,131,206, 46,173, 45,140, 41, 85,181, -163, 18,187,170, 57, 22,205,227,126,125, 68,155, 20,142, 90,150,130,180, 41, 32, 46,186, 59, 78, 55,239,144,232, 76, 73,182, 53, - 22,244, 9,114,226,161,237,211,126, 94,238, 72, 63,181,202,208,194, 28, 51,230,130, 56,107, 59,182,200,119,159,231,122,156,129, - 23,148,143, 14,154, 32,231, 35, 81,103,178,194,213, 79,192,130,230,214,244, 10, 32, 9, 23, 32,235, 64,172, 26,161,217,200,197, - 86,193,155, 72,210,184, 86,217,170,172,164,218, 35, 37, 59, 50,153,195, 70,251,179, 31, 63, 44,103,202, 92, 89, 31,121,175, 81, -155, 85,151,147,198,102,116,101,252,191, 91,132,115,168, 90, 4, 82,211, 14, 98,129, 47, 93, 49,206,227, 15,206, 85,137, 43,148, -190,181,115,100,195, 83, 31, 6,117,199,171,221,139, 83,182,199,169,146,172, 50,221,141,207,189,126,230,105, 44,226,146, 18, 20, -223,141,110, 92,179,207, 16,113, 93,183, 93,235, 93,215, 87, 18, 6,227,225, 6,211,116,203,186,113,123,189, 31,161, 16,128, 57, - 31, 21,156,170,235, 30,145,179, 85, 41,101,223,147,132,165, 73,207,182,237,178,112, 51, 42, 35,114,249,254,231,128, 9,125, 29, - 6,187,164, 33,193,110, 66,144,184, 8,236, 90,108,120,239, 23, 65,189, 22, 37, 17,142,140, 0, 85,150,149,165,108, 36, 5,101, -248, 72,218, 8,251,174,134, 67, 82,217, 19,234,159,223, 28,255,176, 52, 28, 82, 38,143, 98,185,162,204, 89,160, 44, 34,230,191, -241, 33,175, 97,183,152, 41,215,209, 82,101,144,201,201,160,222,108, 25,212, 82,235, 98,143, 51,161,104, 56,165,157,143,115, 14, - 19,253, 20, 89, 43,185,166, 27, 80,119,237,234,101,173, 28, 70,173, 86, 12, 86,213, 54,133,227,223, 51,168,159, 38, 31,109,204, -235,139,144,207,192,183, 88,217, 4, 33, 44, 2, 14, 17, 21,217, 65,103,232, 21, 13,106,181,160, 75,101,128, 3,176, 51,181,216, - 97, 8,218,108,210, 27, 63,223,254,115,107,213,196,108, 81,231,220, 4,221,154,108,180,237, 46,173, 86, 75, 80, 39,203,159,150, -218, 33,146, 26, 93,154,128,101,251,151,102,236,193,221, 61, 25,136,148,193,228, 38,112,112,181, 15, 97,144,202,146,147,216, 52, - 51,175,149, 6,147, 65,171, 19,167,170,136,234,125,248, 92,194, 49,138,142,165, 13, 53, 49, 62, 53,222,233,159,159,237,121,107, - 63, 79, 77, 49, 37,174, 78,217,171,246,188, 91, 5,105,142,114, 0, 6, 26, 22, 76,255, 25,107,112, 95, 9,216, 76,155, 73,115, -105,241, 71,106,250,223,210,201, 2, 11,117, 0, 88, 11,200,203,242,192,232, 13,127,152,154,249,102, 52,173,116,165,250, 22, 38, -221, 9, 23, 66,199,188, 25,212,215,198,104,247,185,127, 0, 48,121,222, 4, 42,218,189, 58,169,127,202, 2, 93, 47, 52, 80,136, -236,222,155,177,226,248, 86,252,236, 87,128,108, 88, 3,191,233,197,229,147, 29, 77,178,116,179,238,243,240,202,245,221, 98,241, - 52,159,131, 19,117,217,170, 20, 22,204, 88,164, 2,244, 30, 3, 15, 93, 82,228, 83, 45,134, 70,107, 69,154, 78, 77, 89, 47,133, -133,194,198,254,122,144, 84, 83,104,246,187,241, 80,170,174, 47, 49,251,132, 63,132,116,163, 3, 92, 99,182,193,115,128,112, 2, -226, 68,142,173,209, 4,197,210,190, 33, 9,165, 82,234, 43,230, 40,189,145,203,242,201,148,156,205,148,182,114,190,216,197, 3, -187,115,145,141,134, 63,169, 45, 82,234,182,184, 70, 79, 28, 75,238,164,109,191,127,238,118,251, 2,189,122,191, 89,216, 16, 8, - 66, 45, 83,160, 7,196, 53,202,123, 29, 6,192,162, 51,133,105,137,101, 88,107,249, 47,154, 58,212,116, 80,250,163, 99,222,244, - 67,246, 5,123,209, 74,144, 42, 96,114, 1, 2, 18, 83,173,150,251,213, 38,135, 75,183,178, 42,124,212,178, 37, 34, 56,107,227, -243,223,245, 6, 82,108, 18,172,194,229,214,196, 37,251,154,170,168, 17,115,162,233, 89, 45,135,251,180, 73,135, 32,154, 46, 64, -141, 54,112, 57,129,132,118, 88, 49,250,216,112, 73,171,255, 63,219,190,194,153,231,151, 49, 74,213, 89,120, 72,221,236,207,213, -173, 36,247,163,207,159, 76, 49, 86,196, 61,184, 42,230,109, 1,237,196, 68, 9,149,147, 46,178,210,100, 18, 10,171,205,159,247, -171,136,132, 93,136,185, 91,209, 39,188, 10, 74,228,149,164, 98, 43,104,149,251,227,220,248,190,118,214,207,167,249,243, 43,226, - 45,136,195,159,175,141, 22, 91,134,197,224,181,101,236, 5,209,123, 60,148,241,161,240,170,139,165,125,254, 71,251,160, 21, 71, - 26, 1,226,234, 30, 27, 87,229,120,181,146,182,149,182, 6, 83,186, 7,147, 41,168,142, 74,254, 12,218, 90,223, 2,234,181, 51, -246, 14,252,134,113,113, 36,221,125,177, 60,253,158,250, 39,172,126, 5,105,127,141,195, 89,189, 44, 40,130,122,244,115,168, 51, -110,219,201,139,154,249,166,161, 70,157,167,168, 43, 79, 52,188,195,184, 60,169,178, 89,129, 54, 45,211,171,223, 46,101,242, 28, - 53, 16,165, 42,171,217, 45, 24,169,138,110,139,197,102, 95,159,185,239, 77,183,193,243,196, 77, 63,181, 40,228, 84, 78,208, 13, -130,151, 15,173,171, 72,117, 91, 21,103, 91,212, 5,101,172,163,229, 69, 9,165, 82,141, 3,106, 80, 89,160, 3,225,191, 52,151, -172,181,125,235, 37,221,178, 18, 22, 84,161,178,247,154,245, 67,181,253, 79,166,138,110, 51,247,154,221,235,198, 94, 41,104, 85, -217, 45,123,173,149,209, 79,145, 48,110,230,164, 84,193,156, 43,183,201,173, 25,218, 16, 22,152, 4,202, 93, 85, 46,179, 91,159, -253, 14, 18, 66, 94, 91,143,202, 8, 73,221,133,133, 48,166,185, 63,210,204, 35,235,215, 29,151,222,240,238, 35,245, 2, 45,178, - 64,191,218, 4, 91, 49, 7,227,246, 40,173, 86, 48,117,253,204,109,176, 22,110,180,248,235, 90,225, 70,206,120,164,219, 77,131, -103,162,153,169,155, 68, 92,154, 74,113,208,239, 50,184,144, 33,232,204,220,183,104,198, 26, 84, 58, 55, 82,248,203, 54, 9,209, - 34,195,142, 12,226, 98,100,112,255,103, 92,194, 54,250,189, 23, 21,234,169,191, 17,235, 65,125, 75,133,173,222, 64, 30, 38,235, -182, 3, 90,180, 71, 88, 22, 51,225, 24, 99,245, 46, 48, 65,171,172,157,141,162,133,114, 69,169, 0,198, 81, 34, 82,146, 50, 57, - 13,148, 28,105, 26,108,217,239,234,103,209, 86,121, 47, 37,219, 39,181, 99,160, 98, 52, 53,122,222, 75,204, 53,172,114,230, 70, -237,206,254,215,189,110,233, 68,230,231,117,154,246,237,231,238,158, 99,137,206, 20,203,213, 67, 66,147, 79,134,107,128,113, 37, - 57,101, 52,223,183,127,231,133,169, 86,123,165,229, 25,242,155,231,106,156,114, 96, 20, 37,176,164, 89,154,136, 36, 87, 26,169, -242,138,194,109, 16, 23, 90,217, 76,200, 22, 74,110, 97,205, 89,132,250, 5, 5,121, 57,252,251, 83, 60,206,141,246, 88,162, 28, -132,191, 87, 80, 95,115,169,186,119,243,158, 87, 30, 8,108, 43,181,161,155, 89, 74, 87,197, 47,218, 78, 43, 82,172, 34,177, 49, - 83, 89,252, 50,157, 80,152, 83,205,122,221, 80, 99, 54,245,201, 15, 50,107,191, 68,168,180,173,237, 70,239,157, 67,160,144,147, - 65, 46,170,127,106,201,171,115, 51, 26, 24, 23,212,132, 44, 5,197,166, 27,211,249,101,143, 90,207,233, 20, 99, 93,107, 37, 8, - 25,245, 53,187,193,229, 54, 59,177, 20,249,217,251,200, 96, 90, 5, 42,151,159, 53, 5,182, 91,191,115, 93, 11, 35, 62,249,234, -156,213,116, 74,224,146, 45,141, 48,149, 12,223,190,223, 48,227, 23,215, 40, 18, 2,108, 2,160,173, 52,184, 14, 2, 69,134, 29, -152, 82,189, 26, 61,110,206,122,148, 77, 30,101, 59,122,180,212,174,182, 63,183,148,165, 70,196,164,184, 28,186,146,108,244, 71, - 89, 49, 82,234, 95,191, 57,159,110,243,220,234, 20,104, 49,178,181,111,172, 26,185, 40,207,152, 7,115,240, 19,202,124,205, 26, -139,178, 90,233,142,204, 72,108,226,199,204,213,150,214, 98, 12,186,231,123, 45,233,208,164,164,241,218, 56,225,246, 54, 10,224, - 67,188,209, 70,219,124, 49, 82,176,227, 32,231, 22,251,243, 58, 32, 58,130,104, 90, 85,213,220,138, 27, 91,122,248, 54,168, 59, -215,162,231, 23, 86,197, 88, 25,175,229, 61,181,217,191,164,142,179,163, 5,238,161, 5,145,123, 16, 39, 85, 42, 78,160,136,148, -141,248, 78,144, 37,115,143,237, 92, 45,103, 42, 35,196,231, 73, 26,135,105,211, 9,135,254,138,181,109, 27,150, 85, 0, 70,133, -179,108, 84,234,144,133,147, 79,253, 89, 88,242,255, 22,111,118, 34,104,243,231,173,244,251, 74,122,187,192, 23,233,140, 67, 71, -206, 70, 88,151,227,220,210,110,151, 92, 53, 55, 49,162, 71,227,230,228,174,207,216, 91, 89,205,236,105,159,193, 45,100, 16,247, -236, 56,207, 34,201, 84,173, 84, 58, 58,204,156,209,184,117, 51,173, 28, 88,157,215,243,186, 30,121,166,149,244,109, 41,222,152, -207,233,121, 75,254,124,214,161, 80, 27, 59,170, 33,239,200,195, 41,194,159, 5, 62,163,130, 57,115, 46,181,211,178,105,175,105, -189,205, 45,170,219, 38,168, 68,229, 92,214, 54,243, 69, 27, 91, 42,214,128, 64, 32,151,129,115, 57, 81, 87, 86, 75, 31,220, 26, -208, 34,251,197, 64,166, 95, 11,182, 77,220,182,242, 90, 29,137, 72,125, 2,106, 42,252,149,160, 61, 28,105,209,242,245,200,162, -167, 21,223, 96, 58, 93,107,214,158,247, 85, 56,211,117,211, 31,197, 38,253, 93,208, 19, 17,120, 55,157, 20,122, 89,224, 8,100, -169,167,222,171,182,108,201, 52,183, 63,231, 97, 48, 95, 24,103, 53,102, 62,108, 10, 1,110, 37,159,187, 74, 93, 76, 74,166, 86, -185, 22,147,160, 99, 49,233,198,159,188,146,196, 80,236,237, 69,195,202,112,176, 85,234,171,136,124,106,206,167,178, 11,214, 45, -128,215,212,232,136,124, 6, 89,198,225,152, 82,186, 14,171,253, 90,223, 47,160, 87,137, 91,142,184, 44,201,120,177,135, 73,104, -239, 27,120,156, 60,200,120, 76, 65,204,166,219,157,254,198,247, 79, 27,101, 26, 20,117, 42, 59,165,157,117, 34,131, 20,171, 42, -182, 18,216,169,227,150,223,163,107, 61,168,100,151,109,184,173,153,246,234,156,243, 68,165,189, 89,169, 83,196,189,245,100, 87, -192, 14,212,137, 39,148,204,152, 86,230, 83,116,218, 3, 27, 88,106, 47, 15, 45, 17, 17, 23,218,206,125,123,191,162,211, 7,217, - 40,197,188,185,115,105, 31,171,113, 10,199,132,145,112,142,242,195,163,153,177,203,188,218,196,110, 72,175,175,168,212,190,178, -232,180,147, 73, 69, 99,140,113, 74,168,102, 65,164, 65, 58, 11, 28, 9,128,201,123, 83,133,247,193, 54, 5,113,155, 76, 56, 53, -134, 65,162, 82,105, 59,141, 73,192,236,146, 29, 49, 39, 14,122,210, 0,224, 6, 36,215,204, 44,209,186,241, 69, 27,204,114,123, - 45,241,251,141,208,140,153,249,246, 21,122,185,159,121,211,140, 0,246,211, 84, 44,104,181, 66,135,227,213, 10, 93, 59, 43,214, -216, 98,225,252, 62,104,149, 18,184,120, 34, 52, 63, 51, 95,187, 97,114, 61, 80, 41,227,109,147, 22, 6,140, 78, 95,219,166,231, - 28,132,245,168,189, 32, 45, 20,104,227,191, 38, 25, 64,165, 28,114,206, 74,244, 72, 34,217, 66, 90,176,115,174,116,126,244, 24, -187,160,236, 54,236, 79,155, 86,246, 8,253, 62, 72,186, 23, 9,192, 70,194,104,147,173, 81,245,170,149,235,104, 12,208,183,219, - 55,177, 56, 50, 54,196, 25,237,207,246,125,108,229,172, 5, 74,219, 17, 88, 79,136,182,186, 13,107,221,144,209,223,109,141, 54, - 36,134,225,249,111,105,241, 55,207,121,140,105, 28, 77, 53,233,105,177, 81,219, 35,148,216,189,255, 34,105, 84,153, 90, 25, 43, - 31,142, 62,155,119,138,158,204,188,164,210,158,145, 6, 46,178,152,155,213, 7, 84,154,138, 88,117,177,185, 15, 50,157, 98, 88, -111, 72,209,194, 83, 96,116,225,169, 5, 52,169, 32,138,106,104, 11, 54,102,154,253,226,236, 19,128,172, 88, 70,113,163,205,181, -165, 24,231,134,206, 88, 39,129,116, 38, 83, 44,188,104,165, 67,112,203,161, 29,129, 78, 68, 78, 39, 47,107,192, 10,138, 82, 42, - 26, 17,129,155,114,112, 84, 16, 5,161,169,168,117,209, 73,147,128,181,166, 42, 41, 57, 80,229,181,244,160,123,167,201, 0, 85, - 64,137, 66,206, 77,171,156,237, 53,233, 23, 61, 69, 67,215,169,159,171,208, 71, 72, 64,174,154,248,104, 16, 75,152,143,244,121, -119,206,151,182,183, 21, 94, 73,130, 15, 10,132,139,173, 25, 80, 54,126, 32, 65, 85,148,211, 96,174, 60,253,252, 44,120,207, 93, -197,153,121,208,185,198, 73,226, 76, 48,252,232,220,253,200,179,165,162, 82,134,228, 90,230, 40, 91,184,230, 10,219,249, 58,154, -114, 5, 56, 72, 37, 72, 29,148, 67,157, 53, 14,136, 25,228,114,216,226, 42,123,105,164, 7, 10,102,128, 87,128, 91,182,249, 84, - 3, 68,221, 19,172,241,133,195,178, 43, 97, 43,236, 16,226,189, 0,156, 54,240, 20,160,144,105,127,167, 68, 10, 37,217,210, 54, - 59,193, 45,146,161,152,250,147,165,157, 78,131,100,169, 96, 86, 12,175, 93, 58, 11,100,234,190, 95,254,206, 98, 56,250, 42,176, -255, 76, 54, 64, 96,137, 53,112,112, 77,112, 42, 6, 30, 29,181,202, 6, 27, 17, 65,136, 42,234,229,154,125, 69, 0,144,171, 28, - 19,251,247,189, 58,165,228, 4,165, 57,239,252, 28,106,101,234, 92, 86, 2,141,233,119,171,178, 30,213,209, 9,197,102,111, 7, -164,140, 99, 89,218,117, 84, 18,136, 50,199,231,205,130, 74, 43,113,139, 21, 89,171,194, 71, 65,123,100, 61,220, 36,144,206, 21, - 75,229, 1,164, 3,243, 28,210, 94,192, 6,235, 21, 35, 68, 34, 66, 46,104,172,145, 86,228,118,238,172,178,213,209,240, 66,236, -185,198, 88,101,172,185, 8,101,213,238,164,119,126, 37, 49,201,234, 24,113,206,235,196,128, 7,135,243, 6, 81,155,145,216, 33, - 32, 43, 23, 80,161, 37, 36,170, 95,157,190,118,112,185,165,235, 74, 37,106, 45, 39,147, 34, 78,204,179,182, 80,190, 86,197, 44, -229, 3, 83, 84, 52,124,182,176, 20,100, 37,167,116,129, 92,158,235,235,247,235,215,153,143, 46,116,242,231,137, 78, 22, 81,148, -137, 88,204,249,184,140,242,231,230,252, 18,112,161, 42,188, 65,147, 2, 85,104, 2,167,182,126,254, 58, 81,158, 70,226, 49,170, - 72, 21,219,206,196,192, 73,174, 54, 6,150, 27,135,228,170, 66,103,217, 90,118, 18, 8, 28, 35,156,243,112,144,188, 81,214, 99, -217,225,187,214, 19,155,102, 17, 13,230,243,213, 73, 46, 97, 44,152,185,178, 9,137, 51, 96,142, 83, 27, 91,189, 4, 84,250, 84, -172,249, 8, 23,187, 71, 94,120,121,103,248,144,180, 46, 99, 41,200,147,169,172,125,149,211,213,239,163,182,206,133, 48,148,118, - 44, 89,112,190,247,194,190, 25, 11,177,105,111,123,147, 92, 49, 81, 81,193,211, 36,130, 92,139, 10, 47, 74, 89, 80, 37, 92,147, - 72,246,182,177, 68, 41,233,193,210,205, 74,131, 56,136, 16,108,155,216,116, 1,132, 0,206, 73, 11,242, 8, 77,244,168, 73, 89, -239,201,192,212,208,152, 52,185, 43, 10,128,194,141, 71, 57, 79,190,225,215,234,239,244, 64,161,145,159,118, 4, 32,142, 87, 70, - 95, 43, 22,146, 6, 25, 95, 0,134,249, 58,176,237,210,177,174, 79,215, 84,238, 69,179, 63,214,164, 77,147, 61,155, 44,148, 78, - 69,136, 89,235, 74, 22,109,252,102,132,227,234,209, 74,205,198, 57, 44,233,168, 24, 37, 69, 24,251,218, 27,186, 86, 95,105,142, -172,115,251, 89,113, 12, 45, 80,202,147,203, 0,171,244, 60,204,135, 99,249,218, 38, 61,197, 91, 97,224,162,216,124, 14,211,190, -239,153, 20, 41,217,221,230,158,168, 11,154, 5,178,149,128, 13, 73,215,127,163,171,186,101, 62, 53,154,129,247,215,202, 13,100, - 96,155, 42, 41, 88, 81,169,101,215,115,154,166,225, 61, 81, 86,132,158,126,237, 78,181,133,143, 26,186, 84,121, 97,238, 36, 93, -253, 96,255, 67, 9,234, 97, 21,243,181, 46,191,235,149,103,103, 13, 93,168,104, 97,183, 31,184, 80,120,178,254,117,177,162, 52, -136,211, 82, 65, 65, 12,250, 57, 22, 32, 21, 35, 41,105,145,196,212,166,205, 95,215,163,202, 64, 86,215, 55, 20,135,184,228, 79, -157,146, 3, 1,155,164,129, 36,129,151,244,125,202, 49,183, 74,201, 84, 92,245,152, 43,105,115,190,132, 36, 54,194,249,152,144, -218, 85, 45, 76,191,207,189,135,174, 57, 95, 50, 95, 91,177, 17, 43, 70,162, 63,143,221, 98,100, 90,239, 52,208,136,187, 91,168, - 73, 26,217, 85, 9, 78,101, 5,197, 36, 71, 82,228, 46, 43,191,167,117, 75,169,138, 72, 53, 40, 9, 90,167, 49,148,142, 76, 10, -222, 85,154, 23,101, 14,158,236, 16,139, 70, 29,152, 8,206,177,233, 76,228, 57,111,148, 70,198,149,168,213, 68,112,108,191, 79, - 69, 46,212,149,234,181,206,170,134,138, 78, 52,182, 54,213,100, 58,113,211,107,139,148, 59,192,166, 51, 46, 73,158,184, 88,151, -234,235, 71,116, 64, 44,173, 36, 81,219,235,165,170,224,101,123,222,185,177,203,149,165,164,245,159,199,182,227,197,115,193, 38, - 88, 84,115,147,200,216,205, 52,207,225,136, 83,139,190,184,232,149, 89,231,210,163, 61, 93, 10, 30,183, 97,227,192,100,197,216, - 56, 82, 7, 38,148,181, 86,253,136,155,156, 51,180, 53, 42, 32,114, 80,167, 1, 32, 14, 81,224, 40, 5, 93, 5,253, 22,124,136, -189, 79,204,139,202, 28, 3, 54,197,200,105,139, 5, 11,244,250,226, 95, 8, 99,180,183,117, 21, 27, 98,129, 90, 12,134,244,173, -122, 35,128,162,130, 34, 66,130, 57,134,242,108, 9, 85,236, 8,140, 15,130,100, 43, 72, 90, 5, 18,155, 53,160,166,229, 82, 5, -123,154,196, 84,104, 49,134, 89,244, 93,179, 65, 83,223,109,232, 32, 28,195,127, 74, 89, 91, 11,244,163,241,197,218,207, 87,131, - 58,173,131, 13, 53,128,247,157,128,210, 57,232,188, 59,244,227, 4,200,178,157, 79,217, 35,197,166,190,146,246, 5, 89,140,155, - 99,217, 51,214,186,200,229, 73,146, 44, 91, 92,112, 30,148, 52,129,213,174,180,100, 96,162,193,141, 75, 16, 39,150, 92,237,165, -108,181,182,249, 77,219,160, 84, 50,109, 16, 43, 84, 19,137,185, 82,204,129,131, 85,196,164,138,153, 56, 69,241,216, 54,125, 85, - 8, 65,149, 43, 53,192, 27, 29, 1,228,246, 16, 83, 85,148, 27,125, 95, 3,175, 6, 93, 71, 84, 0, 86,138,194,142,185, 82, 72, - 95, 43, 15, 48,125,223,233,131, 41,218,198,207,156,226,152,218,168,250,181, 61, 54, 10,211,141,223,110,173,245,180,195,177,208, -102, 22, 78,150, 90,194, 25, 92, 81, 73, 56, 21,177,205,102,243,205,237,162,104,174,149, 41, 99,169,168, 44,117,224,168,197,194, -161, 85,181,171,180,165,165, 27,227,236,250, 41,198, 42, 84, 54,118, 6,229,123, 79, 70,219, 61, 85, 10,181, 74,232, 4,102, 20, -136,147, 37,131, 9, 75, 20,241,228,124,217, 96, 85,219, 64,184,203,212, 87, 3, 67, 68, 20,106, 16,232,132,254, 92, 42,194,148, - 76,165, 94, 43, 71, 89,204,124, 53,248,106,112,150,174, 58,235,131,182,181, 99,181, 0, 58,233, 54, 53,251,247,165, 61,237,170, - 35,222,168, 43, 81, 42, 5, 83, 13,150,223,101, 46,237, 61,196,196,239,150, 96,218,209, 5,188,147,168,110,161, 84,120,153,245, -208,119,140,160,202, 87,198,250, 82,168,147,124,109,217, 49, 86,217,177, 49,246,232,128,132, 92, 24, 58, 93, 96,151,218,196,213, -231, 74, 50, 6, 36,136,128, 61, 26, 12, 66,227,116, 5,128, 93,197, 62,104, 5,238,108, 37, 40, 99, 84,185,165,104, 54, 44,129, - 21, 3,147,158,110,181, 54,171,237,103,240,163,223,239,193,147, 64,132, 16,167, 4, 53, 31, 37,239,219, 80, 7, 63, 45,126, 56, -183,155, 57,237, 51,142,212,179,160,151, 83,205,251,143, 76,233,245, 36,201,145, 38,213,201, 80,119, 50,193,230, 12,188, 80,207, - 86,185,250,113, 21, 89, 63,106,151,175,205,250,215,174,227, 26, 80,184,196, 42, 9,141, 7, 70,255, 94,125,165, 60, 42, 18,134, - 8,126, 85,154,139,221,249, 81,127, 14,219, 30, 9,108, 40,171,163,113,235,136, 69,224, 29, 85,237,247,138,120,182,149, 67, 13, - 10,202,227, 83,100,171,152,139,147,188,157, 37, 7,139,152,171, 55, 65,140, 93, 21,166, 40, 33, 74,138, 93, 35, 67, 8,139,230, - 18,233, 64,230,101, 67,212, 48,222, 86,250,142,234,121, 71, 18, 48, 83, 87, 9,213,223,171,240,243, 52, 14, 40,109,117,174, 6, - 26,169,149,105,199, 3, 84, 42,127,213, 42,214,135, 59, 72,210, 34,143,221, 38,163,213, 92,144,246, 88,111,142, 42, 25,213, 28, - 93,181,239, 74,199,139, 44,154,191, 65,187, 13,105,248,156,133,125,200,215, 23, 72,254,224,220,204,244,116,230,196,107,217,108, -158,169,145,140, 16,222,174,116, 50,156,213,116,103,169, 0, 55,182,247,175,138,184, 56,117, 61,107,228, 74, 92,139,171,104,170, - 49, 50, 40,251, 26,252,188,118, 66,162,148, 57,184,206,217, 41,119, 7,100,129,147,208,100,144, 23, 64,203, 30, 75, 81, 55,206, - 28, 80,216, 53, 26,241,105, 6, 42, 5, 0,102,219,228,122,143, 35,122,240, 97,213,113, 16,146, 85, 94,121, 10, 98,203,115,227, -114, 76, 9, 11,204, 57, 45,170, 89,118,185,139,102, 62,171,178, 93, 64,201,143, 90,164,102,207,102, 79, 0, 0, 32, 0, 73, 68, - 65, 84,180,171, 73, 8, 97,160,223, 32,200, 0, 49, 45,220,104, 13, 39, 82,197,107, 92,127, 29,121,105,162,100, 41, 83, 97,133, - 32,230, 58,240,109,251, 25,217,168,114, 85, 20,162, 98, 23,156,247,165,237,204,165, 41, 37,229,107,201,237,247, 24,151,106,115, -182,205, 41,125, 5,109, 59,212, 3, 61,249,242,108, 58, 54,190,229,220, 34,232, 5,139,231,106,209,173, 48,137,192,112, 54, 28, - 3,196,229,110,152,115, 96,114, 96, 55,101, 35, 22, 32,204, 49, 87,229,220,149,239, 84, 42,104, 24,172,134,106,222,235, 76,141, -244,102,139,182,252,179,121,144, 80,146, 91,165, 78,225,109,165, 77,174,180, 18,150,174,149,238, 12,162, 94,172, 85,112, 82, 3, -117, 92,173, 69,173, 91, 94, 49,230, 33, 25,196,197,106, 68,229, 60,111, 48, 96, 24,206,241, 38, 82,126,196, 30,104,131,120,104, -215, 97, 67,138, 34, 28,179,252,176, 38,183,212,109,212,228,105,149,125,210, 38, 49,219,214,186,109,119, 35, 57, 15, 26,241,144, - 42,246,193, 86,163, 26,173,225, 5,101, 35, 18,210,141,137,181, 61, 95, 77, 63,146, 81, 9, 87, 29, 95,146,165,113, 11, 42, 5, - 41, 26,203,212,188,154, 76,165,223, 47,122,105,130, 92,122,175,138,124, 38, 44,143, 92, 30,110, 99,233, 73, 41,104,104,104, 79, -134, 20,148, 43,122, 87,144, 2, 41,104,115, 54,174, 80,154, 14,119, 94,237,178,201,139, 85,145,148, 42,150,162,162, 9, 57, 5, - 34,151, 55, 94,165, 41,100, 19, 3, 36,148,101,212, 46, 70,105,153, 91,124,113,110,117,138,113, 84,211,185,183,182,115, 80, 65, -125,148,199, 46,165, 67, 99, 44, 24, 27, 32, 9,115,245,128, 95, 4,158, 42,231, 90, 44, 28,179, 72, 11,163,175,168, 66, 1, 22, - 38, 26, 91,213,103, 46,179,122, 82,101,132, 22, 53, 14, 84,106, 99, 95,169, 23,238,122,167, 81, 45,212,206, 1, 35,198,192,195, -117,158,185,148, 77,153,236,231, 54, 25,122,157,229, 74,163,146,166,221, 16, 49, 0,175, 14, 61, 85, 59, 76,157, 88, 76, 3, 8, - 26,206, 49,219, 74,157,224,183, 21,233, 6, 21,158,165,232,132,108, 74, 18,161,192, 41, 52, 0, 42,238,209,207,166,194, 40, 65, -199,204,172,251, 49,129,115,190,101, 97,244,231,192,213, 18,216,173, 33,148, 59, 10, 92,179, 6,172,165,179,125, 52,180, 27,199, -173,214,188,214, 20, 49,211,250,154,239, 47,193,216,235, 85,158,200,201, 10,114,156, 44, 46,149,218, 70,213,124, 63, 19, 30,182, -240, 89,128,140,169, 88,179,254,228,221,104,108,146,198,132, 18, 37,119,106,218, 68,182,218, 63, 80, 26, 95, 24,204, 76,111,172, -229,114, 48,139, 49, 86, 25, 90,243, 89, 23, 51,225,174,149, 61,101,116,183,254,253, 2,195, 51,232, 86,140,208,253,107,221,196, - 53,228,123, 5,159,110,179,158,214,216, 2,189,200,205,218, 58, 41, 51,125,185,159,242,228, 66,166,153,198,214,201,205,254,220, -253,190,119, 84,216, 53, 77, 21, 84, 51, 30, 46,170, 59, 69,106,193,204,158,211,247, 82, 5, 75, 38,112, 16,146,247,116,106,203, - 85,229,117, 42,178,176,137, 39, 94, 60,171, 81,173, 53, 13,204,166, 51, 6,177,128, 52, 87,102,196,101,150, 58, 48,110,209,163, - 35, 70,204,166, 1,250,125,148,205, 88, 10,192,134, 75, 71, 1, 69,217, 77,131,179,179, 64,156,133, 96,139,148,191,149,238, 24, - 11, 38,160, 73,130, 77, 36,170,237, 99, 6,134,149,130,114,167, 59,241,252,102,228,129, 30, 77, 94,128, 77,245,129,106,171,213, -196,187,102, 44, 65, 92,250, 39,126,101, 83,178, 15,133,149,170,212,192,228, 10, 27,162, 86,219, 10,156,209,113, 76, 17,192, 48, - 34, 41, 14,190,128,249, 34,173,163,252,169,243,139,239,165, 47,203,239, 59,110,123, 0, 93,251,139,105,172, 56,149,109, 19, 50, - 37,175, 2,203,154, 13,179,211, 91,111, 2,123,238, 36,168,182,123, 19,204, 77,119,199, 43,229,110, 68, 55,226,177,244,171,203, -201,169,227,164, 72,181, 37, 85, 27, 99, 92, 72, 11, 91,162,153,206, 12, 53, 80, 17,183,232, 92, 81, 63,104,170,115, 92,235, 31, -237,178,226, 85, 85,192,162,210,137, 72,231,234,155,177,196,168, 93,175,237,127, 89,185,223, 13,111, 92,245,219, 81,181,223, 9, -148,140,135,164,254,188, 4,149, 78,134,182,151,243, 36,166,230,111,150,116,180,106, 8,148,198, 60, 74, 57,205,207,149, 91,182, -108, 79, 1,190,122,153, 87, 93, 63,234, 43, 35, 98,171,205,182,111,219,227, 19,156,231,122, 93,128,205,160, 55,242, 88,215,181, -232, 48,150,153,213,231,103,148, 0, 39,118,200, 88,138,149, 7, 20,179, 45, 87,204,145,136, 87, 63,127,183,163,143, 17, 15,127, -141, 13,180,165,171, 31, 86,176, 29,213, 59,160,103, 12,228, 62, 42,113, 54, 13,146,174, 59,208,162,244, 89, 13,123,226,125, 49, - 1,237,185,246, 98, 58, 34,188, 74,127,172,210,221, 8,185, 90, 51, 2,173,165, 77, 39,112,218, 62,168,172, 55, 84, 91,199, 88, -164, 73, 9, 33,183,133,235,145, 51,212, 62,189, 87, 40,191,167, 80, 2,221, 68,154,142, 21,197, 5,150,161, 55, 15, 40, 50,163, - 10,214, 42,160,188,152,209,127, 82, 64,120,234, 68,149, 42,214,148,108, 56,152,185,124,254, 56, 44,104, 92,175,139, 30,186, 65, -197,150,138,132,200, 24, 86,232, 92,200, 56, 5, 73,109,192,199, 8,120,195, 22, 40, 26, 91, 5,253, 94, 41, 52,206,206,100,165, - 19, 31,232, 43, 10,123, 83,145,219,107, 5, 2, 95,223,223,243,132,222,119,184, 65,235, 71, 41,159,165, 85, 42,163,102, 19,179, -247,200, 42, 72,121,178,118, 57, 70,106,145,244, 58, 91,231, 36, 73,237,246,236, 67, 29,115,103,167, 8,186, 48,192,217, 74, 81, - 31,242, 89,214,128, 46,178,152,189,177,250,215,218,135,179, 43,147, 93,199, 7,151,149, 77,166, 40, 22,178, 17, 62,113, 92, 81, -196, 58,126,112, 45,239,157,200,193,113,181,178,132,142,117, 12, 80, 78,231,241, 61, 80,206,242,202,155,185, 28, 58,214, 67,193, - 90, 50,156,167,188,166,104,168,140,198,224, 5,250,217,254, 92, 72, 58,179, 19,109,199,102,124,136, 42, 78,202, 74, 37,232,124, - 25,107, 81,215, 38,151,210,142,231, 38,217, 18, 4,244,114,196,170, 84, 55,234,154,176,168, 83,158, 12, 18, 31,203,158,176,168, - 21,160,218, 4,215, 36,250, 36, 31,187,145, 69, 72, 73,159, 24, 67, 4,210, 98, 68, 5,153, 28,231,153, 58, 53,251,128,189,255, - 20, 67,178,160,206, 88, 24, 49,152,152,164,107,158,159, 26,137,181, 3,198, 46, 57,146,169, 75, 32,120,209, 70, 39, 18,204, 57, -208, 16,176,169, 49,223, 35,216, 23, 65,112, 69,111, 67,131, 10, 13,102,231,106,152, 69, 74,169, 66, 68,182,244,206,193, 71,131, -121,204, 45,246, 88, 0,202,105, 86,172,192,190,101,178,161,184, 27, 77,202, 74,210, 39,146,172, 88,227, 9, 69,183,142, 37,176, -198,119,183,148,183,126, 30,223, 39, 16,246, 26,106, 71, 45, 28,238,186,100,107,153,100,199, 92,200,233, 88, 43,228, 98, 36, 12, - 19, 64, 26,182,255,151, 69,141, 27, 38, 58, 73,124,102, 62, 22,206,163,115, 14, 59,239,171, 72,254, 60, 87,116, 44,145, 9,234, -166,234,107, 90,172,249,161,202, 65,205, 65, 50, 78, 43, 46, 50, 56, 46,212,155, 56,252, 80, 45,245,101,196,117,239, 44, 91,165, - 39, 25, 74,169, 68, 11, 74,140,150, 34,211,106, 45, 90,121,172,149, 34, 34,177, 90,212,245,182,129, 10, 44, 82,109,113, 88, 49, - 5,201, 9, 6,137,225,189,198, 82, 29, 59,170, 86,114,108, 28,161, 98, 70, 79, 42,101, 44,201,165,242, 2,128,177,168, 38,144, - 21,219,152, 19,100, 45,241,120, 82,203, 90, 84,226, 55,243,165, 99, 27,200,218,106,115,236, 38, 53, 66,142,171, 0, 75, 60, 30, -224,116, 70, 75,173, 3,155, 26,160,176,202,180,105,151,194,200, 84,218,214,120,242,236, 11, 57,224,165,135,205,173,202, 60, 38, - 84,248,180,223,153,214,177, 44, 54,175, 30,189, 90, 90,200, 57,160, 71,106, 13, 85,180, 10,117,163,249,165,237, 6,232,198,224, -108,151,160,138,235, 36,170, 85,132,115, 83,249,132, 22, 64,151,218,246,153,189,202,249, 33,173,112,147,122,205, 76, 91,110,132, -132,181,130, 30,118,140,165,126,203,206,185,162, 52,161,235, 43, 74,245, 63, 71, 49, 20, 25, 52, 2,141, 63, 53,181, 52,230, 60, -118, 99, 4,239,243, 75, 8,156, 72, 81,222,131, 36,122, 29,187, 9,199,195,140,221,238, 12, 66,192,241,238, 22,196, 14,158,128, -105,231, 49, 31, 67,227, 32,102, 77, 90,202,184, 3,235, 46, 94, 18, 35,216,167,164,230,112, 8, 8, 33,192, 57, 46,154,248,146, - 55,237,227,241,136,201,123,204,243,140, 16, 2,206, 47, 47, 48,207, 51,162,254,108, 74,202,112,187,221, 14,215,215,215, 56, 59, - 59,195,235,215,175,225,220, 4,206,191,227,156, 75, 20, 54, 6,246,251, 61,110,110,110,210,247, 68,146,189,186, 6, 31, 17, 80, -156, 43, 38,198,161,184,193, 81,168,246,176,169,255,236, 10, 88, 44,237, 40,105,237,135, 60, 95, 78, 88, 31, 49,136,232, 10,140, - 83,246,140, 38,133, 52, 8, 90,250,249,185,163,148, 85,101, 71,165,152,173, 40, 79,198,174,114,149,165, 62,112,204, 84, 89,129, -206,197, 3, 98, 78, 94,166,105,159, 62, 91, 72,184,133, 8,107,227,156,100,162,251,106, 94, 91,241, 77,176, 55,162, 63,141,250, -162,132,242,115,235,249,110, 27,150,100,220,215,234, 26, 74, 55,204,123,215,168,220, 89, 36,191,213,123, 23,163,151, 64, 41,219, -200,251,180,203,212, 66,189,174,161,165,205,122,159,240, 40, 33,150,100,164, 20,109, 76, 96, 55,173,116, 17,150, 99,183,126,132, - 66, 68,152,202,254, 40,101,189,123,196, 25,136, 25, 93, 44, 41,251,167,130,118, 79, 82,147,165, 61,163,114,153, 42,238,109, 81, -147,166, 53, 64,228,114,246,108, 23,164,169,244,136, 74,219, 62,102, 32,153,242,123,173,193,130,228,214,112,239, 14, 21,161,155, -174, 43, 45,143, 50,161, 18, 52, 95,167, 33, 33,213, 76,157,211,223,165,153,185, 7, 98, 44, 64,182,230,152,215,179,207,155,162, - 99, 42, 21,122,200, 62,231, 1,213,250, 47,241, 87,235,156,172,102,254,161, 73, 58,180, 2,103,245,218, 45, 18,188,212, 80, 37, -172,225,194,102, 11, 73,198,160, 10, 73,131, 67, 56,151, 43, 74, 74, 61,140,116,105,212,103, 59, 46, 20,159,250,255,188,119, 67, -133, 43, 21,154, 57,219,239,202,249,218, 74, 81, 43, 67, 9, 49,205,165, 41,181,172, 10, 37, 45,115,169,217, 80,138, 90, 35, 3, -170, 98, 31,230,107, 71,109,229, 9,239, 86, 53,253,150,210,142,173,120, 82,164,122, 95, 71,252,225,181,153,104,105, 45, 50, 25, -235, 84, 1,145, 47,129, 55, 81,224,124,241,172, 87,242,147,234,187,171, 68,167,226,150,150, 29,171, 58,154,104, 86,213, 66, 1, - 80, 22,211, 56,206,237,225, 94,203,157,135,191,215,230,138, 61,234,155, 6, 28, 97,226,164,162, 23,217, 33,100,232,172, 72,132, -144,100, 13,137, 76, 71, 19, 73, 65, 84, 34,238,142, 7,144, 99, 76,251, 93,122,118,142,135, 18, 84, 37, 95, 23,203,140,226, 21, - 43,207,190,189,237,124,230,213,199,136,105,154,112,118,230,210, 90, 12, 71, 28,143, 71,248,157, 47,247, 51,100,183, 47, 55,249, -210,197,121,112,121,137,187,195, 1,204,140,195,225,128, 16, 35,230, 16, 16, 69,176,219,239, 75,100,112, 52, 97,183,219,229,238, - 99,132,247, 30, 62, 28, 0,246,121, 43,180,137, 9,151, 96, 88, 13, 62,196,140, 34, 93, 65,204,199,210,185,172, 85, 58,169,110, - 63,185,170, 33, 64, 58, 10,144,142, 26, 91,197, 79,162,200, 80,245, 79, 19, 81, 27,212,171,243, 89, 28, 42,197,233,191,201,249, - 77,222,120, 63, 35, 39, 3, 82, 35,178, 12, 29, 49, 88,149,218, 77,153,101, 32,113,107,254, 55,101,246,134,154,111,201, 64, 27, -225, 36,254, 97, 0,222, 43,157,128, 16, 26,240,222,218,223, 44,168,120,165,184,163, 5, 35, 98, 52,166, 0, 81,194, 31, 24,163, - 13,217,112,191, 60,165, 61,175,163,233, 81, 92,240, 18,131,201, 76, 56,183,114,165,184,153,179, 6,120, 72,227, 38,229, 64, 11, -196,181, 52, 51,146,177, 34, 91, 75, 97, 73,104, 97,206,116, 54,171, 85,221,183, 19, 71,199, 33, 80,160,111,223,197, 49,186, 88, - 95, 95, 66, 92,188,174, 85,152,242,236, 54,207, 71,219,239,182,245,104,195, 12, 99, 42,159,187,225, 63, 54,128,239, 56,158,199, - 81,157,201,172,254, 11,113, 1,178,234,219, 75,155,176, 12,230,162,168, 54,156, 45, 13, 68, 49, 44, 72, 77,194,156,144,170,185, - 43,163,201, 16,101,144,198,197,131,203, 18,188,237,117,212,224, 92, 40, 75, 93,251,217,138,129,180, 51,247,106, 88, 34,156, 44, -122, 99,215, 97,176,138,103,189, 15,253,162,146,161, 22,157,190, 22,212,251,249, 95, 5,227, 73,229, 65, 83, 75,167, 35,178,118, -103,220,140, 3, 10, 95,159, 76,101,110,215,241,130, 7,203, 13, 29,235,212,195,223, 43, 79,173,222,127, 58,193,179,142, 75,170, - 22,229, 22,140, 85, 83,236,185,190,118,140,176,219,237, 16,130,152,174, 79,186, 47, 65,193,156,131, 57,170,254,173, 35,218,116, -245, 82,151, 46,225,180,255, 28,143, 71,163, 66,231, 50,168,149,225, 39,143,249,120,192,110,242,224,201,227,238,238, 14,206, 57, - 60,123,245, 26,211, 52, 97, 98,135, 67,136,216,237,118,120,244,198,155,152,166, 9,119,119,119, 64, 72,193,111, 62,222, 97,154, - 38, 56, 16,230, 57, 85,237,251,221,121, 17, 82,176, 65, 61,198, 88, 42,118,132,222, 53,172, 58, 49, 82, 6,192, 54,207, 24, 87, -245,192,130,172,199, 64,140,218,104,238,151,181,142,165,178,157,142, 83, 99,151,172, 59,237, 68, 58,218,164,136,201, 10, 32,176, -242,216,219,207,215, 43, 12,206,217,218, 20, 81,134,115,125,160,173,108, 85,186,183,232,208, 43,241, 68, 90, 26,179,121, 80,154, -215,235,159,163,126,255, 91,140, 91, 98,172,120, 25,230,161, 61,170,196,170, 5, 96,245, 5,146,233, 90, 39,196,100,186,215,162, - 54,192,100, 70, 90, 13,251, 65, 22,206,109,210, 41,163, 70,169,206,149,118, 36,167,123, 67, 92, 70,124,120,109, 3,114,202, 35, - 12,165,136,192, 58, 35,146,144,225,144, 73,236,133, 75,121, 81,129,113, 82,128,114,249,247,196, 72,137, 50, 10,197,162, 42, 54, - 81, 86,124,170,252,236,162, 52,102,142,118, 86, 61, 58,242,104,134,165,127,159,249,152,218, 14,180, 71,197,181,195,251,230,245, -236,251,137, 4,163,128,166, 34, 47,174,157, 93,147,110,232, 78,241,243,205,249, 56, 55,165,243,144, 86,105,142,179, 34, 93, 64, -200,220, 79, 89, 15,186, 27,168, 73,113, 58,151,246,128, 67,115,148,116,177, 17, 16, 50,207, 56,128, 34, 97,150,185,124,237,136, - 32,228,243,145,202,177,228,216,218,201,232, 40,122, 46, 63, 8,147, 59, 55,180, 47, 44,230, 78,211, 52,165,207,224,120,209,190, - 39, 34,204, 49,140,145,217,202, 25,238,208,173, 11, 33,147, 92,109, 55,149,137,240,226, 33, 95,203,162,131,142, 9, 76, 50,105, -103,207, 54,153,235, 59, 9, 96, 42,149,214,125,188, 7,138,160, 10, 58,150, 9, 15,236, 81,141, 51, 92, 3,138, 92, 73, 52,214, -193, 89,127, 79, 23, 65,203,195,239, 55,123,170,157, 11, 23, 35, 8,177, 27, 91,164,189,110,191,223,227,238, 56, 35,132, 35, 66, - 8,136,243,161,160,190, 23, 60,222, 13,212,242, 16,232, 20, 66,153,139,122,239, 65, 25, 77, 77, 2,176,119,184,187,185, 69,136, -130,221, 52,129,157,131,219, 77,101,164,229,167, 61,246, 83, 68,136,128,176,195,229,195, 71,240,222, 35,204, 7,188,186,126, 13, -151,147, 1, 79,140,227,241,152, 2, 20,113,150,190,229,130,135,104,128,103, 11,153,232,216, 86,180,177,159,239, 14, 58, 75,131, -235,191, 8,178,250,251,243,186,111,122, 31,132, 71, 8,253, 24,101,147, 37, 97,209,235,163,106, 94,250,153, 47,218,228, 88,131, -122, 83,204,109, 0,220,100, 5, 72, 70,178, 6,152, 93, 42,213,245,173,106,108,116,242,104, 5,112, 54,210,196, 31, 62,127,206, -165, 17, 71,136, 57,174, 73,145,169, 46,114,220,166, 24,161,238,231,148,181, 77,214,158, 95, 43,243, 59,138, 11, 22,239,166,251, -148,223, 57, 70,100,128, 35, 35, 97, 51, 18, 33,159,169,182,225, 89,209,237,185,165, 87,213,231,178, 76, 32, 73,181,183,150, 88, -124,169,235, 76, 67, 26,231, 43, 5,230,121, 40,228,191,145,143,104,120,134,178,184,145,237,127,189,112, 64,109, 77, 80,225,106, -163, 3,210, 81,225,181,198,194, 83, 44,115,137,242, 96, 74,245, 15, 21, 83,141, 72, 52,180,189, 74,249, 42,188, 79, 89,162, 91, - 75,183,163, 36, 0, 92, 42,175, 56, 71, 3, 36,163, 77, 15,236,209,141,103,230, 12, 22, 74, 71,202, 10, 57, 18, 19, 93,104,242, - 83,178,119, 12, 57,171,204, 71,138, 4, 71,110, 8,176, 82,222,110,132,192, 79,174, 80, 1, 41,107,106, 51, 19, 28,165,160,189, -207, 45,202,158,138,162, 65, 61, 38,130,235,208,231, 59, 33,196,121, 19,173,170,226, 41,227, 93,189, 82, 98, 70, 96,155,237, 10, - 86, 31, 2,163, 13,174,243, 55,243,117,195,175, 99, 67, 21, 41,178,180, 29,200,102,128,119,216, 10,244,127,223,127,189,192, 77, -127,129, 68,232, 94,157,158, 83,148,158, 53, 84,183, 51,148, 86, 86,115, 21,137, 5, 95,160,136,244, 24, 35,200,187,180,246, 35, -193, 57,143,227,241, 80, 92,194,250,215,175,234,116,219,255,220, 52, 33, 30,143,152,231, 84, 29, 79,147,135,196,136,227,225,128, -195,237, 45, 46,246,103,152, 85,141,212,121,132,152,193, 93,236, 49,147, 96,127,254, 16, 79, 95,189,128, 68,193,217,217, 30, 47, - 95,189,198,123,239,127, 15,207, 63,123,138,175,254,216,143,227,242,242, 18, 23,231,123,196, 24,113,136,128,184,156,136,206,233, -217, 59,106, 82, 26,187,121,112,174,208, 75, 37,171, 21,187, 9,234,196,213,165, 81, 76,208,111, 40,120,221,218, 15,253,179, 16, -209, 86,232, 69, 66,152,218, 74,222, 2,160, 77, 7,224, 16,230, 69,135,101,244, 60,142, 68,120,116,127,219,186, 95, 86, 10, 93, - 19,193,152, 71, 53,138, 35,114, 13,135,168,239,104,242,102,215,128,200, 85, 58,221, 96,140,120, 95,107,108, 22, 30,254,253, 72, - 43,160,167,197,234,125,238, 61, 4,212,131, 0, 66,136,196, 69,233, 47,137, 60,165,223,247, 29,149,178,127,198, 66, 12,117,142, -223, 84,240,149,194, 92,246,111,104, 80,159,156,150, 59, 57, 88,229,114, 95,146,153, 70,114,206,228,234, 43, 13,128, 88, 43, 82, - 37,254, 84,217,213, 74, 19, 67,169,112, 19, 7,190, 74,206, 86, 0, 87,204,202,108, 88, 90,136,101,224, 8,147, 47, 98, 9,170, -109,174, 64,176,132,201, 35,168,144,113,154, 75,114,222,156,245,152,103,254, 49,211,146,196, 86,250, 9, 40, 1, 80,169, 92, 89, - 24, 49,235,148, 71, 74, 90,246, 49, 87,214,250,181, 6, 81, 34,211,114,201,128,180, 86,153,137,242,249,199, 12, 96, 19, 48,249, - 44,210,147, 94,119, 79,251,113, 38,222, 89, 32,142,196, 15, 34,197,147,193,223,206,252, 29, 28,104,215, 45,154, 16,170, 58,154, - 65,101,143, 92,222, 44, 80, 69,193,113, 97,158,115, 85,137, 86,238, 50,155,148, 48, 51,196, 49,224, 92,247,115, 42, 2, 45,209, -204,199, 90,170, 24,109, 8, 71, 84,223, 98, 81, 3, 23,201, 29,162,149, 49, 78, 84,107, 78, 53,252, 64,181, 14, 38,238,204,138, -170,178,111, 77, 88, 45, 45,141,176,210, 1,216,232,170, 72, 77, 26, 45,168,176,103, 84,173, 5,208,251,252,124,164, 97,125, 98, -232,184, 73,187,226, 21, 55, 47, 77,202,116, 35,225,236,122, 64, 18,187,246, 56,225, 56,223, 33, 4,193,249,249,121,169,120,207, -207,207, 49,207,199,134, 90, 55,122, 6,214, 42, 58,187,193,158,157,157, 33,204, 17,135,195, 1,175, 95,191, 6,123,135,221,217, - 14, 15,220,101, 2,191, 17,225,120, 8, 32, 22,220,205, 17,160, 8,191,243,248,228,211,167,248,211,191,254,183,120,248,232, 49, - 46,206,207,241,226,197,115, 60,127,250, 12,140,136,219,235, 27,236,247,123, 60,122,244, 8, 95,120,231,221,180, 63,198, 4, 38, -142,209, 35, 32, 34,100,173,135,209,125,151,142,239, 95, 42,107, 43,176,147,139, 14,161,216,160,186,197, 96,128, 71,150,160, 13, - 16,139,125,195,153,239, 49, 56,190,107, 79,111,185,153,141, 58, 66,107,126,242, 22, 95, 65,130, 6,216,214,220, 67,227, 47,176, - 72,170,181, 99,119, 98, 56,190, 5,162, 99,246,229,186,217,160, 90,158,247,184, 28,175,246, 46,136,214,184,106, 68,193, 91,187, -126, 11, 48,157, 62, 47,153, 27,173,218, 44, 70,191,167, 8,170, 9,213, 53,210,120, 62, 40,144,215, 92, 31, 75, 37, 45,192,109, -243,252, 85, 37,212,236, 87,177,159, 28,212,190,163, 71, 64, 50,169,169, 68, 44, 74, 96,170,118,198, 18,179,196,107, 86, 62,131, - 44,168, 77, 68,117, 54, 95, 29,222,141,116, 41, 4, 34,115,213,154,151, 8,160,227,181, 35, 86,153, 90,168,172,171, 20,155,115, - 77,176, 18, 0, 78,154,135,107,129,130,102, 46,242,171,165, 13,158, 65,127, 36,201,215, 59, 41,199, 81, 57, 58,242,217,120, 38, - 3,187, 50, 34,142,145,198, 5,169, 61,194,166, 5, 95,143,128,192, 57,159, 57,115, 92,208,196,204, 9, 52, 6,146, 2,180,234, - 55, 50,155,105,174,201, 18,150,223,165, 56, 12,254, 58,211,218,178,110,228,144,146, 29,207, 12,114, 14, 62,193,213,225, 57, 25, -149, 72, 8,165,237,174,148, 12,117, 31, 3, 51,220, 76, 6,240, 70, 99,254,164,227,226, 62,213,108,124, 76,136,210,177, 24,168, -213, 49, 63, 5, 20,212,174, 74,114, 91,115, 75, 13,117,109,151, 75, 78, 50, 36, 87,106, 36,205, 58,218, 32, 96,140,217, 7,180, - 4, 69,182,193, 39, 46,102,218,189, 63,245,127,140,202,221, 10,237,160,235, 20,128, 8,167,172,129,219, 74,158, 22, 64,171, 2, - 50,140,131,246,110, 51, 95,204,212, 59,195, 3, 23,164,153,109,148,180,254,143,243,140,247,222,127, 31,175, 94, 62,197,215,190, -246, 53,236,188, 43,213,203,226,188, 84,231,193,241,102,151,227,238,112,196,217,217, 25,252,110, 74, 24,152,221, 30, 62, 35,217, - 15,135, 25, 55,135, 59, 60,122,244, 8,225, 40,240,158, 17,231, 35, 38,191, 3, 49,227,207,255,234,175,241,127,252,238,191,198, - 63,248,250, 79,227,193,197, 5,126,248,254,123, 96, 1,126,238,103,127, 6,209, 17,158,190,124,133,253,126, 15,231, 28, 28, 59, - 28,143, 71,144, 99,120,154, 50,162, 59,130,157,197,198, 0, 46,207,214,163,139, 5,140,150,102,254,156, 4,164,212,149,203, 36, -117, 33, 99,153,216, 96, 73,214,102,192,189,242, 35, 11, 22,200,237, 69,240, 21, 73, 30, 11,202, 90, 49,140, 18,159,117, 4,180, -226,236,247, 7,221, 63,120,181,253, 93,223,115,129, 88, 55,213,108, 17,213, 49,171,223, 21,113,173, 65,135, 40, 86, 74, 23,161, -202,113,115, 76, 30, 51, 49, 38, 41, 91,246,169, 51, 99, 13,149, 44,160,185, 40,122, 2, 11, 32,118, 68,149, 97, 94,101, 87,172, -248,210,247,152,142,242,122, 10, 0,238,222,223, 81, 82,106,100, 0,115,140,101, 63, 77,197,226, 18, 83, 52,194, 18,141,190, 79, - 25, 40,105,139, 48,239,138, 6, 46, 53,173,143, 82,109,103,125,111,134, 74, 29,102, 67,151, 60,111,101,157,173, 27,133,180, 36, - 60,147, 22,147,163, 22, 97, 73,200,218,233,165,202,140,185,109, 29,115,133,165, 84,129,148, 97, 33,204,121, 83, 14,221, 49,255, - 60, 31, 57,255,125, 50,138,161,170,201,150,255, 94,178, 35, 92,177,217, 84,148,105,156,243,163,149,185,196, 8,121, 55,201, 14, -116, 50, 87,110,173, 0, 66,105, 46, 45,153,186,224,121, 0,194,203, 1,177,182, 21,217,232,143, 43,128, 42, 45,210,195,124,172, -130, 45,206, 53, 28,200, 17,175,178,205,178, 67,211,166, 27,181,161,213,101,104,216,186, 5,224,119,187,161,158,113, 52, 51, 35, -214,123, 23,141,218, 91,225,110, 59,176,107,207, 57,168,232, 79,246,249,134,227,100,113,168,244, 36,131,240, 22, 69,112, 23,205, -238,244,187, 62,255,190,207, 29, 2,100,187, 73, 5,253, 20,160, 80,241, 64,167,225, 92, 62,132, 74,159,113, 5, 29,202, 6, 77, - 27, 54, 43,193, 53, 32, 90,149,233,148,225,239, 99, 13,224,180, 50, 19, 63,213,158, 31,122, 49,211, 0, 24,186,194,123, 93, 77, - 10,186, 10,153,214,240, 13,131, 77,143, 98, 48, 34, 80, 49, 61, 67,250, 92,198,132,216, 14,243, 12, 56, 15,114,140, 87, 55,183, -248,206,119,190,131, 79, 62,253, 8, 15, 30, 94,225,139, 95,120, 23, 94,184,170, 25, 90,128,209, 10, 38,162,255,255,103,103,103, -136, 49,226,120, 60,130,221,132,243,243, 51,188,186,185,197, 55,191,245, 45,252,241, 31,127, 19,255,244,159,253, 22,206,175, 30, - 34, 16, 99,154,118,160, 32,112,251, 61, 66, 8,248,235,255,240, 93,248,179,115,124,246,252, 5,158,191,124,133,219,227,140, 71, - 87, 87,128,247,184,121,245, 10, 15, 30, 4,192, 49,118,103,123, 48, 73, 70,235, 87,156, 71,228, 88,246, 15, 50,227, 16,139,155, -112,187, 9,136, 82,102,255, 49,198,150,129, 17, 67, 21,181,202,149,166, 51,149,164,132,216, 86,150, 22,219,145,131,174, 27, 84, -245, 60, 16,126, 81, 83, 34, 56,174, 22,197,174,107,103,119, 64,228,222,229,108, 25,124,226,162,146, 46,194, 66,168,214,179,101, - 4, 99,176, 42,105,158, 60, 47,102,194, 13,251,198, 4,177, 30, 40, 24, 69, 48, 71,134, 87, 81,179, 60, 22,236,217, 51,163, 10, -125,225,209,208, 1,115,237,113,150, 8,228,153,185, 13,174, 74, 3,215, 4,111,216, 25,204, 98,103,214, 18,216, 25,107,224,112, -140, 85,190,184,147, 51,230, 78,212,137,140,248,153, 98,122, 56,187, 20,218,231,194, 95,238,119, 89,192,159, 0,114, 93,155,196, - 88,168, 74,171,198,196,197,189, 44, 7,125,110,131, 79, 49, 72,145,104,220,145,104,177, 40, 75, 37,221,101, 82,154,113, 17,215, - 76, 43, 40, 37, 68,146,156, 43, 56, 5,101, 1,193, 51, 21,234, 89,204,193, 86, 3, 70,108,123, 98,165,253, 43,130, 34,188,210, -131, 86,116, 83,230,142, 39, 78,157,242,158,132, 88, 1,115, 25,253, 44,217,121, 7,146,252,122,117, 54, 47, 9,183, 6,138,105, -150,156, 2, 41, 10,247, 52,121,226, 18, 98,164,123, 87,111,110,242,105, 60,160, 1,185, 91,252,119,119,119,139, 86,172,254,174, -203,218,232, 86,189, 46, 74, 44, 96,158,222,165, 72,119,175,130,234,206, 88,130, 72,104,218,138,146, 3,123, 84, 56,124,200,155, -116,126,232,108, 59,108,238, 80,237,130,244, 16,201, 44,141, 63,186,204, 1,179,196,242,240,169,214,188,115,110, 81,157, 52, 64, -184, 83,148,192, 13,245,175,216,153,160,140, 0, 72,100, 82, 36, 21,110, 25,207,240, 35,170, 76,207, 8, 67,208,177, 13,104, 5, - 77,223,173, 87,101, 21,172, 6,254, 40,247,238, 6, 80,113,145,106,103,171,162,173, 97, 83,233, 89,111,245,105,231, 17,142, 1, -175,175, 95,227,241,213, 3,188,190,185,198,110,114, 8, 49,224, 54, 6, 60,120,124,129,155, 99,196,203, 87,175,112, 55, 31, 1, -102,124,252,217,167,248,250, 79,125, 13,215, 47, 94,182,180,204,158,201, 48, 72,142,168, 67, 47,199,152, 1,169, 62,161,217,119, -231, 23,120,121,115,139,191,253,222,247,113,254,255,253, 1,254,219, 55,223,198,131, 7, 87, 8, 49, 34, 16,227,211,231, 47,240, -248,225, 35,124,252,201,167,136,228,113,115, 12, 8,243, 45,194,225,128,139,139,128, 57, 6,156, 93,156,227,193,131, 7,120,241, -226, 5, 46, 46, 46,240,217,167, 31,131, 93,162,195,145,164,231,106,183,219, 33,206, 29,144, 75,178,118, 69,142,180, 33, 36,221, - 5,199, 84,146, 99,203, 40, 96,207, 77,187,213,182, 95,181,195,209,106,179, 75,253,189,204,131, 30, 97, 17,218, 74, 23, 75, 97, -169,130, 7,169,232,111,167, 84, 69, 5,196,102,144,150,173,192, 35, 18, 35,135,179,110,250,124,184, 43, 85, 52, 20,159,130,206, -218,214,128, 0, 37,239,131, 58, 98, 45, 65, 63,134,198,115,160,208, 16,245,239,250,177,164, 2,205,120,151,186,160, 90,185,230, -160, 43, 26,148,217, 4, 89,163,227,128,252, 89, 36, 23, 42,108,132,151, 64,173,212, 49, 11,165,226, 37, 95,119, 50,109,247, 16, - 99, 30, 51,166,103, 71, 98, 76,159,195,236, 83, 61,112, 46,230, 14,120,178, 76,166,170, 64,106,198,152,172,122, 24, 29, 58,191, -239,164, 46, 53,168, 1,127, 62,249,242,102,245, 24,114, 48,116, 25,253,172,250,213,177,225,133,147,184,210,126,116, 89, 21,204, - 86,163,206,204, 76,218, 89, 92, 52, 23,108,137, 78,238, 43, 85, 99,254,222,110, 44, 68,112,251,253,146, 91,109, 55, 55,230,162, - 18, 55,154,203,146,108,111,122,203,160,222, 81,198,138, 74, 92, 93, 8,186, 17,247, 32,191,216,201,188,246, 86,154, 35, 58,213, - 22, 37, 77, 8,184,189,125,189, 29,116, 86,124,130, 75,240, 61, 30, 79, 3,202, 6,244, 54,125,224,103,209,156,134, 26, 49, 34, -253,155, 16, 66,225,116, 51, 51,102,243, 62,145, 0,231,119, 69,148,130, 36,249,127, 35, 2,129, 40,139, 14,142,181,150,131, 86, - 66, 43, 46, 74,213,208,197,173, 34,169,201,136, 17,201,134,150,247,208,160, 98,113,157,196, 98,145,234,103, 12,161,161,124, 9, -247,154,248,232, 80,238,234,123,206,221,235,201,114,166,186,130,152,254, 60,149,250,246, 88, 99, 41, 59, 90, 43,119, 21,215, 72, - 34, 44, 87,231,103,152,174,174, 16, 5,216, 77,103,152, 99,192, 44,128,115, 19, 94,190,186,134,223,159,225,207,191,243, 23,248, -209, 71, 31,227,235, 95,255, 41,188,124,117,141, 31,126,252, 33,222,188,184,186, 87, 80,111,186, 35,118, 77,199,136, 71, 79,158, -224,163,143, 62,193,158, 46, 0,231, 49,237,206,240,228,205,183,240,224,241, 99,188,255,193, 7,248,131, 63,250, 35,252,210, 47, -253, 50,188,103,156,159,159,227,203,239,190,141,191,249,203,191,194,217,213, 21,190,247,221,247,241,120,119,134,199,143,159,224, -112,119,139,155,187, 3,158, 61,123,134,135, 23, 23, 56,191,184,192,163,203, 11,252,224,131, 31,224,173, 39,111,224,246,230,166, - 84,219,126, 55,129,189, 3, 71,110,102,224,186,217,107, 80,117, 69, 13,179,242,172, 91, 74, 83,108, 4,189,154,215, 40,237,239, -122,199, 57, 39,204, 84,146,110, 90,242,138, 97, 21, 17,221, 16, 93,223,156,131,186, 92, 74, 98,255, 20,170,239, 72,162, 85, 4, -114,140, 70, 71, 36,150, 74,119,241,236,228, 81, 23, 98, 59, 11,183, 85,191,119, 14,146, 95, 67,204, 62, 77,249,243, 7,195,142, - 41, 38, 73, 90, 93, 75,173, 82,131,142,119, 51, 0, 70, 95,111,206,106,118, 85,131, 20, 37,120, 23,137, 50,221, 6,152, 76,194, -145, 11, 21,105,253, 2, 20, 19,173, 29, 58,171, 47,161,222, 5,222,208,243,172, 89,150, 31, 61,104, 59,222, 44, 54,214,186,118, -122,157,252,110,106,199,141, 81,224, 39,159,102,201,218, 22, 32,201,173,142, 40, 16,138,136,179, 81,192, 33, 95, 80,155,250,111, - 42, 18, 23, 3,126,111, 22, 55, 97,233, 79,182,114, 92,227, 44, 13, 98,221,162,228,199,254,201, 84,218,212, 73,209,139, 17, 66, -192, 60,207,213, 6,213,182,241, 72,154,118, 84,127,142, 14,124,130, 54,211, 60,111,141,223,183, 86, 74,209,160,163, 75, 23,160, - 67, 40, 87, 76, 1,138,167,110,145,130, 53,149, 46,117, 99,219, 32,113,139,111, 52, 68, 92,159,164, 41, 53,217,230,184, 26,180, - 45,122,235, 64,213,219,136, 18,150,252,204, 69,226, 68,180,176, 63,181, 85,191,179,239, 43,237, 6, 39,185,210,112, 88,218, 20, -158,170, 62,215,192, 46, 77,171,124,208, 58,236, 41, 73, 91,109,120,238,100,108,251,202, 56,102, 90,164,178, 52,226,128,190,210, - 43, 97,141,208,224,159,119,206,126, 10,205,126, 42,192,151, 81,123,247,121, 74,146, 75, 53,169,184,189,189,197,142, 9,222, 51, -110,174,111,112,118,118, 6, 48, 97, 55,237, 65,126,143, 91, 17,220, 29,102,252,232,163,143,241,250,246, 6,231, 15, 46,241,242, -213,115,124,246,244, 57,222,186,122,148, 28,133,169,109, 27,235,122,145,156, 20, 42,152,210, 10, 8,129, 19,165,237,217,179,103, -120,240,224, 1,110,239,142, 16, 98,220, 29, 15,248,230,183,191,141,155,187, 3, 46,119,123,252,237,247,190,143,139,135, 79,240, -203,191,252, 75,120,245,242, 37,190,247,222,247,241,225,143, 62,192,180,223,227,103,127,254,231,240,226,250, 6,119,243, 17,135, -195, 1,152,143,169,130,114,140,215,175, 95,227,114,191,195,183,191,253,109,252,211,127,242, 95,194,239, 28,188,155,112, 56, 28, -192,206,225, 56,207,240,211,206, 26, 38,182, 90,246,134, 59, 78, 64,163, 92,166, 79, 87,200, 96,133, 53, 48, 25,123,215,101,137, - 82, 88, 40,214,200,102,141, 18,218,156, 87,167,170,152,180,227, 93, 11, 16,173,243,181, 12,115,170,207,183, 26, 63, 73,238,194, -197,172, 9,171, 21,248,194,169, 78,199,116,172,236,158,216,101,189,130,200, 4, 22, 95,102,235,253, 51,171,214,192, 75, 89,219, -124,140,235,192,216,212,126,111,245, 49,122,138,170, 26, 18,105, 91,189,159, 93, 35, 68,195, 10,162,218, 86,167,251, 25,180, 40, -174,162, 7, 58,247,232,252, 83,214,189,163,223,137,148,100,146, 11,248, 14,169, 51,234,119,126,106,102, 15, 21, 69,152, 32,247, -146,237, 29,171,139, 86,149, 81, 69,222,108, 73, 6,217, 5, 37, 37,117, 79,188, 40, 22,172, 78, 51,243,182, 97, 72,143,228,118, -206, 53, 65, 93,181,131,181,154,176, 63, 11,144,178, 41,108,169,133, 57, 89, 15,136, 91,155, 97, 48,214,171,214, 35,219, 46, 10, -129,161,131,152,254,180,222,236,185,203, 68,251,107,113, 82, 60, 70,219,119, 43, 51,199,205, 74, 95,146,203,211,125,144,213,107, - 32,184, 45,100,236, 41,244, 54, 75,109, 55,110,137,168,108,117, 34,122, 25,216,254, 51, 43,207,118, 20,212,211, 15,194, 2, 85, -219, 95,255, 53,135, 45,235,230,102,187, 49,205,108,157,187, 14,201, 61, 3, 54, 13,204, 83, 22,235,182,114, 70, 55, 54,130,207, - 31,220, 71,157,170,241,189, 33,236,118, 59,188,253,214, 59, 56, 30,238,176,219,121,204,135, 0,246, 19, 56,164,241,201, 44, 17, - 32,143, 63,250,230, 31,225,147, 79, 63, 67, 20,194,247,127,248, 35,156,157,239,240,254, 15,127,128,159,249,234, 87, 27, 60,159, -117,168,211, 4, 94,199,111,150,241,160,255, 46, 47, 47,241,226,197, 11, 92, 94, 61, 0,239,142, 16,158,240,205, 63,253, 51,252, -217,159,127, 7, 96, 7,119, 56,130,167, 29,254,228, 79,191,133, 32, 17, 31,125,244, 17,222,251,222,119,211,140, 27,132,139, 39, - 87, 56,204,175, 82,155, 83, 18, 6,192,123,143, 71,143, 30,225,209,227, 43, 28,227, 17,119,199, 91, 68, 74, 42,114,142, 29,166, -105, 74,124,246,108,119, 26,141,198, 80,245, 28,200, 1, 61, 39,165,233, 89, 67, 43, 84, 2,151,125, 33,100,181, 59,230,251,206, - 91,172, 60,231,222,239,187, 36,131,246, 53, 76,114, 97, 69, 93,244, 63,238,173, 73, 21, 88, 71,132,185,232,210,155, 53,217,187, - 79,246, 29, 44, 43,131,186,144, 54,149,102,140,139,114, 95,219,207,109,219,253, 42, 83, 62, 2,175,165,165,224, 86,247,164,126, -253,142,169,108, 53,158,185,110, 22,207,132, 36, 11,220, 97, 30,136,150,201,238, 70, 84, 95, 62,191, 22,131,161, 22,178,160, 33, -203, 97, 52,174, 99,107,222, 69,166,125,159,207,205,159,239,246, 45, 80, 0,177,160,244,236, 44,155, 81,129, 4,218,166, 79,123, -226,152,114,226,104,205, 56,160, 69, 5,147,247,155,173, 7, 27,216, 84, 25, 25, 18, 75, 69, 20, 99, 44, 32, 20,109,111, 38, 91, - 79, 20, 10,157, 86,145, 52,208, 48,183,182,147,160, 1, 63,119, 4,142,178, 23,223,160,115, 75, 59, 84,105, 90,182, 2, 55,243, -202,154,105, 86, 94,234,154,176,200,169, 69, 51, 31,227,231, 3, 90, 25, 95,246,212, 70,138,247,222,212,151,116, 22,221, 84,226, -122, 80,161,113,107, 60,163,240,154,164, 98,148,212,132, 16, 26, 6, 64, 31,160, 44,146, 87,228,243, 9,153, 16, 17, 16,230, 4, - 56,108,112, 3, 6,244, 40,178,224,144, 54, 21,245, 90,198,174, 38, 46,253,239, 67,186,100,224,239,207, 89,167, 49, 48,191,157, -245, 46,146,153,202, 64, 48,100,166,197,166, 43,180, 84, 73,180, 88,236,167, 79,159,226, 11, 95,248, 2,238,110,111, 16, 1,156, - 95, 94, 0,204, 16, 39,152,193, 69,219,250,111,254,253,223,226,147,103, 79,241,240,225, 67, 60,127,249, 10, 23, 15,222, 69, 4, - 3,236, 43, 40,182, 11,220, 90,161, 59, 75,199, 25, 92,235, 39, 79,158,224,217,179,103,152,206, 47,192,222,225, 15,255,237, 55, - 48,237,207,192,110,194, 59, 95,250, 18,120,218,225,124,127,134,175,255,244, 79,227,167,127,230,103,240, 59, 47,158,225,247,126, -239,247,240, 15,255,209, 47,225,230,238, 22,215,215,215,216,121,135,157,159,176,119,140, 7, 15, 30, 96,191,159,112, 60, 30,241, -214, 27, 79,240,228,231,126, 14,211, 52,225, 54,206,152,101, 6,121,130,223,123,156,239, 24,225,152,245,216,251,246,187,174, 79, - 90,247,193, 22,145,108,200,179,110,225,138,133, 56,140, 20,221, 15,136, 20,157,141,213,238, 76,136,171,149, 94,250,255, 97, 60, - 82,138,100,218,143,239, 0, 0, 32, 0, 73, 68, 65, 84,233,181, 25,180, 80,194,108, 68,170,216,183, 63, 95, 1,182, 89,160,180, -237, 84, 20,113,149,129, 56, 77,235, 79,190,241, 12,111,236,149, 35,151,186, 30, 19, 99, 63, 79, 65,169,187, 20,247,166,156, 84, - 42, 54,203,162,233,117,172,182,134,156,215,121,188,197,205,244, 5,202, 28, 55, 18,122, 96, 85,126,214,142, 65,185, 75, 58,124, -154,105,216,179,140,139,222,255,164, 97,160,155,109,167,160,188, 18, 12, 16,135, 65,129,122,121, 2,114,171,243, 75,189, 41, 86, - 92,192,222,240, 17,144, 67, 85, 7, 27,167,168,190,122, 53,136,113, 79,188,208,183, 94,107, 69, 15,237,249, 92,167,121,222,201, -200,170,118,121,113,155, 50, 21,230, 86,192,166,123,182,119,232,239,208,122,183, 73, 8, 65, 26, 65,139,254,250,135, 16,214,207, -135, 98, 19,160,134, 92,216,141,170, 27, 50, 23,160,157, 3, 33, 12,142, 8, 41,201,116, 32,204, 92,117,197, 53, 9, 13,131,153, -250,168,243, 49,174,142, 53,139,230, 85, 23,167,209, 38,178, 54, 22, 42,252,246,236,155, 48,202,180,123,245,184, 45, 47,244,255, - 24,255,182,146,178,118,188, 36,195, 36,160,116, 85, 64,131,123,236,112,113,113, 1, 34,135,105, 74, 82,176, 46, 47,124,199, 14, - 60, 77, 56,178,199,222, 77,120,242,230,219,120,239,195, 15, 17, 4,240,211, 14, 15,174, 30,225,231,191,254,147, 73, 67, 61,198, - 69,242, 87, 2,120, 23,208, 27,124, 10,128,112,119,196,180,223, 97,127,126,137,219,187, 35, 38, 23,224,166,125,166,176, 18, 62, -253,236, 41,222,125,247, 93, 72, 20,252,240,195,143,224, 61,227, 87,126,245,215,241,165,175,124, 25,255,238, 79,190,133,203,203, -199,216,237,118,185,162, 77,250,241,231,231,231, 96,102,220,221,221,224,197, 75,194,207,126,253,235, 96,151, 20,235, 98,144, 52, -242,147, 76, 79,243,110, 56,218, 42, 45,247,158, 55,221,185,228, 17, 42,191,186,111,173,112,174,248,155,170,155,165,209,251,135, -233,156,142,100,180,155, 96,138, 86, 10,196, 6,245, 54,128, 98, 1,148,181,130, 58,109,226,229, 22,235,135, 7,123, 37, 25,240, -222, 34, 88,211, 18,179,193,185, 99, 44, 33, 46, 58, 5, 21, 13, 78, 39, 59,132, 35, 67, 39,149,243,213,248,210,227,184,184,211, -154,215,132, 66,103,230,246,142, 75, 56,110,202,234,114,103, 72,101,159,159, 72,105,188, 50,242,204, 88,240,233, 71, 10,151, 64, -219, 73,209,248,236,137, 27, 72, 60,209, 90,230, 87,149,142,236, 73,122,118,139,118,138, 46,150,102,147,149, 26, 8,218, 68,148, - 54,103, 9,222,251, 82,137,219, 25,132, 6,250, 68, 49, 97, 80,116,109,192,236,230, 24,112, 60, 4,224, 89,113,134, 30, 33,190, - 5, 56, 43,237,119, 63,109,242, 12, 41,182, 18,146,189,234, 90,128,108, 87,218, 39, 54,250,157, 27,235,178,219, 74,119,173, 93, -158, 2,202,178, 6,179,215,237, 84, 80,247,198,180,161,169,142,121,124, 29,209,123,132, 99, 90, 93,180, 66, 0,251, 21, 15, 0, - 94, 55, 68, 24,205,175,198, 35,130,164,126, 8,138,247, 74,134, 70, 35,162,216,125,159,157,116,221,136, 78,113,142,123,208,151, -126, 61,214,126,175,158,234,188,116, 69, 4,138, 31,252,218,248, 69, 55,221,209,250,138,212, 2,209,244, 57, 93,187,166, 34, 2, - 10,209,108,130, 14,143,223,124,132,143, 63,248, 16, 95,252,194, 59, 56, 30, 15,184,190,126, 5,199,132, 99, 8,112,178, 75,157, - 36,109, 93, 59, 7, 33,194, 33,204, 8, 16,188,251,238, 23,193,199, 99,107, 44,211, 85,234,212, 37, 63, 86, 19, 30, 0,206, 47, -119, 56,134, 25,111,190,249, 38,158,189,124, 5,127,118,142,255,244, 31,253, 67,252,205,127,248,110,105, 79, 95,223,221,226,199, -126,236,199,240,159,253,242, 47, 3, 20, 17,142, 51,190,242,213,175,224,197,245, 13,190,249,103,127, 13, 17,193,197,249, 57,226, -225, 6,135,227, 45, 14,135, 59,248,203, 51, 60,122,248, 8, 63,120,255,251,248,241, 47,127, 25,111,190,241, 6,156,163, 68,205, - 36, 66, 8, 17,199, 24,176,235, 40,163, 86,140, 68, 91,165,209, 0,191,138,110,102,102,245, 36, 9,238,218, 33, 33,216,231,217, - 80, 14, 69, 64,188,124,198, 67,166,236, 90, 61,134,209, 56, 96,205, 59, 67,181,211, 27, 30,246,128,251,206,142, 65, 78,134, 60, -244,152,241, 46, 22, 28, 38,131,241, 84,137,134, 6, 92,106, 6, 73,245,186,137,100,241, 70, 65,111,125, 97, 69,178,146, 12,237, - 97,184,238,171,194, 93,197, 2,149, 65, 7, 27,128,108,238,133, 11,217, 46,102,253, 47, 26,140, 64,223,205, 5,176,148,185,166, -118,223,142, 69,148,171, 85,205, 11,133,134, 87,121, 49, 49,103, 91, 49, 38, 39,207, 24,165,160,220,139,171, 98,254, 61, 13,224, - 60,208,187,240, 52,249, 2, 84, 74, 80,123, 41,109,136,150,172, 47,157, 25, 5, 22, 0,143,102, 83,232, 50,184,186,200, 66, 83, - 49,123,246, 11, 5, 51, 75,225,160,220,226,166, 24,139,146,153, 14, 16,230,174, 74,107,130,186,119, 37, 75, 82, 64,221,136,203, - 28, 66,104, 22,241,162, 61,162,218,197,195, 25,178,128,216, 45,230, 78,214, 5,171,241,235,213, 12, 84,219, 83,142,225,100, 35, -211, 30,100,106,253, 67,105,219, 63,163,141,125,154,166,198,188,164,247,211, 14, 66, 77,230,217,243,213,245,239, 71,129, 93,114, -150,109,253,161,171,127,122, 18,233, 81,197, 63, 61,146, 17,239, 17, 2,166,105,191,137,184,247,102, 60, 51,250,121,192, 54, 85, -141,236, 38, 50, 8, 86,109, 74, 83, 53,255, 71, 30, 0, 67,116,189,193, 83,164,107,183,116,221,179,207,141,144,172,119,128, 40, - 49, 0,212, 63, 91, 65,152, 77,114, 74, 70,177, 16, 21,168,217,240,103,185,181,108, 93, 75, 24,185, 12, 98,154,133,157,193,143, -220, 36,101,229, 25, 81,160,171,115, 32,118,248,131,127,247, 77,124,235, 91,223,194,127,247,207,255, 27, 60,188,186, 64,132,224, -242,108,135,227,205, 45,224,128,253,254, 12, 47,110,239,240,254, 15, 62,132,208,132, 55,222,120, 43, 91, 87, 10, 94,191,126,141, -179,253, 62,173,243, 82, 48,112,117, 21,203, 27,135, 5,147,114,151,252, 68, 8,200, 77,248,224,163, 15,241,232,241, 27,224,105, -194,163,135, 15,112,121,113,129,103,207,159, 39,241, 24, 17,124,245, 43, 95,129,115, 14, 23,231, 23,248,198, 55,190,129,223,254, -237,223,198,131,171,199,112, 60, 33, 28,142,184,187,185, 5,201,140, 71,151, 15,112,190, 59,195,179,103,207,240,241, 7, 63,194, -131,139, 51, 28, 14, 7,156,157,237,112,123,184, 41, 78,123,206, 77, 56,195, 84,196,123, 22,157,185, 92,105, 70,253,126,150, 38, - 44,128,166, 28,190, 5, 14, 68, 49, 7, 31,106,138, 0, 88,167,104, 69,112,119,201, 98, 97,218, 80, 5,221,178, 5,118,198, 38, -219, 40,137,112, 9,171, 49,211, 30,163,121, 89, 82,175,138,136,195,221, 49,201,131, 91, 61, 3,168, 47,120,162,228, 66, 90,240, - 22,229,118, 68, 82,206,108,199,147, 44,104, 20,240,216, 81, 29,231,118, 70, 46,108,139,149,104,130,180, 38, 63,130,164, 74,120, - 15,240,103, 59,162, 75, 98, 98, 17, 2, 14,212,240,219,123, 25, 87, 75,193,237,101, 96,129, 76, 89,222, 24, 31,246,221,223,126, - 20, 32,122,159,179, 66,122, 48,138,130,105,127,150,162, 62, 7,166,244,182, 76, 37, 11, 94,224, 77, 0,120, 62,247, 70,139,152, -146, 29, 36,103,126,156, 9, 90,165,242, 36,105,130, 87,156, 67,226,241, 45, 78,154, 91,208, 70, 65,174, 78,109,226,198,185,101, -105,169, 4,121, 30, 46,197, 95, 58, 35,232, 59,148, 35, 83, 11,132, 90, 96, 20, 42,196,186, 8,164,216,106, 61, 2, 64,216,110, - 89,251,221,110,172,146,148,207,159, 58, 78, 99,191,152, 28,249,197,172,138, 77, 80,117,236, 54,236,106, 0,199,220, 96, 28,200, -240, 88,117, 51,105,109,183,105,181,253, 26,115, 6, 28,145,232,175,130,202,156, 30, 86,242,221,204,122,216,162, 39,107,127,219, - 26,234, 72,230,192,230, 19,201,239,198,136,168, 52, 19,233,180,167,177, 72, 28, 42, 86, 2,189, 25, 74,151, 36,142,230, 18,150, -187, 63,124,244,173,230,115, 54,220, 17, 80, 49,224, 97,242, 9,181,139, 53, 83,152, 88,192, 76,106,254, 83,130, 42,183, 9,106, - 1,206, 89,176,155, 5, 9,113,149, 39, 78,239, 95,253,166,235, 60, 57,203, 54,147,162,208, 93,118,138, 50,222,209,100,241, 4, - 97,216, 25,176,229,147,121, 26, 74,240,177, 84,211,227,241, 8, 71, 30,218,132,244,126, 74, 93, 50,158,240,251,223,252, 22,254, -213,239,254,159,248,207,127,235,159,224,205, 47,190,133,155,187, 23,184, 57,190,198,213,195, 7,120,250,234, 22,119,119, 1,143, -222,249, 34, 94,223, 29,113, 56, 70,236,119, 23,112, 8, 56,190,190,193,219,143, 30, 65,238,110,112,156,143,216,157,157,167, 68, -198, 77,184,189, 61, 96,154,246, 56,134, 3,156, 75, 13,234, 57, 28, 19, 37,237,236, 12,199,227, 17,199,219, 59,156,101,219, 84, -114,140, 71,143, 31,227,110, 62,130,163,224,241,229, 21,110,158, 63,197,131,253, 14,116,188,129,151, 11,188,253,248, 18, 59,138, -120,254,217, 83, 60,253,228, 41,222,122,242, 54, 62,249,236, 5,142, 71,193,124, 4,206, 46,207, 16, 14,130,151,207, 95,227,217, -103,207,241,229,119,223,196, 7,207,159,225,108,231,241,165, 47,126, 17, 79,159,189,192,126,127,134, 72,132,187,195, 1,126,151, - 80,240,182, 19, 89,146,243, 18, 28, 9,106,130, 89,216,172, 34,168,245,120, 52,152, 22, 26, 2,166, 26,229, 54, 43, 52,213,140, -143,150,230, 38, 22,244,185, 53,243, 13,121,168,107, 43,108,148,253,220, 97,218,113,125, 6,197, 96,143, 50, 16,208, 13, 48, 81, - 86,177, 83, 98, 42, 44, 82,113,164,148,178, 52,202,152,231, 25,224,196, 32,225, 60, 70,157,188, 79,231,159,109,123,189, 79,216, -134, 6, 17,159,185,249,119,183, 55,152,206,246,227,189,183,195, 10,180,157,187, 36, 32, 22,144, 58,181,189,216, 12,144, 0,132, - 42,158,213, 99,201,250, 14,236,125,198,157, 67,176, 47, 19,230, 12, 40,181,238,147, 54, 73, 87,158,251,154,123,165,141,199,229, -250,236, 46,206, 23, 45,225, 92,228,195,155,121, 76,205,236, 99, 51, 47,117, 5,137, 71,139,140,166,215,226, 29, 85,138, 98,181, -190,177, 4,252, 20, 74, 81,169,238, 91,197, 51,233,102,183, 35, 99, 8,173,214,122,117,172,212,222,245,247,158, 67,175,185,254, - 16,182,121,222,246,188, 68,253, 95,184,229,101,246, 71, 85,108,139,205,195, 38,245,251,165,189,135,182, 82,104, 64, 78,157,248, - 78,126,189,152, 5, 32, 10, 63,213,100,241,170,128, 84,172,105,141, 97,128,253,126,153, 13,214, 50, 32, 85, 31,148, 56,230, 44, -146, 92, 4,152, 10, 21, 82,192,224, 44,181, 75, 22,189,201,212, 84,152,139,246,117,175,203,222,183, 59, 55,218,247,167, 58, 29, - 34, 78,183,212,180,217, 10,202, 17, 57,120, 10,185,162,120,104, 59, 40,169,221,238, 12, 8, 14,137,154, 99,116, 10,212, 70,180, - 38,127, 93, 71,133,251, 15,131, 44,253,168,191,207,205, 72,163,140,121, 64,249, 89, 72,230, 64, 86,163,191, 97, 97,104,170,165, -109,224,238,122,185,166, 61, 95, 87, 33,153,100,135, 69,112,113,118, 9, 34,135,155,155, 91,220,222,221,225,225,213, 99, 60,189, -190,197,179,235, 91, 76, 87,143, 48, 61,120,136,155,227, 17,151, 87, 15, 16,195,140,231, 47, 95,224,241,147,183, 65,231,143,241, -131,143, 62,195,180,223,225, 50, 94,226,213,171, 87,120,243,241, 37,126,226,171, 63, 14, 71,128, 59,223, 99,246,140, 7, 87,143, -240,244,249, 75,156,185, 61,174,158, 60,192, 49,204,240,254, 12,113,190,197,110,231,113,123,119, 3,239, 25,199,112, 0, 81, 82, -146, 3, 4, 15, 30, 94,225,250,238,128,187,195, 17,111,189,245, 14, 94, 60,125,129,203,243, 51,124,237, 39,255, 1,254,252, 47, -255, 28, 95,250,210,151,240,197,119,223,192,155,111, 60, 66, 12, 7, 60,188,186,196,219,111,191,137, 55,223,124, 19,160, 51,220, - 6,194,103,159,125,134,221,206,227,236,242, 12, 60, 39,111,117,213,167,191,184, 56,199,249,229, 25,230, 99, 44,108, 23, 55,121, -144, 39, 56,184,226,182,168, 87,218,186, 69, 38, 32,237, 10, 0, 46, 7,189, 20,171,109, 16,164, 38, 40,182, 94, 18,113,209,249, -146,121,110,192,120, 61,238,136, 78, 88,235,210,142,235,185,102,193, 49, 30, 86,184,177,233,104, 90,160,106, 31,208,163,168,114, -100,150,121,102, 73,188,126,118,144,152, 24, 17, 76, 30,158, 8,187,189,199, 60, 31, 1, 16,188,138,198, 28, 15, 32,118, 56,207, -202,127,158, 90,208,116, 41,204,152,178, 68,106, 92,232,217,167, 89,120, 28, 98,105, 4, 33, 73,252,138,192,185,105, 89,136,117, -215,178, 40, 81,218,175,221,253, 98, 6,173, 96,113,106, 39,213, 15,217, 89, 77,229, 13,172, 39,103,188,140, 51,126,119,126,182, -104, 61,235, 77,236, 17,136, 45,200, 42,228,214,123,237,219, 84, 65, 45,170,156,235, 78, 33, 73,169,144,236,234, 60,114,203, 72, -138, 28,111, 2,199, 74,123, 71,214,125,135,203, 44,146,219,247,178, 42, 73,155,128, 53,205,240, 6, 51,238, 53,128, 19,245, 73, -128,161, 52,149, 86,188,169,244, 87,223,223,204,164, 27,167, 30, 84, 77,229,194, 68, 25, 32,221, 5, 52,164, 20, 86, 55, 89,169, -193, 36,207,154,244, 8,211,246,177,194, 14,214,148,128, 59, 59, 81, 49, 29, 3, 66, 43,243,105,131,146,102,162, 37,185,194, 10, -151,125, 48,151,110,239, 77,181,134,181,150,177,189, 85,236,168, 19,146,119,221,210,135,180,107, 86,211, 20,199, 92,130,117,207, -119, 69,151,228,146,177,100, 5, 98,185, 6,100,229, 40,187,217,177,157, 25, 54,159, 67, 53,161, 45,165,140,179,171, 93, 78,236, - 28, 17,144, 59, 61, 86,211, 90,172,201,136,112,113,217,227,206,191, 62, 72, 66, 47, 55,205,236, 60, 82,209, 74, 93,187, 75,135, -172,156, 24, 68,224,119,103,224,105,135, 15, 63,122, 31,127,240,111,254, 16,103, 87,151,248,157,223,249,223,241,223,255,243,255, - 26,111, 61, 58,199,153,159,112, 56, 70,240, 52,225,230,246, 26, 49,206,184,189,125,141,203,203, 11,156, 95,236,112,249,224, 12, - 49, 30, 18, 94, 66, 24, 51,128,143,159, 62,195, 31,126,227,143, 48, 31, 5,103,151, 23, 56, 28, 14,184,122,116,133,183,223,122, -140,159,252,169, 31, 79,190, 4,222,225,250,246, 53,206,206,206, 48,185, 29, 14,243, 17,175,175, 95,225,236,226, 2, 68,132, 79, - 63,253, 24,255,226, 95,252,207,184,185,185,193,151,190,244, 37,252,234,175,254, 99,252,224,135,239, 97,183,243,120,112,117, 1, -231, 8,251,253,132,187,195, 13,158, 63,127,134,231,175, 94,194,237, 46,113, 56, 94, 99,154,206, 17, 29, 97, 55, 17, 64, 1,135, -249, 14,206, 39,217,104,239, 83, 16, 57,134,244,255,217,187,132,140,158,124,178,112, 94, 1,124,108, 87,201,121, 37, 70,169, 0, -145,114,148,220,142, 85,131,170,250,115,253,126,166,174, 24, 95,251, 49,133,108,107, 52,213,240,112,236,223, 88,123,216, 50,222, -115, 11,160, 91, 31,212,171, 10,105,173, 40, 53,105,100,211,209, 35,137,112,228,225,220, 57,110,111,175,177, 63, 59,207,110,107, - 51, 68, 8, 23, 15, 30, 96,158, 35,238,238,110,192,222,131,125,178,134,182,160, 61,162, 68,167,148, 48,176,110, 70, 40,146,180, -205,248, 51,239,244, 49,198,130, 15, 24, 49,106,182,218,247,127,103,134,202, 10,101, 59, 54, 18,226,235, 32,220, 17,147, 39,197, -236,229, 61,241,126, 55, 45,218, 4,162, 74, 71,157,196,102, 3, 40,179,244,141,174,114,238, 17,150,220,209, 18, 74,160,183, 21, -243, 64,115,215,182, 33,170,204, 95, 39,108,159,181,111,121, 77,187, 55, 74,231,103,219,254, 60, 88,235,186,193,209,169,118, 47, -198, 63,103, 90,250,109, 71,163, 69,156, 13,228, 22, 63,103,169,193,156, 86,180,157,155, 32,178, 6,116,137,237,140,116, 68, 39, -163, 1, 64,106,149, 2,101, 23, 95,159, 8,116,223,215,160,221,191,126, 1,201,157, 16,160, 97, 19,180,183, 50,213,184, 33,131, - 74, 57,216,162,219, 46,203,188, 59,155, 45, 52,235,176,153,209,112, 11, 4,237,208,173,245,115, 87,106, 34, 55,115,233,216,240, -211,235,185,199, 74,203,178,194, 42,212, 3,238, 12, 56,179,251, 20,206, 92, 27, 11,100,109, 41,117, 21,211,225,250, 42,125, 69, - 12, 72, 43, 49,143, 92,165,137,206,180,117,118, 89,211,220,253,110, 7,246, 30,243, 93,106,159,238,207, 47,240,248,241, 99,124, -248,193,199,248,224,163, 15,113,119,119,196,237,252, 2,127,240,111,190,129, 95,248,233,175,227,215,126,233, 63,193,197,229, 30, -251, 0,220,220,220, 96,122,240, 24,111,188,241, 24, 47, 94, 62,195,180, 35, 56,191,199,147, 39,143,112,245,248, 2, 23, 87, 23, -120,245,242, 53,252,238, 2,239,127,248, 62,190,253, 23,127,133,207,158, 61, 47, 90, 19, 23, 87,231,120,252,240, 1,222,122,231, - 77, 60,124,116,137, 72, 2, 55,237,176,219,157,165, 86,125,136, 56,187,216,101, 20, 51,225,252,209, 3, 16, 9, 14,135, 91, 28, - 14,183,184,190,121,133,199,111, 60,194, 28, 14,216,237, 60, 46,175, 46,112,123,119,192,123,239,125, 15,159, 60,253, 4,175,175, -239,112, 59, 63,199,225,112,192,228, 5,199,219, 35,230,201, 97,126,251, 10,199,153,193, 36,120,241,234, 21,110,143, 7,236,118, - 59,120,231, 48,237,119, 73, 2,249,110,110, 17,211, 43, 73,165, 27, 36,147,201,200,131,140,205,179,186, 72,198,108, 28,181, 60, -170,150,126,242,149,200, 62, 22,112, 77, 80, 31, 21, 19,107,232,240, 94, 70,152, 85,198, 52, 35,236,171, 42, 92, 44, 93, 66,131, -130, 94,116, 40, 43,234, 31,198,173, 19,216, 77,123,204,243, 12,102, 87,232,199,146, 69,133,224, 29,206, 30, 92,129,153,147,160, -143,223, 35,134,128,200, 19, 64, 51,166,253, 89,190,182,210,128,240,138,170,159,247,136,174, 51, 76, 18,129,136,131,139,146,252, - 62, 26,202,174,203,152,135,144, 69, 68, 66,201,178,109,188,104,226, 75,119, 92, 0,161,239, 41,136,181, 70,189,147, 40,155, 26, - 42,189,145,204, 18,241,191,236, 6,251,253,217,217, 2, 57,109,161,255, 65, 13, 79, 6,134, 33,202,195, 36,108,109,186,180, 10, - 88,176,220, 71, 91, 33, 81, 7,112,162,174,201,219,204, 6,181, 53, 75,210, 36, 25,101,209,177,217,178, 77, 85,172,243,122,118, -110,187, 77,155,103,247,148,103, 45,125,240, 85, 33,255, 2, 32, 49,231,214, 32, 43,237, 57,231,178, 90,173, 73, 99, 31,244,109, - 27,121,163,157,108, 41, 13,195, 32,184,200, 96, 91,228,240, 54,213,137, 54,143, 48, 0, 49, 30,216,161, 14, 95,171,103, 36, 24, -160, 87,111,136,211,172, 69, 26, 63, 28,145,128, 53,199,237,242,123, 39,120,248, 20, 24, 35, 46,215, 18,124, 56, 22,161, 81,207, -131,102,110,103,102,234, 34,161, 6,235,133,114,159,100,181, 45, 42,179,253, 72, 43,247,196,180,225,155,247,235,120,254,250, 41, -252,168,187,193, 61, 58,152, 65,240, 85, 20,132, 91, 93,114, 0,120,125,115,139,105,154,176,191,216,225,236,236, 12,175, 94, 94, -227,233,243,231,248,253,255,247,247,241,157,127,255,125,252,198,111,252, 6,254,239,223,255,127,240, 43,191,246,235,120,245,234, - 26, 87, 79,158,192, 81,196, 3, 63,225, 40,192,109, 72, 42,111,143, 30, 93,226,229,203,231,216,239, 28,142,225,128, 47,126,229, - 75,248,228,217, 83,236,166, 75,184,253, 57,158,189,186,134, 56,143,243,203, 43, 28, 14, 7,236,207,207,241,252,197,115,188,247, -222,123,248,173,255,234,183,240,133, 47,190,131,195,237, 45,166,189,131,159,118, 56,228,185,118,116, 73, 74,149,189,195,237,221, - 29,130, 68, 60,123,241, 60,205,217, 31, 93,225,201,147, 39,184,190,126,141,121, 62,128, 88,240,131, 31,190,135,239,127,255,123, -217, 97, 49,224,230,245,117, 6,225,157,225,112,119,131, 29,239, 48,207, 7, 28,143,192,147,199,143,240,226,197, 51,220,222,221, - 97,127,190, 51, 76,143,164,182,233,119, 83, 39,238, 36,173, 46, 65,159, 52, 91, 60, 76,126,136,181,167, 73,145,178,229,115,123, - 44, 69, 1,117, 0, 89, 49,227, 72,225, 5, 83,169, 52, 4, 99,220, 52,252, 97,111,169,140, 75,113, 24, 4,149,129, 29, 87,179, - 37,232, 64,139,189,196,232,225,108,108,115,123, 60, 34,198,136,139,221, 57, 36, 4, 76,222,193,239, 38,220,221, 28, 0,114, 8, -112,184,189, 59,226,250,250, 26,222,123,124,242,209,199, 8, 33, 96,191,219,225, 11, 95,120, 7,211, 52, 97,231,211, 56, 36,206, - 1,206, 39, 27,112,153,231,236,124, 57, 10,234, 74, 71,115, 64, 8,109,204, 33, 49, 29,208, 78,164,169, 6,158,250,181, 90,138, -107,178,210, 29, 79, 83, 70, 79,236,169, 35,113, 26,123,143, 6,236, 37, 26, 20,225, 13,184,152,118,190,136,212,163,155,101,179, - 8, 36,208,106, 80, 79, 14, 37,167, 51,147, 62,187,179,115,122,235, 90,196,221,239, 48,176, 58,107, 95, 4,123, 25, 7,245,190, - 18,181, 74, 61, 4, 35,222,191, 22,212,137,107,229, 77, 29, 26, 61,139,248,219,205,212, 30,109, 64, 26,253, 28,160, 34,214,111, -175, 85,131, 49,232, 42, 99,173,180,250,110, 72,211,210, 93,169,110,217,162,172,239,233, 4,182,208, 25,176, 26, 2, 86, 11, 96, - 81, 81, 82,147,201, 54, 1,155,219,160,238, 59, 36,239, 72, 57,110, 4,162, 99,157,143, 1, 11, 31,248,194,166,232,252,137,155, -235, 38, 12, 76,212,221,153, 21, 42, 27,197, 21, 17, 8, 25,182,213, 42,176,205, 45,174, 67,179,241, 51,154,129,192,154,162,158, -172,116, 49,136,151,226, 61,194,180,249, 44, 22,236,133, 48, 28,117,157, 58, 81, 93,128,244,111,218,239,112, 60, 30,113,123,123, - 0, 28,227,118,190,197,195,135, 15,241, 43,191,241,107,248,199,255,197, 63,193,255,240, 63,254, 79,120,249,234, 57,222,121,231, - 29,252,216, 79,252, 56,110,239,142,184,185,126,137,135, 15, 31,224,238,120, 4,237, 46,240,238, 27,239,224, 55,127,243, 55,241, -191,252,111,255, 43,118,103, 19,174,175,175,113,121,241, 0,111,188,241, 22, 66,100,188,122,125,139,143, 62,121,134,187, 89,192, -211, 46, 9,166, 56,143,231,207, 95,226,230,246, 6, 31,126,244, 17,190,254,245,159, 74,215,192, 17, 14, 33,226, 24, 5,222, 59, - 4,137, 56,132, 25,123,231,225,189,199,207,255,252,207,195,123,143,155,155, 27, 92, 92, 92, 36, 80,149,243,120,117,253, 26,111, -197,136,167, 79,159,226,197,139, 23,240,126,135,155,155,207, 48,135, 3,142,243,140,227,237, 14, 33, 28,193,110,143, 99, 72,200, -238,183,222,121, 27,110, 98,128, 29,136,211,236,243, 16, 98, 74, 78,253, 4,158,118,136,119,135,218,109, 90,217,103,234, 51,146, -129,164,134, 72,168,224,184,148,231,167,128, 40, 66,217,248,132,114,128, 73, 63,143,249,251,122, 84,160,106,232, 43,200, 6,216, -204,171,238, 99,100,212, 8,139, 7, 65,171,242,138,160, 78,128,108, 48, 27,230,220, 89,184, 0,110,163, 81, 92,211,142,215,249, -197, 30,199, 48, 99,242, 59, 60,253,248, 83, 60,127,254, 28, 55, 55,119,248,238,119,191,139,151, 47, 95,227,242,234, 33,126,242, -107, 63, 5,239, 61,158, 62,125,138,191,254,203,191,194,197,229, 57, 46,207,206,241,163, 15, 62,192, 47,254,226, 47,226,252,252, - 10, 96,198, 33,222, 38,189,125, 84, 75,231,194,218,202, 61, 17,171, 42, 73, 0,226, 60,151, 74,191,206,218, 19,253,217,137, 75, -160,185,149, 25,250,169,202,219, 98,102,122, 74,115, 97,163, 12,228,103,237,239,121,246,141,149,234,242,117,208,118,170,117,124, - 41, 24,142, 92,210, 12,158,125, 75,245, 81,164, 47, 19, 36, 70,120,191, 47, 51,246, 97,181, 62,187, 49,136,108, 32, 62,130, 65, -144,229, 56, 86, 60,162, 19, 23,245, 62,115,143,145,120,200,112,211,222, 74, 26,152, 27,119, 30, 13,142,165, 21, 61,144,209,220, - 66,155,142, 22, 71,143,118, 28,221,220,181, 69,179,248, 60, 70, 79,125,113,253, 86, 84,235,182, 2,251, 86,214, 25,105,204,223, -214,160,237, 86,130,189,116, 65,189,231,116, 47, 44,102,105,253,156, 37,155, 58,244,154,205,247, 57,218,187,125,106,153,245, 40, -211, 69, 7,138,151,106,116,146,109, 58, 93,135, 84,182, 65, 94, 72, 86,232,109, 52, 68,207, 66,184,233, 6, 88,137,205, 54,161, - 88, 38, 99,150,221,164,105,145,235,157, 25, 35,193, 17, 82,107, 50,111,142,187,243, 29,118,103,103, 56, 63, 63,135,223, 79, 8, - 33,224,234,241, 21,254,229,191,254,191,240,131, 31,126, 31,111,188,241, 24,187,179, 9,191,241,155,191,142,227,205, 11,240, 4, - 60,124,227, 13,208,171,215,136,110,135, 31,126,248, 1,118,187, 84, 93,223, 92, 31,240,233,211,151,248,227, 63,249, 51,252,202, -175,252, 26,104,218,227,131, 79,158,226,217,171,215,120,113,125, 13, 9,192,241,120,196, 44, 17,119,135, 25,211,110,143,111,127, -251, 47,240, 11,191,240, 11, 56,219, 79,217, 25, 11,152,118, 23,152,101, 78, 64,170,233, 12,206,159,225,217,103,207, 49, 71,198, -237, 33,226,242,234, 9,222,126,247, 75, 56, 28,111, 17, 35,240,254,251, 63,196, 87,190,252, 19,112, 60, 97,206,154,226,222, 79, -224, 67,128,247,105, 29,222, 30, 3, 64,140,253,254, 28,211,110,143,203,171,199,112,211, 14, 17,140, 32, 14,126,154, 16,231, 59, - 56,158,224,132, 16,133, 33,121, 28, 34,107, 27,255, 66,130,149,170,239,156, 81,203, 44, 65, 88,186, 49, 34, 12,176,184,140,239, - 85,172, 38,139, 28, 41, 83, 97,144,252, 11,197,213,253, 45, 42,115,132, 34, 24,149, 15,221,180,119,173, 14, 9,181,108, 17,181, -230, 22, 99, 9, 74,210, 50, 44,230, 40,136,148, 88, 13,194,148,212,253,220, 14,211,217, 57,226,235, 27,220, 5,224,225, 27,111, -227,226,236, 28,135, 57, 98,127,126,129,183,222,126, 27, 12,194,109, 56,226,217,139,231,184,122,120, 9,191, 75, 40,120, 56,134, -227,148,204, 37, 9, 97,206, 4,170, 60,232,232,102,205,156, 63,217,200,235, 93, 36,194,197,245,120,114,106,127, 84, 74,109, 81, -116,203,157, 86,103, 44, 84, 89,213, 77, 59, 75, 93,253,185,196,214, 8, 75,139,129,114, 13, 29, 53, 35, 21,225,138, 15, 43, 99, - 62,145,236, 86,168,210,186,222, 21,159, 87,100, 32, 78,241,241,117, 21,133, 11,137,197,199,218,250, 89, 71,191,148,225, 59,165, - 93,222, 92,152, 40,155,156,194,147, 1,153,104, 81,253,247, 64,185,113, 59,245,126, 65,127, 33,158,130,165, 54,251,162, 45,190, -162, 48, 55,226,157,219, 25, 48, 99,172, 1,207,125, 37,222,125,127,232, 6,183,213,242, 97, 58,221, 89,185, 71, 43,137, 77,166, - 90, 48, 11, 29,114,157, 6,193,186, 55,237, 24, 37, 11,140,154, 52, 88, 32,102, 95,145,215,138,189,118, 54,120, 48, 91,183,128, - 85, 55, 76, 49,215, 41, 42, 91,149,122,163,245, 61,186,119, 25,104,103,255,222,145,109,207,199, 97,146, 70, 25,115, 65,202, 91, - 45, 15, 62, 23,241,141,152, 1,124, 67, 12,138, 17,244,144, 34,153,188, 92,223,145,218,150, 59,129, 16, 17,202,245, 39, 48,196, - 49,238,174,239,112,125, 76,118,163,236, 39, 60,124,116,133,127,245,187,255, 18, 95,248,194, 59,248,236,217,115,188,249,230, 19, - 68,138,248,255, 73,123,211, 31, 73,210,252,190,239,243, 60,113,102, 68,102,214,213, 85,213,215,116,207,204,206,236,206, 30, 35, - 30,226, 18,162, 86,146, 37, 1,178, 68, 75, 47,252, 15,216, 16,109, 65,162, 33,192,128, 96,200,176,223,233, 63,144,255, 0, 89, -176, 12, 67,128, 37,136, 94, 16, 36, 69, 27, 36, 69,145,203, 21,247,152,153, 93,206,236,204,116,207,221, 93, 93, 93, 71,102,229, - 25,119,196,243,248,197, 19, 17, 21,153,149,213,221, 67,245, 32,145, 83,121, 70,198,241,252,174,239, 81,160,176, 28,135,121,180, - 36,175, 42,126,244,131,183,249,215,255,230,223,146,102, 37,203, 69,202, 7, 31,124,196,246,112,192, 15,190,255, 67,254,221,119, -255, 61,255,224, 31,254, 35, 30, 29, 29, 19,103, 25, 10,105, 22,110, 97,168, 86,193,160, 79, 85, 36,124,240,225, 67,102,179, 25, -253, 59,119,234,197, 89, 16, 4, 3,150,113,132,180, 28,130, 32, 64,107, 65,154,141,137,150, 41, 23,227, 25,131,254, 54, 96, 17, - 45, 51,206,206, 39,188,243,246,187,220,189,251, 21,162, 36,103, 62,139,233,249,146,126,127, 8,210,197,243, 28,194,158, 71,180, - 92,130,182,233, 15,134,248,190,135,210, 22, 97,127,155, 74, 9, 42,101,225, 88, 62,194, 2,105,121,102, 52, 89,106,132,244, 91, -182, 64, 19, 64, 87,207,211, 78,167,168, 49, 52,169, 85, 44, 13,165,117,117,145, 23,242, 82, 91, 92,182,190,227,215,107,143, 55, -210,172,155,130,122, 35,129,170,175,233,146, 10, 97, 35,164, 66,235, 75, 74,164, 86,122,197,105,177,113, 33,187, 76,134,215,116, - 2,212, 42, 38, 73,175, 21, 24,210,178, 80,149,166, 20,154, 52, 47,200,242, 18,233,216, 84, 74,147,151,138,215, 94,121, 21,141, -228, 98, 54, 55, 9,146,227,178,140, 83,147, 56,134, 61, 38,243, 5,183, 42,141,235, 57,181, 97, 86, 45,150,102, 25, 95,120,173, -100,199,113,205,152,198,104,154, 88,103,212,255, 52, 18, 68,185, 98,106, 67, 13,254,163,245, 33,233,174,241,171,133,208, 51,199, - 23,232, 43,150,225, 43,247,141,120, 12, 92, 1,180, 26, 74,117,151,205,114, 21, 51, 38,149,188,212,250,111, 58,198,150,196,106, -197,168,106,169,221,234,114,189,176, 27,153,195,150,250, 84, 7,109, 81,139,104,232, 14,138,209,216,104,215, 90, 59,181,124,159, -245, 28,113,144,235,173, 42, 55,180,198,175,145,211,123, 94,213,251,172,192,252, 44,147,150, 23, 65, 44, 62, 15,248,160,213, 53, - 0,186,142, 49,192,179,130,186,148,207,110,131, 63,171,253,189,169, 82, 94,159,157,174,160, 83,165,120,102, 91,233, 89, 39,239, -117,143, 73, 97, 93, 73, 82,232,160,250, 27, 81,135, 77,243, 96,117,221,247,116,102, 90, 93, 89,213,245,147,190,249, 61, 13,254, - 67, 74,137,109,219, 45,175,213,243,188,218,189, 79,183, 34, 54, 85, 85,181,210,144,121,158,183,218,208, 66, 60, 15, 91,160, 55, -119, 99,196, 26,120,176, 11,148,163,163, 96,213, 44, 32, 66, 93,170, 77, 53,253,119, 99,138,184, 90,237,137,198, 15,218,186,100, - 93,116, 59, 26,141,104,197, 26, 94, 67,233,142,107, 22, 96,217,142, 17,105,170,105, 90,150,101, 12, 73,138,162, 64,233, 18,161, -140, 52,170,241,180,214, 44,163,136,254,112, 64, 85,148, 70,124,195,178,201,242, 2,219,115, 81, 90,147,164,102,198,238,122, 30, -189, 32,224,239,252,234, 95,226,131, 15, 31,240,224,225,251,252,151,127,235,175, 83, 42,213,218,221,218,174,199,123, 63,251,128, -225,112, 11, 22, 9, 55,110,248,164, 81,140,227, 14,120,237,245,151, 80, 84,124,239,251, 63,160, 23, 4,228,133, 49, 88,193,146, - 84,149,102, 25, 39, 12, 6,125,178, 20,148, 80,204,151, 17, 95, 9, 66,190,247,199,223,231,237,183,223,193, 18, 54,131,173, 97, -123,172,181, 50, 9,207,241,211,115, 42, 37, 57, 61,187, 96, 25, 39,228,121,202,124, 30,241,217,167, 71,124,252,201, 35,250,195, - 93,242, 76,227,121, 14,121,150, 1,146,170, 18, 76, 39, 75, 92,167,135,148, 14,113,156, 51, 30, 79,232,245, 2, 44,203, 98,176, -181, 71, 56,176, 24,143, 23,148,101,137,227,153,243,173, 44, 75, 92,215,180,237, 29,203,165,210, 37,182,180, 16,150,100, 57, 95, -224, 7, 61, 44, 33, 41,170,130,126, 24, 34, 45,135,139,201,152,237,157, 29,180,214, 20, 69,137, 99, 75,210, 44,195, 18, 6, 85, - 95,230, 5, 69, 85,174,176, 44, 92,223,195,119, 61, 28,219,106, 69, 81, 36, 53, 26,188,198, 60,117,207,243,170,170, 46, 61, 19, -234,192,210,156,155, 69, 81, 32,165,196,113, 28,166, 83, 67,229,179,109,227,181, 25, 37, 9,187,219,219,196,113,220,226,165,170, -178,174,254, 92, 23,215,113,136,163, 8, 41, 37,131,193,128,217,108,134,237,184,117,231, 71,173, 74, 14,235, 6, 43, 36,113, 93, - 11, 85, 65,156,230,100,101,193,114, 54,227,228,108,196,206,222, 46,182,231, 50,157, 47,152,207,231,140,207,207,112, 61,143,249, -114,193,206,206, 14,189,126,200,187,239,189,199, 87,191,250,154, 25, 75, 8,218,192,238,184,134,253, 32,132,213, 6, 69, 93,127, - 31,173, 71,136, 54, 65, 94,107,132,112,160,117,183, 83, 45, 32,180,165,233,106,189,185, 93,183, 54, 46, 99,109,253,146,226, 50, -233,146, 29, 12, 22, 53,219,100,125, 54,175, 59,170,113, 90,212,236,174, 70,116,134, 75, 13,130,102, 61,208,170, 1,220,214, 56, -128, 26,104,157, 87,101,203,185,167, 11,192, 20, 96, 43, 46,103,199, 77, 6,216,238,144, 46, 0,173,173, 76, 84,219,118, 86,181, -140, 66,183, 66,109,130,152,236,160,199,175,227,169, 63,175, 85,253, 34, 9,128, 88, 67, 47,138, 13, 40,248, 46,121,127,147,140, -171,122, 1,244,253,117,127, 11, 94, 60, 56,110, 14,148,108,164,180,189,136, 46,188,181, 86, 41,175, 84,106,107,149,162, 92, 63, - 57,159,193,239,190, 78,201,110,179, 22,177,188, 54,168,175,183,125,175, 6,166,205,125,111, 77,231,243,186,173,205,142, 5,167, -174,103,124, 82,202,206,185, 42,168,106,225, 10,165, 20,121,189,128,153,150,173,106,229,131, 27,115, 31,187, 9,102,141, 53,238, -179,128,138, 92, 82,251, 46,149,223, 46, 41,125,242, 10, 59,163,238, 92,168, 14, 79,125,125,166,222,233, 68,104,113, 21, 77, 91, - 67,233, 46,191,123, 45,168, 11, 26,218,147,218,136,193,104,246,165,109,155,121, 51, 66, 80, 20, 21, 85,149,162,132,196,113, 92, - 92, 91,146, 37, 49,101,105, 22,191, 27, 7,123, 68, 81, 66, 81,149, 4,189, 62, 32,112,124,159,197,108,206,206,222, 46, 50,138, - 0,240, 7, 3, 44,215, 97,127,127,143,191,253,183,255, 71,254,233, 63,253,159,248,123,127,239,191,226,171, 95,253, 42,147,201, - 24,219,118, 65, 88,252,242,175,252, 10, 89, 37, 40,190,120,194,108, 62,226,252,108,194,220, 75,201, 51,205,214,214, 16,219,241, -152, 45,230,156, 28,159,163,148, 34,203, 10,180,174,136, 22,115,180, 46,217,221, 25,112,114,122,204,163, 47,142,120,227,107,223, -224,195, 15, 31,240, 7,127,240,135,248,158,241, 78,247, 60,143, 56,142, 41, 11, 77,232,247,112, 93, 31,199,114, 88, 46, 19,206, -207, 71,148,101, 73,169, 74,170, 74,115, 49,137,152, 76, 83, 78,158,142, 24, 46,203, 86,237,111,177, 56, 35,240, 61, 60,207,225, -209,209, 49,121,158,147,167, 41, 15, 31,124,138,101, 11,254,223,255,239, 15,136,227, 24,207,247,113, 93,159,180,200,233,245,122, - 8, 33,136,162,136,251,119, 95,226,230,205,155, 68, 81,132, 16,154,167, 79,159, 18, 69, 17, 90,107,146, 36, 97,127,127,159,254, - 32,192,113, 28,164,148,132, 97, 72, 20, 69, 12, 6, 3,146, 36, 90, 49, 45,170,170,234,210, 5,174,170, 8,195,208, 36, 81,174, -187, 2, 32, 53,199,212,194,177, 37,190,231,224,123, 1,174,103, 99, 73, 7,105,129, 99,123, 56,174, 69, 85, 26,115,146,126, 56, -196,178, 5,142,237, 25,202, 87, 5,183,239,220, 98, 62,159,146,231, 69,173, 30,233,241,193,131,143,184,123,247, 46,129,215, 51, - 73, 75,207,232,251,143, 70, 35,202,170, 98,107,123,155,197,194, 4, 97,207,247, 47,117,212,215,174, 83,179, 50,152,112, 83, 86, -154,163,163, 99, 78, 78,207,168,170,138,197, 34, 98, 50,155,226, 5, 33,103,103,103, 56,174, 71, 18,197, 60, 62,126,130,239,184, -184,174,193, 68,104, 93, 81, 40, 69, 20,167,244,194, 0,215, 55, 24,137,162,204, 76, 80,148,150,137, 91,117,240,148,173, 84,173, - 97, 10, 24, 96,162,190,164,249,155, 92,195,224, 0, 68,211, 85,150,176,166,114,183,105,100,169, 59,244,230,246,111,185, 6,228, -173,183,163,171,238,215, 92,219,122, 3,128,186, 38,145,118,232,195,117, 42,222, 36,248, 93,237,145, 58, 35,184, 12,252,186,102, - 23, 95,110, 79,243,251,109,203,185, 58,168,175,234, 74,188, 66,163,203,226, 82,124, 68, 96, 64, 6, 13, 79, 87,208,186,183, 93, - 55,211,180,159, 1,212,120,145, 86,251,243, 2,253,101,187,146,107,229,252,228, 53, 73,197,250,227,205,251,186,174, 55, 77,251, - 75,118, 80,240,162,123,143,252, 82, 1,121,157, 90,214,101,201, 63,171, 58,190,238, 51,101, 7, 56,215,204,250,229, 90,165,191, -210, 57, 96,179, 69,236,243,102,210,215, 61, 47,244,213,118,248, 21, 76,133,184,106,169,121,121,114,111,170,212,197,102,148,103, - 71, 49,173,185,120,138,170,166, 22, 89,151, 78,110,190,235,172,168,107,161, 58, 23, 95,253, 57, 10,109,248,198, 85,213, 17,225, - 17, 45,223,191, 33,118,201, 58,121, 48, 42, 90,226,170,184, 77,141,185,232, 78,177,187,195, 17, 45,171,214,220,165,139, 98,191, - 76,176,170, 85,138,161,150, 43,199, 73,116, 0,119, 43, 45,133,102, 36,208,106, 27,178, 66,216,107, 25,143, 10,148,170, 40, 10, - 19, 44,188,158, 7, 66, 83,149, 10,165, 43, 19,172, 60, 7,203, 17, 72, 97, 51,155, 47,169, 42,141,227,120, 44,150, 9,179,217, - 2,233,216,120,182,195,167,159, 31, 17, 4, 1,105,154, 52,190,124,224, 0, 0, 32, 0, 73, 68, 65, 84,242,244,116,204, 59,239, -252,148,191,242,157,191, 9,192,104,116,193,227, 39,167, 4,125, 99,144, 98,102,240, 1,223,252,214, 95,224,221,119, 31, 50, 14, -231,220,216, 1,199, 14,176, 44,143,197, 60, 34, 78, 47,248,106, 81,145,166, 41, 74, 41,110,221,186,197,100, 60,165, 72, 19,150, -211, 9, 89,154,162,245,144, 55,223,124,147,127,247,221,239,242,255,252,230,111,130,150, 84, 90,112, 49, 93,112,239,222, 61,147, -164, 40,129,223,235, 99, 59, 46,105, 94,176, 72, 99,202,170,192,113, 44, 92,215, 39, 89,206, 41,138, 18, 45, 53, 97, 48, 96,119, -239, 0,173, 5,121, 94, 98,123,162,245,185,247,188, 30,174,237,129,116,113, 61,201,114,185,100, 24,244,235,160,218, 39,201, 51, -146,172, 68, 33, 56, 63,159,145, 36, 9,190,231,224,245,250,184,126, 72,156, 22,244,122, 61,242,242, 4,219,237, 17,199, 49,131, -237, 29,210,162, 36, 30, 77,241, 60,143, 48,236,225,120, 61, 22, 81,194,197,116,142, 45,100,219, 97,106, 40, 95,174,235, 98,219, - 54,121,158, 51,157, 44, 91, 37,204,238,120,211,182,109,108, 71, 82,228, 9,160,176,109, 23,173, 43,178,172, 64,169, 18, 41,109, -148, 42,241,253,128, 44, 75,232,245, 66,242, 60, 37, 8,250, 72, 9, 82,218,252,245,191,254,215,248,165, 95,250, 37,198,227,115, -190,251,221,239, 82, 85, 21,179,217,140,127,242, 79,254, 9,179,233,180,150,136,150, 28,159,158,177,181,181, 69, 85, 85, 20, 69, - 65,191,223, 55,174,120, 77,199,167,149,247,237, 46,212,151, 67,176, 50, 79,249,228,147, 79, 56, 57, 61,195,117,125, 46,198, 83, -166,179, 5,123, 55, 42,230,179, 5,138, 57,170,172, 88, 46,151,136,193, 0,183,231, 18,167,117, 80, 47, 75, 38,243, 25,219,123, -219, 56,182,101, 12, 80, 74, 19, 64,221,218, 68,168,185, 46, 87,214,140,238, 77,232,205,182,179,170, 46, 74, 27,177,156,117,192, -248, 11,140, 34,181,208,151,214,167,157,245,227, 50,201,209,173,228,113, 87,195, 93,202, 78,112, 94, 95, 51,215, 77,183,214, 48, - 27,237,231,107,125,197,219, 65, 0,182,116,236,149, 89,174, 65, 5,106,148, 16,245,253,165, 91,141,104, 84,199, 26, 81,253, 58, -154,118,209,218, 93,116,182, 92,163,160,137,181,215,233,206,107,228, 6,116,178, 94,163,129,172,255,221,221, 1, 43,242,125,207, -168,196,175,171,204,155,247,181,149,149,210,109, 48, 87, 27, 42,214,230,125,232,103, 87,184,109,231,162,171,184,215,157,189, 35, - 95,140, 61, 0,207,245, 11,190,130,156, 22,151,149,155,222,128,142,110,185,247, 29, 98,216,138,250,217, 53,207,175,188,174,142, -176,106,211,201, 47,197, 21,106, 93, 55,161, 16,215, 84,233,172,109,111,119,123, 46, 43, 84, 90, 83,135,166,157, 94, 20,133,225, - 28,215,122,245,105,154,210,239,247,141,113, 78, 45, 82, 33,165,108,121,174,210,177,107,220, 72, 77,231,217,112, 14,182,138,126, -242,210,106, 85,172, 80, 41,197,115,129,150,207, 74,248,212,149,145,133, 88,217, 95,151,199, 87,172, 92,220,141,140,103,183,213, -191, 1,134,138,235, 26, 96, 91,150,229, 53, 39,185,170,247,133,105,199, 7,126,192,108, 62, 97, 56,216,165,170, 12, 48, 54, 77, - 98,254,183,127,254,207,249,181, 95,251,239,249,141,239,254, 22,239,188,243,147,118, 59, 6,131, 1,113, 28,147, 36, 9, 2,151, -223,254,173,223,229,237,183,126,138,180, 92,254,205,191,253, 13,226, 52,231,141, 55,222, 96,111,111,143,201,120, 76, 24, 12,248, -193, 15,126,136,239, 7, 84,165,160,170, 52, 82,106,162, 40, 65,139,146,209,104,132, 16, 21,174,107,227, 88, 54,170,200,137,163, -136,162, 40,136,147, 5, 22,154,225,176,143,239,251,204,166, 11, 46, 46,166,236,237,237,211,243, 5,139,165, 25, 5, 84,165,160, -148, 21,101,153,212, 86,168,102,214, 90,149, 48,141,231, 40, 85, 34,108,155, 44,201,201,242, 41,158, 27, 34,165,141,239,251,148, -186,100,123,123,155,229,124,206, 98,177,100,216,239,179, 92,196,148,149, 25,205, 68,203, 12, 37, 50,118,118,118, 56, 31, 93,144, -166, 41,123, 7,135, 68,105,134,210, 48, 95, 36,148,149,102, 50,153,145,164, 25, 82,218, 36,105,142,239,121,216,174, 71,154, 20, - 76,231, 19,110,223,188,197, 75,247,238, 99, 91,146,131,195, 67,122,189,144, 7, 15, 30,160,164,133,109,219, 56,142, 85, 87,242, - 21,150,101, 99, 89, 54,142,115,213,130,250, 82, 76, 69,130,150,120,110, 64,158,167, 84,165,249,221,142,237,226,186,253, 54, 41, - 40,203, 18, 41, 28,164,176,176, 45,143,178,168, 72,146,132, 52, 77,121,231,237, 63,227,233,211, 83, 30, 63,126,204,120, 60, 70, - 74,201, 27,111,188,193, 23, 95, 60,198,181, 29,246,246, 66,252,158,209, 1,112, 28,115, 30,197,113, 76,191,223,103, 56, 28,146, - 87, 37,162,190,126, 20,107,152,166, 86,102,216, 66, 41, 56, 31,141,201,178, 2,219,242,235,246,190,192,237,249, 56,142, 99,170, -118,199, 37, 12, 67,182,183,135,216,182, 77,188,156, 19, 4, 62,189,192,167, 84, 21, 94,173, 46, 87,106,133,150, 22,150, 0,233, -216,168, 6, 8,216,233,216,118,193,112, 85,165,106,214,210, 6,246,150, 52,108,143, 86,200,107,131, 2,234,117,227, 83, 26, 81, -174,206, 10,190,130,233,233, 96,142, 86,124, 77, 58, 58, 45,212,120,159,255,172,177,178,186,250, 26,187,241, 59, 22,151,165,115, -173, 71,108, 82, 14,203,114,219,222,253, 38, 39,176, 46, 16,103,147, 2,153, 86,250,138,150,251, 74,155,162, 81, 60,187,134,119, - 36, 54,220,119,219,247,162, 3,184,235, 8,199,181, 21,183, 73, 58, 58, 64,147,181,231, 77, 53, 78,109, 50,178,225,126, 3, 0, -101, 13, 55,189,178, 93,130, 85, 45,123,105, 61, 39,232,243,108,235,192,231, 89, 11,242, 12, 71, 55,177, 30,168, 55, 66,195, 94, -236,100,186,110,219,100, 35, 34,191, 97,155, 86, 59, 18,108, 8, 74, 87, 65,126, 93, 87, 46,205,165,162,158,220,144, 12,180,162, -142,150,153, 87,151,121, 65, 86, 86,216,158,143,101,219, 84,105, 70,156,229,248,190,143,176,107,201, 74,203,170,101, 54, 85,237, - 5, 93,181,199, 97, 35,254, 98, 61, 78,174,253, 14,245, 92,212,188,216,152,180,116, 23,191,174,199,185,236,122,205,119,130,249, -213,207,187,116,199, 19, 43,250,245,114,229,220, 92,206,151,166,133,107, 27, 59,210,162, 40, 40,139,146,126,127,136,112, 61,138, - 50, 99,255,198, 45, 22,243, 24,223, 15,152, 45, 23,156, 60,189, 96, 52,142,248,223,255,229,191, 38,138, 18,190,242,234,215,113, - 61,191,166, 29,205,216,222,182,120,248,240, 67,190,241,141, 95,228,139,207, 30, 81,149, 54,129,191,199,104,156,112, 62, 62,227, -243, 47,142, 57, 60, 60, 36,137,151,244,251,125,142,142,142, 56,216, 59, 64, 85, 96, 57, 62,190,191,133,229,216,100, 89,198,251, -239,191,207,214, 48, 64, 96, 49, 57, 31,145, 37, 41, 84,138,173, 65,200,100,146, 33,128,247,223,123,143,215, 95,127,157,111,124, -253, 91,252,222,239,253, 33,179,249,130,170, 20,109,247,193, 15, 3,108,215, 37, 77,115,202, 82,225,121, 14,210,177, 89, 44,231, -184,174,131,180,236,182,202,172,180,198,117, 2, 74,165,208, 85,133,144,138, 94, 47, 36,168,101,103, 27, 58,156,180, 44,163, 63, -142,162, 40, 20,179,249,146,112,184,133,227,247, 40,114, 99, 25,156, 38,153,161,205,121, 62, 89, 94,210,235, 15,106,166,160,160, - 40, 75,180, 16, 68, 73, 76,165, 5,105,158,241,248,248, 9,203,217,156,189,179, 51,195, 12,145, 6, 61, 95, 85,138, 44,203, 91, - 17,150,166, 18, 87, 74,213, 54,176, 77,130,103,213, 55,105, 88, 21,150, 49, 27,114,253, 94,107, 78,101,250,208,150,145,104,182, -108,211, 97, 68,144,214, 45,246, 52,205, 72,179,156,178, 82,188,245,206, 79, 80, 63, 50, 60,232,151, 94,186,195,215,190,250, 6, -159,124,252, 41, 73,156,114,118,118,198,116, 54,225,175,126,231, 47,243, 43,191,242, 43, 36, 73,130,109,219, 12, 15, 14, 73,211, - 20,199,177,136,102, 9,158,231,173, 40, 44, 94,142,147, 68,139,185,202, 11,243,221, 97, 24,226,250, 62, 21,130, 94,216, 39,232, -133, 88,182,196,177, 45, 44, 91, 98,219, 18,215,178, 87,156, 7, 93,207,163, 82,138,160,111, 36,134,149, 42, 91, 28, 87, 81, 84, - 43, 35, 9,106, 48,162,214,250,138, 54,251,165, 41,157,233,109, 27,146, 87,237, 71,209,145, 18, 23,107,160,219,198, 77,175, 85, -168, 92, 75,248,229,115, 70,173,155,176, 97,171,143,203,107,113,101,226, 69, 70,209,234,170,247,133,109,219,118, 43, 13,217,157, - 41,116,219, 61, 29, 16,249,149, 15, 47, 85,117, 69, 20,166, 43,192,114,165,162, 89, 7,246,212, 3,132,238, 44, 65, 32,174, 0, -128, 86,230, 19, 29, 59,188,118,151, 88, 98, 69,228,161, 85, 71,237, 60,110,173,239,208, 78,133,246,101,168,104, 43,250,218,107, - 7,182,187,195,215, 53,237, 27,170,224,106,146,240,156,118,183,210,215,182,193, 95,136, 33, 32,197,213,100,100, 77, 39,252, 89, -153,226,243,192,130,155, 12, 95, 86,172, 95,121,177,150,214,149,237, 19,215, 60,191, 86,225, 55,228, 10,165, 20,113, 28, 19,213, - 64, 30,215,117, 89, 44, 22, 72, 41,217,223,223,199,113,140, 80,136, 89, 12,173, 22, 52, 86,118,116, 18,158,167,147,189,126,110, -168, 13,254,198, 95,246,223,181,226, 62,215,140, 93,116,199,182, 82, 34, 47, 21,191,218, 71,245,202, 68,222,243, 60, 92,215,165, -136, 83, 44,203,180,163, 27, 80,213,217,217, 57, 91, 91, 3,180,146,104, 45,168, 74,193,205,151, 95,227,195,247, 63, 67, 41, 73, - 63,220, 97, 56,216, 7, 45, 73,178, 20, 41, 28,134,131, 61,254,227,127,252,143, 44, 22, 11,138, 92,146,103,130, 39, 71, 35,146, - 52,199, 13, 4,253,254, 13, 16,138, 44, 87, 56,110, 64,180, 76,168,170,138,139,139, 17, 66, 88,236,222,184, 73, 81,229, 44,227, - 5,113, 60,103,119,215,199,179,109,242,188,160, 40, 96,171, 63,192,182,109, 60,215, 70,149, 37,203,229,146, 48,236, 17, 69, 17, -147,135, 31,147,103, 5, 69,165, 56, 63,155, 48,220,222, 33,175, 74,166,139, 57,209,210, 84,127,170, 80,244,122, 30,175,190,242, - 10,119,238,220,225,233,211, 99,148, 46,153, 78,167,230,119, 99, 97, 91, 46, 89, 97,230,221,158,111, 49,153, 74,190,246,218,235, - 72, 41, 57, 61, 61,165, 40, 76,176, 62, 63, 63, 55, 1,127,208,231,241,241, 19, 60,207, 35, 77, 50, 20,154,215, 95,127,157,139, -139, 11,116,165, 24,143,199,140, 70, 35,250,125, 83, 33,207,102,179,154,219, 31,179, 88, 44,184,125,231, 38,105,145, 83,205,231, -120,190, 71,150,165, 92, 92, 92,176,213, 31, 32, 44, 99,138, 85, 20,141,152,137, 69, 24, 6,120,158, 79, 89, 22,196,113,210,154, -248, 52,162, 40,205,223, 82,154,110,212, 96, 16,214,192, 79, 19, 60,203,194,156,231, 38,224, 10, 84, 85,146,231, 5,158,231, 97, - 91, 46, 91,195, 30,142,227, 48, 26,141,208,245,117, 19,199, 57,163,209, 5, 91, 91, 59,148,165, 98,111,111, 31,128, 31,252,224, - 71, 40,165,248,213,191,251,119, 41,139,148,243,243,115,134,195, 33, 81, 20,177,189,189, 77,146,165, 43,148,232,203,243, 85, 24, -158,189,150,204,102, 51, 92,215, 55, 29,181,186, 72, 12,195,176,163,177,239,213,221,164,140, 40,138,232, 5, 30,190,111, 94,183, - 92, 46, 57, 63, 63, 55, 9, 89, 85, 33,165,233,204,117,193,128,207, 99, 71,173,104,224,175, 49,159,186, 29,234,102, 38, 45,214, -152, 59,215, 41, 82,202, 47,217, 93, 93, 81,223,107, 95, 43,159,185,198,108, 18,151, 89, 41,130, 54, 0,173,237,230, 2,111,223, -180, 70,221, 41,203,178,254,225,155, 41, 94, 87,181,127,175,111, 15,111,122, 77,181, 41, 32,124, 9, 52,251,250,143,234, 6,252, -107,105,107,215, 80,234,158,149,105, 93,183, 24,203,103,160,184,245,134, 76,109, 83, 81,171, 59,213,108,211, 26, 87, 43,200,233, -203,228,104, 93, 81, 79,234,171,188,201,141, 40,253,107,254,255, 89, 12,131,235,180,136, 55, 61,191,254,190, 22,200,182,153,104, -120, 73, 71, 91, 87,132, 18,171,146,180,172,117, 27,214,233,125,174,235,214, 0,171,140,249,124,206,249,249, 57,113, 28,227, 56, - 14, 79,159, 62,101,127,127,159,189,189,189,118, 33,104,125,236,107,165,169, 77, 73,201,230,223,122, 93,183,162,233, 58, 93,163, -220,165, 87,117,167, 95, 52,192,183, 62, 94,155,140, 64,218,243,230,170,171, 23,107,252,123,164,224,232,232,152,183,126,252, 14, -203,229,178,158,169,154,121,241,123,239,189,199,246,238, 22,247,238,189,204,116, 50,199,247, 67,178,180,224,243,207, 31,243,210, -221, 87,121,231,237,119,241,253, 16,129,133, 31,244,136,162,132, 48, 12, 89,204, 51, 44, 39,228,253,247, 62,197,119,253,122, 86, -239,243,241,195,199,236,222,216,227,222,171, 47,113,118,118,204,211, 39,143,176, 45, 65, 24,184, 12,135, 67, 99,194, 34, 5,143, - 30,125, 70, 20, 45,185,119,255, 46,175,189,126,159,237,126,159, 39, 71,199,248,174,139,235,248,168,170,162,204, 51, 92,199,225, -244,108,206,173, 91,135,248, 94, 64, 94, 46,217,217,217,225,236,124, 66,156,102, 76, 31, 61,162, 40,115, 60,223, 71,104,193, 27, -111,188,193,237,195,219, 0,244,195,144,147,147, 39, 36,105,196,173, 91,135,132, 97, 15, 41,109,206, 71, 19,148, 82,244,251, 3, -194,126, 15,161, 11,164, 52, 45,254,243,243,115, 70,163, 51, 16,138,178,202,137,147, 37,203, 36,198, 93,206, 72,211,148,101, 44, -201,210,130,237,237,109, 28,199, 97,103,103,135,119,222,126,139, 44, 79, 89, 46,151,109, 50,208,128,224,178,204,104,208, 7,129, -111,128,102,101,193,193,193, 1, 69,225,115,124,124,204,196,115, 80,101,101,170, 83,105, 35, 37,236,237,237,179,179, 51,196,113, -108,102,179,139, 22, 56,168, 20, 84, 85,129,193,165, 85,109, 72,121,227,141, 55, 8,195,144,233,116,202,114, 25, 99, 89, 86,157, - 80,164,244,122, 61,122,189, 30, 85,165, 25, 12,182, 24, 14,135,109,178,123,113,113,129,227,120,220, 60, 56,228,248,248,152, 47, - 62,127,204, 47,254,226, 47,146,101, 25,113,108,230,248,223,249,206,119,248,232,225, 3, 62,254,248, 99,206, 78, 78,152,207,231, -252,236,253,119,185,123,247, 46, 74,149,220,186,117,139,173,237, 93, 54,249, 31, 54,169,124,146, 36, 28, 29, 29,181,212,102, 85, -229, 20, 69, 65, 24,244,141,219, 94,150, 34, 37,228,105,138, 42,115,163, 43, 16,149, 4,129,223, 94,179, 23, 23, 23,196,105, 66, -169, 42,108,105,215,180, 75,211, 85,185,116,105, 92, 93,195, 26, 31,117, 35, 5,219,137, 11,122,117, 52,169,219,201,247, 6, 44, -208, 11,116, 48,175, 91,223,158, 7,158,190, 52,100,185, 38,206,172, 96,146,196,138, 93,110,183, 48,211,250,234,186,100, 55,244, -133, 70,132,160, 25, 3,118,209,152,102, 33,108,228, 59, 87, 39,135, 95,150,247,221,242,129,219, 54,180, 94, 65, 73,111,114, 89, - 91, 55,178,170, 58, 11,164, 82,171,149, 73,115,175,245,243, 65,107,173, 39,186,126, 70,203,180,179, 51,175,216,203,138,166,165, -126, 61,192,237,186, 76,178, 11,180,216,196, 47,109,254,110, 47, 6,189,233,164,211, 87,212,195, 36,181, 81, 78, 3,246,234,236, -207,202,184, 55,215,149,190,190, 34,110, 83,213,205,219, 46,246,192,126, 6,128,174,130, 14,130, 91,182,110, 82,162, 35,127,100, -124,211, 55,104, 90, 55, 13,173, 53,233,212,198,175,186,197, 44,172,204,167,197,202,152,163,235, 13,221, 32, 83, 45,203,194,239, -245, 8,131,128,197,114, 73,150,101, 80,183, 51,179,252, 82,253, 75,107, 77,169,138,118, 30,111, 42, 11,181, 74, 61, 65,183, 21, - 82, 87,115,125, 83, 93,220,133,215,154, 22,159,108,125,165,215, 44,100, 86,175,145,142,163,155,169, 10,196,181, 0, 80,221,153, - 84,181,254, 11,181,161,146,106, 76, 62,218,129,146,249,190,192, 11,152,206, 30,243,214, 91, 63,229,193,195,135,244,122, 1,251, -251,251, 4,253, 33, 71, 79, 71,188,243,103, 31,160,197, 15, 73,162, 20,105,217, 68,139,152,123,247,191,194,222, 94,202,108,158, -240,254, 7,159,146,231, 57, 47,191,250, 26,111,190,249, 38, 31,126,248, 33, 91, 59,123,156,159,143, 56,188,125,155,104,190, 64, - 72,201,249,120, 66, 56, 8,248,218,215,190,198,251, 15, 62, 96, 52, 62,193, 18, 10,215,246,176,157, 30, 69,165, 9,108,151,172, - 40,249,236,139,207, 89,196, 49,135, 55,111,144,197, 9,145,210, 60,125,114,196,254,254, 1,176,172, 57,184,112,112,112,192,141, - 27,187, 0,188,255,238,123,220,186,115,155,191,250,157,239,240,189,239,255, 41,143, 30, 61, 98,127,111,155, 82, 43,126,249,151, -127,153,170,210,173,137,172,239,251,248,190,195,227,199,143,113, 92,171,237,228, 12,135,125, 84, 5, 69, 85,225, 58,190,169,212, - 61,159, 94,207, 67,171,146, 71,143, 63,103,190,152,226,186, 54,160,216,221,221,198,118,125,170,170,226,191,253,251,255, 13,191, -240, 11,191, 64, 85, 40, 62,250,232, 35,126,235,119,126,155,163, 71,143, 9,195,144, 87,239,223,227,240,240,144,147,211,227,182, - 99,244,198, 55,190, 65,175,215,227,173,183,222, 34,138, 99, 92,215,229,240,240,128,195,195, 67,118,118,182,112, 44,205,197,104, -140,227,120,244, 92, 83,169, 54,109,109,207,243, 72,211,140,163,163, 35, 94,126,249,229,182,181, 94, 85,206, 21, 71, 77,215, 53, - 51,239,197, 98, 65, 28,199,220,186,117, 11,223,247, 91, 69,189,131,131,131, 58,153, 11,218,182,253, 98,177, 96, 60, 30,243,242, -203, 47,211, 11, 3,132, 37,217,222,222,102,116,126, 65,165, 12, 46,229,214,173, 67,254,248,143,255,132,126,216,227,226, 98,202, -191,248, 23,255,146, 87, 95,125, 25, 33, 4, 63,250,225, 91,104, 42,162, 40,226,215,127,253,215, 55, 20, 50,151, 74,117, 81, 20, -241,244,233, 9, 89,102,152, 40,149,174,173,124, 45,139,170, 40, 72, 18,195,166, 72,210, 8,219,182,145, 82,178, 88, 44,176,109, -155,126, 95,178,183,119, 3,171,230,101,107,203, 66,104, 40,138, 12, 93, 41, 44,207, 70,149,250,218,248,179, 14,124, 91, 41, 60, - 58,172,159,134,214,182,105,166,222,202,128, 43,189,217,229,177, 1,202, 10,179,238, 90,181,136,207,122,253,120,173, 99,222,218, -231,174,255,221,234, 15,118,121,234, 82,212,227,102,227,175,222, 48,210,218,160,126,114,118, 90,247,225,107, 93,110, 20,174,235, -224,212,126,183, 90, 87, 53,144,195,105, 1, 72,166, 66,182,235, 5,209,144,225,171,210,240, 54,173,122, 1,109,184,147, 40, 93, - 31,172, 26,141,220, 72,249,105,179,192, 91,218,194,178, 28,180, 80,148,170, 50, 1,187,158, 51,148, 69,133,231, 56,102,102,216, -242, 10, 21,150,208, 84, 52,138, 87,194,240, 48,107,255,107,129, 85,227, 3,228, 37,221,226, 25,125,244,110, 6, 36,116,167,125, -223,182,236,197,149,153,244,170,126,188,190, 34, 92,210,232,122,179,146, 73,109,146, 1, 85, 87,196, 98, 52, 87, 29,202,186,218, -224,171,207, 41,211,127,110, 56, 27,221, 64,209, 9, 2,205,143, 93, 7, 52,174,159,108, 93,128,163,176,106,207,120,203, 90,145, -135, 20, 29,164,189,236,162,178, 55,248,160,105, 97, 44, 22, 55, 7,245,122,182, 45,175,162, 63,233,240, 57, 87,252,224, 27,218, - 70,171,150,101,108, 92,149, 86,216,142, 71,169, 97,119,111,159,151, 94,126, 25,223,113,169,132,228,236,233, 9,194,118, 76,114, - 99, 91, 84,186, 68,105,141,227,217,166, 53,169, 58, 1,183,227, 11, 47,197,186, 21,199,213, 14,135,181,166, 9,112, 69, 24,250, -210,221, 98, 35,110, 0, 26, 36,190, 81,189,210,157,202,188, 9,214,150,101,140, 48, 68,123,177,215,192, 75, 41,113,164,185, 94, -205, 28,214, 65, 97,161,235,155,229,120,252,244,167,239,114,124,124,204,135, 31,126,200,195,135,143,184,243,210,107,108,109,239, -240,224,163, 79, 72,143, 46, 76,176, 21, 33, 65, 16,178,189, 27,114, 62, 26,241,250,215,223, 96,107,103,155, 15, 62,120,128,148, -146,237,253, 3,180,214,124,237,235, 95,229,108,116, 74, 81,229,104, 52,123,251,123, 44, 22, 51,194,237,144,147,179,167,188,252, -250,171,124,229, 43,175,240,224,227,135, 60, 61,121,140,239,187, 20,133, 38,180,109, 46, 38,115,246,191,246, 53,158,156,156,242, -224,193, 3, 10, 85,225,216, 30,182,180, 24,159,143,208,219, 91, 12, 6, 3,182,118,183, 73,211,148, 50,203, 41,114,131,178,118, - 45, 27,215,182,136,166,115, 62,125,248, 9, 47,221,188, 77,182,156,242,183,254,198, 95,230, 31,254,163,255,129, 56,205,248,230, -155,127,129,223,255,253,223,231,255,252, 63,254, 21, 23, 23, 23,188,242,202, 43,160,183,233, 15,130, 22, 11, 52, 12,135,252,131, - 95,251,239,248,189,223,251, 61,126,239, 15,254,144, 55,223,124,147,255,229,127,253,159,233,185, 14, 63,248,225,127,226,143,254, -232,143, 72,227,168,174,150,119,185,123,255, 30, 73,146,240,143,255,241, 63,230,205, 55,223,100,107,107,139, 40,138, 24,134,125, -126,242,246, 15,232,123, 22,131,158, 75, 20, 37,204,103, 19,230,179, 49, 55,110,220, 96, 52, 26,241,171,191,250,171, 12,182,134, -252,248,237,159,144,230, 25, 69, 85, 98, 9, 73, 47, 8,233,247, 3,182, 6, 33, 63,255,173,111,240,227, 31,255,152, 48,216, 38, -175, 20,135,187,187,166, 85,127,251, 54,126,216,231,201,211, 79, 81, 66,162,132,164, 63,232,115,113, 49, 98, 25, 71,132, 97,143, - 36, 73, 40,203,146,219, 55,111, 50, 24,132, 60,121,124, 76,180, 88,178,183,179,203,214, 96, 72,158,231,132,189,128, 91, 55,111, - 49,155,205,184, 24,143,177, 15, 44,118,118,118,152,207,231,124,241,217,231, 12,251, 3,194, 48, 52, 73,112,232,179,183,183,195, -231,143, 62, 35, 12, 67,238,222,189,203,209,241, 19,250,195, 1,182,180,248, 43,127,245,175,241,214, 91,111,241,254,135, 15,216, -221,222, 97, 56, 28,114,239,222, 61,198,103,231,156, 31,159,113,255,254,125,202,178, 36,201, 82, 28,207,163,212, 26, 85, 25,253, -131,188,170, 40, 84,197,100, 54, 35, 8, 2,178, 56, 35, 79, 98,118,183,183,136,162, 5, 89,150, 17,132, 62,139,197,194,116,221, - 74, 77,158, 22,100, 73, 78, 26,103, 38,246,184, 14,170,212,100, 89, 74,208,243, 8, 3,159, 36, 90,182,194, 47,205,202,165,148, - 54,197, 74,103, 70,190, 98, 62,211, 20,124,117,234, 91, 41,163, 85, 47,132, 41, 34, 26, 64, 93,213, 56,213, 9,218, 32,221,104, -217, 75, 46,239, 13,186,174,106, 49, 48,150,180,144, 88,107,227, 88, 5, 66,163,132,106,131,111,227, 88, 39,132, 52,203, 55,171, -110,146, 85, 45, 40,164,154,106,174,246, 2,160,249,126, 93, 23, 87,168,141,157,112,235,239,255,215,127,247,159, 41, 3,171,160, - 44, 11,146, 56, 34,203, 82,202,178, 36,207, 13,104, 69, 85, 21,121, 89,144,101, 25,121, 94,182,213,177, 22,180,139, 98, 67,187, -176,234, 10, 95, 85, 80, 86, 5, 65,175,215,201, 52, 75,164,201, 1,234,172, 10, 92,203, 69, 34,169, 84, 69,165,149,201, 70, 44, -176,164,133,101, 91, 70, 41, 71,107,164,170, 13, 83,132,249, 49, 66, 84,104,161,113,164,211, 86,220,166,187, 96, 4, 70,148,170, -106,246,144,120,102, 80,111, 45, 65,105,184,191,141,196,169,168,233,108, 98,197, 54,181, 13,232,173, 26,154,110,103, 97, 77,246, -188, 98, 78, 34,100,123, 0,187,207, 25, 13,244,213,106,109, 83,171, 91, 10,187, 61,241,204,173,230,102, 10,105, 0, 37, 82, 55, -118,105,141, 46, 97,203,199,110,168, 94,210,186, 4,216,200,218, 1,171,121,222,182, 77,114,102, 53,247,107,183,230,245,221, 91, -227,162, 37, 44, 27,203,114,145,150,109, 94,183,118,111, 73,187, 78, 74,228,138,195, 88,179, 47,180,101,100, 40,133,172,177, 6, - 82,214,254,235,162,189,175, 29, 83, 46,229, 87,155,125,216,156,103, 53, 50,119, 50,155,113,126,126,206,173, 59,183, 25, 14,135, - 6,184,212, 11,120,122,114,138,235, 58,244,135, 67,250,253,144,178, 82, 40, 85, 25, 32,148, 82,245,254,108,142,137,181,113, 59, -155,253,221,238,119,121,121, 12, 88, 51,163,121,214,109,253,220, 64, 10, 20, 13,133, 77, 24, 32,103, 11,113,171,147,157,202, 36, -166, 82, 74, 35,108, 34, 12, 47,191, 84, 21,101,158, 83,230, 9,158,235,128,176,201,114,133,235,247,209,194,226,236,124,194, 91, -111,255,132,223,249,173,127,207,197,120,194,214,246, 46, 7,135, 55, 25, 79,230,156,143,199,148, 72,158, 28,159,178,187,125,131, -157,237, 61,142,142,158,178,179,179,199,193,225, 33, 31,127,246, 25, 23,211, 9,179,249,156, 59,119, 95,226,165,251,119, 41,138, -130,199, 71,143, 77, 55,196,182,176, 45,139,188,204,248,252,232,115, 94,249,202, 43,220,186,125,147, 7, 31, 61,224,252,252,140, -189,189,221,182,203,167, 17,248,189,128,209,248,130,143, 63,249,148, 94, 96,146,136, 44,203, 56, 60, 60,224,141,215, 94, 99,255, -198, 30, 81, 98,218,171, 69, 81, 50, 28,110,213, 64, 49,205,246, 96,139,243,179, 17,174,229,180, 98, 61,131,173, 1,139,229,146, - 79, 62,253,132, 47, 30, 61,230,119,255,253,239,240,211,159,188,195,222,222, 46,243,249,140,251,247,239,177,179,179,195,157, 59, -183,153,205,102,236,238,238, 50,159,205, 57, 61, 61,101, 52, 26, 49,232,135,216,150,228,157,183,127,204,241,147,199,252,224,135, - 63,224,139, 47,190, 64,105,141,235,185,128, 48,251,183, 44, 73,211,148,119,223,125,151,239,125,239,123,252,201,159,252, 9,239, -253,217,187,188,253,214, 91, 20,105, 70,156, 38, 72, 33,120,245,213,175,176, 61, 28,176,187,179, 77, 85, 22,148,170, 34,138, 98, -126,252,214,219,140,198, 19, 92,207,227,198,254, 62,190,231, 50, 30,157,179,183, 51,164, 42, 50,166,147, 41,131,193, 54,121, 89, - 94,202,152, 42,152,207,230, 76,167, 83, 19, 36,164,197, 75,247, 94,226,224,224,144, 36,137, 73,211, 12,223,247, 24, 14,135,236, -221,184, 65,145,230,102,123,235,109,109,197,120,234, 96, 54, 30,143, 73,211,148, 6, 59,149,231, 57,139,197, 2,223,247, 9,194, -128,249,124, 74,146,166,248, 65, 15,219,113,216, 26, 12,217,222,222,198,118, 44,182,182,182, 72,226,132, 94, 47,224,229,151,239, - 51, 26,141, 17, 66,224,121, 62, 39, 39, 39,220,189,125, 7, 93, 84,252,240, 79,255,148, 82, 85,220,127,249, 62, 69,169, 40,202, -130, 48, 12, 81, 2,142,143,143,121,252,248, 49, 69, 94,154,110, 89, 98,198,100, 55,246,118, 73,210,148,188, 72, 1,152, 78,167, - 38,137,149,102,124, 16,134, 33, 97,216, 39, 75, 50, 38,147, 17,223,254,246,183,217, 59, 56, 32,137,150, 36,177,193,202,152,206, -134,219,206,165, 69, 29,148,215,177, 39,171,157,175, 53, 89,112,125,213, 36, 71,172, 43,244,233, 78, 85,173, 47,221, 26, 27, 6, -142, 37, 36, 82,218,181,138,163,233,152,233, 22, 21, 94,219,141, 11, 93, 19, 97,140, 48,137, 82,181, 96,150, 22, 43,223,183, 46, - 91, 46,196,101, 28,186,122, 47, 87,100,166, 91,237,247,162,168, 40,138, 12, 91, 26,244,161, 37, 61, 92,207,208, 75,170,170,160, - 84, 10, 44, 1,149,166,170, 74,148, 46,112,221, 10,187, 40,161, 6, 45, 8,203,105, 23,172, 70,173,200,178, 28, 92,219,162,172, - 52, 74,171, 75,245,156, 90, 24, 64, 8,163, 49, 93,149,149,105,123,202,154, 54,129,162,172, 42, 42,101, 90,165,174,112, 55,183, -174,133,117,185,115,181,108, 3, 96, 51,167, 23,181,218,153,210,138, 47,251, 79,211, 53, 68, 89,159,215, 95, 6,250,110, 5,126, -165, 82,215,235,243,213,171,149,182,104,252,129,197,213,217,104,119, 38,187, 58,226,232,126,159, 6, 97,175,156,184,154,205,218, -237, 90,200,141,227,146,231, 42,230,233,103,200,167,114, 85,150,118, 83,230,116,221,119, 88,141,160, 74,119,118,254, 28,160,201, -186, 14,188, 20, 22, 73,146, 19,197, 41, 26, 73,216, 31,226,184, 62,149,170,209,180,190,199,104, 60, 38,236,247,113,253, 61,164, -109,129,212,216,142, 67,149,169, 21,237,254,231,113, 83, 55,238,135, 23,208,246,127, 38,226,178, 94, 84,228,134,241,184, 80,151, - 64,159, 6, 24, 68,157,224, 89,210, 54,137,154,176,201,203, 18,141,233, 86,156,158,158,242, 59,191,251,251, 60,120,248, 9,203, -101,140, 16, 22, 95,251,218, 27,156,159,159,243,225,251, 31, 96, 57, 54,101, 94,160, 69,193, 43, 47,221,161, 42, 42, 62,120,239, -167,124,243,205,111, 17, 69, 17, 15, 62,124, 15,199,117,145, 90,241,243,111,126,139, 94, 47,228,201,147, 39, 40,165,216,221,221, -229,236,204,204, 86, 95,122,233, 37,170,170,226, 27,223,248, 6,219,219,219,124,246,217,103,204,231,115,124,223,167, 40, 10, 92, -215,101, 54,155,177,183,183, 71, 28,199, 28, 31,155,214,244, 96, 48, 96, 58,157, 18,167, 41,147,201,132, 79,190,120,132, 99, 9, -230,203, 37, 7,135, 55,152,207,150, 28,159,156,209,243, 60, 94,187,255, 10, 31,127,254,152, 69,253,185,199,103, 35,158,156,143, -248,214, 95,248, 38,105,161, 40,180, 32,157,205,121,239,189,159, 1,112,247,238, 93, 44,199,101,184,189,131,101,185, 80, 85, 45, -240,171, 80, 21, 31, 60,124,192,206,206, 14,174,239, 17,103, 41,159,126,241, 57, 31,125,244, 17,121,158,147,101, 25,165, 86, 36, - 89,134,235,106,210,243, 9,121, 89,240,232,241,111,146,166, 41, 85,173, 30, 23,250, 61,242, 60,231,198,238, 30,227,241,152,157, -157, 61,230,203, 5,195,126,200,193,205, 91,196, 89,202,247,191,255,125,246, 15, 14, 65, 10, 14,111,221,164,168, 42, 70, 23, 23, - 8,177, 67,224,249,100,105,193,232,244,152,251,247,239,243,254,251, 31, 83,150, 10, 41, 45,122,189, 30, 89,148,183,199,218,243, - 60,230,147, 57,239,254,228,207,232,245,122, 44, 22,115,188,160, 71, 16,244, 73,211,148,211,211,115,116, 81,178,181,181,133,231, - 59,181, 57, 77,134,210, 37, 58,213,164, 89,108,174, 17, 11,162,120,193, 50,154,215,177,169, 36, 47, 52,243,249,180,197, 76,229, -121,142, 82,138,249,124,110, 58, 1,149,161,134, 38, 81,204,217,217, 25,119,238,220,106,215,131, 40,138,232,247,251, 76, 38, 19, -164,128,163,167, 39, 96, 59,184, 65,200, 96, 48,192,241, 92, 78, 62,249,148,147,243, 51,158, 30,159,114,118, 62,166,170, 52,149, -134,188, 42,177, 61, 35, 76,212,116,161,146, 44,163, 44, 20,232, 2,116, 74,154,154,235,217,245, 34, 14, 15, 14, 56, 58,138, 56, - 58,122,194,214, 98,134,101, 11, 6,131, 62,158,231,177, 88, 44, 58,163,179, 23, 68,170,234, 85,238,207, 70,255,140,181, 84, 96, -221,215,164,233, 84, 90, 72, 19, 19, 5,200,122,116, 93, 41,117, 9, 54,183,140, 26,162, 80,230, 24,212,106, 39,198,148, 7,163, -130,184, 70, 51,231, 63,207,181,189,110,191,103, 89,110,108, 12,133,196,118, 36,170,172, 80,243, 18,161,161, 82, 5,131,193,128, - 30,158, 81,136,170,231,140, 85,165,169,202,138,162,202,169, 16,173,152, 65, 83,221,217,150,107, 84,145, 28, 9,149,194,182, 37, -158,231, 33, 45, 83, 69, 23,101,129, 37, 76,197,135,172, 59,200, 77,130,128, 85,171,239, 8,108, 97,129, 18,151, 66, 47,117, 75, -212, 84,215,102,150, 81, 20,170,157, 67, 54,243,255, 70,250,243,185,139,172,184, 10, 44,219,244,250, 54,152,119, 90,176, 77,165, -248, 60,191,226,103, 33, 35, 53, 2, 45, 21,235, 24,249, 77, 65,188,139, 42,237,218,129,174,100, 29,107,243,253,174,200,139,224, -122, 13,227,245,217,122,215, 21,200, 18,114,163, 75, 80,243, 58,245,156,179, 80, 74,121,125, 96,147,102,222, 44,158,131, 59, 88, -217,127,114,149,135,125,122,114,206,201,201, 89, 43, 52, 19, 69, 17,142, 99, 16,223,113, 28,211,235,133, 76, 38, 99,158, 60,121, - 74, 28,199,220,184,113, 3,191,215,100,247,242, 75, 73,227,110,126, 94,190,216, 90,178,137, 38,168, 59,198, 50, 66,213, 26, 25, -170,109,199,173,143, 71, 76, 7,170, 86,116,180,204, 60,175, 44, 53, 90, 75, 74,165, 41,202,148,217,114,201,217,217, 25,103,103, -103, 12,135,219, 28,222,187, 71, 20, 69,204,102, 51,150,203,165,185, 70,164,192,117, 61,162,249, 5, 18,193, 95,250,246,207,243, -228,201, 19,178,188, 4, 93, 48, 62,191,224,149,151, 95,198,243, 28, 62,253,244, 97, 45, 92,146, 51,157, 94, 96,219,182, 9, 62, -153, 1,133, 13, 6, 3,126,246,179,159,181,163,185, 60,207,217,169,101, 80, 95,125,245, 85,142,142,142, 56, 59, 59, 67, 41, 85, -131,196,204,204,118,107, 48, 96, 30, 45,249,228,211,207,113, 92,139,101, 28,113,118, 97, 20,224,250,193,128, 56, 78,185, 24,255, -148,221,237, 93,102, 23, 19,108,219,102, 26,101,108,239,238,160,132,199,197, 60,161,228,140, 32, 8,184,121,120, 27,219,182,121, -252,248, 11,110,236, 29,112,126, 54,198,117, 13,122,218,113, 93, 38,147,137, 89,151,106, 69,183,233,108,134, 86,138,155, 55,111, -114,126, 54,166, 23,110, 97,187, 70,158, 53,203, 21,210,246, 73,210,148,178, 52,141, 18,199,233,225, 57,194,240,218,203, 18,223, -235,131,112,144,150,215, 22, 54, 85,101,148,228, 46,198, 19, 16,146,162, 22,240, 57, 31, 93,240,228,228, 41,187,187,187, 28,238, -239,113,118,118, 70,145, 44,185,185,191,203,221,187,119,121,251,173,119, 91,229, 62,128, 36,142, 91,165,196,217,108,102, 2,251, -108, 89,175,169, 46,121, 86, 48,157,206,137,162,200,140,152,202,188,149, 72, 46,235,138, 63,207,205,154,238,251,126,139, 25,153, -207,231, 70,226,182,102,129, 56,142, 99,186, 45,121, 14,194,204,190, 45,203, 66,106,136,227,216, 80,185,148,194, 18,146, 56,142, - 25,141, 12, 79,253, 23,191,253,109,148, 82,140, 70, 35,252, 48,224,199,111,189,141,227,216,216,158,203,131,143, 30,178, 92, 46, - 65, 72, 30, 31, 63, 97, 81, 3,247,206,206,206,112, 28,143, 32, 8, 26,202, 21, 89, 89,144, 87,138, 52, 47,219, 17, 73,119,173, -200,178,140,229, 50,198,177, 76, 5,255,135,127,248,135,140,199,103,252,141,191,249, 95,240,230,155,223, 36, 77,103,117,226, 99, - 63,251,154, 91,195,104,117,215,108, 33, 86,197,234,215,145,242,207, 98, 3,181,154, 18,218,170,187,104,142, 89,103,171,206, 90, - 97,131, 42, 10,211,242, 87, 93,235,233,186,154, 23,250,203, 21, 1, 27,183,169, 67,109,173,223,107,159, 60, 53, 11,226, 32, 12, -233,245, 60,202,162,160, 40,178, 58,232, 10,226,200,180, 71, 60, 87,182,109, 91, 19,120, 77, 43,216, 18,102, 78, 89, 99,140,168, - 84, 69, 20, 47, 77,111,223,178, 8,252, 30, 82,130,155, 43,252,158,219, 6,114,173, 27,129,123, 11, 48,138, 87,121, 89,152,205, -147, 2, 91,154, 4,161,218,232,135, 45, 58, 20, 59, 35, 66,208,206,240,181,110,181,172, 27, 64,198,122, 38,180, 98,205,122,141, -223,182,238, 86,190, 93,240, 90, 3,108,106, 65, 73,122, 99,101,170,175,225, 53,179,209, 47,251, 25, 74,114,172, 83,158, 86,136, - 25,173, 64,104,115,130,138, 90,139,125,133, 22,133, 49,248,232,218,177,182,222,234, 29, 63,249, 43, 6, 18, 93, 62,127,231,249, -238,235, 95,180,243,241,172,142,128, 98,115, 34,162,215, 41,120,221,138,190, 30,185, 60,125,122,202, 98, 97, 42, 7,203,114, 8, -130, 62,150,180,177, 45, 7,223,235,225,216, 46,142,227, 17, 69, 9,139,197,130, 48, 28,224,121, 30,121, 81, 62, 83,184,231,197, - 41,105,214, 51,159,191, 52, 52,218,204, 48,104, 93,177, 58, 45,184, 70, 64, 67,212,231,180,235,186,216,150,139,208, 37,185, 42, -169, 42, 69, 85, 22, 45,202,183, 31, 14,249,232,131, 15,249,191,255,237,111,112,242,116, 4,194, 98,111,111,159, 27,123, 7, 60, -122,244,200,128,168,162,136, 94,207, 44,172,113,188, 36, 94, 76,201,147,152,175,191,241, 6, 95,124,250,129,209, 91,143, 18, 74, -165,249,218,235,175, 35,109,151, 79, 63,121,136, 31, 4, 44, 22, 51,132, 16,236,237,237, 83,213,186,211,113,150,114,231,206, 29, -222,123,239,207,144, 82, 50,153, 76, 8,195,144, 94,175, 71, 16, 4,108,111,111,243,222,123,239,113,126,126,142,214,154,126,191, -143,214,154,139,139, 11, 51,171,223,222,102, 62,159,211, 59,232, 17,231, 37,121,169,144,153,161, 45, 5,129,198,237, 5, 36, 81, -194,100,177,100,178,140,217,191,113,200,157,123,175,113,251,238, 29,118,110,236,241,117,199,227, 98, 50,226,248,241, 19,178, 60, -173,145,214, 41,127,241,219, 95, 97, 58,157,146,149, 73,173,166,104,108, 82,117, 85, 81, 84, 37,147,233,212,252,134, 36,197,178, - 93,118,118,118, 91, 65, 34, 63,232,225,251, 61, 22, 81, 68, 94,148, 12, 6, 67, 46,166, 19, 60,207, 35, 75, 82,226, 36, 55, 85, -155, 45, 25, 79,230, 20,101,197,254,225, 45,146, 44,227,228,228,132,163,227,199, 20, 69,193,206,206, 14,203, 40, 34,202, 50, 22, -113,196, 87, 94,127,141,162, 40, 56, 61, 31, 51,232,185,204, 22, 75,116, 85,160, 42,205,214, 96,136,239, 7, 88,210,166,210,198, -152, 67,218, 22, 61, 63,108,165,102,109,223, 38, 12, 7, 68,209,130, 60, 75,176, 60, 73,208, 11, 17, 90, 98, 41, 97, 89, 0, 0, - 32, 0, 73, 68, 65, 84,225,123, 33,150,128,188, 30,153, 58,142,131, 68, 19,248, 30,195,225,160,165, 47,150, 2,188,122,157, 20, -194, 54,220,112, 75,212,213,114, 69,145,102, 88,190,143,108,176, 84, 21,100, 89, 65, 89,229, 53,224, 45,225,235, 95,255, 58,105, - 86,240,209, 71, 31,113,235,214, 45,126,248,163, 31,145,165, 41,174,231,241, 26, 2,219,113,185,152, 76,153, 45, 34,166,211, 41, - 10,131, 89,201, 10, 83, 0, 22,149,137, 9, 84,138,211,179,115, 51, 78,200,226, 90,216, 76, 18,184, 30,142,231,163,133,108,199, - 5,231,227, 17, 55,110,236, 18, 39, 49,199, 39,167,168,138, 58, 49, 41, 9,130,128, 34, 45,128,106, 69,125,242, 89, 65, 82, 53, -168,247,214,217,238, 42, 30,106,157, 10,119,165, 82,111,198,167, 24,155, 91, 45,141, 41,154,194, 24, 59,181,193, 95, 25,124, 89, - 99,232,164, 91, 40,183,172, 71,182,246, 70,195,179, 23,167,215, 94, 10, 17,117, 95,103, 95, 92, 76, 73,146,136, 65, 24,114,247, -238,109,118,119,140,204,163,208,170,206,252, 74, 44,105,117,190, 68,212,237, 34,137,101, 57, 20, 85, 69, 28,167,196,113,218, 86, - 75, 85,169, 12,215,212,243, 72,189,148, 60,207,234, 11,121,200,238,238,110, 93, 41, 53,136, 95,141, 99,187,216, 64,161, 42,211, -150,208,166, 19, 16,103, 41,174,227, 64,163,236, 87, 87,240,198, 68,165, 54, 12,113,108, 44,203,180,224,181,165,215,172, 1,197, - 51, 43,229, 46, 58, 93,174,207, 79, 54,157, 24, 82,172,209, 9, 58,192,168, 63, 39, 71, 89, 95, 67, 65,123, 94,176,233, 10,150, -108,234, 46,173, 91,155, 42, 46, 81,154, 43, 17,165,163, 31,176,174, 39, 32, 58,248,238,107,117, 3, 94,208,229,238,186,223,164, -132,254,210, 65,245,242, 34, 51,252,234,195,195, 67, 28,199, 97,185,136, 56, 60,184,201, 98,177, 96, 54, 91,176,183,183,131,227, -120,132,129, 9, 40,147,233,133,225, 50,215,248,194, 70,165,170, 97,125, 60,111,159, 63, 43,139,255, 50,219,126,237, 88, 67,233, - 85, 21,170,134,114,167, 4, 69, 85,144, 21,133,169,202,108, 23, 71, 74, 51,110, 87,154, 71,199,167, 28,159,156,147,229, 37,150, -237,226,186, 30,170,130,233,116,206,120, 60, 49, 73, 46,146, 44, 43,112,109, 9,170,194, 17,138,187, 47,223,101, 54, 58,198,183, - 52,163,201, 5, 66,195,157,219,119,176,116, 69,180,156, 50,232, 7,204, 23, 17, 65, 24,178,189,189,141,170, 96, 60, 26,179,191, -191, 79, 89,150,124,240,193, 7, 8, 33, 72,146,132,193,192,240,203, 15, 15, 15,241, 60,143,159,252,228, 39,140,199, 99,124,223, -199,243, 60,163, 16, 87,163,192,171,202,168,154,237,236,236, 80,148,138, 56,142,240,124,215, 40,187, 69,115,150,203, 37,158,219, -195,117, 93,198,163, 25,131,193, 14,113, 86, 48,154,204,232,245,135, 60, 61, 57, 35, 45, 83,210,104,201,112,184,197,226,201,130, -162, 40, 56, 56, 60,160, 44,170,182, 90,109, 12, 78, 28,199,169,193,101, 69,141,120,247,136,210, 4, 53,155,114, 99,103,143,158, - 31, 80,150, 37,179, 69,196, 50, 78, 73, 50, 35, 98,147,166,185, 73,134,155, 0, 87,150,134,139,238,122,100, 89,134,235,120, 40, - 5,167,167,231,204, 46, 38,248, 61, 35,239, 26, 14,182, 72,243, 2, 41,108,250,253, 1, 89,154, 99,219,118,219, 61, 56, 56, 56, -224,254,157,155, 60,250,236,115,131,124, 47, 74, 6, 91, 33,243,165, 1,234, 89, 66, 50,232, 7,244, 2,143,217,116,193,124, 49, -101, 60, 30,227,120,166, 75, 82, 20, 5, 72, 73,150,166,148,150, 64,248, 94, 59,147,111,190, 39, 8, 2,118,119,119,219,209,137, -227, 56,173,230, 60, 64,158,231,196,231,231, 4,225,192, 8, 18,149,101, 59,143,207,178,140, 44,203,204, 44,222, 49,235,199, 43, -175,188, 98,198, 16,245,104,224, 63,252,135,255, 80, 75,226, 22,104, 41,120,255,195, 7, 45,234, 59,205, 51,150,113, 66,208,239, -183,199,161, 40,138,149, 34, 43, 25,229, 20,105, 6,104,202, 42,199,119,141,214,124,105,149,237,235, 77,161, 86, 48, 26,141,144, - 66,183,231, 78, 90,227, 8,146, 36,185,226, 26, 7, 47, 46,158,197, 11, 82,123,175,163,251,130, 25, 53,179,198, 91,111, 92, 76, - 27,223, 5,179, 94,201, 75,150,208,218,250,248, 76, 57,238,103,120,147,172,128,120,187, 65,221,178, 12,200, 34, 78, 83,178, 44, -107,245,135,203,220, 28,212,173,173, 65,171,198, 36,101,221,230, 43, 10,211,118,114, 28,226, 52, 99, 60,153, 48,155,205, 59,237, - 9,171,214, 57, 14, 89, 44,162,246, 96, 26,231, 25, 11,207,119,219,153,186,231, 88,248,190,143,116,108,202,202, 44, 98,158,235, -130,163, 41,179,212, 0,239,180,170,101, 92, 13,168,168,172, 49,218, 13,185, 43, 78, 51,132,176,112, 28, 27,144,100, 69, 86,183, -121,220, 21,235,206, 77,162, 30,114,157,247,174, 55, 4,144,181, 54,114,213, 34,219,171,186,117,252,124, 3,151,231,181,113,175, -158, 65,114,133, 52,117,189, 8,137,188,148,131,237,250,109,119,103,233, 66, 92,138, 25,202,171,173,168, 85,145, 81,177,113,100, -124, 93, 18,241,188,238,243, 38, 57, 88,253,140, 74, 87,175, 33,196,117, 11,131,239,176, 15, 26, 31, 50,173,145,150, 69, 81, 86, - 8,105, 81, 42, 77,146,229, 60,126,114, 76, 28,165,104, 1,182,227,145, 21, 19,130, 32,192,113,189, 58,145,180,112, 92,167,214, - 38, 86,172,155,177,234,103,102,202, 98, 61, 89,126,118,226,214,177, 64, 93,217,161,141, 38,132,110,182, 97, 21,152,211,116,130, -100,173, 75,158, 21, 57, 69, 94,213,213,167, 38, 77, 83,162, 52,227,227, 79,191,224,183,127,231,119, 57, 57, 57, 35,232,245,185, -121,243, 22, 81,173, 43, 94, 22, 19,180,144,140, 39, 83,118,183,183, 40,242,148, 71,143, 30,241,218, 87,238,241,173, 55,126,145, - 50,141, 16,122, 31,173, 53,113,146,178,189,179,207,249,116,202, 39,159, 63,198,114,123,148,121,140,210, 37, 7, 55,110, 48, 91, - 44, 8,195,144,253,253, 61,142,142,142, 76,251,181,166, 78, 53,139,211,253,251,247, 73,211,148,183,222,122,139,178, 44,217,217, -217,105, 3, 65,150,101,120,158,199,238,238, 46,179,217,172,109,207, 91,142, 81,185,179,164,198,150,176,183,213, 55, 64, 45,219, -229,189,119, 63, 52,235,142,101, 49,153, 45,137,227, 24,203,241, 40, 19, 35, 50, 20,250, 62,123,123,123, 4,126,207,116, 95,242, -148,207, 62,251, 2, 33, 52, 73,150, 50, 28, 14,107,233, 86,163,240, 38,132,133,101,187,164, 89, 1,181,143,252,120, 50,161, 23, -134, 8, 91,112,126,126, 74, 20, 69,166, 98, 22,130,101,156,225,216,158, 25, 79, 58,134, 65,161,129,188, 85,138,129,167, 39, 39, -244, 7, 1,123, 7,251, 68,209, 2, 45, 4,174,235,114,231,206, 29, 78, 78,207, 81, 85, 69,127, 48, 48,238,120,182, 69,149, 39, - 20,121,197,217,217,136, 48, 12, 73,163,148,158,237,114,239,238, 29, 30,126,252, 17,101, 94,145, 87, 21, 89,150,152, 4,196,117, -217,222, 30, 50,157,206,233,247, 3, 20,154,209,232,156,126,191,143, 16,130, 56, 78, 40,243, 12,203, 50, 51,121,160,214,243,247, -216,222,222,230,221,119,223,165,170, 42,250,253, 62,253,126,223,208, 28,107,253,254,233,232, 28,132, 69,154,166,109,203,187,168, - 19, 71,128, 48, 52,162, 54,139,197,130,201,116,142,148,146,199, 71, 95,144,101, 25,210, 54, 35, 19,219,117,217,222,189, 65,148, -100,204, 22,115, 35, 35,156,230, 40, 36,190, 31,112,126, 62, 38, 43,114,170,210,124,166,193, 91,213,226, 79, 82, 98, 89,146, 44, -173, 16, 20, 44,163,152,188, 80, 45, 24,204,169, 42, 2,223, 24,246,160,171, 14, 0,205, 4,203, 56,142,113, 45,251,153,235, 99, -179,190, 8,161,175, 25,171, 90,215, 82,153,185,230,202,239, 74,205, 90,210,110, 21, 87,165,148, 88,118,189,246, 42, 69,169,160, -212, 53,166,189, 17,138,209,242, 82,232,109, 3,133,249,138,236,244, 26,229,249,234, 10, 36, 87, 64,118, 0,182,214,154,254, 32, - 96,107,107,139, 94, 63, 96, 25, 69,148, 69,134, 99,217,248,190, 1,187, 20,101,134, 20, 54,142,119,153,101,107, 1,174, 31,224, -250, 61, 28,199,136, 75, 52, 0,185,162, 40, 12, 8, 0,139, 36, 49,179, 26,219, 54,226,251,227,241,132,162, 14,186,174,231,160, - 43,211, 94, 84, 24,127,221, 48, 12,185,121,243, 38,123, 59, 91,244,122, 33, 85,153, 34,180,213,162,204, 13, 25,202, 54,173, 29, - 48,173,196,104,129,192, 98,107,123,128,148,154, 36, 49,159, 63, 28, 58, 27,197, 82,158, 5, 20,235, 50,172,148, 0,202,106,101, -142,210,206,151,107, 95,231,134,111,253,101,131,249,151,159,157,108, 80, 71,234,202,236,174,253, 38,125,229,189,155,249,146,122, -205, 54,244,121,149,246,149, 78,130,124, 49,245,181, 23,249,221, 47,106,132,115,249,185,178,157,217,237,237,237, 35,165,228, 98, - 60,101,116,110,102,191,243,217,178,125, 76, 43, 81,119,153,170,118, 81, 72,146,196,224, 62,214,142,223,159,119,251, 94, 4,155, -177,122, 12, 47, 49, 34,173, 30,180, 90, 93, 70,138,162,172, 89,180, 22,150,107, 27,103,176, 56,229,248,248,132, 39,199, 79,249, -233, 7, 15, 57, 29, 79,217, 63,188, 69, 24,246,169, 10, 69,154,228, 45,239, 25,105,177,181, 99,218,151, 71,143, 62,103,103,216, -227, 91,223,252, 58,127,249, 47,254, 60,182,172,160, 74, 16, 74,145, 85,154, 94,184,197, 60, 74,248,163, 63,253, 17,111,255,244, - 93,166,211, 57, 55, 14,110,225,184, 22, 82, 10,250,253, 62, 15, 62,250,132,163,163, 35,118,118,118, 90, 11,206,139,139, 11, 6, -131, 1,203,229,146,143, 63,254,152,162, 40, 8,130,160, 85,244,115, 93,151,157,157,157,182,202,107, 1, 82, 73,130,143,203,108, - 58, 33,240,109, 6,129, 79,153, 45,153,142, 83,110,236,221,228, 96,127, 7,239,165, 45,148,114,216, 63,188,205,124,185,224,248, -248,152,249, 98,202,225,254, 46,175,190,250, 50, 84, 37, 73, 20,163,148,226,226, 98, 74,191,223,103, 48, 24,240,224,163, 15,219, -224,100, 2,126,222,218,241, 42,165,240, 60,143, 36, 77, 41,242,156, 32,236, 49, 28, 14, 9,251, 1,174,111,102,240,210,182, 9, -189,126, 27, 60, 12, 80,109, 65,154,228,148, 85, 78, 63, 28, 34,109,129,227,184,196, 81,138, 37, 33, 12, 7,244,122, 30, 79, 79, -207,216,219,221, 39,201,115, 28,219, 99, 54, 91,176,187,187, 75,191,223, 39,154,229,220,191,127,159, 44,158, 51, 25,157, 51,155, - 76,184,123,251, 14, 47,191,114,151,167, 39, 79,140, 52,170,235,210,223, 26, 16, 39, 17, 89, 30,115,251,246,109, 28,199,110, 25, - 19,158,103, 51, 24, 12, 24,143, 70,220,185,247, 18,243,185, 41,168, 26,211,149,233,116,202,214,214, 22,183,111,223,230,230,205, -155,173, 9,203,238,238,110, 43,154,179, 92, 46,153,204,166, 80,131, 48,165, 52,179,243,166, 66, 6,163,243,127,227,198, 13, 28, -199, 33,203, 50,198,227, 49,159,125,246, 25,189,158, 73,162,118,246,246,168, 52,124,246,197,163, 22, 72,153,213,202,111,150,101, -241,201, 39,159,144, 21,121,219,189,109,206,125,215,117,205,168,160,215,195,182, 77,114,101,216, 86,185,209,132,119, 93, 44,203, - 56, 11, 70, 81,140,239, 59, 70, 95,160,150,155, 53, 58,248, 60, 83,205,242,234, 99, 87,245, 79,186,174,107,215,117, 72, 47,181, -246,185,210,138,215, 90, 48, 30, 79, 40,149, 66,162,144,142,196,117,109, 44,187, 6, 64, 87, 26,219,118, 77, 50, 41, 29, 44,171, - 97,211, 88,151,237,248, 14,218,125,157,114,188, 9, 13,127, 37,168,235,171, 60,125,235,239,252,202, 95,252,103, 73, 26,115,243, -240, 16,215,181,205, 60,221, 22,196,113,132,194, 80,195,148, 42,177, 28,155,162,200,201,178,148,188,200,169,170,146,254,112, 64, -146,230, 88,182,141,239, 7,248,126, 15, 75, 26,103, 31, 93,195,246,109,199,197,243, 77,133,148, 21, 70, 98, 81, 11, 97,168, 69, -101, 69, 89, 21, 8, 41,153, 92,204,209, 64,154,230,166, 10, 89, 70, 20, 89, 66, 28, 47, 89, 44,230, 36, 89,194,116, 54, 37,203, - 11,146,172,160,215, 31, 24,133,163,247,222,227,228,233, 9,113,156, 34,133,100,177, 88,242,248,241, 17, 69, 97, 20,143,148,210, -228,121,129,214, 16,134,125, 60,207,167, 40, 74,242, 60,107, 51, 57, 41, 45, 51,167,172, 20,210,178, 65, 74, 52, 2,105,153,121, -136,223, 11,136,226,132, 71, 71, 71, 44,151, 17,190,223,163,170, 20,167,167, 39, 4, 97,128,227,152,147,176,170, 20, 69, 81,178, -181,181, 77, 85, 41, 99, 15,168,193,182,157,214,144,161,235, 30,102, 48, 3, 13, 87,178, 70, 70,118, 60,250, 86,104, 80, 82, 55, - 83, 27,163,103, 47,205,246, 53, 51, 50,203,178, 59,252, 71, 97, 40,101,150,213, 86,124,155,171,100,209, 34,240,187,237,224,102, - 91,155,139,179,155,153,118, 21,228,106,155, 63,131,143, 80,186,165,107, 52, 55,209, 42, 79,203,154,247, 45, 90, 60, 68, 99,251, - 99,217,151, 84, 57, 67, 1, 20,181,131,175,110,103,254,101,105,122, 51, 90,105,202,162,196,177, 29,164,101,142,245,217,211,115, -108,203, 33, 77, 76, 59,116, 62, 93, 80, 22, 21,190,215, 67, 32, 89, 46,150, 88,150, 36,207, 50, 4,154, 48, 8, 24, 14,134, 84, -165,145,156, 20,104, 83, 49, 72,171,133,189, 54, 28, 87,173,180,161, 36,182,255,117,221,240, 86, 31, 19,215,101,247,141,101, 98, -179,143,187,251,185, 14,235, 18,137, 82,218, 92, 11,212,115, 56,109,180,173,203, 74,225,121,230,124,139,162, 20, 75,186,104, 4, - 63,250,225,143,249, 87,255,215,191,102,153, 20,236, 31,220,196,247,122, 92,140, 46, 24,143, 70, 84,149, 66, 11,147, 16,244,130, -144,243,243,115,102,243, 25, 7, 55,246,216, 26,246,160,204,249,202,203, 47, 97,169,156, 42, 95,162, 85,110, 36, 73,147,136,188, -172,248,240,193,135,156,157,143,121,237,245,175,242,248,201, 19, 92,215,103, 48,220,226,163, 79, 63,229,233,241, 73, 91,193,105, -173,153, 78,167,220,187,119,143,249,220, 80,198,128,150, 90,101,219,246, 10, 48,169,105,131, 43,101,146,119,199,181,240, 60,151, - 50,143,145,186,226,151,126,225,155, 36,209,140, 95,250,249,159, 99,103,123,139,167, 79, 79,240,252, 0,180, 36, 43, 11,102,147, - 25,182,132, 34,207, 24,132, 61,110, 29, 30,112,113,113, 65,146, 36,166,154,174,197, 75,148, 82,100,185,161, 78,165,169, 81,123, -171,180,194,170, 5,136,164,101,209, 11, 2, 16,144, 36, 17,179,249,148,189, 27,123,216,142, 69,191, 31, 82, 20, 57, 66, 11, 84, - 85, 81,228, 57,121,150, 81,212,173,251,172,204,241, 3,191,246,193, 22, 28, 29, 29,113,235,230, 77,118,119,182,235,196, 38, 66, - 72,193,116, 50, 35, 28, 12, 40,139,138, 52, 75, 13,133, 44,232,177,152, 92,224, 57, 22,161,239,241,209,195, 7, 4, 61, 31,199, -177,233,247, 67, 70,163, 17,182, 35,185,152, 92, 48, 62, 31,145,103, 41,105,150,162, 84, 69,127, 16, 50,157,142, 1, 69,145,103, - 68,203, 25, 66,152,115,180,177,103, 61, 61, 61,109, 43,244,241,120, 76, 20, 69,173,248, 76, 3,180,244, 60,143,139,139, 11, 0, -122, 65, 15, 33,140, 5,113, 19,204,155,100,215,200,183,246, 72, 83, 35, 47,124,124,122,194,227, 39, 71, 32, 36, 65,216,167, 23, -132, 40,165,121,250,244,204,204,192, 29, 23, 81,175,163,163,209, 24,207,243,152, 78,167,216,150, 69,180, 92,214,198, 59,198,251, -189,233, 6, 24,218,162, 1,201, 89, 53,141,180,223, 31, 24,206,186,227,224,251, 30, 90, 25,252, 72, 85,148,228,121,194,207,253, -220,207,113,112,112, 3, 93, 86,148, 69,142,109,137,214,211, 67,116, 40,100,173, 88, 84, 87,182, 22, 81,183, 22,205,189,144, 86, - 75, 17,190,170,196, 81, 51,219, 59,207, 53, 70, 59, 74,105,226, 56, 97,185, 92,114,124,114,206,120, 50,225,233,201, 19,110,221, - 57, 68,163, 40, 85, 65, 81, 22, 84, 74,145,102, 57, 73, 82, 32, 45,155, 94, 16, 32, 45, 11,141, 50,107, 79,221,213,166,166, 26, -139, 6,179, 38, 37, 53,207,183,126,220,220, 26,170,176,121, 77,253,152,236,198,136,154,166,156, 23,217,138,200,140, 37,180, 81, -100,242,106,154, 90, 35,130,225,216, 44, 22, 11, 42, 93,210, 11,204,204, 46,142, 99,242, 66,227,120,126, 91,193,163,101,157,105, - 89,173, 75, 16, 24,176,156, 86,162,149,231,212, 90,131,101,218, 71,149, 22,164, 69,137,116,123, 88,150, 77,158, 41, 70,241,152, - 11, 93, 34,200, 65, 27, 4,125, 89,105,242, 66,113, 62,158, 49,216,217, 67, 74,155,197,116, 14, 90, 25, 4,125, 29,140,178,204, -204,235,122,126, 72, 28, 25,234, 76, 28,199,132,161,161, 92,152, 42, 33,170, 71, 10,246,138,142,176, 82,138,162, 52, 52,145,187, -119,239,182, 62,212,143, 30, 61,226,139, 47,190,224,246,237,219,117,219, 43,198,182,109, 70,231, 23, 45,152,164, 9,128,141,127, -117, 16, 4,228,121,222, 62,222, 4,175, 38, 96, 54,175,189, 78,141,111, 69,131,127, 45,211, 84, 74,161,171, 12,203,118, 13, 5, - 79,173, 90,184,170,154, 9, 96,219,238, 70, 74, 88, 55, 19, 93,119, 18,107,146,143,102, 91,215,129, 27,221, 4,160,113,142,218, -212, 77,216,148, 44,172, 35,226,149,170, 54,226, 29, 44, 41, 77,187,179,222, 71,205, 44,174,105,223,229,181, 58, 92, 85, 85,245, -111, 52,251,180,217, 11,141, 84,102, 3, 30,242,125, 89,183, 23,171,150,107,175, 81,164,169,209, 12,111, 62,191,107,115,249, 60, - 16,203,139,204,225, 54,101,248,221,199,139, 44, 55, 99, 28, 33,176, 45, 23, 41, 4, 85,101,248,243,158,239,226, 1,147,217,162, - 5,125,253,217,187,239,241,193,131,135, 60, 61, 62,229,165,123,175, 82, 89,110,109, 24, 82,116,156,169, 42,132,237, 16, 14,134, -140, 47,166,244,130, 62, 65, 24, 34, 41, 72, 19, 3,182,210,170,160, 42, 10,138,100, 78, 16,244,112,106, 29,131, 34, 43,176, 45, -193,225,225,126,139,129,201,203,130,147, 79, 62,225,108, 60,102, 56, 28,214, 85,177,169,206,111,223,190,205,124, 62,103, 54,155, -161,148,170,175,119,216,217,217,225,224,224,128, 44,203,152, 76, 38,237,104,207,247,253, 22, 68,155,231, 57,201, 50,162, 72, 19, -182,182,251,120,150,224,213,187,183,217, 10,125,150,113,142, 46, 82, 38,163,115, 44,119, 64, 20,155, 10, 89,149,154, 44, 93,178, -183,125, 15,215, 22,220,127,233, 14,139, 40,226,195, 15, 31, 50,159, 79, 25, 14,183,145,242,146, 9,211, 80,176,116, 76, 13,166, -180, 90,159,243, 40, 90, 98,219,146,229,114,206,147, 39,143,217,223,223,175, 53,210,157,182,133,173, 20, 68,113,142, 84,181, 39, -189, 37,107,234,215,172, 69,157, 39, 89,202,158,189, 77, 16,152,217,252,114,185, 52,114,173,105, 86,207,127, 13, 15,219,177, 37, -195,225,208,176, 1,242, 1,247,238,220, 53, 21,120,221,237, 26,110, 15,121,242,228, 24, 33, 52,158, 95,219,154, 86, 70, 30,118, - 60, 62, 39,203, 18, 92,215, 38, 47,140, 92,111, 81, 24, 32,219, 98, 81,181, 66, 50, 39, 39, 39, 43,242,170,121,158,115,118,118, - 70, 24,134,148,165,113,197, 59, 63, 63, 55, 24, 8,215, 33,138,205,120,196,152,165,168,154, 31, 30,182,231,146,235,186,156,158, -158, 50,158, 78, 24, 14,135,220,190,109,100,120, 71,163, 17,139,104, 73,208, 31,154,113,109, 61,147,111, 60,227,163,249,130,229, -114, 73, 22, 39, 88,174, 67,145,230, 20,202,116, 17, 14,111,222, 52,199, 32,141,121,245,229, 87,140,130,156, 48,221,155,217,108, - 70,150,101, 12,251, 3,138, 44, 67, 2,142,231,145, 37,102,189,189,121,243, 38, 66,105,242, 34,187, 34, 81,190, 42,168,245,229, -186,110,215, 90, 91,215,146,210,205, 58,215,104,234, 59,142, 67, 56,216,162,208,146,188, 40,200,179,144,151, 94,190, 15,118, 93, - 21, 40, 13,194, 37,155, 71, 36,177,137, 51,150,180,169, 84,217,142, 20, 87, 92, 31,255,188,236, 27,196,149,248, 97,187,174, 75, -146, 36,237, 69,208, 44,164, 6, 65, 94, 25, 52,117,221,182,202,178,140,101, 28,181, 11,116,145, 22, 88,182, 15,170, 66,171, 10, - 42, 51,183, 82,165,153,161,148,121,106,220,144,180,139, 16,118,125, 16,244,202,188,195,243,124,148,150,196, 73,129, 82, 9,158, -103, 16,241,186,210, 84, 89, 74,191,239, 96,236, 34, 77,182, 67,169, 88,198, 17,185,146,108, 13,119,112, 93,223,100,172, 90, 51, -155, 47, 76, 64,176,205,236,127,182, 88,178,140, 19,242,162,162, 40,149, 57,129,107, 64, 73,131, 10, 85,101,217, 82, 65, 60,207, -171, 61,182,141,149, 98,169,105, 47,212,233,108,129,180, 28, 92,199, 71, 43, 51, 27,105,218,122, 73, 93,245, 55, 65,240, 70,165, -113, 60,139,170,110,111, 55,226, 18,102, 86, 84, 7, 49, 11,148, 86, 45, 5,109,211,130,175,181, 54,156,211, 53,105,200, 38,152, -182, 46,105, 43,237, 36, 83,173,219,205,251,139,188,149, 17,221,196,249,182, 44, 11,107, 45,200, 55,179, 30, 89, 47, 14,141,216, - 76,183, 98,239, 6,230, 75,169,213,205,237,171,245,160,222,189, 87, 74, 92,121,190, 65,233, 91, 53,250,219,182,109, 84,165,234, - 0,110, 83,106, 69,158,151, 88,194,166, 42, 20,158, 99,163, 69, 73, 85,148,181, 86,141, 32,175,181,224, 61,207, 67, 10,129,227, - 88, 72, 76, 16, 93,204,150,248, 61, 23,207,115, 9,123, 1,186,182, 35, 45,203,146,170,243,123, 54, 5,226,231,206,204,159, 9, -236, 91, 3,219, 72,115,157,149,229,165, 56,141, 17, 17,201,234, 4,198,107, 19, 51, 41, 45, 30, 61, 62,225,143,191,247,167,188, -255,224, 67,182,183,119,217,217,223,103,158,148,204,230, 11,178,120,129, 35, 68, 11,254, 75,243,130,188,200, 40, 84, 69, 63,232, - 1,138,120,182,160, 88,206,168,138, 16, 73,137, 42, 83, 44,169,209,170, 36,138,150,104,219,163,196,198,247, 61,182,183,109, 78, - 78, 78,112, 93,151,143, 62,253,156, 60, 43,241,107,144,150, 82,138,173, 45,163, 2,151,231, 57,167,167,167,104,173, 91,202,146, -231,121,248,190,209,132,111,218,240, 89,150,181,199, 57, 73,204,188, 56, 94,206, 17, 55,118, 88, 76, 70,244, 68, 73,186,156,113, -120, 99, 7, 89,101, 20,209, 12, 75,106,194,192,101, 17,199, 12, 6, 59,248, 69,201,108, 58,166,231,187, 8, 42,170, 44, 37, 23, -146,192,247, 40,243,148,170,200, 9, 2,159,139,139, 11,178, 36,101,103,107,155,162, 50,109,221,162, 50,215,121,145, 87, 84,165, -225, 8, 75, 41,205,245, 76, 73, 81,100,140, 70,103,120,174,203, 96, 48,104,169, 92,158,231,146,249, 46, 74, 65,146,165,228,245, -249,104,198,129, 26,207, 55, 21,233, 32,232,181,186,233, 23, 23, 83, 28,215, 71, 84, 21,158,215,195,118, 29,170,162, 68, 21, 5, -126,191, 71,169, 74,182,135, 91,148,121,202, 98, 49, 39, 43, 13,110,192,114, 29,150, 73,204,108, 54,227,240,240,176, 22, 35,211, - 88,182,224,248,241, 49, 55,111, 30, 50,155, 78, 0, 69,130,193, 54, 77,115,227,161,126,255,254,125,130,126, 72, 86,152, 78,132, - 31,244, 80,104,126,246,193,251, 44, 22, 11,118,118,118, 8, 34,115,124,194, 65, 31,199, 51,193, 90, 90, 78,187, 30, 54, 73,202, -214,214, 22,194, 54,231,245,209,209,113,221,190, 31,178,181,181, 67, 85,105,230,243,185,225,145, 59, 6, 4, 57, 30,143,201,147, -148,120,177,100,107,107, 11,223,113, 73,226,152, 97,216, 39, 70, 48,190,184, 64, 43,197,206,238, 46, 85, 16,144, 38, 6,241,222, -163,199, 98, 58, 99, 25,205,177,164, 67,175,215,163, 31,132, 56,150, 4, 85,226,186, 1, 69,150,161,202,138, 52,142,233,245, 92, -246,118,182, 40,243,130,170, 54,130,233,182,199, 87, 3,123,213, 25,113, 93, 31, 20, 27,153,109,125, 29,251,200, 54,213,176, 42, - 75,179,158,107,101,132,201,108, 11,207,182,136,147,148,180,200,168,138,148, 82,149,216,212, 24, 25, 13, 72, 27,175,215,163,170, -109,128, 43,173, 12,155,171,150, 23,215, 27, 48, 76, 47,108,120,213,172, 39, 93,249,233,250, 87,216,118, 61, 3, 95, 44, 34, 60, -207, 35, 94, 46,141,157,159, 99,124,126,231,243, 57, 85, 85,112,235,214, 29, 92,215, 69, 10,155,170,212, 4, 65,143,160,239, 82, - 22,144,230,166,117,227,251,126,125,209,102, 36, 73,214,182, 88,186, 11,188,236,204,118,149, 82, 32, 44,138, 74, 17,197, 9, 69, -169,209,218,162,231,249, 88,194, 70, 58, 46, 85, 85,226,216,230, 2,211, 2,164,229,155,106, 27,135, 74,131,101, 57, 88,162, 65, -108, 26,123, 64, 79,120, 92,140, 39,252, 44,255, 25, 89,150,213,149, 65,211, 86,118,113, 28,187, 69, 45, 38,145,105,141, 53, 32, - 50,207,243,112,123, 62,179,217,140,227,227, 99,194,208,112,116,155,153, 84,195,175,223,221,221,165, 84, 21,142,235,226,135, 65, -235, 55,156,101, 25, 97, 24, 98,219,146, 36, 73,216,222,222,110,171,148, 70,248, 97,197,221, 76,203,141, 28,200, 75,243,149,234, -153,168,253,110,231,195,112,244,197, 74,229,237,121, 94, 11,168, 80,226, 42,250, 90, 10,217,106, 11, 55, 84,194,117,255,119, 33, -165,249,187,214, 28,214,242,242,249,174, 83, 82, 55,128,119,183,105, 83,213,187,142,254,222,148,145,170, 26,165,219,112,160,155, - 57,236,104, 52,226,248,248,152, 40, 74,176,164,219,162,119, 77,149, 77,187, 95,178, 44, 99, 56, 28,182, 44,142, 6, 68,244,232, -209, 35,108, 71,178,183,183,203,214,214, 0,219,145, 53,238,227, 42,232,230, 89,134, 68,102,222, 37,174,237,180,172, 31,215, 43, -207,215, 76,146, 6, 31,160,106, 59, 88,207,235,213,126,207,198, 19,123,124, 49,225,211, 79, 63,231,103,239,127,200,249,197,132, -221,189, 3,122,189,144, 52,171,152, 47,150, 44, 22, 11,202, 52, 37,240,108, 60,203,104, 77,100,113,202, 50,205, 25,236,236,146, - 21, 57,255, 63,105,111,214,100, 73,146,158,231, 61, 30,238,177,158, 61,151,202, 90,123,155,238,153, 70, 3,131, 1, 33, 10, 50, -241, 70,162, 73,148,204,100, 18, 37,153,126,129,140,127, 65, 50,253, 34,221,232, 66,183, 52,136, 4, 5,136, 0, 41, 18,196, 50, - 0,103,159,233,174, 45,107,201,229,172,177,251,166, 11,143, 19,149,213,211, 51, 0,196, 54, 75,171,202,234,204,170, 60, 39, 34, -220,253,251,190,247,125,222,195, 97, 71, 87,238, 72,124, 63,192, 7, 29, 96, 80, 2,218,170,196, 24,207,217,217, 57,215,155,154, - 23, 47, 94,144, 22, 43, 32, 16,193, 14,135, 3,179,233, 34,136,199,170,138,213,106, 53,230,170,191,122,245,106,204,216, 62,118, - 69,130,109,174,166,239,123,158, 60,121, 66, 20, 69, 99,160,139, 49,102,156, 1,123, 17, 14, 2,166,201, 72, 98,197,249,217, 9, - 31,127,240,144,195, 97,199,171, 87,111,152, 77, 82, 22,167, 15,248,211,191,252, 49, 31,124,252,109,154, 78,211, 54, 37,211,188, -224,234,245,171,112, 48, 65,113,126,239, 30,203,229, 12,165, 36, 79, 30, 61,164,110, 42,170,170,226, 91,223,250, 22,253, 64, 55, - 59, 98, 76, 55,235,224,111,142,227,152,229,234, 20,103, 91,156,215, 67,186,218,150,135,247, 67, 37,250,248,201, 67,170,178, 97, -187,221,114,118,114,138, 16,146,205,110, 75,213,212,100, 69, 49, 30,184,250,166,197,244,154,211,211, 83, 22,139, 69,208,248,212, - 53, 73,154,211,246,161, 11,186,221,110,153, 76,115,206, 79, 31,131,235,249,224,131, 15,248,238, 23,223,225, 39, 63,250, 1,223, -253,157,239,241,195, 31,253,136, 63,248,163, 63,226,179,207, 62, 67,201,132,255,241,127,248,159, 2,160,167,174,121,246,236, 25, -147,201,132,207, 63,255,156,207, 62,251,148,178, 44, 57, 28,118,172,215,235, 1, 10,243,136,221,238, 16, 54,196,233,148,124, 32, -120,138,225,128,247,248,241,227,193,142,120, 74,219,182, 92, 94, 94,142,207,148, 82,138,147,211, 51,180,214, 99, 7, 37, 4,192, - 88,182,219, 77,176, 6,118, 33,132,102, 50, 9, 20,192,171,171,171,241,235, 23,139, 5,235,221,150, 60,207, 57, 91,157, 80, 87, - 21,214, 24, 36,130, 84,197,124,250,197, 39, 20, 69,193,159,253,217,159,113,123,123, 75, 93, 85, 65,248,169, 13, 15, 31, 62,228, -228,116,201,225, 16,126,246, 72,168,177, 35,215,117, 29, 77,211,112,113,126, 78,145,166,212,117,232, 34, 60,122,244, 8, 21, 73, - 26, 87, 35,132, 31,139,168, 95,229, 74,185, 91,177,127,227,250, 34,248,149, 9,146, 95, 63, 40,188, 83,177,223, 1, 65, 9, 71, - 54, 41,136,122, 73,175, 29, 42, 81,160,220,128,142, 13, 18,245,190,111,209,218,226, 93,112,139, 9, 17, 17,160,144,118, 40, 82, -178,255, 32,135,205, 55, 21, 11,170,170, 26,170,178,102,189,217,134, 77,253, 80, 81,213, 7,178, 36, 29, 56,195, 29,198,246, 52, -117, 55,180,207,195, 55,239,171, 26, 95, 86,163, 58,212,123,143, 77, 12, 74,197, 56,171,177, 54, 64, 38,230,217,156, 8,135,213, - 38,188, 25,238,184, 1, 24,172, 85,136, 72, 97,140, 71, 16,147,230, 51,242, 98,134, 84, 25,145,239,130, 56, 72,122,150,203, 2, - 17, 89, 14,101,137, 49,154,249,124,138, 37,197,152, 64, 37,139,165,196, 24, 7, 4, 21,188, 82,161,165, 94, 30, 42, 38,211,226, - 29,176, 99,184, 56,113,156, 12,167,234,154, 52, 14, 54,148,222,104,186,102,112, 0, 12, 45,234, 44,207, 7, 44,166, 66, 37, 9, -102,128,155,164,186,103, 90,132, 83,177,148, 18,139, 39,203,236,232,143,191,189,189, 29, 9, 77,219,237, 22,107,237, 48, 83, 43, - 16,145, 31, 34, 48, 67, 91,220, 26,127,103,238, 45,222, 75, 3, 59, 38, 11,221,221, 20,222,181,187, 61, 81, 36,137,199,188,251, - 35, 19,156, 81, 84, 8, 96,142, 74,221, 95,161,238,116, 54, 80,158,176, 14,100, 68, 22, 39,225,148,238, 2,138, 52,242, 96,140, -127,207, 74,113,132,207, 88,252,112,163, 30, 3,145,220,123,239,245,215, 53, 4, 95,127, 88,142,237,172, 95, 7,127, 74,148,162, -169, 42,174,174,174,184,185,185, 25,173, 49,198, 24,138, 52,204, 4,173,233,233,155,158,162, 40, 72,164, 10, 66, 77, 99, 81, 34, - 34, 85, 49,157,117, 99, 71, 6,103, 48,125,143,115,161,114,218,174,111, 88, 44, 22,156,156,156, 12,217,213,239, 90,239,214,217, -111,224, 28,248,247,170,239,187,193,167,127,147, 13,230,238, 3,120,252,189, 20, 2, 41, 99,172,241,244,166, 39, 18, 97, 97,107, -250,150,178, 12,254,240, 31,252,224, 71,252,223,127,248,199,108,118,123, 30,127,240, 33,145, 82, 92, 94,190,230,118,187,195, 15, -135,145,201, 52,199,107,205,110,183, 27, 34, 70, 21,121,158, 34, 34,197,238,176, 97,183, 59, 48, 73, 34, 38,105,200,176,182, 86, -147,224,233,218,154,211,211, 83,182,101, 19,168,111, 81,206, 23, 95,124,129,143,114,254,247,255,227,255,100, 91,182, 44, 78,206, - 17, 72,174,111,111, 89,204, 87,156,156,156,176, 94,175,121,245,234,213, 40,138, 59,198,100, 30, 5,113,251,253,158, 60,207, 71, -232,205,108, 54,123,111,180,161,148, 2,103,184,124,249,154, 52, 10,162,190,200,131,237, 59,164,128,103, 95,125,201,179, 87,111, -249,221,135,159,176,221,111, 41,155,154, 73, 49, 67, 13, 34,164,237,110,141,179, 61, 89, 81, 48,155, 77,152, 78,114,222,188,121, - 19,232,152, 2,182,187, 13, 8, 79,145,229,100, 89,134,115, 65,163,160, 7,203, 91, 28,183,228, 69, 74,145,199,244,157,198, 59, - 88,204,151, 76,138, 25, 77, 85,145,223,207,121,244,173, 39,252,193, 31,252, 1, 85,219,144,166,121, 88,171,125, 68, 87,119, 52, -162, 39, 73,226,128,139, 45, 43,250,190, 15, 41,106,198,132,118, 63, 10,109, 52, 23,103, 23,148,101, 73, 28, 73, 30, 63,122,196, -211,159,255,136,166, 46,121,245,242, 57,207,159, 63,231,207,255,234,175,185,190, 89,227, 28,252,224,135, 63, 39, 66,240,242,242, - 45,143,159, 60,100,185, 92,210,182, 61, 79,159,254,123,230,243, 57,175, 94,189,226,108,181,162,235,195,204,251,234,234,134,166, -181, 84,117,203,235, 55, 87,129,103,160,212,184,246,172, 86, 43,242, 60,231,203, 47,191,196, 90,203,189,123,247,198, 67,120, 89, - 5,109,195,139,151,207,136,162,136, 60,155, 48,157, 78,135,206,145, 25,215,153,211,211,211, 32, 54,221,108,104,219,150,162,152, -112,186, 88, 6,199, 68, 93, 19,121,144, 74, 16, 9, 31, 32, 99, 42, 69, 14, 17,182, 85,185,103, 82,100,124,254,157,207, 88,175, - 79,249,139,191,252, 75,250,190,231,239,255, 39,191, 23, 70,155, 73,204,247,191,255,125,164, 20,220, 27,222,167,171, 55,175,249, -224,131, 15,120,242,232,113, 40, 72,188,199,244, 53,171,197,156,239,253,246,111,225,141, 38, 85, 49,206, 9,156,209,200,175,185, -114,188,248, 27,108,169,145,124, 95, 87,196, 47,115, 61,238,254, 94, 27, 59,220,183,114,204, 47, 25,255,126, 33,135,130, 92, 18, -121,129,247, 6,111, 90,156, 51, 97,164,119,116, 22, 69, 17, 66,196,225,215, 59,157,133,227,129,228,232, 88,250, 70,225,189,248, - 6,180,233,157,175,113,223,160,149, 82,206, 17,128, 29, 50, 6, 17,145, 15,182,135, 36, 14,237,144,249,124,137,181,150, 36,201, -168,170,134,182, 13,138,206,245,110,203,219,183, 33,218,242,168, 40,237,251, 27,242,124,194,124,190, 0,231,217,237,118, 44, 22, -139,241, 5,132, 22, 63, 99,187,220, 14,129, 43,117,221,178, 43, 43, 34,149, 35,189, 66,119, 61,145,239, 73,149,229,179,207, 30, -240,248,209, 61,170,250,148,171,235, 27,174,111,246,200,100,130, 80, 19,186,206,130, 11,161, 47,199, 89, 25,132,106, 39,207,139, -144,190,228, 61, 73, 18, 13,220, 99,195,237,237,237,216, 2, 44,203,146,223,250,226, 55,131,175,249,176, 15, 15,251,209,243, 57, -116, 30,142,115,166,170, 44, 67,164, 98, 49, 25,105, 79,209,160,220,172,187,144,174,180, 88, 44,104, 7,252,229,177,229,213,117, - 13, 66, 8,206,207,207,195,200,194,116,227,120, 35, 4,206,168,247, 90,218, 81,244,110,195,179,214,142, 85,228,113,150,252,238, -226,135, 19, 93,101,170,224,209, 63,126,143,119, 95, 3, 36,188,207, 74,255, 58,225,237,216,118, 62,230,139,119,105, 58,158, 74, -143,127,118,247, 6,252,250, 40,160,174, 91,162, 88,141,222,224,247, 21,170,238,189,239,189,251,239,223,221,212,127,157,119, 91, - 91, 51,126,205,177,173,123,156,113,201, 40,198, 24,203,225, 80,141,149,186, 82,106,108, 17, 11, 33, 6,238,117, 80,156,182, 93, - 77,154, 77, 56, 57, 89, 14, 29,142,240, 51,215,117, 29,230,128,131,135,247,111,227,145,191,251,225,248,219,121,246,191,233,123, -227,232,157,197,167,235,186,241,253, 89,239,118,188,121,125,197,255,245,207,255, 25, 8,201,161,106, 72,243, 34,204,207, 27,141, -243,130,249,124,193,190,235,240, 17,232,174,163,171,246, 88,163, 81, 50, 38, 78, 82,156,146,220,110, 55, 52, 93, 75,154,166, 76, -103, 9, 73,212,162,173,165,215, 45, 42,178,239,238,229, 56,227,236,236,140,109,169,121,241,226, 37,113, 54,103, 54, 91,208, 25, - 73, 83,119,228,211, 41, 23, 23, 23, 40,153,176,223, 7, 54,249,113, 70,126,228,112, 39, 73, 32, 73,214,117, 77,215,117,204,102, -179,241,117,165,105, 58,222, 19, 71,123,108,223,244,120,235, 56,185,119,130, 82,239,168,121,143, 30, 61,162,152,100,227,125,112, -108,241,206, 23, 43,188,128,125,117, 8,164,181,195,150,186,109, 56, 57, 59,195,123,203,118,115, 75,221, 4, 81, 86, 83, 30,120, -246,236, 25,143, 30, 62,166,169,106,136,222,233, 48,162, 40, 98,191,223,163,117,199,233,233,108,232,102, 69, 44,102, 75,234,178, -196, 89,168,202,134,217, 84,115,113,241,128,175,190,250, 42, 36,157, 77,166, 20, 89, 17, 98, 64,141,163, 40, 98,144, 22, 17,121, -186,174,161,109,179, 16,174,227, 61, 73, 28, 44,102,207,159,126, 57, 90,180,186,174, 27, 43,232,235,235,235,240, 30,104,207,195, -199, 31, 6,193,150,243, 67, 56,143,160,169,123,166, 19, 63, 50, 21,234,186,101,185,188,143,181,142,199,143, 62,224, 23,191,248, - 69, 40, 30,180,163,152,204,198,231, 38,142, 99,218,182, 29,199,137,214, 90,150,203,229,168,102,223,239,247, 99, 17, 54,157, 78, -195,247, 23, 5,179,105, 80,206, 95, 94, 94, 6,166,250,192,151, 63, 30,214,154,129, 31,127,140, 58,110,154,134,174,107, 67,215, -212,135,117,213,116, 61,231,103,103, 36, 89,134,233, 53,251,237,142,191,247,189,223,225,237,219,183,252,232, 7, 63, 68, 70, 17, -191,243,189,239,241,191,253, 47,255, 43,127,242, 39,127,194,191,252, 87,127,130,213, 61,187, 93,197, 7,143, 63, 28,249,245,255, -224, 31,252, 3,126,235,139,223,228,159,255,179,223,167,111, 90, 14,135, 3, 23,231,103,124,242,201, 39, 1,198,148, 70,224, 4, - 86, 27, 84, 18,191, 95, 44,252, 45, 93, 70,119, 29, 68,223,212, 49,188, 59, 90,252, 38, 45,209, 81,132,103,140, 65,166,138, 52, - 74, 17, 74, 32,124, 16,183,133, 68,172, 24,106, 61,230,156, 28,133,178,145, 16, 68, 50, 28, 10,254, 38,196,201,221,110,231, 55, -254,191,232, 27,102,234,203,147, 51,150, 39,103,161, 82, 67,145,165, 9,105,146, 35,199,106, 47,196,174,118,189,161,172,154,176, - 16,169,160, 10,204,178,130,190,173, 73, 99, 25, 58,251, 67,154, 84, 20, 9,156, 55,212,213,129,174,107,240, 62, 25,189,124,194, -134, 90,199, 17, 60,198,245,207,122,177, 0, 0, 32, 0, 73, 68, 65, 84,125,223,115,125,187,225,197,243,151,148,135,142,105, 94, -160,164, 64,137,158,249, 68,241,197, 23, 31,128,112,164,105,204,114,181,224,118, 29,110, 74,225, 98,188,143, 80, 50,198, 17, 65, - 20,161,146,100,152, 87, 11,140,119,161,146, 84,146,124, 50, 9, 10,232,190, 31, 69,109,200,104, 28, 21,212,117, 75, 85, 5, 2, - 85,164,222, 5, 58, 52, 77, 55, 92,192, 14,103, 33,137, 51,178,172, 8, 57,243,189, 29, 32, 60,193,207,121,180, 56, 28,231,207, - 71,224, 67,158,135,197,108,177, 88, 4, 94,113,185, 27,173, 62,198, 24,210,100,242, 53,101,185, 31, 55, 72, 99,130, 40, 81,202, -224,229,207,243,156, 44, 75,199,156,251,208, 6,203,223,101,158,224, 97,176,108, 69, 34, 70, 69,146, 78,247, 67, 10,209, 32,210, -243,239,207,128,143, 74,215,227, 9, 94, 15, 42, 98,127,199,234,114,220,104,142,136,207,227,161, 36, 78, 18,162, 72,161, 68,132, -197,227,141,197,105, 51,222,244,119, 5, 38,191,106, 83,247,119, 89, 2,119,103, 70,131, 58, 84, 69, 49,206, 6, 54,182, 28,170, -112, 41, 20, 73, 26,198, 58,206,180,193,215,109,131,231, 91, 69,130, 88, 70,216, 40,204,208, 77,223, 33, 69, 58, 32, 12,131,202, - 54, 31,132,157,189,238, 72,147,130, 8, 65,117, 40,223,203, 88,255, 85, 62,245,187,221,146, 35,191,249,215,181,197,190, 73, 72, -119,247,128,212,234,126,140, 52, 62,254,219,109,219,242,250,213,219, 33, 12,227,146, 15, 63,250,132,111,127,251,219,172,183, 59, -126,254,243,159, 83, 55, 29, 74,197,244,206, 83, 44,102, 65,244,121,216,130,209, 76,210,148, 36,137,233,108, 79, 89, 55,236,107, - 77,156,165,100,105,140, 16,154,186,174,232,181, 10,157, 50, 12,233,128,211,197, 73, 48,237, 56,131, 60, 12, 84,176, 52,159,210, -245,193,174,148,165, 69, 0,173,236,118, 96, 29,139,233,140,166,239,198,247,237,232,131, 62, 66,102,142,215,251, 40, 26,189, 43, -194, 76,211, 20,167, 13, 89, 86, 16,201, 24,103, 13,118,176, 0,205,166,115,138,124, 74,158, 77,240, 94,144, 79, 38, 97,246, 43, - 34,122, 27, 82, 28,243, 44,199,154, 46,220,251, 62, 36, 97, 21, 69,198,108, 82,140,162, 88,219,119, 72, 21,254,125,149,132,142, -226,124, 26, 32, 57,251,178,194, 90,205,118,179,103,190, 40, 80, 81, 76,215,105,234, 67, 73, 28,167,244,173,230,237,235, 43,138, - 44,184, 91,154,174,167, 44,195, 44,184,215, 26,139,160,107, 53,122,240,225,247,125,143,138, 34,156,140, 70, 11,152, 24, 68,153, -121,158, 51,153, 76,216,239,183, 68,128,233, 53,215,175, 95, 81,214, 13,231, 23, 15, 73,210, 9, 89,150,113,123,125,195,106,182, - 98,179,217,144, 23,115,186,222, 81, 76,230,156,172, 52,155,237, 26,221,106,182,235, 53,231,231,231,172, 22, 43, 22,211, 57, 77, -111,136,243,112,223,116,198,210,236, 15,108,183,219,240,236,164,107,242, 60,199,137, 40,228,189, 15, 89, 2, 73, 30,116, 14,187, -242,192,253,123,103,163,184,175,109, 91,218,182,101, 58,157,178, 60, 61, 65, 74,201,143,127,252, 83,138,162, 96, 58,157,141,173, -241,205,102,131,197, 51, 31, 4,117,231,167,103,212,135,146,181, 94, 83,150, 37,222, 58, 82, 21,115,239,244,140, 52,150, 20, 69, -198,114, 57,167,211, 45, 82, 10,178, 60, 97,189,185, 33,203,146, 32, 90, 21, 67, 74,161,213,100,105,204, 71, 31, 62, 97, 49,228, -219, 71, 30,218,186,226,236,228, 51,230,147, 41,120, 27,226, 80,135,249,255,215,139, 28,193,175,207,179,240,191,102,131,127, 47, - 2,250,142,168,247,238, 33,252,248, 28,135,176, 34,207,225,112, 96, 42,103,129,243,238, 45,218,116, 72, 25, 52, 77,214, 52,104, -231,177, 94,142,147,111, 59,132, 54,169,227,200,210,138, 95,201, 57,249,219, 20, 10,239,195,108,134, 77,125,181, 90,144, 36, 9, -155,219, 91, 14,135, 3, 46, 47, 72,211, 20, 99,252, 56, 31, 14, 47,192,226,125, 80, 2,238,203, 26,163, 29,103,103,231, 68,132, -214,178, 82,138,197, 92,146,101, 57, 66, 73, 14,251, 26,132,164, 44,107,138, 2,164, 28,148,210, 3,231, 87, 12,156,209,120, 56, -249, 25, 19, 90,193, 22,143,213, 45,157,107,137, 35, 73,172, 4,125, 91, 17,225, 89,205,166, 76,167, 11,246,149,197, 29, 19,201, -100,168, 18,133,140,152, 45,230,227, 76,201, 12, 94,248, 8, 79,215,148, 56, 19,170,147,104,168,250,110,111, 55, 92,190,126, 75, -211, 66, 86,228, 68,113, 65, 85, 29,104, 77,136, 8, 76,146, 48,115, 74, 84, 76, 89,150, 76, 38, 83, 38,147,132,114,127, 24, 79, -196,245,161,164,110,219, 81, 17, 31, 84,175,130, 73,150,211,165, 13, 17, 14,211,155, 97,243, 49,120,107,177,189, 5, 11,105,146, -146,197, 25,214,127, 93,144,229, 71, 21,177,214,154,220, 79,112,214, 99,141, 24,188,255, 10,239, 45,109,219, 81, 85, 21,135, 67, -224, 66, 31, 15, 18,199,128,134, 56, 78,137,211,100,212, 57, 28, 15, 29, 71, 11,201,187, 15,139, 16, 65,115,224, 17, 65, 72, 56, -252, 29, 30,104,134, 10, 44,138, 2, 36, 36,136, 42, 53, 69,150,163, 34,129, 17, 26,239, 98,180, 49,195,233, 93,223,105, 47, 25, -188,117, 88,247, 14,104, 33,162, 0, 8,178,214,226,172, 39, 27,103,254,119,110,234,227,230, 63,136,222,180,179,228,121, 78, 28, -199,104, 19, 66, 77,212, 64, 60,244,214, 6,240, 3, 6,143, 70, 68,150, 56, 17,195,217,198,141, 93, 36, 99, 76,200,136,215, 61, -251,237,134,174,107, 0, 71,158, 22, 67, 40,209,208, 17, 73, 18,144,209,232,155,149, 50,230,235,145,178,209, 32,132, 17,126, 56, -204,188,195, 63, 0, 98,136, 15,190,235,141, 13,227,139,209, 25,112,231,245, 46,166,161,154, 53,195, 66, 81, 85, 21,151,175,222, -240,179,159,253,140, 23, 47, 95,241,209,167,159,177,219, 31,168, 94,188,164,170, 26,174,111,130,234,124,117,122,194,205, 58,204, - 93,117,219, 34,136, 40,138,130,108,232, 0,117,173,166,105, 59,172,143,152,231, 19,164,242,236, 55,107,244,110,195,227,179,130, - 56,146, 56,215, 99,172,193,121,203, 36, 83, 24, 33,233, 59,194,156,152,148,217,108,198,245,182,228,183,191,247, 31, 17,167, 5, - 63,249,217, 79,105,187,158,124, 82,176,223,110, 48,102, 0, 85, 57, 59, 94,223,195,225, 16, 2, 79,206,206, 16, 66,140, 41, 97, -119,239, 79,173, 53, 74,132,205,175,200,167,232,190,199, 73, 75,150,199, 20,179,130,166,111,217, 29,246,236,203, 3,109, 91,211, -183, 45,243,217, 4,171, 53,109,211,115,182,154, 99,251,253,152, 17,238,157,161,169,154, 81, 39,115,100,189,231,121, 30,196,187, - 17,196, 50,232, 66,240, 22, 80,225, 32, 72, 68,111, 12,155,221,158,197,116,137,235, 52,105, 94,176,189, 93,115,255,254,253,225, -208, 91, 51,155, 76, 72,211,132,195,225, 64,213,182,164,113, 24,239,117,213,129,229, 98, 1, 62,136,213,202, 67,141, 54, 29,214, -123,228,160, 28, 87, 73,204,243,231,207,135, 17,225, 57,113,154, 82,214, 21,251,178,194, 17, 54,219,251,179, 21,222, 58, 62,253, -244, 83,158, 62,125,202,163, 7, 15,194,129, 63, 78,208,166, 35,142,227, 48, 59, 95,223,114,122,182,226,234,234,138,223,252,141, - 47,120,254,242, 5,187,170,197,137,128,189,213, 78,211,247,161,235,182, 88, 44, 70, 23,206,241, 61, 63, 86,217, 71,141,207,195, -135,143,153, 79, 10,110,110,175,184,190,186, 37,138, 34, 46, 46, 46,120,252,248, 49,135,186,226,135, 63,252,241,168,128, 63,210, -220,142,238,134, 99,241,146,103, 25, 74, 68,236,118, 7,218,166, 97, 90,204,200,178,140, 43,163,185,124,243, 26,245,195,132,166, - 9,227,137,182, 13,149,125,158, 14, 14, 8, 33,104,170,106,220, 99,246,251, 61, 66,120,234,186,228,246,246,154,249,124,138,233, - 91, 38,211,130,123,247,206, 80, 42, 34, 18, 2, 99,122,172,183,100,113, 22,128,102,199, 44,138,247, 54,197,232,151, 90,214,238, -107, 85,249, 55,100, 40,253, 18,187,228, 40, 32, 63,102,138,220,205, 97,176,142, 17,180, 22, 39,138, 40, 77, 81,132,131,228,192, -163, 69,136,160, 43, 83, 34, 9, 63,147, 14,235,146, 53, 22, 99, 44, 74,197,191,118, 83,255,117,155,253, 81,216,254, 75, 51,117, -162,134,219,205, 13,109,215, 19,103, 10, 34, 31,130, 29, 28, 68, 42,199, 17, 83,183,125,168,173, 69, 76,213,180,120,225, 40,138, - 28, 21, 73,210, 56,198, 25, 11, 50, 70,169, 20,109, 67, 11, 66, 68, 41, 94,196, 88, 47,241, 66, 82,119, 45, 90,183, 44,102, 19, -164, 12,177,172, 42,138, 49, 78, 51,201, 83,156,149, 92,223,236,112,210, 82, 87,215, 36,194,162,162,140,190, 61,160, 17,204,166, - 19, 76,215,161,107,143,179,146, 78, 24,122, 99,232,212,187,202, 80, 38, 9, 85,215,131, 51, 76,138, 4,175, 53, 39,243, 25, 77, - 93, 82,247, 21,139,162,192, 56, 75,221,244, 20,121,202,249,197, 5, 86, 78, 48,106,134,182, 53,201, 68, 17, 43,129,214, 13,198, - 52, 36, 74, 81,235, 48, 15,236,155, 62,112,134,165,162,215,154,206,180, 88, 31,112,181,109,223,163,162,128,147, 76,149, 2,239, - 89, 78, 39, 72,239, 72,134,197,108,123,125,203,198,123, 58, 19,102,239,146, 16,144, 19,252,138, 97,131, 53,182, 15,176, 17,107, -201,147,156, 73, 54, 67, 14,209,178,166,245,236,251,154,106, 31, 54, 35,235, 66,130,158,181, 22,109,195,130,102,180, 27, 85,211, -135,178, 68, 42,197,249,189,228, 61, 78,240,241,198,116,206, 14,155,173, 25,236, 82, 2, 11, 88, 28,189,213,180, 58,180, 77,247, -155, 45, 15, 31, 62, 36, 77, 20,135,106,143,240,144, 38,138,190,173,105,170, 61, 73,146,208, 91,195,161,108, 56,148, 45,121, 54, -197, 71, 18,219,119,220,191,184,135, 21, 45,245,174, 38, 75,146, 64, 45,236, 29,109,103,152, 78,151,180, 77,143, 78, 44,179,249, - 4, 37,131,206, 33,203, 82,170,170,226,228,116,201,238,176, 69,202, 8,149,196,108, 54, 27, 54,219, 29, 73, 54,229,252,222, 3, -188, 77,216,237, 14,220, 59,157,226, 76, 67,170, 10,166, 83,133,163,193, 58, 75, 49, 73, 72,211, 83,186,214,114, 56,212,100,113, -130, 51,130, 34,205,104,202, 29,203,121, 30, 58, 61, 81,176,213, 89, 99,113,177,199, 9, 21, 50,149,237,128,161, 37,136,217,172, -214,204, 23, 51,174, 95, 95, 49,159, 77,169,247, 53,197,116,130, 55, 46, 60,191,145, 12,177,191, 62,168, 92,189,136,130, 58, 90, -197, 33,194,216,123, 36, 65,104, 24, 71,129,126,232,156,165,107,187,144, 90,101, 29,251,106,207,254, 80, 81, 55, 29, 47,223,222, -176,188,184,143,144, 49,149,222,178,126,251, 18,124,196,124,185, 64, 74,201,250,230,134,182,109, 17,113,130, 53,134, 76, 41,132, -128,221,161, 12,190,109, 39,233,189,224,244,222,125, 14, 85,141, 51, 29,174, 15,126,255, 89, 49, 11, 11,112,234, 17,244,204,166, - 9,214,246,104,231,176, 38, 98, 49,159,225,226, 25,235,127,251,231,124,244,201,183,169,187,150,235,203,215,212,237,144,102,102, - 12,113,158,178,223,237,238, 0,235, 5,197,116,194,190, 60, 48, 91,204,233,186,142,179,179, 51, 14,219, 29,169,138,137, 35, 73, - 89, 55,180, 85,205,197,217, 57,105,146,208,119, 29,182,107, 73,166, 49,121, 1, 77,127, 32,157, 36,196,153,226,237,245, 85, 56, -112,122,205,249,201,148, 34,142, 81, 22,164, 11,193,214, 82, 74,154,102,207, 52,157, 16, 19,145, 39, 41,105, 28,163,181, 31, 68, -125,193,198,149,166, 41, 94,247,100,211, 9,182,107, 48, 93, 63,162,130,137, 34, 28,129, 97, 64, 84,177, 90, 45, 1, 65, 54,203, -121,115,253,134,179,147, 37,145,132, 52, 19, 60, 58,185, 64,169, 71, 60,127,250,140,235,155,183, 88,111,137,100,140,105,155,113, - 86,111, 17, 8,149,209, 25, 15,210, 49,155,228,108, 54,155,192,189,199, 2, 14, 25, 43,138, 73, 65,253,213, 87,196,113,204, 52, -205,136, 5,204,230, 51,238,157,157,112,216,109,232,218,154, 44, 77,152,207,114,242, 98,197, 87,125,192,199, 46, 78,103, 52, 77, -137,243, 49,175,175, 46, 1,143,214, 29, 73,150,162,178, 4, 93, 54, 44,166,147, 49, 7,227,108,181, 36,206,114,126,252,227, 31, -143,122,145,186,105, 40,138, 34, 84,189,192,229,229,229, 0, 66,177,204,231, 75,238,223,191,207,110,119,224,203,103, 79, 17, 68, -204,231, 51,230,179,197,168,213, 32, 2, 41,163,209, 26, 60,201,114,230,211, 5, 86, 63,231,176,175, 88, 45, 29,189,117, 44, 78, - 78,185,185,185,225,197,191,254,127,249,232,163, 15,134, 46,129,164, 40,166,220,220,172,199,110,153,146, 9,145,143,232,154,160, - 83,194,121,226, 88,210,235, 32, 96,236,117,195,102,183,230,252,254, 57,113, 30,211, 86,245, 16,253, 11,214,121,124, 20,248, 23, -199,206,222, 93,132,171, 19,239,132,174,239, 1,100,222,235,186,249,209, 49,228,143,160, 71,222,185, 81,188, 51,163, 95, 93, 27, - 59, 90, 49, 39,147, 9,237,225,192,116, 58,101,125,125,195,231,191,245, 9,125, 89,163, 98,137,179, 6, 65,140,144, 10,135,134, - 72, 98,109,132,240, 2, 41, 83,132,215,224, 28, 42, 18,127, 35,172,235, 87,217,106,223,109,246,238,151, 6,241, 42, 72,224,163, -161, 93, 54,112,166,251, 30,111, 5, 81,228,135,211,184, 39, 73, 98, 36,146, 36, 77,241, 12,158,110,111,104, 26, 19,230,101, 72, -154, 94,211,107,141,143, 2,124,102,185, 58, 99, 49,100,243,134, 55,208, 12,214, 22,135,179, 58, 96, 47, 85,134,213, 33, 37,174, -119, 14, 99, 59,178, 60, 38, 85, 10,227,130,215,248,226,228, 20, 41, 44,109,103, 41,119, 37,189,204,232, 19, 75, 49,159,208,183, - 26,173,221, 56,203, 61,206, 64,170,178,161,220,173,201,148,160, 24, 22,205,245,122, 77,158, 79,130, 55,221,244,180,141,161,182, - 53,178, 5,103, 27,148,114,164, 49,232,166,196,154,158, 88, 74,102,197,148,166,233,130,210, 90, 74, 22,171, 21, 69,158,114,168, -246,220,220,110, 2,139,185,183,136,152, 16, 95, 27,201,160,192, 30, 82,228,142, 49,102,193,186, 40,192,134,108, 93, 23, 57,124, - 36, 48,163, 13,203, 99,135,138, 39,232, 13,134,138, 93,247,227, 92, 60,138, 34,156,245, 68,210, 15,208, 28,216,239, 3, 88, 35, -140, 6, 50,156, 11,173, 56,235,194,194,245,246,205,213,187, 22,122, 20,174,245,209,174,104,140, 33, 18,126,200, 77,143,113,130, -224, 68, 24,244, 6, 97,198, 28,230,230,184,156, 52,201,137, 60, 68, 56, 84, 44,233, 92,131,146, 71,204,100,196,100, 50, 67, 68, - 89,208, 20,236,118,195, 90,239, 56, 93,205,105,170,146, 34, 73,169,235, 80,221,108, 54, 21,198, 88, 38, 89, 74, 83, 86,196,177, - 9,169, 82, 66, 32,133, 8,169, 81, 34, 26, 18,156,162,161,242,154, 16,169,148,182,237, 57,236,247, 92,189,125,197,106,242, 49, - 82, 40,154,190,228,205,171, 45,147,217,148,229,233, 25,130,152,186, 42,217,108, 14, 40, 17,147,198, 9,177, 18,116, 77, 77,146, - 70,228,217,224,202, 48, 49,160,232,180,198, 24, 75, 79,143,245,142,110, 24, 35,104, 27,252,202,179,217,140,230, 80, 99,141,161, - 46, 43,210, 56, 14,237,252, 40,194, 25,131,214, 54,164,228, 73,137, 84,113, 16,207, 12,174,129, 40, 82,224, 45,137, 10, 35, 17, - 49,128,151,240, 80,100,129,159,189,223,239,249,235,191,250, 1, 63,253,249, 47, 72, 39, 83, 44,176,217, 7,134,253,102,183,195, - 24, 23,158,209,161,131,208, 53, 45, 85,211, 16,167,249,200,133,104,219,102,216,104, 35,138,197,156,197,100,202,182, 10,243,109, -156,197, 27, 67,124, 84,244,251, 8, 99, 58,148,132,174,111, 81,170,160,239, 91,156,207,248,221,223,253, 93,166,167,143,248,253, -127,241,199, 56, 7,187,221,126,172,178,123, 19,136, 97,213,190, 2,239,113,199, 17,141,146,180,186, 31,199, 19, 33,186,217,142, - 58,129, 99, 27, 51, 58, 2,134,132, 8,243,244,213, 10,219,239, 48, 70,147, 79,195, 92,178,237, 58,154,190, 99, 58,157, 6, 56, -139,146,196, 34,232,124,102,147, 57,177, 82,232,110,143, 23, 4,176,138, 19, 68, 34,164, 67,230,217,132, 56, 43,131,159, 92, 68, -163, 22, 69,107, 77,215,133, 81,129, 28, 32, 43, 34,138, 72,138,156,237,222,112, 40, 75,172, 53,228, 73, 10,222, 34,124, 56,100, - 37, 66,114,255,193, 5,143,238, 95,144,165, 49,109,181,103,125,125,137,140, 66,156,105, 58, 77, 73, 85, 66,154,132,170, 49,216, - 40, 51,178, 73, 65, 57,144,238, 24, 72, 98,135,170,164, 72, 2, 84, 37,205,130,184,176,239, 26,206, 78, 87,193,129,180, 15,188, -253, 34, 79,169, 14,251,247,198, 61, 77,211, 32, 85, 72,193,139,100, 88,236, 79,239,157,114,189,217, 80, 29, 74,148, 82,172, 22, - 75, 86,167, 39,193, 50, 88,135, 46,107,171,205,120,237,142,177,216, 97,198, 46,120,121,121,137,179,154, 39,143, 30,112,113,113, -129, 53, 33, 32,105,187,221, 82, 87,129,145,239,189, 31,121, 15, 77, 27,180, 39,171,147,160,116,119,206,145, 63,254,128, 52, 13, -246, 69,162, 40,216,182, 6, 81,173,197,147, 22, 57, 50, 73,145, 93,135, 27, 4,146, 85, 21, 24, 33,194,135,123, 49,203, 50, 86, -171, 21,187, 93,244,158,215,125, 50,153, 4,219,163,120,215,189, 52,222, 33,134, 42,216,203, 99, 4,182,124,207, 30,230,253,144, - 41,225, 25,226,138,223,159,131,191,199, 1, 81,114, 24, 93, 14,248,214, 1,227, 26, 9,137,136, 6, 65,231,221,207,101, 12, 67, -245,253,238,249,142,144,199,182,255, 16,211,230, 92, 24, 17,252, 82,179,220,255,221,146, 66,254, 38, 37,188,255, 6,155,155,122, -254,236,117, 56,129,217,208,178,208,125,104,237, 30,231,195, 1, 68, 96,145, 50, 26,148,219,130,162,200,136,147, 16, 16,225,188, -197,235,240, 0,116,125,152,145,229,147,144,169,155, 21,129, 72,116,179,190, 5,239,152, 76,114, 34, 21,218,152,105, 50, 69,170, - 8, 25, 39,196,106, 70,162, 78,241, 68,164, 83,135,117, 53,101,181,229,246,205, 75, 68,156, 34,164,194,218,142,205,205, 26,163, - 67, 75, 81,196, 18,221,247,196, 34, 56,133,133, 23, 68,206, 14,169,111, 33, 71,189,237, 45, 95, 62,189,228,116,185,100,183,221, -210,246, 29,247,238,197,200, 56,197, 35,137,227,148,159,252,252,103,172,183,123, 34, 44, 15, 30,158,243,228,241, 5,121,150,160, -123,143,213,134,237, 97,207,172, 24, 4, 44, 72,146, 44, 84,197,125,215,209, 54, 13,145, 16, 84,101, 9, 89, 74, 94,132, 49,132, - 84, 97, 52,160,134,170, 61, 88,249, 20,218,134,197,191,237, 13,218, 54, 99,244, 94,136,174, 61,134, 1, 12,234,246, 65,240,102, -180, 29,168, 71, 71,164,104,216,212,165, 12, 94,247, 48,223, 15,240,157, 56, 14,249,190, 71, 66, 83,176, 20, 38,168, 56,194, 19, -186, 35,199,135, 27, 28,206,120,140,241,196,177, 8, 66,165, 72, 32,172, 64,249,132,152,148, 68,134,159,219,233,136,222, 89,242, - 52, 67, 55, 45,109,211, 12,185,208, 22,235,123,218,222,130, 87,200, 40,134, 72,225,125, 68,219,244,108,214, 59,238,221, 11,105, - 92, 77, 21,108, 41,231,167, 23,116, 26, 22,243,192,162,182,174,195,244, 61, 62,178,104,215, 81, 30, 74,178, 44,161,239, 91,148, -146, 24,107, 2,195, 93,197, 36,137,229,250,234,150,155,245,151, 8, 18,166,121, 78, 83,107,146, 88,146,165,115, 98,149,163,164, -164,222,183,244,182,198,217,144, 62, 24, 9, 21, 14, 33, 93,203,245,245, 91, 78,207,166, 24, 27, 7,143,185,151,200, 72,210,155, -150,166,235,144,177,195,121,143,241, 97, 44,243,242,213,107,162, 40,226,201,163,135,180, 85, 77, 81,228,152, 94,143, 11,158,209, - 26, 99, 53,206, 56,162, 88,161,100, 68,132,135,193,207,234,189, 67,216, 65, 4,151,120,242,201, 20,235,161,211, 65,203,160, 75, -195,247,255,253, 15,232,116, 15, 82, 49, 95,172, 64, 41,250,235,107,158,127,245, 20, 57,104, 70,142,110,137,253,126, 79,223,118, - 3, 66, 50,112, 20,156,115, 52,117,135, 30, 22,221, 98, 58, 35,205,115, 90, 99, 66,123,222, 89,228,160,121, 56,182, 19,227, 52, - 33,137, 35,188,169,201,178,156,186,177, 24, 11,141,238,249, 55,127,246, 23, 44,239, 61,225,201,147, 39, 92,111, 75, 54,135, 10, - 21,167,119, 96, 82,208, 53, 97,246,122,104,194,243,112,140,186, 61, 46,104, 50, 11,247,123,221,181, 20, 69, 49,110,240, 95,215, -105,212,117,141, 18, 97,188,114,122,122, 26,196,159,101,195, 97, 95,177, 56,157,142, 72, 89,231, 13,198,232,241,243, 35,181,174, -111,250, 32, 88,213, 46, 44,248, 50,194,249,160, 90,214, 58,116,156,122,109,113,190,165,110, 27,122,107, 16,198,133, 3, 54,131, - 19,101,160,157,233,182,195,233,112,208,181, 90, 98,157, 38, 87, 9,113,162,248,248,131, 39, 24,163, 41,166, 19,190,245,237,207, -120,249,242, 37,218, 71, 24,211, 35, 68,140,177,154,201, 36, 92,139, 67, 85, 82,150, 37,167,167,167,164, 73,204,213,213,213,232, -188, 73,211,148, 55,111,222,178, 94,135,244,183, 60,157,140,155,216, 17,191,122,252, 47,201,210, 81, 28,186,223,111,201,162,132, -170,109,232,109,207,245,237, 45,113,156,114,118,118,143,221,238, 48, 8,236, 2,142, 84, 16, 10,129,174,211,220,110,214,227,189, -154, 36, 9,167, 39,103, 84, 85,197,213,205, 53,105,154,112,122,122, 74, 86, 76,209,214,177,222,172, 71, 88, 78,150, 12, 32, 36, -173,185,217,239,241, 62,136, 34,231,243, 57,211,217,132, 87,219, 80,208,200,129, 30,106,189, 27,181, 5,137,214, 88,227,208,198, - 18,199, 3, 5, 77,197, 68,113, 66, 94, 20,236,246,251,224,170, 50,225, 58,166,105, 26, 68,131, 3,168, 75, 41, 21,236,113,214, - 66,164,200,138, 41,113,154, 17,201,152, 56,129, 72,248,247,124,218, 71,183,210,187,104, 83, 49,134, 87,249,191, 1,213,173,173, -185,147, 94,229,240, 62,172,189, 94,120,132, 15,197,147,119, 22, 47,124, 96,165, 68, 17,206, 25,140,237,233,250, 6,143, 9,227, - 75, 21,161, 34, 49,216,213,194,238, 29,210,231, 92,248,192, 12, 52, 59, 23, 14,141,226, 72, 8,149,191, 20, 40,197, 55,136,223, -127,229,166,238,126,249, 0,160, 98, 53, 65,201,227,204, 47,194,101,142,162, 48,239, 65, 69,186,174,165,105, 43,192,177, 92,206, - 89,174, 22, 40, 21, 81, 85,209,168,220, 61, 84, 37,155,253,158,194,104,244, 17,117, 58,164,187, 61,127,254,146,162, 40,184,184, -247,144,162,200,168,171,114,200,101, 78,233,117, 75, 81,196, 44,102, 11,210, 52,167,247, 59,170,182,196,120,141,241, 17, 6,201, -190,238, 56,205, 3, 36,199,235, 22,173, 61,217,124,201, 97,183, 39, 23,146, 56, 82, 96, 29, 93,213,208,138, 16,110, 16, 9,137, -181, 33, 18,111,115,104,176, 78,162,210, 41, 62, 74, 41,219, 30,239,195,235, 59, 91,206,169,118, 27, 34,233,152,100,146, 44, 81, -228, 89,130,140, 4, 86, 90,182,219, 61,177, 50,152, 97,211, 60,250,137,143, 12,229, 60,207, 67,245,155,188,243,190,235,222, 34, - 5,131,210,215, 14,115, 41,144,113,138,140, 61, 86, 4,108,173,179, 30,231,237,176,169, 15, 23, 92,184, 65,124,229,239,100,200, - 31,213,151, 46,248,173, 77,248, 30,100, 16, 43,182,221, 97,240,227,191,139,234,148, 81, 60, 90,251,240,161,171,210,181, 61,158, -119,208, 26,163, 53, 49, 49,222,132, 86,150,195, 67, 36,201, 84, 65, 58,207,153, 77,131,240, 77, 69, 10,171, 13,157, 51,236,215, -187, 80, 89,159, 43,156, 21,232,222, 19,201, 28, 33, 37,157, 14, 88,213,197, 50,196, 89, 38, 17, 44, 23, 39,236,214,111,240,214, -210,212, 53,118, 97, 48,189, 37,205, 38,161, 59, 97, 13,113,170,134, 92,128, 27,110,111,215,124,241,197, 23, 33, 14,210,116,136, - 40,162,107,107, 84,156, 35, 60,236, 54, 91,126,254,147,159, 49, 41, 22,124,254,249,231,180,173,198, 59, 57,216,121, 66, 39, 99, -191,223,179,222,238,144, 50,230, 59,159,126,135,166,105,136,149,164,215, 30, 39, 12,218,116, 24,163,105,155, 26, 33, 28, 50,242, -236,171,138,222,104,138, 40, 84,120,218, 26,228, 96,157,107,235,134,110,181, 34,207, 50,230,211, 41,155,219,107,116,215,134,205, - 4,139,183, 6,239, 44,174,119,116, 70, 15, 21, 64, 60,206, 48,231,179, 25,209,124, 17, 54,113,103,131,165,206,123,164, 74, 48, - 8, 94,188,124,197,171,183, 87,204, 23, 11,110,182, 91,140,243, 92,111,214,129,126,167, 50,220,192,113, 55, 93,168,208,143,179, - 76, 49,232, 28,170,170,194,118, 13, 74, 10,242, 52, 84,237,117, 93,179,222,151, 68,113, 17,170, 8, 60,218, 24,188,214, 24, 23, - 60,240,145, 82, 24,219,179, 59, 52,196,217,140, 89,154,209,237, 91,138,217,148, 52,203,121,254,252, 57, 78,134,132, 53,235,222, -145,181,142,247,207,113,198, 42, 7, 36,113, 93,215, 35,191, 58, 30,208,163, 71, 81,229,177, 82, 86,195,215, 30, 61,201, 89,150, -145, 42, 73,146,134,138,167,169, 42, 14,135,122,244, 2,247,125,176, 8, 5, 87, 67,135,117, 26,105, 69, 56, 72, 13,116,174, 56, - 75,169,251,158,174,211,180,186,127, 7,183,105, 90,110,111,111, 41,155, 58,140, 65,140, 29,186, 48, 61,214, 71, 68, 78, 80, 85, -193, 34,149, 47,210,160,212,111, 26,186,190,195,153,129, 3, 17,105, 38,211,130,239,127,255,175,121,252,248, 33, 15, 31, 61,225, -226,226,130, 7, 15, 31,243,167,255,238,207,185, 89, 31,200,242, 44,140, 66,132, 96, 62, 15,113,173,218, 89, 62,252,240, 67, 94, -190,124,129,112, 71,189, 68, 67,166, 2, 42, 55,203, 50, 38,147,201,168,196,159,207,231, 44,151, 75,222,190,125, 59,118, 29,251, -222,112,186, 58, 97,177, 88, 5, 4,175,143,176, 54, 56, 70, 54,155,221, 72,172, 60, 58, 62,142, 54,221, 35,177,175,170,170, 17, -178,181, 90,173, 72,211,148,183,111,222, 82,150, 37,211,249,140,201,100,194, 98,177,224,112, 56,132,247,169, 44,201,178, 16,155, - 43, 28, 35, 94,214, 24, 61, 8,117, 83, 30, 61,122, 16, 82,213,242, 4, 55,108,226, 85, 93,211,182, 1,204,211,116, 29,170,109, - 71,232,207,209, 97,114,116,186, 36, 73,198,213,213, 85,208, 39, 84,213, 47, 9,210,150,203, 19,230,243, 37,229,190, 66,136,136, -170,170, 17, 66,210,105, 75,219,187, 32,126,117, 71, 44, 53, 68, 49, 99,102,250, 47,137, 90,191,145,215,254,254,215,168, 36,190, - 99, 25, 62, 58,118,162, 81, 15, 19,220, 72,239, 62, 63,250,227,189,183,104,221,161,117,135,179, 67, 39,204, 71, 67,240, 88, 24, -119,122,111,199, 95,197,168,116,119,195, 38,238,134,167,210,253, 82,114, 27,255, 63, 43,249,177, 82,239,235, 48, 91, 61,222, 8, - 74, 29, 79,209, 32,162,208,242, 75,210, 28, 21, 59,180,233, 73,210,120,156, 1,131,163,105,218, 64,221,137, 35,132, 20,116,125, -143,182,123,140,177,120, 17,216,227, 63,251,197, 51,150,203, 37, 31,127,244, 25,145, 76,185, 93, 31,240,222, 51,159, 79, 41, 38, - 49,109, 93, 50, 75, 99, 34,103,104, 76,137,245,154,124,178,224,225, 7, 31,241,118,189, 39,114, 57,179, 88, 49,155, 78,217,172, -191, 66, 20, 75, 18, 61,197, 89, 67,223,183,200, 56, 1, 11, 70, 68, 56, 20, 36, 41, 22, 40,171, 32,150,235,140,227,116,181,100, - 58, 27,188,152,117, 69,150, 39,236,182, 7,112, 30,221,157,178, 92, 77, 57, 61, 93, 97,140,230,112,232, 6, 11, 85, 70,146,230, -104, 27, 88,210,105,154, 14, 99, 10, 79, 26, 7,162, 80,158,231,180, 93, 51,206,177,182,117, 53, 86, 44,105, 22,211, 54, 65,125, - 62,153, 76,130, 37,201, 90,250, 65,236,229,156, 25, 50,142,143, 0, 18, 63,122, 44,194, 53,136, 66, 55,104,216,216,173, 61, 90, -196,142, 23,208, 34,112,244,189, 70,136, 22,107,134,131, 68,111,113,174, 25, 60,171,237, 16,189,105,135,209,135,199,234,225,117, -248, 8,237,122, 4, 22,239,251, 97, 22, 44,137,211,224,119, 85, 81,132, 31,128, 44,222, 6,164,106, 93,215,136, 97,209,206,138, -156,117,117,224, 80, 55,116,218,209,118,118,132, 72,120,231,137, 39, 25,235,155, 27,138, 60, 71,120, 75, 26, 39,188,122,241,156, -199,143, 63,194, 90,195,205,245, 22,148, 31,192, 37,142,170,169,185,221,172,131,255,255, 24,254,160, 20, 93,223,224,108,135,138, - 19,206, 78,150, 60,124,112,129,238, 61,135,253,158,143, 30, 63, 66,224,176, 6,218,174, 67, 37, 49,211,201,130,253,174, 98,115, -187,229,106,126, 69,211, 52, 60,188,127,129, 82, 50,248,168, 93, 27, 42, 58, 66, 46, 64,219,118, 97,102,232, 2,121, 48, 78,115, -140,179, 24,237, 56, 93,157,208,230, 65, 44, 56,153, 76,112, 46, 60, 19, 93,211, 18,217, 0,230,145, 81,104,253, 57,231,232,219, - 62,192, 61, 84, 10,121, 14,145,160,114, 14,235, 60,218, 5,107,168,182,134,151,151,151, 60,123,246,140,186, 53,116,214, 49,153, -207,169, 58,205,171, 55,111,233,180,165,233, 90,156, 23,164,121,200, 9,111,135, 86,110,162, 20,211,233,148, 52, 81,116,189, 97, -189, 94, 99,157,166, 72, 83,138, 44,197, 91,205,190, 12, 34,213, 36, 73,176, 34,164,138, 89, 29,180, 38,169, 10,215,222, 35,105, -187, 14,103, 35,124,148,210, 25,135, 53,134, 52,155,178, 88,158,132, 89,126,221, 16,103,193,218, 90, 86,221,187, 22,124,223, 35, -165, 96,191,223,135,123,113, 32, 44,234, 62,232, 69,162,161,179,164,117, 71, 20, 41,226, 56,165, 51, 97,230, 60,201, 10, 68,164, - 24,110,229,192, 11,240, 26,219, 11,210, 56, 8, 50,215,235, 53,189,182, 1,138,163, 59,112, 61,211, 73, 70,211, 4, 1,218,241, - 16,172,143, 62, 95, 17, 42, 69,231, 61,198,218, 0,125,177, 30,109, 13, 85, 93,227,124,120,239,143,226,162, 80, 1, 10,148,138, - 49, 93, 77,146,167,196, 50,136,231, 58,239,113,198, 6,193,174,181,196, 82,241,236,249,115,238,157,159,211,153,142,207, 62,251, -140, 79, 63,249,136,159,254,244,167,156,156,159, 97,133, 68, 70, 41,105,158,210,180, 21,183, 55, 27,170,170, 36, 82,146,221,110, -203,131,123, 23,204,138, 9,222, 58, 54,219, 91,148, 23,204,102, 11,238,159, 94, 4, 11,168,233,200,138, 20, 21,199,116,125, 79, - 57, 84,168,206, 57,146, 52,136, 93,243,162,192, 19,161,109,232, 48,164, 89, 14,222,211,117,125, 56,248, 9, 69,150, 22,195, 33, - 50,216,223,244, 16,172, 18, 69,146,143,158,124,200,219,235,107,126,241,243, 47,153, 76, 38,204,231,115,210, 52,101, 49,155,115, -249,234, 85,216,144,187,110, 68,153,214, 85,131, 30,162, 87,165,140, 88, 46,151,164,113,130, 0,166,147, 9, 55, 55, 21, 69,150, -243,246,237,219, 49, 56,200,232, 96, 37,134,136,222, 88,140,209,227,225, 68,107, 67,175, 13,206,123,170,182,225,229,235, 55,236, -246, 37, 85,221, 98,122,139, 20,161,203,119,124,182,218,182,231, 80,213, 88, 23, 82, 22, 85,156,130, 80, 52,109, 71, 60,192,204, -132, 80, 40, 37,113, 71, 66,231, 49,141,242, 78,181,126,151,119, 49, 70, 25,127, 77,233,238,189,251, 70,187,233,123,212,182, 59, -248,229,227,199, 49,162, 22,103, 6, 1,109,176,103,123, 27,170,122,239,192,105, 63, 16, 67, 29,194, 27, 68, 80,213, 4,151,146, -119, 3,178, 91,126,131, 92,239,239, 30,229,252, 94,165, 30, 78, 16, 22,103,131, 76, 42,138, 64,169, 48, 63,112,206,112,115,179, -101,185,156, 7, 42,147, 61, 86, 1,109, 0, 45, 56, 71,217, 84, 48, 68, 27,102,121, 65,150, 77,137,132, 98,187,175,216,239, 75, - 54,155, 64, 63,194, 11,174,110,110,177, 30,140,143,200,211, 48, 87,114, 62,180, 38, 19,119, 64,119, 17,157,109, 17,169, 36, 75, -115,138,199, 79,216,237,107, 98,219,163,119, 27, 22,249,132,166, 44, 57, 95,157, 81, 87, 37,186,239, 16,198, 98,188,192, 56,143, -143, 98, 84, 28,108, 86, 85,221,114,117,187,166,235, 58, 78, 79, 79,153, 45, 86, 67, 59, 40, 38, 42, 10, 38,121, 76, 91, 30,112, -237, 1, 93,109,145,203, 28,233, 45, 77,215,132,121,144, 11,118,131,163,221, 72, 16, 97,172, 99,191,223,211,117, 13,121, 26, 83, - 76, 82,140, 13,115,255,192, 23,207,176,195,205,160,148, 34, 77, 38,196, 42,204, 76,131,104, 66,224, 6, 18,219,113,255,150,113, -130,240,230, 61,155,211, 81,232,129, 23,104,221, 19, 69,119,153,234,114,104, 63, 5, 21,125,221, 53,193, 53, 96, 60, 26, 61, 18, -172,182,219, 32, 98,187,127,255, 94,104,153,138,208, 30,195, 57,106,239,177,198,160,100,130,105, 59,164, 28,130, 55,136, 64, 14, -173,121,167,222,227,184, 59,103, 57,148, 33, 97,111, 62, 45,176,222, 16,137, 24,231, 5,111,174,110, 57, 28,122,156, 16, 88,227, - 49,125, 79,145, 39,164, 79,238,147, 42,143,112,193,246,210,117, 65,155,176,223,238,152,205, 87, 20,105,134,145, 30, 59, 4,193, - 44,150,167,108, 55, 33, 9, 43, 75,227,208, 97,112, 65,161,238, 6, 94,242,249,233, 9,203,197, 9,109,171,233, 90,141,179,150, -205,102,195,201,201,146,217,116,137, 23,158, 94, 31,103,252, 19,158, 63,127, 14,192,180,200,233,250, 26,129,161,237, 14,156, 44, -231, 16,133,205,237,118,189,229,245,235, 55,116, 70,179, 88, 84, 92, 92, 92, 48, 95, 46,194, 41,125,176,231,236,182, 91,186,186, - 38, 81, 17,103,167, 43, 14,214,176, 43,119, 16,133, 84,169,249,116, 66,162, 66, 76,228,237,205,134,174, 42,209, 77,205,227, 15, - 62,164, 25,218,206, 2,232,141,166,106, 26, 94,190,122,197,159,254,197, 95, 50,157, 44,176, 14,170,182,163,237, 58,234,214, 32, -162,136, 98, 50, 35, 77, 51,154,190, 11, 7,107,169, 66,251,122,176, 21,226, 45,109,167,135,215, 58, 40,117,189,163,105, 66, 22, -118,156,100,196,121,160,128, 53, 85, 77,132, 97,154,166, 44,138,156,233,116, 78, 20, 39,152,222,224,156,100,121,122, 66,219, 24, -122, 7,157,134, 63,249,215,127,138, 19, 49, 39, 39, 39, 92,175, 75, 82, 33,168,203, 3, 94, 68,161, 77,173, 59,148,204,112,246, - 29, 81,239,110, 21,127,215,143, 62, 90,247,218,246,189,170, 61,228,194, 75,210, 56, 98, 62,157,112,178,146, 60,184, 56,199,244, -154,205,250,134,111,125,244,152,207,191,248, 46,218, 26,218,166, 68,120,141,119, 14,163,131,245, 84,184, 16,232,225, 28, 88, 19, - 42, 65, 21, 71, 35, 95, 33,146,199, 8, 91,143, 26,156, 55,214,153, 0, 45,241,154, 36, 78,195,161,187, 12,182,206,190,237, 70, -171,146, 16, 18, 55, 68, 76, 59, 99, 40,138,130,151,151,175, 88, 44,230, 40,149,176, 47, 15, 44,102,115,150, 39, 43,246,135,154, -215,175,223,114,255,225, 99,132, 15, 76,244,221, 33, 84,222, 63,254,241,143,153, 79,166,180,109, 75, 83,213,220, 92, 95,179,152, - 6,241, 94,158,101,212,135, 61,223,249,252, 51,102,179, 25,187,237,129,215,175, 95,135,123,117,200, 33, 95, 44, 22,119,192, 39, -146,190, 51,180,109, 79, 81, 88, 34, 4,109,215, 50,155, 46,198,156,131, 99,103,174,170,170, 49, 29,175, 40, 10,158, 61,123,198, -237,102, 51,182,255,151,203, 37,113, 28,243,244,233, 83,234,182, 30, 19,194,142,156,129,166,105,104,170,106,132,100, 29,249, 26, -203,213,148, 44, 75,104,234,112,216,154,228, 5,145,146, 65,143,226, 29,113,154, 32, 7,102,197, 17, 57, 27, 58,153,106,232,252, - 42,118,187,221,216, 65,112, 3,204,235,226,226, 34,140,103, 90, 77, 89,150,124,245,213, 87, 92, 93, 93,209,247,134,195, 33,188, -150,103,207, 94,112, 56, 84,227,154, 20, 94, 75,204,124, 62, 37,146,193,141,116, 28, 3, 29,105,121,209, 49, 28,229,107,202,246, -240,158, 14,182, 91,103,239, 0,191,222, 7,128, 29,239,227, 40,146, 99,149, 30, 70,161,126,180,160,134,153,123, 76, 26,199, 68, - 81,124,167, 2, 15,173,115,239,237, 55,110,217, 65, 7,224,255, 78,155,246,223,186, 82,159, 20, 25,214, 74,140,211,161,197,160, -228, 96,111,178,120, 43,208, 78,227, 35,129, 76, 98, 34,175,134,100,157,160,146, 69, 70, 76,103, 43,234,182, 9,243,113, 21, 88, -202, 72,137,247, 37,219,237,150,103,207, 95,208,107,195,190, 60,240, 87,255,254,175, 89,173, 86,156,157,157,113,239,236,156,178, -169,137,208,161,173, 38,226, 96,235,113, 61,200,132, 70, 27,226, 52, 70, 9,199,205,118,207,205,238,134,213,100, 74,154,197, 88, -171, 57,236, 58,140, 11,201,230,169, 12,182,128, 35,176, 5,107,131,103,179,237,152, 46,230, 76,151, 75, 58,221,211,174, 75,206, - 86, 11, 14,187, 91,170,173,193,244, 29, 23,103, 39,188,125,245, 18,233, 3,109, 76, 73, 65,154,101,180,131, 74, 59, 82, 49, 74, - 42,164, 12, 51, 58,221,119,244,109, 9,147, 60,160, 54,157, 71,119, 45, 69,150,179,156, 47,208,121, 64, 72,166,121,198,108, 58, -167,105, 26,118,229, 97,248,185, 2, 61, 78,201,112,227, 29, 23, 30, 6,239,110, 72,117,243,239, 60,220,163, 69,205, 15, 45,206, - 65,145,137, 31, 82,224,194, 71,145, 77,222,205, 30,173,165, 60, 28,216,172,111, 56, 57, 57, 9, 41, 71, 3, 38, 87,138, 8,235, - 12,213,161,164,139,162,145,135, 30, 39, 1,110, 35,162,119, 9,117,198,234,247,253,157,206,177,217,134,217,224,105, 62,229,208, -108,137,109,143,177,130,170,238,105,219, 14, 25,231,104,237,232,122, 67,145,165,164,105,206,197,201,148,190, 11,132, 66,211,107, -238,157,157,243,139, 47,159,226, 28, 76, 23, 39, 56, 33,232,123,112,198,187,149, 70,202, 0, 0, 32, 0, 73, 68, 65, 84,147,231, -115,166,179, 19,186,206,146, 37, 57,110,168,150,147, 84,161,132, 8,234,126,225,153,207,166,156,158,164,120, 7,111,223, 94,243, -242,229,115,226, 88,176, 90,125,192,161,220,115,115,117, 75, 83,213,172, 86, 43,116,215, 15,167,255,150,253, 97,143,115,150, 72, - 58,182,187,142, 40,178,244,198,177,217,239,169,187,161,213,223,235, 49, 57,175,239,123,110,174,222, 34, 69,216, 24,188,181, 68, -131,200,211,246,161,221, 41,100, 80,185, 59,147,160,226,148, 56,146, 72,225,241,218,224,132, 96,115,117,131, 21,130, 98, 54,103, -189,219,242,253, 31,252,144,203,171, 55,148, 85, 69,213,106,100,226,120,241, 50,160, 86, 79,206,207,240, 8,170, 1,134,211,105, - 55, 30, 24, 99, 41,198, 13,203,152,112,159,222, 21, 82,213,117, 77,215, 6, 15, 52, 16, 4,117, 85, 21, 80,202,194, 51,157, 20, - 76, 82,137,183, 13,187,125, 73, 89, 53,228,177,196,203,140, 23,175,110,232,123,139, 74, 11, 14,117,104,207,171, 52,225,229,171, - 55, 68, 42,166, 90, 55, 52,109, 31, 52, 23, 66, 32,163, 8,211, 5,220,108, 72, 22,244, 35,216, 37,168,122,163,209, 70, 21,169, - 48, 2, 59,230,170,251, 72,208,107,195,172,200,121,176,156,242,219,223,249,132,147,185, 34,150, 21,203,233,148,186, 44,201,164, -228,191,254, 47,255, 33,255,249, 63,252, 71,252,179, 63,252, 23,252,233,159,253, 5, 77,189, 67,119, 2,167, 27,124,164,136,165, - 39,149,193,181,225,173, 14,186, 12,107,104,234,146,234,112, 24, 8,130, 33,167,221,153, 64,196,108,202, 67,112,102,184, 35,205, -207, 82,151, 21,222, 7,128, 85,154,166, 36, 82,225,180,193,104,141,183,154, 98, 58,165,106, 27,242,233,132,125, 85,113,249,234, - 53, 46, 18,148,135,154,249,124, 62,188,174,176,134,181,109,205,201,233, 18,161, 32, 77,114,250,190,167,111,123, 76, 31,178,195, - 31, 61,122,196, 98, 58, 27,171, 58, 33, 60,251,178,228,205,245, 91, 94,189,184,164,170, 42, 78, 79,206,153,207,231, 99, 71, 65, - 27,135,113,193, 54,220,247,129,151, 81, 85, 13, 73, 18,240,200,130, 14,109, 45,135,170,194, 12, 99,193, 44,203, 7, 84,181,226, -246,246, 54, 88,216,140,225,226,193, 3, 30, 62,124,200,102,179,225,213,219,144, 29,127,132,183,116, 93,135, 84,134,197, 60,204, -183, 25,254,174, 34,203,152,207,230,224, 45,203,249,130, 72,120,206, 86, 43,158,237,247, 76,166,225, 25, 61,194,134,142, 27, 76, -111, 76, 8,160, 82, 18, 31, 5,101,186,197, 35,147,152,253, 32,234,115, 67, 90,227, 17, 43,124, 92,187,173,241,225, 80,220,106, - 98,149,226,188, 64, 14, 69,154,117,107,188,247, 99, 2, 96,154,166,188,126,253, 22, 57,108,234,105, 26,214,221,227,198,126, 20, - 6,222, 37,175,221,221,216,133, 16,204,167, 5, 66,188,179,232, 29,255,223,241,243,163,144, 60, 26,178,208,143, 93,169,144,170, - 25,196,178,227,159, 91, 15,196,160,194, 40, 91, 18, 84,113,158, 99,142,250, 55,100,160,135,208,214, 95, 35,132,251, 59,200,234, -196,113,164,144, 10,188, 15,216, 61,235,205,104, 13, 8, 45,222,104, 76, 54,106,219,160,108,205, 82,133,115,208,119,193,202, 35, -100,192,136, 42,149,133, 27,174,109,145, 81, 76, 28,167, 76,167, 83,158, 60,121, 50,222,128,219,237,150,155, 27,195,106,181, 36, - 82, 33,221, 72, 73, 55, 80,185, 28,186,239,131, 95, 24,137,214, 45,214, 91, 82, 5,182,213, 8, 45,248,234,233, 37,243,229, 73, -152, 59,165, 57,233,100, 66,150, 23,204, 87, 39, 40, 21,211,246,102, 88,144, 82, 68,156,112,113,113,193,226,100,197,100, 54,229, -176,185,197,154,150,188,136,217, 92, 85,244,125,195,227,251,247,209,189, 99, 90,100,193,119, 45, 5,162, 11,213,124, 16,250, 89, -116, 31, 54,226, 82,107,148,148, 44,102, 5,106, 94, 4, 75,133,213,212,117,176, 16, 77, 38,179,241,134, 43,171,154,174,215, 56, - 43,120,250,226, 57,219,237,150, 94,235, 17, 32, 51,155,205, 88,172,150,228,113,130,176, 54, 88,107, 6,107,217,168,126,183,122, -204, 12, 22, 34, 26, 71, 35,225,192, 21,161,181, 31,195, 78,178, 52,128, 61,122,221, 18,251,112,115,207,231,115,158, 60,121, 20, - 50,124, 61,196, 42, 70,197,146, 94,126,109, 54,170,196, 8, 54,178,222,224,181, 71, 11, 51, 10,158,242,124, 18, 90,164,206,177, - 61,108,131,135, 63,139, 57,236, 43,156,208, 92, 93,237,168,202, 6, 99, 60,198,117, 88, 35, 72,146,128,196,141,227,152,235,235, -107,230,147,132, 55,111,222, 80,100,129,112,117,239,236,156,221,161, 38,201,231,172,171, 22,227, 37,214, 24, 22, 11,133,209, 17, - 93,231,145,203,160,161,144, 50,140, 48, 34,201, 16,223,232, 40, 15, 27,164,140,201,179, 9,203,213,140, 36, 13,137,107,117, 83, - 13,217,215, 41, 74, 45,201,178,140,229,114, 57, 66, 81,242, 44, 48,192,167,179,130, 94, 71,180, 77, 75,163, 27,154,214, 48, 95, -156,178, 92, 46,135,197, 34,167,170, 26,222,188,190,164,218,239, 89,174,230, 60,184,119,206,126,191,225,213,203, 75, 46, 95, 62, -231,116,185,224,236,226, 30, 69, 22,238,237,245,122,205, 94,236,209, 93,240,235, 71, 81, 80,235, 79,167, 51,222,220,220,114,168, -223,242,250,230,150,159,252,252,103,188,189,185, 37,206, 82,172,135,155,219, 13,235,237,110, 56,228, 37,108,182,123,170,170,226, -252,254, 5,139,197,130,203,203,203,176, 40,107,131, 84,130,211,213, 73,104,135, 38, 9,187,253, 30,213,135,164,190, 60, 86, 88, - 27,186, 47, 1, 82,148, 99,189,227,102,189,165,152, 78, 56, 93,205,113,186,229,234,242,146, 47,191,124,202,231,159,126,204,253, -139,179, 64, 61,187,252,138,127,250,251,255, 28,132,228,119,127,239, 63,101,127,168, 49,187,118,156,141,111,182, 91,164, 20, 24, -235,137,132, 36, 18, 14, 99,124, 24, 59, 12, 98,207,163,128,238,104,193, 57, 2,141,142,155,203,177,101,121,116,168, 44,151, 75, - 62,124,120,143, 73,145,115,182, 10,215, 37, 75, 20,249,106,201,201,106,193,164, 88,161,155,154,223,252,206,167,252,211, 76,226, - 77, 3, 78,162, 48,164, 82, 49,201, 38,164,210, 7,161,156, 8, 21,188,233, 59,234,253,142,195,126, 75,223, 53,232,190,197,105, - 79, 83,149,212,135,154,186,170,137,100, 0,216,104,109,233,218,154,230, 16, 66,127,138, 97,198,109,109,160,154, 29,201,110,189, -217, 7,225,102,103, 72,179, 24, 47, 36,215,215, 55, 33,234,244,230,134,199,143, 31,243,221,239,126,151,178, 14, 92,245,123,247, - 31, 4, 1,225, 62, 84,149, 86, 7,162,155, 30, 32, 61,106, 24,159, 24,221, 81,150,123, 78, 79, 79, 89,175,215, 35, 3,253,200, -192, 56, 70,160, 74, 25, 42,244, 60, 15, 46,135, 44, 11, 29,146, 35,212,167, 25,104,125, 71,171,213,177, 66, 7,184,186,186,162, -174,107,102,179, 25,159,124,242, 9,231,231,231, 84, 85,128, 10, 73, 41, 81, 81,132,238,122,226,244, 29, 0,234, 40,214,115,198, - 16,199, 10, 25, 73, 62,249,214, 71, 8,239,232,117, 8,109,249,244,211, 79,185,190,121,203,122,123, 96,209, 5, 94, 70, 89,135, -236,144,254, 8,178,146,140, 25,237, 33, 29, 49,136,204,154, 65, 88, 25, 33,232, 6,239,252,145,230,216,182,237,157,131,146, 29, -214, 83, 67,154,102, 67,148,106,132,148,209,168,135,138, 34,137, 24, 48,171,206, 70,244, 93,112, 79,181,210,140, 27,244, 8,210, -194,127,173, 19, 26,238,221, 75, 99,145, 74,188,167,243, 56,254,254,168,204, 63,226,119,143,122,165,163,142,228,246,118,141, 53, - 26,231,122,186, 70,143,142, 36,229,163, 32, 24,118,199,145,170, 26,118, 92, 57, 40,219,228,224,163,191,107,150,191,251,201,127, -216,175, 10,215,112,187, 89, 83, 20, 5, 42,137,169,235,240,166, 11, 25,196, 66,105,158,113,187,222, 98,173,103, 54, 91, 32, 35, - 23,152,236,113,129,209, 45, 86, 27,100, 82,112,216,135,139,170,100,152,137, 28,219, 60, 31,126,248, 97,160, 73, 69,130,221,110, -199,102,115,139, 84,158,235,205, 91,108,223, 49,155, 78,112,189,166, 45, 43, 36,146, 67, 85,147, 78, 11, 62,251,238,111,240,211, - 95,252,148,124, 57,195, 56,136,156,100,186, 58, 15, 66,145, 56, 33, 45,130, 93,163, 75, 44,155,195,129,243,243,115,246,235, 91, - 84,154, 81,238, 58,122,237,248,228, 91, 31,210,116,154,190,239,168,170, 3, 93,189, 35, 75, 36, 78,183,220, 91, 22, 92,156, 46, -105,117,196,183, 63,251,156,205,126,131,179,176, 92, 46,217, 87, 53,171,147,130,106, 83, 51, 41, 22, 28, 14, 21,103,167, 39, 33, - 38, 82,119, 40,153,132, 25,115, 93,134,116,170,172,224,246,246,150,163,131,173,170, 42, 86,171, 83,174,111, 55,252,236,167,191, - 96, 62,159,243,173,207, 62,161,109, 91,158,191,120,202,118,183,230,225,163,251, 65, 12,166, 53,243,233,132, 98,146, 13, 17,136, - 97, 78, 89,228, 83,246,251,146,190,179, 99,238,174,240, 62,128, 58,156, 6,225,144, 82, 96, 61,212, 77, 57, 46,192,109, 85, 19, - 71,130,207, 62,249,152,174,111,193,201,144, 13, 47, 64,247,129,247,156, 37, 33,124,230, 80,238,152, 47, 86,172,183,123,148, 74, - 2,227,126, 76,160, 18, 76,102,211, 32, 30, 33, 8,191, 62,254,228,211,208, 50,107, 58,144, 10, 47, 4,121,158, 15, 11, 78,142, -113,112,216, 55,244, 77,205,126,239,105,154, 19,138, 56, 88, 88,206, 78,231,196, 50, 98, 59,220, 39, 15,166, 11,158,191,186,229, -197,213,129,125,165,131,210,212,191, 4,103,120,240,224,130,179,229, 57,130, 4, 37, 36, 62,242,120,111,176,125, 96,251, 39, 42, -180,194,122, 93,227,240,124,244,209, 99,188,247, 28, 14,155, 65,196, 5, 89,150, 96, 76, 31, 44,135, 67, 86,116, 28,231, 40,229, -233,219, 65,132, 24,229,172,215,215,164,121,216, 84,214,219, 61, 31,127,240, 33,105, 26,243,131,191,254, 43,126,246,243,159,240, -217, 39,159,140, 97, 23,199, 80, 11, 99,123, 38, 89, 26,232, 89, 3,255, 61, 81, 49,198,247,232, 94,135,107, 82, 86,148, 85,131, -246,158,159,127,245, 37,255,238,207,254,130,214, 57,234,190,163,110, 59,242, 36,102, 91, 86,220, 92,111,152,205, 22,131,107, 34, -225,228,228, 12,227,161,105, 58,172,245,131,171, 33, 38,159, 76,185,221,172,233,141, 38,205, 51, 14,187, 61,109,223,177, 92, 46, -185,190, 89,211,215, 54,136,173, 78,150, 35, 30, 84, 24, 67,158,198,156, 44, 23,188,190,124, 65,162, 2, 42,244,199, 63,125,206, -197,189,239,243, 79,254,201,255,204,245,245, 53,127,244,199,255,134, 87, 87, 91,164,146, 60,123,126,201,245,237, 45, 42,206,131, -205,232, 80, 14,186, 31, 79,162, 34, 58, 29,226,109,167, 89, 76,111, 45, 89, 62, 9, 64, 34,109, 48,198,146,164, 41,194, 59,154, -170,198, 91,131, 20, 80,151, 7,148,138, 6,148,106,136,208,236,234,138, 87, 47, 94, 82,190, 53,208,158, 51,201,131,136,239,199, - 63,250, 9,125,221, 16,217,152,205,250,134, 60, 79,249, 71,255,197,127, 70,175, 99,214,235,154, 76, 6,142,193,223,251,157,111, - 51,153,166, 56, 99, 57,148, 45,187,125,136,148, 77, 99, 9, 70, 99, 12, 8,107, 48,166,167,173, 43,210, 36,198, 59,144,210,129, - 3,133,195,245, 1,236,226,135,177,218,113,134,108,173, 5,169, 48,214,210, 15, 80,155,172,200,113,131,213, 81,198, 65,207, 80, -215, 53,175, 95,191,102,177, 88,208,212,221,176, 81, 74,210,105,202, 98,190,226,242,242,146,184, 8,116,185, 56,146, 76,178,124, -108,143, 79,138,108,232, 36,117,252,228,135, 63,226, 31,255,227,255, 30,173, 53, 63,250,209,143, 40, 38, 25, 85, 25,232,157, 93, - 91, 19,171, 16, 27,124,114,114, 50,160, 93, 91, 18, 21, 67,146, 32, 58, 19, 2,119,102, 51,226, 56,102,177, 88,176,223,239, 57, -236,246, 56, 19, 58, 16,159,124,244, 17, 69, 81,112,115,115,195,118,187,133,209,110,229, 81,177,164, 42, 15,193, 78, 26, 9, 18, -165, 2, 22,123,183, 11, 22, 76, 41,209, 93,143,240,150,242,176,167,222, 29,248,199,255,221,127,203,245,213, 27,254,159,127,249, -175,168,235,154,170, 58, 12,135,187,176,241, 7, 91,113, 52, 8,239,178, 17, 53, 27,160,102, 65,147,145, 37,233, 80,153,155,247, -130, 82,154,166,225,250,250,154,162, 40,104,154,102,108,227, 31,161, 90,186,183,131,218,222,227,149,192, 24,139, 49, 97,191, 41, -138, 4,103, 69,208,243,196,161,245,174,251, 32,208,115,222, 97,237,187,232, 95, 99, 12,198,234,208,189, 52,193,101,212,122,243, - 94,219,253,120, 64,189,155,213,145,231,121,136,138, 85,138,195, 97,135,192, 81, 76, 82, 54,235,138,235,159,124,201,242,100,193, - 7, 31,124, 64, 82,100,252,245, 95,253, 37, 90, 91, 38,197,156,100,200,232, 56,118, 0,100, 20,145, 36,138, 56, 77, 16, 74, 4, -231,144, 24,246, 86, 37,136,132, 26, 63,191,107,181,243,110,232,162, 59, 49, 88,237,212,248,185, 39,136,162, 21,162, 39, 81,142, - 72, 26,122,221,209,183, 13,206,103,136, 72,209,107, 67, 74, 68, 89, 55,164, 42,199,104,143,139, 35,156, 27,168, 94, 50,195,244, -193, 19,121, 76,150, 10,167,157, 16, 4, 50,155,205,176,189,230,186,122, 59,248, 24, 61,179,217,132, 94,119, 36, 50, 66,205, 67, -128, 64,164,226, 48, 51,172, 91, 68,148,132,106, 35, 86, 60,121,112,143,205,245, 91, 50,149, 50, 93,221,167, 61, 84,136,196,241, -232,226, 1, 78, 41, 26,173,121,246,226, 57, 79,158, 60,225,203,103, 79,185, 56, 59,103,181, 90,241,213,243, 23, 68, 66,241,244, -171,159,145, 77, 23, 97,174,147, 38,148, 59,205,139,103,207, 73,179,132,233, 36,224, 94,211,108,202,217,189, 7, 84,125, 79,154, - 39, 68, 17,163,103,243,222,217, 41,251,221,129, 60,149,129, 44, 53,205, 56, 59, 63,225,245,235, 87,196,233, 32,146,107, 91,188, -183, 35,115, 89,170,152, 52,205,105,251,112,154,251,238,119,191, 27,196, 41,203, 25, 85,125, 32, 73, 63,197,123, 71, 85,238, 2, -193, 76,134,139,216, 52, 13,125,223,142, 21, 15,194, 49,157, 22, 92,238,222,224,236,157,217,137, 24,116, 15,241,160,206,237, 61, -118,160,149, 29, 14, 59,138, 34,227, 80,110, 67,236,166,238, 40,178, 57,189, 14,145,179,199,211, 50,230,157,112,164, 44,107,102, -139, 21,189,209,196,113,224,122,207,103,203, 64,172,171,111,121,248,240,225,248, 96,169,216,226,157, 67,197,225, 6,143, 85,134, -148, 5,249,100,193,108,186,228,205,213, 53,191,168,190, 34,153, 22,100, 67, 75,127, 54, 75,233,155,161,154,115, 33, 5, 42, 78, - 10, 54,219, 3, 95,125,245,148,175, 46,247, 36,197, 28,225, 66,198,117,166, 98, 46,238, 61, 64,202,148, 24, 19, 82,253, 34, 55, - 28,102,221, 48, 91,247,163, 13,208, 2, 73, 42, 8, 83,151,193, 58,118, 20,235,249, 0,231,120,167, 46, 13, 15,112,175,109, 96, - 27, 88,139,247, 80,150,213,152, 7,208,223, 15, 7,128,170,106, 88, 45, 79,249,232,163,143, 71,196,112, 81,100,124,251,243,223, - 32, 75, 98, 68, 20,116, 13,158, 8,111, 12, 93,111,136,149,162,211,150,178,172,233, 7,102, 67, 47, 34,222, 94,221,112,179,221, - 33,211, 20, 39,224, 80,213,108,170,138,221,161, 36, 73,114,234,166,225,254,253,135, 65,156, 89,228, 76,218, 9, 39, 39,103,236, -247, 97, 81, 60,182,224,191,245,241, 39,228, 69,138,181, 14,109, 13,175, 95,191, 65, 40, 73,146,230, 44, 23, 1, 6,178, 59,236, - 57, 79,206, 40,138, 2,173, 53,155,205,134,219,155,107, 30, 63,188,207,250,246,138,253,126,195,199, 31, 63,226, 31,253, 87,255, - 13,251, 67,195, 31,252,225,191,226,242,237, 26,107, 97, 95, 90,126,242,179, 95, 16,199, 41,197,100,194,223,255,251,255, 49,111, -174,110,184,221,108,105,170,154, 78,247, 84,101,131,136,124, 64,184, 10, 64, 74,174,174,111,169,134,205,255,216,186,188,107, 61, -203,243,124,120,255, 10,206,206,206, 66, 30,247,245, 13,183,166,229,123,159,125, 64, 28, 73,210, 84,242,229,151, 95,114,123,123, -203, 39, 31,125,139,127,243,111,255, 28,169, 98,136, 9,217, 14, 34,160,100, 19, 21,113, 48, 61, 77, 85,243,228,241,125,164,136, -216,237,126, 65,223,181,168, 72,176,223,110,105,235,146, 60, 38, 48,208,251, 14,171,205, 0,192, 97,136,233, 13, 41,148,214,133, -180,193,187,122,150,175, 11,143,178, 44, 11, 33, 48, 85,139, 84, 2,103,163,225,222, 79, 73,146,140, 88, 42, 14,135, 3, 50, 10, -204,251,167, 79,159,242,123,191,247,255,177,245,102, 77,150, 29,231,185,222,147,107, 30,246,188,107,215,208,213, 35,102,144,128, - 72, 73, 60, 58, 82, 56, 44,251, 12, 97,135,195,255, 66,191,196, 55,250, 37,142,112,248,202, 87,190,208,104, 89, 65,250,136,146, - 72, 29,137, 0, 5,162,209,243, 88, 85,123,222,107, 94,153, 43,211, 23,185,106,131,138, 56,184, 65, 4, 72,160,187,107, 15, 43, -243,251,222,247,121,254,128,217,124,193,124, 62,231,197,179, 23,212,117,109,249,233,149,245,160,223,189,123,199, 62, 44,165, 36, -203,236,100,103, 48, 24, 32,250, 67,242, 45,138, 57,138, 3, 84, 43,143, 77,131,170, 42,241, 3,151, 36, 29, 17,120,190,101, 8, -236,174,143, 24,218,217,108, 70,158,231, 71, 23,252,221,187,151,246,178,115, 56,240,250,245,235, 99, 82, 30,236,207,198,115, 92, - 14,121, 70, 24,219, 3, 70, 91,213,148,101,201,217,217, 25, 15, 31, 62,236,215,141,253,212,194,116,188,126,253,150,235,247,239, - 24, 79, 70,236,247,251, 35,145,210,208,115, 23, 2,136, 3,251, 30,191, 77,188, 91, 58,231,247, 36,187,219, 9, 78, 91, 55,228, -135, 3, 65,255,251,185,181,105,222,122,224,111,251,229,183,173,130, 91,162,101,219,218,117,154, 49,118, 10,144,198, 3,116, 7, - 74,218, 90, 39,142,232,223,123, 28,223,135,174,235, 28, 67,113,183,149, 61,123, 11, 31,208, 86, 37,230,223, 60, 52, 29,112, 12, - 2, 15,215,181,252,143, 86,214, 84,165, 13, 53, 86,101, 75,221,148, 36,241,128,166, 81, 68,190, 75,149, 55,108,214,123,182,155, - 28,169, 4,142, 88, 18,165, 5,235,213,161,183,159,238,113,140,131,214,230,123,107,169, 54, 8, 87,208,209, 29,243, 0, 86, 54, -230, 31,181,197,183,235,131,219,169,204,109,102,224,150, 20,120, 91, 3,188,157, 98,216, 93,190,192, 75, 83,159,213,186,160,108, - 11, 28,215,179,152, 80,233, 18,132,190,245,231, 42,129,198, 37,140,147,126,254,111,168, 27, 27, 80,242,111, 89,235, 29, 4,129, - 13, 65, 24,236,237,211, 65,224, 5, 62,190,107,109, 76,105, 60,160,106,107, 90, 37, 89,175,151,156,156,156, 18,197, 86, 34, 80, -213, 45,173, 23, 82,150, 13, 6,135, 70, 42, 94, 61,127, 66,145,175, 48,198, 48,156,158, 49, 61,185,224, 16,148,212, 77, 6,126, -196,110,187,162,108, 27, 70,227, 41,157,214,100, 69,198,191,251,253, 31, 51,159,206,120,251,238, 21, 69, 85, 48, 29, 15,200,171, -134,186, 31,195, 56, 94,192,122,187,227,225,229, 9, 73,154, 32, 59, 13,174,207,207,127,249, 21,157,110,249,253,159,252,136,166, -169, 65, 40,220,158,225,156, 11,200,139,140, 95,253,234, 43,238, 95, 94,242,249,103, 31,240,230,213, 83,242,126,223,153,166,195, -227,238, 48,203, 50,132,227, 50, 24,140, 48, 93, 71,154, 14,143,136, 69, 37, 37,113, 24,145,196, 1, 81, 20, 32, 27,123, 10,173, -203,138,170,183,102,105,109, 79,221,117,221, 82, 20, 21,113,148, 30, 31,240,183,129, 15, 41, 21,194,177,187,182,182,109, 49, 4, -136, 30,187, 26, 70, 1,142,107,136, 34, 15,221, 53,196,145,135,131,189,225,226,186,116, 82,226, 71,145,173,145,249, 62,161,231, -179,203, 10,162,120,140,238, 28,132, 27, 16,249, 67,100, 11, 81, 56,164,170, 42,138, 67,211,127, 0,124, 28, 66, 58,211, 33, 91, - 44,131,221,181, 15,123,186, 14,221, 85, 52,117,193,242,230, 29,113, 28, 83, 57,134,123,151, 39,116,169, 93, 45, 84,149,238,251, -157,130,200, 11,104,100,199,102,103,251,170, 97,226, 30,205, 70,186,163, 79,164,215, 12,134, 9,174,144,125,141, 84,162,251,220, -131, 77,177,218,157,164,192, 74,111,132,176,123, 93,213, 74, 60,207,128,107,115, 0, 78,143,105,213, 61,142, 87,117, 32,165,166, -174, 20,117,171,184, 94,221,224,250, 62,163,145,205, 63,148,101,201,122, 93,146,231, 37,159,127,254, 89, 63,214,108,104,171,178, - 7,102, 40, 74,173,168,235,178,223, 3,218, 7,177,214,253,169, 26,129, 19, 4,180,141,228,151,255,242, 53, 55,203, 53,198,117, - 41,219,150, 36,140,104,181,166,106, 36, 26,131,239,133, 36, 73,194,238,144,211, 40,137, 42,245,209,104,118,118,118,118,148,111, - 0,184, 65,200,108,113,130, 54,202, 90,245, 92,151,172,106, 24,143, 7, 8, 97, 44,110, 85, 74,174,174,174,184,190, 90,146,196, - 22,152,211, 41,201,124, 50,230, 15,126,242,251,184, 2, 28,209,241,197, 23, 63, 96,144, 38,252,233,159,254, 41, 29, 80,181, 29, - 65, 50,164,233, 50, 70,147, 41, 95,252,240,119,120,250,212,138, 72, 78,102, 54, 84,149,237,247,228,101,217,147,192,228,177,145, -145,149, 53, 77,109, 43,104, 22,182,164, 80,109,141,236, 27, 33,163,193,200, 62, 52, 59,137, 65, 35,140, 13, 54,170,174,229,126, -143, 67,205,178, 12,223, 15,185,122,191, 36,137, 71, 8, 92, 94,189,124, 77,213,118,140, 79,198,120, 65,112,180,194,165,241, 12, -217,118,172, 86, 27,238, 63,184,195,100,100,235,181,117, 81,226,247, 21,185,219, 47,193,219,135,100, 16, 4,132,129, 79,146,248, -120,158,111, 65, 81, 94,128, 84,154,178,173,236, 84,163,187,221,165,134,184,174, 71,232,216, 67,137,219, 35, 97,173,123, 61, 64, -184, 46,101,213, 0, 22, 78, 21, 71, 86, 69,237,133,238,145, 66,120,231,206, 93,219,126, 89, 44,104,138, 18,223,117, 16, 70, 91, -186, 92, 26,115,113,126,126,148, 55, 93,189,123,195,201,108,206,126,187, 35, 77, 83, 30, 61,120,216,179,205, 21,166,179, 55,127, - 55,176, 95,215,101,145,245,140, 67, 77, 85,100,200,206,224,249, 14,143, 30, 61,164,105, 26,242, 60, 99,185, 92, 50,155,205,184, -188,184, 67, 20, 69, 92, 95, 95,179,222, 44,169,234,194, 86, 93, 5,212,178,193,104, 69,146, 70, 76,231, 86, 13, 61,159,140, 73, - 46,206, 9,252,136, 78, 74,226, 40,226,222,221,187, 84, 85, 97, 73,143, 65,204, 71, 31,125,196,233,233, 9,117,175, 52,158,246, - 53,207, 56, 14,137,226, 16,207,115,241, 60,187, 6,104,202,146,192,117,209, 82,162,154,134,166,180, 98, 43, 49, 7,223,181, 85, -202,227, 30,219, 49, 86,206, 83,229,120,190,131, 84,141, 93, 43, 70, 17, 90, 41,202, 60, 39, 63, 28, 44, 76,167,174, 41,243, 28, - 16, 61, 69, 83, 98,122,194,224,109, 23, 95,155,238, 8,221, 73, 6,105,143,175,110,142, 21, 74, 33, 4,101, 93, 31, 17,184,223, - 91, 45,245,241,160,226, 56,118, 98,169,100,141, 82, 45,158,103,193, 70,246,159, 11, 60, 47, 64, 73, 77, 60, 26, 81,215, 37, 85, - 37,145,210, 80,228, 13, 55,236, 8,226,154,170,146, 32, 60, 58, 45,108, 3,165, 51,248,183, 0, 56,213, 31,136, 28,131,235,201, -127,179,186,250,237,125,254, 45, 60,233,246,161,126,251,240,191,125,127,143, 70,163, 62,220, 30,244,122,113, 23,239,242,242,140, -170,201,217,172, 15,236,139,146, 78, 57,132,105,132,234, 12,141,236,193,245, 90,224,123,225,241,244,228,122,246, 77,230, 58, 22, -180,224,250, 30,121,113, 56,142,137,124,231,251,224, 66, 89,150,120,174, 67, 18, 71,148,101, 97, 67, 40,109,135, 48,246,193,224, - 8,151,166,211, 40, 97, 40,164, 97, 16, 15,137, 66, 23, 84,201, 48,242,152, 79,103,196,233, 12, 67,136, 23,133, 40, 41,217,100, - 21,101,213,216, 23,195,135,245,122,141,235,192,110,187,164, 45,118,168, 42,231,250,237, 53, 95,252,248, 39,156, 44,134, 60,126, -254,156, 48, 74,152,159,156, 49,153,159,147,142,102,224,106,138, 90,241,248,241, 99,254,242,255,253, 47,156,159,157, 48, 63, 59, -231,225,253,115,202,194,194,104,116,171, 89, 76, 71,168,186,160,216,111, 89,250, 46, 97,232, 19,134, 62, 69,153, 33, 28, 99,199, -123,117,139, 23,128,227,184, 71, 2,159,239,185,172, 86, 43, 22,139,185,221,225,182,117, 47,155, 56, 16, 56,130,120,144,218, 47, - 55,213,114, 56, 72,134,195,148,179,179, 11,187,147,207,115,164,108,122, 49, 68,141,148,170,127, 17,161,105, 44, 89, 42, 8,110, - 67, 29,183,149,145,150,135,143,238,241,226,197, 51,251,193,104, 26, 38,147, 57, 73, 20,226,184,214,112,214,182, 45,113, 24, 29, -141, 90,142,235,114,200, 27,214,203,165,205, 77, 20,150,205,252,228,187, 39,156,221,185,232,171, 89,253,201,210, 24,148,146, 61, -208,198,177, 15, 76,207, 97, 50,136,185, 94, 45,105,106, 7, 87, 72,154, 42,167,169,114, 27, 56, 12, 3,180,238,208, 88,141,171, - 82, 29,170, 19,212, 82,226,135, 17,139,179,115, 70, 51,159,116, 60,165,173, 90, 58,169,216,172, 86, 60,249,238, 49, 85,177,227, -147, 79, 31,113,121, 49, 67,155, 22,163, 27,180, 81,191, 37, 74,177, 33, 73,199,119, 48,194,230, 63,126,123,100,118, 59, 98,243, - 60,215,198, 77,140, 64,107,203, 25, 48,194, 69,163, 81,218,208, 25,129,236,111, 82, 90,107, 6,131,129,229, 33,244, 92,231,245, -186,231,196, 27,141, 95, 57, 32,148,197,202,202,134, 48,137,105, 27, 69, 39,220,158,137,223,161, 58, 67, 86, 84, 24, 35,184,218, -108,120,183,188,225,252,206, 37,198,247,121,119,179,164,108,106, 90,217, 49, 28,143, 24,197, 9,215,171, 37,178,237,184,185,185, - 98, 62,183, 59,207,241,120,220, 79,110, 44,236,229,246,182,179,223,103,118, 42, 20,122,182,109, 18,249,199, 27,209,109, 48,173, - 44, 75, 26, 41,237,151,184,239,241,229, 15, 62, 71,201,134, 87, 47,158, 91, 18, 98,150, 81, 85, 21,211,233,148,255,233,127,249, - 95,249,199, 95,254, 87,222,188, 95, 35,101,205,143,126,244, 37,127,252,199,127, 76, 20, 69, 60,123,246,252,104, 41,140, 2,143, -218,117,240, 5, 56,158,160, 19,238,145,160, 55, 72, 18, 22,179, 25, 14,142, 93, 19, 26, 65,221, 90,199,184,235,187,248,174, 71, -209, 22, 76, 38, 19, 28, 71, 48,153, 76, 40,203,194,166,172,235, 2,111, 52,197, 13, 19,164,209,188,191, 94,115,255, 50,229,197, -235,247,124,240,201, 15, 25,141,199,132, 67,143,109,150,243,252,245, 27,158, 62,123,193,131,123, 62,110, 24,210,116,134,205, 54, - 35, 73, 6, 12, 71, 19,202,186,161,172, 91,252, 48,164, 85,154,172, 82, 56, 34,160,211,157,229,219,215, 13,121, 46,233,144,116, -128, 35, 74, 90, 3,145,235,218,139, 12,224,244,123,116, 27,228,226,248,144,184, 5,246,120,158,143, 29, 29,217, 73,149,231,184, - 72,169,136,251,245,141, 16,194,142, 94,131,128,235,235,235,227,141, 43, 73, 18, 70,163, 17, 90,171,254,198, 94, 28,211,219,243, -233,148,223,253,221,223,237, 15,243, 53,159,125,246, 25,175, 94,189,234, 71,211,242,184, 78, 2,221, 95, 56, 52,178,182, 28,245, - 48, 73,184,184,184, 56, 78, 68, 30, 61,122,196, 23, 95,124, 97, 39,166,142,203,118,183,166,110,202, 99, 62,192,126,118, 93, 70, -163, 1,101, 89, 83,215,165, 53, 72,158,156, 28,193, 63,105, 98,197, 45, 69,158,247, 35,115,159,253,126,207,155, 87, 87,191,101, - 85,220,241, 71,255,254, 15,249,131,127,255,135,252,223,127,246,231,208,105, 60,129, 61,136,104,117,180, 53,222,238,163,111,111, -204,183, 33,207,227, 84,172,109,200,234,146, 44,187, 32,207,243,227,255,214, 52, 13,135,108,199,102,123,171,235,182, 55,116,225, - 24,234,178,233, 31,190,246, 65,158,164,218,170,139,181,176,138,240,218,222,224,183,219, 45,121,158,219, 95,191,191,213,158,157, -157,217, 38,212,112,216,155, 27, 5, 90,171,223, 10,206,113, 52,170, 89,241,208,247,107, 1, 99, 36,198,116,104,221,246, 16, 48, -183,255,188,119, 52,173,162,174, 90,180,113,168,107, 73,221,238,241,188,130,186, 81, 61, 88,199, 69,187,224,152, 91,144,152,192, - 56, 6,141,135, 49,173,157, 14, 96,185, 37,199,130,125, 31,132, 45,219,230,191, 41,154,185, 69,127,107,173,109, 72,221,177,128, - 45, 71,184,120, 65,232,115,255,254,125, 70,195,156,231,175,223,146, 29, 26,124, 63,192,104, 43,101,137,227, 20, 63,140,144,186, -163,109, 74,219, 27, 21, 86,121, 90, 55, 61,145, 71,248, 71,201,192,118,171, 88, 47,151, 86,242,226, 24, 78, 79,166,148,181,101, -163,167, 73, 98,171, 28,101,133,150, 29,251,237, 30,109, 12,194,143, 24, 14, 83, 34, 98,124, 39, 66,117, 5, 78, 87, 51, 78, 28, -134,161, 96,181, 94,241, 87, 63,253, 71, 10,229,224,134, 29,139,105,202,163,139, 41,195, 65, 68, 99, 58, 38,163,148,201, 32,102, -183,188, 38,211,154,197,120, 68,145,229,196,190,199,112, 54,227,207,255,250,111, 49,142,203,249,249, 57,151,119, 2,126,243,236, - 45,174,106,168,106,197, 79,255,225,215, 24, 47,229,106,189,231,175,254,230,111,249,159,255,243,255,200,217,201,144, 42, 59, 48, - 72, 67, 28,173,153, 14, 19,190,248,225,167,150, 98,213,150,184,158, 29,229, 76,230, 83,166,195, 25,215,215, 75,170,166,227,226, -226,194,246, 42,189,128,206, 8, 30, 63,126, 76, 85,100,220,189,243,135, 28, 84,131,233,108,106,185,200,118,196,113,136, 67,199, -225,176,227,234,234,134,187,119,239,240,224,225,125,194, 40, 32,138, 67,194,208, 50,195, 79, 78,102,100, 89,113,124, 81, 85,103, - 77, 71, 73, 26, 35,112,112, 92,155, 0, 29,244,210,131,111,127,243, 53,160, 9, 60,151, 40,112,241, 92, 67, 28,121, 4,129,139, -235,120, 56,216,128,147,209, 10,140,194,161,163,174, 42, 58,199, 33, 30, 79,136,124,131, 39, 20,190,145,248,190, 64,116, 54,228, - 98,100,133,234, 90,219,203, 78, 99,194, 32, 96, 56, 8, 73, 18, 15,223,233,208,178,196, 19, 6, 71,216,189,152,242, 28, 90, 89, - 2, 35,251, 97,198, 82,239,234, 86, 35,117, 78, 45, 97, 50,157,226, 5, 49,119,238,222,195,235, 25,247,255,252,203,127,226,219, -111,174,217,110, 5,158,247,200, 6, 84,250,148,189,205,114,124,127,138,213, 90,247, 73, 91,250,218,161,215,159, 88,125, 43,120, - 80,146, 70,183,125,214, 65,160,164, 65, 42, 65, 81,117,236,183, 86, 26,146, 87, 57,163,209,128,170, 40, 24, 14,135,200, 70,177, - 89,173,109,117,172,170,153, 78, 39, 92, 87, 21,110, 47, 16,242,253,136, 78,203,163,208, 33,138, 7,253,196, 39,196,243, 4,111, - 95,191,225,111,127,246, 83, 28,223, 39, 43, 42, 6,211, 9,173,227, 80, 52, 45,121,109, 63, 91,195,196, 78,184,138,162, 56, 62, -148,215,155,125,239,228,238,216,239,183,189,167, 60, 98, 56, 30,217,189,175,128,245,118,195, 96,144, 32, 2,143,235,213,146, 32, -142, 40, 14, 25,105,146, 32, 92,167, 63, 96, 7, 92,204,102, 56,104,226, 56,230,242,206, 57, 81,224,225, 0, 39, 11,235,140,223, -108, 54,252,217,159,255, 37, 69,221,144,164, 3,254,251,255,225, 63,242,229,151, 95,242,201,167, 31, 65,167,249,217,207,126,134, -231, 58, 92,156,159,241,234,213, 43,194,192, 39, 10,124, 84,224, 35, 68,240, 61,106,218,177,112, 40, 63,112,241,221, 0, 47,112, - 17,198,161,145, 53,117,217, 16,198,150,133,224,238,172,172,201,243, 29,174,223,191,103,144,198, 96, 28,182,171, 43,242,225, 0, -237,248,248, 81,192,190,104,120,242,252, 29,198, 56,220,185,123,223,226,143,227,128,114,117,160,146, 26,237, 6,212, 74, 48, 25, -140, 8,226,148,172,146,104,199,146,202,194, 56, 33,106, 52,178, 19,184, 97, 66,160, 26,220, 48, 70, 54, 21,194, 13,113,132, 33, - 26,196,180,178, 35,244, 61,132,227, 19, 25, 67,208,223, 44,187,206,114,189, 45,234,212,252, 86,224, 79,247, 80, 39, 73, 89,218, - 53,200, 96, 48,232, 39, 2, 32,219,166, 31,143, 27,162, 40, 33,244, 2, 94, 60,125,110, 63,171,141,164, 42, 74,218,186,177, 36, - 76,165,200,243, 3,111,223,190, 70,184, 14,129,231, 51, 27,141, 24,164, 41,217, 33,103,189, 92,177, 59,221,130, 54,180, 77,141, -233, 15,248,105, 26, 51, 76, 99,220, 81,130,239,123, 20,249,129,210,119, 57, 89,156,177,205, 10, 6,131,132,179,179, 5,179,217, -140,174,235,120,254,252, 57,195,129,157,220,196,113, 76,158, 31, 48,157, 34,219,239,236,251, 42,181,161,102,109, 20,113, 24,160, -149,164,204, 51,238,221,187,199,229,229, 61, 94,190,124,201,102,179, 98, 52,122,136,231,121, 44, 22, 11,158,124,251,152,166,173, -136,227,152,229,178,166, 40, 10,162, 40, 98,155,229,228,101, 65, 81,102,120, 65,128, 49,157,173, 16, 26,133, 54,246,214, 45, 85, -131,231, 58,232, 14, 11,109,114, 28, 11, 96, 82, 29, 97, 20,161,180,164,170, 10,202, 50,103, 58, 29, 19,199, 17, 73, 20,146,101, - 45, 85,153, 51, 25,167, 54,148,105, 52,145,239, 17,197, 1,157,178,147, 57,207,117,112, 93,104, 26, 27,174,139,162,136,192,119, - 24, 14, 98,130,192,237, 13,115,131, 62,228,230,177,221, 44, 41,139, 3, 93,103, 41,134, 65,127,112, 21,184,120,190, 99, 9,154, - 70,209, 41, 3, 66, 19,133,182,118,189, 89,109,104,101,109,235,182,113,192,112, 48,166,110, 74,234, 58, 58, 30,168, 69, 95,233, -149, 82, 34,101,135,192, 34,180, 93,223,102,152,180, 82,223,243, 25,148, 57,218, 54, 29,239,223, 26, 33, 61, 79, 28,147,236, 6, - 27, 12,188, 61,108,252,118, 24,222, 24,219,203,239,180, 69,140,183, 74,218,181,184,146, 29,194, 56, 76,167,115,132, 27,241,238, -122,203,245,205,150, 67,118, 32, 78,135,108,182,246, 4,185, 94,174, 8, 67, 31,186, 22, 80,248,158,232, 69, 0,182,210,178, 89, - 47, 73,227, 31,161, 85,204,219, 87, 25, 97,224, 16, 5,150,185,125, 27, 20, 57,153,157, 80, 85,149,253, 2,239, 28,226, 36, 70, - 99,144, 66, 80,182, 29,218,241, 16,126, 76,232,105,238,156,186,204,135, 6,215,245,184,186,217,242, 79,255,245, 87,236,164,199, -233,197,132,225,240, 3,166,243, 57, 39,211, 1,141,172,137,163,128,200, 53,136,174, 37,112,236, 84, 33,138, 98,188, 48, 36, 63, -100,188,123,123,197,234, 80,178,218,150, 8, 66,222,189,126,129,163,106,100,167,121,115, 85, 48,158,206, 56,236,111,208,155,156, - 95,125,253,107,254,240,247,191,196, 19, 26, 7, 67, 85,150,120,174,224, 7,159,124,196,245,242,134,186, 42,137, 66,159,188,175, -151,125,252,241,199, 52,141,228,221,111,158, 48,157,206,184,119,127,129, 16, 46,171,205,142,155,155, 27, 94,191,124,206, 15,127, -248, 57,178,109, 64, 53,140, 39, 41,155,234, 64, 89,212, 12, 6, 35,206, 22, 39,172, 86, 43,164,106,137,227,144,217,108, 98, 31, -248,142, 71,118,200,251, 61,146,253,255, 78,167, 99, 70, 77,130, 82, 53, 65,232,247, 93, 79,151,178,204,185,188,188,192,243, 29, - 6,131,132,186,169,184,115,113,206,104, 60, 96,189,188,177,227,168,218,146,166, 58,165,142,114, 7,223, 3, 87,180, 76, 70, 54, -209,121, 50,139, 17, 66,242,241,135,119,240, 61,171,120, 13,162, 16, 41, 29,130,208, 67,155, 0,199,181,220,236,206,104, 92, 26, -206, 78, 78,145,213,152, 67,105, 67,105,127,244,135,255, 14,199,177,244,175,233,116,140,235, 64,219, 41,140,146,248, 81,108,233, -113,218,222,174,163, 52,225,213,171, 23, 76,230, 3,134,233, 8,180, 38,207, 54,148,213,158, 40,178, 1,192,237,206, 69,169, 26, -221, 89,200,131, 23,248,184,174,165, 64,117,134, 30, 64,209, 59, 69, 28,139,105,245, 92, 23,207,129, 32, 80, 84,109,113,236,163, - 54,170,163, 44, 36,235, 77,201,187,247, 43,150, 55, 54,133, 62,155, 77,142,183,138,231,207,159,243,226,197, 43,130,254, 36,255, -246,237,123,158,191,248,142,201,104,216, 59, 12, 44,229,172,105, 43,139,191, 20, 62,173, 50, 71,192, 73, 89, 87,212,157, 33,137, -125,102,231, 99,214,219, 13,187,162,182,166,185,209,144, 52,178, 59,211,195,222,170, 46,157, 94, 1, 28, 69, 17, 82, 53,204,166, - 39,253,190, 82, 28,149,165,121,158,219,219, 79,215, 17,165, 9, 6, 56,100, 5,211,201,136,217,108, 70,210,155, 9,187,174, 99, - 48, 24,144,166, 41, 85,110,237, 87,111,223,190,101, 58,180, 95,138,255,240,247,127,199,229,189,187,124,242,233,167,124,254,197, -151, 92, 93,223,144, 21, 13,227,233,140,215,175,223,242,139, 95,252,130,166,170, 88,175,151, 96, 52, 63,253,233, 79,185,127,121, - 7, 79,192,120, 60,100,144,218, 95,199,104,251,101,212,200, 22,227,250, 61,254, 85,209, 73, 59, 17, 26,248, 41,161,111,147,218, -214,133,125,202,124, 62,231,163, 79, 62,230,103, 63,251,217,113,239,126,254,195, 31, 50,137, 83,242, 74, 17, 37, 54,148,117,243, -238,134,217,100,193, 63,254,242,107,170,182, 34,153, 68,100,101,129, 27,198, 92, 62,120,132,208, 49, 85,107,216,101, 53,121, 89, - 80, 53, 13,171,245, 13,202,184, 76, 23,103, 72, 45, 88,156, 94,128,241, 16, 78,128, 17, 10,199,135, 40,140, 56,191,240,232,140, - 69,228, 34,236, 72,211,115, 5,157,108,143, 74,216,223,214, 2, 11, 33,240,130,240,152,124, 46,203,242, 8,146,186,189, 37,158, -111,215, 0, 0, 32, 0, 73, 68, 65, 84,109, 10,172,185,112, 56, 28, 50, 26,141,184,185,185,225,217,179,103,124,250,233,167, 22, -209,219, 83,222,182,187, 53, 93, 39, 9, 67,187,123,215, 24, 2,223,227,238,249, 57,223,126,251, 45,139,147, 83,138,162,224,233, -211,167,124,250,233,167,248,174,245,220, 95, 92,156,161,186,150,237, 14, 14,135, 61,158,107, 45,101,163,209,128, 15, 62,124,200, -246, 80,145, 23, 21, 47, 94,188,224,155,111,190,177, 46,250, 36, 33,142, 99,214,235,229,177, 15, 62,159,207, 57, 89,204,142,233, -115, 33,196, 17,223,123,255,254,125,138, 67,193,171, 87,175,104,251, 44, 80, 24,134,188,121,243,134,147,254, 22,175,148, 66,119, -112,126,126,110,123,245,251, 45,239,174,175,172,212,166,149,199,100,126,212,167,217,133,177,253,255, 91,189,243,109,223,253,150, - 70,232,121, 30,158,239, 80, 55, 13,203,229,146, 34,179,174,137, 60,207,123,104, 86,219, 31,122,107,174,175,175, 89,204,231,124, -240,193, 67,162, 40,161,147, 45, 93,103, 72, 79, 79,136,211,132,170,105,120,249,114, 99,229, 52,253,190,252,246,144,182,113,173, -189,240,112, 56, 28,255,249,249,249,185,165,240,169, 17,110, 21,244,200, 97,155,246,247,125, 59, 93,108, 91, 73,215, 35,100,147, - 36,166,174, 27,130,192, 39,138, 3,194, 48,160,110, 74,170,170,164,105, 19,164,146,100, 69,142,238, 4,202,208,127, 47,216, 10, -178,210, 26,209, 79, 16,149,214, 8, 97,215, 5,157,180,223, 90,230, 86, 28,136,232,233,127,208,182, 10, 33,156, 62, 59,212,179, -233,133,243,111,254,126, 44,196, 57,244, 89, 0,253,125, 80,238,250,253, 13,135,188,192,245, 66, 28, 55,161,235, 96,183, 59,112, -115,179, 99, 56,145, 8,199,238, 73,140,232,248,225, 23,159,225, 26,133, 54, 13, 97,224,224,184,128,177, 35,247,253,197, 28,199, -237, 48,166, 33,219,111,236, 31, 68, 42,242,195, 1,217, 9,140, 18,248, 97,196,102,119,160,200, 27, 70,163,136, 97, 50,102, 87, -108,121,127,179,226,217,245, 99,218, 70, 48,139,103, 60,152,133,252,224,226, 30,243, 81,194,213,245,146,236,176,167, 51, 2, 47, - 26,208, 34, 88,239,115, 94,189,122, 67,232,156,225,248, 14,219,108, 67,228, 26, 6,129,143, 23,248, 28,154, 12,227,197,228,251, - 3,141, 59,228,193,163,143,104,158,189,165,150, 14, 79, 94, 94,179, 89, 29,240,177,157, 72, 39, 28,178,201,107,226, 32,229,131, -143, 46, 73, 19,143,166,105,153,204, 6,104,213,146, 68, 94,239,138, 30,245,227, 23,197,108, 54,195,113, 93,139,252,236,149,163, - 47, 95,190, 36,203,114,194, 40, 1, 28,190,254,215,223,176, 90,173, 72,227,144,199,143, 31,243,225, 7,247,240,125, 23,211,117, -120, 78,111, 4,210,118,180,186, 88, 44, 64, 24,246,251,253,145,105,221, 52, 37, 77,221,242,171, 95,253, 43,155,205,134, 59, 23, -119,249,225, 23,159, 19, 69, 65,175, 47,213, 72,217,144, 23, 89,223, 87,213,180,117,197,112, 52, 96,234,141, 56, 61, 59, 33, 12, -125,100, 91,161, 84,203,110,179,239, 33, 33,138,147,147, 57,161, 23,208,117,138, 71, 15,239,216,169, 64, 45, 73,146,132,253, 46, - 59, 2, 40, 28,199, 26,210,164,148, 4,241,173,194,213,246,102,203, 50,199, 21, 18, 85,231,116,170,166,169, 10,146,193,132, 15, - 31,221,195, 13,110,117,167, 45,142,177, 31,174, 14, 59,186,195,245, 65,219,155, 99, 28, 43,102,243, 33, 66, 84, 28,246,133, 37, - 82, 57, 13,227, 73, 76, 16, 10,178,253,134,217,164,207, 21, 56,246,164, 42,101,135,146,198, 42, 81, 93,135, 60,175,108,213,202, -241, 16, 56,232,174, 67,104, 31, 63,177,251,106,207, 3,227,118, 72,165,112,220, 14,215,241, 48,194,163,149,182, 50,115,118,118, -198, 98, 62, 71,247, 95,126, 55, 55, 55, 54,212,105, 58,242, 60,231,237,219,183,188,123,247,142,209,224, 99,130, 32,166,145, 53, - 56,130,225,104, 68, 16, 68,232,206, 97,187,207,121,243,238, 13,223,124,251, 27,134,211, 9,218,113,145, 66,208, 54, 45,194, 15, - 80, 70, 18,248, 22,212,179, 92,111, 45,137,170,179, 95, 62, 89,153, 17,199, 17,243,249,140, 52, 29,144,196, 3, 94,191,126,205, -110,183,163,105, 26,194, 56,162, 44, 75, 58, 99, 31,152,117,213,210,246, 59, 71,109,132,213,223,222, 50,222,101,199,120, 60, 56, -226,157, 47, 46, 46,152, 15, 18,246,187, 53,195, 65,194, 96,144,176,223,239,249,245,175,127,205, 55,143,191, 99,159, 87, 4, 97, -202,251,155,165, 85, 10,247, 59,111,165, 90,162,208, 30,198,159, 62,254,150,192,119,237, 67, 97,102, 71,151,243,197,194, 78, 53, -148,230,233,203,215,164,113, 72,211, 52,180,109, 75, 41,155, 35,108,230,246, 97,104,122,112,199,155, 87, 1,111, 95,191, 66, 41, -197,221,187,119,249,244,227, 79,152, 12, 71,108,150,239,105,181,224,144,151,172, 54, 7, 12, 9,207, 95,188,198,120,130,250,245, - 1, 17,120, 12,134,115,162,120, 66, 85, 64, 81,212,100,133, 2,211,242,252,249, 51,138, 50, 3, 2,146, 81,136, 52,138,100, 52, - 69, 73, 67,221,182,148,149,253,108,232,206,161, 51,142,149,141,116,182,255,155, 6,246, 64,140,238,190, 23, 38,245,234, 99, 99, -122, 72, 73, 31, 18, 13,252,136, 46,176, 7,167,186,106,143, 15,234,180,255, 92,164,201,128,211,197, 25,207,158, 60, 97,179,217, -176, 93,111,168,235,154,162,200,143,225,175,182, 53,132, 33,148, 85, 1, 66, 80, 87, 6,207,117, 57,236,115,202, 48,199, 19, 14, -155,213, 18,255, 7,159,243,240,225, 67,222,189,123, 71,224,185,164,131,152, 7,247, 47, 45,146, 84, 43, 86,235, 27,246,251, 61, -101,153, 19,134, 17,203,213,166, 79,238,187,253, 97, 19,148,178, 19,216,205,106, 77,118,216, 49, 24,218,144, 98,146, 36, 12,135, - 3,202, 44,255, 55,160,160, 66,119, 68,129,199,126,187,166, 40, 10,138,220,174,147,118,235, 13,206, 39,159, 48,153, 91,244,243, -100, 54,179, 73,121,223,122, 30,242, 50, 35, 12,237,138,193,174,193,172,141, 48,142, 45,111,126, 60,182, 65,229, 65, 24,247,235, -214,222,137,209,179, 2,110, 89,247,247,238,221,195,243, 60,203,203, 15,173, 84, 39, 47, 60, 38, 35,123,203, 86,109, 3, 61, 71, - 93, 43,137,233, 12,174, 7,109, 91, 97, 58,133,106, 43,154, 42,255,190,210, 39,192,245, 92,155,204,167, 35,207,118, 22, 73, 28, - 71,204, 79, 38,125, 46, 7, 16,134,170,178,160, 52, 33, 12,190, 31,246, 85,229,186,111,107,180,220,187,119,137,227,120,140,199, -103,204,102, 86, 1,123,117,117, 67,219,214, 71, 36,241,118,119,160,174,228,209,223,224,186, 2,199,183,123,121,139,165,182,171, - 67,237, 71, 24, 35,144,141, 21, 72,217,149,136,119, 76,177,127,159,126,119, 64, 24,148, 84,255,205, 20,252,237,223,111,179, 0, -183,106,104, 33, 92,188,191,254,127,254, 63,156,126, 17,223,106, 67, 52,152, 48, 28,141,104, 59,143,178,104, 0, 69,146,134, 8, - 26, 46,207,167,116,170, 36,219, 55, 22, 74,175, 5, 82, 73,124, 87,112, 50,155,114,245,254, 53, 90,106,210, 52,228,244,236, 4, - 28,203,244,238,180,225,253,234,134,178,168, 45, 85, 78, 89,185,252,102,183, 97,118,186,192,197,193,237, 12,170,170,185, 89,191, -160,190,106,120,114, 71,163,234, 1,219, 93,206,219,171, 13, 65, 20, 18, 13, 71,148,242,192,183, 79,159,115,184,126,131, 43,126, -151,139,243, 57, 85,126,224,116, 50,230,234,122, 69, 28,184, 36,113,138,208,214, 26,167,124,248,226,179,143, 45, 57, 44,171,109, -152,205,141,112, 93, 7,105, 36,173,180,238,241,233, 60,229,242,242,146,159,252,232, 67,140,204,137, 66,168,178, 22,215, 15,209, - 82,163,113, 9,194,132, 34,175,241, 67,203,125, 63, 20, 37,203,229,178,175, 76,105,118,251, 61, 74, 67,213,212,124,247,236, 5, - 82, 67,219, 57,252,237, 79,127,206,116, 58,231,124, 49,226,230,250,154, 36,114, 24, 13, 18,138,170,196,241, 7,220,187,188, 67, - 94,236, 80,173,125, 35, 53, 77, 71,158,183, 4,126, 74,211,184,172,215, 21, 66,108,153,159,237, 24, 12, 99,186,206,174, 64,170, -170,166,204, 53,142, 19, 80, 21, 25, 93,157,227,168,150,243,179,115, 27,168, 17,176, 56,155, 80,213, 5,187,253, 13,166,115,208, - 82, 49, 8, 19, 34, 63, 64, 33, 9, 35,155, 84,141, 99,159,178,174, 80, 90, 83, 22, 21,116,154, 36,137, 16, 2, 59,254,206,235, - 99, 10, 94,120,174,221,169,251, 14,203,229,210, 18, 6,165, 66,182, 29,109,147,147,229, 55,125, 55, 92, 99,180, 37, 69,117, 90, - 90,106,153,212,180,202, 65,247, 50,140,197,108, 72,190, 95,113,243,126,205, 98,113,106,235,125,126,120, 12,137, 44,175,111,122, -181,145,238,199, 90,210,166, 72,221,160, 15, 63,218,209, 22,158,197,147, 26,173,145, 97,136,239, 65, 58,136, 8,210, 24, 28,141, - 68,147, 26,112,188, 4, 97, 34, 62,120, 96,111,203,190,239,147,142,198, 76, 70, 67,174,151, 43,190,253,205,119,196,113, 76,215, - 9,132, 27,145, 21, 53,235, 77, 78, 89, 73,162, 4, 58,133, 61,164, 74, 67,173, 26,118,135,130, 44, 47, 41,234, 6,105, 32, 76, - 71, 52, 58, 35, 47, 45,138, 54,239, 43,162,233,208, 6,146, 42, 99,147,201, 66, 91,204,228,116, 52,238,111, 38,146,193, 64,240, -254,253,251,126, 58,163,208,152,227, 13, 3,173,145,170,225,234,221, 59, 58, 58,226, 40, 66,213, 13,198,129,217,249, 37,174,235, -242,238,221, 21,131, 36, 37,158,140, 49,202,142, 23, 15,101,133, 84,134, 14,135, 7, 31,124,204,225,144, 17, 37, 9,173,252,150, -193,104, 76,219,216, 91,137,231,249, 36, 73,140,238, 36,211,233, 20,173, 90,132, 48,199,190,244,106,189,103,189, 57, 32,165,100, - 60, 30, 51,157,206,168,219,150,170,105,105,149,194,247, 67,107,185,235,115, 0, 77, 99, 73,120,183, 18,151,170,105,121,254,242, - 21, 81,146,218, 60,135,231,243,243,159,255,156,193, 96,196,253,187,231, 44,206, 47,185,190, 89, 83,212, 26,189,221, 33,252,136, -170, 46,136, 70, 19, 26, 41,217,237, 75,188, 18,208, 17, 32,108,253, 42,136, 64,215, 12,194,136,162,146,100, 85,197,104, 60, 32, -242, 35, 54,213,142, 48,182, 59,237,174, 23,133,136,174,235, 39,102,216,196,179,112, 25, 12,199, 8,244,113,165,163,122,158,189, -214,244, 19, 30, 77, 43, 45,116,200,138,133, 60,132,235,144,244,235,159, 44,223, 50,159,206,142,235,177, 32, 74, 44,241,176,145, - 12, 71, 19,178, 34,183,191, 15, 47,196,235, 45,200, 85,255, 0,238,148, 98,185, 90,115, 50,155,179,218,110,112, 93,151,213,122, -201, 87, 95,125,197, 31,253,209, 31, 17,134, 33,249, 97,143,112, 12, 97,228,245,187,241,239,199,182,155,205,134,139,203, 7,124, -246,233,135,204,103, 35,158, 62,125,202,227,223,124,195,249,249, 57,187, 32, 56, 86, 27,165,148,200,186,225,213,171, 87,200,186, -182, 18,151, 40, 98, 48, 24, 48, 24, 12,209, 90,114,114,186, 96, 33, 78, 45,253,179, 23, 71, 93, 93, 93,177, 88,156,113,117,253, -142,205,102,213,143,242,115,182,219, 45, 66,184,118,103, 29,250, 12,210,132,179,179,115,242, 50,231,230,122,137,233, 58,198,195, -148,100, 56, 56, 98,178,227, 52,196, 17, 3, 48,230,104,182, 84, 93, 75,103,212,145,183, 33,132,176,135, 19,225,144,164, 17,103, - 39, 11,138,216,230, 17, 22,243, 19, 54,235, 45,176,101, 50,153,208,117, 29,207,158,191, 96, 52,181, 65, 78,227, 56,120, 97,104, -123,236, 64,213,243,232, 39, 19,171,147, 61, 57, 57,177, 25, 17,236, 65,190,109, 91,116,103,136,226, 33, 82, 27,170,182, 57,130, -190,108, 30,167,237,219, 2, 54,135,147,101,153,133,219,244,130,157,186, 46,109,216,207,119, 48,149,229,228,239, 14, 5, 65, 16, -145, 14, 70,246, 70,221, 73, 75, 49,148, 28,199,243,129,112,113,132,143,145,138,174,233, 80,218,161,243, 12,142,168,123, 35,229, -237,196,200,138,114, 92,199,183,239, 85, 64, 11,141, 99,110,147,252,110, 31,160, 21,223, 99,198,133,165,119,186, 31,207, 47,255, - 55, 45,236, 30,236,237,205, 27,140,163,249,227,255,240,159,200,246,146,221,182, 36,240, 67,132,105,248,241,143, 30,177,152,251, -140, 19,193, 97,117,205, 97,153,225, 26,143,182,105,105,170,134,166, 31, 53, 57, 2,230,243, 19, 27, 98, 24,142,240,147, 4, 47, -138,113,195, 0,227,185,228, 85,129, 54, 29, 97, 28,176,219,103,108,183, 5,171,235, 13,179, 36,225,100, 16, 50, 9, 5,179,212, -103,191,219,146,213,154,199,175, 86, 92,237, 26,170, 78, 83,181, 37,170, 83,168,206,160,140,224,233,203,215,184, 66, 48, 25,143, -169,165,194,245, 3, 90,165,193,243,236,137,219,116, 12,134, 3, 2, 15, 62,250,224, 33,158, 35, 40,243,130,186,106,216,108, 51, -134,131, 41,174,227, 51, 29, 13,113,168,121,246,236,215,156, 44, 18,123, 91,111, 43,148,180,169,109,169, 61,148,242,104, 90,104, -165, 13, 88,229, 85, 97, 95, 0, 35,216,110,119, 92, 45,151,212, 74, 49,156, 76,121,249,246,138,215,239,151, 40, 2,202, 90,144, - 14,103, 84, 69,205,189,187,247,136, 60, 23, 97, 26,186,122,143,106, 42, 75, 35,194,224,123,130, 67,182,167, 40, 74,118,251, 6, -213, 37, 92,223,212,252,250,235,215,184,254,152, 86, 25, 90,173,153,159,157, 80, 52,149,229,173, 43,129,238, 34,140, 52,248,186, -192,105,115,238, 45,230,140,210, 20, 35, 4,218,215,212,228,132, 3,143, 36,244,168,178,140, 54, 83, 76,135, 83,124,225,162,100, - 67,171, 50, 91, 65,209, 1, 55,171,130,119,203,150,178, 13,168, 91,159,172,182,146,130,215,111,222,224,121, 62,174,112, 41,242, -138, 50,175,169,139, 14,215,139, 41, 42,201, 33,107,104,106,155, 48, 23,248, 56,194,163,174, 90, 58,213,145,231,133,213,168, 26, -135,166,110,112, 52,100,251, 29, 47, 30, 63, 37, 9, 28,230,163, 1,190,176, 86, 57,215, 56,232, 22,124,199,231,222,229,125,246, -251, 3,158,227,161, 84,103, 9,117, 65, 64, 18,199,160, 13, 85,158, 91, 19,147,210,125,162,183,165, 81, 13,126,232,176,221, 46, - 25, 4,214, 37,160,101,131,148, 53,121, 83, 34,141,102,189,217, 34,235,154,174,168, 9,208, 32, 90,242,195, 22,215,179,225,175, -166,131,162,150,180, 18,118,135,146,188,168, 41,202,150,249,201,130, 48,142, 57,100, 37,181,106,201,138, 10,225, 7,252,243, 87, -223,240,242,237, 91,118, 69,206,124,113,138,235,249,212,109, 67, 93, 86, 54, 68, 21, 70, 12,146,148,170, 44,168,235,138, 56,137, -112, 92,129, 70, 51,155,204,232,100,199,110,187,227,211, 79, 62,163, 40, 43, 14,135, 3, 65, 20,114,117,115,131, 31,250,180,170, - 37, 14, 67,164,108, 81,109,205, 98, 50, 99, 58, 72,145, 85,133, 81, 10,207,241,153, 77,167, 20,121,142,193, 48, 30, 12, 40,139, -130, 7, 15, 30,224,120, 22,129,187,203, 11,106,217,145, 85,150,214, 40, 53,188,124,251, 30,169, 58,170,170,197,115,125,134,163, - 49,201, 32,193,117,125, 14,135,156,178,149,104, 44, 49, 82,118,112, 40, 27,140, 27, 64, 16, 81, 52,138, 67, 89,179,218,238,185, - 89,111,168,218, 26,131, 67, 85, 55, 28,178,156,166,149, 40,173, 45, 62,180,211, 8,199, 69,117,118, 55,221,202,142,182, 85, 20, - 69,133,236, 58,174,175,222,129,209,204,230,115,218,182, 99,119,200, 9,162, 20, 63, 12, 40,234, 26, 37, 65, 56, 65, 15, 91, 50, - 20, 77, 77,150,231,180,157,228, 80,228, 20,101,201, 46, 43, 56, 84, 37,194,181, 63,251,178,174, 72,146,184,255,245, 90, 58,173, -105,218,150,186,175,138,185,142, 79, 20,220, 30, 88, 53, 70,120, 52, 82, 99,112,201,203,146,206, 96,209,190,218,160,180, 70,117, -154,186,170,201,202,146,186,110,168,218,150,195, 33, 99,179, 93,163,181,162,149,146,249,201,156, 48,138, 89,173, 54, 24,224,236, -236,146,166, 85, 20,101, 69, 81, 86, 52,117,139,227,123, 68, 97,140,113, 44, 3, 68, 32, 8,194, 16,207,247, 56, 57, 57,193,245, - 60,226, 56,225,237,219,119,204, 78,230,248, 97,192,175,191,254,138,151,175, 95,242,228,241,119,188,123,255,158,229,114,201,171, - 87,175, 56,108,246,253,148,105, 6, 90, 49, 76, 34, 78, 79,102,156,206,167,140, 6, 9, 81, 16, 80, 21, 57,243,233, 4, 71, 56, -232, 78,113,121,231, 14,195, 62, 15, 80,151, 53,135, 44,227,233,243,215,252,243,191,124,197,179,231,207,121,250,228, 59,222,190, -125,195,114,117,205,251,247,111,113, 93,195,108, 54, 97, 52, 74, 81, 82, 34, 48,124,240,225,199,180,173,194,243, 67, 86,203, 37, - 85,145,161,154,138,221,118, 71, 93, 21, 76,166, 83, 58,109,219, 2,251,237,150,116,152,226,186,142,213, 64, 47,175,123, 11, 99, - 68, 16,250, 12, 71, 35, 78,102, 51,116,215, 81, 22, 25, 39,243, 25,157,146,212, 69,193,205,213, 53,117, 89, 49, 72, 71,220, 92, - 47, 41,202,134, 23, 47, 94,113,178,184, 96,189,217,243,175,143,159, 96,132,207,211,151,111,216,238, 11,148,118,208, 90,144,229, - 37,101, 89,163,149,166, 83,154,245,205,141,205,200,244, 23, 18, 99, 28,174,175,110,216,110, 51,178,188, 36, 47, 27,170,166, 97, -191, 63, 96,132,237,237, 87, 77,133,236, 36,142,235,129,112,153, 76,103,125,175, 60,100, 56, 28,225,186, 14,135,108, 71, 20, 5, - 76,230, 83, 84,215, 49,155, 47, 88, 44,206,216,110, 14, 68,126, 64,232,251,180, 77, 9,170,195, 40,219,158, 49,170, 35,114, 2, -140,212, 52, 89, 75,153, 73, 60, 47,165, 40, 42,139, 65,238, 42,186,182, 64, 53, 53,105, 52, 96,183,201,108,179, 9, 67,219, 53, -104, 52,157,238,168, 27,133, 75, 68,211, 26,164, 54, 20, 85, 69,211,175,105,163, 32,192,187,188,124, 64, 81,110,136,135, 49,110, -164, 88,111,118,108,151,239,153, 79, 71, 28,182, 7,100,221,224,208, 49, 73, 60, 92, 93, 82,231, 13, 62, 45,186, 41,185,222,236, -241,227, 4,124, 23, 23, 67,228,121,180,141,164,104, 75,146,193,144, 65, 18,179, 43, 26, 28,223,197,119, 2, 38,190, 79, 20,125, -132,238, 36,129,235,177,221, 23,252,197, 95,252,140,243,243, 59, 60,188,123,143,211,105, 74,232,104,162, 80,208,202, 6,141, 97, -118,241,136,245, 62, 39, 28, 92,241,234,221, 13,187,172, 68,227,112,231,226, 14, 95,254,224, 99, 38,129,226,236,100,142,239,193, -116, 50, 32,240, 4,129,239,210,148, 5,121, 85,131, 41, 25, 71, 41, 78,212,225,202, 61,186,216, 16, 26, 24,132, 46,158,176,187, - 11,161, 21, 89,190,197,161,225,155, 95,255,138,192,249,132, 97, 28, 81,229, 21, 46, 33,198,184,120,194,238, 80,253, 64,160,197, - 45, 70,215,144,149,182,166,242,232,225,125,158,191,126, 67,158,219,113,155,112, 60, 92, 17, 50, 72, 82,246, 89,129,163, 87,108, - 54, 57, 31, 61, 58,161,206, 90,218, 58, 67, 8,135,186, 82,136,192, 65,170,138,170,169,169,106, 73,171, 2,170, 66,241,226,197, -138, 44, 43, 72, 6, 41,169,239,225, 56,222,209, 34,228,251, 49,170, 3, 69,130,107, 58,226, 4,146, 88, 16, 8,137,223,213,180, -198,160, 91, 48,142, 5,208,196,177,195,201, 98,140,104, 11,100, 93, 81,123, 14, 65,236,160, 28, 48,142,224,213,203,119,188,191, -170,241,194, 25,186,182,216,205, 48,134,229,106,203,157,179, 19, 60,215,178,161,235,178,197, 49, 54,128,242,238,237,123, 70,147, - 49,126,228,115,200,247, 20,117, 5,102, 79,212,187,162,165,108,240,124,135, 40,112,113,232,104,155,130,233,120,198,195,123, 23, -232,186, 66, 86, 25,163,228,146, 59,151,247,249,135,191,255, 37,223,252,235,215,248, 94, 66, 81,182, 60,123,250, 4,165, 59, 92, -207, 48,159, 79, 49,231,103,120, 62,212,165, 93, 11, 52,117, 65, 91,230,140,135, 19,180,240,240, 2, 15, 28, 65, 86,102,220, 92, - 95,145,186, 14,225,249, 25, 93,215,224,165, 33,149,106,105,202, 10,215,241,233,100, 75,181, 47, 81,117, 67, 50, 30, 80, 52, 21, -110, 48,196,245,236,159,107,159,213,104,199,101, 52, 91, 88,151,188,240, 88,111, 51,214,187, 45, 85,157, 49, 24, 13,216,103, 59, -138, 55,111,216,229, 57,233,104,116, 68,209,110,246,123,155, 24,143,162, 99, 82,213,250,226,125,232, 59,205,118, 4, 58, 36,219, -239,217,111,115, 62,251,244, 7,108, 54, 27, 54,187, 45, 56,130,237, 97, 79, 58, 76,143, 42,202,188, 42,145,141,228,252,116,206, -151, 95,252,128, 52, 78,120,255,246, 45,171,205,134,186,149,199,164,239,108, 54, 59,238,171,227, 56,166,174, 90, 54, 7,171,229, -196,243,217,229, 37,113, 92,219,241,240, 62,195,117, 93,254,243,127,248,143, 40,165, 88,173, 86,188,123,103,113,181, 81, 20,225, - 6, 1,117,219,241,250,253,245, 49,205,172,112, 16,170,183, 14, 10,151,166, 51, 20,117, 77, 68, 72,164, 59,188,192, 39,113,135, -199,253,254,109,255,155,223,234,175,223,102, 53,186,206, 54, 8, 78,207,207, 72,135, 67,132,112, 57, 57, 61, 67, 27,123, 3,204, - 14, 57,121, 94,146, 21,246,247,131,227,226,122, 30,141,178, 60, 3,167,118,143,188,119,139, 78,246,168, 91,137, 49,182,199, 28, - 42,219,246,168,170,222,231,142,205, 46,180,141, 34,207,182,212,117, 77,211, 52,212, 93, 69, 18, 37,120, 61,116, 69,202,246,184, -211,117, 93,215,246,175,173, 6,201, 26,251,234, 26,217, 35,148, 45,219,209,224,230, 5,179,217,142, 48,140,251, 91,103, 0,142, -139,236, 44, 28,196,113, 60,106,217,178, 63,236,137,162,128,225, 48,198,113, 60, 58,163,216,239,247,100, 89,198,163, 71,143,108, -202,186,211,156,159,159,179,223, 91, 11,219,253,251,247,249,139,191,252, 51, 84, 43, 81, 93,195,120, 60,182, 34,173, 60,163,149, - 53,207,159,126,215,239,234, 45, 85,174,105,236,141, 80,224,218,181,104,191,210,211,154, 99, 59,194,114,214, 91,188, 32, 36,136, - 6, 8,199, 99,183,219, 48,158,164,164,113,194,245,205, 91,164,148, 76,167, 67,162,200, 99, 58,181, 12,250,175,126,253, 13,143, - 31, 63,182, 48, 42,225,219, 85, 88, 83, 50,136, 38,148, 85, 65, 34, 34,190,253,230, 43, 6,227, 17,174,227, 19,248, 46,168, 22, -213, 1,198, 26, 48,187,206,240,226,197, 11,180,214, 60,120,240,128,174,135,209, 8,236,235,190, 89,174, 44,212,169,211, 22, 4, -118,200,169, 27,201,187,247, 75,118,217,129, 70, 90, 36,242, 96, 52, 38,173, 91, 12, 30,219,172,196,236,246,104,173,112,141,177, -181,232,182,161,169,106,210, 52, 38, 74,236, 90, 43, 8,237,207,221, 24,129,209, 2, 41, 53,198,149, 71,227, 91, 85, 85,228,185, -173,145, 6,158,111, 95, 35,165,173, 34,182, 82, 40,153,225, 56, 14, 97, 24, 80, 22, 53,211,147, 41,117,213, 18,198, 17,178,145, -228, 89,197,124, 58,229,252,252,156,237,230,134,182,170,112,133,196, 17, 48,136, 67, 92, 92,146,208,161, 41, 21,251,205, 53,174, - 27, 83, 87, 2, 33, 36,243,249,200,174,125, 7, 99,170,170,193,243, 12,159,127,254, 0, 45, 60, 30, 63,123,138, 27,244,129, 78, - 37, 72, 34, 91,191,117, 29, 31,133,180,170,103,221, 81,151, 57, 3, 79,224, 93,158, 77, 41,107,135,225,216, 1,103,206,203,151, -111,112,117,195, 52,141,201, 70, 30, 95, 63,251, 53,101,185,230, 15,126,124, 70,114,113,142,235, 5, 36,231, 11, 92,229,177, 94, - 23,120, 81, 66, 50, 26,178,223,239,109,160, 43, 77, 88,156,158, 16, 68, 41, 55,235, 13,129,159,224,120, 1, 89, 99,181,140,147, - 36, 65,170,150,186,172, 48,178,229,242,254, 61,150,171, 13,223, 62,249,142,193,239,124,198,252,108,138,105,115,100,117,192,113, -193, 53, 45,139,129,199,157,223,249,132, 31,125,246,144, 86,193, 62, 47, 8,195,132, 63,254,239,126, 15,157,173, 24,197, 46, 89, -182, 39, 68,210, 85, 53,109,165,233,186,150, 8,193,249,157, 51,148,118, 41,155,142,212,147,156,205, 2,252, 32,101,185, 58,176, -220, 92,147, 78,206,240, 28,201,120, 16,144, 36,115,100, 91,179, 93, 47,185,252,236, 83,146,192,167, 42, 90, 48, 2,223,209,120, - 65,128,112, 58,140,232,240,251, 68, 48,210,166, 94,199,195, 1, 93,219,112, 54,155,112,121, 49,160,200,106,174,175,183, 22,114, -225, 89, 45,229,111,190,123,194,229,197, 24, 63, 26,208,202,146,125,158,225, 5, 49,180,130,172,104, 57,100, 27,182,135, 61,190, - 23,163, 85, 72, 83, 93,115,113,234, 19, 68,130, 32, 0, 95,231, 52,251, 13,178, 83, 22,138,160,192, 73, 3,156, 56,101,120, 18, - 49, 26, 57,132,158,193,117, 27,252, 78, 35,180,193, 32,161,105,241,133,199,201,124,140,144, 62, 77,103, 71, 98,110,152,160,148, -193,193,225,221,219, 37,203,181,228,242,114,129,108, 27,164, 60, 16, 37, 62,231,231, 19,222,190,126,198,167, 31,126,132,239, 6, -108,214, 59, 22,243, 57,217,126,201,226,100,128,240, 32,241, 67,242,131,198,117, 61,154,186,195,117,106,220,192, 39, 74, 60,202, -252, 0,174,101,206, 43,157, 33,220,132,225,120,200,228, 36, 97,183, 41, 48,162, 98,190, 72, 24, 12,125,138,106, 67,154, 40,132, - 11, 90,214, 12, 6, 9, 74,181, 36, 9, 68,145, 38,140,124, 28, 28, 30, 61,122, 96, 15, 56, 82, 19,184, 17,218,113,233,162, 0, -169, 59,174,175, 86,228,155,221,241,131,155,166, 67, 90,161,144,173,162,168,106,210,216,165,213,202,186,161,103,115,234,174, 38, - 29,143,216,231, 13, 79, 95,188, 98,185, 41, 48, 78, 64,146,166, 22, 11,106, 58,154,182,162,106, 75,124, 95,208, 42,201,114,189, - 98,185, 89, 66, 31,154,186, 69, 71, 22, 69, 65, 35,219,227,158,176,105,154, 35, 25, 75,120, 46, 81,154,224,246,170,199,219, 32, -208,131, 7, 15,108,192,106,117,141, 49,134,178, 42,145, 74,114,126,126,206,211,103, 47,136, 34,187,102,112,177,169,218,215,175, - 95, 51, 76, 7,164,113,204,151, 95,126,201,211,231, 47,120,251,238, 29, 74, 41,134,195, 33,203,229,178, 23, 45,149,150, 30,214, -143,137,111,109, 90, 65, 16,176, 90,173,142,204,239, 39,207,159, 81,150,229,241,203,222,241,237, 3, 72,150,197,177, 98,116,171, -197,188, 77,137, 3,168, 64, 30,107,124,117,221,176, 94,111,142, 93,225, 91,221,239,109, 15,248,183,255,114,156,230,216,183, 13, -253,136,178, 40, 25, 60, 24, 17, 6,241,145,211,189,219,237,144,178,179,107, 10,215, 50,190,113, 92, 60,223,167,150, 54,155,225, - 7, 17,162,207,161, 4, 81,136,231,210, 87,166, 36,198,235, 9,140,194,253,126,101,212,227,105,253,192,208,105, 7, 93,106,218, -174,197,119,253,227, 72,117, 52, 26,161,148, 60, 62,212,133, 16,100,123,139,237,237,180,252,158, 57, 81,245,108,115, 4,190, 3, - 65, 96,119,202, 73,146, 28, 3,151,195,161,197, 43,239, 54,235,227,104,191,235, 95,139,219, 7,112,221,148,220,187,119,143,247, -239,223, 31,215, 22, 74, 41, 78, 78, 78, 88,175,215, 76,103, 51, 62,254,236, 83,158,190,120,202,126,187, 37,142,173, 41,205,254, -185, 67, 58, 12, 55, 55, 55, 71, 27,222, 45,140,196,202,114,130,158,107,209,245,166, 52,203, 7, 56,190,206,174,203,201,201,130, - 32, 74,184,123,121,201,195,187,151, 68,177, 69, 13,127,254,131,143, 25, 36, 41, 95,125,253, 47,252,221,223,253, 61, 31,126,248, - 33,179,147,211, 62,188,229, 16,133, 49, 85, 85, 91, 2,165,136, 72,211,152, 15, 63,124,132,231, 59,140, 39, 67,174,175,175, 9, - 3,203,252, 87,117,193,249,249, 57, 56, 1,219,237,222, 38,184,181, 97,183,219,177,221,108,216,237,118,120,158,199,120, 60,198, -243, 67,132,235,211, 42,141,106, 91, 68,150,227,123, 97, 47,182,241,184,115,239, 46, 39,243, 5,239,175,175, 56, 61, 61,167,211, - 86, 99, 90, 87,253,148,216,129,232,214, 42,105, 12, 56,130,113, 63,158,175, 91, 73,117,179,194,104,203, 79,137,227,196,166,245, - 27,251,115,239,100,135,106,109,115,199, 86, 2, 45, 76,108, 56,152, 16,199, 41,142, 8,122,124,120,132,210, 10, 28,159, 36, 25, -145, 36, 54,116, 92,118, 21,210, 83,204, 23, 39,184, 30,108,214, 55,204, 79,134,180,117, 73, 85,231,184, 78,108,107,158,142, 34, -142, 6,164,169, 97, 56,137,137,166, 3,178, 98,199,239,255,193,135, 12,210,128, 97, 18,246, 23, 67,151,209,100, 65, 94, 72,214, -251, 55,188,187,186,198,245,195, 62,100, 87,245,104,247, 14, 89,238,112, 93,219, 70, 19, 77,137, 39, 5, 30,180,140, 6, 49, 70, -151, 12,210,132,251,119, 47, 49,170,161,170, 86, 68,110,199, 79,126,247,115,126,254,243,191,161, 58,108, 41,246, 41,157,172, 64, - 11,132,238,152, 77,173, 46,114,249,254, 29, 89,182,231,179,207, 62, 99,190, 56,101,179,222,209,116, 10, 35, 59,110,150,239, 8, -227, 1,187,221,225,216, 3,150, 82, 82,229, 5,101, 43,185,188,152, 49,157, 37,140,227,128,182,217,178, 93, 23,140,210,128,211, - 89,138,227, 88, 53,166,112, 52,195,129,143,118, 98,180,227,243,252, 69,197,155,183, 47,184,121,125, 74,168, 11,188, 65,132,150, - 13,142, 31, 35,187,230,200, 81, 79, 6, 49,217,126, 13,110,200,112, 56,227,247,127,252, 57,191,243,197, 15,241,195,132, 39,223, - 61,231,159,127,253, 45,211,211,115, 52, 48, 25, 95, 18,199,224,137,134,195,246,138,201, 56, 97, 52, 76,185,122,123, 69,224,218, -174,161,227,185,148,165, 36,175, 10,194, 96,192,100, 28, 19, 24, 31,163, 5,194,116,184, 90, 97,218,146,209,100,194, 32,116, 88, - 33,169, 15, 27,146, 56, 5, 45, 88,175,215, 24,225, 19, 15, 98, 26, 89,209, 30, 90,158, 60,121,131, 22,224, 58, 5,105,234,226, - 56, 6,223, 83, 12, 71, 67,134,241, 5,179,233,226,216,167,212,166, 35,138, 67,234,218,193,104,151,213,126,139,118, 66,226, 20, -162,113, 66, 58,246,240,122,250,147,167,251, 30,187, 27,208,200,214,254,187,137,199, 96, 50,160, 40,107, 68, 4, 45,109, 47, 36, -241,209,120, 68, 97,128,239,248, 40, 26, 6,147,136,233, 60,224,193,221, 57,170, 94,243,205, 55,255,202,199, 15, 63,102, 52, 24, -128,238, 24,164, 17,243,217,136, 74,181,108,179,140,236,176,226,225,195, 15, 24,222,155, 29,245,132, 97, 24,130,152,247,166, 34, - 67, 93,159,145,198, 9, 81, 20, 19,134,143,112,197, 67,246,187,107,242,195,150,179,179, 41,191,243,197, 39,148,133,194, 15, 45, -179,221,186,142, 33,140,122,238,189, 35,216, 32, 89,156,206,108, 8,171,145, 4, 94,136, 52, 32, 34,251,222,240, 60,107, 52, 27, -184, 1,163,225,192,178,249,219,134,241,104,206,252, 44, 68, 54,138,213,251, 37,104,135,208, 15, 8, 67, 15,165, 21,178,169, 8, - 60,152, 77, 6,100,149, 98,179,190,166, 41, 11,106, 89, 97,140, 69,242, 10,215,161,105, 91,202,166,162,211,154,217,226, 20,109, - 56,154,167, 28,199, 38,109,127,251, 1,248,253,205,215, 63,122, 20, 94,191,126,205,118,187,101, 58,157,242,193, 71, 31, 90, 5, -107, 83, 91, 65,145, 35,250, 16,154,173,224, 24, 99, 40,202, 10,199,192,108, 26,218,177,172,235,241,246,205, 91,254,249, 87,191, - 98, 48, 26, 31,185,225,183,110,245,241,120, 76,221,195, 53,110, 31,216,183, 9,228, 91, 76,167, 23,216, 48,228,225,208, 63,180, -186,238,200,235,191, 5,222,220, 38,150,221,158,126,246,219,196,181,219, 7,253,120, 60, 62, 6,226,110,119,189,117, 93,131,113, -142, 20, 48,203,162,143,250, 64,159,165, 38,222,250, 9,238, 92,124,196,253,123,151,100,153,189, 5, 45, 22, 11,206,206,206,184, -190, 94,242,248,241, 99,202,178,135,195,184, 30,145, 49,116,178,151,199, 24, 7,215,183, 21, 70,223, 11,193,115,240,125,213,243, -183,189, 35,218, 51,142,227,190, 66,164,143, 61,235,225,112, 72, 28, 89,228,111, 60,136,236,235,211, 79, 55,218,214,134, 16,155, -198,222,240,227, 48,162, 40, 10,180, 81,199,195,218,173, 11, 92,107,133,145, 53, 97, 24, 49, 28, 14,143, 25,130,219,138,211,109, -182, 64, 56,182,239, 62, 74, 99, 70,163, 17,195,161,253, 14,108,107,216,110,109,112,242,201,147, 39, 60,122,244,168,103, 83, 52, - 24, 3,215,215,215, 12,210,148, 31,253,232,119,249,135,159,255, 23,194, 48,176,228, 60,207, 99, 54, 59,161, 40, 50,188,145,115, -132,143, 0,199,247, 93,215,187,193,147,100,208,187, 55,236,103,242,246,247,228,122, 30,139,197, 41, 2, 75, 48,171,234,130,231, -207,159, 83,215, 21,127,240,239,127,194,231,159,127,206,233,217, 9,175,223,252,239,172, 86, 27,178,162,161,105,173,212, 71,105, -219,122, 74,211,148,216,143,153,207,167,220,127,112,215, 50,230, 31, 62,224,151,255,244, 11, 91,187, 77, 18,214,235, 45,243,241, -136, 14,193,230,230, 26,169, 96, 50, 30, 90, 0, 76, 89, 90, 1,152, 77, 73,224,121, 1,151,151,247,184,119,239,193,209,147, 17, - 7, 33,142,239,209, 52,146, 40,142, 45, 7,222,117, 24, 12, 70, 44,123,236,173,212,210, 58,235,149,166, 42, 11, 59,230, 14,237, -231,205,113, 28, 28,207,197,117, 92, 84,215, 33, 92, 7,227, 88,248, 76, 87, 84,199,135,184, 43, 12,194,115,142,217,136, 48,140, -241, 92, 13,198,195,104, 75,108,243, 60,223,222,142,149, 66,169,219, 94,185, 67, 81, 84, 56, 66, 88, 42,160, 99,120,241,236, 25, -239,223,191,230,147,143,255,144,217,244,156, 78, 86,196,145,197, 17, 71, 81,140,239,248,116, 50,231,233,203,111, 89,248,151,124, -247,236, 59, 62,250,104,198,195,159,252,136,178,216, 17,132, 29, 97,232, 83,213,215, 76,102, 11, 62,251,236,146, 55,111,159,227, -186, 2,221,194,106,151, 49, 31,159, 98,148, 38, 16, 6, 33, 21, 97,224, 18,140,199, 44, 70, 99, 60, 35, 52,141,106,173,150,210, -117,232,164, 38,107, 14,132,110,194, 40,245,200,246, 25, 85,102,245,169,135,197, 20,223,133,192,143, 8, 19,151, 48, 74,152, 57, - 1,178,179, 97,155,243,243,115, 14,153,125,115, 92,175, 86, 60,127,241,134,203,123, 15,240,132,131,105, 42,148,236,104,140,161, -105,172,175,215,243, 4, 89,182, 33, 78, 60, 22,147, 57, 15, 47, 83, 78, 70, 9,105,228,147,246,130,138, 56, 78,236,141,212, 73, - 40, 27, 77,211, 57,212,121,205,187,215, 87, 60, 95, 60,231,195,203, 9,133,176,176, 13,169, 26, 75, 64,146,109,255, 80, 31, 48, - 95,156,210,182, 13, 78, 83,224,123, 62,160, 72, 67,248,241,151, 31,241,193,135,247,200,219, 22, 63,142,112, 29,133, 39, 52,158, - 35,121,242, 56,131,174, 36,244, 2,206, 23,145,173, 63, 72,137,239,123,196,161,131, 31, 8,198, 99,143, 65,228, 18,137,144,166, -233, 80,210,161,171, 10, 94, 61,253,150,213,205,146,195,234,138, 0, 69,213,118,104, 79,224, 96, 40, 14, 45, 85, 93,163,180,225, -221,213,138,205, 58,227,171,127,125,134,214,154,135,143,166,252,222, 79,126, 15,151, 10, 99, 26,134, 65, 74,232,249, 68, 65,210, -223,150,108,213, 65, 27,159,205,182, 96,189, 42,217,175,118,172,246, 7,230,167, 67,228,221,123, 56,174, 79,135,180,123,122,225, -163,141,131,233,124,132,241,233,164,162, 46,109,178,183, 67, 18,132, 62, 90, 40, 28, 60, 26, 41, 24, 12,102,248,183,122, 79, 85, -115, 50, 31, 50,155,121, 56, 84,252,224,179, 15,201,183,182,242,114,239,242, 62, 31,127,244, 1,235,205, 27,132,144, 4,158, 75, -145, 31,216,110,214,156, 46, 22,220,191,255, 16,223,247,217,237,118,116,198,146,235,180,182,206,241,219,135, 84,221,214,248,129, - 75, 26, 69, 8, 93, 81,230, 7, 70,105,194, 15, 63,255,156,221,182,192, 8,199,142, 25,221, 30,176, 96,108, 16,209,119, 93,178, -253,150, 50, 63,216,159, 9, 2,229,214,104, 71, 96,116,203,190,104,184,186,218,210, 73,131, 16, 86, 67,154, 36, 17, 85,169,240, -221, 14, 45, 58,174,174,174, 41,247, 57, 49, 62,187,245,154,201,212, 58, 15,170,178, 37,207, 14,100,149, 38,175,237,206,215,218, -155, 28,226, 52,162, 85, 13,155,155, 21, 89,153, 51,154,140, 9,157, 20,131,253, 82, 46, 42, 91,117, 10,251, 36,116, 89,218,250, - 96,146, 36,148, 77,141, 31,133, 71,169,209,118,187,101,219,107, 48,207,207,207,121,119,125,197,122,183,181,244, 56, 37,153,159, -218, 67,220,245,245, 53,195,225,144,237,118, 75, 20,133,184, 61,145,236,235,175,191, 38,244, 45, 71,218, 8, 88,245,206,129, 52, - 77,201,178,204, 30, 10, 38, 99, 54,155, 13, 90,219,127,231,246,203,252,226,226,130,172,200,173, 42,185, 15, 29,174, 54,107,139, -221,236,123,240,128,237, 96, 99, 33, 32,227,241,216, 18,174,140, 13,137, 17,127, 63, 74,167,211, 4,161, 13, 92, 89,249,143,173, -188, 45,151, 75,148,210,199,135,252, 96, 48, 98, 60, 30, 99,140, 97,183, 59,244,112,165,142,186,110, 89, 46, 87,124,254,217,103, -132, 94,200,213,213, 21,207,158, 61, 59, 30, 38, 38,147,209, 17,109, 44, 28,199,222,112, 61, 65,221,127,190, 29,172,121, 80, 43, -107, 33, 12,253, 8,173,122, 13,172,210,184,142,139,239, 90,254, 65,203,247, 83, 6, 11, 36, 17,120,218,254, 55,111,129, 39,118, -101,100, 39, 45,183,135,151, 48, 12, 73,211, 20,199,181, 15, 76,235,144,215,199,213, 74,154, 14, 73, 18,139,105,141,227,248,136, -242, 76,162,152,186,172,232,180, 4,109,127,205, 56,177,237, 1, 80,168,254,225,187,217,108,168,170,138,231, 47, 95,179, 56,187, - 32,244,124,164,204, 80,173,100,185, 92, 41,212,176,223, 0, 0, 32, 0, 73, 68, 65, 84, 18,133, 33,143, 30, 61,192,247,125,126, -241,139, 95, 16,133,150, 72,105,167, 61, 53,163, 65,114, 60, 44, 58,142, 67, 16, 37,199,159,251,109,224,210, 30,192,232, 65, 37, - 30,186,174,169,139, 2,165,222, 91,183,128, 19,160,141,178, 35,126, 41,249, 63,255,143,255,139,191,249,235,191,226, 79,254,228, - 79,248,224,131,143,250, 80,115,134, 31, 68, 56,194,235, 15,236, 49, 6, 73, 93,238,142,159,247,197,124,134,139,230,243,143, 63, - 96,181,188,102, 52, 30,115, 50, 25,163, 52, 36,131, 33,195, 36,229,102,181, 67, 26, 65, 16,198,100,135,138,217,201, 9,186,179, -239,223, 56, 9,137, 2, 75,166,179,100, 56, 69,215, 27, 62,101,219,145, 23, 5, 90, 27,138,170,100,119,216,179,217,237,200,203, -194,210, 63,123,105,208, 45,182, 59, 77, 99, 6,195, 33, 6,199,222,252,141,213,195, 10,199,197, 49, 6, 41,237,173,188, 58,216, -196,124, 24,120, 4, 81, 64,153,229,116,157, 33, 9, 83,162, 48,177,193,231,170,161, 40,107,164,194,126,199,106, 97,191, 91,141, -219,187,231,107,198,195, 49, 77,211,176, 89,223,176,219,175, 25,166, 17, 81, 40,248,225, 15, 62,180, 83,164,182, 34,232, 15, 13, -166,211,116, 93,193, 87,191,249, 5,207, 94, 28,120,127,245,158, 95,253,234, 95,248,248,195,187,104, 89,226,122, 6, 17, 26,186, -174,100,179, 45,185,115,103,204,157,139, 41,111, 94, 47,105,202,142, 36, 30,161, 85, 70, 87, 43, 68,167, 9, 93, 15,223,243,240, - 59,129,169, 21, 94,165,106,118,187, 29,113,232,162, 58,193,110, 95,224, 58, 14,233, 60, 69,171,142, 86, 86,156, 93,156, 50,157, -157, 34, 68, 68,135,161,146, 29,187,253,129,242,253,123,206,102, 39, 44, 22,103,132, 97,200,205,205, 13,155,109,102, 45, 82,241, -128,221,190, 96,117,115,133,208,134,186,170,104, 27, 69, 91,218,126,174, 48, 29, 78, 40, 72,125, 69,215, 72,116,169, 25, 71, 11, - 22,147,132,174, 45,233,218,154,182, 85, 28,182, 27,124, 63, 69,248, 13,141,246, 40, 27,216,237, 51,234,182, 35,175, 90,140,227, - 81,201,150,125,222,208, 57, 1,174,103,157,238,194,245, 8,226,152,109, 94,179,203, 14,156, 24,151,203,203,123,184,210,222,180, - 93,215, 5,209,177,152, 37, 76,230, 19,182,235, 37,194,128,239, 5,124,244,232, 3,235,171, 46, 51, 2, 95, 0, 13, 77,147, 17, -134, 35,102,179,132,116, 16, 16, 69, 9,109,213,145, 21,123,140,114, 72,227,136, 79, 62,254,144,178,106,112,189,136,201,104,132, -227, 69, 12, 6, 51,188, 32,228,237,213,123,158, 63,127,142, 84, 85,191, 67, 20,212, 82, 33,149,149, 73,156,150, 1,167,139, 57, -131,164, 67,214,123, 68,219, 17,186,160,149,189, 69,185,194,195, 49, 29, 90,251,255, 63, 87,111,214, 37, 73,114,158,103, 62,110, -102,190,199,154, 75,101,237, 75, 87,245,130,110, 0, 68, 55, 64,130,128, 64, 74,212,118, 36, 82, 71,103,164,203, 25,158,185,215, -197,252,135,249, 55,163, 51,210,156,145, 14, 15, 37,106, 52, 18, 23, 64, 4, 73,128,236,110,244, 2,116,117,237, 89,185,103,198, -234,187,187,153,205,133,121, 68, 55,230, 34,111,170,187,178, 34, 60, 60,220,190,229,125,159,151, 80, 57, 65,248, 98, 62,231, 48, -203,233,218, 61,178, 71,215,104,119,199,120, 90,128, 22,212,173, 32,175,117, 15, 60,145,120, 26, 48, 37,218,212,148, 93, 78, 58, - 78,232, 44,204, 86, 21, 69,214, 98,250,206,190,169, 10,210,212, 99,111,154, 48,153, 72, 76, 87,226,121, 45, 63,250,225,111,241, -217, 47, 30,115,244,250, 21,111,190,113,135,201,104,128,198, 96, 60,201,157,235,183, 49, 21,228,203,156,203,243, 43, 70,227,177, - 35,173,153,150,166,170,145,190,235,178,187,206,229, 95, 11, 79, 98, 53,204,138, 57,161,148,212,165, 83,206, 71, 97,194,221,219, - 83,178,162,114,163,226,168, 87,182,227, 70,239,155,184,197,186,104, 72,211,148,131,235,251, 28, 92,159,130,240, 40, 59,143, 47, -158, 28,242,162,124,141,175, 18, 90,237, 8,120, 40,159,170,214, 60, 59,252,146,203,229,156,197, 98,198,183,223,125,143,201,206, - 14,249,106, 78, 87, 55, 44, 22, 51,172, 23,115,239,206,109,180,136,120,122,248,154,243,203, 11,170,170,224,209,163, 71, 92, 94, -157,178, 90, 45,168,218,134, 56, 77,240,163,144,229,149,155, 0, 84,189,202,123,115, 16,109,184,221, 27,171,208,245,235,215,183, -157,242, 38, 33,107, 60, 30,115,112,112,128,209,240,244,233,151,142,161, 46, 60,194, 36,222,146,228,164,148,125, 96,140, 27, 43, -183, 70, 99, 53,104,157, 99, 34,199,218,206,171,218, 65,157,250, 36,180, 77,199,110,173, 83, 46,111,186,235, 56,142,145, 82, 50, - 26,141,184,154,207,182, 69,106, 20, 69,206, 94,215, 59, 13, 54, 93,173,231,121,120,214, 29,238,155,221,184,176, 95, 33, 43,173, -181, 46, 58, 20, 28, 83,221,119,222,235,205,129,233, 80,150,222,150, 79,189, 73,105,219, 36,144,185,212,199,138,171,166, 38,142, - 14, 40,138, 2,217,211, 54,154,166,217, 30,140,227,241,152, 40, 74, 40,138,130,229,218,177,211,187,214,208, 86, 53,158,239,245, -164, 50,181,141, 93,246, 60,127,235, 69,222, 28,188, 93,215,109,121,218, 27, 30,253,230,115,170,235,154,176,117,240,145,178, 44, -221,238, 30,219, 83,192, 92,225, 98,123, 28,169,177,221, 54, 7,126,195, 50, 47,203,118,155,172,182,129,213,108, 38, 16,163,209, -136,229,106,222, 43,208, 91,132, 80, 68,113,136,239, 75,242,252,171,168,210,241,120, 76,158,231,148,101,201,209,209, 17,161,234, -163, 72,181,251,221, 47, 94,188, 96, 50, 25,241,163,191,247,187,156,156, 28, 17,250,129, 91, 95, 86, 5,227,241,148,182, 42,221, - 46,122, 54,115, 19, 12,161,182,249,246, 27,156,169,155, 26, 56,246,122, 16,134,219,128, 35,107,161,169, 90,222,121,231, 29,134, -195, 17,171,245,146,247, 63,248, 54,127,240, 7, 59,124,252,241,135,252,209, 31,253, 17, 77,167,233, 12,232,206,146,164, 33, 8, - 65,224,135, 4,126, 66,215, 20,140,175, 93, 71,133, 17,171,101,198,135, 31,126, 76, 26,250,236,238,140,184,119,251, 14,235,245, - 10,235,193, 98,225, 96, 74, 85,109,184,188,188, 4, 21, 48, 28,237,144, 14,166, 72, 63,222, 2,125,116, 83, 83,148, 53, 69,238, -162,170,215,107,231,182,104,218,138, 52, 25, 82,183,141,179,129,225,212,230,109,215,184,238,187,143, 3,222,100,158,135, 97,132, -240, 21,173,209, 32, 5, 93, 93,211,182,206,214,106, 55,184,237, 70,211, 53, 13, 85,182, 6, 99, 49, 70, 19, 39,142, 73, 16,244, -159,191,181,222,118,242,225,190,211,110,154, 32,173, 79,233,213,104, 3,182,174,251,156, 9,195,108,118,197,106, 57, 39,244, 61, -246,119,246,184, 60, 63,161, 46, 31, 18, 12, 2,202,124, 69,163, 60,124,233, 38, 88,119,111,239,243,131,239,127,151,255,227, 63, -252,103,180,149,188,124,250,154,231,143, 15,121,251,173,123, 64,197,106,121, 69, 16,249,116,117, 75, 20,250,188,245,224, 54, 47, -159,190,194,211, 30,223,253,246, 55, 56,122,117,200,170, 43, 28,126, 60, 30, 16, 42, 77,158, 45, 81,228,168,121,150,179, 88,103, -212, 77, 68,107, 50, 60, 20, 30, 30,243,245, 26,172, 65,134, 1,183,238,221, 71,248, 9, 39,151, 43, 71, 43, 11, 21,218, 83,136, - 48,161,238, 90, 30, 63,125,140,144, 62,202,143,104,141, 71,148, 14, 24, 76, 66,222,247, 3,190,248,226, 11,166,147, 1,109,236, - 30,208,155,135, 95, 28, 38,248, 1,172, 86,199,220,186,177, 71,154, 36,200,182,225,242,228, 53,131, 36,102,152,166,100,203,140, -249, 98, 73,148, 24,106,157,147,119,130,101,105, 57, 91, 45,209, 97, 68,137,143, 9, 6, 4,202, 18,104, 31, 63, 29,211, 90, 77, -214,212,228,235, 10, 51,171,137,210,132, 47,191,124,205,112,184,132,192,193, 58, 84,172,220,195,167,171,105,234,156,124,161,233, -170, 6,219,105, 84, 28, 50, 8,135,212, 85, 70,209,213,172,109,129,231,105,214,217, 10, 37, 5, 81, 16, 19,168, 16,207, 72, 86, -171, 21,167,175,206,145,210,231,224,224,128,187,183,111,225,135, 17,120, 18, 79, 42, 60, 25,208,212, 6,229,135,116,205,146, 39, - 95, 44, 57,121,253,148,182,221,227,242,226,132,171,139, 57,194, 51, 88,235, 50,218,203,245,146,174,200, 17,186,132,182,166, 52, -150, 56,140,182, 15,249,178,106,233,108,130,214, 9, 88, 77, 93,148,180,121, 69,179,106,168, 51, 67, 83, 73,218, 74, 82, 87,154, -171,101,193,201,229,138,139,171, 21, 73, 24,226,155,134, 56,176, 12, 19,137,231,215,120, 45,128,228,234, 34, 99,189,182,212,165, -197, 23,138,201, 56,226,224, 32,101, 56,136,137, 2, 67, 99, 61,148, 39, 80, 18,190,253, 27,239,240,179,191,254, 59,254,250,175, -127,202,251,223,121,151, 32, 10, 65,198,220,190,190,195, 32,154,242, 23, 63,249, 75, 78, 95,159, 81, 87,206,147, 41,125, 65, 81, -228,125,248, 76,207, 85,214, 27,182,177, 11,240, 73,131, 30,246,161,221, 30, 44, 12, 20, 81,152,210,117,174,144,241, 3, 71,120, - 10,164,162,109, 90,124, 17,210, 86, 29, 68,146, 52, 74, 81,190, 7,194,162,172,193,154,134,186,204, 17,161, 79,221,181, 84,101, -203,229,213,130, 40, 77, 56, 59,187,226,244,252, 4, 48, 76,198, 59, 4,145, 15, 54, 33,150, 22, 36, 12, 39,251, 88, 63,230,163, - 79,191,228,163,143, 62,196, 15, 98,126,248, 59, 63,226,245,235,215, 20,181, 3, 98,164,195, 20, 25,248,180, 93,199, 34,239, 85, -188,254, 87, 40, 76, 39,100,113,234,106,225, 43, 39,172, 84, 33,109,179,102,189, 94,187, 29,123, 60,112,129, 53, 74,113,120,120, - 72, 89, 87,125, 87, 31, 35, 3,191, 7, 17,185,253,248,106,181, 98,103,103,218,219,111, 90, 36, 30, 65,143, 95,182,157,166, 51, -154,182,113,113,158,101, 83, 99,133, 99,157, 47, 22,139,237, 46,124,179, 99, 13,227,104,155,107,190,233, 50,149, 82,196,131,212, -197, 94,246,209,153,178,135, 96,248,210, 9,199,226, 32,236,193, 35,218,113,244,173,165,107,219,173,207,120, 48, 24, 33,125,159, -170, 90,224,251, 45,190, 31, 34,165, 3, 4,109,174,203,166, 99, 84, 74,225,171,208, 61,160,235, 26,207,106,116,107, 88,206, 22, - 14,232, 81, 85,148, 69,193,112, 48, 64,119, 46,131,252,246,237,155, 92, 92, 92,145,151, 21,108,246,226,253, 33,237,138,146, 6, -207,147,180, 90,211,181, 6,247, 28,247,127,237, 0, 15,122,123,151, 49, 6,109,245, 54,127,190, 51, 93,159, 40,198,215, 50,180, -191, 90, 55, 56,230,121,207, 92,208,221,175,177,228, 93,193,208,244,197,140, 43,204,165,148, 44,230, 87,120, 24,135, 57,157,205, -122,204,172,135,233, 92, 33,222,213, 13,109,189,137, 97,149,204,151, 43,178,162, 36,141,189,109,224, 74,163, 59,148, 39,209,214, -240,252,249, 11, 12,154,223,255,103,255,156,223,253,189,127,192,179, 47,159, 56,220,182, 29,146,198, 9,202,115,218,141,172, 44, -182,197, 89, 89,150, 46, 29,172,135,228,184,245,129,183, 93, 5,109,192, 51,109,219,226, 75,159,200, 15,136,252,128, 96,186,195, -217,241, 9,135, 47, 94,178,202, 51,170,170, 65, 72,223, 97,146,241,200,178, 12,113,113,193,206,222, 53,116,231, 17, 39, 17,243, -213,140,213,122,193,221, 91,183, 48, 93,141, 12, 2,210,116,200,254,238,152,207, 62,251,140,211,211, 83,130, 40,225,230,221, 7, -168, 32, 98,103,119,159,214,122,228,117, 67, 49, 91, 51, 24, 78, 93,244,106, 81, 49,159, 93,186,130, 67,119, 12, 71, 46, 48, 72, - 40,137,180, 1, 85, 83,179,204, 28,147, 67, 42, 69, 81,185,247,155,103, 89,111,193,243,126,141,246, 7,176,202,214, 4,126,212, - 7,163, 4,248,113, 76,215,186,208,163,197, 98, 65, 89,100, 4,218,178,191,183,131, 82,130, 48,142,182, 5, 89, 58,152,160, 59, - 88,190, 58,222, 2,115,172,181,212,173,195,214,150, 77, 77, 89,150, 36,161, 71, 85,230, 44,103, 87, 46,181,205,106,180,109,145, - 42,228,242,242,156, 39, 79, 31,243,246,155,111,184,239,130,112,217, 8, 47,159, 63,199,116,154,135, 15, 30,241,230, 27,239,113, -116, 52,167, 92, 88, 62,253,187,231,188,125,255,109,226,216,167,171, 50, 2, 4, 42, 20,104,219,113,247,230, 77,238, 30, 28,240, -236,203, 67, 34, 31, 14,174, 13,184,125, 99,128,213, 29,105, 28,226, 97, 89,206, 45,195, 52, 68, 69,161,207,120, 60,100,189, 88, - 83, 21, 37,111, 61,122, 3, 41, 61,102, 87,231,140, 71, 3, 86, 85, 65,148,186,174, 46,175, 92,117, 89,180, 45, 97, 28,144,198, - 49,157,118,251,185,120, 48,113,106,236, 22,210,241,142,203, 99,151, 43,222,125,247, 93, 66, 95,177, 90,204,168,171,114,251,229, - 73,226, 20, 41, 44, 59,195,123, 8,211, 82, 44, 10,130,201,132, 40,142, 49, 86,144,229, 29,203,117,201,229,213,130,161, 17,148, -157, 71,167, 66,138,214,146, 53, 5,235,166,224,213,249, 17,250,111, 87,164,161, 98,177, 94,161,252,144,170,233, 64, 56, 49, 68, -148, 36,116, 93,199, 47,127,245,152,221,201,152, 59,247, 31, 18, 15, 39,238,193,164,107,202, 98, 69, 26, 8,230,231,151,140, 71, -187,174, 51, 82,146,243,171, 25, 30, 29,150, 6, 95,117,196,177,143, 71,128,240, 66,164,136,240,180, 64,120, 17, 70,175,104,140, - 69,216,150, 85, 86,184,125,213,213, 21,235, 60,115, 68, 59,165, 40,139, 26,235,193,197,217, 5,146,146, 34,187,224,117, 53,227, -240,229, 75,180,145,152,166, 34, 13, 12,227, 84, 17, 72,141,215,181,196,129, 68,201, 4,221, 53,196,190, 66, 10,136,146,152, 48, - 54, 52,157, 79,107, 98,178,162,247,197, 18, 66,235,163,107, 69, 93,122,148,185,102,177,206,120,121,178,228,233,243, 83, 46, 46, -215, 40, 4,161,237, 56,216, 77,120,112,119,159,100, 32,161,115,124,255,182, 13,169,187, 22, 67,139, 84,134,131,131, 33, 55,111, - 78, 80, 20,232,170, 37, 80,110, 79,232, 25,215,101,127,231,219,239,240,139, 95,124,202, 79,254,252, 39,252,195,127,242, 79,177, -224,200, 98, 26, 22, 87,115,194, 96,192,104,180,217,223,121, 72, 79,210,181, 26, 15,131,239,251,180,182,165,174, 91,146, 56, 96, -144, 12,208,117,137,238, 26,210,100,136,193, 99,126,229,242,191,135, 73, 74,217, 84,155,176,225,237, 65, 52, 25, 78,208,218, 29, -156, 14,112, 83,209,154,154,170,246,176,186, 1,163, 49, 86,147,173,107, 22,235, 53,120,146,105,191,251,182,198, 67,245,200,198, -203,249,140, 65, 20,176, 88,175,136,162,136,171,171, 43,254,242,231, 31,241,234,244,146,221,253,235, 24,161,248,243, 31,255,153, - 27,117,123,150,100,144, 48, 95, 45,169, 86, 75,183,235, 23, 2,229,251,116,157, 65,245,187,218,205, 23,223, 24, 67, 60,112,169, - 89, 47, 95,190,116, 62,218,158, 35,126,112,112,128, 49,134,215, 47, 95,246, 66, 54,247,119, 90,163,201,150, 69,111,113,242, 89, - 46, 87, 92,187,182,191,229,217,111,246,187,142,130, 38,251,224,160, 1, 74, 6, 76, 38, 19,242,170,220,146, 2, 95, 31, 31, 51, - 76,211, 45, 57,108, 19, 18,177, 25,101,111, 70,206, 26, 75, 81,150, 91, 54,182,181, 22, 63, 8, 24,141, 70, 46, 90,184,170, 56, -216,219,119,211,131,126,199,188, 81,180, 7,190,223,171,197, 91,103,185,249,218, 30,222,189, 95,111, 27,214,178,233, 96,163,200, -117, 80,155,107,100, 53,219,131, 55, 12, 67,202,178,228,228,228,100, 43,108,211, 90, 51,234, 58,214,235, 37,186,109,136,146, 20, - 21,110, 34, 44,189,175,210, 3,149, 79,103,204, 86,165,191,233,180,155,166,217,238,102, 55, 12,247,206,124, 21,245,105,140, 83, - 88,127,189,155,183,214,108,189,249,117, 93, 35, 61, 65, 28,199, 36, 97,178,157,134,108,242,214, 37, 30,105,154,160,148, 96, 58, -157,110, 15, 81,215, 37,187,215,168,117,219,195, 65,108,223,233,119,125,124,168,237,133,108, 78,128,183, 41,190,232,187,208,131, -189,125,218,182,101,119,119,143,139,243, 43, 62,249,228, 19,110,222,188,206,227,199,143,105,154,218,209, 2,219, 35,138, 44, 7, -221, 17,165, 78, 41,191,191,191,223,107, 60, 74, 70,163,209, 54,177, 45, 78, 6,219, 49,253, 70,211,208,182, 46, 56, 73,121,130, -227,147,163, 45, 19,253,242,242,146, 70,187,236,240, 52, 77,153,175, 86, 36,241, 0, 77, 63,165, 65,176, 92,175, 8,227, 61,162, - 36,229,245,171,231, 44,150,107,118,199, 67,158,124, 57,231,254,255,244, 47,120,244,214,187, 92, 94,206,248, 47,255,245,191,178, -206, 11,126,249,171, 47,208, 94,128, 12, 99,240, 19, 58, 13, 97,156,210,182, 93, 63,113,113, 33, 85,158,231, 33,130, 16, 95,133, - 61,216,203, 17, 33,179, 62, 80, 73,244, 96, 37,107,109,159, 55,239,225,121,106, 27,214, 50, 26,141, 24, 77,198,219,149,138, 49, -134, 70,119, 52, 90, 67, 5,121,225, 38,211, 89,225,174,219,245,235, 7,252,224,251,223,229,218,181,107,172,114, 87,124, 55,109, -135, 71,135,144,146,193,208, 65,155,178,220,165, 94,174,179,101, 79, 93,183,168, 48, 32, 77,125,206,207,230,204,103, 51,166, 59, - 35,166,227, 33, 71, 71, 47, 9,125, 69,188,187,203,171,151,175,185,125,243, 6,147,209, 0,211,181, 84, 69,199,103,159,126,193, -106,181,226, 95,253,235,119,249,131,127,242, 47,249,183,255,246, 63, 50,191,188,226,179, 15,191,224, 7, 31,124,135, 55, 30,238, - 51, 78, 71,104, 74,138,170, 68, 41,201,238,100,202, 91, 15, 31,242,119, 63,253, 59, 62,250,249,207,248,224, 55,222,225,189,111, - 62,194,154, 6,221,213,104,221,210, 84, 9,131, 52, 65,254,207,255,244,135,255,251, 40,141, 57,216,221,225,218,222, 20,211,181, - 72, 9,163,209,128, 42,207,136,194, 0, 60, 65,154, 14,104,234,218, 1,236,235, 10,172,161,105, 28, 3,216,122, 30,171,162,166, -243, 36, 63,253,249,135, 84, 26, 70, 59,187, 78,196,226, 75,210, 36, 36, 8,125,210, 52, 34, 77, 66,226, 56, 36, 76,220,104, 47, -242, 7, 40,145,112, 53, 47,201, 74,141,245, 98,206,231, 57,103, 23,115, 58, 28,118,239,124, 54,167,110, 91, 86,101,198,186, 46, - 25, 77, 71, 76,118, 39, 36, 73,200, 48, 77,177, 86,224,135, 49,241, 96,196,120,186, 75, 58,156,226,121,138,178,110,121,117,120, -200,197,229, 21, 65, 16,113,244,250,136,123,247,238,160,148,228,236,244,132, 36, 8, 41,215, 25, 62, 78,229,158,175,106,116, 39, - 88, 47, 42,124, 21,209, 20, 45,101,209, 80,150, 29,105, 58, 65,119, 18,173, 3,214,235,150,178,176,148,149, 70, 6, 62, 97, 28, -211,104,205,225,235, 67, 62,254,228, 23,204,103, 87,196,113,196, 32, 13, 89,175,175, 80,210,112,109,127,192, 91,143,238,178, 55, - 25, 50, 29, 39, 60,186,127,143, 71,143,222,224,155,239,190,195, 15,127,240, 62, 55,175, 37, 76, 6,138, 97,162,240,173,112, 21, -180,138,145, 82, 17,197,238, 97,225,169, 0,171, 2,170,214, 67, 27,197,211, 87,167,156, 93, 86,236,237, 92,103,127, 58, 36,246, - 37, 71, 71, 47,121,117,244,138,199, 79,159, 80, 84, 37,249,186,192, 51, 6,105, 53,182,173,168,170, 18,221, 89,206, 47,151,156, - 94, 20, 44, 75,133, 17, 33,161, 52,220,189,189,203,141,107, 3,218,106,129,167, 91,146, 56,197,104, 75, 93, 57,216, 77,219, 86, -148,249,138,107,215,174,147, 45, 11,158, 62,125,197,245,235,215,201,203, 2,221, 25, 62,255,229, 47,233,218,150,187,119,239,162, -124,133, 18,110, 28, 38,164,135, 47, 60,140,238,240,149,164,169,107,194, 32,128, 78,227,245, 33, 45,198,184, 3, 69, 8,199,217, -246,132, 69, 73, 80,129, 75, 96,139, 2,233,120,216, 88, 70,195, 1, 81, 24, 17, 70, 18, 79, 85, 24,219, 16,248, 49, 23,231, 51, -158, 63,127,205,229,229,146,103, 47, 95,147,149, 21,201,112,196, 98,181,228,245,225, 43,164, 20,125,128,198,119,184,123,239, 14, - 97, 20,113,247,246, 77,230,139, 37,127,250,227,159,240,244,229, 33,251, 55,110,113,112,227, 38,135,199,199,136,126,172,230, 71, - 1,157,209,148,101, 78, 86, 20,116,214,144, 14, 6,184,224, 78,250,108,106,119, 64, 9, 95, 49,234,197, 99,103,103,103,219,125, -246,181,235, 7,220,184,121,131,117,182,230,244,236,172,239,166, 90,170,166, 37, 73, 83,180,233,122,241,149, 33, 77,146,222,186, - 4, 69,238,214, 97,234,107,221,181,144,146, 78,119,212,141,243,207, 11,233, 51,153, 76, 1,143,139,139, 75,194, 32,196, 15, 67, -202,170, 6,207,209, 11, 39,147, 41, 90,155,222,190,227, 81, 53,173, 67, 80, 10,126,109, 84, 29,135, 17,111,188,241, 6,207,158, - 62,101,111,111,207, 49, 32,250,232,215,162, 40, 92, 65,158, 36,204,103,115,252,192,199,243, 4, 77,219, 34,165, 79,211,180,228, -121,129,239,187,206,120,163,106, 22, 66, 48,159, 45,217,221,221,219, 6,166, 4, 65,192, 98, 62, 99, 50, 30, 50,157,184,127, 99, - 54,155,225,251,138,157,157, 9, 74,185,200, 76, 41, 60,174, 93, 59,224,237,183,223,193, 19,146, 87,175, 14,105,154, 22, 41, 20, - 87, 87, 51,192, 5, 26,249, 74,145,103, 25, 82,128,238, 90,162, 32, 36,240,125,132,146,125,167,229, 17, 69, 33, 66,138,237,129, -189, 41, 30,132, 16, 91,130,162,236,177,189,121,238,108,136,155, 64, 35,173,187,222,242,148,109,199,229, 77, 93, 17, 6, 62, 74, - 8,238,220,190,141, 7, 44,151, 43, 70,189,197,113,189, 94,210, 84,165, 75, 18,235, 15,241,186,174,250, 34, 66,161,148,207,124, -185,102,157,213,164, 73, 76, 16, 70, 72,169, 16, 66, 50, 76,211, 62, 70, 24,222,124,243, 77, 46, 46,206,121,244,232, 33,227,233, -152, 79, 62,251,148, 36,138,209,186, 99,103, 58,165,213,154, 32, 8, 41,138,146,215,175,143, 88, 44,150,204,151, 11,142, 79,142, -201,139,156,229,106,197,229,229, 21,203,165,211, 70, 93, 93, 93,113,124,118,202,114,190, 64, 41,201,114, 49, 39,207,243,254,117, -251, 76, 38, 19, 38, 59, 83,246,247,247,249,224,187,223, 35, 43, 10, 86,203, 53,158, 84,148,101, 69, 94, 20,164,131,129,211, 42, - 24,235,246,212,210,103,157, 57, 80,210,143,127,252, 19,138,162,226,225,195, 55, 89, 44,214,252,248,127,252, 13,233,112, 74,222, -184, 70, 45,175,106,252, 56,165, 40,156,195,192, 15, 2,116, 79, 69, 44,203,194, 9, 44,117, 75,211, 54,212,109, 77,219,211, 30, - 55,206,138,166,105,232,172,233,189,227, 46, 35,195,243, 96,103,103,138,215,175,118, 2, 63,194, 83,138,206, 24,194, 40, 38,232, - 3,173,234,186,113, 88,218, 44,227,205, 7,247, 57,216,157, 82,150, 43, 58,221,146,151,107,118,118, 39,238,187, 85, 87, 92, 92, - 94, 80,148,149,139, 80,110, 27,134,195, 33, 69, 85,176, 90,205,241, 4, 4,129,100,127,103, 68, 85,102, 78, 44,120,247, 54, 69, -190, 70, 42,184,115,235, 22,187,187,187, 52,117,195, 98,190,228,222,237, 7,188, 62, 58,229,249,243,215,212,141,229, 31,252,222, - 63,198, 26,201,206,206, 13,174,237, 93,231,244,232,152,213,226, 10, 65,199,163, 55,110, 33,188, 6, 41, 65,119, 29, 24, 65, 28, -142,121,246,228, 37,207,191,124,202,189, 59,183,248,222, 7,223,134,174,166, 41,151,208, 21, 96,106,132,109,233,218, 2, 21,154, -154,108,113,229,146,160,252,144,220, 84,188,248,226, 5,187,215, 14,152, 78,167,206,151, 89, 22,204,117,183,173,244, 59, 93,131, -242, 48,198, 3, 4,157, 39, 25,237, 94,227,241,243, 67,254,203, 95,124,204,228, 23, 95,240,187, 63,250, 29,222,255,214, 55,137, -149,162, 69,247,153,227,142,144,211,234, 14, 79, 90, 84, 20, 98,109, 64,215,121,148, 70,113,126, 58,163, 13,198, 52, 29, 4,254, - 16,141, 97,180, 59, 34, 72,199, 46,162, 46, 10,240,130,152,206,147, 52, 8,124, 25, 17, 34, 89, 92,206, 56, 61,187, 96, 62,159, -187,221, 85, 18, 19, 6, 17,131,208,231,238,141, 27,252,224,123, 31, 56,187, 70,219,242,127,255,187,255,147,223,249,209,111,115, -227, 96,159,213,226,138, 88, 8, 86,185, 75,229, 26,141,118,192,104,194,200,167,174,221, 8, 37,148, 33, 40, 67,215, 74,150,171, - 21, 85, 37, 8,227,132,174, 89,131,146, 68,131, 33,101, 93, 80, 55, 53, 70, 8,119, 16,120,150,241,100,200,183,127,227, 93,150, -203, 25, 74,128, 82, 98,251, 16,177,214,253,104, 43, 64,184, 96,136,227,227,115, 20, 29,129, 23,227, 9,129,109, 61, 58,235,245, - 10,219, 26,131,198, 8,137,145, 30, 8, 31, 35, 45,202,247,153,236,238, 97, 80,188,124,113, 4,221, 10,204,146,201, 48,224,221, -119,110, 97, 9, 8,252, 49, 62, 1, 49, 30, 73,168, 8, 34,159,117,217,240,228,229, 17, 95,188,120, 69,105, 7,220,186,123,131, - 71,119, 71, 36,169,143, 20, 21,235,108, 78,105, 64,183,166,175,222, 35,172,173,209,166,166,214, 21, 65, 16,113,243,246, 93,130, - 32,118, 49,156,180, 72,229,179,191, 63,194, 15, 18,124, 9,158, 18,120, 82, 32,164,143,181,142, 75,188, 94,175,169,139, 10,107, - 90, 70,195, 16,229, 9,124, 49,164,173,107, 22,171, 53, 85,185, 68,249, 33, 97,228, 19, 68, 46,142,182, 51, 21,214,115,153,205, - 97,228, 57,191,109, 87,209,181, 13, 73, 11,137,167,192,243,104,235,134, 52,138,121,244,198, 67, 78, 47, 50, 6,211, 3, 38,187, -215, 56, 60, 58,230,179,207, 62, 97, 60, 26,241,195, 31,254,128, 40,116,163,217,117,150,177,187, 51,229, 47,255,226, 79,121,242, -228, 9, 29,110,167,141,240,120,246,234, 37, 65, 28,146, 23, 37,190,175,200, 86, 43,186,174, 65,247,180, 39,109, 44, 77,211,119, -124,218,224, 11, 73,222, 7,194,236,236, 59, 59,210,213,213,213,118, 95,186,191,191,143, 16,130,179,179,179, 45,199, 96,243,179, -201, 75,111,187,154, 40,138,216,219,219, 99, 56, 28,146,101, 25, 23, 23, 23,196,177,243, 62, 75, 44,163,209,136,186,103,137, 11, -207, 99,127,127,159, 40,114, 86,170, 60,207, 57, 63, 63,223,218,214,186,174,219, 22, 26,155, 46,125,163, 76,223,236,157, 1,116, -159, 82,181,233, 94,195, 48,252,234, 64,243,253,237,235,245,195,112, 27,251,232, 98, 67,191,154, 74, 24,107,182, 58,130,205, 78, - 57,237, 39, 5,155,221,113,158,149,219, 78,223, 69,249, 70,140,199, 99, 78, 79, 79,121,251,205,135,204,231, 51,138, 34, 99,103, -103,194,222,222, 14, 87, 87, 87,196,113, 72,217,235, 95,234,170, 98, 49,155,131,233,168,107,167, 91, 24, 36, 49,202, 15,104,186, -118, 27,216,145,166,233,246,223, 48,198, 80, 55, 78, 0, 87, 20,110,172, 94,183,205,150,165, 15,176,191,127,109,123,125,220,225, - 45,251, 29,169, 27,185,110,174,163, 39,108, 63, 33,112,227,255,174,235, 64,247, 74,127,163,183,152, 86,247,123, 44, 74, 57, 45, - 65,150,101,142,114,102, 45, 77,159, 77,174,181, 70,234,175, 52, 7, 82,178, 93, 23,172, 86, 43,167,202, 15, 92,243,179,187,115, - 13, 99, 44, 93,103,120,242,228, 25,183,110,221,226, 71, 63,250, 29,116,227, 4,125,194,179, 91,155,220,122,189,230,236,236,140, -245,122,141,233,181, 1,155,253,249, 38,186,115,107, 59,196,225, 92,133,231, 49,152, 76,144, 82, 50, 30,143, 9, 67,167,173, 40, -106,135,171,254,217,207,126,214, 71, 76,167, 24, 60, 90,169,168,219,150,249,236,146,233,206, 30, 42,138, 41,106,141,110, 10, 6, - 81,196, 42, 91,178,123,237, 22, 63,249,233,223, 96,240,120,239,219,223,227,213,201, 37,207, 15,143, 24, 78,247,136,135, 49,235, -178, 98,181,206, 9, 2,103, 89,148, 82, 34,251,123,199, 9,106, 3,135,163,222,160, 85,123, 75,102,219,182,116,189, 94,194,224, - 2, 87,214,235,130, 40,114, 19,133, 48, 12,157,229,172,235, 40,106,151,188,152, 23,229,246, 51,220, 8,233,180,238, 56, 56, 56, -112,239,201, 58,228,108, 89,174, 29,165, 79, 58,155,106,146, 76, 56, 61, 57,163,200,106,199,113, 87, 46,200, 9, 12,120, 22,173, - 59,234, 50,167,109, 26,198,227, 17, 69,145,113,248,250, 37,202,131, 36,137, 89,174,215,200,204, 99,190,204, 48,173,225,143,254, -248,255,197, 90,203,217,241,177, 43,108,253,207,248,230,123,223, 38, 29, 25,238,223,219,231, 15,255,240, 95, 83,172,231,236, 79, - 83,124,137,139,217,173, 45, 50, 8,105,181,229,240,197, 33,207,159, 60,163,105, 58,158, 63,125,193,242,187,239, 19,249,134,216, -183, 96, 90, 71,120,165,231,234, 95,139, 21,211,235, 19,162, 36,102,185, 90, 33, 3, 67, 26,194, 52, 77, 8, 61,143, 32,137, 9, -132,231,104, 59, 42, 38,138, 28,176,127,103,178, 75,107, 65,134, 49,209,104,130, 12, 71,124,252,229, 17,131,233,144,214,122,124, -254,228, 57,195,241,132, 55,239,222, 64,122,160,109, 7,104,140,238,247, 89,158,203,105,175,107, 15, 21, 14, 57,107, 42,126,254, -248, 9,207,150,110,220,242,230,131,251,220,190,185, 79,105, 26,130,200, 49,204,165,150,132,248,110,111, 47, 67,164, 39,105,170, -140, 56,176,220,189, 57, 37,240,111, 48, 30, 79, 25, 14,135,248,126,136,181,186, 31,109,185,108,238,201,120,128, 45,175, 56,121, -254,152,135, 55,119,137,167, 41,166,107, 17, 3, 71, 65, 11, 67,225, 96, 47,169, 34,138, 6,104,107,156, 96, 37,141,232,186,150, -178,173, 92, 64, 72,224,177,206,150,120,190, 79,185,104,104, 58,141,192, 35, 30,142,216,191,113,139,217,229, 25, 87,179, 25, 87, -179, 25,195, 97,136,213, 46, 58,212,118,224, 9,209,227, 76, 29,101, 73,155, 22,225, 11,116,147, 83,149,130,216,119,201, 86,166, -147,189,154, 93, 96,181,161,197, 69, 72, 90, 35,201,171,142,197,170, 98, 85,230,204,150, 21,194, 15,104, 76,200,193,193, 46,247, -110,222, 36, 12, 27,144,154,186,210,132,106,136,105, 5,116,218, 69, 20,138,128, 87,231, 25,203, 47, 79,121,118,188,162,236, 74, - 84, 24,113,235,186,143, 39,220,131, 77,122, 26, 95,132,196, 42,193,247, 99, 60, 35,200,171,194,133,184, 40, 5,210, 5, 0, 73, -169,176,162,196,243, 65, 8,184,119,255, 58, 66,134, 76,118, 66, 84, 24,244, 25,231,110, 23, 26,134, 49, 73, 2,229,186,196, 90, -216,223, 27,144,175, 51, 23,252, 19,250,116,214,223, 6,200, 0, 68,137,243, 37,171,112,128, 54,110,167,110,140,161,174, 58,174, -174,230,180,181, 65,170,161,123,152,135,138,225, 96,200, 49,115,202, 34,227,193,131,123,216, 32,229,103, 31,127,194,243,215, 47, -240,148,228,193,131, 7,220,190,117,139,243,211, 19,102,179, 25,241, 40,225,223,253, 95,255,158,249,229, 5,239,191,255, 62, 71, -231,151,148, 86, 81, 52, 45,171,188, 36,203, 11,118,246,118,161, 31, 81, 55,109, 69,146, 36,110, 76,220,182, 84,149, 59, 20,226, - 48, 96,149,101, 46, 91,122,144,110, 49,175,155,131,121,178, 51,101, 56, 30,177, 92, 46, 57, 59, 59,219,134,134,108, 2, 39, 54, - 29,200,198,231,188, 25, 29, 11, 33,240,140,165, 41,171,109, 34, 24,128,146,146,225,206,206,246, 0,221,140,220,215,235,181, 59, - 64,124, 71, 83,108,234,102, 43, 80,219, 88,177,170,170,162,232,153,236,155, 81,111,211, 54,248, 66,246, 25,207,186, 15, 2,185, -218, 30, 56, 89,175,236,223,116,252,157,214, 8,173,177,158, 19,240, 53,173,198, 83,114,155,249,172,148,192,152,110,203,196,222, -236,213,195,200,199,162, 49,198,254,218,193,126,242,122,229,236, 94,163,145, 83,117,211, 33,164, 7, 70, 83,230, 89, 31,209,154, - 17, 6, 17,247, 31,220,230,254,253,251, 60,125,250,140,211,147,115,130, 80, 57,139, 97,158, 99, 13, 72, 37,136,250,241,124,158, -187,184, 78, 43,188,109,193,225,121,142, 51,176, 25,203, 74,233,116, 49, 74,169, 30,208, 98,136,162,112, 59, 77,112, 73,147,178, - 47,126,218,175, 2, 47,251, 81,127, 85, 23, 4,254,112,187,106,112,118, 65,247,123, 76,207, 43,207,243,140, 52, 77, 29, 42,183, - 44,221, 1,101, 90,116,231, 33, 83,217, 55, 73, 80,119,154,206, 66,215,116,204, 23, 11, 86,123, 25,195,201, 16,169, 20, 85,227, -236,100,199,167, 39, 92,191,126,141,219,183,111,243,159,254,211, 31, 83,102,185,211, 57,244,235, 13,165, 20,147,233,148, 91,183, -239,186, 66,236,107, 2, 70,183, 87,118,121, 9,155,131, 82, 88,215, 9,110,176,167,139,245, 2,189,208,219,102, 46,203, 50,166, - 59,123,180,198,176, 92,172,145,126,192,206,206, 46, 87,243, 5,243,249, 21,158, 20, 92, 31,220,227,205,183,223, 98,118,113,238, -108,161, 65,128,213, 29,168,136,159,127,252, 25,247, 30,189,203,247,255,222,223,231,240, 63,252, 71,230,139, 53, 34,104, 72, 70, -206,147,238,251, 78,201,239,251, 62, 98, 99,161,196,108,239,213,245,122, 77,146,198,219,239,131, 16, 2,175, 23, 43, 74,207, 61, -115, 66,233, 38, 59, 46,231, 92, 58,118,122,239,238,104,154,118,171, 47,193,218,237,186, 97,103,103,202,173,155,215,157,226,221, -183, 91,129,156,177, 46, 69, 47, 8, 2,146, 32,233, 3,105,220, 26,199,235,220,148,165,237,227,167,233,185, 20,203,229,146,178, -112,224,155, 78, 59, 1,184,231, 57,133,187, 82, 62,190,138,169,171,142,179,243,115,246,119,247, 24,140,175, 97,140,225,147, 79, -159,176,202, 74, 30,189,121,202,222,206,152,251,183,238, 48,191, 90, 3, 25, 69,213,225, 71,130,178, 41,161,115, 98,199, 87,175, - 94,240,211,191,254, 25,195,193, 46,103,103, 11, 62,254,248, 11,254,209,239,254, 54,129,201,192,184, 52, 60, 60,139, 68,162,246, -134, 17, 42, 24, 80,150, 57,141, 50,168, 97,196,163, 55, 30, 16, 38,187, 92,205, 86,132, 81,194,104,156, 34,124, 75, 20,244, 16, -121,235, 44, 8,141, 17,228,157,165,106, 5,191,252,252,115,254,159,255,254, 83, 52, 33, 50, 12,249,226,217, 43,103,211,249,205, -247,121,112,103,143,113, 4, 66, 88, 60, 1, 50,244,240,165, 15, 42,196, 31,248,160, 82,178, 23, 53,231,101,198,201,203,151,116, -173,102, 94, 54, 44,202,154,183,239,221, 36, 29,196, 8, 60, 76,215,208, 22,181, 75, 90, 10, 36,173,173, 72, 7,138, 36,182,120, - 72, 2,169,136, 67, 15, 69,133,108, 91, 7,200, 55, 18, 83,230,116, 20, 44,202, 57,191,245,237,111,240,201,167, 31, 35,105,233, -234, 6,169, 60,234,166, 38,203,220,248,105,177, 88,177,202,114, 30, 61,124, 11,131,139,182, 43,250,177,155, 31, 5,228,197,154, -106, 89, 58, 91, 94,105, 9,195,161,251,146,183,134, 48, 8,216,187,118,224, 2, 12, 6, 33,218, 66,150,151, 24, 93, 97,187,202, -129,195, 29,219, 10,129, 15,158,192,250, 62,126, 48,112, 85,166, 10,177,158, 79,215, 58,138,145,219,231,141, 48,116, 8, 25, 64, - 91,211, 26, 73,211,148,142,172,134, 37, 74, 60,194, 8,164,178,164, 73,196,120, 20, 81,100, 51,164,105, 17,186, 65,155, 10, 97, - 36,166, 51, 84,141,164, 38,162,168, 27,106, 3,157, 23,226,169,128,186,107,251,113,112,131,242, 66, 6,113, 68,224, 37,132,190, - 79, 91,118,120,129,194, 83, 33,190, 39, 16, 94, 75,215, 89,164,177, 84, 77, 78, 52,176, 8, 97, 48,166, 38, 78, 2,164,144,189, -175,220, 99, 93,100, 84, 85,137,177, 13, 74,164, 36,161, 34,241, 71,189,133,196,227,240,234,188, 15, 81,240, 49, 6,174,223,188, -193,100, 50, 33, 43,214, 40,133, 75, 69, 19, 46,179,216, 51, 29, 82, 73,202,178,102,177,184,196,179, 10,107, 15, 24, 14,199,238, -193,172,107,210, 40, 70,226,225, 89,203,147,231,207,249,226,203,199, 12, 70, 67,170,170, 96, 58,157,240,234,213, 11,124, 37, 56, - 61, 59,227,207,254,253,159,211,234,142,255,237,223,252, 27, 62,253,252,151,252,213,207, 63, 36, 76, 6, 84,198, 67,248, 62, 50, - 10,200,202, 2,165,156, 96, 73, 74,233,236, 60,214,162, 91, 67,215,103, 31,135,190, 75,174, 50,198,108,115, 0, 54, 7,230,238, -238, 46, 59,123,187,204,102, 51,206,206,206,200,243,124,171, 48,223,116, 79,117,235,252,225, 73, 26, 97,173, 99,189,183,149, 19, - 82,109, 58,197,182,109, 73,226, 16,172,101,167, 15,212, 48,198,184,213,151,181, 92, 94, 94,178, 90, 57,109,128, 10,220,131,188, -235, 31,214, 66,136,173, 58,254,171,220,104,111,219,201,122,198, 66, 63,130,223,100,127, 95, 92, 92, 16,244,218,131,141,122,125, -147, 79,191,121,111,218, 24, 23,146,227, 7, 4,253,158,126,179, 79,223,168,216, 55,175,221, 90,187, 45, 48,172,245,182, 83, 2, -175,159, 54, 20, 69, 78, 93,151, 76,119,198,172, 22,115,130, 64,113,237,218, 30,103,231, 39,128, 68, 34, 16, 88, 86,139, 57,121, - 94, 51,155, 93, 81, 55,206, 95,236,135,233, 54, 60,100, 99,253,148, 82,161,141,235,204,234,174,221, 30,232,155,247,189,121, 63, - 74,169,109,231,253,245,131,111,227,205,119,124,118,183,255, 54,214, 9, 18, 55, 83,136,209,104, 68,149,103, 8, 60,162,208,233, - 11, 54,192,154,141, 53,206,185, 23,108,255,103,238, 90, 74,229,209,149, 78,181,173,148, 98,127, 60,117,147,152,254,117, 88, 79, - 83, 20, 21,231,231,231, 40,165, 56,124,241, 18, 63,144,232,182,227,230,173, 3, 78, 78,206,248,214,183,222, 99,111,111,159,231, -235, 53,137,255,255, 43,236,242,156,195,195,195, 45,248,232,235,100, 63, 33,156, 71,123,243,103,128, 19,201,133, 33,109, 91,111, -133,122,155,207,113, 56, 28, 50,153, 76,184,127,255, 62, 87,183, 22, 28,190, 62,166,174, 35,167, 41,224, 0, 0, 32, 0, 73, 68, - 65, 84, 75,226, 80, 33,167, 19,164, 18,156,157,159,112,235,206,109,238,220,185,195,203,231, 79, 41,202, 10,171, 59,246, 14,110, -113,116,116,196,135,191,248,156,239,126,247,187,188,255,193,111,242,242,240,136,197,106, 73, 28, 70, 72,229,138,175,213,114, 65, - 85, 22, 8, 11,117, 93,226,225,166,154,109,235, 34,159, 87,171,246,215, 52, 22, 91, 0,146, 20, 40, 79, 16, 71, 97, 95,188, 84, -172,178, 53, 74, 6,125,167, 94,111,245, 4, 97, 24, 82, 22, 5, 66,120,236,239,236,112,112,112,192, 56, 77,153, 95,157,241,230, -183,190,129,239,123, 95, 5, 16, 25, 71,150,155, 76,247,249,198, 55,190,193,225,235,115,116, 7,117,235,238,255,182,170,209,198, - 77,158,171,202,244,186,136,142,155, 55, 15, 16,210,240,250,213, 11,231, 56, 73, 83,154,186,227,198,141, 91, 44,230,107,226,116, -178,157,218,117, 93,195,176,110, 88,102,107,254,234,111,254,146, 91,183,118, 72, 18, 24,166, 1, 77,221,225, 41, 15, 79,250,116, - 93,139,177,130,197,186, 32, 76, 38,200, 48, 65, 72,197,186,108,249,179, 31,255,156,135,247,238,243,224, 32,197,107, 12,186,179, -110, 37,129, 70, 9,237,177,188,154,243,234,248, 5,251, 55,175, 99, 61, 73,147,117,156, 31, 93,178,204, 52,235,124, 70,148, 6, -236,236,198,236,238, 15,104,234,156,182,106,153, 47, 53, 97, 58,230,114, 89, 96, 85,198,225,201, 21,158, 74,153, 78,166, 72, 63, - 32, 12, 82,154,114,193,139, 87,135, 60,184,115,141,189,189, 29, 2,233,226, 51, 27,157, 32,148, 66,123, 2, 21, 15, 56,186, 90, -113,122,121,130, 63,136,240,213, 0,131,226,245,108, 73, 94, 59, 4,226,195, 27, 7,236, 38, 62,104, 75, 91, 87,248,126,136,167, - 59,180, 46, 89, 47, 43, 68, 96, 8,149, 15,218,199,118,185,179,133,132, 9, 97,160,104,155,134,221,113, 66,219,214,132, 34,196, - 15, 21, 63,248,205, 15,220,195,110, 52, 64, 41,193,151, 79,190,224,147,207,255,150,223,255,253,127, 78,148, 10,218,215, 5,126, -100, 81, 65,130,146, 17,159,125,254, 5, 39, 39,103,124,255,135,223, 39, 26,198,172,214, 51,166,251,251,104,109,241,253, 49,214, - 40, 86,203,140, 60, 47, 16,158,100, 52,218, 65, 72,203,229, 98, 77, 18, 75, 2,101, 9,131, 16, 97,125,108,107, 48,157,117,171, - 11, 33,250,195, 61, 68,250, 9, 42, 74,240,124,215, 41, 72,229,136, 88,218, 19, 46, 13,174,105,184, 92,204, 88,173, 42,206,207, -214,156,158,102, 44,103,231,212, 85,199,124,150,163, 74,159,217,229, 46,119, 14,174, 83, 22, 5,129,223, 98,173,102,181, 90,225, -203, 0, 1,104, 2, 58,213, 98, 44, 52,186,165,172, 43,252,200,173, 67, 58,163,241, 60, 87, 13, 75, 33, 64, 91,119, 56, 88,129, - 50, 33, 86, 40,172,112,123,125,211,181,120, 74,130,165, 79,200,210,212,141,102,185, 92,226, 33,216,187,182, 79, 93,151,156,159, -158, 56,156,174,213, 72,235, 70,132,129,114,135, 83,145,229, 92, 94,158, 83,150, 53,147,126,252, 55,217,153,210,117, 46, 68, 65, -249, 30,203,108,233,136,120,184,131, 63, 77,191, 74, 32,139,147,196, 9, 56,181,199,112, 56, 37,159,215, 52, 85, 75, 28,186,168, -210,191,249,217, 95,161,162,132,178,169, 8,195, 0, 79,184, 28,249,167,143,191,228,207,254,199,159, 83,116,142,102,248, 71,255, -229,191,114,121,181, 68, 70, 9,157,240, 9,194,144,103,143,159, 48, 24, 13, 17, 90,147,231, 13, 70,107,148,112,216,205,170,105, -104,181,197,247,157, 16,114, 56, 28,210,117,154, 60,207,105,219, 14, 33,100, 47,218, 73,216,221,221,167,170,107, 78, 79,207, 89, - 46,215,142,184,215, 99, 60,165,116,135,102, 28,134, 68, 65,128,110, 28,194, 83, 8, 65, 36, 29, 87,160,204, 11,151, 5,221,180, -164, 83, 23, 15, 59, 25,186,120,207,141,247,125, 51,166,111,181, 75,252,219, 28,166, 27,219,218, 70, 21,172,173,117,118,164, 94, -185,189,121,208,135, 97,136,192, 67,163, 29,148, 37,140,192,216,173, 90,124, 51,182,181,214,226, 41,137, 39, 4,198,195,229, 5, -232, 14, 97, 93,248,199,215,139, 5,119, 48, 40, 32,112,220,255, 30, 4, 99,173, 69, 42,151,255,236, 9,139,239, 75,180,118, 5, -101, 24, 40, 70,131, 20, 93,151,219, 98,123, 52, 26, 80,151,141,219,173,214,181, 19,234,162,248,198,219,239, 16,134, 17,175,143, - 78, 56, 57, 63, 99,208,223, 23,244,113,211, 97, 24,210,106,183,242,217, 25,237,244,226, 66, 7,103,169,219,166, 31,193,186,194, - 34,142, 29,112,103,227,219, 23,194,237,211, 55,255,207,100, 52,222,254,183, 77,129,178,161, 7,150,217,154,189,157,221,173, 24, -207, 21,121, 62, 81, 63,157,112, 99,113, 31,207,179, 91,101,186,240, 44,149, 45,221, 53,232,117, 12, 94, 15,203,113, 41,134, 18, - 79, 73,218,174,163,170,107, 70,227, 62, 29, 82,117, 20,101,201,135, 31,127,196,173, 59, 55,249,224,131, 15,156,149,178,255, 76, -253, 62,242, 52,142, 99,242, 60,231,201,147, 39,172,215,235,237,170, 64, 99,251, 41,161,247,107, 43,148,186,174, 49,214, 18, 37, - 49, 81,226,172,143, 97,236, 38, 20,142,209,174,120,246,236, 25,171, 60,195, 19,146, 48,148, 8,237,238,159,245,122,197, 98, 93, -240,177, 39,248,246,183,191,201,222,222, 30, 95, 94,205, 24,141, 70,100,121,197,245, 27,183,249,226,241, 83, 6,195, 9, 15,223, -124,155, 71,111,189,195, 98,181,228,234,234,138, 85, 31,177,154,175,242, 45,125, 81,107,221,119,234,158, 75, 77,236,215, 42,162, -191,231,186,174,219, 90,216, 2,225,152,249,142,232, 24,161,141, 32,140, 18, 60, 79, 48, 95, 45,105,234,142,174, 53, 12, 82,183, - 34,172,139,146,201,100,204, 59,111,191, 77, 20, 5, 92,158,157,147,175, 51,126,241,241,167, 68,113, 64,146, 68, 28,220, 60,224, -198,238, 62, 47, 94,188, 96,190,248, 21,190,114,194,187,170,236,133,196,158, 4,227, 92, 12, 18, 15,221,118,120, 72,238,223,123, -131,187,247,110,209,180, 69,143, 27,142, 25, 12, 70,100, 89,193,147, 95, 61, 99,185, 46,216,221, 61,160,104, 86,204, 86,107,166, -211, 49,239,125,240, 29, 38,163,136, 23, 47, 62,103,189, 56,227,197,235, 67,222,255,214,187,180,186,161,179, 30,117, 97,241,252, - 9,159,125,250, 37, 71, 71, 23,188,245,246,183,248,205, 31,254,136, 95,124,248, 41, 45,130,117,101,248,233,207,127,193,205,127, -246,125, 2, 37, 16, 42, 64, 98, 29,120,172,110,113,254,193,197,146,233,237,155,172,171,142,215,103, 87, 60, 59,204,201, 10,193, -213,114,141,182, 53,215,111, 37,220,190,189,135, 53,110, 20,209, 20,151, 36,233,148,188,172,184, 88,100, 36,211, 3, 30, 60,124, -135,139,185, 83, 41, 78,166,215, 88, 25,103, 43,218,236,217,132,173,176,182, 67, 89,137,177,150,198, 64,153, 23, 28, 62,123,193, -147,199, 79, 41,109,128,136, 35,146,225,144,178,171, 33,171,249,187, 79, 62, 39, 91, 92,242,219,223,122,139, 81,236, 67,167, 25, - 12,124,172, 0, 31,159,116, 58, 36,138,124,162, 48,196,235, 12,109,233, 18,195,164,215,186, 28,232,201,192, 89, 15,130,128,221, -189, 41,235, 34,199, 15,122,213,179,142, 93, 26, 14,138,227,163, 83, 60, 33, 73, 7, 3,222,120,243, 17,109, 45, 56, 59,190,160, -204, 13,255,253, 79,127,198,229,229,140,235,183, 30,113,255,193, 13,180,205,156,114,221,118,212, 89,193, 32, 29, 51, 78, 7, 52, - 85, 67,158,151,104,107,104,219,138,211,179,130,233, 56, 97, 50, 78,216,157, 14, 73,163, 16,164, 1,237, 54, 90, 32, 48,248,100, - 89,195, 98, 85,210,116, 0,153, 35, 98, 9, 71, 8,211,186,166, 49, 37,218, 22,189,192,163, 97, 57,111, 40, 51,201, 48,142, 89, -213,167,152,106, 77, 75,202,122, 62,195,211,183, 8,131, 1,157,205,208, 6,162,120,140,192,195,118, 5,214,235, 72, 98,197,168, - 11, 72, 67, 55,234,106,116, 73,217,168,173, 29,200,106,225,172, 83, 74, 97,172, 68,201,144,101, 86, 80,154,154,170,117,121,240, -161,159, 96, 59, 39, 90,113, 98, 44,131,177,146,170,172, 49, 6,164, 23,160, 77,139, 49, 30, 77,211,145,196, 17,113, 52,116, 96, - 9, 79,109,169, 91,158, 17,148, 69,195,254, 94,132,244, 21,243,217,138,243,139, 75,130,192,231,224,214, 62,179,217,130,249,252, - 98, 43,184,242, 8,200,214, 37,101,233,246,248,103,167, 87,220, 80,123, 14, 66,211,184, 98,233,242,236,156,203,162, 98,157,175, -216,223,153,114,116,114,204,205,253, 3,246,247,119,249,232,111,127,206,243,167, 79,185,113,227, 6,203, 50, 39, 8, 99, 62,253, -229, 99,110,220,186, 77,107, 5,167,199, 39,164,227, 41,163,221,169, 59, 16,133,162,170, 27,220,224,217, 81,201,154,166, 35, 12, - 99, 6,241, 16, 79, 73,186,206,112,126,126,182, 29,135,111,178,171,135, 67,135,203,156, 47, 23, 46,164,165,127,208, 23, 69,177, -221, 87,111,252,175, 27,165,118,211, 52,196, 97,180,237, 72,132,112,169,122,105,236, 72,100, 27, 66, 93, 93,215, 4,177,179,210, -157, 92, 94, 56,149,182,255,235,153,223, 82, 74,202,178,220,250,214, 55,215,124,235, 51,239,195, 26,165, 39,182, 93,219,112, 56, -220,118,107,170,199,109,126,221,121,176, 89, 13,108, 30,180, 27, 28,231,166,112,216,116,120,155, 41,192,198,211,237, 14, 92,177, -253,221,155, 3,117,227, 87,239,186, 6,225, 57,205,197,120, 60, 38,203, 23,104,221,114,235,214, 77,142, 95, 31,187,181,133, 84, - 36,225, 0,131,116,163,198,126, 36,110,117,139,214,174,128,149, 82,210, 25,141,210,138,166,169,233,186,102,171, 15, 8,124,243, -107,135,250,102,215, 60, 24, 12,183,206, 5,183, 18,113,175,115,195,134,159, 93, 94,185, 67,209,124, 85, 32,109, 14,195, 13, 76, - 72,120,118,171,188,119,211, 13,111,251, 59, 55,215,107,179, 31, 70,176, 45, 76,173,241, 56, 63,191, 68, 27, 67, 20,134, 91,253, -193,134, 67, 63, 26,141,208, 93, 67, 16, 40,226, 52,101,177,184, 98, 62,155,241,171, 95,253,138,111,125,243, 93,242, 60,231,103, -127,245, 87, 40,233,184,248, 89,150,109, 69,141,131,193,128,247,222,123,207, 33,125,123,206,193,230,190,216, 56,144, 54,147, 10, -103, 97,116,106,241, 44,203,182,239, 47,142, 99, 30, 63,126,204,211,167, 79, 49, 8,118,118, 92, 26, 93, 20, 39, 36,113, 68,211, - 86, 68,190,224,197,179,199,236,237,140,248,198,219,239,146,198, 3, 62,249,228, 19, 23, 71, 59, 26,211, 26,203, 71,159,124,202, -219, 77,221,243, 18,220,106, 69,162,241, 52, 36,105,228,210, 29,155, 6, 99, 59,172,238, 48,214,163,235,218,222,246,183,113, 75, -244,188, 4,207,133,224, 12,135, 35,146, 36,193,235, 93, 5, 27, 7,131,198,110,119,232,155,247,209,180, 21,113, 28,179, 51,157, -146,132, 1, 89,182,226,242,226,140,201,120,200,222,254, 62,139,171, 43, 86, 89,129, 62, 58,103,144, 78,200,214, 5,101,213,178, -191,127, 3,211,118,206,109, 35, 55,154, 4, 31, 97, 5, 66, 9,186,182,102,177, 88, 50, 26,166,124,254,249, 47,201,178, 37, 77, - 91,112,124,252,154,162,168, 72,146, 1, 88,159,163,227,115,198,163, 51,234,182, 97, 49,191,226,224,198, 53,198,227, 1, 55,111, -236,115,239,238, 77,206,206, 46,120,125,114,193,253, 55, 42, 34,153,160, 68,200,147, 23, 47,121,250,244,136,231, 47,142,169, 58, - 67,222,125,201,222,254, 1,225,112, 12,243,156,193, 96,151,121,214,242,248,229, 49,161,106,241,125,185,253,172, 85, 99, 66,108, - 48,194,139, 71, 84,214,167, 18,112, 89, 88, 78, 87,150,179,171,156,198, 8,202,166, 97,233,213, 60,191, 60,103,156, 70,188,121, -255, 45,158,190, 62,230,234,252, 25, 55,111, 28,240,250,232,132,131,251, 1,121,107,153,207,115,132,148,212,101, 73, 18, 36,172, -215, 87,204, 46, 46,121,237,119, 8, 91, 16, 39, 1, 42,144,248, 81, 72,228, 39, 36,114,200, 94,114,192,163, 27,111,177,212,146, -204,132,120,126,196,193,193,144, 40,176, 52,171, 51, 86,213,146,100, 39,226,214,205, 41,186, 45, 24, 12, 28,225, 43,136, 70,116, -120, 46,134, 19, 75, 71,131, 85,160, 60, 73, 26,197, 36, 81,140,176,224,201,152,201,100,135,178,169,241,227, 24,109, 12, 50, 8, - 56,187, 88, 48, 74,247, 24, 15,238,240,222, 55,126,155,186,116,163, 39, 79, 72,206,206, 46,248,244,179, 23,204, 46, 43,142, 14, - 75,140, 73,249,240,111, 95, 18, 6, 59,196,163, 61, 86,203, 37, 88,141,169, 74,234,172,198,195,167, 45, 26,138,188,114,224,155, -222,126,116,114,126, 65,163,155, 94,133,235,161, 80,216,206, 67, 89, 9, 4, 8, 66,116,103,105, 77,192,170,104, 56, 63, 63, 7, - 4,227,209, 14, 90,119, 40, 31,160, 34,138, 61,146, 36, 98, 58,220,227,246, 65, 74, 32,166,212,186, 99,176,231,147,103, 75,154, - 85, 71,234,135, 4,126,138,240, 21,101,155,128, 53, 8,237,225,233,142,206,128, 53, 53, 2, 67, 44, 45, 67, 95,144, 40,143,194, - 51, 78,105,218,108,208,135, 30,194,115,217,189,109, 91,210,118,134,197, 98, 69, 39, 4, 23,243, 5, 69,217,144, 38, 17, 74, 27, - 60, 58,162,104,208,239, 34, 19, 2,127,197,124,177,164,105, 4, 69,209,226,217, 8,219, 25, 4, 49,186,145, 52, 90,163,133,160, -200,220, 23,197, 23, 3, 6,145,160,107, 37, 85,221,209, 54, 13,243,229,156, 32, 16,140,119,118,232, 90, 15, 33, 35, 44, 30,194, -115,239,205,147, 13, 82, 37, 8, 47,226,242, 98,201,238,254, 14,199, 71, 71,196, 94, 66, 28, 57, 21,245, 71, 31,125,132,140, 98, -170,170, 64,248,130, 91,119,111,241,199,127,242,199, 36,202,231, 31,254,163,223,227,163, 79, 63, 97,125, 92,147, 21, 57,201, 96, -200,203,163, 83,252, 40,230,173,119,223,229,249,203, 35,132,242,169,178,130, 46,207, 73,195,128,182,105,208,218,169,109, 7,105, -218, 7, 67, 8,218,186,225,226,114,206,112,232,188,222, 69, 81,112,239,222, 61,194, 48,228,232,228,152, 60,207,183, 15,201,205, - 65,183, 57, 20, 58, 99,144,190,143,217, 28,144,198,226, 89,247, 32, 42,138,130,182,114,177,172,155,241,249, 70,157,109,173,101, -127,223,217,157, 54,120, 90,235,241,107,112,151, 13, 10, 22,192, 15, 67,132, 82, 52,235,245, 87, 66,215,254,161,183, 17, 15,153, -214,137,229,210, 40,102,189, 88,226,247,211,134,175, 23, 30,155,131,191, 51,186,143,232,117,200,205, 52, 78, 72,211,212,117,249, - 61,228,198,246,196,174,205, 62,127,115,136, 24,211, 17,134,126, 31,107,217, 97,140,102,255,218,158, 67,217, 90,205,106, 61,231, -141,123,119,251, 67, 88,160,164,199,247,127,251,183,152,207,231,224, 41,140,134,103,207, 94,242,234,229, 75,210,225,148,219,183, -111,161,148,100,157, 23,219, 0, 20, 79,186, 21,161,214, 78,176, 86,102,107, 76, 24,162, 67,221,107, 8,116,255,254,221, 56,126, - 83,112,109, 38, 27, 82,134,191,182,166, 72,122, 91,108,219,213,191,230, 18,168,170,138,186,117, 63, 81,232, 4,129,101, 89, 82, - 85,229,215, 4, 94,221, 22, 70,164,187,166,167, 82,250,219,238,146, 30, 45,170,250,145,255,114,181,194,244, 98,174, 13, 44,166, -169, 75, 14, 14,238, 49, 76, 83,164,132, 52, 73, 88,173, 86,204, 23, 11,167,174,110, 90,174,214, 51,130,224, 43,134,189,181,142, -137,159,101, 25,162, 47,246,182, 69,197,182, 80,115,162, 63,235,245, 40,223,208, 89, 87,139, 94, 31, 2,112,251,246,109,132,128, -251,247,239,146,101, 5,151,179, 25,187,187,187,124,255,183,127, 11, 33, 4,255,253,191,253, 41,227, 97, 12,186,227,252,248,152, -135, 15,222,224,225,195, 7,124,250,233,167,180,157,225,106,182, 96, 50,222, 97,181, 94,240,217, 47, 62, 97,181,118, 60,130, 40, - 10,192, 58, 11,155, 31, 38,116,198,210, 84,206, 50,230, 75, 73, 24, 6,253,181,118,154, 28, 39,226,244,176, 88,164, 80, 4, 42, -216, 2,159,162,208,193,117,140,117,247, 88,215,116,248, 42,100, 52, 10,182,123,121, 33, 93, 94,123, 28, 57, 49,161, 53,154, 40, - 8,153, 78,167, 46,224,167,168,217,191,182,203,108, 54,103,182, 88, 82,214, 13,171, 85, 78,158,189, 98,119,239,128,174, 3, 41, - 2,112,136,117,199,159,144, 10, 79,187,160,151,182, 49,204,103, 75, 70,227,152,157,221, 17, 39, 39, 71,248, 97,192,245, 27, 55, - 72,226, 49,214,115, 22,207, 81, 56, 37,142, 67,222,252,198, 67,124, 95,240,240,225,155, 8,227, 99, 57,225,228,116,201,159,253, -197, 71,236,142, 38, 92,219,191,193,108, 6,175, 14,115,214,101, 72,148,196, 60,127,125, 78,227, 41, 38,215,174, 49,207,106,154, - 90,160, 85,204, 79, 62,252, 2, 97,221, 84,169,233, 92,161,169, 42, 99, 92,140,103,163,123,239,224,132,178, 59,162,196,167, 20, -176,200, 11, 16, 1,148, 37,139,227, 43,222,121,227,128,183,223,251, 13,138, 34,224,229,171, 51,158,191,120, 5, 66, 18,132,130, -117, 83,114,176, 63, 69, 40,197,147, 47, 62,103,124,115, 15, 69,196, 50,175,120,250,234,132,174,203, 25, 15, 6, 68,105, 68, 50, - 26, 48, 26,198,204, 78,207, 56, 61, 94,162,100,130,180, 32,141, 79, 85,105,162, 40, 64, 55, 21,163,225,148,186,185,196,147, 16, -164,138,186, 48,104,209,208,232,130,200,143,176,149, 27,171,250,190, 75,142,210,214,135, 86,163,176,208,105, 58,107,145, 97,196, -197,122,133, 39, 92,215, 48, 91,174,105,235,154,233,100,143,178,177,120, 34,228,253,239,253, 61,202,166,160, 49, 29,143,159, 60, -230,228,104,193,203,195, 75, 94,189, 90,224,169, 17, 65, 56,224,207,127,250, 57, 54, 76,249,173,239,189, 67,145,173, 8,188,150, - 81,236,208,130,202,143, 9,148, 34, 16,146,170,106,168, 26, 75,163, 43,132,241,232,106, 67,177,174, 16, 26,164,167,192,120, 40, -207,128,180,232, 18,130, 52, 38, 74,198, 8,105,128, 75,124,223,231,250,141,125,146, 40, 68, 72,141,103,107,146,129, 79,153, 23, -248,114, 0, 58, 64, 48,116, 10, 80,149, 97,166, 17,245, 90,115,113,118,233, 44, 80,190, 64,119, 46,124,161, 40, 42, 2, 95, 33, - 68, 8,218,208,214, 29, 77,209, 97,170, 25, 94,187,192,143, 71, 24,237,110, 6,172, 4, 47,164,238, 42,102,153,179, 21, 54,218, -163,179,130,107, 55,110,210, 52,103,188,126,117,132, 47, 45,131, 36,225,214,141, 3,134,131, 41,117,221, 50, 28,140, 16,242,136, -249, 50,231,248,244,156,245,114, 73,215, 53, 68,190, 34, 91,172, 89, 95,205,233, 58,215,117, 54,157,233,149,185, 29, 73, 50,226, -232,245, 25,171,213,138,251, 15,239, 16, 69, 17, 97, 40,251,226, 74,244, 68,172,154,174, 79, 75,106,154, 22,107,157, 10,126,177, - 88,241,248,201, 33,187,187,187,232, 26, 14, 79, 47,209,202, 71,123,130,241,206,148,231,175,143, 9,211,132,159,252,229, 79,161, - 40,249, 87,255,226, 95,178,174, 42, 62,252,236,115,194,116, 64,217,181,204, 22, 57, 72,197, 56, 29,240,228,201, 51,164, 31,178, - 92, 46, 93, 18, 84, 26, 19,199,105,127,168,107,226, 52,117,209,175,158, 36,207, 75,230,243, 57,163,233,132,197, 98, 78,154,166, -220,188,121, 19, 41,229, 54, 53,109,181, 90,109, 15,181,141, 72, 42,142, 99, 55,194,239,213,242, 65,223, 17,111,194, 81,182,224, -147,174,101, 28,133,220,187,125,135,179,203, 11,142,142,142,120,240,232, 33,195, 36, 37, 29, 13,121,242,197, 99, 46,103, 11,180, -117,145,166, 27,191,243,112, 56,116,232,209,170, 36,142,226,109,224,204, 86,169,110,204,150,211,238, 4, 68, 78, 73, 44,133,192, -143, 66,178,203, 11,100,224,111,125,219,155,189,189,110, 90, 90,227, 20,200, 89,158,109, 71,243,155,223,183, 33,211,133,202,119, - 97, 62,190,218,238,170, 55, 36, 64,199, 34, 79,104,154, 13, 3,190,161, 45, 42,212,222, 46, 31,188,255, 93, 86,139, 43,142,143, - 95,115,121,113, 66, 20,187,195,245,151,191,252, 2, 33, 21,218,202, 94, 8, 37, 72,134, 3, 16,174, 59,190,115,255,222,118,212, -188,153,150,104,229,112,167, 82, 74,172, 54,253, 33,238,108, 80,109,163,191,210, 72,244, 19,146,205, 52, 98, 35,158,219,188, 94, -128,174,113, 29,186,146, 1,168, 62,190,179,211,238,122,212, 37,208,231, 2,244,187,244,141,171,193,152,110, 75,170, 67,186, 41, - 64, 83,105,240, 36,251,195, 49,131,193,136,188, 42,145, 65,136,232,233,129,110,125,197,215, 60,238,154,203,203, 75,222,124,243, - 97,239, 77, 31,178, 51,157,246,163,126,193,119,222,255, 14, 39, 39, 39,156, 29,159, 32,165,216, 18, 0,157,191,219,221, 79, 39, - 39, 39,110,189,214,125,229,207,223,252,108,238, 1,107, 29,228, 74, 8,129, 71,191,198, 48, 94, 95, 64, 58,141,144, 82,138,229, -114,217, 51,235,221, 4,232,155,239,189,203,171, 87,135,196,126,232, 14,230,162,160, 92,175,248,173,239,126,192,127,251,179, 63, -103, 56,112,171,141, 65,156,176, 88, 44, 28,148, 73,244,205,141,244,157, 86,192, 10, 20, 6, 45, 61,180, 22,120,125,129,218, 52, -213, 22,221,235,138, 66, 69,216,239,251,195, 36, 38,244, 3,124, 37, 89,175, 29,125,206,104,139,244, 21,121, 94,110,255,222, 98, -177,112,159,167, 39,152,140, 71,212, 69, 78,219,180,220,187,123,135, 48,144,120,198,178,204, 92,138,221,112, 56,228,248,248,136, -197,108, 78,224,135,236,238, 70,172,150, 69,127, 29, 45,190, 50,212,157,163,219,249,248,120, 94,136, 39, 37,203,229,146,186,222, -239,239,153,152, 60, 95,211,182,154, 65, 58, 36,203, 10,210,193,148,225,100,140, 82, 1, 85, 85, 16, 38, 46, 70,121,157,101,140, - 78, 71, 4,114,204,122,173, 73,146, 17,179,133,102,190,156,241,203,167, 87, 88, 19,144, 87, 22,229,199, 92, 94,205, 9, 18, 55, - 81, 25, 12,199,220,189, 47, 57, 61, 94,208,169, 0, 99, 98,234,178,117, 69,200,122, 69, 83, 21,168,209, 52,225,244,226, 21,239, - 60,122,147, 74,123,156, 30, 93,210,106, 65,169, 45,151, 69,134,145, 10,211,106,200, 90, 2, 3,217, 85,198,139, 47,158,240,232, -141,187,172,151,115,146, 40, 69, 42,197, 96, 39,229,166, 7, 50, 24,210,180, 22,186, 21,171,249, 5,111,220, 59, 96, 94,181,204, -214, 13,167,167, 23,248, 98,197, 96, 52, 96,188,155,115,243, 70, 72, 62,239,184,202,161,212,150, 85,150,209,145, 16, 4, 17,182, -169,208, 93, 77,219, 72,186,218,226, 4,135, 29, 81, 56, 64, 8,195,104, 24,225, 53, 30,177,145,248,173, 69,122, 21, 81, 40,200, -214, 57,210,250,216,210,210, 74,143, 78,128, 54,150,227, 85,198,170, 52, 44,150, 5, 74, 72, 6,129,160,110, 64,136,128,221,157, - 61,106,163, 89,149, 37,126, 32,105,180,225,233,203,167,116, 54, 34, 24, 13,169,108,204,101,163, 17,123,215,248,228,217, 11,210, -145,228,253,183,175,209,102,151,248, 8,118,118,247, 49, 86,226, 41,197, 48, 78, 57, 60, 60,164,235, 26,166, 81, 76, 28, 14,152, - 76,135,164,105,140, 49, 29, 69,221, 96,172,135,246, 13,210, 87,212, 29, 46,109,204,143, 41,242, 5,247,239, 60, 64,120, 13,211, - 65,128,146, 6,109,106, 60,163,209,101, 71, 40, 5,214,212,116,182,115, 59, 30,233,224, 53,249,122,137,174, 45,147,161, 66, 55, -107, 76,235,209,148,165, 27,163,106, 75, 93, 22, 72,229, 97,140, 34,207, 43,170,206, 50, 74, 90, 70,105,197,210, 4, 40, 92,193, - 48,155,175,137,125,197,235, 87,167,124,254,197, 51,158, 31,190, 38,140, 19,254,215, 63,252, 95,216, 29, 39, 28,159,188,164, 45, -156, 39,248,224,198,117, 14,143,142,201,215, 37,105,154, 18,197, 3, 90,107, 72,198, 41, 50, 82, 60,253,248, 41,215,247,118,185, -190,115,155, 72, 41,108, 47, 88, 82,129,143, 10, 36, 85,215, 18, 15, 7,160, 93,183,210,232, 6, 63,244,136, 82,159, 32,144, 20, -229,156,233,206,128,162, 4, 63,156,226, 11, 31, 33, 12, 82,129, 18,134,229,226,156,221,253, 91,148,181,229,197,209,130, 52, 29, -241, 39, 63,254, 75,140,149, 52, 66, 82,213,154,186,110, 89,173, 47,105,154,134, 7,247,238,243, 63, 62,254,196,133, 47,164, 19, -188, 32,160,174, 51,130, 56,197,120,176, 92,172, 29,135,161,223,107, 15,227, 8,211,105,199,239,238, 44,147,201, 14,227,241,152, -245, 98,201, 50,155, 1,130, 32, 14, 40,203,124,139,125, 77,146,132,243,243,115, 78, 78, 78,208,214,217, 1,235,182,117, 57,222, -158,135,244, 29, 36,101, 60,157,244,124,244, 14, 79,122,212,117, 73,211,181, 36,131, 20,131,197, 15, 93, 8, 15,194, 1, 98,206, - 47, 47, 16,210, 71,170,128, 86, 91,158, 62,123, 65, 94,214, 46, 92,163,238,250,224,146, 20, 99, 52,231, 87,231,238,128,143, 2, - 84,168, 8, 35,159,229,106,222,171, 99, 13,173,110,176,158, 65,111, 14,101, 15, 68,232, 19, 70, 17, 89, 93,146, 21, 37,215,246, -246,177,214,163,204, 74,148, 80, 40, 79,209, 89, 39, 68,172, 5,172, 51, 13,214, 41,162,187, 40,162,200, 86,228,189, 53,111,144, -164, 8, 37, 25,166, 3,218,206,141,223,163, 40, 34, 43,221,200,219,246, 1, 24,109,219,162,148,192,235, 74,150,153,163,237,249, -190,143,237, 90,210, 36,233,187,115,201,106,157, 51, 95,173,177, 72,167,101, 8, 3,166,211, 41, 81, 16, 50, 91, 46,216,187,182, - 79, 50,136,185,121,251, 38,235,165,123,192,183,117,135, 64,210, 53,142, 88,231, 75, 15, 55,124,114, 54,168, 64,245,206, 10,165, -168,218,142,188, 42,232,172,235,228,133,242, 9,227,196, 17,236,112, 93,153,181, 95, 37,171, 21,217,138,108,181,166,170, 10,108, -175,212,142,211,132, 56,142, 49,157, 35,237,185, 52, 46,225, 98, 79, 91,231, 51, 6,208, 18, 86, 85,195,142,177,216,178, 6, 4, -109,167, 73,130,240, 43, 84,111, 20,184,116,183,229,140, 40, 86,120,158,229,229,171, 23,124,235,221,247,200,178,140,225,104, 66, - 24,134,156, 28, 95,240,205,111, 26,254,254,239,254, 30,255,249, 79,254,152,227,227, 99,188, 44,163,235,177,165,129, 47, 41,242, -140,189,221, 93,162,158, 73,223,182, 45,237,215, 10, 23,207,243,156,152,210,210, 11, 7, 37, 65, 16,162,117,135,213, 22, 63,112, - 35,253, 40,136, 57, 62, 61,225,252,252, 28,173, 53, 79, 30, 63,221,186, 3, 54, 83,159,119,222,124,155,245,226,146,231,121,198, -157,251, 15,120,116,255, 14,199,199,167, 68,210,223, 78, 10, 84, 24,161, 2,197,213,108,198,238,254, 30,203,171,153,115,124,248, -138,208, 87,120,214,108, 69,124,198,208,175,242,250,238, 59, 14,144,158, 96, 52, 24,130,176,196, 97,128, 18, 30,131,216, 1,141, - 54,215,178, 51, 46,112,167,168, 74,210,225, 0, 41,224,141,123,247,152,207, 47, 56,216,223,229,248,240, 37,145, 15,247,238,222, -230,213,171, 87,140,135, 9, 85,238,154,205,239,124,231, 59,156,157,157,177,183,183,199,229,213,140,166, 45, 24, 77,198,206, 66, - 41, 13,160, 25,141, 6,172,179, 2,221, 23,168,171,197, 37, 77,231, 10,195,211,211, 83,222,121,243, 45, 30,171, 39, 8, 79,209, -182,154,243,243,115,226,100, 64,158,151,132,161, 79, 94, 24,206, 78,142, 72, 98,159,211,163,215,152,230,140,201, 32,165,177, 26, -207,143,168,234, 26,235, 75,146, 48,194,203,215, 52,197, 26, 99,214,216,206,199,183,134, 36,240,105,163,152,201,174,187, 62,149, - 86,148, 90,178,174, 58, 46,174,230,116,117,134,250,228,151,159,115,113,113,198,213, 34, 98,153, 85, 60, 61, 90,240,233,171, 43, - 94, 46, 44,245,255, 71,214,155, 62, 73,146,228,231,121,143,199,125,229, 81, 89,149,117,244, 61,199,206,137, 37,102, 23, 32,151, - 32, 5,194, 8,202, 40, 51, 73,159,248, 63,234,155, 76, 34,105,144,201, 36,163,129, 32,176,192,130,187, 36, 23, 24,236,156, 61, -211,211,211, 93,119,229,157,113, 71,184,187, 62,120, 68,116,181,216,102, 99,115, 88,117, 87, 77,102,164,251,239,120,223,231,117, - 19,164,170, 72, 66,151,145,155,160,168,209,181, 98,183,217,112, 48,155,243,232,233, 19,100,165, 40,138,156,253,126, 67,209,150, - 88,214, 14, 41,161,173, 75, 92,215,198,241, 92,230,103, 15,248,235,191,250, 21,151, 23,119, 76,198,115,142,136, 41, 68, 77,165, -151,212,185,177,145,229,178, 54,151,149,150,180,109,141, 45,204,238,217,178,124, 28,140, 58,218,117, 61, 84, 93,227, 90, 6,147, -105,107,155, 42,173, 17,142, 70,201, 2, 79,152,145,136, 35, 52,174,237,226,184, 62, 25, 45,231,119, 43,190,120,117, 65, 50,123, - 64,214,216,220, 93, 93,226,171,138,249,193,132,227,227, 51,178,188, 2,199, 54,194,157,218,164,111,125,252,241,199,252,242,215, -159,147, 86, 30,141,237, 64,144,160, 81,220,238,174,249,241,194,226,179,247, 19,222,121,114,130,106, 53,150, 16, 52,178,165,169, - 75,182,155, 13,219,205, 53,142, 45,152, 79,206, 24, 37, 30,162, 45, 89, 92,221,209,162,113, 60,159, 32, 25, 81,182, 5, 74, 53, - 56,118, 64,145,237, 73,235, 10,215, 17,120, 97,130, 0,234,116,135, 19,184, 68,129, 75,163, 20,178,146, 72, 52, 74,213,166,107, - 85, 10,173, 5, 77,171,185,187, 91,114, 50, 63,230,228,244,148,221,218, 84,167,237,110, 71, 20,134,200, 78,164, 99,185, 14, 26, - 65,236, 73,102, 65, 68, 18, 79,240,198, 7,252,111,255,254,151,232,198,163, 41, 82,174, 46, 46, 89,223,221,242,242,213, 57,231, - 55, 75,110, 55, 57,159, 61,251,128,125, 94,241,232,244,144,208,117, 80,174,205,227,135, 15, 24, 37, 35,218,249,156,111,127,247, - 21,159,126,250, 41,251,253,150,163,249,140, 74,213, 96,105, 92,223,193,239, 80,158,158,101,227,248, 1, 89,158,147,102, 5,217, -182, 70,184, 54,178, 85, 88,184,132,126,196,100, 20,225, 71, 46,209,200, 35, 74, 92,176, 36, 77, 83, 19,141,142, 13, 47, 94, 11, -132,237, 80, 87, 45,101, 89,211,212, 26,215,247, 89,239, 75,162,201, 1,191,252, 47,255,149,191,255,250, 57,127,240,143,127,129, -114, 60,110,239,150,204, 14, 14,201,138,146,205,110,199,237,106,139, 90,172, 17,150,131, 82, 22,178, 86,236,246, 25,113, 52, 30, -108, 42,150,101, 33,164,164, 42,202, 97,183,137,107,198,144, 66, 8,163,105,200,178, 78,104, 4, 82, 42,102,179, 67,230,243,249, -144,190,118,115,115, 99, 16,166,158,107, 70,125,247, 70,185, 82, 74,162, 36, 30,136, 94,253, 72,186, 23,163,245, 76,242,190, 99, - 31,141, 70,188, 58,127,141,227, 56, 38, 28,166, 99,200,239,187, 81,122,255,231,244, 99,244,126,188,122, 95,176,166,148,122,203, -194,165,135, 8, 84, 51,202,111,149,196,194,128,127,122,248, 77, 89, 87,198,238, 36, 37,113, 24,145,237, 83, 16,138, 48, 8,112, - 61, 99, 3, 43,155,138,217,108, 74,224, 26, 59,208,108,122, 64, 16, 4, 52, 77,195,106,181, 50, 52,184, 81, 66, 81, 84, 70,116, - 86, 55, 70,252,105, 57, 8, 81, 34, 53,184, 66, 32, 21,102,178, 85,150, 8,105, 10,191,249,236,144,147,227, 51,132,237, 96,217, - 46, 63,188,190,224,110,185,166, 40, 13,123,127,126,124, 8,202,232, 4, 94,190,124,201, 39,159,124,194,239,253,244, 19, 94,190, -248,145,213,221,146,192,245,168,242,189,129,246,244, 94, 64,165,141,155,196,243, 7,193,223, 27, 50, 29,195, 88,189,170,170, 97, -100,222, 91,173,218,214,216,227, 44, 84,215,185,107, 2,223,199, 81,198,190,103,187, 14,173,108, 6, 91,156,215,237,170, 77,206, -187,161,143,105, 13,181, 50,188,245, 86,129,163,232,188,216,106,208, 58,248,129, 59, 48,199,173,206,145, 48, 26, 39,188,120,241, -130, 36,140,152,207,231,164,105,198,229,229, 21,183,215, 38,240,231, 23,255,228,231, 60,125,250,148,207, 63,255,220, 20, 77,109, - 75,146, 36,236,119,155,110,119,111, 96, 65,126,135, 78, 45, 58,230,125,219,152, 11,116, 20,135, 67,170, 96,255, 92,180,109,139, -106,205, 62, 59,138, 67, 78, 79, 79, 7,188,176,113,170, 40,116,107, 48,213,174,107,115,120,120,136,231,216, 44, 46,174,136, 70, - 99,110, 46, 47,120,242,224, 1, 22,130,197,106,141, 84, 70,143, 81,181, 13, 77,107, 49,153,206,208,194,198,238,130,137,218,182, - 29,124,232,247,159,205,190,208,233,255, 30, 69, 17,163,177,161, 24,150, 69, 70,150,231, 70,249,239, 58,212,117, 75,154,229, 52, -210,172, 21, 76, 40,143,228,228,228, 1,158,239, 32, 84,136,146, 45,143, 31,158, 97, 91,138,179,227, 57,187,245,202,232,152,132, - 98,118, 56, 37,207,115,150,183, 22,171,213, 10, 75,136,174,112,107,144,178, 69,106, 19,206,227,184, 62,174,103, 52, 17,173, 50, - 83,145,237,126,195,193,120,132, 31,184,198,218,234,133, 20,165, 33,137,198,201,196,172,165, 92,135,192,119, 17,186,165, 42, 83, - 14, 38, 99,222,123,246, 30,215, 23, 43,246,251, 10,108,159,162,108,208,142,207,110,183, 99,187,219, 17,141, 34, 44, 26,108, 59, - 49, 86,103, 20,233,126, 75,150, 53, 72,165,176,108, 31, 91,248,136, 42,224,112,126,194,251,239, 60,193,213, 13,206,243,151,231, - 60,120,112, 74,232,121,172,210, 27,164,198,144,133,178,148, 74, 53,124,244,225,199,204, 15,198, 28,134,154,106,183,160,216, 45, -200,138,138,139,235, 27,164,178,168,139,110,223, 36, 76,184, 69,171, 26,148, 20,228,105, 70,182, 95, 51,250,248, 61, 62,124,239, - 93,254,234,207,255, 10,213,180,212, 85,203,106,185,165,106, 92, 90, 37,216,109, 83,179,167,107, 11, 90,187, 69,182, 53,182,178, - 80,194,248, 40,243,178,198,150,146,116,151, 98,201, 7,228,105,133,237, 9,100, 83, 33,220,160,251,240,152, 48, 7,180,241,127, -107, 97,163, 48, 93, 14, 8,218, 86,113,125,181,196,217,106,252, 96,138,231, 38,136,186,229,245,235,115, 84,227, 17, 71, 9,150, -231, 16,197,190, 25, 25, 7, 30, 79, 31, 63, 99,189,107,248,111, 95,254,200,221,234, 22,237,149,140, 39, 49, 73, 44,240, 2,101, -226, 78, 19,104,235,138,166,201,177, 28,129,235,130,157, 23,140, 15, 32,240, 60,158,190, 59,195,117, 4, 90,182,232,219, 29, 82, -104,180,104,240,188, 26, 89, 75, 70, 81,192,244, 64,224,187, 46, 69,166,112, 45,135, 56, 12,208,173,207,122,181, 66, 22, 46,219, -198, 56, 6, 92,199, 34,136, 2, 2,215, 67, 57,198, 15, 91, 41,200, 74,205,171,187, 13,251, 26,142, 31,189, 75, 37, 82, 19, 51, -233,134,212,218, 70, 34,169,180,192,150, 22, 74, 11, 26, 9,194,181, 25, 77, 79,248,224, 39, 19,254,229, 31, 43,130, 40,225, 48, -182,121,112, 52, 35,137, 66,206, 78,143,249,241,122,197,215,207, 95,112, 48, 25, 97, 9,205,118,181, 68,214, 21,179, 73,204,108, - 28, 19,134, 30,201,217, 41,177,109,243,245,215, 95,243,193, 39, 31,243,244,201, 67,110, 22,215,188,126,245, 35,159,126,250, 41, - 63,254,240,146, 47,190,249,150,182,172, 24,141, 38,198,187,220, 74,118, 69,198,120,118,128, 22, 2,221,104,166,163,132, 48, 10, - 16,142,102, 50,141, 56,102,134, 31, 56, 84,149,100,228, 70,148, 69,101,124,234,173,141,108, 60, 16, 33,101,213, 80,151,130,209, -228,144,151,151, 87, 60,127,254, 28,207,243,184,189,189,229,246,246,150,163,147, 7, 60,123,247, 61,206,207,207,137, 71, 19,234, -186,101,181, 94, 99,223,203,248,238,247,165, 69, 81, 12,138,241,126,255,219, 51,195,103,179, 25, 90,107,150,203, 37, 69, 81, 24, - 53,122,167,126,246, 60,143,195,249, 17,105,110,130, 90, 86,171, 21, 90,208, 69,198,154,241,165, 37, 4,190,231,153,145,123,211, - 96, 11,139,221,126, 55,236,158,237,123, 64,150,254,247,244,162,159, 62, 2,116, 58,157, 14,163,240,126, 4,218,139,212,250,241, -119,127, 24,246,202,220,126, 39,222,227, 50,251,220,133,230,222,215,246, 23,189,109,219, 76,167, 83,118,219,237,192,205,190, 47, -132,107,219,150, 48,122,179,107,142,227, 24,181,151, 68, 65, 72,158,102, 76, 79, 78, 8,195, 96,176, 40,161, 21,150, 0,203, 18, -184,174, 77, 89, 53,247,104,120, 46,142, 99, 65, 33, 81,210,172, 29,138,188, 68,105, 97,240,183,194,198,117,125,194, 56,102,159, -153, 9, 83, 24,134,140, 70, 45,141, 92, 83,149, 57, 69, 22, 18,250, 1, 81,224, 83, 39, 17,231,231,175,208,242, 13, 98,181, 71, -140,122,157, 34,220,192, 75,116, 23,193,233,224,184,158,137,224,212, 26,209, 84, 6,132, 37,140, 42,191,173, 43,100, 83,227, 88, - 22, 73, 20, 17, 4, 62,251,189, 99, 38, 54, 77, 53,196,235,218,150, 97,114,111,183,235,193,183,222,143,188,239, 91, 17, 45,203, - 50,188, 11,101, 46,246,251,239,155, 16, 70,145,222,175, 3, 92,215,165,169,234,142,168,104, 50,221,227, 40,100,185,220,179,220, -172, 57, 62, 59, 29,136,112,233,126,207,197,197, 5,223,255, 48, 99,118, 56,231,240,240,144,243,243,115,124,199, 49, 17,160, 93, -218, 94,211, 24, 87,197,114,101, 66, 85, 20,157, 59, 33, 48, 86,175,126, 84,221, 99,106,123,167,131,198,228,145,175, 86, 43,146, -196, 32,102,231,243, 57,227,241,120, 40,120,109,219, 70,119,249,243, 77, 35,135,226,244,139, 47,190,224,227,143, 63, 29, 46,234, -186, 91,133,216,182, 48, 17,182, 94, 72,154,238,208, 90,147,166, 41,194,226, 77, 42,158, 17, 17, 13,197,105,209, 69,205,122,129, -143,176, 45,154, 86,129,176,153, 76,199, 28, 30, 29,155,215, 28, 77, 83,103,195,179,218,127, 30,250,117,148, 82, 70,136, 23,248, - 14, 65,190,158,158, 15, 0, 0, 32, 0, 73, 68, 65, 84, 28, 32,120,195,241,207,151,107,124,215, 65,203,150,135, 15,207,248,252, -243,207,137, 71, 35,108,219,101, 62,159,155,117, 78, 43,104, 85, 87,124, 40, 6, 1,104, 16,186,228, 59,103,128, 72,245,186,139, -233,116, 74,187, 94,129,101,138,244, 52, 77,201,138,156,233,100,196,120, 60,166, 13,125,230, 71, 51, 30, 63,126, 76,182,107,184, - 91,108,112, 35,147,143,174, 90,209, 37, 61, 22, 52,117,137,104,106,163,113,234, 98,148,133,213,160,149,133,107, 57, 6,202,165, -106,118,235, 59, 2, 91,243,241,179,143,177,100,133,115,185,218,114,242,228, 25,133,210, 20,181, 38, 45, 43,170,170,161,109, 42, -226,192,231,244,232,128, 36,244, 8,236,154,232,224,128, 73,108, 4, 21,183,119,107,164, 18,200, 6,194,208,199, 11, 3, 92,169, -177,164,192,114, 92,146,160,100,183,188,165,173, 43,180, 84,196,190,137, 35,244, 29,143,116,159, 83,183, 14,101, 43, 41,170, 6, -219,181, 80, 14,104,219, 66, 74, 11,169, 37, 46, 6, 24, 0, 29,133,174, 54,135, 72,185,217,226, 11,155, 70, 11,124,219, 88, 29, - 44, 75, 32, 44, 23, 75,184,104, 93, 34, 37,104,213,152, 81, 76,109,146,157,170, 10, 94, 92,188, 38,240,183, 60,123,116, 70,100, -155,253,250,139,231,223, 49,153, 76,137,199, 9,241, 40,194,113, 33,207, 96, 54,153,243, 7, 63,255,140,147, 39, 31,241,255,252, -229,127,230,229,229,146, 52,149,204, 18, 65, 28,135, 28,204, 38,248,129, 32, 12, 2,195, 39,182, 93, 44,199,197,178, 37, 81,236, -210,150, 5,150,221,160,180, 66, 8, 8, 35,119, 32, 48, 89, 94, 64,150,151,204, 14,167,108,214,215,140,162, 16, 89,231, 20,105, - 74, 91, 86,132,126, 68, 83,182, 4,163,168,179,161,128,235,216, 56,150,139,208, 32,235,150,186,148,228,173, 38, 57,122, 66,251, -227,146,207,159,191, 98,116,116,198, 56, 25,161,234, 10,207, 79, 88,167,251, 78,221,106,252,200, 74,105,202,162, 38, 45,204,135, -183,146,154, 63,250,197,207,153, 36, 49,129,213,226,163, 76,154,149,159, 16,141,110, 56,191,184,226,246,250,138,242,189,167,124, -127,251, 10,207,178,120,246,232, 20, 1,216,186, 53, 40,206,249,140, 42,123,192,215, 95,252, 61,101,149,211, 20, 57, 39, 93,220, -237,163, 39,143, 57, 72,102, 92, 93,222, 48, 26,141, 41,170,134,172,105, 40,110,111,137,143,206,204,184,209,182, 9, 60,135, 86, -150, 20, 69,202,110,159,155, 17,168,103,246,157, 23,231, 11,138,188,194,119, 2, 28, 59,160,174, 36,174, 59,193,118,160,108,109, -182,203, 45,127,253, 55,191,226,230,246,142, 48, 30,241,187, 47,191,162,149,154,179,135,143,240,195,152,151,175,206, 9,163,132, -186,174, 7,139, 79,127,209, 85,221, 33,215,239,152,239,251,199, 13,107, 32, 25,178,198,141, 24, 48, 24, 46,244, 48, 12,121,242, -228, 9, 89,231, 11,206,178,140, 36, 73, 6, 30,122, 47,138,234,189,205,213,114,249, 86, 58, 88,216,241,215, 29,215, 25, 84,211, -253,193,222, 95,182, 85, 85,113,112,112, 48, 28,190,253,207,114, 63, 21,172, 63,140,239, 91,207,250, 14, 62,138,162,183, 0, 55, -247,173,108,253,127, 55,162, 52,143, 81,146,176, 90, 26,178,164, 99,217,195, 14,188,169, 12, 63, 61,142,141, 85,176, 85,125,186, -155,217,121,246,227,245, 62,246, 75, 8,193,108, 54, 35, 12,205, 62,127,187, 49, 81,165,202, 6,129, 24, 58,224,222,198,148, 87, -229, 48, 33,176, 61,243, 51,153,132,190,128,205,102,131,235, 5,128, 98, 60, 78, 40,170,210,192, 62,138,140, 36, 50,159, 65,215, -179, 89, 44, 22, 44,151,119,124,242,201,239,241,201,135, 31,177, 88, 44,249,251,191,251,135,238,125, 46,208,194, 70,136, 6, 45, - 12,252,201,117, 93, 28,223,195,241,220, 65, 85,221, 67,101,250, 75,161,191,188,227, 56, 50, 5, 67,219, 80,200, 6,219, 22, 56, -142,139, 99, 11,234, 90, 83,215,205,240,158,244,175,107,159, 47,223, 91, 10,251,241,136,101,117, 64,178,238,107, 85,167, 72, 55, - 86, 46,176,132,131,214,213,240, 12, 98, 91, 84,117,141,239,139, 46,181,108,207,126,187, 51,249,244, 93,208,206, 95,252,197, 95, -240, 39,127,242,199,252,155,127,243,111,248,234,171,175, 40,179, 28,215,117,168,187,231, 69, 41,197,102,187, 37,220,167,104, 75, - 24, 22,134,214, 52,210,236,252,167,201,225, 80,132,244,154,132,251, 69,173,192,128,145,238,195,122,110,110,110, 58,165,190,198, -119,220, 14,184, 3,150,229,112,120, 60,199,243, 13,132,200,245, 28,194,208, 7, 20, 69, 89, 51,153, 29, 12, 0,152,237,118,139, -231, 57,228, 89, 58, 20,150,182,109,211,116,250,144,126, 18, 21,118,206,143,227,227,227, 65,179,176,217,239,140,112,212, 53,133, - 79, 85,155,244, 54, 51,201, 52, 58,134,120,148,240,240,193, 3, 84,211, 80, 55, 21,101, 94,112,118,124, 68,186,219,242,232,193, - 41,139,219, 59, 19,136, 51, 55,207, 92, 85,100,104,121,128,107, 91,160, 20,101,149, 82, 87, 53, 85, 81,162,181, 24, 62, 47, 77, - 93,210,182,146, 81,162,176,109,135,180,200, 57,148, 83,108,219,165,172,114,110,175,111, 57,152, 78,187,105,149,234,216, 17,198, -122,154,103, 37,222, 56, 49, 43,154,202, 56, 51, 62,252,240, 39, 92,223,220,177, 45,118, 68,163, 3, 54,105,142, 86, 45, 77,211, -178,221,164,156, 30, 76,176,132,162, 85,146, 58,207,177,108, 15,219,241,168,218,154,178,172, 16, 2,174,175,206,113,105,249,233, - 79,158,224,232, 6,199, 31,207,185, 94,165,100,219, 13, 85,213,144, 23, 37,139,197,154, 40, 24,241,233,103,159, 18, 56, 80,101, - 27,242, 98,139,111, 11,226, 40, 64, 89, 46,141, 54, 49,127, 65, 18, 97,161,145,186, 37, 8, 34,148, 20,184,182, 71,244, 48, 96, - 20, 56,148,187, 13,251,213, 29,143, 30, 62, 96,187, 41, 80, 88,216,182,139, 22, 54,219,125,137,176, 28,164, 45,176,180,133,210, -134,174,100, 50, 3, 20, 22,150, 73, 71, 82, 13, 85, 81, 96, 9,141,131,198,198,132,118,184, 66,147, 53, 38,218,211, 82, 32,181, -133,214, 46,146,158,103,109,194, 38,210, 60, 3,237, 82,228,138,197,237, 29,178,110,121,120,100,243,222,147, 7,172,157, 59,160, -230,217,211, 57,163,233, 8, 48,227,202,205,114, 65,171, 45,144, 1,170,145, 70, 40,211, 66,145,150, 84, 89,139, 67,140, 43, 20, -105,190, 48,157,158, 42, 57, 56, 56, 36,142, 99,226, 56,102,117,115,199, 98,177,162,204, 51,170,178, 68, 43, 65, 20, 31, 16,132, - 62,233,174,230,250,110,205,122,149, 50,157, 36,236,246, 45,219, 93, 77,145, 22,216,118, 77, 35, 5,121,157, 51,241, 14, 88,108, - 76, 84,102, 32, 3,148,229, 16,184, 30,142,227, 49, 30, 77, 9,221,128,181,136,217,213, 46,203,157,226,175,127,243, 37, 63,255, -217, 79, 25, 69, 62, 69, 81, 83, 20, 13,190,107,198,108,150,176,140,239, 93, 9,234,166,129,194, 80,193,100,190, 39,100, 70, 18, -185, 40, 90,182,235, 29, 94, 80,224,187, 54,167, 39,115,254,219,111,255,158, 23, 47, 94,112, 24,192,199,239, 62, 98, 50, 26, 81, -228, 41,170,174, 73,187, 81,244, 59,207, 30, 35, 28,193,231, 95,252, 61,255,232,103, 63,231,228,236, 33, 8,151, 40,138,185,185, - 94, 34, 29, 27,229,248,104,237,178, 77,151,188,188, 90, 82,216, 33,135,135, 7, 56,177, 67,219,152,238,168,105, 76, 6,250,110, -151, 14, 2, 39, 67,146,179,168,171,140,170,148, 52,210,224,124,247,105, 75, 42,239,184, 92, 93,113,113,117,195,106,151,209,174, - 83,210, 34,231,209,227, 39, 70,215,240,227,107, 52, 22,121,167,130, 5, 8,187, 46,189,233,172, 95,178, 27, 51,246,157,105, 63, -186,235, 67, 64,118,187,221,208,153,228,121,142,148,146,147,147, 19,142,142,142,104,219,150,139,139,215, 72, 36,227,131,177,185, -136, 59,166,187, 81,188,155, 78, 53, 12,125,124,215,198,237, 66,122,124,215, 54,193, 51, 10,180,182,135,206,187,239,242,238,135, -174,244,168,209, 44,203,134,203,166,183, 83,245,158,243, 32, 8, 12,230,185,195,195,246,224,153, 36,140,222,130,175, 40,165, 80, -157,157,140, 46, 62,181,169, 75,194,192, 27,198,206,145, 31, 13,221,100,255, 43, 8, 2, 92,215,101,181, 90, 81, 53, 37,147,201, -120, 16,244,205,143,103,180, 77,133, 86, 45, 71, 7, 51,124,103, 62,188,158, 73, 18,117,152, 84,195,113, 47,171, 10,173, 5,174, - 99,148,237, 89, 71,229,203,138,146,253, 62, 67, 68, 62, 82, 65, 35,245,160,168,247,131, 8,178,140,186, 85,196, 97,128,106, 77, - 20,165,133, 66, 53, 13, 79, 31, 61,226,116, 62,231, 87,191,250, 91,118,155, 13, 79, 30, 63, 99,179,217,177, 79,183,248, 94, 77, - 85, 53,198,195,107, 11,243,188,119,175,143,215, 33, 53,171,142, 0,103, 91, 22, 90,181,104,169,208,178,235,156,109, 3,125,209, -109, 23, 80, 84, 55,200,182,197, 18,102,250,151,223, 75, 70,235, 11,168,222,147,111,117,254,241,172, 67,218,154,162,202,236,232, -223,172, 75,204,248,214, 82,224,218,189, 56, 84,211,182, 53,158,103, 10,194,116,187, 35, 8, 35,178, 52,103,181, 92, 99, 1,243, -249,156, 34,175,216,165, 41,203,197,130,111,190,249,134,207, 62,251,140,188, 40,248,171, 95,254, 85, 23,124, 52, 26,212,250,166, -179,244, 73,146, 17, 97, 96,116, 27,131,231,190, 44,134,169, 81,127,105,246,130, 74, 35,158, 53,232,218,182,109, 25,143,199,111, - 65,143,124,223,237,176,195,116,159,151,128, 56,142,249,240,195, 15,137,162,128,215,151, 23,248,190, 71, 24, 6, 92,221,220,152, - 8,104,161,217,239,183,104, 45,201,178, 10,238,125,207,182,109, 41,186,239,221,219,239,166,135, 6,182,100,123,166,216,117,124, -143,184,227,190,183, 82,210,180,146, 90, 74,131,233,214,122,152,200,132,129,103,240,201,187, 29,117,101,104,144,227,241,152, 42, - 75,141,152,116,113,199,147,199,143,135, 44,120, 45, 91,110,174, 46,248,189, 79, 62,226,251, 31,126, 68,120, 30, 87, 55,119, 84, -181, 17, 55, 58, 94,136,235,134,104, 44,164, 84,228, 85,137,218,182,195, 20,204,113, 28, 3,150, 41,170, 1,231,172, 4,108,215, - 70,247, 17,122, 33, 85, 85,144,167,130,166, 46,176, 80, 92, 93, 92,242,175,255,167,159,177,216,108,249,235,191,249, 53,182, 5, - 74,182,236,183, 59,118,219, 45,161,239, 83, 75,133,103, 9,148, 52,211, 32, 68,131,227, 53, 72, 45, 80,178, 70, 53, 45,101,186, - 69, 91, 10, 45,107, 60, 23,156,215,215, 43,190,127,117, 73,177, 91,155,240, 5,207,231,104, 62,195, 14, 39, 4,182, 36,114, 5, -181, 20, 84, 93, 35,211, 74,141, 84, 2,195, 6,245,240,131,144,116,191,131,182, 96,122, 48,198,149, 22,170,209, 76,147,152,177, -127,194,205,213,119, 4,142,197, 63,250,228, 67,214,139, 61,231,215,251,193,186, 99,105, 7, 41, 45,144,182,121,208,218,150,170, -209,104,173, 80, 66,163, 49,106, 85,167,205,216,239,183, 52, 77,133,101,181, 72, 85, 96, 89, 53, 96,227,249, 2, 28,187, 83,110, -186, 72,109,161,164,130,166, 49, 16, 3, 20, 69, 93,179,217,102,228,133,161, 0,149, 69,139,109, 7,140, 71, 33, 31, 60,249,125, -190,250,242, 11,202, 98,195,249,229,115,238,110,174,121,246,238,123, 36,225, 20,129,226, 55,255,249,215,124,247,205,247, 56,163, - 99,194, 56, 64,183, 37, 69,218,208,212, 80,230, 13,219,245,158,178,204,216,238,247,248,142,143,235,250, 4, 65,132,239,135,220, - 44,175, 88, 46, 22,200,166,229,104,126,140,148, 54,101, 37, 88,109, 10,170, 74,144, 87,146,219,229,130,203,203, 75, 46, 46, 94, -179,221,110, 24,197,230,178, 11,124,151,218,114, 77, 87,232, 71,140,156, 16,161, 28,170,218,120,191,171,170,160, 80, 37,223, 45, -206,249,135,175, 94,225,185, 46,127,247,197,247, 68,241,152,159,188,247,132,124,183, 38,238,148,249,102, 52,153, 97,105, 11,180, -109, 68,135,202,236,146, 84,155,113, 87,109,209,147,144,201, 56,161,109, 52, 74,219, 4,225, 1, 79,158, 60,225,250,230,142,253, -126,207, 79, 30, 60, 37,142, 99,110,174,174, 73,162,128, 90,150, 20,157, 24,175,168, 74,146, 40,226,211,143, 62,226,155,175,190, - 52,182, 26,225,114,115,115,131,146, 2,219,181,113, 67,159,214, 81, 20,117,195, 54,207,241,247,123,102,135,135,148,117,133,106, - 74, 80, 45, 22, 38,179,184,109, 20,150, 2,223, 9,217,239, 82,194,112, 68,186, 47,216,238,115,138, 74,177,205,161, 40,107,138, -235, 27,110,183, 55, 44,215, 27, 52, 22, 94, 16, 48,139, 34, 92, 63,228,245,197, 21,158, 31, 50,154, 76,134, 46, 29, 24,212,178, -253, 40, 61,116,253,206,138,100,248,214,199,199,199, 67,186,213,114,185, 36, 73, 18,242, 60, 71,107,115,209, 4, 65,192,201,201, - 9,117, 93,243,205,243,111, 17,142, 61, 92, 98,247,187, 60,179,211,211,195,120,191, 63,236,211,221,158,192, 51,225, 18,170,149, - 84, 84,111, 41,201,251,174, 47,236,196, 77,155,205,198,240,197,187,117, 65,239,161,238, 21,218,247, 17,179, 67,168,204, 61, 11, - 93,239,125,190,191,119,239, 59, 69, 33, 4, 77, 99,112,162,219,237,214, 8,201,148, 70, 91,250, 45,102,184,232,254,221,182, 5, -162,101,224,199,199, 81,128,208,208,180, 13,117, 81,178,144,106,152,114, 88,150,197,118,181, 6,169,144,109,131,235,120, 40, 41, -209, 74,152,108, 6,199,165,180,109, 2, 55,162,174, 77,231,230,219,147, 97,229, 96, 32, 58, 53, 62,129,137,128, 22, 26,207,119, -112, 43,155,182,109,200,243, 12,219,129,188, 48,157,220, 59,239, 60, 99,185, 92, 81, 86, 57, 31,126,248, 19,126,254,243,159,243, - 55,127,243, 43, 94,124,255, 18,203,245,112,189, 0,207, 11,134,139,119, 40,228,204, 60, 21,161,244,189,248,213, 55, 88,210,186, - 40,105,165,121,175,122, 69,123, 31, 35,108,118,225,111,104,122,247,223,191,254, 61,220,164, 89,215,149,155,192, 65,205,155,203, -179,191,212, 61,219, 25,246,213,126,224,118, 93,157, 25,229,175, 23,203,225,189,117, 93,151,182, 91,227,136,123, 49,180,171,213, -138,187,187, 59,222,127,255, 3,190,248,135, 47,217,237, 55,236,247, 41,174,235,188,137,218,181, 11,150,155, 53,117, 35,135, 9, -141, 33,173,165,248,142, 59, 76,112,250, 73, 86,223,185,107, 37,135,132,193, 30,182,116,124,124,108,180, 50,158,131, 35, 12,253, - 45, 73,198,102, 58, 20,135,216,150,131,212,138, 48,244, 89,174, 55, 28,207, 79,241,125,143, 34, 75, 77,162, 95, 99,210,239, 54, -233, 30,191,123,221,238,255,178,109,147, 64, 56, 26,141, 58,187,154, 41, 48,243,238,188,105, 59,221,128,112,108, 38,179, 3,162, -182,101,181, 90,177, 94,175, 17,194, 30, 8,138,155,205, 6, 75, 41,154,178,226,108,126, 4, 82, 49,142, 13,208, 72,181,186, 35, - 8, 58, 28,207,143,136,227,152,100, 52,194,178, 28,163, 25,169, 91,230,179, 67,202,166,161,172, 90,202,114, 7, 88,248, 65,130, -231,249, 3,215, 32, 8, 34,202,178, 52,227,245,241, 49,155,172, 64,183,138,182,105,240, 3, 35,182,109, 42, 3,176,234, 87,124, -174, 99, 10,192,155,155, 27,190,254,230, 75,158, 62,123,204,119, 47,126,224,250,110,133,110, 59, 74, 93,217, 16,120, 30, 85,217, -160, 29,115,147,153, 76,250,170, 35, 41, 26, 75,223,205,237, 53, 77, 93, 16, 5, 30, 89,182,199, 79, 2,156,162,133, 70, 9,220, -104,130, 23,143, 57,154,205,120,226, 5, 4,201,152,197,114, 77,189, 95,152,135,160,227, 59, 75,165, 81, 56,216,174,141, 70, 80, -214,173,153, 46,137, 55,190, 87, 27,240,109,219,116,139,251, 13,186,205,113, 45,135, 39, 15,143,105, 26,155,203,187,181, 73,244, -241,124,227,101,214, 22,173,173,105, 90,144, 6, 32, 70, 35, 20, 26, 69,100,219,200, 86,163,132,196,114, 21,241,200,199,166,197, -193,176,218, 61, 92, 90,109,163,148, 17,188,212,117,139,106, 90,116,157,161, 91, 88,100, 41,109,219,114,117,117,205,102, 43, 64, -155,124,227,249,124,142,101,195,102,115,139,109,181,216, 86,131, 45, 20, 81,224, 16,250, 30,227, 56,162, 21,150,201,218,237,173, - 49,181, 68, 85, 53, 69, 86, 99, 80,246,130,208,137, 16,142, 98,145,175,113,241, 80, 45,228,105,142,146,130,186,150, 52,181,162, -170, 36,101, 5,127,247,249, 55,172,246, 5,223,191,188,164,146,154,197, 42, 35,203, 21, 8,151,147,211, 67, 52, 9, 78, 50, 97, - 93,187, 20,187,148,197,111,191, 66,107,201, 40,142,153, 29, 28, 49,155, 30,226,251, 17, 85,217,144,101, 5,121,109,243,171,223, -125,207,249,229,150,217, 65,204,118, 87,243, 15, 95, 60, 71, 43,201,108, 18, 98, 11, 69, 93,101,216,150,232, 14, 47,176, 45,223, - 96, 71,148, 70, 8,197,108, 18,161,218, 12, 89,231,200,202,162, 81, 2,173, 29,214,219,138, 47,190,120,206,108, 54,227,116, 62, - 99, 60,158,144,101, 5,233,106,141,208, 83, 26, 41,209, 26,172,192, 38, 91,231, 36,211, 9, 19,103,194,199, 31,125,200,249,171, - 31, 13, 15,223, 9,240,131,200,172, 79,218,130, 52,173, 88,175,151,164,219, 13, 69, 89,210, 86, 5, 79, 79,167,168, 50, 71, 54, - 53, 40,141,146, 13,170,105,113,113, 76, 6,178, 31, 82,228, 21, 47, 94,190,166,168, 37, 74,120,248,181, 70,105,193,221,102,193, -197,221, 5, 85,171,153, 78, 71,140, 38, 83, 26,169,209,216, 38,106,114, 60, 54,151,146,237, 18, 68,101, 71,193,218,155, 93,183, - 99,254,236,190,202,238,247,231,227,241,120,216,205,110, 54,155, 65,136,150, 36,137, 1,224,116,130,185,205,102, 99,108,110, 97, - 64,154,101,168,110,124,110,117,145,172,253,103, 65,104,216,109,182,198,194, 87, 55, 70,224,105, 59,248,142,201,124,239, 15,211, -254,176,186,223,161,247,252,116, 33, 4,163,209,104,232,210,251,124,112,219,182, 13,253,205,245,134,113,118,255,245,189,151,122, -191,233, 46,235, 46,230,179,191, 12,134, 0, 22,199, 97,146,140, 88, 46,215, 93,214,246, 27, 59,149, 16, 2,203, 49, 35,235, 86, - 74, 92,223,235,152, 6, 53, 81, 28,224, 57, 65, 71,197,115,177, 3,223, 20, 27,182, 48, 49,187,142, 67, 81,229, 6,217, 42,165, - 97,252, 7, 30, 74, 65, 16,120,132, 97, 55,222, 87,146,245,170, 96,187, 79,153, 78, 70, 4, 65,192,122,149,178,223,110,217,174, - 55, 38, 31, 65,195,120, 50, 37, 73, 18, 60,219, 97,191,223, 97, 9, 77,224,185,120,142, 77, 83,149, 60, 56, 59, 33,207, 50,150, -119,183, 8, 13, 15, 31, 61, 99,187,221, 18,143, 71,131, 16, 79, 41, 69, 24,117,244, 57,105, 14,123, 91, 88,104,109, 58,116,161, - 52, 22, 10,161, 37, 72,129,110, 37,154, 55, 72, 91,221, 95,254,154, 46, 35, 65, 15, 58,131, 30,226,114,191,235,236, 47,201, 82, -118, 23,147, 54,118, 53,163,181,176,128,123,130,198,110,135, 29,134, 1, 69, 81,116,168, 95,239, 45, 75,160,239,251,172, 22, 11, - 28,199,225,112, 54, 39,140,252, 46, 85,109,204,229,229, 53,159,124,242, 17,191,248,197, 47,184,190,185, 28,216,250,125,161, 81, -150, 37,187,221,142,221,222, 36,204,149,181, 41,156,122, 26, 93, 63,153, 9, 61,243, 92,245,128, 32,147, 38,231,224,185, 46,227, -241,184, 11,120,114,186,201, 85,138,107, 59,100,217,158,253,126,203,126,111,145,157,191,166,170, 26, 38,211, 3, 94,189,190, 0, - 75, 80,140, 70,120,158, 99, 28, 13, 64, 81,100,102, 37, 8,212,221,152,189,127,173, 92,215,197,245, 60,194, 40, 34, 25,141,152, - 76,166, 88,174, 67,232,249, 67,158,122,185,221,178, 88,175, 77,113,105,187,216,174,153,102,229,101, 53,196, 19,247,239, 71,236, -251,104,223,199,238,252,248,190,239,179, 90,173,112, 44,193,126,191,103, 20, 69,204,166, 99,180, 18, 60,126,244,144,231,223,125, -111,172,129,186, 34,140,124,236,214,195,113, 21,117, 87,252,222,199, 9,187,182,153,146,229,121,193,110,155,226,219,150, 89, 55, - 99,172,171,142,235,242,232,201, 59, 40, 52,155,205,142,166,169, 8,131, 0,203, 18, 88, 40, 86,139, 59,126,253,235, 95,243,241, -167, 63,229,232,104,198,229,213, 13,109, 99,154,155, 48,240,168,138,146,217,120,108, 62,147, 22,248,190,135,155,167,228,121,138, - 86, 53,104,129, 37,224,248,240,136, 36, 48, 83,147,218,179,112, 30, 61,123,135, 60,221,225,123, 14,145,235,130,110,105,154,138, -103,179, 49,227, 40,224,226,226, 18,169, 4,218, 50, 60,229,170, 21,224,120, 93, 96,138, 70, 54, 45,201,164, 35, 61, 53, 13,109, -217,114, 52,154, 18, 71, 1,187, 85,137,109, 73,210,253,138,229,114,203,233,241, 25,163,233, 9,225,243, 87,124,254,205, 23, 8, -105, 33,164,241, 11, 34, 91, 68, 43, 65,218,104, 44,148,101, 20,222,173, 22,168,198,132,166, 52,173,234, 20,234,134,160, 99, 56, -198, 45,178, 99,175,235, 14,140,161,235, 22, 45,141,130, 55,203, 50,252,112, 66,171, 32,138, 71,228, 89,195,114,189,230,224,224, -103,156,157, 77, 40, 86, 43,158, 60,121,198,110,159, 97, 99,115,122,250, 0, 27, 97, 72, 81,190, 24, 42, 81,219,105,176,132, 7, - 66, 81,213, 25, 85,185,167,182, 52,109, 81, 32, 90,137, 46, 27,194, 32,160,149,166,162,154,140, 70, 20,179, 25,113, 52, 98,179, -217, 49,158, 29, 82, 46,183, 68,163,128,179,167, 30,182,151,208,124,255,154,187, 23,119,204, 15,207, 56,121,242,148,203,203, 87, -228,141,199,200,159, 49,142, 15,209,152, 67, 98, 93, 72,246,205,158,171, 77,133,192, 50,107,146,188,164,168, 5,155,125,205,120, -114, 76,182,223, 18,197, 83,174,174,239,240, 29,197,159,252, 15,255,152, 44,223, 16,122, 22,129,103, 99,107, 1,218,194,119, 61, - 44,203,233, 34, 56, 53,194,106,136, 71, 49,227,192,193,117, 28, 84,165, 81,142, 96,119,183,227,203,175,191,226,225,163,103,252, -179, 63,250, 5,249,242,146,186, 74, 25,143, 15,140,232,171, 85,120,129, 79, 90,212, 72, 4, 87, 87, 55, 28,159,156,112, 58, 63, - 6,224,226,242, 10,161, 27,218, 50, 35, 72, 38, 52,117, 70, 83,151,216,162,101, 58, 10,216, 23, 21,233,234,150,147, 79,158,224, -168, 8, 71, 24, 60,173, 97,183, 51, 4, 52,120, 94,194,197,205,130, 87,151,231,172,182, 57,184, 1,110, 24, 35,220,128,203,235, - 11,188,200,230,167,191,255, 25, 85, 85,113,117, 99,172, 95,194,182,200,138,130, 77,150,114, 56,155,147,231, 6, 78,226,119, 73, - 99, 97, 24,154,232,204,142,226, 54,155,205, 56, 59, 59, 51,107,147,213,138,215,175, 95,179,221,110, 7,158,118,223, 61, 42,165, - 56, 56, 56, 24,136,111, 73,146,176,218,110,176,187, 67,174,191, 56, 70,163, 17, 66, 24,142,251,201,252,152,237,118,107, 20,201, -251,253, 91,120, 86,128, 86, 43, 36,114,184,200,147, 36, 25, 58,235,229,114,249, 86, 88, 71, 47,198,234,247,216, 69, 81, 16,220, -235, 26,122, 10, 90,239, 75,151, 82,146,166,233, 91, 62,117,231, 94,118,122,223,253,197,113,204,213,197, 53,201, 44, 30, 46, 41, -221,234, 1, 34, 51, 26,141,168,155,114,248,185,250,206,141,238, 18,108,219,150,233,236,144,195,195, 67,211,157,110, 54,104,173, - 9, 60, 31,132,141,141,177, 71,185,174,139, 66, 12,224, 16, 3,179,177, 88,173, 22, 38,199,186, 62, 36,246,189,225,210,232,133, - 94, 8, 97,168,132, 81,100, 14, 68,161,186,160, 32,133,106,107,130, 48,193,234,252,221,167,103, 39,188,252,225, 71,242,162,226, - 95,253,171, 63,229,252,242,134,219,219, 5,139,229,218,248,177,187, 53,133, 82,138, 86,214, 67,183,220,187, 14, 90,215,235,198, -206,230,245, 20,150, 73,226, 83,210,236,121,101, 93, 25,190,188,197,208,205, 14, 97, 35,247,248,242,189, 95,189,191, 96,104, 76, -243,243,182, 67,193, 29,138, 39, 41,223, 60, 23, 97, 24, 14, 32,153,233, 56, 25, 72, 97, 69, 81,176, 88, 44,134, 85,139,153, 46, - 37, 60,120,240,136,239,190,125,206,213,213, 13, 71, 71,199,124,253,245,215,102, 58,149,110, 7, 47,126, 85, 85,216,142,195,225, -225,156,135, 15, 31,226,120,157,197,173, 44, 6,253,132,214,154,168,187, 20,223,252,156,166,168,104, 58,252,112,154,166,131, 38, -229,245,235, 31,137,131,112,112,112,236,118, 59,106,105,158,255, 7, 15, 31, 82,151, 57,126,100, 68,113,125,150,128, 16,130,166, - 52, 90,138, 56,142, 7, 17,101,127, 81,246, 19,129,190, 40,222,101,105,135, 96,110, 6,209,232, 0, 56,106, 91, 86,139,229,192, -130,232, 11,159,254,181, 79, 58, 93,140,136,205,127,115, 29, 7, 75,155,157,251, 40, 54,122,153,170, 44, 57,127,245, 26,215, 11, - 24, 31, 76,209, 74, 97, 89,112,116, 48,227,234,230, 22, 89, 43,226,120,204,129, 31,226, 5, 49,121, 81, 33,101, 79,173,179, 8, -194, 16,180,153, 96, 72,173,153, 76, 38,216, 2,234,167, 79,217,237,118, 93,170, 96, 51, 20,220,219,205, 30,215,179,152,141, 71, - 4, 81, 12,150,197,111,254,235,127,225,221,119,222, 51,186,145,155, 5,155,245,146,216, 79,104, 69,219,105,102, 90,146, 56,228, -232,232,136, 48,120, 64, 89,165,180,173,209,236,204, 15,143,141, 51,163,169, 16,186, 38,205, 11, 28,223,247,241,252, 25,178,174, - 64,128, 43, 92,146,192,167, 41, 83, 92,165,152,143, 2,110, 87, 91,164,246, 16,182,143,229,216,224,154,157,184,210, 10,199,179, -201,203,130,241,216, 67, 53, 53,182,173,135,232,188,179,147, 67,222,123,246, 79,176, 68,197,241,145,145,252, 39, 98,132,227, 60, - 99,118, 60,226,245,249, 5,235,155,148,180,200,160,201, 81,173, 33, 11,217, 94,136, 23,153,113, 93, 16,198, 44, 55, 45, 69, 35, - 73,243,138,151,207,191,193, 81, 53,159,126,242, 1,118, 91, 15,251, 58,215,117,176, 68,199,151,246,108,242,125,131,223, 85,125, -251,206, 10, 83,237,187, 36, 32,209,176, 90, 45,120,116, 28,113,123,179,167,204, 75,180,208, 64, 72, 85, 40, 22,183, 55, 92, 95, -223, 18, 77, 78, 41,100,128,210, 13, 81, 96,177,221,221, 18, 88, 25,117,219,130,149,225,122, 54,109, 46, 81,178,225,209,217,156, -171,215, 47,105,164,225, 40,223, 45, 86,221,131,169,104,168,249,183,255,215,191,229,159,253,241,255,200, 7, 31,127,194,221,111, -126,203, 50,221,241,242,242,156,100, 54,103, 60,159,114,179, 94,115,113,179, 96, 20,197, 52,218, 54,163, 20,223, 99,187,221, 18, -116,126,104, 63,242, 41, 42, 51,130,178, 28,129,227, 78, 40, 43, 31,180, 68, 54, 26, 71,128,208, 14,117,217,176,223,238, 56, 57, - 76, 80,117,142,111,107, 28, 33, 16, 2, 84,155,226,216, 1,201, 56,166,110, 90,194,241, 1, 90,182,200, 58, 55, 23, 64, 48, 98, -179, 94,179, 88,155, 11,232,235,111,191,101,187,251, 23, 88,202,232, 29,238,214, 59, 66,215, 98,159, 21,184,126,133,229, 90, 84, - 85, 75, 28,199,228,121, 65,150,101,236,118,107,202,108, 71,171,148,225,244, 91,146, 70, 91,236,119, 25, 71,227,128,227,207, 62, -161,168,106,138,253,142,211,113,196,118,113,195,209,193,140,245,122,107,112,148, 7,135,128,249, 30, 8, 69, 60,142, 57, 56, 58, - 96,114,114, 6, 65,200,215,207,191,227,246,230, 2,219,117, 25,197, 35,190,255,225, 71, 38,147, 9,211,131, 67, 46, 46, 46,184, - 91, 46,241,195,152,100, 60,226,234,230, 22, 33, 76,126,184,237,122, 4,158, 57,180,227,216, 80,224,206,206,206,120,231,157,119, -200,178,140, 23, 47, 94, 12,187,235, 30,175,218, 31,216, 61, 9,174, 63,212,166,211, 41, 82, 43,252,242,205,152,221,178, 44,124, -199, 69, 40, 77,163,140, 42,120,177, 88,144, 36, 9,174,101,227, 90, 54,173, 54,161, 31,117,119,249,182,149, 1, 95,140, 70,163, - 65, 16,183,219,237, 40,203,242, 45,132,236,213,213, 21,190,239, 15, 95,215,171,146,123,236,106, 93,215,120,142,139,118, 21,104, -134, 78,101, 8, 47, 17, 22,142,235, 25,110,123,183,183, 68, 42,226,209, 20,199,182, 65,181,216,142, 17,165,106,173,105,181,121, - 13, 76,103,188,199,118, 76,232, 69, 83,153,207, 92, 83,213,204,231,115,234, 60,195,115, 92,182,219, 53,227,241,152, 48,244, 9, - 2,143,162,168,134, 0,151,241,120,140,235,251,180,141,100,148,140, 88,175,215, 3,171,221,178, 44, 60,219, 27, 38, 12,253, 74, - 33,207,115, 67,210,171,106,100, 31,189, 89,215,160,117,103, 25,116, 16, 74,115, 48,153,114,112, 56,163,204,171,225, 53, 62, 57, - 57,225,230,118,197, 15, 63,252, 64,148, 76,168,235,146, 52,221, 13, 29,175,108, 25, 14,126,207,181,209,174,141,108,107,146,209, -168,243,185,215,120,129, 79, 81,102, 88, 8, 67,188,235,210,206,130, 32,192,178,161,172, 42, 26, 41,169,186,206,124,183,219, 13, - 0, 28, 19,207, 43, 7,149,180,219,214, 84,149,185,212, 93,199,188,190, 85, 93,153,179,203,115,209,150,192,119, 76,145,183,219, - 25,103,196,108, 54, 35,203,178,161, 0,171,170,202,172,142,180,224,249,247, 63,112, 60, 63, 29,136,119,175, 95,191,230,230,238, - 22, 47, 48,157,228,103, 63,255, 25,255,246,255,248, 63,141, 88,211, 51, 93,119,213, 21, 45,251,125,198,205,221,173,241, 81,183, -213,160, 94, 31,208,193, 61,113, 80,118, 89, 13,158, 59, 76, 31,122,241,231,201,201, 9,254,128,255, 53,133,138, 27,248, 76,221, -217, 48,254, 78,179, 29,109,219, 48, 31, 31,179, 88, 46, 9,195,144, 95,252,147, 63,228, 47,254,242, 63, 17,197,193,144,196,214, -219,221,250, 85,145,239,251, 28, 31, 31, 51,154, 78,135, 66, 87,107,205,213,229, 13,235,245,154,178,106,152,207,231, 84,117,203, -122,189,101, 60,153,226,120, 30,101,110,200,141,179,217,204,208, 30, 59, 18, 93,154,166, 88,170, 97,126,120,100,138,219,214, 36, - 40,182,117, 67, 93,217,228, 89,193,108,118,196,102,187,229,197,139, 23, 60,121,242,148, 70, 73,178,180, 34,142, 99, 46, 55,215, -104,219,161, 40,107, 14,189,176, 91, 93, 41,182,219, 45,179,217,148,125, 94, 16,120,150, 73, 70,172, 27, 82, 37,121,242,244, 49, - 82, 54, 3,210, 89,107, 49,216, 82,155,166, 33,140, 18, 19,237,221,167, 4,122,134,116, 23, 6, 30,117, 89, 18, 5, 14,190,107, - 83,213, 37,101, 89, 18,118, 32,166,186,110, 8, 3,135,192,117,105, 45,179,166,246,195, 0,207, 15,209,117, 65, 83,236,105,219, - 18, 7,213,226,216, 2, 9, 84,117,137,227, 59,132,129, 75,236, 90,180, 77, 67, 99, 43,170,108,199,245, 38, 67,187, 49, 34,156, -160, 45,147,131,235,251, 46,130, 22,217,228,212,205,158,108,187, 67,215, 26, 23,139,131,228,140,211, 7,103,200,250, 6,207,147, -180, 85, 67, 93,108,168,219, 26, 95,120,188,255,244,132,247,159,158, 17, 58, 33,223,126,247,156,197,110,197,174, 86,164,117,192, -239,190,249,129,108,151, 27,104, 69,154, 49,154,204,184,189,221,178, 77, 91,174,175, 55,156,255,248, 61,239,189,243, 9, 7, 7, - 17,155,245, 45,201,120, 68,211, 74,100,219, 80, 54, 37,147, 40, 33, 12, 99,180, 13,142, 39,121, 48, 63,227,240,248,142, 87,215, - 63,226,219, 9,158, 35,184,186,189, 33,223, 92, 99, 55, 54,171,197,154, 86, 74,242, 42,199,178, 53, 85, 94,208, 52, 45,113,229, -112,112,246,174,217, 61,213, 85, 55,154,180,216,237, 54,124,245,245,239,216, 76, 60,178,197,154, 71, 15, 30, 83, 86, 13, 69, 91, - 35, 44, 7,199,243,153,205,102, 40, 97, 14,194, 26,155,170,110,168,164, 34, 26, 79, 73,139,154,151,231,151,140, 14, 14,120,247, -189,159,144,103, 21, 89,154,209,202,146,237,174,100,189,186,165,200, 50,132, 48, 15,124, 16, 71, 72,221,242,234,226,146,120, 60, -162,150,230,128,240,195, 22, 95,204, 25,197, 17,182, 29,144,101,123, 28, 45, 57, 57, 62,227,217,227, 39,120,110,195,200,155,161, - 84,105,144,174,174,131,236,186, 18,199,106,113, 19,143,172, 40, 8, 2, 15,219,243, 8, 52,120, 65,192,212,115,120,104, 37, 28, - 30,157, 83, 93,175,184,185, 91, 96,183, 5,148, 41,170,202,112,108, 97, 82,202,178,146,125,190,103,179, 93,226, 89,130,233,120, -196,217,241, 33,163, 81,204,201,225,204,216, 18,109,151, 32, 74,144, 8,124,215, 1,203, 37, 30, 77,169, 74,201,205,197, 43,236, -182,224,193,209,148, 47,191,252,130,116,159,243, 79,255,233, 63, 67, 74, 69, 81,213, 92, 94, 94,226, 37,123, 14,142,207, 56, 57, - 61,229, 98,185,230,252,242, 21,185,172,152, 30, 27,190,186,107,155, 49,117, 43, 53,216, 38,247, 59, 76, 98,148, 22,131,160,167, -223, 65,219,182, 24, 46,109,207,243,134,221,224,110,183, 99,177, 48,130,199,190, 67,234, 47,215, 36, 73,222, 34,142,245, 23,120, -207, 15,111,171, 26,108,235,173,184,212,126,119,109,124,225,166,171,217,170,237, 64,149, 27,188,185, 74, 17,197, 17, 65, 20, 14, -211,128, 60,207,135,164,183,190,179, 25,118,219,221, 63,223,103,184,247,221,119,255,239,189,226,190, 23,216,253,255, 41, 98, 74, -240, 70,184,165, 52,179,201,148,116,187, 27,168,113, 82, 75,220, 46,249, 42, 77, 83, 92,203,172, 20, 60,225, 12,221,146, 41,218, -125,227,196,144, 18,109, 59,195,161,213, 79, 26,234,186,239, 50,192,237,214, 5,232,122, 64,199,218,142,233,212, 87,219, 29,181, - 52, 19,136,170,170,144,209, 27, 4,168, 2, 2,207, 39, 47, 11,138, 52, 27, 20,228,190,107,163, 90,243,207,113, 98, 56,228, 40, -129,231, 26,199,192,201,124, 78, 93,183,188,122,245,138,195,249, 49, 79,159, 62,197,245, 2, 46, 46, 46,176, 44,211,209, 23,133, -241, 88,239,118,251,238,255,199,162, 44, 10,138,110, 84,111,119,202,234,205,106,109,216,242, 93, 7,103, 59,214, 91,118,191,160, -163,239,221, 23, 23, 74, 41, 41,235,210,104, 49,108,167, 27, 47,119, 59,245,123, 52, 55,199,113,208, 66, 35, 91,141,176,204,234, -197,115, 3,132,165,145, 77,253,223,141,245,123,151, 68,239,167, 55, 59,241,138, 86,182,198, 2,213, 72, 2, 63, 34, 25, 69, 60, -124,248,208,160,115,187, 11, 84,116, 63,115, 89, 55,221,206, 62, 31,180, 2,158,219,190, 53,109,232,159,119, 99,173,202,135,139, -181,159, 60, 56,142,195,201,201, 9,143, 31, 63,102, 28, 71,228,121, 74, 52, 74,186, 2,180, 67, 20, 91,130,135,143,206, 72,243, -156,233,100,204,195, 71,143,185,189,189,230,100,126,204,117,151,149,224,217, 14,120, 14,105,150,145,231, 21,174,107, 13, 43,178, - 85,135,185,117, 93,215,156, 87,182,249,188,218,174, 51,172,190, 14, 15, 15,217,165, 25, 30,224,121, 1, 74,181,236,118, 59,198, -201,136,200, 15,168,171,138, 34,221, 51, 59,152,112,112,112,128,210,138, 40, 49,113,205, 74,154,223, 35,181, 73, 27, 12,130,144, - 48,137,105,165,164,174, 77, 0,142,101, 89, 76, 15, 15, 77, 80,140,213, 97,116, 11,115, 73, 11, 91, 13, 90,153, 52,207,184,187, -187, 99,148, 4,180, 53,156,159,159,211, 86, 37,190,239,178,221,165,166,144,214, 54, 81,148,152,231,197,179, 81,109, 75, 83, 75, -180,176, 72, 18,195, 64,177,109,193,147,167, 15,184,189, 89,177,223,167, 28, 76, 19,110,239,150, 88,214, 24,180,100, 54,155,118, -186, 10,195,200,175, 91,137,101, 71,180, 82, 25,178,164,176,140,101, 49,219, 44,240,163,208, 60, 56,117,133, 23,141, 73, 34, 15, -215, 86,208,212,168,182,192, 18,138,197, 98,193,245,238, 28,220, 49, 82, 56,104, 5, 65,232, 83, 22, 91, 38,163,136, 36,118, 41, -243, 2, 71,187, 56, 56,120, 66,227, 57,135, 56,122,143, 45, 44, 60,215,194,115,109,234,218,168, 94,221, 46, 17, 76,150,123,158, -156,133, 60,125,247, 41, 47, 46,150, 92,173, 21,145,111,230, 62,109, 83, 81, 99, 19, 68, 30,155,117, 78, 81, 64, 20, 29, 35,229, - 13,219,157, 70,201,138,253,190,196,243, 67,210,188, 32,207,204,136,227,116,126, 74, 18,133, 20, 77,205,182,145, 92, 92,222,178, -221,110, 81, 40,220,192,163,170, 54,220,221, 46, 57,223,221, 18, 8,159, 42,175,120,240,248, 17, 15,230,103, 28,204,166, 20, 89, -142,101,217, 96,199, 16, 24,165,233,182,174, 24, 79, 70,164, 89,206, 39, 79, 30,113, 56, 61,225,234,213,183, 20,219,148, 15,223, -255,125, 38, 19, 31,101, 9, 90, 97,118, 99,121, 81, 80,181,146, 40, 62,160,104, 28,102,135,143,216,167, 21,191,253,251,175,120, -241,195, 21, 55,171, 61,187,125, 70,211, 72, 54,171, 37, 73, 20, 18,123, 13,227, 56, 98, 54,158,241,224,228,167,140, 70, 35,198, - 99, 35, 94,188, 91,238,248,223,255,221,159, 33, 75,104, 26, 11,101,217, 70,233, 25,152, 46,205,214,138,182,170, 17,182,100, 52, -154, 48,155, 29,161,101, 74,158,109,208, 77,137,109,105, 67,117, 3,148,146, 20,181,196,209,128,227, 97, 59, 62, 85, 90,144,239, -247,232,180, 68, 59, 17,174, 61, 2,173, 88, 46,239,248,252,243,207,209,229,158, 98,183,166,206, 83,218,182, 70, 88, 46,181,108, -113, 3,155,211,147, 67, 62,249,201, 7,156, 30, 78,137, 60, 27,215, 6, 7,137,235, 57,108,179,148, 50,223,225,248, 1,174, 37, - 81, 82,225,169,134,178,200,185,189,120,205,163, 73,128, 27, 5, 60,121,240,144,231,223,127,199,110,183, 97,124, 48,163,206,114, -118,249,142, 81, 20,112,181,184,230,251,243,151, 44,118, 41,203, 52,103, 50,155,161,108,155,229,110,197,131,249, 25, 94, 16,116, - 54, 28, 11,223, 11, 9,131,150,162, 50,163,245,126,207,178, 89, 59, 7, 0, 0, 32, 0, 73, 68, 65, 84, 61, 78, 98,115,169, 57, - 14,243,227, 67, 67, 71,171, 42,170,202, 20, 94,247,119,209,189, 50,248,254,184,185,239, 84,122, 79,111, 95,133, 43, 12, 4,201, -113,221,142,165,221,187, 13, 76,210,158,234,246,211,149,172,144, 66, 26,104,141,106,192,210, 56,174, 53,140,214,251,176,150,254, -226,239,133,110,253, 37, 49, 26,141,134, 75,227,126, 48, 74, 37,223, 20, 9,253, 97,236,121, 30,142,101, 15,136,211,251, 72, 80, -251,222,136,184,239,140, 47,207,207,137, 67, 67, 69, 43,139,218,164,164,117, 29, 90,175,164,239,119,242,125,247,119,255,240, 87, -104, 44, 97,155,176, 11,203,233,254,178,186, 72, 98, 9, 66,224,119,123,230,188,172,186,142, 57, 24,214, 21, 10, 69, 81,149, 38, -183, 62,246,135, 14,208, 92, 92,166, 59,234,109,132,145, 31, 96,161,168,138, 18,219, 50,185,213, 85, 81, 18,120, 1, 15, 30, 60, -224,229,143, 23,131,144, 74, 42,139,235,235,107,130, 32,224,248,228,136,170, 46,184,186,186, 50, 43, 13, 47,164,105,149,185,212, - 60, 15, 41, 27,234,186,164,105,205,225, 10,138, 60, 79, 9,227,128,186,182, 40,243,130,170,169,105, 91,186,224, 26,135,100, 20, -147,102,249, 91,208,154,251, 1, 56,247, 35,104,117, 23, 33,119,255, 82,183,109, 27, 37,212, 80,232, 1, 72,173, 16,157, 16,106, -226, 78,217,111,119, 6,217, 27,249, 4, 81, 60,140,221,247,121,129,112,108,118, 89,138,235, 26,187,213,235,215,175,201,246, 41, -127,252, 47,254, 57,191,248,163,127,202,239,126,247,187,161, 40,232, 47,237,222,247, 61,154, 8,162,192,195,181, 29, 92,199,250, -239,128, 69,253,218, 71, 40, 53,232, 60,122,239,119,175,255,144, 82,114,126,126,206,249,249,185, 1,250,220,139, 71,141, 18,147, - 87,144,140,199, 93,108,177,160, 40, 10, 78, 78, 78,184,190,190,166, 44, 10,130, 48,100,215,185, 35,206, 78,231,204,231,115, 38, -211, 41, 82, 74, 86,171, 53,150, 54,172,117,180, 53,184, 9,188, 32, 68, 41, 88,173, 86,228,249,154, 56, 25, 99, 11, 65, 28, 70, -230,231,183,204, 20, 45, 14,125,118, 91, 3,133,113, 29,203, 92,234,109,205,233,201, 49, 55,194,252,126,215,247,136,146, 49, 18, -205,126,151,177, 88,174,217,167, 57, 8,219, 76,164, 59,109,141, 84, 22,199, 39, 7,236,210,162,115,130,152, 88,109,215,117,201, -203, 6, 97, 59,108,247, 41,182, 45, 76,112, 87,146, 80, 57, 22,139,245, 10,219,182,169,235,202, 76,155,148,194,243,156,161,224, -119, 3,159,213, 98, 7,155, 13, 7,211, 41,190,235,209,122, 14, 71,135, 19,148,108,120,249,227, 43,234, 70, 98,219,130,237,182, -229,209,163, 51,122,249,154, 35, 44, 3, 42,116, 28,234,198, 76,141,132, 37, 12, 7, 98, 18, 57, 8, 75,209,186, 22,218, 9,152, -140, 34, 66,207, 66,151,123, 44,221,114, 52,141, 25, 77,102,108,107,139,197, 23, 63, 80, 75,192, 54, 35,136,178, 44, 57,152, 30, -114,118,114,196,244, 32,162,173, 90, 44,105, 99, 73,205,114,181, 37,114, 37, 31,189, 63,194, 34,167,173,242,142,237,110,225,162, -113,164, 6, 9,187,205,146, 96, 20, 34,112, 89,222,254,200,127,251,237,107,238,178,154, 40, 58,164,172, 26, 60, 63, 98,183,219, -115,144, 56,220, 92,175,137,130, 49, 31,189,255, 41,119,183, 27, 82,223,226,242,226, 5, 87, 87, 33,235,237, 10,203,114, 88,220, -108,248,250,171,111,169,243, 10,101,217,220,237,118,220, 21, 45,155,204, 84,255,187,253,134, 34, 91,242,167,255,252, 99, 30,125, -246, 41,186,110,217,110,183,156, 61, 58, 51,222,218, 36,224,246,234, 26,173, 44,182,169, 36,171,106, 14, 14,142,168,182,165, 97, -163,227,240,206,179, 15,120,252,232, 61, 22,175, 94, 17, 69, 30,117,107, 83, 43,133,178, 5, 74,107,242,198,116,121, 81, 18,243, -227,235, 75,164,178, 80, 74,112,254,250,134,230, 98,203,126, 87, 50, 59, 56, 97, 54, 19,124,251,205,151, 60, 60, 61,228, 95,255, -233, 31,243, 71,191,248, 67,124,209,224, 8,133,103,153, 3, 33, 12, 19,176, 3, 46,239,246,252,249,127,252,143,252,120,177, 33, - 28, 31,225,133, 83,100,107, 62,136, 89,182,195,119,133, 97, 76,107,193,118,183,231,118,177, 33,112, 37,158,237,226,132, 9,161, -235, 80, 55, 5, 90, 73,226,201, 8,173, 4,141, 84,160, 5, 10,195,137, 23,194, 92, 4,105,186, 38,167,102,113,119,195,217,201, -156,211,227, 57,158,152,145,110, 19, 34,215,140, 11,109, 47, 52,241,171,180, 68,190,195,116, 50,194,113, 61,146, 36, 96, 28, 7, -164,251, 21, 89,145, 50, 25,197,236,114,195,200,118, 28,139,172, 40,217,109,214,172,215,123, 22,215, 87,108, 31, 30,147,103,123, -226,100,204,201,217, 25,181,108, 57,191,190, 97,185,222,113,252,224, 33,110,156,240,231,127,243,183,124,254,229, 23,124,250,179, -159, 51,125,240,144,172, 44, 89,110,205, 56,245,252,234,146,208, 51,228,186, 70, 73,118,219,148, 52, 77,169,154,118,128, 66, 72, - 41, 7,104, 70,150,239,241,125,159, 44,203, 88, 44, 22, 76,103, 71,195, 56,218,228, 50,231, 3, 88,166,183,109,217,247,108, 72, -125,199,212, 31,204,158,227,118, 34, 40, 3,154, 17,247, 58,106,107,160,150,217,111,184,228,157,175, 57, 8, 2, 51, 81,192, 76, - 18,250,253,254,125, 16, 77,255,251,250,196,172,126, 58,208, 11,156,140,119,216, 25, 46,223,254,251,246, 73, 93,125,183,127,127, -180,218, 95,238, 70,133,107, 81,150, 37,235,205,142,249,145,161,180, 13,241,173,247,236,117,174,215,197,130, 98, 48,171,253,100, - 64, 41,133,213, 93, 2, 77,243,102,223,218, 43,231, 93,215, 53, 72,100,169,169,171, 6,169,205,136, 21, 33,240,132,121, 94, 93, -207,195,233,138, 0,186, 11,206, 80,222, 90,202, 42, 71,116,224,141,222, 1,224,121, 30,109,211, 80,180, 25,150, 5, 85, 94,226, - 59, 30,161,103, 49, 29, 79,208,242,181,153, 80, 96, 49,155,153, 11,226,230,230,134,209,100,108,226,159, 61,143,186, 46,177, 44, - 51,225,177, 16,131, 30,194,118, 29, 34,219,216, 4,233, 34, 88,123,127,118, 20, 7, 52,141,109, 86, 85, 82, 82,118, 1, 45, 77, -251,134,125,223,235, 46,250,215,219,243, 60,154,170,238,222, 23,253,214,133,223, 23,137, 18, 51,218,118, 58,130, 92, 81, 24,171, -101, 20,250, 36, 73,196,118,189, 25,158,133,126, 12,222, 23,149,211,233,148,219,219, 91, 99,255, 75, 38, 56,174,197,203,151, 47, -121,247,221,119, 57, 61, 51,190,238,223,254,246,183,111,156, 12, 94, 71,172, 19,130, 36, 25, 99,219, 35,210,221, 30,199,126,195, - 61,232,245, 0,253,170, 33,219,237,134, 75,188,247,238,247, 23,183,235,186, 60,121,252,184,123,198,212, 91,207,174,137,181, 13, - 57, 59, 59, 27, 68,122,227,209, 8, 97, 89,156,158,158,226,186, 62,183,183,183,168, 70, 14,223, 51, 77, 83, 51,157,234, 10,194, - 32, 8, 88,175,183, 4, 81, 52,172,195,250,181,212,120, 60, 54, 83,161, 46,182, 54, 8, 2,195,137, 8, 3,162,192, 27,136,120, -126, 87,176, 41,109, 38, 8,155,205, 6,209,229, 19, 20,101,205,247, 63,188,100, 58,157, 50, 59,154, 67,199,145,184,186,189, 99, -187,223, 81,183,230, 34,206,242,220,136, 40, 80, 93,225,106,208,227, 90,107, 83,132,217, 22,121, 89, 48,106,130, 97,197,227,216, - 2,215,247,200,247, 57, 77,219, 34,165,160, 41, 10,108, 11, 68, 28, 19, 36, 17, 46,224,121, 59,211,140,248, 62,161, 31,160,101, - 67,232,121, 76, 70,198, 26,253,253,203, 31, 9, 66,143,235,235,213,155,179, 71, 74,147,204,103,187,212,128,214, 70,208,105, 91, -150, 89,203,254,226,179,143,185,188,190,101, 87, 24,187,134,239,216, 40, 89,163,235,146, 48,112, 40, 43,137,235, 89,157, 82,181, - 69,217, 22,182,235,225,162, 65, 43,100, 45, 41, 10, 99,113, 65,107,198,193, 8,199,210,232, 90, 35, 44,143,100,124,128,171, 44, -218,202,228, 68,219,194, 33, 14,141,208, 71,161,153, 79, 35,110,214, 75,138,166,226,248,100, 78,221, 60,199,198, 53,100, 33,207, - 70, 43,101, 48,163,150,205,119,207,159, 19, 34,144, 69,193,175,127,249,154,186,202,105,100,193,227,167,115,194,196,229,217,179, -103,157, 66,116, 79,147, 73, 38,135, 71,156,158, 28,112, 26,207,120,113,189,227, 55,159,127, 71,219,104,162, 32, 33,137, 15, 56, - 57, 61,229,135,239,190, 34, 45,183,220,220, 89, 56,158, 77, 28, 5, 92, 95,222,152,200,209,189,226,219,151, 43, 14,143, 78,201, -228,142,221,110,195,200, 73,216,109, 42,190,253,230, 21,101,101, 98, 70,191, 63,191, 49,152, 88, 37,105,149, 68, 91,102,151, 51, - 30, 39, 6,107,121,116,194,233,201, 3,142,207,158,113,112,252,132,221,159,253,191,252,240,250,150,147, 7, 15,153, 78,230, 68, -225,136,166,209, 76,146,152, 58,187,197,209, 37,170,169, 72, 60,135, 60,219,163,132, 75,236, 39,252,244,147,159,112,121,251,119, -216,110,132, 16, 49,173,174, 80,150,166,170, 11, 44,215, 69,219, 80,215,146,219,213,150, 47,190,125, 65, 18, 58, 68,158, 64,202, -130,195,131, 41,182, 80,104,213, 50,110, 77, 80,138, 22,130,241,116,134, 45, 36,170, 35, 62,105,215,194,149,154, 64, 8, 30, 28, - 30, 80,227,242,244,201, 67, 66, 27,110,174, 45, 2,207,167,106, 37, 89,101, 14,116,173, 10, 16, 54,173,212,102, 7, 40, 75, 84, - 19,144,237,119,164, 69,138,182,225,118,177,196, 13, 67, 19, 78,112,179,162,105, 52,233,182,224,226,242,154,246, 15,126,198,110, -179,227,118,189,231,253,143, 62,230,252,226, 6,203, 11,120,244,254, 71,252,242,111,127,205,127,248,203,191,100,181,207,201,170, -134,162,106,104,202, 6,225, 56,196, 81, 68,186, 55,105,102, 54, 22, 85, 35,135,241,117, 81,189, 1, 70,244,158,238, 48, 12, 57, - 56, 56,224,213,203,130,243, 31, 95,161,218,150,100, 60, 38,142, 99,118,187, 29,105,154,190, 37,184,177, 44,107,184,188,251,113, -107,127,152,245,106,117,199,113, 8, 66,207, 92,198, 77,139, 80,102, 61, 99,219, 14,141,146,195, 33,220,143, 46, 45,203,194,114, -205,165,239,116,130,176,186, 49, 89,236,253, 84,225, 62, 44,230,173,203,179, 59,248,250, 14,169,191, 56,238,243,183,251, 34,164, - 40,138,161,211, 26, 79, 39,111,193,103,250, 95, 6, 58, 99,138,184,113, 23,188,177, 92, 46,153, 29, 29,226, 7, 46,109,209, 65, - 80,220, 55,136,219,254,255,193,117, 93,108, 1, 82, 54,102,108, 93, 87, 52,101,133,101,167,212,157, 47,222,247, 66,108,199, 35, -114,130,225, 32, 14,195,208, 76,151, 44,167, 75, 5, 52,153,231,150, 35,176, 44,129,231, 57,216,174,133,235,132,216,162, 83,142, -151, 37,142,231, 82,215, 70, 44, 37, 27,127, 16,182,217,190,107, 58,109,199, 29,132,143,163,209, 8,219,117,217,238,179,161,184, - 49,157,216, 22,219, 18, 28,205, 14,184,188,186,224,238,230,218,136,155,148, 50,169,113,173, 41,180,132,165, 41,171,178,115,210, -212, 40,209, 93,196,210,124,207,182,169, 80, 74, 34,165, 66,105,176,236, 55,110,130,222,210,216, 23,104,253,251, 83,169,150,170, -174, 17,226,205, 88,187,233,162, 69,107,105,190,206,118,204,132,197,238,199,248, 90, 14, 54, 74,165, 20,155,205,134,237,118,219, -137, 45, 25, 46,234,201,116,134,210, 70, 68, 39, 28,151,170,169,249,234,155,175,209, 72, 30, 61,122,194,119,223,125,103, 72,117, -178,125, 67, 8,148,146,229,114,201,221,221,141,193,143,138, 55, 94,113,231,222,243,102, 10, 73,211,157,246,107,165,237,118, 59, - 92,232, 71, 71, 71, 84, 85, 69, 60,158,112,116,100,118,214,227,113,210, 89, 90, 25,138,207,170,170, 72,243,138, 36, 73,184,186, -188,225,131,247,127,130,251,177,207,191,251,247,127,198,252,120, 66, 28,199, 68, 81,130,213, 41,237,219,182,101,113,183,100,181, - 90, 97,219, 46,251,237,150, 44, 51, 22, 84,167,155, 32, 57,182, 55,188, 54,190,231,227, 88, 54,161, 31, 48,138, 99, 35,188,220, -238, 24, 79, 70,220,221,221, 17,199,102, 18, 93,181, 13,223,125,255, 61, 71, 71, 71,248, 65, 68, 85,150, 60,120,248,152, 44,203, -248,246,249,247,180,218,168,214,151,171, 13, 69, 81,240,222, 7, 31, 80, 55, 38,109,110,179,217, 80, 22, 21,182, 19,116,235, 47, - 23,199,181, 17,149,185,208,107, 93,147,196, 1,203,213,138, 52,221, 51, 78, 34, 67,130,140, 70, 32, 4,150,229,177, 90,175,205, -170, 71, 75, 99,223,174, 42,252,208,176, 81,238,110, 23, 60,126,112,194, 47,254,241, 31, 34,132,224,245,197, 37,135,199, 71, 96, - 91,212, 82,177,218,174,193, 18, 8,173, 81,141, 66, 91, 38,216, 93, 32, 64, 75, 44,173, 17,150, 41,202,156, 79,222,127,135,116, -187,166,168, 74,164,210,148,197, 30,167, 17,248,162, 38,246, 35,146, 36, 96,145,153,253,129,176, 92,252, 32,164, 85, 22,150,109, -254,192,186,110,185,187, 93,115,163,239,168,202,134,200, 91, 32,100, 11,245,158,219,203,128, 63,252,249, 35,198,227, 3, 2, 49, - 34,112,124, 84,237, 80, 85, 45,182, 45,168, 27,197,174,104, 40,242,154,198, 17,140,146, 41,142,235, 99, 55, 29,127, 88,129, 45, -204, 15,250,250,199, 87, 76,130,156,103,167,103,204, 15, 38, 60, 62,254,148,170, 44,121,125,126,206,255,242, 63,255,175,204, 79, - 39,248,177,207,213,235, 91,147, 98,214,122, 96,121, 52,174,131,242, 19,206,255,239,255,192,118,183,229,244,240, 33,158, 80, 60, -255,238, 37,186,202,112,108, 11,169,108,110,150,107,148,106,241, 28,155,187,155, 91,226,104, 74, 45, 61, 22,203, 53,110,229,146, -101,245, 48,158, 93, 46,151,212,245, 17, 97, 28,209, 42,133,114,193,141, 2,230, 7, 7,104,161,152, 30,152,203, 66,104,213,169, -158, 51,254,243,111,126,205,106,233,163,176,217, 44,110,200, 54, 43, 94,215, 53,105,101,216,216,241,151,223,240, 7,255,232, 35, -142,167, 30, 72, 77, 83, 22,120, 86,136, 99, 41,150,219, 53,120,130,159,254,244, 83,126,251,205, 37,105,109, 83,200,138,198, 82, - 20,109,142,229, 74,148,109, 81,150, 21,142,109, 83, 73,197,235,203, 59,108,171,165,173,114,110,175, 47,120,247,157,167,204,102, - 99,118,155, 13, 96, 84,182,113, 28,242,217,239,255,148,208, 19,248,152, 81,166,239, 26, 11,152,213,218, 60,124,112,194, 55,223, -255, 72, 93,236,241, 67,207,164, 70,173,150, 84, 18,150,187, 28, 97, 89, 8, 93,211,230, 59, 92, 45, 25,121, 46,239, 60, 60,198, -126, 56, 39, 77, 83, 86,219, 21,149,108, 89,237,182, 76, 15,231,140,252, 17, 56, 46,101, 81, 24,177,161,227,177,220,166,220,220, -220,225, 7, 1,147,205,158, 69,154,161,173,154,151,203, 45,255,233,111,127,205,114,151,243,224,201, 83,198,179, 67, 92, 47, 96, -159,149, 76,167, 7, 20, 85,205,171, 31, 94,113,116,120, 76,219,202,225, 16,199,234,115,205, 25, 66, 44,162,200,116,242, 65,232, -117,222,215,154, 56,140, 56, 58, 58,234,240,173, 70,177,221, 43,221,123,248, 69, 85, 85, 67,167,223,119, 9, 38,136,196, 25, 58, -249, 73, 50, 26, 40, 89,247,199,156, 40,107, 56,212,238,239, 64,123, 15,183, 73,169,235, 19,231,212, 91, 29,125,223,177,223,199, -101,246,202,246, 1, 61,218,237, 55,239, 99, 49,239, 79, 20,162, 40,194,113, 28,246, 89, 58, 28,216,253, 62,190,167,215,249,158, -195,225,120,202, 7, 31,124,128,235,120,124,249,245, 87, 70,152, 25, 4,180,138,183,188,238,116, 5, 13,247,124,238,125,240, 70, - 93,215, 52,189,127,186,236, 10, 30,219, 27, 62,195,181,108,105,202,130,216,118, 12,170,184,109,200,243, 61,105,150,177,203, 82, -170,186, 33,176,245, 48,217, 16, 54, 56,150,195, 40,138,217,165, 57,163,209,136,205,122,103, 84,220, 78,133,106, 53, 54, 54,161, - 31, 33,107,201,110,189,161, 81, 26,223,241,121,242,248, 49,155,253,142,166,150,184, 81,192,213,229,205, 0, 13,114, 93,247, 13, - 44,196,181,217,238, 54,104,213,233, 21, 58,175,120, 81,150,157,144,207,104, 19,252, 40, 68,202,134,170,106,201,139,148,142, 70, -139, 35,192,117, 76,132,110,223,121,223, 47,224,122, 93,132,227,155,231, 68,116, 74,242,190, 64, 28, 10, 45, 75,188, 5, 61, 10, -186,253,124,219,152, 2,117, 58, 30, 81,150,229, 80, 24, 5, 93,158, 66,219,182,236,247,123,110,239,238,120,244,232,209, 0, 32, -250,189,223,251, 41,182,109,113,126,126,206,116, 58,229,103, 63,251,217, 96, 97,115, 28,135, 32, 50, 5, 92,213,180, 84, 69,206, - 55, 95,125,133, 99,189, 89,209,184,157,242,220,182,109,194,240,255, 35,235,205,154, 44, 57,210, 51,189,199,221, 99,143,179,230, -201,181,118, 20, 22, 2,236,110,176,217, 77, 26,151, 33,103,140,146,120, 33,153, 46,230, 66,127, 77,210,149,126,130,164, 59,201, -198, 76, 52,174,195,173,155,236, 70,163,177, 53,128, 90,179,114, 61,251,137, 61, 60, 60,116,225, 17,167,178,122, 96, 86,102, 64, - 33,171, 42, 43, 34, 78,248,183,188,239,243,134,172, 86,118,122, 51, 8, 45, 11,161,143,227,237,255,255,217,201, 25, 89,150, 17, - 69, 17,215, 55, 87,221,115,238,238,115,235,133,176,168,217,120, 56, 33,207,115,206,207,207, 73,211,156, 15, 62,248,136,209,112, -136,234, 58,251,178, 44, 41, 59,145, 96, 16, 71,123, 52,114,216,169,212,119,169, 93, 75, 5,157, 51, 64,215,102, 31, 71, 28,199, -241,222,141,149,231, 57,235,245, 26, 93,213, 76,134,103,168,241,136, 60,183, 17,200,147,201,132,108,183,227,230,230,102,239, 32, -169, 77,139, 27,132, 40,207,103,187, 94, 99, 90,129, 27,248,108,146,132,249, 98,129, 31, 90, 91,224,102,179, 33, 12, 34,164, 98, -127,143,203,178, 68,183,166,251, 60,192,122,187,193,193,102, 30,232,202, 78,150,234, 6, 76,107,211,214, 22,139,197,222, 81,227, - 58,118, 21, 98,176, 90,149,108,187,224,252,229,144,214, 84,188,255,228, 49, 85,153,242,250,252, 53,135, 71, 19,150,235,132, 48, - 12,237,218,147,160,227, 43,212, 22, 94, 37,133, 29, 34, 40,129, 48, 13,162, 53, 56, 3, 95,209,214, 5,158,132,198, 21,212,101, - 77, 35, 65,136, 26,163, 75,162, 40,222,123, 43,251, 23, 78,161, 91, 2, 9,186,177,248,206,166, 49, 8, 71,226,168,208, 70,210, - 9,133, 84, 13,202,113, 25,196, 19,134,195, 26, 81,165, 84, 89, 78,190,211,212,165,245,178,167,101, 67,214,184, 52, 38, 32, 73, -114,222, 44,109,228,156, 31, 4,196,241,136, 54, 84, 52,153,102, 24,133,140,143, 15,248,203,255,225,207,248,201,199, 31, 35,116, - 73,177,221,240,230,205, 5, 95,124,249, 53,166, 81,100,101, 73, 90, 88,203,128, 35, 34,170,164,100,177, 78,249,242,249, 51,136, - 34,190,254,234,123, 4,246, 80,166,213, 44,230,107, 98,215,165,200,118,164, 69,202,106,179, 70,136, 22,207,149, 52,117, 73, 16, - 28,112,116,124,202,225,198,240,234,106,141, 54, 14,147,113, 76,155,167, 12, 70,138,223,255,233,199,228,201, 53,241,116, 74,174, - 43, 94,189,126, 77,120, 32,121,246,242, 5,215,107,195,127,248,211, 63,197,212, 13,202,203, 81,170,160,105, 54, 8, 19, 19, 7, - 13, 63,252,248, 1,103,167, 51,126,249,213,119, 72,111, 0,174,199, 98,157,243,111,191,252,134, 63,250,241, 71,168,166, 70,148, -134,229,237, 45, 69, 85,115,189,220,144,234, 75,178,214,163,145, 21,219, 38,165,108, 93,132,114,105, 27,131, 43, 90,154, 74, 83, -234,138,217,100,140, 55, 24,146,214, 13,162,105,136,194, 1,121,237,224, 68, 7,196,227, 99,174, 23, 5,121,145,226,235,134,194, -148,252,211,207,254,157, 15, 31, 29,243,254,189,153,245, 99, 7,150, 92,151, 45, 82, 70,145,207, 71, 79, 31,227, 41,137,105, 52, -186,174,248,252,243,207, 41, 27, 88,165,165,221, 21, 54, 5, 15,142,103,124,252,244, 61,142, 70, 49, 65,224,178, 91, 39,108,119, - 59,202,162,162,117, 21,202,243,104,149, 67,101,160, 17, 14,142, 63, 96, 48,142, 57, 58, 53,120,241,152,233,169, 36,140,135,104, -233,114,239,189, 15,248,171,191,253, 7, 94,156, 95,242,241,239,253,152,224,213, 5,235, 93, 66,187, 77,153, 29, 13, 56, 61,125, - 96,213,233,158,195,147,135,239,177,218,108,246,185,201,117, 93,227,119, 12,114,173,237,135,109, 16, 89, 91, 75,149, 23,100, 59, -197,100, 52,102, 58, 30, 19, 6, 1,101, 85,113,113,117,133,116,188,110,141,145,238, 95,186,125, 39,222,219,107,250,177,247, 62, - 77,171, 59,156,149, 82, 4,158,111, 57,232, 89, 70,221, 88,110,123, 40, 4,218,215,160,236,193,216,227, 73,123,148, 43,221, 1, - 98,215, 30, 98, 79, 33,187,123, 0,247,135,112, 31,221,106, 15, 73,171,168,238,215, 2,105,154,162, 16,180,221,139,185,127, 33, -247,221, 99, 83,119,177,155,130,119, 52, 2,253,168,213,145, 22,138,227,123, 1,103,103,103,182,235,168,108,146,160, 29,249,218, - 34,128,110, 74, 32,239,116,117,214,218,230, 91, 79,117,107,104,104,105,141,192, 52,246,122,237,118, 59,116, 7,154, 42,171,140, -162,168,200,242,210,238,130,183, 9,121, 81, 96, 68,119, 40,210, 98,132,157, 58,105, 1,194,245,246,122,136, 56,142,237,181,169, - 27,154,110,205,208,143, 57,133, 16,172,215, 91,164,227, 17, 15, 7,184, 66,238, 67,119,226, 56,102, 58,157,114, 61,191,221,195, - 94, 60, 47,224,225,195,143,208, 90,243,229,151, 95,147,236,236,215, 58,158, 21, 7,234,238,192,114, 58,184, 71, 85,217,131, 73, -121, 46,161,136,169,139,162,139,250, 4,173,223,106, 30,238,122,173,251,233, 74,127,221,108,145,200,127,243,143,232,116, 23, 74, - 41,148,211,105, 47,186, 53, 80,255,227,110,164,174,101, 2, 68,251, 2,162, 40, 44, 98,183, 40, 10,124,207, 18, 15,227,208,103, - 56,156,144,231, 45,166,109,153, 29, 29,242,242,229, 75, 46, 47, 47,109, 99,214,235, 21,106, 77, 83, 87,124,242, 59,191,131,123, - 71,232,233,222, 81,194,219, 66,225, 7,123,237,131,157, 88,152,253,247,222, 52, 13,207,159, 63,223,187, 69,190,251,254,219,189, -254, 3,105,139,212, 40,138,172,165,115, 52,221, 11, 63,119,187, 29,243,249,156, 31,252,224, 7,172, 54, 75,235, 40, 16, 14, 89, - 97,221, 51,171,249,130,213,102,203,118,187,229,240,248,132,233,116,202,112, 56,100,179,217,176, 93,239,136, 99,123,184, 71, 81, -132, 68,218,160, 33,215,130,186,182,117,137,104,225,176, 67, 21, 15,226,152,197,162, 97,177, 92, 90,235,169,239,241,245,183,191, - 33, 12, 67, 30,222,187,207,151, 95,125,205,131, 7, 15,120,244,248, 9,195,209,138,151, 47, 95, 98,132,221,227, 23, 69,197,120, -114, 64, 24, 90, 79,252,104, 56,166,105, 91,140,177, 24,245, 77,178, 35, 24, 13, 17, 74,226, 56, 62,187, 52, 97, 20,249, 22, 47, -189,179, 66,191,166,149,164, 89, 70, 16, 14,201, 43,171,168,175, 26,141,235,249, 4,209,128,162,212, 4,142, 75,224, 8,210,221, -146,191,255,155,191,102,249,195,223,229,119, 62,249,132,223,255,244, 71,124,247,242, 2,179, 92,227,121, 86, 72,171,198, 10,199, -243,160,238,162,130, 90, 65,232,186, 52,173, 70,215, 6,209,180, 56, 82, 52, 56,178, 97, 50, 10,144,202,101,183,109,240, 36,180, - 85,205, 46, 45, 40,218, 20,132,229, 56,251,238,218,190, 56,149,195, 32, 12,217,238,106,164,112, 58, 16,191,131,233,110,116, 91, - 55, 56,173,229,213,214, 24,202,198,166, 27,149, 89, 69,158, 25,138,212,142, 8,175, 23, 43, 94, 94, 44, 89,167, 37,155, 42, 39, -105,236,232,173,172,237,141,167,117, 8,221,144,229,122,142, 43,106,210,188,102,189, 77,208,249,150,237,252,138,202,180, 60,121, -255, 99,118,133, 97,123,157,112,118,118, 66,170,119,252,252,103,191,224,139,207,158,145,164, 53, 21,134, 2, 65,229,184, 28, 30, - 30, 97,234,134, 48,142,104,145,252,243,207,126,201,225,225, 33,227,201,136,193,208,229, 96, 54, 34,244, 37, 85,153,217,244,173, -211, 83,170, 47,158, 17,250,129, 85, 13,235, 6,215, 85,128,193, 27, 4, 76,143, 30, 80, 54,134,213,237,142, 87,151,111, 8,199, - 67, 94,157, 95,113,117,125,193,167, 63,249, 3, 2, 71, 49, 95,239,152, 14, 39, 84,157, 50,255,232,108,198,240,226,146,243,155, - 27,210, 34, 37,105, 96,114,112,196, 38,201,249,155,191,255, 71, 98, 79, 48,116, 13,145, 43,184,189,185,164,168, 42,146, 82, 51, - 79,114, 10, 17, 80,234, 26, 48, 72,209, 80,214, 53,210,115, 40,203, 10,135, 22, 79, 24, 38,131,128,129, 47,168,243,138,192,147, - 20,233, 6,129,102, 54,157,112,118,118, 70, 89, 87,248,190,111,253,158,178,229,223,127,246,247, 36,217,152, 36,215, 92, 94,221, - 82,206, 52, 39,103,247,153, 29,133, 28,156,220,135,142, 21,173,104, 9, 28,193,111,190,250, 53,211,112,192,217,125,219,193,122, -162, 33,144, 16, 58, 32,218, 26, 87,133,132,113, 64,221, 54, 52, 74,113,120,239, 30,243,237,134,162,110, 89,111, 11,182,105, 73, - 28,140,152, 76, 71,132,227, 17, 69, 3,173, 19, 50, 59,125,192, 38,205,248,167,191,254, 7,126,241,249,175,249,159,255,243,255, -194,235,203, 43,142,206, 30,162,194, 45, 85,221,240,242,213, 5,158,183,216,191, 44,214,235, 13,105,150, 82,119, 12,109,215,117, -241, 28,151,178,172, 45,234, 83,216, 67,183,172,114,174,230, 57,174,119,207,166,157, 37, 41,121,150,145,102, 57, 23, 87, 55, 76, - 14,102,148,181,166,110, 12,131, 48,178, 99, 96,165,144,157,167,250, 46,199,187,247,117,191, 61,104,236, 7,213,237, 58,189,162, - 40,246,112, 24, 67, 75, 86,218,255,150,119, 70,180,101, 89,119, 35,212, 6,173,203,253, 11,252,174,226,189, 63,152,123,165,123, -223,169,245, 29,125,150,101,111,247,234,174,139,232, 10, 0,173, 53, 72, 65,146,165,251,145,116, 63, 78,237,189,225, 61,137,204, -115, 3,234, 70,243,252,217, 11,194, 48,228,244,222, 25, 71,174,195, 98,177,176,193, 49,213,219,221,188,105, 91,100, 87,220, 27, - 93,211, 52,238,158,154,150, 36,137, 5,178,116,123,198,126,239,219,123,228,221, 40,166, 46,109,183, 84,150, 53, 81, 28, 99,234, - 10,218,134, 97,236, 83, 23, 18,191, 27,189,214,141,161,106, 44, 62,212,247,125,116, 83,161, 4,180, 70,211,232,178,251,115, 21, - 13,130,198, 72,162,233, 24,146,148, 86,192,124,101,161, 70,105,154,162, 92,143,249,179,239,105,133,228,236,236,164, 91, 75,148, - 29, 59, 62,239, 48,182, 3,214,171, 77,103,227, 50,150,201,109,172,200, 81,152,134,186,176, 95,215,104, 77, 89,229,228,185, 77, -151,147,128,215,169,224,235, 90,163,132,132,214, 22, 86,142,114,104,133,176,107,149, 34, 39,148,234,206, 65,248, 86, 40,103, 29, - 19,182,248, 81,142, 64,235,182,187, 62, 37,131, 48,220,135,167, 36,187, 13,131,193, 8, 33, 20, 69,154,117, 40,212,102,255,140, - 73, 41,121,125,241,134,143,222,255,128,201,100,200,122,189,196, 75, 10, 26, 99, 88, 46,215,220,191,127,159,215,226,205, 91,144, - 81, 87,112, 24, 90, 92,229,240,171, 95,253,178, 99, 87,216,191,143,211,173,112,250, 80, 33,209, 89, 32,251,136,214, 44,203,108, -130, 96,231, 10,169,202,154,193, 96,192,147, 39, 79, 56,152,206, 48,109, 23,110, 82,151, 86,108,102, 90, 14,103,199, 76, 71, 35, -118,157,184,116, 60, 14,120,253,250, 37, 79,159, 62, 37,205,189,125,166, 65, 16,198,156,158,158,162, 77,203,104,185,100,185,222, -216, 20,180,205, 6,229,250, 93,176, 79, 31, 25,235,117,206, 20,217, 21,159, 53,201,118, 77,186, 75, 56, 60,154, 50, 28, 14, 72, -146,132,221,118,205,108, 54,165, 44, 75,206,207,207,137,162,136, 36,205, 24,142,198, 40,223,231,242,251, 23,124,243,237,247, 60, -122,244,136,199, 79, 30,130,146, 36,187, 29,203,245,154,172,200, 59,251, 89,201,114,185,198,247,108,151, 28, 15, 71,248, 94,136, - 40, 11,148,146, 36, 89,138,220,231, 22, 84,108,147, 29,117,165,153, 29,157,160,148, 99, 45,125,209,136,177, 25,227, 71,161,197, -238,214, 6,148,220, 79,127,243, 52, 33,142, 6, 28, 78, 99,110,230, 11,130,151,175,248,143,255,233, 47,184, 94,172,241, 93, 69, - 28,250,152,166, 70, 73, 59,197,106,140, 70, 74, 69,211,193,172, 52, 30,194, 52,214,102, 46,156, 6, 63,144, 20,155, 37,126, 24, - 83,166, 27,240, 67,148,113,208,218,193,236, 26, 74, 81,227, 59, 46,178,169,112, 26,144,110, 68,178, 91, 33,113,172,170,177, 74, - 9,130, 1,208,237,252, 76, 69,224,121, 44,214, 75,210,178, 32, 30, 58, 52, 78,192, 23,175, 94,242,243,127,253,154, 40,152, 90, -113, 65,150,225, 42,143,162, 46, 56, 59,123,143,198, 13,249,197, 23,223,147, 21, 9,131,193,148,178,110,208,109,137,240, 28,118, - 85,195,213,162,102, 16, 44, 25, 6,146, 77,102, 56, 60, 58,197, 59,112,249,254,122, 69,146,166,252,211, 47, 94,115,187,216,242, -242,213,156,141,246,169,132, 13, 69,240,194, 8, 93,150,164, 73,142, 18, 45,241,233, 17,227,201,144, 7,239, 61, 38, 12,134,100, -233,142,229,252, 10, 33, 37, 87,183, 87,172, 55, 11,158,189,254,158,179,155, 91,124,223, 69,175, 19,148, 14,236,152,202, 64,161, - 91,146,186, 33, 24,133,168, 86,163, 11,193,235,151,115,164,115,205,231, 95,156,227, 5, 17, 95,124,125,139,104, 13,178,213,136, -118,142,244, 15,184, 93, 23, 44,147, 10, 21,141, 89, 22, 21,248, 33, 3,119, 76,211,180,236,178, 29,199,227, 35,206,223,188,225, - 96,228, 51, 10, 92,187,154,208, 13, 85,235,224,199,135, 92,190,185,165, 72, 26, 68,171, 8,156, 0,207, 17, 24, 9,193,192, 71, - 86, 57,211, 64,241,187, 15,143,152, 70, 14,179,135,167,120,174,232,130, 21,126,192,244,248,152,162,206,137,188, 6, 73,197,209, -100,192,179,103,223, 81,215, 53, 79,158,126, 68,154, 38, 60,187,218,208, 6, 99, 14, 85, 72, 93,151,120,170,165, 44, 54,196, 65, -136,163, 4,113, 32,248,147, 63,252,148,237,118,139,235, 5, 76,198, 67, 66,106,226,110,111, 38, 28,151,151,175,206,113,118, 17, -143,223,255,128,167,135, 71,172,118, 41,159, 62,253, 17,255,248,175,255, 70, 89, 37,184,222,128,172,210,168,170, 38,136, 7,108, - 54, 43,238, 63,124,196,231,223,124,203,127,253,151,159,243,205,119,207, 9,226, 1, 47,222, 92,243,171, 47,191,102, 48, 28,211, - 74,201,114,177, 70,107,205,189,233, 12,223,247,153, 95,223,176, 43, 50,178,178, 64,121, 46, 65, 20, 82,100, 37,201,198,218, 96, -102,147, 41,113, 28,242,234,226, 21, 15, 30,221, 99, 52, 26, 49, 95,205,145, 75, 43,168,170,203,134,249,237,154,178,129, 77, 86, -146,215, 26, 39, 8, 17,202, 69,155, 22,229, 90, 33,149,193, 10,191,178, 34, 7, 1, 65, 20,226, 5, 62,202,237, 2, 84, 60,213, -229, 57, 11,134,195, 49,158, 99, 61,228,187, 77,194,236,232,128,166,170,201,116,141, 84,194,162,121,145, 72,233, 80,151, 6, 41, - 60, 59,170,212, 37,186,178,130, 44,221, 26,242,202,122,174,123, 27, 91,191,151,188, 11, 53,233, 71,249,181, 99,145,183,123,148, -168,239,208,180, 45,215,183,139,125,167,171,155, 22, 87, 90,221, 65, 85,244,177,178, 29,133,174,210,140,167, 7, 52, 77,195,171, -215,111,152, 30,140,121,252,248, 49,198, 24,174, 47, 47, 73,211,148,164,169,200,179, 12,186, 3,175,204, 83, 48, 26, 93, 21,236, -186, 29,171,160,165,200, 83,242, 44,217, 31, 58,227,209,192, 10, 16,165, 96, 50,138,217,110, 27, 84,219,224,180, 53,195,192, 65, -149, 21,109,153, 49, 12,148, 85, 5,107, 67, 86,149,123, 81, 83, 57,191, 97,187,222, 16,135, 30, 85,177, 35,119, 90,226, 56, 36, - 30, 14,184,158,207,169, 27,171,254,149, 82,112,116,120,132,151,231,108,147, 29, 7, 39,179,125, 23,141, 16,108, 54, 27, 46, 46, - 46,241, 28,135, 36, 43, 88,175,215,140, 70, 19, 78, 79, 79, 57,156,206,248,246,219,111, 89,173, 86,212,165,125,105,171,182,133, -218,170,214,195, 56, 38,207, 51, 26,211, 16,250, 62,117, 55,185,104,218, 22,163, 27,116, 11,161, 31, 81, 85,154, 52,201,112, 39, - 19, 74,163, 41,116, 13,194,218,157,108, 7,175,208,157,210,222, 78,125,172, 14,105, 56,138,201,118, 9, 69,247,231, 41,165,216, -236, 50,178,226,130,167, 79, 3,132,116, 17,142,135,105, 75,106,211, 16,249,118,244,190,221,174,241, 67, 15, 47,140,184,185,189, -101,185,217, 50,154, 30, 16,197, 99,164,227,241,250,249, 27,132,104,185,154,221,240,248,225, 19,110,111,111,185,190,185,196,241, - 60,164, 2, 63,244, 45, 69,111, 60,164, 46, 45,118,186,105, 26,234,110, 74,180,199,197,150,214,105, 97,106,109, 93, 12, 93, 33, -153, 39, 41,173, 20, 54,106, 52, 12,113, 61,135,211,179, 19,142, 14,102, 76,167, 83,171, 27, 48, 13, 69,154, 17, 13, 7, 44, 87, - 54,205,110, 48,140,104, 76,141,235, 59,156, 95,188,228,163,143, 62,226,234,234,134,197,106,137, 49,154,213,106,197, 98,181,166, -174, 45,108, 12,160, 54,134,208,181,224, 49,175, 83,217,235, 42,227,250,114,213, 9,254, 20,155,205,138,241,104, 72, 89, 8,162, -192,225,246,230,130,143, 63,254,136,198,104, 46,175, 46,152, 78,167,123, 29,192,116,118,200,124,185,226,201,123, 31, 50,156,205, -240,135, 67,222, 92, 93,179, 78,108,248, 16, 29, 50, 88, 8,193,229,197, 57,163,145, 69,224,186,158,195,120, 52,177, 65, 63,195, - 17,187, 52, 39,171, 10,138,194, 22,183, 85,158, 50, 95,174,121,112,239, 62,109, 91, 1,246,231, 71,195, 33,171,229,150, 86,216, - 12,244,211, 35,107,245,107,154,134,114,183,193, 81,138,217,209, 9,219,245,146, 55,215,107,142, 14,103,252,250,171,231,180, 50, -226,195, 15, 63,100,113,187,164, 78, 51,178, 52, 69, 87, 57,174,239,161, 58,254, 64,223,116, 24,225,160, 92, 15, 33, 20, 78, 93, -215, 44, 23,183,124,246,217,231,252,254,143,127,194,209,193,140,205, 46,199, 40,143,172,104, 64, 10, 86,187, 13,155,205, 14, 87, - 57,140, 61, 15,225, 4,104, 19,226, 72,137,212, 26, 79,215, 56,213, 18, 95, 41,102,199,167, 28, 30, 60,100, 16,186,124,251,205, -191,210,228, 27,156,118, 66, 93,217, 80, 22, 93, 27,136, 20, 7,179, 99, 30,191, 63, 68, 9, 67, 90, 20,140,166, 39,100,181,224, - 98,177,102,243, 34,167,170, 74,116, 99,200,155,138, 48,240, 48, 66,112,125,155, 83,166,151, 56,166,224,234,245, 51, 92,255, 59, -206,151, 91,140, 12,217,108, 51, 10,109,104,140, 67, 94,106, 92, 47, 66, 5,118, 20,155,215, 26,207,117, 49, 85,133,163, 4,101, -190, 33,243, 91,214,171, 91,138,180,160, 42,114,148,212, 92, 92,164,132,161,224, 96, 54,224, 71, 63,250, 33, 79,223,255,152,255, -231,255,253, 39,226,109,193,182, 44, 40,243, 22,165, 42, 42, 93,243,122,126,195,213,188,194, 20,154,166,108, 41, 10,248,236,179, -111, 49,140,240,131, 41,127,255,143,159,227, 40,137,106, 53,179,131, 9,121,173,208,173,228,197,155, 57,207,206, 47,185, 93,239, - 88,237, 18, 60,223,195, 17, 14, 85,186, 99,185, 84, 44,167, 1,142, 24, 80,150,146,155,197,194,230,253,186, 33,171,221,134,155, -229,142, 86,184, 56,173,131,174, 26, 50, 93,209, 6,138,204, 84,156, 12, 67, 70,113,192,163,123,103,252,224,233,125, 84,147,161, -171, 12,199,149,100, 85, 73,177,187, 5, 39,224,250,205, 75, 94,188,122, 67, 85,150,188,124,245,138,171,139,107,132,242,216,166, - 5,219,172,226,215, 95,125,199,199,159,252,144, 40,116,193, 88,107, 83,154,172,105,180,245,205,222, 63,153,113, 56, 25, 88,250, -149,146,232, 93, 70, 91,105, 20,144,100, 37, 6,152,175, 55,168,235, 5, 87,155,130,180,168,216,125,245,156,111,191,123,198,248, - 96,198,171, 87,175,104,219,134,131,131, 3, 14, 15, 15, 25, 14,135,252,237,127,253, 71,110,150, 27, 54,105,202,189,251,143,153, - 28, 30,114,126,113,133,114,124,234, 6,214,171, 21,155,205,206,238,248, 54,107, 91,129,111,182, 54,221, 79,128,169,107,132,177, -221,173, 23, 15,247,118,174, 69,145, 49, 30,143,152, 76, 38,132,161, 79, 89,100,212,133, 85, 14, 87,169, 85,194, 74, 71,253,150, - 39,220, 66,186,251,113,173, 61, 0,101,183,211,210,123,175,118,111, 69, 3,105,213,239, 13, 8, 90, 75,153,114, 3, 90,167,161, -109, 12,147,201,152,162,169, 59, 31,118, 65, 93,212,152, 70,162,132,131,231,185, 8,217, 32, 28,241,223, 88,157,164,144,251, 49, -107, 15,145,233, 59,236,254,107,237, 56,254, 93, 1,156,238,213,215,210, 6,152,216, 12, 84,241,206,200,119, 31,243, 42, 36,126, - 24,144,117,118,190, 48,180, 93,196,103,159,125,198,241,225, 33,143, 31, 63, 38,207, 18, 54,155, 13,203,229,156, 44,203,144,152, - 78,143, 97, 57,248, 74, 56,239, 80,213,250,241,254,221, 31, 86, 17, 47,144,227,225,158,235,221, 67,102,148, 18, 32, 90, 28,215, -118,108, 73,158,219,235, 34,172,194,184,105,106,171, 97, 41,115, 46,182, 91,188, 32,166, 65,161, 13, 36, 69,137,185,157, 19,120, - 14,219, 36,177, 35,227, 56,196,116, 58, 21,207,243, 64,138, 61,179,220,118,170,111,201,102, 55, 55, 55,164, 91, 43,144, 20, 45, -108,211,148,131,225, 8,213, 33,122,163, 48, 68, 10,129,219, 21, 71,189,178,223,158, 53, 93, 84,168,120,167,233,254, 22, 0, 0, - 32, 0, 73, 68, 65, 84,123, 79, 28,199, 67, 58,150, 77, 96,176,193, 34,109, 99, 39, 40,166,125, 27,189, 42,165, 68, 40,137, 16, - 22, 10,212, 39,197,217,200, 83, 9,210, 58, 83, 22,171, 53,143, 30,220,239, 38, 81, 18,207, 15,145,210,222,167,198, 85,182,251, -174, 12,187, 52,101,179,221,145, 23, 37,142,176,191,222,238,152, 27, 86,171, 13, 81, 20,241,135,127,248, 71,204,231, 55,236,178, - 29, 45,141,229, 17, 40,135, 42, 47,217,237, 82,170,170,176,236,246, 32,124,107,127,236,180, 0, 22,170,228,116,107, 26,111, 15, - 98,234, 39, 83, 0,147,201,132,205,102,195,102,179,225,197,139, 23,108,183,219,189,176, 82,121,238,158,104,215, 74,193, 96, 48, - 64,185, 14,211,233,148,155,155, 27,130,192, 34,154,139,188,162,149,173,157,160,108, 82,202,114,135,116,173, 39,254,224, 96, 98, - 63,127,101,222, 89, 44, 3,182,219,150,172, 43, 34,163, 48,192,113, 36,211,113, 12, 24, 62,254,228, 67,154, 70, 51, 28,198,164, -105, 72, 93,215,108,182, 27,232, 82, 25,165,112, 40,234,138,197,114,205, 31,255,241, 31,115,118,122,202,114, 57,231,252,229, 43, -202, 42,167,200,242,125, 24, 81, 85,230, 8, 36, 39,135, 51, 30, 63,126, 15,215, 15, 58, 55,193, 22, 47,183, 57, 14,101, 94, 32, - 91, 65, 16,198,184, 94,240, 78,222,132,105,176, 69,157,177,235,176, 74,215,150,225,191, 71, 75,219,231,194, 15, 99,140,174,104, -144, 20,101,197,243,231, 47, 56,158, 29,226, 74,197,241,209,140,157,235, 96,140,166,174, 5, 8, 67,173,237, 26,160,255,204, 9, - 20, 8,112, 14, 38, 51, 60, 47,160,174, 52, 45, 14,227,233, 17,105, 49,231,197,171, 75,174,111, 55, 44, 54, 59,146, 92,163,113, - 57,152,157, 16, 14, 39, 8,169, 48, 72, 66,213,242, 59,167, 49,179,129, 36,140, 36,227,209,136,195,131,251,140,226, 9,155,245, -156,255,227,187,127,192, 75,174,137, 43,133,106, 52, 31,159, 29,242,240, 63, 29, 19, 15,103,104, 83,131,231,112,181, 94,163,165, -160,212, 59,178, 82,227,184, 13,129, 39,104, 58,126,174, 82,118,164, 90,229, 59,190,123,126,133,103, 42,198,195,128, 38,243,240, - 91, 7, 63,156, 80, 9,129, 44, 53,174, 2,217, 42, 12, 10, 33, 5,170,251,139, 23, 69, 74, 52, 30, 34, 84, 75,219,148,148,137, -129,200,165, 78,215,156,157, 28,146,236, 74,158, 60,250,128, 50,223,241,233,167, 31,243,224,225, 49, 71, 39, 71, 44, 87, 41, 97, -216, 16,198,150,223,158,230, 37, 80,176,201,214,124,251,252, 25, 58,223,113, 56, 56, 68, 24, 15, 63,154,242,245, 23, 95, 51, 24, - 31,114,124,239, 49,151,111, 46, 8, 60, 73,165, 5,155,164,166,172, 21,121, 89,242,205,119, 47,217,229, 37,135, 39, 15, 16,222, -132, 44,213, 12,194,136,204,215, 8, 5,187, 52,177, 93, 73,145,242,253,243,231,252,224,135, 63, 38, 30,133,204,207,111,185,184, - 93, 34, 84, 72,173, 5, 45,146,178,177, 36, 57,229,180, 48,140,121,121,126,201,207,127,249, 5,227, 40, 96,224, 54,152, 58, 39, -240,177, 36,186, 60, 71,182,130,247, 30, 61,230,252,252,146,127,251,247, 95,162,181,230,234,234,138, 87, 47, 94,160,117,205,118, -187,197,115,108, 62,250,147, 71,143,200,211,141, 69,223, 86, 53, 70,215,152,238,229, 77,215,189,150,105,197,208,183,118, 66,164, -131,116, 3,166,135,167,220, 60,127,201,151,191,249,158,229,102, 71, 81,105,242,218,112,118,239, 30, 79,223,255,144,239,158,191, - 96,189,222,112, 59, 95,243,234,205, 5,215,215,215,160, 28,254,236,207,255, 35, 39, 15, 30,241, 55,127,251,143,100,186,193, 13, - 6, 86,132, 36, 29,210, 46,220, 2, 32,217,238, 88, 44, 22,232,166, 98,232,142,246, 99,113, 71, 56, 40,169,112,149,139, 68, 80, - 84, 21, 69,145,115, 52, 57,220,139,220,202,178,196,104, 67,235,181,180,104, 4,154, 58,207,209, 85, 70, 83, 22, 56,248,136,214, -177,239,107, 3,190,231, 80, 21,249, 91, 15,120,107,197,132,142,124,155, 85,126,117,123,251,150, 85,239, 56,180,141,245,144, 42, -207, 42,142, 21,206,254, 96,110, 26, 27, 15, 41,187,151,166, 16,109,183,239,238,145,172,150,123, 47, 91, 27,252,209,139,226,250, - 0,149, 30, 52,211,171,219,109,215,254,238,161,222,139,120,196,254, 94,189,141,250,188,187, 75,239,255,223,124, 62,223, 11,254, -194, 48, 68, 72, 75, 47, 91, 44, 22,180,109,203,217,189, 19,235,224, 80, 71,182,235,222, 39,145,217,113,121,219,176, 23,248,245, - 2,192,126,100, 95,150,229, 59, 96,150, 94, 57,223,123,236,235,186,102,113,123, 77, 86, 20,156,221,127,192,139, 23,175,208,221, -232, 62,112, 36, 7,147,169,181, 88,102, 5, 65, 24,179, 92, 93, 82, 85, 26,210,140,178,210, 20, 69, 6,109,203,116,116, 98, 29, - 4,117, 97,119,198,162,165,174,117, 23,162, 98,175,245, 96, 48,176, 34,199,174, 83,150, 82,178, 92,174, 49,192,239,124,252, 49, - 79,158, 60,225,235,175,191,182,251, 99,218,253,216,119, 56, 30,189,227,128, 16, 66, 32,127,107, 55,222,236,247,230, 98,191, 83, -119,164,178, 58,139,194, 10,188,154,110,175,222,235, 48, 92,229,236, 69, 87,119, 45,146,173,177, 99,241, 74,215,172, 86, 11,102, -211, 9,141,169,113,218,183, 73,123,189, 29, 49, 43, 44,112,166,105, 52,121,158,177,219,109,173,109,184,179,191, 9,209,242,205, -111,126, 67, 16,249, 60,126,252,136,207, 62,123,195, 23, 95,127, 65, 60, 8,247, 88,225,193,112,188, 23, 86, 30, 70, 49,173, 35, -201,187,207,138,148,210,230,204, 55, 13,166,177,154, 1, 37,228,219,196, 63, 99, 24, 4, 33,203,229,114,175,111, 24, 15,134, 86, - 64,214,105, 65,180,214,123, 39, 72, 99, 12,209,112, 64, 24,134,236,210,100,175, 93,233,245, 31,219,237,150,180, 40,169, 43,141, -214, 16,199, 49, 94, 24,216,232,213,195,195,142, 87,176,235,194,132, 66, 30, 62,120,192,120, 60,102,177, 88,208, 84, 37,151, 87, -111,240, 93, 7,223,115, 45,147,126,183,101,181,152, 19,199, 49, 71, 71, 39,140,199, 99,182,155,180,211, 60, 84,236,118, 41, 32, -120,245,234, 53,129, 23,112,112,112,200,209,193,140,229,114, 73,178,219,216,231,215,177,185, 7,203,229,154,155,155, 27,110,110, -110,152,204, 14,249,224,131, 15,120,252,240, 62, 73, 86, 16, 5, 33,243,155, 43,118,117, 13,141,233, 52, 29, 30,109,219, 48, 24, -142, 45,195, 64,215, 52,101,137,235,137,174,200,201,217,166,137,125, 22, 29,133, 40, 58, 90, 33,206,158,219,191, 92,173,120,246, -242, 5,142,144, 28, 30, 30,226, 56, 30, 69,241, 86,183,131, 48, 86, 17, 47, 68,231,150,176,107, 21,231,197,247,207, 9,188,128, - 63,255,243,191, 96,122,112, 76, 94, 26,214, 73,193,191,254,226,215,228, 21, 68,241,152,164,104,104,165, 67,157, 20,220,174,207, -169,180, 33,140, 7,204, 2,248,209,159,253, 25, 79,206, 66, 28,213,197, 77,210,224,170, 20,124, 77,185,131,100,185,192,123,239, - 1, 45, 46,145,242,192,149, 20,219, 53,155,100,129, 51, 24,224,133, 17,249,170,228,122,126,197, 38, 45,217,110,182, 52,186, 64, -119,149,111,145, 87, 16, 4,118,228, 98,140,197, 10, 54,138, 86,186, 24, 35, 41, 27,131,240, 20,158, 31,226,248, 18, 99, 36,141, - 78,236, 62,191,170, 59, 96,133,228,241,163,123, 4,142,224,217,247, 95, 51,142,125,254,228, 15,126,204, 7, 31, 62,161, 69,243, - 15,127,251, 55,108, 86,183,124,241,171,239, 17,166,100, 50,250, 19,171,148,204, 50,162,200,227,240,104,204,112,236,146,229, 53, -101,149,208, 10,193,124,177, 67, 52, 21,171,155, 75, 54,235, 20,229,197,228,149, 32, 91,110,121, 90, 75,198, 7,103,136,214,170, - 17,165, 4, 95, 6, 72,223,144,119,187,148, 86,216, 42, 49, 10, 67,166,211,136,192, 25, 67, 83, 80,213, 53, 77,211, 82,234, 6, - 45, 29, 86, 69, 65,236, 6,228,218,102,221,123,190, 75,154,215, 56,142,103,171,125, 12,131,104, 0, 66,113,179,216,242,111,191, -250,146,147,163, 67,126,247,189,123, 12, 3,143,109,178,198, 43, 44,114,179,212, 53, 15,206, 78,249,193,239,254,136,255,242, 87, -127,199,124,185, 98, 16, 90,129,205,193,100,202,193,244, 16,218,134,219,155, 5,143, 31, 62,178,144,135,197,154,192,183,123,204, - 90,107, 36,214,202,166,148, 75,217,150, 44,118, 41,126, 56,178,106,244,151,111, 40,141, 64, 75,143, 93,182,225,235,111,159,179, -218,101, 4, 81,200,131,247,222, 71, 75,129,242, 67,132,155,115,117,117,193,250,249,134, 93, 2,255,233, 47,126,202,175,191,252, - 13,203,205, 22, 39, 8,169,155,150,221,122, 13,210, 65,111,211,125, 74,218,118,187,165, 46,173,167, 91, 57,150,118,101,132,253, - 48,248,174,143,196,134,112,216,103, 71, 18, 14, 98,132, 84,251, 48,133, 60, 75, 8, 29, 15,237,150, 72,209, 50,138, 3,194,214, -179, 9,129,190, 66,185,142,141,116,212, 26, 79,194,112, 56,178,241,153, 61, 61,174,126,235,229, 77,146,132, 44,203, 88,109, 55, -152,186,194,119, 3,124,229,208,118,123,249,216,141, 49, 77,203,102,179, 33, 41,115,146, 44,163,174, 53, 82,218, 23,178, 18,150, - 17, 80, 20,197,190, 83,175,107, 75, 46,235,199,230,253, 46,188, 44,203,189,210,189, 23,171,134, 97,216,253, 92,181, 87,189,247, -170,234, 94,157,252,219,135,253,111,171,236,251,195,191,231,202,207,231,115,164,178,254,226,182,243,119, 95, 92,158,219,113,172, -146,221,117,118,187, 3,206, 30, 98,129, 23, 90,245,123, 39,220,139, 58, 79,113,191, 42,232,109, 71,253, 72,183,215, 9,244,160, - 29,207,145, 24,173, 57,152, 88, 33, 85,216,125,214,243, 60, 33, 81, 25, 97, 24,147,236, 54, 68,113,140,114,125,178,188, 34,201, -106,110, 87, 59,123,248,123, 62,190, 31,162,181, 33, 73, 18, 46, 47,175, 1,187, 3, 54,173, 61, 72, 44, 83,220, 39, 73, 50,148, -107,157, 10,147,201, 4,223,119,169, 43,195,243,231,207,239,176,198, 83, 92, 41,137, 67,235,215,239, 11,160,166, 47,136, 16, 56, -242,237, 1,219,116,236,248, 30,204,211,139, 27,251, 98,243,110, 49,117,183,232,234,175, 71,191,191,166,187, 39,109,247,243,189, - 37, 44, 73, 18,134,113, 72, 24, 88,140,172, 20,173, 21, 70, 26, 77, 20, 14,152,175,223,236, 97, 64,187,237,150, 42, 47,172, 50, -189, 3,203, 8, 33,120,254,236, 37,163,209,136,135, 15, 31,179, 77, 19, 94,189,122,129,214, 13,163,113, 76,178,181,221,100, 85, -148,150,158, 87,151, 52, 13,132,157, 83,196,166,211, 25, 76,103,137,147, 82,226, 74,181,239,230,219,142, 79,144,231,185,213, 93, -117, 40,227, 32, 8,246, 57, 3,142,239, 89,191,119,154,226, 71,214, 90,122,125,123,195,217,217, 25,201, 46,229,234,234, 6, 37, - 93, 78, 79, 79,185,184,184,102,179,190,193,113, 2, 38,221, 52,207,241,189,189, 3,197,126, 6,160,174,173,150,235,252,252, 21, -174, 84, 32, 12, 81,224,243,248,201, 35,102,211,201, 94,225,190,236, 48,205, 74, 41, 6, 81,204,252,122,137, 68, 48, 28, 12, 56, - 60, 60,100,189, 73,248,242,235,223,176, 92,174,249,225,239,126,194, 79,126,252,123, 68, 81,196,237,141,213,150,140,134, 49, 97, - 24,242,248,209, 35,150, 43,139,146,189,124,243, 18, 26,205,251,239,127,200,120,122,192,131,211, 19, 98,199, 97, 29, 71,220,220, -220,176,221, 38, 76,199, 19, 60, 63,216, 91,107,109,164,183,229,117,184,174,157,208, 41,209,176,205,115, 59, 45,236, 33, 72,157, -224,114, 60, 30,163,181,182,168,227, 40,178, 26,158,222,162, 43, 37,194,233,211, 6,251,116, 64,246,207,149, 83, 21, 53,131,192, - 82,226,242,194, 30,232, 69, 45, 48, 34,192,141, 92,118,133,166, 52, 18,122,159,172, 1, 47,176,138,226, 97,212,210, 82,225, 72, -143, 70,231,212, 70, 83,149, 91, 28, 21,224, 40,159,193, 16, 46,111,118, 44, 54,134,100, 87,178,221, 25, 16, 62,121,163,217, 21, - 21,142,204,248,230,219,151,220,172, 82,214,155,148,218, 8,116, 43, 25,132, 3, 90,229, 17, 68,113,231,129, 7,225, 58,168, 64, -209,212, 13,137, 78, 49,186, 6, 13,110, 16,224, 75, 23,225, 52,184,194,161,109,149,197,110,118,120,203, 44,217,177,222, 46, 57, -220, 4,252,193,127,248, 19,142,166, 33,129,175, 40,179, 45,223,126,245,133, 5, 4,100, 5,174, 19,113,114,124, 64, 83,185, 36, -107,205, 50,206,109, 36,172,177, 80,150, 48, 26,224,250,130,188,240, 73,179, 53,207, 94,172,112,148, 65, 86,176,219,100,156,222, -159,114,239,225, 7, 20,165, 38,203, 45,133,171, 42, 43,124,215,161,166, 65,121,146, 97, 16, 34,242, 2,183,133,154, 45,117,221, - 80,154, 45,145,119,134, 51,244,201,146,156,186,213, 72,199,101, 60, 58,225, 73, 52,228,106,177,197,159, 38,108,202,138, 10,112, -148,160, 21, 6, 67,131, 48, 54,216, 34,165,101,183, 92, 83, 20, 13,111,202,132,159,255,234, 55,120,142,228,241,241,144,195,209, -144,245,226, 13,147,193, 0,148,160,200, 83, 30, 63,122,196, 79,255,240,143,249,255,254,234,175,201,139, 2,199,139,240,252,152, -123,247, 30,242,213, 23,191,102, 60, 24,179, 94, 37,136,214, 16,197, 35, 76,163,169,117,133, 49, 22, 92,161,235, 22, 90,137,242, - 6,220,110,175,137,133,207,124,149,242,252,205, 45,175, 47,111, 8,135, 99,140,116, 57,188,247,128,184,110, 88,174,183,188,190, - 90,112,177,248, 25,203, 93, 70,105, 4, 89, 13,171, 4,194, 0,146,172,226,235,175,191,197, 72,133,114,125,138,178, 38, 26, 12, -240, 92,151,245, 98,249,142, 29,203,116, 2, 30, 87,217,157, 93, 31,123, 25,248, 1,109, 99, 95,178,111,243,152,173, 18,186,197, -128,177, 54, 38,207,243,240, 93,193,104, 60,230,254,217,161, 85,205,155,154,186,110, 40,202,146,178,172,168, 76,131,239, 74,102, - 93,242, 91, 89,105,242,188,232,172, 65,182,227,206,210,130,237,110,219,253, 57,174,245,115,183, 45,181,174,200, 43,129, 83, 58, - 32, 33, 43,114,146, 34, 35,201,114,154,214,224, 57, 62, 82,216,226,161, 63,132, 29, 99, 25, 15,189,160,170, 63,212,239, 98, 71, -239, 90,161,246, 94,241,238, 48,191,203,224,238, 15,239,254,215,191, 29,235,218, 95,219,143, 83,251,235,105,241,154,134,210,216, -162,220,104,219, 65,187,202,170,199,107,109,129, 42,162,181, 71,154,233,199,177,157,184, 47,138, 6,214,195, 91,149,180, 6,219, -145,100,102, 47,244,203,187, 34,172,239,142,123, 81,160, 80, 86,213, 94, 23, 37,135,179, 99, 78, 78,206,240,220, 0,215,177,234, -225,155, 34,231,213,171,115,222,123,242,136, 70,183,100,105,129, 16,138,197, 98,133,112, 61,210,196,250,150,227, 56,182,163, 93, -165, 24, 14,135,220, 44,230, 93, 36,176,135,214,181,229, 70,180, 16, 4,150,198, 86,119,107,149,209,104, 68, 20, 69,188,185,184, -102,189, 94,115,112,112,192,143,127,242, 19,150,203, 37,223,126,251, 45, 89,145,239,215, 4,150,182, 89, 89,251,106,119, 45, 90, - 99,104, 0, 79,118, 2,191,250,109,226, 94,207, 10, 40,122,165,188, 49,182,224, 52,111,197,140,253, 61,170,202,234, 29, 80, 17, -162, 1, 97, 69,158,142, 84,118,220, 60,155, 66,199,127, 31,196,118,148,188, 93,109,236,245,237,112,183,162, 59, 52,234,202,174, -134, 70,163, 67, 27,106, 50, 24, 80, 85, 21,183,183,183, 28, 30,206,248,244, 7, 63,180,133, 20, 48,136, 34,218,198, 16, 5,182, - 8,219,110,183,108, 86, 43,235,102,168, 74,242,213,214, 30,206, 66,224, 72,235, 70,112, 92,133,239, 90,145,158,227, 89,170,228, -120, 50, 97, 50, 30,239, 69,164, 90,107,134,145, 13, 7,170,186, 14,191,159, 12,172,182, 27,174,175,175,185, 93,204,145, 82,114, -124,116,194,245,245, 53,227,241,148, 89,215,141,247,147,149,126, 95,175,148,162,204, 45,192, 70, 74, 56, 60,154,225, 74,197,226, -230,154,150,134,147,163, 67, 90, 4, 39,199, 51,102,211, 9, 18, 67,145, 89, 8,213, 32, 10,105,234,154,219,171,107,130, 56,218, -235, 22,194, 48,230,232,224,144,215,175,175,153, 78,103, 56,202,227,235,175,127,131,209,154,167, 79,223, 99, 54, 59,178, 5,117, -145,177,221,110, 57, 62, 62,230, 39,191,255,123,124,242,241, 71,124,241,229,151,156,159,159,243,236,251,111, 56, 61,190,207,116, -114, 64,224,187,220, 63,187,135,239,122,180,173,237,160,211, 44, 99,151, 36, 12, 71, 49, 72, 65, 89, 87, 36,233, 14,199,145, 29, -156,200,197,117, 21,210,113,169, 1,161, 36, 69, 90, 33,178, 12,207, 27, 97,104,109,128, 87, 85,147, 22,182,104, 66, 40, 16,146, -166, 53, 56,174, 71, 81, 84,221,245, 53,232, 22,140,144, 56, 54,226, 79,115,179, 92, 18,142,102,148,186,101,185,201, 48,202,101, -181,203, 17, 42,164, 50, 45,186,168, 17,170,177,149, 65, 85, 49,159,223,144,139,156,155,249, 49,227,160, 64, 57,157, 90, 82, 57, -148, 70,147,107,137, 81,208,122, 83, 50, 19,243,226,102,197,245,213,130, 86, 56,108,147, 53, 23, 87,223, 83, 26, 77,101, 66, 26, - 92, 92,199, 39,112, 3,154, 22,202,160,237, 24,234, 30,227, 97,184, 87,133, 38,121, 73, 83,151,248,190, 71, 28,135,248,158, 71, - 93, 25,132,163,240, 91,123,243, 13, 2,221, 52,136, 86, 32,149, 96, 54,155,226,202,150,225,112,200,236,112,202, 98,113, 73, 85, -149,172,138,156,225,120,136, 41, 74, 38, 7, 71, 76,135, 71,156, 30,191, 71,182,219,114,126,190,230,245,229, 45,173,146,156, 28, -223,195,245, 51,148, 55, 6,225, 83,155,134,155,155, 43,218,182,238,130, 12, 92, 14,131, 3, 90,229,113,120, 52, 68,249, 54, 95, -119,177,218,161,148, 98,190, 88, 97, 90,141,174,106,188,192,103,155, 36, 56,158, 79, 94,214, 54,249,169, 42,136,124, 24,199, 35, -118,142,205,144, 55,109, 75,171, 20,110, 56, 96, 56,117, 73, 43, 67, 94,107,178,170,166,105,237, 40,218, 49,150, 36, 20, 71, 1, -109,219, 80,214,154,209,193, 17,217,118,199, 55,207,206, 57, 58, 24,241,240,222,239, 81, 84, 37, 71, 71, 39,148,121,129,112, 93, -180,174, 72,202,138,167,239,127,200,147,151,111,248,246,203, 95,241,250,252,138, 40, 28,209,224, 32, 28,159,175,190,253,158,162, -170, 25, 68, 33, 70,215,236,146,205, 59,163,224, 30,217,121,124,124, 12,142, 98,216,122,108,171,150,188,149,108, 74, 77, 74,206, - 46, 95, 18,198, 99,198, 7, 51,170,213,142,151,151, 87,123, 65, 87, 85, 85, 72, 47,224,248,158, 75, 28, 6,124,243,237, 51,148, - 31, 48,157, 28, 48, 95,172,136,135, 67,226,225,152,215,111,206, 25,143,167,123,212,166, 29,107, 70,221,139,181,193,119, 20,162, - 31, 17,214,186, 59, 96,237, 24,184,168, 43,170, 34,183,197,143, 16,120,174,131, 66, 80, 87, 5,133,104, 25,133, 62,147,225,152, - 42, 93,161, 68, 67,232, 40, 92,161,240,165, 75,227,187, 72,215, 35, 10, 60,218, 70, 19, 71,246,224, 75,146,100,239, 73,207, 50, -123,200, 24, 83,239,153,222, 66, 41, 11,199, 48,154, 36,221, 33,164,164,210, 53, 82,216, 3, 7,161,236, 14,186,109,105, 58,142, - 55, 24,154,166,221,219,162,238, 90,206,122, 5,178,214,205,126,108,219,119,225, 61,174,182, 63,212,251, 42,189, 31,139, 42,229, -188,227,157,110,247,123,183,183,227,242,186,174,247, 1, 45, 65,224,237, 21,206, 85, 93,216,172,247,178,234,118,167,109,231,179, - 22,239, 36,145,245, 7,209, 93, 45,192, 93, 47,188,231,217,160,150,119,124,219, 93,222,122,111,225,211, 90,147,166,169,237,184, -186,177,188, 77,229,178,135,225,245,245, 53, 69,150, 83,229,183,100,165,161,106,182,196,131, 1,141,177, 60,130,251,247, 31, 80, -230, 25,174,235,114,124,124,138,112, 92,110,111,175,187, 66,200,177,136,106, 47, 32, 12, 67, 38,147, 9,171,205,102,239, 81,150, -142, 2,229,112,120,124,196,252,230,150,231, 47, 95, 16,250,246,107,117, 85,237,253,224,189,157,209,116, 7,121,239,173,230, 78, - 46,121,239,131,239,179, 3,250,196, 49,189,223,151,131, 82,111, 11,182, 61, 38,246, 14,133,173,191,142,246, 89, 48,251, 67,187, - 44, 75,170, 14,101,236,185,106,143, 20, 54, 2,194,208,239, 86, 65, 45, 66,180,251, 67,176, 79,203,155,205,102,123,193,229,229, -229, 21, 39, 39,199, 60,124,240,152,213,118,195,252,230, 10,223,181,212,187,158, 82,231,251, 62,239,191,255, 62,131, 65,100, 45, -139,142,251,238,247,215,154, 61, 78,214,113, 28,202, 70, 91,255,186,227,236,121, 0,187,221,206, 38,177,101, 25,223,191,120,110, -159,211, 78,179,161,219, 78,191,210,229,208,111, 54, 59,155,136, 41,157,253,228, 98, 54,157, 50,157,205, 24,196,241,158, 2,169, -187,100,206,193, 48, 38,242,237, 10, 69, 96, 8, 2, 23,215, 17,148,165,182, 88,234,213,130,166,169, 57, 59, 61,230,213,171,194, -142,164,117, 77,109,218,142, 56,103,105,146, 70,223,181, 31, 66, 16, 68, 72, 9,111, 46,175, 73,211,132,179,211, 99, 30, 61,122, - 0,237,132,229,114,201,118,181,162, 72, 83,142,142,103,124,250,163,223,229,244,232,128,155,235, 57, 89,178, 97,211, 52, 40,215, - 97, 50, 59,100,118, 48,197,245, 60,178, 34,103,177,174, 81,158,178,220, 15,217,157,143,216, 41,162,157,208,212, 29,168, 71,190, -147,239,208, 39,242, 25, 99,136,162,208,174, 29,179,212,178,248, 75,187,138,203,139,180,187,238,254,254, 51,189, 95,209, 93, 92, - 92,241,230,226,138,243,235, 5,133,121,198,124, 83,176, 45, 12,149, 17, 76,143,207, 72,138, 26, 93, 55,148,217,142,182, 17,132, - 82,160, 90,137, 82,130,112, 16, 81,227,144, 26, 23, 89, 25,218,170,194,241, 36, 82,128,214, 64,124,192,229,214,240,145,152, 82, - 58, 37, 55,229,142,229,250,150,188,216,226, 68, 49,179,201, 4, 71,197,180,218,177,217,236, 69,193,102,151, 88, 54, 54,134, 42, - 45,187,253, 86,109,133,110, 64, 37, 21, 42,112,112, 66,139,160,244,125,159, 56,240,105, 2, 65, 20, 14,112, 28,143,108,152,217, - 28,230,166,161, 72, 19,234, 70,179, 73,172, 48, 45, 24, 12, 80, 12, 40,179,148,180,168,201, 77, 13,198,197,108, 75, 28,225, 19, -196,167,212, 77,105,241,169,173, 1,109,199,229,214, 71,106,112, 29, 15, 63,136,209,117, 97,237, 30,216, 16,148,205,110,135,227, -214,132, 40,118, 73,198,110,151, 48, 26, 14, 64, 57,248,174, 79,107, 50, 68,255, 50, 45, 11,242, 52,195, 21, 6, 69, 77,232,216, -140,233,182,177,128,129,109,150,179, 75, 51,210,186, 69,250, 3, 54,187, 28, 33, 61,164,242,236,205, 69,226, 73,141, 68,144, 39, - 9,181, 49,180,120, 20, 26,138,198, 62, 20,223,191,186,230,211, 79, 50,212,176,229,120, 58,101,117,123,137,170, 13, 89,219,242, -139,207,191,131, 96,138, 84, 62, 15,159,126,196,213,124,199,248, 96,195,106,185, 97, 50, 59,229,102,190,230,122,190, 97, 19,228, - 44,231, 11, 26, 83,239, 15,204,190,203,112, 66,135, 10,143,139,203,107, 62, 28, 29, 33,195, 49, 87,219,156, 18,151,193,100,198, -166,154,243,213,179,231,196,183, 75,138,170,182,132, 49,215,161, 41,106,218, 22,188,120, 68, 28, 70,100,233,142,163,179, 7, 8, -233,176,222,110, 25,140, 70, 24,108,241,112,122,122, 15,211,128, 80, 46, 38,181,169,113,142,215, 69, 43,214, 26,215,113,246,193, - 32,109,107, 59, 50, 37, 4,253,214,179,109, 91, 92,207,239,224, 33, 37, 85, 81, 19,249, 46,227,192,199,115, 5,138,154,199,247, -102, 32, 90,194, 40,166, 54, 45,141,145, 36, 89,193,205,237,146,166,204,173,178,215,117,152,231, 5,243,249,156, 74,219, 93,113, - 86,116,193, 38, 82, 90,225, 81,211,224,133, 17,225,112, 72, 89,100,236,210,132,214, 88,177,154, 31, 69,120, 97,132, 64, 81,119, - 56, 81,187,127, 85,184,174,221,111,214, 45,160,186,206,218, 88,252,164, 49,221, 72,190,235,214,123,194, 90,159,106,101, 11, 45, -103,127, 16,220, 29,179,171,238,112,221,163, 73,239,136,180,250, 67,221, 24,131,234,186,103, 99, 96,183,219,225, 41, 27,121, 42, - 60,219, 25,246,137,106,129,223,191, 0,197,126,100, 44,101, 69, 84,191, 37,205,221, 21, 88,221,165,227, 69, 81,244, 14, 84,231, - 29, 70,120, 28,144,101, 41,207,159, 63,103, 60, 30, 50, 95, 46, 88,173, 23, 56, 82,112,114,114,130, 20, 45,167,199, 71,100, 73, - 66,154,151,180, 40,226,241, 1, 82, 89,113, 85,239, 15,119,186,149,208,100,124, 64, 89,150,204,231,243, 14, 83,219,210,120,205, -126,207,219,199,120,166,233,142,166,133, 93,146,161, 60,143, 52,207,216,237,118,124,248,254, 7,252,244,167, 63,229,226,252,156, -139,139,139,119, 14,116, 43,131,180,207, 88, 43, 4,178,203, 87,247, 29,151,186, 59, 32,122,102, 65, 16, 88,177, 84,221,232,253, -247,216,239,220,109,161,166,247, 69,152, 16, 98,159,211,238, 58, 86,143, 80,105, 77, 16, 5,123,126,124, 95,188,105,109,240,253, -128,241,193,140,186, 46, 17,170,195,179, 42,144, 10, 48,134,164, 11, 45, 2,200,171, 18,157,165, 12,194,136, 90,151,140, 70, 99, -118,187, 29,175,158,191, 98,155,110,169,155,106, 79, 57,108,219, 22,175,242,216,213,197,222, 7,239, 40,241,110, 49,215,190, 43, -182,148,221,181, 55, 29,150,185, 63,136,143,142,142,246,235,162, 48, 12,105,193,250,183, 59,141,129, 35, 21,203,249, 2, 93,183, -239,104, 84,238,221,187,103,167, 47,181,157,168,248,174, 75,154, 52, 56, 66, 50, 30, 15, 81, 74,178,238,166, 9,101,153,226,168, - 8,163, 43, 92, 37,144,162,165, 44, 50,238,223, 63,227,242,252, 13,233,118,195,201,201, 25,173, 80,228,185,205, 5,233, 19, 0, - 93, 55,236,214, 19,138,249,220,166, 99,254,232, 71, 63, 32,207, 18,110,174, 46,184,190,188, 34, 73,182, 60,125,239,177,101, 4, -248, 62,111, 46, 94,147, 23, 59,222,127,255,125, 78,142, 14, 25, 68, 33,187,245,142,182, 49,104,211, 34,154,130,166, 49,196,126, - 0, 50, 66,186,150,165,160, 77,205,170, 44,113, 28,143, 97, 60,176, 43,212, 93, 66, 93,175,112, 28, 65, 94, 86,104, 93,209, 52, -245, 91, 62, 65,211, 34, 29,251,190,247, 60,143,245,102, 75,145,151,164,153, 21,118, 86, 69, 73, 89, 55,208,108,222, 33, 70, 10, - 33,113,254,246,239,254,142,239,158,151,140,167, 16,207,102,156, 61,124,196, 39,199, 15,248,171,191,251,103, 94, 95, 95,161, 17, - 40, 39, 0, 36,174,178,221,115,154,110,104,105,136, 85,200,237,114,197,193,200, 37, 12, 20,186,209, 4,194, 90, 31,178,188, 70, - 3,187,172,161, 50, 30,206, 96,202,193,217, 61,188, 81, 72,154,207, 41,170, 5, 77, 91,147,172,230,228, 73, 78, 93,105,138,218, -166, 58, 29,204,142,152, 78, 15,168, 76,195,237,124, 65,224, 91, 78,118,169, 27,138,178,198, 13, 3,134,131, 33,117, 85,225, 9, -133,114, 36, 77, 89, 99,116,133,233, 31, 54,105,213,166, 71,167, 39,164,217, 14, 35, 36,111,174,111, 49, 90,227, 7,138, 32, 26, - 34,101,203, 40,112, 40, 11, 77,158, 72,100,109,152, 14, 71,148,153,198,117, 61,140, 73,217, 37, 27, 90, 37, 17, 82,163, 43,141, -160, 67,129,202,144, 56,116, 41,139, 4,164,176,213,185, 23,208, 52, 53, 81,108, 3, 70,226, 56, 38, 75, 83, 92,215, 33,165,197, -147,146,201,200,238,119,134,177,207,201,212,167, 78,230, 28, 31,140,173,144, 43,219,145,164, 57,243,237,150,210, 72, 50, 13, 69, -179, 36,111, 90, 60,111,192,104, 52, 97, 89, 45,104,187, 17,160,163,192, 81,138,182, 5,227,120, 20,101,131,240, 34,134,177,207, -171,171, 57,255,252,111,159,241,159,255,242,143,120,254,234,130,161, 47,241,253,128,245,205,150,219,197, 10, 34, 69, 48, 24, 49, -154, 28, 32, 49,124,243,236, 21,105,178,101, 16,134, 60,249,240, 19,116, 85, 91, 49,218,193,113,103,139,178, 59,195, 65,215,241, - 40,165, 72,139, 28,127,116,200,139,203, 57, 6, 72,202, 6,237,120, 60, 63,191,160, 21, 46, 31,124,252, 3,242,162, 66,119, 66, - 53,132, 96,155, 21,196,113, 72,139,100,147,165,132,126, 72, 89, 85, 24, 83, 16, 68, 3,162, 40, 98,177, 90, 18,134,118, 23,219, - 10, 24, 70, 33,152,183,108,241, 32, 8,208, 18, 60,199, 78,134,132, 77,246,232, 96, 31,134, 86, 89,242,150,235,123,164,157,208, -173, 44,114, 34, 79,241,240,222,125,126,250,233, 39,124,240,248, 33,131, 64, 17, 7, 10, 41, 90,226,193,136,186, 17, 20,117,205, -235, 55,215,252,243,207,127,193,213,237,130,193,120, 66, 85, 85, 44, 87,243,142,140, 53,182,130, 50,229, 16, 13, 6,111,199,221, -104,198,227, 17,179,131, 9,219,245,134,162, 42,187,224, 21, 31, 71,186,208, 64, 90,164,100, 73, 2,166,101, 56,140, 25,141, 70, -123,172,104,159,192,213,239,196,251, 14,207, 30,220,111,185,225,186, 49, 68,234,237, 78,243,238, 46,253,183,201,102,125, 23,120, - 55,117,235,110, 26,151,253, 53,237,126, 34,224,186, 62,109, 99, 19,232,250,176,153,254, 64,246,187, 60,116, 27,118,242,246,197, -222,171,159,251,206,191,167,158,245, 93,252, 94, 1,221,249,159,123,209, 89,191,103,204,202, 28,221, 54,228,235, 37,135,199, 71, - 20, 69,134, 16, 45,179,217, 33,163, 65,204,102, 61,231,228,244,136, 42, 31,178,217,165,120,126,140,112, 93, 90, 28,218,214, 48, -159,223,114,124,120,184, 31, 51, 71, 81,196,225,204,102,216,187,174,107,119,234,142,191,191, 46, 61,226,180,105, 26,178,162,220, - 23, 64,143,187,252,235,197, 98, 65,210,221,163,187,236,254,190, 11,170, 59, 75, 97, 43, 4,230,142, 0,240,110, 54, 64, 63,153, - 40,138, 2,217, 57, 41,180, 53, 18,237,239,131, 49,134,186,122,187, 42,218,103, 9,116, 66,190,190,115,235,105,132,131, 40,218, - 39,152, 25,211,139,136, 5,134,186, 91,141,217,123, 94,228, 5,203,229,146,250, 81, 77, 20, 69,148,165, 93, 35, 68,126,192, 87, - 95,189,228,201,147, 39,140,199,246,243,235, 41,171,203,145,242, 45, 61,208,212,154, 93,189,123,235,150, 64,188,147, 1,223, 23, -132,162, 7, 33,185,206,219,159,235, 10, 55,173, 53, 71, 71, 71, 12,135, 67, 30, 60,120,192,225,225,225, 94, 43,176,218,110,246, -194, 81,173, 53,203,229,106,159,107, 80,150,118, 21,227,251, 62, 85,153, 18,196, 97,167,107, 10,136,195, 16,199,177, 17,185,190, -239, 34,101,132,146, 13,101,158, 82,215, 33, 94,215,229, 15, 6, 3,254,242,191,251,239,249,223,254,247,255,149,179,123,167, 72, - 97, 89, 2,121,158,226,121,150, 15, 31,117, 5,215,237,237,109, 7,220,241, 72,146,142,108,233, 57, 60,124,252, 30,183,215, 23, -172,215, 91, 62,251,229,231, 28,204, 38, 60,121,248,144,147,147, 19,182,235, 21,207,159,125,135,231,121,156, 29,159,240,244,201, -189,142,227, 32,216,238, 82,222,220,220, 80,228, 14,194,113,153, 78,199, 86,228, 91, 27, 43,104,212, 45,198, 5, 41, 92,130, 32, -100, 60, 18,108,210,132, 93,154,189,163, 75,233,159, 1,215,117, 41,234,146, 40,138,222, 34,172, 3, 43, 28, 44,125,155, 71,239, - 72, 69,219,233, 30,236,196, 45,196,153,175, 74,222,255,104,196,195, 39, 31, 18,142, 14,168,164,207,213, 42,193,143, 2,188,157, -139,231,248, 20, 90, 35, 29, 1,178,165,172, 50, 28, 37, 80,194,161,214, 57,101,150,211, 86,154,180, 76,113, 29, 75, 42,242,131, - 16, 7,151,192,149, 44, 23,115,190,250,242, 11, 74,173,201,171, 12, 67,202,225,212,227,242, 50,231,230,250,134, 97, 16,113,122, - 58, 37, 12, 99,142,143,143, 57,156,157,160,156,128,217,236,136,127,252,231,159,145,239,182, 28, 28,159, 82,232,150,176,149,232, - 72,146,151, 21,201, 70,227, 72, 73, 45, 74,242,221,214, 2, 71,218, 5,202,113,105, 16, 56,202, 99, 48, 26, 19, 68, 33,159,252, -232, 83,251,208, 10,129,112, 90, 26, 37, 40,165,131,112, 97,151,111,240,253, 16,119, 60, 64,105, 73, 82, 23,232,182,166,174, 51, -226,161,162,206, 75, 90, 1, 69, 9,121,105, 24,142,142,241,188,198, 42,148,219, 26,161, 4, 69,145, 33,165, 3,194, 86,148, 85, -163,113, 20,148, 69,130, 82, 80, 85, 5,158, 47, 45,156,197, 85, 84,101,134,164,102, 20,251, 44,183, 13,202, 52, 28, 12, 7,148, -169, 5, 58, 36,105, 97, 65, 26, 26,242,214, 65,184, 1,101, 99,111,250,241,209, 17, 77, 85,179, 89,205, 25,198, 19,178, 60,237, - 94, 10, 2,161, 20, 82,185,228,181,193,147, 62,191,252,252, 43, 62,121,114,202, 79,126,248,148,124,183,162, 41,180, 93,169,184, - 62,165,110,209, 21, 93,120, 2,132,225,152, 58, 41, 40,112,237,143,186,230,131, 15, 62, 38,240, 45, 19,124,190,156, 83,153,148, - 36, 41, 89,101,183,232,214, 88,177, 83, 85,146,100,118, 68, 40,148,131,227, 5, 12, 38, 49, 66,186, 52, 66, 82,232,110, 7,236, - 5, 20,117,101,213,236, 69,137,231, 6,248,129, 71,101, 90, 12, 86,136,164,117, 67,189, 75,112, 93,139,129,108,104,193,104,202, -220, 62,224,227,241, 24, 73,251,142,184, 75, 58,160,140,162,165,217,139,104, 20,118,140,219, 51,224, 45,160,194, 97, 48,136,153, - 12, 98,102, 7, 99, 36, 21,129, 27, 18,122,214,178, 84, 23,153,157,186,168,144, 56,244, 41,178,132,182,177,135,234,243, 87, 47, - 40,138,146,217,108,214,141,210, 28, 76, 91,218,180,166,166,193,152,114, 31, 6, 51, 25,199,221,135,121,199, 98,181,222, 31, 36, -170, 5, 71, 56, 4,158,207,116, 58,230,241,195,251, 93,177, 81,239,163, 92,211, 52, 37, 45,236,184, 90, 98,171,110, 21, 4,251, -206, 60,203, 50, 92, 71,237, 5,110,182, 67,125,155, 75, 14, 80,102, 54,178,184,236, 68, 94,123,250,151,182,135, 77,208,141,189, -251,195,168,105, 26, 76, 93,221, 25, 7, 55,123, 69,114, 95,100,248,190,191,199,101, 22,105,182,183,179,217, 64, 20,203,152,239, -217,249,150,194, 86,117, 73,102,110, 7, 34,169,247,190,250,190,235,205,243,156,193, 32,162,174,114,180, 46,112, 61, 15,104,121, -248,240, 1,215,215,215,180, 24, 30, 63,126,200, 34,114,136,124,159, 56, 8, 16,142,100,187,203,144, 52, 68,131, 49,174, 31, 80, -230,214, 58,228,121, 54,136, 69, 25, 99,243,182,203,146,203,203, 75,170,218,174, 23,214,235, 98, 31,250,209,103, 2,140,199, 99, -206,175,174, 41,180,166, 53,134,123, 39,167, 84, 69,201,205,205, 13,227,225,136,167, 31,124,192,213,197, 5,151,151,151, 20, 90, -227, 73,137,231, 56,148,157, 69, 45,232,132, 96, 82, 74, 54,203, 21, 77, 85,239, 83,212,154, 78,253,189,191,151,216, 38,163,213, - 93,225,217,173, 45,106,211, 96,132, 21,223, 1,228,121,214,165, 10, 70,232,238, 90,141,135, 67,132,144, 8, 33,187, 81,182,100, - 48, 28,113,125,157, 33,165,193,119, 61,242,220,162,100,253, 32, 36, 47, 75,222, 92,158,115,118,118,134, 84, 46, 97, 52,224,243, -207, 63,195,113, 28,158, 63,127,206, 39,159,124,194,167, 63,252,148, 36,177, 97, 46,195, 40,222, 3,141,130,208, 90, 11,191,251, -238,187,189,138,255,174,237,170,135, 24,249,142,107, 1, 58,190,131, 23,248,123,128,141,211,133,147, 68, 97,136,235, 90, 38,255, -237,237, 45, 87,215,215, 0,172,119,219,119, 0, 69, 96,247,231,190, 23, 80,118,162,187,104, 16, 51, 28,197,236,118, 59,134,113, -220, 69, 44, 43,110,110,175,186, 0, 30,197, 54, 91, 17,250, 46,185, 41,144,162,197,119, 20,187, 36,229,124,185,224,255,254,191, -254, 79,254,240,167,127,192,249,249, 57, 85,173, 49,166, 98, 58,157,114,123,187,160, 49,243, 14,114,100, 39, 32,174,114, 24, 13, - 6,251, 8,230,241,104,192,124, 62,199,247, 3,218,214,176,219, 46,121,115,241,154,171, 55,111,248,209,167, 63,224,222,189,123, - 54,215,190, 46,217,110,215, 96,236,115,236, 7, 33, 39,131, 3,226,113,200,171,215,151, 20, 85,193,108, 54, 99, 20, 15, 16, 66, - 49, 8,109,238,189,174,106,104, 29,164, 8, 40,203, 29, 7,227, 3, 54,155, 13,190,107,133,141,111,181, 46,214,127, 46,148,203, -122,155, 16, 15,172,232, 84,183, 45,231,151,151, 28, 29,204, 56, 60, 58,230,222,201,137, 21, 16,119,248,234,241,120,130,243,167, -127,254,135,248, 97,132,150, 14,155,172, 96, 91,230,188, 58,191,100,177, 90,114,112, 56,229,118,181,197,180, 13, 45, 22,109,169, - 48,180, 82, 32,187, 74,189, 71,114,182,186,165,109, 90, 28, 89,163,148,131, 16,146, 32,240,248,226,251, 11,110, 22,255, 5, 35, - 36,143,158,222,227,127,250, 31,255,140,195,163,128, 42,127,143,205,122,197,116,120, 72, 20, 13, 72,118, 25, 89,150,227,168,128, - 32,136, 88,175,231, 28,205, 38,188,120,241, 2,217,182,184, 93,221,168,117, 77,150,164, 84,117,131,163, 4,187,245, 53,158, 43, - 58,113,200,196,194, 74, 16, 24, 33, 9,194,136,213,118, 5,173, 61,184,116, 31,178,209, 85,158, 70,106,252,145, 71, 85, 45,112, -219,152,113, 48, 34,144,146, 42,221, 34,196,142,166,117,240, 35, 65,154, 23,196,131, 24, 33, 61,118,201,134,237, 38, 97, 50, 28, -227,184,138,182,238, 66, 92, 26,141,214, 85,231,123, 6, 93, 55, 84,141,217,143, 32, 93, 87, 17, 69, 33,141, 46,168,138, 29,142, - 20, 76, 71, 51,222,124,187, 38, 80,138,233,112, 72,150,101, 8,199,165, 49,138,101, 90,178, 91, 36, 84, 90,227,226, 34,125,104, - 27,236,139,195,113,137,218,246,181,122, 0, 0, 32, 0, 73, 68, 65, 84,253,200,222, 72,169, 48, 66,129,116,108,158,110,107,215, - 4,181,105, 17,173,228,111,255,233,103, 12, 7, 1,247, 78, 14,216, 20, 13,175,175, 22,228,165, 65, 69, 30,186,195,189,186,174, - 3,181,225,114,190, 33,221,189,102, 48,140,240, 29,151,193,116,198,225,209, 12, 17, 12,136,198,118,103, 94,214, 27, 76, 99,153, -223,121, 35,184,221,164, 93,180,164,178,137,101,194,122,136,155,170,162,105, 13, 77,151,210,213,182, 22, 33, 42,148, 77,132,107, - 5, 52,186, 5,209,118,126,106,235,137,221,119,158,162,235, 18,238, 36, 91, 73, 41, 81, 93,183,211, 98, 48, 13,221,248,217,170, -177,165, 20,123,129, 92,139, 65, 52, 10, 83,234,142, 69, 46,208, 85,205,235, 87,207, 56, 59, 12,241, 30,223,103, 54,116,104,245, -219,221,171, 20, 46,210, 21, 68,129,223,209,218,118,251,176, 21, 59,255,148,251,100,166,126, 44,106, 21,168, 14,180, 26, 33, 91, -142, 14,173, 98, 55,203, 19,150, 75, 43, 32, 27, 6, 3,104, 37,174,235, 48, 30, 13, 8, 92,135,180,195,218,238,118, 9,181, 54, -251, 16,144,134,246,157,221,116, 89,148,239, 8,176,250,142,174,239,182,123,170,220, 93,241,213,221,238,175, 63,216,239, 30,252, -119, 49,175,191,221,241,223,237,252,251,238,223,122,243,251,175,147,239,220, 15,249, 91,191,111,223,213,245, 26,140,254,247,234, -227,109,123,171,212,254,123,166,161,210,182, 32,204,202, 12,173, 13, 89, 89,128,176, 97, 47,182,139, 75,153, 76, 38, 76,196,160, -139,126,245,145,110, 75,163, 75, 2, 79,145,165, 5,215,215,151, 76,167, 83,188,208,219,167,218,197,113, 76,182,120,235,158,232, -167, 6,246,229, 55,102, 58, 59,228,106,190, 64, 72, 27, 13,218,163, 81,251, 23,234,205,205,205,254,154,250,189,240,175,170,186, -232, 75, 65,161, 53, 65, 24,188,163,114,239,255, 94,117, 93,239,149,204,119, 39,135,253,247,113, 55, 21,237,238,125,232,239, 89, -255,223,125,177,114,119,117,209, 63, 43,113, 28, 83, 85, 59, 28,199,166,148, 13,135, 67,148,116,247, 12,133, 40,138,168,171,134, -213,106,181,239,252,139,162,224,250,250,154,147,147, 19,210, 52,225,205,155, 55,232,178,218, 91, 16,149,180,130, 45,207,177, 1, - 89,178,243,220, 59,242,237,247,210, 63,107, 66, 73,178, 50,223, 79,148, 44,112,198,186, 84,242,206,221, 48,153, 88, 88,203,110, -103,221, 10,181,105,246, 35,240,182, 19,255, 29, 28, 28,112,116, 60,227,250,234,150,178,202,169,138, 18, 37, 36,113, 28,117, 29, -108, 69, 89,212, 72, 90, 92,215,161, 46,115,124,199,225,244,244,148, 34,143, 9, 67,159,139,215,231, 76, 15, 38, 24,109,245, 6, - 69, 81, 88, 33,228,119,223,163,148, 69,106,103, 89, 70, 81, 86,184,174,143,114,253,189,237,238, 46, 79,127,189, 94,219, 85,192, - 32, 2, 99, 45,105,117, 93,115,179, 88,240,175,255,242,115, 30, 63,121,200,251,239, 61,193,159, 76,216,174,231, 36, 73,137, 82, -246,154, 81,215,248,174,207,239,124,244,148,219,249,154,111,190,252,181,197,207, 14,167, 76, 70, 99,170, 35,203,198,208,186,161, -200, 10,116,109,181, 94, 31,127,252, 49, 55, 55, 55,182,160,233, 38, 99, 86,236,233,236,255,189,172,242, 61, 75, 95,107,205,106, -187, 65,157,159,115,117,121, 65,158,102,140,199, 99, 14, 14, 14,168,170, 26,231,163, 31,253,144,243, 55,151,124,249,213,111,216, -230, 53,211,227,123, 52,173, 97,157,164, 24,199, 90, 5,236,230,184,127, 40,187,189, 93,219,210, 24,216,102, 57,219,172, 68,181, - 6, 85, 27, 28,101,104,218,146,214,177, 15, 81, 20, 40,106,211,128, 99,168,117,198,116, 26, 35,154,130,216, 15,112, 70, 83, 94, - 60,127,205,225,236, 4,144,108, 86, 9, 66, 22,248,126,193, 63,253,203,207, 80, 78,192,237,237, 45,141, 1,215,139,112,130, 8, -215,117,112, 68,133,116,193,247, 92, 14,238,159,118, 12,220, 22,229, 57, 8,116,183, 79,135, 2,144,202,165,110, 26,139,159,236, -118,129,117,247,194,106,100,139,206, 19,154,166, 37, 48, 21, 59,145, 32,234, 26,161, 51, 38, 35,129,239,199, 28,157,156,241,253, -243,207,168,170, 37,227,201, 17,174, 55, 34, 12, 70,184, 65, 72,154, 37, 72,169,112, 3,133, 35,216,103,221,182,216, 23,135,106, - 12, 90, 27,156, 46, 17, 75, 8,129,209,246,225,140, 3,135,201,208,130, 50,146,221,150,225, 96, 96, 21,198,141,173,188, 39,195, - 17,117,227, 32,243,154,178,177,106, 91, 71, 42,155, 14, 37,109,247, 68,219, 80,245,106,104,169,208,128,233,136, 87,162, 5, 35, - 92,158, 95,220,242,245,203, 11,166, 39,103,228, 77,201, 42,173,169,112, 9, 29,151,182, 85,182,211, 83,146,172,110, 88, 37, 25, -203,229, 26,103,187,181, 10, 95,207,227,105,249,100, 47,220, 88,172,150,172,215,235,253,139, 59,235,196, 28,116,127, 95, 28,207, - 22, 23,173, 85,161, 55, 77,139,234, 2, 82,238,142, 49,239,114,205,189, 46,171,251,183,161, 37,125,238,183,166,179,102,153,198, - 14, 3,187,151,111,211, 58,160,236, 62,175,109, 91,104,236, 78,178, 7,173,220,141,191,204,243, 28,169, 43, 60,183,133,255,159, -174,247,106,174, 35,203,178, 52,191, 35, 92, 93,191, 18, 0, 65, 77, 38, 35, 35,114, 82, 84,138,202, 18,211,221,214,253, 50, 79, -253,191,171,103,108,102,170,103,170, 50, 35, 69,100, 72,106, 2, 4,112,181,235, 35,230,225,184, 59,192,204, 26,154,209,194, 64, -144, 8,192,197, 57,103,239,189,214,183,188, 32,141, 52,179, 73,132, 22,129,143,175,188, 64, 40,129,241,225,160,152,164, 49, 90, - 7, 43,153, 47, 75,154,174,197,121,133, 19,130,174,237,208,113, 50, 90,179,154,166, 35,142, 37, 93, 87, 99, 90,139, 82,146,211, -229,146, 72, 74,234,186, 36, 73,166,228,105, 70, 89, 7,224,197,114,182, 68, 96,168,171, 35, 77, 83,245, 21,241,109, 94,251,176, -208, 15, 31, 71, 74, 35, 17, 24,239, 62,157,137,107, 53,162, 84, 15,135,195, 56,163,214,113,220,199, 87,138, 79,212,243,131, 85, -110, 56,100,142,155,185,151,224,233,149,182,183,155,139,179,208,118,237,168,105,161, 98,140, 96,117,136,219,175, 33, 37, 82,235, - 16,193, 10,193, 39,110,123,132,177,214,212,253,193,103, 88, 69,236,157, 77,237, 80, 22,120,194, 65, 38, 74, 2, 59,187,174, 67, - 71,234,104, 90,118,187, 13, 89,127,255,166,147,140, 36,210, 76, 82,141,212, 10,227, 13,109,221, 34,147, 41, 58,146,236,182,135, -144, 43, 46, 28, 81, 20,198, 6,211,217,132,245, 54, 84,139,105, 26,247, 27,180, 14,239,100,207,142, 87,253,193, 49,209,183,156, -245, 56,142,241,214,177,223,239,153, 78,167, 60,127,241,130,203,203, 75,174,183, 91,242, 36, 65,234, 80,213, 38,195,129,110,176, - 18,246,246,182,182,109,199,124,117,217,183,166,181, 84,227, 70,238,189, 71,184,240,123,184,215,183, 30,120, 17,222, 61, 17,226, - 52,133,208,163, 40, 82, 8, 65, 62,157,135,240,147,214,144, 79,115,154,155, 61,222,220,182,252, 27, 27,218,254, 69,213, 96, 28, -148,213, 49, 84,160,139, 5, 74, 41, 14,135, 61,223,126,251, 45, 63,249,252,115, 22,171, 37, 95,125,247, 23,182,251,221, 45,218, -216, 88,170,162,164,173,107,222,237,110,152,229, 83,234,182, 65, 18, 10, 39,132, 27, 89,240, 90,107,212,112,184, 27,242,216,123, -215,145, 55,183,226,200, 97,220, 17,216,245,201, 40,178, 27, 42,254,121,223,249,153,207,123, 38,128,130,155,245, 21, 15, 31, 62, -100,186, 92, 98,108, 75,113,216, 83, 55, 37,166,105,130,141,119, 58,101,187,190, 33,141, 53,235,171,107,156,115,172,111, 54, 56, -107,120,248,240, 33,127,249,203, 95,198,131,208,225,176, 69, 69, 73,159,194,167, 56,150, 53,137, 80,196,113,132,167, 68,169,208, -125, 56, 30,143, 20,197, 33,180,187,179, 24,156,165, 53, 30,231, 21, 66,198, 28,203,134, 31, 94,189,197, 26,207,139,207,158,115, -118,255, 1,199,125,136,105, 53,206, 17, 71, 41,142,134,213,234,148,231,207, 30, 49,203,167,188,251,112,193,126,189, 97, 58, 63, -225, 71,207,159, 81,221,191,207,119,223,125,199,225, 80, 48,159,207,121,255,254, 61, 81,172, 48,109,139,183, 22,211,191, 47,222, - 90,234,254,125, 30, 4,165,117,213,246,207,155,160,107, 45,219,237,150,223,252,242,151, 92,188,123, 79, 87, 55,152,166,197, 27, -139,254,250,219,215,108,247, 7, 44,138,108,146,224,122,127,164, 3,154,166, 70,201, 8, 45,193,154,192,118,118,222,227,173,165, - 19,146,198, 91,138,214,112,232, 28,169, 74, 72, 0,225, 45,149,233, 23,230, 44,167,168, 67,172,167,243,142,237,241, 64, 99,131, - 0, 68, 89, 77, 93,213,124,247,237, 91,182,219, 48,255,217,239,142, 8, 29,209, 54,134,111,190,125,137, 16,138,123,247, 31, 48, -201,103, 68, 73, 74, 58,153,144, 78,242,176, 16,244,194, 33,211,180,216,206, 81,183, 93, 95,201,216,190,122, 83,104,233, 57, 22, - 59, 58,227,168,218,142,182, 87,212, 58, 31, 22, 60, 35, 60, 62, 82,196, 58, 6, 39, 66, 43,187,110,152,166,158,166, 52,188,249, -254,134,207,158, 63, 35, 18, 25, 69,221, 98, 90,133,214, 73,104, 43,215, 62,216,243,154, 3,105,154,160,227, 80,245,117,198,224, -189, 25,115,160,141,181, 76, 38, 57, 90,201, 0,199, 16,130,249, 98,202, 60,139,144, 62,180, 10,139, 34,240,148,207, 86, 39,148, - 85, 67,158, 42,158, 61,121,202,236,164,225,245,197,154,215, 31,174,232,202,138, 40,201,194, 11, 93,213, 76,226, 32,168,176,117, -139, 20, 14, 33, 29,194, 15,181,109,239, 69,150, 9, 42,154,243,187,175, 95, 17,231, 11,132, 86,188,254,120, 67,231, 21,201,209, -224,164, 70, 71, 9, 78,132, 5,186,168, 43,148,142,152,205,103, 36,177,102, 58,155,145,102, 57, 55,155, 53,187, 99, 65,213, 25, -208, 17, 66, 10,156,177,120,173,137,251,150, 81,104, 67,106,144, 10,133,234,149,225,125,133,233, 61, 18,112, 61,157,203, 1,206, -152, 49,179,251,238,156,113, 16,124, 13,191,198,121,221,157, 77,234,118,134, 28,254,159,206,153, 81,221,141, 15, 8,207, 1,120, -145,164, 9,221,126, 79,228, 29,211,233,140, 7, 15,150,252,232,249, 19,206,239,173, 80,190, 67,223,129,180,120,103,198,217,148, - 16,130,162, 42, 33, 10, 54, 24, 99, 45, 94, 69,120, 17, 22, 0, 29,167,253,220,180,101, 54,153, 96, 91,129,119, 13,137,142,200, -167, 25,113,164, 88,204,102, 76,242, 21,105,154,227,108,216,192,195,172, 86,144,104,133,109, 3,186,117,168,188,135, 10, 61,138, - 34, 18,173, 70,244,107, 8,224,104, 63,169,184,135,170,238,174,216,106,168,242,194,230, 30,141,215,212, 24,131,240,140,201,114, -195, 47,173,245,232,189, 31, 15, 66,119, 14, 2,109, 99,130,248,106,252,220,109, 12,107,211,184, 79, 14, 98,195,159, 15,223,211, - 80,145, 15,247,112, 84,225,223,185,135, 97,174,218,161, 98, 77,156,102, 92,175, 55, 84,101, 77, 20,107,202,227,129, 15, 31, 46, -121,246,248, 33,145,210,236,214, 27,166,179, 9,147, 52,235, 29, 5, 2,239, 45,157,169,200, 39, 65, 64, 85,215, 13, 55, 55, 21, -203,229,201,104,119,155,205,102,163,207, 63,136,221,130, 32,247,120, 60,146, 78,242,177,227,146,197,201,173,195, 66,235, 48,110, -236, 59, 14, 3, 19, 32, 82, 18,169, 85,159,206, 5,105, 28, 17,165,201,232,199, 86, 66,253, 77,103,100,248,237,250, 13,252,110, -222,248, 93,229,251,232, 74, 24, 46,143,112,227, 72, 36, 73, 18,170,170, 30,163, 88,189, 20, 28,171,146, 40, 86,228,147, 25, 18, - 75,115, 56,112, 60, 30,105, 27,243, 73,215,160, 44,195,188,118,121,182,192, 57,131,137, 99,138,226, 24, 90,219,179, 25,207,158, - 61, 67,190,127, 55,186, 20,164,146,156,156,156,160,148, 24,163,140, 7,161, 95,107,186, 94,144, 26, 14,211,178, 15,252, 25,126, -226, 16,246, 21,198, 55,147, 36, 37,207,243,158,215, 62, 99,190, 88,140, 90, 28, 99, 12,251,226,136,115,142, 60, 75,216,237,118, -212,117,133,142, 36, 95,124,241, 5,147,108,202,239,255,240,101, 80,244, 75,207,110,189,193,217,142,211,229,146,171,143, 23, 56, -103,153,207,167, 28,118, 27,166, 39, 15,104,154,134,229,242,132,170, 42,240, 54,208, 3,219,182,229,242,242,146, 40, 78, 80, 42, - 28,136,210, 73, 76,148,165, 97,108, 32,250, 49,137,237, 48,166,237,187, 43,205, 88, 13, 91,227,209,145,166,109, 26,144,138,197, -242, 4, 37, 97,191,223,242,205,247,223,211, 90,203,231,159, 61,229,241,163, 7,108,110, 46, 41,251, 88,214, 36,138,104,235, 10, -156, 39,139, 36, 95,188,120,198,110, 91,112,189,222,241,234,135,111,152, 47, 79,248,252,243, 31,179, 90,173,120,243,238, 45,247, -243,115,222,125,120, 59, 6, 23,133,184,217,240,238,151,101,137,185,147,219,112,247,112, 39,132,160,147,146, 63,255,249, 43, 86, -243, 57,243,249,156,213,106, 21,222,235,155, 67,197,213,245,142,235,205,158,237,254, 64,237,160,234, 12,243, 76, 49, 95,157,176, -217, 30,192, 13, 37,186, 12,255, 33,180,121, 13,154,155,170,229,195,190, 36,149,158, 84,134, 42,218, 43, 11,186,165,244,154,123, -207, 95, 48, 91,158, 81,119, 5, 82,117,124,245,221, 43, 98,225, 16,181,165, 57,214, 44, 23, 79,104, 59,104,182, 45,219, 93,131, -138, 29, 85,217,112,255,209, 11,170, 42, 40,212, 27,179, 69,104,193,164,158,112, 42, 79,104,170,109,111, 19,211, 56, 27,194,226, -147,222,146, 51,155,205,136,163, 4,223,163, 18,213,218,209,180,134, 88, 57,186, 56,208,208, 24, 54, 92, 4, 85,231, 48, 77,135, -111, 29,145,181,204,243,132, 71, 15, 86,156,158,196, 56,223,177,187, 57,160,125, 76, 85,214, 56, 95,145, 53, 21,214, 67,219,173, -137, 83, 69,156, 8,170,174, 64,121, 23, 88,202,222, 33,133,194, 75,133, 71, 6,148,165, 76,200,146,184, 7, 87, 40, 34, 41,153, -230, 83, 86,171, 37,217,116, 70,221,116,100,147, 41, 19,173,120,249,254, 61, 74, 75,178, 56,230,122,127,160,171, 43,154,178,164, -117,146, 12,201,177, 42,123,128,129,194, 26, 71,231, 29, 17, 10,229, 29, 18,143,116,142, 0,155, 20, 8,169, 73,243, 19,126,248, -240,142, 78,125,133, 16,130,235,235, 53, 90,197, 68,113,129, 80, 26,213,131, 46,226, 56,166,110, 67,144,134, 78, 98,238,157,159, -241,224,209, 67,234,182, 97,123,216,178, 61,108,131, 34, 27, 79,219,118, 56, 99,232,172, 37, 77,110, 55, 30,235,192, 15,184, 85, -231, 17, 30,172,233,240,206,226, 76,176,177, 72, 66,118,182, 21,224,100,200,228, 14,109, 92,129,119, 14,255, 87, 41,101, 1, 85, -249,169, 88, 71, 8, 17,190,119,229, 71, 69,174, 31, 44, 85, 10,252, 64,238,210,161, 42,139,227,148,121, 18,177, 92, 78,195,252, - 44,137,136,164, 64,218,176,193,122,111, 65,200, 59,112, 11,249, 73, 5, 38, 84, 16, 44, 69, 82,142,173,187, 56, 14,226, 81,215, -221, 82,218,146, 56, 35, 77,130, 77, 47,146,138, 73, 26, 42, 70,143, 96, 62, 13,252,104, 79, 80, 4,135, 44,239,142, 40,137, 64, -170, 81,232,213,222, 17,147, 73, 41, 41,155,186, 23,104,245, 51, 90, 60, 22,143,232,175,199, 80,141, 12,155,209, 93,218,215,221, -182,176, 20,242,111, 14, 3,220, 25,109,220,110,220, 65,159, 97,189,165, 49, 93,120,167,117,132,190, 99,197, 50,198,208,245,157, - 23, 92,251, 9,244,166,109,219, 49,150, 18,232, 51,212,109,111, 3, 44,123,241, 96,175,176, 23, 2,132,166,110, 58,142, 69, 77, -221,152,192,115,111, 29, 85,217,114, 40, 42,234,186, 97,181, 90,241,238,245, 43, 16,142,243,243,115, 92,225,144, 82,145, 79, 4, - 8, 9,194,177, 88,204, 48,166,165,169,236,136, 47, 77,211,148,229,114,217, 19,190,162, 94,212,231,123, 75, 88, 61,142, 79,100, -103, 70,235,150, 19, 33,159,125, 16,186,238,118, 59,222,189,123,199,242,100,197, 79,239,159,243,250,245,235,176,113, 73, 56, 84, - 53,247,239, 61, 24,245, 3, 1,179,122,107,103,131, 16,187, 25,174,185,251, 27, 76,239,221,235, 63, 32,128,101,172, 71,122,225, -144,126, 54,159,205,168,235,134,195,225, 48,110,242,187,221,129,173,220,115, 54,207,209, 82, 35,220,145,226, 88,208,116,150, 36, -201,250,249,124, 69,148, 36,196,198,132,131,175,247,161,101, 93,150,188,123,251,150,197, 98,198,143,159, 62,231,124,121, 50,134, -182, 32,111, 15,103, 85, 85,241,234,213, 15,163, 5,113, 56,152, 13, 63,159, 16,158, 40, 9,137,133,147,222, 74, 39, 9, 10,255, - 52,186,141,156, 45,138,130,205,118,203,205,205, 13,175, 94,189,162, 40, 10,132, 86,125, 56,208,173, 72,212,116, 1,171,252,147, -159,172, 48, 93,195,119,223,126,224,183,127,255,143,156,223, 59, 37, 86,138,135,143,238,243,252,217, 35, 62, 94,188, 39,203, 18, -166,147,251, 8, 33,121,246,236, 25,171,213,138, 23, 47,158, 83, 28,142, 92, 94, 94,242,143,255,252, 25,255,242, 47,255,194,253, -243, 7, 60,121,242, 12,135,228,207,127,249,154,237,254,200,211,167,207,232, 12, 33, 10, 53, 78,241, 46,140, 78,133, 16,200, 72, - 99,241, 52,166, 67,197, 19,166,243, 37,182, 11,142,149,162, 44,144, 42,164,171, 93,223,236,120,253,250, 53,255,244, 79,191,229, -193,249, 9,147, 56,166,109, 26,132, 15,174,164,214, 20,253, 97, 79,112,118, 58, 35,203, 18, 62,222,172,169,155, 35, 58, 86,172, - 78, 23,100,121,194,245,213, 21,139, 30,114, 21, 42,244,219, 81, 70,211, 52, 60,232,153,245, 3,222,120,112, 20, 4, 42,161, 32, -235,137,123,187,253,134,188,204,120,240,224, 1,250,223,127,255,103,182,219, 45,173,245, 40, 29, 49, 63, 57,101,145, 36,188,123, -255,145,183,239, 47,200,146, 20,172, 67, 56,217,207,157, 4, 14, 25,112,118,202, 81,152,142,235,227,145,200, 25,180, 9, 51,117, -132, 65,167, 17,141, 87, 44,207,238,113,114,239, 33,157,171,177,166,224,229,171,119, 52,251, 45,139,104,206,249,234, 62,101, 93, - 4,112,133, 15,130,169, 36,202, 80,177,224,233,139,123,108, 54, 27, 46, 63,126,196,138,208, 90,181,214,147, 38, 25,171,229, 50, - 0, 23,132, 34,138,114,148,138,198,246,238,160,188,117, 46, 44,130,249,227,135,163, 5,199, 11,137,214,225,226, 57, 47,130, 39, -222,120,254,248,229,159, 40,170, 45,159, 61,123,198,175,126,254, 99, 94, 60,187,143,148, 53,215,235, 43, 54,187,130,123,167, 39, -188,191, 40,120,251,230, 61,157,191, 4, 29, 81,213, 71,116, 44,176, 88, 92,215,129,183, 36, 74, 18, 71, 10, 41,116,104, 81, 34, -113, 34, 84,166,145, 18,164,145, 66,251,154, 68, 26,126,241,249,143, 56, 91,253,138,206,121,202,174,225,216, 84,148,155,146, 15, - 31, 47,137,179, 25,141,147,188,121,243,134,139,203, 45,214,121, 60,190, 71, 88, 58, 98, 21,147, 78,250,116, 44, 29, 13, 94, 22, -240, 2,217, 87,155, 14, 69,231, 4,173, 79,105,137,185,216, 4, 2,154,119,142,217, 52, 70, 11, 25, 84,244,174, 79,197, 18,142, -188,127, 49,133,244, 28, 14, 59,222,188,121,133,138, 35,170, 58,216, 42,164, 86, 97,190,220,129,143, 34,226, 52,165,105,186, 48, -103,117,161,194,150,138,126,204, 96, 49, 38, 40,141,233,249,228,178,111,159, 75, 33,145, 3, 60,197,121, 92,207, 91,191,187,105, - 15,155,209,255, 95,229,174,148,194, 71, 30,111,236,184, 9,122, 9, 66, 6, 0,172,242,130, 8, 69,219,186, 81,248, 21,254,125, -192,179, 90,211, 32,124,139,165,223,172,148, 6,161,194, 34,172, 36,113, 58, 33,201,114, 68, 31,225,105, 92, 25, 34, 90,117,207, - 40, 63,134, 10, 6,235, 41, 11,131,166, 67, 45,131,251, 65, 75,232, 76,176,208, 68,113,131,142, 34,230,139, 25,121,158,115, 60, -238,192,215, 68, 58,184, 73,140, 15,237,236,193,202,162,123,138,216,128,130,237,122, 21,252, 48,199,180,125,126,243,112,173,134, -191, 55,136, 7,239,138,232,238, 42,150, 7,188,231,221, 17,135,115, 14,217,179,219,199,207, 57,255,137,122,126,140, 19, 29,191, -166,248, 4,123,171, 4, 35,103, 61,164,150,117,159, 28, 48,234,186, 30,115,204,239,138,243, 2, 72, 40, 4,231,236,247,123,234, -230,154,182, 13,235, 76, 81, 53, 52,157, 71, 74,205,118,179,231,252,228,132, 72,107,234,178,194, 25,203,160,190,200,146, 20, 29, - 71, 92,223,172,195,225, 80, 65,146,198, 88,219,177,219,109, 88, 46, 79, 70,194,217, 80,109,226, 25, 49,182, 89,146,146,198, 33, - 58,122,104, 9,183,174, 25, 41,120, 89,150,141,162, 62,173, 53, 73,150, 50, 95, 46, 40,218, 0,149,193,249, 79,244, 7,119,209, -188, 67,247,194,245, 27,228,127,116,152, 10,207,255,237,199, 81, 20,141, 22, 50,121,103,196, 33,101,248,122, 1, 11,219,245,157, -132,176,206, 84, 85, 67,150,168, 79,220, 13, 89, 22, 54,245, 65, 57,222,244, 63,155,148,146,233,100,130, 86,112, 56,236,200,178, -132, 60,205,192, 58,190,251,230, 27,118,187, 29, 78,220,118, 89,194,230,173,195, 33, 39, 73,251, 3,112,176,160, 57, 99,105,186, - 26,217, 42, 14,135, 3,254, 46,152,199,123,108, 27,172,128,211, 60,167, 40, 10,226, 36,225,225,195,135,227,104, 66, 88, 69, 93, -151,216,174,233, 15, 69, 9, 73, 18,196,153, 87, 87, 31,131, 3, 67,107, 54,219, 27, 30, 61,122,200,118,125,205,215, 95,253,153, -231, 79, 31,115,122,186,226,234,227, 37,222,245,194,236, 56,163,107, 45,111,223,190,229,242,195, 5,135,195,142,255,245, 63,255, - 39,234,186,230,203, 47,191,228,127,255, 63,255, 47,242,233,156,243,243, 7, 28, 14, 7,190,252,195, 31,153, 78,231,252,252, 23, -191,164,170,250, 53,202, 7,232,207,112,207, 3,126,215, 7,161,173,212, 72, 97,131,159, 92, 70,232, 40,197, 90, 67,211, 58,254, -245,127,126,201,111,127,243,107,158, 60,186,143, 38, 66,171,132, 88,105,146, 88,178, 92, 6,178,157, 51,146, 60,159,242,197,242, - 41, 55,187, 35,151, 55,107, 60,138,229,242,132, 52,141,249,252,179, 31,227,189,167,232,121, 11,109,219, 6, 38, 65, 63, 18, 8, - 21, 59,159, 28,246,157,115, 56,211,178,143, 35,180, 16, 92, 92,190,103,189, 94,243,231, 63,255, 25,189, 59, 52,100,179, 19,114, - 25, 84,219,105,154,225, 85,120, 8,242, 52, 14, 27, 69, 64, 79,244,109,162, 8, 60, 72,169, 16,210,146,229, 25, 34,150,136, 86, -226,132, 7,169,112, 61,152, 37,203, 50, 50, 61,165,110, 74,202,250,128, 22, 45,177, 52, 68, 50, 34, 85, 57, 77,213, 98, 69,135, - 76,131,232,105, 58,153, 32, 85, 76,162, 68, 88,152,147, 9,247, 31, 61,189, 93, 4,186, 22, 37,166, 72, 26, 82, 21,226, 80,227, - 40, 69,104,213,251, 36, 13, 93,211, 6,165,166,112,104, 29,225, 92,131,116, 22, 77, 88,192, 20, 45,222,120, 76,107,168,155,134, -245,118,195,147,243,148,159,254,167,191,227,139, 31, 61,197,214,123,142,219,151, 68,145,101,154, 74,210,108,202,189,135, 15,200, -166,167,252,251,159, 94,242,251,175,191, 69, 88,141, 17, 13, 77, 27, 54,207, 88,197,204, 39, 9, 89,154, 96,234,138,253,225, 72, -139, 69,147, 16,101, 83,138,170,196,209,145, 0,146,138, 4,184,191, 92,179,221, 21,236,143, 37,173,141,121,245,250, 53,219,195, - 62, 44,210, 58,226,102, 87,132,202,163,171, 81, 42,197,120, 9,210, 35, 93,192,153,202, 56, 65, 69,221, 39,192, 18,225, 28,120, - 27,148,182,206,227, 93,196,245,118,135,149, 49,135, 22,140, 83, 76,210, 41, 66, 6,207,191,150,146,178, 58, 98, 76, 71,150, 36, -156,223, 59,237, 31,170,154,166,169,248,120, 85,133, 83,162,150,225,185,192, 5,239,168, 14,209,151, 67, 53,230,156,195, 15,254, -117, 21, 54, 23,172,193,117, 6, 21,197,253,162, 20,188,228,182,179,183, 12,121, 25,102,183,194, 11,156,236,217,224, 74,224,135, -135,214,249,177,194,177,253,200,196,139, 32,150,243,222,245,149,117,223,190, 86,183, 28,238,206, 89,172, 17,184,190,179, 52, 84, - 45,101,233, 17, 98,142,150, 2,107, 90,160,235,125,183, 6,173,195,156,220,247,139,227,168,220,246, 33,104, 65, 20,183,109,175, - 99, 81, 97,140, 37,141, 19,178, 56,195,116, 53,145,134,184,175,232,135, 13, 98,104,151,101,147, 8, 41,116, 16, 6, 58, 71, 93, - 85, 8, 27,194, 55, 54,219, 29,199,178,198, 11,152,207,231, 97, 3,237,127,254, 0,141,241,159, 84,116,195,134, 58,250,150, 91, - 51,110,230, 67,187, 88,107,141,113,127,187,185,223,229,194, 15, 93,137,168, 79,189,194,203,176, 1,245,234,247,187, 27,144,148, - 18,231,123,123,157,138, 63, 33,210, 69, 73, 16,149, 77, 38,147,241,231,141,227,120,140,166,221,239,247,227,247,157,101,217, 40, -146,178,214,134,206, 80, 23,225,188,162,172,250,136, 88, 20,157, 13,144,171,174,117, 92, 87, 91, 30,222, 59,114,178, 58,227,250, -230, 35,219,237,158, 52,203,168,203, 42,132,103,244,241,160,135,195,129, 40, 74,122, 88,201, 17,173, 18, 14,135, 29, 74,199,204, -102, 57,117, 29,196,101,173, 53,168, 62, 33,114, 28,101,120,168,250, 17,216, 96,139, 26,230,235, 81, 20,113,239,222, 61,214,219, - 13, 85, 83, 51,159,207,233,156,229,226,226, 2, 45,251, 14,197, 29, 74,220,208,101, 26,237,109,198,192,157, 77,125,104,241, 15, - 99,150,178, 13,215,194,221,105,219, 7,205,146, 29, 71, 76, 67,247, 99,240,204, 71, 50, 25,255,189,233, 42,136, 52,145, 78,152, - 77, 21,141, 9,227,130,206, 26, 92,255,236,236,247,123,230,147,108,164,239,133,118,245, 50,180,155, 35,205,253, 39,143,120,115, -241,158,111, 95,189, 14,100,196,254, 89,107, 76,135, 57,118,108, 14,187,113,132,114,247, 89, 50,166, 35,205,179,240,142,218, 64, - 43,140,117,232, 88, 68, 82,141, 66, 56,231, 28,166,239,222,228,121,206,116, 58, 37,205, 3,236, 37,192,213,220, 24,161, 42, 37, -188,122,245, 3,101, 89,112,118,118,134,109, 91,186,186, 1, 23,144,203,187,249,132,147,211, 21,211,105, 72, 0,204, 92,120,246, -179, 44,227,205,219, 87,236,143, 7, 86, 39,171, 0,222, 57, 57,227,205,187,139, 49,112,231,226,226,130, 15,151, 87,236,247,225, - 89,121,247,238, 29,243,121,192, 5, 15, 93, 47,221,199,171,118,198,208,118,134,206, 4, 75,242,108,177,100,185, 92, 6, 0, 85, - 91,147, 78,102,188,152,159,176,217,108,248,225,229, 7,118,187,130, 23, 79, 31,176,154, 47, 72, 98, 25, 82,228,222,191,225,209, -163, 71, 20, 77,205,122,191, 9,174,159,201,140, 39, 79, 31,112,179, 61,242,242,205, 15,220, 95,157,209,181, 33,105,241,176,219, -115,117,117, 69,211,133,119, 72, 75,133, 64, 97, 76, 55,186, 41,248,107, 30, 4,176,221,220,224,173,227,199, 47, 62, 11,107,207, -217,249, 61,206,207,207,169,170,138,143,215, 55, 61,215,186, 96,191, 59,144,102, 25, 66, 4,229,120, 72,141, 20,224, 61, 14, 63, -158,122,195,248, 39, 40,152, 67, 59, 77, 98,173,196,182,150, 44,113, 28,247, 59,148, 78,208,145,196,212, 29,208, 34, 91,135,158, -167,184, 16,110,133, 7,182, 69,129,106, 90, 28, 7,162, 56,163,109,143,204,103, 75,108,175, 36,197, 58,142,173, 9, 16,129,178, - 65,171,144,192,100, 93,133, 78, 98, 84,127,232,240,194,225,188,195, 26,139,115, 6,165, 34,172, 7,103, 28, 78,180,184, 58, 44, -240,219,253,161,111,203, 73,210, 36,162,170, 15,236,247, 27,164,175,145,177, 68,170,240,247, 90,219,130, 18, 44,166, 25, 63,121, -241, 24,165, 5,203,179, 83,182,197,134, 63,125,245,103, 78, 22,247, 57, 59, 59,227,233,195, 7,196,145,226,221,235, 55,252,229, -155,239, 40,171,142,116, 58,229, 88,119, 97,163,240, 26, 39, 60,138, 20,227,107,222, 95,109,248,127,126,255, 39, 94,127,188,102, -146,196, 24,161,241,206,144, 36, 41,109,103,185,186,186, 2, 20,113,146,132,106,174,117, 68,241, 64, 18,171, 49, 93, 67, 26, 75, -202, 54, 16,205, 68,223,190, 22,125,197, 30,212,240,132, 77, 79, 7, 8,135,138, 82,238,157,223,167,173, 42, 16, 30, 21, 75, 76, -217,161,163,224,159, 95, 44,130, 2,255,216, 71, 16, 78,103,147,158,190,149,160,122,171,206,112,130,239,186,142, 93, 93,147, 39, -179, 32,208, 49, 97, 33, 83,189, 80, 70,222, 9,242,240,120,156, 5, 99, 3, 63,221, 99, 81,178, 39, 85,221,177,100, 41,237,145, - 34,234,147, 83, 36,222,135,191, 23, 20,231,195, 34,103,111, 43, 77, 99,113,158, 16,149, 41, 2,137,207, 24, 75,219, 25, 90, 99, -113, 94,225,157, 10,104,221,126, 65, 13, 49,170, 53,177, 16,100,113,255, 72, 59, 79,212, 87, 68,194,121,232, 25,247, 90, 74,138, -210,160, 39, 2,235, 5,120,133,210, 49, 74, 74,210, 84,113,118,118, 74,219, 26,156, 21,100,145, 68,234, 48,195,236,186, 46, 28, - 32, 85,159, 57, 62, 73,232, 76, 77, 85, 31,113,166,229,120, 44,233, 26,199,116, 49,231,209,163,135,124,184,188,166,172,171,177, -170, 12,108,104, 57,122,121,109, 47, 96,243,214,245, 28,238,112, 13,189,135,206, 90,164,214,180, 67,128,134, 53,100, 81, 54, 58, - 61,198, 42,177, 15,230,208,119,194, 92,134,131,195,120,104, 16, 67,133,110,198,143,251,109, 38, 92, 59,211,144,250,232, 19,120, -205,208,142, 31,126, 13, 98,191, 65, 41, 29,199,113,255, 28, 26,172, 15, 7, 56,235, 65, 9,133, 80,154,253,161, 36,155, 77,241, -125,158,184, 16, 2,169, 99, 34, 17,192, 48,194,116,108,182, 71,126,242,217,115,182,219, 61,135,195,129,201, 36,197,212, 21, 54, - 82,224, 19, 22,243, 41,235,245, 22,112, 1,115,219, 90,242,229,164,111,193,211,179,232,117,216, 96,202,146,198,118,108,183, 33, -237,207, 89,131,233, 90,182, 85, 57,142,114,150,171, 5, 74,135, 77,102,146,103, 1, 78,148,133,214,244,116,154, 51,155, 77, 17, - 2,222,189,189, 64,137,144,254, 35, 69, 16,120, 13,215,118,128,180, 4,158, 63, 72,125,171,248, 31,103,235,125, 66,160,115,142, -214,134,103,211,249,112,159,135,231, 59,207,115,156,191,213, 92,180,214, 96,170,208, 61, 72,227, 8, 91, 55, 72, 15,117,111, 75, - 28, 70, 31,101, 29,192, 73,171,197,156,235,235,107, 38,105,152,113,215,166,195, 88,207,195, 71, 79,248,230,219,191,176, 63, 22, -252,250, 55,191,161, 51,134,203, 94,237, 63,153, 77,145, 62,116,137,166,147,148, 67, 17,248, 10,117,219, 34,188,199, 11, 65,164, -117, 96,231,119, 29, 73, 18, 19,167,209, 56, 54, 80, 74,145,196,201,232,179,159,207,231, 40, 41,153,207,102,156,157,158,246, 49, -166,113,176, 56,118, 53, 90,247,136,218,221,129,253, 62,220,227,187,182,203,151, 47, 95,242,244,201, 35,158, 63,127,206,199,139, -247,188,122,245, 10, 29, 41,206, 78,239,225,144, 28,139,154,175,191,251,159,193,178,153,198, 28,203,150,120,127,224,244,244,148, -166, 53,172, 55, 59,164,212, 76,166,115,218,206,208,116, 6,231, 5, 58,137,169,218,230, 19, 30,128,212,241,168,191, 48, 38, 88, - 49,227, 40, 10,252,245, 52, 97, 54,157,134,152,218, 54, 0,173,238,221,123,200,251,247,111,217,109,214, 28, 54,215,124,124,127, -194,143,158, 63,228,209,253, 19,164,210,252,240,242, 37, 58,137,137,211,132,120, 57,199, 19,178,208, 79,231, 25, 39,179,207,217, - 92,111, 88,239,214, 60,124,248,136,103,207,159,240,229,239,255,200,213,213, 21,147,105, 78, 81,214,227,218, 56,116, 90,232, 9, -143, 73, 18,145, 68, 41,229,225,192,122,187, 33,214, 81,104,195,239,118,232,251,247,206,216,172,111,216,239,247,108,182, 59,118, - 27,137, 67,240,232,124,133,117,144, 77,103,236, 15, 37,222, 9,226,108,194,219,119,111, 49,120, 98, 17,179, 92, 44,201,245, 20, - 97, 36, 74, 74,188,118, 28,154,150,174,179, 40, 37,104,125, 69, 62,157, 35,132,195, 25,135,144, 17, 82, 40,162,153,102,215,181, - 40, 25, 84,234,157,115,212,157,164, 45,107, 38,249,156, 72, 40,210, 84,211,181,129, 65,236,173, 97,146,196,124,120,123,201,126, - 26, 97,177,232, 88,245,194, 46,137, 22,138,186, 87, 90,230, 81,134,235,111, 80, 58,153,210, 25,207,225, 88,161,163,132,186, 51, -220,172,183,236,143, 69,160,156, 69, 49,231,179, 57, 69,125,228,247,127,249,129,203,245,129, 31, 61,121,200,106, 49,193,148, 21, -199,157, 65, 10,129,146, 71, 14,199,192,108,255,229,231,143,208,249, 4, 39,151, 60, 61,155, 51, 79, 83,186,166,161,109,111, 80, - 78,145,136,154,127,254,245, 23,124,245,253,107, 14,101,104,241, 74,192, 10,129, 17, 62, 32, 9,245,132, 86,231, 92, 20, 29,215, -141, 64,212, 37, 62, 59,162,176, 20,187,119,125, 92,172, 67,168, 16, 8,224,133, 10,185,238,198,224,141, 65, 96, 57,222, 92,145, -196,138,174,217,143,144, 8, 37, 35,148, 76, 64, 74,156,112, 56,107, 73,162,176,115,137,190,237,249,225,253, 59,226, 88,147, 79, - 82,186, 58,144,168,156, 51,236,139, 61,168,176,232,196, 89,218,199, 27, 6,160,222,161, 44,145, 85,152,157,214,117,195,186,220, -132,232,213, 52,193,217,142, 72,203,222,123,233, 71, 50, 84,103, 61, 40,141,239, 83,221,156,115,161,133, 36, 85,111,121, 84, 88, -231,208,125, 37, 18, 22, 59,200,178,156, 36,137, 80,113,132, 34, 10, 45,176, 62,227, 56,200,180,253, 24, 85, 57, 36, 81, 25, 17, - 44,149, 97,195, 3,231, 20,130,160, 26,247, 82,208,182, 53,145,111, 89, 46,207,216,238,143, 32, 52, 50,142, 64, 9, 58, 52,179, -197, 9,213, 97, 31,172, 78,211, 5, 87,155, 61,245,110, 77,121,216, 33,244,140,182,243,232, 36, 39, 75,115,154,186,100,154,165, - 8, 83,209, 22, 91,156, 84, 33,138,209, 11,170,178,197,123,193,177,172,209,113,134, 32,162,106, 26,188,112,160, 90,156,237, 80, - 73, 70,100, 38, 84,213,150,253,197, 7, 30, 60,122,198,124, 57, 67,151,138,178, 60,226, 92,152,163,102,105,204,122,125,236, 65, - 55, 18, 99,116, 31, 16,100,111, 55,130,166, 37, 78, 82,234,182, 9,215,194, 9,100,207, 91,255,143, 4,106, 74, 41, 68, 47, 84, - 68,136,112, 24,104,219, 64,189,178, 61,138, 87,132, 17,138,235,186,240,172, 37, 9, 81,172,130, 0,209,132,170,214,180, 29,109, - 29,168,120,117,219, 4,126, 69, 23,218,165, 42,210, 28,203,162, 39,226, 57, 84, 20,211,116, 45, 66,233,176, 72, 57,143,113,158, -174,173,177, 82,128,136, 56, 28,107,188,117,129, 14, 40, 28, 77,219,133, 81, 71,154,209,213,130,175, 95,191, 99,117,118,143, 23, - 95,124,193,219, 87,223, 82, 28,119,220, 59,201, 41,170,146,253,218,112,122,254,136,174, 49,236,118,123, 36,138, 52, 73,240,214, -210,214, 85,208, 54, 76, 38,104,149,226,253,156, 56, 14,237,254, 71,247, 31,112,220,237,137, 53,100,137,226,228,225,189, 49,216, -232,236,252, 30, 31,222, 95,178, 92, 46,111,171,111, 37, 71,197,246,239,255,240, 37,190,107,121,250,224, 28,225,125,192,144, 54, - 53,145, 82,100, 73,130,245,142, 40,138,169, 15, 7,240, 2,173,163, 62, 2, 86, 34,164, 14, 22,202, 56, 26,109, 93,198, 25,132, - 15,207,234,161,168,112, 93,232,124, 84, 85,131,117,240, 68,233, 81, 59, 81, 86,199, 16,152, 18, 71,172, 78, 22,152, 38, 99,125, -125,221,111, 76,150, 40, 9,156,128,229,124,198,113,191,227,131, 13,157,156,155,155, 27,150,203, 37,145,210,196,113,198,205,122, - 71, 89, 26,172,105,248,195,151, 95,242,179,159,253,140,255,246, 95,255, 43,151,151,151,156,156,158, 82, 28,143, 33,192, 73,120, - 78,186,150,195,110,207,118,191,227,254,189,115,102,139, 57,199,253,129,211,211, 85,216,212,251,240, 24,239, 3, 93, 47,207,115, -146, 94, 83, 48,120,213,101, 47,212,220,172,183,220, 92, 94, 83, 20, 5,223,191,122, 9,194, 35,149, 98,177, 88,112, 60, 30,199, -153,241,139, 23, 47,152, 77,114,138,227, 49,180,166,139, 2,128,197,234, 20, 47, 20,203,229,146,253,177, 64,199,154,203,205,150, -109,209,211,226,122, 86, 64,231, 97,119,172, 57,150, 45,198,135,130,242, 80,175,105,141,195, 10,201,161,170, 57, 28, 43,164,212, -227,200, 40,201,130, 10, 63, 28, 28, 5, 82,164,228,147,148,170, 56,112,221,148, 52,179, 25,211,108,194, 36,141, 33,142,136,163, - 8,107, 60, 63,126,241, 25, 93, 91,242,195,119, 95,179, 63,238,216, 22, 59, 26,251, 99, 22,243, 64,215,163,110,137, 29, 44, 22, -193, 54,103, 27, 67,158,230, 52,166,230,225,233,130,229, 52,227,195,229, 21,109, 87,241,155,191,255, 21,223,127,247,146, 31, 94, -189,230,225,195,199,236,247, 71,116,146, 34,229, 48,230, 49,125, 54,128, 27, 93, 51, 58, 78,121,242,228, 17,187,195,158, 44, 75, -208, 63,252,240, 3, 31,175,215, 40, 1,211,249,156,127,250,167,127,226,187,151, 63,176,221,237, 65,128,105, 90,148,244,232, 40, - 98, 50,137,153, 77, 18, 14,101, 9,190,195,180, 53,194,205, 49,141, 7,221,245,213, 86,140,232, 57,190,105, 22,211,182,245,173, -186, 87,134,112, 20,231, 5,149,105,113,206,144,106,141, 53, 1,237,153,166, 57, 90, 7,159,169,119, 6, 37, 5,177,146, 88,231, -168,235, 35,214, 54,148,213, 17,143,164,182, 93,200, 29,238,171,153, 94, 19, 77,211,132, 5,174,105, 13,198,149, 32, 36, 87,155, - 61, 77,107, 40,170,154,178, 49,200, 40, 6,149,226,163,136, 15, 31,111, 16, 31,133, 81, 0, 0, 32, 0, 73, 68, 65, 84,232,218, - 26,231, 44,187, 99,197,246,120,228,252,228,132,249, 36, 65, 11, 69,117, 56, 4,102,120,215, 33,180,102,189,222,178,123,115, 68, -167, 25, 89, 18, 81,155, 2,141, 71, 90, 67, 91, 91,242, 84,112,118,127,197,229,250,154,119, 31, 95, 34,162, 20,173, 52,194, 7, - 14,184,195, 82, 24, 67,106, 18,114,161,144, 73, 70,113,104,121,243,225, 18,233, 44,179, 73,204,249,217, 25, 75, 17,225,133,102, -247,242, 61,109, 83,210,161,136,100,132,210, 34,116, 29, 92, 75, 83, 59, 94, 60,188,143,140, 52,117,213,114,117,115, 67,101, 90, - 18, 61,101, 49,155,163,227,148, 99,217,112, 40,138,222,158,100, 0,135, 49, 2,211, 85, 56,111, 73, 99, 73,172, 21,182,183,194, -220,226, 40,131,141,109, 76,220,194,142,243,176,161, 13,215, 84, 53, 74, 69,227, 70, 62,204, 85,135,207, 15,128,152, 91,101,182, -238, 43,199,219,170,101, 56, 60,168, 49,210, 51, 70,245,138,250, 33, 86,116,168, 82,134, 57,239,176,161, 15, 15,184,239,145,170, -206,130,247, 34, 84, 59,206,135,108,241,126,230,251,224,209,189, 96,149,170, 67, 44, 98,215, 25, 76, 99, 89, 44, 66, 69, 23,230, -155, 14,233, 12,121, 18, 42,197,147,249,130,131,207,184,218, 53, 52,141, 5, 95,177,185,185, 98, 62,137,200, 21, 28,119,215, 36, -139, 21, 17, 49, 82, 38, 24, 47,238,204,148, 99,170,166,102, 58, 95, 32, 37,116,174,163,181, 53,162, 21,116, 38, 88,171,116,236, -121,243,230, 13,113, 18, 8,132, 67, 42,215, 93,133,187, 49, 6, 76,168,250,166,147, 28,225, 67,171,185,235, 58,148, 86,212,117, - 77,231, 12,248, 79,245, 8,119,125,227,119,231,173,119,125,233, 82, 74, 20,225,186,135,202,223, 6, 17,172,115,184,222, 79, 44, -164, 31, 99, 98,189,191, 37, 87, 13,173,233,170, 41,251,207,249, 79,114,222,187,174,163,233, 90,242,124,214, 71,119, 14, 35, 4, - 17,240,183,198, 96,189,192,184,128, 92, 69,170,192, 43, 24,146,202,165, 64,168,136, 56, 19,212, 85,197, 87,223,124,195, 63,255, -253, 47, 57, 63, 63,231,234,227, 59,210, 68,145,166, 51,246,149,165, 42, 14, 36,145, 34,139, 99,132,144, 68, 73, 70,219, 26, 98, - 29,186, 95,182,237, 80,113,194,114,177, 96,181, 90, 49,159,135,234,181, 51, 13,121, 60, 65,230, 19,206,207, 78, 57, 30, 3, 32, -231,116,181, 28, 89,232, 67, 38,246,144, 33, 62,157,207, 57, 89, 46,240,214, 81, 29, 11,226, 40,234, 9,103,114,244, 60, 87, 77, -160,163,217,254,218, 35,125, 15,143, 9,221,160, 40, 82,196,105,208,246, 52,109, 73,164,228,168,121, 80,136,113, 4, 20,190, 94, - 54,222,211, 64,191,235, 69, 82,177,186,109,243,123, 79, 85, 28,199,121,112,158,231, 65,156,234,110,245, 23, 77,221,177,190, 9, - 44,248,182,168,184,185,222,161, 35,201,102,125,195,226,227,140,213, 42,100, 44,124,247,221,119,252,238,119,191,187,147,166, 87, -147,101, 97, 20, 53,124,253,242, 88,244, 35,148,158,154,167,196, 40,240, 26,253,247,253,108, 93,246,152,216, 65,155, 96,155, 64, -155,203,243,124,212, 93,248, 62, 59,225, 46, 23,127,120,246,103,179, 25, 85, 85,241,250,245,107, 30, 63,126,204,102, 83,242,240, -225, 35,190,253,246, 91,116,148,208, 30, 2,180,169,179,142, 56,214, 72, 25,222,137, 48, 14, 9,107, 80, 83,118,125,107, 61,240, - 39, 76, 29,188,236, 87, 87, 87,129, 50,151,207,209, 42, 36, 90, 14,157, 72,239, 45, 55, 55, 87,236, 54, 55, 97,195,143, 52,117, -121,164,206,167,156,159,159,143,239, 34,177,236,137,139, 83,126,254,203, 95, 97, 76,205, 15, 47,191, 99,127, 60,240,119,127,247, - 83,206, 78, 87, 44,231, 83,154,170,102,179,217,176,154, 47,200,103, 83,180,208, 68, 2,140,112,100,105,196,143,158, 61,226, 88, -213,220, 92, 93, 16, 39,154, 71,143, 30,113,117,189, 38,203,178,128,250, 53,166,199, 74, 71,227, 1, 60,140,197,160, 44, 43,246, -199,146,217, 98,133, 82, 22,253,225,114,205,233,249,138, 7,247,206, 67, 20,231,124,129,117, 1, 40,211,118, 29,211,105, 66,170, -131,226,114, 54,159,209, 52,167,228,213, 4,107, 3,108,222,123, 79,103, 27,156, 55, 1,101,167,130,253, 72, 71,114,100, 85, 11, -225, 71,251,145,148, 42,248,152,123, 63,181,237,111,158,148, 18,221,167, 13, 5, 53,100,135, 86, 18,111,250, 25,147,181, 68,217, - 20,131,194, 19,230,154, 82, 74,156,109,199,135,199,218,219,164, 36,107, 61,198, 28,105,218,208,190,107,141,163, 54, 6,161, 52, -169,214, 56,235,168,186,150,182, 42,192, 25, 58,103, 40,235,130,237, 97,203,199,235, 43, 78,151, 75,150,121,142,176,134, 52, 73, -168,235,134,166, 61, 80,153,150,206,187,112,147, 15, 21, 71,235,144, 62,248, 38,179,124, 66,170, 52, 85, 19,232, 78, 54, 12, 30, -105,188,193,245,186,132, 32,242,113, 28,143,123,218,174,196,250,160,132, 94,229, 19,164,239, 72,123, 63,123, 85,215,120, 20,206, - 52,104,161,136,181, 10,200,195,182, 38, 17,142,231,207,158,241,191,124,241, 25,105, 18,113,255,254, 61,226, 56,229,229,171,119, -252,219,239,126,207,135,139,107,234,226,192, 34,142,144,174, 67,216, 22, 73,211,123,232,131,204, 49, 75,116, 32,255,201, 16,230, - 49,188,100, 67, 24,196,144, 65, 62, 68, 40, 14, 51,194, 65,229,123, 27,220,225, 63, 81,245, 14,127, 62,188,164,195, 60,235,174, -119,252,238,166, 50,120, 94,239,182,111,135,182,115,215,117,227,166,255,215,191, 6, 11, 93, 89, 23, 97,158,236, 61,130,224,132, -208, 74,135, 44,109,231,209,145,162,173,246,204,242,156,235,203,151,100,178, 69,235, 96, 17,137,132, 35,142, 20, 77, 85,146,106, - 29, 66,111,132,160,117,146,221, 97, 79, 89, 85,116, 74,115,179,190,162,115, 10,193, 12,225, 59,158, 61,122,202,179,251, 39, 92, - 92, 93,178, 46,106, 90,211,129,212, 68, 81, 88,104,157, 49, 65, 24, 25, 39,129, 89, 94, 20, 8, 61,140, 20,250,182,181,247,120, - 4, 69, 81, 80,245, 28,249, 1,203, 58, 64, 80, 66,181, 22,160, 19,131, 96, 45,116, 75,106,218, 54, 40,134,227, 40, 69,120, 57, - 98, 77,239,194,101,194, 49,247,214,166,118, 87,252, 54,108, 20,105,220,199, 26,223, 17, 36, 58,231, 48,222,225, 4,119, 68,122, -225,192, 52,204,228,135,251,157,231,121,127,120, 16, 33,132,133,176, 65, 75, 41,137,133,164,107, 45,173, 53,163,165,203, 59,209, -223, 95,139,245,224,133,186,195, 22,184,213, 74,136, 17,110, 21, 52, 26,235,155, 45, 31,175,215,252,226,139,231, 56, 91,179,217, - 92,177, 92,173,112,214,176,189,185, 98,154,207, 67, 4, 41,138, 56,209,212,117, 59, 30, 48,235,166, 68,123,199,124, 62,103, 58, - 11,126,237,227,241,200,241,102,207,231,159,127,206, 87, 95,253,137,247, 23, 33, 4,230,226,227, 21, 85,211,142,239, 66,211, 43, -179,117, 15, 8,170,154,174, 39, 48,134,192,148, 56,142,169,187, 22, 25, 73,166,243,156, 44, 79,169,109, 67,231, 76,152,139,123, -139,183, 62,116, 43,251,123,225,177, 8,233,209, 81,200, 83, 72,250,231, 70,120, 27, 80, 47,206,224,108,215,255,215, 80, 20, 33, -208,106, 20,252,154,112, 72,170,171, 0,194,153, 78,167,148,101,216,236,119,219,117, 47,148, 11,226,191,123,247,238,241,253,247, -223,179,152,205,136, 98, 53,178,252, 67,214,188,102, 54,155,179,223, 29,185,184,184,224,252,252,156, 39, 79,158,240,167, 63,253, -105,212, 71, 76,122,254,252, 32,216,186,185,185,161,105, 44, 81, 36, 80,253,252,221, 9, 79, 36,111,197,145, 66, 8, 84,223, 50, -246,222, 83,217, 14,219,133,119, 90, 56, 40,218,154,201, 98,198,201,217, 41,247,239,223, 15, 57,236,139,249,168, 53, 24,186, 71, - 0,215, 87, 87, 0,252,195, 63,252, 3,223,124,243, 13, 15, 31, 62,100,187,221,134,205,174,110, 67,160,147, 20,104, 17,128, 64, -169,214,148, 93, 77,162, 36, 15,206, 78,121,247,230, 21,190,235,144,206,129, 53,216,174,197,212, 53, 58, 17, 36,113, 68,154,164, -227, 1, 34, 86,122, 44,224, 90,199, 56,206, 24,198, 77,117,219,210,117, 27,140,179,228, 89, 15,255,210,241,136,227, 61, 57, 89, -177, 60, 89,208,154,142, 15,239,223,112,121,121, 21, 14,125, 58,226,176, 63,128,179,193, 22,110, 44,146,144, 23,239,149,100, 50, -155,226, 9, 45,255,248, 52,165,172, 58,172,219,176, 88,204,250,220,138,138,186,109,145,242,214,146, 26, 14, 31, 49,122,158,112, -115,181,230,234,122,131,233, 60, 73, 26,161,127,253, 15,127,207,217,217, 25,206, 57,190,125,249,154,175,190,254,134, 77, 47, 70, -153,228, 57,214,122,116, 63, 63,243,206, 48,205, 51,102,211,201,104,129,112,109, 67,219,167, 76,141,138,207, 30, 1, 40,101, 80, - 27, 7,193,147,191,179,168,247,169, 50,226,214, 47, 27,245,115, 63,103, 77,184, 73, 50, 14,121,200,214,133, 86,190, 19, 68,105, - 70,103, 66, 53,209, 30,139, 32, 42,194,211,182, 69,127, 3, 12,214, 24,132, 12,202,238,178,170,195, 12,190,110, 81, 81,130,150, - 2, 79, 8,148,111,235,118,100, 92,235, 40, 38, 17, 17,206, 89,106,211,240,113,123,224, 88,214, 92,165, 49, 39,243, 37, 75, 20, -206, 7, 11,156,237,179, 49,170,166,161, 42, 14,252,232,225, 35,176,134,124, 62, 35,203, 50,138,170,229,195,197, 37,157,237,152, - 77, 83,246,199,166, 87,118, 75,148, 36,180,169,156,197, 89, 75, 93, 89, 44,176,152,133, 88,200, 88, 69,196, 42,204,245, 78,151, - 57,171,211,115,126,254,139, 95,242,239,127,248, 35,111,222, 93,112,118,190,228,231, 63,249,123,206,207, 86,164,145, 70, 41,193, -245,199, 75,182,155, 53, 15, 31, 60,226, 31,255,225,215,252,248,199, 47,248,243, 95,190,229,205,219,247, 52,198,246, 96, 30,131, -117, 10,157,196,128, 35,142, 99,150,203, 57,121,158,179,223,239, 71,188,231,221,141,121,168,200,134,151,123,200,139,190,187, 1, -123,239, 71,255,228,221, 54,239,176,169,123,239, 3,213,234,110, 40, 70,255, 12, 12,149,249, 93,159,243, 93,129,217,240,245, 7, - 37,238, 93, 59,214,248,172,169, 94,239,225, 92,128,171, 12,220,255,225,244, 31, 50,181,130, 32,169, 58,114,125, 93,240,252, 65, - 16,196,165,145, 34, 75, 3,105, 78, 68,193,235,110, 93, 71,215, 25, 58,175,177, 94,176, 61, 28,208,211,128, 54,109, 58,143, 20, -142, 68,122, 30,221, 63,229,197,179,135,220, 59, 91,240,253,187, 43,222,126,184, 66, 56,200,210, 20,211,180,124,248,240,129,235, -235,235,113, 78, 87,151, 21, 58,145, 33, 89,213,218,144,163, 16,197, 72, 12,171,213,138,162,172, 70, 52,228,240,243, 15, 63,103, -146, 36,227, 61, 24, 68,120,139,197, 34, 8,246,202,130,182,173,177, 61,159,192,244, 81, 54, 22,255,233, 1, 72,200,255,112,195, - 87, 74, 65,196, 39, 31,135,138,145, 79,102,121,195,231, 66,158,122, 60, 86,113,225, 48, 37, 70, 8, 15, 4, 57,199,176,184,203, - 62,235, 25, 27, 72,144,129,228,216,139, 0, 9,162,199,144, 28,247, 41,195,254,174, 98,188, 51,134, 73,150, 33,148,224,171,175, -190,226,209,217,156, 7, 15, 31,241,229,229, 59,178,166, 65,107,133,244, 14, 37,124, 88, 28,125,176,172, 46,102, 57,214,135, 88, - 92,132, 68, 69,122, 20, 33,166,105,202, 98,177,192,249,208,225, 59, 28, 14, 1,229, 57, 13,136,208,174,235,152,207,231, 33, 49, -174, 10,138,243, 60,159,141,145,170,147,201,132,123,247,238, 33,132, 96,191,217,114,179, 94, 7,128, 77,146,112,221, 3,154,172, - 13,158,110, 29,223, 86,159,131,213, 50, 48, 37, 12, 18, 69, 36, 8,105,113,222,163,188, 71, 9,208, 82,161,189,192,244,215,249, -120, 56,208,214, 13,182,235, 53, 33,189, 53,176, 40, 10,188,189, 37,247, 13, 93,202, 80,173,103,163, 77,178,235,110, 15,217,117, - 15,140, 90, 46, 79,136,180, 68,137,148,203, 15, 31,232, 76, 16,207, 61,126,252,152,195,225, 48,162,119,111, 25, 4,221,136, 82, -221,237,118, 76,167,211,208, 69,146, 30,107, 13, 74, 74,226, 97,244,214,117,225,144,137, 24,227, 84, 21, 34,140, 65,100,128,254, - 44,151, 75,238,157,158,113,114,118,218,139, 43,163, 17,223,219, 52, 13,235,245, 58,228,175,199, 49,255,229,191,252, 23,126,243, -155, 95, 49,159,207,249,227, 31,255, 56,206,192,119,219, 53, 73, 58,193,119, 93,208,193,104, 73, 36, 64, 57,135, 22,176,156, 77, -201,180,198, 69, 22,103,187,254,221, 11, 72,217,229, 34,231,209,249, 61,156,211,116,238, 86,208, 55, 4,255,120, 25,214, 54,213, -111,236, 81, 52, 25, 49,199,195,245, 87, 74, 65,213,224,188,231,176,223,246, 99, 50,195,201,201, 25,219,237,150,139,143,107, 38, -147, 41,211,124, 78,146,102,152, 46,232,105,218, 58, 40,219,189, 12, 7,117,173, 37, 40, 77, 28, 37,172,166, 51,154,174,183,173, - 10, 63, 10,143,247,251, 61,182, 79,156, 12,208,159,208, 25,205,210, 5, 73, 28, 24,240,214,117, 65, 67, 52, 93,174,248,254,245, - 27,214,235, 53,101,219,113,181,217, 82,119, 6, 75, 88, 76, 7,234,145,173, 58,116,191, 25, 79, 38,147,176,224,104, 69,235, 36, -222,246,173, 35,209, 11,143, 8,115,166,166, 14,167, 28, 55,120,151,149,236, 25,200,182,239,177,133, 86,106,164,194, 11,215,154, - 64,126, 75,251,133,108,191,175, 16,186, 7,153,120,112, 40,154,206, 34,123, 63,159,144, 30, 25,169, 48,175, 23,225,228, 41,164, -192,122,131, 53,150,206,184,128,182,237, 55,144,174, 53,152,174, 87,108, 91,211,207,147,131, 50, 83, 70, 26, 17, 5,196,168,181, -150,194, 56,202,125,129,245,138, 99, 85,147, 79, 82, 22,139, 57, 77, 97,185,124,255, 30,139, 37, 75, 34,214,251, 29,182,105,249, -240,241, 50, 96, 81, 13, 88, 33, 73, 38, 25, 39, 42, 98,119,188, 64,224,251,235, 18,186, 31, 18,200, 52,204,102, 51,164,206, 72, -147,132,170,106, 16,177, 34,206, 98,220, 96, 75, 51, 13,166, 17, 60, 62, 63,229,209,249, 41,143, 30, 62,228,252,236, 52,168,183, -187, 22, 45, 97,241,217, 51, 46, 47, 47,249,250, 79,127, 64,234, 32, 10, 44,139,134,105,158,114,154,101, 32, 53,155,221, 54, 84, -196,222,211,118,125,198,179,105,169, 10, 23,120,234,127,213,150, 29,124,163, 73,146,244,136,208,102, 20, 64,253,117,228,231, 93, -251,211,221,175,113,215,171, 60,186, 23,254,202,250, 51, 40,224,241,129, 65,143, 12, 15, 80, 24,198,244,148, 62,211,183,147,101, -192,234, 88,239, 66,102,119, 15,174,145, 82, 98,188,194, 59, 70, 1,167,181, 1, 52,212,182, 45,182, 13, 93,142,203,203, 75, 58, - 7,171,213,170,255,126, 60,214,120,218,178, 33,137, 99,202,227, 1,227, 65, 57,139,113,138,108,146, 83,148, 37,145,174, 88,206, -103, 36,217,132,229,124,198, 50,143,120,112,186,160,220, 94, 83, 55, 53,179, 73,224,146, 39, 50, 97, 58, 73, 88, 46, 18,102,249, -132,147,229,138, 39,143, 90, 28,138,124, 49,167,115, 21, 93,107,177, 38,240, 20, 22,211, 64,196,243, 94,176,222, 4,209,214,112, -136, 25,210,164,226, 94, 76, 52,153, 76,144, 82,142,115,197,233,116, 26, 32, 51,166,163,171, 91,250,163,234,208,184, 70,139, 91, -133,178,151,129, 11, 32, 21, 61,122,149, 48,227,239, 79,215,157,105,254,198,250,134,184,205,108, 31,252,178,206,216,158,148,219, -195,135,250,205, 60, 84, 49, 10, 37,123,162, 88, 15,189, 9, 57,218,224, 92, 32, 79, 58, 47, 66,246, 2, 42,136,125,122,212,170, -115,119,188,242,222,253, 77,196,235, 32, 90,138,164,230,234,242,130,127,253,127,255,141,255,246,159,255,145, 23, 63,254,130,195, -113,199, 34,203, 72,227, 4, 33, 20,203,213,156,174,179, 84,117,203,124,182,164,105, 59, 58, 27, 54,121,169, 53,222, 91,138, 62, -237, 47,159,102,196,201,125, 14,135, 3, 73,146,141, 99,166,160,129, 16,100,214,115,113,241,113,140, 63, 29,236, 21, 77,107,104, - 59, 75, 54,153,178, 88, 45,105,154,134,221,113,135,232, 97, 53,111,223,190,238,109,124,106,204,205,150, 90,125, 18,162,227,173, -161,107,106,188,109, 57, 30,246, 68,189, 85, 76,122, 16,222, 35,123,225, 93,164, 4,139,105, 62,110,172, 0, 93,107, 57,186, 18, -223,251,201,245, 29,167, 68,224,233, 79,199, 77,254,112, 56,240,225,221,123,102,179, 41, 85,211,112, 44, 75, 22,243, 48,187,110, -219,154,105,190, 24, 35, 72, 77,231, 56,236, 3,229,236,183,191,253, 45,151,151,151,228,121,222, 31,120,196,152,182,182, 94, 95, -179,219,237,152,205,102,212,101,197,195,251,247, 66,199,168,159,165, 15,247,107, 72,251,139,180, 26,109, 90,198, 24,108,103,198, - 3,227,182,217,241,205, 95,190,102,189,221, 80,150,197, 72, 78,187,123,192, 75,251, 88,219,235,235,107, 86,171, 21,175, 94,189, -226,167, 63,253, 41,139, 69, 8,193,178,109,199, 44, 75,153, 79, 50,230,243, 41, 89,154,178, 94,247,135, 74,225,249,236,197,115, - 54,155, 29,219,237, 22,132, 34, 74,147,160,107,202,178, 48,118,116,146,213,108, 21, 24,245,235, 27,140,235,152,231,225,122,149, -101, 57,118, 46,165, 86,196,105, 18, 70,190, 77,208,174, 8, 41, 57, 22,123,202,182, 66, 9, 65,148, 36, 92,221,220,144,166, 9, -206, 43,162, 56,231,195,197,154, 44,205,185,127,186, 36,210, 49,117, 85,162,227, 0,168,170,170,146, 40,154,114, 60,108, 57, 57, -187,135, 80,176,190,185,102,117,114,143,231,143, 31,112,216,238,152, 77, 39,225,123,152, 36, 84, 85,245, 73,226,159,148, 18, 21, -197, 76,231, 17,211,201,132,182, 13, 7, 63,253,239, 95,254,137,143, 31, 63,142, 64,140,237,238, 72, 89, 86, 40,209,160,180, 96, -146, 4,209,148,115,162, 79,229, 9, 94, 74,103, 67, 78,173, 18, 18,209, 87,121,119,219, 47,198,118,227, 6, 48, 16,136,194,131, -233, 62,201,142, 22, 61,164, 68,107,141,119, 45,206,182, 8, 2,169,104,187, 93,211, 90,199,108,190, 64,233, 24, 25,197, 36, 58, - 84,244,198, 56, 58, 75, 63,207,147,200,190, 77, 39,164,197,212,142,214,130, 78, 82,162, 72,224,168, 70,188, 94, 19,192,163,248, -222, 75,235, 5,216,129,100,230,131,157, 42,120, 85,130, 10,184,106,195,225,224, 88,149, 84, 77,152,189, 15,234, 94,165, 36, 90, - 71,108,174,111,248,248,241,192, 98, 17, 22,236, 56,203,136,146, 24, 29, 5,177,136, 4,156,239,147,213,250,143, 35, 1,222,118, -232,228,214, 10, 20, 9, 77, 35, 61,174,107,177,166,165,107,107,158, 62,251, 17,231, 39, 1, 78,144,167, 17,174, 62, 82,217, 14, -129,199, 74,201,197,197,123, 90, 27, 90,164,135,221,150, 67, 81,211,116, 6,143, 4, 29,177, 63, 22,168, 40,120,173,117,164,104, - 90,135, 82,146,229,114,193, 98,177, 96, 95, 20,224,111,163, 59,239,114,166,179, 44, 27, 43,178,225,164, 63, 84,226,119,125,210, - 67,123,234,175,233,112,195,169,246,238,140,120,152,135, 15,115,242,187,164,180,187,254,230,161, 82, 29, 60,197, 67,231,128,191, - 90,244,205,240,128,247,255, 86,247,243,120,215,183,185,149, 22, 36,177,228,242,195,134,168,255, 62,202,178, 36, 79, 38,224,117, -255,179, 89,140,119, 40,153,224,144,116,189,192,203, 33,232,186,134, 56, 73, 89,206,103, 60, 58, 63,227,209,249,130,211, 69,206, -205,135, 43,242, 36,225,208,116, 44,103, 83, 38,209,132, 56,210,156,157,204,121,250,228, 9,229,193, 96, 58, 73,213, 89,162, 56, -166,234, 60, 82, 88, 58,110, 43,241,182,233,152,100,249,109,176, 74,143,212, 28,210,219,134,220,236,249,124,126, 59,207,236, 9, - 95, 66, 8,146, 40, 38,142,210,241, 90,181,214,132,176, 16,217, 95,103,220,200, 1,184,123,207,198,246,123,127,128, 27,222, 93, - 41, 21, 66,120,156,187,141, 9,157,205, 66,133,106,232,198, 63, 27,248,212, 3,223,125, 56,140,116, 54,128,123,156, 0, 33, 36, - 82, 73,202,170, 9,223,151, 20,253,204, 84,223,233,218, 73,228,232,245, 54, 8, 73, 96, 5,244, 20,173,160,209,137,104,234, 16, - 28,243,224,254, 67, 94,189,124,201,201, 98,202,127,255,239,255, 27,127,248,242,223, 80, 8,166,147,152,170,106, 48, 93, 29, 92, - 22, 93, 67,146,100, 65,217,222, 90,144,154, 88, 74,156,247, 84,101, 3, 74, 50,153, 76,198,209, 78,150,101, 20, 69, 49,138,186, -234,186,102, 58,157,143,227,142,193, 78, 38,132,160, 42,155, 62,255, 91,146, 77,146,241, 58, 44, 22, 11,210, 52,229,120, 60, 50, -157,134, 96, 38,223, 39, 27,106,173,251,120, 83,198,174,149,247,161,101, 93, 70,146, 73,223, 2, 14,153,222,129, 62,151,196, 25, - 78,192,124,190,100,187,187,141,215,236,218,208, 97, 76, 38, 89,239,131, 15,228,179, 36, 73, 2, 57, 79,197, 84,117,209,219, 82, - 27,180, 84,163,239, 62,207,243,241,125, 50,198,176,223,239,121,112,126,134,150, 1,137, 28,120, 1, 37,203,229,146,203,203, 75, - 94,191,126, 61, 62,151,131,102,198,218, 96,153, 27,222,247, 55,239,223, 97,219,219, 76, 2,219,153,113,164,150,232,136, 40, 14, -239, 88, 83,213, 35, 96, 37,224, 98,131,155,224,217,103,159,145, 84, 37,117, 93,141,150,194, 97, 13, 80, 74,161,149,226,251,239, -191,199,218,142,171,171,171, 62, 23,254, 3,191,248,197, 47,200,251,241,232,208,225,203,178,140, 72, 73,206, 78, 86, 24, 99, 88, - 46,150, 40, 33, 57, 63,187,207,177, 12, 25, 21,214, 5,255,126,231,130,189, 84,169, 0,209, 9,169,107,247,104, 76,135,245,110, -212, 23, 13, 56,220, 97, 4, 49,116,212,132,146,212, 85,205,177,223,248,103,179, 89,208, 16, 25,131, 52, 49,145, 78,113,222,224, - 17,124,243,221, 75,182,155, 5,159,191,120, 70,146,102,148,197, 30, 89,150,120,103, 67,167,165,143,227,150,218, 98, 77,203,110, -123, 67,154, 77,121,242,248, 62,111,222, 94, 48,205, 51,178, 44, 9,174,145,126,164, 25, 10, 83, 40,203,154,143, 31,175,184,185, -185,166,107, 90,172,235,208,251, 67,197, 36, 95,160,163, 48,223,172,203,138, 36,137, 88,204,103, 36, 81,140,237,163,223,156,141, -136, 34, 21, 2, 53,240,120,103, 65, 73, 32,204, 45,133, 16, 56,111, 67,149,165, 36, 90,232, 81,209, 28, 22, 9,223,111,232,126, -172,218, 66, 5, 29, 78,103,109, 87,135, 54, 26, 30,133,199,249,208,238,223,111,246, 8, 25,145,228,146,186, 49, 32,117, 95, 17, -135,128, 11, 37,185,205,134, 86, 10, 45,195, 77, 27,230, 73, 90, 42,218,225,161,148, 17, 58,114,159,108, 92, 81, 26, 30,242,206, -121,140,119,193,250,227, 61, 94,134, 57,125, 48,137, 9,186,166, 99,231, 11,210, 88,245, 27,164,164,105, 66, 27,101, 50,155,145, - 23, 5,167,167,167, 33,185,236, 88,176, 63, 84, 88, 33,121,114,127, 21, 56,204,214, 51,201,195,137, 82, 10,135,107,195,159, 21, -117,131,211,158,170, 40,169, 14,134, 52,146, 60,122,112,159,159,254,228, 11,242, 44, 97,222, 71,181,154,174,227,112,216, 83, 28, - 42,148, 18, 68, 74,208, 17, 64, 19,174,110, 48,166, 28, 91, 71,157, 49, 28,171,154,162, 44, 73,243, 41, 58, 14,100,163,174, 11, - 45,187,206, 89,188,244,180,214,208, 52, 45, 90,197,227, 73,122,104,247, 14, 27,249,221,150,249,176,209, 12,159, 11,167, 70, 49, -110,182, 67, 53, 63,156, 38,199,132,178, 59,209,140,127, 99,235,249,171, 48,145, 97, 1, 25, 54,114,115, 71, 8, 57, 80,186,238, -226, 71,109, 23,172, 68, 74,251, 30,229,169,199,208, 21,229,134,192,147,182,135,149,192,118,187,165,170, 26, 88, 78,113, 4,236, -166, 53, 65,208,229,132,198,137, 24,107,160,177, 65, 39, 97, 84,204,254, 80,112, 68, 80,231,138,174, 18,248,153, 36,207, 98,238, -221,127, 64, 45,182, 32, 91,108,237,168,171,130,174,137, 40, 15, 7, 54, 55,215,108,214,215, 88, 47,241, 90, 82,119, 77, 24,225, -180,193,197, 80, 29, 91,246,229,142, 73, 22, 84,220,199, 99,192,102,206,102,179,209,214, 22, 48,150,246, 19,192,204,112,144, 26, -210,211,238, 34, 87, 69,223,182, 11,202,243, 96,247,211,138, 0, 47,114, 22,195,109, 20,171,151, 2,108, 63, 24,146,178,199,127, - 74,172,187, 77,187,211, 58,192, 95,134,231, 42,224, 42,107,202,186, 66,235,104,180, 43, 57,231, 56,246, 33, 26,113,148,246,235, - 2, 36, 89,160,238, 5, 45, 65,232, 26,128, 12,173,247,190,187,240, 9, 1, 15,223, 11,197,194,151, 16,210,131,149, 76,146, 12, -156, 99,177,200,184,250,168,121,245,246, 29,251,178,102,117,114, 70,181,223, 16, 73,137,116,150,227,118,131,142, 50, 34, 45,169, -171, 2,211, 89,240, 61,236, 70, 69, 8, 37,241, 88,180, 82, 65, 84,165,195,187,156,229, 57,235,245,150, 36,139,195, 38,186,221, - 82, 20, 69, 24, 29, 72,129,113,150,166,238, 62, 33,246,181,109, 75,146,246,185,232,206,225,109, 71, 18,229,156, 62,125, 76, 20, - 69,161,243,226,110,219,165, 65, 68, 10, 93,221,140, 72, 86,165, 20,167,243, 60,204, 86,189, 71,235, 24,193,176,177, 69, 56, 47, -104,140,165,249,248,113,236,142, 13,107,151,234,177,182, 87, 87, 87,172, 78, 22, 35,174,185,179,129, 29,224,173, 33,207,115,242, - 44,132,162, 12,218,152,225, 62, 26, 99,176, 90,114,125,125,141,239,223,231,179,179, 51,138,162, 96,181, 84, 60,126,252,152,183, -111,223,142, 33, 66, 3, 64, 40, 28,184, 58, 94,189,122, 69,211,181,200,248,246, 16, 22, 70,170,183,122,153,214,121, 18, 47,104, -186,134,186,171,152, 68, 2,229, 29, 69, 85,144, 99, 89, 44, 22, 88, 31,158,249,147,147, 21, 15, 30, 60, 24,225, 57, 67, 33, 88, - 22, 5, 74, 5, 45,192,213,213,213,248,204,239,247,123, 30, 60,120,192,106, 58,239,187,173,183,227,189,213,233,217,184, 62,116, -214, 49,155,199, 44,250,177, 69, 89,135, 92,115,107, 45, 58, 78,176, 34,198,217, 14,103, 29,139,213, 60,132, 44, 21, 5, 81,164, - 56,203,150,212, 93, 27,236,216,222,129,239,221,194,145, 70,105,141,182,150,249,114,222,223, 91, 69, 81,149,232, 56, 33,205,114, -182,117,203,246,102,207,243,103, 79, 88,223, 84,124,184,184,228,236,236,132,199, 15,239,209,118, 13,198, 27, 22,243, 25,222,155, - 96, 13,108, 42,180,247,204, 38, 25,187, 30, 62,117,255,193, 67,170,106, 65, 81,213,212,173, 37, 78, 66,215, 78,169,136,110,176, -122, 3,139,121,142, 49, 17, 77, 85, 7,139, 96,221,134, 19,168,175, 67,219,242,236,236,156, 56,209,216,174,229,234,230,154,197, -124, 26, 90, 42, 34,128, 64,218,174, 65, 54, 2,215,133, 68,178,206,253,109, 5, 55,158, 36, 92, 16,211,221,109,221,222, 13,247, - 24,196, 65,229,225, 24, 60,201, 90, 33, 69, 68, 18, 71, 68, 90,177,152,206,168,234,240, 16,150, 69,205,155, 15,151, 65,172,115, - 39, 36, 96,216, 28,154,182, 65,208, 71,114,154,154,197,116,206,211, 39, 19,166,211, 41,199,162,162, 44,203, 59, 7, 9,213,159, - 2, 5,222, 24, 34,165, 2,187, 93, 64,235, 60,157, 53, 88,235, 16, 72,154,186, 63,217,103, 25, 15,238,157, 97,186,134, 15, 23, -111,177,182, 35,142, 53,155,245,142,199, 15, 31,179,156,205,137,180,162, 42, 75, 78, 87, 39,164,147,156,214,121,166,179, 37,101, - 29,224, 17, 90,107,178, 72,133,217,186,112, 33,176,102,223, 98, 44, 92, 94,188,103,183,185,198, 24,219, 39,206,205, 17,222,178, -221,172,153,100, 97,163, 21,182, 37, 75,194,108,179,107,106,214,251, 35,141,147,212,141,165, 3,100,156, 96,171,102,100,184,223, -127,244,152,253,225,192,161, 56,114, 40, 10,100,164,208,113, 76, 62, 73,209, 82,245, 66,159,132, 56,186,157,183, 74, 25,162, 19, -239,166, 66, 13,155,233, 93, 42,216, 16, 56,162,122, 80,209,144,196,117, 55, 45,108, 80, 3,223,198,122,186, 79,170,238,161, 83, -114,151,178,117, 87,189,125, 55,101,236, 46, 56,101, 56, 88,152,126, 99,243, 34,248, 99,181, 12,158,243, 97,100, 48,108,138,109, - 83, 16,107,152,207, 39, 28,138, 42,116,121,140,231,112,172,177,169, 98,183,222,144,207,230,120, 4,101, 87, 82, 26,184,217,236, - 16, 42,208,240,156,237, 88, 45,167,188,248,209, 83,238, 47, 39, 76, 98, 73,113, 93,176,190,254,200, 52, 95,176,219, 53, 20, 69, -129, 20, 33, 72,167,237,231,130, 73,146, 96,189,164,113,166, 79, 7, 4,239,117,240,248, 70,146,206,212,161,253,155, 5,156,233, -126,191,103,191,223,143, 66,161,161,162,253,248,241,227, 56,246,186,123,104, 74,211, 20,219,245,155,173,142,198,119, 98,120, 23, -235,182, 25, 91,225, 97,211,236, 73,101, 98,232,212, 91,132,212,159, 48,228, 93,239,151, 86, 74,142, 96,151,225, 94,221, 61,156, - 13,239,242,241,120, 68,201, 40,168,219, 81, 35,119,160,179, 6,101, 12, 58,142,113, 64,107,122, 1,164,245,159,136,169, 66,231, -166, 31,167,220,230,241,140, 93, 60,235, 28, 39,203, 5,229,241,200,118,119, 32, 74, 50, 58,227,120,251,238, 3,191,253,245,207, -249,243,191,255, 43, 18, 79,150, 70,236, 15, 37, 73, 62, 99, 54, 95,114,179,217,163,179,132,205,246, 72,217,182,168,214, 32, 85, -216,132, 51, 33, 48,109,139,109, 60, 42,138, 89, 46,151,108, 54,187,113,142, 59, 92,139,195,225, 64, 58, 9,115, 84,239,142,227, - 33,180, 44, 75,214,235, 53, 77, 93, 50,159, 78, 40,133,100,115,179,166,169,106,230, 95,124,193,116,146,211, 85, 21,201,100, 66, -215,132, 77, 33,233,103,198, 29, 32,220,173,139, 32,139,207,200,243,124, 92, 35,173, 21, 35,157,205, 56,139,112, 50, 28, 2,250, - 10, 54, 78, 18,202,182, 25,221, 33, 65, 44, 12,235,221,122, 60, 92, 47,151, 75,142,135, 29,198,116,116,189, 43,105, 72, 46,251, -209,211, 31, 17,199, 49, 87, 87, 87,252,250, 87,127,135,240,150,166, 63, 36,174, 86, 43, 94,190,124, 73,219,182, 60,125,246,152, -103,207,158,177,223,239, 71,144,216,208,142,206,243,156,237,118, 77,221, 54,212,109,139, 87,119, 70,106, 67,176,139,214, 68,125, -136,205,253,251,247, 71, 53,126, 20, 69, 60,121,242,132, 89, 30,186, 25,179,217, 44,116,157,146,152,179,179,179,177,202, 31,238, - 67, 93, 85, 92, 92, 92,224,156,225,253,251,247,252,252,231, 63,231,228,228,132,197, 98,193,147, 39, 79,192,186, 94,107, 16,133, - 78,170,177,196,105, 60, 30,126,163, 56,232,191,234,182,163,110,251, 8,231,147, 21,190, 11, 66,208,108,178, 68, 39, 49,101, 81, -161, 99,141,141, 19, 78, 79, 79, 88,173, 86, 56, 28,214, 58,170,182, 70,202, 16,126,101,140, 13,169,113,141,197,122, 75,146, 70, - 33,119,160, 10,235, 77,150, 5, 27,155,119,130,233,124,201,118,119, 96,190, 88,114,216,111,120,245,250, 45,121,158,113,178, 92, - 34,133, 67, 10, 67, 34,195,232, 42,155, 76, 1, 73, 81,149,228,105, 2, 50,230,195,251,119, 44,250,104,214,205,245, 22,161, 53, - 73,156, 81,183, 29,135,125, 65,221,148, 72, 9, 79,159, 60,228,139,207,126, 65,103, 26,182,235, 13,218, 56,144,202, 51,201, 39, -164,105, 72, 39,170,170, 10,111,195,188,108, 58,157,142,243, 20,231, 12,178,127,201,227,190,194,142,211, 12,143, 8, 47,191,238, -225, 7,109, 55,206,247, 92,111, 49,146, 82,226,145,120, 97,251,120, 82,199,118,191, 35, 75,115,210, 36, 70,121, 67,121, 44,136, - 35,193,201,252, 30, 66, 71, 28,139,146,170,115,236,203,154,147,251,143,121,255,241, 26,217,219,229,164,164,183,245,132, 54,105, -150, 79, 71, 49,151,118, 49,198,122,174, 55, 91,146, 73, 14, 74,143,161,243, 89, 26,143,225, 20, 18,129,244,193,102, 98,113, 97, -147,144,138, 88, 70, 24, 33,122, 47, 46,212,199, 35,243,244,148,231, 79, 30,243,241,226, 3, 63, 28, 42,206, 31,158,145,101, 25, -139,105, 16, 45,157, 44, 87, 84,199,130, 95,252,228,167, 65,173,140, 64,196, 49,173,113,156,204,103,227, 98, 59,159,164,104, 37, -192,180,232, 40, 37, 74, 87,236,138, 10,211, 53,212,101,193,122,179, 65,234,136,227,177, 36,137, 66,107,175,145,208, 53, 5,182, - 51,228,121, 70, 91, 87,236, 14,123,154,206, 81, 52, 18,149,100,104, 17,225, 59,139, 78,115, 78, 38,115,100,239, 71, 46,215, 55, -196, 73,210, 91,207, 20,113,156, 98,188,193, 52,109,240,207,122, 57,206,115,135, 77,161,105,154, 79, 54,226, 17, 81, 58, 80,178, -250,205,117, 88,228,135,118,226, 80,117, 15, 27,240, 32,220, 25, 78,221,195,198, 48, 8,112,142,199, 99,152,161,223,169,102,134, - 86,238,112,128, 24, 14,140,159, 6,185,132,131, 99,148, 36,164,233,132,186,173,200,146,148,166,170,144,202,179, 88, 44,216,236, -182, 65,187, 65, 24,109,156, 44,103,100,147, 9,147,104,202,100,190,196,122, 69,154,196,120, 12,101,107,144,173, 69,234,136,120, - 50,197,118,225, 48,182,254,211,183, 60,126,246, 99,150,203, 37, 39,139, 41,229,126,199,143,127,245, 83,190,254,227,239,130, 39, -246, 88,112,211,214, 28,143, 97,193,117,214, 82,213,101,127,157, 99,174,175, 95, 17,167,121, 8, 14,242, 54,140,176,122, 11,146, -239,219,152, 78,132,159,165, 40, 10,210, 36,230,244,100, 53, 98, 34,243, 60,103, 49,159,133, 40,203,170,162,107,155, 16, 84, 50, -201,198, 17,214,124,185,234,187, 15, 65,192,149,231, 57,157, 13,118,196,180, 11,221, 23,209,212,125, 60, 46, 65, 53, 31,108,215, -204,102, 83,234,218,140,214,195, 56,142, 73,122,177, 94,211,219,178, 66,155,222, 19,233,128, 5, 30,218,167, 2,197, 52,207,122, - 17,207,145,170, 47, 14,172,245,227,156,189,174, 91,218,126, 84, 16, 20,241, 98, 12,222, 25, 72,108, 74, 72,148, 16,232,222, 70, -228, 93,160,220,197, 74,247,237,227,208, 73, 59, 57, 57,225,226,253, 91,166,139, 37,166,171,248, 31,255,199,255,205,243,199, 15, -248,217,207,126,198,247, 95,255,153,186,110,153, 76, 50, 46, 46,222, 83, 53,129, 19,176, 88, 46,113, 94, 97, 54, 91,172, 51,160, - 21,198,182,120,159,113,117,245,145,233,124, 65, 44, 21,231,103,103,108,110,110,184,184, 56,146, 36,129,168,120,125,125,141, 16, -130,205,205,122, 20, 60, 2, 99,135,240,120, 60,254,127,108,189,215,146, 37, 89,154,157,247,109,225,242,168, 16,169, 75,118, 87, -247, 0, 99, 24, 96,112, 71,194, 12, 70,242,154, 79,197, 87,227, 53, 97, 70, 98, 48,152,153,238,233,170,234, 18,169, 66,157, 56, -202,229, 22,188,248,183,123,156, 40,160,204,218,170, 51, 45, 43,227, 8,119,223,191, 88,235, 91,100, 86,179, 40,114,234, 82,172, -156,205,241,200, 47, 63,253,196,248,230, 13, 70, 41,110, 63,223,224, 19, 42,185,202, 11, 81, 38, 91, 75,149,186, 77,165, 20,187, -195,225, 25,117,207,123,185,159,186,126,144, 78, 88,229,243,138, 35, 36,170, 90, 84,105, 37,224,221,140,225, 53,185,128, 96,202, - 52, 73, 40,170,146,182,141,184,240,228, 88,201,243, 28, 23, 29,237,208, 18,162,227,112, 56,240,245,151,239,248,212,117,188,124, -253, 10,180, 98,177, 90,114,108, 78,244,131,227,229,171, 55,124,247,135,191, 17,230, 71,153, 39,215,197,144,128, 74,181, 40,245, - 71,199,102,179, 33,207,101,218,103,181,120,206,139, 66,194,182,170,170, 74,187,117,155,212,251,114,175, 88,109, 8, 68,218,113, -100,119,144, 60,240,127,248,135,127,224,251,239,191,151,166, 37, 89, 67, 77,154, 0,124,250,244,129,175,190,250,234, 9,124,181, -219,113, 56, 28,248,226,205, 23,115,230,128,233, 59, 33,219, 89,209,216,152,180,154,146,213, 80,224,234,197,203,121,116,254,112, -183,149, 96,160,168,104,143, 7,172,201, 8,126,164,239, 71,142,205,158, 83,215, 83,214, 5,247,119, 91,180, 65,162,193,219,163, - 16,222,252,192, 56,120,242,194,206,235,130,113,144, 20,201,170, 90, 64,212, 24,147,113,177,222, 80, 47, 74,250,193,209,180, 61, -167,102, 71, 89,229, 20,255,246, 15,188,120,113,201,216, 30, 81, 54,176,168, 43,250, 97,228,245,235,215,100,167,150, 99,211, 50, -116, 13, 70,193,237,231, 79,108, 86, 11,246,251, 35, 62,136,243,101,181, 89, 99,173,229,231,159,183, 84,153,225,225,238, 19,223, -135,145, 63,252,241,247,252,238,155, 47,176,163,119, 88,101,231,172,227,194, 26, 50,155,236,103,185, 40,118, 7,159,110,204, 24, -241,156,141, 99,125, 96, 76, 54, 32, 73, 37, 11,115,222,178, 74, 42,218,174,235, 83,106,152, 77, 15, 4, 81, 37, 43, 12,214, 8, -109,106,116,162,208,158,214,217,109,115,196,216,156,186, 42,185,186, 80,140, 81,113,177, 94,115,181, 17,255,104,150,101,196, 32, -234, 81, 31, 3, 85, 33, 59,177, 73,172, 23,148,226, 98,179,162, 40, 50,194, 56, 80,229, 25, 97, 41, 42,108,151,186, 23, 21, 35, -209, 59,116,122,136,100,214,226,181,194, 19,113,209, 19,195,128, 13, 3, 74, 35,150,175,220,176, 44, 75, 62,185,145,139,245,138, - 55, 47, 94,178, 88, 45,137, 65,177, 40,151, 66,150, 42,189, 88,196,242, 2, 63,169,188,173, 21, 49, 75,106, 39, 77, 4,215,181, - 18,249,169,101,244,227,125,218,107,230, 57, 69, 46,185,232,131, 27, 81, 90,208,157,214, 86, 88, 93,113,114, 71,118, 7,217,235, -140,222, 99,139, 37, 42, 64, 31, 20,253,224,104,199, 64,235,188, 8, 5, 83,172,139,205, 10, 48, 22, 23,192,245, 30, 31,199, 73, - 19,141,138,134,224,198,103, 44,240,105,220,118,158,228,245,220,185,160,158,217,212,198,209, 61, 75,163, 58,223,137, 79,223,230, - 98, 62, 0, 0, 32, 0, 73, 68, 65, 84,149,248, 52,106, 60,167, 68,205,185,211,169,139, 60,255,103, 6,165, 36,118,248,228,137, -158,246,123, 83,168,133,205,243, 52,106, 22, 27,204,169, 59, 97, 80,100, 69,254,204,102,183, 92,109,168,202,138,168, 52, 74,107, -154,198,179,170, 45,251, 83,143, 85,142,155,251, 3, 63,252,252, 25, 83,212,124,241,205,119, 28, 91,207,227,254,192,213,245, 75, -222,189,121, 37,147,160,211, 1, 55,246,220,222,222,206, 5,208, 24, 53,238, 20, 36, 58,116,234, 96,147,152,111,122,159,227, 56, - 50, 18,232, 93,199,232,132,181, 47, 48, 18,121,159,203,229,242, 25, 82,118,154,114, 77, 78,131,105,141, 52,229,169, 79,221,206, - 52,162,223,222, 61,176, 94,175,217,108, 54,201, 17, 32,194,158,186,172,104, 58,153, 80, 77,159, 99,239,198, 89,103,174, 19,229, -109,210,184,152, 68,221,155,246,154,231, 78,136,223, 98,106, 37,202,117, 10,178,177, 73,140,167,231,224,150,152,168,147, 74, 41, -134,105,151,111,236,147, 56, 50, 61, 75,100,239,236,113, 76,118, 58, 65,170,106,173,158, 69,145,250,168, 36,202, 53,179, 41,129, - 49, 82, 22, 34, 96,253,219,239,190,228,231, 31,254, 21, 24, 56, 28, 14,180,221,137,176, 85,172,150,145,166,125,207,106,121,201, -106,189,164,237,122,246,199, 35,206, 5,250,172,161, 79,105, 92, 82,100, 46,121,253,250, 53,183,183,183, 92, 45,151, 73, 36, 90, -205, 93,234,244,186,179, 34, 23,220,111, 42,106,173, 81,100, 10,202,220,206,185, 6,101, 46,241,165, 62,120,220, 56,130,143, 68, -229,113,140,162,192,142, 90,236,108, 38,199,228,122,158,130,201,116, 69,238,191, 97, 20,255,119,219, 13,100,165, 52, 74,225, 76, -204, 24,163,116,241,231,154, 6, 63,134,103, 24,215,233,251,155, 82,230, 52,106,142,133,157,174,181,187,135,123,234,186,228,221, -187,119,172,215,178, 19,254,253,239,127,207,251,247,239,121,120,120,224,205,155, 55,124,252,248,145,239,191,255,158,182, 61,205, - 9,128,243,243, 32, 70,190,253,242, 11,185,238, 34, 82, 12,180, 93, 42,208, 69,161,125, 60, 30,101, 39,157,174, 95, 72,250,170, - 8, 46,164,232,104,107,248,226,139,119,207,236, 90,211,243,136,244,249, 47,151, 75,174,175,175,231,120,214, 16, 36, 26,247,195, -207, 31,121, 60,236,231,215,213,117, 29,211,244, 89, 25,131, 10,138,118,104,217,111,247, 84,117, 49, 71,235, 78,252,129, 41,139, -188, 44, 5,226,180, 59, 28,240, 81,138, 34,101, 12,195,224,136, 42,224, 6, 41,162,166,124,121, 66,100,236, 19,162,219,139,200, - 51,166,188,186, 57, 30,217,232, 84, 8,201, 42,170, 57,141,220,220,109,169,126,249, 72, 63, 12,124,253,197, 27,178, 56,112, 56, - 74,246,252,245,181, 20, 29, 28, 27, 78,167, 3,206, 5, 80, 25,209, 59,150, 85,137,139,208,180, 3,199,253, 1,107, 45,111,223, -188,226,180,187,167,239,142,220,223, 14, 92,108, 42,212,245, 11,172, 34, 80, 22,153,248,231, 66,144,155,200,123, 92, 50,243, 75, -133, 39, 49,123, 42,168, 57, 20, 35,198,136,144,103, 69, 69, 59, 29,234, 49, 42,226, 20,208,161,100,115,166,116, 68, 27,161, 42, -197, 16, 0, 25,119,107,107, 81, 38, 19, 74,150, 83, 20,121, 78, 93, 88,162, 31, 65, 69, 94, 94,174,185,123,252,149,253,227,150, - 87,175,191,192, 26, 69, 31, 28,133,205, 9, 14,114,109, 9,218,112,113,181,230, 65,185,132,164, 20,209,199, 23,111, 95,139, 40, -196, 15,148,133, 5,159,179,235, 26,142,167, 67,162,111, 9,231,250,111,190,254, 26, 55,244, 28,218, 3,199,182,193, 19, 41,235, -138, 23,171, 53,229,245,154, 69,185, 16,108, 99,112,148, 86,177,187,191,195,168, 72,158,149,212,197,130, 99,211, 38, 86,115,152, - 15,180, 73, 96, 38, 86,105,147,166, 24,211,231, 35, 29,150, 78,156,246,194,138,213,110, 98,157,135, 41, 1, 47, 68, 10,101, 64, -233,196,189, 23,213,237,224, 61,206,195,232, 21, 77, 28,104,188,166, 29, 6,186, 78,132, 74, 78, 65, 72, 64, 15,101, 50,214, 23, - 87,146, 63,237,158,194, 57,164,168,145, 14, 49,142,131, 68, 28,158,137,211,206,197,113,211,129,115,174,110, 63,255,115, 19, 45, -238, 89, 86,244,217,158,252,252, 48,248,159, 1, 74,108,158, 73, 1,164,148,148,132, 90, 99,243,156, 44, 61,192, 30, 30, 30, 64, -107,220, 89,222,120, 89,150,248, 24,113, 93,135,143, 9,192, 49,202, 13,109, 80, 84,149,116, 66,158, 72,211,116, 41,151, 58,210, -106,249,223,255,247,143,255,196,223,255,221,191, 97, 85,229, 16, 29,255,245,159,254,194, 95,127,253,149,245,230,154,111,183, 61, - 46, 42,110,239,119, 98, 79,185,184,132,224,249,233,230, 35,235, 42, 99,116, 61,213,114, 65,123,240, 60,220, 61,176, 59,122,154, - 30, 10, 29,137, 97,164,235,122, 78,199,150,211,233,196, 48,142, 60,108,239, 49,101,158,124,177, 53, 85,177,161,170, 42,140,238, -241,126, 96, 12,146,137,126, 94,172,104, 45, 35,215,105,119, 46,123, 52, 51, 51,192,207,197, 75,227, 56,204, 22,180, 57,180, 36, - 77,209,186,212,105,103,198,224, 83, 76,102, 80,178, 23,196, 67,215,118,100, 54,103, 28, 6, 76,153, 75, 88, 74, 58,212,181, 86, -207,130, 99,158, 2, 95, 36,150,210,197,128,139, 35,182, 8,179, 50,120, 86, 56,159, 57, 28,230,200,211,224, 19, 36, 40,217, 13, - 19,242,182,204,202, 39, 67, 91, 90,163,144,132,159,227, 56,146,229,210,169,183,205, 40, 52, 54,163, 8, 49, 35,171, 74,110,239, - 30,168, 23, 75,214,235, 53,214,230, 56,191, 21,103, 78,128, 44,179,116, 46,240,240,240,128, 83,226, 15,104,187, 19, 10, 67,215, -169,228,247,111, 88,115, 73,102, 52,151,155, 53, 95,124,241,118,182, 24, 89,155,179,168,228, 16,232, 83,161, 59, 77, 32,230, 48, - 27, 20, 95,189,125, 51,135,176,168, 51,167,141, 75,100, 51,171,196,181, 32, 1, 37,154, 69, 85, 97,173,166,109,123,201, 49,175, -202, 39,232, 78,242,240, 15, 78,238,117,239, 61,221,225, 32, 83,154, 16,208, 17, 80, 30,159, 14,245, 16, 28,206, 61,229,155,163, -194,124,159, 77,113,157, 99,159,190, 11, 35,135,220,116,157,244, 83,225,144,132,129,143,143,143,146, 17, 95,228,115, 33,248,226, -197, 11,134, 97,224,175,127,253, 43,251,189, 8, 0,167,123,127, 90, 25,252,211, 15, 63, 72, 0,146,205, 48,153,133,240,228,116, - 17, 47,118, 5, 3,115,248, 77, 94,100, 20, 86,138,160,113, 20,212,248,148,218,183, 88,136,181,247,245,235,215, 88, 43, 17,170, - 89,194,163,118, 93, 67, 93,215,236,118, 59,238,239,239,231, 63,187, 59,126,226,167,159,126,162,109,123, 22, 43,177,217, 29, 78, - 34,140,182,121, 70, 93, 46,112, 33,226, 34,244,163, 52, 53, 1,141,143,162, 75,170,235, 50,157,103, 98,255,173, 23, 37, 89,202, - 46,232,199,129,174, 27,104,135, 54, 21,225,138,232, 61,121,150, 81, 21,197, 51,209,169,119,210,170,102,102,178,213,138,141, 46, - 4,185,142,175,174, 46, 64, 25, 30,118,123,248,249, 61,187,221,129,245,106,197,101,101, 81, 58, 39, 48,242,249,246,126,134,252, -116,253,192,205,205, 29, 38,147, 16,167,170, 46,136,202,224, 3, 60,220,220,176, 92,172, 89,111,214, 20, 38,210,183, 7,142,251, - 3,191,252,244, 51,143,119, 15,216,194, 74,118,179,247,210,185,202,195, 64, 90,255,205,230,117, 18,192, 41,105,194, 83, 3, 39, - 64, 24,230,116,163,168, 20, 6,137,133, 36, 64, 80,160,131,216,117, 10,155,225,162, 64, 74,198,224,113,253, 0, 70, 83, 88,249, -243, 89,110, 81,104,252,216, 19, 81, 50,186, 76,163,216,213,102,133, 33, 50,186, 1,130,167,204, 51,250, 19,228, 70,196,119, 54, - 51,162, 62, 12, 53,155, 58, 35,203, 44,198,230,140,133, 33, 87, 30,223, 15,116, 67, 71,110, 51,114, 3,155,101, 65,157, 69,172, -214,146,133,108, 53,255,241,111,255, 29, 38,141, 5,251, 48, 48,134,113,222, 5, 87,121, 65, 85,136,208,228,211,167, 27,234,194, -210,156, 14,168, 20,205,168,140, 84,100,178,125, 79, 93,106, 58, 8, 37,132, 36,226, 71, 79, 12,147, 72, 76, 96, 20,179,144,196, -141,120,213,163,137,168, 56,117,201, 2,228,144, 4, 57,143, 81,162, 32,246, 78, 14,128,168, 51, 34,145,193,123,218,118,100, 80, - 57,167,161,167, 31, 68,181,233,189,136,120,208,150,162, 48,184, 16,201, 38, 63,112, 4, 21,181,248,130,125,144,174, 61, 6,166, -134,236,188, 27,159,186,246,243,170,255,183,194, 54,249,125, 59, 31,234,231,158,243,115, 97,220,111,237,110,179,216, 45,217,114, -124,124, 14,176, 57,247,176, 47, 22, 11,185, 38, 83, 7, 88, 20,197,236,147, 30,134, 65, 62,123, 49, 43,164,202, 62, 36,159,169, -153,187,171,190,239,233,157,151, 4,170,161,229,255,249,127,255,129,205,102,195,239,190,253, 10, 21,225,199, 95,111,184,123,116, -228, 75,195,135,219, 45,235,213, 37, 95,126,245, 53,187,237, 35,153,209, 12,174,135, 32,118, 43, 55, 10,198,116, 8,176, 59,180, -184,144, 37,105,167,220, 30,202, 26,130, 2,151,210,212,190,252,242, 75,116, 97,209, 25,146, 42,104,214,100,198, 48,164,107,115, -181,190, 32,175, 68,137, 61, 41,107, 39,117,251,110,183,123,150,172,246, 91, 74,220, 52, 82, 61, 28, 14,243, 24,182, 44, 75,240, - 30, 23, 60, 38,117,207,198,152,217, 38,106,148,166, 76,157, 90,239,227, 51,174,254,244,119,139, 30, 32,127,246,208, 58, 95,173, -200,131, 93, 30, 54,251,227, 97,126,208, 63,145,254,158, 72,102, 54,169,173, 39,119,133, 73,197,219, 84,137,180,141, 16,233,140, - 17, 96,149, 61,187,214, 36,166, 87,207,118,173,105,189, 55,140, 14, 84,198,231,251, 7,126,254,249, 87,178,162,164, 68,145, 55, - 45,139,160,104,186,158,118, 24, 48, 54,103,183,191,103,116,129,139,235, 23, 44,202,138,113,244,184, 97, 20, 82, 89,223,225, 71, - 89,117, 12,195,192, 87, 95,124,201,225,112, 32, 92, 6, 78,167,150, 87,175, 94,205,171, 41, 17,254, 85,148,101,253, 68, 63,180, -154,253,195,253, 51,231,134,214,122, 46, 88, 72,176,167,122,185, 18,168,151,247,140, 93,207,105,159,128, 73,198,226,252, 83,110, -198,212, 93,154,172,160,168,133, 77,126,106, 58,185, 62, 82,164, 67, 84, 6, 21, 68,163, 48, 14, 30,141,198,123,241,138, 71, 2, -109,219, 37,215,128,154,109,137, 50, 1, 50,115,124,234, 36,212,155, 20,243,223,127,255,253,124,111,117,157,132, 56, 57,231,132, -177,110,173,196,181,118,157, 48,219, 51, 51,119,255, 77,223,241,226,173, 76, 56,246,251, 61,133, 18, 39, 65, 94,198, 39, 6,124, -102,158, 21, 60, 85, 89,204, 58, 27,231, 28,215,151,215,168, 16,185,184,216,204,211,185,233, 94, 24,199,113,214,167,244,189, 20, -202,211,216,189, 44, 75,154,166,225,223,254,237,191,161,235, 91, 62,125,252, 60,119,250,117, 93, 39, 39,148, 37, 34,161, 95,139, -101, 20, 10, 95,136,100,153, 33, 4, 75,145,101,172,235,146,166, 57,114,121,177, 97, 12, 35, 69, 89,147, 87,165,184, 1,142, 7, - 86,203, 5, 77, 91, 66, 72,118,218,174,151,117, 74,181, 16,235,177, 23, 42,132,247,201,186,153, 38,219,222,141, 28,143,143, 34, - 50, 15,201, 17,160, 32,170,140,221,190,225,212, 12,252,247,127,249,129,191,251,227, 87,172,235, 2, 99, 51,246,251, 3, 93, 39, -188,128,170,170, 88, 44, 42,142,109, 71, 24, 6,150,171, 11,180,213,172,150, 53,119,119, 90, 34,107,147, 75,195, 88,197,225,112, -226,254, 97,139, 27, 61,182,204, 51,140,134,232, 35,153,213,120,239,230, 61,204,213,213,213,211,131, 92, 41, 84, 60, 35, 63, 17, -231,139, 12,165,136, 76,163, 53,208, 26, 73,118,211,194, 61, 14,174, 79, 29,104, 36, 40, 13, 81,137, 13,203, 71, 90,215,144, 89, - 3,221, 64, 84, 35,151,181,161, 90,214,114, 1, 25, 69, 89,228, 84,185,140,219, 51,163,209,202, 99,137, 68, 28, 38,122, 86,133, -162, 84, 3,151, 27,177,217,100,101,133, 49,178, 95,143, 6,174, 86, 27,172, 66,200, 62,217, 11,172, 78, 94,251, 20, 59,152, 41, -195,162,170, 40, 23, 37,202,192,224, 6,186,174, 33, 68, 9,245, 40, 10,241,227, 31, 74, 13, 81,194, 11,116, 86, 96, 50,203,224, - 37,107,123,240, 78, 88,218,120,136,129,254,212, 37,250, 86, 64,101,249,236, 22, 24,199,129,136,167,200,228, 98,235,251,158,206, - 13, 4,109,153, 50, 24,109, 46,187, 75,135, 34,246, 3, 85,102,164,123,209, 50,178,109,123, 71,239, 35, 67, 48, 12, 40,233, 88, -189, 40,158,167,195,111,127, 58, 66,148,194, 36,207, 69, 9, 27,163, 18,230, 64, 76,209,125, 78,162, 6,165, 75,127, 14, 7,154, - 58,233, 73,236, 53, 61,100, 39,107,207,249,136,222,152,236, 89, 55,119, 94, 28,156,167,138,205, 35,169, 51,117,172,116, 69,150, -243,225,251,116,243, 79,163,223, 73, 24, 55,141,253,207, 45,110,242,119,202, 56,214,143, 46, 9, 84,100,204,151, 87, 41,211,122, -244, 56, 23, 4,100, 20,197,254,248,121,219,241,175, 63,254,204,225,216,112,119,119,199,143, 31, 26,242, 2,186,160,113,187, 6, - 79,193,122,177,164,174,151,168, 8,205,241,128, 81, 48,180, 29,251,253,145,195, 97, 71, 89,150,152,162,102, 60, 13,184, 40, 69, - 44,225,105,133,209,247,189,132,170, 16, 68,148, 53,140, 18, 42,145,103,100,117, 77, 89,229, 24,187,166,237, 58, 6, 31,158, 29, -138,231,159,229,122,189,126,218,135, 58,199,118,187, 77, 29,149,136, 41,151, 85,205,195,195, 3,219,237,118, 62,192,141, 49,100, -103, 72, 93,140, 38,164, 53,201,116,184, 14,195,128,110, 90,124,136,207,160, 52,178,247, 12,216, 44,166, 66, 73,198,225, 33, 42, -129,231,160, 82, 4,101,120, 58,204, 83, 65, 19,207,116, 22,211,123,153,174,149,167, 96, 25, 80, 70, 24,242, 70,105,170,101,157, -148,247, 66, 89,211, 41,190,215,164,195,189, 72,122, 16, 23, 65,161, 9,193,211,143, 30, 23, 35,167,166,227,251,191,254,200, 87, -111, 95,210,116,162, 17,169, 42, 13,218,240,184, 63,177, 88, 10, 35,124,251,184,167,170, 42,150,171, 21,119,119,247, 60, 30,246, - 24,187, 70, 13,138,237,118, 75,126,146,209,242,213,213, 21,185, 53,108,214, 43, 52,138,229,114,201,122,185,120,202,172, 79,227, -255, 89,168,233, 2, 99,250, 60, 3, 26,101, 36,139, 94,161,177, 41,115,188,239,123,116,218,105,207, 83,178,179,194,101,119, 60, -224,220,144,190, 23,153,176,216, 94,238, 49, 23, 3,245, 26,202,229,138,195,233, 68,239,100,253, 50,140, 35,189,147,215,208, 55, -125, 42,128, 61, 62,136,245,182,233, 91,114, 43, 42,242,213,162, 78,159,125, 18, 79,170,150,126,104, 83,248,204,147,154, 94,107, - 61, 91, 41,149, 82,236,247,123,254,252,231, 63,243, 31,254,195,127,224,239,255,254,239,231,216,212,213,106,149,108, 85,114,184, - 55,199,150,251,203, 87, 52, 77,195,114, 85,207, 74,254,232,229,122,171,138,108,222,233, 75,238,186, 88,164,167, 53, 83,155,220, - 0, 42, 69,190, 58,231,184,191,191,231, 47,127,249, 11,199,227,145, 60,173,250,172,213,115, 17,146,231, 57,239,222,189,163,174, -107,190,120,243,154,246, 15,223,177,172,106, 78, 93, 75,211,118,148,147,128, 48,144, 2,169, 74,134, 97,129, 49, 10, 66,160, 44, -165,184, 89,212, 21,221,233,136, 82,158, 63,254,241, 59, 30, 15,143,100, 69,201, 98,181,226,227,199,143, 52,205,145,232, 29,121, -102,168,138, 26,109, 13,125,219, 37, 77, 79,206, 48, 36,188,113, 20,175,178, 11,208, 13, 61,206, 59,122, 63,166,128, 24,185, 22, - 78,109, 51, 63,175,156,243,168,168,121,255,225,150, 87,155, 21, 77,157,113,117,117, 65, 89,149,132,224,184,187, 23, 52,237,197, -197, 5,195,112,195,113,232,232,250, 22, 53, 14,148,197,146,171,203, 13, 93, 47,106,254, 60, 47,208,186, 34, 43, 86,156,218, 17, - 31, 44,118,185,168,132, 41,187, 46,102,177,195,221,221, 29,198,168, 89,177,253, 91,107,147,252, 58, 61,252,123, 39,214,147, 40, -208,138,224,153,211,157,158, 70,181,110,222,177, 79, 35, 84,128,193,121, 98, 86,176, 40, 44,121, 28,208,140,140,163, 96, 60,179, - 44,163,107, 26,134,190, 37,179,154,177,147,127, 95, 44, 23,188,186,186,160, 48, 23,194,185,181,154, 60,183,212,181, 88,148,170, -114, 65, 81, 87,103,254,105, 3,137,120, 84,102, 86, 10,152, 40,244,177,210,136, 96,105,232, 3,206,183, 4,229,146,144,198, 81, - 38,240,199,110,123, 67, 94,212,148,133, 70,199,192,235, 55, 47,217, 53, 3, 58,179,244,110,148,224,134,166, 33,175, 69, 48,152, -153,140,227,177, 21,159,172, 22,146,213,224,100, 45,225,149,236,200, 51, 20, 88, 67,244,242,250,253,244, 57, 69,159,210,213, 12, - 40,177,251, 97, 20,109, 35,149,245,232, 2,205,224, 24,130,162, 15,154, 99, 55, 48,142,189, 48,229, 39, 44,232, 25,209,203, 90, - 89,159, 20,169,242, 14, 46,162, 85,164,208,150,104, 53, 81, 5,198, 48,166, 21,231,243, 17,251,228,135,252,109,215,125,238,179, -213, 90,211,247,227,188,167,250, 45,159,253, 25,212,228,140,235, 60,119, 52,211,245,112, 54,162,127,150, 69,157,212,237,147, 0, -108,194,213,206,162,199,170,226,212,118,196,232, 25,186, 39,208, 77,215, 73,119, 99,108,206,227,221,205, 92, 32,140, 49, 82,231, - 37, 5, 29,159,110, 31,249,241,175,191, 16,128, 55, 95,189,101,177, 92, 39,162, 91,198,232, 2,251,211,145,139,229,130,227,241, -200,221,205,141,224, 37,157,128, 43,108, 81,227, 81, 12, 1,154, 97, 72,113, 58, 2, 54,106, 59,177, 51, 29,142, 71,137, 93,141, -162,224,246,234,201,238,119, 58,157,208,177,195,197,129,136,149,235,124,178, 88,166,195, 96,154, 22, 77,239,103,250,245,122,189, -102, 24,134, 89, 37,255,187,175,191,153,199,162,119,119,119, 28,143,194, 0,159,198,232,139,197, 66,222, 59,233, 26,211, 62, 1, -106, 52, 90,201, 94,218,132,167,245,139, 8, 20,159,219, 23,229, 62,242,179,183,252,124,141,130,214,194, 97, 56,251,190,207,119, -162,147,254, 66, 77,137,142,105,213, 99,149,150, 98, 35,248, 51,142,191,100, 86, 27,155,205, 69,160,120,201,159,166, 68, 70,201, -193, 42,171,159,130,207, 55,119,124,249,230, 21,206,121,156,143,216,188, 96, 85, 46,104, 58,185, 39, 46,175, 94,205,187,206, 58, -129,124, 38,118,126,158, 25,246,135, 35, 93, 39,186,133, 97, 24,184,190,190,150, 85,199,181, 63, 67, 78, 63, 21,149,104, 89,131, - 76, 22,179,139,139,181, 76, 40, 99,162,198,165,207,108, 18,126, 22, 69,193,227, 86, 92, 13, 74,117, 51, 72,232,112,216,179,219, -109,233,221,200, 48,116,140, 99,178,144,142,142,102, 18, 54, 42, 32,106,186,161,231,212,117, 2,133, 10,162,225,240, 65,186, 43, -131, 73,209,216, 82,244,196, 24, 24, 6, 1,216, 60, 57,144,106,148,138, 60, 62, 62,162, 18,249,110,234,198,149, 82,188,122,245, -138,135,135,135,249, 26,155, 88, 8,101, 89,242,241,227,199, 89, 61,255,227,143, 63,202, 90,105, 24, 24, 6, 17,205, 45,202,197, - 60, 42,215, 74,225, 82,122,153, 27,100,178, 70,240,207,104,134,126, 28,102,184,149, 39, 98,180,165,233,218,196,252,144,207,108, - 82,193,159, 71,212,230,185,157,133,219, 2, 38,219,243,151, 63,253,153, 15, 63,255, 68, 81, 20,108,214, 53,203,101, 77,239,188, -136, 12,251,158,193,133, 4, 72,146, 48, 29, 77,192, 69,143,209,138,186,170,185, 92,175,216,250,129,174, 61,208, 52, 71,110, 63, -125,166, 94, 45,169,235,146, 50,183, 56, 63,144,103,165, 36, 10,170,136, 27,122, 17, 10,134, 8, 94, 82, 28,155,174,127, 90,107, - 18, 33,122, 52, 17,163, 60,206, 13, 28,142, 59, 46, 54, 87,103, 19, 54,131, 54, 5, 85,189, 6,229,248,225,167, 95,121,247,234, -146, 23, 47, 94,202, 58,218, 79,118,235,241,201, 10,217, 52,180,167, 99, 66,141,107,214,139,154, 24,101,218,243,184,111,168,151, - 11, 94,188,254,146,160, 44,109,215, 97, 23, 85,129, 49,122, 38, 87,121,239,201,140,226,216, 52,108,183, 91,178,172, 72, 35,210, -240,108,252, 22, 60,130, 89, 12, 10,131,140,218, 99,244, 41, 57,198, 61, 19, 61,249, 32, 81,148,168, 48, 83,168,138,162, 32,104, -131, 46, 34,144,147,231, 79,194,142,113, 28,209,177,225, 97,127, 34, 55,150, 23,151, 87,100,214,112, 89,172,200, 46,150,188,123, -253,130,235,213, 2,173, 70,246,187, 59,178,220, 48, 14, 30,147, 89,170,202,160,116,160, 90,150,201, 14,116,139,213,154,152,105, -122,167, 41,179,156, 60, 51,216,168, 9,195,200, 56, 70,180,181,228, 88, 76,166, 48, 74,184,203, 56, 79, 28, 35, 85, 97, 40, 42, -121,200,222,239, 91, 54,155, 13,247,251,247, 73, 80, 23,192,123,118,205, 81, 64, 20, 4,202,188,160, 29,122,241,135,163,104,251, -129,253,169, 65, 41,147,186,173,145,209, 15,212, 85, 65,102, 13, 58, 90,220, 48,226,156,248,185, 29,145,195,233, 72,223,183,172, -234,130, 48,180,140,169, 64,209,153,165, 25, 4,172,211, 5,205,169, 25, 24, 93, 67, 12,130,198,181,214, 82, 23, 57,101,102,207, -186,232,128,138, 1, 77,148, 81,187,247, 68,229,112,195,200,232, 29,131,235, 49,249,147,207,124,186, 64, 39,149,250,228, 51,159, - 14,236,243, 3,220, 24, 81, 56, 79,191, 55,141,212,206, 65, 39,147, 40,110, 94, 73,156,117,147, 33,137,102, 72,135,192,180, 19, - 62, 71,213, 14,195,240, 12, 31,123,110,153,243,222, 11, 42, 51, 10,220, 98,202,130,238,123,185,249, 66,154, 44, 41,155,205,177, -154,213,162,162,216,172, 0, 69,211,203, 53, 83, 46,215, 96,115,142,221,128,213, 30, 77,160,204, 50, 90,163,105,247,178,115,188, - 88,175, 88, 46,151,156,186,150,178,168,184,121,216,178,125,220,163,109, 65, 94,212,100, 42,163,111, 3,104,131, 75,209,153,211, -104, 60, 16,201,107,225,164, 47,139,122,126, 45,152, 82,178,196,155, 46,101, 2,200, 4, 35,207,114, 84, 94, 80,102, 57,219,237, -150,110, 28, 25,218,110, 6, 92, 44,202,138,190,105,185,191,185,101, 28,251, 25,118,210,187, 62,217,195, 4, 33,172, 53, 12, 67, -138,111, 84,138, 60, 51, 4,147,216,243,130, 64, 18,138, 94, 94,224,220,147,128, 74, 41,206,186, 81, 55, 31,230, 50, 61,208,243, -254, 87,172,107,157,168,238, 66,124,150,243,110,173,198, 24,197,216, 15,179,134, 35,166, 2, 71,232,146, 6, 19, 45,163, 79,110, - 6,109,200,242, 76,128, 58,133,157,167, 76,130, 14, 29, 83,161, 8, 89, 97, 49, 99,206, 48, 74, 1,252,225,211, 71,190,249,242, -181,208, 18,135,129, 24, 37,225,173, 40, 10,182,143,123,150, 43,201,222,190,127,220,145,231, 57,155,205,154,182,109,232,219,150, -205,213, 21, 33, 74, 0, 8,209,203,115,193,218, 4,161,217,205, 40,214, 41,135,221,123, 79,215,246, 28,143, 71, 25,167, 18, 5, -133, 75,156, 39, 19, 79,137,131,118, 30,201,123,247, 84, 48,207, 17,154,200, 58, 78,132,113, 2,205,209, 9,111,221, 37,215,200, - 4,162,153, 68,135,226, 32, 2,165, 69, 16,172,162,198,245, 50, 89,213,233, 94,210,134,164, 48,151,251,215,230, 25, 38,123, 90, - 9,228, 73,100, 57, 89, 28, 79,167, 19, 87, 23, 23, 40,165, 88, 44, 22,233,158,238, 40,138,146,178, 20,109,208,205,205,205, 92, -160, 76, 66, 81, 99, 50,138,194, 72,116,105,240,244,219,145,207,119,183,120, 63, 38,242, 96, 90,177, 69, 63,107, 43,196,230,150, - 4,181,153,100,112, 76, 43,220,112,102,121,187,184,184,144, 41,201,122,205, 42, 93,219,198,200,235,123,243,230, 13,135,195, 65, - 40,154,255,252, 79,236,183, 15,252,254,247,191,231,250,250, 90, 2, 91,138,138, 81, 43,186,182,193,165,107, 75,197, 18, 77,192, -187,145,182, 57,162,195,128, 31, 10, 74, 27,185,186,186,224,112,216,242,233,243, 7, 14,199, 29, 88,184,187,187,225,250,250,154, -183,175, 94,178,223, 31,103,111,124,235, 6, 41, 12,220, 40,207,250, 74, 34,106, 67,136,146, 54,167,196, 5,102, 51, 67,161,114, -108,223, 73,211, 53,118,228,101,205,208,123, 8,162, 51,240, 17,202,172,226,238,254, 51, 86,137,237, 47,203, 12,139,186,192, 22, -249,108,123,172,234,146, 97,168,105, 7,137,204,237,186, 70, 70,238,233,243,184,125,104,136,106,228,250,234,138,205,197, 75,177, -180, 41, 37, 89,188, 50,110,237,176, 86,246,114, 1, 1,117, 76, 35,145,169, 51,159, 21,176, 81,104, 85, 6,241,155,146,110,248, -185,155,215,231,106, 96, 5, 41,138,209,121,135,181, 50,242,206,170,138,251, 67,139, 31, 12,177,144,124,229,206, 57, 14, 77, 75, -163,123,238, 30,182,212,245,134,172, 52,180,163,160, 7,139, 92, 83,230,134,186, 50,224, 60,174,148,215,123,219, 61,144,155, 2, -165, 45,167,182,147,236,224, 94,132, 32,139,170,130, 32,197, 5, 26,138,122, 37,227,212,193,205,241,120,218,106,148,242,140, 78, - 33, 28,160, 40,113,144, 41, 81,172,237, 71,222,191,255,192,246,241,196,175, 31, 62, 83, 93, 92, 17, 77, 70, 63,122,110, 62,125, - 34, 6,136,126, 96,181,172,249,235, 79,191,240,242, 52,160,140,168,207,239,239,183, 51, 41,172,239, 91,220, 56, 18,189, 64, 70, - 78,167, 35, 93, 47, 15,140,186,174,209,131,103,191,223,115,220,239,168,138,156,254,116,100, 81,151,188,121,243,134, 92,103, 52, -237,158, 67, 55,160,178, 26,101, 21,165, 45, 37,137, 42, 29,116,231,168,215,190,239, 41,139, 2,149, 91,178,104,240, 22,108,166, -137, 81, 30, 36, 93,223, 51,250,129,194, 20,226, 53,142, 14,239, 98, 10,227, 41,229,223,182, 32,226,113,163, 0, 30,220, 24, 8, -209,225, 92, 76, 15, 47,149,146,223, 28,227,216,211,247,162,230,159, 44,116,114,221,120,140,201,146,104,196,167, 76,128,140,209, - 11, 11, 25, 35,116,164,209,245,196,240, 68,166,155,108,113,217, 25, 83,250,156, 44,231,188,195,102,133,104, 2, 66,100,153,213, -104,109,105,135,158,161,119, 79,112,153, 20, 58,163,141,198,133,136,241,224,162,163, 88, 46,104,187,129,159,223,127,158,139, 16, -171,225,205,139,107,150,151, 27,186,246,136,239,123, 54,155, 13, 95,127,245, 37, 74, 41,254,250,243, 47,172,215,107, 62,222,222, -209, 13, 30,112, 20,133, 71, 27, 43,221,250, 48,206, 59, 90,165, 34,139,101, 77,147,126,125, 60, 52,244,167,128, 27, 70,180,234, -201,243, 12, 31, 53,135, 99,115,134, 92, 85, 51,191,126, 76,191, 23,130,227,120,148,156,123, 99,158, 10, 46,157, 9, 69, 43, 32, - 34,174,245,197,102,238,148,142,109, 51,223,139, 82,236,149,228, 73,220,211,247, 61, 62, 4, 48,210,181, 89, 34,109, 27,230, 12, -233,115,141,130,216,215,192, 35,164,199, 39,241,163, 0,107,108, 54, 57, 30, 52,222, 50,239, 68, 39, 27,211,180,190,201, 18,102, -149, 16,159,165,188,161,210,123,214,162, 74,232, 19,158,179,239,123,250,113, 16,240,203, 48, 48, 58, 71, 84,154, 66,231, 73,133, -237,136, 88,246, 93,224, 52, 4,222,188,120,197,241,216,176,127,220,225, 99, 75,181, 88,115,106, 58,154,166,225,197,139, 23,124, -250,244, 9,215,119,188,123,247,142,174, 61,241,203,175, 71,172,201,185,186,170,185,189,149,232,233,203,171, 43,238,238,238,208, - 90,243,167, 63,253, 73, 60,247, 62,208, 14, 61,227,224,230, 34,103, 82,157,219, 60,195,141,195,252, 30,158,210, 9,197, 54,165, -149, 69, 27, 43, 76,238,200, 44, 8,156,174,235,201,217, 49, 58,121,150,206,107,206,179,255,149, 41, 80, 37,119,210,193,247,105, - 74,230, 99, 4,239,168,138,196,103,143,158, 44, 75, 68,207, 16,136,137, 0,154,101, 25, 99,122,190,100,214, 10, 73, 47,203, 25, -199, 97, 46,158, 79,167,147,228,203, 55, 13, 67,215,241,184,223, 83, 37, 86,197, 55,223,124,195,118,251,192,229,229, 37,175, 94, -189,226,243,103, 9,190,145,253,188,227,242,114, 51,171,226,155,166, 65, 27,249,153,147, 70, 40,203,114,226,220, 16, 6,209,186, -100, 66,126,180,214, 98,179, 64,189,216,204,194,183,170,170,120,249,234,154,211,177,101,181, 90,177,217,108,184,184,184,152,249, -231,135, 99,195,246,241,128,177, 5,175,223,125,193, 87,239,222,242,238,205, 75, 92,140,244,157,192,200,172, 2,188, 67, 33,247, -144,252,252, 56,179, 52,198,177, 71,159, 52,163,235,121,253,250, 53,221,208, 19,186,158,122, 37, 5,196, 15,223,127,207,213,213, - 21, 47, 95,190,228,215, 95, 63,240,226,133,216,151,243, 60,103, 89, 11,155,193,245,114,127, 87,101,145, 50, 25, 50,130, 10,100, - 78,161,163, 70, 41, 9,114, 81, 72, 99,178, 92, 95, 50,244, 34, 64,204,139,146,227,177, 33,183, 22,109, 75,126,121,127, 67, 81, -175,120,251,234, 90,236,124,195,128, 54,240,242,106, 61,147, 89,243, 65,214, 98, 77, 59,206, 46,177,188, 90, 50,120,203,221,253, -227, 83, 65,157,229, 88,109, 51,114,107, 9,206,211, 13, 35,198,203,151, 98, 20,172, 19,119, 88,232, 86, 82, 61,186, 41, 29, 42, - 23, 1,198,100,122,137, 74,167,139,219, 36, 28,212,153,210,178,111, 9,126,228,226,114,141,247,142,195,254,145, 87, 47,174,200, -203,154,227,233, 19, 86, 27,246,251, 6,187, 18,216, 71, 53, 74,103,217,122, 80, 81, 49,250,128, 85, 2,139,177, 42,240,120,255, -145, 87, 23,223,128,118, 44,150, 21,101,189, 36,152,130,125,211,113, 60, 14,168,188,132,144,209,184,145,247,119, 59,214,139,142, -223,127,253, 37,133,146, 93, 79,244,129,193,203, 8,215,247, 45, 23, 23,235,116,216, 25,186,232,232,181, 33, 51, 5,195, 16,112, - 49, 98, 84, 96,189,185,166, 94, 62,242,240,227, 7,190,120,251, 38, 9,206, 12,135,227,137, 62,104,110, 31, 79, 92, 95, 93,240, -254,102,203,246,228, 57,245,159,217,108, 54, 56,183,151,209, 73,138, 44,172,106,177,188,124,110, 27,238,238, 30,104,218, 65, 42, -176,209,209,181, 3, 1, 24,199,158,178, 42,208,214,242,213, 31,254, 64,215,117, 28, 93,128,177, 99, 76,226, 49,101, 51,154,238, -148,196, 80, 26,173,159, 48,189,206,185,196,209,142, 24,163, 25,134, 62, 37, 96, 69,198,182, 79, 69, 87, 36, 43, 53,174,141,180, -199,227,188, 59,213,218,208, 28,122,154,195, 17,173, 21,139,197,146,182,109, 18, 21, 80,244, 20, 74,129,214, 34, 86, 27,131,140, - 26,181,178,140,174,199,141,225,201,178, 99,213, 60,209,153,254, 29,131,146,152,207,160,136, 42, 96,109,206,208, 15,132, 32, 59, - 62, 99,173,164,248,133, 0, 10,108,110,240,193,145,217,140,171,205,229, 76,197,154,210,187,242,212,133,159, 91,242,178,162,146, -135,171, 54,232, 66,144,194,243, 14, 94, 73,145, 25, 92,160, 31, 3, 33,209,244,138, 50, 67, 43,240, 78,188,180,199,230, 64,119, - 60,224,251,158,151,175,126,199, 79,239, 63,177, 90,173,200,203, 37,167,206,209,156,122,242,186,146,174, 41, 58, 46, 86, 43,168, - 46, 48, 58,144, 89,203, 98, 89, 96,122,207,114,189,166,172, 42, 78,221, 73,130, 88,130, 34,179,150,102,191,149,247, 25, 3,175, - 94, 94,207, 83,137,105,255,152,105, 67,212, 18,130,113,119,119, 55, 31, 0,168,167,207,221,123,207,169,235, 25, 83,202,219, 52, - 22,206,178,140, 49, 41,200,197, 67, 59,130,177,132,105,125,225,196, 68, 54,166, 3, 51, 4,209, 28, 8,153, 47,127, 6,155,177, -214, 82,102,178,151, 44,138, 98, 30,245, 26,163,201,114,195, 98, 81,209,247, 45,101, 89,203,207,203, 51,234,122, 57, 91,134,140, - 78,201,114, 77,155,118,140, 41, 50,212,245, 60,238,238,137, 65, 97,178,140, 24,195, 28,222,179, 63,157,120,120,120, 96,179,190, -228,167, 95,222,115,113,113,129, 10,145, 74, 23,252,229,135,143,120,239,168,138, 18,231, 6, 50,171,248, 47,255,248, 3,255,231, -255,254,134,161, 57,241,246,213, 53,223,255,240, 35,139,213, 5,117, 93,179, 61, 28,121,241,250, 21, 47, 46,215, 20, 38, 96,227, -192,186,174,248,226,171,111, 56, 52, 45, 95,191,124, 69,140,145,135,237,142,113, 28,121,245,234, 21,215,175, 94,178, 77,249,225, - 70,105,176, 22,165, 37, 42, 58, 38,183, 75,150,139, 71,249, 98,189, 38,164,162, 49, 36,219,216,232,197,237,147,167,168,207,221, -238, 17,148,104,150,148, 10,248,113,164,176, 1, 91,101,228,101,133,243,229,252, 93, 77,228,182,182,109,231,201,101,140,145,177, -239, 81, 33, 80,165,177,249,228,143,206, 44, 41,202,152, 52,165,145,235, 94, 41,205,113,215,112,177,186,100,183,221,243,250,245, - 75,116,136,220,223,220,178,250,166,226,242, 98, 45,147,216,194, 18, 53,152, 44,227,253,199, 15, 92,110,174, 88,174, 55, 52,199, - 19, 87, 87, 87, 40,147,241,233,230,150,139,139, 75,190,252,242, 43, 22, 85, 45, 43, 21, 60,203,186,194,102,242,236, 49, 40, 30, - 30, 30,248,248,241, 35, 74,169,217,122,150,231,185, 20,126,233,121, 48, 29,220,101, 94, 96,140, 98,185,170,113,110, 72,227,254, - 58,173, 8,100, 85,183,223,237,121,255,254, 61, 31, 62,127, 38,179, 5, 69, 81,137,234,223, 39, 70, 9,142,171,149,225,143,127, -248,154,230,212, 17, 11,147,156, 5, 39,138,162,224,254,113, 75,136, 34, 56,141, 81, 38,171, 99,132,227,169, 97,177, 88,176,235, - 58,186,247, 31, 82,234,103,195,245,235, 55,220,222,222, 82, 47, 86,220,223, 62,240,238,221, 59,172, 54,116, 77, 75, 76,147,148, - 73,147, 50, 53, 26,117, 93,178,221,110, 41, 76,142,115,105, 82,219,119, 51, 44, 74,245, 35,245,114, 37,103,165, 53,184,224,249, -245,195,123, 50, 91, 80,215, 37, 95,188,251, 29,119,159,223,243, 95,255,241, 95,217,125,125,192,228, 5,139,202, 96, 99,224,110, -123,207,106, 81, 73,145,157,114, 30,140,178,156,246,123, 50,109, 40, 12,172, 23, 25,109,103,216,239, 31,184,188,184,166,113, 35, - 54, 42,200,108,134,154, 18,121,166, 92,102,253,148,105, 43, 74, 79,139, 3, 76, 22, 25,137, 66,239, 50,138,220,102, 50,126, 74, - 91, 28,151,196, 66, 83,184,134,214,154,122,185, 96, 28, 58, 78, 9,106,147,231, 57,203,101, 77,158,215, 16, 34,199,253,137,101, - 45,255,173, 42,115, 22,155, 11,186,174, 99,113,121,141,138, 57,132, 17, 21,158, 4, 92,163,107,201,203, 12,173, 12,251,253, 17, - 99, 51,202, 69,206,174, 15,188,255,240,145,187,199, 3,117,181, 36,203, 13, 63,252,252,129,127,255,183,127, 36, 43,106, 84,244, -104, 61,204,137, 77,147,141,161,119, 35, 46, 38,114,154,182,140,126, 16,225, 89,132,118, 28, 41,108, 69, 12,208, 12,178,175,241, - 67,160,117,247,156,250,129,211, 16,132, 66, 55,120, 62,223,222,210, 37,234,146, 53,142,219,251,247,188,121,117, 73, 94, 86, 84, - 69, 65,153,186, 19, 93,166, 21, 70, 84,108,119, 13,152, 41, 87, 56,224, 93,192, 68,155, 62,163, 37, 55,183,183,114,160, 38,171, -132,119, 17, 99,123,193,229,134,145, 67,215,145,101, 54,113,153,253, 60,254,158,112,139, 19, 98,116, 38,134,157,169,212,229,226, -180,115, 66,210,212, 1,207,201,121, 89, 70,211, 52,243, 56,126, 2,143,204,163,217,232,231,157,237,116,157,156,131, 46,206,133, -113,191,165,198, 77, 83, 28,157,217,103,187,252, 41, 41,105, 24, 92, 10,222, 88,206, 55,210,185,159,219,185,100,233,234,135,103, - 22,185,105,252, 57,117, 77,211,231, 50, 29,234,211,248,115,154, 54,217,114, 33,172,116, 15, 62, 12, 88, 34,168, 48,119, 83,110, - 28,208, 38,163,237, 6,108, 54, 48, 12, 66, 70, 51,153,149,107,116, 89,115,125,181, 97, 81, 22, 60,220,239, 49, 49,112, 31,239, -121,184,187,231,242,197, 75,134,161,227,112, 60,210,116, 3, 89, 86,240,226, 98,195,106, 81,177, 40,172, 8, 39, 83, 16,196,116, -168,143,125, 79,115, 58,112, 72, 52,182,135,135,187,148,118,183, 36, 47, 37,212,161,237, 78,244,163,248,102, 81,162,182,143,137, -177, 16, 20,216, 34, 23,171, 84,242, 6, 79,162,171, 62, 49, 9, 48, 26, 99, 52, 81,171, 39,250,227,121,198,122,210, 63, 76,129, - 78,198,104, 50, 99, 33,133, 31,201,142, 57, 50, 14,154,237,237,199,167,181, 75,140, 9, 46, 35, 34,217, 97,112,243,218,102,236, -135,121, 13, 99,140, 65,197, 64,219,119,146, 48,101, 45,202,136,141, 47, 76,138,123,109, 25,189,227,235,111,191, 73, 73,101, 59, -154,148,189,224,156,195, 46, 44, 69,185,228,212,157,184,185, 63,114,123,255,192,183,223,126,203,221,231,143, 92,174,215,116, 93, - 75, 94,149,178,162, 26, 71,170, 66,236,173,199,195, 30,231, 60,198,228, 84,213, 83, 96,201, 50, 69,200,118,157, 64,119,190,251, -238, 59,254,252,151,127,149,201, 72,211,160,148,228,135, 23, 89,142,177,242, 25,141, 93, 79, 85,148,179, 88,208, 71, 37,147,170, -190, 35,250, 56,175,129,150,203,101, 26,205, 70,110, 62,125, 16,209, 87,158,113,117,177,166,115, 17, 6, 55,135, 38,157,195,149, -206, 3,147,206, 61,220,147,200, 48,203,141,172,213, 84,192, 59,149,166, 1,102,206,173, 7,205, 97,119,160,174,107,186, 83,199, -245,245, 53, 93,115, 18, 10, 32,145, 60, 65,185,198,113,164,233, 90, 78,173,172, 9, 47, 47, 47,185,184,186,228,197,171,151,220, -223,222, 49, 12,142, 79,159, 62, 73,176,202,205,141,184, 50, 8, 88,171, 25,198,142,113, 28,112,253, 48,239,225,223,188,121, 51, - 23,132, 77,211, 64, 7,222, 31,230,247, 55,110,215, 97, 0, 0, 32, 0, 73, 68, 65, 84, 56,175,112,163, 35,179,144,105,197,161, - 57,225,210, 14, 60, 6,133,143,176, 90,110,120,241,250,213,108,231, 60, 54,146,152, 87, 47, 86,148,121,129,181,154,171, 43, 1, -221,188,127,255, 30,133,225,226,226,146, 87, 47,175,249,235, 79,191,112,181,185, 72, 99,107,207,152,198,217, 54,207, 18, 57,212, - 81,106, 97,216,215,203, 37,251,195,137,207,159, 63, 66, 80, 44,214,155,249, 90,253,238,187,239,248,248,241, 35, 99,194,165,143, -157,195, 15,146, 45,160, 8,216, 44,163, 94,228,140, 67, 71, 76,255, 77,110, 51, 28,145, 94,129, 27, 6,218, 83,131, 75, 86,101, -173, 45,125, 18, 66,238,118,134,119,175, 94, 83,175, 46,201, 15, 7,126,249,120,131, 49,154,255,248, 31,255,150,139,245,134,159, -127,250,158,248,242, 37,153, 57,119, 18, 13,232,169,121,142, 35, 70, 71,190,249,242, 53,255,253,159, 31,249,245,215,239, 41,171, - 5,214,159,229, 40,159, 51,217,139, 44,199,100,249, 51, 20,171,181,150, 81,188,108,105,199,102,228,193,146,114,155, 99, 74, 93, - 10, 81,190,148, 24, 99, 82,232, 89, 98,112,184,161,199,106, 69, 89,137, 18,114,177, 94,243,242,213, 53, 15, 15, 15, 84,117,134, -177,242,192,209, 54,227,216,108, 33, 26,170,178,130,193,203,223, 29, 3,135,174,101,191,149,204, 99,173, 2,219,199, 29, 15,135, -150,221,177,231,225,216,241,254,211, 45,183, 15, 59,242,188,144,189, 82, 81,241,226,213,107,116, 94,224,218, 35, 0,141, 11, 88, -165,105,187, 22,173, 21,131, 50,233,198, 25, 9, 78,212,181, 74, 69,218,126,100,127,106,120,145,215,168, 90,113, 28, 6, 62,109, -143,180, 3,152, 12,134, 0, 62,128, 79,221,171, 79, 35, 54, 27, 28,214,100,228,165,229,230,110,203,178,206, 24,235,154, 62,147, -241,215,178, 94,160,181,162,239, 59,222,126,249,133,248,203,211,238, 50,207, 74,116, 38, 29, 85, 55,244, 44,150,213, 12,233, 17, -126,182, 56, 20,164,179, 46, 24,157, 67, 27, 25,243,105,173, 49, 40, 84,202, 54,206,243, 28,165,159,196,107,231,118,163,233,225, - 26,210,142,123,170, 60, 39,129,148,181,150, 44,207,161,239, 37, 86, 49,137,183,226, 48,204, 7,128, 82,242,112,115,222, 75,172, -166, 82,100,121, 78,145, 56,211,192,236,121, 61, 39,208,157,175, 9,154,227,241, 25,207,125, 72,129, 21,206,201,195,237,152, 24, -220,231,197,200,180, 95, 13,114,177, 61,179,226,157, 91,226,126,235,143,159,148,248,211,193,174,148,124, 94, 33,189, 46, 99,204, -156,112, 54,246, 98,117,186,216,172, 89, 44, 42,238, 13,248, 32, 93,252, 56,142,212,117,197,177, 21,129,219,175,191,254,202,183, - 95,125, 77,158,231, 60,220,124,230,186,200,121,251,246, 45, 38, 47,104,123,249,121,139,197,147, 10,120, 42, 62, 78,167, 35,104, - 77,230, 28, 85, 85,113,121,121, 57,167,177, 77, 42, 95,239, 35,230, 44,176,163,107, 7,162, 50,104, 45, 34, 41, 31,131,216, 65, -173, 38,183, 26, 63, 6,154,227,126, 22, 25, 74, 32,139,153, 5,120,211,103,233,189,135, 32,251, 88,129,151, 60,191, 70,166,207, -109,142,228, 69,137, 16,214,249,185,104,204, 50,177, 44, 21, 69,193,254,116,146,145,123, 94, 18, 2, 44, 86, 75,154, 83,162,210, - 1, 89,145,138,188, 36,152,235,251,118,254,126, 70,239, 88,148, 75,148,210,244, 78, 72, 98,211, 68,162,235,186, 25, 63, 92, 20, - 5,155,141,176,217,125, 20,148,104,185, 40,217, 29,182,252,211,159,254,133,111,254,143,255,196,237, 63,222, 82, 45,150,180, 77, -203,106,115,205, 48,202,103,113,121,113,193,208, 55,140,163, 63,131, 40,217,153, 20, 55, 21,172,162,129, 80,188,123,247,142, 23, - 87,215,220, 61,220, 99,173,158,167,150, 70, 41, 22,139, 90,198,230, 99,207,110,155,192, 39, 74, 97,149, 88,131,213, 32,249,244, -227, 32,182,203,205,102, 77, 85,150,100,153,225,225,238, 70,158,135, 81,212,244, 22,113,175, 76,197,234,116,223,158,139,196,206, -217, 14,231,248,228, 44,179,137,164,239,165,173,154, 0, 40, 90,165, 93,188,231,216,156, 40,235,146, 99,219,112,109, 46,121,249, -250, 21,159, 62,125, 20,113,116,150,201,159, 75,223,245, 20,177, 60,157, 1,227, 56,162,140,230,250,250, 90, 28, 16,233,250,184, -185,185, 33,120,209,228,200, 8, 61,155,167,100,199, 97,228,225,120,194,253,203,159,196, 38,151,229,207, 52, 50,207, 44,146,209, - 83,151, 25,203,122, 49,175, 35,150,203, 37,125,223, 81, 47, 86,188,126,253, 58,173,223, 44,139,197, 83,113,126,121,117,205,106, -185,196,234,200,215,111,175,233,251,158,235,235,107,118,143, 7, 62,125,250, 68,211,246,115,128,215,148,133, 97,242,132, 21, 79, -170,255,221,238, 64,110, 13, 89, 85,114,121,241, 18, 55,142,236,247,143,148, 89,137,213,240,112,119,195,122, 89,179,172, 75,242, -164,188, 95, 46, 23,184,174, 39, 88, 77,145, 91,154,230,200,219,215,175,184,188, 88,242,235, 47, 31, 68, 93,175, 69,132,234,199, - 1, 55,136, 93,217, 13, 29, 46,104,121, 22, 91,141, 81,162,157,232,251,142,247,239,127,165,239, 4,134,164, 85,228,230,254,158, -247, 31, 62,177, 40,191,161, 42, 87,116,221,136,174, 75, 50,155, 99,237,200, 56, 38, 1,167, 23, 4,246,245,171, 87,140, 33,242, -245,187,215, 12,195, 53, 31, 63,126,198,126,248,240,129,162, 40,102,155,129, 62, 19, 45,157,223,224,211, 67,239,188, 8,144,223, -179,226, 75,143,162,102, 38,168,180,111,151, 81,109, 85, 21, 73,217, 42, 35,171, 76, 27,250,190,149,188,233, 40,190,198,162, 44, - 1,143,206,114,180,209,140, 94, 58,127,239, 35, 38, 68,218, 20,217, 23,163,167, 61, 30,216, 62,236, 57,182,162, 94,141, 38,103, -183, 63,241,211,135, 91,238,119, 7, 30, 79, 3,251,227, 64, 96,192, 5,248,119,223,125,137, 45,107, 78, 93, 79,110, 51,174, 55, -215, 2, 98, 8,145, 33,117,138,170, 42,233, 78, 13,237,169,157, 15, 52,163, 13,199,177,227,177,237, 96,127,160,137, 57,157,143, - 20,171, 26,227, 3,121,189, 32,203, 10, 17,236,160,146,119,122,164, 75, 74,245,186, 42, 82, 42,146, 65, 37, 5,173, 49,138,122, -185, 98,177, 94,226, 93, 96,140,145,168, 2,171,205,134,186, 44,233, 6,161, 98,157,218, 99, 26, 71, 39,134,114, 33, 35,103, 31, - 53,101, 81, 48, 12,178, 23, 53, 70,179,217,108,158,101,109, 79,157,151,115,110, 78, 72, 59,239,224,167,117,202, 36,110, 27,210, -200,243, 28,239, 58,171, 83, 83, 65,247, 91, 96, 76, 60, 75, 70, 27,210,175,167,131,122,234,130,167, 7,241,164,176,157, 66, 36, -126,219,185,187,248,100,104,155,126,182,188, 23,121,125, 93,223, 63,179, 73, 77, 86,184, 41,151,123,232,250,255, 33,210,245,124, - 28,127,158,247,126, 94,208, 88, 43,129, 30,206, 43,108,148, 44,232,204,102,242,144,117,142, 48, 12, 4,239, 40,172, 73,150,155, - 4, 92,178, 10,107, 43,138,170,100,117,177,225,213,171, 87,220,220,136,176,166,200, 45,139, 34,231,203,111,190,166,107, 7, 30, -118,123,238, 30,118,108,140, 37, 43,170, 57, 32,228,176, 63,193, 52, 41, 80, 34, 76, 58, 30,143,108,183, 91,140, 49,156, 78, 39, - 14,135, 3, 81, 49, 39,119, 77,187,240, 83,219,207,202,255, 60, 29,150,159,111,111, 80, 17,170,186, 38, 51,150, 99,115,194, 40, -177, 40,217, 84,212,101,105,135, 25,125,192,235, 32,171,137,179,116,184,249, 32, 15,114,120, 43, 12, 74, 11,108,134,248,116,207, - 71,255,212, 57,202,161, 46,215, 91, 53,250,244, 29,137, 62,226,176, 63,113, 58,157,102,213,175,208, 21, 21,193,249, 89, 1,190, -217,108, 88,173,175,196,227,156,158, 65,180, 82, 4,250,192,179, 67, 61,248, 49,169,173,171,249, 26, 38, 41,185, 93,107,249,249, -151,247,236,246, 71,208,134,166,109,113, 78,161, 9, 84,101,142,235, 59,236,197,130,162,200,229, 53, 13, 14,215, 13,248, 32,208, - 20, 17, 91, 70,108, 86, 48,142, 61,109,219,177,168, 42, 94,188,120,193, 79, 63,253, 52,219, 7,125,112,248, 65, 50, 31,170,170, - 96,181, 90,176,127, 60,200,117,173, 51,116,166,196,182, 27, 18, 45, 45,137, 76,199,209,161, 85,143,214, 69, 82,111,139,176,179, -235, 58,162,202,158, 21,164, 19,136,101,186, 23, 38,145,214,116,255,156, 43,242,103,135, 17,147,199,221,206, 78, 18,166, 24,226, - 24,230, 40,223,251,251,123,190,254,230, 75, 62,126,252, 64,136, 79,110,135,195,225, 48, 23, 55,211,115, 97,226, 65,236,247,130, -112,109, 79,242,231, 14, 59, 89, 83, 88,163,168,138,146,110,144, 0, 48,173, 20, 70,103,243,174,125, 76,248,227,182,105, 80,169, -136,214, 42,202,186,106,182,172, 90,198,193,209,169,145,178,172,201,179, 74, 50, 16, 14, 59,234, 36,218,123,247,238, 29,151,221, - 41, 69,202,202, 51,226,226,226, 66,146, 11, 75, 75,161,224,195,175, 63,243,230,205, 59, 30,183,114, 29,157, 78, 39,170,178,230, -151, 95,127, 69,103, 57,101, 81,113,117,125,205,177,109, 0, 41, 34,155,166,193, 26,195, 41,137, 30,151, 85, 73,119,178, 73,247, - 35,186,142, 41, 83,254,213,171, 87,172, 22,130, 75,119,195, 72,140, 75,177,227,154, 72,223,158, 88,175, 87, 68, 4, 74,163,141, -145,102, 24,225, 25,220,220, 61, 50,140, 14, 29,131, 68, 20,171,136,178,130,145,205,179, 12,140, 88,222,178,205,154,213,162,164, -107, 15,252,211,191,252,133,224, 60,191,255,246, 75,134,190, 35,120, 41,216,235, 90,172,218, 66,127, 21,151,214,105,255, 72, 64, -177,170,114,242,205,146,246,240,136,157, 0, 18, 15,251,180, 3, 3,242,204, 82,100, 50, 42, 94, 44,107,217,145,167, 7,106, 76, - 68,170,144,124,169, 97,234, 32,211, 67,106,112,194, 27,118,103, 93,161,196,154, 10,193, 77, 23, 37, 62, 6,238,182, 15,180,163, - 67,101, 21,202,104,246,167, 29,218, 84,210, 49,188,255, 32, 15,186, 83, 79,181,232, 56,157, 68,172,151,165, 28,241, 62,194,190, - 29, 89, 40,195,177,117, 68,147, 99,203, 26,211,121,140, 51,212, 58,199,100,150,177, 31, 56,244, 29, 63,125,248, 72,102, 34,175, -175, 47,209, 89,206,126,183, 21,202,211,208,179,185,188,102,244, 15,108, 31,238,230,131,104,126, 88,120,169,129,127,221, 30,177, -217, 7,154,193,115,241,242, 37, 69, 85, 19,149,193,152,140,227,110,207,122,189,198, 24, 35,145,126,227, 72,150,155,121,215, 91, - 85, 21,199,253, 78, 30, 38, 17, 78,109,199,169,109,232,251,145,118,104,185,186,186, 98, 56, 60,242,184, 11,180,221, 19,111,187, - 40, 36,195,119,183,127, 68,181, 41,185,201,228,120, 95, 51,122,151,124,208, 5,214,100,207, 56,235,211,195,121, 26, 35,158,251, -186, 39,107,206,116, 8, 79, 15,142,243,177,171,140,197,226, 12, 85,152, 59,221,233,208, 61, 59,164,167,135,184, 78,163,194, 73, -232,227,196,178,141,139,144, 87,245, 51, 50,217,185, 29, 42,198, 72,149, 23,207,252,236, 83,215, 84,150, 53, 85, 85,193,225, 9, -110, 50, 21, 25, 50, 85,144, 2,179, 76,105, 85,231, 80,150,243,174,230,188, 40, 57, 63,236,167,223,179,118, 90,195, 32, 10,116, -239,105,142, 39, 50, 21,102,152,203,241,176, 75,197,105, 72,158,226,200,118,247,192,230,234,154, 31,127,252,145,195,225,192,221, -231, 79,104, 21,185, 88, 46, 80,214,240,227, 15, 63,225,162,166,237, 7, 1, 0, 21,162, 36,174,138,140,190,109, 40,178,140, 16, -124,130, 13, 41,250,113, 72, 90,149, 50, 65,115,100,218, 49,133,164, 72,226, 84,196, 90, 63, 79, 89, 98, 20,155,141, 27,122,226, - 40,244, 42,163, 52,203,186, 34,183, 25,235,245,138,246,212,200,136, 54,120,177, 23, 1, 54,147, 52, 59, 81,111,155, 89, 43, 51, - 9, 98,149,138,130,137,214,176, 92,174, 19,231,224,121, 39, 63, 29, 64,209,201,129,125,245,226, 21,135,195,137,227,233,132,195, -115,106, 27,178, 44,103,117, 81,227, 83, 36,172,168,183, 61,223,124,243, 13,235,229,130,183,111,223,242,253, 15, 63,115,127,127, -207,221, 86, 2, 73,218,166,159,159, 51,115,166,118, 89, 66, 72,121,210, 49, 60,125, 30, 41,121,171,174,107,198, 99,203,231,219, - 45,223,252,254,143,252,235, 95,254,132, 49, 57, 15, 15, 15,148,245,154,221,110, 71, 93, 90, 46,215, 27,138,162,100, 8, 29, 58, - 58,124, 16, 4,243,100,145,147,130,210,147,151, 5,247,247,247,124,247,221,119,108, 86, 43, 57,236,172,161,105,122,249,156,198, -145, 49,113,201,203,178,164,235, 58,148,150,124,237,243, 20, 67,239, 61,171,205, 58,165,240,121,202, 66,184, 12,109,219, 63, 21, -186, 33, 62,179,126, 78, 5,231, 84,228,158,163,153,207,175,229,233, 16,142, 74, 12,149,115,247, 59, 63,147, 21,202, 26,124,140, - 12,110, 20, 43,223, 73, 14,176,122,181,100, 12,158,101,177,228,250,197,171,164,215,216,206,247,209,195,195,195,124,160, 77, 69, - 48,136, 37, 14,224,219,111,191,101,189, 90,176,217,172,200,173,162, 44,178,153, 96,151,167,149,209,207, 63,255,204,225,112,224, -219, 55, 47,103,190,132, 4,210,216,217, 82,167,149,165,172, 47, 25, 70,207,245,139, 75, 22,139, 5,171,197, 82, 20,222, 43, 17, -206,109,183,247,108,183,247,228,133,197, 57,177,114,158,142, 91,136, 3, 58, 46,249,239,255,242,103,222,189,121,195,203, 23,175, -249,245,151, 15,244,125,138,198, 53,130,127,125,216,237,229,103, 25,146,181,173, 96, 97, 23, 28,247,242, 92, 89,173, 86,156,246, -135,121, 58,210, 52,141,132,201, 4,207, 97,247,136, 77, 90,165, 93, 10, 36, 26,146,221,240,152,190,231, 85, 93, 83,213, 5,139, -133,132, 45,245,227,192,208,142,184,200, 12,236,241, 33, 74, 82, 98,140,184, 97, 76,208, 50,185,191,156, 27, 88, 46, 69,151, 50, - 6,193, 19,111,239, 79,252,245,167,247, 20, 69,197,171,171, 13,206, 39,189, 81,158,205,194,217, 16,101,162, 53,246, 39,222,190, -125,203,118,187, 99,236, 70,254,230,187,175,177,255,249, 63,255,103,118,187, 29,119,119,119, 82,177,181,221, 92, 13,180,109,139, -205,210, 46, 39,225,252,230,138, 62, 17,213,156, 27, 8, 81, 44,109, 50, 4,146, 3, 96, 26,217, 15,195, 64, 85,139,192,230,112, -216, 83,212, 5,203,122,195, 98, 81,225, 66,192,196, 72, 94,229,184,177, 0, 99,232,134, 14, 31, 27,188,143, 28,219,142,222, 43, -124, 52,228,121,193,114,179, 34, 83,129,205,213,134,125,239,232, 67,195,167,135, 71,202,178, 70,101, 37,203, 77, 70,182, 50,168, -228,111, 29,134, 94, 52,123,105,127,126,232, 6,218,155,123,110,110, 62, 11, 43,222,104, 70, 91,177,221,239,216,239,247,148,101, -129, 10,210, 41, 45,163,101,177, 94,179,189,189,165,237, 6,180,205,137,218,162,172, 4, 21,180,253, 56,171, 60,167, 64,134, 60, -207, 89,111,150, 79, 59,102, 43,149,238,169,109,147,117, 67,211,142,142,182, 61,137, 61, 39,179, 12,163,231,184,221,114, 56,156, - 48, 70,113,117,245,130,139,171,203,249,179, 83, 73, 53, 62,197, 87, 78,105, 87,179,127, 54,145,236,166, 67,245, 60, 54,117,122, - 72,156,119, 2,231,157,242,121,234,217,249,238,238,183,156,111,245, 63,217,183, 78, 15,249,233, 66, 59,127,224, 76, 7,243,116, -240,156,251,206,127, 11,167, 57,255,251,231,113,236, 56, 2,221,252,153, 78,239,247,124,132,255,219,236,247,169, 80,153, 94,203, -179,107, 53, 62,135,235,204,158,120, 39,145,173, 90, 41,130, 27,233, 92, 0, 55,130, 31,209,165,101, 81,215,232,212, 33,159, 79, - 68,246,251, 61,119,247, 91,153,150,100, 37,187,253, 35, 86, 65, 85,230,172,210, 46, 27,244,172,242,182, 40,148,201,101, 63,171, -149, 32, 77,157, 48, 25,148,177, 44,151, 75,209,157, 36,240,203,244,158, 66,178,242,148, 70,196, 69,243,131, 49,207, 89,175,215, -100,153, 68, 82,126,241,246,221, 60, 90,215, 90, 39,197,191, 79,120,202,171,153, 84,183, 88, 60,101,183, 79,118, 45,185,119,253, -156,150,246,100, 97, 19, 27,156,160, 46, 19,119, 32,234,103, 43, 28, 99, 12,221,105,160, 92,212,188, 93,110,208,166, 23,205, 65, - 18, 51,173, 86, 11,110, 31,238,103, 95,186, 82,224,188,120,136, 31,221, 56,147,195,218,182,165, 29,134, 57, 51,126,210,228, 76, -223,239,106, 37, 48,152,105, 15, 59, 29, 54, 19, 29,109,121,177,194,155,140,159,127,249,149,191,249,195,255,198,143, 63,254,136, - 49, 57,205,110, 79, 85, 46,232,135,129,187,219, 7,105, 82, 22, 11,138, 80,176, 81,150,126,240,196, 0,203, 74,172,188,199,182, - 33,183, 25,151,155,139,249, 90,253,253,239,127,207,237,237,109,178,159,245,160, 2, 89,102, 68,129,108,211,164,204,201,253, 25, -140,236,177,167,251,111, 34,225,137,104, 83,118,224,203, 98,153,136,110, 67,250,190,108,130,239,196,103,211,178,233, 51,158,166, - 68,211,235, 57,191,135,195,236,120, 49,104,107, 48, 8, 38, 90,165,123, 97, 26,169,135,137, 25, 79,206,251, 15,159, 88, 46, 68, - 75, 96,114,217, 69, 79,147,162,201, 70, 56,253, 51,133, 42,101,153, 0,177,242, 60,199,165,134,103,154, 28,196,196,119,111,154, -102,190,151, 71, 39, 77, 88, 93, 47,249,183,255,238,239, 80, 42,166,124,134, 78,178,215,241,140,131,104,114, 58,183, 99,251,176, - 19,129,157, 22,237, 69,215, 53, 24,171, 25,134,142,162,200, 80, 58,242,135, 63,252,158, 47,223,189,101,153, 50,236,203, 92,190, -203,239,190,251,142,203,205, 6,231, 28,111,222,188,225, 95,127,248,129, 47,191,252,146,253,225,132, 15,176, 40, 43,124, 8,162, -204, 79, 5, 74, 93,215, 92, 95, 95,211,158,132,161,254,120, 56, 80, 23, 37, 89, 89, 81, 6, 33, 63, 22, 85, 77,211,245,188,200, -114,134,177, 39,122,201, 0, 89,173, 47,216,237,182, 28,142,210,245,255,243,159,255,196,203,237, 53,125, 63, 10, 38, 55,129,105, - 22, 85, 77, 85, 47,249,124,187,165, 31, 70,180, 23,209,245,208,247,114,168,235,140, 56, 40, 78,167, 3,227,197, 10,215, 15,188, -124,249,146,119, 41,126,118,183, 21,142,198,139,203, 23, 40,149, 9,224, 45, 4,153,136, 88, 89,125,201,186,178,231,225, 94,248, - 20,117,189, 96,232, 3,246,235,175,190,101,124, 51,226,190,147, 81,233,169, 57, 72,229,124,115, 43, 41, 90, 74,139,193, 75,167, - 28, 89,173, 48,193,147,165, 47, 86,133,124,174, 12,229, 73,171,103, 81,215, 20,244, 80,215, 53, 6,197,246,254,158,139,205, 10, -107,181, 36,221,244, 35,251,102,143, 53,242,192,177, 6,156,145,234,118, 28, 60, 89,181,224,112,236,200, 77,142, 45,114,170,229, -154,178,176, 88, 19,217, 30,143, 88, 13, 14,205,177, 29, 56,245,158,104,164, 67, 31, 66,164, 29, 29,195, 56,162,136,180,237, 9, -107,224,102, 59, 8, 73, 13,225, 0,163, 35,253,141,164, 48,185, 96,176,170, 64, 27, 69,204, 2,193,150,140,100,140,100,148,203, - 74,194,237, 59, 71, 55,140, 12, 78,128, 47,198, 88,150, 85, 69,223,202, 14, 84,233, 72, 63, 26,142, 41, 15,183,174,107,154, 67, - 67, 55, 14, 24, 20,101, 37,121,201, 1, 69, 52, 6,157,231,220,220,221,147,101,134,213,230, 66, 0, 7, 33,178, 59,156,230,241, - 87,150, 21, 12, 67,196,230,102,134,189, 76,163,246,201, 58,104,108, 49, 31,102,206,185, 20,151,163,208, 49,162,210,205,205,132, -160, 76,187,186,169,163,176, 89, 70,212,233, 80,215,154,160, 82,222,245,180,167,182, 50, 30,196, 24,225,246, 27, 9, 13,137, 33, - 16,148,198,156,129, 71,206, 31,246,255,179, 40,213,223,242,224,165,208, 80,207, 8,106,211, 88,245,124,228, 62,173, 3,206,243, -172,167,159, 57,189,239,243,215,112,206, 71, 63, 63,236,126,251, 79, 8,129, 56,142,233, 6,137, 12,125,139,246,129, 60,211, 9, - 68, 99,217,110,183, 84, 73, 3, 50, 29, 54, 83, 6,116, 81, 20,184, 32,159,101, 89, 22,179,183,118,185, 92, 10, 77,204,121, 33, -207,101, 57, 62,166,155,176,109,228, 80,138,134,186,174,200,138,114, 78,142, 82, 74, 49,122, 73,175,235,251,113,134,122,144, 70, -150, 81, 49, 43,162, 15,135, 93, 26, 7, 14, 4, 55,160,115, 33,235,185,177,231,184, 31,231,168, 77,107,237,140,144,149,244, 44, -217,233, 63, 60, 60,112,115,127, 71, 63,200,158, 49, 51, 2, 59, 58,167,249,233,200,188,190,152, 52, 20, 62, 89,131,228,208,183, -148,229,146,170,172, 1, 77, 81, 84, 84,213,130,227,233, 68, 81, 72,136, 80, 89,212, 51,178, 52, 4, 15,189,124, 23,143,251,157, - 64,147,188,158, 59, 81,107, 45,198, 78, 19, 36,159, 98,127, 5, 62,179, 63,202, 24,184,239, 26,201,219,174, 42,150,203,101, 18, -106,141,148, 69,201,205,195,142,110,240,212,203, 21,110, 12,212, 85, 69, 12,142,170,204, 25,220, 72, 63, 56, 22, 75, 67,158, 43, -138,210,242,120,104, 24,186,136,206,228, 25, 53,193, 80,166, 32,162,237,253, 3, 95,125,241, 37, 67,215,211, 52,167, 20, 21, 27, - 69, 95, 16,100, 95,220,154, 41,252,198,160,140,122,158,127,160,229,192, 19, 54,189, 20,111, 69, 38, 48,165,187,227, 65,166, 12, -203, 92,220, 33, 81, 86,148, 33, 58,250,161,157, 39, 77,195,216,205, 77,194,212, 13,203,252,208, 67,148,112, 17,163, 53, 38,173, -163,226, 52,173,139, 41,147, 67,235, 68,160, 27, 49, 10, 73,198,172, 68,139,115, 56, 72,231, 62,121,212, 39,102,196, 48, 12,244, - 41,137,238,213,139, 23,114, 47,104, 97,193, 55,199, 99,122, 45, 37, 77, 59,242,223,254,249,159,231,136,223, 9,104,227,211,174, - 61,179,150, 31, 62,254,223,232,196, 77,247,126, 20,170,165, 73,130, 62, 96, 89, 75, 1,234,250, 65,132,127, 73,171,161,136,228, -185,229,184,123,100,181, 94,144,105, 67, 93, 10, 40, 77,220, 54,242,190,175, 47, 47,201,108,193,224, 61,155,171, 43, 30,254,203, -127, 73,123,249,129,110,232,217,239,142, 28,219,134,221, 97,207,114,185,156,159, 5, 46,197,187, 90, 45, 58,158,182,232,185,184, -186, 4, 45,176,176,201,203,127,115,247, 64,219,157,168,178,138,141, 90,225, 93, 79,211,245, 12,163,167,105,143, 68, 31,120,220, - 31,168,171, 5,195,152, 4,186, 46, 80, 41, 43, 46, 8,155,116, 47,222,227, 19,212, 73, 5,203,104, 61,131,119, 20,165, 65, 27, -195,234, 98,195,203,151, 47,169,151, 43,242,162, 38,114, 96,119,232,249,244,121,203, 23,111, 95, 82, 20, 21, 49, 12,160,100,114, - 21,163, 52,222,235,245,154,227,126, 79,102, 20, 47, 46, 47, 5, 28,119,177, 92,254, 95,247,247,247, 51,208,127, 28,133,148, 84, - 37,122,149,196,238,149,100,121, 54,123, 79,149,214, 44,106, 25,143,234,244, 32,176, 86,246, 9,122,234, 26,173,153, 9, 96, 32, - 15, 13,165, 21,203,229,130,190,235, 56, 29, 27,129,211, 63,238,104,251,150,178, 16, 80,199,246,241, 1, 99, 51,238,238,182,244, -131,167, 29, 29,135,166,225,238,126,203,118,247,200,241,116, 66,105,205,199,143,159,197,154,227, 34, 93, 63,114,232, 6, 60,154, - 83, 63,240,184, 63,202, 7, 76,100, 28, 6, 6, 55,146,217,140,195,241,196, 24, 34,203,245,134,222,121,118,167,150,253,161, 37, - 47,107,180,201,233, 71, 79, 51,244,132,160,112, 62,242,240, 32,251,144,160, 53, 65, 25,218, 78, 88,227, 50,170,201,168,202,130, -174,105, 88, 46,234, 25,218,224,188,127,214, 57,215, 41,186, 86,184,224, 41, 54, 54,203,208, 70, 64, 18,101, 89, 83, 21,181,224, -254,148, 37, 32, 34,151,113,116, 41,225, 78, 49,142,226,131, 52,214,208,119, 3, 49, 6,170,178,166, 44,202, 68,147,139,207,186, -224,169, 19,155, 48,175,231,221,251,121,199,254, 91,174,248,111,217,236, 83,167, 63,253,254,121, 74,218, 36,170, 83,191,241,213, -206, 73, 92,103,249,236,231, 34,153,223,170,239,189,119,207,118,254, 79, 66,157,167,168,214,233,181, 79, 35, 72, 57,180,211,251, -253, 13,189,238,183,133,195,249, 62,253,188, 99,159, 14,127,233, 40,106,172, 82,248,177,199, 26,195,114, 89, 83, 79,254,106,107, -184,188,216,136, 72,212,187,121,223, 93, 85, 53, 81, 27,134, 97,228,226,242, 2, 19,101,135,253,159,254,151,255,149,183,111,191, -224,151, 95,126,229,234,197, 11,218,174, 39, 43, 23,243,248,173,235, 91,174,175, 47,249,234,171,175,248,247,127,247,119, 28,155, - 35,251,253,129, 79, 31, 63,177,125,124,228,112, 60,177,221,110,217,237,228, 16,187,185,187,229, 38, 41,142,135, 97,192, 59,233, - 24,143,199, 35,119,247, 55, 84, 69,193,221,221,221,204,243,110,154,134,221,110, 71,223, 39,181,238, 56,242,248,248,200,110,183, -167,239,251,249,125,119, 93, 71,115, 58,161, 52,100,185,165,174, 42,150,203,154,170, 42,169,138,156,204, 26,140,213,212, 85,137, -201, 12,153,205,211, 30,209,206,113,185, 74,105,172,145,248,219,166, 19, 11,150,210,150, 49, 4,242,178,160,159,227,125, 73, 25, -212, 82,200,191,126,253, 42, 49,202, 13, 49,138,152,210,207,206,150,132, 93, 13, 79,105,126, 82,200, 72, 39,239, 93,138,120, 77, -133, 94, 81,228, 16, 61, 87,155, 11,140, 82,124,247,187,111,230, 28,110, 5,140,110,100,189,150, 78,174,172, 43,234,170, 74, 35, -101,195,241,112,194,230, 5,126, 12,148, 85, 41, 49,176, 54, 99,247,184,227,234,250,138,155,155, 27,254,240,135, 63,112, 56,236, -137,120, 9, 63, 73,254,127,231, 7,170,178,102,127, 56,177,219,239,137,137,213,177,223, 29, 57,117, 45, 90, 27,124,162,169, 93, - 92, 92,224,157, 99,185, 92,224, 67, 32,207, 44,187,199,173, 60, 59,109,206,144, 20,232,147, 96,117, 66, 52,159,175,203,230,100, -184, 84,204,207,215,124,130,209, 40,165,103, 46,190, 79,194,213,233,158,105,219, 22,107, 12,163,147, 60, 0,165, 53, 49, 68,142, -199, 3,139,229,130,170, 40, 49, 70,158,213,101, 90,151,149,101, 41, 98,203, 52,150, 62,236,247,228, 69, 33, 34, 93,239,249,221, -183,223,176, 90,173, 57,118, 45, 77, 55,200,222,216,202,223,157,165,108,140,190,239,201,242, 60,173,249,101,181, 21, 83, 10,159, - 78,148,182,190,107, 89, 44, 75,134,190, 37,166, 28, 10,173, 53,199,227,158,162,200,146,127, 31,114,107,105,154,150,195,254, 64, -158, 21,108,214,151,172, 86, 27, 84, 84, 44, 18,101,113,177, 88,112,121,121,201,114,181, 17, 49,101,240,233,121, 26, 88,173,215, - 51,169,238,112, 56,204, 98, 94, 31, 20, 69, 89, 51, 56, 79,219, 13, 60, 60,238,249,124,123,143,182, 25,218,102,180,109, 35,194, -187,162,160, 31,197,225, 20,149,102,185, 94,211,143,131, 40,233,157,151,215, 48, 58,198, 0, 62, 8,148,200,133, 72,215, 15,236, -143, 13,221,224,240, 33, 50,142, 81, 24, 46,218, 48,184,129, 97,236,185,184,220,112,177,185, 32, 16,185,187,189,231,112,104,165, - 24, 54,150,199,135, 71,214, 23, 43,214,235, 53, 16,176,153,161,174,139, 52, 73,233, 8, 62, 80,148, 37,187,199, 71,154,246, 68, - 81,230,216, 67,115,122,150,145,109, 19,108,165,235,155,244,165,100, 2,129,112,142,253,241, 40, 30, 72,163,231,209,204, 19, 65, - 74, 82,216,230,160, 13,245, 52,130,117,206, 49,166,138,240,246,254,142,224,146, 24, 43, 6, 34, 96,180,230, 97,247, 72,112, 3, -193, 43, 62,124,252, 44, 66,168,216,129,181,180,131,224, 17, 25, 13,102, 24,248,120,123, 7,222,211,221, 63,146, 79, 81,159, 90, -124,186, 30,139,201,114, 70, 31,232,199,129, 60,177,211,119,167, 6, 99, 36, 38,242,126,119, 36, 0,182, 88,144,149,154,209, 41, -180, 68, 32, 73,212, 29, 48,122,176,185,112,147, 51,155, 17, 2, 20,185,136, 9, 61, 10,149,148,162,121,158,211,166,135,165,182, - 54,165,213,105,148, 73,126,106, 55, 50,184,145, 97,116, 88,173, 49, 90,252,146, 49, 70, 50,109,176,166, 16,253,129,243, 51,184, - 98,178,110,249, 48, 50,186,128, 15, 17,229, 38,171, 75, 33,172,243,212,209, 77,130,165, 16, 60,120, 97,220,143, 49,136, 56, 72, -107,114,163, 49,249,147,178, 61,132,144, 18,234,164,170, 31,131,127,182,123,158, 16, 25, 49, 50,179,147,157, 27,102,189,193,196, -153,158, 42,234,243,212,212,243,195,124, 58, 84, 39,141,192,249,206,126, 42, 6,164, 43, 52,207, 66,100,206,139,133, 24, 35, 62, -253,255,243, 3, 93, 58,247,152,130, 74,178,255, 97,164, 63, 11,137,188, 20, 13,121,138, 98,157, 64, 74, 82, 44,216, 4,232,144, -181,210, 97,187,199, 13, 3,139,244,208, 47,138,130, 83,115,100,117,121, 65, 85, 47,147,136,108,164, 44,106,222,126,177,224,245, -235,183, 2,198,216, 92, 82, 86, 5, 15,159,111, 57, 28,119,124,255,253,247,172, 47, 46,248,244,233, 19,151, 78,176,167,167,211, -137,166,149,159,237,198,158,221,110,199,151,239,222,162,172,225,205, 75, 1,122,172,214, 75,138,178,226,216, 72,231, 25,149, 38, - 16,231,131,121, 22,146, 5,143,115,145,220, 90, 76,189,128, 16,185,188,248,255,249,122,175,102, 75,178,244, 60,239, 89, 38,221, -182,199,149,109, 55,109,102, 6, 3, 12, 72, 4, 4, 50,192, 32, 3, 87,250,211,212,173, 20,146, 66, 4, 67, 0,133, 33, 6, 26, -180,171,170, 46,115,236,246,233,150,209,197,183, 50,247, 62,213, 77,117, 68, 71,119,205,116,213,217, 38, 51,215,103,222,247,121, -151,227,232,116,191,223, 99,180,226,252,252,156,171,171, 43,209,120, 36,177, 95,211, 52,172, 30,238,229,154,173,107,166,211, 9, - 58,179,148,101,206,213,197,197,232, 10, 40,243,140,207, 62,251,140,183,111,223, 82,239,247,216, 60,103,189,222,178,219,215, 84, - 85,133,106, 26,238, 87, 27,148, 50, 60,125,118,129, 74,121,141,245,161,101,187, 63,176,217,239,228, 26, 48, 36,174, 64,135,115, - 9,173, 26, 3, 54,141,120,157,115, 40,147, 97,139, 2,151,198,212,121, 33,136,219, 35,226,211,208, 36, 85,248,160, 14, 31, 93, - 32, 9, 86,163,139,156,125,211,146,169,192,155,247, 55,252,230,171,207,120,245,253, 15, 60,123,246,140,119,239,222, 97,141, 66, - 91,195,238,208,112,113,174, 88,158,205, 41,172,216,130,234,218,163,144, 72,230,229,114,142,139,128, 18, 81,153, 82,138,127,249, -151, 63,242,228,201, 19,222,127,120, 59,234, 83,218,182, 69,183,112,127,191,226,252,252,146,119, 31, 62,208, 29, 14,116,174, 31, -247,168,109,219, 17,131,162,174,101,180, 29,189,103,183,219,137,224,202, 24,138,170, 28,137,136,128,236, 90,149, 98, 49,155, 99, -203, 74, 88, 26, 93,151, 16,175,106,180, 39,122, 47, 33, 79,211,106,146, 72,118,110,140,220,205,178,140,186, 77,194, 85, 43,247, -115,239, 58,138, 50, 7, 45, 7,117,115,216, 83,183,226,175,223,172, 30,168,170, 9,251,205,134, 98, 50, 33,106,197,118,187, 21, - 14,134, 82,220,221,221, 81, 37,102,251,114,185,100,191,223,227,186,150,175,190,250,138,106, 58,225,143,127,252, 35,219,219, 15, -252,213,159,125, 41,123,230,132, 40,158,166,164, 49,155, 9, 94,246, 79,255,242, 71, 98, 84,204,206,132, 31,145,229, 70, 8,163, -192,229,243,167,216, 34, 31,247,238,243,201, 84, 68,113,200,234,101, 49,157, 73, 6, 64,110,217,110,183,172, 31, 54,252, 31,255, -251,223,179,156,205, 9,209,113,247,240,112,156,188,165,235,193,123,137, 52, 62,191,184, 0, 45,235,170, 67, 35,226,183,106, 58, -167,110,123,186, 78,156, 31, 77,211, 82, 77, 51,178,114,194,110,183,163,239, 3,179,249,153,160,102,187, 7,172,181, 44, 22,103, -152,162,144,179, 42, 43,216, 29, 26, 58, 23,104,186, 32, 57, 9,214,242,176, 57, 96,173,165,245, 29, 93,231,168,221,134,106, 54, -195,100, 5,147,217,156, 72,141,139, 17,101, 20,189, 11,244,206,147,229,150,170,202, 88,109,214,212,135,134,231, 79, 95,112,117, -245,148,221,246, 21, 62, 42, 38,229,132,135,219, 27,254,233, 15,255,130,214,240,171,207, 95,208,116, 59,124, 8, 44,151,162, 65, -120,255,254, 61,104, 67, 81,201,154,105,170, 53,182,105,154,241, 80, 7, 80, 33,117,122,125, 51, 86, 63,167, 66,164, 24, 37, 20, - 36,198,163, 10, 83,107,131, 25,233, 87, 97,228,250,158,118, 72,234,228,223, 7, 54,188,132,201,139,207, 86, 69, 81,188, 43,125, -210,237, 25, 67,136,138, 60, 61,224,178, 92, 46, 78, 23, 34, 70, 89,148,213,248, 24,164,242,212, 18,255,170,180,197,164,177,179, -137,130,202, 52, 8, 88, 4,130, 0, 34, 82,184, 71,136, 16,122,225, 97, 91,125,154,231,237,209, 73,253, 59,160, 26,253,216,105, -114,114,216, 68,200,179,159,117,162,195, 8,115,168, 86,251,190,151, 17,124,242,216,142,194,145,188, 36,211, 57,198, 28, 71,204, - 74, 13,241,142, 45,117,221,138,175, 50,170,180,111, 85,143, 20,220,114,176,241, 40, 39,121,128, 87, 12,197,214,118,187, 29, 71, -155,156,104, 29,134,110,221, 53, 18,199,121,186, 75, 61, 29,143, 63,218,177,158, 40,220,143,182, 49,253, 51,197,249,233,120,124, -120, 16,158,142,227, 79, 25,241,191,148,252,246, 75,169, 96,167, 59,115, 57,124,120,244,115, 31,101,125,199,227,228,226,201,147, - 39,227,110,246,227,216,210,225,251,236,186, 70,196, 39, 39, 35,252, 1,246,178, 88,156, 37,251, 82, 79, 49,153, 82, 76,166, 40, -173,153, 47,150,204,230, 11,178, 44,227, 15,255,244,223,249,252,229, 75,190,248,226, 11,254,207,255,237,127,229,246,254,158, 23, - 47, 62,225,238,254, 30, 83, 84,132, 84,184,104,107,208,209, 16,149, 92,195,226, 36,240,146,241, 22, 3, 90, 65,102, 84,218, 25, - 11,194,118,120,157,226,127, 53, 40,101,211,200, 80,152, 6,243,197,108,252,190, 7, 69,185,172, 3,202,145,218,118,113,113, 49, -118,239,167,201,123, 85, 89,146, 21, 18,129, 44,111,220,227, 92,207,230,176,229,182,200,104,235, 61,231,231,231,178,207,215, 25, -206, 93,203,196,105,116, 51,136, 64,179, 42,133, 85,176,175, 15,220,173,146,214,192, 90, 50, 50, 16,123, 59, 12, 41,134,192,102, - 35,129, 67, 69, 94,225, 19,127, 96,120,118,124,124, 29,140, 19, 38,205, 24,253,202, 73, 0,145,235, 3,170, 84, 28, 90,199,203, -103, 23,124,251,227, 43,190,249,234,115, 46, 46, 46,216,172, 31,136,193,177,221,110, 40,171, 5, 77,223,241,246,195,123,137,215, -212,208,181,123,156, 55, 99,177,103, 50, 75,212,242,235,174,119, 35,230,247,234,234,138,223,254,246,183,252,195, 63,252, 3,179, -153,104, 25,154,195, 65, 14,107,164,104,171, 91, 25,239,239,234, 6,148,166,237,142,214,208,224,193, 59,207,118,179,167,200,114, -230,115, 57,184, 86,171, 21,251,180,203, 30,174,185,178, 44, 89, 46,151,163,199,187,235,186, 81,196,117,186,138, 58,205, 82, 56, -157,192,141,171, 47,163,127, 54,189, 27,188,215,217,137,176,181,239, 69,219, 80,165,226,113,191,171,165,147, 45, 10, 65,237, 38, - 71, 70, 85,228, 76, 38, 19, 98,145,243,245,215, 95,243,230,245,143,252,240,195, 15, 44,150, 11,158, 62,123,193,108, 54,147,241, - 58,208, 52,178, 62, 80,137, 99,241,213, 87,223,240,228,201, 19,158, 93, 93, 38, 93,190,167, 57,212, 28,154,154,201, 98,142,206, - 68, 23, 16,163,120,231,179,204, 66, 34,226,109, 54, 27, 65,245, 54,189,232, 0,148,101,185,184,228,221,187,119,188,123,255, 19, - 16,168,166,147,113,250, 52,155,205,184, 76, 4,184, 67,219,240,226,197, 11,234,182,161,191,190,101,181,217,164, 21,145,136, 86, -239,111, 86,216,172, 98,187, 23,119, 64, 85, 85, 20,121, 37,216,224, 62, 98, 51, 37, 41,153, 77, 75,211,245,162,242, 55,150,188, -144, 53,136,243,129,106, 50, 61, 50,218,173,166,138,140,252,135, 34,175,232,125,160,154,206,184, 95,109, 88,175, 55,236,250, 22, -231, 59,130,135,186,113,172,119, 61,159,126,250, 82,120, 31, 90,176,189, 38,207,200,109, 14, 90,147, 23, 21,247,171, 53,223,253, -240, 35,147,105,193,114, 94, 16,145,100,212,217,226,140, 75, 47,221,151, 86,134,186, 57,224, 35,216,213,106,245, 51, 17,209,248, -112,142,138,214,245,143, 14,253, 33, 38,244,200,117, 15,224,193, 4,176, 49,153,228, 17,114,210,233, 95,126,240,178, 19, 33, 14, - 74,205,148, 77, 22, 35,154,180, 75, 9,167,137, 78,134,128, 28,146, 38, 29,246,222, 69,124,116,216, 40, 72,207,222,123,137,121, - 13,226,207, 84, 70, 18,227, 72,201, 79, 90, 13,133, 66, 18,177, 56, 79, 8, 10,239, 57,138,201, 62, 58, 88, 98, 84,114,168,171, - 72,145, 31,195, 15,156,115,104,100, 79,165,173,194, 88, 69,157,198,113,189, 31, 60,254,137,197,156, 46,210,224, 35, 42,137,166, -134, 67, 71, 14, 85,241,200,214,237,129, 24,213,152,212, 52, 28,184, 3, 46,115, 54,155,141,161, 4,167,222, 85,180,128,130,246, -187,157,128, 68, 6,102,122,148,207, 42,179,233, 51, 83, 26, 98, 16,107,196, 71, 32,139, 97, 71,171, 83, 30,124, 28,139,174, 52, -162, 71,209, 54, 39,150,183, 16,240, 30,250, 24, 32,249,218,163,210,132,132,118,125,236, 69, 29,246,214,238, 68,197, 27,211,195, - 72, 98,123, 67,136,196,152, 61, 18, 9, 61,246,162,135,159, 21, 12,199, 44,247,161, 48,180, 39,113,160,254, 81,240,144, 82,114, -147, 12, 15,175, 1, 6,114, 26, 58,162, 16, 13, 68,232,123,124, 34,207,245,125,207,182,109,120,242,244, 74,146,159,218, 38,117, -192,146,209,220,121,199,118,223, 80, 85, 21,171,251,123,174,223,191, 99,115,127,207,191,186,234,189, 36, 0, 0, 32, 0, 73, 68, - 65, 84,253,171,191,228,234,234,138,197,217, 25,127,243, 55,255,158,255,251,191,253, 19,127,250,254, 7,162,145, 7, 59, 90,225, - 79, 32, 57,130,241,205,152, 78, 74, 14,117,123,124, 77, 90, 58, 48, 19, 36,117, 80, 50,209, 19, 43, 66, 67,166,115,180,130, 24, -228,225, 62,159,207, 31, 21,221,195,123, 28,174,149,167, 79,159, 30, 65, 32, 39,135,102,158,231,156,157, 11,104, 67,197, 64,140, -154,204, 24, 14,181, 99,179, 90,163,141,226,251,111,255,117,220, 81,203, 97, 55, 88,164, 96,121,118,145, 68,159,129,222, 57, 30, - 30,238, 56, 12,240,165, 76,139, 37, 78,165,216,198, 64, 82, 60, 43,110,110,110,228, 33,102,244,168,138,215, 70, 40,101,130,159, - 85,192, 81, 92, 41,223,189, 26, 53, 13,196, 65, 87, 33,215,119, 8, 64,102,200,139, 9, 63,189,254,158,213,102,199,175,190,252, -156,127,248,251,255,194,164,204,217,174, 55,204, 22,151,116, 49,178,218,108,217,108, 54,152, 89, 9, 65, 48,166, 89,110,232, 67, - 71,239, 90, 76, 86,224, 83,194, 86, 89, 22,163,210,252,155,111,190,225,187,239,190,163, 42,196,157,112,119,119, 39,106,252, 52, -249,113,251,122,252,220,195,201, 52, 74, 89, 67,235,122,114,107,198, 73,153,181,150,229, 82, 70,196, 67, 14,198,233,170,107,192, -176,206,231,243,113, 12,127, 10,143, 26,174, 29,231, 28,218,154,177,232, 67, 43,186,193,205,162,178, 71, 5,238, 72,119, 51, 25, -121, 94, 98, 77, 78,150, 21, 35,144,101,152,168, 89,107, 71, 12,110,215,117,236,251, 94, 44,100, 79,174,228,224, 60,136, 94,163, -174,107,230,139, 51, 90, 52,127,122,115,195,102,243, 45,187,221,134,232, 3,117, 35,211, 95, 21,146,200, 46,179,124,114,240,252, -240,246, 86, 44,114,174, 21,139, 50,142,182,217, 96, 51,149, 18,248, 2,153, 49,100,182, 56,113,183, 84, 50, 49,214,153,240, 33, -202, 9,191,251,221,239, 8, 81,115,126,241,132,235,235, 15,168, 86,222,115, 53,153,113,113,249,132, 98, 50,193,199,136,205, 50, -222,125,184,230,233,211,167,188,120,254, 9,247,235, 21, 93,215, 51,157,205,152, 78,167, 76, 23,103,236,235, 30,147, 68,181,103, -103,103, 16, 35,219,237,154,249,124, 62, 82, 20,135, 41, 83,150,101,248,244, 28,209, 90,108,139, 15, 15,235,241,190,245,190, 79, -224, 37, 61, 70, 75, 15,207,249,221,161,161,109,229,207,233, 59, 89, 11, 40, 21,201,114, 73,204,220,239,247,146, 70,216, 73, 66, - 42,105,255, 62, 89,206,169,219, 3,215,183,247,252,244,246, 3,246,243, 23, 76,171,140, 67,221, 39,204,241, 19, 33,182, 98, 40, -186, 68,210,252, 88,125,252,113,178,214,240,160,252, 37,161, 19,128, 53,249,163,255,127, 56,148, 66, 16, 92,232,240, 0, 29, 4, - 80, 67,106,155,115, 18, 21,232,156, 75,135,177, 8, 43,116,136,116,173,163,245,142,168,156, 36, 57,197,152,128, 10, 9, 54, 18, - 2, 54,202,107,156,148,121, 18,228, 25,162, 49,105,124, 44, 99,100, 21, 21, 93,221, 16,140,194,164,202,181,119,145,222, 71,162, - 74,157,170,111,113,191, 16, 27, 58,132, 80,108, 54, 98,137,232,199, 47,243, 40, 38, 50,118, 56,104,197,178, 16,162, 39,248, 72, - 12,160,245,209,250,147,231, 57, 38,207, 30,169,194,251,222,211,236, 15,168,168, 79,118,216, 10,239, 35,109, 59,228, 29,139,242, - 93, 41,177, 94, 13, 66,146,161,114,119,206, 97,179,234,103, 29,244,105,226, 90, 85, 85, 35,151,185,174,235, 71, 7,187, 86, 26, -171, 37, 88,229, 99,235,215,169,149,230, 84,156,118,218, 13, 75,212,169,164, 55,124,220, 93,159,118, 90, 31,239,184, 79,255,252, - 83,238,193,233,174,123,184,196,108,250,249,167, 69,131,252,252,159,199,189,158,238,255,135,247, 50,136,196,140, 49, 76,167, 83, -177,201,157,252, 57,109, 35, 28,124,171,164, 16, 25, 16,229,157,243,148,133,144, 4,123,215,211,119, 14, 59, 45, 65, 91,154, 67, - 75,211,108,201, 15, 53,177,115, 92, 93, 93,177, 94,203,205,253,219,223,253, 78,242,162,117, 54,130,119, 66,140,146, 72, 24, 3, -190,119,228,185,165, 79,247, 85,153,201,161, 46,216, 75,233,216,173,210,130,212,141, 73,131,161,193,104, 3, 65,246,114,153, 86, - 84,121,134,142,199, 17,237, 48, 22, 6,198, 85,201,240,224,159, 78,167,163,136,175, 72, 76,239,225, 0,186,184,144, 4,169,122, -191, 67,197, 72,153,103, 24, 53, 39,207, 68,216,117,121,126,201,118,183,163,105, 28,243,249,146,237,254,192,119,155, 29,251,125, -141,177, 37,231,231, 23,212,237,129,237,102, 79,221,181, 20, 69, 70, 81, 77, 70,209,230,112,239,187,164,240,214, 70,179, 94,111, -152, 76,166,210, 17, 37, 85,251,112,221,142,154,143,143,220, 14,201,127, 33,173, 65,140, 8, 3, 75,130, 76,186,174, 19, 85,242, -190, 33, 68,195, 15,175, 94,243, 63,255,199,191, 97, 50,145,105,197,174,105, 57,180, 13, 69, 33, 83,199,213,106, 69, 22,132,229, -221,198, 72, 94,102,248,232,112, 33, 96, 85, 20, 61, 64,231, 70,158,131, 8, 23, 91, 94, 60,255,132,221, 86,162, 82, 1,122, 23, -112,190,197,230, 37, 90,215, 96, 28,147,164,115,105, 59, 57,212,219, 84,192, 77,206,151, 73, 20, 42, 1, 53, 86,203,170,110, 50, -145,149,222,144, 68, 88,215,245,248,204, 25, 18,201,134,235,249, 20, 94,180, 94,175, 71, 15,249,112, 79,103, 89, 38,218, 37, 99, -196,166,151, 68,149, 67, 67, 33,211, 8,125,212,176, 4, 79,215, 69,170,170,164,235,250,241,217, 50, 68,222, 14,207,175,125, 93, -227,130,167,200,115, 62,121,241,124,212,111,212, 93, 75, 48, 18,156, 35, 59,108, 33,238,217,172, 32,207, 82, 6, 69,219,178,217, -238,232,190,255, 62,137,196, 60,243,249, 60,169,228,107,148,242, 40,167,165,238, 11, 1, 23, 36,241,208, 38,106, 95,211, 52,178, - 6,212,146, 42, 24,162,226, 80,183, 60,127,254,156, 79, 62,251,148,203,203,115,138, 73, 37,169,127, 73,144,249,176,190, 31,167, - 13,219,237,150,162,170,216,237, 14,172,247,123, 98, 39,163,247,174, 91,179, 90,111,233,195, 49,120,233,254,238, 6,239, 69, 88, -189,152,206,232, 93,251, 72, 84, 92,150,249,120, 14, 20, 89, 46, 17,229, 70,222,175, 34,224, 66, 18,119, 86, 57,198,230, 64,164, -111, 27,105,252,124,160, 42, 44,133,181, 28, 56,208,165,104,218,229,124, 65,223,123,218,102, 45, 83,218,184, 23, 54, 69, 84, 20, - 69,142,205,114,206, 46, 47,232,235, 61, 31,110,238,152, 76, 42,184, 58,163, 15,158,186,110,249,236,197, 11, 64,167,103, 92, 98, -112, 76, 38,179,113, 31, 49,216, 90, 78, 15,233,224, 85, 98,186,135, 95, 16, 89, 41,156, 11,248, 56, 44, 97, 99, 10,113,146,174, - 79, 0, 52,169, 18,183, 3,234, 78, 68, 96,125,239,233, 67, 47,149,119, 0, 21, 5, 96, 99,163, 74,137,111,138, 16, 61, 74, 43, -124,232, 9, 41, 35,215,104, 77, 12, 8,133,201,121,238, 19, 36, 95,105, 75,208, 50,186, 30, 55,195,177, 39,215,138,112, 34, 10, -235,130,224, 28,117, 18,115,136, 7, 59, 48, 12, 42, 30, 29,234, 74,145,165,125, 79, 32,162,189, 27,109, 74, 38,229,178,135,225, -225,147, 2, 46,148, 50, 24,163,126,246,231, 88,125,140, 22, 84, 74,113,136, 7,122,142,233,101,101, 89,146, 23,150,195,190,161, -105,119,216,204,136,106, 86,137,106,120,236,174, 99,196,106, 45,118,163, 24, 41,171, 34,161, 30, 69,177, 58,116, 2, 69, 81,160, -180, 38,184, 14,215, 53, 4,215,161,162, 79,121,242, 66,163, 82, 39,246,176,143,253,227, 98, 97,138, 76,171,114,236, 14,162, 34, - 69, 36,154, 49, 27,123, 8,238, 25, 3, 27, 4, 50, 47,184,208,100,139, 58,142,251,101,196,139,146, 16, 32,149,198,208, 31,119, -234,167, 74,250,161,227, 25,118,169,131,205, 77,169,228,233, 53,199, 17,237, 96,101, 27, 58,243,161,227, 24,214, 15, 31,231,124, -203,126, 47, 16, 59, 47,157,112,250,126,108,154, 10,101, 69,206,245,245,245, 8,186, 41,166, 26,141, 88,161,188,115,120, 31, 56, -155, 77, 88,175,110,185, 92, 46,185,186,186, 34, 75,194,209,166,245,114, 72,228,121, 18,251, 4, 65,160,170,199,160,157,210, 10, -166, 87, 43,137,197,213, 26,185,153, 91, 75, 81,138,101, 50,183, 25, 69,102,136, 49,208,119, 45,202, 40,209,182, 16, 8,193,113, -168,101,100, 58, 28,224, 89,218, 89, 31,106,193,106, 14, 10,232,188, 40,200,211,161,222, 38,168,143,235, 36,254, 55, 75,208,155, -182, 22,235,143,242, 25,229,249,133, 8, 53,187,142,190,247,156,205, 22, 76,231, 11,188,210, 60, 60,172,229,225, 93,230, 28,154, - 3, 33, 58,138, 50, 35,207,202, 81, 91, 19,212,177,128,236,181,162,235,122,172, 45,199,164,182,186,110,198,123,112, 68, 20,107, - 57,148, 76,234,216,143,197,166,232, 64, 78,157, 11, 74,105,124,240, 68, 52, 30,216,237,107,242,170,226,167,119, 31,104,219,150, - 79, 63,121,201,135, 15, 31, 88, 44, 22,108,119, 59,102,182, 96, 50,155,209,117, 53,109, 7,121, 97,105,219, 26,109, 42,138, 34, -103,123, 56, 16, 99,193,116, 90, 37,154,154,140,177, 59,215,243,246,253,123, 46,159, 60,225,219,111,191,147,241,114,223,179,217, -110,105,219, 14,135,162,105, 26,124,240, 20,249,177,192,246, 28, 49,189,241,108, 33, 49,205, 77, 67,211, 28,152, 79,165,168,104, - 58, 55,118,252, 3,129,243,112, 56,140, 26,130, 65,187, 52,124, 70, 35,225, 47, 29,192,251,125, 45, 49,172, 33, 29,238,138,116, -168,187,180,234, 43, 82, 3,224,137, 94,166,156,109,104, 80, 1,250,206,211, 30,182,156, 37, 77,198, 48,157, 69, 43,108,158, 81, - 78, 42,250, 86,138,198,253,126, 79,190,148,226,227,254,254, 94,238,121,239, 40,178,140, 44, 3,187,156, 72,104,138,247,244,125, - 96, 90, 86,228,133, 77, 89, 1,178, 90,186,185,185, 97,191,217,161,188,100,139,151, 38,226,201,176,214,140,122,142, 44,147,177, -127,149,139,133,243,252,236, 82,214, 72, 70, 38,122,179,153, 88, 2,241,129,119,215, 31,104,250,142,179,139,115,130,243, 60,172, -239, 37, 8,200,117, 35, 51, 68,186,228, 61,187,237, 62, 77,237, 12, 89, 94,142,215,209,126, 95, 75,252,181, 23,175,252,217,242, -130,243,165,136, 7,155,230,192,253,253, 61,193,119,120,231, 32, 90,242,228, 0, 43,243, 66,166,179, 61,146, 73,162,115,180,151, - 6,172,202, 50,138, 60, 23,110, 65, 38,212,188,190,239,165, 8, 10,145,178, 20,251,106, 83,119, 16, 28, 42,230, 84,101, 41,147, -215, 4, 66, 82,202,160,172,198,237, 58,102,211,138,222,138, 91,227,167, 15, 55,120, 34,139,217,132,197,164,224,254,254,158,105, - 85, 80,229, 25, 77, 35,141,162, 29, 30,110, 81,241,179, 44,236,199,251,173,159,119, 99,162,204,238,241,238,241, 78, 83,226,238, - 30,243,188, 67,226, 78,159,118,124,105,213,150, 30,194, 30,215, 54,228,234,200, 15, 15,120,121, 48,120,141, 10, 65, 44, 55,202, -160,213,144, 29,236,169,242,169,120,111,244, 96, 11, 74, 40, 82, 36, 83,216,183, 77, 58, 76, 18, 23, 91,107,180,150, 76, 91, 99, - 21,182,180, 18,131,121,218, 45,170,227, 97,236,156,123,212,137, 30,145,170,199,195,252,212, 35,126, 44,120,142, 19,142, 83, 33, -226, 64,100,115,206,161,128,178, 26,200, 88, 54,237,110, 59,172, 21,241,219,100, 82,208,183, 45, 49,120,186,190, 29,247,105, 3, -188,161,239,123,154,246,232, 15, 29,170,241,211,221,240,240,192, 24,118,253,167, 92,239,225,192,245,241,227, 81,103,120, 68, 96, - 59,237,206,135,223, 59, 60,140, 73, 88,202, 95,156,116, 40,245,232,129,125,250, 57, 28,255,126,124,157,197,209, 99,171, 30,253, -250,180,147, 31,198,251, 33,136,247,243,244,181,157,142,160,135,204,235,211,113,244,233,180, 97, 72,177,210, 26,148, 81, 24, 45, - 64, 22,180,102, 82, 76,104, 93, 47,126,243,172, 32, 55,134,201,116, 46, 7,255, 65,186,135, 42,207, 70,139,205,179,103,207, 89, -173, 86,156, 47,207,216, 29,246,196, 96, 88,173, 86, 68, 37,186,143, 56,232, 60,140, 88, 26,155,166, 97,189,126,224,124,246,140, -170,200, 48, 70,186, 21, 77, 18, 92,134, 56,126,102, 89,110, 40,138, 28,239, 58, 66, 47, 59, 52, 31,188,116, 87, 40,116, 60,186, - 19,134, 32,144,225, 80,216,110,183,104,173, 25,180, 51,167, 32,144,225, 90,170,170,138, 89, 53, 17,200,198,253,221,200,153, 88, - 46,151,172,215, 27, 46, 46, 46,100,205,161, 13,117,219, 81,150, 19,230,115,104,211,159,223,117, 29, 58, 51,148,121, 78, 36,241, -207,137,114, 15,251,240,179,213, 76, 81, 84, 63,155,226,140, 5,246,232,162, 80,143,108,141, 33,196,159, 57, 53, 6,118,198,116, - 58,165,239,188, 32,149,145,241,241,235,215,175,249,242,243,207,121,243,230, 13,139,197, 57,235,219, 61,219,221,158,203,139,115, -148,150,231, 73,232,123,242,188, 2,107,201,202, 76,114,204, 67, 79,153, 79,208,105, 18,166, 84, 79, 85,201,158,117, 96,154, 59, -231,177, 38, 35,203,132,102,105,242,108, 12, 11, 2,240,169,145,233,250,110,156,168, 13,215,189,220,143, 29,185,213,204,102, 51, -118,215,183, 35,253,113,184, 63, 6, 27,230,221,221, 93, 34,169,233, 81,136, 54,104,103,142, 59,245,164,128, 87,136,151, 63, 9, -143, 79,139, 88,121, 94,125,132, 89,246,210,148,180, 7, 25,253,218,148, 97,159,229, 34,224, 27,127, 86, 8, 82, 20,173, 31, 40, -203,146,219,219,219,145,250, 56, 20, 22,222, 59,124, 2,220,156,205,101, 34,116,117,121,158,220, 18,201, 45, 4,124,184,126, 39, -161, 86, 85, 37,133,100,145,167,231,199, 81,163, 35,233,142, 25, 85, 94,140,225, 77,243,249,156,144,118,230,231,231,231, 92, 95, - 95,179,219,237,184,190,185,229, 15,255,253,195,104, 33,238,124,119, 66,125,180, 40,163,228, 51,222,237,136, 17,138,162,162,235, -125, 74,106,243, 84, 85,197,124, 54, 33, 51, 90,132,165, 79, 46,200,178,236, 56,197, 58,127,206,147,243,115,182, 59,153,138, 88, -123,212, 15, 21, 69, 65, 93,183, 84,229, 76, 82,249,148, 74,145,227, 17,101,213, 8,188, 25,104,132,109,215,241,238,221, 59,156, - 75, 99,126,224,238,126,197,135,155, 21, 86,105,102,149, 8, 21, 23,139, 25, 23, 23, 87,180,173,216, 86,171, 20, 16,211,119, 50, -221,126, 88,137,139,229,234,242,156,236,229,115,238,238, 30,200,159,157,179,152, 95,224,131, 99,189,122,192, 30,154,250, 35,129, -210,227,221,250,184,207, 84, 10,133, 34, 6,127,114,115,105, 2,154,168, 3,250, 81,152, 0, 40,157,208,128,105,172,162,198,135, -177,124,121,202,128,213, 82, 57, 74, 85,155, 14, 36,101,176, 54, 71,103, 26, 23,122,162,150,238,127, 60, 80,144,144, 9, 25, 91, -203, 69,252, 63,254, 43,144,231,153, 96, 46,131, 4,168, 88, 12,193, 24,162, 50,160,100, 21, 32,113, 12, 39,221,170, 98, 76, 10, - 82,201,170, 18,117, 36, 40,137,171, 84, 86,194, 19,156,247, 50,122, 63, 57,128,140,138, 39,226, 47, 65, 35,250, 49,131,222,211, -167,131, 55, 70,121,109,235,245,195,216,201,139,160,171,161,239, 58,124,175,185,243, 61, 85, 85,140, 55,123,223,247, 73, 80,149, -145, 89,133,138,134,174,115,100,121, 49,250, 76,135,238, 84, 41, 37,192, 5,173,143,168,208, 44,123, 52,158, 31, 10, 57, 53,124, -159, 33, 8,184,226,228, 65, 75, 8, 24,165,208, 89,134, 79,135,166, 73,175, 55,126, 36,210, 57, 61,156, 71, 33,158,115, 99, 62, -119,112, 61,164, 3, 89, 69,149, 2, 14,204,207,244, 28,143, 14,245,147, 76,130, 71, 56,211,152,172,111, 63,183,159, 63, 18,196, -141,106,233,143,126,198,240,186,157,235, 30, 21, 15,206, 57,201, 39, 40, 75,246,187,154,222, 71,148, 9,128,166,109, 59, 84, 31, - 82,124,172, 5,164, 99, 85, 72, 23,162, 77,228,252, 47, 37, 38,178,169,221,168,240,118,195,154,201,232, 17, 25, 92,215, 53, 42, -180,244, 79, 47,198,215, 28, 83,145,172,173, 26,119,120,170, 80,163,238, 96, 4,240, 12, 5, 89,215,165,253,179, 34,207, 11,156, -243, 28, 14,245,152, 16,229,156,167,239, 29,187,157,112, 20,228,179, 96,220, 3, 55,141,208,183,238,238,238,208, 81,162,117,239, -239,239,137, 49,178,181,150,243,179, 51, 62, 92,223,164,168,204,146,186,235, 89,111,119, 52, 78, 4,134,189,115,244,161, 75, 66, -170, 2,107,115,122,231,177,214, 99,180, 73, 24, 98,249,238,180,178,100,182, 24,247,252,189, 11,160,142,208,162,177,120, 28,166, - 68, 90,252,189,164, 8, 88, 55, 8, 73,135,201, 95,154,218, 77, 38, 19,138, 44,167, 9,138, 60, 43,177,177,135,216,243,195, 15, - 63,240,151,191,249,154,197,108, 14, 9, 70,213,120, 41,166,139, 1,138, 85, 85, 76,166, 21,117, 23,201, 82,162, 90,239,252,163, - 21, 81,212,138,128, 26,175,169,191,248,253,191,225,143,127,252, 35, 77, 93, 51,137, 48,169, 91,108,145,203, 53,225, 29,196, 99, -252,108,138,156,127, 68, 56, 28, 38, 79, 67,212,242,164,204,217,239,123,161,219,105, 73, 88, 43,138,129,183, 31,132, 65,160, 53, -209, 59, 92,215,208,118,233, 30,235, 29,153,129, 42,193,153, 72,154,139,222, 59, 24, 86,170, 33, 80, 85,211,132,154,109,198,239, -129,168, 30, 9, 70, 31, 30, 30,152, 76,100, 53,149,229, 80,215,245,184,174, 43,178,124,132,203, 12,246,102,128,155,235,247,172, - 86, 27,202,197, 5,251, 90, 4,118, 81,103, 84,115, 69,221,123,222,188,191,225,254,254, 30,223,181, 34,208,236, 26, 98,140,124, -242,242, 57,159,205,151,180,222,177,121,216,210, 52,109, 10, 83,234,199,181,192, 81, 88, 43, 5,185,214,154,122,183,103,189,145, -194, 98, 40,104, 46,206,175,120,114,245,146,247, 55,215, 52, 77,195, 98, 33,250,163,206,181, 84, 41, 13, 46,207,115,252, 36, 74, - 26,100,215, 49, 67,216, 31,135,166, 37, 51,154,190,217,163,162,167, 42, 50,250,166, 33,244, 61,101, 37,147,174,139,179, 25,147, -242, 9,117,115,206,195,195, 67, 42, 6,196,137,114,121,121, 14,104,190,253,215,215,116,206, 39, 90,222, 80,228,167,213,172,181, - 68, 60, 69,166,176,218, 82,102,138, 77,189,231,176, 77, 13, 94, 91, 51, 45, 43,246,181,228,215,107,173, 89,158, 95,178, 88,204, - 56, 52, 45,251,122,135,206,172,192,141, 20, 99, 22,196,102,179, 67,107, 97,164,156,151,138,253, 52,227,108, 54, 39,183,169, 24, -202,178, 12,159, 30,228, 1,228, 16, 34,130, 15,184, 24, 48, 81, 32, 50, 42, 14,157, 82, 76, 74, 97,145,191, 21,182, 32, 6, 81, -138,139,232,204, 72,164,166,206,208, 86, 88,185,218, 74, 64,115, 64,196, 93,210, 88,104,130, 10,116,157, 48,115, 3,158,166,247, -137,184,165, 81, 70, 66, 17,172, 54,104, 44, 30,159,170,115,149, 60,172,226,207, 60,230,182, 11,214, 84,143, 83,134, 4,159,215, -162,102, 39,170,196,187,131,224, 2, 1,151,120,207,113,120,231,112, 50, 58,214, 74, 70, 81, 58, 42,124, 20, 64,191,239, 59,130, -209,248,254,168, 68, 53,218, 18,117,127,210,229,171, 4,241, 16,180, 98,159,186,194, 76, 27,172, 53, 82,252,104,141, 77,225, 46, -110, 94,129,209,196, 49, 40, 99, 58,234, 15,198,125, 88,122,253,206,247, 16,196,230, 52,236, 70, 35,162, 64, 47,203, 82, 62,135, -116,144,107,173,201, 82, 80,140, 75, 9, 69,129,136, 9,102,172,212, 71,158, 63,195, 91,151, 3, 66, 37, 4,230, 41, 39,253,116, -164,125, 10,125, 25,139,160, 40, 29, 74,244,242, 96,214,195, 40, 48, 42, 57,212, 58, 71,231, 4, 99, 42,118, 27, 37, 15,178,132, - 43, 85, 81, 19,149,240,145,229, 34,145,239,106,152, 78,156, 98, 95, 7, 71,130, 20,129,241, 17,128,230, 81,104, 77, 86, 28,245, - 29, 73,168, 71, 80,146, 27, 63,116,247, 49, 98,173,232, 34,140, 49, 34,224, 81,154,188,172, 88,173, 86,242,126,149, 1, 2,166, -169, 37,119, 62, 8, 29,208, 90,139,153, 78,216,220,239,121,179,253,137, 47,191,252, 21,109, 47,185,233,251,186,166,237, 29,202, -150,224,123,122,223, 99, 16,151, 7, 97, 8,151, 9,108,183,219,227,200, 53,203, 5,186,164, 79,240,188, 65, 37,140,171,147, 34, - 50, 68,178, 34, 39,215, 6,239, 34,193,230, 28,186, 14,215, 74, 28,171,182, 57,101, 85, 81, 84,213,152,161, 32,137,110, 17,147, - 25,218, 94,108, 60, 89, 22,216,108, 37, 14,246,254,238,142, 16, 28,243,137, 68,250,234, 8,173,235,216,214, 53,229,100,198,195, -122, 69,221,108, 36,155,193, 26, 10, 99,104, 59, 71,236,165, 59,203,115,139,201, 10, 81,184,167, 20, 70,239,197,186, 57, 76, 4, -198,221,120,244,163, 27,161, 40,138,212, 8,132,147,188,137,152,198,199,131,232, 81, 29, 73,119, 41, 29,238,168, 33, 49,228, 69, - 42,100, 51,217,101,219,220, 82,239, 35,239,111, 86, 52, 93,228,201,211,103, 92,223,222, 49, 47, 13,214, 69,148,239, 8, 58,176, -235, 58,206,174,100,111,124,216,239,152,164, 22, 69, 68, 34,129, 60,147, 49,109,150, 21,236,246,123, 50, 99, 88,175,215,252,246, -207,126,205, 15, 63,126,199,205,245,245,137, 61,210,160,173,194, 6, 77, 31, 3, 86,107,138,170, 66, 27,184,111, 14, 34,232,237, - 37, 44,202,135, 64, 89,100,244, 62,210, 57, 1,137, 12,227,246,170,170, 82, 50, 96,160,170, 42,174, 46,167, 99, 7,123,106,249, - 28, 51,236,145,226,173, 77,133, 72,151, 72,160,195,164, 96,136,231,181, 54, 67,169,149,128,102, 98,164,239, 69, 20,216,182, 13, - 10, 7,109,224,236,236,156,178,152,224,123,199,253,237,157,128,155, 10,105,204,154,195,142,229,114,201,110,183, 99,179,219,243, -227,171, 31,192, 7, 62,253,252, 11,178,162,192,251, 72, 72, 65, 60,190,235,169,169, 81,137, 63,112,251,225,154,178,204,201,172, -101,187,221,177,217,252,191,124,247,253,143,120,215, 97,108,142, 70,138, 38,194,227, 9,158, 4,175, 72,154,160,247,114,232,158, -159,159,139, 91,196, 8, 73,241,235,175,191,166,154, 20, 60,127,254,156, 73, 81, 50, 91,138, 19,164,172,114, 97, 3,120,199,247, - 63,252,200, 23,159,125,206, 98,177,224,135, 31, 94,241,238,221, 7,230,115,197,167, 47, 95,240,249,103,159,240,238,221,107,238, -110,111,104,154,134,183,111,223,114,182, 88,242,245,215, 95,115,168,247,220, 94,223,241,231,127,246, 13,211, 42, 67,227,185,190, -110, 88,221,175,112,109,201,147,139,115,230,243, 57,151,103, 75,186,164,159, 40,203, 60, 89,158,125,138,151,118,212,245, 1,163, - 35, 69, 94, 49,159, 78, 37, 40,234, 80,163,181,101, 90, 78,233,251,134,221,118, 69,145,139,178,190,170, 26,238,239,239,201,178, -130,243,229, 25,135,195, 78,206,169,100, 93,142, 62, 64,208, 56, 15, 15,235, 29, 83, 59, 99,189,218, 82,149, 83, 38,211,146,178, - 44,177,213,116, 42,220,233,222,137, 66, 60, 66,240, 78,186, 76, 99, 36,139, 57,165,144, 13,123,244, 40, 51,115, 81,152,167,133, - 63, 17,162, 68,179, 73,176, 65,223,209,180, 29,185,145, 88, 69, 69,196,121, 39,147,242, 76,172, 45, 42, 6, 76, 4,229, 93,218, -193, 75,103,174, 77, 82,173,167,195, 96,236,178,148, 2, 29,101,207,172, 60, 62, 56,114,157, 73, 60,166,214,100, 86, 0, 18, 2, - 49,105, 37, 10, 82,105, 80, 41,168, 2,136,170, 23, 53,122, 58,250,187, 93,195,108, 54,145, 84,182,166, 22,101,234,249, 25, 86, - 27, 14, 77,205,249,242,130,125,189, 99,231, 26,166,217, 36,169, 33, 29, 30,207,164,202,168,166,179, 71,227, 76,185,241,100, 34, - 17,130, 59,166,130,161, 48,153,101,146, 2, 41,250, 94,244, 4, 89, 38,194,173,152,253, 28,146, 50,120,214,219,182,166,109,123, - 32,164, 93,185,193,135,136,177, 89, 18,122,100,184,232,232,187, 30,157,246,233, 33, 4,178,162,160,233,156,192,117, 70, 31, 58, -228, 73, 80, 56,240,249,139,211, 56,210,147,241,248,104,239, 74,177,153, 31, 39,120,141, 93,111,202, 83,142, 90,130,114, 60, 17, - 45,231, 39,133,205,196, 65,209,245, 18,252,163,148,100,125, 7, 79, 31, 34,133,150,144,147,232, 35, 46, 56, 84,212,152, 44, 79, -197, 33,216,220,159, 40,222,143,129, 22, 10,143, 9,134,233,164,196, 16,233,124, 18,138, 41,147, 32, 25,158, 38, 81,217,142, 30, -250,152, 58, 63,153, 36, 25, 13,184, 30,155,220, 3,161,119,228, 89, 73, 89, 76, 56,212, 45,135,186,133, 16,105, 15, 7,202,178, - 28,105,110,179,170,100,183, 59,208, 25,136, 94, 58,160,162,170, 88,109, 54,204, 30, 54,172,183,123,246,135,142,206,235,100,137, - 9,100,249,132, 24, 28,101, 94, 80, 22, 25,109, 93,243,252,226, 5,117,221,144,217,130, 60, 47,232, 93,160, 40, 42,182,187, 3, -243,249,146,222,123, 98, 63,140, 99,161,239, 28,177, 15, 20,133,196, 28, 11,139,161,161,238, 29,109,221,137, 8, 42, 68, 54,187, -189, 92,247, 64,235, 61,141,147, 60,251,214,213,216, 34,199, 84, 83, 58,231, 49,185, 32,146,243,162, 96,179,105, 57,116, 61,173, - 19,161,157, 86,138, 46, 90, 62,220,124, 16, 53,183,143, 56, 87,147,217, 2,147, 65,136,142,174,111,136, 58,173,209,186, 48,250, -200,171,233, 4,173, 35,237,174,166,174,219,180,250,145,123,196,121,185,246,167,211, 57, 79,159, 62,103,179,122, 96,251,176,197, - 24,195,121, 74, 96,235,250, 22,101, 45, 93,219, 98,109, 78,244,125, 74, 35,139,248,228,253, 15,218, 80,119, 53,231,103,115, 14, -245, 14, 27,192, 44, 22,156, 93, 61, 99,167, 13,187,250,129,127,250,246, 13,127,241,213,151,108,214,107,150,179,130,155,219, 91, - 92,223,147,207,102,212, 84,188, 95,237,185, 88,102,204,203, 9,174,239,152, 77, 42, 38,209, 16,148, 34, 63, 43, 89,173,183, 18, - 44,148, 50,224,119,187, 45,174,235,248,221,111,127,203,159,254,249, 95,168,219, 6,180, 34, 43, 51,150,203, 57,215,215,183, 16, -100, 74,209, 30, 14,156,159,157, 81,230,249,120,104,159,157,157,241,244,233,211,209,114,120,113,113,129, 37,229,172, 15, 43, 62, -147, 97, 76, 54,162,186,103,179, 25,155,205,102, 20,189, 54,251, 3, 93,215,224,250,158,186,105,168,235,142, 67, 35,215,224,122, -187,225,254,126, 37, 1, 33,101,193,102,183, 77, 22,215,122,100, 19,120,231,200, 50, 41,132,230,147,169, 80, 48,107, 17, 24, 14, -176,170, 79, 94, 60, 75, 76, 8,135, 49,242, 60,217,237,118, 60,125,250,148, 31, 95,191,226,238,126,141, 50,134,175,191,252,146, -208,181, 76,114,203,139,203,165, 20,201, 40, 33,105, 30, 14,184,166,102, 90, 22, 28, 14, 59,188,181,204,167, 19, 41, 90,186, 94, - 50, 27, 66, 64,231, 86, 18,224, 92, 18, 62, 42, 81,173, 11,168,169, 37,179, 70,242,215,203, 34, 77,106, 37,240,230,211,151,159, -136,231, 63, 6,126,245,249, 75,158, 61,121,202,213,211, 39, 66, 47, 53,122,164,163, 26,148,140,235, 87, 43,218,253,142, 79,159, - 63, 97,181, 90,177,189,191,225, 39,213,211, 7, 71, 57,157,240,112,183,102, 50, 59, 35,132,140, 31,190,127,203,211,167, 87,116, -117,195,143,223,191,226,243, 47, 94, 80, 21, 57,207,159, 94,210,247, 45, 49, 42,254,245,251, 31,248,243,223,253,158,103,207, 47, -121,255,254, 61,147,106, 46,182, 81,231, 71,177, 97,231, 27,209,100, 21, 22,144,231,167, 85, 22, 29,114, 92,171,112,153,100, 73, -156, 47, 39,244,237,158,168, 50, 86,247,119, 50, 77,202, 83, 44,108, 85,178,221,174,209,165,224,167, 47,159, 92,241,246,205, 79, -148, 19,195,122,115, 64,133,158,170,122,137,202, 74, 34,150,201,124,142,237,250, 6,239, 28, 33, 6, 84, 72,227,236,232,199, 95, - 23,101,118,178,171, 61,250,149, 81,160,163,136,194, 84,240,178,243, 34,226,162, 65, 5,208,218, 96,135,177,102, 16, 33,154, 30, -224, 38, 94, 40,241,193, 59, 50,109,200,172, 65,197,158,222,136,135,209,135, 30,109, 50,108, 38,118,149, 83,134,249,209,179,156, - 97,204, 4,215,181,204,166,243, 49,205,168,109, 91,180, 82,148,197,100, 12,228, 56,181, 59, 13, 93,230,112, 16,239,118,187,180, -191,179,148, 47,158, 51,159, 47,168,170, 18,239, 3,135,195,158, 24,193, 26,198, 78,123, 50,153,226, 92,207,225, 80,227,163,231, -108,185, 32, 34,158, 97,173, 20,138, 12, 84,164,107,123,186,182, 17,107, 91,240,116, 46, 64, 47, 23,116,136, 18,203, 72, 82,195, -254,143,200,103, 63, 31, 23,107,156, 11,132,208,166, 12,108,217,107, 14,197,214,176, 55, 31, 44,120, 67,112,132, 73,133,151,119, -225,103,144,152,186,235,199, 29,253,199,233, 79,131,250, 61, 36, 13,164, 79,255,148,203, 96,216,151, 91,180, 58,174, 65,130,138, -226, 63, 72,187,190, 67,202, 89, 30,132, 64,206, 4,108,186,142,164, 19,247,233, 80,151,131, 94, 35, 29, 62, 90, 38, 0,210, 57, - 75, 58,152, 88,175,100,210, 65,136,196,148,218, 20,245, 56,247, 71,171,100, 39, 81,134, 2,141,103,160,230, 5, 20, 58,197, 76, - 43,130, 23, 49,231,197,116,138,209,199,207,223, 26,133,209, 2, 3, 17,177, 76,131, 10,129, 50,207,101,103,156, 37, 38,118,232, - 8,206,224,251,134,190,111, 9,193,240,176, 94,203,216,190,110,241, 72,232, 12,198, 82, 86, 83,201, 34,104,107, 66, 47,235,149, - 42, 47,201,115,203, 97,191,102, 54, 19, 18,214,221,106, 45,241,181, 69, 78,140,138,205,110,199,249,249,241, 58,214, 26, 72,255, - 94,166,176,142, 69, 57, 97,127,168,217, 91,217,237, 14, 44,245,224,250,148,150,232,177,198, 96,134, 96, 31, 47,215,159, 85,150, -172, 42,232,187, 3,147,217,140,217,114,145,214, 96,144, 39, 31,239,106,183,195, 1,198, 90,180,182,168, 94,226, 54,211,188,139, - 60,151,120,222,120, 66, 27,108, 26,225, 91,132, 52,230, 63,213,155, 12, 68,187, 65,236,213,182,109, 2,126,244,143,138, 78, 18, -138, 53, 51, 86, 10, 46, 47,137,128,202, 10,118,117,127, 56, 48,159,205, 88,206,231,143, 86,132,117, 93,115,191,218,208, 28, 26, - 98,211,243,230,253, 53,127,253, 23,191,149,228, 51, 5,161,221,227,162, 97, 91, 55,148,231, 79,177,197, 84, 10,145, 34,199, 40, -141,205, 12, 46,104,234,166, 67,217, 40,174,132,212, 84, 12,251,227,205, 70,112,163,255,246,175,254, 13,171,245, 90,248,252, 89, -198,229,147,171,100, 3,147,107,125,189,149,149,199, 16,142,210, 59,217,109, 15,192,153,205,110, 39,100,194,204,142,142, 11,151, - 68, 70, 74, 41, 73, 47, 75, 32,155,213,106, 37,175, 51, 51, 9,221,107, 33, 10,124, 42, 47, 38, 52, 73,200,232,130,104, 36, 80, -226,174, 25, 64, 85, 67, 65, 85, 20, 5, 49,179, 73,227, 18, 8, 42, 48,201, 39,100,182,224,112, 56,176,234, 58, 46,151,226,195, -119, 93, 79,149, 92, 25,138, 72, 89,202,191,223,222,175, 88,111, 54, 60,121,246,156,167,207,159,115, 86, 22,172, 87,247,163,126, - 37, 70,249,111,159, 62,185,228,243,207, 62, 65, 69,161, 28, 14,206,139,187,187, 59,174,175,175, 69,216, 25, 2,251,195,150,217, -124,158, 14, 99,209, 75, 13, 58,143, 44,203, 40,115,209, 26, 85,133,132,197,228, 86,190,135,178, 44, 41,242,138,135,205,158,135, -251, 21,111,223,253,196,119,223,127,155, 18,204, 90,218,182, 30,221, 39, 89,150,241,226,197, 39,156, 45, 23, 50, 62,207, 51,140, -146,243,104,187, 91,211,246, 94,158, 53, 65,145, 23, 57, 42, 9, 65, 47,206,102, 52,109,203, 97, 95,115,113,121,206,235,215, 27, -158, 61,123,198,135, 15, 55, 84, 85,197,219,119,111,184, 60, 91, 82,148,130,104, 30,220, 54,117, 93, 51,153,201,235,175, 38, 57, - 93,215, 96,181, 56,201,150,203, 37, 90,181, 4,111,196, 55,159,103,168, 16, 9,141,147,123,214,123, 84, 76,147, 80, 3,187,132, -229,237,186, 33,138,217, 83, 77, 39,146, 40,216, 29,104, 90,199,195,190,230,108, 83, 19,231, 21,214,150,216,208,119,194, 11, 78, - 15,243,143, 15,192,120,162, 58, 30,132, 85, 68,121,192, 58,239,208,193,202, 33,172, 44, 54, 27, 84,217,210,233,231,133,133, 40, -126, 85,162,198, 88,198,104,199, 24, 20, 49,234, 49,242, 53,207,252,184,147,175,202,233,120, 24, 15,254,202,225,208, 57,245,122, -102,185,161, 57,236, 71,214,118,215,117,100, 77, 51,218,155,134,238, 83, 68, 74,199,244, 36,109, 12,218,100, 24,155, 49,157, 45, - 36,219, 89, 25,178,188, 32,162, 89,111,182,212,117,139,247, 61,214,230, 24,155, 49,155,231, 18,153,216, 57,246,251, 29,125,239, -197,154,212,123,162, 10, 35,148,134,244,192,243, 17, 34,226,145,138,200,129,232,250,158,174, 23,135,193, 64, 68,235,251,131,236, -247, 63, 58,216, 79, 59,229,199, 59,235,254,209,254,216,230, 25,125,239,198,226,199, 24, 77,223,139,136,202,245, 34,140,138, 1, -124, 56,190,198,227,206, 80, 75,120, 87, 28, 28, 14,160,209,143, 14,254,144,118,223, 33, 77,104,134,119,152,194, 29, 65,153, 17, - 73,249, 49,227,125,248,253, 40,131,210, 3,210, 82,143,187, 84,121, 13,226,146, 80,137,127, 32, 35,218,128, 66,166, 70,138, 32, - 94,123,147,196,154,233,240,142, 10,140, 30,236,148, 98,207, 51, 70,130,133, 80,226,209, 7, 48,131,144,142,193,123, 31,192, 43, - 80, 90,244, 15,202,211, 37, 30,192,252,108,201,124,190,164,105, 26,222,191,127, 47, 65, 43,133,193,185,200, 98, 82, 81,152, 20, - 20,211, 53, 84,153, 33, 51,145,194, 20, 40,166, 68,231,233,154,154,135,187, 59,218,190, 39, 43, 23, 16, 60, 15,183, 55,120, 20, -109,226,144, 71,223,162,203,156, 44,147,112,149,223,252,230, 55,220,222,222,208, 52, 53,219,237,154,233,100,137,115, 61, 69, 81, - 50, 95, 76,217,237, 54,132,216, 17,251,142,222,117, 40,239,208, 38, 96,202, 2, 77, 96,117,243,150,166,149,181,200,114,185,164, -180, 6, 76, 68,227,208, 70,163,179, 92,214, 59, 81,209,247, 97, 36,237,161,250, 65,128, 32, 93,242,100, 42, 43,165,166,195,245, - 14,223,247,172,238,238,105,157, 28,184,193, 51,130,107, 6,109, 6, 32, 60,109,159, 68,178,185,167,117, 98,225,210, 64, 89, 20, -227,250, 38,120, 70, 30, 61,193,227,186,150,195,110, 59,222,171,131,117,242, 52,254,119, 40, 4, 78,199,247, 90,107, 38, 41,208, -102, 49,159, 82, 22, 54, 9,245,170, 81, 28, 40,175, 81,166, 41,239,175,111, 40,202,146,250,176,163,156, 76, 89,223,175,248,240, -176,163,108, 68, 25,253,100, 57, 99, 90, 10,202,212,164,216,204,182,115,160, 20,243,249,140,253,174, 29, 11,106, 21, 21,239,223, -127,224,197,139, 23,124,245,213, 87,252,253,127,253,175,108,247,123,174,111,111,169, 94,191, 22,113,219,195, 42,185,101,228,129, - 28,130, 40,154,219,206, 61,198, 30, 43,217,159, 63,185,186, 64,199, 83,129,174, 73,233,136, 50,217,124,120, 47,123,228, 47,191, -248,156, 23, 47, 94,240,236,201, 83,178,220,176,186,187,231,251, 87, 63,114,123,247,128, 45, 50,118,219, 61,161,247, 18,133, 29, - 21,196, 64, 89,138,138, 95,163,176, 70, 67,150,161,163, 77,107,210,227, 42,107, 62,159,179,223,109, 78, 60,244, 11,225, 20, 40, -131, 82, 98,141, 44,210,132,113,120,134, 14,184,213,105, 18,181, 12,182,185,182,173,233,251, 22,165,100, 77,248,229, 23, 95,243, -234,213, 43,153, 36,172,215, 28, 14, 59,140, 81,204,102, 19,206,207,207,121,242,228, 10,212, 17,217, 60, 76,126,199, 20, 72,215, -225,219, 3,187,122,155,156, 53, 97, 84,181,183, 93,143,210, 37, 93, 18, 99,122,239,121,120,144, 4, 78,177, 2,171,177, 64, 24, - 68,161, 15, 15,162, 97,234,122,217,245,111, 86, 15,248, 8,147,106, 73, 87,183,184,206, 39,225,116,224,233,211, 43,116, 6,171, -205,150,166,111,184,184,122,146,206,160,192,135,247,183,212,187, 45,183,125, 75,150, 25, 14,189,172, 51,130,146,172, 5,101, 32, -132,140,166, 61, 48,159, 79,120,246,236, 5,222,189,103,191, 57,112, 56,236,185, 88, 62,197, 51,165, 13,154,204, 89, 98,104,104, -211, 10,226,200,230, 8, 28,154, 6, 99, 21, 77,223, 37,237, 70, 63,218,114,251,222,211, 25,195,106,119,224,253,237, 67, 90,235, - 22,216, 92,107, 92,116, 40,143,164,235,244, 1, 31,122, 57,116,241,248, 86,246, 86, 85, 57, 37, 47,100,143,211,187,150,182, 17, -184,203,192,180,206, 10, 51,166, 64, 13,202,200, 34,221,212,167,176,143,143, 65, 33, 90,217,241,247, 12, 34,140, 83,191,241,128, - 7,253,184,131, 29, 14,247, 65, 73, 43,222,195, 14,173, 45,121,110, 9, 1,154,230,144,118,255, 33,217,228,134, 29, 93, 71,219, -138,208,170,170, 42,250, 62, 2,142,213,106,135,115,171, 49, 7,122, 40, 36,134,125,117,223, 11, 6,114,168, 0, 39,179, 41, 31, -110,238,199,162,227, 84,125,126,164, 59,181,227,251, 27,246,194,195, 40,219,100, 89, 18,132, 61, 62,196,199, 77, 67,130,212, 12, - 23,210,105, 82,147, 73, 41,121,222,203,255, 71, 84, 88, 43,185,184,206, 57,188, 11,163,171, 96, 0, 1, 29,149,227,169, 72, 72, -106,239,225,117,125,236,117,127,100, 53,250, 31,112, 10, 62,246,174,255, 18, 21,238,116, 47,248, 51, 86,188, 58, 58, 39,204, 73, -241, 56,112,173, 31, 5,140,156,188,126,127, 82, 4,145,178,221, 51, 37, 86,199,143,189,242,227,116, 71,137, 38, 68, 17, 48,153, -161,180, 22, 19, 61, 69,153,243,244, 66, 50,154, 95,190,252, 84, 14,149,122, 63, 10,253,242,220, 50,171, 50,130,111,201,114,205, -180,180,156,233,230,217, 0, 0, 32, 0, 73, 68, 65, 84, 76,138, 89,154, 32, 25, 38,101,134,235,123,138, 66,172,142, 26, 48, 58, -160,180, 36,183,237,219,142,250,176,147,207, 66,121, 98,148,142,250,254,254,158, 50, 87, 34,150, 76, 86,193,188,202,209, 7, 97, -165, 55, 77,141, 54, 98,101,243,193, 9, 18, 52,244,130, 93,141, 22,140,146, 76,242,244, 29, 44,150,203, 17,130, 49, 32,126,125, -148,107,210,117, 94, 38, 88,165,220,147, 93,138,239, 85, 74, 73, 52,233,196,141, 16,148,225,240, 30,162,113, 59,239, 4, 67,156, -238,199, 65,172, 20, 66,224,254,230, 33, 69, 73, 38,139,161,210,144,231, 68, 23, 8, 10, 65,141, 38,193, 82, 68, 14,235, 1, 78, - 50,184, 51, 78,237,136, 67,193, 48, 36,129,157, 90, 28, 79,249,222, 69, 81,112,168,119,236, 82, 30,182,206, 28,147, 16, 81,109, -143, 14, 61, 83, 3,235,237,158, 63,125,251, 45,127,253,151,191,225,187, 63,254, 51, 79,158,189, 96,219,116,216,173,196, 18, 19, -228, 16,201,178, 44,101,146,139, 79,223,207, 42, 98,208,100, 89,142, 89,102, 98, 61, 66,141, 64,168,249,124,206,114,190,224,250, -250, 70, 98,168,211,117,121,234, 78, 25,210,206, 54,155, 93,186,246,253,168,130, 23,216,142, 92,215,235,245,250, 88,200, 39,113, -177,220, 55,114, 15,124,242,201, 39,227, 84,237,213,171, 87,212,135, 29,103,103, 11, 10,155,113,177,148,238,119,183,223, 51,159, - 84,180, 78, 4,152,109, 74,202,115, 33,142,159,163, 15,253,163,164, 67, 99,229, 89,219,181, 82,132, 13, 19, 22,153, 14,157,143, -186, 7,148, 8,231,178, 20,113, 60,222,127,189,227,254,246,150, 44,122,102, 85, 57, 58, 4,234, 20,110, 53,240, 0, 62,188,123, -199,183,223,126,203,126,191,151,128, 48, 34,211,169,224,183, 47, 46,206,249,241,205,171,209,186, 23,130, 19,178,232,184,234,115, -178, 67, 6,129, 46,101, 25,101,126,196, 69,119,206, 99, 77, 73, 94, 77, 56, 59, 59,123,180,106, 43,203, 9,121,158,115,126,126, - 62, 94,211,195,127, 51,144, 54, 55,219, 21,207,158, 94,113,119,191,162,107,106, 66,176, 24,163,164, 19,182,150,109,211, 80, 69, - 73, 9, 93,109, 87, 92, 92, 92,208, 52,141,232, 11,182,123,153,192,118, 7,178,108, 70,211, 53, 84,147,130, 34,159,178, 54, 6, -157, 28, 46, 74,123,156, 43,113,189, 76,168,118,113, 79, 85, 21,216, 76, 17,247, 29,179,249,140,166,107,241, 14,188,107,199,198, -117,152,106, 13, 76,134,190,239,198,194, 87,244, 84, 2, 30,234, 93, 96,123,168,201, 30, 54, 44,150, 75,230, 24,236,108, 90,225, -189,165,109,123,154,198,163,241,105,204,174, 33, 41, 5,139, 34,163,170,166,201,207, 23, 49, 58,144, 25, 75,140,185,164, 86, 37, -251, 74, 49, 73,123,143, 62,137,172,114,251,136,253,125, 36,239,164,174, 57, 72,192,139,120,162, 3, 58, 69,215,121, 82, 78,180, -115,156,159,159,211,159, 28,136,167,170,106,215, 58,194,198, 97,172,194,187, 72,239, 90,242,172,100, 50,149, 15,113,183,223,136, -250, 54,202, 78, 81,233, 40,161, 41,209,209,181, 66,246, 26, 14,238, 83,251,221,112,152, 13,135,219,122,179,123, 92,168,100,114, -129,215,135,150, 60, 47, 37,181, 76, 25,208,154,168, 98,210,210, 11, 44,161,105,154, 19,154, 92,186, 33,188,176,219, 69, 24,150, -136,119,234,152,114, 71,234,104, 85, 26,249, 57,231, 8,125,143,210,199,204,229,225,144,108,219,150,128,194,164, 0,130, 48,140, -156,181,193,102,249, 81, 75,144,212,237, 67,216, 3,104,137,131, 76,162,188,225,253,157, 6,178,156,238,176, 63,142, 47,253, 56, - 42,242,151,226, 81, 79, 81,176,167,213,247,105,197, 95,228, 22, 29, 3, 81, 88,154,227, 4, 32,166,215, 32,224,145, 1,116,227, - 25,128, 2, 58,137, 18,197, 89,145,174, 11, 45, 25,120,167,175,121,120, 47, 10,249, 25,222, 57,240,142, 76, 23, 84, 69,129,234, - 58,206,150, 11,206,150,115, 32, 50,169, 50, 46, 47,159,115,127,247,129, 15, 31, 62, 80, 31, 26,137,235,204, 13, 77,211, 99, 13, -156,159,205,199, 34, 78, 84,172,162,167,168,170,138,105, 85,113,104, 58,108, 81,241,176,218,208,116, 30,115,210, 65,106, 21,152, - 76, 36, 44,201, 24,205,127,251,167,255,135,207, 62,125,206,167,159,190,148, 44,114,223, 49,157, 86, 88,155,227,241,227,125, 87, -218, 12,239, 45,174,235,142, 48, 17, 31,232, 29,152,188, 32,170, 72, 31,101, 87,186, 62, 72, 46,248,100,162,147,165, 74,209, 75, -234, 54, 40,185, 62, 58, 39, 42,229,197,108,206, 97,183,103,191,221, 81,239, 15, 35,116,137, 16, 57,180,245, 72, 29,115, 9,162, - 82,239,247,236, 82,112,147,214, 26,155, 85,100, 90, 31,147,203,138,130, 69, 37,158,219,182,239,248,234,139, 47, 70,122,157, 92, -203,158,174,147,128,140,249,124, 78,215,251,241, 48, 28,226, 96,155, 52,109, 27,254, 30, 44, 84, 42,117,133,189,119, 28,214, 53, - 15,247,183,228, 74,115,104,106,108,222,136,224, 74, 91,116,232, 49,211,130,166,241,252,248,250, 13,255,233, 63,252, 13, 46, 70, - 14,117, 67, 57,153, 97,204,154,178,154, 48,173, 68, 35, 51,153,148,130,237,117, 82,200,207,243,156,174,245, 52, 93, 63, 10, 38, -173,201,199, 2,117,189, 94,243,242,229, 75,190,252,242, 75,254,175,191,255, 47, 84,211,233, 8,133, 25,240,188, 49, 70,138,236, -152, 51, 30, 19,138,217,245,199, 2, 56,234,192,100,178,148, 34, 42, 4,212, 9,139, 98, 40,174, 63,220, 92, 83, 21, 37,243,233, -100,188,151,170,188,224,217,211,167,188,252,228, 57,175, 95,191,230, 95,254,116,143, 34,240,228,114,201,118,159,115,119,191,194, -213, 61, 77, 42, 64, 50,163,240,125, 16,215, 80, 18, 61,107,101,199,221,254, 64, 90,108,154,142, 15,205, 45, 23, 23, 23, 84, 41, - 31, 92, 14,118, 61, 66,141,154,100,189, 91, 46,231,228,185,165,235, 26,152, 22,100,133, 37,170,156,169, 19,110,188, 15, 61,145, -200, 31,255,244,175,201,150, 54, 77,215,181, 60,227,111,111,111,248,233,253,123,208, 50, 73, 26,197,174,189,195,249, 46,173, 11, - 42, 73,205,140, 30, 39,110,119,188,215,232, 40,103, 83, 52,145,224, 3, 42, 77,117,150,203, 37,159,126,250, 41,179, 68,140, 27, - 62,251,219,219, 91,222,188,121,115, 4, 33, 13,211, 94,109,232,155,150, 42,179,196,188,192,232,146,135,213, 22, 26,197,243,231, -207, 89,111,182,172,112,188,124,241,132, 34,159,240,227,235, 55, 76,138,146,178, 42,248,244,147,151,220,220,124,224,252, 66,192, - 78,197,195, 14,109,114,180,146,247, 35, 17,202, 13,145,158,122, 47, 19,188,139,139, 11,186,125, 67, 40, 69,140,121,117,117,134, - 46, 50, 54, 7,177,129,234,166, 29,237,141, 89,106,202, 84, 98, 62, 12,231,232,105, 99, 37, 77,176,164,101,238,155,158,245,190, - 70,221, 61, 96, 5, 46,146,147,219, 78, 36,254, 3,102, 48, 61, 12,135, 78, 57, 70,201,186, 29,118,174,101,158, 97,243, 9,189, -119, 99, 40,200, 64,180, 58,181,109,156,102, 1,127,220,221, 17,181,216, 30,126, 65,221, 60, 60,248,135,157,219,208, 61,156,162, - 20,143,221,122,129, 65,211, 7, 71,166,107,246, 77,137,142,138,186,107,152,150, 19, 58,175,208, 49,200,190, 87,105,180,201, 41, -176,232, 44, 27,133, 93, 56,136, 6,170,124,130, 41, 12, 56,104, 92, 67,236, 35, 42, 83,216,104,192,130, 53, 5, 65, 7,108, 76, - 23, 21,134,246, 80,227,250, 32, 17,150,182, 64,105, 69,223, 5,218,246, 64,145, 75,176,129,119, 17,165,122,140,206,112,186, 19, -155,157,210, 9,201,122,154, 71, 30, 70,187,160,160, 18, 99,130,112,216, 71,164, 63,128, 62, 4, 48,150,204, 88,140, 78, 35,209, -168, 9, 26,140,206,198,195,255, 99,196,164,124, 63, 6, 99, 44, 89,145, 63, 98, 19, 12,227,210,225,175, 97, 12,250, 75, 9,107, -191,148,134,118, 58, 38, 29, 42,234,211, 9,192,105,231,252,184, 96, 80,227, 63,101,178, 32,126, 12,149,210,156, 4, 31, 58,124, - 22, 50,166,180, 10,234,166, 75, 26, 13,247,136, 84,119, 26, 82, 19,131, 35, 6,135, 33,162, 99, 0, 5,214,104,114,107, 40,237, - 52,141,248, 35,151,151,151, 44,230, 83,218,230, 64, 12, 78, 4, 76, 49,144, 91, 67,102, 52,170, 16,209,212,124, 54, 29,175,195, -162, 40,168,155, 61,209, 9, 41,107, 58,157,114, 56, 52, 68,157,243,176, 94,243,253, 15,111,209, 74, 81,228, 9,227,153, 68, 77, -101, 89, 82,101, 98,251, 10, 81,209,246, 29, 77,223,225,155,128,177, 57, 54,207,121,241,226, 69,210,124,136,144,202, 42, 75,244, -178, 59,245,181, 28,130, 89, 81,146, 69, 17, 86,117,181,194,197,128,119, 29,109,211,161,136,163, 72, 75,118,116,134,216, 11, 22, - 51, 70, 17,156,174, 31, 86, 99, 39,125, 56, 28,198,204,241,197, 98,129, 82,138, 95,255,246,207,198, 73,212,144, 49,160,181,166, -156, 76,152, 78,231,100, 89, 1, 74,240,183, 93,223,143,121,213, 67,167,247,240,240,192,237,253, 29,219,237,118,156,100,237,247, -123,118,183, 55, 50, 37,216,108, 83,145,235,127, 70, 23, 28,174,155, 1, 61, 43, 54, 61,199,122,189,150, 34, 50, 56, 84, 42, 46, -142,211, 24, 53, 6, 31,105,163,184,127, 88,243,225,250,142,233,252,156, 31, 95,125,207,217,133, 36,117,145, 23,172, 55, 15, 92, - 44, 39, 73,128, 21, 81,209,227,124,135,201, 10,140,209,180, 93, 61,190,143, 54,244,105, 66, 97,133,158,230, 35,255,241, 63,253, - 29,239,175, 63,140,145,198,109,219,146,249, 48,142,216,135,215,101,140, 97,154,203, 33, 19,195, 17,168, 36,105,100,187, 71,208, -168,225,121, 57, 76, 43,186,212,177,169, 40,163,237,121,149,227,218,134,204,106,206,206,150,252,250,235,175,121,247,238, 45,239, -222,189,163,111,101,231,156, 89, 77,171, 36,244,199,247,125, 10,154, 74, 1, 74, 39, 42,250,182,109,153,230,179,113,186,224,156, -163,111, 61,219,237,150,252,252, 28,107, 53,211,233,244,209,253,106,140,161, 50,102, 12,120,105,118, 30,215,183, 50, 49,154,207, - 71,100,241,161,150,134,233,183,191,253, 45,231,231,231,148, 89, 62,222,147, 98,233, 60,208,244, 61,127,250,238,123,182,251, 61, -237,161,149,123,212, 74,148,244,176, 71,215, 39,208,174,178, 16,155,218, 36, 37,132, 22, 54,227,229,139, 23, 28, 14,135,113, 18, -176,217,108, 30, 77, 36, 7,203,222,128, 67, 31, 40,115, 93,215,209,247, 22,183, 63, 80,205,166,148, 85, 69, 94,204,105, 59, 71, -239, 68, 24,122,191,217,114,121,190,164,115, 82,132, 44,231, 21,234, 66, 73, 42,167,210, 84,165, 60, 15, 98, 12, 24, 35,235,194, -221,126, 71,116,210, 24, 75, 17, 11,251,253, 22,124,224,229,203,151,204,230,211,145,248,248,236,249, 11,118,109, 77,231, 29,214, -138, 21,213,187,152, 98,188, 45,121, 85, 10, 96,202,105,188, 23,189, 74,116, 33, 1,137,228,251,156,206,231,178,222, 10,142, 67, -231,233,110, 87,216,186,149,244, 52, 31,197,242, 20, 6,230,114,202,212,246, 93,251,200,247, 59, 60,248, 93,240, 24, 39,105, 82, -238, 35,232,201,241,161, 95, 31,199,236, 39, 99,221,161, 50, 31,246, 2, 3, 7,124, 0, 78,124,220,217, 13, 89,206, 2, 21,233, - 79, 70,197, 6,239, 37,197, 12,165,136, 40,124, 84,116,189,168,168,125, 16,219,136, 79,135, 65,136, 2,237, 80, 6,140,178,100, -121,134,239, 29, 4, 79, 16,207, 30,157, 15,208,120,130,139,116,174, 99, 54,153,147,151, 25,209, 67,239, 59, 58, 31, 8,222,163, -208,228, 89, 46,135,173,235,137,202,161,141,193,230,133, 16,229,114,169, 48,251,222, 19,122,159,198,231, 62, 89, 52, 2,189,151, -202,185,170, 42, 82, 58,137,176,213, 7,219,224, 96,192, 27, 49,190, 58,113, 2,196, 58,118, 44,144, 68,148, 22, 98, 32,116,195, -225,151,214,165,189, 35, 87, 39, 35,204, 36,118,235,189, 40,244,209, 10,227,143, 7,110,248,133,239,241,151,254,254,248,175,211, - 3,122,184,113,237, 71, 15,219,211,172,245,211,209,188,119, 17,175,196,247,236, 34, 41, 23, 64, 39, 42, 17,130,134, 76,202, 59, -143,164,170, 9,124, 72,110, 34,137, 79,228, 81, 12,236, 35, 28,237, 0, 1,138, 17,155, 89,170,178,192,106, 4, 60, 49, 45,153, - 23,134,232, 68, 44,120,117,117, 69,140,145, 55,111,222,176,219,237, 70,197,241, 48,190,211, 90, 75,140,101,122,111,211,233, 20, -109, 32, 4,143,119,194, 16, 80, 98, 31,193, 88,168,138, 92, 70,253, 90,246,156, 33, 4,234,195,129, 24, 58, 1,102,232,136, 54, -150,251,135, 53,117,211,145,101, 57,214, 8,101,111,191,223,115,126,126,153,180, 29, 98,137,212,134,148,227,157, 0, 77, 74,209, - 29,246,100,161, 39, 58,199,108, 94,240,226,197, 39,124,243,201,211,180, 54,144,240,141, 17, 58,100, 13, 69,150,147,165,135,165, - 11,138,162, 88, 48,157,207, 1, 18, 28, 67, 14,221,162,154, 50,157, 78,211,126, 82, 30, 36,235,245,154,221, 86,162, 93,135,207, - 99,189,222,210,186,158,190,105,233,210,164,101, 20,182,166,149,213,128, 89,181,214, 98, 50,233, 16,157,239,240, 81,165, 46,240, -241,122,234, 52,106,116,248,204,139,162,120,164, 45,177,214, 82,228, 37,187,245,154,201,100,138, 79,161, 71, 25,140, 68, 64, 31, -101, 61,247,167,239, 95,241,251, 63,251,134, 31, 94,191, 66,155,140,233, 92,242,182, 15,102,199,126,191,101,181,153,200, 68, 98, - 72, 62,204,122,180,205,136, 49,176,219,237, 88,206, 23, 60, 60,172, 9, 94, 30,214,222,123,222,188,121,195,215,223,124,195,213, -213, 21,111,222,253,132, 66,143,175,177, 40, 10,122, 47, 97, 36, 67, 24, 80,244, 50,149,139, 39, 5,182, 49, 34,118,236,125, 76, -238, 91,185,199, 93,186,200, 21,102,124, 86, 86, 9, 26, 52,164,246,237,247,123,170,170,228,197,203, 39,252,249,239,126, 77,215, - 53, 92,223,221,203, 14,185, 48,116,157,124,214, 77,221, 97,148, 18, 43,229,112, 47,198,152,178,225, 3, 15, 15, 15,162, 83,168, -196, 34,107,181,225,238,238,142,253,126, 47,106,253,171, 11,202,178, 28,195,105,242, 92,190,191, 73,153,243,250,213, 59, 73,129, -212, 71,241,241, 98, 49, 99,190,156,201,116, 52, 4,150,203,101,162,208,221,201,207, 41,202, 17, 40, 51,141,142,171,191,254, 75, - 30, 86,119,180,251,150,201,180,100,158, 14, 41, 89, 85, 29,153, 10, 3, 67,126,128, 39,101,153,104,162,238,238, 55,204,102, 19, -150,203, 57,251,253,158,251,251, 21,219,237,150,111,191,253,150, 55,111,222, 60,122, 46,124,254,249,231,252,230, 55,223,208, 52, -226, 32,216,111,182,252,250,155, 95,137,192,211, 9, 99,228, 87,191,250, 21,189,139,220,175, 55,248, 0,211,249, 18,143,226,254, - 97,131,181,150,139, 96, 56,236,107, 38, 85,201,229,229, 37,171,213, 29,187,251, 91,234,166, 39,120,203,102,123,160, 42,231,210, -121,107,205,100, 82,178,237,214,220,108,111,120,245,234, 21,147,178,160, 44, 45,187,109,205,122,117, 67,208,226, 78, 24, 32, 65, -174,119,180,125,143, 54, 29, 89, 89, 72, 76,173, 53, 24,107, 57,212, 13, 46, 19,117,253,164,152,140,239,107, 50,153, 96, 84, 28, -115, 66,236,237,253,195,120,216, 14,187,144,143, 31,212,167,201, 96,121,158, 19,125,160,233,250,196, 18, 46, 30,239, 45, 79, 58, -180,190,239,199,176,249,211,189,186, 36,123,249,116, 3,232, 71, 85,250,199, 10,245,225,225, 52,144,153, 6,225,140,152,253, 11, -138,114,114, 84, 46,147,143, 93,137, 60, 36, 2,177,144,238, 89, 23,250,209,152, 88, 39, 52, 97,140, 10, 27, 12, 42, 59,178,202, -197, 14,150, 49, 79,138, 96,231, 28,251,122, 47, 86,131,162, 32,203,242,244,129, 14,136,203,140, 44, 83,227,127,235,189, 26,227, -104,135, 14, 20,186,147, 68,179,156, 24,101,242,192, 71, 29,236,233,103,127,140, 39,213, 63,203, 85, 30, 30,156, 1,245,232,160, - 61,245,180,158,238,202, 63,214, 53, 28,105, 80,253, 35, 1,207,233, 24,253, 23, 15,201,255,159, 3,253,151,118,234,195, 67,105, - 40,236,134, 3,113, 92,193,216,244,158, 61,184, 32,188, 4, 31, 24, 85,234, 58, 61, 8,133,193, 30, 8, 46, 18, 93,192, 40, 81, -199,231,121, 57,230, 81,159,230, 24,200,232, 42, 41,241, 83,151, 94, 22, 57,243,105, 82,165, 22, 57,147,170,192, 31,246, 44, 23, -103, 24,155,243,238,189,168,114, 55,155, 13,109, 43,124,237,139,139, 43, 2,176,217,237,199,104,211, 67, 35,163,176,103,207, 96, -127,216,178, 90, 61,224,187, 30,215,183,184,182, 99, 95, 55, 76,231,226,217,239,251, 54, 1,155, 84,154,202, 48, 38, 96,201,126, - 60, 48, 91,206,152,206,150,248,104,169,219,134, 69, 53, 67,103, 25, 79,158, 60,225, 55,191,254, 29,109, 87,143,244,180,178, 16, -145,216,249, 66, 86, 0, 86, 7, 98, 12,220,223,220, 81, 78, 43, 94, 62,123,193,161,173, 89,223, 63, 80,119, 45,153,177,236,155, -154,253,221, 67,226,104,203,248,119,179,223,177,221,237, 33, 74,116,240,160, 26, 62, 63, 63,231,254,254,158,222,199,145,209,221, -165,152, 97, 57, 16,212, 56, 42,119,206, 81, 85,211, 81,249,156,101, 89, 26, 61,186,244, 64,155, 8,240, 35,141, 67,187,174,163, -233,100,212,219,187,150,222, 71,136, 38, 37, 17, 30, 99,156, 79,187,244, 97, 61, 52,188,142,225, 58, 10, 33,176, 63, 52,146,221, - 94,149, 56, 31, 31, 37, 3,138, 45,202, 97,115,203,183, 63,190,226,247,191,255,115,162,201,184, 95,175, 88, 46,206,120,247,225, - 61, 85,190, 16, 14,124,150, 49,159, 75, 50, 90,219,245,104,221, 48,153, 45,200,140, 98,187, 90,243,213, 55,191, 97,183,219,165, -213,149, 36,143,189,123,247,142,201,164,228,215,191,254, 53,175,223,190,225,112,216,143,233, 95,211,233,148,114, 82,200, 88,219, -133, 35, 42, 54, 38, 97,233,160,155, 49,154,162,154, 18, 82,243,115, 26,250, 20, 99,164,181,162,121,105, 14, 7,172,209,148,153, - 37,168, 19, 50,163,142,188,251,233, 45, 95,124,254, 41,247,247,247,188,121,243,134, 76, 43, 38,211, 89,138, 73,149,105,211, 24, -229,236,143,235,171, 1, 98, 52, 66,112,170, 66,146, 9,171,140,251,123, 81,179,159,157,157,177,217,236,152,205, 38,227,103, 62, -224, 87,203, 20,175, 26, 93, 63, 22, 46,183,183,183, 40, 21,199,140,133,237,118,203,235,215,175,169,170,138, 55,111, 94,115,126, -126,206,217,124,193,237,237,173,232, 49, 30,110, 37,107,192, 42, 46, 22, 23, 76, 22, 19, 20,102, 4,223,196,232,217,111, 15, 35, - 16,109,184,238,134,235, 81,104,139,226,211, 31,174,199,217,108,193,197,197,197,248,252, 89, 44, 22, 99, 17,180, 90,173,132,122, -119, 38,201,139,109,189, 5, 96,177, 88,176,212, 57,119,235, 29,117,179,103,189,171,185,190,121,224,211, 79, 63,165,237, 28, 69, - 53,227,139, 95,125,195, 15,223,253,145, 79,159, 63,227,199,215,111,248,219,127,247, 63, 49,153,230, 56,215,178,217,174, 18,125, - 79, 44,222, 69,145, 37, 34,159, 99,183,219, 48,153,148,148, 85,206,135, 15, 31,176, 90,145, 23,178,250,236,125, 71, 23, 20,187, - 77, 67,215, 56, 84,148,169,106,219, 57,250,216,160,178,156,162, 20,160,205,160,124,215, 73,248,119,190, 60, 79,120,241,156,179, -197,108,108, 64, 54,155, 13, 54, 96,210,222, 85,161,109,193,180,154,141,213,122, 53,153,142,106,187, 65, 72, 81,101, 37,155,205, -134,203,203,203, 20, 61,104,200,178,252, 81,194, 88,159, 56,211, 62,212,132,168, 49, 54, 27,241,123, 54,179,212, 77,207,116,182, - 76, 93,161,163, 73, 65, 41, 67, 56,133,181, 86,190,212,180, 91,206,211,190, 42,164, 84,184, 44,237,172,134,232,207,192,128,145, -149,202, 54,248, 40,162, 19,155, 83, 84, 83, 54,155, 13,243,249, 92, 66, 57, 50,169, 72,209,150,125,221,142,249,231, 93,219,141, - 15,180, 44,203,152, 45,206,120,120,120,160, 72,158,231,206, 5,178,172,160,247,145,172,176, 66,211,242, 82, 69,238,235, 54,141, - 93, 69, 69, 61, 40,221,234, 86, 70, 80,109,211, 48, 75,170,106,225, 43, 7,234, 86,186, 67,223, 8,217, 42, 1,160,208,218, 98, - 76, 54,114,158, 7, 44,164, 4,152, 36,102,123, 58,180,251,222,143,254,214,143,139,129,143,119,225, 31, 71,162,186,148, 22, 6, - 97, 12,122, 57, 21,203,157,174, 65, 78, 11,138, 71,202,248,143,132,119,195,207, 25,110,176,225, 90, 24,126,223,105,193, 49, 60, -152,188, 23, 95,170,119,129,222,123,138, 44, 35,162,233,122,143, 11, 61,185, 5, 23,122, 84,212,216,220, 96,172,193, 71,151,146, -225,228, 53,100, 86, 99, 77, 62, 22, 36,167,185,237,190, 23, 33,148, 10,114,227,247,185, 29, 87, 74,121,158,211,244, 61, 14,197, - 54,229, 94, 15, 15,111,173, 53,249,100, 74,147, 30, 24, 90,107,170, 16, 81, 54, 99,181,219,139,213,104,189,199,232,128,115, 34, - 66, 43,202, 9, 38,207,184,154,206, 88,158, 95, 48, 89, 44,153, 44,206, 40,166, 51, 14,135,134,229,217, 25, 90, 73, 10,212,151, - 95,124,198,211,167, 79,200, 51, 9,126,113,189,167,115, 61,171,213, 74, 86, 78, 62,142, 58,140,250,208,115,216,238, 36,178,113, -208, 69, 56, 81, 80, 55,206,227, 99,160,217,183,152, 92,131, 87,236,155, 29, 70, 9,179,220,106, 67,221, 54,148,121, 49, 30, 58, - 67, 55, 73,240,148,182,163, 72,246, 78,173, 53,235,213, 22,239, 34,147,180, 83, 29,180, 2,195,164, 41,207,133, 95, 62, 20,249, -101, 94,200, 62, 93,171,113, 44,106,140,193, 22,185,100,192, 87,213, 88,196, 40,165,168,219,102,236,220, 93, 12,244,157, 56, 69, -234,186, 30, 15,237,225,154,215,218,166,188,234, 60, 41,218,197,122, 89,215,245,216,189,135, 16, 70, 63,249,114, 89,201, 61, 56, -169,232,123, 39, 36, 64, 83,209,245, 53, 63,190,122, 75, 94, 84,220,221,221, 48,159,207, 33, 68, 54,235, 21, 23, 23,103,105,167, -124,199,114,185,228,236,252,130,253,190,102,183,222, 80, 78,103,204,103, 83,174,223,191,165, 44, 69, 77,159,220,152, 76, 38, 19, -110,111,111,121,250,252, 25,191,249,250, 27,254,241, 31,255, 17,215,181,146,220,183, 90, 73,204,174, 70, 72,101,173,161,235,146, - 15, 91, 71,140,102,156,220,100, 89, 65, 72,140,120,165, 20, 70,229,104,155,225,251,110, 20, 75, 13, 7,175,142,129,213,106,197, -239,127,255,123,110,175,223, 51, 89, 87, 60,127,126,206,118,187,229,233,147, 75,190,252,213,231,188,123,127, 45, 1, 55,243, 57, -121,239, 89,173, 54, 4,223, 83,164,245,138,214,154,170,170,142,129, 70,169, 73,170,138,103, 92, 94, 60, 97,189,121,160, 21, 48, -158, 76,116,140,165,233, 28,183,215,239,217,108, 54, 84,101,129, 86, 25,247,119,183,228,198,210, 57, 57, 48,191,252,242, 75,118, -187, 29,219,237,158,249,124,201,229,213, 21, 46, 53,118,255,252,207,255,156, 14,227,158,159,126,122,155,158,109, 25,157,139,212, -174,199,230, 57,187,118,195,191,190,191, 37,244, 73,165, 53,164,158,121,177,240,157, 70,243, 14,205,165,209,154,202,244, 50, 57, - 77, 80,162,182,109,199,231,230, 23, 95,124, 49, 22, 75, 67, 48,207, 31,254,240, 7,254,246,111,255, 61, 55, 55, 55,252,240,221, - 94,216,238, 33,208,245,145, 62, 68, 54,245,154,160, 51,170, 73,193,190,169,199, 98,243,230,253, 27,158, 62,121,193,195,106,203, -211, 39,207,121,243,211, 91,254,195,223,254, 59,174,174, 46,248,187,191,251, 59,254,243,127,254, 95,120, 88,237,104, 27,199, 97, -191, 77, 33, 75, 59,154, 70,242,213, 15,251, 45,211,105,193,231, 95,255,138,222,213,188,255,240, 19,180,134,174, 15,152,228,220, -112,173,136,233, 76,227,216,237,247,244,206, 49, 95, 76,153, 47,103, 99, 35, 59, 60, 83, 69,119,226,153, 76, 10, 98,240,104, 99, -120,184,189,145,181, 90, 94, 76,137, 58,226, 90, 71, 86, 25, 14,219, 3, 46, 58,170,201, 2,101, 21,185,206,113, 68,140, 45, 37, -153,198, 43,130, 54,108,182, 53, 69, 49, 73, 94, 74,131,209,150,221,126,195,116, 50,231,242,242, 9,111, 94,191,101, 58,171,240, - 78,225, 92,143, 34,147, 17,107, 15,101, 57,161, 62,244,132,232, 68,201,235, 92, 34, 83,229, 35,192, 98, 24,239,157,122, 67,119, -187, 29, 89,150, 37, 36,224, 2,165, 12,117, 2,140,156, 70, 25, 94, 92, 92,140, 9, 70,215,215,215,146,169, 91,203,206, 98,181, - 90,141,213,219,169,125, 96, 58,157,114,127,127, 63,254,156, 87,175, 94,241,197, 23, 95,112,119,119,151,114,181, 23,108, 54,155, -177,155, 29,108, 5, 74, 41, 46, 47, 47,249,241,199, 31, 57, 63, 63, 31,167, 29,101, 41,116,159,135,135, 7,242, 60, 31, 67, 16, -134,157,227,112,192, 23,133, 84,200,167,221,242, 48,105, 88,175,215,143,146,154,134,159,119,122, 40,170, 19,145,201,169, 38, 97, -120, 32, 75, 18,214, 17,155, 43,187,250, 56,122, 85,135, 95, 15, 68, 55,130, 34,170,128,198,164, 95,139,192, 80, 69, 37,243,176, -148,103, 45,121,199,142,204,136,213, 79, 69,240,193,141,255,187,198,128,142,244,173, 19, 20, 48,134, 54,122,250,214, 16,240,233, -231, 72,247,109,221, 41, 2,182, 65,117,234,100, 50,208,167,206,197,209,123,253,209, 52, 71, 60,229,167,194,190, 83, 27,160,164, -188, 73, 70, 0, 39,118,190,161,226, 63,212,150,207, 62,255, 28,231,156,248,102,209, 96,115,202, 42, 27,169,125, 49, 69,126, 86, - 85,197,217,217,217,216, 57, 74,181, 60,167, 44,114, 66, 87, 19,124,207,114, 54, 31, 31,148, 38,203, 48, 70,138,212,188,170,216, -237,107, 9,180,216,109,184,187,187,225,221, 79,175,229, 70,238,122, 25,177, 39, 10, 88,219, 72, 87, 23, 82,145, 55,142,165,125, - 72,241,187,146,198,148,219, 2, 93,100, 52,125, 63, 82, 21,139, 32,122, 14,109,139,180,102,202,112, 49,146,151, 19,148, 49,244, - 81,118,205, 85, 37,201,126, 93, 91,167,169,211,113,122, 51, 48, 11,230, 41,228, 99, 8,208,185,186,146,131,103, 8,139,169,107, -193, 75,231,182, 24, 59,240,193,158, 86, 85, 21,121, 85,166,206,183, 75, 2,184, 3, 62, 30, 15,146,195,225, 32, 1, 23,113, 72, - 38,108, 31,117,171, 63,139,129,254, 40, 27, 92,190, 75,253,179,162,117,248,254, 93,144, 0,152, 67,211, 82, 88,195,159,190,255, -129, 47, 63,123,201, 79, 63,253,132,181, 53,101,145,147,101,102, 68,254,198,228,251, 70,201,103, 80, 77, 10,250,182, 97, 90, 86, -108, 15,210, 96, 88,171,113, 62,142,238,151,197, 98,193,213,213, 37, 79,159, 62,229,236,236,140,245,122, 77, 84,114, 24, 79,178, -105,122,158,185, 71,108,251,227,123, 18,115,168, 45, 64,123,253, 51,119,208,105,234,101, 94, 22, 56,159,132,158, 33, 77,122,242, -138,159,126,250,137, 60, 83,188,120,118,133, 49,134,103,207,158,209, 52, 29,239,111,239,200,108,158,154,128,236,209,231,118, 44, -152,244,163, 85,233,195,131,116,166,171,245, 61,121, 38,215,222,106,181,161,200,114, 22, 11,225,185,107,173, 89, 46,132, 9, 50, -159, 76,185,222,109,121,254,252, 57, 15, 15,119, 35, 25,241,255, 99,235, 77,131,109, 75,239,242,190,223,122,215,188,214,158,247, - 25,239,124,187,175,122,146,186, 91, 18, 8, 97, 98, 7,100, 11,162, 42, 65,108,134,114, 4, 4,203, 78, 19,149, 10, 59,229,144, -170,160, 15, 96, 91,134,162,108, 97,176,131, 49, 50, 40, 33,102, 40,197,178, 21, 72,165,224,147, 44, 69,118, 8,136,214, 8, 45, -117,183,122,188,125,231,123,238, 25,246,184,230, 41, 31,254,239, 90,103,159,150, 85,213,213, 45,245,213,189,251,236,189,246,251, -254,135,231,249, 61,174,235, 18, 69, 17,158,231,209,235,245, 40,242,156,119,189,235, 93, 60,120,240,128,186,174,187,244,180, 60, -207,185,114,117,135, 56,205, 56,153,207, 89,204, 22, 84, 84,132, 94,136,235,122,157, 56, 50,232, 5,167,211,183, 14,111,173, 40, -235, 6, 67,137,120,207,247, 28,124, 59,212,218, 16,177,202,181,190,250,243,231,207,179,179,179,195, 96, 48, 96, 62, 63,225,181, -215, 94,227,198,141, 27, 28,159, 28,234,148, 63,197,173, 91,119, 40,202,154,222,112, 68,156,164,212,134, 73,133, 69,213, 52,236, -239,236,115,124,124, 76, 94,138, 13,251,222,193, 33, 23,206,159, 99,111,123,194,237, 59,247,217,222, 30,242,198, 27, 55,120,234, -169,183,243,218,171,215, 57, 57,153, 51,159,159,128, 97,163,148, 37, 34, 76,173, 69, 49,140,138,249,124,206,238,222,148,232,245, -136,197,106,137,239, 15, 81, 86, 69, 85,155,152,166,139,235,249,164, 69,195, 42, 78, 88,175, 35,188,192, 39, 77,115,153,186,232, -207,178,179, 51, 91, 22, 71,135,135, 80, 22,130, 9, 55, 77, 92,199,193,106, 12,147,170, 46, 73,243,146, 97, 24,208, 24,153,228, -115, 27,146, 51,237,187, 2, 5, 72,178,132,154, 10,163, 81,140,198, 83,178, 36,167,172, 97, 50,222,226,248,248,152,126,127, 72, -191, 55, 20,210, 86,158, 51, 24,140, 68, 25, 73,163,197, 87, 50,162,137,210,164,243,119, 59,142,141, 19, 88, 92,188,120,145, 87, - 94,121, 5,207,243,232,247,135,154,108,228, 75,226,148,109,147,231,146,234, 22, 4, 61, 86,171, 21,166,105,107, 33, 21, 76,167, - 83, 22,139, 69, 55, 70,115, 93, 87, 56,220,122,231,105, 24, 70, 7, 4,176,109,187,251,245,158,231, 17,134, 33, 71, 71, 39,157, - 58, 55, 8, 2,102,179, 25,219,219,219, 44,151, 75,157,208, 69, 23,182,208,130, 51, 90,187,202,102,103,184,189,189,221,141,231, -139,162, 96,181, 90,117,138,204, 36, 73,186,108,100,165,148, 4,127,140,199, 90,112, 83, 16, 4,190, 70,133,230, 58,192, 65,242, -198,119,119,183,245, 1,178, 57,238,174, 37,177, 74,255, 21,232,207,199, 48, 54,194, 78,180, 30, 66,117,206,242,214, 87, 94,107, -168,154, 30,195, 25,173,135, 31, 76,195,160, 54, 68,168, 87, 86,133,228, 87, 27, 2, 32,162,150, 4,189,178, 41, 49,145, 67,183, - 41, 27,138, 42,167, 49, 74,242, 42,167, 46,106,138,186,144, 95,111,130,137, 73,163, 26, 76,195,212,170,116,131,198,104,160, 42, -105, 16,248,137, 97,153, 26, 11,219, 90,215,236, 51,234,223,150,210, 39,160, 27,186,247,161,213, 0, 88,166, 73, 83,231, 40,165, - 87, 16,166, 22, 1, 81, 99, 42,179,131,245,136, 88,174,198,208, 59,186, 44,203, 4,249, 91,215, 28, 29,207,136,227,184, 11,176, - 0,177,197,213,141, 33,227,254, 90, 7,227,100, 57,171, 72, 70,143,109, 46,185,239,187,212, 85,129,170,107, 76, 26,122,161, 79, - 85,200,239,111,219, 54,105, 81,179,142, 51, 6,147, 41,171,117, 44,112, 29, 67,144,154, 70,163,197,161,141, 69, 20, 69,221,151, -180,168, 55,166, 45,149,136,109, 12, 75, 81, 25, 21,101, 93, 82,102, 57,208, 80, 58, 13, 78, 93,225,185,138,154, 6, 63,112, 49, - 77,132, 10,233,186,212,133,128, 95,134,195,161, 46, 22,165,224, 9,117,241, 44, 35,225, 16,223, 11,116,120,196,170,131,199, 68, -203,136,244, 48,215,126, 94,233, 16, 90,156,169,227, 56,132, 97,200, 50, 90,227, 90,173,149, 79, 46, 25,101,138,199,122,177, 88, -176,184,125,135,213,106, 69,127, 56,144,169, 80, 89,159,142,211, 77, 83, 23, 26, 54,101,221,144,151,165,132, 10,233,110,164,179, -124, 90, 22, 69,154, 82,181,211, 31,173, 57, 41,203, 82,162,107, 65,108,153, 27,211,169,214, 6,170, 12, 45, 30, 74, 10,156,190, -207,241,108,201, 83, 79, 62,201,206,222, 46,179,147, 67,124, 95,128, 43,174, 31,176, 92,172,186,247,138,186, 33, 79, 51, 92,247, -236,164, 74, 41, 3, 27, 19, 84, 77, 85, 54,148,117, 69, 86,100,220,185,115, 71, 18,190,166, 83,121,127, 60, 79,166,140, 85, 77, - 18,197,221, 26,209,214,103, 69,211,198,244, 73,181, 76, 83,202, 51,209, 22, 51,242,236, 11, 74,161,106, 4,106, 69, 45,192,154, - 48, 16,223,249, 58,142,176, 92,135,248, 56,209,207,162,129, 50, 44,246,246,246,168,107,152,173,214, 88,166,141, 97, 90,100, 69, -165,237,179, 74, 20,234,121, 77, 89, 75,244,171,237, 90,152,153,121,166,224,112,189,128,134, 37,129, 47, 63,135,109, 74,119,184, -179,179,195,120, 60, 38, 12,124,108,101, 64,211,224,233, 73,140,151,134,156,204, 22,122,215,237,234, 51, 90, 26,168,209, 72, 66, - 82, 70,195, 73, 87,208,141, 39, 67,113, 29,149, 37,158,107,114,240,224, 30,183,223,184,205,209,252,136, 58,175,177,236, 6,127, -216,199,117,183,186,230, 75, 92, 10,193,153,139,205,178, 44, 38,219, 91, 58,240, 5,125,246,202,217, 23, 71, 9,139,197,130, 55, -174,223,224,238,157,123,164, 89, 66,150, 37,204,231,115,194,208,151,162,173, 40,112,109, 15,203,114,240, 3, 7, 47,240, 56,156, -157,160, 76,135,241,246,152,241,100,155, 87, 95,126,141,178,172,153, 12, 71,132,253, 62,163,241,128,215,111,222,100,177,154,243, -240,229, 11,124,243,197,215,184,246,208,101,150, 11,177, 2, 62,244,208, 21,158,123,238, 27,244,123, 30,158, 23, 48,232, 79,112, - 28,135, 94, 63,192,243, 28, 76,213,240,240,181,203,140, 6,161,104,133, 12,139,163, 89,196,157,187,135,204,151, 9,149,206,232, - 8,195,144,188, 40,181,251, 64,206,124,183,116,187,201,167,101, 88, 4,158, 75,224, 58,184,142,133,109,105,194, 72, 93, 97,217, -174,131, 81, 42, 80, 25,113,156, 82, 84, 37, 61,191, 71, 93,215,140,199,211,110, 87,178,189,189,221,237, 50,102,179,133,248, 31, - 27,131, 59,247,239, 49, 30, 12,181,114,214,212,187,179,180, 83,115, 10,213,204,234, 42,175,182, 11, 23,219, 71, 69,158,151,188, -242,202, 43, 93, 37,152,101, 89, 55, 38, 76,146,132,245,122,221,165,218,180,178,126,211, 52,201,115, 81,226, 39,217,113, 55, 14, - 59, 62, 62,238,132, 3,237, 30,165, 21,124,180, 42,112,217,251, 24,156,156,156, 48,159,207,187,189,225,131,195, 67,182,183, 36, -230,111, 62, 63,161,105, 12,130,192, 35, 77,115,148,130,178,108, 24, 14,251,172, 86,145, 88, 44,202,154,193,160,167,139,149, 76, -239,155,214,120,158,199,112,216,239, 44, 13,134, 33, 84, 39,185,208,209,217,189, 11,141,141, 28,200, 56, 49,141,152, 76, 38, 40, - 19, 86,203, 8,203,150,125,228,114, 53,239, 96, 61, 52,170,251,123,195,233, 94,189,165,153,177, 65,245,234, 68,110, 84,152,202, -150,255, 31,154,129,175,211,237, 90,117,185, 99, 90, 90, 49, 95,158,142,172,203,242,172, 32,174, 60,237,152, 74, 61,221,144,228, -189, 18,229, 89, 56,154,205,111, 53,234, 91,124,236,242,231, 26,157,176,177, 81, 13, 86,163,244,235,151, 41, 65, 94,136,200,208, -177,237, 55, 89,122, 20, 52, 85,199,161,223, 84,181,203,165,110, 80, 23,245, 41,177,236, 63,163, 71, 40, 75,217,167,215,186,131, - 43,114,205,195, 86,178, 10,120,229,181, 87,245,158,176,234, 38, 30,237,186,192,182,109,242,236,212,202,216,142,123, 11,173,242, -246, 18,143, 52,137,160,174,176, 77,131,222, 74,212,170,237,168,204, 80, 22, 69,117, 74, 89,203,138,188,139, 75,149,213, 64, 65, -191, 55,236,222, 31,137,120, 61,213, 6,180,162,210,246, 63,182,229,224, 5,162, 0,238,245,122,248,190, 71,217,148, 84,117,214, -169,151,155,166,193, 49, 79, 19,216, 22,139, 5, 32,180, 53,154, 70,143, 94, 75,201,244,182, 44,150,139, 21,101, 89,119,246,209, -214,215, 92, 20, 5, 89,145, 67, 35, 9,111, 74, 41,129,168,232,241,102, 75,139,235,107,145, 93, 43,174,173,171, 90,176,192, 85, -133,178, 36,112,200, 80, 74,236,176, 24,100,101,165, 21,145,208, 96, 81,111,192,148, 78,185,254,117,231,233,222,220,177,111, 10, -118, 55,147,249,218,103,190,157,238, 85, 77, 13,166,162,174, 12,210,178, 36,175, 27,124,219,225,104, 62,231,161,171,215,248,243, -197, 9, 61,207, 38,137, 86,114, 70,172, 99,130, 32, 96, 48, 24,108, 36, 9,154, 93,119, 43,234,127,151,117,154, 2, 74,162, 89, -203, 18, 48, 56, 60, 60,212, 59,249,190,124, 86, 74, 46,201,182, 83,204,203,170, 19, 42,182, 44,251,238,251,161, 12,138, 82, 70, -167, 54, 6, 5,101,247,236,110,106,108,210,188, 68,169,156,189,193, 30, 73,158,113,253,245, 27,108,111,111,227,121, 62, 73,146, -113,124,124, 76, 86, 84, 56,158, 79, 47, 28, 48, 25, 79,137,162, 68,232,127, 27, 48, 43,207,243,186,162,169,253,126,180, 83,155, -126,191,207,106,181, 98, 52, 26,201,238,215,178,176, 76, 89,117,204,231, 16,250, 62,142, 99, 11,219, 61, 79,169,202, 28,207,147, - 9,102, 16, 4,124,243,155,223,148, 9,149,158, 0,156, 59,119,129,227,227, 99,110,222,188, 41,147,153,181,104,146,190,255,251, -191,159,209,104, 36,206,136,227, 7, 24,134,193,133,253,115,236,239,236, 18, 69, 81,199, 45,104,155,167,246,172,111, 47,246,246, -142,104,133,134, 69, 93, 80, 85, 5, 81,148,144,166, 14,101, 89, 11,154,184,106, 88, 44, 22, 29,135,225,224,193,125,157, 89, 82, -178,179, 59, 97,107,107,194,151,190,244, 21, 40,149, 0,198, 28,147,161,209, 48, 25, 13, 24,140, 38,152,142,135, 81, 21,248,174, - 13,142,197, 67, 15, 61,196,189,123,119,152, 47, 78,200,179,152,239,250, 75,239,226,224,112,134,111,154,156, 28,175,176, 44,193, - 5,239,108,109,243, 61,223,243, 95,242,252,243, 47,178,183,187,131,101,121,221, 93, 53,155,205, 56, 62, 58,224,222,253, 91,100, -201,154,178, 41, 57,119,254, 18,101,158, 98,234,187,161, 30,112,167,174, 0, 0, 32, 0, 73, 68, 65, 84,172, 45,156, 74,206, 27, -201, 13,169,197,227,238,218, 40,203, 60,165,115,150, 13,166, 49,224,202,197,115,244, 2,191,123,254,235,186,198,202, 18, 25,153, -140,135, 3,210, 52,197,115,108,234, 82, 46,242,225, 80, 42,170,192,115, 73, 34,129, 40, 20, 89,218,117,208,242, 5,183, 88,197, -218,150, 18, 23,236,237,157, 99, 57, 91,178,179,179,199,122, 29,129,169, 40,234,130, 60, 90, 82,150, 57,195,225,152,120,177,198, - 11, 3, 22, 11, 97, 19,251, 97,159,178,134, 82,143,222,143, 78,230,242, 1,154, 38, 73, 22,177, 92, 75,224,133,239,251,140,167, -219,204,102, 51, 66,205,226, 46,117, 17,176, 92, 46, 25,141, 70,221,193,179,183,183,215,141,237, 15, 15, 15, 25, 12, 6,157,114, -185,237,232,243, 60, 23, 97,129,173, 24,143,134,196,201,154, 34,175, 24,142,250,216,150,203,108,126, 76,224,247,116,231, 42, 44, - 97,195, 48, 48, 45,133,239,135,120,190, 67,145, 22, 56,182,137, 2,118,183,167, 68, 81, 76,211, 84,120,158, 40, 18,155,170, 96, - 50, 26,112,235,214, 29,241,118, 90,138,221,237, 41, 73,180,210, 7, 93, 13, 85, 73,180, 90,136,231,176,134,178, 49, 68, 77,156, -156,194,115,222,124, 25,183, 17,179, 69,118, 54,218,242,140,184,142,154,166, 42,186,152, 88,165, 4,236, 98, 40, 11, 3, 37,142, -186,166,189,132, 91,148,106,163,105,108,198, 25,175,121, 89,201, 56,211, 80, 74, 80,172,166,146, 36, 59, 3,237,179, 55,191, 5, -107,123,154,190, 37,201,108,150,121,118,204, 8, 16,122, 46, 70, 29,163, 84,131,103,157,189,184,165,195,203,190,229,144,171,244, - 95, 57,116,220,118, 41, 72, 78, 61,207,157,144,176, 44, 59,255,111, 77, 35,113,170,101,141, 99, 89, 88,142,173,223, 87,227,140, -214, 32,207, 43,137, 54,104, 26,177, 70,233,162, 66,240,147, 89, 87, 92, 58,142,131,178, 69, 37,237, 27, 22, 89, 85,225,123, 46, -142,165,247,167,166,133,107,219, 66,184,179,109, 60, 83,232,138, 85,145, 99,155, 22,118, 24,202,248,215, 86,167,135, 88,110,118, - 23,102,155, 47,221,138, 78,171,170,162,168, 75,202,120,205,114,189,214, 49,177, 6,181,158,116, 84,250, 16,183,117,193,210, 22, -178,126,224,146,100, 37,209,106,141,109, 75,241, 93, 85, 58, 20,169,110, 72,117,146,150,227,185, 98,187, 43, 37,235,121,189, 94, -211,235,245,200,171,146,160, 17,152, 76, 94,149, 36,121, 38,241,170, 85, 67, 83, 72, 36,104,170,167, 19,134, 97, 82,212, 21,166, -178,240,130, 80, 82,193,148,161,247,150,165,196, 52,171,211,206, 58, 43, 10, 61,117, 58,157,206,108,174, 82, 54,147, 5,223,124, -137,119,105,110, 85, 67,165,170,110, 26, 39,187,249, 80,222,175,170,162,106, 12,170, 6, 94,122,249, 85,206,253,229,239,144, 96, -144, 34, 37, 8, 2, 26,211, 97, 48,156, 16,250, 1,158, 23,224,251,174,144, 4,131,128,213, 42,146,181, 2,210, 41, 85, 85, 41, - 58, 31,163,193,118, 76,148, 33, 77, 75,175,215, 99,119,119,151,193, 64,166, 18,141,125, 74,179,236,246,192, 58,226,184, 54, 78, - 9,108,134,169,176,108,228,140, 44, 74,138, 56,163, 44,191, 85, 8,107,219, 54,166,146,238,237, 40, 73,184,127,120,132, 23,246, -168, 11,233,124,143,143,103,184,126, 72, 99,136,195, 96,103,103,135, 91,183,238,144,100,226,247, 47,235, 83, 33,178,178, 76,113, -211,234,239,189,237,104, 55,138,169, 88,175, 86,108,237,108,107, 85,247, 28,219, 21,174,128, 92,236,115,250,253, 0, 85, 55, 26, -230,213,116,171, 80,211,180,217,217,217,147,149,162, 22, 82, 46,230, 43, 60, 79, 92, 5,127,246,103,127,134,109,219, 76, 38, 19, - 14, 14, 14, 49, 77, 1, 24, 61,255,226,203, 58, 58,186,236, 26, 48,199,113,152, 78,167, 93,177,216,174,198,226, 56, 62, 67, 27, -148,239,159, 69,150,172,176, 76,131, 40,146, 92, 2,219, 22, 48,139,239, 73, 6,252,211, 79, 63,189,241, 90, 11,150, 75,177,179, -237,238,238, 50,157, 78, 25,246,119,152, 78,167, 24, 10,250,195, 0,215,181,137,179,156, 91, 55,239, 80, 82,224,218, 54, 69,217, -240,198, 27,111, 48,159,139, 6, 99, 56, 28,114,239,224,152,245,242,132,119, 62,250, 4,135, 15,102, 76,183,134,120, 97, 64, 81, -138,189,111, 60,238,115,239,254, 93,198,163, 45, 30, 60, 56, 98, 57, 23, 27,102, 63, 20, 18,228,238,206,132, 87, 94,123,133, 7, - 7, 95,163, 54, 44, 80, 46,181, 33,188,132,170,106,132, 70,218, 22,170,182,217,241, 15,140, 70,120, 29,117, 93,227,234, 59,216, - 82, 66, 46,109,155,102,203, 82,138, 52,139,169,139,154, 85,188,162,231,247, 48, 76, 24,246,251,152,150,193,241,225, 33,171,120, -197,176, 55,196,116, 76, 9,114,143, 87,132, 94, 72,156,136, 16, 0,160,223,235, 99, 90, 22,139,197,140,233,214,152,245,122,201, -231,254,159,255,192,123,255,218,247, 97,168, 70,198, 61,142, 75, 93, 75, 16,196,114, 57,239, 14,175,118,247,219,142,192, 91, 32, - 62,192,254,254, 62,179,217,140,193, 96,192,205,155, 55, 25, 14,135, 92,186,116,137,163,163,163, 78, 0, 81, 20, 5, 55,110,220, - 96,127,127,191,131,130,180,187,240,186,174, 59,140,108,235,121,221,220,193, 13,134,178,179,158,205,102,210,125,249,110,119,112, -223,190,125,187,203, 80, 14,130,160, 11, 88, 40,138,130,170, 46, 56, 60, 92, 50,234, 15,184,113,243, 46,151, 47, 93,212,107,136, - 62,121, 94, 17, 69, 43, 93,253, 46, 89,175,151, 93, 44,160, 76, 1, 68, 33,122,124,124,216,169, 22,219, 15,112, 83,228,214,102, -125,183,171,134, 83, 20,173,210,196, 57, 3,215,245,187,159,167, 21,120,217,182,121,166,195,193,104,206,170,194,141,166, 99, 76, - 83,159,245,140,191,217, 74,216, 78, 0,218, 67,180, 45,138, 54, 59,170, 55, 43,236,207, 90, 17, 79, 47,227, 86, 55,176, 41,226, -115,109, 19,163, 46,116,215,224,156, 65,252, 70, 81, 4,182,250,207,218,230, 90,109,131,161,225, 65,117, 37,151, 54,111,218,177, -158, 17, 11, 86,181, 48,229, 53,136,167,253, 57,218,215,213, 94, 40,109,119, 44,136, 93,163,203, 9,104,139, 38,199, 17,151,133, -229, 58, 68, 89,129, 1, 56,190,139,231,123, 12,123,190,132, 1,233,209,110, 94, 34,254,243,174,203,172, 72,210, 24,234,138, 48, - 16, 72, 82,123,136, 75, 39, 33, 33, 15,117,173,180,120, 52,237, 28, 20,242,235,228,249, 78,210,132, 40, 78,200,155,138, 32, 12, - 69,168,167,137,112,226,123,181,137,227,136, 60, 73,217, 82, 19,154,218, 32, 74, 98,140, 24,198,211, 17,142,227,146,166, 49,161, - 31,116, 63,115, 59, 77,243, 60,143,192,239,225,251, 62,113,150,130,198,192,182,184,205, 77,206,123,180,204,136,214,107, 48,132, -110,103,185, 54, 77, 41, 94, 99,215, 21,236,114, 94,213, 36,121, 70, 94, 84, 56,206,233, 78,191, 44, 75, 84,161,186,176,139, 86, -115,210,174, 65, 54,167, 54,237,116, 96,243, 57, 19,135,131,234,116, 37,109,170, 97, 7,179,169,196, 45, 97,217, 46,168,154,117, - 20,177, 92, 71,236,237,237,113,227,149,151,196,206,138, 28,140, 69,166,119,225, 58,140,164,245,233, 59,150,205, 42, 90,147, 52, - 9, 69, 41,105,119, 73,154,162, 44,155,225,112, 72,161,113,163,195,225,144,221,221, 93, 14, 15, 15, 59, 66, 91,170,127, 93,235, - 57,175,170, 74, 68,189, 27,175, 31, 67, 46,247,164, 73, 89,215, 53,101, 94, 96, 57,167, 24,222,117,146,118, 2,211,188,144,226, -199,118, 60, 48, 20, 81, 44,184, 98,170, 8,199, 11, 48,149,141, 82, 38,131,193, 0,207, 59,102,182, 90, 10,111,190, 57,157,124, -180, 86,101, 3,227,204,119,163, 61,255,218, 11,239,248, 88,130, 69,198,163, 17, 74,201,148,212,182, 12,124,199,165, 23, 6, 84, - 69, 46,216,223, 68, 82, 32,223,242,150,183, 48,159,207,187, 85,229,235,175,191,206,229,203,151, 89, 46,151,188,245,173,111,237, -206,185,219,183,111,115,253,250,117, 61, 41, 61,209, 64,161, 83, 43,173,157, 23, 20,101,197,157,187,247,186,117, 79,219,129,110, -166, 49, 74,114,153,194, 54, 43,202, 66, 51, 1,168,186,184,239,246,207, 19,129,117,197,185,115,231,216,221,157, 10,218,184, 47, - 83, 25,223, 11,153,205, 22,216, 78,128,161, 74, 92,223,194,118, 12,162,213,140, 50, 79,185,112,233, 33,206,239,187,140,198, 91, -188,242,242,117,194,176,143, 97,154, 28,159, 28,242,202,245,215,121,215,219,159,226,133, 23, 95,230,219,158,122, 27, 89, 90,144, -172, 35,109,223, 59, 98, 50, 29,113,112,112, 72, 20,173,112, 93,155,193, 96, 32, 86, 81,215,167,169, 13, 70,195, 9,182,229,208, - 24,138, 92, 36, 63,162, 61, 73, 18,202,198, 66, 41, 19,219,114, 57, 89,204,169,141,134, 65, 47,208, 63,139, 62, 79,107, 89,217, - 28, 30, 30,146,246,251,221, 90,194,113, 28,233,212,107, 42, 20, 38, 61,223,163,169, 4, 95,185,191,123,142, 91,119,238,176, 53, -153, 80,164, 9,231,247,247,184,119,112,151,192, 11,201,203,140, 60, 77,100,158,239,186, 44, 22, 43,138, 50, 35, 12,125, 12,195, -228,228,228, 8,165, 44,222,243,158,239,102, 60,158,114,120,120,128,105,218,184,174,176,112,119,119,183, 57, 58, 58, 97,186, 53, - 33,207,202, 46, 59, 58, 12, 67, 86,171, 21,219,219,219, 58,227, 55,224,254,253,251,221,165,215,126,217,238,222,189,219, 29,174, - 85, 85,177, 92, 46,113, 93,169,176, 31, 28, 62, 96, 50,158, 48,155,205,152, 76, 38,172,215,107, 38,147,137,182,160, 4,132, 97, -216,141, 16,197, 3, 27,147,101, 9,166,217,170,169,229,224, 88,173, 18, 29,165, 39,227,159,147,147,156,126,223,215,236, 98,147, -245, 58,145,240,142,104,197,229, 75,231, 89,175,151,186,211,150, 17, 79, 20,173,169,170, 83,231, 64, 28, 23,250,141,151,168,207, -229,114, 78, 24,134, 44, 22, 11, 44,219,236, 14,181, 65,127,208,253,172,134,162, 35, 35,189, 89,225,222,141, 44, 13,179, 19,192, -180, 2, 56,215,115,186,135, 95, 46,170, 55,165,170, 53, 85,199,169,119,180, 42,166,105,212,153, 75,249,205, 34,165,170,178,186, - 66,163, 85, 50,119, 94,219, 13, 75, 98, 59, 26,111,191,128,173,149,103,179,219,222,180, 56, 22, 89,138, 99, 25,184,174,141,235, -152,250,242, 16,177,150,162,194, 54, 79, 11,139, 86,191,208, 94,176,114,249, 42, 29, 45,139,206,119,215, 69, 17, 70,119,192, 11, -223, 64, 70,120, 93,103,191, 97,145, 49, 26,249, 57, 28, 75, 94,183,173,109, 89, 77, 93,161, 12, 25,243, 91,166, 65, 81,215, 52, -117, 73, 93, 85, 84, 72,231,218,160,217, 11,101,197,106, 29,163,104,176,116, 65, 18, 98,146, 23, 21,113,154,146, 38, 57, 37,101, -151,136, 87, 85, 18,165,106,152,134,230,142, 75,164,102, 85,137, 21,175,172,114,170,188,234, 34, 54,229,253, 83,250,179,171,197, - 14, 83,136, 88, 45,116,250,148,121,193, 56, 28, 10, 68, 38, 89, 19, 6, 33, 39,179, 4,101,214,212,105,132,101,217, 12, 52,206, -214,166,196, 51, 29,176, 20,142,165, 48,125,159,172, 40, 40,170,138,181, 6,208,216,182, 43, 81,174,250, 89, 72,178, 84,112,201, -141, 92, 46, 74,127,238,163,209, 8,219, 49, 41,244,107,109,119,200,174, 39, 62,247,186, 49,200,171, 26, 83,217, 36, 45, 21, 75, - 89,242, 89, 25, 85,183,134,235, 4,110, 90, 84,212,126, 94,237, 51,246,230,148,192,206,179,174, 11,162, 54, 44,197,104, 36,140, -167,168, 74,178, 34,167, 46,229,231,178,244,110,120, 54,155,241,208,197,221,174, 72,240, 3,151,170,108,136, 83,237, 0,169, 27, - 22,179,130, 52, 73,152,110,109,225, 56,234, 76,129, 81, 85, 21, 85, 83,208, 20,121,167, 53, 88, 46,231, 93,225,223,106, 46,148, -101,211,235,245,136,146,184,139,233, 21, 1,223,217, 73, 86, 94, 36,216,174,163, 19, 21, 26, 77,189,108,186, 53, 80,169,249, 29, -105,145, 51, 91, 46,200,179,130,222,160,223, 77,104, 44,203,166,200,115,214,235,152,254, 96,132,109, 59,148, 24,108,109,237,240, -224,100, 70,165,233,108, 53, 13, 77,158, 83,233,239, 67, 69, 69, 93,159, 90,120,227, 36, 99, 50,153,176, 88, 44, 25, 12, 6,108, -111, 11,231,188,215,235, 81, 85, 5, 71,247, 15,176, 45,209,198, 36, 74, 18, 54,227, 56,166,223,115,169,170,154,249,124,193,209, -209,241,233, 90, 68,119,217,182,229,118,162, 57,215,117,121,238,185,231,186,113,180,105,154,244, 2,151,170, 46,186, 21, 98, 89, -150,164,209, 82,236, 90,182, 73,158,197, 18, 59,234,137,131, 10,117,106,207,107,170,130,192,119,187, 85,113,211, 52, 4,190,172, - 80, 92, 39,232,108,119,101, 85,116,207,212,149, 43, 87,112, 92, 11,215,181,185,118,237, 26,223,248,198,235,210, 73,175,142, 56, - 62,233, 51,232,251,164,105,194,124, 46,163,123,219,234,241,202,203,175,179,142, 50,166, 91,187,244,122,125,198,211, 9, 94,207, -231,213,215,222, 96,203, 11, 41,139, 6,223, 15,153,205,142,216,218, 27,115,254,252, 57, 14, 14, 14,120,219, 91, 31,231,235,207, -189, 72, 89,200,196,175, 5, 60,165,105, 44,129, 49,147, 9,183,238,222,161, 40, 52,233,175,182,206, 52, 45,173,203, 3, 26,162, - 64,200,127,182,206, 94, 48,170,154, 40, 73,176, 77,133,157, 21,104,154, 46, 85, 13, 86,127, 16, 82,148, 37, 73, 28, 11,109,205, -130,119,190,243,157,252,250,191,250, 87,244, 7, 3,254,227,231, 63, 79, 89,150,204,230,199, 76,167, 83, 94,120,254,121, 46, 94, -186,132,161,171,251,235, 55,111,112,254,252,121,182,183,183,249,202, 87,190,196, 39, 63,249,111,121,223,251,190,143,159,253,217, -127,192,239,254,238,111,115,254,252, 69, 70,163, 17, 63,242, 35,127,147, 31,255,241, 31,101, 56, 28,147,166, 49,127,247,239,254, - 15, 60,255,252,243, 88,166,195,173, 91,183,248,216,199, 62,198, 15,253,208, 15,113,238,220, 57, 62,252,225, 15,243,199,127,252, -199, 68,145,228, 61,183, 23,188,239,251,252,204,207,252, 12,239,127,255,251,137,227,152, 31,251,177, 31,227,250,245,235,221, 62, -107, 54,155,177, 53,221, 34, 12, 67,126,239,247,126,143, 75,151, 46, 1,240,204, 51,207,112,255,254,125, 76,203,224,245,235,175, -242,139, 63,255, 11,124,240,131, 31,196,247,125,254,254,255,244,211,124,254,243,159, 35,207, 75,118,118,182,249,195, 63,252, 67, -170,170,226, 63,253,167,255,212,105, 8, 76,211,228,194,133,125, 62,254,241,143,115,245,234, 85,146, 36,225,163,255,224, 31,242, -167,127,250,167, 76,182,183,249,210,151,191,200, 39,127,239,147,252,213,247,254, 85,254,241, 71,127,158,103,191,248,103, 76, 38, - 19, 26,106, 38,227, 41,191,243, 59,191,211,237,118,126,250,167,127,154, 87, 94,121, 5,165, 20,111,220,184,206,199,255,213,175, -243,158,247,188,135, 95,251,181, 95,227,245, 55,174,243,137, 79,124, 2,211, 52,249,252,231, 63,207, 79,252,196, 79,240,228,147, - 79, 98, 41,115, 35,240, 66,199,187, 54,141,228,150, 43,177,149,136, 56, 78, 30,214,214, 22,216,217,254, 54,216,242,170,169,207, -116,225,101, 94,157, 65,227,110, 18, 4, 91, 97, 75,219, 65,182, 29, 83, 43, 20,108,247,182,109,103,146,101,153, 88,173,170,156, - 90, 89, 40,133,136, 26, 55, 46,244, 66,239, 91,101, 76,100, 96,121, 54,174,229,119, 95,250,170,170,164,138,246,125,150,161,199, -237,219,183,169, 1, 91, 41, 26,195, 16,117,108,224, 98, 34, 29,105,158, 23, 20,165, 4,218, 72,213,223, 30,134,116,133,141,196, - 88,170, 78,232, 88,215,122, 39,101, 26,194,250,214, 69, 73,217,137,153,154, 78, 95,208, 52,213, 25, 55, 65,165,137,110,178, 19, - 46, 48, 29,147,170,212, 23, 18, 21,117,237, 10,227, 32, 12,216,218,154, 16, 37, 25,118,108, 98,109,216,109, 48,108, 98,173, 4, - 15, 3,225, 44, 88,122, 4,111,233,168,224, 34, 77,201,154, 90, 72, 92,166,234,162,108, 77,109,225,236, 53, 62,166, 1,182,105, -176, 55, 29, 19, 69, 17, 59,211, 17,174,107,179, 92, 26,162, 67,169, 82, 74, 87, 46,121,179, 81,236, 76, 69,180, 89,150, 5,141, -149, 17,186,226, 81,119,188, 64,130, 89, 54, 46,203,246,146,108,167, 93,167, 93,178,252,172, 65, 16,144, 91, 22, 65,191,167,131, - 38,116,186,223, 6, 29, 49, 78, 50, 42,180,200,169, 23,162, 44,139, 52,207, 5,248,169,108,177,199,101,197,233,138,167, 44,207, -132, 54,181,148,182, 86,135,179,201,164,111, 71,216,213,198,132,169,253,125,218,238, 57, 77,197,194, 53, 91, 46,160, 31, 82, 38, - 9, 71, 39,115, 46,238,111,177,181, 35, 34,212, 56,141, 25, 79,182,168,242, 76, 70,164,185,104, 13,146, 56, 99, 54, 91,176,181, -181, 37,132, 60,211,214,145,182, 50, 93,204,242,130, 36, 90, 99, 15, 28,226, 40, 98,107,178,205,197,139, 23,153,205,102, 44,151, - 75, 34, 77,242, 59,147,185, 46, 93, 67,247,172, 85, 85,195,114,181, 34,236,247,116, 49,108, 97, 89, 53,150,233,136,125, 87,191, -255, 85, 85, 80, 22, 37,105, 20,107, 84,171, 79,150,164, 88,150,195,238,222, 57, 86,243, 25, 85, 85,118, 84,183, 94, 18,211, 15, -125,142,143, 15,120,245,245,235, 88,142,131,107,218,212,170,162,108, 10,253,158,105,118, 4, 70,247, 26, 13,195, 16,123,101, 89, -114,254,252,121, 86,171, 21,129,223, 35,142,100,100,237,232, 85, 84,154,198,244, 66,159,241,120, 76,146,150, 12,135, 3, 14, 15, - 15,201,178,172,155,100, 14, 6,125,110,222,190,197,238,238, 46,113, 28,115,251,246,109,170,170, 98,127,127,159,193, 96, 64,154, - 68,228,121,202,165,243, 59, 20, 69,214, 93,252,105,154,114,235,214, 45,142,142,142,244,110,221,211,108, 46,121,125,182,166,202, - 73, 83, 38, 77, 88, 93, 85,156, 63,127,158, 60, 43,241, 52,183,196,113, 60,198,163, 9, 7, 7, 7, 92,188,116,129,123,247,238, -113,239,222, 29, 86,171,136,251, 15,238,145, 36, 17, 85,101,224,185,125,124, 47,100, 50, 25, 99,219, 6,135, 71, 39,210,241,155, - 54, 89, 81, 49, 26,247, 57, 89,220,151, 93,126,158,114,101,235, 42, 47,190,244, 2, 85, 93,241,248, 91,223, 74,242,224, 4,229, -184,188,252,234,117,246,246,167,220,187,123,200,133,139,123,156, 63,127,129,215, 95,127,131, 71, 30,185,198,215,190,246,220,153, -230, 52,240, 4,229, 59, 26, 15,112,173, 35,178, 52, 38,203, 83,178, 82,145,229, 53,141,229, 81, 86, 6, 73, 26,117,235,203, 60, - 19, 1,174,163, 44, 60, 15,154,178, 33,138, 18,198,195,254,155,178, 46, 20, 86,150,151, 88,174, 3, 70, 70,146,231,248,142,203, -207,254,195,127,196,255,241,111,255, 29,191,245,219,255,134,191,243,183, 62,136,233,184, 40,211,230,100,177,196,118, 60,106, 67, -225, 90, 54, 77, 93,233,157,163,197, 98,190, 98, 60,158,242,245,231,158,231,163, 31,253, 40,158, 27, 80,215,176, 94,137, 8,229, -255,250,131,255,155, 79,126,242,147, 40,195,226,202,213, 75,252,214,255,246,111,248,238,239,254,110, 65, 21,246,122,220,187,119, -143,239,251,190,239,227,219,191,253,219,249,213, 95,253, 85,222,253,238,119,119,209,168,109,119,109,154, 38, 47,191,252, 50, 63, -255,243, 63,207, 51,207, 60,195,175,252,202,175,240, 35, 63,244, 55,160, 46, 49,141, 6,199, 18,175,251, 47,253,210, 47,241,235, -191,254,235,124,230, 51,159,225,201,167,222,202, 39, 62,241, 9,190,243, 93,239,198, 86, 6,182, 50, 56, 62,122,192,187,191,227, -219,120,247,187,191,147, 95,255,248,111,240, 93,127,229, 47, 99, 91, 6,191,249,155,255, 43,191,252,203,255,156,207,126,246,179, -252,224,127,253,215,233, 7,125,134,189,190,252,158,255,244,159,240,155,255,250,227, 60,255,252,243, 92,187,118,141, 95,254,165, -127,198,143,252,200,143,136,128,195,182,184,115,243, 38, 63,244, 55,254, 58,190, 31, 50,232,133, 26, 52, 3,191,242,203,255,140, -223,254, 55,255, 59,159,250,212,167,248,208,135, 62,196, 63,250,135,255,128,159,250,169,159, 34, 47, 37, 83,248,198,235,215,249, - 27,255,226, 87, 24,244, 71,252,235, 79,252, 38,191,247, 59,191,199,167, 63,253,105,126,224, 7,126, 64,194,106, 26,169,142, 91, - 75,147, 82, 18,210,210, 84, 18, 33, 88, 81,106,148,169, 8,218,219,247,193,181, 37,135,221,106, 26, 44,211,162,105,106,109,183, -171, 58, 20,108,211, 52,228,177, 68,118,182,252,231,190,158,102, 40,213,208, 52, 37, 84, 41,161,239,162,144, 3,138, 58,167,201, - 75,108,199,164, 23,122,164, 73,130,213,212,244, 92,147,129,223,211, 2, 35,177, 9, 89,150,194, 48,173,174, 99,142,162, 8,213, - 52, 40, 29,167,216,162, 21, 61,111,168, 87, 18,142, 14,206,136, 8, 3,135,237,173, 17,166, 1,179,197,156,170, 40,233, 13,250, -120,142, 79,148,172, 89, 45,150,100,133,216,115, 12,211, 70, 25, 6,166, 97, 96, 89,138,172, 41,169,138, 12,163, 81,168,198,192, -168,114,253,254, 24,148,133, 6,125, 24, 22,166, 22,112,158, 78, 46, 64, 41, 61,206,167, 33,215, 9,101, 89,145, 82,163,197,123, -182, 69, 89,200,191, 87, 70,131,107, 26, 56,142,173, 81,179,224, 88, 6,131,192,195,177,109,138, 44, 98,119, 60, 68,149, 49,117, - 59,222,211, 88, 94,133,236,124, 7, 97,143,245,122, 37, 44,251,162, 96, 52, 28,138,176,173,174,133,219,109, 89,148,149, 48,235, -139,178, 68,209,224,186, 14,138,154,120, 53,199,115, 37,139,121,208,243, 24,244, 68, 8, 85,100, 34, 2,115,109,147, 50,173,240, -245, 65,232,251,174,126, 46, 50,173,147,200,201,243,170,179,186, 41,189,151,203,243,130, 52,215,150, 82,211,198,210,254,112, 73, - 86,148, 75, 84, 66, 96, 2, 76,199,195, 53, 61, 76,251, 20,211,155,166, 41, 85, 89,227,123, 22,166, 97,146,233,192, 14,217,227, - 43,168, 43,226, 68, 46,168, 56,139,207,140,204, 79,201,134,154,195,176, 33, 24,108,193, 46,155,132,191,166, 57,157,226,212,117, -201, 96, 52, 36,203, 19,170,170,192, 52, 13,138, 34, 39, 74, 34,140, 38,103,107, 60,228,240,228,152,146,183, 96,121, 62,182,235, - 48, 13, 29,146,245,146, 65, 47,192,115, 76, 22,235,181,232,104,234, 74,186,223,126,129,101,187,152,202, 32,240, 66,154, 90,192, - 40,212, 50,145,169,138,146,126,216,227,238,157, 91, 92,123,228, 45, 92,187,118,141,187,119,239,210, 40,131,178, 42, 58,206,135, -178, 28,162, 40, 33,203, 10,221,145,214,172,163,152,178,174,153, 45,151, 29,226,185,169,141, 78, 92,167,148, 69, 93,198, 40,195, -160,204,114, 86,235, 5,231,246,246,137,163, 53,171,229, 2,163,110,184,113,235, 62, 15, 95,189, 66,150, 46,121,229,213,151,120, -228, 45, 87,113, 28,155,241,208,229,219,158,126,140,131,219,183,137,226, 24,211, 13,112,149,131,225, 66, 94,102, 68,122,172, 95, -100, 5,142, 99, 11,217,179, 40, 59,178,217,131,251, 15,164,128,235,245, 57, 60, 60,228,210,165, 75,120,174, 35,145,165,166,137, -167,225, 50, 96,146,166, 49, 65,224,203, 4, 50, 90,201,234, 44, 73,177, 93,143,162,146, 98,237,220,133, 11,220,190,125,155, 91, -183,110, 49,153, 76,120,248,218, 85,118,183,183, 24,245, 61, 20, 37, 69, 94,113,116,116,196,157, 59,247,240,253,144,225, 80,184, -244, 23, 47, 93, 17,116,175,113,138, 7,111, 11,191, 40, 17,234,163, 50, 45,238,222, 19,143,118, 93, 30,118, 62,238,162,168, 56, - 62, 62,150,233,158,109,179,183,183,207,193,193, 1,247, 14,180,117, 57, 90,227, 88, 46, 65,208,103,185, 76, 89, 71, 57,126, 24, - 10, 39,160,172,137,210,146,147,197,146,218, 52, 40,200,240, 66,139, 7,135,183,177,172,154,243,187,123,220,191,115,159, 11,123, -231,121,227,222,125,202, 34,197, 13,124,182,119, 70,188,240,194,171, 60,245,228, 19, 12,123,125,230,243, 37,239,120,250,109,124, -241,139, 95, 36, 78, 99,118,118,118, 41,202,146, 55,110,223,230,187, 46,254, 37,162,117,198,254,206, 62, 55,239,222,199, 84, 16, -120, 46,135,139, 37,158, 55,192,208, 40,231,229,114,201,120, 48,164, 44,107, 12, 85, 3, 57,118, 96,179, 92,174,169,203,188,131, -124,249,190,207,254,254, 57,140,199, 30,125, 75,211,162, 2,135,195, 33,199,199,199,220,189,123,151,171, 87,175,118,163,212,231, -158,123,142,107,215,174,145,101, 25, 47,191,252, 50,239,122,215,187,152,205,132, 68,119,253,245, 27, 92,187,118, 13,203,178,184, -119,255, 62,219, 91, 91, 93, 94,242,243,207, 63,207,149, 43, 87, 80, 74,241,142,119,188,131, 95,252,197, 95,100, 58,157, 18, 69, - 17, 79, 60,241, 4,231,207,159, 71, 41,197,107,175,189,198,227,143, 63,206, 82, 63,220,215,175, 95,231,226,197,139,221, 46,106, -189, 94, 51, 28, 14,121,233,165,151,120,226,137, 39,186,234,253,203, 95,254, 50, 79, 63,249, 86,154,166,225,213, 87, 95,229,226, -197,139,100,133, 60, 28,223,248,198, 55,232,245,122, 24,170, 97,127,127,159,183, 63,249, 54,162, 40,226,193,193,125,174, 92,185, - 66, 83, 21, 20, 85,195, 27, 55,110,243,232,227,111,165, 44, 75,174,191,241, 26, 79, 63,253, 52,119,239,222,229,226,185,243, 60, -251,236, 23,184,116,233, 18,105,150,112,235,214, 45,138,162,224,224,222,253,206, 38,244,222,247,254, 85, 44,165,120,254,149, 87, -120,242,209, 71,187,200,197,158, 46, 82, 92,215,229,217,103,159,229,123,190,231,123, 68,145, 89,215,124,229, 43, 95,225,169,167, -158, 66, 89, 38, 95,255,139, 63,231, 45, 15, 63,140,194,192,180, 28, 94,120,225, 5, 30,121,228, 81,148,109,209,239,247,121,246, -217,103,249,246,119,188,179, 83,129, 43, 26,124,215, 70, 25,160, 26, 80,182, 69, 82,150, 2, 25,209, 64,134, 50,215,157,176,105, - 2, 13,131, 80,192, 5,149,254,240,187, 24,219,178, 34, 45, 36,213,174,209,206,130,162, 40, 48,245, 62,202,178, 68,129,111, 40, -225, 37,215, 29,240, 64, 14,102,219,209, 10,223,188,229,117, 27,223, 2,184,145, 52, 53,249,245,101, 81,119,251, 54,215,117, 9, - 67, 73,253,107, 74, 41, 16, 90, 62, 65, 85, 54,186,210, 31,104,117,171,224, 54,243,172,236,212,175, 45,227, 57,207,115,182,118, -118,187,135, 90, 66, 63,236, 78, 76,211, 30,250, 81, 20,201, 30, 84,219,157, 90, 5,105,173, 59,150,179, 90, 0, 61, 78,175,228, -215,180, 19,146, 22, 8, 84,116,171, 14,217,255,154,134, 65, 47, 8,113,109, 9, 10,242, 44,139,233,104,200,120, 52,192,213,129, - 70,203, 85,196,122, 29, 75,130,156, 50,169, 49, 4, 95,172,213,181,121,150,202,179,170,121, 9,171,213,138, 44, 59,237, 94,218, -125,104,251,186, 91, 80,211, 98,177,192, 50, 96,107,123,210,165,151,157, 10,197,228,125,107,243,152,187, 81,164,182,244,149,101, - 73, 86, 84, 20,141, 60,123,182,125,186, 82,217,236,216,171,242, 84,160, 38, 81,162, 50,237,200,178,140,178,174,177, 93, 95,231, - 19, 72,154, 97, 75,145,107, 21,243, 74,127, 30,155,194,183,205,245,201,124,181, 60, 35,140,107,167, 64,237,136, 86, 98, 60, 79, -115, 36,218,220,237,118,138, 86,214, 13, 69,145, 49, 8, 66,146, 36, 98,107, 58, 22,138, 93,191, 47,154, 29,199,194, 82, 10, 83, -213, 12, 67, 31,207,172,249,182,167,158,224,177,135, 46,241,141,231,254,130,104,177,228,226,249, 11, 84, 53,220,190,125,155, 70, - 41, 92, 47, 16,119,139,166,118,217,158,240,198, 77,203,166,204, 11,226, 84, 46,117,211,118, 24,244, 71, 18, 93,154, 38,156, 63, -127,158,249, 98,197,141, 91, 55,121,238,249,111, 16,134, 33, 24, 50,242, 79,178, 74,107, 9,164, 81, 73,226,148,198, 0,101,218, -148,154, 81,208, 52, 13, 89,113,170, 81, 41,203,146,104,181, 20, 97,102, 35,182,185,115,122,223,189, 53, 30,113,225,194, 37, 22, -179, 21,239,120,199,211, 28, 63,184,195,124,113,200,183, 61,253, 86,122,125,143, 44, 73, 81,202,226, 75, 95,254, 11,238,220, 61, - 2,195,166, 86, 38,113, 26,177, 76, 86,216,174,104, 99, 22,179,165,254,179,106, 61,213,147,149, 66, 75,217, 73,147,152, 71, 30, -185,198,237, 27, 55,201,139,152, 11,123,123,212, 77,206,246,116, 34,162,228,162,196, 84,246,105, 86,124, 42,205,151,227, 74,116, -118, 85,148, 12, 6, 3, 66,189,223,238, 5, 1, 39, 39, 39, 44,150, 51,174, 92,186,200,219,159,124,140,187,183,223,224,246,173, -187,220,191,127,159,131,163,227, 78,164,104, 24, 6,111,123,242, 73, 1, 19,233,166, 67,184,231,250,181,233,117, 78, 69,131,161, -181, 65, 52,213, 25,231, 77, 16,244,116,216,147,216,142,143, 78,230, 2, 21,243, 3, 12, 74, 84,157,115,110,111,135, 85,148,113, -116,114, 76,111, 48,198,178,109,234,198,100,177, 94, 49, 24,140, 8,194,144, 60,203, 24,141, 70, 20, 69,214, 69,215, 38,113,198, -100,180, 35,118,216, 44,230,234,229,243, 60,241,248, 35,220,191,115,147,171,151,207, 51,236, 7, 44, 22, 11,108,219,228,249,231, -159,231,165, 87, 94,163,215, 27,144,102,114,238, 62,250,232, 91,200,162,136,235,215,175, 83, 99,146,228, 21,181,237,112, 50, 95, - 83, 52,194,149, 56,153, 45, 80,182,141,107,186, 58,230,184, 16,238,188,235, 8,155, 63,240,216,219,217,234, 44,153,143, 63,250, - 24, 22,208, 65,248,163, 40,194,182,109, 33, 7,249, 62,179,217,172, 59, 12,218,209,161,227, 56,157,141, 99, 48, 24,116, 94,240, -170,170, 72,147,164, 43, 4, 22,139, 5, 67,109, 37, 43,203,146,223,253,221,223,229,153,103,158,225,107, 95,251, 26,253,126,159, -175,126,245,171,120, 90,193, 94, 85, 82, 81, 13,135, 98,141,107,171,241, 54, 83,189, 5,195,132,189, 94,167,144,108,127,136,227, -147, 25,219, 91, 83,130,160, 39,126,118,125, 56, 60,243,204, 51,156,156,156, 48,153,142, 56, 60, 60,228,226,185,253,206, 14,145, - 36, 9, 59, 91, 19,230,203, 53,105, 26, 83, 21, 25,174,227, 16, 45, 87, 44, 78,102,184,150, 73,158, 37,184,142,131,239,121, 36, -113,140,107, 59,124,247, 95,249,203, 52, 27, 35,231,109, 93,160, 28,222,185, 67, 16, 4, 58,106,113,201,236,248,152,160, 39, 66, -163,205, 60,223,214,214,182,183,183,163, 63,108, 91,236,118,134,140,169,171,186,224,137, 39, 30, 39,142, 99, 9,253,176,109,194, - 48,192,180, 12,138, 44,215, 8, 66,151,192,247, 48,145,157,154, 93, 85, 82,137,235, 93,122, 82, 85,100,105,130,163, 78, 57,202, -117,115,106,203, 10,253, 83,203,146,164, 35,217,228, 69, 65, 89,229, 34,106, 74, 51,237, 52,144,135,200,118, 68,140,200, 6,202, -182, 83,231,154, 14,166,215,156, 81,141,183, 99,252,110, 95,109,153, 29,253,110,211,134,180, 25,199,234, 56,214, 41, 60, 71, 43, -185, 27,101,144, 87, 37,235,117, 68, 28,199, 34, 68,209,118,151, 52, 77, 73,116,184,208,122,189,102, 48, 24, 96,187, 46,105,158, - 19,173,230,221,202,196,247,253,142,131,111, 89,206,153,157,111,251, 90, 54,237, 99,237,104,189, 21,235, 73, 17, 33, 69, 64,173, - 35, 97, 55, 53, 7, 18, 4, 98,146, 21,185, 48, 25,154, 10, 67, 91,153,164, 83, 56,237, 40,125,223, 39,205,196,226,212,116, 97, - 51, 66, 15,244, 3,147, 32,236, 73, 55, 91, 55, 96, 40,108, 71, 64, 20,134, 50,197,154,104, 9,235, 90,105,209,144,237, 24,244, -250, 3, 1, 59, 89, 30,121,101, 48, 91,202,119,199,243, 2,234,162, 32,206, 42,150,145, 92,224, 21, 22,182,103,226,248, 62,110, - 48,144, 11,164, 44,181, 80,203,234, 10,163, 14,126, 83,215, 66, 61, 67, 8,136,117, 13,149,134, 5, 24,166,137, 97,138,227, 67, - 58, 74,163,123,207, 54, 63,215, 70, 91,232, 78,199,205,213,183, 96,143, 55, 71,135,155,249,233,109,209,101, 24,205, 6,119,252, - 52,224,163,235,218,170,114, 99, 85,114, 74, 61,108,139, 46,101, 90,154,201,111, 98,160,176, 76,139,187,247, 14,120,199,147,111, -195,245, 66,150,139,136, 74, 57,212,212,152,174,143, 31,244, 48, 44,155,229,225, 49,217,201, 76,166, 86,165, 36,226, 57, 94, 64, - 93,150,172,227,148,166,170,176,204,146,245, 42,102,103,103, 7, 47, 12, 88, 46,151, 4,161,207,195, 15, 95,229, 27, 47,190, 32, -194, 40, 79,104, 97,102,137, 6, 78,105, 33,166, 78,102, 44, 75, 9,196, 50, 77,251, 12,110,187,253,231, 22, 62,213, 84, 69,119, -118,197,113,204,205,213,146, 32,232, 81,100, 85,103, 3, 54,173, 41,135,135,135, 20,229, 0,207,177,153,205,142,121,226,137, 39, - 48,237,235,172,214, 9,113, 94,144, 21, 41,139,197,130,176, 31,116, 96,170,150, 5,145,231, 57,158,239,116,197, 85,211, 52,204, - 78, 18,190,254,245,175,147, 39, 41,147,169,136, 7,123, 97,175,131,200,148,165,112, 33,218,117, 72,123,166,155, 27,106,108,211, - 52, 89, 69, 17,190, 43,251,245,209,104, 68,211, 52,108,109,109,241,229, 47,127,153,197,201,113, 55, 41, 76,146,172, 3,228, 56, -142,195,107,175,190,122, 6,152,211,234,122, 76,211,208,254,109, 69,221,212, 80,213, 26,131, 91,117,205,160,136,166, 75, 44,203, -193,243, 61, 38,147, 9,211,237, 93, 17,112, 54, 13,161,239,210,239,185, 68,171, 5, 55,111,223, 39, 47, 11, 28,207, 99, 54,159, - 19,132, 67, 93, 36,187,120,174,203,160,223,231,238,221,187, 92,185,114, 73,248, 45, 94, 8,141,197,116,107,135,157,237, 61,238, - 31,220,230,245, 55,110,226,218, 22,142,101, 48,155, 47,201,178,180,179, 63, 94,186,242, 16,105, 94, 50,159, 47,169,106, 41,116, -142, 14, 15,121,226,209, 71,249,234, 87,191, 74,216, 31, 81, 20, 57,202, 18,193,219,122,189, 36, 28, 78,168,235,154,190, 78, 10, - 12, 66, 79,163,154,107, 93,224, 84,248,158,172,208, 44,125, 46,157,204,103, 88,155,241,154,173,130,238, 43, 95,249, 10,239,125, -239,123,249,220,231, 62,199, 15,254,224, 15,146, 36, 73,167, 80,127,240,224, 1,223,251,189,223,203,151,190,244, 37,126,224, 7, -126,160,179,247, 24,134,209, 93,184,173,167,112,185, 88,156,185,164,143,142,142, 40,203,146, 31,253,209, 31,213, 34,179,136, 60, -207, 5, 39,233,121, 29,206,181,237,196,218, 47,169,235,186, 76, 38, 19,234,170,226,135,127,248,135,249,195, 63,252, 67,222,247, -190,247,241, 71,127,244, 71,140, 52,220, 98,181, 90,105,148,164,205,103, 62,243, 25,222,255,254,247,243,233, 79,127, 26,219,182, -249,206,239,252, 78, 94,248,250,115, 12, 6,146, 63, 60, 26,141,164, 72, 8,250, 12, 7, 3,138, 34,131,186,225,107, 95,251, 10, - 63,250,129,191,201, 31,252,193,239,243,158,247,188,167, 19,175,236,237,109,243,165,103,191,192,143,255,232,127,195,191,255,247, -255, 39, 65,224,241,200, 35,215,248,234, 87,191,138,227, 72,140,102,171,210, 12,195,144,126,191,143, 31,134,204,231,115,254,228, - 79,254,132,247,189,239,125,124,238,115,159,227,253,239,127, 63, 47,189,244, 18,119,239,222,229,210,165, 75, 40,106,198,195, 1, -158,231,241,224,193, 17, 55,174,191,193, 59,222,249, 52,207, 62,251, 44,223,241,174,239, 66,249, 14,253, 65,136,165, 12, 10,219, -166,172,114, 6,189, 30, 65,224, 65, 85,147, 87, 37, 69, 42,185,221, 24, 13,134,230,131, 7, 65, 64,232,249, 18, 65,171,191, 88, - 74,163,122, 55, 83,244, 2,207,161, 70,233, 48, 28,173, 32,173,234,110, 60,239, 56, 14,243,197,137, 56, 18,244, 65,221,142,237, - 55, 61,212,237,179, 33, 19, 20,217,233,119, 66,159,110, 92,118,122, 89,182,191, 71,150,101, 20,105,138, 95,185,221, 65,221,230, - 72,183,158,213,178,172,206,236, 90,187,105,131,235,117, 32, 31,215,117, 49,181,235,161,155, 16,104,161, 9, 24,250, 82,117,207, -112,204,109,219,214,151,126,211,137,179, 54, 51,225,219, 75,189, 77, 16,227, 63,147, 76, 39,157,168, 37,226,172,186,162,169,196, -182,181,138,147,238, 98,108,139, 98,215,115,201,171,152,170, 16,241, 83,221, 64, 85, 87, 26,141,107,158, 65,234,182,144,162, 86, -113,110,188, 73, 12,214, 49, 31, 92, 71,248, 5,166, 34,202, 50,226,188, 68, 57, 30, 94,207,161,174, 26,209, 53, 56, 30, 77,147, - 81, 52, 6, 69, 99,160, 16, 75,162,132, 27,193, 42, 90,157, 41,106, 10,173,177,104, 59,245,150,254,102,234,139, 95, 68,164, 43, -233,254,221, 0,215,245,191,133, 90, 86, 85, 18, 97,218,178,242, 55,247,228,237,251,182, 73, 69,108,159,139, 77, 7, 72,171,144, -143,227,245, 25,223,114,251,123,116,145,196, 8,193,176,157,184,108, 62, 99,166,105,118,160, 32, 44, 83,131,132,224,248,104,206, -241,209,140,225,112, 76, 94, 42,150,177, 92,138,195,233, 14, 89, 94, 74,194,150,235,201, 36,203,116, 4,142, 19,167,120,181,238, -166,117, 6,185, 97,100, 12,123,226,239,182, 61,151, 59,119,238,112,237,145,183, 48, 28, 12,120,228,225,107, 92,191,121, 3,106, -105, 74, 28,207,208,231, 93,137,105, 89, 24,134, 64,131,202, 26, 93,236,216,122,213,147,159,129,233,100,137,172, 47,171, 34,235, -166, 31,151, 47, 95,102, 57, 59, 17,106,165, 35, 90,140,249,234, 4,215,245, 88,175,231, 40, 19,122,123,251, 66,184, 67, 38, 35, - 89,150, 17,197,137,232, 54,148, 73,150,200, 74,201, 82,182, 46, 60,229,215,216,142, 71,158,131, 99,217, 58,243,124, 34, 19,165, -173,137, 88,200,178,140,221,189, 41,203,249, 66, 11,148,253, 83, 53,186,101,225,104, 65, 98,155, 57,229,135, 79,184,195, 0, 0, - 23,234, 73, 68, 65, 84,121,167, 68, 53,128,123, 7,247,217,221,222,225,177,199, 30, 99,111,119,155,197,201, 33, 43, 53,235,188, -242,231,173,211,226, 70, 38, 78,156,129, 0,181,207, 13, 8, 0,199,245, 92, 60,203,196, 49, 45, 76, 75,220, 10,190,239,211,239, -247, 59, 29,150,176, 25, 32, 47, 10,238,221,187,207,122, 45,223,183, 97,255,188, 52, 99, 85,205, 91,222,210,231,202, 67, 87,113, -108,159, 47,125,245, 43,172,163,132,120,181,102, 56,180,187, 41,210,114,185,100, 60, 30,119,100,211,245, 58,230,249,231,159,167, -170, 26, 92,215,164,215, 27, 48, 28, 79,240, 92,139,176,231,179,187, 51,161,170, 75,234, 82,154,140,157,157, 29, 12, 67,158,201, -213,114, 65,230, 8,219,125,107,107,139,149, 70,248,110, 6,154,153,134,194, 54,173,238,153,143, 99,113,171, 88,150,169, 83, 22, - 79,145,225,104,184,219,106, 25, 97,181, 35,173,245,122, 77, 20, 69,244,122, 61,126,238,231,126,142, 79,125,234, 83,252,196, 79, -252, 4, 95,252,226, 23, 73,146,132,193, 64,170,251,143,124,228, 35,252,198,111,252, 6, 71, 71, 71,252,254,239,255,126, 87,161, - 21, 69,193,116,107, 75, 70, 75, 73,194,133, 11, 23,186,170,205,178, 44,126,225, 23,126,129, 63,248,131, 63, 32, 73, 18,126,235, -183,126,171, 59,156, 54, 89,210,109,133,222, 34, 15,231,243, 57,159,253,236,103,249,192, 7, 62,192,131, 7, 15,136,227,152,167, -158,122,138, 15,125,232, 67,184,174,203, 79,254,228, 79,210, 52, 2,214,240,130,128, 82, 31,162, 31,249,200, 71,248,149,127,241, -207,249,201, 15,253,247, 84, 69,201,103, 63,247, 25,158,127,238, 47, 58, 52, 43,192,229,203,151, 73,211,148,245, 98,129,239,185, -156, 28, 30,243,211,255,227,223,231,211,159,250,119,124,248, 67,207,240,255,253,241,159, 98, 91,138,166, 42,120,248,234,195,252, -194, 63,254, 40,255,242, 95,254, 47,252,183, 63,246,227, 64,205, 23,190,240, 5,110,190,113, 93, 95,150, 38,139,197,172,251, 18, -252,218,175,253, 26, 31,248,192, 7,168,170,138,127,246,177,127,194,199, 62,246, 49,254,187,191,253,183, 88,175,215,124,240,131, - 31,164, 23,120,172, 22,179,238, 75,122,114,114, 68,150, 37,252,189,191,247, 83,124,252,227, 31,231,153,191,243,183,249,194, 23, -158,101,249,224,128,166, 42,101, 47,109,137,191,188,237,130, 74,125,248,231,105, 76, 85,228, 18, 65,137, 77,232,187, 88,253, 16, -211, 80,148,185, 88,116,114,101,208, 84, 66,174,146,176,166, 6,163,169,193,148, 68, 38,148,209, 9,145, 42, 61,254,171,170,170, -139, 40,180, 44, 11,195,178,207,116,169,157, 5,206, 48, 40,242,156, 68, 7, 61,152,161,169,249,244,218, 79,156,231,146,143,110, - 55,152,150,131, 99,123, 29,126, 52,111,133, 79,181,129,101, 74,103, 80, 42, 81,174,103,113, 78,154,102,146, 50,181,129,193,173, - 57, 77,234, 2, 8,122, 61,202,186, 38,213,151,199,116, 58,197,178, 44, 86,171, 53,171,213,138,173,237,173,110,236,222,118,129, -242,190, 91,128,162,168, 50, 50, 29, 50, 82,111,136, 8,171,170, 33,207, 75, 57,208, 55, 34, 65, 13,195,236, 68, 59, 34,202,147, - 64,145,208, 10,161,145,206,177,170, 27,138,198,192,178,108, 25,221,246,132,247, 96,216, 46,141, 25, 81, 86,167, 66, 60,154, 74, -168,104, 40, 74, 33,228, 80,214,154,240,135,146,212,193,178,198,168, 26, 77, 79,131,188,172, 73, 83, 25,113, 27,150, 75, 81,156, - 6, 49, 97,172,201, 11, 61, 57, 41, 96,181,150,238, 78,169,140, 36,173,206,196,123,230,185,240,215,219,207,115,243,146, 85,234, -212,193,144, 87,149, 20,117,160, 49,192, 18, 77,105, 53, 53,119,238,220, 17, 85,252,198,136, 92, 14, 96,153,240,100, 27,246,180, -174,123, 86, 74,175, 51,106,198,158,219, 17,245, 54, 63,215,118,194,215, 54, 27,158,231,117,108,140,205, 52, 64, 17,221,169, 83, -110,128, 82, 50, 57,168,229,249,110, 45,159, 77, 93,234,204,116,113, 62,220,184,121,151,199, 31,123,132,123, 15, 22, 84, 52,216, - 40,146,162,226,240,232,136,178,168, 53, 63, 35, 36, 78,115,114,125, 40, 43,211,213, 60,251, 16, 67, 89, 52, 26,123, 90,150, 37, - 94, 24,116, 78,156,178, 44,217,218,154,240,218, 27,215,233,133,125,237, 23,151,181, 92,221, 24, 34,238, 44,100, 98,147, 68,107, - 93,120,211,173, 85, 54, 5,129, 6,218,206, 71, 45, 33, 45,165, 8,226,168, 4,173, 29,250, 33,219,219,219,124,253,207,191,132, - 97,212,236, 76,251,196,177,124, 22, 59, 59,123,156, 28,207, 8, 92,135,166, 42,137,150, 11,166, 59,219, 76, 38, 19,142, 78, 14, -101,252,191,225,172, 57,117,209, 20,221,165,222,212, 98, 7, 59, 60,184, 39, 93,103,146,240,194, 11, 47, 48, 30,142,206, 92,178, -202,172,207, 88, 88,197, 53, 42,175,185, 21,238,218,182, 77,180, 90,114,116,114, 44,132,192, 34, 99,107,123,155,237,237, 41, 97, - 24,118, 49,175,237,179, 28,199, 49,215,175, 95,239, 26,199, 86,196,219, 78, 63, 77,211,164,110,228,153,178, 29,125, 25, 98, 96, -219, 38,129,235, 9,127,101, 60,102,157,196, 44,151,107,202,170, 97, 52, 26, 19,199, 49, 47,190,248, 34,127,242, 39,215, 73,226, - 53, 77, 89,128, 41, 97, 74,187, 59,231,136,210,132,201,116, 27,219,117,200,243, 84,160, 99,113,194,213,171, 87,241,125,159,233, -116, 10,149, 88,165,253,112,196,173,155,119,168,178, 10,211, 50,184,125,255,128,225, 32, 32, 47, 51,178,178, 96,208,243, 24, 14, -250,172, 15,143,105, 26,131,209,104, 64, 93,151,242,189,113, 2,230, 39, 51, 30,127,226, 81,190,244,149, 63,151, 60, 6,195,192, -182, 20,189, 32, 20,103, 75, 24,146,233,125,249,106,181,194,119, 93, 64, 38,161,150,107,115,124, 50,199, 48, 21,187,225, 16,211, - 20,167,137,241,246,167,159,108, 22,139, 69,167, 58,110, 19,116,218, 47,234,169,117, 8,142,143,143,217,217,217,233,184,228,251, -251,251,172, 87,113,247, 69, 60, 58, 62, 98,119,103, 23, 52, 42,178,173,214, 91, 31,167,160, 80,227,206,178,182,249, 69,108, 59, -163,123,247,238,117, 31,240,209,209, 17,163,209,168,155, 20,248,190,143,167, 49,140,113, 28, 51, 30,143, 89, 45,196,186,182, 88, - 69, 93,215, 86, 20, 5,142, 39, 31,124, 18,201,235, 59,183,183,195, 98, 49, 35, 12,116,192,132,109,118, 95,200, 40,138,240,189, -144, 40, 94,209, 15,123,248,161, 71,150,228,164,169,188, 86,223,119,181, 66,217, 36,244, 67,202,186,228,238,237,187,216,142, 67, - 93, 67,111,208,151, 61,151, 46,106, 90,178, 93,203,180,223,222,222, 38,138, 34,170,170, 98, 50,153, 72, 24,133, 45,170,214, 52, - 21,171, 80,154,202, 94, 85, 48,185, 9,127,237,175,125, 47, 63,248,131,127,157, 15,127,248,195,184,142,116, 66,138,154,192,243, - 81, 10,138, 44,147,136, 62,203, 38, 78,101, 28,216,142,156, 7,131, 94,231,149,110, 53, 12,169,238, 88,218, 29,113, 93, 22,148, -117, 69,148,136, 47,182, 45,178, 90, 44,164, 97, 72,229, 93, 86, 98, 55,164,170,181,136,198, 58, 51,126,246, 92,193,109,174, 86, - 43,193, 46,234,189,106, 85, 73, 80, 76,187,150, 40, 52, 48, 65, 25,167,194,185, 52,139, 9, 61,175,179, 3,137,213,166,209,157, -186,236,223, 13,204,142, 93, 80,150, 37,121, 89,117,161, 31, 89,150,201,207,174,171,250,166,105,232,247,135, 58,244, 67,124,194, - 23, 46, 94,212,118,150, 82, 51,200, 35, 29, 39, 42,239, 69, 89, 23,221, 33,210,250,188,219,160, 25,177,114,101,103,114,233, 79, -147,246,132, 93, 95, 22,149,206,122,118,241,108, 27,215,177,112,117,232, 14,181,228,214,247,122, 61, 57,208,146,140, 40, 78, 37, - 90, 83, 35,127,107, 13, 7, 10, 60,159,197,106, 41, 93, 84, 33, 17,152, 65, 47,196, 82, 38, 81, 18,163, 48,112,125, 15,163,129, -162, 42, 41,178,156, 36,203,197, 82,103,152,221,115,223,118, 68,237,132,203,182,237,174, 91,222,236,168,187, 36,191, 74,176,179, -155, 20, 55, 41,216, 78,147,209,218,177,106,158,231,152,202,238,254, 89,206,140, 81, 55,170,109,223, 67,185,156, 74,157, 36,118, - 54, 29,177, 61,220, 91,151,130,229, 90, 28, 30, 30,118,136,229,205, 46,117,181, 90,225, 56, 86,167, 45,104,119,233,155,160,160, -147,249, 76, 64, 28,166,194,243, 36,115, 91, 86, 64, 22,166,178, 49,117,162,162, 66,198,173, 14, 13,174, 5,131,208,229,187,255, -202,127,193,127,248,252,127,100, 56, 28,234,226,250,164,155,130,164,105, 42,190,123, 75,126, 63,199,178,233, 13,250,132, 65,191, -195, 23, 55,181,100,156,143, 7, 67,252, 94, 40, 99,101, 3,129,219, 52, 13, 47,188,248, 34,175,189,113, 3,219,145, 53, 78,154, -215,164, 89, 46,190,241, 66,206,213, 92,175, 15,218,137, 71,154,103,103,198,214,165, 78,195, 76,163, 53,179,249, 49,161,231, 49, - 30,143, 89,206, 78,184,124,249, 42,111,123,226,109, 92,184,112,158,175,126,249,207, 72,147, 53,174,163,176, 84,195, 91,159,120, - 66,156, 67, 39,115, 26, 67,241,205,151, 95,231,149,215, 95,103, 48, 26, 81, 98,240,210, 43,223,164, 49,192, 82,118, 71,186,147, -192, 45,177, 94,245,195, 62,150,101, 50, 25,143,137,227, 53,150,130,203,151, 47,176,158, 47, 56, 57, 57, 98,208, 15,241, 60, 17, -255, 73, 90,154,167, 63, 63,100,199,141,234,158,167,233,116,218, 9,157,155, 74,166,170,158,227,114,233,242, 5,154, 34,229,225, -135, 46,179,191,191,223,157,153,235,245,186,155, 46,204,102,179,174,249,235,206, 0,253, 93,175,170, 74,236,149, 74, 59, 70,138, -130, 44,145,230, 66, 53,114, 62, 45,151, 75,173,209, 40, 89,172, 87,154,112, 40,228, 83, 83, 25, 28, 30, 30,144, 39, 49,105, 81, -146,101, 57,189,254,128,172, 44,217,217,222,163, 49,208, 86,193, 1,150,229,224,248, 30,163,209, 64, 68,162,174, 71,208, 27,114, -116,188,226,232,232, 24,215,117, 24, 13,251,140,135, 33,189,208,163,200, 99,150,243, 99,222,241,244, 83,216,166,120,234, 93,219, -225,224,224, 30,190,235,114,112,112,143,215, 95,125,141,135, 31,126,152,171, 15, 95,227, 63,254,191,127, 66, 89, 43,210,178, 33, -206, 75,210, 2,178,170, 70,153, 46,115, 29,225,123,116,116,196,120, 40,182,213,186,146,105, 99, 26,197,108,109,109,113,225,194, - 5,193,146, 15, 6, 88,131,176,135,103, 59,204,231,115,178, 88, 30,208, 54,242,180,165,104,141,250, 3,214,235, 53, 15, 93,190, -194,122, 45,204,231,157,233, 22,165,222,107,186,174,126, 16,178,126, 87,153,141,199,227,174,210,239,245,122, 93,182,112,187,187, -111, 47,133, 36, 73, 58,174,180,231,201,222,163, 61,124,219,127,223,118,192, 73,146,176, 92, 46,187, 60,221,249,124,142,239,122, -204,231, 75,108,215,101,127,127,159,227,217, 28,219,245,104, 26,136,227, 20,101,202,225, 49, 91, 46, 24, 15,135, 18,191,217,239, - 19, 69, 43, 6,131,129, 64, 66,108, 33, 67, 93,186,112,158,251,119,239, 97,154, 13, 91,147, 45, 44,123,170, 11, 9,249,249,146, - 36,194, 50, 76, 28,199,228,194,254,190,164, 76,149,130,186,189,116, 65,224, 51, 77, 37, 94, 87,203, 86,236,236,237,202, 88, 41, - 12,216,154,140, 37,175, 58,207, 80, 52,216,150, 34,207,165,144, 90, 44,231,236,237,237,177,179,179,195, 71,255,209, 63,230,226, -165, 11, 28,220, 59,224, 99, 31,251,167,216,150,137,109, 26, 27, 7,113, 73, 89,149,212, 85, 41,227, 38,215,166, 44, 5, 65,154, - 23,226,185,246, 61, 11,203,247,113, 92,139,170,200, 64,143, 39,139,162,160,214,162, 58, 73,158, 43,186, 29, 95, 23,185,106, 53, - 26, 6, 33, 7,177,237,200, 37, 87,164, 89, 39, 28, 19, 77,131,234,186,179,246, 48,111, 43,233, 60,203, 58,197,115,171,127, 48, - 49,168,202,138,180,206,207,248,213, 91,241, 85, 86, 22, 27,105,116, 6,113,148,106, 81,149,161,169, 88, 13, 73,150,119,211,150, - 44, 21, 63,112,109,212, 26, 6,115,250,108,181, 62,117,215,117, 57,214,145,163,237,101, 32,172,113,121, 47, 90,239, 53, 40,221, - 13, 6,152,182,221,189, 31, 0, 89, 81,225,251, 33,166,109,117, 23,153, 88,231,160,200,115,170,178, 38,203, 4, 83, 25, 6, 30, -195,225, 64, 50,195,115, 57, 96,162, 40,193,114, 78,180, 37,166,164, 40, 74, 26, 67,188,246,150,130,162,200, 41,171, 28,207,113, -137,146,152,192,243,201,138, 28,211, 80,164,101,169,255,123,129,194,160,104,100,197, 98,152, 10, 12, 37,221,162, 97, 96,155,182, - 22, 23,173,186,177,127,187,135,110,167,101, 98,235, 75,206, 4,167, 24,134, 65,165,193, 63,242,157,114,112, 28,227, 12,241,111, - 52,156,116,197,119, 27, 64,212, 38,150,181,159,197,166,229,175, 5, 36,181,135,111, 95,163, 87,219,162,106, 51, 78,181,170, 42, - 84,170,116, 40,148,219,105, 85,218,226, 83,138, 72,179,187,236, 91,184, 82,123,233,183,162, 79, 41,254, 78,119,174, 70, 45, 62, -108, 3,147,120,181,194,192,196,177, 77,234,162,132,186,192, 81, 13,243,147,154, 47,127,245, 57,214,235,152,249, 98,133, 99,235, -201,128, 46, 94,179, 52,101, 94,151, 12,250, 35,121,255,170,146,197,172,160,204, 11,134,195,161, 4,104, 88, 22,134, 49,232, 58, - 82,128, 94, 47,160, 40, 50,194,176,207,213,171, 87,121,249,181,215, 9, 29, 7,211,180,137,146,181, 78,159, 20,138, 97, 86, 86, - 36, 73,122, 70,136, 89,149, 13, 85, 41,151,128,169,108,156, 64, 59, 83, 18, 33,106, 54, 58,219, 94,254,204, 21, 89,150,114,247, -238, 93, 30,122,232, 33,214,171, 57,113,180, 32,137, 86,220,185,115,167,179,160,174,162, 24,215,181,233, 5, 66, 89,155,238,237, -224,251,210, 9,174, 86,145,254,115, 69,119,208,174, 67,155,166,198,178,220,174, 96,222,187,112, 78,242, 44,234,154, 75,151, 46, -145,196,107,238,222,189,199,112, 56,148,162, 73,199,163,214,117,173,167, 36, 90,119,227,184, 52,134,234, 10, 68,163,105, 48, 12, -197,104, 50,198,178, 44,210,180,226,100,182,224,229, 87, 94,227,181,215, 94, 67, 25,162,153,113, 76,139,229,114,137, 82,116,218, -130, 94,175, 71,197,233, 88, 94, 48,225, 50,237, 52,244,100,160, 46,228,249,105, 51,222, 93,215,237, 38,108,105, 38,197, 65,221, - 52,140,134,114, 57,215,117, 13,166,133,111, 9,241,206, 80, 22,235, 36,214, 73,113,170,115, 94, 93,188,120,145, 40,138, 88, 46, -215,154,154, 40,107,149,162,177, 56, 58,153,177, 88,173,217,217,217, 1,101,241,198,141, 91,216,150,226,202,229,139, 84, 13,172, -151, 43, 46,236,238, 50, 30, 73,195,102,155, 6, 77, 61,229,141,235,175, 81,148, 25,235,245,146,157,157,109, 30, 28,158, 80,196, - 9,142,237,146,229,154,102, 87, 53,120,142, 67,189,161,125,147,201,136, 34,205, 51,106, 67, 73, 65,162,207,107, 51, 74,176, 90, -207,105, 43, 74, 91, 44, 22,132, 97,216,229,152,175,215,235, 46, 28,165, 13,183,111,211,120,242, 60, 63, 13, 50,208, 65, 15,237, - 23,175, 61, 20, 55, 19,215,218,241, 91,171,236,109, 85,236, 45,201, 72,196, 69, 69, 39,252,104,247,182,237,110, 44,138,162, 78, - 1,219,238,234,107,253,231,108,238, 48, 91,232, 74,235, 73,150,244,171,152,133,142,204, 20,255,251,152,163, 7,247, 25, 13,250, -146,220,214, 11, 9, 3,143,183, 61,249, 4,119,238,220,193,118, 76, 70,163, 33,195,225, 80,167,142,193,149, 75,143,162,148,226, -224,224, 30,227,203,151, 89,173, 86, 88,142, 8,160, 14, 14, 14, 24,143,199, 58,141,168,228,242,229,135, 58, 80, 75,219,201, 92, -188,112, 65, 95, 98, 21, 77, 3,151, 46, 94,160,168, 74,252,192,235, 50,154,127,230, 35,255,115, 55, 6, 31,143,135,140, 6,189, - 46, 98, 84,198,221, 13, 69, 81,163,244,100, 35,209, 62,223,142,244,102,158,198,170,214,117,205, 98,177, 56,195, 52,207,180,149, - 69, 41,165,109, 90,226,245,109, 15,231,246,162,110, 59,180, 60,146, 67,167,189,212,219,209,185,101, 73,231, 26,111,132,145,180, -251, 95, 33,238,213,221,254,117,147, 39,158, 87,167,133,129,231,121,100,113,220,169,201, 55,189,224,173,210,190,219,173,229, 69, -167, 10,151,157,157, 28,236,131,241, 64,239,104, 79,223,163, 60,207,169,234,166,123,214,218,103,210, 52,205, 78, 80,179,185, 74, -216,244,237,111,198,201,182,160, 27,217,217, 91, 27,113,181,242, 58,215,113, 66, 85,201,175,181,149, 73, 20,203,123,191,180, 45, - 44, 67,117, 1, 30,178,167,173, 41,106, 97,247, 91,214,233,200, 48, 77,147,238,114, 44,138,130, 90,191,191, 85, 35,159, 73,156, - 38,221,119,169, 73,155,110, 61,101,154, 38,101, 81,139, 13, 77,229, 24,117,195,122, 53, 39, 79, 11, 92,207,150,157, 99, 93, 98, -212, 13,166,209,136, 0,199, 16,132,172, 50, 33, 12,250, 56,174,197,124,181, 60,141,178,212,211,136,182,227,111,191,239,109,226, -225,230, 8,188,253,223, 90,166,120, 55,125,209,171,180, 77, 80, 81, 93,215, 29,107,190,165, 70,218,154, 4, 88, 33,249,228,173, -163,228,238,221,187,186, 67,119, 58, 98,100, 75,130,236, 4, 97,154,150,216,142, 97,139, 60,165, 41, 69,247,208,148, 50, 29, 48, - 91,188,170,237,144, 38,114, 9, 68, 81, 66,149, 39,248,174,195,168,231,115,255,224,144,237,237,109,190,249,205, 23,152,142, 39, -140,134,125,238,220,188,165, 73,150,123, 4, 65, 64, 79,235,129,170,178, 38, 47, 11,130,192, 97,119,123,204,249,243, 23,233,247, -251,164,121,217, 53, 50,182,109,243,244,211, 79,178, 88, 44, 88, 69,146,228,118,249,194, 69,102,139, 37, 81, 26,225,249, 62,150, -237, 48, 95,172,136,179,188,123, 15, 90, 13,146,232, 10,242, 51,107, 72,223,243, 79,125,249,202,198, 84,114,193, 25,117,211,233, - 88, 48,106,166,227, 61,162,245,146,199, 30,123,130,227,195, 3,190,254, 23,127,206,214,214, 22,147,201,132,147,147, 19, 2,207, - 97, 48,236,113,114,251,142, 60, 3, 24, 84,205,233, 57,153, 35, 77, 92,156, 38,167,226, 57,163,102,185,156,179,179,179,197,241, -241, 33, 97, 24,240,232,195,215, 56, 58,122, 32, 49,181,163, 17,247,238,221, 59, 21,190, 42, 40, 26, 57,219, 84,155, 77, 81,201, -196,101,216, 23,119,199, 82, 79, 83,167,211, 41,119,110,221,198,117, 20,251,182,131, 82, 34,174,174,171,138,178,204,153,142,198, -157, 14, 38, 73,146, 14, 21,155, 22,185,158,100,200,243,209, 24,116,100, 76,168, 81, 13,152,150,129,173, 53, 68,237,121,225,186, - 22,150,105,224, 57, 46, 89,145, 51,234,247,136,162, 21,111,127,251,219,217,223,223,239,220, 39,203, 85, 68,154,166,204, 87, 43, -110,222,188, 41, 81,196,149, 20,144,163,209,136, 63,255,250, 55,120,236,177,199,120,241,197, 23, 25, 12, 39,100, 89,193,197,203, - 87,136,215, 43,188, 48,192, 48, 32, 43,100,146,100, 59, 30,199,179, 37,227,190,207,114,189,162,200, 51,158,120,236, 17,102, 39, - 71,168,186,228,191,122,239,123,185,113,227, 6,139,249, 9,231,246,118,152, 47,150,157,158, 36, 74, 42,220, 32,224,240,120,134, -227,184,172,215,194,108, 89, 47,151,157, 70,168, 13, 97,106,181, 11,134, 97, 48, 30, 12, 49,223,250,248,227, 31,173,170, 74, 7, - 68,248, 93, 7,221, 90, 83,214,107, 9, 41,105,197, 47, 45, 95,185, 21,210, 88,142, 37,160,255,186,196, 80,114,216, 91,150,169, -199,180, 6, 73, 18, 83, 86, 5,166,169,168,155,138,178, 44, 80,166,209,253,115, 89, 86,111,218, 89,202, 15,213, 90, 95,218, 63, -171, 21,128,181,151, 67, 43,164, 49,148, 18,255,174,178,176, 44, 27,203,150, 24,214,214, 10,212,235,133,250, 82,209,216,192, 44, -163,172, 74, 30, 28, 60,128,166,214,113,117, 22,231,247,247,168,203,146,217,201, 9,189, 48,196,119, 93,166,211, 17,166, 50, 48, - 16, 74, 85, 28,173,160,105, 8, 67,159,166,170,177, 29,139, 44, 47, 69,240, 84,228, 68,209, 26, 71, 35, 30, 61,215,197,117,108, - 38,147, 49,211,233,132,201,120,204,246,100,194,160,223,199,178, 12, 92,219, 33, 78, 19, 34, 61, 22,175,138, 28,219,146, 61,157, -101,154, 2, 69, 41, 37,235,218,113, 44,242, 44,101, 48,232,163, 26,180,159, 84, 43,137, 45, 19,203, 84,212,117, 69,158,103,221, - 62, 82, 53,208,232, 11,170, 69, 86, 54, 77,131, 50, 77, 12,165,186,100,180, 6, 3, 67, 9,251,189, 40,114, 10,221, 77,181,126, - 97, 67,239,141, 13, 93, 33,183,171,146,178,148,139,209,243, 60,182,183,167,120,158,139,101,153, 56,142,123,122, 17,234, 41, 77, - 43,128,179,109, 27,207,113,177, 76, 19,199,178,241, 92, 87,194, 63,234,154,241,120,140,227,184,132, 65,159, 40,138, 89, 69,107, -108, 71,242,156, 13,101,146,196, 25,158,231, 99, 89, 54,101, 89,177,140,214, 4, 97,136,105, 90, 52,205, 70,152,129,237, 96,233, -103, 70, 44, 45,161,196, 46, 46, 87,162, 96,118,156,174,187,144,113,126,137, 31, 4, 4, 97, 8,134,193,122, 29, 99, 89, 54, 75, -205, 51,207,242,140, 52,203,136,163,132, 44,205, 72,139, 66,166, 16,121,155,109, 94,235,189,158,141,229, 88, 66,160,179,228, 61, -206,138, 66, 14,254, 34,167,110, 26,104,164,216,181, 93,143,176,215,199, 82, 38,235,213, 74,246,215,202, 2, 12, 28,219,165, 40, - 4,243,106, 91, 14, 73,156,202,123,167,163, 52, 7,253,161,116,119, 40, 70,163, 17,190,126,159, 29,219,102,208,239, 51, 26, 14, - 41,242,156,209,104,168, 89,251, 6,253, 94, 72, 89, 20,120,174,131,231,185,148, 69,142,169, 20,121,150,107, 45, 65, 35,147, 58, -173,174, 22,245,173,164,214,197,113,210, 41,147,219,203, 84,104,141, 83, 61, 18,245, 80, 58, 17,207,178,236,238,179,239,247,251, -140, 70, 35,246,247,207,211,235,245,197,115,111,219,221, 42,165, 85, 94,215,212,221, 74,173,141, 62,238,245,122,204,102, 51, 81, - 99,235, 41,217,166, 88,178, 69, 61,183,197, 99,154, 38, 52,117,205,100, 60,194,216, 64, 27, 27,202,196, 15, 66,234,186, 33, 8, -251, 40,211, 36,207,210, 46,117,173,170, 10, 76,106, 6,131,128,107, 15, 93,197,115, 93,174, 61,124,149,239,248,182,119, 50, 30, -246,120,226,209, 71, 56,191,191,199,227,143, 62,194,206,206, 54, 15, 95,189,130,231,184, 96,128, 99,219,114, 46,148, 37,179,249, - 66, 43,183, 19, 94,126,249, 37, 22,139, 5,113,180, 38,138, 19,210, 52,227,232,248, 4,215,243,136,181,178,187,172, 16,198,119, - 45,116, 73,233,140,101,215, 94,234,130,186,213, 14,152, 74, 82, 38,209,212,195,104,189, 34, 8, 3, 6,253, 62,121, 94,224,249, - 46,211,201,132,197,108,198,122,189,226,228,228, 4,211, 80,152, 10, 78,142,142,216,158,110, 49, 24, 13, 89, 44,231,172,227, 24, -215,113, 72,243,130,176,215,231,228,248,132,186,105, 40,139,211,102,200, 80, 45,134, 87, 44,138, 79,190,237,109,220,185,115, 27, -131, 70, 8,159,119,239, 82, 20, 57, 65, 16, 74,242, 95,221, 80,150, 25, 24, 74, 79,106,164, 19, 87,166,197,116, 58, 37, 47, 10, -137,165,157, 47,132,107,175, 12,118,247,246, 56,184,127,192,114,181,100, 58,157,178,187,187, 11, 13,164,105,194,241,209, 17,190, -239,201,251, 76,195,214,116, 74, 47,244, 9,123, 1, 69, 33,197,186, 20,118, 10,199,177, 81,134, 60,251,134,209, 48, 26,141,232, -247,122, 76, 39, 99,134,253, 1,231,207,239,113,254,252, 57,174, 94,185,204,213,203, 87,120,232,225,135,184,122,245, 42,215, 30, -126, 8, 83, 25,184,142,203, 98,185,212,136, 92, 7,219,118, 52,219, 95,166,138,182,235, 80,228, 37, 69,153, 51, 28, 74,236,178, -161,164,120, 93,175, 34,214, 81,196,104, 60,229,232,240, 80, 79,154,125,142, 78, 78,152, 78,166, 44,151, 11,124,223, 99,123,186, - 37,152,240, 94,200,238,206, 54,243,217, 49,239,124,199,219,177, 76, 52,200,169, 97,190, 88,128,206, 76, 80,134, 73,156,164,146, -224,135,129,235,248,160, 20,182,237,176, 94,173,177, 93,155, 52, 75, 41,235, 18,199,118, 80,134,169,197,140, 82, 28,175,162, 53, - 86,146, 36,221,109,223,142,181,219, 74,189, 13, 81,105, 47,211,182, 3,223,236,170,138, 13,102,243,230, 88,109, 83,240,177, 25, - 46,209, 22, 13,155,182,168, 86,188,211,218,161,218,221,230, 38,166,180, 13,118,104,199,168,237,101,223,142, 28,187,145,110, 85, -119,104, 80,249,187,123,166, 19, 19,241,199,233,127,119, 28, 7, 83,129,231,185,250, 98,204, 69,177, 28,184, 29, 68,191, 44, 5, -240, 34,118,130,146, 60,175, 59, 14,111, 86, 52,148, 85,125,198,135, 43, 41, 90, 97,151,252,212,239,247, 37, 13, 13,168,234, 2, - 43,178,116,183, 8,179,227, 19, 28,207, 37,240,220,174, 90,119, 28,135,192,115,116,113,112, 90,205,139, 64, 70, 4, 26, 89, 38, - 25,236, 74, 87,163,155, 54,162, 77,117,241,217,248, 72,117,102,244, 93,212, 21,142,237,209, 24, 27,182,162, 13,122, 88,251,255, -175,235,154,102,131,186,118,154,103,221,208,239,247, 59,162, 95, 59, 22,219,252,143,211,242,200,181,127,190,237,118, 55, 85,232, -237,142,172, 21,195,108,118,141,106, 35,161,237, 44,191,254,212, 94,150,231,249,198, 78,223,255, 22,235, 83,251,108,182, 74,238, -246,239,121,158, 51, 24,141,186,247,189,125, 77,109,182,182,236,221, 77, 61, 33, 49, 59, 59,201,230,179,196, 70,154, 87, 89,152, -216,174,137,231,135,244,130,176, 19,113,210, 40, 12, 12, 12, 69,199, 2, 23,193,152,140,212,106,141, 99,109,187,225,118,116,222, -254,124,155, 83,133, 77,117,172, 82, 74, 38, 15,165, 80,181,138,118, 26,209, 52,178,182,177,244,247,165,170, 40,139,188,187, 24, -154, 90, 64, 57, 40,131, 94,175, 7,166, 58, 19, 4,212, 90,126,154,166,161, 23, 14,186,239,229,104, 52,234, 58,237,241, 88,246, -164,135,135,199,167,163,124,173,203,168,107,209, 83,136,239,217, 60, 19,196,209,238,204,219,207,222,176,140, 51,251,252, 78,249, -171,133,114,237,243,208,126,191, 90,175,254, 38,221,175, 44, 75, 81, 63,155, 38,202,180,104,148, 8, 46, 45,203,162,169,234,206, - 61,211,212, 37,182, 50,104,202, 76,222, 31, 27, 29,178,225, 17, 6, 30,139, 69, 70,153,165, 36, 73,196,201,225, 3,162,229,162, -251, 30,221,189,127, 32,236, 4,221, 33, 94, 71,177, 88,173, 9,122,125,242,178,102,111,111, 79, 79, 47,211,110,130, 25, 4,158, - 48, 12, 92,183, 11, 21,210, 90,195,141, 28,248, 54, 76, 72,117, 29,249,230,179,253,102,238,131,101, 89,255,127, 91,103,179,157, - 32, 12, 5,225,175, 38, 68,177, 88, 17,142,237,170,135,247,127, 36, 31,160, 90,139, 96,143, 32,127, 17,232,226, 66,220,116,145, -109, 54,201,220,147,204,220, 59,131,241,158, 82,133, 49, 6,165, 53,195,196,106,172,204,146,245,122, 69, 93, 44,169,172,224, 34, -246, 99,194, 48,164,168,107,154,214, 82, 55, 45,227, 56, 61,206,251,222,101, 67,252,183,170,170, 20, 10,123,120,144,101, 25, 77, -121, 39, 73, 62,217,237,118,220,239,133, 68,213, 90,137,199, 21,151,197, 5,208,187,243,158,177,245,180,183, 22, 6, 39, 8, 2, -180, 86,156,142,103, 54,155, 13,106, 28, 72,146,132,143,253, 59, 81,188,157,100, 96, 69,240,234, 79,178, 89, 79,154,166,228,191, - 55,183,151, 48,160,115,122, 27, 68, 81,132, 89, 72, 13, 25,122, 59,197, 88,139,220,243,130,114,211, 18,115, 28,247,219, 86, 62, -172,199,243, 55,135,195,129, 60,207,185,100,153,243,221, 0, 80,158,176,116,151, 52,117,201,123,101, 89, 74,223,208, 8,182,105, - 93,141,157,113,208, 62,236,196, 36,120,124,157,142, 20,215,140,234,118,197, 55,154,177,111, 73,211, 31,238, 69,201,163,107,165, -223,170,105,208,222,146,178,105,169,235, 30,213, 88, 70, 43,247, 92,123, 62,102,161,196, 11,222,243, 80,147,149,181,214, 98,100, -181,143, 67,162, 40,114, 35,230, 93,215,241, 7, 99,242,166,153,201,181,177, 94, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, -}; +137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, + 13, 73, 72, 68, 82, 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 0, 25,116, 69, 88,116, 83,111, +102,116,119, 97,114,101, 0, 65,100,111, 98,101, 32, 73,109, 97,103,101, 82,101, 97,100,121,113,201,101, 60, 0, 3, 29,109, 73, + 68, 65, 84,120,218,236,189, 9,184,101,215, 85, 30,184,214, 62,247, 85,149, 74,150, 69,201,182, 36,207,182,108, 3, 14, 6,227, +148, 12,105, 51,180, 2,229, 38, 76, 25, 32, 18, 31,233, 4, 58, 12, 82, 66,210, 29,147,175, 45, 41,157,116, 67,186, 25, 44,165, +137, 51, 0,253, 89, 33, 77,103,160, 33,150, 29,135,208, 31, 9,113, 57, 56,216, 38, 9,184,130, 13, 4, 27, 27,201, 50, 6,100, + 89,182,202,146,165, 26,222,123,119,175, 62,195, 26,254,181,239,173,170, 87, 85,239,149, 84,230,108,125, 87, 85,245,222,189,231, +158, 97,239,189,166,255,255, 23,139, 8,205, 99, 30,243,152,199, 60,230, 49,143,203,127,148,249, 22,204, 99, 30,243,152,199, 60, +230, 49, 27,245,121,204, 99, 30,243,152,199, 60,230, 49, 27,245,121,204, 99, 30,243,152,199, 60,230, 49, 27,245,121,204, 99, 30, +243,152,199, 60,230, 49, 27,245,121,204, 99, 30,243,152,199, 60,102,163, 62,143,121,204, 99, 30,243,152,199, 60,158,242, 99,113, +166, 95, 48,243, 94,124,159, 29,116,127,255,122, 65, 41, 84,106,165,223,237,255,126, 66,127,183,107,252,186,153,170, 55,143,121, +204, 99, 30,243,152,141,250,222,141,193,104,115, 41,124,195,223,248,230, 47,250,129,155,191,244,197, 95,181, 88,112,247,175,223, +251,209,119,127,255,207,188,239,127,223,220,174,199,118,219,176,207, 99, 30,243,152,199, 60,230,241,135,105,240,153, 34,218, 61, +136,212,135, 3,238,251, 43, 95,247,121,255,240, 71,191,245, 21,223, 45,199,159, 32,186,234,106,226,103, 93, 67,191,248,190,143, +222,255,221, 63,246,174,191,113,223,131,159,121, 91,255,158,109, 11,182,231, 72,125, 30,243,152,199, 60,230, 49,143,157,143, 75, + 89, 83, 31,140,250,254, 43,182,158,184,138, 30,124,128, 78, 62,248, 49, 58,241, 59, 31,160, 19, 31,250, 48,253,241, 47,120,222, + 13,191,244,195,127,234,159,124,253,171,159,255,183,250,247, 28, 82,131,206,243,227,153,199, 60,230, 49,143,121,204,227,169,105, +212, 71,195,254,198,119,252,222, 79,252,216,175,126,242,125, 7, 15, 29,160, 69,199, 84, 31,126,144, 78,124,240,191,210,179,175, +216, 56,240,175,255,215,111,248,223,254,230,183,124,241, 63, 98,166,151,205,134,125, 30,243,152,199, 60,230, 49,143,243, 52,178, +151, 56,253,126,160,127,125, 78,255,250,130,191,244,229,215,190,238, 71,190,238,121, 95,191,127,155,232,228,233, 45, 42,251,123, + 35,255,194,151,210,190,107,159, 69,111,123,247, 7,127,227,123,126,252, 93,119,124,252,248,201,127,215,191,183,210, 5,164,226, +231,244,251, 60,230, 49,143,121,204, 99, 54,234,123,103,212,209,176, 95,221,191,158,247,229, 47,189,234,219,255,249,183,222,240, + 93, 47,188, 98,113,224,196,137, 45,162,174,163,242,156, 23,209,129,231, 63,159,238,251,131, 79, 61,118,219,143,190,243,135,223, +241,190,223,255,241,254,189,159, 49, 91,189, 27, 70,125,143,174,109,248,206,195, 52,149, 15,134,113,127,255, 61,247,127, 54, 79, +158, 63,108,215, 59, 15,120,246,119,223,148,159,253,237,239,188,255,114,254,158,167,248, 58,155, 39,220, 60,158,178, 70,221,198, +144,246,127,122,255,186,238,250,167, 47,254,228,191,248,246,151,252,245, 47,191,254,202,235, 79,157, 92,142,129, 57, 95,247, 60, +186,226, 5, 47,166, 77,169,244, 63,255,228,123,254,233, 63,252,217,223, 24,106,237, 31,163,243, 64,199,159, 99, 33,220,160,175, +157,140,227,253,189, 56,182,195,239,124,123,255,199, 17,253,231,157,253,231,238,250, 44,223,108, 62, 43,174, 87,157,147, 35,106, + 60, 14,195,175,134,231, 62, 24,145,123,251,107, 59,190, 11,223,211, 30,159,118,123, 14, 94,132,193, 28,175,183, 55,154,199,119, +248,217,252,236,111,127,231,158, 60,251, 75,245, 61,151,208, 17, 58,251, 60, 91,115,255,103,163, 62,143,243, 25, 23, 74,105, 43, + 52,165,197,175,122,198,211, 54,190,240, 25, 87, 46,158, 81, 37,188, 0,214,255,245, 27, 17,139,253,132,237,231,254,219,225,187, + 15,110, 45,229,228,247,254,252, 39,254,237,223,251,211,207,255,211,175,185,246,202,207,217,220,234, 63,113,252, 83,116,234,224, +211,104,227, 25,215,209, 63,184,237,166,111, 59,252,210,235, 62,239,117,111,250,165,215,127,250,241,205,119,211,238,208,222,110, +238, 95,111, 56, 79, 79,249,222,254,117,180,191,164,123,230,105,243, 89,147,101,184, 89, 95,103,114,240,204,152,188,169,127,255, + 61,234,184, 92,140,113, 31,190,243,237, 23,240,185,163,253,235,181,187,108, 96, 6,195,242,222,230,199,131,193,188,115,158, 29, +187,110,200,119, 62,207,238,190,233, 30,117, 94,142,207,119,111, 30,151,202,168,143,124,243, 43,247,119,135,127,224,107, 95,248, + 67,223,250,202,107,111,186,250,138,141,125,149,203,100,176, 75,153, 94,253,223,121,209,165,127, 15,127,114,215,197,191,121,250, + 93, 31,155,203,150,112,221, 94, 44,168,192,113,182,151, 91, 84, 79, 50,125,251,107, 95,241,165,175,122,233,179,222,250,157,111, + 60,250,125,239,253,208,195, 63,217,127,255,105,186,244,124,246,113, 97,246,155,251,240,231, 45,187, 17,185,205,227, 73, 29,239, + 61,207,247,223, 58,108,190,253,243,191,101, 47,162,230, 39, 97,220,124,134,107,156,141,250, 83, 97,158,221,125,211, 45,189, 97, + 63, 54,223,190,121, 92,170, 72,253, 89,119,127,227,139,223,248, 61,175,121,238, 87,108,158,168, 36,149,169, 43, 60, 5,240,194, +211,171,255, 59, 87,158, 76,239,240, 26,126, 63,196,246,181,255, 71,167,233,253, 50,253,174,235,255,177, 40,220,121,154,137,237, +115, 66,181,255,251,233, 19,155,244, 69, 47,188,246, 89,111,255,161,111,250,209,239,249,241, 95,124,217, 79,255,251, 15,253,112, +255,219,135,105,247,196,106,142,158,229,119, 71,214,252,251,237,253,185,190,118, 54,236,159, 53,227,152,102, 98,142,245,207,244, +168, 70,242,135,244, 89,223, 10,115, 96,136,180,222,220,255,238,198, 93,122,246, 67, 84,182,147, 26,241, 94,204,179, 91,215,252, +236, 80,111, 76,110,238,141,201,189,243,148,216,227,121,118,251, 59,143, 66,198,100,253, 60,187,251,166, 27,231,136,125, 30,151, + 36, 82,223,191, 81,110,248,134,151, 31,122,181, 60,177, 69, 91,167,250,160,185,214,201, 72,123,102,221,226,121, 14,187,219, 21, + 42,207,184, 86,141,123, 29,131,116,170,154,197, 31, 63,167, 22,190,212,201,240, 15,209,252, 80, 98,239,166, 67,108,158,222,162, +171,247,237, 43,255,239,237, 95,247,189,175,254,188,235,191,240,111,252,196,123,110, 63,189,181,124,223,110, 24,246,254,220,207, +154,218,212,232,252, 13, 20,233,179,195,186, 8,239,154,167,208,101, 61, 6,163,122,207,186,200, 91,141,246,176, 1,223,219, 63, +255, 55,129, 17,188, 97, 23,159,253,189,230, 68, 92,202,161, 41,225,195,141, 83,123, 4, 34,248,217,168,239,197, 60, 91, 19,121, +171,209,158,230,217,221, 55,237,213, 60,155,199, 31,162,113, 33, 60,245,110,115,171,126,234,103,126,253,225,255,204,229, 52, 93, +185,111, 73, 87, 94, 65,116,240,128,232,171,198,223,247, 87, 58, 80, 54,123,227,188,213,123, 2, 7, 39, 35, 95,235,248,202,224, +143,254, 61,245, 84,255, 58,217,239, 56,253,159, 67,118,125,248,183,108,234,251,165,127,127,165,173,101,165,237,211, 75,250,222, +111,126,245,145,183,223,253,205,255,234, 69,215, 61,253,155,212,236,239, 41,223,190,223,120,135, 69,247,218, 38, 98,186,121,158, + 62,151,245, 24, 50, 45,183,237, 36,149, 62,188,175,137,168,239,184,204,175,253,230, 38,122, 68,156,200,205, 26, 61,206, 99,183, +230,217,237,239,188,109, 39,169,244,225,125,159,101,243,108, 30,151, 73,164, 62,132,197,159,186,227,103, 31,248,190,159,255,205, + 79,126,211,203,175,191,226,133, 67, 34,189, 14, 86,119,154,154,189, 13,158, 76,246,137,205, 90, 94,245,130,171,254,200,119,127, +229, 75,111, 56,176, 56, 80,234, 96,160,135,154,250, 16, 91, 15,134,125,243,113,226,142,169, 60,255,149, 84,158,245, 82,226,167, + 95, 79,124,224,233,212, 91,110,170, 79, 60, 76,242,153, 7,169, 62,252,161,254,223,189,177,231, 43,250,239, 93,210,178, 63,112, +125,124,147,190,226, 21, 47,120,193, 47,220,253,205,255,248, 79,220,249, 47,187,143, 60,248,232, 91, 41,192,123,123,101,216,239, +239,175,234, 94,240,164, 15,239,198,113,215, 32,162,143,237, 18,210, 26, 17,254, 23, 68, 55,219,141, 99, 92,138,235,109,206,115, + 71,199,187,128, 8,249, 30, 10,112,229,161, 1,104,119, 25,215,214, 49,245, 62, 68,144, 67,148,120, 63,220,195, 61,139, 16, 27, +196,253,177,139, 77, 47,247,199,203,115,244, 2, 40,111, 23,195, 2,216,129,161,190,184,121, 54,157,219, 92, 91,159,199,158, 26, +245, 33, 41,254, 68,255,250,192,127,184,239,241, 55,246,175, 43, 52, 90,110,199, 51,190,246,139,174,253,206,111,186,241,197,207, + 62, 88,246,149,237, 49,165,222, 91,243, 83,167, 72, 78,247, 31, 95, 62, 65,221,231,126, 5, 45,110,252,115,212,189,248,143,157, + 49,133, 32,143, 60, 64,219,247,189,131,150, 31,125, 79,239, 0,236, 27,235,236, 67,201,126,243,196, 38,125,238,115,158,113,245, +191,250,219,127,234,199,190,250,245,111,126,228,147,143,158,250,247,180,247, 13, 97,118,133, 35,171,134,237, 86,141,152, 14,175, +249,253,253, 20,169,225,227,103, 56,198, 27,224,179, 67, 26,247, 30, 56,238,173,212, 32,109,245,152,119,237, 4,189,223,191,247, + 86,141, 18,110, 56,223,243,218,139,235, 61,203,181,222,161,199,197, 13,121,215,145,226, 16,209,226,184, 44,163,217,161,102,222, +156,251,189,240,231, 29, 23,107,212,251,227,231,103,117,251, 59,239, 81,195,123,135, 62,255, 67,205,251,143,142,243,242, 60,140, +159,102, 18,214,207,243,201, 57, 25,142,119,207, 89, 62,123, 68, 95,135,207,228,156,235,113, 44,109,126, 41,235,218,159, 21,243, +108, 30, 79,222,184,144,180,245, 16, 13, 15, 57,242, 97,162, 63, 68, 19,127,252,163,253,235,119,245,245, 81,102,186,242,238,155, + 63,247,251,127,254,182, 47,254, 11, 47, 60,184,239,202,237,229,146,228,212, 19, 84, 31,249, 4,213,227, 31,239, 35,244,199,104, +223,215,220, 78,251,111,254, 7,107, 13,122,242,116,175,121, 17,109,188,250, 59,105,227, 75,255,242,104,208,137,151,147,221, 30, + 13,251, 22,125,209,203,158,253,204, 55,254,229,155,238,238,127,248, 2,218,123, 89, 89, 92, 96, 23,180,208,123, 99, 52,108, 38, +247,169, 55,126,166,104,255, 6,253,253,123,149,122,181,110, 28,134,205,233,144,190,239,237,148,107,255,237, 49,223,164,245,225, + 51, 26,223,254,245,230,225,125,103, 57,198,112,252,183,171, 81,189, 84,215,187,238, 90,239, 83, 67, 49,111,122,231, 55, 48,245, +142,188,104, 52,130, 55,104,132,120, 33, 35, 63,171,233, 56,239, 93,227,124,217,152,128,167,119,223,180,163, 84,179, 30,239,220, +243,124,170, 79,159, 41, 75,241,102,253,243,108,215,104,115,242,190,139,184, 23,243,152,199,101, 17,169,147, 70,195, 91,250, 34, + 48,166,221, 11,159,121,224, 27,223,244,173,159,127,215,215,124,238, 51, 95,118,250,100,165,229,178,127,203,233,147, 68,219, 91, +131,212, 13,241, 6,209,254, 63,243,195,212,189,226,235,253, 96,143,157, 60, 77,191,240,190, 7,232, 23,222,255, 0, 61,242,248, + 73,218,232,152, 94,254,156,107,232, 79,222,248, 82,250,163, 47,121,246,116,224,231,191,154,120,223, 85,180,245,238, 31, 33,218, +183,152, 78,161,143,252,183, 31, 63, 77,127,254,171, 95,241,170,127,254,142, 15,126,231, 47,252,234, 3, 63, 72,123, 68,119, 83, + 35,118,115, 19, 17,158,239, 49,110,214, 13,165,245,204,143,130,147,128,209,236, 13, 20, 72,251, 99,231,112, 54,222, 12,155,220, +189,224,241, 31,110,206,251,214, 33, 50, 62,131, 80,204, 27,104, 21, 43,128,199,186, 25,162,155, 55, 63, 73,215,123, 72, 55,245, + 67,224, 92, 29,131,207,239,213, 56,114,142,136,234, 98,230,213,174,151, 95,206, 96, 16,111,104,141,186, 59,207,183,191,243,254, +254,247,199,224, 92, 6,163,119,219, 46, 56,193,248,172,214,205, 37,159,123,253,247, 31, 63, 83,132,125, 65,243,188,143,182,207, + 33, 86,115,191,190,142, 54,198,252, 8,124,199, 33,117, 58,110,188, 68,106,118,123, 50,207,230, 49, 27,245,243, 25,150,242,190, +250,107, 95,113,205,247,222,115,203,231,221,254,188,167, 93,113,197,201, 39,250,232,124,217,219,215,173,211,250, 77, 29,241,246, + 19,180,241,101,223,149, 12,250,127,250,240,131,244,250,159,122, 23,221,255,201,207,208,129,253, 27,180,177, 40, 84,250,163,189, +255, 99,143,208, 91,254,227, 7,233, 27,111,124, 9,253,175, 55,127, 5, 29,236,127, 87,174,251,124, 90,188,226, 22,218,254,181, +159, 36,186,234,186,241,107,199, 34,186, 48,253,237,111,123,205,119,253,187,247, 62,240,150, 62,152,255, 77,154, 74, 4,187,109, +208,219,232,245,158,243, 60,198, 13,122, 12,220, 80,110, 91, 83,219,189, 75,163,219, 55,235,134, 98,223,125,227, 89, 14,127, 7, +108,114,183,181, 70, 65,191,251,205,176,137,222, 49,136,169,224,251, 52,229,126,107,179,153,220,210,212,209,241,220,142, 60, 73, +215,123, 7, 28,239, 78, 5, 49,182,207,106,175, 35,220,221, 50,188,111, 94, 23,189,106, 57, 98,184,174,123,118, 89,122, 23,175, +225,248, 26,234,218,189, 48, 71,110,222, 5,163,126, 71,154, 75,217, 40,222,213, 27,202, 35,205, 61, 24, 34,236,163,103, 49,158, +121,158, 55,105,113,117, 90,242, 60,191,251,166,117,233,243,187, 52, 75,113,236, 44, 14,208,173,234,228,226,156,124,237, 37,216, +147,243, 60,235,207, 93, 94, 63, 27,170,121,236,124, 92, 44,106,220, 12,250,139, 95,247, 85,207,253,177,183,125,251,203,191,239, +217,251,247, 93,113,226,244, 22,201,246,137, 17,240, 54,214,209, 59, 30,237, 44, 63,243,249,180,248,146,111,243, 15,127,248,227, +199,233,219,126,236, 23,232, 55, 30,124,140,100,223, 1,218, 26,106,230, 27,251,105,223, 21, 7,232,202,167, 93, 73, 7,174,188, +146,222,250,159,127,135,126,232,173,239,241,207,116, 47,253,227,196, 7,251,232,125,121, 98,250,246,254, 10,182, 55,183,232, 85, + 47,185,246,250, 47,121,249,245, 95, 67, 78,130, 59, 47,131,123,199, 89, 94, 67,164,241, 72,179,216,110,187, 0,160,213,155,154, +232,242,198, 51, 29, 67,127,142,104,251,195,106,116,207, 54, 6,181,187,181,162, 56,106, 24,238,108, 34,158, 35,103,216, 48,205, + 96,190,118,157, 65,129,115,123, 50,175,247,126, 61,222,189,107,142,181,235, 81,238, 48, 15, 46,198,161, 59, 71,228,185,110, 88, + 13,250, 62,253,238,221, 26,183,158,227, 26,240,103,135,212,176, 93,236,152,230,210, 26, 67,173,117,244,215,158,101, 30,174,159, +231,183,191,243,150,117,117,110,253,142,179,206,243, 33,114,239, 95,119,158, 11,141,174, 25,131, 91, 48,130, 86,167, 97,207,134, +150, 32,246, 98,158,205, 99, 54,234, 59, 54,232,124,205,149,139, 35, 63,243, 63,124,222,219,222,248, 13, 47,250,239,135,100,252, +233,186, 53,209,209,134,218,247, 70,127,248, 5,143, 47,161, 77,234, 62,247, 43,137,159,246, 76, 63,192,157, 63,245, 30,250,240, +239, 61, 74,143,110, 51, 61,248,248, 54,125,236,209, 77,250,157, 79,158,236,163,246,147,116,252, 84, 31,233, 47, 22,116,245,213, + 79,163,127,245, 43, 31,166,163,239,255,136, 90,245, 5,117, 55,124, 37,201, 99, 15,143,220,247, 33,165, 63,104,220,236,187, 98, + 31,125,203, 77,159, 55, 44,224,167,211,249,215,214,223,112,150,215,145,102,145,189,246,124,165, 98, 65, 91,220, 47,253, 92,198, + 71,211,207,247,156, 37, 45,215,142,219,206,113,188,163, 77, 42,239, 6, 56,191, 86,194,242,174,179,157,223,154,115,187,212,215, +123,215,165, 18,254,209,107,121, 67, 19,165,239,198,102,107, 66, 36,119,194,235, 94, 90,197,106,188,225,108, 56,136,243, 48, 24, +135,155,103,124,239, 26, 67,118,188,249,249,110,208, 54,239, 58, 27,208, 76,141, 43,222,207, 91,207, 65,169,187,237, 28,198,248, +140,243,252,188, 55,184,213, 99,237, 25,141, 85,159,207, 27,154, 40,125, 54,234,243,184, 36, 70,221, 20,101,158,246, 21, 47,185, +234,175,191,231,175,124,193, 91,190,229,229,215,188,242,196,137,229, 64, 56,235, 13,250,214,116,212, 62, 58, 31,232,106,188, 24, +254, 44,227,159,229, 57,175,240,131,124,228,161, 79,211,191,121,223,239, 18, 29,188, 98,162,185, 13, 98, 51,253,159,203,254,195, +159, 57,189,164,143, 60,124,130,238,255,196, 9,218, 18,166,218,255,252, 29,191,241,209, 56,129,103,190,148,228,228, 99,253,223, +182,245,108,164,255,107,165,207,127,222, 53, 47,233,255,245,108,218, 59,192,220,205, 26, 69,158,111,138, 23, 13,212,241,243, 48, + 10, 71,119,184,161, 28,219, 97,154,246,216, 25,206,233, 72, 99, 96,119,114,126,247, 62, 73,215,123,255,165,210,223,215, 18, 2, +106,181, 31,167,139, 75, 73, 31, 87,227,253,146,254, 26,110,212,204,202, 93,240, 26,254,125,141,190,231,120, 50,116,147,227,181, + 91, 81,250,177,179, 68,170,247,238,102,116,186, 67,195,116,239,154,117,182,126,158,239,172,174,125,236, 60,156,225,243, 57,183, + 61, 41,237,232, 61,222,205,121, 54,143, 63,196,227,124,107,234,150,110,127,206,119,252,177,103,125,255,143,127,227, 11,191,123, +163,118, 3, 31,189, 55,200,253,143,165,142,246,117,144,135,149, 33,229, 94, 88, 85,229,164, 55,234,251,168, 28,122,129, 31,232, +129,135, 31,163,147, 67,187,213,167,239, 15, 63,193,224,109,131,129, 23,161, 79, 63,190, 69, 91,155,219,244,188,171, 23,244,153, + 83, 91,113, 18, 99, 61,189,119, 4, 78,159, 32,190,226,170,254, 99,131, 81,223,166, 23, 95,119,213,181,251,247,117,215,159,222, + 92,126,224, 60,175,235,108,122,215, 8,156, 57,164,222,244,205,231, 41, 19,123,228, 12, 27, 14,157, 43,186, 70,145,158,179,112, +163,119, 90, 10,184,255, 44,215,120, 94,199,106,207,237, 18, 94,239, 37, 1, 14,169,227,214,214,188,239,188, 24,110,186,126,118, + 39, 98, 55, 3,206, 96,120, 14,239,109,178, 73, 23,164,244,166,145,239,205, 59,113,200,148,179,126, 28,174,123,248,220,133,114, +214,119, 54,151,250,136,184,255, 78,218,129,241,188,216,121,126,182, 12,198, 13, 59,152,203,187,142,130,215,103,179, 58,207,102, +221,247,121, 92, 2,163, 62, 70,191, 87, 29,232, 94,243,119,190,254,121,119,223,118,248, 89, 95,182,185, 73,116,106, 99,146,124, +149,101,111,184,183, 42,237,219, 87,232,209,229,178, 94, 49, 88,230,161,161, 75, 7, 31,150,109, 63,216,181, 87, 31,164,110,223, + 6, 45, 7,164,219,168, 23, 47,106,212,245,207,225,103,125,132,255, 68,111,248, 63,122,234, 20,237,127, 37,156,170, 44,251, 87, +111,228,183, 79,245, 14,192,211,123, 71, 98,208,159,175,116,205,149, 27, 7,175, 62,184,239,208, 39, 54, 79,158, 87, 6, 98, 39, + 45, 67,181,182,105, 20, 42,163,213,220,184,195,175,192,205,224, 6,173,211, 95,200, 56,116,150, 8,240, 98,198, 5, 25, 97,125, +239,225, 75,124,189,123,190,217,169, 65,127,123,115, 29,183, 93,202, 14,125,131, 3,208,159,199,157, 20, 41,217,225, 62,222,188, + 14, 71,176,195, 12,211,161, 29,102, 89,134,113, 15,237, 2,103,253, 34,230,210,145, 51,124,231,174,148, 92,128,231,254,164, 82, + 34,245, 60, 86,231,217,156,118,159,199, 30, 27,117, 75,101,111,124,254,117, 7,254,220, 79,125,203,139,239,250,163,215, 30,188, +246,228, 16,157,239, 95, 76, 6,189, 55,230,139,193,160, 95,209,209,223,124,199,239,191,255,133,159,179,239,115,190,251,240,179, + 94,120,106,136,218, 45, 90,223,218,162,250,201,223,161,242,252, 87,143, 7,123,249,115,159, 65, 95,250,178,107,233,151, 63,240, +112,127, 22,139,201,136, 23, 53,232,166, 11, 87,167,207,158,122,228, 9,122,217,245,177,246,228,177, 63,232,163,244,199, 72, 78, +127, 14,177,118,140,145,106, 78,193,152,252,223,245,244,187, 70, 79, 4,155,236, 8,230,218,225, 70,127,168,137,138,111,120, 10, +207,137,227,187,240,222,203,233,122,119, 98,208,239,124,146, 90,238,162,186, 24, 93,196,125,108,185,233,231,138,100, 81,136,102, +224,172, 31,185, 0,101,180,221,154, 75,187,109, 72,205, 33,127, 82,245, 13,206, 96,208,239,156, 13,250, 60,246,218,168, 91,186, +253,218, 91,190,248,154,215,255,253,175,123,222,255,116,253,129,141,125, 39,122, 99,203, 7,167, 16, 92,122,227,126,160, 55,168, +167,246, 17,253,143, 63,247,209,159,187,231, 61,159,120,219, 63,190,229, 69,183,143,105,248,225,211,157, 54,120, 89, 20,146,135, +126,211, 15, 92,122, 99,255,183,254,204,141,244,117,191,245,255,245,225,126, 31,117,239,223,167,221,221,212,168,143, 17,124,255, +191,199, 79,208,171,254,200,115,233, 47,252,183, 95,224,159,173,159,248, 64,191,249,110, 17, 47, 55,167, 55,246,198,182,244, 95, +248,200,227,167, 78, 62,118, 98,243, 51,123, 24, 61,221,165,234,102,184, 89,158,239, 34, 52,110,236, 94, 27,220,167,202,184,220, +174,183,221,104,239,217, 73, 38,103,143,230,219,241,126,190,237, 36,130, 61,155,241,184,161,201,196, 28,238,127,118,190,153,147, + 97,158, 31,189,220, 55, 59, 48,164,200,202,184, 71,179, 4,247,175, 75,121, 43, 34,253, 13,151,100,158,157,157, 83, 63,143,121, + 92,180, 81, 31, 11,221,139,142, 63,247, 7,255,196,115,254,254,235,255,155,235,191,102,123,155,232, 68,111,156,121,127, 25, 35, + 99, 57,185,164, 43, 23, 76, 15,156,222, 62,245, 23,255,249, 71,126,226,157, 31,122,236,167, 6, 43,251,187,143,110, 61, 68, 44, +159, 47, 30,169,247, 63, 61,112,144,150, 15,188,155, 22,199, 31, 32, 62,244,162,241, 11,190,246, 85, 47,162,123,254,242, 31,167, +215,253,227,119,209,137, 79,159,238,223,179,127, 66,180, 15, 31,220,236, 13,253,137,147,244, 71, 63,255, 58,122,203,235,191,158, +174, 60,176, 49,157,213,214, 73, 90,254,214, 91,137,247,237,159, 16,246, 99,234,125, 57,214,225,239,251,248,167, 31, 62,181,185, +124,152,246, 86, 89, 14, 59, 90, 93, 8, 8,231, 73, 51, 18, 79,210,184,108,174, 87, 81,230,173, 65,127,178, 1, 75, 23,235,216, +180,160,179, 11,201,156, 12, 77, 94,238,252, 44,104, 3,122,107, 99,208, 95,251,100,212,174, 85,237,174, 53,232, 51, 48,110, 30, +187, 50,202, 57,140,250,181,111,248,186,231,254,216,237, 95,118,253,215,156,234, 13,250,214,193, 5,241, 21,221, 24, 64,211,137, +222,160, 31,232,232, 23,255,224,137,135,110,250,241, 15,126, 95,111,208,255,175,254,167, 15,244,175,223,255,237, 79,158,250,237, + 17, 36,183, 84,208,211, 96,168,135, 20,251,246,227,180,245,238, 55,166, 47,249,238,175,254, 2,250,143, 63,252,103,233,117,223, +240,133,244,226,107,246,211,129, 62, 2,127, 90, 89,210,107, 94,246, 76,250,209,239,249, 42,250,165, 31,188,153, 94,124,221,213, +254,254,237, 95,253, 9,146, 79, 63, 48,242,217, 69, 65,120,180,189, 28, 65,121,191,253,123,199, 7,136,252,195,180,135,141, 93, + 46,112,236, 38, 26,247,169,116,126, 71, 46,211,235, 61,147, 65,191,245, 41,102,208,119,203,144, 93,236, 56, 68, 23, 70,231,186, +208,185,180, 87,134, 22,175,225,174, 29, 26,244, 93, 45, 29, 53,237, 85,103,131, 62,143, 75, 26,169,211,243, 15,237,187,233, 47, +126,225, 53, 95,189,121,170,183,145, 79,219,232,163, 99, 38,217, 20,234,122, 11,191,255,202,142,254,217,251, 63,245,193,191,250, +150, 7,254,206, 99, 39,151,239,234,223,254, 41,154, 26,189, 28,248,165,251, 62,243, 43, 15,126,102,235, 59,158,121,112, 99,177, + 20, 9, 18,220, 21, 7,251, 48,254,151,104,251, 61,127,143, 22, 95,246, 58,255,158, 47,122,225, 51,233,141,223,241,149,244,195, +127, 97,155, 62,254,200, 19,180,111, 99, 65,207,185,230,202,149,243, 89,254,214,207,210,246,175,255,179, 49,234, 31,189,142,210, + 59, 24,203,218, 7,236,117,236,235,254,214,119,221, 55,168,212,124,102,143,141,250,133, 44,242,148, 66, 29,234,182,151,138,103, +189,195,113, 63,156,223,142, 16,190,103,209,164,191, 28,174,247,114, 50,232, 23,108,236,180,121, 11,206,215, 59,207,243, 24,119, +192,247, 15,247,231,124, 75, 77,135,119,120,158,135,119, 57, 59,177,147,243, 57,118, 1,247,127, 54,232,243,184,172,141,250,226, + 69,215,236,127,217,161,253, 29,157, 28,216,100, 67,212,221, 71,231,251,170, 80,221,207,244,250, 95,248,216,209,255,243,237, 15, + 14, 97,247,127,213, 69,248,132, 26,211,238, 15, 62,189,249, 43,111,253,192,241,247,253,213, 47,189,246,198,237, 83,203,222, 25, + 40,154,134,239, 35,246,131, 87,209,242,215,255, 41,201,201, 79,210,226, 53,175, 35, 62, 24, 98, 52, 7,122, 99,254, 34,136,202, +125, 12, 41,247,255,242,147,180,253,190,255,135,120,168,189,247,198,156,134,148,123, 31,173,211,214,246,168,113,243,174,223,126, +240,227,191,252, 91, 15, 13,169,241,211,123,101,212,155, 22,159,231,179, 49, 28,109, 22,243,158,181,182,188,192,113, 20,162,152, +161, 97,202,145, 29, 40,230, 29,185,140,175,247,178, 48,232,107, 84,245,206, 23,155,144,245, 2,206,179,102,219,212,227,135, 90, +252, 13,231,169,127,126,104,135, 32,187,118, 46,221,251,148,184,255,147,140,237, 13,187,116,172,217,160,207,227,146,140,179,165, +223,187,223,122,232,228,135,126,111,115,185,125,240, 96, 71, 7,183,150, 52, 96,227, 30,239,170,252,249, 55,223,255,211,189, 65, +255,254,254, 61,239,239, 95,159, 84,131,174,237,211,198, 38, 47, 15,253,253,255,240,208,189,143,246,159, 89,244, 47,218,170, 19, +106, 78, 69,105,232,202,171,168,222,247,111,104,243,173,223, 70,203,255,250, 86,146,199,126,127,253, 66,120,226,225,254,125, 71, +105,243,109,223, 65,219,191,246,143,122,171,127, 96, 84,148, 35, 69,225,113,217, 32, 30, 64,118,157,208, 15,252,204,175,189,173, +255,200,239,232,247,239,186, 81, 7,222,242,121,111, 62, 74, 67,194,205,240,142,115, 68,186,151,122,180, 74,102,119,236,224, 94, +220,113, 25, 95,239,153, 12,250, 49, 58,187,102,193, 57,157,190, 70, 98,248, 72,115,207,206,119,190,189,161,137, 94,119,108,236, +128,182,229, 70,228, 2,231, 5, 53,206,217,249,142, 59,118,112,158,248,158,163,123,216, 56,229,248, 78, 35,112, 61,175, 93, 1, +200,173, 49,232, 23, 53,207,230, 49,143, 11, 53,234,244,169,199,183,127,245, 91,126,250, 35,119,189,249, 67,159,254,208, 59, 62, +126,226,161, 31, 61,246,240,177, 47,255,135, 31,252,219,247, 30,123,228,239,208,212,250,114, 72,185,159,164,220, 64,101,248,251, +201,223,121,248,212,191,249,193,127,255,241,183,111,244,145,190, 60,190, 61,210,222,198, 28, 60,235,235,224,211,137,182, 31,165, +173,119,255, 80,111,220,255, 28,109,254,235,219,104,251,221,119,211,246,127,250, 7,180,253,203, 63, 66,155, 63,255,215,104,243, + 45,223, 74, 91, 71,239,236, 63,255, 64,239, 8, 92, 61,137,210, 24, 4,174, 22,146,211, 76, 27, 7, 10,253,147,163,191,253, 91, +255,238,191,252,254, 79,211,148,122,223,218,237,232, 92, 35,166, 65, 8,228,112,179, 65,156,207, 70,137, 94,249,212,249, 9, 54, +253,157, 24,138,189,154, 4,154, 26,199, 40,238,200,153,164, 73,129,242,117,232,114,189,222,179, 24,244,215, 94,100,153,192,218, +117,218, 11,231,203, 64,129,124,251, 78,148,225,160,141, 46,222,227,243,149,198,189,249, 98,163,223, 93,146,141, 61,114,166, 54, +168,107,208,232,180,199, 25, 29,188,150, 91,207,212, 82,245, 12,116,179,221, 52,232,175,253, 44, 0, 29,206,227, 41, 58,206,150, +126, 31,140,227, 35,255,241,254,207,252,223,253,107,152,224, 87,169, 17,255,120,255,122,180,127, 61,174,239,105,101,197,172,223, +250,199,127,228, 29, 15,190,241, 85,207, 63,248,226,111,125,229, 51, 94,122,242,177, 77,226,167,239, 35,218, 95, 38,165,185,225, + 99, 27,125,164,221,191, 70, 4,251,167,222, 79,219,159, 56,230,135,227,210,159,218,162,127,255,149, 79,107, 86, 73,255,218, 92, +246, 31,185,130, 14,236,223, 71,199, 62,252,208,241,191,246,143,254,243,221, 26,165,183, 14,198, 78, 55,248, 11,105,213,122,219, +249,108,178,170,150, 54, 24,186, 55, 53,134,110, 72, 77,174,211,171,182,212,167,109, 44,123,237,217,223, 67,185, 29,230,173,106, +132,239,129,115, 59, 66,129, 32,190, 95, 29,155,195,151,219,245,234,117,173,139, 58,223,124, 30, 83,225,222, 11,224,174, 31, 81, +135,201,218,125,222,223,220, 7,107,107,219, 26,207, 99, 23,192, 32,192,235,187,255, 34, 80,222,247,194,249, 12,156,245,155,215, +116,119, 59,215,103,111,213, 84,246,153,230,146,207,193, 11,228,195,159,207,181,220, 10,243,241,189, 67, 23, 55,138, 86,192, 38, + 44,133,231,117,239, 5, 58, 51,150,190, 95, 63,207,178,130,222,185,206,121,230,174,207, 99, 87,140,250, 82, 13,247,182, 26,241, +162, 63, 59,173,175, 37,157,185,111,249,240,153,199,171,200,111,252,165,159,249,200, 15, 60,227,202,197, 15,254,119, 47,189,250, +185,167, 30,221,236, 93,131,222,144, 31,232,130,191, 62, 89,112,162,125, 7,206,206, 67, 27, 69,105,250,255,157, 94, 82,237, 29, +132, 43,158,125, 29,125,224,193,227,143,223,114,215,127,184,235,209, 39,182,222, 5, 78,198, 94,143, 99,106,208,207,123,147, 28, +140, 0, 8,216, 28,194,141,254,201,158, 8,202,137,190, 69, 35,148, 27,154,200,179, 29,195, 6,120, 11,157, 35, 61,249, 84,190, +222, 53,227,124,163,178,139, 49, 62, 55,208,206, 83,217,247,156,175,131,163, 17,232,225,139,137,210, 33, 90, 95, 39, 27,123,239, +121,172,149,163, 20,109,139,223,112,142,251,185,167,142,171,202,209,162,163,105,206,207,173,103,201, 54, 93, 40,242,255,169, 48, +207,230,241,135,112,148,115,152,209,193, 56, 63,161,155,248,208,126,244,211,253,235,132,254, 92,206,241,217,193,240, 63,250,216, +201,229, 59,255,204, 61, 31,250, 95,254,217,175,125,234,131, 7,246, 21,218,120,108,139,234,163,189,237, 29, 16,245,122, 20, 30, +254,227, 53, 47,253,111,116, 31, 54,251,104,254,177,109,226,227,167,233,138, 67,159, 67,239,188,255,209,143,127,205,247, 29,253, +190,251, 31,122,252, 95,234,185,157,160,189, 67,189, 31,213,205,245, 22,109,196,113, 49,250,223,195,113,110,212,227,237, 36,210, +191, 87, 55,151, 61,247,214,181, 41,204,141,231,248,174,225, 94,236,248, 30, 60,149,175,247, 18, 15,171,163,238,116,238, 12,247, + 97, 40, 7,220,118, 1, 37,129,155,215, 56, 6, 23, 27,225,250,177,207,209, 69,173, 53,164, 99,103, 67, 58, 51,200,111,108,114, +211,191,239,146,164,164,161,165,234,253,231,156,227,179,186,219, 60, 46,195,193,103, 74, 55, 50,239,138,126,203, 32, 59,119, 80, +189,221, 47,248,139,175,185,246,187,254,143,175,125,238,159,124,238,213,251, 22,219,167,133,182,135,182,172,125,212,206,139, 50, + 69,238, 5,190,115, 56,175, 65, 91,102,187,183,211,167,150,212,109, 85,218,216, 96,122,172,255,217, 15,189,235,145, 95,252,187, + 63,119,223,155,182,150,245, 87, 41,168,116,219,201,171, 56, 75, 26,117,151,174,109, 87,134,166,130, 91,239,125, 76,109, 95, 64, +207,246,221, 60, 47, 75,135,163, 88,199,209, 29,118,131,187,236,174,247, 73,122,238, 55,208, 42, 54, 97,108,250,242, 84,166, 0, +158, 35, 75,240,118,200,196,220,137,136,123,205, 32, 28,105,158,251,209, 39,171,190,172,233,241,195,205,249, 28,219, 67,160,222, +133,206,149,217, 82,205,227, 41, 99,212,205,176, 31,232, 95, 3, 87,237,250, 23, 92,179,255,171,110,253,138,107,255,244,183, 31, +126,230,151, 60,239,170,141,141, 65, 26,118, 56,135,218,127, 95,133,175, 28,100,224, 75,255,115, 86,142,251,167, 78, 45,235,191, +120,255, 35,191,241,166,247,124,226,231,126,253, 99, 79,252,124,255,211,223,211,204,193,201,214,160, 95, 78, 70,125, 30,243,248, +172,114, 86,206, 98,212,231, 49, 27,245,121,236,253, 88, 92,130,239, 24,146,231,150,178, 63,245,187,143,156,126,203,223,250,217, +143,189,251,239,190,227,193, 47,254,146, 23, 61,237, 75,254,236, 43,175,121,245, 43,159,123,240,217,135,246,119, 87, 94,185,224, +125,139,194,165, 15,206,229,196,178,110, 62,186, 89, 79,124,248, 19, 39, 31,190,247,125,143,252,151, 95,190,255,241, 95,249,131, + 79,111, 14, 81,204,192,127, 27,154,169, 15, 53,244, 61,227,164,207, 99, 30,243,152,199, 60,230, 49, 27,245, 51, 56,155,253,107, +211, 12,251, 96,144, 31,121,124,251, 15,254,237,111,126,250, 93,253,235,154,254,223,215, 29,220, 95,158,113, 96, 81,158,190,209, +241,190,237, 42,219,167,182,229, 51, 39, 78, 47, 63,213, 59,169,159,160, 41,197,254,152, 58, 7, 79,208,185,129,122,243,152,199, + 60,230, 49,143,121,204, 70,125,143, 13,251,200, 97, 87,163, 60, 68,218, 67,250,252,161,254,117,223,137,211,117,209,191, 58,120, +255, 16,129,111,233,107, 83, 63,179, 61, 27,243,121,204, 99, 30,243,152,199, 60,158,124,163,222, 26,119,163,199, 13, 5,238, 2, +127,162, 81, 23,248,115, 54,228,243,152,199, 60,230, 49,143,121, 60,197,140,122,107,224,205,112, 19,229,150,169,179, 17,159,199, + 60,230, 49,143,121,204, 99, 55,140,250,147,132,184,156, 13,249, 60,230,113,121,143,129,211,110,212,196, 99,243,237,152,199, 60, + 46,237,224,153, 46, 49,143,121,204, 99, 30,243,152,199,103,199, 40,243, 45,152,199, 60,230, 49,143,121,204, 99, 54,234,243,152, +199, 60,230, 49,143,121,204, 99, 54,234,243,152,199, 60,230, 49,143,121,204, 99, 54,234,243,152,199, 60,230, 49,143,121,204, 99, + 54,234,243,152,199, 60,230, 49,143,121,204, 70,125, 30,243,152,199, 60,230, 49,143,121, 60,229,199,226,203, 14,127,249,200,105, + 43, 92,168, 20,109,137,198, 50,117, 50, 19, 82, 57, 24, 38,251,103, 98,146,247, 63, 44,180, 74, 46,159, 62, 54,124, 70,244,151, +147,166, 12,235,159,162,159, 24,223, 39,170, 60,195,211,187, 86, 41,118,241,111,118,109, 26, 38,109,196,174,223, 51,117,106,213, +238,235,227,223,135, 3,251,161,152,244, 61,250, 57,137, 99, 11, 51,173,244,108, 75,215, 56,125,150, 36,206,157,253,251, 89, 15, + 39,112,110, 2,239, 43,254, 51,198, 3,234, 29,176,195,142,191, 27,186,213,145,158, 51,199, 59,147, 30,143,255, 78,224,239,249, +196,135,243,152,158,147, 62, 67,189, 55,178,246,194,252,241,250,119,137,254,127, 60,142,216, 79,194,247, 99,189,108,246,251,171, +159,100,129, 39, 20,231, 48,252, 87,216,238, 24,143,231, 36, 50, 93,127,149,169,219, 46,235, 9,248,251,196,167, 87,124,111,153, +158,238, 56,165,244, 30, 72, 29,230,142,244,199,153,186,249,225,147,236,202, 32,194, 80,188, 35, 31, 83,204, 21,210,115, 26,126, +184,148,144, 51, 28,206,167,235,191,160, 12,191,215,185, 88,117,210, 47,251,239, 26,214, 71,167,247,106, 60,215,113,254, 79,127, + 14,223,103,243,143,241, 61,210,222, 99, 34,184, 27, 49, 7,244,190,250,122,211,103, 21,107,134,210, 12, 43, 58,139,134,249, 91, +116,210, 8, 60,199, 88, 20,250,121,157, 15,130,235, 90, 68,103,230,244, 60,236,190,139, 79, 49,209, 53, 67,240,251,233,220,252, +189,122,226,211,239,245,189,172,175,161,123,114,149,241, 25, 23,102,159,125, 2,243,186,234, 92, 24, 78,107,252,187,192,115,215, + 27, 34,253,131, 30,158,195, 82,127,191,212, 47,175,112, 67, 36,118,133,241,252, 42,254,160,185,119, 62, 31,216,158, 41,251, 92, + 37, 61,231,113, 62,226,106,133,133,201,120, 92,125,128,204,120,220,216, 23,200,183, 84,134, 85, 79,249,196,154,231,230,123, 18, +115, 28,143,113, 71,144,118, 25,251, 94,138,123, 66,177,207, 72,172, 87,189, 52, 95,131,220,236,176,184, 67,216,123,112, 82, 84, + 93,215, 85,159,193,248, 30,184,119,176,217,164, 97,251,239,180,119,192, 74,104,182,116,138, 37, 48,205, 77,145,124,203,216,206, +205,148,203,236,186, 38,225, 81,219,227,237, 90,137, 4,254,148, 52,199,241,185,250,254,232,166,133,253,235,198,115,238,111,230, + 48,135,139,206, 73,246,103,100,231,133,119,114,250,158, 56,199, 56,207,241, 29, 85,215, 77,157,238, 93,126, 8,186, 25,136,221, + 39,209,121,192,107,182,252,120, 62,248,172, 22,217,160,219,188, 10,227,158, 62, 44, 48,169,117, 75,242, 7, 32,226,155, 51,249, + 3,167,213, 9,140, 22, 74, 98,194,227,147, 98,203, 33,152, 97,162,180, 15, 77, 70, 7,118,124, 22, 56, 27,156, 36,246, 75,191, +239, 18,198, 12, 22,137,200,234,164,105, 23, 77,108,199,240, 5, 18,134,212,222,104,199, 42,110, 26,237,196,107,108,214,112,155, +216, 38, 4, 79,134,196, 39,173,253,158, 5,254, 14,150,142,153,214,117,144,101, 48, 25,163,115, 6,207,140,209, 56,235,255, 43, +126,142,115,250,134, 97, 46,136, 59, 38,122, 20,150,244,104,197,157, 13,155,128,146,159, 89, 63,191, 22,220, 56,117,130, 27, 80, +193,125,107,186, 62, 48,136, 29,199, 38, 87, 56, 12,200,176, 80,151,186,160,211,181,234, 6, 98,198,132,193, 9,173,163, 81, 47, +212,245, 63,221, 24,223,163,102,102,216,120,185,234,137,137, 26,207,233,186, 55, 96,205,143,139,187,216, 83, 70, 67, 63, 24,137, +162,198, 32,206,149,196, 54, 88, 74,107,102,188, 36,137,249,128,142, 15,131,249,225,100,138,100,101,126,134,127, 25, 75,191,250, + 28, 36, 10,143, 60,230,197,244,243,226,134, 93,124, 74,135, 99, 41,234,216,185,145, 55,195,172,127,247,249, 62, 28,143,197, 55, + 85,189,125,227,231, 23,157,206,166,254, 25, 9,108,128,195, 87,143,207,168, 63,203,170,247, 96,116,162, 6, 71,141,101,124, 70, +230, 12, 87,158, 2, 4,174, 60,254,174,168, 23,180,148, 28,112,132, 67, 16, 78,147, 8,220,107, 14,163,203, 44,104, 83,199,187, + 85,235,180, 32, 11,231,109,192,230,115,236, 23, 53,238,171,221, 55,120, 14,196,178,178,229,177,175, 23, 73,235, 88, 56,187,239, +213,238,107,114,253, 98,111, 98,162, 21, 47, 69, 40,156, 51, 55, 48, 50, 57,172,195, 76, 24,142, 96, 6, 45,246, 58, 48,216,212, + 56,119,246,123,137,223, 78,159, 21,253,121,126, 95,118,150, 24,130,152,112, 78, 4,182, 76,105, 54, 86,150, 53, 27,175,128, 50, +184,196,254, 84, 99,114,170, 67, 79,186, 15,180,198, 62,230,109, 37, 56,239,244, 85,225, 44, 69,112,225,187,185,206, 19,221, 55, +212,137, 55, 71,190,221,124,195, 33,215,199, 32,211,185, 78,206, 6,249,119,143,115,188,155,246, 42,233,154,128,205,246, 89,136, +246, 88, 98,175,229,216, 36,146, 61, 30,191,161,214,241,179,195,255, 23,165,176,123,110,165, 20,194,233, 36, 48,111, 71, 47, 75, +208,224, 83,114,143, 91,131,202,226,211, 12, 2, 76,120,244,104,148,241,115,248,112, 25, 38,134,164,103,176,250,252, 25, 12,141, +197,101,220, 60, 59,243,192, 56,187,236, 5,139, 17, 16, 9, 90,244, 39,232, 45,226, 82,144,213,240,126,184,159,165,153, 92, 30, +203,195,198, 43,201,105,178,251,144, 61,229,194,173,115,193,144,113,128,251, 37,152,173,136,239,100,120, 95,225,200, 6, 20,142, + 37,183,178,129,241,100, 96,109,153,115,202,100, 72,242, 40, 69,141,123,236,163, 28,243,195, 38,167, 71, 28,156,188,112,187,127, + 85,239, 71,129,223,143, 81,121, 19,217,226,121,248, 70, 33,147, 57,234,250,121, 59,254, 93,224, 62, 37, 7, 10,156, 1, 48,172, +104, 96,109,130,244, 38,218, 55,148, 58,156,221, 16,189,219,247,143,206, 5,251,115,152,238, 95, 68, 83, 5,238,231,104,224, 41, +126,215,161,163,148,214,141,172,108, 14,204,197, 55, 70, 94,227,107,166,117,169,215, 25,134,135,194,152,233,245,143,191,109,140, +119, 60, 74, 78,155,161,109, 38, 17, 93,112,108,146, 30,217,135,177, 23, 61,126,181, 89, 55, 94,252,176,153,113, 90, 45,163,203, + 10,199, 45,130, 65,206, 52,121,171,125,253,120,191,166,251, 89,221,237,236,157,165,206,162,157,233,147, 27,122,126, 12,207,175, + 74, 60,219,149, 4, 87,147, 1,227,198, 73,234,250, 77,118,112, 42, 24,182, 55, 17, 73, 71,178,235, 95,170,186,181, 80, 14, 40, + 10,172, 67,139,180,196, 50, 26, 50, 57, 51,147,195,202,227, 60,151, 20,111,209,116, 95, 52,123,217, 58,237,133, 96, 79,173,248, +123,140,104, 57, 12,182, 25, 60, 48,202,152, 9, 21, 48,238,126, 14, 2, 89, 27,248,157, 88,230, 65,154,125, 15, 51, 22,238, 64, +163,195,178,154,108, 36,207, 6, 82, 24, 37,145,118,219,247, 8,187,216,252,194, 12,147,228,243,146,106,142, 85, 56, 28, 85,150, +112,111,117, 13, 23, 78,251, 45, 53, 6, 28,141, 55,169, 3,111,182,132, 57,246, 50,134, 12,182, 69,213,150, 5, 28,231,113,149, + 49,163,180,172, 97,228,253,126, 87,113, 7, 58,219, 64, 78,247, 65, 32, 47,199, 12,171,157, 37, 69,230,195,218,174,144,173, 94, + 20,184, 64,155, 98,131,199, 26,155,139,110,214, 26, 29, 79, 49, 0,187,193,176, 3, 69,148, 38, 43,233,241, 48,188,106,124,106, +108,104,110,200,212, 50, 51,230,177, 96, 54, 88,186,145, 53,156, 77, 81, 44,155,183,167,209,135, 26, 20,255, 17,156,207,100,236, +112, 29,228,236,130, 27, 87, 14, 87, 47,210, 32,182, 65,174,139,226,155,180,182, 70,154, 53, 61, 20,114, 15,159, 5, 82,176, 80, +218,224,182, 76,193, 28,145,152,196,218,245, 84,144,230, 98,205,185, 19,209, 8,134,241,222,169, 81, 43,156, 50, 20,118,255, 10, +184,153,204,217, 51,102, 76, 9,193,164, 19,129, 20, 49,135,225,133,105,152,178, 9, 12,199, 23, 72, 7, 23,119, 0, 56, 69,211, +118,150, 37,127, 90,231,140,221,185, 49,220,155, 54, 45, 48,118,195,117,117,227,247,151, 40, 23, 80, 68,103,113, 68,184, 70,157, + 3, 21,114, 23, 67, 44, 95,212,105,233, 10,107, 65,197, 34,115,245,218,213,120,155, 51,103,206,119,193,247,132,233, 12, 67,143, + 70, 70, 36,151, 26, 56, 28, 53, 18, 88, 71, 41, 82, 99,207,185,242,184,221, 67,182, 44, 21,120, 24, 28,203, 72,161,231, 8,111, +250,123, 50,196,162,169, 76,198,247,176, 27,133,136,226, 57,140,187,222,222, 33,115,210,105, 52, 30,145,149, 26,184, 50, 57,114, + 34, 77,170, 97,216,140,224, 25, 22,221,123,134, 59, 86,237,169, 12, 14,134,206,245,186,146,200,183, 53, 18,169,119,243,243,151, +169,252,196, 41, 83, 42, 77,134,119,124,142, 16,118,187,115,100,137,125, 77, 7, 20,219,165,173, 12, 5, 89,168,194,217,144, 77, + 27,126,153,230,132, 62, 91, 72,244,249,140, 27,239,183, 6, 22,197,253, 43,105, 2,243,216,127,184,241,179,101,197,218,114,206, +166,233,125, 19,176,248,246,119, 81, 67,148,162, 74, 8, 59, 43,126, 31, 58,250,220, 62, 69, 74, 6, 93, 56,175,123, 43, 5,180, +233,228,200,222,197,131,177,223, 47,209,241, 5,135,197, 83,239, 77,246,218, 3, 44, 42,201, 9,182,204, 99,172,165, 40, 7,132, + 49,167,100,212,219,247, 82, 74,201,151, 53,251,255, 52,255,134,140, 31, 87,141,200, 9, 50, 57,195, 62, 82,214,167,134, 33, 23, + 4, 78, 21,222, 96,142,108, 24,100,112, 45,184, 50,103,103, 81, 56, 71,205,195,173,232, 10,120,168, 66,145,124, 98,140,178,167, +213,192,201, 0,115, 68,194,196, 43, 81,168,111, 13, 37, 60,101,129, 52,155, 71,200, 77,105,134,121,117, 2,141,229, 2,136, 68, + 69, 96,193,106,164, 73,140, 11,162,172,250, 10,152,130, 55,195,194,148,235, 43, 77, 93,179,164,243,136, 40,126, 74, 9,194, 6, +170,147,175, 27, 83,156,145, 58,182, 7,230, 89, 0, 76,236,149,105, 97,217,121, 12,155,236,184,184,139, 46,190, 66,238, 61, 70, +202, 95,220,136,216,195,182,148, 19, 75,212,130, 24, 34,127,223,212, 56,188, 1,187,254, 2,179, 54,162,123,115, 64, 20,131, 32, +225, 32,165,103,228,233,239, 48,190,177, 52, 75, 78, 51,115, 78,151,162,113, 47, 66, 77,153, 71,235,155,120,221,240, 28, 58,153, +210,178, 4, 53,237, 66, 80,199, 5,231,178,112,202,229,128,179, 18, 89, 7, 75, 51,122, 52, 78,150, 86,159,158,203, 66,207,163, + 88,228,174, 24, 20,143,210,201,106,237, 83, 73,165, 88, 20,103,231, 39,120, 78,154, 81,225,108,156,160,162,183,130,239,224,180, + 75,114,206,202,123, 61, 55,140,176,173,130, 97,179,169, 44, 9,129, 17, 27,228,228, 26,248,103,224, 24, 44,144, 97,146,168,209, +143,243, 21,106,197, 98, 62,166,104, 74, 93,166,103, 80, 97,166,216,249, 87,216,200,164,194, 78, 9,207,190, 43,134,193,224, 28, +129,233,170, 17, 41,250,239, 26, 43,124, 40,171,232, 4, 31, 82,159,246, 92,198, 84,168, 93, 11, 24, 99,150, 92, 59,183, 77,188, +106,100, 91,154,108,130, 27, 99, 2,195,204,240, 30,116,190, 74,137, 44, 81,137,249, 45,128, 35, 24,174,205,157, 82, 72, 15,139, +228,148, 62,227,186, 45, 77,101, 94, 34,136, 32, 89, 13,241, 69,247,163, 42, 24,177, 7, 46, 69, 96,191, 10,103,111, 93,109, 28, +231,169,192,116, 99, 48,226,109,169, 32, 48, 23,246, 63,143,250, 61,211, 35, 9,121,132,206, 73,197, 32, 81, 2,127,226,126, 34, + 56,111,145, 89, 44,190,190,132,172,172,201, 41, 34, 71,131,206, 24,136, 17,135,125,210,231, 80, 88, 34, 53,143,129,138,167,221, + 4, 12, 46,141,198,188,154, 67,211,133,109,178,183, 21,199, 43,173,150,209, 8,237, 71,141,185,225,115, 79,116,245,212,240,232, +198, 57, 90, 35,253,185,176,186,164, 27,119,191,200,236,245, 71, 68,139, 73,171,180,203,164,136, 7,103, 29,167, 84, 50,231, 9, + 33, 12,222,159,120, 29,220, 38,169,195, 24, 82,109, 87,255,110,168, 41,161,214, 53,246,205, 56,101,142,113,255,147, 12, 80, 41, +232,105, 83,118, 24, 56, 69, 3,156, 82, 91, 98,233,153, 2, 94,175,166,214, 28,188,149,192, 82, 76, 57, 73,142, 48,186,254,111, + 93, 89, 73,191,155,129, 71,224, 70, 74,239,235,239,113,162,238, 91, 83,127, 75,152,142,113,179, 43,185,204,193, 43, 21, 12,207, + 42, 88,242,150,225, 89, 89, 68, 94,210,166,214,150, 18,204,104,113,204,129, 38,211,225,155,150,101, 52,244, 2,221, 91,206,110, +190, 71,236, 29,100, 43,208,147, 22,187,119,220,148, 78, 36, 47,106, 75,253,217,117, 5,234, 64,220,227, 40,234,176, 21, 77,173, +118, 35,254, 4,140,183, 70,232, 5, 34,242,130, 6, 94,196, 61,127, 78,128,201, 56,134,164,123, 32,107, 82, 64,195, 23, 86,200, + 57, 97,210, 87, 50,184,105, 0,255,233,130,239,108,222,168,147,215,217, 17,164,122,164, 84,245, 58, 45,189,105, 78,230,180, 17, +139, 59,147,211, 86, 2, 53,118,116, 8, 36,167, 91, 69, 8,162,137, 41,242,245,244,169, 58, 13, 83, 54, 76,103, 72, 97,127, 54, +182, 23, 21, 12, 2,166,208,125,204, 32, 86,157, 79, 2, 37, 34,139,230, 11,236, 87, 34,185, 22,222, 89, 9, 4,162,196, 12,226, +130,115,119,252,137,228,242, 46,163, 81,194,116,172,174, 9,230,198,191,154,230,135,101,137, 24, 2, 34,204,106,141, 64, 64, 50, + 71, 98,114,114,204,249,242, 0,137, 37,213, 87, 5,246,179,182,156,110,166, 16, 83,211, 67,246,164, 86,168,135,235, 69,212, 53, +233,120, 2,227,215, 64,107, 51,166, 39,239,230,171,165,106, 40, 97, 32,162,164,194,206,103,153, 10,241,107,147, 6, 60,199,105, +223, 44,238, 32,101, 0,172,225, 86,248, 12,217,193, 48,232, 77,233,146, 41,165,210, 89, 56,239,151, 5,174,219,239, 55, 96,179, +212,225,173,122, 35,108,189,133, 19, 11, 40, 39,155,231, 16,216,162, 93, 98,205,136, 76, 54,153, 61, 48, 35,116,194, 0,211, 80, +205,161, 54,160, 98,157,246,232,133, 45,224, 10,105,218,132,210,100, 52, 58,250,160,121,125,238,217,128,104,133, 27,208,157, 80, +147,122,101, 79,149,121,125,152, 48,221,175,199,226,240,192, 48, 83, 32,224,104, 8, 71,234,150, 97, 2,120,157,147, 17,184, 53, +149, 22, 4, 82,236, 81,255, 66,116,175,109,100,188,130, 90,143, 8,118,213, 41,102,132,180, 83,142,198,170,192,125, 5,112,160, +213, 0,171, 4, 80,131,160,254,107, 0,144,194,232,113,138,130,150,166, 25,225, 95,167,145,102,160, 52, 5, 48,214, 96,236,168, +137,242,192, 89,192,115, 14, 67, 33, 9,215, 16,169,250, 72,162,217,220,169, 2,169, 46,189, 38,195,109, 48, 0,213,108, 99, 55, + 99, 92, 32,106,199,249,133, 27,100,199,232, 16,134, 49,181,133, 26,191,159, 28,150,113,126, 49, 32,243, 75,227,161, 67,244, 55, + 45, 40,241,164,157,221,139, 14, 54, 47,223, 52,172,102,206, 17,133, 21,221,112,212, 57,247,107, 43, 80, 63, 12, 32, 78, 56, 68, + 57, 58,111,192, 30, 88,107,131, 84,162, 88,253, 89,162,230, 61,221, 31, 43, 81, 77,169,116,115, 44,170,103, 16, 74, 68,213,122, +225,149,197, 29,217,201, 0, 27,128,114, 58,195, 49,186, 67, 99, 37, 16, 69,154,115, 33,158, 75, 25,235,152, 75, 70,244,111, 48, + 30,170,215,225,217, 81,230, 14,137,211, 96,128,137, 87,139,224, 86,218, 99,214,182,146, 17, 49,143,251,214,184, 6, 58, 63,199, +170,207, 61,230, 16, 0,164, 34, 15, 26,224, 47,150, 12,239, 2, 28,209,228,223,135, 67,194,250,240,121, 77, 54,210,192,198,146, + 88, 22, 78,223,112, 87, 2, 89, 30,211,181,151,126, 35,214,210,132,197, 41, 77,118, 34,130, 24,210, 50,137, 4, 99, 70,215,168, + 95, 15,248,228,213,144,234, 99, 42, 88,178,247,162,142, 30,154,109, 65, 39, 5, 35,113, 48,142,109,128,185, 66, 85, 49, 67, 14, +243,166,182, 44, 5,110,114,168,186,159,113, 97,207,136,133,227, 16, 14, 83,251,243,246, 41,100, 6, 74, 32,127, 87,210,232, 88, +246, 77,123,182, 36,188, 74,193,140,100, 19, 37,153,243, 90, 43,172, 75, 4,228, 73,100,118, 45, 96, 41,148,113, 63, 81, 91,103, +159,135, 35,144,119, 41,144,199, 54,246, 66,102,151,144,165,247, 21, 16, 61,101,197,234,180, 70, 24,162, 18,243,234, 83,106, 2, +235, 58,176,230, 74,138,122,128,234,226,155,166,214,213,106, 51,217, 24,234,235,162,145, 92,129,135,100, 57, 22, 17,159,172,204, +145, 38, 36, 72,211, 23, 77,111, 79,105,147,140,128, 23,143,196,162,150, 85, 74,190, 14, 96, 49,120, 58,135, 82, 36, 31,121, 98, + 79,183, 11,162,193,201, 35, 4,187,110,105,192,109,136,190,198, 61, 91,180, 6,107, 70,205,162, 97, 1,195, 88, 0,156, 24,115, +106, 50, 7, 75, 69,225, 70, 93,136, 82, 70,133, 20, 81,206, 45, 32,208, 83, 73,146, 60, 98,191, 38, 48,174,150, 93,106,169,111, +182, 56, 58, 78, 60, 8,175,235, 14,143,165, 32, 40, 9, 29, 33, 18, 44,222,171,113, 81,195, 84,216,157,163,201, 25, 16, 77,129, +149,148,150,102,141,190,166, 20, 55, 43,208,211, 12,136,126, 54, 2,110,189,215,172,181,227,233,107,187,142, 61, 90,137, 58,174, + 56,192,174, 51, 58,137, 71,225,122, 93, 14,168, 25,230,110, 25, 83,243,108,105, 58, 45, 31, 20, 68, 2,115,170,238,233,253,176, +147, 43,193,230, 72,204, 14, 52, 48, 2, 78, 36,214,228,217, 61,119,134, 40,121,169, 0,194,194,156, 0, 57, 78, 31, 29,140, 59, + 87, 63,230, 18, 92,121, 95, 0,117,186,211, 27, 93, 73,128, 49, 86,131, 63, 45,231,162,231, 84,192,136,151, 49, 59, 49,172,219, + 42,144, 92,129, 20,205,144, 22, 23, 71, 37,103,194,103, 98, 85,104, 38,174,232, 92, 90,208, 84,155,246,154, 63, 75,206,192,177, +213, 95, 99,173, 14,255,218,178,247, 58,118, 96,218,243,138,214,186,209, 73,136, 52,103, 0,181,136,195, 25,163,222,121,136, 4, +101,206,230,149, 6,123,194, 92,146,129, 64, 50, 85,193, 77, 93,191,179,106, 20, 91,189, 62, 26, 70,219,172,202,132,254,135,122, + 42, 82, 14, 57,211,108,199,121, 61,188,106, 85,119, 78, 2,251,144, 64, 29, 88, 54, 5, 70, 79,115,141, 2,120,151,228,112,227, +121, 50,166,208, 17,225,158,163,215, 64,189,175, 98, 15,176,174,205, 80,214, 96, 94,165,135, 6,131,136, 82, 90, 60,131, 96,129, + 58,218,100,140,253, 30, 87,201,199,133,160, 40,147,125,193, 14,217,156, 7, 67, 62,101,253,244, 58, 75,209, 61,196,102,100, 25, + 29,110,204,224, 90,109,220, 50, 94, 69,231,231, 82, 51, 99,198, 52, 50,251, 84, 36, 50,216,195, 70, 52, 57, 18,101,220, 79,150, +106,220, 23,206, 55, 47,211, 54, 84, 74, 84,187, 17,111,236,188, 92,182,104,172, 36, 80,211,116,103, 75, 70,193, 91,148, 89,192, +235,109, 96,235,211, 67,140,132,162,123,157, 64,235,170,146,211,194, 14,246, 25, 83,106,101, 60,183,174,161,169,173,162,231, 97, +147, 67,220, 5, 11, 0,187, 32, 85,196,185,110, 59,188,107, 9,165, 4, 75, 93, 91, 68,140,245,241, 66,136, 4,141,122, 76,251, +221, 9,180, 5,155,142,164,146,129,128,115, 21, 84,175,201,232, 20,224,185, 34, 79, 57, 60,237,194,171,209, 31, 65, 58, 74, 52, +210, 49, 32, 24,166,171, 45,226,152, 82,203,178,226,157, 91,165,192,241, 18, 2,153, 30,142, 58,120,181,180,235, 0, 30,177, 26, + 42,208, 71, 44, 19,192, 80,202, 40,138,226, 52,132,121, 74,201, 26, 56,205,129,106, 80,118,209,235, 93,104, 54,104,201,147, 83, +233, 53, 84, 7,231,229,224,162,211,141,104,187,143, 52,221,155,214,250,172, 59,176, 84,220,192, 48, 96, 59, 74,131,176, 47, 8, +212,202,148,144, 84,126, 89, 5,255,181, 78, 83,161,228,158, 10, 37, 13, 4,230,182,166,162,165, 52, 42, 9,217,108,153, 17,187, +111,162, 40,127, 51,212,200,121,183,243,169, 37, 12,171,165,250, 82, 41, 14, 1, 94, 94,229,230,148,221,234, 40, 64, 76, 86,219, +180,140,224, 84, 14,224,224,252,121,129,148, 87, 25, 56,138,243,177,103,238,148, 58,168, 55, 10, 56,241, 85,162,238, 94, 45, 82, +243,140, 92, 73, 96,241, 41,179,210,112,247, 25, 0,173, 16, 20, 84, 10,218, 17, 98, 53, 10,212,117,141,214,104,169,114, 6,140, + 3, 97, 68, 13,215, 92,213,168, 12,127, 43, 94,106,171,126, 30, 85, 16, 20, 88,162,254,205,145,186,182,232, 94,146,193, 23, 0, +164,182, 98, 9, 88, 22,108,172,101,179, 7, 50,101, 70, 68,203,109,183, 52,103, 69, 92,147, 6, 89,142, 45, 18,172,201,115, 42, +103,250, 61, 46, 37,167,249, 89,146,241, 46,220,102,175, 50,184,140,145,190,138,107,172, 16,148, 59,162,204, 20,249,243, 72,195, + 11,170, 41, 88,198, 88, 50,144, 77,212,112, 27,143,158, 69, 60,235,231,193,165,239,207, 60,101, 89, 25,168,192, 33, 78, 18,207, +207, 74, 33, 85,241, 64,253,255,182,244, 1, 15, 24, 21, 67,188,219,164,173,186, 70,170, 34,236,141, 65, 48,166,223, 59, 46, 30, +221,224, 70,230,117,118,216, 44, 29,167, 1,209,232,178,165, 68, 73, 54,114,150, 86, 47,224,193, 5,136, 45,170,136,150, 70,116, + 47,185,106,109, 26,144,139, 82,193,248, 58, 48,132,129,244, 66,224,148,160, 95,108, 6, 76,143,167,128, 52,140,228, 43,166,215, + 37, 3, 34, 8, 0, 19,200,220,183,168,161,168,161,112, 35,168, 27, 46,210, 14,208,235,207,117,166,184, 71,190, 88, 56,248,151, + 9,203,156, 22,223, 68, 65,140, 8, 77, 82,221,201,193,118, 21,232, 28,232,125,115, 60,175, 82, 56, 34,121,155, 7, 37, 68, 53, +204,201, 27, 54,233, 5, 68,187,211, 36,171,186, 97, 14,148, 35, 67,127,199,245,111,203,228,112, 85,219, 14, 52,216,241,114,195, + 32, 18,163, 40,245, 2, 78, 72,135,243,173, 4,128,207,178, 27,139,148, 69,178,180, 40, 80,229,120,224,107, 14, 60,244,233,188, + 12,180, 85,160,124, 51,206, 49,189, 71,204, 19,168,106,255, 96,236,198,227, 83,166,217,113,160,222, 11, 8,104,148,148,150,151, +184,255,176,233, 21,230, 44, 90, 4,233, 68,145, 0, 20,226, 94,154, 32,114,236,112,187,241,119,219,117, 9,217,142,225, 25,118, +206,225,237,156,253,193, 32,104, 36,145,166, 21, 73,184, 16,155,161, 53, 17,226,160, 30, 11,155,152, 25,180, 40, 37, 73,142,108, +134,181, 40,145, 93,169, 6,230,246,239,116,206, 66,195,243,102,199,208, 36,254,140,129, 64, 97,222, 10,148,153,108, 83, 21, 72, + 83, 24,206, 1,179, 23,219, 85,130,255,139, 25, 52,201,130, 17,200,113, 47,137,179, 60,165, 56, 11,148, 80, 70,148,177, 81,239, + 10,240, 41,252, 51,211,220, 50,102, 9, 98, 22, 48, 0,112, 62, 51, 79,223, 58,214,190, 53,250, 50,195, 92, 56,156,129, 42, 1, +182,115,202,154, 70,246,108, 70, 66,163,224,162, 6,166,141,184, 83, 56,209, 96, 49, 37,237, 83,146, 82,179, 83, 68,203, 43,185, +119,214,115, 95, 4, 43, 24, 64,195,144, 41,229,112,251,152, 57,131,131, 0, 0,202,148, 29,136, 21,173, 19,225,140,225,106,153, + 33,190,103, 67,202,190,193, 14, 85,194,108, 76, 56,116,152,129,137, 76, 38, 39,129, 23, 14,175,169,201,200, 67,160,161,108,135, +209, 30, 89, 54, 25, 84,130, 12,131, 85,212,238, 77,152,144,222, 64,107, 0, 60, 36,210, 22, 60, 57,215, 46,236, 4, 40, 65,172, +171, 15,118,105,169, 0,161,193,246, 44, 54,186, 46,140, 34, 3,130,123, 48, 88, 30,253,150,100, 28, 25,235,114,190, 89, 51, 76, +248,168,185, 22,168,247, 86,137,197, 95, 52, 85, 84, 7,210, 60,136,134,116, 86,235,102,106, 12, 91,127,244, 46, 12,169,165, 55, +208, 11, 54, 49,130,142, 86,244, 97, 48,121,146, 60, 70,219, 46, 13, 53,137, 25,114,100,218, 51, 3,141,143, 37,170,200,238,121, + 5, 16,138,129,206, 97,136,211,186, 2, 38,137, 69,195, 14,138, 1,254,120, 42,210, 3,138, 91,116,143, 31,193, 65,154,154,166, + 48, 86,163, 66, 22, 77,142,217,152,130,238, 88, 51, 43,150,106,210, 77,171,144, 71,174,104, 68,138, 34,246, 55,116, 46, 44, 13, + 61,218,143, 83,189, 49, 57, 53,138,136,104,132, 87,194,145,216,208, 13,142,128,227,239, 17,167, 11,151, 72,176, 20,116, 1, 44, + 33,125, 60,156,203, 6,164, 44, 43, 5,122,188,227,136, 12,167,107,159,190,223, 40,103, 38,140, 50,122,205, 69, 28,145,187,232, +255,190, 49,214, 91, 39,241,155,241, 59,235, 68, 93,219, 26, 22,209, 40,214, 0, 4, 48,141,200,188,102, 95, 48, 91, 65,137,147, + 62,166,254,181, 20, 82,184,161,188, 8, 8,232, 64,184,209,150, 87,156,162,196,188, 30,144,132, 42,130,186, 33,109,240,130,194, +207, 55,148, 54,130, 61, 53,246, 54, 37, 51,243,238,101, 2,101, 97, 42, 19,105,106,184,150, 24,208,241,226,120,117,173,204,179, + 4,135, 29,132,122,204, 70,150,138,142,186, 33,172, 45,202, 45,171, 26, 15,156,179, 0, 81,198, 43, 64,173,148, 21,196,167,229, +182, 44, 19,179,212,181,159,140,130, 12, 37,132, 8, 38, 42, 82,222,120,114, 8,106,230, 19, 58,238,131,146,113, 98, 40,183, 77, +115, 96, 16,214, 89, 88, 6, 83,168, 1, 70, 33, 70, 37, 11, 74, 5,248,117,226, 50, 91, 38,101,188,140,126, 87, 95, 42,243,127, + 73, 1, 30, 52, 44, 64,161, 0, 32, 18,102, 90, 56, 59,144, 1, 12,105,197,184, 40,171,196, 49, 37,128,100,149,200,170, 58, 64, +214, 49, 4, 37,202, 24,173, 6,146, 3,131, 75,148, 95, 27, 67, 77, 43,101,196,196, 64,139,138, 75,163, 5,194,140,146, 88,224, + 57, 52, 92,239,150,190,140,224,103, 2, 26,158,149, 95, 70, 39, 16,116, 15,136,179, 19,224, 41,118, 88,187, 30,171,115,147,208, +213, 64,208,246, 11,211,116, 41, 37,241,155,140,113, 61,125,157, 57,192,195, 62, 58,130, 25,181,164,168, 89, 26,203, 48, 17,100, +202, 28,251,160,107,111, 40,255, 77,217,129,234, 2, 74,139, 33,154,145,132,122,167, 0,180, 16,114, 18, 33,205,164,155, 42, 99, +125,164, 68,234, 83,132, 87, 56,164,164, 27, 51, 65,218,200, 34,212,142,197, 35, 48, 55,192,131, 2,153,184,204,146, 59, 26,152, +234, 53,144,122, 17,240,204, 26,138, 94, 82,159,227, 21, 66, 99,166, 13,113, 0,189, 36, 69, 81, 25,112,193,171,133,119,247,164, + 71, 73, 81,137,180, 74,251,149,104, 72, 45, 77,202, 73,144,129, 27, 89,219, 72,227, 58,242,147, 25, 0, 52,224, 52, 97,234, 54, + 30, 86,186,175,120,237,142,204,133,109,107,161,128, 52, 3,127,237,227, 73,166,115,171,223, 57, 7,145,151, 69,255,222,173, 58, + 69,232, 83,217,163,172, 56, 30,251, 0, 24,103,124,211,165, 1,165,152, 28,141,188,193,161,110,134,180, 38,214,205,183, 80, 32, + 73, 43, 69, 54,161,148, 44, 19,234, 94, 49,141, 28, 77, 53,222,253,185, 90,136,110, 66, 72, 60,100, 14, 2,152, 85, 58, 30,223, + 35,181, 38,177, 23,166, 76,181, 43,118, 63, 96,243,198,159,101,208, 96,240, 81, 45, 61, 95, 5,152,222, 40, 26,209, 72,216, 58, + 91,192,210, 73,132,140, 59, 67,232,139,211, 15, 71,100, 21,242,124, 37,180, 20,166,107,162, 44, 27,172, 0,177, 42, 13,147, 70, +203, 43,146, 68,103,106,192,142, 36,202, 77,228,104,223, 41,187, 82,165,137,169, 70,197, 44, 90,225,198, 87,201,226, 83, 85, 40, +161,168, 5,106,187,220,176, 3, 8, 36, 78, 61, 67, 8,145,147, 69,111, 5,138, 87, 5, 36,121,188, 6,168,179,180, 2, 93, 73, + 28,116, 90,147, 81, 22,216, 59, 44,183,192,128, 76, 46,109,125, 22,121,208, 72,197,100,201,249, 54,225, 68, 5,181,210, 77, 85, + 33,195,174, 83,236, 67, 85,108, 2,212,246,151, 80,158, 27, 29,171,130, 34, 80, 5, 34,111,110,192, 12,226, 64,181, 40, 1,138, + 43,249,185, 90,160,144,227, 33, 66, 22, 27, 0,115, 32,152,211,178,135, 88, 83,220, 92, 64, 70,181, 21,157, 90, 9,167, 37, 9, +199, 33, 75, 41,105,124,175, 32,243, 36,201, 24,103, 52,136, 64, 89,132, 83,116, 78, 18,216, 16,209,192, 8,245, 18, 86, 20, 80, +157, 7, 47, 0, 1,130,140, 78,137,108, 78,176, 6, 80,203, 74,180,212, 8,242, 62, 45,149, 77, 69,179, 60,155, 92,131,222, 93, + 20, 99, 33,160, 72, 25,138,141, 17, 48, 88, 80, 80, 52, 35,186,224,210,173,168,232, 44, 5, 80,213, 38,126, 1, 8, 62,210,232, +194, 40,216,148, 36, 46, 56, 16,214, 43, 56,234,156,166,119, 20,162, 84,175, 23, 13,187,102,208,128,244, 86,116,173, 69,142,201, +197,112,209, 73,130,208,210,255,130, 17, 94,195, 59, 55,113, 25, 51, 18, 54,121,145, 2,209,128,220,164, 1,118, 24,162,124, 76, + 75,193, 2, 46,148, 65,115, 40,202,144,167,185,100,212,166, 1, 42, 40,138,116,133, 66, 35, 91, 0,180, 83,146,254, 48,143, 41, + 99,198,201,201, 0, 90, 76,245, 49,142,122, 42,164,164,189,122,203,192, 59,230,201, 73, 25,254,126,176, 76,139, 96, 99, 52,232, +197,235,116, 75,240,248,247,117, 81,107, 55, 14,238, 80,243,217, 2,222, 48, 3, 11,149, 20, 0,181,209,177,215,127, 55, 10,195, +166, 88, 82, 57,195, 0,150, 62,161, 75,200,201, 46, 0, 40, 57,165, 30, 5, 12,172, 56, 16,199,234,166, 62,129,134, 19,174, 33, +246,130, 32,157, 66,173,214, 59,164,209, 36,244,195,113, 35,143, 58, 57,235,249, 87, 16,105,162,182, 34,217, 4, 84, 5,194, 39, +129, 53, 38,206,217, 78, 10, 92, 9,116, 19,231, 72, 14,112, 67,174,114,113, 32,143, 36,225,111,224, 1,155,242, 92,147, 6,197, +232, 95,198, 52,191, 56, 90, 90,128, 79, 39,133, 18,248, 77, 72, 32,226,111,121,210, 28, 0,193,148, 34,150,140,153,147, 41, 43, +215, 74,157, 22, 48,204,145,158,111,176,208,133, 60, 69,143,207, 47,107,115,176, 70,199, 89, 48, 37,145,181, 0,232, 91, 97,234, + 20,247,191, 80, 51, 34,107, 72, 8, 53,250,226, 20,218,233, 46, 21,172, 72,121,115, 92,170,127,207, 20,201,141,233,254,113,109, + 23, 23,183,177, 0,222,128, 85,196,220,100,122,216, 17, 15,168,200,150,203, 43,130, 25,240, 70,201, 44,171, 2, 82,163, 16,137, +193, 82, 73, 84, 61,206,217, 38,202, 96, 79, 2,177, 29,228,154,155,248, 14, 3,117,176, 21,211, 9, 57,114, 20,169,145,204, 34, + 1,229,183,160, 2, 2, 91,200,179, 83, 28,202,115,210,158,103, 56,201,157,123, 96, 5,246,125, 78, 58, 1,228, 24,143,170,223, + 81,147, 96,168, 35,223, 9,128,110, 44,192, 10,145, 96, 42, 0,133, 45,148,117, 56,199,165,206,143, 87, 55,111, 25,207,115, 49, +214,114, 11, 39, 0,200,240,179,106,104, 72, 16,228,168, 28, 41,181,162, 0, 43,134, 72,158, 17,124, 65,109, 58,145,136,207,196, + 86,129,136,195, 37, 20,161, 78,198,171, 22,209, 63, 27,224,183,216,240,167, 90,176, 78, 86, 6,217, 68,151,163,148,188,176,129, +147,139,155, 66,113,222, 34,212, 97, 65, 52, 1, 27,200, 20,206,109, 56,186,204, 58,214,250, 90, 8,155, 80, 1,189, 98,135,227, + 71,251, 20, 67,114,199, 4,103,255,126, 75, 98, 90, 67, 20, 73,138,127, 90, 95,113, 17, 20,130, 72, 81,109, 24, 77, 17,182,165, +163, 59,189, 7, 29, 71, 9,198, 1,100, 83,184, 57,213,124,244,189, 75,125, 62, 54, 17,247, 73,120,198,126,143,244, 81,141, 17, +121, 25,106,213,177,185,143, 92,111,173, 15, 85, 80,200, 27,126,191, 81,108,193, 85, 55,222, 94,179,132,247, 14,115,182, 43,224, +120,137, 4,251, 65, 12,172, 36,176,192,139, 99, 16, 88,211,111, 35, 66,123, 76,193,218, 26,152,194,162, 73,118,182,142,127, 31, +163,241, 98, 72,123, 43, 39, 76,145,236,160, 41, 80, 20,177,159,203,123,202,203,183,101,204, 29,240,114,217,227, 69,211,163,110, +155,119,184, 12, 76, 2, 45,198, 54, 82, 76, 95, 31,177, 62, 57, 39, 29,141, 91, 60,149,220,121,148, 83, 0, 16, 42,205,122,170, + 88,103,166, 86,112,133, 18,238, 69, 26,220, 74, 75,179, 66,223, 77, 32,202,172, 76, 80,210,106,165,164, 81, 1,142, 93, 33,145, + 37, 55,157, 41,134,127, 25,217, 53, 12,197, 50, 78, 58, 54,147,209,237, 34,189,109, 37, 65,230,100,188,186,100,192,128, 11, 14, +217, 12,151,178,165, 53, 74,146,198, 86,193,107,131,136,223,249,196, 73,183,187,186, 35,229,234,149, 78,133, 18,136, 50,217, 51, +145,194,185,111, 74,213,123, 81,206,212,240, 67, 76,162,152, 39,240,163, 59, 3, 0,128, 92,145,163,110,241,222,156,231, 73, 35, +149,154, 24, 53, 68,185, 95,135, 68, 23, 5,226,220, 72, 6, 69,116,114,119, 41, 81,130,120, 24, 55, 55,250,141, 2,165,180, 34, +103, 77,170,189,149, 87,118, 5,186, 26, 40,146,146, 24, 73, 97, 67, 4, 88, 17,230, 48, 10, 38,125,149,185, 85,129,243, 63,237, +195, 1, 50,119,225,117,100,168, 36, 65, 32,197,119, 41,150,194,215, 84,205,165, 56,201,160, 7, 85,101, 21, 40, 19,133, 61, 92, + 44, 37,116,152,145,136, 88, 40, 60,113,227,117,150,148, 40,206, 96, 11,211,212, 45, 58,235,184, 80,211, 95, 64,178,192, 9,208, + 47,108,195,198, 19, 76, 92, 81,192,194, 58, 55, 93, 12,240,160,160,150, 2,169,108,221,168, 37, 59, 57,147,193,233,112,193, 86, +136,174,166,141,180,166,135, 22,228,254,174,148, 4, 26, 49, 48, 97,210,126, 46,228,155, 67,214,234,143,137,108, 64,190, 49,213, + 6,212,177,165,160, 64,207, 84,235, 69,154,133,167,223,213,229,171, 64,157,152,140, 35,131, 78,117,174, 91, 21,164,222,105,180, +178, 80,197,174,253, 67, 74, 93,211,215,251,251,205,111,248,251, 88,227,209,251,177,173, 19,110, 41,197,233,124,251, 53,187, 51, +130,122,116, 2,119,138, 80,158,234,149,117, 4,115, 89,250,100,152, 67, 11,182,242, 66,113, 99, 55,124,118, 57,162,212,130,225, + 16,202,111, 37, 34,102, 75, 63,119,156,144,177, 17, 73, 84, 5, 26,150,209, 97,224,146, 50,104,192, 91,149, 64, 65,107,234,172, + 84,243,118,151,238,164,117,150,134,210,140, 4, 47, 34, 21,110, 77,105,202,162,191,226,210, 65, 62,106,181,179, 26, 49,254,172, +100, 21, 62,233, 18,194,187,112, 86,211, 98, 9,177, 2,177, 77,222, 13, 74, 77,221,192,200,128,167,240,111,225, 0,173, 22,236, +164,161,153,138,202, 89,179,206,128,100,165,137,204,106,219,139,169, 74,208, 74,155,102, 30,216, 4, 17, 32,118,154,206,205,106, +116, 85,157,205, 37, 56, 19,222,100, 5,140,253, 98, 40,145, 72,142,138,196, 27,148,212, 70,248, 9, 64,149, 10, 96, 51, 85,186, + 2,169,221,156,101,181,245, 55,148,102,100, 85,109, 5, 37, 85, 57,115,143, 49,244, 29,241, 21,165,237,165, 0, 90,233, 2,200, + 31, 4, 48,174, 83,121,163,134,209, 2,106,109,168,179, 31,236,163, 18, 64, 47,124, 30, 18,204,146, 10, 44, 7,204, 52, 22,206, +133, 82, 15,188, 18, 61,150, 82,115, 42,156,223, 45,136, 13,244,113, 34,248,145,140, 89,104,179,135,153, 98, 22, 14, 0,102, 77, +147, 34,104, 78,140,172,211,234, 78,126,105,164,234,171,179, 47,188, 76, 53, 69, 0, 32, 24,195,169, 12, 16, 21, 10, 73,153, 35, +210,192, 67,150,168, 67, 47,233, 44,121, 37,139, 77, 30, 89,187,208,208,120, 78,208,151,129,178, 6,132,151, 5, 91,237,126, 4, +234, 89, 45, 95, 51, 62,139,146, 82, 41,156,210,196,158,190,230,160,168, 20,230,246, 52,115,109,176,152, 2,215, 20,221, 84,104, + 32, 50, 44,220,237,193, 92,177,202, 93, 72,166,116,229,180, 68,208,230,152,162,123,155,213,164,195,249,224,212, 93, 39,113,202, + 19,121,159,129, 18,146,193, 57,232, 73, 44,146,230, 51, 56, 45,246,123,142,116,147,192,121,145, 58, 24,203,228, 53,199,247, 47, + 82,207,133, 44,162, 50, 24,247,109,201, 13, 84, 38, 16, 77,150,224, 36, 0,100,133,112,133, 56,103,155,176,233,136,228, 26,249, + 36, 2, 83,146, 76,231,112,158, 91, 18,216,147,229,178,142, 52,178,233, 57, 87,165, 28, 77, 5,168, 97,242,142, 75,130,205, 35, +229, 49, 82,181,134, 50,195, 23,110,142,167,186,212, 72,168,140, 27,106, 71,236, 93,209, 44, 2,223, 18,241,136,198, 40, 77, 12, +155, 76,213, 54,167, 5,133, 40, 44,130,177, 58, 22,160, 73, 29,172, 54, 78,157,234,212, 58, 66, 1, 25,142, 8, 31,213,178,106, +177, 40,160,115,136, 89,124,182, 75, 37, 24,151,231,181,212, 60,126, 15, 53, 82,200,204, 77,177,135, 83,186, 91, 10,138,185,168, + 65, 73,155,149, 57,105, 21, 74, 63,213, 65, 50,150, 55, 42,234,204,180,210,198,216,171, 32, 40, 88,193,162,176, 57,180,160, 0, + 49, 86,161,212,158, 18,203, 20, 78,137,235,108,110, 69, 36, 47,102,236,133, 0, 37,140,233,119,129,141, 74,175,177,178,131,218, + 70,166, 2, 75, 19,245, 69, 93,220,149,198,188,214,104,142,113,201, 28,231, 6,205, 45, 6, 96, 45, 40, 96, 35, 78, 99,179, 53, +180, 20,216, 56,155, 44,131,165,186, 75,206, 72, 67, 29, 55,158,117, 71, 40,150, 5,116, 59,111, 11,106, 81,121, 77, 77, 73,170, + 55,219,145,182,187, 85,224, 8, 64, 93,173,112,219, 14,183,250,196, 17,160,184, 5, 29, 17,106,233,202,251, 95, 1,102, 54,212, + 54, 94,215,146,186,181,164,208, 55, 88, 48,130,106,133,224, 11, 16, 57,157,239,159, 69, 65, 60, 10, 47,136,137,144, 53, 25,145, +120,142,168,161,207, 73, 18, 25,196,208, 82,250, 98, 2,127,187,168,176, 49, 15, 40,132,167,114,230,201,173,105,116,121,171, 32, +219,106,134,213,166,117,181,198,104,177,199, 58,179, 37,185,122, 21,116, 29, 36,219, 93,137,192, 35,149,138, 21, 71,226,112, 83, +165,102, 46,200,100,196,101,204, 88,141, 53,117,231, 79, 35, 95, 24,170, 73,157,214, 78, 83, 93, 8,123, 51, 67,106,202,110,120, +109,248,214, 21, 80,167,236, 26,209,160,150,228, 77, 17,196,105,106,158, 94, 7,163, 60, 81, 85, 86,235, 62,145, 90,175,190,105, + 79,233,149,168,111,154, 46,116,161, 16, 9, 17,132,148,147, 25,209, 80,225, 18,232, 30, 38, 98,124, 67, 16,141,209,107, 41,160, +160, 68, 96, 0,176,110, 86, 97, 14, 23,231,206,178,131, 6, 59, 14, 4,183, 29,107, 97, 96, 58,158,156,133, 14,188,229, 5,179, + 59, 56, 29, 35, 55,120,170, 27, 87,104, 57,187,109,105,219,106, 70, 96,122,206, 75, 85, 63,171, 92, 61, 13, 78,218,187, 90,234, +244,174,174, 96, 10, 22, 80,186,253, 25, 45,164, 52,169,168,152,141,216,202,176,131,150,130,203,218,116, 70,162,136,252, 88, 23, +134, 71,160,144,147,101, 88,240,236,168,223, 0,171,141,233,240, 36,106, 19,104, 84,140, 90,204, 0,141, 96, 59,225,196, 89,157, +234,215,177,139,118,194, 64,167,162,164, 84,133,202,138,216,169, 9,219,146, 34, 35, 72,154, 94,156,222,247, 27, 0, 75, 12, 26, + 4, 65,163, 9, 93,126, 67,121, 59,109,207,158,174,160, 92,174, 33,221,213, 65,113, 0, 21, 36, 17,125, 29,144, 71, 71,219, 74, + 35,173, 90,114, 64, 71,186,112,240,191,163,186,158, 41, 63,214, 84, 73,236, 25, 98,235, 93, 50, 6, 6,123, 77,190,128, 66,113, +169, 12, 34, 59,156,129,180, 77,100,105, 6,181,195,134, 65,208, 12,138, 25, 49, 4,121,159,153,132,131,216, 55,200,237, 26,200, +115,195,154, 45,160,105, 70,230,108, 75, 18,173, 79,210,162, 45,190,138,178,114,219,176, 23,213, 20,161, 73, 82,129,116, 31,140, +115,154, 27,123, 40, 8, 2,104, 87, 20,221, 56,233,209, 51,116,108, 91,145,196,165, 70,145, 13, 91,109,227,117,165,134, 64, 25, +241, 43, 32,125, 61, 61,207,178, 18, 49,167, 78,139,107, 48, 12,173,138, 93,139,119,162,100,218,129, 27, 33, 77,247, 55, 14,137, +231,202,171, 29,234, 76,153,212, 28,188, 81, 31, 65, 2,239, 19, 74,161,209, 15,190, 64, 22,197,235,219, 82,147, 16, 87,176, 67, + 98, 82, 84,232,153,193,209, 2,199, 5,169, 3, 15, 34,107,202, 3, 72,159,195,246,220, 65, 15, 37,199,110, 5, 46, 10,101,139, + 85, 1,122, 10, 60, 93, 61,108, 5, 24,193, 32,247,215,180,206,100,104,114,128, 84, 1,247,170,135,109,191,174,158, 47, 72,140, +250, 99,243,226, 75,110, 49,135,173,249,218,206, 71,150,178, 43,133, 0, 48, 22, 92,239, 17, 0, 40,226, 66, 29,174,152, 71,209, + 77, 75,192, 75, 92,210,100, 68, 77,184, 98, 1,242,150, 73,193,142,178,166,180, 55,237, 40,145,154,234, 40, 64, 26, 2, 29,177, + 48,146, 35, 77, 89,219,181,118,170,133,189,148,224, 12, 51, 20, 61,151, 16,109, 21,229,210, 71, 95,108, 67,255,178,223, 39,214, + 73, 59, 78,220, 90, 93,200,100, 20,184, 40,152,213,200,207, 71, 84,190,115, 2,142, 21,239, 58,229,114,167,150,165,224, 64,163, +155, 1,232, 58, 78,212, 13,139, 26,150, 35, 61,167,122,171, 85, 82,164,126, 17,228,181, 6, 93,165, 67,157,229,196, 99,141,198, + 47,133,115,141, 41,199, 29,224,168,170,192,145, 95,179,131, 86, 74,146,243,100, 72,243,121,111,112,138,243,228,166,149,239, 10, +132, 7, 26, 76, 8, 68,227, 24,128,182,109,163,151,169, 37, 35, 37,161,144, 80,219, 42, 32,158,212, 53,145,107, 56,202,212,182, + 62, 6,241, 32,172, 56, 23, 94,128,207, 32, 62, 5, 6, 38,194, 36, 83, 90, 35,234, 42, 8,164, 28, 74, 49,213, 29, 71, 1,167, +145,217,116, 30,130,143,156,219, 45,247, 27,105,101, 55,102,197,219,176, 98, 83, 15, 74,252,219,174,105,227, 57,105, 31,228,172, + 90,116, 1,172, 41,171,150, 1, 86,185,161,204, 82, 8, 12,171, 56,245,168, 85,195,172, 43,117,135,216, 11,176,219,152,245,214, + 0, 54,122,148,198, 82, 30, 28,128,113,133,163, 99, 26, 33,176, 75,146, 2, 26, 2,222,164,233, 48, 23,181,253, 44,106, 37, 77, +132, 45, 88, 71, 0,166, 70, 33, 94,225,110, 83,210, 46, 96,175,253, 11, 0,107, 19, 5, 18, 93, 6,206, 20,230,117,252,113,230, +213,212, 52,202,144, 99,253,158,241,251,219,213, 38,107,174,141, 32,211,139,101, 84,115,138,161,195, 37,182,109,157, 34,237, 58, + 81,219, 80, 59, 68,196,245, 75,120, 52,232,156,130, 80,107,175, 61, 5,252, 81, 38, 99, 40,221, 90,149,176,166,242, 4,130, 68, + 97, 79,151,220,213,180, 90,137, 76,163,111,111,182, 84,194, 17, 39,136,246, 13,100, 55, 1,134, 75, 60,232, 72,235,173,182,236, + 75,209, 21,103,121, 67, 19,171,111,189,194, 86, 33, 75, 0, 13,203, 18, 34, 41,132,244, 45,148,167, 53,144, 12, 71, 83, 5, 1, +238, 98,210, 46,112,142,189,170, 51, 25, 42, 89,235,158, 21,178, 41,168, 96, 23, 37, 90, 9,234, 0,148, 24,194,176, 75,122,127, +103, 53,238, 46, 64, 54,219,154, 70, 91,234,166, 84, 56,183,105, 45, 46,104,194, 9, 73, 27,233,221, 50,165,226, 71, 35, 40,208, +191, 36, 54,156,142, 10,200, 81, 22, 5, 21, 9,229,224,112, 50,122, 11, 7,175,161, 36,171, 0,223, 90, 38,225, 23, 70,196, 62, +110,102, 83, 19, 8,108,248, 99,226, 48,117,168,153,143,159, 45,227,217, 14,148,183, 33, 69, 95,192,216,111,148,206,107,130, 11, +192, 14, 44,149,159, 59, 69, 38, 77,177, 66,176,247, 60, 1, 90, 89, 82,127,242, 21,128,141, 88,121, 1,168,111, 94,191,139,187, +222,149,232, 7,110,247,177,122,235, 94, 44, 69, 69,218, 20, 83,114,130,120, 16,147, 57, 6, 16, 16, 81,150,102, 21, 44,198,154, +163, 81,161, 11,154,132,252,139,115, 87,205,105,146, 80, 36,115,168,119,202,132, 22,175,241,135,224, 76, 72, 84,146, 43, 1, 70, + 25,131,185, 64,195, 38,153,116, 34, 8,149,245,138,235, 71, 48,120,122,131,163,199, 93,201,181, 97,167,193, 41,201,149,179, 96, + 72,234,165, 94, 84, 76, 10,234,218,210, 8,162, 72,211,173, 78, 82,203, 92,108, 56, 69,222, 64,195,143,207, 17, 1, 23,108,254, + 36,172,206, 61,123, 38,178,211,245, 82,177, 67, 26, 1, 88,182,230,174,104,174, 39, 95, 27, 7, 18,178,187, 85,123,196,123, 94, + 70, 80, 78, 59, 59, 47,150,235, 88, 32, 88,143,215,115,219,169,101,180, 36,114, 52, 26, 53, 94,163, 19, 31,153,212, 2,233,125, + 44, 1, 54,190,177, 58,107,156,244, 61,180, 90, 0,221,228,115, 54, 1, 21,219, 82,139,224, 70, 85, 49, 3,165, 27, 72,159, 81, + 52, 87,154,200,163,231,203, 10,236, 19,200, 12, 71, 6,145, 80,119, 61,112,175,233,217,134,200,211, 16,177, 75,194, 50, 68,177, +136,147,131, 35,137,201, 64,161,227,143, 14, 31, 6, 71, 41, 18,151, 36,144, 70, 32,154,196, 64,212, 23,160,227, 76,148, 73,141, +254, 7, 27, 86,141,146,104,229,183,169,173, 43,186, 85, 35,197, 81,109,231,162, 32, 9,135,195,195,192, 39, 16, 31,204,169,111, +110,184,144, 32, 43,146,196, 50,132,178, 38,187, 3,191,124,130, 77, 2, 18, 46, 54,162, 27,239,178, 74,244, 92, 87,157,237, 9, + 4, 36, 41, 59,107, 41, 97, 79, 19, 23,137,118,145,147, 92,152,162, 15, 81,238, 48, 80,225,134, 52,239, 40,119,112, 43,140, 28, +226, 80, 19,234,138,214,214, 5, 59,152,178, 82, 78, 76,183, 55,106,137, 21,120,215, 76, 33,215, 89,200,142, 53,137,174, 88,204, + 33,181, 56,219,192,238,255,190,182,198,165, 72,216, 13,142,122, 82, 89, 83, 39, 67,240,147,219,135, 18,134, 29,145,230, 5,116, + 6,204, 73, 40,192, 53, 71,192,163, 40,180,112,164,131, 0,162, 56, 52,225,139,235,181,119,133, 1, 15, 17,247,166,131,180,108, +150, 60,129, 30,223, 0,244, 51,175,118, 41,153, 6, 24, 70,161,246,142,132, 34,210,181,116,128,141, 19, 92,164,199,203, 76, 19, +215,119, 91, 40, 37, 27, 13, 80, 40, 0,236,100,104, 41,199,168, 87,192,226, 70, 71, 32,237, 9, 97, 95,234,164,230,115,181,184, + 10,134, 58, 76, 93,136,214, 80, 3, 92,149,134, 59, 75, 32, 1,140, 10, 88,133,155,104, 21,120,119,230, 60, 20,201,209, 68,153, +114, 22,195, 90, 91,202,210,157,144,132,113, 80,214, 31, 3, 12, 94,156,190, 97,199, 5, 96,106,106, 23, 13, 44,148, 0,124,167, +242, 74, 11,180, 67,234,101,146,238, 68,204, 2, 5,144,169, 16,116, 16,162,192, 5, 24, 67,195, 82,254, 94, 15, 69,122,149, 59, +244,209,162,213,165,141,189, 67, 86, 24, 4, 84,182, 64,116, 17, 70,184,149,114, 31,137,209, 89, 7, 46,126,112,102, 97, 91,230, +117, 88,237, 48, 2,222,237, 26,105,194, 14, 76,139,230, 84,137,210,139,209, 50,164,216,145,134,197, 73, 98,139,146, 82,155,117, + 83, 19, 72, 95,175,164,217, 81,158, 90,208,108, 4,119,157,192, 33, 8,231,165,172, 66,201, 32, 75,139, 59,188, 0, 93,172,131, + 72,123, 98,143,101,167, 59, 26,125,114,104,177,251, 53,130,214,131,228,136, 95,224,134,174, 0,172, 11, 71, 19, 29,202, 45,161, + 9,187,176,249,253,196, 8, 20,179,134,184, 61, 76,185,114,203,216, 44,177, 53, 46, 89,183,183, 58,189, 44, 83,103, 64, 60,182, +190,236,188, 82,176,160,209, 14, 21, 1,160, 26,231,186, 78,225, 85, 90, 7,197, 68,202,160, 14, 73, 30,165, 25,230, 2,147,117, + 81, 90, 46, 47, 68, 93, 69, 82,182,106,124, 71,215, 41,103, 30, 34, 32,137,227, 38,110,165,214,130, 67,176, 67, 32,178,175, 14, +108, 50, 3,110,189,176,215,128,169, 33, 37, 11, 32, 41, 75, 88, 21,168, 37,121,255, 92,136,168,129,135,111,147, 96, 97,218,250, + 26, 98, 20, 4, 22,234, 57,110, 37,106, 15,143, 2, 46, 89,194, 16, 1, 78,210,226, 84,166, 5, 4, 29,187, 56,129, 42, 98, 51, +232, 10,100, 62,192,155, 53,157,121,144, 12, 25, 15,186,237, 28, 90, 6,100,235, 36,227, 26, 40,170,170,188,240, 2,252,108,144, + 75, 21,113, 42,157,101, 14,196, 35, 91, 73,148,168, 2,189,202,173,134,187,212, 55,116,154,238,180,186,118, 53, 9, 77, 49,193, +156, 2, 66, 29, 50,129,177,212, 97, 18, 77,103, 21,137, 29,160,170, 84,108, 81,145,203,220,255, 15,234,231,222, 94,149, 82,183, +168, 80,186, 2,101, 65,106, 53,141,154, 14, 79, 2,169,213,110, 93,195, 36, 1,145, 18, 74,242,170,104,224, 81,187, 63,201,176, +242, 42,235, 65,210,102, 4, 70,210, 56,254,134,203,240,106,204, 18,196, 71, 4,132,120, 36,156, 20, 41, 38,152, 63,221,109,228, +187, 67, 36,110,108, 21,239,198, 88,206,192,137,198,222, 16, 48, 65,167, 84,181,228,180,161, 68, 86,174,242, 36, 38, 99, 6, 27, +169, 66,172,153, 62,161,232,106,215,162,162,221,217,129,156,118,133,212,172, 52,234,105,222, 16, 6,203,149,188, 42,104,229, 77, +150,160,127, 66,139, 11, 88,169,170, 74,195,143,163,117,247,138,154,110,115,208,192,138,161, 11, 94,227,222,163,166, 71,166,177, + 67,185, 76, 90,144, 32,175, 70,206,222,181,142,179,122, 27, 24, 57,105,168,157, 9,163,208, 84,236,165,161, 55,147,112,171, 16, + 0, 12, 10,166, 4,185,178,103, 47,145, 85,242,158, 5, 80, 90,100,130,246,185,148,211,214,152,253,144,198,185, 17, 8,112,124, + 95, 40,185,239, 68,248,147,109, 96,178,166,153,151,126,113,213,108,238, 8,108, 27,152, 69, 53, 38, 64, 53, 42, 47, 69, 83,180, + 49, 89, 81,170, 73, 97, 65, 43,243, 92,127,183,204,222, 66, 0, 25,200,112, 97,169, 15, 56,120,101, 72,127, 49,133,161,120,160, + 42,155, 89,154,102,247,176, 72, 11,151, 38,146,228,240,242,176, 85, 34, 27, 34, 91, 1, 78, 85,141,172, 69, 73,237,108, 47, 74, +148, 2, 62, 96,226, 75,106,135, 27, 7, 50,112,163, 10, 87, 0,121, 88,176, 71,111, 68, 62, 5, 59,139, 81,164, 6,197,165,252, +196,121,216,211,241,187,212,122, 80,156, 75, 77,185,169,136,132,188,172,101, 47,140,143,110, 9,224,226,148, 44, 78, 42,221, 12, + 97,142, 69,178, 40,241, 57,214, 17,171, 52,237,101, 21,108,228, 29,205, 34, 27,129,205, 75,188, 78,195, 83, 63,230,224,210,150, +212, 6,215, 42,170, 92,197,107,222, 14, 82, 19,173,227,235, 61,233,188,129, 5,234,242, 7,199,178,170,198,190,101,110,172, 79, +240,112,239,182,128,170,100, 17,192,112,126,219, 38,162, 83,171,179, 46, 12, 57, 63, 70,246,154, 26, 54,240, 98,167,200,252,225, +248,131,194, 92,199, 89,239,156, 28,217, 30,101, 13,246, 58, 51,132,152, 92,178, 50, 84,106,231, 40, 77,202, 49,218,118,138, 75, + 54,150,201,176, 91,126,147,201,187,134, 57,111,190, 73,189,122, 83, 18,130,182,161,194,216, 76, 44,211,133,188,156, 17,125,140, +139,172,107,110,161,153,158, 49, 26,152, 80,255,134,158, 52,117, 58,130,250, 53,131, 70, 56, 11,226, 16,194,185,148, 34,161,177, +190, 86, 81,140,147, 24,147, 36, 30,116, 68,200,149,114, 15,135,160, 67,132,152, 14, 27,173, 19,129,220, 66, 43, 14, 73,106,138, +195, 33, 60, 19, 25, 94,214, 14,110,154,206, 68, 3,175,215,145,244, 17, 44,170, 47,146, 3, 22,148, 22,110,155,251,172, 68,229, +133,172, 61,115, 74,185,147,172,148,146, 37,129,207, 74,162, 23, 26,221, 45, 99, 20, 40, 1, 61,169, 97,107,144,164,164, 18,148, +252, 48,224,105,120,234,112, 94, 35, 65,149,173,177, 81,241, 50,172,173,243,109,194, 52,120,195,142,192, 70,245,168, 14,152,100, +166, 65,255,128, 25,212,240, 0,128,206,197, 5,125, 4,234,244,222,103, 4,105,158,201, 65,192,206,146,153,255, 79, 77, 95, 47, +203, 58, 90, 38,185,115, 10, 25, 8,135,149, 16,143, 50,163, 91, 9,208,117, 50,149,104,135,210,214, 64,229,221,238, 15,184, 93, + 35,160, 30,245, 49, 40,120,239,185, 61,108,151, 16,241, 5, 0,204, 5,104,169, 35, 93,185, 86,160, 47,180, 93,212, 96, 50,162, +215,105, 29,207,108,179, 40,156, 25, 17,158,250,195,118,170,165, 75,117,208,176,143, 28,136, 3, 22, 80,151,155,156,134,125,101, + 50,129, 82, 48,189,132, 90,221,128,190,205,218,109, 94,227, 52, 69,178,210, 68,226,130, 84,184,149, 8, 55, 54,199, 36, 9,153, + 80,198,160, 44,199,185,145,135, 80,116, 84, 74,158,219, 96,156, 70,222,187,138,236,152,124, 46,163, 80, 72, 86,201, 66,193,203, +138, 81, 58,228, 47,177,189,102, 18, 84, 78, 84,166, 22,104, 40,208,197, 45,138, 42,158,236,146, 73, 5,206, 48, 10, 81, 47,171, + 46,158,129, 90, 89, 44, 18,114,149, 46, 11,107, 15,173,134,160,206,106, 7,137,104,136, 0,177,133,101,105, 48,166, 89,140,162, + 50,236,168,212,165, 57, 63, 10,134, 43, 50,181, 18, 93, 40, 45,206,232,242, 67, 20, 63,124,182, 27,192,102, 92, 29, 80,212,129, + 72,140,213, 98,139, 16,244, 60,199,188, 25, 37,190, 41,185,177, 43,174, 24, 17,189, 9, 36,117, 41, 52,158,209,164,233, 0, 27, +153,149, 2,180,179, 87,110,252, 66,160, 57,221,110,200,209,236,198, 5,144, 76,170, 25,153, 24, 40,228,212, 58,165, 13, 22, 76, + 18,181, 68,180, 44, 86, 27, 62, 76, 83,150,195,156, 98, 74, 73,194,159, 66,171, 88, 27,195,102, 72, 34,187, 68, 17, 23,168, 89, +193, 60, 23,108,177,211,212,152, 89,233, 73,134,198,158,230,175,149,120,194,104, 72, 34,172,139, 54, 42,194,158,238,213, 51,130, +210,128, 46,217,231, 73,202,136, 8,172,112,236,163,144,186,188, 97,228, 73,105,223, 49,131,220, 53,251, 47, 74,116, 83,206,161, +185, 67, 84, 82, 37, 67,168,161,224, 39, 42, 92,170, 12, 81, 99,188, 13,187,176,242, 38,128,144, 40,166,167, 43,185, 41,143, 69, +175,214,200,201,193, 94,172,117,235,170, 0,197,100,208, 41, 53, 93, 65,218,155,183, 95,133,108,163, 64,214,213,154,127,141,199, +173,161, 6,186, 68,251, 0,165,130,192,181,240, 90,245, 89, 33, 99, 18, 69,182,217, 21, 37, 57, 24, 32,157, 83,108, 11, 56,107, +185, 69, 44,246,159,119,230,151,106,125,140, 70, 87,166, 38, 45, 3, 11,104,208,200, 88, 40, 34,191, 74,150,146,141,214,215, 8, +160,147, 36,108,100,251, 42, 99,249,135,173,245,170, 68, 1,185,180, 20, 8,104,116, 82, 96,227, 27, 35,116, 0, 72,120, 11, 58, +142,222,232, 29,168, 99, 85,201,185,228,130,145, 50,219,201,169, 60,101, 18, 94,152,248,119,194,171,117, 19,148, 58, 36,240, 54, + 61, 21, 99,244, 77, 64,211,231,198,142,171,242, 80,184,248, 34,189, 25,160,157, 86,112,195,143,218,128,124, 24,168, 18,110,144, +109,114,170,146,154,101, 56,170,222,117, 75,235, 21,161, 68,143, 67,204,124,165, 44,234,211, 10, 78, 20,228,215, 66, 52,134,136, +217,146,168, 48,208,122,208,145,246,181, 97, 41, 96,159,117,213, 97,183, 90, 99, 67, 97,221,134,244, 17,118,180,196,108, 12, 39, + 84,182, 68,244,169, 27,106, 41,173,244, 51, 39,145,148, 37, 68, 23, 24, 17, 59,154,187, 80, 52, 48, 33,107,244,177, 28,189,227, +197,120,126, 1, 24, 66,137,228,162,253,143,151,112,206,214,226,144,145,235,203,145,159, 96, 45, 63, 88,166, 72, 68, 1,132,144, +183, 21,108, 29,172,226, 35, 38,149,199,152,130,110,250,131, 71, 36, 28,124,113, 19,219,242,251, 38, 13, 41, 6,154,149, 76,209, +141,180,157, 10,154,206,154,146,211, 37,158, 62,175, 80,179,148,212,246, 20, 51,196, 34, 88,229,166, 53,180, 0,147, 61,228, 44, + 78,226,248, 29,241, 86,197, 29, 2, 87, 27,112,149,107, 15,152,228,174, 62,191,237, 17,160,105,156,224, 10, 37, 29,101,148,100, + 72,178,207, 91, 7, 47, 37,252,193, 52, 7, 10,236, 39, 72,113,244, 44, 14,175, 70, 62,133, 51,226, 97,154, 87,225,200,181,185, +244, 54,165,142, 93, 20, 49, 53,141, 53,105,143, 44,181,156, 81, 97,253, 84,125, 95,215,214,136, 97, 83,240,189,169,172,225,245, + 11,229, 61,146, 99,109, 88,175, 6,111,127,140, 11, 92, 23,254, 66, 27, 33, 85,111, 80, 67, 9,161, 77, 10, 36, 12, 5, 69, 2, +189,137, 36,225,229, 1, 24, 19, 58,245,129,104,168,170,235, 32, 73,167, 80,188,179, 36, 37,165,144, 0,167,226,117, 10,175, 35, +215, 21,111,225,141, 77,154,202,136,163, 42,222,239,129, 27,213,194,144, 14, 6, 38, 24,208,209,150, 32, 49,222,141, 74,149, 76, +203, 82, 53, 27,105, 76, 11, 89,209,127, 33, 23, 20, 19, 84, 99, 75, 83,169, 74, 9, 92, 8,143,201,251,161,209,208, 34,131,162, + 32,109,195,202,229, 29, 82, 81,157,170,238, 84,220,104, 42, 41, 49, 72,193, 80,197,250,155,175,130,120, 80, 18,181, 0, 2, 61, +128, 10,170,179,219, 84,130,112,147,118, 58, 0, 10,229, 52,185, 73,228,209,215,210, 70,188,180,162,184,148,116,132,120, 53,114, + 41,156, 29,136, 20, 39,224, 66,212,141, 98,105,116, 10,201,177,137, 80,147, 2, 34,123,175,164,126,206, 85,166,122,139, 71,163, + 32, 96, 96,155, 92, 5, 84, 42, 55, 81,142,178,181,167, 58, 52, 80,150,108,230, 49,120,229,227,171, 50,232, 18, 67, 37,148,163, +249, 68,162, 23,130, 64,137, 35, 99,189, 22,142,106, 88,146, 54, 60,214, 20, 83, 65, 93,117,160, 24, 26, 96,145,152,128, 91, 46, + 9,164, 71,208, 62,212, 13, 23,182,216,177,250, 48,229,254,235, 5,242,104,213,211,235,226, 14,139,121, 8,131, 55,189,173, 95, +214,113,208,231,208,185, 73, 14, 91, 5, 81,149,193,184, 88,234, 28, 29, 63, 44, 2, 50, 34,109, 41, 96,214, 94,231,229,169,149, +109,234,164,144,149,174, 28,224,131,156, 97,219,238,107,220, 27, 97, 80,192, 66, 99, 92,114,196,200,148,213, 57,189, 93,103, 44, + 84,172,217, 0, 71,184, 41,129,101,130, 83,220, 41,108, 70,211, 10, 87,181,198, 4, 84, 4, 75, 20, 22,167,141,113,185,212,249, + 87,180,135, 0,108,154, 20,125, 17, 10, 40,216, 85,215,238, 14, 26,145,203, 42, 67,230,111,201,128, 29,226,117,173,155,165,117, +213, 19,160, 44, 90,118, 54,148, 45, 43, 53, 2,115, 70, 24, 58,209,129,119,212,246, 8, 79,165,115,106,154,133,168, 1, 45, 18, + 45, 68,195,105,151, 4,218,194,236, 9,234, 58, 24,142,130,104, 21,233, 95, 52,122, 68,224, 43,182,134,118, 0, 58, 69,203, 98, +111,163, 48, 68,177, 35, 47,191,122, 89,104, 4,184, 57,101,169,120,166,143,147,176, 87,236, 17, 33,218, 67, 46, 77,205,200, 46, + 41, 83, 38,110,132,117,118,216,147, 92,220, 9,199, 8,127,156, 55, 29, 37, 69,212,164, 61, 65,148,186, 28, 22,237,217,144,130, + 68,205,115, 23, 47, 89,180, 51, 67,188,191, 67,203,162, 42, 82, 97,253, 78, 13,164,198,185,219, 5,106, 31, 57, 40,169, 73,146, +119, 86,132,210, 5,226, 65, 24,232,150, 26, 64, 47,186, 2,194, 25, 20,139,136,139, 64,255, 98,237, 52,197, 5,184,211, 97, 96, +205, 51,140, 94,178, 19, 40,206, 38,111,117,106, 24, 2,202,184, 65, 53,115,162, 0, 36,145,143,246,125, 0,162,226, 84,111,226, +148,121, 46,205,182, 24,218,246, 17,113,181,248, 1,163,122,181,101,136, 2, 94, 67,244,152,143,201,100,237, 16, 37,121,150,226, +221,118, 4, 55,228, 20, 89,163, 70, 48, 78, 19, 0, 79, 9, 59,141, 2,181, 48,132, 18,134,112,181,226,133, 58,220,166, 2,199, +156, 54, 46,236, 33, 77,192,199, 22,144, 37,180, 58,173,233,112, 11, 8,112,148,142, 50, 32, 18,121,174,232, 21,115,212, 97, 75, +163,169, 76, 77, 84, 47, 34,233,126, 13,235,107, 9,233, 49,230, 96, 46,160,132, 38, 67,234,205,235,105,133, 83,201,198, 88, 50, + 75,158,122, 86, 23,237,238, 53,234, 29, 44,227,185,142,148, 46, 47, 82,215,116, 79,185,113,126,173,241, 74,245,217, 86, 83, 79, + 4, 2,230,132, 52,132, 70,169, 32,100,227,120, 16, 5,232, 16,128,228, 18,178, 17,107,141,168,135, 43, 1, 91,230,108,138,204, +241, 2, 74,119,142,152,198,103,169,122,249,194,169,116,230,232,208, 42,169,121, 3,227,198,131,224,168,108,233,193, 64,178, 43, +172,113, 35, 64, 22,192,138,112, 30,173, 3, 32, 42,173,153,225, 48,124,202,254,141, 41,210, 49,202, 15, 74,176, 82, 35,195,106, + 27,118,213,118,152,203, 26,130, 38, 53,213, 34,114, 52,100,221,178, 86,145,239,177,103,150,149, 22,160, 77,166,201, 5,122, 50, +187,168, 45, 35,226,130,182,205,125, 52, 38, 9,231,204,170, 4, 24,229,139,138,117,102,166, 12, 88,213, 70, 70,165, 4,200,202, +230,118,105, 4,123,176,159,188,172,201, 68, 20, 9,204, 12,129, 70,197, 88,122, 74, 82,175,176,135, 33, 21, 0,155,147,112,133, + 78,124, 89,140,135, 41, 99,155,186,146,131,178,101,229, 92, 87, 39, 75,113,103,144, 43,182,218,197,242,104, 41, 37, 57,170, 37, +250,242,129,126,189,140,148,101,223,247,167,102, 32,163,193, 95,234, 70,104, 17,121,193, 78,134,172,245,113,207, 14,117, 20,205, + 94, 38,167,114,185, 12,149, 65,187,103,214, 14,192,203, 72,222,213,177, 11,118, 23,166,186,160, 49, 89,144,241, 6, 54, 85,225, +116,163,163,175,110,238,148,196, 70, 11,131,154, 92, 65, 35,161, 48,251, 2, 37, 70,102,168,217,214, 16, 55,119,195, 81, 35, 61, +136,208,139, 17, 78, 14,177, 35, 83, 6, 27, 21,208,123, 94, 74, 54,216,184,139, 8,182,171,163,200,181, 57, 48,146,179,120, 2, +166,107,144, 7,159, 50,103, 73,180, 38,228, 29,107, 13, 47,156,188,127,185,237,193,210,176, 20, 93,214, 96,154, 24, 6, 16, 67, + 58, 18, 56, 13,174, 91,158, 8, 31, 33,167,152, 67,174, 44, 83,153, 35, 15,208,146,135, 90, 89,129, 13,222, 22,121, 69,112, 16, +227, 70,219, 63,227, 5,173,185,158, 12, 84,113,199, 12, 20,132, 70,158, 58, 25,232, 78, 18, 32,200, 84,161, 10, 33,111, 94,114, +205,197, 1,117,214, 78, 86,235,165, 28, 45, 77, 69,213, 4,171, 69, 38, 53,250,193, 99,107,225,232, 79, 61,101, 99,120, 57,116, +135, 83, 97,148, 33,128,238,138, 58, 17,120,255,216,209,233,169, 49, 37, 40,224, 69,239, 0, 40,242, 36, 71, 80,144,139,229,187, + 10, 83,164,203, 17, 56,196,141,163,215,182, 29, 97,170, 73,130, 35,187,134, 32,112,161,105,251,226, 81, 56,136, 71,217,230,169, + 58,252,102,195, 75, 18,139, 2,186, 43,148,109, 24,248,228,196,180,166, 45, 10, 3, 85, 41,131, 81, 42,228, 89, 36,160, 23, 19, + 93,185, 68, 54,102,148, 45, 94, 20,213,125,200,192,193,137,245, 82, 21,241, 62,213, 47,151, 74, 5,170, 80,111, 26,190,125, 0, + 69,110,214,234,142,167, 55, 30, 2,213, 67, 95,123, 43, 13,150,101,165,223,124,234,216,215,168,222, 36, 46, 54,231, 29, 78, 56, +244, 57, 88, 36,255,190, 97, 87,120,205, 25,105,149,144,161, 28,139, 5,106, 80,153, 29,192, 49,237,197,222,200, 40,128,123,157, + 81, 15, 57, 82,229,145,201,228,196, 77, 98,192,249,176,107,207,214,152,147, 34, 43,115,125,152, 51, 75,221, 91, 58, 77,246,212, + 18,167,236,107, 10, 90, 27, 27, 93,178, 48,238, 25, 48,239, 42, 37,163, 63,238,149,218,164, 71, 85,161, 85,228,165,193,109, 17, +121,127, 0,107, 72,229,108, 22, 93, 7, 83,214,163, 78,118, 68,215,220, 66, 83,237, 21, 12,168,253,181,106, 0, 55, 4, 51, 3, + 13,181, 72,211, 95, 30, 30, 81, 85,103,127,188,107,202,115, 28,230,245, 88, 79,231, 46,130,205, 10,125, 0,148,110, 60, 49,177, +181,116, 61,178,120,164,225,230,228, 12,173,181,182, 46,163,254,129, 26,200, 14,100,239,152,104,133,182,193,160, 84, 22,117,111, +114,170, 90, 55, 78, 24,149, 50, 77, 53, 85, 85, 76, 43, 17,197,186,132,104,201,219,148, 72, 76,228, 22, 88, 67, 16,169,213,149, +205,222,196,108, 98,211, 48,142,165,213, 32,145, 42, 33, 13,219, 30, 15,151, 5,115,128,214,194,171,189,182, 5,234, 38,129,156, +172,121,251, 5,128,148,241,167, 25,132, 54,180,191,105,162,184, 49,150, 36,214,176, 86,219,127, 5, 72, 13, 41,120,147,129,137, + 46,118, 41, 16,138,150,180, 21,138,236, 18,116, 42, 65,165,173, 42, 32,232, 18,123,191,161, 61,173,171,145, 33,134, 49,189, 90, + 65, 59,194, 28, 5, 95,184, 46,107, 30, 98, 40, 67, 69,187, 72,167,221,230,196,209,183, 8,216,196, 20, 21, 51, 62, 39,118, 81, + 18, 97, 9, 74,202, 64, 88, 51,244,123,210,130,153, 34,244, 14,250,164,103, 48,216,106,212,137, 34, 72,176, 83, 69,175,101,138, +214,142,147, 94, 2, 62,171, 2,108, 5,101, 90,128,120,144,139, 75,164, 85,193, 9, 28,151,219, 57, 66,166,137, 33,107,197, 4, +242,169,161,207, 0,162,224,169, 44, 80,106,200,105, 98,153,170, 32,160, 78, 90,158,116, 73, 40,229,172,244, 22,202,114, 81, 75, +151,164,108, 55,214,188, 93, 59,130, 51, 95, 75,132, 80,115,199, 33,148, 40,245, 11,153, 11, 1, 71, 61, 48, 41,253,198, 60,164, +102, 75,180,148, 29,230,145,211,106, 17, 97, 46, 77,247, 57,145, 52,199, 16, 12,192,137,248, 72, 73,108,136, 65, 57,134,161, 73, + 7, 55,170,110,204,141,219, 35,146,250,103,184,150,126, 67,213, 21,161, 21,131, 59,174,193, 18,234, 32,140,105, 99, 47, 65,169, + 51,202, 40,141,154, 53,228, 3,224, 39, 33, 11,174,247,162, 67,134, 7,124,206,155,120, 49,167,242, 84,231,242,246,210, 0,156, +115, 9, 1,187,216, 37,249,100, 83,115,147,136, 90,189,206, 93,226,250,151, 12, 82,186,146,177, 14,198, 43, 95,104,118,121, 48, +248, 93, 97,232,190,166,105, 70,197, 39, 24,216,113, 97,237,153, 53, 91,103,142,163, 55, 86, 2, 59, 54,176, 62, 58, 46, 80,187, + 0, 92,138,144, 11,200,176,102, 6, 44,154, 46,188, 84, 76,199,164,102, 71, 42,252, 38,203, 26,241,182,237,201,181,132, 50,105, +195, 68,171, 86,190,131,210, 82,153,106,234,156,228, 77, 9,210, 33, 70,201,240, 72, 24, 38,181, 61,129, 78,117,200, 23,218,188, + 3, 65,163, 94,191,164, 72,205,135,186, 85,238,105,158,106,226,196, 77, 59,212, 80, 58,106,133, 85, 4,218, 10,177, 34, 93, 3, +113,205, 99,154, 53, 35,222, 27,242, 55, 46, 16,247, 74,145, 95,204,141, 32, 66, 24, 4,239, 48, 71,216,221, 10, 10, 78, 65, 0, +181,130,185,247,117,102,206,230,153, 57, 35,217, 77,201,205, 5, 34,156, 23, 9,168,106, 84,219,146,144,111,172,176, 97, 84, 9, +198, 2,166,235,163, 6,134,216, 98,114,222,246,164, 67, 80, 67,223,220, 64, 42, 53,234,238,152, 83,102,165,120,121,106, 21,232, + 39, 76,156,106,226, 25, 65, 29,124, 88,116, 72, 82,212, 2,217,101,166,232, 33,205,144, 65, 96,124, 14,170, 96,199,168, 88,200, + 97,108, 13, 40, 55, 81,219,162, 1, 78, 41,141,162,149,202,139, 57,154,181,132,102, 52,187,241, 9,206,174,155,116, 7, 56,160, +180, 71,160,186, 27,112,124, 42, 67, 49,104,171,155, 69,205,221,168, 10,208, 74, 57,177, 50, 86,116,182, 89,160, 59,156, 58,197, + 5,149, 27, 21,211,128, 89, 54,160, 85,178, 4, 88, 52,116,197, 41, 49, 5,176, 53,104,206,104, 49, 62,224,204, 25,110,106,207, +210,220,148, 17, 45,172, 88,141,109,125,134, 93,177,150,147,209,157,205,107,147,112,196, 17,161,172, 81, 28, 1,104,107, 82, 16, + 43, 74,207,148,136,158, 16,167,161, 80,118,164, 91,186,210, 37,229, 14,115,180,210,137,143,179,229, 2,167, 92,176,222,106,160, + 45,239,163, 32,169, 41,202, 74,205, 94, 34,173,202,107,196,100, 24,106,228, 98,152,149, 66, 40,216, 1,221, 14,121,133,213,148, +192,180, 72,237, 3,133, 77,110, 13, 50, 53,218,238,164, 20, 64,204, 86,105, 84,193,169,117,111,131,127,130, 18,154,239, 81, 85, +159, 15,212, 57, 22, 5, 36,197,245,199, 75, 0, 64, 58,192,184,145,104, 34,154,122, 26,120,137, 65, 49, 27,197, 51, 69, 19, 68, +121, 95,183, 1,248, 37,214,227, 87,159, 39, 78,241, 52,135,176, 68,249,215,203, 60,154,117, 93,106,219, 21,103, 16, 85,176, 25, +218, 80, 75, 0,132, 92,120, 67,131,157, 58,254, 94,170, 50, 78,198,140, 35,141, 89,209, 82,235, 74,194,114, 50, 43, 83,144, 80, + 22,170,231,160, 17,212,226, 96,183,152,186,105, 1,197, 98,179, 63,218,233, 90, 93, 72,222, 14,178, 1, 40,120, 51, 22, 11, 16, +114, 49, 35, 35,156,211,190, 2, 70,145, 81,161,204,249,238, 37, 23,138,147,209, 99, 7,152,213, 6,174,190,148,220,246,142, 90, + 46,106, 80,115, 99,115, 84,186, 4,118,146,194,174,108,188, 2,224,149, 84,203,146,198,171, 70, 61,234,180, 72,210, 20, 14,218, + 30,183,210, 89,168, 0,149, 56,172, 21,228, 92,155, 58, 30, 99, 95,105, 10,220,130, 68, 63, 97,147, 83,228, 6,216,212,110, 48, +201, 9, 0,165, 33,119,196, 76, 68, 72, 35,129,165,166,159,178, 67, 22, 78,152,221,255,226, 13, 88, 98,110,121,100,160, 26,247, +168, 50, 71, 96, 28,185, 81, 22, 99, 88,188,130, 17,131,221, 17,163,134,129, 28,108, 74,237,214, 80,160,116, 54,135, 53,240,209, +202,208,232, 4, 44, 57,228, 88, 11,234, 53,104, 90, 28,109,178, 44, 19, 80,141,128, 82,200,145,183,116, 67, 88, 41,107, 35, 52, + 25,217, 85,154, 19, 5, 56, 52, 53,230, 88, 41, 9, 4,210,157, 53,242,104,121, 59, 65,183,137,210,134, 71,230, 77, 84, 87,152, +252,254, 24, 74,122,188, 29, 2,152,149,101, 68,237, 77, 46, 28, 34, 69,110,174,137, 83, 74,217, 30,188,224, 42,215,125,161,235, +247, 36,225,166,111,132,253,179,227,105,147, 29,240, 29,166, 57,111, 25, 50,208, 87, 23, 46, 0, 96, 2, 71, 84, 51, 4,227,251, + 59, 74,157,229, 28,124,212,137, 99, 72,242, 26, 33,119,106, 81, 70,181,234,190, 80,185, 6,198, 2,247, 18, 23,208, 18,239,201, + 64,112, 63,133,146, 60,188,239,145,200, 71, 55,160, 27,178,148,220, 65, 43, 33,216, 20,125,198, 37,233, 40, 8,100, 29, 13, 95, +147,226, 63, 33,106, 92, 80,226, 70,227,131, 17,135, 46,200,212, 0,161, 44,211,247, 48, 60, 11,118,238,203, 44,219,132,239, 41, + 96, 52, 69, 64,134,185,138,103, 73, 93,179, 31, 16,237, 2, 96,234,208,165, 23, 23,163, 50,199,199, 76,185,173,255,209,160, 43, + 87,221,218, 63, 91, 54,199,198,130, 23, 84,155,174,125,100, 98, 88, 0, 90,174,214, 4,107, 64,159,215,105, 30, 14,248,148,225, +191,141,174, 3, 1,180,162, 1, 76,231,115,170,170,122, 25,171,110,133,116,147,113, 47, 32,238, 53,234,191,155, 44,108,225,160, +175,154,220,186, 6, 38,131, 35, 50,246, 83,231,241, 31,228, 66, 35,214,237,102,172,109, 22,214, 54,156, 52,166, 49, 22,140,117, +106,114,125,113,171,157, 99,234,142,215,116,222,169, 18,169,238, 66,232,177, 0,109,133,179,225, 65, 5,187,210,248,249,227,185, + 67,123, 88,105, 27, 23,160, 58,156, 79,126,242, 5,133,114,149, 45, 63, 52,137, 36,184,106, 23,121,247, 47,110,144,196,169,219, + 83, 42,163, 97,157, 20,144,146,212, 26,118,224,239,179, 62, 96, 75,227,144, 1,145, 25, 91,208, 55,140,120, 74,169,216,208,124, + 15, 0, 19,243, 42, 25,143,144, 79,107, 17,145,115,158, 65,192, 71,176, 73, 71,120,247,216,211,219,240, 14, 33,143,153,121,189, +222,203, 92,123,175, 35,253,174,170,188,110,161,104,104,227,140, 3,134,214,140, 9, 85,205,201,128, 9, 84,252, 12, 16,103,155, +249,232,132, 26, 47,223,210,214,195, 53, 45,131, 34,132,202, 88, 67,141,189, 26, 85,141,141,105, 32, 78, 49, 73,165, 17, 22,200, + 14,129, 51, 34, 2,101, 27,110,161, 15,110,240,130, 81, 22,104,137,146, 54,118,204,200, 0,143,219,192,111, 5, 53,223, 45, 2, +138,198, 24, 12, 29,171,226,120,144,161, 50, 60,135,176,175,145,209, 1, 16,142,178, 14,168,162,141,249,213,117,142,168, 81, 5, +155, 78,115,212,118, 85,173, 2,243, 7,157,213,144,193, 19, 53,220,196,185,191,180, 85, 16,198,231, 81, 76, 11, 72, 70, 35, 46, + 78,105,139, 66,108,139, 98,151,164,117, 95,189,174,234,211,216, 13, 36, 52, 49,129,246,179,162,160,225,165,119, 93,139,122, 40, +163,146,139,139,201, 96,102,179,128,210, 90, 86,134, 99,213,199,119,189,127,115, 80, 85, 36,163,104, 10, 74,160,230,222,118, 63, +115,233,235,134,254, 20,101,120,134, 12, 35, 72,142, 26,155, 9,186,242,149, 38,219, 96, 14, 65, 1, 38, 77,197,138, 11,102,131, + 4, 75,121,144, 25,224,226, 45,171,151, 88,238,160,234, 29, 43,161,162, 26,189, 55, 42,121,198, 12, 81,224,225,172, 2, 45,151, + 3,212, 37, 16, 40,214, 81,189, 66,139, 20,188,140, 32, 80, 32, 2,132,128, 34, 11,255,152,118, 65, 96, 12, 34,227, 66, 10, 32, +174,168, 59,220, 59, 10,203,241,175,195,183,110,140, 25,192, 13, 87,140, 51,172, 11,187,182, 69,204, 73,107, 81, 61,150, 61,120, + 98, 66, 77,114,176, 58,183,203, 84,143, 47, 26,104,104, 66,159,182, 89,188, 93,247, 2,133,230,163,255,121,240, 70, 55,202,164, +139,182,175, 76, 27,241,240,229,155,138, 54, 45,154, 98,119, 61, 94,174, 48, 73, 27,115,101, 17, 60, 52,110, 41, 9, 43, 27,170, +110,164, 19, 60,116, 47,176, 67, 14, 32,254,196, 43,123,154, 61,104,218,159, 66, 29,182,107,194,240,133, 34, 65,151,190, 64,121, +165,129,131, 57, 57,248,189, 22, 25, 50,131,160,129,131,222,178,146, 93, 80,152, 2, 9,159,227,121,160, 46, 1,167,152, 1,228, + 24,181, 36, 94,161, 86,129,103,145,196,153, 86,120,203,173,238, 0,170,143, 1, 2, 63,124, 34,113, 4,182, 72,109,181, 40,160, + 69,104,192,218,177, 78,200,130, 45, 49,161,105, 13, 92, 79, 7, 16,176,101,141,244,103, 5,170,210, 20,201,229,150,133,216,248, +199,187,181,141,180, 37,140, 52, 65,112,200,230,129, 33, 99, 91,153, 76, 59, 47,141,180,184, 70,164, 83,152, 18,176,178,186,112, + 57, 65,218, 77, 49, 27, 21,178, 14, 34,148, 10, 85,197, 28,154, 66,168,166,106, 40,229, 2,104, 96,143,222, 68,114,227, 13,137, +122,233,132,182, 47,193, 48, 16, 40,207, 16, 67,215, 47,120,230, 73, 72,137,147, 86,183, 57, 11, 94,155, 76,148,173, 2,254, 35, +131,234, 29,112,213, 17,125,137, 92,108, 9,231,117,104,246,195, 13,157, 72,164, 2,255,188, 1,147,182,101, 5, 10,106, 35,215, +208, 15, 16,138,172,138, 0, 0,175, 37,218,121,159,171,194, 78, 5, 98, 75,171, 18, 74,153, 70,187, 77,103,129,212,182,193,202, +132, 65, 90, 42, 53, 18, 27,243, 4, 29,218,120, 16,146,158, 1,246, 54, 96,142,190,226,145, 30,182,118,203,236, 89,192,212,121, + 77, 26,181, 55, 16,241, 97, 20, 75, 50, 53,202, 74, 73,252,138,214, 96,244,189,205,174,100,106, 27,183,137, 6,162,200, 8, 38, +197, 66, 0,252, 85,105,217,188,105,174, 47,193,217,168,156,251,142,196,179,215,200, 84,116,205,165,132, 38, 64, 66,177,196, 7, +236,170, 72,170,201, 74,185,214, 68, 13,164,201,164, 50,176,132, 10,246,158,176,114,162, 40,198,135,162,243,218, 36,222, 53, 49, +104, 58, 46,186, 63,200, 8,160,139,160,102,234,110, 56,106,111,140,239,208, 96,161,154,126,213, 52, 23,151,154,118, 55, 76,210, + 20,117,151,160, 46,171,175,178,220,220,234, 63,183,169,153,176,120, 88, 2,218, 0, 11, 4,112, 25,149, 1, 5, 88,172,135, 56, + 1, 18,187, 96, 39,170, 81,112, 68,124,115, 42, 32,251,215,206,161,210,136,137, 88,203, 82, 51,238,214, 56,192,248,165, 27,221, + 20, 37,109,169,216,128,165,163,237,223, 85, 36,215,165, 93, 65, 43, 0, 84, 37,101, 14,244,225, 49,224,195,148,175, 41, 85,117, +197,245,241,142,142, 74, 41,171, 94, 27, 76, 4,108,221, 26,218,233, 28, 53, 85,130,148, 16, 55,186,224,128, 42, 23, 20, 28, 17, + 74,245,204, 68, 18,178, 86,165,137,186,215, 50,153, 27,174,253,154,117,156, 69,120,224,218, 42, 53,231,140,206, 11, 52, 72, 76, + 17,128, 64, 59, 65, 20,188,201,170,104, 34, 38, 33, 60,165,174, 25, 28, 36,143, 1,172, 21, 38, 10, 70,164,166,191,236, 26, 7, +168,216,229,206,225,152,201, 50, 90,101,112,240, 59,148,214,116,208, 29,166,203, 53, 58, 17, 0,237, 24,154,148,213,183, 22,110, +132, 31,132, 64, 88, 47,169, 12,242,202,134,194,160,150,136,148, 27,161,220, 22, 51, 59,185,204, 32, 55, 27,178, 63, 78,173,113, +131,203,209,211, 32,182, 40,197, 41,128,190,123, 42,223,152,188,172,193, 99, 25,112, 34, 28, 5,140,168,175, 98,253,156, 27, 57, +209,102,125, 20, 14,232,199, 26, 69, 44, 11,241, 56,251,202,137,170,179,178,226,204,129,231,128,233, 89,100, 43,132, 89,155,112, + 70,220, 49,148,232,115, 47,210,106, 84, 8,148, 2,106,112,144, 5,180, 49,212, 56, 11,114, 11,120,133,154,227,128, 96, 84,137, +227,102,255, 33,220,139, 32,218,110,213,221, 76,179,194, 17,242,212,128, 97,236, 86, 74,198, 0, 69,123,246,234,157,217,170, 83, +247, 4,245, 98,162,141,171,243,251, 97, 14, 66, 7,206,152,191, 89,228, 3,231,175, 8, 52,240,146, 6,253,111, 96,225, 2,130, + 37, 8, 50, 45, 1, 46,100,237,217,204,128,195,144,102, 31,241,100, 72, 93,250,253, 28,211,219,250,172,157,231,205,205,197, 86, + 73,148,227, 41, 2, 71,234,176, 36, 64,116, 21, 40, 37, 55,194, 65, 21,210,188,117,140,204,167,142,150,211, 90,156,100, 96, 71, +233,215, 78,193,120, 91,219, 0,188,155, 64,120,130, 29, 0, 61,144,172,161, 7,211,128,116,151,152,133,193,118,185,218,251,192, +178, 58,139, 5,151,148, 18, 44,144,234, 49, 3,222, 49,170, 30,105,103, 48, 14, 21,176, 80,136, 3,250, 16, 76,144,138, 34, 0, +144,186, 20, 77,253, 27, 0,207,110,148,101, 19, 55, 53, 74,219, 22,227,148,162, 90, 82, 86, 45, 34, 64, 69, 38,121, 70, 73,140, + 62, 64, 75,162,110,175,228, 70, 4, 77,185, 91,154,110,221, 66,156,208,168,210,164,237,241,255,161, 51,220,240, 88, 11,123,173, + 37, 26,127,148, 88, 44, 92, 96, 51, 19,175,159,112,118, 97, 86,106,167,142,210,117,187, 26,189,175, 9, 22,118,110,231, 8,208, + 97, 97,192, 9,132,167,143,252, 87, 89,145, 26, 65, 68,177, 36,164, 44,181,202,123,203,172, 49,205,137,249, 75,222,185, 40,241, +188, 5,202, 40, 5, 0,126, 32,211, 88, 52,123,105,117, 96,211,125,239,152, 67,254, 81,255, 95,188, 77,166,165,157, 17,248, 70, +222, 43, 25,147, 31, 12, 25, 23,159, 59, 13, 37,146, 87,234,226,145,138, 76, 87, 9,189,150,163,119, 7,190,167,128,118, 2, 55, +224, 54,113,105, 78,108,223, 40,141, 98, 99, 20,125,129, 62,198,152,169,137,118,160, 94,223,213,212,120,229, 53, 60,107,225,166, + 71,182,117,225, 66, 96, 87, 49, 20, 83,158, 25,130, 10,139,113, 61, 81, 55, 5, 70,201, 48,223, 77,151,217,219,191,150,112, 36, + 57, 55,143, 74,116, 51,206,174, 42,179, 57,254,156, 5,160,136,114,107,209,180,152, 81, 78, 54,248,191, 75,138, 62, 8,174, 86, +200,211,142, 55, 64, 25,138, 20,199,223, 84,169, 43, 34, 59, 94,102, 40, 37,107, 52,112,238, 81, 49,149, 41,171,179,121, 68, 50, + 83,129, 0, 25, 79,208, 57,206, 24, 42,181, 97, 5, 36, 81, 57, 23,123,178,253, 37,211,236,156,118, 8,172, 75,103, 14, 36,164, + 16,234,122, 72,163, 40, 40,144,161, 89,197, 40,105,200, 26,232,110,193, 93, 76,127, 39, 40,151, 26, 29, 16, 29, 96,232,101,168, + 12,125,198, 64, 83, 24,136,191, 28,122, 10,149, 90, 45,136,245,250, 2, 2, 25, 22, 33,105, 48, 1,129, 41,218,230,154,101,136, +137,179,202,233,246,182,107,185, 87, 17, 96, 93,112, 52, 26,170,226, 58, 3, 75, 13,166,170,151,122,154, 70, 59, 72,157,115, 61, + 25,189, 75,154,101, 92,152,158, 45, 74,129, 22,239, 70,131,157,118, 40,137,190, 24,205,118, 97,138, 79,102,180,121, 42,185,117, +132, 32, 43,113,213, 39, 94, 35, 37,136,233,171,228,220, 81,150, 57,205, 41,101,117, 34, 36,154, 72, 76,128, 14, 48,130,204,192, + 53, 70, 48, 72,198, 73,250,132,224,213,120, 55,129, 73,160,199, 55,158, 11,178,132,218,137, 44, 89, 26, 42, 69,231, 9, 37,236, + 94, 31, 0, 12, 77,176, 95, 74,114,170, 50,207,111, 77,123,101,252,158,166, 20,210,106, 23,184,204,103, 13,137, 80,107, 91,107, + 65, 76,213,246,172,246,128, 10,166,120, 65, 13, 7, 37,114,205,232,228,164, 77,205, 39,171,158,122, 7, 72,221, 80,163,131, 6, + 39,208, 41, 9, 53,150, 11,234,108, 83,166, 96, 22, 68,189, 66, 67,224,142,214,107,252, 35,159, 90, 32,149,236, 27, 23, 87, 34, + 16, 76,106, 83,198,238,168,164, 62,201, 81, 38, 14,141,104, 73,207,159, 83, 87, 67,148, 57, 86,170, 77,137,148,176, 83,203,134, + 74,157,148, 70,138,184,205, 32, 65, 29,213, 82,250, 28,117, 71, 99, 82, 50, 56,107, 25,164, 26,198, 4, 42, 77,169,227,197,208, + 34, 24,249,241,204,203,204,241,134,190,230,212,162,173, 13, 92,153,218, 82,195, 28,146, 85,209,150,149,210, 82,114, 96, 40,181, + 99, 21, 89,181, 40, 34,205,222, 2,206, 98, 22,197,200, 10,144, 85, 69,123,114,135, 53, 78,109, 22, 69,107,191, 86,119, 39, 84, + 59,100,202,205,122, 24,130, 3,110, 36, 93, 65,119, 84, 98,145,230, 84,171, 64,241, 14,178, 4,233,162,221, 91, 43,158,157,100, + 66,249,224,154, 17, 7,109, 27, 82,160,202, 72, 82,182, 12, 28, 76, 27, 98, 16,167,101,156,240, 36,120,125,134,156, 79,177, 9, +160, 5, 37,225,172, 4, 91,172,233, 63,107,162,166, 74,205, 40,103,215,240,135,253,215,157, 59, 11,120, 26,200, 7, 85,212,126, +215, 54,189, 8, 8, 22,192,176, 16, 65,118,132, 67,240,138, 76,155, 62, 48, 65, 21, 5,144,240, 28, 43,116, 51, 20, 45, 75,152, +242,196,178,186, 3,128, 77,138,176,207, 3,106,206, 35, 49, 92, 70,208, 47,130,192,220,223, 14,122, 75, 86, 52,225, 72,255,233, +166, 25,109, 13, 67,128, 97, 56,223, 45,173,151,137,228,126,183, 8,117,203, 90,230,156,152, 96, 94, 43, 17, 78, 80,126,130,102, +247,190, 33, 99, 61,201, 82,179,154, 66, 42, 41,221, 37, 41, 98, 64,129,143,196,164,229,156, 70, 22,252, 94,232, 97,204, 40,244, + 1,157,190,218,173, 39,127, 75, 86, 78, 50, 71, 67,160,155, 20, 34,188, 57,137, 26,212, 96, 11,184, 29, 90, 77,189,183,185, 75, + 1,202,140, 87, 34,107,171, 83, 28, 79,201,210, 88,172,176,227,188,169, 2, 23, 25,121,226,148,187,154,153, 12, 85,234, 33, 2, +105,216, 2,200,118,110,244, 74,221,116, 2,192, 16,159, 51, 99,218,221, 34, 79,144,234, 12, 25, 92, 40,201,160,152, 74, 83, 30, +105,235,184, 83,160, 85,225,235,101,229, 59, 90, 16, 82,145, 12, 70,244,110,127, 46,148, 38,107,106,154,121,205,101, 77, 8,142, +232,169, 17,130,154,144,248, 53, 9,125, 75, 41,112,221, 93,172, 50,208,151,159, 54,211, 18,209,178,212,166,178,106,209,137, 82, + 19, 75, 35, 77, 75,188, 90,108, 5, 73, 71, 1, 36,186,235, 23, 24,195, 5, 56,238, 14,172,172,148, 49, 53,178, 34,171, 49,125, +183,210,219, 24,128, 73,210,168,151, 9,174, 69, 21, 55, 18,201,162, 82,148,244, 36, 36,177, 14, 64,229,105, 37, 11,197,224,201, + 87,104,105,166, 36, 90,143,118,184, 67,157,248, 44,147, 29, 88,160, 0,224,209, 10,123, 0, 50, 92, 18,134,105,154,135, 53,101, + 20,184,201,132,228,244, 34, 37,186,174,117, 38, 99,104,127,203, 88, 82,107, 88, 69, 12,169,110,178,242, 43, 0,151, 11,103,176, + 39, 65,127, 8, 1,156, 15, 39,217,194,166,190, 77,156, 29, 68, 51,136,235,162,123,161, 76, 59,196,214,151,141, 64, 83,126,110, + 1,174, 44,176,199,102,149, 82, 1,208,153,178, 24, 42,116,135,108,130,188, 42,156, 2,136,232, 69, 49,237,169, 53,201,137,115, + 0,135, 45, 43,101,133, 52,206, 82, 81, 29,234,181, 12,148,204, 21,241,176,220, 6,183,149, 45,247,253,125, 48,234,214, 11,124, +234, 61, 93,160,182,216, 0,109, 36, 43,169, 17,133,247,131, 45,245, 88, 48,145,152,251, 17,175,171, 76, 39,204,151,132, 74, 21, +139,248,137, 22,116,253, 80,104, 3, 61,124, 48, 38,182, 65,150, 96, 73,196,239, 18,135,131,193,176, 73, 35,167,159,141,149,160, +214,115,165, 44,182, 65,153,162,154, 22,109,154, 62, 89,100, 35,165,152,160,159,121, 43, 89,145, 37, 99,115,253,172, 18, 65,186, +122,162, 63,132,134,172, 82,182,176,159, 53,110,130, 90, 51, 50, 73,210, 54,115, 16,128,171,136,184,163, 79,122, 32,198,153,179, + 10,149,181,240,228, 21,100, 44, 96, 28, 40, 11, 24, 89,216, 88, 48, 67, 34, 17,229,152, 64, 75,138,178,245,253,206,115,199,148, + 61,246, 24,214, 86,154,177,185,229, 68, 91,214, 29,104, 12,177, 35,133,195, 81, 40, 66,169,189,111,234, 40, 5,124,122,198, 46, +132, 46, 69, 25,250, 10, 12, 42,100,165,227,228,248, 88,115, 35, 97, 4,200, 85,167, 84,174,212,104, 75,161,181, 37,110, 80,184, + 27,163,143, 82, 35, 2,119,222,191, 68,237, 27,148,249,194,200,114,206,146,152,193, 84,176,158,167, 76,193,105,174, 30,213,168, +217, 43,220,248,132,209,181, 71, 24,123,113, 79,198, 94,184, 1,218,129, 28,179, 69,174, 2, 53, 80, 65,176, 16,202, 53,167,159, + 7, 48,133,219,140, 28,103, 32,223,120,175,189, 28, 27,105,112, 6,161, 33,113,150,138,205,135, 14, 48, 16,141, 60,177, 64,169, + 79,162,182, 37,210,228, 86, 32,207,234, 32, 74,110,123,143,131, 42, 70,195, 50,146, 54,122, 39,114,169,106,156,242,220,116, 63, +100,230,148,210, 15, 3,205,137, 57,225, 29,212, 24, 48, 22, 37,131,230, 36,225, 40,176, 60,199,185,253,172, 97,153, 64,219, 32, +169, 16,218,125,238, 76,241,208,238, 75,151, 52, 67, 4,180,245, 61,115, 66, 33,157, 75,208, 80,203,156,177,105,223,211,192,147, +167, 18, 47, 2,234,138,150,146, 58,230, 20,208, 21,204,110, 58, 86, 40,148,146, 4, 65,174, 78,241,100, 7,221,110,209, 4,138, + 51, 13,126,107, 53,205, 77, 15, 66, 3,112, 59,222,141,185, 41, 32,145,207,201, 74,193, 68, 24,121,253, 27, 4, 45, 64, 21,136, +164, 74,131, 80,163,108,160,252,146,181,144, 43,244, 78, 20, 54, 52,188, 81, 86,130,170, 81, 97, 3,207,122,206,188,194, 49,207, +147, 85,128,110,130,111,229, 84,151,108, 83, 67, 37, 73,118,154,139,186,206,219, 13,220, 64,164, 68, 18, 22, 55, 29, 39, 20,234, +164, 81,207,192,235,106,140, 40,183,157,153,100, 13,146, 45, 34,134, 42, 17, 9,183,137,125,110,106,251, 72,235, 98,137,200, 28, +181,151, 25, 55, 23, 80,126,227, 84, 5,226, 84, 15, 23,173, 61, 87, 68, 95,131,138, 81,113, 96,144,248, 4,230, 70,123,153, 37, +163,111, 11,150, 12, 18, 10,191, 2,144, 77, 64, 3, 26,105,124, 12, 20, 58, 0,192,161,160, 13,161,108,101,179,153,178,172,208, + 34,177,176,103, 89,168, 9,208, 39,141, 19,162,142,166,234, 60, 59,183,187,144,211,204, 24,202, 19,228,220,111, 2,245, 45,104, +144, 83, 96,205,144,104,235, 85,200, 11, 26, 87,149, 57,218, 72, 6, 78, 62,100,156, 11,246, 23,231, 22, 32,157, 90, 18, 39,240, + 82, 5, 94,183,160, 0, 73, 6,184,133,194, 87,219, 87, 76, 64, 24, 37, 39, 86, 40, 25, 42,113,231,197,178,121,117,116, 12,150, +126,238, 44,152, 17,107, 86, 9,164,239, 44,181,137, 34, 0, 73,173, 16, 65,158, 8, 32,101,180,138, 37,240, 4,160, 99,190,162, +211,136, 13,124, 4,219, 74, 11,160,182,105, 69, 49, 78,132, 65, 31,163,117, 24,155,102,221, 4,209, 51, 7,254, 1, 37,224, 11, + 17,232,122,228,178,149, 55, 90,225,160, 24, 11,200,232, 26,115, 36,129,236, 26, 93,123,220,119, 10,101, 26, 43,212,232, 40,218, +170,106,211,157,130,206,180, 94, 90, 87, 92, 0, 5, 57,234,166, 30,202,146,186, 2,187,238, 0, 26,116,110, 11,163,178,170,210, +148,202,137,117, 34,194,218,250,114,198,130,213,172, 53,250,159,228,131,101,236, 64, 89,181, 71, 64,213,140,161,205, 29, 11,102, + 55,124, 15, 80,138, 45,116,120, 91, 26, 88,153, 20,172, 93, 39,113,156, 65,126,119,104,164, 82,188, 45,237,180,127, 12, 26,241, + 75, 9, 22,205, 0,238, 43,141, 0, 89,167, 89,182,165,139, 17,233, 62,100, 58,240,206,226, 97, 16,131, 18, 47,103,154, 32,146, + 57,146,139,125,227,164, 40,238, 89,140,252, 97,136,208, 58,120,174,157, 70,201, 99,203, 56, 9,112, 69, 69,177,116,168, 49,132, + 10, 83, 81,230,105, 77,188,214, 68, 21, 3,152,161,215, 49, 5,234,123,148,213,213,214,210, 50, 40,211,229, 28,101,143,109,130, + 93, 15, 91,214, 85, 70, 35,221,201,171,240, 9, 89,217,115, 86,251,247, 69,172,194, 41, 58, 95, 35,236,154,165, 96,129,160,105, +205,238, 77,226,181, 80, 89,201, 44, 96,121,160, 98,196,201,161,234, 39,196,169, 46,100,247, 27,251,244, 18, 73,114,100, 18,128, +206,162,103,224,128, 50, 90, 13,247,180, 5,250,120, 75, 70,152, 51,240,209,165, 81,228, 67,240, 22, 56, 28, 8, 76,243,186, 96, + 35,197,202, 13,101,107, 5, 68, 2, 29,227, 16, 43,192,141,142,129, 99, 5, 26, 70,115,177,251, 0,109, 32,167, 62,202, 2,233, +117,134,212, 36,136, 91, 64,214, 32, 20,179, 74, 40,214, 49,102,127,114, 93, 82, 76,117,112, 18,196, 30, 69, 44, 16,212,129,180, + 21,145, 10,206,167,109,182, 28, 32, 76, 3,154, 53,243,203,212, 58, 88, 0,181,236,247, 66, 82,218,148,215,116,180,178,121, 93, + 32,165,110,250, 18,168, 26,232, 64,173,138, 50,160, 28,142, 66, 69,192,152,221,200, 66,169,153, 65,106, 0,178, 42,210,106, 94, +139,165,132,171,149,142, 42,161,242, 20,100,183, 1, 10, 85, 34,192,136,116, 48, 0,143,168, 68,112, 2,206,115, 71,145,234,100, +206,202,113,227, 60,169,198,157,142, 10, 5,150, 12, 56,245,191,205, 77,143,154,244,138,102, 17, 48,216, 9, 57,218, 82, 64, 53, + 17,128, 62, 21,218,203, 34,108,155, 25,203,211,156,106,225, 5,231,111, 89, 93, 79, 4,242,174,214, 36,102,108, 0,132, 89, 89, +149,133, 85,237,218,118, 65,158, 81,216, 70,132, 87,114,237,190, 47, 22,118,117, 65,193, 18,152, 83,249, 74, 40, 57,130,232,145, +105, 8,176,138,195, 96, 80,102,171,206,180, 85, 58, 43,215,234,242,236,216, 43, 56,227,254,185, 0, 12,192,126,154,212, 83,139, + 26,225,177,157,179, 26,101, 82,167,167,176, 5,102, 66,167,105, 91,117, 25,166,189,114,250, 92, 22,152, 10,100,127, 94,170,157, +119, 43,100,199,243, 68,223,251,226,141, 38,164,100,113,161, 17,253, 94, 0,225, 96,202, 65,142, 42, 94,169,235,146,183,140,179, +237,111, 42,250, 11,120,203,121, 98, 74, 18, 8, 73,190,125,243, 48, 57,109,208,236, 53, 94, 10,100, 45,183, 30, 50, 32, 39,177, + 38,137,105,115,240,110, 11, 73, 66, 41,123,123, 20, 41,192,209,228,236,168,186,131, 60, 25, 73,108,239, 24,123, 1, 39,138, 88, +214,196, 78,213,143,104,151,151,186,174,101, 16, 78,180, 75, 12, 97,146,149,205,221,180,150, 89,107, 66, 46,140, 18, 15, 75,123, +162, 57,179,192,104, 81, 35,162,152,160,113, 78, 43,254, 96,252, 95,129,250, 58, 18, 88, 61,133, 23,116, 40, 54,218, 8, 56, 79, + 30, 85, 16, 67, 23, 51, 25,179, 59,163,238,129,162,156, 93, 77, 10, 0, 57,169,166,189,230,185, 99, 7, 98, 2, 76, 8, 3,226, + 55,241,139,165, 77,177, 54,202,124, 18,109,129, 71,193, 49, 67,212,139,105, 19,196,179, 29,249,169,192,207,157,228, 57, 83,115, + 71,221,252, 48,107,208,112,177, 53,162, 49,102,131,112,168,131, 81, 75,113, 2, 68,183,161,193,144,233,196, 56, 87, 85, 8, 99, +165,214,234,194, 53, 9,111,156, 80,207,168,184,200, 34,192,150,200,126,101, 97,202, 84, 42,138,190,232, 4,189,237, 37,157, 59, +224, 19, 82, 35,111,139, 64, 74,126, 62,141,225,193,146,151, 27, 19,230,180, 55,118,196,169, 14,139, 45, 90, 3,255,149,165,205, +132,172,129, 6, 39,198, 71, 76, 16, 81,135, 20, 17,237,208, 13,206, 28,119,108, 25,224, 10,154,148, 80,212, 94,202,100,228,235, + 7, 85, 21,155,255, 16, 58, 29,156,245,231,205,169,228, 38, 11, 52, 70,220, 53,122,173,219,218,149, 38,187,183,154, 41, 51,193, +169,210,136,135, 73, 40,152, 89,183, 55,239,169, 94,210,126, 32, 69, 92,208, 39, 36,141, 25, 58,124, 81,202,242, 56,216, 2,155, + 36,129,218,103,100, 70,200, 65,149, 85, 13,188, 51, 35, 40, 73,241, 5,160, 84,131,136,225,222, 44, 70, 5, 57, 90,173, 71,131, +131,205,169,245,238,212, 51, 96,136,208,183,209, 41,211,239,217,174, 83,220,188, 53,170, 74,202,164,179,129, 18,226,208,213,178, + 66,163, 24,129,118,178,212, 0,116, 85,231, 42,217, 30, 65,124, 13, 98,137,125,175, 48, 65, 37,113, 7,100, 84,199,220, 40,218, +198, 80,211, 13,150,174,236,152,128,179, 78, 13, 98,179,209,188,237,212,160,151,232, 90,134, 46,135, 20, 64,120,138, 56, 76, 63, +225,110, 76, 5, 8, 34, 42, 20,204,128,184, 1,218,137,166,198,190,129,221,145, 92,239, 68,148,120, 97,232,102,204, 12,186,229, + 0,111, 40, 32,205,169,217, 11,207,192,184,148,169,120,115,137,136, 84, 80,135,190,145,102,132,236,122,105,116,162,155, 46,221, + 83,141,164,138, 43,146, 53,156, 13, 93,239,146, 84,222,236,188,144,134, 39,128,202,156,132,226, 10,246,161, 27,255, 93,107,142, +104, 25,184,252,209, 63,185, 81, 95,114,205,121,201,148, 65, 84,168,176, 72, 72,203, 54,133, 5,218, 28,194,102, 10,186,205,145, +238, 46, 89,195,154, 32,165,213,144,224,162,219, 85, 28,215, 19,213,188,138,124, 70, 96,151,131,231, 4,174, 99,140,242, 38,185, +197, 78,130, 65, 49,105,197, 71,157,223,188,254,162, 81, 53,114,207,139, 25, 30,231, 18, 87, 64, 40, 55, 37,133,237,168,233, 82, +137, 6,158, 92,217,229,126, 11, 99,155, 69,149,222,115,174, 54,118,205,182,110, 59,156, 50, 42,108,245, 52, 87, 80,211, 79, 20, +187, 83,106, 88,107,133, 82,132,254, 92, 64, 80, 74, 56,117,161, 2, 59,163,224,186,178,166,254, 27,216, 0, 52,139,174,120,199, + 37, 0, 88,192, 39,101,206, 29,148,216,121,247, 29,204,181,232,226, 33,224,124, 32,186, 29, 83,222,209,174,152, 3,128, 75,178, +226, 52,142,173, 89,165, 57, 38,180, 18, 38,200,106, 13,223, 95, 5,122, 55,192,254, 34,107,200,236,220, 80,171, 68, 27, 33,165, +214,144,212, 86,240, 10, 60,175,112, 76, 77,175,223, 90,171, 70,180,108,160, 45, 84,168, 35,151,176,149,166,165, 88, 7, 17, 58, +175,192, 57, 67, 24,103,178, 7, 37, 99, 58,254,127,186,222, 44,214,186, 45,187,239, 26, 99,174,189, 79,243,245,183,239,202,213, +223, 42,199,109, 57,196, 22, 78, 28, 39, 16, 64,142,128, 32,144, 72, 68,128, 72,121, 0, 30,224, 33, 18, 47,188,241,200, 19,111, + 72, 72,145,120, 64, 81, 64, 40, 36, 36, 2,146,216,142, 19, 57, 78,202,177,203,198,213, 87,185,110,221,106,110,127,191,251,245, +237,105,246,154,131, 53,231, 28,205,127,172,125,110, 69, 55,247,250, 59,231, 59,103,239,181,215,154,115,142, 49,254,255,223,191, +172,100,112, 94,173,115,132, 54,145, 81,209,224, 97, 44,235,226, 60, 19,174,120,221,221, 4,136, 14, 33, 98,154,162, 99,230, 7, +143, 56, 86,131,133,141, 61,138,149, 32,137,116,160,175,169, 3, 98, 72,231,221,182, 46,181, 42,124, 54, 92,186,192,129,190,117, +157,203,200, 45,183, 13,186,167,223, 41, 46,214,186, 25, 70, 31,180,187, 97,222, 85, 61, 32,193,225,180, 64, 62, 59, 7,168, 75, +112,100,210,127, 54, 99, 43, 70,103,245,165, 51, 63, 26, 45,175,214,152,251,111, 58, 0,126, 51,133, 40,193,143,255,197, 23,101, + 78,194,174, 0, 82, 84,225,212, 82, 75,243, 97,104,183, 13,180,174, 93,172, 66, 23,177, 89,241, 20,107, 39,254,194, 65,202, 18, +202,237, 59, 89,101, 40, 36, 21, 32,234,217, 42,249, 38,221, 46, 70, 45,152, 5, 31,109, 42,225,181, 60,174,186,157, 99, 55,175, +197,125, 57, 27, 24,111, 62,171,224,247, 20,156,208,142,179,118, 80, 18,102,185, 29, 71,194,226, 36, 40, 14,139,205,151, 57, 42, +242, 12, 11,130,220,110,150, 36,226, 19, 65,161, 69,188,254,162,155,130,115,213, 53, 11, 60, 44, 63, 18, 51, 87,175,170,196,219, +180,136,148, 44, 41, 17, 44, 87,214,200,174,183,184, 83,171,248, 4, 54,244,194,214, 26, 35, 31, 39,132, 66, 62, 47, 57,188,151, +156,183,210, 27, 9,173,172,107, 16, 93, 99,251,129,112, 14,172,224, 56, 85,119, 17,139,206,228,138, 30,236, 38, 56, 90, 50, 56, + 22, 10, 69, 86,121,216,249, 50,164, 37, 87,161, 86,204,216,255, 49,101,201, 7,199, 2,226, 98, 69,195,145,150,149,159, 47, 85, + 95, 37,134, 64,144,177, 59, 42,189, 41, 44,131, 2, 26, 5, 59, 11, 77,188, 2,139, 8, 0,103, 10,168,112,145, 61, 80,247,124, +148,146,188,233,240,184,116,133,120,241, 62,103,154,161,234,125, 36,171,176,146,117,107,206,132, 71,238,142,100,129,174, 21,123, +177,161, 39,163,145, 30,168,212, 71, 1,119, 73,160,170, 35, 88, 37, 68, 91, 43,229,186,123,138,141,156, 88,124,145,183, 77,145, +210,129,135,247, 42,183,228, 61, 53,106, 25,172, 9, 30,133,187, 10,110,103,176, 52, 57,167, 64,120,213, 10,167,236,231, 95, 11, +213,116, 84,227,220,122,160,190,217,168,181,160,134, 73,194,238,234,218,152, 50,185,208,173, 20, 94, 1, 61,226,253,142, 67, 40, +152,129,211,189, 47, 73,182, 46, 21,138, 46, 9, 63, 57, 83,104,130, 58,192,165,232,102,220,115,200,197, 69, 97, 6,167,178,140, +138,105, 50,151,203,152, 33, 23, 5,209,228,252,132, 70,120,155,151, 53,189, 38, 21,252,102, 42, 17,230,178,108, 88,231,187, 97, +207,108,240,152, 73,195,159, 42, 34,147,109,141,102, 16, 29,167, 28, 8,197, 82,123,228,176,142,212,140, 6,201, 4,222,251,241, +185,118, 97, 92,143,202, 37,141,102,157, 84, 63, 83,161,101, 47,125, 19,239,238, 20, 41,206,172, 48, 81,105, 71,183,159, 45, 47, +126,170, 4,153,216,181,207,254, 74, 17, 77,217,137,185,162, 61, 40, 99, 79, 42,160,132, 15,170, 19,144, 22,147,183, 48, 83,163, +114,235,189, 66,227,186,192, 66,103, 63,111, 45,237,192,244, 52,145,140, 41, 21,225,253,197,189, 70, 53,199,117,109, 59, 11,179, +174, 92,176, 81, 35,227, 60,158, 73, 12,136, 64,230,111,204, 98, 24, 72, 76,206, 47, 94,249, 40, 61, 70,212,148,190, 41,210,179, + 66, 10,156, 68,104, 5,182, 30, 9,105, 71,209,224,199, 25,187,172, 68, 64,169,133,205, 81,129,161,118, 98,108,102, 49, 35,239, +163, 21, 0,153,176,228, 57,243, 4,162,157,181, 0, 49, 16,167, 2,139, 79,246,137,123,156, 34,132,126, 48,116, 8,216,124,250, +194,105,195, 68, 53,246,122, 30,137, 26,139,128,191, 72,186, 23, 59,138, 17, 54,233,232, 10, 6,255,157,156,184,104, 98, 21,241, +185, 91,127,248, 10, 90,124, 24, 70, 28,124,225,103,237,206, 13,220,160, 48,171,184, 96, 75,211, 90,151, 65,180,111, 42,249,132, + 60, 88,185, 1,246,181, 6,156,212,205,233,239,112,158,237,241,202, 43,237,109,222,245,115, 37,200, 20, 40,177,241,175,162,130, +133,131,167, 31,145,172,165, 71, 94,242,138, 82, 73,142, 10,229,252, 81,242,106, 92, 66, 65, 7,131,115,102,182, 77, 57, 94,152, + 65,207,202,144, 79,142,118, 57,246, 17, 29, 91,214, 60, 69, 75, 56,130, 52,138, 23, 61,214, 10, 23, 36, 89, 48,226,141, 32, 6, + 22,230,222,206,247,119,215,137, 10, 7,107,221, 59,176,150,244, 94,246, 49,181,236,159,119,177,248,157,209, 93, 41,184, 81, 24, + 71,124, 30,138,107, 68,169,150,176,133,142, 14,249,212, 53, 24, 24,240,224,179,123, 11, 2, 98,222,131, 18,173, 33, 92, 5, 78, +105,188, 90, 98, 81,116, 87,244, 52, 84,245, 89,169, 42, 58, 43,233,198, 84,162,167, 89, 20,219, 54, 55, 89, 26,217, 72,228,195, +112,173, 78,113,211,206,113, 75,228,171, 32,148,181,156, 51,209,207,228,176, 17,131,220,245,131,130,186,218, 27, 97,219,237,134, + 14,131,245, 51, 62,187,121, 30, 66,184, 18,203,126,181,144,158,185,134,218, 67, 99, 91,107,157,161,187,200, 48,146,156,149, 80, +105,126,117,189, 71,218,109, 48,233,209,179,223, 39,243, 0, 17, 53,214, 59,107, 4,107, 87,206, 23,184,254, 3, 83, 91, 58,213, +171,244,142,200,166,229,204,118, 20,109,251, 69,118,129,170,122, 66, 65,165, 87,152,208, 9,154, 30,108,244, 66,239,113, 28, 62, +166,114, 90,139,189, 8,126, 7, 39,206,120,158,254, 97, 75, 72, 64, 69, 47,249,238,129, 22, 24, 76, 95,179,150, 47,188,155, 24, + 10, 80, 40,169,146,253,198,194,154, 36, 49, 47, 86, 98,185,149, 39, 87,144, 88, 39,146,103,246,130,250,129,252,123, 5,117,220, + 16,226,225, 66, 56,178,240, 14, 78,215,107, 61, 59,195,113, 68,220, 6,144,142,133,234,122,184, 4,253, 49, 40, 81,245,120,194, + 23, 64, 96,250,169,114,149,200,135, 33, 33,193, 79, 69,238,193, 58,228, 33, 8,103, 6, 6, 50,224, 76,161, 21,181,141, 98,124, +129,138,244,204, 7,144, 52,168, 9, 29, 6, 71, 7,133,131,220, 86, 72,246, 52,204, 19, 69, 84,176,255, 99,115,100, 85,198, 15, + 17, 75,129,168, 88,134, 89,106,241, 3, 4,107,143,223, 99,130,129,233,141,243, 86,194,235,227,137,119,246,164,155,240, 44,207, +143, 67,205,159,179,179,221, 86,184,182,190,165, 11,159,113, 48,153, 88, 30, 44,120,156,243, 74,114, 24, 92, 12, 51,242,131, 9, +238,255, 69,219,249, 46, 20, 36,224,129,103, 19, 41,103,158,140,174, 15, 53, 63,107,218, 58,225, 89,226, 62,174, 21,186, 77,146, +216, 8, 99, 93,130, 7,219,206, 74,109,253, 40, 4, 10,116,208,171,152, 35,163, 68,151, 71, 32, 30, 53, 90,165,209,253, 98,136, +124, 78,121,230,140,115, 86,128, 43,219, 65, 94, 38,183, 90, 38,140,175,183, 96, 57, 84,252,122,192,115, 14,168, 39,184,169, 48, +160,224,252, 67,156, 62,207,110,121,140,167,135,205,214,165, 85,103,243, 71,163,168,141, 25, 29, 23, 40,144, 13, 11, 86,255,251, + 5, 86,103,140, 90, 5,196,109, 36, 40, 6, 67,161, 29, 34, 10, 5, 95, 97, 83, 48, 60, 10, 97, 51, 5,146,232,150, 77,107,217, + 92,173, 93, 62,233,104,201,198, 13,253,159,101,131, 61, 71,207, 59,219,179, 82, 60,214,151, 75,160,107,125,212,162,135,211,131, +205,198, 51, 18, 4,194, 96,104,154,226,126, 44,131,114, 74,243, 32,186,219,231, 91,107,180,136,139,147, 16,173,195,166,247,120, + 29,237,232, 9,174, 91,159,133,175, 51, 25, 38, 21,195,169, 16,111,228,172,107, 46,123, 63, 48,128, 69,115,218,244,244,194,222, +117, 56,171, 59,141,138,155,180, 98, 42, 90,149,201,126,113,157,224,249,178, 39, 91,146,117, 56, 3,175, 88,197, 28,173,123,230, + 21, 29, 14,230, 9,133, 81,173, 78, 78,195, 98,252,123,224,115,174,208,106,226,189, 62, 44,175, 92,103, 24, 7, 75,145,190, 68, +104, 3,179, 83,105,137,237, 53,107, 49, 50, 23, 25, 83, 11, 72, 86, 52,183,120,144, 9,197, 49, 48, 51, 41,120,136,101, 73,169, + 92,177, 17,129,230, 1,206, 85,174,134, 93,161, 71, 11, 3, 94, 80, 71, 25, 5, 46,104,154,227,195,123,114,200, 76, 17,247,112, + 26,131, 47, 85, 86, 18,155, 71, 65,150,180,109, 48,201, 85, 0,115,184,238,189,172, 32, 40, 41, 0,242,208,113,131,228,252,103, + 94, 29,166,214, 49,180,152,103,189, 39,195, 76, 2,232,232, 28,236,185, 39,152, 33,161, 42,111,228,134, 78,182,174, 66, 88,127, +236, 84, 77, 57,235, 26, 43,101,251,161,162,248, 99,183, 5, 81,206,183,102, 14, 35,172, 51,241, 67, 32,106,115,201,181,251,195, +157, 43,133,188,162, 26,123, 39,204,249, 77, 17, 14,158,119, 86, 91,207,120,237, 67, 48,217,219,227, 74, 90,225, 42,201,218,181, +111, 55,203,120, 55,118, 81,102,102, 82,131,106, 16,190,166, 96,162, 42,161, 76,230,117,116,113,204,181, 25,244, 45,222, 37,235, +111,114,210,195,218, 80, 53,114,179, 55,105,135, 75,224,103,182,234, 71, 42,175,196,244,251, 40, 32, 73, 66, 84,217, 91, 47,176, + 42,101, 71,143, 10,140,215,128, 69,193, 6,224,153,252, 80, 95, 74, 73, 88,218,128,250, 84,181, 11,199,172,223, 64, 83, 99,195, + 82, 97,102,111,181,110, 18, 65,179,226, 38,160,226, 87,182,180, 58,209, 54, 46,180,170, 35, 7,221,158,208,105, 56, 44,236,125, + 87, 72,155,116,101,126, 70, 54,219,168,178,232,129, 4, 1,118,235, 3,107,191,167,244,112, 95,245, 94,147, 26,148,202, 98,172, +119, 19,238, 10, 71, 1, 68, 17,172,213,143, 39,203,102,110, 60, 1, 31,159,200,236,247, 9, 10,181, 35, 85, 80, 84, 96,199,157, +215,209, 59,108, 27, 30,120, 36, 6, 98, 38, 15,213,250,120,206, 99,230,110,255, 27, 44,247,225, 31, 55,110,123,142,243,208, 13, + 93,139,173,229,170,118, 85,188,217,233, 80, 87, 72, 16,120,213, 90,242,226,169,130,197,249, 21,182,166, 15, 41, 62,248,170,122, +232,218,114,200,152,182,174,233, 32,183,161,171,165,109,167,105, 48,214,227, 47,128, 45,180, 52, 26, 20, 37,141,139,143, 92, 93, + 16,112,185, 51,141,115,175, 8, 43, 66, 14,110,154,183,174,132, 61,159,189,112, 48,150, 93,121,139, 98, 38, 87, 66, 34, 33,206, + 0, 22,171, 86,128,228,121, 51,195, 33,131, 49, 54, 82,162,219,144, 84,222,116,145, 13, 3,225, 55,171,204,104,247,193,218, 98, + 20, 1,179, 44, 57, 17, 64, 40,139,248,226,224, 80, 66,161, 11,237,119,179, 59,133,181, 47,128, 12,101,149,141, 45,123, 83, 14, + 73, 40,206,125, 55,112, 28,144,152, 43,164, 17,174,125,180,121, 51, 69, 93, 1, 35, 15, 64,225, 38,147,221, 87, 20, 74,106,191, + 97, 45, 99,192, 98, 82, 25,233,115,113,176, 9,101, 61,108,192,146,240, 61,126,175,136,195, 65, 96, 40, 45, 43,133,172, 30,164, + 11,115,174,235, 57, 70, 4, 49,219,215,120,207, 2, 27,125,137,215, 10,160,214, 85,107,146,163, 42, 5,184, 10, 90,143, 80,108, + 52, 44,104, 56,191,102,135, 90,216,251,177, 84, 54,247,166, 11, 92, 31, 0,130, 48,151,232, 40, 24,159, 29,218,195,177, 49, 49, +216,137,116,206, 93,241,176, 41, 73, 41,207, 32,244,243, 3,184, 7,166, 8,161,147, 62,176,162, 37,162, 83, 91, 11,209,238, 41, + 31, 70,151,142, 64, 70, 13, 71, 60,101,213, 57,254, 9,174,194, 98, 77,171, 49,211,108,213,101, 93, 10,145,165, 98,106,243, 79, +225,228,207, 76,157,137,200,156,128,231,187,112, 28,148,139, 9,121, 65,160, 42,241, 59,157,188, 41, 49, 82,137,240,151, 81,110, +249,114, 8,194, 50,226,176,167,166, 4,121,208, 36, 21, 24,111,141, 31,184, 89, 5,193,172, 34,165, 77,187, 81,145,116,201, 62, +178, 41, 53,251,210,201,179,215,193,210,181, 84,164, 67, 43,161, 93,131, 58, 42,208, 30,184,212, 14, 35,109,173,175, 53, 2,169, + 84,119,193,166, 79,226, 12,108, 50,222, 73, 98,125, 23, 61, 36,170, 71, 28,163,161,199,172,120,142,231, 64,162,163, 90,171,142, +129, 39, 53,244,118, 1,158, 10,167, 37,148,228, 99,190, 60,154, 20, 21,220, 64, 78,116, 43,227,254,154,149,113, 96,107, 18,153, + 21,183, 12, 95,186,137,247, 88,103,253,162, 57, 19, 54,138,156,108,143,237, 27,104,217,131,178,181,238, 64,209,121,190,135, 40, + 25, 29,179, 93, 83,158,253,243,113,122,232,100, 27,177,173,149,250, 28,104, 43, 95, 33, 5, 64,183, 23,237,117,176,119,165, 38, +129, 41,169, 62,123,155,246, 32,216,188, 40,156, 83, 33, 35,229,181,252, 29,218, 35,200,249,165, 4,217,216,223, 76, 18,206,148, + 87,226, 59, 61,245,165,106,138, 57,197,180,230,181, 58,188,240,169, 50,210, 52,110, 66,250,155,219,174,120, 15,193, 30,139,112, + 1,216, 62,136,240,100, 69, 42, 2, 42,216, 10, 59,237,162, 39,143, 33, 4, 5, 24,102, 21,251, 34, 40,113,242, 90,171,253, 48, + 71, 58,218,158,144,249, 4,152, 78,243, 36, 51,103, 66,148,112,182,239, 8, 99,139, 44,183,170, 19,238,147, 4,236, 46, 12,185, + 50,234,219, 46, 25,207,187,230,175,187,112,131, 34,150,114, 4,171, 20,168, 46, 65,181,219, 31,226,178,114, 44, 33,192,166,181, +165,138,255,185,172, 22, 63, 15,112,112,133,237,120, 24,125,174, 24,153, 67,128, 55,206, 8,122, 36,211, 21, 14, 53,173,207,206, +117, 3, 41,172, 45, 51, 93, 88, 8, 68, 70,105, 44,194,208,130, 94, 85,228,136,130, 65,103,131, 95,107, 19, 22, 85,107,173,142, +131, 85, 41, 28,211,185, 18,168,226,190,104,105, 11,178, 47,130,182,193, 79, 37,219,147,170,142, 84,172,253, 42,115, 18, 48,153, +139,197,253,249, 18, 86, 36,180, 72,114, 5, 50,227, 42, 25, 5, 91,176,204,249,148,153, 83, 89,227,235,108, 86, 80,247, 18,155, +189,177,116,237, 96,191,191, 83, 2, 24,199,224,214,102,170,237,117,111,178, 72,192, 34,113,221, 21, 82, 16, 98, 50, 54, 43,115, + 53,216,134,173, 89,210, 67, 28,201,113,136, 30, 85,152, 85,156, 69,241,161, 35,208, 29, 59, 26, 82, 67,183, 81,194, 90,225,246, + 51,177,182, 34,101, 20,171,109, 18,235,145, 38,123,250,150, 85,219,218,230,109,107,182,132,250, 93,210,220,217, 72,145, 72,149, + 4, 85,121,153, 96,148, 54,238,155,254,222, 74, 25,221,142,110,107,134,176,159, 50,245,235, 97,243, 92,195,246, 82, 58,220, 75, +178,234, 22, 66,135, 69,241, 67, 80,209,174,214,192,193, 46,155, 96,221,244,131, 65, 66,206,154,111,192,116, 23,160, 97,154,220, + 15,110,215,181,118,241,103,219, 27,183,155,152,233, 8,208, 13,205, 57,210, 54,230,185, 86,239,120,184,224,216,244, 25,100, 97, +181,227,129,111,135,128,158, 99, 2, 4, 74,209,200,241, 41,109, 72,186,222,110, 38, 24, 63,219, 40,172,120,107,189,234,137,161, +162, 83,165, 11, 46, 71,198,233,174,171,216, 41, 35,123,157, 33, 49,222, 87, 81,181,187,145,230,250, 87,102,234,127,183,204,154, +179,190,252,179,105, 39,165,173, 68,102, 55, 99,201,199, 4, 0,126, 73, 1, 18, 34,112,113, 25, 98, 24,247,243, 58, 64, 24,196, + 43, 74, 27,120,170,147, 93,163,164, 3, 70, 86, 39, 83, 18,156,212, 68,173,130,164, 40,217, 23,133, 69,170,164, 36, 76,162, 37, +195,241, 30, 61,180, 36, 37,105, 82,116, 18,166, 23,161,217, 14,135,158, 53, 24,208,166,236,181,121,244,202, 23,158,229,240, 8, +190,147,125, 81, 83, 74, 27,138, 44,247, 80,201, 67,213, 10,246, 51,145,172, 41,112, 7,113,137, 57, 25, 65,116,109, 20,155,170, + 34,109,138, 74, 41,110,140,139, 86, 63, 39,124,118, 84,178,182, 41, 77,250, 48,137,251,186,219,102,185,229,141,218, 5, 45,211, + 62,218,188, 19,193,235, 80, 69,168,189,247,153, 48, 25,176,132,117, 12,187, 30, 37,131, 77, 38,136, 80,244, 98, 78,215,221, 9, +218, 93,198,205,176,205,112,204,215,163,130,159,176, 61,198, 28,233,128,112, 96, 52, 21, 55,113,142,220,148, 21,200, 35,173,137, +184, 96,241, 16,195,147, 86,184,238, 73, 86,111,188, 3,132,108, 86,186, 81,196,115, 41, 64,186, 43,185,165, 13, 89, 10, 99,163, + 44,142, 20,230, 18, 54, 69, 28,171, 57, 56,165,112, 78, 94,235,155,139, 86,246,234,139,118,183, 5,195, 66,142,211,252, 20,213, + 10,243,122, 37,144,245,121, 46, 84,195, 12, 76,241,216,140, 89, 91,204, 64, 43, 99,206,132,178, 34,137, 83, 46,188, 26, 25,216, +179,104, 27,176, 85,225, 41, 60,188,104, 64, 75, 85,130,162,110,222, 22, 39, 7,232, 89, 23,114,129,152,184,106,171,214, 19,231, + 4, 84,224, 83, 58, 63,239, 1,161,193,195, 50, 14,161, 38,228, 43, 97,173,100, 61,177,140, 3,171,104,164,167,126,174,150, 11, + 80,131,248, 87,109,132,209,227,228,180,131, 0,157, 10, 49, 54, 65,141, 5, 91, 52, 71, 28, 27, 31,130, 23,202,179, 51, 96,205, +170,146,104,146,177,118,169, 93,179,209,212,220, 30, 88,116,100, 36, 96, 21, 4,171, 52,131, 27,203, 44,117, 94, 24,148, 30, 72, +211,151,174, 10,192, 35,221,176,163,157, 61,254,172, 91,215,150, 53,104,211,196,128, 14, 12,170,105,212, 16,221, 8,241,156,132, + 73, 36, 51,198, 84,127, 81, 64,124, 44, 41,129, 52,214,240,145,138,184,211, 63,153,244,190,157,163, 35,204, 58,116, 1,189,204, + 92,119, 3,248,214,186, 52, 64,239, 11, 43,244,120, 63, 83,127,169,147, 54, 28,106, 15,112,177,128,224,246, 27, 55,219,214,155, +183,129,190,159, 24,225,157, 64,182, 6, 23,129, 25,105, 62, 93, 33, 4,179, 48,170,211,205, 63,184,154, 95, 85,242,182,163,172, + 8, 71, 18,103,135,156,114,132, 71, 2,118,135,173, 15,133, 57,250,243, 42,106,169, 41, 76,222, 39, 71,165, 96,174, 96,178,213, + 96,254, 53, 39,161, 21, 37, 68, 41, 59, 42,150,147, 37,207, 65, 3,149, 82,100, 36, 6, 44,236,241, 53,132,128,194, 21,215,104, + 42, 43,205,130,227, 54,197, 63, 96,194, 32,150, 53, 45,135, 96, 76, 11, 51,162, 10,194,184, 16, 82,114, 98,226,217, 34, 34, 2, +237, 61,247,232,115, 82,187,218, 24,161,219, 41, 74,113, 17, 93,228,130,143,135,172,128,162,186,120,235,114,188,222, 9,197,120, + 20,121,194,133, 11,188,191,226,236,121, 59,169, 22, 10,247, 3, 23,176,202,171,218,183, 43,100, 11,188, 78,244, 42,195,121,146, + 41, 19,200, 44,162,149, 33,149,110, 84,236,163, 31,239, 7, 76, 72,183, 16,156,207,195,184, 41,177, 12, 24, 5,148, 28,182, 54, +166,124,160,166,240,176,150, 77, 25,255,152,144, 73,133, 65,110,109,179,227,144, 14,253,121, 83, 98, 99,181, 86,161, 80, 18, 58, +150,178,117,177,210, 26,136,227,225, 76, 85, 2,242,214,238,147,106,132, 12,233, 45, 66, 42,144,162,103,207,149,110,234, 81,209, + 73, 34,133,249,223,183,215, 63, 1,113, 14, 4,101,118,227, 70,113, 16,252,107,118,212,141,248, 72,195,211,230,170,100,103,173, + 68,152, 77,130,221,232, 38,213,239,159, 82,117, 86,201, 29,227, 41,218, 70, 29,243,218,162,130, 58, 1,156,145,120,206, 69,213, +188, 5, 65,210, 97, 1,104,141,134,235,136, 57, 74, 96,141,234, 22, 67,100,184,231, 48, 4,155, 19, 37, 16, 12,193, 44,216, 54, +192,162, 60, 83,235, 44,246, 54,245,164, 8,212, 89,163,134,167,113,176, 30, 34,171,113, 8,152,109,243,183, 50,202,172, 81,214, + 17,208,245,197,241, 5,181, 4, 8, 7,116, 9,108, 73,159, 69,162,173, 13, 93, 91, 49,111,113, 69, 93, 78, 73,236, 3,175,253, +203, 56, 20,185, 80,185, 86, 7,207,196,119, 25,179, 93, 93, 90,125,230, 61, 67, 97,192,129, 84, 69,113, 44,140,200, 68,153,253, +184,238,133,106, 78, 87,160, 54, 30,168, 1,146, 18,181, 6,146, 89, 32,205,117, 37, 43, 33, 33,232, 57,138,118, 34, 45, 39, 37, +162,123,195, 42, 37,170,205,233, 66, 57,158,188,171,105,239,161,172, 4,102,125, 52, 97, 99, 68, 99, 65,130,213,124, 51,208,176, +234, 3, 4,156, 35,115, 37, 48, 26, 93,144,239, 41,209,242,134, 57,217, 16, 21,137,191, 41, 36, 24, 37,101,106,145, 12, 55,192, +246, 50,173, 30, 76,166,149,231,147, 50, 54,114, 21,103, 26,121,224, 54,187,175,177, 25, 11,206,246, 47, 64,181,114,254,125,180, + 54,224,229,142, 19,248,176,163, 69,110,194, 37, 65, 13,157, 48,229,165, 95,242,184,161, 64,203, 91, 95, 83, 33,240, 65,162,119, +214, 1, 43, 10,151,169,197,121,238,158,232, 36,113,115,153,242,178,119, 12,101,176,249,189,161,193, 65, 80, 11,162,159,184, 47, +154, 36, 35, 49, 81,100,136,235,144,183,170,101,108,232, 83, 41,224, 69,151, 62,247, 52, 8,129,147,200,120,110, 16, 69,221,204, + 53, 64, 65, 31,242,201,213,178,113, 66, 53,157,135,171,246, 96,230, 88, 38,125,192, 70,167,144,166,141,181,197, 67,229,111,135, +166,194, 6, 74, 10, 78,244,216,171, 3, 30, 50, 14, 37,213, 23,213,137, 87, 8, 77,139, 39, 78,149,152,110,250, 34,145,250,180, + 82, 14,187, 83,192,218, 1, 4,109, 74,251,172,172, 27,208,174, 97,111,235, 13,168, 76,183,201, 72, 44,194,166, 82,239, 11,246, + 52,170, 1,110,223,191,153,124, 35, 20, 16,234, 5, 68,166,117, 93, 38, 53,232,110,128,205, 30,149, 40,233,194,209, 22, 25,163, +254,117,206,182, 24, 20,105,210,205,177,198,120,195, 54,208, 90,225,160, 75,218, 17, 96,111, 33,251, 67,109, 64, 67,235, 16,110, + 96,246,111, 30, 96, 65,158,125, 94,139, 92, 68,104,254,250, 58, 42, 97,193,246,177, 17,198,236,119, 88,241,210, 43,209,141,118, + 17,106, 28,238,203, 6,226, 96,135, 42,157, 76,101,223,223,111, 81,187,220,168,220,135,146, 89, 23,214,126,125,244,165,111, 70, +155,190,139,187, 52,132,100,140,200, 74, 56, 1, 84, 21, 78, 23, 72, 17, 93, 76,232, 2, 99,240, 3, 84,181,218,213,234, 15,200, +216,215, 11,108,154, 56,198, 20,127,125,237, 90,177, 50,218,135,117, 89, 63, 19, 64,219,117,252,107,173,100,125, 80, 11, 30,153, + 28,142,164, 93, 66, 35, 40, 74, 28, 12, 59, 10, 65, 56,119, 69, 76, 24,187, 73,188,160, 81, 69, 55, 32, 75,173,123,129, 88,169, +133, 9, 93, 71,235, 60,120, 69, 12, 5,206,134, 35,197, 34,241, 10,246,195,176,245,190,209,174,143,222,215,133, 87,208,144,222, + 33,172, 96, 17,164, 36, 10, 12,195,129,234, 38,164,250, 30,102,227, 92, 1, 58,102,215, 57,148, 81,149, 79,214,218,169,163, 45, +215, 69,148, 53, 7, 59,219,148,169, 10,132,141, 73,128,134,184, 39,196, 85, 15,245,178, 77,126, 51,136, 57,187,248,192,156,112, +196,121,198, 1, 68, 37, 87, 56,154,202, 83,208,167, 25, 81,137,190, 34,155, 45, 33, 69,199, 73,182, 62,129,101, 10, 29, 50, 33, + 46,149,149,249, 70, 32, 58, 18, 61,162,232, 27,151,125, 58, 13, 38,186, 73,136,102,152, 5,110, 30, 33,208,205,132, 42,156,130, + 77, 30,188, 9,129, 52, 9,113, 27,132,175,217, 37, 44, 87, 34, 16,159, 82,245, 4,108, 66,177, 42, 9,178, 83, 32,235,218,178, +126,209,191, 28,175,171,230,166, 10,122,147, 45, 24,133,135,106,211,149,245,186,209,250,195,135, 1, 35, 28,124,100,131,151,109, +240,154,192, 9,146, 33,245,104,130, 81,197,164,222,117, 19,194, 77,173,245,181,101,157, 93,179,251,101,207,197,114,131, 3,126, + 49,242, 6, 74,104,115, 39,246,175,123,197, 48,141, 83,243, 72, 20, 12,225,141,161,109, 11,140,116,250,102,167,186, 17, 31,173, + 38,247, 66, 84,214,166,254,246,108,115,138, 14, 16, 59,210,122, 26, 21,179, 31,112,234,126, 50, 92,153,252,243,104,129, 21,193, +115, 82,117,250,102, 2,251, 87,238,172,184, 74,217,231,226,236,126,234,182,216,142,195, 78, 25,129, 96,246,155,167,177, 73,240, +196,225,247,238,158,213, 18, 54,187,246,222,102,101,190, 79,218,121, 48,118,183,109,124,203,170, 59,155, 87,184, 66, 69,214, 99, + 94,167, 62, 70, 97,100,115,167,220,109,248,223, 12, 48,136, 46, 5,102,136, 68,102, 24,127, 48,232,108, 37,229, 19, 16,104, 14, +172,219,196, 90,201, 56, 8,198, 4,143,122,224,147, 18, 52,163,102,209, 45, 0,248,176,245,168, 87,206,125, 51,154, 92,144,196, +180,241,251,185,138,164,152,233, 17,123,101,237,218, 26, 22,171,246,185,168, 26, 59,154,123,203,159,237,106,208,212,218,231,101, + 66, 41,200, 10, 31, 75,100, 29,179, 89,123,211, 69,215,205, 74, 48, 14, 49,114,160,182,208, 85, 99,208, 15, 47,243, 16,142, 9, +229,156,119,137,240,239,209, 77, 97,112,207, 79, 54, 26,105, 23, 98,183,234, 42, 69, 7,182, 40, 36,165, 29, 72,250,199, 63, 91, + 65, 0,163, 94, 36, 70, 85,242,152,210, 62,162,218, 20,191, 71, 88, 15,186, 21, 32, 28,109,175,153, 13,134,211, 30,149, 57, 8, +129,110,105,229,188, 79,136, 3,185, 16,246, 34,238, 45,199,130,107,195, 83,210,234,217,120,164,221, 19,166,180,247,226,196,214, +108, 90,105, 15, 96, 12,210,174,199,160,182,205,161,222,234, 34, 79, 11, 91, 81,154, 28,179,219,216,132, 80,184, 58, 14, 73,181, + 91,226,192, 85,208, 59, 64, 37, 70,161,133, 67, 68,169,247,184,232, 13, 81, 96, 51, 12,179,227,114,231,182, 67,185, 2,106,108, +205,218, 20,157,197,149, 2, 74,237, 85,133,104,235, 95, 89,249,232, 66,113,171,155, 14,135,175, 18, 49,135,196,184, 41,137,163, + 35,217,103, 39, 5,132,117,130, 26, 1,232, 28,200,126,126,138,208, 42, 44, 85,128, 96,148, 65, 24, 92, 97,230,231, 34,181,104, + 45,167, 8, 65, 66,228,164,172,128, 12,228, 98, 37,111,191,111,178,127,213,216,209, 72, 50, 50,241,150,120, 92, 97,219,236, 70, + 69, 93, 18, 33, 13,169, 92,122,128, 2, 17, 80, 1, 45, 66,133, 39, 76,148,123, 93,248, 2,211, 17,250, 75, 33, 0,196, 18,198, +102,132,151,116,221,237,104,213, 85, 10, 90, 87, 5,209, 32,230, 42, 91,107, 76,199,102, 46, 68,153,216,178,134, 21,145, 88, 71, + 71,104, 28, 48,198, 90,176, 85,239, 47,131,152,138, 49, 22, 16, 68, 60,230, 79, 47, 83, 40,120,123,247,118,226, 20,239, 29, 17, +171,106, 15,153, 20, 43,170,227,158,182, 1, 78, 37, 90,250,120, 10, 31,214, 30,192,211,130, 48,179, 32,151,189,192, 20,180,108, +178, 13,178,144,143,125, 24,170,173,126, 8, 41, 83,160, 73,173, 45, 94, 86,176,152, 13,199,181,158,192,238,103,155,176,181,183, +171,129,162,244, 64,214, 46, 76,123,192, 61, 63, 61,178,230,141, 66,199, 90,156,151,173,166, 73, 1, 86,211,159,131,185,134,205, + 83, 66,140,233,209,153, 58,107, 22,157, 27,123,137,128,217,236, 74, 31,243, 67, 46,115,130, 1,201, 42,148,199, 62, 55, 89,139, + 84,237,189, 56,198,122,242,202,211, 69,147,225,223,140,131,122,149, 32,164,185,112,179,228,188,116, 99,152,218,181,105,247,203, +188,131,150,126, 89,233,114, 74, 7,255, 52,212,167,141, 50,120, 58,232,215,161,214,221,168,190,218,231, 53, 85, 31,145,141,195, +189,249,168,171,199,201, 9, 58,121,116,243,240,208, 36,187,157,224,176, 62, 87, 81,255, 51,210, 50,194,234, 88,245,180,107,160, +156, 22,175, 91, 10,224,139, 11,116, 86,173, 50, 47, 49, 50, 41,171,184, 94,244,181,143, 80,161,113, 32, 68, 16,142,232, 70,236, +226,191, 73,187,201, 29,173,186,139,214,187,160,233, 70,215,160,246, 12, 86,162,217,100, 99, 16,193,170,177,104,254, 60, 21, 25, + 35, 12,140,116,141,235, 27,136,223, 10, 22, 65, 81, 59,160,200, 72, 72, 75, 96,164,222, 21,152,225,217,168,105,108,234, 26, 43, + 0,169, 97,174,137, 17,235,108, 77,159,156, 53, 82, 60, 81,177,171,236,193,141, 19,156,164, 28,195, 45,192,151,200,220, 22,232, + 46,170,214,198,199,140, 84, 66, 88,137,232,241,202,126, 8,104, 5,212, 80, 21, 50,136, 84, 64, 12,177,206, 67,155, 10,228, 71, + 67,123, 51, 80,131,156,196, 93,177,217,129,224,140,101,181,105,235,108,200, 79,217, 0,171,199,116, 34,244, 66,211,138,172,181, + 26,216, 51,115, 8,250, 60, 27, 28, 95,107, 68,159, 74,226, 88, 51,102,155,186,194,148,112,106,205, 0,200, 84,170, 83, 18, 2, + 79,226, 45,247, 20, 30, 81,130,199, 34,144, 40,132, 74,127,130,179, 26,121,101, 92,114, 30,180,181,122,221, 98,163, 85,105,138, +102, 29,167,183,170,215,123,226,225,157, 44, 48,179,182,195,219, 70,207,133,197,211,250, 40, 41,188, 5, 41, 89,168, 11, 40,170, +186,111,115,187,105,156, 82, 45, 39,216,113,241,237,129, 44,195,122,225,116,182, 82,250,125, 36, 43,234,125, 41,188, 90, 92,216, + 43, 52,242,123, 79, 64,205,173, 69, 32,103, 50,252,164, 81,140,163,114,155,198,226,166, 11,162, 20,116, 15,228, 57, 38,166, 70, + 49,140, 74,236,192,231, 97, 22, 5,114,164, 11,218,167,172,221, 56,173, 56,182, 43, 16,140, 64, 51, 41,197, 0,140,159, 57,233, +236, 60, 34, 46,241,160, 19, 73,108, 5,137,116, 84, 18,149,207,172,129, 5,162, 91,205, 26,196,189,109,172,115,105,120,239,237, +115,236, 80, 11, 21, 89,133,152,212, 54,215, 26,156, 9,201, 30, 93,111,107,249,181,138,195,158, 51,174,129,111, 48,236, 82,104, + 11, 19,176,171, 86, 8,255, 97,111,175,118,234,153, 29, 95, 11,150, 98, 51,164,122,105,119,130, 15,162,130,229, 21, 43, 28,219, +217, 2,157, 7, 19, 27, 18,132,126, 56, 47, 93, 97, 39,166,147, 81, 5,252,104,133,235,230,132,243,233, 85, 3,195, 28,130,147, +241, 6,252, 71,215,100, 57,179, 3,140, 0, 3,191,233, 41,186,167,191, 29, 30,160,155,214,158,151,170,218, 6,210,248, 79, 46, +145,222, 70, 96, 57, 36,132,103, 21,128,226,208,232,102,249, 28,219, 5,114,195, 19,223,239,207, 89,198,104,196,188,226,192,186, +247, 81, 99,251,187,187,217, 21,228,165,112,178,252,149, 41,148,252,189,114, 87, 27,151, 29, 72,134, 48, 84,122, 53,236, 24,237, +136, 86, 28, 29,154, 42, 94, 45,215, 46, 10, 27,115,239, 34, 41,181, 2, 41, 36, 62,122,237,247, 79, 43,160,218,193, 87,176, 90, + 94, 29, 50, 25,178, 4, 36,242, 45, 4,245, 30, 8, 86, 50,236,183,123,233, 5,248, 26, 26,197,219,239,231, 26,106,118,102,208, +109,217,136,165,228, 0, 40, 9, 91,171,104, 7,175, 91, 0,219,215,235,156, 71, 44, 41,161,180, 52,161,220, 52, 78, 46,164, 39, + 77,216, 96,121, 5,139,225,146,103,169,198, 9, 39, 1,133, 48,175,178,153,121, 21, 87,178,246, 77, 99, 30,139, 69, 27,226, 66, +147,124,222, 4,113,172,226, 23,141, 32,141, 45,251, 36, 33,137,141, 87, 57,190,230, 51, 46,241,161,162, 82,143, 25,213,178, 64, + 28,130, 74,194, 55, 47,187, 41, 0, 88, 33,104,213, 4,154,151, 0,193,173, 10,136,129,204, 82, 33, 24,252, 97,130,178,200, 24, +183, 19,105,130,179, 96,147,129,130, 49, 80, 24,208,183,186, 64,215,181, 47,220,207, 85,156,200,118, 5,196, 73, 12,222,232,146, +218,214,250,145,110, 1,139,105,106,243, 41, 20,241, 27,189, 97,251,173, 45, 2,144,151,162,222,239, 80, 99, 50,228,132,179, 42, +191,109, 20,130, 91,183, 76,118, 72, 40, 94, 89, 49,102,124, 20, 93, 60,213,223,221,103,125, 46, 61,166,240,139,178, 10, 16, 41, + 28, 30,156,170, 60,142, 3,161,109,144, 43,120,137, 43,176,153,221,186,196,171,251, 32, 17, 13, 41,127,191,207, 79, 75,217, 11, +245, 40,133,247, 20,244,177, 40,112,192,123, 28,172, 98, 85, 6,103,173, 7,175, 96, 61, 98, 89,212,129, 58, 29, 36,201,154, 20, +217, 30,211,235,227, 50,113, 64,134,111,152,150,238, 70,192,110,199,212, 58,175,250, 96,179,235,237,124, 61, 90, 90, 21, 43, 35, +235,186,129, 66,138,126,110,197, 90,235, 20,126,105,102,138,148, 68,235, 12, 20, 75, 8,132,244, 47,155,151, 35,147, 66,159, 1, +239, 94,244, 54,250,168,164, 75,201,160, 29,118, 63, 51, 28,172, 13, 57, 88, 85, 72,216,198,143,106,133, 11, 43,159,185,131, 74, +172,107, 27, 78, 73,120,163,240,176,241, 68,113,129, 89,239, 22,244,247,184, 9, 5,190, 61,147,117, 3,154, 14, 2,117, 60,193, + 33, 80,217,236, 82,125,225,247,208, 17, 21,144,182, 17, 65,239,128, 77,227,123,171, 90,248,108,188, 97, 98,201,177,209,139,175, +117,193,150,111,221, 30,219,240,107,255, 57,189, 85,207,234,249, 70,134,189,136,195, 87,138,106, 38, 12,100,206,122,128, 21, 61, + 52,213,106,144,158, 73, 59, 92,236, 86, 51, 39,168,149,226,221,149,109, 35,241, 89,139, 0, 99,183, 61, 21,110,220,119,243, 60, +251,236,189, 23, 15,106,247, 20,198, 53, 50, 44,218,209,245, 1,138, 35,141, 3,133, 39,162,217,181, 4,239,211,136,122,229, 0, +234,232,202,191,105,252,120,189,127,200,177,202,235, 49,180,117, 45,139, 23, 44, 12,227,141, 1,180,153, 18, 70,151, 65,160,205, +144,109,191,124, 50,179, 87, 67, 67,109, 29, 54, 4,222, 99, 13, 95, 16,123,170, 25,177, 12, 84,155,178,162,170,153, 80,166, 40, +122, 17, 83,205,176, 90,147,149,193, 3, 45, 93, 9,229, 88, 41, 98,189, 64,221, 24,116,177,125,190, 59,187,175,158, 51,109, 76, + 96, 54,158,215,212,120,192,101, 29, 61, 41, 43,239,113,174,214,236,253, 87, 89, 7,215, 0, 35, 27,211,228,160, 46, 55,154, 95, +202,228, 6,245, 39, 99,148, 44,101,149, 47, 51, 82,213,132,202, 42, 16, 57, 70, 43,182, 32, 86, 13, 76,152, 20,242,176,194,211, + 2,197,168,152, 29,103,249,123, 91, 98,183, 8,118, 81, 28,187, 85, 65, 65, 10,236,158, 82,219, 56, 39, 5,176,218,198, 82, 64, +248, 87,152, 35, 85,205,138, 92,173,198, 10, 84, 26, 49,214,225, 11,194,124,128,206, 86,134, 2,184, 56,253, 42,179,206, 3,185, + 72, 30,234,227,134, 69, 6,189, 0, 72,178, 45, 53, 78, 16,251,105,239,133, 35,195,220,148,246, 65,242,131, 17, 3, 28, 10,146, +143,155, 57,111,240, 12,179, 78,206, 17,141,222, 53, 90,113,184, 25,201,103,253,122, 78,206, 24,231, 74, 43,207,124,176,188, 13, + 37, 85,124,174,203, 17, 81, 91,121,173,139,245,247, 37,240, 26, 61, 94,147,141, 55, 1,144, 28,197,198,246,235,147, 2, 83, 56, + 58,204,211,228,179,239,238,181, 5, 92,105,242,119, 42,219, 91, 0,254,232,119,184, 68, 62,122,116, 57, 33,174,173,196, 34, 90, + 69,128,200, 24,131,178,138,138, 80, 10, 0, 72, 87,120, 84, 84,227,234, 70,118, 62,247,197,184, 56,104,131, 2,137, 26,208,129, +192,203,212, 89,187, 79,220,231,212, 93, 76,167, 7,143,254,223,162,249,224, 78,206, 28,255,111,204,184, 71,139,187, 32, 7, 68, +108, 99, 12, 75,154, 37, 60, 26,156,203,121, 34, 46,150,211,119, 59,145, 31,106,194,237, 82,156, 11,192,138,112, 13, 18,221,248, +125,211,102,138,184,217, 58,174, 67,175,192,219, 38, 63, 71, 80, 85, 31, 35,180,247,185,219,197,117,175,226,218, 4,242, 61,103, +211,175,199,188,107,239,115,227, 97, 66,189,154,159,107, 28,178,121, 8,218,230,221,232,202,204,117,176,209,217, 58, 27, 38,192, +174, 17,206,213,219,240, 86,105,206, 58,158,176,131, 26, 87, 63,123,216, 24,162,127,127,141,125,197,227,170,189,193, 91,146,144, +111,192, 99, 34,227, 99, 3,222,116,209,131, 93,193,160, 31,208,183,136,117, 88,171,145,200, 37, 66, 94, 0,103,222,237,188, 27, +208, 78,248,215, 57,181,223, 17,187,185, 57,152,134, 29,160,163, 59, 65,136, 52,133, 76, 57,181, 92,189, 85,154,192, 43,213, 79, + 54, 12, 98, 16,175, 32, 37, 82,189,176,221,103, 54, 40, 33,220,236, 97, 35, 66, 44, 45,195,129, 3,219,180,107,207, 53,248, 0, +153,177,222,183, 69, 74, 63,198, 25, 99, 30,117, 49,175,121,118, 30, 31,166,128,106,190,164,153,114, 93, 37,129,197, 7,103,148, +179,220, 18,247,235,100,166,233,106,204,139,234,179,181,162,176,132,252,230,130, 73, 93, 82, 66, 18,129,186,187, 64, 23, 35,200, +108,133,203,138, 14,144, 3,119,216,219, 62,197, 59, 3, 56, 49,240,197,161,138,118, 81, 98,129,107, 93, 30,123, 77, 83, 9, 17, +222, 30,112,196, 14, 42,197, 54, 17,214,141,123, 10, 63,188,182,217,172,250, 44, 37,130, 93,250, 58, 32, 97, 54,231,178,194,148, +218,198, 65,209,149,240,121, 56,173, 90, 25,156,124,138,107,150,108,188,232,194,169,229,150,224, 48,192,246, 38,244, 74,151, 85, +186, 88,129,164,172, 18,177,189,172,194,212, 49, 59,215, 3, 18, 8,196,246,137,119,140,142,153, 68,159,227,224,132,166, 40, 34, + 23,117, 78,112, 32,237, 65, 22, 48,127,100,196, 55,227,156,151, 2,216, 2,223,231,130,170, 2, 94,125, 86,161, 30,115,142, 74, + 53,213,151, 19,184,176,103,175,237,244, 62,156,213,141,175, 78,206, 23,144,181,248, 78,255,142,103, 19,232,245,108,162, 60,145, +200, 88,112, 68,170,147,237,196, 15, 67, 54,147, 45, 17,100, 49, 14, 92,166,154, 15,116,138, 35, 75, 25,209,178,142, 79,157, 20, +173, 93,252, 0,154,102,128,160,230, 30, 66, 74, 93,255, 74, 20, 10,237, 71, 84, 9,122, 99, 7,188, 84,157,193,151, 16, 17, 79, +211, 70,215, 46,113,241, 20, 3,141,206,194, 67, 92,100, 89,204,198,169,218, 7, 61, 57,217,193,181,181,193,121,155, 99, 72,227, +144, 60, 15,231, 89,149,136,190,182,207,185, 26, 73, 80,220,141, 17,127,215,188,229,170, 20,175, 49,251, 29,191,103,231,163,185, +121,214,246,191,222, 19,109,254, 30,218,150,226, 45,233,121,183, 11, 78, 2,136, 20,227,128, 57,235, 8,103,214,103,113, 26, 66, +184, 18,210,105,140,101, 30,215, 21, 68,133, 66,106,251,227,248,204, 44,167,220,242, 27,128,190,105, 33, 77, 62, 86, 50, 81,170, +217, 51, 57, 88, 43, 67, 72, 41, 41, 58,218,128, 99,166,244, 23,179, 97, 23,139, 37, 96,152,239,107, 50,164,118, 77, 70,245, 62, + 43, 55,165,130,230, 77, 53, 7,192, 84,233,154,168,221,233,211,177,157,148,161,172,109, 85,219,164, 15,164,104,110,107,209, 69, +116, 20, 93,138,195, 75,229,176, 85,143, 53, 87,212, 18,115,227, 52, 43, 54,122, 86, 5,143, 38, 42,145,177,111, 45,136,120,180, +215, 33,208,178,231,228,255, 75, 84, 60,104, 19,251, 3,205,154,128, 83, 98,145, 17,137,156,107, 15,177, 23,129, 4, 31,222,235, + 90,120,107, 73,178,106,158, 1,236, 32, 50, 90, 91, 46,116,130,228, 53,108,237, 7,220,166, 56,226,208, 55, 85,152,255, 9, 48, +209,109,225, 19,245,169, 34,143,157, 86,249,212,178, 90,172, 99,142, 84,246, 91,206, 24,232, 96,232, 4,102, 16,167, 21,104,125, +114,228,139, 23, 74,148, 43,219, 40, 39,115,173,235,131, 92, 24,223,190,109, 6,148, 82,246,130,153,110, 39, 87, 21,200,249,230, + 98, 63, 39,130, 30,132, 99, 44, 19, 22, 10, 89,229, 67, 91,198,252,190, 95, 81,192,230, 18,237,255, 53, 29,145, 97,190, 14,128, + 23,243, 74, 67,197,237,144,162,137,163, 99,161,167, 64, 54,255, 31,144,215, 68,157,215, 92, 70,183,166,216, 38, 70, 32, 54,195, +136, 93, 75,172,163,224,186, 71,135,133,215,142,204, 24,117, 73,182,115, 98, 65,107, 22, 56,193,138, 85,144,122, 87, 32, 93, 78, +171, 81,101,231,230,192, 31,155,181,110,247,108, 69, 2,201,128, 99,227, 25,202,225,126, 93, 54, 20,157, 38,206,247, 33,242,210, + 49, 19,160,185, 11, 24,146,211, 72, 66,125, 76, 18, 66,193,186,202, 16, 88,139, 50,199,204,187,194,117, 2, 78,134,227,109, 57, + 3,163, 55, 67, 65, 79,154,132, 38,110,213,164, 52,178,114,134, 70, 74,125, 24, 84, 63,166, 64, 49, 71,142, 59,104, 32,108,153, + 45, 25,112, 53, 14, 67,164,133,128,250,207, 39, 69,123, 75,248,196, 89,225, 53,211,196,201,168, 80, 37,171,230,171, 70,145, 38, + 55,175,194,102,252,222,168,112,253,205,217, 84,141,166, 87, 67, 20,216, 90,233, 59,163,223, 53,133,246,214,219,240, 49, 13,148, +136,109, 22, 19, 27, 71,241,100, 99, 70,171,234, 69,131, 90,236,115, 48,241, 31,219,200,152,198,248, 36,170, 86,241,136,216,208, + 82, 76,206,102, 24,211,157, 50, 66, 94, 28, 11, 44,250, 58, 43, 80,254,198,104, 33,242,212, 99,206,221,206, 64, 50,230,148,203, + 97,165,186, 3,160,125,161,152,191, 86,175, 73,133,232,219, 93, 75,123,107,123,173, 58,115,108,173,174,186,114, 78,102, 23, 37, + 64,210, 54,221, 3,197, 65, 66,141,145, 99,172,160,133, 80, 85,109, 73,247,176, 28, 44, 23,230,244,228,100, 41,243,183, 52, 29, +180, 63,220,234,102, 20, 22, 35, 43,102, 54, 64,105,196,135, 24,145,178, 73,112,196,200,222,134,120, 77,100, 98, 59, 83, 61,148, +117,198,175, 22,240,102, 11,168,207,189,101, 14,185,220, 99,167, 38,218,167,182,139,110, 16,161, 14,103,104, 78, 35, 69,203, 69, +125, 32, 59,155,214,173, 78,184, 49, 83,178,148, 83,153,226, 96, 16, 17,181,240, 19,189, 11,160,167,125, 63, 73, 15,209,226,166, +132,152,170,192,166, 34,160, 63,168, 66, 73,177,137, 97,107,147,207,154, 9, 98, 13,107,136,181, 68, 18, 80,199, 22, 33, 95, 12, +146,181,192,132, 89,150,237,108, 76,242, 2,193, 36,121, 3,181, 57,104,241,153,112,129,223,171,200, 83,142,108,110, 46, 96,169, + 19, 78,194, 42,187,129, 89,243,136, 17,183, 59,102,247, 37, 54, 35, 51,142, 10,165,202,220, 57,123, 98,240, 14,201, 34, 49, 14, +240,141, 29,152,188,221,238, 92,133,146,108,151,182,185,247, 91,206,105,112, 81, 17,148,149,216,193, 15,174,137,171, 91,224, 48, +170,142, 1,237,122, 20,155, 31, 98, 44,105, 90,136, 49,183,158,147, 21, 7,103,221,104, 5, 93, 13,108, 98,148,134,233, 20, 2, +121,235, 8,203,135, 32, 26, 19,230,133, 14,160,132,210, 31,230,253,200,138,112,229,112, 9, 65, 79,252,187, 4,123, 28, 88, 15, +118,111, 85, 64,209,146,112,234,212, 21,202,121,234,104,194,193,255,141,104, 76, 73,252,122, 63,128,184,223,186,248,204,116, 8, +226, 40, 11,126,197, 8,101,213,243,230,101, 50,186,226,198, 91,123,109, 67,179,195,155, 85,231, 14,123, 16,181, 63, 89, 87, 7, +108, 98,181, 66, 6,129, 77, 28,204,134,101, 29, 22, 63, 92, 79,158, 7,225,132, 50,207, 64, 24, 27,160, 71,211, 82, 68,189,218, +193, 37,220, 30,209, 21, 48,209, 95,124,150,113, 31, 87,115, 60,184,121,218, 58, 4,165,207,232,197,219,245,250,222, 13, 44,100, +197,153, 89,234,219,253, 82,213, 78,167, 66, 60,251,157,237,128, 52, 83,248,194,197,146,202, 60,131,161,120, 53, 27,158,253,112, + 27,181,107, 52,121, 17, 89,193, 57,162,218, 10, 23,104, 7,219,127,166,217,153,245,165,179, 5,170,119, 35, 68, 0,131,229,235, + 3,185, 80,114, 28,102,120,149, 76, 55,121, 46, 60,129, 77,186,127, 94,101,116, 90, 54,205, 49, 99,157, 7,125,175, 21,238, 69, +195, 39, 91, 21,131, 25,133, 49,138, 84, 59, 93,119,247, 20,119, 84,244,246,187,204,103,221, 86,186, 45,154,201, 42,227,133,110, + 45,208,189,187,108,170, 39, 68,111, 96, 99,138,181, 68,246,100,232,222, 74,215,197,172, 48, 39,239,165, 34,170, 32, 16,196, 46, + 26,110,222, 89, 76, 96, 11, 69, 1,172, 97,153, 24, 42, 15,108, 27,179,218, 9,106,226,126,115, 58,113,199,129, 66,214, 64, 25, + 80,202, 78,133,247,196, 13,198,138, 70,207,187, 9,155, 92, 96, 37, 74, 37,115, 56, 69,180,192,135,112,140,252,228, 91,197, 22, +147,128, 27, 97,226, 12, 23,180,155, 68,119, 33,113,180, 57,192, 46, 86,185,180, 27, 98, 91,216, 71, 73, 72, 55,235,110,185,169, + 68,172,174, 88,123, 47,232, 95,238,245,149, 76,151,139,150,176,105, 0, 52, 53,139, 71, 59,168,207,201, 27, 20,101, 59,249,166, +205,112, 29,217,152,229, 37,242,145, 93, 92, 86, 2, 33,202,179,138,193,166, 24, 87, 68,224, 11,164, 72,169,223,181, 9,120, 98, +166,133, 56,109,142,208, 14,157,213,219, 65,207,231,191, 30,166, 2, 92,247,194, 40,155, 6,113,156,182,231,148,170, 86,124,166, + 14, 55, 46,248,221,165,144,147,204,144, 19,239, 17,222,118, 61, 11,104, 31,192,195,142, 97, 68,142, 10, 37,132, 41,144,218,105, + 80,228,102,135,225,124,175, 39,226, 32,160,125,115, 45, 9,118,142,130,170,133,252, 44,140,205, 75, 23,208, 57, 94,159,216,172, + 2,145,205,186,243,120,213,168,237, 97,118,168,136, 17,182,176,186, 42, 49,159,156, 98, 19,100,224,147, 48,166, 11, 10, 60,159, + 32,194,156,128,197,143,125, 92, 76,142, 99,160,100,101, 92,109,116,205,236, 65,236,183,162,130,101,172, 18,235, 47,191, 85, 97, + 27,179,176,233,166,163,100, 52,211, 1, 76,206,194,210, 53,208,108,122,101,252, 76, 95,234,186, 46,164, 64, 7,146,193,207,173, +152,108,195,157, 82, 92,144,234,161, 35,129,140,150, 96,189, 66,158,123, 73, 7,248, 10, 44,115,127, 30, 75,241,106,115,144, 4, +237,115,178, 98,102,118,139,227, 8,103,105, 63, 96,214,129,234,212,175, 71,221,137, 90,239, 70,245, 60, 24, 29, 59,218,157,159, +249, 1,124, 82,219,106,157,107, 26,213,186, 35,162,134, 8, 41,216, 34,165, 59, 74, 77,145,111, 44,232,241,109,147,190,247,234, + 72, 88, 44,178, 48,198,214, 70, 26, 82, 45,104, 72,215,110, 30, 7,143,134,199,222,205, 51, 96,194, 77,128, 57, 14, 24,157,218, +167,180,200, 30,196, 90, 67, 8, 88,245, 96, 96,201,147,198,232, 16, 40, 52, 12,250, 52,220, 12,179,146,255,180,194, 55, 34,106, +137,121,123,196,238, 86,255,252,145,187,177,217, 76,227,244, 51, 54,241,229,107,187,185,163, 62, 75,149, 8,222,176,106, 9, 32, + 11,224, 54, 72,180, 54,239,204, 20, 83,205,136,183,109, 29,236, 34,120, 90,151,128,173,176,172, 54,207, 64,173, 50,240, 99,125, +230, 40, 25,214,206,128,121, 53,205,108, 97,251,128,160,229, 45,102,235,128,184, 83,215,186, 25,118,111,240,173, 39,111,223, 72, +178,229,224,204,207,172,126, 5,218,181, 85, 25,193, 27,171, 84,251,169, 94,252,103, 91, 50,211, 24,165,241, 56, 44, 89, 14, 8, +180, 71,153, 32,189,147,242, 98, 99,205,158,137, 35,200, 99,163,155,232,176,143, 96, 86,112,120,120,189, 67, 81, 67, 76,199, 94, +226,143,150, 98,255, 29, 7,218, 15, 61,215,193,127, 59,145,151, 16,252, 52,209, 12,250, 90,141,166, 70,106,195,105, 27,250,116, +208,248,238, 91, 31,223, 68,155,155, 35,112,194,253,183,186,136, 52, 91, 75,171,118, 54,131,168,230, 80, 34, 67,147,246,170, 69, +171,160,118,255,130,141,164, 42, 4,194,232,121, 46,156, 51, 70, 60,224, 5,114,107,222,176,171, 5, 14,173,193,212, 23, 56,117, +135,128, 30, 82, 2, 73,163,113, 81, 57, 47, 33,232,100, 80,155,226,140, 86, 64,100, 87,113,184, 51,129,127,215, 99, 27, 57,111, + 62, 20,138,119,139, 10, 70,226, 33,164,202,131,206,130, 87,193, 33, 97, 79, 99,128,191,176,183, 36,203, 74,236, 89,178,184,207, +227,194,160,219, 70, 16,159, 76,156, 2,215,217,230,251,150,134, 38, 51,152,215, 36,197, 49,143,234,125,142,180, 58, 96,117,123, + 60,180, 80,210,217,228,144, 17, 3, 10,173, 56, 20, 73,184, 74,174,178, 31, 11,244,178, 22,110,135, 80,239,252,252,124,180,185, + 85, 60, 53,107,207, 53, 70, 98, 1,150, 98, 47, 72,217, 85,250, 93,208,213,212,236, 74,154, 74, 61, 19,216,104,253,120, 81, 60, +241,152, 44,181, 44, 14, 79, 53,188,238, 90,172, 4,187,220,202,146, 18,213, 53,210,228,156, 79,129,136, 90,197,228, 42,243,192, +186,139,110, 49, 67,208, 88, 29,228,188, 14,235, 89, 9,147,251, 90, 33,241, 26,139,137, 67,219,255, 59,223,185,248,208, 73,192, + 59, 45, 2,250, 70,172,208,177,217,194,106, 44,191, 19,186,190, 85,146,107, 67, 36,208,187,227,106, 71,196,112,115, 14, 24,203, +140, 74,206, 70, 65, 80, 22,187,143, 6, 36, 75, 37, 11,153,139,229,150,207,102, 71, 51,219,100,113, 71, 77,255,124, 38, 13, 37, +210, 17, 75, 1,148,119,183, 2, 58,127, 99,210,253,105, 56,128, 68, 15, 56, 77, 20,218, 65, 72,186, 55,246,251, 69, 15,122, 93, + 20, 72,102, 57,183,248,102,163, 71,178,119,101,120,149, 3,187,217, 42, 51,180,104, 91, 99,187, 44,162, 27,109,155,216,226, 45, +142,252, 28, 98,178, 9,222, 20, 49,173, 42,112,142, 42, 93, 2,178, 95,156,165,206,105,222, 78, 54,150,131,121,129,128, 96,194, +149,153,100, 45,214,129,198, 43, 98,226, 8,241,240, 16,244,102, 38,187, 81,129,195,121,205,214, 26,134, 89,101,234, 52,200, 42, + 21, 70,198,124,170, 85, 25,109, 79,153, 97,115, 45, 48,195, 21,244,120, 19,148,196,170,198,110, 85,115,237,109, 42,125, 14,166, +104, 57, 78,133,227,102,146,136, 28, 45,202, 14,142,170, 75, 32,105,168,120,110, 48,235,105,182, 3, 87,138,244, 13, 81,180, 68, +183, 7,178, 0,142,212,168, 81, 86,209, 88,123, 91,124, 1, 81, 13,195,193,192,105,210,214, 22,219,201,133,105,237,119,180,205, +189,199, 56,106,143,175, 45, 12,211,242,127, 75, 1,216, 67,251,203, 29, 99, 26,179,218,241,251,108,254,183,141,141,167, 28,141, +164, 44,181,221,248,226,189, 29,162,166,142, 65,109,202,227,162,214, 40,163, 97, 44,191,179,244, 69,166, 58,184,133, 20,252, 98, +201,103,130, 33, 17,232, 23,135,135, 62,216,180, 96,245,171,129, 55, 19,135,198, 96,112,142, 86,253,171,136,210,212,250,113,228, +103,136,219, 42,192,101, 40,133, 5,141,141, 74, 24, 98, 53, 13, 3, 10,155,250,216,124, 75,168,244, 81, 4, 70,251,176, 38, 76, + 77, 75,102, 91,235,184, 9, 70,131, 74,110,220,123,208,135,233, 88,138,219,134, 76, 4, 40,171,204,136, 16,150,141,191, 91, 5, +168,133,253,209,152,160,203, 63, 42,154,130,228, 50, 10,128, 7, 1, 61,205,143, 43,133, 32,254, 50,108, 79,235,110,156,179, 12, + 86,100,179,182, 0,238,118,213,195, 87,218, 56,231,143,190,251, 3,122,240,232, 62,125,246,229,231,232,229,231, 95,238,162,173, +208,105,140, 92,110, 27, 71,120, 53,174,125, 96, 81,133, 55, 89,100,105,219,104,218,127, 91,156,166, 34, 34,113,198, 47,138, 44, +166,115,240,199,211,154,172, 25, 21,157,171,138, 44,115,212,217, 63, 59, 63,148,246,223, 23,156,209, 80, 78,187,142,105, 28,206, +235,249, 78, 15, 20,186, 16,215,209,113,240,106,249,124, 23,157, 2,201,173,190,254,247,105,134, 50,106, 32,129, 43,128,183,132, +193, 49,178,211,185, 56,205, 14, 23, 34,240,139,147, 10,196, 48,218,201, 33,104,110, 87, 36, 79,213,179, 57,126, 85,132, 50,131, + 30, 67,118, 2,202,245,145, 72, 56,212,245,228,157, 69, 23,166, 65,108,108, 63,164, 56,183,161,130, 42,125, 86,255,253,166, 23, + 55,136, 73, 23,181,135,118,154, 96, 87,237,239,128, 90,103,248,250,185,191, 12, 31, 45,232,166,207,231, 42,136,155, 54,190, 71, + 21,112,177,116,219,103,251,217, 6,203, 89, 54,224,121, 62, 31,212, 62, 27,131,241,112, 2,116, 72, 79,155,169, 31, 40, 97,203, + 59,134, 37, 82, 49, 54,118,146,208,141,161,148,216, 36, 45,203,185, 16,167,168, 86,140, 48,213,112, 57,111, 59,184,242,151, 1, +112,162,162, 0, 66,184, 69,130,176,139,123,154, 45, 93,105,227,190,215, 18, 74,103, 77,246, 26,112,173,104,103,187,117, 78,187, + 3,237,115, 45,218,118, 53,113,174,141,150,134,133, 74, 43,136, 58, 54, 46, 3,150, 86, 83, 36,106,133,191, 17, 78, 4, 56,198, +170,198, 78,254, 72, 83, 52, 11, 80, 19,142, 76,209,117,192,153, 93,181,244, 0, 48,185, 91,235,190,117, 84, 98,166, 12, 51, 39, +136, 64, 37,137,128,156, 82, 74, 48,130,183,203,191,183,147, 95, 63,116, 4,112, 45,105, 54,219, 95,247,134, 99,150,172,179, 38, +209, 89, 97,204,150,150,251,230, 96,171, 7,128,221,120, 88, 45, 96, 98,185,103,170, 69,134,182,192,160,205,176,178, 53,219, 11, + 1,120,131,116,174,215, 31, 78,107,229,170,197,105, 0, 70,138,122,113,103, 79,242,234,159, 89,171, 8,142,167,209, 26,227,241, +245, 58, 67, 88, 71,155,213, 41,112,198, 69,125, 76, 96,107,138,249,190, 64,101,105, 45,190,154, 83, 8, 86,217, 5, 53,188,235, + 62,247, 69,161, 13,129, 88, 49, 67, 40, 28,185, 74,171,224, 14,165,151,217,188, 52,230, 64,186,192,152,133,147,102,240, 81,136, +139, 68,209,166, 41, 85, 32,242, 23, 42,216, 74,217,143, 42, 32, 40, 68,236, 17,175, 2, 23, 80, 24,229, 99, 1,152, 49, 26,125, + 17, 1, 50, 20, 72, 95,119, 43, 88, 39, 73, 59, 87,179,163, 61,139,182, 72, 85, 49, 61, 21, 23, 51, 89,199,201, 22,252, 2,236, +125, 11,132,194,131,147,139,147, 84, 64,105,217,238, 78,104,131,206, 94,123,142, 63,188,123,159,126,255, 91,223,163,207,188,112, + 68,219,227,171,244,222,221,167,244,244,209, 67,122, 66,199,203, 2,253,128,174, 95, 57,105,178, 38,122,241,185, 87,179,192, 21, + 91,224, 19, 32,114,204, 63, 88,129,126,214,123,112,187,241, 62, 76,141,110,254,252,194, 0,232,146,208,201,168,107,102, 56,126, +204,173, 35,126,175,160,229, 54, 0,227, 54, 75,159, 99,246,123, 30, 81,172,160,150,213,142,196, 14, 85, 21,122,240,208, 79,120, + 10,171,155, 56,187, 62, 98,112, 69, 71, 13, 99,108,190,209,100,184, 1,227,153,245,195,137,204,251, 18,151, 95,106, 36, 1,114, +140,200,236,152, 91, 29,198, 19,213,191, 56,123,190,246, 54,119,183,197, 85, 1,113,159,117,241,102,157,185,131,253,217,252, 7, +106,147, 27,223,111,154, 8,165, 62,114,245,209, 89,181,231, 39,224,127, 90, 88,149, 14,227, 16, 61,192,197, 8,118, 30, 46, 42, + 9, 84,113,191, 20,198, 33,208, 25,123,245,255, 86, 8,143,174, 63, 22,233,204, 46,202,179,176,152,162,162,192,112,193, 12,141, +130,169,135,237, 80,184,124,159,182,155, 11, 56, 84, 54,219,166, 76,180,135,174, 77,213,251, 41,195, 8, 57,193,152,181,189, 55, +204,250,213, 55,145, 94, 39,179,141, 35,216, 69,110,123,185,213,100,230,252, 41,103,157, 19,110, 42, 33, 9,183, 83,151,229, 92, +155,147,163, 0, 88, 35,148,224, 97,189, 27,109,172, 80, 71, 90,203, 49, 34, 66, 99,182, 81, 38, 80,190,235, 34, 54,105,244,101, + 81,160,201, 72,228,137,170,210,196, 62, 81, 81,135, 87,185,159, 16,150, 15,100, 8,224, 86,226,138, 50,152,193,172, 66,177,126, +173,166,173,251, 98,177,189,104,215,165,168, 47,180,170, 7,212, 22, 61,247,124, 42,130,178,147,218,166, 77,175,210, 61, 80,164, +159, 94, 99, 30,230,152, 83,235, 96,232,134,234, 98,161,102,101, 60, 56,128,212,172, 40,151,250, 3,213,238, 13, 93,249,139,158, + 20,219,195, 68,203, 1,104,179,209, 64, 17,245,211,122,199, 85, 15, 35,227,186,232,195,172,243,116,214,216,213, 46,229,152, 59, + 55,118, 89, 36,199,162,213,103,108,108, 94,216,241,179,219,175, 26,122,161,210,255,204, 22,152,246,243,203,116, 0, 46,137,156, +168,231, 15,133,104,139,174, 86, 8,175, 97,221,200, 85,249,158,238,175, 61,241,120, 74, 21, 66, 23, 92, 89,117,122,176, 5, 76, + 0, 31,242,140,132, 82, 92, 59, 82, 72, 82,218, 97, 84, 68, 90,133,115, 89, 37, 8,114, 18, 11,162,132,159, 1,148,151,132, 88, + 5,103,209,146, 56, 7,225,121,135, 65,187, 37,223,136,138,118, 76, 65, 14,118, 62,180,229, 73,132, 65, 64, 84, 37, 94,147, 81, + 85,125,231,221,155,116,239,238, 77,250,233,215, 63, 79,151, 15,143,220, 70, 38,160, 11, 24, 34, 32,142,145,136, 0,230,213,222, +237,148,125,164,161,128, 47,254,249,159,237,206,233,112,123, 48, 68, 94,160,145,233, 20,197,229,254,249,202,119,191, 79,191,241, +149,111,209, 79,189, 60,170,184,247,239,111, 59,204,228,231,126,230, 39,233,228,116,166,247,110, 63, 89,254,198,125,122,237,213, + 79,199, 33, 4,186,120, 2, 42,115,239, 10,105,151,171,214,201, 67,112, 88,153,235,165,206, 33,202,117,220, 41, 52, 81, 38, 11, +200,129, 8,101,154,180,171, 5,213,155, 19, 27, 49,204,170,142, 68, 57,232, 64,122,213,171, 17,178,118,176,242,246, 53,216,226, + 50,220, 72,156,248,215, 67, 96, 96,173, 37, 12,255,193,160, 36, 11, 28,242,236, 13,241, 88, 88, 78,210, 76, 78, 40,114,123, 29, +102, 14, 28,135,159,217,187,146,163, 57,177,172, 75,219,209,137, 44,198,242,183,127,236,119, 77,147,187, 81,146, 99, 74,195,152, +156, 93,223,237,218, 83, 8, 50,167,120, 79, 49,230,161, 64,100,187,183,157, 64, 63,148,129, 45, 62, 38,211,207, 99,171, 89, 12, + 70,233,179,231,196,249,255, 74,110,244, 51, 89,173,177,254, 84,107,200,109,156, 27,192,206, 81,209, 4, 76,214,142, 67, 85,216, + 15, 33, 41,145, 70,165, 62, 90,219,163, 45, 82, 48, 1, 11, 32, 21,118,122,180, 80, 34,104,142,135,208,196,148,126,194, 32,192, + 89, 39,158,141,185,129,139,104,109, 65,229,160, 78,217, 3,108, 31,124,127,101, 32, 68,171, 62, 7,171,206,121,102,224,158,219, +177,139, 53, 46,210, 1, 25, 18, 57,225,222, 54,173,118,120,169, 49,211, 55, 53,169,222,144, 9,208,175,167,139, 34, 17,164, 49, +230, 46,166,152, 95,254,217, 78, 30,222,193, 49,216, 94,110,204,105,164,104,153,136,102,249,218,238,252,124,252,206, 77,233,173, +191, 50, 65,123,124, 86,123,204,114,227,109,143, 54, 81,185, 50,171,160,166,106,174,242,120,111,173, 77, 56, 30,198, 10,150,192, +200, 7,174, 16,101,232,130,173,182,216,180, 22,118,107,151, 47,215,162,183, 34, 13,156, 50,113,132,213,244,246,220, 54,108, 41, +214, 57, 49, 59,221,164, 84, 47,101,104, 87,157, 55,245,106,169,125,109, 89, 92,249, 8, 16,140,214,170,109,139, 70,187,134,211, +120,189,211,225, 70,149,185, 83,136,253,140,219,223, 90,238,140, 21, 77,204,194,139, 70,142, 54, 32, 72,213,232,200,152,215, 3, +198,181, 61,252,218, 14, 53, 92,112,164, 84, 69,170,157,219,255,192,239,111,213, 78,142,170, 77,235,163, 43,127, 35, 62, 88,220, +170,215, 99, 34, 85,244,229,225,161,171, 54, 61,118, 95,170,112,230, 27,173, 15, 27, 76, 73,234,205,144,239,190, 10, 1, 76,244, + 40, 76,250,179,217, 28,129, 0,141, 96,212,197,104,209,210,138,199,218,206, 52,215, 61,235, 28, 66,142, 25, 21,230,173, 57,188, + 60,175, 95,121,227, 45,122,116,255, 67,186,241,204, 33,125,225,213,207, 83,221,205, 0, 77,162,149, 32,145, 29, 0,195, 78,150, + 67,161, 43, 96,164, 75,182,137,126,249,187, 63,160, 47,127,229,247,233, 47,253,249, 95,162, 47,126,250,245,254,123, 8,232,132, +103,203, 75,127,227,253, 15,151,207,254,140,238, 61,105, 59,230,121,191,175, 14, 14, 15,233,236,233, 35,223, 84,249,232,234,114, + 95,109,137,155,111, 26, 71, 35,110,155, 19,140,106, 31,167, 78,163,233,245, 27, 85, 97, 45, 27,171,210, 9,218,224,176,185,123, +220, 40,123, 49,228,163, 48, 75, 79, 3, 76,181,149,248, 3,208, 2, 40, 69, 81,220, 47,180,176,237,103, 20,123, 93,227,212,172, +133, 77,141, 40, 84, 93, 27,204, 55,222,223, 74,157,252,218,186,250,189, 48, 4,243,136, 51, 57, 74,235, 18, 84, 76,155,139, 14, + 86, 21,251,119,204,193, 1, 59,106,242,123,125,102, 84,236, 42, 51, 56,114, 88,237,190,118,113,102,181,137,233,132,161,141,252, +166,200, 7, 16, 12, 52,240,240, 22, 24,221,152,168, 25,196,156,181, 74,238,188,250,193, 98,224, 95,253, 32,103,118, 78,137,145, + 84,220, 10,213, 93, 52,101,142,232, 98, 1, 29,133,219,244,102,113,205, 65,215,173,149,209,111,110,227,152,241,251, 56, 43,248, +181, 99,220,159,195,205,228, 35, 19, 70, 78, 86, 59, 14, 92, 62, 26,243,210,153,170,138,195, 8, 16,127, 48,219,211,126,196,228, + 25,199,150,107, 29, 6, 49,207,173, 22, 16,191,173, 88,224,140, 61,105, 7,121, 12,245, 48, 85, 73, 39, 66,180,197, 69, 7,137, +179,141,173,196,233,175,183,206,107,228, 11, 23,142, 89, 15,169, 65,223, 85,160,110, 70, 45,177,233, 19, 32, 65, 33,176,196,189, +159,141,140, 38, 90,189,216,197, 60,159,129,100, 55,247,141,216, 33, 48,253, 96, 81, 59, 94,169, 87,158,237, 97,107,243, 57, 37, +153,245,107,115, 48,245,141,104,249,255,168, 54, 65,217, 46, 46, 84,191,121,116,238,188, 59, 61,117,205,129, 50, 35,199, 72,164, +135,120, 76, 99,179,154, 6,175,181, 85,219, 85, 55,174,186, 59, 83,161,142, 93, 87,139,105,229, 8, 60, 41,246, 15,193,226, 98, +160, 4, 61,173, 91,160, 15, 79, 43,112, 77,240,186,199,233,172, 58, 21, 74,180,203,193,109,214,180, 44,154,178,209,248, 73, 91, + 60,122,197, 16,160,142, 14, 18,217, 49,156,208, 75, 82, 51,183,107,215, 59, 3,184, 58,183,138,125,121,111,187, 86,234,159,231, + 47, 69,207,188, 14,209,138,109,138, 18, 9, 77,190, 5, 9,199,166, 76,113,146, 30,225, 43, 8,122, 1, 11, 34,220,152,130, 22, + 54, 4,184,184,200, 19, 68, 93,100, 81,180,106,163, 66, 84,220, 12, 17,127,194,121,134,156,161,251,208,159,164, 76,169, 35,140, +248, 3,203, 18, 28, 74, 4,172,152,216, 98,136,184, 82, 9,176,141, 72,246,174,251, 53,139,225,183,227, 99, 49, 4, 1,116, 2, +237,208,117,255,228,108,249, 12,207,233,228,228,156,158, 44,247,124, 99, 98,204,243, 89,160,119, 5, 48,202,169,235,193,222,174, +229, 32,122, 56, 34,218,102,185,206, 70, 88,126,215,157,187,247,233,135, 31,220,167, 47,127,245,107,244,137, 23, 63, 65, 87, 14, +142,104,103,213,246,114,216,188,255,240, 17,125,120,247, 30,157, 46,135,234,167,167,117,249,247,188, 28, 58,216, 91, 0, 71, 71, + 91,186,118,165,208,195, 39, 15,188, 59,133, 38, 89, 46,152,189, 29,108,101,214,251,182, 63, 63,165,250,125, 53,153, 58, 94,171, + 81, 82,104, 10,225,193, 81, 64,248,230,135,243,154,187, 50,246,236,168, 78,102,116,193,134,189,141, 53, 29,173,175, 39, 2,159, +145, 91, 95,160,210,178,184,123,181,202,209, 84, 82, 92,107,215,179,216,253,111,105,118,211,228, 35, 51,139,114, 30, 21,106,245, +159, 49,104,123, 3,154, 66, 38,214,221,205,250,220, 67,114,164,146,180, 88, 21,223,189,128,209,113, 89,108,190,147, 90, 22, 1, + 38,196,209,209,236,163,134,174,131, 56, 24,240,180,190,215,108,212, 50, 75,222,133, 28,135,212, 24, 13,141, 91,121,183,220,123, +162,232,104,118,141, 82,197,243,175,183,190, 85,219, 83,145,143, 18, 9,128,164,113,188,166,140, 21,229,244,219,189,218, 91,233, + 10,183,177,192,153,222, 85,237,240,164, 93, 46,156,139, 70,177,110, 89, 11, 15,189,238,101, 51,244, 92, 37, 10,135, 98, 69, 30, + 57, 32,116,144,237, 14,151,202,168,189,174,237,206,114,130, 13,241, 7, 98, 27, 81,130,228,148,162,209,180,213,142,179,114,118, +158,183,171,106, 25, 3,227, 35, 85,201, 3,100,204,207, 57, 34,111,188, 45,236,243, 96, 83,214,234,188,213,173, 64,125, 22, 49, +249,141, 27, 2,204, 26, 45,124,137,164, 27, 2, 6, 52, 46, 12,197, 4, 62, 48, 15, 76,192, 54,102, 7, 37,184,117,175,128,120, + 79,171,226, 34,161,106, 30,170,201,177,217,207,189,170,175, 26,155, 91,124,222, 86,204,159, 59, 27,140,103,130, 36,165,226, 23, +189, 9,194,236,212, 61,146,182,244,193,150,113,218,238,155,183,161, 24,107,133,133, 93,171,151, 25, 22,200,206,249,215,121,149, +183,170,230,193, 70,174, 57,235,154, 45, 22, 16,150,252,138, 20, 41, 29, 13,244,223,127, 62, 78,240,197,170,117, 19, 69,237,140, + 18,184, 27, 21,194,121,241, 69, 59,102,183, 69, 15, 22, 99, 65,154,207, 78, 52,164, 56, 80,155, 98,185,213,115, 84,231, 3,198, +161,164, 37, 59,141,207,230, 53,146, 30,115, 88, 44,144,194, 35, 19,117, 35,104, 85,138, 2, 49,250,161,105,217,104, 92,101,110, +178, 89,187,206,182,219,234, 61,100,164, 49,210, 3, 79, 60,229,106,142,145,108, 87,144, 36,250, 98, 7,223,244,159, 83,128, 82, +230, 16,165, 1,175, 32,125, 14,168,194,143, 71,200, 17,136, 84, 7,134,185,181,172,107,154,155,122,151,134, 50,148, 40,183, 92, + 81, 12, 10,130, 42, 9,181,113, 84, 80,171, 49,132,172,210, 18,253,224,146, 17,187, 22, 55,219,170,231, 15, 62,186, 69, 63,251, +185, 23,232,163,247,111,210,131, 23, 63, 73,151,182,135, 73, 88,143,208,228,188,177,155,186,133,189, 51,181,215, 4,212,247,209, +178, 6, 94,255,137, 87,232, 55,182, 91,250,254, 91,183,232, 55,127,247,203,244,239,253,234,175,210,118,187,245,142,217,246,112, + 75,199, 71,135, 93,243, 51,151,203,116,249,198,229,174,118,111,207,225,253, 71,143,232,242,241,134, 46, 31, 93,163, 23,158,185, + 66,167,187,121, 4, 16, 89,232, 20, 67, 88,201,100,201,140,145,130,230,109,100,155,123,176,137,174,170, 89,213,123,110,123,224, +154, 37, 70, 16, 18,186,154, 94, 73,207,112,240,242, 3, 55,133,100, 91, 43, 43,111,239,238,106, 32,190,149, 41,111, 93, 41,194, +113,136,173,143,186, 81,117,175,185,135,176,204, 33,190,235,207,177,196, 44, 92, 40,131,158, 28, 34, 36,174,141, 48,199, 77,255, +152,206,231, 65,135,235,254,115, 79,192, 24, 99, 9,135,200, 89, 2, 92,245,234,213,215, 71,123, 45, 60, 69,118,187,225,165,203, +100,102, 72,197, 75,247,132,113,149,173,196, 17,172,173,111, 93,147,177, 57,136,216,106, 27,187,213,243,241,123, 56,192, 94,182, +134,214, 90,125, 12,218,181,183,108,204, 15, 1,222, 60,119, 9,144, 1,202, 68,157, 50, 82, 38, 87,218,139, 17, 36, 61,111, 61, +238,243, 77,155,213,215,224,125,226,200,217, 68,185,226,136,117,138,252, 1, 93,230, 39,187, 53,140,247,209, 2, 93,186,232,172, +221,101,219,104,197, 68,126, 3,206,162,162,161, 99, 98, 49,108, 85,152,125, 98, 50,218, 22, 6,127,152,176, 72,128, 91,174, 54, +172,182, 40,119, 26, 79,139,140,219, 76, 97,177, 88, 62,204,205,118,163,237,237,240,127,247, 88,187,246,231, 27,173, 44,117,161, +175,218, 30, 19,157,215,247,153,198,110, 14, 65, 11,136,112, 18,254,147,129, 1, 15, 97, 40, 2, 94,232, 68,106, 75,234,100,157, + 25,139, 64, 10, 23,244,226, 10,156,234,168, 96, 76,210,216,107,119,115, 56, 6, 24, 98, 38,155,224,116, 51, 54,100,111,111,105, +197,108, 94,237,190, 1, 79, 37,241,206,169,148, 32,178,205,122,208,153,200, 57,219,157, 96,165,179,109,177,214, 41, 7, 39, 32, + 67, 67, 40,197,146,122,230,139,167, 56, 13,253,133,183, 17,101,234,155,120, 63,228,109, 88,253,253, 83,180,134,129, 89,221, 71, + 16,172,120,197,141,162, 98,217,172, 53, 22,206,162, 27,174,135, 40, 88, 30,116, 50,161, 93,136, 85,113, 94,119,179,135,244,123, +104,211, 81,149,163, 52, 25,124,103, 81, 4,170,156,157,199, 60,119,158, 65, 33,227, 68, 30,181, 7,114, 10,123,232, 99, 7,168, + 92,215,130, 51,239,118,149, 96, 32,248,124,206,225,229,197,231,117,209, 9,128,205, 80, 56, 99, 97,215, 34, 73, 65,145, 28,231, + 94,187,184,149, 53,172,115,110,196,162,188, 66,136,192,106, 17,202, 94, 23, 46, 66,167,152, 37,147,118,247,208, 54, 46,220,138, +141,182,157,135,110, 45, 7,191,111,254,248,221,254,156,207,117, 89,120,166, 51,250,241,237,119,233,103, 63,249, 69,154,219, 8, +170,224, 76, 31, 90,138,171,188,229, 84,125, 98,172,171,132, 88,246,241,242, 57,254,214, 31,124,107,249,185, 59, 58,223, 30,209, +123,183,111,209,191,250,206,183,233, 75,159,123,189,127,214, 39,119,207,232,107, 63,124,159, 46, 45,139,252, 79,125,230, 53,186, +245,248,140,206,151,103,226,225,201,174,199,156,190,242,220, 76,219,105,219, 95,231,221, 7, 15,233,219,111,127,141,126,237,151, +127,145,118,187, 93, 42, 24,162,163, 34,221,126, 41, 18, 90, 36,158,224,254, 81,125,130,119, 10, 1,120, 21, 7, 37,179, 65,213, +160, 23,182,255,218,110, 64, 72,184, 25,107,178,129, 75, 54,136,178, 86,125,202,134, 93, 64, 60,152, 15,232,184,128, 86,191,169, +230,149,141, 80, 48,103, 1,117, 83, 53,130, 88,216, 34,165,205, 27, 13,107,178,181,104, 88,149,226,206,162,208,206, 71, 79, 95, + 35, 61,156,247,106,127,163,157,221, 9,218,240,162,179,249, 25, 50, 5, 38,178,232,218,113,224, 28, 34,216, 1,101,137,159,103, + 32, 27, 18, 74, 25,243, 35,253,113,130,116, 52,208,220,112,216, 59,197, 5,113,170, 95,105,159,231,172,220, 22, 29, 23,155,118, + 99,234,251,226, 80,172,147,234,154, 38, 15,222, 34,167, 50, 50,174,125,160, 51, 25,157,154,170, 10,124, 56, 28,177,228, 80, 49, + 24, 97,152,226,127, 68,234, 78,193, 75, 48, 14,131,173, 97,205,209,113, 68, 7,253, 67,139, 76, 91,118,129,195,120,191,163,221, + 81, 21,142,192,133, 0,161,138,118,215, 16, 26,228,156,228, 16,118,152, 62,206,213,192, 50,218, 63,147,251,107, 85,154, 55,145, + 43,107, 11,141,220,221, 38,156,153,218,108,139, 53, 33, 72,171,116,209, 74, 83, 40, 22, 95,131,216,244,217, 54,122, 82,167,178, +242,181, 3, 20,159,115,114,156,189, 49, 1,148, 39, 65,136, 13,110,122,184, 8,135, 50, 80,237, 87, 54,223,169, 38, 18, 83,232, + 1,147, 42,103,161,173, 87, 33, 92,102, 14,133, 45,149, 17, 0,145,144,118, 7,155,184,209,166, 2,209, 56,250,186, 54, 17,144, + 51, 14, 5,182,248, 21,135, 43, 68,234, 28,120,124, 9,176,167, 62,179, 12,200,189, 11, 15, 1,176,226,126,219, 73,207,205,224, +133,247,236,105, 27,227,180,191,189,131,142, 66,235, 68, 20,107, 59, 21, 39,152, 13,139,207,121,124, 22,221,182,144, 19,245,216, +185,214,208,242, 21, 2,166,244,242,197,211,179,104,181,251,130, 53,167,182,161,117,170,135,128,101,216, 70, 34,116, 68,146,216, +174,184, 0, 71,114,242, 95,228, 57,230,179, 56,120,151, 4,125,219, 66,222,158,116,119,150,138,153, 68, 5,154,172,228,187,216, +176,217, 55,136,156, 11, 14,132, 70,204, 29,185, 8,159,158, 54,244,149,173, 13,243, 73, 97,214, 40, 92,124,134,138, 24, 97, 95, +120, 96, 1, 77,100, 58, 11,141,105, 85,250, 31,126,135,238,221,187,189, 84,192, 87,232,214,253, 19,122,229,122,161,183, 63,184, + 73, 63,245,169,207,247,175,135,214, 47, 31,100, 46, 46,219,215,252,251,152, 21,182,194,224,187, 63,120,143,190,254,189, 31, 46, +143,200, 68,135,203,230,124,114,122, 68,191,247,213, 55,104, 62,188, 66,239,188,127,147,190,253,173, 63,238, 85,227, 65,211,177, + 92,189,186,220,102, 79, 6,178,179,117, 44,151,127, 31, 31,110,232,185,171, 7,116,116, 88,250,185,121,226, 33,124,157,168,164, +160, 25,166, 41, 98,159,196,228,146,106, 85,180,195, 95, 17, 21,191,101, 38, 64,118, 74, 68, 71,112, 56, 65, 86,135, 68, 1,155, +149,193, 84,112, 46,111,154, 84,188, 71, 92, 36,183, 28,188, 55, 65,127,172,125, 62,140,118,223,162,186, 15, 73,193, 81,189,133, +108,166,119,142,116, 52,117, 66, 83, 0, 15,199, 97, 96,214, 48,153,254,156,157,171, 78, 66, 9,109, 45, 93,206, 15,186, 22,215, + 93,115,172, 45, 67, 11, 73,230,154,194, 83,109, 4,224,196, 70,195,210, 2,115,157, 11,206,185,129,250, 8,106,117, 54,203, 30, + 65,119,197,198,156, 86,233, 74, 4,252,116,155,110,109, 26,176,169,183,211,125,223, 43,161,248, 39,173,200,221,169, 34,154,118, + 88, 32, 81,206, 90, 56, 48,231,111, 26, 38,239, 70, 19,228, 90,216,111, 55, 8,143,105,151, 10,116, 3,221,111,175, 62,121, 42, + 14,115,106, 26,178,205,209,225, 65, 16,177,116,161,243, 86,136,207,206, 52,221, 24,194, 1, 2,251, 26,146,162,204, 45, 22, 31, +226, 27,148, 99, 0,109,204, 87, 27,145,141, 77, 36,229,191,203, 84,230,101,130, 88, 73,118,181,112, 59,217,181,170,188, 20,139, +235, 27, 55,121,157,207,244,121,211, 19,148, 30, 16,122, 88,205,102, 26,143, 91,169,106, 81, 3,189,133,205,229, 64, 37, 14, 65, + 77, 1,124, 41,146, 90, 87, 46,178,100, 64,152, 32,223,185, 70, 11, 51, 33,163,221, 89, 83, 72,253, 31,158,252,100,128, 19, 73, +144,234, 18, 7, 46,240,228,242, 57, 8, 64, 82, 88, 73,137, 69,195, 14, 56,224,100,104,191, 84, 60,225, 14,194, 1,106,192,166, +125,161, 46, 32, 54,177,170,221,176,182,230,209,133, 47, 11, 67, 48, 65,136, 30, 82, 56,201,176,219, 89,226,153,145,222, 56, 63, +136,102,131, 10, 79,139, 10,245, 12,211, 73, 30,181,137, 94, 93,123, 80,121, 21,204, 34,156,161, 38, 9, 29, 88,199,120, 91, 42, + 28,210,172,194,153, 37, 70,216,170, 75, 48, 63, 54, 97,230,115,202, 63,160,148, 80, 8, 59, 99,210,147,120, 58,164, 68, 38,117, + 23, 61, 50,136, 68,169,128,109,146,131,104,149, 98,134, 1,211, 12,175,135,177,108, 41,185,155,144,242, 25,136,243,129, 99,149, +195,200, 53,236,104, 72,147, 19,225, 92, 89, 19,250,233, 1,238, 83, 26,167, 82,232,205, 31,189, 69,103,203, 1,107,183, 59,161, +151,158, 89, 42,232,101,161,124,252,116,215,219,150, 83,175, 70,227, 26,161,236, 38,151,232, 28,155, 2, 65,228, 40,100, 49,204, +203,107,253,167,191,247,213,158, 57, 61,109, 14,233,210,229, 3,186,113,149,233,228,108, 75,175,191,246, 28,253,252, 39, 95,163, +219,183,238,208, 31,125,245,219,244,250,167, 63,217, 23,196,179,179,230,251, 29, 12,135,163,163, 3, 58,220, 22,239, 26, 94,187, +190,165,131,227,103,250,184, 70, 32,107,219,198, 69,134,231,196, 48,161,192, 86, 87,151,234, 71, 26, 36, 12, 48,146, 70, 72, 55, + 9,154, 72, 46,224, 8, 68, 21, 95,160, 27, 36,233,150,246,204, 1,171,196,251,154,190, 13,102,187,229, 64,202,198,163,107,172, +207, 62, 43,142,182,168,247,185,109, 16, 27, 50,232,142,174,179,179,254, 12,116,137,216, 26,143,208,160,173, 40,128,198,158, 11, + 88, 15, 75,140, 44,195,196,141,102, 12,129,209, 86, 8, 33, 61, 85,210, 14,202,150, 25,161,196, 59,107, 61,187,211,161, 14,140, +234,102, 19,252,125, 17,107,101, 27,100,166,166,104,100,214,206, 86,223,107,106, 8,229, 90,101, 60,169,171,200, 80,159,253, 83, +153,106,210, 87, 84, 27, 37,251,236, 34, 63, 75, 24,206, 20,122, 28,208, 35, 72, 80, 44, 59,147, 67,233,123,126,159,108, 71,183, +164, 20,128, 51,225,122, 59,143,207,110,115,216, 68, 85,170, 72,236, 10,100, 71, 7,110,180,163, 50,102,127, 2,129, 45, 6, 39, + 72,249,232,107,164,178,245, 12, 10, 98, 45, 1,185, 41,209,138, 86, 3, 65, 90, 0,135,130, 95,227, 55,139, 9, 50, 70, 42,141, +121, 4, 43,156, 88,219, 33, 96, 94, 30,206,214, 2,238,215, 90, 41,110, 62,175,228, 33,196, 34,159,215,227, 56, 64, 23, 10, 72, + 1,243,182,222,154, 35, 15,145,152,200,229, 78, 50, 26,152, 23,227, 92, 19, 3,109, 82,255, 50,183, 8,130,162, 91, 32,219,109, + 99, 31,174,184,237,100,140, 13, 74,138, 7, 76,124,122, 70,149,110,141, 87, 48, 83,138,214, 53,149,182,119, 94,173,162,173, 88, + 81,216, 15, 85,110, 53, 69, 53,235, 63,171,178,223, 11,182,138, 49,108,111,129, 11, 78,204, 19, 40, 74,128, 55,143,183, 75,213, +211, 80,209, 42, 91, 8,114,233,115, 20, 45,163, 7, 27,175,179, 67, 36,114,148, 41,115,216,199,250,129,165,192,156,124, 66,113, +219,228,135, 39,143,203,129,234, 28,176,136,144, 31,128, 85, 3,173,130,115,200,241,155, 25, 9,203, 24, 7,231,184, 87,143,214, + 69, 97, 39,182, 67, 86,254,117,127,239, 37, 73, 99, 41, 69,189,153,121, 93,194,111,142, 93, 42,123,110,216,193, 23,148,159, 27, + 14,125, 10,102,122, 71,223,125,252,174, 54,134,185,122,237, 42,201,187, 13,110,197,244,240,241, 19,186,241,153,151,232,207,253, +252, 47,209,225,178,241,246, 69,201,188,186, 16,201, 27, 33, 53,226, 97, 50, 24,116,192,148, 67, 78,108,177,108, 13,176,227,227, +163,190, 41, 63,122,242,100, 57, 68, 92,163,237,114,112,248,254, 59,119,233,120,121,207,191,246,103,126,137,174, 28, 29,210, 59, +239,126, 72,187,238,212,168,116,208,184, 11,219, 33,154, 58, 62,222,210,245,203, 91,186,251,224, 81, 95, 7, 63,251,153, 47,118, +224, 17,179,100, 26,159, 80,178,136, 82, 21,176, 61, 81, 84,242, 80, 0, 5,221, 17, 97, 52, 42, 30,131,141, 92, 4,249, 8,236, + 0,149,208, 59,196, 51, 44,208, 73, 26,215,127,194, 25,106,232, 97,132,246, 52, 22, 3, 8,212, 90,202,115,204,241,237,176,162, +127, 97, 66, 32, 12,122,244, 41, 51, 2, 4,194, 41,152,113, 17, 98,183,225,246,223, 58, 75,192,224,177,243, 9,228, 60,174,179, + 67,103, 12,110,132, 26, 28,223,112, 45,207, 67,140, 72, 55,197, 72,168,138,187, 5, 74, 23,212, 42, 78,182,195,105,118, 29,120, + 69,232,184,232, 33, 43,163, 96,153, 13, 61,107,156,119,162, 76,114,172,213,125,235,254, 89,149, 26,107, 82,217, 0,117, 20,174, +139,197,228, 18,176,222, 33,108,202,115, 71,166,226, 32, 41,129, 80, 34,149, 17, 5, 48, 72,196,105,117,166, 11,235,131,141,225, +111,110,149,227,236,137, 81,235,132,202, 88, 3, 4, 68, 69,235, 89, 23,114,170,101,197, 90, 6,133,135,228,162, 0, 23, 14,100, + 85, 91,152, 72,155, 95, 68, 97, 20, 23,213,163, 10, 85,233,189,217,140,157,175,232, 44,222, 42,234,162,127,110,118,142, 68, 70, +162, 21,190,234,130,224,150,245,130,232,109,105, 70, 1, 15,165, 15,126,237,253, 36, 20,244,113,141,192, 24, 46,233, 1,142,247, + 77,171, 64,146, 24, 59,186,184,184, 80, 10,131, 89, 53, 89,221,153,224,170,103,136,125, 18,180,198,164, 87, 41,126,179, 5,125, + 75, 82, 88, 8,148,153,177,137,173, 69, 89, 38, 80, 44, 37,243, 8,216,188,200,236, 22,184,240,145,203,170,209,106,220,129,105, +117, 47,141,147, 56, 94,120,161,149,101,139,202,126,155,153, 71, 43,148, 28,169,201,144, 44,136,253,106,198,160, 55, 56, 48,112, +218,168, 83,228, 55, 83,138, 29,101, 87,107,115,114, 9,248, 98,186, 98, 6,224,189,226,140,113,134,128, 7,230, 85,212,235,234, + 64,152,176,173, 24, 45, 91, 86,213, 56, 6, 47,149,189,153,185, 35,147,129,180,199,246,121,121,117, 17,115,135, 78, 19, 92,254, +123, 55,199,130,153,175,213,152,155, 30,180,176,168,229,189, 92, 57, 46,116,233,112,162, 39, 75,149,126,165,168, 82, 89, 83,221, + 41,209,224,132, 34,210,239,227,201,143,129, 84, 30, 23,163,121,132,255,244,159,252,105,122,251,189,155,116,190, 59,163,167, 39, +103,116,239,254, 29,250,212,167, 63, 65,191,246,171,127,146,166, 89,186,231,252,213,151,159,163,127,244,219,191, 79,223,253,227, + 55,151,253,122,219,215,192,170,222,223,214,154,111,122,158,102, 38,121,255,163, 91,244,242,107,167,116,163,137, 82, 61,222, 82, +160, 75,192,233,144,147,194,114,148, 23,129,157, 35,118, 96,192,228,238,139,136,186,194, 46,104,133,150,254,224, 77,120, 36,167, +141,213,116,158, 91,224,232,204,144, 95,128,248,208, 2,109,124,194, 97,157,216,207,139, 64, 16,251,185,236,162, 48, 1,209,164, + 10,211,102, 32,116,166,181, 58, 14,126, 30, 25,203,226,235,111, 20, 70, 27,104,149,177, 23, 17, 93, 87,216, 5,117,147, 59, 2, +156,196, 88,103,255, 61, 13, 63, 61,180, 84,243,176, 72, 11,132, 5, 89,204,173, 61, 99, 42,122,235, 22,184, 70,200,107,227,220, + 57,248, 28,189,243,160,220,140,150, 26,216,174,247,220, 17,193,209, 57,116, 34,160, 35,244,213, 81, 35,176,145,171,240, 88,212, + 33,228, 69,143,146, 0,251, 65, 78,161, 50,158, 70,216,127,247,148, 70, 46,125,164,220, 88,250,158,132,168, 72,111, 11,181, 41, + 88, 36, 26,109,148, 92,143,182,105,213,176, 88,232, 91, 35,126, 89,171,173,228,212, 38,198,185, 33, 72,148, 24,100,242, 12,130, + 25, 89, 39, 61,137,228,255, 70,134, 54,164,224, 32, 76,222,209,176,158,138, 19,179,137,128,225, 75, 58,221,246,159,181,153, 52, +189,198,252,139, 74,135,179,205, 1, 55,229, 10, 24, 66,255, 29, 81,153,134,149,167, 4,150,211, 39,187, 65, 3,203, 85, 60,167, +215,197, 80, 73, 91,200, 38,167,141, 97, 74,126, 87,193,106, 30, 14, 81,146, 84,122,236,225, 46,209, 32,200, 66,139, 88, 96,166, +177,199,109,217,197, 40, 93,164, 56, 75, 22,246,217,255, 20, 22,195,235,245, 51, 41,187, 37,192, 11, 50, 90,213,101, 98, 72,232, +163,148, 17, 62,238,105, 72,123,227, 8,121,113, 8,132, 85, 57,144, 91,108,209,165,126, 93,156,243, 30, 85, 83,133,211,190,243, +169, 10,167,144, 11,194, 32, 33, 10,106, 84, 59, 81, 67,142,164, 90,141, 48,114,116,117, 79, 50,186, 49,139, 7, 32, 48,160, 90, +153,147,248, 59,179,228,241,192,192,209,122,231,124, 42,212,235, 83,124,195,231, 2, 63,191,128, 85, 19,132,114, 41,170,104, 21, +165, 75,123,163,105, 94, 85, 17,112,174,225,240,155,167, 12,116,137, 64, 24,238,203,197,134,190,252,205, 55,232,143,190,241,109, +250,235,255,225, 95,164,131,237, 54,249,238, 77,140,122,178,220,111,239,127,248, 81, 23, 71, 29, 29,108,163, 90,169, 21,153,102, + 49, 70, 88, 85, 11, 54,158,193,131,130, 29, 52,108,211, 44,250,194,219, 2,253,226,115,215,135, 85,106,249,249, 87,142, 46,245, +236,129,207,125,242,165,222, 49,104,230,221, 63,248,206, 15,233,255,250,251,191,222,223,203,195,167, 79,251,125,114,222, 29, 36, + 99,106,126,120, 48,209, 7,183,159,210,147,147, 71,180, 93,190,127,115,112, 56, 44,163, 18,247,167,152, 21,211, 79,126,197,109, + 81,158, 98,214, 19,192, 74, 26,199, 48,163, 92, 49,187, 5,170, 4,192, 36,180, 60, 18, 57, 7,162,148, 68,175,180, 75,172,139, +216,157,178,150, 55,214,211, 18, 97, 79, 62,147, 7, 93,164, 15,118, 56, 16,172,109, 67,159, 61, 57, 15, 99, 83,107,136,194, 10, +228,128, 72, 20, 14, 86,168,209, 84,210,198,204, 30,251,103,159,247, 52, 26, 11,222, 41,154,180, 99, 12,237,119,107, 83, 79,197, +197,186,243,185,246,165,107,228,200,207,234, 20, 26, 90, 29, 76, 60,176,188,119, 72, 24,212,215, 37, 69, 29, 83,154, 67, 51,243, + 46,136,113,214,225,132, 69, 77,160, 88,237,228, 77,129,220,232,254,217,110, 32, 38,215,158,171,141,231,168,236, 9,107,189, 51, + 82,161, 72,198, 8,103, 73,188,151, 36,178,163, 72,148,116,114,228,212,216,239,151,182, 16,235,168,254,238, 18, 11, 2,122, 91, +177, 3,150,162,224, 32, 29, 44,165, 59,225,106, 80,115,139, 57, 40, 84,217,139,186, 95,112,174,242,202,185,164, 4,172,230, 85, +236,108,102,142, 83, 25,151,152, 1, 58,243,106,154,116, 46,203,148,131, 87, 25, 32, 22,153,229, 29,213,181,248,141, 79,158,179, + 44,206, 12,142, 69,172,236, 45,142,184,169, 8,122,255, 19,238, 44, 73, 66, 86, 0, 4,109, 3, 27, 31, 25,155,213,130, 49,183, + 2,150, 20, 1,107, 70,220, 67,226,209,149,218,162,218,176, 43,189,147,190, 64,109,120,216, 2, 38,104,181,251,189, 2,158,206, + 33,204,179,138, 0,125,198,197, 49,159, 3, 31,201,190,183,142, 81,128,242, 38,231,213,189,110,173,236,170,122, 3,193,249,109, +168,228,187, 87, 95, 83,208, 24, 75,215, 2,225, 41,148, 19,188, 74,129,143,198,168,105,149,148, 26,168, 36, 48,155,100,155, 54, + 1,102,135,140,175,177, 96,119,131,210,166, 35,171, 10, 61,116, 6,178, 18,121,173,133, 97,156,178,203,211,156,157,163, 2, 71, +138, 20, 69,239,103,173,136, 3, 1,201,106,108,142, 51,248, 11,254,238, 58,203,156, 48, 16,166,105, 49,183, 7,244,187, 95,255, + 38,253,163,223,252,109,250,143,254,237, 63, 71,175,188,240, 44,237,118,115, 2, 71,117, 87,213,246,144, 78, 58,100,105,184, 28, +166,102, 35,218, 28,211,241,229,203,189,114,241, 72, 98,195, 32,251, 34, 37,217,238,233,138,101, 94,141,218,195, 58,214, 50, 7, +218,181,105,175, 99,163, 52,198,195,163, 45, 93, 61,190,212, 43,192,179,229,251, 62,186,117,151,142,143, 46,211,221, 71, 15,233, +188,249,229, 39,246,174,217,249,249, 41,221,186,247,152, 62,253,210, 21,186,117,231, 41, 93,191, 52,209,213, 75,135,206,115,199, +231, 56,150, 58, 24, 1, 72,248,170,237,144, 34,122,111,176,113,225,105,245,253, 41,232, 69, 18,168, 75, 4,226,110,144, 27,142, +235,139, 85,207,192, 80, 55, 60,106, 98, 35, 8,174,233,218,149,128,240,120, 1, 72,140,221,223, 19, 67,243,221, 70,116, 12, 7, +126, 14,113,237,164,133, 71, 21,164, 31,230,238, 69,216,134,178,246,152,112,243,197, 88,233, 42,105, 13,142, 24,106,134, 74, 94, +203,172, 13, 67, 80, 18,173,248, 10, 49,106,171,112, 72,225,148, 3, 98,215,178,236, 63, 66, 90,213,216, 20, 36,144,211,197, 15, + 41, 22, 35, 28,106, 95,120, 50, 57, 8,150,226,149, 59,167,107, 48, 90,238,112,109, 74,113, 96, 81,116,135, 25,128, 86, 74,255, + 51,241,224, 60, 14, 89,155,131,229,134,101, 69,114,218,120, 81,128,195,142, 11,153,143,192, 41, 46, 56,167,180,163,180,107,133, +168, 4, 54,103,236,192,123, 38, 45, 37,119,193,222,134,207,117,109, 25, 11, 59, 79,179, 30,100, 91, 4,124, 66,105, 22,153,219, +150, 72,176,195,251, 10, 71,254, 81,105,147,179,228,227, 27,196,133, 97, 65,233, 2,174,121, 58, 16,172,129, 29,217, 78, 23,179, + 51,137, 69,115, 45, 99, 22, 73,129, 53,178,130,151,250, 76,220,130,112, 64,254,204,251, 71, 49,215, 1,136,134,244,164, 86,107, +133, 74,159, 17, 89,154,129, 32, 22, 19, 74,235, 25, 50,230,121,176,122,123, 45, 37, 28, 74,210,177, 9, 22,200,181,166,156,199, + 13,162, 40,255,112, 74,136,178,200, 55,115, 74, 46, 4, 79,116,194,207, 65,160, 34,182,202, 90,130,158, 71,147, 68,136,137,199, +177, 98, 27, 57,230,231, 69,192,249, 81,140,109,158,189,214,248, 58, 96, 5, 76, 85,104,114, 85,240,158, 49, 59,121,103, 35, 99, + 30, 28, 10, 22,226, 2, 63, 91,128,156, 72,208,250,151, 85, 38, 93, 86,113, 11, 70,186,164,174, 12, 87, 19,111,170, 75, 64,181, + 50,125, 94,125,114, 74, 15, 31, 62,162,103,158,187,209, 29, 52,109,147,175,141, 0,132,224,142,166, 26,239,208,160,221,178,201, +110,251, 66,117,176,149, 14,131, 57, 56, 56, 94, 54,223, 51,165, 23, 78,125,238,205,216,239,147, 81, 41, 86, 32,157,121, 39,145, + 66,104,137, 78,128, 39,103, 59,122,225,249,107,244,169, 87,158,165,239,190,249, 22, 93,123,254, 89, 58, 62,216,208,243, 47,191, +216,245, 5,219,229, 96,241,137, 79,188, 74, 63,248,222,143,123,152,203, 75,207,222,160,119,111,126, 68, 87, 47, 95,233,240,166, +118,232,104,163,130, 22,216,116,227,234, 49,189,240,236, 49, 29, 29, 40,160,100,171,150, 50,145,125, 24, 13,231,249,126, 42, 10, +236,178,111, 38, 90,137,104,162, 88,240, 3, 0,134,235,160,223,122, 95,156, 41,144, 61,158,152, 1, 74,251,155, 76, 36, 9, 42, +113,255, 58,100,150, 39,241, 30,246,212,145, 97, 95, 97,131, 76,217, 28,217, 17, 97, 94,252, 84, 4, 36,241,100, 78,249,139,177, + 29, 92,181, 26,150, 63,114, 20,108, 77,137,160,130,246, 70, 2,176,142, 5,195, 24,137,207,191, 49,114, 43,250,112,161, 3,113, + 74, 32,188, 19,170, 57, 10, 8,139,205,245, 66,178, 26, 15, 68,237,182,221,245,117,224,152,228, 16,184, 79,241,249,136, 2,100, +124, 14, 94, 2, 42, 67,145,226,102,201,140,163, 43,167,139,149,222,251,246,220, 69,236,107,220,131,174,166,217,140,107,185,217, + 40,127,217,241,146,102,173,160,216,196, 4, 78, 67,102,160, 31,149,106,156,218, 43,177,111, 40, 88,206,176, 64,219, 46, 9,228, +100, 88,186,112,143, 78, 85, 2, 12, 53,167,236,197, 77, 27,190,182,220,112,142,239, 25,198,148, 23, 55, 81,206,184,181,192,100, + 37,204,185, 80,184,133,191, 47,169,133, 56, 81,135,252, 6, 47,241,158,243,184,154,247,186,158,209, 37,143, 7, 31, 35, 87, 81, +196, 29,142, 35,241,170,108,120,173,245,187, 39, 74,115, 49, 74, 62,204,172, 23, 91, 93,236,189,246,139, 72,228, 80,227,169, 61, + 17,204,128,227, 28, 35,214,139,218,164,208, 66,134,185,115,126, 93, 5, 40,130, 5,145, 78,233, 40,226,194,180,245, 44, 25, 30, +184,124,138,150,172,203, 68, 79,170, 11,196,152,100,125, 25, 38, 21,126, 50,128, 78,224, 96, 89, 60, 87, 57,116,109, 92,240, 48, +138, 51,237,212,157, 3, 90, 32,125,204,198,158, 91,234,138,101,132,118,127,129, 67,100, 86,165,239, 93, 19,131, 12,121,181, 64, + 25, 14,191,234, 72,229, 13, 73,239,245, 42, 62,199,245,241,161, 76,125, 67,252,232,163, 59,244,149,111,124,135,118,231, 39,244, +119,126,227,159,208,127,241, 87,254, 10, 53, 55, 77,133,141,174,109,214,231, 29,193, 42,116,116,116, 68,135,203,223,187,122,101, + 67,207,220, 56, 30, 29,181,205,166,179, 45,110, 63, 62,161,175,252,206, 87,232,236,228,132, 46, 31,115, 7,133, 20,222,210, 79, +254,228, 79,208, 75,207,189,170,140, 6, 35,104,133, 21, 41,116, 21,227,195,255, 31,255,167,191, 77,167, 15,110,210,151, 62,243, + 12,125,238,250,203,116,243, 81,155,225, 47,135,136,235, 55,134,125,118,249,157,143, 31, 63,166, 39, 39, 79,232,209,227, 39,125, + 30,123,122,118, 70,151,142, 43,157,205,205,159,222,102,175,115,247,184, 55, 27,211,233,217,121, 99,105, 83,221,218, 60,189, 0, +118,148, 46, 16, 31,178, 87, 80,251, 51, 15, 73,129, 58,123,154, 97,130,144,161, 10,179,251, 42,105,207,138, 74, 95,214,136,132, + 8, 0,170, 48, 42,176,233, 97, 9, 61, 17, 23,116,123,168,211, 3,152,237,232,224, 73, 74,110, 33,112,115,112, 20, 54,190,118, + 98, 38, 8, 70, 19,199,152, 2, 93, 77, 73,111, 99,139,207, 36, 14,176, 26,238,130,170,226,191,245,104,137,178, 72, 24, 45,153, +150, 52,105, 5, 12,224,186,187,197,176,148, 28, 71,156, 56,199, 18,157,162,222,246,159,156,120, 71, 26,114, 54,174,225,228, 56, + 71, 63,138,114,232, 84, 24, 58,181,214,125,138, 52, 60, 96,200, 23, 88,227,182,155,212,224,181, 60,123, 19,235,142,251,166, 36, +194, 36,219,237,223,153, 30,109, 92,116,249, 88, 63,255,234,191,108,220, 71,145,186, 37, 38,152,232,102,255, 2, 16, 14, 73,217, + 15,201, 10, 3, 87,154, 87, 82,231, 96, 40,203,234, 52,149,208, 82,116,193, 23, 64, 93,137, 8, 18, 75,122,209,165,112, 35, 97, + 55,129,170,103,101, 34,206, 39, 98,168, 74,243,141, 8,108, 13,108,101,113,201,162, 32,180, 77,225,205,135,162,126,194, 77, 73, +168,174, 4, 97,123,237, 79,206,117,246, 90,210,150,212,180, 43,129, 89,254, 57,251, 67,213,184,161,243, 67,130,149, 71, 14, 46, +225, 11,132,132,177,161,114, 30,164,130, 88, 46,220, 15, 54, 30,192,121, 19,242,244,169, 68, 75,154,247,126, 31,118, 68, 46,178, + 44,175, 43,209,168, 0, 4, 26, 30,204,185, 42,101,160, 17,230, 81, 18,118,124, 99, 97,140,177, 14, 37,255,186,117, 21,156, 39, +173,177,160,113,125,178, 82, 30,145,156,184,235, 99,104, 75,238, 62,112, 18,204, 9, 4,187,100, 60, 44,224,117, 77, 45,108, 1, + 29, 40,185,196,159,143,173,223,245,136,104,138, 57,143,148,184,178,199,151, 46,209,183,126,240, 99,186,125,255, 1, 93, 61,222, +208,111,127,229,107,244,133,207,127,145,254,210,191,249, 43,116,170,132,195,174,124,111,155,250, 82,209, 63, 93,254,145,101, 67, +223,220, 56,164,103,174, 31,211,213,171,215,250, 97,189,208, 24,139,189,123,235, 1,125,229,107,111,244,205,246,112, 90,170,250, +237, 33, 93, 58,186, 74,127,248,198,215,232,191,250,171,255,217, 82, 73, 95, 94,214, 32,142,195,117,178,110,142,195,142, 97, 65, +231,229,251, 62,184,243,184,183,226, 15, 54,135,157, 44,184, 93, 14, 27, 54,126,107,243,253,247,111,222,161,243,221, 57,157,207, + 13, 19,123, 70,135, 7, 79,151, 53,111,162,121,219,236, 75,215,233,164,121,173,151,247,121,255,254, 99, 58, 95,254,235, 64, 3, +132,136,215,189,175,188,113,249,216, 5,115,211, 9,238, 33,230, 36,248, 12, 72, 9, 0,127,192,142, 74,192, 69, 24, 32, 20,180, +196,161,224,117,213, 1, 3,245, 59, 70,217,114, 9,164, 49, 79,200,111, 80,250,156,243,233,199,215,125,100,231, 25,241, 4, 58, + 0, 87,190,186,107,132,189, 93,159,215,190,128,125,149, 20,167,141, 93,190,174,254,233,148,204,241,179,230, 58, 59,208, 39, 85, + 66, 28, 20,208, 21,168, 2,196,102, 99,220, 87, 77,165, 46,162,246, 81,235,218,149,248, 60,121,101,115,205,153,183,227,186,111, + 4, 36, 11,188, 23,112, 19,219,136,236,187, 65, 96, 99, 55, 23,140,172,195,167,112,221,179,120,227,137, 19, 92,136, 16,117,171, + 51, 94, 86,164, 97, 47,240,106,209,177,216,114,122,174,202,220,245, 77,182,253,112,203,146,213,212,156, 2, 50,126,194,205, 88, + 55,118, 63, 85,130, 26,154, 86,202, 79,187, 57, 25,169, 74,190,241,174,163, 32,101,159, 1, 9,232, 87,161,117, 76,229, 42,236, +161,100,140,228, 5, 14,220, 11, 4, 2, 65, 95, 66,203,154,141, 0,226, 33,202,179,204,164, 94,229,204, 23, 73,107,179, 88,196, +102, 77,226,123, 75,227,161,148,104,151, 61,240,130, 41, 95, 66, 23,144, 69,120, 79,244,228, 15, 23,103, 88, 80,222,248,179, 80, + 34, 41,178,215,115, 75, 36, 29,113,248, 98, 25, 98,114,163,197, 70, 1,174, 48, 61,186,134, 45,112,132, 6,248,169, 61, 40,127, + 5,246, 39,190,224,144,178,122, 8,215,221,150,189,235,144, 65, 56,180,106,107,198,161,136,247, 24, 12, 97,215,241,142, 89, 64, + 87,176, 53, 95, 64,240, 86,120, 37, 42,229, 61, 85,125, 58,128,128, 96, 52,157, 20, 64,201,171,153,199,112,240,129,209,145, 69, + 62,150, 8, 99, 33,212,196,164, 0,154, 53,227, 29, 14,121, 85,194, 14, 39,240,140, 34,124, 7,180, 18,255,231,175,255, 54,125, +243,205,183,232,223,248,229, 95,162, 47,255,254,239,209,175,253,185, 95,165,167,205, 38,212, 68,170,208, 38,110,237,247,134, 99, + 61,106, 65, 41,167,203, 6,122,178,108,164,103, 76,215,158,127,161,199, 1,183,161,251,188,252,206, 7,247, 31,209,213,235, 87, +168, 44,127,118,126,250,164,127, 4, 31,222,191, 79, 39,239,190,223,231,241,215, 91,204,239, 92,233, 99,112, 58,253,127,103,173, +245,184,221, 46, 27, 53,211, 71,247, 78,232,218,229, 67,122,249,229,103,250, 90,215,130,147,166,163,229,103,222,186, 75,111,124, +239, 71,116,184,124,223,211,211,167,116,178, 28, 54, 78,150,215,117,118,184,115, 78,208,157, 7, 39,116,120, 99,162, 23,159,189, + 68,119,239, 61,160,221,242,123, 15, 1, 53,157,198, 44, 4,118, 64,194,209, 83,242,206,164,153,178,211, 42, 9, 68, 96,230,132, + 41, 81,245, 72, 66,109, 71,144, 12,227,207,149,168,137,145,164,198,176,169, 91,224, 8,175,239,183,110,255,146, 20,195,235, 0, + 48,200,200,136,183,189,158,159,234,186, 52,203, 30, 58, 56,141,229, 36, 54,241,243, 10,158,119,137, 14,224,211,243, 74,143,158, +158,210,157,187,119, 59,162,247,236,108,166, 79,191,250, 34, 93, 62, 58,238,206, 10,134,103,149, 61,107, 60, 51, 71, 72,225, 47, +253,253,106, 36,170,239, 91, 28,233,135,209, 13,133, 80, 40,134,199, 33,217,153, 74, 36, 43, 82, 78, 68,244,233, 59,163,104, 60, +132,172,178,130, 49, 17, 38, 28,162,208,220, 53, 62,230,246,217,132, 14,170, 74, 2, 20, 57,115,223,186, 24,144,104, 58,216,251, +203,193,185, 7,199,151, 26, 62, 64,109,177,119, 2,158, 84, 61, 53,109,148, 20, 86, 29, 17,104,220,118,145,125,129, 7,115,168, +158,189,213, 94, 87, 26, 23,145,149,133, 67, 86, 12,105, 94, 29,155,246,245,115,148,245,141,224,139,190,232,161,202,178,160,212, + 19,197,153, 63,174,191, 96,169,233,130, 73,201, 15,111,138,201,196,223,197,107, 97,136,164,155,129, 61,155, 20,200, 91,186, 88, + 39, 48, 5, 90,190,246,150, 48,185, 96, 14,123, 65,229,207,235,249, 41,239, 31, 8,240,107, 56, 91,114, 12, 39,192, 69, 66,241, +149, 97, 60, 40, 20,147,240, 40,251,254,196, 1,136,112, 40,142, 41,237,173,165, 44,233, 68,179,103,109,219, 19,149, 17,121, 56, +205,138,146, 0,198, 29, 89,221, 23, 89,148,147, 90,153,156,118,187, 16, 54,231, 51,139,183,197, 25, 59, 42,133, 86,243,114, 74, +254,245,100,109, 43, 23,139, 66, 93,241,127,209,215,172,181,155,170,132,226, 29, 40, 39, 6, 50,142,168, 2,252,131,152,204, 92, + 91,150,252,252,170, 75,129,208, 85,130, 10,106,125, 29, 63,245, 51,175,211,175,252,202,191, 70,255,245,127,247, 63, 44,155,224, + 83,218, 30,108,232,147,159,124,141,206,219,235, 59, 56,240,247,208,168,100, 47, 93, 62,166,127,255,223,250,211,244,183,254,206, +175, 47, 63,238,104, 89,164,183,244,220,179,207, 82,105,182,164,121,100, 4, 60,126,252,132,238, 63,124, 28,136,232,165,202,190, +255,232, 9,157, 61, 58,163, 31,254,224, 77,122,229,213, 87,104, 87,207,114, 68, 44,229,231,174, 21,177,175,127,230, 51,244,120, +249, 57,151, 55,143,233,250,229, 3, 58,218,110,232,225, 82,137,223,187,117,139, 94,186,113,131,222,125,231, 61,122,252,224, 81, + 31, 31,180,181,237,252,108, 57,100,236,198, 61,114,114,118, 70,219,165,178,159, 20,201,252,194,141,171, 29, 21,122,126,190,139, +197,148,178,125,209,169,140,123,204,122,254,248, 3,247,158, 90,177, 36,219,104, 95, 35,231, 44, 78,203,234, 24,184, 71,121,125, +244,133, 1,158, 51,242,167, 56,200,165,130,105, 60,143,130,172,134,240,189, 42, 39, 93, 67, 89, 86,175, 56,158, 54,233,106,117, +150, 53, 46, 57, 20,231, 70,157,107,122,135, 55,223,187,219,175,215, 15,222,248, 22, 61,121,252,152, 46, 93,185, 68,175,125,242, +117,186,118,253,153,126,128,250,250,215,191, 69, 55,174, 93,161,205,114,111, 60,184,255, 17,253,236, 79,254, 44, 93,189,114,217, + 53, 94,123,191, 3,131,184,236,149,119,132,182,138,255,118,179,207,190, 69, 5,133,102, 83, 21, 11,153,177, 54, 61,142, 56, 75, + 30, 53, 50, 35,232, 9,246, 40,198, 17, 23,175,216, 20,112,168,134, 4, 70,147,105, 23, 27,119,115,234, 29,170, 86,201, 14, 67, + 74,223,244, 16, 44,141,182,158,113,164, 42,169, 96,216,116,197,157,132,141, 74, 48,202,209,243,121,165,191,113,203,178, 53,226, +143,101,200,250, 12, 70, 66, 24,199,201, 90, 37,144,127,204,185, 29,141, 85, 63,158, 46,161,253,233,170,243,181, 66, 23,239,176, +204, 85,196,181,121,111, 1,200, 37, 81,190, 97,237,212,205, 48,156, 21, 4, 94, 0, 74,145,214,179, 32,145, 11, 54, 30,156, 85, +102, 69,177,251, 74,177,149,147,102,200, 23,139, 81,210,169, 6,111,244,245,104,130, 17,134, 2,116, 50,156,121,163, 38, 46,253, +130,139, 4, 94, 43,111,123,194,162,174, 14, 18, 28, 80, 30, 20,123,249,140,120, 37, 2,163, 36, 77, 88,189, 14,193, 81,130,100, + 77, 0,231, 86,168,111, 89,137, 31,190,158,230, 72, 38,231, 17,222,119,171,200,133,212,165, 30,200, 41,155,207, 49, 58, 20,172, +115, 33,227,160,194, 5, 20,241,160, 35,240, 84, 37,194, 25,233, 74,175,137, 26,201,117,135,162, 40, 19, 94, 99, 8,121,239,192, +150,143,128, 94, 21,196,137, 43,117,127, 66, 33, 80, 97, 46,134,151, 29,208,166, 20,106,214,159,251,233, 47,208,223,254,187,255, +144,254,248,205, 31,209,181,107,215,233, 83,159,253, 36,253,249, 95,249,147,244,228,201, 73, 60, 43,170,238, 61,217,157,209,147, +147, 19,154,207, 79,250, 38,249,195,119,238,211,215,191,241, 77,250,210, 47,124,137, 46, 93, 58,162, 55,223,250,136,222,251,224, +118,247,148,183,153,252,211, 93,123,173,203,102,123,222,218,226, 91,250,198, 55,190, 79,127,234, 95,255, 37, 79,202, 66, 86, 56, +126,190,187,221,192, 10, 31, 45,213,221,243,151,153, 94, 89, 42,237, 7, 39,231,116,122, 86,233,225,221, 91,203, 70,254, 39,232, +100, 30,126,229,115, 13, 27,106, 85,248,209,246,160,131,103,234,201, 89,255,251,151,143, 11,221,184,188,165, 75,203,107,249,196, + 82,233,207, 2,179,110,180, 45, 18,239,165,220,237, 47, 78, 31,211, 89, 48,221,155,128, 8, 84,106,210, 52,240,218, 67,233, 31, +193, 74,147, 98,141, 33, 89, 73,182, 57,223, 76,107,143,186,113, 38, 47, 28,105, 9,239,235, 59, 88, 86,221, 46, 7, 43,144,192, +186,234,233,132,192, 64,108, 26,157,135,143,207,251, 40,228,176, 81, 76,203,180,220, 23, 68,135, 75,193,248,242,203, 47,245,238, +202,193,242,204, 92,187,124,212,231,206, 47, 61,115,153, 30, 45,155,254,233,217, 35,186,177,189,209, 63,219, 52,171,222, 91,103, +139,191,190,222, 16,213,246,123, 71,213, 54, 78,123,251,220,139,120,122,220,208, 44, 84, 13, 95,177,162, 66, 32, 69, 46, 23, 19, +226,241,167,160,125,146,154, 14,255, 76,107, 32, 19,132,149,185,144,129,163,155, 71, 53, 20, 62,189, 96,218,168,177, 37, 92, 19, + 61,208,166,237,183, 83,129,110, 89, 25,179,119, 13,232, 34,245,203,219,222,188,233,164, 29, 41,238,201, 19,192,224, 57,233,136, +200, 19,187,252,141, 64, 42, 15,129,213, 34, 61,112, 48,183,244, 83, 37,175, 64, 45, 64,255, 17, 20, 42,172,187,226,107, 85,233, +133, 93,122, 89,121,182,121,175, 37, 36,180, 2,227, 92, 36,102,185, 64,124, 36, 31,103,243, 77, 2,139,253, 83,186,249,104,241, +239,239, 65,109, 86,214,166, 14,112, 44, 23,205,140, 87, 64, 26,190,160,106, 95,145,174,210, 92, 29, 42,224, 20,191,153, 42,116, +206,197, 6,211,254, 41,116, 53, 17, 89,255, 31, 22, 46,131,149, 63,110,234,156, 32, 49, 89, 20,199, 56,211, 79, 53,119,180,201, +246,230,205,208,230,242, 88, 85, 80, 35,239, 93, 71,145, 11, 23,217,189,247, 2,113,149, 93, 20,163,204,124,127, 13,181,174,218, +106, 80,153, 23,172,166,246, 11, 52,198,110, 68,244,245,193,162, 5,108, 8,107,199, 50,237,181,222,153,120,111,146,132,108,104, +180,190,237,155, 74, 57,102,162,254,172, 18, 28,208,135,210, 63,128, 52,177,152,183,168,219,223,252,231,255,138, 62,243,169,215, +232,222,253, 71, 46, 60,141, 67,203,178, 72, 31,110,233,159,254,139, 63,160,255,245,127,251,135,180, 59,125,180, 84,200, 31,210, +183,191,119,159,142, 55, 91,250,214,183,191, 71,207,189,248, 18,253,181,191,254, 87,233,254,237,179,190,206, 28, 77, 59,250,224, +230, 93,186,118,233,128,206,150, 69,248,153, 99,162,211,221, 17,125,243,251,239,210,173, 91,183,233,165, 23,158,239,162,216,205, +102,202,221, 20, 26, 54,220,135, 79, 79,123,149,254,206,123, 55,233,149,207, 95, 27, 98,243,165, 74,251,224,214,125,250,231,191, +251,135,116,253,133, 87,122, 54,250,189,187, 15,123,245,119,116,112,188, 84,133,188, 28, 28,218,120,224,136,110,221,125, 76,219, +165,194,251,228,139, 87,232,241,227,167,203,159,109, 70,186,111, 17, 21,227,194,145,136,193,222,151, 78, 99,124,225,140,118,204, +113, 37,171,183,245,128,230, 76,111,154, 84, 48, 30,247, 88,133, 78, 38, 11,238,183, 0,209, 18,200,152, 65,225,146,127,230, 97, + 9, 53,127,123,192,105,100,101,114, 17,239,180, 9, 0,138,195,127,207,153,215,101, 35,213,181,255, 90,114,151,173,189,143,211, +211, 93,191,158, 79,159, 60,162,227,131,102,129, 19,122,245,213, 87,251,143, 56,121,186, 92,239,205,142,182,205,205,180, 92,167, +143,238, 60, 92,238,131, 13,189,243,225, 45,122,225,229, 79,140, 88,217,202,123,197,148,192, 6, 28, 93, 77, 81,242,169, 70,193, +182, 13,114,170, 35,254,118, 86, 28,119, 49,145, 72,245,107,196,101,117, 32,242, 53,199,114,203, 1,143,110,182,105,231,230,239, +195,175, 10,146, 69,221, 66, 87,192, 66, 39,121,124,227,200,104, 6,235,116, 27,201,204, 90,185,215, 1,170,209,200,236,113,109, + 27,135,126,110,243, 37,125,140, 91,251,189,148,176, 32,184,168, 72, 79, 48, 18, 81,155,142,140,148,162,255, 22, 63,145,161,237, +129, 96,118,129,169, 86,148, 48,147,242,113,187, 50, 0, 29, 86,253, 79,145,252,181,228, 26,145,124, 64, 16,222,171,202, 86,172, +167,213,146, 64,121,161, 71, 49, 6,190,248, 84, 77,149,120, 79,178,170,126,214, 89,208, 23,156, 10, 98, 67,149,213,226,204,123, + 62, 99, 78,135, 11, 89,105, 2, 56, 55, 64,120, 29,179,201,161,228, 70,218, 31,243,133, 34,189, 4,122,161,181, 40,145,215, 44, +150,220, 50, 68, 31,245,218,107,127, 81,222,247,202, 14,152, 94, 22,229,175,103, 35,193, 42, 17,239,130,230,250,218, 3,203,232, +211, 18,120, 19,188, 30, 89,192,207,157,214,155, 47,231,206, 70, 41,116, 17,235,101,128,199, 56, 9,128,208,122, 39,101, 85,141, + 51,103,187, 32,173, 52, 19,112,237,214,228, 58, 59,176, 73, 66,152,114,160,154, 85, 16, 36, 31, 99,109,140,131,206,190,124,129, +221,191, 76,123,182,169,246,245, 75, 71, 71,244, 23,255,194,175,208, 27, 63,120,155,190,255,131,119,130,233,173, 64,140,150,106, +246,245,111,126,159,158,185,118,131,206, 78,151, 74,120,222,209,217,249, 57, 29, 94,190, 78,175, 62,243, 44,157, 46, 11,236, 31, +253,225, 31, 47,139,208, 33, 61,121,122, 78,187, 58,104,115,141, 61,241,240,124, 71,207, 95,191, 76, 7,103,103,116,239,209, 73, +111,147, 31, 44,213,201, 31,124,227,123,244, 7,191,255,213,222, 62,223,148, 56,176,212,166, 74, 94,126,255, 59,239,188, 67,151, + 14,132,222,190,117, 66, 31,221, 63,237,231,174, 15,110, 61,165, 55,127,244, 17,253,248,157,191, 77,207, 63,115,157,238, 61,188, + 79,207, 92, 30,179,255,166,188,111,182,186, 71,143, 43, 29,110,199, 12,246,230,237, 71,244,232,201, 25,125,255,237, 59,116,124, +184,252,201,243,167, 52, 29, 61,204,214, 38,184,150, 5, 2,172,220, 61, 4,109,150,205,178, 0,183, 14,196,224,106, 84,255,252, +170, 38,247,225, 51, 61,218,199,243,114,157,118,189,186,109, 99,136,102,245,107,255,110,154,148, 2, 10, 27, 90,169,223, 5,102, +233,168,196, 17,141,117, 13,113,184, 64, 97,150,115, 4,218,225,104,222,205, 25,167,236,247,197, 20,250, 68, 60,106,123,100,175, +170,223,209,105,162, 7,209,147,179,153, 30, 61,122,210, 43,238, 7,247,239,211,135, 31, 45,215,246,248, 18, 29, 28, 93,166,155, + 31,221, 94,238,143, 29,221,187,253,126, 23, 47,182, 24,216, 23,111, 28, 47,215,108, 75,223,252,222, 15,233,231,127,238,103,187, +107,161,106,145, 41,176, 30, 59, 2,156,247,105,148,100,116, 58,245,179,142,247, 84, 65,233,175,127, 95, 56,131,189, 4, 85, 82, + 53,158, 28, 31,145,226,186, 86, 18, 56, 41, 82, 41, 75,230,204,120,224,151,228,142,167,107,217,184,119, 14,170, 58,180,200,215, + 5,204,116, 80,164,122,211, 37,180,132, 76,220, 3,171,113,241,107,139, 30, 46,251,162, 49, 77, 27, 26,179,136,178,170, 86, 37, + 11,183,214,149, 43, 35,223, 56,111,202,185,112, 22,128,162,200, 69, 78,234,253,160,228, 11, 36,224, 97,247,146,253, 3, 65, 10, + 78,160,189,214, 62,158,122,121, 15,252,144,173, 73,251,164,174,143, 17,108,173,121, 5,184,203, 8,237,109, 34,178,178, 0,174, +187, 11, 49, 10,224,253,217, 58, 95,100,241,160,139, 21,233,171, 86, 45,113, 10, 13,202, 55,234,202,105,176, 71, 97, 16,218,183, + 46,238, 79,245,179, 85, 11,103,144, 12,115, 68,248,190,194,171, 41, 41,239,201,247, 32,204, 35, 14, 10,124,225, 97, 47,119, 89, +156, 90,152, 28, 0, 31,231, 62,224,253,195, 21, 95,132, 0,134,153, 60,206, 54,253,253, 2,113,110,223,148,176,122,103, 57,198, +213, 91,114, 94,145,192, 72,136, 51,161, 78, 56,247,242,121,221,106, 73,201, 3, 53,183, 87,211, 9, 46,206,219,109,163,170,253, +182, 41, 23,240, 39,184,111, 52,151, 47, 31,211,139, 47, 60, 67,255,238,191,243,103,233,191,252, 27,255, 61,253,229,255,224, 47, +208,171, 47,191,208,103,208,109,113,223, 76, 27,250, 51,191,248, 51, 52, 63,253, 58,189,247,222, 41, 61, 42, 91,122,112,242,148, + 78, 78,239,209, 92,183,116,233,242, 17, 29,109, 15,233,238,195,167,203, 34,127,115, 89,216, 79,187,152,238, 96, 91,122,182,249, + 59, 55, 79,233,149,103,142,232,120,217,192,191,241,199, 63,162, 79,124,226,101,250,202,215,190, 75,127,247,239,255, 22, 61,247, +236,141,158,194, 38,189,237, 62, 47, 7,130,121,249, 89, 19, 93,185,116,212, 63,231,247, 62,122,208,127,198,118,185,254, 79,151, +159,217, 84,248,111,191,125,107,249,231,131,206,245,254,254,242,239,134,184,237, 29,203, 22,209,187,124,223,225,193,209,178,241, +236,232,203, 95, 63,233,223,255,245, 55, 63,234, 26,197,233,215,191,213, 55,148,131,178,113, 75,210, 78, 31,209,243,211,167,244, + 83,175,127,113,249,189, 87,150,141,248,140,182, 7, 91,122,239,157,183,233,206,189,187,253, 51,105,170,249,205,242,103,207, 61, +119,195,243,178,219,120,160,181,160,107, 29, 9,147,117,174,190, 62, 22, 93,143,219, 34,221,174,113,179, 1, 54,142,253,193,193, + 65, 63, 28, 88,140,245, 84, 70,199,162,253,249,209,209, 97,199,218, 54,194,223,164,246,222, 30,165,218,190,103,249, 59,135, 71, +203,247, 28, 28,182,156,237,158, 41,191, 81,127,244, 65,107,131, 55, 45, 66, 67,231,206, 99,246,124,247,206, 61,122,249,149,151, + 50, 0, 75, 52, 19, 28,153, 27,222, 61, 50, 5,189,249,180, 55,201, 91, 55,124,225, 68, 31,125,116,159,238,222,190,219,175,227, + 7, 55,111,210,219, 55, 63,162,207,125,250,117,186,123,247, 65,191,110, 13, 2,244,227,183,111,246,123,230,210,242,126,238, 60, + 60,165,203,243,134,158, 44,135,171,183,222,125,159, 62,255,185,207, 82,237, 0,163,200,128,247,241, 18,199,243,141, 46,130,116, +104,175, 54, 94,154, 52, 9,145,226,251, 58, 53, 78, 71,202,202, 93,119, 75,155, 89,233,192,182, 43,156,164, 55, 99, 93, 17, 48, +132, 22, 14,237, 17,174, 21,133,129,239, 34, 9,169, 27,217, 40, 22,118,165, 90,161, 26,123, 84,252,255,117,100, 1,224,118, 85, + 12,167, 54,181,140,246,141,147,112,198, 7, 87,221,143, 46, 51,108,118, 53,250, 60, 9,235, 8,115, 85,155,199, 23, 20,112,240, +190,175, 48,237,180,146, 33, 33, 73, 85, 41, 31, 51, 15, 93,109, 31, 57,201, 7, 78,178, 34,251,149,242,218,254,192, 89,201, 41, +178, 47,192, 73, 89,207,120, 22,244,238, 27,239,149,136,123,254, 71, 22, 40, 62,121,127,110, 6,106,117,111, 79, 95,208,149,200, +109,115,216,232, 80,100,101,155, 87, 89,205, 86, 87,251,181,251,156, 45,125, 15,132,116,188,231,204, 99,204,155, 80, 33, 95,201, +109, 95,145, 61,251,153,248,189, 81,192,178,177,190, 39,246,161, 29, 12,247,134,164, 22,117,113,182,179,232, 61,187, 47,144,231, +236,157,167,152,139,229, 72,199,117,139,156,211,161,149, 25,233,116,208,214,118,198,245,190,237, 48,125,214,240, 32, 95,164,133, +240,177,146,185, 68,164,238, 5, 5,165,131, 16,175,157, 9,188,234,184,200,197,214,198,212, 49, 42,217,175,135, 47, 78, 91,130, +187,185,137,198, 78,123,117,121,231,238, 61, 50, 74,188,125, 26, 13,183,122,251,206, 93,250,157,127,245,255,209, 47,255,226,207, +210, 51,215,175,210,147,147, 83,250,218,183,191, 71,207, 46,155,237,102, 89, 20,143, 14, 14,250,235,252,210,207,127,129,190,254, +181, 55,169,158, 61, 71,245,228, 46,157,237,174,208,116,112,101,217,244, 30, 44, 21,248, 67,186,255,160, 45,234,203, 90,179, 59, +165,159,255,252,179,244,198,219, 19,221, 91,254,172,109,106,103,203,207,220, 46,149,220,235,203,134,248,255,252,131,223,164,223, +248,245,127,186,108,186, 39,244,236,149,131,101,179,222, 45, 27,212, 65,143, 74,125,240,240,241, 96,203, 47,255,253,232,201,152, +197,183,138,103,211, 66,158, 58, 46, 86,150,247,115,222, 25,239,219,101,115,107, 11,252,233,178,209,119,147,110,203,187,104, 1, + 30,210,254,217,116,204, 39,107,219,187,129,111,120,249, 59, 77, 81,223,214,249,147,147,221,114,128, 24,185, 13,237,107, 39,109, + 6, 95,207,150,205,242,168,255,189,210,137,120, 76, 79, 78,155,183,253,168,199,145,158, 44, 39,163,233, 76,232,221,247,111,211, +229, 43, 87,232,234,242, 79,131,217,220,189,115,191,191,134,218,187, 5, 67,208,184,217, 76,254,145,180,247,178, 59,111,213,237, +211,190,233,155, 0,172,106, 62,248,166,104,178,166, 87,149,181,135,211,152, 0,203,221, 86, 45,173,172,141,150,151, 13,125,179, + 28,150,218,161,163, 93,179,135, 15, 31,210,127,242,159,254,199,244,197, 47,124,142,222,191,121,151,254,241,255,253, 79,232,241, +227, 71,116,255,254, 29,250, 27,255,237,127, 3, 17,172, 21,170,121, 93,159,214,114, 30, 94,187,152,212,141,164, 29,181,179,229, +125,124,123, 57,148,189,255,254,251,203,189,114,157,222,253,224,102,183, 56, 62, 88,222,219, 76, 55, 71,103, 96,249,219,143,158, +158,117, 61, 67,187,194, 45,193,111,179, 61,167, 43, 71,155,229, 16,120,218,121, 7,197, 28, 89, 37,235, 94, 92,151, 27,210, 88, + 15,223,233,175, 93, 59, 86, 99,238,108,161, 77,250,117, 27,137,136, 50,246, 77, 91,102,143,138, 68, 76,180,172, 54,105, 70,247, +136, 9, 96, 11, 88, 21,106, 46,232,132, 32, 49,206, 50, 68,234, 10, 60,100,154,137,186, 31,176,148,118,165,214,134,151, 10, 26, + 19, 29, 63, 76, 77, 40,183,124,200,137, 23, 44,150, 67,137,137, 61,181,203,237, 92, 87,153, 20, 11, 80,201,172,171,154,117,165, + 74,208, 34, 94,111,172,169,165, 27,185,238,235, 18, 34,227,252, 64, 24,183, 54,172,185,106, 23, 83,193,194,174, 33,235, 48,151, +213,108, 94,146,141,135,147,227,110,127,182, 13,158,227,149,223,248, 99,148, 0, 32, 4,148, 80,142, 75,158,217,237, 85,226, 96, + 77,227, 85, 89,184,167,188, 93,133, 95, 4,225,117,149, 65,173, 55,136,199,190,238,217,244, 50,111,158,147, 18, 61, 35, 70,243, + 6,107,167, 85,216,212, 36,195, 22, 62, 6, 74,158,213,232, 43, 41,185,181,170, 99, 46,159,146,111,232,116, 89, 64, 90,165,103, +139, 73,155,209,209, 90,184,185,246,131, 67,134,242, 58,147,128, 10, 37,150,187,251,251,203,170, 29,143, 39,117,230, 61, 43,229, + 69,214, 13, 94,145, 3,246,187, 25, 89,117,139, 78, 4,111,126, 10,175,102,230,146, 15,187,208,201,216, 27, 82,168,160, 20, 59, + 87,173, 29,125,231,254, 35,250,155,255,243,255, 65,255,249, 95,251,203,244,247,254,214,255,190,108,214, 63,232,173,210,221,242, +166, 47, 31, 30,209,233,201, 19,186,189,108,200, 87,150,251,230, 55,255,241,239,208, 63,251,173,223, 91,254,123,166,127,240,247, +126,131,254,223,127,240, 79,232,213,215, 94,161, 87, 94,126,126,100,119, 47,191,224, 95,254,139,175, 44,155,212, 97,159,111, 95, +186,124,173,231, 70,157,158,159,208, 82,123,210,195, 71, 79,250,230,215, 42,204,155,183, 31,244,248,137, 6,168,105,214,179,246, +247, 63,186,243,136, 14,249, 50, 93, 62,216,208,135, 31,222,166,179,179,167, 42, 32,162,190,193,182,234,244,188,169,214, 15,134, + 93,106, 55,139, 46,138,181,131,101,158, 46,255,180,205,177,173,105,143,207, 39, 58, 95, 42,241, 67,174, 75, 53,184,237,155,163, + 28,110,250,207, 41,203,230,187, 45, 35, 16,166,119, 64,151,159,115,186, 28,108, 58,163, 99,158, 59,215,190, 89,174, 78,207,199, +120,237,228,228,100, 57,136,156,121, 87,161,211,224,101,180,203,219,106,222,243,177,150,205,170, 5,142,156,215, 29, 93,127,230, + 89,122,237,211,159,163,199, 79, 78,233, 51,159,188,188, 44,188, 51,125,231,251,143,250,220,255,242,241, 97,255,252, 90,181,221, +236,117,237,230,106,213,116,107, 73, 47, 63, 97, 84,215,205,243,191,124,243, 89,175, 86, 75,215, 43,180, 67,192, 80,239,239,150, +235,119,176, 84,255,203, 65, 98, 87,251,161,170,232, 33,245,124,217, 8,251,251,224, 97,119,122,248,240,108, 57, 88,237,186,197, +239,215,127,235, 95, 44,159,237,247,151, 10,250, 14,221,126,239,195,254, 26,127,250,139,159,161,183,126,240, 38, 61,247,242,171, +253, 48,113,245,218, 53, 79,194, 76,150,185,181, 72,151, 8,194,146,116,251,151,113,208, 57, 91,222,243,251, 31,126,216,221, 83, +143,159, 60, 93,106,201,218,175,117, 27,167,180,247,217,174,101,235, 8, 93, 59,100,122,225,153, 75,253,176,118,239,209,233,242, +218,199,181,158, 45,184,107,226, 68, 28, 68,129,238, 74,222,170,139,221,172, 85, 48, 3, 34, 91, 34, 32, 78,224, 33,239,223,176, +113,141, 64, 28, 98,167,213, 26, 6,207,207,116,129, 6, 18,132,169,130, 57, 84, 28,137,160, 6, 14, 72,118, 90,152,177,167, 2, +213,197, 45, 88,163, 26, 63,160,197, 3, 87, 71,239,218, 62,180, 41,135, 91,207,146,238, 21,131,190,233,145, 89,171,148, 46,225, +228,205,147, 85,197, 45,123,120,189, 85,197, 69, 23,204,100, 1, 92, 18, 21,241,199, 88,147, 68, 82, 7,223, 46,119,145,180, 5, + 96, 49,188,226, 7,160,144,143,181,242,200, 29, 1,150,248,122, 84, 80,235,145,188, 16, 75,110,197, 59,124,136,202, 5, 44, 99, +242, 13, 91, 96,110,153,196,196,118, 83, 10, 42,147,247,197, 93,152,187,194,107, 67,251,234,180,193,144,109,110,176, 21,113,255, + 50, 68, 39,154,110,128, 24, 80,182, 14,102, 79, 94,107,230, 61, 5, 76,106,116, 72, 98,244,243, 5,240, 24, 74, 52,187,189, 46, +198, 42,115, 56,251,227, 25, 36, 13,156, 5,193, 72,209,108, 1, 29,203, 2,242,220,141,109, 87, 74, 63,188,127, 74, 55,174, 77, +125,145,203,116, 97,206,116, 1,150, 4, 75,221,239, 6,201,190,173,238,130,176, 22, 12, 55,194,201, 5, 95,116,162, 91,109,194, +128, 2, 10, 1, 91, 66,189,194,134,254, 49, 80, 32,204,235,202,115,160, 60, 58, 65, 85,174, 84, 76, 80,148,174, 78,126,235,199, +239,209,195, 7,103,244,191,252,205,191,183,108, 22, 87,232, 11,127,226, 23,186,101,237,244,108,238,145, 39,143, 78,238,211,195, +119,222,161, 47,188,244, 9,122,251,253,155, 75,245,117,141, 14, 46,189,178, 84,149, 66,239,221,190, 69, 63,124,231,193,178,169, +125,111,217, 24, 43,221,184,113,131,222,250,224, 33,125,234,149,163,101, 3,175,116,237, 90,237, 30,241,246, 65,180, 42,253, 59, +111,188,177,108, 86, 91,186,126,137,233,222, 82,173,223, 91,190,231,168,101,155, 47, 47,249,241,242,251,238,221, 95, 54,253,221, +125,250,236,203,215,232,167, 63,247, 34,253,195,223,254, 70,135, 75,181, 78, 2,181, 57,123,111, 75, 47,155,224,178, 24,236, 58, +142,118, 4,116,156, 45, 95, 63,175,197,253,209,237, 57,109,155,111, 59, 40, 92,125,230,152, 90,193,221, 20,240, 71,199,219,238, +139,238, 72,218,222,138,158,187, 34,190, 35,109,151,119,187, 91,170,236,221, 84,151, 13,102,183,124,255,220, 55,159,161,155, 18, + 58,147,168, 6,219,193,228,232,104,211, 43,236, 39, 79,207, 70,171,123,217,116, 31, 60,126,184,220,147, 79,232,202,178, 97,190, +245,214, 59,244, 96,185, 63, 31,220,157,232,234, 1,117, 92,238,182,243,190,169,103,186, 91, 22,120, 19,119,157,212,209, 17,104, + 45,248,254, 25,109,198,250, 50,129,203,162, 46,155,222,184,183,199, 88,133, 33, 66,183,125,182, 35, 57,175,234, 6, 47, 99, 44, +162,243,254,105,217, 56,191,253,173, 55,232,171,127,244,205,229,215,157,209,103,126,226, 39,232,210,114,184,248,218, 27, 55,151, +107,203,244,193,205,127, 78,247,238,220,166, 95,253,213, 95,166, 63,245,203,191,188,108,206, 7,253,119, 12, 62, 25,216,102,250, +235,157, 35,216, 4, 45, 53,250,127, 54, 42,223,141,203,151,186, 78,160,165,225, 53, 69,119, 59, 80, 93,189,122,165,183,219,219, + 65,164,117, 70,118,202, 65,105, 29,135,246, 57,180,141,169,137, 21, 27,187, 63, 44,159,146,236,165, 4, 72,108, 73, 17,150,193, + 41,170,171,145,160,152,213, 79, 71, 7, 98,194,192,148, 18, 41, 52,113,140,135, 75,194, 58,228, 88, 96,244,225,175,208, 86,121, + 20, 9,137,165,162,158,250,236, 18, 91,205, 17, 49,101,178, 29, 52,100, 95, 71, 65,188,209,176,187,232,250,110,188, 2,156, 50, +230,178,171,125,123,235, 97, 84,239, 2,252,114, 3, 1, 8, 90,131,176,114,221,107, 49,230, 83, 29,175,100, 28,100, 98, 7, 89, +183, 82, 97,126, 65,185,117,205, 73, 8, 23, 30, 93,230,253,170,132,149,151,139, 57,234, 68,129, 91,117,229,177,240,126,246,185, + 91, 18, 1,169,133,103, 20,137,185,238, 30,212, 38, 89,212, 34,252, 3, 67, 96, 8, 65, 43, 32,188, 91,123,200, 3,244,195,169, +173, 29,101,152,236, 29,156,236,132, 88, 36,110, 42,113,200, 10, 93, 0,163, 97, 96, 78,227,195, 32,132,129, 5,213,218, 91,190, +217, 21, 79, 32, 74, 57,203, 89, 24,176,254, 80, 50, 97, 19, 59, 14, 43,184, 15,182,184, 19, 36, 2,189,223,203,123,188,119,239, + 9,221,249,232, 54, 61,123,253,181,126,191, 62, 90, 54,141,211,147, 45,189,242,234,115, 61,180, 35,108,167,188, 55,255, 31, 15, + 46,195, 8, 70, 98,195, 95,189,118, 89, 41, 58,121,213,221,241,249,162,228,171,177, 54, 66, 38,123,101,178, 54,238,207,195, 97, +154,230, 65, 16, 81, 57,160,128,113,237,211, 31,157,199,105,115,224,207, 70,251, 25,173,186,125,244,248, 41, 93,189,124,220, 55, + 70,195,150, 30, 28, 76,189, 74, 45,220,172, 71, 83, 95,252, 91, 43, 93,150,106,115,123,220, 4, 79, 59,250,234, 82,185, 63,122, +244,136,110,223,125, 66, 39, 79, 30,247,150,248,227,167, 79,233,242, 39, 94,233,228,183,221, 82,205,190,244,226,243,203,231,241, + 33, 61,120,112,107,169,202,118,244,214,123,111,247,150,113,171,160, 95,123,245,213, 94,157,141, 42,114, 89,240,143,143,151,127, +239,232,248,240, 26,125,242,165,101,131,110, 73, 89, 13, 72,179, 84,241, 31,222,185,211,175,227,219,183, 30,245,141,188,209,223, +234,211, 29,221,188,247,112,204,184,121,180,161,219,107,110,193, 93,231, 75, 37,127,184,108,128,191,240,243, 95,234,239,251,246, +114,200,104, 27,198, 7, 75,149,223, 42,231, 86, 61,190,243,244, 4, 18,242,150,141,113, 89, 5,127,242, 11, 95,236, 21,241, 59, +173,162, 92,158,243,243,167, 79,250, 38,180, 57,156,244,217, 92,238,251,214,214,111, 27,229,178,137,189,250,226, 75,244,116,121, + 61, 79, 78,158,210,189, 7,247,232,206,237,123,116, 89,253,212,247,239,221,235,175,127,183, 92,179,251,143, 31,208,181, 27,207, +116, 15, 62,151,179, 14,226,105,246,170,119,223,127,220, 15, 1,237, 62, 61, 63, 63,233,237,229, 70,201,217,148, 49, 15,111,250, +128,198, 16, 57, 83,159,124,175,198, 21,109,218, 34,101,219,243,119,233,248,210,114,247,140,170,123,154,150,226,140,134, 31,187, +117, 91,100,211, 80,187,203,247,159,143,141,184,109,148,231,149,123, 23,228,160,141, 23,150,215,112,233,248,184,127,182,231,103, +143,150,131,199,227,229, 96,113, 70,175,127,234, 21,154,187,168,172,208,167,126,226, 53,250,221,223,249, 29, 58,186,116, 68,191, +248,167,255, 44, 61, 93,222,107,235,132, 28,245, 89, 60,247, 67,155, 9,180,216, 45, 91, 18,163, 43,221,128,239,221,125,208, 63, +167,131,131,237,242,254, 91, 55,225, 76,199, 16,135,203,207, 60, 89,254,236, 96,169,224, 31,233,232,231,156, 14,151,131, 74, 59, +104, 29, 46,207,236,251,119,118,244,225,173,123,244, 83,248,108,248,198,142,186, 36, 78,112,184,170,161, 47,232,254, 25,237,110, +118,208, 26,195,211,104,196,185, 53,223,187,240, 69,238,252,125, 33,153,128,186,157,247, 2,147, 50, 45, 46,160, 49,242,177,156, +145,108,229,197, 2,116, 21, 3,189,231,237, 94,238,161,118,186,245, 20, 27,159, 39, 8,120, 85, 69, 85,135, 43,203,148,165,197, +128,172,127,108, 74,217, 74, 36, 56,131,151,149,178,154,176,114,196,247, 97,179, 17, 73,118,141,212,226,149, 11, 72, 52,235, 57, +252,122,166,184, 22,170,165,185,208,170, 97, 46, 25,235, 28,194,144, 28,148,177, 63,208,229,100,178,231, 11,196, 72,123,172,111, +216, 24,188, 43,194, 43,196, 67,201,219, 1,175,171, 72,202,176, 30,217,155, 86,135,205, 73, 96,195, 39, 0, 31, 8, 84,206, 73, + 64, 71,195, 42, 65,200,211,167,140, 74, 20,255,108,101, 79, 57,203,171, 49, 13,102,159,227, 44, 63,226, 34, 57,133,117, 68, 46, + 68, 22,172,161,200,173, 85, 94, 77,140,115,178, 44,198,223, 94, 54,157,174,104,237, 28,228, 3,122,241,165,103,199,188, 82,246, +106,239,116,157,115, 74,182, 0,159,128,178,229, 11,179, 4, 86,206, 98,230, 60,106, 16,168, 92, 82,182,246, 62, 89,198,105,134, +185,145,200,123,174,143, 20,246,177,103, 9,145, 36, 60,109, 98,169, 15, 62,186, 71, 95,251,195,175,209,201,227,199,125,209, 57, + 90,170,166,135,143,206,232, 95,254,254,215,232, 19,175, 62, 67,175,188,240,124,223, 56,218,134,213, 90,168,239,190,247, 17, 93, +186,116, 76,239,125,112,179,115,209, 79, 78,159,118,213,120,155,129,222,184,126,157,238,220,186,221, 85,202, 79, 31,223,239,139, +200,249,252,168, 1, 47,232,123,111,254,104, 57, 4,108,232, 75, 63,243, 69,122,231,253,119,232,253, 15, 63, 88, 42, 81,238,139, +247,203,207, 94,239,149,229, 11, 47, 63,223, 55,248,183,223,123,151,126,225,231,126,142,126,250,139,175,119,123,217,251,239,189, + 55, 4, 83, 77,179,214, 54,163,229,243,188,251,100, 71, 15,159,158,211, 75,207, 11,189,250,220, 33,221,186,119,178,188,142, 43, +203,207,254,112,217, 56, 31, 46, 27, 95,219, 32, 78,151,138,121,211,159,143,207,127,242, 83,244,133,207,126,169, 87,189,215,151, + 42,240,199,111,253,136,110, 45,135,130,151, 94,122,137, 62,243,217, 47,208,131,135, 79,250,239,232,155, 92, 79,147, 35,135,145, + 92,191,122,157,222,251,255, 9,123,179, 38, 73,210,235, 74,236,126, 30,251, 30, 25,185,103, 86,214,218, 59, 26, 4, 64,144, 32, +169,225,112, 25,206, 72, 38, 13,231,113,100, 50, 45, 35, 51,201,140,210,131, 30,244, 54,166, 23,189,201,244, 19,180,189,137, 47, + 35,211, 66,210, 40,137, 59,129, 33, 0, 98,237, 70,119, 87, 87,119,237, 85, 89,185, 47, 17,145,177,175,238,159,238, 57,159, 71, +132,123,100,246, 8, 48, 88, 55,170, 50, 35,220,191,229, 46,231,158,123,238,249,185,156,158,158, 17,254,157, 34, 66, 80,135,105, +187, 66, 4, 96, 48,236,234, 90,166, 89, 3, 47, 22, 75, 82,211,247,185,108, 52, 9, 43,255,244,231, 63,103, 32,147, 8, 57, 38, +248,253,177, 58, 74,100,252,107,187, 91, 82, 42, 87, 53, 0,106,104, 54,159, 32,163, 63,107, 83,114,112,112, 68,231,203, 90, 49, + 38,215, 37, 28, 65, 11,217,225,175,127,231,215, 72,166, 59, 62,121, 67,116, 97,164,235, 63,232,143, 53, 48,211,191,247, 2,214, +255, 1, 73,116,154, 86,110,237,221,147,219,123, 15,244, 89,234, 82,191, 60, 97, 50,214,188,106, 17,185,192,153,203,233,179,122, + 73,144,229,242,178, 90, 42,115, 47,128, 56, 28, 29,237,147,237,191,178,190, 45, 7, 71,111,228,178, 61,145, 15,179,105, 30, 37, +244,135,175,174, 84,229,221, 7,219,186,159,154,189,127,242,133,220,125,235, 93, 68,134,242,211,191,251,129,174,229,109, 25,233, +242,221,210,236,190,166,231, 2, 1,195,252, 62, 68,208, 83, 56,196,225, 72,157,242,153,190,187,158, 23,112, 19,134, 26, 80,161, +158,190,190,182, 33,206,247,184, 76,190,211,237,177,246,127,213, 25,170,243, 15,164, 92,204, 51, 40,203,105, 32,112,248,230,208, +237,155, 68,148,212,194,118, 54, 99, 23, 18,212,179,160,119, 62, 41, 47, 34, 49,107,231,193, 70, 84,147,194,198, 5,165,140, 93, + 76,131,156, 79, 66, 91, 30, 24, 19, 23,172,242,150,201,210,198,196,128, 83, 27, 75, 24, 35, 73,217, 53, 49,161,235,200,160,141, +114,100,226,240,110,124,216, 79,116, 26, 37,224,247,241,104,200,131,186,104, 77, 11,135, 86, 24, 19,155,245,234,121,179,254,208, +104,221,194, 44,209,205,111,168,179,219,155,250,170,227,206,102, 89,195, 97,121, 66,154, 21,145,175, 68, 70,191,226,207,230,186, +222,230,122, 77, 94,174,129,220,246,218,144,183, 27,131,167,165,218,172, 89,106, 89,139,101,150, 75, 10, 9,209, 26,184,149,175, + 16,123,137, 69,116, 17,150,183, 68,231,119, 71,199, 54,134, 71,115, 57,184,176, 81,206, 65,132, 40,102, 34, 76,203,232, 48,134, +249, 1,154,237,136,183, 56,116,158,131,219,162,140,111,179, 52, 72,196,196, 68,139,108, 28,142, 54,114, 19, 47, 62,148,152,149, + 69,144, 16,157,116, 55,131,155, 35, 80,130,245,150, 49,239,101, 10,129,231,234, 88,250,207,218,218, 26,179,141,250,217, 69,136, + 94,121, 52,156, 54,146,200,122,203,207, 52,191,208, 54,242, 51, 17, 90,157, 89, 18,192,185,214,219, 23,137,233,140,137,193,131, +113, 0,199, 92,171,172, 72, 92, 52, 50, 18, 32,197,175, 87,172,154, 30, 11, 80,227, 82,159, 51,131,133, 26, 44,152,209,231, 23, + 93,249,232,167,143,229,249,147,135,146, 47,173, 73,185, 82,150,106,109, 77, 58,237,190,252,235,151, 7, 98,224,160,187,109, 66, +198,125,205, 40,239,221,187, 39,153,234,134, 60,121,181, 79,180,163,217,188,144,175,189,247,158,188,251,246, 3,121,113,112, 34, +165,106, 69, 6,154,153,163,182, 62, 25,251,180, 31, 67,140,199,213,204,244,119,191,243,235,242,197,179,167,234,120, 79, 73, 50, +203,167,147, 82, 82,199,208, 83, 47,176,183,179, 75,146,212,199, 15, 31,178,126,140,204,176,221,238,168,211, 26,201,235,227,115, +117, 58, 25,201, 21, 50, 26, 60,128, 11, 97,228,221,189, 21, 25,108,149,208,130, 43, 63,126,116, 44,187,107, 5,249,119,255,225, +183,228,187, 63,253, 76, 14, 27,109,205, 70, 49,104, 37, 45,255,206,239,254, 3, 73, 77, 64,146, 27,240,157,171, 26,144, 32, 27, +172,119, 58, 34, 80,136,211,231, 64,159,252, 74, 41,173,153,190, 71,167,150,201,120, 50, 38, 49, 42, 33, 43,229, 50, 17,132,215, +251,251, 50, 28, 78, 92, 54,170,235,150,201,228, 36,173,118, 47, 87, 72,203, 63,251,167,255,190,188,247,245, 15,120, 46,191,124, +250, 70,254,252,143,255, 70,222, 28, 29,232,179,247,229,247,126,231,119,164,154, 75,203,133, 58, 97, 56,213,115, 13,162,126,249, + 55,126, 87,108,166, 36, 63,251,232,115,233,168,147,204, 36, 69, 54, 87, 43,178, 89, 83,231, 90,201,138, 76, 6,154,189, 15,184, + 70, 96,241,187, 64,163, 47,197,210,138,100,210, 57, 57, 56,124, 35, 71, 7,207,100,125,243,182,172,175,174,201, 40, 7,146, 97, + 64,187,236,147, 68,149,102,253,126,125,117,131,142,243,226,252, 68,166,227,190,108,109,172,106,224,144,162, 45,207,103, 82, 82, +219,124, 75,131,179, 11, 89,169,173, 48, 24,129, 56,208,241,241,190,244, 58, 23,178,182,126, 91, 86, 86,106,114,170,129,137, 32, +120,211,117,246,213, 31,160,238, 95, 42,174,200, 15, 63,125,163, 78,213,211, 32,161, 43,127,248,191,252,207,242,246,187,239, 75, +160, 14,248,163,159,125, 74,114,227,223,125,247, 7,242, 47,254,179,255, 68,138,156, 31,226,207,237,199,108,252, 50,238,248, 72, + 29, 56, 8,114,173, 78,155,129, 86, 79,207,140,155,114,150,208,239,233, 75,187, 7, 94, 65, 90,179,254,137, 35, 88,234, 58, 93, +105,240, 8, 88, 25,157, 12, 43,165,172,164, 83,110,236,173,245, 76,188,252,107, 35,200, 87,100,110, 67,164,224, 40,193,141,178, + 34,225,125, 15, 36,150, 76, 93,155,193, 21,227,116,153,235, 26,244, 98, 98, 82,173,215,145, 56,115, 93,119,195, 44, 75, 92,221, +208, 69, 21,245,153,243,182,113,137,145,158,173,216,165,166,176,197, 26, 36,207, 78,143, 23,234, 94, 33, 11, 19, 14,220,245,217, +133,109,244,225, 88, 68,127,154,116,145, 37, 91, 37,146, 75,128,162,145, 27,208,139,152,251, 52,215,214,199,124,133, 0,147,141, + 57,192,121,239,119, 32, 55, 19,207,162,179, 91,205,130,153, 24, 53,174, 54, 10,148, 88, 27, 79,246,151,159, 39, 38,120, 18, 37, +212, 45, 88,253,102, 25,113,136,136,237,199, 29,246, 13, 80,188,185, 46,173,227, 6,217,135, 25,221,156,160,101,226, 34, 58, 51, +246,119, 68,106,119, 14, 69, 93,235,187,151,216, 76, 97, 99,108,204,113,198,213,217,162, 34, 14,241, 89,233,114,147, 51, 55, 94, +188, 63,117, 9,197, 95, 60,245, 13,107, 16,209,138,240, 98, 51,198, 23,178,175,139,222,250, 40,177,237,250,208,155, 57, 92, 6, +248, 53, 28,215, 88,170,150,229,214,157, 77, 18,112, 82,169,132,212,207, 47, 9,189,139,231,221,208,204, 22,159, 82,230, 45, 15, +128,155,115, 43,174, 19, 17, 99,164,150,235,230, 32, 22,240,154,101,217,208,229,224,126,110,152,100, 49,168, 33, 10,163,219,155, +244, 29,162,229,170,104,159,172, 35,187, 1,106,253,249,199,207,229, 82, 51,178, 47,158, 31,200,203, 87,175,229,214,253,247, 36, +165, 25,219,139, 55,199,114,220,120, 69,193, 15,163, 25, 80, 81, 51,247,213, 21,205,160,213,145,252,210,183,126, 89, 68,157,202, +163,167,251,172, 15, 39, 51, 25,121,112,255,190,124,240,254,187,242,250,232, 84,141,242,136,182, 32,145, 46,177, 37,203, 51, 32, + 94, 25,169,150,242,242,107,223,252,186,124,252,232, 11,205,196, 79,165,148, 47,170, 3,197,207,102,229,188,217,145,175,191,251, +150,124,249, 98, 95, 94,189,121,195,119, 68,118,134,182, 46, 24,245,130,159,146,146,102,103, 59,234,180,225, 80,251, 19, 95,131, +128,169,220,201,150,100,163, 86,150,241,112,160,137,105, 85,190,120,117, 46,207, 15,206, 52,107,157,202,239,255,246,175,202,127, +244,159,255, 7,172, 73,223,219,221,148,239,254,221,103,242,191,254,225,159,202,231,207, 94,200,183, 63,120,143, 48, 51,236, 84, +194, 3,219,123, 34, 85,111, 34,255,252, 15,254, 99,249,225,247, 62,149,191,249,235,191,149,111,125,251, 61,249,111,254,229, 31, + 72, 46,151,145, 63,255,219, 79,228, 7,127,253, 19,214,212, 7, 26, 65,220, 86,199,248,214, 78, 69,188, 73, 75,254,211,255,242, + 15,228,155,223,252,144,142,203,157, 53, 79, 62,253,249, 99, 41,228,242,146,202,100,101, 28,140,229,228,232, 88,250,233,137, 58, +103, 13,138, 90, 77,249,167,255,236,247, 52, 3, 94,151, 31,252,252,137, 6, 40, 61,214,214,173, 58,177, 92, 14,165,142,130,108, +175, 23,165,172, 65,192, 79, 63,126, 41,101, 93, 55,148, 7,138,185,172, 58,245,172, 84,215,246,152,225, 67,147, 94,188,140, 20, +203, 21, 61,203, 70,122, 26, 4,140, 39, 46, 56,197,244, 56,212,159,215, 86, 87,117,125, 51, 68, 35, 70,186, 70, 64, 60, 74,185, + 4,185, 2,153,148, 58,200,242, 22, 51,223, 78,251, 82,106,171, 85,102,198,200,148,207, 78, 94,107, 64,144, 86,135,190,174, 54, +125, 42,171, 53, 93,231,181,164,124,249,124, 95,110,109,175, 75, 33,155,146,253,227,134, 84, 53,248, 43,106,252,241,206, 47,127, + 77,158, 60,125, 42, 95,124,241, 84, 3,131, 60,127,239,193, 78, 77, 3,132,142,180,154,117,253,255,247,244,115, 12,203, 0, 86, +108,108,160, 13, 2, 45,148,122,128, 56,160,220,211, 31,244,244,188,248, 14,134, 71,134, 15,127, 45,250,119,253, 17,147,199,172, +174, 21,130,188, 41, 74, 50,104, 69,212,231,156,132, 74,129,198,198,233, 34,230,134,201,151,118,121,198,122, 56, 87,222, 51, 18, + 87, 44,181, 81,229,184,232, 32, 39, 27,243, 49,102,169,149,218, 46,161,171,230, 26, 89,220, 92,215,151, 88,190,242, 54, 42,217, +188, 44, 75, 17, 77, 62,227,227,202,103,153, 89,204, 28, 92,107, 34, 66,166, 62, 30, 47,122,245,193,176,156, 59,243,197, 76,114, +180,176, 76,216, 35,233,156, 61, 34,196, 52,251, 30,157,147, 95,212,148, 23,144,129, 93, 86,172,136,150,145, 35, 53,101, 27,113, +198, 70,226,227, 8,227,140,226,184,195, 16, 43,215, 20,140, 76, 44,229, 95,146,156,141,214, 48,163,189,244, 38, 46, 3,187,236, +237,141, 68, 32, 25, 19, 87, 67,179, 18, 37, 49, 73, 68,135, 91,174,215,144, 99,125,199, 54, 46,191, 40, 17, 34,162, 23,129,169, +195, 89,217,203,237,243,113, 52,192,222,172, 74, 25,229, 31, 44, 75,188, 70,179,108, 47, 30,118,153,175, 32,166, 95,139, 44,163, +250,254, 75,145,173,137,136,113,196,231, 25,152,101,221,153, 69,251, 89, 12,174, 50,243,174,128, 88,223,120,116,180,162, 89, 76, + 28, 3,195,246,178,209,145,177, 58,169, 91,239,220,118,228, 34,253,171,141,205, 21,185, 56,173,203,145, 26,168, 7,111,239,198, + 37, 70,227,177,218, 13,101, 13,145,165,193,106,241,181,184,198,122,188,169,228,179, 20,244, 93, 35, 7, 46,144, 33, 19,205, 62, +150, 2, 92,123,131,246,129, 93,122,143, 89, 75, 41,136, 96, 24,154, 50,213, 12,116,255,205,185,124,247,207,190, 71,173,141,149, +213,117,205, 62, 11,116,166, 3,205, 28,253,241,136,144,104,161, 80,148,180, 58,238,163,227, 3,121,239,237,183,100,108, 82,234, +164, 78, 56,255,188,217,110,201,131,219,183,228,238,157, 29,121,121,124, 66,242,153, 64, 64, 70,191,163, 86, 46,200, 64, 29, 71, +187, 51,162, 67,255,198,123,111,203,207, 63,127, 36, 23,151,151,178,177,178,194,108,178,221,237, 74, 71, 51,180, 7,119,110,201, +195,167,207,229,228,226, 82,157,125,142,207,142, 22,184,190,102,106,111,223,189, 45, 21,205,206,211,126, 87, 29,149,145,102, 7, + 45,107, 73, 73,150, 83,114,217, 65,107, 88, 6,124, 56, 34, 49,107,165,164,116,250, 86, 86, 87,107,114,117,213,150, 63,250, 87, +255, 15,121, 16, 96,115, 55, 52,155,172, 22,213,129,123, 37, 41, 39,187, 82, 46,175,203,239,253,131, 95,149, 71,234,228,225, 36, +199,154, 53,255,223,127,242, 55,210,110,245,229,157,119,238, 73, 71,127,255,191,251,239,255, 39,121,247,254, 45,117, 88, 7,114, +161,129,135,151, 12, 52,139,206,129, 30, 39,199, 23, 45, 73, 39,124,249,219,239,254, 88,254,254, 39,159, 57,242, 28,225,113, 35, + 31,255,226, 75, 66,224,158, 9,164,156, 47, 73,165, 86, 85,103,148, 86,199,184, 34,231,103, 39,242,242,240, 92,170,221,169,124, +249,228, 53,217,233, 8, 46, 54,170, 26, 4,120,190,188, 58,189,146,213,178,187,212,105, 13, 12,144,169, 3,237,104, 15,221,188, +249,158,254,211,239, 95,176, 60,144,212,128,232, 74, 29,246, 91,223,249, 80,118,238,238,200,163,207,158,168,227, 28,177, 52, 2, +162,217,218,214,109,174, 33,160,248, 84, 38,199,224,234,188,209,147,156, 6, 75, 22,153,124,144,150,250,229, 17,255,190,213,108, +170, 99, 79,147,164,150, 74,231,230, 25, 31, 74, 42, 23,141,190,220,221,219,146, 42, 28,179, 6, 4,155,187, 85,169,148, 39,188, + 87,103,151,109,169,150,115,242,222,251, 31,202, 71, 15, 95,168, 35,238, 72, 38,105,245,188, 28,201,246,214,134, 52, 79,143,228, +243,135, 95,202,206,222,109,249,198,135,239,209, 81,219,176, 77, 15, 65, 33,178,126,140,177, 69, 90, 12,135,142,192,194,231, 25, + 29,178, 54, 79, 88, 93,127, 22,200,143,135,224,101,104,200,122,207,166, 12, 9,135, 94, 90,253,203,116,192,103,193,218, 79, 35, + 42,143,241,196,217,198, 80, 86,160,180, 65, 68,136, 39, 62,163,196, 46,181, 56, 75, 92, 52,109,222,102,101, 35,131, 11, 99,194, + 38, 17,229,231,153,239, 10, 34,227,194, 35,137, 78,196, 7, 45, 90, 87,157,194, 94,212, 68, 4,145, 18,244,130,246, 21, 23,218, +152, 39,159,209, 97, 82,126,164,165, 46, 44,113, 39,167,236,211,156, 13, 21, 9,199, 52, 70,190, 12, 16,164, 31,178, 17,103, 25, +253, 84, 23,120, 52, 26,210,217,131,204, 1,200, 11, 27, 56,251,159, 55, 15, 12,140,196,249,242, 17, 98,145,141, 8,139,217, 72, +173,124,137,102,183, 76,251,137, 18,192,254,127, 53,150,111, 16,162,153,123, 26, 99,150, 21,104,150, 48,133,165,249,210, 75, 98, + 2,118,201,217,216,136,230,175,124, 21, 7, 98, 30,252,120,145,182,189,133,131,182, 17, 88,216, 70,130,158,121, 59, 90,140,214, +111,174,179,237, 99, 58,146, 81, 56,223,187,214,199, 45, 17,102,121, 44, 68, 49,215, 58,226,231,109, 5, 54, 22,176,152,235, 45, +140,246,134, 82,177,141,194,207, 33,153,198, 91,230, 28, 92, 39,195,221, 12, 91,219,121,191,251,252,239,244,172,129,176, 3,152, + 15, 1, 10,234,118,179,254, 64,176,170, 49,151,187,223,237, 57, 34, 86, 54, 53,111,205,145,165, 18,207, 77,209,140,141,144,210, + 36,130,106,152,104,255,135,185,169, 6,100,174,195,250,198, 46, 77, 22, 12, 37,103,103, 60,145,217, 12,234, 25, 87,101, 41, 51, +143,149,170,110, 4,171, 2, 58,184,222, 96, 34,127,252,167,223,151, 71,143, 30, 74,183,217,160,147,255, 64, 13,242,235,227, 11, +205,114, 15, 41,224,225,251, 99, 53,174,234,140, 43,171,124,151,227,227, 67,205,198,223,146,214,200,215,224,232,132,153, 62,218, +160, 62,124,231,129, 20, 75, 5,205,244,247,201,126, 55, 28,200,101,165,209,184,148,245,114,150, 68,183,141,245,154,188,255,224, +182,124,242,229,151,210,104,247, 36,157, 74,107,144,144,101,134,134,108,108,123,125, 69, 51,252, 99, 57,175, 55,200,122,199,223, + 99,191, 18,154, 61,183, 59, 93,217,215, 0, 2,245,211, 86,179, 47,201,246,132,109,111,141, 43,119,102,191,118,127, 83, 78,175, + 70,242,248,229,165, 60,216,204, 74,187,121, 41,173,110,160, 65,198, 29,102,173, 72,224,166,154,148, 60,127,245, 82,131,132,177, +236,221,186, 37,157, 86, 67, 86,239,175,202,202,230,150,156,171,227, 6,249, 13, 33, 78, 95, 51,255,230,235, 35,201,169, 67,204, +164,211,236,197,175, 31,156,203,211,199,251,146, 72, 3,150, 31,186,204, 80,109, 27,216,234,151, 19,167, 17,255,248,255,248, 11, +246,184,227,229,225,132, 18, 6,245,233, 44,167,206, 13,135,125,125,246,162,102,191, 99,201,175,228,164, 92, 91,149,166,158,181, +239,253,240, 99,169, 86,215,244, 44,166,153, 61,119,116, 45, 46,154,154, 89,151,243,132,157,209,181,134,172,117, 99,173, 34,143, + 95, 53, 66,144,216, 74, 65,159,173,217, 62,209,191,119, 44,113, 64,249,141, 86, 71,126,248,175,127,164,251, 0,198,126,146,103, +123,162,255,212,147, 45,135,251,175,185,150,133,124, 94, 42,186,134,189,254, 80,122, 35, 43, 67,181,213,222,160, 47,167,141,103, + 46, 16,209,192,225,252,178, 33,117, 93, 88,212,191,141,201,161,139,149, 61,233,112,178,229, 98,142, 78, 53,147,178,122,143, 58, +242,248,197,144,235,239, 50, 92, 43,159,127,121, 37,187,187,187,122,119, 38,146,205, 23,229,248,188, 33,181, 90, 77, 6, 99,253, +153,230, 80,142, 14, 78,101,216,214,204, 94,223,111,181,182,226, 38,221,105,144,116,118, 81,151,195,163, 83,185,212,128, 2,240, +124, 89,159, 19, 65, 94, 90,147,193,130,102,226, 8,250, 70,163,177,107, 75,156,232,119,250,234,192,115,154, 40,234,207, 54,175, +122,114,107, 43,163, 63,103,228,213,209, 72,131,197,134,174,101,158,201,164,137, 36, 51, 86,150,120, 75,243,254,244,104,139,112, + 76,168,126,225,116,130,200, 64,176,232, 52,199,153,173, 15, 34,156, 47, 27, 29,134, 20, 78,117,179,145, 14,167,120,223,235,130, + 79, 99,151, 84, 27,109,212,122,216,200,148,204, 37,253,244, 40, 76, 31,229,205,121, 70,226,179, 43,162,101,106,167,219,145, 68, + 95, 36,198,222,161,149,197,243, 82, 98,130, 81, 76,202,174, 92, 72, 19,202,154,147,167, 96, 62, 38,174, 33,127,162,255,141, 66, + 0,136, 30, 19,212,102, 78, 81,228, 96,230,228,147,252,103, 50,140, 71, 34, 6,202,198,179,141, 32,214,187, 46, 49,102,115,212, +248,218,232,232, 81, 27,255, 57,187, 60,215,125, 94, 35, 53,241, 61,149,101,131, 25,231, 50, 71, 7,207, 44, 19,186, 36, 54,211, +122,161,167, 28,155,206,102,174, 15,108,177, 49,118,122,124, 80,130,141,169,163,153,101,233,249,249,204,110,123, 83,157,126,246, + 14,161,232,204,172, 46,190, 60,179,219,218,101,152, 40,194,120,143,126, 97, 76,123,220,196,107,229,178, 52,109,196, 46,177,254, +103,251,224,153,235,227,110,205,114, 79,187,137,197, 87,209,210,198, 60,144, 51, 81,185,152,184, 96, 44, 30,225,244,232, 82, 46, +207, 26,110,152,199,108,102,248, 92,192,195,211, 12, 38, 37,163,158, 26, 42,205, 50, 54,182, 87,101,123,119,237,218, 56, 95,115, + 3,148, 21, 15, 50,204, 66,244,194, 68, 46,230,146,144,208, 87, 49,100, 77,172,151, 63, 74,220, 48, 75,162,137, 38,222, 85, 18, + 69,170,230, 80,156,229,216,202,185,154, 94,152, 45,192, 56, 67,134,179,219, 27, 74,179,126, 41,141,179, 11,169,170,147, 41, 21, + 75, 84, 84,235,116,122,210, 83, 35, 26,248,174,247,186, 82,174, 74,167,219, 18,171, 78,254,193,131,119,228, 74, 51, 42, 24,126, + 60, 87, 95,157,202,189,189,109, 66,173,111, 78,206, 8,209, 6,225, 36,171, 64, 51,197, 82, 78, 51,251,243, 75,169, 85, 74,178, +177, 90,149, 31,127,242,144, 65, 83, 90,237, 4,122,165,209, 75, 93,200,166,101,119,163, 38, 79, 94,190, 86,199,212, 34,108, 12, +167,136, 25,217,200,210,240,186,103,154,213,131,209, 14, 39, 11,114, 86, 33, 87, 32,243, 59,175,206, 16,250,223, 63,250,172,163, + 89,103, 70, 29,142, 47, 31, 63,111, 73,175, 53,144,245,234, 72, 51,251,156, 60,125,217,213,224,161,197,218,121, 58, 87,212,119, + 45,200,169, 58,145, 98,169, 42,173,160, 44,231,175,223,144,189,158, 85, 59,132, 62,245,161, 58, 15,236, 31, 2, 22,124, 63,254, +147,162,131,240,248,188,200,110, 39, 65,142, 25, 50,251,230,141,165,195,244,244, 89,138,250, 25,200,196,224,164,241,119, 35, 72, +153, 6,174,131,192, 22, 93,141, 27, 90,241,231,167,231, 82,215,224, 5,136, 72,166, 80, 96, 79,118,253,234, 74,250,189, 62, 97, +242, 23, 89, 16,213,140,252,240,179,182,252,250,135,219,178,165,129,192,103, 79, 78,232,120, 77,210, 48,120,152,241,184,160,172, + 71, 51,173,166,119,164,206, 78, 63,145, 89, 58,187,151,244,189, 70,158,107,209,131, 93, 77,169,189,237, 99,112,141,102,189,105, +194,215, 67,238, 23,222, 13,106,114,236, 87, 7, 41,109,198,149, 98,189, 59, 65,201, 84,212,178,217, 2, 72, 2,161, 67,238,146, +211,128,200, 4,146,185,169,239, 50,233,137,245,184, 94, 31,126,240,129,116, 7, 67,146, 17,225, 55,158, 60,219,151, 96,116, 37, +223,120,247, 3,121,242,217, 39,116,244,253,137,165,254,126, 87, 51,243,164,190, 16,156, 58,191,115,109,157, 8, 17,122,212,193, +242,135, 14, 59, 8,154, 40, 3, 37,197,215,181,183,148,232,205,166,145, 52,122, 26, 8,245,116,109,167,146, 73,164,229, 47,254, +242, 71,114,120,240, 82,126,255,247,255,109,249,230, 47,125,192,119,159, 13, 97,185, 94,146, 90,192,129,158,141, 56, 80,107,174, + 35,105,145, 17,116, 38, 50, 64, 44, 94, 93, 51,215,147,162, 89,201, 90,174, 11, 65,153,175, 34,194,134, 53, 71,151,211, 4, 17, + 62,153, 9,187,176,108,124,100,243, 77, 0,224, 76,147, 37, 6, 83,204, 62,193, 61,116,242,184, 62,148,169, 77, 74, 57,231,200, + 41,122,203,195, 94, 70,247, 43, 16,240,128, 99, 47,230,210, 17,118,178, 51, 36, 65, 8, 35,216,185,222,115,192,218, 10,234, 65, + 94,120,129, 88,215,130,244, 95,161,200,154,146,241, 34,181,195,101,237,171,101,253,247, 89, 38, 27,165, 22,196,224,145, 37,177, +172,165,249,237,203, 60,132, 57,195,221,204,154,245, 69,162,131, 18,174,183, 41,221,212,158,102,226,179,201, 67, 41,208,184, 50, +156, 68,250,186, 35, 99, 55,231, 61,225, 86,226,168,251,162, 53,227, 90, 11,115,116,230,134, 72, 92,241, 40, 70,108,140,210,220, +100, 62,153,205, 70, 24,251,198,196,213,200, 22, 67, 24, 76, 44,136, 49, 17,249, 81,179,220, 55, 41, 18, 83, 82,138,139,157,216, +107,226, 67, 49, 50,219,146,196,238, 98,156,168,204, 5, 31,174,105, 26, 24, 19,227,109, 44,184, 19, 16,253, 8,228,236,244, 74, + 38,106,196, 16, 53, 67,246, 50,151,207,204,215, 19,231,185,172,217,195,153,102, 7, 48, 66,111, 94,157,232, 57, 68, 77,176,232, + 70, 10, 71, 51, 95,179, 68,102,177, 18, 31,210, 18, 27, 77,187, 20,252,197,198,187,154,136,190,129,137,147, 61, 35,229,165,232, +144, 26,107,151,137,114,222, 53,102,253,172,237, 14,117,108, 55, 99,217,204,207, 51, 12,196,161,174,195, 31,255,159,127, 38,159, + 62,121, 42,208, 69, 3,187,184,186, 82,147,231,111,142,212, 25, 76,217, 11,108, 53, 96,119,130, 34, 85, 57, 63, 59,101, 70,244, +246,123,239,203,241, 69, 67, 51,244, 22,159, 21,114,171,183,119,182,164, 80,200,200,243,253, 3,231, 68,130,128,193,249,122,165, + 34,154,126,211,168,227,144,173, 84, 75,242,179, 79, 31, 50, 67,192, 93, 71,240,142,224,106,119,125, 93, 42,154,225,255,228,211, +207,228,170,213,166, 13,240,194, 30, 99,144,163, 40,107, 74, 61,244,140,254,121,130, 89,118,119, 4,145,150,161, 6, 6, 89,125, +211,169,212,242, 9, 25,168,145, 31, 34,131,211,140, 9, 26,225,235,111,125, 67, 63,123, 67,146,133, 18,225,224,122,179, 37,117, + 13, 98, 90,157,145, 58,159,190, 58,214, 43,249,231,255,222, 63,150,131,147, 35, 61, 78, 62,153,222, 11, 68,199,253, 43, 50,114, + 8,222,192, 62,161, 46,142,118,170,124,214,233,171, 63,200,173,202,155,211, 38,237,215, 72,157, 96, 86, 29, 77,187, 63, 33, 90, + 9,135, 51, 26, 76,136,254,128, 39, 0,111, 59, 85, 7,181,170,107, 2, 97,152,253,227, 51, 57,189,172,235,179,106,112,163,142, +184,221,233,104,160,210,231,120,209,218,202, 10, 71,128,154,144,151, 82,206, 4,242,139,135,207,229,131,183,110,107,208,149,145, + 82, 33,203, 59,139, 30,246, 36,209,166, 44,185, 2,208,195,199, 48, 25,216, 96,148, 74, 32,164, 52, 13, 66,142, 7,108, 43,136, +203, 12,146,250, 76,168, 16,188,120,214,141,200, 70, 82,149,207,166,217, 18,135,179,158, 6,210, 2, 46,131,174,115, 54,227, 8, +183, 94,200,222,166, 86, 15, 90,245,216,114,232, 81,240, 6,117,109,204,155, 71,134,141, 99,134, 32,240,190, 6,122, 64,112,158, +190, 58,146,170, 6,116,251,111,222,200,197,197, 41, 17,136,102,227, 82,146,217,170,180, 71,129,236, 31,236, 83,177, 14,107, 58, +214,231, 70,173, 29,223, 3,165, 64,180, 64,102, 52,208, 6,124,223, 1,178,160,123,143,224, 1, 45,124,183, 55,171, 68,127,218, +186,167,121, 13,126,140, 6, 20,245,203,145,108,110,237, 74, 93,207, 17,214, 99, 4, 30,200, 44,231,182,139,123, 17, 11,178,109, +228, 46,205,147, 63, 47, 54,166,116,230,135,162,217,110,172, 54,111,108,204,134,199,234,223, 49,187,126,173,118,184,164,177,177, +228,164,231, 8,113, 50,142, 60, 47,203,128,207,109,255, 66,167, 63, 76,213, 23, 3, 96,230,188,168, 8, 53, 0,240,251,209,113, + 93, 70, 26,229,237,108,228,101,119,173, 40,187, 43,249, 80, 26,208, 25, 32, 79, 13,227, 4,103, 7, 12,120,254,119, 33, 54, 67, + 41, 69, 40, 47,169,209, 24,104,164,142, 99, 50, 24, 56, 37, 32,136, 6,224,162,215,202, 16, 29,232,201,235,131, 19,141,254,183, + 52,146, 46,107,246,148, 9,167, 30, 69,154,135,236, 66,101,199,216, 27,152,128, 17,184,220,204,152,100, 75, 13,233,139, 31,241, + 34,180,123, 19,135,172, 99, 53,143, 5,219, 57,214, 30,110, 23,144,104, 20, 94,181, 33, 27, 60,174,231,110, 99,146,159,241, 58, +121, 20,241, 55,203,177,193, 82, 43,194,117,137,117, 19, 21,127, 89,250, 76, 79,194, 6,228, 57, 20,180,232,127, 95,232,249, 47, +186, 24,226, 12, 76,115, 3, 35,115, 65, 58,139,214,169, 34,243,190, 34,202,124,215,152,113,115,245, 50,185,137,200, 25,229, 66, +196, 26, 6,194,183, 90,238,219,151,197, 60,128,197, 16, 4, 19,249,243,197,243,227, 28, 1, 82, 93,219, 92,151,186, 58, 39,100, +139,179,178, 89, 2,189,186, 26, 80, 22,213,240,194,200, 53,245,239,125,223, 70, 56, 35,145, 0, 99,233, 82,222,164, 3, 49,159, +133,108,150,186, 50,204,114,171,166, 93,136, 38, 93, 51, 5,178, 52,115,218,196,196, 95, 36,210,142,102,101, 65, 6,196,123,251, +204, 34,253, 24, 70, 7,131,136, 76,240,203, 39, 47,229,232, 76, 13,171, 73,170, 67, 95,227,251, 94,129, 89,206,150, 52,205, 40, +199,200, 70, 53,227,171,148,101,208,107,147,108,117,235,246, 93, 57,209, 53,105,181, 91,106,120,135,116,248, 27,235,171,180,150, +227, 65,155,131, 81, 32,221, 89, 43, 1,178, 46,211,240,247,244,126, 3,133, 1, 44, 11,200, 29,223, 3, 8, 21, 70, 10,246, 96, + 71,157, 46,148,194,126,242,217, 67,246,174,103, 56,200,100,241, 14, 78,212,101,241, 6,168,211,227,247, 80, 87,223, 92,169,200, + 69, 11,253,235,234,156,240,125,125, 16,168,134,142,201,237, 37,165,117,212,166,242, 91, 75, 51, 96, 32, 5,200,242,178,250, 78, +104, 93, 68, 6,120,119,103, 91,186,157, 46, 33,249, 32, 92, 39, 86, 59,195, 54, 40, 16,174,124,181,117, 24, 3, 59, 35, 74,165, +203,101, 41,228,139, 44,209,116, 52,161,129,243,192,122, 33, 51,205,160,158,107, 18,116,170,227,177,207,127,166,117, 77,210,168, +131,251, 83, 6, 58, 19,205,158,143, 47, 47,228, 84, 51,116,216,221,181,106, 89,182, 43,105,169,135, 50,180,101,180,148,233,207, +165,147,174, 71, 25, 9,102, 50, 83,144,175,191,187, 37,231,141, 46,161,232,161, 58,218,141,114,214, 57, 86,168,174,233,119,221, +218, 41, 75, 51, 57, 82, 71, 54, 98, 54,125,118,217, 33, 19, 28, 25,247, 84,215,162,170,129,192, 72, 29,104, 62, 99, 24,188,118, +213, 57,226,172,151, 10, 73, 6, 32, 40,137,126,237, 94, 77, 62,127,113,166,201, 84,146,237,129,107,149,162,180,100, 36,197,108, + 66,127,126,162,193, 80,159, 65, 13,216,243,176,219,216,171,213,114, 78,234,237,174, 58,214,190,238,163,161,182, 0,246,252,214, + 70, 85, 51,234,158, 92,234, 57,233,107, 80,119,120,240, 74,131,159, 30,215,113, 56, 77,202,227,163,169,126,127, 93, 26,205, 58, +207,150, 23,102,209,224, 20, 32,160,198, 21, 25,235, 90,161,214,238,143,172, 52,187, 39,243,249, 56, 40, 1, 15, 70, 9,150,206, + 64, 24, 36,207, 32, 88, 12,150, 57, 62, 63,229,218, 83,162,215,134,243,210,131, 96,110, 59,131, 57,243,221,196, 21, 41,237,130, +224, 59,183, 81,222,178,136,178,157, 75,102, 71, 37,156,226,156, 48,115, 77, 93,194, 68,178,108, 99,150, 6, 77, 89,185, 54, 53, + 51, 78,220,137,139,210,152,229,244, 54, 54, 42,197,206,125,129,137,176,230,226,195,187,236, 92,128,134,225, 66,185,148,145, 51, +141, 16,155,237,145, 84,114,186,152, 26, 57,218, 32,162,193, 99,160, 55,172,135,145, 76, 87,215,166,128, 40,119, 74, 61, 94, 68, +117, 70, 94, 29,183,168, 26,181,174,135, 25,209,213,120, 98, 53, 75, 40,241, 96,181,122, 99, 6, 2, 3, 61, 36,235,149, 46, 97, + 34,202, 30,166,211,142, 69,143,141, 44,230,231, 6,155,253,154, 34,139,103,136,189,224,117, 65,116,207,139, 72, 7, 70,250,237, +131,185,252,171,137,181,244,137,231,197, 51, 70,107,151,178, 81, 27, 19,244, 88, 16,235, 77,248, 93,203,142,224, 58, 41,202,222, +160, 79, 16,151,215, 93,160, 6,178,188,161,179,119,136, 72,160,206,160,251,107, 53,116, 27, 33,120,136, 89,192,195,178, 32,217, +205, 9, 90, 70,150,102,144,219,216,129,189,198,223, 54,209, 97, 37,113, 31,110,151,132, 19, 76, 52,142, 50,203,164,112, 19,231, + 53,152,104,163,216, 82, 75,225,146,114, 94,172,247,213, 68,153,228,113,230, 32,206,202, 4, 82,152,225,159, 31, 30, 94,170,145, + 26,203,131,251,155, 92, 59,127, 50,150,112, 82, 97, 4, 50,243,174,139,208, 68, 35,238, 37, 2,157,141,114, 41,110,234, 40,187, + 6,184, 71, 9,145, 17,114,142, 93, 38,178,219,136, 0, 70, 84,237,104, 86,250, 11,194, 12, 61, 32,175,133,122,228,225,254,249, +212,212,126, 33,127,244,103,223,147,227,227, 19,169, 22,139,242,246,253,123,242,250, 84,223, 95,179, 88,232,177, 2,197, 8, 8, +113,231, 53, 43, 26,202,201,201, 51,249,250, 7,111,203,239,254,198, 7, 78,234,148, 89, 89,149,142, 17, 70, 29, 48,254,179,195, +166,102, 90, 67,117,244, 99,231,168, 52, 43,107,245, 92,246,183, 81,204,202,147,215,175, 9,169, 22, 10,121,214,147,241,244,190, + 62,231,253,237, 45, 62,215,167,143,159,168,163, 24,134,164, 91,143, 48,184, 27,169, 9, 81,145, 52,181,188, 17,240,127,248,214, + 3,181, 17, 73,117, 18, 3,218,149,124,218,163, 54, 56,136, 92,152,210,245,209,163,215, 92, 27, 56, 62, 24,245,171,171, 43, 73, +238,237,241,231, 49,132, 37,167, 25,223,253, 91, 27,114,158, 77, 73,181, 84,146,142, 6, 43,207, 94,239,171, 99,203,144,228,135, +113,170,176, 53, 92,171, 16, 98,198,191, 19, 81,208,181, 1, 89,111, 50,105, 18, 85, 40,169, 51,251,217,231, 47, 37, 97, 33,210, +226, 18, 23,204, 97,135,235, 64,105, 21,239,142,243,133,236,115, 66, 78,194, 68,202,133, 20, 19, 26,144,210,138,172,179,167, 24, + 56,164, 83, 57,185, 85, 72,203,243,243,128,228, 46,236, 95,161,128,122,124, 64,117,180, 82, 54,144, 33,164,109, 33,219,170,159, +117,103,171,172,239, 91,144, 47,223, 76,229,170, 55,160, 72,203, 89,179,207, 0, 53, 77,101,186, 36, 3, 13,148, 81, 16, 28, 76, + 32,192,147, 49,204,222,207,186, 3,214,211,103,195,105, 0,162, 0, 90, 47,171,179,174,104, 48,118,121, 53,210, 44,120, 76,123, +139, 64,167, 8,117, 54,207,146, 63, 0, 22, 58,202, 12, 8, 10, 81,126, 5,138,113, 92, 31, 49, 80, 73, 39, 52,176, 27, 59,157, +249, 4,101,113,123, 50,208,224,226,178,121, 37,151,231, 39,115,165, 58, 79,131,180,108,190,172, 1, 10, 36,124,251, 82,211,192, + 97, 56,180, 92, 95,212,239,209,206,215,215,207,245, 66,206, 8,214, 30,173,209, 51,233, 89,227, 57, 17, 27,152,123,100,238,126, +176,232,192,129, 56,142, 21, 39,217, 75,145, 83, 59,165,252, 46,101,203,225,212,141, 44,228,193,131, 69,249,206, 70, 4,160,162, +109,193,146,136, 50,232,237, 92,155,222, 44,235,151,196,164,190,151, 96,111, 51, 67,165,189, 5, 4, 63,155,186, 23, 44,117,200, + 68, 66,129,217,200,242, 27,122,113,111, 16,228,138,232,150, 92,135,175,227, 54,210,218, 88, 2,138, 63, 75, 82,142, 79, 15,205, +206,206,186,164,245,194, 29, 15, 19, 97,155,148, 99,194,219,233, 76, 62,210, 39,115, 18,211,137, 90, 87,109,201,165,172,148,171, + 85, 70,247,136,174,222,191,155, 37, 84, 36,226,178,119, 56, 65, 58,245,142,131,134, 86, 86,170,100,179, 66, 2, 81,164,175, 7, +197,155, 19,131,208,122,132,199,193,197, 45,104, 96,241,238,123,119, 57,217,200, 70,178, 23,137, 79,115,117, 78, 31,144, 78,119, + 20,146,164, 16, 37, 23,121,176, 47, 27,109, 94, 48, 92, 86, 42,133,133,172,253,216,226,205, 6,134,216,185, 78, 87, 12,254,141, + 41,199,187, 78,150,185, 60, 35,178, 95,160, 17,254,212, 50,154,191,222,119, 30,201,242,141,189,217,195, 71,235,168,177, 49,171, +139, 14,129,107,213,218,112, 95,230,168,192, 12, 38,143,138, 7,217,168,115, 55,241,105,105, 75,255,238,130,129, 96, 81,203, 55, + 18,147,208,141,176,248, 34,232,145,137,193,193,177, 72,115,185,231,222, 51,215,234, 65, 50,143,138, 35,171,102,151,138, 49, 65, + 84, 84,201, 44,101,202,203, 19,240, 12, 13,212,201,209, 57, 21,189, 48, 8,162,113,121,197,121,195,103,103, 87,204,146, 6,172, + 1,142,231, 68,207, 40,233, 49,122,245,108,140,109,191, 24, 31, 57, 47,175,124, 69, 59,165, 93,194, 91,108, 76,199, 93, 34,138, +135, 11,184,221, 70,172,143,177,241,233,108,243,154,251,108,150, 18, 6,121, 16, 61, 11,230,165,175, 39,207, 15, 40,194,242,248, +241, 51, 57,215, 12,189, 90,174, 74,173,182, 42, 67,117, 92,179,169, 83,147,177, 58,109, 53,196,165, 66, 89, 26,234, 16,155,245, + 11,146,141,238,221, 90,147,223,250,246, 30,131,116, 39, 56,227,130, 45,126,143,254,255,225,247,190,144,143, 47,213, 24,171, 83, +171, 85, 87, 53,112, 71,166, 62,145, 85,189, 95, 31,171,195, 70,175,121,173, 90,209,207,159, 50,176, 71,253,117, 85, 51, 94, 12, + 82,249,226,249, 75,214,165,103,211,198,176,222, 57,206, 37,247,232,156,225,196, 71,236,184, 49,108,121, 75, 91, 48,161,199, 68, + 5, 82, 89,205, 56, 53, 99,214, 28, 89,218,221,138, 38, 6, 85, 89, 79,128, 84,149,165, 3,235,214, 52,211,108,181,228, 92,179, +193,157,205, 77,121,247,222, 30,245,222, 3,117, 72,232, 61, 7,108,158,201, 58,238, 14, 50,233, 97,167, 67, 50,111, 6,117,117, +223,159,151, 89,224,232, 81, 18, 68,224, 1,136, 28, 89,255,154, 62,255,173,141, 18,107,251,147,238,132,157, 61,201, 80,194,213, + 17,251,140,244,122,158, 58,168, 49,207, 22, 68,117, 96,131, 64,246,202,100, 74,180,113,105,253,249,149, 66, 65, 14,235,125,117, +180,250, 62, 24, 40,131,245,165,188,106,142,182, 13,236,254, 15,238,108,144,217,141,117, 67,246, 89,111, 13,229,183,190,117,135, +173,127, 54, 72,211,153,161,167,254,229, 81, 75,159,213,147,247,238,174,202,197, 85, 31, 85,125,126,111, 70,207,120, 49,151, 36, +162,241,214,173,117,221,219, 33,133, 97,214, 52, 48,232, 14, 38,106, 19, 39,234,200,147,178,181, 86,144,251,187, 85,253,255, 99, +182,206,109,212,114,186,230, 26,188,233,223,109,106,208,244,233,147, 83,233,168,253,196,249, 27,163,182,238,163, 78,142,251, 63, + 17,200,229,239,172, 87,100,107, 37, 47,141,246, 64,206, 53, 56, 56,175,159,200,229,133,115,232,197, 98, 69, 10,229, 85,138, 82, +189, 57,120,163,201,153,238,115, 54,199,247,233,246,251, 92, 51, 48,243,193, 95, 24,105,166, 63,183,141, 28, 32,102, 41, 68, 4, +255, 0, 84,103, 74,197,188,137,158, 85, 39,126, 4,219, 10,149, 63,182,102, 2,157, 10,249, 92,174,191, 61, 96,201,129, 78,210, +206, 38, 47, 46, 4,195,108, 68,105,110, 89,179,197, 68,101, 89,151,134,112,153,101,141, 50,123,179, 84,201, 44,177,192,140, 9, + 4,150,253,254,128,207,214,235,247,216, 98, 24,229, 90, 73, 4,161, 69,201,105,166, 8, 40,255, 38,146,247, 13,237,179,215,219, + 97,227,227,144, 77, 68, 78, 22,170,130, 73,212, 97, 32, 48,144, 73,134,230,205,247,195,204,192,202, 68,100,222,175,158,152, 15, + 58, 8,248,119, 38,153,209, 72,207,145,118, 16, 49,115,132, 95,164, 9, 30, 27,131,200, 24,181,120,252, 46,184, 61,254, 36,152, + 59, 13,141,229, 66, 38,159, 97,180,235, 50, 18, 97,205,205,255,226,181,172,212,202,161, 66,147,157,219,120, 60, 52, 46, 66,161, +144,149,170, 30,224, 94,111, 36, 31,127,242,132,198,168, 84,204, 73,123,165, 36, 37, 61,188, 47, 95,189,145,221,237, 13, 13, 36, + 42,252,187,145,126,175, 31,140,213,184,229,231, 78,177,209, 2,115, 53, 29,155,252, 53,159,108,108,100, 62,187,152, 65, 1, 24, +255,250,189,111,246,207,248,207,189,221,117,214,126,174,244, 18,238,238,110, 92,203,212, 61,207,187, 94, 20,191, 73, 14,112, 57, +221, 91,154, 29, 30,223,228,136, 35,138,212, 91,230, 26,238,198,196,148,222, 22,162, 48,209, 78, 3,123, 13, 82,166,254,183,137, +215,200,109,108,200,205, 12,246,241, 98,179, 90,237,117,149,246,165,122,184,137,207,152,183,209, 49,179,230, 90,196, 26,109,233, +178,177,126, 56,187,120,159,249,120, 71,135,184, 12,251, 26,208, 13,134, 33,184, 97, 72, 92,122,243,234,136,151, 45,229,121,172, +229, 13,250,221, 57, 28, 15, 24,182,167,153,205,106,173, 60,215, 74,158,243, 48, 99,188,135,136, 54,194, 87, 92,236, 88,184,108, +227, 64,203,140,193, 62, 47,202,216, 56,226,190,220,105, 97, 77,176,136,180,131,120, 27,205,140,179,130,255,114, 88,137, 56,130, +209,195, 47, 94,201, 95,252,229, 95,209, 65,109,109,108,170,129,173,168,115,186,160,163, 69,102, 28, 76,135,204,142, 83,233,146, + 52,175,154,210,106, 54,100,173,182, 34,169, 66,133,181,223, 94,111,151,243, 40,152,113, 37,146,132,223,103,181, 21,100,176,198, +142,229,131,187,123,242,100, 31,243,201, 83,122, 87, 10,242,209,151, 79,244,119, 47,245,142,149, 92,150,167,107,140,250,244,214, + 90,141, 80,244,195, 39, 79,195, 81,166, 1,101,102,103,193, 14,209, 82,100,185, 9,103, 63, 60, 23, 33, 19,198,165, 77,161,212, +168, 39, 95,187,183, 41, 95, 30,156,202,183,191,118, 79, 63, 63, 39,223,255,236,204,177,176,245,247, 71,106,107,122, 26,188,245, +212, 25, 6,158, 35,223, 66,222,182,221,106, 19,166,237, 7,125,238,111,210, 75,209,217, 57,200,124, 68, 2,159,155, 69,238,130, + 12, 40,148,161, 65, 2, 83,221,144, 73, 6,234,116,142,142, 79,165,152,201,104, 80, 88,146, 21, 13,122,250,227,134, 35, 90,134, + 89, 97,187, 59,228, 89, 32, 89, 48, 28, 90,130,145,177, 83, 13, 10,234,245,186,220,217,203,200,174, 6, 25,200,172, 91,157,150, + 36,130,145,180,122,122, 68,211, 5,126,191,193,124,248,222, 80, 51,218,156, 62,127, 87,142, 27, 85,169,104, 0,243,230,164, 37, +133,188,218, 25,117, 82,251,167, 29,253,124, 13,124,244, 59,161,174,214, 84,219,210,104, 15, 89, 55,175,150,178, 92,203, 11,205, +146, 87,139, 89, 25,107, 16, 84, 31,234,154,121,104,241,243,213, 97,231,104,111,223, 92,116, 49, 99, 78,214, 42,154,161,183, 6, +242,247,159, 28,200,157,237,138,180,159, 57,254,196,116,236,179, 92, 83,215, 64,102,165,148,145,141,181, 34,187, 2,224,106, 90, +250,157,248,140,132, 9, 97,110,193,216,211,145,188, 26, 5, 82,173, 84,229,217,203,215,154,209,183,184,207,168,247, 23,242, 21, + 78,163,171, 55,142, 72,116, 76,168, 63, 64,189,189,221, 13, 8,183,131,244,135,117,131, 32, 17,157,177,103, 40, 49,140,254,250, +188, 56,228, 41,109, 50, 76,164,240,153, 54, 28, 55, 59,147, 14, 54, 38, 19,202,123, 11, 17, 6, 44,253,196, 15,141, 3,248, 9, + 72, 70,141, 89, 86,145,186, 65,109,244,122,255,184, 93,146,211,142,106,139, 88,185, 46, 50, 54, 23,214,178, 11,210,242,120, 58, +150,166,158,189, 11, 77, 32, 39, 67,180,237,233,254,106,160,100, 82, 94, 88, 34, 8,207,190,174,249,160, 61,145, 91,187, 80,231, + 75, 44,148, 73,151, 9, 97, 95, 49, 70,219, 44, 32,233, 24,146, 96, 35, 8,243, 66, 11,211, 77,212, 75,146, 69, 8,199,165, 70, + 96,181, 48, 91, 35, 7,167,121,179,246,163, 80,180,127,160,155,125, 53,156,146,144, 4, 77,104,127,234, 50, 92, 59, 93,140,200, +244, 28,180,207,205, 27,170,131,134, 11,199,160, 0,177, 11,162, 83, 16,146,123, 76,224,241, 34, 98,193,209, 82, 1, 65, 6,140, + 49, 68,187, 7,140,175,120,222, 66,211, 61,180,243,120,174,131,195, 58,165, 63, 69, 47,207,152, 98, 6,206, 48,224,127,199,103, + 77,194, 73,155, 27,129,164,244, 57, 33,190,240,230,240,146,178,137,189,242,132, 53, 36,212,165, 90,122,235,218,173, 69,160, 48, +229,164, 35,111,238,192, 65,176,218, 85,231, 61,251,238, 47, 63,127, 45, 47, 94, 30,235, 5, 94,147,195,163, 11,110, 44, 38, 48, +237,239,159,204,197, 83,102, 9,214,157, 59,155,140,134,173,253,138, 30,242,101, 6,121,204,129,199,137,102,209, 49,171, 86,162, +195, 1, 34,172,121,107,150,209,245, 5, 49, 46, 50, 45,205, 44, 53,137, 71,107, 58,241, 32, 99, 73,162, 48,142,105,197, 53,203, +163,242, 66, 81, 65,249, 88,155, 98,156,133, 31,111, 2, 95,234,255, 51, 86,110, 84,223,181, 38,142,232,163,183,117,228, 84,204, +102, 45,148, 48,238,109,205, 72,179,154,217,193, 24, 94, 92,180,113, 56,217,142, 53,251,138, 78, 71,157,188,217,226,223,207, 32, +192,248,140,244,133, 94, 66,172,197,208, 46, 41,199, 68,200, 53,177,234, 66, 76, 98,121, 25,159,183,145, 14,151,133,212,165,157, +149,136,194,139,106,194,126,243,152, 30, 65,128,250,243, 84,157,249, 51, 57, 57,189,144,163,195, 55, 82, 81, 99, 91, 2, 81, 75, + 13,106, 71,207, 60, 51,109,102, 48,122, 71,211, 89,174, 73,171,221, 97,182,190,183,183, 45, 94, 42,203,172,116,111, 67,239,238, +196,245, 33,227, 63,147,209,104,142,104, 97, 13, 49, 3,252,238,102,153,179,210,247, 53, 43, 71, 6,254,217,243, 19,117, 50,112, + 66, 89, 6, 23, 56,242,128,209,119,214,215,104,116, 31, 61,127, 65, 29,113,102, 35,129, 11, 66,238,108,109,145,241,254,226,224, + 80,239, 67,154,164,169, 76, 90,157,103, 54,199, 80, 29, 78, 21,159, 3,118,253, 84, 51, 84,192,198,119,182, 87,137,178,129, 16, + 6,152, 61,233, 37,169,130,214,133,238,248,196,169,150, 65,146, 54,151,201,242,110,172,104,128,145, 83, 67,250, 98,255,141, 52, +219, 93,218, 30, 40,227, 5,190,204,225,208, 22,246, 92,255,137, 30,121,172,175, 38,142,180, 73,198, 58, 49, 23,100,137,245, 86, + 75,157, 99, 81,166,186,102, 59,171, 85,121,125,222, 33, 76, 12, 18, 26, 83,144,233, 98, 56, 10,178,180,209,176, 43, 9,235,166, +194, 65, 28, 6, 12,116, 56,183, 98,118,160,129, 38, 52,242, 53, 99, 50,110,130, 26,130, 25,172, 21,100,110,119,213,200, 62, 59, +184,148,111,222,171, 49, 1, 41,229,211, 18,232,239, 23,192, 91,208,164,163,217, 25,177, 29, 16,240,254,230,138,218,194,113, 64, +231, 95,201,123,146,212,239,235,168, 93, 76, 38, 29,123,124,164,142,229,170,163, 25,241, 8,202,125, 9,118, 50,116,193, 38,199, +224, 26, 61, 83, 95,236, 55,100,167,173, 1,130,254, 15, 89,120, 83,207, 2, 84,230, 14, 47, 59,236, 3,207,235,222, 64,244,165, + 55, 30,206,135,189,120, 33, 50,130,217,246, 40,131,100,114, 5, 77,146,158,179,125, 15,237,136,107,107, 91, 84,166, 67,231,194, +101,189,193,150, 61,160, 30,224, 85, 36, 67,153, 91,236, 39, 80,147,182,218,113,148,120,136,116,192, 17,250, 78, 17,175,233,185, +121,240,213,162, 37,153,111, 26,254, 57,124, 6, 2, 74, 55,212,197, 13,214,113, 53,119, 87,122, 2, 97,251,214,206,102, 56, 98, + 54, 8,199,192, 46, 74,122,179, 65, 84,179, 33, 86, 51,231, 53, 75, 52,231, 29, 72,102,121,126, 72, 4,142, 23,179,108,222, 34, +253,231,139,174,166,114, 33, 39,181,138, 38, 7,114, 32,195, 30, 74, 8,105,185,255,246,186,120,153, 68, 12,145,156, 14,244,172, + 52,204,124,178, 96,156,214,228,197,179,241,175,152,129,229,236,166, 23,111, 83,142,149, 48,163, 19,221,146,146, 44,105,228,119, +120, 12, 69,162,156,100, 43, 9, 70,204, 94, 56,228,221, 80,153,202,103, 36,133,218, 14, 46, 47, 34,116,168, 21,169, 55,149, 96, + 62,143, 62,136, 25,108, 63, 28,223, 10,120, 15, 3, 24,178,186,113, 9, 73,196,134,116,204,106,154,190,239,218, 71,112, 88, 61, + 31,117,170, 73,136, 10, 24, 58,105, 28, 20, 64, 78,184,124,136, 41,201, 4, 69,180,169,135,170, 92,192,208,137, 36,167, 29,129, +252,210,214, 15, 47,228, 51,100,168,226,123,241,243,104,187,192,112,134,164, 30,212,171,102, 75,186,250,119, 38,156,116, 4,209, + 7, 9,167, 23, 5, 24,146,128, 72, 74, 13, 11, 32,200,179,211, 62,163,236, 74, 21, 36,154,161,156, 93, 92, 73, 38,159,119, 4, + 64, 72, 98,226, 50, 99,157,208, 74, 21,238, 0, 2, 73, 7, 37,249,132, 91,102, 48,137, 49, 54, 62,131,126,169, 14,111, 99, 83, +190,162,179, 89,162,117,123,115, 3,106, 51,107,217, 88,130,215, 99, 78,202,139, 8,230,132,115,205,163,196, 63,137, 79,157,155, +205,142,191, 62,113,111,137,146,191, 16,100,143,212,200,189,120,176, 98,150,116,240,231,173,117,161, 80,195,108, 30,180, 93,240, + 84,162,164,194,216,168,193,144,240,226, 25,215,145,129, 78,139,148,103,231,147,155,156, 83, 82,227,138,218, 33, 38,114,105,180, +127,113,126, 37,107,171,121, 55,231, 58,194, 52,197, 30,225,115,231,170,136, 54, 26,180,196,251,216,237,141, 19,219,100,105,220, +128,141, 13, 9,138, 50,219,163,226, 23,179, 79,247,162,159, 28,138,105,152,104,177, 62,116,238,214,193, 11,116,146,208, 34, 7, + 67,253,103, 31, 61,148,159,127,250, 80,110,109,238,200,238,246,174,212,213, 97,157,212,207, 93,221, 24, 78, 82,215,160, 84, 40, +114,208, 72, 11,164,175, 97, 79,214,107, 53, 18,191, 14,224,160,213,224,130,217,140,207, 4, 9,118, 20, 6,245, 51, 36, 12, 66, + 46,165,156,102,126,131,169, 60, 63, 56,146,213,106,133,217, 58,140,109, 49,235,132, 99, 16, 60, 32, 8,222, 89, 91,165,163,126, +166, 14,213,132, 58,243,128,215,177, 71,187, 27,107,250,187,101,190, 41, 2, 92,160,121, 62,121, 57,152,149,221,155,215, 91, 55, +106, 43, 36, 98, 5,182, 68,155,241,246,222, 6,137,120,245,171,190,164, 0,221,103, 83,250,239, 45,169,149, 80, 90, 25,202, 85, +171, 67,187,130, 47,172,228,112,158, 82,114, 54,246,216,206,133,255,160,141, 44,151,118,210,176, 25,116,224, 36,167,180, 79,176, + 15,248,254,137,239,132, 78, 0,189, 99,248, 12,178,125,200,145, 54,244, 59,240,187,128,234, 43, 26, 40,108,215, 50, 20,186,169, +234,207,116,200, 14, 31,145, 92,134,179,155,162, 67,117, 83,209,192,224,135, 6,124, 38, 93,228,188,242, 46, 62,123,224, 70,157, + 14,135, 30, 33,102, 12, 96,153,248,234,184,141,144, 83, 80,211,172,174,170,206,112,162,217,118, 91, 19, 31, 40,206, 13, 53, 83, + 78,123, 83, 14,177,153,176,164,153,166, 29,201,167, 60,182,117, 53,219, 99,217,168,130,252,168,118,105,106,136,178,160, 20, 74, + 2,153, 26,158,157,181,138, 62,107, 74, 51,244,190,116,212,137,239,109,175, 72, 94, 3,134, 87, 7,199,114,222,236, 73, 95,179, +200, 84, 42, 47,109, 13,112, 11,105, 67,153,215,147, 78, 67,159,219, 99,128,135,214,102,188, 23,190, 23, 76,169,141,173, 93,182, +141,189,126,253,132,115,233, 49,122,182, 88, 40,107, 32,162, 1,207,209, 1, 5,140,128,222, 32,241, 66, 57, 5, 78, 23,237,135, + 8,188,160,104, 87,212,239,232,170,221, 30,235, 58,244, 56,194, 86,120, 15,189, 16,210,197,253, 69,217,204,141,142,245, 67,219, +144, 96,112,226, 38,215, 25,126, 46,246, 3, 35, 70, 49,187, 30,147,252,170,229, 82, 56, 84,199,196,245, 60,108,180, 76,182,140, +140,218, 56, 44, 62,211,136,240, 34, 51, 38,196, 92,235,242,137,183,176, 93,103, 64, 1, 69, 67,160, 13, 73,219,177, 63,224,119, + 32,209,139, 14,186, 68,187,163,111, 37, 54, 20,202, 26,185, 38, 45,123, 61,113,139,203,138,155,136,210,231,204,118,219,144,115, +179,144, 4,119,118, 46,137, 26, 5, 28, 39,160,202,122, 87,163,201,222,148, 15,139,195,132,108,252,180, 53,224, 2,239,213, 52, +170,204,185,105, 77, 57,195, 95,116, 99, 90, 77, 98,193,250, 54,174,141,173,169,145,117,103,132,133, 79,242, 48,128,132,129, 77, +152, 43,252,132,227, 90, 73,138,163,244,104, 64, 53,176,171, 0, 6, 24, 25, 54,106, 71, 73, 14, 56,240,209,247, 30,104,164,222, +109,169, 99,206,169, 65,209,131,151, 79, 16,170, 9,104,240,220, 48,129, 92, 6, 44,205, 62, 47,212,202, 74, 73, 51,148,190,252, +232, 71,159,234,101, 55,178,154, 25,139,237,118,121,121, 74,217, 42, 73, 47, 12, 62,188, 41, 15, 11,140, 78, 74, 35,247,156, 23, +112,113,187,250, 59,117,189, 56,152, 46,212,105,117, 24, 85,110,174,151,216,122, 35,120,127, 24,169,108,130,151,192, 70,216,249, + 35, 64,253, 54,203,236, 4,181, 92,108,120, 10,253, 45,179,177,174,193,178,195, 8, 35,174,104,155, 89,180, 94, 30,137, 44,151, +199,180,152,200,140,117, 27,149, 34, 53,179,129,229,241, 62,250,184, 92,161,137,147,222, 98,114,175, 75,125,250, 17,146,198, 53, +216,202, 46, 8, 32,174, 47,221,198, 52,254,231,239, 97,231,183, 96,161,232, 52,155,137,104,163, 35,225, 76, 76,109, 47,170,246, +196, 72, 94, 29, 8, 50,244, 55,175, 14, 53,168,107,176, 46,135, 31, 69,107, 27,158, 14,181, 91, 33, 12,143, 22,174, 33, 51, 54, +150, 23,172, 27,179,137, 79, 29,170,225,126,244,233, 99, 70, 17,247,238,223,161,168, 71,194,187, 89,143,125, 62,177,205, 68,155, +210,110,170,183,153,249,197,154, 59, 99,179,188,110, 54,146,224,219, 88,171, 5,156, 67, 32,145,187, 49,107, 19, 13,107,220,205, + 78, 79,158, 60,127, 41,159, 62,124, 44,199,199,199,178,171, 14, 29,242,173, 29,214, 44, 7,100, 27,131, 89,140, 59,153, 77, 57, + 81,143, 78,175, 43,211,209, 64, 29,250,170, 12,245,221,143, 47,206, 28, 3, 28,189,205, 24, 32,130,222, 99,127, 26, 27, 12, 49, + 11,206,159, 31,157,203, 90, 70,239,161, 58,198, 95, 60,217,159,171,126, 1, 22,245,195, 64, 21,164,184,102,167, 35, 47, 15,143, +233,224,209,174,138,146, 21,248, 11,123,234,208, 79, 46,234, 82,111, 94, 81, 49, 14,246, 3, 91,191,161,193, 5, 2,117,100,197, +200, 6,161,124, 7,225, 20,216, 16, 4,238, 80,115, 91,173, 22,244,121,125, 57, 62,221,151,237,245,138,102,178, 5,121,245,226, +133,124,231,195,119, 53,243,235,201,243, 55, 66, 70,246,101,179, 33,159,126, 94,167,125,185,119,255,125, 89,201,170,179,242,198, +242,224,237,175,201,163, 47, 31, 75,255,234, 74,126,247,183,127,147,109, 89,135,103,167,210,235,245,249,238,232,101, 95,175, 85, +244,121,179,234,252,211, 52,131,231,234,208, 97, 27, 32,136,130,254,122,100,154,191,241,222,134,124,242,234, 74,179, 94,203,174, +129,158, 6, 1,190,113,228,193, 2,230,126, 87,179,225,190, 99,109,175,228,155,171,101,169,106, 0, 4,100,228,249,171, 14,231, +157, 55, 7, 19,202,203,118,244, 25, 18, 26, 16,109,175,100,168,176,246,245,183, 54,228,238, 78,133,109,119,191,241,205, 93,217, + 63,186,144,239,253,252,137,124,253,222,170,148,179,129,124,231,151,238,145,117,127, 82,239,200,211,215,151,212,139, 71,208,243, +238,253, 85, 25,232,239,163,190, 14,221,253,163,147, 75,217,219, 44, 72,123, 96,101,165,130,224, 36,173,207,150, 32, 28,127,217, + 26, 49, 16,217,212,231,220,168,100,229,214, 70, 69,250,186,221,159,191,106,200, 84, 29,251,118, 45, 39, 67, 77,204, 32, 34,100, + 36, 35, 71,141,126, 56,124, 39, 45,165,202, 26, 75, 54,151, 23,167, 60,147,153,108,145,100, 56,112, 9, 94,237,191, 34,191, 1, +234,121,216, 87,236,183,245, 32,239,154,100, 80,131,172, 26,189,242,176,195,255,228,155, 59,178,165,207,245,175,126,112, 32,125, + 13, 36,209,222,136,191, 7, 90,179,185,190,206,128,174,213,109, 59,114,151,254,126,150, 2, 71, 62, 81, 17, 12,216, 41,106,112, + 74, 93,129, 96,192,231, 40,151,215, 92, 11, 94, 52,129,177,145,182,228,136, 32,215,141,202,152, 75, 35,148,237,172, 76,102, 22, + 9,137, 89,230, 16,221, 84, 90,156,143,165,118,115,239,173,254,111,164,107, 25,181,143, 51,155, 26, 83, 3,137,240,111,230, 45, +171,198,196,135,141,155, 40,243,254, 26, 22, 26,231,108,217,229, 18,160,243, 49,201,110,187, 69, 66, 67,171,171, 81, 80, 33,173, + 14,121, 76,226, 74, 90, 55,106,165, 82,100,212,152,176,110,228, 34,234, 61,200, 76, 17,229,181, 39, 14,158,247, 18, 83,126,102, +127,236,115,193,203,185, 20, 51, 88, 68,126, 40, 74,225,128,193, 88, 4, 97, 61,221, 70, 12, 29,231, 3, 39, 92,127,229,192, 79, + 75, 54,167,145,125, 94, 55, 82, 55, 61, 16,167, 94,149,148,137, 60,184,157,144,195,195,177, 28,235, 51,230, 52,170, 46,151,146, + 46, 3,245, 22,132, 57,212, 83, 81, 34, 0,204,212,239, 97,154, 84, 94,146,128, 94,213,127,107, 12,202,140, 4,181,156, 85, 76, + 57,210,200,113,140, 58,157, 26,190,188,102, 2, 65, 10, 4, 24, 95, 90,228, 23, 36, 57,241,139, 65, 75, 98, 33,224, 2,227, 90, + 72, 25,102, 56, 45,189,172,122,183,164,168, 23, 8, 63, 59, 82,231,130,127, 71,112,132,136, 21,204,235,179,243, 22,219, 68,138, +124,127,145,180, 30,130, 74, 49,171,193, 67, 33, 60,152, 54,174,148,182,172, 77,234, 69,218, 35, 66,104,214, 46, 59,244,136, 3, +193, 72,193,216, 28, 99, 49,145,233,236,230,186,182,254,204,127, 90, 23, 28,129,108,152, 43,100,221,140,223,101,213,178, 25, 33, + 46,114,250, 2,187,136,120,249, 28,190,107, 29,138, 77, 34, 9,159, 25,107,130, 0,142,117,236, 16, 70,138, 30,220, 40,211, 61, + 58,211,216, 70,234,212, 80, 43, 59, 57,185,160, 3, 65,205, 54,160,131,242, 73,178, 4,137,169,223,159,178, 23, 55, 5,102,103, + 56, 14, 50, 8,131,142,217,229, 66,143, 46,249, 29, 28,228,224,203,203, 23,175,249, 93,119,238,221,162, 54, 54,201,148, 54,218, +194, 98,227,115,237,162,206,120,121,152, 66,164, 7,214, 70,144, 25,187,204,137,159, 5, 65, 17, 45,129, 5, 68, 24,132,235,230, + 70, 90,162,230, 60, 30,141,229,203,167,251,242,127,253,233, 95,145,140,115,231,214,109, 42,154, 61,126,245,134,140,117, 8,167, +248,193,100, 78,242, 4,196, 10, 78, 1,132, 74, 42,149,178,116, 71, 35,194,215,236, 81,214,115,143,225, 37, 24,255,137,223, 75, +167, 18,139,185, 13,225, 90, 1,246,188,191,187, 33, 91,234,152,255,199,255,237, 47,233,120, 65,102, 66, 16,128, 44, 30,251,243, +206,222,174,156,104,118, 10, 7, 57,101,109,221,213, 10, 1,151, 3,210,197, 20, 46, 50,158,189,188, 58,161,161,203, 2,209,127, +238, 37,230,229, 46, 87, 94, 8,244, 51, 46, 25, 0,151,242, 21, 6,255, 84, 86,227, 40, 78, 95, 30, 61,254, 92,126,235, 55,255, + 45,102,170, 7, 71,135, 82, 93, 89, 35,225,113, 74,190,132, 6, 51,186,159,121, 93,139,149, 86,131, 14,245,241,227,231,178, 59, +184, 79,134, 58,116,201, 49,206, 19, 25,123,202, 75, 73,185, 80, 98, 16, 4,196,227,224,164,206, 41,107, 91,186,231,174,190,111, +152, 89,163, 55,189,144, 44,176,198,125,222,158,200,239,124,109, 93,254,135,255,247,139, 80,218,214,184,102, 39, 12, 34, 25, 91, + 14,168, 73, 37, 72, 50,114, 25,219,212,113, 25,128,132, 96,178, 92, 90,239, 67, 38, 83,228,160, 98, 4, 69, 96,202,111,130,116, +214,156,104,182, 61,146, 67,175, 35,207, 14, 91,242, 23, 63,121,193,132,101,160,153,250, 71,159,237,171,237, 12,228,211,151,117, +121,239,254, 45,217, 88,201,169,131,180,242,247,159,190,228,204,250,131,243, 54,137,111,245,206, 88, 78,207,235, 44, 51, 54, 58, + 35,194,218, 15,159, 31,202,222,214,170,126,247, 88,186, 3,159,123,182,183, 81,166,227,218,191,232,203, 71, 47,234, 68, 88, 1, +247,247,134,174,134,142,123,254,232,176,173, 54, 47,193, 18, 65,181, 88, 85,251, 90,150,102,253, 76,154, 26,120,161,204,128,131, +177, 94,168,134, 78,249, 76,223, 41, 67,210, 51,126,121,200, 44,213,205, 1, 65, 89, 19,182,113, 66,229,184,130, 6, 74, 61,185, +236,106, 50,165,123,250,254,253,187,114,126,121, 41,221, 78,147,172,250, 15,223,185, 39,111,221,127, 79, 3,166,190, 6, 64, 3, +153, 0,138, 71, 25, 73,239,228,149,238, 37,208,215,245,218, 29,217,220,218, 97,208,138, 63, 67,208,250,107,191,242, 77, 58,127, +172,115,172,220, 53,183,151,222,156, 16,103, 77, 92, 33,222,218, 40,207,103, 73,206, 91,188, 88,223,185, 89, 78,104,110, 84,238, +116, 63,131,210, 75, 64, 50,104, 58, 14,154,135,207,224,134,198, 44, 79,151, 52, 95, 49, 10, 34, 62,161,211, 68, 71,110,135,195, + 79,230, 36,250,104,146, 16,101,201,227,153, 96,224,144,185,130,200,129,168,181,168, 17,166, 7, 21, 31,245,134,165,148, 71,225, +127,102,194,186,235, 32, 70,192,201, 79,130,132,188,185,104,211, 72,230, 52, 66,174,170,243,111,247, 28,252,133,190,210,205,149, + 34, 97, 22, 76, 43,202,231, 51,172,223, 64,249, 41, 74, 67,162,208,133,157,240,114,183, 90,122,217, 2,143, 4, 17,252,103,152, +157,208,112, 99, 46,242,175,189,149,146,149, 53, 79, 15,210,170, 84, 14,166,242,250, 74, 23, 80,163, 95,182,165,232,101,177,225, + 32, 26,147,208, 40,218,104,180, 14, 88,214,128,121, 26,112,226, 79, 73,131, 0, 61,227,146, 72,229,245, 82,143,101,191, 49, 36, +188, 83,215,239, 68, 0,240,222,158,102, 6,122,209, 59,163, 64, 6,234,233,135,212,120, 54, 52, 30, 24,161,136, 90, 25,135, 48, +162,198, 7,134, 99,209,177, 24, 47, 59, 67,205, 2,146,252,110, 12,159,152,228,146,236,231, 5,145,103,255,211,231, 78,205, 73, + 15,103, 67,179,125,212,153,238,173,166,169,211,219,186,210, 0, 67, 63, 16,151, 46,157,116, 61,213,211, 32, 8,245, 84,220, 65, + 75,120,238,112, 78,125,103,224, 89,254, 72, 37,231, 92, 9, 39,141,234, 28, 20, 29,156, 56, 70, 47,202, 5,126, 96,230,228, 70, +182, 28, 34,114, 11,191, 39, 42,129, 56,107,237, 2,148,138,118, 25, 64, 97,133, 98,142,234,129, 32,202,112,156,169, 15,195,149, + 8,201, 78,193, 28,234, 70,182,229,121, 94,132, 17,238,218,253, 90,189, 17,191,143,229,155,192,213,133, 29,193,203, 25,254, 57, +194,111, 28,151,194,134,159, 51,239,200,243, 28, 3,219, 51,241,161, 56, 36,109,194,224,234,122, 90,244, 14,123,102,254, 60, 40, + 7, 65,148, 98, 38,208, 80, 43,166,165,161, 78,110,224, 59,193,149,153,178,214,236,217,177,166,181, 74,142, 89, 1,107,191, 32, +207, 53, 26, 50, 80, 35,150, 47, 21, 25,152,205,222, 55,166,128,103,221,243,217,144,137,238,234,128, 94,184, 22, 11,236, 44,176, +193, 82,123, 74, 68, 99, 62,176,225,251, 58,226,207,156,126, 16,216,249,122,216,240, 44,160,142,253,147,143, 31,202,207, 62,250, + 5,201,163,169,116, 65, 86,107,235,108, 9, 5,148,156,240,156, 2, 25, 36, 95,177, 71, 35, 14, 65,113, 72, 18,222, 19,173, 97, + 29, 4, 5,250, 57,112, 86,248,157, 77,205,148,241, 44,109, 61,199, 18, 50,223, 57,202, 50,132,237,112,214,144,169, 65, 16,228, +201,211, 23, 52, 21,172, 79, 19,114, 78,146,189,190,187,190, 42,231,186, 94,205,171, 54,127, 30, 1, 2, 69, 93,134, 67,190, 27, + 32,237,102,187, 61, 47, 33,160,150, 60, 0,140,170,207,218,247,134,116,128, 56,223, 65,216,166,135,191, 7,241,110, 50,117, 1, + 13,222,107, 69, 3,114, 4,219, 9,111,196,103, 67,191,116, 91, 13, 59, 68, 72,132,103,222,104,162, 49,226, 72, 82,220,131,118, +187,231,186,103,198, 19,102,167, 57,117, 42,157, 94, 71, 94,189,126, 35,247,238,190, 69,113, 26, 32,121,157, 30, 90,251,178, 12, +246, 97,107,208, 18, 88,171,150, 88, 43, 6,227, 59,229, 57, 43, 12, 2, 90,189,111, 24,248,127,251, 94, 89,126,248,184,161, 1, +121,129, 48,244, 88,127, 46, 0, 83, 91,223,161, 6, 54, 59, 50,226,112,124, 40, 85,235,194,129, 75,184,171, 32, 42, 66,165,207, +122, 78, 16, 9,123,129,243, 2, 7,120, 9, 54, 59,148,247,114, 57,205,166,171,228,161, 2, 73,112,136,146,149,134, 58, 69,128, +124,216, 11, 55,227,126,172,137, 70, 74, 14,207, 59,242,141,251, 43, 18, 12,147,242,253, 87, 77,169, 20,242, 82, 43,231,116,189, +138,154, 88, 9,145,129,169,102,182, 40, 63,226, 93, 64,128, 78, 27, 61, 39, 6,226, 65, 25,214,236, 65, 36, 68,219, 28, 80,142, + 44,208, 44,253,239,237,237,109,117,244, 3,121,179,255, 76,247, 69,223,207,100,165, 84, 46, 81,145,240,162, 89,151,118,167,165, +107, 80,230, 0, 28, 6, 48,227, 73, 88,242, 74,208,142, 13,212, 6,142,135,125, 41,230,243, 12,222, 32, 30,115,114,209,146,119, +190,241, 43,146,104,141,229,224,248,140, 1,249,215,222,126, 71,254,219,127,249, 95,201, 31,255,229,143,229,226,197, 57,231,204, + 67,243,189, 90,204, 75, 87,247,172,165,123,249, 95,255, 23,255, 66,110,221,190, 35,127,250,231,127,207, 82, 9,234,247, 27,171, + 21,185,125,239,182,171,179,207, 21, 47, 29,100,191, 12,173, 71,239,222,156,241,238, 45,156, 58,248, 6, 94, 12,117,244,226, 42, +155,209,233,144,215,185,176,243,182,101,218, 37,125, 28,216, 18, 79,207, 92, 92,152,195, 57,221, 41, 64, 6,207,139, 12,139,138, +182, 74,155, 27,218, 99,163,156,162, 72,170, 23, 97,219, 70, 21, 48,231, 5, 67,187, 64,114,147, 59,219, 59,114, 75, 47,107,167, +117, 37,232,140,128,204, 99,169, 92,113,189,222,232,107, 4,148, 12,225,127,117, 86,245,246, 0,179,249, 36,227,217,121,182,137, +168,137, 19,133,172,157,143,185,116,189,135, 62,179,191, 65, 95,163,247,146, 58, 66,153, 25,241, 80, 25,203, 15,230,147,215,134, + 26,113, 62,127,209,145,188, 70,179, 43, 26, 65, 59,109,102,212,179, 60,201,127,107,155,108, 87,172,251,246, 94, 94,142, 59,174, +150,239,135,125,138, 41,246,103,186,232, 10, 53, 86, 56, 97, 56,109,148, 14, 70, 80,237,153, 36, 53,179,201,176, 79,179,232,101, +230, 89,110,217,100,164,161,135, 5,223,211,212,247,186,226,231, 26,233,144,124,147,167, 35,192, 1,178,118, 26,206, 60,134,160, + 78, 78,134, 96, 23, 90,143,117, 75,212,131,144,129, 67,227, 26,141,208, 93, 40,236,106, 96, 1, 59,215, 31, 78,165,152,182,156, +206, 4, 71, 81,170,160,103, 86,191,187,133, 94,207,161,171, 21,205, 54, 56,176,115,136,121,198, 30,134,163,135,118,192,118, 45, +205, 11, 9,105, 76, 32, 20,248,115,182,129, 80,143,223, 57, 83,143, 25,208,148,217, 39,222, 7, 4, 68, 56,246,148, 73,134, 2, + 14,206,144, 98, 79,156,248,135, 13, 37,121,221,104, 68, 64,104, 88,151, 78, 71,191, 55,147, 33,235, 23,198, 28, 37, 25, 60, 16, + 50, 97, 63,100, 20,131, 17,139,125,135,206,243,130, 43,102,121,112,129,150,192,185,164,216, 7, 28,204,161,121,252, 59,227,225, + 25,100,133, 58,227,196,149,121, 16,156, 97,224, 4,214,158,207, 24,170,151,113, 61, 66,168,140,228, 39,212,217,248, 28, 66, 4, +197,134,235,229,186, 49, 28,169, 6, 65, 38, 68,182,144,121, 32, 99, 97, 80, 17, 58, 15, 56, 81,188, 67, 94,247, 16, 81,117, 74, +131, 63, 12,207,192,247,228,114, 30,141, 84,235,178,206,231, 33,164,207, 86, 36,215,201,128,160, 4,223, 5, 77,133,153,144, 6, +213,190,244,222,248,126, 16, 81,119,114, 23,221, 44, 17, 0,231, 36, 52,124,142,231,184, 34,206,145, 91,135, 84,205,100, 88,233, + 28, 70, 92, 27,236, 73, 3,138,105,154, 13,215,214, 55,100,109,117,141,146,163,251, 7,111, 88,246,154,114, 22,131,199,224, 27, + 40, 20,126,158,129,158,113, 18,176,221,161,203,208,113, 78, 96,224,183,215,214, 8, 91,159,170,147,185,189,145,115,103, 46,225, + 36, 78, 41, 22,162,207,133, 51, 9,196, 7,223, 83, 78,185,154, 35,214, 21,225,216,189, 59,219, 92,255, 87, 71, 39,148, 33,117, +123,232,133,100,178, 17,223, 15, 89, 51, 74, 96,168,133, 98,143,208, 95, 13, 7, 64,146, 19,116,187, 83, 32,174,118,249,236, 73, +246, 94,143,168,234, 86, 0,233, 45, 20,188,130,131, 40,105, 34, 0,110, 35,166,132,225,172,229, 53,152,203,161,198, 28,158, 71, +172, 47, 62,171, 63,238,234,154,141, 72,238,234,247,186,148, 49, 5, 11,219,234,159,165,117,159,161,204,134,128, 36,147, 54,236, +193,207,101, 11, 28, 89, 26, 76,251,172,235,131, 15,208,233, 13, 36,171,209, 63,156, 33, 96,119, 64,196, 67,245,230,111,223, 43, +200,243,179, 49,207, 74, 41, 11, 36,168,205,192,148,221, 52,161,176, 76, 55,225,218,178,128, 76,162,142,141,150, 46, 42, 25,122, + 38,218, 24,202, 90,126, 41,159,160,218, 28, 72,192,131, 98, 95,142,207, 7, 36,146, 97, 32, 12,158, 13,109,108,232, 67, 7, 23, + 34,173,137, 20, 16, 40, 48,254,145,112,149, 10,105,158,123,148,255, 96, 67,176,159, 69,125,102,116, 45,161, 36, 53, 28,161,247, + 92, 19, 8,116, 2, 52,156,204, 45,158,227, 92, 19,138,146,254, 92, 70, 19,156,222, 4,101,143, 30,207, 27,201,130, 67, 39,241, +141, 50, 72,185, 92,147,163,179, 11,125,135, 6,237, 39,130,213,205,141, 13,206, 77,248,242,201, 19, 18,239,118,214,107,212,244, +199,249, 31,133, 53,114,236, 33,212,225, 74,165,130, 92, 93, 53,201,223, 0, 9,178, 11,142,132, 62,240,189,237,162,148, 50, 9, + 57,215,243, 80, 0,177,172, 88,212, 36, 47,207,238, 37, 4, 70,232,122,130,133,200,132,179, 67, 96,187, 16,104,228,178,121,183, + 31, 32,252, 5,238,156, 67, 64,106, 93, 3, 48,236,209,172,251, 37,202,211,137, 13,139,186, 54,174,195, 44, 77,201,180, 50,211, +175, 52,177,142,156,165, 30,247, 57,183,199,196,100,221,103,208, 58,108, 40,202,188,201, 90,145,220,132,155,219,101, 92,146, 21, + 19,208,138,242,110,110, 8, 26,162, 66,159,241, 46,163,235,172,248, 64, 36, 38,187,205, 41,109,249, 82,133, 47, 9,242, 12, 90, + 70,178,136, 10,199,129,187, 64,112, 24, 24,110,159,112,112, 58, 88,182,232, 11,197,248,197,146,102,166, 57, 68,129,154,205, 23, +244,224, 96,131, 17,161,101, 83,110,154, 27, 28, 97, 64, 77,228, 33,127,118, 4,197,163,165,218,101, 34,112,112, 45,156,199,148, + 80,106,129,237, 58,208,169,166,212,161,100, 56,118, 49,149, 71, 93, 62, 45, 9,125, 54, 48,155,209,107, 73, 71,149, 74,203,204, +234,231,245,192,129, 17, 11, 86, 51,178, 86, 56, 20, 56, 52, 47,225,160,122, 40, 70, 77,194,137,116,200,130,144, 81, 31, 28, 53, +244,192,251,148,124, 68, 61, 22, 61,158, 1,201,117,234,144,225,153, 81,199,133, 65,246, 93,223,111, 86,223,117, 20, 24, 42, 54, + 37,209,122, 50, 24,211,145,108,111, 86,248,123, 29,141, 86,225, 44, 40,207, 56,181, 33,121,200, 93,240,193, 16,106, 81, 30, 7, + 46, 64, 67,122,193, 31, 91,192,233, 54, 12,164, 32, 76,145,228,123,120,243,104, 14,138,125,121,223,149, 28,240, 94,168, 39,159, + 94,118,157,222,118, 42,233, 74, 16, 96,137,134,159,137,231,193,197,200,146,141, 25,132, 36,138,144,168, 21, 18, 20,135,106,128, + 77,224,179,191,214, 61, 66,160, 65, 88,159,129, 8, 8,148,128,215, 58,122, 65,161, 50, 5, 24, 17, 66, 35,128, 91,199, 36,131, +244,245, 32, 39,169,173,141,142, 4,100, 61,100, 5,235,239, 96,128, 6,156, 29,116,159,225,100, 26,152,182,229, 9,141,144, 46, + 23,231, 66, 23,210,174,164,131,200, 63,163, 1,201, 32,156, 54, 68,189,246,148,211, 8, 55, 97, 48, 98,216, 91,148,152, 11, 85, +224,124,206, 90, 44, 19, 32, 63,141,156,227, 65, 16, 5, 18, 92, 65,207,101, 73,143,198,180,144,118,194, 40,190, 11, 97,200,162, +213,239,196, 89, 60,211, 8,140, 14, 36,141, 50,204,128, 90, 13, 54, 36,191, 56, 84, 33,152,247,155, 7,243,113,141,193, 92,161, +106,166,197, 15, 71,135,115, 62, 47,169,204, 80, 16,207, 17, 75, 19, 9, 23, 20,204, 90, 97,130,208,193, 51,172,194,249, 52, 73, + 58, 63,234,111, 35, 96, 64, 48,167,153,240, 15,126,250, 51, 78,208,170,174,109,161,249, 83,206,235, 77,117, 56, 87,122, 15, 7, +116, 84, 21,102,183,150, 78, 9,159, 53, 30, 15,217, 23, 93,212,251,220, 66,175, 53,246, 9, 26,225, 19, 16,172, 86,248,108, 16, + 14,129, 12,236,132,142,118,170,123,147,156, 51,105,145,133,194,116, 12, 39, 35,162, 82,224,162, 96,129,241,153, 16,137,201,171, + 33,254,252,233,179,208,200, 58,148, 0,247, 12, 40,194, 36,100,181, 51,128, 11, 73, 79,201,112,238, 3, 36,101,103,240, 39,156, + 17, 8,106, 12,144,188,217, 76, 8, 23,228,160, 22,140,253, 70, 96, 1, 82, 29, 50,220,118,183,205, 18, 86, 96, 71, 36, 97, 17, + 9, 9, 92, 15, 51,148,243, 86,202, 43,174, 83,135, 34, 38,194,207,100,214, 60, 26,115, 38, 57,157, 60, 4,174, 66, 9, 91,220, + 3,118,185,192,150,104,246, 26,152, 41,251,206,135,112, 46, 40,161, 21,178,212, 58, 31,233, 90, 2,149,203,165,171,114,217,179, +178,189, 90,148, 43,181, 99,103,205, 65, 72, 26,203,240,231, 16, 20,150,209,146, 22,102,122, 8,122,113,243, 70, 40, 73,232,174, +105, 92, 65,118,248,233,197,133,156,158, 39,228,157, 77,117,108,154,224,116,187, 99,105, 35,224,154, 90,158,243,188,102,121, 40, + 25, 20, 75, 69,169, 55, 52,163, 31, 77,153, 73,195,166, 6, 83,189,199,153, 33,247, 4,159, 15,148,119,255,188, 43,191,253,193, +182,156, 92,246,229,176,222, 19,147,116,236,115, 6,135,214,208, 9, 99, 13, 17,240, 37,210,152,221, 14, 7, 62, 36, 33, 49, 27, + 42,252, 1,165, 4,185, 15,250, 6,103,103, 7, 26,164, 66,214, 85, 19, 7,117,158,119,118,119,165,163,239,255,229,211,199, 60, + 63, 59,235,171, 28,207, 11,103, 13, 50, 33,206, 18,130, 42, 4,181,120,198,162, 6, 38, 77, 77,144,130,208,254,160,190, 62,156, + 36,228,217,233, 64, 38, 15,159,177, 75,165,195, 89,247, 41, 38, 11, 64, 46,211, 9, 19,106,158, 59,160, 25,252, 35, 4,128, 44, +193,128,151,133,105,117, 83,151, 40, 78,244, 89,239,238,109,186,164, 39, 98, 43,189, 88,181,217,178,155, 33, 90,182,115,165,173, +248,204, 13, 89,146,170,182,177, 14,219,229, 9,155,230,198,137,149,115,190, 19,236, 88, 46, 65,159,149, 45, 59, 30, 21, 74, 69, +198,154, 57,252, 30,213,197, 88, 16,161,205, 53,226,109,236,209,172,137,200,151,199,133,176,110,228, 45,199,106,246,128,223, 13, +178,244, 22,157, 19,178,116,192, 25,112,100, 84, 42,246,173, 99,122,178,191,209,177,112, 1,175, 19, 58,214, 75,102, 19, 62,157, + 15,198, 60, 90,155,112,109, 43,132, 14, 97,244, 82,161, 49,116, 25, 12, 24,160,136,216, 17,149,166,230,227, 90,221,214,128, 65, + 26, 4,125,105,183,134,122,136, 3,119,241, 1, 57,163,254, 61,130,113, 79,134, 61,127, 99, 66,170,144,181, 69,240,227,217,197, +184,187,164,231,152,166, 28,184, 16, 26, 28,163, 7,121, 45,167,207, 17, 12,244,162,117,244, 98, 76,168, 50,213,154,142,164,173, + 70,109,107,187, 38,190, 6, 42, 89,205, 22, 2,189,164, 89,113,146,144, 48,176, 48, 70, 46, 67, 13,168, 33,237,132, 58,198,122, + 73,114, 52,138,147,176,133, 14,231,134,189,176, 9, 7,113,155, 84,154,235, 93, 43,103, 99,100,184,211,166,139,140, 17,157, 22, + 53, 11, 2,148, 28,132, 61,240,179,249,170, 88,147,174,239,207,219, 21,170,197,180, 27,241, 24,138, 48, 92, 52, 71,115,152, 57, +159, 69, 43,142,240, 2,219, 96, 76,168, 14, 8,166, 73, 56, 6, 63, 28, 39,178,201,157,205, 42,133, 46, 50,105,223,193,246,193, +196,161, 27,200,140,194,201,123,161,254,158, 83,191,210,247,236,233,103,118,250, 30, 91,112, 80,178,200, 34,120, 83,199,139,245, + 71, 31, 53, 84, 9,124, 13, 2, 91,122, 22, 70, 84, 8,155,200,121,203,101,233, 80,188,242,168, 43,173,235, 91,206,208,152, 35, +208, 73,232, 97,239,245,133,245, 62,100,162,126,218,233, 15,224, 25,166,186,207,137,116,158,203,128,103,240, 49, 40, 35,140, 66, + 41, 82, 17,184, 94,225,179,198, 64,179,150,148,220, 95,203,177, 6, 10,131,118,119, 53, 35,107,197, 4,127,120,194,189,215, 64, + 65,143,203, 70, 33,201,178, 79,123,236,211,169,130, 7,146, 8,209, 2,124, 86, 30,196,172,156, 67,143, 16, 84, 6, 62,212, 46, + 82, 68, 28,230,218, 47,179, 22, 51,252, 30,122,101,167,250,121,157, 33,203, 42,108,235, 10, 38,174, 69, 19, 16,182,103,231,189, +169,194,144, 42,225,216,222, 97, 73,193, 36, 22, 98,133,248, 60, 4, 82,252, 67,232, 53, 34,120,212,127, 2, 45, 67,192,214,210, +172, 7,132,170,237,245, 77, 62,251,235,163, 67,205,240, 70,212,118,192,119,149, 10, 37, 50,193, 49,188, 37, 77, 68,101,204,243, +143,246, 35,244, 50,187, 1, 29,174, 75,100, 93, 29, 58, 6,144,116,123, 93, 26,124, 24,126, 4, 88, 52,192,198,159,139,177, 32, + 59,131, 1, 7,252,187,138,246,170, 4,218,228,158,201,238,230, 46, 59, 74, 30, 62,123, 65, 71,142,239, 7, 42,128, 59,140, 12, + 29,119, 33, 25, 6, 37,168,167, 95, 77, 38,172,177, 2, 61, 66,230,142,231, 65, 79,184,131,104,157,227,169,148,203,116, 56, 67, +168,149,205,214,199,120,132,171, 51,212, 40, 23, 57,169,107,214,105, 83, 60, 19,229, 92,222,217,136, 80,213, 11,118,198,248, 19, +215, 54,150, 48, 68, 1,177,206, 25,205, 18,113,126, 18, 80,175, 75, 26,158,115,252,147, 11,239, 57,116,106,202,193, 38, 1,123, +139,211, 96,249,235, 30, 98,141,219,189, 17,109, 78, 33,151, 33, 87,225,162,217,100,253, 24,207, 57, 24, 38,229,221,157,117,249, +214,189,169,124,246,170, 33, 13, 13, 8,193, 51, 98,137, 42,112,164, 79,135,156, 77,195,114,134, 80, 60, 11,129, 78,187, 61,164, + 3, 4, 34,129, 30,246, 85, 64,218,250,189, 79,222, 92,209,193, 90, 34,125, 25,102,176,104,113, 67,208,130,210, 6,218,196, 16, + 16,100,210, 21, 57, 24,105,240,174,123, 95,202, 78,165, 53,152,242, 78, 29, 95,246,164, 51, 28,115, 47,129,120,240, 76, 97, 77, +213, 17, 66,184, 6, 44,255,205, 90,153, 51,223, 79,234,199,220,111,112, 78, 92,251,160,200,230,218, 58,131,174,179,211, 35,162, + 43, 9, 47, 73,244, 17,200, 45,130,169,167, 47, 94, 16,221, 90, 93, 89,209,204,186, 64, 20, 1,178,191,184, 47, 32, 1,102, 72, + 50, 12,164,172,123,156, 73,101,233,144,225, 27,114,121,140, 84,205,203,106,165, 40,199, 23,231,114,244,209, 35, 61,199,235,206, +222, 4, 96,197, 39, 52, 24,210, 44,125,234, 18, 30,153,245,255,139,235, 38, 66, 59, 35,202,134, 64,123,146,122,207,208,121, 52, + 30,246,100,115,198,121,137,138,103, 69,230, 98,184,228,103,241,103, 49,205,142, 40,137,120, 70,144,155, 65,223,179, 49,210,214, + 68,100, 87,227, 48,185, 92, 19, 23, 91,136,119, 97, 47, 16, 60,123,201,188, 35,214, 70,116, 69, 88,219,143, 78,183,140,229,234, + 38,214,120, 99,150, 71, 48,203,210, 92,146,152,191,183,215, 40,116,118, 78, 24,212,117,244,199, 67, 58, 71, 56,231, 49,157,230, + 52,148,163,180, 60,104,148,121, 4,123, 19,211,128, 0, 99,129, 41,158,205,179,190, 22,104,150, 59,132,225,210, 13, 34,103,100, + 20, 80,179, 23,170, 86, 25,221,128,219,123, 27,132,145, 16,121, 50,138, 14, 13,244,112,226, 28, 12,224, 76,206, 99, 23,151, 85, + 79,167, 9,102, 31, 8, 8,242, 20,180, 81,131, 5, 50,134,102,236,193, 8,179,156,245,208,246,135,108, 15,201, 97,168,130,117, +145, 46,235,188,168,179, 33, 51, 74,186,236, 3,194, 19, 56, 16, 27,106,240, 3, 13, 18, 48, 88,129,211,134, 60, 76,117, 42,136, +209, 72,116,164,134, 19,207,214,108, 13,121, 33, 65,124,169,104, 36, 61, 26, 14, 41, 44, 83, 40,149, 37, 95,204, 49, 91, 77,154, +128, 19,236, 74,201, 52,107,110,224, 8,180,174,220,112, 2, 48,232, 57,150, 17, 9,165,239, 72, 28, 94, 56, 76, 37,218,159,237, +135,173, 64,253,192, 18,209,192,243,143,194,231, 79,133,181, 45, 24, 85, 27,238, 18, 53,173, 97,244,199,129,203, 70, 66,137, 69, +252, 92,167,235, 51,144, 64,229, 3, 34, 60,183,214, 80, 43, 52, 36, 23, 18,194, 54, 14, 29,216, 63,190,226,230,195,192, 33,163, + 46,103, 61, 70,204,142,167,228, 46, 56,146,121, 67, 57, 72,159,127, 6, 77,233,163,186, 58,237,238,152,237, 45,126, 73,141, 99, +198,163, 1,133, 19,113,235,238, 90, 1, 53,206, 17,127, 8, 35,103,165,204,159, 1,236, 55,144,250,101, 75,210,183,203, 12, 14, + 51, 97,151, 3,102,101,226,215,203, 5, 35, 7,103, 61,214, 22, 83, 41,117, 18,186,197, 57, 61, 75,158,158, 45,156, 17, 14, 16, + 65, 80, 22, 26, 2, 31,208,188, 46,225,230, 74,129, 98, 50,237,142, 58,190, 81, 66, 51,160,158,108,151, 86, 52, 8, 53,114, 90, + 31,202, 74,165, 32, 0, 94,178, 9, 97,112, 1,150,110,175, 63, 38,116, 9,126, 70,165,148,148,129, 58,130,130, 38,125, 59,165, +148,131,230,245,185,128, 32,140,245,123,219, 64,140, 80,190,240, 64, 10,213, 44,120, 8, 84, 98, 72,242, 39, 50,250, 58, 52,193, +145,138, 0,186,212,247, 42,102, 53,251,132, 75, 9,203, 11,172,175,195, 57,133,253,186,184, 35,108,157, 75, 38, 72,158, 2,215, + 99, 93, 35,250,214,144,106, 44,110,255, 38,142,119, 48,232, 79,228,240,240,165,252,252,209,107,221, 43, 53,225, 65,130,243,199, + 1,199,194,200,195,112, 0,149, 65,169, 7, 25, 55, 32,112,161,160,147,208,121,230,114, 69,182,183,249,190, 43,137, 33,176,218, +221,216, 32,220,141,172,203,134,123,134,224, 6, 60, 24, 47, 52, 96, 51,174,195, 36,236, 44, 0,107,254, 31,253,202,251, 82,219, +221,150, 63,249,254, 39, 68, 82, 30, 62,123, 54, 71,122, 0,233,207,234,242,142,181,236,202, 7, 8, 12,134,212, 92,119, 14, 22, + 65, 6,200,120,168,181,151,212,142,224,236,193,240,163,172, 1,166, 60,117, 48, 18, 18, 34, 82,174, 71, 29,250, 23,168, 79, 54, +187, 3, 66,205,197,130, 19,147, 74,171,189, 65,217,136,208,172,254, 12,178,216,169,174,215, 88,157, 93,207, 79,200, 3,117, 48, +248,110, 4,117,105,117,144,112,166, 16, 31,242,194,105, 96,179, 86,163,126,167,175,206,188, 79, 52, 15,247, 21,123,159, 73,162, +117,172,175,235,216,214, 12, 26, 83,201, 10,174,164,226,143,228,162, 81,215,128, 54, 35,183, 86,203,242,245, 7,106, 11, 18, 64, +236, 38,242, 55,159, 0,162,183, 60, 99,176, 89, 44,127,133,112, 59,214,223,233, 38,184, 54, 44,232,170,131,131,132,233,108,185, +100,160,142,209, 17,236,198, 64, 34, 97, 59, 89, 30,112,193, 11,238, 21, 56, 13, 21,117,252, 14, 97, 78, 18,210,135, 77,133,224, + 10,120, 66, 87,186, 54,224, 44, 33,241,186,189, 81,150,135,175, 46,201, 67,192,175, 67, 67, 96,183, 8, 94,143, 38, 62,234,212, +129,186,246,135, 78,255,159, 45,133,211,128,200,210,246,230, 22,229,131, 27, 23,135,156, 30, 87, 41, 85,153,161,231,212, 46,190, +120,253,138, 65, 34,150, 0,246, 25, 8, 2, 52, 16,122,236,157,159, 50, 41, 75, 18,162, 71,194,213,215,239,188,197,225, 46, 18, +246,240, 27,227,120, 60,176,103,224, 52, 77,113,191,244,187,209, 6,124,133,128,116,165,194,182, 68, 71, 6,157, 48, 48, 64,185, +161,144, 47,144,220,137,224, 5, 42,157, 44,251,120,174,157,143,173,167,158,171,139, 91,207, 44,134, 39,205, 68,183,102,245,242, +232, 96, 42, 19, 87,211,156,253,187,179,205,102, 73,166, 53, 18, 32, 68, 6,111,153,136,110,199,181, 49,211, 33, 71, 7,162,103, +173,246, 64, 3,234,180, 44, 88,108,209,177,215,209,225, 85,215, 70, 96, 45,120,102,118, 38,179, 38, 55, 72,104,199,149, 52,231, + 29,180,145,209,225, 38, 50,251, 61,217, 56, 63,102,228, 13, 3,131,195, 60, 33,169, 6, 34,252, 1, 35, 38,168,174,193,209,163, +102,131, 11,136, 75,229,249, 99, 18, 55,216, 46,132, 62,109,182,187,168,209,107,250,236,229,206,103, 22, 35, 88, 97, 36,175,134, +104,205,209,207,202,163,151, 83, 8,129, 34,114,151,112,102,112, 69,163,176,223,248,213, 34, 13, 3,106, 72, 56, 20,232, 83,189, +188,108,235, 38, 38, 66, 85, 41,205, 54,218,150,132, 62, 10,254, 35, 35,128,225, 7, 12, 59,117, 83,140,212, 43,176, 53, 14,151, + 22,193, 7,122,223,127,241,172, 45,171,250, 14,117,205,176, 42,106,237,199,157,177, 84,171, 73, 66,246,156,220,117,112,161,145, + 41,144, 9,144,139, 82,242,181,183, 86, 24,100,212, 86,242, 60,200,157,182, 26,193, 66,158,223, 11, 15,150,207,105,198,148, 72, +147,244, 82,111,244,165,170,217,168,225, 36,186,132,232,254,202, 90, 46, 36,101,153, 48, 11,159,117,167,137,101, 93,171,165, 27, +208,155,104, 22,220,243, 67,141,122,247,115,222,212,132,210,135, 46, 51,196, 5, 34, 4, 45, 51, 34, 85,136,207, 32,186, 15, 33, +220, 20, 9, 62,200,126,117,207,198, 78, 4, 35, 65, 41, 78, 23, 33, 2,210,228, 57, 15,215,176, 63, 10, 88,167, 2, 68,202,131, + 22, 76, 73, 18, 12,144,225,240,222,120, 66,191, 30, 56,206, 3,156, 72,128, 73, 89, 40,189,120, 97,253,216,250, 60,188,157,161, + 35,244, 36, 45, 58, 6,220,155,160,173, 67, 8, 23,122,114, 60,242,229,188,209,147, 59,235,121, 13, 98, 82,106,168,199, 82,208, +115, 95, 43,232,119,249, 3,121, 11,253,200, 33,243,219, 69,230, 19, 26, 5, 4,237, 8, 36,132,117,242,153, 68,177, 9,251,159, +125, 57,208,236,252,240,120,172, 70, 43, 77,195,113,209,153,106,240,233, 90,161, 32,159,128, 44,191, 62,113,142,117, 20,120,204, + 12,240,116,229,124,138,231,252,234, 74, 51,178,114, 78,130,130, 83,168, 98,192, 5,146, 38,166, 11, 34, 56, 53, 35, 26,209, 41, + 74, 31,186,134,103,231,106,236,213, 58, 5,181,188, 12, 52,155, 71,173,121,168,191, 87, 2, 99,216, 56,227,137, 53,154, 96, 58, + 87,218, 57,120,114, 48,172, 93,160,120,128,221,129,122,233, 58, 21,117,157,123,250,193, 96, 44,247, 70,208,165, 31,201,103,143, + 31,137,209,224,225,170,141,154,100,150,136,217,241,217, 57, 25,200,184,230, 40,137, 20, 53, 91,194,179,158,156, 93, 56, 12,131, +227, 86, 39,122,102,171,172, 35, 55,218,109, 58, 81,231,252, 83,114,119,103, 75,206, 26, 13, 50,190, 17,132, 90,158, 37,127,209, +211, 31,146, 47,103,119,158, 2, 84,226, 72, 63,127,250,119,159,200,221,237,115,217,221,222,148, 35,205,182, 2, 58,170,192,245, +247,227,121,198, 35, 7, 27,235,115, 34, 8, 32,124,174,142, 90,194, 17,176,156,128,150,205,242,123, 88,131, 77, 77,185,191,112, +240,169,164, 67,244, 0,169,186,254,251, 41,201,184,224, 65, 84,113,129,244, 27,216, 58, 74,194,104,210,245,123,143,134,148, 45, +197, 80, 26, 19, 78,131,132,154, 27, 74, 71, 99,189,163,184, 67, 73, 12,242, 1, 18, 7,135, 63, 69, 7,204, 40,108,131,156, 58, +190, 5,116, 53,166,122,119,245,127,126, 34,195,210, 3, 96,211,124, 49, 35, 93,189,139, 19, 59,150, 65,167, 78, 88,122, 98, 29, + 76,140,121,239,227,244,216, 73, 13,251, 25,181, 49, 3,181, 9,129,252,242,131, 77,121,113,218,210,204,123,200,119, 0,178,143, +255,161, 62,141,245, 6,138, 1,164,100,107, 3, 2, 51,101,249,252,241, 99,215,102,233, 39, 24,196,190, 57,107, 73, 10,168, 75, +224,133, 19,213,210,108,177,203,102,179, 68, 76, 75, 32, 30,163, 31,223,115,165,133, 66, 38, 39,103,154, 61,231, 18,150,157, 13, + 64, 21,158, 31, 91, 89,211, 4, 4,182,118, 24,142, 65, 77,232, 63,119,115, 53, 66,255, 32,242,130,100,135,137,103, 64, 28,113, +111,225, 56, 55,214,183,228,226,252, 72, 46, 53, 96, 41,230, 93, 59,231,218,218, 26,145,192, 71, 79,159,240,192, 22, 50,233,185, +238, 0,208, 24,148,102, 73,154,213,125,202,232,179,228, 51, 25,233,117, 91,186, 7, 80, 5, 77, 59, 29,253,193,152,229, 52, 4, +109, 62, 53, 19,124,150,115, 17,176,192, 41,143,237,136, 73, 73,128, 86,189,139, 58, 19, 72,112, 57, 28,137,214, 77,201, 67, 66, + 55,133, 38, 94, 50,197,243,202, 50,170,204,164, 96, 77, 76, 58, 59, 38, 24,199, 22,105,111, 33,102, 53,159,209,225,205,117, 55, +102,243, 48,100, 89,157,243, 6,177, 23,107,174, 87,175,237, 13, 53,109, 74, 42, 79,220,160, 32, 8, 2, 45, 79,176,180, 54, 58, +175, 66, 98,127, 22, 27,250,100, 34, 99,199,151,213,202,162, 29, 80,215, 52,226, 35, 1,194, 44, 17,164, 22,160, 30,114, 13,164, +152,137, 7, 26, 73,162, 6, 11,193, 7, 74, 6,122, 46, 51,155, 76,156,214, 57,224,179, 53,181, 74,187,181, 52, 47, 4, 72, 91, + 70,163, 80,108,228,105,103, 36,167,151,125,217,168,169,129,152, 36, 66, 65, 17,143,151,227,139,167,103,136,199,228,183,126,253, + 29, 26, 18,235,245, 9, 23, 35, 2,199, 10, 78,116,227, 87,215, 82, 97, 93, 50,193,108,117,168, 25,202, 17, 33,196,128, 81, 30, + 14,196,233,229,144,189,150, 89,227, 19,206, 15,194, 44,119,134, 91,248,250,124,233,140, 19,125, 1,179, 20, 4, 62,100,165,168, +131, 83,139, 88,109, 69,181, 92,212,204,119, 72,214,103, 85, 51, 59,200, 44, 30, 99, 6,114, 38, 41, 59,155, 5,102,154,132,247, +144, 97,161, 30,220,234,107, 6, 55,101, 45,223,183,105,167,130, 37, 46, 3,184,179,183,226,212,242,194,225, 41,154, 59,139, 38, +140,204,234, 81,171,199, 93, 66,171, 31,178,231, 74, 46, 77, 71,131,212,170,128, 90,162,102,130,221,145,171, 13,227, 75, 89,119, +181,118, 46,151, 30, 24, 55, 97,204, 15, 29, 48, 97,220,144,216,134,195,132,192,133,156, 1,117,216, 5, 64,241,192,226, 3, 39, +216,192, 76, 9,196, 19, 68,207, 36, 25,186, 76, 31,151, 31, 57, 38, 56, 14, 48,116,168,229, 50,155,132, 60,227,200, 15,153,231, +128, 46, 51,178,189,230,133, 53, 76, 55,234,179, 3,163,161,151,175,215,110,170, 49, 27,176, 39,118, 37,159,112, 1, 32,164,123, +117, 67, 51,198, 57,183,148, 6, 63,247,110,149, 88, 55, 67, 75,209, 68, 29,102,202,239,202,121, 93,200,174, 79, 99,188, 47,186, + 42,230,252, 0, 87, 15,189,184,130, 30,193, 64,222,221,205, 81,213,236,106,226, 8,114,112, 55,129,239,120, 30, 48, 30,191,248, +242, 66,106,213,162,220,191, 91,115,193,104, 72,158,225, 88, 74, 73, 80, 22,248,224,188,199,232,245,157,237, 28,207, 92, 7,142, +222, 80, 62, 77, 51, 60, 32, 2, 78, 17, 17,123,211,211,165,235,219, 44, 89,233,154,148,235,251,164,165,175, 6, 24,226, 38,216, +231,151, 7,109,201,171, 83,221, 44, 76, 73,140, 68,112,214,209,140, 11,235,104, 39,104, 59,115,252,113,116,112,128,220,196, 90, + 52, 28,123, 56,122, 24,231, 26, 19,182,112,159, 32,239,137,125, 84,187,172,103, 4,227, 61,251,242,226,233, 23,114,166,239, 94, + 40,148,233,252,186,189,115,105, 52,155,236,203, 70, 28,181,181,182,170, 1,106,151,176, 40,235,164,200,130,213,169,161, 77, 11, +122,224,103,141,166,147,174,132, 46,130,126,239,198, 74,149,237,102, 24,208,225,148,246, 28, 17, 15,217,236, 76,169, 43, 21,150, +170, 38,126, 72, 94,149,153, 88, 70, 64, 57, 89, 24,169, 35, 13, 44, 2,113,202,123,211,145,107,159,195,103, 82, 99, 93,179, 97, +252,251,152, 51,189, 93,107, 28, 32, 90,103,128,157, 45,130, 96, 77, 32,174,211, 3,255,153,137,137,224, 89, 8,191,163, 47,154, +153, 95,146,200, 85, 65,207, 20,202, 83,245,171, 46,137, 92,169, 4,132, 92,134,204,122, 17,184, 77, 67,253,123,156,133, 49,103, +154, 27,214,152, 45,187, 52,220, 29, 71, 59, 46,230,202, 15,212, 62,180, 59,186,126, 22,130, 46, 61, 55,107, 2, 65,152, 6, 1, +233, 76, 81,157,140,171, 43, 15,198, 41,218,169, 66,113, 69,207, 87, 70, 38,253, 22,154,255,244,158, 20,244, 76,184,128,178, 63, +232,202,143,191, 56,146,111, 60,216,150, 15,223,189,171,217,189, 47,247,183,234,242, 87, 31,189,148,122, 87, 29, 87,210,241,116, +112,119, 74, 44, 21,232,174,250, 16, 1,202,201,254,233, 5, 3, 50,181,253,180, 5, 89, 48,239,123, 19, 87, 75, 14,220,187, 80, + 58,215, 56,248, 28,118, 14,179,212,209,174, 89,208, 53,174,104, 22,220,174,150,228,178, 30,206, 93,247,220,157,188,184, 66,144, +130,154,190, 35,255,162,180, 24,168, 45,110,107,128,210, 27,246,157,224,205, 52,173,246,109,202,242, 89,161, 84, 35, 1,237,249, +139, 39, 50,213, 0, 39,151,175, 18,113,221, 8,209,156,243,139, 51,106,180, 35,184,160, 58, 39, 2, 50,104, 32,248, 46,192,198, + 62,129,172,251,224,222, 91, 50, 29,246,228,104,208, 97,245,200,159, 76, 89, 42,162, 94, 6, 7, 43, 77,184,103, 96,173, 3, 45, +157, 53, 48, 19,105,212,119,223,217, 94,167,222, 62, 8,137, 77, 13, 92, 70, 68,199, 2,138, 0,193,130, 98, 54, 1,184, 5,199, +167, 87,124, 14, 92, 0,216, 17,218,191, 80, 74,124,238, 16,231,147, 46, 77,100,214,198,140,227,118,125, 88,138, 44,143,160, 88, +250, 17,187, 84,235,182,209,214,178,153, 83, 13,230, 19, 80,169,198,231,207,180, 30,102,179, 57, 34, 84,246, 96,140, 86,223, 84, + 68,225, 46, 70,145, 91,234, 48, 54,215,100,183,173,216,155,132,230,228, 90,218, 62,215, 30,113,227,116,147, 88,108, 24, 67,176, +101,133, 80,137,199, 94,237, 12,153,201, 30,179, 22,212,202,198,232, 55, 29, 3, 2,118,209,179, 13,135,220, 35, 66,236,141,157, +220, 35,220, 78,187,221, 1,150,202,108, 15,159, 11, 88,252,240,168, 37, 37, 61,152,193, 8,135,205,147, 6,218, 97,208, 51,190, +226, 28, 23, 46, 37, 14,135,203,210,199,252,255,235,213,188,164,223,246,228,188,173,198,103, 63,208,172, 33, 73, 22,106,227,178, + 37,187, 59, 85, 70,163,189, 78,139,136, 71, 50,149,156,183, 56, 77, 39, 14,166, 27,243,176,120,132,127, 26,237, 49, 71, 34,226, +125,144,209, 17,214, 70, 43, 93,119, 72,149,162, 59,187, 69,185,181, 85, 20,148,193,177,224,168,177,206, 88,142, 16,186, 1,132, +219,237, 88,169,173,150,244,253,211, 76, 39, 1,239,229, 74,185,176,165,194,177,152,199,250,174,232, 97,133, 52, 34, 46,206,134, +190, 67,179, 55, 97,166, 60, 64,139, 94,202,208,232,103,211, 66,146,141, 31, 18, 67, 80,207,153,132, 82,138,126, 88, 87,129, 51, +182,161,192, 15,102, 78,207,100, 68,109, 8,227, 67,115,199, 15, 97, 95,192,186,189,222,152,153, 58, 39,201, 97,144,132,117,226, + 62, 1,161,176, 4, 47, 26,190, 27, 44,226, 68, 48,118, 36,192, 16, 46,157, 13,187, 97,237, 30,149,231, 68,154,168, 76,116, 86, + 42,141,183,126, 89,179, 53, 96,157,127,109,165,196,190,210,158, 26, 51,156, 1,244,203,154,176,133,134,165, 7, 24,134, 84, 86, + 46, 71,105,169, 38,199,146, 93,205,235,115, 76,228,224,228, 74,238,110,230,152, 65, 57,205,243,192,189,159,254,255,118,167,175, +127,223,147,119,183,211,156,161, 13, 87,137,207, 2, 63, 96, 38, 92,180,161,123,112,103,119, 36,103, 26,224, 65,213,202,159,234, +185,178, 41,174,157, 13,137,105,142, 7,162,217, 74,115, 32,149,244,148,132,195,100,182,168,199,210,147, 91,181,172,180,199, 14, +125,152,134, 23,178, 51,242,228,228,234,138, 4,166,189,141,172,228,203, 73,142,218, 28,170,161,172,148,243, 52,126, 53, 61,211, + 5,111,194,243,129,118, 29,148,122,154,122,169, 87,178, 26,160,165,212,144, 77,157, 60,234, 80, 51, 35, 4, 42,169,144,209,139, + 0, 25,155,148,152,250, 51,181, 87,102, 41,199,199, 71,114,112,116,198,115, 34, 94, 94, 86,202, 5,102,168, 47,247, 95, 19, 81, + 64, 0,134,115,140,214,180,203,250, 5, 13, 33,157, 57,219,203, 18,122,119,106, 12, 86,207,155,173, 80,192, 72,232, 48,171, 48, +136, 23,151,115,189,192,153,234, 20,178, 9, 71, 18,195,222,213,220, 52, 44, 19, 25,104, 17,182, 9,229, 52, 19,171,150,212,233, +232, 25, 33,217,211,115, 51,220,145,205,163,118,139,192,193,112,150,253,132,226, 53,179,217, 8,188,123,190, 63,135,244, 1,185, +163, 76,128,239, 70,166, 6,116, 8,159, 1,117, 73, 24,103, 4,136,248, 61, 60, 51,218, 72, 49, 59, 29,176, 58, 62,231,172,222, +101, 0,130, 6, 17, 56,137,132,113, 1, 18,101,169, 17,176,195,210, 4, 99, 66,179,120,207, 73, 24,240, 97, 36,170, 27,229, 42, +204,226,249, 25, 99,200,167, 14,136,174,193, 94,121,185,156, 6,165, 87, 68, 36, 88,114, 68,199, 15, 96,125,160, 22,169,146,116, +160, 59,209,191,146,228,164,171, 54,174,204, 86, 93, 36, 25, 32,212,253,189, 58,189, 95,123,127, 79, 62,184, 85,148, 86,243, 82, +246,214, 74,186,119,125,135,126,232, 90,128, 64, 12, 69, 57,148,114,160,115,209,235,117,228,238,214,138,188,183,183, 42, 71,199, +135,178,127,214,147,219,219,121,217,219,173,241,119,192,237, 72,176,172,144,112,200,173,113,173,160,125,142,155,117,214, 28,229, + 61,212,228,241,127,152, 9,235,122,108, 84,242,210, 86,103,141, 51,130,250, 52, 7,227,164, 50, 84,198,235,143, 58, 28,151,139, +251,112,214,112, 76,254,221,157, 29,182,142, 61,125,242,133, 6, 52, 73, 34,124,171, 43, 21,201,228, 75,242,250,240,141,180,218, +109,174,125, 16,118,197,224, 94,224,140,246,250, 14, 89,193, 20, 56,140, 96, 15, 64,144, 46, 84,212, 38, 55,121,144,129,224,224, +153, 18,105, 55, 84,107, 54,167,128,164, 61,223, 57, 96, 23,140,187,137,109, 64,123,159,191, 60,213,128,216,181, 7, 99,106, 32, +206, 19,203, 96,214, 33, 65, 25, 13,214,129, 6,116, 58,135,161,244,247, 84, 3,106,136,208,164,216, 50,200, 0, 40, 17,182,166, +145,185, 34, 33,252, 30,159, 91,101,163,208,181,185,145, 91, 22, 78, 56, 51, 49, 77,231, 25,236, 62, 27,146, 18,109, 25,155, 3, +230,161, 88,205,100, 50, 9, 17, 12,143, 9,213,178,218,228, 92,214,194,216,175, 16,178,137,100,222,118,166,140, 97,151,134,193, +176,224, 31,239,203,143,185,241,200,159,132, 66,100,201,169,157,145, 61,194,154,175,134,148, 1, 72, 87, 32, 15, 37, 93, 91, 69, + 48, 52,236, 63,221, 66, 97, 81, 13,213,121,223,213,109, 65,144, 71,237,111, 56, 10,168,244, 6,184, 41,201,204, 4,178,175, 29, +169, 55,186,114,116, 62,116,132,171,161,102,243,103, 23,114,111,187,202, 75,146,211, 3, 53, 13, 12,225, 36, 56, 73,144,220, 0, +231, 56, 66,133,107,121, 89,171,230,228,178,231,201, 89, 91, 55, 94,179,191,157,213,140,116, 53,115, 30,214, 10,146,201, 25,146, +175, 96,196,225,224,167,214,193, 56,104,237,154, 12, 93, 77,241,236,178,175, 78,117,170,135, 82,141,157, 30, 98, 8, 64, 32,107, + 72,166,243, 28, 71,201,118, 10, 77,153,198,195,182, 46,106,150, 25,165,111, 82,234, 36,125,182, 92, 0,146, 10,208,162, 86,200, +203,184,221,211,231, 83, 7,134, 78, 1,100, 17,104, 67, 73,250,148, 92,108,235,165,202,103,115, 28, 22, 65,195,109, 92, 45, 28, +239,145,101, 95,117,154, 61,175,144,165, 77,234,229, 27,232,191,247,209,119,157,205, 18,178,197,214, 36, 66,178,159, 63,107,247, + 19, 19,246,103, 35, 96, 8,187, 4,124,151,137,121,172,213,154,185,113,101, 16, 2, 34,163,231, 4,115,112,153,219,189,169, 51, +242,229,180, 6, 43,142,133, 62, 25,250, 52,236, 99,136,180,120, 83,102,161, 65,216,247,233,133, 68, 37,200,137,166,192, 52,179, +161, 80,140, 93,204,176, 7,211, 26,151, 15,240, 58, 10,162, 36,193,235,250,156,214,251,204, 62,186,253, 49,215, 12,217,212, 74, + 49, 45,155, 91, 25, 89,205,107, 86, 23,244,213,112,102,228,238,122,158,209,109,107, 0,166,241,156,130,198, 44, 10,169,203,134, + 58,254,139,122,143, 93, 8, 83,253,142, 84,216,118,146,154, 17,248,117,167,183,212,169,175,215,138, 26, 92,244,217,121,129,242, + 14,244,220,215, 75, 8,250, 82, 44, 61,180, 53,115, 46,102,245, 28,174, 87,168,115,237,107, 70,249,222,219, 25,185,210, 12, 46, + 49, 29, 74,144, 42, 58,110,128, 26,145,177, 77,200, 73, 3,193, 70,155,202,116, 9, 13,107, 86,245, 76,175,169, 99, 7, 25, 80, +115, 75,221,195,172, 28,169,163,185, 80, 99,184,149, 83, 35,147,112, 76,100,171, 6,233,164,111, 41,109,185,146,135,179,204, 72, + 61,103,229,209,241,128,243, 8, 80, 27,220,170,229, 29, 58, 21, 18,178,120, 64,116,205, 47,207,206,228,251, 63,254,148, 26, 15, + 61, 4, 87, 83, 55,119, 26, 50,161, 56, 75, 80, 90,195,143, 15, 72, 98, 74,168,193,198, 4, 66,159, 83,196,242,106,212, 81, 54, +185,210,236,157,245, 79,240, 25, 80,246,210,204,238, 88, 51,116, 19,246,151, 3,190,132, 67,238,135,250,219, 56, 59,187, 91,155, + 97,118,228,218,235,172, 31,204, 21, 9, 29, 71, 99, 36,223,255,228, 75,189, 3, 30,247,113, 50, 14, 66,114,220,128,231, 12,159, + 1,103, 73,231, 26,248, 97, 43,171,117,162, 48, 83,167,195,143,231,133, 97, 31,133, 89, 60, 78,208,120,226, 72,118, 89, 56,168, +144, 20, 74, 62, 12, 52,217,115, 25,217, 89,175, 18,125, 25, 65, 65,175, 61,144,119,238,222,146,111,191,127, 95, 46,251,137,249, +116, 58, 54, 17,169, 29, 8, 52,251,129,182,125,127,210,225,144, 40,148,249,250,131, 30,109,211,140, 32,152, 72, 39,230,242,194, + 88, 7,144, 71, 38,128,255,217, 72,145, 32,212,141,125, 1,211, 29,236,236, 62,207, 54,156, 6,178,244, 36, 53,159, 77,183, 73, +254,205,112,132, 78,141, 33,247,231,103,143, 53, 32, 31,109,202,118,101, 67,138,197,129, 36, 53, 99, 70, 9, 6,223, 5,244,224, +205,233, 25,229,111, 17, 60, 1, 85,202,231, 82, 26, 0, 92,241,238,162, 21,236,229,193, 25,235,230, 41,174,139,149,205,181,154, +252,202,215, 63,100,208,245,252,197, 11,218, 70,244,131, 59, 14, 83,134,118, 44,145, 64, 32,148, 32,193, 15,107,129,214, 98, 40, +110, 2, 37, 75,178, 68, 90, 36,162, 2, 56, 27,252, 24,232, 76, 4,122, 97,135, 19, 79,118, 54,183, 56,176,230,252,252, 88, 74, + 80,105, 43,173,240,231,209,226,251,226,229, 11, 71, 74,134,230,193,192, 17,160, 97,143, 1, 41,227,255,131, 28, 90,204, 23,216, +229,228,233,218, 84,202, 53, 38, 0,224,115, 96, 47,146,105,143, 42,114, 16, 24,194,179,145,195,144, 76,206,213,210,188, 80,227, +221, 75,184, 78, 16,148, 70, 64,248,244, 79,155,124,198,153, 42, 40, 72,119,176, 95, 88,163,161,222,253,239,255,232,177,180, 91, +117,151, 84,194, 6,235,185,127,248,229, 27, 13, 96,167,174,174,159,118,112, 61,234,251,236,181,207,165, 29, 1, 59,157,114,154, + 30, 8,132, 80,247, 71,146,147,112,147,242,108,152, 40,197,187, 77,163,202,156, 50, 79,156,162,140,249,248,132,118, 27,203,232, +177, 86,105, 36, 16,122,183, 51,185, 68, 76,212,107, 62,123,195,134, 83, 24,205,191,105,232,140, 93,140,144,157, 73,221,154,136, +108,103,108,222, 68, 68,117,211, 46, 16, 11,107, 23, 79,155,132, 80, 3, 25,192,190,211,168, 77, 38, 28,100,238, 37,179,132,148, +174, 52,123, 90, 93, 95,151, 36,136,107,161,145,247, 67,125,119,107,176,112, 96,111, 58, 77,118, 2,196, 94, 98,174,115,221,211, +104,242,226,106,196,168, 50,165,118,224,251,159,156,201,163, 87,154,105,111,215,100, 15,164, 37, 50,205, 45, 97,207,132, 31,246, + 82, 7, 97,180,111, 93, 47,111, 50, 53, 97, 70,248,147, 79, 46, 88,147,221,170,130,173,115, 37,173,190, 51, 42,200, 72,243, 56, +164,201, 36, 47, 4, 72, 23, 9, 24,123, 53, 50,141,102, 79,170,122,105,222,121,123, 75, 90,234,232, 1, 49,253,230, 7, 27,242, +228,196,167, 19, 51,137,172, 26, 98, 44, 98,211,137,175, 96,224,131,113,245, 80,120, 25, 48,148, 81,227,193,225, 64, 22,140,250, + 82,183,211,101, 68,186,178,186,162,198, 56,144,173, 66,146, 70,200,215, 67,253, 96,115, 77,141,208, 68, 58,186, 6,187, 8, 34, +244, 66,163, 92,112,210,241, 9, 29,226,162, 34,120, 65,130,138,250, 91,161,152,117, 7,206, 10,117,174,173, 31,204,135, 15, 16, +246, 18,119,168,251,157, 54, 29, 89, 79, 29, 60,158, 13,181,114,212,198,199,168, 17,250, 14,161, 72,231,178,244,124, 64, 32, 78, + 47,250,154, 37,141,212,128, 23,213,248, 88, 18,232, 0,111,215, 10, 9, 53, 8,234, 52, 39,105, 74, 95,162,118,157, 52, 14, 98, + 22,182,139, 7,140,136,131,208,232, 99, 23,113,225, 92,187,142,149,231,251, 77,117,210,129,236,173,164,244,243,123, 12, 88,192, +120,191,108,140,194,203,231, 0, 32,100, 84, 48, 40,149, 66, 86,214,213,169,103,189,156, 67, 3,160, 86,182,145,151,207,246,219, +188, 24,197, 98,142, 53,224,153,102,121, 78,247,240,150,102,202, 56, 73, 83,187,208,107,103,137,194,179,225,196,166, 41,247,110, +123,189,196, 11, 12, 3,247,236,245,149,148, 31,148,100, 71, 29,113, 71, 13,247,225,105, 95,179,143,177, 6,114,154,105,233,158, +213,138, 8, 24, 71, 44, 27, 76,135,125, 18,225, 78, 19, 67,150, 66,122,166,160, 25, 63,136,148, 67,125, 30,140,153,156, 72,173, + 60, 80, 87,158,145,177,238,249,177,190,219,116,220, 97, 16, 87,206,142,228,243,179,174,188,179, 91, 37,243, 31, 76,107, 72,169, +122, 84,213,242,228,170, 55,113, 98, 41, 97,237,179,164, 65, 31,148,197, 70, 19, 39, 62,129, 12,252,135,159, 61,162, 40, 7,224, + 71, 56, 16,177, 5, 57, 61, 63, 39,188,190,183,181,195, 32,233,184,238, 68, 69,210, 97, 15,120, 81,179,203,225,196,193,222, 80, +102, 67,134, 2,231, 11,199,208, 33,251,220,205,188, 62,173,215,195,182, 60,189,199, 54,201,214, 67, 39,184, 3,103,154,146,123, +123,187,234,116, 46,244,115,202,226, 52,118,194,122,158, 62,107,171,231, 83,114, 25,142, 7, 42,118,112,174, 24, 43,137,207, 64, +118, 56, 13, 91, 12,135,193,104,214, 33,201,179, 54, 51, 57,126,216,103, 78,109,116,148,141, 66, 82,104, 50,225, 58, 45,240, 30, + 9,207, 11, 69,146,198, 60,231, 24, 6,243,173,183,118,228,222,206, 42,201,168,133,188,102,204, 70,215,185,154,151,127,244,155, +239,201,127,248, 59,223,144, 63,252,235, 87,242,240,243, 17, 3, 10,148, 38,136, 54, 76,199,116,194,200,236, 18, 9,199,118, 71, +112, 58, 28,104,144, 3,216,189,221,144,222,192, 57,124,160,102,112, 66,104,185,236,247,154, 84,157, 76,120, 5,233,250, 3,182, +123,141,186, 93,102, 56,104, 5, 76,121, 89, 62,111,189,217,209,247,244,152, 33, 7,211, 1,245,227,213,124,235, 59, 4,210,214, +187,248,108, 95,239,180,102,197,247,183, 86,101,255,164, 33,251,234,164, 18,155,154,132, 96,162, 90,185,236,218, 45,197,241, 94, + 96, 67, 51, 80,217, 12,146,156,210, 85,214, 51, 15,233, 91,168, 78,130, 99,128,201,109,144,240,125,185,127,202,192,105, 99,181, + 42, 27,107,107,204, 96, 81, 10,157,181, 99, 66, 68,171,219,115,153, 42, 68,158, 54, 42, 9,218,207,146,102,222, 29, 50,211,123, +180,189, 43,133, 12, 3,200, 98,165, 70,190,197,225,241,190,116,219, 93,118,240, 0, 90,223,217,218,230,144,154,131,195,125, 6, + 98,176,107, 54,228,103,160,196,129, 97, 54,135,231, 13,201,176, 36,146,145,180,245,217,178,230,153, 60, 21, 10,209,117,131, 86, +217,209, 80,239,169,174, 55, 18,145,166, 38,112,126, 40,172,196,119, 14, 7,176,192,137,130, 40,237,135,211,237, 16,204,136,175, + 65,245, 40,193,115, 53,155,237, 1,254,211, 8,226, 53, 35,167,173, 63, 98,151,133, 67, 34,129, 0,160,132,130,243,145,209, 64, +158,181,248,208,153,129,199, 65, 97, 36,142,210, 53,124, 63,114, 2, 52,192,197, 16, 39, 34, 65,128, 69,197,206,121, 66, 9,138, +120, 57,247, 7, 30, 6, 73,138, 33,191,196,145, 90,147,204,252, 17,152, 38, 34,138,162, 30,147, 24, 71,218,163,156, 50,128,238, +192, 5,198,220,239, 96, 38, 91, 27, 72,204,135,123,145,222,246,155,243,244, 69, 73,193, 44,164,182,103,217,253, 60,123, 15,229, +164,109,100,158,156,141, 76,139,164,100,123, 88, 67,211,128, 45,195, 31,193,166,218, 57, 12, 16,246,145,131,252,133,113,165,212, +248,237, 59,117,181, 16, 10, 38, 41, 38,188,212, 80, 49,179,198,101, 77,128,148, 81, 83,214,144, 64,141,164,102,103,123,105,217, +216,244,121,209,135, 35, 95, 94, 30,117,229,222,157, 77, 94,182, 68, 34, 57, 39,131, 0,102, 65,198,198, 17,141, 41,231,160,241, +208, 1, 24, 50,129,203, 16,235,237, 17,165,106,251,221,129, 19,121,208, 75,148,175,172, 73,169,182, 78, 3, 71, 72,112,226,178, +104, 68,242,247,238,104, 86,185,186, 74,167,220,190, 26, 74, 73, 95,110, 75, 47,195,211,134,149,150, 58,169,247, 55,212,248,168, +161,223,222,210,104, 52,227,156, 27, 5,241,211,249,249, 0,122,182,175,193,144, 36, 19,161,232,138, 83,200, 35, 64,175, 27,253, +236,162, 71, 70, 49, 18, 16, 63,108,105,130, 60,226, 0,208,191, 30,240,103,175, 47,229,232,188,195,136, 29,207,136, 67, 94, 44, +229,101,125,163, 66,132,194, 11,213,203, 92, 59,148, 43,121,224,192, 76,216,214,229,145, 97,155,128,174, 54,167, 39, 45, 6,206, + 88,146,177, 38,100,105,207,178,118, 36,221, 83, 93,199,170, 26, 69,192,190,119, 55,146,108,239,226, 16, 76,100,249,122, 96, 55, + 43, 25, 57,109, 14,164, 51, 73, 56, 40, 20,123, 96,166,100,225,226, 38, 81, 77,206, 75,211,121,162, 85,200,103,111,124,210,205, + 49, 54,174, 29,197,132,157, 12, 24,106,209,188,234,146,224,149, 74,186,115,193, 73,119,104,103,210,247, 45, 39, 80, 91,155,200, + 16, 65, 71,194,245,104, 35, 8,216,172,104,246,130,190, 85, 68,238,104,209,225, 57,114,172,233, 9, 4,128,134, 66, 3,223,167, +200,135, 94,240,176,205,204, 11,123,169, 61,227,180,220,177,100, 24, 64,129, 33, 25,216, 3,180,251, 92, 1, 5,200,167,101, 85, +179, 89,167,132, 88,117, 25, 61,152,197,154,117, 77,212, 80,193, 9,118, 45, 32,207, 4,117,210,167, 96, 90,235, 89, 93,219, 90, +225,180,194,173, 66,192, 41,126,251, 23, 35,105,246, 12, 85, 17,239,149,245,140,246, 27,242,242,205, 21,131,155,119,239,148,168, +109,144,207,105,166, 2, 78, 9,122,157,195,251,144, 8,134,116, 60,102,232,233, 26, 7,114,222,118,206, 21, 48,231,203,253, 55, + 26,116,212,165, 84,172,176,206,250,234,232,136,236,118,212, 64, 81, 39, 7, 41, 9,114,171, 16,228,216, 94,219,145, 79, 30, 63, +149, 23, 71,199,204, 72,112,183, 42, 26,192,238,110,110,240,172,160,173, 13,107,129,169, 94,248,189,170, 26,101, 84,236,177,207, + 8, 26, 97, 92,207,175, 58, 82,213,223,193,120, 84, 12, 70,129, 81,124,173,142,232,211,167,199,242,193,189, 77,194,208, 63,124, +120, 44,127,244,253, 47,164,144, 10,228, 31,254,210, 45, 57,107,180, 72, 2, 68,246, 8,148, 98,166,244, 56, 27,133,137,189,194, +254,207, 36,125,157,212,243,148,142, 63, 17,102, 18,184,135,179, 33, 31,201, 80, 96,199,114,223,156,156,234,230, 74, 78,238,108, +169,227, 41,229, 24, 76,129, 28, 85, 46,107,144, 7,148, 78,207,206, 6, 16, 61,253,156,127,242,157, 45,249,147, 63, 11,136, 88, + 77, 38, 33,113,210, 0,113, 88, 85,219, 48, 38,178,129, 82, 9,136,171, 72, 78, 96, 87,134,152,240,232,187,206, 24, 58,207, 65, +155,129,102,189,175,129, 5,248, 31,134, 45, 3, 68,144, 80, 46,193,121,158,234, 93, 64,137, 16, 93, 28, 32,141,162,141,106,164, +206,103,164,182,168,144, 97, 39,181,248,169, 2,219,232, 32,197,219, 87,123,120,114, 17,200,206,198,154, 60,184,255, 22,187, 42, +142,207, 78,101,107,125,147,114,208,128,156, 49,154, 19,104,100, 54, 91, 12,249, 4, 5, 61, 47,200,146,179, 82, 74,105,144, 49, +186,144,114,169, 38,199,167, 13, 13, 58,251,154, 96, 20,156, 19, 4,113, 81,223,179,219, 25,184, 14, 7, 31, 45,172,186,142,234, + 88,241,221,224, 3, 13,201, 95, 48,122,143, 70, 46, 67, 78,184, 14,134, 86, 55,144,149,149,117,218,145,231, 47,190,100,119, 79, +185,186, 74,101,184,187,119,246, 56, 8,235, 82,159, 51, 49,203, 63,131, 89, 6, 26, 48,160, 11, 76, 78,238,110,175, 83,119, 62, +175,119, 37,147, 24,203,189,183,191, 73,206,209,133, 6,141,208,131,255,213,175,239,201,255,254, 93,135,108,116,245,108,160, 85, + 15,122, 2,150,156,159,177,107, 13, 37,100,237, 80, 19,240,125,240,217, 8,130, 49,100, 40, 55, 9,216,117,195,132, 38,112,124, + 46,170, 44,218,177,147,217,213, 59, 9, 13,120, 24,225,161,254, 30, 74,166,249, 76, 49,108, 33,246,200, 1,154, 65,227, 64, 1, + 38, 68,129, 18,146,156,186, 36, 17,237,209,240, 85,176,133,116,210, 18,146,127, 67,177, 43,190,173, 31,132,186, 18, 78,244,138, +106,158,198,241, 63, 12,215,211, 35,143,138, 50,212, 16, 86,130,134, 1,202, 3,233,244,156, 71,210,208,224, 27,140,125,188,195, + 68,131,252, 32, 64,103,152,126, 94, 38, 25,198,203,174,160,225,148, 63, 23,207,187,144,162,142, 12,188, 12,179,127,179, 68,147, +183, 17, 18,128, 93, 30, 51, 21, 33,209,205, 90,243,168,253,222, 31, 47, 10,253,174,113,222,101,219,248, 79, 74,179, 3,144, 43, +218, 26,137, 13,123, 45, 89,215,204,199,203, 84, 66,118,161,147,234,156, 73,156, 82,111, 59,225, 96, 70,100,147,233,108, 86, 13, +137,209,131, 84, 34,233, 6,117, 28,244, 77,191, 57,185, 34,147,189,213, 26,205,123, 30,177,169, 20,134, 9,117,186,193,171,249, +250,157,178, 60, 63,215, 72, 40, 3,135,226, 83, 15,222,179, 78,161,202, 98,212, 33,234, 80, 32,177, 76,213,208,131,180,148,119, + 25, 7,140, 7, 28, 15,216,210,155, 59,107,154,113, 56, 2, 13,218, 75,208,206,146, 12,220,212,247,141, 98, 74,222,174,234,103, +105,228,140,122,217,213,196,145,213, 0,225,152, 16, 66,194,198, 67, 40,134, 35, 96, 65,238,130, 19,166,196,160,139,214, 38, 67, +244,109, 59,105,200,182, 70,241,143,206, 93,107, 28,106,145,234,194,229,229,197, 64, 62,126,114,169, 89,118, 65,246,110,131,144, + 50,150,253,253,134, 20,122,152,201,174,153,129,153, 50, 16, 42, 21,146,172,173, 35, 19, 34, 65, 69, 13,145, 81,167, 60,214,108, +181,167,159,219,133,160,196, 52,212,186,159, 78, 92,240, 96,237, 92,222,211,145,109,156,210, 25,106,104, 80,227,218,222, 72, 17, +225, 32,195, 86, 92,171, 27, 46, 61, 34, 90, 76,115,106,118,144,237, 4,122, 88,115, 36, 14, 34,160, 33, 91, 24,239, 23,104, 80, +228,249,106, 60,176,183, 41,183, 79,122, 24,239,221, 42,203,160,235, 49,176,131,227,152,134, 4,159,213,106,158, 78, 29, 78, 30, +194, 64,248, 70, 72,255,142,212,169, 1,225,129,176,204,110,222,137,187, 92,249, 73,201, 20,211,178,157,247,229,181, 6, 68,175, + 53,200,115,162, 29, 78,121, 11,235,113,123,187, 68,185, 87,150, 37, 66,201, 91,142,116, 12, 28, 26,128, 59,157, 74,186, 81,171, +248,187, 91, 36, 56,170,145, 84, 47,137, 96, 10,207, 50,235,127,165,152, 82,216, 83, 10,246, 55,137, 90,112,132, 99, 75, 67,208, +132, 48,142,160,214, 91, 96,246,119,127,213, 35,177,232,103, 95, 52,229,209,203,150,220,189,191, 37,123,107,105,201,219,174, 52, + 80,247,213,247,134,246, 54,122,230,119,214, 10,186, 46, 99, 71,132, 97,180, 46,204,158, 38, 67, 53, 74,255, 31, 87,239, 21,100, + 75,118, 93,137,237,204,235,189, 43,111,159, 55,237,209,104,120, 16, 32, 9, 18, 36,130,193,209, 80,102, 66,154, 80,140, 38,164, + 95,125,234, 75, 63, 19,250,213,191, 20,138,152, 96, 40,244,163, 24,141,134, 49, 65, 98,104, 68, 82, 3, 96, 64, 52,218,160, 13, +250,181,121,254,189,122,229,235,222,186,117,189,203,155,153,218,107,237,115, 11, 61,234,142,138,126, 93,239,154,204,147,231,108, +187,246, 90,250,223,246, 64, 3, 12, 53,222,159, 61,218,151, 79, 30, 62, 35,187,226, 96, 98, 68, 52, 24, 85,195, 44, 52, 50, 57, +148,128,235,229,170,205, 42,107,224,209, 81,231,239,147,171,222,104,119,241,157,112,142, 83,119,156, 97, 36,224,248, 33,140, 2, + 4, 58, 12, 17, 12, 13,248,214,119,214, 86, 56, 66, 4,174,110, 56, 89,252,185, 94, 46,202,254,233, 25,203,161, 48, 86,159, 61, + 59, 35, 48,237, 31,125,251,101,217, 63,239,201,223,188,251, 80, 3,207, 54, 25, 25,235, 37, 13,184,250, 35,142, 35,213, 10,101, + 58, 17,138, 37,199,222,111,180,221,227,136,215,100, 24, 14,235,119, 3, 36,199, 61,233,144,158,152,141, 15,157,102,192,130, 46, + 24,239, 69,118,138,123,233,141, 35,121,184,223,228, 24, 22, 8,137, 10, 32,168,210, 63,220,123,124, 44, 99,205, 68,115,106,148, + 81,113, 66,112,250,159,254,232, 59, 28,231, 58,210,224, 56,157,188,202,178,243,247, 94,191, 37, 75,101,163,134,197,185,122,167, + 23,200, 49, 29,127,204,202, 2,198, 50,105,236, 33,118, 51,113,204,144,168, 60, 65, 81,203,163,140,159, 58,188,136,188, 4,200, +190,192,171, 63, 13,155,146, 79,168, 99, 67, 31,223,233,215, 15,230,232, 21,231,168, 72,182, 32, 18,154,169,241,246,116,239, 97, + 58,166,221,133,140,105,139,213, 2, 0,198,150,212,169, 47, 85,235,198,131, 62, 51, 58, 89, 10, 72,207, 35,130, 70,201, 76, 48, + 15,216, 82,170,149, 10, 50, 29,142,228,228,160, 37,255,244, 63,255, 79,164,211, 58,146, 71,154,177, 23,244,187, 80,149, 33,240, +111,100, 96, 71, 4,128, 96,157, 3,157, 42, 2, 99,216,218, 76, 2,128, 75,159,247, 8, 39,134, 64, 54, 95, 94,209,245,235,202, +233,233, 49,207, 14, 2,247,157,237,109,202,244,158, 28, 60, 35,177,151,239,250,175,224,153, 55,172,133, 48, 80, 66,133, 9,207, +112,117,101, 67, 78, 78, 62,213,100, 66, 19, 34,175, 67,250,215,121,144,228,179,235,245,251,242, 79,254,240,150,124,231,244, 92, +254,234, 63, 28, 75, 81,131, 27, 4,163,179,208,174,193,156,144, 1,153,201,188, 7,251, 19,154,182, 61,124, 75,174, 80, 20,159, + 78,126,206,223, 1, 67, 69,202,227, 9,196,184,198,172, 86,180, 47,218,146, 87, 35, 6,249,215,112,110, 83, 18,168, 4,166,194, + 69, 53,200,252, 28,112, 26, 54, 82,105,213,206,121,210, 50,231,128, 21, 28,171,114, 0,195,185,160, 36,102,165,207, 95, 40, 25, +199, 14, 8,108,201, 35, 42,159, 36, 95,154, 4,174, 18,128,224,113, 96, 90, 17, 97,200,117,100, 11,139, 45,155, 25,247,253,168, +223,214,189,131,106, 67, 70, 70,231, 29, 61, 67, 51, 89, 89,206,200,250,149, 42, 63, 99,255,177, 6, 65,221,136,204,136,226, 91, + 96, 1, 64, 32, 41,188,161, 40, 73,177, 51,207,164,204, 9,172,181, 74,135, 1,249,189,255, 8,244, 23,127, 89,183, 53,254,255, +227,241,191, 68, 75,131, 51, 94, 83,219,249,248,164, 39,229, 74,233, 18,212,224,233,195, 70,175, 32, 29,146,104, 85,122, 93,227, + 96,158, 32,192, 77,171, 35,156, 59,234, 75,160,210, 99, 67, 71, 39,156,166, 30, 30,156,169,149, 37, 29,251, 25,162, 71, 56, 19, + 27,173,104, 84,210,140,106,209,191,197,184, 92,210,105,152, 7, 24,141,152, 7, 44,211,101,245,198, 54,106, 25, 57,237,140,200, +238, 54,195,194,250, 89,205,202, 83, 44, 27,178,140,131,168, 79, 13,195,113,107, 40,171,137, 33, 29,212,106, 57,146,107,235,101, +121,112,168, 14,107,230,145,205, 14,125,205,136,155, 13,122,190,161, 60, 61, 25, 72, 48,205,202,221, 53,147,134,245,213,161, 94, + 91,201,201, 39, 71, 83,150,107, 29,115, 45,175, 21,221,250,193,196, 4, 68,224,116,179,122, 15,187, 43,101,205,206,231,226, 72, +206, 52,155, 72,243,115, 96,168, 70,152, 73, 13,140,220,197, 11,103,100, 77,123,235,141,109,169, 87,205, 32, 20,203, 5, 41, 20, + 50,156, 93, 69,196,143, 94, 12, 12, 31,198, 82,146,212, 7,159, 25,171,152,126,111,129,253, 45, 24,246,145, 94, 47, 36,105,210, + 98, 84,240,214,118, 64,139,132,101,179,192,250,228, 28,163, 66, 48,198,138, 71,200,140, 27, 69, 78,244,227, 50, 40, 89,199, 38, + 60, 49, 10,244,217,165,178,122, 29,122, 56,134,122,240,212,152, 65,171,121,145, 1,199,142,123, 29,129,209, 68,159,111,163, 38, +151, 35,114, 0,139,205,146, 57, 18, 71, 96, 98, 2,243,231,217,165,178,172, 55,132,229,174,163,214, 88,238, 61,186,224,104, 28, + 28, 8,156, 77, 94,215, 32,235, 16,212, 56, 28,197,164, 59,144, 40,231, 63,105,169,179, 25, 93,162,196, 69,140,149,107,181,158, +163,116, 45, 68, 51, 18, 41, 55, 21, 17,217, 56,221,130, 40, 42,118, 7, 3,255,223,208, 12, 7, 6,160, 55,154,177,108,111,212, +140,118,152, 61,199, 4, 23,147,111, 94, 88,249,193, 62,128, 33,192,167, 13, 70,129, 20,146,115, 34,156,199,193, 80,110,173, 44, + 75,115,146,210,128, 99, 42,245,149,138,220,209,160,180, 16,106, 68,238,231,165,162,207,239, 43,101, 99, 61,140, 28,187, 25,246, + 55,141, 68,232, 84,248,116,109,122,227, 57, 57, 16,112,240, 14, 47,132,220,227, 47,142, 78, 52, 43,171,178,234,112,222, 25,234, +115,238,176,231,140,253, 2, 80, 25, 24,226,144,117,214,202, 21, 58, 14, 32,166,129, 30,199,189,195,225,207, 28,179, 23,246,254, +212,105, 48, 28,183,206, 73, 92, 66,131,174,239,199,153,130,118,246, 92, 51,118, 84, 47, 86,107, 21,249,228,217, 1,185,216, 55, +117,111,183, 52, 75,234,234,243, 94,169, 86,229,191,255,147, 31,201,211,227,190,252,248,237, 79,228,168,217,101, 27, 6,129,192, +179, 35, 83,191,171,215,171,242,202,107,119,229,172,221,145, 81,111, 32,253,206,128, 21, 1,236, 81,172,107, 49,151,189,156,113, + 63,212,140,133,204,113,151,212,190, 30, 29,128,217, 24,163,224,101,146,160,129, 64,163,106, 34, 42, 47, 78,206, 72, 40,115,231, +122,157,122,239,152, 56,121,164,193, 70, 71,215,234,206,230,170,124,248,171, 71,146,187,106,253,242,173,186, 47, 39,167,231,156, +108, 0, 85,105, 95, 29,221,137,102,146,215,116,227,133,217, 4, 71, 39,129,171,129, 99,128,137, 30, 33, 99,247, 44,195, 13,166, + 67, 6, 37, 57,224,105, 90,194, 18, 56,246,121, 50,157,100,230, 8,105,233, 80,207, 34,236, 14,234,116,197,114,137,140,117, 30, +185,232, 35,242,173,147, 65, 79, 29, 87, 42,132, 17,118,154, 2,186,238, 84,158, 36,102, 97,126, 73, 50,244,244,217, 19,249,253, +239,255, 46,199,109, 87,150,234,148, 62,133,147, 10,103,186,246,154,129,230,242, 21,217, 2,246, 8, 36, 95,186,126,125,117, 12, +211,105,143,251,233,218,141,151,228,248,236,194, 90, 95,177,173, 23,174, 1,213, 20,128,148,179, 57, 79,202,249, 28,249,198,209, + 87, 78,171, 67,233, 30, 25, 69,119,165, 92,147,245,141,109, 57, 61,120,168,207,234, 92,182,214,174,106, 98,149,150, 90, 99,137, +147, 68,123, 79,238,179,124,140,247, 33, 24, 15, 64,247, 28,206,233, 52, 16,176,231,115,105, 50,114,122,115, 13,110,130, 21,249, +250, 27, 47,203,177,174,107,214,175, 82, 59, 62,140, 82,210,108, 94,200,137,238,185,127,243,227,148,238,133,145, 12,251, 29,241, + 55, 54,216, 15, 79,120,158,163,114,246,137,181, 33, 89, 25,238, 33,229,179,162,133,202, 90,194,177,170,161, 90,100, 68, 68, 38, +122, 15, 91,106,114,192, 88,219,169, 52, 91,167,178,210, 88,230,115, 49,241, 38, 43,213, 7,243,224, 55,122, 17,226, 95,242,192, + 91,171,208, 72, 96, 72,132, 20, 27, 95, 9,103,221, 67,167,171, 16,187,170,132, 38,103,216,183, 11,252,135, 1,133, 45,240, 76, + 56, 77,137,197, 24, 93,232,218,161,196, 9,129,239, 2, 73, 71, 96,215,145,116,114,223, 32, 43, 82,171, 37,205,246, 76,206, 58, + 19, 6,156,128,112, 20,171, 89,121,240,196, 68,113,154,205,129, 77,109,144, 15,198, 18,198, 5,127, 5,169,145, 57,246,103, 28, + 36, 9,242, 54,168,221,212, 96,215, 24,251,140,155, 2,173,130,148,155,124,241,190,100, 47,191,156,241,199,174,101,145,172, 37, + 71, 82,206,152,243,157,184,158, 6, 74, 28,112,134, 40,249,129, 57, 13,219, 27,229, 27,225,120,146,149,138,233,194, 99, 19,183, +160, 98,214,220, 74, 2, 32,110, 49,229, 52, 95, 74,122,224,162, 73, 87,114,169,130,100, 48, 79,169,239,197,204,250, 72,179,149, +181,122,202,202, 94, 97,124,201,111, 59,210, 44,115, 48,213, 27,203, 22,229,103, 79, 32,221,154,151,185,238,186, 70, 30, 89,117, + 36,173,190, 30, 62, 4, 20,136,190, 53,210, 67,143,171, 10, 9, 68,144,123,104,198,245,230,205,140, 70,165,158, 60,218, 15, 41, +159,154,136, 48,183,155, 97,166, 10, 54,165,243,142,102, 41,231,190,188,177,161, 81,114,106,162, 6,222, 39,169,195, 79, 62, 62, + 83,103,149,149,171, 27, 53,211,246,141, 77,204, 4, 27,116,164,166,255,137, 90,230,230,249, 72,182,116, 9,190,117,179, 33, 15, + 79,213,129,104,132,141,251, 6, 38, 1, 32,184,179,238, 80,138,217,148,149,207,232,156,230,140,192,234,101,115,250,150,213, 68, +178,177, 90,228,218, 97, 29,131,153,199,210,119,103, 8, 70,184, 41,163,197,179,110,192, 17,193,245,114,138, 6, 12,127,158,131, + 15,156,133, 85,155, 3,166, 19,153,219,252,117, 48, 11, 46,251, 87, 62, 40, 54,213, 1, 15,177, 81,208,134, 38,240,205,156, 97, +188,144, 87, 69,212,138,153,254,164, 16, 52, 52,199,251,231,134,208, 78, 17,208, 34, 6,164,138, 60, 2,134, 48,134,147, 8,205, + 80,135, 96, 46, 3, 47, 63,179,194, 49,213,194, 44,108, 6,121,144,199,210, 25,248,202, 83,137, 52, 3,190, 96, 94, 0, 34, 65, + 51,159, 17, 9,119,196,145,146, 96, 99, 94, 0,157,126, 62,100, 75, 6,134, 6,251, 8, 27, 18, 7,113,238,212,192, 46, 41, 87, + 9,164, 51, 74, 73, 70,185, 98, 64,205, 69,127, 41,114, 35, 90,227,153,207, 32, 7,217, 98,114,209, 38,114,125,169,200, 81,192, +162,101, 52,231,120, 35, 50,173, 64, 90,106,184,164, 4,176, 75,130,215, 50,212,108,253,160, 53, 81,131,152,148,151,175, 85,164, + 24,117, 56,102,213, 87,163,131, 89,106, 0,192,252, 56,116,200,148,196,101, 87, 11,231, 4,223,136,235,168, 21,242,114,162, 25, +199, 79, 62,252,140, 4, 38,208, 3, 0,225, 82,145,172,122, 35, 43,151, 67, 48, 72,159, 89, 85,157, 49, 12,100,200, 49,173, 80, +250,154,101,161,212,186,177,186, 42,159, 63,122,196,125, 56, 84,163,140,158,248,214,218,154, 3, 72, 89,153,222, 42, 24,214,219, +203, 80, 67,220,151, 71, 47,246,136,159,128,222, 65,206,149, 10,183, 52,123,255,206, 87, 94,227,244, 5,198, 67,127,247,141,187, + 50,212,235,249,159,254,244,223,170,163, 31,187,209,160,152,217, 97, 62,211,144,111,191,254,154,220,127,178, 71, 67,210,168,150, + 72,251,153,230,100, 76,154,253,206, 96, 30, 94,246,211, 81, 45,233,141,199,102, 28,225,184,211, 9,167,232, 22,240, 90,147,139, +204, 6, 83, 9, 9,147, 97,246,196,158, 23,232,148, 67,221, 27, 99,128, 44,179, 5,121,113,124, 33, 25, 53,146, 40, 47,195, 1, +126,114,127, 79,214,150, 74,116,194, 24,119, 60, 82,167, 28,196, 83, 78,199,128,230, 25, 34, 34,155, 26,100, 63,120,214, 36,184, + 50,229,148, 0, 25,132, 59,246, 64,246, 85,243, 73, 82, 92,195,233,164,242, 9, 78,142,248,169,156,196, 36,240,177,210,125,210, + 1,170, 38,179, 62,121, 21, 64,158,149, 70,212,142, 10,140, 31,113,116, 16,206, 47,226,126, 11,169,160, 71,157, 1,144,195,128, + 90, 23,227,165, 34, 4, 57, 86, 43, 53,102,238, 9,175,194,214, 20,170, 49, 50, 31, 73,183,115,162,103, 40, 43, 95,187,187,198, + 74,217,115, 77, 48,122,186,231,118,214,182,228,226,228,153,120,209,182, 92,191,113,157,148,208, 54, 81,227, 17, 99,129,189,134, + 74, 8, 70,206,242,137, 57, 3, 98,236,193,147,222,136, 45,178,107, 87,111, 16, 68,122,170,153, 56, 0,177,235,203,107, 82, 91, + 89,146,108,169, 38, 23,237, 35, 57, 62,216, 35,144,153,242,168, 44,211,179,201,168, 1, 76,153, 25,115, 81, 19,141, 90,181, 46, +104,197,102,217,167, 86, 91, 28,102,228,214,213,170,140, 70,192, 41,152,253,156,207,243, 2, 31, 6,219,133,207,185,123,109, 69, +202, 5,216, 94,223,245,150,147,151, 65, 52, 19, 15, 4,246,228, 42,137,156,224,143,163,125,197,249,198,121,159, 99,180,111,198, +236, 56,214, 96, 98, 62, 27,210,102, 12, 90, 45,201,232,243, 74,179,109, 19,112,198, 31, 65, 64, 86, 29,233, 69,171,205,192, 44, +225, 24, 75,243,122,214,112, 45,115, 74, 46, 39, 73,194,196,182,196,196,184, 20,112, 14, 22, 14, 29,118,198,215,235, 9,125,187, +134, 36,177, 31, 22, 16, 24,171,157, 92, 10, 42, 49,195, 71,192,231,219, 84, 75,180,232,113, 47,202,221, 81,236, 42, 18, 17,171, +145,231, 61, 59, 23,189, 81, 36,103,103, 67,105,181, 38,191,225,193, 96,240,103, 0, 59,252,119,238,116, 37,224,251, 96,235,166, +174, 90,190, 72, 66, 76,253,205,218, 0,214,146, 77, 48, 24,128,179, 39, 0, 22,108,133, 0, 6,130,243, 97, 49, 18,154, 77, 27, +163, 42,156,250,238, 86,154,101,164,195,254,156,101, 47,148,211, 65, 74,224,115,222, 59, 98, 41, 29,116,137,136, 26,176,161, 17, +192, 70,209,111,244,211,113,124, 22,243,163,198,254,101,162, 28,236, 69, 0,140, 18,106, 68,167, 27, 42, 89, 88,210,236, 53, 36, + 21, 37,102,145,227, 82,196, 89, 81,207,137,114,192, 80, 15,135,224,208,173, 75,182,144, 35,192, 12,139,218,200,123,178,147,211, +205,172,239,171, 64, 65, 44, 76,112,222,188,169,175,157,233,231, 38, 66,139,148, 49, 18, 53, 31, 4,114,126, 18, 73,115,160, 63, +205, 83,249,147,175, 86,229, 72,207,237,243,238,156, 44, 90, 59, 87,182,100,171,145,148,213,124,192,209, 58,248,187, 79,247, 59, +242,151,239, 28,114,211,174,213,178,178,189, 82,112, 35, 84,214,139,134, 28,237,206, 90, 73, 62,121,112, 38, 21,144, 86, 36,192, + 5, 63, 34,202, 30,216,132,233,168,207, 82, 24,254,229,193,163,202,155,190, 63, 99,165,216,245,106,134,165,100,180, 37,108, 67, + 24, 56, 36,165,145,113, 87, 55,192,121,199,198,140, 82,217,153, 92,223,206,105,224,227, 73,179, 59,209,195,174,107, 17, 78, 88, + 57,161,232,134, 68,108, 81,160,175,227,115,206,221, 74, 79, 36,108, 65,201,137,211, 1,117,121,120,172,238, 31,138,122,186,225, + 86,179,158,172,150,146,114,216,117, 36, 47,152,199,189, 84, 12,178, 22, 74,187, 63,145,193,204, 35,203, 21, 42, 11, 69,125,214, + 31,126,126, 40,119,175, 55, 88,242,135,225,100,194,224, 54, 38, 52,103, 9,174,137,108, 66, 0,129,193, 32,176,181,130,241, 26, + 65,213, 70,230, 60,192,200, 40,163, 82,138,227, 74,236,155,169,129,234,161,218,147,140,136, 71,216,220,170, 74, 67,157,235, 82, +201,170, 12, 8,218,154,173,161, 58,148, 54,199,114,190,249,234,154,148, 50, 37, 86, 29,184,114, 14, 89,159,116,188,239,204,214, + 49, 7, 13,167, 26,218,250,160,220, 23,198,114, 9, 86, 90,144,173,120,151,236,126,134,253,152, 76, 48, 30, 20,211, 88,131,139, + 0,212,184,208,188, 70,123,163,158,143,101, 31, 0,156,160, 39, 19,253,239,217, 64,157,136, 6, 86,245, 74,222,130, 42, 71, 17, +204,202,136, 19,156,161, 81,136,128, 78,239,233,115,119,101, 97, 53,232, 8,114,234,200, 58,244,123,143,245,207, 99,231,144,129, + 86, 47,171, 67, 7,107, 28,208,210,113,116, 44, 75,245,134,171,164, 37,216, 75,140, 98,251, 30,244,209,107, 26, 84, 31,106,118, +139, 64,120,185, 94,167, 24,136,105, 2,204,232,204,216, 63,198,136, 16,218, 79,154,237, 36,213, 8,110,174, 46,201,119, 95,191, +205,107, 67,239, 30,165,120,148, 38, 79,218, 61,217, 89,173,201,159,124,231, 43,242,158, 58,206,191,255,248, 1,101, 60,191,167, +175,253,209,239,126, 67,207, 79, 32, 75,106, 88,201,186, 54,155, 59,198, 73, 3, 3,194,130, 38,124, 39,118, 4,167,174,191,219, +108,212,104,168, 56,103,173,215, 14,188, 4,108, 4,128, 85, 16,248,192,250, 3,184,151, 39, 51, 28,176, 53, 35, 3, 40, 81,178, + 53,228, 56, 22, 28,112,235,188, 39,235, 43, 21,121,250,180, 35,141, 90, 81, 86,234,101,130, 45, 15, 79,219, 36, 92,249,226,225, +115,205, 60,215, 41, 54,130,231,120,128, 32, 64, 63,167, 86,206, 49, 16,197,184, 41,159,121, 50,226,158, 48,176,105,104, 60, 7, + 32, 58, 1,209, 82, 63,228,159, 3,111,198,246, 4,106,120,137,216, 16,227,216,147,222,112, 74,146, 44,246, 99,129,162,206, 37, +200, 82,136,253,197, 6, 18, 9,123,226, 75,160,224, 20,117,241,200,218,143, 8,100,150, 27, 13, 94, 19,250,194, 36,229,209, 51, +184,189, 92,144,167,195,148, 85,137, 18, 3,121,126,220,149, 98,177, 32,181, 82, 70,230,227,132,188,244,242, 43, 82,173,229, 57, +217,176,190,181, 43,205,211, 35, 61,119,214, 14, 69,229, 10,235, 93, 66, 96,162, 54, 4,180,179, 88,227,153, 38, 36, 0, 40,215, +107,187,250,220, 81,165,184,144, 55,191,250, 10, 9,165, 34,181,193,153, 66, 93,206,154, 39, 50, 30,245, 25,160, 99, 41,102,142, +179, 12,109,128, 76, 26, 18,210, 83,125, 93, 89,202,245,101, 89, 94, 42,147,150, 23,142,162,164,246,163, 59, 0,182, 67,215, 34, +167,201,144,218,163, 79, 30,189, 96,101, 5,130, 56,143,143, 58,242, 95,255,240,170,126,198,166,252,217,255,251, 88,157,239,220, +152,244, 60, 59,151, 28,185,117, 26, 1, 36, 38,115,124, 35,115,167,110, 8, 63, 18,184,177, 57, 95,131, 52,156,197,233,164,175, +231, 81,147, 23, 61, 27, 83,245, 11,157, 78,135,129, 44,168,152,225,128, 59,160,206,141, 50, 12,188, 19,180, 39, 33, 19,199, 84, + 26, 85,160, 20, 91, 91, 9,183, 55, 71,131,174,156,158, 60,103,159, 62,233, 0,112,158, 94,247, 82,189, 40,245,245,151, 28, 26, + 63,102, 27,216,254,153, 95,250,180,200,113, 7,100, 93, 9,220,216, 85, 35,135, 35,138,216, 10,102,251, 47,229, 49, 65,129, 94, + 0, 90, 83,253,145,141,187, 98, 29,158, 31, 15, 25,200, 47,148, 30,237, 28,135,174,140,110, 32, 66, 92,167,241,120, 69,108,145, + 46, 84,216, 22,224,246,144, 85,112, 27,113,132, 15, 64,133,200, 19,239,146,122,218,254, 60, 55,217, 99,207,198,186,147,174,178, +147,140,138,158,220,122,185, 44,185,167, 67, 2, 35,122,179,136, 76, 64, 8, 98, 33,122, 48,131,226,151,103,243,159,139,204,228, +203, 34, 36, 17,153,177,244,128,140,251,242,237,235,121,121,118,145,208, 0, 1, 8,216, 57,231, 76,171, 85,148, 47, 49, 95,171, +198,187,160, 7, 91, 29,227,195,233,144,229, 82,244,167,193, 37,238,163,111,173,198,187,154,207,208, 80, 32, 82, 69,169,102, 71, + 51,227,219, 53, 53,170,205,174,252,217,135, 39,236,215,162,219, 5,210,152,215,119, 42,236,187, 36,226,185, 17,154,232,218, 78, + 91,158,156,118, 52, 99, 95, 74,201,187, 29,163, 56,125,115,195,151,191,123,251,137, 58,158,152,194, 43,215,151,214,228,163,227, + 41,123, 85,234, 79,228,167,239, 31,179, 66, 1, 17,134,191,253,229,115,249,199,191,115,131, 64, 43, 3, 99,133,140,150,214,235, +121,121,243,238,138, 92,128,143,218,131,128, 77,134, 45,132, 70, 37, 75, 57, 67,148,244, 39,250,160,174,175,151, 76, 34, 21,229, + 44,189,249,191,126,255,133,116,218,105,249,254, 87,243,204,230, 13,105, 26, 90,118, 60,155, 80, 99,254,228,124, 32,109,189,214, +155,155,105,185,117,189, 40,216, 35,147,105,210, 70,221,244,181, 85, 61,204, 65,202,232,225, 39, 94,142, 15, 87,196, 69,157,112, +106, 25, 95,131,128,169, 20,138,190,108,109,136,220, 63,136,136,220,157,234,193, 94, 85,107,213,211,131, 83, 45,101,137, 94,231, + 70,250,210, 44, 5,174, 21,109, 0,148,228,209,215, 7,167, 57, 56, 10,160, 89,207,153, 80, 16,185, 76,125,246,185, 16, 37,154, +108,161, 26,170, 82,142,189,247,141,138, 26,177,106, 78, 62,122, 50, 34,114,149,125, 48,189, 39, 4,110,120, 38, 40,201,205,117, +239,244, 96, 4, 57,128,111,228, 54, 23, 99,140,255,232,186,174,151,233, 8,111,173,169,105, 85, 67, 51, 85,163,242,206, 7,135, +154,161,105,182,124, 52,148,240,182, 26, 29, 15,142,214, 64, 80, 9,167, 93,157,242,211,172, 38, 5,212,242, 54,128, 35, 12,116, +129,108,111,142,146,119, 62,115, 56,145,200, 1,101,204, 9, 65,199, 96, 52, 2,158, 96,198,234, 75, 87, 51,213,245,122,130,213, + 7,140, 47, 1,151,121,112,218,147,243,243,177,204, 86,117,239, 66, 25,207, 79, 17, 49, 31,187, 8,123, 58, 55, 7, 78, 42,106, +142, 84, 58,166,122, 16,230,244,251,242,151,191,252,216, 0,163, 32, 87,201,229,120,144, 81,222,133,161,131,243,169, 87,202, 28, +241,131, 67, 7,138, 29,253,180, 86,231,130,189,116,148,109,171, 24, 61, 42, 96, 68, 50, 43, 75,149,170,241,138,187,209,180,154, +102,129,120, 54,152, 77, 70,201, 26,227,101,224, 70, 71, 86, 14,208, 31,162,122,202, 95,114, 6, 60, 45,121,125,253, 82,185, 32, +112,119,141,162, 26,109,117,230,231, 26, 28,252,249, 79,127, 37,167,221,129, 20,212, 80,255,163,111,188, 42,119,174,108,200, 55, +127,235,171,242, 98, 56,145,243,123, 15, 73,199, 11, 33,159, 12,133,232,103, 18,129,158,153,170, 41, 41,222,111, 14,149, 16,135, +170,173,151, 75,134,175, 88,244,211, 89,233, 89,101, 2, 16, 80,244, 66,237, 10,131, 65,115, 26,211,169,169,172, 5, 28,229,131, +170,161,190, 31, 1,178,174, 81,251,188,203,242, 38, 40,129,203, 5,168,151, 25,122, 26,146,156,232,185,162, 45, 3, 70,202,144, +244,186, 25,106,132,175, 47,151,169,150,133,224, 6, 61,203, 68,228, 57,164,125,146,149,140, 20,201, 97,192, 21,156, 33, 65, 11, + 72, 83, 48,251,158,211, 12, 28,108,211,193, 80, 40,125, 26, 39, 98, 42,187, 77, 28,234, 58,197, 64, 60, 71,144, 39,104,166, 83, + 73, 4, 37, 17, 41, 65, 11,154,229, 6,243,169,209, 10, 75, 78,131, 27,107, 69,148, 53,248,130,128, 11,197,131, 80,185,210, 0, + 42,151, 52, 5,197,104, 2,204,199, 68,158,159,118, 37, 15,240,164,190,127,125,117,131,213,190,195,230, 80,191,115, 44,149,250, +140, 1, 41, 4,122,194,216, 50,200,136, 65,188, 85,252,150,151, 54,244,239,198,156,238, 41, 53,174,243,249,215,235, 53,125,206, +183, 37, 87, 66, 10,218,147,253,115,117, 82,195, 83,158,155,116,190,164,193,201, 72, 70,157, 46,131,108, 4, 80,100,223, 99,181, + 4,207, 35, 67,161, 38,172,251,149,141,134, 92,221,200,203, 69,103, 44,167, 77, 61,243,201, 18,215,187,168,193, 71,175,255, 88, +247,231,136,163,115,216,143,255,234,111, 62, 37, 94,229,160, 61, 33,241, 20,213,243, 28, 86,155, 65, 55,156, 97,104, 85, 79,164, +126,176, 87, 28,109,228,125, 37, 89, 29, 49,153, 98, 8,105,169, 63, 24,163,162,129, 64, 53,144, 98,182, 34, 37, 13, 6,123,234, +156,251,131,115,182, 17,170,249, 80, 42, 57, 77, 72,226, 20,155, 58, 64,203, 35, 99, 95,224,204,176,199, 32,197, 59,209, 32, 6, +184, 38, 40,242,193,167,130,140,172, 90,173,176, 42,128,140,254,162,125,166,223,145, 34, 43, 41,170, 66,105,125,222, 28, 1, 68, +229, 41, 90, 32,217,231,156,252,192,216, 40, 41,140,163,145, 28, 31, 93, 48, 8, 97,114,171,207,165, 92,174,104, 18, 58, 98,162, +130,117, 76,164, 50,180,203,228,125,153, 91, 34, 20, 57,109, 13,207, 85, 19, 57, 1,228,156, 58, 43,166,177,189, 38,118,127,127, + 89, 87,244,253, 47,143,206,155,120, 89,210,210,176, 48,252,146, 4,118,104, 99, 40, 11, 41,104, 40, 22, 18, 12,136, 12, 23, 51, +213,235,187, 89,201, 23,102,242,226, 36,148,158,110,190,147,238, 76, 55,163,149, 86,187,211,190,147,244, 12, 47, 75,160,151,227, +125,164, 98, 12,229,180,213,147, 63,186,147,149,168,234,201, 23, 7, 93, 82,113,214, 82, 86, 6,173,232,115, 72,231,113, 49,234, + 60,117, 97,159, 39,141,175, 23, 96, 29,140,133,245,103, 89,246,244,210, 14,232, 80,203,121,242,242,146,200,114, 89,183,144,102, +172,109, 53,192,127,245,225,169, 62,248, 57,213,195,126,244,221,146,108,169, 3,133,243, 4,184,204, 7,215, 51,156, 41, 22, 7, +101, 10, 93,148,183, 94, 47,203, 92, 51,230,147,139,145, 60,217, 59,101,214,137,135,253, 83,189, 6, 80, 48,162,223,142,205,117, +214, 26,177,119, 5,123,245,120,255, 66,254,246,221, 23,242,163,111, 93,225,198, 36, 1,220,220,122, 46,175, 92, 91,146, 51,205, + 58, 65, 65, 15,150,167, 61,125,223,118, 38,150, 91,119,234,106,108, 35,249,249, 23,109,205,234,115,242,242,110,158,179,253, 40, +239,126,250,240, 84, 55, 91, 74,190,114,123,149, 61, 43,244,207,169,222,133,185,114, 32,139, 51,160,243, 44,201,217,249,137, 12, + 70, 62, 51,254,181,106, 74,114, 60,112, 30,169,119, 1,192,163,216,169, 62,179,141,122,206, 84,138, 34,131,200,145,172,198, 79, +202,103, 7, 19,121,171,174,209,124, 70,179,186,130,102,137, 35,145,171, 75,190,188,180, 26,201,253, 61,141,236,211,136,234,244, + 32, 77,130,255,136,195, 24,217,246,170, 58,229,238,196,103,239, 11,165,156, 72,141,226,171, 55,235, 22,185, 70, 86,225, 8,157, +200, 12,199,149,244, 53, 69, 53,180,221,161,209,142,230,171,232,231, 38,165, 51,156,235,225, 79,202, 31,253,246,174,113,183, 35, +138,173, 22, 13, 60, 41, 19, 39,159,154,112,224, 54,227, 95, 70, 9,245,228, 76,179,198, 90, 77, 80,101, 12,144,161, 78, 3,215, +143,247,152,173, 67, 60, 3,198, 14, 7, 73,146, 89,215,239,119, 2, 76,177,127,217,195, 53, 3,104, 64,201,134,222, 19,184, 10, + 80,186,155,133,129, 27,217, 9, 57,143, 12,206,132,182,254,156,169, 49,106,233, 51, 4,174, 67,252,162,190,223, 14, 26,132, 50, + 48, 18,231,187, 81,150, 3,189,190,227,246,140,184, 2,181, 49,140,156,205, 65,199, 78,227,222,215,251, 8, 76,148, 5,243,231, + 23, 23,100, 42,131,128, 7,162,123,100,173,195, 89,207,230,117, 33,243,154,201, 49,171, 61, 62,111, 89,133,202, 55, 32, 17, 12, + 3,250,212, 4,196,169,193,107,182,154, 6,220,116, 6,184,221,239, 90, 6, 4, 6,188,241,136,226, 26, 13, 53, 44, 8, 48,209, +230, 1, 37, 40, 84,180,170,197, 10,199,170,186,195,129, 58,219, 10,217,213,128,143, 64,182,211,235, 13,168, 75,253,218,213, 13, +249,234,173, 29,130,227, 64, 30,210, 40,231, 41,155,249,191,252,203,255, 75,154,234, 60, 49,198, 58, 81, 35, 91,252,245, 67,205, +226,170, 82, 84,131, 12, 73,228,186, 26,199,216,113,254, 27, 71,190, 71,133,179,135,251,103,228,241, 71, 32,135, 89,100,100,116, +168,118, 1, 60, 53,119,202,125,111,222,220,150, 43,215,175,203, 63,188,243, 62, 73,153,224,220, 81,206, 46, 23, 50,186, 62, 41, + 53,226,190,174,243, 68, 30,105, 48, 7, 80, 26, 72, 84,230,243, 14,129,114, 32,106,154,103,234,242,210,171, 85, 58, 37,100, 67, +231,195, 64, 38,135, 26,128,117, 78,164,221, 27, 75,161,177, 67,163,141,128,107, 87,179, 93, 60,251,148,238,221,241, 40,203, 74, + 81, 82,109,196,206,181,149, 75, 41, 97,216,139,180,152, 30, 66,120,153, 73, 89, 53, 2,229,222,197,168, 18,144,234, 72,162,138, +211,192, 18,155,200,248,190,109,124,212, 35,255, 57, 20,219,170,186,214,155,155,187,114,116,214,148,251,143, 31,202,238,238, 45, +126, 22, 8,104, 78, 33, 91,221,238,144, 94, 56,157,246, 57,171, 61,132,118, 67, 18,137, 70, 74, 78,143, 79, 57,150,219,237,118, +229,249,139, 3,185,113,125, 87,159,199, 9, 19, 7, 42,155, 37, 76,172, 6, 28, 29, 51,150,176, 53,155,174, 46,201,206,213, 77, +181,111, 67,125,174, 35,105,237,239,203,175, 63,216,151,171, 87,182,217, 90, 40,104, 38,222, 30,154,172, 50,166, 11,234,213,154, +140,251, 67, 35,179,242, 77,137, 48,153, 45,235,107,243,178,181, 82,213,235, 25,113, 52, 53, 10,219, 70, 84,133, 22,192, 48, 38, +247,125, 81,247, 50, 24,251,154, 26, 4,190,180,187, 34,107,203, 43, 12,114, 30, 30,180, 40,207, 10, 76, 6,218,132, 8,198,216, + 6, 68, 21, 47,178,254, 55,218,177, 99,240, 52,120, 78,129, 18,109, 44, 36, 77,129, 1,191,208, 10, 56,239,156,115,228, 52, 26, +163,196,214,148,157, 43,250,252, 66, 76, 92, 13, 56,166, 56, 82, 71,221, 62, 59,214,164,115, 87,118,182,150,164,167, 89,124,186, + 81,226,200, 39,167,109,212, 65,223,127,122, 34,251,135, 7,172,204,208,201, 82, 48,201,132, 98,192, 40, 56, 30,119,168, 35, 2, +219,116,245,234, 21,233, 77, 51,210, 88, 94, 39, 89, 86,183,115,170,191,159, 50,211, 53,187,239, 81, 36,107, 56,177,245, 7,127, + 20,130, 2,210,114, 19,155,131,164,119,104,246, 23,149,177,129,238,191,114,226,114,238, 62, 94,160,237, 29, 40, 27,149, 91, 27, +249,156, 75, 74,236,119,147, 32,188,212,208, 72, 56,189,139, 47,243,198, 47,250,237,172,134, 71,214,139,183, 62, 63,112, 7, 9, + 75, 92, 66,219, 67,216,187,148, 5,142, 77, 24, 41,249,228,185,241, 6,167,220, 70, 47,100, 66, 57,106,235, 70,153, 8, 9, 58, + 22, 89, 57,126,126,239,149, 53,142, 7,193, 57,101, 19, 80,150, 50, 22, 50,148, 9, 48, 47,140,153, 89,148,255, 48, 38,210, 1, +152, 70,163, 75,244,129,112,157,141,186, 79,128, 7,140,223,148,116,150,186, 56,249, 20,153,158, 78, 52,114,109,158,247, 89,123, +192, 33, 6, 58,251,149,223, 91,147,164,102,143,147, 81,200,190,147,135,114,179,166, 13,141, 90, 78, 62,123,218,150,245,149,162, + 92, 89, 43, 49, 82, 73,194,233, 76, 34, 55, 87, 24, 90,246, 4,227, 15, 64,189, 46,227,171,183,150,229,189, 79,154, 28,239,120, +182,223,213, 77, 49, 98,207, 43,156, 59, 81, 12, 44,154, 46,198, 87, 95, 90,211, 13,156, 34, 83,211,114, 37,119,169,194, 68,130, + 7,252,228, 26,210,156,248, 28,127,187,182,189,164,175,211, 72, 77, 55,227, 64, 63, 23, 37, 23,148,226,128, 4, 71, 78,248,193, + 3,112,202,207,184,105, 63,124,112, 44, 95,127,117,147,235,148,240, 13,111,144,200,230,121, 13, 85,253,255,171,235, 5,110, 14, + 68,183, 52,152,158,245,166,218,122, 79,111,223, 59,145, 38,144,214, 43, 21,249,254, 27, 89,102,127,145,219, 52, 67,253,222,211, + 81, 68,212, 55, 21,214, 0,160,209,107, 91,207, 38,228,206,154,176, 85,112, 99,171, 44,159,237,245, 56,226, 7, 81, 28, 56,167, +219, 59, 21,215, 67,207,112,102, 87,156, 38, 59, 28, 25,214,168, 63,178, 40,158, 34, 27,236,203,134, 54, 95,239, 16,165,126, 4, +173,120, 83, 83, 27,183,166, 12,206, 50,154, 37, 99,146, 97, 55,155, 52,234, 6,207,152,237,224,144, 72,136,129,117,196,134, 78, + 90,233, 62,147,245,228,206, 78, 89,114,250,190, 49,178, 46, 80,153, 38,230,100, 85,195,252, 54,198,148,198,227, 57, 55, 61,156, + 18, 56, 17, 24,204, 88, 84, 73, 3, 30,185, 49,192,216,177, 70, 1,193, 75,242, 25, 53,248,208,113,134, 84,238, 60,101, 25, 2, + 50,181,124, 58, 36,133,231,246,154, 47,191,126, 8, 54,183, 88,174,172,164,245, 39,111, 4, 48,250,194,199,135, 3, 13,148, 82, +204,132, 80,114,197,115,253,240,139,115,249,230, 43, 53,106, 6, 32,170,247, 83,161,171,116,136,225, 39,116,139, 63, 84,131,242, +233,243,167,116,178,112, 88, 73,210,176,138, 99,173,179,214, 7, 50,107,128,223,144,113, 19, 88,231, 16,188,216,183,229, 74,129, +127,191,220,168,201,222,177, 58,170,126,207, 80,189,142,178, 51,114,138,132,198,199, 61,166,193,232, 14,251,166,128,150,206,176, + 2,131,239, 42, 21,234,164,111, 69,159,119,109,169, 66,156, 7,190, 51,237, 27,137,203,139,195, 51, 10, 24, 61,222,123, 78,212, + 61, 28,243, 71, 79, 94,112,223, 49, 40, 70, 57, 60,157, 35,173,237, 47,127,253,148,165,100, 4,189, 96,188, 67,198,191,181,218, +144,205, 90, 73,106,234, 40, 48, 47,221,236,104, 70, 95, 49,128, 26,218, 79, 23,104,191, 16,196, 40,204,146,231,228, 47, 0,173, +238, 68,142,143,247,228,197,209,129,102, 91,115, 13,202, 55,229,141,151,110, 81,205,176,165,198, 6,218, 5, 51,253, 57, 87,103, +135,169,240,195,179, 11,150,220,225,196, 61,210, 85,155, 20,113, 15, 66, 46,112, 56,112,186, 61, 35, 96, 33,170, 25,165, 92,150, + 32,167,226,101,244,108,165, 66, 50,188,129, 47, 65,156,102, 55, 0, 93,168, 40,161,162,146,156, 69,214, 94,144,216,181,180, 60, +158, 23, 76, 21,128,196, 10,140,134, 8, 38, 11,200,202, 10, 37,102,133,195,161,241, 71, 0, 20, 8,231,132,105,155, 4,207,236, + 76,188,138, 39, 5,125, 93,251, 2,128, 56, 19, 64, 65, 32,213,237,117,152,120,116,251, 3,233,232, 86, 88, 66,155,113, 52, 97, +191, 57,239,101, 13,220,120,142, 25,245, 50,247,250,105,179, 37,119,110,223,144, 91, 55,118, 53,187,222, 55,110, 11,189,215,219, +187,187,106, 91,183,109,116,115, 52,151, 23,167,125, 61,207, 77, 89,203,233,147, 31, 33, 49, 82,167,164, 1,227, 89, 39,144,171, +155, 5, 26,251,221,181,154, 60, 7,211, 29,122,239,250, 76, 94,122,233,154, 62,215,162,141,204, 57,241, 21,100,159,104,135,164, + 19, 1,193,134,199,167, 99, 13,204,212, 39,140, 52,184,235, 37,164,213,156,104,144,113,131, 21, 57,156,241,157,181,170,100,115, + 37,182, 93,215,151,133,189,110,204,202, 35,107, 7, 19,220, 92, 50,172,180,142,135, 41,130,118, 48,146,219, 40,229,245, 53,171, + 70,118,229,103, 88,165,227,136, 27,170, 41, 25, 35, 15, 91, 94,169, 73, 49,179, 34,149,146, 94, 59,159, 95, 66, 6,253,164, 84, +138,117,218, 11,236, 97, 84,104,193,156, 9, 60, 67, 78,215, 58, 32,150,198, 39,231, 6,130, 39,112,243,115,130,199,139, 24, 84, +146,242, 94,131,139,233,160,101,115,235,234,143,176,207, 65,164,150,215, 96,114, 78,173,132, 64,191,167,173,182,123, 74,159,228, + 57, 86, 63,180, 66, 32,143, 59,209,253,187,218, 88,150, 90,181, 42, 75,249,162, 94, 67, 69,191, 91,215,249,228, 72,186,154,245, +131,223, 96, 58,106,203, 69,251,132,159,133,107,109,172, 92,231, 90, 44,170,162, 1,171,171,134, 57, 42, 37, 3, 6, 10,240,175, + 70, 19, 28,186,236, 63,186,100,103, 68,224,158, 78,186,177,192, 75,167, 30,153, 63,154,155,144,215, 98, 90, 8,206, 62,116,224, +102, 2,241,176,183,127,252,110,151,233, 63, 22, 7,206,182,145, 30,202,141, 70, 86,238, 55,133,165, 72,147, 21, 68,233, 46,163, +206,160, 68, 66, 25,100,241,236, 63,197, 38, 76, 17, 83,147,219,147,227,177, 71,238, 97,148,111,107, 75,203,226,169,115,153,128, + 14, 81, 15,231,113, 43,164,200,194,193, 97,155,172,106,232, 7, 53,251,145, 46, 86, 65,157,120, 82,127,143,197,157, 88, 73, 85, +157,195,253,107, 89,153,119, 53, 10,188,152,200, 65,123, 32,121, 28,234, 92, 70,163,182, 41, 75,166,127,245,243,103,242,219, 95, +223,150,173,229,146,222,212,148,189, 27, 0,115, 80,202, 36, 98, 26, 84,169, 36, 11,240,229, 43,175,108, 17, 32,241,236,104,100, + 40,199,228, 98,222, 57,162, 67,195,189,131,148,224,250,118, 85,190,121,103,153,193, 7,122,125,144,129,197,107, 9,114, 99, 63, + 54,102, 32, 3, 98, 28,244,201,231, 81, 74,141,143,103, 76,116,200, 30,212,192,205,134, 61, 18,221,252,234,211, 67,246, 33, 17, + 25,191,255,217,145,172, 47,149,101,173,158,163,177,131,145, 52, 80,152,245,197,119,214,202, 26,252, 76,100,222,155,169,241,139, +164, 51,134,150,188, 81,240,130,173,239,188, 61,102,192,243,162, 85,214,181,202,112,243, 96,237, 47,244,215,195, 57, 39,221,165, +175, 75, 48,238,219,184,212,205, 21, 84, 70,132,196, 57, 40, 47, 98,166,250,241,193, 80,178, 26, 33,163,204,247,106, 54, 65,244, +122,180,208,223, 69,100, 10,253,237, 9,116,143, 99,130, 78,240,255, 66, 28,161,149, 1,123, 26,165,151, 48, 7, 29,155,163,193, +122,122,234, 32, 91, 35,220,119, 79, 52,246,146, 84, 96, 1, 85,232,202, 78,152,203,135, 51, 71,214,103,228, 37, 54,146, 5,206, +106,100,202, 24, 29,171,107, 0,215,239,142,200, 86,135,204,247,218, 82, 36,155,165,172,201,176,206,251,114,114, 48,190, 36,133, + 24,207, 46,100, 48,115, 37,170,132, 33, 67, 47,153,155,220, 97, 36, 75,154,254, 57,187, 94,231,124, 57, 14, 67, 76, 5, 43, 35, + 40, 89,114, 37, 98, 72,184, 6,175, 70, 12, 92,241, 83, 91,139, 53,218,239,200,233, 73, 71,215, 41,197,192,196, 72, 83,230,228, + 33,135, 49,141,216,195, 70,230, 25, 51,184,213,144,149,242,175, 8, 68, 6,147, 1,175, 25,178,168, 64,103, 95,160,231,205, 30, +219,156,251, 18, 8,119, 80,136,162,116,158, 36, 5,176,207, 67,142,234, 72, 78,157, 50, 28,253,238,198,134,236,157,156,169, 65, + 25,235,186, 7,174,188, 22, 25,192, 38, 54,240, 23,104, 61,193, 89, 80, 68,171, 96,110, 72, 94,144,110, 44,122,117,221, 65, 95, + 86,234, 13,102,187,126, 50,199,209, 49,202,184,170, 35,126,105,107,153,164, 57,121,125,239,179,125, 51, 22, 0, 53, 66,168, 3, + 21, 53,163, 36,213,172, 89, 63,239,188,215,151, 27,155,203,234,164, 39,106,220,198, 68,213,163,132,254, 72,179, 51, 60,139, 43, +235, 75,106,208,199,106,248, 7,188,135,208,105, 4, 64,218,119,228,232, 60, 23,153, 8,158,125,187,215,149,240, 81, 72, 14,125, +202,153,234,254,122,231,211, 7, 84, 99,220, 90, 91, 85, 71,180, 42,123,154, 41, 2,253,206,182,137, 26,104,240,236, 39,196,112, + 18,208, 30,143, 72,120,101, 1,131,105,178,199, 6,146,194,120, 84,128,202, 98,130,107, 68,118, 74, 13, 20, 61, 93, 87, 4,165, + 48,228,158,239,148,232, 76,174,219, 72, 70,225, 88,213,129,132, 25, 99,166, 4,174, 6, 68, 53,104,181,162,181,144, 77, 26,144, + 10,200,119, 50,117,161,218, 2,193, 36,223,168,136,187, 23, 23,108,145,225,249,161,236,142,140, 22, 78, 24, 64, 71,203, 32,145, +217, 37, 77,145, 78, 51,222,130, 63, 48,133, 68,117, 32,161,126, 78,167,121, 42,157,206,166, 38, 60, 85,125,110, 99,102,132,231, +231,231,242,254,251,239,203,239,255,240, 7, 38,192, 52, 55, 53, 67,104, 76,132,115,219,203, 19,181, 49,185, 88,215,190,217,151, +205,141, 85, 13,220,179, 26,124,249,106,223, 2,105,157,238,107,130,131, 10,135, 71, 44, 20,196,150,158,156,181,228,250,238,134, + 60,122,246,152,235,178, 92, 95,210,128, 38,199, 22, 79,181,156,101, 85, 16,179,245,213,114, 68, 1, 24, 84,155, 80, 53,109,235, +153,223, 80, 95,112,126,246, 66,131,221,150,172,168,173, 6,152,249,184,211,227, 94,155,134, 73,102,161,144,136, 94, 93,170,114, +143, 52,193,133,160, 14,120,185, 86,117,142,212,215,189, 61, 34,129, 18,176, 64, 8,154,174,172,148,101, 4,249, 93,223, 90, 74, + 80,227,195, 28,188,239, 36,168,193,234,136,118,210,234,114, 85,162,122,129,231,228,230,181,107,114,113,113,206, 96, 99,107,107, + 75,175,233,152, 0,204,134,238,245, 86,123, 78,132, 61,132,144,172,114,108,160, 53, 0,102,203,165, 26, 69,108,166,154,241,195, +249,163, 53,133, 96,119, 78,100,187, 41,228,101,147,117,121,122,216, 52,194, 32,253,119, 28,204, 24,180,225,218, 1,230, 4,231, +195, 69,183, 67,219, 87, 44, 22,137, 17,128, 92,121, 20,218,108,191,199, 25,255, 57, 91, 2, 17, 81,248,216,171, 38,229,123, 57, + 99, 14,113,199,241, 72,175,215, 99,130, 49, 28,196,142, 92, 50, 36, 88, 16,175, 93, 72,113, 91,160,105,253,248, 5, 38, 40,225, + 91,245,200, 64,209,190,163,101,118, 10,118,174,248,138, 0, 1,227,185,201,246,112,100, 72, 59,125,209,193,241,185,188,181,225, +203,119,191,177,166,206, 98, 44,123,157,144, 6, 15, 14,235,229,109, 93,120,125,128,233, 98, 66, 31, 42, 30,236,196,136, 83, 22, +232, 98, 32, 28,167,115, 26,156,107, 91, 75,234,208,139,220,192, 38,244, 59, 53, 61,238, 76, 36, 23,173,136, 52,170,232,169, 65, +222,180,141,113, 26,141,144, 87, 52, 97, 92,133, 64, 70,148, 32, 8,225,193,211, 83,141,234, 83, 28,107,194,168,148, 41, 24,205, +153,225,192, 9, 29,159,245,229,175,127,254, 84,190,241,198,166,102,236, 21, 19,168, 72, 88,118,154, 97,249, 34,102,127, 56, 73, + 71,239,201,239,125,125, 71, 13, 82, 79,126,161,153, 47, 22,101, 58, 49, 78,112, 56,235, 82, 57,207,178,240,255,243,139, 39,236, +225, 93, 93, 43, 91,169, 19,200,115,140,171,184,204,159,100,173,190,201,198, 70, 14, 48, 56,214, 47,157,129,157, 14, 40,218,137, +110,210,193, 64,238,191, 24, 73,175, 15,233, 72,147, 18, 29,169,227,251,232,193,169,252,225,183,174,152, 40, 11,178,241,121,116, +201,150, 6,170, 69,108,234, 71,135,106, 64,245, 51,250,250,157,181,140, 70,237,167, 93,205,172,186,252, 30,244,189,158, 31,116, +229,230,149, 26, 75, 85, 19, 61, 80,227, 40, 99,147, 8, 16,207,208,117,122,160,135,122, 89, 15, 88,173, 20,147,238,149, 85, 8, +112,149,151,211,114,109, 35,214,207, 31,107,148,153,145,243,254, 92,131,146,228, 37,216, 12,115,219,211,153,174,233, 69,168, 70, +124,238,202, 80, 32, 1, 66,118, 29,145, 32, 38, 28,171, 33, 73,175,144,238, 55, 8, 13,184, 97, 12,128,154,133, 12, 39, 6,244, + 72,218,204,242, 2, 96, 50,163, 74, 41,230,182,199,220,248, 28, 1, 35,194, 88,175,245,177,222,203, 86, 65,174, 52, 74,156, 48, + 8, 1,128,241, 52,100, 74, 67, 84, 37,114,115,162,234,220,166, 49,179, 52,176,205,161,231,159, 79, 8,177, 16, 45,141,216, 35, + 94,103, 98,161,122,233, 84,241,124, 25,128,201, 16, 61,188, 40,127,169,129,108,204,133,241,101,159, 29,192, 48,140,146,168,221, + 20, 76, 95,193,193, 85, 42,121, 89, 90,173, 73, 87,141, 22,214,248,193, 19,125,142, 26,104, 37, 22,124,251,177,149,119,135, 12, +126, 52, 40, 43, 68,242,201,147,231,114,166,217, 25, 14, 62,169, 90,213, 73,193, 48, 46,120,161, 11, 28,253, 74,234, 62, 30,113, +173, 50,110,124, 5, 78, 15,172,113, 64,188, 99, 94,253,181,155, 55,165,165,134, 2,232,120, 56,215,105,127,122,169,210,231, 45, +116,149,245, 58,214,170, 37,222, 15,166, 45, 80, 81,162, 40, 15,152,229,128,140,206,229, 24,245, 99, 94,253,182, 26, 65,124, 54, + 0, 71,152, 59, 71, 9,187,161,153,118,134,194, 39,125,170,137, 97, 57,208,155,199,141,173, 47, 55,248,249, 48,148, 51,182, 42, +230,114,222,237,169,193, 46,208,209, 33,251, 47, 36, 76, 50, 21,103,231,201, 81,147,192,188,206,160,167,217, 85,145,231, 47,162, +158,125, 96,165, 68,183,214,145,147,163, 4,184, 11, 97, 73,119,136, 76, 48,188,236, 21, 34,107, 4,191, 58,152,212,188, 75, 82, + 13, 97,160, 1, 37, 55,244,231, 49,197,129,146, 46,218, 39, 83,199, 64, 24, 57,106,105,244,236,145,109, 34, 11, 15, 98,204,107, +152,162, 31,198,179, 16, 84,227,245,104, 3, 88,164,238, 93,114,106, 47,228, 82, 57,210,230,120,202, 17,164, 0,252, 25,134, 86, + 58,165,242, 87,140,207,152,240,236,135,129, 17, 4, 33,211, 7,231, 5,198, 65,209,127,133,202, 90, 93, 29,217,208, 77, 1,192, +238, 97, 26, 1, 83, 13, 51,135,196,135, 1,206,229,241,236,179,180, 31,243,217, 64, 63,123,164, 54,176,201,146,124,185,178, 34, +249,212,148, 45,164,230,241, 19,121,254,228,166, 58,218,134, 60,248,228,125,125,134, 23, 12, 20, 38,110,150, 58,212,251, 68, 21, +235,238,173,107, 26, 36,149,105, 3,174,109,168,243,210,108,122, 48, 90,210,164,103,192, 76, 23,192, 67, 84, 87,118, 55, 55,212, +169,205, 53,105,217, 32, 16, 23, 10,117, 80,225,220, 63,236,200,195, 39, 67, 57, 59,126,196, 49, 90, 76, 55, 97,220, 19,215,140, + 61, 92,214,231, 26,168,141,185,166,137,211,126,171, 79, 76,213,186, 58,196, 9, 48, 68,144,149,197,108,185, 58,181,241,112, 78, +178, 26,244,234, 87,116,127,218, 51, 76, 72, 83,131,245, 10,144,245,152,199,215,245,223, 59, 57,151, 52,116,219,139, 33,147,173, +171, 27,117, 62,139, 86, 31, 34, 62,125,217, 88, 90,146,161, 62, 47,180,123, 39,103,231,204,156,235,181,186, 52,245, 62,244,106, +245,190, 46,100,103,115, 75, 30,237,157,202,222,254,190, 38,132, 53,121,244,162,165, 54,163, 76, 10,112,156,127, 84,132, 80,201, + 66,213, 46,138, 38, 26,120,157,203,254,254,158, 44,175, 93,213,207,170, 81,175,225,180,123,100,147, 26,152,192,208, 51,131,140, +125, 14, 9,242,132, 85, 35,137,127, 16,227, 86,193, 20, 19,125, 15, 71,149, 83,196, 53, 0, 79, 19,204,198, 82, 42, 53,200,111, +129,172,186, 84, 14,140, 31,160, 57,160,112, 13, 41,167,195,240,114,244,149,213, 36,128,108,231, 8, 0, 18, 84, 6, 76, 39, 92, + 79, 28, 32, 15,200, 99,198,151, 12,179, 86,113,118,106,108,240, 95,160, 65,247, 92, 54,110, 42,157, 86,158, 7,242,105, 33,104, +134,214, 99, 30, 54,123,189,156,160,145,204, 35, 82,154,107, 38,167, 27, 2, 44, 76,119, 86, 83,114,208,153, 73,187, 51,150,122, + 41, 35,215,171, 26, 61, 12,251,252,130,205, 92,164, 81,225,144, 55, 78,173, 92, 82, 65, 26,141, 36, 16,147, 56, 84,249, 57,192, + 98,198, 70, 87, 80,103, 14,246,167, 88,157,220,119,190,178,101, 3,254,122, 96, 78,154,161,252,244,221,167, 44,211,254,209,119, +175,202,213,213,178,101, 92, 60, 4, 14,159,173,239, 95, 93,157,202, 82,107, 36,207,213,193,157,158,143, 88,118,249,238,155,155, + 4,128,161, 44,116,109, 5, 98, 44, 73, 10, 35,224,253, 86, 86,243,100,239,180,163,155, 58,205,153,123, 82,157,130, 3, 59,242, + 77,205,198,183, 12, 53,149,181,172, 12, 76, 84, 88,176, 15,239,159,208,201,102, 18,254, 37, 24, 33,225, 80,156, 36, 7,112,140, + 68,134, 60,247, 57,179,140, 17,131, 55, 95, 90,150, 79,213,113, 63, 57,155, 48,155, 95,169,103,245,144,207,201,143,140,123,217, + 63,234,106, 36, 59,213,195, 87,102, 20, 57,152, 79,216,167, 1, 1, 10, 38, 6,240, 15, 42, 26, 23,106,224, 80,238,158, 13, 99, +210,159,130,176, 7,125, 85, 24, 54,244,152, 83, 48, 92, 26,129,247,167,105,110, 22,236,135,138,174, 67, 71,215,119, 73,163,202, +237,101,104, 24, 59, 72,246, 66,150, 16, 61,193, 74, 70,174,234,181, 62, 57,153, 80,112,130,226, 60, 95, 34, 48, 56,185,152,200, +126,115, 34, 94, 10,101,213,132, 99,212,139,212,152, 36,165,154, 84,131,176, 94,148, 56, 17,202, 11,240, 78,167, 12,196,103, 6, + 76,215, 93,179,157,166, 58, 25, 15, 44, 34, 98,253, 31, 89,232,201,131, 57, 42,145,227, 78,197,136, 97,189,192,165,212,107,208, +251, 81,103, 3,105,221,187, 55,235,242,206,175, 15,228,222,131,115, 39, 5, 26,186,210,186,153,121, 32,127,183,214,242, 68, 57, + 35,200,131,200, 16,250,234,200, 0, 43,154,105,248,145,121, 2, 24,121, 56,244,214,185, 58,184,212, 80, 42, 57,187,119, 60, 39, +140,156,205, 40,239,106,207, 21, 10, 84,179,137,103,179,169, 49, 70, 16,213,168,135, 37,130, 0,219,237, 46, 9,136,170, 21,244, +170,109, 76,237,172, 13, 17,153, 33, 29, 75, 50, 3,112, 40,208,186, 19,102,170,200, 66,208,199, 6,183,252,177,190,151,101, 56, + 0, 10, 65, 91,169,215, 53,134,106, 8,123,107, 41, 82,251,162,132, 6, 37,181,139,254, 64,142, 91, 45,185,115,245, 10, 29, 15, +148,213, 18, 9,223,245,172,141,127,128,242,168,145,149,223, 65,248,114,117,107, 91, 86, 53, 99,138,212,168,124,248,248,133,116, +103, 17, 51,201,102,251, 66, 26,250,153, 75,106,184, 78,154, 45,199, 72, 54,100,214, 15,112, 38, 12,221,145, 3,229, 29, 53,155, + 44,149,227,249,129,196,101,187, 94,146,207,247, 91,242,233,222, 17, 3, 14, 16,199, 84, 80,202,209,117,122,113,122,110,142, 52, +142, 28, 1,144,245,249,102,142,220, 5,224,181, 28, 36,147, 11, 57,210,125, 38,124, 27, 13, 91, 16,213,248,142,196,197, 74,173, + 41,102,133,152,187, 69, 38,132,128, 2,202,121,107,141, 37,210, 59, 95,221, 68, 37,161, 73,164, 54,238, 31,210,167,168, 12, 82, +218, 56,109,138,130, 99,182, 47, 70, 26, 96,230,196,131, 50, 33, 65, 67,190, 17, 10,233,249, 33, 10,152,164, 86, 57,142,123,246, +251,125,219,123, 9,163,178, 30,113,194,103, 78, 58, 89, 4,110,184, 55, 4, 69,105,178,135,165, 47, 51,114,142,225,121, 70,235, +204,204, 26, 14, 61, 50,249,216,192,233, 94, 47, 38, 47, 18,163,177,244,212,153,228,213,137,179, 20,239, 91,203,130, 51,201,236, +193,198,108, 67, 66, 24, 74,211,104,147,140, 70,239, 83,237, 99,167,221,146,208,207,203,107, 27, 87, 57, 77,179,186, 92,147,228, +198, 58, 1, 93,149,242, 85, 89, 89,223,150, 15, 62,249,152,152, 18, 82, 41,187, 17, 38, 84,182, 66,112,201, 63,121,194,192, 28, +213,198,136,116,208,226,216, 56,201,118, 34,247, 91, 39,108, 45,224, 60,126,246, 96,200,214, 5, 5, 91, 52,200, 44,106,208, 16, +121, 25,102,166, 64, 96,103, 53,187, 7,113,214, 48,240, 68,227, 86,217, 41,102,100,115,169, 76,176,244, 55,238,110,201,207,239, + 29,201,175, 30,180, 72, 38,134, 25,247,158,222, 47,167, 65,146, 33,129,209,153,100, 78,238,239, 55,153, 8,226, 58,208,175,198, +126, 58,237,154,112, 22,224, 43, 32,198,250,226,217, 1,247,243, 21,117,208, 0, 49,118, 53, 11,158,143,250,186,222, 21,205,186, +155,114,170,206, 31,108,153,229,234,138,180, 53,176,132,192,206,193,241, 51, 13, 46, 99,150,195, 17,180,228,139, 85, 73,100, 96, +159,117, 45, 53, 24, 59,238,157, 48,161, 35,167, 60, 71,172, 53,224,152,160,138, 84, 34, 97, 79,189,146, 99,197, 21,215,132, 48, +139, 68, 86,250, 95,168, 37, 18, 60,169,215, 75, 98, 30,236,241,249,148,192, 68, 96,163,226,216,144,250, 40,221,183,218, 29, 38, +115,208,157,247,213,166,165,210,166,230, 9,176, 92,160,201,221, 36,232,179,253,121,117, 69,237,228,241,153, 76, 70,106,163,147, + 21, 6,201,248, 94, 80,108,163,101,147,195,168,177, 62, 59, 95, 38,196, 85, 5,250,252, 75,121,147,146,206, 36, 13, 24,138,150, + 38,170, 15,168, 40, 60, 63, 27, 27, 3, 94,108,202,113, 36, 41,243, 28, 96,206, 1,128,241,119, 0,247, 53, 26,186,239,222,218, + 84, 67,163, 7, 21, 64,174,249,198,138,236,181,242,106,212, 6, 82,203,171,179, 92, 74,202,187,173,182,252,250,176, 41,191,255, +122, 81, 26, 26,149,204,125,116,169, 19,178,170,198, 20,229,136, 36,147,163,152,132, 3, 0, 85,165,139, 49,191, 52,149,130,227, +234,203, 16,139, 30,219,184, 19,140, 8,202, 97, 56,120, 48,206, 64, 31,238,238, 44,203,193,217, 72, 62,122,214,215, 7, 85, 32, +226,150,237,198,132,245, 28,176,138, 37,221, 92, 95,169, 23,229,245,155,171,234, 40,167,114,160,209,208,173,173,154,252,206,171, +235,234,128,102, 20,212, 0,241, 11, 2, 19,234,249, 98, 14, 91,159,210,146,110,164,237, 98,204,114, 39, 15,145,222,124, 29,189, +161, 90, 70,142,206, 0,192, 8, 36,147, 55,250,215,140, 94, 59,168, 73, 97,180,142,154, 61,249,238, 77,141, 72,245, 65, 93, 76, +172,138,129, 40, 16,101,176, 56, 54, 16, 24, 74,117,139, 17,138, 72,131,161,109,117,226,232, 71,223, 88,131, 30,182,209, 56, 62, +216,159,115,222,149,109, 10,189,223,119,239, 29,202,245,149, 12, 91, 9,227,104,198, 7, 59,119, 61, 19,100, 7,199,221,169, 70, +173,232, 7,251, 28,223,106,143, 80,238,201,146,109, 11,115,211, 24,163,203, 69, 83,121, 12,145, 11, 32,117,147,118,208, 49, 86, +177,170,209,240,213,122,104, 74, 61,115, 87,239, 89,140,105, 56, 86, 66,140, 7,109, 55, 60,233,232,117, 46, 85,224,140,173,144, +146,210, 23, 60,254,232, 84,246,187, 9, 89,219,172, 26,213,169,219, 92,203,185, 80, 78,213,176, 95,173,215,165,228, 7,146, 77, + 88,239, 28, 25, 86, 10,220,208, 73,163,133, 61, 31, 76,120, 72,176,201, 3,150,138, 13,236,161,119, 70, 92, 1,106, 34,147,225, + 64,247, 75, 90,150, 43, 89, 41,230,103,204,208, 64, 15,186,113,165, 36,217,199, 25,105,247, 67, 43,147,163, 50, 17,196,228, 54, +192,218, 87,107, 57, 89,215,245,197,168, 24,202,152, 47,239,174,219,104,101,236, 84,172,146,110,172, 3,115,218, 7, 23,234,212, + 79,197,153,181, 75, 97, 9, 84, 7, 48, 61,145, 74,154, 83,170,148,139,156,233,181, 41, 14,159,114,170, 15,239, 95, 80, 65, 10, + 37, 84, 83, 44,131,241, 84,231,131,232, 58,128,193,240, 47,231, 84, 15, 90, 71, 4,189,129, 70, 25, 89, 37,140, 91, 23,220, 5, + 81,232,102,176,115, 28, 55, 67,144, 66, 61,130,164,105,154,163,172,152, 87,167,118,210,110,243,245, 55,119,118,164, 81,173,200, +103,143,159,241,250,103, 84,180,210, 61,160,159, 11,131, 54,119,104, 87, 60, 20,100,159, 0,182, 61,213, 96, 21,173,139,175,221, +190, 42, 15, 52, 99,126,164, 63,216, 7, 64,161,191, 56, 58,166,252,103,191,223,227,186,195, 9, 2,215,128,253, 10,231,143,254, + 59, 74,134,148, 78, 86, 3, 3,131,123,239,233,145, 94,107,224,128,127, 9, 6,238, 32,125,234, 12, 71, 98, 83, 92, 41,246, 49, +167, 65,232, 42, 34, 78, 90, 18,170,107,250,252,251,154, 65, 5,147, 30, 91, 50,168,237,140, 92,233,146,253, 61,100, 62, 46, 3, + 65,105,127, 58,183,241, 33, 74,108,102, 17,144, 77, 89, 18,157, 73, 86, 3,177,148,108,175, 5,242,225, 39, 15, 72,235,139, 42, + 81,181,148,103,251, 7,101,111,204, 28,163,164,140,192, 44,151,207,144,156, 9,229,219,180,107,243,192, 24, 93,142,249,136,169, +186, 97, 62, 27, 4, 54, 36, 86,145,169,120, 57,107,215,180,212,153, 14,167, 67,102,116,249,108, 73,114,197, 34,249,209, 81,189, + 51,114, 36,187,206, 78,183, 69,176, 25, 2,220,116, 62, 43,229, 4,168,141, 7, 50,165, 83, 16, 6,240, 25, 80,220, 22,138, 4, + 8,226, 58,209, 95,206,229,236,249,219,248,145, 81,105, 15,208,237, 27, 14, 9, 92, 35,191,197, 64, 3,177, 70, 67,239,111,102, +124, 19,234, 28,114, 9,208, 92,231,137,123,192,154,223,188,253,138, 28,237, 63,148,211,179, 51, 93,179, 34,219, 64,108, 39,105, + 16,133,241,181,243,139, 22,245,237,177,199, 76, 33, 45,224,119, 81,154, 57, 48, 86, 58,207, 17, 85, 49,184,157, 27, 15, 4,212, + 1,215,147, 37,142,224, 21,179, 87,117,191, 45, 88,205,132, 56,147,132,218,246,159,106,160,253,183,191,188,167,123,116, 85,202, + 78,167,130,136,110, 16,187, 68, 30,199,182, 16, 20,111, 55, 52,233, 91, 43, 26, 96, 77,179,255, 86,119,198,177, 57,180,241,186, +122,191, 47,239,212,101, 0,233, 94,182,105, 68, 19,173,156, 6,192,234,136,207, 78, 25, 92,194, 14,190,122,109, 83,247,211, 80, +134,224,226,215,245, 24,206, 52, 57,155,246, 56, 10, 89,169, 20,117,141,211, 26,212,151,244,187,115,106, 11,107,186,190,121,210, +184, 98, 60, 20,250,240,160,147, 6,194, 62, 12,163, 75, 14,118, 58,224, 66, 69, 50,165,186, 6,208,224,255,239,115,170, 8, 4, + 78, 20,176, 82,187, 26,105,144,133,228,107,230,248, 62,122,147, 17,239,169, 0, 14,133,249,156, 36, 80,240,164,104, 25,145,179, + 1,231, 90,147,171, 88,157, 60,180, 3,176,183,176, 11, 38,234,115, 10,229, 37, 89, 93,223,148,238,164, 47, 23,163, 88, 86,243, + 99,181,181, 57, 86,112,215,170,154, 8,116, 6,146, 46,129,135, 33,148,106, 26,211, 58, 9,217,210,181,219,235,137,252,241, 31, +108, 75, 2, 34, 84, 8,152, 2, 11,134,147, 41, 35,242,233,254,187, 61,217,215,100,145,237, 92,151,202,131,243,196,212,237, 98, +195,194,144, 8, 75,179,127,244,213, 81,226,192,193, 8,152,113, 65,164,160, 34,232, 6, 34, 67, 41,233, 6,251,193, 75,117,249, +179, 95,236,177, 60,178, 83,139,120,144, 80, 41,216, 74, 5,116, 32,145,110,254,179, 97,168, 70,106, 34, 95,187, 90,151,205,170, + 26,184,241,132, 11,244,174, 70, 24, 93, 47,103,100, 13,147,153, 19,139, 49,201, 64,244, 38, 49,255, 8, 70,172,151,174,100, 88, + 10,237, 14,230,234,156, 96, 40, 18,164, 26, 69,128,153,246,109, 60, 37,155, 50, 75,146,171,231,165,160,134,249,237,251,103,186, +145, 74,124, 0,250, 76,104, 4, 80,138, 96, 86, 97,172,150, 82,213,131,117, 49, 7, 85,105,150,135,235,219,111, 20,228, 91,186, + 40, 16, 74,248,248,201,185,124,166, 63, 24, 79, 1, 79, 57,250, 45, 57,205,170,113, 0, 48,183,188,186,146,227, 65, 57, 57,155, +184,113, 37, 91,112,176,234, 65,106, 22, 24, 2,245, 53,194, 42, 30,118,207, 72, 35,241, 97,160,206, 33, 69,249, 90,246, 58, 33, + 38,128, 3,230, 8,247, 1,120,195,195,202,113, 42,192,168, 15,159, 3,240, 18,186,241, 40,221,104, 21,125, 88, 62,244,199,245, +239,191,255, 74,141,189, 81, 24, 26,150,216,129,216, 7,153, 72,102,164,193,210, 68, 78,186, 80,163, 74,107,228,151,147,205, 70, + 65,146, 57,255, 75,132, 7, 84,245,112, 37, 29,115, 10, 40, 82,212,150,245, 32, 94, 76, 73,115,105,243,219, 49, 75,173,160, 87, +205,151,235, 4,101, 45,178,215,155, 26,128,188,190, 58,149, 79, 38, 9,249,251,143, 79,228,123, 47,175, 18, 73,122, 37, 19, 81, + 57,174,144,182, 44, 18, 20,213, 48, 74,155,203, 21, 89,169,102, 93,201,213,163, 97, 96, 63, 8,224, 62,204,177,198,121,246,220, +177, 57, 55,151,203,122, 16, 98,185,232,141,164,173,187,250,218,106, 69,222,120,101,198,246,197, 82,125,137,100, 33,224, 99, 71, +164, 12,148,116, 41,159,226, 88,224,113, 7,204,106, 21, 58,181,133,219,190,164, 80,134,190,115, 92, 83,163,152, 33,209, 10,231, +178, 73,238, 48, 34,208,165, 88,182, 62,249,217,121, 71,154, 61,200, 72,102,165, 86, 72,153,210,153, 30, 74,128,122,128,155, 64, + 6,132,136,122,239,160,207,178,174,144,117, 11, 83, 22, 35, 57,215,204,124,112,214, 55,212,120, 53,199,253,214,209,231, 2, 71, + 76, 89,214,140,113,203,247,221,172,118,134, 52,195, 30, 3, 59,244,186,225,228, 30,237,239, 83, 10,179, 81, 41,203,237,171,187, +242,232,197, 62,191,215,218, 50,230,208,241,165,200,104, 81,194, 93,168,154,161, 2, 69, 18, 23,144,107,104,128,244,201,179, 61, + 74,134, 34,123, 68, 59, 11,135, 26,165,114, 80,199,162,119,143, 41, 16,112, 83,227,124, 3,248,131, 86, 84,189,154,162, 1,155, + 71, 54,127,219,213, 76,118, 48,153, 56,164,109,194, 69,255,226,244, 24, 98,206,153, 35, 40,246,139, 9, 67,251, 2, 24,166, 7, + 12, 78,178,167, 14, 47,135, 17,169, 82,133,149, 56, 4,212,200,134,232,196,231, 38, 98, 4, 7, 82, 45,230, 88,205,225,124,117, +207,212,245, 82,169,156, 84, 48,171, 93,222,148,173,141, 13,222,227,254, 89,143,211, 34,127,248,189, 55,228,233,193,169, 60,219, + 63,230, 24, 21,212,202,230, 51,195,191, 16, 40,202, 76,219, 2,112, 78, 20,168,131, 7,169, 13,120,199,209,102, 64, 54,170, 17, + 40,123,198, 84, 21,155, 4,116,118,243,216,148,234,176,134,141,218,146, 6,118,186,143,178,121,130,157,112, 95,105,182,143,172, +205, 50, 15,172,172, 14,133, 70,210,245, 58,234, 81,124, 95, 97,216,147,206,197,133, 6, 36, 17, 83, 79, 16, 50,193,142, 97,114, + 1,163,114,225,130, 87, 33,142, 72,232,131,172, 21, 78,126,213,143, 73,215, 90,212, 32, 2, 92,242, 1,201,101, 64, 86,114, 34, +229,147,186,172,111,236,168, 99,207,209,153,204,117,207, 62,123,113,168,246,169, 40,175,188,242, 85, 25,189,247, 75, 6, 42, 41, +180, 64,211,158,244, 7,168,146,169,173,213,196,165,144,199,222, 48,237,135, 16, 51,220,172,132, 69, 44,169, 91,245, 82, 88, 97, + 34,208, 52,153,160,228, 41,198,125, 49,239,159,209,251, 15,230,186,143, 53,201, 56, 59,122,202,201,139,217,184, 34,255,252,135, +175,201,206,106, 89,254,197,255,241,182,156,156,107,208, 22, 86,140, 31,208,139,157, 78, 5, 0,132, 5,174,213,218,170,218,159, +205, 10,229,178,183,182, 86,228,157, 79, 14,104,235, 11,122,190, 58, 26, 20,163, 90,129, 41,147,174, 38, 81,214, 62, 69, 85, 32, +166, 79,192, 25, 69, 48,213, 27, 11,255,123,147, 68, 58, 70,100, 83,171, 22, 77,225,208,245,154,137,163, 72,193,198,121,108, 63, +158,171,163,110,106,112, 77,233, 43,125,254,228,158, 8,167, 78,172, 37, 37,249,124,137, 60, 35,217,148,161,194, 71, 17,152,237, +132,232,127,218, 5, 93,171, 1,117, 1, 66, 86,153,112, 6,141,102, 86,207, 70,214,103, 22,141, 64, 52, 67, 60, 79, 36, 70,128, +231,241,187, 76, 10,217,179, 42, 72,104,154, 37,172, 82,105, 40,122,164, 73,231,222,209,185,124,243,155, 27,146, 47,148,100, 2, +230, 77,111,172, 79,188, 40,229, 82, 78,131, 87, 95,122, 31,159,201,225, 81,155, 35,203,143, 30,159,202,225,193,146,220,122,169, +193,179,229, 37,205, 94, 83,176, 72,247,215, 43,183,202,250,121, 3,182, 82, 81, 49,194, 30,128, 60,246, 60,166,243,177,192, 95, +191,123,103, 57,171,219, 81,157,255,148, 34, 32,145,113, 86,199, 83,202,139, 10, 50, 11,117,178,200, 0,103, 26,133,143,212,176, +116,206, 7, 50,131, 81, 68, 6,166, 25,118,181,174, 81, 57,162,123, 63, 37,149, 70, 89,118,118, 83,178, 82, 74,144,132,229, 31, + 30, 15,228,241, 94, 83,142,123, 51,102,198,155,154, 25,207,213,242, 3, 68, 3, 33,146,222, 88, 13,151,102,158, 75, 26, 29,232, +113,209,108, 48,201,158,242,171, 80, 58, 82,163,147,128, 10, 9, 12, 12, 16,169,242, 27, 46, 92,206,180,235, 3,254,187,147, 30, + 23,238,157,135, 77,185,189, 93, 85,103, 12, 38, 58,124,102,218,148,223,156, 56,137,198,100, 18,161, 92,229,199,116,218,233,228, +130,192,223,147, 55,111, 52,228,218, 70,145,155, 7, 70, 75, 56,194, 98, 51,206,159, 61,111, 73, 87,141,254,246, 86, 70, 15, 90, +210,104, 65, 13,130,163, 14, 34, 37, 73,221,156, 37,141,184, 32,238,194,242,110, 56, 99,255, 15, 89,235,147,163,145,236, 37,132, +234,116, 0, 59,208, 88, 66,173, 40,105, 25,203, 12, 58,234,250,223,243,254, 84, 14,213,201,255,242,139,182,102,131, 51,185,123, +165, 44,255,236, 15,111,146,226, 21,135, 6, 37,125,246, 18, 49, 39,233, 91,185, 27,117, 73, 16,159, 96,180,239,195,189,174,156, +183, 65, 67,168,206,126, 84,148, 91,155,105,169, 54,114,236, 29,198,174,167,137,245, 34,105,180,211,245,193,102,159, 83,252, 34, +208,172,221,184,213, 57, 41,128,153,243,205, 13, 57,234, 89,217, 62,208,247,174, 85, 19,114,187,110, 37,218,151,110,172,200, 36, +110,202,187, 15,207,229,213,235, 75, 4,230,132, 14, 8,134,114, 87,167, 61,144, 23,135, 3,246,108, 87,170, 25,102, 77,112,242, + 73, 7,140, 99,224,133, 30, 15,118, 71,210, 99,249, 31,207, 1,100, 55,201, 90, 81,218,211, 57, 3,160, 55, 95, 41, 80, 99, 26, + 35, 72, 16,106,193,220, 59,245, 0, 34, 35,205, 72, 3,136,166,219,179,165, 22,192, 79,130,121, 47, 77, 10, 77,182, 25,124,143, +142,244,176,217,129,233,163, 42,215, 52,200,176,100, 11, 7,136, 17, 25, 0,173,250, 32,213,128, 42, 27, 24,201, 70, 51,153,140, + 82, 60,196, 32,143,128,236, 99, 56,179, 82,241,121,183, 41,131, 94, 87, 86, 42,107, 24,124,210,191, 31,202, 88,215,224,188, 59, + 36, 25,204,122,166,198,246, 77,127,110,186,221, 40,233, 86,160,120, 40, 98, 37,111, 17,151, 29,154, 74,217, 82,189,204,202,214, +195, 23, 7,116,178, 48, 30,171,154, 37,237,159,158,178, 92,142, 62, 56,156,115,133,217,152, 81,104, 18,221,154, 88,168, 67,249, +236,189,163, 23, 94, 45,150,120, 61, 0,222,141,124, 35,123, 66, 80, 12,166, 58,148,173,151,235, 85,142,189,117, 53, 91,231,239, +192,122,165, 70,107,185, 86,103,240, 1,192,216, 98,132,230,224,180,105,217,180, 27,207,241, 61, 43, 46, 51,160,198, 56, 79, 58, +125,137,194, 77,179,242,162,247, 37,166,250, 23, 0, 67,160,182,160,162, 78, 17,215,107,132, 50,190,156,180, 58,236, 61, 39,147, + 70,109,140, 76, 11, 21, 2,159, 84,208, 98,186,236,106,176,218,189, 33, 65,123,168,208,129, 63, 32,163,127,190,255,236, 41,247, + 37,170, 83, 94, 18,217,248, 72, 32,194,155, 76,154, 18, 23,122,216, 48,190,188, 22,180,112, 28,130, 25, 45,161,172, 94,143, 36, + 60, 71,246, 97, 60,244,172, 60,164,173,141,134, 12,136,140, 91, 26, 44,165, 98, 35, 97, 65, 41, 21,246, 5,118, 47,153,204,243, +239, 35,183,223, 60,150,241, 51,196, 73, 68,177, 81,194, 98, 54, 25, 12,107, 0, 24, 38,178,122,191,200,202, 19, 66,206,126, 4, + 97,177,235,125,130,145,147, 19, 37, 98, 10,104,105, 4, 49,149, 26,157, 63,236,192, 88,131, 44,140, 62,182, 47, 58,250,153, 93, +121,246,240, 51,205,218,151, 53,112, 69, 96,107, 70,122,160,207,248,226,162, 45, 27,107,203, 28, 87,124,252,228,177,148,202, 53, + 18, 79, 97, 13, 0,200,130,147,219, 90,174,179, 18, 4,185, 92,201,198, 4, 21,122,161,141, 81, 97,172, 11, 9, 79, 33,159, 96, + 53,112, 74, 6,201, 9,193,196, 71, 71, 7,108, 7,229, 11,203,116,140,192,115, 0, 27,244,179,247,191,144,119,239,237,203,191, +248,111,127, 87, 94,189,177, 45,167,157,161,188,104,246, 41,217, 74,118, 76, 18,239,128, 61, 47, 69, 7, 61, 24, 71,114,210, 9, +165, 94,207,106,160,154,146, 55,239,172,203, 3,181,161,219, 43, 69, 89,153,231, 9,248,187,185, 89,147,138, 62, 83,144, 93,193, + 60,247,199, 25, 25, 5, 9, 6,154,152, 49, 47,228,139, 4,226, 82,248, 42,105,213, 20, 86,173,230, 22, 24,245,199, 54,215,142, +231, 3,249,230,201,116,172,159, 53, 32,158,194, 64,179, 62,131,243,153,163,146,205,235,243,201, 23,235,156,142,152, 5, 61, 86, + 47, 18,108, 95, 36,245, 89,155,142, 59, 58, 51,216,131,120,218,248,110,236, 25,156, 61,146,236, 48,128, 74,242,121,163,234,198, +233, 29,189,215, 73, 98,198,223,199, 14, 39, 49,232,180,116,127,229, 77,217, 20, 21,160,214, 57, 3,229, 50,248, 21, 52, 67,191, +251,237,134,204,117,255, 32,200,165, 90, 61,121, 45, 60,121, 75,253,219,231,143,155,242,246,103, 39,106, 83,102,242,243, 95, 60, +151,107,215, 42,172, 54, 33,122,136, 29,251, 39, 56, 77,118,119,139,178,161,254,118,255,108,196, 4,165,224,107, 64,145, 41, 73, +148, 40,176, 90,134,107,219,105,232,254,159,247,200,247,144,236,233, 98,245,212,225,130,208, 51,147,200,106,166, 57, 37, 5, 97, + 14, 81,160, 70, 36,231,186,240,119, 55, 74,140, 48,194, 74, 69,102,195, 33, 75,159, 47, 14, 70,100,125,219, 92,209,131, 93,202, +114, 84,232,176,213,151, 11, 93,132, 73, 58, 39, 91,119,111,200,241,189, 3, 57,104,245,100, 87,175, 21,188,214,148, 99,140,140, +166,176, 59,152, 25, 11, 29,165, 33, 67,217,110,248, 82, 43,249, 68, 83,250, 78,191, 27, 81,149, 1,111,140,169,135,154,226,186, +113,187,179,152,155,107, 10,129,150,185,169,204, 9,213,195,244,144,198,214, 43,135,180,122, 22, 32, 40,141,232,154,154, 1,172, + 84, 10, 36,145, 9, 93,249, 16,209, 35, 50, 8, 56, 5,124,223, 36,180,145, 56, 4, 42,175,238,214,185, 6,179, 81,204,236, 60, +136, 18, 44, 37,101,138, 64,237,199,146, 45,235,102,206,167, 37, 64,217,166, 63,165,145, 44,234, 33,126, 69,131,128,193, 56,228, +142,191,122,187,172, 7,206, 14,119, 65,163,177,227,214, 84,126,193,158, 86,200,223,245,157,170, 24,192,127,220,120, 0, 8, 46, +101,141,240, 34, 52,178, 10,112, 98,199, 0, 76,128,108,197,201,222,198,250,124, 18, 32, 28,137,103,114,122,220,149,214, 16, 14, + 39,148,206,173,154,108,172,102,184,121,120,160,167, 96, 55, 11,140,114,210, 9,240, 36, 34, 59,240, 83,244,136,150, 50,140,234, +135,253,185,236,247, 19,210,153,185, 44, 21,212,139,234, 61, 95, 91,143,244,126,225,206,178,140, 28,191,246,198,186,196, 31, 29, +203,227,163,190, 92,191, 2,254,238,128,107,152,208,160,105, 89,191,247,142, 30,210,179,206, 72, 29,110,129, 25, 47, 34, 78, 4, + 48,214, 11,246, 47,233, 84,129, 44,102, 79,214,201,238, 34,147,128,191,135, 94, 64, 22, 18,152,149, 20,199, 81, 0, 76, 73, 35, + 80,130, 16,107,108,180,162, 24,187,236,123, 19,153, 14, 35,217, 92,210,168, 87,175,163,188,190,196, 81, 64, 0,169,246, 31,236, +201,209,225, 72,159, 71, 82, 66, 56, 0,140, 21,129, 38, 82, 63,235, 69,179, 41, 15,247, 6, 12,182,190,247,214,166,102,205,154, +161, 64, 98, 20, 83, 7,200,210, 64,183,185,154, 96,196,126, 79, 95,247,217,222,177,108,150,202,146,206,234,122,230,155,210, 28, +153,188,172,205,144,166, 53, 40,211,200, 89,179, 16, 24, 17,220, 89, 93, 95, 11, 71,128, 89,112, 68,236,105,150,128,125,222, 95, + 77,157, 30,198,156, 48,107, 14,135,142,133,120,245,230,117,174,195,163,189, 23, 4, 88, 17, 5,172, 78, 9,215,194, 57,120,119, + 46,108,230,223, 64,104,115, 7, 28, 91, 16, 92,192, 49,226, 51,144, 49, 45,233,217,108,247,122, 44, 3,227, 92, 29,156, 53,217, +243, 70,169, 29, 76,110,100,201, 2, 22, 67, 29,197,130,192, 34,225,200, 38,108, 36,198,231, 15, 1,129, 46,235,136,196,128,141, +168, 32, 88,155, 39,111, 99,106,145, 77,188, 0, 0,136, 62, 52,248,246, 81, 2, 6,113, 75, 46,109,253, 98,244,180, 1, 66,194, +105,198,100,201,156,212,197,160,175, 45, 58, 99, 61,215, 64, 17, 51,190, 67,146,208,128,246,179,171,127,190,232, 15, 53,216, 89, +226,190,185,182,213,144, 85,205,214,246, 79, 90,226,165,140,107, 32,164,104,147, 85,185, 16,244, 39,153,201,249,142,255,219,128, +155,172,225, 56,238,110, 84, 46,210,122,255,249, 60,198, 99,199,124, 63, 71,185,240,253, 19, 50,108,137, 55,242, 56, 18,149, 43, + 6,151, 25,102,134,244,166,115, 43,207,231, 11,124,237,136,253,253, 36, 3,238,105, 0,227, 59, 22, 47, 93, 54, 94, 37, 56, 12, + 80,220,106,240, 2,125, 7,112,249,247,135, 19,150,123,103,200, 72,179,106, 7,178, 73,182,161,230,108,189,141, 89,224,195,156, +119, 18,153,223,160, 35,135,199, 39,186, 70, 1,171, 7, 16,104, 42,148,235,242,193, 7,239, 73,254,219,223,145, 31,253,193, 31, +200, 95,252,133,238,159,241,156,153, 34, 74,198,121, 86, 2, 99,185,112, 0, 75,156, 93, 84,108, 0, 74,163,141,115,130, 38, 32, +250,154,204,198, 92,179, 66, 78,175,107,208,187,164,117,133, 61,222,205, 55,164,170,251,183,148, 89,145,157,173,101, 13,248,115, +242,235, 7, 7,242,191,254,249, 71, 20,180, 10,102,145,211,246, 88, 40,157,249, 70, 96, 19, 27,171, 90,165,224, 83, 72,231,131, + 47, 78,216,143,190,179, 85,149,151,174,173, 72,179, 59,166,195,105,247,103,108,139, 33,216, 61,105, 13,168, 75, 0,210,155,106, + 1,193, 72, 86,215, 37,193, 32, 30, 24,139,246, 89,151,120, 6, 4,180, 16,248,161,254,129,111, 32,101,236,127,113, 60, 17,179, +201,128,193,188,189,118, 78, 96, 34, 39, 77, 64,149,173,193, 21, 70, 57,161, 96, 9,224,118,228,168,206,209,126, 3,161, 12,199, + 32,163, 41,167, 84,208,167, 7, 40,231,236,252,130, 36, 78,217,140,238, 5, 84,203,138, 53, 6,187, 88,111,124, 17,136,109, 80, +117,131,111, 73,178,114,234, 51, 16, 5,168, 23, 52,222,233, 92,145, 99,139, 47,246,247,200,239,178,209, 40, 73, 39,244,136,213, +193,204, 59,218,169, 11, 35, 8,159,183,170, 1,208,183, 94, 91,151,255,251,111, 62,151,164,218,208,251, 79,207,229,201,253,115, +185,249, 82,221, 56,241, 19, 38,197,205,228, 84, 3,145, 55,238, 86,136, 41, 67, 83,227,119, 94,171,202,113, 55, 41, 31, 62, 51, +189,133, 74,206,147,170,104, 96,120,114,193,145,195, 36,178, 68, 48,138, 13,219,125, 41, 6,172, 99, 72, 0, 26,215,216,103,249, + 9, 99, 81,119,174,175,105,132,145,151,251,207, 71,172,113,162,196,136,114,189,238,124, 57,155, 37,101,118,208,213, 27, 30,179, +236,169,183, 42, 91,122,193, 94, 90, 15,248, 27, 27,114,255, 9,230,193, 71,178, 12,198, 50,221,212,201,216, 40,100,179,122, 24, +171, 26,185,157,104,230,116,187, 81, 32, 83, 27, 70,200,166,122, 16, 82, 62, 80,162,105,150, 90,247,206,135,178,219, 40, 24,223, +180,126,247,190,102,133,199,205, 62, 9, 34, 0,136, 89,205, 27, 96, 37,161,107,143, 4, 31, 27, 26,155, 16,165,149,211,206, 68, +178,185, 64,222,121, 98,132, 22,255,229, 15,110, 57,135,110,139,155,112,114,165, 48, 94,248,124, 26, 10,124, 22, 74, 48, 81, 82, +142,218,234,172,189,128, 51,212,199,122,160,119,119, 1, 28, 75,176,167,132, 25,243, 11, 93,179,147,189, 22, 65, 49,190, 58,137, +111,236,230,196,207,250,198, 52,142,202, 2, 74,175, 36,251,181, 64,101,240, 73, 71,158,235,253, 20,208, 7,234, 78,228,188, 51, +177, 49,149,200,227,216, 84,172,191,195, 6, 67, 89, 15,228, 52, 80,250, 98,166, 46, 51,147,160, 5,175, 57,208,192,136, 68,209, +106, 0,242, 20,224,145, 9,230, 74,167, 18,107,100, 56,135,212,169, 58, 83,148,166,246,207,134, 26, 5,142,221, 92,183,199,185, +109, 16,156, 84,212,105, 39,230, 17, 1, 73,207,219, 34, 79, 59,145, 43,185, 10, 71, 99,190,186,173, 1, 79, 65, 29, 74, 34,195, + 2,129,165,157, 9,249,198, 91,235,242, 15,239, 28,201,223,191,115, 40, 63,248,234, 54,203,128,160,168,109,104,112,244, 61,205, +184,255,245,223, 63,214,141,149, 37,176,114,238,128, 29, 4,234,137, 9, 84,112,132, 35,118,253,126, 87,121, 1,191, 0, 52, 1, + 42,186, 84, 75,121,107, 21, 32,168,152, 38, 12, 39, 49,199,136,162,151, 36,160,110, 68, 2,170, 12,203,161,224,250,174, 38, 76, + 45,142,162, 42,112,120,234,164,251,250,156, 16,168, 33,130,197, 56, 26, 72,113,102,122,128, 63,125,208,151,211,243, 25, 17,244, + 48,186,213,130,174,155, 31,184, 42, 70,130, 32, 54,252,124,240,232,185,188,251,217,231,178, 84,218,149,215,238,236,202,193, 73, +147,134, 3,100, 50, 57,135,176,135,147, 51, 97, 19, 3, 81, 34,146,167,122, 83, 48,119,215, 3, 37,175, 72,215,161,164, 25,122, + 85,246,142, 78, 89, 45, 88,140, 98,221,190,178,205, 12,229,222,195, 71, 52,100,200, 92, 65,205,140,160, 18,134, 47, 8, 67, 71, + 18, 20, 19,132,135, 82, 33,193, 51,201, 12,153,232, 72, 72,131,135,231, 74,146,236,253, 14, 6, 44,213,223,218,217,150, 23, 39, +167,204,250, 19,204,174,147,198, 9,129, 22, 66, 18, 12,116, 29,226, 90, 34,231,252, 12, 53, 27,177,212,151,116,165,105,236,215, +164,227,227,199,152, 80,236,153,146,150,105, 22, 4, 14, 34,102, 35, 97, 5,119,239,147,177,137, 59,229,211, 57,155,152,137, 77, + 77,206, 3,185,106, 12,231, 17,144,218, 19, 12,123,112,150, 32, 20, 17,223,160,154,173, 86, 83,202,149, 42,159, 95,224,250,246, +232, 29, 39,147, 37,217,217,110,104,192,231,235,179,187,160, 88,148,177,198,165,120,157,112,162,184, 23, 4,252, 54,254,231, 57, +146, 35, 39,122,201,241,213,180, 1, 77,245,222, 48,106,107,168, 97,207,102,204,145,216,102, 51, 36,200, 89,224, 99, 8,148, 3, +160,209, 73,199, 34,107, 52, 61,110, 99,151, 68,144,166, 15, 5, 69, 79,158,191,164,163, 35, 62,106,158, 73,111, 52,144,222,176, +167,235, 85,150,195,211, 19,185,232,116, 25,248,100,114, 57, 27,161, 77, 36,169, 85, 79,180, 53,214, 3, 35, 93,250,188, 71, 35, +171,200,160,119,159, 40,228,136, 33,224,200,210,116,160,153,124, 75,238,125,250,161,252,246,247,127, 87,126,240,253,223,150,119, +223,255,152,129, 76,202, 73,138,242,128,170, 29,107,169, 45, 10, 99, 13, 12,179, 25, 50,180,177,122,147, 50,201,102,206,245, 99, + 68,118, 98,213,196,173,245,117,174,223, 44, 48,234, 86,224, 75,138,197,178,238,159,156,180,187, 26, 16,158,188, 32, 25, 17, 21, + 46, 53,240,194, 92, 62,152,228, 48,170, 8, 78,126, 4, 46,139, 48, 29, 76,156, 15,246, 7,154, 48,105, 96, 89,203,235, 35, 69, + 18,144,144,183,174,213,229, 79,255,242, 83,181,225, 35,253, 14,245, 10,141,162, 52,212, 46,108, 44, 27, 19, 36,100,149,135, 26, +192, 21, 11,118,223,109, 77, 44, 71,227, 62, 71,150,125,142, 87, 38, 89, 57, 66,112, 99,242,176,160,127, 29,178,218,133,252,134, + 83, 13, 80,121, 3,160,148, 18,187, 54,103, 78,178, 30,205, 98,177,134, 0,177,162,213, 67, 60, 84,198,246, 54,130, 57, 4, 57, + 8, 30,193, 8, 8, 27,113, 99,123, 85,166, 25,159, 58, 3,245, 74,145, 65, 19, 2,193, 64, 50,122,174,250, 78,190,213,124, 5, +213,231, 22, 35,115,145,201, 81,163, 42,217,234,158, 75,179,121, 76,209, 43, 4, 74,211,185,167,182,126, 44,207, 30, 30,202,213, +187,155,108,223,138, 19,180,121,241,197, 25,136, 51,228,173,175,174,203,175, 52, 83,127,164,254, 19,149,160, 95,188,175,175,189, + 89,229,124,255,162, 58,134,246, 31,194,213, 43, 55,203,178,246, 81, 70, 30, 61, 71, 43, 36, 35, 91,181,140,212,107,101, 62,131, +114, 90, 3, 94,189,206,114, 97, 89, 26,213,172, 38,156,229,178,140,102, 23,210,239, 15,104,108, 87,214, 86, 37, 95,171, 74,175, +123, 65,102,141,156, 31, 82, 99,216,167, 30,122, 96,146,163,193,128,209, 43,206, 0, 64, 14,144, 89,205, 16,209, 26, 72, 77, 52, +162, 41, 53, 8, 46, 66, 95,243,213,235, 43,178,145, 10,228,164, 63,162,246,175,177, 0,233,193,130,195,211, 67, 89, 43, 70,210, + 68,230,134, 69,211,247,172,151, 99,210, 81, 34,163,197, 56,212, 72, 23,236,168, 59,182,204, 79, 23, 11, 20,182,168,184,130,245, +232,217,113, 71,254, 92, 35,113, 42,244,204,197, 64,107,142, 18, 20,189,180,114, 9,232,229,190, 60, 60,192,225,235,201,205,237, +170,188,126,115,133,229,101, 44, 27, 12, 31, 94, 15,142, 97,242, 88,199,182,232,228, 48, 31,155,228,225, 64,179,199, 93, 4, 14, + 36,108,208, 67, 94, 72, 19, 87, 32, 32,169, 16,171, 60, 96,225,193,140,135,222,100, 15,204, 83,122,221, 48,134,129, 30,178, 73, + 96,114,162, 39, 23, 83,150, 20,247,154, 67,145, 54,144,255, 3,170,119, 69, 62,212,151,124,174,213,130, 65, 40, 70,192, 4,195, +142,186, 30,192, 75, 36,224, 16, 26, 91,100,226, 9, 93,147, 66, 52, 50, 14, 99, 9, 77, 4, 69,215,203, 3, 59,223, 32,144, 51, +117,232,224,151,134,246,247,225,153,245, 75,243,186,105, 87,212,107, 94,217,196, 96, 47, 12,134,102,247,186, 57, 90, 32,232,137, + 77, 80,128, 51,253,250,247,155,213,136, 76,117,200,196, 61,189, 46,100,254,177,235, 19,126,231,181,101,249,217,135, 39,242, 55, +239, 60,147,223,255,250, 22, 91, 26,129, 3,224, 12, 70, 51, 53,102, 61, 41,100, 26, 54, 87,237,251,142,254,208,168, 92, 67, 55, +218,129, 63,139,155, 39,135,225, 69,111, 30,193,193,254,248, 55,134, 19, 89,121,172,209,123,228,123, 78,137, 9,232,244, 88,114, +250, 76,115,115, 32,174,125,208, 33, 74, 60,236, 82, 70,211,119, 82,171,152, 16, 0, 69,100,103, 48,151, 23,199, 19, 93,187,148, +220,190,217,144, 98,169, 37, 7, 77,205,100, 48,118,133,121,113,223, 16,214, 4,130, 37,192, 53,221,151,159,222,123, 34, 15,143, +142,229, 90,253,154,116,131,169,252,135,123,239, 19, 25,155,210, 12,148,153,114,100,207, 24, 78, 27, 37, 85, 4,183, 41,102, 70, +154,225, 97,158, 50, 54,241, 25, 16, 94,172, 47, 47, 19,212,245,244,232,132, 61,108,162,216,213,145,220,220,217, 98,134,253,112, +239,128, 25,186,233,108,167,233,116,208, 7, 15, 66, 3,104,225, 89, 84, 52,235, 70,169, 15,223,153,112,172, 82,112, 66, 96,109, + 67, 96,147,143, 93,239, 48,107,200,243, 42,192,117,125, 56,150, 33, 3, 86, 42,249, 69,145, 35,165, 41, 26, 63,186, 39, 44,147, + 51, 27,112,146,148, 54, 30,108, 70, 58,141,114, 40,178, 76, 53,160,232, 39, 22,212, 33,193,137, 78,156,234, 90,200,137, 7,223, +218, 98, 9,219,179,192,200,224, 39,153,212,160, 74, 29, 7,214, 28,107,131, 44, 5,149, 40,227,137,143,152,173,226,140, 86,213, +129,163,167, 27, 76,109,244, 47,229,104, 69,225, 60, 80,209,152,239, 31, 72, 33, 95,224,245, 1,172, 55,211, 44, 9, 85, 43, 84, + 2, 18,201,156, 6,218, 70, 2,196, 0, 96,161, 41, 29,123,116, 0,160, 7,134, 35, 53,250, 77,161,208, 69, 30, 99,133,104, 49, +120, 25,158,123, 16,141,232,223,104,118, 46, 12,246,217,238, 74,121,172,100,152, 10,150, 58,144, 30, 88, 5, 83, 68, 36, 19,215, +145,198, 60,119, 72,253,112,140,151, 34,104, 36, 32,151,186, 15,106, 35, 54,215,121,159, 77, 78, 48,120,116,124,100,253,114, 90, +193,176,255,200, 18, 65,147, 26,135,234,116,145,249,229,138,180, 31, 51,200, 58,251,105, 86,125,130,192, 38, 62,160, 8, 56,159, + 14, 73,198,117,218,106,201, 23,159,223,147,157,205, 85, 57,189,232, 48, 51, 71,192,148, 77,162,229, 50,160, 83, 92,106, 84,228, +238,181, 43, 12,184, 32, 50, 3,142,244,124, 62, 69, 71, 14,135,100, 36, 45,194, 4,194, 79,197, 78,237,204, 35,247,125,191,167, + 1, 73,231, 76,207, 86, 29,164,227,114,116,114,172,203,153, 32, 16, 14,179,247,109,104,206, 35, 59, 7, 29,179, 62,175,243,126, +223,102,203,211, 38,206,131,137, 29, 84, 29,243,154,176, 32, 25,188,163, 54,127,117,185, 46,223,188,179, 34,255,251,223,221,167, +239,120,122,210,209,128, 63, 65,223, 38,142,127, 62,244,244,249,115,204, 51, 47,105, 40,251, 97,122,134,240,238,144,188, 9, 8, + 44,103, 51,207,233,177,143, 76,201,205,105,146, 47, 90, 44, 11, 89, 39, 4,150, 40,161,115,222,190,100,107,207,170, 48,250,227, + 84,167,156, 51, 48,197,212, 67, 75,125, 91, 95,247, 25,206,225,203, 55,111,203,203, 87,151,229,107,119, 26,122,125, 67,130,252, +176, 46,133,156,174, 75, 16,179,175,206,210,122,210,112, 74,163,241,136,252, 3, 12, 38,244, 92,165,211,106,107, 46, 78,216, 10, + 5,198,171,144,207,200,227,195,158, 44, 85,242,124, 70,159,238,117,101,101,167, 42,133, 98, 81,237,243, 92, 3,153,169,188,125, +239, 72, 74,154,225,175,174,150,229,159,254,209, 29,249,223,254,245, 39,114,210, 30,201,189, 71,103,242,228,233,150,220,126,117, +201,170,130,151,178,171, 26,144, 23,211,242,234,203, 85,249,213, 39, 79,229,215,247, 35,249,173, 55,138,242,242,203, 53,137, 80, + 13, 5,206, 65,202,154, 32,169,127, 78, 98,164,173, 94,148,165, 2, 64, 54, 13,246,209,160,155,131,210,117, 89, 13, 42, 34,227, +116,202,122, 51,153, 8,163, 28, 86,210, 1,192, 1,142, 43,229,132, 53, 80,242, 0, 5, 41, 28,240,175, 30,237,203,234,102, 44, + 47,223,218,225, 56, 84,178,144,149, 41,178, 25,189,249, 84, 89, 99,159,164, 25,250,200,169, 34,229, 83, 54,227,222,233,142,228, +139, 62,196, 81,150,165,221,235, 48, 2, 68, 41, 9,175, 71,180, 71,157,110, 32,106, 53, 40,128,212, 38,128, 39,213, 82,138,217, + 98, 65,127, 70,129,177, 11,193,251,229, 82,166,141, 14, 30,248,135, 7, 19,142,217, 33, 27,251,235,183,159,233,251, 82,100,139, + 91, 72,129,162,204,143, 18,139,129, 13,140,189, 56, 8,156,196,159,110,154,158,151, 96,121,187,170,239, 27,244, 76,175, 28, 56, + 5,102,215, 65, 90,202,171,171, 52, 48,109,189,222,125,117, 34,143, 95, 52,217, 35,218,220, 76,202,118, 61, 39,195,238,132, 70, +244,214,102, 85,238,236, 52, 40,204,194, 82,231,110,142,189,126,244,137,145, 73,244,213,185, 6,164,106,117, 98, 43,153, 2,103, + 38, 9,184, 1,195, 28,214, 58,201, 26,148,224, 2,146, 5,128, 79,242,114,164,206, 8, 7, 25, 18,177,205,246, 80,238, 31,245, +228,176,217,151, 19,205,210, 49,254,135,209, 35,234, 21,235,245,182,218, 99, 58, 11, 80, 53,163,231,220,213,140, 2,146,183,140, + 76,245,151,119, 86, 18,178, 83,152, 81,232, 68, 32,111, 59,231, 17, 98,159,153,114,135,234,116,224,224,161, 84,247,211, 79, 79, +228, 39,191, 58,144,111,188,188,193, 81, 18,206, 16,207, 1,188,154, 16, 40,136,209, 96,128, 72, 34,151, 81, 68, 14,141, 79,201, + 69,232,103,103, 45, 19, 76,249, 11,213, 39,159, 6,210, 50,121, 75,230, 41, 47,184, 80,106,211,107,206,235,107,250,152,103, 7, +159,122,218,148,240,192,252, 70, 67,224,219,216, 33,222,248,112,239, 66,142, 91, 19, 96, 23,229,214,237,154,124,116,255,133,236, +181,206,213, 8, 54,164,166,123,230,238,149, 21, 42,174, 17,124,166,247,249,240,197,145,252,248,167,239,202,241, 69, 95, 86, 26, + 13, 41, 55, 10,210,109,246,216,154, 0,146, 25,165,188,128,128,184,177, 6,149, 83,126, 21,192,104, 64, 58,163,159,110,216, 2, + 19,222,129, 65,216,212,192, 24,251,105, 79, 51,230,216,141,253,161, 84,186, 92,173,144,159,125, 79, 29, 61, 50, 63,148,160,221, + 16, 55, 29,250,194,104,161,154, 82,131,166,182,254, 14,189,118,211,120,241, 25, 16,147, 93,107, 60,231,247,162,207, 92, 45, 21, +153,245, 99,230, 29, 37,252,131,102,155,215,134, 99,142,215,152,130,157, 80, 33, 13,125, 72, 98, 20,220, 68, 64,232,246,124,130, + 35, 97, 86, 90,197,154,108, 44, 53,228,179,158, 6,103,169,188, 62,167,172, 85, 25, 18, 54, 13,129,178, 60, 28, 22,164,106, 99, +226, 67,109,253,125,114,241,199,210,236, 12, 13,177,168,251, 10, 83, 32,233,140,149,196, 47, 52,147, 41,149, 83, 6, 84, 3,233, +139,102,205,125, 53,176,129, 24, 40, 15,250, 2,112, 64,181, 98, 82,191,191, 66, 80, 21,168,130,241,153,183,174,110,115,178,230, +201,126, 75, 3,213, 22,219, 11,160,121, 6, 62, 7,129, 7, 80,215,212, 2, 64,118, 77,102, 66,143,182,204, 28,185, 71, 28, 78, +146,146,205,224, 28,159,146, 4,196,192,163,145,181,110,146, 6,108, 69,208,131,253,144,136,173,213,135,253,235,185,249, 95,100, +238,200, 12,145, 45,162,237, 55,163, 28,169,190, 42, 35,142,233, 47, 65,213, 61,244,194, 51,169,148,179, 35, 33, 43,138,148,203, +157, 67,161, 5,128,187, 46,193,139,169,116, 73,247,112, 94,186,231, 45,153,133, 30,117, 48,176,159,131,192, 70, 58, 81,209, 0, +170,191, 90, 42,112,180, 11, 35,108,145,102,193,223,254,218,215,229,175,254,254,111,137,101, 66,216, 2,241, 25, 96, 57, 16,166, +124,246,232, 57,103,159,209, 14, 1,109, 48,140, 27,166, 77, 64,129,156,228,184,167,177, 63,226, 57,206,166,125,102,135,149,114, +201, 33,110, 98, 89,207,213, 40, 81,187,181,186, 70,116, 61,130,200,111,222, 89,147, 31,191,253, 72,246,206,250, 60, 91,163,137, +157, 1, 84,224, 18,197, 18,133,160, 50, 41, 19, 81,234, 15, 3,182,206,254,231,255,243, 3, 61,131, 87,229,251,175,173,200,141, +173,186,252,237,175,158,211, 38, 18, 23, 1, 7, 9,159,145,141,201,200, 88,128,204,116,214,103, 53, 33, 0,157, 49, 42, 12,160, + 62, 37, 31, 68,192,128,216, 2,168,153, 97,171,196,218,174,161,171,180,144, 22, 44, 54, 28, 68, 38, 87,166,205, 4,193, 13,130, +232,116,210,250,184, 0,166,145,254, 87,237,206,177,218,167,139,238,128,109,221,107, 91, 59,186,126, 89, 57, 59, 63,151, 7,251, + 73,181,243, 51, 89,107,148,200,112,137, 41,171,163,211, 14,217,239,206, 48, 34, 10,128,164, 6, 56,160, 93,142,196, 68,117, 0, +190, 76,165,115,234,192, 83,228,171,191,185, 13, 54,200, 30,193,121,183,118, 27, 92,231,189,163,174, 60,126,222,150,151,111,123, +114,250,188, 47, 23,189,185, 52,244,239,191,251, 70,149, 19, 77,235,234, 35,254,155, 63,126, 89,254,244,223,222,211,115, 22,200, +251,239, 31,201,245, 43,122, 31,200,214,125, 27, 93,226,232,102,218,231,180, 14,206,127, 94, 3,244,171,215, 86,216,250,229,152, + 27,180,176, 83,174, 92, 15, 91, 26,141,186,164,251,228, 24, 79, 34, 73,181,155,207,159,189,144, 87,119, 43, 82,241,161,194,165, +134, 26,212,157,122,104, 58, 19,155,145,195,166, 79, 3, 2, 31,154, 81, 42, 20, 51,228,107,255,248,168, 37,255,230,157, 23,122, +152, 79,228, 31,255,214, 64,190,253,149, 27,174,108,231,244,214, 51, 70,249, 24,133,147, 75,242,135,133, 97,131,129, 57,191,232, +201,105,189,170, 15, 54,197, 18,247, 8,163, 4, 26,249, 52,178, 14, 1,159,180,172, 45, 5,246, 32, 50,240,120, 68,180, 94,116, +135,114,180,215,162, 35, 0,187,213, 16,115,146,152,157,213, 5,191,115, 5, 6, 50,173,198,186, 68,201,215,191,252,217, 35,249, +189,111,236, 18, 77,237,197, 11, 29,120, 71,205,167,239, 9,157, 50, 29, 12,177,112,172, 6,200,231, 52,233,109,207, 52,173, 85, +251,161, 7,206,102,193, 96, 56,105,164, 56,122, 55,151,114,173, 34,167,247,207,101,211,159,171,243, 72,200, 43,175, 52,244,160, +214,196,134,166, 76, 98,214,207,100,221, 60,144, 41,142, 9,169, 99, 69,154, 71, 35, 70,185,158, 83, 16, 2,168,136,235,203, 18, +143,190,115, 70,129,104,126, 18,252,200, 36,246, 13, 57,170,135,181,158,157,203,254,254, 57,208, 55, 4,234,172,100, 60, 89,219, + 41, 73,230, 90, 69, 80, 45, 92,232, 28, 99,237,147, 78,158,239,115,205,226,223,191,191, 47, 80,106,223,185,178, 44,119,175, 54, +100,163, 84,162,195,109,117,212,105,232,125,173, 46,137, 6, 72,194,140,140, 89,112,152,146,230, 64,100, 85, 3,138,239,189,190, + 41,231, 3, 4,105, 1,193, 39,158, 26,172, 92, 38,150,122, 30,178,182,122, 56, 19,230,168, 73, 35,227, 50,114, 84, 51, 38, 4, +234, 69,114,181, 96,252, 1,120, 69, 52,141,229,172,175, 89,107,156,227,136,219,151,231,166,216,247,117, 35, 84,120,109, 62, 69, +176,169,238, 13,117,182,145,141, 10, 17,217,143,224, 72,159,253, 13,189,239,118, 15,122,241, 99,185,178,179, 44,239, 63,120, 76, +225,148,134, 58,191,255,234, 79,222,148,179,206,152, 35,156, 89,181, 16, 48,242,255,254,131, 15,228,131,251,207,184,150, 66, 25, + 96, 79,238,239, 63, 99,118,142, 96, 7,198, 99,255,172,107,104,240,208,178, 90,148,177, 49,154, 21,163,167, 45,198, 62, 54,211, +115, 83,206, 22,100, 99,165, 33,205,110,159,253, 53,150, 84, 81, 69,208,181,219,221,221,150,195,211, 83, 57,109,183,233,248, 23, + 96,186, 4,229, 37,221, 94,208,123, 93,173,213,100,181, 90,149,246,160, 47,125, 10,233,164,104,228,145, 65, 99,127,178,210, 65, +221,229, 20,193,106,232,167,195,241,130, 28,230,249,209,177, 81, 74, 38,172,122,224,197,191,233, 47,147, 42,119,110,253,122,234, + 82,133,191, 33,128,137,157, 19, 11,157,210, 26, 90, 2,248, 28,148,254,241,185, 8, 80, 16, 20,160,167,153,244,173,210, 6, 99, + 11,231,101, 84, 4, 30, 29,107,204,121,240,132, 58,239, 50, 51, 60, 56, 38, 56, 42,100,253,163,177,141, 30,198,226,185, 76,168, +168,219,117, 64,114, 28,216,128,118,183, 67,101,179,171,235,117,246,152, 51,196, 90,204,105, 60,143, 90, 93, 55, 29, 51,146,126, +255,130,253,119,140, 83, 26,229,176, 93,183, 23, 58,158,238,132,209,201,130,235, 29,109, 41, 0,197, 96,196,145,141, 3, 28, 6, + 91, 55, 2, 17,208,220,248,240, 97, 67, 56, 26, 21,204,105, 48, 13,101, 29, 93,182, 54,102,174,205,226, 47,244, 46,112,255,250, +249,137, 49,202,215, 99,117,218,105,117,206,105, 58, 59,140, 54,198,100, 2, 12,156,234, 86, 40, 81,128,125, 61,231, 89, 30, 7, +154,229, 15,141, 43,190, 6, 22,185,222,128, 99,176, 60, 31,177,199,103,214, 27,132, 28, 47, 44,149,171,196, 34, 52,212,142, 96, + 66,231,180,217, 81,251,216,145,205,237,171,242,214,107,175,115,188, 21,211, 16,212, 90,159,134, 54,254,164,103,235,232,172,165, +153,253, 41,113, 45,188, 30,117,234, 83,202,150, 38, 37, 91,207, 51,192, 51,179, 93,114, 88,155, 4,157, 50,156, 51,170, 64, 32, + 84,201, 47,175, 81, 92,101,164, 25,252, 95,252,226, 11, 86, 97,192, 76, 7,209, 37, 6,230,122,157, 0,131,161, 5, 0, 77,248, +209,100, 65,138, 99, 58,239, 72, 82,254,236, 39,143, 24,176,255,225, 55,111,201,243,147,190,102,192, 35,246,171,141, 60,197, 20, +202, 56, 41,158, 77, 92,246,235,243, 89,143,108,141,168,116, 64, 11, 36,156, 25,200, 19, 61,105,171,122, 4, 78,152,201,145, 83, +249, 54,167,141,228,175,162,107,180, 84,206, 16,195, 65,213, 78,253, 59,208, 15, 95,244,250,198, 96, 8,177, 23, 76, 49, 68, 38, +174, 4, 62,135,117, 13, 94,227,160,167,235,156,213, 61,214,227, 90, 54, 47,134, 44,107,131,132, 8,120,155, 97, 96,218,237, 4, +228,138,181,177, 80, 77, 67, 27, 3, 84,192, 8, 68, 49,227,143,253,249, 80,157, 55, 2,173,149, 70,142, 90, 40, 70,174, 52,147, +183, 63,236,200,222,225,128,100, 69,103, 23, 35,201,233,186,188,247,233, 76,190,254,122, 81,178,154,152, 93,209, 76,254,127,248, +231,111,201,120, 48,101,208, 19,163, 5, 1,172,136,235,195,123, 60,183,145,252,252,221, 67,174,223,195,253,182, 52,155, 99, 77, + 18, 82,148, 38,151,132, 56,186,108,211, 78, 73,222,168,105,198, 51,156, 75,170, 82, 34, 59,218,190,110,200,186, 46, 78, 41,107, + 7,196,159, 77,164,170, 17,197,100, 62,144,173,122, 29,192,120, 82,140,150,234, 21, 58, 32, 31,125,178, 74, 81, 74,154, 89,188, +191,215,214, 5, 46,178, 39,242,147,143, 14,137,140,125,105,119,153,243,165, 48,214,200,244, 64,249, 8,201, 84, 95, 23, 3,102, + 5, 96,165, 20,145,189, 67,121,239,241,185, 60, 60, 11,168, 50,246,237, 87, 55,101,123,181,204,191,203, 71,150, 69, 36, 28, 91, + 25, 75,138,238,208,193,112,149,139, 57,141,230,215, 52, 98, 77,179,252,129,217,229,172,187,126, 70,236,250,190,140,102, 74, 24, +255, 65,100,254,222,167, 7,242,163,239,220,224, 70,128, 65,129, 99,206, 81,245, 76, 56,159, 11,193, 4, 32, 95, 49, 7,154,244, + 76, 92, 5, 78,177, 57,113,180,145,227,177,147, 24,180, 89, 85, 40, 58,249,177,205,154,127,253,238,146,188, 56,189,144,243, 30, +200, 45, 2,178,172,129, 1,106,238, 88,171,188,177,161,225, 57,118, 22,153,188, 30, 62,123, 58, 14,196,239,129, 28, 37, 67,245, + 54,193, 96, 33,145,180,134, 0,103,140,234,104, 3, 7,122,120, 33,186, 1,195, 10, 35, 57, 82, 47,119, 54,138,229, 43,155, 75, +242,242,110,193,120,197,209, 35,136, 12,113,185,160, 41, 98,133, 64,255, 61,237, 76,165,255,172, 39,103,221, 9,121,214,161, 73, +223,237,235,225, 15,243, 84,107, 75, 4, 9,234,139, 35, 81,247, 25,219, 36, 32,158,196, 18, 84,152, 64,156, 26,145,215, 96, 5, + 89,120,194,136, 81,144, 73,189,245,202, 26, 75,149,141, 90,222,218, 5,151, 67,242,238,186,131,152,207, 7, 11, 81,213,172,205, + 35,154, 63,102,166, 68,109, 97, 61,224,169,130, 33, 89, 41,186, 65, 46,102, 35,216,193, 72, 32,153,234,134, 26,253,158, 6, 54, +182,136,127,177, 7,112, 29, 26, 48,134, 36,138,240,229,141, 27, 75,210, 26,198,242,222,163, 3,105,182,187,172,136,108, 47,233, + 94,242, 1, 2, 4,175,243,132,145,248, 47,126,253,133, 26,203, 99, 13,242,190, 38,159, 63, 63,144,139, 97, 68,132, 60, 20,156, +218,106,180,178, 40,113,170, 99, 26,142,219, 76, 62,139,217, 28,203,235, 40, 19,135,228, 89, 78,154, 18,157,166, 0,200,152, 43, +165,188, 6, 0,231, 52, 30,169,148, 9,225, 0,213,127,125,115, 83,141, 70, 83, 94, 28, 31,153, 58,153, 26, 69,128,200,168,163, +190,200,126,245,250, 43,234,160,225,212,145,157, 19,167,193, 25,103, 27,219,202,146,137,206, 70, 8,129, 36,207, 59,213, 60,124, + 30,202,128, 32,187, 48,129, 7,223, 62, 55, 54, 29,102,161,108,170,245,148,219,221,174,113,209, 47, 36, 38, 99, 11,210,141, 33, +209,198, 15,113, 31,157,254,192, 57, 49,155, 40, 64, 25, 17,224,206, 81,111,172, 65,118,154,206, 29, 85, 4, 48,142,129,202, 24, +207, 26, 78, 31,153, 24,130, 2, 92, 83, 68,190,243, 33, 41,108,209,107, 55,125,104,159, 35,153,192,189,160,122, 5, 64, 90, 87, +141, 46,250,217,213, 60,184, 50,202, 12,162,234,229,156,188, 56,187,112,123, 62, 45, 41, 0,241,244,140,125,227,149, 93,185,190, +177, 36,159, 63, 61,209,247, 25,179, 27,198,219,144,229, 49, 32,246, 3,155, 20, 73,103,201, 24, 56, 1,217, 11, 81,253,150, 1, + 34,232, 3, 40,111, 52,236,243, 28, 96,111, 99,118, 31,193, 14, 74,242, 73, 39,186,131, 17, 58,150,171,243,110,164, 18,193, 11, +108, 14,190,135,224,179, 52,229,141,137, 97, 1,241,191, 11, 64,187,189,158, 38, 69, 61,241, 53, 40,131, 35, 65, 64, 48, 82, 67, +142,177,177, 24, 1, 64, 48,176,192, 65,192,247,126, 46,105,205,176, 11,149, 42,249,225, 1, 83, 48,142,141,153, 52,207, 78,101, +101,105, 69,150, 26, 13, 73, 23, 42,156, 8,193,244,198,253,199,207,100,105,233,235,178,179,123, 85,126,252,215,255,206, 20, 22, + 39, 1, 37,129,177, 95,176, 14,101,205,236,239,222,188,166, 1,210,132,253,100,162,221, 29,235,100,146, 85,150, 36, 71,114, 57, +203, 15,162, 39,138, 6, 25,128,175, 63,236,202,249,180, 35,195, 66,131, 66, 44,209,188, 39, 27,141,138,238,135,161,180,240, 44, +245,158, 1,254, 5, 11, 31,184, 8,206, 59, 23,154,157,110,202,237,171,235,242,244,240,156, 1,224, 20,156,250, 8,122, 52, 3, +253,155,119,247,228,206,181,101,249,227,111,223,148,127,249,231,239, 73, 79, 3, 92,112, 52,228, 11,232,245,103, 9, 56, 37, 55, + 0,112, 40, 32,104,130,224, 9, 70, 71,117,191,233,210, 82,240,137, 99,156,144,224,228,136,101,196,128, 28, 9, 23,147, 20, 88, + 63,221,206,208,130,207, 80,113,210,218, 92,160,219,197,216,215,241,160,199,224,131, 65,168, 3,123,146,117, 77, 3,206, 43, 27, +155,250,124,134,210, 40,198, 20, 24, 2,171,219,136,140,133, 83,169, 85, 34,158, 55,144, 94, 13, 58, 49,251,245,164,132, 29, 91, +102, 76,157, 4,207,103,251, 22,109,224, 96, 52, 35,110, 8, 2, 48,168, 10,163, 5,138, 80, 23,159,129,132, 7, 62,232,139, 39, + 77,217, 82,127,134,202, 8,198, 52,223,121,120, 38,231,195,153,174,221,170,220,218, 90,146,106, 61, 43,229,114,154,254, 9, 97, + 11, 21, 33,225, 63, 82, 70, 99,253,158,174,229, 7,159, 29,169, 35,135,128, 78, 95,126,246,235, 19,249, 39, 63,184, 66, 27,138, + 0, 38,230,172,158, 57,247,100,102,185, 38,105,205, 48, 3,208,197,234,162, 67, 78,244, 37, 61,148,156, 95,199,240, 61,184,129, +193,237, 14,118,160,181, 50,133,236, 9,146,201, 27,177, 4, 54,182,232, 69,254, 74,191,228, 95,253,221, 35, 3,219,160,220, 59, +245,229, 47,223,126, 70, 7,124,117,169, 72, 84,108, 58,155, 97,249, 43, 5,131, 3, 24, 52, 56,213,243, 32,173, 17,121,228,135, +114,120, 30, 72, 71, 35, 42, 4, 11,127,251,238,115,249,174,102,131, 55,183,106,156, 83, 54, 36,176,161, 45,173, 95, 98, 15,159, + 68, 20,200, 92,138, 9,150, 74, 81,214, 5, 57,138,239, 52,159,103,145, 57,196,145, 70,124, 99, 61,104, 95,191,187, 34,217,199, + 77, 73,171, 51,203,131,203, 61,158, 73,168, 14,245,209,241, 68, 31,112,150,142,240,139,131,142,124, 95, 95, 87, 79,199, 44,193, + 65,119,184, 31,100, 53, 0,137, 44,210, 4, 91,215,116,206,108, 13, 78, 7,193, 67, 31, 35, 49,106, 79, 86, 17, 16,229,151,184, +249, 40,161,170, 27,205,155,153,128, 7,123,230,208,124, 70,251,129,204, 91, 8, 54, 82, 18, 97, 62, 30,181, 40,140,206,100, 77, + 8,129,189,104,148,198,147, 78,119, 21,237, 0,244,205, 17, 12,169, 97,234,107,102, 11,144,227,140, 8,221,152, 4, 61, 41,189, +255,132, 26, 93, 8,183, 68,211,144, 51,176,204,244, 99, 19, 81, 33,152, 72,151, 29,173,142,126,119,168, 81,232,140,153, 46,230, +123, 29, 46, 67,163,113,143,130, 53, 43, 48, 0, 9,235,185,218,172,118,204,195,178, 89,246, 57,255, 76, 46,244, 0,100, 7,174, +183, 74,109,227,148, 1, 15,125, 3, 11, 98, 18, 0,180,178, 0, 46,213,213, 89, 23,210, 54,198, 38,190, 85, 70,192,235,239, 1, +132,134,185, 90,125,199,170,110, 88,191,148,228, 38,245,156,112,139,137,202,197, 86,173, 64,207, 90, 29,111, 0,192, 12,203,250, +121, 73,228,242,172, 48,225,185, 65, 78, 34, 23, 15,101,214,107,201,211,211, 80, 62,125,188, 39, 53,117,180,199,157,166, 92, 95, +174,200, 68,179, 60,140,248, 61, 57,238,200,223,125,248, 49,121,164,255,199,127,246, 95,112,222,251,167, 31,125, 78,162, 9, 24, + 55, 56, 35, 56,145,188, 6,186, 61,162,111, 69, 10,153, 44,157,224,132,104, 91, 83, 75, 35,117,163,238, 65,240, 92,147,102,185, +121,238,156,180, 71,103,177, 82,175,201,245,237, 45,249,252,201, 51,205,210,207, 12,181,203,153,216,148,101,134,177,101,234, 32, + 97, 1, 41, 13, 62,243,241,225, 33,203,244,236,183, 7, 1,117, 5,216,250,136,141,188, 5,149,151, 82, 1, 98, 17, 9,226, 53, +128, 7,192,172, 63, 70,113, 76,109,208, 24,233, 16,181,103,128, 5, 72,250, 68,196,123,139, 72,126, 33,153, 76,237, 3, 91,227, + 40, 54, 80, 25,178, 44, 92, 59,228, 99, 17,116,132, 60,247, 73,150,111, 23, 0, 82,244,125,147,177, 41, 66, 1, 61,140, 32, 7, +217,116,190, 92, 32,176,118,145,241, 19,231, 17,196, 78,214, 18, 83,178, 41, 87,177,243,137,104,198,251,179,233, 28,105,107,201, +104,153,207, 73, 53, 25, 75,123,144,100, 32,128,201,148,179,139, 1,251,240, 81,100,193,244,253, 61, 93,195,153, 79, 84,249, 96, +112, 33, 89,117,120,172,247,121, 17, 43, 53,184, 63, 80,122,194, 17, 76, 7, 99,142, 34,194,152,227,188,226,119, 56, 31, 8, 62, + 18, 94,193,177, 49,122,204, 78, 9,168, 11,173,186,151, 97,255,203,212,255, 18, 46,176,193,232, 25, 2,119,236,201,178, 58, 0, + 61,164, 68, 86, 79,136,120, 55, 14, 12, 84, 8, 89, 13,240, 13, 24, 10,103, 50,101,255,220,206, 32, 85, 0, 1, 59, 46,234,217, + 81, 19,138,209,202, 13, 13,224,128,189, 25,143,186,166, 76,152, 68, 53, 50, 43, 39,122,175, 39,167, 39,196, 2,124,252,217, 33, +193,137,133,188, 6,165,153,156,236, 29, 28,201, 43,183,110,200,214,230,182,124,252,233,167,156,229, 70, 32,144,242, 12,233, 62, +212,160,226,237,247, 14, 57,223,156, 72,100, 88,141,192,135,227,153,224, 90, 50, 12,126, 67,182, 41,210, 78,120, 40,118,147, 63, + 8, 10,146,254, 92,118,119,114,116, 68,168, 86, 65,125,174, 94, 45,105,144, 17,200,137, 38, 3,157,193,148, 54, 35,149,156, 19, +251,242,244,232, 76,207, 77, 81, 94,187,179, 45,239,220,123,206,164, 47, 92, 96,131,244, 67,126,242,209,145,252,240,205,117,249, +254,155,183,228,139, 23, 23,116,188, 40, 18, 33,233,130,253,107,247,109,154, 10,242, 96,125, 2,249,128,249,153,176,186, 48,159, +245,101, 24,217,152, 34, 18, 28,150,226, 25,124,122,151,147, 51, 16, 80, 90,214, 32,176,133,178,250, 48, 48, 76, 11, 91,170, 99, +142,127, 2, 21,143,224, 6, 65,228, 80, 29, 48,136,158,110, 95,217,181, 73,162, 89, 79,118, 87, 86, 56, 25,129,246, 45, 4,138, + 74,165, 28, 65,167,208,183, 95, 95, 47,145, 61, 16,128, 72,236,215,225,200,232,119, 17, 40, 15,134, 8,208,114,100, 41, 5,158, + 75,205,175, 6, 91, 85,121,118,116, 65, 26,105, 84, 80,129, 1,170,235,190,190,162,193, 97, 77,215, 13, 98, 71,235,203, 37, 61, +143,250,140, 59, 73, 13,114,124,249,201,199, 7, 26,144,119,229, 71,223,186, 69, 14, 1, 84,158, 60,246, 32,141,142,124,166,201, +225, 64,109,198,230, 82, 94,237,177,222,215, 96, 76, 48,225, 79,222,127, 38,223,188, 85,151,173,149, 60, 19,162,120, 20,152,157, + 68,203,123, 22, 38, 53,114,152,201,217, 97, 79,182,151,179, 82,210, 72,172,171,209,239,139,206,140,220,189,145, 46,238, 76, 15, +241,141,141,138,108,248,106, 60, 70, 19, 58,234, 17,230,190,245, 0,141,250, 6, 24, 59, 60,234, 74, 29,236, 72,129, 33,138, 1, + 36, 66,148,255, 11,205,138,223,252,225, 45,169,175,169, 65,210, 40, 18,168,207,136, 20,163,154,185,131,223, 83, 31,216,176, 27, +200, 23,123,122, 72,243, 57, 50, 95,225, 88, 32, 99,254,217,199, 7,140, 68,239,238,212,105,188,216,123,156, 71,206,144, 88,223, +149,108, 98, 40,249,160,127,134, 57,210,113,192, 69,206, 58, 49, 1, 70, 46,144,121, 69, 63,158, 68, 21,105,249,254, 87,182, 37, +159, 0, 18, 58, 38, 83,209,103,143,187,242,217,243,174,252,119, 63,188, 65, 29,237,141, 90, 78,179, 38,204, 51,206, 37,163,155, +231,222,254, 64, 62,111,247,229, 63,251,246,182,140,184,241, 61,169, 2,153,158, 72,176, 55,152,102, 22,212,211, 12,184,175,247, +228, 75, 77,191, 99, 6, 3,125, 50,144,205, 34,128, 93,122,233,216, 12, 57,225,248, 69, 52,140,136,146,135, 3, 8,209,106,208, +181, 76,229, 49,243,106,243,143,230, 68, 81,133,240, 57,219,205,100, 91, 45, 95,255,188, 39, 23,157,145,236,235,207, 97,107, 68, + 48, 33,156,127,235,124,200, 40,241,171,215, 74,154,237,235,198,208,236, 71,230, 70,205, 2, 7,207,210, 53,231,122,141, 56,162, +166,225,109, 42, 4, 85, 79,200,235,157,145, 79, 59,114, 72,252, 36,133, 22,208,177,139, 52,136, 25,143, 93,175,213,113, 16,103, +153,153,138,245, 10, 61, 99,139,235, 67,120, 2,179,247,189,169,149,212, 81, 37,160,250, 81, 32, 23,224,138, 7, 80, 47,145, 87, +199,104,173, 5, 35, 87,240,228,201, 65, 91, 18,122, 56,118, 26, 5, 25,106, 0,179,190,148, 99, 6,129, 96, 4, 14, 52,156,196, +156, 9,198,135,171,173,147, 4,180,175,245,153,148,188, 57,163, 89, 28, 28,150, 84,199, 67,141,216,167,122,221, 49, 53, 6, 6, +122, 61,239,222,127,206, 49, 56,232, 43,163, 56, 80,129,250,158, 30,234,247,238,171, 3,191,247, 88,166,106,168,111,108,109,200, +191,255,232,190, 28,156,119,168, 76,134,160, 17, 35,131, 32,150,128, 0, 11,100, 83, 23, 35,104, 0,104,114,214,217,209,231, 70, +228, 18, 72,200, 90,163,206,114, 41, 40, 95, 61,167, 90,136,245, 44, 23, 32,105,185, 34,251, 39,103,236,163, 3, 96, 20, 56,240, + 86,232,102,196,225,104,140,223,217, 90, 51,200,144, 19, 14, 48,135,207,136, 28,144,173,140,185,234, 36, 74,237, 6,136, 67, 41, + 49, 71,109,240, 57,199,216, 16, 48, 4,156, 19, 55,174,234, 5,202,118, 33,227,104, 44,114, 51,163, 39, 93, 0, 73, 61, 71, 59, +137,243, 65,101,171,144, 61,195, 37, 53,122, 80,137,179,207,183, 82, 40,250,183, 4, 61, 50, 40, 72,179, 58, 4,185,215,241,196, +168, 84,113,102, 89,241,162,174,180,157, 77,140,255, 4, 30, 50, 31, 83,206,130, 34, 32,250,210, 24,244,203,146,130,214, 42, 87, +120,126,112,152, 81, 42,148, 90,185, 72, 14,123,244,102,151, 52,219,197,251, 32,171, 10,144, 20,198, 85, 59,253, 25,105,149,191, +114,103, 75,205,198,166, 60, 59,233,105, 16, 48,209, 19, 98, 20,175, 36,135,113,253,241,104,102,122,219,181, 66,157,104,113, 56, + 51,204, 49, 3,240, 55, 47,150,232, 52, 80,126,174,148,202,172, 20,224,255,197, 41,221,245,136, 83,209,231,152, 12,248,140,113, +198,194,197,136, 97, 96, 6, 30,217, 42,206,120,214, 79,178,226, 80,208,231,109,193, 75, 78,109, 66,222, 5, 98, 96, 95, 76, 50, + 33, 74, 80, 88, 70, 13,112, 48,225,184,106,210, 51, 18, 19, 56,166, 4, 65,108,105,221,167,105, 13,214,187,108, 61, 32, 83,107, +183, 59,178, 92, 47,209, 25,161,101, 25,133, 41,249,248,222, 39,114,101,107, 93,190,254,181,111,178, 53,102,193,132, 9,143,132, +196, 9,121,116,236, 7, 39, 39,186,142,234,212, 0, 72, 99, 16,106, 64, 64, 56,113,154,104,215, 91,247, 33,156,232,167, 88,158, + 23,180, 53, 98, 19, 71, 41,150,235,252,236,137,222,235,217,241, 1,159,221,132,237,166,196,255,199,212,123,254, 90,150, 95, 87, + 98,251,132,155,243,189, 47,135,170, 87,169, 67,117,179,187,153,196, 36, 74,163,209,104, 52,158,209,140,173, 15, 6, 12, 3, 3, +219,128, 63,216,255,145,253,197,134, 1,195,134, 61,176, 5,141, 32,105,100,137, 10, 20,169,110,146,106,178,115,229,240, 94,189, +120,115,206,231, 28,239,181,246,239, 21, 69,161,213, 93, 85,175,238, 61,231, 23,118, 92,123, 45,238, 55,146, 6,204,206, 3,152, +250,233,163,103,122, 54,223,149,157,122, 81, 30,159,116, 9,250,133, 93, 44,235,119,252,226,193,165, 58,221,148,124,231,253,219, +242,245,251, 49, 49, 23,173,222,140,216,164,233, 34, 33,179,232,124,109, 68, 43,104, 97,162,114,185, 34,178,221,168,149, 23,179, +161,218,168, 20,219, 83, 56, 99,201,181,212,178,218,132, 98,169, 68, 86, 71,168, 85, 22, 48,213,146, 9, 24, 76,162, 10,215, 35, +126, 36, 97,165,108,229,212, 67, 17, 20,127,243,254,155,108, 53,119, 90,167,250, 28, 99,182, 4, 97, 41,183,235,121,121,235,238, + 62, 91,107,143, 79, 58, 28,243,134,111, 41, 23, 43,234,236,109,146, 3, 2, 53,195,201,216, 90,193,152, 12, 67,128,171,193,194, +254,238,142,188,123,148,229, 8, 30,178,247,109,144, 99,233, 90, 0, 97,127,252,248, 74, 30,105, 48,243,214,173,170,250,154, 5, + 1,211,245,221,154, 28,212, 27,114,123,107,131,182,251,147,207, 94,200,163,211,150,188,247,198, 1,109,132,196,102,167, 65, 32, +244,224, 85, 95, 62,121,116, 46,191,251,221, 35,249,221,223, 56,148,191,248,233, 19,195,127,168,205,249,227, 15,143,229,191,255, +253,123, 26, 32,233,221,212,195, 0,191,140,123, 31,198, 24,165,210, 69, 60, 30, 44,213,169,231,101,164, 81,255,137, 58,140,167, + 87, 19,233,247,103, 50, 27,205, 88, 46,199,194,157,117, 71,214,227, 96,204, 57,161,218, 26, 24,156, 80,234, 65, 84, 89,171,129, + 66, 47,116, 95,186, 96,207, 11, 11,200,139,166,158, 45,134, 44,162, 24, 95, 58,208,149,248, 7,190,250,227,207,206,228,243,147, + 49, 75,124, 24, 15, 48, 3,130,121,234, 88,254,254,211, 87, 84,153,250,254,219, 59, 54,154,226,217, 28, 53, 14, 14,192, 4,184, + 52,136,250,194, 44,196,236,125, 25, 15, 87, 44,227, 20,192,163,155,182,145,153,192, 3, 3,150, 70,163,250,119,210,208,103, 94, +121,210,153,251,178,145, 11,245, 34,169, 83, 82,231,241, 8, 61, 15, 93,148,173, 58,212,129, 52,211, 86,195,242,162, 59, 39,193, +195,159,126,218,150,179,206, 84,222,185, 81,150, 55, 15,107, 36, 99,168,105, 38,145, 56, 49,147, 20,231,112, 61,205,150, 75,114, +114,213, 38,105,202,138,101,238,145,116, 53, 80,185,211,200, 75, 85,159,129,138,239, 41, 48,254,170, 1,149,216,241, 53, 99,254, + 65, 51,239,222, 84,157,177, 58,215, 82,198,113,145, 71,204, 64,215,145,205,122,206, 53,152,186,128, 28,229,116, 77, 37, 43,176, +239,197,164,171,245, 8,194,153,247, 49, 38, 4, 41,205,178,120,216, 96,204,129,131,221, 10,128, 11,199,211,201,105,117,208,141, +170, 35,206, 22,178,102,246, 97,160,214,168, 42,172,201, 51,159,128,148,198, 11, 44, 32,138, 93,105,149, 50,182,234,116,128, 6, +213, 64,172,145,247,173, 52,164,134, 19, 0,188,201,218,104, 41,113,208,168,195, 60,205,154, 52,168, 70,207, 64, 73,175, 92, 95, +221,115,192, 35,204,203,163,108, 4, 56, 17, 90, 9,184, 48,160,248,125,165, 65,144,215,179, 18,215,222, 65, 94, 46,207,231,210, +157, 39, 60, 47,219,213,148,236,222, 46,112,170, 2, 24, 15,204,247,226,125,115,163,190,172,103, 38,196,177,212,128,164, 57,205, +200, 39, 79, 90,210,215, 32,107,123,163, 46,151, 23, 87,242,181, 3, 13, 72, 55,107,242, 39, 63,249, 72,154,221,150,220,211, 8, +252,184, 61, 35,112,230,199,159, 61,228,190, 33, 48, 93,234,231, 0,141, 91,161,158,247,210,245,167, 3,235, 67, 39, 17,251,219, +145,155,149, 6, 17, 7, 50,106, 80,189,130,243,221, 28,165,199,245,220,213,224,246, 96,123,139,206, 17,156,236, 19,142, 24, 69, + 12, 20,192,230,133,146, 55, 50,135,136,189,106,163, 33, 94,185,217,252, 34,196, 66,162,245,235,140,223,181,218,201, 21,143,245, + 45, 20, 10,114,124,114, 38,219, 26, 76, 84,245, 25,142, 47, 46, 94, 11,187,224,239,129, 17, 44,116,149, 45,102,220,217,172,107, + 21, 57, 38, 48,170, 57,197,175, 3, 6,195, 4, 88,123, 4,239,189,112, 65, 57, 1,126, 41, 43, 71,163,164, 79,134, 59,100, 61, +153, 12,251,199,137,155,183,197, 7,164,217, 71, 77,241, 44,231,211, 89, 50, 54,198,145,145, 64,225,185,192,200,181,244, 77, 36, + 35,164,179,243, 89, 6,247, 29,115, 36, 16,242, 8,140, 38,101, 33,139, 25,148,234, 80,234,191,177, 93,101, 5,226,170, 55, 38, + 41, 78, 54, 93,160, 3,238,141, 35,181, 55, 33,171,134,131, 78, 79,179,170, 13, 2, 38, 35, 32,209,193,215,237, 90, 31,232, 25, + 77,166,198, 53,207,242,185,227,211,135,252, 42,214, 18, 61,107, 56,171, 12,176, 0, 36, 47,177, 76,207, 39,112,113,161,123,119, +101, 44,123,168, 44,173, 77,219,194, 11, 12, 44,188, 82,231, 12,238,255, 88,255, 9,130, 77, 18,164,128, 8,229,218,233,155, 22, +129, 1,248,162,100,198,234, 82,228,175,141,215, 30,247, 15,103, 65,131,189,203, 86,211,225, 1, 34,138,169, 0,133,143, 74, 21, + 42, 14,117, 13,108,224,220, 74, 8, 60,196, 90,120,144,174,253,228,211,143,229,157,119,222,167, 30,248, 79,127,254, 51, 77, 64, + 74, 44, 85,123,158,101,251,216, 67, 76, 39,125, 77,157, 4,236,164, 49, 21, 26, 67, 32, 37,102,125,159,206, 14, 21, 52,180,109, +121,118, 48,209, 1,182,192,101, 76,155, 58,155,105, 86,189, 40,176,196,126,122,254, 92, 29,175,105,121,239,237,108, 73, 81,239, +203,106, 29,176,117,135,131,208,236, 15,228,171,231,167,242,157,247,238, 17,191,244,139, 47, 79,213, 59,120, 82,244,178,228, 60, +255,232,139, 51,117,160, 11,217,108,148,173,213,184,140,168, 74, 23,144,128, 74, 3, 9, 61, 27, 93,128, 23,213, 81,207,212,150, + 65,204, 4, 85, 23, 84,133,226,200,192,158, 56, 59,107,215, 73, 4,235, 32, 2,159,106, 49,203, 57,247,132, 19, 13, 49, 37,109, + 49, 45,176,140,108, 31, 1,139, 90, 57, 62, 7,100,249, 95,187,119,151,237,153,110,191,205,123, 9, 25,213,131,141, 50,209,251, + 45,245,127,179,135,151,242,193,155, 55, 25, 68,117,151, 49,171,138,105,253,174,149,158, 23, 63,147,102,208,139, 9, 47, 84,135, + 17,240, 12,134, 3, 98,103,106,149,172,252,245, 47, 78, 88,133, 11,245,156,126,248,229,133, 6, 5, 83,138, 98, 65, 32, 12,237, +147,127,248,101,135, 82,174, 8,148,209,226,186,177,187, 33, 93,181,111, 27,181,130,236,239,212,152,173,191,117,176,109,213, 86, +221,195,135,175, 38,242,147, 47,218,114,114,118,169, 65,239, 88, 68, 63,255,214,222,142,236,238,108,232, 25,232,114,148, 19, 52, +196,159,188,232,200, 78,217, 2,183,196, 85, 85,195, 72, 23, 51,175,135, 8, 78, 25,179,226, 0, 62, 64,156,227,244,106,164, 15, + 19,203,112,104, 99, 95,189, 69, 83,191, 80, 35,154,106,134,138, 64, 15, 79,128, 48,158,145,195, 25,198,251,237,219, 59,250,242, +145,116,218,166, 42,134, 67,233, 37, 41,106, 91, 63,111, 77,244,160,160,164, 58,166,179, 72,229, 1,127, 77,115, 92, 11,134, 97, +119,191, 38,183,142, 22,140,162, 9, 70,114,192, 9,207,166,184,232, 80, 55, 42,129, 52, 32, 42,194, 30,170, 57, 29,223, 73,111, +250, 41,251, 53,102,213,171,152,183,197,104, 78, 90, 47, 72,218, 70,140, 16,100,248, 41, 3,232,128,158,213,119,142,172,213, 83, + 99, 50, 13,116,161,118,229,119,190,153,146,174, 6, 51,149,173, 44,203,218, 79,174,166,242,171,167, 45,121,124, 62,147,231,231, +150,105,253,199,159, 62,147,255,230, 95,127,141, 81,255,169, 6, 56,232,209,195,137,161,191,140,172,121,193, 44, 73,215, 79,215, + 12, 63,147,213,160, 7, 88, 1,244,112,191,126,163, 38,197, 57,196, 77,244,114, 4,105, 25,130, 71, 28, 99, 27,154,193, 14,198, +234, 84,189, 60, 9, 28,158,104,100, 75,229,173,116, 72,108, 0,169, 8, 29,130,119,179, 92,208,104, 56,164,163,245,249,142, 26, +169, 67, 62, 80, 98, 86, 40,218,152, 59, 69,246,167,209, 43, 75,240,145,209,248,114,179, 57,131,111,253, 83, 92, 78,124,182,239, +244,136, 72,196, 1,205,250,192, 88,252,124,162,162, 19,155, 8, 64,197, 65, 15,220, 44, 41,202,229, 92,163,225, 48,150,163,170, + 58, 59,221,152,146,111,232,245, 70,214, 74,155, 47,212,113,161, 52, 10, 31, 0, 4,174,149, 86, 99, 41,166, 76,130, 16, 19, 12, +192, 42,196, 24,141, 92,153,176, 65,164,231,167,173, 65, 22, 8, 58, 80,197, 64, 84,142,125,111,108, 56,249, 74,223,216,181, 98, +107, 23,241,153, 56, 27,172, 63,244, 92,207, 96, 42,175,187,173, 70,223,155, 71,108,211, 76,245, 51,158,158, 94,178,196, 61, 25, +245, 8,232,108,232,229,253, 95,254,226,103,100, 51,251,183,223,127, 79,254,234,203,166,158,147, 1,199, 36,145, 89, 65,102,116, + 91, 13, 68, 10,151, 86,207, 5,212,210,140,216,197,190, 52, 32,168, 51,113,128,189, 68, 29,108,141,251,251,170,217,182,121, 82, + 55,123, 15, 99,126, 83,141, 30,178,221,135, 47, 94,168, 65, 52,113, 23,124, 14,202,217,200,150,175,121,220,109,174, 90, 28, 56, + 45, 67,199,236, 57, 64, 27,128,106, 64, 78,195,120,228, 11, 89,210,201,226, 25, 27,213, 50,165, 85,111, 31,236,177,157,117,209, +238,145, 49,142, 78, 8, 18,144,158, 57,176,152, 35,119, 51,126, 54,214, 1,231,169, 55, 52,185,204,235,224,195,119, 1, 3,115, +117,247, 44,149, 98,158, 58,238,200,230, 80,150,198,250,224,174, 20, 52,235, 66, 9, 90, 92, 37,130, 98, 44,115, 76,117,100,153, +177, 0, 59, 83, 2,150, 37,155, 97,182,105,172,201, 84,202,160, 64, 5, 38, 88, 50, 41, 7, 23,213,141, 67,134, 71,141, 0, 2, + 0, 51,204,120, 16,152,126,245,236, 76,142,118,171,114, 67,237, 75, 87,239, 80, 54, 95,146,223,250,246, 22, 81,251,200,240,128, +240,255,201,167, 39,250,223, 67,217, 9,139,114,231,198,182, 52,202, 25,205,126,244,220,141,230,180, 3,104,203,100,200,144, 23, +147,206,154, 61,110,167, 26,136,233, 2,220,207, 56,249,181,146, 32, 16,204,190,195,184,192, 96, 91,249,157,132,168, 82, 42, 55, + 56,109, 18, 65, 29,210, 91,146, 8, 42, 12,108,196,104,190, 24,232, 89, 89,243,206,231, 38, 83,138,129,196, 28,179,139, 89, 77, +242, 74,158,137, 25, 1,145,175,193,199, 92,157, 90, 88, 12, 88,181,170, 52,182, 41,225, 57, 30, 26, 56, 11,149, 41,156,241,161, +254, 26, 36, 56,176,163,236,175,171, 99,235,232,239,125,227,230, 13,222,169, 78,251, 82,222,188,185, 75, 20,254,124, 4,221,245, +183,229,227, 79, 63,101,208,147, 77,251,188,239, 40,197, 98, 55, 7,163,174,140,245,252, 71, 14,166, 75, 58,209,216, 70,236,128, +113, 72,135,150, 56, 17,112,198, 23, 54, 54,201, 41,122,231,104, 67, 5,144, 59,125,159,247, 27, 9, 12, 16,250,224,254, 7,144, +250, 7, 31,188, 77, 46,248, 63,250,187, 79, 40,197, 10, 27,126,213, 27,176, 39,253,205,119,110,203, 63, 62,186,164,205,195, 90, +109,212, 75,210,211,189,251,232,171, 11,125,159, 11, 61,183,198, 84, 24,177,202,106,184, 15, 76,226, 44,117,141,168,177, 30, 4, +214,146,132, 51, 39,152, 59,176,178,178,155,140, 23,202,216,166,165, 82, 46, 27,240, 50, 89,234,153,211,117, 85,123, 85, 4, 57, +140,254, 94,167, 55,151,106,185,196,242, 59, 70,147,177,150,183,247,247, 89,169, 0, 93,178,198,244,210,110,167, 24, 20,192, 86, +163,165,134,115,124,222, 28,200,254,214,136,213, 97,128, 50, 23, 41,181,113,108,253,100,105,255, 81, 81,186,230, 48,200, 9,146, +198,156, 58,239,145, 6, 19, 37, 38,163, 16, 44,202, 4,208,222,152,107, 96, 95,144,134,218, 9, 4,163, 39,151,125, 6,237,155, +181, 10,171, 41,183,246,245,254,234,189,190,189, 95,163,125,255,232,147,182,156, 46, 52,208,253,197,149,108, 86, 50,234,244,211, + 84,236,196,153, 71,160, 0,223,246, 66,109,240, 56,169,203,254,225, 46,231,236,155,125, 93,171, 84, 78,126,241,180, 39, 11, 0, +164, 87,115, 50,123,225, 60,134,145, 26,209, 78,207, 32,254, 66,146,123, 67, 32, 67,117, 70, 3, 11,205, 94,145,133,234, 15,143, +214, 4,102,160,124,246, 95,253,176,174,155, 29,202,103,207,142,245, 96,155, 10,212,104, 50, 68, 97, 70, 14,182,202, 68,119, 66, + 48, 5, 35,103,232,137,189,104, 79,120,216,240, 66, 40, 31,110,235,131,151,202, 75, 73,235, 97,105,105,118,214,105, 45, 28,150, +203, 0, 82,134, 65,182, 94, 34, 14, 43, 54, 18, 36, 36,126, 62,227, 70,158, 44,154, 77,156,250, 18, 34, 79,254, 59,186,206, 46, + 28,138, 92,108,124, 2, 68, 19,126, 98,104, 75,168,219, 64,249,201, 79,172,140, 52, 91, 89, 38,242,141,219, 27,188, 56, 47,245, +242, 61, 56,214,204, 92, 23,237,145, 46,236,201,229,212,141,236, 4,242,228, 69, 87,254,232,199, 79,228, 95,124,235, 38, 51,105, + 16,160, 0,176, 52, 4, 59, 30,122,228, 40,121, 3, 33,170, 6, 0,139, 59, 37, 48,208, 48,107,151,163, 68, 10,145,141,220,137, +147,253, 3,100, 41,140, 76,234, 20,189,185, 20, 60, 85,166, 64,163,249,189,251, 13, 34,119,113, 31,193, 56,228, 57, 61,119, 18, +203, 57, 70, 47, 2,200,176, 6, 40, 69, 55, 71,178,236,171, 99,132, 99, 71,105,115,157,184,108,202, 70, 6,113, 97, 99, 42,206, +233, 26,168, 3, 93, 56,161,143,107, 13,227, 5, 65, 64,145,149,150,161,119, 14,226, 31, 13,198, 48, 31,141,203,252,246,173,138, + 60,125, 18,203, 72,191,239, 98,160,239,162,207,116,191,238,203,205,186,207, 64, 37, 84,167,142, 74,203,197,124, 45, 95,157, 15, +165, 51, 94,216,168, 26, 13,186,207,145, 28,124, 14, 28,125, 22,239, 36,134, 12, 45,104,176,119,114, 53,160,128,195,141,237,130, +219, 63,143,132, 21, 8,196,130,217, 66,174, 5,131, 89, 30, 23,113, 34, 44, 49,179,185,243,151, 61,217, 84, 67, 81,212,247,120, + 49,241,164, 51, 75,120,200,179,169,178,102,235, 3, 41,135, 57,249,211,159,127,165,235, 50,151,255,225, 15,255,157, 92,245,175, +228,227, 71,199,156,157, 69,192, 8,167,136,181,156,233,250,119,213,113, 46, 29,133, 42, 12, 12,156, 33, 28, 22, 12, 53,213,168, +244, 91,247, 54, 55, 56,175,126,169,145, 62, 75,206,169,192, 33,114, 69,142,246,118,213,185,101,229,217,233,153,116, 6,125, 71, + 0,146,226, 58,143,103, 78, 28, 37, 8, 28, 50,218, 28, 42,246, 51, 96,102,189,126, 29,200,226,127,139,245,146,234,101,247,110, + 28,202, 11,253,188,150,190, 11, 12, 21,250,227, 8, 16,208,167, 7, 77, 44,245,181,213, 40,225, 44, 3,113,142, 95, 15,102, 51, +119,198, 66,169,107, 64,131, 18,239,252, 58,160,112, 4, 45,226, 90, 9,107,167,123,142, 51,136,123, 3, 60, 1,180,218, 49,251, +126, 61,106,135, 53,138,184, 38,198,239, 14, 39,235,191, 70,206,199,172,146, 0,245, 13,188,194,218, 91,179,231,218, 40,166,175, +133, 2,137, 53, 1, 42,109,197, 53, 76,216, 78,233, 33, 8, 6,231, 60,174,132,102, 84, 63,120,247,142,102, 62, 29, 93,215,161, +252,233,143,159, 19, 64,133, 32, 1,153, 23, 46, 16,170, 85,213, 66,134, 37,231,158, 26, 47,232, 51,228, 50, 85,217,216, 62,144, +209,226, 66,206,206,206,165,164,239,202,118, 6, 46,198, 98,202,145,183, 24, 4, 37,225,220,218,125,232, 10,169,189,154,207,214, +146,206,103, 56,207, 14,113, 14, 98, 7, 82, 70,135,203,253,130,147, 15,132, 18,206, 17, 4,172, 0,176, 3,149,195,218,221, 63, + 77,252, 83,147, 52,223, 27,255,131, 19,162, 12, 49,122,213,224, 30,247,109,132,106,134, 9, 6,205,208, 33, 97,188, 68,182,191, +244, 25, 8,108,111,231, 73,129,155, 45,213,104, 59, 3,180,140,212,126,118,186, 87,220,151, 16, 68, 92, 0, 35,206,231,204, 26, + 81, 70, 47,151, 74,122, 30,202,100, 54,171,109,237, 73,182, 80,149,157,189, 3,249,214,215,191, 33,207,159, 61,210, 63,171,218, +160,140,190, 3,176, 80,120,215, 9,208,214, 26, 88,118,251,227, 95,143,134,186, 73, 31,236,254,108,178,208,224,205,116,204,129, +157,192, 58,227,136, 88,219, 88,247, 75,247,168, 82,169,203,173,195, 29, 86, 72, 58,253,174,145,221, 36, 17, 43,123,223,184,123, + 32,103,173,142, 6,193,122,223, 50,208,166, 24,235,175, 11,242,237,251, 71,242,247,159, 60,123,125,198, 65,252, 50, 95,121,108, +137, 36,107, 72, 61,175, 89,217, 97, 74,225,132,115, 56,234,182,178, 86, 31,218, 36,240, 23, 75, 55,171, 45, 14, 16,141,170,111, + 65, 29, 51, 52, 27, 2, 76, 63,128,215, 95,239,230,120,188,102,249,222,196, 56,151, 86, 37,246, 45, 72,195,221,172,130, 4, 74, + 29, 44,245, 14,160, 64,216, 72,203,237,221, 26, 1,119,147, 57, 0,127, 51,249,224,141,186,102,210,154,177,247, 70,108, 69, 68, + 89, 96,168,198, 26, 20, 76,100, 5,169,218, 21,240,151, 75, 7, 42, 53,210,157,180, 38, 51,248, 14, 36, 68,248,158, 90, 49, 67, + 34, 33,250, 43,125, 7,236,253, 13,205,194, 27, 21, 76, 56,164, 88,201,233,107,208,140,192, 28, 2, 55,160, 31, 70, 53,121,178, +212,179,160,119,247, 88,147,202, 23,237,153,195,114,216,122,162, 2, 21,196,198, 17,129, 59, 86,200, 69,178,221,200, 74,146, 42, +232,155,102,232,131,162,168, 40,253,161,190,243,108,168,223, 57,147,176, 80, 72,203, 64, 51,209,247, 15,202, 28,153,106, 95,105, + 84, 1, 98,124, 93,164,158, 26, 34,244,142,152,133,176,212,226,203, 89, 87,179,248,139,158,220,221, 72,203, 15,223,219, 98,169, + 6,253, 32,108, 92,150,210,138, 6,162,249, 44,244,164,217,153,200,237,157, 2,185,145,191, 56,155,176, 36,225,147, 86, 48,208, +140, 63, 47,119,119,202,114,161, 11,218,159, 39,116, 50,232,107, 93, 75,101,154,117,139, 24,185, 5, 78,139,155, 99,112,137,201, +177, 34,194,193,220, 30,101, 55, 49, 71,157, 65,185,203, 99,212,199, 46, 9,122, 32,234, 54, 81,146, 27,232,142, 12,128, 76,212, + 67,138, 42, 4, 68, 23,168,186, 83, 41, 18,221,140, 82, 20, 14, 13,216,133, 16,205, 46,117, 3, 30,158,116,164, 63,139, 89,157, +240, 9,246, 9,152,193, 62,124,218, 38,152,240,219,111,237, 25, 5, 39,128, 50, 80,163, 66, 73, 43, 40,144, 44, 35, 89, 47,172, +127,168, 14, 10,217, 15, 80,163, 27, 5, 61, 24, 8,126,230, 22, 21, 2, 37,154, 78, 27,250, 62,113, 8,100, 92,184, 27,251,117, + 9,227,165, 6, 87, 6, 62, 51, 52, 83,228,198, 94, 18, 27,115, 32,248, 77,163,251,181,161, 90,123, 28,131, 9,165, 81, 79, 75, +212,159, 26, 48, 7,227, 58, 8,110, 34,199, 1,143, 61, 92, 27,121, 80, 12,174,117,125, 47,204,106, 79,214, 38,151, 10,240, 69, +127, 4, 49, 16, 79,158, 93,140,228,151,143,218,242,197,211, 14,185,251,255,187, 63,120, 83,141,134, 47,141,179, 72, 46, 39, 49, + 75,106, 95,219, 18,121,124,124,165, 14, 4, 34, 46,105, 74,220,146,207, 61, 27,242,207, 95, 93,244,213, 8,167,212, 41,109,106, + 4,109,185,194,140,140,107,129,148, 65,232,160,198,178,175,223,185,208,231,219,172, 22, 40, 40, 3, 49, 29,140,239, 16, 49,170, +107,135,242,151,143,249, 76,148, 35, 51, 30, 65,120, 64, 3,161, 45, 3, 42,221, 13,181, 36,145, 58,226,142,126,214,149, 6,148, +255,225,147, 51,142,168,160,119,140, 89,252,214, 84, 3,198,169, 70,184,139,137,102, 56,135,242,151, 31,127, 73, 61,101, 8,120, +160, 98, 0, 28, 4,214,177, 86, 42, 50,251, 3,128,139,125,120,135, 67,240, 56, 62,104,224, 72, 56,247,173,106, 85,157,245, 72, + 6,211,169, 1,169,184,103,134,208,191,127,235, 38,123,202, 47,206, 78, 57,158,117, 61,122,150,196, 46, 96,138,205,121,179, 10, + 3,101,179,169, 41,153,145,101, 47, 50, 54,195,235,209, 51, 6,165,214,168, 34, 82,190,173,207, 25,184,108, 18,127,231,217,171, + 51,102,246, 9,193,152, 11, 67,252,166, 51,116,184,211,107, 77,111, 48, 63,102,179,100, 84,235,233, 51,147, 30,213,157,177,107, +141,115, 78, 67,208, 72,197,236,161,227, 51, 65,213,186, 89,173, 25,208,109,109, 28,227, 41,246, 97,245, 78,177,148,159, 56,205, +117,253, 60,253,238,169,222,175,148,102, 63, 40,211, 18, 36,235, 25,151, 4, 74,140, 75,130, 61, 83, 36,119,178,119, 52,146, 26, +220,101,206, 18,227,120, 39, 11,102,127,173, 17,130,219,162, 58,189, 9,103,154,135,106,156, 38,243, 41,251,246,173,254,216, 40, + 66, 81,122, 5, 48, 10,227, 96,227,128, 10, 96,155,245, 58,149,226, 14,246,160,196, 5,134,177,180,218,132,181,221, 25, 65,245, + 49,101,193, 7,185,208, 45,107,101,203, 46, 99,252, 12, 0,154,130,243, 31,107, 77, 29, 4, 71,247, 58,137,167,172, 70, 96,125, + 32,230,147,246,245,110,133,118,119, 64,149, 13,231,106,106, 6,232, 50,166,164,144,207, 57,251, 21,112,164, 13,193,225,124, 62, +114,234,148, 52, 81,212, 10,199, 83,161,165,128,214, 90, 18, 91,203, 5, 21, 63, 56,202, 58,168,184, 33, 59,140, 4,104, 53,103, + 43, 5,247,184,217,106,145,176,103,161, 65,193, 86,189, 66, 60,195,163,167, 79,229,157,251,111,202,111,255,240,183,100, 62, 29, + 74,179,217,113,244,189,107, 35,188, 17,107,233, 84,138, 85,182,131, 16, 28,145, 7,135,130, 60,230,224,177,175, 57,130,138, 61, +142,185,225,189, 57,114,248,154, 62,216, 99,208, 1,110,119, 32,227, 47, 46, 31,211, 7,188, 56,121,161, 1,195,138,130, 57,152, +233,134,253,188,175,118, 11,120,128,167, 47, 87,114,231,198,134,212,203, 89,238, 93,110, 29, 82,252, 72,156, 74, 31,180,198, 23, +228, 1, 89,211,246,101, 48, 73, 13, 16,101, 18, 90, 48,230,197,166, 17,176,178,150, 22,246,200, 40, 46, 18,174, 83, 77, 3, 93, +172,155,134,228, 84, 57, 67,146, 0, 26,237,116,152,165,156,116,107, 56,101,213,195, 42, 48, 62,137,109,238, 29, 30,210,161, 35, +179,111,245,218,114,146,173,202,237,237,178,156,180,166,228, 99,105,235,239, 67,155, 33,167,255,221, 82,127, 4,112, 45,101,135, +123, 75, 57, 44,131,167, 35,114, 72,253,128,115,248,190,103, 4,113, 56,239,208,149, 71, 66, 28,146,213,111,162, 89,120,133,213, + 32,147,199,157,203,121,123,196,201, 15,180, 54,128,237, 64,240,120,217, 30,200,150, 6, 22,231,151,109, 93,227, 52,167, 35,208, +174, 68,224, 20, 50,224,183,246, 24,166, 73,108, 72, 42, 98,219, 6,147, 1,105, 13,136,138,165,178, 84, 3,107, 49, 25,162, 63, +145,161,218,156,177,218,137,169, 6, 38,225,131,103, 87,210,111, 13, 37, 30, 0, 92,144,200,227,211,174, 60,191,152,201,243, 54, +148,192, 64, 86,144,167,218, 25,196, 19, 98,142, 56,169,195, 59, 31,201, 15, 52,178,121,247, 86, 93, 15,106, 66, 84, 31, 90,172, +152,201, 5,227, 18, 50,110,246,247, 98, 67, 34,190,125,163, 42,127,253, 39, 79, 52,226,159,243, 82,110, 55,114,252,121, 12,125, + 15,244,239, 78,150,145, 93,122,134,195, 30, 81,156, 38, 20,239, 83,214, 21, 96, 6,136,111,224,236, 19,204, 9, 62,105, 68, 51, +232, 1,131,123, 93, 15, 95,166,158, 19, 15,227, 88,129,101,242, 33, 23,222,122, 96,125,253,185,143,143, 17,129, 37, 4,120,145, +181,106,141,136,167, 42,141,114, 81, 29, 87,153, 81,211,245,248,199,150,110,240, 27, 71,107,249,219,143, 95,105, 36,191, 34, 48, + 14,129, 68, 42, 19,112,225, 31,188,232,201,123,183,183,228,222, 78,133,198, 14, 17, 58, 25,178,214,115,153,142, 7,114,124,209, +150,141,124,192,185,201, 70,104,224,178,168, 55,145,158,167,155,231,167, 88, 78,130,228, 32,213,131,144, 13,166, 19, 30,252,165, +110, 94,185,148,161,216,202,130,218,208,190,147,129, 99,189,214, 8,113,200,159,110, 4, 34, 48,188, 40,227, 30, 95,205,165,190, + 95,146,218, 13,117,142, 87, 26, 84,160,175,157, 4,100,109, 74, 16,232, 68, 54, 58, 23,230, 74,220,143,108,201,151, 63,216, 57, +212, 11,114, 38,255,243,159,125, 66, 17,156,145,190,231,179,211,190,238,125, 79, 30,156,206,168, 80,182,142, 33,214,179,201, 18, + 42, 8, 74, 2,215, 23,125,179,225,201,221,162, 58,199,189,130,252,232,113, 75,215,102, 75, 14,170, 25,217,197, 72,198, 50,205, +210, 48,162,105, 4, 68,192, 13, 0,125, 74,162,153,216,231,186,159,144, 51,125, 77,214, 51, 56, 26,136, 56, 64,102,243,160,150, +149, 80,215, 12, 32,194, 53,103,148,213,217,148,178, 14,150, 31, 25, 25, 8, 25,204, 34,182, 59, 80, 9,162,208,134,254,241,143, + 53, 8,249,213,195,231,242,253,183,183,184, 95,152,217,222,200,248,188,180,254, 32,210, 51,170, 81,240,101, 71, 42,234,176,160, +116,132, 40, 24,213, 22,244,185,135,179, 5, 29, 21,242, 23, 56,113,207,129,113, 44,177, 77,244,140,148,136, 80,191,100,127,124, +206,103,198,243,145,120, 73,215,230,221,123,119,233,140, 31, 31,159,176,207, 70, 0, 39,129, 81, 70, 18, 3,167,203, 12,100,109, +218,221, 4,122,186,192,148, 78,146,227, 54,190, 11, 84, 61,246,151, 99,210,119, 86, 72,249, 10, 7,177,191,185,201,125,124,248, +226, 37,141, 53,254, 28,162, 45, 48, 44, 64,248, 26,151,249,194,168, 89,157,238, 57, 75,241,152,203,117, 32, 57,150,217,173,200, +225,136,216,126,173, 38, 6, 39,119, 13, 10,132, 81, 71,185, 30, 14, 26,191, 15, 35, 51, 95,206,165, 86, 49,208,217,112, 60,180, +158,180,177,226,144, 32, 5,235, 88, 82, 99,136,190,102,127,104, 52,165,101,246, 55,133,217, 17, 13,184,102, 87, 70,181,105,153, + 13,165, 90,167, 40, 51,142,228,205,120,205,179,130,241,192,187, 55,246, 72,124,133, 64, 25, 45,128,167,231, 61,162,141,199,234, + 88, 80, 44,222,223,172,170, 45,137,152, 81,159, 94, 54,229,107,183, 14,153, 77, 62,126,121, 65,253, 9, 84,170,176,183, 24,147, + 98,175,209,179, 10, 8,123,206,153,180,225,124, 2, 35,154,130, 4,213,218,179,128, 3,220,112,235,181, 49,133,225,110,177,189, +183,142,185,254, 72, 40,192,217,190,140,244,156, 44, 71,204,108,235, 32,179,209, 0, 47,133,241, 89,144, 17, 37,125, 6, 20, 12, +206,144, 12, 1,123, 22,226,133,141, 71,255,154,148, 24, 89, 40,200, 38,216, 70,194, 40, 44, 66, 13,181,179,243,113,215, 81,146, + 10, 3,138,104, 49, 85,231,152,151,135,143, 30,145, 97, 15,163, 88,181, 90, 93,206,244,156, 29,159,158,201,159,253, 85, 73,126, +247,183,190,167, 25,251, 45,249,251,159,255,138, 65, 60,108,158, 79, 6, 57, 35,202,130, 19, 41, 3, 41, 74, 96,164,199,222,242, +140, 44,134, 41,179,147,161,181, 97,200,146,231,219, 36, 81,196,145,181,169,218,234, 20, 73,113,246,246,238, 81, 47,130,102,104, +101, 36, 99, 8, 24, 89,165, 8,124, 86,118, 48, 98,204, 81,200,137,105, 41,252,222,183,111,203, 95,255,227, 19,102,194, 40, 93, +115,114, 41,176, 86, 76,188,178, 89,126,159, 64, 77, 33, 35, 30,158, 99,181, 28,115, 58,104, 9,123,121, 77, 37,141,196, 13,216, + 43,226,110, 82,100,246,163, 62,130,238,211,176,191, 50,141,116,135, 72,239, 12,198,212,186,224,116,212,218, 18,136,155,123,187, +172,180, 44, 25, 68,170,141,217, 44,211, 62, 29,221,220,212, 4,245,148,212,229,168, 14,131,254, 59, 8,242,210,214,164,104, 48, +158, 59, 62,138,128,152, 23,124,246, 10,192, 59,175,194, 0, 6,237, 15, 86, 22, 80,201,194,251, 81, 7, 33,197,137,149,195, 27, +219,250,125,207,196,102, 32, 98,167,182,152, 33,150, 6,210,200,168, 92, 15, 71, 19,125,182, 88,238,223,222, 85,155, 59,160,196, +118,224,139,227, 45, 17, 86,176,150, 26, 16,214, 53,144,131,172,183,122, 62, 77,118, 2, 41,132,115, 42,212, 77, 34,181,145, 65, +242, 58, 25,196,247,223, 59,172,203,230, 27, 53, 27, 93,252,149,102,158,239,223,174, 51,226,233,158,118, 88, 30,130, 31, 73, 65, + 68, 68, 23,254,205,131, 13,185,173, 15, 10,128, 26, 88,138, 16, 49, 12,244,113, 63,186, 8, 56,178,128, 49, 8, 76, 68, 33,146, +198, 69, 74,146, 20, 47, 44, 72, 20, 18,189, 0, 55, 54, 11,114,115, 75, 29,167, 58,170,203,206,132, 37, 23, 80,120, 2,128,134, +190, 43, 68, 71, 80,150, 69,116,234,137,137, 69,112,224, 6, 27, 74, 30,116, 11, 12,168, 32,165,134,125,213,154,147, 3,123,137, + 69, 5,106, 92, 23,185,112, 93,180,228,101,178,190, 31,140,113, 4, 54,168,249,130, 64, 39, 48,251, 64, 72,160, 94, 52,157,231, +193,100, 38, 79, 78,155,210,175,204,164, 51,156,242,144,103,152,241,164, 52, 34, 76,201,173,157,162, 36, 31,236,202,143,126,126, +162,155,176,224,172,122, 72, 14,105,145,183,246, 66,185, 89, 5,179,220,136,179,207, 48, 64, 36, 17,137, 87,146, 42,165,165,139, +254, 98,106, 45,239,221,169,115, 28, 16,139,127,124,137,178,156,149,159,115, 32,223, 80,167,159,215,108, 28, 45,188, 66, 25,234, +105,158, 81,146, 2,117, 15,212,240,113, 71,130, 74, 81, 51,134,144,179,211,148,107, 37, 89,181,245,234,146,149,101, 82,112,240, +200,172,135,122, 81,110, 53,124,142, 89,224,130, 45, 33, 4,179, 54,176,213,194, 69,116, 33,132, 47,220, 60,125, 70,215,231,131, + 59,155,242,135,223,191,199, 8,122,119,163, 32,155,181, 52, 53,238, 63,184,159, 97,150,254,243,135, 61,117,130,101,150,205, 80, + 1,193, 76,242, 97, 37,148,183, 54,212, 72,235, 89,223,210, 64,226,135,250, 62, 63,126,208,146, 29,117,198,251,123,121,185,234, +142,229, 89,107, 44, 57,240, 99,171, 99,121,124, 62, 32, 0, 15,193,214,120,178,100,105, 15, 50,134, 40,173, 34,130,133, 97, 46, +229, 87,204, 82,190, 60,155, 73,216, 92,200, 7,239,212,216, 2, 66,219, 4, 80, 93, 3,250,197,100,157, 73, 22,154, 53,204,215, + 50, 94,169,177, 9,115,116, 18, 39,189,161,252,221,103, 79, 53, 24,202,200,121,103, 44, 79, 94, 62,151,239,190,115, 91,141, 63, +176, 31,109,105, 4,104,219,168, 65,209,179, 52,159, 78, 72, 73, 89, 41,107, 54,170, 89,254,104,106,189,103,150,196,157,179, 99, + 97, 35,182, 30,249,126,125,131,123,123,222,238,240, 28,121,190,245,196,225,176,113,102,222,190,117,196,128,224,201,201, 41, 81, +238, 24, 11, 3,242,123, 73,245,164,136, 14, 29, 25, 61, 12,216, 20,134,188, 80,208, 32,117,201,239,227, 44, 58,140,125,114, 29, + 68,120,228,149,102, 25, 30, 89,185,254, 23,158,239,112,123, 91, 13,115, 65,154,189,158,129,126, 40,212, 98,165, 64, 60, 15,122, +240,214, 10, 8, 93,223,220,218, 92,161, 99,109,132,168, 9,219, 7,158,141,106, 93, 99, 5, 12, 56,103,237,170,189,141, 13,189, +159, 29,167,180, 22, 80,241, 43,157, 54,148,250,124, 62, 35,130,254,154, 40, 7,217, 29, 3, 76, 84,143, 48, 82,154,133, 98, 97, +193, 88, 28,187, 35, 18,195,100, 82, 57, 35,115,138, 23,198, 71, 17, 9, 13, 40,130,189, 87, 23,175,140,219,156,114,173,122,215, + 39, 83,150, 46,231,179, 9, 71,105, 81,218,197,244, 9,130, 55, 60,111,173,152,231,251, 90,160,100,179,217,168,156,228,193,115, +174, 25,227,151,199,103, 18, 5,123, 6,109,136,241,174,186, 14,106, 8, 99, 49,110,126,210,228,199, 54,207, 75,205, 7, 63,180, + 89,103,227, 94,150, 36,101,148,186, 28,211,155,140, 88, 53,132, 19,220,174, 85, 8,194, 29, 12, 38,156,123,247,215,172,207,168, + 99,207, 74, 53, 95,100,101,100, 76,197,185,136, 14,237,178,211, 38, 87,186,144,220, 48, 32,232,204,211,237, 68,134,191, 92, 91, +115,197,127, 61,125,240,107,201, 96, 4, 30, 24, 31,155,122, 41, 58, 84, 84,254, 72,203,132, 81, 53,205, 64, 33,214,210,234,116, +229,221,183, 54,229,217,139,167,210,233, 52, 37,204, 20,229,252,170, 37, 95, 60,124, 34,119,239,190, 33,119,142, 14,229,236,236, +146, 68, 58, 21, 93, 99,244,180,243,233,152, 24, 25, 76,115,140,231, 54, 58,134, 49, 67,216,176, 96,145, 98, 22,140,188,129, 45, +107,204,194,172, 64,204, 34, 20, 59,193,115, 78, 56,218,183, 38, 62,162, 86, 65, 2,116, 71,182, 53,160, 50, 41,104, 35,157, 1, + 38, 0,248, 41, 80,215,250,222,132,235, 13,154, 89, 76, 74,212,212,230, 31, 79,250,172, 96,225, 92,131,238,119,189,210, 32, 32, +155, 54, 17, 30,221,255,225,100,233,104,138, 13,141, 31,250, 86,101,140, 18,107,194,174,156,172,104, 67,207, 39,184,227, 1,126, +196, 52, 1, 0,108,112,232, 56, 87,232,235, 67, 5,114,182, 50,161,138,104,109, 66, 71, 36,165, 41, 1,133, 62,226, 89, 69,191, +219,243, 82,196,127, 32,226,218,221, 40,201, 69,103,198,231, 3,178,253,198, 94, 85, 19,131, 83, 78, 68, 85, 74,105,211,132, 7, +152, 53, 29, 16,217, 14,222, 3,223,166, 54, 93,107, 46,207, 42, 10,222,227, 72,157,106,175,175, 9,110,111,194,202,227, 85,103, +192, 86, 27,206, 43,238, 84,179, 7, 14,121, 96,173, 2, 86, 56,222, 80,159,122,160, 73, 33, 64,230,173,145,129,239, 98, 23, 80, + 98, 28, 22,156, 8, 45,253,108, 36, 45, 8, 68,125,150,227,167, 12,142, 38,145,113,157,152,221,138,101, 60,236,171,227, 95,202, +187,187, 13,171, 8,180, 53, 74,158, 45,138, 50, 82, 67, 97,242,118,198,215, 12,231,190,169,153,194,205,253, 77, 19,144, 0,125, +101,193,202,104, 48, 42, 44,153, 47,198, 44, 13,192,144,225,139, 65,178,194,190, 97, 58, 39,221,225, 88, 23,108, 40,189,174, 70, +215,211, 2,123, 7, 24,245, 64, 68, 54, 68,102,191,128, 70,173, 16,241,105, 66, 18,215,243,178, 86,238,103, 38, 35,246,224,216, +108, 92,116, 92,120,140, 45,112,244,107,109,253,201,208,110, 5,127, 14, 62, 15,153, 17,208,182, 64,153,123,137,129, 59, 40,214, +162,207,252,143,207, 58, 82,211,108, 18,253, 97, 24, 94,148,135, 94,156,183,100,187,190,100, 52,139,121, 99,144, 7,160,124, 8, + 30,225,119,143, 26,212, 41, 71, 31,253,149, 58, 78,163,145, 77,164, 28,104,196,183,161, 7, 53,107, 0, 48,207,205,113,167,244, +192,174,250,107,121,227,118, 67,198,107,189, 68,144, 16, 76, 2, 39, 82,178,150,141,195,162, 20,182,179,122,209, 19, 89,106,246, +152,206,169, 97,193,139,228,116, 13, 48, 2, 56, 89, 16, 85,235,101, 66,146, 85,164,245,226,204,215, 41,153, 38,105, 30, 60, 42, + 35,233,161, 7,229, 12, 17,153,196, 40,120, 20, 17,120,248,114, 32,135,181,178,212, 74,105,246,123,168,136,231,248,142, 99,135, +126,142,221, 8,147, 17,105, 4,204, 28,254,179,111,223,212, 76, 75, 51,137,192, 33,118,213,112,162, 11,156,142,203,242,133,174, +215,213, 85, 87,198, 7, 21,249,248, 49, 74, 69, 69,249,246,190, 26,252, 76, 76,113, 29,208,113, 30,236,151,229, 59,122,224, 63, +252,234, 66,222,190,179, 33,139,216, 35, 58,181, 6,150, 57, 49,148, 59, 88,179, 50,105,251,117,127,154,200,131,102,194, 57,208, + 61, 93, 91, 98,117, 72, 74, 2,242,126,205,194,245,231,159,188, 88, 48,227, 64,187, 0, 75,187,112, 61,109, 0, 93, 16, 32, 84, + 27, 13, 25,181, 39,164,140, 69, 86,251,231, 63,123, 40,179,113, 31,115,140,242,201, 73,147,172,115,153, 76, 65,226,176, 32,207, + 79, 63,103,128,128, 30, 58,200, 87,112, 94,106,165,146,244,219, 45, 10,198,192, 8,205, 33,146,131,202, 78,104,100, 50,236,107, +130,238,117,107,147,229,226,174,102,232,214,119, 14,104,108,128, 77, 64,219,229,254,209, 77,233,246,251,122,134, 46,120,238, 48, +107,158,214,128, 19, 17,187, 56,210, 35,156,237, 70,177,192,145, 55,170,166, 33,211, 97,207, 91,207,166,183,160, 50,219,220, 33, +237, 1, 32, 74, 92, 16,152, 35,167,195,146,173, 1, 48,198, 1,188,135,239, 64, 95, 26,160,184,192,183,224,212, 90, 5, 54,174, +228, 59, 98, 38,232, 48,160,197, 83, 42, 20,120,249,113,254,175, 41, 83,177,206, 12,146,172, 20, 70,167,205,150,136, 58,206,103, +167,167, 20,104,193, 25,193,204, 62,177, 22,148, 80,181,242, 50,178, 71,128,143,234,249, 52,191, 23, 21,141, 44, 17,236, 66,250, + 95,140, 21,149,243, 41, 86, 5, 74,197, 44,179,203,153, 6, 67,153, 16,101,212,140,147,146, 77,145, 55, 28,164, 44,144,191, 69, + 31,179,158,153,201,120, 12, 26,213, 37, 3,148, 98,198,200, 80,192,179, 13,223, 7, 32, 20,238,231, 98,137,145,189, 57, 91, 23, + 16,192,193,251,191,113,180, 37, 47, 94, 53,229,229,233,149,124, 79, 3,185, 55,143,118,228,244,106, 40,143,199, 70, 0, 4,135, +136,245,181,145, 76,171, 98, 64,102, 21, 34, 43, 88,135, 56, 50, 73, 85, 4,189,112, 60, 41, 86, 76,108, 82, 36,112,189,102,172, +231,116, 60,101, 16,132, 83, 28,148,171, 38,144,162,107, 51,117, 60, 24, 56, 63,176, 25,195,192, 52, 40,112,223, 80,197, 11, 98, +195,135,196, 94,236,184, 32, 18, 27,189, 67, 21,194,241,242,227,179,208, 99,207,105,116,191,156,246,245,220,155,204, 39,238, 0, +136,132,224,188,176, 15,253, 65,143,229,124,140,155,177, 18,160,123,247,163, 31,255,131,252,187,223,255, 23,242,123,191,243,123, +242,226,241, 39,150, 77,187,158, 47, 90, 92, 24, 57, 3,217, 9, 38, 33,144,124,120,204,122, 77, 85, 14,227,129,104,117, 49, 19, +213, 51, 13,214, 66, 8,169, 96,191,209, 82, 53,136,141, 6, 70,233, 50,109, 55,130,172,158, 58,160,227,147,199, 12,176,169, 37, + 46,190, 99,215, 84, 27,173,151,245,221,219,135, 92,151,120, 57,227,123, 82, 89, 17, 78, 85,207, 33, 70,189,200,173, 1,160,223, +100,168,247, 15,120, 44,211, 63,159,205,210,164,155, 70, 11, 4,114,163,168,152, 1,228,135,231, 64,165,176,170,142, 16,179,228, +116,244,100, 2, 92,177,133,136, 51,218, 30,140,232,124, 81, 89, 24,141,151,252, 46,216,188,163,189, 29,254, 44,241, 31,235, 5, + 65,201,104, 23,224,158,195,182, 85,244,172,110, 85,145,100, 84,244,108, 71, 4,117,167,200,184,185,102,112,147,207,167,185, 95, + 49,239, 91,218,206, 8, 2,232, 85,196, 51,149,211, 53,137, 24,244, 46, 73, 37,142, 26, 9, 70,225, 14,182, 43,122, 6,123,198, + 82,233,148,228, 82,250,119, 81,209,222,203, 22,245,243,151,210, 27,206,212, 15,230,229,237,187, 91,114,210, 58, 37,159,135,127, +141,123,208, 61, 26,106,176,186, 70, 48, 85, 45, 82,191, 96,205,177,217, 57, 1,172,168, 14,192,158,177,186,168,207,122,118,217, + 70, 86, 40,223,187, 87, 55, 21,185, 90,189, 36,103,253,153, 9,114,168, 83,210,253,208,191,164,209,184,110,198,123,111, 28, 50, +242,195,133, 5,104, 3, 17, 22,202, 67,113, 96, 23, 14, 99, 41,197,162,177, 25,193, 48,131, 76,223,184,148, 81,246,216,144,205, + 74, 86, 15,174,113,125, 99, 84,229, 69,107, 73,142,113,100,164,216, 4, 24, 85,102, 62,234,168, 64,104, 33,174,119, 34, 14, 76, + 67,246, 85,106,220, 70, 12, 52,112,136,168,200,230,217,197, 35,129,128,190,140,207,204,202,122,249, 32,192, 96,196, 51, 91, 50, + 16,129, 90,219,106,105, 8,112, 68,229,207, 78, 38, 4,132,220,191, 93,151,173,205,188,116,199, 19,102, 85,155,165,154,108,151, +179, 44, 15,161, 60, 31,234,161, 89, 78,112,248,150, 84,230, 33,211,207,218, 74,189, 3,104,113,163,167,169,153,118, 52,141,101, + 50, 52,198,170,198, 70, 94, 74,117,205, 44,212,192,226, 93,155,151, 99,153,143,150, 50,208,103,175,105,102,145,193,200, 11,190, +190, 53,215,239,141,165, 92,208,108, 29, 35, 12,179, 64,198, 32,118, 24, 45,200,189,156,206, 5,100,179,131,116,232, 92, 35,185, + 69,166,100,116,180,193,154,153, 62, 56,177, 83,174, 81,157,210, 67,119, 53,137,229,162,187,144, 63,251,248, 66,126,255, 91,135, +172,170,120,174,143, 24, 51,154,181, 82,205,194,177,218,145, 32,100,177,226, 69,238,142, 49,167, 30, 74,173,158,181,113, 39, 61, +160, 96,146,131,113,190,127, 84,145,159,124,118, 41,159,157,104,240, 80,170,203, 15,239,166, 36,175,209,230,122, 97, 20,152,248, + 44,204,234,222,218, 44,112,198,253,103, 15,175,228,235,247,118,228,173, 91, 5, 61, 3,198, 15, 48, 31,204,228,195,207, 91,114, +191,166,142,105,149,147, 39,151, 11,185,232, 3, 40, 50,214,103,143,136,172,190,118,234, 36,200,137,133,128, 53,207,149, 42,225, +144, 96,212,200,215, 77,177,147,152, 37, 48,244, 65, 95,234, 69,125,218, 28,202,201,197, 21,123,126,237,238,146,165,222,125,205, +108, 47, 53,179,121,121,209, 36,154, 30,189,184,179,118,151,199,170, 86, 41, 19,247, 48, 95, 69,175, 21,215,174, 41, 64,169,189, + 29,248, 68,246,150,245,194,142, 28, 80, 41,113, 35, 96,190, 19,180,192, 40,217, 27, 55,111, 82,104,227,172,213,100, 0, 5, 29, +116,232,167,227,174,160,188,139, 76, 5, 25, 97, 78, 3, 59, 56,160, 86,127,192, 17, 56, 43,175,122, 86,146,143, 77, 87,225, 26, + 9, 15,231,130, 63, 95,172,192,226, 88,100, 95, 28, 99, 49,232, 29,227,243,172, 63,107,122,221,136,200,249,247,136, 99,176,172, + 56,235,132, 90,124,170,242, 89, 41, 25, 35, 82, 84,123, 98, 48, 18, 57,142,136,107,159,110, 72,238, 98, 46, 67, 60, 1,217,234, +220,115, 37,177, 97, 9,240,222, 8, 24,178,152, 7,158, 13, 24,152, 76, 23, 62, 25, 24,129, 81, 65,255, 27,159,133, 96,165, 86, +206,201,193, 86, 77,239,136,102, 62, 25, 91,195,213,106, 65, 28, 2,140, 51, 2, 27, 92, 32,204, 2, 79,189,169,147, 75, 21,150, + 70,161,107,189,171,103, 48,100,175,215,231, 68, 73,106,226, 51, 24,196, 8, 57, 70,249,144, 25,211, 64,134,230, 52,225, 60, 27, +149,156,148,114,187,242,119,255,248, 76, 62,252,226,165,236,108, 52,164,211,237,232,207, 78,245,115,125,187,187,113, 68,253,115, + 24,141, 53,219, 56, 41, 58, 15,100,109, 8, 18,136,137,129,167,139, 45,112, 67,162,129, 42, 8,146, 25, 67,252,251,175, 57,199, +169,221, 77,130,147, 37,114,118, 18,130,160, 69, 81,212, 0,166,133,117, 75, 2,206,204, 39,142,195, 60,206, 10, 1,180,161,235, +242,139, 27, 35, 53, 94, 8,227, 53, 79,160,134,232, 88,247, 4,188,253,110,166, 26,207, 57, 7,225, 73, 96,108,112,144,175,246, +213,158,110,109,239,203,108,212,145,153, 58,198,126,247, 82, 30, 61,126, 32, 95,127,239, 3, 89,121, 89,249,171,159,124,200, 96, +134,137,152,225, 99,121,198,170,165,156,174,111,133,227,100,200,212,209, 2, 64,108,135,243, 28, 57, 0, 29,122,179,190,191,166, +130,218, 24,128,171,148,129,194,214,131, 33, 91, 25,181,250, 14, 38,236,173,165, 20,100, 89, 96,102,235, 49,177, 96, 9,146,173, +155,245, 2,181, 31,160,218,246,139,167, 3,217,171, 23,101,168,119,160, 51, 90, 57,210, 26, 95, 29,248,154, 78, 17, 99,115,148, +128,213,123,178,134, 42, 31,218, 53,107,171, 6,195,125, 99, 29, 75,106,151,183,106, 5,226,115,216,118,130, 22,253, 34, 38,168, + 25,156, 37, 67,140, 84, 79, 87,100,177, 3, 25, 18,170,201, 56,211, 32,153,201,240,204, 77,136, 7,203,234, 94,128,207,126, 57, + 66,160,156,227, 8, 32,122,232,181,114, 94,198, 75,180,121, 66,181, 25, 83,249,214,253, 27,242,197,227,115,222,179, 75, 77, 74, +203,185, 20, 65,150,126, 88,228,250,131, 46, 28,119, 20, 9, 97, 56, 52,172, 10, 28, 61,198, 56,111,238,212,229,228,114, 36, 91, +149, 44,201,132, 48,182, 87,204, 39,166, 61, 66,157,154, 21, 3, 0,140,184, 97,146,163,221,159,200,119,190,121, 75,174, 90, 35, +249,201,151, 67,182, 1, 96,231, 16,192,173,160, 49,129,150, 15,124,159, 88, 75,161,171,217,126, 46,191, 34,167,198, 10,220, 14, +208,154, 87,223,214,236, 13,164,148, 1, 62,196, 36,201,195,135,175,218, 36,250, 39,194, 27, 68, 18,122,192, 16,129,212, 54,115, + 20, 63, 33,171, 21, 65, 51, 43, 19, 85, 89,217,161, 13, 88, 66,206, 82, 95,120, 60, 71,132,171, 95,166,145,141,159,178, 81,137, +146,158,246,253, 98, 70,158,191, 26, 9,186, 85,223,121,163, 65, 6,177, 23,103, 61,246,210,169, 51, 12,121,220,149, 49,197, 65, +217,132, 61, 98, 61, 88,140,106,197, 24,162, 96,216,144,165,131, 5, 13,254,159, 64, 18, 61,216, 81,104,186,198, 1,148, 61, 0, +230,201, 24,138,155, 90,221,145,147, 93,116,227, 91,208, 81, 6, 93,104, 87, 35, 86, 56, 10,144, 31, 60, 63,235,203,191,253,238, + 29, 2, 38, 78,219, 3,130,185, 94,188, 58,151,231,231, 3,121,247, 32, 47, 13,221,112,128,190,254,254, 81, 83,190,122,222,149, +170, 26,102, 32,112, 17,161, 0, 3, 0, 3,227,235,225,159,170,131,158,232,129,189,152,169,147,206,251,156,202, 6, 23, 48, 70, +129, 24, 33, 95,245,101,172,191, 14,183, 27,210, 88, 98,214, 52, 96, 20, 61, 38, 48, 77, 47,144,190,255,121,123, 46,199, 77,104, + 73, 47, 9, 28, 41, 21, 67, 57, 44,135,242,253,187,117,114, 15, 67, 19, 30, 70,116, 62, 67,166,101,104,246, 8,228, 26,250,222, + 95,156, 78,228,151,207,245, 64,104, 16,242,197,147, 75, 53,114, 25,121,235,176,202,172, 2, 81, 36,130, 33,155,121,246,109, 30, +250,159, 40,166,112,100,137, 66, 22, 17, 13,126, 38,151, 50,242,182,192,176, 9,135,122, 6,234,181,156, 52, 23, 25,249, 87,247, +178, 82, 33,249, 80,194, 61,194, 1,140,157, 44, 32,136,111,142, 26, 89, 86, 6,190, 58,110,243,249,161, 11, 15, 46,234, 53, 12, +188,102, 32, 35,140,236,177,232, 53,151,142,102,201,149,219, 71, 50,143,115,146, 69,164, 59,157, 26,119, 52,165, 22,141, 49,138, + 53, 5,199,130,199,200, 88, 29,108, 71, 29,245,117,111,116, 62,133,138, 93, 70, 30,183,250, 4,137, 32, 64, 44,193, 17,228,243, + 44,163,191, 56,107, 82,151, 26, 68, 64, 0,196,161,122, 3,103, 11, 64, 28,137, 44, 34, 43,205,162,236,150, 56,134, 56, 56,172, +157,250,134,108, 84,107,156, 92,240,245,114,161, 95, 87,202, 25,155, 28,136, 94, 48,206,118,239,198, 13, 57,111,181, 25, 56,144, +196, 9, 61, 20, 32,199,199, 99, 62, 47,254, 15,206,137,142, 79,159, 27, 65, 10,121,186,213, 80,183,244, 89, 60,199,145, 46,174, +159,158, 36,177, 3,204, 57, 64,168,126, 22,156, 4,246, 97, 58, 53, 37, 55,100,237,158,111,202, 92,226, 45,152,209,146, 76,132, +217, 80, 32,135,219,155, 44,245, 93,104,102,140,108, 3,159, 7,230,185,142,126, 31,185,203,157, 51,185,254, 31, 29, 58,214, 60, + 54, 42,219,171, 78,135,235,129,115,130,202, 5,218,105, 36,216, 9, 67, 58, 27,140,161, 45,121,247,214, 50,208, 51, 0,172, 2, +206, 0,130,160,200,225, 60,158,159,117,101,167, 90, 32, 31, 4,116,210, 65,147, 10,196,239,130, 0,154,148,203,154, 86,204,214, +175, 29,101, 30,255, 95,207, 74,179, 59,100, 95, 19,129,123, 83,141, 29, 24,230,200,253,160,246,132, 25, 74, 58,203,185,111,188, + 27,130, 23,100,176, 5,142,221,121, 26,132,101,228, 27,111,238,202,227, 87, 45,234,197,127,247,107,119,245, 59,167,242,211, 79, +159,200,133,222,103, 47, 76, 19,239,146, 19,195, 54,132,164, 38, 77, 49,120,165,252,111,144,176,108,110,211,248, 6, 54,131, 77, +130,237, 89, 18,124, 56,167, 45,226,122,129, 67, 0,179,233, 94, 68, 66, 24, 47, 54,204, 10,158, 9, 9, 10,240, 26, 32, 1, 66, +118, 5,181, 58, 4,213, 64,205,175,255,137,228,112,226,184,247,163,245,218,245, 81,237,179, 17, 80, 20,114, 53,117,212,109, 78, + 11,180, 53,235, 68,233, 63, 89, 37,175,153, 8, 59,186, 78, 69,117,100,144, 6, 77,102, 99,221,227,140,156,158,157,106, 22,188, + 37,111,220,123, 75,126,245,217, 47,165,221, 27, 66,171,205,250,174,177, 9, 38, 93,181,167,234, 60, 90, 12, 58, 2,158,143,196, + 84, 41, 93,153,155,172,124,128, 1,132, 30, 91, 55, 56,183, 8,166, 61,114,161,172,169, 80, 7,180, 62,214,124,127,179, 33,197, + 66,214,200,118, 16, 16,165,211,172,138, 86, 52, 96,174, 1,112,150, 49, 42, 90,180,111,206, 90, 93,182,249,186, 26,240,163,186, + 8,124, 2,168,117, 45,219, 14,205, 20,129, 0, 11,124, 5,184,211,154,161,161, 34,137,160,134,114,169,122, 23, 90,195,133, 12, +103,134,195, 0, 24, 27, 19, 26,245,130,209,167,226,158, 28,110,111,201, 87,207,158,242,156,121, 28, 19,246, 89, 89,234,235,189, + 67, 48, 11,177,160,134,166,228, 41,170,231,165, 52,145, 89,114, 4,248,222,205, 77,150,242,219,253, 5, 91,179,120, 39, 80,128, +223, 62,104,232,153,155, 73,127, 12,238,249, 57, 91,204,241,194,231,122, 64,250,185,164,201, 88,218, 23, 39,199,107,248,154,174, + 62,227,102,173,200, 73, 19, 76, 84,160,133,131,138, 20,129,169,113,236, 4,132, 18, 50,113, 66, 25, 16,247,255,147, 39, 29, 57, +216,191,148,175,191,179, 43,159, 63, 27, 8, 0,236, 8, 16, 6,154,244, 44, 57,226, 26,177, 74,149, 80,193, 52,162, 77, 71,128, +128, 68,118,170,190, 56,147, 45, 83, 94, 22,118, 55, 67,226, 38,253, 59, 89,125,206, 5,162,118,206,251, 69,178, 81, 43, 73,163, + 94, 39, 1,199, 54,140,249,200,122, 65,232,231,166, 52, 10, 92, 57,164,118, 28, 25, 17,199,117, 43, 59, 29, 88, 25, 15,135,231, +154,222,243,104, 51, 43,221,171, 46,169,247,240,121,144, 26,252,198,141,140, 46, 70, 81, 62,125,218,165,129, 71, 9,204,128, 35, + 96, 76, 51, 66,136,245,234, 26,168,100,209, 90,224,219,248, 15, 8,237,241,155,153,173, 2,196,142, 36,128,202, 22, 48, 60, 25, +223,245, 67, 19,150, 32,230,208, 83,212,211,218, 85, 35, 95,213,159, 25, 12,198,140,142,128, 76,236,235,130,228, 81,154,209,139, +248,221,155, 91, 82, 88, 14,185,224, 27, 50,147, 88, 55, 17,218,174, 65,180,148,155,229,154,189, 23, 64, 14,129, 33,139,208,223, +141,125,171, 6,140,161, 82,135,146, 50, 74, 85,122,200,170,122,144, 46,198,125, 6, 62,233,180, 85, 25, 66,208,168, 38, 54,138, + 3,167,138,181,251,217, 23, 77, 57,233,204,229,162, 53, 38,171, 19, 34,185,206,200, 72,251,183, 26,121,150,197,183, 53, 91,129, + 49,121,209,154, 74,123,184,228,129, 15, 52, 19, 59,208,131,214, 40,231,184,214,152,137,132,193,124,213, 91,203, 63, 60,232,179, +116,153,214,205, 7,219,220,143,126,246, 92,183,226, 80,157, 83,193,122,195, 81,228,232, 72,173,119,122, 45, 28, 2,163,142,170, +196,245, 8,203, 4,143, 1, 71, 70,164,212,138, 14,251,139, 23, 45,169,214, 26,242,205,163,146,228,215, 35,185,232, 37,191, 70, +124, 83, 61,206, 35,152, 4, 12,133,254, 92,244,128,214, 36,187,149,200,147,179,145,148,209, 59,159, 47,217,163,135, 18, 18,130, + 9,244,179, 39,147,177, 92,106,214,220, 31,206,101,118,123, 67,110,110,103,168,184,133, 67,139,254, 29, 71,245,208, 71, 19,155, + 60, 64,121, 23,102,240,248,105,139, 65,101, 54, 99, 61,106,100, 37,199,221,158, 6, 98,207,216,211, 75,123, 5,217,218, 40,240, +252, 64,160, 33,165,251,211, 80, 99, 15, 84, 55,192, 53,152, 41, 7,173,111, 64,242, 11,107, 75, 16,141,235,123,220, 11, 56, 97, +140, 5, 29,237,237,233,158, 96, 52,167,197,153,214,224, 90, 9, 76,247, 4, 4, 48,219,122, 63, 94,158,159,203, 69,179,197, 50, + 56,169, 91,161,228,167, 14, 61,113,229, 85, 24, 95, 68,226,173, 94,207,128,120,147, 41,159,131, 26,236,228,112, 72, 27,107,148, + 88, 41, 31,255, 32,155,167, 62,183,190,239,150,126, 7, 2,178,238,208,230,229,241,191, 98, 30,154,215,154, 13,170,243, 37,199, +119,161, 72,128, 28,170,101,213, 98,137, 36, 24, 96,210,226,120,150, 4,174, 55,183,100,185,252,186,183, 30, 93,243,189, 59,228, +251,245,127, 99, 20,174,163,223, 69, 45,117,151,229,175, 92,127,210,119,227,151,232,237, 65, 78, 53, 94, 27,248,172,144, 54, 62, +121,223,201,232, 98, 29, 48,222, 51,152,174, 41, 91,137, 61,137,214, 22, 76,226,140,112,230, 62,155,229,251, 65, 66,181, 24, 21, +140, 85, 78,207, 71, 75, 51,107,128,165,224,228, 80,194,190,234,244, 25,244,194,176, 6,137, 1,104,183,213,158, 20,114, 32,174, +154,179,114,231,185,128,132, 92, 3,161, 57, 48,204, 29,247, 71, 61,249,242, 24,137, 73,145, 37,211,149,254,124, 26,196, 79, 36, +145, 49, 29,112,172, 7,238, 35, 26, 7,198,177,228, 17,185,142, 44, 39,195, 50,171,245,215,225,208,113,158,150, 40, 95,162, 66, +233,136,147,168,193, 14, 45,110,189, 52, 25, 76,102,104,208, 64,135, 30, 25, 14, 3,129, 12,210,225, 48,171,239,168,142,101, 30, +207, 77,218,214,141,152,190,110,168, 95, 87, 75, 98, 91,231,128, 12,149,154, 17,234, 94,160, 85,132,239, 7, 16, 13,204,157, 8, +160,240, 67, 75,202, 66,207, 36, 91,171, 72, 61,165,201, 83, 78, 3,232,124, 77,186,237, 51,169,148,223,146,239,124,235,187,210, +186,122,165, 25,104,133,246, 20, 54, 8,159, 15, 94, 14,208,156,162, 44, 60, 69,197, 65, 12,132,136,111, 14, 2,195, 25, 0, 93, +140, 17, 55,100,211,104,223,224,223, 36,253, 68, 96,167,255,129,179, 92,209,160, 54,137,235, 84,131,155, 78, 7, 68,132,163, 37, +134,243,214,159,180,229,225,243, 51,178, 8,222,185,113,160, 65,222, 37,131,134, 87, 24,211, 2,166, 70,239, 63,156,213,104, 8, + 91, 57,117, 99,123,168, 86,133, 70,120, 5,178, 50,220,123, 61, 43,245,122, 77,237, 93, 65, 42,197,220,107, 54, 75, 96,113,128, + 62,135,189, 63,237,154, 90, 98, 20, 79,245,157,154,118,126,220,250,238,104,208,177,114,247, 6,146,211,161,218,159, 66, 54,253, +154, 10, 25, 99, 96,184,255, 72,224,142,118,244, 78,171,237,237, 77, 99,121,247,222,166, 60,120,214,212,187, 63,212,179,150, 53, +236,136, 62, 90, 77,157,248, 88,207, 43,192,144,168, 14,112, 28, 89, 3,191, 60, 84, 12,245,188, 66,181, 20, 99,175,237,206,216, +116, 4,212,161, 99,218, 0,213,146, 27,187, 13,210,109, 55,213,255, 64, 80, 12,123,143, 86, 23, 41,147,245,188,253,244,227,151, +210,189, 85,151, 55, 14,114,242,241,179, 41,219, 28, 61,205,188,197,141,116, 7, 78, 9, 21,129,202,214, 86,141,154, 31,144,141, + 69, 27, 48, 95,180,177, 96,128,189,193, 59,210,213,187,151, 7, 17,219,221, 27,135, 26,205, 15, 24,129, 97,254, 21, 61, 68, 24, +251, 67, 32,145,195, 88,142,219, 11,150,171, 51,129,149, 13,113, 41, 99,246,130, 18, 70, 74, 81,226, 27, 53, 40, 34,150,196,250, +182,149, 84, 36,225,114,192,210, 23,118, 4,224, 37, 44, 54,162,164, 15,110, 55,216,147,251,155, 95, 93, 50, 42, 66,112,176, 94, + 7,148,142, 67, 6,200,209, 30, 49,244, 6,217,199, 80, 43,242, 76,163, 43, 65, 73, 29,176, 78,202,116, 26,227, 25,169, 5,145, +189, 80,193, 71,100, 52,152, 73, 17,114,143,186,200, 83,117,178,195,153,141, 54,208,176,160,191,232,216,187,246, 10,161,188,185, + 1,226,145,153, 76, 52,155,236,130,163, 92, 23,230, 61, 93, 96,176,156, 33,131,110,228, 83,178, 89, 72, 49,136, 89, 70, 70,152, +143, 0,132,252,223, 96,105, 2, 15,187, 58, 15,208, 90, 98,141, 98,112, 46,166, 83, 4,182,161,132, 27,215, 52,211,209, 83,145, +192, 72, 2, 12,181, 76,228,173,163, 42, 47, 2,136, 94, 62,127,218,145,177, 30,160,183,110,150,168,117,222,210,104, 26,206, 25, +181,165, 98, 33,100,148, 54, 91, 38,140,222, 46, 46, 58,210,106,250, 12,178, 96,212,176,206,157,137, 71, 20, 56,178, 27, 24, 84, + 68,217, 48,248, 95, 61,111,105, 38,133,254,102,218,102,102, 29,210, 26, 11, 9, 52,103,226, 89,155,131,118,194,247,152, 89, 23, + 82,108, 60, 57, 6,185, 68, 62,127,222,147,159,125,126, 37,247,238,132,210,168,106,230,239, 21, 37, 66,148, 8, 71,228, 57,161, + 17,240,120, 35,122, 4,102, 97,162,142, 56,147,200, 94, 61,148,217, 72,164, 55, 48, 52,179,207,145,161,185,172,169, 54,166,239, + 50, 25,201,189,253, 2, 69, 9,186, 87,115,249, 55,119, 14,100,169,241, 76, 6, 20,163,190, 5,142,164, 4, 14,140,165, 14, 78, +161, 61, 90,202, 31,255,205, 75,185,108,173,212,176,164,109, 54,188,160,153,114,251, 84, 10,133,138,236,111,239,240, 2,158, 65, +234, 20,239, 23, 45, 56,219,139, 94, 30,203,177,106, 88,103,212,237,182,236,152,253,103,223,115,228, 70, 49,209,247,111, 29, 29, + 81,135,250,164,217, 36, 40,169, 55, 48,178, 22,207, 33, 92, 81,150, 46,233, 29,233,141,134,204,178, 80,218, 3, 2, 22, 89,220, +242,154,133, 13,107,131,214,143,254, 29,100,237, 75,167, 64,232,185, 18,238,144, 10, 93,166,174,133, 71,129,163,131,225, 54, 0, +154,241, 21,236, 52, 54, 13,221, 75,161,145, 53, 17,238, 8, 8,242, 46,243, 64,143, 24,226, 73,156, 72, 70,255,220,245,237, 86, +235, 95,151,229,209,251,206, 81,185,109,193,222,181,209,252,218, 4, 7, 71, 28,157, 48, 18,201, 97,210, 41,162,215, 47, 58,109, + 93,219,162, 1,109,124, 19,204, 64, 86, 26, 59,214, 8,107,219,216,157,196, 81, 66, 39,152,104,117, 56, 85, 40,125,105,150,125, +184, 89, 32,109, 39,148,168,140,115, 34, 49,110, 1, 76, 3,100,224,176, 74, 78,138,192,231, 28,252, 2,202,102,186,174,205, 94, +135,107,131,182, 23,170,127,144,108, 6,159, 2, 70,213, 80, 10, 6,112, 9,125,213,114,174,160,235,184, 43, 77,221, 31, 84,160, +132,184,130,152,147, 52,187,155, 27,210,209,160, 22, 6,238,201,201, 43,217,223,218,147,223,248,218, 29,121,227,104, 91, 30,189, +120, 37,131,246, 88,159, 33,207,145, 72,140,110, 33,209, 72,216,207,182, 32, 50, 6,224, 21,170,124, 24,229,237,247,201,201,126, +173,202,135,251, 19,129, 10,153,164, 47,154, 8,104, 70,154,201,133, 12,204,160, 45, 81, 82,199,131,108,105, 21, 45, 41, 62,194, +106, 35,202,214,156, 58, 64,219,109,197,214,215,117, 16,133, 4, 33, 76,165, 41,221,139,158,187,239, 20, 39,249,231,158,222,197, + 98, 85,150,234,120,225,208,108, 76, 16,230,109, 73,130, 38, 56,124, 4, 44,224, 44, 88,130,115, 95,183,127,119,111, 95,190,122, +248,149,148,234, 19,169,109, 30,106,230,254, 74,254,241,203, 39,172,188, 70,201,146, 96,178,241,100,193, 61,189,185, 93,147,183, +111,239, 25,177, 20, 1,140, 49,237,184,171,223,177,154,132,179, 14, 59,131,243, 7, 39, 97,106,133, 49,149, 5,251,221, 83,253, +117,142, 14,246,228,244, 5, 51,103, 50,213,129,189, 50, 66,155, 22, 25,186, 47, 71,135, 71,154,108,140, 73,247,219,234, 2,201, + 93,148,231,167, 45, 93,155, 57, 27, 17,148,133, 37,196, 60,101, 60, 16, 0, 11,134,198,180,152, 99,235, 32,214, 32, 65,237,183, + 58,125,240, 92, 32, 35,141, 92,235, 13,103,219, 15, 48, 83,222,231, 68, 21, 85, 40,157,118, 61, 89, 27,167, 83, 58,224, 2,100, +105,179,137, 99,227,139,104, 75,139,249, 80,125,196,146,206, 18, 6, 29, 25,251,139,243, 33,121, 66, 62,121,116, 69, 45, 1, 56, +126,180, 85,138,156, 8,137,248,142, 94,172,231,178, 84,150,244,114, 97,182,195, 33,243, 1,214, 52,225,166, 44,197, 96,128, 39, + 74,171,237,126, 43,218,211, 51, 61,103, 18,134,254,249,146, 76,148, 9,207, 9,237, 74, 44,172, 18,192,150,127,245,162, 47,135, + 91,186,215,201, 80,174,122, 19,115,226, 41, 67,229,179,253,172, 63, 95,210, 0, 7, 84,182, 59,141,162, 77,142,136,241,190,236, +215,193,172, 89,227,153, 74, 81,128, 73,253, 0, 80,164,158, 84,204,248, 35,235, 72, 18,102,132,107, 61, 84, 5,253,161, 42, 22, + 97,106, 81,126,226, 24,176, 56, 55,156, 10, 92, 41,201,132, 34,140, 28,132,133, 2,217,200, 89, 20,120,227, 96, 79,142,142, 76, +214, 13,198,185, 30, 26,125, 36,102, 88, 11,106,152,158,156,246,116,227, 34, 57,215,168, 11,217, 39,122,223, 40, 71,166,105, 84, + 28,176,197, 25,197,193,116, 41,139,206, 68,179,164, 33,137,240,223,122,111,159, 58,188,177, 99,220,193,232, 22, 46, 41,144,153, + 88, 20,168,191, 97, 14, 59, 79,177,145,132,179,166, 0,138,148, 16, 0,232,165,123,214,157,107, 68, 87,146, 23,186,193,173,241, +210,241,101,175, 4,114, 53,207,154, 43,178, 18, 65,128, 36, 68, 9,210,154,246,140,192, 17, 13, 78,231, 41,234, 79, 99,174,154, +120, 0,117,230, 7,181,148, 76, 52, 11,239,183,230,102, 92,151,160,109, 93,179, 10,114,169,153,244,127,250,232, 92,254,203,223, +188,161, 14,188,162,206,105, 68,170,217,166, 58,241, 3,221,204, 98, 78,157,128, 6, 35, 39,151, 99,246, 41,203, 0, 36,206,231, +166,111, 15, 39,158, 88, 73,137, 14, 3,165,105, 72,210,166,140,139,120,177, 10, 88, 2,199,218, 33,171,131, 1,236, 79,150, 84, + 20,170, 84, 66, 35, 73,192, 88, 89,224,177, 76,106,108,116, 98,127, 31, 78, 19, 2, 0,122, 9,215,154, 21, 37, 12,168,208, 59, + 92,169, 99,158, 72, 38, 94,200,151,143, 79,229,135, 95,171, 75, 57, 20, 70,136, 57, 31,104,109,113, 20,167,190,123,198,136,107, +181,128,248, 0, 10,236, 26, 77,246,122, 75, 50,188,193,184,151,213,208,174,151,115, 25,169,177, 4, 27,221, 91, 91, 5, 25, 28, + 21,164, 59,194, 60,126,154, 25, 19,130, 37,148,236,112, 57, 18,160,174,225, 4,213,112, 23,169, 69, 46,114,176,173, 7,122, 11, + 19, 10,137,124,250, 66, 29,252,217, 21, 63, 31,239,113,213,106, 74, 85, 13, 45,180, 3,218, 26,229, 54,187, 3,150, 16,145,253, +158, 34, 67,119, 78, 55, 98,159, 52,116, 12,113,102,180,208,231,190,127,251,166,174,217, 92, 30,188, 60,182, 81, 76,204,157, 66, +234, 52, 12, 45, 16, 10, 3, 35, 39, 65, 43,104,105,156,236, 8,128, 61,182, 55,150, 68,185,179, 90, 20, 89,255,223,227, 44,178, +101, 3, 32,157, 1,106, 27,193,240, 58,138, 94, 35,207,241,231, 24,233,202,248, 86, 45,128,204, 41,100, 84, 81,246,132,160, 4, +245,187, 87, 70,255,138,231,185,106,183,120,191, 80,110, 68, 64, 1, 38,171,144,168, 88,235,157,195, 35,224,243,241,204, 73,108, + 18,170, 48, 36,137, 67,209, 91,201, 63, 36,223, 63, 91, 13,174, 39, 15,209, 25,150,131,215,145, 27,115,138, 29,138, 60, 38,152, +212, 15,108, 28, 17,193, 62, 42, 23,179,133,141, 98,225, 30,160, 18, 2, 78,124,182,163,193, 38, 56,211,128, 69,173, 33,250,155, +195,217,210,164, 75,215, 9, 65,115, 64,145, 19, 12,168, 1, 55, 0, 67,177, 35,124,241,125, 43, 73,207, 64,133,233,111, 19, 32, + 24,247,108,196, 51,199,113,186,136,255,189, 90, 91,150, 19, 19, 20, 8,135, 59,101,128,138,172,231,198,222,134, 58,250, 1,223, +171, 86,200,202, 13,205,104,206, 59,231,250,103,161,163,136,245,101,164, 1, 68, 9,179,198,168, 54, 68, 1,141, 42, 42, 3, 1, + 2, 14, 13, 81, 22,137,101, 69,172, 67,173, 1,180, 21,158,227, 4,149,157,233, 66, 29, 84,135, 36, 58, 1, 41,113,211,220,147, + 57, 42, 5,250,247,135,227, 17,171, 82,208, 3,247,215, 54,111,204, 16,111, 1,213,176,200, 70,174, 76,181,196,141, 49,218,188, + 56, 24, 20, 67,226,145, 2, 71, 12, 99,218,237,105, 13,140,192,166, 7,158,120, 86,147, 32,237,187,156, 16,148,137,132,226,244, +244, 84, 14,118,247,100,182,246, 53,115,110,144,251, 31, 1,223,133, 6,164,251, 59,123, 26,136,191, 33,159,126,245, 72,239,190, + 81,190,130, 27,126,234, 56, 64,230,106,215, 95, 34,131,118,201,146,149,134,125, 71,220, 2, 75,130,185,240, 53,131, 27, 99,180, + 20,171, 8,173,156,226,156,254,222,222,246,129,148, 74, 27, 12,254, 67, 74,177, 8, 91,181,144,252,141,242, 8, 90, 13, 84,135, +182, 10,193,156,160, 0, 86,103,255,193,155,251,242,217,195, 99, 13,240, 49,205, 48, 99, 51, 46,134,131, 12,204, 38,193,193, 21, + 53,192,172,213,138,178, 85, 41, 50,184,192, 57, 67,101, 20, 84,203,160, 89, 69, 48,120,184,147,215,123, 62,226, 30,160, 10,200, +187, 28, 89, 85,119,187, 94, 38,142,134, 98, 94, 0,116,147, 58,117,201, 96,134,242,226,160,120, 5,173,119,156, 80,112,170,152, +139,233,136, 1,190, 28, 14, 81,141,203,147,234, 22, 32, 78, 4,219, 24,223, 99,112, 83, 44,137,227,213,230,247, 38,154,172,161, + 20,190, 90,175,220,180, 86, 66, 44, 9,248,228,191,253,238, 46, 81,237,224,180,199,125,193, 25,102, 21, 6,213, 2,142, 91,174, +141,147, 3,165,127,245, 61,155,234, 59, 46,213,119, 64,251,224,170, 51,226,185, 64,144,129,106, 44,170,138,176,113, 24, 79,196, +217, 97, 82,134,113,102, 4, 9, 43,151,153,179, 74,180,226,116, 14, 1,146,136,154, 57,123, 10,125,231,185,193,251, 43, 25,205, +222, 52, 75, 15,245, 7, 39,122,232,158,117,134,140, 0, 16, 89, 32, 74, 73,133, 54, 92, 79,109,115, 23, 37,161, 23, 2,186,216, +145, 94,252, 90,182, 33,111, 31, 52,104, 24,113,100,214,113,226,120,172, 45, 90, 69, 9,227,206, 97, 93,238,222,216,144,185,222, +138,231,231,125,150,233, 81,182, 24,168, 67,122,248,188,229, 52,119, 81, 55, 54, 13,113, 8, 61, 64, 96,165,221,234,203, 71,143, +123,114,251,205, 77,117, 36,233,215,217,123,164,155, 2,186,197,161, 94,172,173, 98, 74, 54, 74,105, 65, 37,124,174, 78, 15,186, +179,200, 90, 53,254,100,176, 65, 89, 72, 53,226,232,151, 95,244,209,159, 76,216, 51,132,228, 37,162,108,140,219, 37,122,136,247, + 54, 10,114, 84,203, 26,131,208,210,104, 86,145, 21,119,245, 61, 63,253,244, 82,246, 53, 51,185,208,117,217,170, 22, 56, 64, 15, +132, 34,178, 72, 0, 4,161, 19,156, 97,245, 66,164,130, 77, 4,237,106, 12, 21, 41,203,252, 0,168,192, 18,190,123,167,194, 64, +166, 61,176, 49,167,139,230, 72, 78, 34, 27,203, 32,208, 37, 48,176, 80,226,250,225,158,111,104, 83,184, 27,240,219,131,218,148, +170,116,112,218,107,176,229, 45,229,187,119,203,242,155,111, 87, 40,253, 26,163,116, 12,231,125,205,196,134,125, 88,187,222, 42, + 62, 11, 37,195,217,154,151, 28,120, 8,240,244, 67,164,224,125,125,254, 15, 31,117,229, 92,179,233, 88,159,119, 18,131,131, 96, +142, 70,133,140, 22,110,102, 21,223,167,255, 61,152,173,168,236,134, 10,207,237,173, 18,199, 6,163,154, 25,112, 4, 60,169,112, +196,113,191, 92, 54, 33,197, 35, 64, 84,155,171,172, 60, 63,155, 50, 48, 65,145,224,225,213, 72, 30, 95,140,228,159,127,112, 72, +240,224, 74,247, 31,250,196, 85, 13, 56,110,215, 50, 82, 87, 99,221,153,205,228,203,179,151,178,208,231,134,250,217,210, 73,152, +206,214, 70,143,137,106, 3, 40, 20, 81,250, 6,112,113, 60, 51,240,215,122,109,253,225,146,254, 62, 22,143,200, 85,189, 96,135, + 91, 27, 68,177,195, 49,161,164,206,114,165, 26, 91,160,205, 1, 76, 66,255, 15, 78, 50,159,113,179,177,160,100,165,147, 51,114, + 38, 48, 67,197,145,149, 3,141,241,202,103,208, 68,192,102, 16, 58,153,198,149,181, 63, 60, 42,199,211,168,176,141, 21, 27,147, + 27,254,141,242, 57, 8, 95, 64, 54, 2, 89, 87, 18,151,128,230,215,210, 99, 67, 74,235,249,203,103,243, 44,107, 47,255, 9, 96, +206,181,105,237, 76,160,191,158, 49,148,121,158,136,121,155, 53,103,102, 77,144,225,202,145,219,136,203,188,133,107,130, 74, 29, +241, 22, 43, 19, 43, 2,189, 50, 42, 16,232,229, 91, 0, 83,224,103, 98, 29, 25, 56, 6, 41, 35,203, 0,147,160,103,189,103, 96, +246,224,204,171, 69,148,106,243,186, 39, 99,146, 57, 97,125, 80, 1,193,158, 66,189, 10,115,235, 25,170,185,133, 92,167,129, 58, + 42,148,142,192, 39,143,158,232,108, 97, 36, 57,112, 30, 84,123,195,172,181,126,207,100, 2, 16,105, 72, 76,138,199,217,248,188, +126, 22,102,164,179, 54, 97, 80,202,209,129,143,244,185, 55,170, 69, 6,103,159, 63,121, 73,142,252,251,247, 14,212,112,135, 36, + 68, 90,172, 60, 58,106,148,213, 57, 11, 29, 67,100,102,205,115, 9,212,249,108,101,237, 51,156,167, 49,128,146, 40, 25, 79, 52, + 84,117,148,166,126,169,170,159,189,210,179,111,224,167, 44,180,182,213,137,225,110, 35,147,102, 53, 83,215, 99, 60, 2, 0,119, +170, 65, 3,104, 72,253,215,116,194,158,155, 58,120, 45, 14,100, 53, 23, 87,121,177, 74, 8,206, 32,144,240,139, 9,181,244,216, + 22, 88,195,117, 70,115, 58,135, 65,191, 71, 36,252, 70, 13, 14, 44,171,217,243,149,209, 94,119,186, 44,223,223,218,187, 41,111, +106,160,122,222,236,208,145,160,101,133,115, 0, 39,143,253, 0, 19, 33, 90, 53, 8, 68, 72,153,235, 27,209, 18, 91,198,161,157, +109, 27,253,142, 88,117, 28,143,134,124,126, 56, 23,159, 92, 19,186,254,229,154,212,107, 31,176,229, 1, 48,103, 64, 6, 79,103, +227,245, 44, 64, 57,240,104,119,155,153, 46,200, 92,114,104,181,122,168, 30,134,250,221, 35, 86, 39,112, 55, 96,138, 86,228, 50, + 48,146, 45,188,251,112, 22, 75,107,208,226,125, 64,197, 6,107, 11, 31,128,160, 23, 65, 78,179,219, 53,125, 3,117, 96, 83,170, +253,101, 94,227, 68, 16, 60,100,210, 70,128,132, 51,219, 25, 76,217,206,218, 84,103, 79,178, 47,216,214, 56, 32, 14,104,237, 48, + 1,104, 97,224, 92,227,187,200,213, 64,158,128, 21, 71, 32,241,231,219,154, 29, 3,179,131,150, 16,137,155, 32,156,131,128, 21, + 24, 1, 40,248,105,246,222,238,245,164,174,231, 14, 65,217,171,203,129,241,232,175,108,138, 44,142, 12, 25,143, 96, 28,109, 0, +187, 47, 86, 3, 75, 97,108,155, 21,110, 79,114,106,107, 14,119, 54,244,227, 91, 4,135,226,120, 34,145,242,202, 37,153,140, 80, + 17, 44,112, 44,148, 60, 12,160, 36, 38, 7,131,188,246,177,216, 72,180,211,195,103,207,206,229,230,173, 93, 26, 11,148,237,138, + 26,181,108,100, 35, 70,156,121, 93,156,134, 30,250, 77,141,102, 62,125,116, 73,133,178, 76, 96,241, 28, 50, 48,244, 62, 34, 55, + 83, 91, 84,131, 67,231,163,159,253, 55,159, 94,232,229,138,228,253,219, 13, 87,150, 52,169,199,235, 17,159, 84, 24,184,126, 7, + 74, 45,177,188,115,163,202,108,255, 85,115, 32, 39,205,177, 0,168, 58, 26, 45, 76,109, 9, 99,109,122,137, 59,122,169, 81, 90, +239,106,148, 95, 84,135,179,238, 14,101,182, 76,203,104,184,144, 13,125, 19,136,210, 80,122, 16,209,177,102,191,121,221, 60,148, +216, 66,140, 97, 76,150, 36, 37, 0, 0,134,209,190,158,145, 95, 60,106,115,206, 30,224, 42, 68, 85,119,118, 75,154, 65,150,165, + 94,202,208,105,129, 45, 11,128, 62, 40,100, 69, 81,207, 46,165,216,252,242,123, 7, 5, 57,172, 4,242,236,233,153,116,226, 80, +190,190,173,139, 13,164,157,151,161,243,101,230,204,190,163, 69,132,130,241, 30, 53,106, 24,153,248,249,151, 80,237, 25,105,102, + 49,230,225,255, 88,127, 61,154, 26,189, 45, 42, 11,181, 74,158,242,142,160,196,220, 44,101,137,168,223,221, 46,201,195,167, 29, +249,159,254,228, 51, 94, 6,182,229, 18,187, 64,149,180, 73, 25,194, 17, 39, 78, 63, 29, 96, 59,144, 28,160,108,131,178,127,188, + 52, 3,198, 32,201,183,192,204,179,241, 1,161,183, 79, 99,254, 59, 81,195,185, 54,230, 46, 16, 74, 0,252, 66,227,183,150,191, +251,226,156, 64,197,110,111, 66,212,233, 42,178, 54, 11, 21,242,244,179,182, 43, 41,249,205,187, 53, 57,208,103,205,229,245,247, +212,121,215, 3, 35, 68, 33,127,129, 23,154, 48, 59, 64, 70,224,157, 7, 51,144, 26,207,230,149,174,107,197, 42, 8, 0,215, 64, + 62,118,229,192,146, 24, 49,153,106,166,132,249,121,148,250, 30,159,159, 74, 91,159, 47,201, 84,212,120, 78,104,252, 81,178,203, +133, 86,174,243,215,160,188, 44,234, 5,108,200,177,102, 46,192, 81,144,209,141,122,228,158,126, 78,149, 17, 63,163,238, 12,232, +140, 55,245,140,170,113,211,136, 31,125, 42,155,107, 13,153,117,176,247,237,136,125, 48,195,140,247,160,254,120,108,227,139,200, + 26,135,116,232,145,107, 99,120,172, 0, 92, 27, 22, 2,222, 32, 0,195, 94,100, 64,132,240,100, 62,163, 17,186,158,245,230,119, +173,141,151, 30, 61,109,244, 80,225, 68, 22,139,197,235, 12,253, 58,131,134, 3, 69, 9, 30, 70,149,200, 88,150,111, 67,167,196, + 38, 36, 19, 73,156,248, 12, 28,175,184, 50,252,106,109, 65,202,250,218,131, 59,238,118,246,206, 99,227,180,199, 26, 53, 81,110, + 6,184, 43,147,162, 81, 50,164,255, 53,193,142,129,195,174,217,236,112,135, 64,249,153,139, 82,166, 36, 21, 67,124,208,132,108, + 72,187, 12,177, 20,125, 4,156,253, 41, 18,133,196, 90, 66,195,200,128, 89, 32,168, 42,229,209,159,196, 25,202, 74,175,103, 40, +123,180, 10,200,205, 14, 49, 38,205,214, 49,191, 12, 20,181, 5, 46,107,142,219, 22, 75, 69,169,151,245,126,106,160, 56, 70,169, + 62,103, 10,104,232,167,162, 7,140, 76, 7,142, 13,198, 20, 72,108,217, 4, 39,121, 79,174, 52,243,106,108,237,115,156,178,167, +191, 70,240,142, 25,112,136,170, 92,131,227,192,149, 63, 27,155,246, 0, 42, 40,112, 36, 41,188,147, 79,201, 57,102, 69, 16, 16, +210,215, 34, 55, 6,170, 95, 97,206,227,116, 13, 70,225, 24, 52, 1,192,137, 51,227,216,160, 97, 79, 67,252, 58,254,245,250,227, +172,176,236,140, 96, 43,176, 41, 32, 10, 28,133,215, 10,127, 38,237, 11, 12, 5,106,112, 64,191, 3, 88,136,210,106, 49,159,229, +148, 0,158, 24,198,190, 68,140, 69,219,170,121,186,184,120,190,103,207,159,200,155,183, 14,229,131,247, 62,144,226,211, 7,180, + 49, 43,167,251, 80,133,216, 11,170, 55, 18,144,247,160,168,182, 15,225, 61,222,133, 85,183,192,120, 15,144,217, 35,176, 42, 21, +210, 4,118, 33, 57,195,249, 0,219, 38, 90, 85, 32, 90, 97, 27,112,237,203,171,171,161,156,159, 62,116, 12,242, 30,251,239, 49, +177, 43, 33,239,109,185, 90,102,182,143,190,244, 69,111, 46, 71, 55,111,200,169, 6, 27, 9, 94,216,179, 41, 26, 60, 68, 99,163, +206,170,203, 97,189,192,207,128, 12,247,213,220,232, 91, 88,233,208, 37,171,171, 77,204, 23, 43,114,213,237,179,106, 68, 27,132, + 89,251, 48,164,252, 53, 90, 63,192, 59, 0, 20,187,165,159,135,159,219,213,123, 94,202, 5,188,111,168, 68,111, 84, 51,114,229, +129, 28, 9,114,182, 25,167,190,103,129,113,187, 55,149,138,218,220, 40,241,152,120,164, 83, 83,181,171, 89,142,151, 53, 52,232, + 30, 44, 83,100,187,131,200, 14, 40,177,161,248, 25, 79,117,223,245,179,219,221, 46,207,110, 53,103,163,212, 69,253,236, 17,250, +223,176, 99, 4,240,121,108,183,160,221, 92, 76,219,184, 54,198,246,200,226, 56,153,202,102,163,196, 30, 59,110,244,193, 78, 67, +147,169,142,244,251,166,130,151,202,172,120,102,215,235, 42,103,231, 81,120,196, 94,165,201,235, 98, 20,207, 72, 84, 2,177,113, +202,240,219,183, 50,242, 98, 52,224, 1,199,124,226, 54, 80,133,106,218,112, 56, 89, 46,212,127,191,127,160,153,207,122, 91,254, + 28, 52,156,177,113,168,147, 75, 93, 55,171,168, 78,240,238,225,182,209,165, 58,131,134,236,232,162,191,146,114,123, 33,239, 28, +148,169,196,196, 75,159, 9, 89, 38, 38,112, 5, 78, 6,217,177,110, 78,196,104, 62, 37,227,110, 79,254,236,103,167, 52, 66, 41, +207,162,219, 0, 7, 82, 15, 26,184,195,145, 93,223,222,169,200,126, 35,146,230,197, 64,166,197,156,188,106,143,229,121,210,227, +188, 43,110,232, 69,103, 42, 39,154,249, 35, 3, 71,111, 28,165,104,160,202,209,247, 54,218, 77,115,246, 95,191,189, 41,239,236, +230,100,184, 76,228, 69,123, 42,111,239, 20,229,168,154,230,216,222,217, 88, 15, 84, 47, 16, 13, 43,248, 25,185,140,144, 96, 39, + 38,232,205,151,155, 85,148,248,242,114,118, 57,148, 66,108, 78, 18,250,233,204,131,116,129,241, 44,109,136,140,164, 50, 44,151, +195,193,231,243, 41,121,120, 57,150,229,241, 90, 46,218, 19,182, 47,192, 25,253,252,124,206,114,251,127,253,111,222,145,239,188, +179, 73, 14,117, 24, 71, 0,123,172, 36, 38,204,194, 43,234,180,255,207, 31, 61,144, 46,102,116,211, 57,130,179,212,210,240,194, + 38,174,159, 68, 68, 62, 74,153, 24,197, 27, 44, 36,201,249, 92, 63,168, 81, 37,112, 18,240,254,145,165,106,200,200, 25,224,144, +130, 72,141,139,102,235,195,169,101, 31,195, 69, 36,207, 53,226,237,234,154, 53,234, 57,217,221, 44,106,208, 83,148,225, 96, 36, + 25,223, 42,137, 20,233, 64,207, 28,180,154,250,204,141,172,207,131, 30,106, 36, 30, 99,174,146,242,161,115,151,197, 90,216,201, +226, 38,184, 9,244,144,159,158,119,229, 92,247,176,179,157, 99,139, 34,163,217,220, 61,221, 3, 0,105,154,250,189, 64,144,222, +110,228, 36, 10,115,242, 31,126,246, 64, 62,124,252, 84,254,224,183,191, 39,125,125,206,157, 58,156,224,136,109,130,203, 78,159, +104, 80, 24, 30,176, 27, 94,232,229, 90, 57, 18, 7,180, 75, 88,246, 86, 35, 83,211,104,183,144, 91,169,227, 92,200, 86,173, 46, + 39,173, 22, 1, 46, 91,181, 10,179, 22, 82,154,138, 33,207, 77, 15, 60,122,221,183,158, 46, 44, 3, 3,154, 23,159,139, 57,244, +107, 89,223,120, 29,189, 6, 33,226,223, 43,114, 3, 24,253, 42,223, 25,253,193,196,230,219,209, 6, 8, 72,247, 27, 17, 13,206, +177, 27,100, 30,234,104, 18,202,102, 70, 12, 58,178,169, 52,141, 62,126, 29,234,157, 65,191,140,207,137, 25,217,165,205, 41,249, +158,205,235,218,232,154,105,134, 35, 51,225, 12, 61,152,228,156,140,104,114, 77,202,148, 68,110,124,200,119, 10, 86, 22,196, 32, + 67, 1, 11,220,118,221, 38, 38,108, 92,212,103, 70,180,114,216,129, 48,180,242, 48,148, 11,151, 36,159, 49,214, 64,156, 75, 19, +112,177, 22,220, 64, 3,249, 90,209, 99,112,194,121, 89, 63,224,108, 49,230,109,171,144, 38, 69,119, 19,217,127, 38, 54, 14,109, +226,114,210,226, 4,222,173, 79,184, 54,178,145,156,102,127, 83, 61,199, 25,178,163, 4,156, 2, 0,141,241,209,126,133, 88, 28, +148, 27,163, 56,195,241, 38,140, 79,166,244, 30,238,109, 86,104, 12,163,148,137, 43,161,253,130, 32,241, 4, 76,130,165, 88,142, +246,170,250, 28,161,126,206, 4,108, 19,252, 30, 47, 54,182, 51, 26,114,117,114,148, 5,142,141,205, 18, 37, 95,216, 44, 6,235, + 80,154,116,180,191,104,187, 76,198,115,142,184,142,168,218,146, 16,232, 57, 30,142,157,242,156, 37, 50, 21,181,141, 43,104, 30, + 68,222,107, 78,127, 82,228, 46, 76,124, 7, 14, 8,235,189, 32,162,126, 65,204, 7,241, 58,145,129,107, 81,153, 25, 99,190, 28, +163,137,190,169,172, 1,219,179,138,197,137,248,172,100,216,107, 74,181,182, 69, 6, 57, 56,155, 87,103, 77,249,234,209, 99,121, +235,141,187,242,171, 47, 30,202,175, 30, 60,118, 19, 35, 78, 66,217, 51, 18, 28, 4, 61,158, 87, 52,230, 60,119, 38, 35, 10, 67, + 90, 43,204,115,186, 16, 70, 95, 44,220, 55, 11,124, 83,154, 36, 68, 12, 44, 75,165,146,236,239,223, 98, 5,192,115,194, 71,171, +165,205,144,227, 92, 98,220,113,119,179,206,214,219,116, 58,148, 77,189,131,115, 93,179,219, 55, 15,200,136, 71, 22, 59,140,195, + 65,131, 30,119, 78,247,225, 37,112, 69, 8, 12,208,114,228,247,175, 88, 93,193, 36, 7,138, 40, 0,159, 34,176, 68,155, 11, 76, +143,176,125, 8,232,208,202, 1, 47, 3,238, 57,219, 36,108,215,235,239, 99, 98,196,143, 88,177, 80,179,230, 42, 69, 41, 10,126, +129,228,229, 12,228, 78, 32, 71, 11, 13, 97,158, 87,103,252,224,229, 21, 3, 89,140, 24, 99,252, 44,209,247,185,117,176, 43,131, +110,194, 42,167, 85, 91,124, 91, 27,223,118,118, 65,145,163,149,236, 53,202, 82, 41,231,101, 49,141, 89, 9,129,195,196,179,226, +158,173, 92, 48,159,224, 76,233, 33, 41,107,208,212,166, 2, 97, 76,170, 36, 48,111,238,214, 51,154,184,174,228,254,221,125,253, +123, 23,242,226, 85,155,123,196,115, 97, 69,130,215,147, 93, 25,205,126,231, 56, 15, 43,211, 26, 1,109,110,136, 73,171,111,220, +217, 22,239,114, 73, 93,219, 18,184,117,211, 66,121, 85,139,220, 2,114,110, 83,165, 77, 95, 46,149, 24,149, 37,168, 46,175, 57, +130, 1,112, 2,173, 30,184,204, 81, 18,129,225, 3,172, 31,209, 67,111,172, 81, 57,198, 67,145,167,235, 70, 4,145,193,244, 67, +117, 98, 21,141,178,193, 93, 62, 83, 99,142,254, 27,178,241,186,102,106,136,132,113,106,115, 40,127,114, 4,199, 55, 89,204,133, + 47,191,122,102, 47,216, 81, 39,253,236,106,234,120,186, 87,100, 2,218,174,230,100,167,150, 51,222,118,253, 51,108, 16,122, 35, + 27,165,130,220,122,127, 91,254,246,243,166,252,229,151,109,253, 92,161, 58,218,118, 37, 39, 55, 55, 52, 3,190, 28,145,196, 0, +243,142,159, 55, 1,250,153,201,101,127, 70,212,100,115,234,201,103,207, 71,242,254,126, 94,126,241,114,202, 82, 58,140, 47, 8, + 20, 48,211,216,138, 80,170, 14,229,103,175,134,166,112,135, 50,123, 16,208,240,145, 14, 20, 82,153,106, 40,160,100, 87,175, 21, +229,205,205,156,220,218,205,202,255,254, 23, 51,121,121, 53,165, 54, 53, 56,200, 49,222,135,131, 11, 7,186,192, 65, 7,240, 76, +220,236, 22,130, 31, 93,143,173, 74, 65,126,235,253, 67,249,191,126,252,144,146,177,216, 7,160,206,217,159,129, 83, 73,252,215, +217,192,105,111, 41,127,254, 96, 70,192, 29,122,225,133,236, 76, 13,140,111,160, 29,253,200,114, 10,147, 25, 78,253, 13,152,138, +148,141,107,224, 80,128, 36, 33,196,236,180, 26,232,163,221,178, 6, 61, 34, 71,219,101,205,136, 99,233,165, 9, 86, 32,208,144, +213, 23,189,112, 25, 10,138,232, 62,104,100, 11, 20,126, 5, 85,148,120, 38,171, 33,196, 70, 82,220,191,238,213,149, 94, 46,141, + 56, 53,210,126,245,114, 65,158,247,166, 30, 92,240, 34,119, 70, 21,153, 1, 97,155, 89,202,225,110,157,231, 12,241, 70, 67, 35, +230, 79,159,190,146,255,227, 39, 95,201, 89,179,203, 11,126,218,236,147,156, 39,165,103,198, 67,143, 91, 47,209,112, 52, 38,106, + 29, 0,163,227,243,115,147,173, 5,221,175, 99,209,131, 81,192, 89, 64, 36, 11, 50, 25, 80,189,126,249,252, 37,199,182, 0, 0, + 76,115, 46,124,205,159, 67, 32, 2,222, 5, 2, 43, 93,153,252, 26,228,150, 39,240,108,206,242, 28, 5, 88,120, 71, 2, 61, 95, +101,150, 51,177, 87,232,215,178,151,141, 80, 26, 21, 18,156,219,200, 62, 3,103, 2,206, 26,119, 4,119, 29, 66, 43, 54, 6, 55, +225,153, 90,187, 64, 34, 69, 1, 24,235,221, 81,177, 10, 4, 42,227,133, 83,111, 91,154, 84, 46,176, 35, 65,240,107, 1, 18,142, + 37,197, 12, 16, 80,190,135, 83, 69,166, 9,106,219, 90,177,104,179,224, 80, 19, 3,224, 71,140,108,167,166,207,141, 7,155, 18, +144,183,226,136, 24,122,167,232, 89, 26, 82,222,112, 52, 40,203,194,192, 17, 1, 31,173,152,117, 21,179, 33,239, 63,202,223, 11, + 87, 66,237, 3,147,161, 63,251,213,120,102,189,114, 24,245,162,102, 59,145,209, 25,175,146,136, 32,172, 21, 20,181,214,118,230, + 73,179,155,182,108,209,119,202,132, 0, 50,173,245,115,231,228,225, 79,140,212, 7,229,127,117,240,101,205,184,218,253,185,227, +112,247,184,206,227,233,146,136,121,200, 51, 99, 47,129,215, 65,195,220, 64,157, 30, 91, 37,168,146, 33, 16, 27,133, 69, 41, 85, +106,210,210,228, 96, 14, 16, 83, 58,199, 36,197,198,247,212, 17,165, 86,122, 78,243, 20,226, 32,240, 75,207, 26,218, 95, 49,171, + 51,192,253,232,103,162, 69, 39,226, 64,111,190, 37, 56,105,219,243,241,114,206, 86, 1,214, 31,116,217, 24,109, 77,163, 29,129, +192,123,101, 44,151,104,101,195, 54, 96, 18, 3, 12,132, 12,202, 29, 70,131, 66, 70, 4,101,166,249,103,216,219, 12,122,171, 24, +249,212,189, 57,189,234,202,104, 48,225, 30,226, 28,110,248, 85,169,213, 26,236,229, 66,130,212,143, 23,172, 92, 60,215,108, 29, +192,202,163,195,155,242,242,244, 21,233, 83, 33, 82,130, 51, 66, 54, 73,189,239,208,122,120,226,206, 30, 81,228,200, 71, 60, 83, + 63,148,196, 80,226, 8, 4, 0,124, 67,124, 10, 59,134,246, 34,206, 56,117, 37,192,158,153,201,115, 34,101,187,222,208,204,184, +170,239,150,166,132,114, 46,103,227,163, 24, 89,198,120, 52,132,149,230,139, 9, 63,179,219,214, 96,253,198,129,188,127,255, 29, +249,223,254,159, 63,166,188,108, 5, 66, 69,122,166, 80,161, 33,157, 46,108, 60,193,101, 66, 31,194,241,231,245,148,147, 21,224, + 84,184, 38,105, 9, 2, 27,247, 34, 48, 89,207, 51,206, 1,167,113,116,239,207, 59, 77, 42,225,197,250,247, 52, 51,208,115, 51, +163,143,139,163,129, 84,138, 41,151,213, 38,178,189, 89, 96, 59, 21,127,142,115, 14,105, 97,140,188,129,131,226,159,125,227, 77, +249,252,233, 41, 71,222, 30,159, 52, 53,224,171, 48,112,201,208, 73, 25,206,106, 50,157,189,190,175,184,159,231,154,100,246,198, +107,217, 85, 95,116,176,183,197,170, 5,146, 6,115,198,198,124, 23,145,241, 49, 77, 81,151, 90,165,200,128,224,178, 59,150,247, +239,212, 56, 78,187,187,219,144,151,154,152,238,168,127,218, 80, 59, 56, 80, 67,127,124,182,230, 30, 33,249, 64,133,210,227,184, +169,207,179, 52,157,172,141, 44, 9, 65, 39, 90,104,187,239, 28,201,243,241,169, 46,208,146,145, 69,115, 6, 9, 59, 95, 74, 97, + 36, 85,100, 95,232,103,205,151, 4, 14,196,142, 28,198, 75,124, 87,102,212,200,169, 59,209,172,105,198,168, 60,185,102, 44,195, + 12,164, 94,150,131, 70, 94,254,253,183,203,106,160, 81, 40, 72, 89, 89, 16,148,126,208, 19, 14, 18, 42,164,129,122, 20,253,129, +201, 42, 98,148,152, 71, 25,121,237,187,160, 1, 57,254,154,189,241,233, 52,145,159, 61,235,171, 83, 44,203,238, 78, 77,238, 30, +110,144, 35,247,227,103, 29,249,111,255,240,109,217,212,141,242,170, 41, 89,192,249, 58, 42,205,172, 26, 1, 31,253, 94, 61,144, +191,122,218, 97,153,176, 24, 90,239,231,231,207, 7,228, 22, 7, 55, 49,230, 17,177,169,136,202,193,213,113,166,209, 34,144,231, +208, 93,111,163,228, 63,240, 89,198, 98, 4,238,155, 6,248,151, 23,112,154, 41,102,185,216, 36, 48,213,101,160,110,149,179,160, + 38, 15, 41, 79,176,107,165,205, 65,252,226,193, 21, 75,238,232,223,125,117, 60,164, 30,122,118, 98,165, 71,204, 96,254,244,139, + 43,249,141,119, 54, 52,154, 77, 91,153,220,101,137, 72,234,230,154,141,204,213,240,254,240,107,135,242,227, 79, 79, 57,183, 15, +227,129,192,235, 26,152, 5, 7, 68,154, 69, 53, 70,179, 32, 43,207, 58,214,147,197, 97, 58,191,184,146,251,187, 25,217,216,220, +150,147,238,138,229,121, 36, 64, 37,125,214,127,246, 1, 56,172, 53,216,194, 92,165,183,178, 64, 77, 23,188,176,145,147,227,129, + 6, 47,167, 99,102,188,185,192,104, 59, 65, 61,139, 50, 54, 48, 14,148, 76, 68, 38,166, 79,112, 12,212,188,222,254,195, 78, 73, +110,236,131,218, 50,146, 22,212,249,244,185,193, 46,184,183,149,211,139, 71,244,163, 68, 96,244, 74,217, 72, 18,160, 91,199,221, +153, 58,234, 44, 25,167,142, 91, 99,206,128,158,235,159,253,223, 63,254, 92,131,167,149,188,121,116,160, 78,176, 68, 7, 48, 79, +202, 26,225,230,101,208,239,200,243,211, 33,199,204,144,113,183, 53, 99, 97,121,152,188,221,145,101,155,212, 44, 95,203,102,165, + 42, 91,141, 6, 13,157,215,237,168, 51, 47, 17,112, 6,100,238, 84, 13, 49, 68,101, 6,154, 17,193,193,153, 74,155, 56, 48, 10, + 64,115, 86,222, 67, 89, 20,151, 47, 74,140, 77, 14,180,162,104, 57,161,127, 15,227, 11,112, 27, 28, 71,206,113,139, 79, 41,211, +104,178,191, 75,167, 68,133,123, 1,178, 30, 56,116,252,204,112, 58, 49,196,124,108,189,119,106, 29, 92,207,174,187,241,155,208, + 55, 77,110, 0,102, 76,186,213, 12,136, 41,217, 25, 95,130, 24, 53, 62,207, 12,202,244, 4,233,233,231,111,234,247, 80,126,114, + 97,202, 97,212,156,158, 79,121, 78, 16, 76,192, 1,238,171, 49,254,222, 27,106, 3,174,154,242,224,228,202,196, 40, 2,143,189, +242,208, 55,206,137,213,210, 20,228,214, 68,243,123,164,119,134,161, 5,128, 13,253,222,217,108, 65,135,239,179,140,190,210,253, +201, 88,223, 15, 85,133,196,231,184, 29,149, 8,171,150,149,195, 33, 33,120,237,245,250,106,228, 70,226, 72, 41,232, 4,166,203, +132, 66, 62, 1, 74,163,177,174,171, 58,164,128, 99,135,234, 52,103,106,176,210, 30,197,122,240,189, 5, 13, 82,144, 65,130,107, +158,204,137,234, 68, 15,183, 27,108,171,224, 86,160,189, 7,231,115,124,118,165, 6,190, 74,195, 89, 92,105,160,163,246,224, 92, +191, 27,194, 60, 20,140, 66, 43, 49,155, 98,249, 22,227, 98,227,225, 72, 50,234,140, 60, 76, 98,128, 17, 30,153,163, 62,203,124, +222,103,123,102,238,217,249, 0, 98,136,193, 55,199,213,144,121,251,166,203, 64,156,129, 16,240,228,167,203,178,242,134, 98,243, + 2,194,125,192,222, 32,112,102, 27, 38,116,109, 27,176, 8,102, 50,238, 12,196,220,111, 60, 75, 33, 87,226, 92, 55,208,223,224, +115,192,189, 65,233, 26,251,222,211,223,107,247,186,178,183,179, 79, 22, 79,128,130,129,239,129,245,120,250,236,137,108, 54, 54, +228,251, 31,220,151,209,176, 75, 9, 83,102,232,249,148,171,234, 36, 2, 54, 81, 32,211, 65, 10,116,221, 78, 11, 83,198, 85,193, +170, 27, 2,208,172, 1,109,171,197, 28,167,151,150,145, 77, 82,160, 36,142,201,147,122,163,166,182,167,194, 94,245,108,218, 33, + 56, 56, 59, 75,113, 42,103,190, 90, 48,112,237, 15,103, 4,163,213, 53,160,106,118, 58,108, 19,188,121, 36,164, 83, 21,194,122, +244,103,212,239, 64, 64, 12,237,162, 70, 57,203,145,185,157,106, 40,239,223,220,151,203,161, 6, 73,139,152, 65, 39,236, 96, 49, +107, 56,167,229,218,248, 29,192,139, 64,143, 1, 93, 8,112, 53,128, 1, 82,127, 31,193,126, 52,235,114,210, 0, 9,217,209,118, + 81,142, 47,187,114,222, 50, 90,112,208,197,162,231, 95,209,100,242, 18,206, 88,207, 81, 38,181,100, 16, 8,103,249,242,188, 67, +159,196,233, 15, 4,208, 64,171, 67,208, 5, 26,237,122,206, 75, 26,140, 16,112,152, 88,101,144,140,139,222, 82,253,166, 39, 79, +213,198,103,243, 89, 77, 20,102,188, 83,160, 25,111,246, 38,132, 21, 14,103,134,190, 7,230, 68,136,207, 89,177,130,240,244,248, + 88,126,247,123,111,113,162,226, 74,125,197,163, 23, 45, 13,218, 42,178,240,198,108,153,173, 29,153, 16, 2,122, 88, 93,128,248, +172,226,106,224, 63, 84,185,112,103,195, 16,169,107,108,228, 7, 0, 45, 33, 3,233, 47,192, 20, 20,242,225, 96,252, 49, 90, 2, + 34, 13,223,209,164,174, 92, 89, 15,133,166,208, 51,167, 98,180,202,110,102, 60,177,242, 17, 74,141, 80,221,194, 67, 68,235,216, +233, 44, 27,241,202,216,247, 13,213,136,249,201,149, 71,138, 84,104,143,103, 32,238,154, 18, 2,175, 56,211,137, 93, 7, 18, 89, + 15,236,191,255,157,187,242,222,253, 77,241,212,129,175,212,217,188, 56,109,203, 71,143,141,123,119,210,215,195, 20, 68,154,205, + 13,153, 45,182, 53,250,234,158,173,228,209,201,144, 34, 48,159,104, 64,176, 36,194, 58,162, 38, 60, 20,116,126,245, 88,141,139, +126, 7,144,245,147,217,218,141, 4,217,164,220,173,189,130,188,115,179,194,217,236,171, 97, 4,177, 41,117, 54, 1, 91, 3, 64, +244,254,240,251,135,178,198,184, 7, 64, 63,122,145, 79, 94,244, 52,178, 42,200,211,115, 53,162,203,169,124,239,187,121, 73, 66, +172, 75, 68,145,135,145, 94, 64, 40,158,109,233,119,255,243,111, 31,202, 23, 47,123,242,226,114,202, 44,181,160,139,124,222, 26, +200, 95,252,195,177,252, 23,223,185,193, 62, 37,122, 95,152,133,159,171,129, 71,208,209, 28, 78,104, 4,182, 42,161,254,189, 1, +157, 11, 28, 70,130,108,105,109, 37,245, 5, 81,154,101,142, 23,205, 22, 83,163, 60, 5,216, 66, 47, 81, 42, 72,201,173,122, 34, + 95,158,205,101,230, 91, 48,144,215,253,253,171,143, 94,200,119,222,216,148,157, 90,150, 7, 31,170,104,168,141, 44, 23, 30,199, +242,238, 28,132,108, 19,128, 28,168,167,193,199, 79,126,121,202,231, 0, 70,129, 61,102,253, 14, 4, 52, 95, 63, 44,200, 13,117, +218, 91, 37, 53,117,171,177,204, 70, 0, 14,234, 1,212,131,157,165,209,211, 95,107, 84,139,222, 32,140,109,162,251, 0,154,216, + 25,100, 58, 75, 25, 78, 67,192, 48,222,127,243,150,252,229, 71,159,201,147,135, 15,228, 7,111,191, 45,159,158,234,218, 45, 94, +201, 85, 95,215, 79,141, 20,140, 67, 70, 86, 4,151,221,216,222,214,189, 3, 42,214, 72,133, 80,134, 2, 11, 23, 46, 31,179, 95, + 53, 0, 0,189,229,242, 38,171, 26,114,110,116, 87,202, 32,175,168,213,105,200,142,159, 92,154,176, 8, 29,171, 83,142, 74,155, +209,128,145, 71, 96,128, 44, 21, 35,114, 38,236, 97,115,250, 32,164, 65,230,141,225,146,122,181, 98,253,206,209,200,178,113,128, + 77,139, 17, 63,139, 37,201,200,241,181,235, 63,232,159, 3,255, 0, 71, 71,142, 67,142, 66,153, 20,101,224, 20,211, 88, 65, 9, +172,100, 59,113,148,178, 0,146, 69,174, 37, 16,248,215, 90,216, 30, 13,201,181, 83, 12, 66,155, 71, 7,221,108,189, 92,102, 31, + 31,243,231, 36,200,224,168,160,245, 70,141, 41,216,170, 2,125, 61,251, 47,154, 61, 57,220,216,228,216,234, 89,111,164,239, 49, +209,224, 58, 77, 36,250, 42,178, 17,156,245,116, 73,135, 13, 7,135, 62, 30, 0, 73,224,103, 71,208, 63, 5,119, 66,224,179, 26, +129, 18,234, 28,129,222, 74,127,102, 60,118,163, 70,194, 12, 17,165,198, 14,196, 44,116,143, 64,187,218,105, 93, 80,161,203,116, +229, 77, 84, 6,217,112,127,145, 16,219, 3,123,130,128,105,171, 94,144,179,102,155,129, 3, 4,206,224,216,225, 92, 16, 64, 93, + 99, 19,166, 4,158, 5,228,168,159,118,135, 44, 81, 39, 65,138, 42, 93,104, 33,156, 53,175,168, 99, 29,120,154, 69,109,111,233, + 63,219,242,248,233, 75,105,119,122,164, 70,166,158,130,205,122,178, 42, 4, 83,206,249,254,216,145, 99,121, 8, 40,192, 89, 44, + 68,124, 99,140, 47,246,141, 83,222, 90, 37, 0,156, 26,142, 34,142,140,162,153, 21, 5,204,234,187, 49, 64, 86, 14, 18,195, 59, + 0,233, 77, 33, 16, 16,126, 97,140, 11,207,192,185,235,136,147, 16, 8,252,224,176,151, 41, 0, 75,115, 82,208,224,164, 94,169, + 27,210,155,170, 96,198,184, 9,198, 67, 4,155, 41,189,247,192,110,224,222,215, 27,219, 18, 70, 96,205, 75, 73,109,235,150, 28, +159, 95,169,125,185, 98,192, 0,242, 85,216, 98,238,137,126,192, 86,173, 36, 63, 0, 89, 15,202,183,100, 79, 19, 38, 25,184, 43, +121,170, 41, 10, 29, 25,233,100,197, 48, 4,164, 6,231, 4,192, 90,206,207, 94,240,247,189, 84, 69,158,191,124,174,239, 54,215, +224,189, 98,189,223,165,141, 17,130, 22,188,176,183, 65, 52, 56,152, 72,113, 71, 48,210,250,205,119,223,148, 14,164, 78,211, 41, +150,240,241, 76,125,253,217, 11, 13,242, 1,242,156,169, 67,236, 77, 34,170,105,150, 11,158,222,225, 25,127, 14,193, 52,206,122, + 38,136, 25, 32,129,204, 5,193, 72,127, 50,147,225,100, 66,162,170,183,239,221, 22, 47,154,202,109, 77, 2,175,134,107, 77,204, +230, 44,219,195, 87, 93,180,186,172,110,220, 57,104, 80,156, 8,108,144,247,110, 52,244, 78,166,229,233,171, 54,219, 68, 76, 76, +213,102,221, 62,168,203,121,179,171, 1,225, 68, 14,118,170, 4,131,162,122,132,160, 21,125,244, 98,161,200,117, 32,153,144, 6, +202,133, 84,158,247, 3, 78,188, 15,226, 32, 96, 80, 64,214,101, 92,181, 76,226, 16, 60,225,222, 98,236,120,185, 54,192,104,180, + 4,201, 84, 74,126,244,209, 67,121,251,104, 75,190,173,123,114,115,231,158, 60, 84,199,254,242,124,110,163,223, 24,131, 67, 59, + 15, 88, 30,207, 24, 88,215, 28, 23,181,169, 21, 4, 68,105,226,100,194,152,200, 84,150, 49,112, 80, 57,230,129,210,214, 66,141, +105, 66,117, 46,100,211,233,192,105,241,190,134,140, 9,251, 25, 44, 65,197, 54,144, 79, 70, 55,131,227,232,130,163,204, 6,126, +227,144,134, 31, 7,253,114,162,135, 96,176, 96,127, 8,125,173, 11, 93,168,103, 23,200, 90,151, 28, 41, 0,130, 19, 82,175,232, +231, 47,192,158, 6, 56,129,103, 66,101,165, 84, 66,112, 20,244, 98,167, 26, 93,118,155,154, 85,193, 9,220,168, 73,216, 91, 72, + 71, 23,237,102, 33, 32,139,217,127,252,170, 45,127,249,203, 51, 25,205, 13, 28, 6, 3, 80, 82,103,165,190,135,151, 21,194, 48, +163,113, 44, 47,213,193,213,106, 57, 41,105,132,221, 40,103, 88,150, 73,133, 22,209,238,109,228,165,154,207, 82,252,131, 68, 21, + 40, 95,121, 22,172,160,140, 89,216, 77,203, 12,191,183,136,232,188,126,245, 98, 40,223,215,133,255, 76,157,196,165, 70,130, 63, +248, 78,131, 66, 42, 28,175, 91,130,196, 38,150,169, 26,134,122, 35,148,173, 2,110,248,130,132, 37,200,118,230,115, 11, 96,126, +254,213, 90, 29,175,199,222, 10,103,148,213, 25, 3, 71, 0, 99,218, 26, 89, 31,119, 50,159, 80, 24, 38, 2,253,238, 10,142,204, +115,253, 93, 83, 91,106,104,100, 7,185, 77, 68,226, 9, 17,154, 75,206,237,223,219,173,200,118, 41, 37,223,191, 83, 98,134, 14, +131,236, 69, 75,249,201, 23, 45,205, 90,166,250,174, 25,121,126, 49,150, 93,144,220,212,242, 12,170,190,165, 81, 56, 15, 99,180, +226, 51,165,101, 67, 94, 28, 55, 29, 89,133,239, 52,222,133, 64,148, 45, 93,191,148, 30,218, 76,162,217, 36,100,120, 61, 61,180, +229,138,228,183, 26, 82,214,236,176, 11, 53, 61,125,159,197,122, 66,231, 81,217,170,106,164, 62,103,192,134, 42, 11,200, 38, 80, +198,254, 79, 31,254,131,252,244,147, 71,242, 63,254,231,191, 37, 47,175,150,178,187,171, 89,253,168,193, 86, 3,232, 70,123,237, + 38,201,101, 48,171, 59,132,214, 49,180,151, 29,152,140,239, 12,152, 34, 24,193,162,196, 88,220,244,159, 78,127, 32,185,237, 28, + 51, 27,100,249,112,248,221, 94, 79, 29,222, 80, 51,149, 30, 9, 31,216,198,240, 76,150,212, 4, 20, 44, 64, 13, 66, 35, 88, 33, +235, 27, 71,226, 82, 36, 97,169, 0,100, 21,248,175,251,164, 53,104,121,235, 65,133, 0, 11,126,174,166,134,134,153,190,174,127, +214, 79,211,248,162,196,138,125, 5, 15, 55,155, 74,209,202,209,157, 26,135, 66,228, 36,115,137, 58, 6,178, 58,132,225,212,117, +212, 0, 6,162, 20, 84,219,243, 12, 36,131,118, 2,123,178, 40, 67,163,180,143, 50,182,211, 60, 15,117, 63, 64, 92, 51,161,250, +220,154, 61,113, 26,100, 13, 42,210, 73,138, 25,152,105,171, 27,127,124, 87,141, 97, 91,239,227,118,185, 32,191,113,247, 64,142, + 91, 61, 57, 86, 67,182,118,179,239,112, 72, 28,143,115,200, 95,246,148,245, 76, 86, 11, 89,226, 41,200, 96,183, 12, 72,157,140, +245, 93,128,106,216, 33,173, 17,254, 99, 61,161,233, 29,120, 19,171, 26,132, 86, 66, 45,106, 70,143,234,214,184,101,244,171,200, + 54,146,245,220,198, 48, 83, 30,157, 16, 0, 77, 28,159, 68,208,186,132,176, 72,154,149, 21, 48,204,225,220, 83, 93,206,113, 52, + 64,184,100, 56, 90,147,228, 4,224, 65,144,198, 32,160,221,169, 87, 88, 1,244, 64,253,172,207,248,248, 84,179, 44,148,187,129, + 49, 8,109, 50, 32,212, 76,124, 65,102, 67,107, 61,198,250,119,131, 12,250,206,154, 29, 70, 11,153, 13,251, 4,216,130,105, 31, +255,100,120, 47,204, 22,146,183, 3,109, 8, 40,164,133,242,122,140, 11,198, 63,140, 92,197,205,141,172,249,215, 19, 11,192,162, +164,114, 12,246, 16,132,161,140, 59,158,142, 95, 51, 29, 30,238,237,201,166, 6,158, 96, 49,220,209,128,171, 27,205, 29,243, 96, + 64, 91,180,152,143,165,134,246,145, 62,199, 85,243,130,236,101,126, 70, 29, 12,192,137,126, 86, 6,157, 22, 75,248,213,202, 61, +217,209, 76, 30,130, 67,203,181,241,212,227,204,133,174,125,243,234,178, 35, 23,144,109,101, 75, 36,101, 8,125, 63,126, 93, 82, +230, 12, 56,230,212, 99, 66,212,185,247, 0, 10,162,109,152, 77,219,184, 37,122,217, 7,251, 85,117,230,152, 32, 8,152,197,147, +160,197,207,145,245, 19, 89,111,173, 92,213,164, 96, 69,199,134,247,192,121,200,110,149,197,211,160,235, 92,157, 31, 50,115, 36, +142,135, 27,160,204,205,202, 85,209,151,171,158,181,162, 46, 53, 24,132,236,232, 65,163,204, 49, 62,113, 98, 67, 40,219, 35, 8, +193,196, 22,170, 63,152, 70,193,125,171, 86, 74, 28,221, 43,230,125,121,213,153, 19,161,143, 54,199,137,218,183,186, 62, 35,236, +200,214,230,182, 36,169,186,252,242,193, 39,250, 46, 39,114,247, 96, 91,246, 54,171,108,197,204,116, 13, 91,189, 33,253,141,137, +131,121,172, 86, 35, 64, 70,201,187,161,239,130,128,108, 78,181, 57,203,180, 49,225,129,245,158, 46, 66,182,162,129,209,216, 86, + 59,138,224, 8,162, 49, 4, 96,235,249,106,104, 82,247,248,101,155, 45, 3, 76,120,129, 70, 25,247, 31, 85, 26, 50,177,170, 93, + 67,213,224,241,139, 51,249,215, 63,124, 79,247,167,207,209,209, 94,127,105, 8,125,216, 34,216,138,181, 71, 31,139,170, 1,148, + 63, 25,124, 45,150, 54,193, 18, 36, 75, 26,236,158, 30,170, 52,138, 73, 75, 99,118, 66,121,104,164,206,104, 30, 90, 36, 89,202, +132,215, 99,122, 98,180, 5,198,158, 68,157,111, 39, 3,106, 92,195,158, 67, 20,198, 18,130,227,119,109,124,227, 24, 55,123,120, +214,147, 31,125,114, 33,165, 98,154,131,249,158,103, 32, 24,100,166,251, 59,101,205,180, 61,249,240, 97, 95,166,177,199,121,104, + 74,189,250,134,171, 68,132,248,224, 98,160, 89,184, 79, 62,222,246,120, 46,247, 54, 11,210,174, 47,228,217,213, 72,158,183, 38, +242,139, 47, 69,141,209, 76, 62,125, 53,166,178, 26,250, 72, 0,190,228,232,168, 99, 62, 55,178,117,208,191, 34, 19, 15,189,170, + 20, 10, 41,102,237,200, 60,112,232,219,186,120,125, 13, 62,158,157, 77,100,175,158, 99,100, 15,254,110,162,200, 73,216, 0, 13, +114,159, 8,224, 24,229, 54,125, 62,160,177, 91, 87,125,249, 74,150,242,248,217, 57, 51,145, 7,191,124,197,153,121,164,254, 32, +160, 9,245,253,187,147,133, 52, 39, 75,206, 77,178,239,167, 70,166,154, 55,118, 34, 68,160,190, 6, 64,207, 78, 95,177,188, 11, +205,113,244, 30, 23, 14,137, 13, 80,218,213,112,161, 7,119,197,246, 71, 42,204, 91, 0,229,153,246, 19,128, 41,200, 2,111,239, +111, 80,241,170,150, 11,216,131, 76,235,243,149, 50,219,178, 81,205,115, 44, 35,159, 82, 67,163,251,188, 89,200,201,231, 39, 99, +246,239,191,113, 35, 79, 76,193,243,166,102, 81,154,117,110,108,133, 20,131, 72,174,245,219,217,191,132, 96, 69, 74,126,251,157, +109,130, 22, 65,206,129,108, 10,135, 30,145, 54,126,222,211,195,253,226,178, 39, 57,189, 0, 55,223, 58,148, 48, 95, 53,213,188, +160, 46,157, 47, 47,244, 34, 67, 97, 47, 75,149, 50,240, 22,167,144, 17, 3,186,171,217,202,147,243,150,252,191,127,251,145,124, +249,188,169,153,123, 81,158, 93, 78,228,239, 63,127, 72, 99,224,171,225,190,106,119,232,192,239, 30,236,145,252,230,188,213,100, +208, 67, 69, 45, 26, 31, 11, 30,209, 42,128,147,173, 96,222,181, 82, 33,219, 20, 70, 90, 48,221,209,108,183, 56, 42, 6,231,129, +222, 20,148,181,112, 81,124,244,160,209, 47,118,216,132,208,141,163,161,135, 78,134, 54,224, 36, 86, 6,254, 9,152,237,134,172, +106,113,142,219,201,242,162, 99, 2, 66, 16, 24, 15,100,215,248,249,140,235,143, 99, 60, 44,235,120,225, 39, 64,169,130,235,218, + 73,183, 82, 61,207,129,221, 12,232, 22,145, 19, 92, 28,208,238,218,176,198,137,161,219,241, 93,190, 53,250,201,249,110,146,177, +150, 1,176,140, 28, 90,175,186,217,237,211, 24,209, 33,175,174,193, 61, 40,111, 47,152,121, 19,216, 26, 88,224, 98, 99,170,105, +185, 24, 76,137,109,217,214, 51,112,103,119, 83,131,170, 46,121,250,215, 78,131,253, 90,219, 25,173,136, 53,104,123, 3,124,143, + 16,197,205, 59,191, 64,245,102,202,128, 74,156, 40,140, 79, 64,152, 6, 66,121, 19,160, 40,100,209,215,157, 19, 3,177,244, 67, + 58,106,114,226,171,131, 91,160,164, 58, 51, 37,188,203, 86,135, 99,164,139,121,143,233, 70,188,154,208,176, 53, 42,144,130, 14, +229, 81, 91,131, 93, 61,154,251, 98, 32,190,237,141, 50,123,209, 72, 14,246,182,107,236,181, 99,153,224,236, 47,154, 61,221,179, + 17,199,102,215,106, 68,231,122, 95,129,126,191,127,235, 64, 6,219,155,204,216, 59,157, 75,117,212,186,167,133, 50,133, 68,128, +133,128, 40, 9, 90, 62, 75,218,196,152, 4, 56,168, 76,166, 89, 93, 49,166, 73,160, 20,200,246,134, 44, 27, 76,133,153,156, 1, + 53,173, 87, 73, 66, 26, 92, 33,223,217,204,208,183, 36,136,125, 81,240,102,228, 13,195, 0,117, 56,142,149,185,170,202,179, 87, +167, 82,200,191,193, 50, 49,214, 54,157,213,179, 53,179,137, 25, 22,108,244, 14,247, 7,125, 6,131,195, 65, 79, 70,163,190, 58, +179, 3, 13, 56,247, 72,139,218,234, 52, 37, 9,139, 26, 44,247,212,129,237,147, 74,245,236,170, 77,240, 90,236, 36, 87,129, 18, + 95,113,158,123, 73, 76,130,237,177,247,186, 2,103,247,126, 77, 16, 29, 57,254, 97,206,116,253, 64,237, 13,123, 58,157,199, 28, + 21, 6, 8, 13, 21,160, 27,251,247,244,222,229,101,127,203, 72,140, 80,209,196,231, 35,187, 69,102,186,210,224, 1,228, 48, 8, + 90,225,236,174, 52,169,123,247,246, 22,171, 14, 0,233,194,231,143, 23, 9,207, 68,119, 48,166,253, 51,194, 35, 84,101,242,106, + 55,124,142,165, 33,208, 70, 5,233,188,217,166,222, 2, 42, 99, 8,228, 80,185, 49,249,110, 97,245, 54,159,175,240,204,158, 54, + 7,114,176, 81,118,194, 64,105, 13,242, 74,122,110,123,114,231,214, 61,169,215, 26, 36, 73, 59,105,246,213,198, 12, 77,139, 4, +205, 98,181,225,129,222,133,171,246,132,223,141,139,180,169,137, 7,190,183,162,137, 83, 73, 19,190, 78, 31,228, 55, 51, 86,180, + 96, 3,123,106, 67,224,215,174, 53, 19,112,175,170, 69,176, 53,226,125, 38,220,219,225, 8, 84,212, 69, 6,197, 0,225,193, 79, + 98, 77, 16, 8,181,122, 3, 86, 4, 81,121,248,249,231,199, 12,154,238,222,220,103,219,182, 90,152, 88,146,128, 4, 27, 18, 1, +161, 9, 53, 81, 9, 14,118,218, 51,162, 46, 15,182, 56,165,134,191,223,235,202,223,125,252, 82,254,229,123, 59, 4, 97,117,198, + 9, 81,183,136,222,102,208, 51, 62,237,203,153, 70, 15, 37,180,144, 33, 72,225,128, 10, 86, 54, 67,249, 92,216,159, 6,173,231, + 70, 1,243,191,121, 58,206, 15,159,245, 53, 67,155,201, 13,188, 4,192, 7,163, 5, 47, 86,173, 20,202,219,251, 69,217,214, 11, +138,114,246,112,156,149,131,205, 10,203, 38, 47,213,152,143, 47,103,236, 25, 71,177,217, 54,128,235,176, 64,152, 45,252,226,164, + 71,152,255, 75,141,238,255, 63, 61,156,205,238,156, 8,115, 68, 71, 99,117, 76,184,124, 40,167,122, 44,149, 27, 27, 20,128,241, + 41, 39,211,199,102, 1,100, 48,245,103, 47, 16,253,204, 13, 41, 11, 49,131, 44,104, 73,117,227,161,116,246,131,175,237,200,119, +239,212,229,127,253,235, 99,121,217,233,233,119,175,232, 12, 36, 76,228, 74, 29,235,233,243, 49,245,213,209, 99,238,119,166,108, + 37,124,113, 60, 35,235,210,222,225,134,252,209,207, 39,146, 15,141, 96,191,170,107, 50,146, 28, 1, 28,199, 23, 83,121,210,154, +203,121,123, 74, 84,243, 4,253,211,181,176, 23,116,149,142,164, 63, 76, 88, 41,233,232, 67,159,244, 23, 12, 38,202,105,143,154, +240, 39, 77,144,253,139,211,208, 53,101, 58,163, 80, 4, 85,164, 71, 85,161, 15, 14,210,114,111,175,226,230, 8,141,197,200,115, +156,249,184, 96,143, 47,135,242,213,203,174,252,203,111,220,144, 51,244,109,206, 53, 3,204,168,177, 31,206,229, 98,184,150,225, + 23, 23,114,239, 70, 69, 47,158,181, 90,196,205, 97, 83, 59, 68, 47,251,206,118, 93,182, 40,170, 17, 32, 52,116,128, 17, 93,119, + 56,192,249,140,217,248,120,166, 78,241, 97, 79,138,155, 25,233,235,190,247,103,109,105, 53, 91, 4, 32, 65,130, 16,229,162,154, +158, 5,100, 80,155,106,236, 63,252,234,153, 60, 60,237,104,228,153,145,131,221, 29,206,106, 62, 60,109,106, 22, 87,228, 5,190, +188,188,100,255,111,127,103, 75,142,213, 48,225,221, 65, 57,187, 92, 25, 38, 33, 96,159,210, 99,121, 42, 96, 86,144,103,102,249, +234,234,138,134,245,112,119,143,207, 91,200,229,109,254, 59, 50,244,110,167,219, 51, 0, 26,156,186,211,248, 6,162,151, 32, 49, +160,208,211,166, 43,144,120,226, 68, 95, 60,235,103,185, 82, 85,114, 61,101,236,120,246,193,196, 6,205,100, 48, 75, 97,245,208, +179, 3, 48, 6, 70, 7,165,251, 5, 81,250,134,112,166,244,106, 42,124, 13,248,178,209, 29, 53, 78,200, 16,125,115,146,200, 54, +141, 9,206, 24,216, 80,218, 69,159,213,140, 70,108,189,184,149,201, 54, 26,243, 98, 98,156,230, 14,156,151, 88, 74,200,181,177, +227, 16,185, 56,193,128, 58,190, 24,181, 41,195,244,148, 79,195,130,209,177,171, 46,132, 56, 42,242,238,209,190,188,173,223,243, +232,172, 45, 39, 26, 28,161, 11, 3,178, 27,112,100, 7,124,215, 28,199,112, 80, 86, 64, 57, 16, 45, 8,224, 27, 80, 90, 70, 80, +133,117,165,164,178, 7, 13,244, 13,210,147,146,107, 94,141,100,165, 84,102,214,179, 90, 91,165, 2,122, 14,200,182, 34, 71, 69, +141,190,121, 70,207,134, 30,121,210, 10, 99, 60, 46, 90,247,164, 89,170, 75,189, 90,210,179,184,228, 8, 90, 83,108,250, 2,153, + 95, 1,207, 21, 6,212,118,184,174, 94,121, 43,136, 6,229,121, 23,200,171, 49, 15,220,122,121,242,229,241, 5, 75,235,214,174, + 17,174,103,128,128, 67, 82,164,167, 69,149,146, 35,104, 26,172,103,212, 56,131,211, 3,109, 16,244,212,151,137,177, 5,162,148, + 10,103,130,192, 28, 25, 48,132, 99,124,238,133,137,233, 32,126,143,200,157, 29,179, 87,237, 51,208, 8,216, 26,241, 24, 76,169, + 51, 24,118, 13, 85,239, 39,175,249,225, 81,214, 63, 57, 59,151, 55,110, 31,201, 0,218, 1,186,255,226,207, 56, 98,183, 38,217, + 72, 68,230, 68,220, 61,112,131, 64,196,102,179, 86,102, 69, 21,103, 29,107,178, 0, 62,232,242, 74, 54,106,111,202,119,191,241, +129,180, 47,143,245,108,218,169, 69, 91, 15, 54,218,168,125, 23,255, 63, 87,239,213, 36, 73,122,101,137, 93,119, 15,173,101,234, +202,146,173,209,221, 64, 15,196, 8,195,112,150, 67,109, 70,154,113,249, 66,163,241,145, 63,132,191,131, 47,251, 68,227, 3,141, +182,251,192,217,181,221,177,177,217,153, 33, 22,104,108,163, 27, 64,235,210, 85,169, 51, 50, 67,107, 15,119,231, 61,231,126, 30, +213,100,183, 21,186, 80,149,153, 17,225,254,249,149, 71,208,170,181,158,170, 53,138, 77, 73,192,208,217, 68, 30,155, 19,138, 47, +233,191, 77,152,118,121,233,100,201,252, 3,208, 60, 1, 98,140,103,174, 55, 88,202,183,207, 94,232,231,158,242,236,226,254,226, +227,131, 62,188,100,140,205, 81,227, 31, 19,135, 86,173, 32,167,151,125,233,214,180,155,215,235,133,198, 13,107, 61, 48,148,204, +228,200, 20,253, 48,177,232,104,242,197, 53,198,115,212,210,247, 0,245, 65,172,106,224,115, 62,157, 77,153, 88,177,126,192, 84, + 8,137,123,183, 6,122,113, 86, 27, 4,128, 2, 51,114,126, 59, 99,124,199,196, 16,249, 3,128, 63, 0, 68,241,153,254,236, 79, +126, 70,208,108,255,234,185, 92, 92,158,177, 64,175, 76,243, 4,127,130, 46, 84,112, 50,209,248, 7,215, 17,120, 25,136,124,149, + 43, 38,233,139, 2,148,128,206, 66,145, 0, 81,115,253,203,240,181, 18, 90, 7,103,229,245,100,198,166,104, 6,171,113, 8,196, + 56, 21,191, 2,177, 41, 75, 22,119, 80, 16, 68, 49, 8, 84, 62,112, 6,191,253,234, 68,223, 87,133,247,228,254,113,135,212,107, +172, 20,185,246,115, 34, 89,226, 24, 82,180, 44, 7,166, 8, 13,185,175,149, 3,232, 35, 56, 79, 72, 90, 24,169, 77, 53,209,125, +241,106, 40,231,253,185,140, 38, 33, 23,250, 0, 78, 28,119,115,206, 44,194,186, 19, 4,168,119,247, 42, 20,122,105,215,114, 20, + 8,129, 83, 19, 80,220,151,227, 72,126,251,226,119, 50,199,174, 9, 64, 1,189, 40,191,184,171, 29, 64, 61, 75, 32, 66, 41,139, + 1,164, 38,116, 13,122,175, 49,234, 7,201,222,115, 59, 3, 86,140,190,201, 64,122,198,243, 68,252,251,221,119, 61, 6,174,170, +190, 6, 70,100, 56, 92,213,122,145,213, 11, 28,204,128, 60,159,205, 67, 38,194, 12,187, 33,171,136,241,128, 3,241, 9, 19,134, +128,226, 49,107,154,152, 96, 2,113,180, 83,226, 52, 0, 99, 25,252,249,127,241,241,190, 60, 58,172, 74,253,110, 67,230,231, 11, + 6,173, 61,253,220,232,230, 39, 80,181,219,100, 56, 82,124,252,125,143, 5, 4,236,254, 16, 32, 80,168,124,250, 93, 95,246,203, +190, 60,172,197,242,245, 68,175, 35,140, 52, 60,104, 13,179,151,102,135,249, 15, 95, 99, 55,155,147,102,167,107, 52,179,196,230, + 30,195,185, 37,154,107, 77,228, 64,194, 67, 68,231, 15, 47, 71,242,243,183,219, 68,149, 62, 61, 31,200,205,104,197, 7,201, 40, + 36, 54, 18,198,193,192, 94,177, 88,244,229,197,233,133,252,237,103,177,116,255,234, 29, 86,244,248,172,182, 23, 52, 67, 1,220, +187,119, 15,106,242,173, 22, 70,255,250,179,215, 68,175,159, 93, 79,228, 90,239, 53,133, 65, 66,227,113, 63,123, 57,144,123,251, +117, 78, 80,136,116,133,122, 81,226,248,182,232, 28, 49,130, 69,199,183, 70,213,190,178, 81, 53,186, 55,237, 66,239, 29,118,228, +139,231, 87,242,221,139,177, 92,255, 81, 59,160, 53, 20,196,244, 97,208,207,241, 95,253,201,161,252,139,191,249, 66, 94,106, 85, +252,218,143,229, 91,125, 88, 46, 17,140,189,137,252, 15,191,252,185,188,232,141,229,201, 23,207, 9, 2, 2,178, 22,163, 69, 80, +135, 80, 13, 35,169,210,188,128, 42,110, 75, 78, 48,178, 14, 77, 14, 64, 18, 80,186,168,150,193,221,157, 57,144, 26, 10, 25, 56, +182, 1, 60, 55,154, 79,249,231, 0,181,128,246,210,215, 46,103,130,253, 94, 46,111, 10,106, 73,226,240, 32, 49,139, 75,116, 30, + 41,165, 71, 2,167,198, 22, 27, 66,221,116,155, 45,177,195,160, 5, 95,111,234, 92,198,239, 46,114, 71,154,165,182, 63,222, 15, + 64, 68, 61, 26,171,152, 13, 35, 2, 50, 94,215,119, 32, 58,186,163,145, 85,226,241,179,155,173,170, 89,213,226, 61, 65, 28,134, +147, 48, 36,243,216,208,239,129, 3,166,110,117,104, 19,163,180,177, 72,216, 56, 79,239,173,119,186,188,153,178,197,214,141, 49, +249, 59, 81,158,212,246, 24, 35, 64,114,210,245,223, 75,237,148, 6,223,188,148,187,157,186,180, 33, 89,124,212, 97, 97, 12,196, + 46,186,252, 74, 33,111,162, 56, 40,134, 40, 0, 98, 35, 87, 0,181, 56,190,246,192, 89, 47, 18, 67, 65,103, 61,109, 18,110,199, + 5, 57,232,214,168, 43,112, 59, 89,176,144,190,152, 76,100,186,201,202, 39,247, 75,242,239,126,245, 21,189, 6,200,127,215, 78, + 20,235,155, 76,182,196,247, 3, 4,252,235,179, 91,217, 89,205,244, 28,232,251,152,106, 87, 21,228, 12,148, 90,234,202,122, 54, +226, 74, 10, 81,197,231, 52, 37,203, 66,201,180,179, 99,142, 59,163,216,246,240, 16, 53, 41,208,108,103,195, 2,228, 23, 31,191, + 79, 89,224, 63,126,251,132, 66, 51,217,114,149, 13, 1, 38,112, 88, 93,122, 27,224, 5, 86, 18,228,108,213, 17, 57,190, 57,158, + 42, 76,234, 88,224, 69,214,253, 2,177, 79,237, 2, 95, 19, 85, 9,227,226, 25,239, 75,146,174, 38,157, 35, 32,176, 30, 17,193, +129,230, 44, 24,184, 34, 36,118, 35,122,174,114,244,218,128,218,105, 26,247, 48,158, 41, 82,204, 41,165,105,178, 17,232, 79, 24, + 39,113,142, 96, 86,180,135, 53, 22,174,173, 67, 79,246,110,122,114,113, 85,147,119, 31, 62,144, 47,190,121, 44,127,248,254,169, +209,210, 18,227,175, 99,108,139,107,132,110, 27,102, 50,152, 54, 80,136, 72,255,110,226,196,114, 88, 68,146,170,236,201, 11, 90, +199, 10, 77,150,144, 47,208, 69,131,143, 13, 12, 65, 77, 99,113,190,112,160,207,230,130,255, 31,231,131,162, 88,230, 89,163, 63, +123,205,209, 61, 68,189,190, 63, 25,201, 91,119,154,218,237, 78,217,209, 79, 17,243,102,104, 8,140, 17, 0, 32, 38, 10,206,154, +222,139,110,171, 35,123,157, 22, 61, 19,128,228,199,245,187, 83,109,202, 79,234,101,218,250,246, 71, 3,138,167,129,190,140,152, +142, 98, 5,178,180,144,153,253, 99,111, 68, 36,250, 39,251, 53, 57,233,205,153,112, 89,192,233, 57,127,117,118,198,189,248, 87, +223,125, 47, 63,122,231,109,121,248,246,143,101,119,119, 71,134, 55,167,196,133,164,114,220,120, 94, 49,126, 63,191,185,145,127, +252,245,167,178,187,179, 67,229,190, 86,167,109,197,169,158,183,211,203,107, 83, 76,132, 16, 14,204,156,242, 89,190, 31, 24,238, + 16,187,208, 42,179, 96,110, 84, 77, 40,231,249, 69,159,113, 1,251,113,172,136, 80,200,128,219,142, 2, 11, 46,114, 99,231, 36, +249,217, 55,167,178,175, 77,113, 17, 46,140,173, 42,129,163,243,101, 66, 99, 39, 78,117, 98,195,179, 49, 30,120,144, 20,215,242, + 42,188,158,240,128,255,103,127,114,204,113, 51, 14,211,237,116, 40,255,244, 77,207,237,202, 81,233,104, 55,180,136,220,232,207, +120,217,232,182,234,250,226,159,188,127, 40,111,237, 98, 60,145,144,143, 11,211, 19, 72,185,147,148, 5,144,214, 88,187,183,165, +153, 55, 52,180,179,221,228,205,213,169, 55, 51, 14, 31, 70,237, 11,253,190,211,235, 41,191, 22,102,244, 62,231,124, 24,123,219, +232,221,140, 15,124,114, 64, 57, 26,213, 67,178,166,246,184, 29, 22,116, 60,235,149,185,150, 53,181,234,155, 47, 34,163, 28, 65, +230, 53, 48,112,199, 91,135, 5, 61,112,121, 77,148, 51,169,215, 2,249,159,255,242, 72,222,189, 83, 23, 95, 63,227,191,248,251, +231, 60, 80,255,244,221,149, 30,146, 68,238,239, 62,210,206,213, 42,193, 82, 49, 35,245,186, 22, 43,141, 28, 1, 31,154, 87,216, + 29, 93,205, 76, 45, 11, 99,138,254, 96,108, 72,249,105, 44, 11,253, 57,239, 62, 48,240, 6,222,156,183,245,173,198,195,106, 94, +184, 0,238,160, 74,196,248, 9,163,148, 31, 29, 55,164, 92,181,113,251,165, 38,193, 41,198,146, 40, 34, 22,154,228,181,131,126, +231,168,170, 1, 70,175,213, 34, 54, 75,197,200,156,224, 80,237,146, 22, 4, 46,179,222,220,177,190,185,127,255,197, 90,223,127, + 77,126,250,176, 77, 78, 61,246,141,248, 59, 32,133, 9, 20,107,151,228,175, 63, 62,148,127,249,171,231,114,174, 93, 59,130, 16, +176, 19, 80,193,171,103, 53,121,232, 97,185, 28,204,244,243, 22, 13, 4,132, 7, 26, 92,108,116, 46,177,209, 22,163, 92, 81,131, +205,148, 10, 96,112,160,194,200,103,137, 42,125,180,150,153, 38,203, 72,147,237, 77,127, 42, 95,193, 53,107, 1,173,228,186, 44, +162,150, 12,245, 50, 20, 65,115, 90, 1,248, 53,150,175,159,157,114,250,242,223,253,233,251,242,239,190, 62,151,193, 12,215, 91, + 59, 34, 20,100, 90,189, 82, 17, 45, 8, 28,239, 92,147,237,120,204, 96, 70,116,183,103, 84,163,149, 11,146,221,102,131, 93, 19, +156,211,144,180,177,211,132,212, 34,254,238,242,214,198,238, 20,109,209,159,125,126,221,163, 18,217,190, 62,148,248, 58, 76,115, +104,222,177, 49, 9,100,220, 43, 36,169, 34, 45, 77,115,166,165,158,201,186,157,183,105,163,163,176,234, 15,110,168,241,142, 14, +207,119,220,238, 52, 81, 3,213,140,103, 9, 0, 61,116, 82, 68, 7,175, 76, 30, 21, 63, 23, 69, 2, 62,215,154,123, 57,140,146, + 50, 28, 29,199,206, 23, 21, 73,222, 20,237,178,220, 3,155,148,234,146,255, 31,247, 53, 45,214,236, 25,205,152,162, 23,231,188, +214,245,166, 46,112, 17,119, 98,190,243, 79,176,177, 56,157,181, 2,127, 43, 52,147,131, 21,169,231,219,181, 48, 51,113,219,135, +107, 17,252,205,201,133,190,254,156, 1, 28,200,105, 76, 67,146,129,237,135,113,141, 64,245,195,164, 14, 40, 98,184,106, 1, 41, +125,127,183,161, 49, 36,100,146,106,176,171, 79,184, 79,197,218,226, 68,207,188,231,100,103, 33, 48,132,130,218,139, 81,252, 52, +245,108,116,245,237,107,208,131,107,218,218,232,138, 48, 51,129, 29,101, 85,131,123, 94,139, 14,116,150,195,201,173,158,245,129, +222, 79,179,113,222,211,128,141,130,254,234,226,140,159, 3,147, 59, 88,183,226,217,155,174, 19, 2,190,176,179,229,245,242,204, +118, 20,147, 40, 88,242,130,231,254,233,215, 39,212,155,231,116, 15,194,109,122, 31, 82,204, 51,118,247,113,160, 93,164,198,166, + 98,166, 36,121, 77,151, 69, 26,108,104,108,139,173, 19,197,168, 55,140, 86, 84, 23, 51,156,133, 71, 67, 28,160,214,227,196,115, + 76, 30,103, 21,237,138, 43,196, 80,116,123, 70,167,139,183, 99,121,252,125,214, 1, 38, 67,189,119, 3, 45,232, 58,205,186, 21, +123, 89, 72,122,175,184, 75,221,128,253,146, 0, 3,164, 77,194,218,138, 5,224,141,250,253, 27,169,148,107,182, 18, 19, 83, 72, +251,246,241,119,122,230, 74,114,247,232,142,140, 70,125,121,113,217, 23, 51,236, 51, 17, 42, 20,170, 72,138,159, 63,153,110, 21, + 8,113,126,144,176,141, 58,233,140,103,156, 32, 83,165,100,141,140, 33,230, 77, 71, 1, 56,150,217, 44,145, 78,167,164, 29, 39, +192,176,230,109,128,216, 12,236, 7,154, 40, 36,105, 76, 82, 90, 21,195,252, 20, 53, 62, 63, 58,106,203,127,124,124, 67,171, 86, +116,207,163, 19,195, 25,225,204,119, 91, 13, 45, 2,119, 9, 70, 67, 1,116,173, 5, 76,232,112, 37,160,158, 93, 79,245,188,111, + 38, 90, 56,134,252,188, 57,189,215,173, 90, 89,127, 86,141, 83, 1, 2,211,244,235, 65,133, 59,232,248, 68,185,159, 92,245, 57, +153,169,151,235,242,206,219,239,242, 94,188, 58, 59,101,161,135,233,201,207, 62,252, 64,218,205,150, 60,125,246, 13,189,222,129, +131, 65,177, 10,208,240, 97,127, 68,253,250,111,191,255,206, 80,232, 26,119, 1, 40, 61,190,123,172,141,102, 67, 94,190,126,205, +100, 12, 61,133, 54, 40,157, 48,252, 2,202, 29, 98,102,158, 80,103,126,170,207,197,209, 78,149,212, 63, 0,160, 49,217, 5,230, + 2, 88,156,150, 22, 69,226, 76,138, 16, 7, 97, 31,124,113, 51, 37,235,232,193,126,139,226,111,112,196, 91,204,103, 90,120,102, +173,168,194, 42,196, 51, 81, 44,195, 74,192,165, 77, 3, 65, 69, 95, 0,224, 70, 4, 35, 84,172, 55, 80, 43, 42,162,195,138,152, +249, 61, 7, 6, 10,220, 94, 46,165,213,208, 91, 92, 43,154,201,198,246,235, 1,170, 81, 63,182,132,234, 99,151,226, 73,175,167, + 65,109,175, 68,254,241, 40, 4, 90, 47, 67, 17,126, 40,195, 33,192, 92,246, 23,114,126, 59,215, 10,204,198, 34,129, 6,198,102, + 57, 67,244, 32, 31, 8,140, 50,192,127,207,250,238, 97, 52,139, 68,140, 53, 81,169,160,131, 39, 47, 94, 31,178, 90,187,192, 78, +157,149,101,156,161, 94, 46,196, 14, 32,166,130,106,235,237,227, 29, 41, 53, 1, 90,211, 74,105,146,145,254, 43, 13,154,152,137, +149,154,228,181, 62, 60,212,196,184,201,203,211,222, 70, 30, 21,128, 82,213,235, 82,210,234,120, 97,149, 87, 54, 3,158,102, 72, +100,239,231, 79,199,220,183, 97,207,139, 93,124,163,213,149,119, 30,234,207, 9,245, 70,108, 42, 76,150, 24,215,113, 71, 3, 41, + 70,231, 5,143,221, 46,254,201,231, 87,230, 54,166,223,223, 41,106,146,155, 66,246, 79, 3,134,126,206,146, 6,145,253,110, 81, +171,186, 44,247, 60, 39,231,125,118,163, 4, 13,173,220,238, 11, 70, 49,137, 57, 52,163, 43,186,186,233,219, 24, 87, 59,216,191, +249,244,177, 52, 75,239,208,252, 4, 40,109,236,195, 24,172, 17,228,245, 30, 63,218, 43,203, 79, 30,181,245,231, 14,200,129,135, +222, 60,186,253,191,120,171, 33,255,234,119,151,178,234,106,101,184,158,153,220, 41, 14, 78, 22,251,242, 13,119,183,120,221,225, +108, 66,227, 20, 36,205,133,118, 19,162, 65, 63,212,255, 62,121,126, 42,159,157,143,101,103,167,195,241,108,167,211,144, 42,164, + 54,245,215,245,237,141,252,203,191,237,113,221, 2,224,209,119,175,123, 44, 56, 48,142,123,118, 51,147,167,103, 87, 68,204,226, +112,225,115, 64,233,175, 86,169,232,185,153, 17, 96, 98,168,115, 59,119, 8, 36, 20,120,161,142, 66,142, 73, 13,157, 25,166, 12, +245, 74,217,130, 77, 46,195, 4, 60,209, 14,157,158, 5, 27, 19, 35,193,232, 23, 29, 39,228, 67,239, 28,236,234,121,183,206, 0, + 99,109, 4, 85, 60, 3,232,116,145,232,118, 26, 45, 58,163, 1, 60, 26,242,217, 24, 89,114,213,247, 7, 21,182,169, 51,104,161, + 40, 71,198,144,229, 8,122,232,176, 74,174, 83,156,187,169, 2,246,243, 4, 65, 97, 85, 16,174,153, 84, 54, 4,244,133,164, 91, + 0, 64,182,113,106,119,164, 89, 65,145, 75,191, 7,252,228,180, 91, 74,210,150, 91, 76, 88, 35,149,144,245,157,173, 46,170,118, + 79, 34,199,140,240,217,241,114, 53, 16,111,182,211, 8, 78, 9, 96, 21, 43,246,123,179, 95,141,233,146, 24,120,102,191, 28, 59, + 43, 90,216,110, 66, 65, 50, 7,205,106,116,111,113,192,107,141,228,141, 53, 28, 10,171,150,118, 75,158,118, 91,160,188,242,121, +209,164,254, 88,207, 64,134, 43,131, 12, 17,201, 72,112, 8,108,228, 93,231, 44,208,209, 86, 51, 48,103,199,157, 70, 65,218,218, +225,111, 60, 43, 78,176,238,128, 49, 26, 84,195,154,218,213,161,219,235,105,178,194,217,187, 29, 12,244, 61, 20, 40,237, 28,232, + 53,232,118, 15, 89, 32,227,189, 53,155, 53,218,243, 98, 55,139,251,128, 51,141,243, 50,213, 2,188, 81, 43, 56, 26,174, 25,212, +116,219, 53, 27,121,247,198,220,109,162,248,255,249,143,223,211,115, 58,144,215, 26,184,151,115,104,235, 23,152,232, 67,237,216, +193, 60, 91, 96, 58,229,134, 35,228, 12, 39,166,230,133, 98,121, 65,149, 58,161,122,222,100, 54,229, 52, 41,138, 86, 68,228, 91, + 41,101,197, 39,174, 53,176, 21, 72,230,141,106,198, 64,184, 94,226,236,128,140,218,150,202, 64, 3,175, 4,189,245,194,222, 14, +159,107,222,147,108,129,190,246,137,159, 99,151,137,253,121, 18,191, 81, 11, 68,167, 72, 96,112,190, 42,101, 95,255,174,145,231, + 68,102, 54, 29,210, 31,225,103, 31, 60,210,184,252,146,104,241, 92, 38,112,124,123,179, 9,198,115,118,118, 61, 52,133,188, 88, + 28, 11,192,240, 34,136,127,169, 18, 6,238, 33, 38, 85, 88,107,224,122,150, 11,166,107, 14,224, 87, 83,207, 67,226,213,157, 17, +140,158,175,205,148,244,182,181,243,166,192,179,253,244,245,156, 73, 30,137,109,163, 13, 29, 40, 94,136, 17,143,142,186,242,204, +179,209, 59, 38, 92, 48,229,129, 7, 58,102, 78,227,201,156,178,207, 80,129,171,209,119, 65,139,170, 25,124,222, 65,107, 45,114, + 68,142, 22,240,189,187, 29,198,165,223,124,121,174,159,123,109,244, 65, 61, 83,175,175, 38,244,100,199,185,228, 42,118, 13,243, + 21, 83,160,163,212,180, 94,199,239,159, 62,147,149,254,247,163, 15, 62,144,163,227, 31,201,248,246, 53, 1,205,192, 97,161, 70, +248,228,253,135,242,209,163, 99,249,254,229,133,124,249,252, 66,190,254,102, 38,247,142,239, 72,101,133, 17,121, 94,238,104,209, + 4,249,222,172,103, 34, 80, 24,105, 60, 59, 31,113, 21, 66, 55, 0,205,101,192,137,188,212,184,139,220,136,185, 12,166, 59,184, +219,104, 60,193, 71, 7,214, 7,212,114,104,218,211,131, 66,243,200,112,106,180,219,138,230,164, 30,132, 67,168,161, 97, 76, 20, + 76, 90, 54,137,221, 35, 60,191,112,245,204, 12, 7,154, 80,103, 16,213, 8,165, 83,210,138, 68, 15,226, 74, 59, 93,160, 72, 97, + 86, 18,248,182,175, 38, 79, 53,178,189, 34,190, 25, 93, 13,172,242, 80,109, 64,174, 53,142, 13,168,227, 17,176, 99,154,214, 0, +152, 65, 42, 16,251,246,193,114, 35,159,191,234,115,239,134, 68, 14,103, 28, 28,226,208,129, 46,176, 99, 56,208,100,178,210, 96, + 55, 89,197, 20,132,201,186, 81, 60, 14, 4, 92,153, 16,244, 54, 14, 28,134, 74,220,164, 50,225,165,174, 29, 4,198,215,122, 64, +178, 5,159,194, 36, 8,226, 59, 45, 19,246,127,221, 91,112,228,255, 78, 75, 11,138,141,199,160,119,163, 95,223, 95,154,232, 69, +185, 90,229,126,100,103,167,197, 78,231,243,203,141,124,121, 53, 52,228,103,161, 46,119,247,171,252,115,188, 95,112,196, 1,122, + 64, 48, 42,104,178, 44, 96, 15, 21, 24, 98, 29,202, 54, 65,208,208,164,176,166,205, 97, 28,121, 12,168,226,212,159,208, 93,139, + 88,101, 60,210,174,122,181,132,156, 98, 76,106,198,113, 3,135,219,227, 14, 30, 15, 51, 64, 67, 24, 83,238,106,240,185, 93, 9, +121,252,131,197,210,164,118,185,163, 75,131,176, 79,192, 24,130, 42, 3,188,254, 25,174,237, 23,207, 7,242,223,252,236, 30, 53, +180,201,133, 69,229, 31, 26,122,127,174,215,230,163,227,186,188,210, 34,228, 83,237,144, 71,227,153, 12,170, 80, 39,210,206,170, +150,151,191,253,244,185, 70,212, 6,173, 24,241,158, 71,250, 64, 97,108, 12, 96, 13, 40,129, 8,130, 89,253,236,111,239,215, 9, +252, 58,106, 67,243,216,163, 2, 31,124,158,111, 7, 99,238, 86,241,192,180,170,101, 9,245,140, 60,191,188,165,226, 27, 2, 49, +254,174,209,110, 75,199,183,132, 50,212,195, 12, 90,152, 80,192, 39,100, 0, 17, 26, 57,152,169, 13, 17,213, 64, 9,103,205,135, + 59,181, 85,196,249, 96,135,138,192,173, 15, 35,181,185, 93,103,111,231, 38,228,232,146, 70, 14,238, 28, 45, 86, 3,125, 96,170, +250, 16, 3, 0, 83, 51,227, 18,152, 4,150, 75,230, 81,158,133,156,111, 44,117, 61, 19,121, 45,226, 90, 69, 61, 43, 99,125, 79, + 25,237, 68, 50, 49,133,137,176, 51,183, 0,101, 74,118,158,115, 41,180,241,124,194,241, 40,222,111,184, 49,170, 11,238, 17, 58, + 62, 67,184,198, 68,174,195, 42,116, 67, 93,120, 83,164,219, 56,131,149,200, 9,203,136,111,186, 3, 75, 38,128,141,227, 62,219, +115, 23, 59,177, 26, 67, 82, 39, 78, 17, 44,113,137,122,179,221,241,155,190,188,141,115,227, 55,100,118,227,221,211,148,194,240, + 2,145, 83, 29, 76,205,102,136,246,119, 58,228,107, 26, 86,216,103,136, 52, 72, 67, 2, 51,220,216,206, 31,154,223, 72,214, 88, + 51,224,153,183,228,132, 61,179,117,158,220,221,174,157, 79, 57,141, 48,214,148,107,193,255,194, 84, 69, 92, 7, 75,208,211,213, + 64,187,172, 18, 17,235, 70,157,213, 0,166, 9,118,185,198, 40, 58,148, 91, 45,148, 54, 0, 81,109, 70, 90, 48, 21,232,121,176, +223,106,106,225,216, 52,229, 64,253,158, 82,107,159, 9,170, 63,156, 24,159, 62,222,240,249,175,149, 11, 90,236,149,120, 93,175, +110, 71,140, 57, 93, 45,152,231, 26,103,176,135,206,100,114, 4,170, 61,189, 24,108, 69,125, 54, 4, 72,150,169, 92,183, 94,174, +104,224,132, 51,149,119, 60,117, 4,121, 0,177,145,124,139,133,138,222,223,146,156, 0,136, 85,171, 16, 79, 48, 30,223,106,242, + 43, 82,141, 44, 99,114,242, 38, 19,235,128,165, 16,216,217,142,182,113,143, 18,195,223,184, 25,189,108, 60, 11,210, 96,158,224, + 92,246,181,217,162, 24, 17, 60, 2,244, 57, 29,220,246,120,118, 0, 66,148, 56,227, 44,172, 99,122,141, 31, 64,182,186, 80,212, +247, 29, 82, 19, 95, 60, 3, 84, 94, 13,166,114,160,205,199,225,238, 88, 46,181, 89,128, 5,105,106,108, 52,114,206,141, 48, 9, +122,239,254,190, 21,216, 98,212, 66,113,130,196, 56, 67, 40,158,193,212, 65,195,210,128,161,207, 34,116,235,191, 60,207, 26,176, + 47, 80,122,140, 55,101,130,209,206, 46,158,147, 5,133,130, 23, 0, 56,120,219,167,152,148,213,186, 77,192, 49, 48, 3, 0,188, + 65,115, 0,221, 39,100,132,239, 29, 30, 48,126,248,100,122,108,216,201, 34,119,176, 59,245,109, 77,133,189,125, 37,111,254,239, +188,174,160, 46,222, 34, 22,142,101,191,153,213,231, 88, 99,252,116,195,243,142,175, 95,109,204,173,147,140, 3,104, 76, 84, 43, + 91, 13,132,131,238, 14,239,251, 96, 52,145,127,252,245,111,100,111,119, 79,126,244,206, 35,241,214,125,189,214, 23,140, 57,207, + 78,174, 40, 55,253,222,195, 59,218, 16,236,200,111,191,122, 46,215,215, 23,178,105,116,168, 29,176,211,237,104,145,185,203,132, + 61, 25,221,210,133, 16,231,178,204,174,220, 60, 32, 48, 98,199, 51,133,198,160,228,116, 52,104,136, 5,141,254, 28, 48, 14,248, +218, 57,115, 39, 44,207,241, 89,161, 73, 15,113,168, 76, 57,207,117, 12,245, 71, 72, 51, 44,112,154,146,174,116,108, 28,175,249, +225,233,229, 68,190, 57, 27,211,154, 15, 55,249,229,197, 72, 31, 24,189, 73, 37,216,139,195,202,109, 35,203, 36,118,227, 35, 33, +133,198, 20, 3,224,248,131, 10, 80,147,250, 44,207, 27, 21,100,236,111, 51, 94,226,172, 83,141, 78,182,113,114,171,183,227,165, +124,253,106,100,157,136,190,129,221, 86,142,187,110,211, 19,143,137, 18, 61,189, 93,179, 48,192,131, 23, 50,240,196,206, 79,214, +179,189,152,254, 42, 85,138, 6, 96,113,149, 10, 42,229,130, 38,197, 70,189,196,139, 15,116, 40,104, 53,216, 87,132,113, 94, 31, +130,169,244, 38,161, 22, 6,115,189,144, 21,153,132, 1, 1,113,230,214,101, 99, 81,218, 67,130,190,148, 88, 33,195,196, 10, 64, + 81,146, 56, 9,196,196, 76, 79,180, 3, 93, 44, 61, 6, 98,112, 46, 65,217,240,253, 44, 17,206,136,144, 64, 69, 35, 57,225, 32, +154,151,180, 29, 64,160,195,169, 48,230,130,178, 79,217, 70,159,129,170,172,135,177, 94,172,104,208, 92, 19,176, 2,142,237,114, + 97,116, 39,220, 44, 76, 37, 0,254,186,130, 42,146, 30,252,208,139,221,146, 84,171,101,152,141, 44, 93, 21,159, 10, 97,232,239, +126,245,245,165,252,226,157, 61,217,173, 27, 72, 10, 63, 75, 95,138,187,161,207, 94,141, 73, 13,105, 54, 27,242,163,183, 3,121, + 53, 6,203, 97, 77, 26, 6,174, 75,171,148,149, 75,200,204,198, 33,213, 2,121,141,214, 17, 87, 49, 48,173, 48,175,232, 60, 57, +230,103,250,158, 14, 15,247,244, 26,207,165, 55,223,176, 2, 71,149, 73,110,189, 6,234,139,193,140,159,135, 73, 73,175,111,129, + 92,203, 44, 19, 48,222,103,206, 51,231,191, 36,113, 70, 53,156, 40,164, 32, 47, 91,247,224,207, 33, 11,107, 9, 58,224,244, 32, +237, 78,241,115,242, 20,237, 48,135, 43,142, 50,201,215, 54, 64, 18,186, 77,252, 44,228, 55, 8,174,224,225,169,228, 49,166,195, + 56, 25, 26,229, 69, 38, 91,236, 90,145,164,241,131, 80,180, 60, 61,159,240,115, 67, 90,178,169, 29,251,235,171, 43,121,113,213, + 39, 69, 12, 15, 63,198,249,124, 15,190,191, 85,132,131, 33, 67,183, 89, 32,104,114,186, 12,137,154,230, 32, 72, 59,154, 90, 33, +239,206,154,227,122, 71, 80, 58,203, 82, 85,144,128, 29,172, 6, 28,215, 27,211, 51,236,135,177,247,166,253, 41,246,224, 0, 85, +249, 57,183,155,181,118,125, 19,185, 22,205, 77, 55, 48, 77, 75, 77, 96,248,153, 37,237, 0,253,109, 39,104,226, 66,121,155,180, + 37,206,100, 36, 99, 20, 43, 90,104,198,118,142,178, 14,105, 63,115,158, 9,232,206,168, 93,237,144,225, 89, 90, 63, 6,250,247, +161,185,146,209,225, 47,118,180,183,128,252,125,236,204, 81,240,162,211,174,105,119, 61, 89,198, 68,172,119,170, 89, 22,250,171, +181, 1,134,122,218, 88, 96,194,134,115,115, 50, 30,233,217, 95, 81,196,233, 14,152, 14,250, 90,141,186, 22,128,205,166,153,109, +248,121,201,151, 26,188,238, 53,120, 89, 79,134,116,208,202,211,171, 32, 35,157,238,129, 94,251,103,212,189,240,197,217,153,250, +214,136,160,200,153,205, 22,188, 22,232,120,112,249, 22,203, 5, 39,125,192,187, 0,215,179,215,110,202,159,127,242,177, 60, 61, + 61,145,193, 0,171,149, 57,185,221,160,173,194, 82, 55, 6, 62,135,241, 48,145, 66, 98,150,193, 40, 96,192,120,128,176, 22, 86, + 43, 72,218, 20,145,161, 25, 75,198,165,195,132,147, 27,188,199,140, 99, 54, 96,154,149, 68,111,192,113, 28,125,195, 54, 46, 50, +143, 9, 26,241,172,215,116,223,194,125,194,153,195, 42,167,162, 69, 68,174,157,240,167,198, 78,223, 31, 13, 24,198,196,123,205, +138, 12,134, 3,217,219,233,202,112,134,120,182,226,115, 93,209,231,122,208,191,145, 7,119,238, 73,189,181,144,127,248,226, 49, +229,178, 83,215, 56,243,121, 79,216,245, 39,110, 45, 67, 49,171,192,166, 27,107, 74,162,218,122, 37, 93,235,160, 27,165, 83, 38, +165,178,197,177,131, 52,102,234,107, 29, 30, 60,164,255, 66,172,239,191,144, 45,112,197,132,201, 13,139,238,212, 7, 64,155,154, +121,228,243, 30, 96,194,246,250,122, 34,199,187,109, 45,152,242,244,221, 48,221, 5, 19, 55,194, 61,130,170, 93,198,233,229,195, +104,103, 49, 7, 53,180, 32,133,101,200, 6, 47, 19,228,153, 59,126,242,118, 71,126,243,213,169, 12,199,115, 54, 69,104, 74,233, +107,146, 15,248, 76,224, 89,169, 84,179,196,194, 64, 64, 11,215, 23,177,252,163,247,222, 37,253, 21,244,211,215, 24,201,175, 23, +242,246,163,135,210,236,222,149, 81,255,148,207,238,139,243, 27,205, 91,117,190,223, 63,255,248, 29, 45,248, 39, 26, 27, 17,118, +139,150, 96,177,222,210, 2,175,214,220,211,115, 60,145,156, 44, 12, 32,167,231, 3, 35,124,196,175,154, 95,226,152,126, 78,185, +233, 12,227, 4,132,139, 80, 20,195,127, 1,107,236, 5,153, 3, 66, 37, 86,100,221,235,254, 88,239, 61,118,238, 17,159, 13, 76, + 9, 11,185, 13,175, 37,114,140, 21, 39,218,104,196,122, 30,255,143, 95,189,228,248, 27, 15,227,157,110, 73,254,250,189,150, 86, + 49,121,249, 63, 63, 61,147,243,193,146, 55, 49, 22, 75,172,158,243, 85,222, 36, 90,125, 3, 48, 68, 73,196, 13, 1, 39,168, 56, +205,255, 58, 48,215, 30,183, 11,199, 78, 24,218,217, 64,197,127,124, 79, 43,235,234,140,163, 6,136,208,224, 26, 92,245,151,164, + 90,193, 5, 14,187, 3,208, 14, 80, 1,118, 91, 37,118, 46, 39,253, 37,171, 67, 54, 47,250, 63,184,193,136,251, 85,103, 66,143, +132,128, 81, 61, 30, 80, 40, 95,185, 56,197,155, 15, 97,139, 82,190, 46,187, 90,173, 69, 65, 36,159, 93,233,135, 47, 24,173,196, +248,199,214,229, 97, 36, 14, 96,135, 56,159,220,180,251, 75, 34,227,205,115,108,185,241,248, 30,128,148,199,251,128,215,110,234, + 45, 13,196,102, 33, 99,210,129, 1,247,179, 49, 53,228, 41,255,138, 17,138, 24,168, 15,215,164,144, 53, 16, 96,165, 24, 72,187, + 81,208,130,104,194,135,217,139,173,144, 25,206, 87,236, 92, 23,110, 92,101, 29,142, 1,160, 80, 53,211, 92, 36, 49,250, 32, 70, +196,192,233,172, 28,130,152, 32, 33,207, 18, 30, 84,254,254,237,239, 94,201,255,244,203, 71, 50, 36,176, 46,210, 36, 86,144,145, +254,254, 98,176, 70,239,197,157,232,193, 94, 91,198, 80,236, 27,106,210,211,110, 96, 55,187,144,238,209, 30,187, 41,140,168,164, +188, 16,125,155,226,205, 67,106, 20,239,239,102,165, 69, 62,127, 78, 15,244,140, 9, 17,138, 93, 19,237, 16,166,250,158,145,204, + 70,240, 84, 46,233,117,175,231, 77, 59,125, 97,227,115,116, 11, 75, 22, 80, 9,171,103,118, 46,220,221,165, 26,247,129, 51, 67, + 73,182, 32,176,196,233, 85,151,233,147, 60,227,247,249,142, 98,133, 32,131,132,158,161, 56,204,140,255,197, 88,145,150,154, 64, +136, 2,136,180, 54,170,218,146,139, 71,145,163,157,142,252,229,199,135,114,255,104, 71, 26, 90, 40, 97,223,138,159,143,241, 33, +185,220,250,153,207, 46, 7,210,159, 60,151,229,124, 44, 43,232,236, 23,106,242,234,188,199,135,157,227,115,152, 93,128,134,146, +203,185, 14,201,118,232,213,114, 69,238,119, 43, 20,111,249,234,245, 13,147, 50,126, 54,237, 68, 99,147,148,220,176, 50,143,165, +169,221, 92,234,254,150,139,115, 28,155, 82,158, 53, 50, 20, 62,118,124,120,255,152,240,120,105,113, 35,102,251, 88, 68,197,237, +174, 13,174, 43,212, 28,151,161,125, 29, 13, 93, 82,224,159, 3,197,165,191,143, 28, 38, 34,240, 45, 80,111, 76,228,123, 11, 42, + 12, 2, 83,137,163,252, 36,239,143,141, 42,215,122, 43,106, 90, 72, 35, 81,167,239, 37,195,142, 39, 34,189,209, 24, 22, 38, 58, + 3,170, 38, 10, 0, 4,118,156, 77,120, 34,228,253,128,230, 43,133, 66, 66,153, 87,179,111,181,207,131,243, 12,212, 55, 70,191, +185,108, 66,197,180,197,194,232,123,247,247, 90,228, 20, 31,116,155, 44,180,166,224, 13,235,153,135, 70, 1,199,141, 72,148,209, + 82,187,251,172,148,161, 45,143,169,139, 94,155,163,253,125,249,250,251, 39, 60, 27,129,163,162, 14,198, 99, 7,124,138,185,134, +233,207, 35,202, 79,227,122, 66,172,169,211,168,106,193,159,161, 30, 0, 10,114, 80, 70,215,235, 91, 82,236, 16,207,252,141,111, +212, 90,167, 44,185, 70, 33, 5,121, 87,174, 74, 2,222, 43, 12,226, 40,115, 26,218,132, 8,254,236, 30,171, 74, 49, 71, 56,119, +206,241,252,135, 49, 56,236, 6,146, 52, 77,126,182, 14,250,251,152, 83,181, 32,237,212, 19,187, 79,180,229,213,179, 57,211,103, + 9,202,136,144,133, 13, 93, 97,201,162, 88, 19, 80, 20, 22, 72,111,186,190,190,150, 7,199,199, 84,153,195,228, 99, 79,207, 60, +168,176,183,125,237, 58,181,104,130,183,220, 3, 45,196, 31,191, 58, 99, 49, 13,122, 84,156,130,248, 48,125,157, 25,195,130, 35, +125,196, 38,207,254, 11,116, 57, 11,107,223,149,138, 0,102,133,198,136,162,128, 10,174, 7,166, 16, 96,101,104, 34,109, 55,218, +242,240,120, 95,187,219, 10,239, 55,146, 49, 98, 0,174, 15, 38, 80, 60,231,122, 95,105,216, 66, 59, 96,155, 6,239,117,107,114, + 51, 9,249,156, 35,222,162, 72,234, 52,202,156,138,141,157, 24, 83, 89,166, 84,236, 92,108,108,250,132,226, 10,197,112, 85,223, +235,207,126,122, 44, 95,124,115, 66,128, 28, 96,173,154,122,244,218,248,122,111, 87, 26, 67,245,217,213,226, 2, 13, 30,116, 66, +128,111, 66, 51,208,215,100,142,213, 14,174,231,221,131, 61,121,126,114, 34, 35,189, 86,191,255,234, 43,237,232,235,242,238,189, + 67,201, 44,110,100,168, 49, 18,211, 30, 76, 70,155,245,170,220,221,235,112,237,133,248, 62,214,183,246,252,244,134,133, 2,232, +156,141,214,174, 94,139,153,220,220, 94, 82, 63,101,161,141, 26,168,157, 4,164,235,243,143,127,208,201,195,119, 30, 77, 33,158, + 57, 76,128,154,213, 10, 39,125,208, 19,129, 12, 47,166,135,165,156, 41, 61,194,204, 12,107,213, 57, 76,114, 42, 21,107,180,176, +107,215,103,232, 70,243,220,253,195, 7,146,185, 30,173,229,157,227,154,188,187, 95,149,125, 56,212,104, 64,190, 90, 24,255,173, +158,207,216,126, 46,178,153, 61,111,174,235, 6,109,173, 30,147,162,134, 93, 7, 69, 41, 60,179,188,203, 17, 48,131, 49,147,167, +157,247, 76,254,248,122,192, 49, 60,146, 21,192, 93,251,181,156, 60,191,156,200,179,235,185, 86,219, 1,229,100,247, 31, 21, 52, +248,101,228,112,175,194,132,141,145,206, 87,207, 7,114,187,236,201,145, 6, 74, 8, 91,224, 85, 39,129,237, 9, 49,194,205,108, + 50, 78,169, 46, 36, 26,147, 72, 94,103, 84,130, 36,189,187,219,145,134, 94,152, 31,191,119,199, 30, 38, 10, 41,216, 94, 50, 77, + 28,180,176,100,135,157, 53,245, 43, 0,177,144, 88,194, 37,215, 17, 87, 51, 39,180,194,234,212,124,164, 51,220,165, 71, 68,190, + 99,109,193, 68,228,124,161,233,191,227,219,184, 19,213, 33,104, 21,139,141, 33,199,161,163,143,247,135,110, 22, 7,169, 91,133, +121, 76,196, 32, 3,205,241,177, 86,173, 19,189,249,122,246,136,180,167,144, 9, 85,181,204, 78, 19, 19,129, 14, 20,116,244,129, +186,209, 96, 87,202, 23,185,175,245,161,253,236,155, 35,152,239,140,112, 0,182,249,213, 87, 23,242,193,113, 91, 62,121,180, 67, +190,249, 92, 19,197,171,193,130,236, 0, 60, 71,120,223, 72, 30, 25,238,254,109,172,134, 29,127,134, 58,208, 27,125,240, 43,154, +208,235, 4, 42,125,113,185,148,145,182,250, 55,250,230,178, 64, 70, 69, 48,227,153,234,223,193, 90,114,197,194, 45,212,130, 34, + 91,172,114, 76, 79, 47,100,151,156, 8,218,114,255, 32, 0, 97, 92,154, 26, 33,144,229,192, 66, 49, 33, 56,142,254,209, 98,170, + 91,236,250, 92, 87,138,213, 14,120,217,126, 58,234,142, 98,103,128, 18,110,247,195,158,216, 62,142,220,113, 6,124,195, 99, 16, + 77, 15, 3, 26, 77,156,237,102,141,123, 63,140,186,204,223,192, 88, 1,161,243,187, 6,162,190, 80, 44,218, 30, 31, 10,114, 26, +200,254,240,221, 99,142,239,107,213,170, 41,142,225,103,130, 58, 9,165, 17,207,204, 35,224, 44,133,194, 1, 43,134,131,110, 91, + 46,135,115,242,224,205,182,119,195,192, 12,225, 26, 32,101,155,181,188,188,127,255, 62,131,219,204, 89,173,206,180,242,158,173, + 22,188,159,192, 28,144,230,197, 29,123,214, 25, 92, 88,183,132,192,201,207,149, 49, 22, 6, 10, 59,147, 72, 53,128, 93,106,246, + 16, 37,198,144,224,245, 21, 27,179, 27,187, 36,107, 29,186, 3,112,226,252,155,181,165, 37, 30, 74,195, 98,124, 31, 25, 62, 6, +223,139, 66,138, 62, 11,235,152,123, 74,195,176,228,244,253,216,248, 28, 22,149,152,112,197,206,157, 12,247, 13,231, 27, 26,241, +153,196, 1,192, 98,155, 23,148,181,152,165, 15, 61,180,232, 65,231, 89,154,166,117, 46,103, 46,133,237, 90,145, 69, 57,138,251, +251, 7,117, 22,100, 21, 76, 14,181, 59,245,245,236,174,169,129,178,230,120, 25, 19, 27,128,212, 96, 73, 58,215,235,135, 36,142, + 88,176,187,187, 39,215,131,161,204,167, 19,198, 5,248,112, 23,194, 60,215, 8,104, 16,104, 72, 3,224, 40,180, 35,198,176, 72, + 93,242,103,129, 42, 7,177, 31, 40,185,129, 66,248,209,123, 15,228,213,201,185,156,157, 92,176,207,134,132, 52, 78, 50,252,176, + 86, 94,188,229, 53, 18, 3,128,162,113, 99,226, 48, 72,104, 72,214,177,187,174,137,188,193, 41, 18,128,152,196, 46,246, 88,199, +235,113,194,233,177,176,242, 99,113,104,102, 99,255, 36,212, 20, 40,178,104,202,103,243,198, 12,208, 88,216,105,212,245, 30, 93, +219, 52, 68, 19, 90, 76,176,212,138, 32, 83,196,138,211,139,115, 57,220,191, 35, 65,177,166,223,155,149, 23, 47,191,148,200,203, +147,226,246,238,195,123,212,133, 63,208,164, 7,186,101,134,205,152,219,201, 98,125,161, 69,233,201,213,112, 43,118, 66, 70, 18, +142, 23,252, 33,242, 89,167,155, 96,184, 8,240,198,193,108, 0,218,159,205, 23, 29, 32, 51,154,188,170, 84,109,195,250,228, 84, +155, 70,216,195, 34,113, 45,214,230, 66,199,137, 84,104,235, 17,174, 64, 2, 51,213,129, 44,119,165, 52,213,179, 80, 50, 63,120, +253,153, 48, 51,194, 20,245,226,182,207, 66, 62,155, 44,100, 6,237,249, 76,158, 73, 29,102, 47,184,212,104, 66,158,143, 55,242, +191,255,171, 47,228,151,191,184, 43,143, 31,247,100, 48, 79,168,255, 95,171,228,228,244,106, 44,189, 1, 36,175, 3, 82, 71,209, + 32, 82, 46, 86,147, 35, 26, 59, 80, 92, 75, 90,128, 3,105, 14, 0, 28, 30, 17, 36,254,211,179, 11,121,121,114, 38,127,250,227, +247,181, 25,168,106,242,191,101,220, 25, 79,103,230,126,167,201, 29, 52,234, 98, 30, 66,110, 45, 57,237, 45,100, 60, 25,145, 98, + 89,107,117, 8,220, 93, 77,111,229,201,243, 19,230, 22,207, 81,193,151, 90, 45,131,199, 62,155, 21, 41,165,141,226, 40,235, 28, + 22, 17,159,214,108, 68, 98,238,212, 17,158,160,170,135,189,252, 77,127,201,149,226,209, 91, 29,217,237,180,184,190, 0, 99,237, +238,189, 2, 5,157, 50,255,252, 79, 15, 52, 81, 20,181, 2, 89,209, 98, 14, 86,113,127, 60, 31, 82, 87,182,219,204,201,173, 6, +113, 80, 14, 18,183,239, 33,229,194,224,144,252,179, 57,198, 23,161,141, 93,240, 43, 67,218,106,204, 47,132, 72,204,151,154,208, +255,183,191,123,197,132,241,222,113, 83,254,151,127,254, 30, 19,249,135, 26,244,166, 51,236, 82, 97,129,166,193, 83,171,244,213, + 76, 43,142,122,142, 95,187,153,194,236, 61,166,143, 52, 60,178,209,173,130, 90,179,134, 99,219,114, 99,212,181,112,177,165, 17, +161, 59,128, 85, 32,129, 56, 24,199,131, 15, 21, 36,148,139, 37,176,128, 34, 46,209, 86, 5,205,248,239, 6, 94,203, 18,136,103, + 50,184,230, 11,172,157,235,100, 32,181,182, 86,240,197, 22,119,218,212,182,231, 5,199,235,198,110,220,100,232,112, 32,107,195, +200,161,134, 19,211,240,166, 55, 55,199,166, 33, 19, 44,222, 83, 46,103,154,224, 40, 80,240,247, 77,141, 18, 95, 13,128,240, 61, +166,180,109, 93,139,132,123, 59, 77, 34,137,135,121,120,211, 11,247,183, 36, 39,121,105,215,106,128,177, 74,161,200, 0,145, 13, +178, 46,184,152, 53,104,226, 57,126,174,103,254,234,255,215,255,243, 84,238,116, 74,180,113, 69,213,119,126, 59,213,107,161,221, + 97, 49,103, 65,125, 35, 78, 9, 43, 35,215,183, 67, 57, 25,222, 72,112,154,112,202,176,247,243, 3, 73,138,121,121,185, 46, 73, +185,221,146,205,176,175, 7,122,101,171, 5, 61,196, 99,173,126,111,180, 60,197,195,129,162, 8, 59, 47, 36, 0,140,140,231,110, + 20, 14,101,167,124,190,184,213, 53, 64, 98, 77,220,232, 46,227,190,214,119,172, 10,115, 56, 11, 56, 90,181, 61,176,239, 64, 91, + 6, 2, 2, 7,152, 78, 98,164, 41,109,182,116, 45,252, 6, 65,152,227, 67,131, 36, 57,250,151,105,223, 35,176,123,190,241,249, + 95,159, 95,202,243,114, 40, 21,253,124,213,138,129,167,182, 90,137,137, 1,207,176, 23,197,142,255,242,124,198,174,210, 84,226, + 60, 78,150, 40,192, 65, 90, 89,196,100, 22, 56, 16, 84,232, 70,143,135,237,188,236,182,202, 90,249, 87,229,115, 45,188,232,169, +238, 68, 34,210,137, 16, 12, 48,176, 35, 27,234,223,219, 72,217,212,160, 80, 28,161,147,247, 29,101, 20,220, 94, 34,255,169,211, +224,191,145,169,117,130, 55,190,103, 5, 9,121,245,145, 37,252,196,237,104, 19,151,228, 29, 68,203,117, 91,182,178, 50,213,169, + 96,123,166,112,125,224, 14,200,235,229,191,209,114, 32,187, 32, 52, 19,141,217, 98, 77,244, 51,138, 23, 80,155,140, 22,107,197, + 46,180,218,231,107,167, 76,233, 40,108, 25,135, 35,201, 56, 80, 35,245, 44, 22,107, 22,193,216,237,115, 90, 19, 24,198,128, 66, + 37,152,248,105,194,192,179,129, 41, 21,192, 66, 0,219,130, 23,141,247, 80,167,176,143, 48,120, 17,196,149, 49,140, 11, 30,196, +201,124,198,226,168,214,232,104, 66,169,176,171, 63, 62, 60,148,167, 79,159,154, 24, 72,108,153, 23,147, 61, 36,116,220,104,116, + 63,199,221,186, 38,145, 25,187, 37,208,110, 1, 32, 44,107,129, 13, 32, 47,174,245,203,171,145,100, 10,101,129, 23, 11,226,154, +161, 3, 76,112, 11, 83, 60,150, 60, 16, 38,210,247, 11,165,199, 13, 39, 15,250,153,181,232,136, 66,120, 35, 44, 56, 74, 77,125, +239,125,135, 34, 39,155,193,233, 27,136,163,220, 58,173, 23,113, 3, 78, 43,150, 76,181,102,235,176,134,120, 91, 41,151,120,118, +218,205, 6,169,123,128,235,195,225, 50,212,235,143,251, 84,175,215,229,228,236,156, 52, 57,236,111, 87, 90,144,191, 60,121, 77, +253,243, 92, 80,144,139,155, 27, 38,161,195,189, 59,242,205,183, 55,114,118,122,193, 36, 61,231,170,211,222, 19,139, 50,125, 31, + 63,121,120,192,194, 12,111, 14,252,246, 66, 46,179,181,245,245,157,164, 54,238,177,233, 12,192,160,102,227,240, 33,177, 60,127, +125,110,170,115, 0,163,149, 27,114,114,121,201,134,135,146,201, 16, 90,114,103, 12,152,140,227,189,150,180, 52, 62,189,188,154, +114, 90,131, 66,235,238, 94,193,237,192, 51,140, 7,151,131,145,233, 80,232, 85,159, 76,135,108, 66,186, 90,148,148, 53, 6,161, + 97, 4,150,160,204,102, 50,144,138, 62,148,151, 23, 19, 59,171,155, 5,119,212,148, 92,158,207,248,124,173,146,165,212, 27, 59, + 44, 46, 66,106, 42, 84,120,239,121,230,245,179, 63,126,249, 82, 58,205, 22, 25, 76, 76,192,144,234, 30, 15,228,215, 95,252, 81, +206,245, 92,253,232,126, 87,175,251,140,159,163, 63,153,115, 66, 85,215,107, 74, 60,128, 38,213, 15,170, 69, 57,239, 77,121,221, + 59,221,174,116,245,121, 23,205, 35,237,189, 68, 6,183, 55, 92,231,224,140, 83, 77, 82,239,225,219,247,246,229,249,217, 13, 99, + 23,168,176,188, 23,177,207,162,198,214, 32, 9,233,184, 96, 18, 97, 95, 15,108, 20, 80,254, 95, 61,121, 37,207, 78, 46, 37, 92, + 78, 36, 95,110, 75,167,189,171,205,149, 62,227,127,249,168, 43, 79,123, 51,121,113, 61,162,215,113,167, 81, 51,177,127,125, 24, +134,115,227, 77,162, 10,244,157,168,125,186,235, 20,215,233, 2,249, 77, 48, 76,108,227,119, 90,121,106, 5,146,209, 27, 95,201, +122,206,182,209, 30,106,140,174, 4,122,183,122, 54, 10,154,104,242, 37,125,112, 94, 64,124,160, 36,137, 62,212,183, 90,137, 7, +250, 11,240,183,127,255,237, 21, 59, 62, 4, 65,104, 70, 99,103,178,210,206, 63,175, 9,232,124,182,226, 3,218,108, 86,141,250, +177, 49,180, 47,246,217,184,145,236,154, 0, 10,211,247, 17,229,172,123,193, 5, 34, 39, 56, 50,100, 34, 59,155, 31,252,147,152, +213,184, 27, 5,235,197,142, 23,114, 80,174,201,163,118, 44,191,250,190,207,106, 20,251, 14, 96, 0,240, 47,246, 35,188,232,224, + 38, 34, 41,162, 83, 14,156,190, 51,105, 70, 89, 62, 88,182,217,132, 63,121,134, 59, 72, 92, 7, 36,190, 78,181, 36, 7,213,144, +137,104,166,215,122,183,136, 57,254, 76, 11, 38, 61,172, 85, 13,118, 81,137, 69, 3,170,180,112, 99, 72,127,223, 61,249,232, 90, + 9,226,163,221, 98,100, 0, 69,223,130, 35,167, 40, 12, 34, 17,121,207,151, 55, 19,249, 71,237,216,255,251,159, 31,147, 3,121, + 59,117, 90,222,155,128,157, 35, 45, 91, 55, 27,114,225,123,183, 51,233,221,192, 89,110,194,113,210,255,253,233,169,188,253,238, +158,228,181,218,191,185,121, 45,125,237,126, 38,240, 17, 23,235, 84, 61, 7,161, 65,193,146,238, 9,217, 49, 51,232,153, 48, 14, + 69, 51,156,192, 10,170,236,192,249, 72,207, 52, 48, 21,176, 2,208,135, 94,220,168,189, 90,201, 56,119, 53,235, 82,124, 71,243, + 73, 91,157,244, 30,197,137,169, 78, 17, 24,231,232, 63,236, 6,157,234, 89, 42, 60,130, 81,188, 32,200,102,205,195,156,174, 99, +232,248,203, 69, 43,226, 88,212, 64,215, 63,107, 62,245,177, 57,163,101, 3, 59, 16, 24,231, 1,149,139, 81, 97, 42, 53, 35,219, +245,142,233,131, 27,226,220,219,106,177, 3,253,141,196,254,105,108,212, 55,252,105,173, 92,113, 43,156, 88,142,247,187,196,165, + 12, 39, 99,227, 64,251,214,229,193,104,133, 43, 2,207,174, 41,186,188,208,225, 47, 80,144,226,253,226,154,227, 92,209,107, 29, +188,114,120, 71,235,185, 26,106,165,158, 56,134,138,231,146,170,108,173, 62,237,247,145,243,119,224,222,214,247, 28,167,221, 64, +125,246,153,146,237,136,223,243, 29,215, 29,139,183,200, 38, 3,152, 54,249,206, 18, 25,171, 10,116,173, 40,222, 41,160,161,207, +196,112, 22,211,217, 12,227, 99, 4,234,213, 90,139,212,146,105,199, 67, 61,174,234, 71,252,156,208,138, 88,227,218, 64,221,110, +185, 50, 69, 51,125,173, 35, 13,208, 16,170, 66, 44,193,231,198, 84,224,242,118,198, 17,239,100, 22, 51, 89, 84,203,144,251, 92, + 72,206,131,203,217,138,103, 20, 69, 44,220, 7,151,139,169, 62, 62, 99, 67,171,103, 67,118,222,245, 90, 67, 99,202,200,105, 85, +192,193, 42,225,152, 54,230,216,211, 62, 7, 24, 54, 11,208,222,138,198,253,118, 83,114,238, 55,129, 98, 71,162,252,232,131,183, +180,243,237,201,116, 48, 54,182,141,216, 56, 30, 9, 0, 0, 92, 58,154, 73,134, 32, 94, 22,161,232, 68,193,166,160, 71,106, 22, + 27,121,119, 95, 83, 28,188, 77,172, 98,223, 40,169,129,187,231,156,162, 80, 77, 80,220,125, 48,107,218,216,105, 21, 96, 69, 83, +172,213,217, 53, 67,121, 12,138,105,144,110,205,208, 40, 72,248,124, 79, 86,125,247,252,123,188,222,152, 22, 34,238,193,197, 12, + 76,134,235, 73, 40,143,159,126, 39,143,238,252,181, 28,223,125, 75,147,194,153,254,236,153,197, 77,171, 58,220,164, 6, 84,191, +103, 46,214,155,106, 30,113,123,145,137,201,164,222,240,190,251,122,160,184,241,108,102,124, 3,250, 1,253, 15,122,112,167,115, + 40,123,133, 38, 53, 39, 64,216,136,162,128, 46,133,121,174,164,244,235,155, 1,197, 84, 48, 94,199, 10,182,156,247, 8,186,123, +118,214,147, 59,251,187,100, 24, 65,254, 21,207, 6,206,238,120,216,231,168, 25, 6, 51,235, 56, 67,154, 26,138,184, 5, 38, 94, + 97,150,211, 35,116,179,175,207, 7, 50, 94, 38,252,236,208,185,192,123,234, 54, 74,156, 66,140,250, 83, 41,150, 59, 98, 82, 40, +214, 0, 96, 90,137,226,144,207,165,216, 52,240, 6, 76, 11,210, 30,215,108, 26,128,140,255,250,241, 99,210, 56, 31, 30,182,165, +158,159,217,228, 12, 19,107,128,253,244,107,176,146,171,104,129,114,247,176,193, 93,250, 89,111, 46,207, 95,206,244, 58, 32,233, +118, 53,246, 84,244,245,175, 73, 33,172,149, 12,200,125, 53, 88,240,108,224,158, 70,174, 73,197,231, 13, 35,243,155,231,228,114, + 99,147,232,141, 3,108, 3,183,131, 34,231,237,227, 93,185, 25,250,196, 60,129, 41,129, 98, 62,243,244,108, 32, 47, 70,144, 92, + 12, 73,107, 64,194,131,168, 62,110, 16, 70,101, 24,167,192, 81,204,226,174, 73,183, 58,242, 5,119, 84,208, 38,223,104, 39, 7, + 30,115, 12,154,149, 73,143,177,226,242,196, 0, 68, 68,195, 3,164, 5,223,234,101,104,230, 5,250, 0, 45,198,107,249,244,171, + 43,121,247,110, 91, 10,250, 61, 55, 83,243, 79,134,185,202,231, 47, 71, 60, 48,141, 74,150,163, 19, 80,159,170,160, 78,212,178, +146,228,114, 68, 93,226, 1,206,145,130, 19,114,132, 23, 69, 6,246, 9,152, 88, 12, 29, 13, 26, 10,170, 76,116,251,116, 50,139, +140,114,183,213, 3, 35,216,202,185,206, 37,206, 8,100,173,149, 92, 33,145,111, 78,135,242,241, 49,196, 55, 2,121,126,179,148, +187, 59,120, 15, 57, 55,102,183, 46,135,206, 70,126,224, 16,153, 70,185,163,119,117, 98, 11,180, 48,118,210,157, 12,154, 49, 63, + 7, 14,201, 65,197, 39, 61, 13,171,136,139,254, 68,222,213, 67,112,111,191, 41,191, 59,157,176,226,131,224, 0, 14, 11,246, 77, + 87,131, 25, 63, 91, 18,155, 14,189,117,108,218,105, 66, 69,137,227,188,144,234, 91, 28,137,194, 81, 43,137,156, 70,184,167,197, + 68, 78,254,254, 15,167,114,212, 46,112,140, 9, 58, 6,198, 77,102, 7,152,112,100,153, 35,175, 28,168,209, 80, 43,216, 58, 17, +251,173, 90, 94,142,238,237, 74,165,214,182, 93, 28,252,203, 97, 41,234,219,222, 30,238,106, 75,103, 57, 90, 46,150,173,168,194, +232,220,237,112,211,105, 65,194,251,178,217,162,174,125,215,137,115,133, 1,117,164,196,170, 85,187,160, 30,185,161,134, 10,150, + 45,142, 3,149,173,183, 45, 86, 28,168,200, 55, 20, 43,246,216, 28,231, 33, 97,164, 29, 62, 11,189,136,187,124,130,242,208,157, +106,245,139,209, 55,184,175,199,119,246,165,213,174,243,108,179,235,119, 62,234, 4,139, 69, 27,135, 46,143,105,148,209,143,237, +172,164, 96,184, 92,198,198,183, 84,212, 66, 96, 78, 76,172,133, 90,218,137, 21, 18,165,114,153, 15, 62,206, 83, 77,187, 0, 0, +229,128,132, 69, 20,203, 57,144,156,231,180,250,197, 51, 97,155,130,147, 23,205, 58, 32, 96,134,114,161,230, 92,136, 73, 18, 19, +160, 27,225,211,189,208, 21,213,246,186, 22, 8, 88,160,120,118,197,210, 21, 83,250,117, 54,133, 72,149, 32,237,226, 18,233,157, + 56, 53,170, 20,120,199,238, 95,152, 44,225, 39,142,157,112,146,100,236,158,107,144, 70, 34, 4,128,118, 53, 11,249,117, 68,108, +139,105, 79,155,153, 76,134,193,202,246,210, 66, 1, 35, 72, 68,103, 28,239,121,200,239, 51, 42, 24,206,147,137,123,196,124,182, + 47,110, 87, 50, 94,152, 35, 28,112, 34, 79,110, 34,249,232, 80,159,111,141, 63,163,201,194,188,221, 3,113,235, 22,232,207,235, +107,232,249, 69,247,138,187,184,208,110, 25, 69, 65,171,213, 97,241,214,104, 54,101, 79, 63,195,139,179, 51, 34,133, 3,135,180, + 7, 67, 1,138,106,167,253,165, 91,211, 0,168,152,103, 96,207,225, 94, 96,244,138,209, 55,232, 98,116,205,195,139,230, 88,160, +123,252, 60, 14,196,198,238,219,196,109, 54,209,138,116, 84,244,146, 27,174, 52, 98, 91,105,121,206,111, 34, 77,130,190, 1, 7, + 65,152,231,115,224,164,122, 17,176,115, 57, 3,254,154,116, 50,232,107, 49,187,113,104,255,167, 58, 10, 80, 29,132,252, 49,116, +198,203,197,174, 38,146,130, 51, 10, 17,198, 67,172,229,182,231, 74, 12,239,131,102, 2, 46,109,197, 76,196,162,202, 11,231,210, +191, 57,211, 55, 84,149, 71,119,239,202,228,155,239,201,146, 65,161,106, 12, 6,159,231, 27,187,241, 57,100,151,193,154,136, 61, +183,247,182,164, 13,109,126, 83, 3,180, 9, 72,192, 9,196,138, 22,187, 48, 72, 33, 43, 40, 11, 35,174, 60, 19,221,219,111,125, + 32,205,106,129, 35,123, 92,111, 76, 42,129,191,201,195,249, 76, 11,143,254,112, 70, 67,153, 7, 7, 77,114,214, 71,139,107, 41, + 5, 27,105,148,214,242,251, 87, 19,138, 53,197, 27, 45, 20,244,207,128,254, 71,119, 12,199, 54,143, 83, 41, 80, 89,225, 5,144, +215, 2, 87,147,114, 57, 39,154,145,228,118, 50,226,115,215,170,102,101, 26,198,204, 17, 59, 13, 80,253,214, 28,131,207,181,177, + 72,216,173,235,243, 88,177,216,138,157, 57, 41,159, 88,183,105,241, 15,218,109, 26, 67,160,113, 15, 57,218,223,126,254,133, 44, +151,239,202,253,195, 29,109,192,132, 0, 91, 38, 94,172, 46,245,254,105,216, 97, 49,130, 81,248, 59,250,235,234,102, 42,253,241, + 80,194, 66,137, 19,205,253,195, 99,109,102, 42,210,187,190,164,199,202,116, 17,145, 29, 83,211,247,135,201,146, 97, 52, 76,112, +136,192, 64, 42,208, 89,241, 1, 69, 81,159, 14,111, 38,131,252,228,213,153,228,242,101,105,105, 67,180,187,147,231, 73,203,188, +208,132,209,155,174,233, 25, 59,210, 7,110,180,184,213,139,181,161,159,120, 76,148,111, 68, 17,132, 20, 36, 39,110,192,233, 39, +246, 16, 3, 29,125, 49,152,243,200,131, 99, 14, 66, 39, 68, 15,176,195, 68,231,254,240,192,136,246, 56,116, 13, 77,206,207, 95, + 12,136,120,245, 16, 52,103,145, 28,236,183,164,191, 48,194,253,120,169, 15,221, 36,228, 72,228,222, 65, 75,122, 35,243,122, 30, + 77,150, 50,242, 86, 18,233,247, 87,154,101,233, 13,215,212,229, 53,132,189,176, 26,198, 46, 2,114,134,157,122,158,224,190, 8, +242,172,122,163,159, 93,173,120,227,124,253, 59,128,217,146,216,198,178,180, 44,117, 84,160,254,120,197, 7, 29, 93, 23,192, 99, +111,233,123,254,249, 59, 59,242,245,171,158,124,123,218, 23, 63,246, 13,196, 54,158,203, 8, 86,144,129,239, 64,118,166, 7,141, + 34, 37, 74, 82, 58, 80, 10, 94,242, 77,214, 48,140,216,225,103, 51, 21,118, 95,216,167,195, 0, 37,136,215,242,182, 86,123,127, + 56,155,218,200, 89,111, 98, 11,186,214,131,144, 85, 88, 16,228,152, 68,206,122, 67, 45,178, 38,250, 80,229,184,119, 78, 53,184, +119, 43,101,178, 15, 24,224, 56,204, 50,167, 30, 82,232, 16,130,130, 28,163, 56,120,214, 55,183, 35,249,155,223, 62, 99,176,233, +141,180,211,233,143,185, 59, 70, 50,207, 56,221,111,136,247, 80, 62, 87, 79,100,163,145,151, 59,247, 26,156,124, 64, 44, 7, 9, + 29, 9,212,243,205,130,118, 29, 46,200,235,204,102,179,142, 51,238,220,251, 66, 3,165, 17,133,237,184,209,158, 67,102,211, 28, + 4,213,188,159, 88, 21, 15,243, 14,135,116,143, 93,226,244, 28,128,145,206, 99,219,132,101, 0,186, 20,237,158, 34,191,253,146, +249,124, 39, 14,216, 72, 23, 35,140, 34, 53, 57, 34,105,162,130, 6,184,142, 35, 62,173,226,171,154, 92,161,221,140, 7,179,232, +246,212,220, 37,186,100,108,210,177,166,214,133, 36, 10,121,198,239, 53,128,149, 52, 64,100,244, 65,194,231, 5,245, 9, 96, 29, +234, 77, 59,218,100, 54, 12,183,232,244, 12, 86, 33, 65, 81,114,229, 42, 71,237,229, 18, 20, 22, 43,110, 7, 31,200,110,173, 70, + 44, 72, 81, 19, 35,198,123, 64,218,214,232,242,180,214,115, 91,149, 37,168, 80, 90,173, 35, 72,162,136,145,124, 66, 93,106,156, + 3, 36,192, 12, 65,168,129,123, 2,133,103, 1, 99,231,196, 21, 76,203,112,237, 84,241, 76, 74,216, 51,223, 68,135,135,241,204, +231,220, 25, 20,121, 84, 24,244,157,250,153,255,255, 81,213, 35,158, 33,182,169, 11,186, 59,156, 97, 78, 38,178, 70, 93,221,184, +105,138, 83,169,148,153,191,118,218,243, 30,207,110, 1, 84, 72, 13,220,207,207,151,114,176, 83,227,251, 6,213,200,168,118, 32, +253, 10, 71,235,233, 42, 12,231,231, 85,111,194,245, 16,254,108, 78,219, 81, 61,119, 26,143, 38,171,188,220,237, 22,228, 15, 47, + 70,124,255, 13,125,254, 7,195,169, 94,175,178,182,166, 43,114,221,177, 80,221,237,182,228,228,226,146,123,101, 20,207,136, 5, +152,165, 20,202, 77,189,198, 19, 94, 83, 76,181,204, 23, 29,224,205,162,232, 37,167, 62, 71, 20, 26,215, 26,199, 16,248, 22,236, +126, 97,138,132,253,106, 79, 11,218,225,116, 40, 77,136, 21,117, 31,200,217,249,149,204, 16, 7, 28,154,253,174,158,183,253, 78, + 87, 46,175,175, 40, 0, 66,209, 23,116,239,197,146,158,199, 21, 45, 87,163,136,254,162,140,167, 88, 63,145,122, 20, 69, 91, 35, + 44,220, 99,143,148,172, 60,187,101, 60, 31,104, 12, 32,203, 12,170,108,214,241,237,113,223,242,100,142,100,216, 81, 94,235,123, +219,209,152,145,132,218,161,105, 66,187, 29,106, 71,171, 73, 12,207, 3,238, 29,132,143, 0,116, 92,129,110, 8,107,214, 82, 36, + 15, 52,201, 76,244,179,207,166,125,201, 85,139,114,247,248, 1, 1,173,160,117, 46, 66,243,185, 48, 55, 54,179,134, 61,187, 25, +235,231,159, 17,248,139,184,141,243,135, 49,188, 73, 15,155, 62, 4, 70,198,141,106,137,215, 3, 9,183, 89, 41,177,145,202,210, +216,197, 48, 28, 3,141,177,232, 72, 79,207, 78,201, 47,199, 20, 2,120, 0,176,163, 16,251, 81,100,117,244, 89,217,109, 2,239, +210,148,146,118,235,191,253,238, 84,254,217,199,199,218,244,237,211,225,237,195,125,125,222,163,166,124,167,205, 22, 94, 15, 50, +209,165,156, 25,142, 29,237,182,228,195,183,118,181,190,209,164,251,245,149,220,251,197, 3,153,252,221,151,114,255, 81, 91,246, + 52,150, 79, 53, 79,157,126,215,147,243,155,137,124,252,225, 67, 57,189, 50,107,106, 2,117, 89, 84, 89,225,153,117,204, 28, 0, + 78, 67, 61,195, 40,168, 80, 56,193, 85, 17, 64, 58,200,185, 30,236,116,229,249,171,215,242,252,245,169,252,242,231,159,200, 97, +179, 68,192,166,239, 25,165,116,185,140,141,226,156,216, 40,238,104, 87, 27,195,102, 40,167,151, 83,125, 6, 50, 60,231,173,238, +142,118,244, 21,185,189, 58,167,158, 62,223, 71, 37,207, 34, 26,130, 92,112, 63, 4,203,164, 81, 45,144, 85,130,247,132,184, 10, +172, 21,116, 71, 2,103,187, 13,236, 73,189, 14, 19,152, 27,217,217,211,248, 86,210, 24,241,235,167,125, 57,189,153,155,110,110, + 22, 26,205, 85,126,200,239,207, 71, 28, 31,101,221, 88,197, 22,155, 34,222,246, 95, 7,156,211, 64,246,100,176, 97,151,159,112, +204,100, 50,124,120, 80,209,209,188,125,152,231, 13,226,200, 84,131,195, 55,250,112, 50,134,235,255,212, 43, 57,142, 64,168,202, +228,198,152,141,114,158,135,106, 71,127,118, 67, 15, 93, 79, 19, 16, 16,211,120, 45,160,228,241, 97, 58,141,162, 73,113,102,131, +173, 8,137,217,221, 37,220,205, 80, 70,149,129, 54,144, 71, 59,182,207, 93, 97,231,137, 93, 90,198,219, 78, 82,151, 20,205,217, +200,239,159,220,202,229, 96, 45, 31, 62,104,105, 50,239,202,113,167,204, 4,216,173, 21,244,225,153,203, 42,179,144,111, 46,110, +228, 12, 43,138,217,194,228,103, 37, 29,113, 38,219,125, 49,186, 3, 88,223,197,146,202,116,190, 81,195,203, 6,182, 55,195, 56, +173,160, 5,211,116, 55, 35,159, 52,187,146,209,235,174,103,128,239,255,245,235, 43,249,242,105,143, 52, 12,140, 34,191,121,213, +151, 23, 23, 19,162,108, 61, 89,184,125,185,207, 17, 54, 18,101, 24,135,236, 60,168,203,204,138,149,150, 16,100, 39, 80,172, 6, +163, 69, 77,210,155,120,169, 15,231,140, 29,126, 64, 16, 91,222,186,226,216,140,106,150,235, 5, 17,192,185,130, 22, 1,122, 77, + 43,149,128, 35, 93, 84,138,133,194,202,129,209,132, 2, 11,129,111, 0, 14, 8, 55,172,156,134,185,117,172,150,212, 17,152,124, +223,246,106,168, 96,211,206,153,158, 1,190,117, 39, 5,231, 27,157, 26, 31, 32, 40, 19,164, 24,134, 78, 72, 38,207,247,237,101, + 50, 91,134,194,154, 94,226,222,150,139, 79,180,173,211,159, 76,187, 79, 27, 15,134,219,162,202,246,202,150,120,144, 88, 16,100, + 0,250,193,244, 35, 33, 79, 86,139,185, 32, 96,247,157,210, 44,197, 81,160,144, 56, 13,153, 31,240, 65,142, 35, 3,198,177, 8, + 28,141,182, 96,190,148, 31,142,235,128, 0, 32,169,227, 90,100,120,144, 85,104, 2, 65,240,116,135, 39, 60,146, 21, 58,224, 74, + 41,195,228, 14, 58, 77, 54, 99,232,233, 70,181,198,235, 52,154,153, 15, 61, 65, 85,145, 77,102, 18,135, 70,198, 53,207,113,132, +108,211, 5,140,237,205, 80, 37,230,103,220,196,230,121,206, 66, 67,146, 45, 27,132, 35,101,255,141,171, 92,146,250, 54,254, 0, + 69, 31,184, 51,154,114,235,137, 87,113, 88, 16,138, 16,185,207,204,233, 80,152,184,110,212,144,203, 72,162,136, 21, 68,152,163, + 8,214,179, 85,173, 20, 41, 40,133,201, 20,146, 6, 2, 51, 18, 18,144,195,166,143,237,118,184,144, 73,158,134, 12, 49, 88,231, +133,107, 3, 80, 97,172,255,170, 31,202, 97, 77,139,121, 61,155, 0, 19, 53, 26,101, 50, 46, 64, 7,106, 86,243,236,232,103,235, +165,204,230, 30,119,160, 64, 18,175, 22, 35,199,128, 40,112, 37, 0,211,142,197, 66, 19,158,196,156,136, 68,241,146,207,143,112, + 21, 83,102,252, 65, 55,182,138, 98,231,152, 85,100,129, 87,213,251,129,107,211, 27, 12, 37,163, 49, 12,170, 97,181,137,249,183, +199,182, 94, 55, 15, 6, 49, 29,126, 20, 2,185,172,137, 75,121,177,209,195, 34,142, 77,197, 9,207, 8,187,194,152,138,133, 38, +254, 2,224, 95,194,249,123,192, 68,137,194,168,161,201, 45, 21, 90, 98,115,228, 10, 89, 20,187, 0, 82,226, 68,161,248, 64,183, + 11,109,137, 74,161, 44,235,225,165,198, 30,125,255,122,166, 80, 24,228,179, 38, 53, 11, 97, 49,196, 79,198, 8,189,151,213, 60, +158,201,181, 12, 48, 21,141,110,181,240,212, 88,231,151,228,159, 62,251, 29,175, 61, 98,103,198,201, 6, 71, 27,211,204,248,240, +222,142, 54, 34,121,202,113,227,223,136, 43, 19, 33,232, 13, 64, 54, 76, 4, 46,110, 7, 91, 64,104, 1, 0,107, 3,118,176,123, + 39, 19, 64,191,234,206,209, 59,124,230,128, 35, 9, 92,145, 46,206,159,195, 76, 62, 77,151,225, 59,109,116,206,123,150, 64,175, +167,162,223,167, 49, 93,147,234, 31, 95,222, 72,187, 86, 38,133,113,230,214, 51, 56,143,135,187,109,121,125,179,146, 47, 95,124, + 35, 87,250, 62,120, 95, 40,114, 54,151,191,255,162, 47,209,103,175,184,190, 58,222,175,209,206,245,239,254,233,177, 22, 93,187, +114,247, 65,199, 10, 87, 8, 69, 69,198, 82,168,150,141,117, 5,154,115,190,144,179,201,104,184,161, 89, 83, 68, 27, 98,211,158, +192, 36, 14,113,224,223,252,195,175,228,207, 62,249,177,188,119,167,169,133,106, 72, 44, 18, 10,250,192,129,112,113, 77, 96,146, +132,220,243,224,168,206,132,125,174,177,120, 8, 22, 75, 65, 11,136, 98, 93,222,125,164,175,169,133, 25,206,116,171, 94,224, 84, + 10,236, 48, 95,207, 59,168,230,134,217, 89, 19, 7,130,107, 52, 1, 85, 80, 63, 35, 44,204, 75,133,137,188,117, 71,244,140, 78, +229, 31, 62,123, 45, 69,208,254, 78,123,115,237, 38, 48,186, 45,240,166,129, 35, 89, 43, 25,221,136,123,104,176, 94, 18, 11,114, + 94,226,198,148, 78, 77, 26,227, 59, 4, 72, 28, 28,113,138, 86,220,199,232, 77,172,229, 77,148, 5, 15, 46,213,132,162,136, 35, + 19,112, 6, 17, 92,241, 26,168, 50, 38, 24,163,123,198, 83,111,233,159, 1, 84, 70,244,121,226, 49,105,239,119,235,116, 80, 67, +130, 12, 87, 51, 46, 85, 1, 76, 3, 69, 11, 7, 30,192, 1, 20, 29,171,200,222,213, 88, 47, 66,224, 70,234,126, 98, 29, 57,146, + 83,144,152, 14,188,201,171,218,152, 30, 23,229, 86,171,110,216,144,254,215, 63,187, 43,247,118, 43, 12, 50,155,208,186, 76, 32, +213, 59,205, 42,187, 54, 32,243,255,238,243,115, 25, 14,237,230,199, 14, 56,136,160,139, 98, 7, 32,161,221,122, 78,139,131, 57, +145,224, 4,239, 33, 33,121,166,207, 43, 73,236,212,162, 60, 42,199,237,228,106, 26,176,202,180, 29, 44,105, 0,252,246, 60,171, + 5,204, 68,138, 65, 68, 29,107,128, 8, 57,126,213,239, 47, 6,121, 75,210,110,167,139,251, 81,209,131,237,107, 64, 47,102, 3, +183,175,141,222,112,152, 19,227,108,227, 96,141,103,176,115,180, 17, 26,254, 22, 69, 69, 64,170,141,191, 13,210,160, 93,192,185, + 8,107, 13, 28,222,219,225,128,122,196, 51, 7, 16, 51, 89, 83, 19,132, 33,146, 60,151,227,123,195,168, 60,116,201, 7, 32, 47, +207,153,158,224,158,167,212, 53, 80, 59, 76,222, 52, 96,224, 75, 53,161,127,104, 10,196, 42,212, 21, 73,248,121,184,159,232, 72, + 8,108,244, 34, 87, 24, 37, 28,135,227,189, 36,110,193,110,167, 50,213, 50, 55, 53,178,208, 1,244,216,141,122,254,150, 34,134, + 2,163, 63, 28,179, 96,179,137,132,241,147,125, 87, 92, 96,172, 74,238,188,103, 99,104, 32,142,247,181,184,154,107, 96, 91,206, +215, 54, 77, 33,187,195,151,209,114,206,175, 65,160, 12, 28, 29, 12, 15, 57,164, 29, 13,175,145, 56, 96,219,134, 6, 32,165, 92, +149,202,126, 80, 29,195,117,162, 46,130,196,212,255, 54,228,234,146,239,179, 92,200,111,109, 82, 55,110,220,138, 60, 92,212, 34, +103, 69,176,210,210,121,180,219,200, 54,244, 76,178, 24,252,120,115,107, 75, 51,184,237,193,211,169, 90, 90,196,122, 14, 57,111, + 48, 5, 75,202, 28,245,255,128,157,128,169, 6,198,165,182, 47,143,217,141,153, 96, 82, 66,144,104,193, 41,145, 65,174,213,167, + 5,166,237,250, 49,141,130,127, 0,129,100,216,127,107, 66,199, 71, 25, 77, 86, 68, 88,227, 89,170, 21,124,118,100, 8,250,158, +103, 8,123, 60,247, 17,153, 37, 9, 59,232,200,204,205,184,198,128,224,202,124, 81,144,203, 78, 65,142,187,101,237,208,198, 20, + 54,162,243,213,112, 41,199,229, 2,169,115, 64,172, 3,185,140, 96, 10, 99,145, 21,193, 91, 11, 9,137,117, 8,244,190,148,153, +232,198,243,107, 77, 82, 54,173, 88,235, 61,108,150, 3,185, 25,218,168, 31,170, 92, 9, 1,158, 38, 86, 67,191,113, 56,225,149, +107,134,121,208,103,225,201,104, 34,237,122, 81,142,239, 30,200,203,139,107, 6,108, 92, 27, 76, 14,112,198, 3,119, 30, 55, 24, +245,110,214,236,192,137,132,119,142, 93, 91,103, 75,234, 86, 4,188,102,139, 69, 68, 74, 48,134,156,212,216, 32, 89, 33,195,251, +142,239, 47, 38,121,247,121,130,109, 97,139,243,134,152, 10,106, 27, 40,110,224,106,163,123,227,132,210,197, 95,172, 16,215,122, +246,226,124,137,207,115,177, 4,132,118, 73, 19, 66,200,181, 89,187,123,196,117, 4,158,155,189,157,251,210,121,241, 66, 30,191, + 60, 49, 48,154,211, 17,247,221, 26,236,243, 39,167,140,169, 44,202,233,113, 96,152,146, 84,247, 0, 49, 5,197, 52,133, 86,138, + 89,118,184,152,126, 48,105, 5,174, 1, 76,150,142, 78, 88,144,142,198, 73, 78,248, 96,126,226, 88,252,169,250, 31, 10, 98,208, +164, 81,212, 31,236,236, 82, 18, 57, 89,143,101, 49,185,229,202, 21,114,193, 40,134,177,238,184,187, 91, 35, 72, 14, 19, 50,116, +201, 40,182,224,206,183,163,247,232,242,118, 44,247,119,202,210,187,157, 24, 11, 71, 95,251,236,242, 86,110,111, 46,228,250,122, + 41,149,246, 74, 58,179, 57,167, 42,216,225, 19,199,177, 50,223,114,140,183, 41,118,133, 51, 61,159,241, 57,199,251,197,164, 15, +133, 2,158, 61,232, 93, 0,155,131,132,255, 68,175, 29,138,245,247,239,117,164,169,137,157,234,122,177,173, 62,170,213, 34, 11, +107,112,246,113, 94,176,230,184,191, 95,146,158,158,223,193, 20,116,202,146,230, 46,248,179,195,133,115, 33,151, 87, 3, 51, 51, +202,219,202,139, 22,219,110,229, 26,109,140, 85, 20,174,140,230, 7, 32, 36, 26,130,222,104, 69,206,253,127,250,163,251,108,124, + 51,119,245, 5,142,119,106,244, 30,191,236,141,152,104, 47, 6, 38, 48,143,125, 54, 14, 10,140, 68,114,174,155,216, 56, 72,126, +146,152,168,188,239, 56,154, 84,135,242,189, 31, 84,189, 9, 93,169, 8,120,114,200, 91,227, 61, 26,160, 38,166, 50, 85,236,168, + 50, 27,238,185,177,111, 51,177, 25,143,149,102,129,188, 43,143,102, 50,144,118, 61, 27,111,184,227,192,216, 38, 97, 85,239,211, + 2,145,128, 86, 3,220,179,106,244,201,159,143, 52,225, 69,172,146, 8,162,114, 93,213, 20,220, 90, 61, 52,192, 13, 96,236,142, +230,183,173,213,209,112, 14,254,172,209, 24, 0, 14,242,217,201,199,102,164,161,255, 30, 52,114,242,159,127,178, 43,191,249, 86, +228,110,183, 70,206,227,103, 79, 47,245, 96, 85,228, 78,171, 36,119,219,101,106, 99, 63,185, 26,203,111,159, 92,203,120,106, 18, +168, 8, 90,177, 30,192,152, 99,242,205, 54,241,222,206,214,242,247,143,175,229, 84, 19,121,137, 34, 13,115,130,114,124,125, 32, + 96, 4, 0, 93,227,200,153,178,172,162,144, 96, 35,140,232,211,206, 21, 9, 66,123, 35,189, 30,115,183, 19, 14, 28, 58,222, 20, +231, 18, 47,113,200,107,147,163,205,122, 57, 11,112,185,138, 9,117,248,102,165, 11, 3,133, 36,209,206,187,156,151, 98,189, 77, +189,109,113, 28,118, 20, 44,205,106,147,157, 51,198,205,161,171,186,121,173, 29, 93,135, 69, 66, 62,112, 59,217,141, 3,171,101, + 44,193,185, 85, 7, 0, 62,216,105, 71,206, 37,204,254,155,108, 53, 1, 54,206,196, 36,237, 22,233, 61,237,118,167,129,227,174, + 39, 78, 25,142,130, 60,190,117, 64, 76,124,145, 33,185, 3, 71,145, 51, 48,100,108, 94,214,238, 90,121,129, 41,121, 71,148,128, + 53, 19, 13,168, 52,101,188, 2,247,245, 52,214,225,104,197,146, 13,121,182,171,144,133, 9, 36,116, 97, 38, 50,139, 22, 44, 56, +144, 32, 72, 47,202, 23,232,250, 70, 93, 2, 72, 45,235,239, 1,132, 51, 23, 53, 67,232,103, 64,147,212, 87,168,107,245, 63,158, + 47, 28,248,205,128, 96,112, 44,243, 27,190, 22,173,109, 57,185,190,214,215,244, 25,228,219,141, 26,159, 11,200,149,226,245,240, + 57, 12,208,232, 76,142, 28,232,144,146,180, 14,148,197,145, 56,249,222,126,154,211, 37, 29,174,165, 40,120,155,140, 8, 59,122, +223,209,214, 18, 49, 29,244,237,164, 35, 49,209, 40,223,233,194, 59, 86,245, 22,149, 77,113,145,108,242, 6,243,224,138, 76, 76, +181,184,211,197,181,211, 99,129,253, 94, 76, 90,165,169,216, 1,216,132, 46,144, 22, 78, 78,223,220, 19, 51, 20, 33,189, 51, 54, + 26, 34,247,255, 78,112, 41, 71,255,243,132, 46, 88,167,195,186,252,197,195,146,212,251,115,125,174, 22, 92,121, 97,125, 3,190, +240,209, 30,198,235,121,142,236, 73,149,212,179,199,162, 26,116,191, 28, 64, 87, 53, 34,219,197, 43,107, 23,212,144,201,100,202, +215, 0,229,232, 26,210,202, 88, 82,234, 25, 56,191,234, 81,253,205,207,228,165,177,219,177,107, 0, 35, 32, 61,183,245, 74,157, +215,171, 88,175, 16,188,219,213,206, 63,210, 4,243,253,117,143,193,151,170,141,180,136,182,251, 64,208, 89, 96, 8,121, 59,175, +158,139,129,226,134,246,166,253, 97,138,131,177,211,199,144,109, 2, 68, 0, 71,195, 52,157,206, 36,209,194, 99,207,169,253,133, + 44,192, 77, 93, 16,186, 12,192, 91,224, 44,220,232,231, 5, 96, 15, 19, 8,241,124,215, 37,107,172,156,143, 9, 36,155, 78, 39, + 90, 60, 14, 89,104, 1,139, 89,201,231,165,213,104,200,243, 87,175, 36, 76,102,242,193,187,111,203, 79,127,252, 19,138,214,224, +254,225, 51, 17,104,234,155, 90, 27, 52, 16, 48,177,132, 88, 76,146,106,197,226, 30, 57, 67, 17,106, 49,228,179, 76,252, 96, 6, +161, 32,175,213,138, 54,133,133,112,150, 94, 55,216, 69,195,144,229,184,124,204,100,137,117, 7,224, 73,129, 31,115,140,142, 29, + 49, 18, 38,216, 8,139,245,152,175,237, 37,166,118,247,248,245, 64,222, 58,170,106,172,218,104,220, 93,203, 55,175,110,121, 6, +246,218, 85, 98, 32,158,157,244,172, 96,214,196, 6,129, 61, 56,184,213, 27, 5, 9,115, 40, 42, 39,250, 30,221,212,171, 44,244, +155,135,144, 94, 37, 48,219, 95, 15, 13, 83,148,188, 17, 42,114, 98,184,108, 16,244, 98, 33,142,225,122, 87, 74, 37, 98, 55, 48, +121, 64,193,129,164,191,116, 42,151,211,155,133, 60,126,254, 76,174,122, 55,114,239,160, 35, 15,247, 23, 90, 0, 84, 56, 41,185, +188, 94,240,107,112,158, 51, 78,150, 23, 53, 52,140,196,106, 26,231, 47, 7, 43, 45, 70, 86,114,231,160, 45,123,123, 29,249,254, +113, 94, 94,157,156,114,202,109,242,214,161,204,227,132,122,251,184, 55,166, 57,159,211,115,157,101, 12, 5,165, 28,138,159, 48, + 82, 2, 29, 25,128,236,204,253,110,149,180,181,254, 36,212, 23, 88,112, 63, 14, 32,199,126,199, 4, 46,154,122, 16,194,112, 44, +237, 90,158,106,100,175,110,231,146,115,220, 98,112,104,131,192,119, 65,195,158,124, 36,231,181,115, 17,131, 60, 94, 41,235, 17, +252,134,221, 9,154, 7,240, 28,189,192,120,198,243,117, 26, 88, 98,118,134, 8, 48,216,229,119,245, 32,194,182,112,133,238,126, + 21,187,234,116, 67, 16,193, 96, 94,162, 16, 76, 41,107,110,138,155,196, 80,186,164, 85, 32,152,138, 73,172,162,168,240,157,149, + 22,113, 1,168,116, 32,181, 58,223,176, 74, 2, 22, 0, 34, 55, 77, 13, 8,232,216, 63,253,238,146,128,180,143,238,183,137, 26, + 95,174,204,218, 46,114,194, 17,152, 98, 32,161,253,228, 81, 75,106,197,156,188,119, 92,151,227,221, 34,105, 20,224,221, 98, 20, +117,165, 1, 7, 84,186, 63,125,255, 64,190,126,121, 43,131,177, 81,222, 60, 7,146, 35,234,149,106, 84,208,163, 15,229, 98,234, +203, 16,227, 88,125,157, 82, 16,203,133, 30,104,188, 71, 32,127, 23, 27, 51,124, 0,240, 98, 29, 5, 78,157, 10,192,163, 5, 19, +220, 96,188, 33, 55, 52,162,158,190,141, 50,115,126,206, 80,226, 38, 73, 69, 94,107,193, 43,187, 85, 9, 84,253, 22,122,157, 33, +174, 97,251,116, 36, 11, 42, 91,233, 51, 60,132, 5,109, 50, 98,162,228,174,134,220, 88, 59, 84, 11,140,157, 52, 48, 32,105, 32, + 57, 99,239, 78,237, 97,250,139, 7,124, 32, 50,110, 71, 77,222,191,211, 48,224,239,221,184, 28, 95,199,209,163,187, 87,158,235, +179, 35,167,106,133,135, 15, 50,143, 40, 0, 40, 7, 11,254,181,254, 66,194, 34,216, 40, 48, 30, 34,249,191,161, 25, 53, 16,219, +128, 74,222,141,109, 61,215,101, 99, 34,128,247,176,114, 30,232,248, 90, 76, 71,170,250,160,133,206, 74,118,187, 50,113,188,247, + 20, 45,146, 50, 12,166,243,169, 6,197, 37, 87, 0, 27, 39,204,130,247,149,170, 64, 81, 64, 4, 1, 54,103,210,181,137,251, 89, + 8, 78,177,163,252, 96,202, 2,113, 15, 58,187,185,235,226, 59,196, 48, 6, 60,176, 20,133,251,212, 17, 18,187, 38, 21, 36, 14, + 40,231,149, 93, 32, 65,241, 3, 33, 10,186, 20,162, 72,208,159,127, 59,153, 83,134, 56, 73,156,245,174, 67,202, 50,233, 39,242, +230,250, 59, 80,235, 27,106,135,188, 49,100, 10, 12, 55, 16,186, 81, 98,224,248,246,158, 43, 14, 77,196,102, 99,222,221,144,182, +212, 98, 19, 88, 0, 92,165, 13,145,117,209,214, 47, 26,227, 72,156, 78,154, 80,232,179, 48,154, 69, 90,176,134, 76,232, 11, 63, +161, 99, 22,144,185,126, 28,113,236,142, 36,142, 73, 15, 28,168,214, 97,188, 45,194,184,234, 16,103, 3,235,238, 13,240, 21, 90, +111,202,227,147,115, 45,156,143,229,195,187, 77,249,234,116,198, 0,222,174,215,169, 37, 48,210,226,188,168,103, 21,218, 22, 80, +172,204, 96, 85,128,110, 29, 3, 30, 88,224,250, 83, 41, 84,154, 60,235, 60, 47, 92,129,141,181, 33,169, 16,148,231,235,253,105, +148,203,164,178,133,235,153, 38,187, 38,127, 30,186,247, 92,144,200, 94, 35,199,174,122,178, 4,237,202,116,196,127,251,135,103, + 18,128, 18,183,211, 54,223,117,136,178,160, 99,132,234, 89,169,224, 28, 38, 19, 3,113,137, 89,187,114, 50, 21, 27,122, 60,227, + 58,228,116,245,192, 34,153, 98, 64,166,134,185, 14,151, 12,234,113,148,184,130,118,195, 34, 22, 49,112, 10,241, 25, 61, 31, 69, +125,182,119,219, 29, 94,139,147,139, 11,125,118, 42,108, 2,176, 2,201, 19,147, 33,156, 70, 96,117,128,123,117,165,133, 99,167, +213, 98, 33, 85, 40, 85, 40,165,187,210, 36,120,163,241,240,155, 39,207,228, 39,239,189, 45,179,225, 5, 17,222, 57,218,129, 90, + 1,138, 6, 11,113,191, 93,171, 50, 89,194, 11, 60,159, 53,197, 60,130,222,168, 66,153,165,232,204, 84,175, 1,164, 93,129, 76, + 71, 1,142, 98, 7,211, 28, 36, 99,202, 21,235, 53,129,217,201,109,127, 42,223,143,134,210,191, 57, 33, 37,186,200,149,129,158, +137,141,169, 90,226, 92, 67, 99,157, 96,188,245,146, 44,148,171, 1,238, 31,116, 20, 98, 57,108,224,181, 60,230, 26, 76,239,110, +244, 51, 70,161,177,132, 86,129, 53, 6, 23, 23,125,185, 13, 34,153,106,193, 3,137,103,240,205, 87,107,189,230,107,143,211, 96, +136,126, 45, 32, 6, 5, 35, 26, 8,191,228,178,108, 48,113, 15, 87, 52, 27,210,102, 8,178,180,185, 44,159, 73, 20,218,221,102, +147,133, 9,206, 7,238, 1, 20,230,150,122,198, 62,124,251, 29,185,232,245,228,244,242,146,147,185,179,171,162,252,236,221,125, + 57,212,102, 25,193,107, 14,187,213,181, 9, 36, 97, 60, 78, 47, 4, 90,121, 7,242,246,157,138, 92, 22, 52,254, 65,124,105,147, +147, 15,222,123,139,224,200,254,237,181,116,235,101, 98,184, 74,244,178,215,124,154, 74, 96,139,197, 60,124,126, 46, 18,245,186, + 2, 83, 64, 67, 23, 76,222,126,253,221,181,220,210, 92, 69,228, 94,183, 44,191,252, 96, 79,190, 61,153,104,130, 50,241,125,152, +215, 55,234, 69, 38,180, 3,189,161,253,217,134, 31, 6, 65, 25,104, 84,142,178, 28,159, 14, 29, 53,198, 3, 72,128, 24,177,213, +202, 89, 6, 42, 36, 82, 11, 74,198, 1,143, 54,102,165, 10,237,229,196,141, 81, 9,216, 10, 76,237, 7,193,232,106,188,102,229, +103, 90,231, 30, 47, 52, 2,192,112,190, 38,112, 33,114, 35,116,163,213,153,107, 18,237, 4,157,251, 16,169, 50,161,240,189,192, + 11,157,210,157,211,181,204, 86, 17,187,133, 74, 25,187,219,132, 70,247,179,249,154,193, 11, 96,136, 75,237,156, 31, 30,212,201, +143,197,235, 97,132, 98, 10, 95, 70,189,193,239, 47,111, 70, 28,195, 98,204, 50, 93,217,144,114, 5,177,102, 47,195,128,123,220, +213, 27,213,155,200,105,111, 32,230, 39, 23,255,128, 54,100,192,176,192, 55, 74, 20,222, 43,228, 51,159,107, 69,135,157, 30,118, + 87,247,186, 53,251, 28,250,217, 78, 6,161,117,174,137,121,244,154,142,150,117,123, 24,213, 29,180,154,122,243,181,107, 25,206, +228, 76, 59, 25, 0, 8, 75,154, 24,145,208, 27,205,154, 76,199, 48, 66,152,105,240,193,142,220,153,138, 68, 26,168, 54,250, 96, +174, 80,149, 91, 18,131,162, 82,177, 96,212, 41, 92, 95,220,183, 5,198,251,142,146,182,226,200,216,246,208, 8, 54,129,181,210, +142, 94,102,116, 19, 80,184, 34,131, 88, 51, 16, 66,215,126,219,157,111,156,202, 86, 74,200, 69, 66,216,132,252,249, 20, 93, 0, + 71,221,243,221, 72,219,216, 4,137, 27, 99,123,206, 96,132,231,215,117,143,236, 90, 54, 27,231,130,231, 84,188,104, 80,146,108, +147,116, 58,118, 39, 16,173,217,146,162, 6,238, 23,167,167,250,210,199, 78,164, 71,152,208, 98, 71,155, 35, 22,132, 96, 37, 75, + 42,157, 86, 77,131, 78, 34, 55,183, 51,174, 60,128, 69,128,224, 68,165, 84,117,227,104,147, 17, 6, 77, 10, 69, 78, 10, 10,138, +162,216,209,220,156,150, 59,169,158, 98, 70, 30,155,141,147, 97,205,208,236,229,197,233,185,180,106, 21, 94,239,225,100,230,118, +246, 83, 19,208,129,252, 40, 36, 66,157,234, 24,238, 75, 45, 66,183, 98,118,184,232, 36,145,172,150,161, 83, 82,116,166, 47,233, +174, 82, 82, 19,152,237, 62,221,123,163,227,237, 84,253, 40, 58,226, 91, 87,154, 56,251, 88, 83,245,139,157,160,148, 9, 79,165, + 64, 51,242,170,131, 96,187,119,165,133,113,198,119, 5,132,161,167, 1,230, 1,154,125, 64, 84,175, 48, 32, 82,130,217,141, 90, + 23,107, 19, 30, 33, 77,155, 44, 17,223,117, 48,193, 22,200,135, 4,134, 55, 4,118,195,112, 52,146,175, 95, 15,101,255, 71, 29, +142,225, 95,247,102, 44, 91,154,213,146,118,118,115, 38, 16,140,125, 41, 4,165,175,128,164,146, 42, 50,102, 35,125,182, 87,115, +201,106,199, 14, 28, 72,183,117, 71, 3,102, 95,174,135,102, 52,178, 3,111, 5, 45,242, 91,173,134,126,125,137,215,226,232, 96, + 87,206,175, 7,220,207,131,122,137,226, 25,147,173, 88,139,240, 74, 41, 39,117, 77,166, 97,156,149,186, 22,201, 49, 28,251,112, +143,244,172, 3,155,154,205, 5,156, 86,130,203,143, 56, 71, 32, 32,186,103,199, 25, 18,174, 44, 76,168, 37,113, 90,240,129, 59, +195,184,246, 44,180,128,195,200, 26,226,153,107, 68,223, 40,142, 52,128,138, 76,166, 24, 90,253,203,165,137,126, 97,106,131,241, +175, 15, 96, 22, 25, 33, 5,222, 23, 20,157,124, 94, 33, 59, 29,175,233, 55, 65,197, 62,141, 55,231, 87,151, 82,171,212, 41, 5, +125,122,113,169,207, 71, 67,150,218, 0,252,250,155,111,205, 81, 45, 54, 87, 53, 82,112,179,166, 75, 0, 52,120,183,174,221,225, +218,226, 8,206, 0,166,172,214,225,218, 10, 37, 75,245,198,141,201,205, 38,118, 15,203,229, 44,215, 5,184,167,200, 0,229,218, +129,105,211,135,240, 12,208, 14, 84,255, 46, 87,196,190, 63,224,228, 21,150,213,116, 27, 11, 34, 78,191,138, 4, 44,194,143,220, +231,245,189,211,209,100,119, 54,150,179,235, 62,113, 23,154,222,169,111,192,149, 88,146,145,166,230, 16, 72,206, 62,216, 45, 81, +222, 59,166, 29,177, 41,130, 82,154, 27, 69,149, 62, 63, 55, 55,151,244, 9,105,106,178,198,243, 56, 90, 78,182, 10,125, 56,126, + 20,203, 89, 94,179, 96,198,115,139,102, 6,221,250,209,238, 46, 11, 31, 28,104, 76,232,192, 54,185,179,191,199,213, 37, 30, 46, + 0, 54,255,241,203,215,242,241,131, 93,121,116, 88,147, 82,169, 98,182,199,250, 51, 86,243,132,204, 0, 36,244,200, 61,107,187, +109,189,174,250,247,151,253,144, 93,251, 78,183,203,226, 6, 92,120,207,225,124,194,208, 84, 69, 49, 57,129,223, 70,184,145,173, +132, 47,158, 33, 56,216, 97,154, 0,107,228, 12, 42,165,183, 14, 42,178, 83, 43, 19, 76,213, 46, 3,232, 49,230, 8,203,115, 70, + 14, 89,242,134, 3,154,207,223,223,173,107, 85,177,102,165,205, 10,194, 19,238,202, 17, 7, 11, 94,198,141, 98, 50,220, 49,227, +134, 12,230,182, 7, 42,100,109, 79, 79,193,249,192,248,213,184, 17,232,204, 57,162, 74,156, 78,180,222, 80, 84,118,232,174,171, +197, 12, 77, 81,144,236, 98,236, 59,114, 70,167, 1,175, 34,140, 87, 76, 6, 20,140,217, 24,193,156, 38, 30, 81,188,229,197, 47, + 89, 17,153,116, 41, 42, 35, 88,133, 6,180,221,211,167, 79, 15,121,175,191,176, 0,230,192, 67,235,201,154, 85, 27, 30,248,253, +118, 69, 58,181,130, 3, 6, 89,196,167, 73, 71,100,194, 35, 57, 61, 33,224,133, 6,110,100,220, 42,102, 73,105,105,214,114,154, +132,214, 68, 75,175, 52,137,102,169,210,180, 97, 55, 45, 70, 22,225,251,131, 95,245,237, 52,224,255, 7,122,190, 94, 14,164,169, +159, 55, 10,242,236,134, 86, 27, 19, 98,129,245, 43, 94,199,119,187,172,192,207, 75, 89,175,229,209, 78, 67, 62,124,176,175,223, + 87,144,247,247, 43,146,211,215,249, 15, 79, 46,229,119,207,110, 73, 13,138,220,232, 15,251,154,217,122, 98,224, 61,177, 42,143, +193, 26,116,145,122,133,247,183,172,135, 14,157, 57,146, 6, 45, 33,105,113,105,252,236,114,185, 74,132, 54,146, 35, 14, 57, 19, + 96,198,146,118, 24,133,110, 36,236, 60,160, 61,163,234,144, 55,190, 29,223, 90,176, 66,122,129, 34, 27,128, 62,137, 75, 42,230, + 82, 23, 18,177,235, 57,173, 88, 60, 60, 43,154,122,248, 28,127,231,115, 70, 39, 17,151, 32, 19,139, 32,252,115,140, 91,145, 76, +145, 28,193,117, 77, 25, 9,169,188,101,198, 81,232,240,126,128, 88,125,165, 9,189,152, 53,151, 55, 27,245,155, 1,140, 56,157, +107,140,175,152, 8,181, 96,193, 57,232,107, 17,152,211,194, 21,202,121,161,190, 70,174, 80,230, 3,180,211, 40,201, 59,251, 85, +249,246,114, 78,110, 45, 39, 20, 97,226,244,219,109, 31,206,253, 35,174, 63,248,231,203,229, 86,133,125,229, 36, 50, 49, 94, 69, + 55,134,194,233,188,119,163,137,168,202,247,196,226, 55, 8,152,128,124,103, 34,130,247,226, 72,148,236, 40,113,141, 64, 37, 77, +199,160,158, 39,219, 49,185,239,240, 6,233,117,240,222, 48,236, 89,204,130,161, 98,232,119, 19,125,207,184,206, 38,138,173, 8, + 50, 51, 21,217,162,235,109,165,230,166, 77,129,141,235, 1,175,128,146, 24, 69, 93, 36,222,222,171, 36, 50,128, 36,182, 49,164, +223,101,196,249,192, 39, 44,170,201, 21,119,235, 3,118,160,142, 81,227,180,172,248, 25,249,124,225,123,243, 1,215, 87,184,183, + 72, 38, 23, 55, 67,121,118, 93,146,159, 63,172,235,121, 78, 72,241,219,209,162, 43,151,213,100, 5, 92, 74, 41, 79, 19, 40, 40, +170,225,243,228,156, 56, 13, 98, 71, 94,219,253,217,100, 36,123,135,135, 26, 88, 87, 82,173,183,181,171,159,209,222,185, 91,203, +203,203,211, 11, 77,236, 69, 78,100,102, 90,216,147, 42,139,201, 76,174, 64,191, 0,178, 81,124, 4,220, 5,147, 74,181, 4,145, +151,178, 60,127,121, 43,135,187,123, 60,123,217, 92, 68,208, 29,158, 37, 88, 49,163,139, 10,157, 12,231,198,141,224, 3,242,248, + 83,191,130,220, 22,113, 45, 57, 83,119,196,202,140, 60,239,140, 81,221,214, 0, 35,130,230, 68, 25,209,133, 43,162, 77,119, 30, +221,255,138,110,127, 9,159, 69, 92, 39,160,245, 87,115,125, 70, 39,115, 43, 6,244, 25,120,180,223,145,215, 23,215, 44, 60, 1, +134,198,250, 66,143, 28,197,163,150,203, 49, 11,241,254, 96, 32,167,231, 23,114,180,119, 71, 30, 29, 95,201,239,191,127,234,220, +253, 28, 37,210, 77,195,128,130,255,143,143,141, 50, 23, 80,111,220,214, 56, 24,133,163, 40,201, 18,180,252,198,187, 33,235,172, +178,163,217,130,211, 76,232,216,147,117,145, 95,107, 44,168,107, 34,188, 35, 7,187, 77, 78, 99,187, 26,111,197, 51, 38, 10, 58, +116,147, 12,247,181,208, 93,105,178,155,201,159,125,116, 87,254,240,244, 86, 11,150,172,198, 55,237,106, 51, 9, 99,204,130,114, +217,246,204,213,203,121, 78,143,177,190,196,117,223,223,209,103,244,197,153, 54,130, 11, 54, 6,240,188, 71,117,189,142,225,148, +184, 33,104, 18,248, 15,216,184, 2, 75,226,109,121,247, 17,229,106, 19,230,191,212,222, 56,203, 73, 11,157, 26,197, 12,159, 76, +113,207,192,179, 88,133,192,136,166,221,172,211,114,247,251,151,175,100,176, 60,144, 11,253,242,189,120, 72,149, 80,174,204, 48, +217,128,106, 93,161,192,132,141,105, 7, 42,107,224, 48,238,238,234,121,211,166,249,180,167,197,130,254,252,219,126, 34,237,238, +158,220,246, 46, 77,251, 31,231, 80,115, 48, 62, 35,196,216,192, 66,192,243,142, 41, 26,154,239, 39, 39, 87,250, 26, 90,200,252, +229,253,206,255,250,231,143,186,172, 32,191,191, 24,179,234, 58,131, 8, 12,101, 94, 3,202,229, 33,208, 96,151, 4,133,184,144, +149,151, 86, 22,205, 42,111, 38, 70,193, 84, 72,130,233, 67,198,223, 6, 15,207,117,165, 52, 55, 32,197,202, 64, 59, 0,183,101, +157,118, 48,149,220,128,212,196,207, 7,253,193,183, 61, 54, 18, 60, 10,131, 48,178, 93, 28, 85,219,192,197,244, 77,166,149,251, +145,141,201, 91,178,170,194,152,126,109,251, 71,116, 67,184,216,232,112,208, 93, 66, 34, 18,230, 14,182,235,138, 41,136, 16,186, +238,141,202, 70,113,178, 21, 49, 9,156,189, 39, 10, 0, 0,232, 80, 12,176,139,116,159,139, 59, 73,162, 14, 23, 91,215,169,150, +118, 5,248, 12, 7, 68,232,102,184, 95,189,210,142,249, 28,146,150,120,157,200, 52,185, 99,121, 99,196,145,213,196,140,105,114, + 49, 19,115,164, 84, 41,230,228, 78, 83,111, 6,208,232,188, 86,216,243,151,229,110,167, 42, 31, 30,212,120,205,225,251,188, 91, + 47,201, 95,125,116, 95,254,217, 79,238,203, 71,247,119,104,123, 57, 91,107,151, 61, 93, 82,188,227,173, 59, 59,242,254,113, 91, + 15, 92,158, 32, 71, 60, 20,197,188,207, 61, 19,168, 73,101,112, 39,181,154,107, 54,234,236, 70, 90, 90,161,114, 76,230, 70, 79, + 24,113,219,181, 48,138, 23, 14, 61, 70,226, 16,156,153,207, 23,219,113, 47, 69, 58, 36,113,166, 21,182,223,230,152,221,137,105, + 64, 4, 1,149,126, 1,123,103, 45, 10, 64,153,219, 86,192,113,180, 21, 64, 9, 24,104,108, 82, 3,208, 15, 68, 68,114, 57,243, + 36, 71,194, 37,248,203, 33,177, 19, 55,149,137,221,216,217, 68, 35,140,126,181,116,133, 2, 10,132, 10,181,224, 51,230, 93,238, +116,227,179, 78, 15, 30, 94,235, 16,185,248, 79,254,228, 33, 71, 97,120,152,125, 39,164,132,207,139,253,170,173, 14, 60,249,205, +151, 47,229,162, 55,162,206, 1,212,170,226,213,130,232,230,108,161, 36,159,188,181, 47, 31, 60,232, 82, 99, 0,137, 14, 58,213, + 24, 65, 2, 12, 10,213, 67,236, 11, 95,158,247,229,228,122, 72, 67,146,192,105,132,110,156, 23,180,200, 27, 20,127,226, 56,215, +177,243, 69,199,207,201, 56, 39, 41,200,226,210, 97,106,179,217,250, 10,120, 41,178,221, 51,174,117,170,149,159,142, 26, 18,199, + 77,223,142,222,205,126,201,116,234,221,144, 36,114, 56, 17, 47,245, 72,112, 58, 13, 28,197, 7,142,162,232,206,109, 22,214,175, + 98, 1, 52,231,232,126,185, 92,214,145,229,196,241,252,205,114,212,115,234,126,190,163,202, 81,204,201,183, 93, 37,215, 89,156, + 46, 24,206, 34, 37,143,252, 80,231, 63,149,251, 37,130, 90,223, 47, 10,155,144,138,105,121,126,207,149,118,212,247,119, 74,178, +175, 69,213, 89,127,198,216,128, 14,107,130,128,172, 55,162, 94, 45,114, 69,130,184, 69, 15,138,140,201,152,130, 82, 11,237,121, + 96, 74,192,241,198,185,163,181, 71, 18,178,112,255,238,213, 13, 99, 23, 94,239,246,182, 71,112, 20,196, 65, 96,170,132,181, 32, + 60,175,233,136,149,216,228, 14,147,179,187,123, 53,142,161,167, 90,144,142, 70,183, 4,196,101,243,101,202,246,142,102, 19,142, +187,195, 40,118, 66, 74,111, 60,115,253,140, 97, 68,112, 70, 1, 58,132,153,137, 73,235, 70,182, 71, 37,144, 49, 50, 58,233,106, +227,240, 44, 89, 78, 13,166, 48,141,114, 73,135, 69,148, 88,209,151,210,141,215,161,249, 66, 0, 84,139,215,221,235,180, 89,160, +158, 94,246, 88, 68, 84, 74,101,254,127,232,193,151, 52,169, 98, 85,232, 57, 10,236,213,213,185,180,218, 59, 90,220, 23, 36, 90, +141, 53,214, 23,216, 48,160,160, 66,140,131, 87, 1,180, 51,214, 78,142, 59,165, 4, 51, 52, 38, 54, 25,202,229,140, 33, 33,108, +226,178, 4,130, 98, 10, 85,226, 14,189,164,191,175,106, 18,239,202,193,222,158, 84, 42,117, 26,245,148, 43, 13,185,179,219, 32, +168, 14,171, 7, 76,125, 96,106, 53,214,152,115,222, 27, 50,158,255,183,127,245,161,252,226,147,119,248,252,189,210,231, 10,182, +224, 23,183,147,173,149, 43,206, 75,200,231, 39,103, 14,137, 0,168,105,195,137,159, 11,193, 44,176, 77, 74,133,141,225, 26, 48, +222,215, 38,176, 92, 41,201,241,241, 93, 9,244,250,250,226,111,177, 83, 22, 83,204, 81,109,229, 12,197,168,189,160, 95, 95,160, +159,135,173, 4,111, 71, 99,210,118,169,206,168,213, 43,146,125, 69,175,217,154,140, 0,107,118,207,174,174,248,249,112,198, 52, +115, 18, 59,130,154,199, 38, 0,107,227,200,235,123, 45,151,236,140, 98,149, 4,167,210, 78,187, 12,151, 16,222, 71,155, 18,121, +148,103,198, 36, 0, 69, 53,186,118,147,228, 13,232, 65, 65,234,174, 99,252,144, 83,255,224,176, 37,191, 63,153,106, 21, 60, 98, +146,123,124, 13, 5, 38,251, 2, 84,185,139,120,185,221,123,178, 66,228, 27, 54, 57, 62, 34,228, 67,140,101,204,236, 32,147,250, + 58, 19,168, 20,210,189,135,181, 60, 22,136, 81,192,234, 36, 16, 51, 95, 97, 0, 2,143, 27, 64, 42, 84,174, 57,187,169,222,198, + 56,126,208,129, 62,133,163, 18, 21,172,124, 86, 78,216,147, 3, 88, 17,185,174, 48,198,152,203,183,215, 53,217,194,100,107, 94, +129,155,129,113,137,135,145,148,192,166,206,246,127,144, 72,149,212,155,251, 7,255, 48,188,122, 41,170, 58,230,232,236,250,102, +162, 5,193,146,201,179, 85,201,209,240, 97,166,157,225, 96,186, 48,153, 74,125,239,123,149, 37,193, 29,227, 33,246,228, 27,142, +221, 32,239,248,168,145,147,142, 30,228,255,240,186,255,198, 57,203,189, 22,166, 12, 24, 83, 2,155,144, 1,189, 43, 83,144, 23, +195,141, 38,219,174,236, 84,244,218, 77,135, 68,238,163,171,173, 65, 3,187, 33,242,104,167, 37,123,221,182,236,239,237,152, 70, + 52, 36, 41,225,120,165,137,229,122,184,150,223,188,188,225,195, 52,156,152,221, 31,237, 98, 41,138,161,135,101, 2,245,174, 60, +253,161,225,150,103, 30,218, 9, 15, 36, 80,219, 16,163, 49,105,219,149,243,234,141,196, 8,121,166, 91,206,164,153,200,182, 40, + 89,187, 93,181,239, 7,206, 69,205, 44, 84, 37, 69,146, 59,244, 54,193, 89,145,117,192, 40,176,226, 45, 32,202, 12,105,144,152, +172,227, 78, 56,217,200,147, 14, 39,214, 93, 39,230,120, 5,185,205, 84, 61,142,162, 12, 14,217,142, 7, 14, 93, 58,146, 85, 33, +151,219,142,152,233,133, 7,128, 99,232, 36, 43, 97, 50,161,159,241,242,230,150, 73,159, 14,101,238, 33, 6, 5, 50,118,252, 95, + 32,133,113, 93,209,153,227,190,130, 58,243, 37,196,107,244,103, 55,235, 26,192, 91, 77, 6,161,154, 6,183,150, 38,143, 91, 34, + 78,215, 82,205,250, 20, 1,130, 15,250,158, 86,233,245,122,129, 19,165,102,173, 46,111, 29,113,217,196, 14,202,115,178,169, 40, + 24, 32,234, 4, 48, 82, 41,111,221, 46, 86, 64, 55,195, 1, 19,230,138,178,180,115,126, 46,140, 87,241, 53, 8, 40,232,204, 73, + 73,244, 18, 82,183,104,194,130, 81,252,204, 5,247,237, 96, 61,249,255,157,235, 55,166, 57, 4, 78, 70, 54, 86,183, 47,139,216, +129,224,185,199,103, 70,240,202, 82, 27,222, 58, 20, 43, 60,173, 96, 0, 16, 13,171, 25,142, 93, 19,243, 94,136,220, 8, 54, 33, + 48, 48, 75, 27,208, 77, 90,208,115,239,231, 17,216,186,118,163,246, 55, 15,129,117,174,166,144, 99,123, 65,156, 39, 17,139, 5, + 0,227,225, 28,152,121,136,231,220, 10, 19,242,174,255,205,239, 78,229,127,252,139, 99,249,209,189,174, 60,191, 28,233,189,200, +147, 30, 8,132,125,171, 94,209,103,115,206,241, 55,198,148, 16, 56, 90, 65, 6,153,236,132,172, 94,215, 41,209,244,208,225,200, +151,170, 82,213,243,112,222, 95,145,243,172,229,184,158,153, 5, 19, 0,194,123, 9,157,233, 98,200,113, 45, 26, 4,140,113,113, +205, 17, 27,241,124,116, 42, 25,142, 96,161,115,222, 31,244, 53,233, 85, 57, 37,124,242,226, 37,113, 51, 37,226, 67,132, 99,123, + 4, 95,210, 40, 61,135, 33, 0,141,116,101,186,222, 24,155,167,244,215,148, 26,202,201, 22,198,222,129,121,151,131,234,185,118, +197, 91,106, 29,234, 59, 42, 33,208,239, 40,196, 64, 41, 68, 2, 12,168,218, 24,177,152,190, 28, 76,164,215, 63, 37,203, 35,165, + 67,194, 83, 61, 91,201,147, 94, 88,215,175, 57,108,109,228,235, 23,215, 92,133,129, 77,156,203,117,228,207, 62,126, 95, 70,195, + 1,159, 85,168, 3,146,186, 25, 39,196, 76, 28,118,234,242,226,114,192, 85, 44,166,166,187, 53,163,111, 97,109, 14, 58, 49, 62, +231, 58,242,137,151,218,197,254, 29,137, 30,200,253,141, 77,121,104,126,149,245, 89, 68,223, 96,101,120,165,221,255, 31, 95,209, +169, 12,160, 91,161,192,138,198,125, 8,105,233,217, 0,170, 31, 77,196, 68, 99, 46, 40,134, 47, 95,107, 27,123,212,150,110,171, + 35,215,215, 87,204, 31, 89,228,149, 76,222,226,116,213, 18, 63,197,159,226,140,198,204, 29,160,120,152,131,226, 24,184,144,141, +212, 98, 77,134,173, 29,201, 97, 50, 25,197,204, 75,211, 25, 10,185,132, 49,133,120, 35,125, 22,160, 25, 49,165,229,107,137, 52, +220, 40,213,222, 16,143,207, 52, 98, 95, 31,216, 0, 36,244, 82,137,197, 22, 24, 76, 52, 70,210,123,177,215,237, 80,131,191, 86, +186, 47, 71,117,205,127,176, 80,117, 83, 58, 78,111, 35,147, 55, 7,198, 96,175, 83, 38,109,243, 82,243,111,171, 89,214,184, 14, + 15,249, 2,115,162,120,123,164, 30,222,244,251, 90,184,162, 0,240, 52,254, 44,164,222,104,243,125,162, 9, 70, 83,181, 38,168, + 86, 11,155,127,253,251, 51,138, 2, 64, 65, 12,143,226,106,153,200,100,105,212, 25,208,184,208,169,161, 34,181,128,224,105,199, + 44, 4,190,145,240, 66, 96,134,255, 70, 50,208,247,157, 16, 9,130,129, 73,137,146,143,154,202, 96,112,199,153,144,230,133,206, + 30,221,100, 64,250,141,105, 13,251,174,163, 9, 28,248,103,236, 56,225,201, 38,203, 46,158, 0,170, 31,120, 16,167,241,203, 12, + 60,196, 33,244, 3, 38,229,249,108, 67, 16, 91,222, 1, 82,240, 0,114,160,224,198,177,169, 22,118,236,132, 57, 76,180,195,194, +163, 79,187, 72, 67, 99, 35,121, 19,160,167, 1, 5, 85, 43,186, 48,186,188,113,133,238,113,172, 4, 52, 61,138,161,102, 41, 43, + 71,122,209,235,218, 29, 39,155, 37,199,175,111,184,195,118, 24,160,213,142,253, 37, 38, 24,197,122,147, 78, 74,228, 27, 67, 86, + 82,255,252,249,249,128,211,132,185,126, 63,170,183,198, 29, 77,244,218,157,224, 97, 41,104, 37,136,131,134,135,188,232, 30, 22, +184,255,172, 22,144,135, 92, 83, 91, 27, 83,137,216,129,179, 82, 32, 20, 46,119,177, 92,145,172,254,154, 79, 46,152,216, 42,168, +162, 27, 77,142,134, 67, 87,225,147, 74,197,202,215,198, 74,236,194, 35,147,216, 76,105, 21,169, 54,117, 74, 21, 75,221,210,108, +204,109,174, 81,121,253,217,115,208,226, 48,182,102,242, 93,147,227,238, 57,223,223, 31,114,212,233, 90,134, 32,229,153,202, 24, + 45, 77, 61,211,209, 71, 98,206, 58,153,225,196, 21,139,177,115,115,131,138, 32,164, 27, 73,165,115,217, 11,239, 33,116, 93, 30, +206, 45,215, 61, 76, 88,177,163,124, 9,149,155,224, 63,143,206, 37, 5,212, 89, 33,231, 59, 65, 13, 11,126,252,204, 8,100, 20, + 53,202, 81,209,106,175,211,145, 59, 59, 69,185,211,206,202,201,213,132,133,231, 58,244,100,159,118,171, 62, 1,110, 59,173,178, +220, 57,218,149,219, 49,206,112,138, 90, 23, 83,121,155, 45, 28,213,206,185, 51,105,242,206,102,108,189,192,253,218,102,197,224, +209,134, 16, 13,130,169,126,239, 84, 19,202,110,187,206,164,116,163, 65,122,229,212, 4, 57, 34,134,186, 88,197,119,184,150,141, +147,212,117,123,240,216,166, 89,169, 15, 59, 71,133, 40,140,210,209, 60,243,186, 61,103,248,204, 20, 53,201, 4,118, 94, 92,145, + 64,163, 14, 4,141,216,156,162, 48,193, 2,195,227,160,153,215,224,156, 97,144,198, 53,192, 14,246,108,176, 50,189,118,112,173, + 33, 46, 21,216, 8,149,171, 43, 36,154, 84, 68,200,137, 19, 37, 78, 73, 48,181, 54, 54,206,191,129, 82,241, 47, 10, 8,220, 71, +156, 57, 43, 62,139,188, 70,207,245,186,255,230,241,181,252,151, 63,125,160,113,203,119,114,200,190, 12,181,147,205,218,154,211, + 94,211,211,243, 58,139,104, 97,137,130, 3,227, 74,140,108,135,131,158,230,139, 10,239,193,209,193,129, 38,134, 75,118,137,152, +170,133,203,185,113, 84, 54, 88,237, 85, 12,116,138, 56, 5,122,216, 38, 71,101, 61,116,144,152, 28,156,244, 18,118,176,120,197, + 74, 77,159, 99, 96,136,224, 63, 1, 81,168, 5, 10,216, 58,215, 83,184,135, 57, 71, 25,140,220,232,220,166,139,102,178,131,206, + 52,240, 13,159, 68,157,115,184, 63, 58, 63,138,106,177,161, 29,117, 75,206,110, 6,148,131, 21, 39,252, 51,209, 46, 49,175,231, + 24, 92,117,138,217, 4, 14,128, 23, 4,174,208,246, 41,148,130,115,143,233, 42, 65,180,154, 48,219,141, 58,207,244,203,139,158, +158,211,182, 12, 53, 86,228,181, 0, 56,212,206,112,174,143,246,179,151,175, 52, 81,116,244,117,171,242,248,236,137, 60, 59,189, + 34,226, 58,227, 98, 57,183, 96, 40, 74,181, 99,197, 42, 22, 84, 99,196, 35,208, 27, 3, 39,233, 76,106, 45,167,120,193, 27, 31, + 3,253,255,240,234,192, 58, 53,200,198,164,235, 34, 89, 3, 32,119,247,206,123,146,113, 13, 21, 88, 66, 96,216, 0,236, 23,100, +244,217,212,103, 11, 86,192, 79, 95,158,179,185,184,153, 21,120,127, 32, 27,252,214,110, 77,118, 26, 6,124,165, 32, 78,222,112, + 10, 88, 25,183,235, 29, 98, 14, 96,245, 90,169,212,228,206,225, 29, 78, 91,208, 33, 91, 30, 91, 91,204, 91,244, 41,181,155,104, +178,175,104,108,135,126, 59,166, 33,145,158,133,145,158,167,173, 57,148, 47,148,144,197,179,202, 34, 51,177,169,154,157, 99,111, + 43,246, 67,133,199,140, 93,127, 92,143,107,109, 36,186, 90,232,127,254,205,119,210,219,219,149, 31,223, 45, 81, 65,143, 56, 20, +114,227,109,210, 80, 45, 21,244,217, 94,208,187, 4,207,207, 84, 11,152,114,165, 32,221,122,150,134, 71,185, 6,254,188, 41, 29, + 24,219,120,107, 98,185,142,192, 2,211,226, 4,147,232,235,219,177, 25, 92,177,225,153, 73, 6, 34, 17,224,187, 97,215, 13,160, +201, 98,177,225,206,108,175, 93,100, 18,215, 91, 74,241,120,227,189,190, 41,182, 41, 82, 64,228,139,191,213, 2,198,141,143,156, +181, 99, 74,149,193,195,201,145, 6, 5, 1, 98, 55, 12,180, 74, 52,135, 61,140, 62,216,137, 3,202,164,198, 30, 57,223, 1,179, +176, 59, 28, 47,244,198,154,171, 18, 60,192, 77,202,211,116,177, 35,103,134,192,241,172, 3,162, 25,101, 42,230,148,225,163, 59, +134,252,190,157,139,227, 65,122, 20,249, 73,169, 64,244,135, 15,222, 0,238, 56, 6,139,147,109,130,139,157,237,161,185, 24,249, + 84, 86,211, 80, 67, 76, 0,119,159, 25,227,161,231, 25,204, 53,184, 87,179,220,189,246, 0, 86,240,204, 74,241,142, 86,171,216, +255,225, 97,194, 72, 8, 2, 36,144,104, 69,145,210,159,207,121,136,160, 84, 6,149,161,193,120, 46, 21, 45, 8,238, 63,216,211, +228,209, 50,131, 6,189,185,160,171, 12,180,176, 64,119,138, 84,181, 4,151,126,190,162,231,240, 42,220,184,134,199,204, 17, 22, +161,137,255, 35, 57,178,120,208,135,186, 2, 6, 3, 70, 70,250,160, 47,136,222,246,185,223,186,133,185,128,155, 34,144,170,150, +200,214, 80,101,181,154,153,218,154,200, 86, 4, 37,245,125, 78,145,226,169, 85, 40,196,116, 16, 92,185,139,218, 24,130,156,175, + 17,174, 13, 40,230, 38, 49,248,103, 78, 1,141,165, 62, 68, 21,179, 86,116,194, 66, 81, 98, 66, 13,158,147,242, 76,213,179,208, + 9,129, 66, 2,173,237,172,115, 43, 19, 42,207,153,131, 32, 58,188, 76,222,120,219, 76,218,232, 54, 3,179, 34, 69,162, 67, 5, +141,235,134,207,132, 53, 15, 20,194,150,174,163,161,195, 26, 18, 29,118,236, 65,198,117, 72,154, 8,244,190, 32,225,227, 94, 33, + 48, 94,244,135,210,109,180,236,220, 45,103,122, 46, 43, 26, 32, 81,104, 9,121,236, 90,199, 11, 36, 65,144,196,112,253,177, 79, + 29,107,229,223,211, 14, 28, 5, 66, 38,101, 97, 44, 87,188, 70,105, 49,100,130, 50, 9, 71,215, 16,155, 1,215, 25,103, 19, 35, + 75, 8,172,192,216, 98,170,247,235,213,101, 79,238,237,182, 9, 62, 29,105,161, 52,221, 24, 66, 28,221,105,222,141,250,240,153, +230,110,125,176,113, 1,134,133, 17,206,202,182,195,144,237,138, 41,213, 32,127,211, 57, 27,214, 99,169,247, 29,227,107,156, 79, + 24,181,224,245,233,139,237,144,218, 43, 77,110, 40, 98,237, 30, 11, 71,146,166,149, 30, 83,222,153, 24,133,212,155, 32, 48,164, +253,198,113,209,185,138, 72,220,179, 26,219, 57, 49,212,190,183,149,206,141,156,142,255, 15, 93,252,138,197, 12,199,218,133, 28, + 38, 11,107,249,238,116,162, 73,221,147, 35, 45,160,158, 95,141,229,160, 93,211,235,151, 37,163,165, 94, 46, 58,115, 20, 43, 28, +141, 2,102, 70, 34,164, 43,105, 0, 95,175,124, 57,216,223,231,235,236,237,180, 53,201, 93,114,234,133,113, 52,154, 2,116,103, +133,226,194,108, 97, 25, 83, 12,231, 17,210, 53,109,173,113, 96,197, 14,107, 85, 64, 96, 54,235,217, 17,252,224,139,117, 34,150, +125, 23,228,241,156, 35,182, 96, 7,143,105, 14,186,233,193,120,170, 49,109,206, 73, 13,126,254,129,118,101, 72, 10, 0,253,225, +249, 13,156, 22,130, 61, 75, 90,176, 71, 62,165, 89, 55, 97,180,101, 23,250, 44,136, 12,235,208,215,226, 25,147,156,120,123, 61, + 35,234,170,175,245, 62,146, 34,235, 7,206,108, 43,166,221,104, 93, 27, 9,176,119, 48,197, 4, 45,115,164, 77, 92,129, 52,206, +181,118,131, 7,148,132,246,186,251,242,240,222,125,121,125,121,237,116, 31,132,147,138, 53,141,187,124, 54, 57,191,253,246,132, +159,193, 40,192, 92, 11, 91, 44,246,157,239,131,231,176, 3, 80,159,131, 47, 69,184,148,165, 54, 10,225,108, 99,178,225,146,221, +138,216, 28,116,118,164, 81,207,235,231,200,243,204, 64, 31, 29, 53, 48,146, 62, 48, 13, 88,241, 2, 53,255,237,243, 51, 22,151, + 72,174,208, 13, 56, 62,216,225,136, 63,113, 30, 5, 84, 94,212,100,215,108,230,216,108,226,247,192, 12,212,171, 38,244, 52,157, + 21, 76,180, 11, 88, 43, 96,180, 50,121, 42, 18, 98, 50,133, 53, 40,124, 11,178,165, 12,253,209, 65,111,174,148,189,173,223,124, + 10,190, 69,172, 40,105,145, 15,163, 45, 54, 16, 14, 88, 11,189,135,212, 41,146,114,224,121,172, 0,109,181, 5,172,193,149, 22, +102, 79,244,188,124,124,140,243,105,203, 88, 26,228,136,177,120, 54, 14,140, 13, 41,239,241,204,138,142, 78, 21,190, 24,121,185, +153,218,185,169,148, 27,178, 91,197,245, 93,104,131, 81,163,241,144,166, 7,141,107, 17, 71,247,184, 38,240,100,200, 96,193, 78, + 14, 53, 4, 36,178,102,194,192,138, 93, 47, 54, 42,177, 74,201,132, 83, 50, 78, 20,102,229,248,176,166, 56,133, 31,152, 48,129, +109,156,134,116, 22,157,183,255,198, 84, 2,193, 51, 74, 77, 11, 2,223,121,228, 58,241,133,172, 9, 91,172,163,196,249, 6,248, +220, 81, 2,100, 87,243,179,114,158, 15,101,132,177,156, 22, 28, 16,143,121,118, 54, 48,148,172,231,100, 53, 82,112, 86,242,102, +162,104,174, 79, 9,229,245, 80, 1,130,195,218,156, 65,120, 98,237, 30, 6,163, 6, 37,190,241,215, 17,228,114, 14, 24,156,120, +182,247,180, 49,190,184,177,147,237,170, 48,110,123,183, 91,225, 23,126,121,177, 36,226,146, 14, 85,122, 83,119, 59, 13, 57,216, +109,177, 18, 28,205,178, 76, 44,160,173,128,230,241,176,108,174, 79,196, 34, 20,172,115, 43,229, 76,120, 1, 81, 17,104, 69, 32, +120,123,253,185,118, 27, 48,246, 88,240,154,212,202, 57,118,243, 64,238, 99,239, 21, 91,175,199, 4, 80, 43,228,104, 88,211, 27, +205, 24,172,240,179,168, 59, 30,216, 4, 1, 9, 34,163, 31,170, 94,170,146,154, 5,241, 9, 60,240, 72, 20,148, 24,116, 15, 56, + 19,120, 96,201, 18,166, 16,240, 42,174,148,107, 6, 10, 17,227, 31, 35,208,226,224,198, 73,142, 99,244, 48,140,182, 34, 39,182, + 83,205,144,122,100,227,117, 83,126, 75, 45, 83,209,221,134, 78,138, 55,112, 98, 44, 20,155,209, 34, 38,113, 9,213,243, 83,117, + 66,243,189,246, 29,184,198,138, 68,251,250,208,241,178,205, 57, 44, 54,164,185,211, 71,160,120, 10,247,206,161,117,169,110,170, +176,164,235,217,218,130,235,124,201,251,219,168,213,205, 57, 78,171,246,177,118, 59,101, 61,235,152,220,140, 70, 61,130,156,104, +176, 33, 38,111,137,160,135,207,132,179, 82,228, 56,189,194,125,252, 91,119,139, 16,231,150,171, 87, 55,228, 72,183,155, 77,185, +126, 61,101, 18,132, 5,241,124,145,227,248,112, 4, 3, 14,189, 25,133,146,169, 41, 78, 52, 56,153,244,173,118,167,244, 73, 94, + 80,123, 26, 29, 34, 65,115,250, 52, 98,251,129, 98,236,102,104,221, 29,174, 15, 4,105,208, 13,125,249,114, 65,234, 85,202,123, +198,207,162, 1, 8, 60,196,179, 86,200,228,156,127, 59,158, 81,124,118,154,131, 80,201,204, 64, 79, 27, 87,164,110,213, 32, 61, +113,123, 62, 71,207, 19, 83,124, 35, 88,109,101,231, 10, 93,240,194,217,205, 98, 21,129,253, 46, 24,231,232,166, 76, 90,217,220, +245,176,223,142,220,253, 1,117, 9, 6, 35, 25, 9, 92,233,224, 59,252, 69,226,158, 95, 32,144,157,232, 12, 65,178,111, 12,104, + 2,183,135, 55,246, 66,196, 93,183,159,154, 53,133, 25,211,205,152,172,228,201,197, 84,126,249,163, 67,153,172,180,243, 91, 39, + 44,254, 34,160,130,245,243,160,131, 35,189, 13, 83,158, 68,139,157,217,204,126, 38,214,134,192,143,120, 43,233,247,111,197, 7, +229, 83, 63,199,225, 78, 87,190,121,118,194,241, 59,146, 1,216, 61, 24,107,163, 72,203, 58,110, 49,138, 52,202,236, 38, 17, 93, + 9,251,195, 12, 1, 81, 88, 13, 46, 19, 99, 4,157, 15,134,148,122,174,233, 61,199,153,203,162,147, 79, 92, 76, 2,230,200,207, +146,226,167,119,155,159,141,222, 13, 64, 66, 99, 34,130,145,110, 46, 75, 28, 17,126,150, 93, 91, 97,108,196,125, 92, 83,189,207, + 49,136,220,116, 17,241, 9,211, 30, 88,143,162, 88, 78, 25, 13,144,164,206,228,138, 76, 92,197,130,231, 92,242,180, 0, 24,220, + 18,231,130,238, 29,251,234,123, 71, 71,134,135,152, 27, 40,173,219,110,107, 87,252, 82,191,183, 44, 59,205,150, 28,239,238,144, +237, 17,184,100,157, 2,125, 17,155,128, 57, 66,151,136,226, 57,155,243,183,103,138,197, 28, 88, 80,129, 9,146, 33,113, 97,154, +147,105, 52, 12,196,169,127, 86, 43,151,248,245,245, 90,141,211, 71, 9, 74,164,146,193,143, 33,220, 44,157,239,194, 82, 6,147, + 25,175, 59,228,185, 23,208,101,215, 6,239,120,239, 64, 11,128,146, 28,237,192,203, 92,187,108, 47,195, 24,137, 56, 77,111,134, + 92,214, 77,129,108, 50,132,115,129,149, 22, 18,183,169, 90, 6, 92,139, 20,181,216, 39, 94,138,120, 34,155,158,210,187, 32,107, + 13,202, 81, 43,207,231, 0,114,183, 0, 92, 83,214, 90, 98, 78, 67,193, 95,207,240, 1,218,176,225,146,196,132,158, 86,243, 33, +155, 79,208,164, 79,174, 39, 60,215, 56, 7,136,187,216,193, 35, 7, 93, 79,107,178, 87, 5, 75,195,176, 41, 40, 18,240,254, 58, +221, 38,241, 10,104, 0, 11,249,128, 5,222,100,162,247, 86,175,237, 13, 86,144,139, 21, 65,182,211,169, 94,215,213, 64, 6,218, + 48,128, 66,232,103,160,218,218,144,159,190,127,151,141,225, 88, 27,129, 76,106,226,128,209, 50,110,128,209,194,188,173,158, 53, +146, 0, 21,161,144, 64,157,129,131, 9,206,167, 40, 28,127, 75, 47, 99, 23,109, 53, 0, 35, 6,144,194, 27,103,196, 97,226, 11, +129,187,224, 1, 31,190,112, 97,178,165, 25,118, 96, 49, 71,181, 72, 52, 0,156,181,243,101,233,205, 55,124,176,144,115, 65,117, +107,151,178, 20, 3,225,200,223, 79,182,202, 93, 38,139,105,137, 29, 55, 98,145,216, 88,227,114,170, 21,148, 38,210,124,102,101, + 93,104,198, 70,149, 25,215,129,162,144, 73, 60, 19, 89, 72,182,158,211,241,118,148, 68, 74, 20, 65,120, 27,138, 39, 28,214,180, +123,154,135, 28, 73,117,234, 69,118,159, 80,177,194, 67, 28, 56, 52, 53,130,191,233, 73,196, 20,159,192,193,194, 78, 86, 76,107, +139, 43,130, 18, 1, 21, 17,171,178,210,218,232, 62, 1,246,143,203, 88,134, 27,171,208,113, 45,240, 38,231,161,185, 92, 45,230, +107, 62,224, 5, 4, 29, 13, 16,184,161, 72,100, 86, 73, 39,182,203,210, 3,230,107,254,170,107, 23, 89, 44,149,153, 48,134,227, +145, 1, 22,183,202, 97, 78, 21,208,115, 54,153,148,207,181,224,159,101,183, 42,230,129,238,155,160, 75,226, 92,220, 82,151, 49, +217,118,232,241, 22,212, 70, 37, 44,124, 99,108,244,154,181, 75,166,171,181,117,234,161, 43, 4,169, 20, 6,153,218,156,157, 47, +128,127, 2, 63,216,122,164,227,156,225,253, 96,220,201,207,229, 64, 84, 91, 25, 92,151,252,145,108, 80,140,148, 50, 69, 6, 3, + 58,171, 69, 57, 51, 86,208,159,213,213,128, 4, 16, 25,144,222,212,250,215,239,108, 87,235,212,125,175, 23,181, 96,172,149,236, +245,156,126, 59, 69,105,128, 36, 38, 80,173,160, 65, 41,239, 86, 1,107, 57,234,212,165,172, 21,115,183,221,210,226,106, 41,119, +238,220,149,207,255,240,148,201,167,175,193, 6,238,100,179,121,188,237, 76,184, 70, 32, 16, 80, 52, 40,193,229,171, 72,206,107, +226,192,129,192, 7, 96,101,128, 98, 4,129, 5,220,212,136, 99, 56, 61, 83, 90, 32, 32, 33,155, 10,163, 41,116, 1,248, 23, 80, +225,106,195, 78, 28, 96, 28, 76,157, 98,103,148,147,215,207, 64,149, 43,253, 23, 84,166,162,179,144, 68, 82, 71,209,176,116, 12, + 1, 92, 60, 80,201, 22, 78,242, 23,239,181,136,128, 23,218,148, 32,117,119, 67,242,165,148, 50, 40, 61,171,112, 59,190, 39, 30, +198,169,128,177, 72,208,167, 18,206,102,120, 20,209,145,226, 57, 77, 77, 99,196, 1, 0,215, 75,135,197,112,128,202,116,250,197, +169, 78, 20, 59,136,125,188, 53,254, 97, 35,237,214, 7,214,181,219,116,176,129, 49,179,222, 23,116, 43, 4,114,105,199,254,111, + 63,123, 33,239, 29, 86,229,253,187, 29,249,195,243, 27,238,119,193,139, 6,181, 7,207, 39, 64, 91, 48, 51,202,106,156,184, 25, +204,137,199,201,102,141,130, 5,196,241,108,216,147, 82,173,173,247,171, 40, 59,221, 29,162,235, 47,175,175, 9,122, 2,117, 20, + 5, 26,130, 44,148,210,214,238,124,235,119,179,180,198,185,192, 26,228,188,151,144, 74,151,207,216, 78,255,186,191,148,111,130, +172,220,223,109,243, 92, 25,157, 50,100,119,139, 2,210,174, 81, 66, 64, 87,137, 22,154,182, 90, 24,143,214, 44,158,120,159,215, + 17, 39,109,155,208,237,178,161,244,185, 10,183, 46,132,224,109, 71,137,237,184, 87, 78,181,209,212, 29, 99,118,243, 57,174, 74, +241,108, 22,201,251,198,212, 40, 91,200, 56, 74, 99,204, 73,197,130, 56,153,133,254,154,203,254,206,158, 12, 52, 94, 54, 53, 81, +123,155,185,180, 43,192,224,140, 89,228,238,107, 2,253, 73,217, 24, 51,136,131,136, 61, 88,239, 1,204, 92,175,150,121,174,233, +126, 86, 47, 50, 89, 46, 92, 17,180,219, 42, 82, 22, 22,211, 47,124, 47, 0,140, 65,198,128,138,147, 89,200,184,153,207, 91,241, +132, 70, 1, 19,226,149,254,250,237,151,125,121,125,113,102,241, 61, 73, 39,177, 1,155,153,209,116, 33, 71,221,154,158,127,159, +171,168,151,151,115,105,180, 54,242,214,189,174,100,181,185,193,217, 5,206, 99,179,201,188, 1,163,234,119,150, 74, 9, 19, 43, +129,148,117, 83, 58,164, 17,217,196,214, 6, 17,139,168, 57,147,191,230,111,141, 73, 43, 62,123,112,189, 36,232, 87, 27, 29,240, +243, 25,151,240, 12, 98,218,198, 41,155,239,228,164,109,234,100,190, 6, 9, 49, 57,120,255, 0,145,151, 75,218, 32,101, 55,156, + 86,224, 92, 63,126,254,130,159,167,244,160, 45,251, 13,159, 42,168,104,136, 64,229, 3, 72,183,187,211,214, 98,115,194,231, 58, +227, 71,156,220, 77,103, 80, 90, 13,228,250, 6,218,242, 53,253, 44, 43,105, 53,118,164,166,159,119,120,209,211,164,159,149,167, +167,125, 45,160, 67,121,248,255,114,245,166, 61,150,156, 89,122,216,137,237,238, 75,238, 89, 89, 43,139, 69, 54,217,139,186,135, + 99,201,146,109, 9,146,160, 15,134, 62,250, 15,248,183,248, 63, 25, 48, 96, 88, 48,100, 96, 6,150,212,203, 76,207,116,179,185, + 21,139, 85,149,149,123,222,125,143,205,231,121,206,137,200, 26,247,128,195, 98, 86,230,205,123, 35,222, 56,235,179,188,120, 42, + 47,158,157, 72,188, 35,106,189,193, 32, 1,201,214,200,165, 31,177,151,141,189,139,203, 93,170,173,246, 96, 70,159,234,156, 99, + 36,217,216, 57,181,133,143,134, 82,167,186, 80, 6,144,159, 58,103, 18,177, 66,192,212,148,216, 9, 34,233, 67, 54, 52, 10,107, + 58, 11, 14, 5,132, 88,110,181,123,133, 8, 77,169,213,237,155,171, 57, 65, 26,160,172, 80,154,210,119,250, 60,232,238, 75, 76, + 5,168,210,249,183,250, 94,208,149, 53,186, 7,178,141,244, 64, 53,240,112,106, 5, 40, 17, 71,231, 91, 31,129,138, 3,198, 10, +231,130,150, 62, 89, 48,197,173,156, 35, 37,140,194,146,194,144,227,175, 78,247,100,113, 62,227, 13,125,114,114, 32,135,154,192, + 83,242, 40,141,115,138,239,195, 67, 31,148,166,170,132, 25, 8,138, 28,136,240, 96,116,133,199,170, 65,126, 41,156,134,128,154, +172,236, 68,173, 91, 69, 0,106, 65,114, 81,191,115,157, 19, 74,225,182,162,122,243,225, 91,168, 29,226, 50,181,215,103, 48,118, + 30, 50,186,117,200, 37, 46, 49,162,131, 95, 57,168, 30, 90,233,210,133,136,251, 57,179,248, 3,250,191, 2, 36, 33,185,132, 46, + 55,154, 87,110, 93,164,235, 45, 77, 38,178,116,145,152, 64,106, 78, 55,129, 75, 72,160, 88,174,137,119,209,187,173,239,213, 67, + 71,105, 26, 98,180,178, 68, 53, 0, 85,219, 30, 80, 31,243,226, 28, 65, 36, 4,129,105,137, 14,168,209,240,189,124,240,209,110, + 40, 35,245, 3,247, 51,230, 84,197, 10,181,106, 95,140, 17, 99, 19,232,104,140,248, 83, 11,122, 8,182, 40, 40, 90,238,170, 84, + 82, 86, 51,228, 14, 20, 73,169, 73,135,188, 53,167, 35,237,118,201, 74, 24,215,114, 52,158,202,253,197,157, 38,243,142,188,122, +124, 32,211,251, 59,114,153, 65,217,124,245,226,153, 44,180, 96,128,253, 41, 42,234,183,111,111, 72, 83, 60,222,239,201, 45, 53, +154, 31, 76, 73,240,121, 33,106, 81,164,123, 28,161,127,255,126,172,137,127,230,150,184, 38,190,129,103,129,215,215,249,222, 29, + 45,190,112,241,209,141,115,154,160,137, 30,106, 97,177, 83, 64, 49,150, 29,148, 29, 6, 19,188, 6, 2, 4, 21,170,124,188, 13, + 65, 23, 3, 79,101, 12, 38, 60, 71,177,143,253, 0,160,210,128, 5, 30, 53,166, 72,152, 38,160, 19,220, 34,209,186, 5,177,173, + 73,204, 29, 14,247, 14, 0,171, 66,131, 59, 21,197, 34, 43,254,114, 87,165, 99,194,117,243,139, 93,102, 78,128,199, 61, 19,103, + 41, 93,240, 51,247, 34,138, 54,145, 78,107, 44, 93,107,158,171, 14,160,166,161, 38,169,201, 50,202,140,250, 87,134,230,116, 22, +137,157,195,202, 92,188,160, 21,174,121,186, 67, 99, 1,207, 98, 43,106,139,113, 73, 34,185,154,103,242,111, 94,244,184,103,207, +151, 59, 77,204, 11,118,142,227,247, 55, 28, 79,246, 58,134, 76,222,215,164,115, 59,209,251,190, 92,112,202,128, 81, 61, 34,200, +118, 57, 99, 17,183,205, 99,249,252,213, 43,238, 64, 25,100,123, 37, 71,171,141, 4,204,158,136,142,147,232,206, 64, 39, 68,167, +188,166,225,146, 21,199,157, 78,139, 83,149,210, 87, 65, 71,253,166,141,170,233, 74,153,213,147, 20, 98,137,202,140, 93, 33, 64, +135,248,152, 61,141, 27, 29,200,233, 82,162, 84,187,176,109,106,130, 51, 26, 95,102,208,204, 7,247,188,145, 51,102,112, 26,165, +103, 29,133,146,169,251,153,113, 72,238,236, 35,250, 32,136,120, 82, 15,120, 6, 50,122, 60,236, 76,118, 25,103, 36, 35, 68,214, +108, 89,245,154, 66, 1, 13,227,248, 97,175, 43,167, 71,135,122,109, 51,249,217,231, 63,151,255,246,151, 31,169, 64,247,228,228, +137, 22, 58, 63,201,127,251,211, 55, 6,112,135, 38, 8, 98, 76,105,244, 70, 28,139,151, 39,123,230,169,238,156,117,196,144, 55, +151,134,225,168,146, 43, 37, 78,211,146, 56, 11,112,210,177,147,223, 82,188, 74,216,188,224, 25,253,236,147, 47,245, 28,232,107, +172, 70, 18,182, 58,198,219,231, 53,109, 83, 72,167, 21, 97, 37,188, 39,195,110, 66,139, 82,128, 50, 55,235,165,252,239,255,247, +239,220,140, 74,152,119,182,219,140,160,187,141,107,241,179,136,212,223, 53, 26,207, 89,172,131,186,219,108,132,116,111, 3,202, +125,167,241, 0,197, 7,214,129,184, 87,179,249,138,133, 8,168,139, 4, 0, 19,151,148,217,138,204,139, 76,107, 82, 75, 95, 36, +139,209,229, 62,214, 28,192, 89,142, 90,204,127,160,163,174, 54, 70,125, 70,211, 0,161, 32, 20,168,185,158,193,103,199, 45, 27, +253,195, 93,111, 52, 49,163,167,195,158, 92, 93,221, 83,193, 79,124,146,133,236,242,252,180, 41,119, 51,205, 99,122,209,198,218, +141, 15,122,199,250, 53,196,176, 57,159,251,183, 23, 83, 22,244,143,142, 51, 60, 39, 49,107, 26, 42,114,121, 96,134,235, 77,150, + 89, 39,105,168, 89,203,234,150, 48,163, 90,224,163,112,201, 88,122,192, 74,225, 50,136,110, 16,225,213,119,104, 66,156,210,136, +197,253,177,141,139,201, 11,215,178, 81,107,224, 58,212, 8,186,224,122, 95,141, 22,178, 7,247, 25, 32, 25,239,167,236,186, 26, +218,149, 33,240, 64,219,182,146, 48, 68, 18,192,206,240, 96,208,208,174, 40,101,128, 89,109, 66, 89,234, 5,123,249,244,140,191, + 15,213, 91,179, 61,148,199,167,129,220,142,166,236, 62,182,105,101, 37, 27,200,139,211, 33, 95, 23,238, 61, 53,202, 31,187, 66, +125,195,199,131, 54,249,175,236,194, 32,148,160,127,241,135,159, 38,124,207,232, 30, 2,223, 91, 98, 45, 81, 73, 42,226,147,193, + 16, 5,113, 60,103, 25, 97, 99, 70,116, 17, 8, 20, 41,249,171,133, 59,153,149, 53,213, 5, 62,244,214,205, 89, 64, 78, 29,253, +138,221, 32,167, 21,161, 85,203,182,223,204,157,175,106,129,118,186, 46,100,190,179, 64,139,177, 33,170, 79,136, 36, 0,161, 9, +154, 76,228,251, 98, 36,114,152, 92,240,193, 39, 32,241, 65,222,213, 18,185, 81,151,240,174, 72, 75, 11, 13, 29,109,210,175, 15, + 86,170,214,241,123, 39, 69,113, 13, 87,136, 35, 80, 4, 91,127,239, 6, 99, 83,148, 74, 60,129,155, 11, 90,204,157,219,218,187, + 12, 19,183, 49,106, 14, 84,229, 0,136,130,199,122, 27,163,230,188,160,196, 37, 84,155,250,189, 1,223, 91,197,191, 46,125, 31, +207, 29,172,211,128,118, 89, 86,143, 36, 35,167,229, 85, 52, 31,120, 50,175, 40, 35, 25,202,223,125,119, 37,191,126,165,213,174, + 6,100, 4,214,255,244,247, 63,201,239,126,184,149,159,107, 96, 63,191,221, 74,103,119,195,209, 39, 44, 83, 49,218,108,105, 55, +247,211, 79,111, 36,229,126, 50, 35,122,253, 94, 43,234,181, 22,193,227,121, 78,173,234, 14,169,104, 13, 6,186,181,118, 58, 64, + 15, 35,240,194, 10, 18,221,122, 24,197,142, 76,214,206,101,208, 55, 49, 19,119, 59, 35,127, 53, 55,233, 95,232,188,163,208,189, +155, 78, 13,229,143,209,156,118,240,248, 58,232,117,247,232, 86,105,253,106,200,241,109,106, 90,240,116,150, 34,215, 62,151,102, + 97,193,151,158, 3,149,101,170, 94,230,133, 6,195,134, 53, 65, 28,197,195, 8, 5,207, 51,180, 33, 0,152,196,185, 71, 23,117, + 61,221,176,192,132,170, 31,206, 56, 18, 20,198,144, 16,107,170, 4, 99, 32,126,131,137,216, 40, 48,124, 3, 70,154,235,170,139, +201, 74, 95,133, 84, 50,179,214,201, 24,150,198,185,243,120, 77,200, 33, 6, 15, 30,239,153, 3,147, 66, 79,242, 59, 34,145, 99, + 2,200, 82, 38,199,134,221,103,253,108, 3, 45,154,222,142, 50,249, 95,134,134,183,217, 17,225,110,231, 25,102, 79, 64,124,195, + 24, 3, 99,236,110,183,197,130,134, 19,166,194, 88, 17,161,190, 38,246,206, 2, 95, 4,189, 70, 40, 60,127,245,249, 75,153, 76, + 38,178,131,169, 7,138, 19,231,204,179, 32, 69, 98,228, 20, 68, 88, 56, 26,102, 32,150,195, 97,143,187,107,210,204, 48, 93,137, +140,206, 5,188, 5,215, 33, 16, 16,210, 4,205,231, 42, 55,109,248,194, 39,138, 80, 31,227,202, 50, 10,141,250, 27,154,254,185, +121,202,219, 42,105,163, 93,230,106, 49,229, 56,154,190, 17,206, 6, 68,103, 87, 56,134, 8, 56,139,194,169,185,120, 38,184,146, +162, 67, 88, 66,208, 95,165,154, 72, 62,251, 6,236,138, 45, 19,251, 90,223, 23,164,114,159,106, 1,244,225,250,134,210,185, 17, + 93,216,154, 76,102, 16,228,145,226,177, 38,225, 55,154, 80,150, 94,204,155,186, 99,225,130, 80, 63, 92,220,154,107,103,173,204, +104,137,205, 86,110, 22, 71, 13,111, 99,137, 16,184,133, 84, 11, 13, 20,104,208, 34,137,108, 92,195,132, 14,176,219,111,190,252, +140, 66, 56, 0,167,246,124, 2,138,114, 15,160,109, 60, 23,208,180,128, 30, 58,242, 17,227,162,158,193,223,127,253,150, 9, 81, +156, 54,140, 56,105, 76,187, 53,241, 12,248, 25, 60, 75, 0,161,165,219,146,210,181,196, 40, 20, 33, 63, 43, 27, 10,178,102,182, + 90,160,105,193,143, 66,173, 97,247, 26,194, 93, 77,125, 14, 74,183, 21,166,109,183, 99,134,122,237,164, 6,108, 83, 50, 54,182, + 85, 36, 48, 3,153, 79, 55, 83, 22,219, 49,155, 78,228,141,123,109, 32,118,233, 15, 50, 95, 60,210,216,115,172, 57, 14,247,193, + 20, 63,111,239,103, 82,237, 49,108, 82,184,113,115, 35,232, 86, 52,228,116, 88,202,197,164,208,216, 96,224,230,179,163, 83,105, +134, 59, 78,124,214,250,144,190, 62,159,202,104,194,213,128,113, 57,197, 65, 22, 8,130, 6, 22, 19,186, 21, 33, 1, 36,212,158, +137,235,100, 82, 41, 8,113,164,238,230, 28,161,239,168,237,107,230,186,134, 96,129,221,117, 76,250,133,240,193,163,188,168, 87, +226, 81, 96,133, 66,189,107, 69,231,162, 15,227,177, 86,106,157,134,118,199,250,139,177, 75,135,158, 48, 42, 88,160,238, 81, 17, + 66,185,206,204, 4, 52,249,232,131, 68,173,233, 34, 96,225,208,219,107, 75,217, 62,229,104, 25, 32, 52, 28,138,133, 86,180, 61, +125,104,250,221,166,204, 96, 50, 66, 69,159,152, 59,238,175, 62, 61, 33,231,254,106,190,165, 9, 3, 80,251,240,134, 71,124,216, +235,119, 37, 2,232, 68,127,217,235, 55,151, 12, 20, 8,202,216,163,231,142,112, 36,181, 12, 35,174,118,117, 0, 75,238, 32, 41, +191,138,253,142, 87,119, 38, 90,227,118, 77,110,142,128, 74,222, 64, 18, 86,212, 84, 73,137,221,121,110,160,194,202, 11,155,197, + 12, 42, 87,234,187, 4,220,109, 45,244,107,171, 34,150,233, 54,115,129, 18,219,169, 97,133,144,101,121,173,207, 30,227,129,143, + 19, 71, 77, 7, 46,225, 90,214,157, 90,165,209, 46,254,187,170,196,153, 17, 12,105, 83, 16, 28,214, 32, 15,106,250, 20,195, 83, + 97,180, 53, 78,112,228, 1,236, 68, 94,184,171,170, 97, 84,184,173, 12, 81, 40, 51,107, 35, 59, 34,182, 25,128, 18, 23,232, 40, +124,119, 95, 80,186,211,120,242,160,145,180, 89,205,227,123, 49,206,196,123,133,240, 3, 58, 93,152,213,228, 44, 20,108,151,156, +126,228,228,134,117,131, 73,162,134,156, 84, 72,105,180, 57, 32,103,255,207,255,250, 45, 31,246, 95,189,108,202,187,235,145,188, +131, 8, 17,130,156, 38,165,203,187,169, 60,214,162,172,215, 31,202,124, 59, 54,207,249, 8,197,212, 82, 26,195, 33, 31,238,237, +214,244, 13,238,167,154, 20, 34,208,118, 2,114,176, 97, 39, 73, 94, 55,172,108, 51,163, 99,157, 29,238, 51,217,183,156,115, 78, +227, 22, 10,200,236,216,113, 32, 81, 96,111,142,194, 18,207, 15,237, 90,251, 93, 22,100,176, 83,196,184, 29, 35,192, 28,221, 30, + 70,231, 94,156,129, 66,133, 68,128, 4,128, 49,255,106,187,115,249, 91,128,124,130, 90, 81,207,170,125, 75,196, 0,181,161,238, +108,106, 48,133, 67,225, 18, 69, 18,192, 65,212,215,213,123,209,104, 49,112, 10, 16,246,137,211, 68, 11, 23,133,114,168,157, 33, +183, 29,104, 26, 4,220,103, 18, 17, 76, 41, 93,179, 24,165,131, 33,181, 79, 3, 82,209, 2,151,160,173,236, 71, 75, 71,184,187, +137,179, 5,224,178,116, 32,159, 1, 23, 93,239,216,148,246,124, 77,195, 29, 60, 2,187,254,243,244, 81,155,157,203,155,243,123, +217,239,128,237,209,160, 40, 16,236,154,145,180, 48,246, 6, 74,248,237,245,148,190, 14,160, 1, 2, 45, 62, 70, 39,230,192,216, + 45, 89, 23, 5, 85, 32, 39, 26,248, 17, 7,146,210,212, 26,151, 24, 13,239, 92,167,127,107,157, 40,167,136, 4,188, 13,121, 47, +177,118, 0, 38, 9,248,150,166,163,245,241, 76,204,215,150, 52, 75, 23, 6,232,208,168,167,237,133,181,117,213,181, 65, 74,104, +105,141, 44,132,220,146, 27,198,255,232, 40, 81,204, 82,250, 85,239, 11,232,119,166, 41,150,179,224, 42,252, 57, 52, 63,118,139, +187,152,180,128,113,130,248, 88,144,167,223,192, 0,218,176, 41,136, 71, 88,187,233,107,175, 54,115, 62, 39, 48, 50,193, 57,254, +246,221, 7, 9, 50,237, 88,181,224,223,235, 64,222,181,207, 17,252,235, 55,175,217, 16,189,122,254, 76, 86,223,253,192,231, 17, +172, 27, 36,117,238,255, 51,155,168,221, 77, 23,198, 95, 7,248,185,233,147, 83, 49,138, 36, 87,139, 97,131, 73, 20,212, 67, 60, +151,237,106,133, 84,152,144, 15,242,195,254,209,158,222,195,196,214,108, 97,131,157, 50,214,119,152, 46, 66,124,167,244, 51,133, +194, 31,160,176,179,147, 83,106,159,252,242,243,103, 50,154,239,228,234,126, 98,184, 47, 76, 8, 60,223, 64,184, 11,147,173,110, +210,150, 37, 87,107,214,116,161,121, 74,195,128,180, 55,116,223,104,124,128,163,233, 52, 7,204, 27, 13, 78,244,118, 60,251, 40, +224, 81, 40,195, 27,189,210, 80,232,107,254, 0, 94, 6, 96,241,210, 89, 91, 69,209,224,179,136, 9,218,116,189,227, 20, 0,205, + 5, 39,182, 96,232,132, 77,190, 38,226, 37,238,253, 79,231, 23,244,132,248,171,151,208, 2, 41,217,108,204, 87,107, 45, 42, 67, + 22,161,112, 40,157,122, 62, 54, 59,215,146,177,225,233, 65, 32, 55, 55, 43,125,207,251, 50,154,109,228,104,239,169, 4,227,119, +156,120, 2,231,160, 89, 78, 98, 84, 0,168, 40,113,192, 3, 19, 33,230,168, 24, 20,139,163, 97,167,182, 12,205,139, 7,201,201, +202,214,145,136, 88,215,184, 46,188,107,101,183, 22, 85,244,160,178,222,201, 25,146, 60,245, 4,103, 35,135,140,187, 42,169,209, +231, 52,121,225,232, 58,164, 65, 2,170,188, 78, 35,244, 20, 98, 10, 69,160,165,132, 46,230,130,135, 6, 32, 12,116,181, 39,123, +118,128, 80,157, 74, 43,102, 59,210,103,145, 80, 58,165,164,144,253,179, 35, 75,204,168,230,225, 20,215,109, 26,183, 94, 51,229, + 95,125,118,194,106,154,149, 17, 68,251,193,117,198,248, 74,204,206, 19, 35, 35, 8,242, 0,232, 2, 63, 38, 9,163,127,226, 23, + 30,110,179, 26, 45,110,160,163,130, 64, 29,155, 98,216,168,138,188,241,194,170, 87,114,237,221, 57,206,146,108, 97, 93,109,108, + 9, 9, 63,191,118, 39,172, 32, 46,153, 36, 66,239, 72, 97,203, 55, 7,202, 58,106,218, 56,177,176,241, 14,130, 4, 58, 91,240, + 38,171, 93, 52, 18, 32,173, 23, 27,182,187, 45, 89,117, 69,110,167, 26, 24,135, 87, 3, 8,139, 53, 87, 66,195,231, 49, 46,172, + 43,180, 33, 64,165, 22,196,185,123,166, 8, 79, 86,139,142, 66, 73, 77,124, 39, 91, 97, 38, 76,135,125,199, 63,227, 76,209, 57, +170, 48,247,179, 74, 78, 21,157, 48, 43,104,116, 54, 12,102, 6,114,139,221, 60,136,129,167,217, 50, 31,250,205,214,193, 53, 67, +227,124,163,115, 17, 71,128, 55,155, 60, 91, 72, 6, 64,202, 47,214, 72,226, 45,126,230, 20,136,242,204,126,127,165,122, 7,148, +232, 31,190,121, 71,149,177, 15, 55, 19,121,119, 53, 38, 24,110,181, 94,146,194,212, 78,186,146,104, 65,251,179,231, 45, 98, 19, +222, 92,220,115,186, 4, 80,216,253,100,101,202,132,120,191, 96, 31,108, 77, 61, 15,215,110, 91, 66,240, 40,228, 26,128,166, 50, +122,221,247, 14,134, 44, 46,241,126, 65,119, 2,181,111,189,219,112, 47,216,218, 5, 44, 22,160, 42, 87, 77, 93, 54,233,198,215, + 73,134,121, 64,251,252,248,120,224,118,157, 13,125, 47, 55,188,198,247,211,185,252,252,147,167,178, 63,140,249,153,110,180,195, + 4, 66, 28,222, 10, 8, 4,192,175,228, 94,188,149, 13,116, 37, 45,189, 54, 75, 13,220,218,197, 14,204, 90, 55,194,200, 87,239, + 43, 38, 16,205,200,112, 36,224,235, 86, 3, 36,179,154, 20,231, 26,219,154,136, 42,105,149, 74, 59, 49, 45, 37, 39, 85, 68,220, +187,240, 84, 88, 26,155,161, 42, 18, 43,241, 37,128,197,136, 55, 0,100, 10,157,139, 41, 87, 27, 82, 61,207, 30,208,221,254,255, +209, 80,160, 0,194,115,143,194, 5,159,139,142,117,154, 24, 33, 16, 3, 36,254,111,191,191,151, 95, 60,237,201,165,199, 39, 88, + 55, 35,246, 96,103,138, 87,195,250, 2, 93, 47,186,105, 4,115,116, 84, 8,158,143,251,135, 92, 1,252,248,238,173, 28, 29, 63, + 33,255,124,166,239,121,111,111, 72,150,203, 48,214,228,189,159, 48,144,239, 56,254,207, 57,181,192,212, 11, 93, 20, 10, 27,136, +126,224,189, 99, 2,178,195, 61,239,152, 34, 35,232,160,152, 22,132,252,125, 54, 62,167,186, 26,227, 87,224,234,136, 54,253, 66, + 33, 15,124, 13,186,252,208,129,186,187,118,155,198, 33, 81, 84, 57,196, 65,165,174,237,238,126,230,222, 70,217,236,157, 97, 92, + 50,198, 97,187, 47,120, 31, 88, 35,224, 10,130,219, 60, 24,236,177, 24,164, 20,183, 62, 39, 24,235,163,160,228,212,212, 53, 61, +226, 48, 33, 43, 8,130, 48, 81,164,215,118, 49,209,124, 16,201,187,243,115,249,213,207,247,229,217,147, 23, 4,142,181, 8, 42, + 11, 9,116, 70,220,197,202, 0,103,246,237,205,148,187, 94,116,214, 7,189,150, 43, 20,218,164, 7,177, 28, 13, 33, 18,232,254, +160, 77,221, 0,128, 9,169,135,145, 27,162,158, 29,241,202,118,217,179,197, 74,174,111, 87,242,195,251,239, 89, 4,150, 44,210, + 17,155,244,218,181, 91,110,175, 92,200,207, 95, 82,241,132, 20,177,255,241,215,159,200,239,255,252,142,135, 7, 30, 28,152,102, + 18,244, 73,229,200,146,247,163,215,107,153,241, 81, 94,210,199, 4,184, 11,116,218,192, 78, 32, 66,127,246,108, 95,230,187,150, +139,117,133,114,121,125, 35,231, 90, 16,246,245,231,110,119,107,121,113,186, 71,169,238,203,209,154,158,229,157,184,164,105, 24, +166,116,200,119,104, 24, 81, 48,226,254, 97, 77, 12,243,129,201,116,172,241,119,200,162, 14,247,133, 94, 16,100, 17,164,124, 47, +223,254,244, 78,243,201, 75,121,126,144,106, 19,209, 37, 29, 22,128,105, 19, 29, 50, 16, 95, 4, 17,181,141, 97, 98,118,243, 53, +243,208,171,199,109,234, 43, 52,123, 29, 89,193,208,108,240, 84,138,209,159,157, 22,172,255,244,219, 6,130, 59, 26,116,233, 4, + 3, 64,194,249,237,146, 9,172,225,182,166, 69,109,115,233, 18,163,174,174,246,192, 87, 46,107,165,163,210, 29,219,108,108, 31, +212,106, 81,245, 94,174, 48, 30, 48,119,110, 14,172, 50,100,161,209, 52, 90, 90,165,133,253, 6, 43,248,210, 59, 72, 92, 16, 19, + 63,136,101,180, 72,229,248,160, 75, 11, 63, 36, 19,173, 1,165,223, 52,208, 19,128, 66, 56, 4, 24, 91,147, 83, 88, 66,190,115, +103,198, 10, 26,164, 3,252, 46, 4, 75,125, 56, 90,145,153,196,112,159, 12,159,227,209, 84, 59,218,140, 84, 56, 0,192,176,135, + 77,177,150,128,240, 73, 28,242,192, 2,153,137, 67,221,208,191, 67, 85, 29,186,184, 9,198, 70,181, 98,148, 24,104,173, 44, 35, + 15,138, 5, 21,182,104,214,224,244, 33, 36, 7,113, 10,159, 25,140,184, 96,139,107,124, 3,157,218,242,215,142, 35,219,117, 99, + 98, 1, 16,213, 84,187,251,109,168,221,171,126, 29, 85, 57,198,166,248,205, 8,114, 0,237, 25,230, 32, 97, 66,135, 66, 22,174, + 57,146,201,142, 65, 32,119, 49,146,144, 85,114, 69,189, 17,169, 36, 82, 75,202,188,150,185,141,140, 48, 30,196,251,233, 55,237, +126, 0, 73,143,100,142,142, 56,243,100, 44, 78,161,194, 24,157, 98, 49, 31, 57,176, 85, 86,170, 68,193,122,226,173, 76, 84, 32, + 16,211,160, 91,156,141,111, 11,231,146,227,194,180,162, 38, 71,229, 89,190,178,206, 95,239,101,151,212,159,200,167, 24, 57,119, +228,125, 77,240, 24,133, 46,224,196,228,122,225,149, 56, 13,198,200,116,217,154,167,182, 86,112, 64, 22, 36, 61, 3,125,223, 31, +110,231,212, 30,128, 38,244,129,118,224, 48,107,192,131,132,113,245, 20,218, 23,177, 94,171, 86,168, 73,124,202,221, 99, 11,163, +203,157, 81,248,224,128,133,103, 1,251,218,197,120,237,226, 30,166, 71, 15,233, 99, 88, 68, 98,148,190,212,115,118, 59,157,201, +139,147, 3,249,241,242,158, 10,118,112,207,217, 2,208,147, 54,140,206,153,153,217,197, 82,207, 25,238, 1, 10, 83, 24, 70,160, + 16,130, 90,148,185, 96,161, 0,214,224,163,127,247, 2,222,209, 55,119, 28, 61,254,229,237,133,188,122,114, 34, 63,251,228, 76, +228,167,146,138,121, 40,186, 80,160, 32,129,226, 30,182,121, 54,109, 71, 92,169,137, 97,135,221,238, 1, 56,182,150, 22,168,148, +176,186,212,196,135,117, 4, 58, 34,170,115,101,152,178,108,121, 86, 67,159, 64, 1,241, 78,119, 63,132,129,192, 18,123,133,158, + 55,197, 64, 83, 25, 12, 49,124, 41,204,146,182,210,103,224,244, 5, 90,224,161, 49, 92, 24, 81,130, 7, 53,250,130,158,211, 62, +234, 46,139, 90,251, 30,255,152,138, 23,152, 38, 38,173,137,241,242, 68,239,249,163,227, 99,249,233,126, 39,191,121, 17,152,136, +139,152,154, 29, 58,114,116,142, 56,206, 79, 79,135,114, 51, 90,242, 57,220,223, 51,128,228,252,221, 53,193, 89,112,220,203,178, +153,220,220, 94,201,193,225,153, 22,114, 61,233,104, 16,199,234,138,214,153,228, 38, 55,109, 42,232,227, 86, 76,222, 70,179,181, + 77,180,244,235,143,246,160,222,216,115,186,165, 57,172, 1,236,134,102, 8, 74, 97,102, 40,149,106, 17,102,210,173, 41,214, 97, +113, 76,250, 29, 58, 55, 36, 49, 76,126, 54, 59, 19,163,161, 73,137,158, 33, 20,130,161,131,119, 73,253, 2, 87,222, 69,160, 50, + 41,125, 10, 83,212,107, 68, 50,146, 28, 88,138,215,192,151,247, 57, 90, 14,233, 70,136,142,247,226,110,204,107,108,128,199,146, +207, 32, 98,236,233,193, 64,222, 93, 94,105,156,232, 83, 35, 3, 83, 27,154, 6,233,223,221,220,156,203,201,201, 83,217,106, 81, +248, 55,191,255,218,252,238, 51,211, 80, 0, 78, 0, 19,119, 82,243,180,120,133, 76,235,229,104,198,164,143,107,128,142,158,205, +136,235, 83,112, 58,151,226,191, 81,148,161,105,179,255, 94,232,231, 69,140,193,179,140,228,248,228,233,151,250,140, 44,232,234, +135,107,166,209,220, 76, 95,144,164,193,238,208,115,116, 55, 94,200, 45,228,188,143, 23, 44,192,143,246, 90,188, 94, 89, 22, 9, +224, 41,184,134,120, 6, 32, 97,142, 88,222,235, 53,181,155,221,200, 54,200, 9,196,158,107, 28, 61,212,159, 65,129, 3,166, 4, +252, 22,110,225,127,161,207,222, 39, 79,246,228,228,104, 32, 23, 90,172, 96, 50,215,109,196, 68,150,179, 48,210,247,115, 51, 89, +203,176, 21,146,137,129,179,139, 38, 11,247, 3,236,177,121,110, 77, 80,204, 85, 68, 70,244, 62,206, 43, 70,228,184, 8,116,175, +212,251,118,116,176,207,179,254,253,185, 54, 12,193,190,188,136,215, 52,123, 25, 14, 90, 50,154,216,249,138, 19,123,174,232,130, + 8,164, 59, 56,236,204,153,161,236,247,180,104,160,106,170,222, 11, 45,118,158,124,250, 11,145, 55,223,200,120,169, 63,135, 68, + 9, 37, 27,140,201, 90, 45,204,238, 7, 12,158,179,197,206,248,114,121, 81,143,103, 11, 7,162, 25,218, 82,106, 73,202,176, 18, + 6, 41, 77,144, 70, 28,196,198, 19,233, 59,119,147, 32, 48,109,118,140, 0, 63, 59, 27,202,253, 61,192, 47, 59, 57, 24,180, 9, + 54,107, 17,226, 31, 17, 89,140, 17,219,219,169, 38,162,184, 33, 47,158, 28,200, 78, 35,197,190, 6,246,102,127, 32, 95, 60, 30, +202, 73,191,193,177,236,118,181,226,200,124, 85, 88,160,233,234, 7,196,232, 9,157, 14,118, 41,115, 40,188, 33, 72,233, 67,146, +233, 69, 0,154,120,208, 52, 17, 1,242, 78, 17,140, 1,174, 10,205,128, 32,119,185, 69,113,203, 80, 72, 74,162,150,217,211,130, + 97,167,209,254, 87, 47,246,229, 31,207,151,124, 0,113,112,241, 48,205,181,130, 26, 12,250, 76,188,184,233,168,216,154,238,222, +133,138, 98, 73,237,246,192,124,149, 3,211,240, 69, 66,229, 56, 20, 9, 54,119,139,208,208,162,220,181,118, 10,179,117,226, 96, +161,130, 15, 9,168, 94, 1,198,163,154,208, 33,164,128, 98,195, 36, 18,211, 7,199,177,192, 14,193, 80,175, 17, 11,133,122, 63, + 41,236,144,243,220,187,235, 32,228, 67, 91,184, 3, 30,186, 72,142, 35, 49, 14,135, 24, 10,128,102, 46, 20,130,175, 3,184, 5, + 64, 17,208,218, 27,237,132,147,174, 77,119,170, 32, 54, 76,140,234,132,202, 24, 15, 38, 80,155, 21, 45,174, 25,218,239,173, 86, + 60, 85,241,131,135,135,224,146,157,141,212,147,102, 82, 99, 49,240, 45,144,113, 21,183,105,173, 58,127,252, 5,222,107,133,210, + 6, 85, 9,197,204,100, 58,225,239,174,146, 11, 10,130,165,235,212,103,206,153, 53,116,125,204,194, 7, 15, 57,254,119, 53, 30, +179,251,125,116,212,231, 12,109, 71, 19, 32,163,250, 13,122, 9, 63, 71,166,193, 37,211, 98,110,239,176, 79,254,118,186,217,114, +220,126, 9, 53,172,251, 29, 59, 16,186, 98, 81,184, 39,231,148, 7,149, 54,248,183,216, 1,227,253,191,185,188, 33,205, 17, 5, +215,209,112,143,184, 7, 51,167, 49,110, 52,174,123, 88, 26, 72,148,188, 91,174,136,218,236,254,167, 26,161,126,252,112, 33,123, +253,158, 25, 74,232,249,238,193, 13,109,177, 99,209,245,221, 59,160,176, 71, 60, 11, 13,202,227,106,145,147,175, 57,170, 35, 59, +130,120, 9, 3,132,226, 44,246, 6, 29, 83, 12, 68,119, 23,195, 62, 51,151, 67,237,228, 71,115,163,215,133,153,117,206, 0,177, +198,185, 21,243,248,126, 27,155, 35,185,239,124, 58,149,213,210,202, 89,240,208,125,150,206,130, 41,217,149, 4,116,212,203, 3, +115, 44, 11, 93,208, 2, 73, 39,112,155,209, 10, 41,159,196, 21, 8, 22, 99,208,166, 61, 31,240,140,214,115, 2,191,121,250,212, + 71, 5,105,170,232,124,209,193,227,119,254,112, 3, 42,104, 87,246,219,129, 92,205,114, 58,138, 97, 18,134,174,232, 78, 63,211, +217,241,144,197, 26, 76,102, 48, 9,196, 84,231,116,127, 79,238,102, 11,121,220, 59,214, 4,222,149, 27, 45,134,154,177,225,116, +114, 7, 35, 2, 83,130,129,220,120,185, 34, 21,105,183,219,186, 65,144, 38,148,201,194,180, 28,168, 16, 88, 61,187,166,121, 94, + 33,229,109,245, 19, 80,244,138,248,131,157, 61,107,164,156, 37,177, 79, 41, 77, 32,106,231, 32, 72,210,231,244,250,225, 62,231, + 14, 54, 54,189, 1,195, 49,225,130,165, 78, 21, 54,175,132,240,193,194,216,117, 3,240,189,213,138, 3, 77, 82, 76,127, 37, 60, +151,250, 12,199,166,158,134, 61,114, 20, 74,237, 88,200,149, 16, 88, 78, 96,208, 96, 23, 28, 32, 39,148, 92, 41, 65,167,160, 57, +189,231, 20, 13,154, 15,175, 63, 92, 25,155,161,180, 2,142,189, 26,204, 72,198, 90,252,142, 38, 54,189,113,224, 51,229,110, 19, +147,142, 37,189, 80, 76, 17, 52, 14, 76,212, 11,188,108, 90,103, 99,162,177,217,113,181, 88,210,193,174, 33, 47,159,190,148,103, +143, 76,175, 1, 69, 45, 19,115,183,237,142,110,161,188,213,247,241,231,215, 31,228, 31,126,184,214, 14,119, 40, 95,125,254, 72, +102,155, 66, 30, 29,118, 56,165, 29,207,215, 46, 93, 29,208, 24, 7,166, 93,152,160, 78,180,105, 53, 1, 32,125,255, 69, 91,254, +217,203, 61,249, 79,191,123, 39,179,121, 68,147,148,116,145,201,251,203,130, 70, 44,135,251, 29,142,184, 49, 97, 72, 83,211,161, +160, 80, 17,158, 31,106,248,155,181, 48, 26,115, 18, 70,242,210, 29, 41, 67,250, 19,240,217, 40,205,167,192, 86, 48,145,199,179, +144,227,242, 61,109, 38,110, 71,119,242, 90,175,251,147,211, 79, 52,158,105,108,165,165,115,194, 98,190, 65, 15, 8, 51,215,162, + 80, 22,239, 85,198,251,119, 56,196,107, 45,100,178,106, 8, 52, 16,123,189, 67, 57, 62,123,161,177,112,142,115, 12, 23, 51,243, + 13,199,193, 3, 48, 8, 47,138, 7,230,110,178,146,202, 22,130,180, 37, 15,144,165,139,199, 16,238, 22, 62,136, 83, 86,201,133, +162, 46,238,137, 93,120, 48,169,116,158, 65,139,160,184,136, 86,158,167,123, 13, 58,148, 25, 71,208,118,138,107,253, 61,227, 77, +201,110,231, 98, 27, 19,225,124,130,221, 42, 70,168,250,158,160,137, 94,148,102,225,154,226,112,232,107,131,246,197,209, 47,144, +221, 20,199, 79,153, 92, 17,176,223,222,204, 24, 56,158,104, 65, 16,248, 36, 1, 29, 38, 68, 36,240, 25, 40,147,170, 15, 49, 2, +115, 22, 52,184,183, 2,186,176, 73,141,115,227, 19,182, 1,208,211,215,255,230,122,198, 29, 29,164, 13, 81,133, 87,157,246,135, +139,145, 60,123,146,178, 43,194, 53,120,243,254, 86,142, 15, 7,244, 13,166, 78,240,120,206, 42, 14,116, 10, 90, 88,162, 27,239, +118, 41,124, 0, 65,146, 21,124,138,245,112, 32, 88,167,122,160, 97, 88, 96,102, 15,194, 10, 17, 99,179, 39,143, 79,184,107, 3, +144, 39,171,105, 73, 40,198, 18,215,185,182, 81, 33, 36, 74,113, 27,176,135, 53, 64, 79, 92,131,220,176, 99,163, 90,159, 38, 70, + 32,144,145, 76, 64,175, 98,162,107,182, 13,148,135,107,231, 99,114,116, 50, 20, 85,240, 29, 63,237, 62, 17,124, 40,251,232, 12, + 2,218,144, 91, 37,138,209,109,229,104,148,249, 58,129, 69, 12, 36, 32, 73, 55,139,120,111,184, 11,132,187, 24, 42, 77, 80,116, +124,116,203,226, 49,207,107,135, 51,226, 2, 42,109,107,167,210,213,232, 83, 15,162,188, 14, 20, 56,210,159,143,109,111, 79,240, + 16, 52,181,193,149,111,185, 21,166, 75,145,162,203, 1,231,151,187, 52,236,212,244,253,188,191,186,182,238,197, 87, 42, 79,142, + 14, 13, 39,160,157, 42,184,178, 48, 14,121,118, 58,224, 94, 31,221, 1,246,111,175, 47, 39, 66, 41, 32,156,117,105, 16,188, 6, + 96, 36, 18, 17,208,209,184,167, 88,241, 96,255, 54, 89, 88,151,182, 90, 78,229,253,197,214,109, 75,237, 25,225,115,135,235,144, + 90,242, 93, 83,225, 47, 53,164,120, 8,230, 66, 41, 51, 82, 19,103, 12, 10,183,147, 25,207,126, 51, 49, 64, 37, 65, 97,177,241, +217, 49,194, 37,152,116,183,101,193,153,101,150,120,141, 70,217,116, 25, 93, 43,178,147,196, 64, 89, 24, 65, 3,192,117,216,239, + 19,149,189,112,192, 28, 39, 74,110, 29, 42,116, 6,195,212, 46, 55,134, 11,217, 26, 6,114, 34,197,213, 1, 82, 45, 10,112, 20, + 12,196,148,178, 13,205,181,177,146,146, 37,149,180,180,251, 75, 28, 65,252, 0,138,195, 89, 97,209, 11,145, 39,189,230,248,167, +164,182,182, 22, 86, 24, 59, 23,112, 47, 43,165,223,234,144, 59,141,110, 17,251, 88,116,155,223, 93,173,229,171, 23,125, 57,215, +238,205,232,124, 41,213,196,150,215, 91,185,209,175, 13,251,224,173,155, 23,195,222, 96,192,169, 21,104, 99, 40,246,247, 7,125, + 19, 55, 25,223,201,147, 94,143, 29,242,189,158,157, 63,125,247, 3,159, 95,142, 74, 51,163,121,218, 52,200,166, 9, 85,113, 26, +121, 49, 66,133, 24,183, 18,206, 61,177, 85,184, 0,196, 78,230,100,158,175,156, 19, 51,160,169,119, 52, 46, 10,248,251,203, 90, +186,215,116,253,169,142, 7,137,217,216,238, 89,138, 2,156, 96, 56, 3,239, 69,142,119,160,165,174, 88,130, 9,157,169, 82, 41, + 11, 90,231,107, 14,128,244, 13,207, 86, 38, 22,213,136, 29,171,147, 83,191, 28, 24,132,251,241,132,202,120, 72,222, 48,237,140, +192, 78,208,223,125,118,124, 66,189,146, 56, 74,228,197,211,167,154,132, 76, 62, 22, 32,183,134,187,114,182, 19, 19,130,186,215, + 66, 23, 17, 19, 35,119, 54,114, 14,130, 54,192,180, 1,164, 33,219,141,157, 58,254,220, 32, 21,208, 48, 70,224,240, 15,123, 29, +202,195,158, 30,246, 36,215,248,137,156,121,112,208,163, 73, 22, 26, 46, 24,191,224,217,185, 67, 59,170,159,231, 12,178,217, 71, +169,252,226,197, 33,233, 97,112,253,180,130,218, 16,250,121,110,211, 96,156, 7,179, 5,183, 56,139,188,134, 28,247, 15, 63,222, +202,211,131, 14, 57,250,152,164, 96,229, 76,179,173,251,153,198,128,142,124,174,205,227,223,142, 22,204,133,152, 98,239,245, 26, +244, 31,216,239,183,244, 57,212,164,172,159,163, 73,145, 25,104,205, 39,156, 58,164, 28,191, 59,158, 71,182, 50,219,218,243,130, +235, 4,211, 24,196, 25,200, 25,111,118, 38, 54, 5, 65,162,119, 31,206,229,183,122,214, 94, 30,199,114,122,144,114, 69,199, 41, +166,254,220,158, 22,225, 40, 54, 73,215,115,250, 41,226, 34,174,217,177,190,119,109,249,228, 70,155,205, 27, 25,113,194, 90, 22, + 9,158, 59,227,132, 10,145,228,150, 68, 16, 92, 48,194, 29,116,140,124,134, 63, 35,208,108,217, 25,218,161,123, 48,150, 8,220, + 0,164,172,157,182,170, 52, 31,184,139, 79,154,229, 14,184, 49,190, 49,116,135,247,218, 49,141,228,255,241,221,130,128, 11, 84, +184,120,232,119,216,135,109, 2,238, 60, 2,143,218,149,132, 43,165, 91,245,123, 64,119,251,252,168, 77,148, 97,168, 31,254,240, + 96,159,238, 74, 48, 95, 24, 45,119,172,246, 90,218,129,160, 66,190, 24,105,101, 86,166,242, 92,187, 49,236, 19, 67, 84,198,219, + 45,147,127,195,245,237, 58, 80, 62,210, 10, 48,163,222,239,218, 0, 30, 24,185,236, 50,242,122,187,154, 12,135, 0, 71,128,254, +146,141,101,208,119, 52,115, 12,222,229,220,128, 53,235,148, 97, 14,251, 53, 28,110,112,202,209, 25, 54, 67, 83,138, 3,176, 2, +250,226,248, 58,170,245, 12, 40,246, 81, 73,151, 47, 28, 10, 24,104, 76,119, 1,105, 25,144,155, 5,167, 54,208, 68,253,248,228, +148, 21, 32, 14,234,202,233, 81,232,154, 43,133,183,176,120,208,149, 39, 96, 76,140, 87, 78,110,183, 43,196,240, 16,136, 89,159, +174, 22, 27,183,184,180,196, 90,106, 96,193, 97,195,247, 24, 58,216,246,116,105,106, 43,143,134,139, 51,160,187,172,214, 46,161, + 99, 44, 2,115,162,208, 42,120,225,129,171,168, 21,234, 8, 86,211,224,142, 51, 67, 37, 57, 45, 50, 10, 79,248,182,171,183,110, +162,114, 75, 51,209, 26,219,199,215, 19, 32, 20, 45,165,121,177,227,127,232, 20, 40,116, 3,211,132,164, 81, 11,223, 4,190,223, +181,233, 68,104,247,215, 11, 1, 32,233, 77,186,210, 11, 0, 71,240,102,169,241,251,243,210, 70,144, 97,225,114,190, 65,192,189, + 28,222, 39,197,125,244, 12,156, 30, 70,242,238,118, 78,129, 24, 76,131,176,151,100,224,128,118,188, 96,103,170,193,103,208,210, +135, 52,164,221, 44, 30,106, 36, 44,140,215,251,122,174,144,132,239, 53, 73,189, 58, 59, 32,136,166,116,119, 58,225,106, 33,224, +116,140, 86,151, 89,254, 96,174, 67,192, 78,194,207,126,184,183, 52, 93,231,134,217, 26,227,193, 62, 4, 93,134, 69,209,142,251, +102, 74,231, 2,197,206, 66, 14,215,115, 93,187,128,237,114, 96, 85,114, 13, 74, 29,195, 75,100,166,188,101,187,226,204,118,178, +133,173,147, 48, 9,192,239,231, 42,194, 21,232,216, 25,235,215,219, 30,104,172, 27,177,247,135, 9, 11,120,218,160,252,225,239, + 99,215, 43,159, 46, 77, 27,194,228, 52,115,226, 67,182,254,153,241,191,117,106, 46,120,140, 62,129, 33,189, 9, 78,131,206,247, +210,188,177,165,156,203,246,221, 5,187, 72,176, 34,208, 57, 94,222,143,173, 96,116,119, 68,172, 3,254,203,183, 59,249,245,147, + 6,153, 38, 71, 26,112, 47, 52, 16,115,234,161,239, 13, 99,249,147,195,125, 54, 43,152,200, 81, 58,180,219,148, 71, 39,251,250, +119,122, 29,247, 7, 76, 78,151, 87,247,102,243,172,231,234,179, 79, 62, 33,253,237,126, 58,102,145,132,147, 52, 91,216, 20, 34, +106,132, 76,200,150,124, 33,196,210,242,206,220,238,105, 76,230, 65, 73,127,119,196, 86, 36,231,116,147,179,249, 0,134,166, 11, + 76,197, 70,203, 65, 76, 29,218, 13,158, 21,130, 13, 93,150,186, 65,142,115,248, 32,153, 75,126,180,237, 84, 89, 40, 64,221, 45, +122, 88,137, 38,145, 81, 15,205, 13, 47,112,218, 85,192,228,181, 89,105,115,160,221, 32,148, 26, 7, 90,176,108,146, 37, 39, 57, + 85, 7,205,184,145,173,165,167,215,224,234,182,144,235,155, 43,121,116,250,152,113, 44,210, 88,141,207, 6, 19,152,191,124,255, +123,249,242,139,223,200,112,255,137,252,235,223,164, 26,159,244, 25, 44, 2, 38, 50,252,110, 80,118, 1,212, 28,107, 53,240,225, +118,194,201,226, 97,207,140,104,240,140, 97, 44,143, 4,143,123,130,243,128,251,137,152,130, 85, 20, 18, 57,169,205,121, 96,138, +123,211, 13,187, 95,188,207, 15,218, 68,189,191, 30,201,205,237,165, 89, 57,107, 28,134,196, 43, 38, 15, 0, 96, 35, 49, 62, 58, +104,201, 63,195,231,215, 63, 3,136,135,247,178,221,217,245,195,243,140,123, 51, 95,249,232, 60, 52, 17, 21,188, 79, 92, 67, 48, + 86, 46,238,231,108, 36,128,187, 0, 93, 14, 59,106, 92,230, 27, 77,252, 63,123,220, 39,125,122,172,221, 58,148, 61, 3,247, 6, + 65, 12, 7,184, 14,239, 27,121, 97,177, 78,249,181,200,141,201,114, 49, 80, 37,108,110, 27,152, 68,184, 32, 14,157, 32,180,224, +190,186,189,103,156, 58,218, 79,228,209,209, 49,159,217,191,251,250, 91,185, 63, 59,145,127,247,155,199, 50, 4,216,110,158, 9, + 32, 27,189,168, 85, 55,210,100,168, 57,200, 24,247, 27,221,255, 97,223,124, 48, 32,110,131, 98,137,192,116,210, 31, 34, 83,124, + 66, 18, 3,127,186, 29,154, 65, 64,167, 48, 23, 45, 28,122,123,171, 17,201, 74,165,187, 66, 21,229,195,174,164,136,196,171, 63, + 27,179,147,219,236,212,173, 74,255,215,132, 64,132, 31, 8, 78, 75, 64,161,163, 72, 96,199,139, 42, 39,201,217,177, 67, 8, 97, +138,202,116,101,213,125,238, 5, 68,200, 61,239, 78,230,122, 83, 18,210,122,180,179,208, 32, 9,209, 59,184, 47, 45, 52, 65,254, +164,157, 57,192, 63,144,173,132,186,221, 55,231, 99,249, 15, 95,238, 75, 43,200, 40, 29, 65,215, 46, 4, 39,114, 71,119,236,212, + 6,120,239,206,117, 6, 96, 40,195,174, 25,193,111,109, 94,196,171,160, 32,117,133, 0, 53,253, 29,133,150, 3,175, 47, 38, 4, +249,173,160, 20,166,255,251, 81,127,207, 22, 14, 64,122,232,240, 67,243,187, 37,147,242,163, 30, 44,249, 18, 19,208,105,219, 78, + 40,246, 64,129,247, 30,107, 5, 10,149, 42, 38,115, 61, 4, 23,139,157,209,144, 52, 25, 65, 21, 10, 14, 97, 51, 13,218,224,108, + 71,238, 76,182,170,209,241, 54,150,193,227,141,224, 15, 97, 14, 51, 59,121, 48, 64,161, 32, 11,233, 95,153,117,218,220,225,134, +188,249, 8,114,195,126,199, 53, 2,244,125, 0, 75, 0,218, 14, 14, 80,106, 18,171,120,125,188, 7,252,110, 38,213,208,204, 40, +232,130, 86,100,156,134, 16, 15, 1, 91,201,192, 20,155, 10,223,121,131, 26, 66,164, 47, 57,208,185,139,251, 4, 44,154, 42,227, + 10, 36, 6, 36,154,202,137,203,246,223, 25,199, 72, 17,247,167, 13,159, 12, 21, 28,185, 98,111,141, 2,162, 18,221, 9,189,136, + 73,233,167,156, 25, 82,220, 77, 75, 2, 55, 24, 42,220,129, 9,239,131,148, 58,167,227,112, 95,203,245, 74, 80, 79, 29, 80,156, +162,115,130,143,182, 21, 32, 37, 59,134,233,106,237, 0, 76,183, 17,141, 12,120,133,207, 66, 89, 87,210,154, 68, 70,154, 8, 16, + 60, 76, 79, 61,244,221, 99,206, 68,245,225,126, 42,159, 60, 62, 35, 0,102, 50, 91,178,152, 53, 59,213, 38,113, 27,115,136, 92, + 20, 37,187,197,204, 19, 60,138, 56,140,239,240, 12, 29,232, 53,133, 51,242,205,253, 82, 38,219, 5,117, 10,242,194, 4,141, 50, + 95, 83,224,126, 68, 78,175, 52,202, 97, 80,235,244,207,192,144, 64,231, 7,163, 22, 45, 76, 59, 62, 42, 70,178,100, 12,112,199, +184,166,139,219,176, 40, 74, 98, 55, 12,177, 41,198,114,179,173, 41,105, 81,184, 49,160, 39, 49, 29, 54, 25,225,154, 40, 52, 75, +225,212,117,247,177, 6, 48,251,221,160,150, 92,174,196,166,204,155,221,172,157,169, 65, 0,193,148,188,116, 95,247, 92,158,159, + 30,201, 94,191, 47,175, 47,111, 13,232, 73, 19,169,148,120, 3,254,183, 94,195,171, 89, 41,231,163,157,188, 58,237,202,205,178, +100, 98, 4, 66, 26, 99, 83, 90,212,150,144,222,237,176,240,158,105, 81,139,100,222,114,244,246,205,104, 70, 80, 31, 10,166, 82, +127,119, 16, 55, 25, 3,191,120,245,169,124,251,253, 55,134,102,214,103, 60,209,235,181,110,152, 91, 37, 80,239, 81,100, 40,230, +164, 97,192,196, 6, 85, 21, 67,126,214, 45, 65,149,176, 20, 54,175,121, 48, 32,224, 67,129, 36,244,237,133,141,250, 81, 0, 33, +105,154, 6,132, 81,117, 43,139,103,226, 79, 10, 75,108,133,203,101, 22,110,110,131,228, 22,115, 87, 93,178,160,106, 37, 46,148, +181, 53, 81,172,208,133,143,128,124,195, 14, 30, 5, 59,174, 23, 40,181,143, 30,157,201,213,229, 7,142,160,193,176, 16,174, 82, + 55, 82,164, 43,222,239,155,187, 91,189, 63, 45,130, 81,227,176, 41, 39, 39,135, 4, 18,226,251, 62,220,220, 26,128, 76,207,240, +159,222, 24,133, 14,184,171,130, 82,175, 54, 61,216, 16,160, 25,202, 95,191,122,164, 73,188, 82, 19, 44,185,142,132, 6,202,102, +103,106,131,252, 25,207, 13,200, 45,165,251, 20,108,179,173,153,116,229, 1,215, 88,103,103, 79,181, 40,223, 35,131, 38,208, 34, + 2,188,116,200, 80, 39, 13,123, 86, 1,154, 68,215,139,216,241,238,122,174,231, 58,161,146, 40, 86, 47, 80,237,196,164,137,182, +185,129, 37,115,196, 91, 20,144,221,102,160,215, 96,195,251, 7,218,246, 94, 71,187,229,187, 53,241,100,152,246, 14,186,136, 9, + 45,174, 50, 62, 61,219,147,191,188, 29,249,121,205,157, 45,100,157, 55,128,126, 16,142,129, 14, 62, 46,249,108,157,153,210,226, +206, 49, 33, 98, 94,239, 43,151,237,174, 84,182,161, 26,202, 63,235,107, 61, 57, 59,245,201, 82, 83,238, 38,115,249,219, 63, 93, +201,127,248,234, 49, 27, 2,208,102,145, 31, 91, 13, 51, 15,163,191, 3, 39, 45,137, 79, 98, 82, 22, 73,175, 30,235,153,252,238, + 94,198, 99, 61,215, 88,163, 64,104,159, 10, 62,129,211, 73, 92, 86, 18,135, 17, 99, 26,210,173,252, 6, 4,110,157,154, 57,215, +250,193, 71,219,245,123,156, 82, 67,123,184, 34,175,125,179,115,215,141,198,215, 80, 36, 0, 81,136, 32, 8,195, 8, 84, 90,163, +101, 78,176, 25,133, 77, 26,166,211,123,163, 29,115, 20,132, 21,241, 93, 43,221,152,182,121,179,245,150, 59,173, 20,135, 24, 15, +184,222,180,139,197,141,220,105, 53,117,183, 76,229,141,222, 28,248,239,194,117, 8, 72, 76, 42, 26,117,204,106,145, 8,107, 72, + 2,162,224,162,202,150, 5,255,251,149, 94, 44, 45, 32,154,250,158, 80,133,227, 38, 32,149,224, 97, 31, 83,144,167, 37, 77,112, + 6,181,155,126,123, 55,165, 48, 79, 69, 87,225, 78, 27, 99, 53,208, 29, 56, 27, 46,137, 60,166,246,187, 94,163,203,113,166,191, + 63,118, 22, 65,201,209, 13, 2,120,158,219, 30, 17, 46, 83,131,142,141, 57,145, 12, 30, 61, 26, 74,222,234,242,192, 20,212, 77, + 15,245,160, 30,114, 60,139, 49, 23,169, 75,133, 39, 44,253,191, 25,165,101, 53, 57, 99,116,230,123,144,160, 17,209,208, 36, 36, +104,176,252, 72,235, 62,116, 83, 2, 91,129, 64,233,169,194, 68,160,144, 51, 78,112, 66, 0, 25,238, 77,187,105,218,196,232,188, + 80, 48,128,158, 97, 8,220,130, 29,194, 18, 74,123,173,196,169, 36,230,251,221,215,202,251,232,192,208,218, 89,106, 59,221,124, + 99, 66, 54,166,132,102,187,217, 40, 48, 32, 8, 0, 64,248, 57,224, 31,108, 39,153,114, 44,159,249,249,170, 60,207, 81, 92,220, +141, 39,206,237, 55, 92,135, 41,221, 21,222,153,148,206,147, 55,116,114, 53, 5,168,236, 72,141, 30, 85, 88, 55,197, 42,218, 59, +125, 23, 14, 41,220, 59,186, 73,135,192, 22,247,242, 88, 77, 64,146, 23, 99, 55, 0,154, 42,158, 49,133,132, 52,248,129, 78,137, +251,253,238,250, 78, 78,246,135,164, 80, 1,112,134, 32,103, 52, 25,227,181,174,211, 45, 21,184, 48, 82,195, 78, 14,221,182,137, + 81, 8,207,105,170,127,223, 8, 53,232, 30, 14, 89, 20, 47,150,115,118, 87,120,159,120,223,189,246, 1,197,118,240,126,222,126, +184, 53, 97, 39,130,214, 18,118,134, 72, 82,120,184, 73,151, 98,167,184,227, 53, 32,152,176,221, 33, 96, 15,157, 54, 7,114, 8, + 6,129, 81, 41,209, 97,228,222,225,113,242, 16, 88,177, 72,122, 82,105, 5, 17, 18, 97, 89,123, 26,218,153, 39,144, 46,180,149, + 14,112, 33,166,109, 31,114, 85,133, 46,138,247, 76,204,195,129, 20, 57,224, 70, 50,115, 90, 11, 99,163, 21, 21,169,185,250,113, +205,128,198,194, 29,255, 54, 20,238, 48, 30, 54, 58, 83,168,151,125,247,254,146,201, 18,214,157,118,126, 10,114,193,209, 17, 2, + 13,140,245,219,111, 95,143,228,127,254,170, 35, 63, 93,141, 56,218,133, 96,211,201, 97,159, 19, 3, 60, 31,152,230, 73,104, 5, + 3,176, 50,212,201, 14, 77,155, 30, 35,225, 78,167, 39,203,197, 76,131,148,233, 27, 60,215, 96, 11,228,252,100,182, 96,231,134, + 53, 10,128,114, 72,190,175,142,247,152, 60, 48,121,131,190, 69, 73,203, 80,128, 1,161, 61, 96,113, 5, 77, 10,206,245, 54,138, +201,224,192,201,233,192,100, 4,122, 6,129,233,116,224, 33,217,149, 69,205, 52,192, 88,190,108,234, 53, 1,219, 0,212, 89, 22, +233, 57, 11,116, 22, 15, 76, 12, 5, 1,192, 0, 35, 86,113, 27,140,156,194,215,147,156,254,132, 65, 13, 76, 6,173, 10,224, 44, +124, 94, 24,130, 28, 29, 28,202,245,237, 53, 85, 48, 11,177,142, 22, 83, 32,115,221,243,179, 67, 41,109,224,133, 48, 10, 63,208, + 7,121, 65, 97,171,217,116, 68,243,147,243,155,177,203, 15, 23,174,240,232,110, 2,133,197,251,191,253,211,143,174,160,105, 83, + 91, 92, 63,226, 44,242,143,104,176,174,186, 70,113, 47, 20,154, 16, 69,130,222, 3, 18, 42,155,197,156, 83,142, 40,200, 8, 84, + 51,211, 20, 46,124,228,112,191, 77, 63, 11, 48, 83,142,247,244,190,165,154, 28,143,186,212, 87, 0,215,123,165,197, 20,240, 97, +211,229,174,166, 4, 71, 46,164,134,235,135,215,205, 10,139,139, 43, 77,192, 95, 60, 30,200,253,220,244, 75,218, 13, 91, 69, 95, +107, 66, 61, 25, 4, 4, 95,191,124,212,103,194,254,226,233,158,124,255, 97, 70,173,128, 10,251,243,244,168,207,233, 29,158, 87, +120, 34, 32,238,106, 47,195, 34, 6,231,155, 5, 53, 89, 64,161, 51,141, 90, 22,127, 51, 83,140,123,127,113,201, 51,102,107,173, + 82,243,216, 90,190,187,202,228, 23,207, 18,226, 15, 86,244, 6,233, 50, 89,103,212,247, 48,220, 6,138,105,196, 79,172, 5, 64, +249,254,226,229,158, 22,168,185,188,189,209,134,238,110,178,241, 11, 27, 17,149, 88,205,255,185, 63, 47, 13,141, 9,125, 94,202, +113,162, 10,201,140,220, 95,129,146, 42, 42, 14, 65, 32,190,223, 65,167,149,149,185, 35,224,165, 14,176,232,108, 40,182,160, 31, +225,221,253, 90, 30,107,101,117,210,143, 41,158,130,155,110,226, 6,161, 38, 82, 92,160,156,251, 79, 4, 54, 76, 16,112,224, 81, + 72,128, 34, 2,173,116, 84, 96, 5, 76, 81,150, 43, 94,160,119, 55, 19,121, 63, 90,105,130,182,253, 3, 58,210,185, 86,102,159, + 63,217,151,253,253, 65, 77,149,107,235, 1, 47, 29,181,159,109, 82,154, 33,224,207,144,160,220, 96, 12,180,221, 58,136, 14, 9, +125, 43,151,192, 21,148,102,247, 10, 77,251, 62, 40, 50,121,233, 35, 74, 67,127,175,119,166,142,132,239,195,152,145,174, 65,250, +119, 38,177, 27,251, 72, 27,197,179,190,174, 86,225,105,203, 76, 56,130,180,201,155,137,145, 39,128, 77, 0,212,173,244,125,228, +187, 53,255, 30, 99, 56, 22, 84,250,249,218,180,122, 77,109, 4,236, 6, 3, 72,240,160,234,208,122,148,210,184,153,211,192, 34, +118,209,219,202, 57, 8,163,193,194,228, 39, 75, 49,133,182,125,173,112, 43, 41, 84, 67,203,219,216,123, 60,155,249,200, 53,161, +177, 5,253,172,219,134,162, 5,250,158, 43, 24,125, 79, 0, 24,165, 44,248, 74,126, 29,227,240, 86, 59,100,209,196,196,198,206, +249, 65,185, 15, 99,233, 93,110, 73,216,146, 73, 94,131,248,192,128, 72,243,220,199,199, 41, 59,186,150, 62,176,212,183,118,163, + 19, 83,167,139,124,135,174, 29, 74,187, 83,115,207, 43, 3,147,216,205, 89, 76,244, 97,247,255, 75,242,149,167,185,241,218,195, + 26, 8, 88,212,197, 39,254,129, 46, 53,181,227,105,174, 98,160,150,160, 2,129,185,222, 57,166, 11,103, 71, 7,230,164, 5,183, + 42, 61, 39,135,123, 3,238,145,151, 26, 36,254,250,139, 99,253,183, 89, 97,126,184, 50,175,110,123, 31, 33, 37, 39,225,188,102, +224, 51,151,152,220,106, 97, 57,135,178,149,153,232,160,240,128,133,174,177, 67, 98, 47,194, 10,238,182,161,183,141,123,213,107, +119,153,140,133,194, 64, 13,126,174,189,190,237,139, 65, 87,131,210, 25,146, 2, 87, 64, 40, 24,147,150,107, 14,104, 50,112,247, + 68,128, 21, 17,144, 87,180,215, 44, 93, 21,175,116,125,131,192,133,133, 2, 83,128, 44,141, 66, 74,243, 14,104,178, 55, 13, 8, + 73,230, 7,190,136, 85, 78,165,253, 29, 24,235, 1,159, 53,227,125,174, 86,116,118, 15,233,203,142, 51,214,132,217, 80,199, 48, + 33, 62, 66,166,118,189, 94, 55, 4, 71,211,239, 55, 9, 99, 92,115, 8,239, 4, 65,233, 59, 69,243,189, 14,130, 54,147,248, 31, +223, 78,229, 63,254,213, 99,130,150,144,172,182,188,134, 27,217, 27,246,105,186,196, 49,113,167,105,224, 86,111, 50,112,198, 77, +242,181,100, 51,129, 73,207,226,254, 70,239,245,161, 92,234,251,252,244,233,137,252,237,239,110,249,243,196, 36,136,173, 9, 0, + 98,228,100,172,101,158, 9,180, 11,221,229,230,227,190, 53,180,242,134, 40,239,216,141,131, 48,170,110,179,104,218,239,194, 70, +119, 77, 80, 45,121,234, 0,239,233, 51,189, 10,205,138, 24,175,139, 85, 14, 70,196,181,173,109,104,247, 55,161,106,219,206, 76, +147, 74,169,177, 74,182, 88,143,120,206,120,158, 29,176,140,230, 2,159, 15, 5, 11,174, 33,246,225,207, 78,143,228,226,246,134, + 93, 31, 10, 91,188,183,203,241,146,113,153,157,115,210,224,239, 56, 59,218, 35, 56,240, 82, 59,116,236,170, 51, 45,136, 46, 70, +153,118,243, 75, 82,204, 80, 52, 81,172,139,163, 90,241,127, 7,188,183,160, 0,219,223,185,169,181,195,170,200,186,113,118, 18, +254,140,248, 12,253, 16,125, 57, 58,148,181,241, 92, 55, 35, 22, 73,189,238, 80,206,180,120,130,242,228,217,241, 83, 61,239, 13, + 83,154,212,235,138,166,144,107, 19,178,125, 74,153,233,179,210,209,120,148,105, 78,129,166,196,138,170,123, 85,113,106, 9,248, +112,208,230,154, 51,164,133,239, 74, 11,237, 29,227, 12, 10,140,187,217, 78, 78,247, 90,242, 97,180, 98, 2, 46, 9,248, 93,107, +129, 88,106,210,238, 16,179,243, 92,127,126,160,191,119,216,219,202,190,187,119,226, 58,221,106, 35,121,118,208,145, 63,189,185, +213,226, 31, 40,253,136,143, 3,155, 14, 42,137,134, 50,219,218,116,162,240,123, 67,209, 45,205, 3, 0,191, 54, 88,124,183,249, + 53,200, 88,131, 53,243,247,223,189,211,231,227,153, 22, 19,109, 78, 52, 86,250,204,227,121,232,235,217, 73,226, 45, 49, 16, 90, +235,200,116,190, 97, 35, 17,121,129,253,248, 24,211, 62,205, 63, 84, 23,242, 26,188, 10,248,116, 52,195,120, 3,149,128,190,201, + 70, 51,175, 85,197,140,207, 92, 24, 29,167, 22,141,176,196,158, 59, 90, 57,247, 0, 41, 78,121, 17,119, 78,171, 16,184, 99,173, +160,154,139, 72, 22, 24, 53, 81,209, 46,101,165, 19, 58,207,251,205,205, 70, 38,203,140, 99, 65,154,130,228,166,235,203,189, 85, + 46,164, 22,221, 46,177,231, 48,205,225,157,118, 58,120,178,161,254, 54, 71, 48,167,225, 68, 71, 31,108, 4,230,141,252,225,253, + 76,246,225,148,212, 95,201, 94,144,240, 96,160,162, 67,208,109,183,141,146,132,209,203,116,121,175, 93,210,198, 58,215,182, 9, +204, 0,196, 52,203,245, 65,189, 93,202,104,186,148,253,195, 30,253,151, 57, 86,142, 35, 38,226,163,164,199, 17, 44,130, 24,119, +242,122, 56,113,160, 17, 68, 48, 54,191, 31,207,216, 69,153,188,166, 30,248, 21, 4, 21,214,236, 32,142,181,171,197,117, 61,191, +190, 55,177,151,216,168,124, 76,218,133,141, 67, 49,250,132,250, 19,246,130, 38,179, 26,202, 72, 95, 19,192, 14, 20, 22,171,205, + 74,182,203,172,222,199, 34,201, 64,239, 24, 9,217, 0, 87,190, 99,170,246,249,250,231,145, 30, 8, 90, 91, 34, 33,174,211, 90, + 13, 10, 93,116, 18, 38, 4,230, 48,105, 72, 76,110,169,136, 37,206,172, 52, 91,205,197,198, 76, 39,112,224, 35,183, 67, 77, 34, +147,122, 37,238, 2, 35, 96, 40, 49,137, 41,134,129, 71,139, 73, 75, 25,152,235, 27, 36, 27, 43,228, 51,237,118,245,154,101,169, +241,242,195, 36,226,103,163,178, 94,106,110,106,120,248, 42,172, 6, 58,222,204, 1, 75,221, 94,175,182, 80, 13,125, 31,159,127, +228, 40, 24, 85, 82,184,133, 9, 24,197,222,157, 71,222,197, 87,154,231, 24, 51, 83, 25, 12,137,115,110, 64, 69, 92,207, 65, 59, + 34,133, 9,193,198, 10,184,140,216,147, 31,223, 95,214,215, 31, 29,217,238,205, 37,247,144,143, 53,104,254,112,113, 47,127,120, +125,195, 21,142,141,216,133,223, 75,140, 64,181,199,151,200,249,228, 30,236, 42, 83,162, 42, 40,151, 86,228, 70,190, 70,105,181, +160, 60,101, 20, 80,224, 61, 98,142,230, 75,242,200,231,171, 57, 87, 65,248, 85, 24, 23,115, 79,201,226, 69, 72,217, 65,223,140, + 73, 8,166, 48,232, 96, 90, 4, 4,149, 76, 2,208,170, 30,166,169,191, 86,101,221,106, 32, 35,158,223,134, 41, 33, 86, 96, 75, + 36, 75,128,145, 48,190,197,247,225,217,204, 83,211,171, 7,130,126,201, 98,200, 58, 79,156,101,128,212,240,188, 85,234,114,152, +244,124,250,236,177,124,246,248, 80,158,106,208,254,179, 94,183,255,252,199,215, 82,225, 30,171,181, 82, 89, 88,242,142, 18,163, +226,113, 21, 19,155, 60,106,226, 76, 7,179,114, 78,201, 23, 71, 17,244,230,102, 46,159,158,246,136,136,199, 44, 13,207, 55, 92, +236,198,227, 57, 1,177, 79, 78, 15,105, 14, 2,100, 52, 62,223, 18,120, 25, 36,122,128,232,182, 38, 87,154,132, 41,207,231, 4, + 0,201,195,167,181, 34,227,158, 6, 84,196,130, 16,216,162, 29,132,170, 34, 57,217,239,232,207, 47, 25,147, 48,157, 33,199, 92, + 95, 23, 50,208,101, 22, 16, 92, 22,250, 20,235,219,247, 87,114,180,215,231, 20, 2,251,110,220,183, 13,159,247,196, 58,244,210, + 44,159, 81, 4, 64,204,198,124, 23, 10, 78, 60,194, 88,220, 20, 39,150,161, 22, 14,243,197,206,101,122,141, 77, 64, 70, 81, 98, +170,160,161,216,228, 9,212,212, 40, 49,157, 12,224, 46, 48, 65, 91,130, 79,207,110,177,199,162,107,208,209,207,171,197,223, 89, +167, 47,247,208,182,112,186, 41,174,233,219, 15, 23, 50,108,183,248, 30,169,148, 9, 58,237,220,180,228, 63,123,124,166,159,165, +163,215,164, 97,152, 3,168, 36,118, 27, 46, 47, 46, 4,162,189,187, 30,115,236, 14,121,111, 76, 83,208,208, 65,189,145, 38, 65, +137, 81, 45,193, 44,178,105, 89, 44, 71,251,125,198,202, 38,169,109, 37, 93, 16,119,153,237,139, 1,140, 67, 1,215,114, 45, 5, + 20, 80,140,103,122,150,254,242,246, 78,207,123, 79,190,250,229, 11,237,122,199,140,175, 40, 48, 32,174,148,251,218, 2, 29,126, + 68,185,239,152, 59,242,207,135, 45,249,230,221,216, 37,168, 69,155, 55, 45, 20,146, 82, 11,140,144, 30,244, 71,199,160, 58,174, +245,253,135,242,244,160,205,124, 0, 93,251,249,237,130,241,106,178, 50,164, 62, 10,206,230, 97, 87,250,195, 14, 11, 40,136,153, +129,183, 94,122,177,187,216,154, 31, 60,220, 56, 59, 45,109, 6, 65, 29,221,108,221, 34,215,168,221, 16,214,233, 65,154, 25,247, + 73,243, 24,166,107, 80,247,251,227,107,224, 21, 78,228,197,163,129, 91, 84,231,100,133,180, 3,163, 72, 98,186, 85,192, 18,124, +190,213,162,167,207,252,133, 41,224,191,250,245, 35,137,255,205,191,255,119, 52,155,159,140,199,178,152, 47,136,140, 94,145,102, + 36, 52,153, 72, 34,173, 80,119, 38,182, 97,227, 81,179,223,171,188,173,221,142,218, 92,160, 10, 3,147, 20,206, 93,230, 80, 62, + 52, 33, 26,243,245, 46, 56,126, 0,248, 98, 56,232,114,196,137, 10,127,160,213,244,104, 50,210, 15, 41, 4, 66, 36, 90,153, 46, + 32,244,175,193,114,190, 94,154,210,152, 6,144,190,254, 12, 30,178,151, 47,246,229,157, 30,236, 3,253,190,177,190,199,185, 86, + 67, 59,173, 48,207,158, 12, 37,108, 77, 24,136,142, 14,246, 56,214, 96,128,208,255,190,212,164, 56,214, 55,118,187,153,146,147, +136,206, 28,129,252,137, 94,196, 31, 53, 8, 99,199,137,207,136,196, 57,154,204,165,175, 55,242,236,100,143, 10, 70,215,163,148, +128, 27, 36, 83,236, 62, 64, 41,131,128, 5, 14, 33, 30, 58,136, 65, 96,119,133, 36,133,195,137,192, 59,157, 47,120, 93,238, 52, +249,162,227,205, 40,222, 31,203,122, 97, 46,102, 72, 14,120, 45,140, 55,175, 71, 11,187,217,250,247,120,223, 8,216,224,202, 98, +124,115, 9,251, 67,136,117,235,125, 24,175, 50,142,116,105,203, 8,223,248, 2,116, 25,253,119,220, 38,191,212,228,101, 11,160, +193,244, 71,115, 86,185, 9,165, 90,237, 62, 53,124,175, 92,113,135, 57,242,193,234, 32, 8,125,133, 98,218, 2,185,119,106, 85, +161, 23,184, 10, 94, 89, 88, 2, 10, 92, 7, 62,240,229,106,101,192, 81,233,231,147,201, 39,161, 3,244,132, 69, 0, 2, 84, 30, +184,161,145,112, 19, 96, 20, 59, 31,223,185,198,160, 1, 54, 97,132, 1, 32, 86,108, 94,208, 72,196, 12,246, 46,176, 1, 99,153, +170,104,172,220, 0, 81,236, 80,213, 44, 54,133, 68, 42,144,229,153,163,225,125, 4,239, 21,109,141,237,112, 85, 47,113, 52,250, + 76,239, 53, 18, 52,238, 95,159, 9,205,246,125,216, 65, 98, 12, 7, 20, 42,192, 92,176,158,156,234,195, 52,208,243,168, 89,204, +197, 36,244,122, 39,133,158,173,185, 60, 29,244, 41, 99, 9,195,147,162, 52,163, 23,128,239,232, 54,200,168, 94, 80,141,138, 99, +200, 36,114,103,168,192,247,207, 70,117,226,138, 69,108,191,223,106, 27,158,162, 9, 29, 6, 20, 50,218,181,236, 13,186, 92,123, +192,253,109,208, 60, 96, 17, 25, 69, 54,213, 58, 61, 48,193, 17, 4, 30, 20, 29,216, 43, 3,109,142,247,107, 8, 96, 76,219, 82, + 1,179,142,118,201, 84,241, 51,153, 93, 22, 33,218, 81, 66, 69, 13,180, 71,172,224,224, 48, 24,250,216, 13,114,165,112, 13,252, +105, 54, 98, 87,134, 61,234, 64,131,210,179,231,159, 75,212, 90,202,242,252,156,184, 18,172, 24,128,188, 70, 18,199, 78, 26, 34, + 28, 60, 31,165, 9, 6,125,127,113,199,110,105, 10,250, 22,232,149,149, 81,143, 79,249, 13, 61,110, 96, 46,232, 45, 24,200,210, + 0,101,230,230,102,147,179,156,235, 7, 67,145,127,127,189,145,255,248,213,158,188,190, 93,115, 90, 5, 64, 99,228, 46, 93,151, + 55, 35, 50, 80,208,217, 28,238,117,201, 19,126,127,121,207,238, 23,234, 93, 8,218,180, 24,109, 20,150,132,146, 22, 81,200,175, + 94,125, 38, 55,151,231,236,250,112, 14, 2, 46, 25, 76,246,121,155,153,209, 13, 24,105,237,166,197, 65, 24,150, 68, 97, 83, 54, +224,248,239, 54,188, 71,164, 66,102, 70, 71,194,100, 39,170,124, 38,130,210,113, 12, 25,175, 61,214,141, 77,186,126,153,243,101, + 14, 1, 33,224,126,124,111,205,103,208, 5,190,114,215,180,192,215, 64,125,130,138, 95,152, 91, 51,197, 66,218,233,168,144,196, + 0,114,127, 16,216,132,242,118, 60,161,232,211,108,114, 39,207,206, 6, 92, 91,126,119,241,182,198, 54, 85,160, 83, 20,110,221, + 22, 40,140, 49, 65,187,237, 70,206,207, 6,191,139, 0, 60,251, 13,146,189,126,159, 54,100,152, 2,254,120, 61,241,226,207,208, +254, 24, 63,159, 12,219,242,155, 79, 79, 93,104,198,158,211, 37, 80,243, 80, 99, 3, 50, 93,139,163, 70,162, 73,123,186,150,119, +151, 55,250,223,121,237, 68,153, 99, 42,217,110, 24, 83, 64,207,199,191,254,231,191, 97, 82, 35,131, 74,223, 23,244,211, 33,128, +243,249,179, 19, 54,147, 27,109, 20,127,249,233,177,252,225,235,115,189,207,230,200, 7, 92,213, 60, 79,121,237, 83,151, 83,198, +225, 58,208,102,240,104,184, 38, 62, 10,109, 36, 41,138,189, 38,217, 42, 39, 3,211,200,128,169, 17,148,237, 0,152, 3, 6, 2, +206,161, 90, 87,107, 92,134, 7,199,154, 94, 2, 88,211,190,215,207, 61, 25, 15, 5,109,197,253,194,100,130, 99, 2, 36, 97,116, +211,144,247,183, 91, 90, 24,211,247, 61,118, 42,163,211,218,208,140,228,238, 10,138,107,254,228,244,148,241, 31, 19,148,119,151, +151,242,205,121,139,249,232,104,175, 89,123, 40, 32, 94,163,187,199,121,129, 85, 45,128,237,163,241,130,207, 41, 10,211, 45,164, +215, 31, 63,127, 46, 79, 95,188,160,192, 61, 40, 78, 91,253, 64,119, 55, 55,114,119,119, 39,155,133,129,126,200,103, 20, 3,137, +112, 98, 19,229,236,110,205,236,197, 14, 82, 90,209,103, 0,221,199, 14, 15, 85, 87,163,193, 61, 5, 42,118,140,151,167,154, 72, +177, 27, 66, 39, 49, 39,205,103,103,188, 96, 77, 88,135, 7, 93,163,242, 96, 76,167,215,254,112,223, 60,171, 77, 16, 31,128,174, + 22,255, 27,157,168,137, 94,148,114,171,137, 24, 73, 51,241,253,255,245,221,200, 52,148,245, 97,249,160,201,208, 28,217, 66,185, +223,108,249, 61, 27,125,173,155, 44,171,101, 26, 1, 0,203,139,178, 78,114, 48,171,199, 3, 68,138, 87,187, 35,183, 35,173,194, + 11,179,142,133,208, 9,171, 98, 31,141,162, 43,108,134, 77,162,224, 1,108,194, 4, 3, 29,250,221, 28,149, 26,198,183,122,131, +147,146,130, 7, 72, 74,236,212,245,115,244,188, 98, 14, 49, 82,211, 7, 6, 93, 33,110,210,222,222, 1,175, 33,170,244, 46,174, + 33, 12,158, 37, 39,122,123,231,194, 5, 1,157,207,172,155,109,185,176, 68,228,149, 50, 1, 72,250, 58,160,149, 97, 44,188,241, + 34,140,148, 17,223, 57,135, 94,100,133,193, 3,115,161, 2, 71, 81,145, 46, 50,104,135,129,219,130,218,196,163,162,143, 81, 60, + 4, 99, 53, 71,206,214,244,178, 40,170,145,246,226, 19, 27,142,155, 65, 53,203, 75, 31, 51,218,125, 43, 67,215,172,207, 77, 8, + 39,228,248,210,222, 99,232, 5, 3,222, 91,149,152,109,104,158,186,160, 76,195,141, 99, 66,186,218,145,198,232, 83,141,138,230, + 86,153,212, 24,175,215, 41, 83,133, 65,134,201,198,112,115,149,162,118, 7, 43,204,204, 36,205,120, 31, 73,131,195,217,246, 66, + 99,162, 5,220,201,192, 44, 52, 49,190, 67,225,106, 64, 41,179, 6,197,219, 71,224, 37, 58,191,223,148,103,135, 3,142,214, 18, +114, 76, 19, 26,174, 0, 96, 4,168, 41, 48, 9, 8,124, 44,140, 67,206, 35, 57,133, 57,213, 66, 16, 85,191,121,215,231, 52,121, + 24,207,108,130,132,177, 51,186, 29, 60,155, 64,210,231,121,147, 69,193,114,177,116,255,133,140, 66, 44,144, 52,134, 28, 46,146, +249,221,116,198,202, 29,107,139,210,141, 39,240,189,167,123,109, 25,104, 53, 15, 84, 63, 36, 37, 65,243,178,174, 58,101, 48, 70, + 87,129, 98,163,218,251,110,215, 43,118,254,160, 11, 81,172,145,206,131,166, 85,142,239,139,244,251, 3, 22, 29, 61, 89,173, 16, + 63,114,114,140, 1, 86, 68,241,142, 10, 14, 63,215,162, 43,151, 25,113,208,175, 30,172, 18,125,237,187, 36,100, 80, 50,113,142, +226, 35,207,136,210,216, 29,236,220, 75,247, 22, 55,111,115,196, 3, 60,103,220, 41,122,130, 55,102, 68, 75,206, 39,185,189,119, + 20,130,216,181, 67,229, 49,180, 4,140,245, 1,238, 27,169,171, 24,101, 39, 66, 22, 11,216, 13, 24,153, 34,174,205, 52,200, 55, + 91, 38,179, 60,212,228,117,117,123, 39,191,252,226, 75,153,142,111,232,211,142, 38, 1, 83, 3, 40,165, 1,115,128, 24, 1,131, +146,155,251, 29,237, 71,145,100, 48,201,216,106, 81, 3, 17, 28,152,180, 3,204,104,128,166,200, 18,145, 54, 37,251,253, 84, 62, +220, 78,249,172, 13, 7, 13,222,103,172,120,160,178,135,181,225,116,147,185, 1, 75,225,174,126, 41, 11,106, 80,113,147,200,170, +239,176, 6, 44, 23,156,164, 65, 94, 27, 52, 51,210, 20, 83, 3, 72, 86,128, 70,188, 38,204, 97,144, 92, 1, 64,133,247, 0,166, +144, 23,183,247,122, 22, 22,188,142, 16,100,169, 25, 41,206,104,122,243,225, 92,142, 15,143,245,245, 49, 5, 13,104, 86, 67,199, + 54, 76,102, 26, 3,201,130, 88,254,246,239,254,145, 24,139,202, 88, 11,242,174,120,111,232,166,175, 70,161,188,134, 54,188,203, +253,102,214,253,113,109,135, 66, 33,118,208, 44, 45,175, 29, 51,100, 77,139,203,218, 38, 77,118,210, 0,215, 97,162,254,248,180, +103, 62, 7,236,244, 13, 88,137,162, 10,160, 60,184, 86,246,250,125,130,205, 14,181,120,165, 82, 28,215, 85, 91, 82, 53,113,158, +176,202, 90,172, 51,121,125,110, 19,177,212, 45, 69,113,237, 63,232,243,117, 56,104,233,117,212,123,176,210,231, 38,233, 48,145, +195, 7,229, 66,243, 10,138, 99, 40,209,161, 72, 71,167,140, 9,103,165,185,130,238,254,236,176,175,177, 98,107, 19, 24, 92,247, +166,197, 89, 8,137,129,105,114, 57,173,116, 51, 10, 2,142,113, 13,119, 4,138,154, 36,240,209,254,128,160,101,172,204,174,245, +253,128,242, 12,147,151,243,187, 3, 2,202,187,157,160,102,247,116, 96, 93,171,207, 24,138,217,161, 38,246,219,209,130,207,239, +233, 97, 87,243,201, 70,162,227,110,252,191,141,174,207,181, 26,253, 73,130,221, 76,210,245, 68, 47,252,138, 38, 41, 0,134, 96, + 15,138,238, 7,173, 61,126, 41,110, 0,254,217,211, 67, 47, 20,107, 40, 88, 81, 81, 80, 63,176,189, 50, 30, 48,116, 32, 43, 84, +245,238,169,139,177, 15, 18, 43,118,216, 72,196,169,251,215, 94,221, 77, 76, 3, 59,142, 56,190, 94, 59,178, 26,123, 4,240,197, +121, 83, 96, 60, 48,154,241,134, 1,197,141,215,188,155, 44,217,113, 27,117, 41,144,107,173, 86,104,237,170, 71,234,118,188, 52, + 78,116, 17,112, 28, 2,215, 35,136, 28,160, 50,131,173,108,172,135, 37,215, 36, 3,255,114,220, 8,104,117, 3,245,186,220,106, +135, 2, 55, 37, 77,182,115,120,211,174,118, 28,105,130, 54,147,139,129,137,118,133,249,129, 3,108, 99,250, 58, 33,147, 28, 42, + 40,180,123,230,197,110, 50,159,120,111, 52,235,128, 27,217,106, 41,253,254,160,198, 34,224,144,216, 78,210,204, 3, 96,117,136, + 61,110,133, 71, 66, 1,130,100, 78,235, 83,142,105, 3,222,252,116,103, 95, 51,111, 96, 83,170, 43,107, 52,178, 37, 52, 0, 95, + 82,231,133,135,245,195, 93,184,243, 86,228,251,210,202,160,197, 3,169, 11, 86,184, 13, 95, 45, 92, 83,141, 93,171,215,168,190, +143,192,201,160,172,133, 96,170, 98,161,146, 10,174,132, 70,170, 32,109,244,177,220, 85, 2, 11, 38,174,192, 19,186, 57,209,229, + 14, 42, 49,192, 79, 28, 85,142, 93,238,208, 9,165,191,102,195,101,120, 83,119,131, 43,235,213, 81, 94,161,215, 93,113,174, 44, +203,135,196,237,246,177,213, 10, 50,175, 58,119, 31,247,130, 99,142,128,140,250,142, 26,222, 73,228, 60,106, 14, 51,217,201,113, +205, 1, 85,190,212, 48, 1,212,193,134, 45, 42,246,229, 97,204,196, 5,148,246,191,255,231,159,201,179,147, 1,169, 50, 61, 40, + 15,130, 43, 65,151, 45, 19,158, 64,145,112,180, 55,148, 95,190, 60,147,127,249,203,151,236,196,191,125,119,169,103,115,197,174, + 27, 32,197,171,209, 84,198,154,152,215, 90,104, 35,145,220,234,195,141,191,187,163,197,100,198,251,123,171,207,205,189, 62, 15, +192, 82, 32,225, 83,116, 6,103,102,151,113, 74,132,215, 59, 28,182, 88,188, 94,232,247, 34, 25,222,235,243, 2, 64,151,157, 17, +224, 86,182, 60,211, 8,146, 7, 26, 8, 15,244,217,196,123,165,148,111,100,252,232,174,118, 38, 8,190,236, 48, 3, 83,106, 68, + 44,204, 60, 80, 67,151,188,211, 59,224,158, 79,220,162, 21,216, 15, 16, 5, 50,231,183,211,226, 22,207,192,198, 86, 91, 47, 30, + 63, 34, 5,135,248, 1, 8,156,108,118,166, 79,238,224,207,210,207,154, 77, 82,194,218,190, 55,119, 49,161,210,119,226,161,251, + 47,224,123,176,143,132,104,202,151,143,123, 68, 32,175,178,144,157, 48,138,150,134,251,104,227,247, 33,248,226,190,130,149,150, +115,218,104,159, 19,162, 52, 52,222, 0,118,100,179,212,228,222,225,152,254,232,112,159,215,100,138, 73, 98,106,190,233,216,105, + 71,206, 67, 7, 51, 5,193, 25,159,125, 69, 15,134, 45, 71,197, 69, 85, 28,251,179,142,194,254, 96,216,231, 51,141, 36,138,159, + 51,197,221,144, 5, 20,214,118,134,107,138,152,228,209,200,208,203,192,117,204,209, 92,153, 52,109,131,247,212, 18,183, 77,206, +132,123,106,179, 50,141,220, 71,193,152, 36, 22, 29,173, 48,143, 28,163,146,185,158, 72, 64,233,229,147, 97,151,215,131, 83,200, + 70,236,182,145, 13, 90, 93,111,169, 97,209, 37, 16, 44,160,150,123,192,177, 61,168,189, 63,127,249, 68, 11, 3, 43, 34, 71, 19, +179,119,174, 56,233,164,254,133, 78,165, 45,109,151,108,171, 29, 91,255,179, 48, 41,109,197,224,157, 0,167, 67, 68,249,103, 59, + 49,129, 19,237,140,201,157,205, 57, 89,200,165,171,207,198,150, 74,128, 20, 40,210,130, 18,186, 31,192,120,129,162, 72,231, 63, +253,153,167,103,135,252,187,145,118,255, 0, 82,110, 82,195, 34,224,172, 0, 76,135,243,131, 41, 18,138,191,176,150,182, 22, 78, + 83, 38,218,237,159,143, 12,243, 18, 38,125,206, 50,103,243, 9,127,166,223,110, 80,124,230,122,178,230,125, 24,182, 99, 47, 56, +109,221, 7, 96,249,206, 87, 88,244,139,160,247, 68,169, 9,127,101,207,101,110,224,104,179,215,205, 24,255, 12,243, 19, 49,110, + 96,237,128,226, 21,128,220, 57,157, 43, 19,118,252, 28,171,119,135, 90,248, 55, 57, 69,195, 37,233,180,205,132,102,227,254, 4, +116,140,188,159,249,125,212, 78,125,183,153,242,128,224, 80,220,143, 70,126, 8, 99,106, 73, 47, 8,202,137,105,120, 63,209, 67, +200,174, 56, 49, 93,227, 15, 55, 35,247,224, 54, 69, 44,202, 55, 58,103, 24, 29, 48,170,203, 22,119,142, 33, 5, 59, 34, 62,120, +109,238,165,205, 37,200,140, 97, 96, 41,138, 35,115, 55, 95,219, 40,144, 85,121,193, 7, 44,245,253, 89,198, 17,133,158, 7,109, +225, 49,130, 94,164, 75,219,183,161,179,131,141, 97,105,158,197,168, 62, 1,186, 8,128, 76, 78,139,218, 2,180,204,197,209,189, + 54, 38, 94,110, 77,232,131,123,150,208,164, 74, 1, 40, 9,221, 29, 39,229, 62, 48,169, 59, 1,124, 14, 19,180, 49,254,177,161, +222, 51, 71,128, 90,117, 92,169,191, 85,251,218, 42,145,177, 58, 75, 83, 98, 16,136, 6,223,153, 71,112, 73,121, 77, 83,129, 66, +254,131,138,148, 85,169, 5, 3, 76, 26,166,172, 94, 83,138, 13,100, 62,238, 54, 69, 44,142,177,180, 82,163,236, 40, 52,212, 97, +236,129,174, 12,234, 70,250,231, 60, 51, 63,238,118,215, 84,222, 8, 64, 12,170,135,205, 0, 65,220,115, 6, 15,166, 31, 18, 4, +181, 35, 95, 97,174, 46,181, 14, 59, 62,221,134, 96,181,178,238,206, 99, 55,221,136, 42,176, 89,105,154,242,156,247,249, 14,136, + 66, 24,121,230,142, 77,198, 43, 46,189,128,128, 63, 61,158,112, 80,160, 66,215, 51, 96,225, 17, 24,216,174,210, 63,112,113,112, +130,227,232,173, 92,100, 46,191,155,179,243,169, 40,106,161, 35,220, 3,167,112,145,133,225,154,239,164,209,209,117,169,176, 17, +189,143,170, 77,203, 60,231,125, 29,205,103,172,158, 59, 84, 27,140, 89,136,162,184, 60, 25,116,184,107, 71,113,135,145, 60,138, +196, 23,103, 71,164, 41, 29,105, 64,196, 68, 9, 93, 57, 42,100,116,190,112,128, 59,232,153,188, 44, 59, 23,125,223,171, 98,199, +179,142, 7, 22, 69,193, 20,171, 28, 8,119, 52, 3,178, 63,254,248, 61,198,178,109, 38, 31, 88,176, 82,112, 7, 92, 98, 4,192, + 36,230,200,187,153,180,181, 40,236, 49, 81,193,106,178,219, 53, 73, 94,116,173, 40, 82, 19, 94,250,136,201, 26,215, 9, 88,141, + 87, 79,143, 24,184,209, 13,220,141,205,245,237,237,221,156,187, 77, 20, 1,248,125, 39,123, 93, 94,243, 71, 7, 67, 2, 73,113, +110,247,181, 35,123,245,168, 43,223,157,143,120,191,231,203,157, 3,138, 76,109, 79,203, 10,201,209,133, 34,216,105,162, 2,127, +184, 13,164,238,102, 69, 37, 54,236,163, 1, 56,138,157, 66,152, 58, 45, 15, 19,191, 32,142,124, 85, 19,241,154,154,130,155, 94, + 35,143, 9, 80, 15,139,253, 76, 84,133, 91,241,209, 84,136,147,186,170, 16,204,173,243,193,168, 22, 83, 9,112,177,255,114,189, +147,127,241,178, 47,175,175,181,187,214,230,130,142,143,123, 45,130,221, 80, 12, 65, 54,244, 64,239, 89, 27, 69,190,126,174,249, + 58,103,178,166, 80, 75,175,239, 40,100, 45,148, 86,240, 79,104,200,219,243,107,242,220, 87,155, 31, 25, 7,113,102, 9,100,156, +153, 91,220,153,190, 54,208,224,152, 4, 32, 41,216,152,220, 68,118,232, 52,167,207,251, 54, 50,148, 58,238, 1,186, 46,156, 49, +196,205, 92, 11,178,213,106, 65,233, 98, 40,220,192, 11, 28,216, 13,172,229,160,247,141,231,166, 11,252, 3,102,251, 52,138, 89, +187,235, 87,200, 70,170,154,164,113,178, 81,152, 62,194,122,155,126,180, 86, 42,220, 3, 77,106, 38, 9, 42, 91,178, 6,218, 13, + 2,145, 67, 98,167,124, 50,200,103, 71,139, 51,208, 10,245,158, 2, 49,223,106,111,165,167,215, 21,155,144,221,214,132, 88,158, + 62,121,162, 95,239,202, 63,252,240, 53, 63,243,175, 63, 61,179, 9,237,174, 36, 6, 11, 77, 16, 62,231, 80,155,194,107, 45, 80, +191,126,123,195,162,206,156, 12, 13,123, 83, 82,221, 47,145,227, 97,139,197,111,155,232,238,128,205, 34,158,169, 13,135, 95,145, +173,194,122, 45, 38, 84,208, 17,161, 1,242,205, 79, 35, 77,228,154,192,242, 5,139, 33,124, 38,122,163, 35, 54,148, 49, 13,188, + 14,250, 93, 77,118,109,121,118,156,200, 13,155,188,144, 88,172, 61, 45, 4,210,108, 69,113, 40, 76, 85, 42,225,163, 74,176,134, +102, 99, 90, 64,205, 23, 11,189,150,218,216, 38, 38, 42, 70,112,155, 62,100,147, 18, 84, 90,125, 22, 38,118,158, 81,171,108, 40, + 80,164,197,134,126,238,217,214,138,207,153, 22,254, 71,189,132, 92,126, 78,244, 8, 12, 76, 77,140, 75,227, 1, 26, 1, 43,226, +132,194, 82,216,175,159,157, 28,146,225,129,117, 85, 19, 88, 11,125, 47,227,233, 84,254,254,155, 55,122, 70, 62,149,207,159,118, +201,153,199,125, 58,165, 82, 98, 36, 87,215, 35, 3,201,106, 81,126,113, 51,147,207,159, 31, 74, 60,153, 46, 25,108,121, 24,144, +192,244, 2, 79,199,115,118,205, 45,138, 77, 68, 90,209,219,142,140,221,151,254,247,116,181, 99, 32,224, 78,205,171, 49, 36,200, + 77,230, 0,134, 12, 7, 77,111,114, 42, 68, 96, 27, 2,177,148,149, 86, 45, 91,119,210,194,205, 2,119, 15,224,143,130, 92,227, + 74,199,216, 70,201, 52,155, 47, 27, 30,232, 45, 8, 96,180,135, 29, 89, 37, 82, 98,227, 87, 19,173, 33,200, 6, 85,104, 98,212, + 56, 72,195, 1,120,194,164, 78, 0,160,237,162, 57,242,160,150,117, 88,243,101, 43,225, 21, 9, 13, 40,134,192,143,132,154, 36, + 73,173,103,143, 27,152, 1,149,139,238,171, 40, 93,235,218,172, 73,173,203,180, 14, 49,118, 10,150, 41, 26,165, 53, 71, 56,119, +119,173,202,169, 11, 29,141,209,247,218,236,200,118,149,247, 55, 31,224,146, 5, 0, 70,154,248,190, 60,180, 68,136,239, 99,247, +137,107, 65, 26,144, 33, 92,225,124, 6,109,112, 36, 60, 80,106,240, 90, 24,203,110,129, 12, 39, 15,216,198,184, 52,124, 40, 82, +163,151,136, 1, 30,113, 61,152,116, 35, 3,142, 85,180, 68,118,244,192, 80, 64,113,204, 71,120,226,172, 1, 80, 73,192,136, 40, +168, 4,231,155,247,210,247,113,161,129,156,240, 79, 46,185, 11,209, 88,130,174,198,221,182, 55,141,124, 47,238,163,247,144,224, +110, 55, 11, 18,151,162, 12,106, 97,157,200,175, 55,174, 53, 16,186,105,104, 35, 58,140,131,113,223, 40,195,235,171,149,106,207, +142,215,223,239,117,169, 49, 0, 12,197,205,100,198,110, 61, 8,221, 39,217,187,189,172, 40,235,157,159, 56,238, 0, 29, 23, 42, +124, 4, 34,250,149,107, 16, 0,248, 6, 20, 31,172, 6, 14,246,247, 56,126, 93,107, 1,245,221,249, 29,185,170,208, 74,248,175, +223,156,203, 31,126,152,203,163,129, 38, 78, 77, 84,107,136,101, 68,230,244,135,127,195, 97,139, 90, 3,250,240, 99,210,132,142, + 17,162, 48,216,251, 81,198,150, 54,181, 13,158, 63,236,127, 99,119,188,195,158, 23,197, 54, 62, 35,155,183,204, 58, 29, 0,189, + 48,205, 2, 88, 40,136, 26,236,144,224, 22, 5,180, 48,209, 47,250,204, 60, 62,220, 35,225,236, 94,139,107, 0, 28,199,243, 13, +139, 83,184, 68, 81,121, 17,197,119,108, 52, 67,140, 21,207,239,166, 92, 25, 16,112,170,215,253,179,199, 29,185, 30, 3, 4,106, + 70, 70, 40,144,118,243, 45,129,129,141,166, 57,206,225,108, 79,103, 83,153,104, 16,194, 78, 18,137, 62, 73, 0,132, 45,235, 98, +177, 90,255, 96, 26, 97, 70, 79,166,251, 15, 68, 47,123,102, 13,150, 65, 98, 9,169,178,113,226,254,177,158, 0, 73, 45, 61, 93, +230, 85, 7,152,115, 92, 94, 89, 22,255,241,205,173,252,155, 47, 95,145,194,186,216,154,191,247, 98,187, 99,145,142,250,251,187, +183,215,242, 11,189,166, 67, 45, 70, 32,131, 77, 28, 3, 59,112,189,222, 61,179,175, 93,104,162,135,250, 95,111,248, 72,102,122, +110,158, 63,121,204,221,250, 55,127,249, 90,131,116,139,103, 21,244, 86, 20, 18,147,121, 70, 49, 25,116,231,136,153,200,141, 91, +223,149,238, 56, 29,178,157, 63,186, 43, 76, 28, 49,241,192,132,231, 68,239,201,173,198, 89, 74,194,186,239, 60,240, 76,232,216, +114,184,149,133,102,179,138,233, 6, 98, 33, 10, 48, 36, 82,200, 52, 35, 86, 35, 78,133,110,154,197,149, 33,184,239, 45, 91,247, + 68,129,139,127,113, 74, 21,184,146,166, 61, 23,166, 62, 25,146,227, 61,207, 74, 22,130,173,196, 86,119, 68,108,227,185, 72, 53, +206, 56, 27, 0, 88,167, 46, 84,233, 36, 54,147,158, 40,145,207, 62,121, 41,111,127,250,158,197, 27,206,206, 95,125,254, 88,159, +179,182, 92,106, 23,139,117,203,110,103,234,122, 0, 2,159, 30, 14,121, 22, 94,156, 12,228,104,208, 54,207, 16,120,210,235,247, +220,207,119, 90, 0, 55,205, 85, 78,140, 37,208, 72,226, 90, 0,139,171,165,233, 76, 46,175, 51,211,134,208, 51, 60,215,196,126, +122,248, 88, 94,191,127, 43,179,233,152,197, 98, 94, 24,179,129,122, 19,146,200,225,222, 80,139,212,174,209, 1,155,177, 22, 29, + 71,242, 15, 63,194,163,220, 24, 5, 80,144, 91,192,144,170,180,162,144, 42,147,222,216,238,107, 35, 52,131,255,185,211, 59,243, +208, 38, 78,171,141, 94, 95, 40,189,197, 6, 72,220,239, 54,217, 28,146,217, 32, 77, 34, 45,160, 59,192,235,169,215, 14, 62, 10, + 5,217, 35, 34,251,250,124,126,184,155,113, 21,132,230, 17, 50,101, 88,207,174,221,153, 20,177, 14,246,202, 57,139, 95, 51,116, +226,181,136, 19,198,127,120,219,255,241,251, 11,125,166, 95,104, 35,145, 48,102,175, 52, 7,159,158, 30,210,135,228,126, 52,211, +152, 28,202, 99, 76,120,244,119,197,147, 85, 90, 11, 84,224,134, 47, 93,182, 19, 68, 72,120, 40, 35,168, 91,160,141,152, 8, 17, +140, 2,223,127,110,119, 38, 44,129, 32,213, 10,194, 26,141, 73,235,196,218,161, 73,136,190, 53, 71,162, 93,157, 48,162,218,127, +215, 69, 65,202,168, 6, 52, 21,238, 30, 68,209,146,220, 5,104,130,194,199, 71,185,255, 76, 88, 43,154, 21,238, 46, 19,184,141, +168,184,125,168,129,178,124, 87,139, 0,194, 4,227, 86,168,153,121,170,115,199,138,253, 47,199,210,101, 13,238,170,148,236,170, +157,117,179,209,168,125,171,183,217,174,182,138, 68, 23, 69,197,188,204,246, 54, 15,197, 64, 81,119,244, 91,234,180,103,230,113, + 92, 86, 5,129, 38, 95, 0,174,244,208, 34, 81, 21,158,252, 67,167, 75,108, 41, 31,187, 33,125, 38,203, 11,199, 47,216, 97,199, +131, 84, 4, 25,129, 43,230, 71,109,159, 93, 88,140,152,233, 3,138, 15,147,143,180,194, 5,186,194,165,139,239,196,142, 82,183, +226,202,196, 95,170,228, 89,169,144,149, 62,234,196, 97,167,161, 70,105, 59,228,194, 71,217,229,250, 97, 85, 64,225, 25, 58,241, + 85, 4, 27,192,137, 30,238,145, 89,246,154,162, 22, 71,244, 98,239,169, 26,239, 87,171, 1,169,198,173, 16,170, 65,199,227, 9, +161, 26,105, 85,187,125,238, 45, 97,202,131,238, 27,245, 91,234, 70, 32, 34, 15,160, 56, 79,234,152, 48, 44, 64, 5, 2, 42, 59, +181,233, 74,229,247, 93,213, 20,101,238,251, 45,160,185, 83, 3,250, 44,244, 31, 4, 6,130,220, 52,136,222,206,180, 50, 15, 52, + 81,161,219,203,182,114, 53, 75, 73, 43, 3,119,126, 52,190,151, 79, 30, 29,200,191,252,213,207,228,211,179,125, 6,215,127,251, +235,231,242,187,175,127,146, 31, 47, 70, 28, 41, 86, 54,141,232,224,224,143,204,202, 31,170,198, 80, 56,211, 4, 60, 94,108, 24, +196, 50,223,187,137,235, 96, 11,117,224, 77,181, 12, 39,180, 65, 93,243,128,251,111, 0, 54, 7,221,182, 33, 66, 0, 94,210, 32, +219,213, 66, 3, 34, 27,120,207, 95,244, 91, 82,162, 16,166,159,249,144,201,135, 29,114,110,128, 60, 76,220,142,181, 83, 55,219, +223,156, 50,176, 40, 36, 32, 82,131, 14, 23, 5,207, 76,147,200,116,149,144,173,129,251,139,226,168, 20, 43,132,112, 46, 0, 36, + 69,199,133, 64, 4, 42,157,241,106,109, 66, 4,144, 24, 37,105,189,176, 12, 98,147, 61, 5, 88,139,192, 67, 45,208,185,222,139, + 66, 7, 49,201,195,122,167,186,135,192,100,196, 98, 20, 46,151,173,165,172, 42, 89, 22, 68,215, 48,240,145,193,160,207,197,213, +221, 90,206,239,183,242,215,159, 29,202,223,124, 51,162,221, 38,116,223,159,156,180, 53,201,216,235, 2,228,186,203, 77,119, 60, +142,141, 51, 93,174,114, 2,133, 65,147, 74,200, 45,215, 68,170,133,227, 86,155,147,219,209, 72,126,245,233, 51, 25, 93,191,167, + 1, 16, 80,229,148,178,157, 45,201,133,142,163,148,242,189,121, 17,213,235, 44,202,164,126,164,124,199,201, 35,132,105,210,130, +247, 18, 5, 61,117,226,203,144, 8,253,174, 22, 72, 40, 18, 34, 95, 75,237,107,161,135, 61,121,234, 70, 69, 89,189,102, 50, 96, +221, 98,177,117,103, 76, 75,224, 75,160,200, 67, 8,184,164,156,222, 84, 94, 19,134,156, 46,164, 81, 25,113,145,162,218, 99, 60, + 27,107, 17,146,106, 66, 12,125, 77,208,136,109, 77,153,103, 27, 61, 27, 3,222, 51,152, 37,109,182,218, 92, 52,250, 90,244,236, +243, 93,160,217,192,250, 19,187,246, 40,202,229,255,253,230,138, 19, 38,160,183, 57, 57,113, 9,105, 38, 76,208, 31,245,179,223, + 79, 15,120,160,113, 46, 55,100,171,152,224, 85, 94,152,127,124,236, 62, 2, 97,100,136,244, 6, 71,230,145,197, 38, 20,108, 97, + 68,147,151, 78, 91,223, 71,255, 84,223,155, 57, 4, 50,134, 68, 37,239, 51,138,180,151, 79, 14,249,249,113,207,177, 82, 3,115, +229,160,175,133,237, 81,151,207, 5, 58,116, 72,175, 14,245,252,225, 94,224,119, 75, 69,179, 11,108,218,124,136,120,171,215,103, +127,208, 99,195, 9,234, 26, 93, 15,161,142,215, 79, 92,119,165,132,239, 13,159, 41,198, 68,253,188,231, 90,248,150,174,139,223, +110, 53, 93, 40, 41,167,182,255,102,107, 57, 0, 77, 45,112, 81,169,179, 60,160, 97, 48,164,248, 26,176, 90,198,192, 0, 30, 5, +103,161, 67,147,172, 22,129,158, 99, 45,174,190,121,183, 39,191,252,100, 95,246,186, 1, 49,105, 40,100,176,130,192, 36,225,254, +126, 74,198,215,106,181, 50,120,105,145,219, 94,148, 99,191, 32,172, 59,163,202,159,217,246,162,166, 46, 16, 6, 21,240,170,168, +109, 19,209, 45, 87, 1,190,210,233,182,255, 40,255,201,131, 10,183, 48, 82, 18,182, 91,119,228,178, 42,121,187,179,196,221,240, + 46, 27,127, 7,180,112, 21,244,173, 75,211,195, 18,153,120, 72,181,111,171,128, 98,244,124, 79, 18,175,238,242, 90,127,222, 52, +203,119, 15,227, 95,242,190,243,122, 12,155, 59, 55,186, 2, 83,217,174,215,129, 92, 46,202,192, 41, 6,248,218,164, 39,217, 30, + 43,244,241, 22,165, 14,189,171,172, 16,203, 91,119, 82,162,112,136,152,212,105, 71, 59,219,142,239,155, 26, 13, 27, 45,239,220, +169,174,112,139,212, 44,180, 85, 3, 93,199, 22, 75, 86,116,232, 6,249,222,205, 13,131, 32,138,200,147, 62,130,123,218,176,164, + 94, 58, 48, 45,240,164,102, 65, 53, 50,196,167, 7, 76, 60,156,224,160, 75,181,227,246,189, 55,187,128,134,169,200,161,160,169, + 58, 30, 30,244, 88, 8, 32, 66,177, 66, 58, 26,222,127, 98, 6, 56, 54, 90,119, 3,220,208, 70,190,230, 92, 23,121,145, 8,119, + 4,191,247,133, 37,248, 26,121, 31,250,123,142, 92,164,168,168,186,185,178, 66,246, 24, 16, 42,118,113, 18, 23, 49,137, 67,163, +198,101,101,138,190,193,164, 54, 33, 36, 1, 0, 95, 92, 77, 12,220,131,160,172,198,142, 25, 71,235,228,255,238,245, 44, 40,114, + 44, 95,214,206,112, 88,101, 80,248, 40,180,100,153,249,185, 31,182,219,218, 77,108, 40,178, 83, 70,109, 13,248,218, 69, 99, 66, +164,255,125, 55,154,202,166, 3, 5,172,173,116,181,242, 71,160, 3, 58,250,103,159,127, 34, 95, 98, 44,221,180, 98,152,251,231, +212, 58, 70,124,110, 92, 75, 4, 18, 4,152,229, 54,177, 0, 12,240, 75,211,104,144, 97, 41,245, 62, 20,197, 74,151,134, 22,161, +143,114, 83,219,167, 5,230,169,205,137,130, 62, 70, 24,189, 97, 12, 74, 65, 32, 76,103,128, 66,214, 11, 3, 59, 75,128, 62,241, +218,235, 36,166,212,101, 49, 95,155,140,235,194,238,221, 49,168, 67, 41, 4,114, 42,241,158,144,162, 43, 24, 27,118, 27,240, 40, +239,115, 93,150,119, 76,162, 57, 74, 90,242,230,242,150, 65,103, 8, 87, 47,125, 45, 20, 76,163,137,173, 47, 64, 49,172,120,231, + 16,213,193, 51,130, 36,185, 17, 51,238,137, 52,137, 64,173, 15, 24,156,237,206,145,254, 46, 39, 91, 81,170, 42,108, 70,238,163, +208,208,181,251, 43, 0,100,165, 70,152, 18,224,103, 0,175, 60, 55, 5, 54,252,220,111, 95, 79,228,127,253,183,207,229,247, 63, +106, 7, 3, 36,241,205,132,197,110, 28, 53,136,179, 65,241,115, 72,237, 2,195,151, 0,108,180,163,108, 48,146,141,137, 6,229, + 89,204, 98, 12,214,165, 8,148,187, 34,150,163,227, 67,138,146,152, 80, 78, 76,250, 24,186,101, 36,136,203,187,185,219,241, 98, +188,108,155,122, 26,135,224, 12, 64, 96, 40,107,240,154, 80,240, 68, 27, 1, 80,228,192,114,105,235,191, 81, 20,247,244, 53,224, +135, 1,230,205,237,253,136,215, 7, 1,125, 77,230, 81,200,150, 10,157, 59, 86,152,187,212,186,106,140,163, 51,106, 41,192, 56, + 39,229,180,136, 54,182,165,155,187,124, 84,196, 99,149, 81,184, 92, 41, 87, 84, 14, 50,133, 96, 74,119,104, 56,136,146, 52, 84, +243,224,160, 66, 30,156,238, 88,232,110,245,245, 6,180, 11, 62, 61, 58,145,205,226, 94,142,250,198, 71, 71,172,153, 3, 7,197, +137,159,212,147, 73,252, 28,214, 4, 1, 17,249,185,124,253,211,149,137, 97, 57,205, 46,118,171,232,208,159,251,128, 8,121, 61, +183, 96,182, 64, 38,183, 72,184,195,111, 82,137, 47,163, 88, 88, 0,165,204,238, 1,207,205,147,227, 71,242, 63,125,245, 75, 57, + 58,232,107, 12,179,123,129, 78, 27, 90,236,112,112,195,234, 24,184, 14, 20,171,152, 24,236,135, 0,129, 78, 36,214, 80, 49,217, +228, 92,215, 98, 28,206, 78, 63,179,124,130,201, 34,138, 72,250,156,184,198, 69, 37,124, 69,237,202,160,226,255, 7,126, 13, 93, +130,172, 90, 21,154, 63, 17,147,178, 21, 11,150, 91,197, 77, 94,162, 60,224,125,229,228,210, 87,192,208,182, 0,136,113, 26, 47, + 88,148, 2,224, 13, 32, 35,113, 47,233,142,120, 2, 54,143,250,231,209,116, 34,111,110,154,242,234, 68,159,205, 86, 38,151,151, +119,114,124,178,111, 83,219,164,193,107,185,167,207,107, 76,115, 19, 71, 3, 87, 34, 30, 31,235, 71, 85,162,217,129, 75,148, 86, +158,225,236,150, 81,245, 67,117, 42,221,177, 10,229,222,179, 2, 72, 69,102,179, 90, 21, 10,161,171,232, 32,136,218, 65,207,106, + 58, 92,181, 47, 75,185,195,141,153, 8,163, 60,244,189,172, 37, 8,115, 17,123, 80, 15,171,108, 61, 89,241, 57,106,190, 86, 15, + 50, 78,149,163,137, 11, 87,203, 11, 93,185,201,248,157, 21,194, 51, 20, 7,155,149,133,235,215, 11,209,247,246,158,131, 90,186, + 52,112, 43, 61,220,240, 94,183, 71,160,148,145, 71, 44,193,151,197, 67, 1, 19,186,177,141, 37, 46, 3,124,101, 20,104,177,113, + 74,149,212,215,236,106,108,170,209,239,116,107,244, 55,147, 32, 68, 67, 16,208,195, 7,155, 86,142,247,227,200,197,129, 76, 8, + 35,118,126, 55, 10, 1, 27, 43,219,136,141, 60,113,128, 45,196,238, 47, 16,199, 32,188,182,180,250,171, 56,233,213,106,130, 70, + 38, 44,110,138,154, 38, 70, 86,128, 23,110, 68,161,151,142, 82,247, 29,124, 24, 58, 40,166,114,215, 46, 50, 51, 41,113,208, 90, + 35,242,107,135, 7,184, 17,125,164,233,110, 69, 83,165,238,196,131, 31,120,226,143, 35,167,135,153,106, 94, 35,106, 17,101, 78, +155,215,216,168,111,228,242,131, 38,212,109,215, 69,130, 89,184, 62, 92, 39, 3,145,236, 40,218,195, 98,177, 25,177, 43, 20,158, + 49, 67,172,210,254, 23,103,161,217,244,130,196,148, 21, 49,242, 2,248,167,135,135, 79,127, 22, 35, 70, 33,223, 94, 95,155, 56, +142,152,138,119, 52, 31,210,251,215,107,130,242,101,246,187, 47, 95,156,105, 50,215,174,105, 27,243, 82,141,151,230,115, 31,233, +239,223, 81,162, 50,226,103,179,142, 75, 72,137,234,104,242, 4, 37, 41,141, 10,242, 92,209,241, 96, 55,106,250,253,246,158, 89, + 24,122, 18, 68, 34, 35,205, 73, 19, 18,144,233, 96, 59,192, 90, 30,251, 66,219,161, 70, 76,162,232, 56, 80, 56, 0,236,121, 52, +104,241, 58, 12,160,235,206,181, 74, 64, 96, 95, 43,177, 73, 88,139,250,227, 27,130,138, 0, 30,197,117,197,207, 96, 20, 15,244, + 46, 58, 92,236, 93, 65,173,195,200, 30, 69,232,143, 23,215, 44, 22,128,228,197,174, 56,241,179,109,234,133, 25,117, 21, 76,153, +172,105,207, 31, 38, 77,216,195, 23,118,255,204, 47, 97,109,246,191,133, 1,134,114, 71,180,155,187, 22, 45,120, 30,156,221,114, +123,221,242,163,231,177,146,251,141, 2,163, 97,206,244, 94,225,185,189,156, 90, 49,245,244, 88,223,219,116, 75,144,211, 92,239, +197,254, 80, 11,216, 32, 38,143,156,227,214,216,248,204,180, 41,214,247, 14, 96, 92, 23,207, 14,238,119, 16,155,139, 98, 12, 62, +121, 38, 23,183, 51,105,244, 31,201,135, 63,255,168,239, 41,225,239,154,234,181, 7,221, 47,219, 45,184,246, 10,160, 42, 71, 65, +109,211, 12,224,253,194, 40,187, 12,248, 59,180, 15,212,162, 17,211,157, 17, 49, 45, 56,159, 80,200,172, 4, 91,104,105,154, 27, + 79, 28,120,142,198,106, 91,239,204, 49,186,133,224, 75,179,209,116,145, 24, 20, 93, 91, 61, 99, 5,197,115,112,254,231, 62,122, + 47, 2,195, 38,136, 56,183, 63, 52,139,211,212,253, 14,128,119,162, 21, 47, 88, 20, 90,140,150,251, 90,136,153, 30, 38,209,235, +141, 2,247,189,225,116, 82,155,178,208,203, 30,185, 34, 91, 18, 19,178, 74,129,216, 71,177, 31,217,122,168,233,122, 6,104, 4, + 80,164,182, 18,247,136, 8, 88,248, 97,117,120,113, 63,179, 24,235,250,229,196, 21,128, 7, 15,157,126, 40,220,241,108, 68, 44, +172, 17,187,112, 70, 33,248,130, 2, 10,198, 59, 40,149, 90,212,183, 72,104, 66,246,211, 5, 28,244, 74,121,118, 54,212,207,102, +147, 19,188, 79, 76,149, 64, 51,190,158,108,185, 30,195, 52, 21, 5, 31, 19, 56,193,145,102,161,202,198,148,147,224,192, 20, 72, +181, 56, 62, 61,232,243,253, 53,184,126, 40,229, 26,160,110,136,139,121, 94,138,195,192,233,150, 6,248, 35, 2,191, 97,241, 97, +179, 51, 6, 24,227, 19,144,252,177, 57,249,133,205,152,120,137, 44, 53,255,141,178, 93, 61,203, 54,197, 64,211,103,236, 49,163, +126, 99,133,101,177, 16,174,114,115, 57, 62,216,103,227,139,102, 10,140,140, 80, 14,228,241, 80, 24, 15,129, 73,122,246,228, 88, +207, 42,174, 49, 86,174, 26,243,176,143,133, 58, 23,114,108,228, 65,188,116, 68,104, 81, 86,123,116,169, 59,210,170, 26, 9,252, +223,185, 83,147,232, 56, 83,123,231, 58,237,194,187,253,143,147,118, 81,187, 17,149,245, 40,157, 64, 5,236,182,144,180,224,245, +140,224,227,244,134, 40,180, 64,143,241, 69, 35,137,235, 7, 58, 10,196,149,175,196, 19,186,185,133,129, 91, 26, 84,124, 75, 71, + 64, 87, 85, 20, 71,152, 81, 81, 39,219,143, 71,248, 21, 80,172,168,249,245, 65,141,174,174,118,205,184, 41,168,156, 42,176, 90, + 53,234, 13, 29, 7, 80,217,132, 34,129,208, 73,201,223,131,201,118, 70, 30,184,242, 26, 40, 84,217,128,154,139, 82,165, 58, 6, +189,189, 13,169,108, 85, 87, 95,129,200, 48,225,176, 29,120, 65,193, 13, 6,129,249,210,189,156,181,232,209, 0,110,187, 49, 3, + 41,226, 0,167,187, 85,173,144,134,174, 28,139, 69,118, 17,161,105, 87,199,137,237,162,179,220,104, 55, 52,128, 65,231, 91,154, +207, 58, 13, 10,160, 16, 87,166,172,184, 49,227,198,131, 70,144, 78, 20,124,116,125, 75,239,222,245,245,125,245, 16,187,131, 85, +238, 72,121,203,102, 54,205,201, 42, 77,248, 60,247,157,190,117, 6, 41,233, 94, 49,223, 35,244,173, 3,138,252,196, 38, 65,233, +192,170, 48,182,170, 30,134, 16,177, 99, 20,234,226,144, 6,212, 66,145,156, 77,106,102, 57, 97,248, 64,125, 42,189,155,207, 29, + 77, 93, 5, 24,170,156,197, 81, 29, 68,177, 59,181, 49,120, 68, 77,105,162,168, 49, 38,197, 40, 28, 30,208,235, 21, 65, 77,232, + 12,242,188, 65,117,168,219,187,169,196, 39,251,188, 70,183,107,147,248,196,165, 65, 34, 11, 92, 8,131,197,133,211,171,230, 43, +237,254,246,186, 4, 45, 33,184,211, 98, 87,207, 69, 91, 59,255,201,210, 28,192, 40, 93, 11,222, 43, 62, 67, 28,145, 63,142, 99, +143, 2, 12, 65,186,201,130, 38, 54, 21, 71, 47,136, 64,135, 65,219,180, 92,239, 56,142, 69,130,200,179,178,134, 76, 49,193,119, +140, 42, 25,196,230, 25, 0, 86, 10,156,167,174, 70, 25,129, 99,183,211,181,252,171, 95,124, 66,199, 42,156,247,126, 55, 49, 92, +135,254,126, 76, 38,158, 28, 13,249,231,209,232,142, 65,123,231, 78,137, 40,230, 74,140,155, 53,153, 91,199,146,242,158,114, 2, + 20,151,245,186, 37,142, 34,159, 84,229, 53, 45, 18,231, 20, 34, 68, 37, 41,144, 66,138, 94,225, 19, 10,106, 96,248,100,173, 98, +100,132, 62,173,163, 34, 34,138, 96,200,240, 54, 91, 68, 72,255,233,253, 76,126,249,108, 32,255,215,253,181, 28, 12,187,214, 97, + 47,215,124,174,144, 56, 48,125,107, 12, 7,238, 88,102,138,113,232, 54,209,175, 1, 24,137, 34,153,239,113,183,164,106,221,108, + 62,147,159,127,254, 41,149, 20,199,211,133,116,186, 77, 82, 86,223,124,184,149,126,175, 33,209,186,107, 19, 64,178, 43, 34,238, +249, 35,218, 19,115,228,194,231,186,167,113, 22, 96,100,128,159, 8, 56, 59, 61,146,183,151,183, 6,212,211, 24,129, 66, 20, 73, +176, 3, 91,217, 92,147,208,106,206, 73, 20,176, 68, 48,204,217,232,243, 61,247, 69,104,106,162,122, 70, 87, 20,155,240,180,252, +188, 84, 9,162,194,166, 32, 57,114, 61, 21, 89,241,128,228,211,112,103, 67, 40,152, 77,231, 43, 45, 78,237,233, 64,162, 2,112, +111,177,173, 44,143, 75, 82, 49,193,190,184, 13, 83, 82,190,210,178, 33,235,229, 92, 26,250, 75, 7, 45, 80,239, 76,135, 1, 10, +123,143,142,159, 81, 59, 29,187,233,227,190,241,202, 65, 13, 67, 44,186,215,164,139, 53, 5,246,205, 72,170, 13,118,237,134,224, + 7,120,147,188,255,182,249,166, 83,161,146, 49,204,148,255,160, 62, 8, 60, 8,158, 39, 40,200, 5,193, 90, 70,155,149,252,240, +118, 41,127,243,219, 63,232,251,155,178,179,207, 74, 99, 60,160,116,216, 63,126,194,226, 6,207, 21, 5,175, 24, 26, 60,187,249, +227, 64, 78,185, 94,183, 23, 39, 39,218,253,239, 81, 26,119,199,130, 90,200,138, 1, 85, 20,107, 37,168,113, 54,146, 38,167, 47, +213, 4,185, 6, 47, 39,198,202,233, 52, 66, 2, 49,205, 4, 43,230,211,118,120,220,165,247, 7,158, 21,152, 66,225,140,157,246, + 0,150, 12,228,207,239, 70, 50, 89,109,244,153,142,229,236,232,144,207, 2,206,194,179,211, 83,198, 46,184, 17, 66, 52, 9,147, + 37,226,193, 92,248,136,147,132,108, 95, 94, 28, 55, 57,149,192,115,118,124, 52,208,207,179,146, 27,253,222, 24,240,249,204, 71, +145,181,156,171,239,168, 43,192, 81, 21, 20, 57, 90,247,224, 76,128, 89,186,169, 71,219, 68,190, 7, 15,227,242,170,187,175,254, +199, 7, 22, 29,132,171,210, 5,164,123,153,231, 46, 30,178,212, 71,162, 1,105, 42, 54, 22,171,166, 3,120, 88,235,142, 12,197, + 1,188,141,243,204, 3, 69, 82,255, 94,241, 11, 77, 39,163,208,185,211,213,176,161, 44,235,110, 58,240, 17,132,141,123,139,250, +239,153,212,221,254,144, 57, 45, 48,122, 13,187,109,114,200, 51, 25, 52,219, 15,147, 12,252,222, 80,234,245, 0, 2, 27,122, 99, +242, 78, 37,231,104, 57,168, 68, 53,244, 27,217,153, 56, 13,173,114, 93, 66,199, 56,159, 47, 40, 54, 67,111,118,160, 46, 1,172, +209,131,143,145, 19,146, 62,138, 31, 19,216,176,177,126, 3,158,233,237, 88,198,147, 21, 85,195,176, 75,131, 40, 66,209,107, 80, +200, 4,239, 5, 73,106,162, 15, 43,245,213,245,195, 28, 28,245, 12,225, 41, 86,245,211,192, 5,188,227,204,174, 11, 30, 8,238, +196, 50, 91, 65, 84, 93, 47, 42, 74,210, 51,114, 3, 17, 82, 93,105,147, 18,208, 83,186,104, 75,232,215,222,124,210, 27, 46, 57, +106,123, 68,116,189,184, 79,184,183,216, 1,115,191,231,235,146,204, 11,194, 70, 98, 32, 62,161,179, 89, 66, 74,155,141, 84, 11, + 38,115, 60,216,244,158, 78,179,122,245,131,233, 13,222, 91, 41,129, 39,245,226,193,209,175,118,246,243,151,117,233,216, 74,154, + 54, 12,130,154,246,198,115,230, 78,133,145,163,240, 43,169,100, 32,110,209,201, 85, 5,100,187,213, 33, 16,101, 78,196,109, 65, +125, 5, 72,126,162,146,191,209,138,190, 55, 88,200,227,211,125,222,207, 34,221,154, 73, 17, 85,198,114,158, 87,151,147,225, 94, + 22, 43,128,235,251,137, 38,245, 30, 11, 3,172, 28, 38,155,221, 3, 85,144,206, 81, 5, 87, 47,116, 49,140,109,146, 70,123, 83, +189,167,240, 95, 15, 82,179, 99, 12, 57,214,206, 40,224, 2,233,224, 56,210,231,163, 29,216,142,212,149,199,240, 26,237,134, 77, + 71,160,227,141,207, 4,128, 29, 70,184,163,201, 66,207,102,166,193,161, 33, 83,118,135, 70,219,251,246,221, 45, 3,113,147, 12, +148, 37, 95,107,197,117,197,206,113, 44, 33,247,211, 40,190,123,205, 22, 71,171,232, 88,193, 81,222,184, 33, 9, 58, 94,168,157, +101,164,180, 26, 59,102,183,203,234,130,185,210,231,143, 92, 38,118,235, 99, 75,169, 40,148,149,252, 65,181, 26,115,142, 99, 25, + 88, 23,137,137,153, 57,142, 25, 35, 3,241, 9, 59,208,175,223, 47,228, 95,124, 58, 96,193, 4,212,242,180,185,181, 85,162,115, +187, 49,229,195,125, 6,101,111,190, 41,121,206, 64,229, 3, 67, 97,127,223, 10, 51,220,251, 56,220, 73,210,108,154, 8,138, 94, +183,175,190,250,107,249,253,111,255,139, 44,183, 37, 57,235, 24,159, 34,137,205, 23,118,175,241, 58,120,110, 26,154,236,150,117, + 83,225,241, 1,166, 39,219, 37, 11,168, 22,187, 59, 99, 47, 32,137, 32, 98,146,155,142,123,227,157,100, 16,251,232, 54,128, 56, +205, 74,224, 41,180,240, 36,142, 28, 12,141, 21, 60,239,173,200,236,150, 41, 23, 90, 90, 17,109, 19, 75, 51,208, 1,198, 3,205, + 37,158,254,144,156,125, 91,121, 81,109, 13, 88, 8, 77, 30,219, 93,196,238, 28,251,118, 72, 22,127,255,245,107,222, 75,196,168, +149,155,248,140,151,177,188, 72,250,210, 41, 39,114,175, 63, 7,198, 18,215, 86, 26, 19,167,218, 81,182,244,249, 24, 96, 79, 61, +215,231, 97,186,147, 63,165,119,178, 94,140, 93,182,217,226,231,201,254, 64,254,187,207,123, 4,190, 1,104, 6,124, 12,172, 93, + 1, 93,222,236,242, 90,174,153,224, 99, 7, 70,166, 16, 48,130, 49, 79,192,200, 76,165, 83, 40,149,157,156, 60,147,225,193, 35, +106, 1,244,244, 62, 48, 86,185, 94, 7,138,152, 1,169, 95,200, 23, 90,188, 68, 37, 21,175, 82,199, 76, 65, 80,198,148, 29,173, +179,142, 19, 0,253, 54, 76,148, 33,109,135, 99, 54, 47,207,207,246,245,122,157,200,215,111,174,152, 43,160,101, 0, 90,225,151, +207,246,104,210,244,246,122,206,251,103,190, 17,109, 38,227, 22,101,183,109,189,176,243, 73, 0, 26, 28,208, 4,225,200, 7,218, +220,241, 32, 33, 72, 16,185,119,193,125,250,156, 34, 75,167,122,246,112,166,215,110,214, 98,147,170,162, 94,233,110,233, 64, 41, + 90,124,155, 55,199,163, 97, 36,183, 26, 71, 6,253, 38,207,114, 99,174,205,227, 0,122,209, 89, 90,119,213,148,244, 12,139,250, +129,171,118,148, 81, 24, 61,112,128,171,132, 40,129,115, 64,131,154, 50, 17,125, 36, 4,242, 79,180,110, 1,102, 41,173, 59,103, +133,233, 28,234,204, 17,207,248,208, 65, 42,110,106, 31,219,142, 21,221,153,249, 20,241, 3,178,114,174, 58,245,184,109,154,103, +193,131, 29,104,224, 10,105, 65,189,167,121,224, 98, 87,125, 90,165,124,102,104,245,162,150,225, 52, 4,124, 86, 27,219, 84, 93, + 93,236, 92,218,138, 31, 78,125,114, 26, 43,148,181, 91, 93,101, 99,200,241, 22,253,169, 83,167,223, 88,231, 10, 91, 64,116,226, +176, 99,228,136, 52,177,131,212,240, 14,103, 15,224, 15,176, 14,102, 11, 57,208,202,174,217,220,103, 36, 67,112, 98,178,209, 68, + 23, 31,180,184, 27, 50, 14, 36,170,126,125, 88,227, 1, 19, 6, 71,100,137,141,201, 24,212,125, 63,137,196, 75,186, 5, 68, 39, +150, 91,222, 19,142,132,188,123,197,125, 55,163, 25, 27, 75, 27, 0, 18,123,181,134,155,175,136, 83, 10,115,118, 15, 38,101,232, +110,118,116,103, 11,234, 36,157,121, 64,219,229,230, 38, 68, 62,102,110, 35,195,128,210,134,153, 57, 44, 37, 45,138,174,164,165, + 49, 41, 16, 52, 50,175,188, 42,160, 93,154, 61,128,165, 72,137,219,149,190,123,245, 42,249, 35, 57, 81, 59,123,133,216, 26,169, +240,196, 29,177, 19,199,217,193, 78, 55,240, 53, 10, 30, 10, 90,174,122,193, 25, 20, 14,164, 12, 2, 55,195, 48, 37, 68, 8, 91, + 32,137,192, 24, 2,212,154,184, 72,121,143,103,179,153, 77,140,208,249,228, 21,197,202,236, 61,239, 38, 83,249,252,165, 80,111, + 28, 8, 26,240, 75,161,157, 77,141,132, 44,243, 9,147,163,149, 51,123, 15,120, 79,247,211,165,254,124,230,224,208,146,227, 72, + 24,192,112,242,178, 53,236, 2,186,215,152, 59,242, 53,147, 26,229, 91,161,181,224,194, 62, 72,146,152,186, 44,189,112,230,153, + 14,204,209,107,187,115,107, 85,223,119, 10,129, 63, 86,108, 66,179, 31,103,106,201, 41, 65,193, 49,243,198, 53,251, 9, 66,164, +236,172, 49, 1,208,105,136, 23,112, 45, 22, 60, 26,140,129,251, 24,116,121,175, 91,141, 22, 87, 14,107, 36, 72, 20, 69, 26,232, + 37,180, 36, 69,181,201,220, 21,189, 2, 83, 86,180,103,222, 86, 5,187,108,107, 52, 39, 23,119, 10, 29,180, 90, 53, 26,156,148, +229, 69, 93, 4,150, 98, 54,206, 40,242,187, 45, 83,217, 43, 41, 80,178,149, 94,212, 38,223,250,187,203,149,204, 53,254, 61, 61, +208,231,106, 93,114,223,140,123, 50,232,134,126,246, 75,142,104,227, 29,220,204,114,118,116, 65,240, 48,209, 3, 72, 9, 59,111, + 88,121,238, 54, 27,130,194, 70,227,177,188,120,254, 68, 6,223, 14,100,124,113,197,103, 6, 12,161,217,210,146, 9, 95, 3,247, +141,210,192, 33,247,228, 4, 72,209,254,115, 77,202, 92,117,198, 48, 77, 64, 39, 8,249,214,205, 10, 9, 43,103, 87, 8,127,248, + 13,177, 45, 13,217, 63, 57,179,179,141,137, 87,120,230,109, 85,200, 98,163, 71, 65,159,152,211, 62, 92, 55,136,173,224, 90, 67, +153, 82, 92,213,177,198,113,232,153, 95, 70, 72,140, 43,211,107,192, 55,108,133,224, 46,220, 79,188,183,147,189, 19,210,209,176, +130,184, 25,141, 57,209,107,184,189,110,225, 30, 15,135,253, 80,238, 70,247,114,126,123,207,162,245,213,227, 3, 22,124, 91,202, +218, 38,210,239, 15, 25, 71, 17, 25,224, 43,112,117,125, 46, 11, 77,246, 16,121,161,197,172,198,128,197,234, 86,126,186,184,101, + 60, 44, 29,112, 86, 1, 96, 67,131,104,213, 57, 36,142,108, 34,107,141,149,139,213, 36,198,159, 7, 88,177, 9,127,131, 78, 44, +143, 15,246,244,223,250,251,187, 48, 61, 42, 41,112,246,232,176, 79,188,201,235,119, 87,242,244,172,167, 73,244,128,116,211,197, +218, 44,134,177,154,249,249,147,161,124,127, 49,149,247,183, 43,130, 3,239,151, 5, 57,229, 63,127,126,204, 21, 4,228,110, 79, + 15, 7, 28,185,127,250, 4, 83,149, 59,198,127, 20,173, 48,120, 57,222,211, 66,224,126,201, 85,131,121,169,151,242,234,108,160, + 9,217,214, 63,152,166,160,208,155, 46, 83, 38,121,124, 95, 18,110,121,223,166,171,204, 38,213, 4, 87,151,122,134,150,206,236, + 73, 8,182,163,138,106,105,152, 31,203,195, 33,139, 78,196,225,233,116,206, 60,115, 61, 94,235,245,111,201, 73, 18,210,209, 13, +211, 66, 76, 18,227,134,155,146, 84,238, 43, 12, 44,222,185, 87,137,144, 99,178,252, 65,154, 51,240, 81,117,189,120,175, 69, 75, +202,154, 35, 12, 46,223, 3, 32,203,196,254,139, 74,185, 76,194,154, 51,206, 7,169, 2,229,201, 67, 50, 38, 93,165, 40,106, 61, +108,234,190,103,214,157,135, 97,236,175, 91, 37,131,178,246,221,102, 85, 92,228,181,153, 72,197, 71,102,114,205,210,186, 64, 40, + 29,205,141,164, 65,113, 16,188, 47,159, 58, 12,250, 45, 22, 30,120, 15, 20,213,209, 63, 79,103, 5,119,188,131,142, 1,249, 66, + 71,157, 98,244,129,125, 42,222, 23,110, 62, 30,144, 78,179,225, 24, 2,240,204,245,125,245, 27, 68, 86,226, 90,227,245, 42, 32, + 6, 57,233,110,105,105,116, 66,211, 18,175, 40,134,252,156,190,185,159,111, 82, 30, 28, 10,248, 39,166,153,188,171,165, 70, 99, +247, 83, 46,184, 19, 14,106, 46,184,249,176, 71, 73, 72,189, 0, 76, 16, 48,122,195,184,176, 66, 88,163,168,224, 58, 33,176, 9, + 66,225,102, 49,133,239,125, 1, 38, 74, 75, 13,246, 48, 37, 32, 54,192, 2,117,176, 77,125, 53, 19, 16, 9, 95,153,204, 84,247, +143,232,117, 92,207,216, 84,220, 82,118,198,230, 71,142,159, 7, 62,129, 93,116,153,240, 33, 43,242,226, 65, 48, 38, 50, 47,242, +106,245, 64,209, 17, 87,109,171, 58,112,124, 62, 20, 90,221, 78,191,166, 51, 34,103,225,176,211,109,144, 59,220,173, 79,110, 2, + 47,248,130,154, 10,105, 64,206,130, 69, 41, 9,142, 97, 92, 75,220,226,251, 16,244, 49, 74, 67,226, 36,200,168,208,135,173,219, +228,116, 3, 29,208,150, 86,153,137, 77, 54,240,115, 5,184,173,115, 89, 77, 67,118,187, 0, 61, 33,201, 72,220,169, 45, 73,105, + 34,162,201,200, 92,237,114, 57,210, 74, 29,154,236,116,219,242,137,146,157,125,195, 28, 4,101, 94,227, 92, 40,179,139, 49, 34, +254, 79, 19, 76, 25,149,164,146, 5, 68,144,195, 35,122, 77,155,218, 36, 46,233,175,222,207,219,146,179,144, 14,184,207, 71, 80, +220, 22,166,158, 23,186,241,138, 80,128,105,195, 36, 13, 17, 27, 88, 70,226,166,227, 94, 96, 63,139,130,113, 4,138,218,214,138, + 38, 96, 9,140,179,107,247,145, 98, 25,203, 29, 3,205,122,183, 54, 33,155,200, 60, 24,240,140, 99,100, 73, 11, 91,167, 25,150, + 46,152,100,207,101, 40,207,143,247,229,114,188, 96,241,130,169,194, 99, 13,160, 31,110,166,152,113,213, 38, 32,213,243, 95,197, + 40, 22, 69,184, 14,137,153, 6, 73,207,138, 19, 32,184, 97,104,131,221, 43, 58, 75, 40,230,253,249,221, 92,190,122, 57,148,255, +231,235,145, 28, 31,244,185,138,200,248, 30, 77,140,101, 1, 68, 63,246,180, 40,144,196,156,251,176,202, 64,177, 29,106,130, 93, +208, 63,161,224,124, 37, 42,181,155,154, 46,228,115,253,222,159,125,249, 11,249,199,111,190,213,231, 66,159,167, 53,144,245, 7, + 50,214,247,188,210,107,137, 29,115,133, 77,233, 52,180, 48, 56, 50,170, 26,238,225, 9,124, 30,134,141,122,101,112,124,184,199, +224,189,253, 52,245,245, 92,204,105,137,201,198, 22, 76,252,152,212,225, 12,162, 16, 35,180,165, 48,195, 42,172, 84,176,242,156, +110, 77, 31,157,150,178,250,223, 80,171, 20, 7,201, 21, 62,241, 50,234,175,129,192,178,204,206, 16, 14, 27, 86, 21,216,221,226, +253, 21, 52,161, 17,233, 38,185,188, 60, 25,176,104,195,180, 47, 14, 13,240, 92,134,166, 87,126,169, 93, 33,232, 89,192,146,124, +254,120,159,137,107,168,247, 96,127,208,145,156,160,197, 6, 87,131,224,187,195,129, 49,244, 21, 45,244,215,135,250,217, 48,166, +183,120, 45,254,218, 15,103,191,162,225,225, 89,197, 61, 70,192,193,142,158,166, 39, 77,172,224,172,120, 60, 26, 14,217,124,192, +213, 16, 13,194,147,167,207, 73, 99,123,245,108,200,238,218,216, 90,122, 54,103, 75,125,159,129,124,247,238,134,235, 68, 28,249, + 94,211,248,234,183,147,141,217, 12,107,199, 62,104,233, 89,213,243,139,215, 6,213,239,221,229,189,158,151,161,196,249, 78,222, +124, 24,201,231,207, 14, 25, 35,143,247,205,155, 30,231, 31,118,172,189, 47, 30,201,167,143, 6,242,211,237, 82, 59,236,142,140, +180,138,188,184, 95,211,156, 70,202,194,133,143, 66, 62,123,235,109,230,118,171, 1, 53, 87,118,153, 77,135,132,197, 55,114, 85, + 76,174,253,205,104,196, 88,137, 24,132,245, 3, 77,135,118,169,131, 29,181,240, 27, 14,248,188,160,176,193, 57,122,123,147,233, +245, 63,100, 76, 66, 51,133,230, 48,206, 50, 83,107,146,143,212,185,138,143,236, 42, 31,244, 64,141,211, 91,229,242,162, 2, 82, +249, 27, 19, 34,125,203, 26, 96,198,142, 9,187, 53,239,132, 43,197, 47, 86,219,174,242,149,123,181,110,178,143, 57,237, 79,145, + 4,114,175,208,171,159,139, 2,235,210,179,220,132, 23, 50,223,209, 33, 65, 82,132,134, 74, 86,166,143,205, 68, 10,225,153,196, + 56,191,177, 7,177,220,197, 94,240,143,201,206,154,228, 44, 64, 62, 24, 47,163,243,196, 97, 56,220,235, 81,202,117, 75,110,126, +198,206, 9,221,111,214,194,254,179,109, 94,182, 24, 69,105,181,132, 61, 25,110, 62, 59,116,223,101, 65, 2, 23,175,131, 27, 68, + 4,164,152,188, 35,146, 52, 28,182, 58, 20,137,182,224,189,221,165,110,120, 18, 48,121, 39,190, 51, 5,215,180, 2,186,161,224, +128, 46, 61,190,207,192,121, 33,199, 85,203,141,141,167, 80,132,140, 57, 14,246,110,212, 71,145, 72,164, 24,119,115,229,209,176, +117,198,108,147,242,154,110,138,162, 30, 67, 33, 80,183, 82,155,142,248,214,197,212,142, 10,115,204, 98,128,114,225,154, 74, 49, + 42,242,132, 91,186, 13,166,237,188, 31,240, 11,244, 33, 15,108,106,178,115, 64, 26,169, 41, 30,100, 66, 55,247,168, 14, 86,144, + 7,174,158,101, 21,122,130, 39,217, 19, 7,249,228,238,157, 46,206,138,175, 0,148, 9, 59,102,235,204,171, 42, 51,112,197, 62, +163,198,101,181,169, 75, 37, 86, 82,123,169,251,239,166,237,163, 3,143,200,217, 78,140, 45,144, 58,114, 29, 65, 15,200,127,112, +139, 33,146, 1, 4, 49,196, 33, 16, 4,177, 18,201, 8, 92,179,233,197,120, 50,151, 73, 39,148,243, 17,168,136, 77,114,196,161, +191,143,125,183,237,190,133,146,145, 81,108, 19, 48, 84,213,133,235, 44, 0, 36,151,106,199, 10,132, 61,216, 36,129,243,143, 81, +244, 65,194,211,192, 68, 45,190, 95, 84,252,184, 78,189,126,200,238, 32, 43, 33,156,210, 51,225, 30, 41,232, 52,183,166,133,176, + 41, 58, 2, 95, 0,129,162,202, 86,185,178, 66,198,117, 67, 39,209,236,152,168,146,129, 21, 67,217,215,223,117, 51, 94,201,104, + 54,147,117,106,134, 42,226,220, 98,128, 51, 13, 19, 81, 82, 13, 17,197, 16,118,234, 0, 41, 21,165, 21,251,227,233,202,117,228, +253,252, 99,210,212, 52,156, 9,117, 5, 74,251,121,188,119, 36, 39, 19, 37, 10,205,238,213, 99, 71,181,250,170,213, 12, 43, 99, +160,210,246,234,120, 45, 60, 87, 59,103,165, 52,249,103, 99, 50, 96,162,129, 11,252,167,243,165,252,247,159,246,104,189, 76,124, +134,254, 31,104, 92,120,249,147,163,129,141,120,233, 86,150,152, 71, 54, 24, 35,113,193, 93,230,254,176,239,107,201,156,133, 19, +204, 68,208,121,223,222,143,165,221,221,151,255,225,175,255, 74, 59,166, 41,175, 37, 98,207,225,175, 95,241, 61, 98,106,131, 66, + 15, 43, 26,196, 16,136,163, 76,200,102,217,178, 72, 19,109, 12,240, 53, 48, 56,166,219,156,192, 55,170, 83,106, 18, 66,161, 88, + 56, 71, 89,124,119, 28,251,138,110, 7, 10, 41,146, 68, 11, 69, 71,139, 5, 83,225,215, 23,199, 31, 6, 78,248,252, 20,244,170, +168,191,166,185,108, 84, 79,182,192, 90,156, 5, 6, 96, 51,195,159,144, 49,140, 30,241,250, 94,127,188,156,107,146, 26, 82,160, + 69, 60,214, 67,207, 34, 40, 32, 66, 54,160, 20, 43, 48, 22, 80,187,108,197,125,249,242,229, 19,126,199,197,221,130,138,119, 32, +160, 44,118,250, 12,245,251,122,205, 15,229, 19,237,134,227,210,104,110,120,230, 49,110,190,213,179,113,165, 93,229,205,253,148, + 49,159,163,112, 61,155,125,202,212, 6,156,136, 65,174, 27, 95,195,148, 11,241, 15, 5, 3,117, 61,146, 6, 81,222,128,227, 30, + 12,219, 44, 50,238,166, 27,198,152,243,235,137,118,210, 35,217,174, 71, 90,236, 44,217,113, 3,163,128, 41, 73,191,221,213,215, +223, 51, 31, 1, 40,229,233,181,129, 30, 59,198,248, 31,238, 23,210, 12,172, 65,216,176,232, 41,101,175, 85,178,187, 30,118, 33, +187,189,213, 34, 61, 37, 70, 32,215, 66,249,101,116, 32,151,119, 51, 62,239,231, 55, 19, 74, 47,163,224, 0, 40, 22,207, 18, 85, +236, 38, 96, 55, 52,249,236,146,133,164,247,109, 95,139, 13,224, 84,192,213,199,212,180,153, 24,152, 23,141,193, 64,139,204,201, +198,128,112,149,183,193,158, 62,207,160, 78, 67,244, 13, 56, 28,196, 80, 52,125, 56,143, 88,115, 97, 84, 79, 1, 41,248,154, 76, + 50, 45,112,208, 8,101, 92,177, 16,175, 25,212, 82,158, 54,190,172,187,223,138, 3, 29,132,181,154, 88, 69, 47,201, 61,128, 91, +110,119,227, 14,243, 18,225,168,128, 84,138,208,193, 16, 12,194, 8, 24, 15, 35,159,168, 17,214,223, 7, 99, 0,188,241,245, 2, +160,138, 64,244, 25,212, 27,219,225,161,171,100,252,136,142,100,183,109, 15, 53,110,252,146, 22,123, 49, 31,182, 22,221,202,240, + 80,235,247,184,211, 28,209,183,238, 99,139,194, 15,193, 26,114,153, 24, 5,133,129,125, 70, 72, 55,226, 33,196, 67,247,244,236, +136,227, 77, 0,158,240,217,240,250, 0,108, 32,224,163,202, 70,240,154,235,195, 99,134, 46, 91, 57, 58,104,209,137,168,201,145, + 80,198, 46,166,178, 38,197,129, 44, 3,123, 31, 64,167,102,148,170, 13,169, 96, 85,249,211,103,100, 1,152,158, 47, 2, 84,154, +110,248,243,149, 98,219, 2, 50,128,217,166,230, 61,110,150, 89,125,221,171,149, 8, 42,208,178, 34, 17,226, 97, 45,115, 71,179, +219, 23,240,224, 96,173, 33, 78, 65,163,113, 67,244,145, 70,186,119,129, 85, 65,199,157, 51,194,147,137,125, 27,216, 38, 12, 93, +154, 53,247, 49,184, 83, 64, 62,114,239, 42, 93,171, 54,115, 73,219, 74, 97,175,162,124,208,137,204, 65, 49,245, 57,178, 1, 78, + 61, 90, 71,128, 77,220,246,183,112, 63,232,192,187,202, 0,235, 0,167,135,132,145,117, 66,134, 96,183,235,199,205, 83, 32, 44, +124, 42,234, 1,170,235,204,247, 93, 53,250, 30,175,233,244, 69,220, 79,118, 11, 40, 16,169,177,222,208, 46,160, 69,196, 56,118, +120,122, 23,184,211, 70, 49,137, 98,173,162,228, 80,254, 85,223, 51, 18,119,160,157,201,146,221,127, 78,218,201,155,155, 37,119, +160,211,133, 81, 38,231,147, 41,223, 51,170,235,128, 18,164, 91, 68, 22,237,162,155, 76, 8, 80,165,163, 75,223,165,117, 92, 37, +165,151,115,147,195,213,247,190,218,206, 61,113, 52,216,149, 96,212, 11,207, 0,112,112,209,198, 0, 95,130,206, 52, 36,159,189, + 77,222, 49, 56,239, 16, 57,105, 5,166,218,134,238, 15,215, 99,101, 50, 93, 92,185, 20,181, 84,127,193,226, 9, 93,170,129,221, + 50, 82,220,176,130,128,253, 39, 10,100,227,234,102, 92,229, 84, 2, 33,212, 78, 72,154,228,168,227,218,238, 13,250,236, 38, 41, + 13,155,151,228,245, 30,239, 15,216, 69, 87,114,200,247,227,177,111,132,109,138,115, 53, 89, 16,113, 95, 21, 93, 0,103,113, 29, +147, 85, 69, 87,233,241,165,244,174,179,112,193,167, 88,139,239, 62,157,226, 96, 91,140,142, 58,140,108, 90,182,208, 78, 21,157, + 13,120,230,163, 69, 65,206, 58,132, 68, 16,112,247, 53,169, 76, 53, 81,194,161, 16,122,224,232,244, 18,160,169, 67, 3,147, 97, +202, 3, 80,215,118, 27,177,248, 26,232,103,194,253,218,110, 77,244, 9,126,230,215,183,247,114,118,124, 40,191,248,226, 19,249, + 63,254,243,239, 88,116,254,249,199,107, 98, 87,108, 10,149,113, 98,129,142, 26,168,107,220,119, 48, 26,112, 79,169,231,224,116, + 50,158, 89,189,133, 24,243,195, 82,147,116, 46, 96, 86, 66, 19, 21, 66, 35,129,216,182, 3, 69, 49, 93,201,227,227, 99,249,242, +211,231,114,160,113, 40,164,123,228, 70,254,254,155,159,104,167, 74,100, 60,234,118,172,183,160, 86,135,198, 40,249, 88, 42, 89, +106,109, 14,220,205, 40, 48,111,242,210,233, 89, 80, 95,155,175,150, 60, 83, 0, 2,134,174, 9, 82,184,220, 44, 68, 95,218,237, +146,202,132,136,159, 6,218,202,228,251,243,145, 60,215, 78,181,165, 69, 38, 52,240, 55,152,132,166, 91,130, 39,183,155,190, 60, +121,116,166, 69, 66, 79,222,159,191,151,168, 92,107, 2,157,115,130,194, 81,190, 54, 79,135,218, 88,225,252, 83,252, 70, 43,206, +235,233,154,137,154,171, 52, 40, 11,114,146,152,179, 72,132,223, 6,124, 44,128,231, 64,243, 3, 6, 3,138, 38, 52, 32,152, 88, + 73, 60,208,179,174, 9,238,234,156,215,149, 56,150, 50, 34,127, 29,236, 7,172, 39, 96, 48,115, 51, 53,167, 58, 80, 85, 83, 87, + 47,157,211,172, 75, 8, 72,197,234, 99,182,210, 51,187, 25, 75,191,255, 66,207, 17,164,204, 23,122,166,255, 63,170,222,179, 73, +182,235,202, 18,219,215,165,207,242,254,121, 88, 2, 4, 57,109,200,142, 80,171, 99,102, 66, 49, 17,250, 32,125, 29,253, 30,253, + 42, 73,161, 24, 69,168,165,142, 25,170,155,100,179, 73,130, 32,240,240,124,121,159, 89, 89,233,174,211, 94,107,239,115,235, 17, +221, 32,128,122, 85,149,215,156,115,182, 91,166, 77, 48, 95, 93,117,164,223, 71,161, 49,150, 51,189,159, 44,182, 4, 10, 2, 63, +147,169,141,177,241, 46,239,244, 62,218, 37,198,102, 21, 99,224,246, 74,199,198, 74,121,238,214,171, 41,239, 21, 96, 91, 20,113, +121,148, 56,126, 41,227,123, 66, 82,140,117,141,189, 49,157,207,248,117,156,173, 73, 63,102,135, 5,103, 57, 94, 43,228,212, 71, +186, 79,191, 63,154,200,215, 79, 6, 76, 14, 83,148,241,129,206,198,131, 9, 85,233, 71,214,149,134, 82, 76, 57,159, 3, 71,178, +118, 29, 95,218,223, 85, 53, 51,101,180, 71, 0,254,192,197, 66, 72, 35,146,168,113,145,193, 33,142,138, 6,242,127,179,249,146, +237, 91,108, 56,204,233, 66, 11, 29,106, 89,200,112, 54,245, 5, 83,193,139,243,218,146,180, 24,102, 37,250,231, 81,109, 7, 65, +168,184,241,146, 98, 15, 22,216,232, 80,129, 66, 53,140,246, 3,218,225,116, 10,186,159,113, 12, 64,149, 37,240,102,165,116,157, +115, 33, 56, 8, 70, 0,221,182,169,214, 33,192,190, 63,190,226, 53,206,168, 28,215,226, 33,136, 32, 3,126,184,129,163,108,145, + 33,195,194, 27,153, 95, 90, 5,157, 56,246, 32,246, 57, 81, 25,176, 9, 28, 63, 20, 31, 33,229,171, 70, 58, 54,114,169,210, 0, + 10,128, 90,157,129,181,146,134,123,110,188,240,244, 97,131,213,214, 98, 71, 27, 42,200,179, 62, 84, 50, 53, 43,104,147,174, 45, + 26, 1, 8,202,162,118, 83, 55, 10,241,241, 72,105, 63, 35,174,172,150,231,198,159, 14,188,245, 96,113, 19, 52,225,113, 88,148, +142,192,143,228, 1, 76,105,109,110,251,119,204, 29, 37, 14, 93,154,186,153, 79,134,201, 14, 81,223,105,212, 80, 11, 73,253, 72, + 82, 7, 66,105,128,237, 56,250,217,231,236,145,207,206, 57, 71, 79,109,230,198,182,175, 4, 53,193,210, 51,216,192, 95,143,131, +127,112,131,229, 96, 37,142, 10,110,185,124, 72, 96,220, 42,152,186,252,174, 37,128, 67, 2, 65, 27,246,145, 63,121,186,197,182, +238,255,247,231, 99,125,143, 54,167,159,235, 33, 55,160,220,163,233,199,111, 12,219, 60, 0,177,246,233, 39,206, 68,170,205,170, + 7,116,168,101,110,218,255,176,222,172,171,133, 81,156, 72,203,203,154, 36,249,222, 77, 58, 80, 33, 94,223,153,177, 74,236,218, +223,120, 6,101,189, 36, 8, 52,109,168,161,250, 94, 97, 36, 1,185,213, 86, 76,164, 45,158, 65, 75,147,224,173,172,207,117,181, +167, 65, 20,239,224,245,241, 37, 43,104,142, 27,144,252, 96, 70, 43, 17, 15, 18,170, 17,198,198,223,173,107, 75,176, 48,135,173, +216,173,138,153,152, 34, 81, 21,151,163, 53, 32,105,212, 0, 67,177,134, 16, 84,113,219,148,238,188, 55,164, 53, 59, 17,222, 21, +129, 66, 24,130, 62, 14, 96, 84,206, 6,138,180, 78, 22, 91,230, 14, 6,236,131,214,166, 85, 53, 36,111, 99,151,156, 38, 40,147, + 58,227, 41,247, 57,214,255,210, 29,182, 10,175, 76,209, 6,197,185,128, 4, 27, 58,249, 86,249,207,152,176, 97,198,142,243,198, + 64,154,149,252,112, 58,145,191,253,114, 67,254,219,159,174,229,249,206,138, 30,208,119,124,231, 48,157, 89, 46,187, 76,138,208, +105, 33, 18, 26, 40,255,161,205, 45, 47,181,146,132, 38, 67,202,247, 42, 68, 48,143,198,119,154,236, 45,116, 45,116,101,115,101, +133,221,137,249,162, 50,245,188, 22,196, 79, 38,188,214,136,213,103,151, 28,250,162,130, 68,246,140,134, 70, 97,158, 30,244,216, + 43,253, 89, 60,247,187,201,152, 85, 58,133,133, 92,222,181,114, 71, 46,208, 16,251,155,123, 60, 23,223,159, 93,201,229,120, 38, +219, 27, 3, 6,238, 23, 79,118, 40, 30, 4,133, 62,136, 16, 81,223, 3,107, 36,207,233,176, 73, 0, 30,206,137,178,108, 70,153, + 68,107,195, 96,107, 0,250,228,130,120, 27,116,158,128, 47,192,247,188, 63,187,150,103,219,107,124, 15, 75, 87,104, 68, 77,144, +106,245,219, 74,156,254,137, 36,179,101,182,211, 39,122, 6, 30,108,175,208, 9,115,190,208,130,104,150,211,211, 28,149, 56, 20, +246,126,120, 45,242,253, 15,127,212, 63,155,178,253,143, 4, 62,113,125,145,157,245,117,130, 40, 49,102, 8,138,142,181,143, 93, + 77,232, 42,110, 64,163, 88, 32, 24, 19,181, 8,182, 52,132,123,196, 78,155, 1, 31,119,119,122, 76,124,129, 57, 5,232, 19, 22, +195, 66,143,241, 53,202, 59, 47, 40, 1,157,154,248,140,190,203,227,155,153, 6,249,142, 84,173,154, 60,113, 99, 38, 45,152,208, +194,205, 48,169,205,147,253,174,104,201,160,154,202,219,227,185,124,245, 98,135,239, 97,123,181,103, 50,206,122,158,193,143, 1, + 49, 2,251, 29, 22,168,192, 13,220,107, 81, 64,179,152,165,129, 93,177,135, 7,109, 51,137,186,229, 84,193, 4,184,208, 61,130, + 12, 48,126,231,248,244,142, 24, 42, 4,111, 22, 0, 16,161,209,132, 15,227, 43, 33,131,202,218,247,232, 74, 97,188, 49,153, 78, +205,171, 66,175,251, 78,215, 29,238,117, 99,117, 32, 95, 62,214,245,122,176,222,101,245,140,172, 7,243,224, 68, 15, 25,180,174, + 19, 63,148,179,212,208,220, 8,108,109, 23, 47, 64, 38,156,197, 22, 96,251, 45, 3,202,117,188, 50,198, 13, 34, 0,178,245,173, + 47,143,254,226,105, 74,160, 20, 2, 34,140, 50,114, 15, 48, 8, 34,168,192, 17, 36,129, 10,196,194,228,188,217, 53,157,113, 56, +175,232,230,192,107,163,158,180,183,186, 22,185, 37, 29, 68, 29,150,198,111,198,207, 32, 75, 71,235,220,204,230,151,228,146,150, + 4,231,125,220,250,143, 29, 20, 87, 53,221,136,194,169,116, 81,240,217,214, 7, 62,154,207,220, 89,101, 73,123, 66,163,234, 57, + 8, 16, 96, 47,231,126,227,160, 14,129,166, 40, 31,212,236, 42,169, 26,204, 64, 19,140,235, 7, 26, 30,238,147,252,122,231, 90, + 7,225,138,202, 71, 26, 38, 94, 35, 78,223,179,182, 94,230,148,183, 32, 18, 66,222,117, 94,184,254,188, 80, 47,216, 28,225,172, + 13,135,182, 94,212, 73,154, 25,102,205, 46,140,101,235, 70,159,115, 37, 61,199, 69,196, 62,111, 14, 12,134, 58, 28,231,252,111, +225, 24,196,100, 96, 43, 90,167,214,110,181,107, 84,197,202, 11, 48, 11,153,137, 59,183, 25,154, 59,114,224, 75,210,180,190,203, +162,108,220, 90, 62,182,112, 69,181,219,142, 91,156,201,199,174,109,157, 80,241,225, 97, 94,111,244,185,132, 85, 13, 42,170,216, +159,161, 56,199,159,207,252, 35,189,240,240, 25, 78,139, 55,158, 42, 92,179, 64,235,169, 12, 20,182,173,149, 67,175,147, 16,140, +242,108,111,131, 62,197,175,207,205, 31, 28, 20, 28, 28, 36,216, 3, 89,100, 0,189,161,102,253,173,164, 71,124,195, 98,217, 53, + 51, 13, 61,220,119, 54,134, 68,197,178,154,208, 10, 47,102, 7,166,228,124, 29,129, 21,213, 30, 42,252,159,127,118,160,149,206, +185,124,247,190, 32,192,231, 31,190,249, 68,254,143,127,254, 65,139,239,216,156,174, 98, 91, 55, 72, 82, 41,145,156,197,174,163, + 96,224, 84,236,165, 37,223,103,196,196,130, 84, 55,104, 69,107,160,153,232, 97, 90, 83, 86, 57,179,118,117,232,122,224,186,251, + 61,119,212, 51,118, 65,228, 29,146, 49,112, 34,179, 7,128,232,114, 97, 24, 14, 92, 43,194, 16, 80,225,225,224,133,245, 44,102, +133,156,251, 83,151, 31,250,244, 33,216,155, 33, 76,236, 34, 50, 43,189, 61, 6, 96,188,175, 13, 13,152,120, 38,184, 70,232,180, + 19,229, 11, 42,108,150, 56,167,187,148,139,209,221,131,205,174,235,254,207,150, 30,168, 28,177,142,202, 23, 93,131,201,108, 70, +112, 26, 48, 15, 84,174,211,196, 98,137,162,132,162, 66, 48, 26,185,149, 95,253,208,146,255,225,111,246,136, 40, 71,251,115, 69, + 19,183,171,177,121,202, 67,213,110,103,125, 32, 27, 26, 24,113, 15, 55,154,160,224,190,123,248,250,206, 58,145,206, 96, 56,128, +145, 66, 51,142, 8, 21, 56, 18,149,169,236,239,239,200,139,167, 79,229, 87,191,253,189,172,174,172, 57,232, 47,246, 53,102,193, + 6,231,225,253,100,233,103,165,143, 27,163, 32,123, 45,252,204,204, 41, 82, 53,248,228,208,221, 72,204,158, 22, 99, 75,156, 93, + 64,137,163,203, 7,140, 67, 81,229,242,233,163,182,126, 94,143,221, 23,152,144,188, 63,188,144,163,243, 75,126, 38, 52,211,225, +238,151,143,150, 76, 90,106,253,189, 56,111,193,119, 3,155, 33,136,119, 32,193,186, 95,132, 46,155,225,156, 46,110,108,100,130, + 14,228,227,173, 53,170,146, 65,171, 97, 4,131,170,202,146,254,209,245, 21,207, 44, 26,249,232,239,236,179,240, 41,184,222,215, +245,221, 34,177,133,158, 62,206,119,116, 80,176,207,222,252,248,157,116,234, 57,113, 22, 4, 72, 58,246,233, 90,207,212,247,103, +151,236,244,196, 14,118,230,217, 92,186,231, 68, 98, 9, 93, 44, 15, 66, 47,117, 29,196,124,150, 68,160, 79,177, 14, 53,113,206, + 36,161,134, 9,146,210,191,249,217,207,116, 15,106,130, 62, 48, 37, 69,252,117,124, 57,146, 63,190, 58,150,108,173,195, 46,109, + 43, 53,221,133, 43, 32, 41, 33,227,186, 98,170,157, 56,103,218,117, 74,172, 4, 20,253,128,232,159, 94, 22,242,120,103, 85,214, +187,177,188, 58,186,145,167, 59, 3,158,155, 27,107, 67,222,231, 87,219, 3,253,249,190,124,184, 52,197,197,199,154,224,188, 60, +188, 49, 63,138,200,128,196, 19, 13,242,175,207,198,178,183,210,161,114,221, 88,147, 11,224,117, 62,217,239,112, 93, 35,169,217, +129, 35,233, 34,116, 85, 42,121,119,124,196,209, 12,149,233,216,105,140,200,144, 34,215, 29,109,125, 20, 80,109, 3,139, 98, 31, + 32, 28,156, 92,163,107,204,115,214,209,230, 52,140, 55, 39, 50, 60,192, 54,205, 69, 12,142, 31, 16,161,179,133,121,251,146,186, +164, 31,134,118, 31, 22, 2, 77,219,227,200, 57,217, 5, 3, 53, 54, 1,218, 26,248,105,220,252,146,115, 47,243, 95, 70,149,110, +115, 80,145,187,235,137,161,203,225,214, 4,170, 12,231,114, 75, 30,202, 8,102, 87,227, 43, 46,110,100,248, 84,223,162, 93,235, +162,169,120, 77,145, 45,107,178,224,241, 98, 34,177,222, 92,228,146,174,104, 25, 85, 81,233, 51,125,171,230,176,153,226,180,106, + 0, 87, 9,103,107, 38,213,154,250,188, 24,115,155,112, 24,198, 33,152,251,207,135,150,114,229,165, 33,238, 21,109,186, 42,168, + 16, 57,242,223, 12, 98, 18,175, 50,189,114,116,173,120,252,110,102,120, 78,177, 74, 28, 40, 67, 78,185, 30,252,152,125,165,174, +206, 86,184,164, 45, 54,133,113, 71, 31,252,146, 19, 95, 60,134,250, 55, 41,206,152,124, 97, 3, 13,102, 89,171,209,108,199,243, + 41, 97,188,160,135, 82,236,212, 65, 80,128, 76, 25,206,102,229,228,201, 87, 62,167, 22,123,238, 38, 25, 91,124, 36,193, 91,123, +146, 35, 14, 82,115,227,141,210, 36,114, 27,203,211,128,118, 18,115,247, 74,189,165, 79, 20,253, 98, 78,116,120,248,126,252, 34, + 50, 12, 60,200,132, 57,121,234,247, 65, 35, 24,118, 61,106, 71,199,198, 46,106,210,250, 8, 21, 15,219, 94, 23,223,137,226,134, + 54, 21, 70, 71,165,203,220,226,235,171,154,237,130,198,215, 74,187, 46, 0, 84,105, 96, 95,145,141,149, 30,103,199, 53,147,164, + 88, 46,231,200,232,183,109, 94, 8,148,176,102,233,248, 30, 58, 96, 38,230,248,135,164,116,109,213, 18,224,149, 65,151, 6, 20, +104,241,159,104, 16, 57, 27,221,152,203, 86, 98, 35,159, 34,143,184,254,239,245, 29,255,228,241, 42, 5, 57, 86, 53,168,191, 59, +191, 53,197, 49,159, 57, 67,209, 13,109,195, 27, 40,197, 57, 69, 38,105,121, 27, 21, 1, 14,158,222, 45, 3,234, 45,233, 28, 86, + 49, 8,227, 21,229, 14,238, 99,210, 75, 65, 15,241,118,190, 9,212,148,165, 5, 25,241, 68, 21,123, 29,200,103,236, 99,180, 43, +183,214, 76, 41,110, 85,239,101,103,189, 79, 87, 57,204,233,239,220, 59, 30, 65,103, 21,173,111,221,255, 72, 58,176,183,241,236, + 81,156,148, 52,132,233,178, 2, 7, 19, 98,164,213,244,187,163, 11, 38, 61, 24, 39, 77, 53,248, 67,153,250,250,236,134, 73,130, + 33,239,243, 70,195,194, 42,180,178,209,191, 14, 8,120, 36,226, 7, 91,230,152,118,168, 65, 12,231, 12, 53,249,139, 69,192, 90, +113, 20, 51,119, 85,196, 44,179,253, 51,209,115,251,237,225, 72,182,134,177,188, 60,185,151,237,149, 22,233,108,216,159,215,154, + 92,172,233, 59,143,245,190,128, 98,231, 88, 46, 53,135,196, 76,139, 9,208,135,122,253,204,204, 88,174,110,101, 13, 29, 26,253, +207,171,107, 48, 29, 42,249,143,255,254,191,147,171,203, 83,172, 72, 30,186,169, 96, 20, 80, 55, 50,203, 84,131, 75,173,251,133, +179,175, 69, 60, 80, 78,245, 63,176, 85, 64,125,194,154, 2,205, 45,236,105,125,177, 28, 35,101, 48,252,208,247, 59, 33,221, 76, +247, 85,187,197,119,131, 25,235,209,201,141,108,111, 14,100, 79,171,208,191,254,233, 83,185,208,235,249,243,235, 15, 90,157,174, + 82, 95,129,216, 2,232,209, 87,181,203, 59, 71,126,141, 65, 61,212, 18, 46,179, 76, 53,204, 64, 20, 27,218, 28,107, 1, 84, 88, + 4,225, 53, 77,110, 54,134, 29, 3, 77,234,117,111,233,186, 7,133,115,161,207, 14, 34, 45,167, 55, 35,122,156,143,238,140, 33, +132,132,246,209,206,138,124, 56,187,147, 46, 70, 30,117, 91,190,249,250,103,162,191,130,122,235,253,110, 74, 60, 20,139, 58, 88, + 4,223,142,229, 79,111,143,249, 30,130,229, 51, 94, 37, 42, 87,172, 63, 2,139,233,118,102,231, 40,198, 99,192, 66,225, 37, 33, +209,198, 94,235, 80,113, 17, 82,206, 53,181,221,199,247,186,166,230,119,186, 7,245,250, 7, 96, 54,204,229, 86, 19, 82,236,215, + 99,141, 53,176, 79,125,125,114,203,119,176,149,117, 13,244,170,235, 20,186,237, 67,189,198,104,164,107,168,138, 25,187, 38,243, +137,236,238,236,235,154,138,228, 79,239, 78,229,147,189, 53,221,167, 8,220, 3,174,195, 45, 93, 59,185, 38, 90, 80,166,163,170, +164, 38, 56, 71,103, 35,182,242,177, 95,231,110, 42,134,113, 30,214,241,167,219, 61,185,190, 47,201,237,135,121,210,238,106,151, +166, 65,135,151,119,236, 60,175, 14,250,116, 44, 77,211,146,157,159, 33,227,171,157, 89,112,245, 59,187,186,226, 58, 77,152,240, +104,177,176, 52, 43,238,245,225,138,131,186,245, 28,185,152,153,184, 38, 14, 9,182, 91,150, 54, 15,198, 3,196, 12, 13, 63, 92, +151, 49,219, 2,226,244, 37,108, 90, 84, 10,176,238,157,232, 98,228, 1,142, 22,222,114, 97,114,143,244, 70,118,254,240, 71,115, +247, 32,132,192,223, 61, 95, 52,200,248,165,131,140, 82,151,227,203, 60, 64, 83, 84,164, 50,209, 0,206, 88,128, 46,214, 27, 70, +102,146,187,190, 49,190, 7, 55,181, 32,192, 32,117,186, 26,218, 22, 61,215, 91,215, 3,177,206,154,106, 56, 4,182, 32, 56, 18, + 84,200,164,142, 28, 85, 31,125,132,196, 20,151, 74,181,205,197, 10,192,221,219, 34, 15,194, 12,152,148, 81,204,205,175,183,221, +110,130,122,237,227,130,198, 23,213,149,218, 36,254, 75, 33,159, 96,247, 88,123,245,206, 0, 94, 57, 61, 46,169, 27,103, 54, 19, +142, 40,221,157, 78, 19,128,202,158, 23, 43,249,196,164, 70, 9, 54, 92,212,158,104,148,142, 72,183,119, 65,192,143,223, 25, 2, + 12,233,124,169, 81,190,146, 36,232, 18, 24, 88,195,208,232,133, 43,194,185,203, 25, 90,168, 78,205,138,189,205,250, 80, 29, 99, + 86,191,112,240, 77,202,174, 0,174, 57,140,117,130,180, 47, 70, 54,105,154, 53, 52,192,197,188, 16,121,208, 34,106,172, 95, 3, +146,158, 93, 11, 13, 86,185,211, 12, 77,245,175, 34, 47, 53, 14, 74,125,224,106,139,169,130,217,232, 3,169, 86,238,221,137,212, +186, 5,110, 60,211,161, 40, 68,226,109,205,148,224, 28,172, 39,124,125,216, 75,117,195,247,216, 17,121,127,122, 45,215,211, 37, +133, 57, 48,107, 71, 37, 9,112, 90,167,114, 17,141, 59,173,248,244,208, 99, 59,178,142, 93,206,194, 36, 32,233,241, 96,243, 5, + 25, 80, 19,189,242, 61,225, 66, 73, 62,114,192, 65, 60,211, 8,113, 61,158,112, 13, 35,161,160, 6,252,221,140,135, 48,116,196, +209,242, 47,110,167,114,231, 84,179,132,179,223,164, 1,152,150, 60,108,151,110,227,107,157,155,207,159, 29,200,167, 79,247,184, + 94,209, 18,127,126,176,197,185,101,225, 73,123, 27,215,221,237, 11,154,152,120,237,168,182, 8, 32,210, 67,242,187, 87, 71,250, + 60, 98, 25,141,167, 60,232, 87,183, 6,124, 39,179,241,130,173,218, 82,127,224,244,106,194,238,200,244,232, 86, 19,147,156,244, +173,241,248,142,216, 16, 24,126, 32,209,193,202,192,140, 57, 32,230,209,185,107,116, 42,107,113, 75,225,170,145,209, 44,202,162, +145,128,109,246,205, 71,178,211, 28, 7,214, 21, 65,117,103, 87, 55, 92,203,104,129, 47,220,140,168,223,234, 54, 35, 67,252, 55, +186,134,133,211, 42,241,215, 31, 14,103,242, 15, 95,244,228,251,163, 59, 38, 36, 0, 75,161,203,134,174, 9, 52,180,161, 21, 0, +117, 52, 80, 11,209,130,205,218, 64,111,207, 56,186,184, 27,143, 25,140,150,115, 83,223,235, 38, 37, 5,157,222, 29,157,200, 79, + 62,123, 38, 7,251, 7,242,227,235, 87,141,120, 78, 69,108, 67,155,126, 2, 80, 81,131,234, 95,153,154, 78, 3, 18, 23,204, 96, +209,186,198, 30, 12, 12, 29, 50, 63,160,254,150,216,248,170,198,153,168,123,179,227,157,179,235,241,173, 60,218,221,225,222, 68, + 87, 6, 86,167,184, 38,180,191,145, 64,125,245,201, 1, 89, 10,183,183,119,210,134,160, 85, 91,131, 93,199, 12,103, 48,130,232, +105, 50, 49,115, 27,228,194,147, 37,195, 17,153, 57, 16, 3,242,250, 42,129,145,216,243, 39,215, 99,217,172, 86,248,174, 32,161, +139,231,133,231, 79, 37,203,194, 80,228, 72,248,206,142,174,169,177, 14, 68, 59,228,132, 49,218, 1,128,237,241,238,144,193,141, + 46,133,189,117,233,173,173,201,225,233,137,172,107,144,115, 86, 47, 41,112,159, 60, 57,144, 47,159,239,107, 18,112, 67,186, 33, + 76, 82, 0, 24, 69, 64, 92,194,177, 77,171,241,201,210, 10, 45,130,206,116, 61,153,243,103,198,209, 84, 97,146, 36,156, 41,175, +173, 38, 84, 12,196, 88,245,106,188,148,223,126,119, 46,167,199,175,101, 14, 32,104,219,172,191,159,238,237,200, 47, 62,223,145, +173,123, 67,200, 79,230, 37,249,230, 72,128,240,251,209,233,250,234,160, 35,135,247, 61,189,198,182,140, 39, 71, 46,238,163,239, + 78,218, 76, 62, 14,118, 52,185,157, 85,178, 57, 76, 41, 82,116,125, 87,104,114, 51, 99, 71, 12, 35,148,171,145, 38,130, 0,102, + 10,102,245,133, 38, 70, 45, 77, 22, 18,142,109,254,245,205,149,252, 76, 63,239, 28,186,253,122, 95,199,215,247,148,178, 69,165, + 62,165,108,108,171, 49,173,170,131, 98,106,100,234,118,212, 62,240,216,136,142, 52,253, 4, 90,152,243,247,101,119,107, 75,175, +117, 66,172, 4,177,104, 31, 46, 39,110, 87, 57,243, 42, 29,217,197,178,161,146,132, 54, 53, 43, 59, 7, 88, 45, 89, 29,250,124, + 59, 73,188,125,234,122,205,203,202, 3,150, 9,193,160, 5, 28, 28,205,146, 64,167,113,245, 53,108,255,174,171,138, 73,168,254, + 28, 52, 99,179,252,140, 7, 50, 22,106, 70,195,138,177,101,109, 62,139, 78,211,172,161, 85,113,230, 86, 22,141,101, 99,176,222, +108,183,218,174, 14, 23, 27,160,195,171, 74, 86, 78,164, 22,229, 68,248,253,133,111,184,207,129,209, 50, 12, 28,116, 6, 40,136, +129,128,195,239, 34, 37,224,150, 82, 44,135, 46,104, 45,107,187, 59, 56, 44, 14,178,180, 14,138,137,216, 65,174, 93,212,197, 0, +130, 76,160,120, 64,155,242, 84,252,145, 69,226,199,109,112, 0, 65, 76,188,195,130,177,221,179, 57, 92,133,231, 85, 57,242, 41, + 77, 12,213, 28,116,251,173, 82, 45,154,175,197,141,212,175, 85, 52, 6, 34, 75, 93, 18,215,228,123,255,162,205, 29,187,110,180, +139,104,176,186,171,235,198,128, 70, 92, 32, 40,112,160, 13, 69, 95,217, 28,219,169,102,185, 3,218,204, 17,175,104,168,110,193, +219,153,243, 67,231, 41, 99, 68, 80, 39, 38,178,192,132, 7, 45,100,239,108, 24, 53,198, 0, 64,137,235,221, 3,245,205,214,236, +194,112, 19,214, 85, 17,119,202, 11,237,248,152,235, 14,137,198,138, 6, 3,180,252, 86, 59, 86,153,232,145,161, 75,183,226,218, +120,127,122, 67, 0,206,149,131,169, 74,189,110,184,188, 33, 48,157, 46, 76, 91,189,240,206,200,141,174,171,221, 77, 61,176,186, +149,124, 56, 57,215,131,101, 34,159,233, 33,181,186,210,231, 76, 13, 30,236,120,163,161,251, 16,128, 74,192,137,180, 50, 99, 94, + 80,144, 66,131,105,143,222,201,150,224, 33,192,100,196, 21,212, 90,245,172,203, 87,207, 31,243,190,128,152, 93, 27,154, 14,244, +254,214,154,236,109,174,176,163, 96,157, 14,145,179,203, 91, 38, 54, 27,250,103,122,218,200,248,232, 92,127,102,206, 22,243,205, +245,157,140,230, 57, 17,211, 8, 76,232,122,140,198,247,228,212, 99,102, 57,163,146,153,153,223, 32,129, 65,187, 48,114,149,189, +218,215, 5,173,122,147,136,115,118,226, 12,230,182,199,112, 31,133,169,132, 24,211,162,182,228, 50,117, 53,196,208,213, 67,119, + 64, 28,101,140,245,148,147,162,104, 99,148, 90, 28,252, 89, 27, 30, 37,120, 3,132, 22,190, 4, 99, 37, 84,224,100, 60,152,198, + 66,232,220, 88, 81,144, 62,112,219,163,218,218,191,150, 91,201,225, 45, 62,107, 40,192, 22,162,165,190,162,193, 3,109,102, 96, + 11,238, 70, 99, 57,130,218, 27,248,189, 56,216,121,253, 9,171, 65,116,249,114,125, 95,253,205,190,172,233,249,118,167, 9, 24, + 90,191,235, 43,107,114,122,118, 65, 93,254, 71,143, 30,203,119, 63,252,153,221, 62,220, 63, 62, 23, 64, 65,240,199,251, 61,116, + 32, 38, 50,243,226, 5,114,173,149, 59, 22,146, 47, 30,155,154,159, 89,167, 26,189,139,142,129, 38, 98,192,132, 21, 10,112,216, +107,247,148,148,182,106,182, 75,181, 67,147, 9, 29, 77,230,242,228,209,150,124,121,251, 88,254,233,215,223, 74,189,180, 14, 6, +175, 3,137, 52,193,167,117, 67, 77,166,253, 45,138, 56, 87, 80, 4,200,114,107,125,141,103, 42,230,185,226, 45,255,195,139,107, + 13,176,123,156, 9,227,154,219,157, 33,247, 69,233,122, 3, 65,163, 3,221,134,204, 5,192,110, 53, 25, 4,158, 2,149,246,250, +106, 79,110, 70, 51, 57,185,184,212, 0,127,174,123,226, 78,174,122, 3,235,128,234,130,157, 76, 52, 9,185, 57,227,218,199,122, +248,226,201,174,116, 32,209, 26,213,172,124,161,189,112,113, 51, 49,192,160,143,139,192,196, 64, 70,112, 63, 51, 87, 60,172, 41, +236, 33,140,236,128, 19,194,152, 1,239,231,209,163,175, 77,119, 62,137, 88,209, 35,177,169,168, 21,176,148,221,181, 62,215,189, + 49, 27,108,141,125,178, 59,224,249, 0,188, 2,198,197, 16, 18,130,143,195,103,187, 90,137, 35, 89,215,179,125, 79,147,158, 87, +135, 39,114,176, 93,202,135,227,115,217,254,234,169, 60,210,202,187,164,243,103, 33,199,154,236, 98, 61,181, 29,239,114,118, 61, +227, 26, 62,191,157,177,229,222,114,154,242, 63,126,123, 66, 16, 43,158, 61,156,245,238,167, 37,147, 43,226, 77,114, 77, 80,181, + 58, 7, 38,228,234,230,150, 9, 76,167,101,127, 35,177, 31,221, 77,200,158,218, 94, 95,215, 64,190,201,119,135,239, 71,140,218, +209,255,238,245,123, 90,209,223, 73,138,121, 13,173, 68,163,212,221,184, 92, 48, 38,112,213,179, 7,208,147, 89,247,197, 13, 95, + 61,245,214, 49,199,150, 13, 77,201, 54,183,209,154,162, 70, 76, 6, 85, 67,233,186,225,248,247,194, 93,225,184,216, 17, 32, 92, + 51, 61,246,182,121, 16,132,161,187,147,183, 78,241, 53,131,253, 7,207,229,136, 25, 95, 16,187, 9,194,250, 4,124,165,102, 81, +215,136,225, 68, 15,115,196, 16,192, 88,121, 74, 48,172,241, 3,161, 9,232,122,111,153, 31,202,129, 63, 31, 42, 9,228,110, 64, + 78, 58,104,200, 42,104, 75, 40,240, 51,214,250,125,168, 64,177, 98,178, 44,107, 2, 82,237,246,131, 69, 94, 60,252,172,207,160, +241,125, 1, 20,196, 68,161,178, 86,170, 51,173,205, 78, 54, 88,205, 58,205,204, 20,236, 93,154,221, 91,152,141,211, 85,240, 53, +119,214, 64,232, 69, 32,120, 46,102, 83,111, 99, 71,141,112, 75, 64,178, 67, 35,222,186, 27, 69, 83,145, 7,250,152,153,254,216, +156,219,196,136, 12, 36, 88,184,170,158, 17,144,236,185, 33,184,227,239, 44,171,154, 81, 3,159, 65,110, 24,131, 5, 3, 74,217, +100, 82,181,143, 48,248,185, 14, 96, 12,193, 63, 36, 38,129, 82,105,137,162, 37,103,176,130,173, 67,114,227, 7,125,112,127, 11, +110,128,198,156,168, 73, 45,130,148,231, 6, 0, 52,160, 85,105, 48, 43,242,150,188, 61,189, 37,218,123,186,116, 65,159,212,148, +247,230, 26, 80,177,193, 34,215,183, 14,244, 74, 32,143,137, 74,175, 52, 80,116, 50, 42,119, 1,127,210,209,131,227,209,206,170, + 12,134,125,162,200,241,239,231, 87,119,100, 90, 0, 92,115,117,115, 47, 95,188,216,149,231,251, 27,108, 11, 66,151, 92, 28, 57, +125,161, 85, 18, 2, 14, 14, 54,180,109, 23,250,172,175,111,239,153, 12,124,184,154,242, 30,127,243,234,212,128,115,206,160,152, +207,204, 5, 14, 73, 7, 85,232, 4,247,144, 59,152,200, 25,192, 81,236, 58,222, 70,217,163,138, 86,106, 98, 68, 20, 17, 98, 34, +103, 45,120,160,207,161, 80,136,217,254,146,170,106, 9,187, 44, 73,233, 35, 58, 51,206,226,186,195, 94,238, 68, 22,108,240,140, + 80,249,227,105, 15,134, 61, 38, 79,211,123, 83, 81,180, 64,100,135, 50,168,127,149, 43, 52,226, 72, 0,152,142,142, 93,101,201, +209, 83,225,154, 5, 92,227,245,131,162, 37,246, 26, 80,244,116, 59, 91, 24, 71, 31,104,107,116,234,128,139, 48,127,235,210,157, +252, 12,231, 1, 23, 43,204,202,191, 63, 28,177, 42, 2, 64, 10,106,140,144, 28,221, 44, 77,167, 98,230,160, 35, 84, 94, 61,208, + 89, 11,211,218,168, 75,211, 45,191, 27,221,113,239, 21, 14,210, 69, 85, 31,213, 41, 15,217, 3,173,254,158, 61,121, 42,111,223, +189,166,182, 66,193, 0, 60,149, 94,110,118,169,232,190,128,163, 28, 76,132,112,141, 25,217, 43,214,187, 0,131,160,128, 30, 83, + 21,132,186, 44, 97,175,124,172, 89,185,105, 72, 26, 39,238,197, 81,105,213,190,203,181,135,160,105,186,236, 41, 65,198,159, 63, +123, 42, 63, 30,158,185,244, 41, 76, 63,186,146,107,178,137,164, 11,107,131,163,202, 52,118,154,163, 57,139,161,144,187,212,251, +219, 28, 14,228,201,246,134,254,251, 88,206,244,253,224, 26, 64, 69,196,126, 93,148,169, 6,230, 75,153, 78,239, 13, 8, 91, 27, + 29,183, 11,108, 7, 76,112,162, 22, 71,174,215, 26,212,137,241,209, 51, 12,162, 45, 24, 27,244,245,221,124,251,195, 75,189,159, + 57, 43,102,204,231,145, 44,129,155, 13,180, 6,132,119,240,236,127,120,127, 42,127,120,117,232,254, 28,149, 87,170, 21,247, 11, + 71,169, 20, 43, 51,160, 29,146, 15,128, 73, 89,248, 85,236, 27,154,180,117, 17,170,250,140,221,131, 71,187,219,188,111, 36,170, + 16,186,194,189,254,227,183,167,242,159,255,225, 83,249,215, 31, 79,228,205,201, 72,206,175, 39,250,129, 93,158, 15,216,115,232, + 74,215,148, 93,134, 67, 33,180,236,239, 57, 46,128, 32, 15, 92,219,238, 22,153,236,239,180, 25,172,191,250,108, 95,254, 22,193, + 84,131,248, 63,254,203,119,242, 70,131,125, 53,183,132, 23, 29, 53, 36,194, 56, 75, 32,206, 67,199, 72,125, 79,127,255,249, 38, + 43,243, 87,151, 83,185,173,108, 63,161, 77, 31, 80,239,121,148,186, 19,159,190,151,235, 91, 77,142, 86, 26,209, 54, 2,147, 99, +123,246, 0, 33, 34,153, 1,160,155,241, 82,227,225,217,249,133,225,164,130,246, 56, 15,231,170,126, 56, 24,163,143, 90,195,174, +108, 19,130,146, 29,206,241, 67,117, 27, 63,180,214, 66, 48, 11,190,231,212, 42,119,224, 23,126, 55,245,166,189, 77, 86,122, 43, +156, 21,185, 75,199, 6,165,161,202, 13, 7,240, 50, 24, 76,196, 4, 74,130, 10, 92,246,209,124, 57,240,190,131, 38,123, 80,148, + 99,171,127, 97,217, 76,152, 77, 91,112,170,233, 60, 82,123, 21, 16,125,100,192, 18, 0,109, 81, 92, 55, 85,125, 72,104,194,223, +108, 87,135, 96, 17,168,101,206,163,181,196,160,106,108, 78,115,167, 48,196,141,232,137,115,111,107,105,208,221,101,211,162, 54, + 87,183,194,171,149, 9,231, 43, 73,211,141, 64,171, 21, 23,183,168, 23,110, 18, 99,237,119, 28,172, 31,107,213, 71,141,159,178, +153, 94, 68, 46, 68, 81,123,101,141, 31, 6,127, 58,114,147,234,194,187, 40, 13,255,188, 44,254, 66, 99, 59, 0, 4, 43,239,149, +187,126,160,148,249,162, 1, 2,154,134,190,225, 18, 72, 73,115, 13,253,210,129,129,102,202,243,240, 12,108,189, 85, 77, 82, 21, + 40,103,248, 63, 28, 30, 97,100,144,186, 19, 94,176,180,148,232, 33,121, 12,129, 62,246,107,144,143,196,139, 2, 79,190,116, 33, + 7, 50, 53,138,188,145,155,157,235,245,143,116,195, 63,217, 89,145,193, 78, 87,222,159, 89,235, 17, 89,111, 71,175, 19,238, 79, +109, 71,219,226,251, 17,172,247, 33,118, 1,208,152, 30, 68,143,119,215,137, 54,141,226,196, 19,175, 74,214,215,135, 4,149,193, +243,121,161, 7, 93,162,135,216,218,154, 86, 65,173,158, 86, 25,247,114,161,149, 0,144,230,224,250,190,190,184,105,192,149,152, +167, 17,171, 82, 5,148,107,101,109, 82, 87,217, 43,104, 52, 95,123,119,202,158, 19,174,135,135,149,247,119,130,209, 18, 16,219, +243,133,127,111, 98,233, 85,234,248, 4,128, 87, 31,164,141,141,165, 32, 28,153, 37,244,125, 0, 29,178,163, 7,121, 59,169, 56, + 94,232, 67,108, 71, 12,136,135, 42, 3,215, 65,150, 11,128, 86,179,185,131,155, 76,247,129, 8, 93,253, 58,102,236, 8,142, 52, + 64, 2,130,183,109, 70, 41,119,179, 9,159,253,124, 97, 76, 4,122,143,187, 75, 91, 73, 28, 69,206,132,157,186, 7, 1, 71,225, + 65,140,234, 92,208, 49,208,253,128,170,133,212,198,192, 97,240,185, 59, 18,199,210,253, 14, 30,192,151,194, 14, 14, 90,238,223, + 30,149,242,211,253,182,188, 60,157,176,194,134, 82,220,140, 52,212, 54,217, 34,248,190, 25, 10, 16,206,213,219,174,147, 95,154, +169, 78,110, 18, 80, 45,111,143,223, 79, 64,197,211,243, 68,147,180,110,191, 47, 63,255,233, 87,114,120,244,206, 70, 65,100,133, + 8,157,218,102,121, 76, 42, 45,175, 7,103, 86, 36,126, 6, 90,226, 11,230,130, 21, 61,102,202,100,231,152, 37,246, 72,137,131, +154, 88,228,194, 93,208,100,191,209, 74, 12, 63, 3, 39,175,151,111,143,101,216,127,161,251, 37,162, 40,213,227,189, 13, 57, 60, +191,177,159, 75, 76,164, 11,235,164,246, 46, 27,192,208,185,143,239, 58, 45,151, 68,246, 32,177, 64, 32, 5, 37,112, 94,184,225, +146,217,203, 46,139,148, 10,125,195,118, 36,235, 90,173, 15,122, 25,117, 19,200, 56,209,213,177,181,106,116, 60,188, 79,124, 13, + 64, 61,188,127, 40,166, 33, 1,219,219,212,228,224,203,231, 4, 87, 34, 25, 66,139, 31,230, 47, 72,200,164, 50,117,204,247,151, + 55, 52, 97, 49,231, 75,171,244,113, 38,101, 73,244,224, 52, 23,151, 68,166, 7,154,109, 66,236, 76,237,172, 9,216,209, 36, 4, +175, 37, 73, 75,159, 5, 82,217,158,244,182,215,100,103,173, 43,143,119,250,250,238,204,157,241,183, 47, 79,229,255,252,221,177, +244, 50,195, 27,128,171,254,227,201,173,157, 65,144,192,206, 97, 95,123, 37,173,238, 58,229,148,251,113, 65, 28, 1, 24, 2,219, +107,171,242,225,252, 90,214,135, 59,242,249,147, 85,121,125, 50,215,223,175,235,101,181, 45, 95,125,250,132,207,242,119,223, 31, +178, 74,223, 24,152,202, 38, 18,108,140, 19,160, 50, 7, 90,222,165, 62,151,207, 14, 86,228,215,175,175, 1,142,231,108,125, 9, + 75,215,110,198,206, 75,143,200,246, 25,227, 27,192,142, 89,226,157, 98, 98,124,240,220,211, 70,136, 13,186,240,247,250,220, 95, + 77,223,106,114,185,203,255,102, 80,143,154,202, 84, 55,121,244, 32,125, 42, 78, 31,170, 93, 48,196,164, 71,235, 38,112, 87, 94, +185, 62,112, 47,173, 66,140, 35,115, 25, 10,134, 13, 20, 1, 41,139,230,160,109, 92,192,106,227, 75, 70, 31, 5,163,196,147,133, + 58,182, 15,137, 60, 80, 62, 80,168, 98, 63,252, 31, 68,108,236,107,166,245, 91,133, 74, 51, 4, 1, 8,102,204, 12, 4, 99,162, + 36,137,207,174,115,167, 50,101,244,120, 15,173,238, 16,212, 57,142,168,165, 81,199,171, 67,245, 43,150,148,224,144,167, 59, 79, +167,211,152,152,240, 62,113, 13,121,213,108, 22,180,224,172,178, 40,216,110,108,121, 54,102,210,159, 41, 1,123,105,112,189,115, + 61,125,203,186, 82,191,223, 7,174,118,211, 18,103, 43,191,114,225, 9,235, 20,196, 31,217,154, 6,241,138,186, 52,100, 58, 99, +173,131,213,226,244, 65, 52, 70, 92,130, 53, 36, 67,145, 39, 36,214,166,139,220,118, 54,117,176, 96,217,152,165,112, 30, 42, 15, +129, 57,241,251, 14,129,124,233,210,143,174,226,218, 24,120, 84,101,244,145, 84,169,251,174,199,166, 42, 88,125, 20,220, 9, 84, +252,200,103, 61,106,106,205, 70,224,176,233,200, 68, 62,198, 48, 97, 28,115,146, 35,114,214,141,128, 2, 64,174, 73, 36, 0,208, + 3,246,131, 72,230, 22,173, 73, 47,110,238,228,237,162, 36,152,197, 93, 10,152,132, 34,208,162,189,149, 59, 74, 31,213,197,120, + 97,250,223,152, 47,255,128,131, 0, 99,147,210, 68, 98,106,177, 14, 84, 64,232,194,234,175, 36, 55,124, 65, 74,205,140,154,205, + 21,231,110,148, 87,110,199,158, 84, 25, 26,191,114,199, 40,171,214,224, 53,189,244,123,181,196,140,220,245,202,148, 26, 43,126, + 31,238,177,195,175, 83, 62,179,101, 89, 60,164, 61, 97, 25,139, 96, 79, 71, 65,253,108,162,224,201, 88,136, 88, 57,182,124,180, +133,123, 65, 37,138, 22,231,197, 13,132,102, 42,182,120,241,140, 46,175,167, 90,137,218, 44, 50,118,111, 7,250,183,107, 80,199, +125, 66,114, 20,149, 61,237,106, 89, 45,164,102, 91,171,215,120, 77,227,142, 17, 21,219,210,212,116, 30,152, 12,187,149, 37,233, + 58,189,129,190,167,194,218,204,101,174,251,180,118, 73,228,216,185,199,165,107, 24, 72,163,102, 25, 18, 2, 36,183, 72, 8, 90, +156,173,154, 79,121,213, 8, 86, 89,151,206,164, 77,109,172, 7,193,146,227,219, 66,254,251, 47, 87,137, 50, 70, 5, 5,212,251, +213,120,206, 67,188,156, 46, 40, 51, 10,207,241,138,180, 74, 84,160, 37, 57,196,156, 42,210,203,123, 41,237,110,135,138,109,232, +112, 64,159,101, 52, 30,177, 13, 63,213, 3,255,139,167,219,242,237,155, 11,158,105,248,153,235,201,130, 84, 56,160,207, 23,222, +125,136, 92, 89, 51,118,122, 89, 81, 58,229, 53, 50,206,184,177, 93, 18,158,224,156,185,203,194, 37,134, 35, 34,156, 99,120, 35, +232, 59, 7,242,252,120, 60,225, 33, 14,186, 46,186, 65, 56,159,119,182,134,242,217,147, 77,121,245,193,208,240,101,108, 94,237, +192, 10, 64,162,154, 73, 84,100,236, 34,240,192, 19,247, 48,199,249, 96, 5, 67, 37, 27,240, 16,119, 59,220, 41,174, 91, 19,158, +167, 91,187,242, 72,127,119,192, 33, 5,100, 58,188, 34,118,215,183,229,213,201, 21,169,133,171,253, 1, 55, 40, 52, 30,182,215, + 18, 57,189,157,145,209,116,240,228,153,236,227,158,139, 5,247, 22, 64,101, 96,154,176,107,167,239,232,153, 38,185, 71,231, 87, +114,118,117,205, 46,128, 81,230, 44, 33, 33, 69, 18, 90, 8, 16, 57,202, 98,182,174,103,185, 1,153,177,198,159,237,175, 73,187, +211,230,125,130, 17,112, 61, 46,100,115,181,101,123,244,237,133,188, 62,186,145, 51,221,227,139,249, 29,223, 3,252, 14, 48, 63, + 31, 3,132, 61, 89, 18, 32, 26,187,191,199,250,160, 37,103,108,151, 87,210, 7,181, 17, 82,183,167,135,186, 22, 18,253,157, 43, +154,228, 14,164,219, 45,244,123, 52,105, 47,175,228, 39, 79,106,249,243,187, 74, 94,236, 26,163,100,127,123,139,156,250,124,113, +198,181, 8,167,195, 39,155, 93,254,126,186,222,233, 37,119, 6, 3,121,250,120, 85,254,147, 6,247,181,213, 46,247,213, 59, 45, + 40,222,158,142, 40, 58, 5, 44, 91,135,250, 26, 88,243, 0,155,186,126,133,152,192, 80,143,244,234, 9, 13,165,246,119,182,117, +221,246,153, 8, 38,206, 20,194,121,147, 50, 96,250, 60, 52, 28,150,117, 29, 53, 2, 33, 65, 24,132, 45, 71,182,160, 10,210,107, + 2,223,155, 90,205, 69,228,136,231,168, 49, 95,168, 99,147, 69,101,123, 29, 1,169,140, 73,246,111,212,233, 36,110, 42,124,114, +182,131, 71,123, 29, 53,149,109, 8, 0, 1, 84, 99, 49, 45,242,121,121,222, 24,112, 44,242,162, 57, 76, 17, 88,104, 24,146,154, + 69, 38,230,201,227,201,157,183,141, 35,159, 49,151,110,229,186,116,176, 78, 64,163,103,110,206, 82,154, 8, 68, 18,187, 38,183, + 85, 6, 65,212, 37,224, 8, 82,231,144,227, 16,104,197, 15, 26,243,193,169, 14,135, 81, 75, 95, 80,226, 32, 51, 86,213,112, 74, +147, 48,191,143,154,251,105,132, 34,236,201, 72,220,202,152, 8,192,167, 59, 73,147,191,176,156,125,144,234, 53,218, 89, 81,154, +160, 77, 67, 21,243, 54,124, 48,141,249, 88,132, 34, 10, 13,248, 48, 66, 73, 31,232, 96, 54,146, 48,244,113, 89, 60,184,155,133, +145, 65, 0,194,133,113, 72,112,186, 99, 85,204, 4, 47,109, 50,235,134, 38,208,232,129,153, 0, 78,210,110, 53, 96, 68,235, 2, + 89, 7, 34,140, 92, 2,138, 61, 24,244, 4,109,130, 40,204, 23,156, 62, 24,127, 20,248, 99,247, 37,160,122, 29,212,198, 96,187, +154,166, 13, 35,162,114, 9, 93, 42,197, 97, 78, 89,216,154,154, 37, 70,253, 57,190,157,155, 40,146, 68, 13,151,221, 52,175, 77, + 94,179, 69,213,175,204, 13, 21,150, 54, 6,137,205,168, 39, 40,239, 5, 69,186, 96,149, 26, 57,120,174,114,133, 67,218,236, 66, +220, 98,186,224,122, 0, 39,144,137, 45, 48, 11,149, 41,173, 37,137,189, 29, 4,157,192, 58,105,123, 53, 14,109, 2,218, 69,138, +233,177, 63,222, 89, 99,181,147, 18,155, 96,206, 80,179,185,117,112,192, 71,103,178, 0, 33, 21,206,234,204,173, 14, 21,233,164, +101, 18,203,152,163, 47,151, 54,218, 24,235, 51,192, 51,122,178,187, 97,239, 67, 19, 93, 92,195,217,245, 45, 15, 24, 28,168,221, +174,177, 34,224,155, 14,181,171, 46,187, 67, 86,177,165,250,114, 22,154, 4,245,233,147, 91,201, 68, 3, 78, 62,159, 51,144,192, +225, 14,201,164,120,133, 10, 29, 8,142, 76, 82, 79, 86,216,114,207,173, 10,115,115,159,197,178,114,235,217,164,209,161, 8,103, + 81, 85, 37,134,232,174,141,182, 70,192,102, 29,125,132,211,137,136,166, 79, 83, 19,202,193,191,119, 49,106,210, 36,232,110, 25, +203, 23,122,160,254,250,135, 43,217, 92,233,176,221,138,179, 99, 78,220,131, 41,245,205,150,250, 94,193, 45,110,119,137, 49, 72, +178,146,140,156,149, 97,159, 35,136,110,183,205,206, 70, 39, 3,181, 46,151,147,211, 51,206,175,163,214,134,126,254, 25,189,189, + 97,254,178,191, 49,208,223, 11, 65, 29, 3,193, 5, 39, 64,234,226, 39,137,119, 96, 32, 74, 21,188,228,173, 99,199,113, 83,110, + 32,101,218, 87, 47,157, 99,131,132, 63,109,203,249,104, 44,255,246,242, 61,117,214,193,175,191,161,169, 74,205,247, 5,252,196, +179, 71, 59,114,121, 11, 27,210,169,143,161, 34, 79,206,151, 60, 71,122, 89,151,247,140,253,179, 62,236, 17,168,217,139, 77,114, + 21,237,114,128, 70, 23,190,254,104, 9,171, 63,255,254,114, 36, 7,235,125, 6,114, 92,215, 4,226, 44,209, 76,158,110, 15,169, + 62,247,201,193,150,124,184,184,145, 59, 93,127,144,130, 61,187,158,200,222,122,143,227,142, 83,173, 90,223,157, 93,201,232,230, +156,179,148,255,252, 63,255, 79,178,178,210,149,187,241, 13, 71, 39,131,142,198, 9, 77, 78,126,242,124,151, 63,119, 51,158,208, +145,112,111,189, 75,249, 99, 3, 0, 11, 65,109,155, 90,253, 2,100,120,126,103,192, 54,182,162,225, 46, 26,215, 12,116,227, 73, +205,107, 63, 61,159, 49,113,154,221,223,107,110,221,163,134,251,155, 15, 31, 8,254,189,215,119,243,203, 47, 14,168, 13,127,120, + 57, 97,144, 39, 59, 56,174,216, 77,193, 61,110, 15, 53,209,173, 22,250,174, 55,201, 32, 65, 33,245,120,111, 71,142, 47, 46,201, +104, 64, 18,249,119, 63,251, 70, 62, 64, 18,182, 85,105,144,111,105,178,152,112, 54,254,245,167,143,229,115,173,196,255,237,229, + 9, 29, 24,209, 33,160, 62, 11,168,151,121, 45,223,255,120, 46,135, 23, 19, 77, 14,103,114,120,125, 47, 59,186, 78,166, 75, 19, + 4,219, 95,107,203,209,104,201,196,153, 14,156,238,232, 25,180, 53, 88, 84,210,177,176, 36,182,228, 94,239,111, 99,117, 77,158, + 30,236, 49,193, 2,118,128,198, 47,177, 7, 70, 30, 40, 12,170, 15,138, 94,129,198, 20,230,207,102,202,144,122, 33,111,129, 2, + 8, 97,234,248,178, 58, 50,238,106,226,194, 33, 56, 80, 23,148,129, 76,154,196,192, 54, 93,225,135,225, 3, 93,206, 12, 30, 82, +190,160,160, 45, 31, 52,219,165,126,240, 80,110,145,162, 85, 55, 96,188,202, 43,195, 48,235, 95, 58,129, 31, 73, 65,191,223,103, +219, 46,184,232, 36,222,170,251, 72,180,222, 66,168,203,209,214,174,215, 27, 0,115,165,107, 86,219,140,188,106,146,158, 7,110, +247, 67, 48,180,118,122,212,124,157,223,155,198,206,235,172, 26,241,152, 86,154,121, 98,240, 0,112, 51,111, 95, 11, 90,168,188, +192,193,141,168,199,108, 63,183,152, 46, 31, 42,105,231,116, 7, 5,184,210,179,234, 80,169,164, 31,185,229, 89, 64,126, 64,251, + 55,127,187,104, 62, 2,138, 1,202,236, 64,161,114,155,187, 35,209,166,213, 63,165,116,237,118, 19, 0,170, 62, 26, 9, 72, 3, + 12, 76,146, 32,136, 83, 55,115, 64,241,119, 24,244, 0,106,247,251, 14, 0,190,196, 93,151,240,207,132, 22,143,201, 71, 50,178, +246, 23,178,211, 40, 10, 10,135,113, 67,113, 91, 16,244, 85, 52, 12,133,208, 13,169,156, 59,159,250,179,170,235,135, 68, 38,118, + 21,186,212, 1,135,219, 43,109,174,141, 52, 54,121, 71,113,108, 8, 49, 14,133,143, 26, 98,163,210, 65, 60,100,161,149,250, 66, + 15,250, 74, 30,172, 63, 17, 40,241, 44,144, 65,163,186, 26,246, 58,205,245, 32,216,193, 21, 11,150,152,121,106, 21, 78,218, 51, +153, 74, 84,184, 61,180,247,105, 57,107, 93,163,216,125,198,103,145,173, 19, 0,183, 34, 10, 78, 44,153, 36, 23,156, 39,182,244, +176,203, 53,179,191, 98,176, 14, 65,175, 77,249,226,152, 65,140,168,227, 52,166,176,210,130,166, 61,198, 72, 0,226, 30, 45,248, + 78,203,120,238,157,142,183,153,171,130,243, 75,200,153, 66,221,107,233,170,128,137, 4,127,132, 74, 43,254, 84,238,139,220, 81, +219, 57,219,145, 64, 35,247,244,122,174, 23, 51, 77, 90,244,103,199, 29, 23,166,202,249,103,250,191, 90, 69,101,141, 67, 25, 58, + 64, 85,105,243, 27,178, 26, 2,219, 6,107, 48,203,140,113, 26,155, 84,104,171, 72,154,238,147,177, 30, 35, 7,192, 6,207,136, +184,209, 80, 8, 52, 75, 36, 53,248,207, 97,217, 39, 98, 24,201, 2,102,216,134, 21, 18,249,213,183, 39,242,191,252,253, 99,121, +167, 1, 7, 56, 10, 72, 2,227,175,141,245, 21,233,106,197, 3,144, 35, 2,197,198,218,128, 2, 31, 16,170,129, 95, 58,246, 9, +232,100, 64,155,211,178, 20,123, 82,223,217,134, 38, 6,151,247, 21,207,190,189,253, 39,242,230,240,216,198, 76,250, 72,129,124, + 70, 81,161,217, 1, 19,251, 5, 53,215, 77,188,138,163,205,196, 84, 1,115, 90, 0, 11,241, 24,211, 25, 18, 82,147, 88, 14, 93, +201,152,231,114, 68, 85,188,131,173, 53,189,166, 11,153,220,223,177, 75, 8,112, 29,152, 7,168,124,209,226,133, 2, 25,214,193, +254,246, 58,219,221,212, 33,240,209, 16,174, 25,247,155, 87, 54, 87,103,119,173,138,217,101, 65,144,194,117, 93, 79,230,242,205, +139, 3,178,140,222, 95, 0, 47, 98,222, 8,240, 7,192,247,173, 96,100, 80, 39, 92,199, 72, 72, 22,148,229,157, 83,127, 0, 2, + 74,243,209,189,158,121, 29,118,165, 32, 5, 11, 43, 86, 48, 36, 94,190,122, 43,197, 92, 3,253,222, 99,173,156, 47,228,211,206, + 39, 18,119,183,228,191,252,183,255, 75,247,212,152, 52, 55,210,240,208,205,210,228,234,111,191,120,172, 63,127,107,166, 52,240, + 71,159,218, 25,142, 17,208,194,129,167,236, 24,196,134, 67,129,250, 46,246, 53, 70, 79, 0,139,129, 6, 8,214, 10,246,233,215, + 95,252, 84,159,233,140,221, 13, 40, 49,118,178,154, 70, 68, 95, 62, 90,147,223,191,186, 32,197,237, 96,189, 67,209, 37,232, 21, +240,204,213,107,249,112,189,212,231, 49,146,245,126, 75,159,115, 44,111,143,144,176,117, 32, 25, 35,109, 93,150, 71,167, 39,242, +221, 52,215,107,221,209,235, 25,201,105,213,149, 71, 91, 61,226,101,186,173, 14, 19,172, 87,199,215,178,187,214,161,165,241,249, +248,146,192,214,181, 46, 70, 50,185, 60,223, 91,145,127,250,215,247,242,254,252,142,221, 25,176, 2,206,224, 69,144,232,254,174, +139,102,244, 73,121, 97, 8, 46,109,174,203,230,218, 26, 99,234, 68, 19,152,142,254,115,127,107,139,239, 18,255,189, 44,172,120, + 70, 1,146, 46, 92,155,155,116, 53,183,176, 12, 62,211, 1, 94, 31, 90,173, 70, 12, 54, 23,173,212,157,150, 66,208,106, 73, 64, +160, 90, 37,155, 23, 15,173,221,194,165,103, 35,135,117, 89,123,187,126,176,221, 68,240,135,243, 14, 42,217, 78,183,153,165,133, +182, 58,109, 18, 63,106,169,219, 56, 32,120, 4, 71, 13, 85, 13,115, 41, 30,168, 64,193,151,105,227,220, 21,180,236,107,121, 56, +224, 3, 32, 48, 74,196, 3,151,205, 50,141,226,101, 34, 8,102, 77, 88,122,149,254,160,132, 38,101,160,113, 21, 86,125,122, 43, +184, 44,130,153, 77,237,130, 50, 6,126,139,189,162, 6,159,152,103,168,207,177, 43, 87,122, 50,234, 77,212, 4,192,202, 21,149, +196,199, 30,180,114,141, 12,193, 31,178,182,248,227, 46, 71, 18, 55,250,232,129,219, 78,116,181,119, 26,154,228, 67, 76,108,164, +145, 93, 23,167,211,132,246,116, 97,154,227, 89,150, 52,137, 0,178, 67,208,149,168,190, 86,155,228, 33,178,249,224,131,110,215, + 45,141, 9, 80,234,188,210,134, 21,209,216,102,214,141, 89, 77,225,220, 75, 19,192,137, 57,147, 69,183, 8, 7,167,205,137,173, + 74, 39,104, 42,149, 70, 93,206,204, 93,114, 74, 82, 26,151,217,170,244,229,194, 84,205,146, 40,114, 42,101, 97,128,163, 58,106, +104, 78,102,255,155, 51,201, 65,230, 15,250,208,152,130, 30,246,120,250,157,132,179, 57, 60,231,101,102,130, 63,145,163,175,201, + 49,206, 32,221, 9,233,238, 22,131, 41,190,150,145, 74,214,225,218, 65,139,112,221,185,219,184, 6, 28, 62, 97, 46, 28, 92,253, + 0,144, 49, 0,163,217, 76,222,207, 77,100, 9,213, 46,184,234,232,226, 68,174,122,136,119,195,229,229, 20,175, 96,131, 89,148, + 75,182,130,209, 26,165,209, 13,245,225,225,154,150,176,213,139,235,194,254, 68,135,234,102,188, 32, 2, 28,127,158,248, 53,209, +207, 89,131, 86,233,215,128,165,103,250, 17, 57,131,208,176, 59, 32,248, 20,193, 16, 72, 91,172, 12, 80,126,176,150,169,246, 22, +197,142,117, 48, 37,178,251,104, 42,119, 19, 61,128,209, 70,174,214, 36,105, 25,133,180,211, 25, 74,135,104,231,152, 82,176,244, +185,199,122, 6, 7, 25, 51, 85, 49,217, 81, 22, 12,149,225,108,210,204,186, 62, 75,247, 75,192,222,166,148,105,150, 52, 6, 74, + 12,116,110,227, 74, 91, 89,215, 39,135, 76, 44,186, 40, 29, 82, 94, 11, 38,247,139,165,209,101,241, 79,180,170,207, 38, 34, 23, +163,185,124,241,104, 67,126,163,149,148,237,107,219, 43,151, 26,132,240,220,224,154, 86,148, 35, 89, 91,228,156, 97,210,152,102, + 81,203,217,249, 53,147,186,210, 29,195,194,232, 11,124,114,160,149,183, 52, 49,216,214, 67,246,195,225, 33,207, 4,156, 89,104, +139,223,145, 53,145, 50,129,194, 45,244,176, 30,124, 60,105,123, 59, 38,130, 28,154,232,216, 7, 65, 6,151,242,214,185,173, 67, +128, 28, 77,122,214,188,238,171,187,137,108,109,108,217,125,105, 0, 57,190, 24,105, 64,209,196,164,147,114,189,108,109,172,104, +117, 58,145,119,199, 87,134,173,192,248,160, 50,183, 54, 36,116,139,218,228,165, 17, 8,104, 92,165,207, 24,227, 20,156,223, 48, + 3, 2,118,100,140,185,174,123,141, 15,178, 54,177, 1,183,148, 31,110,243,119, 80,248, 74,175,233,228,242, 70,206, 95,159,202, + 47,191,122,174, 1,114, 32,135, 87,115, 58,254,157,107,112,131, 16, 11,146,245,207,159, 61,150, 97, 7,218,249,171,242,250,253, +137,188,213,228,231,102,116, 45, 99,173,222, 35,199, 90, 5, 77, 16, 36,140,191,250,246, 71,106, 45, 80,155,162,122,112,111, 11, +198, 97, 38,253,237, 44, 35,158, 53, 17,217, 34,120,158,243,233, 84,255, 29, 38, 86, 29,254, 44,216, 1,113,148,201,215,159, 60, +101,117,110, 85,185,144, 14,182,171,255,125,171,129,249,118, 17,201,181, 38, 68,192,144,108, 15, 82,249,253,137, 86,210,122, 84, +239,239, 62,147,225,147,117, 89,137,103,242,231,179, 82, 46,199,247,146, 97,196, 84, 68,242,242,221, 7, 2, 19,255,244,238, 86, +254,195,191,123, 68,214,132,190, 66,242,227,111,199, 90,193,175,172, 73,165, 21,249,100, 97,133,214, 16,231, 75,100,246,199,149, +190,135,213,213, 46, 43,250, 75,221,163,119, 40, 22,234,132,207,250,226,110,106,254, 15,181,157,155, 97,228,196,249,186,119, 31, + 91,100,107,244, 24,175,142,207,207,120,223,144,142,133,196, 47, 70, 98,105,225,182,171,185,103,253,129, 63,205, 10,140, 74,113, +109,206,208, 76,185,204, 2,108,149,151, 30, 4, 3, 61, 45,242, 96,152, 52,149, 93,104,161,227,119, 39,117,240,124,121,240, 46, + 79, 92, 82, 52, 10,150,169, 81,176, 92,141, 26,205,103,163, 49, 21, 86,233,251,124,152,198, 41,224,113,122, 59,187,174,235, 38, +105, 48,169, 83,184, 82, 57, 58,214,103,182,225,126, 66, 59,217, 92,146,210,166, 26, 92,186,222,122,104, 49, 23,141, 16,198,131, +249, 71,237, 15, 52, 77,237,192,181, 3, 59,106, 58, 4,145,107,144,211, 90, 53, 10,129,219, 43, 11,215,115, 70, 0,133,224, 74, +228,106, 89, 56, 28, 89,173, 56, 40, 17,115,246, 78,234, 46,116,149, 37, 11,193, 26, 54,115,181,185,162, 40, 29,140, 88,123, 43, +220,120,188,117,101,127,179,181,201, 64,148, 58, 88, 44,110,102,210, 46,250,218,120, 88, 7, 92, 66, 28,103, 46,222, 97,243,211, + 86, 26,208,245, 54, 67,238,104, 5, 99, 76,132,136,146,158,104, 55,134, 36, 34,242,207, 8,156,244,208,229, 64,181, 21, 64,128, +181,107,190,227,153,179,162, 22, 3, 4, 54,207, 9,186, 3,168, 92,219,177, 91, 49, 10,181,161,175,110,160,169,156,218,207,229, + 46, 32, 36,102, 18, 84,127, 52, 98,160, 94, 62,219, 84, 86,101, 66,158, 85, 28,159,145,151, 38,108,196,132, 42, 10, 84, 70, 59, + 8,114,247, 78,239,100, 73,115, 31,248, 51,160,126,235, 70,210, 83, 26,122, 96, 76,183, 42,123,231, 56, 80, 35,183,240,229,168, + 69, 43,191, 88,172, 51, 69, 81,152,210, 18, 28, 92, 34, 64, 64,120,247,232,106,165,222,181, 2, 58, 23,130, 46,109, 31,225,100, +158,128,197, 46,125,135, 42,179,246,160, 3,222,117, 78,224,156,205,121,147,110,203, 90,230,222,237, 2, 16, 20,237,116, 36,208, + 56,112,105, 44,164,135,239, 41,230,228,243,188,161,129,118, 59, 38, 86,131, 68, 8,102, 21,101,109,247,219,239,164,222,210,142, +168,164,183, 6,151,194,210,236,117, 23,236,100, 24,117,138, 2, 43, 14,238,195, 33,223,235,246, 92, 89, 46, 97, 53,132,177,194, +112,184,198,170,191,173,135, 14, 48, 37, 24,106,148,122,200, 98, 62,140,100, 43,176,100, 80, 61, 51,217,197, 60,119, 41,206,222, + 48,108, 66,176, 83,102,242, 28, 4,132,188, 3,132,119, 89,126,212, 53,195,187, 88, 82, 75,187,197,164, 62, 36,127, 6,236, 53, +161, 19,188,171, 85, 24,222,232,123,253, 48,170,228,211,189,154,207,233,118, 4, 85,180,136,106,124,180,156,189,185,101, 5,143, +191, 70,195,129,236,110,175, 9, 26, 32,192, 41,204,107,155,225,131, 78, 85,242, 21, 21, 84,154, 67,113,113,119,223,102, 66,186, +185,190,169, 65,253,152, 18,158,164, 80,106, 32, 91,146, 91,110, 21,177,117,133,132,124,228,176,191,112, 78,213,174,237,223,154, + 38,206, 38, 49,148,125, 37,214,162, 79,147,138,180, 86, 4,106,236, 3,208, 44, 49,251, 62,186, 56,212,247,104,109,110, 32,225, +119,183,182,185,199,209,246,135, 15,248,155,163, 43,238, 19, 22, 55,250, 48,209,174,135,171, 30,133,174, 80, 5, 51,152,218,179, +157,234, 53,119, 59, 93,182,224, 35,125, 54, 24,177,224,185, 60,217, 30,104, 98,152,104,213,121, 33,143, 54,134, 76,124,232, 84, +152,216,187,201,157,246,121,126, 61,150,147,155, 25,241, 11, 56,247, 81,149, 66,231, 29, 73, 86,175,187,102, 96,187,110, 34, 31, + 46,238,229,250,118, 42, 21, 68,131,162, 82,171,222,148,123, 21,137, 0, 10,134, 89, 89,187, 65, 79,194, 53, 86, 65,113, 47,170, + 63, 2, 36, 11,187, 92,153,119,155,128, 25, 49,253,134, 22, 85,230,208,121,109,195, 71, 93,171,114,104, 47,116,187,125, 57, 60, +187,211,107, 43, 53,233, 2,104,110, 69, 54,134, 25,223,243,151, 79,183,229,191,254,233,131,252,120,124,107, 2, 67,119,115, 26, +189, 32, 17,129,227,218,213,236,181,100,237,190,180,234,185, 92, 77, 76, 30,248,217,206, 58,113, 28, 72,174, 78,206,207,233,234, +247,225,250, 64,254,238,203,158,188, 57,190,145, 23, 7,235,178,183,221, 34, 29,239,231,159, 61,145,223,253,240,158,248, 28,184, +197, 33, 73,154,210, 85,175,144,169,254,190,105, 94,177, 3, 19,105,156,152,150, 9,181,231,147,186, 36, 27,164, 42, 31, 76,191, +112,136,224, 29,158,156, 95,176, 67,211,110,153,176, 18,236, 90, 87,250,182, 22, 80, 48,128,171, 30, 65, 93,206,120,146, 38,118, + 18,140, 66,192, 3, 69,203, 49,115,106, 4, 51, 94, 71, 72, 51,120, 71, 70,239,160, 97, 10, 14, 82,201, 27,221,231,160,224,197, +128, 30, 89,155,167,153, 25, 59, 8, 47,180, 46,107,167, 25,133,214,124, 77,206,223,162,145, 23,173,252, 48,109,212,193,234, 7, + 75, 88, 84, 32,152,219,225,107,144,135, 12, 50,164, 54,127,181, 10, 57,105, 18,148,218, 61,157,243,102,142,108,148,199,186,177, +225,172,157,127, 86,186, 3, 88, 99,213,217,204, 52,106,231,114,166,110, 52, 99,200, 75,106, 12,187, 60,105,227,197,238,238,105, +166, 5, 95, 53,243,126, 6,138,162,116,244,171,112,134,139,128,142, 13, 13,158, 44, 42, 96,252, 77,197, 37, 7,219, 81,217,204, +181,133, 13,193, 94, 55,222,219,161, 69, 19,158,113,145,152,210,151, 85,124,102,153,136, 39,128, 86, 58,145,248, 69,249,128,155, +240,223,191,204,205,215,183,229,168,106,114,238, 51,195, 14,152,122,152,209,206,208, 73,196, 97, 79,217, 96,253,222, 42,117,250, + 32,218,191,238,100, 87, 22,134, 63, 48, 81,159,146, 93,129, 44,141, 92,225,205,146, 46,243, 26,168,217,182, 77,220,114,245,241, +166, 41,152,129,158,129,235,194, 76, 9,155, 21,182,136,199, 85,193,106,122, 1,233, 73,221,180, 16,189,192,247,226,176, 11,250, +246,216, 52, 88, 35, 45,247,249, 14,129,128,124, 96,250, 28, 87,114,159,152,133, 99,144,235, 12,216, 7,235,178, 68,141,202, 26, + 37, 75, 11,123, 38,129, 51, 13,240,163,141,144, 74,173,102,151, 46,168, 20,214,138,248,122, 77,220, 36,197,102,247,240,147,238, + 59, 56, 9, 45,103,180, 95,131, 65, 81, 43,117,101, 66,253,124,236, 63, 36,118, 64, 12, 35,169,163, 33, 14,248,211,147, 5,145, +244, 28,167, 64, 44,167,159,153,163, 89,100,188,239,153, 62, 35, 84,118,120,254,112,177,218,136, 7, 84,126, 3,178, 24, 14,130, + 0, 20, 97, 6,220,201, 10, 86,231,216, 35,155, 88, 91,203,185,117,190, 98,136,234, 88, 2,141,209,195, 0,190, 14,149, 37,136, +152,181,219,181,250,188,183,109, 90,237, 24, 21, 8,103,232, 86, 69, 33,160,225,160,139, 53, 0,162, 13, 44,156,149, 3,157,190, +180,121, 49,115,237,146,235, 23,215, 12,245, 56,156, 51,137, 31,208, 0,109,133,209, 24,192,113,226,251, 27,129,208,180, 17,234, + 70, 86,153, 34, 85,126, 6, 5,128,102, 96,133,136,143,202, 24,236, 1,142,133,232, 75,102, 9, 12,217, 20,122, 78, 92,143,198, + 76, 48,222, 94,204,229,155,231,235,178,185, 58,160,118, 60,110, 18,137, 15, 3, 10, 59, 42, 38, 34,132,164, 11, 92,254,237,141, + 20, 74, 6,122,112, 66,221,203,104,168, 81,106, 85, 52,168,127, 61, 56,122,141,238,245,243,251,122,152,111,200,179, 39, 79,228, +183,127,248, 3,147, 90, 88,153, 66,128,104,225,213,119,226, 12,156,188,176,245, 7, 83, 25, 28,240, 19, 26,121,152,197,115,150, +218,104,175,250, 8, 56, 92,145,171, 94,104, 80,191, 37,175, 31, 35,149,247, 39,231,178,181,186, 34,207, 30,237,203,205,237, 21, + 71, 72, 72,238, 86, 6, 45,206,118, 81,245,125,254,100, 75,254,248,242,144,154, 1,122,234,105,160, 6,237,204,146,227, 69,176, +195,117,113,172,200, 11, 31,147,223, 93,200,254,214, 6, 41,135,216,139,151,163,137,117, 88,201,142,169, 41, 79,220,131, 38, 65, +106, 54,204,157, 88,175,109, 92,153,166,185,203, 92, 71,109,211, 2, 0, 90, 27, 9,201,235,195, 11, 38,205,187, 27,171,242,244, +201, 83,142,107,138,217,141,124,254,104,149,252,236, 1,109,141, 99,118,142, 94,125, 56,147, 15,167,151,220,103,104,225, 99,111, +226,103,129,180,159,107, 85,187,234,231, 80, 68,131,153,146,116,186,205,181, 30, 13, 92, 56,158,165, 31,121, 70, 11,212,203,155, +123,121,182,191, 65, 71,181, 31, 62,220, 80, 77,238,126,114,165,251,235,158,103, 31, 52, 11,160,175, 31, 10,196,235,137, 9,101, +225,108, 89,213, 53,177,177,177, 41,111,222,126,207,206, 31,233,114, 29, 13,222, 39, 23,122, 86,245,228,243,199, 43,212,126,128, + 9, 16, 70, 59,207,182, 51,121,119, 58,209,100, 97, 69,175,181, 43, 23,250,140,191,122,113, 32,255,252,199, 31,245,126,198,198, + 50,161, 19,100, 42,191,127,125, 37,191,248,108, 93,254,159,223,126,208,234, 61,150, 59,173,216,103,181,233,216, 99,140, 24,233, +254, 4, 48, 21,197,235, 84,223,247,245,205,200, 70,200,238, 8, 26,209,165,180,205,223, 5, 49, 34,116,189, 16,240, 65,131, 78, + 67,240,180,128,217,216,219, 54,155, 39,167, 7,113,193,189,131,185, 71, 64,163,199, 77,221,103,213,164, 68, 15,252,245,208,221, +157,206,141, 87,139, 3, 14, 63, 97,102, 37, 22,144, 66, 43, 60, 84, 72, 68,215,215,134,171, 14, 29,227,166,237,250,177, 25, 71, +252, 48, 75, 75,146,170, 1,209,240, 96, 46, 74,111,197,155, 82, 89, 30,236, 56, 37,204, 96,140,219,222, 40,199, 1,236,214,178, +224, 18, 84,172,194,129, 31,185,153, 13, 14,118,204,117,113, 16, 67,227,215,126,222,187, 12, 28, 31,180,152,113,227, 26,144, 61, + 38,206,153,175,220,148, 33,112, 14, 3,168, 7, 7, 28,218,164, 5, 71, 23, 6, 88, 65, 22,191, 54, 52,183,174,220, 85,227,236, +160,178, 11,225,172,155,170,110, 73,163,139,143,121,125,233, 98, 55, 20,125,161,205,109,139,139, 34,241,185, 36,130, 5,173,109, + 83,107,223, 85, 14,126,203,221, 5,139,115,207,133,181,252,150,243,154, 7, 12,252,136,165,178, 76,176,118,128,153,205,103,187, +246,220, 29, 7,128, 13,141, 57, 20,208,154,144,225,133,131, 17,104, 66, 65, 96,168, 49,114,201,210, 6,225,142,236, 22, 27,105, +208,181,185, 46,174, 34,163,112, 79,218,116, 79, 98,119, 61,194,156,113, 95, 15, 73,188, 51, 8, 65, 0, 69, 75,101,180,202, 18, + 65,104,178,195,113, 43,113, 29,132,144, 52, 26, 56,179, 96, 50, 19,236,126,131,154, 97, 96, 16, 4,140, 68,240, 5, 8, 88,131, + 86, 22, 68,141, 98,179,221, 45, 13,145, 94, 37,118,120,145,163, 75,241, 25, 3,233,132,125,210,166,189,170,238,143, 74, 15, 30, +173, 94,193, 25,134, 88, 30,120,219,112, 6, 3,117, 10,159,133, 86,173, 85,169,169,179, 43,172,117,142,125, 85, 64,239, 59, 50, +106, 82, 74,190,185, 81, 61, 97, 66, 97,200,239,220,196, 65,144,144, 57,141, 71, 92, 7,222, 44, 37,219,102,102,164, 63,159, 45, + 12,204,138,138, 34,243,118, 63,219,168,154, 56, 76,167,137, 85,210,173,132, 54,164,238,157,204, 63,207, 92,249, 12, 73, 64, 90, +196,166,217, 30, 27, 34, 29,159,215, 78,117, 47,184,204, 39,214,211,128,239,206,168, 77, 45,221,227,152,231, 81,143,162,142,156, +205, 80,176,117,140,238,197,220,165,160,241, 57, 24,143, 1,181, 13, 31,239, 25, 43, 85,195,155, 88, 7, 79,184,174,197,229,130, +131,181,111,208, 87, 32, 18,159, 74,129,149, 43, 30,214,141,167, 0, 61,194, 59,157, 70, 91, 33,114,206,243, 4, 21,117,108, 78, +114,103,119, 37,117,199, 55, 53, 64, 28, 93, 36,108,175, 19,231, 34,134, 77, 64,146,145, 21,176, 2,142,205,195, 66,159, 41, 42, + 62,140, 2,232,196, 72,175, 10,215, 96,192,123, 43, 52, 88,246, 68, 46,174,110,101,253,249, 35,121,250,248, 64,126,124,243,150, +192, 37, 52,136, 17, 96,123,154, 96, 21,142,204,159, 57,131,130,216,137,101,193,245,204,132, 36,243,209, 91, 93, 57,163,166,250, + 8, 28,107,214,196, 0, 91,238,239,238,234, 97,127,175,129, 13, 46, 94,183, 12,238,159, 61,217,214,231, 57,145,239, 94,159,201, + 79, 63,217,225,250, 66,151,225,103, 63, 17,249,254,221, 49,199, 42, 49, 11, 52, 61,103,122,122,255,247,115,163,123,214,117,147, + 40,181,108,105,153,195,157,190,195,115, 13,228, 28,145,192, 2, 86,131, 60,196, 87,144,120,172, 14, 76,197, 19,127,144,212, 86, + 48,213,154,116,244,181, 26, 47,103,166,238, 73, 65,174, 50,225, 89, 13, 32, 26,206, 6, 88,186, 30, 94,142,229,229,251, 19,217, + 95,164,242,233,243,199,178,243,233, 39,178,191,217,150,186,208,235,169,230,114,121,121, 37,175,143,175,152,128,238,239,110,179, + 35,240, 83,173,166, 57, 10, 21,147, 44, 7, 56, 17,230, 58, 0,159, 65,191, 30, 35, 14, 36,218,167,151, 37,101,159, 49,227,135, +206, 61,206,100, 60,235,155,219,137,222,159,113,219, 87, 86,118,229, 74,147, 59, 96, 31,144, 0,225,236, 66, 59,124,123, 53,145, + 75, 13,230, 24, 19,173,245,108,228, 82, 98,127,220,221, 73,212, 26,235,250,235, 72,181,156, 49,168,143, 64,243,211,123,252,234, +233,129,252,241,205, 7,249,230,197, 19, 57,187, 56,165,202,220,176,187, 37,122,185,242,207,223, 30,202, 47,191,218, 99,247,102, + 89,116,228, 23, 95, 61,147,255,242,171,111, 77, 21,143, 82,188,145,156, 95,223,235,191,111, 17, 43, 3,212,254, 96, 89, 49,201, +131, 83, 95,233, 66, 69,137,251,126, 44, 26, 81,184,154, 10,136,144,240,197,217, 0,111, 19,244,115,202,202, 48, 56, 88, 51,159, +110,111, 97,173,167,252, 37,160, 94,133, 74, 80, 18,249, 11,111,245,204,209,219, 4,142,161,133,217,232,160,219,188, 24, 6, 28, +209, 71,128, 40,105,170,164,220, 53,220, 99,111, 77,155, 96, 5,254, 63,117,245, 47, 86, 6,249,178,113, 16, 10,106,107, 15, 51, +248,160,235,109, 24,234,200,171,167,200,145,209, 1,169,108, 25,176,201, 79,182, 28,209,141,131, 8, 52,155,196,197, 71, 8, 86, + 41,171,230,231,217, 38,118,208, 87,202,172,115,201, 22, 46, 15, 91, 71, 63, 47,125,236,144,101,137,115,233,147,166,117,159,250, + 33, 88, 16,168,100, 34,251, 12, 40,113,213,180, 0,131,116,110, 48,185, 15, 85, 94,213,104,233,151, 4,184,208,190,207,233, 97, + 4,157,197,174, 39,237,207,141,250,191,147, 57, 15,253,110,219,228, 4, 91, 46,242,131, 67, 26,247,137,175,227, 26,103,164, 53, + 68, 77, 91,138, 10,112, 64,152,235, 13, 99,230,107,188,207,136,244,135,198,255,125,185,244, 89,186,139,236,232,155,131, 65, 4, + 52,188, 81,129, 96, 49, 21,142,188, 12, 86,176,104,195,247,187,165,235,149,187,243,148,183, 73,227,248, 97,206,143,182,239,132, + 85,145,241, 82,145,149,147, 58,227, 99, 24,182,146,166, 51, 79,142, 18,163, 25,214, 48,238, 17, 51, 19,234,119, 40,129, 25,249, +220,252,242,122, 76, 94, 44,238,123,119,107,141, 89,123,225,221,141,196,129,130, 86,117,185, 36,110,149,187,174,186,139,207,184, +132, 49, 71, 23, 1,232,231, 51,194, 16, 12,130,236,104,220, 88,214, 22, 38, 81,153,165,205,129, 75, 33, 35, 71, 9,167,177,109, + 62,104, 77,107,186, 67, 13,110, 4, 35,172,117, 84,133,121, 49,102,160,142, 35,163,192, 81,202, 84,147, 82,136, 84, 44,150, 38, +191,153,167,137, 95,155, 37, 92, 88,131,150,104,120, 87, 64, 15,101,220, 31, 42, 41, 92, 11,218,163, 76, 50, 29, 17, 24,176,155, +164,150,149, 57,147, 29,116, 80,170, 32,191,171,223,129,106, 13,179,209, 52,174, 27,243,162,136, 18,183, 25,131,177,209,135,162, + 6,152,200,241, 77, 98,123,238,114, 52,101,203, 30,107, 16, 8,239,123, 89, 56, 24,205,130,107, 71, 15,167,182,158, 35, 19, 10, + 99, 20, 12,136, 25, 43,224,146, 93, 3, 92, 29,214, 13,101,136, 61, 17, 54, 64,173,129,114, 3,107,162,240, 25,107,176,249,205, + 93,188,133,162, 83,113,226, 46,142,214, 50,206,157,195, 31,244,220,137, 18, 79, 44,240,176, 42,106,155,232, 19, 90,226,180,140, +213,123, 60,186, 25,202,215, 47, 6,220, 99, 88,247, 27,171,109,174, 37, 88,174,226, 61, 99,126, 25,146, 66, 10,160,232,187, 96, +231,101, 56,228,125,223,142,140, 77,131,251, 64,155,121,103,163, 35,197, 36, 34, 90, 27,231,232,103, 26,220,255,237,207, 63,242, +220,195,129, 13,237,244,249,210,140,173,208,181, 1, 74, 25, 29, 28,211,226,143,154,238, 91,163,193,128, 46, 25, 76,108,138,224, +172, 88, 24,213, 83,255, 96,117, 56,208,251, 30,203,185, 6,192, 95,254,236,107,234,134,207,242, 29,218,126,162,203,121,122, 61, +145, 71,187,107,252,253, 40, 66,126,249,245,115,249,253,183, 63,234,181, 15,220,198,185,144,161, 75,125,227, 8,135,147, 94, 94, +152, 14,200,189, 6,150,174,159,109,232,206, 65,139, 28,232,248, 79, 31,237,147,162,120, 1,209,160, 90,147,235,126,139, 66, 50, +152,223,231,238,222,184,156,143,117,189,245, 89,209,210,165, 17,231,118,214,213, 68, 54,231, 58, 5,192, 26,106,137,159, 29,172, +201, 15,199,183,242,199,239,103,242,236,209,174,110,188,103,178,208,119,243,187,223,252, 87, 61,223, 70,148, 92,229,136, 5,154, + 7,186,142,199,119, 83, 82, 79,231,212, 49, 40,201,160,194,251, 4,206, 35,141,221,127, 3,231,114, 93,241,115,210,216, 58,155, + 92, 23,104,197, 67,185, 77,147,205,145, 76,101,176,122,224,231,102,194,142, 87,234,166, 57,227,121,193,179, 24,235,248,108, 84, +104,113, 98,157, 69, 36, 56,211,197,145,108,111,108,144,142,119, 7,109,134,114, 65,170,219, 31,222, 28,233, 62,235,201,135,203, + 91,118,119,112, 94,156,220, 76,249,236, 1, 92, 60,187,205,229,197,254,138,198,192, 27,217, 90,217,148,191,255,249,115,249,167, + 63,188,211, 4,194,146, 9,124,198,187,139,169, 60,222,234,201,159,222,223,114,236,122,175,215, 1,149,185,170,156,115,204,195, + 36,187, 54,172,193,157, 38,114, 16, 19, 98,119, 21, 54,183, 89,206,243, 27,251,220, 40,112, 53, 41,182,156,169, 39,222, 38,103, + 21,142, 23, 18, 85,141, 14,119,228,142, 96, 1,108,148,184,122, 88,144, 5, 12,173,244, 80, 57,199,222,130, 14, 85, 56,121,224, +185,123,125,121,123,155,230, 25, 46,134,130, 0, 65,216,190, 87, 78, 46,148,222,100, 20,117,211,170,183, 54, 27,231,248,206,135, + 10,200,244, 0,226,227,156,189,172,124, 35,183,205,172, 3,217,153,102,217,137, 27,101, 76,102,243, 70,174, 51, 76,152,153,105, + 70,168, 98,171,166,115, 80, 4,190, 31, 2,177,235,210,195,210, 49,241,170, 18, 73,132, 56,104, 47,119, 58, 86, 64,251, 51, 73, +161,162,144,105, 20,151, 30, 52,250,208,241, 46,140,210,130, 3,121, 62, 95,186, 8, 68,198,195, 6,135,119, 65, 5,165,148, 7, + 43,146,131,118,102,193,138,153,177,216, 12, 12,246,183, 56,180, 57,123,243,249, 43,244,142,225,190,133, 23, 14, 74, 72, 96, 13, + 12,252,123, 47, 97,188,224,230, 27, 65, 21, 16, 93, 2, 84, 77, 1, 25,156, 38, 54,191,193,225,120,117, 51,230,215,240,236, 64, +123,137, 56,179,204,168, 97, 29,148,243, 8,120,171,172,170,192, 6,103,119,129,252,249,210, 16,189,101,222, 36, 48,104,187,178, +229, 71,106,213,130,153,118,236, 24, 3, 28,220, 56,248,241, 57, 97,188,146,166,118,125, 52, 42,193, 6, 70,144,208,195,247,228, +226,214,244,241, 61,224, 66,106,118,198, 25,182,190, 23, 61,100,145,120,220,142,151,205,172, 27,135, 2,127, 39, 15,173,154,238, + 86,165,171,222,133,121, 98, 86,197,205,232, 69,124, 68,129,123, 98,130,228, 9, 86, 21,214,155, 35,255,115,199,112,224,152,165, + 31,179,115,220, 43, 90,222, 86,114, 57, 6, 8, 71,159, 9,172, 73, 23, 5,131, 22,171,139,133,249, 40, 4, 61,248,202,231,101, +148,148, 45, 2, 69, 48,162, 42, 85, 84,219,236, 18, 51,202, 44, 72,181, 82, 94, 45,162, 96, 74,226,221,151,224,216,135,119,130, + 96,143,223, 11, 51,152,249,204,254, 12,215,134,177, 86,187,229,150,159, 18,177, 83,146,210,211,160,101, 65, 29,227,130, 22, 58, + 34,166,223, 15, 4,255,210,189,209,115,111, 23,145,190, 23,133,214, 55,232,173, 17,147, 60, 94, 11, 0,131,208,125,143, 51,182, + 39, 73, 28,152,207,205, 52,166,212,235,237, 98,190, 94, 53,138,132, 84, 71,203,132,129,214, 90,237, 37,219,239, 28,117, 84,226, + 74,143, 1,224,106,193, 21, 29,159,118,214,230, 63,177,175,195, 56,171,246, 36,179,176, 94,191,143, 22, 18, 90, 90, 6, 81, 13, +130,113, 35,227,185, 3, 29,253,250, 98, 33,127,245, 89,204, 10, 28,136,106,236, 23,172,239,235,234,142,109, 92,164, 73, 24, 97, + 44, 32,179, 59,128,118,184,141, 18, 48,166,192, 45, 97, 30,203,247, 84, 71, 78,135, 45,100,109,109,131,123, 26,215,247,197, 39, + 47,228,251,215,239,141, 81, 18, 91,119, 11,225,103,198, 10,191,110,146,123, 4,125,112,207, 65, 9,246,129, 16, 27, 39,208,233, +136,189,179, 88, 2, 95, 3,126, 55,254, 44,170,104,198, 52, 35, 0, 48,146,151, 31, 78, 53,177,104,113,175,237,108,111,203,233, +217,145, 6,198,165,108,175,229, 90, 81, 78,137,192,127,246,120,151,227,156,243,171,177, 92,141, 81, 0, 85,114,116,117,175,207, +164,242, 81,159, 21, 59,196,107,100,102,236, 2,241,151, 1,220,193,244,185,192, 12,229,183, 47,223,112,207,236,108,172,145, 83, +159, 3,244,138,238, 1, 71, 44,186,175,250, 6,124,156, 64, 45,175,219, 49,249, 86, 92, 59,198, 88, 73,212, 8,122,161, 91,131, +164,231,235, 39, 67,249,254,172,166,136,205,191,253,254, 15, 50, 31, 29,233,235, 65, 18, 35,172,150,137,122, 7,229, 88,207,139, +223,189, 60,228, 62, 40,157,238,140,115,202, 52, 52,133, 9, 90, 24, 63,146,241,145,233, 57, 15, 15,123,125, 30, 3, 77,104,176, +116,201,204,138,161, 93,209,225,158,122,188,179, 46, 63,255,116,151,156,119, 8,240,172,116, 0,152, 45,228,199,195, 43, 57,209, +132, 8, 50,177, 40,126,114, 58,209,197,156,211, 35,161, 74,251,125,254,217,139,157, 29,121,171,207, 15,231, 42,206,234,189,173, + 77,198,144, 15,167,231,156,121,255, 70,223,215,179,157,190,140,110,111,229, 40, 41, 8,198,187,214,100,248,249,193, 14,187, 22, +183,122, 62,159, 76,112, 6,198,114,125,191, 32,122,254,215,127, 62,147, 74,147,106,250,199,243, 28, 45, 26, 21, 76, 90, 68,235, +123,129, 32, 13,192,158,145,171,116, 70,220,139, 54,182,187,212,243,154,163,113, 61, 43, 96, 15,156, 6,183,179,198, 67,193, 3, +130, 61, 44, 83,153, 99,224,151,168,225, 3,199,113,220, 4,226, 0,218, 98, 11, 51, 88, 96,122, 75, 61,242,246, 89, 0,103,133, + 23,144, 59,165, 45,204, 21,195,161,106, 42,105, 6,192, 11,109, 83, 86, 10,177,233, 69, 86,238, 73, 30,248,230,129, 10, 55, 39, +253,203, 90, 87, 0,215,228, 14,182, 64, 32,142,189,210,197,127,195,213,135, 51,216,123,171,174,113, 32,209, 74, 86, 3, 3,179, + 64, 7, 70, 49,200, 38,214, 74,198,103, 62,218,221, 98,198, 45, 94,161, 6, 16, 21, 22,186,161,181,197,192, 11,174,114, 71, 84, +172, 3,213, 16, 20,136, 34,102, 22,159, 49,243, 68,144, 67,181,179,185, 62, 52, 33, 27, 87,117,226, 4, 48, 50,137, 75,113, 22, + 2,130, 8, 36, 54,151, 75,171,188, 48, 31, 95, 93, 29, 90, 98,130,214,216,120,226, 92,117,104, 42,153, 31, 54,238, 9,128, 54, + 75,186,140,222,196, 22,190,155,122,224,154,208, 78,135,105,129, 33,162, 77, 47,250,158, 74, 70, 54, 83, 71, 27, 19,179,197,155, +209, 61,171, 11,163, 8, 45,104, 63, 90,123, 98,196, 36, 1,155,121, 6,153,213,146,137, 16,231,201, 56, 20,122, 45,107, 83,226, + 16, 92, 88, 53,128,224,182,161,155, 13,207, 10,198, 41,104,181,146,163,188, 92, 50,136, 6,229,183, 96, 28,131,247,136, 10, 31, +223,219,120,227,224, 0,238,162,253,132,108,125, 73,161, 11,106, 93,107, 85,129, 63,195,181, 4, 15,238,194,241, 17, 12,160, 64, +205, 23,126, 40,235,245,176,211, 48,236,152,116,103,110, 85, 19, 54, 20, 44, 82, 33,206, 2,121, 81, 45, 81,141,181,144,151,158, + 8, 10,219,117,164, 36,210, 67, 60,243, 36, 80, 15,126,125,239,243,210, 90,222,104,119,190, 63,187, 53,218, 90,167, 75,140, 3, + 1,129, 30,128,136,234,119,124, 3,116,182,215,225, 54,213,141, 41, 89, 59,209,207, 2,127, 58, 14,207, 81,239, 21, 30,205, 27, +171,125, 86,240,120,102,104, 47,226,231,233, 22,231,186, 10,180, 26,214,103, 5, 28, 12,100,106, 43, 31, 85, 1, 4,135,185, 35, + 90,199,248,153,245,181, 46, 52,174, 88, 57, 7, 3,161, 89, 94, 83,125, 14, 7, 52,245,224,227,121, 83, 49,206,137, 34, 47, 56, + 98, 0,152, 15,114,180,151,247, 54,147, 39,168,176,211,163,240, 7,174, 11,115,240,233,124,198,207,193,225,109,128, 89,173, 44, + 52, 8, 46, 40,237,154, 55, 26,237,216,150,216,111, 49,149,214, 34, 2, 67,107,135,116,134, 89, 63, 71, 54, 11, 75,154, 51,183, + 10,230, 22,119,117, 61,124,198,162, 54, 65,161,216,233,142, 38, 65, 93,187, 86,133,153, 30, 49, 8,195, 65, 79, 15,102, 84,179, +239, 79,111,245, 0,223,144,189,157, 13,226, 18, 80, 21,173,173, 12,100,125,125, 85,147,161, 25,185,197,120,199,196, 16,136,119, +223,240,126, 53,192,161, 98, 71,151, 1,207,175,160, 35,158, 41,177,245,250,185, 28,106, 80,253,119, 63,253, 82,215,254,154, 6, +217, 45, 13,178,103, 76,126,104,217, 75, 89,220,146, 73, 31,196,192,177,175,193, 40, 92,208,120,166,114,255,248, 68, 38,112, 47, +119,255,130,168, 29, 83, 55, 28, 78, 94, 8,230,115,184, 43,234,131, 3,149,169,204,151, 84, 52, 92,230, 17,157,212, 46,110,167, + 84, 83, 3, 40,243,242, 42,213,251,105, 17,168,134, 66, 8, 9, 1,198, 85,169, 22, 47, 51,125,206, 49,207, 64,173,126,151,173, + 6, 72,139, 74, 15,231, 40, 90,218,229, 80, 63, 67, 3,248,217,245,141,108,234,126, 5,144,116, 52, 53,211, 22,180,144,209,121, +186,188,185,225,117, 98,252,130, 78, 12,248,230,109,173,202,139,184, 71,209, 29,130,110, 49, 90, 64,229,168, 39, 19,214, 48,170, +230,227,235, 57,169,164,127,243,147,167,242,226,233, 99,253,224,223,200, 31, 79,167, 76, 36, 80,152, 28, 68, 54,234, 10, 64, 60, +128, 31, 33,181, 26,187, 37, 48, 52,114, 58,236, 38, 89,231,182, 71, 74, 94,205,241, 19,186, 77,248, 62, 36,201,144,223, 5, 69, + 17, 96, 84, 19, 78, 67, 66, 93,107,193, 50,145,211,155,156,251,253,103,159,172,211,102, 21,180,182,246,243, 68,131,241,138, 62, +219,150,252,111,191,122,163,123, 76,223, 57,129,174,133,169,185,101, 48, 95, 58,149, 36,123,170,159, 85,201,150,174,149,215, 71, +199, 44,152,112,221,192, 31,100,250,254,158,237,109,145, 34,141,103,133,100,167,136, 82,217,218, 72,228,228,116, 46, 7, 91,171, + 60, 19,240,187,113,253, 39,231, 26,140, 95,172,241,243, 47,238,150, 28, 83, 32,121,198,216, 39,176, 18, 82,183, 3,159, 85,118, +206, 98, 12,105, 35, 96,196,169, 54, 11, 81,140, 69,168,116,168, 63,135,164, 33,109,185, 59, 91,224, 17, 7, 78,121,229,102, 45, +117,224,141, 59, 82, 61, 84,246,213, 71, 58, 95, 1,157, 26,137, 5,217,216,171,234, 0, 66, 11, 84, 57, 34,212,189,125,242, 96, +222, 82, 62,136,141,200, 95,206,243, 65,185,192, 5, 7, 79,108, 67, 6, 39,141,164, 44, 51,240,172,245, 0, 32,171, 42,111,141, + 10, 41, 46,104, 23,226,176,203,220,182,207, 84,168, 28, 21, 9, 41,194,194,228, 13, 73,159, 90,154,202, 28, 50, 84,250, 28,235, +223,216,240, 56,184, 87,117,145, 4,161,149, 0,238, 50,132,166,181,213, 17, 24, 81, 5,116,124,236, 64, 60,129,190, 0,124, 29, +159, 7, 47,106,203,182,160,112,183,176, 5, 0, 37, 47, 88,208,234,239,203,231, 57, 69, 61, 2,112,170, 96,139,200, 42, 9, 48, + 11,240, 79,163, 29, 70, 4,212,225,144, 65, 32,132,186, 21, 2, 4, 5, 74,124, 22, 7, 32,153, 45, 98, 3,190, 96, 4,177,169, + 11, 12, 47, 92,146,184, 65, 16,207, 22, 70,151,194,108,202,128,141,102,187, 59,163,148,164, 6, 41,253,217,171, 91, 67, 79, 99, +133,181,171,140,207, 59,128, 30,131,228, 47,223,169,254, 28, 90,115,188,102,108,164, 97,159,223, 3, 43,221,218, 13,104,160,216, +149, 46,173, 10, 20,151,203,196,102,180,153,116,219, 4,118, 42,147,231,109,145, 19, 60,215,223, 57,225,181,208, 74, 51, 53,220, + 68,226,250,253, 56, 20, 97, 17, 58, 37,119,181,144,241,233,149,108,111,172,104, 38,190,209,160,236,111,239,238,153,200,193, 8, + 5, 75,241,236,242,134, 64, 47, 84,204, 1,173,143, 74, 27,193,197, 0,118,210,128, 69,151,185,185,124,149,254,188,136,251,136, + 31, 16,215, 45,162,214, 45,233,108, 71, 22, 60, 87,122,134,164, 46, 64, 25,210,103,211,194, 33, 19,215,180,236, 44,181, 52,205, +244,158,102,243,186,209, 76, 96, 18, 25, 89,130, 9,159,239,151,103,247, 20, 64,225,239,111, 25,159, 29,159, 13,100,107, 26,181, +108,148,197, 96,109, 92, 91, 38,204,250, 81,119, 83,179,217,164,129,196,104, 46, 90,172,241, 48,188,155,131,123,188,100,213, 93, +235,123,189,158, 85,114,122, 87,176,146, 66,117, 89,148,161,109,109, 29, 21, 4,220,124,225,114,197,169, 9,166,148, 62,207, 35, + 58, 60,180,229,171,208,233, 64,112,155, 91,231, 78, 12,159, 80,214,166,127, 64, 74,164,171, 63,218,231,213, 78, 3,179,103,103, +246,190, 86,125, 99, 86, 44,153, 56, 38,166,160, 10, 29, 41,125,172,236, 11, 51,191,128,180,107,111,192,142, 77,144,243,101,130, +164, 73,132,189,136,218,153, 32,174, 66,136,214,112, 33,238, 98,104,218, 25,224, 85,175, 13, 87,216,254, 60,190, 41,228,139, 39, +125,121,151, 24,239,159,110,130, 75,204, 96,167,228, 75, 67,232, 5, 29, 13, 60, 87,118,140,106, 27,137,193, 27, 5,215,114, 63, + 27, 81, 88,103,122, 15, 1,171,133, 6,144, 37, 1,132,176,200,156, 79,239,229,233,193, 35,185,184,188,176,115, 39, 55,243,150, +118, 59,114,198, 75,105,163, 64, 80,212,150, 53,245,245, 77,118, 35,162,220,105, 93, 61, 40,118,150,110, 74, 4, 16, 98, 78,165, +195,123,121,118,176, 79,157,111, 0, 49,183,233, 7, 63,144,255,247,119,127,150,190, 91,232,190, 62, 46,229,151,235,123,148, 72, + 69,149,184,161,235,255,101, 9,140, 64, 46,187,235,125, 41,150,125, 57,190, 28,155, 3,163, 7,199,202,245,242,159,104,176,186, +156,220,243,153,219,185,159,200,158, 38, 40,245,197, 5,139, 26,208,186,206,198, 51,217,233, 71,174,120,153,112,109, 16,120,153, +160, 83, 53,167,203, 93, 94,216,216,135,178, 4,122, 70, 3, 65,142, 61, 7, 96,217,245,164,144, 71,213,149, 44,170,132,180,199, +255,248,119,127, 69,166, 4, 18,237,181, 65,135, 22,170,189, 14, 60,222,103,242,250,195,169,158,113, 51,214,230, 89,106,184, 23, +210, 73,211,184,241,161,192,251, 5, 70,103,158,215, 76,222,128,115,194, 62,130,248, 11,206,239,121, 81,211,231, 29,123, 13, 1, +255, 86,171,217, 63,190, 58,151,255,251,119,239, 52, 81, 26,177, 10, 38,238, 73,239,255,169, 6,118,140,152, 18,103,192,192, 34, +186,213, 45,104,213,250,100,107, 69,214, 86,215,101, 86,198, 60,115,118,215, 55,184,166,126,252,112,204, 51,255,241,206, 22, 93, + 4, 91,173,142,238,237,174, 60,173,161,137,209,149,237,213,140,128,191,243,139,130,221,211,205,149,185,188, 59, 31,201,163,205, +129,220, 78, 11,249,247,223, 28,200,255,254,155, 67, 38,192,100, 46,181, 0, 62, 70, 52,181, 81, 47,214, 52, 44,110,113,157,176, +140, 6,157, 13,200,119, 60, 47,104,210,227,158, 81,120, 98, 63, 1, 24,156,236,239,238,253,175,161, 50,162,176,132,219, 34, 18, + 16,151, 88, 27, 52,108,146,208,110,109,230,217,141,218, 88,237,206, 77,115,167,131, 85, 13,106, 53,245, 12, 52, 73,157,134, 4, +218, 85, 28, 53,243,186,192,101, 7,146, 54,203, 82, 55,107, 49, 35, 1, 90, 21,102, 45, 63, 60,157,171,237,255, 78,190, 34, 90, +199,165,169,241,216,220,223,149,226,150,139, 70,125, 11,135,108,176,120,109,185, 85,171,153,165,164,244,135, 70, 75,165,114, 3, +137,144, 80,164, 78, 87,163,141, 34, 21,164,210, 70,115, 91,124,182, 31,126, 15, 15, 25,127, 6,161, 85, 14,254,238,245,232,142, + 25, 87,184,142,216, 91,222,184, 70, 84,222,136,108, 8, 92, 1, 64,199, 64,133,197, 9,190,243,202,192,109, 37,133,149, 7, 81, +144, 94,181,155,228,102,201,138,162, 36,162,218, 0,109,225,122,144,100,116,218,173,134, 61, 0, 52,124, 72,151,128,220,165, 34, + 22, 54,172,119, 2, 80, 41,131, 31, 28,240, 5,248, 27,200,243, 65,191,195,207, 66,133, 22,128,131,129, 95,110,215,251, 48, 59, + 55, 92,130,153,137,176, 77, 77, 90, 77,193, 36, 10, 85,106,230,212, 46,227,255, 91, 66,199, 57,106, 64,152, 75,160,147,197,141, + 95, 64,224,103,162,130,223,213, 96, 13,138, 27,222, 5, 90,132,224,131, 99,108, 48, 71,130,180,204, 77,240, 37, 65,203,116,194, +231,135,192,139,128,142, 77,242,116,127,155,215,132, 4, 13, 7, 20,170,123, 4,201,156, 1,211, 3,186,183,200, 73,191, 1,208, +172,149, 54, 14,132,179,185,233,111,119, 90,230,164,135, 32, 79, 11,202,218,180, 22, 76, 60,197, 14, 69,220, 31, 84,212,144, 88, +173,246, 59, 6,158, 3,255, 62,179, 68,240,222, 15, 15, 92, 51,218,119, 4, 25, 58, 26, 31, 7, 55,156,225,240,123,112,141,160, + 17,233,202,224,129,143,202,253, 78,191, 54,209,138,232,126,137, 25, 96,201,170,239, 12,202, 97,147,133, 68, 26,128, 48, 42,163, +242,214,162, 36,189, 8, 14,109,198,193, 55,158, 51, 2,111, 69,181, 58, 91,171, 11,223,243,102, 7, 16,121, 85,180,228,122,102, +219,221,141,120, 16,244,197,129,107, 68,229,122,226, 26, 92,243,208,102,165,222, 64,102,190,214, 91,235,219, 76,210, 72,211,195, +232, 32, 53,229,185,118,171,195,117,139,125,218,239, 14,204,218,151,104,245,148,221,145,218,117, 35,140,139,107,250, 23,166,129, + 81,242,124,192,172,158,246,186,181,153,122, 4, 81,170,208,190,199,158,221, 88, 93,117, 12, 69,225, 14, 94,166,151,145,186, 5, +111, 95,171,108, 10,173, 80,144,170,150,131,149, 72,190,125,123, 41,231, 55,119,236,174, 28, 95,140,137, 71,185,153,204,137,220, + 30,209, 63, 30, 7,250,140,123,181, 36,186, 59, 98,235,118,101, 96, 2, 55,176, 0,109,235,154, 41,200,113, 31, 16, 19,210,233, + 89, 98,141,234,250,232,226,198,193,141, 70, 33, 68, 11,118,186, 40, 89, 57, 46,156,189, 17, 40, 75, 16,169, 49,222,117,236,251, +176,199,110, 88, 80,245,196, 62,159,211,141, 48,163, 8, 13,102,168,159, 62,222,147,161, 6,237,227,211, 27,118,181, 40, 12,165, +207, 15,157,157, 96,153,138,231,136, 57, 62, 70, 10,149, 75, 53, 79, 73,249, 43, 92,213, 79,154, 46, 9,214,102,228, 45, 95, 2, +120, 53,200,222, 99,157,234,181,127,243,124,151,137, 6,206, 84,220, 43,146, 59,235,158,153,172,120,175,157,152, 50, 96,218,105, +222, 19,238,111,208, 31,240,153,213,197,210, 59, 66,122, 45,154,108,246, 50,116, 71, 35,249,244, 96, 77,131,210, 6, 71,139, 28, + 7, 69,226,222, 1,134,241, 64, 82, 14,139,217,159, 60,219,229, 58,195,140, 28,251, 20, 35, 45,235,154, 89,226,141, 53,132, 98, + 10,158,243,231, 87, 87,242,254,248, 66,254,244,234, 72,190,251,241,181,188,124,253, 78,254,240,231, 87,242,195,155,183,114,122, +126,174,215,191,202,202,119, 54,187,115,247, 66,155, 93, 99, 63, 33, 96,227, 76, 1, 72, 22, 35, 45,234,124,234, 30, 91,235,197, +164,170, 29,107,113,176,210,210,243,161,213,167, 92,107,225, 35, 59, 38,143, 76,132, 68, 43,248, 59,121,249,225, 82,118, 6, 34, +135, 23, 51,118, 34,186,169,129,145,159,236,174,243,172,126,115,118,199,125,242, 98,111,168,191,115, 74,173,249,160, 40, 73, 89, +115,221, 59, 56,203,151, 84, 87, 76, 57, 87, 15,194,108, 44, 60, 80,204, 76, 38, 26, 47, 86, 12,219,226,194, 70,233,176,223, 39, +240, 4,139, 26, 89, 47,162,126, 23,122,205, 45,211, 79,238,117,202,198,107,123,238, 42,103,145, 7, 92, 6, 89, 7, 74, 4,101, +186,216,171,234,196,131,112, 99,186,130,214,137, 7,162,150, 59,182, 5,199,181, 48, 27,231,129,207,122, 63,119, 87,166,204, 91, +200, 73, 83,189,211,198,213,221,213,152,193,198, 15,130, 50,104, 25, 91, 38, 31, 20,234, 50,115, 97,130,150, 96,199, 20,134,186, +108,211,180,216, 78, 41,220, 89, 10,213, 46,117,117,193, 21,205,140,246,132, 86, 46, 42,193, 53,221, 28,180, 96, 77,147,134,170, + 7,138,140, 46,183,134, 6, 24,170, 16,220,198,197,245, 45, 95,232,250,234,128,136,118,124, 30, 4, 45,112,133,231,186, 24,192, +161, 12, 92,101,180,229,205,195,190,148, 85,253,126, 44, 14,204,190,145,164,172,174,174, 88,117,177, 88, 54,115, 68,124, 6,144, +175,236,162, 68,210, 80,207,202,216, 56,237, 22,164, 23,188,214,225,112, 96,248,129, 60,111,124,155, 49,127, 94, 54,214,170,210, +128,212,194, 8, 6, 7, 2, 50,219,218, 81,225,248, 58, 14,174,202, 3,145, 57, 5,197, 30,240,221, 29, 77,223,229,148, 0, 18, +231,218, 38,238, 62, 87, 24,128,142, 99, 16,204,217,170, 37,127,231,194, 91,221,120,103,115,175,186,224, 64,214,110, 45, 77, 70, + 85, 23,103,150, 5,139, 89, 51, 33,225, 59,175,236, 48, 65,231, 96,145,207, 8,158, 89, 56,186, 31, 96, 37,108, 62,252, 51,154, +186, 9, 6, 64,101,122, 31,135,151, 35,182,164,130,220,237, 50, 55,125,229, 56,122, 0,102,210, 34,152,180,171,204,245, 18,226, + 38,152,207,231, 49, 59, 53, 72, 36,113,104,210,216,163,165,107, 26, 2, 47,192,105, 64,110,181, 48,244,127,228,215,187,160, 60, +104,161,193,120,193, 54, 39, 91,163,186, 22,239, 93, 92, 4,173,219,126,175,160,213, 25, 18, 97, 84, 76, 39,169, 57,255,165,101, +204,235,203,138,153,180,128,136,117, 67, 14, 38, 98, 49,170,215,185,161,222, 33,136,195,182,119, 66,253,103,116,192,144,172,152, +206,120, 97,179,102,253,190,161, 6, 31, 45, 39, 25,172, 56,102,200,243, 70,176, 40,165,227,150,113,255,105, 66, 2, 14,117, 43, +118,111, 7,179,170, 13,146,199,144,158,197,124, 24,123, 50,107, 27, 61,109, 4,252,134,126,254,176, 63,212, 31,208, 0,154, 22, +238,141, 46,164,216, 96,102,190,170, 7, 78,161,213,219,104, 50, 38,181, 9, 13,163,251,217,196, 20, 24, 93,106, 23, 10,105, 45, + 58,176,181, 93,216, 70,247,122, 98,106,135,173, 84, 43,147,110,143,215, 9,211, 23, 4,239,168,101, 32, 66, 28,114, 28,253, 37, +145, 35,221, 75,247, 37,136,154,174, 29,147,148,180, 98,177, 82,122,210,139,245,247, 70, 3,210,191, 84, 55,242, 78, 15,214,142, + 6, 79,204, 37,113, 48,115, 20,167,223,135,179,100,174, 73, 22,218,235,253,110,159, 29,191, 52, 93, 88,194, 95, 46,185, 79, 17, +172,230,169, 37,198,168, 84, 49,154, 72, 32,162,117, 31,203,222,206,182,124,243,213, 55,242,230,195,137,172,247, 51, 25,205, 35, +202,132,214,165, 49, 49, 40, 64,180, 48, 9, 95, 4,143, 56,213, 53,232, 76, 25,122, 50,196,145,203,178, 66, 94,116,206, 36,104, + 74,214, 81, 77,101, 59, 60,227,147,139, 43, 93,219,247, 50,154, 29,202, 55, 95, 60,149, 75, 61, 95,144, 56, 22,249, 84,190,125, +117, 34, 63,255,116,139,207, 5,120, 9, 84,235,135,122,214,193,157,238,175, 94,108,201,201,229,101, 99, 79,141,206, 79,229,163, + 82, 36, 28, 40, 36,134, 76, 84,192,218,104,241,156,220, 89, 31,202, 8,163, 48, 93,155, 63,127,190, 39, 55,250, 34,111,166, 53, + 5, 85,184,134, 18,163,183,130,224,188,152,107,240, 73, 90, 46,190,101,239, 70,243, 82,206,187,137,129,210,125,187,255,104,159, + 78,144, 87,183,119,242,234,162, 43,191,254,227,111,136,153,129, 2, 29,222, 85,225,227,138,152,123,182,146,237,141,129, 38,140, + 67, 50, 94,112,190, 76, 11,115,245, 91,186,126, 69,226, 18,216,208,237, 67,103,133, 38, 94,149, 21, 42,109, 42, 7, 62,116, 22, +201,184,161,169,143,158,135,211, 72,250,160, 18,183, 51,151,164,181,115,134, 29,149,194,232,167,149,174,219,221,141, 39,178,152, + 94,115,255,237,110,172,203,245,237,185,124,250,108, 40,154, 63, 55,174,128,143,245,204,197,186,124,253,193, 64,116,155, 27, 27, +114, 87,116,101,216,154,203,213,125, 45, 79, 54, 86,249,185, 72,202,159, 60,122, 36, 87,119, 5,147,191,133, 86,229,240,173,159, + 59, 62,135,227, 73, 77, 40,231,149, 89, 17, 35,177,195,120, 19, 94,233,184,135, 69, 30,216, 32, 17, 1,136,151,183, 35,121,126, +176,207,253, 93, 81, 31, 3,178,114, 16,141, 24, 12,120, 48,143,239, 39,132,199,103,110,194, 96,243, 63,243,123,237, 68, 93,115, +108, 99, 75, 59,227, 75, 20, 23,160, 73,220,155,187,246,224, 96, 46, 81,102, 90,130,175,221, 83,144, 33,230, 65, 81,213,117,131, +214, 13, 82,167,193,180,161,242,170,193,170,185,146, 0, 21,100,232,248,247,176, 41, 37,232,206, 47, 23,214, 49, 96,133, 23, 59, + 87,185,101,202, 91,204,110, 90,108,235, 36,238,217, 14,245,160,253,158, 25, 82, 32, 91,183, 89,120,202, 96,135,249, 54,102, 84, +108,229,234,130, 93, 95, 29, 82, 37, 10,243, 18, 86, 36,104,247,234, 75,202, 29,169, 91, 7, 75, 84,199, 32,156, 94, 92,210, 79, + 24,224, 35, 32,204, 31,239,111,145, 26,130,141, 9, 20,176, 73,232,198,204,166, 10,167, 39, 12,251, 70, 99,227, 44, 27,242,156, +186,152, 80, 37,219,102,171,216,118,159,187, 48, 74,139, 90,240, 57, 53,192,153, 85,214,102, 33, 91,186,102,120, 92,154, 53,107, +234,213, 48,229, 76, 93,114,181, 40, 12,192, 71,218, 97, 48,186, 32,178,219,146,169, 64,163, 43,203,170,233,158,240, 80,204, 43, + 62,143,202, 69,104, 10,103, 14,160, 18, 71, 82,132,224,119, 75, 14,171, 93, 31,241, 6,117,216, 60, 86,213,226,208, 49, 80, 99, +253, 23,198, 47,152, 97,154, 19,209,220,225,145, 60,229, 89,245, 96, 99, 95,107, 98, 4,215,165, 26,159, 91, 47,154,214,221,210, + 29,179,224,230,135,181,133,113, 4,178,218,173,158, 85, 7, 8,198,244, 35,240,132,114, 78,153,226,248,129,246,228, 52,161,210, +169,128, 52, 37,138, 45, 72,198,110,170, 83, 20, 15,188, 93,155, 93,165, 46, 15, 28, 59,223, 31,116, 34,107,161,146, 11, 29,153, +197, 34,102,164,183,115,107, 13, 91,235, 82, 19,162, 40,211,117, 87,186, 41,142, 39,193,152,255,102, 6,122,185, 43, 38, 4, 41, +209,184, 68, 63,175,237,223, 67, 65, 65,180,185, 11, 75,140, 96,132, 86, 85,210, 0, 47, 67,182,206,192, 5,172, 3,214, 41, 40, + 86, 75,211,252,230, 33, 87,106,130,167,193,118,161,255,108, 69,133, 62,243,142, 6,126,171,200,192, 47,199,225,129, 68, 5, 79, + 2, 7, 7, 57,210, 98,163, 9, 40,140,225,175,149,193, 10,207, 4,172,143,254,160,227,244,186, 5,233, 52,148,101,133,196,101, +103, 97,173,123,120, 21,204, 10, 23, 69, 50,209, 32,208,122,146,184, 77,228,117,201,145, 82,183,121, 55, 56,212,145,212, 0,101, + 13, 16, 16, 28,170, 94,190,121,195,118,124,227,252, 72, 32,159,174, 19, 77, 10,240,189, 68,207,123, 98,143,223,191, 50, 24, 56, + 98,125,202,231,139,179, 9, 69, 3, 19,124, 23,149, 10,133,200, 45,188,166,105, 63,107,116,202,243, 73, 44,207,182,135,242, 47, + 47, 79,181,122,218,166, 19,217, 91,124, 79, 10, 78,183, 86,186,187,125, 89,209,235,101,194,236, 34, 93,137, 62,199, 39, 59,155, +242,233,167,207,153,232,128, 57, 4, 65, 17, 0, 26, 87, 86,134,178,127,176,199,207,184, 29,141, 25, 48,158,106,240, 26,143, 47, +245,185,181, 88, 81,102, 96,174, 44,204, 20,138, 21,121,157,234,215, 98, 34,170, 99,151,188, 5,138, 30,104, 67, 0,243,134, 89, +151,103, 24,236, 92,113, 95,250,129, 76, 62,199,247, 6, 6, 68,176, 71, 49,130,125, 7, 77,245, 79,158,238,201,209,201,169,252, +240,250,131,220,237, 14,100,119,179, 39,239, 79,239,249,110, 54, 53,176,143, 39, 87,114, 62, 42, 40, 90, 51, 97,199,106,238, 50, +195, 54,238, 1, 96, 17,204, 13, 36,164, 93, 50, 23,114,202,109,163, 3,132,196,230, 63,252,252, 83,249,195,219, 19,210, 75,209, + 57,187,210,138,184, 21, 37,126,142, 90, 98, 16,149, 19,221,199, 91, 28, 23,226,217,195,191, 98,163, 7, 42,163, 38,131,243, 25, +231,221,160, 23,190, 63, 58,148, 86,103, 32,173,238,134, 22,247, 87,242,238,228, 59,202,239,162, 24, 91,237,181, 8,118,198, 94, +129,212,237,197,205,173, 28,158, 93, 88, 33,226, 86,170,140, 19, 14,255,196, 8,137,227, 50,170, 7,102, 4,185, 97,138,147,231, + 11,125,119,214,125, 69, 91, 59,170, 34,138, 38,161,133,223,211,100,237,147, 39, 95,203,254,134,158,253, 67, 99, 20,161, 91,133, +130, 1, 14,117,223,189,187, 98, 37, 62, 91, 76, 73, 67, 59,120,242, 68,254,233,183,191,147, 95,236, 63,146, 15, 71, 26,248, 23, + 35,125,166,125,226,175,144,228, 98,126,143, 22,121,197,142,193, 76,190,212,253,118,114,165, 69,216,106, 42,155,253, 92, 70,139, +129,124,254,116, 67, 11,191, 59, 89, 93,216, 51,127,127,114, 38,239,175,231,242,201,254,154,220,106, 1, 48, 66,119, 21, 20, 72, +208, 4,179, 21,118,124,113,135, 56,163,183, 53,153, 64,187, 29,206,135, 38, 12, 86, 52,160,232, 33, 40,122, 5,218,251, 61, 73, + 17,100,113,104, 48,120, 85, 38,106, 79, 51, 21, 84,226, 56, 72,111,111,200, 11,133, 22,242,221,228,142,129,223, 14,184,172, 1, +186,153,226, 91,101,186,200,142, 10,167,210, 19, 44,253,150,115,175,198,205,207,219, 40, 56,210, 28,228,116, 76, 43,108,102, 31, +102,113,141,152,140, 75,154,210, 59,215,145,215,193, 17, 45,200, 70,150, 46,181, 26, 44, 71,225,216,131, 69,200, 13, 14,125,231, +174, 1,118,168,228,166, 9, 12,230,141,147,169,102,229,117,206,140, 24,109,150,221,205,181,134,127, 78,158, 42, 37, 86, 19,130, +205,140,223,158,202,141, 46,170,136, 92,116, 67,171, 39,240,249,141,210, 6, 48, 71,145, 24,221,100, 43, 3, 67, 56, 32,155,236, +233, 11, 95, 95, 91, 97, 59,114, 56,236,243,154, 97,167, 10,174, 35,232, 56,152,169,161, 77,140,209, 4,102,237,120, 49, 70,210, +136, 72, 57,170, 43,147, 78, 13,138,120, 61, 2,230, 80,237, 45,172, 30, 97,203, 7,227,200,204,101, 36, 75,206, 73, 17, 64, 80, + 89, 35, 35, 93, 58,213, 11,200, 92,115,138, 18,175, 86, 10, 30, 48, 68,194, 79, 75,231, 40,219,117,183,169,246,101,160,180, 32, +179,139,196,129,112, 5,231, 6,219,200,198, 64,128,160,156,197,242, 96,116, 51, 95,232,239,132, 64,140, 6, 36,116, 58, 8, 66, +227,102,107, 55,162, 54, 8, 58,157, 94,198, 86, 41,192, 61, 0, 45,165,212,175, 94,176,202,253,216, 42, 55, 0, 22,209, 85,129, +199, 57,186, 74,168,204, 3,127, 63,136,208,240,218,219,102,172, 18,164, 39,215,145, 24,232,245, 94, 94,141, 72,239,194,189, 61, +218,221, 36,158,225,226,102,196,159, 69,242,132,131, 36, 74,109,166,140,231, 10,187, 69,182, 35,117,243,229,183, 38,209, 8, 64, + 85,192,154, 32, 57, 51,230, 68,144, 47, 78, 92, 59,222,198, 71,156, 77,139,110, 76, 13, 58,232,174, 68, 82, 55,162, 67, 8, 42, + 64,132, 47, 22, 51,190, 51, 84, 17, 29,112,211, 49, 2,139, 76,128, 2, 97,177,163,149, 57, 40, 71, 72, 34,145,104, 99,244,208, +233,181,136,209,192,103,110, 2, 28, 40, 54,159,111,105,197,216, 95,235, 18, 84, 5, 22, 0, 19,194,188, 98,245,189,161,107, 15, + 92,127,182, 0,161,138, 54,183, 68, 10, 73, 18,222, 49, 42,238,220,253,199,201,121,205, 50,118, 81,114, 23, 71, 33,247, 56,182, + 54, 39,110,184, 98, 43,187,205,228,149, 93, 45,204,102, 57,199,236,178,106, 35,123, 64,255, 29,174, 86,251, 59,187,186,222, 71, +154,160,109, 48, 57, 64,242,142,117, 57,158,140, 41, 18,195,118,118,171, 67,189,241,219,241, 88,191,111,141,137,222,181,158, 59, +184,158, 62,171,147, 5, 91,248, 9, 15,207,121, 99,252, 18, 45,221,118, 53, 55, 94,114,199,101,136,185,198,208, 5,140, 13,121, +111,218, 12,133, 73, 4, 59, 30, 3,235,227,228,118,206,128,244,243, 71,235,122, 6,244,245,172,232,202, 79, 14, 54, 53, 56, 14, + 24, 4, 48,242,233,234,231,227,111, 38,198, 26,216, 47,175,117,205, 68,102,139, 89,150, 25, 41,138, 87,183,122, 95,145,105,235, +255,240,225, 92,134, 26,176,162, 66,215,140,204,244, 29, 69,154,240,235,218,133, 16, 81,206,148, 73,127,110,201,164, 13,221, 16, +204, 95, 81, 84, 45, 22, 53, 59,148, 64, 93, 47,124,100,152,101,160,229, 45, 77,113, 15,129, 19,149,246,157, 85,177,107,232,176, +198,160,185,222,243,186, 79, 47, 71, 76,150, 95,233,231,239,108,172,104,208,236,202,143,199, 35,217, 90,105,201,129, 6,118, 24, +188,192, 41, 12,115,120,188,227, 77,253,243,241, 44,183,181,202,206,103,108,173,241,194,246, 59,232, 91,253,206, 80,126,241,249, + 83,249,238,232,146,231, 22,196, 95,254,244,246, 84, 43,195, 59, 82,223,240, 14,204,169,208,186,182,198,208, 75,224,110,174,247, +110,140, 0, 24,173, 96, 63, 78,230,112,196,195, 56, 70,100,117, 56,212,103, 54,146,179,139, 51,121,250, 20, 24,156,158,204,167, +155,250,251,215,228,236,234, 86,207,125,235,189, 66, 61, 17, 96,230,193,118,135,133,207,225,249, 21,247,119,160,154, 6,122, 42, + 60, 5, 58,236,190, 34, 49, 31,104,178,211,213,223,217, 33,168, 24, 96, 50,104,111,116, 0, 12,118,240,105,226,254, 35,135,103, + 99,185,208, 53,112, 53,186,210,160, 58,148,189,141, 30, 65,133, 0,207,165, 25,140,106, 54,229,248, 42,150, 15,103, 55, 76,166, +244,102, 9,128,163, 84,175,238,243,127,123,117, 41, 95, 62, 79,101, 4,219,216, 8,157,147,115,125,103, 29, 90,180,158, 95, 93, +235, 51, 31,107, 33,184, 46, 55,179, 90,239,173, 77, 16,235,197,184,144, 95,252,252,133,252,240,230,148, 2, 81,200, 79,254,244, +250, 88,250,186, 14, 96,142,195,243, 38,183,142,212, 82,215,191,141,116,240, 94,238,204, 28,141, 98, 73,115,147,168,230,136, 43, + 99,135,116, 81, 44,169,155,143,228, 39,197,193,194,195,169,238,112,214, 11, 41, 75, 4, 64, 28,118,247, 26,196,145,125, 12, 7, + 67, 82,222, 58,173,117, 86,220, 12,174, 14,148,193, 67, 37, 55, 87, 55, 42, 56,148, 73,108, 25,187,233, 93, 87,141,233, 7,125, +170,157,171,205, 64,221,137,121, 88, 4,247,179,212, 59, 3,156,173,147, 14,214, 54, 80, 29,102,244,110, 88,129,239, 91,186,177, + 76,203, 53,198,113,192,143,198,214, 58,179, 42,113, 41,245,164,230, 12, 14, 0,139, 96,111, 26,121,231,160,224,131,137,104, 34, +208, 75, 77,188, 3, 97,116,119,107,147, 27, 53,213,195,126, 67, 95, 10, 22, 83, 43,179,234, 19,207,162,214,195, 6,217, 82, 59, +106, 91, 16,167,246,187,127,158, 25, 38,243,144, 66, 27, 39,213, 23, 15,176, 24, 50, 74,180, 63,215,181,226, 79,221, 95, 30, 40, +224, 78,142,141,164,139, 65,171,220,227,139,107, 86,155,224,148, 50,232, 96,230,168,255,141,159, 99,146,210, 50,195, 5,108, 42, + 32,188,219,173, 53, 86, 50, 88,228,248, 51,116, 1,240,103,153, 38, 7, 68, 62,186, 54, 59,170,186,153, 3, 32,131,236,109,167, +213,114, 9, 94,211, 23, 8,192, 65,128, 55,176,177,239,167,134,137,200, 25,216,141,131,159,248,156, 27, 7, 13, 91,144, 64,243, + 87, 25, 93,205,112, 32, 97,108, 0, 12, 64,237,134, 26,168,148,208,122,133, 98, 28,222, 27,158,255, 84, 3, 53, 18,195,121,110, +146,152,200, 13,110,238,166,182, 17,245, 57,103,144,233, 4, 56,169, 64,155,112, 64,212,251,237,232,158,207,183,211, 49, 29,236, + 41, 17,250,152, 89,149, 78,117, 20, 38, 93,156, 53, 45,103,114,113, 49,230,218, 66,114,138,174, 1,146,187,152,154,230, 49,105, + 76, 21, 90,167,122,212,140, 33, 90,115, 58,114,251,220,140,127,150,116,173, 26,130,202, 20, 84,198, 16,188, 96, 80, 81,187,115, + 95, 49, 3,200, 38,247,121,109,217, 48, 58,152,150, 86, 15, 74,135, 28, 35, 85, 70, 99, 58,120,180,195,153, 54,214,212,164, 92, +152,250, 32, 90,121,165, 5,159,150,204, 53,120,104, 82, 85, 14,217,158,238, 68,246,243,160,135, 77,151, 70,207, 44,131,238,130, + 30, 6, 43,200,222, 49,159,108, 67,105,202, 0, 76, 33,137,194, 38, 71,150,143,164,135, 99,162,218,198, 95, 61,138, 95, 0,117, + 28, 19,116,122, 51, 94,178,123,197,153,126, 39, 53, 13,131, 8,212,197,109,206,230,176,119, 35, 6,228,182,241,219, 43,105, 40, +143, 24, 31,236,107,242,139,206,222,185, 6,175, 13, 61,172,230,250, 92, 46,174,175,189,221,205,255,101,155,176, 40, 23, 60, 39, + 46,245, 96,187,231,243,180, 52,190,204, 75, 6,219, 89,101,216,146,136, 10, 91, 70,223,196,251,159,233,126,221,213,247,176,185, +185,169,135,254,141, 51, 62, 58,236, 94, 89,167, 79,207,138, 60,229,152,208, 52, 32,140,245,129,195,174,203, 22,106, 91,146,194, + 88, 15, 53,215,123,187, 1,223,190,120,116,192, 36,225,248,236,220, 37,143, 99,158, 57, 55,211,165,236,174,164,178,181,181, 65, + 44, 66,172, 95,123,212,170,229, 15,239,206,233, 60, 54,151, 54,103,155,239, 1,196, 28,232,245,102, 61, 3, 22, 70, 87,236,232, +129, 13,129, 34,232,145, 38,165,120,254,147,229, 84, 86,239, 11,154,123, 64,151,125,111,163, 47, 31,206,187,156, 29,147, 87, 92, +185, 42, 30,206,193, 18, 70,191,133,225,133,240,140, 42, 59, 11,109,236,104,237,100, 51,189,177, 46, 86, 44,198,182, 65,114, 60, +236,111,104,130,113,109,251, 81,215,239,114, 98,128, 65,152,185,108,104, 16,203,167, 35, 13, 44, 35, 57,185,238,203,179,189, 33, + 13, 68,128,250,223, 66, 48,167, 65, 84,106,197,149,239,113,124,102, 89, 23,164, 45, 87, 76,144, 44,225, 31, 77, 23, 46,144,149, + 49, 72,253,249,253,189,252,245, 39,251,242,116,111,155,213,252, 83, 61, 39,222, 31,159,106,113, 50,109,176, 53, 96, 13, 76,167, + 24,107,172, 24,104, 45, 43,229,100, 26,177,189, 12,183,178, 71,195, 13,141, 45, 99,121,250,232, 5, 85,251,190,127,253, 86, 34, + 77,184,254,250,103, 95,115,238,142, 66, 1,179,124,156, 13, 8, 88,244,196,208,235, 60,210,119,119,161,239,200,100, 49, 44,177, + 52, 77, 20,188, 23, 36, 47,125, 2, 19,245, 9,179,115, 6, 86, 9,226, 14,217, 71,145,141,181,196, 89, 82, 56,167, 54, 32, 64, +116, 14, 1,159, 91,249,221,235, 75,185,253,205, 57,231,241,148, 76,166,137,149,117,188, 0,174, 59, 58, 62,100, 2,131,245,255, +157, 94,239,198,218,150, 22,141, 83,130,137,123, 90,197, 31,105,181,253,211,207,158, 51,177,187, 71,247,164,219, 33,247, 31,123, + 96,164,123,243,248, 52,145,255,241, 23,143,229,234,122, 33,111, 15, 83, 26,103, 97, 47,236,111,173,176,186, 71,130, 6,134,213, +202, 80,207,243,137,185, 40, 98, 60,157,118,250,214,217, 92, 29,242,251,128,186,199,103, 14,168, 57,210,147,237,245,117,158,131, +120, 62,123,219,155,220,231,255,191, 0, 3, 0, 4, 77, 15, 40,213, 32,193, 90, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, + 0}; + diff --git a/source/blender/editors/datafiles/startup.blend.c b/source/blender/editors/datafiles/startup.blend.c new file mode 100644 index 00000000000..f34cf16430b --- /dev/null +++ b/source/blender/editors/datafiles/startup.blend.c @@ -0,0 +1,7537 @@ +/* DataToC output of file */ + +int datatoc_startup_blend_size= 240980; +char datatoc_startup_blend[]= { + 66, 76, 69, 78, 68, 69, 82, 45,118, 50, 53, 50, 82, 69, 78, 68, 32, 0, 0, 0, +144,181, 39,248,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 24, 1, 0, 0,144,180, 39,248,255,127, 0, 0, +201, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 53, 5, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1,200,187, 85, 3, 0, 0, 0, 0, +120,159, 89, 3, 0, 0, 0, 0, 0, 16, 0, 0,128, 32, 4, 0, 47,104,111,109,101, 47, 98,114,101, 99,104,116, 47, 46, 98,108, +101,110,100,101,114, 47, 50, 46, 53, 50, 47, 99,111,110,102,105,103, 47,115,116, 97,114,116,117,112, 46, 98,108,101,110,100, 0, + 61,117,232, 0, 0, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0,208,181, 39,248, 32, 0, 0, 0,144,181, 39,248,255,127, 0, 0, + 40,102,128, 4, 0, 0, 0, 0, 64,181, 39,248,255,127, 0, 0,104, 14,145, 4, 0, 0, 0, 0,112,181, 39,248,255,127, 0, 0, +133,119,232, 0, 0, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0,144,181, 39,248,255,127, 0, 0, 32, 0, 0, 0, 82, 69, 78, 68, + 40,102,128, 4, 0, 0, 0, 0, 82, 69, 78, 68, 32, 0, 0, 0,144,181, 39,248,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, +152,212, 83, 3, 0, 0, 0, 0,192,181, 39,248,255,127, 0, 0, 67,126,232, 0, 0, 0, 0, 0,104,209, 83, 3, 0, 0, 0, 0, + 40,102,128, 4, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 77, 0, 0, 24, 1, 0, 0,152,212, 83, 3, 0, 0, 0, 0,111, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248,213, 83, 3, 0, 0, 0, 0,248,213, 83, 3, 0, 0, 0, 0,248,213, 83, 3, 0, 0, 0, 0,248,213, 83, 3, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88,173, 70, 3, 0, 0, 0, 0, 88,173, 70, 3, 0, 0, 0, 0, 88,173, 70, 3, 0, 0, 0, 0, 88,225, 90, 3, 0, 0, 0, 0, + 88,225, 90, 3, 0, 0, 0, 0, 88,225, 90, 3, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,248,213, 83, 3, 0, 0, 0, 0, +112, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,174, 70, 3, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,200,187, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, + 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, 30, 0,118, 7, 97, 4, + 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,248, 1, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,136, 21, 55, 3, 0, 0, 0, 0,104,177,126, 4, 0, 0, 0, 0, +104,177,126, 4, 0, 0, 0, 0, 88, 3, 94, 3, 0, 0, 0, 0,232, 4, 94, 3, 0, 0, 0, 0,120, 6, 94, 3, 0, 0, 0, 0, +120, 6, 94, 3, 0, 0, 0, 0, 72, 7, 94, 3, 0, 0, 0, 0,120, 76, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, 40,215, 83, 3, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, +200,234, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 82, 65,110,105,109, 97,116,105,111,110, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 72,216, 83, 3, 0, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0, 40,224, 83, 3, 0, 0, 0, 0, +104,236, 83, 3, 0, 0, 0, 0,216,236, 83, 3, 0, 0, 0, 0, 72,215, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,216, 83, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,184,216, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,216, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 40,217, 83, 3, 0, 0, 0, 0, 72,216, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 40,217, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,152,217, 83, 3, 0, 0, 0, 0, +184,216, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +152,217, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0, 40,217, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0,152,217, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +232,218, 83, 3, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,232,218, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0, +120,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 88,219, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0,232,218, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 4, 52, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +168,220, 83, 3, 0, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 52, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, + 56,220, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 24,221, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 84, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +192, 1, 84, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +104,222, 83, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1,187, 2, 1, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,216,222, 83, 3, 0, 0, 0, 0, +248,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +216,222, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0,216,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 4, 48, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 48, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 40,224, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,152,224, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,184,216, 83, 3, 0, 0, 0, 0, 40,217, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,152,224, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 8,225, 83, 3, 0, 0, 0, 0, + 40,224, 83, 3, 0, 0, 0, 0,184,216, 83, 3, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 8,225, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,120,225, 83, 3, 0, 0, 0, 0, +152,224, 83, 3, 0, 0, 0, 0, 40,217, 83, 3, 0, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,120,225, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,232,225, 83, 3, 0, 0, 0, 0, + 8,225, 83, 3, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,232,225, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 88,226, 83, 3, 0, 0, 0, 0, +120,225, 83, 3, 0, 0, 0, 0, 72,216, 83, 3, 0, 0, 0, 0,232,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 88,226, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200,226, 83, 3, 0, 0, 0, 0, +232,225, 83, 3, 0, 0, 0, 0,152,217, 83, 3, 0, 0, 0, 0,232,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,200,226, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 56,227, 83, 3, 0, 0, 0, 0, + 88,226, 83, 3, 0, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 56,227, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,168,227, 83, 3, 0, 0, 0, 0, +200,226, 83, 3, 0, 0, 0, 0,232,218, 83, 3, 0, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,168,227, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 24,228, 83, 3, 0, 0, 0, 0, + 56,227, 83, 3, 0, 0, 0, 0,152,217, 83, 3, 0, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 24,228, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,136,228, 83, 3, 0, 0, 0, 0, +168,227, 83, 3, 0, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,136,228, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,248,228, 83, 3, 0, 0, 0, 0, + 24,228, 83, 3, 0, 0, 0, 0, 72,216, 83, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,248,228, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,104,229, 83, 3, 0, 0, 0, 0, +136,228, 83, 3, 0, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,104,229, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,216,229, 83, 3, 0, 0, 0, 0, +248,228, 83, 3, 0, 0, 0, 0,232,218, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,216,229, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 72,230, 83, 3, 0, 0, 0, 0, +104,229, 83, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72,230, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,184,230, 83, 3, 0, 0, 0, 0, +216,229, 83, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,184,230, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 40,231, 83, 3, 0, 0, 0, 0, + 72,230, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 40,231, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,152,231, 83, 3, 0, 0, 0, 0, +184,230, 83, 3, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,152,231, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 8,232, 83, 3, 0, 0, 0, 0, + 40,231, 83, 3, 0, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 8,232, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,120,232, 83, 3, 0, 0, 0, 0, +152,231, 83, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,120,232, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,232,232, 83, 3, 0, 0, 0, 0, + 8,232, 83, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,232,232, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 88,233, 83, 3, 0, 0, 0, 0, +120,232, 83, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0,216,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 88,233, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200,233, 83, 3, 0, 0, 0, 0, +232,232, 83, 3, 0, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0,216,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,200,233, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 56,234, 83, 3, 0, 0, 0, 0, + 88,233, 83, 3, 0, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 56,234, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,168,234, 83, 3, 0, 0, 0, 0, +200,233, 83, 3, 0, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,168,234, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 24,235, 83, 3, 0, 0, 0, 0, + 56,234, 83, 3, 0, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 24,235, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,136,235, 83, 3, 0, 0, 0, 0, +168,234, 83, 3, 0, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,136,235, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,248,235, 83, 3, 0, 0, 0, 0, + 24,235, 83, 3, 0, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,248,235, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,104,236, 83, 3, 0, 0, 0, 0, +136,235, 83, 3, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,104,236, 83, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248,235, 83, 3, 0, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0,216,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,216,236, 83, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,168,240, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0,184,216, 83, 3, 0, 0, 0, 0, 40,217, 83, 3, 0, 0, 0, 0, +120,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, + 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,234, 84, 3, 0, 0, 0, 0, + 56,234, 84, 3, 0, 0, 0, 0,200,237, 83, 3, 0, 0, 0, 0, 56,239, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +200,237, 83, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 56,239, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 56,239, 83, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,237, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, +112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +168,240, 83, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,200, 23, 84, 3, 0, 0, 0, 0,216,236, 83, 3, 0, 0, 0, 0, +232,218, 83, 3, 0, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0,152,217, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 51, 1, 0, 0, 4, 4,222, 0, 52, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 14, 84, 3, 0, 0, 0, 0, 72, 22, 84, 3, 0, 0, 0, 0, +152,241, 83, 3, 0, 0, 0, 0, 8,243, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,241, 83, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 8,243, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, 0, 0, 94, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221, 0, 0, 0, + 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,222, 0, 31, 0,222, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 21, 1, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,243, 83, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,241, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 67, + 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 77, 67, 1,128,138,195, 0, 0, 0, 0,205, 0, 0, 0,222, 0, 0, 0, + 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, + 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,222, 0, 21, 1,205, 0, 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 14, 84, 3, 0, 0, 0, 0, +165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,200, 23, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,200, 36, 84, 3, 0, 0, 0, 0, +168,240, 83, 3, 0, 0, 0, 0, 72,216, 83, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, +232,218, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, + 15, 15, 32, 4, 84, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 27, 84, 3, 0, 0, 0, 0, + 72, 35, 84, 3, 0, 0, 0, 0,184, 24, 84, 3, 0, 0, 0, 0, 40, 26, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +184, 24, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 40, 26, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,140, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,132, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 32, 4, 26, 0, 32, 4, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 40, 26, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 24, 84, 3, 0, 0, 0, 0, + 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 31, 4, 0, 0, 18, 0, 0, 0, 57, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66, +205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 32, 4, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 26, 0, 0, 0, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 4, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, +152, 27, 84, 3, 0, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200, 36, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, +184, 55, 84, 3, 0, 0, 0, 0,200, 23, 84, 3, 0, 0, 0, 0,200,219, 83, 3, 0, 0, 0, 0, 72,223, 83, 3, 0, 0, 0, 0, +184,223, 83, 3, 0, 0, 0, 0, 56,220, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, + 53, 1, 0, 0, 47, 2, 0, 0, 3, 3,222, 0,251, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +152, 40, 84, 3, 0, 0, 0, 0, 56, 54, 84, 3, 0, 0, 0, 0,184, 37, 84, 3, 0, 0, 0, 0, 40, 39, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,184, 37, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 40, 39, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 94, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, + 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,222, 0, + 26, 0,222, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, + 22, 2, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 26, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 40, 39, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +184, 37, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0,100, 66, 0, 0,131, 67, + 0, 0, 79,195, 0, 0, 0, 0,205, 0, 0, 0,222, 0, 0, 0, 18, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, 18, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,222, 0, +225, 0,205, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, + 53, 1, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0,225, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 1, 0, 0,152, 40, 84, 3, 0, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 42, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, + 8, 42, 84, 3, 0, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,104, 42, 84, 3, 0, 0, 0, 0, + 68, 65, 84, 65,208, 0, 0, 0,104, 42, 84, 3, 0, 0, 0, 0,222, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, +120,159, 89, 3, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, +120,159, 89, 3, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, +104,181, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,189, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 72,129, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,200, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, +200,110, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,195, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, +232,176, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 24,176, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184, 55, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, +104, 84, 84, 3, 0, 0, 0, 0,200, 36, 84, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0,248,221, 83, 3, 0, 0, 0, 0, + 88,219, 83, 3, 0, 0, 0, 0, 24,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0, 31, 4, 0, 0, + 85, 0, 0, 0,186, 2, 0, 0, 1, 1, 95, 2,102, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +232, 78, 84, 3, 0, 0, 0, 0, 72, 83, 84, 3, 0, 0, 0, 0,168, 56, 84, 3, 0, 0, 0, 0,200, 73, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,168, 56, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 24, 58, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 23, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, + 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 95, 2, + 26, 0, 95, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0, 31, 4, 0, 0, + 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 2, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 24, 58, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,136, 59, 84, 3, 0, 0, 0, 0, +168, 56, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, +255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, + 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0,193, 1, 0, 0, +111, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 76, 2, 0, 0, 5, 0, + 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,136, 59, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,248, 60, 84, 3, 0, 0, 0, 0, + 24, 58, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, + 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, +120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0, 31, 4, 0, 0, +111, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, + 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,248, 60, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,200, 73, 84, 3, 0, 0, 0, 0, +136, 59, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, + 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, +148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, 0, 0, 31, 4, 0, 0, +111, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, + 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,200, 73, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248, 60, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 1, 0, 0, 31, 4, 0, 0, +111, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 2, 76, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 75, 84, 3, 0, 0, 0, 0, + 68, 65, 84, 65,104, 3, 0, 0, 56, 75, 84, 3, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,134,144, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190, +184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, + 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63, +176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, + 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,178,157,229, 62,215, 62,232,190, + 48,180, 81,191,184,158, 81,191,117, 90,127, 63,158,227, 95, 62, 26, 63,185, 62, 35, 44,185, 62,145,180,109,188,243, 90,129, 63, +138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,240,191, 62,110,116, 85, 63, + 80,185, 70,188, 0, 0, 82,180,206, 44,182,190,198,158, 47, 62, 36,239, 74, 63, 0, 0, 8,179, 67,108,117,194,183,204,216, 65, +104,156, 5,194,212,247,159,192,235, 62,114, 66, 59,254,213,193,157,225, 3, 66, 55, 8,160, 64, 68,239,209, 62, 51,177,205,190, +184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, + 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,178,157,229, 62,215, 62,232,190, + 48,180, 81,191,184,158, 81,191,117, 90,127, 63,158,227, 95, 62, 26, 63,185, 62, 35, 44,185, 62,145,180,109,188,243, 90,129, 63, +138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,255,189, 88, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,189, 88, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,189, 88, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190, +237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,234,108, 69, 59, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, + 68, 65, 84, 65, 48, 1, 0, 0,232, 78, 84, 3, 0, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104, 84, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, + 8,147, 84, 3, 0, 0, 0, 0,184, 55, 84, 3, 0, 0, 0, 0,168,220, 83, 3, 0, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0, +216,222, 83, 3, 0, 0, 0, 0,136,221, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, + 85, 0, 0, 0,255, 0, 0, 0, 2, 2,192, 1,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 91, 84, 3, 0, 0, 0, 0,232,145, 84, 3, 0, 0, 0, 0, 88, 85, 84, 3, 0, 0, 0, 0,168, 89, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 88, 85, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,200, 86, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 93, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,224, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, + 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,192, 1, + 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, + 85, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,200, 86, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 56, 88, 84, 3, 0, 0, 0, 0, + 88, 85, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, + 0, 0,254,194, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0, +145, 0,200, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, +111, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,145, 0, 0, 0, 2, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 56, 88, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,168, 89, 84, 3, 0, 0, 0, 0, +200, 86, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0,191, 1, 0, 0, +111, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, + 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,168, 89, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 88, 84, 3, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, + 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,144, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, + 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,231, 0, +145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,191, 1, 0, 0, +111, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 0,145, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,240, 0, 0, 0, 24, 91, 84, 3, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88, 92, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 92, 84, 3, 0, 0, 0, 0, 24, 1, 0, 0, 1, 0, 0, 0, +120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8,147, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, + 72,215, 84, 3, 0, 0, 0, 0,104, 84, 84, 3, 0, 0, 0, 0,104,222, 83, 3, 0, 0, 0, 0, 8,218, 83, 3, 0, 0, 0, 0, +248,221, 83, 3, 0, 0, 0, 0,216,222, 83, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, + 1, 1, 0, 0,186, 2, 0, 0, 12, 12,192, 1,186, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72,152, 84, 3, 0, 0, 0, 0, 40,214, 84, 3, 0, 0, 0, 0,248,147, 84, 3, 0, 0, 0, 0,216,150, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,248,147, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,104,149, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 98, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,224, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, + 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,192, 1, + 26, 0,192, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 1, 0, 0, + 1, 1, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 1, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,104,149, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216,150, 84, 3, 0, 0, 0, 0, +248,147, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, + 0, 0,199,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0, +160, 1,200, 0,142, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, + 27, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,160, 1, 0, 0, 2, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,216,150, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +104,149, 84, 3, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, + 0, 0,199,195, 0, 0, 0, 0,231, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 18, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,124,146, 72, 0, 64, 28, 70, 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,248, 0, +160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,191, 1, 0, 0, + 27, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0,160, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 0, 1, 0, 0, 72,152, 84, 3, 0, 0, 0, 0, 25, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 72,215, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,147, 84, 3, 0, 0, 0, 0, + 72,223, 83, 3, 0, 0, 0, 0, 88,219, 83, 3, 0, 0, 0, 0,120,218, 83, 3, 0, 0, 0, 0,184,223, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 49, 2, 0, 0,186, 2, 0, 0, 1, 1,222, 0,138, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,222, 84, 3, 0, 0, 0, 0,248,232, 84, 3, 0, 0, 0, 0, + 56,216, 84, 3, 0, 0, 0, 0,168,217, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,216, 84, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,168,217, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,194, 67, 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 1, 0, 0, + 0, 0, 0, 0, 23, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 0, 10, 0,132, 1, 24, 0,132, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 49, 2, 0, 0, 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,217, 84, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,216, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 0, 0,254, 4, 0, 0, 49, 2, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,222, 0,138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 24,219, 84, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 24,219, 84, 3, 0, 0, 0, 0, +159, 0, 0, 0, 1, 0, 0, 0, 23,255, 13, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,109,100, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62, +149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190, +152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, + 56, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, + 77,255,170, 64, 0, 0,128, 63, 2,201,194, 63, 61,254,144,191,244,250, 39,191, 8,165, 39,191,142,164,206, 63,250,192,142, 63, +180,164, 28, 63,149, 84, 28, 63,177,153,196,188,189,133, 76, 64, 8,108,228,190, 50,247,227,190, 81, 21, 64,191,119, 24,172,191, +216, 49, 49, 65,152, 9, 52, 65,231, 70,158, 62, 24,234,167, 62,160,206,159,187, 0, 0,170,180,243, 26,182,189,252, 74,179, 61, +195,111,128, 62, 0, 0,124, 51,211,120, 21,194,144, 5, 2, 66, 10,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193, +158,101,210, 65,173, 40,160, 64,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62, +149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190, +152, 9, 52,193, 0, 0,128, 63, 2,201,194, 63, 61,254,144,191,244,250, 39,191, 8,165, 39,191,142,164,206, 63,250,192,142, 63, +180,164, 28, 63,149, 84, 28, 63,177,153,196,188,189,133, 76, 64, 8,108,228,190, 50,247,227,190, 81, 21, 64,191,119, 24,172,191, +216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 2, 35,171,190, 0, 0, 32, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,240, 13,133, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,200,222, 84, 3, 0, 0, 0, 0, +160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, + 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, +200,234, 84, 3, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,187, 85, 3, 0, 0, 0, 0, 40,215, 83, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111,109,112,111,115,105,116,105,110,103, 0,103, 46, + 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,235, 84, 3, 0, 0, 0, 0, +152,241, 84, 3, 0, 0, 0, 0, 8,242, 84, 3, 0, 0, 0, 0, 56,251, 84, 3, 0, 0, 0, 0,168,251, 84, 3, 0, 0, 0, 0, +184,120, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,232,235, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 88,236, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 88,236, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,200,236, 84, 3, 0, 0, 0, 0,232,235, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,236, 84, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 56,237, 84, 3, 0, 0, 0, 0, 88,236, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,237, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +168,237, 84, 3, 0, 0, 0, 0,200,236, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 24,238, 84, 3, 0, 0, 0, 0, + 56,237, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 24,238, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,248,238, 84, 3, 0, 0, 0, 0, 24,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 4, 64, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,238, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +104,239, 84, 3, 0, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 64, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,104,239, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,216,239, 84, 3, 0, 0, 0, 0, +248,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +216,239, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0,104,239, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,184,240, 84, 3, 0, 0, 0, 0,216,239, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 4, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,240, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 40,241, 84, 3, 0, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 20, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 40,241, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,152,241, 84, 3, 0, 0, 0, 0, +184,240, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +152,241, 84, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,241, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,242, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,120,242, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,236, 84, 3, 0, 0, 0, 0, +200,236, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,242, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,232,242, 84, 3, 0, 0, 0, 0, 8,242, 84, 3, 0, 0, 0, 0, 88,236, 84, 3, 0, 0, 0, 0, +168,237, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,242, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 88,243, 84, 3, 0, 0, 0, 0,120,242, 84, 3, 0, 0, 0, 0,200,236, 84, 3, 0, 0, 0, 0, + 24,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,243, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,200,243, 84, 3, 0, 0, 0, 0,232,242, 84, 3, 0, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0, + 24,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,243, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 56,244, 84, 3, 0, 0, 0, 0, 88,243, 84, 3, 0, 0, 0, 0, 56,237, 84, 3, 0, 0, 0, 0, +248,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,244, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,168,244, 84, 3, 0, 0, 0, 0,200,243, 84, 3, 0, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, +248,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,244, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 24,245, 84, 3, 0, 0, 0, 0, 56,244, 84, 3, 0, 0, 0, 0, 24,238, 84, 3, 0, 0, 0, 0, +104,239, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,245, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,136,245, 84, 3, 0, 0, 0, 0,168,244, 84, 3, 0, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0, +104,239, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,245, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,248,245, 84, 3, 0, 0, 0, 0, 24,245, 84, 3, 0, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, +104,239, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,245, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,104,246, 84, 3, 0, 0, 0, 0,136,245, 84, 3, 0, 0, 0, 0, 24,238, 84, 3, 0, 0, 0, 0, +248,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,246, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,216,246, 84, 3, 0, 0, 0, 0,248,245, 84, 3, 0, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0, +216,239, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,246, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 72,247, 84, 3, 0, 0, 0, 0,104,246, 84, 3, 0, 0, 0, 0,104,239, 84, 3, 0, 0, 0, 0, + 72,240, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,247, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,184,247, 84, 3, 0, 0, 0, 0,216,246, 84, 3, 0, 0, 0, 0,216,239, 84, 3, 0, 0, 0, 0, + 72,240, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,247, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 40,248, 84, 3, 0, 0, 0, 0, 72,247, 84, 3, 0, 0, 0, 0,216,239, 84, 3, 0, 0, 0, 0, +184,240, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,248, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,152,248, 84, 3, 0, 0, 0, 0,184,247, 84, 3, 0, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0, +184,240, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,248, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 8,249, 84, 3, 0, 0, 0, 0, 40,248, 84, 3, 0, 0, 0, 0,232,235, 84, 3, 0, 0, 0, 0, + 40,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,249, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,120,249, 84, 3, 0, 0, 0, 0,152,248, 84, 3, 0, 0, 0, 0, 40,241, 84, 3, 0, 0, 0, 0, +152,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,249, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,232,249, 84, 3, 0, 0, 0, 0, 8,249, 84, 3, 0, 0, 0, 0, 56,237, 84, 3, 0, 0, 0, 0, +152,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,249, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 88,250, 84, 3, 0, 0, 0, 0,120,249, 84, 3, 0, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, +152,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,250, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0,200,250, 84, 3, 0, 0, 0, 0,232,249, 84, 3, 0, 0, 0, 0,184,240, 84, 3, 0, 0, 0, 0, + 40,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,250, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 56,251, 84, 3, 0, 0, 0, 0, 88,250, 84, 3, 0, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0, +152,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,251, 84, 3, 0, 0, 0, 0, +197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,250, 84, 3, 0, 0, 0, 0,232,235, 84, 3, 0, 0, 0, 0, +216,239, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168,251, 84, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0,120,255, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0, + 88,236, 84, 3, 0, 0, 0, 0,200,236, 84, 3, 0, 0, 0, 0, 24,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56,187, 85, 3, 0, 0, 0, 0, 56,187, 85, 3, 0, 0, 0, 0,152,252, 84, 3, 0, 0, 0, 0, + 8,254, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,252, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 8,254, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,254, 84, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,152,252, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120,255, 84, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, +120, 12, 85, 3, 0, 0, 0, 0,168,251, 84, 3, 0, 0, 0, 0,152,241, 84, 3, 0, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, +248,238, 84, 3, 0, 0, 0, 0, 56,237, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0, + 0, 0, 0, 0, 63, 0, 0, 0, 15, 15,234, 0, 64, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 3, 85, 3, 0, 0, 0, 0,248, 10, 85, 3, 0, 0, 0, 0,104, 0, 85, 3, 0, 0, 0, 0,216, 1, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,104, 0, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216, 1, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,116, 68, 0, 0, 0, 0, 0, 0,208, 65, 0,128,190, 67, 0,192, 25, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, + 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,234, 0, + 26, 0,234, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,216, 1, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +104, 0, 85, 3, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, + 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, 18, 0, 0, 0, 37, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, + 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,234, 0, + 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,254, 4, 0, 0, + 26, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 38, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,216, 0, 0, 0, 72, 3, 85, 3, 0, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 12, 85, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0, 24, 52, 85, 3, 0, 0, 0, 0,120,255, 84, 3, 0, 0, 0, 0,136,238, 84, 3, 0, 0, 0, 0, +104,239, 84, 3, 0, 0, 0, 0, 24,238, 84, 3, 0, 0, 0, 0,248,238, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,254, 4, 0, 0, 65, 0, 0, 0,186, 2, 0, 0, 4, 4,234, 0,122, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200, 35, 85, 3, 0, 0, 0, 0,152, 50, 85, 3, 0, 0, 0, 0,104, 13, 85, 3, 0, 0, 0, 0, +216, 14, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 13, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +216, 14, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 55, 0, 0,106, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0,234, 0, 31, 0,234, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,254, 4, 0, 0,156, 2, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +234, 0, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216, 14, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,104, 13, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 67, 0, 64, 80,196, 0, 0, 0, 0, + 0, 0, 0, 0,255,255, 88, 67, 0,192, 22,196, 0, 0, 0, 0,217, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 90, 2, 0, 0, + 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 90, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 4, 6, 0,234, 0, 91, 2,217, 0, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,254, 4, 0, 0, 65, 0, 0, 0,155, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +234, 0, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 35, 85, 3, 0, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 24, 52, 85, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 24, 92, 85, 3, 0, 0, 0, 0,120, 12, 85, 3, 0, 0, 0, 0, + 40,241, 84, 3, 0, 0, 0, 0,184,240, 84, 3, 0, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0,152,241, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 1, 1, 19, 2, 20, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 75, 85, 3, 0, 0, 0, 0,248, 90, 85, 3, 0, 0, 0, 0, + 8, 53, 85, 3, 0, 0, 0, 0, 40, 70, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 53, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,120, 54, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 4, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 2, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 19, 2, 26, 0, 19, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120, 54, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,232, 55, 85, 3, 0, 0, 0, 0, 8, 53, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, + 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, + 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, + 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,250, 0, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 55, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 88, 57, 85, 3, 0, 0, 0, 0,120, 54, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, + 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, + 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, + 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 57, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 40, 70, 85, 3, 0, 0, 0, 0,232, 55, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, + 0,192,108,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, + 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, + 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40, 70, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 57, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 2,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,152, 71, 85, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,152, 71, 85, 3, 0, 0, 0, 0, +159, 0, 0, 0, 1, 0, 0, 0, 37,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249,173,116, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62, +149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190, +152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, + 56, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, + 77,255,170, 64, 0, 0,128, 63, 4, 6,158, 63,214, 78,155,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,203,232,152, 63, +180,164, 28, 63,149, 84, 28, 63, 1,127,159,188,123, 18, 91, 64, 8,108,228,190, 50,247,227,190,222,212, 27,191,168, 86,184,191, +216, 49, 49, 65,152, 9, 52, 65, 80, 25,195, 62,218,249,206, 62, 0,237,196,187, 0, 0, 96,179,234, 2,170,189,191, 98,167, 61, + 1,208,111, 62, 0, 0,224, 49,254,120, 21,194,182, 5, 2, 66, 70,136,213,193,239,214,159,192, 5, 39, 19, 66, 15,174,255,193, +217,101,210, 65,219, 40,160, 64,221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62, +149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190, +152, 9, 52,193, 0, 0,128, 63, 4, 6,158, 63,214, 78,155,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,203,232,152, 63, +180,164, 28, 63,149, 84, 28, 63, 1,127,159,188,123, 18, 91, 64, 8,108,228,190, 50,247,227,190,222,212, 27,191,168, 86,184,191, +216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 2, 35,171,190,214,211,111, 65,214,211,111, 65, + 0, 0, 0, 0, 0, 0, 0, 0,223, 34, 9, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 72, 75, 85, 3, 0, 0, 0, 0, +160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, + 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 24, 92, 85, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,184,120, 85, 3, 0, 0, 0, 0, 24, 52, 85, 3, 0, 0, 0, 0, +216,239, 84, 3, 0, 0, 0, 0,168,237, 84, 3, 0, 0, 0, 0,104,239, 84, 3, 0, 0, 0, 0, 72,240, 84, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 16, 16, 20, 4,166, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 95, 85, 3, 0, 0, 0, 0,152,119, 85, 3, 0, 0, 0, 0, + 8, 93, 85, 3, 0, 0, 0, 0,120, 94, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 93, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,120, 94, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 37, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120, 94, 85, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 93, 85, 3, 0, 0, 0, 0, 0, 0, 32,193, 0, 0, 0, 68, + 0, 0, 32,193, 0, 0, 0, 68,110,142,241,195, 55,199,120, 68,240, 80,128,193,136, 2, 4, 68, 3, 4, 0, 0, 20, 4, 0, 0, + 18, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, + 18, 0, 0, 0,139, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,236, 81,184, 61, 10,215, 19, 64, + 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 20, 4,140, 1, 3, 4,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 4,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0,232, 95, 85, 3, 0, 0, 0, 0, +177, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 61,181, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,120, 85, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 24, 92, 85, 3, 0, 0, 0, 0,232,235, 84, 3, 0, 0, 0, 0,216,239, 84, 3, 0, 0, 0, 0, +184,240, 84, 3, 0, 0, 0, 0, 40,241, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, + 0, 0, 0, 0, 19, 1, 0, 0, 6, 6, 0, 2, 20, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248,125, 85, 3, 0, 0, 0, 0, 24,186, 85, 3, 0, 0, 0, 0,168,121, 85, 3, 0, 0, 0, 0,136,124, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,168,121, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 24,123, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, + 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 0, 2, + 26, 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 24,123, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,136,124, 85, 3, 0, 0, 0, 0, +168,121, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, + 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,136,124, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24,123, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0,191, 0, 0,192, 63, + 0, 0, 64, 60, 0, 0,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 1, 0, 0, + 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,250, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 72, 33, 0, 0,248,125, 85, 3, 0, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, + 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 78, 0, 0,208, 0, 0, 0,200,187, 85, 3, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 40,202, 86, 3, 0, 0, 0, 0, +200,234, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101,102, 97,117,108, +116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +232,188, 85, 3, 0, 0, 0, 0,184,193, 85, 3, 0, 0, 0, 0, 40,194, 85, 3, 0, 0, 0, 0,152,201, 85, 3, 0, 0, 0, 0, + 8,202, 85, 3, 0, 0, 0, 0,152,126, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92,100,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,188, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 88,189, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 88,189, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,200,189, 85, 3, 0, 0, 0, 0, +232,188, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +200,189, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 56,190, 85, 3, 0, 0, 0, 0, 88,189, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,190, 85, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0,200,189, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 24,191, 85, 3, 0, 0, 0, 0, 56,190, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0, +168,190, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +136,191, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +216,192, 85, 3, 0, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6,116, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0, +104,192, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,116, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 72,193, 85, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,184,193, 85, 3, 0, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,193, 85, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 6, 92, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,194, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +152,194, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,189, 85, 3, 0, 0, 0, 0,200,189, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,194, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 8,195, 85, 3, 0, 0, 0, 0, 40,194, 85, 3, 0, 0, 0, 0, 88,189, 85, 3, 0, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,195, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +120,195, 85, 3, 0, 0, 0, 0,152,194, 85, 3, 0, 0, 0, 0,200,189, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,195, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +232,195, 85, 3, 0, 0, 0, 0, 8,195, 85, 3, 0, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,195, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 88,196, 85, 3, 0, 0, 0, 0,120,195, 85, 3, 0, 0, 0, 0,232,188, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,196, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +200,196, 85, 3, 0, 0, 0, 0,232,195, 85, 3, 0, 0, 0, 0, 56,190, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,196, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 56,197, 85, 3, 0, 0, 0, 0, 88,196, 85, 3, 0, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,197, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +168,197, 85, 3, 0, 0, 0, 0,200,196, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,197, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 24,198, 85, 3, 0, 0, 0, 0, 56,197, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,198, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +136,198, 85, 3, 0, 0, 0, 0,168,197, 85, 3, 0, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,198, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +248,198, 85, 3, 0, 0, 0, 0, 24,198, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,198, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +104,199, 85, 3, 0, 0, 0, 0,136,198, 85, 3, 0, 0, 0, 0, 56,190, 85, 3, 0, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,199, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +216,199, 85, 3, 0, 0, 0, 0,248,198, 85, 3, 0, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216,199, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 72,200, 85, 3, 0, 0, 0, 0,104,199, 85, 3, 0, 0, 0, 0,232,188, 85, 3, 0, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72,200, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +184,200, 85, 3, 0, 0, 0, 0,216,199, 85, 3, 0, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184,200, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 40,201, 85, 3, 0, 0, 0, 0, 72,200, 85, 3, 0, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0,184,193, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40,201, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +152,201, 85, 3, 0, 0, 0, 0,184,200, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0,184,193, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,201, 85, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40,201, 85, 3, 0, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0,184,193, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8,202, 85, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, +216,205, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0, 88,189, 85, 3, 0, 0, 0, 0, +200,189, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, + 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 40,193, 55, 3, 0, 0, 0, 0, +152,201, 86, 3, 0, 0, 0, 0,152,201, 86, 3, 0, 0, 0, 0,248,202, 85, 3, 0, 0, 0, 0,104,204, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,104, 96, 3, 0, 0, 0, 0, 72, 22, 94, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,248,202, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,104,204, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, + 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, + 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, + 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 2, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,195, 55, 3, 0, 0, 0, 0, +120, 77,142, 4, 0, 0, 0, 0,120, 77,142, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 24, 94, 3, 0, 0, 0, 0,232, 28, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,104,204, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +248,202, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, + 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, + 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,194, 55, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,216,205, 85, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,152, 94, 86, 3, 0, 0, 0, 0, + 8,202, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0, + 56,190, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,115, 3, 0, 0, + 4, 4, 70, 1,116, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,188, 55, 3, 0, 0, 0, 0, 72, 85, 86, 3, 0, 0, 0, 0, + 24, 93, 86, 3, 0, 0, 0, 0,200,206, 85, 3, 0, 0, 0, 0, 56,208, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200, 22, 94, 3, 0, 0, 0, 0,184, 29, 94, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +200,206, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 56,208, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,163, 67, 0, 0, 0, 0, 0, 0,248, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 70, 1, 31, 0, 70, 1, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 6, 0, 0,118, 7, 0, 0, 85, 3, 0, 0,115, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 1, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192, 55, 3, 0, 0, 0, 0,248, 24,142, 4, 0, 0, 0, 0, +248, 24,142, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 31, 94, 3, 0, 0, 0, 0, + 24, 34, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 56,208, 85, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,206, 85, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,163, 67, 0, 64, 85,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,154, 67, 0, 64, 85,196, 0, 0, 0, 0, + 53, 1, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0, 84, 3, 0, 0, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 84, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 70, 1, 85, 3, 53, 1, 85, 3, 0, 0, +104, 88,127, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 49, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 84, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 1, 85, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,189, 55, 3, 0, 0, 0, 0,152, 68,129, 4, 0, 0, 0, 0, + 40, 15, 54, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 35, 94, 3, 0, 0, 0, 0, + 72, 39, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, + 72, 85, 86, 3, 0, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0,184,172,127, 4, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,152, 94, 86, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, +152,107, 86, 3, 0, 0, 0, 0,216,205, 85, 3, 0, 0, 0, 0,232,188, 85, 3, 0, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0, +184,193, 85, 3, 0, 0, 0, 0,136,191, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, + 0, 0, 0, 0, 91, 0, 0, 0, 15, 15, 48, 6, 92, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,147, 55, 3, 0, 0, 0, 0, +104, 98, 86, 3, 0, 0, 0, 0, 24,106, 86, 3, 0, 0, 0, 0,136, 95, 86, 3, 0, 0, 0, 0,248, 96, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 30, 94, 3, 0, 0, 0, 0, 24, 40, 94, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,136, 95, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,248, 96, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,198, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, + 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 48, 6, + 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 26, 0, 5, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,149, 55, 3, 0, 0, 0, 0, +200,111,129, 4, 0, 0, 0, 0,200,111,129, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 42, 94, 3, 0, 0, 0, 0,120, 44, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,248, 96, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +136, 95, 86, 3, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, + 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 18, 0, 0, 0, 65, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, + 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 48, 6, + 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, + 26, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 66, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,148, 55, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +184, 45, 94, 3, 0, 0, 0, 0, 56, 51, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,216, 0, 0, 0,104, 98, 86, 3, 0, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,152,107, 86, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0,152,126, 86, 3, 0, 0, 0, 0,152, 94, 86, 3, 0, 0, 0, 0,104,192, 85, 3, 0, 0, 0, 0, +248,191, 85, 3, 0, 0, 0, 0, 24,191, 85, 3, 0, 0, 0, 0,216,192, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 6, 0, 0,118, 7, 0, 0,117, 3, 0, 0, 69, 4, 0, 0, 3, 3, 70, 1,209, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88,144, 55, 3, 0, 0, 0, 0,104,111, 86, 3, 0, 0, 0, 0, 24,125, 86, 3, 0, 0, 0, 0,136,108, 86, 3, 0, 0, 0, 0, +248,109, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 40, 94, 3, 0, 0, 0, 0, + 8, 52, 94, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,108, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +248,109, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0, 70, 1, 26, 0, 70, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 6, 0, 0,118, 7, 0, 0, 44, 4, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 1, 26, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +104,146, 55, 3, 0, 0, 0, 0, 56,223,128, 4, 0, 0, 0, 0, 56,223,128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248, 53, 94, 3, 0, 0, 0, 0,104, 56, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,109, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,136,108, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,154, 67, 0, 0, 37,195, 0, 0, 0, 0, 53, 1, 0, 0, 70, 1, 0, 0, 18, 0, 0, 0,182, 0, 0, 0, + 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 52, 1, 0, 0, 18, 0, 0, 0,182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, + 0, 0, 0, 4, 6, 0, 70, 1,183, 0, 53, 1,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 6, 0, 0,118, 7, 0, 0,117, 3, 0, 0, 43, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 70, 1,183, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120,145, 55, 3, 0, 0, 0, 0,184, 89,128, 4, 0, 0, 0, 0,184, 89,128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,168, 57, 94, 3, 0, 0, 0, 0, 8, 60, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0,104,111, 86, 3, 0, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248, 87,141, 4, 0, 0, 0, 0,248, 87,141, 4, 0, 0, 0, 0,216,112, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 68, 65, 84, 65, 16, 0, 0, 0,216,112, 86, 3, 0, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 56,113, 86, 3, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 56,113, 86, 3, 0, 0, 0, 0,222, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, + 20, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,104,181, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,189, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 72,129, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,200, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,200,110, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,195, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,232,176, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8,184, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 24,176, 89, 3, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,152,126, 86, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +152,107, 86, 3, 0, 0, 0, 0, 72,193, 85, 3, 0, 0, 0, 0,168,190, 85, 3, 0, 0, 0, 0,248,191, 85, 3, 0, 0, 0, 0, +184,193, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0, 69, 4, 0, 0, + 1, 1, 48, 6,233, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 88,150, 55, 3, 0, 0, 0, 0,232,183, 86, 3, 0, 0, 0, 0, +120,200, 86, 3, 0, 0, 0, 0,136,127, 86, 3, 0, 0, 0, 0,200,178, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,136, 52, 94, 3, 0, 0, 0, 0, 8, 21, 55, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +136,127, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,248,128, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64,123, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,160, 55, 3, 0, 0, 0, 0,152, 81,128, 4, 0, 0, 0, 0, +152, 81,128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 64, 94, 3, 0, 0, 0, 0, + 72, 68, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +248,128, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,200,154, 86, 3, 0, 0, 0, 0,136,127, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 67, 0,192, 37,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0,192, 37,196, 0, 0, 0, 0, +143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,150, 2, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,150, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,151, 2,143, 0,151, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,175, 1, 0, 0, 69, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,151, 2, 10, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,157, 55, 3, 0, 0, 0, 0,136, 13,129, 4, 0, 0, 0, 0, +136, 13,129, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 69, 94, 3, 0, 0, 0, 0, +248, 71, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +200,154, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216,157, 86, 3, 0, 0, 0, 0,248,128, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 33, 67, 0,128,157,195, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,136,135,157,195, 0, 0, 0, 0, +143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, 56, 1,143, 0, 56, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,119, 0, 0, 0,174, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 56, 1, 11, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,158, 55, 3, 0, 0, 0, 0,248, 8, 54, 3, 0, 0, 0, 0, +248, 8, 54, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 73, 94, 3, 0, 0, 0, 0, +168, 75, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216,157, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,200,178, 86, 3, 0, 0, 0, 0,200,154, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 67, 0,192,115,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,115,196, 0, 0, 0, 0, +163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,207, 3,163, 0,207, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,152, 55, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +200,178, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,157, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 5,207, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,151, 55, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,106, 94, 3, 0, 0, 0, 0, +216,105, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,180, 86, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, + 56,180, 86, 3, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0,255,255,139, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200,120,204, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0,218,205, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, + 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, + 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, +164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,177,157,229, 62, 64, 74, 36,191,222,160, 81,191,184,158, 81,191, +115, 90,127, 63,248, 96,158, 62, 9, 46,185, 62, 35, 44,185, 62,143,180,109,188,235, 2,183, 63,129, 63,228,190, 42, 61,228,190, + 0, 0, 0, 0, 0, 0, 0, 0, 21,163,108, 65,214,211,111, 65, 39,240,191, 62,125,116, 85, 63, 96,189, 70,188, 0, 0,186,180, + 34,195,128,190, 66, 66,248, 61,254,111, 15, 63, 0, 0,150, 52, 61,119,117,194,106,214,216, 65, 98,162, 5,194,251,254,159,192, + 72, 51,114, 66,244,243,213,193, 71,219, 3, 66,160, 0,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, + 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,177,157,229, 62, 64, 74, 36,191,222,160, 81,191,184,158, 81,191, +115, 90,127, 63,248, 96,158, 62, 9, 46,185, 62, 35, 44,185, 62,143,180,109,188,235, 2,183, 63,129, 63,228,190, 42, 61,228,190, + 0, 0, 0, 0, 0, 0, 0, 0, 21,163,108, 65,214,211,111, 65, 97,199,184, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97,199,184, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,199,184, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, +214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,142, 79,168, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, +232,183, 86, 3, 0, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 7, 0, 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +205,204,204, 61, 0, 64,156, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 78, 0, 0,208, 0, 0, 0, 40,202, 86, 3, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184,185, 87, 3, 0, 0, 0, 0, +200,187, 85, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97,109,101, 32, 76, +111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72,203, 86, 3, 0, 0, 0, 0,248,208, 86, 3, 0, 0, 0, 0,104,209, 86, 3, 0, 0, 0, 0, 40,218, 86, 3, 0, 0, 0, 0, +152,218, 86, 3, 0, 0, 0, 0,184,150, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,203, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +184,203, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,184,203, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 40,204, 86, 3, 0, 0, 0, 0, + 72,203, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 40,204, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,152,204, 86, 3, 0, 0, 0, 0,184,203, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152,204, 86, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 8,205, 86, 3, 0, 0, 0, 0, 40,204, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,205, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +120,205, 86, 3, 0, 0, 0, 0,152,204, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,120,205, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,232,205, 86, 3, 0, 0, 0, 0, + 8,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +232,205, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 88,206, 86, 3, 0, 0, 0, 0,120,205, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88,206, 86, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0,232,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 4, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 56,207, 86, 3, 0, 0, 0, 0, 88,206, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,168,207, 86, 3, 0, 0, 0, 0, +200,206, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +168,207, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 24,208, 86, 3, 0, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,124, 3, 20, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24,208, 86, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,136,208, 86, 3, 0, 0, 0, 0,168,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +124, 3,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,208, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +248,208, 86, 3, 0, 0, 0, 0, 24,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 0, 20, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,248,208, 86, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +136,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +104,209, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,216,209, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +184,203, 86, 3, 0, 0, 0, 0, 40,204, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +216,209, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 72,210, 86, 3, 0, 0, 0, 0,104,209, 86, 3, 0, 0, 0, 0, +184,203, 86, 3, 0, 0, 0, 0, 8,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 72,210, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,184,210, 86, 3, 0, 0, 0, 0,216,209, 86, 3, 0, 0, 0, 0, + 40,204, 86, 3, 0, 0, 0, 0,120,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +184,210, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 40,211, 86, 3, 0, 0, 0, 0, 72,210, 86, 3, 0, 0, 0, 0, + 8,205, 86, 3, 0, 0, 0, 0,120,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 40,211, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,152,211, 86, 3, 0, 0, 0, 0,184,210, 86, 3, 0, 0, 0, 0, + 8,205, 86, 3, 0, 0, 0, 0,232,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +152,211, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 8,212, 86, 3, 0, 0, 0, 0, 40,211, 86, 3, 0, 0, 0, 0, +232,205, 86, 3, 0, 0, 0, 0, 88,206, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 8,212, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,120,212, 86, 3, 0, 0, 0, 0,152,211, 86, 3, 0, 0, 0, 0, +152,204, 86, 3, 0, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +120,212, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,232,212, 86, 3, 0, 0, 0, 0, 8,212, 86, 3, 0, 0, 0, 0, + 88,206, 86, 3, 0, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +232,212, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 88,213, 86, 3, 0, 0, 0, 0,120,212, 86, 3, 0, 0, 0, 0, + 72,203, 86, 3, 0, 0, 0, 0,232,205, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 88,213, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200,213, 86, 3, 0, 0, 0, 0,232,212, 86, 3, 0, 0, 0, 0, + 72,203, 86, 3, 0, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +200,213, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 56,214, 86, 3, 0, 0, 0, 0, 88,213, 86, 3, 0, 0, 0, 0, +120,205, 86, 3, 0, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 56,214, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,168,214, 86, 3, 0, 0, 0, 0,200,213, 86, 3, 0, 0, 0, 0, +152,204, 86, 3, 0, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +168,214, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 24,215, 86, 3, 0, 0, 0, 0, 56,214, 86, 3, 0, 0, 0, 0, + 88,206, 86, 3, 0, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 24,215, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,136,215, 86, 3, 0, 0, 0, 0,168,214, 86, 3, 0, 0, 0, 0, +168,207, 86, 3, 0, 0, 0, 0, 24,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +136,215, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,248,215, 86, 3, 0, 0, 0, 0, 24,215, 86, 3, 0, 0, 0, 0, +120,205, 86, 3, 0, 0, 0, 0, 24,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +248,215, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,104,216, 86, 3, 0, 0, 0, 0,136,215, 86, 3, 0, 0, 0, 0, + 56,207, 86, 3, 0, 0, 0, 0,168,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +104,216, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,216,216, 86, 3, 0, 0, 0, 0,248,215, 86, 3, 0, 0, 0, 0, +232,205, 86, 3, 0, 0, 0, 0,136,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +216,216, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 72,217, 86, 3, 0, 0, 0, 0,104,216, 86, 3, 0, 0, 0, 0, +168,207, 86, 3, 0, 0, 0, 0,136,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 72,217, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,184,217, 86, 3, 0, 0, 0, 0,216,216, 86, 3, 0, 0, 0, 0, + 8,205, 86, 3, 0, 0, 0, 0,248,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +184,217, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 40,218, 86, 3, 0, 0, 0, 0, 72,217, 86, 3, 0, 0, 0, 0, + 24,208, 86, 3, 0, 0, 0, 0,248,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 40,218, 86, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,217, 86, 3, 0, 0, 0, 0, +136,208, 86, 3, 0, 0, 0, 0,248,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +152,218, 86, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,104,222, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8,205, 86, 3, 0, 0, 0, 0,184,203, 86, 3, 0, 0, 0, 0, 40,204, 86, 3, 0, 0, 0, 0,120,205, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,185, 87, 3, 0, 0, 0, 0, 40,185, 87, 3, 0, 0, 0, 0, +136,219, 86, 3, 0, 0, 0, 0,248,220, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,219, 86, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,248,220, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,220, 86, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,219, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, + 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, + 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, + 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,222, 86, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0, 8, 6, 87, 3, 0, 0, 0, 0,152,218, 86, 3, 0, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0, + 88,206, 86, 3, 0, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0,152,204, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 4, 4,234, 0, 20, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,184,245, 86, 3, 0, 0, 0, 0,136, 4, 87, 3, 0, 0, 0, 0, 88,223, 86, 3, 0, 0, 0, 0, +200,224, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,223, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +200,224, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 55, 0, 0,106, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0,234, 0, 31, 0,234, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,254, 4, 0, 0,245, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +234, 0, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,224, 86, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88,223, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 67, 0, 64, 80,196, 0, 0, 0, 0, + 0, 0, 0, 0,254,255, 88, 67,254,255,116,195, 0, 0, 0, 0,217, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0,244, 0, 0, 0, + 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0,244, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 4, 6, 0,234, 0,245, 0,217, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 4, 0, 0,254, 4, 0, 0, 0, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +234, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,245, 86, 3, 0, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 8, 6, 87, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 8, 79, 87, 3, 0, 0, 0, 0,104,222, 86, 3, 0, 0, 0, 0, + 72,203, 86, 3, 0, 0, 0, 0,232,205, 86, 3, 0, 0, 0, 0, 88,206, 86, 3, 0, 0, 0, 0,200,206, 86, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 17, 17, 20, 4, 20, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 12, 87, 3, 0, 0, 0, 0,232, 77, 87, 3, 0, 0, 0, 0, +248, 6, 87, 3, 0, 0, 0, 0,120, 11, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 6, 87, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,104, 8, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 8, 87, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,120, 11, 87, 3, 0, 0, 0, 0,248, 6, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, + 0, 0,122,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,122,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, + 0, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, + 0, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,250, 0,203, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,220, 0,250, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120, 11, 87, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 8, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, + 0, 0, 0, 0, 0, 0,112, 67, 4, 0, 39,195, 0,224,180, 68, 1, 0,224,194, 0, 0,176, 67, 39, 3, 0, 0, 56, 3, 0, 0, + 18, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 38, 3, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 38, 3, 0, 0, + 18, 0, 0, 0,249, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, + 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 56, 3,250, 0, 39, 3,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 19, 4, 0, 0, 26, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 3,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0,232, 12, 87, 3, 0, 0, 0, 0, +178, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8, 79, 87, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0,184,110, 87, 3, 0, 0, 0, 0, 8, 6, 87, 3, 0, 0, 0, 0,168,207, 86, 3, 0, 0, 0, 0, + 24,208, 86, 3, 0, 0, 0, 0,120,205, 86, 3, 0, 0, 0, 0, 56,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +125, 3, 0, 0,254, 4, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 9, 9,130, 1,166, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,216, 82, 87, 3, 0, 0, 0, 0, 56,109, 87, 3, 0, 0, 0, 0,248, 79, 87, 3, 0, 0, 0, 0, +104, 81, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 79, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +104, 81, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0,193, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0,128,181, 67, 0, 0,200, 65, 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0,130, 1, 26, 0,130, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +125, 3, 0, 0,254, 4, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +130, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 81, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248, 79, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, + 0, 0, 0, 0,131,248, 1, 68, 0, 0, 0, 0,126, 86, 5, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,139, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, + 0, 0, 0, 4, 10, 0,130, 1,140, 1,130, 1,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +125, 3, 0, 0,254, 4, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +130, 1,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 2, 0, 0,216, 82, 87, 3, 0, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,110, 87, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0,184,150, 87, 3, 0, 0, 0, 0, 8, 79, 87, 3, 0, 0, 0, 0,136,208, 86, 3, 0, 0, 0, 0, +248,208, 86, 3, 0, 0, 0, 0, 24,208, 86, 3, 0, 0, 0, 0,168,207, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +213, 0, 0, 0,123, 3, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 1, 1,167, 2,166, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,232,133, 87, 3, 0, 0, 0, 0,152,149, 87, 3, 0, 0, 0, 0,168,111, 87, 3, 0, 0, 0, 0, +200,128, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,111, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 24,113, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 56, 0,192, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0,167, 2, 26, 0,167, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +213, 0, 0, 0,123, 3, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +167, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,113, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +136,114, 87, 3, 0, 0, 0, 0,168,111, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +213, 0, 0, 0,213, 0, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0,140, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,114, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +248,115, 87, 3, 0, 0, 0, 0, 24,113, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, + 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +213, 0, 0, 0,123, 3, 0, 0, 47, 1, 0, 0, 47, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,115, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, +200,128, 87, 3, 0, 0, 0, 0,136,114, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 23,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0, + 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, + 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +123, 3, 0, 0,123, 3, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,128, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248,115, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +213, 0, 0, 0,123, 3, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +167, 2,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56,130, 87, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 56,130, 87, 3, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, +190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167,147,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167,147,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +149, 53,207, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126,177,113, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,121,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167,147,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149, 53,207, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 63,156, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,232,133, 87, 3, 0, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 8,184, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, + 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,150, 87, 3, 0, 0, 0, 0, +199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,110, 87, 3, 0, 0, 0, 0,232,205, 86, 3, 0, 0, 0, 0, + 8,205, 86, 3, 0, 0, 0, 0,248,208, 86, 3, 0, 0, 0, 0,136,208, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,211, 0, 0, 0, 21, 1, 0, 0,186, 2, 0, 0, 3, 3,212, 0,166, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,136,154, 87, 3, 0, 0, 0, 0, 8,184, 87, 3, 0, 0, 0, 0,168,151, 87, 3, 0, 0, 0, 0, + 24,153, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,151, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 24,153, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 84, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 83, 67, 0, 0,200, 65, 0, 0, 83, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, + 4, 0, 12, 4, 10, 0,212, 0, 26, 0,212, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,211, 0, 0, 0, 21, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +212, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,153, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,168,151, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, + 0, 0, 80, 66, 0, 0,119, 67, 0, 0,189,195, 0, 0, 0, 0,195, 0, 0, 0,212, 0, 0, 0, 18, 0, 0, 0,139, 1, 0, 0, + 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 18, 0, 0, 0,139, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, + 0, 0, 0, 4, 6, 0,212, 0,140, 1,195, 0,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,211, 0, 0, 0, 47, 1, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +212, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0,136,154, 87, 3, 0, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,155, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 68, 65, 84, 65, 16, 0, 0, 0,248,155, 87, 3, 0, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, + 88,156, 87, 3, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, 88,156, 87, 3, 0, 0, 0, 0,222, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, + 20, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,104,181, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,189, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 72,129, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,200, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,200,110, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,195, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,232,176, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 8,184, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 24,176, 89, 3, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,184,185, 87, 3, 0, 0, 0, 0, +195, 0, 0, 0, 1, 0, 0, 0,104,164, 88, 3, 0, 0, 0, 0, 40,202, 86, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,186, 87, 3, 0, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0, +104,193, 87, 3, 0, 0, 0, 0, 8,203, 87, 3, 0, 0, 0, 0,120,203, 87, 3, 0, 0, 0, 0,120,129, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +216,186, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 72,187, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,187, 87, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,184,187, 87, 3, 0, 0, 0, 0,216,186, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,187, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 40,188, 87, 3, 0, 0, 0, 0, 72,187, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 40,188, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0, +184,187, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +152,188, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0, 40,188, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4,187, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +232,189, 87, 3, 0, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 3,187, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,232,189, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0, +120,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 88,190, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0,232,189, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 56,191, 87, 3, 0, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +244, 3, 28, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,191, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +168,191, 87, 3, 0, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0, + 56,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 28, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 24,192, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,244, 3, 12, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4, 12, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1,187, 2, 1, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,104,193, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,216,193, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 72,187, 87, 3, 0, 0, 0, 0,184,187, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,216,193, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 72,194, 87, 3, 0, 0, 0, 0, +104,193, 87, 3, 0, 0, 0, 0, 72,187, 87, 3, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72,194, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,184,194, 87, 3, 0, 0, 0, 0, +216,193, 87, 3, 0, 0, 0, 0,184,187, 87, 3, 0, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,184,194, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 40,195, 87, 3, 0, 0, 0, 0, + 72,194, 87, 3, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 40,195, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,152,195, 87, 3, 0, 0, 0, 0, +184,194, 87, 3, 0, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,152,195, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 8,196, 87, 3, 0, 0, 0, 0, + 40,195, 87, 3, 0, 0, 0, 0, 40,188, 87, 3, 0, 0, 0, 0,232,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 8,196, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,120,196, 87, 3, 0, 0, 0, 0, +152,195, 87, 3, 0, 0, 0, 0,216,186, 87, 3, 0, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,120,196, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,232,196, 87, 3, 0, 0, 0, 0, + 8,196, 87, 3, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,232,196, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 88,197, 87, 3, 0, 0, 0, 0, +120,196, 87, 3, 0, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 88,197, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200,197, 87, 3, 0, 0, 0, 0, +232,196, 87, 3, 0, 0, 0, 0,232,189, 87, 3, 0, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,200,197, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 56,198, 87, 3, 0, 0, 0, 0, + 88,197, 87, 3, 0, 0, 0, 0,216,186, 87, 3, 0, 0, 0, 0, 56,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 56,198, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,168,198, 87, 3, 0, 0, 0, 0, +200,197, 87, 3, 0, 0, 0, 0,232,189, 87, 3, 0, 0, 0, 0, 56,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,168,198, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 24,199, 87, 3, 0, 0, 0, 0, + 56,198, 87, 3, 0, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 24,199, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,136,199, 87, 3, 0, 0, 0, 0, +168,198, 87, 3, 0, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,136,199, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,248,199, 87, 3, 0, 0, 0, 0, + 24,199, 87, 3, 0, 0, 0, 0, 56,191, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,248,199, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,104,200, 87, 3, 0, 0, 0, 0, +136,199, 87, 3, 0, 0, 0, 0,232,189, 87, 3, 0, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,104,200, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,216,200, 87, 3, 0, 0, 0, 0, +248,199, 87, 3, 0, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,216,200, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 72,201, 87, 3, 0, 0, 0, 0, +104,200, 87, 3, 0, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72,201, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,184,201, 87, 3, 0, 0, 0, 0, +216,200, 87, 3, 0, 0, 0, 0, 40,188, 87, 3, 0, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,184,201, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 40,202, 87, 3, 0, 0, 0, 0, + 72,201, 87, 3, 0, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 40,202, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,152,202, 87, 3, 0, 0, 0, 0, +184,201, 87, 3, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,152,202, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 8,203, 87, 3, 0, 0, 0, 0, + 40,202, 87, 3, 0, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 8,203, 87, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +152,202, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,120,203, 87, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 72,207, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0, 72,187, 87, 3, 0, 0, 0, 0,184,187, 87, 3, 0, 0, 0, 0, + 8,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, + 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,163, 88, 3, 0, 0, 0, 0, +216,163, 88, 3, 0, 0, 0, 0,104,204, 87, 3, 0, 0, 0, 0,216,205, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +104,204, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216,205, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216,205, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,204, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, +112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 72,207, 87, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,232,246, 87, 3, 0, 0, 0, 0,120,203, 87, 3, 0, 0, 0, 0, +232,189, 87, 3, 0, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0,136,192, 87, 3, 0, 0, 0, 0, 40,188, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 11, 2, 0, 0, 4, 4, 10, 1, 12, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,230, 87, 3, 0, 0, 0, 0,104,245, 87, 3, 0, 0, 0, 0, + 56,208, 87, 3, 0, 0, 0, 0,168,209, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,208, 87, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,168,209, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,133, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 0, + 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 10, 1, 31, 0, 10, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0,237, 1, 0, 0, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,209, 87, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,208, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,132, 67, + 0, 64, 80,196, 0, 0, 0, 0, 0, 0, 0, 0,255,255,120, 67,255,127,246,195, 0, 0, 0, 0,249, 0, 0, 0, 10, 1, 0, 0, + 0, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, + 0, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 10, 1,237, 1,249, 0,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 0, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 1,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,230, 87, 3, 0, 0, 0, 0, +165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,232,246, 87, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 8, 30, 88, 3, 0, 0, 0, 0, + 72,207, 87, 3, 0, 0, 0, 0, 56,191, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0,200,190, 87, 3, 0, 0, 0, 0, +232,189, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 0, 0, 0, 0, 27, 1, 0, 0, + 18, 18,251, 1, 28, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,250, 87, 3, 0, 0, 0, 0, +232, 28, 88, 3, 0, 0, 0, 0,216,247, 87, 3, 0, 0, 0, 0, 72,249, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216,247, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 72,249, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 76, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,253, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,251, 1, 26, 0,251, 1, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 72,249, 87, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,247, 87, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,253, 67, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0, 0,245, 67, 0, 0, 0, 0, 0, 0,129, 67, +234, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,233, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,251, 1, 2, 1,234, 1, 2, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 26, 0, 0, 0, 27, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 1, 0, 0, +184,250, 87, 3, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0, 8, 30, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,104, 64, 88, 3, 0, 0, 0, 0, +232,246, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0, +200,190, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 29, 1, 0, 0,186, 2, 0, 0, + 1, 1,251, 1,158, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 41, 88, 3, 0, 0, 0, 0, + 72, 63, 88, 3, 0, 0, 0, 0,248, 30, 88, 3, 0, 0, 0, 0,184, 36, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +248, 30, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,104, 32, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,253, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,251, 1, 26, 0,251, 1, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 29, 1, 0, 0, 54, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +104, 32, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216, 33, 88, 3, 0, 0, 0, 0,248, 30, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0, +143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,249, 1, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,132, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216, 33, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 72, 35, 88, 3, 0, 0, 0, 0,104, 32, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0, +143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 55, 1, 0, 0, 55, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 72, 35, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,184, 36, 88, 3, 0, 0, 0, 0,216, 33, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0, +163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 3, 0, 0,243, 3, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +184, 36, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 35, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249, 1, 0, 0,243, 3, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 38, 88, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, + 40, 38, 88, 3, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 42,240,182, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, + 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, + 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, +164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63,178,157,229, 62,242,252, 18,191,222,160, 81,191,184,158, 81,191, +117, 90,127, 63, 8,179,141, 62, 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,225,188,163, 63,129, 63,228,190, 42, 61,228,190, + 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65,217,236,191, 62, 54,117, 85, 63, 0,247, 70,188, 0,192, 32,182, + 15,232,143,190,210,186, 10, 62, 44, 83, 32, 63, 0,192, 24, 54,215,104, 25,196,133,132,135, 67, 37, 9,167,195,136,252, 71,194, + 3, 54, 25, 68,158, 87,135,195,205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, + 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63,178,157,229, 62,242,252, 18,191,222,160, 81,191,184,158, 81,191, +117, 90,127, 63, 8,179,141, 62, 9, 46,185, 62, 35, 44,185, 62,145,180,109,188,225,188,163, 63,129, 63,228,190, 42, 61,228,190, + 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, +214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,138, 93,108, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, +216, 41, 88, 3, 0, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 7, 0, 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,104, 64, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,136,103, 88, 3, 0, 0, 0, 0, + 8, 30, 88, 3, 0, 0, 0, 0,216,186, 87, 3, 0, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0,168,191, 87, 3, 0, 0, 0, 0, + 56,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 27, 1, 0, 0, + 18, 18,248, 1, 28, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 68, 88, 3, 0, 0, 0, 0, +104,102, 88, 3, 0, 0, 0, 0, 88, 65, 88, 3, 0, 0, 0, 0,200, 66, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 88, 65, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,200, 66, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,231, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,252, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,248, 1, 26, 0,248, 1, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +200, 66, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 65, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,251, 67, 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0, 0,128,243, 67, 0, 0, 0, 0, 0, 0,129, 67, +231, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,248, 1, 2, 1,231, 1, 2, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 26, 0, 0, 0, 27, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 1, 0, 0, + 56, 68, 88, 3, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104,111,110, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,136,103, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,120,129, 88, 3, 0, 0, 0, 0, +104, 64, 88, 3, 0, 0, 0, 0, 24,192, 87, 3, 0, 0, 0, 0,120,189, 87, 3, 0, 0, 0, 0, 8,189, 87, 3, 0, 0, 0, 0, +136,192, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 13, 2, 0, 0,186, 2, 0, 0, + 3, 3, 10, 1,174, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,107, 88, 3, 0, 0, 0, 0, +248,127, 88, 3, 0, 0, 0, 0,120,104, 88, 3, 0, 0, 0, 0,232,105, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +120,104, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,232,105, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,163, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,133, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, 0,128,149, 67, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 10, 1, 26, 0, 10, 1, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 13, 2, 0, 0, 38, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +232,105, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,104, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,121, 67, 0, 0, 2,195, 0, 0, 0, 0, +249, 0, 0, 0, 10, 1, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 10, 1,148, 0,249, 0,130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 3, 0, 0,254, 4, 0, 0, 39, 2, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1,148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0, + 88,107, 88, 3, 0, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,200,108, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,200,108, 88, 3, 0, 0, 0, 0, +223, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 40,109, 88, 3, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, + 40,109, 88, 3, 0, 0, 0, 0,222, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, + 19, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, + 21, 0, 1, 0, 1, 0, 1, 0,120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,104,181, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 40,189, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,129, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,232,200, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,110, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,200,195, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,176, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 24,176, 89, 3, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,120,129, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +136,103, 88, 3, 0, 0, 0, 0, 88,190, 87, 3, 0, 0, 0, 0,152,188, 87, 3, 0, 0, 0, 0,248,192, 87, 3, 0, 0, 0, 0, +168,191, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 29, 1, 0, 0,186, 2, 0, 0, + 9, 9,248, 1,158, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,133, 88, 3, 0, 0, 0, 0, +184,162, 88, 3, 0, 0, 0, 0,104,130, 88, 3, 0, 0, 0, 0,216,131, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +104,130, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216,131, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 73, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,252, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,248, 1, 26, 0,248, 1, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 29, 1, 0, 0, 54, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216,131, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,130, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,236,140, 21, 68, 20, 51,102, 68,120, 83, 49, 67, 68,214,212, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,247, 1, 0, 0, 0, 0, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,248, 1,132, 1,248, 1,132, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 1, 0, 0, 55, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 1,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 2, 0, 0, + 72,133, 88, 3, 0, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,231, 1, 0, 0,243, 1, 0, 0, +122, 1, 0, 0,124, 1, 0, 0,231, 1, 0, 0,243, 1, 0, 0, 4, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 78, 0, 0,208, 0, 0, 0,104,164, 88, 3, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248, 10, 89, 3, 0, 0, 0, 0, +184,185, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105, +116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +136,165, 88, 3, 0, 0, 0, 0,152,168, 88, 3, 0, 0, 0, 0, 8,169, 88, 3, 0, 0, 0, 0,104,173, 88, 3, 0, 0, 0, 0, +216,173, 88, 3, 0, 0, 0, 0,120,234, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +120,159, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,165, 88, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +248,165, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,248,165, 88, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,104,166, 88, 3, 0, 0, 0, 0, +136,165, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +104,166, 88, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,216,166, 88, 3, 0, 0, 0, 0,248,165, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216,166, 88, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0,104,166, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +184,167, 88, 3, 0, 0, 0, 0,216,166, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0, + 72,167, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 40,168, 88, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,152,168, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,132, 2,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152,168, 88, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +132, 2, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8,169, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +120,169, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,165, 88, 3, 0, 0, 0, 0,104,166, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120,169, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +232,169, 88, 3, 0, 0, 0, 0, 8,169, 88, 3, 0, 0, 0, 0,248,165, 88, 3, 0, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232,169, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 88,170, 88, 3, 0, 0, 0, 0,120,169, 88, 3, 0, 0, 0, 0,104,166, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,170, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +200,170, 88, 3, 0, 0, 0, 0,232,169, 88, 3, 0, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,170, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 56,171, 88, 3, 0, 0, 0, 0, 88,170, 88, 3, 0, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,171, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +168,171, 88, 3, 0, 0, 0, 0,200,170, 88, 3, 0, 0, 0, 0,136,165, 88, 3, 0, 0, 0, 0,152,168, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,171, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 24,172, 88, 3, 0, 0, 0, 0, 56,171, 88, 3, 0, 0, 0, 0,136,165, 88, 3, 0, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,172, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +136,172, 88, 3, 0, 0, 0, 0,168,171, 88, 3, 0, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0,152,168, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,172, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +248,172, 88, 3, 0, 0, 0, 0, 24,172, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,172, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, +104,173, 88, 3, 0, 0, 0, 0,136,172, 88, 3, 0, 0, 0, 0,216,166, 88, 3, 0, 0, 0, 0,152,168, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104,173, 88, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,248,172, 88, 3, 0, 0, 0, 0,216,166, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,216,173, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, +168,177, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0,248,165, 88, 3, 0, 0, 0, 0, +104,166, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, +188, 2, 0, 0,214, 2, 0, 0, 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +104, 10, 89, 3, 0, 0, 0, 0,104, 10, 89, 3, 0, 0, 0, 0,200,174, 88, 3, 0, 0, 0, 0, 56,176, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,200,174, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 56,176, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, + 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, + 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, +188, 2, 0, 0,213, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 56,176, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +200,174, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, + 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, + 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +214, 2, 0, 0,214, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,168,177, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,120,234, 88, 3, 0, 0, 0, 0, +216,173, 88, 3, 0, 0, 0, 0,136,165, 88, 3, 0, 0, 0, 0, 72,167, 88, 3, 0, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0, +152,168, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 2, 0, 0, 0, 0, 0, 0,186, 2, 0, 0, + 6, 6,132, 2,187, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,184, 88, 3, 0, 0, 0, 0, + 88,233, 88, 3, 0, 0, 0, 0,152,178, 88, 3, 0, 0, 0, 0, 24,183, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +152,178, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 8,180, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,202, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 33, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,131, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,132, 2, 26, 0,132, 2, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 8,180, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 24,183, 88, 3, 0, 0, 0, 0,152,178, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 67, 0, 0, 40,196, 0, 0, 0, 0, 0, 0, 0, 0,254,255, 74, 67,254, 63, 40,196, 0, 0, 0, 0, +203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,160, 2, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,160, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,161, 2,203, 0,161, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,161, 2, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 24,183, 88, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,180, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,102,102, 38,190,205,204,148, 63, 51, 51, 13,191,154,153,198, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,168, 1, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0,131, 2, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 1,161, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 33, 0, 0, +136,184, 88, 3, 0, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0, +154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +120,234, 88, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,177, 88, 3, 0, 0, 0, 0, +152,168, 88, 3, 0, 0, 0, 0, 40,168, 88, 3, 0, 0, 0, 0,184,167, 88, 3, 0, 0, 0, 0,216,166, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,133, 2, 0, 0,254, 4, 0, 0, 0, 0, 0, 0,186, 2, 0, 0, 1, 1,122, 2,187, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 89, 3, 0, 0, 0, 0, 72, 9, 89, 3, 0, 0, 0, 0, +104,235, 88, 3, 0, 0, 0, 0,200,255, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,235, 88, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,216,236, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,102, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 30, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,121, 2, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,122, 2, 26, 0,122, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,133, 2, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,122, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,236, 88, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,136,241, 88, 3, 0, 0, 0, 0,104,235, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67, + 0, 64, 10,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 10,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, + 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, + 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0, 41, 2,143, 0, 41, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,133, 2, 0, 0, 36, 3, 0, 0,146, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 41, 2, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,241, 88, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,152,244, 88, 3, 0, 0, 0, 0,216,236, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, + 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, + 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, + 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,133, 2, 0, 0, 36, 3, 0, 0, 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,244, 88, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,200,255, 88, 3, 0, 0, 0, 0,136,241, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, + 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, + 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, + 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,254, 4, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,255, 88, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,244, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 3, 0, 0,254, 4, 0, 0, 26, 0, 0, 0,186, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,218, 1,161, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 1, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 56, 1, 89, 3, 0, 0, 0, 0, +159, 0, 0, 0, 1, 0, 0, 0,193,198,198, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, + 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, + 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62, +166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64,136, 95,161,191, +147,231,198, 63, 0, 0,128, 63, 12, 2, 35, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,130, 71,181, 63,140,225, 88, 62, + 26, 63,185, 62, 35, 44,185, 62, 49,192,168,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, +101, 98, 82, 64, 0, 25, 95, 64,101, 47,135, 62,134, 86, 22, 63, 32,243, 11,188, 0, 0,160,179,195, 15,188,190,132, 75, 53, 62, +216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 17,173,201, 64,181,148,248,192,202,247,159,192,233, 74, 87, 65,247, 46,190,192, + 88,106,234, 64, 44, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, + 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 95,192, 0, 0,128, 63, 12, 2, 35, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,130, 71,181, 63,140,225, 88, 62, + 26, 63,185, 62, 35, 44,185, 62, 49,192,168,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, +101, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, 0, 25, 95, 64, + 0, 0, 0, 0, 0, 0, 0, 0,116, 16, 50, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,232, 4, 89, 3, 0, 0, 0, 0, +160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, + 8,184, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, +248, 10, 89, 3, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,164, 88, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 12, 89, 3, 0, 0, 0, 0, +232, 16, 89, 3, 0, 0, 0, 0, 88, 17, 89, 3, 0, 0, 0, 0,200, 24, 89, 3, 0, 0, 0, 0, 56, 25, 89, 3, 0, 0, 0, 0, +152,134, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 24, 12, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,136, 12, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +136, 12, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,248, 12, 89, 3, 0, 0, 0, 0, 24, 12, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 12, 89, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,104, 13, 89, 3, 0, 0, 0, 0,136, 12, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4,214, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104, 13, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +216, 13, 89, 3, 0, 0, 0, 0,248, 12, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0, +104, 13, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 72, 14, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,254, 4,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +254, 4, 84, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, +152, 15, 89, 3, 0, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0, + 40, 15, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 2,187, 2, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 8, 16, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0, +196, 0, 0, 0, 1, 0, 0, 0,232, 16, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 2, 84, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232, 16, 89, 3, 0, 0, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 64, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 88, 17, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200, 17, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,136, 12, 89, 3, 0, 0, 0, 0,248, 12, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,200, 17, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 56, 18, 89, 3, 0, 0, 0, 0, + 88, 17, 89, 3, 0, 0, 0, 0,136, 12, 89, 3, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 56, 18, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,168, 18, 89, 3, 0, 0, 0, 0, +200, 17, 89, 3, 0, 0, 0, 0,248, 12, 89, 3, 0, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,168, 18, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 24, 19, 89, 3, 0, 0, 0, 0, + 56, 18, 89, 3, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 24, 19, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,136, 19, 89, 3, 0, 0, 0, 0, +168, 18, 89, 3, 0, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,136, 19, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,248, 19, 89, 3, 0, 0, 0, 0, + 24, 19, 89, 3, 0, 0, 0, 0, 24, 12, 89, 3, 0, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,248, 19, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,104, 20, 89, 3, 0, 0, 0, 0, +136, 19, 89, 3, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,104, 20, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,216, 20, 89, 3, 0, 0, 0, 0, +248, 19, 89, 3, 0, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,216, 20, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 72, 21, 89, 3, 0, 0, 0, 0, +104, 20, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72, 21, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,184, 21, 89, 3, 0, 0, 0, 0, +216, 20, 89, 3, 0, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,184, 21, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 40, 22, 89, 3, 0, 0, 0, 0, + 72, 21, 89, 3, 0, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0,232, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 40, 22, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,152, 22, 89, 3, 0, 0, 0, 0, +184, 21, 89, 3, 0, 0, 0, 0,104, 13, 89, 3, 0, 0, 0, 0,232, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,152, 22, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 8, 23, 89, 3, 0, 0, 0, 0, + 40, 22, 89, 3, 0, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0,232, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 8, 23, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,120, 23, 89, 3, 0, 0, 0, 0, +152, 22, 89, 3, 0, 0, 0, 0, 24, 12, 89, 3, 0, 0, 0, 0,104, 13, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,120, 23, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,232, 23, 89, 3, 0, 0, 0, 0, + 8, 23, 89, 3, 0, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,232, 23, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 88, 24, 89, 3, 0, 0, 0, 0, +120, 23, 89, 3, 0, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 88, 24, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200, 24, 89, 3, 0, 0, 0, 0, +232, 23, 89, 3, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,200, 24, 89, 3, 0, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88, 24, 89, 3, 0, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0, 56, 25, 89, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 8, 29, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0,136, 12, 89, 3, 0, 0, 0, 0,248, 12, 89, 3, 0, 0, 0, 0, + 72, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,214, 2, 0, 0, + 7, 7,255, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,158, 89, 3, 0, 0, 0, 0, +232,158, 89, 3, 0, 0, 0, 0, 40, 26, 89, 3, 0, 0, 0, 0,152, 27, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 40, 26, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,152, 27, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,224,162, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,188, 2, 0, 0,213, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +152, 27, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 26, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0, +112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 2, 0, 0,214, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 8, 29, 89, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 8, 42, 89, 3, 0, 0, 0, 0, 56, 25, 89, 3, 0, 0, 0, 0, + 24, 12, 89, 3, 0, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0,232, 16, 89, 3, 0, 0, 0, 0,104, 13, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 15, 15,255, 4, 64, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 32, 89, 3, 0, 0, 0, 0,136, 40, 89, 3, 0, 0, 0, 0, +248, 29, 89, 3, 0, 0, 0, 0,104, 31, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 29, 89, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0,104, 31, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,140, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 31, 89, 3, 0, 0, 0, 0, +200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 29, 89, 3, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, + 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, + 18, 0, 0, 0, 37, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, + 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0,255, 4, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 26, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216, 32, 89, 3, 0, 0, 0, 0, +176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0, 8, 42, 89, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 88, 66, 89, 3, 0, 0, 0, 0, + 8, 29, 89, 3, 0, 0, 0, 0, 40, 15, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0,184, 14, 89, 3, 0, 0, 0, 0, +232, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 65, 0, 0, 0, 83, 1, 0, 0, + 8, 8,255, 4, 19, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 48, 89, 3, 0, 0, 0, 0, + 56, 65, 89, 3, 0, 0, 0, 0,248, 42, 89, 3, 0, 0, 0, 0, 72, 47, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +248, 42, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,104, 44, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 39, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, 0, 96,191, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,255, 4, 26, 0,255, 4, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0, 65, 0, 0, 0, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +104, 44, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216, 45, 89, 3, 0, 0, 0, 0,248, 42, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,121,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,121,195, 0, 0, 0, 0, +203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,249, 0,203, 0,249, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 4, 0, 0,254, 4, 0, 0, 91, 0, 0, 0, 83, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,249, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216, 45, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 72, 47, 89, 3, 0, 0, 0, 0,104, 44, 89, 3, 0, 0, 0, 0, + 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70, +172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 0, 0, 83, 1, 0, 0, 83, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 72, 47, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 45, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,248, 0, 0, 0, 18, 0, 0, 0, 34, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 18, 0, 0, 0, 34, 4, 0, 0, 18, 0, 0, 0,248, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, + 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0, 35, 4,249, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 0, 0, 91, 0, 0, 0, 83, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 4,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, +184, 48, 89, 3, 0, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0, 88, 66, 89, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0,152,134, 89, 3, 0, 0, 0, 0, + 8, 42, 89, 3, 0, 0, 0, 0, 8, 16, 89, 3, 0, 0, 0, 0,216, 13, 89, 3, 0, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0, +120, 16, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, 85, 1, 0, 0,186, 2, 0, 0, + 2, 2, 52, 2,102, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 73, 89, 3, 0, 0, 0, 0, +120,133, 89, 3, 0, 0, 0, 0, 72, 67, 89, 3, 0, 0, 0, 0,152, 71, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 72, 67, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,184, 68, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 93, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 13, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 51, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 52, 2, 26, 0, 52, 2, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, 85, 1, 0, 0,110, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +184, 68, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 40, 70, 89, 3, 0, 0, 0, 0, 72, 67, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,157,195, 0, 0, 0, 0, +200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0, 76, 1,200, 0, 58, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,111, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 76, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 40, 70, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,152, 71, 89, 3, 0, 0, 0, 0,184, 68, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 2, 0, 0, 51, 2, 0, 0,111, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +152, 71, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 70, 89, 3, 0, 0, 0, 0, + 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, + 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0, 90, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 18, 0, 0, 0, 90, 1, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, + 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 91, 1, 76, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 51, 2, 0, 0,111, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 1, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, + 8, 73, 89, 3, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 74, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0, 72, 74, 89, 3, 0, 0, 0, 0, 24, 1, 0, 0, 1, 0, 0, 0,120,159, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,152,134, 89, 3, 0, 0, 0, 0,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88, 66, 89, 3, 0, 0, 0, 0,120, 16, 89, 3, 0, 0, 0, 0,152, 15, 89, 3, 0, 0, 0, 0, 72, 14, 89, 3, 0, 0, 0, 0, +184, 14, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0,254, 4, 0, 0, 85, 1, 0, 0,186, 2, 0, 0, + 8, 8,202, 2,102, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,141, 89, 3, 0, 0, 0, 0, +200,157, 89, 3, 0, 0, 0, 0,136,135, 89, 3, 0, 0, 0, 0,216,139, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +136,135, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,248,136, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,192, 15, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 50, 68, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65, 0, 64, 50, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,202, 2, 26, 0,202, 2, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0,254, 4, 0, 0, 85, 1, 0, 0,110, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +248,136, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,104,138, 89, 3, 0, 0, 0, 0,136,135, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 4, 0, 0,254, 4, 0, 0,111, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +104,138, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0,216,139, 89, 3, 0, 0, 0, 0,248,136, 89, 3, 0, 0, 0, 0, + 0, 0,112,195, 0, 0,112, 67, 0, 0, 7,195, 0, 0, 7, 67,105, 42,145,196,105, 42,145, 68, 0, 0, 7,196, 0, 0, 7, 68, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70, +172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, 0, 0,202, 2, 76, 1,202, 2, 76, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0,254, 4, 0, 0,111, 1, 0, 0,186, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 2, 76, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +216,139, 89, 3, 0, 0, 0, 0,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,138, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 18, 0, 0, 0,201, 2, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, + 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2, 76, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, + 72,141, 89, 3, 0, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 67, 0, 0, 8, 6, 0, 0,120,159, 89, 3, 0, 0, 0, 0,157, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0, +116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200,165, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8,184, 89, 3, 0, 0, 0, 0,104,181, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56,168, 89, 3, 0, 0, 0, 0, 24,169, 89, 3, 0, 0, 0, 0, 56,168, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,169, 89, 3, 0, 0, 0, 0, +184, 55,127, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, +250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 6, 0, 50, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 1, 0, + 0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 8, 0, 24, 0, 10, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,175, 89, 3, 0, 0, 0, 0, 40,175, 89, 3, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 98, 97, 99,107, 98,117,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63, +173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78, 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +144,175, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,141, 90, 3, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 32, 0, 32, 0, 1, 0, 0, 0, + 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 96, 0, 0, 0,200,165, 89, 3, 0, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,166, 89, 3, 0, 0, 0, 0, +120,166, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, +120,166, 89, 3, 0, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,167, 89, 3, 0, 0, 0, 0, 40,167, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 40,167, 89, 3, 0, 0, 0, 0, + 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,101,114,118, +101,114, 95, 97,100,100,114,101,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +216,167, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,216,167, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 91,100,101,102, 97,117,108,116, 93, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,168, 89, 3, 0, 0, 0, 0,133, 0, 0, 0, + 1, 0, 0, 0,168,168, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, +200, 2,231, 1, 40,189, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168,168, 89, 3, 0, 0, 0, 0,133, 0, 0, 0, + 1, 0, 0, 0, 24,169, 89, 3, 0, 0, 0, 0, 56,168, 89, 3, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, +152, 3, 37, 3,200,195, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24,169, 89, 3, 0, 0, 0, 0,133, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,168, 89, 3, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, +157, 0, 72, 2, 8,184, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65,184, 1, 0, 0,136,169, 89, 3, 0, 0, 0, 0,153, 0, 0, 0, + 1, 0, 0, 0,136,171, 89, 3, 0, 0, 0, 0,152,172, 89, 3, 0, 0, 0, 0,168,173, 89, 3, 0, 0, 0, 0, 0, 0,128, 63, + 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, + 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,184,174, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, + 5, 0,255,255, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,200, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61, +205,204,204, 61,102,102,166, 63, 0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 67, 2, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 64, 0, 0, 0,136,171, 89, 3, 0, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0, 24,172, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0, 24,172, 89, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,184,184, 90, 3, 0, 0, 0, 0, 88,139, 90, 3, 0, 0, 0, 0,184,208, 90, 3, + 0, 0, 0, 0,184,188, 90, 3, 0, 0, 0, 0,184,144, 90, 3, 0, 0, 0, 0,184,180, 90, 3, 0, 0, 0, 0,184,156, 90, 3, + 0, 0, 0, 0, 68, 65, 84, 65, 64, 0, 0, 0,152,172, 89, 3, 0, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0, 40,173, 89, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255,128, 1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 56, 0, 0, 0, 40,173, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,184,184, 90, 3, 0, 0, 0, 0, 88,139, 90, 3, + 0, 0, 0, 0,184,208, 90, 3, 0, 0, 0, 0,184,188, 90, 3, 0, 0, 0, 0,184,144, 90, 3, 0, 0, 0, 0,184,180, 90, 3, + 0, 0, 0, 0,184,156, 90, 3, 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0,168,173, 89, 3, 0, 0, 0, 0,151, 0, 0, 0, + 1, 0, 0, 0, 40,174, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 64, 0, 0, 0, 40,174, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,184,160, 90, 3, 0, 0, 0, 0,184,200, 90, 3, + 0, 0, 0, 0,184,192, 90, 3, 0, 0, 0, 0,184,172, 90, 3, 0, 0, 0, 0,184,168, 90, 3, 0, 0, 0, 0,184,176, 90, 3, + 0, 0, 0, 0,184,164, 90, 3, 0, 0, 0, 0,184,148, 90, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,174, 89, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,184,160, 90, 3, 0, 0, 0, 0,184,204, 90, 3, 0, 0, 0, 0,184,152, 90, 3, + 0, 0, 0, 0,184,196, 90, 3, 0, 0, 0, 0, 68, 65, 84, 65, 88, 0, 0, 0, 40,175, 89, 3, 0, 0, 0, 0,139, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,121,101,114, 0, +114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0, +136, 0, 0, 0, 24,176, 89, 3, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101, +114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, +216, 1, 0, 0,232,176, 89, 3, 0, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 8,179, 89, 3, 0, 0, 0, 0, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, + 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, + 1, 0, 0, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,248,180, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8,179, 89, 3, 0, 0, 0, 0, 83, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, + 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,243, 4, 53, 63,152,180, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,180, 89, 3, 0, 0, 0, 0, 81, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,180, 89, 3, + 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0,232, 1, 0, 0,104,181, 89, 3, + 0, 0, 0, 0,132, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61, 0, 0, 0, 0,199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, + 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,183, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152,183, 89, 3, + 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0, 8,184, 89, 3, + 0, 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0, 40,189, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,176, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, +250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, +250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63, +222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, + 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0,128, 63, 1, 0,128, 51, + 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0, 2, 0, 0,179, 2, 0, 0,167, + 1, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 53, 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63, 0, 0,128, 63,157,190,215, 49, +167,170, 4, 52, 0, 0, 0,128,129,116,157,178, 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, 73,254, 67, 51,243, 97,106, 49, + 0, 0,128, 63, 0, 0, 0,128, 3, 0, 64, 52,183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, +100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, + 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, +208, 4, 0, 0, 40,189, 89, 3, 0, 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0,200,195, 89, 3, 0, 0, 0, 0, 8,184, 89, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 40, 54, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,129, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,194, 89, 3, 0, 0, 0, 0,152,194, 89, 3, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +222,149, 47, 63, 52, 70, 58, 63,179, 56, 49,188, 0, 0, 0,128, 86,126,162,190,227,251,159, 62, 56, 53,101, 63, 0, 0, 0,128, + 7,165, 39, 63,149, 84, 28,191, 50,247,227, 62, 0, 0, 0,128,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63, +205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, + 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,194, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,181,126, 4, + 0, 0, 0, 0,184,189,126, 4, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 72,194, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,152,194, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,152, 0, 0, 0,232,194, 89, 3, 0, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0,200,195, 89, 3, 0, 0, 0, 0, +121, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,189, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,232,176, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, + 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, + 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, + 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0,128, 50, 0, 0, 0,179, + 0, 0, 0, 0, 1, 0,128, 50, 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 1, 0, 0, 39, 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 53,236,148,190,222,102, 69,191, 37,255, 16, 63, + 0, 0, 0,128, 24,134,116, 63, 57,174, 76,190,240,161, 95, 62, 0, 0, 0,128,235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, + 0, 0, 0,128,208, 19, 13, 63,234, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 5, 0, 1, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, + 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0, +143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 0, 0, 32, 3, 0, 0, +232,200, 89, 3, 0, 0, 0, 0, 44, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0, 0, 0, + 0, 0, 8, 0, 1, 0, 50, 0,205,204, 76, 62, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,160, 63, + 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63, + 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 4, 0, 67, 0, 64, 3, + 67, 0, 64, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0,128, 64, 0, 0, 0, 63, +205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 88,204, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +184,205, 89, 3, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63,205,204, 76, 61,205,204,204, 61, +102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 88,204, 89, 3, 0, 0, 0, 0, + 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,110, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 40, 0, 0, 0, +184,205, 89, 3, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 40,206, 89, 3, 0, 0, 0, 0,120,222, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0, + 40,206, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0,120,222, 89, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0,112, 1, 0, 0,200,110, 90, 3, 0, 0, 0, 0, 39, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,112, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136,112, 90, 3, 0, 0, 0, 0, + 19, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, +248,112, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0,248,112, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0,255, 0, 0, 0,255, 77, 69, 0, 0,176, 1, 0, 0, 72,129, 90, 3, 0, 0, 0, 0, 54, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,131, 90, 3, 0, 0, 0, 0, +152,138, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,133, 90, 3, 0, 0, 0, 0, + 8,136, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,131, 90, 3, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88,134, 90, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,232,136, 90, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 6, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 72,131, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0,232,200, 89, 3, 0, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,152,131, 90, 3, 0, 0, 0, 0, + 88, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 72,133, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0, 72,133, 90, 3, 0, 0, 0, 0, + 60, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, 26,182,255,127, 1, 0, 0, 0, + 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255,127, 1, 0, 0, 0, 1, 0,128,191,253,255,127,191, + 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, + 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73,230, 73,255,127, 1, 0, 0, 0, +245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255,127, 1, 0, 0, 0, 3, 0,128,191,250,255,127,191, + 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73, +230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0, 88,134, 90, 3, 0, 0, 0, 0, 88, 1, 0, 0, 5, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8,136, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0, 8,136, 90, 3, 0, 0, 0, 0, 57, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, + 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,104, 1, 0, 0,232,136, 90, 3, 0, 0, 0, 0, + 88, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,152,138, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,152,138, 90, 3, 0, 0, 0, 0, + 56, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, + 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 2, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0, + 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2, + 66, 82, 0, 0,168, 1, 0, 0, 88,139, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,144, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,100, 0,104, 46, + 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,142, 90, 3, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 1, 0, 0, + 68, 65, 84, 65, 16, 1, 0, 0,192,139, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,142, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, + 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,144, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 48, 0, 0, 0, 56,144, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,144, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0, +184,148, 90, 3, 0, 0, 0, 0, 88,139, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 66,108,117,114, 0, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, +168,146, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 1, 4, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,145, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,146, 90, 3, 0, 0, 0, 0, + 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, + 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,148, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,148, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,148, 90, 3, 0, 0, 0, 0, + 87, 1, 0, 0, 1, 0, 0, 0,184,152, 90, 3, 0, 0, 0, 0,184,144, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 0,168,150, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 8, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,149, 90, 3, 0, 0, 0, 0, + 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, +168,150, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, + 56,152, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,152, 90, 3, 0, 0, 0, 0, + 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, + 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0, +184,152, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,156, 90, 3, 0, 0, 0, 0,184,148, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,154, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 3, 0, 68, 65, 84, 65, 16, 1, 0, 0, + 32,153, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 68, 65, 84, 65, 64, 1, 0, 0,168,154, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, + 14,215,126,191, 46,189,194, 61, 56,156, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, + 56,156, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, + 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 0, 0,168, 1, 0, 0,184,156, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,160, 90, 3, 0, 0, 0, 0, +184,152, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, + 0, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,158, 90, 3, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 6, 0, 0, + 68, 65, 84, 65, 16, 1, 0, 0, 32,157, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,158, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, + 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,160, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 48, 0, 0, 0, 56,160, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,160, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0, +184,164, 90, 3, 0, 0, 0, 0,184,156, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 68,114, 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, +168,162, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 1, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,161, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,162, 90, 3, 0, 0, 0, 0, + 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, + 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,164, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,164, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,164, 90, 3, 0, 0, 0, 0, + 87, 1, 0, 0, 1, 0, 0, 0,184,168, 90, 3, 0, 0, 0, 0,184,160, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,110, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 0,168,166, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 7, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,165, 90, 3, 0, 0, 0, 0, + 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, +168,166, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, + 56,168, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,168, 90, 3, 0, 0, 0, 0, + 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, + 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0, +184,168, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,172, 90, 3, 0, 0, 0, 0,184,164, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,170, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 5, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, + 32,169, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 68, 65, 84, 65, 64, 1, 0, 0,168,170, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, + 14,215,126,191, 46,189,194, 61, 56,172, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, + 56,172, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, + 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 0, 0,168, 1, 0, 0,184,172, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,176, 90, 3, 0, 0, 0, 0, +184,168, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116, +101, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,174, 90, 3, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 4, 0, 0, 0, + 68, 65, 84, 65, 16, 1, 0, 0, 32,173, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,174, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, + 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,176, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 48, 0, 0, 0, 56,176, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,176, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0, +184,180, 90, 3, 0, 0, 0, 0,184,172, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, +168,178, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 6, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,177, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,178, 90, 3, 0, 0, 0, 0, + 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, + 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,180, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,180, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,180, 90, 3, 0, 0, 0, 0, + 87, 1, 0, 0, 1, 0, 0, 0,184,184, 90, 3, 0, 0, 0, 0,184,176, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 0,168,182, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 5, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,181, 90, 3, 0, 0, 0, 0, + 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, +168,182, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, + 56,184, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,184, 90, 3, 0, 0, 0, 0, + 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, + 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0, +184,184, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,188, 90, 3, 0, 0, 0, 0,184,180, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105,120, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,186, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, + 32,185, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 68, 65, 84, 65, 64, 1, 0, 0,168,186, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, + 14,215,126,191, 46,189,194, 61, 56,188, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, + 56,188, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, + 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 0, 0,168, 1, 0, 0,184,188, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,192, 90, 3, 0, 0, 0, 0, +184,184, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,108,116,105,112, +108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,190, 90, 3, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 3, 0, 0, + 68, 65, 84, 65, 16, 1, 0, 0, 32,189, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,190, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, + 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,192, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 48, 0, 0, 0, 56,192, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,192, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0, +184,196, 90, 3, 0, 0, 0, 0,184,188, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 80,105,110, 99,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, +168,194, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 3, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,193, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,194, 90, 3, 0, 0, 0, 0, + 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, + 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,196, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,196, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,196, 90, 3, 0, 0, 0, 0, + 87, 1, 0, 0, 1, 0, 0, 0,184,200, 90, 3, 0, 0, 0, 0,184,192, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 0,168,198, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 2, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,197, 90, 3, 0, 0, 0, 0, + 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, +168,198, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, + 56,200, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,200, 90, 3, 0, 0, 0, 0, + 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, + 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0, +184,200, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,204, 90, 3, 0, 0, 0, 0,184,196, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,202, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63, +205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 2, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, + 32,201, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 68, 65, 84, 65, 64, 1, 0, 0,168,202, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, + 14,215,126,191, 46,189,194, 61, 56,204, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, + 56,204, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, + 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 0, 0,168, 1, 0, 0,184,204, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0,184,208, 90, 3, 0, 0, 0, 0, +184,200, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, + 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,206, 90, 3, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 64, + 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 1, 0, 1, 0, + 68, 65, 84, 65, 16, 1, 0, 0, 32,205, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,206, 90, 3, 0, 0, 0, 0, 83, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, + 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,208, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 48, 0, 0, 0, 56,208, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,168, 1, 0, 0,184,208, 90, 3, 0, 0, 0, 0, 87, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,184,204, 90, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 82, 83,117, 98,116,114, 97, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, +168,210, 90, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 4, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 64, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +205,204, 76, 62, 1, 2, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 32,209, 90, 3, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,210, 90, 3, 0, 0, 0, 0, + 83, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, + 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,212, 90, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,212, 90, 3, 0, 0, 0, 0, 81, 1, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82, 8, 13, 0, 0, 96,119,163, 2, 0, 0, 0, 0, +194, 0, 0, 0, 1, 0, 0, 0, 33, 8, 17, 1, 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, + 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97, +112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 2, 0, 94, 1, + 8, 0, 0, 0, 3, 0, 0, 0, 56, 52, 39, 1, 0, 0, 0, 0, 2, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, + 36, 0, 0, 0, 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0, 8,226, 90, 3, 0, 0, 0, 0, + 8,226, 90, 3, 0, 0, 0, 0,120,107, 94, 3, 0, 0, 0, 0,120,107, 94, 3, 0, 0, 0, 0,152,219, 94, 3, 0, 0, 0, 0, +152,219, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 1, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, +205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 30, 90,100,191,154,153,153, 62,102,102,102, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63, +156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62, +184,243,125, 62, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, + 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, + 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, + 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0, 0, 0, 0, 0, 2, 0, 1, 0, 10, 0, 50, 0,200, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 0, 0, + 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 29, 0, 0, 8,226, 90, 3, 0, 0, 0, 0, +191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255, +100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255, +100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255, +153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, + 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, + 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255, +100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255, +153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255, +153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, + 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, + 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, + 45, 45, 45,230,100,100,100,255,160,160,160,255,255,255,255,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, + 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0, 25, 25, 25,255,128,128,128,255, +100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180, 80, 80, 80,180, +100,100,100,180,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255,190,190,190,255, +100,100,100,180, 68, 68, 68,255, 0, 0, 0,255,255,255,255,255, 0, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, + 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,115,190, 76,255, 90,166, 51,255, +240,235,100,255,215,211, 75,255,180, 0,255,255,153, 0,230,255, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255, +240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255, +240,255, 64,255,240,144,160,255,255,255,255,255, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255, +240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76,255, 0, 0, 0, 0, +250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,130,130,130,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, + 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255, +128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255, +128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,250,250,250,255,250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, + 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255, +255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18, +255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255, +124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255, +240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255, +240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255, +240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, + 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255, +128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255, +128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, + 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255, +255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18, +255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255, +124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255, +240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, + 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255, +240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255, +240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255,110,110,110,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,132,132,132,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255, 94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,195,195,195,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, + 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255, +128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255, +128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, + 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, +255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18, +255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, + 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, 4, 0, 0,100, 0, 0,255, + 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255, +240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255, +240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255, +240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,255,255,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, + 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255, +128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255, +128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0,155,155,155,160,100,100,100,255,108,105,111,255, +104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, + 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, +255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18, +255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255, +144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, + 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, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, + 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255, +240,144,160,255, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, + 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, +255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255, +240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255, +240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255, 0,170, 0,255, +220, 96, 96,255,220, 96, 96,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255, +247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255, +131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255, +240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255, +111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,238,194, 54,255, +243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,152, 69,190,255, +211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,176,176,176,255, +222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, + 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 78, 65, 49,112,224, 0, 0,200,207,143, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69, +179, 11, 0, 0, 42,110,101,120,116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97, +115,116, 0,120, 0,121, 0,122, 0,119, 0,120,109,105,110, 0,120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42, +112,111,105,110,116,101,114, 0,103,114,111,117,112, 0,118, 97,108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116, +121,112,101, 0,102,108, 97,103, 0,110, 97,109,101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, + 0,116,111,116, 97,108,108,101,110, 0, 42,110,101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117, +115, 0,105, 99,111,110, 95,105,100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99, +107, 0, 42,102,105,108,101,100, 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,108,101,112, 97,116,104, 91, 50, + 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, + 97,110,103,101,100, 91, 50, 93, 0,112, 97,100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, + 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, + 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118, +101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95, +109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114, +118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,114,101,108, 97,116, +105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, + 91, 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100,116, 0, 42,114, +101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, + 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 42,108,105,110,101, 0, + 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,102,108, + 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,105,110,101,115, + 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114, +107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95,112,111,115, 0,117,110,100,111, 95,108,101,110, + 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122,101, 0,115,101,101,107, 0,112, 97,115,115,101, +112, 97,114,116, 97,108,112,104, 97, 0, 99,108,105,112,115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,110,115, 0,111, +114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119,115,105,122,101, 0,115,104,105,102,116,120, 0,115,104,105,102,116, +121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0,102,114, 97,109,101,110,114, 0,102,114, 97, +109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108, 0,111,107, 0, +109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,109,101,110,117,110,114, 0, 42,115, + 99,101,110,101, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, + 0, 42,114,101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,101, +110,100,101,114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101, +102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101, +110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, + 0, 42,112,114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110, +105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0, 97,115,112, +120, 0, 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110, +100,116,121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,114, +111,106,120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115, +105,122,101, 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, + 97,112,116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, + 95,111,117,116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55, 93, 0,114, 0, +103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, + 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105, +114,114,102, 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101, +109,105,116,102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108, +102, 97, 99, 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, + 0, 99,111,108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0, +114,101,102,108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, + 97, 99, 0,107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,108,105, +102,101,102, 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97, 99, 0,115,104, + 97,100,111,119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, 98,108,101,110, +100,102, 97, 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115, +116,110, 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117, +108,116, 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110, +115,116, 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114, +115,105,111,110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97, +116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, + 99, 97,108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, + 0,108, 97,115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115, +111,102,116,110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112, +111,105,110,116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99, +101, 0,111, 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111, +105,110,116, 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0, +110,111,105,115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97, +100, 51, 91, 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0, 42, 99,111, 98, + 97, 0,114,101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,102,111,114,109, + 97,116, 0,101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,108,116,105,112, +108,105,101,114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104, 91, 50, 52, 48, + 93, 0, 42,100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,115,105,122,101, + 0,116,117,114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116,105, +111,110, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, + 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102, +102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, + 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95, +109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101, +112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97, +115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99, +114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97,120, + 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98, +108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, 0, + 42,112,100, 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0, +109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101, 0,116,111,116, +101,120, 0,115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101, +114,103,121, 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110, +116, 0, 97,116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116, +115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0,112, 97, +100, 53, 91, 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108,116,101, +114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, 0,114, + 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121,112,101, + 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122,101,121, + 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, 97,109, +112, 95,109,101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115,117,110, + 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105,122,111, +110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116,110,101, +115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104,116, 0, +115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116,109, 95, +105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99,116,105, +111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107, +121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,111,108,111,114, +115,112, 97, 99,101, 0,112, 97,100, 52, 91, 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116,117, +114,101, 0,112, 97,100, 54, 91, 54, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,115, 99, 97,116, +116,101,114,105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, + 93, 0,116,114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,116,105,111,110, + 95, 99,111,108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95, 99,117,116,111, +102,102, 0, 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,104, 97,100,101, +102,108, 97,103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,111,108,117,116, +105,111,110, 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,110,115,105,116, +121, 0,109,115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0, +115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, + 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, + 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97, +100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,109,105,114, 0, +102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,101,115,110,101, +108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102, 97,108,108,111, +102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104, 97,114, 0,115, +101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,114, 97, 0,115, + 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97, 0, 97,100, 97, +112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,114, 97, 0, 97, +110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,116,111, 95,109, +105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,115,116, 97,114, + 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,122,101, 0,115, +117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97, 0,115,116,114, + 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,117,114,102,110, +111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,100,101, 0,115, +116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115, 0,115,104, 97, +100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, 0,112,114, + 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,104, 97,100,101, +114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114, 97, 99, 0,112, + 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,111,108, 0, 42, +114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,115,112,101, 99, + 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101, 99, 0,114, 97, +109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,112,102, 97, 99, + 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,108,101, 99,116, + 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115, 95,114, 97,100, +105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,115,115,115, 95, +115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115, 95,116,101,120, +102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,108, 97,103, 0, +115,115,115, 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,112, 97,100, 52, 0,103, +112,117,109, 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107, + 49, 0,105, 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,117, 97,116, 91, + 52, 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97, +116, 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42, +109, 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114, +115,105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, + 97,108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0, +118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, + 0,114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103, +118, 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97, +100,105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,104, 0,110,117,114, 98, 0, + 42,101,100,105,116,110,117,114, 98, 0, 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120, +116,111,110, 99,117,114,118,101, 0, 42,112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, + 0,116,119,105,115,116, 95,109,111,100,101, 0,112, 97,100, 91, 50, 93, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0, +112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,101,120,116, 50, + 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117, 0, 42,108, 97, +115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,100,105,115,116, + 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115, 0,117,108,104, +101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114, 0, 42,115,101, +108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,102,111, +110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,115,101,112, 99, +104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,108,115, +116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111, 0,101,102,102, +101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,114,116, + 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0, 42,116, +101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104, 0,118,100, 97, +116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101, 0,116, +111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97,103, 0, 99,117, 98,101,109, + 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,100,105,118,114, + 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,117,118, 91, 52, + 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112, 0,118, + 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,104,116, + 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111, 91, 51, + 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105, 0,115, 91, 50, 53, 54, 93, 0,116, +111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,109,105,100, 0,118, 91, 50, 93, 0, + 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, 0, 42,118,101,114,116,115, 0,108, +101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,110,116, 0,110,101,119,108,118,108, + 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,118,108, 0,117,115,101, 95, 99,111, +108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 0, 42,118,101,114, +116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97, 99,101,115, 0, 42,111,108,100, 95, +101,100,103,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114, 0,109,111,100,105,102,105,101,114, + 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109, 67, 97, 99,104, +101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,103,116,104, 0, +114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,116, 95, 99, 97, +112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116, 95,111, 98, 0, +111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,116, 0,102,105, +116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,115, 0,116,111, +108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,108,101, 0,118, + 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115, 0,101, 95,102, +108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101, 91, 51, 50, 93, + 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,109,101, 0, 42,116,101,120,116,117, +114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,101,108, 0,116, +101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118,108, 97,121,101,114, 95,110, 97, +109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,106,101, 99,116,111,114,115, 91, 49, + 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, 0, 97,115,112,101, 99,116,120, + 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,112,101,114, 99,101,110,116, 0,102, + 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106,101, 99,116, 99,101,110,116,101, +114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, 97,114,114,111,119, 0,115,112, +101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102,115, 0,108,105,102,101,116,105, +109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101,118, 67,111,115, 0,115,117, 98, +116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, + 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,114, 99,101, 0, 42, 99,108,111,116, +104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,108, 95,112, 97,114,109,115, 0, 42, +112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120, 0, 42,120,110,101,119, 0, 42,120, +111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101,110,116, 95,120, 0, 42, 99,117, +114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, 0,110,117,109,102, 97, 99,101, +115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,111,112,101,114, 97,116,105,111,110, + 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,105,100,115,105,122,101, 0, 42, 98, +105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,101,116,115, 0, 42, 98,105,110,100, + 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100, 0, 42,100,121, +110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,100,121,110,103, +114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,108,119,105,100, +116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98, +105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,115,121,115, 0,116,111,116,100,109, +118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,111,115,105,116,105,111, +110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, + 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,116,111,116,108,118,108, 0,115,105, +109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116, 0,118,103,114, +111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107, 84,121,112,101, + 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102, 76,101,118,101, +108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111,114,105,103,105, +110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,101, 95,105,110,110,101,114, 0, 99,114, +101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0, 42,111, 98, 95, 97,120,105,115, 0,115, +116,101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,115, 99,114,101,119, 95,111,102,115, + 0, 97,110,103,108,101, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115,118, 0,111,112,110,116,115, +119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, 0,102,119, 0,100,117, 0, +100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, 97,116,109, 97,116, 91, 52, + 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,117,108,112,116, + 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115,117, 98,115,116, +114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103,114,111,117,112, + 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105, 98, 0, 42,112, +111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115,116,114, 97,105,110,116, 67,104, + 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,101,114,115, 0,114,101,115,116,111,114,101, + 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0,111,114, +105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,100,113,117, 97,116, 91, 52, 93, 0, +114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,105,115, 91, 51, 93, 0,114,111,116, 65,110,103,108,101, 0, +100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, + 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102,108, 97,103, 0,112,114,111,116,101, + 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0, +105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102,108, 97, +103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0, +100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102, +111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101, +108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114, +101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116, 0,100,116,120, 0,101,109,112,116,121, 95,100,114, 97,119, +116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115,105,122,101, 0,100,117,112,102, + 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116,114,111,108,108,101,114,115, 0, + 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109,101,102, +108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102,116,102,108, 97,103, 0, 97,110, +105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110,116,115, + 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108,101,115,121,115,116,101,109, 0, + 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,102,108,117,105,100,115,105,109, 70,108, 97,103, 0,114,101, +115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,110,114, 0,115,104, 97,112,101,102,108, 97,103, 0,114,101, 99, + 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, + 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,108, 0,108, 97, +115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,116,101, 0,103,112,117,108, + 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117,114,105,110,100,101,120, 0, 97, + 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110,105,109, 97,116,101,100, 0,111, +109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102, +105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,107, 95, 97,120, +105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112, 0,102, 95,102,108,111,119, + 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0, +102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,100,101,102, 95,100, 97,109, +112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,102,114,105, 99, +116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,101,115,115, 0, 97, 98,115, +111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,102,116, 0,112, +100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,119, 0,107,105, +110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,102,114,101,101, + 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,119,101,105,103, +104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91, 51, 93, 0,102,114, 97,109, +101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,105,110,100,101,120, 95, 97,114,114, + 97,121, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,115,116,101,112, 0,115,105,109,102,114, 97,109, +101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114, 97,109,101, 0, +108, 97,115,116, 95,101,120, 97, 99,116, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,101, 91, 54, 52, + 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0,109,101,109, 95, 99, 97, 99,104,101, 0, 42, +101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,105,102,102, 0, 97,110,103, + 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,101,114, 97,116, +105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115, 0,107, 83, 82, + 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95, 83, 80, 76, 84, + 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 86, 67, 70, + 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84, 0,107, 67, 72, + 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108, 97,103,115, 0, +110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,105,110,103, 0,116,111,116, +115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,108,111, 99,107, + 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95, 77, 97,115,115, + 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116, 0,112,104,121, +115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,105, 99,116, 0, +109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,103,114,111,117, +112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,122,122,121,110,101,115,115, + 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,114,105,110,103, + 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,111,108,118,101, +114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 0,115,101, 99,111,110,100, +115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,115,116,105,102, +102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,111,112,115, 0,109, 97,120, +108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105, 99, 0,115,112, +114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,105,102,102, 0, +105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,116,111,114, 95,119,101,105, +103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,115, 99, 97,108,101, 91, 51, + 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,118, 97,110, 99,101,100,111, +112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,105,101,119,114,101,115,120, +121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,101, 0,114,101,110,100,101, +114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,117,101, 0,118,105,115, 99, +111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,110,116, 0,103,114, 97,118, +120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109, 69,110,100, 0, + 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,103,115,116, 97,114, 0,109, 97,120, 82,101,102,105,110, +101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122, 0, 42,111,114,103, 77,101, +115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, + 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116, +121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110, +105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, + 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109, +111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73, +110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, + 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115, 84,105,109,101, 83,116, 97, +114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116, +102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, + 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102, +111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,109,105,115,116,121,112,101, + 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122, +101,110, 98, 0,122,101,110,107, 0, 97,109, 98,107, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101, +120,112, 0,114, 97,110,103,101, 0,108,105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, + 99,116,105,118,105,116,121, 66,111,120, 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105, +111,110, 82,101,115, 0,112,104,121,115,105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108, +111,103,105, 99,115,116,101,112, 0,112,104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109, +105,115,105, 0,109,105,115,116,115,116, 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114, +114, 0,115,116, 97,114,103, 0,115,116, 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97, +114,109,105,110,100,105,115,116, 0,115,116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100, +111,102,115,116, 97, 0,100,111,102,101,110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115, +116, 0, 97,111,100,105,115,116,102, 97, 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111, +100,101, 0, 97,111,115, 97,109,112, 0, 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, + 95,116,104,114,101,115,104, 0, 97,111, 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112, +112,114,111,120, 95,101,114,114,111,114, 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, + 97,111, 95,105,110,100,105,114,101, 99,116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, + 0, 97,111, 95,112, 97,100, 50, 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95, +112, 97,100, 0, 97,111, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116, +104,111,100, 0, 97,111, 95, 97,112,112,114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, + 97,111,116, 97, 98,108,101,115, 0,112, 97,100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, + 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, + 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118, +101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100, +119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, + 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0, +113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, + 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, + 99,111,108,111,114, 68,101,112,116,104, 0, 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0, +109,105,110, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97, +108,105,116,121, 0,107,101,121, 70,114, 97,109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99, +111,100,101, 99, 84,121,112,101, 0, 97,117,100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105, +116, 68,101,112,116,104, 0, 97,117,100,105,111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70, +108, 97,103,115, 0, 97,117,100,105,111, 66,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105, +100,101,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95, +109,105,120,114, 97,116,101, 0, 97,117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, + 95,109,105,110, 95,114, 97,116,101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95, +115,105,122,101, 0,109,117,120, 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105, +120,114, 97,116,101, 0,109, 97,105,110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101, +114, 95,102, 97, 99,116,111,114, 0,100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101, +114,114,105,100,101, 0, 42,108,105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0, +108, 97,121,102,108, 97,103, 0,112, 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111, +100,101, 99,100, 97,116, 97, 0, 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116, +105,110,103,115, 0,102,102, 99,111,100,101, 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0, +112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, + 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, + 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, + 0, 97,116,116,114,105, 98, 0,114,116, 50, 0,102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100, +101, 0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99, +104, 0,121,115, 99,104, 0,120,112, 97,114,116,115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110, +101,115, 0,105,109,116,121,112,101, 0,115,117, 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112, +108, 97,121,109,111,100,101, 0,114,112, 97,100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116, +114, 97, 99,101, 95,111,112,116,105,111,110,115, 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0, +114,101,110,100,101,114,101,114, 0,111, 99,114,101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, + 95,115,101, 99, 0,101,100,103,101,105,110,116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114, +101, 99,116, 0,108, 97,121,101,114,115, 0, 97, 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0, +120, 97,115,112, 0,121, 97,115,112, 0,102,114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108, +111,114, 95,109,103,116, 95,102,108, 97,103, 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111, +115,116,115, 97,116, 0,100,105,116,104,101,114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, + 98, 97,107,101, 95,102,105,108,116,101,114, 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, + 98, 97,107,101, 95,110,111,114,109, 97,108, 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105, +116, 0, 98, 97,107,101, 95,109, 97,120,100,105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107, +101, 95,112, 97,100, 0, 98, 97, 99,107, 98,117,102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109, +112, 0,115,116, 97,109,112, 95,102,111,110,116, 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, + 0,102,103, 95,115,116, 97,109,112, 91, 52, 93, 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101, +118, 95,116,121,112,101, 0,115,101,113, 95,114,101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97, +100, 53, 91, 53, 93, 0,115,105,109,112,108,105,102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98, +115,117,114,102, 0,115,105,109,112,108,105,102,121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112, +108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105, +110,101,111,110,119,104,105,116,101, 0, 99,105,110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, + 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109, +101,114,101,115, 0,100,111,109,101,109,111,100,101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, + 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, + 0,112, 97,114,116,105, 99,108,101, 95,112,101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98, +117,102,115, 97,109,112,108,101, 95,109, 97,120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117, +102, 0, 42,119, 97,114,112,116,101,120,116, 0, 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,114, 97,109,105, +110,103, 0,114,116, 49, 0,100,111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97, +116,105,111,110, 0, 42, 99, 97,109,101,114, 97, 0, 42, 42, 98,114,117,115,104,101,115, 0, 97, 99,116,105,118,101, 95, 98,114, +117,115,104, 95,105,110,100,101,120, 0, 98,114,117,115,104, 95, 99,111,117,110,116, 0, 42,112, 97,105,110,116, 95, 99,117,114, +115,111,114, 0,112, 97,105,110,116, 95, 99,117,114,115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, + 97,109, 95, 98,108,101,101,100, 0,110,111,114,109, 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, + 98, 95,115,105,122,101, 91, 50, 93, 0, 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111, +116,114,101,107,101,121, 0,116,111,116, 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, + 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116, +121,112,101, 0,100,114, 97,119, 95,115,116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, + 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0,112,105,118,111,116, 91, 51, 93, 0,116, 97, 98,108,101,116, 95,115,105,122, +101, 0,116, 97, 98,108,101,116, 95,115,116,114,101,110,103,116,104, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42, +119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111, +117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, + 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102, +115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, + 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112, +101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, + 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110, 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, + 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, + 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101, 0,117,118, 95,112, 97,100, 91, 50, 93, 0, 97,117,116,111,105,107, 95, + 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111, +114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, + 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97, +103, 0,114,101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0, +108,105,110,101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115, +112,111,116, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114, +101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, + 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101, +110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105, +116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, + 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, + 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103, +101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95, +114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111, +112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112, +114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0, +115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116, +101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, + 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, + 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101, +116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, + 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115, +110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112, +114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0, 97,117,116,111, 95,110,111,114,109, 97, +108,105,122,101, 0,105,110,116,112, 97,100, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98, +106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114, +101, 0,115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,121,115,116,101,109, 0,103,114, 97,118,105,116,121, 91, 51, 93, + 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,112, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97, +115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99, +101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, + 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116, +114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111, +117,110,100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, + 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,100, 97,103,102,108, 97,103,115, 0,106,117,109,112,102,114, 97,109,101, + 0,112, 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116, +115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,115, 95,115,101,116,116,105,110,103,115, 0, 98,108,101,110,100, + 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, + 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114, +115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, + 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, + 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122, +111,111,109, 0,118,105,101,119, 98,117,116, 0,116,119,100,114, 97,119,102,108, 97,103, 0,114,102,108, 97,103, 0,118,105,101, +119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112, 95,108,111, 99, 97, +108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101, +116,111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111, +111,116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118, +105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,112, 97,100,102, 0,114,101,103, +105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, + 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, + 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, + 91, 51, 50, 93, 0,100,114, 97,119,116,121,112,101, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,112, +105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101, +115, 0,103,114,105,100,102,108, 97,103, 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, + 0,107,101,121,102,108, 97,103,115, 0,116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, 99, +117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 97,102,116,101,114,100,114, 97,119, 0,122, 98,117,102, 0,120,114, + 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,102,105,108,116,101,114, 0, 42,112,114,111,112,101,114,116,105, +101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0, +109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109, 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99, +114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, + 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121, 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, + 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97, 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0, 42,115, 99, +114,101,101,110, 0,118, 50,100, 0, 42, 97,100,115, 0,103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, + 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117, +115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,114,101,118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97, +116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104, +111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109, 0,116,105,116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 50, 52, 48, + 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,101,102,105,108,101, 91, 56, 48, 93, 0,115,111,114,116, 0,100, +105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,111,111,107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105, +108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,112, 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108, +108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,115, 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, + 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110,101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, + 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111, +107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,114, 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, + 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,115,101, + 97,114, 99,104, 95,102,108, 97,103,115, 0,100,111, 95, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102, +108, 97,103, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114, 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110, +114, 0,108,111, 99,107, 0,112,105,110, 0,100,116, 95,117,118, 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114, +101,116, 99,104, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 99,101,110,116,120, 0, 99,101,110,116,121, 0,115, 99,111,112,101, +115, 0,115, 97,109,112,108,101, 95,108,105,110,101, 95,104,105,115,116, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101, +119,108,105,110,101,115, 0,108,104,101,105,103,104,116, 0, 99,119,105,100,116,104, 0,108,105,110,101,110,114,115, 95,116,111, +116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115, 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111, +119,115,121,110,116, 97,120, 0,111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95, +112,101,114, 95,108,105,110,101, 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, + 97,112, 0,100,111,112,108,117,103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99, +101,115,116,114, 91, 50, 53, 54, 93, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, + 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95, +103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, + 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, + 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,104,101,115, 0, 99, 97, 99,104,101, 95,100,105,115,112,108, 97, +121, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,110,116, 0,109,120, + 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,109, +101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, + 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,114,111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101, +105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,114,101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, + 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95, +101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97, +114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112, 0, 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108, +101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,114,112,116, 95,109, 97,115,107, 0,115, 99,114,111,108,108, 98, + 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,110,103,117, 97,103,101, + 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,101,108, 95,101,110,100, 0,102,105,108,116,101,114, 91, 54, 52, + 93, 0,102,105,108,101,110, 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116, 95,105,100, + 0,114, 95,116,111, 95,108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99, 0, 98,111, +108,100, 0,115,104, 97,100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,108,112,104, + 97, 0,115,104, 97,100,111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,112,108, 97, + 98,101,108, 0,119,105,100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,111,111,109, + 0,109,105,110,108, 97, 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115, 0, 99,111, +108,117,109,110,115,112, 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112, 97, 99,101, + 0, 98,117,116,116,111,110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,110,101,108, +115,112, 97, 99,101, 0,112, 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,110,101, 91, + 52, 93, 0,105,110,110,101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109, 91, 52, 93, + 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,104, 97,100, +101,116,111,112, 0,115,104, 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,110,101,114, + 95, 97,110,105,109, 91, 52, 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, + 95,107,101,121, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,100, +114,105,118,101,110, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,119, 99,111, +108, 95,114,101,103,117,108, 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99, +111,108, 95,114, 97,100,105,111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, + 0,119, 99,111,108, 95,110,117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101, +110,117, 0,119, 99,111,108, 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0, +119, 99,111,108, 95,109,101,110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114, +111,108,108, 0,119, 99,111,108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,116,101,109, + 0,119, 99,111,108, 95,115,116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, + 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,104, +101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, + 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, + 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95, +116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, + 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97, +110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, + 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115, +104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, + 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103, +114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114, +109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0, +101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, + 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, + 93, 0,101,100,103,101, 95, 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101, +108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0,118,101, +114,116,101,120, 95,110,111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110, +101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, + 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95, +118,108,105,110,101, 91, 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95, +117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,115,116,115, +101,108, 95,112,111,105,110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108, +101, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95, + 97,108,105,103,110, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100, +108,101, 95,115,101,108, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,116, 91, 52, + 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, + 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,111,117,116, +112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95, +105,110,102,111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,111,108,101, + 95, 99,117,114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,116, 95,115, +105,122,101, 0, 98,112, 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, + 93, 0,115,121,110,116, 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, + 52, 93, 0,109,111,118,105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117, +100,105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115, +105,116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, + 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116, +101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0, +104,112, 97,100, 91, 55, 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100, 91, 52, 93, + 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, + 0,116,115,110,100, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109, 97,115,101, +108, 0,116,101,120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0, +116,117,115,101,114,112,114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97, 99,116,105, +118,101, 95,116,104,101,109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99, 91, 52, 93, + 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48, 93, 0,102, +111,110,116,100,105,114, 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,120,116,117, +100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,115,101,113, +100,105,114, 91, 49, 54, 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,100,105,114, + 91, 49, 54, 48, 93, 0,105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97, +121,101,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95, +109,105,110, 95,103,114,105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115, +105,111,110,115, 0,100, 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104, +101,101,108,108,105,110,101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115, +101,114,112,114,101,102, 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111, +100,101,118,105, 99,101, 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100, +105,111, 99,104, 97,110,110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116, +115, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0, +116,104,101,109,101,115, 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0, + 97,100,100,111,110,115, 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112, +115, 0,117,110,100,111,109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, + 95,101,117, 99,108,105,100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116, +105,110,103,115, 0,116, 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0, +108,105,103,104,116, 91, 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, + 97,110,100,108,101,115,105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, + 99,111,108,108,101, 99,116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,119,109,112, 97,100, 0,109, +101,109, 99, 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109, +101,115,101,114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116, +101,114, 95,100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95, +102,105,108,101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0,110, +100,111,102, 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,111,108, +111,114, 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,108,101, +115, 95,110,101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112,114,111, +112,119,105,100,116,104, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101, +114, 91, 49, 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,118, +101,114,116, 98, 97,115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99, +101,110,101, 0,102,117,108,108, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115, +104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99, +117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0, +115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116, + 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116, +121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114, + 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121, + 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115, +110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100, + 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108, + 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114, + 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112, +101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0, + 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105, +100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111, +118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116, +114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115, +105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111, +110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115, + 0,103,108,111, 98, 97,108,102, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,110, 97,109,101, 91, 56, 48, 93, 0, + 42,105, 98,117,102, 0, 42,105, 98,117,102, 95, 99,111,109,112, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0, +110,114, 0, 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, + 93, 0,103, 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, + 0,115,116, 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0, +111,114,120, 0,111,114,121, 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, + 98, 97,108, 97,110, 99,101, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95, +115,116, 97,114,116,115,116,105,108,108, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,101,110,100,115,116,105,108,108, 0, + 42,105, 98,117,102, 95,115,116, 97,114,116,115,116,105,108,108, 0, 42,105, 98,117,102, 95,101,110,100,115,116,105,108,108, 0, + 42,105,110,115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, + 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111, +102,115, 0,109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,109,117,108, + 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0, 42,115, + 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,102, + 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0, 42, +115,111,117,110,100, 0, 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101, +110,101,110,114, 0,109,117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,102,102, +101, 99,116,100, 97,116, 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102, +115, 0, 98,108,101,110,100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, + 97,115,101,112, 0, 42,112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, + 0, 42, 97, 99,116, 95,115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95, +115,111,117,110,100,100,105,114, 91, 50, 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, + 0,111,118,101,114, 95,102,108, 97,103, 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, + 0,102,111,114,119, 97,114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, + 66,111,111,115,116, 0,100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97, +108,101,120, 73,110,105, 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101, +121, 70,105,110, 0,120, 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0, +114,111,116, 70,105,110, 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97, +108,101, 0, 42,102,114, 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108, +105,100, 70,114, 97,109,101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, + 97,114,116, 0,110,111,114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, + 0,114, 97,110,100,108,105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108, +101,110, 0,100,101,102,118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105, +108,100, 91, 52, 93, 0,109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116, +105, 99,115,116,101,112, 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97, +103, 50,110,101,103, 0,118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, + 0,118,103,114,111,117,112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,117, +115,101,100, 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115, +116,118, 97,108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97, +109,101, 91, 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0, +109, 97,120,118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101, +114,105, 97,108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, + 51, 50, 93, 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97, +110,110,101,108, 91, 51, 50, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, 79, 98,106, +101, 99,116, 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112,101, 0,112, +117,108,115,101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106, +111,121,105,110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, + 0,104, 97,116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121, +110,101,119, 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97, +108,111, 0,115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, + 0, 98,108,101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105, +100,101, 97,120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0,115,110,100,110,114, 0,112, 97,100, 51, 91, 50, + 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49, 93, 0, 42,109,101, 0,108,105,110, 86, +101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102, +108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93, 0,102,111, +114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103,117, +108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0,109,105,110, 0,109, 97, +120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93, 0,109,105, +110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93, 0, 98,117, +116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0,105,110,116, 95, 97,114,103, + 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0,102,108,111, 97,116, 95, 97, +114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,111, 79, 98,106,101, 99,116, 0, 98,111, +100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110,105,110, 97,109,101, 91, + 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0, 42,115,117, 98,116, 97,114,103,101,116, + 0,103,111, 0, 97, 99, 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111, +116,115,112,101,101,100, 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,108,116,100, 97,109,112, 0,115,112,101, +101,100,100, 97,109,112, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,114,101,102,101,114,101,110, + 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110, 99,101, 0,114,111,108,108,111,102,102, + 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117, +116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103, 97,105,110, 0, 42,110,101,119,112, 97, + 99,107,101,100,102,105,108,101, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, + 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100,108,101, 0, 42, 97,114,101, 97, 0, 42,108, 97,109, +112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, 0, 42,112,114,111,112, 0, + 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98, +111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97, +105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,120,119,105,100,116,104, 0,122,119,105,100,116, +104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, + 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0, 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111, +110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,101,116, 99,104, 0,108, 97,121,101,114, 95,112,114,111, +116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121, +112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104, +115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,111,105,110,116,115, 0, +115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,115,116, 95,115,102, 0,103, +104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99, 0,103,104,111,115,116, 95, +116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,103, 0,112, 97,116,104, 95, +116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,108, 97,103, 0,112, 97,116, +104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,102, 0,112, 97,116,104, 95, + 98, 99, 0,112, 97,116,104, 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108, 97,103, 0,115,101,108,101, + 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105, +107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116,115, 0, 42,100,117, 97,108, 95,113,117, 97,116, 0, 42, 98, + 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95,109, 97,116, + 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100, 91, + 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,105, +116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0,105, +107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 42, 99,117,115,116,111,109, 0, 42, + 99,117,115,116,111,109, 95,116,120, 0, 99,104, 97,110, 98, 97,115,101, 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111, +120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, + 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0, +105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, + 97, 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,101,114, 0,110,117,109,115,116,101,112, 0,109,105,110, +115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120, +118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115, +116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, + 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112, 0,102,105,108,116,101,114, +102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101, 0, 42,103,114,112, 0,116,101,109,112, 0,110, 97,109, +101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,101,110,102,111,114, 99,101, 0, +104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,101,114,114,111,114, 0, 42,116, 97, +114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,116, 79,114,100,101,114, 0,116, 97, +114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,111,111,116, 98,111,110,101, + 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,108,101,115,117, 98,116, 97, +114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,119,101,105,103,104,116, 0, +103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115, 0, 99,104, 97,105,110,108,101,110, + 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,115,101,114,118,101,100, 50, + 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51, 93, 0,108,111, 99,107,102, +108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,108, 97,110,101, 0,111,114,103, +108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,105,118, 90, 0, 97,120, 88, 0, + 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,105,109,105,116, 91, 54, 93, 0, +101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,109, 0,116,111, 0,109, 97,112, + 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,109, 95,109, 97,120, 91, 51, 93, + 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,116, 65,120,105,115, 0,122,109,105, +110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,110,111, 95,114,111,116, + 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,100, 0, 97, 99,116,115,116, 97,114, +116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,108,101,110, 0,115, 99, 97,108,101, + 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,111,102,102,115, + 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,117,116,112,117,116, 0,100, 97,116, + 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,111, 99,107, 0,110,115, 0,108,105, +109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,115,116, 97, 99,107, 95,105,110,100, +101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,100,101,120, 0,116,111, 95,105,110, +100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,110,111,100,101, 0,108, 97,115,116, +121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,119,105,100,116,104, 0, 99,117,115, +116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116,111,109, 52, 0,110,101,101, +100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116,111,116,114, 0, 98,117,116, +114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111, 0, 42,102,114,111,109,110,111,100, +101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,101,115, 0,108,105,110,107,115, 0, + 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,116, 0,115,116, 97, 99,107,115,105, +122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,111,119,110,116,121,112,101, 0,112, + 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,115,116, 97,116,115, 95,100,114, 97, +119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, 98,104, 0, 42,112,114,104, 0, 42, +115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,109,105,110,115,112,101,101, +100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0, + 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104, +101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97, +112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,115, 97, +116, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, + 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,101,108, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, + 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,114,111,116, 97,116,105,111,110, 0,103, 97,109, + 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,117,114, 0, 98,116,104,114,101,115,104, + 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,102,115, 0, 99,111,108,109,111,100, 0,109,105, +120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,105,116, 0,112,114,111,106, 0,102,105, +116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,108,105,102,116, 95,108,103,103, 91, 51, 93, 0, +108,105,109, 99,104, 97,110, 0,117,110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, + 0,117,115,112,105,108,108,103, 0,117,115,112,105,108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, + 0,109, 97,120,116, 97, 98,108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, + 99,117,114,118,101, 0, 42,116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, + 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, 51, 93, 0,119,104,105,116,101, + 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,120, 95,114,101,115,111,108,117,116, +105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91, 50, 53, 54, 93, 0,100, 97,116, 97, + 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,115, 97,109,112,108,101, 95,102,117, +108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114, 97, 99,121, 0,119, 97,118,101,102,114,109, + 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119, 97,118,101,102,114,109, 95,121,102, 97, 99, + 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,111,112,101, 95, 97,108,112,104, 97, 0,118, +101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120, 91, 51, 93, 91, 50, 93, 0,104,105,115,116, + 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,109, 95, 50, 0, 42,119, 97,118,101,102,111, +114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,114,109, 95,116,111,116, 0,111,102,102,115, +101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0,106,105,116,116,101,114, 0,115,109,111,111,116,104, 95,115, +116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,102, 97, 99,116,111, +114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,101,120, +112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0, 97, 99,116,105,118, +101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,109, 97,115,107, 0, 42, +108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,111,116,115,105,122,101, + 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97, +118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,110,117,109, 0,112, 97,114,101, +110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114,116, 91, + 50, 93, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109, +101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115, +112,114,105,110,103, 95,107, 0,114,101,115,116, 95,108,101,110,103,116,104, 0,118,105,115, 99,111,115,105,116,121, 95,111,109, +101,103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115, 95,107, 0,115, +116,105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0, 98,117,111,121, + 97,110, 99,121, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112, +101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97, +115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,115,117, 98, +102,114, 97,109,101,115, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115, +116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111, +109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105, +116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108, +116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,115,105,109,112, +108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,105,109,112,108, +105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,112,111,114,116, + 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,114,105,100, 95, +114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99, +116,102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, + 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0, +114,101, 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, + 97, 99, 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,110, 98,114, 0, +114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,105,122,101, 0, + 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,102,108, 97,116, + 0, 99,108,117,109,112,112,111,119, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117, +103,104, 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117, +103,104, 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99, +108,101,110,103,116,104, 95,116,104,114,101,115, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,108, +105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,108, + 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115, 0, + 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0, 42, +112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104, +105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104, +101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,117, +116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,114, + 97,109,101, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,101,100, 0,116,111,116, 99,104,105,108,100, 99, + 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,107,101,121,101,100, 0, 98, 97,107,101,115,112, + 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, 50, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0, +118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,116, 97, 0, 42,101,102,102,101, 99,116,111,114, +115, 0, 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97,110,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114, +117, 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114, +117, 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109, +101,115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95, +115, 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111,111, +116,104, 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111,110, 0,115,116,101,112,115, 80,101,114, 70,114, 97, +109,101, 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116, +121,112,101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111, +117,112, 95,115,116,114,117, 99,116, 0,115,104, 97,112,101,107,101,121, 95,114,101,115,116, 0,112,114,101,115,101,116,115, 0, +114,101,115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101, +108,102, 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111,111, +112, 95, 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, 99, +107,110,101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, + 0,103,115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98, +117,102,102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0, 42,116,121,112,101,115,116,114, 0, 42,109, +101,115,115, 97,103,101, 0,108,105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101,118,101, +108, 0, 42,114,101,112,111,114,116,116,105,109,101,114, 0,103,114,101,121,115, 99, 97,108,101, 0,119,105,100,116,104,102, 97, + 99, 0, 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119, +115, 0,105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100,111, + 95,100,101,112,116,104, 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106, +111, 98,115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105,103, +115, 0, 42,100,101,102, 97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116, +105,109,101,114, 0, 42,103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,110,101,119,115, 99, +114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119,105, +110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,100,100, +109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42, +116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, + 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,101,115, +116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,116, 0, + 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,116,121, +112,101, 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100, 0,107, +109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98, 97,115, +101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, + 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, + 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,115, 0, + 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101, 0,112, +104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118, 97,108, +117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,102,116, +101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121, 99,108, +101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,112, 95, +115,105,122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,116,114, + 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,116, 97, +114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 0, + 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,110,100, +101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50, 56, 93, + 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,112, 0, +102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,120,116, +101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100,101, 0,107,101,121,105, +110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, + 95,112, 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114, +105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111, +100,101, 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0, +114,117,108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95, +105,100, 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, + 0,119, 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97, +116,101, 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114, +117,108,101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95, +115,116, 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107, +105,110,103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,105,114, + 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120, 95, 97, +118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,112, 95, +115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95, 97, 99, + 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, + 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,100, 0, + 42,102,108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101, +120, 95,119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, + 49, 91, 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, + 93, 0, 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,110,111, +105,115,101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95, +119,116, 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, + 99,104,101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, + 99, 97, 99,104,101,115, 91, 50, 93, 0,118,101,108,111, 99,105,116,121, 91, 51, 93, 0,118,103,114,112, 95,104,101, 97,116, 95, +115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102,108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115, +105,116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42,112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, + 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52, 93, 0, 0, 84, 89, 80, 69,212, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, + 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102, +108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100, 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76, +105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, 99, 50,102, 0,118,101, 99, 50,105, 0,118,101, 99, 50,100, 0, +118,101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51,100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, + 99, 52,100, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, 73, 68, 80, +114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80,114,101,118, +105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, 67,117,114, +118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, + 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101, +114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115, +101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82, +101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, + 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 80,111,105, +110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68, 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101, +120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 87, 97,118,101, 0, + 86,111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105, 97,108, 0, 71,114,111,117,112, 0, 86, 70, +111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, 0, 66,111,117,110,100, 66,111,120, 0, + 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, 67, +117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, + 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68, +101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69, +100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116, +105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68,101,102,111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, + 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112, +101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116, +121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67, +111,108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, + 77,117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102, +105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116, +105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, + 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, + 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100, +105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, + 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105, +110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70,108,111,119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107, +101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105,115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97, +116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116, +101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, + 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97, +116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105, +102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108, +111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101, +116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, + 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101, +101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115, +104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101, +114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115, +104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116, +101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97, +114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111, +100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105, +109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, + 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75, +101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,108,105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 83, 99,114,101,119, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 0, 98, 68, +101,102,111,114,109, 71,114,111,117,112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, + 0, 98, 80,111,115,101, 0, 98, 71, 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, + 98, 77,111,116,105,111,110, 80, 97,116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68, +101,102,108,101, 99,116, 0, 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, + 99,116, 0, 82, 78, 71, 0, 69,102,102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 77,101, +109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105,110,116, + 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0, 66, 97,115,101, + 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, + 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111, +100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121, +101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0, 71, 97,109,101, + 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97, +114,107,101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105, +110,103,115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100, +105,116, 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, 0, + 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116, +115, 0, 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69, +100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, + 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,116,111,112,111, + 86,105,101,119, 68, 97,116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,116, +111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,101, +119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 98, 83, 99,114,101,101,110, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, + 68,111,112,101, 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108, +101, 83,101,108,101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, + 0,119,109, 79,112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, + 0, 84,114,101,101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, + 97,103,101, 0, 83, 99,111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, + 97, 99,101, 84,101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, + 84,105,109,101, 67, 97, 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, + 97, 99,101, 76,111,103,105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, + 0, 83,112, 97, 99,101, 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0,117,105, 70,111, +110,116, 0,117,105, 70,111,110,116, 83,116,121,108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67, +111,108,111,114,115, 0,117,105, 87,105,100,103,101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, + 73, 0, 84,104,101,109,101, 83,112, 97, 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101, +109,101, 0, 98, 65,100,100,111,110, 0, 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 83, 99,114, + 86,101,114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, + 97,121,111,117,116, 0, 83, 99,114, 65,114,101, 97, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, 0, + 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, + 0, 84, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116,114,105,112, 84,114, 97,110,115, +102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83,116,114,105,112, 80,114,111,120, +121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110, 99,101, 0, 98, 83,111,117,110, +100, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,115, 0, 84,114, + 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,112,101,101,100, + 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0, 80, 97,114,116, + 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,116,121, 0, 98, + 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117, 99,104, 83,101, +110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,116,121, 83,101, +110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,101,110,115,111, +114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,115,111,114, 0, + 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,109, 97,116,117, +114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,115,111,114, 0, + 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0, 98, 69,120,112, +114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,117, 97,116,111, +114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110, 65, 99,116,117, + 97,116,111,114, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 69,100,105, +116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,111,114, 0, 98, + 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, + 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,114, 0, 98, 67, +111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117, 97,116,111,114, + 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,117, 97,116,111, +114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65, 99,116,117, 97, +116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,101,110,116, 65, + 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,116,117,114,101, + 65, 99,116,117, 97,116,111,114, 0, 70,114,101,101, 67, 97,109,101,114, 97, 0, 83,112, 97, 99,101, 83,111,117,110,100, 0, 71, +114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111, +110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 71, 72, 97,115,104, 0, 98, 73, 75, + 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,112, 0, 83,112, 97, 99,101, 65, + 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, + 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 84, + 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 75,105,110,101,109, 97,116, +105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,111,110,115,116,114, 97,105,110,116, + 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 97,116,101, 76,105,107,101, 67, +111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, + 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,109,101, 86,111,108,117,109,101, 67, +111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, + 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 67,111,110,115,116,114, 97,105, +110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68, 97,109,112, 84,114, 97, + 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,104, 67,111,110,115,116,114, 97,105, +110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,105,103,105,100, 66,111, +100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,112, 84,111, 67,111,110,115,116,114, + 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115,102,111, +114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76, +111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,109,105,116, 67,111,110,115,116, +114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68,105,115,116, + 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,114, 97,112, 67,111,110,115,116, +114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,111,110, 83,116,114, +105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98, 78,111,100,101, 76, +105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,117,105, 66,108,111, 99,107, 0, 98, + 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 78,111,100,101, 66,108,117,114, 68, + 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,108, 97,116,101,114, 97,108, 66, +108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,109, 97,103,101, 70,105,108,101, + 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0, 78,111,100,101, 84,119,111, 70,108, +111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,101,114,116,101,120, 67,111,108, 0, + 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,105, 99,116, 0, 78,111,100,101, 71, +108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,110,115, 68,105,115,116, 0, 78,111, +100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,114,115,112,105,108,108, 0, 84,101, +120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,116, 0, 67,117,114,118,101, 77, + 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97, 76, 97,121,101,114, 0, 67,117, +115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108, +101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,116, 97, 0, 67,104,105,108,100, + 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80, 97,114,116,105, 99,108,101, + 68,117,112,108,105, 87,101,105,103,104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 83, 80, 72, 70,108,117,105, +100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83, +101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, + 80, 97,114,116,105, 99,108,101, 68,114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,100,101, 0, 98, 71, 80, 68,115,112, +111,105,110,116, 0, 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97, +121,101,114, 0, 82,101,112,111,114,116, 0, 82,101,112,111,114,116, 76,105,115,116, 0, 82,101,112,111,114,116, 84,105,109,101, +114, 73,110,102,111, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119, +109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119, +109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65, + 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100,105,102,105, +101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105,111,110, 71, +101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111,100, 95, 69, +110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104,111,110, 0, + 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83,116,101,112, +112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97,110,110, +101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97, +105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0, + 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73, +100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111, + 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66, +111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114, + 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101, + 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0, 0, 84, 76, 69, 78, 1, 0, 1, 0, + 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 16, 0, 24, 0, 16, 0, 4, 0, 8, 0, 8, 0, 16, 0, 12, 0, + 12, 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 32, 0, 96, 0, 72, 0, 72, 2, 0, 0, 40, 0,144, 0,208, 4,112, 0, + 36, 0, 56, 0,112, 0,128, 0,168, 0, 96, 0, 40, 0, 48, 0,176, 0, 16, 0,136, 0, 40, 0, 8, 6,240, 1, 0, 0, 0, 0, + 0, 0, 16, 1,112, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0, 88, 0, 40, 1,240, 0,136, 0,216, 1, 64, 1, 80, 0, 88, 0, + 32, 3,104, 0, 88, 1, 0, 0,128, 0,104, 0,208, 0, 80, 0, 8, 0, 16, 0,216, 1, 0, 0, 0, 0, 0, 0,176, 1, 20, 0, + 48, 0, 64, 0, 24, 0, 12, 0, 16, 0, 4, 0, 8, 0, 8, 0, 0, 0, 40, 0,128, 0, 48, 0, 8, 0, 16, 0, 8, 0, 8, 0, + 4, 0, 4, 0, 0, 1, 32, 0, 16, 0, 16, 0, 64, 0, 24, 0, 12, 0, 64, 0, 80, 0,104, 0,120, 0,128, 0, 96, 0,128, 0, +160, 0, 96, 0, 88, 0,136, 0, 88, 0,112, 0, 0, 1, 56, 0,192, 0,184, 0,232, 0, 88, 0,120, 0,136, 0,224, 0,136, 0, +248, 0, 80, 0,136, 0, 0, 0,152, 0, 40, 0, 8, 2,160, 0, 0, 0,120, 0, 0, 0, 0, 0, 96, 0, 8, 0, 8, 0, 48, 1, +112, 0,240, 1,104, 0, 96, 0, 88, 0, 96, 0,200, 1,144, 0,136, 0, 80, 0,136, 0,112, 0, 8, 1, 48, 0, 0, 0,144, 0, +176, 0,104, 0, 48, 0, 24, 0,120, 0,152, 0,120, 1,224, 0,192, 0, 0, 0, 72, 0,168, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 0,232, 1, 40, 0,184, 0,152, 0, 64, 0, 64, 0, 24, 0, 88, 0, 0, 4, 64, 0, 24, 0, 16, 0,104, 0, 96, 0, 32, 0, +168, 1, 56, 0, 16, 0,168, 0, 88, 0, 56, 0, 64, 0,184, 1, 32, 0, 8, 0, 24, 0, 80, 2, 0, 0, 0, 0, 88, 0,104, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 1, 56, 0,144, 0, 72, 0,208, 0,240, 0, 40, 0,248, 0,240, 0,200, 1,104, 0, + 0, 0,168, 0, 0, 0, 32, 1, 16, 0, 16, 0, 72, 33,128, 16, 24, 16,216, 0,144, 2,120, 2, 64, 0, 48, 0,216, 0, 32, 1, + 72, 0,200, 2, 40, 0,144, 1,104, 0, 24, 1, 32, 0,232, 0, 32, 0, 32, 0,112, 2,104, 1, 16, 0, 56, 29, 80, 0, 56, 0, + 8, 13, 32, 0, 40, 0, 88, 1, 0, 0, 0, 0,160, 0, 0, 0, 40, 1, 0, 0, 24, 1, 80, 0, 48, 0, 16, 0, 8, 0, 44, 0, + 0, 1, 32, 1,200, 1, 24, 1,136, 1, 32, 0, 12, 0, 24, 0, 52, 0, 16, 0, 24, 0, 24, 0, 32, 0, 72, 1, 0, 0, 64, 0, + 64, 0, 48, 0, 8, 0, 48, 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 72, 0, 96, 0,104, 0, + 60, 0,128, 0, 80, 0, 80, 0, 16, 0, 96, 0, 72, 0, 32, 0, 88, 0, 24, 0, 80, 0,112, 0, 84, 0, 32, 0, 96, 0, 56, 0, + 56, 0,112, 0,140, 0, 4, 0, 24, 0, 16, 0, 8, 0, 88, 0, 40, 0,216, 0, 40, 0, 40, 1,200, 0, 16, 0, 16, 2, 0, 0, + 4, 0, 40, 0,120, 0, 0, 1, 88, 0, 56, 0, 88, 0,128, 0, 80, 0,120, 0, 24, 0, 56, 0, 48, 0, 48, 0, 48, 0, 8, 0, + 40, 0, 72, 0, 72, 0, 48, 0, 48, 0, 24, 0, 56, 0,104, 0, 16, 0,112, 0, 96, 0, 56, 0, 28, 0, 28, 0, 28, 0, 56, 0, + 24, 0, 72, 0,168, 0, 40, 0,144, 0, 56, 0,232, 0, 0, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, + 44, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 16, 0, 24, 0, 32, 0, 8, 0, 84, 0, 20, 0, 32, 0, 12, 0, 56, 0, 24, 0, + 72, 0,240, 0, 24, 0, 56, 0, 56, 0, 20, 0, 64, 0, 40, 0, 32, 0,192, 0, 36, 0, 16, 2,104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, 40, 0, 20, 0, 24, 1,224, 0,168, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, +120, 0, 0, 0,104, 0, 24, 0, 24, 0, 16, 0, 24, 0, 8, 0, 16, 0, 24, 0, 20, 0, 20, 0, 56, 0, 24, 2, 40, 1, 16, 0, +104, 0, 0, 1, 40, 0,200, 0,104, 0,112, 0,168, 0, 32, 0, 80, 0, 56, 0, 80, 0, 64, 0,104, 0, 72, 0, 64, 0,128, 0, + 0, 0, 0, 0, 83, 84, 82, 67,153, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1, 0, 11, 0, 3, 0, 11, 0, 0, 0, + 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0, 9, 0, 4, 0, 13, 0, 2, 0, 2, 0, 5, 0, 2, 0, 6, 0, + 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 2, 0, 4, 0, 5, 0, 4, 0, 6, 0, 16, 0, 2, 0, 8, 0, 5, 0, + 8, 0, 6, 0, 17, 0, 3, 0, 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 18, 0, 3, 0, 7, 0, 5, 0, 7, 0, 6, 0, + 7, 0, 7, 0, 19, 0, 3, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 20, 0, 4, 0, 4, 0, 5, 0, 4, 0, 6, 0, + 4, 0, 7, 0, 4, 0, 8, 0, 21, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 8, 0, 22, 0, 4, 0, + 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 8, 0, 8, 0, 23, 0, 4, 0, 4, 0, 9, 0, 4, 0, 10, 0, 4, 0, 11, 0, + 4, 0, 12, 0, 24, 0, 4, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 25, 0, 4, 0, 9, 0, 13, 0, + 12, 0, 14, 0, 4, 0, 15, 0, 4, 0, 16, 0, 26, 0, 10, 0, 26, 0, 0, 0, 26, 0, 1, 0, 0, 0, 17, 0, 0, 0, 18, 0, + 2, 0, 19, 0, 0, 0, 20, 0, 4, 0, 21, 0, 25, 0, 22, 0, 4, 0, 23, 0, 4, 0, 24, 0, 27, 0, 9, 0, 9, 0, 0, 0, + 9, 0, 1, 0, 27, 0, 25, 0, 28, 0, 26, 0, 0, 0, 27, 0, 2, 0, 28, 0, 2, 0, 19, 0, 4, 0, 29, 0, 26, 0, 30, 0, + 28, 0, 8, 0, 27, 0, 31, 0, 27, 0, 32, 0, 29, 0, 33, 0, 0, 0, 34, 0, 0, 0, 35, 0, 4, 0, 36, 0, 4, 0, 37, 0, + 28, 0, 38, 0, 30, 0, 6, 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0, 2, 0, 43, 0, 4, 0, 44, 0, + 31, 0, 6, 0, 32, 0, 45, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 48, 0, 33, 0, 21, 0, + 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 49, 0, 35, 0, 50, 0, 24, 0, 51, 0, 24, 0, 52, 0, 2, 0, 46, 0, 2, 0, 47, 0, + 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 56, 0, 2, 0, 19, 0, 2, 0, 57, 0, 7, 0, 11, 0, 7, 0, 12, 0, + 4, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 7, 0, 61, 0, 31, 0, 62, 0, 36, 0, 7, 0, 27, 0, 31, 0, 12, 0, 63, 0, + 24, 0, 64, 0, 2, 0, 46, 0, 2, 0, 65, 0, 2, 0, 66, 0, 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0, 37, 0, 1, 0, + 7, 0, 67, 0, 7, 0, 61, 0, 2, 0, 17, 0, 2, 0, 47, 0, 2, 0, 68, 0, 2, 0, 19, 0, 4, 0, 69, 0, 4, 0, 70, 0, + 9, 0, 2, 0, 7, 0, 71, 0, 0, 0, 20, 0, 0, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0, 38, 0, 13, 0, 27, 0, 31, 0, + 39, 0, 75, 0, 37, 0, 76, 0, 0, 0, 77, 0, 4, 0, 78, 0, 7, 0, 61, 0, 12, 0, 79, 0, 36, 0, 80, 0, 27, 0, 81, 0, + 2, 0, 17, 0, 2, 0, 82, 0, 2, 0, 83, 0, 2, 0, 19, 0, 40, 0, 6, 0, 40, 0, 0, 0, 40, 0, 1, 0, 0, 0, 84, 0, + 0, 0, 85, 0, 4, 0, 23, 0, 4, 0, 86, 0, 41, 0, 10, 0, 41, 0, 0, 0, 41, 0, 1, 0, 4, 0, 87, 0, 4, 0, 88, 0, + 4, 0, 89, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, 42, 0, 15, 0, 27, 0, 31, 0, + 0, 0, 93, 0, 4, 0, 90, 0, 4, 0, 94, 0, 12, 0, 95, 0, 40, 0, 96, 0, 40, 0, 97, 0, 4, 0, 98, 0, 4, 0, 99, 0, + 12, 0,100, 0, 0, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, 9, 0,104, 0, 8, 0,105, 0, 43, 0, 3, 0, 4, 0,106, 0, + 4, 0,107, 0, 9, 0, 2, 0, 44, 0, 15, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0,108, 0, + 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,116, 0, + 36, 0, 80, 0, 32, 0,117, 0, 45, 0, 13, 0, 4, 0,118, 0, 4, 0,119, 0, 4, 0,120, 0, 4, 0,121, 0, 2, 0,122, 0, + 2, 0,123, 0, 2, 0, 19, 0, 2, 0,124, 0, 2, 0,125, 0, 2, 0,126, 0, 2, 0,127, 0, 2, 0,128, 0, 46, 0,129, 0, + 47, 0, 32, 0, 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,130, 0, 48, 0,131, 0, 49, 0,132, 0, 50, 0,133, 0, 50, 0,134, 0, + 2, 0,135, 0, 2, 0,136, 0, 2, 0,124, 0, 2, 0, 19, 0, 2, 0,137, 0, 2, 0, 17, 0, 4, 0,138, 0, 2, 0,139, 0, + 2, 0,140, 0, 2, 0,141, 0, 2, 0,142, 0, 2, 0,143, 0, 2, 0,144, 0, 4, 0,145, 0, 4, 0,146, 0, 43, 0,147, 0, + 30, 0,148, 0, 7, 0,149, 0, 4, 0,150, 0, 2, 0,151, 0, 2, 0,152, 0, 2, 0,153, 0, 2, 0,154, 0, 7, 0,155, 0, + 7, 0,156, 0, 51, 0, 63, 0, 2, 0,157, 0, 2, 0,158, 0, 2, 0,159, 0, 2, 0,160, 0, 32, 0,161, 0, 52, 0,162, 0, + 0, 0,163, 0, 0, 0,164, 0, 0, 0,165, 0, 0, 0,166, 0, 0, 0,167, 0, 7, 0,168, 0, 7, 0,169, 0, 7, 0,170, 0, + 2, 0,171, 0, 2, 0,172, 0, 2, 0,173, 0, 2, 0,174, 0, 2, 0,175, 0, 2, 0,176, 0, 0, 0,177, 0, 0, 0,178, 0, + 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0, 57, 0, 7, 0,184, 0, 7, 0,185, 0, + 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, + 7, 0,194, 0, 7, 0,195, 0, 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, + 7, 0,202, 0, 7, 0,203, 0, 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, + 7, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0, 7, 0,217, 0, + 7, 0,218, 0, 53, 0, 15, 0, 0, 0,219, 0, 9, 0,220, 0, 0, 0,221, 0, 0, 0,222, 0, 4, 0,223, 0, 4, 0,224, 0, + 9, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, 4, 0,229, 0, 9, 0,230, 0, 9, 0,231, 0, 4, 0,232, 0, + 4, 0, 37, 0, 54, 0, 6, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,233, 0, 7, 0, 67, 0, 4, 0, 64, 0, + 55, 0, 5, 0, 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,234, 0, 54, 0,228, 0, 56, 0, 17, 0, 32, 0,161, 0, + 47, 0,235, 0, 57, 0,236, 0, 7, 0,237, 0, 7, 0,238, 0, 2, 0, 17, 0, 2, 0,239, 0, 7, 0,109, 0, 7, 0,110, 0, + 7, 0,240, 0, 4, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 4, 0,124, 0, 4, 0,138, 0, 2, 0,244, 0, 2, 0,245, 0, + 58, 0, 22, 0, 2, 0, 19, 0, 2, 0,246, 0, 7, 0,247, 0, 7, 0,248, 0, 2, 0,137, 0, 2, 0,249, 0, 4, 0,250, 0, + 4, 0,251, 0, 32, 0,161, 0, 4, 0,252, 0, 2, 0,253, 0, 2, 0,254, 0, 9, 0,255, 0, 7, 0, 0, 1, 7, 0, 1, 1, + 2, 0, 2, 1, 2, 0, 3, 1, 2, 0, 4, 1, 2, 0, 5, 1, 7, 0, 6, 1, 7, 0, 7, 1, 55, 0, 8, 1, 59, 0, 13, 0, + 4, 0, 9, 1, 4, 0, 10, 1, 2, 0, 11, 1, 2, 0, 19, 0, 2, 0, 12, 1, 2, 0, 13, 1, 32, 0,161, 0, 7, 0, 14, 1, + 4, 0, 15, 1, 0, 0, 16, 1, 7, 0, 17, 1, 4, 0, 18, 1, 4, 0,124, 0, 52, 0, 63, 0, 27, 0, 31, 0, 39, 0, 75, 0, + 7, 0, 19, 1, 7, 0, 20, 1, 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 25, 1, 7, 0, 26, 1, + 7, 0, 27, 1, 7, 0, 70, 0, 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 7, 0, 32, 1, 7, 0, 33, 1, + 7, 0, 34, 1, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 2, 0, 40, 1, 2, 0, 41, 1, + 2, 0, 42, 1, 2, 0, 43, 1, 2, 0, 44, 1, 2, 0, 45, 1, 2, 0, 46, 1, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,239, 0, + 7, 0, 47, 1, 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 4, 0, 51, 1, 4, 0, 52, 1, 2, 0, 53, 1, 2, 0, 54, 1, + 2, 0, 12, 1, 2, 0,122, 0, 4, 0, 23, 0, 4, 0,119, 0, 4, 0,120, 0, 4, 0,121, 0, 7, 0, 55, 1, 7, 0, 56, 1, + 7, 0, 43, 0, 45, 0, 57, 1, 60, 0, 58, 1, 36, 0, 80, 0, 47, 0,235, 0, 53, 0, 59, 1, 55, 0, 8, 1, 56, 0, 60, 1, + 30, 0,148, 0, 58, 0, 61, 1, 59, 0, 62, 1, 0, 0, 63, 1, 0, 0,178, 0, 61, 0, 8, 0, 7, 0, 64, 1, 7, 0, 65, 1, + 7, 0,169, 0, 4, 0, 19, 0, 7, 0, 66, 1, 7, 0, 67, 1, 7, 0, 68, 1, 32, 0, 45, 0, 62, 0, 72, 0, 27, 0, 31, 0, + 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 69, 1, 2, 0,172, 0, 2, 0, 70, 1, 7, 0,179, 0, 7, 0,180, 0, + 7, 0,181, 0, 7, 0,182, 0, 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1, 7, 0, 76, 1, + 7, 0, 77, 1, 7, 0, 78, 1, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 63, 0, 82, 1, 2, 0,246, 0, 2, 0, 70, 0, + 7, 0,109, 0, 7, 0,110, 0, 7, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1, 2, 0, 88, 1, + 2, 0, 89, 1, 2, 0, 90, 1, 2, 0, 91, 1, 0, 0, 92, 1, 0, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1, 2, 0, 96, 1, + 2, 0, 97, 1, 2, 0, 98, 1, 7, 0, 99, 1, 7, 0,100, 1, 7, 0,101, 1, 7, 0,102, 1, 2, 0,103, 1, 2, 0, 43, 0, + 2, 0,104, 1, 2, 0,105, 1, 2, 0,106, 1, 2, 0,107, 1, 7, 0,108, 1, 7, 0,109, 1, 7, 0,110, 1, 7, 0,111, 1, + 7, 0,112, 1, 7, 0,113, 1, 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1, 7, 0,118, 1, 7, 0,119, 1, + 2, 0,120, 1, 0, 0,121, 1, 36, 0, 80, 0, 51, 0,122, 1, 2, 0,123, 1, 0, 0,124, 1, 30, 0,148, 0, 64, 0, 2, 0, + 27, 0, 31, 0, 36, 0, 80, 0, 65, 0, 18, 0, 7, 0,125, 1, 7, 0,126, 1, 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, + 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, 2, 0,135, 1, 2, 0,136, 1, 2, 0,137, 1, + 2, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, 7, 0,141, 1, 7, 0,142, 1, 66, 0,124, 0, 27, 0, 31, 0, 39, 0, 75, 0, + 2, 0,143, 1, 2, 0, 19, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, + 7, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, + 7, 0,155, 1, 7, 0,156, 1, 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1, 7, 0,160, 1, 7, 0,161, 1, 7, 0,162, 1, + 7, 0,163, 1, 65, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, 7, 0,168, 1, 7, 0,169, 1, 7, 0,170, 1, + 7, 0,171, 1, 2, 0,172, 1, 2, 0,173, 1, 2, 0,174, 1, 0, 0,175, 1, 0, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, + 2, 0,179, 1, 2, 0,180, 1, 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 2, 0,185, 1, 2, 0,186, 1, + 4, 0, 69, 1, 4, 0,187, 1, 2, 0,188, 1, 2, 0,189, 1, 2, 0,190, 1, 2, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, + 7, 0,194, 1, 7, 0,195, 1, 7, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1, 7, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, + 0, 0,202, 1, 7, 0,203, 1, 7, 0,204, 1, 7, 0,205, 1, 4, 0,206, 1, 0, 0,207, 1, 0, 0,104, 1, 0, 0,208, 1, + 0, 0, 63, 1, 2, 0,209, 1, 2, 0,210, 1, 2, 0,123, 1, 2, 0,211, 1, 2, 0,212, 1, 2, 0,213, 1, 7, 0,214, 1, + 7, 0,215, 1, 7, 0,216, 1, 7, 0,217, 1, 7, 0,218, 1, 2, 0,157, 0, 2, 0,158, 0, 55, 0,219, 1, 55, 0,220, 1, + 0, 0,221, 1, 0, 0,222, 1, 0, 0,223, 1, 0, 0,224, 1, 2, 0,225, 1, 2, 0,226, 1, 7, 0,227, 1, 7, 0,228, 1, + 51, 0,122, 1, 60, 0, 58, 1, 36, 0, 80, 0, 67, 0,229, 1, 30, 0,148, 0, 7, 0,230, 1, 7, 0,231, 1, 7, 0,232, 1, + 7, 0,233, 1, 7, 0,234, 1, 2, 0,235, 1, 2, 0, 70, 0, 7, 0,236, 1, 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, + 7, 0,240, 1, 7, 0,241, 1, 7, 0,242, 1, 7, 0,243, 1, 7, 0,244, 1, 2, 0,245, 1, 2, 0,246, 1, 4, 0,247, 1, + 4, 0,248, 1, 12, 0,249, 1, 68, 0, 4, 0, 27, 0, 31, 0, 0, 0,250, 1, 69, 0, 2, 0, 43, 0,147, 0, 70, 0, 26, 0, + 70, 0, 0, 0, 70, 0, 1, 0, 71, 0,251, 1, 4, 0,252, 1, 4, 0,253, 1, 4, 0,254, 1, 4, 0,255, 1, 4, 0, 0, 2, + 4, 0, 1, 2, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 2, 2, 2, 0, 3, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, + 7, 0, 4, 2, 7, 0, 5, 2, 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 23, 0, + 7, 0, 11, 2, 7, 0, 12, 2, 72, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0,251, 1, 12, 0, 13, 2, 12, 0, 14, 2, + 12, 0, 15, 2, 36, 0, 80, 0, 66, 0, 16, 2, 0, 0, 19, 0, 0, 0, 17, 2, 2, 0, 18, 2, 2, 0,171, 0, 2, 0, 37, 0, + 7, 0, 64, 1, 7, 0,169, 0, 7, 0, 65, 1, 7, 0, 19, 2, 7, 0, 20, 2, 7, 0, 21, 2, 70, 0, 22, 2, 35, 0, 11, 0, + 7, 0, 23, 2, 7, 0, 24, 2, 7, 0, 25, 2, 7, 0,248, 0, 2, 0, 55, 0, 0, 0, 26, 2, 0, 0, 27, 2, 0, 0, 28, 2, + 0, 0, 29, 2, 0, 0, 30, 2, 0, 0, 31, 2, 34, 0, 7, 0, 7, 0, 32, 2, 7, 0, 24, 2, 7, 0, 25, 2, 2, 0, 28, 2, + 2, 0, 31, 2, 7, 0,248, 0, 7, 0, 37, 0, 73, 0, 21, 0, 73, 0, 0, 0, 73, 0, 1, 0, 2, 0, 17, 0, 2, 0, 33, 2, + 2, 0, 31, 2, 2, 0, 19, 0, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 38, 2, 2, 0, 39, 2, + 2, 0, 40, 2, 2, 0, 41, 2, 7, 0, 42, 2, 7, 0, 43, 2, 34, 0, 49, 0, 35, 0, 50, 0, 2, 0, 44, 2, 2, 0, 45, 2, + 4, 0, 46, 2, 74, 0, 5, 0, 2, 0, 47, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 70, 0, 75, 0, 4, 0, + 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 8, 0, 7, 0, 48, 2, 76, 0, 68, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0,251, 1, + 12, 0, 49, 2, 12, 0, 14, 2, 12, 0, 50, 2, 32, 0, 51, 2, 32, 0, 52, 2, 32, 0, 53, 2, 36, 0, 80, 0, 77, 0, 54, 2, + 38, 0, 55, 2, 66, 0, 16, 2, 12, 0, 56, 2, 7, 0, 64, 1, 7, 0,169, 0, 7, 0, 65, 1, 2, 0,171, 0, 2, 0, 43, 0, + 2, 0, 57, 2, 2, 0, 58, 2, 2, 0, 59, 2, 7, 0, 60, 2, 7, 0, 70, 0, 2, 0, 61, 2, 2, 0, 18, 2, 2, 0, 19, 0, + 2, 0, 62, 2, 7, 0, 63, 2, 7, 0, 64, 2, 7, 0, 65, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 66, 2, 2, 0, 67, 2, + 4, 0, 68, 2, 9, 0, 69, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 67, 0, 2, 0, 70, 2, 7, 0, 71, 2, 7, 0, 72, 2, + 7, 0, 73, 2, 7, 0, 74, 2, 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2, 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 80, 2, + 0, 0, 81, 2, 78, 0, 82, 2, 79, 0, 83, 2, 0, 0, 84, 2, 68, 0, 85, 2, 68, 0, 86, 2, 68, 0, 87, 2, 68, 0, 88, 2, + 4, 0, 89, 2, 7, 0, 90, 2, 4, 0, 91, 2, 4, 0, 92, 2, 75, 0, 93, 2, 4, 0, 94, 2, 4, 0, 95, 2, 74, 0, 96, 2, + 74, 0, 97, 2, 80, 0, 41, 0, 27, 0, 31, 0, 39, 0, 75, 0, 71, 0,251, 1, 12, 0, 98, 2, 36, 0, 80, 0, 38, 0, 55, 2, + 66, 0, 16, 2, 81, 0, 99, 2, 82, 0,100, 2, 83, 0,101, 2, 84, 0,102, 2, 85, 0,103, 2, 86, 0,104, 2, 87, 0,105, 2, + 88, 0,106, 2, 80, 0,107, 2, 89, 0,108, 2, 90, 0,109, 2, 91, 0,110, 2, 91, 0,111, 2, 91, 0,112, 2, 4, 0, 54, 0, + 4, 0,113, 2, 4, 0,114, 2, 4, 0,115, 2, 4, 0,116, 2, 2, 0,171, 0, 2, 0,117, 2, 7, 0, 64, 1, 7, 0,169, 0, + 7, 0, 65, 1, 7, 0,118, 2, 4, 0, 57, 2, 2, 0,119, 2, 2, 0, 19, 0, 2, 0,120, 2, 2, 0,121, 2, 2, 0, 18, 2, + 2, 0,122, 2, 92, 0,123, 2, 93, 0,124, 2, 83, 0, 8, 0, 9, 0,125, 2, 7, 0,126, 2, 4, 0,127, 2, 0, 0, 19, 0, + 0, 0,128, 2, 2, 0, 69, 1, 2, 0,129, 2, 2, 0,130, 2, 81, 0, 7, 0, 4, 0,131, 2, 4, 0,132, 2, 4, 0,133, 2, + 4, 0,134, 2, 2, 0, 33, 2, 0, 0,135, 2, 0, 0, 19, 0, 85, 0, 5, 0, 4, 0,131, 2, 4, 0,132, 2, 0, 0,136, 2, + 0, 0,137, 2, 2, 0, 19, 0, 94, 0, 2, 0, 4, 0,138, 2, 7, 0, 25, 2, 86, 0, 3, 0, 94, 0,139, 2, 4, 0,140, 2, + 4, 0, 19, 0, 84, 0, 6, 0, 7, 0,141, 2, 2, 0,142, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0,137, 2, 0, 0, 59, 2, + 87, 0, 4, 0, 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 95, 0, 6, 0, 47, 0,125, 2, 0, 0, 19, 0, + 0, 0,128, 2, 2, 0, 69, 1, 2, 0,129, 2, 2, 0,130, 2, 96, 0, 1, 0, 7, 0,143, 2, 97, 0, 5, 0, 0, 0,233, 0, + 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 4, 0, 37, 0, 88, 0, 1, 0, 7, 0,144, 2, 89, 0, 2, 0, 4, 0,145, 2, + 4, 0, 17, 0, 82, 0, 7, 0, 7, 0,126, 2, 47, 0,125, 2, 0, 0, 19, 0, 0, 0,128, 2, 2, 0, 69, 1, 2, 0,129, 2, + 2, 0,130, 2, 98, 0, 1, 0, 7, 0,146, 2, 99, 0, 1, 0, 4, 0,147, 2,100, 0, 1, 0, 0, 0,148, 2,101, 0, 1, 0, + 7, 0,126, 2,102, 0, 3, 0, 4, 0,149, 2, 0, 0, 92, 0, 7, 0,150, 2,103, 0, 4, 0, 7, 0,233, 0, 7, 0,179, 0, + 7, 0,180, 0, 7, 0,181, 0,104, 0, 1, 0,103, 0,127, 2,105, 0, 5, 0, 4, 0,151, 2, 4, 0,152, 2, 0, 0, 19, 0, + 0, 0, 33, 2, 0, 0, 59, 2,106, 0, 2, 0, 4, 0,153, 2, 4, 0,152, 2,107, 0, 10, 0,107, 0, 0, 0,107, 0, 1, 0, +105, 0,154, 2,104, 0,155, 2,106, 0,156, 2, 4, 0, 54, 0, 4, 0,114, 2, 4, 0,113, 2, 4, 0, 37, 0, 84, 0,157, 2, + 92, 0, 14, 0, 12, 0,158, 2, 84, 0,157, 2, 0, 0,159, 2, 0, 0,160, 2, 0, 0,161, 2, 0, 0,162, 2, 0, 0,163, 2, + 0, 0,164, 2, 0, 0,165, 2, 0, 0, 19, 0, 91, 0,110, 2, 91, 0,112, 2, 2, 0,166, 2, 0, 0,167, 2, 93, 0, 8, 0, + 4, 0,168, 2, 4, 0,169, 2, 81, 0,170, 2, 85, 0,171, 2, 4, 0,114, 2, 4, 0,113, 2, 4, 0, 54, 0, 4, 0, 37, 0, +108, 0, 9, 0,108, 0, 0, 0,108, 0, 1, 0, 4, 0, 17, 0, 4, 0, 69, 1, 4, 0,172, 2, 4, 0, 37, 0, 0, 0, 20, 0, + 46, 0,129, 0, 0, 0,173, 2,109, 0, 7, 0,108, 0,174, 2, 2, 0,175, 2, 2, 0,158, 2, 2, 0,176, 2, 2, 0, 90, 0, + 9, 0,177, 2, 9, 0,178, 2,110, 0, 3, 0,108, 0,174, 2, 32, 0,161, 0, 0, 0, 20, 0,111, 0, 5, 0,108, 0,174, 2, + 32, 0,161, 0, 0, 0, 20, 0, 2, 0,179, 2, 0, 0,180, 2,112, 0, 5, 0,108, 0,174, 2, 7, 0, 88, 0, 7, 0,181, 2, + 4, 0,182, 2, 4, 0,183, 2,113, 0, 5, 0,108, 0,174, 2, 32, 0,184, 2, 0, 0, 72, 0, 4, 0, 69, 1, 4, 0, 19, 0, +114, 0, 13, 0,108, 0,174, 2, 32, 0,185, 2, 32, 0,186, 2, 32, 0,187, 2, 32, 0,188, 2, 7, 0,189, 2, 7, 0,190, 2, + 7, 0,181, 2, 7, 0,191, 2, 4, 0,192, 2, 4, 0,193, 2, 4, 0, 90, 0, 4, 0,194, 2,115, 0, 5, 0,108, 0,174, 2, + 2, 0,195, 2, 2, 0, 19, 0, 7, 0,196, 2, 32, 0,197, 2,116, 0, 3, 0,108, 0,174, 2, 7, 0,198, 2, 4, 0, 90, 0, +117, 0, 10, 0,108, 0,174, 2, 7, 0,199, 2, 4, 0,200, 2, 4, 0, 37, 0, 2, 0, 90, 0, 2, 0,201, 2, 2, 0,202, 2, + 2, 0,203, 2, 7, 0,204, 2, 0, 0,205, 2,118, 0, 3, 0,108, 0,174, 2, 7, 0, 37, 0, 4, 0, 17, 0,119, 0, 6, 0, +108, 0,174, 2,120, 0,206, 2,121, 0,207, 2,122, 0,208, 2, 7, 0,209, 2, 4, 0, 17, 0,123, 0, 11, 0,108, 0,174, 2, + 52, 0,210, 2, 7, 0,211, 2, 4, 0,212, 2, 0, 0,205, 2, 7, 0,213, 2, 4, 0,214, 2, 32, 0,215, 2, 0, 0,216, 2, + 4, 0,217, 2, 4, 0, 37, 0,124, 0, 12, 0,108, 0,174, 2, 32, 0,218, 2, 47, 0,219, 2, 4, 0, 90, 0, 4, 0,220, 2, + 7, 0,221, 2, 7, 0,222, 2, 7, 0,223, 2, 7, 0,224, 2, 0, 0,216, 2, 4, 0,217, 2, 4, 0, 37, 0,125, 0, 3, 0, +108, 0,174, 2, 7, 0,225, 2, 4, 0,226, 2,126, 0, 5, 0,108, 0,174, 2, 7, 0,227, 2, 0, 0,205, 2, 2, 0, 19, 0, + 2, 0,228, 2,127, 0, 8, 0,108, 0,174, 2, 32, 0,161, 0, 7, 0,227, 2, 7, 0,248, 0, 7, 0,106, 0, 0, 0,205, 2, + 2, 0, 19, 0, 2, 0, 17, 0,128, 0, 21, 0,108, 0,174, 2, 32, 0,229, 2, 0, 0,205, 2, 52, 0,210, 2, 32, 0,215, 2, + 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,230, 2, 7, 0,231, 2, 7, 0,232, 2, 7, 0, 63, 2, 7, 0,233, 2, 7, 0,234, 2, + 7, 0,235, 2, 7, 0,236, 2, 4, 0,214, 2, 4, 0,217, 2, 0, 0,216, 2, 7, 0,237, 2, 7, 0,238, 2, 7, 0, 43, 0, +129, 0, 7, 0,108, 0,174, 2, 2, 0,239, 2, 2, 0,240, 2, 4, 0, 70, 0, 32, 0,161, 0, 7, 0,241, 2, 0, 0,205, 2, +130, 0, 10, 0,108, 0,174, 2, 32, 0,161, 0, 0, 0,242, 2, 7, 0,243, 2, 7, 0,244, 2, 7, 0,236, 2, 4, 0,245, 2, + 4, 0,246, 2, 7, 0,247, 2, 0, 0, 20, 0,131, 0, 1, 0,108, 0,174, 2,132, 0, 7, 0,108, 0,174, 2, 46, 0,129, 0, +133, 0,248, 2,134, 0,249, 2,135, 0,250, 2,136, 0,251, 2, 12, 0,252, 2,137, 0, 13, 0,108, 0,174, 2, 84, 0,253, 2, + 84, 0,254, 2, 84, 0,255, 2, 84, 0, 0, 3, 84, 0, 1, 3, 84, 0, 2, 3, 81, 0, 3, 3, 4, 0, 4, 3, 4, 0, 5, 3, + 7, 0,209, 2, 7, 0, 37, 0,138, 0, 6, 3,139, 0, 7, 0,108, 0,174, 2, 84, 0,253, 2, 84, 0, 7, 3,140, 0, 8, 3, +141, 0, 6, 3, 4, 0, 9, 3, 4, 0, 4, 3,142, 0, 4, 0,108, 0,174, 2, 32, 0,161, 0, 4, 0, 10, 3, 4, 0, 37, 0, +143, 0, 2, 0, 4, 0, 11, 3, 7, 0, 25, 2,144, 0, 2, 0, 4, 0,120, 0, 4, 0, 12, 3,145, 0, 24, 0,108, 0,174, 2, + 32, 0,161, 0, 0, 0,205, 2, 2, 0, 13, 3, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0, 37, 0,143, 0, 14, 3, 4, 0, 15, 3, + 7, 0, 16, 3, 4, 0, 54, 0, 4, 0, 17, 3,144, 0, 18, 3,143, 0, 19, 3, 4, 0, 20, 3, 4, 0, 21, 3, 4, 0, 22, 3, + 4, 0, 12, 3, 7, 0, 23, 3, 7, 0, 24, 3, 7, 0, 25, 3, 7, 0, 26, 3, 7, 0, 27, 3, 9, 0, 28, 3,146, 0, 8, 0, +108, 0,174, 2,147, 0, 29, 3,140, 0, 8, 3, 4, 0, 30, 3, 4, 0, 31, 3, 4, 0, 32, 3, 2, 0, 19, 0, 2, 0, 57, 0, +148, 0, 8, 0,108, 0,174, 2, 32, 0, 45, 0, 2, 0,252, 0, 2, 0, 19, 0, 2, 0,195, 2, 2, 0, 57, 0, 7, 0, 33, 3, + 7, 0, 34, 3,149, 0, 5, 0,108, 0,174, 2, 4, 0, 35, 3, 2, 0, 19, 0, 2, 0, 36, 3, 7, 0, 37, 3,150, 0, 8, 0, +108, 0,174, 2, 0, 0, 38, 3, 0, 0, 39, 3, 0, 0,164, 2, 0, 0, 40, 3, 0, 0, 41, 3, 0, 0, 90, 0, 0, 0, 59, 2, +151, 0, 3, 0,108, 0,174, 2,152, 0, 42, 3,136, 0,251, 2,153, 0, 10, 0,108, 0,174, 2, 32, 0, 43, 3, 32, 0, 44, 3, + 0, 0, 45, 3, 7, 0, 46, 3, 2, 0, 47, 3, 2, 0, 48, 3, 0, 0, 49, 3, 0, 0, 50, 3, 0, 0,180, 2,154, 0, 9, 0, +108, 0,174, 2, 32, 0, 51, 3, 0, 0, 45, 3, 7, 0, 52, 3, 7, 0, 53, 3, 0, 0, 69, 1, 0, 0,195, 2, 0, 0, 54, 3, + 0, 0, 37, 0,155, 0, 1, 0,108, 0,174, 2,156, 0, 8, 0,108, 0,174, 2, 0, 0,205, 2, 7, 0,120, 0, 7, 0, 55, 3, + 7, 0, 56, 3, 7, 0, 57, 3, 7, 0, 58, 3, 4, 0, 19, 0,157, 0, 9, 0,108, 0,174, 2, 32, 0, 59, 3, 4, 0, 60, 3, + 4, 0, 61, 3, 4, 0, 62, 3, 7, 0, 63, 3, 7, 0, 64, 3, 2, 0,195, 2, 2, 0, 19, 0,158, 0, 28, 0, 27, 0, 31, 0, + 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 65, 3, 2, 0, 19, 0, 2, 0, 66, 3, 2, 0, 67, 3, 2, 0, 68, 3, 2, 0, 70, 0, + 0, 0, 69, 3, 0, 0, 70, 3, 0, 0, 71, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 72, 3, 7, 0, 73, 3, 7, 0, 74, 3, + 7, 0, 75, 3, 7, 0, 76, 3, 7, 0, 77, 3, 34, 0, 78, 3, 36, 0, 80, 0, 38, 0, 55, 2, 86, 0,104, 2, 0, 0, 72, 0, + 7, 0, 79, 3, 7, 0, 80, 3,158, 0, 81, 3,159, 0, 3, 0,159, 0, 0, 0,159, 0, 1, 0, 0, 0, 20, 0, 71, 0, 3, 0, + 7, 0, 82, 3, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,126, 0, 27, 0, 31, 0, 39, 0, 75, 0,160, 0, 83, 3, 2, 0, 17, 0, + 2, 0, 84, 3, 4, 0, 85, 3, 4, 0, 86, 3, 4, 0, 87, 3, 0, 0, 88, 3, 32, 0, 38, 0, 32, 0, 89, 3, 32, 0, 90, 3, + 32, 0, 91, 3, 32, 0, 92, 3, 36, 0, 80, 0, 77, 0, 54, 2, 71, 0,251, 1,161, 0, 93, 3,161, 0, 94, 3,162, 0, 95, 3, + 9, 0, 2, 0,163, 0, 96, 3,164, 0, 97, 3,165, 0, 98, 3, 12, 0, 99, 3, 12, 0, 98, 2, 12, 0, 14, 2, 12, 0,100, 3, + 12, 0,101, 3, 4, 0, 69, 1, 4, 0,102, 3, 66, 0, 16, 2, 0, 0,103, 3, 4, 0, 18, 2, 4, 0,104, 3, 7, 0, 64, 1, + 7, 0,105, 3, 7, 0,106, 3, 7, 0,169, 0, 7, 0,107, 3, 7, 0, 65, 1, 7, 0,108, 3, 7, 0, 4, 2, 7, 0,109, 3, + 7, 0,110, 3, 7, 0,111, 3, 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3, 7, 0,243, 2, 7, 0,115, 3, 7, 0,237, 0, + 4, 0,116, 3, 2, 0, 19, 0, 2, 0,117, 3, 2, 0,118, 3, 2, 0,119, 3, 2, 0,120, 3, 2, 0,121, 3, 2, 0,122, 3, + 2, 0,123, 3, 2, 0,124, 3, 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 4, 0,128, 3, 4, 0,129, 3, 4, 0,130, 3, + 4, 0,131, 3, 7, 0,132, 3, 7, 0, 90, 2, 7, 0,133, 3, 7, 0,134, 3, 7, 0,135, 3, 7, 0,136, 3, 7, 0,137, 3, + 7, 0,212, 0, 7, 0,138, 3, 7, 0,139, 3, 7, 0,140, 3, 7, 0,141, 3, 2, 0,142, 3, 0, 0,143, 3, 0, 0,144, 3, + 0, 0,145, 3, 0, 0,146, 3, 7, 0,147, 3, 7, 0,148, 3, 12, 0,149, 3, 12, 0,150, 3, 12, 0,151, 3, 12, 0,152, 3, + 7, 0,153, 3, 2, 0,145, 2, 2, 0,154, 3, 7, 0,127, 2, 4, 0,155, 3, 4, 0,156, 3,166, 0,157, 3, 2, 0,158, 3, + 2, 0,244, 0, 7, 0,159, 3, 12, 0,160, 3, 12, 0,161, 3, 12, 0,162, 3, 12, 0,163, 3,167, 0, 61, 1,168, 0,164, 3, + 67, 0,165, 3, 2, 0,166, 3, 2, 0,167, 3, 2, 0,168, 3, 2, 0,169, 3, 7, 0,119, 2, 2, 0,170, 3, 2, 0,171, 3, +152, 0,172, 3,140, 0,173, 3,140, 0,174, 3, 4, 0,175, 3, 4, 0,176, 3, 4, 0,177, 3, 4, 0, 70, 0, 12, 0,178, 3, + 12, 0,179, 3, 12, 0,180, 3,169, 0, 14, 0,169, 0, 0, 0,169, 0, 1, 0, 32, 0, 38, 0, 7, 0,243, 2, 7, 0, 66, 1, + 7, 0,244, 2, 7, 0,236, 2, 0, 0, 20, 0, 4, 0,245, 2, 4, 0,246, 2, 4, 0,181, 3, 2, 0, 17, 0, 2, 0,182, 3, + 7, 0,247, 2,170, 0, 12, 0,170, 0, 0, 0,170, 0, 1, 0, 32, 0, 45, 0, 4, 0,183, 3, 4, 0,145, 2, 4, 0,184, 3, + 4, 0, 17, 0, 4, 0,185, 3, 7, 0, 66, 1, 7, 0,186, 3, 7, 0,187, 3, 7, 0,143, 2,167, 0, 40, 0, 4, 0, 19, 0, + 2, 0,188, 3, 2, 0,189, 3, 2, 0,236, 2, 2, 0,190, 3, 2, 0,191, 3, 2, 0,192, 3, 2, 0,193, 3, 2, 0,194, 3, + 7, 0,195, 3, 7, 0,196, 3, 7, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, + 7, 0,203, 3, 7, 0,204, 3, 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, + 7, 0,211, 3, 7, 0,212, 3, 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, + 7, 0,219, 3, 7, 0,220, 3, 7, 0,221, 3, 52, 0,162, 0,171, 0,222, 3, 7, 0,223, 3, 4, 0,183, 2,172, 0, 5, 0, + 67, 0,229, 1, 7, 0,224, 3, 7, 0,225, 3, 2, 0, 19, 0, 2, 0,226, 3,173, 0, 9, 0,173, 0, 0, 0,173, 0, 1, 0, + 4, 0,227, 3, 4, 0,228, 3, 4, 0,229, 3, 4, 0, 19, 0, 4, 0,230, 3, 9, 0,231, 3, 9, 0,232, 3,136, 0, 19, 0, +136, 0, 0, 0,136, 0, 1, 0, 4, 0, 19, 0, 4, 0,233, 3, 4, 0,234, 3, 4, 0,235, 3, 4, 0,236, 3, 4, 0,237, 3, + 4, 0,238, 3, 4, 0,228, 3, 4, 0,145, 2, 4, 0, 57, 0, 0, 0,239, 3, 0, 0,240, 3, 0, 0,241, 3, 0, 0,242, 3, + 12, 0,243, 3,174, 0,244, 3, 9, 0,245, 3,175, 0, 1, 0, 7, 0, 32, 2,166, 0, 30, 0, 4, 0, 19, 0, 7, 0,246, 3, + 7, 0,247, 3, 7, 0,248, 3, 4, 0,249, 3, 4, 0,250, 3, 4, 0,251, 3, 4, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, + 7, 0,255, 3, 7, 0, 0, 4, 7, 0, 1, 4, 7, 0, 2, 4, 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, + 7, 0, 7, 4, 7, 0, 8, 4, 7, 0, 9, 4, 7, 0, 10, 4, 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, + 4, 0, 15, 4, 4, 0, 16, 4, 7, 0, 17, 4, 7, 0,138, 3,168, 0, 54, 0, 4, 0,228, 3, 4, 0, 18, 4,176, 0, 19, 4, +177, 0, 20, 4, 0, 0, 37, 0, 0, 0, 21, 4, 2, 0, 22, 4, 7, 0, 23, 4, 0, 0, 24, 4, 7, 0, 25, 4, 7, 0, 26, 4, + 7, 0, 27, 4, 7, 0, 28, 4, 7, 0, 29, 4, 7, 0, 30, 4, 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 2, 0, 34, 4, + 0, 0, 35, 4, 2, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4, 0, 0, 39, 4, 4, 0,121, 0, 4, 0, 40, 4, 4, 0, 41, 4, + 2, 0, 42, 4, 2, 0, 43, 4,175, 0, 44, 4, 4, 0, 45, 4, 4, 0, 82, 0, 7, 0, 46, 4, 7, 0, 47, 4, 7, 0, 48, 4, + 7, 0, 49, 4, 2, 0, 50, 4, 2, 0, 51, 4, 2, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 2, 0, 55, 4, 2, 0, 56, 4, + 2, 0, 57, 4,178, 0, 58, 4, 7, 0, 59, 4, 7, 0, 60, 4,136, 0, 61, 4, 12, 0,252, 2,172, 0, 62, 4, 7, 0, 63, 4, + 7, 0, 64, 4, 7, 0, 65, 4, 0, 0, 66, 4,152, 0, 51, 0,151, 0, 67, 4, 2, 0, 17, 0, 2, 0, 68, 4, 2, 0, 69, 4, + 2, 0, 70, 4, 7, 0, 71, 4, 2, 0, 72, 4, 2, 0, 73, 4, 7, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, + 7, 0, 78, 4, 7, 0, 79, 4, 7, 0, 80, 4, 7, 0, 81, 4, 4, 0, 82, 4, 4, 0, 83, 4, 7, 0, 84, 4, 4, 0, 85, 4, + 7, 0, 86, 4, 7, 0, 87, 4, 7, 0, 88, 4, 80, 0, 89, 4, 80, 0, 90, 4, 80, 0, 91, 4, 0, 0, 92, 4, 7, 0, 93, 4, + 7, 0, 94, 4, 36, 0, 80, 0, 2, 0, 95, 4, 0, 0, 96, 4, 0, 0, 97, 4, 7, 0, 98, 4, 4, 0, 99, 4, 7, 0,100, 4, + 7, 0,101, 4, 4, 0,102, 4, 4, 0, 19, 0, 7, 0,103, 4, 7, 0,104, 4, 7, 0,105, 4, 84, 0,106, 4, 7, 0,107, 4, + 7, 0,108, 4, 7, 0,109, 4, 7, 0,110, 4, 7, 0,111, 4, 7, 0,112, 4, 7, 0,113, 4, 4, 0,114, 4,179, 0, 78, 0, + 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,172, 0, 2, 0, 70, 1, 2, 0,104, 1, 2, 0,115, 4, 7, 0,116, 4, 7, 0,117, 4, + 7, 0,118, 4, 7, 0,119, 4, 7, 0,120, 4, 7, 0,121, 4, 7, 0,122, 4, 7, 0,123, 4, 7, 0,150, 1, 7, 0,152, 1, + 7, 0,151, 1, 7, 0,124, 4, 4, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, + 7, 0,131, 4, 7, 0,132, 4, 2, 0,133, 4, 2, 0, 69, 1, 2, 0,134, 4, 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, + 2, 0,138, 4, 2, 0,139, 4, 7, 0,140, 4, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, + 7, 0,146, 4, 7, 0,147, 4, 7, 0,148, 4, 7, 0,149, 4, 7, 0,150, 4, 7, 0,151, 4, 2, 0,152, 4, 2, 0,153, 4, + 2, 0,154, 4, 2, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4, 7, 0,158, 4, 7, 0,159, 4, 2, 0,160, 4, 2, 0,161, 4, + 2, 0,162, 4, 2, 0,163, 4, 7, 0,164, 4, 7, 0,165, 4, 7, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, + 7, 0,170, 4, 2, 0,171, 4, 2, 0,172, 4, 2, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0, 19, 0, 7, 0,176, 4, + 7, 0,177, 4, 36, 0, 80, 0, 51, 0,122, 1, 2, 0,123, 1, 2, 0,178, 4, 30, 0,148, 0,180, 0, 8, 0,180, 0, 0, 0, +180, 0, 1, 0, 4, 0,116, 3, 4, 0,179, 4, 4, 0, 19, 0, 2, 0,180, 4, 2, 0,181, 4, 32, 0,161, 0,181, 0, 13, 0, + 9, 0,182, 4, 9, 0,183, 4, 4, 0,184, 4, 4, 0,185, 4, 4, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0,189, 4, + 4, 0,190, 4, 4, 0,191, 4, 4, 0,192, 4, 4, 0, 37, 0, 0, 0,193, 4,182, 0, 5, 0, 9, 0,194, 4, 9, 0,195, 4, + 4, 0,196, 4, 4, 0, 70, 0, 0, 0,197, 4,183, 0, 17, 0, 4, 0,198, 4, 4, 0,199, 4, 4, 0,200, 4, 4, 0,201, 4, + 4, 0,202, 4, 4, 0,203, 4, 4, 0,204, 4, 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, 4, 0,208, 4, 4, 0,209, 4, + 2, 0,210, 4, 2, 0,211, 4, 4, 0,212, 4, 4, 0,213, 4, 4, 0, 43, 0,184, 0, 15, 0, 4, 0, 17, 0, 4, 0,200, 4, + 4, 0,214, 4, 4, 0,215, 4, 4, 0,216, 4, 4, 0,217, 4, 7, 0,218, 4, 4, 0,219, 4, 4, 0, 90, 0, 4, 0,220, 4, + 4, 0,221, 4, 4, 0,222, 4, 4, 0,223, 4, 4, 0,224, 4, 26, 0, 30, 0,185, 0, 7, 0, 4, 0,225, 4, 7, 0,226, 4, + 7, 0,227, 4, 7, 0,228, 4, 4, 0,229, 4, 2, 0, 19, 0, 2, 0, 37, 0,186, 0, 11, 0,186, 0, 0, 0,186, 0, 1, 0, + 0, 0, 20, 0, 66, 0,230, 4, 67, 0,231, 4, 4, 0,116, 3, 4, 0,232, 4, 4, 0,233, 4, 4, 0, 37, 0, 4, 0,234, 4, + 4, 0,235, 4,187, 0,111, 0,181, 0,236, 4,182, 0,237, 4,183, 0,238, 4,184, 0,239, 4, 4, 0, 9, 3, 4, 0,121, 0, + 4, 0, 40, 4, 7, 0,240, 4, 4, 0,241, 4, 4, 0,242, 4, 4, 0,243, 4, 4, 0,244, 4, 2, 0, 19, 0, 2, 0,245, 4, + 7, 0,246, 4, 7, 0,247, 4, 7, 0,248, 4, 7, 0,249, 4, 7, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 2, 0,253, 4, + 2, 0,254, 4, 2, 0,243, 0, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 2, 5, 2, 0, 3, 5, 2, 0, 91, 1, + 2, 0,106, 0, 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, + 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 92, 1, 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0, 16, 5, 4, 0, 17, 5, + 4, 0, 69, 1, 4, 0, 18, 5, 2, 0, 19, 5, 2, 0, 20, 5, 2, 0, 21, 5, 2, 0,248, 1, 2, 0, 22, 5, 2, 0, 23, 5, + 2, 0, 24, 5, 2, 0, 25, 5, 24, 0, 26, 5, 24, 0, 27, 5, 23, 0, 28, 5, 12, 0, 29, 5, 2, 0, 30, 5, 2, 0, 31, 5, + 7, 0, 32, 5, 7, 0, 33, 5, 7, 0, 34, 5, 7, 0, 35, 5, 4, 0, 36, 5, 7, 0, 37, 5, 7, 0, 38, 5, 7, 0, 39, 5, + 7, 0, 40, 5, 2, 0, 41, 5, 2, 0, 42, 5, 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 7, 0, 47, 5, + 7, 0, 48, 5, 7, 0, 49, 5, 0, 0, 50, 5, 0, 0, 51, 5, 4, 0, 52, 5, 2, 0, 53, 5, 2, 0,226, 1, 0, 0, 54, 5, + 7, 0, 55, 5, 7, 0, 56, 5, 0, 0, 57, 5, 0, 0, 58, 5, 0, 0, 59, 5, 0, 0, 60, 5, 4, 0, 61, 5, 2, 0, 62, 5, + 2, 0, 63, 5, 7, 0, 64, 5, 7, 0, 65, 5, 2, 0, 66, 5, 2, 0, 67, 5, 7, 0, 68, 5, 2, 0, 69, 5, 2, 0, 70, 5, + 4, 0, 71, 5, 2, 0, 72, 5, 2, 0, 73, 5, 2, 0, 74, 5, 2, 0, 75, 5, 7, 0, 76, 5, 7, 0, 70, 0, 42, 0, 77, 5, + 0, 0, 78, 5,188, 0, 9, 0,188, 0, 0, 0,188, 0, 1, 0, 0, 0, 20, 0, 2, 0, 79, 5, 2, 0, 80, 5, 2, 0, 81, 5, + 2, 0, 43, 0, 7, 0, 82, 5, 7, 0, 70, 0,189, 0, 7, 0, 2, 0,200, 2, 2, 0, 69, 1, 2, 0, 64, 3, 2, 0, 83, 5, + 7, 0, 84, 5, 7, 0, 70, 0, 42, 0, 85, 5,190, 0, 5, 0, 7, 0, 86, 5, 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, + 0, 0,226, 1,191, 0, 28, 0, 7, 0,131, 4, 7, 0,132, 4, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0, 87, 5, 2, 0,178, 4, + 2, 0,134, 4, 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4,190, 0, 88, 5, 2, 0,251, 4, + 2, 0,252, 4, 2, 0,253, 4, 2, 0,254, 4, 2, 0,243, 0, 2, 0,255, 4, 2, 0, 89, 5, 2, 0, 0, 5,189, 0, 90, 5, + 2, 0, 91, 5, 2, 0, 2, 5, 2, 0, 5, 5, 2, 0, 6, 5, 7, 0, 92, 5, 7, 0, 43, 0,192, 0, 6, 0,192, 0, 0, 0, +192, 0, 1, 0, 4, 0,227, 3, 0, 0,239, 3, 4, 0, 19, 0, 32, 0, 93, 5,193, 0, 6, 0,194, 0, 94, 5, 4, 0, 95, 5, + 4, 0, 96, 5, 9, 0, 97, 5, 0, 0, 98, 5, 4, 0, 90, 0,195, 0, 8, 0,193, 0, 99, 5, 2, 0, 19, 0, 2, 0, 37, 0, + 2, 0,100, 5, 2, 0,101, 5, 2, 0,102, 5, 4, 0, 43, 0, 9, 0,103, 5,196, 0, 6, 0, 2, 0,106, 0, 2, 0,233, 3, + 2, 0,104, 5, 2, 0,194, 2, 4, 0, 19, 0, 7, 0,211, 2,197, 0, 14, 0, 2, 0, 19, 0, 2, 0,105, 5, 2, 0,106, 5, + 2, 0,107, 5,196, 0,108, 5, 9, 0,103, 5, 7, 0,109, 5, 7, 0, 57, 0, 4, 0,110, 5, 4, 0,111, 5, 4, 0,112, 5, + 4, 0,113, 5, 46, 0,129, 0, 32, 0,161, 0,198, 0, 4, 0,198, 0, 0, 0,198, 0, 1, 0, 0, 0,114, 5, 7, 0,115, 5, +199, 0, 6, 0,193, 0, 99, 5, 7, 0,116, 5, 4, 0, 90, 0, 0, 0,117, 5, 0, 0,118, 5, 0, 0,180, 2,200, 0, 7, 0, +193, 0, 99, 5, 2, 0, 19, 0, 2, 0, 37, 0, 4, 0, 36, 0, 4, 0,119, 5, 86, 0,120, 5, 9, 0,103, 5,201, 0, 74, 0, +200, 0,121, 5,200, 0,122, 5,199, 0, 83, 3, 7, 0,123, 5, 2, 0,124, 5, 2, 0,125, 5, 7, 0,126, 5, 7, 0,127, 5, + 2, 0,233, 3, 2, 0,128, 5, 7, 0,129, 5, 7, 0,130, 5, 7, 0,131, 5, 2, 0,132, 5, 2, 0,110, 5, 2, 0,133, 5, + 2, 0,134, 5, 2, 0,135, 5, 2, 0,136, 5, 7, 0,137, 5, 7, 0,138, 5, 7, 0,139, 5, 2, 0,140, 5, 2, 0,141, 5, + 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, 2, 0,145, 5, 2, 0,146, 5,195, 0,147, 5,197, 0,148, 5, 7, 0,149, 5, + 7, 0,150, 5, 7, 0,151, 5, 2, 0,152, 5, 2, 0,153, 5, 0, 0,154, 5, 0, 0,155, 5, 0, 0,156, 5, 0, 0,157, 5, + 0, 0,158, 5, 0, 0,159, 5, 2, 0,160, 5, 7, 0,161, 5, 7, 0,162, 5, 7, 0,163, 5, 7, 0,164, 5, 7, 0,165, 5, + 7, 0,166, 5, 7, 0,167, 5, 7, 0,168, 5, 7, 0,169, 5, 7, 0,170, 5, 2, 0,171, 5, 0, 0,172, 5, 0, 0,173, 5, + 0, 0,174, 5, 0, 0,175, 5, 32, 0,176, 5, 0, 0,177, 5, 0, 0,178, 5, 0, 0,179, 5, 0, 0,180, 5, 0, 0,181, 5, + 0, 0,182, 5, 0, 0,183, 5, 0, 0,184, 5, 2, 0,185, 5, 2, 0,186, 5, 2, 0,187, 5, 2, 0,188, 5, 2, 0,189, 5, + 4, 0,190, 5, 4, 0,191, 5,202, 0, 8, 0, 4, 0,192, 5, 4, 0,193, 5, 4, 0,194, 5, 4, 0,195, 5, 4, 0,196, 5, + 4, 0,197, 5, 4, 0, 54, 0, 4, 0,114, 2,203, 0, 3, 0, 7, 0,198, 5, 2, 0,199, 5, 2, 0, 19, 0,204, 0, 4, 0, + 7, 0,200, 5, 4, 0, 19, 0, 4, 0,201, 5, 4, 0, 57, 0, 46, 0, 42, 0, 27, 0, 31, 0, 39, 0, 75, 0, 32, 0, 93, 5, +179, 0,202, 5, 46, 0,203, 5, 47, 0,235, 0, 12, 0,204, 5,180, 0,205, 5, 32, 0,206, 5, 7, 0,207, 5, 7, 0,208, 5, + 7, 0,209, 5, 7, 0,210, 5, 4, 0,116, 3, 4, 0,211, 5, 4, 0, 43, 0, 2, 0, 19, 0, 2, 0, 63, 1, 60, 0, 58, 1, +205, 0,212, 5,201, 0,213, 5,206, 0,214, 5,187, 0,179, 0,185, 0,215, 5, 12, 0,100, 0, 12, 0,216, 5, 9, 0,217, 5, + 9, 0,218, 5, 9, 0,219, 5,207, 0,220, 5, 2, 0,221, 5, 2, 0,222, 5, 2, 0,244, 0, 2, 0,223, 5, 4, 0,224, 5, + 4, 0,225, 5, 12, 0,226, 5,190, 0, 88, 5,191, 0,227, 5,203, 0,228, 5,163, 0, 96, 3,204, 0,229, 5,208, 0, 11, 0, +208, 0, 0, 0,208, 0, 1, 0, 47, 0,235, 0, 45, 0, 57, 1, 7, 0, 78, 2, 7, 0, 79, 2, 7, 0,106, 0, 7, 0,230, 5, + 2, 0,231, 5, 2, 0, 19, 0, 7, 0, 70, 0,209, 0, 39, 0, 7, 0,232, 5, 7, 0,233, 5, 7, 0,234, 5, 7, 0,235, 5, + 7, 0,236, 5, 7, 0,237, 5, 7, 0,238, 5, 7, 0,239, 5, 7, 0,240, 5, 7, 0, 76, 1, 7, 0,241, 5, 7, 0,242, 5, + 7, 0,243, 5, 7, 0,244, 5, 7, 0,168, 0, 2, 0,245, 5, 2, 0,246, 5, 2, 0,247, 5, 2, 0, 37, 0, 2, 0,248, 5, + 2, 0,249, 5, 2, 0,250, 5, 2, 0,231, 5, 7, 0,251, 5, 7, 0,252, 5, 71, 0,253, 5,163, 0, 96, 3,209, 0,254, 5, +210, 0,255, 5,211, 0, 0, 6,212, 0, 1, 6,213, 0, 2, 6,214, 0, 3, 6, 7, 0, 4, 6, 2, 0, 5, 6, 2, 0, 6, 6, + 7, 0, 7, 6, 7, 0, 8, 6, 7, 0, 9, 6,215, 0, 55, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 7, 0, 12, 6, 2, 0, 13, 6, 7, 0,240, 5, 7, 0, 76, 1, 7, 0, 43, 0, 4, 0, 14, 6, 2, 0,250, 5, 2, 0,231, 5, + 32, 0, 93, 5, 32, 0, 15, 6, 12, 0, 16, 6,208, 0, 17, 6,215, 0,254, 5, 0, 0, 18, 6, 4, 0,116, 3, 4, 0,211, 5, + 2, 0, 19, 6, 2, 0, 70, 0, 2, 0, 20, 6, 2, 0, 21, 6, 2, 0,226, 1, 2, 0, 19, 0, 2, 0, 17, 2, 2, 0, 22, 6, + 7, 0,111, 0, 7, 0, 23, 6, 7, 0, 7, 6, 7, 0, 9, 6, 7, 0, 24, 6, 7, 0, 25, 6, 7, 0,168, 0, 7, 0,207, 5, + 2, 0, 26, 6, 2, 0,248, 1, 2, 0, 27, 6, 2, 0, 28, 6, 2, 0, 29, 6, 2, 0, 30, 6, 2, 0, 31, 6, 2, 0, 32, 6, + 2, 0, 33, 6, 2, 0,247, 5, 4, 0, 34, 6, 12, 0, 35, 6, 2, 0, 36, 6, 2, 0,128, 2, 2, 0, 37, 6, 0, 0, 38, 6, + 0, 0, 39, 6, 9, 0, 40, 6,163, 0, 96, 3,217, 0, 24, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 0, 41, 6, 23, 0, 42, 6, + 23, 0, 43, 6, 7, 0, 44, 6, 7, 0, 45, 6, 7, 0, 46, 6, 7, 0, 47, 6, 2, 0, 48, 6, 2, 0, 49, 6, 2, 0, 50, 6, + 2, 0, 51, 6, 2, 0, 52, 6, 2, 0, 19, 0, 2, 0, 53, 6, 2, 0, 54, 6, 2, 0, 55, 6, 2, 0, 56, 6, 2, 0, 57, 6, + 2, 0, 21, 6, 7, 0, 58, 6, 4, 0, 59, 6, 4, 0, 60, 6,216, 0, 6, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, + 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6,218, 0, 8, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 7, 0, 12, 6, 2, 0, 13, 6,219, 0, 61, 6, 46, 0,129, 0,220, 0, 14, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, + 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6,217, 0, 62, 6,221, 0, 63, 6, 12, 0, 64, 6, 2, 0, 69, 1, 2, 0, 65, 6, + 4, 0, 19, 0, 7, 0, 66, 6, 4, 0, 21, 6,222, 0, 20, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 7, 0, 12, 6, 2, 0, 13, 6,210, 0,255, 5,217, 0, 62, 6, 2, 0, 67, 6, 2, 0, 68, 6, 2, 0, 69, 6, 2, 0, 70, 6, + 2, 0, 53, 6, 2, 0, 71, 6, 0, 0, 19, 0, 0, 0,178, 4, 9, 0, 54, 2, 4, 0, 72, 6, 4, 0, 73, 6, 27, 0, 74, 6, +223, 0, 18, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6,217, 0, 62, 6, + 7, 0, 78, 2, 7, 0, 79, 2, 2, 0, 67, 6, 2, 0, 75, 6, 2, 0, 76, 6, 2, 0, 77, 6, 4, 0, 19, 0, 7, 0, 78, 6, + 4, 0,231, 5, 4, 0, 37, 0,163, 0, 96, 3,224, 0, 15, 0, 0, 0, 79, 6, 0, 0, 80, 6, 0, 0, 81, 6, 0, 0, 82, 6, + 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 83, 6, 2, 0, 84, 6, 2, 0,169, 1, 2, 0, 85, 6, 4, 0, 86, 6, 4, 0, 87, 6, + 2, 0, 88, 6, 2, 0, 37, 0, 0, 0, 89, 6,225, 0, 16, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 4, 0, 90, 6,224, 0, 91, 6,226, 0, 92, 6, 12, 0, 93, 6, 12, 0, 94, 6,227, 0, 95, 6,214, 0, 96, 6,228, 0, 97, 6, + 2, 0, 98, 6, 2, 0, 99, 6, 2, 0,100, 6, 2, 0, 70, 0,229, 0, 17, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, + 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6,217, 0, 62, 6, 12, 0,101, 6,230, 0,102, 6, 0, 0,103, 6,231, 0,104, 6, + 4, 0,105, 6, 4, 0,106, 6, 2, 0, 19, 0, 2, 0,107, 6, 2, 0,108, 6, 2, 0, 37, 0,232, 0, 32, 0,216, 0, 0, 0, +216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6, 47, 0,219, 2, 45, 0, 57, 1, 63, 0,109, 6, + 2, 0,128, 0, 2, 0,110, 6, 2, 0, 70, 0, 2, 0,111, 6, 4, 0, 19, 0, 2, 0,112, 6, 2, 0,113, 6, 2, 0,114, 6, + 2, 0,226, 1, 0, 0,115, 6, 0, 0,116, 6, 0, 0,117, 6, 0, 0, 21, 6, 7, 0,118, 6, 7, 0, 78, 2, 7, 0, 79, 2, + 7, 0, 78, 6, 7, 0,248, 1, 7, 0,119, 6, 7, 0,120, 6,163, 0, 96, 3,233, 0,121, 6,234, 0,122, 6,235, 0, 11, 0, +216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6, 2, 0, 65, 6, 2, 0, 19, 0, + 4, 0, 37, 0,221, 0, 63, 6,217, 0, 62, 6,236, 0, 27, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 7, 0, 12, 6, 2, 0, 13, 6, 42, 0,123, 6, 4, 0,124, 6, 4, 0,125, 6, 2, 0, 90, 0, 2, 0,128, 0, 2, 0,126, 6, + 0, 0,127, 6, 0, 0,128, 6, 4, 0,129, 6, 4, 0,130, 6, 4, 0,131, 6, 4, 0,132, 6, 2, 0,133, 6, 2, 0,134, 6, + 7, 0,135, 6, 23, 0,136, 6, 23, 0,137, 6, 4, 0,138, 6, 4, 0,139, 6, 0, 0,140, 6, 0, 0,141, 6,237, 0, 10, 0, + 27, 0, 31, 0, 9, 0,142, 6, 9, 0,143, 6, 9, 0,144, 6, 9, 0,145, 6, 9, 0,146, 6, 4, 0, 90, 0, 4, 0,147, 6, + 0, 0,148, 6, 0, 0,149, 6,238, 0, 10, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, +237, 0,150, 6, 2, 0, 90, 0, 2, 0,128, 0, 4, 0, 43, 0, 9, 0,151, 6,239, 0, 9, 0,239, 0, 0, 0,239, 0, 1, 0, + 4, 0, 17, 0, 4, 0, 19, 0, 7, 0,152, 6, 4, 0, 23, 0, 4, 0,235, 3, 4, 0,236, 3, 4, 0,124, 0,240, 0, 11, 0, +216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6,217, 0, 62, 6, 12, 0,153, 6, 4, 0,154, 6, + 4, 0, 37, 0, 4, 0, 19, 0, 4, 0,155, 6,241, 0, 25, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 7, 0, 12, 6, 2, 0, 13, 6,217, 0, 62, 6, 27, 0,156, 6, 27, 0, 81, 0, 2, 0, 19, 0, 2, 0,128, 0, 7, 0,157, 6, + 9, 0,158, 6, 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 78, 6, 7, 0, 9, 6, 7, 0,159, 6, 7, 0,160, 6, 60, 0, 58, 1, + 60, 0,161, 6, 4, 0,162, 6, 2, 0,163, 6, 2, 0, 37, 0,163, 0, 96, 3,242, 0, 10, 0,216, 0, 0, 0,216, 0, 1, 0, + 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6, 2, 0, 19, 0, 2, 0,125, 3, 4, 0, 37, 0,163, 0, 96, 3, +243, 0, 42, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6,217, 0, 62, 6, +226, 0, 92, 6, 0, 0, 79, 6, 0, 0, 80, 6, 0, 0, 81, 6, 2, 0, 17, 0, 2, 0,164, 6, 2, 0, 19, 0, 2, 0, 83, 6, + 9, 0,158, 6, 4, 0, 86, 6, 4, 0,165, 6, 4, 0,166, 6, 4, 0, 87, 6, 23, 0,167, 6, 23, 0,168, 6, 7, 0,169, 6, + 7, 0,170, 6, 7, 0,171, 6, 7, 0,157, 6, 2, 0,172, 6, 2, 0,234, 0, 2, 0,169, 1, 2, 0, 85, 6, 2, 0, 37, 0, + 2, 0, 43, 0, 2, 0,173, 6, 2, 0,174, 6, 9, 0,175, 6, 9, 0,176, 6, 9, 0,177, 6, 9, 0,178, 6, 9, 0,179, 6, + 2, 0,180, 6, 0, 0,181, 6, 57, 0,182, 6,244, 0, 7, 0,244, 0, 0, 0,244, 0, 1, 0, 4, 0,183, 6, 4, 0, 23, 0, + 0, 0, 84, 0, 4, 0,184, 6, 4, 0, 17, 0,245, 0, 16, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, + 7, 0, 12, 6, 2, 0, 13, 6, 4, 0, 17, 0, 4, 0,185, 6, 4, 0, 19, 0, 4, 0,126, 6, 12, 0,186, 6, 12, 0,187, 6, + 0, 0,188, 6, 0, 0,189, 6, 4, 0,190, 6, 4, 0,191, 6,246, 0, 6, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, + 4, 0, 11, 6, 4, 0, 37, 0, 0, 0,192, 6,247, 0, 7, 0,247, 0, 0, 0,247, 0, 1, 0, 0, 0,193, 6, 2, 0,194, 6, + 2, 0,195, 6, 2, 0,196, 6, 2, 0, 37, 0,248, 0, 12, 0, 2, 0,195, 6, 2, 0,197, 6, 2, 0,198, 6, 0, 0,180, 2, + 2, 0,199, 6, 2, 0,200, 6, 2, 0,201, 6, 2, 0,202, 6, 2, 0,203, 6, 2, 0, 53, 6, 7, 0,204, 6, 7, 0,205, 6, +249, 0, 18, 0,249, 0, 0, 0,249, 0, 1, 0, 0, 0,239, 3,248, 0,206, 6,248, 0,207, 6,248, 0,208, 6,248, 0,209, 6, + 7, 0,210, 6, 2, 0,211, 6, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6, 2, 0,217, 6, + 2, 0,218, 6, 2, 0,219, 6, 2, 0,220, 6,250, 0, 10, 0, 0, 0,221, 6, 0, 0,222, 6, 0, 0,223, 6, 0, 0,224, 6, + 0, 0,225, 6, 0, 0,226, 6, 2, 0,227, 6, 2, 0,228, 6, 2, 0,229, 6, 2, 0,230, 6,251, 0, 8, 0, 0, 0,231, 6, + 0, 0,232, 6, 0, 0,233, 6, 0, 0,234, 6, 0, 0,235, 6, 0, 0,236, 6, 7, 0,230, 5, 7, 0, 37, 0,252, 0, 18, 0, +250, 0,237, 6,250, 0,238, 6,250, 0,239, 6,250, 0,240, 6,250, 0,241, 6,250, 0,242, 6,250, 0,243, 6,250, 0,244, 6, +250, 0,245, 6,250, 0,246, 6,250, 0,247, 6,250, 0,248, 6,250, 0,249, 6,250, 0,250, 6,250, 0,251, 6,250, 0,252, 6, +251, 0,253, 6, 0, 0,254, 6,253, 0, 92, 0, 0, 0,255, 6, 0, 0, 0, 7, 0, 0,225, 6, 0, 0, 1, 7, 0, 0, 2, 7, + 0, 0, 3, 7, 0, 0, 4, 7, 0, 0, 5, 7, 0, 0, 6, 7, 0, 0, 7, 7, 0, 0, 8, 7, 0, 0, 9, 7, 0, 0, 10, 7, + 0, 0, 11, 7, 0, 0, 12, 7, 0, 0, 13, 7, 0, 0, 14, 7, 0, 0, 15, 7, 0, 0, 16, 7, 0, 0, 17, 7, 0, 0, 18, 7, + 0, 0, 19, 7, 0, 0, 20, 7, 0, 0, 21, 7, 0, 0, 22, 7, 0, 0, 23, 7, 0, 0, 24, 7, 0, 0, 25, 7, 0, 0, 26, 7, + 0, 0, 27, 7, 0, 0, 28, 7, 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 0, 0, 34, 7, + 0, 0, 35, 7, 0, 0, 36, 7, 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, + 0, 0, 43, 7, 0, 0, 44, 7, 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, 0, 0, 49, 7, 0, 0, 50, 7, + 0, 0, 51, 7, 0, 0, 52, 7, 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, 0, 0, 57, 7, 0, 0, 58, 7, + 0, 0, 59, 7, 0, 0, 60, 7, 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 0, 0, 65, 7, 0, 0, 66, 7, + 0, 0, 67, 7, 0, 0, 68, 7, 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, 0, 0, 73, 7, 0, 0, 74, 7, + 0, 0, 75, 7, 0, 0, 76, 7, 0, 0, 77, 7, 0, 0, 78, 7, 0, 0, 79, 7, 0, 0, 80, 7, 0, 0, 81, 7, 0, 0, 82, 7, + 0, 0, 83, 7, 0, 0, 84, 7, 0, 0, 85, 7, 0, 0, 86, 7, 0, 0, 87, 7, 0, 0, 88, 7, 0, 0, 89, 7,254, 0, 5, 0, + 0, 0, 90, 7, 0, 0, 23, 7, 0, 0, 25, 7, 2, 0, 19, 0, 2, 0, 37, 0,255, 0, 25, 0,255, 0, 0, 0,255, 0, 1, 0, + 0, 0, 20, 0,252, 0, 91, 7,253, 0, 92, 7,253, 0, 93, 7,253, 0, 94, 7,253, 0, 95, 7,253, 0, 96, 7,253, 0, 97, 7, +253, 0, 98, 7,253, 0, 99, 7,253, 0,100, 7,253, 0,101, 7,253, 0,102, 7,253, 0,103, 7,253, 0,104, 7,253, 0,105, 7, +253, 0,106, 7,253, 0,107, 7,253, 0,108, 7,253, 0,109, 7,254, 0,110, 7, 4, 0,111, 7, 4, 0, 37, 0, 0, 1, 3, 0, + 0, 1, 0, 0, 0, 1, 1, 0, 0, 0,112, 7, 1, 1, 5, 0, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,127, 2, 7, 0,113, 7, + 7, 0, 32, 2, 2, 1, 84, 0, 4, 0, 19, 0, 4, 0,114, 7, 4, 0,115, 7, 0, 0,116, 7, 0, 0,117, 7, 0, 0,118, 7, + 0, 0,119, 7, 0, 0,120, 7, 0, 0,121, 7, 0, 0,122, 7, 0, 0,123, 7, 0, 0,124, 7, 0, 0,125, 7, 4, 0,126, 7, + 2, 0,127, 7, 2, 0,128, 7, 2, 0,129, 7, 2, 0,130, 7, 4, 0,131, 7, 4, 0,132, 7, 4, 0,133, 7, 4, 0,134, 7, + 2, 0,135, 7, 2, 0,136, 7, 4, 0,137, 7, 4, 0,138, 7, 4, 0,139, 7, 4, 0,140, 7, 4, 0,141, 7, 4, 0,186, 6, + 4, 0,142, 7, 2, 0,143, 7, 2, 0,144, 7, 2, 0,145, 7, 2, 0,146, 7, 12, 0,147, 7, 12, 0,148, 7, 12, 0,149, 7, + 12, 0,150, 7, 12, 0,151, 7, 0, 0,152, 7, 2, 0,153, 7, 2, 0,154, 7, 2, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, + 2, 0,158, 7, 2, 0,159, 7, 2, 0,160, 7, 1, 1,161, 7, 2, 0,162, 7, 2, 0,163, 7, 2, 0,164, 7, 2, 0,165, 7, + 2, 0,166, 7, 2, 0,167, 7, 2, 0,168, 7, 2, 0,169, 7, 4, 0,170, 7, 4, 0,171, 7, 2, 0,172, 7, 2, 0,173, 7, + 2, 0,174, 7, 2, 0,175, 7, 2, 0,176, 7, 2, 0,177, 7, 2, 0,178, 7, 2, 0,179, 7, 2, 0,180, 7, 2, 0,181, 7, + 2, 0,182, 7, 2, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7, 2, 0,178, 4, + 0, 0,189, 7, 0, 0,190, 7, 7, 0,191, 7, 2, 0,152, 5, 2, 0,153, 5, 55, 0,192, 7,219, 0, 21, 0, 27, 0, 31, 0, + 12, 0,193, 7, 12, 0,194, 7, 12, 0,195, 7, 12, 0, 10, 6, 46, 0,129, 0, 46, 0,196, 7, 2, 0,197, 7, 2, 0,198, 7, + 2, 0,199, 7, 2, 0,200, 7, 2, 0,201, 7, 2, 0,202, 7, 2, 0,203, 7, 2, 0,204, 7, 2, 0,205, 7, 2, 0,206, 7, + 4, 0, 70, 0,214, 0,207, 7, 9, 0,208, 7, 2, 0,209, 7, 3, 1, 5, 0, 3, 1, 0, 0, 3, 1, 1, 0, 3, 1,210, 7, + 13, 0,211, 7, 4, 0, 19, 0, 4, 1, 7, 0, 4, 1, 0, 0, 4, 1, 1, 0, 3, 1,212, 7, 3, 1,213, 7, 2, 0, 27, 5, + 2, 0, 19, 0, 4, 0, 37, 0, 5, 1, 25, 0, 5, 1, 0, 0, 5, 1, 1, 0, 6, 1,214, 7, 7, 1, 97, 6, 0, 0,215, 7, + 0, 0,216, 7, 0, 0,217, 7, 2, 0,218, 7, 2, 0,219, 7, 2, 0,220, 7, 2, 0,221, 7, 2, 0,222, 7, 2, 0, 37, 0, + 2, 0, 19, 0, 2, 0,223, 7, 2, 0,224, 7, 2, 0,225, 7, 4, 0,226, 7, 5, 1,227, 7, 9, 0,228, 7, 4, 0,229, 7, + 4, 0,230, 7, 4, 0,231, 7, 4, 0,232, 7, 0, 0,233, 7, 8, 1, 22, 0, 8, 1, 0, 0, 8, 1, 1, 0, 3, 1,212, 7, + 3, 1,213, 7, 3, 1,234, 7, 3, 1,235, 7,219, 0,236, 7, 23, 0, 52, 0, 0, 0, 11, 6, 0, 0,237, 7, 2, 0, 54, 6, + 2, 0, 55, 6, 2, 0,238, 7, 2, 0, 37, 0, 2, 0,200, 7, 2, 0,184, 6, 2, 0, 19, 0, 9, 1,214, 7, 12, 0,239, 7, + 12, 0, 10, 6, 12, 0,240, 7, 12, 0,241, 7, 10, 1, 24, 0, 10, 1, 0, 0, 10, 1, 1, 0,217, 0, 62, 6, 23, 0,242, 7, + 23, 0,243, 7, 2, 0, 54, 6, 2, 0, 55, 6, 2, 0,244, 7, 2, 0,245, 7, 2, 0,246, 7, 2, 0, 19, 0, 7, 0, 74, 2, + 2, 0,220, 7, 2, 0,221, 7, 2, 0,199, 7, 2, 0,247, 7, 2, 0,204, 7, 2, 0,178, 4, 11, 1,214, 7, 12, 0,248, 7, + 12, 0,249, 7, 12, 0,240, 7, 0, 0,250, 7, 9, 0,251, 7, 12, 1, 12, 0, 0, 0,252, 7, 2, 0,253, 7, 2, 0,254, 7, + 2, 0,255, 7, 2, 0, 0, 8, 2, 0, 14, 5, 2, 0, 9, 5,219, 0, 1, 8, 46, 0, 2, 8, 4, 0, 3, 8, 4, 0, 4, 8, + 0, 0, 5, 8, 13, 1, 1, 0, 0, 0, 6, 8, 14, 1, 8, 0, 57, 0, 7, 8, 57, 0, 8, 8, 14, 1, 9, 8, 14, 1, 10, 8, + 14, 1, 11, 8, 2, 0,124, 0, 2, 0, 19, 0, 4, 0, 12, 8, 15, 1, 4, 0, 4, 0,124, 6, 4, 0, 13, 8, 4, 0,129, 6, + 4, 0, 14, 8, 16, 1, 2, 0, 4, 0, 15, 8, 4, 0, 16, 8, 17, 1, 5, 0, 7, 0, 17, 8, 7, 0, 18, 8, 7, 0, 19, 8, + 4, 0, 19, 0, 4, 0, 37, 0, 18, 1, 6, 0, 0, 0, 20, 8, 0, 0, 81, 6, 49, 0,132, 0, 2, 0,106, 0, 2, 0, 13, 5, + 4, 0, 37, 0, 19, 1, 21, 0, 19, 1, 0, 0, 19, 1, 1, 0, 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 21, 8, + 4, 0, 22, 8, 4, 0, 23, 8, 13, 1, 24, 8, 0, 0, 20, 8, 4, 0, 25, 8, 4, 0, 26, 8, 18, 1, 90, 3, 15, 1, 27, 8, + 16, 1, 28, 8, 17, 1, 29, 8, 14, 1, 30, 8, 14, 1, 31, 8, 14, 1, 32, 8, 57, 0, 33, 8, 57, 0, 34, 8, 20, 1, 12, 0, + 0, 0,250, 1, 9, 0,220, 0, 0, 0,221, 0, 4, 0,224, 0, 4, 0,232, 0, 9, 0,225, 0, 7, 0,227, 0, 7, 0,228, 0, + 9, 0, 35, 8, 9, 0, 36, 8, 9, 0,229, 0, 9, 0,231, 0, 21, 1, 46, 0, 21, 1, 0, 0, 21, 1, 1, 0, 9, 0, 37, 8, + 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 88, 0, 4, 0, 38, 8, 4, 0, 39, 8, + 4, 0, 22, 8, 4, 0, 23, 8, 4, 0, 40, 8, 4, 0,243, 0, 4, 0, 41, 8, 4, 0, 42, 8, 7, 0, 43, 8, 7, 0, 44, 8, + 4, 0,121, 0, 4, 0, 45, 8, 19, 1, 46, 8, 36, 0, 80, 0, 46, 0,129, 0, 32, 0, 47, 8, 49, 0,132, 0, 7, 0, 48, 8, + 7, 0, 49, 8, 20, 1, 59, 1, 21, 1, 50, 8, 21, 1, 51, 8, 21, 1, 52, 8, 12, 0, 53, 8, 22, 1, 54, 8, 9, 0, 55, 8, + 7, 0,248, 3, 7, 0, 56, 8, 7, 0, 57, 8, 4, 0, 58, 8, 4, 0, 59, 8, 7, 0, 60, 8, 9, 0, 61, 8, 4, 0, 62, 8, + 4, 0, 63, 8, 4, 0, 64, 8, 7, 0, 65, 8, 23, 1, 4, 0, 23, 1, 0, 0, 23, 1, 1, 0, 12, 0, 66, 8, 21, 1, 67, 8, +205, 0, 11, 0, 12, 0, 68, 8, 12, 0, 53, 8, 12, 0, 69, 8, 21, 1, 70, 8, 0, 0, 71, 8, 0, 0, 72, 8, 4, 0, 73, 8, + 4, 0, 74, 8, 4, 0, 75, 8, 4, 0, 37, 0, 24, 0, 76, 8, 24, 1, 4, 0, 7, 0, 77, 8, 7, 0, 64, 3, 2, 0, 78, 8, + 2, 0, 79, 8, 25, 1, 6, 0, 7, 0, 80, 8, 7, 0, 81, 8, 7, 0, 82, 8, 7, 0, 83, 8, 4, 0, 84, 8, 4, 0, 85, 8, + 26, 1, 13, 0, 7, 0, 86, 8, 7, 0, 87, 8, 7, 0, 88, 8, 7, 0, 89, 8, 7, 0, 90, 8, 7, 0, 91, 8, 7, 0, 92, 8, + 7, 0, 93, 8, 7, 0, 94, 8, 7, 0, 95, 8, 4, 0,225, 2, 4, 0, 96, 8, 4, 0, 97, 8, 27, 1, 2, 0, 7, 0, 86, 5, + 7, 0, 37, 0, 28, 1, 5, 0, 7, 0, 98, 8, 7, 0, 99, 8, 4, 0, 90, 0, 4, 0,181, 2, 4, 0,100, 8, 29, 1, 6, 0, + 29, 1, 0, 0, 29, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,101, 8, 2, 0, 57, 0, 30, 1, 8, 0, 30, 1, 0, 0, + 30, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,101, 8, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,121, 0, 31, 1, 45, 0, + 31, 1, 0, 0, 31, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,101, 8, 2, 0,239, 0, 2, 0, 34, 4, 2, 0,102, 8, + 7, 0,103, 8, 7, 0, 89, 0, 7, 0,238, 2, 4, 0,104, 8, 4, 0, 82, 0, 4, 0,183, 2, 7, 0,105, 8, 7, 0,106, 8, + 7, 0,107, 8, 7, 0,108, 8, 7, 0,109, 8, 7, 0,110, 8, 7, 0,235, 2, 7, 0, 56, 1, 7, 0,111, 8, 7, 0,112, 8, + 7, 0, 37, 0, 7, 0,113, 8, 7, 0,114, 8, 7, 0,115, 8, 2, 0,116, 8, 2, 0,117, 8, 2, 0,118, 8, 2, 0,119, 8, + 2, 0,120, 8, 2, 0,121, 8, 2, 0,122, 8, 2, 0,123, 8, 2, 0, 17, 2, 2, 0,124, 8, 2, 0, 14, 2, 2, 0,125, 8, + 0, 0,126, 8, 0, 0,127, 8, 7, 0,237, 0, 32, 1,128, 8, 67, 0,229, 1, 33, 1, 16, 0, 33, 1, 0, 0, 33, 1, 1, 0, + 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,101, 8, 2, 0,239, 0, 7, 0,230, 2, 7, 0,231, 2, 7, 0,232, 2, 7, 0, 63, 2, + 7, 0,233, 2, 7, 0,234, 2, 7, 0,129, 8, 7, 0,235, 2, 7, 0,237, 2, 7, 0,238, 2,231, 0, 5, 0, 2, 0, 17, 0, + 2, 0, 12, 8, 2, 0, 19, 0, 2, 0,130, 8, 27, 0,156, 6,230, 0, 3, 0, 4, 0, 69, 0, 4, 0,131, 8,231, 0, 2, 0, + 34, 1, 7, 0, 34, 1, 0, 0, 34, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,132, 8, + 35, 1, 5, 0, 0, 0, 20, 0, 7, 0, 76, 1, 7, 0,133, 8, 4, 0,134, 8, 4, 0, 37, 0, 36, 1, 4, 0, 2, 0, 17, 0, + 2, 0, 19, 0, 2, 0, 43, 0, 2, 0, 70, 0, 37, 1, 4, 0, 0, 0, 20, 0, 66, 0,135, 8, 7, 0, 76, 1, 7, 0, 37, 0, + 38, 1, 6, 0, 2, 0,136, 8, 2, 0,137, 8, 2, 0, 17, 0, 2, 0,138, 8, 0, 0,139, 8, 0, 0,140, 8, 39, 1, 5, 0, + 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 0, 0,141, 8, 0, 0,142, 8, 40, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, + 0, 0, 20, 0, 41, 1, 4, 0, 2, 0,143, 8, 2, 0,144, 8, 2, 0, 19, 0, 2, 0, 37, 0, 42, 1, 6, 0, 0, 0, 20, 0, + 0, 0,145, 8, 2, 0,146, 8, 2, 0,235, 2, 2, 0, 69, 1, 2, 0, 70, 0, 43, 1, 5, 0, 0, 0, 20, 0, 7, 0, 64, 3, + 7, 0,128, 4, 2, 0, 19, 0, 2, 0,195, 2, 44, 1, 3, 0, 0, 0, 20, 0, 4, 0,183, 2, 4, 0,143, 8, 45, 1, 7, 0, + 0, 0, 20, 0, 7, 0,128, 4, 0, 0,147, 8, 0, 0,148, 8, 2, 0, 69, 1, 2, 0, 43, 0, 4, 0,149, 8, 46, 1, 4, 0, + 0, 0,150, 8, 0, 0,151, 8, 4, 0, 17, 0, 7, 0,199, 2, 47, 1, 3, 0, 32, 0,152, 8, 0, 0,153, 8, 0, 0,154, 8, + 48, 1, 18, 0, 48, 1, 0, 0, 48, 1, 1, 0, 2, 0, 17, 0, 2, 0,155, 8, 2, 0, 19, 0, 2, 0,156, 8, 2, 0,157, 8, + 2, 0,158, 8, 2, 0, 43, 0, 2, 0, 70, 0, 0, 0, 20, 0, 9, 0, 2, 0, 49, 1,159, 8, 32, 0, 45, 0, 2, 0,104, 5, + 2, 0, 56, 8, 2, 0,160, 8, 2, 0, 37, 0, 50, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,161, 8, 2, 0, 19, 0, + 2, 0,195, 2, 2, 0,162, 8, 4, 0,163, 8, 4, 0,164, 8, 4, 0,165, 8, 4, 0,166, 8, 4, 0,167, 8, 51, 1, 1, 0, + 0, 0,168, 8, 52, 1, 4, 0, 42, 0,123, 6, 0, 0,112, 7, 4, 0, 69, 1, 4, 0, 19, 0, 49, 1, 18, 0, 49, 1, 0, 0, + 49, 1, 1, 0, 49, 1,169, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,170, 8, 2, 0,158, 8, 2, 0,155, 8, 2, 0,171, 8, + 2, 0, 70, 0, 2, 0,226, 1, 0, 0, 20, 0, 9, 0, 2, 0, 53, 1,159, 8, 48, 1,172, 8, 2, 0, 15, 0, 2, 0,173, 8, + 4, 0,174, 8, 54, 1, 3, 0, 4, 0,209, 2, 4, 0, 37, 0, 32, 0, 45, 0, 55, 1, 12, 0,161, 0,175, 8, 2, 0, 17, 0, + 2, 0, 19, 0, 4, 0,103, 8, 4, 0, 89, 0, 0, 0, 20, 0, 0, 0,176, 8, 2, 0,177, 8, 2, 0,178, 8, 2, 0,179, 8, + 2, 0,180, 8, 7, 0,181, 8, 56, 1, 13, 0, 2, 0, 19, 0, 2, 0,182, 8, 4, 0, 43, 0, 4, 0, 70, 0, 2, 0,183, 8, + 7, 0,248, 3, 7, 0,184, 8, 22, 1, 54, 8, 57, 1,185, 8, 2, 0, 17, 0, 2, 0,248, 1, 2, 0,224, 5, 2, 0,186, 8, + 58, 1, 11, 0, 4, 0,209, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 45, 0, 80, 0,187, 8, 0, 0, 20, 0, 7, 0,188, 8, + 7, 0,189, 8, 7, 0,133, 3, 2, 0,190, 8, 2, 0,191, 8, 59, 1, 5, 0, 2, 0, 17, 0, 2, 0, 43, 0, 4, 0, 37, 0, + 46, 0,129, 0, 32, 0, 93, 5, 60, 1, 5, 0, 4, 0, 37, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,141, 8, 32, 0, 45, 0, + 61, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,155, 8, 2, 0,134, 3, 7, 0,192, 8, 7, 0,193, 8, 7, 0,178, 4, + 7, 0,146, 3, 7, 0,105, 3, 7, 0,108, 3, 7, 0,194, 8, 7, 0,195, 8, 32, 0,196, 8, 62, 1, 10, 0, 2, 0, 19, 0, + 2, 0, 17, 0, 4, 0,103, 8, 4, 0, 89, 0, 0, 0, 20, 0, 0, 0,176, 8, 2, 0, 43, 0, 2, 0, 70, 0, 2, 0,226, 1, + 2, 0,248, 1, 63, 1, 8, 0, 32, 0, 45, 0, 7, 0,232, 2, 7, 0,197, 8, 7, 0,198, 8, 7, 0, 37, 0, 2, 0, 43, 0, + 2, 0,195, 2, 7, 0, 70, 0, 64, 1, 12, 0, 2, 0, 17, 0, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0,235, 2, 2, 0,209, 2, + 2, 0,199, 8, 4, 0, 37, 0, 7, 0,200, 8, 7, 0,201, 8, 7, 0,202, 8, 7, 0,203, 8, 0, 0,204, 8, 65, 1, 9, 0, + 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,103, 8, 4, 0, 89, 0, 0, 0, 20, 0, 2, 0,178, 4, 2, 0, 64, 0, 2, 0,205, 8, + 2, 0,206, 8, 66, 1, 7, 0, 4, 0,183, 2, 4, 0,207, 8, 4, 0,208, 8, 4, 0,209, 8, 7, 0,210, 8, 7, 0,211, 8, + 0, 0,147, 8, 67, 1, 7, 0, 0, 0,212, 8, 32, 0,213, 8, 0, 0,153, 8, 2, 0,214, 8, 2, 0, 43, 0, 4, 0, 70, 0, + 0, 0,154, 8, 68, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,103, 8, 4, 0, 89, 0, 0, 0,215, 8, 0, 0,216, 8, + 69, 1, 1, 0, 4, 0, 19, 0, 70, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,217, 8, 7, 0,218, 8, + 42, 0,123, 6, 71, 1, 4, 0, 0, 0, 59, 2, 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 45, 0, 72, 1, 2, 0, 4, 0, 17, 0, + 4, 0, 43, 6, 73, 1, 6, 0, 0, 0,150, 8, 0, 0,151, 8, 4, 0, 17, 0, 7, 0, 25, 2, 32, 0, 43, 3, 32, 0,219, 8, + 53, 1, 10, 0, 53, 1, 0, 0, 53, 1, 1, 0, 53, 1,169, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,155, 8, 2, 0,220, 8, + 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45, 0, 74, 1, 10, 0, 7, 0,133, 3, 7, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, + 7, 0,224, 8, 4, 0, 19, 0, 7, 0,199, 8, 7, 0,225, 8, 7, 0,226, 8, 7, 0, 37, 0, 57, 1, 8, 0, 7, 0,227, 8, + 7, 0,228, 8, 7, 0,229, 8, 7, 0,230, 8, 7, 0,231, 8, 7, 0,232, 8, 7, 0,233, 8, 7, 0,234, 8, 22, 1, 16, 0, + 27, 0, 31, 0, 0, 0, 34, 0, 43, 0,147, 0, 9, 0,220, 0, 43, 0,235, 8, 36, 0, 80, 0, 7, 0,248, 3, 7, 0,236, 8, + 7, 0,184, 8, 7, 0,227, 8, 7, 0,228, 8, 7, 0,237, 8, 4, 0, 90, 0, 4, 0, 37, 0, 9, 0,238, 8, 9, 0,239, 8, + 75, 1, 15, 0,216, 0, 0, 0,216, 0, 1, 0, 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 8, 1,240, 8,217, 0, 62, 6, + 22, 1, 54, 8, 2, 0, 69, 1, 2, 0,182, 8, 2, 0, 78, 2, 2, 0, 79, 2, 2, 0, 19, 0, 2, 0,113, 6, 4, 0, 70, 0, + 76, 1, 6, 0, 76, 1, 0, 0, 76, 1, 1, 0, 32, 0, 45, 0, 9, 0,241, 8, 4, 0,244, 0, 4, 0, 37, 0, 67, 0, 4, 0, + 27, 0, 31, 0, 12, 0,242, 8, 4, 0,126, 0, 7, 0,243, 8, 77, 1, 27, 0, 77, 1, 0, 0, 77, 1, 1, 0, 26, 0,244, 8, + 77, 1, 38, 0, 12, 0,245, 8, 0, 0, 20, 0, 7, 0,246, 8, 7, 0,247, 8, 7, 0,248, 8, 7, 0,249, 8, 4, 0, 19, 0, + 7, 0,250, 8, 7, 0,251, 8, 7, 0,252, 8, 7, 0, 76, 1, 7, 0, 25, 2, 7, 0,253, 8, 7, 0,181, 2, 7, 0,254, 8, + 7, 0,255, 8, 7, 0, 0, 9, 7, 0, 1, 9, 7, 0, 2, 9, 7, 0,169, 0, 4, 0,126, 0, 2, 0,133, 5, 2, 0,178, 4, + 78, 1, 25, 0, 27, 0, 31, 0, 39, 0, 75, 0, 12, 0, 3, 9, 12, 0, 4, 9, 12, 0, 5, 9, 77, 1, 6, 9, 9, 0, 7, 9, + 9, 0, 8, 9, 4, 0, 19, 0, 4, 0, 19, 6, 2, 0,239, 2, 2, 0, 72, 6, 4, 0, 37, 0, 4, 0,126, 0, 4, 0, 9, 9, + 2, 0, 10, 9, 2, 0, 11, 9, 2, 0, 12, 9, 2, 0, 13, 9, 4, 0, 14, 9, 4, 0, 15, 9, 4, 0, 16, 9, 4, 0, 17, 9, + 4, 0, 18, 9, 4, 0, 19, 9, 79, 1, 2, 0, 7, 0,141, 2, 4, 0, 19, 0,165, 0, 5, 0, 79, 1, 20, 9, 4, 0,181, 2, + 4, 0, 21, 9, 4, 0, 22, 9, 4, 0, 19, 0,164, 0, 16, 0, 4, 0, 23, 9, 4, 0, 24, 9, 4, 0, 25, 9, 4, 0, 26, 9, + 2, 0, 27, 9, 2, 0, 28, 9, 2, 0, 29, 9, 2, 0,244, 0, 2, 0, 30, 9, 2, 0, 31, 9, 2, 0, 32, 9, 2, 0, 33, 9, + 4, 0, 34, 9, 4, 0, 35, 9, 4, 0, 36, 9, 4, 0, 37, 9, 80, 1, 44, 0, 80, 1, 0, 0, 80, 1, 1, 0, 26, 0,244, 8, + 12, 0,160, 3, 0, 0, 20, 0, 2, 0, 19, 0, 2, 0, 38, 9, 2, 0, 39, 9, 2, 0, 40, 9, 2, 0,119, 3, 2, 0, 41, 9, + 4, 0, 61, 2, 4, 0, 16, 9, 4, 0, 17, 9, 77, 1, 42, 9, 80, 1, 38, 0, 80, 1, 43, 9, 12, 0, 44, 9, 9, 0, 45, 9, + 9, 0, 46, 9, 9, 0, 47, 9, 7, 0, 64, 1, 7, 0,169, 0, 7, 0, 48, 9, 7, 0, 4, 2, 7, 0,110, 3, 7, 0,112, 3, + 2, 0,142, 3, 2, 0, 37, 0, 7, 0, 49, 9, 7, 0, 50, 9, 7, 0,115, 3, 7, 0, 51, 9, 7, 0, 52, 9, 7, 0, 53, 9, + 7, 0, 54, 9, 7, 0, 55, 9, 7, 0, 56, 9, 7, 0, 57, 9, 7, 0, 58, 9, 7, 0, 54, 2,165, 0, 98, 3, 32, 0, 59, 9, + 80, 1, 60, 9,162, 0, 14, 0, 12, 0, 61, 9, 81, 1, 62, 9, 2, 0, 19, 0, 2, 0, 63, 9, 7, 0, 90, 2, 7, 0, 64, 9, + 7, 0, 65, 9, 12, 0, 66, 9, 4, 0, 67, 9, 4, 0, 68, 9, 9, 0, 69, 9, 9, 0, 70, 9,164, 0, 97, 3, 0, 0, 71, 9, + 82, 1, 1, 0, 4, 0, 68, 9, 83, 1, 12, 0, 4, 0, 68, 9, 7, 0,167, 8, 2, 0, 72, 9, 2, 0, 73, 9, 7, 0, 74, 9, + 7, 0, 75, 9, 2, 0, 76, 9, 2, 0, 19, 0, 7, 0, 77, 9, 7, 0, 78, 9, 7, 0, 79, 9, 7, 0, 80, 9, 84, 1, 7, 0, + 84, 1, 0, 0, 84, 1, 1, 0, 12, 0, 81, 9, 4, 0, 19, 0, 4, 0, 82, 9, 0, 0,239, 3,254, 0, 83, 9,161, 0, 7, 0, + 27, 0, 31, 0, 12, 0, 84, 9, 12, 0, 61, 9, 12, 0, 85, 9, 12, 0,100, 0, 4, 0, 19, 0, 4, 0, 86, 9,221, 0, 5, 0, + 27, 0, 87, 9, 12, 0, 61, 9, 67, 0, 88, 9, 4, 0, 89, 9, 4, 0, 19, 0, 85, 1, 13, 0,216, 0, 0, 0,216, 0, 1, 0, + 12, 0, 10, 6, 4, 0, 11, 6, 7, 0, 12, 6, 2, 0, 13, 6,217, 0, 62, 6,161, 0, 93, 3,221, 0, 90, 9, 0, 0, 69, 1, + 0, 0, 65, 6, 2, 0, 19, 0, 7, 0, 91, 9, 86, 1, 8, 0, 86, 1, 0, 0, 86, 1, 1, 0, 84, 1, 92, 9, 36, 0, 80, 0, + 12, 0, 99, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0, 93, 9, 87, 1, 5, 0, 87, 1, 0, 0, 87, 1, 1, 0, 36, 0, 80, 0, + 2, 0, 19, 0, 0, 0, 94, 9, 88, 1, 14, 0, 88, 1, 0, 0, 88, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, + 0, 0, 95, 9, 0, 0, 96, 9, 0, 0, 94, 9, 7, 0, 97, 9, 7, 0, 98, 9, 4, 0, 37, 0, 36, 0, 80, 0, 7, 0, 99, 9, + 7, 0,100, 9, 89, 1, 9, 0, 89, 1, 0, 0, 89, 1, 1, 0, 32, 0,101, 9, 0, 0,242, 2, 7, 0,102, 9, 2, 0,103, 9, + 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,104, 9, 90, 1, 7, 0, 42, 0,123, 6, 26, 0,244, 8, 4, 0, 19, 0, 4, 0,105, 9, + 12, 0,106, 9, 32, 0,101, 9, 0, 0,242, 2, 91, 1, 15, 0, 32, 0,101, 9, 2, 0,107, 9, 2, 0, 19, 0, 2, 0,108, 9, + 2, 0,109, 9, 0, 0,242, 2, 32, 0,110, 9, 0, 0,111, 9, 7, 0,112, 9, 7, 0, 25, 2, 7, 0,113, 9, 7, 0,114, 9, + 2, 0, 17, 0, 2, 0, 69, 1, 7, 0, 76, 1, 92, 1, 6, 0, 32, 0,101, 9, 7, 0, 20, 9, 2, 0,115, 9, 2, 0,116, 9, + 2, 0, 19, 0, 2, 0,117, 9, 93, 1, 6, 0, 32, 0,101, 9, 4, 0,118, 9, 4, 0,119, 9, 4, 0, 90, 0, 4, 0, 37, 0, + 0, 0,242, 2, 94, 1, 4, 0, 32, 0,101, 9, 4, 0, 19, 0, 4, 0,118, 9, 0, 0,242, 2, 95, 1, 4, 0, 32, 0,101, 9, + 4, 0, 19, 0, 4, 0,118, 9, 0, 0,242, 2, 96, 1, 4, 0, 32, 0,101, 9, 4, 0, 19, 0, 4, 0,118, 9, 0, 0,242, 2, + 97, 1, 2, 0, 4, 0, 19, 0, 7, 0,248, 3, 98, 1, 2, 0, 32, 0,101, 9, 0, 0,242, 2, 99, 1, 10, 0, 32, 0,101, 9, + 4, 0,120, 9, 7, 0,120, 0, 4, 0, 19, 0, 2, 0,116, 6, 2, 0,121, 9, 2, 0, 43, 0, 2, 0, 70, 0, 7, 0,122, 9, + 0, 0,242, 2,100, 1, 10, 0, 32, 0,101, 9, 2, 0, 17, 0, 2, 0, 42, 4, 4, 0, 88, 0, 4, 0, 89, 0, 7, 0,197, 8, + 7, 0,198, 8, 4, 0, 37, 0,161, 0,175, 8, 0, 0,242, 2,101, 1, 4, 0, 32, 0,101, 9, 4, 0,120, 3, 4, 0,123, 9, + 0, 0,242, 2,102, 1, 4, 0, 32, 0,101, 9, 4, 0,120, 3, 4, 0, 37, 0, 0, 0,242, 2,103, 1, 6, 0, 32, 0,101, 9, + 7, 0,120, 0, 7, 0, 55, 3, 4, 0,124, 9, 2, 0,120, 3, 2, 0,121, 3,104, 1, 6, 0, 32, 0,101, 9, 4, 0,125, 9, + 4, 0,126, 9, 7, 0,127, 9, 7, 0,128, 9, 0, 0,242, 2,105, 1, 16, 0, 32, 0,101, 9, 32, 0, 43, 9, 4, 0, 17, 0, + 7, 0,129, 9, 7, 0,130, 9, 7, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, 7, 0,134, 9, 7, 0,135, 9, 7, 0,136, 9, + 7, 0,137, 9, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 0,106, 1, 3, 0, 32, 0,101, 9, 4, 0, 19, 0, + 4, 0, 17, 2,107, 1, 5, 0, 32, 0,101, 9, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,138, 9, 0, 0,242, 2,108, 1, 10, 0, + 32, 0,101, 9, 0, 0,242, 2, 2, 0,139, 9, 2, 0,140, 9, 0, 0,141, 9, 0, 0,142, 9, 7, 0,143, 9, 7, 0,144, 9, + 7, 0,145, 9, 7, 0,146, 9,109, 1, 5, 0, 32, 0,101, 9, 0, 0,242, 2, 7, 0,189, 2, 2, 0,147, 9, 2, 0, 19, 0, +110, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,148, 9, 7, 0,149, 9, 2, 0, 19, 0, + 2, 0, 17, 2,111, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,148, 9, 7, 0,149, 9, + 2, 0, 19, 0, 2, 0, 17, 2,112, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,148, 9, + 7, 0,149, 9, 2, 0, 19, 0, 2, 0, 17, 2,113, 1, 7, 0, 32, 0,101, 9, 0, 0,242, 2, 7, 0, 76, 1, 7, 0, 85, 1, + 2, 0, 19, 0, 2, 0, 69, 1, 4, 0, 37, 0,114, 1, 5, 0, 32, 0, 43, 3, 7, 0, 76, 1, 2, 0, 47, 3, 0, 0, 49, 3, + 0, 0,150, 9,115, 1, 10, 0,115, 1, 0, 0,115, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,151, 9, 7, 0, 19, 1, + 7, 0, 20, 1, 2, 0, 81, 9, 2, 0,152, 9, 32, 0, 45, 0,116, 1, 22, 0,116, 1, 0, 0,116, 1, 1, 0, 2, 0, 19, 0, + 2, 0, 69, 1, 2, 0,153, 9, 2, 0,154, 9, 36, 0, 80, 0,161, 0,175, 8, 32, 0,161, 0, 7, 0, 88, 0, 7, 0, 89, 0, + 7, 0,155, 9, 7, 0,156, 9, 7, 0,157, 9, 7, 0,158, 9, 7, 0,228, 2, 7, 0,159, 9, 7, 0,177, 8, 7, 0,160, 9, + 0, 0,161, 9, 0, 0,162, 9, 12, 0,101, 3,117, 1, 8, 0, 7, 0, 32, 2, 7, 0,197, 8, 7, 0,198, 8, 9, 0, 2, 0, + 2, 0,163, 9, 2, 0,164, 9, 2, 0,165, 9, 2, 0,166, 9,118, 1, 18, 0,118, 1, 0, 0,118, 1, 1, 0,118, 1,167, 9, + 0, 0, 20, 0,117, 1,168, 9, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,169, 9, 2, 0,170, 9, 2, 0,171, 9, 2, 0,172, 9, + 4, 0, 43, 0, 7, 0,173, 9, 7, 0,174, 9, 4, 0,175, 9, 4, 0,176, 9,118, 1,177, 9,119, 1,178, 9,120, 1, 33, 0, +120, 1, 0, 0,120, 1, 1, 0,120, 1,179, 9, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 21, 8, 2, 0, 56, 8, + 2, 0,180, 9, 2, 0,128, 0, 2, 0,170, 9, 2, 0, 12, 8, 12, 0,170, 8, 12, 0,181, 9, 27, 0,156, 6, 9, 0,182, 9, + 7, 0,173, 9, 7, 0,174, 9, 7, 0, 63, 2, 7, 0,183, 9, 2, 0,184, 9, 2, 0,185, 9, 7, 0,186, 9, 7, 0,187, 9, + 2, 0,188, 9, 2, 0,189, 9, 9, 0,190, 9, 24, 0,191, 9, 24, 0,192, 9, 24, 0,193, 9,121, 1,148, 0,122, 1,194, 9, +123, 1,195, 9,119, 1, 8, 0,119, 1, 0, 0,119, 1, 1, 0,120, 1,196, 9,120, 1,197, 9,118, 1,198, 9,118, 1,177, 9, + 4, 0, 19, 0, 4, 0, 37, 0, 60, 0, 22, 0, 27, 0, 31, 0, 39, 0, 75, 0,163, 0, 96, 3, 12, 0,199, 9, 12, 0,200, 9, +117, 1,201, 9, 12, 0,202, 9, 4, 0, 17, 0, 4, 0,203, 9, 4, 0,204, 9, 4, 0,205, 9, 4, 0, 19, 0, 4, 0, 37, 0, + 12, 0,206, 9,123, 1,207, 9, 4, 0,208, 9, 9, 0,209, 9, 9, 0,210, 9, 4, 0,211, 9, 9, 0,212, 9, 9, 0,213, 9, + 9, 0,214, 9,124, 1, 6, 0, 4, 0,119, 0, 4, 0,121, 0, 4, 0, 12, 8, 0, 0,215, 9, 0, 0,216, 9, 2, 0, 37, 0, +125, 1, 16, 0, 2, 0,220, 7, 2, 0,221, 7, 2, 0,217, 9, 2, 0,222, 8, 2, 0,218, 9, 2, 0, 68, 0, 7, 0,227, 2, + 7, 0,219, 9, 7, 0,220, 9, 2, 0, 91, 1, 0, 0,221, 9, 0, 0,222, 9, 2, 0,223, 9, 2, 0, 37, 0, 4, 0,224, 9, + 4, 0,225, 9,126, 1, 9, 0, 7, 0,226, 9, 7, 0,227, 9, 7, 0,237, 8, 7, 0, 64, 3, 7, 0,228, 9, 7, 0, 78, 6, + 2, 0, 62, 3, 0, 0,229, 9, 0, 0, 37, 0,127, 1, 4, 0, 7, 0,230, 9, 7, 0,231, 9, 2, 0, 62, 3, 2, 0, 37, 0, +128, 1, 3, 0, 7, 0,232, 9, 7, 0,233, 9, 7, 0, 15, 0,129, 1, 7, 0, 0, 0,250, 1, 2, 0, 11, 5, 2, 0, 12, 5, + 2, 0, 13, 5, 2, 0,200, 4, 4, 0,121, 0, 4, 0, 40, 4,130, 1, 9, 0, 7, 0,234, 9, 7, 0,235, 9, 7, 0,236, 9, + 7, 0, 74, 2, 7, 0,237, 9, 7, 0,238, 9, 7, 0,239, 9, 2, 0,240, 9, 2, 0,241, 9,131, 1, 4, 0, 2, 0,242, 9, + 2, 0,243, 9, 2, 0,244, 9, 2, 0,245, 9,132, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,133, 1, 2, 0, 0, 0,163, 0, + 0, 0,246, 9,134, 1, 1, 0, 0, 0, 20, 0,135, 1, 10, 0, 0, 0,247, 9, 0, 0,248, 9, 0, 0, 71, 6, 0, 0,249, 9, + 2, 0,217, 9, 2, 0,250, 9, 7, 0,251, 9, 7, 0,252, 9, 7, 0,253, 9, 7, 0,159, 9,136, 1, 2, 0, 9, 0,254, 9, + 9, 0,255, 9,137, 1, 11, 0, 0, 0, 13, 5, 0, 0, 17, 0, 0, 0, 62, 3, 0, 0, 64, 3, 0, 0, 0, 10, 0, 0,106, 0, + 0, 0, 59, 2, 7, 0, 1, 10, 7, 0, 2, 10, 7, 0, 3, 10, 7, 0, 4, 10,138, 1, 8, 0, 7, 0,136, 8, 7, 0,120, 0, + 7, 0,222, 9, 7, 0,146, 2, 7, 0, 5, 10, 7, 0,233, 0, 7, 0, 6, 10, 4, 0, 17, 0,139, 1, 4, 0, 2, 0, 7, 10, + 2, 0, 8, 10, 2, 0, 9, 10, 2, 0, 37, 0,140, 1, 7, 0, 7, 0, 10, 10, 7, 0,189, 2, 7, 0, 11, 10, 7, 0, 17, 8, + 7, 0, 18, 8, 7, 0, 19, 8, 7, 0, 12, 10,141, 1, 6, 0, 2, 0, 13, 10, 2, 0, 14, 10, 7, 0, 15, 10, 7, 0, 16, 10, + 7, 0, 17, 10, 7, 0, 18, 10,142, 1, 1, 0, 0, 0, 20, 0,143, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, + 2, 0, 19, 10,144, 1, 10, 0, 2, 0,228, 3, 2, 0, 19, 0, 7, 0,128, 4, 7, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10, + 7, 0, 23, 10,143, 1, 24, 10,143, 1, 25, 10,143, 1, 26, 10, 63, 0, 11, 0, 4, 0, 19, 0, 4, 0, 64, 0, 4, 0, 27, 10, + 4, 0, 37, 0, 24, 0, 28, 10, 24, 0, 29, 10,144, 1, 30, 10, 7, 0, 31, 10, 7, 0, 32, 10, 7, 0, 33, 10, 7, 0, 34, 10, +234, 0, 10, 0, 4, 0, 81, 9, 4, 0, 35, 10, 7, 0, 36, 10, 7, 0, 37, 10, 7, 0, 38, 10, 7, 0, 39, 10, 7, 0, 10, 0, + 7, 0, 12, 0, 4, 0, 69, 1, 4, 0,232, 2,233, 0, 18, 0, 4, 0,124, 0, 4, 0, 40, 10, 4, 0, 41, 10, 7, 0, 42, 10, + 4, 0, 43, 10, 7, 0, 44, 10, 7, 0, 45, 10, 4, 0, 46, 10, 7, 0, 47, 10, 4, 0, 48, 10, 7, 0, 49, 10,234, 0, 50, 10, + 7, 0, 51, 10, 7, 0, 52, 10, 7, 0, 53, 10, 7, 0, 54, 10, 4, 0, 55, 10, 4, 0, 37, 0,145, 1, 4, 0, 47, 0,219, 2, + 7, 0, 56, 10, 7, 0,158, 1, 7, 0, 37, 0,194, 0, 18, 0, 27, 0, 31, 0,145, 1, 57, 10, 63, 0, 24, 10, 51, 0, 58, 10, + 2, 0, 19, 0, 2, 0,230, 5, 4, 0,106, 0, 7, 0, 59, 10, 7, 0, 71, 2, 4, 0, 60, 10, 7, 0, 61, 10, 7, 0, 62, 10, + 7, 0, 63, 10, 7, 0,158, 1, 0, 0, 64, 10, 0, 0, 65, 10, 0, 0, 66, 10, 0, 0, 70, 0,146, 1, 10, 0, 4, 0, 17, 0, + 4, 0,120, 0, 4, 0, 19, 0, 4, 0,182, 3, 4, 0, 67, 10, 4, 0, 68, 10, 4, 0, 69, 10, 0, 0, 92, 0, 0, 0, 20, 0, + 9, 0, 2, 0,147, 1, 1, 0, 0, 0, 5, 8, 91, 0, 7, 0,146, 1, 70, 10, 4, 0, 71, 10, 4, 0, 72, 10, 4, 0, 73, 10, + 4, 0, 37, 0, 9, 0, 74, 10,147, 1, 75, 10,148, 1, 5, 0, 7, 0,141, 2, 7, 0,209, 2, 7, 0, 25, 2, 2, 0,117, 2, + 2, 0, 37, 0,149, 1, 5, 0, 7, 0,141, 2, 7, 0, 76, 10, 7, 0, 77, 10, 7, 0, 78, 10, 7, 0,209, 2,150, 1, 5, 0, + 32, 0, 79, 10,151, 1, 22, 0, 7, 0,200, 5, 7, 0, 80, 10, 7, 0, 57, 0,152, 1, 7, 0, 4, 0, 81, 10, 4, 0, 82, 10, + 4, 0, 83, 10, 7, 0, 84, 10, 7, 0, 85, 10, 7, 0, 86, 10, 7, 0, 57, 0,153, 1, 8, 0,153, 1, 0, 0,153, 1, 1, 0, + 32, 0, 45, 0, 4, 0,252, 0, 2, 0, 19, 0, 2, 0, 69, 1, 7, 0,209, 2, 7, 0,144, 8,154, 1, 6, 0,154, 1, 0, 0, +154, 1, 1, 0, 32, 0, 45, 0, 2, 0,194, 2, 2, 0, 19, 0, 2, 0, 87, 10,155, 1, 17, 0,149, 1,176, 3,149, 1, 88, 10, +148, 1, 89, 10,149, 1,128, 8,150, 1, 90, 10, 4, 0, 82, 0, 7, 0,209, 2, 7, 0,238, 2, 7, 0, 91, 10, 4, 0, 81, 10, + 4, 0, 92, 10, 7, 0, 85, 10, 7, 0, 86, 10, 7, 0,106, 0, 4, 0, 93, 10, 2, 0, 19, 0, 2, 0, 94, 10,156, 1, 9, 0, + 7, 0, 95, 10, 7, 0,248, 0, 7, 0, 96, 10, 7, 0, 97, 10, 7, 0, 98, 10, 7, 0, 99, 10, 7, 0,100, 10, 7, 0,101, 10, + 7, 0,102, 10,157, 1,111, 0, 27, 0, 31, 0, 39, 0, 75, 0,158, 1,103, 10,156, 1,104, 10,172, 0, 62, 4, 4, 0, 19, 0, + 2, 0, 17, 0, 2, 0,139, 9, 2, 0,105, 10, 2, 0,106, 10, 2, 0,142, 3, 2, 0,107, 10, 2, 0,108, 10, 2, 0,109, 10, + 2, 0,110, 10, 2, 0,111, 10, 2, 0,112, 10, 2, 0,113, 10, 2, 0,114, 10, 2, 0,112, 5, 2, 0,115, 10, 2, 0,116, 10, + 2, 0,117, 10, 2, 0,118, 10, 2, 0,119, 10, 2, 0, 14, 2, 2, 0,121, 8, 2, 0, 96, 8, 2, 0,120, 10, 2, 0,121, 10, + 2, 0,192, 3, 2, 0,193, 3, 2, 0,122, 10, 2, 0,123, 10, 2, 0,124, 10, 2, 0,125, 10, 7, 0,126, 10, 7, 0,127, 10, + 7, 0,128, 10, 2, 0, 61, 5, 2, 0,129, 10, 7, 0,130, 10, 7, 0,131, 10, 7, 0,132, 10, 7, 0,103, 8, 7, 0, 89, 0, + 7, 0,238, 2, 7, 0,109, 8, 7, 0,133, 10, 7, 0,134, 10, 7, 0,135, 10, 4, 0,104, 8, 4, 0,102, 8, 4, 0,136, 10, + 7, 0,105, 8, 7, 0,106, 8, 7, 0,107, 8, 7, 0,137, 10, 7, 0,138, 10, 7, 0,139, 10, 7, 0,140, 10, 7, 0,141, 10, + 7, 0, 57, 0, 7, 0,142, 10, 7, 0,143, 10, 7, 0,144, 10, 7, 0,145, 10, 7, 0,133, 3, 7, 0,106, 0, 7, 0,146, 10, + 7, 0,147, 10, 7, 0,148, 10, 7, 0,149, 10, 7, 0,150, 10, 7, 0,151, 10, 7, 0,152, 10, 4, 0,153, 10, 4, 0,154, 10, + 7, 0,155, 10, 7, 0,156, 10, 7, 0,157, 10, 7, 0,158, 10, 7, 0,159, 10, 7, 0,207, 0, 7, 0,160, 10, 7, 0,219, 3, + 7, 0,217, 3, 7, 0,218, 3, 7, 0,161, 10, 7, 0,162, 10, 7, 0,163, 10, 7, 0,164, 10, 7, 0,165, 10, 7, 0,166, 10, + 7, 0,167, 10, 7, 0,168, 10, 7, 0,169, 10, 7, 0,170, 10, 7, 0,171, 10, 7, 0,172, 10, 7, 0,173, 10, 4, 0,174, 10, + 4, 0,175, 10, 67, 0,165, 3, 12, 0,176, 10, 67, 0,177, 10, 32, 0,178, 10, 32, 0,179, 10, 36, 0, 80, 0,167, 0, 61, 1, +167, 0,180, 10,147, 0, 44, 0,147, 0, 0, 0,147, 0, 1, 0,157, 1,181, 10,155, 1,182, 10,152, 1, 43, 9,174, 0,244, 3, + 9, 0,245, 3,159, 1,183, 10,159, 1,184, 10, 12, 0,185, 10, 12, 0,186, 10,132, 0,187, 10,140, 0,188, 10,140, 0,189, 10, + 32, 0,190, 10, 32, 0,191, 10, 32, 0, 38, 0, 12, 0,106, 9, 0, 0, 20, 0, 7, 0,237, 0, 7, 0, 9, 3, 7, 0,192, 10, + 4, 0,183, 2, 4, 0, 57, 0, 4, 0, 19, 0, 4, 0,104, 8, 4, 0,193, 10, 4, 0,194, 10, 4, 0,195, 10, 2, 0,244, 0, + 2, 0,196, 10, 2, 0,197, 10, 2, 0,198, 10, 0, 0,199, 10, 2, 0,200, 10, 2, 0,201, 10, 2, 0,202, 10, 9, 0,203, 10, +136, 0, 61, 4, 12, 0,252, 2, 12, 0,204, 10,160, 1,205, 10,161, 1,206, 10, 7, 0,207, 10,134, 0, 37, 0,162, 1,238, 8, + 7, 0, 31, 4, 7, 0,208, 10, 7, 0,209, 10, 7, 0,200, 5, 7, 0,143, 3, 7, 0,133, 3, 7, 0,210, 10, 7, 0, 73, 2, + 7, 0,211, 10, 7, 0,212, 10, 7, 0,213, 10, 7, 0,214, 10, 7, 0,215, 10, 7, 0,216, 10, 7, 0, 32, 4, 7, 0,217, 10, + 7, 0,218, 10, 7, 0,219, 10, 7, 0, 33, 4, 7, 0, 29, 4, 7, 0, 30, 4, 7, 0,220, 10, 7, 0,221, 10, 4, 0,222, 10, + 4, 0, 90, 0, 4, 0,223, 10, 4, 0,224, 10, 2, 0,225, 10, 2, 0,226, 10, 2, 0,227, 10, 2, 0,228, 10, 2, 0,229, 10, + 2, 0,230, 10, 2, 0,231, 10, 2, 0,178, 4,172, 0, 62, 4,135, 0, 9, 0,162, 1,232, 10, 7, 0,233, 10, 7, 0,234, 10, + 7, 0,230, 1, 7, 0,235, 10, 4, 0, 90, 0, 2, 0,236, 10, 2, 0,237, 10, 67, 0,229, 1,163, 1, 4, 0, 7, 0, 5, 0, + 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,238, 10,164, 1, 6, 0,164, 1, 0, 0,164, 1, 1, 0,163, 1, 20, 9, 4, 0,250, 0, + 2, 0,239, 10, 2, 0, 19, 0,165, 1, 5, 0,165, 1, 0, 0,165, 1, 1, 0, 12, 0,240, 10, 4, 0,241, 10, 4, 0, 19, 0, +166, 1, 9, 0,166, 1, 0, 0,166, 1, 1, 0, 12, 0,119, 0,165, 1,242, 10, 4, 0, 19, 0, 2, 0,239, 10, 2, 0,243, 10, + 7, 0, 91, 0, 0, 0,244, 10,163, 0, 6, 0, 27, 0, 31, 0, 12, 0, 29, 5, 4, 0, 19, 0, 2, 0,245, 10, 2, 0,246, 10, + 9, 0,247, 10,167, 1, 7, 0,167, 1, 0, 0,167, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 23, 0, 0, 0,248, 10, + 0, 0,249, 10,168, 1, 6, 0, 12, 0,250, 10, 4, 0,251, 10, 4, 0,252, 10, 4, 0, 19, 0, 4, 0, 37, 0,214, 0,253, 10, +169, 1, 3, 0, 7, 0, 86, 5, 7, 0,254, 10, 7, 0,255, 10,170, 1, 17, 0, 27, 0, 31, 0,171, 1, 0, 11,171, 1, 1, 11, + 12, 0, 2, 11, 4, 0, 3, 11, 2, 0, 4, 11, 2, 0, 5, 11, 12, 0, 6, 11, 12, 0, 7, 11,168, 1, 8, 11, 12, 0, 9, 11, + 12, 0, 10, 11, 12, 0, 11, 11, 12, 0, 12, 11,172, 1, 13, 11, 12, 0, 14, 11,214, 0, 15, 11,171, 1, 31, 0,171, 1, 0, 0, +171, 1, 1, 0, 9, 0, 16, 11, 4, 0,198, 7, 2, 0, 17, 11, 2, 0, 37, 0,219, 0, 61, 6,219, 0, 18, 11, 0, 0, 19, 11, + 2, 0, 20, 11, 2, 0, 21, 11, 2, 0,220, 7, 2, 0,221, 7, 2, 0, 22, 11, 2, 0, 23, 11, 2, 0,182, 3, 2, 0,184, 6, + 2, 0, 24, 11, 2, 0, 25, 11, 2, 0,208, 9,173, 1, 26, 11,174, 1, 27, 11,175, 1, 28, 11, 4, 0, 29, 11, 4, 0, 30, 11, + 9, 0, 31, 11, 12, 0, 7, 11, 12, 0,240, 7, 12, 0, 32, 11, 12, 0, 33, 11, 12, 0, 34, 11,176, 1, 17, 0,176, 1, 0, 0, +176, 1, 1, 0, 0, 0, 35, 11, 26, 0, 30, 0, 2, 0, 36, 11, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 37, 11, 2, 0, 38, 11, + 2, 0, 39, 11, 2, 0, 40, 11, 2, 0, 41, 11, 2, 0, 19, 0, 2, 0, 42, 11, 2, 0, 31, 0, 2, 0, 37, 0,177, 1, 43, 11, +178, 1, 10, 0,178, 1, 0, 0,178, 1, 1, 0, 12, 0, 44, 11, 0, 0, 35, 11, 2, 0, 45, 11, 2, 0, 46, 11, 2, 0, 19, 0, + 2, 0, 47, 11, 4, 0, 48, 11, 9, 0, 49, 11,172, 1, 7, 0,172, 1, 0, 0,172, 1, 1, 0, 0, 0, 35, 11, 0, 0, 50, 11, + 12, 0,150, 7, 4, 0, 51, 11, 4, 0, 19, 0,227, 0, 14, 0,227, 0, 0, 0,227, 0, 1, 0, 0, 0, 35, 11, 26, 0, 30, 0, +179, 1,214, 7, 9, 0, 52, 11, 9, 0, 53, 11,177, 1, 43, 11,168, 1, 54, 11, 12, 0, 55, 11,227, 0, 56, 11, 7, 1, 97, 6, + 2, 0, 19, 0, 2, 0,178, 4,180, 1, 8, 0,180, 1, 0, 0,180, 1, 1, 0, 9, 0, 2, 0, 9, 0, 57, 11, 0, 0,239, 3, + 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 58, 11,181, 1, 5, 0, 7, 0, 59, 11, 4, 0, 60, 11, 4, 0, 61, 11, 4, 0, 69, 1, + 4, 0, 19, 0,182, 1, 6, 0, 7, 0, 62, 11, 7, 0, 63, 11, 7, 0, 64, 11, 7, 0, 65, 11, 4, 0, 17, 0, 4, 0, 19, 0, +183, 1, 5, 0, 7, 0,197, 8, 7, 0,198, 8, 7, 0,209, 2, 2, 0, 28, 2, 2, 0, 29, 2,184, 1, 5, 0,183, 1, 2, 0, + 4, 0, 54, 0, 7, 0, 66, 11, 7, 0,197, 8, 7, 0,198, 8,185, 1, 4, 0, 2, 0, 67, 11, 2, 0, 68, 11, 2, 0, 69, 11, + 2, 0, 70, 11,186, 1, 2, 0, 42, 0,150, 6, 26, 0,244, 8,187, 1, 3, 0, 24, 0, 71, 11, 4, 0, 19, 0, 4, 0, 37, 0, +188, 1, 6, 0, 7, 0,106, 0, 7, 0,211, 2, 7, 0, 72, 11, 7, 0, 37, 0, 2, 0,243, 0, 2, 0, 73, 11,189, 1, 5, 0, + 7, 0, 74, 11, 7, 0,120, 0, 7, 0, 21, 9, 7, 0, 22, 9, 4, 0, 19, 0,190, 1, 6, 0, 27, 0,156, 6, 0, 0, 75, 11, + 0, 0, 76, 11, 2, 0, 77, 11, 2, 0, 19, 0, 4, 0, 78, 11,191, 1, 7, 0,191, 1, 0, 0,191, 1, 1, 0, 0, 0,239, 3, +190, 1, 79, 11, 2, 0, 80, 11, 2, 0, 17, 0, 7, 0, 61, 0,192, 1, 7, 0, 12, 0, 81, 11, 0, 0, 82, 11, 9, 0, 83, 11, + 7, 0, 61, 0, 7, 0, 58, 11, 4, 0, 17, 0, 4, 0, 19, 0,193, 1, 3, 0, 7, 0, 84, 11, 4, 0, 19, 0, 4, 0, 37, 0, +194, 1, 15, 0,194, 1, 0, 0,194, 1, 1, 0, 84, 1, 92, 9,192, 1, 62, 0, 12, 0,101, 3, 35, 0, 50, 0,193, 1, 85, 11, + 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, 2, 0, 12, 1, 4, 0, 86, 11, 0, 0, 75, 11, 4, 0, 87, 11, 7, 0, 88, 11, +195, 1, 2, 0, 0, 0, 89, 11, 0, 0, 90, 11,196, 1, 4, 0,196, 1, 0, 0,196, 1, 1, 0,161, 0, 43, 3, 12, 0, 91, 11, +197, 1, 24, 0,197, 1, 0, 0,197, 1, 1, 0, 12, 0, 92, 11,161, 0,175, 8,196, 1, 93, 11, 12, 0, 94, 11, 12, 0,101, 3, + 0, 0,239, 3, 7, 0, 58, 11, 7, 0, 95, 11, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,155, 9, 7, 0,156, 9, 7, 0,228, 2, + 7, 0,159, 9, 7, 0,177, 8, 7, 0,160, 9, 2, 0, 96, 11, 2, 0, 97, 11, 2, 0, 43, 0, 2, 0, 17, 0, 4, 0, 19, 0, + 4, 0, 70, 0,198, 1, 6, 0,198, 1, 0, 0,198, 1, 1, 0, 12, 0, 92, 11, 4, 0, 19, 0, 4, 0,145, 2, 0, 0,239, 3, +199, 1, 11, 0,199, 1, 0, 0,199, 1, 1, 0, 27, 0,156, 6, 0, 0, 98, 11, 4, 0, 78, 11, 2, 0, 99, 11, 2, 0, 37, 0, + 0, 0, 75, 11, 4, 0, 86, 11, 2, 0, 19, 0, 2, 0,100, 11,200, 1, 8, 0,200, 1, 0, 0,200, 1, 1, 0, 12, 0,101, 11, + 0, 0,239, 3, 0, 0,102, 11, 2, 0, 19, 0, 2, 0,100, 11, 4, 0,103, 11,201, 1, 5, 0,201, 1, 0, 0,201, 1, 1, 0, + 0, 0, 75, 11, 4, 0, 86, 11, 7, 0,199, 2, 39, 0, 12, 0,161, 0, 93, 3,161, 0,104, 11,196, 1, 93, 11, 12, 0,105, 11, +197, 1,106, 11, 12, 0,107, 11, 12, 0,108, 11, 4, 0, 19, 0, 4, 0,244, 0, 2, 0,109, 11, 2, 0,110, 11, 7, 0,111, 11, +202, 1, 2, 0, 27, 0, 31, 0, 39, 0, 75, 0,203, 1, 5, 0,203, 1, 0, 0,203, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, + 0, 0, 20, 0,204, 1, 6, 0,203, 1,112, 11, 32, 0, 45, 0, 4, 0,113, 11, 7, 0,114, 11, 4, 0,115, 11, 4, 0, 81, 9, +205, 1, 3, 0,203, 1,112, 11, 4, 0,113, 11, 7, 0,116, 11,206, 1, 8, 0,203, 1,112, 11, 32, 0, 45, 0, 7, 0, 64, 1, + 7, 0,117, 11, 7, 0, 9, 3, 7, 0,237, 8, 4, 0,113, 11, 4, 0,118, 11,207, 1, 5, 0,203, 1,112, 11, 7, 0,119, 11, + 7, 0, 56, 8, 7, 0,234, 2, 7, 0, 57, 0,208, 1, 3, 0,203, 1,112, 11, 7, 0,237, 8, 7, 0,120, 11,151, 1, 4, 0, + 7, 0,121, 11, 7, 0,148, 10, 2, 0,122, 11, 2, 0, 69, 1,209, 1, 14, 0,209, 1, 0, 0,209, 1, 1, 0, 12, 0,123, 11, + 12, 0,124, 11, 12, 0,125, 11, 0, 0, 20, 0, 4, 0, 31, 0, 4, 0, 19, 0, 4, 0,126, 11, 7, 0,127, 11, 4, 0,115, 11, + 4, 0, 81, 9, 7, 0,248, 3, 7, 0,236, 2,158, 1, 23, 0, 4, 0,113, 11, 4, 0,128, 11, 7, 0,129, 11, 7, 0, 57, 0, + 7, 0,130, 11, 7, 0,232, 2, 7, 0,121, 11, 7, 0,131, 11, 7, 0,211, 2, 7, 0, 42, 10, 7, 0,128, 4, 7, 0,132, 11, + 7, 0,133, 11, 7, 0,134, 11, 7, 0,135, 11, 7, 0,136, 11, 7, 0,137, 11, 7, 0,138, 11, 7, 0,139, 11, 7, 0,140, 11, + 7, 0,141, 11, 7, 0,142, 11, 12, 0,143, 11,120, 0, 36, 0,119, 0,144, 11,210, 1,104, 10, 67, 0,145, 11, 67, 0,177, 10, + 67, 0,146, 11,211, 1,147, 11, 48, 0,162, 0, 48, 0,148, 11, 48, 0,149, 11, 7, 0,150, 11, 7, 0,151, 11, 7, 0,152, 11, + 7, 0,153, 11, 7, 0,154, 11, 7, 0, 93, 9, 7, 0,155, 11, 7, 0,158, 1, 7, 0,156, 11, 4, 0,157, 11, 4, 0,158, 11, + 4, 0,159, 11, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0,160, 11, 2, 0,161, 11, 2, 0,162, 11, 4, 0,163, 11, 7, 0,211, 2, + 4, 0,164, 11, 7, 0,165, 11, 4, 0,166, 11, 4, 0,167, 11, 4, 0,168, 11,136, 0,169, 11, 12, 0,170, 11,172, 0, 62, 4, +121, 0, 11, 0,119, 0,144, 11,147, 0, 29, 3, 7, 0,125, 1, 7, 0, 93, 9, 7, 0,171, 11, 7, 0,172, 11, 2, 0,173, 11, + 2, 0,174, 11, 2, 0,175, 11, 2, 0, 17, 0, 4, 0, 37, 0,122, 0, 13, 0,119, 0,144, 11,138, 0, 6, 3,140, 0, 8, 3, + 7, 0, 20, 9, 7, 0,176, 11, 7, 0,177, 11, 7, 0, 66, 1, 7, 0,178, 11, 4, 0,115, 9, 4, 0, 4, 3, 2, 0, 17, 0, + 2, 0, 37, 0, 4, 0, 70, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0}; + diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt new file mode 100644 index 00000000000..394418b5688 --- /dev/null +++ b/source/blender/editors/gpencil/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../imbuf + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/guardedalloc +) + +BLENDERLIB(bf_editor_gpencil "${SRC}" "${INC}") diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c index ed1835266d5..2b26f4a295d 100644 --- a/source/blender/editors/gpencil/drawgpencil.c +++ b/source/blender/editors/gpencil/drawgpencil.c @@ -34,19 +34,15 @@ #include "MEM_guardedalloc.h" -#include "IMB_imbuf.h" #include "IMB_imbuf_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" #include "DNA_gpencil_types.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" #include "BKE_blender.h" #include "BKE_context.h" @@ -55,20 +51,15 @@ #include "BKE_sequencer.h" #include "BKE_utildefines.h" -#include "PIL_time.h" #include "WM_api.h" -#include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" #include "ED_gpencil.h" #include "ED_sequencer.h" -#include "ED_util.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "gpencil_intern.h" @@ -684,7 +675,7 @@ void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf) zoom= (float)(SEQ_ZOOM_FAC(sseq->zoom)); if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { /* XXX sequencer zoom should store it? */ - zoomx = zoom; // * ((float)G.scene->r.xasp / (float)G.scene->r.yasp); + zoomx = zoom; // * (G.scene->r.xasp / G.scene->r.yasp); zoomy = zoom; } else @@ -718,7 +709,7 @@ void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf) /* draw grease-pencil sketches to specified 2d-view assuming that matrices are already set correctly * Note: this gets called twice - first time with onlyv2d=1 to draw 'canvas' strokes, second time with onlyv2d=0 for screen-aligned strokes */ -void draw_gpencil_2dview (bContext *C, short onlyv2d) +void draw_gpencil_view2d (bContext *C, short onlyv2d) { ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); @@ -744,7 +735,7 @@ void draw_gpencil_2dview (bContext *C, short onlyv2d) /* draw grease-pencil sketches to specified 3d-view assuming that matrices are already set correctly * Note: this gets called twice - first time with only3d=1 to draw 3d-strokes, second time with only3d=0 for screen-aligned strokes */ -void draw_gpencil_3dview_ext (Scene *scene, ARegion *ar, short only3d) +void draw_gpencil_view3d_ext (Scene *scene, ARegion *ar, short only3d) { bGPdata *gpd; int dflag = 0; @@ -758,11 +749,11 @@ void draw_gpencil_3dview_ext (Scene *scene, ARegion *ar, short only3d) gp_draw_data(gpd, 0, 0, ar->winx, ar->winy, CFRA, dflag); } -void draw_gpencil_3dview (bContext *C, short only3d) +void draw_gpencil_view3d (bContext *C, short only3d) { ARegion *ar= CTX_wm_region(C); Scene *scene= CTX_data_scene(C); - draw_gpencil_3dview_ext(scene, ar, only3d); + draw_gpencil_view3d_ext(scene, ar, only3d); } /* ************************************************** */ diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c index bfe0ba16af5..dff0839b5bd 100644 --- a/source/blender/editors/gpencil/editaction_gpencil.c +++ b/source/blender/editors/gpencil/editaction_gpencil.c @@ -36,14 +36,6 @@ #include "BLI_math.h" #include "BLI_blenlib.h" -#include "DNA_listBase.h" -#include "DNA_action_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" #include "BKE_global.h" #include "BKE_utildefines.h" @@ -54,15 +46,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "PIL_time.h" -#include "ED_anim_api.h" -#include "ED_gpencil.h" -#include "ED_keyframes_edit.h" -#include "ED_keyframes_draw.h" -#include "ED_markers.h" -#include "ED_util.h" -#include "ED_types.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c index 789355d2136..17bafa3d399 100644 --- a/source/blender/editors/gpencil/gpencil_buttons.c +++ b/source/blender/editors/gpencil/gpencil_buttons.c @@ -36,11 +36,7 @@ #include "BLI_blenlib.h" #include "DNA_gpencil_types.h" -#include "DNA_listBase.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -56,12 +52,9 @@ #include "BIF_glutil.h" #include "ED_gpencil.h" -#include "ED_sequencer.h" -#include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "gpencil_intern.h" @@ -129,11 +122,11 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) /* active */ icon= (gpl->flag & GP_LAYER_ACTIVE) ? ICON_RADIOBUT_ON : ICON_RADIOBUT_OFF; - uiItemR(subrow, "", icon, &ptr, "active", 0); + uiItemR(subrow, &ptr, "active", 0, "", icon); /* locked */ icon= (gpl->flag & GP_LAYER_LOCKED) ? ICON_LOCKED : ICON_UNLOCKED; - uiItemR(subrow, "", icon, &ptr, "locked", 0); + uiItemR(subrow, &ptr, "locked", 0, "", icon); /* when layer is locked or hidden, only draw header */ if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) { @@ -141,7 +134,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) /* visibility button (only if hidden but not locked!) */ if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED)) - uiItemR(subrow, "", ICON_RESTRICT_VIEW_ON, &ptr, "hide", 0); + uiItemR(subrow, &ptr, "hide", 0, "", ICON_RESTRICT_VIEW_ON); /* name */ @@ -166,17 +159,17 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) else { /* draw rest of header -------------------------------- */ /* visibility button */ - uiItemR(subrow, "", ICON_RESTRICT_VIEW_OFF, &ptr, "hide", 0); + uiItemR(subrow, &ptr, "hide", 0, "", ICON_RESTRICT_VIEW_OFF); /* frame locking */ // TODO: this needs its own icons... icon= (gpl->flag & GP_LAYER_FRAMELOCK) ? ICON_RENDER_STILL : ICON_RENDER_ANIMATION; - uiItemR(subrow, "", icon, &ptr, "frame_lock", 0); + uiItemR(subrow, &ptr, "frame_lock", 0, "", icon); uiBlockSetEmboss(block, UI_EMBOSS); /* name */ - uiItemR(subrow, "", 0, &ptr, "info", 0); + uiItemR(subrow, &ptr, "info", 0, "", 0); /* delete 'button' */ uiBlockSetEmboss(block, UI_EMBOSSN); @@ -200,17 +193,17 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) /* color */ subcol= uiLayoutColumn(col, 1); - uiItemR(subcol, "", 0, &ptr, "color", 0); - uiItemR(subcol, NULL, 0, &ptr, "opacity", UI_ITEM_R_SLIDER); + uiItemR(subcol, &ptr, "color", 0, "", 0); + uiItemR(subcol, &ptr, "opacity", UI_ITEM_R_SLIDER, NULL, 0); /* stroke thickness */ subcol= uiLayoutColumn(col, 1); - uiItemR(subcol, NULL, 0, &ptr, "line_thickness", UI_ITEM_R_SLIDER); + uiItemR(subcol, &ptr, "line_thickness", UI_ITEM_R_SLIDER, NULL, 0); /* debugging options */ if (G.f & G_DEBUG) { subcol= uiLayoutColumn(col, 1); - uiItemR(subcol, NULL, 0, &ptr, "show_points", 0); + uiItemR(subcol, &ptr, "show_points", 0, NULL, 0); } /* right column ................... */ @@ -218,8 +211,8 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) /* onion-skinning */ subcol= uiLayoutColumn(col, 1); - uiItemR(subcol, "Onion Skinning", 0, &ptr, "use_onion_skinning", 0); - uiItemR(subcol, "Frames", 0, &ptr, "max_ghost_range", 0); // XXX shorter name here? (i.e. GStep) + uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", 0); + uiItemR(subcol, &ptr, "max_ghost_range", 0, "Frames", 0); // XXX shorter name here? i.e. GStep /* additional options... */ subcol= uiLayoutColumn(col, 1); @@ -228,12 +221,20 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) } } +/* stroke drawing options available */ +typedef enum eGP_Stroke_Ops { + STROKE_OPTS_NORMAL = 0, + STROKE_OPTS_V3D_OFF, + STROKE_OPTS_V3D_ON, +} eGP_Stroke_Ops; + /* Draw the contents for a grease-pencil panel*/ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, PointerRNA *ctx_ptr) { PointerRNA gpd_ptr; bGPDlayer *gpl; uiLayout *col, *row; + short v3d_stroke_opts = STROKE_OPTS_NORMAL; /* make new PointerRNA for Grease Pencil block */ RNA_id_pointer_create((ID *)gpd, &gpd_ptr); @@ -242,7 +243,7 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi col= uiLayoutColumn(layout, 0); /* current Grease Pencil block */ // TODO: show some info about who owns this? - uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_add", NULL, "GPENCIL_OT_data_unlink"); + uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_add", NULL, "GPENCIL_OT_data_unlink", NULL); /* add new layer button - can be used even when no data, since it can add a new block too */ uiItemO(col, NULL, 0, "GPENCIL_OT_layer_add"); @@ -262,17 +263,26 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi /* label */ uiItemL(col, "Drawing Settings:", 0); - /* 'stick to view' option */ + /* check whether advanced 3D-View drawing space options can be used */ + if (CTX_wm_view3d(C)) { + if (gpd->flag & (GP_DATA_DEPTH_STROKE|GP_DATA_DEPTH_VIEW)) + v3d_stroke_opts = STROKE_OPTS_V3D_ON; + else + v3d_stroke_opts = STROKE_OPTS_V3D_OFF; + } + + /* drawing space options */ row= uiLayoutRow(col, 1); - uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "VIEW"); - uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "CURSOR"); + uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, 0); + uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, 0); row= uiLayoutRow(col, 1); - uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "SURFACE"); - uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "STROKE"); + uiLayoutSetActive(row, v3d_stroke_opts); + uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, 0); + uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, 0); row= uiLayoutRow(col, 0); - uiLayoutSetActive(row, (gpd->flag & (GP_DATA_DEPTH_STROKE|GP_DATA_DEPTH_VIEW)) ? 1:0); - uiItemR(row, NULL, 0, &gpd_ptr, "use_stroke_endpoints", 0); + uiLayoutSetActive(row, v3d_stroke_opts==STROKE_OPTS_V3D_ON); + uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, 0); } diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 7bcfc81bf26..c487c0469ba 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -34,23 +34,16 @@ #include "MEM_guardedalloc.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" -#include "DNA_listBase.h" -#include "DNA_armature_types.h" #include "DNA_curve_types.h" -#include "DNA_gpencil_types.h" #include "DNA_object_types.h" #include "DNA_node_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_vec_types.h" #include "DNA_view3d_types.h" #include "BKE_armature.h" @@ -76,9 +69,6 @@ #include "UI_view2d.h" -#include "ED_armature.h" -#include "ED_gpencil.h" -#include "ED_sequencer.h" #include "ED_view3d.h" #include "gpencil_intern.h" @@ -423,7 +413,7 @@ static void gp_stroke_to_path (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, Cur nu->pntsu= gps->totpoints; nu->pntsv= 1; nu->orderu= gps->totpoints; - nu->flagu= 2; /* endpoint */ + nu->flagu= CU_NURB_ENDPOINT; nu->resolu= 32; nu->bp= (BPoint *)MEM_callocN(sizeof(BPoint)*gps->totpoints, "bpoints"); @@ -451,38 +441,60 @@ static void gp_stroke_to_bezier (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, C bGPDspoint *pt; Nurb *nu; BezTriple *bezt; - int i; - + int i, tot; + float p3d_cur[3], p3d_prev[3], p3d_next[3]; + /* create new 'nurb' within the curve */ nu = (Nurb *)MEM_callocN(sizeof(Nurb), "gpstroke_to_bezier(nurb)"); - + nu->pntsu= gps->totpoints; nu->resolu= 12; nu->resolv= 12; nu->type= CU_BEZIER; nu->bezt = (BezTriple *)MEM_callocN(gps->totpoints*sizeof(BezTriple), "bezts"); - + + tot= gps->totpoints; + + /* get initial coordinates */ + pt=gps->points; + if (tot) { + gp_strokepoint_convertcoords(C, gps, pt, p3d_cur); + if (tot > 1) { + gp_strokepoint_convertcoords(C, gps, pt+1, p3d_next); + } + } + /* add points */ - for (i=0, pt=gps->points, bezt=nu->bezt; i < gps->totpoints; i++, pt++, bezt++) { - float p3d[3]; - - /* get coordinates to add at */ - gp_strokepoint_convertcoords(C, gps, pt, p3d); - - /* TODO: maybe in future the handles shouldn't be in same place */ - copy_v3_v3(bezt->vec[0], p3d); - copy_v3_v3(bezt->vec[1], p3d); - copy_v3_v3(bezt->vec[2], p3d); - + for (i=0, bezt=nu->bezt; i < tot; i++, pt++, bezt++) { + float h1[3], h2[3]; + + if (i) interp_v3_v3v3(h1, p3d_cur, p3d_prev, 0.3); + else interp_v3_v3v3(h1, p3d_cur, p3d_next, -0.3); + + if (i < tot-1) interp_v3_v3v3(h2, p3d_cur, p3d_next, 0.3); + else interp_v3_v3v3(h2, p3d_cur, p3d_prev, -0.3); + + copy_v3_v3(bezt->vec[0], h1); + copy_v3_v3(bezt->vec[1], p3d_cur); + copy_v3_v3(bezt->vec[2], h2); + /* set settings */ bezt->h1= bezt->h2= HD_FREE; bezt->f1= bezt->f2= bezt->f3= SELECT; bezt->radius = bezt->weight = pt->pressure * gpl->thickness * 0.1f; + + /* shift coord vects */ + copy_v3_v3(p3d_prev, p3d_cur); + copy_v3_v3(p3d_cur, p3d_next); + + if (i < tot) { + gp_strokepoint_convertcoords(C, gps, pt+1, p3d_next); + } } - + /* must calculate handles or else we crash */ calchandlesNurb(nu); - + /* add nurb to curve */ BLI_addtail(&cu->nurb, nu); } @@ -503,7 +515,7 @@ static void gp_layer_to_curve (bContext *C, bGPdata *gpd, bGPDlayer *gpl, short /* only convert if there are any strokes on this layer's frame to convert */ if (gpf->strokes.first == NULL) return; - + /* init the curve object (remove rotation and get curve data from it) * - must clear transforms set on object, as those skew our results */ @@ -549,16 +561,16 @@ static int gp_convert_layer_exec (bContext *C, wmOperator *op) View3D *v3d= CTX_wm_view3d(C); float *fp= give_cursor(scene, v3d); int mode= RNA_enum_get(op->ptr, "type"); - + /* check if there's data to work with */ if (gpd == NULL) { BKE_report(op->reports, RPT_ERROR, "No Grease Pencil data to work on."); return OPERATOR_CANCELLED; } - + /* initialise 3d-cursor correction globals */ initgrabz(CTX_wm_region_view3d(C), fp[0], fp[1], fp[2]); - + /* handle conversion modes */ switch (mode) { case GP_STROKECONVERT_PATH: @@ -570,10 +582,11 @@ static int gp_convert_layer_exec (bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "Unknown conversion option."); return OPERATOR_CANCELLED; } - + /* notifiers */ WM_event_add_notifier(C, NC_OBJECT|NA_ADDED, NULL); - + WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene); + /* done */ return OPERATOR_FINISHED; } diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index c2a8f339e14..1bfe65eb36c 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index 5c8594d4016..d9bd43cc851 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -31,14 +31,11 @@ #include "BLI_blenlib.h" -#include "DNA_windowmanager_types.h" #include "WM_api.h" #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "RNA_enum_types.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 2e45c65568f..b52297a319c 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -42,21 +42,12 @@ #include "BKE_report.h" #include "BKE_utildefines.h" -#include "DNA_gpencil_types.h" -#include "DNA_action_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_view2d_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "UI_view2d.h" -#include "ED_armature.h" #include "ED_gpencil.h" -#include "ED_sequencer.h" #include "ED_screen.h" #include "ED_view3d.h" @@ -170,7 +161,9 @@ static void gp_get_3d_reference (tGPsdata *p, float *vec) float *fp= give_cursor(p->scene, v3d); /* the reference point used depends on the owner... */ - if (p->ownerPtr.type == &RNA_Object) { +#if 0 // XXX: disabled for now, since we can't draw relative ot the owner yet + if (p->ownerPtr.type == &RNA_Object) + { Object *ob= (Object *)p->ownerPtr.data; /* active Object @@ -178,7 +171,9 @@ static void gp_get_3d_reference (tGPsdata *p, float *vec) */ sub_v3_v3v3(vec, fp, ob->loc); } - else { + else +#endif + { /* use 3D-cursor */ copy_v3_v3(vec, fp); } @@ -1077,7 +1072,7 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode) /* calculate zoom factor */ zoom= (float)(SEQ_ZOOM_FAC(sseq->zoom)); if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { - zoomx = zoom * ((float)p->scene->r.xasp / (float)p->scene->r.yasp); + zoomx = zoom * (p->scene->r.xasp / p->scene->r.yasp); zoomy = zoom; } else @@ -1101,7 +1096,20 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode) #endif case SPACE_IMAGE: { - p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE; + SpaceImage *sima= (SpaceImage *)p->sa->spacedata.first; + + /* only set these flags if the image editor doesn't have an image active, + * otherwise user will be confused by strokes not appearing after they're drawn + * + * Admittedly, this is a bit hacky, but it works much nicer from an ergonomic standpoint! + */ + if ELEM(NULL, sima, sima->image) { + /* make strokes be drawn in screen space */ + p->gpd->sbuffer_sflag &= ~GP_STROKE_2DSPACE; + p->gpd->flag &= ~GP_DATA_VIEWALIGN; + } + else + p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE; } break; } @@ -1473,6 +1481,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) /* moving mouse - assumed that mouse button is down if in painting status */ case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: /* check if we're currently painting */ if (p->status == GP_STATUS_PAINTING) { /* handle drawing event */ @@ -1507,6 +1516,8 @@ static EnumPropertyItem prop_gpencil_drawmodes[] = { void GPENCIL_OT_draw (wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name= "Grease Pencil Draw"; ot->idname= "GPENCIL_OT_draw"; @@ -1523,6 +1534,8 @@ void GPENCIL_OT_draw (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; /* settings for drawing */ - RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements."); + prop= RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements."); + RNA_def_property_flag(prop, PROP_HIDDEN); + RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", ""); } diff --git a/source/blender/editors/include/BIF_gl.h b/source/blender/editors/include/BIF_gl.h index 963a617fe87..aca0e671067 100644 --- a/source/blender/editors/include/BIF_gl.h +++ b/source/blender/editors/include/BIF_gl.h @@ -31,7 +31,7 @@ #ifndef BIF_GL_H #define BIF_GL_H -#include "GL/glew.h" +#include "../../../../extern/glew/include/GL/glew.h" /* * these should be phased out. cpack should be replaced in diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h index 99fb25e336d..8f37baf9af1 100644 --- a/source/blender/editors/include/BIF_glutil.h +++ b/source/blender/editors/include/BIF_glutil.h @@ -1,5 +1,5 @@ /** - * $Id: BIF_glutil.h + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h index 2f089a41a3f..5fb7fa41752 100644 --- a/source/blender/editors/include/ED_anim_api.h +++ b/source/blender/editors/include/ED_anim_api.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -102,8 +102,11 @@ typedef struct bAnimListElem { int flag; /* copy of elem's flags for quick access */ int index; /* for un-named data, the index of the data in it's collection */ - void *key_data; /* motion data - mostly F-Curves, but can be other types too */ + short elemFlag; /* flags for the list elem instance (not the data it represents) */ + short datatype; /* type of motion data to expect */ + void *key_data; /* motion data - mostly F-Curves, but can be other types too */ + struct ID *id; /* ID block that channel is attached to */ struct AnimData *adt; /* source of the animation data attached to ID block (for convenience) */ @@ -192,6 +195,7 @@ typedef enum eAnimFilter_Flags { ANIMFILTER_ANIMDATA = (1<<9), /* only return the underlying AnimData blocks (not the tracks, etc.) data comes from */ ANIMFILTER_NLATRACKS = (1<<10), /* only include NLA-tracks */ ANIMFILTER_SELEDIT = (1<<11), /* link editability with selected status */ + ANIMFILTER_NODUPLIS = (1<<12), /* duplicate entries for animation data attached to multi-user blocks must not occur */ /* all filters - the power inside the bracket must be the last power for left-shifts + 1 */ ANIMFILTER_ALLFILTERS = ((1<<12) - 1) @@ -326,7 +330,7 @@ typedef enum eAnimChannels_SetFlag { /* types of settings for AnimChannels */ typedef enum eAnimChannel_Settings { - ACHANNEL_SETTING_SELECT = 0, + ACHANNEL_SETTING_SELECT = 0, ACHANNEL_SETTING_PROTECT, // warning: for drawing UI's, need to check if this is off (maybe inverse this later) ACHANNEL_SETTING_MUTE, ACHANNEL_SETTING_EXPAND, @@ -452,9 +456,28 @@ void ANIM_draw_previewrange(const struct bContext *C, struct View2D *v2d); /* ************************************************* */ /* F-MODIFIER TOOLS */ +/* ------------- UI Panel Drawing -------------- */ + /* draw a given F-Modifier for some layout/UI-Block */ void ANIM_uiTemplate_fmodifier_draw(struct uiLayout *layout, struct ID *id, ListBase *modifiers, struct FModifier *fcm); +/* ------------- Copy/Paste Buffer -------------- */ + + +/* free the copy/paste buffer */ +void free_fmodifiers_copybuf(void); + +/* copy the given F-Modifiers to the buffer, returning whether anything was copied or not + * assuming that the buffer has been cleared already with free_fmodifiers_copybuf() + * - active: only copy the active modifier + */ +short ANIM_fmodifiers_copy_to_buf(ListBase *modifiers, short active); + +/* 'Paste' the F-Modifier(s) from the buffer to the specified list + * - replace: free all the existing modifiers to leave only the pasted ones + */ +short ANIM_fmodifiers_paste_from_buf(ListBase *modifiers, short replace); + /* ************************************************* */ /* ASSORTED TOOLS */ diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index 95d0c4cfaca..d2d1e2a1d69 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -102,7 +102,6 @@ void ED_keymap_armature(struct wmKeyConfig *keyconf); void ED_armature_from_edit(struct Object *obedit); void ED_armature_to_edit(struct Object *ob); void ED_armature_edit_free(struct Object *ob); -void ED_armature_edit_remake(struct Object *obedit); void ED_armature_deselectall(struct Object *obedit, int toggle, int doundo); int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer, @@ -166,7 +165,7 @@ void BDR_drawSketch(const struct bContext *vc); int BDR_drawSketchNames(struct ViewContext *vc); /* meshlaplacian.c */ -void mesh_deform_bind(struct Scene *scene, struct DerivedMesh *dm, +void mesh_deform_bind(struct Scene *scene, struct MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[][4]); diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index d1bba6bf796..a229d919e77 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -71,5 +71,7 @@ void free_editText (struct Object *obedit); void ED_text_to_object(struct bContext *C, struct Text *text, int split_lines); +int CU_select_nth(struct Object *obedit, int nth); + #endif /* ED_CURVE_H */ diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h index 136d46cdc91..9a5a1a5bea6 100644 --- a/source/blender/editors/include/ED_datafiles.h +++ b/source/blender/editors/include/ED_datafiles.h @@ -31,8 +31,8 @@ /* Datafiles embedded in Blender */ -extern int datatoc_B_blend_size; -extern char datatoc_B_blend[]; +extern int datatoc_startup_blend_size; +extern char datatoc_startup_blend[]; extern int datatoc_blenderbuttons_size; extern char datatoc_blenderbuttons[]; diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h index 44785b36d0c..5001323cb61 100644 --- a/source/blender/editors/include/ED_fileselect.h +++ b/source/blender/editors/include/ED_fileselect.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,6 +31,7 @@ struct SpaceFile; struct ARegion; struct FileSelectParams; +struct bContext; #define FILE_LAYOUT_HOR 1 #define FILE_LAYOUT_VER 2 @@ -82,11 +83,15 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar); FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar); int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar); -int ED_fileselect_layout_offset(FileLayout* layout, int x, int y); +int ED_fileselect_layout_offset(FileLayout* layout, int clamp_bounds, int x, int y); void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, int *x, int *y); void ED_operatormacros_file(void); +void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile); + +void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile); + #endif /* ED_FILES_H */ diff --git a/source/blender/editors/include/ED_fluidsim.h b/source/blender/editors/include/ED_fluidsim.h index 8a9a294d423..a1ab3ba2fcc 100644 --- a/source/blender/editors/include/ED_fluidsim.h +++ b/source/blender/editors/include/ED_fluidsim.h @@ -34,8 +34,6 @@ struct Object; struct FluidsimSettings; -extern double fluidsimViscosityPreset[6]; -extern char* fluidsimViscosityPresetString[6]; /* allocates and initializes fluidsim data */ struct FluidsimSettings* fluidsimSettingsNew(struct Object *srcob); diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h index 05534bd584c..0003cea8147 100644 --- a/source/blender/editors/include/ED_gpencil.h +++ b/source/blender/editors/include/ED_gpencil.h @@ -70,9 +70,9 @@ void ED_operatortypes_gpencil(void); /* drawgpencil.c */ void draw_gpencil_2dimage(struct bContext *C, struct ImBuf *ibuf); -void draw_gpencil_2dview(struct bContext *C, short onlyv2d); -void draw_gpencil_3dview(struct bContext *C, short only3d); -void draw_gpencil_3dview_ext(struct Scene *scene, struct ARegion *ar, short only3d); +void draw_gpencil_view2d(struct bContext *C, short onlyv2d); +void draw_gpencil_view3d(struct bContext *C, short only3d); +void draw_gpencil_view3d_ext(struct Scene *scene, struct ARegion *ar, short only3d); void gpencil_panel_standard(const struct bContext *C, struct Panel *pa); diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h index 7bf0c284c9b..1d674112b8d 100644 --- a/source/blender/editors/include/ED_image.h +++ b/source/blender/editors/include/ED_image.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_info.h b/source/blender/editors/include/ED_info.h index 2132ef96709..33b890cea60 100644 --- a/source/blender/editors/include/ED_info.h +++ b/source/blender/editors/include/ED_info.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h index 1219cee3a11..60f2526191c 100644 --- a/source/blender/editors/include/ED_keyframes_edit.h +++ b/source/blender/editors/include/ED_keyframes_edit.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -60,10 +60,14 @@ typedef enum eEditKeyframes_Validate { /* select modes */ typedef enum eEditKeyframes_Select { + /* SELECT_SUBTRACT for all, followed by SELECT_ADD for some */ SELECT_REPLACE = (1<<0), + /* add ok keyframes to selection */ SELECT_ADD = (1<<1), + /* remove ok keyframes from selection */ SELECT_SUBTRACT = (1<<2), - SELECT_INVERT = (1<<4), + /* flip ok status of keyframes based on key status */ + SELECT_INVERT = (1<<3), } eEditKeyframes_Select; /* "selection map" building modes */ @@ -94,9 +98,9 @@ typedef enum eEditKeyframes_Mirror { /* ************************************************ */ /* Non-Destuctive Editing API (keyframes_edit.c) */ -/* --- Generic Properties for Bezier Edit Tools ----- */ +/* --- Generic Properties for Keyframe Edit Tools ----- */ -typedef struct BeztEditData { +typedef struct KeyframeEditData { /* generic properties/data access */ ListBase list; /* temp list for storing custom list of data to check */ struct Scene *scene; /* pointer to current scene - many tools need access to cfra/etc. */ @@ -107,36 +111,60 @@ typedef struct BeztEditData { /* current iteration data */ struct FCurve *fcu; /* F-Curve that is being iterated over */ int curIndex; /* index of current keyframe being iterated over */ -} BeztEditData; + + /* flags */ + short curflags; /* current flags for the keyframe we're reached in the iteration process */ + short iterflags; /* settings for iteration process */ // XXX: unused... +} KeyframeEditData; /* ------- Function Pointer Typedefs ---------------- */ /* callback function that refreshes the F-Curve after use */ typedef void (*FcuEditFunc)(struct FCurve *fcu); /* callback function that operates on the given BezTriple */ -typedef short (*BeztEditFunc)(BeztEditData *bed, struct BezTriple *bezt); +typedef short (*KeyframeEditFunc)(KeyframeEditData *ked, struct BezTriple *bezt); + +/* ---------- Defines for 'OK' polls ----------------- */ + +/* which verts of a keyframe is active (after polling) */ +typedef enum eKeyframeVertOk { + /* 'key' itself is ok */ + KEYFRAME_OK_KEY = (1<<0), + /* 'handle 1' is ok */ + KEYFRAME_OK_H1 = (1<<1), + /* 'handle 2' is ok */ + KEYFRAME_OK_H2 = (1<<2), + /* all flags */ + KEYFRAME_OK_ALL = (KEYFRAME_OK_KEY|KEYFRAME_OK_H1|KEYFRAME_OK_H2) +} eKeyframeVertOk; + +/* Flags for use during iteration */ +typedef enum eKeyframeIterFlags { + /* consider handles in addition to key itself */ + KEYFRAME_ITER_INCL_HANDLES = (1<<0), +} eKeyframeIterFlags; /* ------- Custom Data Type Defines ------------------ */ /* Custom data for remapping one range to another in a fixed way */ -typedef struct BeztEditCD_Remap { +typedef struct KeyframeEditCD_Remap { float oldMin, oldMax; /* old range */ float newMin, newMax; /* new range */ -} BeztEditCD_Remap; +} KeyframeEditCD_Remap; /* ---------------- Looping API --------------------- */ /* functions for looping over keyframes */ /* function for working with F-Curve data only (i.e. when filters have been chosen to explicitly use this) */ -short ANIM_fcurve_keys_bezier_loop(BeztEditData *bed, struct FCurve *fcu, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb); +short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, struct FCurve *fcu, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb); /* function for working with any type (i.e. one of the known types) of animation channel * - filterflag is bDopeSheet->flag (DOPESHEET_FILTERFLAG) */ -short ANIM_animchannel_keys_bezier_loop(BeztEditData *bed, struct bAnimListElem *ale, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag); +short ANIM_animchannel_keyframes_loop(KeyframeEditData *ked, struct bAnimListElem *ale, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag); /* same as above, except bAnimListElem wrapper is not needed... * - keytype is eAnim_KeyType */ -short ANIM_animchanneldata_keys_bezier_loop(BeztEditData *bed, void *data, int keytype, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag); +short ANIM_animchanneldata_keyframes_loop(KeyframeEditData *ked, void *data, int keytype, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag); /* functions for making sure all keyframes are in good order */ void ANIM_editkeyframes_refresh(struct bAnimContext *ac); @@ -144,40 +172,40 @@ void ANIM_editkeyframes_refresh(struct bAnimContext *ac); /* ----------- BezTriple Callback Getters ---------- */ /* accessories */ -BeztEditFunc ANIM_editkeyframes_ok(short mode); +KeyframeEditFunc ANIM_editkeyframes_ok(short mode); /* edit */ -BeztEditFunc ANIM_editkeyframes_snap(short mode); -BeztEditFunc ANIM_editkeyframes_mirror(short mode); -BeztEditFunc ANIM_editkeyframes_select(short mode); -BeztEditFunc ANIM_editkeyframes_handles(short mode); -BeztEditFunc ANIM_editkeyframes_ipo(short mode); -BeztEditFunc ANIM_editkeyframes_keytype(short mode); +KeyframeEditFunc ANIM_editkeyframes_snap(short mode); +KeyframeEditFunc ANIM_editkeyframes_mirror(short mode); +KeyframeEditFunc ANIM_editkeyframes_select(short mode); +KeyframeEditFunc ANIM_editkeyframes_handles(short mode); +KeyframeEditFunc ANIM_editkeyframes_ipo(short mode); +KeyframeEditFunc ANIM_editkeyframes_keytype(short mode); /* -------- BezTriple Callbacks (Selection Map) ---------- */ /* Get a callback to populate the selection settings map - * requires: bed->custom = char[] of length fcurve->totvert + * requires: ked->custom = char[] of length fcurve->totvert */ -BeztEditFunc ANIM_editkeyframes_buildselmap(short mode); +KeyframeEditFunc ANIM_editkeyframes_buildselmap(short mode); /* Change the selection status of the keyframe based on the map entry for this vert - * requires: bed->custom = char[] of length fcurve->totvert + * requires: ked->custom = char[] of length fcurve->totvert */ -short bezt_selmap_flush(BeztEditData *bed, struct BezTriple *bezt); +short bezt_selmap_flush(KeyframeEditData *ked, struct BezTriple *bezt); /* ----------- BezTriple Callback (Assorted Utilities) ---------- */ /* used to calculate the the average location of all relevant BezTriples by summing their locations */ -short bezt_calc_average(BeztEditData *bed, struct BezTriple *bezt); +short bezt_calc_average(KeyframeEditData *ked, struct BezTriple *bezt); /* used to extract a set of cfra-elems from the keyframes */ -short bezt_to_cfraelem(BeztEditData *bed, struct BezTriple *bezt); +short bezt_to_cfraelem(KeyframeEditData *ked, struct BezTriple *bezt); /* used to remap times from one range to another - * requires: bed->custom = BeztEditCD_Remap + * requires: ked->custom = KeyframeEditCD_Remap */ -void bezt_remap_times(BeztEditData *bed, struct BezTriple *bezt); +void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt); /* ************************************************ */ /* Destructive Editing API (keyframes_general.c) */ diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index 2c58d9e3ff5..fc5e3a43a62 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -47,6 +47,8 @@ struct wmOperatorType; struct PointerRNA; struct PropertyRNA; +#include "RNA_types.h" + /* ************ Keyframing Management **************** */ /* Get the active settings for keyframing settings from context (specifically the given scene) @@ -89,8 +91,6 @@ int insert_vert_fcurve(struct FCurve *fcu, float x, float y, short flag); */ short insert_keyframe_direct(struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, short flag); - - /* -------- */ /* Main Keyframing API calls: @@ -106,48 +106,99 @@ short delete_keyframe(struct ID *id, struct bAction *act, const char group[], co /* ************ Keying Sets ********************** */ -/* temporary struct to gather data combos to keyframe - * (is used by modify_keyframes for 'relative' KeyingSets, provided via the dsources arg) - */ -typedef struct bCommonKeySrc { - struct bCommonKeySrc *next, *prev; - - /* general data/destination-source settings */ - struct ID *id; /* id-block this comes from */ +/* forward decl. for this struct which is declared a bit later... */ +struct KeyingSetInfo; +struct ExtensionRNA; + +/* Polling Callback for KeyingSets */ +typedef int (*cbKeyingSet_Poll)(struct KeyingSetInfo *ksi, struct bContext *C); +/* Context Iterator Callback for KeyingSets */ +typedef void (*cbKeyingSet_Iterator)(struct KeyingSetInfo *ksi, struct bContext *C, struct KeyingSet *ks); +/* Property Specifier Callback for KeyingSets (called from iterators) */ +typedef void (*cbKeyingSet_Generate)(struct KeyingSetInfo *ksi, struct bContext *C, struct KeyingSet *ks, struct PointerRNA *ptr); + + +/* Callback info for 'Procedural' KeyingSets to use */ +typedef struct KeyingSetInfo { + struct KeyingSetInfo *next, *prev; - /* specific cases */ - struct bPoseChannel *pchan; - struct bConstraint *con; -} bCommonKeySrc; + /* info */ + /* identifier so that user can hook this up to a KeyingSet */ + char name[64]; + /* identifier used for class name, which KeyingSet instances reference as "Typeinfo Name" */ + char idname[64]; + /* keying settings */ + short keyingflag; + + /* polling callbacks */ + /* callback for polling the context for whether the right data is available */ + cbKeyingSet_Poll poll; + + /* generate callbacks */ + /* iterator to use to go through collections of data in context + * - this callback is separate from the 'adding' stage, allowing + * BuiltIn KeyingSets to be manually specified to use + */ + cbKeyingSet_Iterator iter; + /* generator to use to add properties based on the data found by iterator */ + cbKeyingSet_Generate generate; + + /* RNA integration */ + struct ExtensionRNA ext; +} KeyingSetInfo; /* -------- */ +/* Add another data source for Relative Keying Sets to be evaluated with */ +void ANIM_relative_keyingset_add_source(ListBase *dsources, struct ID *id, struct StructRNA *srna, void *data); + + /* mode for modify_keyframes */ typedef enum eModifyKey_Modes { MODIFYKEY_MODE_INSERT = 0, MODIFYKEY_MODE_DELETE, } eModifyKey_Modes; -/* Keyframing Helper Call - use the provided Keying Set to Add/Remove Keyframes */ -int modify_keyframes(struct Scene *scene, struct ListBase *dsources, struct bAction *act, struct KeyingSet *ks, short mode, float cfra); +/* return codes for errors (with Relative KeyingSets) */ +typedef enum eModifyKey_Returns { + /* context info was invalid for using the Keying Set */ + MODIFYKEY_INVALID_CONTEXT = -1, + /* there isn't any typeinfo for generating paths from context */ + MODIFYKEY_MISSING_TYPEINFO = -2, +} eModifyKey_Returns; + +/* use the specified KeyingSet to add/remove various Keyframes on the specified frame */ +int ANIM_apply_keyingset(struct bContext *C, ListBase *dsources, struct bAction *act, struct KeyingSet *ks, short mode, float cfra); /* -------- */ -/* Generate menu of KeyingSets */ -char *ANIM_build_keyingsets_menu(struct ListBase *list, short for_edit); - /* Get the first builtin KeyingSet with the given name, which occurs after the given one (or start of list if none given) */ -struct KeyingSet *ANIM_builtin_keyingset_get_named(struct KeyingSet *prevKS, char name[]); +struct KeyingSet *ANIM_builtin_keyingset_get_named(struct KeyingSet *prevKS, const char name[]); -/* Initialise builtin KeyingSets on startup */ -void init_builtin_keyingsets(void); +/* Find KeyingSet type info given a name */ +KeyingSetInfo *ANIM_keyingset_info_find_named(const char name[]); +/* for RNA type registrations... */ +void ANIM_keyingset_info_register(const struct bContext *C, KeyingSetInfo *ksi); +void ANIM_keyingset_info_unregister(const struct bContext *C, KeyingSetInfo *ksi); + +/* cleanup on exit */ +void ANIM_keyingset_infos_exit(void); /* -------- */ /* Get the active KeyingSet for the given scene */ struct KeyingSet *ANIM_scene_get_active_keyingset(struct Scene *scene); +/* Get the index of the Keying Set provided, for the given Scene */ +int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks); + +/* Create (and show) a menu containing all the Keying Sets which can be used in the current context */ +void ANIM_keying_sets_menu_setup(struct bContext *C, char title[], char op_name[]); + +/* Check if KeyingSet can be used in the current context */ +short ANIM_keyingset_context_ok_poll(struct bContext *C, struct KeyingSet *ks); + /* ************ Drivers ********************** */ /* Returns whether there is a driver in the copy/paste buffer to paste */ @@ -206,7 +257,7 @@ short fcurve_frame_has_keyframe(struct FCurve *fcu, float frame, short filter); * Checks whether a keyframe exists for the given ID-block one the given frame. * - It is recommended to call this method over the other keyframe-checkers directly, * in case some detail of the implementation changes... - * - frame: the value of this is quite often result of frame_to_float(CFRA) + * - frame: the value of this is quite often result of BKE_curframe() */ short id_frame_has_keyframe(struct ID *id, float frame, short filter); diff --git a/source/blender/imbuf/intern/IMB_ham.h b/source/blender/editors/include/ED_logic.h similarity index 76% rename from source/blender/imbuf/intern/IMB_ham.h rename to source/blender/editors/include/ED_logic.h index d455f9b519a..96d10cf2c72 100644 --- a/source/blender/imbuf/intern/IMB_ham.h +++ b/source/blender/editors/include/ED_logic.h @@ -1,6 +1,4 @@ -/* - * IMB_ham.h - * +/** * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -22,24 +20,17 @@ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. + * Contributor(s): Blender Foundation * * ***** END GPL LICENSE BLOCK ***** */ -/** - * \file IMB_ham.h - * \ingroup imbuf - * \brief Function declarations for ham.c - */ +#ifndef ED_LOGIC_H +#define ED_LOGIC_H -#ifndef IMB_HAM_H -#define IMB_HAM_H +/* logic_ops.c */ +void ED_operatortypes_logic(void); -struct ImBuf; +#endif /* ED_LOGIC_H */ -short imb_converttoham(struct ImBuf *ibuf); -#endif diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h index 06434d70656..e5e1f3cef10 100644 --- a/source/blender/editors/include/ED_markers.h +++ b/source/blender/editors/include/ED_markers.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index a1655065e1e..68eb8566759 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index b7dc9bf73b5..6e42b772bef 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -40,6 +40,7 @@ void ED_init_node_butfuncs(void); /* node_draw.c */ void ED_node_changed_update(struct ID *id, struct bNode *node); +void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node); /* node_edit.c */ void ED_node_shader_default(struct Material *ma); diff --git a/source/blender/editors/include/ED_numinput.h b/source/blender/editors/include/ED_numinput.h index ca5dc4797de..7df1f1f28cb 100644 --- a/source/blender/editors/include/ED_numinput.h +++ b/source/blender/editors/include/ED_numinput.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,13 +27,13 @@ typedef struct NumInput { - short idx; - short idx_max; - short flag; /* Different flags to indicate different behaviors */ - char inv[3]; /* If the value is inverted or not */ - float val[3]; /* Direct value of the input */ - int ctrl[3]; /* Control to indicate what to do with the numbers that are typed */ - float increment; + short idx; + short idx_max; + short flag; /* Different flags to indicate different behaviors */ + char inv[3]; /* If the value is inverted or not */ + float val[3]; /* Direct value of the input */ + int ctrl[3]; /* Control to indicate what to do with the numbers that are typed */ + float increment; } NumInput ; /* NUMINPUT FLAGS */ diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 8045f2a9130..a03cd135f1c 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -48,6 +48,9 @@ struct wmOperator; struct wmEvent; /* object_edit.c */ +struct Object *ED_object_active_context(struct bContext *C); + +/* object_ops.c */ void ED_operatortypes_object(void); void ED_operatormacros_object(void); void ED_keymap_object(struct wmKeyConfig *keyconf); @@ -62,7 +65,6 @@ void ED_base_object_activate(struct bContext *C, struct Base *base); void ED_base_object_free_and_unlink(struct Scene *scene, struct Base *base); -void ED_object_apply_obmat(struct Object *ob); /* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */ struct Base *ED_object_add_duplicate(struct Scene *scene, struct Base *base, int dupflag); @@ -82,11 +84,11 @@ void ED_object_enter_editmode(struct bContext *C, int flag); void ED_object_location_from_view(struct bContext *C, float *loc); void ED_object_rotation_from_view(struct bContext *C, float *rot); void ED_object_base_init_transform(struct bContext *C, struct Base *base, float *loc, float *rot); -float ED_object_new_primitive_matrix(struct bContext *C, float *loc, float *rot, float primmat[][4]); +float ED_object_new_primitive_matrix(struct bContext *C, struct Object *editob, float *loc, float *rot, float primmat[][4]); void ED_object_add_generic_props(struct wmOperatorType *ot, int do_editmode); int ED_object_add_generic_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event); -void ED_object_add_generic_get_opts(struct wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer); +int ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer); struct Object *ED_object_add_type(struct bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer); void ED_object_single_users(struct Scene *scene, int full); diff --git a/source/blender/editors/include/ED_physics.h b/source/blender/editors/include/ED_physics.h index 606740d3c61..51906bf41c1 100644 --- a/source/blender/editors/include/ED_physics.h +++ b/source/blender/editors/include/ED_physics.h @@ -35,7 +35,7 @@ struct wmKeyConfig; /* particle_edit.c */ int PE_poll(struct bContext *C); int PE_hair_poll(struct bContext *C); -int PE_poll_3dview(struct bContext *C); +int PE_poll_view3d(struct bContext *C); /* operators */ void ED_operatortypes_physics(void); diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h index a81c562bccb..f34670da471 100644 --- a/source/blender/editors/include/ED_render.h +++ b/source/blender/editors/include/ED_render.h @@ -78,7 +78,10 @@ void ED_preview_free_dbase(void); void ED_preview_shader_job(const struct bContext *C, void *owner, struct ID *id, struct ID *parent, struct MTex *slot, int sizex, int sizey, int method); void ED_preview_icon_job(const struct bContext *C, void *owner, struct ID *id, unsigned int *rect, int sizex, int sizey); +void ED_preview_kill_jobs(const struct bContext *C); void ED_preview_draw(const struct bContext *C, void *idp, void *parentp, void *slot, rcti *rect); +void ED_render_clear_mtex_copybuf(void); + #endif diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index aae354b79fa..3478447b058 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -55,6 +55,7 @@ void ED_region_set(const struct bContext *C, struct ARegion *ar); void ED_region_init(struct bContext *C, struct ARegion *ar); void ED_region_tag_redraw(struct ARegion *ar); void ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct); +void ED_region_tag_redraw_overlay(struct ARegion *ar); void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar); void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, char *context, int contextnr); void ED_region_header_init(struct ARegion *ar); @@ -97,11 +98,12 @@ void ED_screen_set_scene(struct bContext *C, struct Scene *scene); void ED_screen_delete_scene(struct bContext *C, struct Scene *scene); void ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event); void ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen); -void ED_screen_animation_timer(struct bContext *C, int redraws, int sync, int enable); -void ED_screen_animation_timer_update(struct bScreen *screen, int redraws); +void ED_screen_animation_timer(struct bContext *C, int redraws, int refresh, int sync, int enable); +void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh); int ED_screen_full_newspace(struct bContext *C, ScrArea *sa, int type); void ED_screen_full_prevspace(struct bContext *C, ScrArea *sa); void ED_screen_full_restore(struct bContext *C, ScrArea *sa); +struct ScrArea *ED_screen_full_toggle(struct bContext *C, struct wmWindow *win, struct ScrArea *sa); void ED_screen_new_window(struct bContext *C, struct rcti *position, int type); diff --git a/source/blender/editors/include/ED_screen_types.h b/source/blender/editors/include/ED_screen_types.h index 8580dcc33c9..c55dafa6f51 100644 --- a/source/blender/editors/include/ED_screen_types.h +++ b/source/blender/editors/include/ED_screen_types.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -35,6 +35,7 @@ typedef struct ScreenAnimData { ARegion *ar; /* do not read from this, only for comparing if region exists */ short redraws; + short refresh; short flag; /* flags for playback */ int sfra; /* frame that playback was started from */ } ScreenAnimData; diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h index 61267ef1c93..db2013fb411 100644 --- a/source/blender/editors/include/ED_sculpt.h +++ b/source/blender/editors/include/ED_sculpt.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -38,7 +38,7 @@ struct wmWindowManager; /* sculpt.c */ void ED_operatortypes_sculpt(void); void sculpt_get_redraw_planes(float planes[4][4], struct ARegion *ar, - struct RegionView3D *rv3d, struct Object *ob); + struct RegionView3D *rv3d, struct Object *ob); void ED_sculpt_force_update(struct bContext *C); /* paint_ops.c */ diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h index f996956c15d..d99187afce9 100644 --- a/source/blender/editors/include/ED_sequencer.h +++ b/source/blender/editors/include/ED_sequencer.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h index 3529eddd6d9..69a3d1f758a 100644 --- a/source/blender/editors/include/ED_space_api.h +++ b/source/blender/editors/include/ED_space_api.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_text.h b/source/blender/editors/include/ED_text.h index 156d1030063..081e83b1844 100644 --- a/source/blender/editors/include/ED_text.h +++ b/source/blender/editors/include/ED_text.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h index 8267ed022e3..d8954be08c9 100644 --- a/source/blender/editors/include/ED_transform.h +++ b/source/blender/editors/include/ED_transform.h @@ -135,9 +135,15 @@ void BIF_selectOrientation(void); /* to be able to add operator properties to other operators */ -void Properties_Proportional(struct wmOperatorType *ot); -void Properties_Snapping(struct wmOperatorType *ot, short fullsnap, short align); -void Properties_Constraints(struct wmOperatorType *ot); +#define P_MIRROR (1 << 0) +#define P_PROPORTIONAL (1 << 1) +#define P_AXIS (1 << 2) +#define P_SNAP (1 << 3) +#define P_GEO_SNAP (P_SNAP|(1 << 4)) +#define P_ALIGN_SNAP (P_GEO_SNAP|(1 << 5)) +#define P_CONSTRAINT (1 << 6) + +void Transform_Properties(struct wmOperatorType *ot, int flags); /* view3d manipulators */ diff --git a/source/blender/editors/include/ED_types.h b/source/blender/editors/include/ED_types.h index 92de24fa33e..96a5d5857fa 100644 --- a/source/blender/editors/include/ED_types.h +++ b/source/blender/editors/include/ED_types.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h index d517d05e9b0..96ad1989497 100644 --- a/source/blender/editors/include/ED_util.h +++ b/source/blender/editors/include/ED_util.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -37,6 +37,7 @@ struct wmOperatorType; /* ed_util.c */ +void ED_editors_init (struct bContext *C); void ED_editors_exit (struct bContext *C); /* ************** Undo ************************ */ diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h index da05353e82d..65ead416971 100644 --- a/source/blender/editors/include/ED_uvedit.h +++ b/source/blender/editors/include/ED_uvedit.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 50d557c36fc..ae670350a56 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,28 +30,33 @@ /* ********* exports for space_view3d/ module ********** */ struct ARegion; -struct BoundBox; -struct View3D; -struct RegionView3D; -struct ViewContext; +struct bContext; +struct BezTriple; struct bglMats; +struct BoundBox; struct BPoint; struct Nurb; struct BezTriple; struct BMVert; struct BMEdge; struct BMFace; +struct EditVert; struct ImBuf; -struct Scene; -struct bContext; struct Main; +struct Nurb; +struct Object; struct rcti; +struct RegionView3D; +struct Scene; +struct View3D; +struct ViewContext; + /* for derivedmesh drawing callbacks, for view3d_select, .... */ typedef struct ViewContext { Scene *scene; - Object *obact; - Object *obedit; + struct Object *obact; + struct Object *obedit; struct ARegion *ar; struct View3D *v3d; struct RegionView3D *rv3d; @@ -98,6 +103,7 @@ void viewvector(struct RegionView3D *rv3d, float coord[3], float vec[3]); void viewline(struct ARegion *ar, struct View3D *v3d, float mval[2], float ray_start[3], float ray_end[3]); void viewray(struct ARegion *ar, struct View3D *v3d, float mval[2], float ray_start[3], float ray_normal[3]); +int get_view3d_cliprange(struct View3D *v3d, struct RegionView3D *rv3d, float *clipsta, float *clipend); int get_view3d_viewplane(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize); int get_view3d_ortho(struct View3D *v3d, struct RegionView3D *rv3d); void view3d_get_object_project_mat(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]); @@ -150,13 +156,15 @@ struct RegionView3D *ED_view3d_context_rv3d(struct bContext *C); void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d); -void ED_view3d_scene_layers_update(struct Main *bmain, struct Scene *scene); -int ED_view3d_scene_layer_set(int lay, const int *values); +int ED_view3d_scene_layer_set(int lay, const int *values, int *active); int ED_view3d_context_activate(struct bContext *C); void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int winx, int winy, float viewmat[][4], float winmat[][4]); +struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey); +struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, int drawtype); + void view3d_clipping_local(struct RegionView3D *rv3d, float mat[][4]); Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval); diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index 7b84c7054b0..fd459def112 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -107,7 +107,7 @@ DEF_ICON(ICON_NEW) DEF_ICON(ICON_FILE_TICK) DEF_ICON(ICON_QUIT) DEF_ICON(ICON_URL) -DEF_ICON(ICON_BLANK037) +DEF_ICON(ICON_RECOVER_LAST) DEF_ICON(ICON_BLANK038) DEF_ICON(ICON_FULLSCREEN_ENTER) DEF_ICON(ICON_FULLSCREEN_EXIT) @@ -540,7 +540,7 @@ DEF_ICON(ICON_MOD_FLUIDSIM) DEF_ICON(ICON_MOD_MULTIRES) DEF_ICON(ICON_MOD_SMOKE) DEF_ICON(ICON_MOD_SOLIDIFY) -DEF_ICON(ICON_BLANK159) +DEF_ICON(ICON_MOD_SCREW) DEF_ICON(ICON_BLANK160) DEF_ICON(ICON_BLANK161) DEF_ICON(ICON_BLANK162) @@ -571,7 +571,7 @@ DEF_ICON(ICON_PREV_KEYFRAME) DEF_ICON(ICON_NEXT_KEYFRAME) DEF_ICON(ICON_PLAY_AUDIO) DEF_ICON(ICON_PLAY_REVERSE) -DEF_ICON(ICON_BLANK179) +DEF_ICON(ICON_PREVIEW_RANGE) DEF_ICON(ICON_BLANK180) DEF_ICON(ICON_PMARKER_ACT) DEF_ICON(ICON_PMARKER_SEL) @@ -682,7 +682,7 @@ DEF_ICON(ICON_BLANK227) DEF_ICON(ICON_BLANK228) DEF_ICON(ICON_BLANK229) DEF_ICON(ICON_BLANK230) -DEF_ICON(ICON_BLANK231) +DEF_ICON(ICON_SNAP_SURFACE) DEF_ICON(ICON_BLANK232) DEF_ICON(ICON_BLANK233) DEF_ICON(ICON_RETOPO) @@ -847,7 +847,7 @@ DEF_ICON(ICON_SEQ_PREVIEW) DEF_ICON(ICON_SEQ_LUMA_WAVEFORM) DEF_ICON(ICON_SEQ_CHROMA_SCOPE) DEF_ICON(ICON_SEQ_HISTOGRAM) -DEF_ICON(ICON_BLANK330) +DEF_ICON(ICON_SEQ_SPLITVIEW) DEF_ICON(ICON_BLANK331) DEF_ICON(ICON_BLANK332) DEF_ICON(ICON_BLANK333) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 5c6ac272c53..4b6b396483d 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -142,7 +142,7 @@ typedef struct uiLayout uiLayout; #define UI_BUT_ALIGN_DOWN (1<<17) #define UI_BUT_DISABLED (1<<18) -#define UI_BUT_UNUSED (1<<19) +#define UI_BUT_COLOR_LOCK (1<<19) #define UI_BUT_ANIMATED (1<<20) #define UI_BUT_ANIMATED_KEY (1<<21) #define UI_BUT_DRIVEN (1<<22) @@ -152,6 +152,9 @@ typedef struct uiLayout uiLayout; #define UI_BUT_IMMEDIATE (1<<26) #define UI_BUT_NO_TOOLTIP (1<<27) +#define UI_BUT_VEC_SIZE_LOCK (1<<28) /* used to flag if color hsv-circle should keep luminance */ +#define UI_BUT_COLOR_CUBIC (1<<29) /* cubic saturation for the color wheel */ + #define UI_PANEL_WIDTH 340 #define UI_COMPACT_PANEL_WIDTH 160 @@ -218,6 +221,9 @@ typedef struct uiLayout uiLayout; #define HOTKEYEVT (45<<9) #define BUT_IMAGE (46<<9) #define HISTOGRAM (47<<9) +#define WAVEFORM (48<<9) +#define VECTORSCOPE (49<<9) +#define PROGRESSBAR (50<<9) #define BUTTYPE (63<<9) @@ -245,8 +251,9 @@ void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag, s void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, float maxy); /* state for scrolldrawing */ -#define UI_SCROLL_PRESSED 1 -#define UI_SCROLL_ARROWS 2 +#define UI_SCROLL_PRESSED 1 +#define UI_SCROLL_ARROWS 2 +#define UI_SCROLL_NO_OUTLINE 4 void uiWidgetScrollDraw(struct uiWidgetColors *wcol, struct rcti *rect, struct rcti *slider, int state); /* Menu Callbacks */ @@ -662,63 +669,65 @@ uiBlock *uiLayoutAbsoluteBlock(uiLayout *layout); void uiTemplateHeader(uiLayout *layout, struct bContext *C, int menus); void uiTemplateDopeSheetFilter(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr); void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, - char *newop, char *openop, char *unlinkop); + char *newop, char *openop, char *unlinkop, char *filterop); void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, - char *newop, char *openop, char *unlinkop); + char *newop, char *openop, char *unlinkop, char *filterop); void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, - char *newop, char *openop, char *unlinkop, int rows, int cols); + char *newop, char *openop, char *unlinkop, char *filterop, int rows, int cols); void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *proptypename, char *text); void uiTemplatePathBuilder(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *root_ptr, char *text); uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, int compact); -uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr); +uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr, int compact); void uiTemplatePreview(uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot); void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand); void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand); +void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand); +void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand); void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, char *propname, int type, int levels, int brush); -void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, char *propname, int value_slider, int lock); +void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic); void uiTemplateTriColorSet(uiLayout *layout, struct PointerRNA *ptr, char *propname); void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname, - PointerRNA *used_ptr, char *used_propname, int active_layer); + PointerRNA *used_ptr, char *used_propname, int active_layer); void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *userptr, int compact); void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser); void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C); void uiTemplateOperatorSearch(uiLayout *layout); void uiTemplateHeader3D(uiLayout *layout, struct bContext *C); void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex *tex); -void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C, struct wmOperator *op); +void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C); void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, int maxrows, int type); /* items */ void uiItemO(uiLayout *layout, char *name, int icon, char *opname); -void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value); +void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value); void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value); void uiItemsEnumO(uiLayout *layout, char *opname, char *propname); void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value); void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value); void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value); void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value); -PointerRNA uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context, int flag); +PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, struct IDProperty *properties, int context, int flag); -void uiItemR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int flag); -void uiItemFullR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag); +void uiItemR(uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, char *name, int icon); +void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, char *name, int icon); void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value); -void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value); +void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon); void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname); -void uiItemPointerR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname); +void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon); void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, struct IDProperty *properties, int context, int flag); void uiItemL(uiLayout *layout, char *name, int icon); /* label */ void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, char *name, int icon); /* label icon for dragging */ -void uiItemM(uiLayout *layout, struct bContext *C, char *name, int icon, char *menuname); /* menu */ +void uiItemM(uiLayout *layout, struct bContext *C, char *menuname, char *name, int icon); /* menu */ void uiItemV(uiLayout *layout, char *name, int icon, int argval); /* value */ void uiItemS(uiLayout *layout); /* separator */ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg); -void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname); -void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname); +void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon); +void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon); /* UI Operators */ void UI_buttons_operatortypes(void); diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index 9ec64155b43..3b76520c4bf 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -49,12 +49,12 @@ typedef enum { typedef enum { #define BIFCOLORSHADE_FIRST (COLORSHADE_DARK) - COLORSHADE_DARK, - COLORSHADE_GREY, - COLORSHADE_MEDIUM, - COLORSHADE_HILITE, - COLORSHADE_LIGHT, - COLORSHADE_WHITE + COLORSHADE_DARK, + COLORSHADE_GREY, + COLORSHADE_MEDIUM, + COLORSHADE_HILITE, + COLORSHADE_LIGHT, + COLORSHADE_WHITE #define BIFCOLORSHADE_LAST (COLORSHADE_WHITE) #define BIFNCOLORSHADES (BIFCOLORSHADE_LAST-BIFCOLORSHADE_FIRST + 1) } BIFColorShade; @@ -164,6 +164,23 @@ enum { TH_FACE_DOT, TH_FACEDOT_SIZE, TH_CFRAME, + TH_NURB_ULINE, + TH_NURB_VLINE, + TH_NURB_SEL_ULINE, + TH_NURB_SEL_VLINE, + + /* this eight colors should be in one block */ + TH_HANDLE_FREE, + TH_HANDLE_AUTO, + TH_HANDLE_VECT, + TH_HANDLE_ALIGN, + TH_HANDLE_SEL_FREE, + TH_HANDLE_SEL_AUTO, + TH_HANDLE_SEL_VECT, + TH_HANDLE_SEL_ALIGN, + + TH_ACTIVE_SPLINE, + TH_LASTSEL_POINT, TH_SYNTAX_B, TH_SYNTAX_V, @@ -214,6 +231,8 @@ enum { TH_PIN_OPAC, TH_PREVIEW_BACK, + + TH_EDGE_CREASE, }; /* XXX WARNING: previous is saved in file, so do not change order! */ @@ -264,6 +283,9 @@ void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset); // get a 3 byte color, blended and shaded between two other char color pointers void UI_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, int offset); +// clear the openGL ClearColor using the input colorid +void UI_ThemeClearColor(int colorid); + // internal (blender) usage only, for init and set active void UI_SetTheme(int spacetype, int regionid); diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h index 38c2780608f..bf4a3de9cc6 100644 --- a/source/blender/editors/include/UI_view2d.h +++ b/source/blender/editors/include/UI_view2d.h @@ -164,6 +164,7 @@ void UI_view2d_view_restore(const struct bContext *C); View2DGrid *UI_view2d_grid_calc(const struct bContext *C, struct View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy); void UI_view2d_grid_draw(const struct bContext *C, struct View2D *v2d, View2DGrid *grid, int flag); void UI_view2d_constant_grid_draw(const struct bContext *C, struct View2D *v2d); +void UI_view2d_grid_size(View2DGrid *grid, float *r_dx, float *r_dy); void UI_view2d_grid_free(View2DGrid *grid); /* scrollbar drawing */ diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt new file mode 100644 index 00000000000..4b4590aeee5 --- /dev/null +++ b/source/blender/editors/interface/CMakeLists.txt @@ -0,0 +1,46 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenfont + ../../blenkernel + ../../blenlib + ../../gpu + ../../imbuf + ../../makesdna + ../../makesrna + ../../python + ../../windowmanager + ../../../../intern/guardedalloc +) + +IF(WITH_INTERNATIONAL) + ADD_DEFINITIONS(-DINTERNATIONAL) +ENDIF(WITH_INTERNATIONAL) + +IF(NOT WITH_PYTHON) + ADD_DEFINITIONS(-DDISABLE_PYTHON) +ENDIF(NOT WITH_PYTHON) + +BLENDERLIB(bf_editor_interface "${SRC}" "${INC}") diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index ea7e89f5102..3f0cd3bee78 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -32,11 +32,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" -#include "DNA_listBase.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_texture_types.h" #include "DNA_userdef_types.h" #include "BLI_math.h" @@ -58,7 +55,6 @@ #include "UI_interface.h" -#include "ED_screen.h" #include "WM_api.h" #include "WM_types.h" @@ -66,7 +62,6 @@ #include "wm_window.h" #include "RNA_access.h" -#include "RNA_types.h" #include "BPY_extern.h" @@ -235,7 +230,7 @@ static void ui_text_bounds_block(uiBlock *block, float offset) //int transopts= ui_translate_buttons(); //if(bt->type==TEX || bt->type==IDPOIN) transopts= 0; - j= BLF_width(bt->drawstr); + j= BLF_width(style->widget.uifont_id, bt->drawstr); if(j > i) i = j; } @@ -289,7 +284,7 @@ void ui_bounds_block(uiBlock *block) if(bt->x1 < block->minx) block->minx= bt->x1; if(bt->y1 < block->miny) block->miny= bt->y1; - if(bt->x2 > block->maxx) block->maxx= bt->x2; + if(bt->x2 > block->maxx) block->maxx= bt->x2; if(bt->y2 > block->maxy) block->maxy= bt->y2; bt= bt->next; @@ -373,9 +368,9 @@ static void ui_popup_bounds_block(const bContext *C, uiBlock *block, int bounds_ width= block->maxx - block->minx; height= block->maxy - block->miny; - /* avoid divide by zero below, caused by calling with no UI, but better not crash */ - oldwidth= oldwidth > 0 ? oldwidth : MAX2(1, width); - oldheight= oldheight > 0 ? oldheight : MAX2(1, height); + /* avoid divide by zero below, caused by calling with no UI, but better not crash */ + oldwidth= oldwidth > 0 ? oldwidth : MAX2(1, width); + oldheight= oldheight > 0 ? oldheight : MAX2(1, height); /* offset block based on mouse position, user offset is scaled along in case we resized the block in ui_text_bounds_block */ @@ -648,10 +643,6 @@ void uiEndBlock(const bContext *C, uiBlock *block) CTX_store_set((bContext*)C, NULL); } - /* only update soft range while not editing */ - if(but->rnaprop && !(but->editval || but->editstr || but->editvec)) - ui_set_but_soft_range(but, ui_get_but_val(but)); - ui_but_anim_flag(but, (scene)? scene->r.cfra: 0.0f); } @@ -1189,12 +1180,12 @@ void ui_get_but_vectorf(uiBut *but, float *vec) float *fp= (float *)but->poin; VECCOPY(vec, fp); } - else { - if (but->editvec==NULL) { - fprintf(stderr, "ui_get_but_vectorf: can't get color, should never happen\n"); - vec[0]= vec[1]= vec[2]= 0.0f; - } - } + else { + if (but->editvec==NULL) { + fprintf(stderr, "ui_get_but_vectorf: can't get color, should never happen\n"); + vec[0]= vec[1]= vec[2]= 0.0f; + } + } } /* for buttons pointing to color for example */ @@ -1603,7 +1594,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str) } else if(but->type == IDPOIN) { /* ID pointer */ - but->idpoin_func(C, (char*)str, but->idpoin_idpp); + but->idpoin_func(C, (char*)str, but->idpoin_idpp); return 1; } else if(but->type == TEX) { @@ -1642,7 +1633,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str) bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type); } - if(BPY_button_eval(C, str_unit_convert, &value)) { + if(BPY_eval_button(C, str_unit_convert, &value)) { value = ui_get_but_val(but); /* use its original value */ if(str[0]) @@ -1940,6 +1931,10 @@ void ui_check_but(uiBut *but) // if(but->type==TEX || but->type==IDPOIN) transopts= 0; + /* only update soft range while not editing */ + if(but->rnaprop && !(but->editval || but->editstr || but->editvec)) + ui_set_but_soft_range(but, ui_get_but_val(but)); + /* test for min and max, icon sliders, etc */ switch( but->type ) { case NUM: @@ -2308,7 +2303,7 @@ ui_def_but is the function that draws many button types for float buttons: "a1" Click Step (how much to change the value each click) "a2" Number of decimal point values to display. 0 defaults to 3 (0.000) 1,2,3, and a maximum of 4, - all greater values will be clamped to 4. + all greater values will be clamped to 4. */ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip) @@ -2381,7 +2376,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short } } - if((block->flag & UI_BLOCK_LOOP) || ELEM7(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU)) + if((block->flag & UI_BLOCK_LOOP) || ELEM8(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU, PROGRESSBAR)) but->flag |= (UI_TEXT_LEFT|UI_ICON_LEFT); else if(but->type==BUT_TOGDUAL) but->flag |= UI_ICON_LEFT; @@ -2698,7 +2693,7 @@ void autocomplete_end(AutoComplete *autocpl, char *autoname) static void autocomplete_id(bContext *C, char *str, void *arg_v) { int blocktype= (intptr_t)arg_v; - ListBase *listb= wich_libbase(CTX_data_main(C), blocktype); + ListBase *listb= which_libbase(CTX_data_main(C), blocktype); if(listb==NULL) return; @@ -3332,9 +3327,6 @@ void UI_init_userdef(void) { /* fix saved themes */ init_userdef_do_versions(); - /* set default colors in default theme */ - ui_theme_init_userdef(); - uiStyleInit(); } diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 6a7f2b2fcb7..4108e1c8532 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -16,8 +16,6 @@ #include "BKE_context.h" #include "BKE_fcurve.h" -#include "RNA_access.h" -#include "RNA_types.h" #include "ED_keyframing.h" @@ -113,7 +111,7 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra) fcu->flag &= ~FCURVE_SELECTED; insert_keyframe(id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag); - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } } } diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index aaf9ba6e214..0dd333dc387 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -29,15 +29,13 @@ #include #include "DNA_color_types.h" -#include "DNA_listBase.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" #include "BLI_math.h" #include "BKE_colortools.h" +#include "BKE_global.h" #include "BKE_texture.h" #include "BKE_utildefines.h" @@ -47,8 +45,9 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "BLF_api.h" + #include "UI_interface.h" -#include "UI_interface_icons.h" #include "interface_intern.h" @@ -81,7 +80,7 @@ int uiGetRoundBox(void) void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad) { float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293}, - {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; + {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; int a; /* mult */ @@ -151,7 +150,7 @@ static void round_box_shade_col(float *col1, float *col2, float fac) void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown) { float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293}, - {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; + {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; float div= maxy-miny; float coltop[3], coldown[3], color[4]; int a; @@ -258,7 +257,7 @@ void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy void gl_round_box_vertical_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight) { float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293}, - {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; + {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; float div= maxx-minx; float colLeft[3], colRight[3], color[4]; int a; @@ -470,7 +469,7 @@ void ui_draw_but_IMAGE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect //int w, h; /* hardcoded to splash, loading and freeing every draw, eek! */ - ibuf= IMB_ibImageFromMemory((int *)datatoc_splash_png, datatoc_splash_png_size, IB_rect); + ibuf= IMB_ibImageFromMemory((unsigned char*)datatoc_splash_png, datatoc_splash_png_size, IB_rect); if (!ibuf) return; @@ -565,7 +564,7 @@ static void ui_draw_but_CHARTAB(uiBut *but) int err; strcpy(tmpStr, G.selfont->name); - BLI_convertstringcode(tmpStr, G.sce); + BLI_path_abs(tmpStr, G.sce); err = FTF_SetFont((unsigned char *)tmpStr, 0, 14.0); } } @@ -689,6 +688,64 @@ static void ui_draw_but_CHARTAB(uiBut *but) #endif // INTERNATIONAL #endif +static void draw_scope_end(rctf *rect, GLint *scissor) +{ + float scaler_x1, scaler_x2; + + /* restore scissortest */ + glScissor(scissor[0], scissor[1], scissor[2], scissor[3]); + + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + /* scale widget */ + scaler_x1 = rect->xmin + (rect->xmax - rect->xmin)/2 - SCOPE_RESIZE_PAD; + scaler_x2 = rect->xmin + (rect->xmax - rect->xmin)/2 + SCOPE_RESIZE_PAD; + + glColor4f(0.f, 0.f, 0.f, 0.25f); + fdrawline(scaler_x1, rect->ymin-4, scaler_x2, rect->ymin-4); + fdrawline(scaler_x1, rect->ymin-7, scaler_x2, rect->ymin-7); + glColor4f(1.f, 1.f, 1.f, 0.25f); + fdrawline(scaler_x1, rect->ymin-5, scaler_x2, rect->ymin-5); + fdrawline(scaler_x1, rect->ymin-8, scaler_x2, rect->ymin-8); + + /* outline */ + glColor4f(0.f, 0.f, 0.f, 0.5f); + uiSetRoundBox(15); + gl_round_box(GL_LINE_LOOP, rect->xmin-1, rect->ymin, rect->xmax+1, rect->ymax+1, 3.0f); +} + +void histogram_draw_one(float r, float g, float b, float alpha, float x, float y, float w, float h, float *data, int res) +{ + int i; + + /* under the curve */ + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glColor4f(r, g, b, alpha); + + glShadeModel(GL_FLAT); + glBegin(GL_QUAD_STRIP); + glVertex2f(x, y); + glVertex2f(x, y + (data[0]*h)); + for (i=1; i < res; i++) { + float x2 = x + i * (w/(float)res); + glVertex2f(x2, y + (data[i]*h)); + glVertex2f(x2, y); + } + glEnd(); + + /* curve outline */ + glColor4f(0.f, 0.f, 0.f, 0.25f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + glBegin(GL_LINE_STRIP); + for (i=0; i < res; i++) { + float x2 = x + i * (w/(float)res); + glVertex2f(x2, y + (data[i]*h)); + } + glEnd(); + glDisable(GL_LINE_SMOOTH); +} void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti) { @@ -696,21 +753,19 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti * int res = hist->x_resolution; rctf rect; int i; - int rgb; float w, h; - float alpha; + //float alpha; GLint scissor[4]; if (hist==NULL) { printf("hist is null \n"); return; } - rect.xmin = (float)recti->xmin; - rect.xmax = (float)recti->xmax; - rect.ymin = (float)recti->ymin; - rect.ymax = (float)recti->ymax; + rect.xmin = (float)recti->xmin+1; + rect.xmax = (float)recti->xmax-1; + rect.ymin = (float)recti->ymin+SCOPE_RESIZE_PAD+2; + rect.ymax = (float)recti->ymax-1; w = rect.xmax - rect.xmin; - h = rect.ymax - rect.ymin; - h *= hist->ymax; + h = (rect.ymax - rect.ymin) * hist->ymax; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); @@ -729,55 +784,326 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti * /* need scissor test, histogram can draw outside of boundary */ glGetIntegerv(GL_VIEWPORT, scissor); glScissor(ar->winrct.xmin + (rect.xmin-1), ar->winrct.ymin+(rect.ymin-1), (rect.xmax+1)-(rect.xmin-1), (rect.ymax+1)-(rect.ymin-1)); - - for (rgb=0; rgb<3; rgb++) { - float *data = NULL; - - if (rgb==0) data = hist->data_r; - else if (rgb==1) data = hist->data_g; - else if (rgb==2) data = hist->data_b; - - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - alpha = 0.75; - if (rgb==0) glColor4f(1.f, 0.f, 0.f, alpha); - else if (rgb==1) glColor4f(0.f, 1.f, 0.f, alpha); - else if (rgb==2) glColor4f(0.f, 0.f, 1.f, alpha); - - glShadeModel(GL_FLAT); - glBegin(GL_QUAD_STRIP); - glVertex2f(rect.xmin, rect.ymin); - glVertex2f(rect.xmin, rect.ymin + (data[0]*h)); - for (i=1; i < res; i++) { - float x = rect.xmin + i * (w/(float)res); - glVertex2f(x, rect.ymin + (data[i]*h)); - glVertex2f(x, rect.ymin); - } - glEnd(); - - glColor4f(0.f, 0.f, 0.f, 0.25f); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_LINE_SMOOTH); - glBegin(GL_LINE_STRIP); - for (i=0; i < res; i++) { - float x = rect.xmin + i * (w/(float)res); - glVertex2f(x, rect.ymin + (data[i]*h)); - } - glEnd(); - glDisable(GL_LINE_SMOOTH); + + if (hist->mode == HISTO_MODE_LUMA) + histogram_draw_one(1.0, 1.0, 1.0, 0.75, rect.xmin, rect.ymin, w, h, hist->data_luma, res); + else { + if (hist->mode == HISTO_MODE_RGB || hist->mode == HISTO_MODE_R) + histogram_draw_one(1.0, 0.0, 0.0, 0.75, rect.xmin, rect.ymin, w, h, hist->data_r, res); + if (hist->mode == HISTO_MODE_RGB || hist->mode == HISTO_MODE_G) + histogram_draw_one(0.0, 1.0, 0.0, 0.75, rect.xmin, rect.ymin, w, h, hist->data_g, res); + if (hist->mode == HISTO_MODE_RGB || hist->mode == HISTO_MODE_B) + histogram_draw_one(0.0, 0.0, 1.0, 0.75, rect.xmin, rect.ymin, w, h, hist->data_b, res); } - /* restore scissortest */ - glScissor(scissor[0], scissor[1], scissor[2], scissor[3]); - - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glColor4f(0.f, 0.f, 0.f, 0.5f); - uiSetRoundBox(15); - gl_round_box(GL_LINE_LOOP, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f); - - glDisable(GL_BLEND); + /* outline, scale gripper */ + draw_scope_end(&rect, scissor); } +void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti) +{ + Scopes *scopes = (Scopes *)but->poin; + rctf rect; + int i, c; + float w, w3, h, alpha, yofs; + GLint scissor[4]; + float colors[3][3] = {{1,0,0},{0,1,0},{0,0,1}}; + float colorsycc[3][3] = {{1,0,1},{1,1,0},{0,1,1}}; + float colors_alpha[3][3], colorsycc_alpha[3][3]; /* colors pre multiplied by alpha for speed up */ + float min, max; + + if (scopes==NULL) return; + + rect.xmin = (float)recti->xmin+1; + rect.xmax = (float)recti->xmax-1; + rect.ymin = (float)recti->ymin+SCOPE_RESIZE_PAD+2; + rect.ymax = (float)recti->ymax-1; + + if (scopes->wavefrm_yfac < 0.5f ) + scopes->wavefrm_yfac =0.98f; + w = rect.xmax - rect.xmin-7; + h = (rect.ymax - rect.ymin)*scopes->wavefrm_yfac; + yofs= rect.ymin + (rect.ymax - rect.ymin -h)/2.0f; + w3=w/3.0f; + + /* log scale for alpha */ + alpha = scopes->wavefrm_alpha*scopes->wavefrm_alpha; + + for(c=0; c<3; c++) { + for(i=0; i<3; i++) { + colors_alpha[c][i] = colors[c][i] * alpha; + colorsycc_alpha[c][i] = colorsycc[c][i] * alpha; + } + } + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + glColor4f(0.f, 0.f, 0.f, 0.3f); + uiSetRoundBox(15); + gl_round_box(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f); + + + /* need scissor test, waveform can draw outside of boundary */ + glGetIntegerv(GL_VIEWPORT, scissor); + glScissor(ar->winrct.xmin + (rect.xmin-1), ar->winrct.ymin+(rect.ymin-1), (rect.xmax+1)-(rect.xmin-1), (rect.ymax+1)-(rect.ymin-1)); + + glColor4f(1.f, 1.f, 1.f, 0.08f); + /* draw grid lines here */ + for (i=0; i<6; i++) { + char str[4]; + sprintf(str,"%-3d",i*20); + str[3]='\0'; + fdrawline(rect.xmin+22, yofs+(i/5.f)*h, rect.xmax+1, yofs+(i/5.f)*h); + BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str); + /* in the loop because blf_draw reset it */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + } + /* 3 vertical separation */ + if (scopes->wavefrm_mode!= SCOPES_WAVEFRM_LUMA) { + for (i=1; i<3; i++) { + fdrawline(rect.xmin+i*w3, rect.ymin, rect.xmin+i*w3, rect.ymax); + } + } + + /* separate min max zone on the right */ + fdrawline(rect.xmin+w, rect.ymin, rect.xmin+w, rect.ymax); + /* 16-235-240 level in case of ITU-R BT601/709 */ + glColor4f(1.f, 0.4f, 0.f, 0.2f); + if (ELEM(scopes->wavefrm_mode, SCOPES_WAVEFRM_YCC_601, SCOPES_WAVEFRM_YCC_709)){ + fdrawline(rect.xmin+22, yofs+h*16.0f/255.0f, rect.xmax+1, yofs+h*16.0f/255.0f); + fdrawline(rect.xmin+22, yofs+h*235.0f/255.0f, rect.xmin+w3, yofs+h*235.0f/255.0f); + fdrawline(rect.xmin+3*w3, yofs+h*235.0f/255.0f, rect.xmax+1, yofs+h*235.0f/255.0f); + fdrawline(rect.xmin+w3, yofs+h*240.0f/255.0f, rect.xmax+1, yofs+h*240.0f/255.0f); + } + /* 7.5 IRE black point level for NTSC */ + if (scopes->wavefrm_mode== SCOPES_WAVEFRM_LUMA) + fdrawline(rect.xmin, yofs+h*0.075f, rect.xmax+1, yofs+h*0.075f); + + if (scopes->ok && scopes->waveform_1 != NULL) { + + /* LUMA (1 channel) */ + glBlendFunc(GL_ONE,GL_ONE); + glColor3f(alpha, alpha, alpha); + if (scopes->wavefrm_mode == SCOPES_WAVEFRM_LUMA){ + + glBlendFunc(GL_ONE,GL_ONE); + + glPushMatrix(); + glEnableClientState(GL_VERTEX_ARRAY); + + glTranslatef(rect.xmin, yofs, 0.f); + glScalef(w, h, 0.f); + glVertexPointer(2, GL_FLOAT, 0, scopes->waveform_1); + glDrawArrays(GL_POINTS, 0, scopes->waveform_tot); + + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + + /* min max */ + glColor3f(.5f, .5f, .5f); + min= yofs+scopes->minmax[0][0]*h; + max= yofs+scopes->minmax[0][1]*h; + CLAMP(min, rect.ymin, rect.ymax); + CLAMP(max, rect.ymin, rect.ymax); + fdrawline(rect.xmax-3,min,rect.xmax-3,max); + } + + /* RGB / YCC (3 channels) */ + else if (ELEM4(scopes->wavefrm_mode, SCOPES_WAVEFRM_RGB, SCOPES_WAVEFRM_YCC_601, SCOPES_WAVEFRM_YCC_709, SCOPES_WAVEFRM_YCC_JPEG)) { + int rgb = (scopes->wavefrm_mode == SCOPES_WAVEFRM_RGB); + + glBlendFunc(GL_ONE,GL_ONE); + + glPushMatrix(); + glEnableClientState(GL_VERTEX_ARRAY); + + glTranslatef(rect.xmin, yofs, 0.f); + glScalef(w3, h, 0.f); + + glColor3fv((rgb)?colors_alpha[0]:colorsycc_alpha[0]); + glVertexPointer(2, GL_FLOAT, 0, scopes->waveform_1); + glDrawArrays(GL_POINTS, 0, scopes->waveform_tot); + + glTranslatef(1.f, 0.f, 0.f); + glColor3fv((rgb)?colors_alpha[1]:colorsycc_alpha[1]); + glVertexPointer(2, GL_FLOAT, 0, scopes->waveform_2); + glDrawArrays(GL_POINTS, 0, scopes->waveform_tot); + + glTranslatef(1.f, 0.f, 0.f); + glColor3fv((rgb)?colors_alpha[2]:colorsycc_alpha[2]); + glVertexPointer(2, GL_FLOAT, 0, scopes->waveform_3); + glDrawArrays(GL_POINTS, 0, scopes->waveform_tot); + + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + + + /* min max */ + for (c=0; c<3; c++) { + if (scopes->wavefrm_mode == SCOPES_WAVEFRM_RGB) + glColor3f(colors[c][0]*0.75, colors[c][1]*0.75, colors[c][2]*0.75); + else + glColor3f(colorsycc[c][0]*0.75, colorsycc[c][1]*0.75, colorsycc[c][2]*0.75); + min= yofs+scopes->minmax[c][0]*h; + max= yofs+scopes->minmax[c][1]*h; + CLAMP(min, rect.ymin, rect.ymax); + CLAMP(max, rect.ymin, rect.ymax); + fdrawline(rect.xmin+w+2+c*2,min,rect.xmin+w+2+c*2,max); + } + } + + } + + /* outline, scale gripper */ + draw_scope_end(&rect, scissor); +} + +float polar_to_x(float center, float diam, float ampli, float angle) +{ + return center + diam * ampli * cosf(angle); +} + +float polar_to_y(float center, float diam, float ampli, float angle) +{ + return center + diam * ampli * sinf(angle); +} + +void vectorscope_draw_target(float centerx, float centery, float diam, float r, float g, float b) +{ + float y,u,v; + float tangle=0.f, tampli; + float dangle, dampli, dangle2, dampli2; + + rgb_to_yuv(r,g,b, &y, &u, &v); + if (u>0 && v>=0) tangle=atanf(v/u); + else if (u>0 && v<0) tangle=atanf(v/u)+2*M_PI; + else if (u<0) tangle=atanf(v/u)+M_PI; + else if (u==0 && v>0) tangle=M_PI/2.0f; + else if (u==0 && v<0) tangle=-M_PI/2.0f; + tampli= sqrtf(u*u+v*v); + + /* small target vary by 2.5 degree and 2.5 IRE unit */ + glColor4f(1.0f, 1.0f, 1.0, 0.12f); + dangle= 2.5*M_PI/180.0f; + dampli= 2.5f/200.0f; + glBegin(GL_LINE_STRIP); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle+dangle), polar_to_y(centery,diam,tampli+dampli,tangle+dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli,tangle+dangle), polar_to_y(centery,diam,tampli-dampli,tangle+dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli,tangle-dangle), polar_to_y(centery,diam,tampli-dampli,tangle-dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle-dangle), polar_to_y(centery,diam,tampli+dampli,tangle-dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle+dangle), polar_to_y(centery,diam,tampli+dampli,tangle+dangle)); + glEnd(); + /* big target vary by 10 degree and 20% amplitude */ + glColor4f(1.0f, 1.0f, 1.0, 0.12f); + dangle= 10*M_PI/180.0f; + dampli= 0.2*tampli; + dangle2= 5.0f*M_PI/180.0f; + dampli2= 0.5f*dampli; + glBegin(GL_LINE_STRIP); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli-dampli2,tangle+dangle), polar_to_y(centery,diam,tampli+dampli-dampli2,tangle+dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle+dangle), polar_to_y(centery,diam,tampli+dampli,tangle+dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle+dangle-dangle2), polar_to_y(centery,diam,tampli+dampli,tangle+dangle-dangle2)); + glEnd(); + glBegin(GL_LINE_STRIP); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli+dampli2,tangle+dangle), polar_to_y(centery ,diam,tampli-dampli+dampli2,tangle+dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli,tangle+dangle), polar_to_y(centery,diam,tampli-dampli,tangle+dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli,tangle+dangle-dangle2), polar_to_y(centery,diam,tampli-dampli,tangle+dangle-dangle2)); + glEnd(); + glBegin(GL_LINE_STRIP); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli+dampli2,tangle-dangle), polar_to_y(centery,diam,tampli-dampli+dampli2,tangle-dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli,tangle-dangle), polar_to_y(centery,diam,tampli-dampli,tangle-dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli-dampli,tangle-dangle+dangle2), polar_to_y(centery,diam,tampli-dampli,tangle-dangle+dangle2)); + glEnd(); + glBegin(GL_LINE_STRIP); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli-dampli2,tangle-dangle), polar_to_y(centery,diam,tampli+dampli-dampli2,tangle-dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle-dangle), polar_to_y(centery,diam,tampli+dampli,tangle-dangle)); + glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle-dangle+dangle2), polar_to_y(centery,diam,tampli+dampli,tangle-dangle+dangle2)); + glEnd(); +} + +void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti) +{ + Scopes *scopes = (Scopes *)but->poin; + rctf rect; + int i, j; + int skina= 123; /* angle in degree of the skin tone line */ + float w, h, centerx, centery, diam; + float alpha; + float colors[6][3]={{.75,0,0},{.75,.75,0},{0,.75,0},{0,.75,.75},{0,0,.75},{.75,0,.75}}; + GLint scissor[4]; + + rect.xmin = (float)recti->xmin+1; + rect.xmax = (float)recti->xmax-1; + rect.ymin = (float)recti->ymin+SCOPE_RESIZE_PAD+2; + rect.ymax = (float)recti->ymax-1; + + w = rect.xmax - rect.xmin; + h = rect.ymax - rect.ymin; + centerx = rect.xmin + w/2; + centery = rect.ymin + h/2; + diam= (wvecscope_alpha*scopes->vecscope_alpha*scopes->vecscope_alpha; + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + glColor4f(0.f, 0.f, 0.f, 0.3f); + uiSetRoundBox(15); + gl_round_box(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f); + + /* need scissor test, hvectorscope can draw outside of boundary */ + glGetIntegerv(GL_VIEWPORT, scissor); + glScissor(ar->winrct.xmin + (rect.xmin-1), ar->winrct.ymin+(rect.ymin-1), (rect.xmax+1)-(rect.xmin-1), (rect.ymax+1)-(rect.ymin-1)); + + glColor4f(1.f, 1.f, 1.f, 0.08f); + /* draw grid elements */ + /* cross */ + fdrawline(centerx - (diam/2)-5, centery, centerx + (diam/2)+5, centery); + fdrawline(centerx, centery - (diam/2)-5, centerx, centery + (diam/2)+5); + /* circles */ + for(j=0; j<5; j++) { + glBegin(GL_LINE_STRIP); + for(i=0; i<=360; i=i+15) { + float a= i*M_PI/180.0; + float r= (j+1)/10.0f; + glVertex2f( polar_to_x(centerx,diam,r,a), polar_to_y(centery,diam,r,a)); + } + glEnd(); + } + /* skin tone line */ + glColor4f(1.f, 0.4f, 0.f, 0.2f); + fdrawline( polar_to_x(centerx, diam, 0.5f, skina*M_PI/180.0), polar_to_y(centery,diam,0.5,skina*M_PI/180.0), + polar_to_x(centerx, diam, 0.1f, skina*M_PI/180.0), polar_to_y(centery,diam,0.1,skina*M_PI/180.0)); + /* saturation points */ + for(i=0; i<6; i++) + vectorscope_draw_target(centerx, centery, diam, colors[i][0], colors[i][1], colors[i][2]); + + if (scopes->ok && scopes->vecscope != NULL) { + /* pixel point cloud */ + glBlendFunc(GL_ONE,GL_ONE); + glColor3f(alpha, alpha, alpha); + + glPushMatrix(); + glEnableClientState(GL_VERTEX_ARRAY); + + glTranslatef(centerx, centery, 0.f); + glScalef(diam, diam, 0.f); + + glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope); + glDrawArrays(GL_POINTS, 0, scopes->waveform_tot); + + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + } + + /* outline, scale gripper */ + draw_scope_end(&rect, scissor); + + glDisable(GL_BLEND); +} void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect) { diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 83aede3156c..7eda0920534 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -24,19 +24,15 @@ */ #include +#include #include #include #include #include "MEM_guardedalloc.h" -#include "DNA_color_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -181,6 +177,7 @@ typedef struct uiAfterFunc { int autokey; } uiAfterFunc; +static int ui_but_contains_pt(uiBut *but, int mx, int my); static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y); static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state); static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata); @@ -189,11 +186,16 @@ static void button_timers_tooltip_remove(bContext *C, uiBut *but); /* ******************** menu navigation helpers ************** */ +static int ui_but_editable(uiBut *but) +{ + return ELEM5(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX, PROGRESSBAR); +} + static uiBut *ui_but_prev(uiBut *but) { while(but->prev) { but= but->prev; - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; } return NULL; } @@ -202,7 +204,7 @@ static uiBut *ui_but_next(uiBut *but) { while(but->next) { but= but->next; - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; } return NULL; } @@ -213,7 +215,7 @@ static uiBut *ui_but_first(uiBlock *block) but= block->buttons.first; while(but) { - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; but= but->next; } return NULL; @@ -225,7 +227,7 @@ static uiBut *ui_but_last(uiBlock *block) but= block->buttons.last; while(but) { - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; but= but->prev; } return NULL; @@ -234,7 +236,7 @@ static uiBut *ui_but_last(uiBlock *block) static int ui_is_a_warp_but(uiBut *but) { if(U.uiflag & USER_CONTINUOUS_MOUSE) - if(ELEM(but->type, NUM, NUMABS)) + if(ELEM3(but->type, NUM, NUMABS, HSVCIRCLE)) return TRUE; return FALSE; @@ -782,6 +784,8 @@ static void ui_apply_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data) break; } if(bt && bt!=but) { + if (!ELEM(bt->type, LINK, INLINK) || !ELEM(but->type, LINK, INLINK)) + return; if(but->type==LINK) ui_add_link(but, bt); else ui_add_link(bt, but); @@ -806,6 +810,14 @@ static void ui_apply_but_HISTOGRAM(bContext *C, uiBut *but, uiHandleButtonData * data->applied= 1; } +static void ui_apply_but_WAVEFORM(bContext *C, uiBut *but, uiHandleButtonData *data) +{ + ui_apply_but_func(C, but); + data->retval= but->retval; + data->applied= 1; +} + + static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, int interactive) { char *editstr; @@ -931,6 +943,9 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut case HISTOGRAM: ui_apply_but_HISTOGRAM(C, but, data); break; + case WAVEFORM: + ui_apply_but_WAVEFORM(C, but, data); + break; default: break; } @@ -956,7 +971,7 @@ static void ui_but_drop(bContext *C, wmEvent *event, uiBut *but, uiHandleButtonD if(ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) { ID *id= (ID *)wmd->poin; - if(but->poin==NULL && but->rnapoin.data==NULL); + if(but->poin==NULL && but->rnapoin.data==NULL) {} button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING); BLI_strncpy(data->str, id->name+2, data->maxlen); button_activate_state(C, but, BUTTON_STATE_EXIT); @@ -998,7 +1013,11 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, if(but->poin==NULL && but->rnapoin.data==NULL); else if(mode=='c') { - sprintf(buf, "%f", ui_get_but_val(but)); + if(ui_is_but_float(but)) + sprintf(buf, "%f", ui_get_but_val(but)); + else + sprintf(buf, "%d", (int)ui_get_but_val(but)); + WM_clipboard_text_set(buf, 0); } else { @@ -1032,7 +1051,7 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, } /* text/string and ID data */ - else if(ELEM(but->type, TEX, IDPOIN)) { + else if(ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) { uiHandleButtonData *data= but->active; if(but->poin==NULL && but->rnapoin.data==NULL); @@ -1052,7 +1071,7 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, /* colorband (not supported by system clipboard) */ else if(but->type==BUT_COLORBAND) { if(mode=='c') { - if(but->poin) + if(but->poin==NULL) return; memcpy(&but_copypaste_coba, but->poin, sizeof(ColorBand)); @@ -1144,18 +1163,22 @@ static int ui_textedit_delete_selection(uiBut *but, uiHandleButtonData *data) return change; } +/* note, but->block->aspect is used here, when drawing button style is getting scaled too */ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, short x) { uiStyle *style= U.uistyles.first; // XXX pass on as arg + uiFontStyle *fstyle = &style->widget; int startx= but->x1; char *origstr; - uiStyleFontSet(&style->widget); + uiStyleFontSet(fstyle); + if (fstyle->kerning==1) /* for BLF_width */ + BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + origstr= MEM_callocN(sizeof(char)*data->maxlen, "ui_textedit origstr"); BLI_strncpy(origstr, but->drawstr, data->maxlen); - but->pos= strlen(origstr)-but->ofs; /* XXX solve generic */ if(but->type==NUM || but->type==NUMSLI) @@ -1166,16 +1189,38 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho startx += 16; } - /* XXX does not take zoom level into account */ - while((BLF_width(origstr+but->ofs) + startx) > x) { - if (but->pos <= 0) break; - but->pos--; - origstr[but->pos+but->ofs] = 0; + /* mouse dragged outside the widget to the left */ + if (x < startx && but->ofs > 0) { + int i= but->ofs; + + origstr[but->ofs] = 0; + + while (i > 0) { + i--; + if (BLF_width(fstyle->uifont_id, origstr+i) > (startx - x)*0.25) break; // 0.25 == scale factor for less sensitivity + } + but->ofs = i; + but->pos = but->ofs; + } + /* mouse inside the widget */ + else if (x >= startx) { + float aspect= sqrt(but->block->aspect); + + but->pos= strlen(origstr)-but->ofs; + + /* XXX does not take zoom level into account */ + while (aspect*startx + aspect*BLF_width(fstyle->uifont_id, origstr+but->ofs) > x) { + if (but->pos <= 0) break; + but->pos--; + origstr[but->pos+but->ofs] = 0; + } + but->pos += but->ofs; + if(but->pos<0) but->pos= 0; } - but->pos += but->ofs; - if(but->pos<0) but->pos= 0; - + if (fstyle->kerning == 1) + BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + MEM_freeN(origstr); } @@ -1507,6 +1552,8 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data) } ui_check_but(but); + + WM_cursor_modal(CTX_wm_window(C), BC_TEXTEDITCURSOR); } static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data) @@ -1523,6 +1570,8 @@ static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data) but->editstr= NULL; but->pos= -1; } + + WM_cursor_restore(CTX_wm_window(C)); } static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonData *data) @@ -1612,7 +1661,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle my= event->y; ui_window_to_block(data->region, block, &mx, &my); - if ((but->y1 <= my) && (my <= but->y2) && (but->x1 <= mx) && (mx <= but->x2)) { + if (ui_but_contains_pt(but, mx, my)) { ui_textedit_set_cursor_pos(but, data, mx); but->selsta = but->selend = but->pos; data->selstartx= mx; @@ -1718,7 +1767,11 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle if(event->ascii && (retval == WM_UI_HANDLER_CONTINUE)) { changed= ui_textedit_type_ascii(but, data, event->ascii); retval= WM_UI_HANDLER_BREAK; + } + /* textbutton with magnifier icon: do live update for search button */ + if(but->icon==ICON_VIEWZOOM) + update= 1; } if(changed) { @@ -1948,14 +2001,17 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data if(event->type == MOUSEMOVE) return WM_UI_HANDLER_CONTINUE; - if(event->type == ESCKEY) { - /* data->cancel doesnt work, this button opens immediate */ - if(but->flag & UI_BUT_IMMEDIATE) - ui_set_but_val(but, 0); - else - data->cancel= 1; - button_activate_state(C, but, BUTTON_STATE_EXIT); - return WM_UI_HANDLER_BREAK; + if(event->type == LEFTMOUSE && event->val==KM_PRESS) { + /* only cancel if click outside the button */ + if(ui_mouse_inside_button(but->active->region, but, event->x, event->y) == 0) { + /* data->cancel doesnt work, this button opens immediate */ + if(but->flag & UI_BUT_IMMEDIATE) + ui_set_but_val(but, 0); + else + data->cancel= 1; + button_activate_state(C, but, BUTTON_STATE_EXIT); + return WM_UI_HANDLER_BREAK; + } } /* always set */ @@ -1989,15 +2045,11 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data return WM_UI_HANDLER_CONTINUE; } - static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) { if(data->state == BUTTON_STATE_HIGHLIGHT) { if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) { - short event= (short)ui_get_but_val(but); - /* hardcoded prevention from editing or assigning ESC */ - if(event!=ESCKEY) - button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); + button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); return WM_UI_HANDLER_BREAK; } } @@ -2006,7 +2058,7 @@ static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, w return WM_UI_HANDLER_CONTINUE; if(event->val==KM_PRESS) { - if(event->type!=ESCKEY && WM_key_event_string(event->type)[0]) + if(WM_key_event_string(event->type)[0]) ui_set_but_val(but, event->type); else data->cancel= 1; @@ -2062,16 +2114,24 @@ static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, wmE /* first handle click on icondrag type button */ if(event->type==LEFTMOUSE && but->dragpoin) { if(ui_but_mouse_inside_icon(but, data->region, event)) { + + /* tell the button to wait and keep checking further events to + * see if it should start dragging */ button_activate_state(C, but, BUTTON_STATE_WAIT_DRAG); data->dragstartx= event->x; data->dragstarty= event->y; - return WM_UI_HANDLER_BREAK; + return WM_UI_HANDLER_CONTINUE; } } if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) { + int ret = WM_UI_HANDLER_BREAK; + /* XXX (a bit ugly) Special case handling for filebrowser drag button */ + if(but->dragpoin && but->imb && ui_but_mouse_inside_icon(but, data->region, event)) { + ret = WM_UI_HANDLER_CONTINUE; + } button_activate_state(C, but, BUTTON_STATE_EXIT); - return WM_UI_HANDLER_BREAK; + return ret; } } else if(data->state == BUTTON_STATE_WAIT_DRAG) { @@ -2081,14 +2141,16 @@ static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, wmE return WM_UI_HANDLER_BREAK; } - /* pass on release as press for other keymaps XXX hack alert! */ + /* If the mouse has been pressed and released, getting to + * this point without triggering a drag, then clear the + * drag state for this button and continue to pass on the event */ if(event->type==LEFTMOUSE && event->val==KM_RELEASE) { button_activate_state(C, but, BUTTON_STATE_EXIT); - event->val= KM_CLICK; return WM_UI_HANDLER_CONTINUE; } - /* while wait drag, always block other events to get handled */ + /* while waiting for a drag to be triggered, always block + * other events from getting handled */ return WM_UI_HANDLER_BREAK; } @@ -2162,7 +2224,6 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i softmax= but->softmax; softrange= softmax - softmin; - if(ui_is_a_warp_but(but)) { /* Mouse location isn't screen clamped to the screen so use a linear mapping * 2px == 1-int, or 1px == 1-ClickStep */ @@ -2222,15 +2283,18 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i /* Use a non-linear mapping of the mouse drag especially for large floats (normal behavior) */ deler= 500; if(!ui_is_but_float(but)) { - if((softrange)<100) deler= 200.0; - if((softrange)<25) deler= 50.0; + /* prevent large ranges from getting too out of control */ + if (softrange > 600) deler = powf(softrange, 0.75); + + if (softrange < 100) deler= 200.0; + if (softrange < 25) deler= 50.0; } deler /= fac; - if(ui_is_but_float(but) && softrange > 11) { + if(softrange > 11) { /* non linear change in mouse input- good for high precicsion */ data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.002); - } else if (!ui_is_but_float(but) && softrange > 129) { /* only scale large int buttons */ + } else if (softrange > 129) { /* only scale large int buttons */ /* non linear change in mouse input- good for high precicsionm ints need less fine tuning */ data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.004); } else { @@ -2238,8 +2302,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i data->dragf+= ((float)(mx-data->draglastx))/deler ; } - if(data->dragf>1.0) data->dragf= 1.0; - if(data->dragf<0.0) data->dragf= 0.0; + CLAMP(data->dragf, 0.0, 1.0); data->draglastx= mx; tempf= (softmin + data->dragf*softrange); @@ -2251,7 +2314,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i CLAMP(temp, softmin, softmax); lvalue= (int)data->value; - + if(temp != lvalue) { data->dragchange= 1; data->value= (double)temp; @@ -2891,8 +2954,7 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, float range; /* vertical 'value' strip */ - hsv[2]= y; - + /* exception only for value strip - use the range set in but->min/max */ range = but->softmax - but->softmin; hsv[2] = y*range + but->softmin; @@ -2900,10 +2962,12 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, if (color_profile) hsv[2] = srgb_to_linearrgb(hsv[2]); + if (hsv[2] > but->softmax) + hsv[2] = but->softmax; } hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); - ui_set_but_vectorf(but, rgb); + copy_v3_v3(data->vec, rgb); data->draglastx= mx; data->draglasty= my; @@ -2983,7 +3047,7 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu return WM_UI_HANDLER_CONTINUE; } -static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx, int my) +static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx, int my, int shift) { rcti rect; int changed= 1; @@ -2997,13 +3061,29 @@ static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx /* exception, when using color wheel in 'locked' value state: * allow choosing a hue for black values, by giving a tiny increment */ - if (but->a2 == 1) { // lock + if (but->flag & UI_BUT_COLOR_LOCK) { // lock if (hsv[2] == 0.f) hsv[2] = 0.0001f; } - + + if(U.uiflag & USER_CONTINUOUS_MOUSE) { + float fac= shift ? 0.05 : 1.0f; + /* slow down the mouse, this is fairly picky */ + mx = (data->dragstartx*(1.0f-fac) + mx*fac); + my = (data->dragstarty*(1.0f-fac) + my*fac); + } + ui_hsvcircle_vals_from_pos(hsv, hsv+1, &rect, (float)mx, (float)my); - + + if(but->flag & UI_BUT_COLOR_CUBIC) + hsv[1]= 1.0f - sqrt3f(1.0f - hsv[1]); + hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); + + if((but->flag & UI_BUT_VEC_SIZE_LOCK) && (rgb[0] || rgb[1] || rgb[2])) { + normalize_v3(rgb); + mul_v3_fl(rgb, but->a2); + } + ui_set_but_vectorf(but, rgb); data->draglastx= mx; @@ -3030,7 +3110,7 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); /* also do drag the first time */ - if(ui_numedit_but_HSVCIRCLE(but, data, mx, my)) + if(ui_numedit_but_HSVCIRCLE(but, data, mx, my, event->shift)) ui_numedit_apply(C, block, but, data); return WM_UI_HANDLER_BREAK; @@ -3081,7 +3161,7 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle } else if(event->type == MOUSEMOVE) { if(mx!=data->draglastx || my!=data->draglasty) { - if(ui_numedit_but_HSVCIRCLE(but, data, mx, my)) + if(ui_numedit_but_HSVCIRCLE(but, data, mx, my, event->shift)) ui_numedit_apply(C, block, but, data); } } @@ -3434,6 +3514,12 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt return WM_UI_HANDLER_CONTINUE; } +static int in_scope_resize_zone(uiBut *but, int x, int y) +{ + // bottom corner return (x > but->x2 - SCOPE_RESIZE_PAD) && (y < but->y1 + SCOPE_RESIZE_PAD); + return (y < but->y1 + SCOPE_RESIZE_PAD); +} + static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx, int my) { Histogram *hist = (Histogram *)but->poin; @@ -3447,10 +3533,17 @@ static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx dx = mx - data->draglastx; dy = my - data->draglasty; - yfac = MIN2(powf(hist->ymax, 2.f), 1.f) * 0.5; - hist->ymax += dy * yfac; - CLAMP(hist->ymax, 1.f, 100.f); + if (in_scope_resize_zone(but, data->dragstartx, data->dragstarty)) { + /* resize histogram widget itself */ + hist->height = (but->y2 - but->y1) + (data->dragstarty - my); + } else { + /* scale histogram values */ + yfac = MIN2(powf(hist->ymax, 2.f), 1.f) * 0.5; + hist->ymax += dy * yfac; + + CLAMP(hist->ymax, 1.f, 100.f); + } data->draglastx= mx; data->draglasty= my; @@ -3509,6 +3602,156 @@ static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandle return WM_UI_HANDLER_CONTINUE; } +static int ui_numedit_but_WAVEFORM(uiBut *but, uiHandleButtonData *data, int mx, int my) +{ + Scopes *scopes = (Scopes *)but->poin; + rcti rect; + int changed= 1; + float dx, dy, yfac=1.f; + + rect.xmin= but->x1; rect.xmax= but->x2; + rect.ymin= but->y1; rect.ymax= but->y2; + + dx = mx - data->draglastx; + dy = my - data->draglasty; + + + if (in_scope_resize_zone(but, data->dragstartx, data->dragstarty)) { + /* resize waveform widget itself */ + scopes->wavefrm_height = (but->y2 - but->y1) + (data->dragstarty - my); + } else { + /* scale waveform values */ + yfac = scopes->wavefrm_yfac; + scopes->wavefrm_yfac += dy/200.0f; + + CLAMP(scopes->wavefrm_yfac, 0.5f, 2.f); + } + + data->draglastx= mx; + data->draglasty= my; + + return changed; +} + +static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +{ + int mx, my; + + mx= event->x; + my= event->y; + ui_window_to_block(data->region, block, &mx, &my); + + if(data->state == BUTTON_STATE_HIGHLIGHT) { + if(event->type==LEFTMOUSE && event->val==KM_PRESS) { + data->dragstartx= mx; + data->dragstarty= my; + data->draglastx= mx; + data->draglasty= my; + button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); + + /* also do drag the first time */ + if(ui_numedit_but_WAVEFORM(but, data, mx, my)) + ui_numedit_apply(C, block, but, data); + + return WM_UI_HANDLER_BREAK; + } + else if (event->type == ZEROKEY && event->val == KM_PRESS) { + Scopes *scopes = (Scopes *)but->poin; + scopes->wavefrm_yfac = 1.f; + + button_activate_state(C, but, BUTTON_STATE_EXIT); + return WM_UI_HANDLER_BREAK; + } + } + else if(data->state == BUTTON_STATE_NUM_EDITING) { + if(event->type == ESCKEY) { + data->cancel= 1; + data->escapecancel= 1; + button_activate_state(C, but, BUTTON_STATE_EXIT); + } + else if(event->type == MOUSEMOVE) { + if(mx!=data->draglastx || my!=data->draglasty) { + if(ui_numedit_but_WAVEFORM(but, data, mx, my)) + ui_numedit_apply(C, block, but, data); + } + } + else if(event->type==LEFTMOUSE && event->val!=KM_PRESS) { + button_activate_state(C, but, BUTTON_STATE_EXIT); + } + return WM_UI_HANDLER_BREAK; + } + + return WM_UI_HANDLER_CONTINUE; +} + +static int ui_numedit_but_VECTORSCOPE(uiBut *but, uiHandleButtonData *data, int mx, int my) +{ + Scopes *scopes = (Scopes *)but->poin; + rcti rect; + int changed= 1; + float dx, dy; + + rect.xmin= but->x1; rect.xmax= but->x2; + rect.ymin= but->y1; rect.ymax= but->y2; + + dx = mx - data->draglastx; + dy = my - data->draglasty; + + if (in_scope_resize_zone(but, data->dragstartx, data->dragstarty)) { + /* resize vectorscope widget itself */ + scopes->vecscope_height = (but->y2 - but->y1) + (data->dragstarty - my); + } + + data->draglastx= mx; + data->draglasty= my; + + return changed; +} + +static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +{ + int mx, my; + + mx= event->x; + my= event->y; + ui_window_to_block(data->region, block, &mx, &my); + + if(data->state == BUTTON_STATE_HIGHLIGHT) { + if(event->type==LEFTMOUSE && event->val==KM_PRESS) { + data->dragstartx= mx; + data->dragstarty= my; + data->draglastx= mx; + data->draglasty= my; + button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); + + /* also do drag the first time */ + if(ui_numedit_but_VECTORSCOPE(but, data, mx, my)) + ui_numedit_apply(C, block, but, data); + + return WM_UI_HANDLER_BREAK; + } + } + else if(data->state == BUTTON_STATE_NUM_EDITING) { + if(event->type == ESCKEY) { + data->cancel= 1; + data->escapecancel= 1; + button_activate_state(C, but, BUTTON_STATE_EXIT); + } + else if(event->type == MOUSEMOVE) { + if(mx!=data->draglastx || my!=data->draglasty) { + if(ui_numedit_but_VECTORSCOPE(but, data, mx, my)) + ui_numedit_apply(C, block, but, data); + } + } + else if(event->type==LEFTMOUSE && event->val!=KM_PRESS) { + button_activate_state(C, but, BUTTON_STATE_EXIT); + } + return WM_UI_HANDLER_BREAK; + } + + return WM_UI_HANDLER_CONTINUE; +} + #ifdef INTERNATIONAL static int ui_do_but_CHARTAB(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) { @@ -3706,7 +3949,7 @@ static uiBlock *menu_change_shortcut(bContext *C, ARegion *ar, void *arg) layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style); - uiItemR(layout, "", 0, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE); + uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", 0); uiPopupBoundsBlock(block, 6, 100, 10); uiEndBlock(C, block); @@ -3740,7 +3983,7 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *ar, void *arg) layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style); - uiItemR(layout, "", 0, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE); + uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", 0); uiPopupBoundsBlock(block, 6, 100, 10); uiEndBlock(C, block); @@ -3937,28 +4180,28 @@ static int ui_but_menu(bContext *C, uiBut *but) WM_operator_properties_create(&ptr_props, "WM_OT_doc_view"); RNA_string_set(&ptr_props, "doc_id", buf); - uiItemFullO(layout, "View Docs", 0, "WM_OT_doc_view", ptr_props.data, WM_OP_EXEC_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_view", "View Docs", 0, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit"); RNA_string_set(&ptr_props, "doc_id", buf); RNA_string_set(&ptr_props, "doc_new", RNA_property_description(but->rnaprop)); - uiItemFullO(layout, "Submit Description", 0, "WM_OT_doc_edit", ptr_props.data, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", 0, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0); } else if (but->optype) { WM_operator_py_idname(buf, but->optype->idname); WM_operator_properties_create(&ptr_props, "WM_OT_doc_view"); RNA_string_set(&ptr_props, "doc_id", buf); - uiItemFullO(layout, "View Docs", 0, "WM_OT_doc_view", ptr_props.data, WM_OP_EXEC_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_view", "View Docs", 0, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit"); RNA_string_set(&ptr_props, "doc_id", buf); RNA_string_set(&ptr_props, "doc_new", but->optype->description); - uiItemFullO(layout, "Submit Description", 0, "WM_OT_doc_edit", ptr_props.data, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", 0, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0); } } @@ -3989,7 +4232,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) ui_but_drop (C, event, but, data); } /* handle keyframing */ - else if(event->type == IKEY && event->val == KM_PRESS) { + else if(event->type == IKEY && !ELEM3(1, event->ctrl, event->oskey, event->shift) && event->val == KM_PRESS) { if(event->alt) ui_but_anim_delete_keyframe(C); else @@ -4000,7 +4243,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) return WM_UI_HANDLER_BREAK; } /* handle drivers */ - else if(event->type == DKEY && event->val == KM_PRESS) { + else if(event->type == DKEY && !ELEM3(1, event->ctrl, event->oskey, event->shift) && event->val == KM_PRESS) { if(event->alt) ui_but_anim_remove_driver(C); else @@ -4011,7 +4254,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) return WM_UI_HANDLER_BREAK; } /* handle keyingsets */ - else if(event->type == KKEY && event->val == KM_PRESS) { + else if(event->type == KKEY && !ELEM3(1, event->ctrl, event->oskey, event->shift) && event->val == KM_PRESS) { if(event->alt) ui_but_anim_remove_keyingset(C); else @@ -4093,11 +4336,18 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) case ROW: case LISTROW: case BUT_IMAGE: + case PROGRESSBAR: retval= ui_do_but_EXIT(C, but, data, event); break; case HISTOGRAM: retval= ui_do_but_HISTOGRAM(C, block, but, data, event); break; + case WAVEFORM: + retval= ui_do_but_WAVEFORM(C, block, but, data, event); + break; + case VECTORSCOPE: + retval= ui_do_but_VECTORSCOPE(C, block, but, data, event); + break; case TEX: case IDPOIN: case SEARCH_MENU: @@ -4406,7 +4656,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s but->flag |= UI_SELECT; button_timers_tooltip_remove(C, but); } - + /* text editing */ if(state == BUTTON_STATE_TEXT_EDITING && data->state != BUTTON_STATE_TEXT_SELECTING) ui_textedit_begin(C, but, data); @@ -5381,8 +5631,7 @@ static int ui_handler_region(bContext *C, wmEvent *event, void *userdata) /* either handle events for already activated button or try to activate */ but= ui_but_find_activated(ar); - if(!but || !button_modal_state(but->active->state)) - retval= ui_handler_panel_region(C, event); + retval= ui_handler_panel_region(C, event); if(retval == WM_UI_HANDLER_CONTINUE) retval= ui_handle_list_event(C, event, ar); diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 457713755fd..232b6f7f317 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -44,10 +44,9 @@ #include "BLI_blenlib.h" #include "BLI_storage_types.h" -#include "DNA_material_types.h" #include "DNA_screen_types.h" -#include "DNA_scene_types.h" #include "DNA_userdef_types.h" +#include "DNA_brush_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -66,7 +65,6 @@ #include "UI_interface.h" #include "UI_interface_icons.h" -#include "UI_resources.h" /* elubie: should be removed once the enum for the ICONS is in BIF_preview_icons.h */ #include "interface_intern.h" @@ -460,30 +458,25 @@ static void init_internal_icons() ImBuf *bbuf= NULL; int x, y, icontype; char iconfilestr[FILE_MAXDIR+FILE_MAXFILE]; - char filenamestr[FILE_MAXFILE+16]; // 16 == strlen(".blender/icons/")+1 if ((btheme!=NULL) && (strlen(btheme->tui.iconfile) > 0)) { - -#ifdef WIN32 - sprintf(filenamestr, "icons/%s", btheme->tui.iconfile); -#else - sprintf(filenamestr, ".blender/icons/%s", btheme->tui.iconfile); -#endif - - BLI_make_file_string("/", iconfilestr, BLI_gethome(), filenamestr); - - if (BLI_exists(iconfilestr)) { - bbuf = IMB_loadiffname(iconfilestr, IB_rect); - if(bbuf->x < ICON_IMAGE_W || bbuf->y < ICON_IMAGE_H) { - if (G.f & G_DEBUG) - printf("\n***WARNING***\nIcons file %s too small.\nUsing built-in Icons instead\n", iconfilestr); - IMB_freeImBuf(bbuf); - bbuf= NULL; + char *datadir= BLI_get_folder(BLENDER_DATAFILES, NULL); + if (datadir) { + BLI_make_file_string("/", iconfilestr, datadir, btheme->tui.iconfile); + + if (BLI_exists(iconfilestr)) { + bbuf = IMB_loadiffname(iconfilestr, IB_rect); + if(bbuf->x < ICON_IMAGE_W || bbuf->y < ICON_IMAGE_H) { + if (G.f & G_DEBUG) + printf("\n***WARNING***\nIcons file %s too small.\nUsing built-in Icons instead\n", iconfilestr); + IMB_freeImBuf(bbuf); + bbuf= NULL; + } } } } if(bbuf==NULL) - bbuf = IMB_ibImageFromMemory((int *)datatoc_blenderbuttons, datatoc_blenderbuttons_size, IB_rect); + bbuf = IMB_ibImageFromMemory((unsigned char*)datatoc_blenderbuttons, datatoc_blenderbuttons_size, IB_rect); if(bbuf) { /* free existing texture if any */ @@ -521,12 +514,14 @@ static void init_internal_icons() else icontype= ICON_TYPE_BUFFER; - for (y=0; yfirst = list->last = NULL; + char *datadir= NULL; -#ifdef WIN32 - BLI_make_file_string("/", icondirstr, BLI_gethome(), "icons"); -#else - BLI_make_file_string("/", icondirstr, BLI_gethome(), ".blender/icons"); -#endif + list->first = list->last = NULL; + datadir = BLI_get_folder(BLENDER_DATAFILES, NULL); + + if (!datadir) return; + + BLI_make_file_string("/", icondirstr, datadir, ""); if(BLI_exists(icondirstr)==0) return; @@ -573,8 +568,7 @@ static void init_iconfile_list(struct ListBase *list) if(!BLI_getwdN(olddir)) restoredir = 0; totfile = BLI_getdir(icondirstr, &dir); - if (restoredir && !chdir(olddir)) - ; /* fix warning about checking return value */ + if (restoredir && !chdir(olddir)) {} /* fix warning about checking return value */ for(i=0; iw[miplevel] = size; prv_img->h[miplevel] = size; prv_img->changed[miplevel] = 1; + prv_img->changed_timestamp[miplevel] = 0; prv_img->rect[miplevel] = MEM_callocN(size*size*sizeof(unsigned int), "prv_rect"); } } @@ -983,6 +978,16 @@ int ui_id_icon_get(bContext *C, ID *id, int preview) /* checks if not exists, or changed */ ui_id_icon_render(C, id, preview); break; + case ID_BR: + { /* use the image in the brush as the icon */ + /* XXX redundancy here can be reduced be rewriting this switch as an if */ + ID* ima_id = (ID*)((Brush*)id)->image_icon; + id = ima_id ? ima_id : id; + iconid= BKE_icon_getid(id); + /* checks if not exists, or changed */ + ui_id_icon_render(C, id, preview); + } + break; default: break; } diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 4f7a97f0579..cb8130573fe 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -87,7 +87,8 @@ typedef enum { UI_WTYPE_NORMAL, UI_WTYPE_BOX, UI_WTYPE_SCROLL, - UI_WTYPE_LISTITEM + UI_WTYPE_LISTITEM, + UI_WTYPE_PROGRESSBAR, } uiWidgetTypeEnum; @@ -127,6 +128,9 @@ typedef enum { #define EXTEND_LEFT 1 #define EXTEND_RIGHT 2 +/* for scope resize zone */ +#define SCOPE_RESIZE_PAD 9 + typedef struct { short xim, yim; unsigned int *rect; @@ -180,8 +184,11 @@ struct uiBut { struct bContextStore *context; + /* not ysed yet, was used in 2.4x for ui_draw_pulldown_round & friends */ + /* void (*embossfunc)(int , int , float, float, float, float, float, int); void (*sliderfunc)(int , float, float, float, float, float, float, int); + */ uiButCompleteFunc autocomplete_func; void *autofunc_arg; @@ -224,12 +231,12 @@ struct uiBut { /* Operator data */ struct wmOperatorType *optype; - int opcontext; struct IDProperty *opproperties; struct PointerRNA *opptr; + short opcontext; /* Draggable data, type is WM_DRAG_... */ - int dragtype; + short dragtype; void *dragpoin; struct ImBuf *imb; float imb_scale; @@ -440,6 +447,8 @@ extern void gl_round_box_vertical_shade(int mode, float minx, float miny, float void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha); void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect); +void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect); +void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect); void ui_draw_but_COLORBAND(uiBut *but, struct uiWidgetColors *wcol, rcti *rect); void ui_draw_but_NORMAL(uiBut *but, struct uiWidgetColors *wcol, rcti *rect); void ui_draw_but_CURVE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect); @@ -474,7 +483,7 @@ int ui_id_icon_get(struct bContext *C, struct ID *id, int preview); /* resources.c */ void init_userdef_do_versions(void); -void ui_theme_init_userdef(void); +void ui_theme_init_default(void); void ui_resources_init(void); void ui_resources_free(void); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index d4a47be11ca..b7b9a2156ef 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -29,11 +29,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_listbase.h" #include "BLI_string.h" @@ -48,12 +45,7 @@ #include "RNA_access.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" -#include "ED_util.h" -#include "ED_types.h" -#include "ED_screen.h" #include "WM_api.h" #include "WM_types.h" @@ -439,18 +431,14 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon but->type= TOG; } } - else if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && len == 4) { - but= uiDefAutoButR(block, ptr, prop, 3, "A:", 0, 0, 0, w, UI_UNIT_Y); - if(slider && but->type==NUM) - but->type= NUMSLI; - } } uiBlockSetCurLayout(block, layout); } -static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h, int icon_only) +static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h, int icon_only) { + uiBut *but; EnumPropertyItem *item; const char *identifier; char *name; @@ -470,11 +458,14 @@ static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr, itemw= ui_text_icon_width(block->curlayout, name, icon, 0); if(icon && strcmp(name, "") != 0 && !icon_only) - uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + but= uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); else if(icon) - uiDefIconButR(block, ROW, 0, icon, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + but= uiDefIconButR(block, ROW, 0, icon, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); else - uiDefButR(block, ROW, 0, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + but= uiDefButR(block, ROW, 0, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + + if(ui_layout_local_dir(layout) != UI_LAYOUT_HORIZONTAL) + but->flag |= UI_TEXT_LEFT; } uiBlockSetCurLayout(block, layout); @@ -522,7 +513,7 @@ static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, i uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w-UI_UNIT_X, h); /* BUTTONS_OT_file_browse calls uiFileBrowseContextProperty */ - but= uiDefIconButO(block, BUT, "BUTTONS_OT_file_browse", WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, "Browse for file or directory"); + but= uiDefIconButO(block, BUT, "BUTTONS_OT_file_browse", WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL); } else if(subtype == PROP_DIRECTION) { uiDefButR(block, BUT_NORMAL, 0, name, x, y, 100, 100, ptr, RNA_property_identifier(prop), index, 0, 0, -1, -1, NULL); @@ -600,7 +591,7 @@ static void ui_item_disabled(uiLayout *layout, char *name) } /* operator items */ -PointerRNA uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context, int flag) +PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDProperty *properties, int context, int flag) { uiBlock *block= layout->root->block; wmOperatorType *ot= WM_operatortype_find(idname, 0); @@ -622,6 +613,9 @@ PointerRNA uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDP w= ui_text_icon_width(layout, name, icon, 0); + if (flag & UI_ITEM_R_NO_BG) + uiBlockSetEmboss(block, UI_EMBOSSN); + if(icon && strcmp(name, "") != 0) but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL); else if(icon) @@ -632,7 +626,10 @@ PointerRNA uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDP /* text alignment for toolbar buttons */ if((layout->root->type == UI_LAYOUT_TOOLBAR) && !icon) but->flag |= UI_TEXT_LEFT; - + + if (flag & UI_ITEM_R_NO_BG) + uiBlockSetEmboss(block, UI_EMBOSS); + /* assign properties */ if(properties || (flag & UI_ITEM_O_RETURN_PROPS)) { PointerRNA *opptr= uiButGetOperatorPtrRNA(but); @@ -681,7 +678,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname return ""; } -void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) +void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value) { PointerRNA ptr; @@ -691,7 +688,7 @@ void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *pro if(!name) name= ui_menu_enumpropname(layout, opname, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty *properties, int context, int flag) @@ -731,10 +728,10 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty ptr.data= IDP_CopyProperty(properties); RNA_enum_set(&ptr, propname, item[i].value); - uiItemFullO(column, (char*)item[i].name, item[i].icon, opname, ptr.data, context, flag); + uiItemFullO(column, opname, (char*)item[i].name, item[i].icon, ptr.data, context, flag); } else - uiItemEnumO(column, (char*)item[i].name, item[i].icon, opname, propname, item[i].value); + uiItemEnumO(column, opname, (char*)item[i].name, item[i].icon, propname, item[i].value); } else { if(item[i].name) { @@ -798,7 +795,7 @@ void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, ch if(!name) name= ui_menu_enumpropname(layout, opname, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) @@ -808,7 +805,7 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char * WM_operator_properties_create(&ptr, opname); RNA_boolean_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) @@ -818,7 +815,7 @@ void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *prop WM_operator_properties_create(&ptr, opname); RNA_int_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value) @@ -828,7 +825,7 @@ void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *pr WM_operator_properties_create(&ptr, opname); RNA_float_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value) @@ -838,12 +835,12 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p WM_operator_properties_create(&ptr, opname); RNA_string_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } void uiItemO(uiLayout *layout, char *name, int icon, char *opname) { - uiItemFullO(layout, name, icon, opname, NULL, layout->root->opcontext, 0); + uiItemFullO(layout, opname, name, icon, NULL, layout->root->opcontext, 0); } /* RNA property items */ @@ -892,7 +889,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA *r_h= h; } -void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag) +void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, char *name, int icon) { uiBlock *block= layout->root->block; uiBut *but; @@ -954,7 +951,7 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper } /* expanded enum */ else if(type == PROP_ENUM && expand) - ui_item_enum_row(layout, block, ptr, prop, name, 0, 0, w, h, icon_only); + ui_item_enum_expand(layout, block, ptr, prop, name, 0, 0, w, h, icon_only); /* property with separate label */ else if(type == PROP_ENUM || type == PROP_STRING || type == PROP_POINTER) { but= ui_item_with_label(layout, block, name, icon, ptr, prop, index, 0, 0, w, h, flag); @@ -975,7 +972,7 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper uiBlockSetEmboss(block, UI_EMBOSS); } -void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int flag) +void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *name, int icon) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); @@ -985,7 +982,7 @@ void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *prop return; } - uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, flag); + uiItemFullR(layout, ptr, prop, RNA_NO_INDEX, 0, flag, name, icon); } void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value) @@ -998,10 +995,10 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, return; } - uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0); + uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, value, 0, name, icon); } -void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value) +void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); EnumPropertyItem *item; @@ -1024,7 +1021,7 @@ void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRN for(a=0; item[a].identifier; a++) { if(item[a].value == ivalue) { - uiItemFullR(layout, (char*)item[a].name, item[a].icon, ptr, prop, RNA_ENUM_VALUE, ivalue, 0); + uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, (char*)item[a].name, item[a].icon); break; } } @@ -1113,9 +1110,11 @@ static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, ui if(flag & PROP_ID_SELF_CHECK) if(itemptr.data == but->rnapoin.id.data) continue; - - if(RNA_struct_is_ID(itemptr.type)) - iconid= ui_id_icon_get((bContext*)C, itemptr.data, 0); + + if(itemptr.type && RNA_struct_is_ID(itemptr.type)) + iconid= ui_id_icon_get((bContext*)C, itemptr.data, 1); + else + iconid = 0; name= RNA_struct_name_get_alloc(&itemptr, NULL, 0); @@ -1127,8 +1126,8 @@ static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, ui cis->iconid = iconid; BLI_addtail(items_list, cis); } + MEM_freeN(name); } - MEM_freeN(name); i++; } @@ -1199,7 +1198,7 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN } } -void uiItemPointerR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname) +void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon) { PropertyRNA *prop, *searchprop; PropertyType type; @@ -1297,11 +1296,13 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun if(layout->root->type == UI_LAYOUT_HEADER) uiBlockSetEmboss(block, UI_EMBOSS); - else if(layout->root->type == UI_LAYOUT_PANEL) + else if(layout->root->type == UI_LAYOUT_PANEL) { but->type= MENU; + but->flag |= UI_TEXT_LEFT; + } } -void uiItemM(uiLayout *layout, bContext *C, char *name, int icon, char *menuname) +void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon) { MenuType *mt; @@ -1419,7 +1420,7 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg) uiItemsEnumO(layout, lvl->opname, lvl->propname); } -void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname) +void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon) { wmOperatorType *ot= WM_operatortype_find(opname, 0); MenuItemLevel *lvl; @@ -1450,7 +1451,7 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg) uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname); } -void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname) +void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon) { MenuItemLevel *lvl; PropertyRNA *prop; @@ -2074,7 +2075,7 @@ uiLayout *uiLayoutBox(uiLayout *layout) uiLayout *uiLayoutListBox(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, PointerRNA *actptr, PropertyRNA *actprop) { - uiLayoutItemBx *box= ui_layout_box(layout, LISTBOX); + uiLayoutItemBx *box= ui_layout_box(layout, LISTBOX); uiBut *but= box->roundbox; but->rnasearchpoin= *ptr; diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index c23e7f86833..20752099814 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -34,10 +34,6 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_vec_types.h" -#include "DNA_view2d_types.h" #include "BLI_blenlib.h" #include "BLI_math_color.h" @@ -48,15 +44,16 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "BIF_gl.h" + +#include "UI_interface.h" + +#include "interface_intern.h" + #include "WM_api.h" #include "WM_types.h" -#include "BIF_gl.h" -#include "ED_screen.h" - -#include "UI_interface.h" -#include "UI_resources.h" /* ********************************************************** */ @@ -94,18 +91,20 @@ static int eyedropper_cancel(bContext *C, wmOperator *op) static void eyedropper_sample(bContext *C, Eyedropper *eye, short mx, short my) { - float col[3]; - - glReadBuffer(GL_FRONT); - glReadPixels(mx, my, 1, 1, GL_RGB, GL_FLOAT, col); - glReadBuffer(GL_BACK); - if(RNA_property_type(eye->prop) == PROP_FLOAT) { - + const int color_manage = CTX_data_scene(C)->r.color_mgt_flag & R_COLOR_MANAGEMENT; + float col[4]; + + RNA_property_float_get_array(&eye->ptr, eye->prop, col); + + glReadBuffer(GL_FRONT); + glReadPixels(mx, my, 1, 1, GL_RGB, GL_FLOAT, col); + glReadBuffer(GL_BACK); + if (RNA_property_array_length(&eye->ptr, eye->prop) < 3) return; /* convert from screen (srgb) space to linear rgb space */ - if (RNA_property_subtype(eye->prop) == PROP_COLOR) + if (color_manage && RNA_property_subtype(eye->prop) == PROP_COLOR) srgb_to_linearrgb_v3_v3(col, col); RNA_property_float_set_array(&eye->ptr, eye->prop, col); @@ -195,6 +194,29 @@ void UI_OT_eyedropper(wmOperatorType *ot) /* properties */ } +/* Reset Default Theme ------------------------ */ + +static int reset_default_theme_exec(bContext *C, wmOperator *op) +{ + ui_theme_init_default(); + WM_event_add_notifier(C, NC_WINDOW, NULL); + + return OPERATOR_FINISHED; +} + +void UI_OT_reset_default_theme(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reset to Default Theme"; + ot->idname= "UI_OT_reset_default_theme"; + ot->description= "Reset to the default theme colors"; + + /* callbacks */ + ot->exec= reset_default_theme_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER; +} /* Copy Data Path Operator ------------------------ */ @@ -300,6 +322,8 @@ static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb) *lb = CTX_data_collection_get(C, "selected_editable_bones"); else if(RNA_struct_is_a(ptr->type, &RNA_PoseBone)) *lb = CTX_data_collection_get(C, "selected_pose_bones"); + else if(RNA_struct_is_a(ptr->type, &RNA_Sequence)) + *lb = CTX_data_collection_get(C, "selected_editable_sequences"); else return 0; @@ -386,6 +410,7 @@ void UI_OT_copy_to_selected_button(wmOperatorType *ot) void UI_buttons_operatortypes(void) { WM_operatortype_append(UI_OT_eyedropper); + WM_operatortype_append(UI_OT_reset_default_theme); WM_operatortype_append(UI_OT_copy_data_path_button); WM_operatortype_append(UI_OT_reset_default_button); WM_operatortype_append(UI_OT_copy_to_selected_button); diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index bf4a2a49fcb..61694b859c5 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -39,8 +39,6 @@ #include "BLI_blenlib.h" #include "BLI_math.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_userdef_types.h" #include "BKE_context.h" @@ -56,7 +54,6 @@ #include "ED_screen.h" #include "UI_interface.h" -#include "UI_view2d.h" #include "interface_intern.h" @@ -288,32 +285,6 @@ void uiEndPanel(uiBlock *block, int width, int height) } } -#if 0 -void uiPanelToMouse(const bContext *C, Panel *pa) -{ - /* global control over this feature; UI_PNL_TO_MOUSE only called for hotkey panels */ - if(U.uiflag & USER_PANELPINNED); - else if(pa->control & UI_PNL_TO_MOUSE) { - int mx, my; - - mx= CTX_wm_window(C)->eventstate->x; - my= CTX_wm_window(C)->eventstate->y; - - pa->ofsx= mx-pa->sizex/2; - pa->ofsy= my-pa->sizey/2; - - if(pa->flag & PNL_CLOSED) pa->flag &= ~PNL_CLOSED; - } - - if(pa->control & UI_PNL_UNSTOW) { - if(pa->flag & PNL_CLOSEDY) { - pa->flag &= ~PNL_CLOSED; - } - } -} -#endif - - static void ui_offset_panel_block(uiBlock *block) { uiStyle *style= U.uistyles.first; @@ -659,6 +630,10 @@ static int find_highest_panel(const void *a1, const void *a2) { const PanelSort *ps1=a1, *ps2=a2; + /* stick uppermost header-less panels to the top of the region - + * prevent them from being sorted */ + if (ps1->pa->sortorder < ps2->pa->sortorder && ps1->pa->type->flag & PNL_NO_HEADER) return -1; + if(ps1->pa->ofsy+ps1->pa->sizey < ps2->pa->ofsy+ps2->pa->sizey) return 1; else if(ps1->pa->ofsy+ps1->pa->sizey > ps2->pa->ofsy+ps2->pa->sizey) return -1; else if(ps1->pa->sortorder > ps2->pa->sortorder) return 1; @@ -802,7 +777,7 @@ void uiBeginPanels(const bContext *C, ARegion *ar) { Panel *pa; - /* set all panels as inactive, so that at the end we know + /* set all panels as inactive, so that at the end we know * which ones were used */ for(pa=ar->panels.first; pa; pa=pa->next) { if(pa->runtime_flag & PNL_ACTIVE) @@ -867,6 +842,8 @@ void uiEndPanels(const bContext *C, ARegion *ar) if(firstpa) firstpa->runtime_flag |= PNL_FIRST; + UI_ThemeClearColor(TH_BACK); + /* draw panels, selected on top */ for(block= ar->uiblocks.first; block; block=block->next) { if(block->active && block->panel && !(block->panel->flag & PNL_SELECT)) { @@ -957,7 +934,7 @@ static void ui_do_drag(const bContext *C, wmEvent *event, Panel *panel) /* this function is supposed to call general window drawing too */ /* also it supposes a block has panel, and isnt a menu */ -static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, int my) +static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, int my, int event) { ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); @@ -969,7 +946,11 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in /* XXX weak code, currently it assumes layout style for location of widgets */ /* check open/collapsed button */ - if(block->panel->flag & PNL_CLOSEDX) { + if(event==RETKEY) + button= 1; + else if(event==AKEY) + button= 1; + else if(block->panel->flag & PNL_CLOSEDX) { if(my >= block->maxy) button= 1; } else if(block->panel->control & UI_PNL_CLOSE) { @@ -1022,6 +1003,9 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in } } +/* XXX should become modal keymap */ +/* AKey is opening/closing panels, independent of button state now */ + int ui_handler_panel_region(bContext *C, wmEvent *event) { ARegion *ar= CTX_wm_region(C); @@ -1030,11 +1014,6 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) int retval, mx, my, inside_header= 0, inside_scale= 0, inside; retval= WM_UI_HANDLER_CONTINUE; - - /* buttons get priority */ - if(ui_button_is_active(ar)) - return retval; - for(block=ar->uiblocks.last; block; block=block->prev) { mx= event->x; my= event->y; @@ -1052,7 +1031,25 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) if(block->minx <= mx && block->maxx >= mx) if(block->miny <= my && block->maxy+PNL_HEADER >= my) inside= 1; - + + if(inside && event->val==KM_PRESS) { + if(event->type == AKEY && !ELEM4(1, event->ctrl, event->oskey, event->shift, event->alt)) { + + if(pa->flag & PNL_CLOSEDY) { + if((block->maxy <= my) && (block->maxy+PNL_HEADER >= my)) + ui_handle_panel_header(C, block, mx, my, event->type); + } + else + ui_handle_panel_header(C, block, mx, my, event->type); + + continue; + } + } + + /* on active button, do not handle panels */ + if(ui_button_is_active(ar)) + continue; + if(inside) { /* clicked at panel header? */ if(pa->flag & PNL_CLOSEDX) { @@ -1069,9 +1066,16 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) } if(event->val==KM_PRESS) { - if(event->type == LEFTMOUSE) { + /* open close on header */ + if(ELEM(event->type, RETKEY, PADENTER)) { if(inside_header) { - ui_handle_panel_header(C, block, mx, my); + ui_handle_panel_header(C, block, mx, my, RETKEY); + break; + } + } + else if(event->type == LEFTMOUSE) { + if(inside_header) { + ui_handle_panel_header(C, block, mx, my, 0); break; } else if(inside_scale && !(pa->flag & PNL_CLOSED)) { diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index bc03be84b65..f17a3371df1 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -30,10 +30,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_screen_types.h" -#include "DNA_view2d_types.h" #include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -413,6 +410,15 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop)); data->linedark[data->totline]= 1; data->totline++; + + if(but->rnapoin.id.data) { + ID *id= but->rnapoin.id.data; + if(id->lib && id->lib->name) { + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Library: %s", id->lib->name); + data->linedark[data->totline]= 1; + data->totline++; + } + } } else if (but->optype) { PointerRNA *opptr; @@ -447,10 +453,10 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) data->fstyle.align= UI_STYLE_TEXT_CENTER; uiStyleFontSet(&data->fstyle); - h= BLF_height(data->lines[0]); + h= BLF_height(data->fstyle.uifont_id, data->lines[0]); for(a=0, fontw=0, fonth=0; atotline; a++) { - w= BLF_width(data->lines[a]); + w= BLF_width(data->fstyle.uifont_id, data->lines[a]); fontw= MAX2(fontw, w); fonth += (a == 0)? h: h+5; } @@ -1553,12 +1559,21 @@ void ui_set_but_hsv(uiBut *but) } /* also used by small picker, be careful with name checks below... */ -void ui_update_block_buts_rgb(uiBlock *block, float *rgb) +void ui_update_block_buts_rgb(uiBlock *block, float *rgb, float *rhsv) { uiBut *bt; float hsv[3]; - rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); + /* this is to keep the H and S value when V is equal to zero + * and we are working in HSV mode, of course! + */ + if (rhsv) { + hsv[0]= rhsv[0]; + hsv[1]= rhsv[1]; + hsv[2]= rhsv[2]; + } + else + rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); // this updates button strings, is hackish... but button pointers are on stack of caller function for(bt= block->buttons.first; bt; bt= bt->next) { @@ -1568,9 +1583,24 @@ void ui_update_block_buts_rgb(uiBlock *block, float *rgb) } else if(strcmp(bt->str, "Hex: ")==0) { + float rgb_gamma[3]; + double intpart; char col[16]; - sprintf(col, "%02X%02X%02X", (unsigned int)(rgb[0]*255.0), (unsigned int)(rgb[1]*255.0), (unsigned int)(rgb[2]*255.0)); + /* Hex code is assumed to be in sRGB space (coming from other applications, web, etc) */ + + if (block->color_profile == BLI_PR_NONE) { + copy_v3_v3(rgb_gamma, rgb); + } else { + /* make an sRGB version, for Hex code */ + linearrgb_to_srgb_v3_v3(rgb_gamma, rgb); + } + + if (rgb_gamma[0] > 1.0f) rgb_gamma[0] = modf(rgb_gamma[0], &intpart); + if (rgb_gamma[1] > 1.0f) rgb_gamma[1] = modf(rgb_gamma[1], &intpart); + if (rgb_gamma[2] > 1.0f) rgb_gamma[2] = modf(rgb_gamma[2], &intpart); + + sprintf(col, "%02X%02X%02X", FTOCHAR(rgb_gamma[0]), FTOCHAR(rgb_gamma[1]), FTOCHAR(rgb_gamma[2])); strcpy(bt->poin, col); } @@ -1609,7 +1639,7 @@ static void do_picker_rna_cb(bContext *C, void *bt1, void *unused) if (prop) { RNA_property_float_get_array(&ptr, prop, rgb); - ui_update_block_buts_rgb(but->block, rgb); + ui_update_block_buts_rgb(but->block, rgb, NULL); } if(popup) @@ -1625,7 +1655,7 @@ static void do_hsv_rna_cb(bContext *C, void *bt1, void *hsv_arg) hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); - ui_update_block_buts_rgb(but->block, rgb); + ui_update_block_buts_rgb(but->block, rgb, hsv); if(popup) popup->menuretval= UI_RETURN_UPDATE; @@ -1640,7 +1670,13 @@ static void do_hex_rna_cb(bContext *C, void *bt1, void *hexcl) hex_to_rgb(hexcol, rgb, rgb+1, rgb+2); - ui_update_block_buts_rgb(but->block, rgb); + /* Hex code is assumed to be in sRGB space (coming from other applications, web, etc) */ + if (but->block->color_profile != BLI_PR_NONE) { + /* so we need to linearise it for Blender */ + srgb_to_linearrgb_v3_v3(rgb, rgb); + } + + ui_update_block_buts_rgb(but->block, rgb, NULL); if(popup) popup->menuretval= UI_RETURN_UPDATE; @@ -1662,6 +1698,13 @@ static void picker_new_hide_reveal(uiBlock *block, short colormode) /* tag buttons */ for(bt= block->buttons.first; bt; bt= bt->next) { + if (bt->type == LABEL) { + if( bt->str[1]=='G') { + if(colormode==2) bt->flag &= ~UI_HIDDEN; + else bt->flag |= UI_HIDDEN; + } + } + if(bt->type==NUMSLI || bt->type==TEX) { if( bt->str[1]=='e') { if(colormode==2) bt->flag &= ~UI_HIDDEN; @@ -1702,11 +1745,11 @@ static void circle_picker(uiBlock *block, PointerRNA *ptr, const char *propname) uiBut *bt; /* HS circle */ - bt= uiDefButR(block, HSVCIRCLE, 0, "", 0, 0, PICKER_H, PICKER_W, ptr, propname, -1, 0.0, 0.0, 0, 0, ""); + bt= uiDefButR(block, HSVCIRCLE, 0, "", 0, 0, PICKER_H, PICKER_W, ptr, propname, 0, 0.0, 0.0, 0, 0, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); /* value */ - bt= uiDefButR(block, HSVCUBE, 0, "", PICKER_W+PICKER_SPACE,0,PICKER_BAR,PICKER_H, ptr, propname, -1, 0.0, 0.0, UI_GRAD_V_ALT, 0, ""); + bt= uiDefButR(block, HSVCUBE, 0, "", PICKER_W+PICKER_SPACE,0,PICKER_BAR,PICKER_H, ptr, propname, 0, 0.0, 0.0, UI_GRAD_V_ALT, 0, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); } @@ -1717,11 +1760,11 @@ static void square_picker(uiBlock *block, PointerRNA *ptr, const char *propname, int bartype = type + 3; /* HS square */ - bt= uiDefButR(block, HSVCUBE, 0, "", 0, PICKER_BAR+PICKER_SPACE, PICKER_TOTAL_W, PICKER_H, ptr, propname, -1, 0.0, 0.0, type, 0, ""); + bt= uiDefButR(block, HSVCUBE, 0, "", 0, PICKER_BAR+PICKER_SPACE, PICKER_TOTAL_W, PICKER_H, ptr, propname, 0, 0.0, 0.0, type, 0, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); /* value */ - bt= uiDefButR(block, HSVCUBE, 0, "", 0, 0, PICKER_TOTAL_W, PICKER_BAR, ptr, propname, -1, 0.0, 0.0, bartype, 0, ""); + bt= uiDefButR(block, HSVCUBE, 0, "", 0, 0, PICKER_TOTAL_W, PICKER_BAR, ptr, propname, 0, 0.0, 0.0, bartype, 0, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); } @@ -1735,17 +1778,27 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR static char tip[50]; static float hsv[3]; static char hexcol[128]; + float rgb_gamma[3]; + float min, max, step, precision; const char *propname = RNA_property_identifier(prop); width= PICKER_TOTAL_W; butwidth = width - UI_UNIT_X - 10; /* existence of profile means storage is in linear colour space, with display correction */ - if (block->color_profile == BLI_PR_NONE) + if (block->color_profile == BLI_PR_NONE) { sprintf(tip, "Value in Display Color Space"); - else + copy_v3_v3(rgb_gamma, rgb); + } else { sprintf(tip, "Value in Linear RGB Color Space"); + /* make an sRGB version, for Hex code */ + linearrgb_to_srgb_v3_v3(rgb_gamma, rgb); + } + /* sneaky way to check for alpha */ + rgb[3]= FLT_MAX; + + RNA_property_float_ui_range(ptr, prop, &min, &max, &step, &precision); RNA_property_float_get_array(ptr, prop, rgb); rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); @@ -1779,13 +1832,14 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR /* RGB values */ uiBlockBeginAlign(block); - bt= uiDefButR(block, NUMSLI, 0, "R ", 0, -60, butwidth, UI_UNIT_Y, ptr, propname, 0, 0.0, 0.0, 0, 0, ""); + bt= uiDefButR(block, NUMSLI, 0, "R ", 0, -60, butwidth, UI_UNIT_Y, ptr, propname, 0, 0.0, 0.0, 0, 3, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); - bt= uiDefButR(block, NUMSLI, 0, "G ", 0, -80, butwidth, UI_UNIT_Y, ptr, propname, 1, 0.0, 0.0, 0, 0, ""); + bt= uiDefButR(block, NUMSLI, 0, "G ", 0, -80, butwidth, UI_UNIT_Y, ptr, propname, 1, 0.0, 0.0, 0, 3, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); - bt= uiDefButR(block, NUMSLI, 0, "B ", 0, -100, butwidth, UI_UNIT_Y, ptr, propname, 2, 0.0, 0.0, 0, 0, ""); + bt= uiDefButR(block, NUMSLI, 0, "B ", 0, -100, butwidth, UI_UNIT_Y, ptr, propname, 2, 0.0, 0.0, 0, 3, ""); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); - // could use uiItemFullR(col, "", 0, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER); + + // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", 0); // but need to use uiButSetFunc for updating other fake buttons /* HSV values */ @@ -1794,15 +1848,25 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR uiButSetFunc(bt, do_hsv_rna_cb, bt, hsv); bt= uiDefButF(block, NUMSLI, 0, "S ", 0, -80, butwidth, UI_UNIT_Y, hsv+1, 0.0, 1.0, 10, 3, ""); uiButSetFunc(bt, do_hsv_rna_cb, bt, hsv); - bt= uiDefButF(block, NUMSLI, 0, "V ", 0, -100, butwidth, UI_UNIT_Y, hsv+2, 0.0, 1.0, 10, 3, ""); + bt= uiDefButF(block, NUMSLI, 0, "V ", 0, -100, butwidth, UI_UNIT_Y, hsv+2, 0.0, max, 10, 3, ""); uiButSetFunc(bt, do_hsv_rna_cb, bt, hsv); uiBlockEndAlign(block); - + + if(rgb[3] != FLT_MAX) { + bt= uiDefButR(block, NUMSLI, 0, "A ", 0, -120, butwidth, UI_UNIT_Y, ptr, propname, 3, 0.0, 0.0, 0, 0, ""); + uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + } + else { + rgb[3]= 1.0f; + } + rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); - sprintf(hexcol, "%02X%02X%02X", (unsigned int)(rgb[0]*255.0), (unsigned int)(rgb[1]*255.0), (unsigned int)(rgb[2]*255.0)); + + sprintf(hexcol, "%02X%02X%02X", FTOCHAR(rgb_gamma[0]), FTOCHAR(rgb_gamma[1]), FTOCHAR(rgb_gamma[2])); bt= uiDefBut(block, TEX, 0, "Hex: ", 0, -60, butwidth, UI_UNIT_Y, hexcol, 0, 8, 0, 0, "Hex triplet for color (#RRGGBB)"); uiButSetFunc(bt, do_hex_rna_cb, bt, hexcol); + uiDefBut(block, LABEL, 0, "(Gamma Corrected)", 0, -80, butwidth, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); picker_new_hide_reveal(block, colormode); } @@ -1833,7 +1897,7 @@ static int ui_picker_small_wheel(const bContext *C, uiBlock *block, wmEvent *eve ui_set_but_vectorf(but, col); - ui_update_block_buts_rgb(block, col); + ui_update_block_buts_rgb(block, col, NULL); if(popup) popup->menuretval= UI_RETURN_UPDATE; @@ -2054,13 +2118,13 @@ uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut pup->mx= window->eventstate->x; pup->my= window->eventstate->y; pup->popup= 1; + pup->block->flag |= UI_BLOCK_NO_FLIP; } if(str) { /* menu is created from a string */ pup->menu_func= ui_block_func_MENUSTR; pup->menu_arg= str; - // XXX pup->block->flag |= UI_BLOCK_NO_FLIP; } else { /* menu is created from a callback */ @@ -2264,7 +2328,7 @@ void uiPupMenuReports(bContext *C, ReportList *reports) ds= BLI_dynstr_new(); for(report=reports->list.first; report; report=report->next) { - if(report->type <= reports->printlevel) + if(report->type < reports->printlevel) ; /* pass */ else if(report->type >= RPT_ERROR) BLI_dynstr_appendf(ds, "Error %%i%d%%t|%s", ICON_ERROR, report->message); diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c index 777fb7806ad..e3317e5598f 100644 --- a/source/blender/editors/interface/interface_style.c +++ b/source/blender/editors/interface/interface_style.c @@ -30,10 +30,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_listbase.h" @@ -50,13 +48,8 @@ #include "BLF_api.h" #include "UI_interface.h" -#include "UI_interface_icons.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "ED_datafiles.h" -#include "ED_util.h" -#include "ED_types.h" #include "interface_intern.h" @@ -154,34 +147,34 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str) uiStyleFontSet(fs); - height= BLF_height("2"); /* correct offset is on baseline, the j is below that */ + height= BLF_height(fs->uifont_id, "2"); /* correct offset is on baseline, the j is below that */ yofs= floor( 0.5f*(rect->ymax - rect->ymin - height)); if(fs->align==UI_STYLE_TEXT_CENTER) - xofs= floor( 0.5f*(rect->xmax - rect->xmin - BLF_width(str))); + xofs= floor( 0.5f*(rect->xmax - rect->xmin - BLF_width(fs->uifont_id, str))); else if(fs->align==UI_STYLE_TEXT_RIGHT) - xofs= rect->xmax - rect->xmin - BLF_width(str) - 1; + xofs= rect->xmax - rect->xmin - BLF_width(fs->uifont_id, str) - 1; /* clip is very strict, so we give it some space */ - BLF_clipping(rect->xmin-1, rect->ymin-4, rect->xmax+1, rect->ymax+4); - BLF_enable(BLF_CLIPPING); - BLF_position(rect->xmin+xofs, rect->ymin+yofs, 0.0f); + BLF_clipping(fs->uifont_id, rect->xmin-1, rect->ymin-4, rect->xmax+1, rect->ymax+4); + BLF_enable(fs->uifont_id, BLF_CLIPPING); + BLF_position(fs->uifont_id, rect->xmin+xofs, rect->ymin+yofs, 0.0f); if (fs->shadow) { - BLF_enable(BLF_SHADOW); - BLF_shadow(fs->shadow, fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha); - BLF_shadow_offset(fs->shadx, fs->shady); + BLF_enable(fs->uifont_id, BLF_SHADOW); + BLF_shadow(fs->uifont_id, fs->shadow, fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha); + BLF_shadow_offset(fs->uifont_id, fs->shadx, fs->shady); } if (fs->kerning == 1) - BLF_enable(BLF_KERNING_DEFAULT); + BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT); - BLF_draw(str); - BLF_disable(BLF_CLIPPING); + BLF_draw(fs->uifont_id, str); + BLF_disable(fs->uifont_id, BLF_CLIPPING); if (fs->shadow) - BLF_disable(BLF_SHADOW); + BLF_disable(fs->uifont_id, BLF_SHADOW); if (fs->kerning == 1) - BLF_disable(BLF_KERNING_DEFAULT); + BLF_disable(fs->uifont_id, BLF_KERNING_DEFAULT); } /* drawn same as above, but at 90 degree angle */ @@ -194,7 +187,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str) uiStyleFontSet(fs); - height= BLF_height("2"); /* correct offset is on baseline, the j is below that */ + height= BLF_height(fs->uifont_id, "2"); /* correct offset is on baseline, the j is below that */ /* becomes x-offset when rotated */ xofs= floor( 0.5f*(rect->ymax - rect->ymin - height)) + 1; @@ -202,7 +195,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str) /* rotate counter-clockwise for now (assumes left-to-right language)*/ xofs+= height; - yofs= BLF_width(str) + 5; + yofs= BLF_width(fs->uifont_id, str) + 5; angle= 90.0f; /* translate rect to vertical */ @@ -213,29 +206,29 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str) /* clip is very strict, so we give it some space */ /* clipping is done without rotation, so make rect big enough to contain both positions */ - BLF_clipping(txtrect.xmin-1, txtrect.ymin-yofs-xofs-4, rect->xmax+1, rect->ymax+4); - BLF_enable(BLF_CLIPPING); - BLF_position(txtrect.xmin+xofs, txtrect.ymax-yofs, 0.0f); + BLF_clipping(fs->uifont_id, txtrect.xmin-1, txtrect.ymin-yofs-xofs-4, rect->xmax+1, rect->ymax+4); + BLF_enable(fs->uifont_id, BLF_CLIPPING); + BLF_position(fs->uifont_id, txtrect.xmin+xofs, txtrect.ymax-yofs, 0.0f); - BLF_enable(BLF_ROTATION); - BLF_rotation(angle); + BLF_enable(fs->uifont_id, BLF_ROTATION); + BLF_rotation(fs->uifont_id, angle); if (fs->shadow) { - BLF_enable(BLF_SHADOW); - BLF_shadow(fs->shadow, fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha); - BLF_shadow_offset(fs->shadx, fs->shady); + BLF_enable(fs->uifont_id, BLF_SHADOW); + BLF_shadow(fs->uifont_id, fs->shadow, fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha); + BLF_shadow_offset(fs->uifont_id, fs->shadx, fs->shady); } if (fs->kerning == 1) - BLF_enable(BLF_KERNING_DEFAULT); + BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT); - BLF_draw(str); - BLF_disable(BLF_ROTATION); - BLF_disable(BLF_CLIPPING); + BLF_draw(fs->uifont_id, str); + BLF_disable(fs->uifont_id, BLF_ROTATION); + BLF_disable(fs->uifont_id, BLF_CLIPPING); if (fs->shadow) - BLF_disable(BLF_SHADOW); + BLF_disable(fs->uifont_id, BLF_SHADOW); if (fs->kerning == 1) - BLF_disable(BLF_KERNING_DEFAULT); + BLF_disable(fs->uifont_id, BLF_KERNING_DEFAULT); } /* ************** helpers ************************ */ @@ -244,9 +237,19 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str) int UI_GetStringWidth(char *str) { uiStyle *style= U.uistyles.first; + uiFontStyle *fstyle= &style->widget; + int width; - uiStyleFontSet(&style->widget); - return BLF_width(str); + if (fstyle->kerning==1) /* for BLF_width */ + BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + + uiStyleFontSet(fstyle); + width= BLF_width(fstyle->uifont_id, str); + + if (fstyle->kerning==1) + BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + + return width; } /* temporarily, does widget font */ @@ -255,8 +258,8 @@ void UI_DrawString(float x, float y, char *str) uiStyle *style= U.uistyles.first; uiStyleFontSet(&style->widget); - BLF_position(x, y, 0.0f); - BLF_draw(str); + BLF_position(style->widget.uifont_id, x, y, 0.0f); + BLF_draw(style->widget.uifont_id, str); } /* ************** init exit ************************ */ @@ -296,14 +299,13 @@ void uiStyleInit(void) printf("uiStyleInit error, no fonts available\n"); } else { - BLF_set(font->blf_id); /* ? just for speed to initialize? * Yes, this build the glyph cache and create * the texture. */ - BLF_size(11, U.dpi); - BLF_size(12, U.dpi); - BLF_size(14, U.dpi); + BLF_size(font->blf_id, 11, U.dpi); + BLF_size(font->blf_id, 12, U.dpi); + BLF_size(font->blf_id, 14, U.dpi); } } @@ -316,7 +318,6 @@ void uiStyleFontSet(uiFontStyle *fs) { uiFont *font= uifont_to_blfont(fs->uifont_id); - BLF_set(font->blf_id); - BLF_size(fs->points, U.dpi); + BLF_size(font->blf_id, fs->points, U.dpi); } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index e3dac41979d..f951def739f 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -28,9 +28,9 @@ #include "MEM_guardedalloc.h" -#include "DNA_color_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" +#include "DNA_userdef_types.h" +#include "DNA_windowmanager_types.h" #include "BLI_string.h" @@ -40,7 +40,9 @@ #include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" +#include "BKE_texture.h" #include "BKE_utildefines.h" +#include "BKE_report.h" #include "ED_screen.h" #include "ED_render.h" @@ -51,9 +53,10 @@ #include "WM_types.h" #include "UI_interface.h" -#include "UI_resources.h" #include "interface_intern.h" +#include "BLF_api.h" + void ui_template_fix_linking() { } @@ -78,52 +81,56 @@ void uiTemplateDopeSheetFilter(uiLayout *layout, bContext *C, PointerRNA *ptr) uiLayout *row= layout; short nlaActive= ((sa) && (sa->spacetype==SPACE_NLA)); - /* more 'generic' filtering options */ + /* most 'generic' filtering options */ row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "only_selected", 0); - uiItemR(row, "", 0, ptr, "display_transforms", 0); // xxx: include in another position instead? + uiItemR(row, ptr, "only_selected", 0, "", 0); + uiItemR(row, ptr, "display_hidden", 0, "", 0); + + /* object-level filtering options */ + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "display_transforms", 0, "", 0); if (nlaActive) - uiItemR(row, "", 0, ptr, "include_missing_nla", 0); + uiItemR(row, ptr, "include_missing_nla", 0, "", 0); /* datatype based - only available datatypes are shown */ row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "display_scene", 0); - uiItemR(row, "", 0, ptr, "display_world", 0); - uiItemR(row, "", 0, ptr, "display_node", 0); + uiItemR(row, ptr, "display_scene", 0, "", 0); + uiItemR(row, ptr, "display_world", 0, "", 0); + uiItemR(row, ptr, "display_node", 0, "", 0); if (mainptr && mainptr->mesh.first) - uiItemR(row, "", 0, ptr, "display_mesh", 0); + uiItemR(row, ptr, "display_mesh", 0, "", 0); if (mainptr && mainptr->key.first) - uiItemR(row, "", 0, ptr, "display_shapekeys", 0); + uiItemR(row, ptr, "display_shapekeys", 0, "", 0); if (mainptr && mainptr->mat.first) - uiItemR(row, "", 0, ptr, "display_material", 0); + uiItemR(row, ptr, "display_material", 0, "", 0); if (mainptr && mainptr->lamp.first) - uiItemR(row, "", 0, ptr, "display_lamp", 0); + uiItemR(row, ptr, "display_lamp", 0, "", 0); if (mainptr && mainptr->tex.first) - uiItemR(row, "", 0, ptr, "display_texture", 0); + uiItemR(row, ptr, "display_texture", 0, "", 0); if (mainptr && mainptr->camera.first) - uiItemR(row, "", 0, ptr, "display_camera", 0); + uiItemR(row, ptr, "display_camera", 0, "", 0); if (mainptr && mainptr->curve.first) - uiItemR(row, "", 0, ptr, "display_curve", 0); + uiItemR(row, ptr, "display_curve", 0, "", 0); if (mainptr && mainptr->mball.first) - uiItemR(row, "", 0, ptr, "display_metaball", 0); + uiItemR(row, ptr, "display_metaball", 0, "", 0); if (mainptr && mainptr->armature.first) - uiItemR(row, "", 0, ptr, "display_armature", 0); + uiItemR(row, ptr, "display_armature", 0, "", 0); if (mainptr && mainptr->particle.first) - uiItemR(row, "", 0, ptr, "display_particle", 0); + uiItemR(row, ptr, "display_particle", 0, "", 0); /* group-based filtering (only when groups are available */ if (mainptr && mainptr->group.first) { row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "only_group_objects", 0); + uiItemR(row, ptr, "only_group_objects", 0, "", 0); /* if enabled, show the group selection field too */ if (RNA_boolean_get(ptr, "only_group_objects")) - uiItemR(row, "", 0, ptr, "filtering_group", 0); + uiItemR(row, ptr, "filtering_group", 0, "", 0); } } @@ -135,6 +142,8 @@ typedef struct TemplateID { ListBase *idlb; int prv_rows, prv_cols; + + char filterop[64]; } TemplateID; /* Search browse menu, assign */ @@ -164,8 +173,52 @@ static void id_search_cb(const bContext *C, void *arg_template, char *str, uiSea /* ID listbase */ for(id= lb->first; id; id= id->next) { if(!((flag & PROP_ID_SELF_CHECK) && id == id_from)) { + int filter_yes; + + filter_yes= 0; + + /* use filter */ + if (template->filterop[0] != 0) { + PointerRNA ptr; + ReportList reports; + FunctionRNA *func; + ParameterList parms; + + RNA_id_pointer_create(id, &ptr); + + BKE_reports_init(&reports, RPT_PRINT); + + func= RNA_struct_find_function(&ptr, template->filterop); + + if (func) { + RNA_parameter_list_create(&parms, &ptr, func); + + RNA_parameter_set_lookup(&parms, "context", &C); + + if (RNA_function_call(C, &reports, &ptr, func, &parms) == 0) { + int* ret; + RNA_parameter_get_lookup(&parms, "ret", (void **)&ret); + + if (!(*ret)) { + RNA_parameter_list_free(&parms); + continue; + } + else { + filter_yes= 1; + } + } + + RNA_parameter_list_free(&parms); + } + } + + /* hide dot-datablocks, but only if filter does not force it visible */ + if(!filter_yes && U.uiflag & USER_HIDE_DOT) + if ((id->name[2]=='.') && (str[0] != '.')) + continue; + if(BLI_strcasestr(id->name+2, str)) { - iconid= ui_id_icon_get((bContext*)C, id, 0); + iconid= ui_id_icon_get((bContext*)C, id, 1); if(!uiSearchItemAdd(items, id->name+2, id, iconid)) break; @@ -328,7 +381,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event) } } -static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, char *newop, char *openop, char *unlinkop) +static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, char *newop, char *openop, char *unlinkop, char *filterop) { uiBut *but; uiBlock *block; @@ -420,7 +473,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str int w= id?UI_UNIT_X: (flag & UI_ID_OPEN)? UI_UNIT_X*3: UI_UNIT_X*6; if(newop) { - but= uiDefIconTextButO(block, BUT, newop, WM_OP_EXEC_DEFAULT, ICON_ZOOMIN, (id)? "": "New", 0, 0, w, UI_UNIT_Y, NULL); + but= uiDefIconTextButO(block, BUT, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, (id)? "": "New", 0, 0, w, UI_UNIT_Y, NULL); uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW)); } else { @@ -468,7 +521,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str uiBlockEndAlign(block); } -static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int flag, int prv_rows, int prv_cols) +static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, char* filterop, int flag, int prv_rows, int prv_cols) { TemplateID *template; PropertyRNA *prop; @@ -486,40 +539,44 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char template->prop= prop; template->prv_rows = prv_rows; template->prv_cols = prv_cols; - + + if (filterop) + BLI_strncpy(template->filterop, filterop, sizeof(template->filterop)); + else + template->filterop[0] = 0; + if(newop) flag |= UI_ID_ADD_NEW; if(openop) flag |= UI_ID_OPEN; type= RNA_property_pointer_type(ptr, prop); - template->idlb= wich_libbase(CTX_data_main(C), RNA_type_to_ID_code(type)); + template->idlb= which_libbase(CTX_data_main(C), RNA_type_to_ID_code(type)); /* create UI elements for this template * - template_ID makes a copy of the template data and assigns it to the relevant buttons */ if(template->idlb) { uiLayoutRow(layout, 1); - template_ID(C, layout, template, type, flag, newop, openop, unlinkop); + template_ID(C, layout, template, type, flag, newop, openop, unlinkop, filterop); } MEM_freeN(template); - } -void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop) +void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, char *filterop) { - ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE, 0, 0); + ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, filterop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE, 0, 0); } -void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop) +void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, char *filterop) { - ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME, 0, 0); + ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, filterop, UI_ID_BROWSE|UI_ID_RENAME, 0, 0); } -void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int rows, int cols) +void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, char *filterop, int rows, int cols) { - ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE|UI_ID_PREVIEWS, rows, cols); + ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, filterop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE|UI_ID_PREVIEWS, rows, cols); } /************************ ID Chooser Template ***************************/ @@ -558,10 +615,10 @@ void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn /* ID-Type Selector - just have a menu of icons */ // FIXME: the icon-only setting doesn't work when we supply a blank name - uiItemFullR(row, "", 0, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY); + uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", 0); /* ID-Block Selector - just use pointer widget... */ - uiItemFullR(row, "", 0, ptr, propID, 0, 0, 0); + uiItemFullR(row, ptr, propID, 0, 0, 0, "", 0); } /********************* RNA Path Builder Template ********************/ @@ -590,7 +647,7 @@ void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char row= uiLayoutRow(layout, 1); /* Path (existing string) Widget */ - uiItemR(row, text, ICON_RNA, ptr, propname, 0); + uiItemR(row, ptr, propname, 0, text, ICON_RNA); // TODO: attach something to this to make allow searching of nested properties to 'build' the path } @@ -602,9 +659,6 @@ void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char #include #include "DNA_object_force.h" -#include "DNA_object_types.h" -#include "DNA_modifier_types.h" -#include "DNA_scene_types.h" #include "BKE_depsgraph.h" #include "BKE_DerivedMesh.h" @@ -614,7 +668,6 @@ void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char #include "BKE_particle.h" #include "BKE_report.h" -#include "UI_resources.h" #include "ED_util.h" #include "BLI_math.h" @@ -721,7 +774,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif uiBlockSetEmboss(block, UI_EMBOSSN); /* Open/Close ................................. */ - uiItemR(row, "", 0, &ptr, "expanded", 0); + uiItemR(row, &ptr, "expanded", 0, "", 0); /* modifier-type icon */ uiItemL(row, "", RNA_struct_ui_icon(ptr.type)); @@ -741,7 +794,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif block = uiLayoutGetBlock(row); /* modifier name */ - uiItemR(row, "", 0, &ptr, "name", 0); + uiItemR(row, &ptr, "name", 0, "", 0); if (compact) { /* insert delete button at end of top row before splitting to second line */ @@ -763,11 +816,11 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) && (md->type!=eModifierType_Surface) ) { - uiItemR(row, "", 0, &ptr, "render", 0); - uiItemR(row, "", 0, &ptr, "realtime", 0); + uiItemR(row, &ptr, "render", 0, "", 0); + uiItemR(row, &ptr, "realtime", 0, "", 0); if (mti->flags & eModifierTypeFlag_SupportsEditmode) - uiItemR(row, "", 0, &ptr, "editmode", 0); + uiItemR(row, &ptr, "editmode", 0, "", 0); } if ((ob->type==OB_MESH) && modifier_couldBeCage(scene, md) && (index <= lastCageIndex)) { @@ -805,9 +858,9 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif uiBlockSetButLock(block, object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if (md->type==eModifierType_ParticleSystem) { - ParticleSystem *psys= ((ParticleSystemModifierData *)md)->psys; + ParticleSystem *psys= ((ParticleSystemModifierData *)md)->psys; - if (!(ob->mode & OB_MODE_PARTICLE_EDIT) && psys->pathcache) { + if (!(ob->mode & OB_MODE_PARTICLE_EDIT) && psys->pathcache) { if(ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB)) uiItemO(row, "Convert", 0, "OBJECT_OT_duplicates_make_real"); else if(psys->part->ren_as == PART_DRAW_PATH) @@ -815,10 +868,11 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif } } else { - uiItemEnumO(row, "Apply", 0, "OBJECT_OT_modifier_apply", "apply_as", MODIFIER_APPLY_DATA); + uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT); + uiItemEnumO(row, "OBJECT_OT_modifier_apply", "Apply", 0, "apply_as", MODIFIER_APPLY_DATA); if (modifier_sameTopology(md)) - uiItemEnumO(row, "Apply as Shape", 0, "OBJECT_OT_modifier_apply", "apply_as", MODIFIER_APPLY_SHAPE); + uiItemEnumO(row, "OBJECT_OT_modifier_apply", "Apply as Shape", 0, "apply_as", MODIFIER_APPLY_SHAPE); } uiBlockClearButLock(block); @@ -884,7 +938,6 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr, int /************************ Constraint Template *************************/ -#include "DNA_action_types.h" #include "DNA_constraint_types.h" #include "BKE_action.h" @@ -939,88 +992,15 @@ static void constraint_active_func(bContext *C, void *ob_v, void *con_v) ED_object_constraint_set_active(ob_v, con_v); } - -/* some commonly used macros in the constraints drawing code */ -#define is_armature_target(target) (target && target->type==OB_ARMATURE) -#define is_armature_owner(ob) ((ob->type == OB_ARMATURE) && (ob->mode & OB_MODE_POSE)) -#define is_geom_target(target) (target && (ELEM(target->type, OB_MESH, OB_LATTICE)) ) - -/* Helper function for draw constraint - draws constraint space stuff - * This function should not be called if no menus are required - * owner/target: -1 = don't draw menu; 0= not posemode, 1 = posemode - */ -static void draw_constraint_spaceselect (uiBlock *block, bConstraint *con, short xco, short yco, short owner, short target) -{ - short tarx, ownx, iconx; - short bwidth; - short iconwidth = 20; - - /* calculate sizes and placement of menus */ - if (owner == -1) { - bwidth = 125; - tarx = 120; - ownx = 0; - } - else if (target == -1) { - bwidth = 125; - tarx = 0; - ownx = 120; - } - else { - bwidth = 100; - tarx = 85; - iconx = tarx + bwidth + 5; - ownx = tarx + bwidth + iconwidth + 10; - } - - - uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Convert:", xco, yco, 80,18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - - /* Target-Space */ - if (target == 1) { - uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Pose Space %x2|Local with Parent %x3|Local Space %x1", - tarx, yco, bwidth, 18, &con->tarspace, 0, 0, 0, 0, "Choose space that target is evaluated in"); - } - else if (target == 0) { - uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Local (Without Parent) Space %x1", - tarx, yco, bwidth, 18, &con->tarspace, 0, 0, 0, 0, "Choose space that target is evaluated in"); - } - - if ((target != -1) && (owner != -1)) - uiDefIconBut(block, LABEL, 0, ICON_ARROW_LEFTRIGHT, - iconx, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, ""); - - /* Owner-Space */ - if (owner == 1) { - uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Owner Space %t|World Space %x0|Pose Space %x2|Local with Parent %x3|Local Space %x1", - ownx, yco, bwidth, 18, &con->ownspace, 0, 0, 0, 0, "Choose space that owner is evaluated in"); - } - else if (owner == 0) { - uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Owner Space %t|World Space %x0|Local (Without Parent) Space %x1", - ownx, yco, bwidth, 18, &con->ownspace, 0, 0, 0, 0, "Choose space that owner is evaluated in"); - } -} - -static void test_obpoin_but(bContext *C, char *name, ID **idpp) -{ - ID *id= BLI_findstring(&CTX_data_main(C)->object, name, offsetof(ID, name) + 2); - *idpp= id; /* can be NULL */ - - if(id) - id_lib_extern(id); /* checks lib data, sets correct flag for saving then */ -} - /* draw panel showing settings for a constraint */ -static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con) +static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con, int compact) { bPoseChannel *pchan= get_active_posechannel(ob); bConstraintTypeInfo *cti; uiBlock *block; uiLayout *result= NULL, *col, *box, *row, *subrow; - uiBut *but; PointerRNA ptr; char typestr[32]; - short width = 265; short proxy_protected, xco=0, yco=0; int rb_col; @@ -1053,38 +1033,30 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con) uiLayoutSetContextPointer(col, "constraint", &ptr); box= uiLayoutBox(col); - row= uiLayoutRow(box, 0); - + row = uiLayoutRow(box, 0); block= uiLayoutGetBlock(box); - subrow= uiLayoutRow(row, 0); - uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT); - /* Draw constraint header */ - uiBlockSetEmboss(block, UI_EMBOSSN); /* rounded header */ rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; - + /* open/close */ - uiItemR(subrow, "", 0, &ptr, "expanded", UI_ITEM_R_ICON_ONLY); - - /* name */ + uiBlockSetEmboss(block, UI_EMBOSSN); + uiItemR(row, &ptr, "expanded", UI_ITEM_R_ICON_ONLY, "", 0); uiBlockSetEmboss(block, UI_EMBOSS); /* XXX if (con->flag & CONSTRAINT_DISABLE) uiBlockSetCol(block, TH_REDALERT);*/ + /* name */ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, xco+10, yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - + if(proxy_protected == 0) { - uiItemR(subrow, "", 0, &ptr, "name", 0); + uiItemR(row, &ptr, "name", 0, "", 0); } else - uiItemL(subrow, con->name, 0); - - subrow= uiLayoutRow(row, 0); - uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT); + uiItemL(row, con->name, 0); /* proxy-protected constraints cannot be edited, so hide up/down + close buttons */ if (proxy_protected) { @@ -1118,31 +1090,43 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con) show_upbut= ((prev_proxylock == 0) && (con->prev)); show_downbut= (con->next) ? 1 : 0; + + /* Code for compact Constraint UI */ + if (compact) { + subrow = uiLayoutRow(box, 0); + } + else { + subrow = row; + } + uiLayoutSetOperatorContext(subrow, WM_OP_INVOKE_DEFAULT); + + /* up/down */ if (show_upbut || show_downbut) { uiBlockBeginAlign(block); - uiBlockSetEmboss(block, UI_EMBOSS); + if (show_upbut) + uiItemO(subrow, "", ICON_TRIA_UP, "CONSTRAINT_OT_move_up"); - if (show_upbut) - uiDefIconButO(block, BUT, "CONSTRAINT_OT_move_up", WM_OP_INVOKE_DEFAULT, ICON_TRIA_UP, xco+width-50, yco, 16, 18, "Move constraint up in constraint stack"); - - if (show_downbut) - uiDefIconButO(block, BUT, "CONSTRAINT_OT_move_down", WM_OP_INVOKE_DEFAULT, ICON_TRIA_DOWN, xco+width-50+18, yco, 16, 18, "Move constraint down in constraint stack"); + if (show_downbut) + uiItemO(subrow, "", ICON_TRIA_DOWN, "CONSTRAINT_OT_move_down"); uiBlockEndAlign(block); } - + + /* enabled */ + uiItemR(subrow, &ptr, "enabled", 0, "", 0); + + uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT); + /* Close 'button' - emboss calls here disable drawing of 'button' behind X */ uiBlockSetEmboss(block, UI_EMBOSSN); - uiDefIconButBitS(block, ICONTOGN, CONSTRAINT_OFF, B_CONSTRAINT_TEST, ICON_CHECKBOX_DEHLT, xco+243, yco, 19, 19, &con->flag, 0.0, 0.0, 0.0, 0.0, "enable/disable constraint"); - - uiDefIconButO(block, BUT, "CONSTRAINT_OT_delete", WM_OP_INVOKE_DEFAULT, ICON_X, xco+262, yco, 19, 19, "Delete constraint"); + uiItemO(row, "", ICON_X, "CONSTRAINT_OT_delete"); uiBlockSetEmboss(block, UI_EMBOSS); } - + /* Set but-locks for protected settings (magic numbers are used here!) */ if (proxy_protected) uiBlockSetButLock(block, 1, "Cannot edit Proxy-Protected Constraint"); - + /* Draw constraint data */ if ((con->flag & CONSTRAINT_EXPAND) == 0) { (yco) -= 21; @@ -1150,108 +1134,16 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con) else { box= uiLayoutBox(col); block= uiLayoutAbsoluteBlock(box); - - switch (con->type) { -#ifndef DISABLE_PYTHON - case CONSTRAINT_TYPE_PYTHON: - { - bPythonConstraint *data = con->data; - bConstraintTarget *ct; - // uiBut *but2; - int tarnum, theight; - // static int pyconindex=0; - // char *menustr; - - theight = (data->tarnum)? (data->tarnum * 38) : (38); - - uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Script:", xco+60, yco-24, 55, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - - /* do the scripts menu */ - /* XXX menustr = buildmenu_pyconstraints(data->text, &pyconindex); - but2 = uiDefButI(block, MENU, B_CONSTRAINT_TEST, menustr, - xco+120, yco-24, 150, 20, &pyconindex, - 0, 0, 0, 0, "Set the Script Constraint to use"); - uiButSetFunc(but2, validate_pyconstraint_cb, data, &pyconindex); - MEM_freeN(menustr); */ - - /* draw target(s) */ - if (data->flag & PYCON_USETARGETS) { - /* Draw target parameters */ - for (ct=data->targets.first, tarnum=1; ct; ct=ct->next, tarnum++) { - char tarstr[32]; - short yoffset= ((tarnum-1) * 38); - - /* target label */ - sprintf(tarstr, "Target %d:", tarnum); - uiDefBut(block, LABEL, B_CONSTRAINT_TEST, tarstr, xco+45, yco-(48+yoffset), 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - - /* target space-selector - per target */ - if (is_armature_target(ct->tar)) { - uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Pose Space %x3|Local with Parent %x4|Local Space %x1", - xco+10, yco-(66+yoffset), 100, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in"); - } - else { - uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Local (Without Parent) Space %x1", - xco+10, yco-(66+yoffset), 100, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in"); - } - - uiBlockBeginAlign(block); - /* target object */ - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", xco+120, yco-(48+yoffset), 150, 18, &ct->tar, "Target Object"); - - /* subtarget */ - if (is_armature_target(ct->tar)) { - but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", xco+120, yco-(66+yoffset),150,18, &ct->subtarget, 0, 24, 0, 0, "Subtarget Bone"); - //uiButSetCompleteFunc(but, autocomplete_bone, (void *)ct->tar); - } - else if (is_geom_target(ct->tar)) { - but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", xco+120, yco-(66+yoffset),150,18, &ct->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points"); - //uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ct->tar); - } - else { - strcpy(ct->subtarget, ""); - } - uiBlockEndAlign(block); - } - } - else { - /* Draw indication that no target needed */ - uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", xco+60, yco-48, 55, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Not Applicable", xco+120, yco-48, 150, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); - } - - /* settings */ - uiBlockBeginAlign(block); - but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Options", xco, yco-(52+theight), (width/2),18, NULL, 0, 24, 0, 0, "Change some of the constraint's settings."); - // XXX uiButSetFunc(but, BPY_pyconstraint_settings, data, NULL); - - but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Refresh", xco+((width/2)+10), yco-(52+theight), (width/2),18, NULL, 0, 24, 0, 0, "Force constraint to refresh it's settings"); - uiBlockEndAlign(block); - - /* constraint space settings */ - draw_constraint_spaceselect(block, con, xco, yco-(73+theight), is_armature_owner(ob), -1); - } - break; -#endif - - case CONSTRAINT_TYPE_NULL: - { - uiItemL(box, "", 0); - } - break; - default: - result= box; - break; + result= box; } - } - + /* clear any locks set up for proxies/lib-linking */ uiBlockClearButLock(block); return result; } -uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) +uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr, int compact) { Object *ob; bConstraint *con; @@ -1279,7 +1171,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) return NULL; } - return draw_constraint(layout, ob, con); + return draw_constraint(layout, ob, con, compact); } @@ -1287,6 +1179,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) #include "DNA_lamp_types.h" #include "DNA_material_types.h" +#include "DNA_texture_types.h" #include "DNA_world_types.h" #define B_MATPRV 1 @@ -1305,8 +1198,11 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot) uiLayout *row, *col; uiBlock *block; Material *ma= NULL; + Tex *tex = (Tex*)id; ID *pid, *pparent; short *pr_texture= NULL; + PointerRNA material_ptr; + PointerRNA texture_ptr; if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) { printf("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n"); @@ -1349,20 +1245,20 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot) if(GS(pid->name) == ID_MA || (pparent && GS(pparent->name) == ID_MA)) { if(GS(pid->name) == ID_MA) ma= (Material*)pid; else ma= (Material*)pparent; + + /* Create RNA Pointer */ + RNA_pointer_create(id, &RNA_Material, ma, &material_ptr); - uiLayoutColumn(row, 1); - - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATPLANE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_FLAT, 0, 0, "Preview type: Flat XY plane"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE, 0, 0, "Preview type: Sphere"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATCUBE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_CUBE, 0, 0, "Preview type: Cube"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MONKEY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_MONKEY, 0, 0, "Preview type: Monkey"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_HAIR, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_HAIR, 0, 0, "Preview type: Hair strands"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MAT_SPHERE_SKY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky"); + col = uiLayoutColumn(row, 1); + uiLayoutSetScaleX(col, 1.5); + uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", 0); } if(pr_texture) { + /* Create RNA Pointer */ + RNA_pointer_create(id, &RNA_Texture, tex, &texture_ptr); + uiLayoutRow(layout, 1); - uiDefButS(block, ROW, B_MATPRV, "Texture", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_TEXTURE, 0, 0, ""); if(GS(parent->name) == ID_MA) uiDefButS(block, ROW, B_MATPRV, "Material", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_OTHER, 0, 0, ""); @@ -1371,6 +1267,12 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot) else if(GS(parent->name) == ID_WO) uiDefButS(block, ROW, B_MATPRV, "World", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_OTHER, 0, 0, ""); uiDefButS(block, ROW, B_MATPRV, "Both", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_BOTH, 0, 0, ""); + + /* Alpha buton for texture preview */ + if(*pr_texture!=TEX_PR_OTHER) { + row = uiLayoutRow(layout, 0); + uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, 0); + } } } } @@ -1428,6 +1330,33 @@ static void colorband_add_cb(bContext *C, void *cb_v, void *coba_v) { ColorBand *coba= coba_v; + if(coba->tot > 0) { + CBData *xnew, *x1, *x2; + float col[4]; + + xnew= &coba->data[coba->tot]; + + if(coba->tot > 1) { + if(coba->cur > 0) { + x1= &coba->data[coba->cur-1]; + x2= &coba->data[coba->cur]; + } + else { + x1= &coba->data[coba->cur]; + x2= &coba->data[coba->cur+1]; + } + + xnew->pos = x1->pos + ((x2->pos - x1->pos) / 2); + } + + do_colorband(coba, xnew->pos, col); + + xnew->r= col[0]; + xnew->g= col[1]; + xnew->b= col[2]; + xnew->a= col[3]; + } + if(coba->tot < MAXCOLORBAND-1) coba->tot++; coba->cur= coba->tot-1; @@ -1454,6 +1383,29 @@ static void colorband_del_cb(bContext *C, void *cb_v, void *coba_v) rna_update_cb(C, cb_v, NULL); } +static void colorband_flip_cb(bContext *C, void *cb_v, void *coba_v) +{ + CBData data_tmp[MAXCOLORBAND]; + + ColorBand *coba= coba_v; + int a; + + for(a=0; atot; a++) { + data_tmp[a]= coba->data[coba->tot - (a + 1)]; + } + for(a=0; atot; a++) { + data_tmp[a].pos = 1.0f - data_tmp[a].pos; + coba->data[a]= data_tmp[a]; + } + + /* may as well flip the cur*/ + coba->cur= coba->tot - (coba->cur + 1); + + ED_undo_push(C, "Flip colorband"); + + rna_update_cb(C, cb_v, NULL); +} + /* offset aligns from bottom, standard width 300, height 115 */ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand *coba, int xoffs, int yoffs, RNAUpdateCb *cb) @@ -1464,12 +1416,17 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand if(coba==NULL) return; - bt= uiDefBut(block, BUT, 0, "Add", 0+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Add a new color stop to the colorband"); + bt= uiDefBut(block, BUT, 0, "Add", 0+xoffs,100+yoffs,40,20, 0, 0, 0, 0, 0, "Add a new color stop to the colorband"); uiButSetNFunc(bt, colorband_add_cb, MEM_dupallocN(cb), coba); - bt= uiDefBut(block, BUT, 0, "Delete", 60+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Delete the active position"); + bt= uiDefBut(block, BUT, 0, "Delete", 45+xoffs,100+yoffs,45,20, 0, 0, 0, 0, 0, "Delete the active position"); uiButSetNFunc(bt, colorband_del_cb, MEM_dupallocN(cb), coba); + + /* XXX, todo for later - convert to operator - campbell */ + bt= uiDefBut(block, BUT, 0, "F", 95+xoffs,100+yoffs,20,20, 0, 0, 0, 0, 0, "Flip colorband"); + uiButSetNFunc(bt, colorband_flip_cb, MEM_dupallocN(cb), coba); + uiDefButS(block, NUM, 0, "", 120+xoffs,100+yoffs,80, 20, &coba->cur, 0.0, (float)(MAX2(0, coba->tot-1)), 0, 0, "Choose active color stop"); bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4", @@ -1480,6 +1437,8 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand bt= uiDefBut(block, BUT_COLORBAND, 0, "", xoffs,65+yoffs,300,30, coba, 0, 0, 0, 0, ""); uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL); + + if(coba->tot) { CBData *cbd= coba->data + coba->cur; @@ -1487,8 +1446,8 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand PointerRNA ptr; RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr); row= uiLayoutRow(layout, 0); - uiItemR(row, "Pos", 0, &ptr, "position", 0); - uiItemR(row, "", 0, &ptr, "color", 0); + uiItemR(row, &ptr, "position", 0, "Pos", 0); + uiItemR(row, &ptr, "color", 0, "", 0); } } @@ -1502,15 +1461,17 @@ static void colorband_buttons_small(uiLayout *layout, uiBlock *block, ColorBand uiBlockBeginAlign(block); bt= uiDefBut(block, BUT, 0, "Add", xs,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Add a new color stop to the colorband"); uiButSetNFunc(bt, colorband_add_cb, MEM_dupallocN(cb), coba); - bt= uiDefBut(block, BUT, 0, "Delete", xs+2.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Delete the active position"); + bt= uiDefBut(block, BUT, 0, "Delete", xs+2.0f*unit,butr->ymin+20.0f,1.5f*unit,20, NULL, 0, 0, 0, 0, "Delete the active position"); uiButSetNFunc(bt, colorband_del_cb, MEM_dupallocN(cb), coba); + bt= uiDefBut(block, BUT, 0, "F", xs+3.5f*unit,butr->ymin+20.0f,0.5f*unit,20, NULL, 0, 0, 0, 0, "Flip the color ramp"); + uiButSetNFunc(bt, colorband_flip_cb, MEM_dupallocN(cb), coba); uiBlockEndAlign(block); if(coba->tot) { CBData *cbd= coba->data + coba->cur; PointerRNA ptr; RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr); - uiItemR(layout, "", 0, &ptr, "color", 0); + uiItemR(layout, &ptr, "color", 0, "", 0); } bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4", @@ -1587,10 +1548,85 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int block= uiLayoutAbsoluteBlock(layout); //colorband_buttons_layout(layout, block, cptr.data, &rect, !expand, cb); - + hist = (Histogram *)cptr.data; + + hist->height= (hist->height<=0)?100:hist->height; + + bt= uiDefBut(block, HISTOGRAM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, hist->height, hist, 0, 0, 0, 0, ""); + uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL); + + MEM_freeN(cb); +} + +/********************* Waveform Template ************************/ + +void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int expand) +{ + PropertyRNA *prop= RNA_struct_find_property(ptr, propname); + PointerRNA cptr; + RNAUpdateCb *cb; + uiBlock *block; + uiBut *bt; + Scopes *scopes; + rctf rect; - bt= uiDefBut(block, HISTOGRAM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, 100.0f, hist, 0, 0, 0, 0, ""); + if(!prop || RNA_property_type(prop) != PROP_POINTER) + return; + + cptr= RNA_property_pointer_get(ptr, prop); + if(!cptr.data || !RNA_struct_is_a(cptr.type, &RNA_Scopes)) + return; + scopes = (Scopes *)cptr.data; + + cb= MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb"); + cb->ptr= *ptr; + cb->prop= prop; + + rect.xmin= 0; rect.xmax= 200; + rect.ymin= 0; rect.ymax= 190; + + block= uiLayoutAbsoluteBlock(layout); + + scopes->wavefrm_height= (scopes->wavefrm_height<=0)?100:scopes->wavefrm_height; + + bt= uiDefBut(block, WAVEFORM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->wavefrm_height, scopes, 0, 0, 0, 0, ""); + + MEM_freeN(cb); +} + +/********************* Vectorscope Template ************************/ + +void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, int expand) +{ + PropertyRNA *prop= RNA_struct_find_property(ptr, propname); + PointerRNA cptr; + RNAUpdateCb *cb; + uiBlock *block; + uiBut *bt; + Scopes *scopes; + rctf rect; + + if(!prop || RNA_property_type(prop) != PROP_POINTER) + return; + + cptr= RNA_property_pointer_get(ptr, prop); + if(!cptr.data || !RNA_struct_is_a(cptr.type, &RNA_Scopes)) + return; + scopes = (Scopes *)cptr.data; + + cb= MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb"); + cb->ptr= *ptr; + cb->prop= prop; + + rect.xmin= 0; rect.xmax= 200; + rect.ymin= 0; rect.ymax= 190; + + block= uiLayoutAbsoluteBlock(layout); + + scopes->vecscope_height= (scopes->vecscope_height<=0)?100:scopes->vecscope_height; + + bt= uiDefBut(block, VECTORSCOPE, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->vecscope_height, scopes, 0, 0, 0, 0, ""); uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL); MEM_freeN(cb); @@ -1707,7 +1743,7 @@ static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event) switch(event) { case 0: /* reset */ - curvemap_reset(cuma, &cumap->clipr, CURVE_PRESET_LINE); + curvemap_reset(cuma, &cumap->clipr, cumap->preset); curvemapping_changed(cumap, 0); break; case 1: @@ -1729,10 +1765,6 @@ static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event) cuma->flag |= CUMA_EXTEND_EXTRAPOLATE; curvemapping_changed(cumap, 0); break; - case 6: /* reset smooth */ - curvemap_reset(cuma, &cumap->clipr, CURVE_PRESET_SMOOTH); - curvemapping_changed(cumap, 0); - break; } ED_region_tag_redraw(CTX_wm_region(C)); } @@ -1770,7 +1802,7 @@ static uiBlock *curvemap_brush_tools_func(bContext *C, struct ARegion *ar, void uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Curve", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Curve", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); @@ -1789,8 +1821,9 @@ static void curvemap_buttons_reset(bContext *C, void *cb_v, void *cumap_v) CurveMapping *cumap = cumap_v; int a; + cumap->preset = CURVE_PRESET_LINE; for(a=0; acm+a, &cumap->clipr, CURVE_PRESET_LINE); + curvemap_reset(cumap->cm+a, &cumap->clipr, cumap->preset); cumap->black[0]=cumap->black[1]=cumap->black[2]= 0.0f; cumap->white[0]=cumap->white[1]=cumap->white[2]= 1.0f; @@ -1918,8 +1951,8 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe /* black/white levels */ if(levels) { split= uiLayoutSplit(layout, 0, 0); - uiItemR(uiLayoutColumn(split, 0), NULL, 0, ptr, "black_level", UI_ITEM_R_EXPAND); - uiItemR(uiLayoutColumn(split, 0), NULL, 0, ptr, "white_level", UI_ITEM_R_EXPAND); + uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, 0); + uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, 0); uiLayoutRow(layout, 0); bt=uiDefBut(block, BUT, 0, "Reset", 0, 0, UI_UNIT_X*10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves"); @@ -1955,37 +1988,44 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, i #define WHEEL_SIZE 100 -void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, char *propname, int value_slider, int lock) +void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); uiBlock *block= uiLayoutGetBlock(layout); uiLayout *col, *row; + uiBut *but; float softmin, softmax, step, precision; if (!prop) { printf("uiTemplateColorWheel: property not found: %s\n", propname); return; } - + RNA_property_float_ui_range(ptr, prop, &softmin, &softmax, &step, &precision); col = uiLayoutColumn(layout, 0); row= uiLayoutRow(col, 1); - uiDefButR(block, HSVCIRCLE, 0, "", 0, 0, WHEEL_SIZE, WHEEL_SIZE, ptr, propname, -1, 0.0, 0.0, 0, lock, ""); - + but= uiDefButR(block, HSVCIRCLE, 0, "", 0, 0, WHEEL_SIZE, WHEEL_SIZE, ptr, propname, -1, 0.0, 0.0, 0, 0, ""); + + if(lock) { + but->flag |= UI_BUT_COLOR_LOCK; + } + + if(lock_luminosity) { + float color[4]; /* incase of alpha */ + but->flag |= UI_BUT_VEC_SIZE_LOCK; + RNA_property_float_get_array(ptr, prop, color); + but->a2= len_v3(color); + } + + if(cubic) + but->flag |= UI_BUT_COLOR_CUBIC; + uiItemS(row); if (value_slider) uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, 9, 0, ""); - - /* maybe a switch for this? - row= uiLayoutRow(col, 0); - if(ELEM(RNA_property_subtype(prop), PROP_COLOR, PROP_COLOR_GAMMA) && RNA_property_array_length(ptr, prop) == 4) { - but= uiDefAutoButR(block, ptr, prop, 3, "A:", 0, 0, 0, WHEEL_SIZE+20, UI_UNIT_Y); - } - */ - } @@ -2008,9 +2048,9 @@ void uiTemplateTriColorSet(uiLayout *layout, PointerRNA *ptr, char *propname) /* nselected, selected, active color swatches */ csPtr= RNA_property_pointer_get(ptr, prop); - uiItemR(row, "", 0, &csPtr, "normal", 0); - uiItemR(row, "", 0, &csPtr, "selected", 0); - uiItemR(row, "", 0, &csPtr, "active", 0); + uiItemR(row, &csPtr, "normal", 0, "", 0); + uiItemR(row, &csPtr, "selected", 0, "", 0); + uiItemR(row, &csPtr, "active", 0, "", 0); } /********************* Layer Buttons Template ************************/ @@ -2039,7 +2079,7 @@ static void handle_layer_buttons(bContext *C, void *arg1, void *arg2) // the array of layer bitflags void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname, - PointerRNA *used_ptr, char *used_propname, int active_layer) + PointerRNA *used_ptr, char *used_propname, int active_layer) { uiLayout *uRow, *uCol; PropertyRNA *prop, *used_prop= NULL; @@ -2201,11 +2241,11 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe uiBlockSetEmboss(block, UI_EMBOSSN); row= uiLayoutRow(split, 1); if(i == 0) uiItemL(row, "", 0); - else uiItemR(row, "", 0, itemptr, "value", 0); + else uiItemR(row, itemptr, "value", 0, "", 0); if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH)) uiLayoutSetActive(row, 0); - //uiItemR(row, "", ICON_MUTE_IPO_OFF, itemptr, "mute", 0); + //uiItemR(row, itemptr, "mute", 0, "", ICON_MUTE_IPO_OFF); uiBlockSetEmboss(block, UI_EMBOSS); } else @@ -2448,6 +2488,7 @@ void uiTemplateOperatorSearch(uiLayout *layout) #define B_STOPRENDER 1 #define B_STOPCAST 2 #define B_STOPANIM 3 +#define B_STOPCOMPO 4 static void do_running_jobs(bContext *C, void *arg, int event) { @@ -2456,11 +2497,14 @@ static void do_running_jobs(bContext *C, void *arg, int event) G.afbreek= 1; break; case B_STOPCAST: - WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C)); + WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C), NULL); break; case B_STOPANIM: WM_operator_name_call(C, "SCREEN_OT_animation_play", WM_OP_INVOKE_SCREEN, NULL); break; + case B_STOPCOMPO: + WM_jobs_stop(CTX_wm_manager(C), CTX_wm_area(C), NULL); + break; } } @@ -2469,15 +2513,36 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) bScreen *screen= CTX_wm_screen(C); Scene *scene= CTX_data_scene(C); wmWindowManager *wm= CTX_wm_manager(C); + ScrArea *sa= CTX_wm_area(C); uiBlock *block; - + void *owner; + int handle_event; + block= uiLayoutGetBlock(layout); uiBlockSetCurLayout(block, layout); uiBlockSetHandleFunc(block, do_running_jobs, NULL); - if(WM_jobs_test(wm, scene)) - uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_CANCEL, "Render", 0,0,75,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering"); + if(sa->spacetype==SPACE_NODE) { + owner = sa; + handle_event= B_STOPCOMPO; + } else { + owner = scene; + handle_event= B_STOPRENDER; + } + + if(WM_jobs_test(wm, owner)) { + uiLayout *abs; + + abs = uiLayoutAbsolute(layout, 0); + + uiDefIconBut(block, BUT, handle_event, ICON_PANEL_CLOSE, + 0, UI_UNIT_Y*0.1, UI_UNIT_X*0.8, UI_UNIT_Y*0.8, NULL, 0.0f, 0.0f, 0, 0, "Stop this job"); + uiDefBut(block, PROGRESSBAR, 0, WM_jobs_name(wm, owner), + UI_UNIT_X, 0, 100, UI_UNIT_Y, NULL, 0.0f, 0.0f, WM_jobs_progress(wm, owner), 0, "Progress"); + + uiLayoutRow(layout, 0); + } if(WM_jobs_test(wm, screen)) uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_CANCEL, "Capture", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast"); if(screen->animtimer) @@ -2486,43 +2551,55 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) /************************* Reports for Last Operator Template **************************/ -void uiTemplateReportsBanner(uiLayout *layout, bContext *C, wmOperator *op) +void uiTemplateReportsBanner(uiLayout *layout, bContext *C) { - ReportList *reports = op->reports; - uiLayout *box; + ReportList *reports = CTX_wm_reports(C); + Report *report= BKE_reports_last_displayable(reports); + ReportTimerInfo *rti; - /* sanity checks */ - if (ELEM(NULL, op, reports)) { - printf("uiTemplateReportsBanner: no operator with reports!\n"); - return; - } + uiLayout *abs; + uiBlock *block; + uiBut *but; + uiStyle *style= U.uistyles.first; + int width; + float hsv[3]; + + /* if the report display has timed out, don't show */ + if (!reports->reporttimer) return; + + rti= (ReportTimerInfo *)reports->reporttimer->customdata; + + if (!rti || rti->widthfac==0.0 || !report) return; + + abs = uiLayoutAbsolute(layout, 0); + block= uiLayoutGetBlock(abs); + + rgb_to_hsv(rti->col[0], rti->col[1], rti->col[2], hsv+0, hsv+1, hsv+2); + + width = BLF_width(style->widget.uifont_id, report->message); + width = MIN2(rti->widthfac*width, width); + width = MAX2(width, 10); /* make a box around the report to make it stand out */ - box = uiLayoutBox(layout); - uiLayoutSetScaleY(box, 0.48); /* experimentally determined value to reduce execessive padding... */ + uiBlockBeginAlign(block); + but= uiDefBut(block, ROUNDBOX, 0, "", 0, 0, UI_UNIT_X+10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); + copy_v3_v3(but->hsv, hsv); /* set the report's bg colour in but->hsv - ROUNDBOX feature */ - /* if more than one report, we need to show the popup when user clicks on the temp label... */ - if (reports->list.first != reports->list.last) { - int numReports = BLI_countlist(&reports->list); - char buf[64]; - - // XXX: we need uiItem* to return uiBut pointer so that we can use it to set callbacks - // used to call uiPupMenuReports... as alternative, we could fall back to the "old ways" - //sprintf(buf, "Last Operator had %d errors. Click to see more...", numReports); - sprintf(buf, "Last Operator had %d errors", numReports); - uiItemL(box, buf, ICON_INFO); - } - else { - /* single report, so show report directly */ - // XXX: what if the report is too long? should we truncate the text? - Report *report= (Report *)reports->list.first; - - if(report->type >= RPT_ERROR) - uiItemL(box, report->message, ICON_ERROR); - else if(report->type >= RPT_WARNING) - uiItemL(box, report->message, ICON_ERROR); - else if(report->type >= RPT_INFO) - uiItemL(box, report->message, ICON_INFO); - } + but= uiDefBut(block, ROUNDBOX, 0, "", UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); + but->hsv[0] = but->hsv[1] = 0.0; /* set a greyscale bg colour in but->hsv - ROUNDBOX feature */ + but->hsv[2] = rti->greyscale; + uiBlockEndAlign(block); + + + /* icon and report message on top */ + if(report->type & RPT_ERROR_ALL) + uiDefIconBut(block, LABEL, 0, ICON_ERROR, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); + else if(report->type & RPT_WARNING_ALL) + uiDefIconBut(block, LABEL, 0, ICON_ERROR, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); + else if(report->type & RPT_INFO_ALL) + uiDefIconBut(block, LABEL, 0, ICON_INFO, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); + + uiDefBut(block, LABEL, 0, report->message, UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, ""); + } diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index c9024704b5e..37278340275 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -37,8 +37,6 @@ #include "UI_interface.h" #include "UI_resources.h" -#include "WM_api.h" -#include "WM_types.h" /*************************** RNA Utilities ******************************/ @@ -159,7 +157,7 @@ void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr, int else col= NULL; - uiItemFullR(col, "", 0, ptr, prop, -1, 0, 0); + uiItemFullR(col, ptr, prop, -1, 0, 0, "", 0); } RNA_STRUCT_END; } diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index e02a8f53a4e..d2860adbf50 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -30,10 +30,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_ID.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_listbase.h" @@ -53,26 +51,22 @@ #include "UI_interface.h" #include "UI_interface_icons.h" -#include "UI_resources.h" -#include "UI_view2d.h" -#include "ED_util.h" -#include "ED_types.h" #include "interface_intern.h" /* ************** widget base functions ************** */ /* - - in: roundbox codes for corner types and radius - - return: array of [size][2][x,y] points, the edges of the roundbox, + UV coords + - in: roundbox codes for corner types and radius + - return: array of [size][2][x,y] points, the edges of the roundbox, + UV coords - - draw black box with alpha 0 on exact button boundbox - - for ever AA step: - - draw the inner part for a round filled box, with color blend codes or texture coords - - draw outline in outline color - - draw outer part, bottom half, extruded 1 pixel to bottom, for emboss shadow - - draw extra decorations - - draw background color box with alpha 1 on exact button boundbox + - draw black box with alpha 0 on exact button boundbox + - for ever AA step: + - draw the inner part for a round filled box, with color blend codes or texture coords + - draw outline in outline color + - draw outer part, bottom half, extruded 1 pixel to bottom, for emboss shadow + - draw extra decorations + - draw background color box with alpha 1 on exact button boundbox */ @@ -289,10 +283,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl float maxxi= maxx - 1.0f; float minyi= miny + 1.0f; float maxyi= maxy - 1.0f; - float facxi= 1.0f/(maxxi-minxi); /* for uv */ - float facyi= 1.0f/(maxyi-minyi); + float facxi= (maxxi!=minxi) ? 1.0f/(maxxi-minxi) : 0.0f; /* for uv, can divide by zero */ + float facyi= (maxyi!=minyi) ? 1.0f/(maxyi-minyi) : 0.0f; int a, tot= 0, minsize; - + minsize= MIN2(rect->xmax-rect->xmin, rect->ymax-rect->ymin); if(2.0f*rad > minsize) @@ -614,14 +608,67 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol) /* backdrop non AA */ if(wtb->inner) { if(wcol->shaded==0) { - - /* filled center, solid */ - glColor4ubv((unsigned char*)wcol->inner); - glBegin(GL_POLYGON); - for(a=0; atotvert; a++) - glVertex2fv(wtb->inner_v[a]); - glEnd(); + if (wcol->alpha_check) { + GLubyte checker_stipple_sml[32*32/8] = + { + 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \ + 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \ + 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \ + 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \ + 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \ + 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \ + 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \ + 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \ + }; + float x_mid= 0.0f; /* used for dumb clamping of values */ + + /* dark checkers */ + glColor4ub(100, 100, 100, 255); + glBegin(GL_POLYGON); + for(a=0; atotvert; a++) { + glVertex2fv(wtb->inner_v[a]); + } + glEnd(); + + /* light checkers */ + glEnable(GL_POLYGON_STIPPLE); + glColor4ub(160, 160, 160, 255); + glPolygonStipple(checker_stipple_sml); + glBegin(GL_POLYGON); + for(a=0; atotvert; a++) { + glVertex2fv(wtb->inner_v[a]); + } + glEnd(); + glDisable(GL_POLYGON_STIPPLE); + + /* alpha fill */ + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glColor4ubv((unsigned char*)wcol->inner); + glBegin(GL_POLYGON); + for(a=0; atotvert; a++) { + glVertex2fv(wtb->inner_v[a]); + x_mid += wtb->inner_v[a][0]; + } + x_mid /= wtb->totvert; + glEnd(); + + /* 1/2 solid color */ + glColor4ub(wcol->inner[0], wcol->inner[1], wcol->inner[2], 255); + glBegin(GL_POLYGON); + for(a=0; atotvert; a++) + glVertex2f(MIN2(wtb->inner_v[a][0], x_mid), wtb->inner_v[a][1]); + glEnd(); + } + else { + /* simple fill */ + glColor4ubv((unsigned char*)wcol->inner); + glBegin(GL_POLYGON); + for(a=0; atotvert; a++) + glVertex2fv(wtb->inner_v[a]); + glEnd(); + } } else { char col1[4], col2[4]; @@ -817,14 +864,17 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) /* need to set this first */ uiStyleFontSet(fstyle); + + if (fstyle->kerning==1) /* for BLF_width */ + BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT); - but->strwidth= BLF_width(but->drawstr); + but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr); but->ofs= 0; while(but->strwidth > okwidth ) { but->ofs++; - but->strwidth= BLF_width(but->drawstr+but->ofs); + but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs); /* textbut exception */ if(but->editstr && but->pos != -1) { @@ -843,6 +893,9 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) if(but->strwidth < 10) break; } + + if (fstyle->kerning==1) + BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT); } static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) @@ -855,7 +908,10 @@ static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) /* need to set this first */ uiStyleFontSet(fstyle); - but->strwidth= BLF_width(but->drawstr); + if (fstyle->kerning==1) /* for BLF_width */ + BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + + but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr); but->ofs= 0; /* find the space after ':' separator */ @@ -870,7 +926,7 @@ static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) memmove(cp2-1, cp2, strlen(cp2)+1); cp2--; - but->strwidth= BLF_width(but->drawstr+but->ofs); + but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs); if(but->strwidth < 10) break; } @@ -879,7 +935,7 @@ static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) while ((but->strwidth > okwidth) && (but->ofs < 2)) { but->ofs++; - but->strwidth= BLF_width(but->drawstr+but->ofs); + but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs); if(but->strwidth < 10) break; } @@ -892,10 +948,12 @@ static void ui_text_label_rightclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) but->drawstr[ pos-1 ] = 0; pos--; - but->strwidth= BLF_width(but->drawstr+but->ofs); + but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs); if(but->strwidth < 10) break; } + if (fstyle->kerning==1) + BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT); } @@ -910,7 +968,10 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b fstyle->align= UI_STYLE_TEXT_LEFT; else fstyle->align= UI_STYLE_TEXT_CENTER; - + + if (fstyle->kerning==1) /* for BLF_width */ + BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + /* text button selection and cursor */ if(but->editstr && but->pos != -1) { short t=0, pos=0, ch; @@ -927,7 +988,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b ch= but->drawstr[selsta_tmp]; but->drawstr[selsta_tmp]= 0; - selsta_draw = BLF_width(but->drawstr+but->ofs); + selsta_draw = BLF_width(fstyle->uifont_id, but->drawstr+but->ofs); but->drawstr[selsta_tmp]= ch; } else @@ -936,7 +997,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b ch= but->drawstr[selend_tmp]; but->drawstr[selend_tmp]= 0; - selwidth_draw = BLF_width(but->drawstr+but->ofs); + selwidth_draw = BLF_width(fstyle->uifont_id, but->drawstr+but->ofs); but->drawstr[selend_tmp]= ch; @@ -951,16 +1012,20 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b ch= but->drawstr[pos]; but->drawstr[pos]= 0; - t= BLF_width(but->drawstr+but->ofs); + t= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs) / but->aspect; but->drawstr[pos]= ch; } - glColor3ub(255,0,0); + glColor3f(0.20, 0.6, 0.9); glRects(rect->xmin+t, rect->ymin+2, rect->xmin+t+2, rect->ymax-2); } } } + + if (fstyle->kerning == 1) + BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT); + // ui_rasterpos_safe(x, y, but->aspect); // if(but->type==IDPOIN) transopts= 0; // no translation, of course! // else transopts= ui_translate_buttons(); @@ -1264,6 +1329,19 @@ static struct uiWidgetColors wcol_scroll= { 5, -5 }; +static struct uiWidgetColors wcol_progress= { + {0, 0, 0, 255}, + {190, 190, 190, 255}, + {100, 100, 100, 180}, + {68, 68, 68, 255}, + + {0, 0, 0, 255}, + {255, 255, 255, 255}, + + 0, + 0, 0 +}; + static struct uiWidgetColors wcol_list_item= { {0, 0, 0, 255}, {0, 0, 0, 0}, @@ -1310,6 +1388,7 @@ void ui_widget_color_init(ThemeUI *tui) tui->wcol_box= wcol_box; tui->wcol_scroll= wcol_scroll; tui->wcol_list_item= wcol_list_item; + tui->wcol_progress= wcol_progress; tui->wcol_state= wcol_state; } @@ -1577,10 +1656,10 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect) rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); copy_v3_v3(hsvo, hsv); - /* exception: if 'lock' is set (stored in but->a2), + /* exception: if 'lock' is set * lock the value of the color wheel to 1. * Useful for color correction tools where you're only interested in hue. */ - if (but->a2) hsv[2] = 1.f; + if (but->flag & UI_BUT_COLOR_LOCK) hsv[2] = 1.f; hsv_to_rgb(0.f, 0.f, hsv[2], colcent, colcent+1, colcent+2); @@ -1595,6 +1674,8 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect) float co= cos(ang); ui_hsvcircle_vals_from_pos(hsv, hsv+1, rect, centx + co*radius, centy + si*radius); + CLAMP(hsv[2], 0.0f, 1.0f); /* for display only */ + hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2); glColor3fv(col); glVertex2f( centx + co*radius, centy + si*radius); @@ -1609,14 +1690,19 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect) glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH ); glColor3ubv((unsigned char*)wcol->outline); - glutil_draw_lined_arc(0.0f, M_PI*2.0, radius, tot); + glutil_draw_lined_arc(0.0f, M_PI*2.0, radius, tot + 1); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH ); glPopMatrix(); /* cursor */ ang= 2.0f*M_PI*hsvo[0] + 0.5f*M_PI; - radius= hsvo[1]*radius; + + if(but->flag & UI_BUT_COLOR_CUBIC) + radius= (1.0f - pow(1.0f - hsvo[1], 3.0f)) *radius; + else + radius= hsvo[1] * radius; + ui_hsv_cursor(centx + cos(-ang)*radius, centy + sin(-ang)*radius); } @@ -1942,6 +2028,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat uiWidgetBase wtb; float rad; int horizontal; + short outline=0; widget_init(&wtb); @@ -1983,6 +2070,10 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat /* draw */ wtb.emboss= 0; /* only emboss once */ + /* exception for progress bar */ + if (state & UI_SCROLL_NO_OUTLINE) + SWAP(short, outline, wtb.outline); + round_box_edges(&wtb, 15, slider, rad); if(state & UI_SCROLL_ARROWS) { @@ -2001,6 +2092,9 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat } } widgetbase_draw(&wtb, wcol); + + if (state & UI_SCROLL_NO_OUTLINE) + SWAP(short, outline, wtb.outline); } } @@ -2065,9 +2159,35 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat uiWidgetScrollDraw(wcol, rect, &rect1, state); } +static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) +{ + rcti rect_prog = *rect, rect_bar = *rect; + float value = but->a1; + float w, min; + + /* make the progress bar a proportion of the original height */ + /* hardcoded 4px high for now */ + rect_prog.ymax = rect_prog.ymin + 4; + rect_bar.ymax = rect_bar.ymin + 4; + + w = value * (rect_prog.xmax - rect_prog.xmin); + + /* ensure minimium size */ + min= rect_prog.ymax - rect_prog.ymin; + w = MAX2(w, min); + + rect_bar.xmax = rect_bar.xmin + w; + + uiWidgetScrollDraw(wcol, &rect_prog, &rect_bar, UI_SCROLL_NO_OUTLINE); + + /* raise text a bit */ + rect->ymin += 6; + rect->xmin -= 6; +} + static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) { - + if(but->flag & UI_SELECT) { rcti rectlink; @@ -2082,7 +2202,6 @@ static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, } } - static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) { uiWidgetBase wtb, wtb1; @@ -2149,9 +2268,15 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat float col[4]; int color_profile = but->block->color_profile; + col[3]= 1.0f; + if (but->rnaprop) { if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) color_profile = BLI_PR_NONE; + + if(RNA_property_array_length(&but->rnapoin, but->rnaprop)==4) { + col[3]= RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3); + } } widget_init(&wtb); @@ -2167,8 +2292,10 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat wcol->inner[0]= FTOCHAR(col[0]); wcol->inner[1]= FTOCHAR(col[1]); wcol->inner[2]= FTOCHAR(col[2]); + wcol->inner[3]= FTOCHAR(col[3]); wcol->shaded = 0; - + wcol->alpha_check = (wcol->inner[3] < 255); + widgetbase_draw(&wtb, wcol); } @@ -2306,6 +2433,36 @@ static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int state, int rou } +static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) +{ + uiWidgetBase wtb; + char old_col[3]; + + widget_init(&wtb); + + VECCOPY(old_col, wcol->inner); + + /* abuse but->hsv - if it's non-zero, use this colour as the box's background */ + if ((but->hsv[0] != 0.0) || (but->hsv[1] != 0.0) || (but->hsv[2] != 0.0)) { + float rgb[3]; + hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], rgb+0, rgb+1, rgb+2); + wcol->inner[0] = rgb[0] * 255; + wcol->inner[1] = rgb[1] * 255; + wcol->inner[2] = rgb[2] * 255; + } + + /* half rounded */ + round_box_edges(&wtb, roundboxalign, rect, 4.0f); + + widgetbase_draw(&wtb, wcol); + + /* store the box bg as gl clearcolor, to retrieve later when drawing semi-transparent rects + * over the top to indicate disabled buttons */ + glClearColor(wcol->inner[0]/255.0, wcol->inner[1]/255.0, wcol->inner[2]/255.0, 1.0); + + VECCOPY(wcol->inner, old_col); +} + static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) { uiWidgetBase wtb; @@ -2372,10 +2529,11 @@ static void widget_disabled(rcti *rect) /* can't use theme TH_BACK or TH_PANEL... undefined */ glGetFloatv(GL_COLOR_CLEAR_VALUE, col); glColor4f(col[0], col[1], col[2], 0.5f); + /* need -1 and +1 to make it work right for aligned buttons, * but problem may be somewhere else? */ - glRectf(rect->xmin-1, rect->ymin, rect->xmax, rect->ymax+1); - + glRectf(rect->xmin-1, rect->ymin-1, rect->xmax, rect->ymax+1); + glDisable(GL_BLEND); } @@ -2492,6 +2650,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) break; case UI_WTYPE_BOX: + wt.custom= widget_box; wt.wcol_theme= &btheme->tui.wcol_box; break; @@ -2511,6 +2670,11 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) wt.wcol_theme= &btheme->tui.wcol_list_item; wt.draw= widget_list_itembut; break; + + case UI_WTYPE_PROGRESSBAR: + wt.wcol_theme= &btheme->tui.wcol_progress; + wt.custom= widget_progressbar; + break; } return &wt; @@ -2715,9 +2879,22 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct ui_draw_but_HISTOGRAM(ar, but, &tui->wcol_regular, rect); break; + case WAVEFORM: + ui_draw_but_WAVEFORM(ar, but, &tui->wcol_regular, rect); + break; + + case VECTORSCOPE: + ui_draw_but_VECTORSCOPE(ar, but, &tui->wcol_regular, rect); + break; + case BUT_CURVE: ui_draw_but_CURVE(ar, but, &tui->wcol_regular, rect); break; + + case PROGRESSBAR: + wt= widget_type(UI_WTYPE_PROGRESSBAR); + fstyle= &style->widgetlabel; + break; case SCROLL: wt= widget_type(UI_WTYPE_SCROLL); @@ -2801,7 +2978,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid, cpoin= strchr(name, '|'); if(cpoin) { *cpoin= 0; - rect->xmax -= BLF_width(cpoin+1) + 10; + rect->xmax -= BLF_width(fstyle->uifont_id, cpoin+1) + 10; } glColor3ubv((unsigned char*)wt->wcol.text); @@ -2844,8 +3021,8 @@ void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconi glColor3ubv((unsigned char*)wt->wcol.text_sel); trect.xmin += 0; - trect.xmax = trect.xmin + BLF_width(name) + 10; + trect.xmax = trect.xmin + BLF_width(fstyle->uifont_id, name) + 10; trect.ymin += 10; - trect.ymax = trect.ymin + BLF_height(name); + trect.ymax = trect.ymin + BLF_height(fstyle->uifont_id, name); uiStyleFontDraw(fstyle, &trect, name); } diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 8566e620fb8..58357bc67cf 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -34,15 +34,10 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "DNA_curve_types.h" -#include "DNA_listBase.h" #include "DNA_userdef_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -50,8 +45,6 @@ #include "BLI_blenlib.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" #include "BKE_DerivedMesh.h" #include "BKE_global.h" @@ -62,7 +55,6 @@ #include "BIF_gl.h" #include "UI_interface.h" -#include "UI_resources.h" #include "UI_interface_icons.h" #include "interface_intern.h" @@ -279,6 +271,8 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) cp= ts->edge_seam; break; case TH_EDGE_SHARP: cp= ts->edge_sharp; break; + case TH_EDGE_CREASE: + cp= ts->edge_crease; break; case TH_EDITMESH_ACTIVE: cp= ts->editmesh_active; break; case TH_EDGE_FACESEL: @@ -305,7 +299,35 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) cp= ts->strip_select; break; case TH_CFRAME: cp= ts->cframe; break; - + case TH_NURB_ULINE: + cp= ts->nurb_uline; break; + case TH_NURB_VLINE: + cp= ts->nurb_vline; break; + case TH_NURB_SEL_ULINE: + cp= ts->nurb_sel_uline; break; + case TH_NURB_SEL_VLINE: + cp= ts->nurb_sel_vline; break; + case TH_ACTIVE_SPLINE: + cp= ts->act_spline; break; + case TH_LASTSEL_POINT: + cp= ts->lastsel_point; break; + case TH_HANDLE_FREE: + cp= ts->handle_free; break; + case TH_HANDLE_AUTO: + cp= ts->handle_auto; break; + case TH_HANDLE_VECT: + cp= ts->handle_vect; break; + case TH_HANDLE_ALIGN: + cp= ts->handle_align; break; + case TH_HANDLE_SEL_FREE: + cp= ts->handle_sel_free; break; + case TH_HANDLE_SEL_AUTO: + cp= ts->handle_sel_auto; break; + case TH_HANDLE_SEL_VECT: + cp= ts->handle_sel_vect; break; + case TH_HANDLE_SEL_ALIGN: + cp= ts->handle_sel_align; break; + case TH_SYNTAX_B: cp= ts->syntaxb; break; case TH_SYNTAX_V: @@ -438,11 +460,11 @@ static void ui_theme_init_new(bTheme *btheme) #define SETCOL(col, r, g, b, a) col[0]=r; col[1]=g; col[2]= b; col[3]= a; #define SETCOLF(col, r, g, b, a) col[0]=r*255; col[1]=g*255; col[2]= b*255; col[3]= a*255; -/* initialize default theme, can't be edited +/* initialize default theme Note: when you add new colors, created & saved themes need initialized use function below, init_userdef_do_versions() */ -void ui_theme_init_userdef(void) +void ui_theme_init_default(void) { bTheme *btheme= U.themes.first; @@ -500,6 +522,23 @@ void ui_theme_init_userdef(void) btheme->tv3d.facedot_size= 4; SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255); + SETCOL(btheme->tv3d.nurb_uline, 0x90, 0x90, 0x00, 255); + SETCOL(btheme->tv3d.nurb_vline, 0x80, 0x30, 0x60, 255); + SETCOL(btheme->tv3d.nurb_sel_uline, 0xf0, 0xff, 0x40, 255); + SETCOL(btheme->tv3d.nurb_sel_vline, 0xf0, 0x90, 0xa0, 255); + + SETCOL(btheme->tv3d.handle_free, 0, 0, 0, 255); + SETCOL(btheme->tv3d.handle_auto, 0x90, 0x90, 0x00, 255); + SETCOL(btheme->tv3d.handle_vect, 0x40, 0x90, 0x30, 255); + SETCOL(btheme->tv3d.handle_align, 0x80, 0x30, 0x60, 255); + SETCOL(btheme->tv3d.handle_sel_free, 0, 0, 0, 255); + SETCOL(btheme->tv3d.handle_sel_auto, 0xf0, 0xff, 0x40, 255); + SETCOL(btheme->tv3d.handle_sel_vect, 0x40, 0xc0, 0x30, 255); + SETCOL(btheme->tv3d.handle_sel_align, 0xf0, 0x90, 0xa0, 255); + + SETCOL(btheme->tv3d.act_spline, 0xdb, 0x25, 0x12, 255); + SETCOL(btheme->tv3d.lastsel_point, 0xff, 0xff, 0xff, 255); + SETCOL(btheme->tv3d.bone_solid, 200, 200, 200, 255); SETCOL(btheme->tv3d.bone_pose, 80, 200, 255, 80); // alpha 80 is not meant editable, used for wire+action draw @@ -912,6 +951,14 @@ void UI_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, in col[2] = b; } +void UI_ThemeClearColor(int colorid) +{ + float col[3]; + + UI_GetThemeColor3fv(colorid, col); + glClearColor(col[0], col[1], col[2], 0.0); +} + void UI_make_axis_color(char *src_col, char *dst_col, char axis) { switch(axis) @@ -1377,7 +1424,75 @@ void init_userdef_do_versions(void) if(U.wmdrawmethod == USER_DRAW_TRIPLE) U.wmdrawmethod = USER_DRAW_AUTOMATIC; } + + if (G.main->versionfile < 252 || (G.main->versionfile == 252 && G.main->subversionfile < 3)) { + if (U.flag & USER_LMOUSESELECT) + U.flag &= ~USER_TWOBUTTONMOUSE; + } + if (G.main->versionfile < 252 || (G.main->versionfile == 252 && G.main->subversionfile < 4)) { + bTheme *btheme; + + /* default new handle type is auto handles */ + U.keyhandles_new = HD_AUTO; + + /* init new curve colors */ + for(btheme= U.themes.first; btheme; btheme= btheme->next) { + /* init colors used for handles in 3D-View */ + SETCOL(btheme->tv3d.handle_free, 0, 0, 0, 255); + SETCOL(btheme->tv3d.handle_auto, 0x90, 0x90, 0x00, 255); + SETCOL(btheme->tv3d.handle_vect, 0x40, 0x90, 0x30, 255); + SETCOL(btheme->tv3d.handle_align, 0x80, 0x30, 0x60, 255); + SETCOL(btheme->tv3d.handle_sel_free, 0, 0, 0, 255); + SETCOL(btheme->tv3d.handle_sel_auto, 0xf0, 0xff, 0x40, 255); + SETCOL(btheme->tv3d.handle_sel_vect, 0x40, 0xc0, 0x30, 255); + SETCOL(btheme->tv3d.handle_sel_align, 0xf0, 0x90, 0xa0, 255); + SETCOL(btheme->tv3d.act_spline, 0xdb, 0x25, 0x12, 255); + + /* same colors again for Graph Editor... */ + SETCOL(btheme->tipo.handle_free, 0, 0, 0, 255); + SETCOL(btheme->tipo.handle_auto, 0x90, 0x90, 0x00, 255); + SETCOL(btheme->tipo.handle_vect, 0x40, 0x90, 0x30, 255); + SETCOL(btheme->tipo.handle_align, 0x80, 0x30, 0x60, 255); + SETCOL(btheme->tipo.handle_sel_free, 0, 0, 0, 255); + SETCOL(btheme->tipo.handle_sel_auto, 0xf0, 0xff, 0x40, 255); + SETCOL(btheme->tipo.handle_sel_vect, 0x40, 0xc0, 0x30, 255); + SETCOL(btheme->tipo.handle_sel_align, 0xf0, 0x90, 0xa0, 255); + + /* edge crease */ + SETCOLF(btheme->tv3d.edge_crease, 0.8, 0, 0.6, 1.0); + } + } + if (G.main->versionfile <= 252) { + bTheme *btheme; + /* init new curve colors */ + for(btheme= U.themes.first; btheme; btheme= btheme->next) { + if (btheme->tv3d.lastsel_point[3] == 0) + SETCOL(btheme->tv3d.lastsel_point, 0xff, 0xff, 0xff, 255); + } + } + if (G.main->versionfile < 252 || (G.main->versionfile == 252 && G.main->subversionfile < 5)) { + bTheme *btheme; + + /* interface_widgets.c */ + struct uiWidgetColors wcol_progress= { + {0, 0, 0, 255}, + {190, 190, 190, 255}, + {100, 100, 100, 180}, + {68, 68, 68, 255}, + + {0, 0, 0, 255}, + {255, 255, 255, 255}, + + 0, + 5, -5 + }; + + for(btheme= U.themes.first; btheme; btheme= btheme->next) { + /* init progress bar theme */ + btheme->tui.wcol_progress= wcol_progress; + } + } /* GL Texture Garbage Collection (variable abused above!) */ if (U.textimeout == 0) { @@ -1403,13 +1518,25 @@ void init_userdef_do_versions(void) if (U.v2d_min_gridsize == 0) { U.v2d_min_gridsize= 35; } + + /* Single Column UI Value */ + if (U.propwidth == 0) { + U.propwidth = 200; + } /* funny name, but it is GE stuff, moves userdef stuff to engine */ // XXX space_set_commmandline_options(); /* this timer uses U */ // XXX reset_autosave(); + /* GSOC Sculpt 2010 - Sanity check on Sculpt/Paint settings */ + + if (U.sculpt_paint_unified_alpha == 0) + U.sculpt_paint_unified_alpha = 0.5f; + + if (U.sculpt_paint_unified_unprojected_radius == 0) + U.sculpt_paint_unified_unprojected_radius = 0.125f; + + if (U.sculpt_paint_unified_size == 0) + U.sculpt_paint_unified_size = 35; } - - - diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 2bdf1ea4c88..9a88a52d4b4 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -33,10 +33,7 @@ #include "MEM_guardedalloc.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_userdef_types.h" -#include "DNA_view2d_types.h" #include "BLI_blenlib.h" @@ -55,7 +52,6 @@ #include "ED_screen.h" #include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "interface_intern.h" @@ -1318,6 +1314,13 @@ void UI_view2d_constant_grid_draw(const bContext *C, View2D *v2d) glEnd(); } +/* the price we pay for not exposting structs :( */ +void UI_view2d_grid_size(View2DGrid *grid, float *r_dx, float *r_dy) +{ + *r_dx= grid->dx; + *r_dy= grid->dy; +} + /* free temporary memory used for drawing grid */ void UI_view2d_grid_free(View2DGrid *grid) { @@ -1393,6 +1396,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short /* scroller 'button' extents */ totsize= v2d->tot.xmax - v2d->tot.xmin; scrollsize= (float)(hor.xmax - hor.xmin); + if(totsize==0.0f) totsize = 1.0f; /* avoid divide by zero */ fac1= (v2d->cur.xmin - v2d->tot.xmin) / totsize; if(fac1<=0.0f) @@ -1433,6 +1437,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short /* scroller 'button' extents */ totsize= v2d->tot.ymax - v2d->tot.ymin; scrollsize= (float)(vert.ymax - vert.ymin); + if(totsize==0.0f) totsize = 1.0f; /* avoid divide by zero */ fac1= (v2d->cur.ymin- v2d->tot.ymin) / totsize; if(fac1<=0.0f) @@ -1706,8 +1711,9 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v /* draw vertical steps */ if (dfac > 0.0f) { - BLF_default_rotation(90.0f); - + BLF_rotation_default(90.0f); + BLF_enable_default(BLF_ROTATION); + for (; fac < vert.ymax-10; fac+= dfac, val += grid->dy) { /* make prints look nicer for scrollers */ @@ -1717,7 +1723,7 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v scroll_printstr(vs, scene, (float)(vert.xmax)-2.0f, fac, val, grid->powery, vs->yunits, 'v'); } - BLF_default_rotation(0.0f); + BLF_disable_default(BLF_ROTATION); } } } @@ -2057,12 +2063,10 @@ void UI_view2d_text_cache_draw(ARegion *ar) yofs= ceil( 0.5f*(v2s->rect.ymax - v2s->rect.ymin - BLF_height_default("28"))); if(yofs<1) yofs= 1; - BLF_clipping(v2s->rect.xmin-4, v2s->rect.ymin-4, v2s->rect.xmax+4, v2s->rect.ymax+4); - BLF_enable(BLF_CLIPPING); - + BLF_clipping_default(v2s->rect.xmin-4, v2s->rect.ymin-4, v2s->rect.xmax+4, v2s->rect.ymax+4); + BLF_enable_default(BLF_CLIPPING); BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, v2s->str); - - BLF_disable(BLF_CLIPPING); + BLF_disable_default(BLF_CLIPPING); } } diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index 7476751fecd..a5ed57a9ee8 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -29,12 +29,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_userdef_types.h" -#include "DNA_vec_types.h" -#include "DNA_view2d_types.h" #include "BLI_blenlib.h" @@ -51,7 +46,6 @@ #include "ED_screen.h" -#include "UI_resources.h" #include "UI_view2d.h" static int view2d_poll(bContext *C) @@ -78,6 +72,7 @@ static int view2d_poll(bContext *C) typedef struct v2dViewPanData { bScreen *sc; /* screen where view pan was initiated */ ScrArea *sa; /* area where view pan was initiated */ + ARegion *ar; /* region where view pan was initiated */ View2D *v2d; /* view2d we're operating in */ float facx, facy; /* amount to move view relative to zoom */ @@ -114,6 +109,7 @@ static int view_pan_init(bContext *C, wmOperator *op) vpd->sc= CTX_wm_screen(C); vpd->sa= CTX_wm_area(C); vpd->v2d= v2d; + vpd->ar = ar; /* calculate translation factor - based on size of view */ winx= (float)(ar->winrct.xmax - ar->winrct.xmin + 1); @@ -149,12 +145,14 @@ static void view_pan_apply(bContext *C, wmOperator *op) UI_view2d_curRect_validate(v2d); /* request updates to be done... */ - ED_area_tag_redraw(vpd->sa); + ED_region_tag_redraw(vpd->ar); + UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY); WM_event_add_mousemove(C); /* exceptions */ - if(vpd->sa->spacetype==SPACE_OUTLINER) { + if (vpd->sa->spacetype==SPACE_OUTLINER) { + /* don't rebuild full tree, since we're just changing our view */ SpaceOops *soops= vpd->sa->spacedata.first; soops->storeflag |= SO_TREESTORE_REDRAW; } @@ -295,7 +293,7 @@ void VIEW2D_OT_pan(wmOperatorType *ot) ot->modal= view_pan_modal; ot->cancel= view_pan_cancel; - /* operator is repeatable */ + /* operator is modal */ ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER; /* rna - must keep these in sync with the other operators */ @@ -342,9 +340,6 @@ void VIEW2D_OT_scroll_right(wmOperatorType *ot) /* api callbacks */ ot->exec= view_scrollright_exec; - /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER; - /* rna - must keep these in sync with the other operators */ RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX); @@ -389,9 +384,6 @@ void VIEW2D_OT_scroll_left(wmOperatorType *ot) /* api callbacks */ ot->exec= view_scrollleft_exec; - /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER; - /* rna - must keep these in sync with the other operators */ RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX); @@ -416,7 +408,7 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op) /* set RNA-Props */ RNA_int_set(op->ptr, "deltax", 0); - RNA_int_set(op->ptr, "deltay", -20); + RNA_int_set(op->ptr, "deltay", -40); /* apply movement, then we're done */ view_pan_apply(C, op); @@ -435,9 +427,6 @@ void VIEW2D_OT_scroll_down(wmOperatorType *ot) /* api callbacks */ ot->exec= view_scrolldown_exec; - /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER; - /* rna - must keep these in sync with the other operators */ RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX); @@ -463,7 +452,7 @@ static int view_scrollup_exec(bContext *C, wmOperator *op) /* set RNA-Props */ RNA_int_set(op->ptr, "deltax", 0); - RNA_int_set(op->ptr, "deltay", 20); + RNA_int_set(op->ptr, "deltay", 40); /* apply movement, then we're done */ view_pan_apply(C, op); @@ -482,9 +471,6 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot) /* api callbacks */ ot->exec= view_scrollup_exec; - /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER; - /* rna - must keep these in sync with the other operators */ RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX); @@ -509,6 +495,7 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot) /* temp customdata for operator */ typedef struct v2dViewZoomData { View2D *v2d; /* view2d we're operating in */ + ARegion *ar; int lastx, lasty; /* previous x/y values of mouse in window */ float dx, dy; /* running tally of previous delta values (for obtaining final zoom) */ @@ -538,6 +525,7 @@ static int view_zoomdrag_init(bContext *C, wmOperator *op) /* set pointers to owners */ vzd->v2d= v2d; + vzd->ar = ar; return 1; } @@ -570,11 +558,12 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) float dx, dy, facx, facy; /* calculate amount to move view by, ensuring symmetry so the - * old zoom level is restored after zooming back the same amount */ + * old zoom level is restored after zooming back the same amount + */ facx= RNA_float_get(op->ptr, "zoomfacx"); facy= RNA_float_get(op->ptr, "zoomfacy"); - if(facx >= 0.0f) { + if (facx >= 0.0f) { dx= (v2d->cur.xmax - v2d->cur.xmin) * facx; dy= (v2d->cur.ymax - v2d->cur.ymin) * facy; } @@ -589,16 +578,17 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) v2d->cur.xmax -= 2*dx; } else if (v2d->keepofs & V2D_KEEPOFS_X) { - if(v2d->align & V2D_ALIGN_NO_POS_X) + if (v2d->align & V2D_ALIGN_NO_POS_X) v2d->cur.xmin += 2*dx; else v2d->cur.xmax -= 2*dx; } else { - if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { + if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { float mval_fac = (vzd->mx_2d - v2d->cur.xmin) / (v2d->cur.xmax-v2d->cur.xmin); float mval_faci = 1.0 - mval_fac; float ofs= (mval_fac * dx) - (mval_faci * dx); + v2d->cur.xmin += ofs + dx; v2d->cur.xmax += ofs - dx; } @@ -613,19 +603,21 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) v2d->cur.ymax -= 2*dy; } else if (v2d->keepofs & V2D_KEEPOFS_Y) { - if(v2d->align & V2D_ALIGN_NO_POS_Y) + if (v2d->align & V2D_ALIGN_NO_POS_Y) v2d->cur.ymin += 2*dy; else v2d->cur.ymax -= 2*dy; } else { - if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { + if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { float mval_fac = (vzd->my_2d - v2d->cur.ymin) / (v2d->cur.ymax-v2d->cur.ymin); float mval_faci = 1.0 - mval_fac; float ofs= (mval_fac * dy) - (mval_faci * dy); + v2d->cur.ymin += ofs + dy; v2d->cur.ymax += ofs - dy; - } else { + } + else { v2d->cur.ymin += dy; v2d->cur.ymax -= dy; } @@ -636,7 +628,7 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) UI_view2d_curRect_validate(v2d); /* request updates to be done... */ - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(vzd->ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); WM_event_add_mousemove(C); } @@ -680,9 +672,13 @@ static int view_zoomin_invoke(bContext *C, wmOperator *op, wmEvent *event) vzd= op->customdata; - if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { + if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { ARegion *ar= CTX_wm_region(C); - UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, &vzd->mx_2d, &vzd->my_2d); + + /* store initial mouse position (in view space) */ + UI_view2d_region_to_view(&ar->v2d, + event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, + &vzd->mx_2d, &vzd->my_2d); } return view_zoomin_exec(C, op); @@ -700,9 +696,6 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot) ot->exec= view_zoomin_exec; ot->poll= view_zoom_poll; - /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER; - /* rna - must keep these in sync with the other operators */ RNA_def_float(ot->srna, "zoomfacx", 0, -FLT_MAX, FLT_MAX, "Zoom Factor X", "", -FLT_MAX, FLT_MAX); RNA_def_float(ot->srna, "zoomfacy", 0, -FLT_MAX, FLT_MAX, "Zoom Factor Y", "", -FLT_MAX, FLT_MAX); @@ -738,7 +731,11 @@ static int view_zoomout_invoke(bContext *C, wmOperator *op, wmEvent *event) if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { ARegion *ar= CTX_wm_region(C); - UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, &vzd->mx_2d, &vzd->my_2d); + + /* store initial mouse position (in view space) */ + UI_view2d_region_to_view(&ar->v2d, + event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, + &vzd->mx_2d, &vzd->my_2d); } return view_zoomout_exec(C, op); @@ -756,9 +753,6 @@ void VIEW2D_OT_zoom_out(wmOperatorType *ot) ot->exec= view_zoomout_exec; ot->poll= view_zoom_poll; - /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER; - /* rna - must keep these in sync with the other operators */ RNA_def_float(ot->srna, "zoomfacx", 0, -FLT_MAX, FLT_MAX, "Zoom Factor X", "", -FLT_MAX, FLT_MAX); RNA_def_float(ot->srna, "zoomfacy", 0, -FLT_MAX, FLT_MAX, "Zoom Factor Y", "", -FLT_MAX, FLT_MAX); @@ -790,10 +784,11 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) v2d->cur.xmax -= 2*dx; } else { - if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { + if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { float mval_fac = (vzd->mx_2d - v2d->cur.xmin) / (v2d->cur.xmax-v2d->cur.xmin); float mval_faci = 1.0 - mval_fac; float ofs= (mval_fac * dx) - (mval_faci * dx); + v2d->cur.xmin += ofs + dx; v2d->cur.xmax += ofs - dx; } @@ -808,10 +803,11 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) v2d->cur.ymax -= 2*dy; } else { - if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { + if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { float mval_fac = (vzd->my_2d - v2d->cur.ymin) / (v2d->cur.ymax-v2d->cur.ymin); float mval_faci = 1.0 - mval_fac; float ofs= (mval_fac * dy) - (mval_faci * dy); + v2d->cur.ymin += ofs + dy; v2d->cur.ymax += ofs - dy; } @@ -826,7 +822,7 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) UI_view2d_curRect_validate(v2d); /* request updates to be done... */ - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(vzd->ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); WM_event_add_mousemove(C); } @@ -872,7 +868,8 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event) vzd->lasty= event->prevy; /* As we have only 1D information (magnify value), feed both axes - with magnify information that is stored in x axis */ + * with magnify information that is stored in x axis + */ fac= 0.01f * (event->x - event->prevx); dx= fac * (v2d->cur.xmax - v2d->cur.xmin) / 10.0f; dy= fac * (v2d->cur.ymax - v2d->cur.ymin) / 10.0f; @@ -891,9 +888,13 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event) RNA_float_set(op->ptr, "deltax", 0); RNA_float_set(op->ptr, "deltay", 0); - if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) { + if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) { ARegion *ar= CTX_wm_region(C); - UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, &vzd->mx_2d, &vzd->my_2d); + + /* store initial mouse position (in view space) */ + UI_view2d_region_to_view(&ar->v2d, + event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, + &vzd->mx_2d, &vzd->my_2d); } if (v2d->keepofs & V2D_LOCKOFS_X) @@ -1015,7 +1016,7 @@ void VIEW2D_OT_zoom(wmOperatorType *ot) ot->poll= view_zoom_poll; /* operator is repeatable */ - // ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING; + // ot->flag= OPTYPE_BLOCKING; /* rna - must keep these in sync with the other operators */ RNA_def_float(ot->srna, "deltax", 0, -FLT_MAX, FLT_MAX, "Delta X", "", -FLT_MAX, FLT_MAX); @@ -1039,17 +1040,16 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op) ARegion *ar= CTX_wm_region(C); View2D *v2d= &ar->v2d; rctf rect; - int event_type; + int gesture_mode; /* convert coordinates of rect to 'tot' rect coordinates */ UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmin"), RNA_int_get(op->ptr, "ymin"), &rect.xmin, &rect.ymin); UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmax"), RNA_int_get(op->ptr, "ymax"), &rect.xmax, &rect.ymax); /* check if zooming in/out view */ - // XXX hardcoded for now! - event_type= RNA_int_get(op->ptr, "event_type"); + gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); - if (event_type == LEFTMOUSE) { + if (gesture_mode == GESTURE_MODAL_IN) { /* zoom in: * - 'cur' rect will be defined by the coordinates of the border region * - just set the 'cur' rect to have the same coordinates as the border region @@ -1064,7 +1064,7 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op) v2d->cur.ymax= rect.ymax; } } - else { + else /* if (gesture_mode == GESTURE_MODAL_OUT) */ { /* zoom out: * - the current 'cur' rect coordinates are going to end upwhere the 'rect' ones are, * but the 'cur' rect coordinates will need to be adjusted to take in more of the view @@ -1095,7 +1095,7 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op) UI_view2d_curRect_validate(v2d); /* request updates to be done... */ - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); WM_event_add_mousemove(C); @@ -1117,7 +1117,7 @@ void VIEW2D_OT_zoom_border(wmOperatorType *ot) ot->poll= view_zoom_poll; /* rna */ - RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "gesture_mode", 0, INT_MIN, INT_MAX, "Gesture Mode", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX); @@ -1139,6 +1139,7 @@ void VIEW2D_OT_zoom_border(wmOperatorType *ot) /* customdata for scroller-invoke data */ typedef struct v2dScrollerMove { View2D *v2d; /* View2D data that this operation affects */ + ARegion *ar; /* region that the scroller is in */ short scroller; /* scroller that mouse is in ('h' or 'v') */ short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active colour?) @@ -1146,6 +1147,8 @@ typedef struct v2dScrollerMove { float fac; /* view adjustment factor, based on size of region */ float delta; /* amount moved by mouse on axis of interest */ + float scrollbarwidth; /* width of the scrollbar itself, used for page up/down clicks */ + int lastx, lasty; /* previous mouse coordinates (in screen coordinates) for determining movement */ } v2dScrollerMove; @@ -1165,19 +1168,21 @@ struct View2DScrollers { enum { SCROLLHANDLE_MIN= -1, SCROLLHANDLE_BAR, - SCROLLHANDLE_MAX + SCROLLHANDLE_MAX, + SCROLLHANDLE_MIN_OUTSIDE, + SCROLLHANDLE_MAX_OUTSIDE } eV2DScrollerHandle_Zone; /* ------------------------ */ /* check if mouse is within scroller handle * - mouse = relevant mouse coordinate in region space - * - sc_min, sc_max = extents of scroller - * - sh_min, sh_max = positions of scroller handles + * - sc_min, sc_max = extents of scroller 'groove' (potential available space for scroller) + * - sh_min, sh_max = positions of scrollbar handles */ static short mouse_in_scroller_handle(int mouse, int sc_min, int sc_max, int sh_min, int sh_max) { - short in_min, in_max, in_view=1; + short in_min, in_max, in_bar, out_min, out_max, in_view=1; /* firstly, check if * - 'bubble' fills entire scroller @@ -1199,17 +1204,24 @@ static short mouse_in_scroller_handle(int mouse, int sc_min, int sc_max, int sh_ } /* check if mouse is in or past either handle */ + // TODO: check if these extents are still valid or not in_max= ( (mouse >= (sh_max - V2D_SCROLLER_HANDLE_SIZE)) && (mouse <= (sh_max + V2D_SCROLLER_HANDLE_SIZE)) ); in_min= ( (mouse <= (sh_min + V2D_SCROLLER_HANDLE_SIZE)) && (mouse >= (sh_min - V2D_SCROLLER_HANDLE_SIZE)) ); + in_bar= ( (mouse < (sh_max - V2D_SCROLLER_HANDLE_SIZE)) && (mouse > (sh_min + V2D_SCROLLER_HANDLE_SIZE)) ); + out_min= mouse < (sh_min - V2D_SCROLLER_HANDLE_SIZE); + out_max= mouse > (sh_max + V2D_SCROLLER_HANDLE_SIZE); - /* check if overlap --> which means user clicked on bar, as bar is within handles region */ - if (in_max && in_min) + if (in_bar) return SCROLLHANDLE_BAR; else if (in_max) return SCROLLHANDLE_MAX; else if (in_min) return SCROLLHANDLE_MIN; - + else if (out_min) + return SCROLLHANDLE_MIN_OUTSIDE; + else if (out_max) + return SCROLLHANDLE_MAX_OUTSIDE; + /* unlikely to happen, though we just cover it in case */ return SCROLLHANDLE_BAR; } @@ -1230,6 +1242,7 @@ static void scroller_activate_init(bContext *C, wmOperator *op, wmEvent *event, /* set general data */ vsm->v2d= v2d; + vsm->ar= ar; vsm->scroller= in_scroller; /* store mouse-coordinates, and convert mouse/screen coordinates to region coordinates */ @@ -1248,14 +1261,14 @@ static void scroller_activate_init(bContext *C, wmOperator *op, wmEvent *event, vsm->fac= (v2d->tot.xmax - v2d->tot.xmin) / mask_size; /* get 'zone' (i.e. which part of scroller is activated) */ - if (v2d->keepzoom & V2D_LOCKZOOM_X) { + vsm->zone= mouse_in_scroller_handle(x, v2d->hor.xmin, v2d->hor.xmax, scrollers->hor_min, scrollers->hor_max); + + if ((v2d->keepzoom & V2D_LOCKZOOM_X) && ELEM(vsm->zone, SCROLLHANDLE_MIN, SCROLLHANDLE_MAX)) { /* default to scroll, as handles not usable */ vsm->zone= SCROLLHANDLE_BAR; } - else { - /* check which handle we're in */ - vsm->zone= mouse_in_scroller_handle(x, v2d->hor.xmin, v2d->hor.xmax, scrollers->hor_min, scrollers->hor_max); - } + + vsm->scrollbarwidth = scrollers->hor_max - scrollers->hor_min; } else { /* vertical scroller - calculate adjustment factor first */ @@ -1263,14 +1276,14 @@ static void scroller_activate_init(bContext *C, wmOperator *op, wmEvent *event, vsm->fac= (v2d->tot.ymax - v2d->tot.ymin) / mask_size; /* get 'zone' (i.e. which part of scroller is activated) */ - if (v2d->keepzoom & V2D_LOCKZOOM_Y) { + vsm->zone= mouse_in_scroller_handle(y, v2d->vert.ymin, v2d->vert.ymax, scrollers->vert_min, scrollers->vert_max); + + if ((v2d->keepzoom & V2D_LOCKZOOM_Y) && ELEM(vsm->zone, SCROLLHANDLE_MIN, SCROLLHANDLE_MAX)) { /* default to scroll, as handles not usable */ vsm->zone= SCROLLHANDLE_BAR; } - else { - /* check which handle we're in */ - vsm->zone= mouse_in_scroller_handle(y, v2d->vert.ymin, v2d->vert.ymax, scrollers->vert_min, scrollers->vert_max); - } + + vsm->scrollbarwidth = scrollers->vert_max - scrollers->vert_min; } UI_view2d_scrollers_free(scrollers); @@ -1320,8 +1333,11 @@ static void scroller_activate_apply(bContext *C, wmOperator *op) if ((vsm->scroller == 'v') && !(v2d->keepzoom & V2D_LOCKZOOM_Y)) v2d->cur.ymax += temp; break; - - default: /* SCROLLHANDLE_BAR */ + + case SCROLLHANDLE_MIN_OUTSIDE: + case SCROLLHANDLE_MAX_OUTSIDE: + case SCROLLHANDLE_BAR: + default: /* only move view on an axis if panning is allowed */ if ((vsm->scroller == 'h') && !(v2d->keepofs & V2D_LOCKOFS_X)) { v2d->cur.xmin += temp; @@ -1332,13 +1348,14 @@ static void scroller_activate_apply(bContext *C, wmOperator *op) v2d->cur.ymax += temp; } break; + } /* validate that view is in valid configuration after this operation */ UI_view2d_curRect_validate(v2d); /* request updates to be done... */ - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(vsm->ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); WM_event_add_mousemove(C); } @@ -1353,7 +1370,7 @@ static int scroller_activate_modal(bContext *C, wmOperator *op, wmEvent *event) case MOUSEMOVE: { /* calculate new delta transform, then store mouse-coordinates for next-time */ - if (vsm->zone != SCROLLHANDLE_MIN) { + if (ELEM(vsm->zone, SCROLLHANDLE_BAR, SCROLLHANDLE_MAX)) { /* if using bar (i.e. 'panning') or 'max' zoom widget */ switch (vsm->scroller) { case 'h': /* horizontal scroller - so only horizontal movement ('cur' moves opposite to mouse) */ @@ -1364,7 +1381,7 @@ static int scroller_activate_modal(bContext *C, wmOperator *op, wmEvent *event) break; } } - else { + else if (vsm->zone == SCROLLHANDLE_MIN) { /* using 'min' zoom widget */ switch (vsm->scroller) { case 'h': /* horizontal scroller - so only horizontal movement ('cur' moves with mouse) */ @@ -1386,8 +1403,23 @@ static int scroller_activate_modal(bContext *C, wmOperator *op, wmEvent *event) case LEFTMOUSE: if (event->val==KM_RELEASE) { - scroller_activate_exit(C, op); - return OPERATOR_FINISHED; + /* single-click was in empty space outside bubble, so scroll by 1 'page' */ + if (ELEM(vsm->zone, SCROLLHANDLE_MIN_OUTSIDE, SCROLLHANDLE_MAX_OUTSIDE)) { + if (vsm->zone == SCROLLHANDLE_MIN_OUTSIDE) + vsm->delta = -vsm->scrollbarwidth * 0.8; + else if (vsm->zone == SCROLLHANDLE_MAX_OUTSIDE) + vsm->delta = vsm->scrollbarwidth * 0.8; + + scroller_activate_apply(C, op); + scroller_activate_exit(C, op); + return OPERATOR_FINISHED; + } + + /* otherwise, end the drag action */ + if (vsm->lastx || vsm->lasty) { + scroller_activate_exit(C, op); + return OPERATOR_FINISHED; + } } break; } @@ -1502,7 +1534,7 @@ static int reset_exec(bContext *C, wmOperator *op) v2d->cur.ymax= v2d->cur.ymin + winy; /* align */ - if(v2d->align) { + if (v2d->align) { /* posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & V2D_ALIGN_NO_NEG_X)) { v2d->cur.xmax= 0.0f; @@ -1528,7 +1560,7 @@ static int reset_exec(bContext *C, wmOperator *op) UI_view2d_curRect_validate(v2d); /* request updates to be done... */ - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); WM_event_add_mousemove(C); @@ -1545,9 +1577,6 @@ void VIEW2D_OT_reset(wmOperatorType *ot) /* api callbacks */ ot->exec= reset_exec; ot->poll= view2d_poll; - - /* flags */ - // ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } /* ********************************************************* */ diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt new file mode 100644 index 00000000000..809ccb86234 --- /dev/null +++ b/source/blender/editors/mesh/CMakeLists.txt @@ -0,0 +1,41 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../bmesh + ../../imbuf + ../../makesdna + ../../makesrna + ../../windowmanager + ../../render/extern/include + ../../../../intern/guardedalloc +) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_mesh "${SRC}" "${INC}") diff --git a/source/blender/editors/mesh/bmesh_select.c b/source/blender/editors/mesh/bmesh_select.c index 2199a4bc594..dd86b2da9ee 100644 --- a/source/blender/editors/mesh/bmesh_select.c +++ b/source/blender/editors/mesh/bmesh_select.c @@ -167,7 +167,7 @@ static void draw_triangulated(short mcords[][2], short tot) } /* do the fill */ - filldisplist(&lb, &lb); + filldisplist(&lb, &lb, 0); /* do the draw */ dl= lb.first; /* filldisplist adds in head of list */ diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index 8291c46eedd..2d5323aa255 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -514,7 +514,6 @@ short EDBM_Extrude_vert(Object *obedit, BMEditMesh *em, short flag, float *nor) static int extrude_repeat_mesh(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em = ((Mesh *)obedit->data)->edit_btmesh; RegionView3D *rv3d = CTX_wm_region_view3d(C); @@ -671,7 +670,6 @@ static int mesh_extrude_region_exec(bContext *C, wmOperator *op) static int mesh_extrude_region_invoke(bContext *C, wmOperator *op, wmEvent *event) { - Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; float nor[3]; @@ -710,8 +708,7 @@ void MESH_OT_extrude_region(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* to give to transform */ - Properties_Proportional(ot); - Properties_Constraints(ot); + Transform_Properties(ot, P_PROPORTIONAL|P_CONSTRAINT|P_AXIS); RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); } @@ -730,7 +727,6 @@ static int mesh_extrude_verts_exec(bContext *C, wmOperator *op) static int mesh_extrude_verts_invoke(bContext *C, wmOperator *op, wmEvent *event) { - Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; float nor[3]; @@ -769,8 +765,7 @@ void MESH_OT_extrude_verts_indiv(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* to give to transform */ - Properties_Proportional(ot); - Properties_Constraints(ot); + Transform_Properties(ot, P_PROPORTIONAL|P_CONSTRAINT|P_AXIS); RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); } @@ -789,11 +784,9 @@ static int mesh_extrude_edges_exec(bContext *C, wmOperator *op) static int mesh_extrude_edges_invoke(bContext *C, wmOperator *op, wmEvent *event) { - Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; float nor[3]; - int constraint_axis[3] = {0, 0, 1}; int tmode; tmode = EDBM_Extrude_edges_indiv(em, op, BM_SELECT, nor); @@ -828,8 +821,7 @@ void MESH_OT_extrude_edges_indiv(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* to give to transform */ - Properties_Proportional(ot); - Properties_Constraints(ot); + Transform_Properties(ot, P_PROPORTIONAL|P_CONSTRAINT|P_AXIS); RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); } @@ -848,7 +840,6 @@ static int mesh_extrude_faces_exec(bContext *C, wmOperator *op) static int mesh_extrude_faces_invoke(bContext *C, wmOperator *op, wmEvent *event) { - Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; float nor[3]; @@ -890,8 +881,7 @@ void MESH_OT_extrude_faces_indiv(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* to give to transform */ - Properties_Proportional(ot); - Properties_Constraints(ot); + Transform_Properties(ot, P_PROPORTIONAL|P_CONSTRAINT|P_AXIS); RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); } @@ -1258,7 +1248,6 @@ void MESH_OT_selection_type(wmOperatorType *ot) static int editbmesh_mark_seam(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Mesh *me= ((Mesh *)obedit->data); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -1308,7 +1297,6 @@ void MESH_OT_mark_seam(wmOperatorType *ot) static int editbmesh_mark_sharp(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Mesh *me= ((Mesh *)obedit->data); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -1359,9 +1347,7 @@ void MESH_OT_mark_sharp(wmOperatorType *ot) static int editbmesh_vert_connect(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); - Mesh *me= ((Mesh *)obedit->data); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; BMesh *bm = em->bm; BMOperator bmop; @@ -1394,9 +1380,7 @@ void MESH_OT_vert_connect(wmOperatorType *ot) static int editbmesh_edge_split(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); - Mesh *me= ((Mesh *)obedit->data); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; BMesh *bm = em->bm; BMOperator bmop; @@ -1433,7 +1417,6 @@ void MESH_OT_edge_split(wmOperatorType *ot) static int mesh_duplicate_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh*)ob->data)->edit_btmesh; BMOperator bmop; @@ -1482,7 +1465,6 @@ void MESH_OT_duplicate(wmOperatorType *ot) static int flip_normals(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh; @@ -1525,14 +1507,12 @@ static const EnumPropertyItem direction_items[]= { /* only accepts 1 selected edge, or 2 selected faces */ static int edge_rotate_selected(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; BMOperator bmop; BMEdge *eed; BMIter iter; int ccw = RNA_int_get(op->ptr, "direction") == 1; // direction == 2 when clockwise and ==1 for counter CW. - short edgeCount = 0; if (!(em->bm->totfacesel == 2 || em->bm->totedgesel == 1)) { BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces"); @@ -1629,7 +1609,6 @@ void EDBM_pin_mesh(BMEditMesh *em, int swap) static int pin_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh; Mesh *me= ((Mesh *)obedit->data); @@ -1666,8 +1645,6 @@ void EDBM_unpin_mesh(BMEditMesh *em, int swap) { BMIter iter; BMHeader *ele; - int types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH}; - int sels[3] = {1, !(em->selectmode & SCE_SELECT_VERTEX), !(em->selectmode & SCE_SELECT_VERTEX | SCE_SELECT_EDGE)}; int itermode; if(em==NULL) return; @@ -1690,9 +1667,7 @@ void EDBM_unpin_mesh(BMEditMesh *em, int swap) static int unpin_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh; - Mesh *me= ((Mesh *)obedit->data); EDBM_unpin_mesh(em, RNA_boolean_get(op->ptr, "unselected")); @@ -1755,7 +1730,6 @@ void EDBM_hide_mesh(BMEditMesh *em, int swap) static int hide_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh; EDBM_hide_mesh(em, RNA_boolean_get(op->ptr, "unselected")); @@ -1809,7 +1783,6 @@ void EDBM_reveal_mesh(BMEditMesh *em) static int reveal_mesh_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh; EDBM_reveal_mesh(em); @@ -1837,7 +1810,6 @@ void MESH_OT_reveal(wmOperatorType *ot) static int normals_make_consistent_exec(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -1874,7 +1846,6 @@ void MESH_OT_normals_make_consistent(wmOperatorType *ot) static int do_smooth_vertex(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; ModifierData *md; @@ -1940,7 +1911,6 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot) static int bm_test_exec(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); RegionView3D *r3d = CTX_wm_region_view3d(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -2033,7 +2003,6 @@ void mesh_set_smooth_faces(BMEditMesh *em, short smooth) static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -2062,7 +2031,6 @@ void MESH_OT_faces_shade_smooth(wmOperatorType *ot) static int mesh_faces_shade_flat_exec(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; @@ -2100,7 +2068,6 @@ static const EnumPropertyItem axis_items[]= { static int mesh_rotate_uvs(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_edit_object(C); BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh; BMOperator bmop; @@ -2131,7 +2098,6 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op) static int mesh_reverse_uvs(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_edit_object(C); BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh; BMOperator bmop; @@ -2158,7 +2124,6 @@ static int mesh_reverse_uvs(bContext *C, wmOperator *op) static int mesh_rotate_colors(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_edit_object(C); BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh; BMOperator bmop; @@ -2190,7 +2155,6 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op) static int mesh_reverse_colors(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_edit_object(C); BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh; BMOperator bmop; @@ -2370,7 +2334,7 @@ static int merge_target(BMEditMesh *em, Scene *scene, View3D *v3d, Object *ob, { BMIter iter; BMVert *v; - float *vco, co[3], cent[3] = {0.0f, 0.0f, 0.0f}, fac; + float *vco=NULL, co[3], cent[3] = {0.0f, 0.0f, 0.0f}, fac; int i; if (target) { @@ -2392,9 +2356,10 @@ static int merge_target(BMEditMesh *em, Scene *scene, View3D *v3d, Object *ob, fac = 1.0f / (float)i; VECMUL(cent, fac); VECCOPY(co, cent); + vco = co; } - if (!co) + if (!vco) return OPERATOR_CANCELLED; if (uvmerge) { @@ -2517,7 +2482,6 @@ void MESH_OT_merge(wmOperatorType *ot) static int removedoublesflag_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; BMOperator bmop; int count; @@ -2587,7 +2551,6 @@ typedef struct PathEdge { int select_vertex_path_exec(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_edit_object(C); BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh; BMOperator bmop; @@ -3259,7 +3222,7 @@ void MESH_OT_rip(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* to give to transform */ - Properties_Proportional(ot); + Transform_Properties(ot, P_PROPORTIONAL); RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); } @@ -3343,7 +3306,7 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op) float blend= RNA_float_get(op->ptr, "blend"); int shape= RNA_enum_get(op->ptr, "shape"); int add= RNA_int_get(op->ptr, "add"); - int blended= 0, totshape; + int totshape; /*sanity check*/ totshape = CustomData_number_of_layers(&em->bm->vdata, CD_SHAPEKEY); @@ -3525,6 +3488,7 @@ static int solidify_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; #endif + return OPERATOR_CANCELLED; } @@ -3789,7 +3753,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op) } /*the floating point coordinates of verts in screen space will be stored in a hash table according to the vertices pointer*/ - gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "knife cut exec"); for(bv=BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);bv;bv=BMIter_Step(&iter)){ scr = MEM_mallocN(sizeof(float)*2, "Vertex Screen Coordinates"); VECCOPY(co, bv->co); @@ -4008,7 +3972,6 @@ void MESH_OT_quads_convert_to_tris(wmOperatorType *ot) static int tris_convert_to_quads_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - Scene *scene = CTX_data_scene(C); BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh; int dosharp, douvs, dovcols, domaterials; float limit = RNA_float_get(op->ptr, "limit"); @@ -4103,8 +4066,8 @@ static int split_mesh(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); BKE_mesh_end_editmesh(obedit->data, em); - return OPERATOR_FINISHED; #endif + return OPERATOR_FINISHED; } void MESH_OT_split(wmOperatorType *ot) @@ -4204,6 +4167,7 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float BKE_mesh_end_editmesh(obedit->data, em); return ok; #endif + return OPERATOR_CANCELLED; } static int spin_mesh_exec(bContext *C, wmOperator *op) @@ -4235,8 +4199,8 @@ static int spin_mesh_invoke(bContext *C, wmOperator *op, wmEvent *event) RNA_float_set_array(op->ptr, "center", give_cursor(scene, v3d)); RNA_float_set_array(op->ptr, "axis", rv3d->viewinv[2]); - return spin_mesh_exec(C, op); #endif + return spin_mesh_exec(C, op); } void MESH_OT_spin(wmOperatorType *ot) @@ -4333,6 +4297,7 @@ static int screw_mesh_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } #endif + return OPERATOR_CANCELLED; } /* get center and axis, in global coords */ diff --git a/source/blender/editors/mesh/editbmesh_add.c b/source/blender/editors/mesh/editbmesh_add.c index 72e728ec731..20bd2d3d82b 100644 --- a/source/blender/editors/mesh/editbmesh_add.c +++ b/source/blender/editors/mesh/editbmesh_add.c @@ -166,7 +166,7 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); @@ -211,7 +211,7 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit= CTX_data_edit_object(C); @@ -251,7 +251,7 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op) int enter_editmode; float loc[3], rot[3]; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode); make_prim_ext(C, loc, rot, enter_editmode, PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0, @@ -294,7 +294,7 @@ static int add_primitive_tube_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); @@ -344,7 +344,7 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); @@ -396,7 +396,7 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); @@ -449,7 +449,7 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); @@ -493,7 +493,7 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); @@ -544,7 +544,7 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) int state; int layer; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); make_prim_init(C, &dia, mat, &state, loc, rot, layer); obedit = CTX_data_edit_object(C); diff --git a/source/blender/editors/mesh/editbmesh_bvh.c b/source/blender/editors/mesh/editbmesh_bvh.c index e783e855d5e..c0f82a0fe23 100644 --- a/source/blender/editors/mesh/editbmesh_bvh.c +++ b/source/blender/editors/mesh/editbmesh_bvh.c @@ -374,7 +374,7 @@ static float topo_compare(BMesh *bm, BMVert *v1, BMVert *v2, int tag) if (BM_Vert_EdgeCount(v1) != BM_Vert_EdgeCount(v2)) return 1.0f; /*full mismatch*/ - gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh bvh"); #define SPUSH(s, d, vt, lv, e)\ if (BLI_array_count(s) <= lvl) BLI_array_growone(s);\ @@ -619,7 +619,7 @@ BMVert *BMBVH_FindClosestVertTopo(BMBVHTree *tree, float *co, float maxdist, BMV tree->curv = NULL; tree->curtag = 1; - tree->gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + tree->gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh bvh"); tree->maxdist = maxdist; tree->v = sourcev; diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 442a0121ca5..0ee1e97ee77 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -40,14 +40,9 @@ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" -#include "DNA_image_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" #include "BKE_brush.h" #include "BKE_customdata.h" @@ -66,7 +61,6 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "GPU_draw.h" #ifndef DISABLE_PYTHON //#include "BPY_extern.h" @@ -75,7 +69,6 @@ #include "ED_mesh.h" #include "ED_screen.h" -#include "ED_object.h" #include "ED_view3d.h" #include "WM_api.h" @@ -85,7 +78,7 @@ #include "mesh_intern.h" /* ***************** XXX **************** */ -static int pupmenu() {return 0;} +static int pupmenu(const char *dummy) {return 0;} /* ***************** XXX **************** */ @@ -784,7 +777,7 @@ void seam_mark_clear_tface(Scene *scene, short mode) for (a=0, med=me->medge; atotedge; a++, med++) if (BLI_edgehash_haskey(ehash1, med->v1, med->v2) && - BLI_edgehash_haskey(ehash2, med->v1, med->v2)) + BLI_edgehash_haskey(ehash2, med->v1, med->v2)) med->flag |= ME_SEAM; BLI_edgehash_free(ehash1, NULL); diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c index 4d5af4eb236..b92e73ac77d 100644 --- a/source/blender/editors/mesh/loopcut.c +++ b/source/blender/editors/mesh/loopcut.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -73,7 +73,6 @@ #include "RNA_define.h" #include "UI_interface.h" -#include "UI_resources.h" #include "WM_api.h" #include "WM_types.h" @@ -130,7 +129,7 @@ static void ringsel_draw(const bContext *C, ARegion *ar, void *arg) static void edgering_find_order(BMEditMesh *em, BMEdge *lasteed, BMEdge *eed, BMVert *lastv1, BMVert *v[2][2]) { - BMIter iter, liter; + BMIter liter; BMLoop *l, *l2; int rev; @@ -178,7 +177,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select) float (*edges)[2][3] = NULL; BLI_array_declare(edges); float co[2][3]; - int looking=1, i, tot=0; + int i, tot=0; if (!startedge) return; @@ -209,10 +208,6 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select) lastv1 = NULL; for (lasteed=NULL; eed; eed=BMW_Step(&walker)) { if (lasteed) { - BMIter liter; - BMLoop *l, *l2; - int rev; - if (lastv1) { v[1][0] = v[0][0]; v[1][1] = v[0][1]; @@ -291,7 +286,16 @@ static void ringsel_finish(bContext *C, wmOperator *op) BM_esubdivideflag(lcd->ob, em->bm, BM_SELECT, 0.0f, 0.0f, 0, cuts, SUBDIV_SELECT_LOOPCUT, SUBD_PATH, 0, 0); - + /* force edge slide to edge select mode in in face select mode */ + if (em->selectmode & SCE_SELECT_FACE) { + if (em->selectmode == SCE_SELECT_FACE) + em->selectmode = SCE_SELECT_EDGE; + else + em->selectmode &= ~SCE_SELECT_FACE; + CTX_data_tool_settings(C)->selectmode= em->selectmode; + EDBM_selectmode_set(em); + } + WM_event_add_notifier(C, NC_GEOM|ND_SELECT|ND_DATA, lcd->ob->data); DAG_id_flush_update(lcd->ob->data, OB_RECALC_DATA); } @@ -416,7 +420,7 @@ static int ringsel_modal (bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_FINISHED; case RIGHTMOUSE: /* confirm */ // XXX hardcoded - if (event->val == KM_RELEASE) { + if (event->val == KM_PRESS) { /* finish */ ED_region_tag_redraw(lcd->ar); diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index be688cf0c6c..6f6af2d84a5 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -32,20 +32,18 @@ #include "MEM_guardedalloc.h" -#include "DNA_customdata_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_context.h" #include "BKE_customdata.h" #include "BKE_depsgraph.h" #include "BKE_displist.h" #include "BKE_global.h" +#include "BKE_image.h" #include "BKE_library.h" #include "BKE_material.h" #include "BKE_mesh.h" @@ -321,17 +319,33 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) { Scene *scene= CTX_data_scene(C); Base *base= ED_view3d_give_base_under_cursor(C, event->mval); - Image *ima; + Image *ima= NULL; Mesh *me; Object *obedit; int exitmode= 0; char name[32]; + /* Check context */ + if(base==NULL || base->object->type!=OB_MESH) { + BKE_report(op->reports, RPT_ERROR, "Not an Object or Mesh"); + return OPERATOR_CANCELLED; + } + /* check input variables */ - RNA_string_get(op->ptr, "name", name); - ima= (Image *)find_id("IM", name); - if(base==NULL || base->object->type!=OB_MESH || ima==NULL) { - BKE_report(op->reports, RPT_ERROR, "Not a Mesh or no Image."); + if(RNA_property_is_set(op->ptr, "filepath")) { + char path[FILE_MAX]; + + RNA_string_get(op->ptr, "filepath", path); + ima= BKE_add_image_file(path, + scene ? scene->r.cfra : 1); + } + else { + RNA_string_get(op->ptr, "name", name); + ima= (Image *)find_id("IM", name); + } + + if(!ima) { + BKE_report(op->reports, RPT_ERROR, "Not an Image."); return OPERATOR_CANCELLED; } @@ -377,6 +391,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot) /* properties */ RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Image name to assign."); + RNA_def_string(ot->srna, "filepath", "Path", FILE_MAX, "Filepath", "Path to image file"); } static int uv_texture_remove_exec(bContext *C, wmOperator *op) @@ -703,7 +718,7 @@ static void mesh_add_faces(Mesh *mesh, int len) /* set default flags */ mface= &mesh->mface[mesh->totface]; for(i=0; iflag= SELECT; + mface->flag= ME_FACE_SEL; mesh->totface= totface; } diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index 27312b83c14..13299405a57 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -40,6 +40,8 @@ #include "BLI_editVert.h" +#include "RNA_types.h" + struct bContext; struct wmOperatorType; struct ViewContext; @@ -225,35 +227,22 @@ void MESH_OT_flip_normals(struct wmOperatorType *ot); void MESH_OT_solidify(struct wmOperatorType *ot); void MESH_OT_select_nth(struct wmOperatorType *ot); -extern void EM_automerge(Scene *scene, Object *obedit, int update); -void editmesh_select_by_material(EditMesh *em, int index); -void EM_recalc_normal_direction(EditMesh *em, int inside, int select); /* makes faces righthand turning */ -void EM_select_more(EditMesh *em); -void selectconnected_mesh_all(EditMesh *em); -void faceloop_select(struct BMEditMesh *em, struct BMEdge *startedge, int select); - -/** - * findnearestvert - * - * dist (in/out): minimal distance to the nearest and at the end, actual distance - * sel: selection bias - * if SELECT, selected vertice are given a 5 pixel bias to make them farter than unselect verts - * if 0, unselected vertice are given the bias - * strict: if 1, the vertice corresponding to the sel parameter are ignored and not just biased - */ -extern EditVert *findnearestvert(struct ViewContext *vc, int *dist, short sel, short strict); - - -/* ******************* editmesh_tools.c */ #define SUBDIV_SELECT_ORIG 0 #define SUBDIV_SELECT_INNER 1 #define SUBDIV_SELECT_INNER_SEL 2 #define SUBDIV_SELECT_LOOPCUT 3 +/* edge subdivide corner cut types */ +#define SUBDIV_CORNER_PATH 0 +#define SUBDIV_CORNER_INNERVERT 1 +#define SUBDIV_CORNER_FAN 2 + +extern EnumPropertyItem corner_type_items[]; + void join_triangles(EditMesh *em); int removedoublesflag(EditMesh *em, short flag, short automerge, float limit); /* return amount */ -void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float fractal, int beautify, int numcuts, int seltype); +void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float fractal, int beautify, int numcuts, int corner_pattern, int seltype); int EdgeSlide(EditMesh *em, struct wmOperator *op, short immediate, float imperc); void MESH_OT_merge(struct wmOperatorType *ot); @@ -291,6 +280,7 @@ void MESH_OT_rip(struct wmOperatorType *ot); void MESH_OT_shape_propagate_to_all(struct wmOperatorType *ot); void MESH_OT_blend_from_shape(struct wmOperatorType *ot); +void MESH_OT_sort_faces(struct wmOperatorType *ot); /* ******************* mesh_data.c */ diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 0aa7dfee67d..0e034c8ca6d 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -33,11 +33,6 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -49,18 +44,14 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" -#include "ED_mesh.h" #include "ED_object.h" #include "ED_screen.h" -#include "ED_transform.h" #include "ED_view3d.h" -#include "UI_interface.h" #include "mesh_intern.h" @@ -122,6 +113,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_edge_flip); WM_operatortype_append(MESH_OT_faces_shade_smooth); WM_operatortype_append(MESH_OT_faces_shade_flat); + //WM_operatortype_append(MESH_OT_sort_faces); WM_operatortype_append(MESH_OT_delete); @@ -184,30 +176,35 @@ void ED_operatormacros_mesh(void) WM_operatortype_macro_define(ot, "MESH_OT_duplicate"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); + RNA_boolean_set(otmacro->ptr, "mirror", 0); ot= WM_operatortype_append_macro("MESH_OT_rip_move", "Rip", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Rip polygons and move the result"; WM_operatortype_macro_define(ot, "MESH_OT_rip"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); + RNA_boolean_set(otmacro->ptr, "mirror", 0); ot= WM_operatortype_append_macro("MESH_OT_extrude_region_move", "Extrude Region and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude region and move result"; otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude_region"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); + RNA_boolean_set(otmacro->ptr, "mirror", 0); ot= WM_operatortype_append_macro("MESH_OT_extrude_faces_move", "Extrude Individual Faces and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude faces and move result"; otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude_faces_indiv"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_shrink_fatten"); RNA_enum_set(otmacro->ptr, "proportional", 0); + RNA_boolean_set(otmacro->ptr, "mirror", 0); ot= WM_operatortype_append_macro("MESH_OT_extrude_edges_move", "Extrude Only Edges and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude edges and move result"; otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude_edges_indiv"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); + RNA_boolean_set(otmacro->ptr, "mirror", 0); ot= WM_operatortype_append_macro("MESH_OT_extrude_vertices_move", "Extrude Only Vertices and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude vertices and move result"; @@ -215,6 +212,7 @@ void ED_operatormacros_mesh(void) RNA_enum_set(otmacro->ptr, "type", 4); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); + RNA_boolean_set(otmacro->ptr, "mirror", 0); } /* note mesh keymap also for other space? */ @@ -272,8 +270,9 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); + //WM_keymap_add_item(keymap, "MESH_OT_sort_faces", FKEY, KM_PRESS, KM_ALT|KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "MESH_OT_edge_flip", FKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); @@ -298,6 +297,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "MESH_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MESH_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, 0, KKEY); RNA_enum_set(WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_SHIFT, KKEY)->ptr, "type", 2/*KNIFE_MIDPOINT*/); @@ -313,6 +313,6 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_menu(keymap, "VIEW3D_MT_uv_map", UKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0); - ED_object_generic_keymap(keyconf, keymap, TRUE); + ED_object_generic_keymap(keyconf, keymap, 2); } diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index 557c15872a1..bcc00e0640a 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -39,18 +39,12 @@ #include "MEM_guardedalloc.h" -#include "DNA_image_types.h" #include "DNA_key_types.h" #include "DNA_material_types.h" #include "DNA_meshdata_types.h" -#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -89,10 +83,6 @@ /* own include */ #include "mesh_intern.h" -/* XXX */ -static int pupmenu() {return 0;} -/* XXX */ - /* * ********************** no editmode!!! *********** */ @@ -662,153 +652,6 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -/* ********************** SORT FACES ******************* */ - -static void permutate(void *list, int num, int size, int *index) -{ - void *buf; - int len; - int i; - - len = num * size; - - buf = MEM_mallocN(len, "permutate"); - memcpy(buf, list, len); - - for (i = 0; i < num; i++) { - memcpy((char *)list + (i * size), (char *)buf + (index[i] * size), size); - } - MEM_freeN(buf); -} - -/* sort faces on view axis */ -static float *face_sort_floats; -static int float_sort(const void *v1, const void *v2) -{ - float x1, x2; - - x1 = face_sort_floats[((int *) v1)[0]]; - x2 = face_sort_floats[((int *) v2)[0]]; - - if( x1 > x2 ) return 1; - else if( x1 < x2 ) return -1; - return 0; -} - - -void sort_faces(Scene *scene, View3D *v3d) -{ - RegionView3D *rv3d= NULL; // get from context - Object *ob= OBACT; - Mesh *me; - CustomDataLayer *layer; - int i, *index; - short event; - float reverse = 1; - int ctrl= 0; // XXX - - if(!ob) return; - if(scene->obedit) return; - if(ob->type!=OB_MESH) return; - if (!v3d) return; - - me= ob->data; - if(me->totface==0) return; - - event = pupmenu( - "Sort Faces (Ctrl to reverse)%t|" - "View Axis%x1|" - "Cursor Distance%x2|" - "Material%x3|" - "Selection%x4|" - "Randomize%x5"); - - if (event==-1) return; - - if(ctrl) - reverse = -1; - -/* create index list */ - index = (int *) MEM_mallocN(sizeof(int) * me->totface, "sort faces"); - for (i = 0; i < me->totface; i++) { - index[i] = i; - } - - face_sort_floats = (float *) MEM_mallocN(sizeof(float) * me->totface, "sort faces float"); - -/* sort index list instead of faces itself - and apply this permutation to all face layers */ - - if (event == 5) { - /* Random */ - for(i=0; itotface; i++) { - face_sort_floats[i] = BLI_frand(); - } - qsort(index, me->totface, sizeof(int), float_sort); - } else { - MFace *mf; - float vec[3]; - float mat[4][4]; - float cur[3]; - - if (event == 1) - mul_m4_m4m4(mat, OBACT->obmat, rv3d->viewmat); /* apply the view matrix to the object matrix */ - else if (event == 2) { /* sort from cursor */ - if( v3d && v3d->localvd ) { - VECCOPY(cur, v3d->cursor); - } else { - VECCOPY(cur, scene->cursor); - } - invert_m4_m4(mat, OBACT->obmat); - mul_m4_v3(mat, cur); - } - - mf= me->mface; - for(i=0; itotface; i++, mf++) { - - if (event==3) { - face_sort_floats[i] = ((float)mf->mat_nr)*reverse; - } else if (event==4) { - /*selected first*/ - if (mf->flag & ME_FACE_SEL) face_sort_floats[i] = 0.0; - else face_sort_floats[i] = reverse; - } else { - /* find the faces center */ - add_v3_v3v3(vec, (me->mvert+mf->v1)->co, (me->mvert+mf->v2)->co); - if (mf->v4) { - add_v3_v3v3(vec, vec, (me->mvert+mf->v3)->co); - add_v3_v3v3(vec, vec, (me->mvert+mf->v4)->co); - mul_v3_fl(vec, 0.25f); - } else { - add_v3_v3v3(vec, vec, (me->mvert+mf->v3)->co); - mul_v3_fl(vec, 1.0f/3.0f); - } /* done */ - - if (event == 1) { /* sort on view axis */ - mul_m4_v3(mat, vec); - face_sort_floats[i] = vec[2] * reverse; - } else if(event == 2) { /* distance from cursor*/ - face_sort_floats[i] = len_v3v3(cur, vec) * reverse; /* back to front */ - } - } - } - qsort(index, me->totface, sizeof(int), float_sort); - } - - MEM_freeN(face_sort_floats); - - for(i = 0; i < me->fdata.totlayer; i++) { - layer = &me->fdata.layers[i]; - permutate(layer->data, me->totface, CustomData_sizeof(layer->type), index); - } - - MEM_freeN(index); - - DAG_id_flush_update(ob->data, OB_RECALC_DATA); -} - - - /* ********************* MESH VERTEX OCTREE LOOKUP ************* */ /* important note; this is unfinished, needs better API for editmode, and custom threshold */ @@ -1367,11 +1210,6 @@ float *editmesh_get_mirror_uv(int axis, float *uv, float *mirrCent, float *face_ cent_vec[1] = face_cent[1]; } - /* - G.v2d->cursor[0] = mirrCent[0]; - G.v2d->cursor[1] = mirrCent[1]; - */ - /* TODO - Optimize */ { EditFace *efa; @@ -1460,7 +1298,7 @@ int *mesh_get_x_mirror_faces(Object *ob, BMEditMesh *em) mesh_octree_table(ob, em, NULL, 'e'); - fhash= BLI_ghash_new(mirror_facehash, mirror_facecmp); + fhash= BLI_ghash_new(mirror_facehash, mirror_facecmp, "mirror_facehash gh"); for(a=0, mf=mface; atotface; a++, mf++) BLI_ghash_insert(fhash, mf, mf); diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt new file mode 100644 index 00000000000..5e821a5c1e8 --- /dev/null +++ b/source/blender/editors/metaball/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../makesdna + ../../makesrna + ../../render/extern/include + ../../windowmanager + ../../../../intern/guardedalloc +) + +BLENDERLIB(bf_editor_metaball "${SRC}" "${INC}") diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index 625f9b630f4..1d76717e9eb 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -30,10 +30,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" @@ -43,9 +39,6 @@ #include "DNA_meta_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" -#include "DNA_userdef_types.h" #include "RNA_define.h" #include "RNA_access.h" @@ -54,6 +47,7 @@ #include "BKE_depsgraph.h" #include "BKE_object.h" #include "BKE_context.h" +#include "BKE_library.h" #include "ED_screen.h" #include "ED_view3d.h" @@ -66,6 +60,10 @@ /* This function is used to free all MetaElems from MetaBall */ void free_editMball(Object *obedit) { + MetaBall *mb = (MetaBall*)obedit->data; + + mb->editelems= NULL; + mb->lastelem= NULL; } /* This function is called, when MetaBall Object is @@ -87,13 +85,9 @@ void make_editMball(Object *obedit) /* This function is called, when MetaBall Object switched from * edit mode to object mode. List od MetaElements is copied - * from object->data->edit_elems to to object->data->elems. */ + * from object->data->edit_elems to object->data->elems. */ void load_editMball(Object *obedit) { - MetaBall *mb = (MetaBall*)obedit->data; - - mb->editelems= NULL; - mb->lastelem= NULL; } /* Add metaelem primitive to metaball object (which is in edit mode) */ @@ -129,24 +123,29 @@ MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int new case MB_BALL: ml->type = MB_BALL; ml->expx= ml->expy= ml->expz= 1.0; + break; case MB_TUBE: ml->type = MB_TUBE; ml->expx= ml->expy= ml->expz= 1.0; + break; case MB_PLANE: ml->type = MB_PLANE; ml->expx= ml->expy= ml->expz= 1.0; + break; case MB_ELIPSOID: ml->type = MB_ELIPSOID; ml->expx= 1.2f; ml->expy= 0.8f; ml->expz= 1.0; + break; case MB_CUBE: ml->type = MB_CUBE; ml->expx= ml->expy= ml->expz= 1.0; + break; default: break; @@ -206,7 +205,7 @@ void MBALL_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select/Deselect All"; - ot->description= "Change selection of all meta elements"; + ot->description= "Change selection of all meta elements"; ot->idname= "MBALL_OT_select_all"; /* callback functions */ @@ -247,7 +246,7 @@ void MBALL_OT_select_inverse_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name= "Inverse"; - ot->description= "Select inverse of (un)selected metaelements"; + ot->description= "Select inverse of (un)selected metaelements"; ot->idname= "MBALL_OT_select_inverse_metaelems"; /* callback functions */ @@ -293,7 +292,7 @@ void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Random..."; - ot->description= "Randomly select metaelements"; + ot->description= "Randomly select metaelements"; ot->idname= "MBALL_OT_select_random_metaelems"; /* callback functions */ @@ -352,7 +351,7 @@ void MBALL_OT_duplicate_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name= "Duplicate"; - ot->description= "Delete selected metaelement(s)"; + ot->description= "Delete selected metaelement(s)"; ot->idname= "MBALL_OT_duplicate_metaelems"; /* callback functions */ @@ -398,7 +397,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name= "Delete"; - ot->description= "Delete selected metaelement(s)"; + ot->description= "Delete selected metaelement(s)"; ot->idname= "MBALL_OT_delete_metaelems"; /* callback functions */ @@ -448,7 +447,7 @@ void MBALL_OT_hide_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name= "Hide"; - ot->description= "Hide (un)selected metaelement(s)"; + ot->description= "Hide (un)selected metaelement(s)"; ot->idname= "MBALL_OT_hide_metaelems"; /* callback functions */ @@ -489,7 +488,7 @@ void MBALL_OT_reveal_metaelems(wmOperatorType *ot) { /* identifiers */ ot->name= "Reveal"; - ot->description= "Reveal all hidden metaelements"; + ot->description= "Reveal all hidden metaelements"; ot->idname= "MBALL_OT_reveal_metaelems"; /* callback functions */ diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index 9b8cccbbfce..e8d2237d8a2 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -31,8 +31,6 @@ #include "RNA_access.h" -#include "DNA_listBase.h" -#include "DNA_windowmanager_types.h" #include "ED_screen.h" @@ -66,6 +64,7 @@ void ED_keymap_metaball(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MBALL_OT_duplicate_metaelems", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MBALL_OT_select_all", AKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt new file mode 100644 index 00000000000..e1085fd87ca --- /dev/null +++ b/source/blender/editors/object/CMakeLists.txt @@ -0,0 +1,48 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../bmesh + ../../gpu + ../../ikplugin + ../../imbuf + ../../makesdna + ../../makesrna + ../../python + ../../windowmanager + ../../render/extern/include + ../../../../intern/guardedalloc +) + +IF(NOT WITH_PYTHON) + ADD_DEFINITIONS(-DDISABLE_PYTHON) +ENDIF(NOT WITH_PYTHON) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_object "${SRC}" "${INC}") diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 7620d503f49..5fa643200f4 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -30,7 +30,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" #include "DNA_curve_types.h" #include "DNA_group_types.h" #include "DNA_lamp_types.h" @@ -38,12 +37,8 @@ #include "DNA_mesh_types.h" #include "DNA_meta_types.h" #include "DNA_object_fluidsim.h" -#include "DNA_object_types.h" #include "DNA_object_force.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" #include "DNA_vfont_types.h" #include "BLI_math.h" @@ -83,7 +78,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_anim_api.h" #include "ED_armature.h" #include "ED_curve.h" #include "ED_mball.h" @@ -92,6 +86,7 @@ #include "ED_render.h" #include "ED_screen.h" #include "ED_transform.h" +#include "ED_view3d.h" #include "UI_interface.h" #include "UI_resources.h" @@ -104,20 +99,16 @@ void ED_object_location_from_view(bContext *C, float *loc) { View3D *v3d= CTX_wm_view3d(C); Scene *scene= CTX_data_scene(C); + float *cursor; - if (v3d) { - if (v3d->localvd) - copy_v3_v3(loc, v3d->cursor); - else - copy_v3_v3(loc, scene->cursor); - } else { - copy_v3_v3(loc, scene->cursor); - } + cursor = give_cursor(scene, v3d); + + copy_v3_v3(loc, cursor); } void ED_object_rotation_from_view(bContext *C, float *rot) { - RegionView3D *rv3d = CTX_wm_region_view3d(C); + RegionView3D *rv3d= ED_view3d_context_rv3d(C); if(rv3d) { rv3d->viewquat[0]= -rv3d->viewquat[0]; @@ -146,9 +137,8 @@ void ED_object_base_init_transform(bContext *C, Base *base, float *loc, float *r /* uses context to figure out transform for primitive */ /* returns standard diameter */ -float ED_object_new_primitive_matrix(bContext *C, float *loc, float *rot, float primmat[][4]) +float ED_object_new_primitive_matrix(bContext *C, Object *obedit, float *loc, float *rot, float primmat[][4]) { - Object *obedit= CTX_data_edit_object(C); View3D *v3d =CTX_wm_view3d(C); float mat[3][3], rmat[3][3], cmat[3][3], imat[3][3]; @@ -164,8 +154,8 @@ float ED_object_new_primitive_matrix(bContext *C, float *loc, float *rot, float copy_m4_m3(primmat, imat); /* center */ - VECCOPY(primmat[3], loc); - VECSUB(primmat[3], primmat[3], obedit->obmat[3]); + copy_v3_v3(primmat[3], loc); + sub_v3_v3v3(primmat[3], primmat[3], obedit->obmat[3]); invert_m3_m3(imat, mat); mul_m3_v3(imat, primmat[3]); @@ -185,13 +175,15 @@ void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode) PropertyRNA *prop; RNA_def_boolean(ot->srna, "view_align", 0, "Align to View", "Align the new object to the view."); - if(do_editmode) - RNA_def_boolean(ot->srna, "enter_editmode", 0, "Enter Editmode", "Enter editmode when adding this object."); + if(do_editmode) { + prop= RNA_def_boolean(ot->srna, "enter_editmode", 0, "Enter Editmode", "Enter editmode when adding this object."); + RNA_def_property_flag(prop, PROP_HIDDEN); + } RNA_def_float_vector(ot->srna, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "Location for the newly added object.", -FLT_MAX, FLT_MAX); RNA_def_float_rotation(ot->srna, "rotation", 3, NULL, -FLT_MAX, FLT_MAX, "Rotation", "Rotation for the newly added object", -FLT_MAX, FLT_MAX); - prop = RNA_def_boolean_layer_member(ot->srna, "layer", 32, NULL, "Layer", ""); + prop = RNA_def_boolean_layer_member(ot->srna, "layer", 20, NULL, "Layer", ""); RNA_def_property_flag(prop, PROP_HIDDEN); } @@ -201,47 +193,28 @@ static void object_add_generic_invoke_options(bContext *C, wmOperator *op) if (!RNA_property_is_set(op->ptr, "enter_editmode")) RNA_boolean_set(op->ptr, "enter_editmode", U.flag & USER_ADD_EDITMODE); - if (!RNA_property_is_set(op->ptr, "location")) { + if(!RNA_property_is_set(op->ptr, "location")) { float loc[3]; ED_object_location_from_view(C, loc); RNA_float_set_array(op->ptr, "location", loc); } - - if (!RNA_property_is_set(op->ptr, "rotation")) { - int view_align; - float rot[3] = {0.f, 0.f, 0.f}; - - /* view align property is just used to set rotation property */ - if (!RNA_property_is_set(op->ptr, "view_align")) - view_align = U.flag & USER_ADD_VIEWALIGNED; - else - view_align = RNA_boolean_get(op->ptr, "view_align"); - - if (view_align) - ED_object_rotation_from_view(C, rot); - - RNA_float_set_array(op->ptr, "rotation", rot); - } - - if (!RNA_property_is_set(op->ptr, "layer")) { + + if(!RNA_property_is_set(op->ptr, "layer")) { View3D *v3d = CTX_wm_view3d(C); Scene *scene = CTX_data_scene(C); - int a, values[32], layer; + int a, values[20], layer; - if (v3d) { - if (v3d->localvd) { - layer = v3d->layact + v3d->lay; - for(a=0; a<32; a++) - values[a]= (layer & (1<layact; - for(a=0; a<32; a++) - values[a]= (layer & (1<lay; - for(a=0; a<32; a++) + if(v3d) { + layer = (v3d->scenelock && !v3d->localvd)? scene->layact: v3d->layact; + + for(a=0; a<20; a++) + values[a]= (layer & (1<layact; + + for(a=0; a<20; a++) values[a]= (layer & (1<type->exec(C, op); } -void ED_object_add_generic_get_opts(wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer) +int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer) { - int a, layer_values[32]; + View3D *v3d = CTX_wm_view3d(C); + int a, layer_values[20]; + int view_align; *enter_editmode = FALSE; if(RNA_struct_find_property(op->ptr, "enter_editmode") && RNA_boolean_get(op->ptr, "enter_editmode")) { *enter_editmode = TRUE; } + + if(RNA_property_is_set(op->ptr, "layer")) { + RNA_boolean_get_array(op->ptr, "layer", layer_values); + + for(a=0; a<20; a++) { + if(layer_values[a]) + *layer |= (1 << a); + else + *layer &= ~(1 << a); + } + } + else { + /* not set, use the scenes layers */ + Scene *scene = CTX_data_scene(C); + *layer = scene->layact; + } + + /* in local view we additionally add local view layers, + not part of operator properties */ + if(v3d && v3d->localvd) + *layer |= v3d->lay; + + if (RNA_property_is_set(op->ptr, "view_align")) + view_align = RNA_boolean_get(op->ptr, "view_align"); + else + view_align = U.flag & USER_ADD_VIEWALIGNED; + + if (view_align) + ED_object_rotation_from_view(C, rot); + else + RNA_float_get_array(op->ptr, "rotation", rot); + RNA_float_get_array(op->ptr, "location", loc); - RNA_float_get_array(op->ptr, "rotation", rot); - RNA_boolean_get_array(op->ptr, "layer", layer_values); - - for(a=0; a<32; a++) - if(layer_values[a]) - *layer |= (1 << a); - else - *layer &= ~(1 << a); + + if(*layer == 0) { + BKE_report(op->reports, RPT_ERROR, "Property 'layer' has no values set"); + return 0; + } + + return 1; } /* for object add primitive operators */ @@ -310,7 +316,9 @@ static int object_add_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; + ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode, layer); return OPERATOR_FINISHED; @@ -369,7 +377,9 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) float mat[4][4]; object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return NULL; if(type==PFIELD_GUIDE) { ob= ED_object_add_type(C, OB_CURVE, loc, rot, FALSE, layer); @@ -377,7 +387,7 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) ((Curve*)ob->data)->flag |= CU_PATH|CU_3D; ED_object_enter_editmode(C, 0); - ED_object_new_primitive_matrix(C, loc, rot, mat); + ED_object_new_primitive_matrix(C, ob, loc, rot, mat); BLI_addtail(curve_get_editcurve(ob), add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_PATH, 1)); if(!enter_editmode) @@ -403,8 +413,9 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) /* for object add operator */ static int effector_add_exec(bContext *C, wmOperator *op) { - effector_add_type(C, op, RNA_int_get(op->ptr, "type")); - + if(effector_add_type(C, op, RNA_int_get(op->ptr, "type")) == NULL) + return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } @@ -444,7 +455,9 @@ static int object_camera_add_exec(bContext *C, wmOperator *op) RNA_boolean_set(op->ptr, "view_align", 1); object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_CAMERA, loc, rot, FALSE, layer); @@ -479,160 +492,6 @@ void OBJECT_OT_camera_add(wmOperatorType *ot) /* ***************** add primitives *************** */ -static EnumPropertyItem prop_curve_types[] = { - {CU_BEZIER|CU_PRIM_CURVE, "BEZIER_CURVE", ICON_CURVE_BEZCURVE, "Bezier Curve", ""}, - {CU_BEZIER|CU_PRIM_CIRCLE, "BEZIER_CIRCLE", ICON_CURVE_BEZCIRCLE, "Bezier Circle", ""}, - {CU_NURBS|CU_PRIM_CURVE, "NURBS_CURVE", ICON_CURVE_NCURVE, "NURBS Curve", ""}, - {CU_NURBS|CU_PRIM_CIRCLE, "NURBS_CIRCLE", ICON_CURVE_NCIRCLE, "NURBS Circle", ""}, - {CU_NURBS|CU_PRIM_PATH, "PATH", ICON_CURVE_PATH, "Path", ""}, - {0, NULL, 0, NULL, NULL} -}; - -static int object_add_curve_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - ListBase *editnurb; - Nurb *nu; - int newob= 0, type= RNA_enum_get(op->ptr, "type"); - int enter_editmode; - unsigned int layer; - float loc[3], rot[3]; - float mat[4][4]; - - object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); - - if(obedit==NULL || obedit->type!=OB_CURVE) { - obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE, layer); - newob = 1; - - if(type & CU_PRIM_PATH) - ((Curve*)obedit->data)->flag |= CU_PATH|CU_3D; - } - else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); - - ED_object_new_primitive_matrix(C, loc, rot, mat); - - nu= add_nurbs_primitive(C, mat, type, newob); - editnurb= curve_get_editcurve(obedit); - BLI_addtail(editnurb, nu); - - /* userdef */ - if (newob && !enter_editmode) { - ED_object_exit_editmode(C, EM_FREEDATA); - } - - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); - - return OPERATOR_FINISHED; -} - -static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - Object *obedit= CTX_data_edit_object(C); - uiPopupMenu *pup; - uiLayout *layout; - - object_add_generic_invoke_options(C, op); - - pup= uiPupMenuBegin(C, op->type->name, 0); - layout= uiPupMenuLayout(pup); - if(!obedit || obedit->type == OB_CURVE) - uiItemsEnumO(layout, op->type->idname, "type"); - else - uiItemsEnumO(layout, "OBJECT_OT_surface_add", "type"); - uiPupMenuEnd(C, pup); - - return OPERATOR_CANCELLED; -} - -void OBJECT_OT_curve_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Add Curve"; - ot->description = "Add a curve object to the scene"; - ot->idname= "OBJECT_OT_curve_add"; - - /* api callbacks */ - ot->invoke= object_add_curve_invoke; - ot->exec= object_add_curve_exec; - - ot->poll= ED_operator_scene_editable; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - RNA_def_enum(ot->srna, "type", prop_curve_types, 0, "Primitive", ""); - - ED_object_add_generic_props(ot, TRUE); -} - -static EnumPropertyItem prop_surface_types[]= { - {CU_PRIM_CURVE|CU_NURBS, "NURBS_CURVE", ICON_SURFACE_NCURVE, "NURBS Curve", ""}, - {CU_PRIM_CIRCLE|CU_NURBS, "NURBS_CIRCLE", ICON_SURFACE_NCIRCLE, "NURBS Circle", ""}, - {CU_PRIM_PATCH|CU_NURBS, "NURBS_SURFACE", ICON_SURFACE_NSURFACE, "NURBS Surface", ""}, - {CU_PRIM_TUBE|CU_NURBS, "NURBS_TUBE", ICON_SURFACE_NTUBE, "NURBS Tube", ""}, - {CU_PRIM_SPHERE|CU_NURBS, "NURBS_SPHERE", ICON_SURFACE_NSPHERE, "NURBS Sphere", ""}, - {CU_PRIM_DONUT|CU_NURBS, "NURBS_DONUT", ICON_SURFACE_NDONUT, "NURBS Donut", ""}, - {0, NULL, 0, NULL, NULL} -}; - -static int object_add_surface_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - ListBase *editnurb; - Nurb *nu; - int newob= 0; - int enter_editmode; - unsigned int layer; - float loc[3], rot[3]; - float mat[4][4]; - - object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); - - if(obedit==NULL || obedit->type!=OB_SURF) { - obedit= ED_object_add_type(C, OB_SURF, loc, rot, TRUE, layer); - newob = 1; - } - else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); - - ED_object_new_primitive_matrix(C, loc, rot, mat); - - nu= add_nurbs_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob); - editnurb= curve_get_editcurve(obedit); - BLI_addtail(editnurb, nu); - - /* userdef */ - if (newob && !enter_editmode) { - ED_object_exit_editmode(C, EM_FREEDATA); - } - - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); - - return OPERATOR_FINISHED; -} - -void OBJECT_OT_surface_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Add Surface"; - ot->description = "Add a surface object to the scene"; - ot->idname= "OBJECT_OT_surface_add"; - - /* api callbacks */ - ot->invoke= WM_menu_invoke; - ot->exec= object_add_surface_exec; - - ot->poll= ED_operator_scene_editable; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - ot->prop= RNA_def_enum(ot->srna, "type", prop_surface_types, 0, "Primitive", ""); - ED_object_add_generic_props(ot, TRUE); -} - static EnumPropertyItem prop_metaball_types[]= { {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""}, {MB_TUBE, "MBALL_TUBE", ICON_META_TUBE, "Meta Tube", ""}, @@ -654,7 +513,9 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) float mat[4][4]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(obedit==NULL || obedit->type!=OB_MBALL) { obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE, layer); @@ -662,7 +523,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); - ED_object_new_primitive_matrix(C, loc, rot, mat); + ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); elem= (MetaElem*)add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob); mball= (MetaBall*)obedit->data; @@ -724,7 +585,8 @@ static int object_add_text_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(obedit && obedit->type==OB_FONT) return OPERATOR_CANCELLED; @@ -764,7 +626,8 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { obedit= ED_object_add_type(C, OB_ARMATURE, loc, rot, TRUE, layer); @@ -810,6 +673,19 @@ void OBJECT_OT_armature_add(wmOperatorType *ot) ED_object_add_generic_props(ot, TRUE); } +static char *get_lamp_defname(int type) +{ + switch (type) { + case LA_LOCAL: return "Point"; + case LA_SUN: return "Sun"; + case LA_SPOT: return "Spot"; + case LA_HEMI: return "Hemi"; + case LA_AREA: return "Area"; + default: + return "Lamp"; + } +} + static int object_lamp_add_exec(bContext *C, wmOperator *op) { Object *ob; @@ -819,12 +695,16 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer); if(ob && ob->data) ((Lamp*)ob->data)->type= type; + rename_id((ID *)ob, get_lamp_defname(type)); + rename_id((ID *)ob->data, get_lamp_defname(type)); + return OPERATOR_FINISHED; } @@ -859,22 +739,22 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot) static int group_instance_add_exec(bContext *C, wmOperator *op) { - Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "type")); + Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); int enter_editmode; unsigned int layer; float loc[3], rot[3]; object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(group) { Object *ob= ED_object_add_type(C, OB_EMPTY, loc, rot, FALSE, layer); rename_id(&ob->id, group->id.name+2); ob->dup_group= group; ob->transflag |= OB_DUPLIGROUP; - id_us_plus(&group->id); - + id_lib_extern(&group->id); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); @@ -904,7 +784,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", ""); + prop= RNA_def_enum(ot->srna, "group", DummyRNA_NULL_items, 0, "Group", ""); RNA_def_enum_funcs(prop, RNA_group_itemf); ot->prop= prop; ED_object_add_generic_props(ot, FALSE); @@ -933,14 +813,13 @@ static int object_delete_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Base*, base, selected_bases) { if(base->object->type==OB_LAMP) islamp= 1; - /* remove from current scene only */ ED_base_object_free_and_unlink(scene, base); } CTX_DATA_END; if(islamp) reshadeall_displist(scene); /* only frees displist */ - + DAG_scene_sort(scene); DAG_ids_flush_update(0); @@ -968,7 +847,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) /**************************** Copy Utilities ******************************/ static void copy_object__forwardModifierLinks(void *userData, Object *ob, - ID **idpoin) + ID **idpoin) { /* this is copied from ID_NEW; it might be better to have a macro */ if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid; @@ -979,10 +858,6 @@ static void copy_object_set_idnew(bContext *C, int dupflag) { Material *ma, *mao; ID *id; -#if 0 // XXX old animation system - Ipo *ipo; - bActionStrip *strip; -#endif // XXX old animation system int a; /* XXX check object pointers */ @@ -996,17 +871,8 @@ static void copy_object_set_idnew(bContext *C, int dupflag) } modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL); ID_NEW(ob->parent); - ID_NEW(ob->track); ID_NEW(ob->proxy); ID_NEW(ob->proxy_group); - -#if 0 // XXX old animation system - for(strip= ob->nlastrips.first; strip; strip= strip->next) { - bActionModifier *amod; - for(amod= strip->modifiers.first; amod; amod= amod->next) - ID_NEW(amod->ob); - } -#endif // XXX old animation system } CTX_DATA_END; @@ -1118,7 +984,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base) ob->lay= base->lay; copy_m4_m4(ob->obmat, dob->mat); - ED_object_apply_obmat(ob); + object_apply_mat4(ob, ob->obmat); } copy_object_set_idnew(C, 0); @@ -1142,6 +1008,7 @@ static int object_duplicates_make_real_exec(bContext *C, wmOperator *op) DAG_scene_sort(scene); DAG_ids_flush_update(0); WM_event_add_notifier(C, NC_SCENE, scene); + WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL); return OPERATOR_FINISHED; } @@ -1167,7 +1034,7 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot) static EnumPropertyItem convert_target_items[]= { {OB_CURVE, "CURVE", ICON_OUTLINER_OB_CURVE, "Curve from Mesh/Text", ""}, - {OB_MESH, "MESH", ICON_OUTLINER_OB_MESH, "Mesh from Curve/Meta/Surf/Mesh", ""}, + {OB_MESH, "MESH", ICON_OUTLINER_OB_MESH, "Mesh from Curve/Meta/Surf/Text", ""}, {0, NULL, 0, NULL, NULL}}; static void curvetomesh(Scene *scene, Object *ob) @@ -1191,11 +1058,36 @@ static int convert_poll(bContext *C) return (!scene->id.lib && obact && scene->obedit != obact && (obact->flag & SELECT) && !(obact->id.lib)); } +/* Helper for convert_exec */ +static Base *duplibase_for_convert(Scene *scene, Base *base, Object *ob) +{ + Object *obn; + Base *basen; + + if (ob == NULL) { + ob= base->object; + } + + obn= copy_object(ob); + obn->recalc |= OB_RECALC_ALL; + + basen= MEM_mallocN(sizeof(Base), "duplibase"); + *basen= *base; + BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */ + basen->object= obn; + basen->flag |= SELECT; + obn->flag |= SELECT; + base->flag &= ~SELECT; + ob->flag &= ~SELECT; + + return basen; +} + static int convert_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Base *basen=NULL, *basact=NULL, *basedel=NULL; - Object *ob, *ob1, *obact= CTX_data_active_object(C); + Object *ob, *ob1, *newob, *obact= CTX_data_active_object(C); DerivedMesh *dm; Curve *cu; Nurb *nu; @@ -1203,8 +1095,8 @@ static int convert_exec(bContext *C, wmOperator *op) Mesh *me; int target= RNA_enum_get(op->ptr, "target"); int keep_original= RNA_boolean_get(op->ptr, "keep_original"); - int a; - + int a, mballConverted= 0; + /* don't forget multiple users! */ /* reset flags */ @@ -1216,67 +1108,87 @@ static int convert_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { ob= base->object; - - if(ob->flag & OB_DONE) - continue; + + if(ob->flag & OB_DONE) { + if (ob->type != target) { + base->flag &= ~SELECT; + ob->flag &= ~SELECT; + } + } else if (ob->type==OB_MESH && target == OB_CURVE) { ob->flag |= OB_DONE; - ob1= copy_object(ob); - ob1->recalc |= OB_RECALC; + if (keep_original) { + basen= duplibase_for_convert(scene, base, NULL); + newob= basen->object; - basen= MEM_mallocN(sizeof(Base), "duplibase"); - *basen= *base; - BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */ - basen->object= ob1; - basen->flag |= SELECT; - base->flag &= ~SELECT; - ob->flag &= ~SELECT; + /* decrement original mesh's usage count */ + me= newob->data; + me->id.us--; - mesh_to_curve(scene, ob1); + /* make a new copy of the mesh */ + newob->data= copy_mesh(me); + } else { + newob = ob; + } - if(ob1->type==OB_CURVE) - object_free_modifiers(ob1); /* after derivedmesh calls! */ + mesh_to_curve(scene, newob); + + if(newob->type==OB_CURVE) + object_free_modifiers(newob); /* after derivedmesh calls! */ } else if(ob->type==OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */ ob->flag |= OB_DONE; - basedel = base; - ob1= copy_object(ob); - ob1->recalc |= OB_RECALC; + if (keep_original) { + basen= duplibase_for_convert(scene, base, NULL); + newob= basen->object; - basen= MEM_mallocN(sizeof(Base), "duplibase"); - *basen= *base; - BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */ - basen->object= ob1; - basen->flag |= SELECT; - base->flag &= ~SELECT; - ob->flag &= ~SELECT; + /* decrement original mesh's usage count */ + me= newob->data; + me->id.us--; - /* decrement original mesh's usage count */ - me= ob1->data; - me->id.us--; - - /* make a new copy of the mesh */ - ob1->data= copy_mesh(me); + /* make a new copy of the mesh */ + newob->data= copy_mesh(me); + } else { + newob = ob; + ob->recalc |= OB_RECALC_ALL; + } /* make new mesh data from the original copy */ /* note: get the mesh from the original, not from the copy in some * cases this doesnt give correct results (when MDEF is used for eg) */ - dm= mesh_get_derived_final(scene, ob, CD_MASK_MESH); + dm= mesh_get_derived_final(scene, newob, CD_MASK_MESH); /* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */ - DM_to_mesh(dm, ob1->data); + DM_to_mesh(dm, newob->data); dm->release(dm); - object_free_modifiers(ob1); /* after derivedmesh calls! */ + object_free_modifiers(newob); /* after derivedmesh calls! */ } else if(ob->type==OB_FONT) { ob->flag |= OB_DONE; - ob->type= OB_CURVE; - cu= ob->data; + if (keep_original) { + basen= duplibase_for_convert(scene, base, NULL); + newob= basen->object; + + /* decrement original curve's usage count */ + ((Curve *)newob->data)->id.us--; + + /* make a new copy of the curve */ + newob->data= copy_curve(ob->data); + } else { + newob= ob; + } + + cu= newob->data; + + if (!cu->disp.first) + makeDispListCurveTypes(scene, newob, 0); + + newob->type= OB_CURVE; if(cu->vfont) { cu->vfont->id.us--; @@ -1293,13 +1205,16 @@ static int convert_exec(bContext *C, wmOperator *op) if(cu->vfontbi) { cu->vfontbi->id.us--; cu->vfontbi= 0; - } - /* other users */ - if(cu->id.us>1) { - for(ob1= G.main->object.first; ob1; ob1=ob1->id.next) { - if(ob1->data==cu) { - ob1->type= OB_CURVE; - ob1->recalc |= OB_RECALC; + } + + if (!keep_original) { + /* other users */ + if(cu->id.us>1) { + for(ob1= G.main->object.first; ob1; ob1=ob1->id.next) { + if(ob1->data==ob->data) { + ob1->type= OB_CURVE; + ob1->recalc |= OB_RECALC_ALL; + } } } } @@ -1308,46 +1223,76 @@ static int convert_exec(bContext *C, wmOperator *op) nu->charidx= 0; if(target == OB_MESH) - curvetomesh(scene, ob); + curvetomesh(scene, newob); } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { ob->flag |= OB_DONE; - if(target == OB_MESH) - curvetomesh(scene, ob); + if(target == OB_MESH) { + if (keep_original) { + basen= duplibase_for_convert(scene, base, NULL); + newob= basen->object; + + /* decrement original curve's usage count */ + ((Curve *)newob->data)->id.us--; + + /* make a new copy of the curve */ + newob->data= copy_curve(ob->data); + } else { + newob= ob; + } + + curvetomesh(scene, newob); + } } else if(ob->type==OB_MBALL) { - ob= find_basis_mball(scene, ob); - - if(ob->disp.first && !(ob->flag & OB_DONE)) { + Object *baseob; + + if (target != OB_MESH) { ob->flag |= OB_DONE; - basedel = base; + continue; + } - ob1= copy_object(ob); - ob1->recalc |= OB_RECALC; + base->flag &= ~SELECT; + ob->flag &= ~SELECT; - basen= MEM_mallocN(sizeof(Base), "duplibase"); - *basen= *base; - BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */ - basen->object= ob1; - basen->flag |= SELECT; - basedel->flag &= ~SELECT; - ob->flag &= ~SELECT; - - mb= ob1->data; + baseob= find_basis_mball(scene, ob); + + if (ob != baseob) { + /* if motherball is converting it would be marked as done later */ + ob->flag |= OB_DONE; + } + + if (!baseob->disp.first) { + makeDispListMBall(scene, baseob); + } + + if(!(baseob->flag & OB_DONE)) { + baseob->flag |= OB_DONE; + + basen= duplibase_for_convert(scene, base, baseob); + newob= basen->object; + + mb= newob->data; mb->id.us--; - - ob1->data= add_mesh("Mesh"); - ob1->type= OB_MESH; - - me= ob1->data; + + newob->data= add_mesh("Mesh"); + newob->type= OB_MESH; + + me= newob->data; me->totcol= mb->totcol; - if(ob1->totcol) { + if(newob->totcol) { me->mat= MEM_dupallocN(mb->mat); - for(a=0; atotcol; a++) id_us_plus((ID *)me->mat[a]); + for(a=0; atotcol; a++) id_us_plus((ID *)me->mat[a]); } - - mball_to_mesh(&ob->disp, ob1->data); + + mball_to_mesh(&baseob->disp, newob->data); + + if (obact->type == OB_MBALL) { + basact= basen; + } + + mballConverted= 1; } else continue; @@ -1358,8 +1303,6 @@ static int convert_exec(bContext *C, wmOperator *op) /* If the original object is active then make this object active */ if(basen) { if(ob == obact) { - ED_base_object_activate(C, basen); - /* store new active base to update BASACT */ basact= basen; } @@ -1367,6 +1310,10 @@ static int convert_exec(bContext *C, wmOperator *op) basen= NULL; } + if (!keep_original) { + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + } + /* delete original if needed */ if(basedel) { if(!keep_original) @@ -1376,24 +1323,39 @@ static int convert_exec(bContext *C, wmOperator *op) } } CTX_DATA_END; - - /* delete object should renew depsgraph */ - if(!keep_original) + + if(!keep_original) { + if (mballConverted) { + Base *base= scene->base.first, *tmpbase; + while (base) { + ob= base->object; + tmpbase= base; + base= base->next; + + if (ob->type == OB_MBALL) { + ED_base_object_free_and_unlink(scene, tmpbase); + } + } + } + + /* delete object should renew depsgraph */ DAG_scene_sort(scene); + } // XXX ED_object_enter_editmode(C, 0); // XXX exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */ if (basact) { /* active base was changed */ + ED_base_object_activate(C, basact); BASACT= basact; + } else if (BASACT->object->flag & OB_DONE) { + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER|ND_DATA, BASACT->object); } DAG_scene_sort(scene); WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */ - - return OPERATOR_FINISHED; } @@ -1442,7 +1404,7 @@ static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag } else { obn= copy_object(ob); - obn->recalc |= OB_RECALC; + obn->recalc |= OB_RECALC_ALL; basen= MEM_mallocN(sizeof(Base), "duplibase"); *basen= *base; @@ -1637,13 +1599,17 @@ Base *ED_object_add_duplicate(Scene *scene, Base *base, int dupflag) clear_id_newpoins(); clear_sca_new_poins(); /* sensor/contr/act */ - + basen= object_add_duplicate_internal(scene, base, dupflag); + if (basen == NULL) { + return NULL; + } + ob= basen->object; - + DAG_scene_sort(scene); ED_render_id_flush_update(G.main, ob->data); - + return basen; } @@ -1664,6 +1630,10 @@ static int duplicate_exec(bContext *C, wmOperator *op) the list is made in advance */ ED_base_object_select(base, BA_DESELECT); + if (basen == NULL) { + continue; + } + /* new object becomes active */ if(BASACT==base) ED_base_object_activate(C, basen); @@ -1684,6 +1654,8 @@ static int duplicate_exec(bContext *C, wmOperator *op) void OBJECT_OT_duplicate(wmOperatorType *ot) { + PropertyRNA *prop; + /* identifiers */ ot->name= "Duplicate"; ot->description = "Duplicate selected objects"; @@ -1698,7 +1670,8 @@ void OBJECT_OT_duplicate(wmOperatorType *ot) /* to give to transform */ RNA_def_boolean(ot->srna, "linked", 0, "Linked", "Duplicate object but not object data, linking to the original data."); - RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); + prop= RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); + RNA_def_property_flag(prop, PROP_HIDDEN); } /* **************** add named object, for dragdrop ************* */ @@ -1726,36 +1699,42 @@ static int add_named_exec(bContext *C, wmOperator *op) int linked= RNA_boolean_get(op->ptr, "linked"); int dupflag= (linked)? 0: U.dupflag; char name[32]; - + /* find object, create fake base */ RNA_string_get(op->ptr, "name", name); ob= (Object *)find_id("OB", name); if(ob==NULL) return OPERATOR_CANCELLED; - + base= MEM_callocN(sizeof(Base), "duplibase"); base->object= ob; base->flag= ob->flag; - + /* prepare dupli */ clear_id_newpoins(); clear_sca_new_poins(); /* sensor/contr/act */ - + basen= object_add_duplicate_internal(scene, base, dupflag); + + if (basen == NULL) { + MEM_freeN(base); + return OPERATOR_CANCELLED; + } + basen->lay= basen->object->lay= scene->lay; - + ED_object_location_from_view(C, basen->object->loc); ED_base_object_activate(C, basen); - + copy_object_set_idnew(C, dupflag); - + DAG_scene_sort(scene); DAG_ids_flush_update(0); - + MEM_freeN(base); - + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); - + return OPERATOR_FINISHED; } diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index a4f419cf996..9f9d41147b6 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -35,7 +35,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_image_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -103,7 +102,8 @@ typedef struct BakeRender { short *stop; short *do_update; - + float *progress; + ListBase threads; /* backup */ @@ -141,7 +141,7 @@ static void init_bake_internal(BakeRender *bkr, bContext *C) bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */ bkr->scene= scene; bkr->actob= (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT : NULL; - bkr->re= RE_NewRender("_Bake View_", RE_SLOT_DEFAULT); + bkr->re= RE_NewRender("_Bake View_"); if(scene->r.bake_mode==RE_BAKE_AO) { /* If raytracing or AO is disabled, switch it on temporarily for baking. */ @@ -186,27 +186,28 @@ static void *do_bake_render(void *bake_v) { BakeRender *bkr= bake_v; - bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->scene->r.bake_mode, bkr->actob, NULL); + bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->scene->r.bake_mode, bkr->actob, NULL, bkr->progress); bkr->ready= 1; return NULL; } -static void bake_startjob(void *bkv, short *stop, short *do_update) +static void bake_startjob(void *bkv, short *stop, short *do_update, float *progress) { BakeRender *bkr= bkv; Scene *scene= bkr->scene; bkr->stop= stop; bkr->do_update= do_update; + bkr->progress= progress; RE_test_break_cb(bkr->re, NULL, thread_break); G.afbreek= 0; /* blender_test_break uses this global */ - RE_Database_Baking(bkr->re, scene, scene->r.bake_mode, bkr->actob); + RE_Database_Baking(bkr->re, scene, scene->lay, scene->r.bake_mode, bkr->actob); /* baking itself is threaded, cannot use test_break in threads. we also update optional imagewindow */ - bkr->tot= RE_bake_shade_all_selected(bkr->re, scene->r.bake_mode, bkr->actob, bkr->do_update); + bkr->tot= RE_bake_shade_all_selected(bkr->re, scene->r.bake_mode, bkr->actob, bkr->do_update, bkr->progress); } static void bake_update(void *bkv) @@ -261,10 +262,10 @@ static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *_eve bkr->reports= op->reports; /* setup job */ - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Texture Bake", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS); WM_jobs_customdata(steve, bkr, bake_freejob); WM_jobs_timer(steve, 0.2, NC_IMAGE, 0); /* TODO - only draw bake image, can we enforce this */ - WM_jobs_callbacks(steve, bake_startjob, NULL, bake_update); + WM_jobs_callbacks(steve, bake_startjob, NULL, bake_update, NULL); G.afbreek= 0; @@ -301,7 +302,7 @@ static int bake_image_exec(bContext *C, wmOperator *op) RE_test_break_cb(bkr.re, NULL, thread_break); G.afbreek= 0; /* blender_test_break uses this global */ - RE_Database_Baking(bkr.re, scene, scene->r.bake_mode, (scene->r.bake_flag & R_BAKE_TO_ACTIVE)? OBACT: NULL); + RE_Database_Baking(bkr.re, scene, scene->lay, scene->r.bake_mode, (scene->r.bake_flag & R_BAKE_TO_ACTIVE)? OBACT: NULL); /* baking itself is threaded, cannot use test_break in threads */ BLI_init_threads(&threads, do_bake_render, 1); diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c index 2b880f17e90..8d48b76fb51 100644 --- a/source/blender/editors/object/object_constraint.c +++ b/source/blender/editors/object/object_constraint.c @@ -36,15 +36,10 @@ #include "BLI_math.h" #include "BLI_dynstr.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_constraint_types.h" #include "DNA_curve_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "DNA_text_types.h" -#include "DNA_view3d_types.h" #include "BKE_action.h" #include "BKE_armature.h" @@ -68,7 +63,6 @@ #include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" -#include "RNA_types.h" #include "ED_object.h" #include "ED_screen.h" @@ -139,6 +133,7 @@ bConstraint *get_active_constraint (Object *ob) { return constraints_get_active(get_active_constraints(ob)); } + /* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */ /* ------------- PyConstraints ------------------ */ @@ -204,9 +199,9 @@ char *buildmenu_pyconstraints (Text *con_text, int *pyconindex) /* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */ void update_pyconstraint_cb (void *arg1, void *arg2) { +#ifndef DISABLE_PYTHON Object *owner= (Object *)arg1; bConstraint *con= (bConstraint *)arg2; -#ifndef DISABLE_PYTHON if (owner && con) BPY_pyconstraint_update(owner, con); #endif @@ -328,6 +323,23 @@ static void test_constraints (Object *owner, bPoseChannel *pchan) /* targets have already been checked for this */ continue; } + else if (curcon->type == CONSTRAINT_TYPE_PIVOT) { + bPivotConstraint *data = curcon->data; + + /* target doesn't have to exist, but if it is non-null, it must exist! */ + if (data->tar && exist_object(data->tar)==0) { + data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; + } + else if (data->tar == owner) { + if (!get_named_bone(get_armature(owner), data->subtarget)) { + curcon->flag |= CONSTRAINT_DISABLE; + } + } + + /* targets have already been checked for this */ + continue; + } else if (curcon->type == CONSTRAINT_TYPE_ACTION) { bActionConstraint *data = curcon->data; @@ -424,40 +436,139 @@ static void test_constraints (Object *owner, bPoseChannel *pchan) void object_test_constraints (Object *owner) { - if(owner->constraints.first) + if (owner->constraints.first) test_constraints(owner, NULL); - + if (owner->type==OB_ARMATURE && owner->pose) { bPoseChannel *pchan; - - for (pchan= owner->pose->chanbase.first; pchan; pchan= pchan->next) - if(pchan->constraints.first) + + for (pchan= owner->pose->chanbase.first; pchan; pchan= pchan->next) { + if (pchan->constraints.first) test_constraints(owner, pchan); + } } } + +/************************ generic functions for operators using constraint names and data context *********************/ + +#define EDIT_CONSTRAINT_OWNER_OBJECT 0 +#define EDIT_CONSTRAINT_OWNER_BONE 1 + +static EnumPropertyItem constraint_owner_items[] = { + {EDIT_CONSTRAINT_OWNER_OBJECT, "OBJECT", 0, "Object", "Edit a constraint on the active object"}, + {EDIT_CONSTRAINT_OWNER_BONE, "BONE", 0, "Bone", "Edit a constraint on the active bone"}, + {0, NULL, 0, NULL, NULL}}; + + +static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", rna_type); + Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C); + + if (!ob || ob->id.lib) return 0; + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + + return 1; +} + +static int edit_constraint_poll(bContext *C) +{ + return edit_constraint_poll_generic(C, &RNA_Constraint); +} + +static void edit_constraint_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "constraint", "", 32, "Constraint", "Name of the constraint to edit"); + RNA_def_enum(ot->srna, "owner", constraint_owner_items, 0, "Owner", "The owner of this constraint"); +} + +static int edit_constraint_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint); + Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C); + bConstraint *con; + ListBase *list; + + if (RNA_property_is_set(op->ptr, "constraint") && RNA_property_is_set(op->ptr, "owner")) + return 1; + + if (ptr.data) { + con = ptr.data; + RNA_string_set(op->ptr, "constraint", con->name); + + list = get_constraint_lb(ob, con, NULL); + + if (&ob->constraints == list) + RNA_enum_set(op->ptr, "owner", EDIT_CONSTRAINT_OWNER_OBJECT); + else + RNA_enum_set(op->ptr, "owner", EDIT_CONSTRAINT_OWNER_BONE); + + return 1; + } + + return 0; +} + +static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Object *ob, int type) +{ + char constraint_name[32]; + int owner = RNA_enum_get(op->ptr, "owner"); + bConstraint *con; + ListBase *list=NULL; + + RNA_string_get(op->ptr, "constraint", constraint_name); + + if (owner == EDIT_CONSTRAINT_OWNER_OBJECT) { + list = &ob->constraints; + } + else if (owner == EDIT_CONSTRAINT_OWNER_BONE) { + bPoseChannel *pchan= get_active_posechannel(ob); + if (pchan) + list = &pchan->constraints; + else + return NULL; + } + + con = constraints_findByName(list, constraint_name); + + if (con && (type != 0) && (con->type != type)) + con = NULL; + + return con; +} + /* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */ /* ---------- Distance-Dependent Constraints ---------- */ /* StretchTo, Limit Distance */ -static int stretchto_poll(bContext *C) -{ - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint); - return (ptr.id.data && ptr.data); -} - static int stretchto_reset_exec (bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint); + Object *ob = ED_object_active_context(C); + bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_STRETCHTO); + bStretchToConstraint *data= (con) ? (bStretchToConstraint *)con->data : NULL; + + /* despite 3 layers of checks, we may still not be able to find a constraint */ + if (data == NULL) + return OPERATOR_CANCELLED; /* just set original length to 0.0, which will cause a reset on next recalc */ - RNA_float_set(&ptr, "original_length", 0.0f); + data->orglength = 0.0f; + ED_object_constraint_update(ob); WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL); return OPERATOR_FINISHED; } +static int stretchto_reset_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_constraint_invoke_properties(C, op)) + return stretchto_reset_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot) { /* identifiers */ @@ -466,28 +577,39 @@ void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot) ot->description= "Reset original length of bone for Stretch To Constraint"; ot->exec= stretchto_reset_exec; - ot->poll= stretchto_poll; + ot->invoke= stretchto_reset_invoke; + ot->poll= edit_constraint_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_constraint_properties(ot); } static int limitdistance_reset_exec (bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint); + Object *ob = ED_object_active_context(C); + bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_DISTLIMIT); + bDistLimitConstraint *data= (con) ? (bDistLimitConstraint *)con->data : NULL; - /* just set distance to 0.0, which will cause a reset on next recalc */ - RNA_float_set(&ptr, "distance", 0.0f); + /* despite 3 layers of checks, we may still not be able to find a constraint */ + if (data == NULL) + return OPERATOR_CANCELLED; + + /* just set original length to 0.0, which will cause a reset on next recalc */ + data->dist = 0.0f; + ED_object_constraint_update(ob); WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL); return OPERATOR_FINISHED; } -static int limitdistance_poll(bContext *C) +static int limitdistance_reset_invoke(bContext *C, wmOperator *op, wmEvent *event) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint); - return (ptr.id.data && ptr.data); + if (edit_constraint_invoke_properties(C, op)) + return limitdistance_reset_exec(C, op); + else + return OPERATOR_CANCELLED; } void CONSTRAINT_OT_limitdistance_reset (wmOperatorType *ot) @@ -498,30 +620,29 @@ void CONSTRAINT_OT_limitdistance_reset (wmOperatorType *ot) ot->description= "Reset limiting distance for Limit Distance Constraint"; ot->exec= limitdistance_reset_exec; - ot->poll= limitdistance_poll; + ot->invoke= limitdistance_reset_invoke; + ot->poll= edit_constraint_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_constraint_properties(ot); } /* ------------- Child-Of Constraint ------------------ */ -static int childof_poll(bContext *C) -{ - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint); - return (ptr.id.data && ptr.data); -} - /* ChildOf Constraint - set inverse callback */ static int childof_set_inverse_exec (bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint); Scene *scene= CTX_data_scene(C); - Object *ob= ptr.id.data; - bConstraint *con= ptr.data; - bChildOfConstraint *data= (bChildOfConstraint *)con->data; + Object *ob = ED_object_active_context(C); + bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF); + bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL; bPoseChannel *pchan= NULL; - + + /* despite 3 layers of checks, we may still not be able to find a constraint */ + if (data == NULL) + return OPERATOR_CANCELLED; + /* try to find a pose channel */ // TODO: get from context instead? if (ob && ob->pose) @@ -570,6 +691,14 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int childof_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_constraint_invoke_properties(C, op)) + return childof_set_inverse_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void CONSTRAINT_OT_childof_set_inverse (wmOperatorType *ot) { /* identifiers */ @@ -578,19 +707,20 @@ void CONSTRAINT_OT_childof_set_inverse (wmOperatorType *ot) ot->description= "Set inverse correction for ChildOf constraint"; ot->exec= childof_set_inverse_exec; - ot->poll= childof_poll; + ot->invoke= childof_set_inverse_invoke; + ot->poll= edit_constraint_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_constraint_properties(ot); } /* ChildOf Constraint - clear inverse callback */ static int childof_clear_inverse_exec (bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint); - Object *ob= ptr.id.data; - bConstraint *con= ptr.data; - bChildOfConstraint *data= (bChildOfConstraint *)con->data; + Object *ob = ED_object_active_context(C); + bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF); + bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL; /* simply clear the matrix */ unit_m4(data->invmat); @@ -600,6 +730,14 @@ static int childof_clear_inverse_exec (bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int childof_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_constraint_invoke_properties(C, op)) + return childof_clear_inverse_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void CONSTRAINT_OT_childof_clear_inverse (wmOperatorType *ot) { /* identifiers */ @@ -608,10 +746,12 @@ void CONSTRAINT_OT_childof_clear_inverse (wmOperatorType *ot) ot->description= "Clear inverse correction for ChildOf constraint"; ot->exec= childof_clear_inverse_exec; - ot->poll= childof_poll; + ot->invoke= childof_clear_inverse_invoke; + ot->poll= edit_constraint_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_constraint_properties(ot); } /***************************** BUTTONS ****************************/ @@ -644,7 +784,7 @@ void ED_object_constraint_dependency_update(Scene *scene, Object *ob) ED_object_constraint_update(ob); if(ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels - DAG_scene_sort(scene); + DAG_scene_sort(scene); } static int constraint_poll(bContext *C) @@ -681,7 +821,7 @@ void CONSTRAINT_OT_delete (wmOperatorType *ot) /* identifiers */ ot->name= "Delete Constraint"; ot->idname= "CONSTRAINT_OT_delete"; - ot->description= "Remove constraitn from constraint stack"; + ot->description= "Remove constraint from constraint stack"; /* callbacks */ ot->exec= constraint_delete_exec; @@ -693,11 +833,10 @@ void CONSTRAINT_OT_delete (wmOperatorType *ot) static int constraint_move_down_exec (bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint); - Object *ob= ptr.id.data; - bConstraint *con= ptr.data; + Object *ob = ED_object_active_context(C); + bConstraint *con = edit_constraint_property_get(C, op, ob, 0); - if (con->next) { + if (con && con->next) { ListBase *conlist= get_constraint_lb(ob, con, NULL); bConstraint *nextCon= con->next; @@ -713,29 +852,39 @@ static int constraint_move_down_exec (bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } +static int constraint_move_down_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_constraint_invoke_properties(C, op)) + return constraint_move_down_exec(C, op); + else + return OPERATOR_CANCELLED; +} + + void CONSTRAINT_OT_move_down (wmOperatorType *ot) { /* identifiers */ ot->name= "Move Constraint Down"; ot->idname= "CONSTRAINT_OT_move_down"; - ot->description= "Move constraint down constraint stack"; + ot->description= "Move constraint down in constraint stack"; /* callbacks */ ot->exec= constraint_move_down_exec; - ot->poll= constraint_poll; + ot->invoke= constraint_move_down_invoke; + ot->poll= edit_constraint_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_constraint_properties(ot); } static int constraint_move_up_exec (bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint); - Object *ob= ptr.id.data; - bConstraint *con= ptr.data; + Object *ob = ED_object_active_context(C); + bConstraint *con = edit_constraint_property_get(C, op, ob, 0); - if (con->prev) { + if (con && con->prev) { ListBase *conlist= get_constraint_lb(ob, con, NULL); bConstraint *prevCon= con->prev; @@ -751,19 +900,29 @@ static int constraint_move_up_exec (bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } +static int constraint_move_up_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_constraint_invoke_properties(C, op)) + return constraint_move_up_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void CONSTRAINT_OT_move_up (wmOperatorType *ot) { /* identifiers */ ot->name= "Move Constraint Up"; ot->idname= "CONSTRAINT_OT_move_up"; - ot->description= "Move constraint up constraint stack"; + ot->description= "Move constraint up in constraint stack"; /* callbacks */ ot->exec= constraint_move_up_exec; - ot->poll= constraint_poll; + ot->invoke= constraint_move_up_invoke; + ot->poll= edit_constraint_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_constraint_properties(ot); } /***************************** OPERATORS ****************************/ @@ -808,19 +967,21 @@ void POSE_OT_constraints_clear(wmOperatorType *ot) static int object_constraints_clear_exec(bContext *C, wmOperator *op) { - Object *ob= CTX_data_active_object(C); Scene *scene= CTX_data_scene(C); /* do freeing */ - // TODO: we should free constraints for all selected objects instead (to be more consistent with bones) - free_constraints(&ob->constraints); + CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) + { + free_constraints(&ob->constraints); + DAG_id_flush_update(&ob->id, OB_RECALC_OB); + } + CTX_DATA_END; /* force depsgraph to get recalculated since relationships removed */ DAG_scene_sort(scene); /* sort order of objects */ /* do updates */ - DAG_id_flush_update(&ob->id, OB_RECALC_OB); - WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL); return OPERATOR_FINISHED; } @@ -837,12 +998,90 @@ void OBJECT_OT_constraints_clear(wmOperatorType *ot) ot->poll= ED_operator_object_active_editable; } +/************************ copy all constraints operators *********************/ + +static int pose_constraint_copy_exec(bContext *C, wmOperator *op) +{ + bPoseChannel *pchan = CTX_data_active_pose_bone(C); + Scene *scene = CTX_data_scene(C); + + /* don't do anything if bone doesn't exist or doesn't have any constraints */ + if (ELEM(NULL, pchan, pchan->constraints.first)) { + BKE_report(op->reports, RPT_ERROR, "No active bone with constraints for copying"); + return OPERATOR_CANCELLED; + } + + /* copy all constraints from active posebone to all selected posebones */ + CTX_DATA_BEGIN(C, bPoseChannel*, chan, selected_pose_bones) + { + /* if we're not handling the object we're copying from, copy all constraints over */ + if (pchan != chan) + copy_constraints(&chan->constraints, &pchan->constraints, TRUE); + } + CTX_DATA_END; + + /* force depsgraph to get recalculated since new relationships added */ + DAG_scene_sort(scene); /* sort order of objects/bones */ + + return OPERATOR_FINISHED; +} + +void POSE_OT_constraints_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Constraints to Selected"; + ot->idname= "POSE_OT_constraints_copy"; + ot->description = "Copy constraints to other selected bones."; + + /* api callbacks */ + ot->exec= pose_constraint_copy_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int object_constraint_copy_exec(bContext *C, wmOperator *op) +{ + Object *obact = ED_object_active_context(C); + Scene *scene = CTX_data_scene(C); + + /* copy all constraints from active object to all selected objects */ + CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) + { + /* if we're not handling the object we're copying from, copy all constraints over */ + if (obact != ob) + copy_constraints(&ob->constraints, &obact->constraints, TRUE); + } + CTX_DATA_END; + + /* force depsgraph to get recalculated since new relationships added */ + DAG_scene_sort(scene); /* sort order of objects */ + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_constraints_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Constraints to Selected"; + ot->idname= "OBJECT_OT_constraints_copy"; + ot->description = "Copy constraints to other selected objects."; + + /* api callbacks */ + ot->exec= object_constraint_copy_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /************************ add constraint operators *********************/ /* get the Object and/or PoseChannel to use as target */ static short get_new_constraint_target(bContext *C, int con_type, Object **tar_ob, bPoseChannel **tar_pchan, short add) { - Object *obact= CTX_data_active_object(C); + Object *obact= ED_object_active_context(C); bPoseChannel *pchanact= get_active_posechannel(obact); short only_curve= 0, only_mesh= 0, only_ob= 0; short found= 0; @@ -864,6 +1103,7 @@ static short get_new_constraint_target(bContext *C, int con_type, Object **tar_o case CONSTRAINT_TYPE_LOCLIMIT: case CONSTRAINT_TYPE_ROTLIMIT: case CONSTRAINT_TYPE_SIZELIMIT: + case CONSTRAINT_TYPE_SAMEVOL: return 0; /* restricted target-type constraints -------------- */ @@ -1006,7 +1246,7 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase } /* create a new constraint of the type requried, and add it to the active/given constraints list */ - if(pchan) + if (pchan) con = add_pose_constraint(ob, pchan, NULL, type); else con = add_ob_constraint(ob, NULL, type); @@ -1046,9 +1286,9 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase case CONSTRAINT_TYPE_PYTHON: // FIXME: this code is not really valid anymore { +#ifndef DISABLE_PYTHON char *menustr; int scriptint= 0; -#ifndef DISABLE_PYTHON /* popup a list of usable scripts */ menustr = buildmenu_pyconstraints(NULL, &scriptint); // XXX scriptint = pupmenu(menustr); @@ -1096,17 +1336,10 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase /* dummy operator callback */ static int object_constraint_add_exec(bContext *C, wmOperator *op) { - ScrArea *sa= CTX_wm_area(C); - Object *ob; + Object *ob=ED_object_active_context(C); int type= RNA_enum_get(op->ptr, "type"); short with_targets= 0; - /* get active object from context */ - if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - else - ob= CTX_data_active_object(C); - if (!ob) { BKE_report(op->reports, RPT_ERROR, "No active object to add constraint to."); return OPERATOR_CANCELLED; @@ -1124,17 +1357,10 @@ static int object_constraint_add_exec(bContext *C, wmOperator *op) /* dummy operator callback */ static int pose_constraint_add_exec(bContext *C, wmOperator *op) { - ScrArea *sa= CTX_wm_area(C); - Object *ob; + Object *ob= ED_object_active_context(C); int type= RNA_enum_get(op->ptr, "type"); short with_targets= 0; - /* get active object from context */ - if (sa->spacetype == SPACE_BUTS) - ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - else - ob= CTX_data_active_object(C); - if (!ob) { BKE_report(op->reports, RPT_ERROR, "No active object to add constraint to."); return OPERATOR_CANCELLED; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 2e72f51bee9..fcd3a73c84d 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -30,41 +30,20 @@ #include #include #include +#include //for offsetof #include "MEM_guardedalloc.h" #include "IMB_imbuf_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_constraint_types.h" #include "DNA_curve_types.h" -#include "DNA_effect_types.h" #include "DNA_group_types.h" -#include "DNA_image_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_meta_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_object_fluidsim.h" -#include "DNA_object_force.h" -#include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_particle_types.h" #include "DNA_property_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" #include "DNA_vfont_types.h" -#include "DNA_world_types.h" -#include "DNA_modifier_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -75,12 +54,10 @@ #include "BKE_action.h" #include "BKE_anim.h" #include "BKE_armature.h" -#include "BKE_booleanops.h" #include "BKE_constraint.h" #include "BKE_context.h" #include "BKE_customdata.h" #include "BKE_blender.h" -#include "BKE_booleanops.h" #include "BKE_cloth.h" #include "BKE_curve.h" #include "BKE_displist.h" @@ -114,36 +91,29 @@ #include "BKE_modifier.h" #include "BKE_tessmesh.h" -#include "ED_anim_api.h" #include "ED_armature.h" #include "ED_curve.h" -#include "ED_particle.h" #include "ED_mesh.h" #include "ED_mball.h" #include "ED_object.h" #include "ED_screen.h" -#include "ED_transform.h" -#include "ED_types.h" #include "ED_util.h" -#include "ED_view3d.h" -#include "UI_interface.h" #include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" /* for menu/popup icons etc etc*/ -#include "UI_interface.h" -#include "UI_resources.h" +#include "UI_interface.h" #include "WM_api.h" #include "WM_types.h" #include "object_intern.h" // own include /* ************* XXX **************** */ -static void error() {} +static void error(const char *dummy) {} static void waitcursor(int val) {} static int pupmenu(const char *msg) {return 0;} @@ -151,34 +121,20 @@ static int pupmenu(const char *msg) {return 0;} static bContext *C; static void error_libdata() {} -/* ********************************** */ -/* --------------------------------- */ - -void ED_object_apply_obmat(Object *ob) +/* find the correct active object per context + * note: context can be NULL when called from a enum with PROP_ENUM_NO_CONTEXT */ +Object *ED_object_active_context(bContext *C) { - float mat[3][3], imat[3][3], tmat[3][3]; - - /* from obmat to loc rot size */ - - if(ob==NULL) return; - copy_m3_m4(mat, ob->obmat); - - VECCOPY(ob->loc, ob->obmat[3]); - - mat3_to_eul( ob->rot,mat); - eul_to_mat3( tmat,ob->rot); - - invert_m3_m3(imat, tmat); - - mul_m3_m3m3(tmat, imat, mat); - - ob->size[0]= tmat[0][0]; - ob->size[1]= tmat[1][1]; - ob->size[2]= tmat[2][2]; - + Object *ob= NULL; + if(C) { + ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + if (!ob) ob= CTX_data_active_object(C); + } + return ob; } + /* ********* clear/set restrict view *********/ static int object_restrictview_clear_exec(bContext *C, wmOperator *op) { @@ -276,6 +232,79 @@ void OBJECT_OT_restrictview_set(wmOperatorType *ot) } +/* 99% same as above except no need for scene refreshing (TODO, update render preview) */ +static int object_restrictrender_clear_exec(bContext *C, wmOperator *op) +{ + short changed= 0; + + /* XXX need a context loop to handle such cases */ + CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { + if(ob->restrictflag & OB_RESTRICT_RENDER) { + ob->restrictflag &= ~OB_RESTRICT_RENDER; + changed= 1; + } + } + CTX_DATA_END; + + if(changed) + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_OUTLINER, NULL); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_restrictrender_clear(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Clear Restrict Render"; + ot->description = "Reveal the render object by setting the restrictrender flag"; + ot->idname= "OBJECT_OT_restrictrender_clear"; + + /* api callbacks */ + ot->exec= object_restrictrender_clear_exec; + ot->poll= ED_operator_view3d_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int object_restrictrender_set_exec(bContext *C, wmOperator *op) +{ + int unselected= RNA_boolean_get(op->ptr, "unselected"); + + CTX_DATA_BEGIN(C, Base*, base, visible_bases) { + if(!unselected) { + if (base->flag & SELECT){ + base->object->restrictflag |= OB_RESTRICT_RENDER; + } + } + else { + if (!(base->flag & SELECT)){ + base->object->restrictflag |= OB_RESTRICT_RENDER; + } + } + } + CTX_DATA_END; + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_OUTLINER, NULL); + return OPERATOR_FINISHED; +} + +void OBJECT_OT_restrictrender_set(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Restrict Render"; + ot->description = "Hide the render object by setting the restrictrender flag"; + ot->idname= "OBJECT_OT_restrictrender_set"; + + /* api callbacks */ + ot->exec= object_restrictrender_set_exec; + ot->poll= ED_operator_view3d_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects."); +} /* ******************* toggle editmode operator ***************** */ @@ -311,8 +340,10 @@ void ED_object_exit_editmode(bContext *C, int flag) me->edit_btmesh= NULL; } - if(obedit->restore_mode & OB_MODE_WEIGHT_PAINT) - mesh_octree_table(obedit, NULL, NULL, 'e'); + if(obedit->restore_mode & OB_MODE_WEIGHT_PAINT) { + mesh_octree_table(NULL, NULL, NULL, 'e'); + mesh_mirrtopo_table(NULL, 'e'); + } } else if (obedit->type==OB_ARMATURE) { ED_armature_from_edit(obedit); @@ -338,8 +369,19 @@ void ED_object_exit_editmode(bContext *C, int flag) /* freedata only 0 now on file saves and render */ if(freedata) { + ListBase pidlist; + PTCacheID *pid; + /* for example; displist make is different in editmode */ scene->obedit= NULL; // XXX for context + + /* flag object caches as outdated */ + BKE_ptcache_ids_from_object(&pidlist, obedit, NULL, 0); + for(pid=pidlist.first; pid; pid=pid->next) { + if(pid->type != PTCACHE_TYPE_PARTICLES) /* particles don't need reset on geometry change */ + pid->cache->flag |= PTCACHE_OUTDATED; + } + BLI_freelistN(&pidlist); BKE_ptcache_object_reset(scene, obedit, PTCACHE_RESET_DEPSGRAPH); @@ -354,7 +396,6 @@ void ED_object_exit_editmode(bContext *C, int flag) WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, scene); obedit->mode &= ~OB_MODE_EDIT; - ED_object_toggle_modes(C, obedit->restore_mode); } } @@ -397,8 +438,7 @@ void ED_object_enter_editmode(bContext *C, int flag) ob->restore_mode = ob->mode; ED_object_toggle_modes(C, ob->mode); - - ob->mode |= OB_MODE_EDIT; + ob->mode= OB_MODE_EDIT; if(ob->type==OB_MESH) { Mesh *me= ob->data; @@ -430,14 +470,14 @@ void ED_object_enter_editmode(bContext *C, int flag) scene->obedit= ob; ED_armature_to_edit(ob); /* to ensure all goes in restposition and without striding */ - DAG_id_flush_update(&ob->id, OB_RECALC); + DAG_id_flush_update(&ob->id, OB_RECALC_ALL); // XXX: should this be OB_RECALC_DATA? WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_ARMATURE, scene); } else if(ob->type==OB_FONT) { scene->obedit= ob; // XXX for context ok= 1; - make_editText(ob); + make_editText(ob); WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_TEXT, scene); } @@ -495,9 +535,9 @@ static int editmode_toggle_poll(bContext *C) return 0; return ob && (ob->type == OB_MESH || ob->type == OB_ARMATURE || - ob->type == OB_FONT || ob->type == OB_MBALL || - ob->type == OB_LATTICE || ob->type == OB_SURF || - ob->type == OB_CURVE); + ob->type == OB_FONT || ob->type == OB_MBALL || + ob->type == OB_LATTICE || ob->type == OB_SURF || + ob->type == OB_CURVE); } void OBJECT_OT_editmode_toggle(wmOperatorType *ot) @@ -1062,6 +1102,7 @@ void flip_subdivison(Scene *scene, View3D *v3d, int level) static void copymenu_properties(Scene *scene, View3D *v3d, Object *ob) { +//XXX no longer used - to be removed - replaced by game_properties_copy_exec bProperty *prop; Base *base; int nr, tot=0; @@ -1120,6 +1161,7 @@ static void copymenu_properties(Scene *scene, View3D *v3d, Object *ob) static void copymenu_logicbricks(Scene *scene, View3D *v3d, Object *ob) { +//XXX no longer used - to be removed - replaced by logicbricks_copy_exec Base *base; for(base= FIRSTBASE; base; base= base->next) { @@ -1368,7 +1410,7 @@ void copy_attr(Scene *scene, View3D *v3d, short event) base->object->dup_group= ob->dup_group; if(ob->dup_group) - id_us_plus((ID *)ob->dup_group); + id_lib_extern(&ob->dup_group->id); } else if(event==7) { /* mass */ base->object->mass= ob->mass; @@ -1487,7 +1529,7 @@ void copy_attr(Scene *scene, View3D *v3d, short event) } else if(event==22) { /* Copy the constraint channels over */ - copy_constraints(&base->object->constraints, &ob->constraints); + copy_constraints(&base->object->constraints, &ob->constraints, TRUE); do_scene_sort= 1; } @@ -1678,6 +1720,7 @@ void ED_objects_clear_paths(bContext *C, Scene *scene) if (ob->mpath) { animviz_free_motionpath(ob->mpath); ob->mpath= NULL; + ob->avs.path_bakeflag &= ~MOTIONPATH_BAKE_HAS_PATHS; } } CTX_DATA_END; @@ -1751,6 +1794,11 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) return (done)? OPERATOR_FINISHED: OPERATOR_CANCELLED; } +static int shade_poll(bContext *C) +{ + return (ED_operator_object_active_editable(C) && !ED_operator_editmesh(C)); +} + void OBJECT_OT_shade_flat(wmOperatorType *ot) { /* identifiers */ @@ -1758,7 +1806,7 @@ void OBJECT_OT_shade_flat(wmOperatorType *ot) ot->idname= "OBJECT_OT_shade_flat"; /* api callbacks */ - ot->poll= ED_operator_object_active_editable; + ot->poll= shade_poll; ot->exec= shade_smooth_exec; /* flags */ @@ -1772,7 +1820,7 @@ void OBJECT_OT_shade_smooth(wmOperatorType *ot) ot->idname= "OBJECT_OT_shade_smooth"; /* api callbacks */ - ot->poll= ED_operator_object_active_editable; + ot->poll= shade_poll; ot->exec= shade_smooth_exec; /* flags */ @@ -1950,12 +1998,12 @@ static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *ptr, in ob = CTX_data_active_object(C); while(ob && input->identifier) { if((input->value == OB_MODE_EDIT && ((ob->type == OB_MESH) || (ob->type == OB_ARMATURE) || - (ob->type == OB_CURVE) || (ob->type == OB_SURF) || - (ob->type == OB_FONT) || (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) || + (ob->type == OB_CURVE) || (ob->type == OB_SURF) || + (ob->type == OB_FONT) || (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) || (input->value == OB_MODE_POSE && (ob->type == OB_ARMATURE)) || (input->value == OB_MODE_PARTICLE_EDIT && ob->particlesystem.first) || ((input->value == OB_MODE_SCULPT || input->value == OB_MODE_VERTEX_PAINT || - input->value == OB_MODE_WEIGHT_PAINT || input->value == OB_MODE_TEXTURE_PAINT) && (ob->type == OB_MESH)) || + input->value == OB_MODE_WEIGHT_PAINT || input->value == OB_MODE_TEXTURE_PAINT) && (ob->type == OB_MESH)) || (input->value == OB_MODE_OBJECT)) RNA_enum_item_add(&item, &totitem, input); ++input; @@ -2030,7 +2078,7 @@ static int object_mode_set_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); ObjectMode mode = RNA_enum_get(op->ptr, "mode"); - ObjectMode restore_mode = ob->mode; + ObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT; int toggle = RNA_boolean_get(op->ptr, "toggle"); if(!ob || !object_mode_set_compat(C, op, ob)) @@ -2097,6 +2145,8 @@ void ED_object_toggle_modes(bContext *C, int mode) WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL); if(mode & OB_MODE_POSE) WM_operator_name_call(C, "OBJECT_OT_posemode_toggle", WM_OP_EXEC_REGION_WIN, NULL); + if(mode & OB_MODE_EDIT) + WM_operator_name_call(C, "OBJECT_OT_editmode_toggle", WM_OP_EXEC_REGION_WIN, NULL); } /************************ Game Properties ***********************/ @@ -2113,6 +2163,7 @@ static int game_property_new(bContext *C, wmOperator *op) BLI_addtail(&ob->prop, prop); unique_property(NULL, prop, 0); // make_unique_prop_names(prop->name); + WM_event_add_notifier(C, NC_LOGIC, NULL); return OPERATOR_FINISHED; } @@ -2135,23 +2186,23 @@ static int game_property_remove(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); bProperty *prop; - int index; + int index= RNA_int_get(op->ptr, "index"); if(!ob) return OPERATOR_CANCELLED; - index = RNA_int_get(op->ptr, "index"); + prop= BLI_findlink(&ob->prop, index); - prop= BLI_findlink(&ob->prop, index); - - if(prop) { + if(prop) { BLI_remlink(&ob->prop, prop); free_property(prop); + + WM_event_add_notifier(C, NC_LOGIC, NULL); return OPERATOR_FINISHED; - } - else { - return OPERATOR_CANCELLED; - } + } + else { + return OPERATOR_CANCELLED; + } } void OBJECT_OT_game_property_remove(wmOperatorType *ot) @@ -2169,3 +2220,181 @@ void OBJECT_OT_game_property_remove(wmOperatorType *ot) RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Property index to remove ", 0, INT_MAX); } + +#define COPY_PROPERTIES_REPLACE 1 +#define COPY_PROPERTIES_MERGE 2 +#define COPY_PROPERTIES_COPY 3 + +static EnumPropertyItem game_properties_copy_operations[] ={ + {COPY_PROPERTIES_REPLACE, "REPLACE", 0, "Replace Properties", ""}, + {COPY_PROPERTIES_MERGE, "MERGE", 0, "Merge Properties", ""}, + {COPY_PROPERTIES_COPY, "COPY", 0, "Copy a Property", ""}, + {0, NULL, 0, NULL, NULL}}; + +static EnumPropertyItem gameprops_items[]= { + {0, NULL, 0, NULL, NULL}}; + +static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + Object *ob= ED_object_active_context(C); + EnumPropertyItem tmp = {0, "", 0, "", ""}; + EnumPropertyItem *item= NULL; + bProperty *prop; + int a, totitem= 0; + + if(!ob) + return gameprops_items; + + for(a=1, prop= ob->prop.first; prop; prop=prop->next, a++) { + tmp.value= a; + tmp.identifier= prop->name; + tmp.name= prop->name; + RNA_enum_item_add(&item, &totitem, &tmp); + } + + RNA_enum_item_end(&item, &totitem); + *free= 1; + + return item; +} + +static int game_property_copy_exec(bContext *C, wmOperator *op) +{ + Object *ob=ED_object_active_context(C); + bProperty *prop; + int type = RNA_enum_get(op->ptr, "operation"); + int propid= RNA_enum_get(op->ptr, "property"); + + if(propid > 0) { /* copy */ + prop = BLI_findlink(&ob->prop, propid-1); + + if(prop) { + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + if (ob != ob_iter) { + if (ob->data != ob_iter->data) + set_ob_property(ob_iter, prop); + } + } CTX_DATA_END; + } + } + else if (ELEM(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE)) { + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + if (ob != ob_iter) { + if (ob->data != ob_iter->data){ + if (type == 2) {/* merge */ + for(prop = ob->prop.first; prop; prop= prop->next ) { + set_ob_property(ob_iter, prop); + } + } else /* replace */ + copy_properties( &ob_iter->prop, &ob->prop ); + } + } + } + CTX_DATA_END; + } + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_game_property_copy(wmOperatorType *ot) +{ + PropertyRNA *prop; + /* identifiers */ + ot->name= "Copy Game Property"; + ot->idname= "OBJECT_OT_game_property_copy"; + + /* api callbacks */ + ot->exec= game_property_copy_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "operation", game_properties_copy_operations, 3, "Operation", ""); + prop=RNA_def_enum(ot->srna, "property", gameprops_items, 0, "Property", "Properties to copy"); + RNA_def_enum_funcs(prop, gameprops_itemf); + ot->prop=prop; +} + +static int game_property_clear_exec(bContext *C, wmOperator *op) +{ + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + free_properties(&ob_iter->prop); + } + CTX_DATA_END; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + return OPERATOR_FINISHED; +} +void OBJECT_OT_game_property_clear(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Clear Game Property"; + ot->idname= "OBJECT_OT_game_property_clear"; + + /* api callbacks */ + ot->exec= game_property_clear_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/************************ Copy Logic Bricks ***********************/ + +static int logicbricks_copy_exec(bContext *C, wmOperator *op) +{ + Object *ob=ED_object_active_context(C); + + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + if(ob != ob_iter) { + if (ob->data != ob_iter->data){ + /* first: free all logic */ + free_sensors(&ob_iter->sensors); + unlink_controllers(&ob_iter->controllers); + free_controllers(&ob_iter->controllers); + unlink_actuators(&ob_iter->actuators); + free_actuators(&ob_iter->actuators); + + /* now copy it, this also works without logicbricks! */ + clear_sca_new_poins_ob(ob); + copy_sensors(&ob_iter->sensors, &ob->sensors); + copy_controllers(&ob_iter->controllers, &ob->controllers); + copy_actuators(&ob_iter->actuators, &ob->actuators); + set_sca_new_poins_ob(ob_iter); + + /* some menu settings */ + ob_iter->scavisflag= ob->scavisflag; + ob_iter->scaflag= ob->scaflag; + + /* set the initial state */ + ob_iter->state= ob->state; + ob_iter->init_state= ob->init_state; + } + if(ob_iter->totcol==ob->totcol) { + ob_iter->actcol= ob->actcol; + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter); + } + } + } + CTX_DATA_END; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_logic_bricks_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Logic Bricks to Selected"; + ot->description = "Copy logic bricks to other selected objects."; + ot->idname= "OBJECT_OT_logic_bricks_copy"; + + /* api callbacks */ + ot->exec= logicbricks_copy_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c index 73ca6e02132..ba609bd9bb3 100644 --- a/source/blender/editors/object/object_group.c +++ b/source/blender/editors/object/object_group.c @@ -52,6 +52,7 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "RNA_enum_types.h" #include "object_intern.h" @@ -224,84 +225,71 @@ void GROUP_OT_create(wmOperatorType *ot) static int group_add_exec(bContext *C, wmOperator *op) { - Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Base *base; Group *group; - int value= RNA_enum_get(op->ptr, "group"); - if(!ob) + if(ob == NULL) return OPERATOR_CANCELLED; - - base= object_in_scene(ob, scene); - if(!base) - return OPERATOR_CANCELLED; - - if(value == -1) - group= add_group( "Group" ); - else - group= BLI_findlink(&bmain->group, value); - if(group) { - add_to_group(group, ob, scene, NULL); /* base will be used if found */ - } + group= add_group("Group"); + add_to_group(group, ob, scene, NULL); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); - + return OPERATOR_FINISHED; } -static EnumPropertyItem group_items[]= { - {-1, "ADD_NEW", 0, "Add New Group", ""}, - {0, NULL, 0, NULL, NULL}}; - -static EnumPropertyItem *group_itemf(bContext *C, PointerRNA *ptr, int *free) -{ - Main *bmain= CTX_data_main(C); - Group *group; - EnumPropertyItem tmp = {0, "", 0, "", ""}; - EnumPropertyItem *item= NULL; - int a, totitem= 0; - - RNA_enum_items_add_value(&item, &totitem, group_items, -1); - - if (bmain) { - if(bmain->group.first) - RNA_enum_item_add_separator(&item, &totitem); - - for(a=0, group=bmain->group.first; group; group=group->id.next, a++) { - tmp.value= a; - tmp.identifier= group->id.name+2; - tmp.name= group->id.name+2; - RNA_enum_item_add(&item, &totitem, &tmp); - } - } - - RNA_enum_item_end(&item, &totitem); - *free= 1; - - return item; -} - void OBJECT_OT_group_add(wmOperatorType *ot) { - PropertyRNA *prop; - /* identifiers */ ot->name= "Add to Group"; ot->idname= "OBJECT_OT_group_add"; - ot->description = "Add an object to an existing group, or create new"; + ot->description = "Add an object to a new group"; /* api callbacks */ ot->exec= group_add_exec; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int group_link_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); + + if(ELEM(NULL, ob, group)) + return OPERATOR_CANCELLED; + + add_to_group(group, ob, scene, NULL); + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_group_link(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Link to Group"; + ot->idname= "OBJECT_OT_group_link"; + ot->description = "Add an object to an existing group"; + + /* api callbacks */ + ot->exec= group_link_exec; + ot->invoke= WM_enum_search_invoke; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "group", group_items, -1, "Group", "Group to add object to."); - RNA_def_enum_funcs(prop, group_itemf); + prop= RNA_def_enum(ot->srna, "group", DummyRNA_NULL_items, 0, "Group", ""); + RNA_def_enum_funcs(prop, RNA_group_local_itemf); + ot->prop= prop; } static int group_remove_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index 2f2b0987e05..8b171bae34d 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -35,16 +35,11 @@ #include "BLI_listbase.h" #include "BLI_string.h" -#include "DNA_action_types.h" #include "DNA_curve_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_action.h" #include "BKE_context.h" @@ -60,17 +55,15 @@ #include "RNA_define.h" #include "RNA_access.h" +#include "RNA_enum_types.h" #include "ED_curve.h" #include "ED_mesh.h" -#include "ED_object.h" -#include "ED_view3d.h" #include "ED_screen.h" #include "WM_types.h" #include "WM_api.h" -#include "UI_interface.h" #include "UI_resources.h" #include "object_intern.h" @@ -94,7 +87,7 @@ static int return_editmesh_indexar(BMEditMesh *em, int *tot, int **indexar, floa BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { if(BM_TestHFlag(eve, BM_SELECT)) { *index= nr; index++; - add_v3_v3v3(cent, cent, eve->co); + add_v3_v3(cent, eve->co); } nr++; } @@ -123,7 +116,7 @@ static int return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, fl for(i=0; itotweight; i++){ if(dvert->dw[i].def_nr == (obedit->actdef-1)) { totvert++; - add_v3_v3v3(cent, cent, eve->co); + add_v3_v3(cent, eve->co); } } } @@ -190,7 +183,7 @@ static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar if(bp->f1 & SELECT) { if(bp->hide==0) { *index= nr; index++; - add_v3_v3v3(cent, cent, bp->vec); + add_v3_v3(cent, bp->vec); } } bp++; @@ -263,17 +256,17 @@ static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, flo while(a--) { if(bezt->f1 & SELECT) { *index= nr; index++; - add_v3_v3v3(cent, cent, bezt->vec[0]); + add_v3_v3(cent, bezt->vec[0]); } nr++; if(bezt->f2 & SELECT) { *index= nr; index++; - add_v3_v3v3(cent, cent, bezt->vec[1]); + add_v3_v3(cent, bezt->vec[1]); } nr++; if(bezt->f3 & SELECT) { *index= nr; index++; - add_v3_v3v3(cent, cent, bezt->vec[2]); + add_v3_v3(cent, bezt->vec[2]); } nr++; bezt++; @@ -285,7 +278,7 @@ static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, flo while(a--) { if(bp->f1 & SELECT) { *index= nr; index++; - add_v3_v3v3(cent, cent, bp->vec); + add_v3_v3(cent, bp->vec); } nr++; bp++; @@ -540,9 +533,6 @@ void OBJECT_OT_hook_add_newobj(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -static EnumPropertyItem hook_mod_items[]= { -{0, NULL, 0, NULL, NULL}}; - static int object_hook_remove_exec(bContext *C, wmOperator *op) { int num= RNA_enum_get(op->ptr, "modifier"); @@ -577,7 +567,7 @@ static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *ptr, int *free) int a, totitem= 0; if(!ob) - return hook_mod_items; + return DummyRNA_NULL_items; for(a=0, md=ob->modifiers.first; md; md= md->next, a++) { if (md->type==eModifierType_Hook) { @@ -613,7 +603,7 @@ void OBJECT_OT_hook_remove(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "modifier", hook_mod_items, 0, "Modifier", "Modifier number to remove."); + prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to remove."); RNA_def_enum_funcs(prop, hook_mod_itemf); ot->prop= prop; } @@ -669,7 +659,7 @@ void OBJECT_OT_hook_reset(wmOperatorType *ot) /* identifiers */ ot->name= "Reset Hook"; - ot->description= "Recalculate and and clear offset transformation"; + ot->description= "Recalculate and clear offset transformation"; ot->idname= "OBJECT_OT_hook_reset"; /* callbacks */ @@ -680,7 +670,7 @@ void OBJECT_OT_hook_reset(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "modifier", hook_mod_items, 0, "Modifier", "Modifier number to assign to."); + prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to assign to."); RNA_def_enum_funcs(prop, hook_mod_itemf); } @@ -736,7 +726,7 @@ void OBJECT_OT_hook_recenter(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "modifier", hook_mod_items, 0, "Modifier", "Modifier number to assign to."); + prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to assign to."); RNA_def_enum_funcs(prop, hook_mod_itemf); } @@ -799,7 +789,7 @@ void OBJECT_OT_hook_assign(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "modifier", hook_mod_items, 0, "Modifier", "Modifier number to assign to."); + prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to assign to."); RNA_def_enum_funcs(prop, hook_mod_itemf); } @@ -848,7 +838,7 @@ void OBJECT_OT_hook_select(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "modifier", hook_mod_items, 0, "Modifier", "Modifier number to remove."); + prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to remove."); RNA_def_enum_funcs(prop, hook_mod_itemf); } diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 5331de02560..8bd0da3b43f 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -77,12 +77,20 @@ void OBJECT_OT_editmode_toggle(struct wmOperatorType *ot); void OBJECT_OT_posemode_toggle(struct wmOperatorType *ot); void OBJECT_OT_restrictview_set(struct wmOperatorType *ot); void OBJECT_OT_restrictview_clear(struct wmOperatorType *ot); +void OBJECT_OT_restrictrender_set(struct wmOperatorType *ot); +void OBJECT_OT_restrictrender_clear(struct wmOperatorType *ot); void OBJECT_OT_proxy_make(struct wmOperatorType *ot); void OBJECT_OT_shade_smooth(struct wmOperatorType *ot); void OBJECT_OT_shade_flat(struct wmOperatorType *ot); void OBJECT_OT_paths_calculate(struct wmOperatorType *ot); void OBJECT_OT_paths_clear(struct wmOperatorType *ot); +void OBJECT_OT_game_property_new(struct wmOperatorType *ot); +void OBJECT_OT_game_property_remove(struct wmOperatorType *ot); +void OBJECT_OT_game_property_copy(struct wmOperatorType *ot); +void OBJECT_OT_game_property_clear(struct wmOperatorType *ot); +void OBJECT_OT_logic_bricks_copy(struct wmOperatorType *ot); + /* object_select.c */ void OBJECT_OT_select_all(struct wmOperatorType *ot); void OBJECT_OT_select_inverse(struct wmOperatorType *ot); @@ -93,12 +101,11 @@ void OBJECT_OT_select_linked(struct wmOperatorType *ot); void OBJECT_OT_select_grouped(struct wmOperatorType *ot); void OBJECT_OT_select_mirror(struct wmOperatorType *ot); void OBJECT_OT_select_name(struct wmOperatorType *ot); +void OBJECT_OT_select_same_group(struct wmOperatorType *ot); /* object_add.c */ void OBJECT_OT_add(struct wmOperatorType *ot); void OBJECT_OT_add_named(struct wmOperatorType *ot); -void OBJECT_OT_curve_add(struct wmOperatorType *ot); -void OBJECT_OT_surface_add(struct wmOperatorType *ot); void OBJECT_OT_metaball_add(struct wmOperatorType *ot); void OBJECT_OT_text_add(struct wmOperatorType *ot); void OBJECT_OT_armature_add(struct wmOperatorType *ot); @@ -149,8 +156,8 @@ void OBJECT_OT_modifier_copy(struct wmOperatorType *ot); void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot); void OBJECT_OT_multires_reshape(struct wmOperatorType *ot); void OBJECT_OT_multires_higher_levels_delete(struct wmOperatorType *ot); -void OBJECT_OT_multires_save_external(struct wmOperatorType *ot); -void OBJECT_OT_multires_pack_external(struct wmOperatorType *ot); +void OBJECT_OT_multires_external_save(struct wmOperatorType *ot); +void OBJECT_OT_multires_external_pack(struct wmOperatorType *ot); void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot); void OBJECT_OT_explode_refresh(struct wmOperatorType *ot); @@ -160,6 +167,9 @@ void OBJECT_OT_constraint_add_with_targets(struct wmOperatorType *ot); void POSE_OT_constraint_add(struct wmOperatorType *ot); void POSE_OT_constraint_add_with_targets(struct wmOperatorType *ot); +void OBJECT_OT_constraints_copy(struct wmOperatorType *ot); +void POSE_OT_constraints_copy(struct wmOperatorType *ot); + void OBJECT_OT_constraints_clear(struct wmOperatorType *ot); void POSE_OT_constraints_clear(struct wmOperatorType *ot); @@ -195,9 +205,7 @@ void OBJECT_OT_vertex_group_clean(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_mirror(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_set_active(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_sort(struct wmOperatorType *ot); - -void OBJECT_OT_game_property_new(struct wmOperatorType *ot); -void OBJECT_OT_game_property_remove(struct wmOperatorType *ot); +void OBJECT_OT_vertex_group_move(struct wmOperatorType *ot); /* object_shapekey.c */ void OBJECT_OT_shape_key_add(struct wmOperatorType *ot); @@ -208,6 +216,7 @@ void OBJECT_OT_shape_key_move(struct wmOperatorType *ot); /* object_group.c */ void OBJECT_OT_group_add(struct wmOperatorType *ot); +void OBJECT_OT_group_link(struct wmOperatorType *ot); void OBJECT_OT_group_remove(struct wmOperatorType *ot); /* object_bake.c */ diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c index 404335ca1ca..afd4f7a88a7 100644 --- a/source/blender/editors/object/object_lattice.c +++ b/source/blender/editors/object/object_lattice.c @@ -47,7 +47,6 @@ #include "BKE_mesh.h" #include "BKE_utildefines.h" -#include "ED_object.h" #include "ED_screen.h" #include "ED_view3d.h" #include "ED_util.h" @@ -228,7 +227,7 @@ void LATTICE_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select or Deselect All"; - ot->description= "Change selection of all UVW control points"; + ot->description= "Change selection of all UVW control points"; ot->idname= "LATTICE_OT_select_all"; /* api callbacks */ @@ -276,7 +275,7 @@ void LATTICE_OT_make_regular(wmOperatorType *ot) { /* identifiers */ ot->name= "Make Regular"; - ot->description= "Set UVW control points a uniform distance apart"; + ot->description= "Set UVW control points a uniform distance apart"; ot->idname= "LATTICE_OT_make_regular"; /* api callbacks */ @@ -389,8 +388,8 @@ static int validate_undoLatt(void *data, void *edata) Lattice *editlatt= (Lattice *)edata; return (ult->pntsu == editlatt->pntsu && - ult->pntsv == editlatt->pntsv && - ult->pntsw == editlatt->pntsw); + ult->pntsv == editlatt->pntsv && + ult->pntsw == editlatt->pntsw); } static void *get_editlatt(bContext *C) diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 36475eaeaa1..8792803bf0c 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -31,13 +31,10 @@ #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" #include "DNA_curve_types.h" #include "DNA_key_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" #include "DNA_object_force.h" #include "DNA_scene_types.h" @@ -178,13 +175,13 @@ int ED_object_modifier_remove(ReportList *reports, Scene *scene, Object *ob, Mod if(ob->pd) ob->pd->deflect= 0; - DAG_scene_sort(scene); + DAG_scene_sort(scene); } else if(md->type == eModifierType_Surface) { if(ob->pd && ob->pd->shape == PFIELD_SHAPE_SURFACE) ob->pd->shape = PFIELD_SHAPE_PLANE; - DAG_scene_sort(scene); + DAG_scene_sort(scene); } else if(md->type == eModifierType_Smoke) { ob->dt = OB_TEXTURE; @@ -403,50 +400,65 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, ModifierData *md) { + ModifierTypeInfo *mti= modifierType_getInfo(md->type); + + if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) { + BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); + return 0; + } + if (ob->type==OB_MESH) { DerivedMesh *dm; Mesh *me = ob->data; + MultiresModifierData *mmd= find_multires_modifier_before(scene, md); + if( me->key) { BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys"); return 0; } - + mesh_pmv_off(ob, me); - + /* Multires: ensure that recent sculpting is applied */ if(md->type == eModifierType_Multires) multires_force_update(ob); - - dm = mesh_create_derived_for_modifier(scene, ob, md); - if (!dm) { - BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply"); - return 0; + + if (mmd && mmd->totlvl && mti->type==eModifierTypeType_OnlyDeform) { + if(!multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md)) { + BKE_report(reports, RPT_ERROR, "Multires modifier returned error, skipping apply"); + return 0; + } + } else { + dm = mesh_create_derived_for_modifier(scene, ob, md); + if (!dm) { + BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply"); + return 0; + } + + DM_to_mesh(dm, me); + + dm->release(dm); } - - DM_to_mesh(dm, me); - - dm->release(dm); } else if (ELEM(ob->type, OB_CURVE, OB_SURF)) { - ModifierTypeInfo *mti = modifierType_getInfo(md->type); - Curve *cu = ob->data; + Curve *cu; int numVerts; float (*vertexCos)[3]; - - - BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tesselated/bevel vertices"); - - if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) { - BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); + + if (mti->type==eModifierTypeType_Constructive) { + BKE_report(reports, RPT_ERROR, "Cannot apply constructive modifiers on curve"); return 0; } - + + cu = ob->data; + BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tesselated/bevel vertices"); + vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts); mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0); curve_applyVertexCos(cu, &cu->nurb, vertexCos); MEM_freeN(vertexCos); - + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); } else { @@ -495,20 +507,12 @@ int ED_object_modifier_copy(ReportList *reports, Object *ob, ModifierData *md) return 1; } -/***************************** OPERATORS ****************************/ - -static int modifier_poll(bContext *C) -{ - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - return (ptr.data != NULL && !((ID*)ptr.id.data)->lib); -} - /************************ add modifier operator *********************/ static int modifier_add_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Object *ob = CTX_data_active_object(C); + Object *ob = ED_object_active_context(C); int type= RNA_enum_get(op->ptr, "type"); if(!ED_object_modifier_add(op->reports, scene, ob, NULL, type)) @@ -521,7 +525,7 @@ static int modifier_add_exec(bContext *C, wmOperator *op) static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *ptr, int *free) { - Object *ob= CTX_data_active_object(C); + Object *ob= ED_object_active_context(C); EnumPropertyItem *item= NULL, *md_item; ModifierTypeInfo *mti; int totitem= 0, a; @@ -575,16 +579,69 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot) ot->prop= prop; } +/************************ generic functions for operators using mod names and data context *********************/ + +static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", rna_type); + Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C); + + if (!ob || ob->id.lib) return 0; + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + + return 1; +} + +static int edit_modifier_poll(bContext *C) +{ + return edit_modifier_poll_generic(C, &RNA_Modifier); +} + +static void edit_modifier_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "modifier", "", 32, "Modifier", "Name of the modifier to edit"); +} + +static int edit_modifier_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); + ModifierData *md; + + if (RNA_property_is_set(op->ptr, "modifier")) + return 1; + + if (ptr.data) { + md = ptr.data; + RNA_string_set(op->ptr, "modifier", md->name); + return 1; + } + + return 0; +} + +static ModifierData *edit_modifier_property_get(bContext *C, wmOperator *op, Object *ob, int type) +{ + char modifier_name[32]; + ModifierData *md; + RNA_string_get(op->ptr, "modifier", modifier_name); + + md = modifiers_findByName(ob, modifier_name); + + if (md && type != 0 && md->type != type) + md = NULL; + + return md; +} + /************************ remove modifier operator *********************/ static int modifier_remove_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - Object *ob= ptr.id.data; - ModifierData *md= ptr.data; - - if(!ED_object_modifier_remove(op->reports, scene, ob, md)) + Object *ob = ED_object_active_context(C); + ModifierData *md = edit_modifier_property_get(C, op, ob, 0); + + if(!ob || !md || !ED_object_modifier_remove(op->reports, scene, ob, md)) return OPERATOR_CANCELLED; WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); @@ -592,28 +649,37 @@ static int modifier_remove_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int modifier_remove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return modifier_remove_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_modifier_remove(wmOperatorType *ot) { ot->name= "Remove Modifier"; ot->description= "Remove a modifier from the active object"; ot->idname= "OBJECT_OT_modifier_remove"; + ot->invoke= modifier_remove_invoke; ot->exec= modifier_remove_exec; - ot->poll= modifier_poll; + ot->poll= edit_modifier_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /************************ move up modifier operator *********************/ static int modifier_move_up_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - Object *ob= ptr.id.data; - ModifierData *md= ptr.data; + Object *ob = ED_object_active_context(C); + ModifierData *md = edit_modifier_property_get(C, op, ob, 0); - if(!ED_object_modifier_move_up(op->reports, ob, md)) + if(!ob || !md || !ED_object_modifier_move_up(op->reports, ob, md)) return OPERATOR_CANCELLED; DAG_id_flush_update(&ob->id, OB_RECALC_DATA); @@ -622,26 +688,35 @@ static int modifier_move_up_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int modifier_move_up_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return modifier_move_up_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_modifier_move_up(wmOperatorType *ot) { ot->name= "Move Up Modifier"; ot->description= "Move modifier up in the stack"; ot->idname= "OBJECT_OT_modifier_move_up"; + ot->invoke= modifier_move_up_invoke; ot->exec= modifier_move_up_exec; - ot->poll= modifier_poll; + ot->poll= edit_modifier_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /************************ move down modifier operator *********************/ static int modifier_move_down_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - Object *ob= ptr.id.data; - ModifierData *md= ptr.data; + Object *ob = ED_object_active_context(C); + ModifierData *md = edit_modifier_property_get(C, op, ob, 0); if(!ob || !md || !ED_object_modifier_move_down(op->reports, ob, md)) return OPERATOR_CANCELLED; @@ -652,17 +727,27 @@ static int modifier_move_down_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int modifier_move_down_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return modifier_move_down_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_modifier_move_down(wmOperatorType *ot) { ot->name= "Move Down Modifier"; ot->description= "Move modifier down in the stack"; ot->idname= "OBJECT_OT_modifier_move_down"; + ot->invoke= modifier_move_down_invoke; ot->exec= modifier_move_down_exec; - ot->poll= modifier_poll; + ot->poll= edit_modifier_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /************************ apply modifier operator *********************/ @@ -670,13 +755,13 @@ void OBJECT_OT_modifier_move_down(wmOperatorType *ot) static int modifier_apply_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - Object *ob= ptr.id.data; - ModifierData *md= ptr.data; + Object *ob = ED_object_active_context(C); + ModifierData *md = edit_modifier_property_get(C, op, ob, 0); int apply_as= RNA_enum_get(op->ptr, "apply_as"); - - if(!ob || !md || !ED_object_modifier_apply(op->reports, scene, ob, md, apply_as)) + + if(!ob || !md || !ED_object_modifier_apply(op->reports, scene, ob, md, apply_as)) { return OPERATOR_CANCELLED; + } DAG_id_flush_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); @@ -684,6 +769,14 @@ static int modifier_apply_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int modifier_apply_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return modifier_apply_exec(C, op); + else + return OPERATOR_CANCELLED; +} + static EnumPropertyItem modifier_apply_as_items[] = { {MODIFIER_APPLY_DATA, "DATA", 0, "Object Data", "Apply modifier to the object's data"}, {MODIFIER_APPLY_SHAPE, "SHAPE", 0, "New Shape", "Apply deform-only modifier to a new shape on this object"}, @@ -695,14 +788,15 @@ void OBJECT_OT_modifier_apply(wmOperatorType *ot) ot->description= "Apply modifier and remove from the stack"; ot->idname= "OBJECT_OT_modifier_apply"; - //ot->invoke= WM_menu_invoke; + ot->invoke= modifier_apply_invoke; ot->exec= modifier_apply_exec; - ot->poll= modifier_poll; + ot->poll= edit_modifier_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_enum(ot->srna, "apply_as", modifier_apply_as_items, MODIFIER_APPLY_DATA, "Apply as", "How to apply the modifier to the geometry"); + edit_modifier_properties(ot); } /************************ convert modifier operator *********************/ @@ -710,10 +804,9 @@ void OBJECT_OT_modifier_apply(wmOperatorType *ot) static int modifier_convert_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - Object *ob= ptr.id.data; - ModifierData *md= ptr.data; - + Object *ob = ED_object_active_context(C); + ModifierData *md = edit_modifier_property_get(C, op, ob, 0); + if(!ob || !md || !ED_object_modifier_convert(op->reports, scene, ob, md)) return OPERATOR_CANCELLED; @@ -723,26 +816,35 @@ static int modifier_convert_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int modifier_convert_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return modifier_convert_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_modifier_convert(wmOperatorType *ot) { ot->name= "Convert Modifier"; ot->description= "Convert particles to a mesh object"; ot->idname= "OBJECT_OT_modifier_convert"; + ot->invoke= modifier_convert_invoke; ot->exec= modifier_convert_exec; - ot->poll= modifier_poll; + ot->poll= edit_modifier_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /************************ copy modifier operator *********************/ static int modifier_copy_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier); - Object *ob= ptr.id.data; - ModifierData *md= ptr.data; + Object *ob = ED_object_active_context(C); + ModifierData *md = edit_modifier_property_get(C, op, ob, 0); if(!ob || !md || !ED_object_modifier_copy(op->reports, ob, md)) return OPERATOR_CANCELLED; @@ -753,62 +855,83 @@ static int modifier_copy_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int modifier_copy_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return modifier_copy_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_modifier_copy(wmOperatorType *ot) { ot->name= "Copy Modifier"; ot->description= "Duplicate modifier at the same position in the stack"; ot->idname= "OBJECT_OT_modifier_copy"; + ot->invoke= modifier_copy_invoke; ot->exec= modifier_copy_exec; - ot->poll= modifier_poll; + ot->poll= edit_modifier_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /************* multires delete higher levels operator ****************/ static int multires_poll(bContext *C) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - ID *id= ptr.id.data; - return (ptr.data && id && !id->lib); + return edit_modifier_poll_generic(C, &RNA_MultiresModifier); } static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - Object *ob= ptr.id.data; - MultiresModifierData *mmd= ptr.data; - - if(mmd) { - multiresModifier_del_levels(mmd, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); - } + Object *ob = ED_object_active_context(C); + MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires); + + if (!mmd) + return OPERATOR_CANCELLED; + + multiresModifier_del_levels(mmd, ob, 1); + + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); return OPERATOR_FINISHED; } +static int multires_higher_levels_delete_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return multires_higher_levels_delete_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_multires_higher_levels_delete(wmOperatorType *ot) { ot->name= "Delete Higher Levels"; ot->idname= "OBJECT_OT_multires_higher_levels_delete"; ot->poll= multires_poll; + ot->invoke= multires_higher_levels_delete_invoke; ot->exec= multires_higher_levels_delete_exec; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /****************** multires subdivide operator *********************/ static int multires_subdivide_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - Object *ob= ptr.id.data; - MultiresModifierData *mmd= ptr.data; - + Object *ob = ED_object_active_context(C); + MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires); + + if (!mmd) + return OPERATOR_CANCELLED; + multiresModifier_subdivide(mmd, ob, 0, mmd->simple); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); @@ -817,6 +940,14 @@ static int multires_subdivide_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int multires_subdivide_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return multires_subdivide_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_multires_subdivide(wmOperatorType *ot) { ot->name= "Multires Subdivide"; @@ -824,25 +955,25 @@ void OBJECT_OT_multires_subdivide(wmOperatorType *ot) ot->idname= "OBJECT_OT_multires_subdivide"; ot->poll= multires_poll; + ot->invoke= multires_subdivide_invoke; ot->exec= multires_subdivide_exec; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /****************** multires reshape operator *********************/ static int multires_reshape_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - Object *ob= ptr.id.data, *secondob= NULL; - MultiresModifierData *mmd= ptr.data; + Object *ob= ED_object_active_context(C), *secondob= NULL; + Scene *scene= CTX_data_scene(C); + MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires); - if(ob->derivedFinal == NULL || ob->derivedFinal->type != DM_TYPE_CCGDM) { - BKE_report(op->reports, RPT_ERROR, "Active objects multires is disabled, can't reshape multires data."); + if (!mmd) return OPERATOR_CANCELLED; - } - + CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) { if(selob->type == OB_MESH && selob != ob) { secondob= selob; @@ -855,18 +986,26 @@ static int multires_reshape_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "Second selected mesh object require to copy shape from."); return OPERATOR_CANCELLED; } - - if(!multiresModifier_reshape(mmd, ob, secondob)) { + + if(!multiresModifier_reshape(scene, mmd, ob, secondob)) { BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices."); return OPERATOR_CANCELLED; } DAG_id_flush_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); - + return OPERATOR_FINISHED; } +static int multires_reshape_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return multires_reshape_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_multires_reshape(wmOperatorType *ot) { ot->name= "Multires Reshape"; @@ -874,27 +1013,33 @@ void OBJECT_OT_multires_reshape(wmOperatorType *ot) ot->idname= "OBJECT_OT_multires_reshape"; ot->poll= multires_poll; + ot->invoke= multires_reshape_invoke; ot->exec= multires_reshape_exec; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /****************** multires save external operator *********************/ -static int multires_save_external_exec(bContext *C, wmOperator *op) +static int multires_external_save_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - Object *ob= ptr.id.data; + Object *ob = ED_object_active_context(C); Mesh *me= (ob)? ob->data: op->customdata; char path[FILE_MAX]; + int relative= RNA_boolean_get(op->ptr, "relative_path"); + + if(!me) + return OPERATOR_CANCELLED; if(CustomData_external_test(&me->fdata, CD_MDISPS)) return OPERATOR_CANCELLED; - RNA_string_get(op->ptr, "path", path); - if(G.save_over) - BLI_makestringcode(G.sce, path); /* make relative */ + RNA_string_get(op->ptr, "filepath", path); + + if(relative) + BLI_path_rel(path, G.sce); CustomData_external_add(&me->fdata, &me->id, CD_MDISPS, me->totface, path); CustomData_external_write(&me->fdata, &me->id, CD_MASK_MESH, me->totface, 0); @@ -902,51 +1047,63 @@ static int multires_save_external_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int multires_save_external_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *event) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - Object *ob= ptr.id.data; + Object *ob = ED_object_active_context(C); + MultiresModifierData *mmd; Mesh *me= ob->data; char path[FILE_MAX]; + if (!edit_modifier_invoke_properties(C, op)) + return OPERATOR_CANCELLED; + + mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires); + + if (!mmd) + return OPERATOR_CANCELLED; + if(CustomData_external_test(&me->fdata, CD_MDISPS)) return OPERATOR_CANCELLED; - if(RNA_property_is_set(op->ptr, "path")) - return multires_save_external_exec(C, op); + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "filepath")) + return multires_external_save_exec(C, op); op->customdata= me; BLI_snprintf(path, sizeof(path), "//%s.btx", me->id.name+2); - RNA_string_set(op->ptr, "path", path); + RNA_string_set(op->ptr, "filepath", path); WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; } -void OBJECT_OT_multires_save_external(wmOperatorType *ot) +void OBJECT_OT_multires_external_save(wmOperatorType *ot) { ot->name= "Multires Save External"; ot->description= "Save displacements to an external file"; - ot->idname= "OBJECT_OT_multires_save_external"; + ot->idname= "OBJECT_OT_multires_external_save"; + // XXX modifier no longer in context after file browser .. ot->poll= multires_poll; + ot->exec= multires_external_save_exec; + ot->invoke= multires_external_save_invoke; ot->poll= multires_poll; - ot->exec= multires_save_external_exec; - ot->invoke= multires_save_external_invoke; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - WM_operator_properties_filesel(ot, FOLDERFILE|BTXFILE, FILE_SPECIAL, FILE_SAVE); + WM_operator_properties_filesel(ot, FOLDERFILE|BTXFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); + edit_modifier_properties(ot); } /****************** multires pack operator *********************/ -static int multires_pack_external_exec(bContext *C, wmOperator *op) +static int multires_external_pack_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier); - Object *ob= ptr.id.data; + Object *ob = ED_object_active_context(C); Mesh *me= ob->data; if(!CustomData_external_test(&me->fdata, CD_MDISPS)) @@ -958,14 +1115,14 @@ static int multires_pack_external_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void OBJECT_OT_multires_pack_external(wmOperatorType *ot) +void OBJECT_OT_multires_external_pack(wmOperatorType *ot) { ot->name= "Multires Pack External"; ot->description= "Pack displacements from an external file"; - ot->idname= "OBJECT_OT_multires_pack_external"; + ot->idname= "OBJECT_OT_multires_external_pack"; ot->poll= multires_poll; - ot->exec= multires_pack_external_exec; + ot->exec= multires_external_pack_exec; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -975,32 +1132,35 @@ void OBJECT_OT_multires_pack_external(wmOperatorType *ot) static int meshdeform_poll(bContext *C) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MeshDeformModifier); - ID *id= ptr.id.data; - return (ptr.data && id && !id->lib); + return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier); } static int meshdeform_bind_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - PointerRNA ptr= CTX_data_pointer_get(C, "modifier"); - Object *ob= ptr.id.data; - MeshDeformModifierData *mmd= ptr.data; + Object *ob = ED_object_active_context(C); + MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_MeshDeform); + + if (!mmd) + return OPERATOR_CANCELLED; - if(mmd->bindcos) { + if(mmd->bindcagecos) { if(mmd->bindweights) MEM_freeN(mmd->bindweights); - if(mmd->bindcos) MEM_freeN(mmd->bindcos); + if(mmd->bindcagecos) MEM_freeN(mmd->bindcagecos); if(mmd->dyngrid) MEM_freeN(mmd->dyngrid); if(mmd->dyninfluences) MEM_freeN(mmd->dyninfluences); if(mmd->dynverts) MEM_freeN(mmd->dynverts); mmd->bindweights= NULL; - mmd->bindcos= NULL; + mmd->bindcagecos= NULL; mmd->dyngrid= NULL; mmd->dyninfluences= NULL; mmd->dynverts= NULL; mmd->totvert= 0; mmd->totcagevert= 0; mmd->totinfluence= 0; + + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); } else { DerivedMesh *dm; @@ -1031,6 +1191,14 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int meshdeform_bind_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return meshdeform_bind_exec(C, op); + else + return OPERATOR_CANCELLED; +} + void OBJECT_OT_meshdeform_bind(wmOperatorType *ot) { /* identifiers */ @@ -1040,26 +1208,28 @@ void OBJECT_OT_meshdeform_bind(wmOperatorType *ot) /* api callbacks */ ot->poll= meshdeform_poll; + ot->invoke= meshdeform_bind_invoke; ot->exec= meshdeform_bind_exec; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } /****************** explode refresh operator *********************/ -static int explode_refresh_poll(bContext *C) +static int explode_poll(bContext *C) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_ExplodeModifier); - ID *id= ptr.id.data; - return (ptr.data && id && !id->lib); + return edit_modifier_poll_generic(C, &RNA_ExplodeModifier); } static int explode_refresh_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_ExplodeModifier); - Object *ob= ptr.id.data; - ExplodeModifierData *emd= ptr.data; + Object *ob = ED_object_active_context(C); + ExplodeModifierData *emd = (ExplodeModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Explode); + + if (!emd) + return OPERATOR_CANCELLED; emd->flag |= eExplodeFlag_CalcFaces; @@ -1069,16 +1239,27 @@ static int explode_refresh_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int explode_refresh_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_modifier_invoke_properties(C, op)) + return explode_refresh_exec(C, op); + else + return OPERATOR_CANCELLED; +} + + void OBJECT_OT_explode_refresh(wmOperatorType *ot) { ot->name= "Explode Refresh"; ot->description= "Refresh data in the Explode modifier"; ot->idname= "OBJECT_OT_explode_refresh"; + ot->poll= explode_poll; + ot->invoke= explode_refresh_invoke; ot->exec= explode_refresh_exec; - ot->poll= explode_refresh_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_modifier_properties(ot); } diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index ab50bd4c37c..ba706a0d4b9 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -33,11 +33,6 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -79,6 +74,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_proxy_make); WM_operatortype_append(OBJECT_OT_restrictview_clear); WM_operatortype_append(OBJECT_OT_restrictview_set); + WM_operatortype_append(OBJECT_OT_restrictrender_clear); + WM_operatortype_append(OBJECT_OT_restrictrender_set); WM_operatortype_append(OBJECT_OT_shade_smooth); WM_operatortype_append(OBJECT_OT_shade_flat); WM_operatortype_append(OBJECT_OT_paths_calculate); @@ -101,6 +98,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_select_inverse); WM_operatortype_append(OBJECT_OT_select_random); WM_operatortype_append(OBJECT_OT_select_all); + WM_operatortype_append(OBJECT_OT_select_same_group); WM_operatortype_append(OBJECT_OT_select_by_type); WM_operatortype_append(OBJECT_OT_select_by_layer); WM_operatortype_append(OBJECT_OT_select_linked); @@ -114,9 +112,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(GROUP_OT_objects_remove_active); WM_operatortype_append(OBJECT_OT_delete); - WM_operatortype_append(OBJECT_OT_curve_add); WM_operatortype_append(OBJECT_OT_text_add); - WM_operatortype_append(OBJECT_OT_surface_add); WM_operatortype_append(OBJECT_OT_armature_add); WM_operatortype_append(OBJECT_OT_lamp_add); WM_operatortype_append(OBJECT_OT_camera_add); @@ -141,8 +137,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_multires_subdivide); WM_operatortype_append(OBJECT_OT_multires_reshape); WM_operatortype_append(OBJECT_OT_multires_higher_levels_delete); - WM_operatortype_append(OBJECT_OT_multires_save_external); - WM_operatortype_append(OBJECT_OT_multires_pack_external); + WM_operatortype_append(OBJECT_OT_multires_external_save); + WM_operatortype_append(OBJECT_OT_multires_external_pack); WM_operatortype_append(OBJECT_OT_meshdeform_bind); WM_operatortype_append(OBJECT_OT_explode_refresh); @@ -150,6 +146,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_constraint_add_with_targets); WM_operatortype_append(POSE_OT_constraint_add); WM_operatortype_append(POSE_OT_constraint_add_with_targets); + WM_operatortype_append(OBJECT_OT_constraints_copy); + WM_operatortype_append(POSE_OT_constraints_copy); WM_operatortype_append(OBJECT_OT_constraints_clear); WM_operatortype_append(POSE_OT_constraints_clear); WM_operatortype_append(POSE_OT_ik_add); @@ -180,9 +178,13 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_vertex_group_mirror); WM_operatortype_append(OBJECT_OT_vertex_group_set_active); WM_operatortype_append(OBJECT_OT_vertex_group_sort); + WM_operatortype_append(OBJECT_OT_vertex_group_move); WM_operatortype_append(OBJECT_OT_game_property_new); WM_operatortype_append(OBJECT_OT_game_property_remove); + WM_operatortype_append(OBJECT_OT_game_property_copy); + WM_operatortype_append(OBJECT_OT_game_property_clear); + WM_operatortype_append(OBJECT_OT_logic_bricks_copy); WM_operatortype_append(OBJECT_OT_shape_key_add); WM_operatortype_append(OBJECT_OT_shape_key_remove); @@ -194,6 +196,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(LATTICE_OT_make_regular); WM_operatortype_append(OBJECT_OT_group_add); + WM_operatortype_append(OBJECT_OT_group_link); WM_operatortype_append(OBJECT_OT_group_remove); WM_operatortype_append(OBJECT_OT_hook_add_selobj); @@ -279,7 +282,7 @@ void ED_keymap_object(wmKeyConfig *keyconf) keymap->poll= object_mode_poll; /* object mode supports PET now */ - ED_object_generic_keymap(keyconf, keymap, TRUE); + ED_object_generic_keymap(keyconf, keymap, 1); WM_keymap_add_item(keymap, "VIEW3D_OT_game_start", PKEY, KM_PRESS, 0, 0); @@ -319,10 +322,16 @@ void ED_keymap_object(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "OBJECT_OT_restrictview_set", HKEY, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_restrictview_set", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + /* same as above but for rendering */ + WM_keymap_add_item(keymap, "OBJECT_OT_restrictrender_clear", HKEY, KM_PRESS, KM_ALT|KM_CTRL, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_restrictrender_set", HKEY, KM_PRESS, KM_CTRL, 0); +// RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_restrictrender_set", HKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "unselected", 1); // conflicts, removing + WM_keymap_add_item(keymap, "OBJECT_OT_move_to_layer", MKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "OBJECT_OT_duplicates_make_real", AKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); @@ -342,6 +351,7 @@ void ED_keymap_object(wmKeyConfig *keyconf) // XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_insert_menu", IKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_delete_v3d", IKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_verify_item(keymap, "ANIM_OT_keying_set_active_set", IKEY, KM_PRESS, KM_CTRL|KM_SHIFT|KM_ALT, 0); WM_keymap_verify_item(keymap, "GROUP_OT_create", GKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "GROUP_OT_objects_remove", GKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); @@ -366,7 +376,7 @@ void ED_keymap_object(wmKeyConfig *keyconf) /* menus */ WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0); - ED_object_generic_keymap(keyconf, keymap, TRUE); + ED_object_generic_keymap(keyconf, keymap, 1); } void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet) @@ -374,20 +384,23 @@ void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keym wmKeyMapItem *kmi; /* used by mesh, curve & lattice only */ - if(do_pet) { + if(do_pet > 0) { /* context ops */ kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_enum", OKEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.proportional_editing_falloff"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_editing_falloff"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.proportional_editing"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_editing"); RNA_string_set(kmi->ptr, "value_1", "DISABLED"); RNA_string_set(kmi->ptr, "value_2", "ENABLED"); - kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, KM_ALT, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.proportional_editing"); - RNA_string_set(kmi->ptr, "value_1", "DISABLED"); - RNA_string_set(kmi->ptr, "value_2", "CONNECTED"); + /* for modes/object types that allow 'conencted' mode, add the Alt O key */ + if (do_pet > 1) { + kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, KM_ALT, 0); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_editing"); + RNA_string_set(kmi->ptr, "value_1", "DISABLED"); + RNA_string_set(kmi->ptr, "value_2", "CONNECTED"); + } } } diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 3233954748a..cc9df09dc38 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -32,20 +32,14 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" #include "DNA_constraint_types.h" -#include "DNA_curve_types.h" #include "DNA_group_types.h" #include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" #include "DNA_meta_types.h" -#include "DNA_object_types.h" #include "DNA_particle_types.h" #include "DNA_scene_types.h" -#include "DNA_view3d_types.h" #include "DNA_world_types.h" #include "BLI_math.h" @@ -87,7 +81,6 @@ #include "RNA_define.h" #include "RNA_enum_types.h" -#include "ED_anim_api.h" #include "ED_armature.h" #include "ED_curve.h" #include "ED_object.h" @@ -197,7 +190,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { if(ob != obedit) { - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; par= obedit->parent; while(par) { @@ -283,7 +276,7 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt) PointerRNA props_ptr; /* create operator menu item with relevant properties filled in */ - props_ptr= uiItemFullO(layout, op->type->name, 0, op->idname, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, op->idname, op->type->name, 0, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS); /* present the menu and be done... */ uiPupMenuEnd(C, pup); @@ -343,7 +336,7 @@ static int make_proxy_exec (bContext *C, wmOperator *op) /* depsgraph flushes are needed for the new data */ DAG_scene_sort(scene); - DAG_id_flush_update(&newob->id, OB_RECALC); + DAG_id_flush_update(&newob->id, OB_RECALC_ALL); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, newob); } else { @@ -409,7 +402,7 @@ void OBJECT_OT_proxy_make (wmOperatorType *ot) static EnumPropertyItem prop_clear_parent_types[] = { {0, "CLEAR", 0, "Clear Parent", ""}, - {1, "CLEAR_KEEP_TRANSFORM", 0, "Clear and Keep Transformation (Clear Track)", ""}, + {1, "CLEAR_KEEP_TRANSFORM", 0, "Clear and Keep Transformation", ""}, {2, "CLEAR_INVERSE", 0, "Clear Parent Inverse", ""}, {0, NULL, 0, NULL, NULL} }; @@ -426,13 +419,12 @@ static int parent_clear_exec(bContext *C, wmOperator *op) } else if(type == 1) { ob->parent= NULL; - ob->track= NULL; - ED_object_apply_obmat(ob); + object_apply_mat4(ob, ob->obmat); } else if(type == 2) unit_m4(ob->parentinv); - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; } CTX_DATA_END; @@ -569,7 +561,7 @@ static int parent_set_exec(bContext *C, wmOperator *op) Object workob; /* apply transformation of previous parenting */ - ED_object_apply_obmat(ob); + object_apply_mat4(ob, ob->obmat); /* set the parent (except for follow-path constraint option) */ if(partype != PAR_PATH_CONST) @@ -676,23 +668,23 @@ static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event) uiLayout *layout= uiPupMenuLayout(pup); uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_OBJECT); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_OBJECT); /* ob becomes parent, make the associated menus */ if(ob->type==OB_ARMATURE) { - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_NAME); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_ENVELOPE); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_AUTO); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_BONE); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_ARMATURE); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_ARMATURE_NAME); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_ARMATURE_ENVELOPE); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_ARMATURE_AUTO); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_BONE); } else if(ob->type==OB_CURVE) { - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_CURVE); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_FOLLOW); - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_PATH_CONST); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_CURVE); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_FOLLOW); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_PATH_CONST); } else if(ob->type == OB_LATTICE) { - uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_LATTICE); + uiItemEnumO(layout, "OBJECT_OT_parent_set", NULL, 0, "type", PAR_LATTICE); } uiPupMenuEnd(C, pup); @@ -874,7 +866,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op) /* remove track-object for old track */ ob->track= NULL; - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; /* also remove all tracking constraints */ for (con= ob->constraints.last; con; con= pcon) { @@ -884,7 +876,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op) } if(type == 1) - ED_object_apply_obmat(ob); + object_apply_mat4(ob, ob->obmat); } CTX_DATA_END; @@ -920,7 +912,6 @@ static EnumPropertyItem prop_make_track_types[] = { {1, "DAMPTRACK", 0, "Damped Track Constraint", ""}, {2, "TRACKTO", 0, "Track To Constraint", ""}, {3, "LOCKTRACK", 0, "Lock Track Constraint", ""}, - {4, "OLDTRACK", 0, "Old Track", ""}, {0, NULL, 0, NULL, NULL} }; @@ -941,7 +932,7 @@ static int track_set_exec(bContext *C, wmOperator *op) data = con->data; data->tar = obact; - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; /* Lamp and Camera track differently by default */ if (ob->type == OB_LAMP || ob->type == OB_CAMERA) @@ -960,7 +951,7 @@ static int track_set_exec(bContext *C, wmOperator *op) data = con->data; data->tar = obact; - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; /* Lamp and Camera track differently by default */ if (ob->type == OB_LAMP || ob->type == OB_CAMERA) { @@ -981,7 +972,7 @@ static int track_set_exec(bContext *C, wmOperator *op) data = con->data; data->tar = obact; - ob->recalc |= OB_RECALC; + ob->recalc |= OB_RECALC_ALL; /* Lamp and Camera track differently by default */ if (ob->type == OB_LAMP || ob->type == OB_CAMERA) { @@ -992,15 +983,6 @@ static int track_set_exec(bContext *C, wmOperator *op) } CTX_DATA_END; } - else { - CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { - if(ob!=obact) { - ob->track= obact; - ob->recalc |= OB_RECALC; - } - } - CTX_DATA_END; - } DAG_scene_sort(scene); DAG_ids_flush_update(0); @@ -1161,7 +1143,7 @@ void link_to_scene(unsigned short nr) static int make_links_scene_exec(bContext *C, wmOperator *op) { - Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "type")); + Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene")); if(scene_to==NULL) { BKE_report(op->reports, RPT_ERROR, "Scene not found"); @@ -1203,6 +1185,30 @@ enum { MAKE_LINKS_MODIFIERS }; +/* Return 1 if make link data is allow, zero otherwise */ +static int allow_make_links_data(int ev, Object *ob, Object *obt) +{ + switch(ev) { + case MAKE_LINKS_OBDATA: + if (ob->type == obt->type && ob->type != OB_EMPTY) + return 1; + break; + case MAKE_LINKS_MATERIALS: + if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF, OB_MBALL) && + ELEM5(obt->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF, OB_MBALL)) + return 1; + break; + case MAKE_LINKS_ANIMDATA: + case MAKE_LINKS_DUPLIGROUP: + return 1; + case MAKE_LINKS_MODIFIERS: + if (ob->type != OB_EMPTY && obt->type != OB_EMPTY) + return 1; + break; + } + return 0; +} + static int make_links_data_exec(bContext *C, wmOperator *op) { int event = RNA_int_get(op->ptr, "type"); @@ -1214,43 +1220,44 @@ static int make_links_data_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Object*, obt, selected_editable_objects) { if(ob != obt) { - switch(event) { - case MAKE_LINKS_OBDATA: /* obdata */ - id= obt->data; - id->us--; + if (allow_make_links_data(event, ob, obt)) { + switch(event) { + case MAKE_LINKS_OBDATA: /* obdata */ + id= obt->data; + id->us--; - id= ob->data; - id_us_plus(id); - obt->data= id; + id= ob->data; + id_us_plus(id); + obt->data= id; - /* if amount of material indices changed: */ - test_object_materials(obt->data); + /* if amount of material indices changed: */ + test_object_materials(obt->data); - obt->recalc |= OB_RECALC_DATA; - break; - case MAKE_LINKS_MATERIALS: - /* new approach, using functions from kernel */ - for(a=0; atotcol; a++) { - Material *ma= give_current_material(ob, a+1); - assign_material(obt, ma, a+1); /* also works with ma==NULL */ - } - break; - case MAKE_LINKS_ANIMDATA: - BKE_copy_animdata_id((ID *)obt, (ID *)ob); - BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data); - break; - case MAKE_LINKS_DUPLIGROUP: - if(ob->dup_group) ob->dup_group->id.us--; + obt->recalc |= OB_RECALC_DATA; + break; + case MAKE_LINKS_MATERIALS: + /* new approach, using functions from kernel */ + for(a=0; atotcol; a++) { + Material *ma= give_current_material(ob, a+1); + assign_material(obt, ma, a+1); /* also works with ma==NULL */ + } + break; + case MAKE_LINKS_ANIMDATA: + BKE_copy_animdata_id((ID *)obt, (ID *)ob); + BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data); + break; + case MAKE_LINKS_DUPLIGROUP: obt->dup_group= ob->dup_group; if(obt->dup_group) { - id_us_plus((ID *)obt->dup_group); + id_lib_extern(&obt->dup_group->id); obt->transflag |= OB_DUPLIGROUP; } - break; - case MAKE_LINKS_MODIFIERS: - object_link_modifiers(obt, ob); - obt->recalc |= OB_RECALC; - break; + break; + case MAKE_LINKS_MODIFIERS: + object_link_modifiers(obt, ob); + obt->recalc |= OB_RECALC_ALL; + break; + } } } } @@ -1279,8 +1286,9 @@ void OBJECT_OT_make_links_scene(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", ""); - RNA_def_enum_funcs(prop, RNA_scene_itemf); + prop= RNA_def_enum(ot->srna, "scene", DummyRNA_NULL_items, 0, "Scene", ""); + RNA_def_enum_funcs(prop, RNA_scene_local_itemf); + ot->prop= prop; } void OBJECT_OT_make_links_data(wmOperatorType *ot) @@ -1357,7 +1365,6 @@ void single_object_users(Scene *scene, View3D *v3d, int flag) modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL); ID_NEW(ob->parent); - ID_NEW(ob->track); } } @@ -1678,13 +1685,13 @@ static void single_mat_users_expand(void) /* used for copying scenes */ void ED_object_single_users(Scene *scene, int full) { - single_object_users(scene, NULL, 0); + single_object_users(scene, NULL, 0); - if(full) { - single_obdata_users(scene, 0); - single_mat_users_expand(); - single_tex_users_expand(); - } + if(full) { + single_obdata_users(scene, 0); + single_mat_users_expand(); + single_tex_users_expand(); + } clear_id_newpoins(); } @@ -1726,22 +1733,21 @@ static int make_local_exec(bContext *C, wmOperator *op) clear_id_newpoins(); - CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { + CTX_DATA_BEGIN(C, Object*, ob, selected_objects) { if(ob->id.lib) id_make_local(&ob->id, 0); } CTX_DATA_END; /* maybe object pointers */ - CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { + CTX_DATA_BEGIN(C, Object*, ob, selected_objects) { if(ob->id.lib==NULL) { ID_NEW(ob->parent); - ID_NEW(ob->track); } } CTX_DATA_END; - CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { + CTX_DATA_BEGIN(C, Object*, ob, selected_objects) { id= ob->data; if(id && mode>1) { @@ -1759,7 +1765,7 @@ static int make_local_exec(bContext *C, wmOperator *op) CTX_DATA_END; if(mode>1) { - CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { + CTX_DATA_BEGIN(C, Object*, ob, selected_objects) { if(ob->type==OB_LAMP) { la= ob->data; @@ -1824,7 +1830,7 @@ static int make_single_user_exec(bContext *C, wmOperator *op) int flag= RNA_enum_get(op->ptr, "type"); /* 0==ALL, SELECTED==selected objecs */ if(RNA_boolean_get(op->ptr, "object")) - single_object_users(scene, v3d, flag); + single_object_users(scene, v3d, flag); if(RNA_boolean_get(op->ptr, "obdata")) single_obdata_users(scene, flag); diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index b3c104dcb56..8e3d613e02e 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -35,10 +35,8 @@ #include "DNA_group_types.h" #include "DNA_material_types.h" #include "DNA_modifier_types.h" -#include "DNA_object_types.h" #include "DNA_property_types.h" #include "DNA_scene_types.h" -#include "DNA_texture_types.h" #include "BLI_math.h" #include "BLI_listbase.h" @@ -47,7 +45,6 @@ #include "BKE_context.h" #include "BKE_depsgraph.h" -#include "BKE_global.h" #include "BKE_group.h" #include "BKE_main.h" #include "BKE_material.h" @@ -60,9 +57,10 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_object.h" #include "ED_screen.h" +#include "UI_interface.h" + #include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" @@ -164,11 +162,13 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot) static EnumPropertyItem prop_select_linked_types[] = { //{1, "IPO", 0, "Object IPO", ""}, // XXX depreceated animation system stuff... - {2, "OBDATA", 0, "Ob Data", ""}, + {2, "OBDATA", 0, "Object Data", ""}, {3, "MATERIAL", 0, "Material", ""}, {4, "TEXTURE", 0, "Texture", ""}, {5, "DUPGROUP", 0, "Dupligroup", ""}, {6, "PARTICLE", 0, "Particle System", ""}, + {7, "LIBRARY", 0, "Library", ""}, + {8, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""}, {0, NULL, 0, NULL, NULL} }; @@ -201,7 +201,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) } ob= OBACT; - if(ob==0){ + if(ob==NULL){ BKE_report(op->reports, RPT_ERROR, "No Active Object"); return OPERATOR_CANCELLED; } @@ -230,7 +230,14 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) else if(nr==6) { if(ob->particlesystem.first==NULL) return OPERATOR_CANCELLED; } - else return OPERATOR_CANCELLED; + else if(nr==7) { + /* do nothing */ + } + else if(nr==8) { + if(ob->data==NULL) return OPERATOR_CANCELLED; + } + else + return OPERATOR_CANCELLED; CTX_DATA_BEGIN(C, Base*, base, visible_bases) { if(nr==1) { @@ -289,6 +296,18 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) } } } + else if(nr==7) { + if(ob->id.lib == base->object->id.lib) { + base->flag |= SELECT; + changed= 1; + } + } + else if(nr==8) { + if(base->object->data && ((ID *)ob->data)->lib == ((ID *)base->object->data)->lib) { + base->flag |= SELECT; + changed= 1; + } + } base->object->flag= base->flag; } CTX_DATA_END; @@ -385,14 +404,11 @@ static short select_grouped_group(bContext *C, Object *ob) /* Select objects in { short changed = 0; Group *group, *ob_groups[GROUP_MENU_MAX]; - //char str[10 + (24*GROUP_MENU_MAX)]; - //char *p = str; - int group_count=0; //, menu, i; + int group_count=0, i; + uiPopupMenu *pup; + uiLayout *layout; - for ( group=G.main->group.first; - group && group_count < GROUP_MENU_MAX; - group=group->id.next - ) { + for (group=CTX_data_main(C)->group.first; group && group_count < GROUP_MENU_MAX; group=group->id.next) { if (object_in_group (ob, group)) { ob_groups[group_count] = group; group_count++; @@ -401,7 +417,6 @@ static short select_grouped_group(bContext *C, Object *ob) /* Select objects in if (!group_count) return 0; - else if (group_count == 1) { group = ob_groups[0]; CTX_DATA_BEGIN(C, Base*, base, visible_bases) { @@ -413,27 +428,18 @@ static short select_grouped_group(bContext *C, Object *ob) /* Select objects in CTX_DATA_END; return changed; } -#if 0 // XXX hows this work in 2.5? + /* build the menu. */ - p += sprintf(str, "Groups%%t"); + pup= uiPupMenuBegin(C, "Select Group", 0); + layout= uiPupMenuLayout(pup); + for (i=0; iid.name+2, i); + uiItemStringO(layout, group->id.name+2, 0, "OBJECT_OT_select_same_group", "group", group->id.name); } - menu = pupmenu (str); - if (menu == -1) - return 0; - - group = ob_groups[menu]; - for (base= FIRSTBASE; base; base= base->next) { - if (!(base->flag & SELECT) && object_in_group(base->object, group)) { - ED_base_object_select(base, BA_SELECT); - changed = 1; - } - } -#endif - return changed; + uiPupMenuEnd(C, pup); + return changed; // The operator already handle this! } static short select_grouped_object_hooks(bContext *C, Object *ob) @@ -768,6 +774,55 @@ void OBJECT_OT_select_all(wmOperatorType *ot) WM_operator_properties_select_all(ot); } +/**************************** Select In The Same Group ****************************/ + +static int object_select_same_group_exec(bContext *C, wmOperator *op) +{ + Group *group; + char group_name[32]; + + /* passthrough if no objects are visible */ + if (CTX_DATA_COUNT(C, visible_bases) == 0) return OPERATOR_PASS_THROUGH; + + RNA_string_get(op->ptr, "group", group_name); + + for (group=CTX_data_main(C)->group.first; group; group=group->id.next) { + if (!strcmp(group->id.name, group_name)) + break; + } + + if (!group) + return OPERATOR_PASS_THROUGH; + + CTX_DATA_BEGIN(C, Base*, base, visible_bases) { + if (!(base->flag & SELECT) && object_in_group(base->object, group)) + ED_base_object_select(base, BA_SELECT); + } + CTX_DATA_END; + + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C)); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_select_same_group(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "select same group"; + ot->description = "Select object in the same group"; + ot->idname= "OBJECT_OT_select_same_group"; + + /* api callbacks */ + ot->exec= object_select_same_group_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_string(ot->srna, "group", "", 32, "Group", "Name of the group to select."); +} + /**************************** Select Mirror ****************************/ /* finds the best possible flipped name. For renaming; check for unique names afterwards */ @@ -944,7 +999,9 @@ static int object_select_name_exec(bContext *C, wmOperator *op) } CTX_DATA_BEGIN(C, Base*, base, selectable_bases) { + /* this is a bit dodjy, there should only be ONE object with this name, but library objects can mess this up */ if(strcmp(name, base->object->id.name+2)==0) { + ED_base_object_activate(C, base); ED_base_object_select(base, BA_SELECT); changed= 1; } diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 3cf29cd3eaf..6735d07b591 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -39,19 +39,12 @@ #include "BLI_blenlib.h" #include "BLI_math.h" -#include "DNA_action_types.h" #include "DNA_curve_types.h" -#include "DNA_ipo_types.h" #include "DNA_key_types.h" #include "DNA_lattice_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view2d_types.h" #include "BKE_action.h" #include "BKE_anim.h" @@ -69,7 +62,6 @@ #include "BLO_sys_types.h" // for intptr_t support -#include "ED_object.h" #include "ED_mesh.h" #include "RNA_access.h" diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index 0faca76e881..50764aeb192 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -29,16 +29,11 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_curve_types.h" #include "DNA_key_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_view3d_types.h" #include "BLI_math.h" #include "BLI_editVert.h" @@ -61,12 +56,10 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_anim_api.h" #include "ED_armature.h" #include "ED_curve.h" #include "ED_keyframing.h" #include "ED_mesh.h" -#include "ED_object.h" #include "ED_screen.h" #include "ED_view3d.h" @@ -76,32 +69,35 @@ static int object_location_clear_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); - + Scene *scene = CTX_data_scene(C); KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); /* clear location of selected objects if not in weight-paint mode */ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { - if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) { - if((ob->protectflag & OB_LOCK_LOCX)==0) + if (!(ob->mode & OB_MODE_WEIGHT_PAINT)) { + /* clear location if not locked */ + if ((ob->protectflag & OB_LOCK_LOCX)==0) ob->loc[0]= ob->dloc[0]= 0.0f; - if((ob->protectflag & OB_LOCK_LOCY)==0) + if ((ob->protectflag & OB_LOCK_LOCY)==0) ob->loc[1]= ob->dloc[1]= 0.0f; - if((ob->protectflag & OB_LOCK_LOCZ)==0) + if ((ob->protectflag & OB_LOCK_LOCZ)==0) ob->loc[2]= ob->dloc[2]= 0.0f; - /* do auto-keyframing as appropriate */ + /* auto keyframing */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* init cks for this object, then use the relative KeyingSets to keyframe it */ - cks.id= &ob->id; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + ListBase dsources = {NULL, NULL}; + + /* now insert the keyframe(s) using the Keying Set + * 1) add datasource override for the PoseChannel + * 2) insert keyframes + * 3) free the extra info + */ + ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); } } + ob->recalc |= OB_RECALC_OB; } CTX_DATA_END; @@ -132,17 +128,12 @@ void OBJECT_OT_location_clear(wmOperatorType *ot) static int object_rotation_clear_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); /* clear rotation of selected objects if not in weight-paint mode */ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) { + /* clear rotations that aren't locked */ if (ob->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) { if (ob->protectflag & OB_LOCK_ROT4D) { /* perform clamping on a component by component basis */ @@ -218,7 +209,7 @@ static int object_rotation_clear_exec(bContext *C, wmOperator *op) VECCOPY(ob->rot, eul); } } - } + } // Duplicated in source/blender/editors/armature/editarmature.c else { if (ob->rotmode == ROT_MODE_QUAT) { ob->quat[1]=ob->quat[2]=ob->quat[3]= 0.0f; @@ -234,13 +225,21 @@ static int object_rotation_clear_exec(bContext *C, wmOperator *op) } } - /* do auto-keyframing as appropriate */ + /* auto keyframing */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* init cks for this object, then use the relative KeyingSets to keyframe it */ - cks.id= &ob->id; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + ListBase dsources = {NULL, NULL}; + + /* now insert the keyframe(s) using the Keying Set + * 1) add datasource override for the PoseChannel + * 2) insert keyframes + * 3) free the extra info + */ + ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); } } + ob->recalc |= OB_RECALC_OB; } CTX_DATA_END; @@ -271,35 +270,37 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot) static int object_scale_clear_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scaling"); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); /* clear scales of selected objects if not in weight-paint mode */ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) { - if((ob->protectflag & OB_LOCK_SCALEX)==0) { + /* clear scale factors which are not locked */ + if ((ob->protectflag & OB_LOCK_SCALEX)==0) { ob->dsize[0]= 0.0f; ob->size[0]= 1.0f; } - if((ob->protectflag & OB_LOCK_SCALEY)==0) { + if ((ob->protectflag & OB_LOCK_SCALEY)==0) { ob->dsize[1]= 0.0f; ob->size[1]= 1.0f; } - if((ob->protectflag & OB_LOCK_SCALEZ)==0) { + if ((ob->protectflag & OB_LOCK_SCALEZ)==0) { ob->dsize[2]= 0.0f; ob->size[2]= 1.0f; } - /* do auto-keyframing as appropriate */ + /* auto keyframing */ if (autokeyframe_cfra_can_key(scene, &ob->id)) { - /* init cks for this object, then use the relative KeyingSets to keyframe it */ - cks.id= &ob->id; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + ListBase dsources = {NULL, NULL}; + + /* now insert the keyframe(s) using the Keying Set + * 1) add datasource override for the PoseChannel + * 2) insert keyframes + * 3) free the extra info + */ + ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); } } ob->recalc |= OB_RECALC_OB; @@ -385,7 +386,7 @@ static void ignore_parent_tx(Main *bmain, Scene *scene, Object *ob ) /* a change was made, adjust the children to compensate */ for(ob_child=bmain->object.first; ob_child; ob_child=ob_child->id.next) { if(ob_child->parent == ob) { - ED_object_apply_obmat(ob_child); + object_apply_mat4(ob_child, ob_child->obmat); what_does_parent(scene, ob_child, &workob); invert_m4_m4(ob_child->parentinv, workob.obmat); } @@ -432,6 +433,10 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo BKE_report(reports, RPT_ERROR, "Can't apply to a multi user curve, doing nothing."); return OPERATOR_CANCELLED; } + if(!(cu->flag & CU_3D) && (apply_rot || apply_loc)) { + BKE_report(reports, RPT_ERROR, "Neither rotation nor location could be applied to a 2d curve, doing nothing."); + return OPERATOR_CANCELLED; + } if(cu->key) { BKE_report(reports, RPT_ERROR, "Can't apply to a curve with vertex keys, doing nothing."); return OPERATOR_CANCELLED; @@ -498,7 +503,7 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo cu= ob->data; scale = mat3_to_scale(rsmat); - + for(nu=cu->nurb.first; nu; nu=nu->next) { if(nu->type == CU_BEZIER) { a= nu->pntsu; @@ -759,7 +764,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) } BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { - sub_v3_v3v3(eve->co, eve->co, cent); + sub_v3_v3(eve->co, cent); } EDBM_RecalcNormals(em); @@ -804,7 +809,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) mvert= me->mvert; for(a=0; atotvert; a++, mvert++) { - sub_v3_v3v3(mvert->co, mvert->co, cent); + sub_v3_v3(mvert->co, cent); } if (me->key) { @@ -813,7 +818,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) float *fp= kb->data; for (a=0; atotelem; a++, fp+=3) { - sub_v3_v3v3(fp, fp, cent); + sub_v3_v3(fp, cent); } } } @@ -855,7 +860,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if(tme && (tme->flag & ME_ISDONE)==0) { mvert= tme->mvert; for(a=0; atotvert; a++, mvert++) { - sub_v3_v3v3(mvert->co, mvert->co, cent); + sub_v3_v3(mvert->co, cent); } if (tme->key) { @@ -864,7 +869,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) float *fp= kb->data; for (a=0; atotelem; a++, fp+=3) { - sub_v3_v3v3(fp, fp, cent); + sub_v3_v3(fp, cent); } } } @@ -924,15 +929,15 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if(nu->type == CU_BEZIER) { a= nu->pntsu; while (a--) { - sub_v3_v3v3(nu->bezt[a].vec[0], nu->bezt[a].vec[0], cent); - sub_v3_v3v3(nu->bezt[a].vec[1], nu->bezt[a].vec[1], cent); - sub_v3_v3v3(nu->bezt[a].vec[2], nu->bezt[a].vec[2], cent); + sub_v3_v3(nu->bezt[a].vec[0], cent); + sub_v3_v3(nu->bezt[a].vec[1], cent); + sub_v3_v3(nu->bezt[a].vec[2], cent); } } else { a= nu->pntsu*nu->pntsv; while (a--) - sub_v3_v3v3(nu->bp[a].vec, nu->bp[a].vec, cent); + sub_v3_v3(nu->bp[a].vec, cent); } nu= nu->next; } diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 1b20042b25e..ea118602c6c 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -36,14 +36,13 @@ #include "DNA_cloth_types.h" #include "DNA_curve_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_object_force.h" #include "DNA_scene_types.h" #include "DNA_particle_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" #include "BLI_cellalloc.h" @@ -69,9 +68,7 @@ #include "WM_types.h" #include "ED_mesh.h" -#include "ED_view3d.h" -#include "UI_interface.h" #include "UI_resources.h" #include "object_intern.h" @@ -98,7 +95,7 @@ bDeformGroup *ED_vgroup_add_name(Object *ob, char *name) defgroup = MEM_callocN(sizeof(bDeformGroup), "add deformGroup"); - BLI_strncpy(defgroup->name, name, 32); + BLI_strncpy(defgroup->name, name, sizeof(defgroup->name)); BLI_addtail(&ob->defbase, defgroup); defgroup_unique_name(defgroup, ob); @@ -127,6 +124,78 @@ void ED_vgroup_data_create(ID *id) } } +int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot) +{ + if(id) { + switch(GS(id->name)) { + case ID_ME: + { + Mesh *me = (Mesh *)id; + + if(me->edit_btmesh) { + BMEditMesh *em = me->edit_btmesh; + BMIter iter; + BMVert *eve; + int i; + + if (!CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) { + *dvert_tot = 0; + *dvert_arr = NULL; + return 0; + } + + i = em->bm->totvert; + + *dvert_arr= MEM_mallocN(sizeof(void*)*i, "vgroup parray from me"); + *dvert_tot = i; + + i = 0; + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + (*dvert_arr)[i] = CustomData_em_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); + i++; + } + + return 1; + } + else if(me->dvert) { + int i; + + *dvert_tot= me->totvert; + *dvert_arr= MEM_mallocN(sizeof(void*)*me->totvert, "vgroup parray from me"); + + for (i=0; itotvert; i++) { + (*dvert_arr)[i] = me->dvert + i; + } + + return 1; + } + else + return 0; + } + case ID_LT: + { + int i=0; + + Lattice *lt= (Lattice *)id; + lt= (lt->editlatt)? lt->editlatt: lt; + + *dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw; + *dvert_arr= MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me"); + + for (i=0; i<*dvert_tot; i++) { + (*dvert_arr)[i] = lt->dvert + i; + } + + return 1; + } + } + } + + *dvert_arr= NULL; + *dvert_tot= 0; + return 0; +} + /* returns true if the id type supports weights */ int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot) { @@ -158,20 +227,22 @@ int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot) /* matching index only */ int ED_vgroup_copy_array(Object *ob, Object *ob_from) { - MDeformVert *dvert_array_from, *dvf; - MDeformVert *dvert_array, *dv; - + MDeformVert **dvert_array_from, **dvf; + MDeformVert **dvert_array, **dv; int dvert_tot_from; int dvert_tot; int i; int totdef_from= BLI_countlist(&ob_from->defbase); int totdef= BLI_countlist(&ob->defbase); - ED_vgroup_give_array(ob_from->data, &dvert_array_from, &dvert_tot_from); - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob_from->data, &dvert_array_from, &dvert_tot_from); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); - if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || dvert_array_from==NULL || dvert_array==NULL) + if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || dvert_array_from==NULL || dvert_array==NULL) { + if (dvert_array) MEM_freeN(dvert_array); + if (dvert_array_from) MEM_freeN(dvert_array_from); return 0; + } /* do the copy */ BLI_freelistN(&ob->defbase); @@ -192,15 +263,18 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from) dv= dvert_array; for(i=0; idw) - MEM_freeN(dv->dw); + if((*dv)->dw) + MEM_freeN((*dv)->dw); - *dv= *dvf; + *(*dv)= *(*dvf); - if(dv->dw) - dv->dw= MEM_dupallocN(dv->dw); + if((*dv)->dw) + (*dv)->dw= MEM_dupallocN((*dv)->dw); } + MEM_freeN(dvert_array); + MEM_freeN(dvert_array_from); + return 1; } @@ -289,7 +363,11 @@ void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, in if(dv==NULL) return; - dv+= vertnum; + /* check that vertnum is valid before trying to get the relevant dvert */ + if ((vertnum < 0) || (vertnum >= tot)) + return; + else + dv += vertnum; /* Lets first check to see if this vert is * already in the weight group -- if so @@ -536,7 +614,7 @@ static void vgroup_duplicate(Object *ob) bDeformGroup *dg, *cdg; char name[32], s[32]; MDeformWeight *org, *cpy; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, idg, icdg, dvert_tot=0; dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -569,13 +647,13 @@ static void vgroup_duplicate(Object *ob) ob->actdef = BLI_countlist(&ob->defbase); icdg = (ob->actdef-1); - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); if(!dvert_array) return; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; org = defvert_find_index(dvert, idg); if(org) { float weight = org->weight; @@ -584,16 +662,18 @@ static void vgroup_duplicate(Object *ob) cpy->weight = weight; } } + + MEM_freeN(dvert_array); } static void vgroup_normalize(Object *ob) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -603,7 +683,7 @@ static void vgroup_normalize(Object *ob) def_nr= ob->actdef-1; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw = defvert_find_index(dvert, def_nr); if(dw) { weight_max = MAX2(dw->weight, weight_max); @@ -612,7 +692,7 @@ static void vgroup_normalize(Object *ob) if(weight_max > 0.0f) { for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw = defvert_find_index(dvert, def_nr); if(dw) { dw->weight /= weight_max; @@ -623,16 +703,18 @@ static void vgroup_normalize(Object *ob) } } } + + if (dvert_array) MEM_freeN(dvert_array); } static void vgroup_levels(Object *ob, float offset, float gain) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -640,7 +722,7 @@ static void vgroup_levels(Object *ob, float offset, float gain) def_nr= ob->actdef-1; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw = defvert_find_index(dvert, def_nr); if(dw) { dw->weight = gain * (dw->weight + offset); @@ -649,17 +731,19 @@ static void vgroup_levels(Object *ob, float offset, float gain) } } } + + if (dvert_array) MEM_freeN(dvert_array); } /* TODO - select between groups */ static void vgroup_normalize_all(Object *ob, int lock_active) { MDeformWeight *dw, *dw_act; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, dvert_tot=0; float tot_weight; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); if(dvert_array) { if(lock_active) { @@ -671,7 +755,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active) tot_weight= 0.0f; dw_act= NULL; - dvert = dvert_array+i; + dvert = dvert_array[i]; j= dvert->totweight; while(j--) { @@ -709,7 +793,7 @@ static void vgroup_normalize_all(Object *ob, int lock_active) for(i = 0; i < dvert_tot; i++) { int j; tot_weight= 0.0f; - dvert = dvert_array+i; + dvert = dvert_array[i]; j= dvert->totweight; while(j--) { @@ -730,6 +814,8 @@ static void vgroup_normalize_all(Object *ob, int lock_active) } } } + + if (dvert_array) MEM_freeN(dvert_array); } @@ -737,10 +823,10 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -749,7 +835,7 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; if(auto_assign) { dw= defvert_verify_index(dvert, def_nr); @@ -767,6 +853,8 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) } } } + + if (dvert_array) MEM_freeN(dvert_array); } static void vgroup_blend(Object *ob) @@ -858,10 +946,10 @@ static void vgroup_clean(Object *ob, float eul, int keep_single) { bDeformGroup *dg; MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, def_nr, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); /* only the active group */ dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); @@ -869,7 +957,7 @@ static void vgroup_clean(Object *ob, float eul, int keep_single) def_nr= ob->actdef-1; for(i = 0; i < dvert_tot; i++) { - dvert = dvert_array+i; + dvert = dvert_array[i]; dw= defvert_find_index(dvert, def_nr); @@ -880,21 +968,23 @@ static void vgroup_clean(Object *ob, float eul, int keep_single) } } } + + if (dvert_array) MEM_freeN(dvert_array); } static void vgroup_clean_all(Object *ob, float eul, int keep_single) { MDeformWeight *dw; - MDeformVert *dvert, *dvert_array=NULL; + MDeformVert *dvert, **dvert_array=NULL; int i, dvert_tot=0; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot); if(dvert_array) { for(i = 0; i < dvert_tot; i++) { int j; - dvert = dvert_array+i; + dvert = dvert_array[i]; j= dvert->totweight; while(j--) { @@ -910,6 +1000,8 @@ static void vgroup_clean_all(Object *ob, float eul, int keep_single) } } } + + if (dvert_array) MEM_freeN(dvert_array); } void ED_vgroup_mirror(Object *ob, int mirror_weights, int flip_vgroups) @@ -1287,7 +1379,7 @@ static void vgroup_assign_verts(Object *ob, float weight) done=1; break; } - } + } /* If not: Add the group and set its weight */ if(!done){ newdw = BLI_cellalloc_calloc(sizeof(MDeformWeight)*(dvert->totweight+1), "deformWeight"); @@ -1459,7 +1551,11 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_edit_object(C); - vgroup_remove_verts(ob, 0); + if(RNA_boolean_get(op->ptr, "all")) + vgroup_remove_verts(ob, 0); + else + vgroup_active_remove_verts(ob, 0); + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data); @@ -1917,41 +2013,38 @@ void OBJECT_OT_vertex_group_set_active(wmOperatorType *ot) ot->prop= prop; } -static int vgroup_sort(void *def_a_ptr, void *def_b_ptr) +/*creates the name_array parameter for vgroup_do_remap, call this before fiddling + with the order of vgroups then call vgroup_do_remap after*/ +static char *vgroup_init_remap(Object *ob) { - bDeformGroup *def_a= (bDeformGroup *)def_a_ptr; - bDeformGroup *def_b= (bDeformGroup *)def_b_ptr; - - return strcmp(def_a->name, def_b->name); -} - -#define DEF_GROUP_SIZE (sizeof(((bDeformGroup *)NULL)->name)) -static int vertex_group_sort_exec(bContext *C, wmOperator *op) -{ - Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; bDeformGroup *def; int def_tot = BLI_countlist(&ob->defbase); + char *name_array= MEM_mallocN(MAX_VGROUP_NAME * sizeof(char) * def_tot, "sort vgroups"); char *name; - char *name_array= MEM_mallocN(DEF_GROUP_SIZE * sizeof(char) * def_tot, "sort vgroups"); - int *sort_map_update= MEM_mallocN(DEF_GROUP_SIZE * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/ - int *sort_map= sort_map_update + 1; - int i; - - MDeformVert *dvert= NULL; - int dvert_tot; name= name_array; - for(def = ob->defbase.first; def; def=def->next){ - BLI_strncpy(name, def->name, DEF_GROUP_SIZE); - name += DEF_GROUP_SIZE; + for(def = ob->defbase.first; def; def=def->next) { + BLI_strncpy(name, def->name, MAX_VGROUP_NAME); + name += MAX_VGROUP_NAME; } - BLI_sortlist(&ob->defbase, vgroup_sort); + return name_array; +} + +static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op) +{ + MDeformVert *dvert= NULL; + bDeformGroup *def; + int def_tot = BLI_countlist(&ob->defbase); + int *sort_map_update= MEM_mallocN(MAX_VGROUP_NAME * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/ + int *sort_map= sort_map_update + 1; + char *name; + int i; name= name_array; for(def= ob->defbase.first, i=0; def; def=def->next, i++){ sort_map[i]= BLI_findstringindex(&ob->defbase, name, offsetof(bDeformGroup, name)); - name += DEF_GROUP_SIZE; + name += MAX_VGROUP_NAME; } if(ob->mode == OB_MODE_EDIT) { @@ -1973,7 +2066,11 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op) } } else { + int dvert_tot=0; + ED_vgroup_give_array(ob->data, &dvert, &dvert_tot); + + /*create as necassary*/ while(dvert && dvert_tot--) { if(dvert->totweight) defvert_remap(dvert, sort_map); @@ -1986,21 +2083,45 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op) sort_map[i]++; sort_map_update[0]= 0; - vgroup_remap_update_users(ob, sort_map_update); ob->actdef= sort_map_update[ob->actdef]; - MEM_freeN(name_array); - MEM_freeN(sort_map_update); - - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); - return OPERATOR_FINISHED; } -#undef DEF_GROUP_SIZE +static int vgroup_sort(void *def_a_ptr, void *def_b_ptr) +{ + bDeformGroup *def_a= (bDeformGroup *)def_a_ptr; + bDeformGroup *def_b= (bDeformGroup *)def_b_ptr; + + return strcmp(def_a->name, def_b->name); +} + +static int vertex_group_sort_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + char *name_array; + int ret; + + /*init remapping*/ + name_array = vgroup_init_remap(ob); + + /*sort vgroup names*/ + BLI_sortlist(&ob->defbase, vgroup_sort); + + /*remap vgroup data to map to correct names*/ + ret = vgroup_do_remap(ob, name_array, op); + + if (ret != OPERATOR_CANCELLED) { + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); + } + + if (name_array) MEM_freeN(name_array); + + return ret; +} void OBJECT_OT_vertex_group_sort(wmOperatorType *ot) { @@ -2015,3 +2136,63 @@ void OBJECT_OT_vertex_group_sort(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + +static int vgroup_move_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + bDeformGroup *def; + char *name_array; + int dir= RNA_enum_get(op->ptr, "direction"), ret; + + def = BLI_findlink(&ob->defbase, ob->actdef - 1); + if (!def) { + return OPERATOR_CANCELLED; + } + + name_array = vgroup_init_remap(ob); + + if (dir == 1) { /*up*/ + void *prev = def->prev; + + BLI_remlink(&ob->defbase, def); + BLI_insertlinkbefore(&ob->defbase, prev, def); + } else { /*down*/ + void *next = def->next; + + BLI_remlink(&ob->defbase, def); + BLI_insertlinkafter(&ob->defbase, next, def); + } + + ret = vgroup_do_remap(ob, name_array, op); + + if (name_array) MEM_freeN(name_array); + + if (ret != OPERATOR_CANCELLED) { + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); + } + + return ret; +} + +void OBJECT_OT_vertex_group_move(wmOperatorType *ot) +{ + static EnumPropertyItem vgroup_slot_move[] = { + {1, "UP", 0, "Up", ""}, + {-1, "DOWN", 0, "Down", ""}, + {0, NULL, 0, NULL, NULL} + }; + + /* identifiers */ + ot->name= "Move Vertex Group"; + ot->idname= "OBJECT_OT_vertex_group_move"; + + /* api callbacks */ + ot->poll= vertex_group_poll; + ot->exec= vgroup_move_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "direction", vgroup_slot_move, 0, "Direction", "Direction to move, UP or DOWN"); +} diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt new file mode 100644 index 00000000000..ebe3f913508 --- /dev/null +++ b/source/blender/editors/physics/CMakeLists.txt @@ -0,0 +1,47 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/elbeem/extern + ../../../../intern/guardedalloc +) + +IF(NOT WITH_ELBEEM) + ADD_DEFINITIONS(-DDISABLE_ELBEEM) +ENDIF(NOT WITH_ELBEEM) + +IF(WITH_OPENMP) + ADD_DEFINITIONS(-DPARALLEL=1) +ENDIF(WITH_OPENMP) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_physics "${SRC}" "${INC}") diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c index e738aa34d07..37de0d8f873 100644 --- a/source/blender/editors/physics/particle_boids.c +++ b/source/blender/editors/physics/particle_boids.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,9 +29,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_boid_types.h" #include "DNA_particle_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_boids.h" diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 71c18b35365..da0034ac2f9 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -36,15 +36,9 @@ #include "DNA_scene_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_force.h" -#include "DNA_object_types.h" -#include "DNA_vec_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_DerivedMesh.h" #include "BKE_depsgraph.h" @@ -66,7 +60,6 @@ #include "BLI_kdtree.h" #include "BLI_rand.h" -#include "PIL_time.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -75,7 +68,6 @@ #include "ED_particle.h" #include "ED_view3d.h" -#include "UI_interface.h" #include "UI_resources.h" #include "WM_api.h" @@ -132,7 +124,7 @@ int PE_hair_poll(bContext *C) return (edit && edit->psys); } -int PE_poll_3dview(bContext *C) +int PE_poll_view3d(bContext *C) { return PE_poll(C) && CTX_wm_area(C)->spacetype == SPACE_VIEW3D && CTX_wm_region(C)->regiontype == RGN_TYPE_WINDOW; @@ -168,7 +160,7 @@ void PE_free_ptcache_edit(PTCacheEdit *edit) edit->emitter_field= 0; } - psys_free_path_cache(NULL, edit); + psys_free_path_cache(edit->psys, edit); MEM_freeN(edit); } @@ -211,7 +203,7 @@ static PTCacheEdit *pe_get_current(Scene *scene, Object *ob, int create) pset->scene = scene; pset->object = ob; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); /* in the case of only one editable thing, set pset->edittype accordingly */ if(pidlist.first && pidlist.first == pidlist.last) { @@ -831,9 +823,12 @@ static void PE_apply_mirror(Object *ob, ParticleSystem *psys) edit= psys->edit; psmd= psys_get_modifier(ob, psys); - if(!edit->mirror_cache || !psmd->dm) + if(!psmd->dm) return; + if(!edit->mirror_cache) + PE_update_mirror_cache(ob, psys); + /* we delay settings the PARS_EDIT_RECALC for mirrored particles * to avoid doing mirror twice */ LOOP_POINTS { @@ -902,13 +897,13 @@ static void pe_deflect_emitter(Scene *scene, Object *ob, PTCacheEdit *edit) if(dotco,key->co,dvec); + add_v3_v3(key->co, dvec); } } else { normalize_v3(dvec); mul_v3_fl(dvec,dist_1st-dot); - add_v3_v3v3(key->co,key->co,dvec); + add_v3_v3(key->co, dvec); } if(k==1) dist_1st*=1.3333f; @@ -994,7 +989,7 @@ static void pe_iterate_lengths(Scene *scene, PTCacheEdit *edit) } if(k) { - add_v3_v3v3((key-1)->co,(key-1)->co,dv1); + add_v3_v3((key-1)->co, dv1); } VECADD(dv1,dv0,dv2); @@ -1326,7 +1321,7 @@ static int select_all_exec(bContext *C, wmOperator *op) } PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, ob); return OPERATOR_FINISHED; } @@ -1376,7 +1371,7 @@ int PE_mouse_particles(bContext *C, short *mval, int extend) for_mouse_hit_keys(&data, toggle_key_select, 1); /* nearest only */ PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } @@ -1385,11 +1380,14 @@ int PE_mouse_particles(bContext *C, short *mval, int extend) static void select_root(PEData *data, int point_index) { + if (data->edit->points[point_index].flag & PEP_HIDE) + return; + data->edit->points[point_index].keys->flag |= PEK_SELECT; data->edit->points[point_index].flag |= PEP_EDIT_RECALC; /* redraw selection only */ } -static int select_first_exec(bContext *C, wmOperator *op) +static int select_roots_exec(bContext *C, wmOperator *op) { PEData data; @@ -1397,19 +1395,19 @@ static int select_first_exec(bContext *C, wmOperator *op) foreach_point(&data, select_root); PE_update_selection(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } -void PARTICLE_OT_select_first(wmOperatorType *ot) +void PARTICLE_OT_select_roots(wmOperatorType *ot) { /* identifiers */ - ot->name= "Select First"; - ot->idname= "PARTICLE_OT_select_first"; + ot->name= "Select Roots"; + ot->idname= "PARTICLE_OT_select_roots"; /* api callbacks */ - ot->exec= select_first_exec; + ot->exec= select_roots_exec; ot->poll= PE_poll; /* flags */ @@ -1421,11 +1419,15 @@ void PARTICLE_OT_select_first(wmOperatorType *ot) static void select_tip(PEData *data, int point_index) { PTCacheEditPoint *point = data->edit->points + point_index; + + if (point->flag & PEP_HIDE) + return; + point->keys[point->totkey - 1].flag |= PEK_SELECT; point->flag |= PEP_EDIT_RECALC; /* redraw selection only */ } -static int select_last_exec(bContext *C, wmOperator *op) +static int select_tips_exec(bContext *C, wmOperator *op) { PEData data; @@ -1433,19 +1435,19 @@ static int select_last_exec(bContext *C, wmOperator *op) foreach_point(&data, select_tip); PE_update_selection(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } -void PARTICLE_OT_select_last(wmOperatorType *ot) +void PARTICLE_OT_select_tips(wmOperatorType *ot) { /* identifiers */ - ot->name= "Select Last"; - ot->idname= "PARTICLE_OT_select_last"; + ot->name= "Select Tips"; + ot->idname= "PARTICLE_OT_select_tips"; /* api callbacks */ - ot->exec= select_last_exec; + ot->exec= select_tips_exec; ot->poll= PE_poll; /* flags */ @@ -1473,7 +1475,7 @@ static int select_linked_exec(bContext *C, wmOperator *op) for_mouse_hit_keys(&data, select_keys, 1); /* nearest only */ PE_update_selection(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } @@ -1499,7 +1501,7 @@ void PARTICLE_OT_select_linked(wmOperatorType *ot) /* api callbacks */ ot->exec= select_linked_exec; ot->invoke= select_linked_invoke; - ot->poll= PE_poll_3dview; + ot->poll= PE_poll_view3d; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1539,7 +1541,7 @@ int PE_border_select(bContext *C, rcti *rect, int select, int extend) for_mouse_hit_keys(&data, select_key, 0); PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, ob); return OPERATOR_FINISHED; } @@ -1564,7 +1566,7 @@ int PE_circle_select(bContext *C, int selecting, short *mval, float rad) for_mouse_hit_keys(&data, select_key, 0); PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, ob); return OPERATOR_FINISHED; } @@ -1630,7 +1632,7 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select) } PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, ob); return OPERATOR_FINISHED; } @@ -1664,7 +1666,7 @@ static int hide_exec(bContext *C, wmOperator *op) } PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, ob); return OPERATOR_FINISHED; } @@ -1706,7 +1708,7 @@ static int reveal_exec(bContext *C, wmOperator *op) } PE_update_selection(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, ob); return OPERATOR_FINISHED; } @@ -1764,7 +1766,7 @@ static int select_less_exec(bContext *C, wmOperator *op) foreach_point(&data, select_less_keys); PE_update_selection(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } @@ -1825,7 +1827,7 @@ static int select_more_exec(bContext *C, wmOperator *op) foreach_point(&data, select_more_keys); PE_update_selection(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } @@ -1862,7 +1864,7 @@ static int select_inverse_exec(bContext *C, wmOperator *op) } PE_update_selection(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob); return OPERATOR_FINISHED; } @@ -1953,7 +1955,7 @@ static int rekey_exec(bContext *C, wmOperator *op) recalc_lengths(data.edit); PE_update_object(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, data.ob); return OPERATOR_FINISHED; } @@ -2258,7 +2260,7 @@ static int subdivide_exec(bContext *C, wmOperator *op) recalc_lengths(data.edit); PE_update_object(data.scene, data.ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, data.ob); return OPERATOR_FINISHED; } @@ -2346,7 +2348,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op) BKE_reportf(op->reports, RPT_INFO, "Remove %d double particles.", totremoved); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); return OPERATOR_FINISHED; } @@ -2381,21 +2383,22 @@ static int weight_set_exec(bContext *C, wmOperator *op) HairKey *hkey; float weight; ParticleBrushData *brush= &pset->brush[pset->brushtype]; - edit= psys->edit; + float factor= RNA_float_get(op->ptr, "factor"); - weight= (float)(brush->strength / 100.0f); + weight= brush->strength; + edit= psys->edit; LOOP_SELECTED_POINTS { ParticleData *pa= psys->particles + p; LOOP_SELECTED_KEYS { hkey= pa->hair + k; - hkey->weight= weight; + hkey->weight= interpf(weight, hkey->weight, factor); } } DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); return OPERATOR_FINISHED; } @@ -2412,6 +2415,8 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_float(ot->srna, "factor", 1, 0, 1, "Factor", "", 0, 1); } /************************ cursor drawing *******************************/ @@ -2451,7 +2456,7 @@ static void toggle_particle_cursor(bContext *C, int enable) pset->paintcursor = NULL; } else if(enable) - pset->paintcursor= WM_paint_cursor_activate(CTX_wm_manager(C), PE_poll_3dview, brush_drawcursor, NULL); + pset->paintcursor= WM_paint_cursor_activate(CTX_wm_manager(C), PE_poll_view3d, brush_drawcursor, NULL); } /********************* radial control operator *********************/ @@ -2507,6 +2512,8 @@ static int brush_radial_control_exec(bContext *C, wmOperator *op) else if(mode == WM_RADIALCONTROL_STRENGTH) brush->strength= new_value; + WM_event_add_notifier(C, NC_WINDOW, NULL); + return OPERATOR_FINISHED; } @@ -2568,7 +2575,7 @@ static int delete_exec(bContext *C, wmOperator *op) } DAG_id_flush_update(&data.ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, data.ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, data.ob); return OPERATOR_FINISHED; } @@ -2727,7 +2734,7 @@ static int mirror_exec(bContext *C, wmOperator *op) PE_mirror_x(scene, ob, 0); update_world_cos(ob, edit); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); return OPERATOR_FINISHED; @@ -2941,7 +2948,7 @@ static void brush_puff(PEData *data, int point_index) VECCOPY(co, key->co); mul_m4_v3(mat, co); length += len_v3v3(lastco, co); - if((key->flag & PEK_SELECT) && !(key->flag & PEK_HIDE)) { + if((data->select==0 || (key->flag & PEK_SELECT)) && !(key->flag & PEK_HIDE)) { VECADDFAC(kco, rootco, nor, length); /* blend between the current and straight position */ @@ -3356,7 +3363,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.mval= mval; data.rad= (float)brush->size; - data.combfac= (float)(brush->strength - 50) / 50.0f; + data.combfac= (brush->strength - 0.5f) * 2.0f; if(data.combfac < 0.0f) data.combfac= 1.0f - 9.0f * data.combfac; else @@ -3378,7 +3385,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) PE_set_view3d_data(C, &data); data.mval= mval; data.rad= (float)brush->size; - data.cutfac= (float)(brush->strength / 100.0f); + data.cutfac= brush->strength; if(selected) foreach_selected_point(&data, brush_cut); @@ -3402,7 +3409,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.mval= mval; data.rad= (float)brush->size; - data.growfac= (float)brush->strength / 5000.0f; + data.growfac= brush->strength / 50.0f; if(brush->invert ^ flip) data.growfac= 1.0f - data.growfac; @@ -3424,8 +3431,9 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.dm= psmd->dm; data.mval= mval; data.rad= (float)brush->size; + data.select= selected; - data.pufffac= (float)(brush->strength - 50) / 50.0f; + data.pufffac= (brush->strength - 0.5f) * 2.0f; if(data.pufffac < 0.0f) data.pufffac= 1.0f - 9.0f * data.pufffac; else @@ -3446,7 +3454,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) PE_set_view3d_data(C, &data); data.mval= mval; - added= brush_add(&data, brush->strength); + added= brush_add(&data, brush->count); if(pset->flag & PE_KEEP_LENGTHS) recalc_lengths(edit); @@ -3466,7 +3474,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.vec[0]= data.vec[1]= data.vec[2]= 0.0f; data.tot= 0; - data.smoothfac= (float)(brush->strength / 100.0f); + data.smoothfac= brush->strength; invert_m4_m4(ob->imat, ob->obmat); @@ -3489,7 +3497,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) data.mval= mval; data.rad= (float)brush->size; - data.weightfac = (float)(brush->strength / 100.0f); /* note that this will never be zero */ + data.weightfac = brush->strength; /* note that this will never be zero */ foreach_mouse_hit_key(&data, brush_weight, selected); } @@ -3511,7 +3519,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) else PE_update_object(scene, ob, 1); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); bedit->lastmouse[0]= mouse[0]; bedit->lastmouse[1]= mouse[1]; @@ -3608,7 +3616,7 @@ void PARTICLE_OT_brush_edit(wmOperatorType *ot) ot->invoke= brush_edit_invoke; ot->modal= brush_edit_modal; ot->cancel= brush_edit_cancel; - ot->poll= PE_poll_3dview; + ot->poll= PE_poll_view3d; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; @@ -3665,6 +3673,8 @@ static void make_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo) for(; pm; pm=pm->next) { for(i=0; idata[i] = MEM_dupallocN(pm->data[i]); + + pm->index_array = MEM_dupallocN(pm->index_array); } } @@ -3739,6 +3749,8 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo) for(i=0; idata[i] = MEM_dupallocN(pm->data[i]); + pm->index_array = MEM_dupallocN(pm->index_array); + BKE_ptcache_mem_init_pointers(pm); LOOP_POINTS { @@ -4003,12 +4015,20 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache, LOOP_POINTS { if(psys) { - pa = psys->particles + p; - if((pm->next && pm->next->frame < pa->time) - || (pm->prev && pm->prev->frame >= pa->dietime)) { - BKE_ptcache_mem_incr_pointers(pm); + if(pm->index_array) { + if(pm->index_array[p]) + BKE_ptcache_mem_seek_pointers(p, pm); + else continue; - } + } + else { + pa = psys->particles + p; + if((pm->next && pm->next->frame < pa->time) + || (pm->prev && pm->prev->frame >= pa->dietime)) { + BKE_ptcache_mem_incr_pointers(pm); + continue; + } + } } if(!point->totkey) { @@ -4118,7 +4138,7 @@ static int clear_edited_exec(bContext *C, wmOperator *op) psys->flag &= ~PSYS_EDITED; psys_reset(psys, PSYS_RESET_DEPSGRAPH); - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); } } diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index f590339b91d..bb30d30fd0e 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,10 +32,7 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_particle_types.h" #include "DNA_scene_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_listbase.h" @@ -72,7 +69,9 @@ static int particle_system_add_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; object_add_particle_system(scene, ob, NULL); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } @@ -110,7 +109,8 @@ static int particle_system_remove_exec(bContext *C, wmOperator *op) if(scene->basact && scene->basact->object==ob) WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } @@ -169,7 +169,7 @@ static int new_particle_settings_exec(bContext *C, wmOperator *op) DAG_scene_sort(scene); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); return OPERATOR_FINISHED; } @@ -217,7 +217,7 @@ static int new_particle_target_exec(bContext *C, wmOperator *op) DAG_scene_sort(scene); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); return OPERATOR_FINISHED; } @@ -265,7 +265,7 @@ static int remove_particle_target_exec(bContext *C, wmOperator *op) DAG_scene_sort(scene); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); return OPERATOR_FINISHED; } @@ -303,7 +303,7 @@ static int target_move_up_exec(bContext *C, wmOperator *op) BLI_insertlink(&psys->targets, pt->prev->prev, pt); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); break; } } @@ -341,7 +341,7 @@ static int target_move_down_exec(bContext *C, wmOperator *op) BLI_insertlink(&psys->targets, pt->next, pt); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); break; } } @@ -379,7 +379,7 @@ static int dupliob_move_up_exec(bContext *C, wmOperator *op) BLI_remlink(&part->dupliweights, dw); BLI_insertlink(&part->dupliweights, dw->prev->prev, dw); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, NULL); break; } } @@ -418,7 +418,7 @@ static int copy_particle_dupliob_exec(bContext *C, wmOperator *op) dw->flag |= PART_DUPLIW_CURRENT; BLI_addhead(&part->dupliweights, dw); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, NULL); break; } } @@ -464,7 +464,7 @@ static int remove_particle_dupliob_exec(bContext *C, wmOperator *op) if(dw) dw->flag |= PART_DUPLIW_CURRENT; - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, NULL); return OPERATOR_FINISHED; } @@ -501,7 +501,7 @@ static int dupliob_move_down_exec(bContext *C, wmOperator *op) BLI_remlink(&part->dupliweights, dw); BLI_insertlink(&part->dupliweights, dw->next, dw); - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, NULL); break; } } @@ -526,6 +526,7 @@ void PARTICLE_OT_dupliob_move_down(wmOperatorType *ot) static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys) { ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys); + ParticleEditSettings *pset= PE_settings(scene); ParticleData *pa; PTCacheEdit *edit; PTCacheEditPoint *point; @@ -565,6 +566,9 @@ static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys) psys->flag |= PSYS_GLOBAL_HAIR; + if(ELEM(pset->brushtype, PE_BRUSH_ADD, PE_BRUSH_PUFF)) + pset->brushtype = PE_BRUSH_NONE; + PE_update_object(scene, ob, 0); } @@ -589,7 +593,7 @@ static int disconnect_hair_exec(bContext *C, wmOperator *op) disconnect_hair(scene, ob, psys); } - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); return OPERATOR_FINISHED; } @@ -728,7 +732,7 @@ static int connect_hair_exec(bContext *C, wmOperator *op) connect_hair(scene, ob, psys); } - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index 65701f89c4e..23f604d8c12 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -45,25 +45,17 @@ #include "MEM_guardedalloc.h" /* types */ -#include "DNA_curve_types.h" +#include "DNA_anim_types.h" +#include "DNA_action_types.h" #include "DNA_object_types.h" #include "DNA_object_fluidsim.h" -#include "DNA_key_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_lattice_types.h" -#include "DNA_scene_types.h" -#include "DNA_camera_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_ipo_types.h" -#include "DNA_key_types.h" #include "BLI_blenlib.h" #include "BLI_threads.h" #include "BLI_math.h" +#include "BKE_animsys.h" +#include "BKE_armature.h" #include "BKE_blender.h" #include "BKE_context.h" #include "BKE_customdata.h" @@ -80,17 +72,15 @@ #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_softbody.h" +#include "BKE_unit.h" -#include "PIL_time.h" #include "LBM_fluidsim.h" #include "BIF_gl.h" -#include "ED_fluidsim.h" #include "ED_screen.h" -#include "WM_api.h" #include "WM_types.h" #include "physics_intern.h" // own include @@ -98,85 +88,110 @@ /* enable/disable overall compilation */ #ifndef DISABLE_ELBEEM -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) -/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */ -#include -extern pthread_key_t gomp_tls_key; -static void *thread_tls_data; -#endif +#include "WM_api.h" + +#include "DNA_scene_types.h" +#include "DNA_ipo_types.h" +#include "DNA_mesh_types.h" + +#include "PIL_time.h" -/* XXX */ -/* from header info.c */ -static int start_progress_bar(void) {return 0;}; -static void end_progress_bar(wmWindow *win) {WM_cursor_restore(win);}; -static void waitcursor(int val) {}; -static int progress_bar(wmWindow *win, float done, char *busy_info) { WM_timecursor(win,done*100); return 0;} -static int pupmenu() {return 0;} -/* XXX */ +static float get_fluid_viscosity(FluidsimSettings *settings) +{ + switch (settings->viscosityMode) { + case 0: /* unused */ + return -1.0; + case 2: /* water */ + return 1.0e-6; + case 3: /* some (thick) oil */ + return 5.0e-5; + case 4: /* ca. honey */ + return 2.0e-3; + case 1: /* manual */ + default: + return (1.0/pow(10.0, settings->viscosityExponent)) * settings->viscosityValue; + } +} +static void get_fluid_gravity(float *gravity, Scene *scene, FluidsimSettings *fss) +{ + if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) { + copy_v3_v3(gravity, scene->physics_settings.gravity); + } else { + copy_v3_v3(gravity, &fss->gravx); + } +} -double fluidsimViscosityPreset[6] = { - -1.0, /* unused */ - -1.0, /* manual */ - 1.0e-6, /* water */ - 5.0e-5, /* some (thick) oil */ - 2.0e-3, /* ca. honey */ - -1.0 /* end */ -}; +static float get_fluid_size_m(Scene *scene, Object *domainob, FluidsimSettings *fss) +{ + if (!scene->unit.system) { + return fss->realsize; + } else { + float dim[3]; + float longest_axis; + + object_get_dimensions(domainob, dim); + longest_axis = MAX3(dim[0], dim[1], dim[2]); + + return longest_axis * scene->unit.scale_length; + } +} -char* fluidsimViscosityPresetString[6] = { - "UNUSED", /* unused */ - "UNUSED", /* manual */ - " = 1.0 * 10^-6", /* water */ - " = 5.0 * 10^-5", /* some (thick) oil */ - " = 2.0 * 10^-3", /* ca. honey */ - "INVALID" /* end */ -}; +static int fluid_is_animated_mesh(FluidsimSettings *fss) +{ + return ((fss->type == OB_FLUIDSIM_CONTROL) || fss->domainNovecgen); +} /* ********************** fluid sim settings struct functions ********************** */ +#if 0 /* helper function */ void fluidsimGetGeometryObjFilename(Object *ob, char *dst) { //, char *srcname) { //snprintf(dst,FILE_MAXFILE, "%s_cfgdata_%s.bobj.gz", srcname, ob->id.name); snprintf(dst,FILE_MAXFILE, "fluidcfgdata_%s.bobj.gz", ob->id.name); } +#endif - - -/* ******************************************************************************** */ /* ********************** fluid sim channel helper functions ********************** */ -/* ******************************************************************************** */ + +typedef struct FluidAnimChannels { + int length; + + double aniFrameTime; + + float *timeAtFrame; + float *DomainTime; + float *DomainGravity; + float *DomainViscosity; +} FluidAnimChannels; + +typedef struct FluidObject { + struct FluidObject *next, *prev; + + struct Object *object; + + float *Translation; + float *Rotation; + float *Scale; + float *Active; + + float *InitialVelocity; + + float *AttractforceStrength; + float *AttractforceRadius; + float *VelocityforceStrength; + float *VelocityforceRadius; + + float *VertexCache; + int numVerts, numTris; +} FluidObject; // no. of entries for the two channel sizes #define CHANNEL_FLOAT 1 #define CHANNEL_VEC 3 -#define FS_FREE_ONECHANNEL(c,str) { \ - if(c){ MEM_freeN(c); c=NULL; } \ -} // end ONE CHANN, debug: fprintf(stderr,"freeing " str " \n"); - -#define FS_FREE_CHANNELS { \ - FS_FREE_ONECHANNEL(timeAtIndex,"timeAtIndex");\ - FS_FREE_ONECHANNEL(timeAtFrame,"timeAtFrame");\ - FS_FREE_ONECHANNEL(channelDomainTime,"channelDomainTime"); \ - FS_FREE_ONECHANNEL(channelDomainGravity,"channelDomainGravity");\ - FS_FREE_ONECHANNEL(channelDomainViscosity,"channelDomainViscosity");\ - for(i=0;i<256;i++) { \ - FS_FREE_ONECHANNEL(channelObjMove[i][0],"channelObjMove0"); \ - FS_FREE_ONECHANNEL(channelObjMove[i][1],"channelObjMove1"); \ - FS_FREE_ONECHANNEL(channelObjMove[i][2],"channelObjMove2"); \ - FS_FREE_ONECHANNEL(channelObjInivel[i],"channelObjInivel"); \ - FS_FREE_ONECHANNEL(channelObjActive[i],"channelObjActive"); \ - FS_FREE_ONECHANNEL(channelAttractforceStrength[i],"channelAttractforceStrength"); \ - FS_FREE_ONECHANNEL(channelAttractforceRadius[i],"channelAttractforceRadius"); \ - FS_FREE_ONECHANNEL(channelVelocityforceStrength[i],"channelVelocityforceStrength"); \ - FS_FREE_ONECHANNEL(channelVelocityforceRadius[i],"channelVelocityforceRadius"); \ - } \ -} // end FS FREE CHANNELS - - // simplify channels before printing // for API this is done anyway upon init #if 0 @@ -207,341 +222,653 @@ static void fluidsimPrintChannel(FILE *file, float *channel, int paramsize, char } #endif -static void fluidsimInitChannel(Scene *scene, float **setchannel, int size, float *time, - int *icuIds, float *defaults, Ipo* ipo, int entries) + +/* Note: fluid anim channel data layout + * ------------------------------------ + * CHANNEL_FLOAT: + * frame 1 |frame 2 + * [dataF][time][dataF][time] + * + * CHANNEL_VEC: + * frame 1 |frame 2 + * [dataX][dataY][dataZ][time][dataX][dataY][dataZ][time] + * + */ + +static void init_time(FluidsimSettings *domainSettings, FluidAnimChannels *channels) { - - int i, j; - char *cstr = NULL; - float *channel = NULL; + int i; - cstr = "fluidsiminit_channelfloat"; - if(entries>1) cstr = "fluidsiminit_channelvec"; - channel = MEM_callocN( size* (entries+1)* sizeof(float), cstr ); + channels->timeAtFrame = MEM_callocN( (channels->length+1)*sizeof(float), "timeAtFrame channel"); - /* defaults for now */ - for(j=0; jtimeAtFrame[0] = channels->timeAtFrame[1] = domainSettings->animStart; // start at index 1 - for(i=1; i<=size; i++) { - channel[(i-1)*(entries+1) + entries] = time[i]; + for(i=2; i<=channels->length; i++) { + channels->timeAtFrame[i] = channels->timeAtFrame[i-1] + channels->aniFrameTime; } - - *setchannel = channel; - -#if 0 - /* goes away completely */ - int i,j; - IpoCurve* icus[3]; - char *cstr = NULL; - float *channel = NULL; - float aniFrlen = scene->r.framelen; - int current_frame = scene->r.cfra; - if((entries<1) || (entries>3)) { - printf("fluidsimInitChannel::Error - invalid no. of entries: %d\n",entries); - entries = 1; - } - - cstr = "fluidsiminit_channelfloat"; - if(entries>1) cstr = "fluidsiminit_channelvec"; - channel = MEM_callocN( size* (entries+1)* sizeof(float), cstr ); - - if(ipo) { - for(j=0; jr.cfra = floor(aniFrlen*((float)i)); - - // XXX calc_icu(icus[j], aniFrlen*((float)i) ); - channel[(i-1)*(entries+1) + j] = icus[j]->curval; - } - } else { - for(i=1; i<=size; i++) { channel[(i-1)*(entries+1) + j] = defaults[j]; } - } - //printf("fluidsimInitChannel entry:%d , ",j); for(i=1; i<=size; i++) { printf(" val%d:%f ",i, channel[(i-1)*(entries+1) + j] ); } printf(" \n"); // DEBUG - } - // set time values - for(i=1; i<=size; i++) { - channel[(i-1)*(entries+1) + entries] = time[i]; - } - scene->r.cfra = current_frame; - *setchannel = channel; -#endif } -static void fluidsimInitMeshChannel(bContext *C, float **setchannel, int size, Object *obm, int vertices, - float *time, int modifierIndex) +/* if this is slow, can replace with faster, less readable code */ +static void set_channel(float *channel, float time, float *value, int i, int size) { - Scene *scene= CTX_data_scene(C); - float *channel = NULL; - int mallsize = size* (3*vertices+1); - int frame,i; - int numVerts=0, numTris=0; - int setsize = 3*vertices+1; + if (size == CHANNEL_FLOAT) { + channel[(i * 2) + 0] = value[0]; + channel[(i * 2) + 1] = time; + } + else if (size == CHANNEL_VEC) { + channel[(i * 4) + 0] = value[0]; + channel[(i * 4) + 1] = value[1]; + channel[(i * 4) + 2] = value[2]; + channel[(i * 4) + 3] = time; + } +} - channel = MEM_callocN( mallsize* sizeof(float), "fluidsim_meshchannel" ); +static void set_vertex_channel(float *channel, float time, struct Scene *scene, struct FluidObject *fobj, int i) +{ + Object *ob = fobj->object; + FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim); + float *verts; + int *tris=NULL, numVerts=0, numTris=0; + int modifierIndex = modifiers_indexInObject(ob, (ModifierData *)fluidmd); + int framesize = (3*fobj->numVerts) + 1; + int j; + + if (channel == NULL) + return; + + initElbeemMesh(scene, ob, &numVerts, &verts, &numTris, &tris, 1, modifierIndex); + + /* don't allow mesh to change number of verts in anim sequence */ + if (numVerts != fobj->numVerts) { + MEM_freeN(channel); + channel = NULL; + return; + } + + /* fill frame of channel with vertex locations */ + for(j=0; j < (3*numVerts); j++) { + channel[i*framesize + j] = verts[j]; + } + channel[i*framesize + framesize-1] = time; + + MEM_freeN(verts); + MEM_freeN(tris); +} - //fprintf(stderr,"\n\nfluidsimInitMeshChannel size%d verts%d mallsize%d \n\n\n",size,vertices,mallsize); - for(frame=1; frame<=size; frame++) { +static void free_domain_channels(FluidAnimChannels *channels) +{ + if (!channels->timeAtFrame) + return; + MEM_freeN(channels->timeAtFrame); + channels->timeAtFrame = NULL; + MEM_freeN(channels->DomainGravity); + channels->DomainGravity = NULL; + MEM_freeN(channels->DomainViscosity); + channels->DomainViscosity = NULL; +} + +static void free_all_fluidobject_channels(ListBase *fobjects) +{ + FluidObject *fobj; + + for (fobj=fobjects->first; fobj; fobj=fobj->next) { + if (fobj->Translation) { + MEM_freeN(fobj->Translation); + fobj->Translation = NULL; + MEM_freeN(fobj->Rotation); + fobj->Rotation = NULL; + MEM_freeN(fobj->Scale); + fobj->Scale = NULL; + MEM_freeN(fobj->Active); + fobj->Active = NULL; + MEM_freeN(fobj->InitialVelocity); + fobj->InitialVelocity = NULL; + } + + if (fobj->AttractforceStrength) { + MEM_freeN(fobj->AttractforceStrength); + fobj->AttractforceStrength = NULL; + MEM_freeN(fobj->AttractforceRadius); + fobj->AttractforceRadius = NULL; + MEM_freeN(fobj->VelocityforceStrength); + fobj->VelocityforceStrength = NULL; + MEM_freeN(fobj->VelocityforceRadius); + fobj->VelocityforceRadius = NULL; + } + + if (fobj->VertexCache) { + MEM_freeN(fobj->VertexCache); + fobj->VertexCache = NULL; + } + } +} + +static void fluid_init_all_channels(bContext *C, Object *fsDomain, FluidsimSettings *domainSettings, FluidAnimChannels *channels, ListBase *fobjects) +{ + Scene *scene = CTX_data_scene(C); + Base *base; + int i; + int length = channels->length; + float eval_time; + + /* XXX: first init time channel - temporary for now */ + /* init time values (should be done after evaluating animated time curve) */ + init_time(domainSettings, channels); + + /* allocate domain animation channels */ + channels->DomainGravity = MEM_callocN( length * (CHANNEL_VEC+1) * sizeof(float), "channel DomainGravity"); + channels->DomainViscosity = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "channel DomainViscosity"); + //channels->DomainTime = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "channel DomainTime"); + + /* allocate fluid objects */ + for (base=scene->base.first; base; base= base->next) { + Object *ob = base->object; + FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim); + + if (fluidmd) { + FluidObject *fobj = MEM_callocN(sizeof(FluidObject), "Fluid Object"); + fobj->object = ob; + + if (ELEM(fluidmd->fss->type, OB_FLUIDSIM_DOMAIN, OB_FLUIDSIM_PARTICLE)) { + BLI_addtail(fobjects, fobj); + continue; + } + + fobj->Translation = MEM_callocN( length * (CHANNEL_VEC+1) * sizeof(float), "fluidobject Translation"); + fobj->Rotation = MEM_callocN( length * (CHANNEL_VEC+1) * sizeof(float), "fluidobject Rotation"); + fobj->Scale = MEM_callocN( length * (CHANNEL_VEC+1) * sizeof(float), "fluidobject Scale"); + fobj->Active = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "fluidobject Active"); + fobj->InitialVelocity = MEM_callocN( length * (CHANNEL_VEC+1) * sizeof(float), "fluidobject InitialVelocity"); + + if (fluidmd->fss->type == OB_FLUIDSIM_CONTROL) { + fobj->AttractforceStrength = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "fluidobject AttractforceStrength"); + fobj->AttractforceRadius = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "fluidobject AttractforceRadius"); + fobj->VelocityforceStrength = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "fluidobject VelocityforceStrength"); + fobj->VelocityforceRadius = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "fluidobject VelocityforceRadius"); + } + + if (fluid_is_animated_mesh(fluidmd->fss)) { + float *verts=NULL; + int *tris=NULL, modifierIndex = modifiers_indexInObject(ob, (ModifierData *)fluidmd); + + initElbeemMesh(scene, ob, &fobj->numVerts, &verts, &fobj->numTris, &tris, 0, modifierIndex); + fobj->VertexCache = MEM_callocN( length *((fobj->numVerts*CHANNEL_VEC)+1) * sizeof(float), "fluidobject VertexCache"); + + MEM_freeN(verts); + MEM_freeN(tris); + } + + BLI_addtail(fobjects, fobj); + } + } + + /* now we loop over the frames and fill the allocated channels with data */ + for (i=0; ilength; i++) { + FluidObject *fobj; + float viscosity, gravity[3]; + float timeAtFrame; + + eval_time = domainSettings->bakeStart + i; + timeAtFrame = channels->timeAtFrame[i+1]; + + /* XXX: This can't be used due to an anim sys optimisation that ignores recalc object animation, + * leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ ) + * --> BKE_animsys_evaluate_all_animation(G.main, eval_time); + * This doesn't work with drivers: + * --> BKE_animsys_evaluate_animdata(&fsDomain->id, fsDomain->adt, eval_time, ADT_RECALC_ALL); + */ + + /* Modifying the global scene isn't nice, but we can do it in + * this part of the process before a threaded job is created */ + scene->r.cfra = (int)eval_time; + ED_update_for_newframe(C, 1); + + /* now scene data should be current according to animation system, so we fill the channels */ + + /* Domain properties - gravity/viscosity/time */ + get_fluid_gravity(gravity, scene, domainSettings); + set_channel(channels->DomainGravity, timeAtFrame, gravity, i, CHANNEL_VEC); + viscosity = get_fluid_viscosity(domainSettings); + set_channel(channels->DomainViscosity, timeAtFrame, &viscosity, i, CHANNEL_FLOAT); + // XXX : set_channel(channels->DomainTime, timeAtFrame, &time, i, CHANNEL_VEC); + + /* object movement */ + for (fobj=fobjects->first; fobj; fobj=fobj->next) { + Object *ob = fobj->object; + FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim); + float active= (float)(fluidmd->fss->flag & OB_FLUIDSIM_ACTIVE); + float rot_d[3], rot_360[3] = {360.f, 360.f, 360.f}; + + if (ELEM(fluidmd->fss->type, OB_FLUIDSIM_DOMAIN, OB_FLUIDSIM_PARTICLE)) + continue; + + /* init euler rotation values and convert to elbeem format */ + BKE_rotMode_change_values(ob->quat, ob->rot, ob->rotAxis, &ob->rotAngle, ob->rotmode, ROT_MODE_EUL); + mul_v3_v3fl(rot_d, ob->rot, 180.f/M_PI); + sub_v3_v3v3(rot_d, rot_360, rot_d); + + set_channel(fobj->Translation, timeAtFrame, ob->loc, i, CHANNEL_VEC); + set_channel(fobj->Rotation, timeAtFrame, rot_d, i, CHANNEL_VEC); + set_channel(fobj->Scale, timeAtFrame, ob->size, i, CHANNEL_VEC); + set_channel(fobj->Active, timeAtFrame, &active, i, CHANNEL_FLOAT); + set_channel(fobj->InitialVelocity, timeAtFrame, &fluidmd->fss->iniVelx, i, CHANNEL_VEC); + + if (fluidmd->fss->type == OB_FLUIDSIM_CONTROL) { + set_channel(fobj->AttractforceStrength, timeAtFrame, &fluidmd->fss->attractforceStrength, i, CHANNEL_FLOAT); + set_channel(fobj->AttractforceRadius, timeAtFrame, &fluidmd->fss->attractforceRadius, i, CHANNEL_FLOAT); + set_channel(fobj->VelocityforceStrength, timeAtFrame, &fluidmd->fss->velocityforceStrength, i, CHANNEL_FLOAT); + set_channel(fobj->VelocityforceRadius, timeAtFrame, &fluidmd->fss->velocityforceRadius, i, CHANNEL_FLOAT); + } + + if (fluid_is_animated_mesh(fluidmd->fss)) { + set_vertex_channel(fobj->VertexCache, timeAtFrame, scene, fobj, i); + } + } + } +} + +static void export_fluid_objects(ListBase *fobjects, Scene *scene, int length) +{ + FluidObject *fobj; + + for (fobj=fobjects->first; fobj; fobj=fobj->next) { + Object *ob = fobj->object; + FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim); + int modifierIndex = modifiers_indexInObject(ob, (ModifierData *)fluidmd); + float *verts=NULL; int *tris=NULL; - scene->r.cfra = frame; - ED_update_for_newframe(C, 1); - - initElbeemMesh(scene, obm, &numVerts, &verts, &numTris, &tris, 1, modifierIndex); - //fprintf(stderr,"\nfluidsimInitMeshChannel frame%d verts%d/%d \n\n",frame,vertices,numVerts); - for(i=0; i<3*vertices;i++) { - channel[(frame-1)*setsize + i] = verts[i]; - //fprintf(stdout," frame%d vert%d=%f \n",frame,i,verts[i]); - //if(i%3==2) fprintf(stdout,"\n"); + int numVerts=0, numTris=0; + int deform = fluid_is_animated_mesh(fluidmd->fss); + + elbeemMesh fsmesh; + + if (ELEM(fluidmd->fss->type, OB_FLUIDSIM_DOMAIN, OB_FLUIDSIM_PARTICLE)) + continue; + + elbeemResetMesh( &fsmesh ); + + fsmesh.type = fluidmd->fss->type; + fsmesh.name = ob->id.name; + + initElbeemMesh(scene, ob, &numVerts, &verts, &numTris, &tris, 0, modifierIndex); + + fsmesh.numVertices = numVerts; + fsmesh.numTriangles = numTris; + fsmesh.vertices = verts; + fsmesh.triangles = tris; + + fsmesh.channelSizeTranslation = + fsmesh.channelSizeRotation = + fsmesh.channelSizeScale = + fsmesh.channelSizeInitialVel = + fsmesh.channelSizeActive = length; + + fsmesh.channelTranslation = fobj->Translation; + fsmesh.channelRotation = fobj->Rotation; + fsmesh.channelScale = fobj->Scale; + fsmesh.channelActive = fobj->Active; + + if( ELEM(fsmesh.type, OB_FLUIDSIM_FLUID, OB_FLUIDSIM_INFLOW)) { + fsmesh.channelInitialVel = fobj->InitialVelocity; + fsmesh.localInivelCoords = ((fluidmd->fss->typeFlags & OB_FSINFLOW_LOCALCOORD)?1:0); + } + + if(fluidmd->fss->typeFlags & OB_FSBND_NOSLIP) + fsmesh.obstacleType = FLUIDSIM_OBSTACLE_NOSLIP; + else if(fluidmd->fss->typeFlags & OB_FSBND_PARTSLIP) + fsmesh.obstacleType = FLUIDSIM_OBSTACLE_PARTSLIP; + else if(fluidmd->fss->typeFlags & OB_FSBND_FREESLIP) + fsmesh.obstacleType = FLUIDSIM_OBSTACLE_FREESLIP; + + fsmesh.obstaclePartslip = fluidmd->fss->partSlipValue; + fsmesh.volumeInitType = fluidmd->fss->volumeInitType; + fsmesh.obstacleImpactFactor = fluidmd->fss->surfaceSmoothing; // misused value + + if (fsmesh.type == OB_FLUIDSIM_CONTROL) { + fsmesh.cpsTimeStart = fluidmd->fss->cpsTimeStart; + fsmesh.cpsTimeEnd = fluidmd->fss->cpsTimeEnd; + fsmesh.cpsQuality = fluidmd->fss->cpsQuality; + fsmesh.obstacleType = (fluidmd->fss->flag & OB_FLUIDSIM_REVERSE); + + fsmesh.channelSizeAttractforceRadius = + fsmesh.channelSizeVelocityforceStrength = + fsmesh.channelSizeVelocityforceRadius = + fsmesh.channelSizeAttractforceStrength = length; + + fsmesh.channelAttractforceStrength = fobj->AttractforceStrength; + fsmesh.channelAttractforceRadius = fobj->AttractforceRadius; + fsmesh.channelVelocityforceStrength = fobj->VelocityforceStrength; + fsmesh.channelVelocityforceRadius = fobj->VelocityforceRadius; } - channel[(frame-1)*setsize + setsize-1] = time[frame]; - - MEM_freeN(verts); - MEM_freeN(tris); + else { + fsmesh.channelAttractforceStrength = + fsmesh.channelAttractforceRadius = + fsmesh.channelVelocityforceStrength = + fsmesh.channelVelocityforceRadius = NULL; + } + + /* animated meshes */ + if(deform) { + fsmesh.channelSizeVertices = length; + fsmesh.channelVertices = fobj->VertexCache; + + // remove channels + fsmesh.channelTranslation = + fsmesh.channelRotation = + fsmesh.channelScale = NULL; + } + + elbeemAddMesh(&fsmesh); + + if(verts) MEM_freeN(verts); + if(tris) MEM_freeN(tris); + if(fsmesh.channelVertices) MEM_freeN(fsmesh.channelVertices); } - *setchannel = channel; } +static int fluid_validate_scene(ReportList *reports, Scene *scene, Object *fsDomain) +{ + Base *base; + Object *newdomain = NULL; + int channelObjCount = 0; + int fluidInputCount = 0; -/* ******************************************************************************** */ -/* ********************** simulation thread ************************* */ -/* ******************************************************************************** */ + for(base=scene->base.first; base; base= base->next) + { + Object *ob = base->object; + FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim); -static volatile int globalBakeState = 0; // 0 everything ok, -1 abort simulation, -2 sim error, 1 sim done -static volatile int globalBakeFrame = 0; -static volatile int g_break= 0; + /* only find objects with fluid modifiers */ + if (!fluidmdtmp || ob->type != OB_MESH) continue; + + if(fluidmdtmp->fss->type == OB_FLUIDSIM_DOMAIN) { + /* if no initial domain object given, find another potential domain */ + if (!fsDomain) { + newdomain = ob; + } + /* if there's more than one domain, cancel */ + else if (fsDomain && ob != fsDomain) { + BKE_report(reports, RPT_ERROR, "There should be only one domain object."); + return 0; + } + } + + /* count number of objects needed for animation channels */ + if ( !ELEM(fluidmdtmp->fss->type, OB_FLUIDSIM_DOMAIN, OB_FLUIDSIM_PARTICLE) ) + channelObjCount++; + + /* count number of fluid input objects */ + if (ELEM(fluidmdtmp->fss->type, OB_FLUIDSIM_FLUID, OB_FLUIDSIM_INFLOW)) + fluidInputCount++; + } -// run simulation in seperate thread -static void *fluidsimSimulateThread(void *unused) { // *ptr) { - //char* fnameCfgPath = (char*)(ptr); - int ret=0; + if (newdomain) + fsDomain = newdomain; -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - pthread_setspecific (gomp_tls_key, thread_tls_data); -#endif - - ret = elbeemSimulate(); - BLI_lock_thread(LOCK_CUSTOM1); - if(globalBakeState==0) { - if(ret==0) { - // if no error, set to normal exit - globalBakeState = 1; - } else { - // simulation failed, display error - globalBakeState = -2; - } + if (!fsDomain) { + BKE_report(reports, RPT_ERROR, "No domain object found."); + return 0; } - BLI_unlock_thread(LOCK_CUSTOM1); - return NULL; + + if (channelObjCount>=255) { + BKE_report(reports, RPT_ERROR, "Cannot bake with more then 256 objects."); + return 0; + } + + if (fluidInputCount == 0) { + BKE_report(reports, RPT_ERROR, "No fluid input objects in the scene."); + return 0; + } + + return 1; } +#define FLUID_SUFFIX_CONFIG "fluidsim.cfg" +#define FLUID_SUFFIX_SURFACE "fluidsurface" + +static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetFile, char *debugStrBuffer) +{ + FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(fsDomain, eModifierType_Fluidsim); + FluidsimSettings *domainSettings= fluidmd->fss; + FILE *fileCfg; + int dirExist = 0; + char newSurfdataPath[FILE_MAXDIR+FILE_MAXFILE]; // modified output settings + char *suffixConfig = FLUID_SUFFIX_CONFIG; + int outStringsChanged = 0; + + // prepare names... + strncpy(targetDir, domainSettings->surfdataPath, FILE_MAXDIR); + strncpy(newSurfdataPath, domainSettings->surfdataPath, FILE_MAXDIR); + BLI_path_abs(targetDir, G.sce); // fixed #frame-no + + strcpy(targetFile, targetDir); + strcat(targetFile, suffixConfig); + strcat(targetFile,".tmp"); // dont overwrite/delete original file + // make sure all directories exist + // as the bobjs use the same dir, this only needs to be checked + // for the cfg output + BLI_make_existing_file(targetFile); + + // check selected directory + // simply try to open cfg file for writing to test validity of settings + fileCfg = fopen(targetFile, "w"); + if(fileCfg) { + dirExist = 1; fclose(fileCfg); + // remove cfg dummy from directory test + BLI_delete(targetFile, 0,0); + } + + if((strlen(targetDir)<1) || (!dirExist)) { + char blendDir[FILE_MAXDIR+FILE_MAXFILE]; + char blendFile[FILE_MAXDIR+FILE_MAXFILE]; + + // invalid dir, reset to current/previous + strcpy(blendDir, G.sce); + BLI_splitdirstring(blendDir, blendFile); + if(strlen(blendFile)>6){ + int len = strlen(blendFile); + if( (blendFile[len-6]=='.')&& (blendFile[len-5]=='b')&& (blendFile[len-4]=='l')&& + (blendFile[len-3]=='e')&& (blendFile[len-2]=='n')&& (blendFile[len-1]=='d') ){ + blendFile[len-6] = '\0'; + } + } + // todo... strip .blend ? + snprintf(newSurfdataPath,FILE_MAXFILE+FILE_MAXDIR,"//fluidsimdata/%s_%s_", blendFile, fsDomain->id.name); + + snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output dir to '%s'\n", newSurfdataPath); + elbeemDebugOut(debugStrBuffer); + outStringsChanged=1; + } + + // check if modified output dir is ok +#if 0 + if(outStringsChanged) { + char dispmsg[FILE_MAXDIR+FILE_MAXFILE+256]; + int selection=0; + strcpy(dispmsg,"Output settings set to: '"); + strcat(dispmsg, newSurfdataPath); + strcat(dispmsg, "'%t|Continue with changed settings%x1|Discard and abort%x0"); + + // ask user if thats what he/she wants... + selection = pupmenu(dispmsg); + if(selection<1) return 0; // 0 from menu, or -1 aborted + strcpy(targetDir, newSurfdataPath); + strncpy(domainSettings->surfdataPath, newSurfdataPath, FILE_MAXDIR); + BLI_path_abs(targetDir, G.sce); // fixed #frame-no + } +#endif + return outStringsChanged; +} + +/* ******************************************************************************** */ +/* ********************** write fluidsim config to file ************************* */ +/* ******************************************************************************** */ + +typedef struct FluidBakeJob { + /* from wmJob */ + void *owner; + short *stop, *do_update; + float *progress; + int current_frame; + elbeemSimulationSettings *settings; +} FluidBakeJob; + +static void fluidbake_free(void *customdata) +{ + FluidBakeJob *fb= customdata; + MEM_freeN(fb); +} + +/* called by fluidbake, only to check job 'stop' value */ +static int fluidbake_breakjob(void *customdata) +{ + //FluidBakeJob *fb= (FluidBakeJob *)customdata; + //return *(fb->stop); + + /* this is not nice yet, need to make the jobs list template better + * for identifying/acting upon various different jobs */ + /* but for now we'll reuse the render break... */ + return (G.afbreek); +} + +/* called by fluidbake, wmJob sends notifier */ +static void fluidbake_updatejob(void *customdata, float progress) +{ + FluidBakeJob *fb= customdata; + + *(fb->do_update)= 1; + *(fb->progress)= progress; +} + +static void fluidbake_startjob(void *customdata, short *stop, short *do_update, float *progress) +{ + FluidBakeJob *fb= customdata; + + fb->stop= stop; + fb->do_update = do_update; + fb->progress = progress; + + G.afbreek= 0; /* XXX shared with render - replace with job 'stop' switch */ + + elbeemSimulate(); + *do_update= 1; + *stop = 0; +} + +static void fluidbake_endjob(void *customdata) +{ + FluidBakeJob *fb= customdata; + + if (fb->settings) { + MEM_freeN(fb->settings); + fb->settings = NULL; + } +} + int runSimulationCallback(void *data, int status, int frame) { - //elbeemSimulationSettings *settings = (elbeemSimulationSettings*)data; - //printf("elbeem blender cb s%d, f%d, domainid:%d \n", status,frame, settings->domainId ); // DEBUG - int state = 0; - if(status==FLUIDSIM_CBSTATUS_NEWFRAME) { - BLI_lock_thread(LOCK_CUSTOM1); - globalBakeFrame = frame-1; - BLI_unlock_thread(LOCK_CUSTOM1); + FluidBakeJob *fb = (FluidBakeJob *)data; + elbeemSimulationSettings *settings = fb->settings; + + if (status == FLUIDSIM_CBSTATUS_NEWFRAME) { + fluidbake_updatejob(fb, frame / (float)settings->noOfFrames); + //printf("elbeem blender cb s%d, f%d, domainid:%d noOfFrames: %d \n", status,frame, settings->domainId, settings->noOfFrames ); // DEBUG } - //if((frameCounter==3) && (!frameStop)) { frameStop=1; return 1; } - - BLI_lock_thread(LOCK_CUSTOM1); - state = globalBakeState; - BLI_unlock_thread(LOCK_CUSTOM1); - - if(state!=0) { + if (fluidbake_breakjob(fb)) { return FLUIDSIM_CBRET_ABORT; } return FLUIDSIM_CBRET_CONTINUE; } +static void fluidbake_free_data(FluidAnimChannels *channels, ListBase *fobjects, elbeemSimulationSettings *fsset, FluidBakeJob *fb) +{ + free_domain_channels(channels); + MEM_freeN(channels); + channels = NULL; -/* ******************************************************************************** */ -/* ********************** write fluidsim config to file ************************* */ -/* ******************************************************************************** */ + free_all_fluidobject_channels(fobjects); + BLI_freelistN(fobjects); + MEM_freeN(fobjects); + fobjects = NULL; + + if (fsset) { + MEM_freeN(fsset); + fsset = NULL; + } + + if (fb) { + MEM_freeN(fb); + fb = NULL; + } +} -int fluidsimBake(bContext *C, ReportList *reports, Object *ob) +int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain) { Scene *scene= CTX_data_scene(C); - FILE *fileCfg; int i; - Object *fsDomain = NULL; FluidsimSettings *domainSettings; - Object *obit = NULL; /* object iterator */ - Base *base; - int origFrame = scene->r.cfra; - char debugStrBuffer[256]; - int dirExist = 0; - int gridlevels = 0; - int simAborted = 0; // was the simulation aborted by user? - int doExportOnly = 0; - char *exportEnvStr = "BLENDER_ELBEEMEXPORTONLY"; - const char *strEnvName = "BLENDER_ELBEEMDEBUG"; // from blendercall.cpp - //char *channelNames[3] = { "translation","rotation","scale" }; - char *suffixConfig = "fluidsim.cfg"; - char *suffixSurface = "fluidsurface"; - char newSurfdataPath[FILE_MAXDIR+FILE_MAXFILE]; // modified output settings + char debugStrBuffer[256]; + + int gridlevels = 0; + const char *strEnvName = "BLENDER_ELBEEMDEBUG"; // from blendercall.cpp + char *suffixConfig = FLUID_SUFFIX_CONFIG; + char *suffixSurface = FLUID_SUFFIX_SURFACE; + char targetDir[FILE_MAXDIR+FILE_MAXFILE]; // store & modify output settings char targetFile[FILE_MAXDIR+FILE_MAXFILE]; // temp. store filename from targetDir for access int outStringsChanged = 0; // modified? copy back before baking - int haveSomeFluid = 0; // check if any fluid objects are set - // config vars, inited before either export or run... - double calcViscosity = 0.0; - int noFrames; - double aniFrameTime; - float aniFrlen; - int channelObjCount; - float *bbStart = NULL; - float *bbSize = NULL; float domainMat[4][4]; float invDomMat[4][4]; - // channel data - int allchannelSize; // fixed by no. of frames - int startFrame = 1; // dont use scene->r.sfra here, always start with frame 1 - // easy frame -> sim time calc - float *timeAtFrame=NULL, *timeAtIndex=NULL; - // domain - float *channelDomainTime = NULL; - float *channelDomainViscosity = NULL; - float *channelDomainGravity = NULL; - // objects (currently max. 256 objs) - float *channelObjMove[256][3]; // object movments , 0=trans, 1=rot, 2=scale - float *channelObjInivel[256]; // initial velocities - float *channelObjActive[256]; // obj active channel + + int noFrames; + int origFrame = scene->r.cfra; - /* fluid control channels */ - float *channelAttractforceStrength[256]; - float *channelAttractforceRadius[256]; - float *channelVelocityforceStrength[256]; - float *channelVelocityforceRadius[256]; + FluidAnimChannels *channels = MEM_callocN(sizeof(FluidAnimChannels), "fluid domain animation channels"); + ListBase *fobjects = MEM_callocN(sizeof(ListBase), "fluid objects"); FluidsimModifierData *fluidmd = NULL; Mesh *mesh = NULL; + wmJob *steve; + FluidBakeJob *fb; + elbeemSimulationSettings *fsset= MEM_callocN(sizeof(elbeemSimulationSettings), "Fluid sim settings"); + + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Fluid Simulation", WM_JOB_PROGRESS); + fb= MEM_callocN(sizeof(FluidBakeJob), "fluid bake job"); + if(getenv(strEnvName)) { int dlevel = atoi(getenv(strEnvName)); elbeemSetDebugLevel(dlevel); snprintf(debugStrBuffer,256,"fluidsimBake::msg: Debug messages activated due to envvar '%s'\n",strEnvName); elbeemDebugOut(debugStrBuffer); } - if(getenv(exportEnvStr)) { - doExportOnly = atoi(getenv(exportEnvStr)); - snprintf(debugStrBuffer,256,"fluidsimBake::msg: Exporting mode set to '%d' due to envvar '%s'\n",doExportOnly, exportEnvStr); - elbeemDebugOut(debugStrBuffer); - } - - // make sure it corresponds to startFrame setting - // old: noFrames = scene->r.efra - scene->r.sfra +1; + + /* make sure it corresponds to startFrame setting (old: noFrames = scene->r.efra - scene->r.sfra +1) */; noFrames = scene->r.efra - 0; if(noFrames<=0) { BKE_report(reports, RPT_ERROR, "No frames to export - check your animation range settings."); + fluidbake_free_data(channels, fobjects, fsset, fb); return 0; } - - /* no object pointer, find in selected ones.. */ - if(!ob) { - for(base=scene->base.first; base; base= base->next) { - if ((base)->flag & SELECT) - { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(base->object, eModifierType_Fluidsim); - - if(fluidmdtmp && (base->object->type==OB_MESH)) - { - if(fluidmdtmp->fss->type == OB_FLUIDSIM_DOMAIN) - { - ob = base->object; - break; - } - } - } - } - // no domains found? - if(!ob) return 0; - } - channelObjCount = 0; - for(base=scene->base.first; base; base= base->next) - { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(base->object, eModifierType_Fluidsim); - obit = base->object; - if( fluidmdtmp && - (obit->type==OB_MESH) && - (fluidmdtmp->fss->type != OB_FLUIDSIM_DOMAIN) && // if has to match 3 places! // CHECKMATCH - (fluidmdtmp->fss->type != OB_FLUIDSIM_PARTICLE) ) - { - channelObjCount++; - } - } - - if (channelObjCount>=255) { - BKE_report(reports, RPT_ERROR, "Cannot bake with more then 256 objects."); - return 0; - } - - /* check if there's another domain... */ - for(base=scene->base.first; base; base= base->next) - { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(base->object, eModifierType_Fluidsim); - obit = base->object; - if( fluidmdtmp &&(obit->type==OB_MESH)) - { - if(fluidmdtmp->fss->type == OB_FLUIDSIM_DOMAIN) - { - if(obit != ob) - { - BKE_report(reports, RPT_ERROR, "There should be only one domain object."); - return 0; - } - } - } - } - - // check if theres any fluid - // abort baking if not... - for(base=scene->base.first; base; base= base->next) - { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(base->object, eModifierType_Fluidsim); - obit = base->object; - if( fluidmdtmp && - (obit->type==OB_MESH) && - ((fluidmdtmp->fss->type == OB_FLUIDSIM_FLUID) || - (fluidmdtmp->fss->type == OB_FLUIDSIM_INFLOW) )) - { - haveSomeFluid = 1; - break; - } - } - if(!haveSomeFluid) { - BKE_report(reports, RPT_ERROR, "No fluid objects in scene."); + /* check scene for sane object/modifier settings */ + if (!fluid_validate_scene(reports, scene, fsDomain)) { + fluidbake_free_data(channels, fobjects, fsset, fb); return 0; } /* these both have to be valid, otherwise we wouldnt be here */ - /* dont use ob here after...*/ - fsDomain = ob; - fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim); + fluidmd = (FluidsimModifierData *)modifiers_findByType(fsDomain, eModifierType_Fluidsim); domainSettings = fluidmd->fss; - ob = NULL; mesh = fsDomain->data; + domainSettings->bakeStart = 1; + domainSettings->bakeEnd = scene->r.efra; + // calculate bounding box fluid_get_bb(mesh->mvert, mesh->totvert, fsDomain->obmat, domainSettings->bbStart, domainSettings->bbSize); @@ -572,107 +899,26 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *ob) } snprintf(debugStrBuffer,256,"fluidsimBake::msg: Baking %s, refine: %d\n", fsDomain->id.name , gridlevels ); elbeemDebugOut(debugStrBuffer); - - // prepare names... - strncpy(targetDir, domainSettings->surfdataPath, FILE_MAXDIR); - strncpy(newSurfdataPath, domainSettings->surfdataPath, FILE_MAXDIR); - BLI_convertstringcode(targetDir, G.sce); // fixed #frame-no - - strcpy(targetFile, targetDir); - strcat(targetFile, suffixConfig); - if(!doExportOnly) { strcat(targetFile,".tmp"); } // dont overwrite/delete original file - // make sure all directories exist - // as the bobjs use the same dir, this only needs to be checked - // for the cfg output - BLI_make_existing_file(targetFile); - - // check selected directory - // simply try to open cfg file for writing to test validity of settings - fileCfg = fopen(targetFile, "w"); - if(fileCfg) { - dirExist = 1; fclose(fileCfg); - // remove cfg dummy from directory test - if(!doExportOnly) { BLI_delete(targetFile, 0,0); } - } - - if((strlen(targetDir)<1) || (!dirExist)) { - char blendDir[FILE_MAXDIR+FILE_MAXFILE], blendFile[FILE_MAXDIR+FILE_MAXFILE]; - // invalid dir, reset to current/previous - strcpy(blendDir, G.sce); - BLI_splitdirstring(blendDir, blendFile); - if(strlen(blendFile)>6){ - int len = strlen(blendFile); - if( (blendFile[len-6]=='.')&& (blendFile[len-5]=='b')&& (blendFile[len-4]=='l')&& - (blendFile[len-3]=='e')&& (blendFile[len-2]=='n')&& (blendFile[len-1]=='d') ){ - blendFile[len-6] = '\0'; - } - } - // todo... strip .blend ? - snprintf(newSurfdataPath,FILE_MAXFILE+FILE_MAXDIR,"//fluidsimdata/%s_%s_", blendFile, fsDomain->id.name); - - snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output dir to '%s'\n", newSurfdataPath); - elbeemDebugOut(debugStrBuffer); - outStringsChanged=1; - } - - // check if modified output dir is ok - if(outStringsChanged) { - char dispmsg[FILE_MAXDIR+FILE_MAXFILE+256]; - int selection=0; - strcpy(dispmsg,"Output settings set to: '"); - strcat(dispmsg, newSurfdataPath); - strcat(dispmsg, "'%t|Continue with changed settings%x1|Discard and abort%x0"); - - // ask user if thats what he/she wants... - selection = pupmenu(dispmsg); - if(selection<1) return 0; // 0 from menu, or -1 aborted - strcpy(targetDir, newSurfdataPath); - strncpy(domainSettings->surfdataPath, newSurfdataPath, FILE_MAXDIR); - BLI_convertstringcode(targetDir, G.sce); // fixed #frame-no - } - // -------------------------------------------------------------------------------------------- - // dump data for start frame - // CHECK more reasonable to number frames according to blender? - // dump data for frame 0 - scene->r.cfra = startFrame; + + + /* ******** prepare output file paths ******** */ + outStringsChanged = fluid_init_filepaths(fsDomain, targetDir, targetFile, debugStrBuffer); + channels->length = scene->r.efra; + channels->aniFrameTime = (domainSettings->animEnd - domainSettings->animStart)/(double)noFrames; + + /* ******** initialise and allocate animation channels ******** */ + fluid_init_all_channels(C, fsDomain, domainSettings, channels, fobjects); + + /* reset to original current frame */ + scene->r.cfra = origFrame; ED_update_for_newframe(C, 1); - // init common export vars for both file export and run - for(i=0; i<256; i++) { - channelObjMove[i][0] = channelObjMove[i][1] = channelObjMove[i][2] = NULL; - channelObjInivel[i] = NULL; - channelObjActive[i] = NULL; - channelAttractforceStrength[i] = NULL; - channelAttractforceRadius[i] = NULL; - channelVelocityforceStrength[i] = NULL; - channelVelocityforceRadius[i] = NULL; - } - allchannelSize = scene->r.efra; // always use till last frame - aniFrameTime = (domainSettings->animEnd - domainSettings->animStart)/(double)noFrames; - // blender specific - scale according to map old/new settings in anim panel: - aniFrlen = scene->r.framelen; - if(domainSettings->viscosityMode==1) { - /* manual mode, visc=value/(10^-vexp) */ - calcViscosity = (1.0/pow(10.0,domainSettings->viscosityExponent)) * domainSettings->viscosityValue; - } else { - calcViscosity = fluidsimViscosityPreset[ domainSettings->viscosityMode ]; - } - - bbStart = domainSettings->bbStart; - bbSize = domainSettings->bbSize; - - // always init + + /* ---- XXX: No Time animation curve for now, leaving this code here for reference + { int timeIcu[1] = { FLUIDSIM_TIME }; float timeDef[1] = { 1. }; - int gravIcu[3] = { FLUIDSIM_GRAV_X, FLUIDSIM_GRAV_Y, FLUIDSIM_GRAV_Z }; - float gravDef[3]; - int viscIcu[1] = { FLUIDSIM_VISC }; - float viscDef[1] = { 1. }; - - gravDef[0] = domainSettings->gravx; - gravDef[1] = domainSettings->gravy; - gravDef[2] = domainSettings->gravz; // time channel is a bit special, init by hand... timeAtIndex = MEM_callocN( (allchannelSize+1)*1*sizeof(float), "fluidsiminit_timeatindex"); @@ -680,7 +926,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *ob) timeAtIndex[i] = (float)(i-startFrame); } fluidsimInitChannel(scene, &channelDomainTime, allchannelSize, timeAtIndex, timeIcu,timeDef, domainSettings->ipo, CHANNEL_FLOAT ); // NDEB - // time channel is a multiplicator for aniFrameTime + // time channel is a multiplicator for if(channelDomainTime) { for(i=0; i} else { for(i=2; i<=allchannelSize; i++) { timeAtFrame[i] = timeAtFrame[i-1]+aniFrameTime; } } - fluidsimInitChannel(scene, &channelDomainViscosity, allchannelSize, timeAtFrame, viscIcu,viscDef, domainSettings->ipo, CHANNEL_FLOAT ); // NDEB - if(channelDomainViscosity) { - for(i=0; iipo, CHANNEL_VEC ); } // domain channel init - - // init obj movement channels - channelObjCount=0; - for(base=scene->base.first; base; base= base->next) - { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(base->object, eModifierType_Fluidsim); - obit = base->object; + */ - if( fluidmdtmp && - (obit->type==OB_MESH) && - (fluidmdtmp->fss->type != OB_FLUIDSIM_DOMAIN) && // if has to match 3 places! // CHECKMATCH - (fluidmdtmp->fss->type != OB_FLUIDSIM_PARTICLE) ) { - - // cant use fluidsimInitChannel for obj channels right now, due - // to the special DXXX channels, and the rotation specialities - IpoCurve *icuex[3][3]; - //IpoCurve *par_icuex[3][3]; -#if 0 - int icuIds[3][3] = { - {OB_LOC_X, OB_LOC_Y, OB_LOC_Z}, - {OB_ROT_X, OB_ROT_Y, OB_ROT_Z}, - {OB_SIZE_X, OB_SIZE_Y, OB_SIZE_Z} - }; - int icudIds[3][3] = { - {OB_DLOC_X, OB_DLOC_Y, OB_DLOC_Z}, - {OB_DROT_X, OB_DROT_Y, OB_DROT_Z}, - {OB_DSIZE_X, OB_DSIZE_Y, OB_DSIZE_Z} - }; -#endif - // relative ipos - IpoCurve *icudex[3][3]; - //IpoCurve *par_icudex[3][3]; - int j,k; - float vals[3] = {0.0,0.0,0.0}; - int o = channelObjCount; - int inivelIcu[3] = { FLUIDSIM_VEL_X, FLUIDSIM_VEL_Y, FLUIDSIM_VEL_Z }; - float inivelDefs[3]; - int activeIcu[1] = { FLUIDSIM_ACTIVE }; - float activeDefs[1] = { 1 }; // default to on - - inivelDefs[0] = fluidmdtmp->fss->iniVelx; - inivelDefs[1] = fluidmdtmp->fss->iniVely; - inivelDefs[2] = fluidmdtmp->fss->iniVelz; - - // check & init loc,rot,size - for(j=0; j<3; j++) { - for(k=0; k<3; k++) { - // XXX prevent invalid memory access until this works - icuex[j][k]= NULL; - icudex[j][k]= NULL; - - // XXX icuex[j][k] = find_ipocurve(obit->ipo, icuIds[j][k] ); - // XXX icudex[j][k] = find_ipocurve(obit->ipo, icudIds[j][k] ); - // XXX lines below were already disabled! - //if(obit->parent) { - //par_icuex[j][k] = find_ipocurve(obit->parent->ipo, icuIds[j][k] ); - //par_icudex[j][k] = find_ipocurve(obit->parent->ipo, icudIds[j][k] ); - //} - } - } - - for(j=0; j<3; j++) { - channelObjMove[o][j] = MEM_callocN( allchannelSize*4*sizeof(float), "fluidsiminit_objmovchannel"); - for(i=1; i<=allchannelSize; i++) { - - for(k=0; k<3; k++) { - if(icuex[j][k]) { - // IPO exists, use it ... - // XXX calc_icu(icuex[j][k], aniFrlen*((float)i) ); - vals[k] = icuex[j][k]->curval; - if(obit->parent) { - // add parent transform, multiply scaling, add trafo&rot - //calc_icu(par_icuex[j][k], aniFrlen*((float)i) ); - //if(j==2) { vals[k] *= par_icuex[j][k]->curval; } - //else { vals[k] += par_icuex[j][k]->curval; } - } - } else { - // use defaults from static values - float setval=0.0; - if(j==0) { - setval = obit->loc[k]; - if(obit->parent){ setval += obit->parent->loc[k]; } - } else if(j==1) { - setval = ( 180.0*obit->rot[k] )/( 10.0*M_PI ); - if(obit->parent){ setval = ( 180.0*(obit->rot[k]+obit->parent->rot[k]) )/( 10.0*M_PI ); } - } else { - setval = obit->size[k]; - if(obit->parent){ setval *= obit->parent->size[k]; } - } - vals[k] = setval; - } - if(icudex[j][k]) { - // XXX calc_icu(icudex[j][k], aniFrlen*((float)i) ); - //vals[k] += icudex[j][k]->curval; - // add transform, multiply scaling, add trafo&rot - if(j==2) { vals[k] *= icudex[j][k]->curval; } - else { vals[k] += icudex[j][k]->curval; } - if(obit->parent) { - // add parent transform, multiply scaling, add trafo&rot - //calc_icu(par_icuex[j][k], aniFrlen*((float)i) ); - //if(j==2) { vals[k] *= par_icudex[j][k]->curval; } - //else { vals[k] += par_icudex[j][k]->curval; } - } - } - } // k - - for(k=0; k<3; k++) { - float set = vals[k]; - if(j==1) { // rot is downscaled by 10 for ipo !? - set = 360.0 - (10.0*set); - } - channelObjMove[o][j][(i-1)*4 + k] = set; - } // k - channelObjMove[o][j][(i-1)*4 + 3] = timeAtFrame[i]; - } - } - - { - int attrFSIcu[1] = { FLUIDSIM_ATTR_FORCE_STR }; - int attrFRIcu[1] = { FLUIDSIM_ATTR_FORCE_RADIUS }; - int velFSIcu[1] = { FLUIDSIM_VEL_FORCE_STR }; - int velFRIcu[1] = { FLUIDSIM_VEL_FORCE_RADIUS }; - - float attrFSDefs[1]; - float attrFRDefs[1]; - float velFSDefs[1]; - float velFRDefs[1]; - - attrFSDefs[0] = fluidmdtmp->fss->attractforceStrength; - attrFRDefs[0] = fluidmdtmp->fss->attractforceRadius; - velFSDefs[0] = fluidmdtmp->fss->velocityforceStrength; - velFRDefs[0] = fluidmdtmp->fss->velocityforceRadius; - - fluidsimInitChannel(scene, &channelAttractforceStrength[o], allchannelSize, timeAtFrame, attrFSIcu,attrFSDefs, fluidmdtmp->fss->ipo, CHANNEL_FLOAT ); - fluidsimInitChannel(scene, &channelAttractforceRadius[o], allchannelSize, timeAtFrame, attrFRIcu,attrFRDefs, fluidmdtmp->fss->ipo, CHANNEL_FLOAT ); - fluidsimInitChannel(scene, &channelVelocityforceStrength[o], allchannelSize, timeAtFrame, velFSIcu,velFSDefs, fluidmdtmp->fss->ipo, CHANNEL_FLOAT ); - fluidsimInitChannel(scene, &channelVelocityforceRadius[o], allchannelSize, timeAtFrame, velFRIcu,velFRDefs, fluidmdtmp->fss->ipo, CHANNEL_FLOAT ); - } - - fluidsimInitChannel(scene, &channelObjInivel[o], allchannelSize, timeAtFrame, inivelIcu,inivelDefs, fluidmdtmp->fss->ipo, CHANNEL_VEC ); - fluidsimInitChannel(scene, &channelObjActive[o], allchannelSize, timeAtFrame, activeIcu,activeDefs, fluidmdtmp->fss->ipo, CHANNEL_FLOAT ); - - - channelObjCount++; - - } - } - - // init trafo matrix + /* ******** init domain object's matrix ******** */ copy_m4_m4(domainMat, fsDomain->obmat); if(!invert_m4_m4(invDomMat, domainMat)) { snprintf(debugStrBuffer,256,"fluidsimBake::error - Invalid obj matrix?\n"); elbeemDebugOut(debugStrBuffer); BKE_report(reports, RPT_ERROR, "Invalid object matrix."); - // FIXME add fatal msg - FS_FREE_CHANNELS; + + fluidbake_free_data(channels, fobjects, fsset, fb); return 0; } - // -------------------------------------------------------------------------------------------- - // start writing / exporting + /* ******** start writing / exporting ******** */ strcpy(targetFile, targetDir); strcat(targetFile, suffixConfig); - if(!doExportOnly) { strcat(targetFile,".tmp"); } // dont overwrite/delete original file + strcat(targetFile,".tmp"); // dont overwrite/delete original file + // make sure these directories exist as well if(outStringsChanged) { BLI_make_existing_file(targetFile); } - if(!doExportOnly) { - ListBase threads; + /* ******** export domain to elbeem ******** */ + elbeemResetSettings(fsset); + fsset->version = 1; - // perform simulation with El'Beem api and threads - elbeemSimulationSettings fsset; - elbeemResetSettings(&fsset); - fsset.version = 1; + // setup global settings + copy_v3_v3(fsset->geoStart, domainSettings->bbStart); + copy_v3_v3(fsset->geoSize, domainSettings->bbSize); + + // simulate with 50^3 + fsset->resolutionxyz = (int)domainSettings->resolutionxyz; + fsset->previewresxyz = (int)domainSettings->previewresxyz; - // setup global settings - for(i=0 ; i<3; i++) fsset.geoStart[i] = bbStart[i]; - for(i=0 ; i<3; i++) fsset.geoSize[i] = bbSize[i]; - - // simulate with 50^3 - fsset.resolutionxyz = (int)domainSettings->resolutionxyz; - fsset.previewresxyz = (int)domainSettings->previewresxyz; - // 10cm water domain - fsset.realsize = domainSettings->realsize; - fsset.viscosity = calcViscosity; - // earth gravity - fsset.gravity[0] = domainSettings->gravx; - fsset.gravity[1] = domainSettings->gravy; - fsset.gravity[2] = domainSettings->gravz; - // simulate 5 frames, each 0.03 seconds, output to ./apitest_XXX.bobj.gz - fsset.animStart = domainSettings->animStart; - fsset.aniFrameTime = aniFrameTime; - fsset.noOfFrames = noFrames; // is otherwise subtracted in parser - strcpy(targetFile, targetDir); - strcat(targetFile, suffixSurface); - // defaults for compressibility and adaptive grids - fsset.gstar = domainSettings->gstar; - fsset.maxRefine = domainSettings->maxRefine; // check <-> gridlevels - fsset.generateParticles = domainSettings->generateParticles; - fsset.numTracerParticles = domainSettings->generateTracers; - fsset.surfaceSmoothing = domainSettings->surfaceSmoothing; - fsset.surfaceSubdivs = domainSettings->surfaceSubdivs; - fsset.farFieldSize = domainSettings->farFieldSize; - strcpy( fsset.outputPath, targetFile); + fsset->realsize = get_fluid_size_m(scene, fsDomain, domainSettings); + fsset->viscosity = get_fluid_viscosity(domainSettings); + get_fluid_gravity(fsset->gravity, scene, domainSettings); - // domain channels - fsset.channelSizeFrameTime = - fsset.channelSizeViscosity = - fsset.channelSizeGravity = allchannelSize; - fsset.channelFrameTime = channelDomainTime; - fsset.channelViscosity = channelDomainViscosity; - fsset.channelGravity = channelDomainGravity; + // simulate 5 frames, each 0.03 seconds, output to ./apitest_XXX.bobj.gz + fsset->animStart = domainSettings->animStart; + fsset->aniFrameTime = channels->aniFrameTime; + fsset->noOfFrames = noFrames; // is otherwise subtracted in parser - fsset.runsimCallback = &runSimulationCallback; - fsset.runsimUserData = &fsset; + strcpy(targetFile, targetDir); + strcat(targetFile, suffixSurface); + // defaults for compressibility and adaptive grids + fsset->gstar = domainSettings->gstar; + fsset->maxRefine = domainSettings->maxRefine; // check <-> gridlevels + fsset->generateParticles = domainSettings->generateParticles; + fsset->numTracerParticles = domainSettings->generateTracers; + fsset->surfaceSmoothing = domainSettings->surfaceSmoothing; + fsset->surfaceSubdivs = domainSettings->surfaceSubdivs; + fsset->farFieldSize = domainSettings->farFieldSize; + strcpy( fsset->outputPath, targetFile); - if( (domainSettings->typeFlags&OB_FSBND_NOSLIP)) fsset.domainobsType = FLUIDSIM_OBSTACLE_NOSLIP; - else if((domainSettings->typeFlags&OB_FSBND_PARTSLIP)) fsset.domainobsType = FLUIDSIM_OBSTACLE_PARTSLIP; - else if((domainSettings->typeFlags&OB_FSBND_FREESLIP)) fsset.domainobsType = FLUIDSIM_OBSTACLE_FREESLIP; - fsset.domainobsPartslip = domainSettings->partSlipValue; - fsset.generateVertexVectors = (domainSettings->domainNovecgen==0); + // domain channels + fsset->channelSizeFrameTime = + fsset->channelSizeViscosity = + fsset->channelSizeGravity = channels->length; + fsset->channelFrameTime = channels->DomainTime; + fsset->channelViscosity = channels->DomainViscosity; + fsset->channelGravity = channels->DomainGravity; + + fsset->runsimCallback = &runSimulationCallback; + fsset->runsimUserData = fb; - // init blender trafo matrix - // fprintf(stderr,"elbeemInit - mpTrafo:\n"); - { int j; - for(i=0; i<4; i++) { - for(j=0; j<4; j++) { - fsset.surfaceTrafo[i*4+j] = invDomMat[j][i]; - // fprintf(stderr,"elbeemInit - mpTrafo %d %d = %f (%d) \n", i,j, fsset.surfaceTrafo[i*4+j] , (i*4+j) ); - } - } } + if (domainSettings->typeFlags & OB_FSBND_NOSLIP) fsset->domainobsType = FLUIDSIM_OBSTACLE_NOSLIP; + else if (domainSettings->typeFlags&OB_FSBND_PARTSLIP) fsset->domainobsType = FLUIDSIM_OBSTACLE_PARTSLIP; + else if (domainSettings->typeFlags&OB_FSBND_FREESLIP) fsset->domainobsType = FLUIDSIM_OBSTACLE_FREESLIP; + fsset->domainobsPartslip = domainSettings->partSlipValue; + fsset->generateVertexVectors = (domainSettings->domainNovecgen==0); - // init solver with settings - elbeemInit(); - elbeemAddDomain(&fsset); - - // init objects - channelObjCount = 0; - for(base=scene->base.first; base; base= base->next) { - FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(base->object, eModifierType_Fluidsim); - obit = base->object; - //{ snprintf(debugStrBuffer,256,"DEBUG object name=%s, type=%d ...\n", obit->id.name, obit->type); elbeemDebugOut(debugStrBuffer); } // DEBUG - if( fluidmdtmp && // if has to match 3 places! // CHECKMATCH - (obit->type==OB_MESH) && - (fluidmdtmp->fss->type != OB_FLUIDSIM_DOMAIN) && - (fluidmdtmp->fss->type != OB_FLUIDSIM_PARTICLE)) - { - float *verts=NULL; - int *tris=NULL; - int numVerts=0, numTris=0; - int o = channelObjCount; - int deform = (fluidmdtmp->fss->domainNovecgen); // misused value - // todo - use blenderInitElbeemMesh - int modifierIndex = modifiers_indexInObject(obit, (ModifierData *)fluidmdtmp); - - elbeemMesh fsmesh; - elbeemResetMesh( &fsmesh ); - fsmesh.type = fluidmdtmp->fss->type; - // get name of object for debugging solver - fsmesh.name = obit->id.name; - - initElbeemMesh(scene, obit, &numVerts, &verts, &numTris, &tris, 0, modifierIndex); - fsmesh.numVertices = numVerts; - fsmesh.numTriangles = numTris; - fsmesh.vertices = verts; - fsmesh.triangles = tris; - - fsmesh.channelSizeTranslation = - fsmesh.channelSizeRotation = - fsmesh.channelSizeScale = - fsmesh.channelSizeInitialVel = - fsmesh.channelSizeActive = allchannelSize; - - fsmesh.channelTranslation = channelObjMove[o][0]; - fsmesh.channelRotation = channelObjMove[o][1]; - fsmesh.channelScale = channelObjMove[o][2]; - fsmesh.channelActive = channelObjActive[o]; - if( (fsmesh.type == OB_FLUIDSIM_FLUID) || - (fsmesh.type == OB_FLUIDSIM_INFLOW)) { - fsmesh.channelInitialVel = channelObjInivel[o]; - fsmesh.localInivelCoords = ((fluidmdtmp->fss->typeFlags&OB_FSINFLOW_LOCALCOORD)?1:0); - } - - if( (fluidmdtmp->fss->typeFlags&OB_FSBND_NOSLIP)) fsmesh.obstacleType = FLUIDSIM_OBSTACLE_NOSLIP; - else if((fluidmdtmp->fss->typeFlags&OB_FSBND_PARTSLIP)) fsmesh.obstacleType = FLUIDSIM_OBSTACLE_PARTSLIP; - else if((fluidmdtmp->fss->typeFlags&OB_FSBND_FREESLIP)) fsmesh.obstacleType = FLUIDSIM_OBSTACLE_FREESLIP; - fsmesh.obstaclePartslip = fluidmdtmp->fss->partSlipValue; - fsmesh.volumeInitType = fluidmdtmp->fss->volumeInitType; - fsmesh.obstacleImpactFactor = fluidmdtmp->fss->surfaceSmoothing; // misused value - - if(fsmesh.type == OB_FLUIDSIM_CONTROL) - { - // control fluids will get exported as whole - deform = 1; - - fsmesh.cpsTimeStart = fluidmdtmp->fss->cpsTimeStart; - fsmesh.cpsTimeEnd = fluidmdtmp->fss->cpsTimeEnd; - fsmesh.cpsQuality = fluidmdtmp->fss->cpsQuality; - fsmesh.obstacleType = (fluidmdtmp->fss->flag & OB_FLUIDSIM_REVERSE); - - fsmesh.channelSizeAttractforceRadius = - fsmesh.channelSizeVelocityforceStrength = - fsmesh.channelSizeVelocityforceRadius = - fsmesh.channelSizeAttractforceStrength = allchannelSize; - - fsmesh.channelAttractforceStrength = channelAttractforceStrength[o]; - fsmesh.channelAttractforceRadius = channelAttractforceRadius[o]; - fsmesh.channelVelocityforceStrength = channelVelocityforceStrength[o]; - fsmesh.channelVelocityforceRadius = channelVelocityforceRadius[o]; - } - else - { - // set channels to 0 - fsmesh.channelAttractforceStrength = - fsmesh.channelAttractforceRadius = - fsmesh.channelVelocityforceStrength = - fsmesh.channelVelocityforceRadius = NULL; - } - - // animated meshes - if(deform) { - fsmesh.channelSizeVertices = allchannelSize; - fluidsimInitMeshChannel(C, &fsmesh.channelVertices, allchannelSize, obit, numVerts, timeAtFrame, modifierIndex); - scene->r.cfra = startFrame; - ED_update_for_newframe(C, 1); - // remove channels - fsmesh.channelTranslation = - fsmesh.channelRotation = - fsmesh.channelScale = NULL; - } - - elbeemAddMesh(&fsmesh); - - if(verts) MEM_freeN(verts); - if(tris) MEM_freeN(tris); - if(fsmesh.channelVertices) MEM_freeN(fsmesh.channelVertices); - channelObjCount++; - } // valid mesh - } // objects - //domainSettings->type = OB_FLUIDSIM_DOMAIN; // enable for bake display again - - // set to neutral, -1 means user abort, -2 means init error - globalBakeState = 0; - globalBakeFrame = 0; - -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - thread_tls_data = pthread_getspecific(gomp_tls_key); -#endif - BLI_init_threads(&threads, fluidsimSimulateThread, 1); - BLI_insert_thread(&threads, targetFile); - - { - int done = 0; - float noFramesf = (float)noFrames; - float percentdone = 0.0, oldpercentdone = -1.0; - int lastRedraw = -1; - - g_break= 0; - G.afbreek= 0; /* blender_test_break uses this global */ - - start_progress_bar(); - - while(done==0) { - char busy_mess[80]; - - waitcursor(1); - - // lukep we add progress bar as an interim mesure - percentdone = globalBakeFrame / noFramesf; - if (percentdone != oldpercentdone) { - sprintf(busy_mess, "baking fluids %d / %d |||", globalBakeFrame, (int) noFramesf); - percentdone = percentdone < 0.0 ? 0.0:percentdone; - progress_bar(CTX_wm_window(C), percentdone, busy_mess ); - oldpercentdone = percentdone; - } - - //XXX no more need for longer delay to prevent frequent redrawing - PIL_sleep_ms(200); - - BLI_lock_thread(LOCK_CUSTOM1); - if(globalBakeState != 0) done = 1; // 1=ok, <0=error/abort - BLI_unlock_thread(LOCK_CUSTOM1); - - if (!G.background) { - g_break= blender_test_break(); - - if(g_break) - { - // abort... - BLI_lock_thread(LOCK_CUSTOM1); - - if(domainSettings) - domainSettings->lastgoodframe = startFrame+globalBakeFrame; - - done = -1; - globalBakeFrame = 0; - globalBakeState = -1; - simAborted = 1; - BLI_unlock_thread(LOCK_CUSTOM1); - break; - } - } - - // redraw the 3D for showing progress once in a while... - if(lastRedraw!=globalBakeFrame) { -#if 0 - ScrArea *sa; - scene->r.cfra = startFrame+globalBakeFrame; - lastRedraw = globalBakeFrame; - ED_update_for_newframe(C, 1); - sa= G.curscreen->areabase.first; - while(sa) { - if(sa->spacetype == SPACE_VIEW3D) { scrarea_do_windraw(sa); } - sa= sa->next; - } - screen_swapbuffers(); -#endif - } // redraw - } - end_progress_bar(CTX_wm_window(C)); + // init blender domain transform matrix + { int j; + for(i=0; i<4; i++) { + for(j=0; j<4; j++) { + fsset->surfaceTrafo[i*4+j] = invDomMat[j][i]; } - BLI_end_threads(&threads); - } // El'Beem API init, thread creation - // -------------------------------------------------------------------------------------------- - else - { // write config file to be run with command line simulator - BKE_report(reports, RPT_WARNING, "Config file export not supported."); - } // config file export done! + } } - // -------------------------------------------------------------------------------------------- - FS_FREE_CHANNELS; - - // go back to "current" blender time - waitcursor(0); + /* ******** init solver with settings ******** */ + elbeemInit(); + elbeemAddDomain(fsset); - if(globalBakeState >= 0) - { - if(domainSettings) - domainSettings->lastgoodframe = startFrame+globalBakeFrame; - } + /* ******** export all fluid objects to elbeem ******** */ + export_fluid_objects(fobjects, scene, channels->length); - scene->r.cfra = origFrame; - ED_update_for_newframe(C, 1); - - if(!simAborted) { - char elbeemerr[256]; - - // check if some error occurred - if(globalBakeState==-2) { - elbeemGetErrorString(elbeemerr); - BKE_reportf(reports, RPT_ERROR, "Failed to initialize [Msg: %s]", elbeemerr); - return 0; - } // init error - } + /* custom data for fluid bake job */ + fb->settings = fsset; + /* setup job */ + WM_jobs_customdata(steve, fb, fluidbake_free); + WM_jobs_timer(steve, 0.1, NC_SCENE|ND_FRAME, NC_SCENE|ND_FRAME); + WM_jobs_callbacks(steve, fluidbake_startjob, NULL, NULL, fluidbake_endjob); + + WM_jobs_start(CTX_wm_manager(C), steve); + + /* ******** free stored animation data ******** */ + fluidbake_free_data(channels, fobjects, NULL, NULL); + // elbeemFree(); return 1; } @@ -1206,7 +1090,6 @@ static int fluid_bake_exec(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); - // XXX TODO redraw, escape, non-blocking, .. if(!fluidsimBake(C, op->reports, ob)) return OPERATOR_CANCELLED; diff --git a/source/blender/editors/physics/physics_intern.h b/source/blender/editors/physics/physics_intern.h index aa3a2e22e31..b3d11810c43 100644 --- a/source/blender/editors/physics/physics_intern.h +++ b/source/blender/editors/physics/physics_intern.h @@ -37,8 +37,8 @@ struct wmOperatorType; /* particle_edit.c */ void PARTICLE_OT_select_all(struct wmOperatorType *ot); -void PARTICLE_OT_select_first(struct wmOperatorType *ot); -void PARTICLE_OT_select_last(struct wmOperatorType *ot); +void PARTICLE_OT_select_roots(struct wmOperatorType *ot); +void PARTICLE_OT_select_tips(struct wmOperatorType *ot); void PARTICLE_OT_select_linked(struct wmOperatorType *ot); void PARTICLE_OT_select_less(struct wmOperatorType *ot); void PARTICLE_OT_select_more(struct wmOperatorType *ot); diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index 55568c89e75..28839693e2c 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,7 +27,6 @@ #include -#include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -44,8 +43,8 @@ static void operatortypes_particle(void) { WM_operatortype_append(PARTICLE_OT_select_all); - WM_operatortype_append(PARTICLE_OT_select_first); - WM_operatortype_append(PARTICLE_OT_select_last); + WM_operatortype_append(PARTICLE_OT_select_roots); + WM_operatortype_append(PARTICLE_OT_select_tips); WM_operatortype_append(PARTICLE_OT_select_linked); WM_operatortype_append(PARTICLE_OT_select_less); WM_operatortype_append(PARTICLE_OT_select_more); @@ -101,6 +100,7 @@ static void keymap_particle(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "PARTICLE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "PARTICLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c index 1359af5377f..8e53e3c6f50 100644 --- a/source/blender/editors/physics/physics_pointcache.c +++ b/source/blender/editors/physics/physics_pointcache.c @@ -32,9 +32,8 @@ #include "MEM_guardedalloc.h" #include "DNA_scene_types.h" -#include "DNA_object_force.h" -#include "DNA_modifier_types.h" +#include "BKE_anim.h" #include "BKE_context.h" #include "BKE_particle.h" #include "BKE_report.h" @@ -46,12 +45,8 @@ #include "BLI_blenlib.h" -#include "ED_screen.h" -#include "ED_physics.h" #include "ED_particle.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "WM_api.h" #include "WM_types.h" @@ -76,7 +71,7 @@ static int ptcache_bake_all_poll(bContext *C) static int ptcache_poll(bContext *C) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache); + PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache); return (ptr.data && ptr.id.data); } @@ -94,7 +89,7 @@ void bake_console_progress_end(void *arg) static int ptcache_bake_all_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - wmWindow *win = CTX_wm_window(C); + wmWindow *win = G.background ? NULL : CTX_wm_window(C); PTCacheBaker baker; @@ -120,6 +115,7 @@ static int ptcache_bake_all_exec(bContext *C, wmOperator *op) BKE_ptcache_make_cache(&baker); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, NULL); return OPERATOR_FINISHED; } @@ -131,13 +127,15 @@ static int ptcache_free_bake_all_exec(bContext *C, wmOperator *op) ListBase pidlist; for(base=scene->base.first; base; base= base->next) { - BKE_ptcache_ids_from_object(&pidlist, base->object); + BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR); for(pid=pidlist.first; pid; pid=pid->next) { pid->cache->flag &= ~PTCACHE_BAKED; } BLI_freelistN(&pidlist); + + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, base->object); } WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); @@ -176,15 +174,15 @@ void PTCACHE_OT_free_bake_all(wmOperatorType *ot) static int ptcache_bake_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); - wmWindow *win = CTX_wm_window(C); - PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache); + wmWindow *win = G.background ? NULL : CTX_wm_window(C); + PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache); Object *ob= ptr.id.data; PointCache *cache= ptr.data; PTCacheBaker baker; PTCacheID *pid; ListBase pidlist; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, scene, MAX_DUPLI_RECUR); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache == cache) @@ -216,13 +214,15 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op) BLI_freelistN(&pidlist); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } static int ptcache_free_bake_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache); + PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache); PointCache *cache= ptr.data; + Object *ob= ptr.id.data; if(cache->edit) { if(!cache->edit->edited || 1) {// XXX okee("Lose changes done in particle mode?")) { @@ -233,15 +233,20 @@ static int ptcache_free_bake_exec(bContext *C, wmOperator *op) } else cache->flag &= ~PTCACHE_BAKED; + + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } static int ptcache_bake_from_cache_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache); + PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache); PointCache *cache= ptr.data; + Object *ob= ptr.id.data; cache->flag |= PTCACHE_BAKED; + + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } @@ -290,13 +295,13 @@ void PTCACHE_OT_bake_from_cache(wmOperatorType *ot) static int ptcache_add_new_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); - PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache); + PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache); Object *ob= ptr.id.data; PointCache *cache= ptr.data; PTCacheID *pid; ListBase pidlist; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, scene, MAX_DUPLI_RECUR); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache == cache) { @@ -308,18 +313,20 @@ static int ptcache_add_new_exec(bContext *C, wmOperator *op) BLI_freelistN(&pidlist); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } static int ptcache_remove_exec(bContext *C, wmOperator *op) { - PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache); + PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache); + Scene *scene= CTX_data_scene(C); Object *ob= ptr.id.data; PointCache *cache= ptr.data; PTCacheID *pid; ListBase pidlist; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, scene, MAX_DUPLI_RECUR); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache == cache) { @@ -335,6 +342,8 @@ static int ptcache_remove_exec(bContext *C, wmOperator *op) } BLI_freelistN(&pidlist); + + WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt new file mode 100644 index 00000000000..550c812c320 --- /dev/null +++ b/source/blender/editors/render/CMakeLists.txt @@ -0,0 +1,55 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenfont + ../../blenkernel + ../../blenlib + ../../blenloader + ../../gpu + ../../imbuf + ../../bmesh + ../include + ../../../../intern/guardedalloc + ../../../../extern/glew/include + ../../makesdna + ../../makesrna + ../../python + ../../render/extern/include + ../../windowmanager +) + +IF(WITH_QUICKTIME) + SET(INC ${INC} ../../quicktime ${QUICKTIME_INC}) + ADD_DEFINITIONS(-DWITH_QUICKTIME) +ENDIF(WITH_QUICKTIME) + +IF(WITH_OPENMP) + ADD_DEFINITIONS(-DPARALLEL=1) +ENDIF(WITH_OPENMP) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_render "${SRC}" "${INC}") diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h index 99b68c2bb74..a0441155629 100644 --- a/source/blender/editors/render/render_intern.h +++ b/source/blender/editors/render/render_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,6 +30,8 @@ #define RENDER_INTERN_H struct wmOperatorType; +struct RenderResult; +struct Scene; /* render_shading.c */ void OBJECT_OT_material_slot_add(struct wmOperatorType *ot); @@ -49,8 +51,25 @@ void MATERIAL_OT_paste(struct wmOperatorType *ot); void SCENE_OT_render_layer_add(struct wmOperatorType *ot); void SCENE_OT_render_layer_remove(struct wmOperatorType *ot); -void TEXTURE_OT_slot_move(struct wmOperatorType *ot); +void TEXTURE_OT_slot_copy(struct wmOperatorType *ot); +void TEXTURE_OT_slot_paste(struct wmOperatorType *ot); +void TEXTURE_OT_slot_move(struct wmOperatorType *ot); +void TEXTURE_OT_envmap_save(struct wmOperatorType *ot); +void TEXTURE_OT_envmap_clear(struct wmOperatorType *ot); +void TEXTURE_OT_envmap_clear_all(struct wmOperatorType *ot); + +/* render_internal.c */ +void RENDER_OT_view_show(struct wmOperatorType *ot); +void RENDER_OT_render(struct wmOperatorType *ot); +void RENDER_OT_view_cancel(struct wmOperatorType *ot); + +/*render_opengl.c uses these */ +void image_buffer_rect_update(struct Scene *scene, struct RenderResult *rr, struct ImBuf *ibuf, volatile struct rcti *renrect); +void screen_set_image_output(struct bContext *C, int mx, int my); + +/* render_opengl.c */ +void RENDER_OT_opengl(struct wmOperatorType *ot); #endif /* RENDER_INTERN_H */ diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c new file mode 100644 index 00000000000..7110c3aa7a7 --- /dev/null +++ b/source/blender/editors/render/render_internal.c @@ -0,0 +1,833 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + * + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include +#include + +#include "MEM_guardedalloc.h" + +#include "BLI_blenlib.h" +#include "BLI_math.h" +#include "BLI_threads.h" +#include "BLI_rand.h" + +#include "DNA_scene_types.h" + +#include "BKE_blender.h" +#include "BKE_colortools.h" +#include "BKE_context.h" +#include "BKE_global.h" +#include "BKE_image.h" +#include "BKE_library.h" +#include "BKE_main.h" +#include "BKE_multires.h" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_screen.h" +#include "BKE_utildefines.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_screen.h" +#include "ED_object.h" + +#include "RE_pipeline.h" +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "wm_window.h" + +#include "render_intern.h" + +static ScrArea *biggest_area(bContext *C); +static ScrArea *biggest_non_image_area(bContext *C); +static ScrArea *find_area_showing_r_result(bContext *C); +static ScrArea *find_area_image_empty(bContext *C); + +/* called inside thread! */ +void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volatile rcti *renrect) +{ + float x1, y1, *rectf= NULL; + int ymin, ymax, xmin, xmax; + int rymin, rxmin; + char *rectc; + + /* if renrect argument, we only refresh scanlines */ + if(renrect) { + /* if ymax==recty, rendering of layer is ready, we should not draw, other things happen... */ + if(rr->renlay==NULL || renrect->ymax>=rr->recty) + return; + + /* xmin here is first subrect x coord, xmax defines subrect width */ + xmin = renrect->xmin + rr->crop; + xmax = renrect->xmax - xmin + rr->crop; + if (xmax<2) return; + + ymin= renrect->ymin + rr->crop; + ymax= renrect->ymax - ymin + rr->crop; + if(ymax<2) + return; + renrect->ymin= renrect->ymax; + + } + else { + xmin = ymin = rr->crop; + xmax = rr->rectx - 2*rr->crop; + ymax = rr->recty - 2*rr->crop; + } + + /* xmin ymin is in tile coords. transform to ibuf */ + rxmin= rr->tilerect.xmin + xmin; + if(rxmin >= ibuf->x) return; + rymin= rr->tilerect.ymin + ymin; + if(rymin >= ibuf->y) return; + + if(rxmin + xmax > ibuf->x) + xmax= ibuf->x - rxmin; + if(rymin + ymax > ibuf->y) + ymax= ibuf->y - rymin; + + if(xmax < 1 || ymax < 1) return; + + /* find current float rect for display, first case is after composit... still weak */ + if(rr->rectf) + rectf= rr->rectf; + else { + if(rr->rect32) + return; + else { + if(rr->renlay==NULL || rr->renlay->rectf==NULL) return; + rectf= rr->renlay->rectf; + } + } + if(rectf==NULL) return; + + if(ibuf->rect==NULL) + imb_addrectImBuf(ibuf); + + rectf+= 4*(rr->rectx*ymin + xmin); + rectc= (char *)(ibuf->rect + ibuf->x*rymin + rxmin); + + /* XXX make nice consistent functions for this */ + if (scene && (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)) { + for(y1= 0; y1dither / 255.0; + + /* XXX temp. because crop offset */ + if( rectc >= (char *)(ibuf->rect)) { + for(x1= 0; x1rectx; + rectc += 4*ibuf->x; + } + } else { + for(y1= 0; y1dither / 255.0; + + /* XXX temp. because crop offset */ + if( rectc >= (char *)(ibuf->rect)) { + for(x1= 0; x1rectx; + rectc += 4*ibuf->x; + } + } +} + +/* new window uses x,y to set position */ +void screen_set_image_output(bContext *C, int mx, int my) +{ + wmWindow *win= CTX_wm_window(C); + Scene *scene= CTX_data_scene(C); + ScrArea *sa= NULL; + SpaceImage *sima; + int area_was_image=0; + + if(scene->r.displaymode==R_OUTPUT_WINDOW) { + rcti rect; + int sizex, sizey; + + sizex= 10 + (scene->r.xsch*scene->r.size)/100; + sizey= 40 + (scene->r.ysch*scene->r.size)/100; + + /* arbitrary... miniature image window views don't make much sense */ + if(sizex < 320) sizex= 320; + if(sizey < 256) sizey= 256; + + /* XXX some magic to calculate postition */ + rect.xmin= mx + win->posx - sizex/2; + rect.ymin= my + win->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); + + sa= CTX_wm_area(C); + } + else if(scene->r.displaymode==R_OUTPUT_SCREEN) { + if (CTX_wm_area(C) && CTX_wm_area(C)->spacetype == SPACE_IMAGE) + area_was_image = 1; + + /* this function returns with changed context */ + ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_IMAGE); + sa= CTX_wm_area(C); + } + + if(!sa) { + sa= find_area_showing_r_result(C); + if(sa==NULL) + sa= find_area_image_empty(C); + + if(sa==NULL) { + /* find largest open non-image area */ + sa= biggest_non_image_area(C); + if(sa) { + ED_area_newspace(C, sa, SPACE_IMAGE); + sima= sa->spacedata.first; + + /* makes ESC go back to prev space */ + sima->flag |= SI_PREVSPACE; + } + else { + /* use any area of decent size */ + sa= biggest_area(C); + if(sa->spacetype!=SPACE_IMAGE) { + // XXX newspace(sa, SPACE_IMAGE); + sima= sa->spacedata.first; + + /* makes ESC go back to prev space */ + sima->flag |= SI_PREVSPACE; + } + } + } + } + sima= sa->spacedata.first; + + /* get the correct image, and scale it */ + sima->image= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); + + + /* if we're rendering to full screen, set appropriate hints on image editor + * so it can restore properly on pressing esc */ + if(sa->full) { + sima->flag |= SI_FULLWINDOW; + + /* Tell the image editor to revert to previous space in space list on close + * _only_ if it wasn't already an image editor when the render was invoked */ + if (area_was_image == 0) + sima->flag |= SI_PREVSPACE; + else { + /* Leave it alone so the image editor will just go back from + * full screen to the original tiled setup */ + ; + } + + } + +} + + +/* ****************************** render invoking ***************** */ + +/* set callbacks, exported to sequence render too. + Only call in foreground (UI) renders. */ + +/* returns biggest area that is not uv/image editor. Note that it uses buttons */ +/* window as the last possible alternative. */ +static ScrArea *biggest_non_image_area(bContext *C) +{ + bScreen *sc= CTX_wm_screen(C); + ScrArea *sa, *big= NULL; + int size, maxsize= 0, bwmaxsize= 0; + short foundwin= 0; + + for(sa= sc->areabase.first; sa; sa= sa->next) { + if(sa->winx > 30 && sa->winy > 30) { + size= sa->winx*sa->winy; + if(sa->spacetype == SPACE_BUTS) { + if(foundwin == 0 && size > bwmaxsize) { + bwmaxsize= size; + big= sa; + } + } + else if(sa->spacetype != SPACE_IMAGE && size > maxsize) { + maxsize= size; + big= sa; + foundwin= 1; + } + } + } + + return big; +} + +static ScrArea *biggest_area(bContext *C) +{ + bScreen *sc= CTX_wm_screen(C); + ScrArea *sa, *big= NULL; + int size, maxsize= 0; + + for(sa= sc->areabase.first; sa; sa= sa->next) { + size= sa->winx*sa->winy; + if(size > maxsize) { + maxsize= size; + big= sa; + } + } + return big; +} + + +static ScrArea *find_area_showing_r_result(bContext *C) +{ + wmWindowManager *wm= CTX_wm_manager(C); + wmWindow *win; + ScrArea *sa = NULL; + SpaceImage *sima; + + /* find an imagewindow showing render result */ + for(win=wm->windows.first; win; win=win->next) { + for(sa=win->screen->areabase.first; sa; sa= sa->next) { + if(sa->spacetype==SPACE_IMAGE) { + sima= sa->spacedata.first; + if(sima->image && sima->image->type==IMA_TYPE_R_RESULT) + break; + } + } + } + + return sa; +} + +static ScrArea *find_area_image_empty(bContext *C) +{ + bScreen *sc= CTX_wm_screen(C); + ScrArea *sa; + SpaceImage *sima; + + /* find an imagewindow showing render result */ + for(sa=sc->areabase.first; sa; sa= sa->next) { + if(sa->spacetype==SPACE_IMAGE) { + sima= sa->spacedata.first; + if(!sima->image) + break; + } + } + return sa; +} + +#if 0 // XXX not used +static ScrArea *find_empty_image_area(bContext *C) +{ + bScreen *sc= CTX_wm_screen(C); + ScrArea *sa; + SpaceImage *sima; + + /* find an imagewindow showing render result */ + for(sa=sc->areabase.first; sa; sa= sa->next) { + if(sa->spacetype==SPACE_IMAGE) { + sima= sa->spacedata.first; + if(!sima->image) + break; + } + } + return sa; +} +#endif // XXX not used + +static void render_error_reports(void *reports, char *str) +{ + BKE_report(reports, RPT_ERROR, str); +} + +/* executes blocking render */ +static int screen_render_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Render *re= RE_NewRender(scene->id.name); + Image *ima; + View3D *v3d= CTX_wm_view3d(C); + int lay= (v3d)? v3d->lay: scene->lay; + + if(re==NULL) { + re= RE_NewRender(scene->id.name); + } + + G.afbreek= 0; + RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break); + RE_error_cb(re, op->reports, render_error_reports); + + ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); + BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); + BKE_image_backup_render(scene, ima); + + if(RNA_boolean_get(op->ptr, "animation")) + RE_BlenderAnim(re, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports); + else + RE_BlenderFrame(re, scene, NULL, lay, scene->r.cfra); + + // no redraw needed, we leave state as we entered it + ED_update_for_newframe(C, 1); + + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene); + + return OPERATOR_FINISHED; +} + +typedef struct RenderJob { + Scene *scene; + Render *re; + wmWindow *win; + SceneRenderLayer *srl; + int lay; + int anim; + Image *image; + ImageUser iuser; + short *stop; + short *do_update; + float *progress; + ReportList *reports; +} RenderJob; + +static void render_freejob(void *rjv) +{ + RenderJob *rj= rjv; + + MEM_freeN(rj); +} + +/* str is IMA_MAX_RENDER_TEXT in size */ +static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) +{ + char info_time_str[32]; // used to be extern to header_info.c + uintptr_t mem_in_use, mmap_in_use, peak_memory; + float megs_used_memory, mmap_used_memory, megs_peak_memory; + char *spos= str; + + mem_in_use= MEM_get_memory_in_use(); + mmap_in_use= MEM_get_mapped_memory_in_use(); + peak_memory = MEM_get_peak_memory(); + + megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0); + mmap_used_memory= (mmap_in_use)/(1024.0*1024.0); + megs_peak_memory = (peak_memory)/(1024.0*1024.0); + + if(scene->lay & 0xFF000000) + spos+= sprintf(spos, "Localview | "); + else if(scene->r.scemode & R_SINGLE_LAYER) + spos+= sprintf(spos, "Single Layer | "); + + if(rs->statstr) { + spos+= sprintf(spos, "%s ", rs->statstr); + } + else { + spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface); + if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo); + if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand); + spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory, megs_peak_memory); + + if(rs->curfield) + spos+= sprintf(spos, "Field %d ", rs->curfield); + if(rs->curblur) + spos+= sprintf(spos, "Blur %d ", rs->curblur); + } + + BLI_timestr(rs->lastframetime, info_time_str); + spos+= sprintf(spos, "Time:%s ", info_time_str); + + if(rs->infostr && rs->infostr[0]) + spos+= sprintf(spos, "| %s ", rs->infostr); + + /* very weak... but 512 characters is quite safe */ + if(spos >= str+IMA_MAX_RENDER_TEXT) + if (G.f & G_DEBUG) + printf("WARNING! renderwin text beyond limit \n"); + +} + +static void image_renderinfo_cb(void *rjv, RenderStats *rs) +{ + RenderJob *rj= rjv; + RenderResult *rr; + + rr= RE_AcquireResultRead(rj->re); + + if(rr) { + /* malloc OK here, stats_draw is not in tile threads */ + if(rr->text==NULL) + rr->text= MEM_callocN(IMA_MAX_RENDER_TEXT, "rendertext"); + + make_renderinfo_string(rs, rj->scene, rr->text); + } + + RE_ReleaseResult(rj->re); + + /* make jobs timer to send notifier */ + *(rj->do_update)= 1; + +} + +static void render_progress_update(void *rjv, float progress) +{ + RenderJob *rj= rjv; + + if (rj->progress) + *rj->progress = progress; +} + +static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect) +{ + RenderJob *rj= rjv; + Image *ima= rj->image; + ImBuf *ibuf; + void *lock; + + /* only update if we are displaying the slot being rendered */ + if(ima->render_slot != ima->last_render_slot) + return; + + ibuf= BKE_image_acquire_ibuf(ima, &rj->iuser, &lock); + if(ibuf) { + image_buffer_rect_update(rj->scene, rr, ibuf, renrect); + + /* make jobs timer to send notifier */ + *(rj->do_update)= 1; + } + BKE_image_release_ibuf(ima, lock); +} + +static void render_startjob(void *rjv, short *stop, short *do_update, float *progress) +{ + RenderJob *rj= rjv; +// Main *mainp= BKE_undo_get_main(&rj->scene); + + rj->stop= stop; + rj->do_update= do_update; + rj->progress= progress; + + if(rj->anim) + RE_BlenderAnim(rj->re, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); + else + RE_BlenderFrame(rj->re, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra); + +// if(mainp) +// free_main(mainp); +} + +static void render_endjob(void *rjv) +{ + /* XXX render stability hack */ + G.rendering = 0; + WM_main_add_notifier(NC_WINDOW, NULL); +} + +/* called by render, check job 'stop' value or the global */ +static int render_breakjob(void *rjv) +{ + RenderJob *rj= rjv; + + if(G.afbreek) + return 1; + if(rj->stop && *(rj->stop)) + return 1; + return 0; +} + +/* catch esc */ +static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event) +{ + /* no running blender, remove handler and pass through */ + if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) { + return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; + } + + /* running render */ + switch (event->type) { + case ESCKEY: + return OPERATOR_RUNNING_MODAL; + break; + } + return OPERATOR_PASS_THROUGH; +} + +/* using context, starts job */ +static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + /* new render clears all callbacks */ + Scene *scene= CTX_data_scene(C); + SceneRenderLayer *srl=NULL; + bScreen *screen= CTX_wm_screen(C); + View3D *v3d= CTX_wm_view3d(C); + Render *re; + wmJob *steve; + RenderJob *rj; + Image *ima; + + /* only one render job at a time */ + if(WM_jobs_test(CTX_wm_manager(C), scene)) + return OPERATOR_CANCELLED; + + /* stop all running jobs, currently previews frustrate Render */ + WM_jobs_stop_all(CTX_wm_manager(C)); + + /* cancel animation playback */ + if (screen->animtimer) + ED_screen_animation_play(C, 0, 0); + + /* handle UI stuff */ + WM_cursor_wait(1); + + /* flush multires changes (for sculpt) */ + multires_force_render_update(CTX_data_active_object(C)); + + /* get editmode results */ + ED_object_exit_editmode(C, 0); /* 0 = does not exit editmode */ + + // store spare + // get view3d layer, local layer, make this nice api call to render + // store spare + + /* ensure at least 1 area shows result */ + screen_set_image_output(C, event->x, event->y); + + /* single layer re-render */ + if(RNA_property_is_set(op->ptr, "layer")) { + SceneRenderLayer *rl; + Scene *scn; + char scene_name[19], rl_name[RE_MAXNAME]; + + RNA_string_get(op->ptr, "layer", rl_name); + RNA_string_get(op->ptr, "scene", scene_name); + + scn = (Scene *)BLI_findstring(&CTX_data_main(C)->scene, scene_name, offsetof(ID, name) + 2); + rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name)); + + if (scn && rl) { + scene = scn; + srl = rl; + } + } + + /* job custom data */ + rj= MEM_callocN(sizeof(RenderJob), "render job"); + rj->scene= scene; + rj->win= CTX_wm_window(C); + rj->srl = srl; + rj->lay = (v3d)? v3d->lay: scene->lay; + rj->anim= RNA_boolean_get(op->ptr, "animation"); + rj->iuser.scene= scene; + rj->iuser.ok= 1; + rj->reports= op->reports; + + /* setup job */ + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS); + WM_jobs_customdata(steve, rj, render_freejob); + WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0); + WM_jobs_callbacks(steve, render_startjob, NULL, NULL, render_endjob); + + /* get a render result image, and make sure it is empty */ + ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); + BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); + BKE_image_backup_render(rj->scene, ima); + rj->image= ima; + + /* setup new render */ + re= RE_NewRender(scene->id.name); + RE_test_break_cb(re, rj, render_breakjob); + RE_display_draw_cb(re, rj, image_rect_update); + RE_stats_draw_cb(re, rj, image_renderinfo_cb); + RE_progress_cb(re, rj, render_progress_update); + + rj->re= re; + G.afbreek= 0; + + RE_error_cb(re, op->reports, render_error_reports); + + WM_jobs_start(CTX_wm_manager(C), steve); + + WM_cursor_wait(0); + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene); + + /* we set G.rendering here already instead of only in the job, this ensure + main loop or other scene updates are disabled in time, since they may + have started before the job thread */ + G.rendering = 1; + + /* add modal handler for ESC */ + WM_event_add_modal_handler(C, op); + + return OPERATOR_RUNNING_MODAL; +} + + +/* contextual render, using current scene, view3d? */ +void RENDER_OT_render(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Render"; + ot->description= "Render active scene"; + ot->idname= "RENDER_OT_render"; + + /* api callbacks */ + ot->invoke= screen_render_invoke; + ot->modal= screen_render_modal; + ot->exec= screen_render_exec; + + ot->poll= ED_operator_screenactive; + + RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); + RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render"); + RNA_def_string(ot->srna, "scene", "", 19, "Scene", "Re-render single layer in this scene"); +} + +/* ****************************** opengl render *************************** */ + + +/* *********************** cancel render viewer *************** */ + +static int render_view_cancel_exec(bContext *C, wmOperator *unused) +{ + wmWindow *win= CTX_wm_window(C); + ScrArea *sa= CTX_wm_area(C); + SpaceImage *sima= sa->spacedata.first; + + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + return OPERATOR_FINISHED; + } + /* determine if render already shows */ + else if(sima->flag & SI_PREVSPACE) { + sima->flag &= ~SI_PREVSPACE; + + if(sima->flag & SI_FULLWINDOW) { + sima->flag &= ~SI_FULLWINDOW; + ED_screen_full_prevspace(C, sa); + } + else + ED_area_prevspace(C, sa); + + return OPERATOR_FINISHED; + } + else if(sima->flag & SI_FULLWINDOW) { + sima->flag &= ~SI_FULLWINDOW; + ED_screen_full_toggle(C, win, sa); + return OPERATOR_FINISHED; + } + + return OPERATOR_PASS_THROUGH; +} + +void RENDER_OT_view_cancel(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Cancel Render View"; + ot->description= "Cancel show render view"; + ot->idname= "RENDER_OT_view_cancel"; + + /* api callbacks */ + ot->exec= render_view_cancel_exec; + ot->poll= ED_operator_image_active; +} + +/* *********************** show render viewer *************** */ + +static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) +{ + ScrArea *sa= find_area_showing_r_result(C); + + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } + /* determine if render already shows */ + else if(sa) { + SpaceImage *sima= sa->spacedata.first; + + if(sima->flag & SI_PREVSPACE) { + sima->flag &= ~SI_PREVSPACE; + + if(sima->flag & SI_FULLWINDOW) { + sima->flag &= ~SI_FULLWINDOW; + ED_screen_full_prevspace(C, sa); + } + else if(sima->next) { + ED_area_newspace(C, sa, sima->next->spacetype); + ED_area_tag_redraw(sa); + } + } + } + else { + screen_set_image_output(C, event->x, event->y); + } + + return OPERATOR_FINISHED; +} + +void RENDER_OT_view_show(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Show/Hide Render View"; + ot->description= "Toggle show render view"; + ot->idname= "RENDER_OT_view_show"; + + /* api callbacks */ + ot->invoke= render_view_show_invoke; + ot->poll= ED_operator_screenactive; +} diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c new file mode 100644 index 00000000000..5881d50c309 --- /dev/null +++ b/source/blender/editors/render/render_opengl.c @@ -0,0 +1,501 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + * + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include +#include + +#include + +#include "MEM_guardedalloc.h" + +#include "BLI_math.h" +#include "BLI_blenlib.h" +#include "BLI_editVert.h" +#include "BLI_dlrbTree.h" + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" + +#include "BKE_blender.h" +#include "BKE_object.h" +#include "BKE_context.h" +#include "BKE_global.h" +#include "BKE_image.h" +#include "BKE_library.h" +#include "BKE_main.h" +#include "BKE_mesh.h" +#include "BKE_multires.h" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_screen.h" +#include "BKE_utildefines.h" +#include "BKE_writeavi.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_screen.h" +#include "ED_view3d.h" +#include "ED_image.h" + +#include "RE_pipeline.h" +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#include "RNA_access.h" +#include "RNA_define.h" + + +#include "GPU_extensions.h" + +#include "wm_window.h" + +#include "render_intern.h" + +typedef struct OGLRender { + Render *re; + Scene *scene; + + View3D *v3d; + RegionView3D *rv3d; + ARegion *ar; + + Image *ima; + ImageUser iuser; + + GPUOffScreen *ofs; + int sizex, sizey; + + ReportList *reports; + bMovieHandle *mh; + int cfrao, nfra; + + wmTimer *timer; /* use to check if running modal or not (invoke'd or exec'd)*/ +} OGLRender; + +/* added because v3d is not always valid */ +static unsigned int screen_opengl_layers(OGLRender *oglrender) +{ + if(oglrender->v3d) { + return oglrender->scene->lay | oglrender->v3d->lay; + } + else { + return oglrender->scene->lay; + } +} + +static void screen_opengl_render_apply(OGLRender *oglrender) +{ + Scene *scene= oglrender->scene; + ARegion *ar= oglrender->ar; + View3D *v3d= oglrender->v3d; + RegionView3D *rv3d= oglrender->rv3d; + RenderResult *rr; + ImBuf *ibuf; + void *lock; + float winmat[4][4]; + int sizex= oglrender->sizex; + int sizey= oglrender->sizey; + int view_context = (v3d != NULL); + + rr= RE_AcquireResultRead(oglrender->re); + + if(view_context) { + GPU_offscreen_bind(oglrender->ofs); /* bind */ + + /* render 3d view */ + if(rv3d->persp==RV3D_CAMOB && v3d->camera) { + RE_GetCameraWindow(oglrender->re, v3d->camera, scene->r.cfra, winmat); + ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat); + } + else { + ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL); + } + + glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf); + + GPU_offscreen_unbind(oglrender->ofs); /* unbind */ + } + else { + ImBuf *ibuf_view= ED_view3d_draw_offscreen_imbuf_simple(scene, oglrender->sizex, oglrender->sizey, OB_SOLID); + IMB_float_from_rect(ibuf_view); + + memcpy(rr->rectf, ibuf_view->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey); + + IMB_freeImBuf(ibuf_view); + } + + /* rr->rectf is now filled with image data */ + + if((scene->r.stamp & R_STAMP_ALL) && (scene->r.stamp & R_STAMP_DRAW)) + BKE_stamp_buf(scene, NULL, rr->rectf, rr->rectx, rr->recty, 4); + + RE_ReleaseResult(oglrender->re); + + /* update byte from float buffer */ + ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); + if(ibuf) image_buffer_rect_update(NULL, rr, ibuf, NULL); + BKE_image_release_ibuf(oglrender->ima, lock); +} + +static int screen_opengl_render_init(bContext *C, wmOperator *op) +{ + /* new render clears all callbacks */ + Scene *scene= CTX_data_scene(C); + RenderResult *rr; + GPUOffScreen *ofs; + OGLRender *oglrender; + int sizex, sizey; + int view_context= RNA_boolean_get(op->ptr, "view_context"); + + /* ensure we have a 3d view */ + + if(!ED_view3d_context_activate(C)) { + RNA_boolean_set(op->ptr, "view_context", 0); + view_context = 0; + } + + /* only one render job at a time */ + if(WM_jobs_test(CTX_wm_manager(C), scene)) + return 0; + + if(!view_context && scene->camera==NULL) { + BKE_report(op->reports, RPT_ERROR, "Scene has no camera."); + return 0; + } + + /* stop all running jobs, currently previews frustrate Render */ + WM_jobs_stop_all(CTX_wm_manager(C)); + + /* handle UI stuff */ + WM_cursor_wait(1); + + /* create offscreen buffer */ + sizex= (scene->r.size*scene->r.xsch)/100; + sizey= (scene->r.size*scene->r.ysch)/100; + + ofs= GPU_offscreen_create(sizex, sizey); + + if(!ofs) { + BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer."); + return 0; + } + + /* allocate opengl render */ + oglrender= MEM_callocN(sizeof(OGLRender), "OGLRender"); + op->customdata= oglrender; + + oglrender->ofs= ofs; + oglrender->sizex= sizex; + oglrender->sizey= sizey; + oglrender->scene= scene; + + if(view_context) { + oglrender->v3d= CTX_wm_view3d(C); + oglrender->ar= CTX_wm_region(C); + oglrender->rv3d= CTX_wm_region_view3d(C); + } + + /* create image and image user */ + oglrender->ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); + BKE_image_signal(oglrender->ima, NULL, IMA_SIGNAL_FREE); + + oglrender->iuser.scene= scene; + oglrender->iuser.ok= 1; + + /* create render and render result */ + oglrender->re= RE_NewRender(scene->id.name); + RE_InitState(oglrender->re, NULL, &scene->r, NULL, sizex, sizey, NULL); + + rr= RE_AcquireResultWrite(oglrender->re); + if(rr->rectf==NULL) + rr->rectf= MEM_callocN(sizeof(float)*4*sizex*sizey, "screen_opengl_render_init rect"); + RE_ReleaseResult(oglrender->re); + + return 1; +} + +static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) +{ + Scene *scene= oglrender->scene; + + if(oglrender->mh) { + if(BKE_imtype_is_movie(scene->r.imtype)) + oglrender->mh->end_movie(); + } + + if(oglrender->timer) { /* exec will not have a timer */ + scene->r.cfra= oglrender->cfrao; + scene_update_for_newframe(scene, screen_opengl_layers(oglrender)); + + WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), oglrender->timer); + } + + WM_cursor_wait(0); + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene); + + GPU_offscreen_free(oglrender->ofs); + + MEM_freeN(oglrender); +} + +static int screen_opengl_render_cancel(bContext *C, wmOperator *op) +{ + screen_opengl_render_end(C, op->customdata); + + return OPERATOR_CANCELLED; +} + +/* share between invoke and exec */ +static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) +{ + /* initialize animation */ + OGLRender *oglrender; + Scene *scene; + + oglrender= op->customdata; + scene= oglrender->scene; + + oglrender->reports= op->reports; + oglrender->mh= BKE_get_movie_handle(scene->r.imtype); + if(BKE_imtype_is_movie(scene->r.imtype)) { + if(!oglrender->mh->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) { + screen_opengl_render_end(C, oglrender); + return 0; + } + } + + oglrender->cfrao= scene->r.cfra; + oglrender->nfra= SFRA; + scene->r.cfra= SFRA; + + return 1; +} +static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) +{ + OGLRender *oglrender= op->customdata; + Scene *scene= oglrender->scene; + ImBuf *ibuf; + void *lock; + char name[FILE_MAXDIR+FILE_MAXFILE]; + int ok= 0; + int view_context = (oglrender->v3d != NULL); + + /* update animated image textures for gpu, etc, + * call before scene_update_for_newframe so modifiers with textuers dont lag 1 frame */ + ED_image_update_frame(C); + + /* go to next frame */ + while(CFRAnfra) { + unsigned int lay= screen_opengl_layers(oglrender); + + if(lay & 0xFF000000) + lay &= 0xFF000000; + + scene_update_for_newframe(scene, lay); + CFRA++; + } + + scene_update_for_newframe(scene, screen_opengl_layers(oglrender)); + + if(view_context) { + if(oglrender->rv3d->persp==RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { + /* since scene_update_for_newframe() is used rather + * then ED_update_for_newframe() the camera needs to be set */ + if(scene_camera_switch_update(scene)) + oglrender->v3d->camera= scene->camera; + } + } + else { + scene_camera_switch_update(scene); + } + + /* render into offscreen buffer */ + screen_opengl_render_apply(oglrender); + + /* save to disk */ + ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); + + if(ibuf) { + if(BKE_imtype_is_movie(scene->r.imtype)) { + ok= oglrender->mh->append_movie(&scene->r, CFRA, (int*)ibuf->rect, oglrender->sizex, oglrender->sizey, oglrender->reports); + if(ok) { + printf("Append frame %d", scene->r.cfra); + BKE_reportf(op->reports, RPT_INFO, "Appended frame: %d", scene->r.cfra); + } + } + else { + BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION); + ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality); + + if(ok==0) { + printf("Write error: cannot save %s\n", name); + BKE_reportf(op->reports, RPT_ERROR, "Write error: cannot save %s", name); + } + else { + printf("Saved: %s", name); + BKE_reportf(op->reports, RPT_INFO, "Saved file: %s", name); + } + } + } + + BKE_image_release_ibuf(oglrender->ima, lock); + + /* movie stats prints have no line break */ + printf("\n"); + + /* go to next frame */ + oglrender->nfra += scene->r.frame_step; + scene->r.cfra++; + + /* stop at the end or on error */ + if(scene->r.cfra > EFRA || !ok) { + screen_opengl_render_end(C, op->customdata); + return 0; + } + + return 1; +} + + +static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *event) +{ + OGLRender *oglrender= op->customdata; + + int ret; + + switch(event->type) { + case ESCKEY: + /* cancel */ + screen_opengl_render_end(C, op->customdata); + return OPERATOR_FINISHED; + case TIMER: + /* render frame? */ + if(oglrender->timer == event->customdata) + break; + default: + /* nothing to do */ + return OPERATOR_RUNNING_MODAL; + } + + /* run first because screen_opengl_render_anim_step can free oglrender */ + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene); + + ret= screen_opengl_render_anim_step(C, op); + + /* stop at the end or on error */ + if(ret == 0) { + return OPERATOR_FINISHED; + } + + return OPERATOR_RUNNING_MODAL; +} + +static int screen_opengl_render_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + int anim= RNA_boolean_get(op->ptr, "animation"); + + if(!screen_opengl_render_init(C, op)) + return OPERATOR_CANCELLED; + + if(!anim) { + /* render image */ + screen_opengl_render_apply(op->customdata); + screen_opengl_render_end(C, op->customdata); + screen_set_image_output(C, event->x, event->y); + + return OPERATOR_FINISHED; + } + else { + OGLRender *oglrender= op->customdata; + + if(!screen_opengl_render_anim_initialize(C, op)) + return OPERATOR_CANCELLED; + + screen_set_image_output(C, event->x, event->y); + + WM_event_add_modal_handler(C, op); + oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f); + + return OPERATOR_RUNNING_MODAL; + } +} + +/* executes blocking render */ +static int screen_opengl_render_exec(bContext *C, wmOperator *op) +{ + int anim= RNA_boolean_get(op->ptr, "animation"); + + if(!screen_opengl_render_init(C, op)) + return OPERATOR_CANCELLED; + + if(!anim) { /* same as invoke */ + /* render image */ + screen_opengl_render_apply(op->customdata); + screen_opengl_render_end(C, op->customdata); + + return OPERATOR_FINISHED; + } + else { + int ret= 1; + + if(!screen_opengl_render_anim_initialize(C, op)) + return OPERATOR_CANCELLED; + + while(ret) { + ret= screen_opengl_render_anim_step(C, op); + } + } + + // no redraw needed, we leave state as we entered it +// ED_update_for_newframe(C, 1); + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, CTX_data_scene(C)); + + return OPERATOR_FINISHED; +} + +void RENDER_OT_opengl(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "OpenGL Render"; + ot->description= "OpenGL render active viewport"; + ot->idname= "RENDER_OT_opengl"; + + /* api callbacks */ + ot->invoke= screen_opengl_render_invoke; + ot->exec= screen_opengl_render_exec; /* blocking */ + ot->modal= screen_opengl_render_modal; + ot->cancel= screen_opengl_render_cancel; + + ot->poll= ED_operator_screenactive; + + RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); + RNA_def_boolean(ot->srna, "view_context", 1, "View Context", "Use the current 3D view for rendering, else use scene settings."); +} + +/* function for getting an opengl buffer from a View3D, used by sequencer */ +// extern void *sequencer_view3d_cb; diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c index 62fb48c34ff..b1cb1d9c2f1 100644 --- a/source/blender/editors/render/render_ops.c +++ b/source/blender/editors/render/render_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,10 +27,8 @@ #include -#include "DNA_windowmanager_types.h" #include "WM_api.h" -#include "WM_types.h" #include "render_intern.h" // own include @@ -63,6 +61,19 @@ void ED_operatortypes_render(void) WM_operatortype_append(SCENE_OT_render_data_set_quicktime_codec); #endif + WM_operatortype_append(TEXTURE_OT_slot_copy); + WM_operatortype_append(TEXTURE_OT_slot_paste); WM_operatortype_append(TEXTURE_OT_slot_move); + WM_operatortype_append(TEXTURE_OT_envmap_save); + WM_operatortype_append(TEXTURE_OT_envmap_clear); + WM_operatortype_append(TEXTURE_OT_envmap_clear_all); + + /* render_internal.c */ + WM_operatortype_append(RENDER_OT_view_show); + WM_operatortype_append(RENDER_OT_render); + WM_operatortype_append(RENDER_OT_view_cancel); + + /* render_opengl.c */ + WM_operatortype_append(RENDER_OT_opengl); } diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index aca13fbd66d..ae2462b95f8 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -46,12 +46,9 @@ #include "BLI_blenlib.h" #include "BLI_threads.h" -#include "DNA_texture_types.h" #include "DNA_world_types.h" #include "DNA_camera_types.h" -#include "DNA_image_types.h" #include "DNA_material_types.h" -#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_lamp_types.h" #include "DNA_space_types.h" @@ -83,7 +80,6 @@ #include "RE_pipeline.h" -#include "GPU_material.h" #include "WM_api.h" #include "WM_types.h" @@ -100,13 +96,6 @@ #define PR_XMAX 200 #define PR_YMAX 195 -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) -/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */ -#include -extern pthread_key_t gomp_tls_key; -static void *thread_tls_data; -#endif - /* XXX */ static int qtest() {return 0;} /* XXX */ @@ -310,6 +299,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre sce->r.alphamode= R_ADDSKY; sce->r.cfra= scene->r.cfra; + strcpy(sce->r.engine, scene->r.engine); if(id_type==ID_MA) { Material *mat= (Material *)id; @@ -356,7 +346,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre } - if(sp->pr_method==PR_ICON_RENDER) { + if(sp && sp->pr_method==PR_ICON_RENDER) { if (mat->material_type == MA_TYPE_HALO) { sce->lay= 1<nodetree && sp->pr_method==PR_NODE_RENDER) + if(tex && tex->nodetree && sp && sp->pr_method==PR_NODE_RENDER) ntreeInitPreview(tex->nodetree, sp->sizex, sp->sizey); } else if(id_type==ID_LA) { @@ -481,7 +471,7 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int } } - re= RE_GetRender(name, RE_SLOT_DEFAULT); + re= RE_GetRender(name); RE_AcquireResultImage(re, &rres); if(rres.rectf) { @@ -709,7 +699,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa) ri->status= 0; sprintf(name, "View3dPreview %p", sa); - re= ri->re= RE_NewRender(name, RE_SLOT_DEFAULT); + re= ri->re= RE_NewRender(name); //RE_display_draw_cb(re, view3d_previewrender_progress); //RE_stats_draw_cb(re, view3d_previewrender_stats); //RE_test_break_cb(re, qtest); @@ -759,11 +749,10 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa) /* allow localview render for objects with lights in normal layers */ if(v3d->lay & 0xFF000000) - scene->lay |= v3d->lay; - else scene->lay= v3d->lay; + lay |= v3d->lay; + else lay= v3d->lay; - RE_Database_FromScene(re, scene, 0); // 0= dont use camera view - scene->lay= lay; + RE_Database_FromScene(re, scene, lay, 0); // 0= dont use camera view rstats= RE_GetStats(re); if(rstats->convertdone) @@ -792,7 +781,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa) /* OK, can we enter render code? */ if(ri->status==(PR_DISPRECT|PR_DBASE|PR_PROJECTED|PR_ROTATED)) { //printf("curtile %d tottile %d\n", ri->curtile, ri->tottile); - RE_TileProcessor(ri->re, ri->curtile, 0); + RE_TileProcessor(ri->re); //, ri->curtile, 0); if(ri->rect==NULL) ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "preview view3d rect"); @@ -897,11 +886,11 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs if(!split || first) sprintf(name, "Preview %p", sp->owner); else sprintf(name, "SecondPreview %p", sp->owner); - re= RE_GetRender(name, RE_SLOT_DEFAULT); + re= RE_GetRender(name); /* full refreshed render from first tile */ if(re==NULL) - re= RE_NewRender(name, RE_SLOT_DEFAULT); + re= RE_NewRender(name); /* sce->r gets copied in RE_InitState! */ sce->r.scemode &= ~(R_MATNODE_PREVIEW|R_TEXNODE_PREVIEW); @@ -909,6 +898,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs if(sp->pr_method==PR_ICON_RENDER) { sce->r.scemode |= R_NO_IMAGE_LOAD; + sce->r.mode |= R_OSA; } else if(sp->pr_method==PR_NODE_RENDER) { if(idtype == ID_MA) sce->r.scemode |= R_MATNODE_PREVIEW; @@ -927,10 +917,12 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs else sizex= sp->sizex; /* allocates or re-uses render result */ - RE_InitState(re, NULL, &sce->r, NULL, sizex, sp->sizey, NULL); + sce->r.xsch= sizex; + sce->r.ysch= sp->sizey; + sce->r.size= 100; /* callbacs are cleared on GetRender() */ - if(sp->pr_method==PR_BUTS_RENDER) { + if(ELEM(sp->pr_method, PR_BUTS_RENDER, PR_NODE_RENDER)) { RE_display_draw_cb(re, sp, shader_preview_draw); RE_test_break_cb(re, sp, shader_preview_break); } @@ -940,10 +932,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs ((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sizex; /* entire cycle for render engine */ - RE_SetCamera(re, sce->camera); - RE_Database_FromScene(re, sce, 1); - RE_TileProcessor(re, 0, 1); // actual render engine - RE_Database_Free(re); + RE_PreviewRender(re, sce); ((Camera *)sce->camera->data)->lens= oldlens; @@ -1101,15 +1090,10 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat /* use same function for icon & shader, so the job manager does not run two of them at the same time. */ -static void common_preview_startjob(void *customdata, short *stop, short *do_update) +static void common_preview_startjob(void *customdata, short *stop, short *do_update, float *progress) { ShaderPreview *sp= customdata; -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - pthread_setspecific (gomp_tls_key, thread_tls_data); -#endif - if(sp->pr_method == PR_ICON_RENDER) icon_preview_startjob(customdata, stop, do_update); else @@ -1123,7 +1107,7 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r wmJob *steve; ShaderPreview *sp; - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, WM_JOB_EXCL_RENDER); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER); sp= MEM_callocN(sizeof(ShaderPreview), "shader preview"); /* customdata for preview thread */ @@ -1138,13 +1122,8 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r /* setup job */ WM_jobs_customdata(steve, sp, shader_preview_free); WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL); - WM_jobs_callbacks(steve, common_preview_startjob, NULL, NULL); + WM_jobs_callbacks(steve, common_preview_startjob, NULL, NULL, NULL); -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - thread_tls_data = pthread_getspecific(gomp_tls_key); -#endif - WM_jobs_start(CTX_wm_manager(C), steve); } @@ -1153,7 +1132,7 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M wmJob *steve; ShaderPreview *sp; - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, WM_JOB_EXCL_RENDER); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Shader Preview", WM_JOB_EXCL_RENDER); sp= MEM_callocN(sizeof(ShaderPreview), "shader preview"); /* customdata for preview thread */ @@ -1169,14 +1148,15 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M /* setup job */ WM_jobs_customdata(steve, sp, shader_preview_free); WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL); - WM_jobs_callbacks(steve, common_preview_startjob, NULL, shader_preview_updatejob); - -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - thread_tls_data = pthread_getspecific(gomp_tls_key); -#endif + WM_jobs_callbacks(steve, common_preview_startjob, NULL, shader_preview_updatejob, NULL); WM_jobs_start(CTX_wm_manager(C), steve); } +void ED_preview_kill_jobs(const struct bContext *C) +{ + wmWindowManager *wm= CTX_wm_manager(C); + if(wm) + WM_jobs_kill(wm, NULL, common_preview_startjob); +} diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 54c9df38add..f96e82a30f4 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,27 +32,34 @@ #include "DNA_curve_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" -#include "DNA_meshdata_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" +#include "DNA_space_types.h" #include "DNA_world_types.h" +#include "BKE_animsys.h" #include "BKE_context.h" #include "BKE_depsgraph.h" #include "BKE_font.h" +#include "BKE_global.h" #include "BKE_icons.h" +#include "BKE_image.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_node.h" +#include "BKE_report.h" #include "BKE_scene.h" #include "BKE_texture.h" #include "BKE_utildefines.h" #include "BKE_world.h" #include "BKE_tessmesh.h" +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" + +#include "BLI_blenlib.h" #include "BLI_math.h" #include "BLI_editVert.h" #include "BLI_listbase.h" @@ -60,20 +67,16 @@ #include "GPU_material.h" #include "RNA_access.h" -#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" #include "ED_curve.h" #include "ED_mesh.h" -#include "ED_render.h" -#include "RNA_access.h" #include "RNA_define.h" #include "UI_interface.h" -#include "UI_resources.h" #include "render_intern.h" // own include @@ -194,6 +197,19 @@ static void world_changed(Main *bmain, World *wo) GPU_material_free(ma); } +static void image_changed(Main *bmain, Image *ima) +{ + Tex *tex; + + /* icons */ + BKE_icon_changed(BKE_icon_getid(&ima->id)); + + /* textures */ + for(tex=bmain->tex.first; tex; tex=tex->id.next) + if(tex->ima == ima) + texture_changed(bmain, tex); +} + void ED_render_id_flush_update(Main *bmain, ID *id) { if(!id) @@ -212,6 +228,9 @@ void ED_render_id_flush_update(Main *bmain, ID *id) case ID_LA: lamp_changed(bmain, (Lamp*)id); break; + case ID_IM: + image_changed(bmain, (Image*)id); + break; default: break; } @@ -305,7 +324,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *op) } else if(ob->type == OB_FONT) { EditFont *ef= ((Curve*)ob->data)->editfont; - int i, selstart, selend; + int i, selstart, selend; if(ef && BKE_font_getselection(ob, &selstart, &selend)) { for(i=selstart; i<=selend; i++) @@ -314,8 +333,8 @@ static int material_slot_assign_exec(bContext *C, wmOperator *op) } } - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data); + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data); return OPERATOR_FINISHED; } @@ -395,7 +414,7 @@ static int material_slot_de_select(bContext *C, int select) } } - WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data); + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data); return OPERATOR_FINISHED; } @@ -693,6 +712,7 @@ void SCENE_OT_render_layer_remove(wmOperatorType *ot) static int texture_slot_move(bContext *C, wmOperator *op) { ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data; + Material *ma = (Material *)id; if(id) { MTex **mtex_ar, *mtexswap; @@ -706,6 +726,10 @@ static int texture_slot_move(bContext *C, wmOperator *op) mtexswap = mtex_ar[act]; mtex_ar[act] = mtex_ar[act-1]; mtex_ar[act-1] = mtexswap; + + BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act-1, -1, 0); + BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act, act-1, 0); + BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, -1, act, 0); if(GS(id->name)==ID_MA) { Material *ma= (Material *)id; @@ -715,7 +739,7 @@ static int texture_slot_move(bContext *C, wmOperator *op) ma->septex &= ~(1<<(act-1)); ma->septex |= mtexuse >> 1; } - + set_active_mtex(id, act-1); } } @@ -724,6 +748,10 @@ static int texture_slot_move(bContext *C, wmOperator *op) mtexswap = mtex_ar[act]; mtex_ar[act] = mtex_ar[act+1]; mtex_ar[act+1] = mtexswap; + + BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act+1, -1, 0); + BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act, act+1, 0); + BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, -1, act, 0); if(GS(id->name)==ID_MA) { Material *ma= (Material *)id; @@ -733,7 +761,7 @@ static int texture_slot_move(bContext *C, wmOperator *op) ma->septex &= ~(1<<(act+1)); ma->septex |= mtexuse << 1; } - + set_active_mtex(id, act+1); } } @@ -768,6 +796,201 @@ void TEXTURE_OT_slot_move(wmOperatorType *ot) +/********************** environment map operators *********************/ + +static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int imtype) +{ + ImBuf *ibuf=NULL; + int dx; + int retval; + + if(env->cube[1]==NULL) { + BKE_report(op->reports, RPT_ERROR, "There is no generated environment map available to save"); + return OPERATOR_CANCELLED; + } + + dx= env->cube[1]->x; + + if (env->type == ENV_CUBE) { + ibuf = IMB_allocImBuf(3*dx, 2*dx, 24, IB_rectfloat, 0); + + IMB_rectcpy(ibuf, env->cube[0], 0, 0, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[1], dx, 0, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[2], 2*dx, 0, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[3], 0, dx, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[4], dx, dx, 0, 0, dx, dx); + IMB_rectcpy(ibuf, env->cube[5], 2*dx, dx, 0, 0, dx, dx); + } + else if (env->type == ENV_PLANE) { + ibuf = IMB_allocImBuf(dx, dx, 24, IB_rectfloat, 0); + IMB_rectcpy(ibuf, env->cube[1], 0, 0, 0, 0, dx, dx); + } + + if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) + ibuf->profile = IB_PROFILE_LINEAR_RGB; + + if (BKE_write_ibuf(scene, ibuf, str, imtype, scene->r.subimtype, scene->r.quality)) { + retval = OPERATOR_FINISHED; + } + else { + BKE_reportf(op->reports, RPT_ERROR, "Error saving environment map to %s.", str); + retval = OPERATOR_CANCELLED; + } + + IMB_freeImBuf(ibuf); + ibuf = NULL; + + return retval; +} + +static int envmap_save_exec(bContext *C, wmOperator *op) +{ + Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + Scene *scene = CTX_data_scene(C); + //int imtype = RNA_enum_get(op->ptr, "file_type"); + int imtype = scene->r.imtype; + char path[FILE_MAX]; + + RNA_string_get(op->ptr, "filepath", path); + + if(scene->r.scemode & R_EXTENSION) { + BKE_add_image_extension(path, imtype); + } + + WM_cursor_wait(1); + + save_envmap(op, scene, tex->env, path, imtype); + + WM_cursor_wait(0); + + WM_event_add_notifier(C, NC_TEXTURE, tex); + + return OPERATOR_FINISHED; +} + +static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + //Scene *scene= CTX_data_scene(C); + + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "filepath")) + return envmap_save_exec(C, op); + + //RNA_enum_set(op->ptr, "file_type", scene->r.imtype); + + RNA_string_set(op->ptr, "filepath", G.sce); + WM_event_add_fileselect(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +static int envmap_save_poll(bContext *C) +{ + Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + + if (!tex) + return 0; + if (!tex->env || !tex->env->ok) + return 0; + if (tex->env->cube[1]==NULL) + return 0; + + return 1; +} + +void TEXTURE_OT_envmap_save(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Save Environment Map"; + ot->idname= "TEXTURE_OT_envmap_save"; + ot->description="Save the current generated Environment map to an image file"; + + /* api callbacks */ + ot->exec= envmap_save_exec; + ot->invoke= envmap_save_invoke; + ot->poll= envmap_save_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + //RNA_def_enum(ot->srna, "file_type", image_file_type_items, R_PNG, "File Type", "File type to save image as."); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); +} + +static int envmap_clear_exec(bContext *C, wmOperator *op) +{ + Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + + BKE_free_envmapdata(tex->env); + + WM_event_add_notifier(C, NC_TEXTURE|NA_EDITED, tex); + + return OPERATOR_FINISHED; +} + +static int envmap_clear_poll(bContext *C) +{ + Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + + if (!tex) + return 0; + if (!tex->env || !tex->env->ok) + return 0; + if (tex->env->cube[1]==NULL) + return 0; + + return 1; +} + +void TEXTURE_OT_envmap_clear(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Clear Environment Map"; + ot->idname= "TEXTURE_OT_envmap_clear"; + ot->description="Discard the environment map and free it from memory"; + + /* api callbacks */ + ot->exec= envmap_clear_exec; + ot->poll= envmap_clear_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int envmap_clear_all_exec(bContext *C, wmOperator *op) +{ + Main *bmain = CTX_data_main(C); + Tex *tex; + + for (tex=bmain->tex.first; tex; tex=tex->id.next) + if (tex->env) + BKE_free_envmapdata(tex->env); + + WM_event_add_notifier(C, NC_TEXTURE|NA_EDITED, tex); + + return OPERATOR_FINISHED; +} + +void TEXTURE_OT_envmap_clear_all(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Clear All Environment Maps"; + ot->idname= "TEXTURE_OT_envmap_clear_all"; + ot->description="Discard all environment maps in the .blend file and free them from memory"; + + /* api callbacks */ + ot->exec= envmap_clear_all_exec; + ot->poll= envmap_clear_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/********************** material operators *********************/ + /* material copy/paste */ static int copy_material_exec(bContext *C, wmOperator *op) { @@ -816,7 +1039,7 @@ void MATERIAL_OT_paste(wmOperatorType *ot) /* identifiers */ ot->name= "Paste Material"; ot->idname= "MATERIAL_OT_paste"; - ot->description="Copy the material settings and nodes"; + ot->description="Paste the material settings and nodes"; /* api callbacks */ ot->exec= paste_material_exec; @@ -824,3 +1047,155 @@ void MATERIAL_OT_paste(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + + +static short mtexcopied=0; /* must be reset on file load */ +static MTex mtexcopybuf; + +void ED_render_clear_mtex_copybuf(void) +{ /* use for file reload */ + mtexcopied= 0; +} + +void copy_mtex_copybuf(ID *id) +{ + MTex **mtex= NULL; + + switch(GS(id->name)) { + case ID_MA: + mtex= &(((Material *)id)->mtex[(int)((Material *)id)->texact]); + break; + case ID_LA: + mtex= &(((Lamp *)id)->mtex[(int)((Lamp *)id)->texact]); + // la->mtex[(int)la->texact] // TODO + break; + case ID_WO: + mtex= &(((World *)id)->mtex[(int)((World *)id)->texact]); + // mtex= wrld->mtex[(int)wrld->texact]; // TODO + break; + } + + if(mtex && *mtex) { + memcpy(&mtexcopybuf, *mtex, sizeof(MTex)); + mtexcopied= 1; + } + else { + mtexcopied= 0; + } +} + +void paste_mtex_copybuf(ID *id) +{ + MTex **mtex= NULL; + + if(mtexcopied == 0 || mtexcopybuf.tex==NULL) + return; + + switch(GS(id->name)) { + case ID_MA: + mtex= &(((Material *)id)->mtex[(int)((Material *)id)->texact]); + break; + case ID_LA: + mtex= &(((Lamp *)id)->mtex[(int)((Lamp *)id)->texact]); + // la->mtex[(int)la->texact] // TODO + break; + case ID_WO: + mtex= &(((World *)id)->mtex[(int)((World *)id)->texact]); + // mtex= wrld->mtex[(int)wrld->texact]; // TODO + break; + } + + if(mtex) { + if(*mtex==NULL) { + *mtex= MEM_mallocN(sizeof(MTex), "mtex copy"); + } + else if((*mtex)->tex) { + (*mtex)->tex->id.us--; + } + + memcpy(*mtex, &mtexcopybuf, sizeof(MTex)); + + id_us_plus((ID *)mtexcopybuf.tex); + } +} + + +static int copy_mtex_exec(bContext *C, wmOperator *op) +{ + ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data; + + if(id==NULL) { + /* copying empty slot */ + ED_render_clear_mtex_copybuf(); + return OPERATOR_CANCELLED; + } + + copy_mtex_copybuf(id); + + WM_event_add_notifier(C, NC_TEXTURE, NULL); + + return OPERATOR_FINISHED; +} + +static int copy_mtex_poll(bContext *C) +{ + ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data; + + return (id != NULL); +} + +void TEXTURE_OT_slot_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Texture Slot Settings"; + ot->idname= "TEXTURE_OT_slot_copy"; + ot->description="Copy the material texture settings and nodes"; + + /* api callbacks */ + ot->exec= copy_mtex_exec; + ot->poll= copy_mtex_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int paste_mtex_exec(bContext *C, wmOperator *op) +{ + ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data; + + if(id==NULL) { + Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data; + Lamp *la= CTX_data_pointer_get_type(C, "lamp", &RNA_Lamp).data; + World *wo= CTX_data_pointer_get_type(C, "world", &RNA_World).data; + + if (ma) + id = &ma->id; + else if (la) + id = &la->id; + else if (wo) + id = &wo->id; + + if (id==NULL) + return OPERATOR_CANCELLED; + } + + paste_mtex_copybuf(id); + + WM_event_add_notifier(C, NC_TEXTURE|ND_SHADING_DRAW, NULL); + + return OPERATOR_FINISHED; +} + +void TEXTURE_OT_slot_paste(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Paste Texture Slot Settings"; + ot->idname= "TEXTURE_OT_slot_paste"; + ot->description="Copy the texture settings and nodes"; + + /* api callbacks */ + ot->exec= paste_mtex_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt index 5708ab6684d..f9b5ceba0e4 100644 --- a/source/blender/editors/screen/CMakeLists.txt +++ b/source/blender/editors/screen/CMakeLists.txt @@ -1,13 +1,10 @@ # $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ -# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** +# ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. The Blender -# Foundation also sells licenses for use in proprietary software under -# the Blender License. See http://www.blender.org/BL/ for information -# about this. +# of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,61 +15,27 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# # Contributor(s): Jacques Beaurain. # -# ***** END GPL/BL DUAL LICENSE BLOCK ***** +# ***** END GPL LICENSE BLOCK ***** -FILE(GLOB SRC */*.c) +FILE(GLOB SRC *.c) -SET(INC ../../windowmanager - ../../editors/include - ../../../../intern/guardedalloc ../../../../intern/memutil - ../../blenlib ../../makesdna ../../makesrna ../../blenkernel - ../../include ../../imbuf - ../../render/extern/include ../../../../intern/bsp/extern - ../../../intern/decimation/extern ../../blenloader - ../../../kernel/gen_system ../../readstreamglue - ../../../../intern/elbeem/extern - ../../../../intern/ghost ../../../../intern/opennl/extern - ../../nodes +SET(INC + ../../blenfont + ../../blenkernel + ../../blenlib + ../../bmesh + ../../imbuf + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager ) -IF(WITH_INTERNATIONAL) - ADD_DEFINITIONS(-DINTERNATIONAL) -ENDIF(WITH_INTERNATIONAL) - -IF(WITH_OPENEXR) - ADD_DEFINITIONS(-DWITH_OPENEXR) -ENDIF(WITH_OPENEXR) - -IF(WITH_QUICKTIME) - SET(INC ${INC} ../../quicktime ${QUICKTIME_INC}) - ADD_DEFINITIONS(-DWITH_QUICKTIME) -ENDIF(WITH_QUICKTIME) - -IF(WITH_FFMPEG) - SET(INC ${INC} ${FFMPEG_INC}) - ADD_DEFINITIONS(-DWITH_FFMPEG) -ENDIF(WITH_FFMPEG) - -IF(WITH_PYTHON) - SET(INC ${INC} ../../python ${PYTHON_INC}) -ELSE(WITH_PYTHON) - ADD_DEFINITIONS(-DDISABLE_PYTHON) -ENDIF(WITH_PYTHON) - IF(WIN32) SET(INC ${INC} ${PTHREADS_INC}) ENDIF(WIN32) -IF(WITH_BUILDINFO) - ADD_DEFINITIONS(-DNAN_BUILDINFO) -ENDIF(WITH_BUILDINFO) - -BLENDERLIB_NOLIST(bf_editors "${SRC}" "${INC}") - +BLENDERLIB(bf_editor_screen "${SRC}" "${INC}") diff --git a/source/blender/editors/screen/SConscript b/source/blender/editors/screen/SConscript index 1b5a33e12be..5ce15cf5472 100644 --- a/source/blender/editors/screen/SConscript +++ b/source/blender/editors/screen/SConscript @@ -4,17 +4,12 @@ Import ('env') sources = env.Glob('*.c') incs = '../include ../../blenlib ../../blenkernel ../../blenfont ../../makesdna ../../imbuf' -incs += ' ../../blenloader ../../windowmanager ../../python ../../makesrna ../../gpu' +incs += ' ../../blenloader ../../windowmanager ../../makesrna ../../gpu' incs += ' ../../render/extern/include ../../bmesh' incs += ' #/intern/guardedalloc #/extern/glew/include' defs = '' -if not env['WITH_BF_PYTHON']: - defs += 'DISABLE_PYTHON' -if env['WITH_BF_OPENEXR']: - defs += ' WITH_OPENEXR' - if env['OURPLATFORM'] == 'linux2': cflags='-pthread' incs += ' ../../../extern/binreloc/include' @@ -22,8 +17,4 @@ if env['OURPLATFORM'] == 'linux2': if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] -if env['OURPLATFORM'] == 'darwin': - if env['WITH_BF_OPENMP']: - defs += ' PARALLEL=1' - env.BlenderLib ( 'bf_editors_screen', sources, Split(incs), Split(defs), libtype=['core'], priority=[105] ) diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 9069b4b6244..fa7064b817d 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,7 +31,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_screen_types.h" #include "DNA_userdef_types.h" #include "BLI_blenlib.h" @@ -50,6 +49,7 @@ #include "ED_screen.h" #include "ED_screen_types.h" #include "ED_types.h" +#include "ED_fileselect.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -59,10 +59,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#ifndef DISABLE_PYTHON -#include "BPY_extern.h" -#endif - #include "screen_intern.h" /* general area and region code */ @@ -125,12 +121,12 @@ void ED_region_do_listen(ARegion *ar, wmNotifier *note) case NC_SCREEN: if(note->action==NA_EDITED) ED_region_tag_redraw(ar); - /* pass on */ + break; #endif - default: - if(ar->type && ar->type->listener) - ar->type->listener(ar, note); } + + if(ar->type && ar->type->listener) + ar->type->listener(ar, note); } /* only exported for WM */ @@ -181,14 +177,18 @@ static void area_draw_azone(short x1, short y1, short x2, short y2) float dx= 0.3f*(xmax-xmin); float dy= 0.3f*(ymax-ymin); - glColor4ub(255, 255, 255, 80); + glColor4ub(255, 255, 255, 180); fdrawline(xmin, ymax, xmax, ymin); + glColor4ub(255, 255, 255, 130); fdrawline(xmin, ymax-dy, xmax-dx, ymin); + glColor4ub(255, 255, 255, 80); fdrawline(xmin, ymax-2*dy, xmax-2*dx, ymin); - glColor4ub(0, 0, 0, 150); + glColor4ub(0, 0, 0, 210); fdrawline(xmin, ymax+1, xmax+1, ymin); + glColor4ub(0, 0, 0, 180); fdrawline(xmin, ymax-dy+1, xmax-dx+1, ymin); + glColor4ub(0, 0, 0, 150); fdrawline(xmin, ymax-2*dy+1, xmax-2*dx+1, ymin); } @@ -340,9 +340,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar) /* optional header info instead? */ if(ar->headerstr) { - float col[3]; - UI_GetThemeColor3fv(TH_HEADER, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_HEADER); glClear(GL_COLOR_BUFFER_BIT); UI_ThemeColor(TH_TEXT); @@ -373,17 +371,23 @@ void ED_region_tag_redraw(ARegion *ar) { if(ar) { /* zero region means full region redraw */ - ar->do_draw= 1; + ar->do_draw= RGN_DRAW; memset(&ar->drawrct, 0, sizeof(ar->drawrct)); } } +void ED_region_tag_redraw_overlay(ARegion *ar) +{ + if(ar) + ar->do_draw_overlay= RGN_DRAW; +} + void ED_region_tag_redraw_partial(ARegion *ar, rcti *rct) { if(ar) { if(!ar->do_draw) { /* no redraw set yet, set partial region */ - ar->do_draw= 1; + ar->do_draw= RGN_DRAW_PARTIAL; ar->drawrct= *rct; } else if(ar->drawrct.xmin != ar->drawrct.xmax) { @@ -908,7 +912,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa) if(ar->swinid) { /* default region handlers */ ed_default_handlers(wm, &ar->handlers, ar->type->keymapflag); - + /* own handlers */ if(ar->type->init) ar->type->init(wm, ar); } @@ -956,6 +960,7 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space) { SpaceType *st; ARegion *ar; + int spacetype= sa1->spacetype; sa1->headertype= sa2->headertype; sa1->spacetype= sa2->spacetype; @@ -983,7 +988,7 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space) } else { if(swap_space<2) { - st= BKE_spacetype_from_id(sa1->spacetype); + st= BKE_spacetype_from_id(spacetype); for(ar= sa1->regionbase.first; ar; ar= ar->next) BKE_area_region_free(st, ar); BLI_freelistN(&sa1->regionbase); @@ -1006,10 +1011,6 @@ void ED_area_swapspace(bContext *C, ScrArea *sa1, ScrArea *sa2) ED_area_exit(C, sa1); ED_area_exit(C, sa2); - tmp->spacetype= sa1->spacetype; - tmp->butspacetype= sa1->butspacetype; - BKE_spacedata_copyfirst(&tmp->spacedata, &sa1->spacedata); - area_copy_data(tmp, sa1, 2); area_copy_data(sa1, sa2, 0); area_copy_data(sa2, tmp, 0); @@ -1098,6 +1099,13 @@ void ED_area_prevspace(bContext *C, ScrArea *sa) { SpaceLink *sl = (sa) ? sa->spacedata.first : CTX_wm_space_data(C); + /* Special handling of filebrowser to stop background thread for + thumbnail creation - don't want to waste cpu resources if not showing + the filebrowser */ + if (sl->spacetype == SPACE_FILE) { + ED_fileselect_exit(C, (SpaceFile*)sl); + } + if(sl->next) { /* workaround for case of double prevspace, render window with a file browser on top of it */ @@ -1221,7 +1229,6 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex Panel *panel; View2D *v2d= &ar->v2d; View2DScrollers *scrollers; - float col[3]; int xco, yco, x, y, miny=0, w, em, header, triangle, open, newcontext= 0; if(contextnr >= 0) @@ -1327,14 +1334,9 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex } /* clear */ - if (ar->type->regionid == RGN_TYPE_PREVIEW) - UI_GetThemeColor3fv(TH_PREVIEW_BACK, col); - else - UI_GetThemeColor3fv(TH_BACK, col); - - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor((ar->type->regionid == RGN_TYPE_PREVIEW)?TH_PREVIEW_BACK:TH_BACK); glClear(GL_COLOR_BUFFER_BIT); - + /* before setting the view */ if(vertical) { /* only allow scrolling in vertical direction */ @@ -1411,16 +1413,10 @@ void ED_region_header(const bContext *C, ARegion *ar) uiLayout *layout; HeaderType *ht; Header header = {0}; - float col[3]; int maxco, xco, yco; - /* clear */ - if(ED_screen_area_active(C)) - UI_GetThemeColor3fv(TH_HEADER, col); - else - UI_GetThemeColor3fv(TH_HEADERDESEL, col); - - glClearColor(col[0], col[1], col[2], 0.0); + /* clear */ + UI_ThemeClearColor((ED_screen_area_active(C))?TH_HEADER:TH_HEADERDESEL); glClear(GL_COLOR_BUFFER_BIT); /* set view2d view matrix for scrolling (without scrollers) */ diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index 2b55fc2ca6d..06da91c3e37 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -32,7 +32,6 @@ #include "MEM_guardedalloc.h" #include "DNA_vec_types.h" -#include "DNA_listBase.h" #include "BKE_utildefines.h" #include "BKE_colortools.h" @@ -428,10 +427,9 @@ void glaDrawPixelsTexScaled(float x, float y, int img_w, int img_h, int format, int ltexid= glaGetOneInteger(GL_TEXTURE_2D); int lrowlength= glaGetOneInteger(GL_UNPACK_ROW_LENGTH); int subpart_x, subpart_y, tex_w, tex_h; + int seamless, offset_x, offset_y, nsubparts_x, nsubparts_y; int texid= get_cached_work_texture(&tex_w, &tex_h); - int nsubparts_x= (img_w+(tex_w-1))/tex_w; - int nsubparts_y= (img_h+(tex_h-1))/tex_h; - + /* Specify the color outside this function, and tex will modulate it. * This is useful for changing alpha without using glPixelTransferf() */ @@ -448,31 +446,67 @@ void glaDrawPixelsTexScaled(float x, float y, int img_w, int img_h, int format, glPixelZoom(1.f, 1.f); #endif + /* setup seamless 2=on, 0=off */ + seamless= ((tex_w2 && tex_h>2)? 2: 0; + + offset_x= tex_w - seamless; + offset_y= tex_h - seamless; + + nsubparts_x= (img_w + (offset_x - 1))/(offset_x); + nsubparts_y= (img_h + (offset_y - 1))/(offset_y); + for (subpart_y=0; subpart_ytex_w)? 1: 0; + int offset_top= (seamless && remainder_y>tex_h)? 1: 0; + float rast_x= x+subpart_x*offset_x*xzoom; + float rast_y= y+subpart_y*offset_y*yzoom; - if(format==GL_FLOAT) - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_FLOAT, &f_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]); - else - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_UNSIGNED_BYTE, &uc_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]); - + /* check if we already got these because we always get 2 more when doing seamless*/ + if(subpart_w<=seamless || subpart_h<=seamless) + continue; + + if(format==GL_FLOAT) { + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_FLOAT, &f_rect[subpart_y*offset_y*img_w*4 + subpart_x*offset_x*4]); + + /* add an extra border of pixels so linear looks ok at edges of full image. */ + if(subpart_wid); return 1; } + else if(CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) { + int visible_objects= CTX_data_equals(member, "visible_objects"); + + for(base=scene->base.first; base; base=base->next) { + if(((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) && (base->lay & scene->lay)) { + if(visible_objects) + CTX_data_id_list_add(result, &base->object->id); + else + CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); + } + } + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); + return 1; + } else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) { int selected_objects= CTX_data_equals(member, "selected_objects"); @@ -87,7 +104,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } else if(CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) { @@ -105,7 +122,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } else if(CTX_data_equals(member, "visible_bones") || CTX_data_equals(member, "editable_bones")) { @@ -146,7 +163,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } } @@ -188,7 +205,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } } @@ -203,7 +220,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan); } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } } @@ -219,7 +236,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan); } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } } @@ -304,6 +321,43 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult return 1; } + else if(CTX_data_equals(member, "sequences")) { + Editing *ed= seq_give_editing(scene, FALSE); + if(ed) { + Sequence *seq; + for (seq= ed->seqbasep->first; seq; seq= seq->next) { + CTX_data_list_add(result, &scene->id, &RNA_Sequence, seq); + } + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); + return 1; + } + } + else if(CTX_data_equals(member, "selected_sequences")) { + Editing *ed= seq_give_editing(scene, FALSE); + if(ed) { + Sequence *seq; + for (seq= ed->seqbasep->first; seq; seq= seq->next) { + if (seq->flag & SELECT) { + CTX_data_list_add(result, &scene->id, &RNA_Sequence, seq); + } + } + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); + return 1; + } + } + else if(CTX_data_equals(member, "selected_editable_sequences")) { + Editing *ed= seq_give_editing(scene, FALSE); + if(ed) { + Sequence *seq; + for (seq= ed->seqbasep->first; seq; seq= seq->next) { + if (seq->flag & SELECT && !(seq->flag & SEQ_LOCK)) { + CTX_data_list_add(result, &scene->id, &RNA_Sequence, seq); + } + } + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); + return 1; + } + } else { return 0; /* not found */ } diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index d19d017a637..a3f97a7c5ce 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,10 +28,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_vec_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_texture_types.h" #include "DNA_userdef_types.h" #include "BLI_blenlib.h" @@ -52,6 +49,7 @@ #include "WM_types.h" #include "ED_image.h" +#include "ED_view3d.h" #include "ED_screen.h" #include "ED_screen_types.h" @@ -1234,11 +1232,17 @@ void ED_screen_set_subwinactive(wmWindow *win, wmEvent *event) int ED_screen_area_active(const bContext *C) { + wmWindow *win= CTX_wm_window(C); bScreen *sc= CTX_wm_screen(C); ScrArea *sa= CTX_wm_area(C); - if(sc && sa) { + if(win && sc && sa) { + AZone *az= is_in_area_actionzone(sa, win->eventstate->x, win->eventstate->y); ARegion *ar; + + if (az && az->type == AZONE_REGION) + return 1; + for(ar= sa->regionbase.first; ar; ar= ar->next) if(ar->swinid == sc->subwinactive) return 1; @@ -1390,6 +1394,9 @@ void ED_screen_set_scene(bContext *C, Scene *scene) while(sl) { if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; + + BKE_screen_view3d_sync(v3d, scene); + if (!v3d->camera || !object_in_scene(v3d->camera, scene)) { v3d->camera= scene_find_camera(sc->scene); // XXX if (sc==curscreen) handle_view3d_lock(); @@ -1441,112 +1448,6 @@ void ED_screen_delete_scene(bContext *C, Scene *scene) unlink_scene(bmain, scene, newscene); } -/* this function toggles: if area is full then the parent will be restored */ -ScrArea *ed_screen_fullarea(bContext *C, wmWindow *win, ScrArea *sa) -{ - bScreen *sc, *oldscreen; - ARegion *ar; - - if(sa) { - /* ensure we don't have a button active anymore, can crash when - switching screens with tooltip open because region and tooltip - are no longer in the same screen */ - for(ar=sa->regionbase.first; ar; ar=ar->next) - uiFreeBlocks(C, &ar->uiblocks); - } - - if(sa && sa->full) { - short fulltype; - - sc= sa->full; /* the old screen to restore */ - oldscreen= win->screen; /* the one disappearing */ - - fulltype = sc->full; - - /* refuse to go out of SCREENAUTOPLAY as long as G_FLAGS_AUTOPLAY - is set */ - - if (fulltype != SCREENAUTOPLAY || (G.flags & G_FILE_AUTOPLAY) == 0) { - ScrArea *old; - - sc->full= 0; - - /* find old area */ - for(old= sc->areabase.first; old; old= old->next) - if(old->full) break; - if(old==NULL) { - if (G.f & G_DEBUG) - printf("something wrong in areafullscreen\n"); - return NULL; - } - // old feature described below (ton) - // in autoplay screens the headers are disabled by - // default. So use the old headertype instead - - area_copy_data(old, sa, 1); /* 1 = swap spacelist */ - if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO; - old->full= NULL; - - /* animtimer back */ - sc->animtimer= oldscreen->animtimer; - oldscreen->animtimer= NULL; - - ED_screen_set(C, sc); - - free_screen(oldscreen); - free_libblock(&CTX_data_main(C)->screen, oldscreen); - } - } - else { - ScrArea *newa; - char newname[20]; - - oldscreen= win->screen; - - /* nothing wrong with having only 1 area, as far as I can see... - // is there only 1 area? - if(oldscreen->areabase.first==oldscreen->areabase.last) - return NULL; - */ - - oldscreen->full = SCREENFULL; - BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "temp"); - sc= ED_screen_add(win, oldscreen->scene, newname); - sc->full = SCREENFULL; // XXX - - /* timer */ - sc->animtimer= oldscreen->animtimer; - oldscreen->animtimer= NULL; - - /* returns the top small area */ - newa= area_split(win, sc, (ScrArea *)sc->areabase.first, 'h', 0.99f); - ED_area_newspace(C, newa, SPACE_INFO); - - /* use random area when we have no active one, e.g. when the - mouse is outside of the window and we open a file browser */ - if(!sa) - sa= oldscreen->areabase.first; - - /* copy area */ - newa= newa->prev; - area_copy_data(newa, sa, 1); /* 1 = swap spacelist */ - sa->flag |= AREA_TEMP_INFO; - - sa->full= oldscreen; - newa->full= oldscreen; - newa->next->full= oldscreen; // XXX - - ED_screen_set(C, sc); - } - - /* XXX bad code: setscreen() ends with first area active. fullscreen render assumes this too */ - CTX_wm_area_set(C, sc->areabase.first); - - /* XXX retopo_force_update(); */ - - return sc->areabase.first; -} - int ED_screen_full_newspace(bContext *C, ScrArea *sa, int type) { wmWindow *win= CTX_wm_window(C); @@ -1554,7 +1455,7 @@ int ED_screen_full_newspace(bContext *C, ScrArea *sa, int type) ScrArea *newsa= NULL; if(!sa || sa->full==0) { - newsa= ed_screen_fullarea(C, win, sa); + newsa= ED_screen_full_toggle(C, win, sa); } if(!newsa) { @@ -1582,7 +1483,7 @@ void ED_screen_full_prevspace(bContext *C, ScrArea *sa) ED_area_prevspace(C, sa); if(sa->full) - ed_screen_fullarea(C, win, sa); + ED_screen_full_toggle(C, win, sa); } /* restore a screen / area back to default operation, after temp fullscreen modes */ @@ -1591,7 +1492,7 @@ void ED_screen_full_restore(bContext *C, ScrArea *sa) wmWindow *win= CTX_wm_window(C); SpaceLink *sl = sa->spacedata.first; - /* if fullscreen area has a secondary space (such as as file browser or fullscreen render + /* if fullscreen area has a secondary space (such as a file browser or fullscreen render * overlaid on top of a existing setup) then return to the previous space */ if (sl->next) { @@ -1607,14 +1508,120 @@ void ED_screen_full_restore(bContext *C, ScrArea *sa) } else if (sl->spacetype == SPACE_FILE) { ED_screen_full_prevspace(C, sa); } else - ed_screen_fullarea(C, win, sa); + ED_screen_full_toggle(C, win, sa); } /* otherwise just tile the area again */ else { - ed_screen_fullarea(C, win, sa); + ED_screen_full_toggle(C, win, sa); } } +/* this function toggles: if area is full then the parent will be restored */ +ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa) +{ + bScreen *sc, *oldscreen; + ARegion *ar; + + if(sa) { + /* ensure we don't have a button active anymore, can crash when + switching screens with tooltip open because region and tooltip + are no longer in the same screen */ + for(ar=sa->regionbase.first; ar; ar=ar->next) + uiFreeBlocks(C, &ar->uiblocks); + } + + if(sa && sa->full) { + short fulltype; + + sc= sa->full; /* the old screen to restore */ + oldscreen= win->screen; /* the one disappearing */ + + fulltype = sc->full; + + /* refuse to go out of SCREENAUTOPLAY as long as G_FLAGS_AUTOPLAY + is set */ + + if (fulltype != SCREENAUTOPLAY || (G.flags & G_FILE_AUTOPLAY) == 0) { + ScrArea *old; + + sc->full= 0; + + /* find old area */ + for(old= sc->areabase.first; old; old= old->next) + if(old->full) break; + if(old==NULL) { + if (G.f & G_DEBUG) + printf("something wrong in areafullscreen\n"); + return NULL; + } + // old feature described below (ton) + // in autoplay screens the headers are disabled by + // default. So use the old headertype instead + + area_copy_data(old, sa, 1); /* 1 = swap spacelist */ + if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO; + old->full= NULL; + + /* animtimer back */ + sc->animtimer= oldscreen->animtimer; + oldscreen->animtimer= NULL; + + ED_screen_set(C, sc); + + free_screen(oldscreen); + free_libblock(&CTX_data_main(C)->screen, oldscreen); + } + } + else { + ScrArea *newa; + char newname[20]; + + oldscreen= win->screen; + + /* nothing wrong with having only 1 area, as far as I can see... + // is there only 1 area? + if(oldscreen->areabase.first==oldscreen->areabase.last) + return NULL; + */ + + oldscreen->full = SCREENFULL; + BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "temp"); + sc= ED_screen_add(win, oldscreen->scene, newname); + sc->full = SCREENFULL; // XXX + + /* timer */ + sc->animtimer= oldscreen->animtimer; + oldscreen->animtimer= NULL; + + /* returns the top small area */ + newa= area_split(win, sc, (ScrArea *)sc->areabase.first, 'h', 0.99f); + ED_area_newspace(C, newa, SPACE_INFO); + + /* use random area when we have no active one, e.g. when the + mouse is outside of the window and we open a file browser */ + if(!sa) + sa= oldscreen->areabase.first; + + /* copy area */ + newa= newa->prev; + area_copy_data(newa, sa, 1); /* 1 = swap spacelist */ + sa->flag |= AREA_TEMP_INFO; + + sa->full= oldscreen; + newa->full= oldscreen; + newa->next->full= oldscreen; // XXX + + ED_screen_set(C, sc); + } + + /* XXX bad code: setscreen() ends with first area active. fullscreen render assumes this too */ + CTX_wm_area_set(C, sc->areabase.first); + + /* XXX retopo_force_update(); */ + + return sc->areabase.first; +} + /* update frame rate info for viewport drawing */ void ED_refresh_viewport_fps(bContext *C) { @@ -1644,7 +1651,7 @@ void ED_refresh_viewport_fps(bContext *C) /* redraws: uses defines from stime->redraws * enable: 1 - forward on, -1 - backwards on, 0 - off */ -void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable) +void ED_screen_animation_timer(bContext *C, int redraws, int refresh, int sync, int enable) { bScreen *screen= CTX_wm_screen(C); wmWindowManager *wm= CTX_wm_manager(C); @@ -1662,6 +1669,7 @@ void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable) sad->ar= CTX_wm_region(C); sad->sfra = scene->r.cfra; sad->redraws= redraws; + sad->refresh= refresh; sad->flag |= (enable < 0)? ANIMPLAY_FLAG_REVERSE: 0; sad->flag |= (sync == 0)? ANIMPLAY_FLAG_NO_SYNC: (sync == 1)? ANIMPLAY_FLAG_SYNC: 0; screen->animtimer->customdata= sad; @@ -1695,13 +1703,14 @@ static ARegion *time_top_left_3dwindow(bScreen *screen) return aret; } -void ED_screen_animation_timer_update(bScreen *screen, int redraws) +void ED_screen_animation_timer_update(bScreen *screen, int redraws, int refresh) { if(screen && screen->animtimer) { wmTimer *wt= screen->animtimer; ScreenAnimData *sad= wt->customdata; sad->redraws= redraws; + sad->refresh= refresh; sad->ar= NULL; if(redraws & TIME_REGION) sad->ar= time_top_left_3dwindow(screen); @@ -1715,36 +1724,23 @@ void ED_update_for_newframe(const bContext *C, int mute) Scene *scene= CTX_data_scene(C); #ifdef DURIAN_CAMERA_SWITCH - void *camera= scene_find_camera_switch(scene); + void *camera= scene_camera_switch_find(scene); if(camera && scene->camera != camera) { - - if(camera && scene->camera && (camera != scene->camera)) { - bScreen *sc; - /* are there cameras in the views that are not in the scene? */ - for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) { - ScrArea *sa= sc->areabase.first; - while(sa) { - SpaceLink *sl= sa->spacedata.first; - while(sl) { - if(sl->spacetype==SPACE_VIEW3D) { - View3D *v3d= (View3D*) sl; - if (v3d->scenelock) { - v3d->camera= camera; - } - } - sl= sl->next; - } - sa= sa->next; - } - } - } - + bScreen *sc; scene->camera= camera; + /* are there cameras in the views that are not in the scene? */ + for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) { + BKE_screen_view3d_scene_sync(sc); + } } #endif //extern void audiostream_scrub(unsigned int frame); /* seqaudio.c */ + /* update animated image textures for gpu, etc, + * call before scene_update_for_newframe so modifiers with textuers dont lag 1 frame */ + ED_image_update_frame(C); + /* this function applies the changes too */ /* XXX future: do all windows */ scene_update_for_newframe(scene, BKE_screen_visible_layers(screen, scene)); /* BKE_scene.h */ @@ -1762,9 +1758,6 @@ void ED_update_for_newframe(const bContext *C, int mute) if(scene->use_nodes && scene->nodetree) ntreeCompositTagAnimated(scene->nodetree); - /* update animated image textures for gpu, etc */ - ED_image_update_frame(C); - /* update animated texture nodes */ { Tex *tex; diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h index 147b4bd5780..5c104521a60 100644 --- a/source/blender/editors/screen/screen_intern.h +++ b/source/blender/editors/screen/screen_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -51,8 +51,6 @@ ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my); AZone *is_in_area_actionzone(ScrArea *sa, int x, int y); -ScrArea *ed_screen_fullarea(bContext *C, wmWindow *win, ScrArea *sa); - /* screen_context.c */ void ed_screen_context(const bContext *C, const char *member, bContextDataResult *result); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 7b5d7944e80..b70cb03869d 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,9 +26,6 @@ #include #include -#include - -#include #include "MEM_guardedalloc.h" @@ -38,21 +35,17 @@ #include "BLI_dlrbTree.h" #include "DNA_armature_types.h" -#include "DNA_image_types.h" #include "DNA_lattice_types.h" #include "DNA_object_types.h" -#include "DNA_mesh_types.h" #include "DNA_curve_types.h" #include "DNA_scene_types.h" #include "DNA_meta_types.h" -#include "DNA_view3d_types.h" #include "BKE_blender.h" #include "BKE_colortools.h" #include "BKE_context.h" #include "BKE_customdata.h" #include "BKE_global.h" -#include "BKE_image.h" #include "BKE_idprop.h" #include "BKE_library.h" #include "BKE_main.h" @@ -64,30 +57,20 @@ #include "BKE_utildefines.h" #include "BKE_tessmesh.h" #include "BKE_sound.h" -#include "BKE_writeavi.h" #include "WM_api.h" #include "WM_types.h" #include "ED_util.h" #include "ED_screen.h" -#include "ED_mesh.h" #include "ED_object.h" #include "ED_screen_types.h" #include "ED_keyframes_draw.h" -#include "ED_view3d.h" - -#include "RE_pipeline.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" #include "RNA_access.h" #include "RNA_define.h" #include "UI_interface.h" -#include "UI_resources.h" - -#include "GPU_extensions.h" #include "wm_window.h" @@ -98,12 +81,6 @@ #define KM_MODAL_STEP10 3 #define KM_MODAL_STEP10_OFF 4 -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) -/* ************** libgomp (Apple gcc 4.2.1) TLS bug workaround *************** */ -#include -extern pthread_key_t gomp_tls_key; -static void *thread_tls_data; -#endif /* ************** Exported Poll tests ********************** */ int ED_operator_regionactive(bContext *C) @@ -223,12 +200,12 @@ int ED_operator_logic_active(bContext *C) int ED_operator_object_active(bContext *C) { - return NULL != CTX_data_active_object(C); + return NULL != ED_object_active_context(C); } int ED_operator_object_active_editable(bContext *C) { - Object *ob=CTX_data_active_object(C); + Object *ob = ED_object_active_context(C); return ((ob != NULL) && !(ob->id.lib)); } @@ -589,6 +566,7 @@ static int area_swap_init(bContext *C, wmOperator *op, wmEvent *event) static void area_swap_exit(bContext *C, wmOperator *op) { + WM_cursor_restore(CTX_wm_window(C)); if(op->customdata) MEM_freeN(op->customdata); op->customdata= NULL; @@ -629,15 +607,16 @@ static int area_swap_modal(bContext *C, wmOperator *op, wmEvent *event) return area_swap_cancel(C, op); } - ED_area_swapspace(C, sad->sa1, sad->sa2); - - area_swap_exit(C, op); - + #ifdef WM_FAST_DRAW ED_area_tag_redraw(sad->sa1); ED_area_tag_redraw(sad->sa2); #endif + ED_area_swapspace(C, sad->sa1, sad->sa2); + + area_swap_exit(C, op); + WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL); return OPERATOR_FINISHED; @@ -1340,6 +1319,9 @@ static int area_max_regionsize(ScrArea *sa, ARegion *scalear, char edge) * prevents dragging regions into other opposite regions */ for (ar=sa->regionbase.first; ar; ar=ar->next) { + if (ar == scalear) + continue; + if (scalear->alignment == RGN_ALIGN_TOP && ar->alignment == RGN_ALIGN_BOTTOM) dist -= ar->winy; else if (scalear->alignment == RGN_ALIGN_BOTTOM && ar->alignment == RGN_ALIGN_TOP) @@ -1348,8 +1330,15 @@ static int area_max_regionsize(ScrArea *sa, ARegion *scalear, char edge) dist -= ar->winx; else if (scalear->alignment == RGN_ALIGN_RIGHT && ar->alignment == RGN_ALIGN_LEFT) dist -= ar->winx; + + /* case of regions in regions, like operator properties panel */ + /* these can sit on top of other regions such as headers, so account for this */ + else if (edge == 'b' && scalear->alignment & RGN_ALIGN_TOP && ar->alignment == RGN_ALIGN_TOP && ar->regiontype == RGN_TYPE_HEADER) + dist -= ar->winy; + else if (edge == 't' && scalear->alignment & RGN_ALIGN_BOTTOM && ar->alignment == RGN_ALIGN_BOTTOM && ar->regiontype == RGN_TYPE_HEADER) + dist -= ar->winy; } - + return dist; } @@ -1508,6 +1497,7 @@ static int frame_offset_exec(bContext *C, wmOperator *op) delta = RNA_int_get(op->ptr, "delta"); CTX_data_scene(C)->r.cfra += delta; + CTX_data_scene(C)->r.subframe = 0.f; sound_seek_scene(C); @@ -1575,6 +1565,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) ActKeyColumn *ak; float cfra= (scene)? (float)(CFRA) : 0.0f; short next= RNA_boolean_get(op->ptr, "next"); + short done = 0; /* sanity checks */ if (scene == NULL) @@ -1593,15 +1584,27 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) BLI_dlrbTree_linkedlist_sync(&keys); /* find matching keyframe in the right direction */ - if (next) - ak= (ActKeyColumn *)BLI_dlrbTree_search_next(&keys, compare_ak_cfraPtr, &cfra); - else - ak= (ActKeyColumn *)BLI_dlrbTree_search_prev(&keys, compare_ak_cfraPtr, &cfra); + do { + if (next) + ak= (ActKeyColumn *)BLI_dlrbTree_search_next(&keys, compare_ak_cfraPtr, &cfra); + else + ak= (ActKeyColumn *)BLI_dlrbTree_search_prev(&keys, compare_ak_cfraPtr, &cfra); + + if (ak) { + if (CFRA != (int)ak->cfra) { + /* this changes the frame, so set the frame and we're done */ + CFRA= (int)ak->cfra; + done = 1; + } + else { + /* make this the new starting point for the search */ + cfra = ak->cfra; + } + } + } while ((ak != NULL) && (done == 0)); - /* set the new frame (if keyframe found) */ - if (ak) - CFRA= (int)ak->cfra; - else + /* any success? */ + if (done == 0) BKE_report(op->reports, RPT_INFO, "No more keyframes to jump to in this direction"); /* free temp stuff */ @@ -1690,7 +1693,7 @@ static void SCREEN_OT_screen_set(wmOperatorType *ot) /* function to be called outside UI context, or for redo */ static int screen_full_area_exec(bContext *C, wmOperator *op) { - ed_screen_fullarea(C, CTX_wm_window(C), CTX_wm_area(C)); + ED_screen_full_toggle(C, CTX_wm_window(C), CTX_wm_area(C)); return OPERATOR_FINISHED; } @@ -2163,18 +2166,22 @@ static int region_quadview_exec(bContext *C, wmOperator *op) rv3d= ar->regiondata; rv3d->viewlock= RV3D_LOCKED; rv3d->view= RV3D_VIEW_FRONT; rv3d->persp= RV3D_ORTHO; + if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; } ar= ar->next; rv3d= ar->regiondata; rv3d->viewlock= RV3D_LOCKED; rv3d->view= RV3D_VIEW_TOP; rv3d->persp= RV3D_ORTHO; + if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; } ar= ar->next; rv3d= ar->regiondata; rv3d->viewlock= RV3D_LOCKED; rv3d->view= RV3D_VIEW_RIGHT; rv3d->persp= RV3D_ORTHO; + if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; } ar= ar->next; rv3d= ar->regiondata; rv3d->view= RV3D_VIEW_CAMERA; rv3d->persp= RV3D_CAMOB; + if (rv3d->localvd) {rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; } } #ifdef WM_FAST_DRAW @@ -2346,6 +2353,18 @@ void SCREEN_OT_header_toolbox(wmOperatorType *ot) /* ****************** anim player, with timer ***************** */ +static int match_area_with_refresh(int spacetype, int refresh) +{ + switch (spacetype) { + case SPACE_TIME: + if (refresh & SPACE_TIME) + return 1; + break; + } + + return 0; +} + static int match_region_with_redraws(int spacetype, int regiontype, int redraws) { if(regiontype==RGN_TYPE_WINDOW) { @@ -2407,23 +2426,22 @@ static int match_region_with_redraws(int spacetype, int regiontype, int redraws) static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) { bScreen *screen= CTX_wm_screen(C); - - if(screen->animtimer==event->customdata) { + + if(screen->animtimer && screen->animtimer==event->customdata) { Scene *scene= CTX_data_scene(C); wmTimer *wt= screen->animtimer; ScreenAnimData *sad= wt->customdata; ScrArea *sa; int sync; - + float time; + /* sync, don't sync, or follow scene setting */ if(sad->flag & ANIMPLAY_FLAG_SYNC) sync= 1; else if(sad->flag & ANIMPLAY_FLAG_NO_SYNC) sync= 0; else sync= (scene->flag & SCE_FRAME_DROP); - if((scene->audio.flag & AUDIO_SYNC) && !(sad->flag & ANIMPLAY_FLAG_REVERSE)) - { - scene->r.cfra = floor(sound_sync_scene(scene) * FPS); - } + if((scene->audio.flag & AUDIO_SYNC) && !(sad->flag & ANIMPLAY_FLAG_REVERSE) && finite(time = sound_sync_scene(scene))) + scene->r.cfra = round(time * FPS); else { if(sync) { @@ -2493,6 +2511,9 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) if(match_region_with_redraws(sa->spacetype, ar->regiontype, sad->redraws)) ED_region_tag_redraw(ar); } + + if (match_area_with_refresh(sa->spacetype, sad->refresh)) + ED_area_tag_refresh(sa); } /* update frame rate info too @@ -2536,11 +2557,12 @@ int ED_screen_animation_play(bContext *C, int sync, int mode) if(screen->animtimer) { /* stop playback now */ - ED_screen_animation_timer(C, 0, 0, 0); + ED_screen_animation_timer(C, 0, 0, 0, 0); sound_stop_scene(scene); } else { ScrArea *sa= CTX_wm_area(C); + int refresh= SPACE_TIME; if(mode == 1) // XXX only play audio forwards!? sound_play_scene(scene); @@ -2549,10 +2571,10 @@ int ED_screen_animation_play(bContext *C, int sync, int mode) if ((sa) && (sa->spacetype == SPACE_TIME)) { SpaceTime *stime= (SpaceTime *)sa->spacedata.first; - ED_screen_animation_timer(C, stime->redraws, sync, mode); + ED_screen_animation_timer(C, stime->redraws, refresh, sync, mode); /* update region if TIME_REGION was set, to leftmost 3d window */ - ED_screen_animation_timer_update(screen, stime->redraws); + ED_screen_animation_timer_update(screen, stime->redraws, refresh); } else { int redraws = TIME_REGION|TIME_ALL_3D_WIN; @@ -2562,7 +2584,7 @@ int ED_screen_animation_play(bContext *C, int sync, int mode) redraws |= TIME_SEQ; } - ED_screen_animation_timer(C, redraws, sync, mode); + ED_screen_animation_timer(C, redraws, refresh, sync, mode); if(screen->animtimer) { wmTimer *wt= screen->animtimer; @@ -2576,7 +2598,7 @@ int ED_screen_animation_play(bContext *C, int sync, int mode) return OPERATOR_FINISHED; } -static int screen_animation_play_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int screen_animation_play_exec(bContext *C, wmOperator *op) { int mode= (RNA_boolean_get(op->ptr, "reverse")) ? -1 : 1; int sync= -1; @@ -2595,7 +2617,7 @@ static void SCREEN_OT_animation_play(wmOperatorType *ot) ot->idname= "SCREEN_OT_animation_play"; /* api callbacks */ - ot->invoke= screen_animation_play_invoke; + ot->exec= screen_animation_play_exec; ot->poll= ED_operator_screenactive; @@ -2603,7 +2625,7 @@ static void SCREEN_OT_animation_play(wmOperatorType *ot) RNA_def_boolean(ot->srna, "sync", 0, "Sync", "Drop frames to maintain framerate"); } -static int screen_animation_cancel(bContext *C, wmOperator *op, wmEvent *event) +static int screen_animation_cancel_exec(bContext *C, wmOperator *op) { bScreen *screen= CTX_wm_screen(C); @@ -2618,9 +2640,9 @@ static int screen_animation_cancel(bContext *C, wmOperator *op, wmEvent *event) WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); /* call the other "toggling" operator to clean up now */ - return screen_animation_play_invoke(C, op, event); + ED_screen_animation_play(C, 0, 0); } - + return OPERATOR_PASS_THROUGH; } @@ -2632,7 +2654,7 @@ static void SCREEN_OT_animation_cancel(wmOperatorType *ot) ot->idname= "SCREEN_OT_animation_cancel"; /* api callbacks */ - ot->invoke= screen_animation_cancel; + ot->exec= screen_animation_cancel_exec; ot->poll= ED_operator_screenactive; } @@ -2695,1081 +2717,6 @@ static void SCREEN_OT_border_select(wmOperatorType *ot) } #endif -/* ****************************** render invoking ***************** */ - -/* set callbacks, exported to sequence render too. - Only call in foreground (UI) renders. */ - -/* returns biggest area that is not uv/image editor. Note that it uses buttons */ -/* window as the last possible alternative. */ -static ScrArea *biggest_non_image_area(bContext *C) -{ - bScreen *sc= CTX_wm_screen(C); - ScrArea *sa, *big= NULL; - int size, maxsize= 0, bwmaxsize= 0; - short foundwin= 0; - - for(sa= sc->areabase.first; sa; sa= sa->next) { - if(sa->winx > 30 && sa->winy > 30) { - size= sa->winx*sa->winy; - if(sa->spacetype == SPACE_BUTS) { - if(foundwin == 0 && size > bwmaxsize) { - bwmaxsize= size; - big= sa; - } - } - else if(sa->spacetype != SPACE_IMAGE && size > maxsize) { - maxsize= size; - big= sa; - foundwin= 1; - } - } - } - - return big; -} - -static ScrArea *biggest_area(bContext *C) -{ - bScreen *sc= CTX_wm_screen(C); - ScrArea *sa, *big= NULL; - int size, maxsize= 0; - - for(sa= sc->areabase.first; sa; sa= sa->next) { - size= sa->winx*sa->winy; - if(size > maxsize) { - maxsize= size; - big= sa; - } - } - return big; -} - - -static ScrArea *find_area_showing_r_result(bContext *C) -{ - wmWindowManager *wm= CTX_wm_manager(C); - wmWindow *win; - ScrArea *sa = NULL; - SpaceImage *sima; - - /* find an imagewindow showing render result */ - for(win=wm->windows.first; win; win=win->next) { - for(sa=win->screen->areabase.first; sa; sa= sa->next) { - if(sa->spacetype==SPACE_IMAGE) { - sima= sa->spacedata.first; - if(sima->image && sima->image->type==IMA_TYPE_R_RESULT) - break; - } - } - } - - return sa; -} - -static ScrArea *find_area_image_empty(bContext *C) -{ - bScreen *sc= CTX_wm_screen(C); - ScrArea *sa; - SpaceImage *sima; - - /* find an imagewindow showing render result */ - for(sa=sc->areabase.first; sa; sa= sa->next) { - if(sa->spacetype==SPACE_IMAGE) { - sima= sa->spacedata.first; - if(!sima->image) - break; - } - } - return sa; -} - -#if 0 // XXX not used -static ScrArea *find_empty_image_area(bContext *C) -{ - bScreen *sc= CTX_wm_screen(C); - ScrArea *sa; - SpaceImage *sima; - - /* find an imagewindow showing render result */ - for(sa=sc->areabase.first; sa; sa= sa->next) { - if(sa->spacetype==SPACE_IMAGE) { - sima= sa->spacedata.first; - if(!sima->image) - break; - } - } - return sa; -} -#endif // XXX not used - -/* new window uses x,y to set position */ -static void screen_set_image_output(bContext *C, int mx, int my) -{ - wmWindow *win= CTX_wm_window(C); - Scene *scene= CTX_data_scene(C); - ScrArea *sa= NULL; - SpaceImage *sima; - int area_was_image=0; - - if(scene->r.displaymode==R_OUTPUT_WINDOW) { - rcti rect; - int sizex, sizey; - - sizex= 10 + (scene->r.xsch*scene->r.size)/100; - sizey= 40 + (scene->r.ysch*scene->r.size)/100; - - /* arbitrary... miniature image window views don't make much sense */ - if(sizex < 320) sizex= 320; - if(sizey < 256) sizey= 256; - - /* XXX some magic to calculate postition */ - rect.xmin= mx + win->posx - sizex/2; - rect.ymin= my + win->posy - sizey/2; - rect.xmax= rect.xmin + sizex; - rect.ymax= rect.ymin + sizey; - - /* changes context! */ - WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); - - sa= CTX_wm_area(C); - } - else if(scene->r.displaymode==R_OUTPUT_SCREEN) { - if (CTX_wm_area(C)->spacetype == SPACE_IMAGE) - area_was_image = 1; - - /* this function returns with changed context */ - ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_IMAGE); - sa= CTX_wm_area(C); - } - - if(!sa) { - sa= find_area_showing_r_result(C); - if(sa==NULL) - sa= find_area_image_empty(C); - - if(sa==NULL) { - /* find largest open non-image area */ - sa= biggest_non_image_area(C); - if(sa) { - ED_area_newspace(C, sa, SPACE_IMAGE); - sima= sa->spacedata.first; - - /* makes ESC go back to prev space */ - sima->flag |= SI_PREVSPACE; - } - else { - /* use any area of decent size */ - sa= biggest_area(C); - if(sa->spacetype!=SPACE_IMAGE) { - // XXX newspace(sa, SPACE_IMAGE); - sima= sa->spacedata.first; - - /* makes ESC go back to prev space */ - sima->flag |= SI_PREVSPACE; - } - } - } - } - sima= sa->spacedata.first; - - /* get the correct image, and scale it */ - sima->image= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); - - - /* if we're rendering to full screen, set appropriate hints on image editor - * so it can restore properly on pressing esc */ - if(sa->full) { - sima->flag |= SI_FULLWINDOW; - - /* Tell the image editor to revert to previous space in space list on close - * _only_ if it wasn't already an image editor when the render was invoked */ - if (area_was_image == 0) - sima->flag |= SI_PREVSPACE; - else { - /* Leave it alone so the image editor will just go back from - * full screen to the original tiled setup */ - ; - } - - } - -} - -/* executes blocking render */ -static int screen_render_exec(bContext *C, wmOperator *op) -{ - Scene *scene= CTX_data_scene(C); - Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); - - if(re==NULL) { - re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); - } - RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break); - - if(RNA_boolean_get(op->ptr, "animation")) - RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports); - else - RE_BlenderFrame(re, scene, NULL, scene->r.cfra); - - // no redraw needed, we leave state as we entered it - ED_update_for_newframe(C, 1); - - WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene); - - return OPERATOR_FINISHED; -} - -typedef struct RenderJob { - Scene *scene; - Render *re; - wmWindow *win; - SceneRenderLayer *srl; - int anim; - Image *image; - ImageUser iuser; - short *stop; - short *do_update; - ReportList *reports; -} RenderJob; - -static void render_freejob(void *rjv) -{ - RenderJob *rj= rjv; - - MEM_freeN(rj); -} - -/* str is IMA_RW_MAXTEXT in size */ -static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) -{ - char info_time_str[32]; // used to be extern to header_info.c - uintptr_t mem_in_use, mmap_in_use; - float megs_used_memory, mmap_used_memory; - char *spos= str; - - mem_in_use= MEM_get_memory_in_use(); - mmap_in_use= MEM_get_mapped_memory_in_use(); - - megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0); - mmap_used_memory= (mmap_in_use)/(1024.0*1024.0); - - if(scene->lay & 0xFF000000) - spos+= sprintf(spos, "Localview | "); - else if(scene->r.scemode & R_SINGLE_LAYER) - spos+= sprintf(spos, "Single Layer | "); - - if(rs->statstr) { - spos+= sprintf(spos, "%s ", rs->statstr); - } - else { - spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface); - if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo); - if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand); - spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory); - - if(rs->curfield) - spos+= sprintf(spos, "Field %d ", rs->curfield); - if(rs->curblur) - spos+= sprintf(spos, "Blur %d ", rs->curblur); - } - - BLI_timestr(rs->lastframetime, info_time_str); - spos+= sprintf(spos, "Time:%s ", info_time_str); - - if(rs->infostr && rs->infostr[0]) - spos+= sprintf(spos, "| %s ", rs->infostr); - - /* very weak... but 512 characters is quite safe */ - if(spos >= str+IMA_RW_MAXTEXT) - if (G.f & G_DEBUG) - printf("WARNING! renderwin text beyond limit \n"); - -} - -static void image_renderinfo_cb(void *rjv, RenderStats *rs) -{ - RenderJob *rj= rjv; - - /* malloc OK here, stats_draw is not in tile threads */ - if(rj->image->render_text==NULL) - rj->image->render_text= MEM_callocN(IMA_RW_MAXTEXT, "rendertext"); - - make_renderinfo_string(rs, rj->scene, rj->image->render_text); - - /* make jobs timer to send notifier */ - *(rj->do_update)= 1; - -} - -/* called inside thread! */ -static void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volatile rcti *renrect) -{ - float x1, y1, *rectf= NULL; - int ymin, ymax, xmin, xmax; - int rymin, rxmin; - char *rectc; - - /* if renrect argument, we only refresh scanlines */ - if(renrect) { - /* if ymax==recty, rendering of layer is ready, we should not draw, other things happen... */ - if(rr->renlay==NULL || renrect->ymax>=rr->recty) - return; - - /* xmin here is first subrect x coord, xmax defines subrect width */ - xmin = renrect->xmin + rr->crop; - xmax = renrect->xmax - xmin - rr->crop; - if (xmax<2) return; - - ymin= renrect->ymin + rr->crop; - ymax= renrect->ymax - ymin - rr->crop; - if(ymax<2) - return; - renrect->ymin= renrect->ymax; - - } - else { - xmin = ymin = rr->crop; - xmax = rr->rectx - 2*rr->crop; - ymax = rr->recty - 2*rr->crop; - } - - /* xmin ymin is in tile coords. transform to ibuf */ - rxmin= rr->tilerect.xmin + xmin; - if(rxmin >= ibuf->x) return; - rymin= rr->tilerect.ymin + ymin; - if(rymin >= ibuf->y) return; - - if(rxmin + xmax > ibuf->x) - xmax= ibuf->x - rxmin; - if(rymin + ymax > ibuf->y) - ymax= ibuf->y - rymin; - - if(xmax < 1 || ymax < 1) return; - - /* find current float rect for display, first case is after composit... still weak */ - if(rr->rectf) - rectf= rr->rectf; - else { - if(rr->rect32) - return; - else { - if(rr->renlay==NULL || rr->renlay->rectf==NULL) return; - rectf= rr->renlay->rectf; - } - } - if(rectf==NULL) return; - - if(ibuf->rect==NULL) - imb_addrectImBuf(ibuf); - - rectf+= 4*(rr->rectx*ymin + xmin); - rectc= (char *)(ibuf->rect + ibuf->x*rymin + rxmin); - - /* XXX make nice consistent functions for this */ - if (scene && (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)) { - for(y1= 0; y1= (char *)(ibuf->rect)) { - for(x1= 0; x1rectx; - rectc += 4*ibuf->x; - } - } else { - for(y1= 0; y1= (char *)(ibuf->rect)) { - for(x1= 0; x1rectx; - rectc += 4*ibuf->x; - } - } - -} - -static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect) -{ - RenderJob *rj= rjv; - ImBuf *ibuf; - void *lock; - - ibuf= BKE_image_acquire_ibuf(rj->image, &rj->iuser, &lock); - if(ibuf) { - image_buffer_rect_update(rj->scene, rr, ibuf, renrect); - - /* make jobs timer to send notifier */ - *(rj->do_update)= 1; - } - BKE_image_release_ibuf(rj->image, lock); -} - -static void render_startjob(void *rjv, short *stop, short *do_update) -{ - RenderJob *rj= rjv; -// Main *mainp= BKE_undo_get_main(&rj->scene); - - rj->stop= stop; - rj->do_update= do_update; - -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - pthread_setspecific (gomp_tls_key, thread_tls_data); -#endif - - if(rj->anim) - RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); - else - RE_BlenderFrame(rj->re, rj->scene, rj->srl, rj->scene->r.cfra); - -// if(mainp) -// free_main(mainp); -} - -/* called by render, check job 'stop' value or the global */ -static int render_breakjob(void *rjv) -{ - RenderJob *rj= rjv; - - if(G.afbreek) - return 1; - if(rj->stop && *(rj->stop)) - return 1; - return 0; -} - -/* catch esc */ -static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event) -{ - /* no running blender, remove handler and pass through */ - if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) - return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; - - /* running render */ - switch (event->type) { - case ESCKEY: - return OPERATOR_RUNNING_MODAL; - break; - } - return OPERATOR_PASS_THROUGH; -} - -/* using context, starts job */ -static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - /* new render clears all callbacks */ - Scene *scene= CTX_data_scene(C); - SceneRenderLayer *srl=NULL; - Render *re; - wmJob *steve; - RenderJob *rj; - Image *ima; - - /* only one render job at a time */ - if(WM_jobs_test(CTX_wm_manager(C), scene)) - return OPERATOR_CANCELLED; - - /* stop all running jobs, currently previews frustrate Render */ - WM_jobs_stop_all(CTX_wm_manager(C)); - - /* handle UI stuff */ - WM_cursor_wait(1); - - /* flush multires changes (for sculpt) */ - multires_force_render_update(CTX_data_active_object(C)); - - /* get editmode results */ - ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); /* 0 = does not exit editmode */ - - // store spare - // get view3d layer, local layer, make this nice api call to render - // store spare - - /* ensure at least 1 area shows result */ - screen_set_image_output(C, event->x, event->y); - - /* single layer re-render */ - if(RNA_property_is_set(op->ptr, "layer")) { - SceneRenderLayer *rl; - Scene *scn; - char scene_name[19], rl_name[RE_MAXNAME]; - - RNA_string_get(op->ptr, "layer", rl_name); - RNA_string_get(op->ptr, "scene", scene_name); - - scn = (Scene *)BLI_findstring(&CTX_data_main(C)->scene, scene_name, offsetof(ID, name) + 2); - rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name)); - - if (scn && rl) { - scene = scn; - srl = rl; - } - } - - /* job custom data */ - rj= MEM_callocN(sizeof(RenderJob), "render job"); - rj->scene= scene; - rj->win= CTX_wm_window(C); - rj->srl = srl; - rj->anim= RNA_boolean_get(op->ptr, "animation"); - rj->iuser.scene= scene; - rj->iuser.ok= 1; - rj->reports= op->reports; - - /* setup job */ - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY); - WM_jobs_customdata(steve, rj, render_freejob); - WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0); - WM_jobs_callbacks(steve, render_startjob, NULL, NULL); - -#if defined(__APPLE__) && (PARALLEL == 1) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) - // Workaround for Apple gcc 4.2.1 omp vs background thread bug - thread_tls_data = pthread_getspecific(gomp_tls_key); -#endif - - /* get a render result image, and make sure it is empty */ - ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); - BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); - rj->image= ima; - - /* setup new render */ - re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); - RE_test_break_cb(re, rj, render_breakjob); - RE_display_draw_cb(re, rj, image_rect_update); - RE_stats_draw_cb(re, rj, image_renderinfo_cb); - - rj->re= re; - G.afbreek= 0; - - // BKE_report in render! - // RE_error_cb(re, error_cb); - - WM_jobs_start(CTX_wm_manager(C), steve); - - WM_cursor_wait(0); - WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene); - - /* add modal handler for ESC */ - WM_event_add_modal_handler(C, op); - - return OPERATOR_RUNNING_MODAL; -} - - -/* contextual render, using current scene, view3d? */ -static void SCREEN_OT_render(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Render"; - ot->description= "Render active scene"; - ot->idname= "SCREEN_OT_render"; - - /* api callbacks */ - ot->invoke= screen_render_invoke; - ot->modal= screen_render_modal; - ot->exec= screen_render_exec; - - ot->poll= ED_operator_screenactive; - - RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); - RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render"); - RNA_def_string(ot->srna, "scene", "", 19, "Scene", "Re-render single layer in this scene"); -} - -/* ****************************** opengl render *************************** */ - -typedef struct OGLRender { - Render *re; - Scene *scene; - - View3D *v3d; - RegionView3D *rv3d; - ARegion *ar; - - Image *ima; - ImageUser iuser; - - GPUOffScreen *ofs; - int sizex, sizey; - - ReportList *reports; - bMovieHandle *mh; - int cfrao, nfra; - - wmTimer *timer; /* use to check if running modal or not (invoke'd or exec'd)*/ -} OGLRender; - -static void screen_opengl_render_apply(OGLRender *oglrender) -{ - Scene *scene= oglrender->scene; - ARegion *ar= oglrender->ar; - View3D *v3d= oglrender->v3d; - RegionView3D *rv3d= oglrender->rv3d; - RenderResult *rr; - ImBuf *ibuf; - void *lock; - float winmat[4][4]; - int sizex= oglrender->sizex; - int sizey= oglrender->sizey; - - /* bind */ - GPU_offscreen_bind(oglrender->ofs); - - /* render 3d view */ - if(rv3d->persp==RV3D_CAMOB && v3d->camera) { - RE_GetCameraWindow(oglrender->re, v3d->camera, scene->r.cfra, winmat); - ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat); - } - else - ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL); - - /* read in pixels & stamp */ - rr= RE_AcquireResultRead(oglrender->re); - glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf); - if((scene->r.stamp & R_STAMP_ALL) && (scene->r.stamp & R_STAMP_DRAW)) - BKE_stamp_buf(scene, NULL, rr->rectf, rr->rectx, rr->recty, 4); - RE_ReleaseResult(oglrender->re); - - /* update byte from float buffer */ - ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); - if(ibuf) image_buffer_rect_update(NULL, rr, ibuf, NULL); - BKE_image_release_ibuf(oglrender->ima, lock); - - /* unbind */ - GPU_offscreen_unbind(oglrender->ofs); -} - -static int screen_opengl_render_init(bContext *C, wmOperator *op) -{ - /* new render clears all callbacks */ - Scene *scene= CTX_data_scene(C); - RenderResult *rr; - GPUOffScreen *ofs; - OGLRender *oglrender; - int sizex, sizey; - - /* ensure we have a 3d view */ - if(!ED_view3d_context_activate(C)) - return 0; - - /* only one render job at a time */ - if(WM_jobs_test(CTX_wm_manager(C), scene)) - return 0; - - /* stop all running jobs, currently previews frustrate Render */ - WM_jobs_stop_all(CTX_wm_manager(C)); - - /* handle UI stuff */ - WM_cursor_wait(1); - - /* create offscreen buffer */ - sizex= (scene->r.size*scene->r.xsch)/100; - sizey= (scene->r.size*scene->r.ysch)/100; - - view3d_operator_needs_opengl(C); - ofs= GPU_offscreen_create(sizex, sizey); - - if(!ofs) { - BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer."); - return 0; - } - - /* allocate opengl render */ - oglrender= MEM_callocN(sizeof(OGLRender), "OGLRender"); - op->customdata= oglrender; - - oglrender->ofs= ofs; - oglrender->sizex= sizex; - oglrender->sizey= sizey; - oglrender->scene= scene; - - oglrender->v3d= CTX_wm_view3d(C); - oglrender->ar= CTX_wm_region(C); - oglrender->rv3d= CTX_wm_region_view3d(C); - - /* create image and image user */ - oglrender->ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); - BKE_image_signal(oglrender->ima, NULL, IMA_SIGNAL_FREE); - - oglrender->iuser.scene= scene; - oglrender->iuser.ok= 1; - - /* create render and render result */ - oglrender->re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); - RE_InitState(oglrender->re, NULL, &scene->r, NULL, sizex, sizey, NULL); - - rr= RE_AcquireResultWrite(oglrender->re); - if(rr->rectf==NULL) - rr->rectf= MEM_mallocN(sizeof(float)*4*sizex*sizey, "32 bits rects"); - RE_ReleaseResult(oglrender->re); - - return 1; -} - -static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) -{ - Scene *scene= oglrender->scene; - - if(oglrender->mh) { - if(BKE_imtype_is_movie(scene->r.imtype)) - oglrender->mh->end_movie(); - } - - if(oglrender->timer) { /* exec will not have a timer */ - scene->r.cfra= oglrender->cfrao; - scene_update_for_newframe(scene, scene->lay); - - WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), oglrender->timer); - } - - WM_cursor_wait(0); - WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene); - - GPU_offscreen_free(oglrender->ofs); - - MEM_freeN(oglrender); -} - -static int screen_opengl_render_cancel(bContext *C, wmOperator *op) -{ - screen_opengl_render_end(C, op->customdata); - - return OPERATOR_CANCELLED; -} - -/* share between invoke and exec */ -static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) -{ - /* initialize animation */ - OGLRender *oglrender; - Scene *scene; - - oglrender= op->customdata; - scene= oglrender->scene; - - oglrender->reports= op->reports; - oglrender->mh= BKE_get_movie_handle(scene->r.imtype); - if(BKE_imtype_is_movie(scene->r.imtype)) { - if(!oglrender->mh->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) { - screen_opengl_render_end(C, oglrender); - return 0; - } - } - - oglrender->cfrao= scene->r.cfra; - oglrender->nfra= SFRA; - scene->r.cfra= SFRA; - - return 1; -} -static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) -{ - OGLRender *oglrender= op->customdata; - Scene *scene= oglrender->scene; - ImBuf *ibuf; - void *lock; - char name[FILE_MAXDIR+FILE_MAXFILE]; - unsigned int lay; - int ok= 0; - - /* go to next frame */ - while(CFRAnfra) { - if(scene->lay & 0xFF000000) - lay= scene->lay & 0xFF000000; - else - lay= scene->lay; - - scene_update_for_newframe(scene, lay); - CFRA++; - } - - scene_update_for_newframe(scene, scene->lay); - - if(oglrender->rv3d->persp==RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { - /* since scene_update_for_newframe() is used rather - * then ED_update_for_newframe() the camera needs to be set */ - Object *camera= scene_find_camera_switch(scene); - - if(camera) - oglrender->v3d->camera= scene->camera= camera; - } - - /* render into offscreen buffer */ - screen_opengl_render_apply(oglrender); - - /* save to disk */ - ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); - - if(ibuf) { - if(BKE_imtype_is_movie(scene->r.imtype)) { - ok= oglrender->mh->append_movie(&scene->r, CFRA, (int*)ibuf->rect, oglrender->sizex, oglrender->sizey, oglrender->reports); - if(ok) { - printf("Append frame %d", scene->r.cfra); - BKE_reportf(op->reports, RPT_INFO, "Appended frame: %d", scene->r.cfra); - } - } - else { - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION); - ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality); - - if(ok==0) { - printf("Write error: cannot save %s\n", name); - BKE_reportf(op->reports, RPT_ERROR, "Write error: cannot save %s", name); - } - else { - printf("Saved: %s", name); - BKE_reportf(op->reports, RPT_INFO, "Saved file: %s", name); - } - } - } - - BKE_image_release_ibuf(oglrender->ima, lock); - - /* movie stats prints have no line break */ - printf("\n"); - - /* go to next frame */ - oglrender->nfra += scene->r.frame_step; - scene->r.cfra++; - - /* stop at the end or on error */ - if(scene->r.cfra > EFRA || !ok) { - screen_opengl_render_end(C, op->customdata); - return 0; - } - - return 1; -} - - -static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *event) -{ - OGLRender *oglrender= op->customdata; - - int ret; - - switch(event->type) { - case ESCKEY: - /* cancel */ - screen_opengl_render_end(C, op->customdata); - return OPERATOR_FINISHED; - case TIMER: - /* render frame? */ - if(oglrender->timer == event->customdata) - break; - default: - /* nothing to do */ - return OPERATOR_RUNNING_MODAL; - } - - ret= screen_opengl_render_anim_step(C, op); - - WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene); - - /* stop at the end or on error */ - if(ret == 0) { - return OPERATOR_FINISHED; - } - - return OPERATOR_RUNNING_MODAL; -} - -static int screen_opengl_render_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - int anim= RNA_boolean_get(op->ptr, "animation"); - - if(!screen_opengl_render_init(C, op)) - return OPERATOR_CANCELLED; - - if(!anim) { - /* render image */ - screen_opengl_render_apply(op->customdata); - screen_opengl_render_end(C, op->customdata); - screen_set_image_output(C, event->x, event->y); - - return OPERATOR_FINISHED; - } - else { - OGLRender *oglrender= op->customdata; - - if(!screen_opengl_render_anim_initialize(C, op)) - return OPERATOR_CANCELLED; - - screen_set_image_output(C, event->x, event->y); - - WM_event_add_modal_handler(C, op); - oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f); - - return OPERATOR_RUNNING_MODAL; - } -} - -/* executes blocking render */ -static int screen_opengl_render_exec(bContext *C, wmOperator *op) -{ - int anim= RNA_boolean_get(op->ptr, "animation"); - - if(!screen_opengl_render_init(C, op)) - return OPERATOR_CANCELLED; - - if(!anim) { /* same as invoke */ - /* render image */ - screen_opengl_render_apply(op->customdata); - screen_opengl_render_end(C, op->customdata); - - return OPERATOR_FINISHED; - } - else { - int ret= 1; - - if(!screen_opengl_render_anim_initialize(C, op)) - return OPERATOR_CANCELLED; - - while(ret) { - ret= screen_opengl_render_anim_step(C, op); - } - } - - // no redraw needed, we leave state as we entered it -// ED_update_for_newframe(C, 1); - WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, CTX_data_scene(C)); - - return OPERATOR_FINISHED; -} - -static void SCREEN_OT_opengl_render(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "OpenGL Render"; - ot->description= "OpenGL render active viewport"; - ot->idname= "SCREEN_OT_opengl_render"; - - /* api callbacks */ - ot->invoke= screen_opengl_render_invoke; - ot->exec= screen_opengl_render_exec; /* blocking */ - ot->modal= screen_opengl_render_modal; - ot->cancel= screen_opengl_render_cancel; - - ot->poll= ED_operator_screenactive; - - RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); -} - -/* *********************** cancel render viewer *************** */ - -static int render_view_cancel_exec(bContext *C, wmOperator *unused) -{ - wmWindow *win= CTX_wm_window(C); - ScrArea *sa= CTX_wm_area(C); - SpaceImage *sima= sa->spacedata.first; - - /* test if we have a temp screen in front */ - if(CTX_wm_window(C)->screen->full==SCREENTEMP) { - wm_window_lower(CTX_wm_window(C)); - return OPERATOR_FINISHED; - } - /* determine if render already shows */ - else if(sima->flag & SI_PREVSPACE) { - sima->flag &= ~SI_PREVSPACE; - - if(sima->flag & SI_FULLWINDOW) { - sima->flag &= ~SI_FULLWINDOW; - ED_screen_full_prevspace(C, sa); - } - else - ED_area_prevspace(C, sa); - - return OPERATOR_FINISHED; - } - else if(sima->flag & SI_FULLWINDOW) { - sima->flag &= ~SI_FULLWINDOW; - ed_screen_fullarea(C, win, sa); - return OPERATOR_FINISHED; - } - - return OPERATOR_PASS_THROUGH; -} - -static void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Cancel Render View"; - ot->description= "Cancel show render view"; - ot->idname= "SCREEN_OT_render_view_cancel"; - - /* api callbacks */ - ot->exec= render_view_cancel_exec; - ot->poll= ED_operator_image_active; -} - -/* *********************** show render viewer *************** */ - -static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) -{ - ScrArea *sa= find_area_showing_r_result(C); - - /* test if we have a temp screen in front */ - if(CTX_wm_window(C)->screen->full==SCREENTEMP) { - wm_window_lower(CTX_wm_window(C)); - } - /* determine if render already shows */ - else if(sa) { - SpaceImage *sima= sa->spacedata.first; - - if(sima->flag & SI_PREVSPACE) { - sima->flag &= ~SI_PREVSPACE; - - if(sima->flag & SI_FULLWINDOW) { - sima->flag &= ~SI_FULLWINDOW; - ED_screen_full_prevspace(C, sa); - } - else if(sima->next) { - ED_area_newspace(C, sa, sima->next->spacetype); - ED_area_tag_redraw(sa); - } - } - } - else { - screen_set_image_output(C, event->x, event->y); - } - - return OPERATOR_FINISHED; -} - -static void SCREEN_OT_render_view_show(struct wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Show/Hide Render View"; - ot->description= "Toggle show render view"; - ot->idname= "SCREEN_OT_render_view_show"; - - /* api callbacks */ - ot->invoke= render_view_show_invoke; - ot->poll= ED_operator_screenactive; -} - /* *********************** generic fullscreen 'back' button *************** */ @@ -4004,12 +2951,6 @@ void ED_operatortypes_screen(void) WM_operatortype_append(SCREEN_OT_animation_play); WM_operatortype_append(SCREEN_OT_animation_cancel); - /* render */ - WM_operatortype_append(SCREEN_OT_render); - WM_operatortype_append(SCREEN_OT_render_view_cancel); - WM_operatortype_append(SCREEN_OT_render_view_show); - WM_operatortype_append(SCREEN_OT_opengl_render); - /* new/delete */ WM_operatortype_append(SCREEN_OT_new); WM_operatortype_append(SCREEN_OT_delete); @@ -4057,7 +2998,7 @@ void ED_keymap_screen(wmKeyConfig *keyconf) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "modifier", 0); RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "modifier", 1); - RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "modifier", 2); + RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "modifier", 2); /* screen tools */ WM_keymap_verify_item(keymap, "SCREEN_OT_area_split", EVT_ACTIONZONE_AREA, 0, 0, 0); @@ -4094,7 +3035,7 @@ void ED_keymap_screen(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "SCREEN_OT_repeat_last", RKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_verify_item(keymap, "SCREEN_OT_region_flip", F5KEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "SCREEN_OT_redo_last", F6KEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "WM_OT_reload_scripts", F8KEY, KM_PRESS, 0, 0); + WM_keymap_verify_item(keymap, "SCRIPT_OT_reload", F8KEY, KM_PRESS, 0, 0); /* files */ WM_keymap_add_item(keymap, "FILE_OT_execute", RETKEY, KM_PRESS, 0, 0); @@ -4111,11 +3052,11 @@ void ED_keymap_screen(wmKeyConfig *keyconf) /* render */ - WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0)->ptr, "animation", 1); - WM_keymap_add_item(keymap, "SCREEN_OT_render_view_cancel", ESCKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "SCREEN_OT_play_rendered_anim", F11KEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0)->ptr, "animation", 1); + WM_keymap_add_item(keymap, "RENDER_OT_view_cancel", ESCKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "RENDER_OT_view_show", F11KEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "RENDER_OT_play_rendered_anim", F11KEY, KM_PRESS, KM_CTRL, 0); /* user prefs */ #ifdef __APPLE__ @@ -4136,7 +3077,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELDOWNMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", 1); RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELUPMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1); - WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0); diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index d34a562f894..d5cd8285515 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -57,8 +57,6 @@ #include "PIL_time.h" -#include "ED_fileselect.h" -#include "ED_screen.h" #include "ED_screen_types.h" #include "screen_intern.h" @@ -77,10 +75,10 @@ static int screenshot_exec(bContext *C, wmOperator *op) ImBuf *ibuf; char path[FILE_MAX]; - RNA_string_get(op->ptr, "path", path); + RNA_string_get(op->ptr, "filepath", path); strcpy(G.ima, path); - BLI_convertstringcode(path, G.sce); + BLI_path_abs(path, G.sce); /* BKE_add_image_extension() checks for if extension was already set */ if(scene->r.scemode & R_EXTENSION) @@ -90,8 +88,6 @@ static int screenshot_exec(bContext *C, wmOperator *op) ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0, 0); ibuf->rect= scd->dumprect; - if(scene->r.planes == 8) IMB_cspace(ibuf, rgb_to_bw); - BKE_write_ibuf(scene, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality); IMB_freeImBuf(ibuf); @@ -126,7 +122,7 @@ static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy, int fscre if (*dumpsx && *dumpsy) { - dumprect= MEM_mallocN(sizeof(int) * dumpsx[0] * dumpsy[0], "dumprect"); + dumprect= MEM_mallocN(sizeof(int) * (*dumpsx) * (*dumpsy), "dumprect"); glReadBuffer(GL_FRONT); glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect); glFinish(); @@ -151,10 +147,10 @@ static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event) scd->dumprect= dumprect; op->customdata= scd; - if(RNA_property_is_set(op->ptr, "path")) + if(RNA_property_is_set(op->ptr, "filepath")) return screenshot_exec(C, op); - RNA_string_set(op->ptr, "path", G.ima); + RNA_string_set(op->ptr, "filepath", G.ima); WM_event_add_fileselect(C, op); @@ -175,7 +171,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot) ot->flag= 0; - WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, FILE_SAVE); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH); RNA_def_boolean(ot->srna, "full", 1, "Full Screen", ""); } @@ -219,7 +215,7 @@ static void screenshot_updatejob(void *sjv) /* only this runs inside thread */ -static void screenshot_startjob(void *sjv, short *stop, short *do_update) +static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *progress) { ScreenshotJob *sj= sjv; RenderData rd= sj->scene->r; @@ -275,7 +271,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update) BKE_reportf(&sj->reports, RPT_INFO, "Saved file: %s", name); } - /* imbuf knows which rects are not part of ibuf */ + /* imbuf knows which rects are not part of ibuf */ IMB_freeImBuf(ibuf); } @@ -300,7 +296,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update) static int screencast_exec(bContext *C, wmOperator *op) { bScreen *screen= CTX_wm_screen(C); - wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), screen, 0); + wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), screen, "Screencast", 0); ScreenshotJob *sj= MEM_callocN(sizeof(ScreenshotJob), "screenshot job"); /* setup sj */ @@ -325,7 +321,7 @@ static int screencast_exec(bContext *C, wmOperator *op) /* setup job */ WM_jobs_customdata(steve, sj, screenshot_freejob); WM_jobs_timer(steve, 0.1, 0, NC_SCREEN|ND_SCREENCAST); - WM_jobs_callbacks(steve, screenshot_startjob, NULL, screenshot_updatejob); + WM_jobs_callbacks(steve, screenshot_startjob, NULL, screenshot_updatejob, NULL); WM_jobs_start(CTX_wm_manager(C), steve); @@ -345,7 +341,7 @@ void SCREEN_OT_screencast(wmOperatorType *ot) ot->flag= 0; - RNA_def_property(ot->srna, "path", PROP_STRING, PROP_FILEPATH); + RNA_def_property(ot->srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_boolean(ot->srna, "full", 1, "Full Screen", ""); } diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt new file mode 100644 index 00000000000..f0493d8e2d8 --- /dev/null +++ b/source/blender/editors/sculpt_paint/CMakeLists.txt @@ -0,0 +1,41 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../imbuf + ../../gpu + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager + ../../render/extern/include +) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_sculpt_paint "${SRC}" "${INC}") diff --git a/source/blender/editors/sculpt_paint/SConscript b/source/blender/editors/sculpt_paint/SConscript index 1c7c3686386..b9cc294d44d 100644 --- a/source/blender/editors/sculpt_paint/SConscript +++ b/source/blender/editors/sculpt_paint/SConscript @@ -3,6 +3,8 @@ Import ('env') sources = env.Glob('*.c') +defs = [] + incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' incs += ' ../../render/extern/include' @@ -12,7 +14,11 @@ if env['OURPLATFORM'] == 'linux2': cflags='-pthread' incs += ' ../../../extern/binreloc/include' -if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): - incs += ' ' + env['BF_PTHREADS_INC'] +if env['OURPLATFORM'] == 'linuxcross': + if env['WITH_BF_OPENMP']: + incs += ' ' + env['BF_OPENMP_INC'] -env.BlenderLib ( 'bf_editors_sculpt_paint', sources, Split(incs), [], libtype=['core'], priority=[40] ) +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] + +env.BlenderLib ( 'bf_editors_sculpt_paint', sources, Split(incs), defines=defs, libtype=['core'], priority=[40] ) diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index c258e162336..12326843734 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -16,7 +16,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * @@ -51,20 +50,14 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "DNA_brush_types.h" -#include "DNA_image_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BKE_context.h" +#include "BKE_idprop.h" +#include "BKE_object.h" #include "BKE_brush.h" #include "BKE_global.h" #include "BKE_image.h" @@ -76,15 +69,14 @@ #include "BKE_DerivedMesh.h" #include "BKE_report.h" #include "BKE_depsgraph.h" +#include "BKE_library.h" #include "BIF_gl.h" #include "BIF_glutil.h" -#include "UI_interface.h" #include "UI_view2d.h" #include "ED_image.h" -#include "ED_object.h" #include "ED_screen.h" #include "ED_sculpt.h" #include "ED_view3d.h" @@ -94,6 +86,7 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "RNA_enum_types.h" #include "GPU_draw.h" @@ -184,6 +177,14 @@ typedef struct ImagePaintRegion { #define PROJ_FACE_NOSEAM3 1<<6 #define PROJ_FACE_NOSEAM4 1<<7 +#define PROJ_SRC_VIEW 1 +#define PROJ_SRC_IMAGE_CAM 2 +#define PROJ_SRC_IMAGE_VIEW 3 + +#define PROJ_VIEW_DATA_ID "view_data" +#define PROJ_VIEW_DATA_SIZE (4*4 + 4*4 + 3) /* viewmat + winmat + clipsta + clipend + is_ortho */ + + /* a slightly scaled down face is used to get fake 3D location for edge pixels in the seams * as this number approaches 1.0f the likelihood increases of float precision errors where * it is occluded by an adjacent face */ @@ -218,6 +219,7 @@ typedef struct ProjPaintState { RegionView3D *rv3d; ARegion *ar; Scene *scene; + int source; /* PROJ_SRC_**** */ Brush *brush; short tool, blend; @@ -259,6 +261,7 @@ typedef struct ProjPaintState { float screenMax[2]; float screen_width; /* Calculated from screenMin & screenMax */ float screen_height; + int winx, winy; /* from the carea or from the projection render */ /* options for projection painting */ int do_layer_clone; @@ -286,6 +289,11 @@ typedef struct ProjPaintState { float viewPos[3]; /* View location in object relative 3D space, so can compare to verts */ float clipsta, clipend; + /* reproject vars */ + Image *reproject_image; + ImBuf *reproject_ibuf; + + /* threads */ int thread_tot; int bucketMin[2]; @@ -404,7 +412,7 @@ static void image_undo_restore(bContext *C, ListBase *lb) UndoImageTile *tile; tmpibuf= IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, - IB_rectfloat|IB_rect, 0); + IB_rectfloat|IB_rect, 0); for(tile=lb->first; tile; tile=tile->next) { /* find image based on name, pointer becomes invalid with global undo */ @@ -480,14 +488,14 @@ static void barycentric_weights_v2_persp(float v1[4], float v2[4], float v3[4], wtot = w[0]+w[1]+w[2]; if (wtot != 0.0f) { - wtot_inv = 1.0f/wtot; + wtot_inv = 1.0f/wtot; - w[0] = w[0]*wtot_inv; - w[1] = w[1]*wtot_inv; - w[2] = w[2]*wtot_inv; + w[0] = w[0]*wtot_inv; + w[1] = w[1]*wtot_inv; + w[2] = w[2]*wtot_inv; } else /* dummy values for zero area face */ - w[0] = w[1] = w[2] = 1.0f/3.0f; + w[0] = w[1] = w[2] = 1.0f/3.0f; } static float VecZDepthOrtho(float pt[2], float v1[3], float v2[3], float v3[3], float w[3]) @@ -633,8 +641,8 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float } } else { - xi = (uv[0]*ibuf->x) + 0.5f; - yi = (uv[1]*ibuf->y) + 0.5f; + xi = (int)((uv[0]*ibuf->x) + 0.5f); + yi = (int)((uv[1]*ibuf->y) + 0.5f); //if (xi<0 || xi>=ibuf->x || yi<0 || yi>=ibuf->y) return 0; @@ -673,7 +681,7 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float * 0 : no occlusion * -1 : no occlusion but 2D intersection is true (avoid testing the other half of a quad) * 1 : occluded - 2 : occluded with w[3] weights set (need to know in some cases) */ + 2 : occluded with w[3] weights set (need to know in some cases) */ static int project_paint_occlude_ptv(float pt[3], float v1[3], float v2[3], float v3[3], float w[3], int is_ortho) { @@ -742,6 +750,7 @@ static int project_bucket_point_occluded(const ProjPaintState *ps, LinkNode *buc int face_index; int isect_ret; float w[3]; /* not needed when clipping */ + const short do_clip= ps->rv3d ? ps->rv3d->rflag & RV3D_CLIPPING : 0; /* we could return 0 for 1 face buckets, as long as this function assumes * that the point its testing is only every originated from an existing face */ @@ -751,14 +760,14 @@ static int project_bucket_point_occluded(const ProjPaintState *ps, LinkNode *buc if (orig_face != face_index) { mf = ps->dm_mface + face_index; - if(ps->rv3d->rflag & RV3D_CLIPPING) + if(do_clip) isect_ret = project_paint_occlude_ptv_clip(ps, mf, pixelScreenCo, ps->screenCoords[mf->v1], ps->screenCoords[mf->v2], ps->screenCoords[mf->v3], 0); else isect_ret = project_paint_occlude_ptv(pixelScreenCo, ps->screenCoords[mf->v1], ps->screenCoords[mf->v2], ps->screenCoords[mf->v3], w, ps->is_ortho); /* Note, if isect_ret==-1 then we dont want to test the other side of the quad */ if (isect_ret==0 && mf->v4) { - if(ps->rv3d->rflag & RV3D_CLIPPING) + if(do_clip) isect_ret = project_paint_occlude_ptv_clip(ps, mf, pixelScreenCo, ps->screenCoords[mf->v1], ps->screenCoords[mf->v3], ps->screenCoords[mf->v4], 1); else isect_ret = project_paint_occlude_ptv(pixelScreenCo, ps->screenCoords[mf->v1], ps->screenCoords[mf->v3], ps->screenCoords[mf->v4], w, ps->is_ortho); @@ -1044,15 +1053,15 @@ static void uv_image_outset(float (*orig_uv)[2], float (*outset_uv)[2], const fl * This is incorrect. Its already given radians but without it wont work. * need to look into a fix - campbell */ if (is_quad) { - a1 = shell_angle_to_dist(angle_normalized_v2v2(dir4, dir1) * (M_PI/180.0f)); - a2 = shell_angle_to_dist(angle_normalized_v2v2(dir1, dir2) * (M_PI/180.0f)); - a3 = shell_angle_to_dist(angle_normalized_v2v2(dir2, dir3) * (M_PI/180.0f)); - a4 = shell_angle_to_dist(angle_normalized_v2v2(dir3, dir4) * (M_PI/180.0f)); + a1 = shell_angle_to_dist(angle_normalized_v2v2(dir4, dir1) * ((float)M_PI/180.0f)); + a2 = shell_angle_to_dist(angle_normalized_v2v2(dir1, dir2) * ((float)M_PI/180.0f)); + a3 = shell_angle_to_dist(angle_normalized_v2v2(dir2, dir3) * ((float)M_PI/180.0f)); + a4 = shell_angle_to_dist(angle_normalized_v2v2(dir3, dir4) * ((float)M_PI/180.0f)); } else { - a1 = shell_angle_to_dist(angle_normalized_v2v2(dir3, dir1) * (M_PI/180.0f)); - a2 = shell_angle_to_dist(angle_normalized_v2v2(dir1, dir2) * (M_PI/180.0f)); - a3 = shell_angle_to_dist(angle_normalized_v2v2(dir2, dir3) * (M_PI/180.0f)); + a1 = shell_angle_to_dist(angle_normalized_v2v2(dir3, dir1) * ((float)M_PI/180.0f)); + a2 = shell_angle_to_dist(angle_normalized_v2v2(dir1, dir2) * ((float)M_PI/180.0f)); + a3 = shell_angle_to_dist(angle_normalized_v2v2(dir2, dir3) * ((float)M_PI/180.0f)); } if (is_quad) { @@ -1188,7 +1197,7 @@ static void screen_px_from_persp( w[2] *= wtot_inv; } else { - w[0] = w[1] = w[2] = 1.0/3.0; /* dummy values for zero area face */ + w[0] = w[1] = w[2] = 1.0f/3.0f; /* dummy values for zero area face */ } /* done re-weighting */ @@ -1633,10 +1642,10 @@ static void scale_quad(float insetCos[4][3], float *origCos[4], const float inse mul_v3_fl(insetCos[2], inset); mul_v3_fl(insetCos[3], inset); - add_v3_v3v3(insetCos[0], insetCos[0], cent); - add_v3_v3v3(insetCos[1], insetCos[1], cent); - add_v3_v3v3(insetCos[2], insetCos[2], cent); - add_v3_v3v3(insetCos[3], insetCos[3], cent); + add_v3_v3(insetCos[0], cent); + add_v3_v3(insetCos[1], cent); + add_v3_v3(insetCos[2], cent); + add_v3_v3(insetCos[3], cent); } @@ -1655,9 +1664,9 @@ static void scale_tri(float insetCos[4][3], float *origCos[4], const float inset mul_v3_fl(insetCos[1], inset); mul_v3_fl(insetCos[2], inset); - add_v3_v3v3(insetCos[0], insetCos[0], cent); - add_v3_v3v3(insetCos[1], insetCos[1], cent); - add_v3_v3v3(insetCos[2], insetCos[2], cent); + add_v3_v3(insetCos[0], cent); + add_v3_v3(insetCos[1], cent); + add_v3_v3(insetCos[2], cent); } @@ -2199,6 +2208,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i int uv_clip_tot; const short is_ortho = ps->is_ortho; const short do_backfacecull = ps->do_backfacecull; + const short do_clip= ps->rv3d ? ps->rv3d->rflag & RV3D_CLIPPING : 0; vCo[0] = ps->dm_mvert[mf->v1].co; vCo[1] = ps->dm_mvert[mf->v2].co; @@ -2298,7 +2308,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i else screen_px_from_persp(uv, v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, pixelScreenCo, w); /* a pitty we need to get the worldspace pixel location here */ - if(ps->rv3d->rflag & RV3D_CLIPPING) { + if(do_clip) { interp_v3_v3v3v3(wco, ps->dm_mvert[ (*(&mf->v1 + i1)) ].co, ps->dm_mvert[ (*(&mf->v1 + i2)) ].co, ps->dm_mvert[ (*(&mf->v1 + i3)) ].co, w); if(view3d_test_clipping(ps->rv3d, wco, 1)) { continue; /* Watch out that no code below this needs to run */ @@ -2479,8 +2489,8 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i if (!is_ortho) { pixelScreenCo[3] = 1.0f; mul_m4_v4((float(*)[4])ps->projectMat, pixelScreenCo); /* cast because of const */ - pixelScreenCo[0] = (float)(ps->ar->winx/2.0f)+(ps->ar->winx/2.0f)*pixelScreenCo[0]/pixelScreenCo[3]; - pixelScreenCo[1] = (float)(ps->ar->winy/2.0f)+(ps->ar->winy/2.0f)*pixelScreenCo[1]/pixelScreenCo[3]; + pixelScreenCo[0] = (float)(ps->winx/2.0f)+(ps->winx/2.0f)*pixelScreenCo[0]/pixelScreenCo[3]; + pixelScreenCo[1] = (float)(ps->winy/2.0f)+(ps->winy/2.0f)*pixelScreenCo[1]/pixelScreenCo[3]; pixelScreenCo[2] = pixelScreenCo[2]/pixelScreenCo[3]; /* Use the depth for bucket point occlusion */ } @@ -2503,17 +2513,17 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i w[0]=w[1]=w[2]= 0.0; if (side) { w[fidx1?fidx1-1:0] = fac; - w[fidx2?fidx2-1:0] = 1.0-fac; + w[fidx2?fidx2-1:0] = 1.0f-fac; } else { w[fidx1] = fac; - w[fidx2] = 1.0-fac; + w[fidx2] = 1.0f-fac; } #endif } /* a pitty we need to get the worldspace pixel location here */ - if(ps->rv3d->rflag & RV3D_CLIPPING) { + if(do_clip) { if (side) interp_v3_v3v3v3(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w); else interp_v3_v3v3v3(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w); @@ -2561,11 +2571,12 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i static void project_paint_bucket_bounds(const ProjPaintState *ps, const float min[2], const float max[2], int bucketMin[2], int bucketMax[2]) { /* divide by bucketWidth & bucketHeight so the bounds are offset in bucket grid units */ - bucketMin[0] = (int)(((float)(min[0] - ps->screenMin[0]) / ps->screen_width) * ps->buckets_x) + 0.5f; /* these offsets of 0.5 and 1.5 seem odd but they are correct */ - bucketMin[1] = (int)(((float)(min[1] - ps->screenMin[1]) / ps->screen_height) * ps->buckets_y) + 0.5f; + /* XXX: the offset of 0.5 is always truncated to zero and the offset of 1.5f is always truncated to 1, is this really correct?? - jwilkins */ + bucketMin[0] = (int)((int)(((float)(min[0] - ps->screenMin[0]) / ps->screen_width) * ps->buckets_x) + 0.5f); /* these offsets of 0.5 and 1.5 seem odd but they are correct */ + bucketMin[1] = (int)((int)(((float)(min[1] - ps->screenMin[1]) / ps->screen_height) * ps->buckets_y) + 0.5f); - bucketMax[0] = (int)(((float)(max[0] - ps->screenMin[0]) / ps->screen_width) * ps->buckets_x) + 1.5f; - bucketMax[1] = (int)(((float)(max[1] - ps->screenMin[1]) / ps->screen_height) * ps->buckets_y) + 1.5f; + bucketMax[0] = (int)((int)(((float)(max[0] - ps->screenMin[0]) / ps->screen_width) * ps->buckets_x) + 1.5f); + bucketMax[1] = (int)((int)(((float)(max[1] - ps->screenMin[1]) / ps->screen_height) * ps->buckets_y) + 1.5f); /* incase the rect is outside the mesh 2d bounds */ CLAMP(bucketMin[0], 0, ps->buckets_x); @@ -2758,6 +2769,19 @@ static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf, #endif } +static int project_paint_view_clip(View3D *v3d, RegionView3D *rv3d, float *clipsta, float *clipend) +{ + int orth= get_view3d_cliprange(v3d, rv3d, clipsta, clipend); + + if (orth) { /* only needed for ortho */ + float fac = 2.0f / ((*clipend) - (*clipsta)); + *clipsta *= fac; + *clipend *= fac; + } + + return orth; +} + /* run once per stroke before projection painting */ static void project_paint_begin(ProjPaintState *ps) { @@ -2766,8 +2790,9 @@ static void project_paint_begin(ProjPaintState *ps) float no[3]; - float (*projScreenCo)[4]; /* Note, we could have 4D vectors are only needed for */ + float *projScreenCo; /* Note, we could have 4D vectors are only needed for */ float projMargin; + /* Image Vars - keep track of images we have used */ LinkNode *image_LinkList = NULL; LinkNode *node; @@ -2781,22 +2806,29 @@ static void project_paint_begin(ProjPaintState *ps) int a, i; /* generic looping vars */ int image_index = -1, face_index; + MVert *mv; MemArena *arena; /* at the moment this is just ps->arena_mt[0], but use this to show were not multithreading */ /* ---- end defines ---- */ - ED_view3d_local_clipping(ps->rv3d, ps->ob->obmat); /* faster clipping lookups */ + if(ps->source==PROJ_SRC_VIEW) + ED_view3d_local_clipping(ps->rv3d, ps->ob->obmat); /* faster clipping lookups */ /* paint onto the derived mesh */ /* Workaround for subsurf selection, try the display mesh first */ - if(ps->ob->derivedFinal && CustomData_has_layer( &ps->ob->derivedFinal->faceData, CD_MTFACE)) { + if (ps->source==PROJ_SRC_IMAGE_CAM) { + /* using render mesh, assume only camera was rendered from */ + ps->dm = mesh_create_derived_render(ps->scene, ps->ob, ps->v3d->customdata_mask | CD_MASK_MTFACE); + ps->dm_release= TRUE; + } + else if(ps->ob->derivedFinal && CustomData_has_layer( &ps->ob->derivedFinal->faceData, CD_MTFACE)) { ps->dm = ps->ob->derivedFinal; ps->dm_release= FALSE; } else { - ps->dm = mesh_get_derived_final(ps->scene, ps->ob, ps->v3d->customdata_mask); + ps->dm = mesh_get_derived_final(ps->scene, ps->ob, ps->v3d->customdata_mask | CD_MASK_MTFACE); ps->dm_release= TRUE; } @@ -2830,6 +2862,7 @@ static void project_paint_begin(ProjPaintState *ps) if (ps->dm_mtface_clone==NULL || ps->dm_mtface_clone==ps->dm_mtface) { ps->do_layer_clone = 0; ps->dm_mtface_clone= NULL; + printf("ACK!\n"); } } @@ -2861,83 +2894,126 @@ static void project_paint_begin(ProjPaintState *ps) ps->viewDir[1] = 0.0f; ps->viewDir[2] = 1.0f; - view3d_get_object_project_mat(ps->rv3d, ps->ob, ps->projectMat); - - /* viewDir - object relative */ - invert_m4_m4(ps->ob->imat, ps->ob->obmat); - copy_m3_m4(mat, ps->rv3d->viewinv); - mul_m3_v3(mat, ps->viewDir); - copy_m3_m4(mat, ps->ob->imat); - mul_m3_v3(mat, ps->viewDir); - normalize_v3(ps->viewDir); - - /* viewPos - object relative */ - VECCOPY(ps->viewPos, ps->rv3d->viewinv[3]); - copy_m3_m4(mat, ps->ob->imat); - mul_m3_v3(mat, ps->viewPos); - add_v3_v3v3(ps->viewPos, ps->viewPos, ps->ob->imat[3]); - - { /* only use these for running 'get_view3d_viewplane' */ - rctf viewplane; - - ps->is_ortho = get_view3d_viewplane(ps->v3d, ps->rv3d, ps->ar->winx, ps->ar->winy, &viewplane, &ps->clipsta, &ps->clipend, NULL); - - //printf("%f %f\n", ps->clipsta, ps->clipend); - if (ps->is_ortho) { /* only needed for ortho */ - float fac = 2.0f / (ps->clipend - ps->clipsta); - ps->clipsta *= fac; - ps->clipend *= fac; + { + float viewmat[4][4]; + float viewinv[4][4]; + + invert_m4_m4(ps->ob->imat, ps->ob->obmat); + + if(ps->source==PROJ_SRC_VIEW) { + /* normal drawing */ + ps->winx= ps->ar->winx; + ps->winy= ps->ar->winy; + + copy_m4_m4(viewmat, ps->rv3d->viewmat); + copy_m4_m4(viewinv, ps->rv3d->viewinv); + + view3d_get_object_project_mat(ps->rv3d, ps->ob, ps->projectMat); + + ps->is_ortho= project_paint_view_clip(ps->v3d, ps->rv3d, &ps->clipsta, &ps->clipend); } else { - /* TODO - can we even adjust for clip start/end? */ - } - - } - - ps->is_airbrush = (ps->brush->flag & BRUSH_AIRBRUSH) ? 1 : 0; - - ps->is_texbrush = (ps->brush->mtex.tex) ? 1 : 0; + /* reprojection */ + float winmat[4][4]; + float vmat[4][4]; + ps->winx= ps->reproject_ibuf->x; + ps->winy= ps->reproject_ibuf->y; + + if (ps->source==PROJ_SRC_IMAGE_VIEW) { + /* image stores camera data, tricky */ + IDProperty *idgroup= IDP_GetProperties(&ps->reproject_image->id, 0); + IDProperty *view_data= IDP_GetPropertyFromGroup(idgroup, PROJ_VIEW_DATA_ID); + + float *array= (float *)IDP_Array(view_data); + + /* use image array, written when creating image */ + memcpy(winmat, array, sizeof(winmat)); array += sizeof(winmat)/sizeof(float); + memcpy(viewmat, array, sizeof(viewmat)); array += sizeof(viewmat)/sizeof(float); + ps->clipsta= array[0]; + ps->clipend= array[1]; + ps->is_ortho= array[2] ? 1:0; + + invert_m4_m4(viewinv, viewmat); + } + else if (ps->source==PROJ_SRC_IMAGE_CAM) { + Object *camera= ps->scene->camera; + + /* dont actually use these */ + float _viewdx, _viewdy, _ycor, _lens=0.0f; + rctf _viewplane; + + /* viewmat & viewinv */ + copy_m4_m4(viewinv, ps->scene->camera->obmat); + normalize_m4(viewinv); + invert_m4_m4(viewmat, viewinv); + + /* camera winmat */ + object_camera_matrix(&ps->scene->r, camera, ps->winx, ps->winy, 0, + winmat, &_viewplane, &ps->clipsta, &ps->clipend, + &_lens, &_ycor, &_viewdx, &_viewdy); + + ps->is_ortho= (ps->scene->r.mode & R_ORTHO) ? 1 : 0; + } + + /* same as view3d_get_object_project_mat */ + mul_m4_m4m4(vmat, ps->ob->obmat, viewmat); + mul_m4_m4m4(ps->projectMat, vmat, winmat); + } + + + /* viewDir - object relative */ + invert_m4_m4(ps->ob->imat, ps->ob->obmat); + copy_m3_m4(mat, viewinv); + mul_m3_v3(mat, ps->viewDir); + copy_m3_m4(mat, ps->ob->imat); + mul_m3_v3(mat, ps->viewDir); + normalize_v3(ps->viewDir); + + /* viewPos - object relative */ + VECCOPY(ps->viewPos, viewinv[3]); + copy_m3_m4(mat, ps->ob->imat); + mul_m3_v3(mat, ps->viewPos); + add_v3_v3(ps->viewPos, ps->ob->imat[3]); + } /* calculate vert screen coords * run this early so we can calculate the x/y resolution of our bucket rect */ INIT_MINMAX2(ps->screenMin, ps->screenMax); ps->screenCoords = MEM_mallocN(sizeof(float) * ps->dm_totvert * 4, "ProjectPaint ScreenVerts"); - projScreenCo = ps->screenCoords; + projScreenCo= *ps->screenCoords; if (ps->is_ortho) { - for(a=0; a < ps->dm_totvert; a++, projScreenCo++) { - VECCOPY((*projScreenCo), ps->dm_mvert[a].co); - mul_m4_v3(ps->projectMat, (*projScreenCo)); + for(a=0, mv=ps->dm_mvert; a < ps->dm_totvert; a++, mv++, projScreenCo+=4) { + mul_v3_m4v3(projScreenCo, ps->projectMat, mv->co); /* screen space, not clamped */ - (*projScreenCo)[0] = (float)(ps->ar->winx/2.0f)+(ps->ar->winx/2.0f)*(*projScreenCo)[0]; - (*projScreenCo)[1] = (float)(ps->ar->winy/2.0f)+(ps->ar->winy/2.0f)*(*projScreenCo)[1]; - DO_MINMAX2((*projScreenCo), ps->screenMin, ps->screenMax); + projScreenCo[0] = (float)(ps->winx/2.0f)+(ps->winx/2.0f)*projScreenCo[0]; + projScreenCo[1] = (float)(ps->winy/2.0f)+(ps->winy/2.0f)*projScreenCo[1]; + DO_MINMAX2(projScreenCo, ps->screenMin, ps->screenMax); } } else { - for(a=0; a < ps->dm_totvert; a++, projScreenCo++) { - VECCOPY((*projScreenCo), ps->dm_mvert[a].co); - (*projScreenCo)[3] = 1.0f; + for(a=0, mv=ps->dm_mvert; a < ps->dm_totvert; a++, mv++, projScreenCo+=4) { + copy_v3_v3(projScreenCo, mv->co); + projScreenCo[3] = 1.0f; - mul_m4_v4(ps->projectMat, (*projScreenCo)); + mul_m4_v4(ps->projectMat, projScreenCo); - - if ((*projScreenCo)[3] > ps->clipsta) { + if (projScreenCo[3] > ps->clipsta) { /* screen space, not clamped */ - (*projScreenCo)[0] = (float)(ps->ar->winx/2.0f)+(ps->ar->winx/2.0f)*(*projScreenCo)[0]/(*projScreenCo)[3]; - (*projScreenCo)[1] = (float)(ps->ar->winy/2.0f)+(ps->ar->winy/2.0f)*(*projScreenCo)[1]/(*projScreenCo)[3]; - (*projScreenCo)[2] = (*projScreenCo)[2]/(*projScreenCo)[3]; /* Use the depth for bucket point occlusion */ - DO_MINMAX2((*projScreenCo), ps->screenMin, ps->screenMax); + projScreenCo[0] = (float)(ps->winx/2.0f)+(ps->winx/2.0f)*projScreenCo[0]/projScreenCo[3]; + projScreenCo[1] = (float)(ps->winy/2.0f)+(ps->winy/2.0f)*projScreenCo[1]/projScreenCo[3]; + projScreenCo[2] = projScreenCo[2]/projScreenCo[3]; /* Use the depth for bucket point occlusion */ + DO_MINMAX2(projScreenCo, ps->screenMin, ps->screenMax); } else { /* TODO - deal with cases where 1 side of a face goes behind the view ? * * After some research this is actually very tricky, only option is to * clip the derived mesh before painting, which is a Pain */ - (*projScreenCo)[0] = FLT_MAX; + projScreenCo[0] = FLT_MAX; } } } @@ -2952,14 +3028,23 @@ static void project_paint_begin(ProjPaintState *ps) ps->screenMax[1] += projMargin; ps->screenMin[1] -= projMargin; + if(ps->source==PROJ_SRC_VIEW) { #ifdef PROJ_DEBUG_WINCLIP - CLAMP(ps->screenMin[0], -ps->brush->size, ps->ar->winx + ps->brush->size); - CLAMP(ps->screenMax[0], -ps->brush->size, ps->ar->winx + ps->brush->size); + CLAMP(ps->screenMin[0], (float)(-ps->brush->size), (float)(ps->winx + ps->brush->size)); + CLAMP(ps->screenMax[0], (float)(-ps->brush->size), (float)(ps->winx + ps->brush->size)); - CLAMP(ps->screenMin[1], -ps->brush->size, ps->ar->winy + ps->brush->size); - CLAMP(ps->screenMax[1], -ps->brush->size, ps->ar->winy + ps->brush->size); + CLAMP(ps->screenMin[1], (float)(-ps->brush->size), (float)(ps->winy + ps->brush->size)); + CLAMP(ps->screenMax[1], (float)(-ps->brush->size), (float)(ps->winy + ps->brush->size)); #endif - + } + else { /* reprojection, use bounds */ + ps->screenMin[0]= 0; + ps->screenMax[0]= (float)(ps->winx); + + ps->screenMin[1]= 0; + ps->screenMax[1]= (float)(ps->winy); + } + /* only for convenience */ ps->screen_width = ps->screenMax[0] - ps->screenMin[0]; ps->screen_height = ps->screenMax[1] - ps->screenMin[1]; @@ -2999,21 +3084,18 @@ static void project_paint_begin(ProjPaintState *ps) ps->thread_tot = BLI_system_thread_count(); } for (a=0; athread_tot; a++) { - ps->arena_mt[a] = BLI_memarena_new(1<<16); + ps->arena_mt[a] = BLI_memarena_new(1<<16, "project paint arena"); } arena = ps->arena_mt[0]; if (ps->do_backfacecull && ps->do_mask_normal) { - MVert *v = ps->dm_mvert; float viewDirPersp[3]; ps->vertFlags = MEM_callocN(sizeof(char) * ps->dm_totvert, "paint-vertFlags"); - for(a=0; a < ps->dm_totvert; a++, v++) { - no[0] = (float)(v->no[0] / 32767.0f); - no[1] = (float)(v->no[1] / 32767.0f); - no[2] = (float)(v->no[2] / 32767.0f); + for(a=0, mv=ps->dm_mvert; a < ps->dm_totvert; a++, mv++) { + normal_short_to_float_v3(no, mv->no); if (ps->is_ortho) { if (angle_normalized_v3v3(ps->viewDir, no) >= ps->normal_angle) { /* 1 vert of this face is towards us */ @@ -3021,7 +3103,7 @@ static void project_paint_begin(ProjPaintState *ps) } } else { - sub_v3_v3v3(viewDirPersp, ps->viewPos, v->co); + sub_v3_v3v3(viewDirPersp, ps->viewPos, mv->co); normalize_v3(viewDirPersp); if (angle_normalized_v3v3(viewDirPersp, no) >= ps->normal_angle) { /* 1 vert of this face is towards us */ ps->vertFlags[a] |= PROJ_VERT_CULL; @@ -3041,7 +3123,7 @@ static void project_paint_begin(ProjPaintState *ps) BLI_linklist_prepend_arena(&ps->vertFaces[mf->v2], SET_INT_IN_POINTER(face_index), arena); BLI_linklist_prepend_arena(&ps->vertFaces[mf->v3], SET_INT_IN_POINTER(face_index), arena); if (mf->v4) { - BLI_linklist_prepend_arena(&ps->vertFaces[ mf->v4 ], SET_INT_IN_POINTER(face_index), arena); + BLI_linklist_prepend_arena(&ps->vertFaces[mf->v4], SET_INT_IN_POINTER(face_index), arena); } } #endif @@ -3160,14 +3242,13 @@ static void project_paint_begin_clone(ProjPaintState *ps, int mouse[2]) /* setup clone offset */ if (ps->tool == PAINT_TOOL_CLONE) { float projCo[4]; - float *curs= give_cursor(ps->scene, ps->v3d); - VECCOPY(projCo, curs); + copy_v3_v3(projCo, give_cursor(ps->scene, ps->v3d)); mul_m4_v3(ps->ob->imat, projCo); projCo[3] = 1.0f; mul_m4_v4(ps->projectMat, projCo); - ps->cloneOffset[0] = mouse[0] - ((float)(ps->ar->winx/2.0f)+(ps->ar->winx/2.0f)*projCo[0]/projCo[3]); - ps->cloneOffset[1] = mouse[1] - ((float)(ps->ar->winy/2.0f)+(ps->ar->winy/2.0f)*projCo[1]/projCo[3]); + ps->cloneOffset[0] = mouse[0] - ((float)(ps->winx/2.0f)+(ps->winx/2.0f)*projCo[0]/projCo[3]); + ps->cloneOffset[1] = mouse[1] - ((float)(ps->winy/2.0f)+(ps->winy/2.0f)*projCo[1]/projCo[3]); } } @@ -3365,31 +3446,44 @@ static int project_image_refresh_tagged(ProjPaintState *ps) /* run this per painting onto each mouse location */ static int project_bucket_iter_init(ProjPaintState *ps, const float mval_f[2]) { - float min_brush[2], max_brush[2]; - float size_half = ((float)ps->brush->size) * 0.5f; - - /* so we dont have a bucket bounds that is way too small to paint into */ - // if (size_half < 1.0f) size_half = 1.0f; // this dosnt work yet :/ - - min_brush[0] = mval_f[0] - size_half; - min_brush[1] = mval_f[1] - size_half; - - max_brush[0] = mval_f[0] + size_half; - max_brush[1] = mval_f[1] + size_half; - - /* offset to make this a valid bucket index */ - project_paint_bucket_bounds(ps, min_brush, max_brush, ps->bucketMin, ps->bucketMax); - - /* mouse outside the model areas? */ - if (ps->bucketMin[0]==ps->bucketMax[0] || ps->bucketMin[1]==ps->bucketMax[1]) { - return 0; + if(ps->source==PROJ_SRC_VIEW) { + float min_brush[2], max_brush[2]; + float size_half = ((float)ps->brush->size) * 0.5f; + + /* so we dont have a bucket bounds that is way too small to paint into */ + // if (size_half < 1.0f) size_half = 1.0f; // this dosnt work yet :/ + + min_brush[0] = mval_f[0] - size_half; + min_brush[1] = mval_f[1] - size_half; + + max_brush[0] = mval_f[0] + size_half; + max_brush[1] = mval_f[1] + size_half; + + /* offset to make this a valid bucket index */ + project_paint_bucket_bounds(ps, min_brush, max_brush, ps->bucketMin, ps->bucketMax); + + /* mouse outside the model areas? */ + if (ps->bucketMin[0]==ps->bucketMax[0] || ps->bucketMin[1]==ps->bucketMax[1]) { + return 0; + } + + ps->context_bucket_x = ps->bucketMin[0]; + ps->context_bucket_y = ps->bucketMin[1]; + } + else { /* reproject: PROJ_SRC_* */ + ps->bucketMin[0]= 0; + ps->bucketMin[1]= 0; + + ps->bucketMax[0]= ps->buckets_x; + ps->bucketMax[1]= ps->buckets_y; + + ps->context_bucket_x = 0; + ps->context_bucket_y = 0; } - - ps->context_bucket_x = ps->bucketMin[0]; - ps->context_bucket_y = ps->bucketMin[1]; return 1; } + static int project_bucket_iter_next(ProjPaintState *ps, int *bucket_index, rctf *bucket_bounds, const float mval[2]) { if (ps->thread_tot > 1) @@ -3403,7 +3497,9 @@ static int project_bucket_iter_next(ProjPaintState *ps, int *bucket_index, rctf /* use bucket_bounds for project_bucket_isect_circle and project_bucket_init*/ project_bucket_bounds(ps, ps->context_bucket_x, ps->context_bucket_y, bucket_bounds); - if (project_bucket_isect_circle(ps->context_bucket_x, ps->context_bucket_y, mval, ps->brush->size * ps->brush->size, bucket_bounds)) { + if ( (ps->source != PROJ_SRC_VIEW) || + project_bucket_isect_circle(ps->context_bucket_x, ps->context_bucket_y, mval, (float)(ps->brush->size * ps->brush->size), bucket_bounds) + ) { *bucket_index = ps->context_bucket_x + (ps->context_bucket_y * ps->buckets_x); ps->context_bucket_x++; @@ -3450,13 +3546,27 @@ static void blend_color_mix(unsigned char *cp, const unsigned char *cp1, const u static void blend_color_mix_float(float *cp, const float *cp1, const float *cp2, const float fac) { - const float mfac= 1.0-fac; + const float mfac= 1.0f-fac; cp[0]= mfac*cp1[0] + fac*cp2[0]; cp[1]= mfac*cp1[1] + fac*cp2[1]; cp[2]= mfac*cp1[2] + fac*cp2[2]; cp[3]= mfac*cp1[3] + fac*cp2[3]; } +static void blend_color_mix_accum(unsigned char *cp, const unsigned char *cp1, const unsigned char *cp2, const int fac) +{ + /* this and other blending modes previously used >>8 instead of /255. both + are not equivalent (>>8 is /256), and the former results in rounding + errors that can turn colors black fast after repeated blending */ + const int mfac= 255-fac; + const int alpha= cp1[3] + ((fac * cp2[3]) / 255); + + cp[0]= (mfac*cp1[0]+fac*cp2[0])/255; + cp[1]= (mfac*cp1[1]+fac*cp2[1])/255; + cp[2]= (mfac*cp1[2]+fac*cp2[2])/255; + cp[3]= alpha > 255 ? 255 : alpha; +} + static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask) { if (ps->is_airbrush==0 && mask < 1.0f) { @@ -3588,6 +3698,7 @@ static void *do_projectpaint_thread(void *ph_v) float mask = 1.0f; /* airbrush wont use mask */ unsigned short mask_short; float size_half = ((float)ps->brush->size) * 0.5f; + short lock_alpha= ELEM(ps->brush->blend, IMB_BLEND_ERASE_ALPHA, IMB_BLEND_ADD_ALPHA) ? 0 : ps->brush->flag & BRUSH_LOCK_ALPHA; LinkNode *smearPixels = NULL; LinkNode *smearPixels_f = NULL; @@ -3598,11 +3709,11 @@ static void *do_projectpaint_thread(void *ph_v) pos_ofs[0] = pos[0] - lastpos[0]; pos_ofs[1] = pos[1] - lastpos[1]; - smearArena = BLI_memarena_new(1<<16); + smearArena = BLI_memarena_new(1<<16, "paint smear arena"); } /* avoid a square root with every dist comparison */ - brush_size_sqared = ps->brush->size * ps->brush->size; + brush_size_sqared = (float)(ps->brush->size * ps->brush->size); /* printf("brush bounds %d %d %d %d\n", bucketMin[0], bucketMin[1], bucketMax[0], bucketMax[1]); */ @@ -3614,91 +3725,117 @@ static void *do_projectpaint_thread(void *ph_v) project_bucket_init(ps, thread_index, bucket_index, &bucket_bounds); } - for (node = ps->bucketRect[bucket_index]; node; node = node->next) { + if(ps->source != PROJ_SRC_VIEW) { + + /* Re-Projection, simple, no brushes! */ - projPixel = (ProjPixel *)node->link; + for (node = ps->bucketRect[bucket_index]; node; node = node->next) { + projPixel = (ProjPixel *)node->link; + + bicubic_interpolation_color(ps->reproject_ibuf, projPixel->newColor.ch, NULL, projPixel->projCoSS[0], projPixel->projCoSS[1]); + if(projPixel->newColor.ch[3]) { + mask = ((float)projPixel->mask)/65535.0f; + blend_color_mix_accum(projPixel->pixel.ch_pt, projPixel->origColor.ch, projPixel->newColor.ch, (mask*projPixel->newColor.ch[3])); + + } + } + } + else { + /* Normal brush painting */ - /*dist = len_v2v2(projPixel->projCoSS, pos);*/ /* correct but uses a sqrtf */ - dist_nosqrt = Vec2Lenf_nosqrt(projPixel->projCoSS, pos); - - /*if (dist < s->brush->size) {*/ /* correct but uses a sqrtf */ - if (dist_nosqrt < brush_size_sqared && (dist=sqrtf(dist_nosqrt)) < size_half) { - falloff = brush_curve_strength_clamp(ps->brush, dist, size_half); - if (falloff > 0.0f) { - if (ps->is_texbrush) { - brush_sample_tex(ps->brush, projPixel->projCoSS, rgba); - alpha = rgba[3]; - } else { - alpha = 1.0f; - } - - if (ps->is_airbrush) { - /* for an aurbrush there is no real mask, so just multiply the alpha by it */ - alpha *= falloff * ps->brush->alpha; - mask = ((float)projPixel->mask)/65535.0f; - } - else { - /* This brush dosnt accumulate so add some curve to the brushes falloff */ - falloff = 1.0f - falloff; - falloff = 1.0f - (falloff * falloff); + for (node = ps->bucketRect[bucket_index]; node; node = node->next) { + + projPixel = (ProjPixel *)node->link; + + /*dist = len_v2v2(projPixel->projCoSS, pos);*/ /* correct but uses a sqrtf */ + dist_nosqrt = Vec2Lenf_nosqrt(projPixel->projCoSS, pos); + + /*if (dist < s->brush->size) {*/ /* correct but uses a sqrtf */ + if (dist_nosqrt < brush_size_sqared && (dist=sqrtf(dist_nosqrt)) < size_half) { + falloff = brush_curve_strength_clamp(ps->brush, dist, size_half); + + if (falloff > 0.0f) { + if (ps->is_texbrush) { + brush_sample_tex(ps->brush, projPixel->projCoSS, rgba); + alpha = rgba[3]; + } else { + alpha = 1.0f; + } - mask_short = projPixel->mask * (ps->brush->alpha * falloff); - if (mask_short > projPixel->mask_max) { - mask = ((float)mask_short)/65535.0f; - projPixel->mask_max = mask_short; + if (ps->is_airbrush) { + /* for an aurbrush there is no real mask, so just multiply the alpha by it */ + alpha *= falloff * ps->brush->alpha; + mask = ((float)projPixel->mask)/65535.0f; } else { - /*mask = ((float)projPixel->mask_max)/65535.0f;*/ + /* This brush dosnt accumulate so add some curve to the brushes falloff */ + falloff = 1.0f - falloff; + falloff = 1.0f - (falloff * falloff); - /* Go onto the next pixel */ - continue; - } - } - - if (alpha > 0.0f) { - - if (last_index != projPixel->image_index) { - last_index = projPixel->image_index; - last_projIma = projImages + last_index; - - last_projIma->touch = 1; - is_floatbuf = last_projIma->ibuf->rect_float ? 1 : 0; - } - - last_partial_redraw_cell = last_projIma->partRedrawRect + projPixel->bb_cell_index; - last_partial_redraw_cell->x1 = MIN2(last_partial_redraw_cell->x1, projPixel->x_px); - last_partial_redraw_cell->y1 = MIN2(last_partial_redraw_cell->y1, projPixel->y_px); - - last_partial_redraw_cell->x2 = MAX2(last_partial_redraw_cell->x2, projPixel->x_px+1); - last_partial_redraw_cell->y2 = MAX2(last_partial_redraw_cell->y2, projPixel->y_px+1); - - - switch(tool) { - case PAINT_TOOL_CLONE: - if (is_floatbuf) { - if (((ProjPixelClone *)projPixel)->clonepx.f[3]) { - do_projectpaint_clone_f(ps, projPixel, rgba, alpha, mask); - } + mask_short = (unsigned short)(projPixel->mask * (ps->brush->alpha * falloff)); + if (mask_short > projPixel->mask_max) { + mask = ((float)mask_short)/65535.0f; + projPixel->mask_max = mask_short; } else { - if (((ProjPixelClone*)projPixel)->clonepx.ch[3]) { - do_projectpaint_clone(ps, projPixel, rgba, alpha, mask); - } + /*mask = ((float)projPixel->mask_max)/65535.0f;*/ + + /* Go onto the next pixel */ + continue; } - break; - case PAINT_TOOL_SMEAR: - sub_v2_v2v2(co, projPixel->projCoSS, pos_ofs); - - if (is_floatbuf) do_projectpaint_smear_f(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels_f, co); - else do_projectpaint_smear(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels, co); - break; - default: - if (is_floatbuf) do_projectpaint_draw_f(ps, projPixel, rgba, alpha, mask); - else do_projectpaint_draw(ps, projPixel, rgba, alpha, mask); - break; } + + if (alpha > 0.0f) { + + if (last_index != projPixel->image_index) { + last_index = projPixel->image_index; + last_projIma = projImages + last_index; + + last_projIma->touch = 1; + is_floatbuf = last_projIma->ibuf->rect_float ? 1 : 0; + } + + last_partial_redraw_cell = last_projIma->partRedrawRect + projPixel->bb_cell_index; + last_partial_redraw_cell->x1 = MIN2(last_partial_redraw_cell->x1, projPixel->x_px); + last_partial_redraw_cell->y1 = MIN2(last_partial_redraw_cell->y1, projPixel->y_px); + + last_partial_redraw_cell->x2 = MAX2(last_partial_redraw_cell->x2, projPixel->x_px+1); + last_partial_redraw_cell->y2 = MAX2(last_partial_redraw_cell->y2, projPixel->y_px+1); + + + switch(tool) { + case PAINT_TOOL_CLONE: + if (is_floatbuf) { + if (((ProjPixelClone *)projPixel)->clonepx.f[3]) { + do_projectpaint_clone_f(ps, projPixel, rgba, alpha, mask); + } + } + else { + if (((ProjPixelClone*)projPixel)->clonepx.ch[3]) { + do_projectpaint_clone(ps, projPixel, rgba, alpha, mask); + } + } + break; + case PAINT_TOOL_SMEAR: + sub_v2_v2v2(co, projPixel->projCoSS, pos_ofs); + + if (is_floatbuf) do_projectpaint_smear_f(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels_f, co); + else do_projectpaint_smear(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels, co); + break; + default: + if (is_floatbuf) do_projectpaint_draw_f(ps, projPixel, rgba, alpha, mask); + else do_projectpaint_draw(ps, projPixel, rgba, alpha, mask); + break; + } + } + + if(lock_alpha) { + if (is_floatbuf) projPixel->pixel.f_pt[3]= projPixel->origColor.f[3]; + else projPixel->pixel.ch_pt[3]= projPixel->origColor.ch[3]; + } + + /* done painting */ } - /* done painting */ } } } @@ -3747,8 +3884,8 @@ static int project_paint_op(void *state, ImBuf *ibufb, float *lastpos, float *po //memset(&handles[a], 0, sizeof(BakeShade)); handles[a].ps = ps; - VECCOPY2D(handles[a].mval, pos); - VECCOPY2D(handles[a].prevmval, lastpos); + copy_v2_v2(handles[a].mval, pos); + copy_v2_v2(handles[a].prevmval, lastpos); /* thread spesific */ handles[a].thread_index = a; @@ -3796,8 +3933,8 @@ static int project_paint_sub_stroke(ProjPaintState *ps, BrushPainter *painter, i /* Use mouse coords as floats for projection painting */ float pos[2]; - pos[0] = mval_i[0]; - pos[1] = mval_i[1]; + pos[0] = (float)(mval_i[0]); + pos[1] = (float)(mval_i[1]); // we may want to use this later // brush_painter_require_imbuf(painter, ((ibuf->rect_float)? 1: 0), 0, 0); @@ -3921,7 +4058,8 @@ static int imapaint_ibuf_add_if(ImBuf *ibuf, unsigned int x, unsigned int y, flo { float inrgb[3]; - if ((x >= ibuf->x) || (y >= ibuf->y)) { + // XXX: signed unsigned mismatch + if ((x >= (unsigned int)(ibuf->x)) || (y >= (unsigned int)(ibuf->y))) { if (torus) imapaint_ibuf_get_set_rgb(ibuf, x, y, 1, 0, inrgb); else return 0; } @@ -4427,21 +4565,74 @@ static void paint_redraw(bContext *C, ImagePaintState *s, int final) } } +/* initialize project paint settings from context */ +static void project_state_init(bContext *C, Object *ob, ProjPaintState *ps) +{ + Scene *scene= CTX_data_scene(C); + ToolSettings *settings= scene->toolsettings; + Brush *brush= paint_brush(&settings->imapaint.paint); + + /* brush */ + ps->brush = brush; + ps->tool = brush->imagepaint_tool; + ps->blend = brush->blend; + + ps->is_airbrush = (brush->flag & BRUSH_AIRBRUSH) ? 1 : 0; + ps->is_texbrush = (brush->mtex.tex) ? 1 : 0; + + + /* these can be NULL */ + ps->v3d= CTX_wm_view3d(C); + ps->rv3d= CTX_wm_region_view3d(C); + ps->ar= CTX_wm_region(C); + + ps->scene= scene; + ps->ob= ob; /* allow override of active object */ + + /* setup projection painting data */ + ps->do_backfacecull = (settings->imapaint.flag & IMAGEPAINT_PROJECT_BACKFACE) ? 0 : 1; + ps->do_occlude = (settings->imapaint.flag & IMAGEPAINT_PROJECT_XRAY) ? 0 : 1; + ps->do_mask_normal = (settings->imapaint.flag & IMAGEPAINT_PROJECT_FLAT) ? 0 : 1; + + if (ps->tool == PAINT_TOOL_CLONE) + ps->do_layer_clone = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE); + + ps->do_layer_stencil = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL) ? 1 : 0; + ps->do_layer_stencil_inv = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) ? 1 : 0; + + +#ifndef PROJ_DEBUG_NOSEAMBLEED + ps->seam_bleed_px = settings->imapaint.seam_bleed; /* pixel num to bleed */ +#endif + + if(ps->do_mask_normal) { + ps->normal_angle_inner = settings->imapaint.normal_angle; + ps->normal_angle = (ps->normal_angle_inner + 90.0f) * 0.5f; + } + else { + ps->normal_angle_inner= ps->normal_angle= settings->imapaint.normal_angle; + } + + ps->normal_angle_inner *= (float)(M_PI_2 / 90); + ps->normal_angle *= (float)(M_PI_2 / 90); + ps->normal_angle_range = ps->normal_angle - ps->normal_angle_inner; + + if(ps->normal_angle_range <= 0.0f) + ps->do_mask_normal = 0; /* no need to do blending */ +} + static int texture_paint_init(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); ToolSettings *settings= scene->toolsettings; - PaintOperation *pop; - Brush *brush; + Brush *brush= paint_brush(&settings->imapaint.paint); + PaintOperation *pop= MEM_callocN(sizeof(PaintOperation), "PaintOperation"); /* caller frees */ - pop= MEM_callocN(sizeof(PaintOperation), "PaintOperation"); pop->first= 1; op->customdata= pop; /* initialize from context */ if(CTX_wm_region_view3d(C)) { - pop->ps.v3d= CTX_wm_view3d(C); - pop->ps.rv3d= CTX_wm_region_view3d(C); pop->mode= PAINT_MODE_3D; if(!(settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)) @@ -4455,34 +4646,19 @@ static int texture_paint_init(bContext *C, wmOperator *op) } pop->s.scene= scene; - pop->ps.scene= scene; pop->s.screen= CTX_wm_screen(C); - pop->ps.ar= CTX_wm_region(C); - - /* intialize brush */ - brush= paint_brush(&settings->imapaint.paint); - if(!brush) - return 0; pop->s.brush = brush; pop->s.tool = brush->imagepaint_tool; if(pop->mode == PAINT_MODE_3D && (pop->s.tool == PAINT_TOOL_CLONE)) pop->s.tool = PAINT_TOOL_DRAW; - pop->s.blend = pop->s.brush->blend; - - if(pop->mode == PAINT_MODE_3D_PROJECT) { - pop->ps.brush = pop->s.brush; - pop->ps.tool = pop->s.tool; - pop->ps.blend = pop->s.blend; - - pop->brush_size_orig = pop->ps.brush->size; /* not nice hack because 1 size brushes always fail with projection paint */ - } + pop->s.blend = brush->blend; + pop->brush_size_orig= brush->size; if(pop->mode != PAINT_MODE_2D) { Mesh *me; - pop->ps.ob = pop->s.ob = OBACT; - if (!pop->s.ob || !(pop->s.ob->lay & pop->ps.v3d->lay)) return 0; + pop->s.ob = OBACT; pop->s.me = get_mesh(pop->s.ob); if (!pop->s.me) return 0; @@ -4513,40 +4689,23 @@ static int texture_paint_init(bContext *C, wmOperator *op) return 0; } } - + /* note, if we have no UVs on the derived mesh, then we must return here */ if(pop->mode == PAINT_MODE_3D_PROJECT) { - /* setup projection painting data */ - pop->ps.do_backfacecull = (settings->imapaint.flag & IMAGEPAINT_PROJECT_BACKFACE) ? 0 : 1; - pop->ps.do_occlude = (settings->imapaint.flag & IMAGEPAINT_PROJECT_XRAY) ? 0 : 1; - pop->ps.do_mask_normal = (settings->imapaint.flag & IMAGEPAINT_PROJECT_FLAT) ? 0 : 1;; - - if (pop->ps.tool == PAINT_TOOL_CLONE) - pop->ps.do_layer_clone = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE); - - pop->ps.do_layer_stencil = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL) ? 1 : 0; - pop->ps.do_layer_stencil_inv = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) ? 1 : 0; - - -#ifndef PROJ_DEBUG_NOSEAMBLEED - pop->ps.seam_bleed_px = settings->imapaint.seam_bleed; /* pixel num to bleed */ -#endif - if(pop->ps.do_mask_normal) { - pop->ps.normal_angle_inner = settings->imapaint.normal_angle; - pop->ps.normal_angle = (pop->ps.normal_angle_inner + 90.0f) * 0.5f; - } - else { - pop->ps.normal_angle_inner= pop->ps.normal_angle= settings->imapaint.normal_angle; - } + /* initialize all data from the context */ + project_state_init(C, OBACT, &pop->ps); - pop->ps.normal_angle_inner *= M_PI_2 / 90; - pop->ps.normal_angle *= M_PI_2 / 90; - pop->ps.normal_angle_range = pop->ps.normal_angle - pop->ps.normal_angle_inner; - - if(pop->ps.normal_angle_range <= 0.0f) - pop->ps.do_mask_normal = 0; /* no need to do blending */ + pop->ps.source= PROJ_SRC_VIEW; + if (pop->ps.ob==NULL || !(pop->ps.ob->lay & pop->ps.v3d->lay)) + return 0; + + /* Dont allow brush size below 2 */ + if (brush->size <= 1) + brush->size = 2; + + /* allocate and initialize spacial data structures */ project_paint_begin(&pop->ps); if(pop->ps.dm==NULL) @@ -4571,8 +4730,8 @@ static void paint_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) int mouse[2], redraw; RNA_float_get_array(itemptr, "mouse", mousef); - mouse[0] = mousef[0]; - mouse[1] = mousef[1]; + mouse[0] = (int)(mousef[0]); + mouse[1] = (int)(mousef[1]); time= RNA_float_get(itemptr, "time"); pressure= RNA_float_get(itemptr, "pressure"); @@ -4692,8 +4851,8 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event) /* fill in stroke */ RNA_collection_add(op->ptr, "stroke", &itemptr); - mousef[0] = mouse[0]; - mousef[1] = mouse[1]; + mousef[0] = (float)(mouse[0]); + mousef[1] = (float)(mouse[1]); RNA_float_set_array(&itemptr, "mouse", mousef); RNA_float_set(&itemptr, "time", (float)(time - pop->starttime)); RNA_float_set(&itemptr, "pressure", pressure); @@ -4735,6 +4894,7 @@ static int paint_modal(bContext *C, wmOperator *op, wmEvent *event) paint_exit(C, op); return OPERATOR_FINISHED; case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: paint_apply_event(C, op, event); break; case TIMER: @@ -4809,7 +4969,7 @@ static void brush_drawcursor(bContext *C, int x, int y, void *customdata) glColor4ub(255, 255, 255, 128); glEnable( GL_LINE_SMOOTH ); glEnable(GL_BLEND); - glutil_draw_lined_arc(0.0, M_PI*2.0, brush->size*0.5f, 40); + glutil_draw_lined_arc(0, (float)(M_PI*2.0), brush->size*0.5f, 40); glDisable(GL_BLEND); glDisable( GL_LINE_SMOOTH ); @@ -4836,7 +4996,7 @@ static int paint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *eve ToolSettings *ts = CTX_data_scene(C)->toolsettings; get_imapaint_zoom(C, &zoom, &zoom); toggle_paint_cursor(C, !ts->imapaint.paintcursor); - brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), 0.5 * zoom); + brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), 0.5f * zoom); return WM_radial_control_invoke(C, op, event); } @@ -4845,7 +5005,7 @@ static int paint_radial_control_modal(bContext *C, wmOperator *op, wmEvent *even ToolSettings *ts = CTX_data_scene(C)->toolsettings; int ret = WM_radial_control_modal(C, op, event); if(ret != OPERATOR_RUNNING_MODAL) - toggle_paint_cursor(C, !ts->imapaint.paintcursor); + toggle_paint_cursor(C, !ts->imapaint.paintcursor); return ret; } @@ -4856,7 +5016,7 @@ static int paint_radial_control_exec(bContext *C, wmOperator *op) int ret; char str[256]; get_imapaint_zoom(C, &zoom, &zoom); - ret = brush_radial_control_exec(op, brush, 2.0 / zoom); + ret = brush_radial_control_exec(op, brush, 2.0f / zoom); WM_radial_control_string(op, str, 256); WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush); @@ -4893,9 +5053,7 @@ static void grab_clone_apply(bContext *C, wmOperator *op) float delta[2]; RNA_float_get_array(op->ptr, "delta", delta); - brush->clone.offset[0] += delta[0]; - brush->clone.offset[1] += delta[1]; - + add_v2_v2(brush->clone.offset, delta); ED_region_tag_redraw(CTX_wm_region(C)); } @@ -4912,8 +5070,7 @@ static int grab_clone_invoke(bContext *C, wmOperator *op, wmEvent *event) GrabClone *cmv; cmv= MEM_callocN(sizeof(GrabClone), "GrabClone"); - cmv->startoffset[0]= brush->clone.offset[0]; - cmv->startoffset[1]= brush->clone.offset[1]; + copy_v2_v2(cmv->startoffset, brush->clone.offset); cmv->startx= event->x; cmv->starty= event->y; op->customdata= cmv; @@ -4946,8 +5103,7 @@ static int grab_clone_modal(bContext *C, wmOperator *op, wmEvent *event) delta[1]= fy - startfy; RNA_float_set_array(op->ptr, "delta", delta); - brush->clone.offset[0]= cmv->startoffset[0]; - brush->clone.offset[1]= cmv->startoffset[1]; + copy_v2_v2(brush->clone.offset, cmv->startoffset); grab_clone_apply(C, op); break; @@ -5219,3 +5375,194 @@ int facemask_paint_poll(bContext *C) return paint_facesel_test(CTX_data_active_object(C)); } +/* use project paint to re-apply an image */ +static int texture_paint_camera_project_exec(bContext *C, wmOperator *op) +{ + Image *image= BLI_findlink(&CTX_data_main(C)->image, RNA_enum_get(op->ptr, "image")); + Scene *scene= CTX_data_scene(C); + ProjPaintState ps; + int orig_brush_size; + IDProperty *idgroup; + IDProperty *view_data= NULL; + + memset(&ps, 0, sizeof(ps)); + + project_state_init(C, OBACT, &ps); + + if(ps.ob==NULL || ps.ob->type != OB_MESH) { + BKE_report(op->reports, RPT_ERROR, "No active mesh object."); + return OPERATOR_CANCELLED; + } + + if(image==NULL) { + BKE_report(op->reports, RPT_ERROR, "Image could not be found."); + return OPERATOR_CANCELLED; + } + + ps.reproject_image= image; + ps.reproject_ibuf= BKE_image_get_ibuf(image, NULL); + + if(ps.reproject_ibuf==NULL || ps.reproject_ibuf->rect==NULL) { + BKE_report(op->reports, RPT_ERROR, "Image data could not be found."); + return OPERATOR_CANCELLED; + } + + idgroup= IDP_GetProperties(&image->id, 0); + + if(idgroup) { + view_data= IDP_GetPropertyFromGroup(idgroup, PROJ_VIEW_DATA_ID); + + /* type check to make sure its ok */ + if(view_data->len != PROJ_VIEW_DATA_SIZE || view_data->type != IDP_ARRAY || view_data->subtype != IDP_FLOAT) { + BKE_report(op->reports, RPT_ERROR, "Image project data invalid."); + return OPERATOR_CANCELLED; + } + } + + if(view_data) { + /* image has stored view projection info */ + ps.source= PROJ_SRC_IMAGE_VIEW; + } + else { + ps.source= PROJ_SRC_IMAGE_CAM; + + if(scene->camera==NULL) { + BKE_report(op->reports, RPT_ERROR, "No active camera set."); + return OPERATOR_CANCELLED; + } + } + + /* override */ + ps.is_texbrush= 0; + ps.is_airbrush= 1; + orig_brush_size= ps.brush->size; + ps.brush->size= 32; /* cover the whole image */ + + ps.tool= PAINT_TOOL_DRAW; /* so pixels are initialized with minimal info */ + + scene->toolsettings->imapaint.flag |= IMAGEPAINT_DRAWING; + + undo_paint_push_begin(UNDO_PAINT_IMAGE, "Image Paint", + image_undo_restore, image_undo_free); + + /* allocate and initialize spacial data structures */ + project_paint_begin(&ps); + + if(ps.dm==NULL) { + ps.brush->size= orig_brush_size; + return OPERATOR_CANCELLED; + } + else { + float pos[2]= {0.0, 0.0}; + float lastpos[2]= {0.0, 0.0}; + int a; + + for (a=0; a < ps.image_tot; a++) + partial_redraw_array_init(ps.projImages[a].partRedrawRect); + + project_paint_op(&ps, NULL, lastpos, pos); + + project_image_refresh_tagged(&ps); + + for (a=0; a < ps.image_tot; a++) { + GPU_free_image(ps.projImages[a].ima); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ps.projImages[a].ima); + } + } + + project_paint_end(&ps); + + scene->toolsettings->imapaint.flag &= ~IMAGEPAINT_DRAWING; + ps.brush->size= orig_brush_size; + + return OPERATOR_FINISHED; +} + +void PAINT_OT_project_image(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Project Image"; + ot->idname= "PAINT_OT_project_image"; + ot->description= "Project an edited render from the active camera back onto the object"; + + /* api callbacks */ + ot->invoke= WM_enum_search_invoke; + ot->exec= texture_paint_camera_project_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + prop= RNA_def_enum(ot->srna, "image", DummyRNA_NULL_items, 0, "Image", ""); + RNA_def_enum_funcs(prop, RNA_image_itemf); + ot->prop= prop; +} + +static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op) +{ + Image *image; + ImBuf *ibuf; + char filename[FILE_MAX]; + + Scene *scene= CTX_data_scene(C); + ToolSettings *settings= scene->toolsettings; + int w= settings->imapaint.screen_grab_size[0]; + int h= settings->imapaint.screen_grab_size[1]; + int maxsize; + + RNA_string_get(op->ptr, "filepath", filename); + + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxsize); + + if(w > maxsize) w= maxsize; + if(h > maxsize) h= maxsize; + + ibuf= ED_view3d_draw_offscreen_imbuf(CTX_data_scene(C), CTX_wm_view3d(C), CTX_wm_region(C), w, h); + image= BKE_add_image_imbuf(ibuf); + + if(image) { + /* now for the trickyness. store the view projection here! + * reprojection will reuse this */ + View3D *v3d= CTX_wm_view3d(C); + RegionView3D *rv3d= CTX_wm_region_view3d(C); + + IDPropertyTemplate val; + IDProperty *idgroup= IDP_GetProperties(&image->id, 1); + IDProperty *view_data; + int orth; + float *array; + + val.array.len = PROJ_VIEW_DATA_SIZE; + val.array.type = IDP_FLOAT; + view_data = IDP_New(IDP_ARRAY, val, PROJ_VIEW_DATA_ID); + + array= (float *)IDP_Array(view_data); + memcpy(array, rv3d->winmat, sizeof(rv3d->winmat)); array += sizeof(rv3d->winmat)/sizeof(float); + memcpy(array, rv3d->viewmat, sizeof(rv3d->viewmat)); array += sizeof(rv3d->viewmat)/sizeof(float); + orth= project_paint_view_clip(v3d, rv3d, &array[0], &array[1]); + array[2]= orth ? 1.0f : 0.0f; /* using float for a bool is dodgy but since its an extra member in the array... easier then adding a single bool prop */ + + IDP_AddToGroup(idgroup, view_data); + + rename_id(&image->id, "image_view"); + } + + return OPERATOR_FINISHED; +} + +void PAINT_OT_image_from_view(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Image from View"; + ot->idname= "PAINT_OT_image_from_view"; + ot->description= "Make an image from the current 3D view for re-projection"; + + /* api callbacks */ + ot->exec= texture_paint_image_from_view_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER; + + RNA_def_string_file_name(ot->srna, "filepath", "", FILE_MAX, "File Path", "Name of the file"); +} diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h index b9b604480ec..0ae7c7fac19 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.h +++ b/source/blender/editors/sculpt_paint/paint_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -50,8 +50,8 @@ typedef void (*StrokeUpdateStep)(struct bContext *C, struct PaintStroke *stroke, typedef void (*StrokeDone)(struct bContext *C, struct PaintStroke *stroke); struct PaintStroke *paint_stroke_new(struct bContext *C, - StrokeGetLocation get_location, StrokeTestStart test_start, - StrokeUpdateStep update_step, StrokeDone done); + StrokeGetLocation get_location, StrokeTestStart test_start, + StrokeUpdateStep update_step, StrokeDone done); void paint_stroke_free(struct PaintStroke *stroke); int paint_stroke_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event); @@ -93,6 +93,9 @@ void PAINT_OT_sample_color(struct wmOperatorType *ot); void PAINT_OT_clone_cursor_set(struct wmOperatorType *ot); void PAINT_OT_texture_paint_toggle(struct wmOperatorType *ot); void PAINT_OT_texture_paint_radial_control(struct wmOperatorType *ot); +void PAINT_OT_project_image(struct wmOperatorType *ot); +void PAINT_OT_image_from_view(struct wmOperatorType *ot); + /* paint_utils.c */ int imapaint_pick_face(struct ViewContext *vc, struct Mesh *me, int *mval, unsigned int *index); @@ -107,6 +110,13 @@ void PAINT_OT_face_select_all(struct wmOperatorType *ot); int facemask_paint_poll(struct bContext *C); +/* stroke operator */ +typedef enum wmBrushStrokeMode { + WM_BRUSHSTROKE_NORMAL, + WM_BRUSHSTROKE_INVERT, + WM_BRUSHSTROKE_SMOOTH, +} wmBrushStrokeMode; + /* paint_undo.c */ typedef void (*UndoRestoreCb)(struct bContext *C, struct ListBase *lb); typedef void (*UndoFreeCb)(struct ListBase *lb); diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index b43a78eb226..5d52b0a3272 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -19,7 +19,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "DNA_brush_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -27,7 +26,6 @@ #include "BKE_context.h" #include "BKE_paint.h" -#include "ED_sculpt.h" #include "ED_screen.h" #include "UI_resources.h" @@ -36,48 +34,78 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_enum_types.h" #include "paint_intern.h" #include "sculpt_intern.h" #include +//#include /* Brush operators */ static int brush_add_exec(bContext *C, wmOperator *op) { /*int type = RNA_enum_get(op->ptr, "type");*/ - Brush *br = NULL; + Paint *paint = paint_get_active(CTX_data_scene(C)); + Brush *br = paint_brush(paint); - br = add_brush("Brush"); + if (br) + br = copy_brush(br); + else + br = add_brush("Brush"); - if(br) - paint_brush_set(paint_get_active(CTX_data_scene(C)), br); + paint_brush_set(paint_get_active(CTX_data_scene(C)), br); return OPERATOR_FINISHED; } -static EnumPropertyItem brush_type_items[] = { - {OB_MODE_SCULPT, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt", ""}, - {OB_MODE_VERTEX_PAINT, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""}, - {OB_MODE_WEIGHT_PAINT, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""}, - {OB_MODE_TEXTURE_PAINT, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""}, - {0, NULL, 0, NULL, NULL}}; - void BRUSH_OT_add(wmOperatorType *ot) { /* identifiers */ ot->name= "Add Brush"; - ot->description= "Add brush by mode type"; + ot->description= "Add brush by mode type"; ot->idname= "BRUSH_OT_add"; /* api callbacks */ ot->exec= brush_add_exec; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= OPTYPE_UNDO; +} - RNA_def_enum(ot->srna, "type", brush_type_items, OB_MODE_VERTEX_PAINT, "Type", "Which paint mode to create the brush for."); + +static int brush_scale_size_exec(bContext *C, wmOperator *op) +{ + /*int type = RNA_enum_get(op->ptr, "type");*/ + Paint *paint = paint_get_active(CTX_data_scene(C)); + Brush *br = paint_brush(paint); + float factor = RNA_float_get(op->ptr, "scalar"); + + if (br) { + if (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_SIZE) { + U.sculpt_paint_unified_size *= factor; + } + else { + br->size *= factor; + } + } + + return OPERATOR_FINISHED; +} + +void BRUSH_OT_scale_size(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Scale Sculpt/Paint Brush Size"; + ot->description= "Change brush size by a scalar"; + ot->idname= "BRUSH_OT_scale_size"; + + /* api callbacks */ + ot->exec= brush_scale_size_exec; + + /* flags */ + ot->flag= OPTYPE_UNDO; + + RNA_def_float(ot->srna, "scalar", 1, 0, 2, "Scalar", "Factor to scale brush size by", 0, 2); } static int vertex_color_set_exec(bContext *C, wmOperator *op) @@ -111,8 +139,10 @@ void ED_operatortypes_paint(void) { /* brush */ WM_operatortype_append(BRUSH_OT_add); + WM_operatortype_append(BRUSH_OT_scale_size); WM_operatortype_append(BRUSH_OT_curve_preset); + /* image */ WM_operatortype_append(PAINT_OT_texture_paint_toggle); WM_operatortype_append(PAINT_OT_texture_paint_radial_control); @@ -121,6 +151,9 @@ void ED_operatortypes_paint(void) WM_operatortype_append(PAINT_OT_sample_color); WM_operatortype_append(PAINT_OT_grab_clone); WM_operatortype_append(PAINT_OT_clone_cursor_set); + WM_operatortype_append(PAINT_OT_project_image); + WM_operatortype_append(PAINT_OT_image_from_view); + /* weight */ WM_operatortype_append(PAINT_OT_weight_paint_toggle); @@ -141,56 +174,53 @@ void ED_operatortypes_paint(void) WM_operatortype_append(PAINT_OT_face_select_all); } + static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *path) { wmKeyMapItem *kmi; kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 0); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", TWOKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 1); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", THREEKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 2); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FOURKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 3); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FIVEKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 4); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SIXKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 5); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SEVENKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 6); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", EIGHTKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 7); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", NINEKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 8); kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ZEROKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); + RNA_string_set(kmi->ptr, "data_path", path); RNA_int_set(kmi->ptr, "value", 9); } static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *path) { wmKeyMapItem *kmi; - - kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", LEFTBRACKETKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); - RNA_int_set(kmi->ptr, "value", -20); - RNA_boolean_set(kmi->ptr, "relative", 1); - - kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", RIGHTBRACKETKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", path); - RNA_int_set(kmi->ptr, "value", 20); - RNA_boolean_set(kmi->ptr, "relative", 1); -} + + kmi= WM_keymap_add_item(keymap, "BRUSH_OT_scale_size", LEFTBRACKETKEY, KM_PRESS, 0, 0); + RNA_float_set(kmi->ptr, "scalar", 0.9); + + kmi= WM_keymap_add_item(keymap, "BRUSH_OT_scale_size", RIGHTBRACKETKEY, KM_PRESS, 0, 0); + RNA_float_set(kmi->ptr, "scalar", 10.0/9.0); // 1.1111.... +} void ED_keymap_paint(wmKeyConfig *keyconf) { @@ -202,12 +232,15 @@ void ED_keymap_paint(wmKeyConfig *keyconf) keymap= WM_keymap_find(keyconf, "Sculpt", 0, 0); keymap->poll= sculpt_poll; - RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE); + RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE); RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH); - RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_RADIALCONTROL_ANGLE); + RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_RADIALCONTROL_ANGLE); - WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", WM_BRUSHSTROKE_NORMAL); + RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_BRUSHSTROKE_INVERT); + RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_BRUSHSTROKE_SMOOTH); + + //stroke_mode_modal_keymap(keyconf); for(i=0; i<=5; i++) RNA_int_set(WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY+i, KM_PRESS, KM_CTRL, 0)->ptr, "level", i); @@ -223,44 +256,44 @@ void ED_keymap_paint(wmKeyConfig *keyconf) ed_keymap_paint_brush_switch(keymap, "tool_settings.sculpt.active_brush_index"); ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size"); - + + /* */ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", AKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.brush.use_anchor"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_anchor"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.brush.use_smooth_stroke"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_smooth_stroke"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", RKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.brush.use_rake"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_rake"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", AKEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.brush.use_airbrush"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_airbrush"); /* brush switching */ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", DKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.active_brush_name"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.active_brush_name"); RNA_string_set(kmi->ptr, "value", "Draw"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", SKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.active_brush_name"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.active_brush_name"); RNA_string_set(kmi->ptr, "value", "Smooth"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.active_brush_name"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.active_brush_name"); RNA_string_set(kmi->ptr, "value", "Pinch"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", GKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.active_brush_name"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.active_brush_name"); RNA_string_set(kmi->ptr, "value", "Grab"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", LKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.active_brush_name"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.active_brush_name"); RNA_string_set(kmi->ptr, "value", "Layer"); - + kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", TKEY, KM_PRESS, KM_SHIFT, 0); // was just T in 2.4x - RNA_string_set(kmi->ptr, "path", "tool_settings.sculpt.active_brush_name"); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.active_brush_name"); RNA_string_set(kmi->ptr, "value", "Flatten"); - /* Vertex Paint mode */ keymap= WM_keymap_find(keyconf, "Vertex Paint", 0, 0); @@ -278,7 +311,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf) ed_keymap_paint_brush_size(keymap, "tool_settings.vertex_paint.brush.size"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */ - RNA_string_set(kmi->ptr, "path", "vertex_paint_object.data.use_paint_mask"); + RNA_string_set(kmi->ptr, "data_path", "vertex_paint_object.data.use_paint_mask"); /* Weight Paint mode */ keymap= WM_keymap_find(keyconf, "Weight Paint", 0, 0); @@ -296,7 +329,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf) ed_keymap_paint_brush_size(keymap, "tool_settings.weight_paint.brush.size"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */ - RNA_string_set(kmi->ptr, "path", "weight_paint_object.data.use_paint_mask"); + RNA_string_set(kmi->ptr, "data_path", "weight_paint_object.data.use_paint_mask"); WM_keymap_verify_item(keymap, "PAINT_OT_weight_from_bones", WKEY, KM_PRESS, 0, 0); @@ -316,7 +349,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf) ed_keymap_paint_brush_size(keymap, "tool_settings.image_paint.brush.size"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */ - RNA_string_set(kmi->ptr, "path", "texture_paint_object.data.use_paint_mask"); + RNA_string_set(kmi->ptr, "data_path", "texture_paint_object.data.use_paint_mask"); /* face-mask mode */ keymap= WM_keymap_find(keyconf, "Face Mask", 0, 0); diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index 2adda475866..7b8d7c4b7ef 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -20,7 +20,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Jason Wilkins, Tom Musgrove. * * ***** END GPL LICENSE BLOCK ***** * @@ -28,22 +28,20 @@ #include "MEM_guardedalloc.h" -#include "DNA_brush_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "RNA_access.h" #include "BKE_context.h" #include "BKE_paint.h" +#include "BKE_brush.h" #include "WM_api.h" #include "WM_types.h" #include "BLI_math.h" -#include "PIL_time.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -52,6 +50,9 @@ #include "ED_view3d.h" #include "paint_intern.h" +#include "sculpt_intern.h" // XXX, for expedience in getting this working, refactor later (or this just shows that this needs unification) + +#include "BKE_image.h" #include #include @@ -99,54 +100,748 @@ static void paint_draw_smooth_stroke(bContext *C, int x, int y, void *customdata glDisable(GL_LINE_SMOOTH); } -static void paint_draw_cursor(bContext *C, int x, int y, void *customdata) +#if 0 + +// grid texture for testing + +#define GRID_WIDTH 8 +#define GRID_LENGTH 8 + +#define W (0xFFFFFFFF) +#define G (0x00888888) +#define E (0xE1E1E1E1) +#define C (0xC3C3C3C3) +#define O (0xB4B4B4B4) +#define Q (0xA9A9A9A9) + +static unsigned grid_texture0[256] = { - Paint *paint = paint_get_active(CTX_data_scene(C)); - Brush *brush = paint_brush(paint); + W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W, + W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W, +}; - if(!(paint->flags & PAINT_SHOW_BRUSH)) - return; +static unsigned grid_texture1[64] = +{ + C,C,C,C,C,C,C,C, + C,G,G,G,G,G,G,C, + C,G,G,G,G,G,G,C, + C,G,G,G,G,G,G,C, + C,G,G,G,G,G,G,C, + C,G,G,G,G,G,G,C, + C,G,G,G,G,G,G,C, + C,C,C,C,C,C,C,C, +}; - glColor4ubv(paint_get_active(CTX_data_scene(C))->paint_cursor_col); - glEnable(GL_LINE_SMOOTH); - glEnable(GL_BLEND); +static unsigned grid_texture2[16] = +{ + O,O,O,O, + O,G,G,O, + O,G,G,O, + O,O,O,O, +}; - glTranslatef((float)x, (float)y, 0.0f); - glutil_draw_lined_arc(0.0, M_PI*2.0, brush->size, 40); - glTranslatef((float)-x, (float)-y, 0.0f); +static unsigned grid_texture3[4] = +{ + Q,Q, + Q,Q, +}; - glDisable(GL_BLEND); - glDisable(GL_LINE_SMOOTH); +static unsigned grid_texture4[1] = +{ + Q, +}; + +#undef W +#undef G +#undef E +#undef C +#undef O +#undef Q + +static void load_grid() +{ + static GLuint overlay_texture; + + if (!overlay_texture) { + //GLfloat largest_supported_anisotropy; + + glGenTextures(1, &overlay_texture); + glBindTexture(GL_TEXTURE_2D, overlay_texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture0); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture1); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture2); + glTexImage2D(GL_TEXTURE_2D, 3, GL_RGB, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture3); + glTexImage2D(GL_TEXTURE_2D, 4, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture4); + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + //glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_supported_anisotropy); + //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_supported_anisotropy); + } +} + +#endif + +extern float get_tex_pixel(Brush* br, float u, float v); + +typedef struct Snapshot { + float size[3]; + float ofs[3]; + float rot; + int brush_size; + int winx; + int winy; + int brush_map_mode; + int curve_changed_timestamp; +} Snapshot; + +static int same_snap(Snapshot* snap, Brush* brush, ViewContext* vc) +{ + MTex* mtex = &brush->mtex; + + return + (mtex->tex && + mtex->ofs[0] == snap->ofs[0] && + mtex->ofs[1] == snap->ofs[1] && + mtex->ofs[2] == snap->ofs[2] && + mtex->size[0] == snap->size[0] && + mtex->size[1] == snap->size[1] && + mtex->size[2] == snap->size[2] && + mtex->rot == snap->rot) && + ((mtex->brush_map_mode == MTEX_MAP_MODE_FIXED && sculpt_get_brush_size(brush) <= snap->brush_size) || (sculpt_get_brush_size(brush) == snap->brush_size)) && // make brush smaller shouldn't cause a resample + mtex->brush_map_mode == snap->brush_map_mode && + vc->ar->winx == snap->winx && + vc->ar->winy == snap->winy; +} + +static void make_snap(Snapshot* snap, Brush* brush, ViewContext* vc) +{ + if (brush->mtex.tex) { + snap->brush_map_mode = brush->mtex.brush_map_mode; + copy_v3_v3(snap->ofs, brush->mtex.ofs); + copy_v3_v3(snap->size, brush->mtex.size); + snap->rot = brush->mtex.rot; + } + else { + snap->brush_map_mode = -1; + snap->ofs[0]= snap->ofs[1]= snap->ofs[2]= -1; + snap->size[0]= snap->size[1]= snap->size[2]= -1; + snap->rot = -1; + } + + snap->brush_size = sculpt_get_brush_size(brush); + snap->winx = vc->ar->winx; + snap->winy = vc->ar->winy; +} + +int load_tex(Sculpt *sd, Brush* br, ViewContext* vc) +{ + static GLuint overlay_texture = 0; + static int init = 0; + static int tex_changed_timestamp = -1; + static int curve_changed_timestamp = -1; + static Snapshot snap; + static int old_size = -1; + + GLubyte* buffer = 0; + + int size; + int j; + int refresh; + + if (br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED && !br->mtex.tex) return 0; + + refresh = + !overlay_texture || + (br->mtex.tex && + (!br->mtex.tex->preview || + br->mtex.tex->preview->changed_timestamp[0] != tex_changed_timestamp)) || + !br->curve || + br->curve->changed_timestamp != curve_changed_timestamp || + !same_snap(&snap, br, vc); + + if (refresh) { + if (br->mtex.tex && br->mtex.tex->preview) + tex_changed_timestamp = br->mtex.tex->preview->changed_timestamp[0]; + + if (br->curve) + curve_changed_timestamp = br->curve->changed_timestamp; + + make_snap(&snap, br, vc); + + if (br->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) { + int s = sculpt_get_brush_size(br); + int r = 1; + + for (s >>= 1; s > 0; s >>= 1) + r++; + + size = (1<flags & SCULPT_USE_OPENMP) + for (j= 0; j < size; j++) { + int i; + float y; + float len; + + for (i= 0; i < size; i++) { + + // largely duplicated from tex_strength + + const float rotation = -br->mtex.rot; + float diameter = sculpt_get_brush_size(br); + int index = j*size + i; + float x; + float avg; + + x = (float)i/size; + y = (float)j/size; + + x -= 0.5f; + y -= 0.5f; + + if (br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED) { + x *= vc->ar->winx / diameter; + y *= vc->ar->winy / diameter; + } + else { + x *= 2; + y *= 2; + } + + len = sqrtf(x*x + y*y); + + if ((br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED) || len <= 1) { + /* it is probably worth optimizing for those cases where + the texture is not rotated by skipping the calls to + atan2, sqrtf, sin, and cos. */ + if (br->mtex.tex && (rotation > 0.001 || rotation < -0.001)) { + const float angle = atan2(y, x) + rotation; + + x = len * cos(angle); + y = len * sin(angle); + } + + x *= br->mtex.size[0]; + y *= br->mtex.size[1]; + + x += br->mtex.ofs[0]; + y += br->mtex.ofs[1]; + + avg = br->mtex.tex ? get_tex_pixel(br, x, y) : 1; + + avg += br->texture_sample_bias; + + if (br->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) + avg *= brush_curve_strength(br, len, 1); /* Falloff curve */ + + buffer[index] = (GLubyte)(255*avg); + } + else { + buffer[index] = 0; + } + } + } + + if (!overlay_texture) + glGenTextures(1, &overlay_texture); + } + else { + size= old_size; + } + + glBindTexture(GL_TEXTURE_2D, overlay_texture); + + if (refresh) { + if (!init) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, size, size, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buffer); + init = 1; + } + else { + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, size, size, GL_ALPHA, GL_UNSIGNED_BYTE, buffer); + } + + if (buffer) + MEM_freeN(buffer); + } + + glEnable(GL_TEXTURE_2D); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + if (br->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + } + + return 1; +} + +/* Convert a point in model coordinates to 2D screen coordinates. */ +// XXX duplicated from sculpt.c, deal with this later. +static void projectf(bglMats *mats, const float v[3], float p[2]) +{ + double ux, uy, uz; + + gluProject(v[0],v[1],v[2], mats->modelview, mats->projection, + (GLint *)mats->viewport, &ux, &uy, &uz); + p[0]= ux; + p[1]= uy; +} + +static int project_brush_radius(RegionView3D* rv3d, float radius, float location[3], bglMats* mats) +{ + float view[3], nonortho[3], ortho[3], offset[3], p1[2], p2[2]; + + viewvector(rv3d, location, view); + + // create a vector that is not orthogonal to view + + if (fabsf(view[0]) < 0.1) { + nonortho[0] = view[0] + 1; + nonortho[1] = view[1]; + nonortho[2] = view[2]; + } + else if (fabsf(view[1]) < 0.1) { + nonortho[0] = view[0]; + nonortho[1] = view[1] + 1; + nonortho[2] = view[2]; + } + else { + nonortho[0] = view[0]; + nonortho[1] = view[1]; + nonortho[2] = view[2] + 1; + } + + // get a vector in the plane of the view + cross_v3_v3v3(ortho, nonortho, view); + normalize_v3(ortho); + + // make a point on the surface of the brush tagent to the view + mul_v3_fl(ortho, radius); + add_v3_v3v3(offset, location, ortho); + + // project the center of the brush, and the tagent point to the view onto the screen + projectf(mats, location, p1); + projectf(mats, offset, p2); + + // the distance between these points is the size of the projected brush in pixels + return len_v2v2(p1, p2); +} + +int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, float location[3], float modelview[16], float projection[16], int viewport[4]) +{ + struct PaintStroke *stroke; + float window[2]; + int hit; + + stroke = paint_stroke_new(C, NULL, NULL, NULL, NULL); + + window[0] = x + stroke->vc.ar->winrct.xmin; + window[1] = y + stroke->vc.ar->winrct.ymin; + + memcpy(modelview, stroke->vc.rv3d->viewmat, sizeof(float[16])); + memcpy(projection, stroke->vc.rv3d->winmat, sizeof(float[16])); + memcpy(viewport, stroke->mats.viewport, sizeof(int[4])); + + if (stroke->vc.obact->sculpt && stroke->vc.obact->sculpt->pbvh && sculpt_stroke_get_location(C, stroke, location, window)) { + *pixel_radius = project_brush_radius(stroke->vc.rv3d, sculpt_get_brush_unprojected_radius(stroke->brush), location, &stroke->mats); + + if (*pixel_radius == 0) + *pixel_radius = sculpt_get_brush_size(stroke->brush); + + mul_m4_v3(stroke->vc.obact->sculpt->ob->obmat, location); + + hit = 1; + } + else { + Sculpt* sd = CTX_data_tool_settings(C)->sculpt; + Brush* brush = paint_brush(&sd->paint); + + *pixel_radius = sculpt_get_brush_size(brush); + hit = 0; + } + + paint_stroke_free(stroke); + + return hit; +} + +// XXX duplicated from sculpt.c +float unproject_brush_radius(Object *ob, ViewContext *vc, float center[3], float offset) +{ + float delta[3], scale, loc[3]; + + mul_v3_m4v3(loc, ob->obmat, center); + + initgrabz(vc->rv3d, loc[0], loc[1], loc[2]); + window_to_3d_delta(vc->ar, delta, offset, 0); + + scale= fabsf(mat4_to_scale(ob->obmat)); + scale= (scale == 0.0f)? 1.0f: scale; + + return len_v3(delta)/scale; +} + +// XXX paint cursor now does a lot of the same work that is needed during a sculpt stroke +// problem: all this stuff was not intended to be used at this point, so things feel a +// bit hacked. I've put lots of stuff in Brush that probably better goes in Paint +// Functions should be refactored so that they can be used between sculpt.c and +// paint_stroke.c clearly and optimally and the lines of communication between the +// two modules should be more clearly defined. +static void paint_draw_cursor(bContext *C, int x, int y, void *unused) +{ + ViewContext vc; + + (void)unused; + + view3d_set_viewcontext(C, &vc); + + if (vc.obact->sculpt) { + Paint *paint = paint_get_active(CTX_data_scene(C)); + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + Brush *brush = paint_brush(paint); + + int pixel_radius, viewport[4]; + float location[3], modelview[16], projection[16]; + + int hit; + + int flip; + int sign; + + float* col; + float alpha; + + float visual_strength = sculpt_get_brush_alpha(brush)*sculpt_get_brush_alpha(brush); + + const float min_alpha = 0.20f; + const float max_alpha = 0.80f; + + { + const float u = 0.5f; + const float v = 1 - u; + const float r = 20; + + const float dx = sd->last_x - x; + const float dy = sd->last_y - y; + + if (dx*dx + dy*dy >= r*r) { + sd->last_angle = atan2(dx, dy); + + sd->last_x = u*sd->last_x + v*x; + sd->last_y = u*sd->last_y + v*y; + } + } + + if(!sculpt_get_lock_brush_size(brush) && !(paint->flags & PAINT_SHOW_BRUSH)) + return; + + hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location, modelview, projection, viewport); + + if (sculpt_get_lock_brush_size(brush)) + sculpt_set_brush_size(brush, pixel_radius); + + // XXX: no way currently to know state of pen flip or invert key modifier without starting a stroke + flip = 1; + + sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1); + + if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH)) + col = brush->sub_col; + else + col = brush->add_col; + + alpha = (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ? min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f; + + if (ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED) && brush->flag & BRUSH_TEXTURE_OVERLAY) { + glPushAttrib( + GL_COLOR_BUFFER_BIT| + GL_CURRENT_BIT| + GL_DEPTH_BUFFER_BIT| + GL_ENABLE_BIT| + GL_LINE_BIT| + GL_POLYGON_BIT| + GL_STENCIL_BUFFER_BIT| + GL_TRANSFORM_BIT| + GL_VIEWPORT_BIT| + GL_TEXTURE_BIT); + + if (load_tex(sd, brush, &vc)) { + glEnable(GL_BLEND); + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glDepthMask(GL_FALSE); + glDepthFunc(GL_ALWAYS); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) { + glTranslatef(0.5f, 0.5f, 0); + + if (brush->flag & BRUSH_RAKE) { + glRotatef(sd->last_angle*(float)(180.0/M_PI), 0, 0, 1); + } + else { + glRotatef(sd->special_rotation*(float)(180.0/M_PI), 0, 0, 1); + } + + glTranslatef(-0.5f, -0.5f, 0); + + if (sd->draw_pressure && (brush->flag & BRUSH_SIZE_PRESSURE)) { + glTranslatef(0.5f, 0.5f, 0); + glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1); + glTranslatef(-0.5f, -0.5f, 0); + } + } + + glColor4f( + U.sculpt_paint_overlay_col[0], + U.sculpt_paint_overlay_col[1], + U.sculpt_paint_overlay_col[2], + brush->texture_overlay_alpha / 100.0f); + + glBegin(GL_QUADS); + if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) { + if (sd->draw_anchored) { + glTexCoord2f(0, 0); + glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin); + + glTexCoord2f(1, 0); + glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin); + + glTexCoord2f(1, 1); + glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin); + + glTexCoord2f(0, 1); + glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin); + } + else { + glTexCoord2f(0, 0); + glVertex2f((float)x-sculpt_get_brush_size(brush), (float)y-sculpt_get_brush_size(brush)); + + glTexCoord2f(1, 0); + glVertex2f((float)x+sculpt_get_brush_size(brush), (float)y-sculpt_get_brush_size(brush)); + + glTexCoord2f(1, 1); + glVertex2f((float)x+sculpt_get_brush_size(brush), (float)y+sculpt_get_brush_size(brush)); + + glTexCoord2f(0, 1); + glVertex2f((float)x-sculpt_get_brush_size(brush), (float)y+sculpt_get_brush_size(brush)); + } + } + else { + glTexCoord2f(0, 0); + glVertex2f(0, 0); + + glTexCoord2f(1, 0); + glVertex2f(viewport[2], 0); + + glTexCoord2f(1, 1); + glVertex2f(viewport[2], viewport[3]); + + glTexCoord2f(0, 1); + glVertex2f(0, viewport[3]); + } + glEnd(); + + glPopMatrix(); + } + + glPopAttrib(); + } + + if (hit) { + float unprojected_radius; + + // XXX duplicated from brush_strength & paint_stroke_add_step, refactor later + //wmEvent* event = CTX_wm_window(C)->eventstate; + + if (sd->draw_pressure && (brush->flag & BRUSH_ALPHA_PRESSURE)) + visual_strength *= sd->pressure_value; + + // don't show effect of strength past the soft limit + if (visual_strength > 1) visual_strength = 1; + + if (sd->draw_anchored) { + unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, sd->anchored_size); + } + else { + if (brush->flag & BRUSH_ANCHORED) + unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, 8); + else + unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, sculpt_get_brush_size(brush)); + } + + if (sd->draw_pressure && (brush->flag & BRUSH_SIZE_PRESSURE)) + unprojected_radius *= sd->pressure_value; + + if (!sculpt_get_lock_brush_size(brush)) + sculpt_set_brush_unprojected_radius(brush, unprojected_radius); + + if(!(paint->flags & PAINT_SHOW_BRUSH)) + return; + + } + + glPushAttrib( + GL_COLOR_BUFFER_BIT| + GL_CURRENT_BIT| + GL_DEPTH_BUFFER_BIT| + GL_ENABLE_BIT| + GL_LINE_BIT| + GL_POLYGON_BIT| + GL_STENCIL_BUFFER_BIT| + GL_TRANSFORM_BIT| + GL_VIEWPORT_BIT| + GL_TEXTURE_BIT); + + glColor4f(col[0], col[1], col[2], alpha); + + glEnable(GL_BLEND); + + glEnable(GL_LINE_SMOOTH); + + if (sd->draw_anchored) { + glTranslatef(sd->anchored_initial_mouse[0] - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1] - vc.ar->winrct.ymin, 0.0f); + glutil_draw_lined_arc(0.0, M_PI*2.0, sd->anchored_size, 40); + glTranslatef(-sd->anchored_initial_mouse[0] + vc.ar->winrct.xmin, -sd->anchored_initial_mouse[1] + vc.ar->winrct.xmin, 0.0f); + } + else { + glTranslatef((float)x, (float)y, 0.0f); + glutil_draw_lined_arc(0.0, M_PI*2.0, sculpt_get_brush_size(brush), 40); + glTranslatef(-(float)x, -(float)y, 0.0f); + } + + glPopAttrib(); + } + else { + Paint *paint = paint_get_active(CTX_data_scene(C)); + Brush *brush = paint_brush(paint); + + if(!(paint->flags & PAINT_SHOW_BRUSH)) + return; + + glColor4ubv(paint_get_active(CTX_data_scene(C))->paint_cursor_col); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + + glTranslatef((float)x, (float)y, 0.0f); + glutil_draw_lined_arc(0.0, M_PI*2.0, brush->size, 40); // XXX: for now use the brushes size instead of potentially using the unified size because the feature has been enabled for sculpt + glTranslatef((float)-x, (float)-y, 0.0f); + + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + } } /* Put the location of the next stroke dot into the stroke RNA and apply it to the mesh */ -static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *event, float mouse[2]) +static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *event, float mouse_in[2]) { + Paint *paint = paint_get_active(CTX_data_scene(C)); // XXX + Brush *brush = paint_brush(paint); // XXX + + float mouse[2]; + PointerRNA itemptr; - float pressure = 1; - float center[3] = {0, 0, 0}; - int flip= event->shift?1:0; + + float location[3]; + + float pressure; + int pen_flip; + + ViewContext vc; // XXX + PaintStroke *stroke = op->customdata; - /* XXX: can remove the if statement once all modes have this */ - if(stroke->get_location) - stroke->get_location(C, stroke, center, mouse); + view3d_set_viewcontext(C, &vc); // XXX /* Tablet */ if(event->custom == EVT_DATA_TABLET) { wmTabletData *wmtab= event->customdata; - if(wmtab->Active != EVT_TABLET_NONE) - pressure= wmtab->Pressure; - if(wmtab->Active == EVT_TABLET_ERASER) - flip = 1; + + pressure = (wmtab->Active != EVT_TABLET_NONE) ? wmtab->Pressure : 1; + pen_flip = (wmtab->Active == EVT_TABLET_ERASER); } - + else { + pressure = 1; + pen_flip = 0; + } + + // XXX: temporary check for sculpt mode until things are more unified + if (vc.obact->sculpt) { + float delta[3]; + + brush_jitter_pos(brush, mouse_in, mouse); + + // XXX: meh, this is round about because brush_jitter_pos isn't written in the best way to be reused here + if (brush->flag & BRUSH_JITTER_PRESSURE) { + sub_v3_v3v3(delta, mouse, mouse_in); + mul_v3_fl(delta, pressure); + add_v3_v3v3(mouse, mouse_in, delta); + } + } + else + copy_v3_v3(mouse, mouse_in); + + /* XXX: can remove the if statement once all modes have this */ + if(stroke->get_location) + stroke->get_location(C, stroke, location, mouse); + else + zero_v3(location); + /* Add to stroke */ RNA_collection_add(op->ptr, "stroke", &itemptr); - RNA_float_set_array(&itemptr, "location", center); - RNA_float_set_array(&itemptr, "mouse", mouse); - RNA_boolean_set(&itemptr, "flip", flip); - RNA_float_set(&itemptr, "pressure", pressure); + + RNA_float_set_array(&itemptr, "location", location); + RNA_float_set_array(&itemptr, "mouse", mouse); + RNA_boolean_set (&itemptr, "pen_flip", pen_flip); + RNA_float_set (&itemptr, "pressure", pressure); stroke->last_mouse_position[0] = mouse[0]; stroke->last_mouse_position[1] = mouse[1]; @@ -157,10 +852,14 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *ev /* Returns zero if no sculpt changes should be made, non-zero otherwise */ static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *event) { - output[0] = event->x; + output[0] = event->x; output[1] = event->y; - if(stroke->brush->flag & BRUSH_SMOOTH_STROKE && stroke->brush->sculpt_tool != SCULPT_TOOL_GRAB) { + if ((stroke->brush->flag & BRUSH_SMOOTH_STROKE) && + !ELEM4(stroke->brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_SNAKE_HOOK) && + !(stroke->brush->flag & BRUSH_ANCHORED) && + !(stroke->brush->flag & BRUSH_RESTORE_MESH)) + { float u = stroke->brush->smooth_stroke_factor, v = 1.0 - u; float dx = stroke->last_mouse_position[0] - event->x, dy = stroke->last_mouse_position[1] - event->y; @@ -179,7 +878,9 @@ static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *ev /* Returns zero if the stroke dots should not be spaced, non-zero otherwise */ static int paint_space_stroke_enabled(Brush *br) { - return (br->flag & BRUSH_SPACE) && !(br->flag & BRUSH_ANCHORED) && (br->sculpt_tool != SCULPT_TOOL_GRAB); + return (br->flag & BRUSH_SPACE) && + !(br->flag & BRUSH_ANCHORED) && + !ELEM4(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_SNAKE_HOOK); } /* For brushes with stroke spacing enabled, moves mouse in steps @@ -190,23 +891,34 @@ static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const int cnt = 0; if(paint_space_stroke_enabled(stroke->brush)) { - float mouse[2] = {stroke->last_mouse_position[0], stroke->last_mouse_position[1]}; - float vec[2] = {final_mouse[0] - mouse[0], final_mouse[1] - mouse[1]}; + float mouse[2]; + float vec[2]; float length, scale; - int steps = 0, i; - /* Normalize the vector between the last stroke dot and the goal */ - length = sqrt(vec[0]*vec[0] + vec[1]*vec[1]); + copy_v2_v2(mouse, stroke->last_mouse_position); + sub_v2_v2v2(vec, final_mouse, mouse); + + length = len_v2(vec); if(length > FLT_EPSILON) { - scale = stroke->brush->spacing / length; - vec[0] *= scale; - vec[1] *= scale; + int steps; + int i; + float pressure = 1; + + // XXX duplicate code + if(event->custom == EVT_DATA_TABLET) { + wmTabletData *wmtab= event->customdata; + if(wmtab->Active != EVT_TABLET_NONE) + pressure = stroke->brush->flag & BRUSH_SIZE_PRESSURE ? wmtab->Pressure : 1; + } + + scale = (sculpt_get_brush_size(stroke->brush)*pressure*stroke->brush->spacing/50.0f) / length; + mul_v2_fl(vec, scale); + + steps = (int)(1.0f / scale); - steps = (int)(length / stroke->brush->spacing); for(i = 0; i < steps; ++i, ++cnt) { - mouse[0] += vec[0]; - mouse[1] += vec[1]; + add_v2_v2(mouse, vec); paint_brush_stroke_add_step(C, op, event, mouse); } } @@ -218,10 +930,10 @@ static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const /**** Public API ****/ PaintStroke *paint_stroke_new(bContext *C, - StrokeGetLocation get_location, - StrokeTestStart test_start, - StrokeUpdateStep update_step, - StrokeDone done) + StrokeGetLocation get_location, + StrokeTestStart test_start, + StrokeUpdateStep update_step, + StrokeDone done) { PaintStroke *stroke = MEM_callocN(sizeof(PaintStroke), "PaintStroke"); @@ -278,21 +990,33 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event) MEM_freeN(stroke); return OPERATOR_FINISHED; } - else if(first || event->type == MOUSEMOVE || (event->type == TIMER && (event->customdata == stroke->timer))) { + else if(first || ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (event->type == TIMER && (event->customdata == stroke->timer))) { if(stroke->stroke_started) { if(paint_smooth_stroke(stroke, mouse, event)) { if(paint_space_stroke_enabled(stroke->brush)) { - if(!paint_space_stroke(C, op, event, mouse)) - ;//ED_region_tag_redraw(ar); + if(!paint_space_stroke(C, op, event, mouse)) { + //ED_region_tag_redraw(ar); + } } - else + else { paint_brush_stroke_add_step(C, op, event, mouse); + } } else ;//ED_region_tag_redraw(ar); } } + /* we want the stroke to have the first daub at the start location instead of waiting till we have moved the space distance */ + if(first && + stroke->stroke_started && + paint_space_stroke_enabled(stroke->brush) && + !(stroke->brush->flag & BRUSH_ANCHORED) && + !(stroke->brush->flag & BRUSH_SMOOTH_STROKE)) + { + paint_brush_stroke_add_step(C, op, event, mouse); + } + return OPERATOR_RUNNING_MODAL; } diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 43ab1a9a89e..9baa8e6f95e 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -7,8 +7,6 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_view3d_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -218,16 +216,20 @@ void BRUSH_OT_curve_preset(wmOperatorType *ot) {CURVE_PRESET_SHARP, "SHARP", 0, "Sharp", ""}, {CURVE_PRESET_SMOOTH, "SMOOTH", 0, "Smooth", ""}, {CURVE_PRESET_MAX, "MAX", 0, "Max", ""}, + {CURVE_PRESET_MID9, "MID9", 0, "Mid9", ""}, + {CURVE_PRESET_LINE, "LINE", 0, "Line", ""}, + {CURVE_PRESET_ROUND, "ROUND", 0, "Round", ""}, + {CURVE_PRESET_ROOT, "ROOT", 0, "Root", ""}, {0, NULL, 0, NULL, NULL}}; ot->name= "Preset"; - ot->description= "Set brush shape"; + ot->description= "Set brush shape"; ot->idname= "BRUSH_OT_curve_preset"; ot->exec= brush_curve_preset_exec; ot->poll= brush_curve_preset_poll; - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= OPTYPE_UNDO; RNA_def_enum(ot->srna, "shape", prop_shape_items, CURVE_PRESET_SMOOTH, "Mode", ""); } @@ -244,7 +246,7 @@ static int paint_select_linked_exec(bContext *C, wmOperator *op) void PAINT_OT_face_select_linked(wmOperatorType *ot) { ot->name= "Select Linked"; - ot->description= "Select linked faces"; + ot->description= "Select linked faces"; ot->idname= "PAINT_OT_face_select_linked"; ot->exec= paint_select_linked_exec; @@ -264,7 +266,7 @@ static int paint_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent void PAINT_OT_face_select_linked_pick(wmOperatorType *ot) { ot->name= "Select Linked Pick"; - ot->description= "Select linked faces"; + ot->description= "Select linked faces"; ot->idname= "PAINT_OT_face_select_linked_pick"; ot->invoke= paint_select_linked_pick_invoke; @@ -287,7 +289,7 @@ static int face_select_all_exec(bContext *C, wmOperator *op) void PAINT_OT_face_select_all(wmOperatorType *ot) { ot->name= "Face Selection"; - ot->description= "Change selection for all faces"; + ot->description= "Change selection for all faces"; ot->idname= "PAINT_OT_face_select_all"; ot->exec= face_select_all_exec; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 80455d651b0..fde2d95cf29 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -47,22 +47,9 @@ #include "BLI_cellalloc.h" #include "BLI_ghash.h" -#include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_brush_types.h" -#include "DNA_cloth_types.h" #include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" #include "DNA_particle_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -92,9 +79,7 @@ #include "ED_armature.h" #include "ED_mesh.h" -#include "ED_object.h" #include "ED_screen.h" -#include "ED_util.h" #include "ED_view3d.h" #include "paint_intern.h" @@ -955,6 +940,7 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode) Mesh *me= get_mesh(ob); int index, i; short mval[2] = {0, 0}, sco[2]; + int vgroup= ob->actdef-1; if (!me) return; @@ -1015,7 +1001,6 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode) } else { DerivedMesh *dm; - MDeformWeight *dw; MLoop *ml; float w, co[3], fmin = 10000000.0f; int loopi = mpoly->loopstart; @@ -1036,21 +1021,17 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode) fac= MIN4(w1, w2, w3, w4); if(w1==fac) { - dw= defvert_find_index(me->dvert+mface->v1, ob->actdef-1); - if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f; + ts->vgroup_weight= defvert_find_weight(me->dvert+mface->v1, vgroup); } else if(w2==fac) { - dw= defvert_find_index(me->dvert+mface->v2, ob->actdef-1); - if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f; + ts->vgroup_weight= defvert_find_weight(me->dvert+mface->v2, vgroup); } else if(w3==fac) { - dw= defvert_find_index(me->dvert+mface->v3, ob->actdef-1); - if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f; + ts->vgroup_weight= defvert_find_weight(me->dvert+mface->v3, vgroup); } else if(w4==fac) { if(mface->v4) { - dw= defvert_find_index(me->dvert+mface->v4, ob->actdef-1); - if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f; + ts->vgroup_weight= defvert_find_weight(me->dvert+mface->v4, vgroup); >>>>>>> .merge-right.r23146 } } @@ -1185,7 +1166,8 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */ } } else { - mesh_octree_table(ob, NULL, NULL, 'e'); + mesh_octree_table(NULL, NULL, NULL, 'e'); + mesh_mirrtopo_table(NULL, 'e'); } WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene); @@ -1196,8 +1178,6 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */ /* for switching to/from mode */ static int paint_poll_test(bContext *C) { - if(ED_operator_view3d_active(C)==0) - return 0; if(CTX_data_edit_object(C)) return 0; if(CTX_data_active_object(C)==NULL) @@ -1335,7 +1315,7 @@ static char *wpaint_make_validmap(Mesh *me, Object *ob) bPose *pose; bPoseChannel *chan; ArmatureModifierData *amd; - GHash *gh = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); + GHash *gh = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "wpaint_make_validmap gh"); int i = 0, step1=1; /*add all names to a hash table*/ @@ -1814,7 +1794,7 @@ Operator->invoke() Operator->modal() - for every mousemove, apply vertex paint - exit on mouse release, free customdata - (return OPERATOR_FINISHED also removes handler and operator) + (return OPERATOR_FINISHED also removes handler and operator) For future: - implement a stroke event (or mousemove with past positons) @@ -1847,7 +1827,7 @@ static void vpaint_build_poly_facemap(struct VPaintData *vd, Mesh *me, int *origIndex; int i; - vd->arena = BLI_memarena_new(1<<13); + vd->arena = BLI_memarena_new(1<<13, "vpaint tmp"); BLI_memarena_use_calloc(vd->arena); vd->polyfacemap = BLI_memarena_alloc(vd->arena, sizeof(ListBase)*me->totpoly); diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index addbc6d2387..0dddcb578a1 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -22,7 +22,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Jason Wilkins, Tom Musgrove. * * ***** END GPL LICENSE BLOCK ***** * @@ -38,21 +38,14 @@ #include "BLI_ghash.h" #include "BLI_pbvh.h" #include "BLI_threads.h" +#include "BLI_editVert.h" +#include "BLI_rand.h" -#include "DNA_armature_types.h" -#include "DNA_brush_types.h" -#include "DNA_image_types.h" #include "DNA_key_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_modifier_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_texture_types.h" -#include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" -#include "DNA_color_types.h" #include "BKE_brush.h" #include "BKE_cdderivedmesh.h" @@ -79,32 +72,90 @@ #include "WM_api.h" #include "WM_types.h" -#include "ED_object.h" #include "ED_screen.h" #include "ED_sculpt.h" -#include "ED_space_api.h" -#include "ED_util.h" #include "ED_view3d.h" +#include "ED_mesh.h" #include "paint_intern.h" #include "sculpt_intern.h" #include "RNA_access.h" #include "RNA_define.h" -#include "IMB_imbuf_types.h" #include "RE_render_ext.h" -#include "RE_shader_ext.h" /*for multitex_ext*/ +#include "RE_shader_ext.h" -#include "GPU_draw.h" -#include "gpu_buffers.h" +#include "GPU_buffers.h" #include #include #include -/* Number of vertices to average in order to determine the flatten distance */ -#define FLATTEN_SAMPLE_SIZE 10 +#ifdef _OPENMP +#include +#endif + +/* ==== FORWARD DEFINITIONS ===== + * + */ + +void ED_sculpt_force_update(bContext *C) +{ + Object *ob= CTX_data_active_object(C); + + if(ob && (ob->mode & OB_MODE_SCULPT)) + multires_force_update(ob); +} + +/* Sculpt mode handles multires differently from regular meshes, but only if + it's the last modifier on the stack and it is not on the first level */ +struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) +{ + ModifierData *md, *nmd; + + for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) { + if(md->type == eModifierType_Multires) { + MultiresModifierData *mmd= (MultiresModifierData*)md; + + /* Check if any of the modifiers after multires are active + * if not it can use the multires struct */ + for(nmd= md->next; nmd; nmd= nmd->next) + if(modifier_isEnabled(scene, nmd, eModifierMode_Realtime)) + break; + + if(!nmd && mmd->sculptlvl > 0) + return mmd; + } + } + + return NULL; +} + +/* Checks whether full update mode (slower) needs to be used to work with modifiers */ +int sculpt_modifiers_active(Scene *scene, Object *ob) +{ + ModifierData *md; + MultiresModifierData *mmd= sculpt_multires_active(scene, ob); + + /* check if there are any modifiers after what we are sculpting, + for a multires modifier with a deform modifier in front, we + do no need to recalculate the modifier stack. note that this + needs to be in sync with ccgDM_use_grid_pbvh! */ + if(mmd) + md= mmd->modifier.next; + else + md= modifiers_getVirtualModifierList(ob); + + /* exception for shape keys because we can edit those */ + for(; md; md= md->next) { + if(modifier_isEnabled(scene, md, eModifierMode_Realtime)) + if(md->type != eModifierType_ShapeKey) + return 1; + } + + return 0; +} /* ===== STRUCTS ===== * @@ -131,9 +182,13 @@ typedef struct StrokeCache { /* Variants */ float radius; + float radius_squared; + //float traced_location[3]; float true_location[3]; float location[3]; - float flip; + + float pen_flip; + float invert; float pressure; float mouse[2]; float bstrength; @@ -152,15 +207,30 @@ typedef struct StrokeCache { Brush *brush; float (*face_norms)[3]; /* Copy of the mesh faces' normals */ - float rotation; /* Texture rotation (radians) for anchored and rake modes */ + float special_rotation; /* Texture rotation (radians) for anchored and rake modes */ int pixel_radius, previous_pixel_radius; - float grab_active_location[8][3]; float grab_delta[3], grab_delta_symmetry[3]; float old_grab_location[3], orig_grab_location[3]; - int symmetry; /* Symmetry index between 0 and 7 */ - float view_normal[3], view_normal_symmetry[3]; - int last_rake[2]; /* Last location of updating rake rotation */ + + int symmetry; /* Symmetry index between 0 and 7 bit combo 0 is Brush only; + 1 is X mirror; 2 is Y mirror; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */ + int mirror_symmetry_pass; /* the symmetry pass we are currently on between 0 and 7*/ + float true_view_normal[3]; + float view_normal[3]; + float last_area_normal[3]; + float last_center[3]; + int radial_symmetry_pass; + float symm_rot_mat[4][4]; + float symm_rot_mat_inv[4][4]; + float last_rake[2]; /* Last location of updating rake rotation */ int original; + + float vertex_rotation; + + char saved_active_brush_name[24]; + int alt_smooth; + + float plane_trim_squared; } StrokeCache; /* ===== OPENGL ===== @@ -193,9 +263,10 @@ static void projectf(bglMats *mats, const float v[3], float p[2]) /* Get a screen-space rectangle of the modified area */ int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d, - Object *ob, rcti *rect) + Object *ob, rcti *rect) { StrokeCache *cache = ob->sculpt->cache; + PBVH *pbvh= ob->sculpt->pbvh; float bb_min[3], bb_max[3], pmat[4][4]; int i, j, k; @@ -210,7 +281,10 @@ int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d, view3d_get_object_project_mat(rv3d, ob, pmat); - BLI_pbvh_redraw_BB(ob->sculpt->tree, bb_min, bb_max); + if(!pbvh) + return 0; + + BLI_pbvh_redraw_BB(pbvh, bb_min, bb_max); rect->xmin = rect->ymin = INT_MAX; rect->xmax = rect->ymax = INT_MIN; @@ -238,13 +312,15 @@ int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d, } void sculpt_get_redraw_planes(float planes[4][4], ARegion *ar, - RegionView3D *rv3d, Object *ob) + RegionView3D *rv3d, Object *ob) { - BoundBox *bb = MEM_callocN(sizeof(BoundBox), "sculpt boundbox"); + PBVH *pbvh= ob->sculpt->pbvh; + BoundBox bb; bglMats mats; StrokeCache *cache = ob->sculpt->cache; rcti rect; - int i; + + memset(&bb, 0, sizeof(BoundBox)); view3d_get_transformation(ar, rv3d, ob, &mats); sculpt_get_redraw_rect(ar, rv3d,ob, &rect); @@ -264,15 +340,12 @@ void sculpt_get_redraw_planes(float planes[4][4], ARegion *ar, rect.ymax -= 2; #endif - view3d_calculate_clipping(bb, planes, &mats, &rect); - - for(i = 0; i < 16; ++i) - ((float*)planes)[i] = -((float*)planes)[i]; - - MEM_freeN(bb); + view3d_calculate_clipping(&bb, planes, &mats, &rect); + mul_m4_fl(planes, -1.0f); /* clear redraw flag from nodes */ - BLI_pbvh_update(ob->sculpt->tree, PBVH_UpdateRedraw, NULL); + if(pbvh) + BLI_pbvh_update(pbvh, PBVH_UpdateRedraw, NULL); /*clear prect*/ cache->prect.xmin = FLT_MAX; @@ -282,297 +355,164 @@ void sculpt_get_redraw_planes(float planes[4][4], ARegion *ar, } -/************************** Undo *************************/ - -typedef struct SculptUndoNode { - struct SculptUndoNode *next, *prev; - - char idname[MAX_ID_NAME]; /* name instead of pointer*/ - void *node; /* only during push, not valid afterwards! */ - - float (*co)[3]; - short (*no)[3]; - int totvert; - - /* non-multires */ - int maxvert; /* to verify if totvert it still the same */ - int *index; /* to restore into right location */ - - /* multires */ - int maxgrid; /* same for grid */ - int gridsize; /* same for grid */ - int totgrid; /* to restore into right location */ - int *grids; /* to restore into right location */ -} SculptUndoNode; - -static void update_cb(PBVHNode *node, void *data) -{ - BLI_pbvh_node_mark_update(node); -} - -static void sculpt_undo_restore(bContext *C, ListBase *lb) -{ - Scene *scene = CTX_data_scene(C); - Object *ob = CTX_data_active_object(C); - DerivedMesh *dm = mesh_get_derived_final(scene, ob, 0); - SculptSession *ss = ob->sculpt; - SculptUndoNode *unode; - MVert *mvert; - MultiresModifierData *mmd; - int *index; - int i, j, update= 0; - - sculpt_update_mesh_elements(scene, ob, 0); - - for(unode=lb->first; unode; unode=unode->next) { - if(!(strcmp(unode->idname, ob->id.name)==0)) - continue; - - if(unode->maxvert) { - /* regular mesh restore */ - if(ss->totvert != unode->maxvert) - continue; - - index= unode->index; - mvert= ss->mvert; - - for(i=0; itotvert; i++) { - swap_v3_v3(mvert[index[i]].co, unode->co[i]); - mvert[index[i]].flag |= ME_VERT_PBVH_UPDATE; - } - } - else if(unode->maxgrid) { - /* multires restore */ - DMGridData **grids, *grid; - float (*co)[3]; - int gridsize; - - if(dm->getNumGrids(dm) != unode->maxgrid) - continue; - if(dm->getGridSize(dm) != unode->gridsize) - continue; - - grids= dm->getGridData(dm); - gridsize= dm->getGridSize(dm); - - co = unode->co; - for(j=0; jtotgrid; j++) { - grid= grids[unode->grids[j]]; - - for(i=0; ikb) sculpt_mesh_to_key(ss->ob, ss->kb); - if(ss->refkb) sculpt_key_to_mesh(ss->refkb, ob); - - /* we update all nodes still, should be more clever, but also - needs to work correct when exiting/entering sculpt mode and - the nodes get recreated, though in that case it could do all */ - BLI_pbvh_search_callback(ss->tree, NULL, NULL, update_cb, NULL); - BLI_pbvh_update(ss->tree, PBVH_UpdateBB|PBVH_UpdateOriginalBB|PBVH_UpdateRedraw, NULL); - - if((mmd=sculpt_multires_active(ob))) - multires_mark_as_modified(ob); - } -} - -static void sculpt_undo_free(ListBase *lb) -{ - SculptUndoNode *unode; - - for(unode=lb->first; unode; unode=unode->next) { - if(unode->co) - MEM_freeN(unode->co); - if(unode->no) - MEM_freeN(unode->no); - if(unode->index) - MEM_freeN(unode->index); - if(unode->grids) - MEM_freeN(unode->grids); - } -} - -static SculptUndoNode *sculpt_undo_get_node(SculptSession *ss, PBVHNode *node) -{ - ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH); - SculptUndoNode *unode; - - if(!lb) - return NULL; - - for(unode=lb->first; unode; unode=unode->next) - if(unode->node == node) - return unode; - - return NULL; -} - -static SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node) -{ - ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH); - Object *ob= ss->ob; - SculptUndoNode *unode; - int totvert, allvert, totgrid, maxgrid, gridsize, *grids; - - /* list is manipulated by multiple threads, so we lock */ - BLI_lock_thread(LOCK_CUSTOM1); - - if((unode= sculpt_undo_get_node(ss, node))) { - BLI_unlock_thread(LOCK_CUSTOM1); - return unode; - } - - unode= MEM_callocN(sizeof(SculptUndoNode), "SculptUndoNode"); - strcpy(unode->idname, ob->id.name); - unode->node= node; - - BLI_pbvh_node_num_verts(ss->tree, node, &totvert, &allvert); - BLI_pbvh_node_get_grids(ss->tree, node, &grids, &totgrid, - &maxgrid, &gridsize, NULL, NULL); - - unode->totvert= totvert; - /* we will use this while sculpting, is mapalloc slow to access then? */ - unode->co= MEM_mapallocN(sizeof(float)*3*allvert, "SculptUndoNode.co"); - unode->no= MEM_mapallocN(sizeof(short)*3*allvert, "SculptUndoNode.no"); - undo_paint_push_count_alloc(UNDO_PAINT_MESH, (sizeof(float)*3 + sizeof(short)*3 + sizeof(int))*allvert); - BLI_addtail(lb, unode); - - if(maxgrid) { - /* multires */ - unode->maxgrid= maxgrid; - unode->totgrid= totgrid; - unode->gridsize= gridsize; - unode->grids= MEM_mapallocN(sizeof(int)*totgrid, "SculptUndoNode.grids"); - } - else { - /* regular mesh */ - unode->maxvert= ss->totvert; - unode->index= MEM_mapallocN(sizeof(int)*allvert, "SculptUndoNode.index"); - } - - BLI_unlock_thread(LOCK_CUSTOM1); - - /* copy threaded, hopefully this is the performance critical part */ - { - PBVHVertexIter vd; - - BLI_pbvh_vertex_iter_begin(ss->tree, node, vd, PBVH_ITER_ALL) { - copy_v3_v3(unode->co[vd.i], vd.co); - if(vd.no) VECCOPY(unode->no[vd.i], vd.no) - else normal_float_to_short_v3(unode->no[vd.i], vd.fno); - if(vd.vert_indices) unode->index[vd.i]= vd.vert_indices[vd.i]; - } - BLI_pbvh_vertex_iter_end; - } - - if(unode->grids) - memcpy(unode->grids, grids, sizeof(int)*totgrid); - - return unode; -} - -static void sculpt_undo_push_begin(SculptSession *ss, char *name) -{ - undo_paint_push_begin(UNDO_PAINT_MESH, name, - sculpt_undo_restore, sculpt_undo_free); -} - -static void sculpt_undo_push_end(SculptSession *ss) -{ - ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH); - SculptUndoNode *unode; - - /* we don't need normals in the undo stack */ - for(unode=lb->first; unode; unode=unode->next) { - if(unode->no) { - MEM_freeN(unode->no); - unode->no= NULL; - } - } - - undo_paint_push_end(UNDO_PAINT_MESH); -} - -void ED_sculpt_force_update(bContext *C) -{ - Object *ob= CTX_data_active_object(C); - - if(ob && (ob->mode & OB_MODE_SCULPT)) - multires_force_update(ob); -} - /************************ Brush Testing *******************/ typedef struct SculptBrushTest { float radius_squared; float location[3]; - float dist; } SculptBrushTest; static void sculpt_brush_test_init(SculptSession *ss, SculptBrushTest *test) { - test->radius_squared= ss->cache->radius*ss->cache->radius; + test->radius_squared= ss->cache->radius_squared; copy_v3_v3(test->location, ss->cache->location); } static int sculpt_brush_test(SculptBrushTest *test, float co[3]) { - float distsq, delta[3]; + float distsq = len_squared_v3v3(co, test->location); - sub_v3_v3v3(delta, co, test->location); - distsq = INPR(delta, delta); - - if(distsq < test->radius_squared) { + if(distsq <= test->radius_squared) { test->dist = sqrt(distsq); return 1; } + else { + return 0; + } +} + +static int sculpt_brush_test_sq(SculptBrushTest *test, float co[3]) +{ + float distsq = len_squared_v3v3(co, test->location); + + if(distsq <= test->radius_squared) { + test->dist = distsq; + return 1; + } + else { + return 0; + } +} + +static int sculpt_brush_test_fast(SculptBrushTest *test, float co[3]) +{ + return len_squared_v3v3(co, test->location) <= test->radius_squared; +} + +static int sculpt_brush_test_cube(SculptBrushTest *test, float co[3], float local[4][4]) +{ + const static float side = 0.70710678118654752440084436210485; // sqrt(.5); + + float local_co[3]; + + mul_v3_m4v3(local_co, local, co); + + local_co[0] = fabs(local_co[0]); + local_co[1] = fabs(local_co[1]); + local_co[2] = fabs(local_co[2]); + + if (local_co[0] <= side && local_co[1] <= side && local_co[2] <= side) { + test->dist = MAX3(local_co[0], local_co[1], local_co[2]) / side; + + return 1; + } + else { + return 0; + } +} + +static float frontface(Brush *brush, float sculpt_normal[3], short no[3], float fno[3]) +{ + if (brush->flag & BRUSH_FRONTFACE) { + float dot; + + if (no) { + float tmp[3]; + + normal_short_to_float_v3(tmp, no); + dot= dot_v3v3(tmp, sculpt_normal); + } + else { + dot= dot_v3v3(fno, sculpt_normal); + } + + return dot > 0 ? dot : 0; + } + else { + return 1; + } +} + +#if 0 + +static int sculpt_brush_test_cyl(SculptBrushTest *test, float co[3], float location[3], float an[3]) +{ + if (sculpt_brush_test_fast(test, co)) { + float t1[3], t2[3], t3[3], dist; + + sub_v3_v3v3(t1, location, co); + sub_v3_v3v3(t2, x2, location); + + cross_v3_v3v3(t3, an, t1); + + dist = len_v3(t3)/len_v3(t2); + + test->dist = dist; + + return 1; + } return 0; } +#endif + /* ===== Sculpting ===== * */ + -/* Return modified brush strength. Includes the direction of the brush, positive - values pull vertices, negative values push. Uses tablet pressure and a - special multiplier found experimentally to scale the strength factor. */ -static float brush_strength(Sculpt *sd, StrokeCache *cache) +static float overlapped_curve(Brush* br, float x) { - Brush *brush = paint_brush(&sd->paint); - /* Primary strength input; square it to make lower values more sensitive */ - float alpha = brush->alpha * brush->alpha; + int i; + const int n = 100 / br->spacing; + const float h = br->spacing / 50.0f; + const float x0 = x-1; - float dir= brush->flag & BRUSH_DIR_IN ? -1 : 1; - float pressure= 1; - float flip= cache->flip ? -1:1; + float sum; - if(brush->flag & BRUSH_ALPHA_PRESSURE) - pressure *= cache->pressure; - - switch(brush->sculpt_tool){ - case SCULPT_TOOL_DRAW: - case SCULPT_TOOL_INFLATE: - case SCULPT_TOOL_CLAY: - case SCULPT_TOOL_FLATTEN: - case SCULPT_TOOL_LAYER: - return alpha * dir * pressure * flip; /*XXX: not sure why? was multiplied by G.vd->grid */; - case SCULPT_TOOL_SMOOTH: - return alpha * 4 * pressure; - case SCULPT_TOOL_PINCH: - return alpha / 2 * dir * pressure * flip; - case SCULPT_TOOL_GRAB: - return 1; - default: - return 0; + sum = 0; + for (i= 0; i < n; i++) { + float xx; + + xx = fabs(x0 + i*h); + + if (xx < 1.0f) + sum += brush_curve_strength(br, xx, 1); } + + return sum; +} + +static float integrate_overlap(Brush* br) +{ + int i; + int m= 10; + float g = 1.0f/m; + float overlap; + float max; + + overlap= 0; + max= 0; + for(i= 0; i < m; i++) { + overlap = overlapped_curve(br, i*g); + + if (overlap > max) + max = overlap; + } + + return max; } /* Uses symm to selectively flip any axis of a coordinate. */ @@ -592,6 +532,168 @@ static void flip_coord(float out[3], float in[3], const char symm) out[2]= in[2]; } +float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle) +{ + float mirror[3]; + float distsq; + float mat[4][4]; + + //flip_coord(mirror, cache->traced_location, symm); + flip_coord(mirror, cache->true_location, symm); + + unit_m4(mat); + rotate_m4(mat, axis, angle); + + mul_m4_v3(mat, mirror); + + //distsq = len_squared_v3v3(mirror, cache->traced_location); + distsq = len_squared_v3v3(mirror, cache->true_location); + + if (distsq <= 4*(cache->radius_squared)) + return (2*(cache->radius) - sqrt(distsq)) / (2*(cache->radius)); + else + return 0; +} + +static float calc_radial_symmetry_feather(Sculpt *sd, StrokeCache *cache, const char symm, const char axis) +{ + int i; + float overlap; + + overlap = 0; + for(i = 1; i < sd->radial_symm[axis-'X']; ++i) { + const float angle = 2*M_PI*i/sd->radial_symm[axis-'X']; + overlap += calc_overlap(cache, symm, axis, angle); + } + + return overlap; +} + +static float calc_symmetry_feather(Sculpt *sd, StrokeCache* cache) +{ + if (sd->flags & SCULPT_SYMMETRY_FEATHER) { + float overlap; + int symm = cache->symmetry; + int i; + + overlap = 0; + for (i = 0; i <= symm; i++) { + if(i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) { + + overlap += calc_overlap(cache, i, 0, 0); + + overlap += calc_radial_symmetry_feather(sd, cache, i, 'X'); + overlap += calc_radial_symmetry_feather(sd, cache, i, 'Y'); + overlap += calc_radial_symmetry_feather(sd, cache, i, 'Z'); + } + } + + return 1/overlap; + } + else { + return 1; + } +} + +/* Return modified brush strength. Includes the direction of the brush, positive + values pull vertices, negative values push. Uses tablet pressure and a + special multiplier found experimentally to scale the strength factor. */ +static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather) +{ + Brush *brush = paint_brush(&sd->paint); + + /* Primary strength input; square it to make lower values more sensitive */ + float alpha = sculpt_get_brush_alpha(brush)*sculpt_get_brush_alpha(brush); + float dir = brush->flag & BRUSH_DIR_IN ? -1 : 1; + float pressure = brush->flag & BRUSH_ALPHA_PRESSURE ? cache->pressure : 1; + float pen_flip = cache->pen_flip ? -1 : 1; + float invert = cache->invert ? -1 : 1; + float accum = integrate_overlap(brush); + float overlap = (brush->flag & BRUSH_SPACE_ATTEN && brush->flag & BRUSH_SPACE && !(brush->flag & BRUSH_ANCHORED)) && (brush->spacing < 100) ? 1.0f/accum : 1; // spacing is integer percentage of radius, divide by 50 to get normalized diameter + float flip = dir * invert * pen_flip; + + switch(brush->sculpt_tool){ + case SCULPT_TOOL_CLAY: + case SCULPT_TOOL_CLAY_TUBES: + case SCULPT_TOOL_DRAW: + case SCULPT_TOOL_LAYER: + return alpha * flip * pressure * overlap * feather; + + case SCULPT_TOOL_CREASE: + case SCULPT_TOOL_BLOB: + return alpha * flip * pressure * overlap * feather; + + case SCULPT_TOOL_INFLATE: + if (flip > 0) { + return 0.250f * alpha * flip * pressure * overlap * feather; + } + else { + return 0.125f * alpha * flip * pressure * overlap * feather; + } + + case SCULPT_TOOL_FILL: + case SCULPT_TOOL_SCRAPE: + case SCULPT_TOOL_FLATTEN: + if (flip > 0) { + overlap = (1+overlap) / 2; + return alpha * flip * pressure * overlap * feather; + } + else { + /* reduce strength for DEEPEN, PEAKS, and CONTRAST */ + return 0.5f * alpha * flip * pressure * overlap * feather; + } + + case SCULPT_TOOL_SMOOTH: + return alpha * pressure * feather; + + case SCULPT_TOOL_PINCH: + if (flip > 0) { + return alpha * flip * pressure * overlap * feather; + } + else { + return 0.25f * alpha * flip * pressure * overlap * feather; + } + + case SCULPT_TOOL_NUDGE: + overlap = (1+overlap) / 2; + return alpha * pressure * overlap * feather; + + case SCULPT_TOOL_THUMB: + return alpha*pressure*feather; + + case SCULPT_TOOL_SNAKE_HOOK: + return feather; + + case SCULPT_TOOL_GRAB: + case SCULPT_TOOL_ROTATE: + return feather; + + default: + return 0; + } +} + +float get_tex_pixel(Brush* br, float u, float v) +{ + TexResult texres; + float co[3]; + int hasrgb; + + co[0] = u; + co[1] = v; + co[2] = 0; + + memset(&texres, 0, sizeof(TexResult)); + hasrgb = multitex_ext(br->mtex.tex, co, NULL, NULL, 1, &texres); + + if (hasrgb & TEX_RGB) + texres.tin = (0.35*texres.tr + 0.45*texres.tg + 0.2*texres.tb)*texres.ta; + + return texres.tin; +} + +#if 0 + /* Get a pixel from the texcache at (px, py) */ static unsigned char get_texcache_pixel(const SculptSession *ss, int px, int py) { @@ -602,7 +704,7 @@ static unsigned char get_texcache_pixel(const SculptSession *ss, int px, int py) static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float v) { - int x, y, x2, y2; + unsigned x, y, x2, y2; const int tc_max = ss->texcache_side - 1; float urat, vrat, uopp; @@ -629,76 +731,97 @@ static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float get_texcache_pixel(ss, x2, y2) * urat) * vrat) / 255.0; } +#endif + /* Return a multiplier for brush strength on a particular vertex. */ static float tex_strength(SculptSession *ss, Brush *br, float *point, const float len) { - MTex *tex = &br->mtex; + MTex *mtex = &br->mtex; float avg= 1; - if(!tex) { + if(!mtex->tex) { avg= 1; } - else if(tex->brush_map_mode == MTEX_MAP_MODE_3D) { + else if(mtex->brush_map_mode == MTEX_MAP_MODE_3D) { float jnk; /* Get strength by feeding the vertex location directly into a texture */ - externtex(tex, point, &avg, + externtex(mtex, point, &avg, &jnk, &jnk, &jnk, &jnk); } else if(ss->texcache) { - const float bsize= ss->cache->pixel_radius * 2; - const float rot= tex->rot + ss->cache->rotation; - int px, py; - float flip[3], point_2d[2]; + float rotation = -mtex->rot; + float x, y, point_2d[3]; + float diameter; - /* If the active area is being applied for symmetry, flip it - across the symmetry axis in order to project it. This insures - that the brush texture will be oriented correctly. */ - copy_v3_v3(flip, point); - flip_coord(flip, flip, ss->cache->symmetry); - projectf(ss->cache->mats, flip, point_2d); + /* if the active area is being applied for symmetry, flip it + across the symmetry axis and rotate it back to the orignal + position in order to project it. This insures that the + brush texture will be oriented correctly. */ - /* For Tile and Drag modes, get the 2D screen coordinates of the - and scale them up or down to the texture size. */ - if(tex->brush_map_mode == MTEX_MAP_MODE_TILED) { - const int sx= (const int)tex->size[0]; - const int sy= (const int)tex->size[1]; - - float fx= point_2d[0]; - float fy= point_2d[1]; - - float angle= atan2(fy, fx) - rot; - float flen= sqrtf(fx*fx + fy*fy); - - if(rot<0.001 && rot>-0.001) { - px= point_2d[0]; - py= point_2d[1]; - } else { - px= flen * cos(angle) + 2000; - py= flen * sin(angle) + 2000; - } - if(sx != 1) - px %= sx-1; - if(sy != 1) - py %= sy-1; - avg= get_texcache_pixel_bilinear(ss, ss->texcache_side*px/sx, ss->texcache_side*py/sy); + flip_coord(point_2d, point, ss->cache->mirror_symmetry_pass); + + if (ss->cache->radial_symmetry_pass) + mul_m4_v3(ss->cache->symm_rot_mat_inv, point_2d); + + projectf(ss->cache->mats, point_2d, point_2d); + + /* if fixed mode, keep coordinates relative to mouse */ + if(mtex->brush_map_mode == MTEX_MAP_MODE_FIXED) { + rotation += ss->cache->special_rotation; + + point_2d[0] -= ss->cache->tex_mouse[0]; + point_2d[1] -= ss->cache->tex_mouse[1]; + + diameter = ss->cache->pixel_radius; // use pressure adjusted size for fixed mode + + x = point_2d[0]; + y = point_2d[1]; } - else if(tex->brush_map_mode == MTEX_MAP_MODE_FIXED) { - float fx= (point_2d[0] - ss->cache->tex_mouse[0]) / bsize; - float fy= (point_2d[1] - ss->cache->tex_mouse[1]) / bsize; - - float angle= atan2(fy, fx) - rot; - float flen= sqrtf(fx*fx + fy*fy); - - fx = flen * cos(angle) + 0.5; - fy = flen * sin(angle) + 0.5; - - avg= get_texcache_pixel_bilinear(ss, fx * ss->texcache_side, fy * ss->texcache_side); + else /* else (mtex->brush_map_mode == MTEX_MAP_MODE_TILED), + leave the coordinates relative to the screen */ + { + diameter = sculpt_get_brush_size(br); // use unadjusted size for tiled mode + + x = point_2d[0] - ss->cache->vc->ar->winrct.xmin; + y = point_2d[1] - ss->cache->vc->ar->winrct.ymin; } + + x /= ss->cache->vc->ar->winx; + y /= ss->cache->vc->ar->winy; + + if (mtex->brush_map_mode == MTEX_MAP_MODE_TILED) { + x -= 0.5f; + y -= 0.5f; + } + + x *= ss->cache->vc->ar->winx / diameter; + y *= ss->cache->vc->ar->winy / diameter; + + /* it is probably worth optimizing for those cases where + the texture is not rotated by skipping the calls to + atan2, sqrtf, sin, and cos. */ + if (rotation > 0.001 || rotation < -0.001) { + const float angle = atan2(y, x) + rotation; + const float flen = sqrtf(x*x + y*y); + + x = flen * cos(angle); + y = flen * sin(angle); + } + + x *= br->mtex.size[0]; + y *= br->mtex.size[1]; + + x += br->mtex.ofs[0]; + y += br->mtex.ofs[1]; + + avg = get_tex_pixel(br, x, y); } - avg*= brush_curve_strength(br, len, ss->cache->radius); /* Falloff curve */ + avg += br->texture_sample_bias; + + avg *= brush_curve_strength(br, len, ss->cache->radius); /* Falloff curve */ return avg; } @@ -722,7 +845,7 @@ static int sculpt_search_sphere_cb(PBVHNode *node, void *data_v) BLI_pbvh_node_get_original_BB(node, bb_min, bb_max); else BLI_pbvh_node_get_BB(node, bb_min, bb_max); - + for(i = 0; i < 3; ++i) { if(bb_min[i] > center[i]) nearest[i] = bb_min[i]; @@ -734,7 +857,7 @@ static int sculpt_search_sphere_cb(PBVHNode *node, void *data_v) sub_v3_v3v3(t, center, nearest); - return t[0] * t[0] + t[1] * t[1] + t[2] * t[2] < data->radius_squared; + return dot_v3v3(t, t) < data->radius_squared; } /* Handles clipping against a mirror modifier and SCULPT_LOCK axis flags */ @@ -750,64 +873,60 @@ static void sculpt_clip(Sculpt *sd, SculptSession *ss, float *co, const float va co[i]= 0.0f; else co[i]= val[i]; - } + } } static void add_norm_if(float view_vec[3], float out[3], float out_flip[3], float fno[3]) { if((dot_v3v3(view_vec, fno)) > 0) { - add_v3_v3v3(out, out, fno); + add_v3_v3(out, fno); } else { - add_v3_v3v3(out_flip, out_flip, fno); /* out_flip is used when out is {0,0,0} */ + add_v3_v3(out_flip, fno); /* out_flip is used when out is {0,0,0} */ } } -/* For draw/layer/flatten; finds average normal for all active vertices */ -static void calc_area_normal(Sculpt *sd, SculptSession *ss, float area_normal[3], PBVHNode **nodes, int totnode) +static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode) { - PBVH *bvh= ss->tree; - StrokeCache *cache = ss->cache; - const int view = 0; /* XXX: should probably be a flag, not number: brush_type==SCULPT_TOOL_DRAW ? sculptmode_brush()->view : 0; */ - float out[3] = {0.0f, 0.0f, 0.0f}; - float out_flip[3] = {0.0f, 0.0f, 0.0f}; - float out_dir[3]; int n; - copy_v3_v3(out_dir, cache->view_normal_symmetry); + float out_flip[3] = {0.0f, 0.0f, 0.0f}; - /* threaded loop over nodes */ - #pragma omp parallel for private(n) schedule(static) + zero_v3(an); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; ncache->original) { - BLI_pbvh_vertex_iter_begin(bvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - if(sculpt_brush_test(&test, unode->co[vd.i])) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test_fast(&test, unode->co[vd.i])) { + float fno[3]; + normal_short_to_float_v3(fno, unode->no[vd.i]); - add_norm_if(out_dir, nout, nout_flip, fno); + add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno); } } BLI_pbvh_vertex_iter_end; } else { - BLI_pbvh_vertex_iter_begin(bvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - if(sculpt_brush_test(&test, vd.co)) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test_fast(&test, vd.co)) { if(vd.no) { + float fno[3]; + normal_short_to_float_v3(fno, vd.no); - add_norm_if(out_dir, nout, nout_flip, fno); + add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno); + } + else { + add_norm_if(ss->cache->view_normal, private_an, private_out_flip, vd.fno); } - else - add_norm_if(out_dir, nout, nout_flip, vd.fno); } } BLI_pbvh_vertex_iter_end; @@ -815,76 +934,70 @@ static void calc_area_normal(Sculpt *sd, SculptSession *ss, float area_normal[3] #pragma omp critical { - /* we sum per node and add together later for threads */ - add_v3_v3v3(out, out, nout); - add_v3_v3v3(out_flip, out_flip, nout_flip); + add_v3_v3(an, private_an); + add_v3_v3(out_flip, private_out_flip); } } - if (out[0]==0.0 && out[1]==0.0 && out[2]==0.0) { - copy_v3_v3(out, out_flip); - } - - normalize_v3(out); + if (is_zero_v3(an)) + copy_v3_v3(an, out_flip); - out[0] = out_dir[0] * view + out[0] * (10-view); - out[1] = out_dir[1] * view + out[1] * (10-view); - out[2] = out_dir[2] * view + out[2] * (10-view); - - normalize_v3(out); - copy_v3_v3(area_normal, out); + normalize_v3(an); } -static void do_draw_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +/* This initializes the faces to be moved for this sculpt for draw/layer/flatten; then it + finds average normal for all active vertices - note that this is called once for each mirroring direction */ +static void calc_sculpt_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode) { Brush *brush = paint_brush(&sd->paint); - float offset[3], area_normal[3]; - float bstrength= ss->cache->bstrength; - int n; - /* area normal */ - calc_area_normal(sd, ss, area_normal, nodes, totnode); + if (ss->cache->mirror_symmetry_pass == 0 && + ss->cache->radial_symmetry_pass == 0 && + (ss->cache->first_time || !(brush->flag & BRUSH_ORIGINAL_NORMAL))) + { + switch (brush->sculpt_plane) { + case SCULPT_DISP_DIR_VIEW: + viewvector(ss->cache->vc->rv3d, ss->cache->vc->rv3d->twmat[3], an); + break; - /* offset with as much as possible factored in already */ - offset[0]= area_normal[0]*ss->cache->radius*ss->cache->scale[0]*bstrength; - offset[1]= area_normal[1]*ss->cache->radius*ss->cache->scale[1]*bstrength; - offset[2]= area_normal[2]*ss->cache->radius*ss->cache->scale[2]*bstrength; + case SCULPT_DISP_DIR_X: + an[1] = 0.0; + an[2] = 0.0; + an[0] = 1.0; + break; - /* threaded loop over nodes */ - #pragma omp parallel for private(n) schedule(static) - for(n=0; ntree, nodes[n], vd, PBVH_ITER_UNIQUE) { - if(sculpt_brush_test(&test, vd.co)) { - /* offset vertex */ - float fade = tex_strength(ss, brush, vd.co, test.dist); - float val[3]= {vd.co[0] + offset[0]*fade, - vd.co[1] + offset[1]*fade, - vd.co[2] + offset[2]*fade}; + case SCULPT_DISP_DIR_Z: + an[0] = 0.0; + an[1] = 0.0; + an[2] = 1.0; + break; - sculpt_clip(sd, ss, vd.co, val); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + case SCULPT_DISP_DIR_AREA: + calc_area_normal(sd, ss, an, nodes, totnode); - update = 1; - } + default: + break; } - BLI_pbvh_vertex_iter_end; - - if (update) - BLI_pbvh_node_mark_update(nodes[n]); + + copy_v3_v3(ss->cache->last_area_normal, an); + } + else { + copy_v3_v3(an, ss->cache->last_area_normal); + flip_coord(an, an, ss->cache->mirror_symmetry_pass); + mul_m4_v3(ss->cache->symm_rot_mat, an); } } /* For the smooth brush, uses the neighboring vertices around vert to calculate a smoothed location for vert. Skips corner vertices (used by only one polygon.) */ -static void neighbor_average(SculptSession *ss, float avg[3], const int vert) +static void neighbor_average(SculptSession *ss, float avg[3], const unsigned vert) { int i, skip= -1, total=0; IndexNode *node= ss->fmap[vert].first; @@ -904,14 +1017,14 @@ static void neighbor_average(SculptSession *ss, float avg[3], const int vert) if(f->v4) { skip= (f->v1==vert?2: - f->v2==vert?3: - f->v3==vert?0: - f->v4==vert?1:-1); + f->v2==vert?3: + f->v3==vert?0: + f->v4==vert?1:-1); } for(i=0; i<(f->v4?4:3); ++i) { if(i != skip && (ncount!=2 || BLI_countlist(&ss->fmap[(&f->v1)[i]]) <= 2)) { - add_v3_v3v3(avg, avg, ss->mvert[(&f->v1)[i]].co); + add_v3_v3(avg, ss->mvert[(&f->v1)[i]].co); ++total; } } @@ -925,52 +1038,58 @@ static void neighbor_average(SculptSession *ss, float avg[3], const int vert) copy_v3_v3(avg, ss->mvert[vert].co); } -static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node) +static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength) { Brush *brush = paint_brush(&sd->paint); - float bstrength= ss->cache->bstrength; PBVHVertexIter vd; SculptBrushTest test; + CLAMP(bstrength, 0.0f, 1.0f); + sculpt_brush_test_init(ss, &test); - BLI_pbvh_vertex_iter_begin(ss->tree, node, vd, PBVH_ITER_UNIQUE) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_UNIQUE) { if(sculpt_brush_test(&test, vd.co)) { - float fade = tex_strength(ss, brush, vd.co, test.dist)*bstrength; + const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, ss->cache->view_normal, vd.no, vd.fno); float avg[3], val[3]; - CLAMP(fade, 0.0f, 1.0f); - neighbor_average(ss, avg, vd.vert_indices[vd.i]); - val[0] = vd.co[0]+(avg[0]-vd.co[0])*fade; - val[1] = vd.co[1]+(avg[1]-vd.co[1])*fade; - val[2] = vd.co[2]+(avg[2]-vd.co[2])*fade; - - sculpt_clip(sd, ss, vd.co, val); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + sub_v3_v3v3(val, avg, vd.co); + mul_v3_fl(val, fade); + + add_v3_v3(val, vd.co); + + sculpt_clip(sd, ss, vd.co, val); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BLI_pbvh_vertex_iter_end; } -static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node) +static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength) { Brush *brush = paint_brush(&sd->paint); SculptBrushTest test; DMGridData **griddata, *data; DMGridAdjacency *gridadj, *adj; - float bstrength= ss->cache->bstrength; - float co[3], (*tmpgrid)[3]; + float (*tmpgrid)[3], (*tmprow)[3]; int v1, v2, v3, v4; int *grid_indices, totgrid, gridsize, i, x, y; - + sculpt_brush_test_init(ss, &test); - BLI_pbvh_node_get_grids(ss->tree, node, &grid_indices, &totgrid, + CLAMP(bstrength, 0.0f, 1.0f); + + BLI_pbvh_node_get_grids(ss->pbvh, node, &grid_indices, &totgrid, NULL, &gridsize, &griddata, &gridadj); #pragma omp critical - tmpgrid= MEM_mallocN(sizeof(float)*3*gridsize*gridsize, "tmpgrid"); + { + tmpgrid= MEM_mallocN(sizeof(float)*3*gridsize*gridsize, "tmpgrid"); + tmprow= MEM_mallocN(sizeof(float)*3*gridsize, "tmprow"); + } for(i = 0; i < totgrid; ++i) { data = griddata[grid_indices[i]]; @@ -978,75 +1097,106 @@ static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *no memset(tmpgrid, 0, sizeof(float)*3*gridsize*gridsize); - /* average grid values */ - for(y = 0; y < gridsize-1; ++y) { - for(x = 0; x < gridsize-1; ++x) { + for (y= 0; y < gridsize-1; y++) { + float tmp[3]; + + v1 = y*gridsize; + add_v3_v3v3(tmprow[0], data[v1].co, data[v1+gridsize].co); + + for (x= 0; x < gridsize-1; x++) { v1 = x + y*gridsize; - v2 = (x + 1) + y*gridsize; - v3 = (x + 1) + (y + 1)*gridsize; - v4 = x + (y + 1)*gridsize; + v2 = v1 + 1; + v3 = v1 + gridsize; + v4 = v3 + 1; - cent_quad_v3(co, data[v1].co, data[v2].co, data[v3].co, data[v4].co); - mul_v3_fl(co, 0.25f); + add_v3_v3v3(tmprow[x+1], data[v2].co, data[v4].co); + add_v3_v3v3(tmp, tmprow[x+1], tmprow[x]); - add_v3_v3(tmpgrid[v1], co); - add_v3_v3(tmpgrid[v2], co); - add_v3_v3(tmpgrid[v3], co); - add_v3_v3(tmpgrid[v4], co); + add_v3_v3(tmpgrid[v1], tmp); + add_v3_v3(tmpgrid[v2], tmp); + add_v3_v3(tmpgrid[v3], tmp); + add_v3_v3(tmpgrid[v4], tmp); } } /* blend with existing coordinates */ for(y = 0; y < gridsize; ++y) { for(x = 0; x < gridsize; ++x) { - if(x == 0 && adj->index[0] == -1) continue; - if(x == gridsize - 1 && adj->index[2] == -1) continue; - if(y == 0 && adj->index[3] == -1) continue; - if(y == gridsize - 1 && adj->index[1] == -1) continue; + float *co; + float *fno; + int index; - copy_v3_v3(co, data[x + y*gridsize].co); + if(x == 0 && adj->index[0] == -1) + continue; + + if(x == gridsize - 1 && adj->index[2] == -1) + continue; + + if(y == 0 && adj->index[3] == -1) + continue; + + if(y == gridsize - 1 && adj->index[1] == -1) + continue; + + index = x + y*gridsize; + co= data[index].co; + fno= data[index].no; if(sculpt_brush_test(&test, co)) { - float fade = tex_strength(ss, brush, co, test.dist)*bstrength; - float avg[3], val[3]; + const float fade = bstrength*tex_strength(ss, brush, co, test.dist)*frontface(brush, ss->cache->view_normal, NULL, fno); + float *avg, val[3]; + float n; + + avg = tmpgrid[x + y*gridsize]; + + n = 1/16.0f; - copy_v3_v3(avg, tmpgrid[x + y*gridsize]); if(x == 0 || x == gridsize - 1) - mul_v3_fl(avg, 2.0f); + n *= 2; + if(y == 0 || y == gridsize - 1) - mul_v3_fl(avg, 2.0f); + n *= 2; - CLAMP(fade, 0.0f, 1.0f); + mul_v3_fl(avg, n); - val[0] = co[0]+(avg[0]-co[0])*fade; - val[1] = co[1]+(avg[1]-co[1])*fade; - val[2] = co[2]+(avg[2]-co[2])*fade; - - sculpt_clip(sd, ss, data[x + y*gridsize].co, val); + sub_v3_v3v3(val, avg, co); + mul_v3_fl(val, fade); + + add_v3_v3(val, co); + + sculpt_clip(sd, ss, co, val); } } } } #pragma omp critical - MEM_freeN(tmpgrid); + { + MEM_freeN(tmpgrid); + MEM_freeN(tmprow); + } } -static void do_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +static void smooth(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float bstrength) { - int iteration, n; + const int max_iterations = 4; + const float fract = 1.0f/max_iterations; + int iteration, n, count; + float last; - for(iteration = 0; iteration < 2; ++iteration) { - #pragma omp parallel for private(n) schedule(static) + CLAMP(bstrength, 0, 1); + + count = (int)(bstrength*max_iterations); + last = max_iterations*(bstrength - count*fract); + + for(iteration = 1; iteration <= count; ++iteration) { + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; nmultires) - do_multires_smooth_brush(sd, ss, nodes[n]); + if(ss->multires) { + do_multires_smooth_brush(sd, ss, nodes[n], iteration != count ? 1.0f : last); + } else if(ss->fmap) - do_mesh_smooth_brush(sd, ss, nodes[n]); - - BLI_pbvh_node_mark_update(nodes[n]); + do_mesh_smooth_brush(sd, ss, nodes[n], iteration != count ? 1.0f : last); } if(ss->multires) @@ -1054,69 +1204,378 @@ static void do_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int } } +static void do_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + smooth(sd, ss, nodes, totnode, ss->cache->bstrength); +} + +static void do_draw_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + float offset[3], area_normal[3]; + float bstrength= ss->cache->bstrength; + int n; + + calc_sculpt_normal(sd, ss, area_normal, nodes, totnode); + + /* offset with as much as possible factored in already */ + mul_v3_v3fl(offset, area_normal, ss->cache->radius); + mul_v3_v3(offset, ss->cache->scale); + mul_v3_fl(offset, bstrength); + + /* threaded loop over nodes */ + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n=0; npbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if (sculpt_brush_test(&test, vd.co)) { + //if(sculpt_brush_test_cyl(&test, vd.co, ss->cache->location, area_normal)) { + /* offset vertex */ + float fade = tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], offset, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_crease_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + float offset[3], area_normal[3]; + float bstrength= ss->cache->bstrength; + float flippedbstrength, crease_correction; + int n; + + calc_sculpt_normal(sd, ss, area_normal, nodes, totnode); + + /* offset with as much as possible factored in already */ + mul_v3_v3fl(offset, area_normal, ss->cache->radius); + mul_v3_v3(offset, ss->cache->scale); + mul_v3_fl(offset, bstrength); + + /* we divide out the squared alpha and multiply by the squared crease to give us the pinch strength */ + + if(sculpt_get_brush_alpha(brush) > 0.0f) + crease_correction = brush->crease_pinch_factor*brush->crease_pinch_factor/(sculpt_get_brush_alpha(brush)*sculpt_get_brush_alpha(brush)); + else + crease_correction = brush->crease_pinch_factor*brush->crease_pinch_factor; + + /* we always want crease to pinch or blob to relax even when draw is negative */ + flippedbstrength = (bstrength < 0) ? -crease_correction*bstrength : crease_correction*bstrength; + + if(brush->sculpt_tool == SCULPT_TOOL_BLOB) flippedbstrength *= -1.0f; + + /* threaded loop over nodes */ + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n=0; npbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test(&test, vd.co)) { + /* offset vertex */ + const float fade = tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno); + float val1[3]; + float val2[3]; + + /* first we pinch */ + sub_v3_v3v3(val1, test.location, vd.co); + //mul_v3_v3(val1, ss->cache->scale); + mul_v3_fl(val1, fade*flippedbstrength); + + /* then we draw */ + mul_v3_v3fl(val2, offset, fade); + + add_v3_v3v3(proxy[vd.i], val1, val2); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + BLI_pbvh_vertex_iter_end; + } +} + static void do_pinch_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) { Brush *brush = paint_brush(&sd->paint); float bstrength= ss->cache->bstrength; int n; - #pragma omp parallel for private(n) schedule(static) + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; npbvh, nodes[n])->co; + sculpt_brush_test_init(ss, &test); - BLI_pbvh_vertex_iter_begin(ss->tree, nodes[n], vd, PBVH_ITER_UNIQUE) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { if(sculpt_brush_test(&test, vd.co)) { - float fade = tex_strength(ss, brush, vd.co, test.dist)*bstrength; - float val[3]= {vd.co[0]+(test.location[0]-vd.co[0])*fade, - vd.co[1]+(test.location[1]-vd.co[1])*fade, - vd.co[2]+(test.location[2]-vd.co[2])*fade}; - - sculpt_clip(sd, ss, vd.co, val); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; - } + float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, ss->cache->view_normal, vd.no, vd.fno); + float val[3]; + + sub_v3_v3v3(val, test.location, vd.co); + mul_v3_v3fl(proxy[vd.i], val, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } } BLI_pbvh_vertex_iter_end; - - BLI_pbvh_node_mark_update(nodes[n]); } } static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) { - Brush *brush = paint_brush(&sd->paint); + Brush *brush= paint_brush(&sd->paint); float bstrength= ss->cache->bstrength; - float grab_delta[3]; + float grab_delta[3], an[3]; int n; - + float len; + + if (brush->normal_weight > 0) + calc_sculpt_normal(sd, ss, an, nodes, totnode); + copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry); - #pragma omp parallel for private(n) schedule(static) + len = len_v3(grab_delta); + + if (brush->normal_weight > 0) { + mul_v3_fl(an, len*brush->normal_weight); + mul_v3_fl(grab_delta, 1.0f - brush->normal_weight); + add_v3_v3(grab_delta, an); + } + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; nco; + short (*origno)[3]; + float (*proxy)[3]; + + unode= sculpt_undo_push_node(ss, nodes[n]); + origco= unode->co; + origno= unode->no; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + sculpt_brush_test_init(ss, &test); - BLI_pbvh_vertex_iter_begin(ss->tree, nodes[n], vd, PBVH_ITER_UNIQUE) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { if(sculpt_brush_test(&test, origco[vd.i])) { - float fade = tex_strength(ss, brush, origco[vd.i], test.dist)*bstrength; - float add[3]= {vd.co[0]+fade*grab_delta[0], - vd.co[1]+fade*grab_delta[1], - vd.co[2]+fade*grab_delta[2]}; + const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist)*frontface(brush, an, origno[vd.i], NULL); - sculpt_clip(sd, ss, vd.co, add); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BLI_pbvh_vertex_iter_end; + } +} - BLI_pbvh_node_mark_update(nodes[n]); +static void do_nudge_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + float bstrength = ss->cache->bstrength; + float grab_delta[3]; + int n; + float an[3]; + float tmp[3], cono[3]; + + copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry); + + calc_sculpt_normal(sd, ss, an, nodes, totnode); + + cross_v3_v3v3(tmp, an, grab_delta); + cross_v3_v3v3(cono, tmp, an); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptBrushTest test; + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test(&test, vd.co)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, an, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], cono, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_snake_hook_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + float bstrength = ss->cache->bstrength; + float grab_delta[3], an[3]; + int n; + float len; + + if (brush->normal_weight > 0) + calc_sculpt_normal(sd, ss, an, nodes, totnode); + + copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry); + + len = len_v3(grab_delta); + + if (bstrength < 0) + negate_v3(grab_delta); + + if (brush->normal_weight > 0) { + mul_v3_fl(an, len*brush->normal_weight); + mul_v3_fl(grab_delta, 1.0f - brush->normal_weight); + add_v3_v3(grab_delta, an); + } + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptBrushTest test; + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test(&test, vd.co)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, an, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], grab_delta, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_thumb_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + float bstrength = ss->cache->bstrength; + float grab_delta[3]; + int n; + float an[3]; + float tmp[3], cono[3]; + + copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry); + + calc_sculpt_normal(sd, ss, an, nodes, totnode); + + cross_v3_v3v3(tmp, an, grab_delta); + cross_v3_v3v3(cono, tmp, an); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptUndoNode* unode; + SculptBrushTest test; + float (*origco)[3]; + short (*origno)[3]; + float (*proxy)[3]; + + unode= sculpt_undo_push_node(ss, nodes[n]); + origco= unode->co; + origno= unode->no; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test(&test, origco[vd.i])) { + const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist)*frontface(brush, an, origno[vd.i], NULL); + + mul_v3_v3fl(proxy[vd.i], cono, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_rotate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush= paint_brush(&sd->paint); + float bstrength= ss->cache->bstrength; + float an[3]; + int n; + float m[3][3]; + static const int flip[8] = { 1, -1, -1, 1, -1, 1, 1, -1 }; + float angle = ss->cache->vertex_rotation * flip[ss->cache->mirror_symmetry_pass]; + + calc_sculpt_normal(sd, ss, an, nodes, totnode); + + axis_angle_to_mat3(m, an, angle); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n=0; nco; + origno= unode->no; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test(&test, origco[vd.i])) { + const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist)*frontface(brush, an, origno[vd.i], NULL); + + mul_v3_m3v3(proxy[vd.i], m, origco[vd.i]); + sub_v3_v3(proxy[vd.i], origco[vd.i]); + mul_v3_fl(proxy[vd.i], fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + BLI_pbvh_vertex_iter_end; } } @@ -1128,60 +1587,66 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int float lim= ss->cache->radius / 4; int n; - /* XXX not working yet for multires */ - if(ss->multires) - return; - - if(ss->cache->flip) + if(bstrength < 0) lim = -lim; - calc_area_normal(sd, ss, area_normal, nodes, totnode); + calc_sculpt_normal(sd, ss, area_normal, nodes, totnode); - offset[0]= ss->cache->scale[0]*area_normal[0]; - offset[1]= ss->cache->scale[1]*area_normal[1]; - offset[2]= ss->cache->scale[2]*area_normal[2]; + mul_v3_v3v3(offset, ss->cache->scale, area_normal); - #pragma omp parallel for private(n) schedule(static) + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; npbvh, nodes[n])->co; - origco= sculpt_undo_push_node(ss, nodes[n])->co; + unode= sculpt_undo_push_node(ss, nodes[n]); + origco=unode->co; + if(!unode->layer_disp) + { + #pragma omp critical + unode->layer_disp= MEM_callocN(sizeof(float)*unode->totvert, "layer disp"); + } + + layer_disp= unode->layer_disp; + sculpt_brush_test_init(ss, &test); - BLI_pbvh_vertex_iter_begin(ss->tree, nodes[n], vd, PBVH_ITER_UNIQUE) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { if(sculpt_brush_test(&test, vd.co)) { - float fade = tex_strength(ss, brush, vd.co, test.dist)*bstrength; - int index= vd.vert_indices[vd.i]; - float *disp= &ss->layer_disps[index]; + const float fade = bstrength*ss->cache->radius*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno); + float *disp= &layer_disp[vd.i]; float val[3]; - + *disp+= fade; - + /* Don't let the displacement go past the limit */ if((lim < 0 && *disp < lim) || (lim > 0 && *disp > lim)) *disp = lim; - + + mul_v3_v3fl(val, offset, *disp); + if(ss->layer_co && (brush->flag & BRUSH_PERSISTENT)) { + int index= vd.vert_indices[vd.i]; + /* persistent base */ - val[0] = ss->layer_co[index][0] + (*disp)*offset[0]; - val[1] = ss->layer_co[index][1] + (*disp)*offset[1]; - val[2] = ss->layer_co[index][2] + (*disp)*offset[2]; + add_v3_v3(val, ss->layer_co[index]); } else { - val[0] = origco[vd.i][0] + (*disp)*offset[0]; - val[1] = origco[vd.i][1] + (*disp)*offset[1]; - val[2] = origco[vd.i][2] + (*disp)*offset[2]; + add_v3_v3(val, origco[vd.i]); } sculpt_clip(sd, ss, vd.co, val); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BLI_pbvh_vertex_iter_end; - - BLI_pbvh_node_mark_update(nodes[n]); } } @@ -1191,221 +1656,715 @@ static void do_inflate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, in float bstrength= ss->cache->bstrength; int n; - #pragma omp parallel for private(n) schedule(static) + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; npbvh, nodes[n])->co; + sculpt_brush_test_init(ss, &test); - BLI_pbvh_vertex_iter_begin(ss->tree, nodes[n], vd, PBVH_ITER_UNIQUE) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { if(sculpt_brush_test(&test, vd.co)) { - float fade = tex_strength(ss, brush, vd.co, test.dist)*bstrength; - float add[3]; + const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, ss->cache->view_normal, vd.no, vd.fno); + float val[3]; - if(vd.fno) copy_v3_v3(add, vd.fno); - else normal_short_to_float_v3(add, vd.no); + if(vd.fno) copy_v3_v3(val, vd.fno); + else normal_short_to_float_v3(val, vd.no); - mul_v3_fl(add, fade * ss->cache->radius); - add[0]*= ss->cache->scale[0]; - add[1]*= ss->cache->scale[1]; - add[2]*= ss->cache->scale[2]; - add_v3_v3v3(add, add, vd.co); - - sculpt_clip(sd, ss, vd.co, add); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + mul_v3_fl(val, fade * ss->cache->radius); + mul_v3_v3v3(proxy[vd.i], val, ss->cache->scale); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } BLI_pbvh_vertex_iter_end; - - BLI_pbvh_node_mark_update(nodes[n]); } } -static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float co[3]) +static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float fc[3]) { - float outer_dist[FLATTEN_SAMPLE_SIZE]; - float outer_co[FLATTEN_SAMPLE_SIZE][3]; - int i, n; - - for(i = 0; i < FLATTEN_SAMPLE_SIZE; ++i) { - zero_v3(outer_co[i]); - outer_dist[i]= -1.0f; - } - - #pragma omp parallel for private(n) schedule(static) + int n; + + float count = 0; + + zero_v3(fc); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; ntree, nodes[n], vd, PBVH_ITER_UNIQUE) { - if(sculpt_brush_test(&test, vd.co)) { - for(j = 0; j < FLATTEN_SAMPLE_SIZE; ++j) { - if(test.dist > outer_dist[j]) { - copy_v3_v3(outer_co[j], vd.co); - outer_dist[j] = test.dist; - break; - } + if(ss->cache->original) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test_fast(&test, unode->co[vd.i])) { + add_v3_v3(private_fc, vd.co); + private_count++; } } + BLI_pbvh_vertex_iter_end; + } + else { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test_fast(&test, vd.co)) { + add_v3_v3(private_fc, vd.co); + private_count++; + } + } + BLI_pbvh_vertex_iter_end; } - BLI_pbvh_vertex_iter_end; - BLI_pbvh_node_mark_update(nodes[n]); + #pragma omp critical + { + add_v3_v3(fc, private_fc); + count += private_count; + } + } + + mul_v3_fl(fc, 1.0f / count); +} + +/* this calculates flatten center and area normal together, +amortizing the memory bandwidth and loop overhead to calculate both at the same time */ +static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float an[3], float fc[3]) +{ + int n; + + // an + float out_flip[3] = {0.0f, 0.0f, 0.0f}; + + // fc + float count = 0; + + // an + zero_v3(an); + + // fc + zero_v3(fc); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n=0; ncache->original) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test_fast(&test, unode->co[vd.i])) { + // an + float fno[3]; + + normal_short_to_float_v3(fno, unode->no[vd.i]); + add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno); + + // fc + add_v3_v3(private_fc, vd.co); + private_count++; + } + } + BLI_pbvh_vertex_iter_end; + } + else { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if(sculpt_brush_test_fast(&test, vd.co)) { + // an + if(vd.no) { + float fno[3]; + + normal_short_to_float_v3(fno, vd.no); + add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno); + } + else { + add_norm_if(ss->cache->view_normal, private_an, private_out_flip, vd.fno); + } + + // fc + add_v3_v3(private_fc, vd.co); + private_count++; + } + } + BLI_pbvh_vertex_iter_end; + } + + #pragma omp critical + { + // an + add_v3_v3(an, private_an); + add_v3_v3(out_flip, private_out_flip); + + // fc + add_v3_v3(fc, private_fc); + count += private_count; + } + } + + // an + if (is_zero_v3(an)) + copy_v3_v3(an, out_flip); + + normalize_v3(an); + + // fc + mul_v3_fl(fc, 1.0f / count); +} + +static void calc_sculpt_plane(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float an[3], float fc[3]) +{ + Brush *brush = paint_brush(&sd->paint); + + if (ss->cache->mirror_symmetry_pass == 0 && + ss->cache->radial_symmetry_pass == 0 && + (ss->cache->first_time || !(brush->flag & BRUSH_ORIGINAL_NORMAL))) + { + switch (brush->sculpt_plane) { + case SCULPT_DISP_DIR_VIEW: + viewvector(ss->cache->vc->rv3d, ss->cache->vc->rv3d->twmat[3], an); + break; + + case SCULPT_DISP_DIR_X: + an[1] = 0.0; + an[2] = 0.0; + an[0] = 1.0; + break; + + case SCULPT_DISP_DIR_Y: + an[0] = 0.0; + an[2] = 0.0; + an[1] = 1.0; + break; + + case SCULPT_DISP_DIR_Z: + an[0] = 0.0; + an[1] = 0.0; + an[2] = 1.0; + break; + + case SCULPT_DISP_DIR_AREA: + calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, an, fc); + + default: + break; + } + + // fc + /* flatten center has not been calculated yet if we are not using the area normal */ + if (brush->sculpt_plane != SCULPT_DISP_DIR_AREA) + calc_flatten_center(sd, ss, nodes, totnode, fc); + + // an + copy_v3_v3(ss->cache->last_area_normal, an); + + // fc + copy_v3_v3(ss->cache->last_center, fc); + } + else { + // an + copy_v3_v3(an, ss->cache->last_area_normal); + + // fc + copy_v3_v3(fc, ss->cache->last_center); + + // an + flip_coord(an, an, ss->cache->mirror_symmetry_pass); + + // fc + flip_coord(fc, fc, ss->cache->mirror_symmetry_pass); + + // an + mul_m4_v3(ss->cache->symm_rot_mat, an); + + // fc + mul_m4_v3(ss->cache->symm_rot_mat, fc); } - - co[0] = co[1] = co[2] = 0.0f; - for(i = 0; i < FLATTEN_SAMPLE_SIZE; ++i) - if(outer_dist[i] >= 0.0f) - add_v3_v3v3(co, co, outer_co[i]); - mul_v3_fl(co, 1.0f / FLATTEN_SAMPLE_SIZE); } /* Projects a point onto a plane along the plane's normal */ static void point_plane_project(float intr[3], float co[3], float plane_normal[3], float plane_center[3]) { - float p1[3], sub1[3], sub2[3]; - - /* Find the intersection between squash-plane and vertex (along the area normal) */ - sub_v3_v3v3(p1, co, plane_normal); - sub_v3_v3v3(sub1, plane_center, p1); - sub_v3_v3v3(sub2, co, p1); - sub_v3_v3v3(intr, co, p1); - mul_v3_fl(intr, dot_v3v3(plane_normal, sub1) / dot_v3v3(plane_normal, sub2)); - add_v3_v3v3(intr, intr, p1); + sub_v3_v3v3(intr, co, plane_center); + mul_v3_v3fl(intr, plane_normal, dot_v3v3(plane_normal, intr)); + sub_v3_v3v3(intr, co, intr); } -static int plane_point_side(float co[3], float plane_normal[3], float plane_center[3], int flip) +static int plane_trim(StrokeCache *cache, Brush *brush, float val[3]) { - float delta[3]; - float d; - - sub_v3_v3v3(delta, co, plane_center); - d = dot_v3v3(plane_normal, delta); - - if(flip) - d = -d; - - return d <= 0.0f; + return !(brush->flag & BRUSH_PLANE_TRIM) || (dot_v3v3(val, val) <= cache->radius_squared*cache->plane_trim_squared); } -static void do_flatten_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, int clay) +static int plane_point_side_flip(float co[3], float plane_normal[3], float plane_center[3], int flip) { - /* area_normal and cntr define the plane towards which vertices are squashed */ - Brush *brush = paint_brush(&sd->paint); - float bstrength= ss->cache->bstrength; - float area_normal[3]; - float cntr[3], cntr2[3] = {0}, bstr = 0; - int n, flip = 0; + float delta[3]; + float d; - calc_area_normal(sd, ss, area_normal, nodes, totnode); - calc_flatten_center(sd, ss, nodes, totnode, cntr); + sub_v3_v3v3(delta, co, plane_center); + d = dot_v3v3(plane_normal, delta); - if(clay) { - bstr= brush_strength(sd, ss->cache); - /* Limit clay application to here */ - cntr2[0]=cntr[0]+area_normal[0]*bstr*ss->cache->scale[0]; - cntr2[1]=cntr[1]+area_normal[1]*bstr*ss->cache->scale[1]; - cntr2[2]=cntr[2]+area_normal[2]*bstr*ss->cache->scale[2]; - flip = bstr < 0; + if (flip) d = -d; + + return d <= 0.0f; +} + +static int plane_point_side(float co[3], float plane_normal[3], float plane_center[3]) +{ + float delta[3]; + + sub_v3_v3v3(delta, co, plane_center); + return dot_v3v3(plane_normal, delta) <= 0.0f; +} + +static float get_offset(Sculpt *sd, SculptSession *ss) +{ + Brush* brush = paint_brush(&sd->paint); + + float rv = brush->plane_offset; + + if (brush->flag & BRUSH_OFFSET_PRESSURE) { + rv *= ss->cache->pressure; } - #pragma omp parallel for private(n) schedule(static) - for(n=0; npaint); + + float bstrength = ss->cache->bstrength; + const float radius = ss->cache->radius; + + float an[3]; + float fc[3]; + + float offset = get_offset(sd, ss); + + float displace; + + int n; + + float temp[3]; + + calc_sculpt_plane(sd, ss, nodes, totnode, an, fc); + + displace = radius*offset; + + mul_v3_v3v3(temp, an, ss->cache->scale); + mul_v3_fl(temp, displace); + add_v3_v3(fc, temp); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for(n = 0; n < totnode; n++) { + PBVHVertexIter vd; SculptBrushTest test; - - sculpt_undo_push_node(ss, nodes[n]); + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + sculpt_brush_test_init(ss, &test); - BLI_pbvh_vertex_iter_begin(ss->tree, nodes[n], vd, PBVH_ITER_UNIQUE) { - if(sculpt_brush_test(&test, vd.co)) { - float intr[3], val[3]; - - if(!clay || plane_point_side(vd.co, area_normal, cntr2, flip)) { - const float fade = tex_strength(ss, brush, vd.co, test.dist)*bstrength; + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if (sculpt_brush_test_sq(&test, vd.co)) { + float intr[3]; + float val[3]; - /* Find the intersection between squash-plane and vertex (along the area normal) */ - point_plane_project(intr, vd.co, area_normal, cntr); + point_plane_project(intr, vd.co, an, fc); - sub_v3_v3v3(val, intr, vd.co); + sub_v3_v3v3(val, intr, vd.co); - if(clay) { - if(bstr > FLT_EPSILON) - mul_v3_fl(val, fade / bstr); - else - mul_v3_fl(val, fade); - /* Clay displacement */ - val[0]+=area_normal[0] * ss->cache->scale[0]*fade; - val[1]+=area_normal[1] * ss->cache->scale[1]*fade; - val[2]+=area_normal[2] * ss->cache->scale[2]*fade; - } - else - mul_v3_fl(val, fabs(fade)); + if (plane_trim(ss->cache, brush, val)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno); - add_v3_v3v3(val, val, vd.co); + mul_v3_v3fl(proxy[vd.i], val, fade); - sculpt_clip(sd, ss, vd.co, val); - if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } } } BLI_pbvh_vertex_iter_end; - - BLI_pbvh_node_mark_update(nodes[n]); } } -static void do_brush_action(Sculpt *sd, SculptSession *ss, StrokeCache *cache) +static void do_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + + float bstrength = ss->cache->bstrength; + float radius = ss->cache->radius; + float offset = get_offset(sd, ss); + + float displace; + + float an[3]; // area normal + float fc[3]; // flatten center + + int n; + + float temp[3]; + //float p[3]; + + int flip; + + calc_sculpt_plane(sd, ss, nodes, totnode, an, fc); + + flip = bstrength < 0; + + if (flip) { + bstrength = -bstrength; + radius = -radius; + } + + displace = radius * (0.25f+offset); + + mul_v3_v3v3(temp, an, ss->cache->scale); + mul_v3_fl(temp, displace); + add_v3_v3(fc, temp); + + //add_v3_v3v3(p, ss->cache->location, an); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptBrushTest test; + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if (sculpt_brush_test_sq(&test, vd.co)) { + if (plane_point_side_flip(vd.co, an, fc, flip)) { + //if (sculpt_brush_test_cyl(&test, vd.co, ss->cache->location, p)) { + float intr[3]; + float val[3]; + + point_plane_project(intr, vd.co, an, fc); + + sub_v3_v3v3(val, intr, vd.co); + + if (plane_trim(ss->cache, brush, val)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], val, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_clay_tubes_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + + float bstrength = ss->cache->bstrength; + float radius = ss->cache->radius; + float offset = get_offset(sd, ss); + + float displace; + + float sn[3]; // sculpt normal + float an[3]; // area normal + float fc[3]; // flatten center + + int n; + + float temp[3]; + float mat[4][4]; + float scale[4][4]; + float tmat[4][4]; + + int flip; + + calc_sculpt_plane(sd, ss, nodes, totnode, sn, fc); + + if (brush->sculpt_plane != SCULPT_DISP_DIR_AREA || (brush->flag & BRUSH_ORIGINAL_NORMAL)) + calc_area_normal(sd, ss, an, nodes, totnode); + else + copy_v3_v3(an, sn); + + if (ss->cache->first_time) + return; // delay the first daub because grab delta is not setup + + flip = bstrength < 0; + + if (flip) { + bstrength = -bstrength; + radius = -radius; + } + + displace = radius * (0.25f+offset); + + mul_v3_v3v3(temp, sn, ss->cache->scale); + mul_v3_fl(temp, displace); + add_v3_v3(fc, temp); + + cross_v3_v3v3(mat[0], an, ss->cache->grab_delta_symmetry); mat[0][3] = 0; + cross_v3_v3v3(mat[1], an, mat[0]); mat[1][3] = 0; + copy_v3_v3(mat[2], an); mat[2][3] = 0; + copy_v3_v3(mat[3], ss->cache->location); mat[3][3] = 1; + normalize_m4(mat); + scale_m4_fl(scale, ss->cache->radius); + mul_m4_m4m4(tmat, scale, mat); + invert_m4_m4(mat, tmat); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptBrushTest test; + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if (sculpt_brush_test_cube(&test, vd.co, mat)) { + if (plane_point_side_flip(vd.co, sn, fc, flip)) { + float intr[3]; + float val[3]; + + point_plane_project(intr, vd.co, sn, fc); + + sub_v3_v3v3(val, intr, vd.co); + + if (plane_trim(ss->cache, brush, val)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, ss->cache->radius*test.dist)*frontface(brush, an, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], val, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_fill_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + + float bstrength = ss->cache->bstrength; + const float radius = ss->cache->radius; + + float an[3]; + float fc[3]; + float offset = get_offset(sd, ss); + + float displace; + + int n; + + float temp[3]; + + calc_sculpt_plane(sd, ss, nodes, totnode, an, fc); + + displace = radius*offset; + + mul_v3_v3v3(temp, an, ss->cache->scale); + mul_v3_fl(temp, displace); + add_v3_v3(fc, temp); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptBrushTest test; + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if (sculpt_brush_test_sq(&test, vd.co)) { + if (plane_point_side(vd.co, an, fc)) { + float intr[3]; + float val[3]; + + point_plane_project(intr, vd.co, an, fc); + + sub_v3_v3v3(val, intr, vd.co); + + if (plane_trim(ss->cache, brush, val)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], val, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + } + } + BLI_pbvh_vertex_iter_end; + } +} + +static void do_scrape_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode) +{ + Brush *brush = paint_brush(&sd->paint); + + float bstrength = ss->cache->bstrength; + const float radius = ss->cache->radius; + float an[3]; + float fc[3]; + float offset = get_offset(sd, ss); + + float displace; + + int n; + + float temp[3]; + + calc_sculpt_plane(sd, ss, nodes, totnode, an, fc); + + displace = -radius*offset; + + mul_v3_v3v3(temp, an, ss->cache->scale); + mul_v3_fl(temp, displace); + add_v3_v3(fc, temp); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n = 0; n < totnode; n++) { + PBVHVertexIter vd; + SculptBrushTest test; + float (*proxy)[3]; + + proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co; + + sculpt_brush_test_init(ss, &test); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + if (sculpt_brush_test_sq(&test, vd.co)) { + if (!plane_point_side(vd.co, an, fc)) { + float intr[3]; + float val[3]; + + point_plane_project(intr, vd.co, an, fc); + + sub_v3_v3v3(val, intr, vd.co); + + if (plane_trim(ss->cache, brush, val)) { + const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno); + + mul_v3_v3fl(proxy[vd.i], val, fade); + + if(vd.mvert) + vd.mvert->flag |= ME_VERT_PBVH_UPDATE; + } + } + } + } + BLI_pbvh_vertex_iter_end; + } +} + +void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3]) +{ + Mesh *me= (Mesh*)ob->data; + float (*ofs)[3]= NULL; + int a, is_basis= 0; + KeyBlock *currkey; + + /* for relative keys editing of base should update other keys */ + if (me->key->type == KEY_RELATIVE) + for (currkey = me->key->block.first; currkey; currkey= currkey->next) + if(ob->shapenr-1 == currkey->relative) { + is_basis= 1; + break; + } + + if (is_basis) { + ofs= key_to_vertcos(ob, kb); + + /* calculate key coord offsets (from previous location) */ + for (a= 0; a < me->totvert; a++) { + VECSUB(ofs[a], vertCos[a], ofs[a]); + } + + /* apply offsets on other keys */ + currkey = me->key->block.first; + while (currkey) { + int apply_offset = ((currkey != kb) && (ob->shapenr-1 == currkey->relative)); + + if (apply_offset) + offset_to_key(ob, currkey, ofs); + + currkey= currkey->next; + } + + MEM_freeN(ofs); + } + + /* modifying of basis key should update mesh */ + if (kb == me->key->refkey) { + MVert *mvert= me->mvert; + + for (a= 0; a < me->totvert; a++, mvert++) + VECCOPY(mvert->co, vertCos[a]); + + mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); + } + + /* apply new coords on active key block */ + vertcos_to_key(ob, kb, vertCos); +} + +/* copy the modified vertices from bvh to the active key */ +static void sculpt_update_keyblock(SculptSession *ss) +{ + float (*vertCos)[3]= BLI_pbvh_get_vertCos(ss->pbvh); + + if (vertCos) { + sculpt_vertcos_to_key(ss->ob, ss->kb, vertCos); + MEM_freeN(vertCos); + } +} + +static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush) { SculptSearchSphereData data; - Brush *brush = paint_brush(&sd->paint); - PBVHNode **nodes= NULL; - rctf mr; - float xrad, yrad; - int totnode; - - xrad = cache->pixel_radius+5.0f; - yrad = cache->pixel_radius+5.0f; - - mr.xmin = cache->mouse[0] - xrad - cache->vc->ar->winrct.xmin; - mr.xmax = cache->mouse[0] + xrad - cache->vc->ar->winrct.xmin; - mr.ymin = cache->mouse[1] - yrad - cache->vc->ar->winrct.ymin; - mr.ymax = cache->mouse[1] + yrad - cache->vc->ar->winrct.ymin; - - cache->prect.xmin = MIN2(cache->prect.xmin, mr.xmin); - cache->prect.xmax = MAX2(cache->prect.xmax, mr.xmax); - cache->prect.ymin = MIN2(cache->prect.ymin, mr.ymin); - cache->prect.ymax = MAX2(cache->prect.ymax, mr.ymax); + PBVHNode **nodes = NULL; + int n, totnode; + /* Build a list of all nodes that are potentially within the brush's area of influence */ data.ss = ss; data.sd = sd; - data.radius_squared = ss->cache->radius * ss->cache->radius; - - /* Build a list of all nodes that are potentially within the brush's - area of influence */ - if(brush->sculpt_tool == SCULPT_TOOL_GRAB) { - data.original= 1; - BLI_pbvh_search_gather(ss->tree, sculpt_search_sphere_cb, &data, - &nodes, &totnode); - - if(cache->first_time) - copy_v3_v3(ss->cache->grab_active_location[ss->cache->symmetry], ss->cache->location); - else - copy_v3_v3(ss->cache->location, ss->cache->grab_active_location[ss->cache->symmetry]); - } - else { - BLI_pbvh_search_gather(ss->tree, sculpt_search_sphere_cb, &data, - &nodes, &totnode); - } + data.radius_squared = ss->cache->radius_squared; + data.original = ELEM4(brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_THUMB, SCULPT_TOOL_LAYER); + BLI_pbvh_search_gather(ss->pbvh, sculpt_search_sphere_cb, &data, &nodes, &totnode); /* Only act if some verts are inside the brush area */ - if(totnode) { + if (totnode) { + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n= 0; n < totnode; n++) { + sculpt_undo_push_node(ss, nodes[n]); + BLI_pbvh_node_mark_update(nodes[n]); + } + /* Apply one type of brush action */ switch(brush->sculpt_tool){ case SCULPT_TOOL_DRAW: @@ -1414,6 +2373,12 @@ static void do_brush_action(Sculpt *sd, SculptSession *ss, StrokeCache *cache) case SCULPT_TOOL_SMOOTH: do_smooth_brush(sd, ss, nodes, totnode); break; + case SCULPT_TOOL_CREASE: + do_crease_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_BLOB: + do_crease_brush(sd, ss, nodes, totnode); + break; case SCULPT_TOOL_PINCH: do_pinch_brush(sd, ss, nodes, totnode); break; @@ -1423,55 +2388,240 @@ static void do_brush_action(Sculpt *sd, SculptSession *ss, StrokeCache *cache) case SCULPT_TOOL_GRAB: do_grab_brush(sd, ss, nodes, totnode); break; + case SCULPT_TOOL_ROTATE: + do_rotate_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_SNAKE_HOOK: + do_snake_hook_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_NUDGE: + do_nudge_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_THUMB: + do_thumb_brush(sd, ss, nodes, totnode); + break; case SCULPT_TOOL_LAYER: do_layer_brush(sd, ss, nodes, totnode); break; case SCULPT_TOOL_FLATTEN: - do_flatten_clay_brush(sd, ss, nodes, totnode, 0); + do_flatten_brush(sd, ss, nodes, totnode); break; case SCULPT_TOOL_CLAY: - do_flatten_clay_brush(sd, ss, nodes, totnode, 1); + do_clay_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_CLAY_TUBES: + do_clay_tubes_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_FILL: + do_fill_brush(sd, ss, nodes, totnode); + break; + case SCULPT_TOOL_SCRAPE: + do_scrape_brush(sd, ss, nodes, totnode); break; } - + + if (brush->sculpt_tool != SCULPT_TOOL_SMOOTH && brush->autosmooth_factor > 0) { + if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) { + smooth(sd, ss, nodes, totnode, brush->autosmooth_factor*(1-ss->cache->pressure)); + } + else { + smooth(sd, ss, nodes, totnode, brush->autosmooth_factor); + } + } + /* copy the modified vertices from mesh to the active key */ - if(ss->kb) mesh_to_key(ss->ob->data, ss->kb); - - if(nodes) - MEM_freeN(nodes); - } + if(ss->kb) + mesh_to_key(ss->ob->data, ss->kb); + + /* optimization: we could avoid copying new coords to keyblock at each */ + /* stroke step if there are no modifiers due to pbvh is used for displaying */ + /* so to increase speed we'll copy new coords to keyblock when stroke is done */ + if(ss->kb && ss->modifiers_active) sculpt_update_keyblock(ss); + + MEM_freeN(nodes); + } } +static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss) +{ + Brush *brush= paint_brush(&sd->paint); + PBVHNode** nodes; + int totnode; + int n; + + BLI_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode); + + switch (brush->sculpt_tool) { + case SCULPT_TOOL_GRAB: + case SCULPT_TOOL_ROTATE: + case SCULPT_TOOL_THUMB: + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n= 0; n < totnode; n++) { + PBVHVertexIter vd; + PBVHProxyNode* proxies; + int proxy_count; + float (*origco)[3]; + + origco= sculpt_undo_push_node(ss, nodes[n])->co; + + BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + float val[3]; + int p; + + copy_v3_v3(val, origco[vd.i]); + + for (p= 0; p < proxy_count; p++) + add_v3_v3(val, proxies[p].co[vd.i]); + + sculpt_clip(sd, ss, vd.co, val); + } + BLI_pbvh_vertex_iter_end; + + BLI_pbvh_node_free_proxies(nodes[n]); + } + + break; + + case SCULPT_TOOL_DRAW: + case SCULPT_TOOL_CLAY: + case SCULPT_TOOL_CLAY_TUBES: + case SCULPT_TOOL_CREASE: + case SCULPT_TOOL_BLOB: + case SCULPT_TOOL_FILL: + case SCULPT_TOOL_FLATTEN: + case SCULPT_TOOL_INFLATE: + case SCULPT_TOOL_NUDGE: + case SCULPT_TOOL_PINCH: + case SCULPT_TOOL_SCRAPE: + case SCULPT_TOOL_SNAKE_HOOK: + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n= 0; n < totnode; n++) { + PBVHVertexIter vd; + PBVHProxyNode* proxies; + int proxy_count; + + BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count); + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + float val[3]; + int p; + + copy_v3_v3(val, vd.co); + + for (p= 0; p < proxy_count; p++) + add_v3_v3(val, proxies[p].co[vd.i]); + + sculpt_clip(sd, ss, vd.co, val); + } + BLI_pbvh_vertex_iter_end; + + BLI_pbvh_node_free_proxies(nodes[n]); + + } + + break; + + case SCULPT_TOOL_SMOOTH: + case SCULPT_TOOL_LAYER: + default: + break; + } + + if (nodes) + MEM_freeN(nodes); +} + +//static int max_overlap_count(Sculpt *sd) +//{ +// int count[3]; +// int i, j; +// +// for (i= 0; i < 3; i++) { +// count[i] = sd->radial_symm[i]; +// +// for (j= 0; j < 3; j++) { +// if (i != j && sd->flags & (SCULPT_SYMM_X<location, cache->true_location, symm); - flip_coord(cache->view_normal_symmetry, cache->view_normal, symm); flip_coord(cache->grab_delta_symmetry, cache->grab_delta, symm); - cache->symmetry= symm; + flip_coord(cache->view_normal, cache->true_view_normal, symm); + + // XXX This reduces the length of the grab delta if it approaches the line of symmetry + // XXX However, a different approach appears to be needed + //if (sd->flags & SCULPT_SYMMETRY_FEATHER) { + // float frac = 1.0f/max_overlap_count(sd); + // float reduce = (feather-frac)/(1-frac); + + // printf("feather: %f frac: %f reduce: %f\n", feather, frac, reduce); + + // if (frac < 1) + // mul_v3_fl(cache->grab_delta_symmetry, reduce); + //} + + unit_m4(cache->symm_rot_mat); + unit_m4(cache->symm_rot_mat_inv); + rotate_m4(cache->symm_rot_mat, axis, angle); + rotate_m4(cache->symm_rot_mat_inv, axis, -angle); + + mul_m4_v3(cache->symm_rot_mat, cache->location); + mul_m4_v3(cache->symm_rot_mat, cache->grab_delta_symmetry); +} + +static void do_radial_symmetry(Sculpt *sd, SculptSession *ss, Brush *brush, const char symm, const int axis, const float feather) +{ + int i; + + for(i = 1; i < sd->radial_symm[axis-'X']; ++i) { + const float angle = 2*M_PI*i/sd->radial_symm[axis-'X']; + ss->cache->radial_symmetry_pass= i; + calc_brushdata_symm(sd, ss->cache, symm, axis, angle, feather); + do_brush_action(sd, ss, brush); + } } static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss) { + Brush *brush = paint_brush(&sd->paint); StrokeCache *cache = ss->cache; const char symm = sd->flags & 7; int i; - copy_v3_v3(cache->location, cache->true_location); - copy_v3_v3(cache->grab_delta_symmetry, cache->grab_delta); - cache->symmetry = 0; - cache->bstrength = brush_strength(sd, cache); - do_brush_action(sd, ss, cache); + float feather = calc_symmetry_feather(sd, ss->cache); - for(i = 1; i <= symm; ++i) { - if(symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5))) { - calc_brushdata_symm(cache, i); - do_brush_action(sd, ss, cache); + cache->bstrength= brush_strength(sd, cache, feather); + + cache->symmetry= symm; + + /* symm is a bit combination of XYZ - 1 is mirror X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */ + for(i = 0; i <= symm; ++i) { + if(i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) { + cache->mirror_symmetry_pass= i; + cache->radial_symmetry_pass= 0; + + calc_brushdata_symm(sd, cache, i, 0, 0, feather); + do_brush_action(sd, ss, brush); + + do_radial_symmetry(sd, ss, brush, i, 'X', feather); + do_radial_symmetry(sd, ss, brush, i, 'Y', feather); + do_radial_symmetry(sd, ss, brush, i, 'Z', feather); } } - cache->first_time = 0; + sculpt_combine_proxies(sd, ss); + + cache->first_time= 0; } static void sculpt_update_tex(Sculpt *sd, SculptSession *ss) @@ -1484,86 +2634,28 @@ static void sculpt_update_tex(Sculpt *sd, SculptSession *ss) } /* Need to allocate a bigger buffer for bigger brush size */ - ss->texcache_side = brush->size * 2; + ss->texcache_side = 2*sculpt_get_brush_size(brush); if(!ss->texcache || ss->texcache_side > ss->texcache_actual) { - ss->texcache = brush_gen_texture_cache(brush, brush->size); + ss->texcache = brush_gen_texture_cache(brush, sculpt_get_brush_size(brush)); ss->texcache_actual = ss->texcache_side; } } -/* Checks whether full update mode (slower) needs to be used to work with modifiers */ -static int sculpt_modifiers_active(Scene *scene, Object *ob) -{ - ModifierData *md; - - for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) { - if(modifier_isEnabled(scene, md, eModifierMode_Realtime)) - if(!ELEM(md->type, eModifierType_Multires, eModifierType_ShapeKey)) - return 1; - } - - return 0; -} - -/* Sculpt mode handles multires differently from regular meshes, but only if - it's the last modifier on the stack and it is not on the first level */ -struct MultiresModifierData *sculpt_multires_active(Object *ob) -{ - ModifierData *md, *nmd; - - for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) { - if(md->type == eModifierType_Multires) { - MultiresModifierData *mmd= (MultiresModifierData*)md; - - /* Check if any of the modifiers after multires are active - * if not it can use the multires struct */ - for (nmd= md->next; nmd; nmd= nmd->next) - if(nmd->mode & eModifierMode_Realtime) - break; - - if(!nmd && mmd->sculptlvl > 0) - return mmd; - } - } - - return NULL; -} - -void sculpt_key_to_mesh(KeyBlock *kb, Object *ob) -{ - Mesh *me= ob->data; - - key_to_mesh(kb, me); - mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); -} - -void sculpt_mesh_to_key(Object *ob, KeyBlock *kb) -{ - Mesh *me= ob->data; - - mesh_to_key(me, kb); -} - void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap) { - DerivedMesh *dm = mesh_get_derived_final(scene, ob, 0); + DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); SculptSession *ss = ob->sculpt; - + MultiresModifierData *mmd= sculpt_multires_active(scene, ob); + ss->ob= ob; - if((ob->shapeflag & OB_SHAPE_LOCK) && !sculpt_multires_active(ob)) { - ss->kb= ob_get_keyblock(ob); - ss->refkb= ob_get_reference_keyblock(ob); - } - else { - ss->kb= NULL; - ss->refkb= NULL; - } + ss->modifiers_active= sculpt_modifiers_active(scene, ob); - /* need to make PBVH with shape key coordinates */ - if(ss->kb) sculpt_key_to_mesh(ss->kb, ss->ob); + if((ob->shapeflag & OB_SHAPE_LOCK) && !mmd) ss->kb= ob_get_keyblock(ob); + else ss->kb= NULL; - if((ss->multires = sculpt_multires_active(ob))) { + if(mmd) { + ss->multires = mmd; ss->totvert = dm->getNumVerts(dm); ss->totface = dm->getNumTessFaces(dm); ss->mvert= NULL; @@ -1577,10 +2669,22 @@ void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap) ss->mvert = me->mvert; ss->mface = me->mface; ss->face_normals = NULL; + ss->multires = NULL; } - ss->tree = dm->getPBVH(ob, dm); + ss->pbvh = dm->getPBVH(ob, dm); ss->fmap = (need_fmap && dm->getFaceMap)? dm->getFaceMap(ob, dm): NULL; + + /* if pbvh is deformed, key block is already applied to it */ + if (ss->kb && !BLI_pbvh_isDeformed(ss->pbvh)) { + float (*vertCos)[3]= key_to_vertcos(ob, ss->kb); + + if (vertCos) { + /* apply shape keys coordinates to PBVH */ + BLI_pbvh_apply_vertCos(ss->pbvh, vertCos); + MEM_freeN(vertCos); + } + } } static int sculpt_mode_poll(bContext *C) @@ -1603,16 +2707,32 @@ static char *sculpt_tool_name(Sculpt *sd) return "Draw Brush"; break; case SCULPT_TOOL_SMOOTH: return "Smooth Brush"; break; + case SCULPT_TOOL_CREASE: + return "Crease Brush"; break; + case SCULPT_TOOL_BLOB: + return "Blob Brush"; break; case SCULPT_TOOL_PINCH: return "Pinch Brush"; break; case SCULPT_TOOL_INFLATE: return "Inflate Brush"; break; case SCULPT_TOOL_GRAB: return "Grab Brush"; break; + case SCULPT_TOOL_NUDGE: + return "Nudge Brush"; break; + case SCULPT_TOOL_THUMB: + return "Thumb Brush"; break; case SCULPT_TOOL_LAYER: return "Layer Brush"; break; case SCULPT_TOOL_FLATTEN: - return "Flatten Brush"; break; + return "Flatten Brush"; break; + case SCULPT_TOOL_CLAY: + return "Clay Brush"; break; + case SCULPT_TOOL_CLAY_TUBES: + return "Clay Tubes Brush"; break; + case SCULPT_TOOL_FILL: + return "Fill Brush"; break; + case SCULPT_TOOL_SCRAPE: + return "Scrape Brush"; break; default: return "Sculpting"; break; } @@ -1664,7 +2784,7 @@ static void SCULPT_OT_radial_control(wmOperatorType *ot) } /**** Operator for applying a stroke (various attributes including mouse path) - using the current brush. ****/ + using the current brush. ****/ static float unproject_brush_radius(Object *ob, ViewContext *vc, float center[3], float offset) { @@ -1690,13 +2810,60 @@ static void sculpt_cache_free(StrokeCache *cache) MEM_freeN(cache); } +int sculpt_get_brush_size(Brush *brush) +{ + return (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_SIZE) ? U.sculpt_paint_unified_size : brush->size; +} + +void sculpt_set_brush_size(Brush *brush, int size) +{ + if (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_SIZE) + U.sculpt_paint_unified_size = size; + else + brush->size = size; +} + +int sculpt_get_lock_brush_size(Brush *brush) +{ + return (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_SIZE) ? (U.sculpt_paint_settings & SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE) : (brush->flag & BRUSH_LOCK_SIZE); +} + +float sculpt_get_brush_unprojected_radius(Brush *brush) +{ + return (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_SIZE) ? U.sculpt_paint_unified_unprojected_radius : brush->unprojected_radius; +} + +void sculpt_set_brush_unprojected_radius(Brush *brush, float unprojected_radius) +{ + if (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_SIZE) + U.sculpt_paint_unified_unprojected_radius = unprojected_radius; + else + brush->unprojected_radius = unprojected_radius; +} + +float sculpt_get_brush_alpha(Brush *brush) +{ + return (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_ALPHA) ? U.sculpt_paint_unified_alpha : brush->alpha; +} + +void sculpt_set_brush_alpha(Brush *brush, float alpha) +{ + if (U.sculpt_paint_settings & SCULPT_PAINT_USE_UNIFIED_ALPHA) + U.sculpt_paint_unified_alpha = alpha; + else + brush->alpha = alpha; +} + /* Initialize the stroke cache invariants from operator properties */ -static void sculpt_update_cache_invariants(Sculpt *sd, SculptSession *ss, bContext *C, wmOperator *op) +static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSession *ss, wmOperator *op, wmEvent *event) { StrokeCache *cache = MEM_callocN(sizeof(StrokeCache), "stroke cache"); Brush *brush = paint_brush(&sd->paint); ViewContext *vc = paint_stroke_view_context(op->customdata); + Object *ob= CTX_data_active_object(C); + ModifierData *md; int i; + int mode; ss->cache = cache; @@ -1705,10 +2872,62 @@ static void sculpt_update_cache_invariants(Sculpt *sd, SculptSession *ss, bConte cache->prect.ymin = FLT_MAX; cache->prect.ymax = -FLT_MAX; - RNA_float_get_array(op->ptr, "scale", cache->scale); - cache->flag = RNA_int_get(op->ptr, "flag"); - RNA_float_get_array(op->ptr, "clip_tolerance", cache->clip_tolerance); - RNA_float_get_array(op->ptr, "initial_mouse", cache->initial_mouse); + /* Set scaling adjustment */ + ss->cache->scale[0] = 1.0f / ob->size[0]; + ss->cache->scale[1] = 1.0f / ob->size[1]; + ss->cache->scale[2] = 1.0f / ob->size[2]; + + ss->cache->plane_trim_squared = brush->plane_trim * brush->plane_trim; + + /* Initialize mirror modifier clipping */ + + ss->cache->flag = 0; + + for(md= ob->modifiers.first; md; md= md->next) { + if(md->type==eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) { + const MirrorModifierData *mmd = (MirrorModifierData*) md; + + /* Mark each axis that needs clipping along with its tolerance */ + if(mmd->flag & MOD_MIR_CLIPPING) { + ss->cache->flag |= CLIP_X << mmd->axis; + if(mmd->tolerance > ss->cache->clip_tolerance[mmd->axis]) + ss->cache->clip_tolerance[mmd->axis] = mmd->tolerance; + } + } + } + + /* Initial mouse location */ + if (event) { + ss->cache->initial_mouse[0] = event->x; + ss->cache->initial_mouse[1] = event->y; + } + else { + ss->cache->initial_mouse[0] = 0; + ss->cache->initial_mouse[1] = 0; + } + + mode = RNA_int_get(op->ptr, "mode"); + cache->invert = mode == WM_BRUSHSTROKE_INVERT; + cache->alt_smooth = mode == WM_BRUSHSTROKE_SMOOTH; + + /* Alt-Smooth */ + if (ss->cache->alt_smooth) { + Paint *p= &sd->paint; + Brush *br; + int i; + + BLI_strncpy(cache->saved_active_brush_name, brush->id.name+2, sizeof(cache->saved_active_brush_name)); + + for(i = 0; i < p->brush_count; ++i) { + br = p->brushes[i]; + + if (strcmp(br->id.name+2, "Smooth")==0) { + paint_brush_set(p, br); + brush = br; + break; + } + } + } copy_v2_v2(cache->mouse, cache->initial_mouse); copy_v2_v2(cache->tex_mouse, cache->initial_mouse); @@ -1716,22 +2935,21 @@ static void sculpt_update_cache_invariants(Sculpt *sd, SculptSession *ss, bConte /* Truly temporary data that isn't stored in properties */ cache->vc = vc; + cache->brush = brush; cache->mats = MEM_callocN(sizeof(bglMats), "sculpt bglMats"); view3d_get_transformation(vc->ar, vc->rv3d, vc->obact, cache->mats); + viewvector(cache->vc->rv3d, cache->vc->rv3d->twmat[3], cache->true_view_normal); /* Initialize layer brush displacements and persistent coords */ - if(brush->sculpt_tool == SCULPT_TOOL_LAYER && !ss->multires) { - if(!ss->layer_disps || !(brush->flag & BRUSH_PERSISTENT)) { - if(ss->layer_disps) - MEM_freeN(ss->layer_disps); - ss->layer_disps = MEM_callocN(sizeof(float) * ss->totvert, "layer brush displacements"); - } - if(!ss->layer_co && (brush->flag & BRUSH_PERSISTENT)) { + if(brush->sculpt_tool == SCULPT_TOOL_LAYER) { + /* not supported yet for multires */ + if(!ss->multires && !ss->layer_co && (brush->flag & BRUSH_PERSISTENT)) { if(!ss->layer_co) ss->layer_co= MEM_mallocN(sizeof(float) * 3 * ss->totvert, - "sculpt mesh vertices copy"); + "sculpt mesh vertices copy"); + for(i = 0; i < ss->totvert; ++i) copy_v3_v3(ss->layer_co[i], ss->mvert[i].co); } @@ -1749,93 +2967,282 @@ static void sculpt_update_cache_invariants(Sculpt *sd, SculptSession *ss, bConte cache->original = 1; } - if(ELEM3(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE)) + if(ELEM7(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_CLAY_TUBES)) if(!(brush->flag & BRUSH_ACCUMULATE)) cache->original = 1; - cache->rotation = 0; - cache->first_time = 1; + cache->special_rotation = (brush->flag & BRUSH_RAKE) ? sd->last_angle : 0; + //cache->last_rake[0] = sd->last_x; + //cache->last_rake[1] = sd->last_y; + + cache->first_time= 1; + + cache->vertex_rotation= 0; } /* Initialize the stroke cache variants from operator properties */ -static void sculpt_update_cache_variants(Sculpt *sd, SculptSession *ss, struct PaintStroke *stroke, PointerRNA *ptr) +static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession *ss, struct PaintStroke *stroke, PointerRNA *ptr) { StrokeCache *cache = ss->cache; Brush *brush = paint_brush(&sd->paint); - + int dx, dy; - if(!(brush->flag & BRUSH_ANCHORED) || cache->first_time) + //RNA_float_get_array(ptr, "location", cache->traced_location); + + if (cache->first_time || + !((brush->flag & BRUSH_ANCHORED)|| + (brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK)|| + (brush->sculpt_tool == SCULPT_TOOL_ROTATE)) + ) + { RNA_float_get_array(ptr, "location", cache->true_location); - cache->flip = RNA_boolean_get(ptr, "flip"); + } + + cache->pen_flip = RNA_boolean_get(ptr, "pen_flip"); RNA_float_get_array(ptr, "mouse", cache->mouse); + cache->pressure = RNA_float_get(ptr, "pressure"); - + /* Truly temporary data that isn't stored in properties */ + sd->draw_pressure= 1; + sd->pressure_value= cache->pressure; + cache->previous_pixel_radius = cache->pixel_radius; - cache->pixel_radius = brush->size; + cache->pixel_radius = sculpt_get_brush_size(brush); - if(cache->first_time) - cache->initial_radius = unproject_brush_radius(ss->ob, cache->vc, cache->true_location, brush->size); + if(cache->first_time) { + if (!sculpt_get_lock_brush_size(brush)) { + cache->initial_radius= unproject_brush_radius(ss->ob, cache->vc, cache->true_location, sculpt_get_brush_size(brush)); + sculpt_set_brush_unprojected_radius(brush, cache->initial_radius); + } + else { + cache->initial_radius= sculpt_get_brush_unprojected_radius(brush); + } - if(brush->flag & BRUSH_SIZE_PRESSURE && brush->sculpt_tool != SCULPT_TOOL_GRAB) { + if (ELEM(brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK)) + cache->initial_radius *= 2.0f; + } + + if(brush->flag & BRUSH_SIZE_PRESSURE) { cache->pixel_radius *= cache->pressure; - cache->radius = cache->initial_radius * cache->pressure; + cache->radius= cache->initial_radius * cache->pressure; } else - cache->radius = cache->initial_radius; + cache->radius= cache->initial_radius; - if(!(brush->flag & BRUSH_ANCHORED)) + cache->radius_squared = cache->radius*cache->radius; + + if(!(brush->flag & BRUSH_ANCHORED || ELEM4(brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE))) { copy_v2_v2(cache->tex_mouse, cache->mouse); + if ( (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) && + (brush->flag & BRUSH_RANDOM_ROTATION) && + !(brush->flag & BRUSH_RAKE)) + { + cache->special_rotation = 2*M_PI*BLI_frand(); + } + } + if(brush->flag & BRUSH_ANCHORED) { + int hit = 0; + dx = cache->mouse[0] - cache->initial_mouse[0]; dy = cache->mouse[1] - cache->initial_mouse[1]; - cache->pixel_radius = sqrt(dx*dx + dy*dy); - cache->radius = unproject_brush_radius(ss->ob, paint_stroke_view_context(stroke), - cache->true_location, cache->pixel_radius); - cache->rotation = atan2(dy, dx); + + sd->anchored_size = cache->pixel_radius = sqrt(dx*dx + dy*dy); + + cache->special_rotation = atan2(dx, dy) + M_PI; + + if (brush->flag & BRUSH_EDGE_TO_EDGE) { + float d[3]; + float halfway[3]; + float out[3]; + + d[0] = dx; + d[1] = dy; + d[2] = 0; + + mul_v3_v3fl(halfway, d, 0.5f); + add_v3_v3(halfway, cache->initial_mouse); + + if (sculpt_stroke_get_location(C, stroke, out, halfway)) { + copy_v3_v3(sd->anchored_location, out); + copy_v3_v3(sd->anchored_initial_mouse, halfway); + copy_v2_v2(cache->tex_mouse, halfway); + copy_v3_v3(cache->true_location, sd->anchored_location); + sd->anchored_size /= 2.0f; + cache->pixel_radius /= 2.0f; + hit = 1; + } + } + + if (!hit) + copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse); + + cache->radius= unproject_brush_radius(ss->ob, paint_stroke_view_context(stroke), cache->true_location, cache->pixel_radius); + cache->radius_squared = cache->radius*cache->radius; + + copy_v3_v3(sd->anchored_location, cache->true_location); + + sd->draw_anchored = 1; } else if(brush->flag & BRUSH_RAKE) { - int update; + const float u = 0.5f; + const float v = 1 - u; + const float r = 20; - dx = cache->last_rake[0] - cache->mouse[0]; - dy = cache->last_rake[1] - cache->mouse[1]; + const float dx = cache->last_rake[0] - cache->mouse[0]; + const float dy = cache->last_rake[1] - cache->mouse[1]; - update = dx*dx + dy*dy > 100; + if (cache->first_time) { + copy_v3_v3(cache->last_rake, cache->mouse); + } + else if (dx*dx + dy*dy >= r*r) { + cache->special_rotation = atan2(dx, dy); - /* To prevent jitter, only update the angle if the mouse has moved over 10 pixels */ - if(update && !cache->first_time) - cache->rotation = M_PI_2 + atan2(dy, dx); - - if(update || cache->first_time) { - cache->last_rake[0] = cache->mouse[0]; - cache->last_rake[1] = cache->mouse[1]; + cache->last_rake[0] = u*cache->last_rake[0] + v*cache->mouse[0]; + cache->last_rake[1] = u*cache->last_rake[1] + v*cache->mouse[1]; } } /* Find the grab delta */ if(brush->sculpt_tool == SCULPT_TOOL_GRAB) { - float grab_location[3]; + float grab_location[3], imat[4][4]; if(cache->first_time) copy_v3_v3(cache->orig_grab_location, cache->true_location); - initgrabz(cache->vc->rv3d, cache->orig_grab_location[0], cache->orig_grab_location[1], cache->orig_grab_location[2]); + /* compute 3d coordinate at same z from original location + mouse */ + initgrabz(cache->vc->rv3d, cache->orig_grab_location[0], + cache->orig_grab_location[1], cache->orig_grab_location[2]); window_to_3d_delta(cache->vc->ar, grab_location, cache->mouse[0], cache->mouse[1]); - if(!cache->first_time) + /* compute delta to move verts by */ + if(!cache->first_time) { + float delta[3]; + sub_v3_v3v3(delta, grab_location, cache->old_grab_location); + invert_m4_m4(imat, ss->ob->obmat); + mul_mat3_m4_v3(imat, delta); + add_v3_v3(cache->grab_delta, delta); + } + else { + zero_v3(cache->grab_delta); + } + + copy_v3_v3(cache->old_grab_location, grab_location); + + /* location stays the same for finding vertices in brush radius */ + copy_v3_v3(cache->true_location, cache->orig_grab_location); + + sd->draw_anchored = 1; + copy_v3_v3(sd->anchored_location, cache->true_location); + copy_v3_v3(sd->anchored_initial_mouse, cache->initial_mouse); + sd->anchored_size = cache->pixel_radius; + } + /* Find the nudge/clay tubes delta */ + else if(brush->sculpt_tool == SCULPT_TOOL_NUDGE || brush->sculpt_tool == SCULPT_TOOL_CLAY_TUBES) { + float grab_location[3], imat[4][4]; + + if(cache->first_time) + copy_v3_v3(cache->orig_grab_location, cache->true_location); + + /* compute 3d coordinate at same z from original location + mouse */ + initgrabz(cache->vc->rv3d, cache->orig_grab_location[0], + cache->orig_grab_location[1], cache->orig_grab_location[2]); + window_to_3d_delta(cache->vc->ar, grab_location, cache->mouse[0], cache->mouse[1]); + + /* compute delta to move verts by */ + if (!cache->first_time) { sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); + invert_m4_m4(imat, ss->ob->obmat); + mul_mat3_m4_v3(imat, cache->grab_delta); + } + else { + zero_v3(cache->grab_delta); + } + copy_v3_v3(cache->old_grab_location, grab_location); } + /* Find the snake hook delta */ + else if(brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK) { + float grab_location[3], imat[4][4]; + + if(cache->first_time) + copy_v3_v3(cache->orig_grab_location, cache->true_location); + else + add_v3_v3(cache->true_location, cache->grab_delta); + + /* compute 3d coordinate at same z from original location + mouse */ + initgrabz(cache->vc->rv3d, cache->orig_grab_location[0], + cache->orig_grab_location[1], cache->orig_grab_location[2]); + window_to_3d_delta(cache->vc->ar, grab_location, cache->mouse[0], cache->mouse[1]); + + /* compute delta to move verts by */ + if (!cache->first_time) { + sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location); + invert_m4_m4(imat, ss->ob->obmat); + mul_mat3_m4_v3(imat, cache->grab_delta); + } + else { + zero_v3(cache->grab_delta); + } + + copy_v3_v3(cache->old_grab_location, grab_location); + } + /* Find the thumb delta */ + else if(brush->sculpt_tool == SCULPT_TOOL_THUMB) { + float grab_location[3], imat[4][4]; + + if(cache->first_time) + copy_v3_v3(cache->orig_grab_location, cache->true_location); + + /* compute 3d coordinate at same z from original location + mouse */ + initgrabz(cache->vc->rv3d, cache->orig_grab_location[0], + cache->orig_grab_location[1], cache->orig_grab_location[2]); + window_to_3d_delta(cache->vc->ar, grab_location, cache->mouse[0], cache->mouse[1]); + + /* compute delta to move verts by */ + if (!cache->first_time) { + float delta[3]; + sub_v3_v3v3(delta, grab_location, cache->old_grab_location); + invert_m4_m4(imat, ss->ob->obmat); + mul_mat3_m4_v3(imat, delta); + add_v3_v3(cache->grab_delta, delta); + } + else { + zero_v3(cache->grab_delta); + } + + copy_v3_v3(cache->old_grab_location, grab_location); + + /* location stays the same for finding vertices in brush radius */ + copy_v3_v3(cache->true_location, cache->orig_grab_location); + + sd->draw_anchored = 1; + copy_v3_v3(sd->anchored_location, cache->orig_grab_location); + copy_v3_v3(sd->anchored_initial_mouse, cache->initial_mouse); + sd->anchored_size = cache->pixel_radius; + } + else if(brush->sculpt_tool == SCULPT_TOOL_ROTATE) { + dx = cache->mouse[0] - cache->initial_mouse[0]; + dy = cache->mouse[1] - cache->initial_mouse[1]; + + cache->vertex_rotation = -atan2(dx, dy) / 4.0f; + + sd->draw_anchored = 1; + copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse); + copy_v3_v3(sd->anchored_location, cache->true_location); + sd->anchored_size = cache->pixel_radius; + } + + sd->special_rotation = cache->special_rotation; } static void sculpt_stroke_modifiers_check(bContext *C, SculptSession *ss) { - Scene *scene= CTX_data_scene(C); - - if(sculpt_modifiers_active(scene, ss->ob)) { + if(ss->modifiers_active) { Sculpt *sd = CTX_data_tool_settings(C)->sculpt; Brush *brush = paint_brush(&sd->paint); @@ -1851,19 +3258,23 @@ typedef struct { int original; } SculptRaycastData; -void sculpt_raycast_cb(PBVHNode *node, void *data_v) +void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin) { - SculptRaycastData *srd = data_v; - float (*origco)[3]= NULL; + if (BLI_pbvh_node_get_tmin(node) < *tmin) { + SculptRaycastData *srd = data_v; + float (*origco)[3]= NULL; - if(srd->original && srd->ss->cache) { - /* intersect with coordinates from before we started stroke */ - SculptUndoNode *unode= sculpt_undo_get_node(srd->ss, node); - origco= (unode)? unode->co: NULL; + if(srd->original && srd->ss->cache) { + /* intersect with coordinates from before we started stroke */ + SculptUndoNode *unode= sculpt_undo_get_node(node); + origco= (unode)? unode->co: NULL; + } + + if (BLI_pbvh_node_raycast(srd->ss->pbvh, node, origco, srd->ray_start, srd->ray_normal, &srd->dist)) { + srd->hit = 1; + *tmin = srd->dist; + } } - - srd->hit |= BLI_pbvh_node_raycast(srd->ss->tree, node, origco, - srd->ray_start, srd->ray_normal, &srd->dist); } /* Do a raycast in the tree to find the 3d brush location @@ -1877,20 +3288,22 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou StrokeCache *cache= ss->cache; float ray_start[3], ray_end[3], ray_normal[3], dist; float obimat[4][4]; - float mval[2] = {mouse[0] - vc->ar->winrct.xmin, - mouse[1] - vc->ar->winrct.ymin}; + float mval[2]; SculptRaycastData srd; + mval[0] = mouse[0] - vc->ar->winrct.xmin; + mval[1] = mouse[1] - vc->ar->winrct.ymin; + sculpt_stroke_modifiers_check(C, ss); viewline(vc->ar, vc->v3d, mval, ray_start, ray_end); - sub_v3_v3v3(ray_normal, ray_end, ray_start); - dist= normalize_v3(ray_normal); invert_m4_m4(obimat, ss->ob->obmat); mul_m4_v3(obimat, ray_start); - mul_mat3_m4_v3(obimat, ray_normal); - normalize_v3(ray_normal); + mul_m4_v3(obimat, ray_end); + + sub_v3_v3v3(ray_normal, ray_end, ray_start); + dist= normalize_v3(ray_normal); srd.ss = vc->obact->sculpt; srd.ray_start = ray_start; @@ -1898,53 +3311,16 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou srd.dist = dist; srd.hit = 0; srd.original = (cache)? cache->original: 0; - BLI_pbvh_raycast(ss->tree, sculpt_raycast_cb, &srd, - ray_start, ray_normal, srd.original); + BLI_pbvh_raycast(ss->pbvh, sculpt_raycast_cb, &srd, + ray_start, ray_normal, srd.original); copy_v3_v3(out, ray_normal); mul_v3_fl(out, srd.dist); - add_v3_v3v3(out, out, ray_start); + add_v3_v3(out, ray_start); return srd.hit; } -/* Initialize stroke operator properties */ -static void sculpt_brush_stroke_init_properties(bContext *C, wmOperator *op, wmEvent *event, SculptSession *ss) -{ - Object *ob= CTX_data_active_object(C); - ModifierData *md; - float scale[3], clip_tolerance[3] = {0,0,0}; - float mouse[2]; - int flag = 0; - - /* Set scaling adjustment */ - scale[0] = 1.0f / ob->size[0]; - scale[1] = 1.0f / ob->size[1]; - scale[2] = 1.0f / ob->size[2]; - RNA_float_set_array(op->ptr, "scale", scale); - - /* Initialize mirror modifier clipping */ - for(md= ob->modifiers.first; md; md= md->next) { - if(md->type==eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) { - const MirrorModifierData *mmd = (MirrorModifierData*) md; - - /* Mark each axis that needs clipping along with its tolerance */ - if(mmd->flag & MOD_MIR_CLIPPING) { - flag |= CLIP_X << mmd->axis; - if(mmd->tolerance > clip_tolerance[mmd->axis]) - clip_tolerance[mmd->axis] = mmd->tolerance; - } - } - } - RNA_int_set(op->ptr, "flag", flag); - RNA_float_set_array(op->ptr, "clip_tolerance", clip_tolerance); - - /* Initial mouse location */ - mouse[0] = event->x; - mouse[1] = event->y; - RNA_float_set_array(op->ptr, "initial_mouse", mouse); -} - static int sculpt_brush_stroke_init(bContext *C, ReportList *reports) { Scene *scene= CTX_data_scene(C); @@ -1972,31 +3348,39 @@ static int sculpt_brush_stroke_init(bContext *C, ReportList *reports) static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss) { - StrokeCache *cache = ss->cache; Brush *brush = paint_brush(&sd->paint); - int i; /* Restore the mesh before continuing with anchored stroke */ - if(brush->flag & BRUSH_ANCHORED) { + if((brush->flag & BRUSH_ANCHORED) || + (brush->sculpt_tool == SCULPT_TOOL_GRAB && (brush->flag & BRUSH_SIZE_PRESSURE)) || + (brush->flag & BRUSH_RESTORE_MESH)) + { + StrokeCache *cache = ss->cache; + int i; + PBVHNode **nodes; int n, totnode; - BLI_pbvh_search_gather(ss->tree, NULL, NULL, &nodes, &totnode); + BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode); - #pragma omp parallel for private(n) schedule(static) + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) for(n=0; ntree, nodes[n], vd, PBVH_ITER_UNIQUE) { + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { copy_v3_v3(vd.co, unode->co[vd.i]); if(vd.no) VECCOPY(vd.no, unode->no[vd.i]) else normal_short_to_float_v3(vd.fno, unode->no[vd.i]); + + if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE; } BLI_pbvh_vertex_iter_end; + + BLI_pbvh_node_mark_update(nodes[n]); } } @@ -2006,47 +3390,46 @@ static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss) copy_v3_v3(fn, cache->face_norms[i]); } - if(brush->sculpt_tool == SCULPT_TOOL_LAYER && !ss->multires) - memset(ss->layer_disps, 0, sizeof(float) * ss->totvert); + if(nodes) + MEM_freeN(nodes); } } static void sculpt_flush_update(bContext *C) { - Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; ARegion *ar = CTX_wm_region(C); MultiresModifierData *mmd = ss->multires; - int redraw = 0; if(mmd) multires_mark_as_modified(ob); - if(sculpt_modifiers_active(scene, ob)) { + if(ss->modifiers_active) { DAG_id_flush_update(&ob->id, OB_RECALC_DATA); ED_region_tag_redraw(ar); } else { rcti r; int off = 0; -#if 0 /*debug code to expand the partial redraw rect by 400 every other frame*/ - static int c = 0; - c++; - if (c % 2 == 0) - off = 400; - else off = 0; -#endif - BLI_pbvh_update(ss->tree, PBVH_UpdateBB, NULL); - redraw = sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r); + BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB, NULL); + + if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) { + //rcti tmp; - if(redraw) { r.xmin += ar->winrct.xmin + 1 + off; r.xmax += ar->winrct.xmin - 1 - off; r.ymin += ar->winrct.ymin + 1 + off; r.ymax += ar->winrct.ymin - 1 - off; - + + //tmp = r; + + //if (!BLI_rcti_is_empty(&ss->previous_r)) + // BLI_union_rcti(&r, &ss->previous_r); + + //ss->previous_r= tmp; + ss->partial_redraw = 1; ED_region_tag_redraw_partial(ar, &r); } @@ -2057,13 +3440,16 @@ static void sculpt_flush_update(bContext *C) or over the background (0) */ static int over_mesh(bContext *C, struct wmOperator *op, float x, float y) { - float mouse[2] = {x, y}, co[3]; - - return (int)sculpt_stroke_get_location(C, op->customdata, co, mouse); + float mouse[2], co[3]; + + mouse[0] = x; + mouse[1] = y; + + return sculpt_stroke_get_location(C, op->customdata, co, mouse); } static int sculpt_stroke_test_start(bContext *C, struct wmOperator *op, - wmEvent *event) + wmEvent *event) { /* Don't start the stroke until mouse goes over the mesh */ if(over_mesh(C, op, event->x, event->y)) { @@ -2073,11 +3459,22 @@ static int sculpt_stroke_test_start(bContext *C, struct wmOperator *op, ED_view3d_init_mats_rv3d(ob, CTX_wm_region_view3d(C)); - sculpt_brush_stroke_init_properties(C, op, event, ss); + sculpt_update_cache_invariants(C, sd, ss, op, event); - sculpt_update_cache_invariants(sd, ss, C, op); + sculpt_undo_push_begin(sculpt_tool_name(sd)); - sculpt_undo_push_begin(ss, sculpt_tool_name(sd)); +#ifdef _OPENMP + /* If using OpenMP then create a number of threads two times the + number of processor cores. + Justification: Empirically I've found that two threads per + processor gives higher throughput. */ + if (sd->flags & SCULPT_USE_OPENMP) { + int num_procs; + + num_procs = omp_get_num_procs(); + omp_set_num_threads(2*num_procs); + } +#endif return 1; } @@ -2091,7 +3488,7 @@ static void sculpt_stroke_update_step(bContext *C, struct PaintStroke *stroke, P SculptSession *ss = CTX_data_active_object(C)->sculpt; sculpt_stroke_modifiers_check(C, ss); - sculpt_update_cache_variants(sd, ss, stroke, itemptr); + sculpt_update_cache_variants(C, sd, ss, stroke, itemptr); sculpt_restore_mesh(sd, ss); do_symmetrical_brush_actions(sd, ss); @@ -2099,26 +3496,53 @@ static void sculpt_stroke_update_step(bContext *C, struct PaintStroke *stroke, P sculpt_flush_update(C); } -static void sculpt_stroke_done(bContext *C, struct PaintStroke *stroke) +static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused) { Object *ob= CTX_data_active_object(C); SculptSession *ss = ob->sculpt; + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + + (void)unused; + + // reset values used to draw brush after completing the stroke + sd->draw_anchored= 0; + sd->draw_pressure= 0; + sd->special_rotation= 0; /* Finished */ if(ss->cache) { sculpt_stroke_modifiers_check(C, ss); + /* Alt-Smooth */ + if (ss->cache->alt_smooth) { + Paint *p= &sd->paint; + Brush *br; + int i; + + for(i = 0; i < p->brush_count; ++i) { + br = p->brushes[i]; + + if (strcmp(br->id.name+2, ss->cache->saved_active_brush_name)==0) { + paint_brush_set(p, br); + break; + } + } + } + sculpt_cache_free(ss->cache); ss->cache = NULL; - sculpt_undo_push_end(ss); + sculpt_undo_push_end(); - BLI_pbvh_update(ss->tree, PBVH_UpdateOriginalBB, NULL); + BLI_pbvh_update(ss->pbvh, PBVH_UpdateOriginalBB, NULL); - if(ss->refkb) sculpt_key_to_mesh(ss->refkb, ob); + /* optimization: if there is locked key and active modifiers present in */ + /* the stack, keyblock is updating at each step. otherwise we could update */ + /* keyblock only when stroke is finished */ + if(ss->kb && !ss->modifiers_active) sculpt_update_keyblock(ss); ss->partial_redraw = 0; - + /* try to avoid calling this, only for e.g. linked duplicates now */ if(((Mesh*)ob->data)->id.us > 1) DAG_id_flush_update(&ob->id, OB_RECALC_DATA); @@ -2145,6 +3569,7 @@ static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *even /* For tablet rotation */ ignore_background_click = RNA_boolean_get(op->ptr, "ignore_background_click"); + if(ignore_background_click && !over_mesh(C, op, event->x, event->y)) { paint_stroke_free(stroke); return OPERATOR_PASS_THROUGH; @@ -2169,7 +3594,7 @@ static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op) op->customdata = paint_stroke_new(C, sculpt_stroke_get_location, sculpt_stroke_test_start, sculpt_stroke_update_step, sculpt_stroke_done); - sculpt_update_cache_invariants(sd, ss, C, op); + sculpt_update_cache_invariants(C, sd, ss, op, NULL); paint_stroke_exec(C, op); @@ -2181,7 +3606,12 @@ static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op) static void SCULPT_OT_brush_stroke(wmOperatorType *ot) { - ot->flag |= OPTYPE_REGISTER; + static EnumPropertyItem stroke_mode_items[] = { + { WM_BRUSHSTROKE_NORMAL, "NORMAL", 0, "Normal", "Apply brush normally" }, + { WM_BRUSHSTROKE_INVERT, "INVERT", 0, "Invert", "Invert action of brush for duration of stroke" }, + { WM_BRUSHSTROKE_SMOOTH, "SMOOTH", 0, "Smooth", "Switch brush to smooth mode for duration of stroke" }, + { 0 } + }; /* identifiers */ ot->name= "Sculpt Mode"; @@ -2192,41 +3622,33 @@ static void SCULPT_OT_brush_stroke(wmOperatorType *ot) ot->modal= paint_stroke_modal; ot->exec= sculpt_brush_stroke_exec; ot->poll= sculpt_poll; - + /* flags (sculpt does own undo? (ton) */ - ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING; + ot->flag= OPTYPE_BLOCKING; /* properties */ - RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", ""); - /* If the object has a scaling factor, brushes also need to be scaled - to work as expected. */ - RNA_def_float_vector(ot->srna, "scale", 3, NULL, 0.0f, FLT_MAX, "Scale", "", 0.0f, 1000.0f); + RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, + "Stroke", ""); - RNA_def_int(ot->srna, "flag", 0, 0, INT_MAX, "flag", "", 0, INT_MAX); - - /* For mirror modifiers */ - RNA_def_float_vector(ot->srna, "clip_tolerance", 3, NULL, 0.0f, FLT_MAX, "clip_tolerance", "", 0.0f, 1000.0f); - - /* The initial 2D location of the mouse */ - RNA_def_float_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "initial_mouse", "", INT_MIN, INT_MAX); + RNA_def_enum(ot->srna, "mode", stroke_mode_items, WM_BRUSHSTROKE_NORMAL, + "Sculpt Stroke Mode", + "Action taken when a sculpt stroke is made"); RNA_def_boolean(ot->srna, "ignore_background_click", 0, "Ignore Background Click", - "Clicks on the background don't start the stroke"); + "Clicks on the background do not start the stroke"); } /**** Reset the copy of the mesh that is being sculpted on (currently just for the layer brush) ****/ -static int sculpt_set_persistent_base(bContext *C, wmOperator *op) +static int sculpt_set_persistent_base(bContext *C, wmOperator *unused) { SculptSession *ss = CTX_data_active_object(C)->sculpt; - if(ss) { - if(ss->layer_disps) - MEM_freeN(ss->layer_disps); - ss->layer_disps = NULL; + (void)unused; + if(ss) { if(ss->layer_co) MEM_freeN(ss->layer_co); ss->layer_co = NULL; @@ -2245,7 +3667,7 @@ static void SCULPT_OT_set_persistent_base(wmOperatorType *ot) ot->exec= sculpt_set_persistent_base; ot->poll= sculpt_mode_poll; - ot->flag= OPTYPE_REGISTER; + ot->flag= 0;//OPTYPE_REGISTER; } /**** Toggle operator for turning sculpt mode on or off ****/ @@ -2253,46 +3675,56 @@ static void SCULPT_OT_set_persistent_base(wmOperatorType *ot) static void sculpt_init_session(Scene *scene, Object *ob) { ob->sculpt = MEM_callocN(sizeof(SculptSession), "sculpt session"); + ob->sculpt->ob = ob; sculpt_update_mesh_elements(scene, ob, 0); - - if(ob->sculpt->refkb) - sculpt_key_to_mesh(ob->sculpt->refkb, ob); } -static int sculpt_toggle_mode(bContext *C, wmOperator *op) +static int sculpt_toggle_mode(bContext *C, wmOperator *unused) { Scene *scene = CTX_data_scene(C); ToolSettings *ts = CTX_data_tool_settings(C); Object *ob = CTX_data_active_object(C); - MultiresModifierData *mmd = sculpt_multires_active(ob); + MultiresModifierData *mmd= sculpt_multires_active(scene, ob); + int flush_recalc= 0; + + (void)unused; + + /* multires in sculpt mode could have different from object mode subdivision level */ + flush_recalc |= mmd && mmd->sculptlvl != mmd->lvl; + /* if object has got active modifiers, it's dm could be different in sculpt mode */ + //flush_recalc |= sculpt_modifiers_active(scene, ob); if(ob->mode & OB_MODE_SCULPT) { - if(sculpt_multires_active(ob)) + if(mmd) multires_force_update(ob); - if(mmd && mmd->sculptlvl != mmd->lvl) + if(flush_recalc) DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* Leave sculptmode */ ob->mode &= ~OB_MODE_SCULPT; - free_sculptsession(&ob->sculpt); + free_sculptsession(ob); } else { /* Enter sculptmode */ ob->mode |= OB_MODE_SCULPT; - if(mmd && mmd->sculptlvl != mmd->lvl) + if(flush_recalc) DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* Create persistent sculpt mode data */ - if(!ts->sculpt) + if(!ts->sculpt) { ts->sculpt = MEM_callocN(sizeof(Sculpt), "sculpt mode data"); + /* Turn on X plane mirror symmetry by default */ + ts->sculpt->flags |= SCULPT_SYMM_X; + } + /* Create sculpt mode session data */ if(ob->sculpt) - free_sculptsession(&ob->sculpt); + free_sculptsession(ob); sculpt_init_session(scene, ob); @@ -2316,7 +3748,7 @@ static void SCULPT_OT_sculptmode_toggle(wmOperatorType *ot) ot->exec= sculpt_toggle_mode; ot->poll= ED_operator_object_active; - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= 0; } void ED_operatortypes_sculpt() diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h index d3553c008b2..a46823a0b28 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.h +++ b/source/blender/editors/sculpt_paint/sculpt_intern.h @@ -32,6 +32,9 @@ #include "DNA_listBase.h" #include "DNA_vec_types.h" +#include "DNA_key_types.h" + +#include "BLI_pbvh.h" struct bContext; struct Brush; @@ -49,7 +52,7 @@ void sculptmode_draw_mesh(int); void sculpt_paint_brush(char clear); void sculpt_stroke_draw(struct SculptStroke *); void sculpt_radialcontrol_start(int mode); -struct MultiresModifierData *sculpt_multires_active(struct Object *ob); +struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob); struct Brush *sculptmode_brush(void); //void do_symmetrical_brush_actions(struct Sculpt *sd, struct wmOperator *wm, struct BrushAction *a, short *, short *); @@ -58,8 +61,6 @@ void sculpt(Sculpt *sd); int sculpt_poll(struct bContext *C); void sculpt_update_mesh_elements(struct Scene *scene, struct Object *ob, int need_fmap); -void sculpt_key_to_mesh(struct KeyBlock *kb, struct Object *ob); -void sculpt_mesh_to_key(struct Object *ob, struct KeyBlock *kb); /* Stroke */ struct SculptStroke *sculpt_stroke_new(const int max); @@ -67,8 +68,49 @@ void sculpt_stroke_free(struct SculptStroke *); void sculpt_stroke_add_point(struct SculptStroke *, const short x, const short y); void sculpt_stroke_apply(struct Sculpt *sd, struct SculptStroke *); void sculpt_stroke_apply_all(struct Sculpt *sd, struct SculptStroke *); +int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float out[3], float mouse[2]); /* Partial Mesh Visibility */ void sculptmode_pmv(int mode); +/* Undo */ + +typedef struct SculptUndoNode { + struct SculptUndoNode *next, *prev; + + char idname[MAX_ID_NAME]; /* name instead of pointer*/ + void *node; /* only during push, not valid afterwards! */ + + float (*co)[3]; + short (*no)[3]; + int totvert; + + /* non-multires */ + int maxvert; /* to verify if totvert it still the same */ + int *index; /* to restore into right location */ + + /* multires */ + int maxgrid; /* same for grid */ + int gridsize; /* same for grid */ + int totgrid; /* to restore into right location */ + int *grids; /* to restore into right location */ + + /* layer brush */ + float *layer_disp; + + /* shape keys */ + char *shapeName[32]; /* keep size in sync with keyblock dna */ +} SculptUndoNode; + +SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node); +SculptUndoNode *sculpt_undo_get_node(PBVHNode *node); +void sculpt_undo_push_begin(char *name); +void sculpt_undo_push_end(void); + +struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob); +int sculpt_modifiers_active(Scene *scene, Object *ob); +void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3]); + +void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos); + #endif diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c new file mode 100644 index 00000000000..e4121c9c76a --- /dev/null +++ b/source/blender/editors/sculpt_paint/sculpt_undo.c @@ -0,0 +1,302 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2006 by Nicholas Bishop + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + * Implements the Sculpt Mode tools + * + */ + +#include "BLI_math.h" +#include "BLI_ghash.h" +#include "BLI_threads.h" + +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_mesh_types.h" +#include "DNA_key_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_context.h" +#include "BKE_depsgraph.h" +#include "BKE_modifier.h" +#include "BKE_multires.h" +#include "BKE_paint.h" +#include "BKE_mesh.h" +#include "BKE_key.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_sculpt.h" +#include "paint_intern.h" +#include "sculpt_intern.h" + +/************************** Undo *************************/ + +static void update_cb(PBVHNode *node, void *unused) +{ + (void)unused; + BLI_pbvh_node_mark_update(node); +} + +static void sculpt_undo_restore(bContext *C, ListBase *lb) +{ + Scene *scene = CTX_data_scene(C); + Object *ob = CTX_data_active_object(C); + DerivedMesh *dm = mesh_get_derived_final(scene, ob, 0); + SculptSession *ss = ob->sculpt; + SculptUndoNode *unode; + MVert *mvert; + MultiresModifierData *mmd; + int *index; + int i, j, update= 0; + + sculpt_update_mesh_elements(scene, ob, 0); + + for(unode=lb->first; unode; unode=unode->next) { + if(!(strcmp(unode->idname, ob->id.name)==0)) + continue; + + if(unode->maxvert) { + char *shapeName= (char*)unode->shapeName; + + /* regular mesh restore */ + if(ss->totvert != unode->maxvert) + continue; + + if (ss->kb && strcmp(ss->kb->name, shapeName)) { + /* shape key has been changed before calling undo operator */ + + Key *key= ob_get_key(ob); + KeyBlock *kb= key_get_named_keyblock(key, shapeName); + + if (kb) { + ob->shapenr= BLI_findindex(&key->block, kb) + 1; + ob->shapeflag|= OB_SHAPE_LOCK; + + sculpt_update_mesh_elements(scene, ob, 0); + WM_event_add_notifier(C, NC_OBJECT|ND_DATA, ob); + } else { + /* key has been removed -- skip this undo node */ + continue; + } + } + + index= unode->index; + mvert= ss->mvert; + + if (ss->kb) { + float (*vertCos)[3]; + vertCos= key_to_vertcos(ob, ss->kb); + + for(i=0; itotvert; i++) + swap_v3_v3(vertCos[index[i]], unode->co[i]); + + /* propagate new coords to keyblock */ + sculpt_vertcos_to_key(ob, ss->kb, vertCos); + + /* pbvh uses it's own mvert array, so coords should be */ + /* propagated to pbvh here */ + BLI_pbvh_apply_vertCos(ss->pbvh, vertCos); + + MEM_freeN(vertCos); + } else { + for(i=0; itotvert; i++) { + swap_v3_v3(mvert[index[i]].co, unode->co[i]); + mvert[index[i]].flag |= ME_VERT_PBVH_UPDATE; + } + } + } + else if(unode->maxgrid && dm->getGridData) { + /* multires restore */ + DMGridData **grids, *grid; + float (*co)[3]; + int gridsize; + + if(dm->getNumGrids(dm) != unode->maxgrid) + continue; + if(dm->getGridSize(dm) != unode->gridsize) + continue; + + grids= dm->getGridData(dm); + gridsize= dm->getGridSize(dm); + + co = unode->co; + for(j=0; jtotgrid; j++) { + grid= grids[unode->grids[j]]; + + for(i=0; ipbvh, NULL, NULL, update_cb, NULL); + BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB|PBVH_UpdateOriginalBB|PBVH_UpdateRedraw, NULL); + + if((mmd=sculpt_multires_active(scene, ob))) + multires_mark_as_modified(ob); + + if(ss->modifiers_active || ((Mesh*)ob->data)->id.us > 1) + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + } +} + +static void sculpt_undo_free(ListBase *lb) +{ + SculptUndoNode *unode; + + for(unode=lb->first; unode; unode=unode->next) { + if(unode->co) + MEM_freeN(unode->co); + if(unode->no) + MEM_freeN(unode->no); + if(unode->index) + MEM_freeN(unode->index); + if(unode->grids) + MEM_freeN(unode->grids); + if(unode->layer_disp) + MEM_freeN(unode->layer_disp); + } +} + +SculptUndoNode *sculpt_undo_get_node(PBVHNode *node) +{ + ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH); + SculptUndoNode *unode; + + if(!lb) + return NULL; + + for(unode=lb->first; unode; unode=unode->next) + if(unode->node == node) + return unode; + + return NULL; +} + +SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node) +{ + ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH); + Object *ob= ss->ob; + SculptUndoNode *unode; + int totvert, allvert, totgrid, maxgrid, gridsize, *grids; + + /* list is manipulated by multiple threads, so we lock */ + BLI_lock_thread(LOCK_CUSTOM1); + + if((unode= sculpt_undo_get_node(node))) { + BLI_unlock_thread(LOCK_CUSTOM1); + return unode; + } + + unode= MEM_callocN(sizeof(SculptUndoNode), "SculptUndoNode"); + strcpy(unode->idname, ob->id.name); + unode->node= node; + + BLI_pbvh_node_num_verts(ss->pbvh, node, &totvert, &allvert); + BLI_pbvh_node_get_grids(ss->pbvh, node, &grids, &totgrid, + &maxgrid, &gridsize, NULL, NULL); + + unode->totvert= totvert; + /* we will use this while sculpting, is mapalloc slow to access then? */ + unode->co= MEM_mapallocN(sizeof(float)*3*allvert, "SculptUndoNode.co"); + unode->no= MEM_mapallocN(sizeof(short)*3*allvert, "SculptUndoNode.no"); + undo_paint_push_count_alloc(UNDO_PAINT_MESH, (sizeof(float)*3 + sizeof(short)*3 + sizeof(int))*allvert); + BLI_addtail(lb, unode); + + if(maxgrid) { + /* multires */ + unode->maxgrid= maxgrid; + unode->totgrid= totgrid; + unode->gridsize= gridsize; + unode->grids= MEM_mapallocN(sizeof(int)*totgrid, "SculptUndoNode.grids"); + } + else { + /* regular mesh */ + unode->maxvert= ss->totvert; + unode->index= MEM_mapallocN(sizeof(int)*allvert, "SculptUndoNode.index"); + } + + BLI_unlock_thread(LOCK_CUSTOM1); + + /* copy threaded, hopefully this is the performance critical part */ + { + PBVHVertexIter vd; + + BLI_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL) { + copy_v3_v3(unode->co[vd.i], vd.co); + if(vd.no) VECCOPY(unode->no[vd.i], vd.no) + else normal_float_to_short_v3(unode->no[vd.i], vd.fno); + if(vd.vert_indices) unode->index[vd.i]= vd.vert_indices[vd.i]; + } + BLI_pbvh_vertex_iter_end; + } + + if(unode->grids) + memcpy(unode->grids, grids, sizeof(int)*totgrid); + + /* store active shape key */ + if(ss->kb) BLI_strncpy((char*)unode->shapeName, ss->kb->name, sizeof(ss->kb->name)); + else unode->shapeName[0]= '\0'; + + return unode; +} + +void sculpt_undo_push_begin(char *name) +{ + undo_paint_push_begin(UNDO_PAINT_MESH, name, + sculpt_undo_restore, sculpt_undo_free); +} + +void sculpt_undo_push_end(void) +{ + ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH); + SculptUndoNode *unode; + + /* we don't need normals in the undo stack */ + for(unode=lb->first; unode; unode=unode->next) { + if(unode->no) { + MEM_freeN(unode->no); + unode->no= NULL; + } + + if(unode->layer_disp) { + MEM_freeN(unode->layer_disp); + unode->layer_disp= NULL; + } + } + + undo_paint_push_end(UNDO_PAINT_MESH); +} diff --git a/source/blender/editors/sound/CMakeLists.txt b/source/blender/editors/sound/CMakeLists.txt new file mode 100644 index 00000000000..02765726c6e --- /dev/null +++ b/source/blender/editors/sound/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../../../intern/audaspace/intern + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_sound "${SRC}" "${INC}") diff --git a/source/blender/editors/sound/SConscript b/source/blender/editors/sound/SConscript index 9d2cd2b7cf5..8010dd49c57 100644 --- a/source/blender/editors/sound/SConscript +++ b/source/blender/editors/sound/SConscript @@ -5,7 +5,7 @@ sources = env.Glob('*.c') incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc' -incs += ' ../../makesrna ../../python' +incs += ' ../../makesrna' incs += ' #/intern/audaspace/intern' defs = [] diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 39717273278..678295376ba 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -30,12 +30,13 @@ #include #include +#include "MEM_guardedalloc.h" + #include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" -#include "DNA_sound_types.h" #include "DNA_sequence_types.h" -#include "DNA_windowmanager_types.h" +#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -47,7 +48,6 @@ #include "BLI_blenlib.h" -#include "ED_sound.h" #include "RNA_access.h" #include "RNA_define.h" @@ -64,17 +64,30 @@ /******************** open sound operator ********************/ +static void open_init(bContext *C, wmOperator *op) +{ + PropertyPointerRNA *pprop; + + op->customdata= pprop= MEM_callocN(sizeof(PropertyPointerRNA), "OpenPropertyPointerRNA"); + uiIDContextProperty(C, &pprop->ptr, &pprop->prop); +} + static int open_exec(bContext *C, wmOperator *op) { char path[FILE_MAX]; bSound *sound; + PropertyPointerRNA *pprop; + PointerRNA idptr; AUD_SoundInfo info; - RNA_string_get(op->ptr, "path", path); - + RNA_string_get(op->ptr, "filepath", path); sound = sound_new_file(CTX_data_main(C), path); + if(!op->customdata) + open_init(C, op); + if (sound==NULL || sound->playback_handle == NULL) { + if(op->customdata) MEM_freeN(op->customdata); BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); return OPERATOR_CANCELLED; } @@ -83,6 +96,7 @@ static int open_exec(bContext *C, wmOperator *op) if (info.specs.channels == AUD_CHANNELS_INVALID) { sound_delete(C, sound); + if(op->customdata) MEM_freeN(op->customdata); BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); return OPERATOR_CANCELLED; } @@ -90,12 +104,34 @@ static int open_exec(bContext *C, wmOperator *op) if (RNA_boolean_get(op->ptr, "cache")) { sound_cache(sound, 0); } + + /* hook into UI */ + pprop= op->customdata; + + if(pprop->prop) { + /* when creating new ID blocks, use is already 1, but RNA + * pointer se also increases user, so this compensates it */ + sound->id.us--; + + RNA_id_pointer_create(&sound->id, &idptr); + RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr); + RNA_property_update(C, &pprop->ptr, pprop->prop); + } + if(op->customdata) MEM_freeN(op->customdata); return OPERATOR_FINISHED; } static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) { + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "filepath")) + return open_exec(C, op); + + open_init(C, op); + return WM_operator_filesel(C, op, event); } @@ -114,7 +150,7 @@ void SOUND_OT_open(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH | WM_FILESEL_RELPATH); RNA_def_boolean(ot->srna, "cache", FALSE, "Cache", "Cache the sound in memory."); } @@ -182,23 +218,23 @@ static void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, pup= uiPupMenuBegin(C, "Unpack file", 0); layout= uiPupMenuLayout(pup); - uiItemEnumO(layout, "Remove Pack", 0, opname, "method", PF_REMOVE); + uiItemEnumO(layout, opname, "Remove Pack", 0, "method", PF_REMOVE); if(strcmp(abs_name, local_name)) { switch(checkPackedFile(local_name, pf)) { case PF_NOFILE: sprintf(line, "Create %s", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL); break; case PF_EQUAL: sprintf(line, "Use %s (identical)", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL); break; case PF_DIFFERS: sprintf(line, "Use %s (differs)", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL); sprintf(line, "Overwrite %s", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL); break; } } @@ -206,17 +242,17 @@ static void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, switch(checkPackedFile(abs_name, pf)) { case PF_NOFILE: sprintf(line, "Create %s", abs_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL); break; case PF_EQUAL: sprintf(line, "Use %s (identical)", abs_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL); break; case PF_DIFFERS: sprintf(line, "Use %s (differs)", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL); sprintf(line, "Overwrite %s", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL); + uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL); break; } diff --git a/source/blender/editors/space_action/CMakeLists.txt b/source/blender/editors/space_action/CMakeLists.txt new file mode 100644 index 00000000000..85275b2db23 --- /dev/null +++ b/source/blender/editors/space_action/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + + +BLENDERLIB(bf_editor_space_action "${SRC}" "${INC}") diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 9c394f51d43..7ed07372e96 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -34,10 +34,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" @@ -45,26 +41,8 @@ /* Types --------------------------------------------------------------- */ -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_object_types.h" -#include "DNA_particle_types.h" #include "DNA_screen_types.h" -#include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_meta_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" #include "BKE_action.h" #include "BKE_depsgraph.h" @@ -82,15 +60,11 @@ #include "BIF_glutil.h" #include "UI_interface.h" -#include "UI_interface_icons.h" #include "UI_resources.h" #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_keyframing.h" #include "ED_keyframes_draw.h" -#include "ED_screen.h" -#include "ED_space_api.h" /* ************************************************************************* */ diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index ba8e49e3789..0e2a7f690c5 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -32,31 +32,14 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -77,10 +60,8 @@ #include "ED_anim_api.h" #include "ED_keyframing.h" -#include "ED_keyframes_draw.h" #include "ED_keyframes_edit.h" #include "ED_screen.h" -#include "ED_space_api.h" #include "ED_transform.h" #include "WM_api.h" @@ -118,7 +99,7 @@ static int act_new_exec(bContext *C, wmOperator *op) } /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -152,7 +133,7 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max) int filter; /* get data to filter, from Action or Dopesheet */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* set large values to try to override */ @@ -303,7 +284,7 @@ static short copy_action_keys (bAnimContext *ac) free_anim_copybuf(); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* copy keyframes */ @@ -322,7 +303,7 @@ static short paste_action_keys (bAnimContext *ac) int filter, ok=0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* paste keyframes */ @@ -398,7 +379,7 @@ static int actkeys_paste_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -440,7 +421,7 @@ static void insert_action_keys(bAnimContext *ac, short mode) short flag = 0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (mode == 2) filter |= ANIMFILTER_SEL; else if (mode == 3) filter |= ANIMFILTER_ACTGROUPED; @@ -493,7 +474,7 @@ static int actkeys_insertkey_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -527,9 +508,9 @@ static void duplicate_action_keys (bAnimContext *ac) /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -561,7 +542,7 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; // xxx - start transform } @@ -605,9 +586,9 @@ static void delete_action_keys (bAnimContext *ac) /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -648,7 +629,7 @@ static int actkeys_delete_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -678,7 +659,7 @@ static void clean_action_keys (bAnimContext *ac, float thresh) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and clean curves */ @@ -712,7 +693,7 @@ static int actkeys_clean_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -746,7 +727,7 @@ static void sample_action_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -776,7 +757,7 @@ static int actkeys_sample_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -816,7 +797,7 @@ static void setexpo_action_keys(bAnimContext *ac, short mode) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting mode per F-Curve */ @@ -884,17 +865,17 @@ static void setipo_action_keys(bAnimContext *ac, short mode) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - BeztEditFunc set_cb= ANIM_editkeyframes_ipo(mode); + KeyframeEditFunc set_cb= ANIM_editkeyframes_ipo(mode); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting BezTriple interpolation - * Note: we do not supply BeztEditData to the looper yet. Currently that's not necessary here... + * Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here... */ for (ale= anim_data.first; ale; ale= ale->next) - ANIM_fcurve_keys_bezier_loop(NULL, ale->key_data, NULL, set_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(NULL, ale->key_data, NULL, set_cb, calchandles_fcurve); /* cleanup */ BLI_freelistN(&anim_data); @@ -967,21 +948,21 @@ static void sethandles_action_keys(bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditFunc edit_cb= ANIM_editkeyframes_handles(mode); - BeztEditFunc sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); + KeyframeEditFunc edit_cb= ANIM_editkeyframes_handles(mode); + KeyframeEditFunc sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting flags for handles - * Note: we do not supply BeztEditData to the looper yet. Currently that's not necessary here... + * Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here... */ for (ale= anim_data.first; ale; ale= ale->next) { FCurve *fcu= (FCurve *)ale->key_data; /* any selected keyframes for editing? */ - if (ANIM_fcurve_keys_bezier_loop(NULL, fcu, NULL, sel_cb, NULL)) { + if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, sel_cb, NULL)) { /* for auto/auto-clamped, toggle the auto-handles flag on the F-Curve */ if (mode == HD_AUTO_ANIM) fcu->flag |= FCURVE_AUTO_HANDLES; @@ -989,7 +970,7 @@ static void sethandles_action_keys(bAnimContext *ac, short mode) fcu->flag &= ~FCURVE_AUTO_HANDLES; /* change type of selected handles */ - ANIM_fcurve_keys_bezier_loop(NULL, fcu, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, edit_cb, calchandles_fcurve); } } @@ -1052,17 +1033,17 @@ static void setkeytype_action_keys(bAnimContext *ac, short mode) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - BeztEditFunc set_cb= ANIM_editkeyframes_keytype(mode); + KeyframeEditFunc set_cb= ANIM_editkeyframes_keytype(mode); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting BezTriple interpolation - * Note: we do not supply BeztEditData to the looper yet. Currently that's not necessary here... + * Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here... */ for (ale= anim_data.first; ale; ale= ale->next) - ANIM_fcurve_keys_bezier_loop(NULL, ale->key_data, NULL, set_cb, NULL); + ANIM_fcurve_keyframes_loop(NULL, ale->key_data, NULL, set_cb, NULL); /* cleanup */ BLI_freelistN(&anim_data); @@ -1127,36 +1108,37 @@ static int actkeys_framejump_exec(bContext *C, wmOperator *op) ListBase anim_data= {NULL, NULL}; bAnimListElem *ale; int filter; - BeztEditData bed; + KeyframeEditData ked; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; /* init edit data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* loop over action data, averaging values */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(&ac, ale); if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL); } BLI_freelistN(&anim_data); /* set the new current frame value, based on the average time */ - if (bed.i1) { + if (ked.i1) { Scene *scene= ac.scene; - CFRA= (int)floor((bed.f1 / bed.i1) + 0.5f); + CFRA= (int)floor((ked.f1 / ked.i1) + 0.5f); + SUBFRA= 0.f; } /* set notifier that things have changed */ @@ -1198,24 +1180,24 @@ static void snap_action_keys(bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc edit_cb; + KeyframeEditData ked; + KeyframeEditFunc edit_cb; /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get beztriple editing callbacks */ edit_cb= ANIM_editkeyframes_snap(mode); - memset(&bed, 0, sizeof(BeztEditData)); - bed.scene= ac->scene; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.scene= ac->scene; if (mode == ACTKEYS_SNAP_NEAREST_MARKER) { - bed.list.first= (ac->markers) ? ac->markers->first : NULL; - bed.list.last= (ac->markers) ? ac->markers->last : NULL; + ked.list.first= (ac->markers) ? ac->markers->first : NULL; + ked.list.last= (ac->markers) ? ac->markers->last : NULL; } /* snap keyframes */ @@ -1224,13 +1206,13 @@ static void snap_action_keys(bAnimContext *ac, short mode) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } //else if (ale->type == ACTTYPE_GPLAYER) // snap_gplayer_frames(ale->data, mode); else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); } BLI_freelistN(&anim_data); @@ -1257,7 +1239,7 @@ static int actkeys_snap_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1298,14 +1280,14 @@ static void mirror_action_keys(bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc edit_cb; + KeyframeEditData ked; + KeyframeEditFunc edit_cb; /* get beztriple editing callbacks */ edit_cb= ANIM_editkeyframes_mirror(mode); - memset(&bed, 0, sizeof(BeztEditData)); - bed.scene= ac->scene; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.scene= ac->scene; /* for 'first selected marker' mode, need to find first selected marker first! */ // XXX should this be made into a helper func in the API? @@ -1323,16 +1305,16 @@ static void mirror_action_keys(bAnimContext *ac, short mode) /* store marker's time (if available) */ if (marker) - bed.f1= (float)marker->frame; + ked.f1= (float)marker->frame; else return; } /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* mirror keyframes */ @@ -1341,13 +1323,13 @@ static void mirror_action_keys(bAnimContext *ac, short mode) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } //else if (ale->type == ACTTYPE_GPLAYER) // snap_gplayer_frames(ale->data, mode); else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); } BLI_freelistN(&anim_data); @@ -1374,7 +1356,7 @@ static int actkeys_mirror_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h index 3ad7d3e24ff..b02e95ac138 100644 --- a/source/blender/editors/space_action/action_intern.h +++ b/source/blender/editors/space_action/action_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -56,6 +56,7 @@ void action_header_buttons(const struct bContext *C, struct ARegion *ar); void ACTION_OT_select_all_toggle(struct wmOperatorType *ot); void ACTION_OT_select_border(struct wmOperatorType *ot); void ACTION_OT_select_column(struct wmOperatorType *ot); +void ACTION_OT_select_linked(struct wmOperatorType *ot); void ACTION_OT_select_more(struct wmOperatorType *ot); void ACTION_OT_select_less(struct wmOperatorType *ot); void ACTION_OT_clickselect(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c index 429c1cc63cd..fa9968b2524 100644 --- a/source/blender/editors/space_action/action_ops.c +++ b/source/blender/editors/space_action/action_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,28 +31,19 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" -#include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" #include "BKE_context.h" #include "BKE_utildefines.h" -#include "UI_interface.h" -#include "UI_view2d.h" #include "ED_transform.h" #include "action_intern.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" @@ -67,6 +58,7 @@ void action_operatortypes(void) WM_operatortype_append(ACTION_OT_select_all_toggle); WM_operatortype_append(ACTION_OT_select_border); WM_operatortype_append(ACTION_OT_select_column); + WM_operatortype_append(ACTION_OT_select_linked); WM_operatortype_append(ACTION_OT_select_more); WM_operatortype_append(ACTION_OT_select_less); @@ -128,6 +120,9 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) WM_keymap_add_item(keymap, "ACTION_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ACTION_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); + /* select linekd */ + WM_keymap_add_item(keymap, "ACTION_OT_select_linked", LKEY, KM_PRESS, 0, 0); + /* action_edit.c */ /* snap - current frame to selected keys */ @@ -150,6 +145,7 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) WM_keymap_add_item(keymap, "ACTION_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ACTION_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ACTION_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ACTION_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "ACTION_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index 98caf1a25cb..e852afa9a87 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -29,10 +29,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" @@ -40,22 +36,8 @@ #include "BLI_dlrbTree.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -73,12 +55,10 @@ #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_keyframing.h" #include "ED_keyframes_draw.h" #include "ED_keyframes_edit.h" #include "ED_markers.h" #include "ED_screen.h" -#include "ED_space_api.h" #include "WM_api.h" #include "WM_types.h" @@ -110,20 +90,20 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc test_cb, sel_cb; + KeyframeEditData ked; + KeyframeEditFunc test_cb, sel_cb; /* determine type-based settings */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); /* filter data */ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* init BezTriple looping data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* See if we should be selecting or deselecting */ @@ -136,7 +116,7 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel) //} } else { - if (ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, test_cb, NULL)) { + if (ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, test_cb, NULL)) { sel= SELECT_SUBTRACT; break; } @@ -152,7 +132,7 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel) //if (ale->type == ACTTYPE_GPLAYER) // set_gplayer_frame_selection(ale->data, sel); //else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, sel_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL); } /* Cleanup */ @@ -176,7 +156,7 @@ static int actkeys_deselectall_exec(bContext *C, wmOperator *op) deselect_action_keys(&ac, 1, SELECT_ADD); /* set notifier that keyframe selection have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -221,8 +201,8 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short bAnimListElem *ale; int filter, filterflag; - BeztEditData bed; - BeztEditFunc ok_cb, select_cb; + KeyframeEditData ked; + KeyframeEditFunc ok_cb, select_cb; View2D *v2d= &ac->ar->v2d; rctf rectf; float ymin=0, ymax=(float)(-ACHANNEL_HEIGHT_HALF); @@ -232,7 +212,7 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax-2, &rectf.xmax, &rectf.ymax); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get filtering flag for dopesheet data (if applicable) */ @@ -252,7 +232,7 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short ok_cb= NULL; /* init editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* loop over data, doing border select */ for (ale= anim_data.first; ale; ale= ale->next) { @@ -265,12 +245,12 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS)) { /* if channel is mapped in NLA, apply correction */ if (adt) { - bed.f1= BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP); - bed.f2= BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP); + ked.f1= BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP); + ked.f2= BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP); } else { - bed.f1= rectf.xmin; - bed.f2= rectf.xmax; + ked.f1= rectf.xmin; + ked.f2= rectf.xmax; } } @@ -282,7 +262,7 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short //if (ale->type == ANIMTYPE_GPLAYER) // borderselect_gplayer_frames(ale->data, rectf.xmin, rectf.xmax, selectmode); //else - ANIM_animchannel_keys_bezier_loop(&bed, ale, ok_cb, select_cb, NULL, filterflag); + ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, filterflag); } /* set minimum extent to be the maximum of the next channel */ @@ -337,7 +317,7 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op) borderselect_action(&ac, rect, mode, selectmode); /* set notifier that keyframe selection have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -391,8 +371,8 @@ static void markers_selectkeys_between (bAnimContext *ac) bAnimListElem *ale; int filter; - BeztEditFunc ok_cb, select_cb; - BeztEditData bed; + KeyframeEditFunc ok_cb, select_cb; + KeyframeEditData ked; float min, max; /* get extreme markers */ @@ -404,12 +384,12 @@ static void markers_selectkeys_between (bAnimContext *ac) ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); select_cb= ANIM_editkeyframes_select(SELECT_ADD); - memset(&bed, 0, sizeof(BeztEditData)); - bed.f1= min; - bed.f2= max; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.f1= min; + ked.f2= max; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys in-between */ @@ -418,11 +398,11 @@ static void markers_selectkeys_between (bAnimContext *ac) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else { - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); } } @@ -440,11 +420,11 @@ static void columnselect_action_keys (bAnimContext *ac, short mode) Scene *scene= ac->scene; CfraElem *ce; - BeztEditFunc select_cb, ok_cb; - BeztEditData bed; + KeyframeEditFunc select_cb, ok_cb; + KeyframeEditData ked; /* initialise keyframe editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* build list of columns */ switch (mode) { @@ -461,7 +441,7 @@ static void columnselect_action_keys (bAnimContext *ac, short mode) ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_to_cfraelem, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_to_cfraelem, NULL); } BLI_freelistN(&anim_data); break; @@ -469,13 +449,13 @@ static void columnselect_action_keys (bAnimContext *ac, short mode) case ACTKEYS_COLUMNSEL_CFRA: /* current frame */ /* make a single CfraElem for storing this */ ce= MEM_callocN(sizeof(CfraElem), "cfraElem"); - BLI_addtail(&bed.list, ce); + BLI_addtail(&ked.list, ce); ce->cfra= (float)CFRA; break; case ACTKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */ - ED_markers_make_cfra_list(ac->markers, &bed.list, 1); + ED_markers_make_cfra_list(ac->markers, &ked.list, 1); break; default: /* invalid option */ @@ -498,18 +478,18 @@ static void columnselect_action_keys (bAnimContext *ac, short mode) for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(ac, ale); - /* loop over cfraelems (stored in the BeztEditData->list) + /* loop over cfraelems (stored in the KeyframeEditData->list) * - we need to do this here, as we can apply fewer NLA-mapping conversions */ - for (ce= bed.list.first; ce; ce= ce->next) { + for (ce= ked.list.first; ce; ce= ce->next) { /* set frame for validation callback to refer to */ if (adt) - bed.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP); + ked.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP); else - bed.f1= ce->cfra; + ked.f1= ce->cfra; /* select elements with frame number matching cfraelem */ - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); #if 0 // XXX reenable when Grease Pencil stuff is back if (ale->type == ANIMTYPE_GPLAYER) { @@ -527,7 +507,7 @@ static void columnselect_action_keys (bAnimContext *ac, short mode) } /* free elements */ - BLI_freelistN(&bed.list); + BLI_freelistN(&ked.list); BLI_freelistN(&anim_data); } @@ -551,7 +531,7 @@ static int actkeys_columnselect_exec(bContext *C, wmOperator *op) columnselect_action_keys(&ac, mode); /* set notifier that keyframe selection have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -574,6 +554,61 @@ void ACTION_OT_select_column (wmOperatorType *ot) ot->prop= RNA_def_enum(ot->srna, "mode", prop_column_select_types, 0, "Mode", ""); } +/* ******************** Select Linked Operator *********************** */ + +static int actkeys_select_linked_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + + ListBase anim_data= {NULL, NULL}; + bAnimListElem *ale; + int filter; + + KeyframeEditFunc ok_cb = ANIM_editkeyframes_ok(BEZT_OK_SELECTED); + KeyframeEditFunc sel_cb = ANIM_editkeyframes_select(SELECT_ADD); + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* loop through all of the keys and select additional keyframes based on these */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + for (ale= anim_data.first; ale; ale= ale->next) { + FCurve *fcu= (FCurve *)ale->key_data; + + /* check if anything selected? */ + if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, ok_cb, NULL)) { + /* select every keyframe in this curve then */ + ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, sel_cb, NULL); + } + } + + /* Cleanup */ + BLI_freelistN(&anim_data); + + /* set notifier that keyframe selection has changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); + + return OPERATOR_FINISHED; +} + +void ACTION_OT_select_linked (wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Linked"; + ot->idname= "ACTION_OT_select_linked"; + ot->description = "Select keyframes occurring the same F-Curves as selected ones"; + + /* api callbacks */ + ot->exec= actkeys_select_linked_exec; + ot->poll= ED_operator_action_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/; +} + /* ******************** Select More/Less Operators *********************** */ /* Common code to perform selection */ @@ -583,16 +618,16 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc build_cb; + KeyframeEditData ked; + KeyframeEditFunc build_cb; /* init selmap building data */ build_cb= ANIM_editkeyframes_buildselmap(mode); - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* loop through all of the keys and select additional keyframes based on these */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -603,15 +638,15 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode) continue; /* build up map of whether F-Curve's keyframes should be selected or not */ - bed.data= MEM_callocN(fcu->totvert, "selmap actEdit more"); - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, build_cb, NULL); + ked.data= MEM_callocN(fcu->totvert, "selmap actEdit more"); + ANIM_fcurve_keyframes_loop(&ked, fcu, NULL, build_cb, NULL); /* based on this map, adjust the selection status of the keyframes */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, bezt_selmap_flush, NULL); + ANIM_fcurve_keyframes_loop(&ked, fcu, NULL, bezt_selmap_flush, NULL); /* free the selmap used here */ - MEM_freeN(bed.data); - bed.data= NULL; + MEM_freeN(ked.data); + ked.data= NULL; } /* Cleanup */ @@ -632,7 +667,7 @@ static int actkeys_select_more_exec (bContext *C, wmOperator *op) select_moreless_action_keys(&ac, SELMAP_MORE); /* set notifier that keyframe selection has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -666,7 +701,7 @@ static int actkeys_select_less_exec (bContext *C, wmOperator *op) select_moreless_action_keys(&ac, SELMAP_LESS); /* set notifier that keyframe selection has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -716,17 +751,17 @@ static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL; int ds_filter = ((ads) ? (ads->filterflag) : (0)); - BeztEditData bed; - BeztEditFunc select_cb, ok_cb; + KeyframeEditData ked; + KeyframeEditFunc select_cb, ok_cb; /* get functions for selecting keyframes */ select_cb= ANIM_editkeyframes_select(select_mode); ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME); - memset(&bed, 0, sizeof(BeztEditData)); - bed.f1= selx; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.f1= selx; /* select the nominated keyframe on the given frame */ - ANIM_animchannel_keys_bezier_loop(&bed, ale, ok_cb, select_cb, NULL, ds_filter); + ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter); } /* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */ @@ -736,8 +771,8 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short bAnimListElem *ale; int filter; - BeztEditFunc ok_cb, select_cb; - BeztEditData bed; + KeyframeEditFunc ok_cb, select_cb; + KeyframeEditData ked; Scene *scene= ac->scene; /* if select mode is replace, deselect all keyframes (and channels) first */ @@ -753,21 +788,21 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); select_cb= ANIM_editkeyframes_select(select_mode); - memset(&bed, 0, sizeof(BeztEditFunc)); + memset(&ked, 0, sizeof(KeyframeEditFunc)); if (leftright == ACTKEYS_LRSEL_LEFT) { - bed.f1 = MINAFRAMEF; - bed.f2 = (float)(CFRA + FRAME_CLICK_THRESH); + ked.f1 = MINAFRAMEF; + ked.f2 = (float)(CFRA + FRAME_CLICK_THRESH); } else { - bed.f1 = (float)(CFRA - FRAME_CLICK_THRESH); - bed.f2 = MAXFRAMEF; + ked.f1 = (float)(CFRA - FRAME_CLICK_THRESH); + ked.f2 = MAXFRAMEF; } /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys on the side where most data occurs */ @@ -776,15 +811,35 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } //else if (ale->type == ANIMTYPE_GPLAYER) // borderselect_gplayer_frames(ale->data, min, max, SELECT_ADD); else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); } + /* Sync marker support */ + if((select_mode==SELECT_ADD) && (ac->spacetype==SPACE_ACTION) && ELEM(leftright, ACTKEYS_LRSEL_LEFT, ACTKEYS_LRSEL_RIGHT)) { + SpaceAction *saction= ac->sa->spacedata.first; + + if (saction && saction->flag & SACTION_MARKERS_MOVE) { + TimeMarker *marker; + + for (marker= scene->markers.first; marker; marker= marker->next) { + if( ((leftright == ACTKEYS_LRSEL_LEFT) && (marker->frame < CFRA)) || + ((leftright == ACTKEYS_LRSEL_RIGHT) && (marker->frame >= CFRA)) ) + { + marker->flag |= SELECT; + } + else { + marker->flag &= ~SELECT; + } + } + } + } + /* Cleanup */ BLI_freelistN(&anim_data); } @@ -796,11 +851,11 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se bAnimListElem *ale; int filter; - BeztEditFunc select_cb, ok_cb; - BeztEditData bed; + KeyframeEditFunc select_cb, ok_cb; + KeyframeEditData ked; /* initialise keyframe editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* set up BezTriple edit callbacks */ select_cb= ANIM_editkeyframes_select(select_mode); @@ -810,9 +865,9 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se * based on the keys found to be selected above */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -820,12 +875,12 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se /* set frame for validation callback to refer to */ if (adt) - bed.f1= BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP); + ked.f1= BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP); else - bed.f1= selx; + ked.f1= selx; /* select elements with frame number matching cfra */ - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); #if 0 // XXX reenable when Grease Pencil stuff is back if (ale->type == ANIMTYPE_GPLAYER) { @@ -842,7 +897,7 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se } /* free elements */ - BLI_freelistN(&bed.list); + BLI_freelistN(&ked.list); BLI_freelistN(&anim_data); } @@ -943,10 +998,8 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode, gpl_to_keylist(ads, gpl, &anim_keys, NULL); } - // the call below is not strictly necessary, since we have adjacency info anyway - //BLI_dlrbTree_linkedlist_sync(&anim_keys); - /* loop through keyframes, finding one that was within the range clicked on */ + // TODO: replace this with API calls instead of inlining for (ak= anim_keys.root; ak; ak= akn) { if (IN_RANGE(ak->cfra, rectf.xmin, rectf.xmax)) { /* set the frame to use, and apply inverse-correction for NLA-mapping @@ -1085,7 +1138,7 @@ static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even } /* set notifier that keyframe selection (and channels too) have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT|ND_ANIMCHAN_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL); /* for tweak grab to work */ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 111e500c6f5..bad35d9d3e6 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,12 +29,8 @@ #include #include -#include "DNA_listBase.h" #include "DNA_action_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -47,7 +43,6 @@ #include "BKE_screen.h" #include "BKE_utildefines.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -55,12 +50,10 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_keyframes_draw.h" #include "ED_markers.h" #include "action_intern.h" // own include @@ -110,10 +103,10 @@ static SpaceLink *action_new(const bContext *C) ar->v2d.cur = ar->v2d.tot; ar->v2d.min[0]= 0.0f; - ar->v2d.min[1]= 0.0f; + ar->v2d.min[1]= 0.0f; ar->v2d.max[0]= MAXFRAMEF; - ar->v2d.max[1]= FLT_MAX; + ar->v2d.max[1]= FLT_MAX; ar->v2d.minzoom= 0.01f; ar->v2d.maxzoom= 50; @@ -172,12 +165,10 @@ static void action_main_area_draw(const bContext *C, ARegion *ar) View2D *v2d= &ar->v2d; View2DGrid *grid; View2DScrollers *scrollers; - float col[3]; short unit=0, flag=0; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); @@ -234,11 +225,9 @@ static void action_channel_area_draw(const bContext *C, ARegion *ar) bAnimContext ac; View2D *v2d= &ar->v2d; View2DScrollers *scrollers; - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); @@ -363,7 +352,7 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn) switch (wmn->category) { case NC_ANIMATION: /* for selection changes of animation data, we can just redraw... otherwise autocolor might need to be done again */ - if (ELEM(wmn->data, ND_KEYFRAME_SELECT, ND_ANIMCHAN_SELECT)) + if (ELEM(wmn->data, ND_KEYFRAME, ND_ANIMCHAN) && (wmn->action == NA_SELECTED)) ED_area_tag_redraw(sa); else ED_area_tag_refresh(sa); diff --git a/source/blender/editors/space_api/CMakeLists.txt b/source/blender/editors/space_api/CMakeLists.txt new file mode 100644 index 00000000000..f186b4f1c8a --- /dev/null +++ b/source/blender/editors/space_api/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../bmesh + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_api "${SRC}" "${INC}") diff --git a/source/blender/editors/space_api/SConscript b/source/blender/editors/space_api/SConscript index 44090e8fc12..d8be59941eb 100644 --- a/source/blender/editors/space_api/SConscript +++ b/source/blender/editors/space_api/SConscript @@ -9,7 +9,4 @@ incs += ' #/intern/guardedalloc #/extern/glew/include' defs = '' -if not env['WITH_BF_PYTHON']: - defs += 'DISABLE_PYTHON' - env.BlenderLib ( 'bf_editors_space_api', sources, Split(incs), Split(defs), libtype=['core'], priority=[30] ) diff --git a/source/blender/editors/space_api/space.c b/source/blender/editors/space_api/space.c index c61e5d93160..66cb88ebf70 100644 --- a/source/blender/editors/space_api/space.c +++ b/source/blender/editors/space_api/space.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -37,7 +37,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_screen.h" /* */ diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index d8d3d803634..b0f6d456dcc 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -1,5 +1,5 @@ /** - * $Id: spacetypes.c + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,7 +28,6 @@ #include "BLI_blenlib.h" #include "DNA_object_types.h" -#include "DNA_scene_types.h" #include "DNA_windowmanager_types.h" #include "BKE_context.h" @@ -59,6 +58,7 @@ #include "ED_sound.h" #include "ED_uvedit.h" #include "ED_mball.h" +#include "ED_logic.h" /* only call once on startup, storage is global in BKE kernel listbase */ void ED_spacetypes_init(void) @@ -104,6 +104,7 @@ void ED_spacetypes_init(void) ED_operatortypes_metaball(); ED_operatortypes_sound(); ED_operatortypes_render(); + ED_operatortypes_logic(); UI_view2d_operatortypes(); UI_buttons_operatortypes(); diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt new file mode 100644 index 00000000000..bb50ac0cc86 --- /dev/null +++ b/source/blender/editors/space_buttons/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_buttons "${SRC}" "${INC}") diff --git a/source/blender/editors/space_buttons/SConscript b/source/blender/editors/space_buttons/SConscript index 71530d6f92d..b82f0db49a0 100644 --- a/source/blender/editors/space_buttons/SConscript +++ b/source/blender/editors/space_buttons/SConscript @@ -9,7 +9,4 @@ incs += ' ../../makesrna ../../render/extern/include ../../bmesh' defs = [] -if env['WITH_BF_GAMEENGINE']: - defs.append('GAMEBLENDER=1') - env.BlenderLib ( 'bf_editors_space_buttons', sources, Split(incs), defs, libtype=['core'], priority=[120] ) diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index 572176a256a..da6f9fa3f1e 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,17 +31,10 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" -#include "DNA_brush_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" -#include "DNA_modifier_types.h" #include "DNA_node_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_particle_types.h" -#include "DNA_texture_types.h" #include "DNA_world_types.h" #include "BLI_listbase.h" @@ -706,11 +699,20 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r Material *ma= ptr->data; /* if we have a node material, get slot from material in material node */ - if(ma && ma->use_nodes && ma->nodetree) + if(ma && ma->use_nodes && ma->nodetree) { + /* if there's an active texture node in the node tree, + * then that texture is in context directly, without a texture slot */ + if (give_current_material_texture_node(ma)) + return 0; + ma= give_node_material(ma); - - if(ma) + if (ma) + CTX_data_pointer_set(result, &ma->id, &RNA_MaterialTextureSlot, ma->mtex[(int)ma->texact]); + else + return 0; + } else if(ma) { CTX_data_pointer_set(result, &ma->id, &RNA_MaterialTextureSlot, ma->mtex[(int)ma->texact]); + } } else if((ptr=get_pointer_type(path, &RNA_Lamp))) { Lamp *la= ptr->data; @@ -823,21 +825,9 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r static void pin_cb(bContext *C, void *arg1, void *arg2) { SpaceButs *sbuts= CTX_wm_space_buts(C); - ButsContextPath *path= sbuts->path; - PointerRNA *ptr; - int a; if(sbuts->flag & SB_PIN_CONTEXT) { - if(path->len) { - for(a=path->len-1; a>=0; a--) { - ptr= &path->ptr[a]; - - if(ptr->id.data) { - sbuts->pinid= ptr->id.data; - break; - } - } - } + sbuts->pinid= buttons_context_id_path(C); } else sbuts->pinid= NULL; @@ -908,3 +898,24 @@ void buttons_context_register(ARegionType *art) pt->flag= PNL_NO_HEADER; BLI_addtail(&art->paneltypes, pt); } + +ID *buttons_context_id_path(const bContext *C) +{ + SpaceButs *sbuts= CTX_wm_space_buts(C); + ButsContextPath *path= sbuts->path; + PointerRNA *ptr; + int a; + + if(path->len) { + for(a=path->len-1; a>=0; a--) { + ptr= &path->ptr[a]; + + if(ptr->id.data) { + return ptr->id.data; + break; + } + } + } + + return NULL; +} diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c index 3e479c63f20..d8cbbb0cbae 100644 --- a/source/blender/editors/space_buttons/buttons_header.c +++ b/source/blender/editors/space_buttons/buttons_header.c @@ -29,11 +29,6 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -45,10 +40,7 @@ #include "ED_screen.h" #include "ED_types.h" -#include "ED_util.h" -#include "WM_api.h" -#include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -138,7 +130,7 @@ void buttons_header_buttons(const bContext *C, ARegion *ar) uiBlockEndAlign(block); /* always as last */ - UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin); + UI_view2d_totRect_set(&ar->v2d, xco+(XIC/2), ar->v2d.tot.ymax-ar->v2d.tot.ymin); uiEndBlock(C, block); uiDrawBlock(C, block); diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h index 28d52fd55cc..9478168f35a 100644 --- a/source/blender/editors/space_buttons/buttons_intern.h +++ b/source/blender/editors/space_buttons/buttons_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -35,6 +35,7 @@ struct bContextDataResult; struct SpaceButs; struct uiLayout; struct wmOperatorType; +struct ID; /* buts->scaflag */ #define BUTS_SENS_SEL 1 @@ -62,6 +63,7 @@ void buttons_context_compute(const struct bContext *C, struct SpaceButs *sbuts); int buttons_context(const struct bContext *C, const char *member, struct bContextDataResult *result); void buttons_context_draw(const struct bContext *C, struct uiLayout *layout); void buttons_context_register(struct ARegionType *art); +struct ID *buttons_context_id_path(const struct bContext *C); /* buttons_ops.c */ void BUTTONS_OT_file_browse(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c index 7b59f6aafa9..ebdc0d37b43 100644 --- a/source/blender/editors/space_buttons/buttons_ops.c +++ b/source/blender/editors/space_buttons/buttons_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,10 +30,12 @@ #include "MEM_guardedalloc.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" +#include "DNA_userdef_types.h" + +#include "BLI_fileops.h" #include "BKE_context.h" +#include "BKE_global.h" /* G.sce only */ #include "WM_api.h" #include "WM_types.h" @@ -41,10 +43,8 @@ #include "ED_screen.h" #include "RNA_access.h" -#include "RNA_define.h" #include "UI_interface.h" -#include "UI_resources.h" #include "buttons_intern.h" // own include @@ -92,10 +92,10 @@ static int file_browse_exec(bContext *C, wmOperator *op) FileBrowseOp *fbo= op->customdata; char *str; - if (RNA_property_is_set(op->ptr, "path")==0 || fbo==NULL) + if (RNA_property_is_set(op->ptr, "filepath")==0 || fbo==NULL) return OPERATOR_CANCELLED; - str= RNA_string_get_alloc(op->ptr, "path", 0, 0); + str= RNA_string_get_alloc(op->ptr, "filepath", 0, 0); RNA_property_string_set(&fbo->ptr, fbo->prop, str); RNA_property_update(C, &fbo->ptr, fbo->prop); MEM_freeN(str); @@ -123,26 +123,53 @@ static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event) if(!prop) return OPERATOR_CANCELLED; - - fbo= MEM_callocN(sizeof(FileBrowseOp), "FileBrowseOp"); - fbo->ptr= ptr; - fbo->prop= prop; - op->customdata= fbo; str= RNA_property_string_get_alloc(&ptr, prop, 0, 0); - RNA_string_set(op->ptr, "path", str); - MEM_freeN(str); - WM_event_add_fileselect(C, op); - - return OPERATOR_RUNNING_MODAL; + /* useful yet irritating feature, Shift+Click to open the file + * Alt+Click to browse a folder in the OS's browser */ + if(event->shift || event->alt) { + PointerRNA props_ptr; + + if(event->alt) { + char *lslash= BLI_last_slash(str); + if(lslash) + *lslash= '\0'; + } + + + WM_operator_properties_create(&props_ptr, "WM_OT_path_open"); + RNA_string_set(&props_ptr, "filepath", str); + WM_operator_name_call(C, "WM_OT_path_open", WM_OP_EXEC_DEFAULT, &props_ptr); + WM_operator_properties_free(&props_ptr); + + MEM_freeN(str); + return OPERATOR_CANCELLED; + } + else { + fbo= MEM_callocN(sizeof(FileBrowseOp), "FileBrowseOp"); + fbo->ptr= ptr; + fbo->prop= prop; + op->customdata= fbo; + + RNA_string_set(op->ptr, "filepath", str); + MEM_freeN(str); + + if(RNA_struct_find_property(op->ptr, "relative_path")) + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + WM_event_add_fileselect(C, op); + + return OPERATOR_RUNNING_MODAL; + } } void BUTTONS_OT_file_browse(wmOperatorType *ot) { /* identifiers */ ot->name= "Accept"; - ot->description="Open a file browser"; + ot->description="Open a file browser, Hold Shift to open the file, Alt to browse containing directory"; ot->idname= "BUTTONS_OT_file_browse"; /* api callbacks */ @@ -151,6 +178,6 @@ void BUTTONS_OT_file_browse(wmOperatorType *ot) ot->cancel= file_browse_cancel; /* properties */ - WM_operator_properties_filesel(ot, 0, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, 0, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); } diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index b828a1e664c..e28fcf8c28a 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,11 +29,6 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -45,7 +40,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -53,7 +47,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -181,7 +174,7 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar) else if(sbuts->mainb == BCONTEXT_BONE_CONSTRAINT) ED_region_panels(C, ar, vertical, "bone_constraint", sbuts->mainb); - sbuts->re_align= 0; + sbuts->re_align= 0; sbuts->mainbo= sbuts->mainb; } @@ -215,15 +208,9 @@ static void buttons_header_area_draw(const bContext *C, ARegion *ar) ED_region_header(C, ar); #else - float col[3]; - + /* clear */ - if(ED_screen_area_active(C)) - UI_GetThemeColor3fv(TH_HEADER, col); - else - UI_GetThemeColor3fv(TH_HEADERDESEL, col); - - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(ED_screen_area_active(C)?TH_HEADER:TH_HEADERDESEL); glClear(GL_COLOR_BUFFER_BIT); /* set view2d view matrix for scrolling (without scrollers) */ @@ -265,6 +252,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) buttons_area_redraw(sa, BCONTEXT_TEXTURE); buttons_area_redraw(sa, BCONTEXT_WORLD); buttons_area_redraw(sa, BCONTEXT_DATA); + buttons_area_redraw(sa, BCONTEXT_PHYSICS); sbuts->preview= 1; break; case ND_OB_ACTIVE: @@ -274,6 +262,8 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) case ND_KEYINGSET: buttons_area_redraw(sa, BCONTEXT_SCENE); break; + case ND_RENDER_RESULT: + break; case ND_MODE: case ND_LAYER: default: @@ -297,15 +287,20 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) ED_area_tag_redraw(sa); else buttons_area_redraw(sa, BCONTEXT_MODIFIER); + buttons_area_redraw(sa, BCONTEXT_PHYSICS); break; case ND_CONSTRAINT: buttons_area_redraw(sa, BCONTEXT_CONSTRAINT); buttons_area_redraw(sa, BCONTEXT_BONE_CONSTRAINT); break; - case ND_PARTICLE_DATA: - buttons_area_redraw(sa, BCONTEXT_PARTICLE); + case ND_PARTICLE: + if (wmn->action == NA_EDITED) + buttons_area_redraw(sa, BCONTEXT_PARTICLE); break; case ND_DRAW: + buttons_area_redraw(sa, BCONTEXT_OBJECT); + buttons_area_redraw(sa, BCONTEXT_DATA); + buttons_area_redraw(sa, BCONTEXT_PHYSICS); case ND_SHADING: case ND_SHADING_DRAW: /* currently works by redraws... if preview is set, it (re)starts job */ @@ -349,6 +344,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) sbuts->preview= 1; break; case NC_TEXTURE: + case NC_IMAGE: ED_area_tag_redraw(sa); sbuts->preview= 1; break; @@ -362,8 +358,9 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) break; case NC_ANIMATION: switch(wmn->data) { - case ND_KEYFRAME_EDIT: - ED_area_tag_redraw(sa); + case ND_KEYFRAME: + if (wmn->action == NA_EDITED) + ED_area_tag_redraw(sa); break; } } diff --git a/source/blender/editors/space_console/CMakeLists.txt b/source/blender/editors/space_console/CMakeLists.txt new file mode 100644 index 00000000000..0cee45576b8 --- /dev/null +++ b/source/blender/editors/space_console/CMakeLists.txt @@ -0,0 +1,40 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenfont + ../../blenkernel + ../../blenlib + ../../blenloader + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +IF(NOT WITH_PYTHON) + ADD_DEFINITIONS(-DDISABLE_PYTHON) +ENDIF(NOT WITH_PYTHON) + +BLENDERLIB(bf_editor_space_console "${SRC}" "${INC}") diff --git a/source/blender/editors/space_console/Makefile b/source/blender/editors/space_console/Makefile index a7c9283985b..3f760b1ad67 100644 --- a/source/blender/editors/space_console/Makefile +++ b/source/blender/editors/space_console/Makefile @@ -43,6 +43,7 @@ CPPFLAGS += -I../../windowmanager CPPFLAGS += -I../../blenfont CPPFLAGS += -I../../blenkernel CPPFLAGS += -I../../blenlib +CPPFLAGS += -I../../blenloader CPPFLAGS += -I../../makesdna CPPFLAGS += -I../../makesrna CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include diff --git a/source/blender/editors/space_console/SConscript b/source/blender/editors/space_console/SConscript index ecc10a1d0c3..d50902446ba 100644 --- a/source/blender/editors/space_console/SConscript +++ b/source/blender/editors/space_console/SConscript @@ -14,6 +14,7 @@ incs = [ '../../blenlib', '../../windowmanager', '../../blenfont', + '../../blenloader', ] if not env['WITH_BF_PYTHON']: diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c index 708089f8f4c..2fab998b9b6 100644 --- a/source/blender/editors/space_console/console_draw.c +++ b/source/blender/editors/space_console/console_draw.c @@ -41,7 +41,6 @@ #include "DNA_space_types.h" #include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "BKE_global.h" #include "BKE_main.h" @@ -56,22 +55,20 @@ #include "ED_datafiles.h" #include "ED_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "console_intern.h" + +static int mono= -1; // XXX needs proper storage and change all the BLF_* here! + static void console_font_begin(SpaceConsole *sc) { - static int mono= -1; // XXX needs proper storage - if(mono == -1) mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size); - BLF_set(mono); - BLF_aspect(1.0); - - BLF_size(sc->lheight-2, 72); + BLF_aspect(mono, 1.0); + BLF_size(mono, sc->lheight-2, 72); } static void console_line_color(unsigned char *fg, int type) @@ -226,8 +223,8 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len, glColor3ub(fg[0], fg[1], fg[2]); /* last part needs no clipping */ - BLF_position(cdc->xy[0], cdc->xy[1], 0); - BLF_draw(line_stride); + BLF_position(mono, cdc->xy[0], cdc->xy[1], 0); + BLF_draw(mono, line_stride); if(cdc->sel[0] != cdc->sel[1]) { cdc->sel[0] += str_len - (cdc->console_width % str_len); @@ -244,8 +241,8 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len, eol = line_stride[cdc->console_width]; line_stride[cdc->console_width]= '\0'; - BLF_position(cdc->xy[0], cdc->xy[1], 0); - BLF_draw(line_stride); + BLF_position(mono, cdc->xy[0], cdc->xy[1], 0); + BLF_draw(mono, line_stride); if(cdc->sel[0] != cdc->sel[1]) { console_draw_sel(cdc->sel, cdc->xy, cdc->console_width, cdc->cwidth, cdc->console_width, cdc->lheight); @@ -270,8 +267,8 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len, glColor3ub(fg[0], fg[1], fg[2]); - BLF_position(cdc->xy[0], cdc->xy[1], 0); - BLF_draw(str); + BLF_position(mono, cdc->xy[0], cdc->xy[1], 0); + BLF_draw(mono, str); if(cdc->sel[0] != cdc->sel[1]) console_draw_sel(cdc->sel, cdc->xy, str_len, cdc->cwidth, cdc->console_width, cdc->lheight); @@ -303,7 +300,7 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion * unsigned char fg[3]; console_font_begin(sc); - cwidth = BLF_fixed_width(); + cwidth = BLF_fixed_width(mono); console_width= (ar->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN*2) )/cwidth; if (console_width < 8) console_width= 8; @@ -346,11 +343,11 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion * /* command line */ if(prompt_len) { - BLF_position(xy[0], xy[1], 0); xy[0] += cwidth * prompt_len; - BLF_draw(sc->prompt); + BLF_position(mono, xy[0], xy[1], 0); xy[0] += cwidth * prompt_len; + BLF_draw(mono, sc->prompt); } - BLF_position(xy[0], xy[1], 0); - BLF_draw(cl->line); + BLF_position(mono, xy[0], xy[1], 0); + BLF_draw(mono, cl->line); /* cursor */ UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, (char *)fg); diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h index 48159f2607c..c74d39f25e3 100644 --- a/source/blender/editors/space_console/console_intern.h +++ b/source/blender/editors/space_console/console_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c index 763436dd05f..089e769e0d9 100644 --- a/source/blender/editors/space_console/console_ops.c +++ b/source/blender/editors/space_console/console_ops.c @@ -34,15 +34,10 @@ #include "MEM_guardedalloc.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" #include "BLI_dynstr.h" -#include "PIL_time.h" #include "BKE_utildefines.h" #include "BKE_context.h" @@ -57,9 +52,6 @@ #include "WM_types.h" #include "ED_screen.h" -#include "ED_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "RNA_access.h" #include "RNA_define.h" @@ -362,7 +354,7 @@ void CONSOLE_OT_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Cursor"; - ot->description= "Move cursor position"; + ot->description= "Move cursor position"; ot->idname= "CONSOLE_OT_move"; /* api callbacks */ @@ -404,7 +396,7 @@ void CONSOLE_OT_insert(wmOperatorType *ot) { /* identifiers */ ot->name= "Insert"; - ot->description= "Insert text at cursor position"; + ot->description= "Insert text at cursor position"; ot->idname= "CONSOLE_OT_insert"; /* api callbacks */ @@ -469,7 +461,7 @@ void CONSOLE_OT_delete(wmOperatorType *ot) { /* identifiers */ ot->name= "Delete"; - ot->description= "Delete text by cursor position"; + ot->description= "Delete text by cursor position"; ot->idname= "CONSOLE_OT_delete"; /* api callbacks */ @@ -510,7 +502,7 @@ void CONSOLE_OT_clear(wmOperatorType *ot) { /* identifiers */ ot->name= "Clear"; - ot->description= "Clear text by type"; + ot->description= "Clear text by type"; ot->idname= "CONSOLE_OT_clear"; /* api callbacks */ @@ -569,7 +561,7 @@ void CONSOLE_OT_history_cycle(wmOperatorType *ot) { /* identifiers */ ot->name= "History Cycle"; - ot->description= "Cycle through history"; + ot->description= "Cycle through history"; ot->idname= "CONSOLE_OT_history_cycle"; /* api callbacks */ @@ -614,7 +606,7 @@ void CONSOLE_OT_history_append(wmOperatorType *ot) { /* identifiers */ ot->name= "History Append"; - ot->description= "Append history at cursor position"; + ot->description= "Append history at cursor position"; ot->idname= "CONSOLE_OT_history_append"; /* api callbacks */ @@ -659,7 +651,7 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot) /* identifiers */ ot->name= "Scrollback Append"; - ot->description= "Append scrollback text by type"; + ot->description= "Append scrollback text by type"; ot->idname= "CONSOLE_OT_scrollback_append"; /* api callbacks */ @@ -756,7 +748,7 @@ void CONSOLE_OT_copy(wmOperatorType *ot) { /* identifiers */ ot->name= "Copy to Clipboard"; - ot->description= "Copy selected text to clipboard"; + ot->description= "Copy selected text to clipboard"; ot->idname= "CONSOLE_OT_copy"; /* api callbacks */ @@ -805,7 +797,7 @@ void CONSOLE_OT_paste(wmOperatorType *ot) { /* identifiers */ ot->name= "Paste from Clipboard"; - ot->description= "Paste text from clipboard"; + ot->description= "Paste text from clipboard"; ot->idname= "CONSOLE_OT_paste"; /* api callbacks */ diff --git a/source/blender/editors/space_console/console_report.c b/source/blender/editors/space_console/console_report.c index 76eec4d0932..50829e4365c 100644 --- a/source/blender/editors/space_console/console_report.c +++ b/source/blender/editors/space_console/console_report.c @@ -32,14 +32,9 @@ #include "MEM_guardedalloc.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" #include "BLI_dynstr.h" -#include "PIL_time.h" #include "BKE_utildefines.h" #include "BKE_context.h" @@ -54,8 +49,6 @@ #include "ED_screen.h" #include "ED_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "RNA_access.h" #include "RNA_define.h" @@ -114,7 +107,7 @@ void CONSOLE_OT_report_replay(wmOperatorType *ot) { /* identifiers */ ot->name= "Replay Operators"; - ot->description= "Replay selected reports"; + ot->description= "Replay selected reports"; ot->idname= "CONSOLE_OT_report_replay"; /* api callbacks */ @@ -161,7 +154,7 @@ void CONSOLE_OT_select_pick(wmOperatorType *ot) { /* identifiers */ ot->name= "Select report"; - ot->description= "Select reports by index"; + ot->description= "Select reports by index"; ot->idname= "CONSOLE_OT_select_pick"; /* api callbacks */ @@ -215,7 +208,7 @@ void CONSOLE_OT_select_all_toggle(wmOperatorType *ot) { /* identifiers */ ot->name= "(De)Select All"; - ot->description= "(de)select all reports"; + ot->description= "(de)select all reports"; ot->idname= "CONSOLE_OT_select_all_toggle"; /* api callbacks */ @@ -308,7 +301,7 @@ void CONSOLE_OT_select_border(wmOperatorType *ot) { /* identifiers */ ot->name= "Border Select"; - ot->description= "Toggle border selection"; + ot->description= "Toggle border selection"; ot->idname= "CONSOLE_OT_select_border"; /* api callbacks */ @@ -358,7 +351,7 @@ void CONSOLE_OT_report_delete(wmOperatorType *ot) { /* identifiers */ ot->name= "Delete Reports"; - ot->description= "Delete selected reports"; + ot->description= "Delete selected reports"; ot->idname= "CONSOLE_OT_report_delete"; /* api callbacks */ @@ -403,7 +396,7 @@ void CONSOLE_OT_report_copy(wmOperatorType *ot) { /* identifiers */ ot->name= "Copy Reports to Clipboard"; - ot->description= "Copy selected reports to Clipboard"; + ot->description= "Copy selected reports to Clipboard"; ot->idname= "CONSOLE_OT_report_copy"; /* api callbacks */ diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 177cc0e83d0..c04f8183bee 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,12 +29,14 @@ #include #include -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif #include "MEM_guardedalloc.h" +#include "BLO_readfile.h" /* get the ID name for dnd*/ + #include "BLI_blenlib.h" #include "BLI_math.h" @@ -42,19 +44,16 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -148,28 +147,83 @@ static SpaceLink *console_duplicate(SpaceLink *sl) static void console_main_area_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; + ListBase *lb; UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); /* own keymap */ keymap= WM_keymap_find(wm->defaultconf, "Console", SPACE_CONSOLE, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); + + /* add drop boxes */ + lb= WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW); + + WM_event_add_dropbox_handler(&ar->handlers, lb); } + +/* ************* dropboxes ************* */ + +static int id_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) +{ + SpaceConsole *sc= CTX_wm_space_console(C); + if(sc->type==CONSOLE_TYPE_PYTHON) + if(drag->type==WM_DRAG_ID) + return 1; + return 0; +} + +static void id_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + char text[64]; + ID *id= drag->poin; + + snprintf(text, sizeof(text), "bpy.data.%s['%s']", BLO_idcode_to_name_plural(GS(id->name)), id->name+2); + + /* copy drag path to properties */ + RNA_string_set(drop->ptr, "text", text); +} + +static int path_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) +{ + SpaceConsole *sc= CTX_wm_space_console(C); + if(sc->type==CONSOLE_TYPE_PYTHON) + if(drag->type==WM_DRAG_PATH) + return 1; + return 0; +} + +static void path_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + char pathname[FILE_MAXDIR+FILE_MAXFILE+2]; + snprintf(pathname, sizeof(pathname), "\"%s\"", drag->path); + RNA_string_set(drop->ptr, "text", pathname); +} + + +/* this region dropbox definition */ +static void console_dropboxes(void) +{ + ListBase *lb= WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW); + + WM_dropbox_add(lb, "CONSOLE_OT_insert", id_drop_poll, id_drop_copy); + WM_dropbox_add(lb, "CONSOLE_OT_insert", path_drop_poll, path_drop_copy); +} + +/* ************* end drop *********** */ + static void console_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ SpaceConsole *sc= CTX_wm_space_console(C); View2D *v2d= &ar->v2d; View2DScrollers *scrollers; - float col[3]; if((sc->type==CONSOLE_TYPE_PYTHON) && (sc->scrollback.first==NULL)) WM_operator_name_call((bContext *)C, "CONSOLE_OT_banner", WM_OP_EXEC_DEFAULT, NULL); /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 1.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); console_update_rect(C, ar); @@ -235,19 +289,19 @@ void console_keymap(struct wmKeyConfig *keyconf) RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 0); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 1); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 0); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADMINUS, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 1); RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR); @@ -295,6 +349,11 @@ void console_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0); +#ifdef __APPLE__ + WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0); + WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0); +#endif + WM_keymap_add_item(keymap, "CONSOLE_OT_select_set", LEFTMOUSE, KM_PRESS, 0, 0); RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", " "); /* fake tabs */ @@ -347,6 +406,7 @@ void ED_spacetype_console(void) st->duplicate= console_duplicate; st->operatortypes= console_operatortypes; st->keymap= console_keymap; + st->dropboxes= console_dropboxes; st->listener= console_main_area_listener; /* regions: main window */ diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt new file mode 100644 index 00000000000..021e25953b0 --- /dev/null +++ b/source/blender/editors/space_file/CMakeLists.txt @@ -0,0 +1,59 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenfont + ../../blenkernel + ../../blenlib + ../../blenloader + ../../imbuf + ../include + ../../../../intern/audaspace/intern + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../render/extern/include + ../../windowmanager +) + +IF(WITH_OPENEXR) + ADD_DEFINITIONS(-DWITH_OPENEXR) +ENDIF(WITH_OPENEXR) + +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + +IF(WITH_OPENJPEG) + ADD_DEFINITIONS(-DWITH_OPENJPEG) +ENDIF(WITH_OPENJPEG) + +IF(WITH_DDS) + ADD_DEFINITIONS(-DWITH_DDS) +ENDIF(WITH_DDS) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_space_file "${SRC}" "${INC}") diff --git a/source/blender/editors/space_file/Makefile b/source/blender/editors/space_file/Makefile index 43b2f09ed2d..29548b51222 100644 --- a/source/blender/editors/space_file/Makefile +++ b/source/blender/editors/space_file/Makefile @@ -63,3 +63,7 @@ ifeq ($(WITH_OPENEXR), true) CPPFLAGS += -DWITH_OPENEXR endif +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + diff --git a/source/blender/editors/space_file/SConscript b/source/blender/editors/space_file/SConscript index b22a265dcbc..9de705e99d3 100644 --- a/source/blender/editors/space_file/SConscript +++ b/source/blender/editors/space_file/SConscript @@ -12,9 +12,13 @@ defs = [] if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') + if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['OURPLATFORM'] == 'linux2': cflags='-pthread' incs += ' ../../../extern/binreloc/include' diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index cd0571d4219..03ab42b467d 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -46,20 +46,11 @@ #include "BLF_api.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" - -#include "ED_datafiles.h" - #include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" #include "MEM_guardedalloc.h" -#include "PIL_time.h" +#include "DNA_userdef_types.h" #include "RNA_access.h" @@ -71,7 +62,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "WM_api.h" #include "WM_types.h" #include "fsmenu.h" @@ -87,10 +77,6 @@ /* button events */ enum { - B_REDR = 0, - B_FS_EXEC, - B_FS_CANCEL, - B_FS_PARENT, B_FS_DIRNAME, B_FS_FILENAME } eFile_ButEvents; @@ -99,9 +85,6 @@ enum { static void do_file_buttons(bContext *C, void *arg, int event) { switch(event) { - case B_FS_PARENT: - file_parent_exec(C, NULL); /* file_ops.c */ - break; case B_FS_FILENAME: file_filename_exec(C, NULL); break; @@ -142,6 +125,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar) int loadbutton; int fnumbuttons; int min_x = 10; + int chan_offs = 0; int available_w = max_x - min_x; int line1_w = available_w; int line2_w = available_w; @@ -160,8 +144,9 @@ void file_draw_buttons(const bContext *C, ARegion *ar) /* exception to make space for collapsed region icon */ for (artmp=CTX_wm_area(C)->regionbase.first; artmp; artmp=artmp->next) { if (artmp->regiontype == RGN_TYPE_CHANNELS && artmp->flag & RGN_FLAG_HIDDEN) { - min_x += 16; - available_w -= 16; + chan_offs = 16; + min_x += chan_offs; + available_w -= chan_offs; } } @@ -169,7 +154,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar) loadbutton = UI_GetStringWidth(sfile->params->title) + btn_margin; if (loadbutton < btn_minw) { loadbutton = MAX2(btn_minw, - btn_margin + UI_GetStringWidth(params->title)); + btn_margin + UI_GetStringWidth(params->title)); } if (available_w <= loadbutton + separator + input_minw @@ -191,29 +176,30 @@ void file_draw_buttons(const bContext *C, ARegion *ar) /* Text input fields for directory and file. */ if (available_w > 0) { but = uiDefBut(block, TEX, B_FS_DIRNAME, "", - min_x, line1_y, line1_w, btn_h, - params->dir, 0.0, (float)FILE_MAX-1, 0, 0, - "File path."); + min_x, line1_y, line1_w-chan_offs, btn_h, + params->dir, 0.0, (float)FILE_MAX-1, 0, 0, + "File path."); uiButSetCompleteFunc(but, autocomplete_directory, NULL); - uiDefBut(block, TEX, B_FS_FILENAME, "", - min_x, line2_y, line2_w, btn_h, - params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, - "File name."); + but = uiDefBut(block, TEX, B_FS_FILENAME, "", + min_x, line2_y, line2_w-chan_offs, btn_h, + params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, + "File name."); + uiButSetCompleteFunc(but, autocomplete_file, NULL); } /* Filename number increment / decrement buttons. */ if (fnumbuttons) { uiBlockBeginAlign(block); but = uiDefIconButO(block, BUT, "FILE_OT_filenum", 0, ICON_ZOOMOUT, - min_x + line2_w + separator, line2_y, - btn_fn_w, btn_h, - "Decrement the filename number"); + min_x + line2_w + separator - chan_offs, line2_y, + btn_fn_w, btn_h, + "Decrement the filename number"); RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", -1); but = uiDefIconButO(block, BUT, "FILE_OT_filenum", 0, ICON_ZOOMIN, - min_x + line2_w + separator + btn_fn_w, line2_y, - btn_fn_w, btn_h, - "Increment the filename number"); + min_x + line2_w + separator + btn_fn_w - chan_offs, line2_y, + btn_fn_w, btn_h, + "Increment the filename number"); RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", 1); uiBlockEndAlign(block); } @@ -238,7 +224,7 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh { UI_ThemeColorShade(colorid, shade); uiSetRoundBox(15); - uiRoundBox(sx, sy - height, sx + width, sy, 6); + uiRoundBox(sx, sy - height, sx + width, sy, 5); } #define FILE_SHORTEN_END 0 @@ -298,6 +284,9 @@ static int get_file_icon(struct direntry *file) if ( strcmp(file->relname, "..") == 0) { return ICON_FILE_PARENT; } + if(file->flags & BLENDERFILE) { + return ICON_FILE_BLEND; + } return ICON_FILE_FOLDER; } else if (file->flags & BLENDERFILE) @@ -316,6 +305,8 @@ static int get_file_icon(struct direntry *file) return ICON_FILE_FONT; else if (file->flags & BTXFILE) return ICON_FILE_BLANK; + else if (file->flags & COLLADAFILE) + return ICON_FILE_BLANK; else return ICON_FILE_BLANK; } @@ -338,11 +329,13 @@ static void file_draw_icon(uiBlock *block, char *path, int sx, int sy, int icon, static void file_draw_string(int sx, int sy, const char* string, float width, int height, int flag) { + uiStyle *style= U.uistyles.first; int soffs; char fname[FILE_MAXFILE]; float sw; float x,y; + BLI_strncpy(fname,string, FILE_MAXFILE); sw = shorten_string(fname, width, flag ); @@ -350,8 +343,9 @@ static void file_draw_string(int sx, int sy, const char* string, float width, in x = (float)(sx); y = (float)(sy-height); - BLF_position(x, y, 0); - BLF_draw(fname); + uiStyleFontSet(&style->widget); + BLF_position(style->widget.uifont_id, x, y, 0); + BLF_draw(style->widget.uifont_id, fname); } void file_calc_previews(const bContext *C, ARegion *ar) @@ -445,7 +439,7 @@ static void renamebutton_cb(bContext *C, void *arg1, char *oldname) if (!BLI_exists(newname)) { BLI_rename(orgname, newname); /* to make sure we show what is on disk */ - filelist_free(sfile->files); + ED_fileselect_clear(C, sfile); } else { BLI_strncpy(file->relname, oldname, strlen(oldname)+1); } @@ -515,11 +509,18 @@ void file_draw_list(const bContext *C, ARegion *ar) draw_dividers(layout, v2d); } - offset = ED_fileselect_layout_offset(layout, ar->v2d.cur.xmin, -ar->v2d.cur.ymax); + offset = ED_fileselect_layout_offset(layout, 0, ar->v2d.cur.xmin, -ar->v2d.cur.ymax); if (offset<0) offset=0; numfiles_layout = ED_fileselect_layout_numfiles(layout, ar); + /* adjust, so the next row is already drawn when scrolling */ + if (layout->flag & FILE_LAYOUT_HOR) { + numfiles_layout += layout->rows; + } else { + numfiles_layout += layout->columns; + } + for (i=offset; (i < numfiles) && (iflags & EDITING)) { if (params->active_file == i) { - if (file->flags & ACTIVE) colorid= TH_HILITE; + if (file->flags & ACTIVEFILE) colorid= TH_HILITE; else colorid = TH_BACK; - draw_tile(sx, sy-3, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid,20); - } else if (file->flags & ACTIVE) { + draw_tile(sx, sy-1, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid,20); + } else if (file->flags & ACTIVEFILE) { colorid = TH_HILITE; - draw_tile(sx, sy-3, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid,0); + draw_tile(sx, sy-1, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid,0); } } uiSetRoundBox(0); if ( FILE_IMGDISPLAY == params->display ) { - if ( (file->flags & IMAGEFILE) /* || (file->flags & MOVIEFILE) */) { - filelist_loadimage(files, i); - } is_icon = 0; imb = filelist_getimage(files, i); if (!imb) { @@ -624,11 +622,6 @@ void file_draw_list(const bContext *C, ARegion *ar) } } - /* XXX this timer is never removed, cause smooth view operator - to get executed all the time after closing file browser */ - if (!sfile->loadimage_timer) - sfile->loadimage_timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0/30.0); /* max 30 frames/sec. */ - uiEndBlock(C, block); uiDrawBlock(C, block); diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h index 1d239f1741e..c77379b39a0 100644 --- a/source/blender/editors/space_file/file_intern.h +++ b/source/blender/editors/space_file/file_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -58,7 +58,6 @@ void FILE_OT_select_bookmark(struct wmOperatorType *ot); void FILE_OT_bookmark_add(struct wmOperatorType *ot); void FILE_OT_delete_bookmark(struct wmOperatorType *ot); void FILE_OT_hidedot(struct wmOperatorType *ot); -void FILE_OT_loadimages(struct wmOperatorType *ot); void FILE_OT_execute(struct wmOperatorType *ot); void FILE_OT_cancel(struct wmOperatorType *ot); void FILE_OT_parent(struct wmOperatorType *ot); @@ -71,6 +70,7 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot); void FILE_OT_filenum(struct wmOperatorType *ot); void FILE_OT_delete(struct wmOperatorType *ot); void FILE_OT_rename(struct wmOperatorType *ot); +void FILE_OT_smoothscroll(struct wmOperatorType *ot); int file_exec(bContext *C, struct wmOperator *exec_op); int file_cancel_exec(bContext *C, struct wmOperator *unused); @@ -88,9 +88,10 @@ int file_hilight_set(struct SpaceFile *sfile, struct ARegion *ar, int mx, int my /* filesel.c */ float file_string_width(const char* str); float file_font_pointsize(); -void file_change_dir(struct SpaceFile *sfile, int checkdir); +void file_change_dir(bContext *C, int checkdir); int file_select_match(struct SpaceFile *sfile, const char *pattern); void autocomplete_directory(struct bContext *C, char *str, void *arg_v); +void autocomplete_file(struct bContext *C, char *str, void *arg_v); /* file_panels.c */ void file_panels_register(struct ARegionType *art); diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 312118491be..55a44b36a52 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -36,10 +36,7 @@ #ifdef WIN32 #include "BLI_winstuff.h" #endif -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_fileselect.h" @@ -48,7 +45,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "UI_interface.h" #include "UI_view2d.h" #include "WM_api.h" @@ -63,13 +59,13 @@ #include /* for events */ -#define NOTACTIVE 0 +#define NOTACTIVEFILE 0 #define ACTIVATE 1 #define INACTIVATE 2 /* ---------- FILE SELECTION ------------ */ -static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int x, int y) +static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int clamp_bounds, int x, int y) { float fx,fy; int active_file = -1; @@ -77,7 +73,7 @@ static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int x, int y) UI_view2d_region_to_view(v2d, x, y, &fx, &fy); - active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy); + active_file = ED_fileselect_layout_offset(sfile->layout, clamp_bounds, v2d->tot.xmin + fx, v2d->tot.ymax - fy); return active_file; } @@ -90,8 +86,8 @@ static void file_deselect_all(SpaceFile* sfile) for ( i=0; i < numfiles; ++i) { struct direntry* file = filelist_file(sfile->files, i); - if (file && (file->flags & ACTIVE)) { - file->flags &= ~ACTIVE; + if (file && (file->flags & ACTIVEFILE)) { + file->flags &= ~ACTIVEFILE; } } } @@ -125,8 +121,10 @@ static void clamp_to_filelist(int numfiles, int *first_file, int *last_file) } } -static FileSelect file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short selecting, short toggle_one) +static FileSelect file_select(bContext* C, const rcti* rect, short selecting, short toggle_one, short fill) { + ARegion *ar= CTX_wm_region(C); + SpaceFile *sfile= CTX_wm_space_file(C); int first_file = -1; int last_file = -1; int act_file; @@ -136,28 +134,41 @@ static FileSelect file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, s // FileLayout *layout = ED_fileselect_get_layout(sfile, ar); int numfiles = filelist_numfiles(sfile->files); - - params->selstate = NOTACTIVE; - first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax); - last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin); + + params->selstate = NOTACTIVEFILE; + first_file = find_file_mouse(sfile, ar, 1, rect->xmin, rect->ymax); + last_file = find_file_mouse(sfile, ar, 1, rect->xmax, rect->ymin); clamp_to_filelist(numfiles, &first_file, &last_file); + if (fill && (last_file >= 0) && (last_file < numfiles) ) { + int f= last_file; + while (f >= 0) { + struct direntry* file = filelist_file(sfile->files, f); + if (file->flags & ACTIVEFILE) + break; + f--; + } + if (f >= 0) { + first_file = f+1; + } + } + /* select all valid files between first and last indicated */ if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) { for (act_file = first_file; act_file <= last_file; act_file++) { struct direntry* file = filelist_file(sfile->files, act_file); if (toggle_one) { - if (file->flags & ACTIVE) { - file->flags &= ~ACTIVE; + if (file->flags & ACTIVEFILE) { + file->flags &= ~ACTIVEFILE; selecting=0; } else - file->flags |= ACTIVE; + file->flags |= ACTIVEFILE; } else if (selecting) - file->flags |= ACTIVE; + file->flags |= ACTIVEFILE; else - file->flags &= ~ACTIVE; + file->flags &= ~ACTIVEFILE; } } @@ -184,7 +195,7 @@ static FileSelect file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, s BLI_add_slash(params->dir); } - file_change_dir(sfile, 0); + file_change_dir(C, 0); retval = FILE_SELECT_DIR; } } @@ -204,10 +215,9 @@ static FileSelect file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, s static int file_border_select_exec(bContext *C, wmOperator *op) { ARegion *ar= CTX_wm_region(C); - SpaceFile *sfile= CTX_wm_space_file(C); short selecting; rcti rect; - + selecting= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT); rect.xmin= RNA_int_get(op->ptr, "xmin"); rect.ymin= RNA_int_get(op->ptr, "ymin"); @@ -216,7 +226,7 @@ static int file_border_select_exec(bContext *C, wmOperator *op) BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect); - if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, selecting, 0)) { + if (FILE_SELECT_DIR == file_select(C, &rect, selecting, 0, 0)) { WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); } else { WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); @@ -248,6 +258,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event) short val; rcti rect; int extend = RNA_boolean_get(op->ptr, "extend"); + int fill = RNA_boolean_get(op->ptr, "fill"); if(ar->regiontype != RGN_TYPE_WINDOW) return OPERATOR_CANCELLED; @@ -262,7 +273,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event) /* single select, deselect all selected first */ if (!extend) file_deselect_all(sfile); - if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, 1, extend )) + if (FILE_SELECT_DIR == file_select(C, &rect, 1, extend, fill )) WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); else WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); @@ -286,6 +297,7 @@ void FILE_OT_select(wmOperatorType *ot) /* rna */ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first."); + RNA_def_boolean(ot->srna, "fill", 0, "Fill", "Select everything beginning with the last selection."); } static int file_select_all_exec(bContext *C, wmOperator *op) @@ -299,8 +311,8 @@ static int file_select_all_exec(bContext *C, wmOperator *op) /* if any file is selected, deselect all first */ for ( i=0; i < numfiles; ++i) { struct direntry* file = filelist_file(sfile->files, i); - if (file && (file->flags & ACTIVE)) { - file->flags &= ~ACTIVE; + if (file && (file->flags & ACTIVEFILE)) { + file->flags &= ~ACTIVEFILE; select = 0; ED_area_tag_redraw(sa); } @@ -310,7 +322,7 @@ static int file_select_all_exec(bContext *C, wmOperator *op) for ( i=0; i < numfiles; ++i) { struct direntry* file = filelist_file(sfile->files, i); if(file && !S_ISDIR(file->type)) { - file->flags |= ACTIVE; + file->flags |= ACTIVEFILE; ED_area_tag_redraw(sa); } } @@ -346,7 +358,7 @@ static int bookmark_select_exec(bContext *C, wmOperator *op) RNA_string_get(op->ptr, "dir", entry); BLI_strncpy(params->dir, entry, sizeof(params->dir)); BLI_cleanup_dir(G.sce, params->dir); - file_change_dir(sfile, 1); + file_change_dir(C, 1); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); } @@ -379,7 +391,7 @@ static int bookmark_add_exec(bContext *C, wmOperator *op) char name[FILE_MAX]; fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir, 0, 1); - BLI_make_file_string("/", name, BLI_gethome(), ".Bfs"); + BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); fsmenu_write_file(fsmenu, name); } @@ -411,7 +423,7 @@ static int bookmark_delete_exec(bContext *C, wmOperator *op) char name[FILE_MAX]; fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index); - BLI_make_file_string("/", name, BLI_gethome(), ".Bfs"); + BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); fsmenu_write_file(fsmenu, name); ED_area_tag_redraw(sa); } @@ -434,35 +446,6 @@ void FILE_OT_delete_bookmark(wmOperatorType *ot) RNA_def_int(ot->srna, "index", -1, -1, 20000, "Index", "", -1, 20000); } - -static int loadimages_exec(bContext *C, wmOperator *op) -{ - ScrArea *sa= CTX_wm_area(C); - SpaceFile *sfile= CTX_wm_space_file(C); - if (sfile->files) { - filelist_loadimage_timer(sfile->files); - if (filelist_changed(sfile->files)) { - ED_area_tag_redraw(sa); - } - } - - return OPERATOR_FINISHED; -} - -void FILE_OT_loadimages(wmOperatorType *ot) -{ - - /* identifiers */ - ot->name= "Load Images"; - ot->description= "Load selected image(s)"; - ot->idname= "FILE_OT_loadimages"; - - /* api callbacks */ - ot->exec= loadimages_exec; - - ot->poll= ED_operator_file_active; -} - int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my) { FileSelectParams* params; @@ -479,7 +462,7 @@ int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my) my -= ar->winrct.ymin; if(BLI_in_rcti(&ar->v2d.mask, mx, my)) { - actfile = find_file_mouse(sfile, ar, mx , my); + actfile = find_file_mouse(sfile, ar, 0, mx , my); if((actfile >= 0) && (actfile < numfiles)) params->active_file=actfile; @@ -528,8 +511,7 @@ int file_cancel_exec(bContext *C, wmOperator *unused) sfile->op = NULL; if (sfile->files) { - filelist_freelib(sfile->files); - filelist_free(sfile->files); + ED_fileselect_clear(C, sfile); MEM_freeN(sfile->files); sfile->files= NULL; } @@ -563,7 +545,7 @@ void FILE_OT_cancel(struct wmOperatorType *ot) int file_exec(bContext *C, wmOperator *exec_op) { SpaceFile *sfile= CTX_wm_space_file(C); - char name[FILE_MAX]; + char filepath[FILE_MAX]; if(sfile->op) { wmOperator *op= sfile->op; @@ -576,7 +558,7 @@ int file_exec(bContext *C, wmOperator *exec_op) for (i=0; ifiles); i++) { file = filelist_file(sfile->files, i); - if(file->flags & ACTIVE) { + if(file->flags & ACTIVEFILE) { active=1; } } @@ -585,16 +567,23 @@ int file_exec(bContext *C, wmOperator *exec_op) } sfile->op = NULL; - RNA_string_set(op->ptr, "filename", sfile->params->file); - BLI_strncpy(name, sfile->params->dir, sizeof(name)); - RNA_string_set(op->ptr, "directory", name); - strcat(name, sfile->params->file); // XXX unsafe - if(RNA_struct_find_property(op->ptr, "relative_paths")) - if(RNA_boolean_get(op->ptr, "relative_paths")) - BLI_makestringcode(G.sce, name); + BLI_join_dirfile(filepath, sfile->params->dir, sfile->params->file); + if(RNA_struct_find_property(op->ptr, "relative_path")) { + if(RNA_boolean_get(op->ptr, "relative_path")) { + BLI_path_rel(filepath, G.sce); + } + } - RNA_string_set(op->ptr, "path", name); + if(RNA_struct_find_property(op->ptr, "filename")) { + RNA_string_set(op->ptr, "filename", sfile->params->file); + } + if(RNA_struct_find_property(op->ptr, "directory")) { + RNA_string_set(op->ptr, "directory", sfile->params->dir); + } + if(RNA_struct_find_property(op->ptr, "filepath")) { + RNA_string_set(op->ptr, "filepath", filepath); + } /* some ops have multiple files to select */ { @@ -604,7 +593,7 @@ int file_exec(bContext *C, wmOperator *exec_op) if(RNA_struct_find_property(op->ptr, "files")) { for (i=0; ifiles, i); - if(file->flags & ACTIVE) { + if(file->flags & ACTIVEFILE) { if ((file->type & S_IFDIR)==0) { RNA_collection_add(op->ptr, "files", &itemptr); RNA_string_set(&itemptr, "name", file->relname); @@ -616,7 +605,7 @@ int file_exec(bContext *C, wmOperator *exec_op) if(RNA_struct_find_property(op->ptr, "dirs")) { for (i=0; ifiles, i); - if(file->flags & ACTIVE) { + if(file->flags & ACTIVEFILE) { if ((file->type & S_IFDIR)) { RNA_collection_add(op->ptr, "dirs", &itemptr); RNA_string_set(&itemptr, "name", file->relname); @@ -630,12 +619,11 @@ int file_exec(bContext *C, wmOperator *exec_op) folderlist_free(sfile->folders_next); fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1); - BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs"); - fsmenu_write_file(fsmenu_get(), name); + BLI_make_file_string(G.sce, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); + fsmenu_write_file(fsmenu_get(), filepath); WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC); - filelist_freelib(sfile->files); - filelist_free(sfile->files); + ED_fileselect_clear(C, sfile); MEM_freeN(sfile->files); sfile->files= NULL; } @@ -666,7 +654,7 @@ int file_parent_exec(bContext *C, wmOperator *unused) if (BLI_has_parent(sfile->params->dir)) { BLI_parent_dir(sfile->params->dir); BLI_cleanup_dir(G.sce, sfile->params->dir); - file_change_dir(sfile, 0); + file_change_dir(C, 0); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); } } @@ -692,8 +680,8 @@ void FILE_OT_parent(struct wmOperatorType *ot) int file_refresh_exec(bContext *C, wmOperator *unused) { SpaceFile *sfile= CTX_wm_space_file(C); - - file_change_dir(sfile, 1); + + ED_fileselect_clear(C, sfile); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); @@ -725,7 +713,7 @@ int file_previous_exec(bContext *C, wmOperator *unused) folderlist_popdir(sfile->folders_prev, sfile->params->dir); folderlist_pushdir(sfile->folders_next, sfile->params->dir); - file_change_dir(sfile, 1); + file_change_dir(C, 1); } WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); @@ -747,8 +735,8 @@ void FILE_OT_next(struct wmOperatorType *ot) int file_next_exec(bContext *C, wmOperator *unused) { SpaceFile *sfile= CTX_wm_space_file(C); - if(sfile->params) { - if (!sfile->folders_next) + if(sfile->params) { + if (!sfile->folders_next) sfile->folders_next = folderlist_new(); folderlist_pushdir(sfile->folders_prev, sfile->params->dir); @@ -757,13 +745,123 @@ int file_next_exec(bContext *C, wmOperator *unused) // update folder_prev so we can check for it in folderlist_clear_next() folderlist_pushdir(sfile->folders_prev, sfile->params->dir); - file_change_dir(sfile, 1); + file_change_dir(C, 1); } WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); return OPERATOR_FINISHED; } + +/* only meant for timer usage */ +static int file_smoothscroll_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ScrArea *sa = CTX_wm_area(C); + SpaceFile *sfile= CTX_wm_space_file(C); + ARegion *ar, *oldar= CTX_wm_region(C); + int numfiles, offset; + int edit_idx = 0; + int numfiles_layout; + int i; + + /* escape if not our timer */ + if(sfile->smoothscroll_timer==NULL || sfile->smoothscroll_timer!=event->customdata) + return OPERATOR_PASS_THROUGH; + + numfiles = filelist_numfiles(sfile->files); + + /* check if we are editing a name */ + for (i=0; i < numfiles; ++i) + { + struct direntry *file = filelist_file(sfile->files, i); + if (file->flags & EDITING) { + edit_idx=i; + break; + } + } + + /* if we are not editing, we are done */ + if (0==edit_idx) { + WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer); + sfile->smoothscroll_timer=NULL; + return OPERATOR_PASS_THROUGH; + } + + /* we need the correct area for scrolling */ + ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW); + if (!ar || ar->regiontype != RGN_TYPE_WINDOW) { + WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer); + sfile->smoothscroll_timer=NULL; + return OPERATOR_PASS_THROUGH; + } + + offset = ED_fileselect_layout_offset(sfile->layout, 0, ar->v2d.cur.xmin, -ar->v2d.cur.ymax); + if (offset<0) offset=0; + + /* scroll offset is the first file in the row/column we are editing in */ + if (sfile->scroll_offset == 0) { + if (sfile->layout->flag & FILE_LAYOUT_HOR) { + sfile->scroll_offset = (edit_idx/sfile->layout->rows)*sfile->layout->rows; + if (sfile->scroll_offset <= offset) sfile->scroll_offset -= sfile->layout->rows; + } else { + sfile->scroll_offset = (edit_idx/sfile->layout->columns)*sfile->layout->columns; + if (sfile->scroll_offset <= offset) sfile->scroll_offset -= sfile->layout->columns; + } + } + + numfiles_layout = ED_fileselect_layout_numfiles(sfile->layout, ar); + + /* check if we have reached our final scroll position */ + if ( (sfile->scroll_offset >= offset) && (sfile->scroll_offset < offset + numfiles_layout) ) { + WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer); + sfile->smoothscroll_timer=NULL; + return OPERATOR_FINISHED; + } + + /* temporarily set context to the main window region, + * so the scroll operators work */ + CTX_wm_region_set(C, ar); + + /* scroll one step in the desired direction */ + if (sfile->scroll_offset < offset) { + if (sfile->layout->flag & FILE_LAYOUT_HOR) { + WM_operator_name_call(C, "VIEW2D_OT_scroll_left", 0, NULL); + } else { + WM_operator_name_call(C, "VIEW2D_OT_scroll_up", 0, NULL); + } + + } else { + if (sfile->layout->flag & FILE_LAYOUT_HOR) { + WM_operator_name_call(C, "VIEW2D_OT_scroll_right", 0, NULL); + } else { + WM_operator_name_call(C, "VIEW2D_OT_scroll_down", 0, NULL); + } + } + + ED_region_tag_redraw(CTX_wm_region(C)); + + /* and restore context */ + CTX_wm_region_set(C, oldar); + + return OPERATOR_FINISHED; +} + + +void FILE_OT_smoothscroll(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Smooth Scroll"; + ot->idname= "FILE_OT_smoothscroll"; + ot->description="Smooth scroll to make editable file visible."; + + /* api callbacks */ + ot->invoke= file_smoothscroll_invoke; + + ot->poll= ED_operator_file_active; +} + + /* create a new, non-existing folder name, returns 1 if successful, 0 if name couldn't be created. The actual name is returned in 'name', 'folder' contains the complete path, including the new folder name. */ @@ -813,6 +911,13 @@ int file_directory_new_exec(bContext *C, wmOperator *op) /* now remember file to jump into editing */ BLI_strncpy(sfile->params->renamefile, name, FILE_MAXFILE); + + /* set timer to smoothly view newly generated file */ + sfile->smoothscroll_timer = WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0/1000.0); /* max 30 frs/sec */ + sfile->scroll_offset=0; + + /* reload dir to make sure we're seeing what's in the directory */ + ED_fileselect_clear(C, sfile); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); return OPERATOR_FINISHED; @@ -834,33 +939,22 @@ void FILE_OT_directory_new(struct wmOperatorType *ot) int file_directory_exec(bContext *C, wmOperator *unused) { - char tmpstr[FILE_MAX]; - SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { if ( sfile->params->dir[0] == '~' ) { - if (sfile->params->dir[1] == '\0') { - BLI_strncpy(sfile->params->dir, BLI_gethome(), sizeof(sfile->params->dir) ); - } else { - /* replace ~ with home */ - char homestr[FILE_MAX]; - char *d = &sfile->params->dir[1]; - - while ( (*d == '\\') || (*d == '/') ) - d++; - BLI_strncpy(homestr, BLI_gethome(), FILE_MAX); - BLI_join_dirfile(tmpstr, homestr, d); - BLI_strncpy(sfile->params->dir, tmpstr, sizeof(sfile->params->dir)); - } + char tmpstr[sizeof(sfile->params->dir)-1]; + strncpy(tmpstr, sfile->params->dir+1, sizeof(tmpstr)); + BLI_join_dirfile(sfile->params->dir, BLI_gethome(), tmpstr); } + #ifdef WIN32 if (sfile->params->dir[0] == '\0') get_default_root(sfile->params->dir); #endif BLI_cleanup_dir(G.sce, sfile->params->dir); BLI_add_slash(sfile->params->dir); - file_change_dir(sfile, 1); + file_change_dir(C, 1); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); } @@ -903,13 +997,11 @@ int file_hidedot_exec(bContext *C, wmOperator *unused) if(sfile->params) { sfile->params->flag ^= FILE_HIDE_DOT; - filelist_free(sfile->files); - sfile->params->active_file = -1; + ED_fileselect_clear(C, sfile); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); } return OPERATOR_FINISHED; - } @@ -1089,6 +1181,7 @@ int file_delete_exec(bContext *C, wmOperator *op) file = filelist_file(sfile->files, sfile->params->active_file); BLI_make_file_string(G.sce, str, sfile->params->dir, file->relname); BLI_delete(str, 0, 0); + ED_fileselect_clear(C, sfile); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index b6152f26947..4a505bc022f 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -33,8 +33,6 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -42,7 +40,6 @@ #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "WM_api.h" #include "WM_types.h" @@ -185,14 +182,14 @@ static void file_panel_operator(const bContext *C, Panel *pa) if(flag & PROP_HIDDEN) continue; - if(strcmp(RNA_property_identifier(prop), "path") == 0) + if(strcmp(RNA_property_identifier(prop), "filepath") == 0) continue; if(strcmp(RNA_property_identifier(prop), "directory") == 0) continue; if(strcmp(RNA_property_identifier(prop), "filename") == 0) continue; - uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0); + uiItemFullR(pa->layout, op->ptr, prop, -1, 0, 0, NULL, 0); empty= 0; } RNA_STRUCT_END; diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index 3631e0743da..70ef857699a 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -34,10 +34,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef WIN32 #include #else @@ -55,6 +51,7 @@ #include "BLI_winstuff.h" #endif +#include "BKE_context.h" #include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_library.h" @@ -83,29 +80,34 @@ #include "PIL_time.h" -#include "UI_interface.h" + +#include "WM_api.h" +#include "WM_types.h" #include "filelist.h" -/* Elubie: VERY, really very ugly and evil! Remove asap!!! */ -/* for state of file */ -#define ACTIVE 2 - /* max length of library group name within filesel */ #define GROUP_MAX 32 -static void *exec_loadimages(void *list_v); - struct FileList; typedef struct FileImage { struct FileImage *next, *prev; + char path[FILE_MAX]; + unsigned int flags; int index; - short lock; short done; - struct FileList* filelist; + ImBuf *img; } FileImage; +typedef struct ThumbnailJob { + ListBase loadimages; + short *stop; + short *do_update; + struct FileList* filelist; + ReportList reports; +} ThumbnailJob; + typedef struct FileList { struct direntry *filelist; @@ -122,10 +124,9 @@ typedef struct FileList struct BlendHandle *libfiledata; short hide_parent; - void (*read)(struct FileList *); + void (*readf)(struct FileList *); + int (*filterf)(struct direntry* file, const char* dir, unsigned int filter, short hide_dot); - ListBase loadimages; - ListBase threads; } FileList; typedef struct FolderList @@ -160,7 +161,7 @@ static int compare_name(const void *a1, const void *a2) { const struct direntry *entry1=a1, *entry2=a2; - /* type is is equal to stat.st_mode */ + /* type is equal to stat.st_mode */ if (S_ISDIR(entry1->type)){ if (S_ISDIR(entry2->type)==0) return (-1); @@ -257,7 +258,7 @@ static int compare_extension(const void *a1, const void *a2) { if (!sufix1) sufix1= nil; if (!sufix2) sufix2= nil; - /* type is is equal to stat.st_mode */ + /* type is equal to stat.st_mode */ if (S_ISDIR(entry1->type)){ if (S_ISDIR(entry2->type)==0) return (-1); @@ -281,63 +282,91 @@ static int compare_extension(const void *a1, const void *a2) { return (BLI_strcasecmp(sufix1, sufix2)); } +static int is_hidden_file(const char* filename, short hide_dot) +{ + int is_hidden=0; + + if (hide_dot) { + if(filename[0]=='.' && filename[1]!='.' && filename[1]!=0) { + is_hidden=1; /* ignore .file */ + } else if (((filename[0] == '.') && (filename[1] == 0) )) { + is_hidden=1; /* ignore . */ + } else { + int len=strlen(filename); + if( (len>0) && (filename[len-1]=='~') ) { + is_hidden=1; /* ignore file~ */ + } + } + } else { + if (((filename[0] == '.') && (filename[1] == 0) )) { + is_hidden=1; /* ignore . */ + } + } + return is_hidden; +} + +static int is_filtered_file(struct direntry* file, const char* dir, unsigned int filter, short hide_dot) +{ + int is_filtered=0; + if (filter) { + if (file->flags & filter) { + is_filtered=1; + } else if (file->type & S_IFDIR) { + if (filter & FOLDERFILE) { + is_filtered = 1; + } + } + } else { + is_filtered = 1; + } + return is_filtered && !is_hidden_file(file->relname, hide_dot); +} + +static int is_filtered_lib(struct direntry* file, const char* dir, unsigned int filter, short hide_dot) +{ + int is_filtered=0; + char tdir[FILE_MAX], tgroup[GROUP_MAX]; + if (BLO_is_a_library(dir, tdir, tgroup)) { + is_filtered = !is_hidden_file(file->relname, hide_dot); + } else { + is_filtered = is_filtered_file(file, dir, filter, hide_dot); + } + return is_filtered; +} + +static int is_filtered_main(struct direntry* file, const char* dir, unsigned int filter, short hide_dot) +{ + return !is_hidden_file(file->relname, hide_dot); +} + void filelist_filter(FileList* filelist) { - /* char dir[FILE_MAX], group[GROUP_MAX]; XXXXX */ int num_filtered = 0; int i, j; if (!filelist->filelist) return; - - /* XXXXX TODO: check if the filter can be handled outside the filelist - if ( ( (filelist->type == FILE_LOADLIB) && BIF_filelist_islibrary(filelist, dir, group)) - || (filelist->type == FILE_MAIN) ) { - filelist->filter = 0; - } - */ - - if (!filelist->filter) { - if (filelist->fidx) { - MEM_freeN(filelist->fidx); - filelist->fidx = NULL; - } - filelist->fidx = (int *)MEM_callocN(filelist->numfiles*sizeof(int), "filteridx"); - for (i = 0; i < filelist->numfiles; ++i) { - filelist->fidx[i] = i; - } - filelist->numfiltered = filelist->numfiles; - return; - } // How many files are left after filter ? for (i = 0; i < filelist->numfiles; ++i) { - if (filelist->filelist[i].flags & filelist->filter) { + struct direntry *file = &filelist->filelist[i]; + if ( filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot) ) { num_filtered++; } - else if (filelist->filelist[i].type & S_IFDIR) { - if (filelist->filter & FOLDERFILE) { - num_filtered++; - } - } } if (filelist->fidx) { - MEM_freeN(filelist->fidx); - filelist->fidx = NULL; + MEM_freeN(filelist->fidx); + filelist->fidx = NULL; } filelist->fidx = (int *)MEM_callocN(num_filtered*sizeof(int), "filteridx"); filelist->numfiltered = num_filtered; for (i = 0, j=0; i < filelist->numfiles; ++i) { - if (filelist->filelist[i].flags & filelist->filter) { + struct direntry *file = &filelist->filelist[i]; + if ( filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot) ) { filelist->fidx[j++] = i; } - else if (filelist->filelist[i].type & S_IFDIR) { - if (filelist->filter & FOLDERFILE) { - filelist->fidx[j++] = i; - } - } } } @@ -346,7 +375,7 @@ void filelist_init_icons() short x, y, k; ImBuf *bbuf; ImBuf *ibuf; - bbuf = IMB_ibImageFromMemory((int *)datatoc_prvicons, datatoc_prvicons_size, IB_rect); + bbuf = IMB_ibImageFromMemory((unsigned char*)datatoc_prvicons, datatoc_prvicons_size, IB_rect); if (bbuf) { for (y=0; yread = filelist_read_main; + p->readf = filelist_read_main; + p->filterf = is_filtered_main; break; case FILE_LOADLIB: - p->read = filelist_read_library; + p->readf = filelist_read_library; + p->filterf = is_filtered_lib; break; default: - p->read = filelist_read_dir; + p->readf = filelist_read_dir; + p->filterf = is_filtered_file; } return p; @@ -501,9 +533,6 @@ void filelist_free(struct FileList* filelist) printf("Attempting to delete empty filelist.\n"); return; } - - BLI_end_threads(&filelist->threads); - BLI_freelistN(&filelist->loadimages); if (filelist->fidx) { MEM_freeN(filelist->fidx); @@ -566,123 +595,31 @@ void filelist_imgsize(struct FileList* filelist, short w, short h) filelist->prv_h = h; } - -static void *exec_loadimages(void *list_v) -{ - FileImage* img = (FileImage*)list_v; - struct FileList *filelist = img->filelist; - - ImBuf *imb = NULL; - int fidx = img->index; - - if ( filelist->filelist[fidx].flags & IMAGEFILE ) { - imb = IMB_thumb_manage(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL, THB_SOURCE_IMAGE); - } else if ( filelist->filelist[fidx].flags & MOVIEFILE ) { - imb = IMB_thumb_manage(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL, THB_SOURCE_MOVIE); - if (!imb) { - /* remember that file can't be loaded via IMB_open_anim */ - filelist->filelist[fidx].flags &= ~MOVIEFILE; - filelist->filelist[fidx].flags |= MOVIEFILE_ICON; - } - } - if (imb) { - IMB_freeImBuf(imb); - } - img->done=1; - return 0; -} - short filelist_changed(struct FileList* filelist) { return filelist->changed; } -void filelist_loadimage_timer(struct FileList* filelist) -{ - FileImage *limg = filelist->loadimages.first; - short refresh=0; - - // as long as threads are available and there is work to do - while (limg) { - if (BLI_available_threads(&filelist->threads)>0) { - if (!limg->lock) { - limg->lock=1; - BLI_insert_thread(&filelist->threads, limg); - } - } - if (limg->done) { - FileImage *oimg = limg; - BLI_remove_thread(&filelist->threads, oimg); - /* brecht: keep failed images in the list, otherwise - it keeps trying to load them over and over? - BLI_remlink(&filelist->loadimages, oimg); - MEM_freeN(oimg);*/ - limg = oimg->next; - refresh = 1; - } else { - limg= limg->next; - } - } - filelist->changed=refresh; -} - -void filelist_loadimage(struct FileList* filelist, int index) +struct ImBuf * filelist_loadimage(struct FileList* filelist, int index) { ImBuf *imb = NULL; - int imgwidth = filelist->prv_w; - int imgheight = filelist->prv_h; - short ex, ey, dx, dy; - float scaledx, scaledy; int fidx = 0; if ( (index < 0) || (index >= filelist->numfiltered) ) { - return; + return NULL; } fidx = filelist->fidx[index]; - - if (!filelist->filelist[fidx].image) + imb = filelist->filelist[fidx].image; + if (!imb) { - - if ( (filelist->filelist[fidx].flags & IMAGEFILE) || (filelist->filelist[fidx].flags & MOVIEFILE) ) { - imb = IMB_thumb_read(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL); + if ( (filelist->filelist[fidx].flags & IMAGEFILE) || (filelist->filelist[fidx].flags & MOVIEFILE) ) { + imb = IMB_thumb_read(filelist->filelist[fidx].path, THB_NORMAL); } if (imb) { - if (imb->x > imb->y) { - scaledx = (float)imgwidth; - scaledy = ( (float)imb->y/(float)imb->x )*imgwidth; - } - else { - scaledy = (float)imgheight; - scaledx = ( (float)imb->x/(float)imb->y )*imgheight; - } - ex = (short)scaledx; - ey = (short)scaledy; - - dx = imgwidth - ex; - dy = imgheight - ey; - - // IMB_scaleImBuf(imb, ex, ey); filelist->filelist[fidx].image = imb; - } else { - /* prevent loading image twice */ - FileImage* limg = filelist->loadimages.first; - short found= 0; - while(limg) { - if (limg->index == fidx) { - found= 1; - break; - } - limg= limg->next; - } - if (!found) { - FileImage* limg = MEM_callocN(sizeof(struct FileImage), "loadimage"); - limg->index= fidx; - limg->lock= 0; - limg->filelist= filelist; - BLI_addtail(&filelist->loadimages, limg); - } - } + } } + return imb; } struct ImBuf * filelist_getimage(struct FileList* filelist, int index) @@ -709,13 +646,13 @@ struct ImBuf * filelist_geticon(struct FileList* filelist, int index) fidx = filelist->fidx[index]; file = &filelist->filelist[fidx]; if (file->type & S_IFDIR) { - if ( strcmp(filelist->filelist[fidx].relname, "..") == 0) { - ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT]; - } else if ( strcmp(filelist->filelist[fidx].relname, ".") == 0) { - ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH]; - } else { - ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER]; - } + if ( strcmp(filelist->filelist[fidx].relname, "..") == 0) { + ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT]; + } else if ( strcmp(filelist->filelist[fidx].relname, ".") == 0) { + ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH]; + } else { + ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER]; + } } else { ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE]; } @@ -798,16 +735,11 @@ static void filelist_read_dir(struct FileList* filelist) BLI_getwdN(wdir); BLI_cleanup_dir(G.sce, filelist->dir); - BLI_hide_dot_files(filelist->hide_dot); filelist->numfiles = BLI_getdir(filelist->dir, &(filelist->filelist)); - if(!chdir(wdir)) /* fix warning about not checking return value */; + if(!chdir(wdir)) {} /* fix warning about not checking return value */ filelist_setfiletypes(filelist, G.have_quicktime); filelist_filter(filelist); - - if (!filelist->threads.first) { - BLI_init_threads(&filelist->threads, exec_loadimages, 2); - } } static void filelist_read_main(struct FileList* filelist) @@ -847,7 +779,7 @@ static void filelist_read_library(struct FileList* filelist) void filelist_readdir(struct FileList* filelist) { - filelist->read(filelist); + filelist->readf(filelist); } int filelist_empty(struct FileList* filelist) @@ -874,11 +806,10 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) file->type= file->s.st_mode; /* restore the mess below */ /* Don't check extensions for directories */ - if (file->type & S_IFDIR) + if (file->type & S_IFDIR) { continue; - - - + } + if(BLO_has_bfile_extension(file->relname)) { file->flags |= BLENDERFILE; } else if(BLI_testextensie(file->relname, ".py")) { @@ -895,6 +826,8 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) file->flags |= FTFONTFILE; } else if(BLI_testextensie(file->relname, ".btx")) { file->flags |= BTXFILE; + } else if(BLI_testextensie(file->relname, ".dae")) { + file->flags |= COLLADAFILE; } else if (has_quicktime){ if( BLI_testextensie(file->relname, ".int") || BLI_testextensie(file->relname, ".inta") @@ -914,6 +847,7 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) || BLI_testextensie(file->relname, ".psd") || BLI_testextensie(file->relname, ".tif") || BLI_testextensie(file->relname, ".tiff") + || BLI_testextensie(file->relname, ".tx") || BLI_testextensie(file->relname, ".pct") || BLI_testextensie(file->relname, ".pict") || BLI_testextensie(file->relname, ".pntg") //macpaint @@ -926,7 +860,7 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) #ifdef WITH_OPENEXR || BLI_testextensie(file->relname, ".exr") #endif - ) { + ) { file->flags |= IMAGEFILE; } else if(BLI_testextensie(file->relname, ".avi") @@ -939,6 +873,7 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) || BLI_testextensie(file->relname, ".wmv") || BLI_testextensie(file->relname, ".ogv") || BLI_testextensie(file->relname, ".mpeg") + || BLI_testextensie(file->relname, ".dv") || BLI_testextensie(file->relname, ".mpg") || BLI_testextensie(file->relname, ".mpg2") || BLI_testextensie(file->relname, ".vob") @@ -976,6 +911,7 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) || BLI_testextensie(file->relname, ".iff") || BLI_testextensie(file->relname, ".tif") || BLI_testextensie(file->relname, ".tiff") + || BLI_testextensie(file->relname, ".tx") || BLI_testextensie(file->relname, ".hdr") #ifdef WITH_DDS || BLI_testextensie(file->relname, ".dds") @@ -996,6 +932,7 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime) || BLI_testextensie(file->relname, ".mv") || BLI_testextensie(file->relname, ".wmv") || BLI_testextensie(file->relname, ".ogv") + || BLI_testextensie(file->relname, ".dv") || BLI_testextensie(file->relname, ".mpeg") || BLI_testextensie(file->relname, ".mpg") || BLI_testextensie(file->relname, ".mpg2") @@ -1029,15 +966,15 @@ void filelist_swapselect(struct FileList* filelist) file= filelist->filelist; for(num=0; numnumfiles; num++, file++) { - if(file->flags & ACTIVE) { + if(file->flags & ACTIVEFILE) { act= 1; break; } } file= filelist->filelist+2; for(num=2; numnumfiles; num++, file++) { - if(act) file->flags &= ~ACTIVE; - else file->flags |= ACTIVE; + if(act) file->flags &= ~ACTIVEFILE; + else file->flags |= ACTIVEFILE; } } @@ -1230,7 +1167,7 @@ void filelist_from_main(struct FileList *filelist) /* make files */ idcode= groupname_to_code(filelist->dir); - lb= wich_libbase(G.main, idcode ); + lb= which_libbase(G.main, idcode ); if(lb==0) return; id= lb->first; @@ -1275,10 +1212,10 @@ void filelist_from_main(struct FileList *filelist) #if 0 // XXXXX TODO show the selection status of the objects if(!filelist->has_func) { /* F4 DATA BROWSE */ if(idcode==ID_OB) { - if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVE; + if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVEFILE; } else if(idcode==ID_SCE) { - if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->flags |= ACTIVE; + if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->flags |= ACTIVEFILE; } } #endif @@ -1315,3 +1252,115 @@ void filelist_from_main(struct FileList *filelist) filelist_filter(filelist); } +static void thumbnail_joblist_free(ThumbnailJob *tj) +{ + FileImage* limg = tj->loadimages.first; + + /* free the images not yet copied to the filelist -> these will get freed with the filelist */ + while (limg != tj->loadimages.last) { + if ((limg->img) && (!limg->done)) { + IMB_freeImBuf(limg->img); + } + limg = limg->next; + } + BLI_freelistN(&tj->loadimages); +} + +static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *progress) +{ + ThumbnailJob *tj= tjv; + FileImage* limg = tj->loadimages.first; + + tj->stop= stop; + tj->do_update= do_update; + + while ( (*stop==0) && (limg) ) { + if ( limg->flags & IMAGEFILE ) { + limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_IMAGE); + } else if ( limg->flags & BLENDERFILE ) { + limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_BLEND); + } else if ( limg->flags & MOVIEFILE ) { + limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_MOVIE); + if (!limg->img) { + /* remember that file can't be loaded via IMB_open_anim */ + limg->flags &= ~MOVIEFILE; + limg->flags |= MOVIEFILE_ICON; + } + } + *do_update = 1; + PIL_sleep_ms(10); + limg = limg->next; + } +} + +static void thumbnails_update(void *tjv) +{ + ThumbnailJob *tj= tjv; + + if (tj->filelist && tj->filelist->filelist) { + FileImage* limg = tj->loadimages.first; + while (limg) { + if (!limg->done && limg->img) { + tj->filelist->filelist[limg->index].image = limg->img; + /* update flag for movie files where thumbnail can't be created */ + if (limg->flags & MOVIEFILE_ICON) { + tj->filelist->filelist[limg->index].flags &= ~MOVIEFILE; + tj->filelist->filelist[limg->index].flags |= MOVIEFILE_ICON; + } + limg->done=1; + } + limg = limg->next; + } + } +} + +static void thumbnails_free(void *tjv) +{ + ThumbnailJob *tj= tjv; + thumbnail_joblist_free(tj); + MEM_freeN(tj); +} + + +void thumbnails_start(struct FileList* filelist, const struct bContext* C) +{ + wmJob *steve; + ThumbnailJob *tj; + int idx; + + /* prepare job data */ + tj= MEM_callocN(sizeof(ThumbnailJob), "thumbnails\n"); + tj->filelist = filelist; + for (idx = 0; idx < filelist->numfiles;idx++) { + if (!filelist->filelist[idx].image) { + if ( (filelist->filelist[idx].flags & (IMAGEFILE|MOVIEFILE|BLENDERFILE)) ) { + FileImage* limg = MEM_callocN(sizeof(struct FileImage), "loadimage"); + BLI_strncpy(limg->path, filelist->filelist[idx].path, FILE_MAX); + limg->index= idx; + limg->flags= filelist->filelist[idx].flags; + BLI_addtail(&tj->loadimages, limg); + } + } + } + + BKE_reports_init(&tj->reports, RPT_PRINT); + + /* setup job */ + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), filelist, "Thumbnails", 0); + WM_jobs_customdata(steve, tj, thumbnails_free); + WM_jobs_timer(steve, 0.5, NC_WINDOW, NC_WINDOW); + WM_jobs_callbacks(steve, thumbnails_startjob, NULL, thumbnails_update, NULL); + + /* start the job */ + WM_jobs_start(CTX_wm_manager(C), steve); +} + +void thumbnails_stop(struct FileList* filelist, const struct bContext* C) +{ + WM_jobs_kill(CTX_wm_manager(C), filelist, NULL); +} + +int thumbnails_running(struct FileList* filelist, const struct bContext* C) +{ + return WM_jobs_test(CTX_wm_manager(C), filelist); +} diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h index 8a0e5ebdbc3..b2a86b9c764 100644 --- a/source/blender/editors/space_file/filelist.h +++ b/source/blender/editors/space_file/filelist.h @@ -61,8 +61,6 @@ void filelist_setfilter(struct FileList* filelist, unsigned int filter); void filelist_filter(struct FileList* filelist); void filelist_swapselect(struct FileList* filelist); void filelist_imgsize(struct FileList* filelist, short w, short h); -void filelist_loadimage(struct FileList* filelist, int index); -void filelist_loadimage_timer(struct FileList* filelist); struct ImBuf * filelist_getimage(struct FileList* filelist, int index); struct ImBuf * filelist_geticon(struct FileList* filelist, int index); short filelist_changed(struct FileList* filelist); @@ -86,6 +84,10 @@ void folderlist_popdir(struct ListBase* folderlist, char *dir); void folderlist_pushdir(struct ListBase* folderlist, const char *dir); int folderlist_clear_next(struct SpaceFile* sfile); +void thumbnails_stop(struct FileList* filelist, const struct bContext* C); +void thumbnails_start(struct FileList* filelist, const struct bContext* C); +int thumbnails_running(struct FileList* filelist, const struct bContext* C); + #ifdef __cplusplus } #endif diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index a82e4ba6fed..086d4f9cce2 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -42,11 +42,18 @@ #include #endif +/* path/file handeling stuff */ +#ifndef WIN32 + #include + #include +#else + #include + #include "BLI_winstuff.h" +#endif + #include "DNA_space_types.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -55,16 +62,15 @@ #include "BLI_storage_types.h" #include "BLI_dynstr.h" +#include "BLO_readfile.h" + #include "BKE_context.h" #include "BKE_screen.h" #include "BKE_global.h" #include "BLF_api.h" -#include "DNA_userdef_types.h" -#include "ED_screen.h" -#include "ED_util.h" #include "ED_fileselect.h" #include "WM_api.h" @@ -76,22 +82,14 @@ #include "RNA_access.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "file_intern.h" #include "filelist.h" -#if defined __BeOS -static int fnmatch(const char *pattern, const char *string, int flags) -{ - return 0; -} -#elif defined WIN32 && !defined _LIBC - /* use fnmatch included in blenlib */ - #include "BLI_fnmatch.h" +#if defined WIN32 && !defined _LIBC +# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */ #else - #include +# include #endif FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile) @@ -104,7 +102,6 @@ FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile) short ED_fileselect_set_params(SpaceFile *sfile) { - char name[FILE_MAX], dir[FILE_MAX], file[FILE_MAX]; FileSelectParams *params; wmOperator *op = sfile->op; @@ -112,10 +109,7 @@ short ED_fileselect_set_params(SpaceFile *sfile) if (!sfile->params) { sfile->params= MEM_callocN(sizeof(FileSelectParams), "fileselparams"); /* set path to most recently opened .blend */ - BLI_strncpy(sfile->params->dir, G.sce, sizeof(sfile->params->dir)); - BLI_split_dirfile(G.sce, dir, file); - BLI_strncpy(sfile->params->file, file, sizeof(sfile->params->file)); - BLI_make_file_string(G.sce, sfile->params->dir, dir, ""); /* XXX needed ? - also solve G.sce */ + BLI_split_dirfile(G.sce, sfile->params->dir, sfile->params->file); } params = sfile->params; @@ -129,19 +123,33 @@ short ED_fileselect_set_params(SpaceFile *sfile) else params->type = FILE_SPECIAL; - if (RNA_property_is_set(op->ptr, "path")) { - RNA_string_get(op->ptr, "path", name); + if (RNA_struct_find_property(op->ptr, "filepath") && RNA_property_is_set(op->ptr, "filepath")) { + char name[FILE_MAX]; + RNA_string_get(op->ptr, "filepath", name); if (params->type == FILE_LOADLIB) { BLI_strncpy(params->dir, name, sizeof(params->dir)); - BLI_cleanup_dir(G.sce, params->dir); - } else { - /* if operator has path set, use it, otherwise keep the last */ - BLI_convertstringcode(name, G.sce); - BLI_split_dirfile(name, dir, file); - BLI_strncpy(params->file, file, sizeof(params->file)); - BLI_make_file_string(G.sce, params->dir, dir, ""); /* XXX needed ? - also solve G.sce */ + sfile->params->file[0]= '\0'; + } + else { + BLI_split_dirfile(name, sfile->params->dir, sfile->params->file); } } + else { + if (RNA_struct_find_property(op->ptr, "directory") && RNA_property_is_set(op->ptr, "directory")) { + RNA_string_get(op->ptr, "directory", params->dir); + sfile->params->file[0]= '\0'; + } + + if (RNA_struct_find_property(op->ptr, "filename") && RNA_property_is_set(op->ptr, "filename")) { + RNA_string_get(op->ptr, "filename", params->file); + } + } + + if(params->dir[0]) { + BLI_cleanup_dir(G.sce, params->dir); + BLI_path_abs(params->dir, G.sce); + } + params->filter = 0; if(RNA_struct_find_property(op->ptr, "filter_blender")) params->filter |= RNA_boolean_get(op->ptr, "filter_blender") ? BLENDERFILE : 0; @@ -163,8 +171,15 @@ short ED_fileselect_set_params(SpaceFile *sfile) params->filter |= RNA_boolean_get(op->ptr, "filter_folder") ? FOLDERFILE : 0; if(RNA_struct_find_property(op->ptr, "filter_btx")) params->filter |= RNA_boolean_get(op->ptr, "filter_btx") ? BTXFILE : 0; - if (params->filter != 0) - params->flag |= FILE_FILTER; + if(RNA_struct_find_property(op->ptr, "filter_collada")) + params->filter |= RNA_boolean_get(op->ptr, "filter_collada") ? COLLADAFILE : 0; + if (params->filter != 0) { + if (U.uiflag & USER_FILTERFILEEXTS) { + params->flag |= FILE_FILTER; + } else { + params->flag &= ~FILE_FILTER; + } + } if (U.uiflag & USER_HIDE_DOT) { params->flag |= FILE_HIDE_DOT; @@ -192,7 +207,6 @@ short ED_fileselect_set_params(SpaceFile *sfile) params->filter = 0; params->sort = FILE_SORT_ALPHA; } - return 1; } @@ -209,16 +223,16 @@ int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar) if (layout->flag & FILE_LAYOUT_HOR) { int width = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*layout->tile_border_x; - numfiles = width/layout->tile_w + 1; + numfiles = (float)width/(float)layout->tile_w+0.5; return numfiles*layout->rows; } else { int height = ar->v2d.cur.ymax - ar->v2d.cur.ymin - 2*layout->tile_border_y; - numfiles = height/layout->tile_h + 1; + numfiles = (float)height/(float)layout->tile_h+0.5; return numfiles*layout->columns; } } -int ED_fileselect_layout_offset(FileLayout* layout, int x, int y) +int ED_fileselect_layout_offset(FileLayout* layout, int clamp_bounds, int x, int y) { int offsetx, offsety; int active_file; @@ -229,9 +243,14 @@ int ED_fileselect_layout_offset(FileLayout* layout, int x, int y) offsetx = (x)/(layout->tile_w + 2*layout->tile_border_x); offsety = (y)/(layout->tile_h + 2*layout->tile_border_y); - if (offsetx > layout->columns-1) return -1 ; - if (offsety > layout->rows-1) return -1 ; - + if (clamp_bounds) { + CLAMP(offsetx, 0, layout->columns-1); + CLAMP(offsety, 0, layout->rows-1); + } else { + if (offsetx > layout->columns-1) return -1 ; + if (offsety > layout->rows-1) return -1 ; + } + if (layout->flag & FILE_LAYOUT_HOR) active_file = layout->rows*offsetx + offsety; else @@ -254,7 +273,7 @@ float file_string_width(const char* str) { uiStyle *style= U.uistyles.first; uiStyleFontSet(&style->widget); - return BLF_width((char *)str); + return BLF_width(style->widget.uifont_id, (char *)str); } float file_font_pointsize() @@ -263,7 +282,7 @@ float file_font_pointsize() char tmp[2] = "X"; uiStyle *style= U.uistyles.first; uiStyleFontSet(&style->widget); - s = BLF_height(tmp); + s = BLF_height(style->widget.uifont_id, tmp); return style->widget.points; } @@ -391,24 +410,25 @@ FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar return sfile->layout; } -void file_change_dir(struct SpaceFile *sfile, int checkdir) +void file_change_dir(bContext *C, int checkdir) { + SpaceFile *sfile= CTX_wm_space_file(C); + if (sfile->params) { + ED_fileselect_clear(C, sfile); + if(checkdir && BLI_is_dir(sfile->params->dir)==0) { BLI_strncpy(sfile->params->dir, filelist_dir(sfile->files), sizeof(sfile->params->dir)); /* could return but just refresh the current dir */ } - filelist_setdir(sfile->files, sfile->params->dir); - + if(folderlist_clear_next(sfile)) folderlist_free(sfile->folders_next); folderlist_pushdir(sfile->folders_prev, sfile->params->dir); - filelist_free(sfile->files); - sfile->params->active_file = -1; } } @@ -423,7 +443,7 @@ int file_select_match(struct SpaceFile *sfile, const char *pattern) for (i = 0; i < n; i++) { file = filelist_file(sfile->files, i); if (fnmatch(pattern, file->relname, 0) == 0) { - file->flags |= ACTIVE; + file->flags |= ACTIVEFILE; match = 1; } } @@ -431,10 +451,55 @@ int file_select_match(struct SpaceFile *sfile, const char *pattern) return match; } - void autocomplete_directory(struct bContext *C, char *str, void *arg_v) { - char tmp[FILE_MAX]; + SpaceFile *sfile= CTX_wm_space_file(C); + + /* search if str matches the beginning of name */ + if(str[0] && sfile->files) { + char dirname[FILE_MAX]; + + DIR *dir; + struct dirent *de; + + BLI_split_dirfile(str, dirname, NULL); + + dir = opendir(dirname); + + if(dir) { + AutoComplete *autocpl= autocomplete_begin(str, FILE_MAX); + + while ((de = readdir(dir)) != NULL) { + if (strcmp(".", de->d_name)==0 || strcmp("..", de->d_name)==0) { + /* pass */ + } + else { + char path[FILE_MAX]; + struct stat status; + + BLI_join_dirfile(path, dirname, de->d_name); + + if (stat(path, &status) == 0) { + if (S_ISDIR(status.st_mode)) { /* is subdir */ + autocomplete_do_name(autocpl, path); + } + } + } + } + closedir(dir); + + autocomplete_end(autocpl, str); + if (BLI_exists(str)) { + BLI_add_slash(str); + } else { + BLI_strncpy(sfile->params->dir, str, sizeof(sfile->params->dir)); + } + } + } +} + +void autocomplete_file(struct bContext *C, char *str, void *arg_v) +{ SpaceFile *sfile= CTX_wm_space_file(C); /* search if str matches the beginning of name */ @@ -445,18 +510,24 @@ void autocomplete_directory(struct bContext *C, char *str, void *arg_v) for(i= 0; ifiles, i); - const char* dir = filelist_dir(sfile->files); - if (file && S_ISDIR(file->type)) { - // BLI_make_file_string(G.sce, tmp, dir, file->relname); - BLI_join_dirfile(tmp, dir, file->relname); - autocomplete_do_name(autocpl,tmp); + if (file && S_ISREG(file->type)) { + autocomplete_do_name(autocpl, file->relname); } } autocomplete_end(autocpl, str); - if (BLI_exists(str)) { - BLI_add_slash(str); - } else { - BLI_make_exist(str); - } } } + +void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile) +{ + thumbnails_stop(sfile->files, C); + filelist_freelib(sfile->files); + filelist_free(sfile->files); + sfile->params->active_file = -1; + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL); +} + +void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile) +{ + thumbnails_stop(sfile->files, C); +} diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c index d3e859602d7..6699c0b8bc7 100644 --- a/source/blender/editors/space_file/fsmenu.c +++ b/source/blender/editors/space_file/fsmenu.c @@ -248,12 +248,41 @@ void fsmenu_write_file(struct FSMenu* fsmenu, const char *filename) fclose(fp); } -void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) +void fsmenu_read_bookmarks(struct FSMenu* fsmenu, const char *filename) { char line[256]; FSMenuCategory category = FS_CATEGORY_BOOKMARKS; FILE *fp; + fp = fopen(filename, "r"); + if (!fp) return; + + while ( fgets ( line, 256, fp ) != NULL ) /* read a line */ + { + if (strncmp(line, "[Bookmarks]", 11)==0){ + category = FS_CATEGORY_BOOKMARKS; + } else if (strncmp(line, "[Recent]", 8)==0){ + category = FS_CATEGORY_RECENT; + } else { + int len = strlen(line); + if (len>0) { + if (line[len-1] == '\n') { + line[len-1] = '\0'; + } + if (BLI_exist(line)) { + fsmenu_insert_entry(fsmenu, category, line, 0, 1); + } + } + } + } + fclose(fp); +} + +void fsmenu_read_system(struct FSMenu* fsmenu) +{ + char line[256]; + FILE *fp; + #ifdef WIN32 /* Add the drive names to the listing */ { @@ -266,7 +295,7 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) for (i=2; i < 26; i++) { if ((tmp>>i) & 1) { - tmps[0]='a'+i; + tmps[0]='A'+i; tmps[1]=':'; tmps[2]='\\'; tmps[3]=0; @@ -429,15 +458,14 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) #else /* unix */ { - char dir[FILE_MAXDIR]; char *home= BLI_gethome(); if(home) { - BLI_snprintf(dir, FILE_MAXDIR, "%s/", home); - fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, dir, 1, 0); - BLI_snprintf(dir, FILE_MAXDIR, "%s/Desktop/", home); - if (BLI_exists(dir)) { - fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, dir, 1, 0); + BLI_snprintf(line, FILE_MAXDIR, "%s/", home); + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); + BLI_snprintf(line, FILE_MAXDIR, "%s/Desktop/", home); + if (BLI_exists(line)) { + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0); } } @@ -446,7 +474,6 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) #ifdef __linux__ /* loop over mount points */ struct mntent *mnt; - FILE *fp; int len; fp = setmntent (MOUNTED, "r"); @@ -461,8 +488,8 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) len= strlen(mnt->mnt_dir); if(len && mnt->mnt_dir[len-1] != '/') { - BLI_snprintf(dir, FILE_MAXDIR, "%s/", mnt->mnt_dir); - fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, dir, 1, 0); + BLI_snprintf(line, FILE_MAXDIR, "%s/", mnt->mnt_dir); + fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, line, 1, 0); } else fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, mnt->mnt_dir, 1, 0); @@ -482,31 +509,9 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) } #endif #endif - - fp = fopen(filename, "r"); - if (!fp) return; - - while ( fgets ( line, 256, fp ) != NULL ) /* read a line */ - { - if (strncmp(line, "[Bookmarks]", 11)==0){ - category = FS_CATEGORY_BOOKMARKS; - } else if (strncmp(line, "[Recent]", 8)==0){ - category = FS_CATEGORY_RECENT; - } else { - int len = strlen(line); - if (len>0) { - if (line[len-1] == '\n') { - line[len-1] = '\0'; - } - if (BLI_exist(line)) { - fsmenu_insert_entry(fsmenu, category, line, 0, 1); - } - } - } - } - fclose(fp); } + static void fsmenu_free_category(struct FSMenu* fsmenu, FSMenuCategory category) { FSMenuEntry *fsme= fsmenu_get_category(fsmenu, category); diff --git a/source/blender/editors/space_file/fsmenu.h b/source/blender/editors/space_file/fsmenu.h index d685a844cde..dcf8d3eb632 100644 --- a/source/blender/editors/space_file/fsmenu.h +++ b/source/blender/editors/space_file/fsmenu.h @@ -48,7 +48,7 @@ struct FSMenu* fsmenu_get (void); int fsmenu_get_nentries (struct FSMenu* fsmenu, FSMenuCategory category); /** Returns the fsmenu entry at @a index (or NULL if a bad index) - * or a separator. + * or a separator. */ char* fsmenu_get_entry (struct FSMenu* fsmenu, FSMenuCategory category, int index); @@ -68,7 +68,10 @@ void fsmenu_remove_entry (struct FSMenu* fsmenu, FSMenuCategory category, int i void fsmenu_write_file (struct FSMenu* fsmenu, const char *filename); /** reads the 'bookmarks' from the specified file */ -void fsmenu_read_file (struct FSMenu* fsmenu, const char *filename); +void fsmenu_read_bookmarks (struct FSMenu* fsmenu, const char *filename); + + /** adds system specific directories */ +void fsmenu_read_system (struct FSMenu* fsmenu); /** Free's all the memory associated with the fsmenu */ void fsmenu_free (struct FSMenu* fsmenu); diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index 3996c6135a0..261b7058151 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,10 +29,6 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "RNA_access.h" @@ -51,7 +47,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_fileselect.h" @@ -61,13 +56,10 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "ED_markers.h" -#include "ED_fileselect.h" #include "file_intern.h" // own include #include "fsmenu.h" @@ -120,6 +112,7 @@ static void file_free(SpaceLink *sl) SpaceFile *sfile= (SpaceFile *) sl; if(sfile->files) { + // XXXXX would need to do thumbnails_stop here, but no context available filelist_freelib(sfile->files); filelist_free(sfile->files); MEM_freeN(sfile->files); @@ -139,8 +132,6 @@ static void file_free(SpaceLink *sl) } if (sfile->params) { - if(sfile->params->pupmenu) - MEM_freeN(sfile->params->pupmenu); MEM_freeN(sfile->params); sfile->params= NULL; } @@ -170,18 +161,18 @@ static SpaceLink *file_duplicate(SpaceLink *sl) /* clear or remove stuff from old */ sfilen->op = NULL; /* file window doesn't own operators */ - if (sfileo->params) + if (sfileo->params) { sfilen->files = filelist_new(sfileo->params->type); + sfilen->params= MEM_dupallocN(sfileo->params); + filelist_setdir(sfilen->files, sfilen->params->dir); + } + if(sfileo->folders_prev) sfilen->folders_prev = folderlist_duplicate(sfileo->folders_prev); if(sfileo->folders_next) sfilen->folders_next = folderlist_duplicate(sfileo->folders_next); - - if(sfileo->params) { - sfilen->params= MEM_dupallocN(sfileo->params); - file_change_dir(sfilen, 0); - } + if (sfileo->layout) { sfilen->layout= MEM_dupallocN(sfileo->layout); } @@ -197,17 +188,42 @@ static void file_refresh(const bContext *C, ScrArea *sa) sfile->folders_prev = folderlist_new(); if (!sfile->files) { sfile->files = filelist_new(params->type); - file_change_dir(sfile, 0); + filelist_setdir(sfile->files, params->dir); params->active_file = -1; // added this so it opens nicer (ton) } filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT); filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0); if (filelist_empty(sfile->files)) { + thumbnails_stop(sfile->files, C); filelist_readdir(sfile->files); + if(params->sort!=FILE_SORT_NONE) { + filelist_sort(sfile->files, params->sort); + } BLI_strncpy(params->dir, filelist_dir(sfile->files), FILE_MAX); + if(params->display == FILE_IMGDISPLAY) { + thumbnails_start(sfile->files, C); + } + } else { + if(params->sort!=FILE_SORT_NONE) { + thumbnails_stop(sfile->files, C); + filelist_sort(sfile->files, params->sort); + if(params->display == FILE_IMGDISPLAY) { + thumbnails_start(sfile->files, C); + } + } else { + if(params->display == FILE_IMGDISPLAY) { + if (!thumbnails_running(sfile->files,C)) { + thumbnails_start(sfile->files, C); + } + } else { + /* stop any running thumbnail jobs if we're not + displaying them - speedup for NFS */ + thumbnails_stop(sfile->files, C); + } + filelist_filter(sfile->files); + } } - if(params->sort!=FILE_SORT_NONE) filelist_sort(sfile->files, params->sort); if (params->renamefile[0] != '\0') { int idx = filelist_find(sfile->files, params->renamefile); @@ -225,14 +241,13 @@ static void file_refresh(const bContext *C, ScrArea *sa) static void file_listener(ScrArea *sa, wmNotifier *wmn) { - SpaceFile* sfile = (SpaceFile*)sa->spacedata.first; + /* SpaceFile* sfile = (SpaceFile*)sa->spacedata.first; */ /* context changes */ switch(wmn->category) { case NC_SPACE: switch (wmn->data) { case ND_SPACE_FILE_LIST: - if (sfile->files) filelist_free(sfile->files); ED_area_tag_refresh(sa); ED_area_tag_redraw(sa); break; @@ -345,7 +360,6 @@ void file_operatortypes(void) WM_operatortype_append(FILE_OT_select_all_toggle); WM_operatortype_append(FILE_OT_select_border); WM_operatortype_append(FILE_OT_select_bookmark); - WM_operatortype_append(FILE_OT_loadimages); WM_operatortype_append(FILE_OT_highlight); WM_operatortype_append(FILE_OT_execute); WM_operatortype_append(FILE_OT_cancel); @@ -361,6 +375,7 @@ void file_operatortypes(void) WM_operatortype_append(FILE_OT_directory_new); WM_operatortype_append(FILE_OT_delete); WM_operatortype_append(FILE_OT_rename); + WM_operatortype_append(FILE_OT_smoothscroll); } /* NOTE: do not add .blend file reading on this level */ @@ -378,6 +393,9 @@ void file_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "FILE_OT_directory_new", IKEY, KM_PRESS, 0, 0); /* XXX needs button */ WM_keymap_add_item(keymap, "FILE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "FILE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "FILE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_OSKEY, 0); + WM_keymap_verify_item(keymap, "FILE_OT_smoothscroll", TIMER1, KM_ANY, KM_ANY, 0); /* keys for main area */ keymap= WM_keymap_find(keyconf, "File Browser Main", SPACE_FILE, 0); @@ -385,12 +403,14 @@ void file_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, 0, 0); kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", 1); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + RNA_boolean_set(kmi->ptr, "fill", 1); WM_keymap_add_item(keymap, "FILE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_select_border", BKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_select_border", EVT_TWEAK_L, KM_ANY, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "FILE_OT_highlight", MOUSEMOVE, KM_ANY, KM_ANY, 0); - WM_keymap_add_item(keymap, "FILE_OT_loadimages", TIMER1, KM_ANY, KM_ANY, 0); kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0); RNA_int_set(kmi->ptr, "increment", 1); kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0); @@ -404,6 +424,7 @@ void file_keymap(struct wmKeyConfig *keyconf) kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL, 0); RNA_int_set(kmi->ptr, "increment",-100); + /* keys for button area (top) */ keymap= WM_keymap_find(keyconf, "File Browser Buttons", SPACE_FILE, 0); kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0); @@ -448,7 +469,12 @@ static void file_channel_area_listener(ARegion *ar, wmNotifier *wmn) /* add handlers, stuff you only do once or on area/region changes */ static void file_header_area_init(wmWindowManager *wm, ARegion *ar) { + wmKeyMap *keymap; + ED_region_header_init(ar); + + keymap= WM_keymap_find(wm->defaultconf, "File Browser", SPACE_FILE, 0); + WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); } static void file_header_area_draw(const bContext *C, ARegion *ar) @@ -565,9 +591,16 @@ void ED_spacetype_file(void) void ED_file_init(void) { - char name[FILE_MAX]; - BLI_make_file_string("/", name, BLI_gethome(), ".Bfs"); - fsmenu_read_file(fsmenu_get(), name); + char *cfgdir = BLI_get_folder(BLENDER_CONFIG, NULL); + + fsmenu_read_system(fsmenu_get()); + + if (cfgdir) { + char name[FILE_MAX]; + BLI_make_file_string("/", name, cfgdir, BLENDER_BOOKMARK_FILE); + fsmenu_read_bookmarks(fsmenu_get(), name); + } + filelist_init_icons(); IMB_thumb_makedirs(); } diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c index 07eb58bffbc..05efdc12596 100644 --- a/source/blender/editors/space_file/writeimage.c +++ b/source/blender/editors/space_file/writeimage.c @@ -36,11 +36,9 @@ #include "BLI_blenlib.h" -#include "DNA_image_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_texture_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -52,41 +50,15 @@ #include "file_intern.h" /* XXX */ -static void error() {} +static void error(const char *dummy) {} static void waitcursor(int val) {} -static void activate_fileselect() {} -static int saveover() {return 0;} +static void activate_fileselect(int d1, char *d2, char *d3, void *d4) {} +static int saveover(const char *dummy) {return 0;} /* XXX */ /* ------------------------------------------------------------------------- */ - -void BIF_save_envmap(Scene *scene, EnvMap *env, char *str) -{ - ImBuf *ibuf; -/* extern rectcpy(); */ - int dx; - - /* all interactive stuff is handled in buttons.c */ - if(env->cube[0]==NULL) return; - - dx= env->cube[0]->x; - ibuf= IMB_allocImBuf(3*dx, 2*dx, 24, IB_rect, 0); - - IMB_rectcpy(ibuf, env->cube[0], 0, 0, 0, 0, dx, dx); - IMB_rectcpy(ibuf, env->cube[1], dx, 0, 0, 0, dx, dx); - IMB_rectcpy(ibuf, env->cube[2], 2*dx, 0, 0, 0, dx, dx); - IMB_rectcpy(ibuf, env->cube[3], 0, dx, 0, 0, dx, dx); - IMB_rectcpy(ibuf, env->cube[4], dx, dx, 0, 0, dx, dx); - IMB_rectcpy(ibuf, env->cube[5], 2*dx, dx, 0, 0, dx, dx); - - BKE_write_ibuf(scene, ibuf, str, scene->r.imtype, scene->r.subimtype, scene->r.quality); - IMB_freeImBuf(ibuf); -} - - - /* callback for fileselect to save rendered image, renderresult was checked to exist */ static void save_rendered_image_cb_real(char *name, int confirm) { @@ -105,7 +77,7 @@ static void save_rendered_image_cb_real(char *name, int confirm) BKE_add_image_extension(name, scene->r.imtype); strcpy(str, name); - BLI_convertstringcode(str, G.sce); + BLI_path_abs(str, G.sce); if (confirm) overwrite = saveover(str); @@ -114,14 +86,14 @@ static void save_rendered_image_cb_real(char *name, int confirm) if(overwrite) { if(scene->r.imtype==R_MULTILAYER) { - Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); + Render *re= RE_GetRender(scene->id.name); RenderResult *rr= RE_AcquireResultRead(re); if(rr) RE_WriteRenderResult(rr, str, scene->r.quality); RE_ReleaseResult(re); } else { - Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); + Render *re= RE_GetRender(scene->id.name); RenderResult rres; ImBuf *ibuf; @@ -171,10 +143,11 @@ void save_image_filesel_str(Scene *scene, char *str) case R_BMP: strcpy(str, "Save BMP"); break; +#ifdef WITH_TIFF case R_TIFF: - if (G.have_libtiff) - strcpy(str, "Save TIFF"); + strcpy(str, "Save TIFF"); break; +#endif #ifdef WITH_OPENEXR case R_OPENEXR: strcpy(str, "Save OpenEXR"); @@ -211,7 +184,6 @@ void save_image_filesel_str(Scene *scene, char *str) #endif /* default we save jpeg, also for all movie formats */ case R_JPEG90: - case R_MOVIE: case R_AVICODEC: case R_AVIRAW: case R_AVIJPEG: @@ -235,7 +207,7 @@ void BIF_save_rendered_image(char *name) /* calls fileselect */ void BIF_save_rendered_image_fs(Scene *scene) { - Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); + Render *re= RE_GetRender(scene->id.name); RenderResult rres; RE_AcquireResultImage(re, &rres); diff --git a/source/blender/editors/space_graph/CMakeLists.txt b/source/blender/editors/space_graph/CMakeLists.txt new file mode 100644 index 00000000000..6ad95d920c6 --- /dev/null +++ b/source/blender/editors/space_graph/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/audaspace/intern +) + +BLENDERLIB(bf_editor_space_graph "${SRC}" "${INC}") diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 3975c88fe5c..bf433923707 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,12 +32,8 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -66,17 +62,13 @@ #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" #include "ED_anim_api.h" #include "ED_keyframing.h" #include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "graph_intern.h" // own include @@ -155,7 +147,7 @@ static void graph_panel_view(const bContext *C, Panel *pa) /* 2D-Cursor */ col= uiLayoutColumn(pa->layout, 0); - uiItemR(col, NULL, 0, &spaceptr, "show_cursor", 0); + uiItemR(col, &spaceptr, "show_cursor", 0, NULL, 0); subcol= uiLayoutColumn(col, 1); uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor")); @@ -164,11 +156,11 @@ static void graph_panel_view(const bContext *C, Panel *pa) subcol= uiLayoutColumn(col, 1); uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor")); row= uiLayoutSplit(subcol, 0.7, 1); - uiItemR(row, "Cursor X", 0, &sceneptr, "current_frame", 0); - uiItemEnumO(row, "To Keys", 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_CFRA); + uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", 0); + uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_CFRA); row= uiLayoutSplit(subcol, 0.7, 1); - uiItemR(row, "Cursor Y", 0, &spaceptr, "cursor_value", 0); - uiItemEnumO(row, "To Keys", 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_VALUE); + uiItemR(row, &spaceptr, "cursor_value", 0, "Cursor Y", 0); + uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_VALUE); } /* ******************* active F-Curve ************** */ @@ -202,25 +194,102 @@ static void graph_panel_properties(const bContext *C, Panel *pa) /* RNA-Path Editing - only really should be enabled when things aren't working */ col= uiLayoutColumn(layout, 1); uiLayoutSetEnabled(col, (fcu->flag & FCURVE_DISABLED)); - uiItemR(col, "", ICON_RNA, &fcu_ptr, "data_path", 0); - uiItemR(col, NULL, 0, &fcu_ptr, "array_index", 0); + uiItemR(col, &fcu_ptr, "data_path", 0, "", ICON_RNA); + uiItemR(col, &fcu_ptr, "array_index", 0, NULL, 0); /* color settings */ col= uiLayoutColumn(layout, 1); uiItemL(col, "Display Color:", 0); row= uiLayoutRow(col, 1); - uiItemR(row, "", 0, &fcu_ptr, "color_mode", 0); + uiItemR(row, &fcu_ptr, "color_mode", 0, "", 0); subrow= uiLayoutRow(row, 1); uiLayoutSetEnabled(subrow, (fcu->color_mode==FCURVE_COLOR_CUSTOM)); - uiItemR(subrow, "", 0, &fcu_ptr, "color", 0); + uiItemR(subrow, &fcu_ptr, "color", 0, "", 0); - /* TODO: the following settings could be added here - * - Access details (ID-block + RNA-Path + Array Index) - * - ... - */ + MEM_freeN(ale); +} +/* ******************* active Keyframe ************** */ + +/* get 'active' keyframe for panel editing */ +static short get_active_fcurve_keyframe_edit(FCurve *fcu, BezTriple **bezt, BezTriple **prevbezt) +{ + BezTriple *b; + int i; + + /* zero the pointers */ + *bezt = *prevbezt = NULL; + + /* sanity checks */ + if ((fcu->bezt == NULL) || (fcu->totvert == 0)) + return 0; + + /* find first selected keyframe for now, and call it the active one + * - this is a reasonable assumption, given that whenever anyone + * wants to edit numerically, there is likely to only be 1 vert selected + */ + for (i=0, b=fcu->bezt; i < fcu->totvert; i++, b++) { + if (BEZSELECTED(b)) { + /* found + * - 'previous' is either the one before, of the keyframe itself (which is still fine) + * XXX: we can just make this null instead if needed + */ + *prevbezt = (i > 0) ? b-1 : b; + *bezt = b; + + return 1; + } + } + + /* not found */ + return 0; +} + +static void graph_panel_key_properties(const bContext *C, Panel *pa) +{ + bAnimListElem *ale; + FCurve *fcu; + BezTriple *bezt, *prevbezt; + + uiLayout *layout = pa->layout; + uiLayout *col; + uiBlock *block; + + if (!graph_panel_context(C, &ale, &fcu)) + return; + + block = uiLayoutGetBlock(layout); + uiBlockSetHandleFunc(block, do_graph_region_buttons, NULL); + + /* only show this info if there are keyframes to edit */ + if (get_active_fcurve_keyframe_edit(fcu, &bezt, &prevbezt)) { + PointerRNA bezt_ptr; + + /* RNA pointer to keyframe, to allow editing */ + RNA_pointer_create(ale->id, &RNA_Keyframe, bezt, &bezt_ptr); + + /* interpolation */ + col= uiLayoutColumn(layout, 0); + uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, 0); + + /* numerical coordinate editing */ + col= uiLayoutColumn(layout, 1); + /* keyframe itself */ + uiItemR(col, &bezt_ptr, "co", 0, "Key", 0); + + /* previous handle - only if previous was Bezier interpolation */ + if ((prevbezt) && (prevbezt->ipo == BEZT_IPO_BEZ)) + uiItemR(col, &bezt_ptr, "handle1", 0, NULL, 0); + + /* next handle - only if current is Bezier interpolation */ + if (bezt->ipo == BEZT_IPO_BEZ) + uiItemR(col, &bezt_ptr, "handle2", 0, NULL, 0); + } + else + uiItemL(layout, "No active keyframe on F-Curve", 0); + MEM_freeN(ale); } @@ -357,7 +426,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout, PointerRNA tar_ptr; RNA_pointer_create(dtar->id, &RNA_Pose, ob1->pose, &tar_ptr); - uiItemPointerR(col, "", ICON_BONE_DATA, &dtar_ptr, "bone_target", &tar_ptr, "bones"); + uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA); } col= uiLayoutColumn(layout, 1); @@ -367,7 +436,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout, PointerRNA tar_ptr; RNA_pointer_create(dtar2->id, &RNA_Pose, ob2->pose, &tar_ptr); - uiItemPointerR(col, "", ICON_BONE_DATA, &dtar2_ptr, "bone_target", &tar_ptr, "bones"); + uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA); } } @@ -393,10 +462,10 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout, PointerRNA tar_ptr; RNA_pointer_create(dtar->id, &RNA_Pose, ob1->pose, &tar_ptr); - uiItemPointerR(col, "", ICON_BONE_DATA, &dtar_ptr, "bone_target", &tar_ptr, "bones"); + uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA); } - uiItemR(col, NULL, 0, &dtar_ptr, "use_local_space_transforms", 0); + uiItemR(col, &dtar_ptr, "use_local_space_transforms", 0, NULL, 0); col= uiLayoutColumn(layout, 1); uiTemplateAnyID(col, (bContext *)C, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:"); @@ -405,10 +474,10 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout, PointerRNA tar_ptr; RNA_pointer_create(dtar2->id, &RNA_Pose, ob2->pose, &tar_ptr); - uiItemPointerR(col, "", ICON_BONE_DATA, &dtar2_ptr, "bone_target", &tar_ptr, "bones"); + uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA); } - uiItemR(col, NULL, 0, &dtar2_ptr, "use_local_space_transforms", 0); + uiItemR(col, &dtar2_ptr, "use_local_space_transforms", 0, NULL, 0); } /* settings for 'transform channel' driver variable type */ @@ -430,12 +499,12 @@ static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout PointerRNA tar_ptr; RNA_pointer_create(dtar->id, &RNA_Pose, ob->pose, &tar_ptr); - uiItemPointerR(col, "", ICON_BONE_DATA, &dtar_ptr, "bone_target", &tar_ptr, "bones"); + uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA); } row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, &dtar_ptr, "transform_type", 0); - uiItemR(row, NULL, 0, &dtar_ptr, "use_local_space_transforms", 0); + uiItemR(row, &dtar_ptr, "transform_type", 0, "", 0); + uiItemR(row, &dtar_ptr, "use_local_space_transforms", 0, NULL, 0); } /* driver settings for active F-Curve (only for 'Drivers' mode) */ @@ -474,12 +543,12 @@ static void graph_panel_drivers(const bContext *C, Panel *pa) col= uiLayoutColumn(pa->layout, 1); block= uiLayoutGetBlock(col); - uiItemR(col, NULL, 0, &driver_ptr, "type", 0); + uiItemR(col, &driver_ptr, "type", 0, NULL, 0); /* show expression box if doing scripted drivers, and/or error messages when invalid drivers exist */ if (driver->type == DRIVER_TYPE_PYTHON) { /* expression */ - uiItemR(col, "Expr", 0, &driver_ptr, "expression", 0); + uiItemR(col, &driver_ptr, "expression", 0, "Expr", 0); /* errors? */ if (driver->flag & DRIVER_FLAG_INVALID) @@ -493,7 +562,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa) col= uiLayoutColumn(pa->layout, 1); /* debug setting */ - uiItemR(col, NULL, 0, &driver_ptr, "show_debug_info", 0); + uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, 0); /* value of driver */ if (driver->flag & DRIVER_FLAG_SHOWDEBUG) { @@ -528,7 +597,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa) row= uiLayoutRow(box, 0); block= uiLayoutGetBlock(row); /* variable name */ - uiItemR(row, "", 0, &dvar_ptr, "name", 0); + uiItemR(row, &dvar_ptr, "name", 0, "", 0); /* remove button */ uiBlockSetEmboss(block, UI_EMBOSSN); @@ -538,7 +607,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa) /* variable type */ row= uiLayoutRow(box, 0); - uiItemR(row, "", 0, &dvar_ptr, "type", 0); + uiItemR(row, &dvar_ptr, "type", 0, "", 0); /* variable type settings */ box= uiLayoutBox(col); @@ -610,8 +679,13 @@ static void graph_panel_modifiers(const bContext *C, Panel *pa) row= uiLayoutRow(pa->layout, 0); block= uiLayoutGetBlock(row); - // XXX for now, this will be a operator button which calls a temporary 'add modifier' operator + // XXX for now, this will be a operator button which calls a 'add modifier' operator uiDefButO(block, BUT, "GRAPH_OT_fmodifier_add", WM_OP_INVOKE_REGION_WIN, "Add Modifier", 10, 0, 150, 20, "Adds a new F-Curve Modifier for the active F-Curve"); + + /* copy/paste (as sub-row)*/ + row= uiLayoutRow(row, 1); + uiItemO(row, "", ICON_COPYDOWN, "GRAPH_OT_fmodifier_copy"); + uiItemO(row, "", ICON_PASTEDOWN, "GRAPH_OT_fmodifier_paste"); } /* draw each modifier */ @@ -634,6 +708,7 @@ void graph_buttons_register(ARegionType *art) strcpy(pt->idname, "GRAPH_PT_view"); strcpy(pt->label, "View Properties"); pt->draw= graph_panel_view; + pt->flag |= PNL_DEFAULT_CLOSED; BLI_addtail(&art->paneltypes, pt); pt= MEM_callocN(sizeof(PanelType), "spacetype graph panel properties"); @@ -642,6 +717,14 @@ void graph_buttons_register(ARegionType *art) pt->draw= graph_panel_properties; pt->poll= graph_panel_poll; BLI_addtail(&art->paneltypes, pt); + + pt= MEM_callocN(sizeof(PanelType), "spacetype graph panel properties"); + strcpy(pt->idname, "GRAPH_PT_key_properties"); + strcpy(pt->label, "Active Keyframe"); + pt->draw= graph_panel_key_properties; + pt->poll= graph_panel_poll; + BLI_addtail(&art->paneltypes, pt); + pt= MEM_callocN(sizeof(PanelType), "spacetype graph panel drivers"); strcpy(pt->idname, "GRAPH_PT_drivers"); diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 19288bae2a2..543bd8b9964 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -29,10 +29,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef _WIN32 #include #else @@ -45,23 +41,10 @@ #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_meta_types.h" #include "DNA_object_types.h" -#include "DNA_particle_types.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_sequence_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view2d_types.h" #include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" #include "BKE_animsys.h" #include "BKE_context.h" @@ -78,12 +61,10 @@ #include "BIF_glutil.h" #include "ED_anim_api.h" -#include "ED_util.h" #include "graph_intern.h" #include "UI_interface.h" -#include "UI_interface_icons.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -357,7 +338,6 @@ static int draw_fcurve_handles_check(SpaceIpo *sipo, FCurve *fcu) * note: draw_fcurve_handles_check must be checked before running this. */ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu) { - extern unsigned int nurbcol[]; int sel, b; /* a single call to GL_LINES here around these calls should be sufficient to still @@ -371,8 +351,9 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, */ for (sel= 0; sel < 2; sel++) { BezTriple *bezt=fcu->bezt, *prevbezt=NULL; - unsigned int *col= (sel)? (nurbcol+4) : (nurbcol); + int basecol= (sel)? TH_HANDLE_SEL_FREE : TH_HANDLE_FREE; float *fp; + char col[4]; /* if only selected keyframes have handles shown, skip the first round */ if ((sel == 0) && (sipo->flag & SIPO_SELVHANDLESONLY)) @@ -390,19 +371,24 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, /* draw handle with appropriate set of colors if selection is ok */ if ((bezt->f2 & SELECT)==sel) { fp= bezt->vec[0]; - + /* only draw first handle if previous segment had handles */ if ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) { - cpackA(col[(unsigned char)bezt->h1], drawFCurveFade(fcu)); + UI_GetThemeColor3ubv(basecol + bezt->h1, col); + col[3]= drawFCurveFade(fcu) * 255; + glColor4ubv((GLubyte *)col); glVertex2fv(fp); glVertex2fv(fp+3); } - + /* only draw second handle if this segment is bezier */ if (bezt->ipo == BEZT_IPO_BEZ) { - cpackA(col[(unsigned char)bezt->h2], drawFCurveFade(fcu)); + UI_GetThemeColor3ubv(basecol + bezt->h2, col); + col[3]= drawFCurveFade(fcu) * 255; + glColor4ubv((GLubyte *)col); + glVertex2fv(fp+3); glVertex2fv(fp+6); } } @@ -412,8 +398,10 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) ) { fp= bezt->vec[0]; - cpackA(col[(unsigned char)bezt->h1], drawFCurveFade(fcu)); - + UI_GetThemeColor3ubv(basecol + bezt->h1, col); + col[3]= drawFCurveFade(fcu) * 255; + glColor4ubv((GLubyte *)col); + glVertex2fv(fp); glVertex2fv(fp+3); } @@ -422,8 +410,10 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, (bezt->ipo == BEZT_IPO_BEZ) ) { fp= bezt->vec[1]; - cpackA(col[(unsigned char)bezt->h2], drawFCurveFade(fcu)); - + UI_GetThemeColor3ubv(basecol + bezt->h2, col); + col[3]= drawFCurveFade(fcu) * 255; + glColor4ubv((GLubyte *)col); + glVertex2fv(fp); glVertex2fv(fp+3); } } @@ -512,7 +502,15 @@ static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, SpaceIpo * float samplefreq, ctime; float stime, etime; float unitFac; - + float dx, dy; + + /* when opening a blend file on a different sized screen or while dragging the toolbar this can happen + * best just bail out in this case */ + UI_view2d_grid_size(grid, &dx, &dy); + if(dx <= 0.0f) + return; + + /* disable any drivers temporarily */ driver= fcu->driver; fcu->driver= NULL; @@ -529,19 +527,18 @@ static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, SpaceIpo * * though it is impossible to predict this from the modifiers! * * If the automatically determined sampling frequency is likely to cause an infinite - * loop (i.e. too close to FLT_EPSILON), fall back to default of 0.001 + * loop (i.e. too close to 0), then clamp it to a determined "safe" value. The value + * chosen here is just the coarsest value which still looks reasonable... */ - /* grid->dx is the first float in View2DGrid struct, so just cast to float pointer, and use it - * It represents the number of 'frames' between gridlines, but we divide by U.v2d_min_gridsize to get pixels-steps - */ + /* grid->dx represents the number of 'frames' between gridlines, but we divide by U.v2d_min_gridsize to get pixels-steps */ // TODO: perhaps we should have 1.0 frames as upper limit so that curves don't get too distorted? - samplefreq= *((float *)grid) / U.v2d_min_gridsize; - if (IS_EQ(samplefreq, 0)) samplefreq= 0.001f; + samplefreq= dx / U.v2d_min_gridsize; + if (samplefreq < 0.00001f) samplefreq= 0.00001f; /* the start/end times are simply the horizontal extents of the 'cur' rect */ stime= v2d->cur.xmin; - etime= v2d->cur.xmax; + etime= v2d->cur.xmax + samplefreq; /* + samplefreq here so that last item gets included... */ /* at each sampling interval, add a new vertex diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 7a525b2732f..6249edc1090 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -32,10 +32,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "AUD_C-API.h" #include "MEM_guardedalloc.h" @@ -44,21 +40,8 @@ #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -80,10 +63,8 @@ #include "ED_anim_api.h" #include "ED_keyframing.h" -#include "ED_keyframes_draw.h" #include "ED_keyframes_edit.h" #include "ED_screen.h" -#include "ED_space_api.h" #include "ED_transform.h" #include "WM_api.h" @@ -105,7 +86,7 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo int filter; /* get data to filter, from Dopesheet */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* set large values to try to override */ @@ -277,7 +258,7 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end) } /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -307,7 +288,7 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end) float cfrae= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP); fpt->vec[0]= cfrae; - fpt->vec[1]= fcurve_samplingcb_evalcurve(fcu, NULL, cfrae); + fpt->vec[1]= fcurve_samplingcb_evalcurve(fcu, NULL, cfrae) * unitFac; } /* set color of ghost curve @@ -436,7 +417,7 @@ static void insert_graph_keys(bAnimContext *ac, short mode) short flag = 0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (mode == 2) filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -475,8 +456,6 @@ static int graphkeys_insertkey_exec(bContext *C, wmOperator *op) /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - if (ac.datatype == ANIMCONT_GPENCIL) - return OPERATOR_CANCELLED; /* which channels to affect? */ mode= RNA_enum_get(op->ptr, "type"); @@ -488,7 +467,7 @@ static int graphkeys_insertkey_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -552,7 +531,7 @@ static int graphkeys_click_insert_exec (bContext *C, wmOperator *op) MEM_freeN(ale); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -618,7 +597,7 @@ static short copy_graph_keys (bAnimContext *ac) free_anim_copybuf(); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* copy keyframes */ @@ -636,7 +615,7 @@ static short paste_graph_keys (bAnimContext *ac) int filter, ok=0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* paste keyframes */ @@ -703,7 +682,7 @@ static int graphkeys_paste_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -732,7 +711,7 @@ static void duplicate_graph_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -761,7 +740,7 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -804,7 +783,7 @@ static void delete_graph_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -841,7 +820,7 @@ static int graphkeys_delete_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -871,7 +850,7 @@ static void clean_graph_keys (bAnimContext *ac, float thresh) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and clean curves */ @@ -903,7 +882,7 @@ static int graphkeys_clean_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -938,7 +917,7 @@ static void bake_graph_curves (bAnimContext *ac, int start, int end) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -986,7 +965,7 @@ static int graphkeys_bake_exec(bContext *C, wmOperator *op) /* set notifier that keyframes have changed */ // NOTE: some distinction between order/number of keyframes and type should be made? - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1058,7 +1037,7 @@ static int graphkeys_sound_bake_exec(bContext *C, wmOperator *op) if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - RNA_string_get(op->ptr, "path", path); + RNA_string_get(op->ptr, "filepath", path); scene= ac.scene; /* current scene */ @@ -1085,7 +1064,7 @@ static int graphkeys_sound_bake_exec(bContext *C, wmOperator *op) end = CFRA + sbi.length - 1; /* filter anim channels */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* loop through all selected F-Curves, replacing its data with the sound samples */ @@ -1106,7 +1085,7 @@ static int graphkeys_sound_bake_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that 'keyframes' have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1138,7 +1117,7 @@ void GRAPH_OT_sound_bake (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH); RNA_def_float(ot->srna, "low", 0.0f, 0.0, 100000.0, "Lowest frequency", "", 0.1, 1000.00); RNA_def_float(ot->srna, "high", 100000.0, 0.0, 100000.0, "Highest frequency", "", 0.1, 1000.00); RNA_def_float(ot->srna, "attack", 0.005, 0.0, 2.0, "Attack time", "", 0.01, 0.1); @@ -1163,7 +1142,7 @@ static void sample_graph_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -1191,7 +1170,7 @@ static int graphkeys_sample_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1232,7 +1211,7 @@ static void setexpo_graph_keys(bAnimContext *ac, short mode) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting mode per F-Curve */ @@ -1298,17 +1277,17 @@ static void setipo_graph_keys(bAnimContext *ac, short mode) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - BeztEditFunc set_cb= ANIM_editkeyframes_ipo(mode); + KeyframeEditFunc set_cb= ANIM_editkeyframes_ipo(mode); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting BezTriple interpolation - * Note: we do not supply BeztEditData to the looper yet. Currently that's not necessary here... + * Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here... */ for (ale= anim_data.first; ale; ale= ale->next) - ANIM_fcurve_keys_bezier_loop(NULL, ale->key_data, NULL, set_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(NULL, ale->key_data, NULL, set_cb, calchandles_fcurve); /* cleanup */ BLI_freelistN(&anim_data); @@ -1379,21 +1358,21 @@ static void sethandles_graph_keys(bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditFunc edit_cb= ANIM_editkeyframes_handles(mode); - BeztEditFunc sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); + KeyframeEditFunc edit_cb= ANIM_editkeyframes_handles(mode); + KeyframeEditFunc sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting flags for handles - * Note: we do not supply BeztEditData to the looper yet. Currently that's not necessary here... + * Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here... */ for (ale= anim_data.first; ale; ale= ale->next) { FCurve *fcu= (FCurve *)ale->key_data; /* any selected keyframes for editing? */ - if (ANIM_fcurve_keys_bezier_loop(NULL, fcu, NULL, sel_cb, NULL)) { + if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, sel_cb, NULL)) { /* for auto/auto-clamped, toggle the auto-handles flag on the F-Curve */ if (mode == HD_AUTO_ANIM) fcu->flag |= FCURVE_AUTO_HANDLES; @@ -1401,7 +1380,7 @@ static void sethandles_graph_keys(bAnimContext *ac, short mode) fcu->flag &= ~FCURVE_AUTO_HANDLES; /* change type of selected handles */ - ANIM_fcurve_keys_bezier_loop(NULL, fcu, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, edit_cb, calchandles_fcurve); } } @@ -1494,7 +1473,7 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op) */ /* step 1: extract only the rotation f-curves */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1563,17 +1542,17 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op) ListBase anim_data= {NULL, NULL}; bAnimListElem *ale; int filter; - BeztEditData bed; + KeyframeEditData ked; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; /* init edit data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* loop over action data, averaging values */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1584,11 +1563,11 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL); /* unapply unit corrections */ ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE|ANIM_UNITCONV_ONLYKEYS); @@ -1597,13 +1576,14 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set the new current frame and cursor values, based on the average time and value */ - if (bed.i1) { + if (ked.i1) { SpaceIpo *sipo= ac.sa->spacedata.first; Scene *scene= ac.scene; /* take the average values, rounding to the nearest int for the current frame */ - CFRA= (int)floor((bed.f1 / bed.i1) + 0.5f); - sipo->cursorVal= bed.f2 / (float)bed.i1; + CFRA= (int)floor((ked.f1 / ked.i1) + 0.5f); + SUBFRA= 0.f; + sipo->cursorVal= ked.f2 / (float)ked.i1; } /* set notifier that things have changed */ @@ -1647,25 +1627,25 @@ static void snap_graph_keys(bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc edit_cb; + KeyframeEditData ked; + KeyframeEditFunc edit_cb; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get beztriple editing callbacks */ edit_cb= ANIM_editkeyframes_snap(mode); - memset(&bed, 0, sizeof(BeztEditData)); - bed.scene= ac->scene; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.scene= ac->scene; if (mode == GRAPHKEYS_SNAP_NEAREST_MARKER) { - bed.list.first= (ac->markers) ? ac->markers->first : NULL; - bed.list.last= (ac->markers) ? ac->markers->last : NULL; + ked.list.first= (ac->markers) ? ac->markers->first : NULL; + ked.list.last= (ac->markers) ? ac->markers->last : NULL; } else if (mode == GRAPHKEYS_SNAP_VALUE) { SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - bed.f1= (sipo) ? sipo->cursorVal : 0.0f; + ked.f1= (sipo) ? sipo->cursorVal : 0.0f; } /* snap keyframes */ @@ -1677,11 +1657,11 @@ static void snap_graph_keys(bAnimContext *ac, short mode) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); /* apply unit corrections */ ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE); @@ -1711,7 +1691,7 @@ static int graphkeys_snap_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1754,14 +1734,14 @@ static void mirror_graph_keys(bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc edit_cb; + KeyframeEditData ked; + KeyframeEditFunc edit_cb; /* get beztriple editing callbacks */ edit_cb= ANIM_editkeyframes_mirror(mode); - memset(&bed, 0, sizeof(BeztEditData)); - bed.scene= ac->scene; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.scene= ac->scene; /* for 'first selected marker' mode, need to find first selected marker first! */ // XXX should this be made into a helper func in the API? @@ -1779,17 +1759,17 @@ static void mirror_graph_keys(bAnimContext *ac, short mode) /* store marker's time (if available) */ if (marker) - bed.f1= (float)marker->frame; + ked.f1= (float)marker->frame; else return; } else if (mode == GRAPHKEYS_MIRROR_VALUE) { SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - bed.f1= (sipo) ? sipo->cursorVal : 0.0f; + ked.f1= (sipo) ? sipo->cursorVal : 0.0f; } /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* mirror keyframes */ @@ -1801,11 +1781,11 @@ static void mirror_graph_keys(bAnimContext *ac, short mode) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve); /* unapply unit corrections */ ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYKEYS|ANIM_UNITCONV_RESTORE); @@ -1835,7 +1815,7 @@ static int graphkeys_mirror_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1873,7 +1853,7 @@ static int graphkeys_smooth_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* smooth keyframes */ @@ -1890,7 +1870,7 @@ static int graphkeys_smooth_exec(bContext *C, wmOperator *op) ANIM_editkeyframes_refresh(&ac); /* set notifier that keyframes have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); return OPERATOR_FINISHED; } @@ -1935,7 +1915,7 @@ static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *eve continue; /* create operator menu item with relevant properties filled in */ - props_ptr= uiItemFullO(layout, fmi->name, 0, "GRAPH_OT_fmodifier_add", NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS); + props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, 0, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS); /* the only thing that gets set from the menu is the type of F-Modifier to add */ RNA_enum_set(&props_ptr, "type", i); /* the following properties are just repeats of existing ones... */ @@ -1964,14 +1944,14 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op) type= RNA_enum_get(op->ptr, "type"); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (RNA_boolean_get(op->ptr, "only_active")) filter |= ANIMFILTER_ACTIVE; else filter |= (ANIMFILTER_SEL|ANIMFILTER_CURVEVISIBLE); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - /* smooth keyframes */ + /* add f-modifier to each curve */ for (ale= anim_data.first; ale; ale= ale->next) { FCurve *fcu= (FCurve *)ale->data; FModifier *fcm; @@ -2017,4 +1997,119 @@ void GRAPH_OT_fmodifier_add (wmOperatorType *ot) RNA_def_boolean(ot->srna, "only_active", 1, "Only Active", "Only add F-Modifier to active F-Curve."); } +/* ******************** Copy F-Modifiers Operator *********************** */ + +static int graph_fmodifier_copy_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + bAnimListElem *ale; + short ok = 0; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* clear buffer first */ + free_fmodifiers_copybuf(); + + /* get the active F-Curve */ + ale= get_active_fcurve_channel(&ac); + + /* if this exists, call the copy F-Modifiers API function */ + if (ale && ale->data) { + FCurve *fcu= (FCurve *)ale->data; + + // TODO: when 'active' vs 'all' boolean is added, change last param! + ok= ANIM_fmodifiers_copy_to_buf(&fcu->modifiers, 0); + + /* free temp data now */ + MEM_freeN(ale); + } + + /* successful or not? */ + if (ok == 0) { + BKE_report(op->reports, RPT_ERROR, "No F-Modifiers available to be copied"); + return OPERATOR_CANCELLED; + } + else + return OPERATOR_FINISHED; +} + +void GRAPH_OT_fmodifier_copy (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy F-Modifiers"; + ot->idname= "GRAPH_OT_fmodifier_copy"; + ot->description= "Copy the F-Modifier(s) of the active F-Curve."; + + /* api callbacks */ + ot->exec= graph_fmodifier_copy_exec; + ot->poll= graphop_active_fcurve_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* id-props */ + //ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All F-Modifiers", "Copy all the F-Modifiers, instead of just the active one"); +} + +/* ******************** Paste F-Modifiers Operator *********************** */ + +static int graph_fmodifier_paste_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter, ok=0; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* filter data */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + /* paste modifiers */ + for (ale = anim_data.first; ale; ale = ale->next) { + FCurve *fcu= (FCurve *)ale->data; + + // TODO: do we want to replace existing modifiers? add user pref for that! + ok += ANIM_fmodifiers_paste_from_buf(&fcu->modifiers, 0); + } + + /* clean up */ + BLI_freelistN(&anim_data); + + /* successful or not? */ + if (ok) { + /* validate keyframes after editing */ + ANIM_editkeyframes_refresh(&ac); + + /* set notifier that keyframes have changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); + + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "No F-Modifiers to paste"); + return OPERATOR_CANCELLED; + } +} + +void GRAPH_OT_fmodifier_paste (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Paste F-Modifiers"; + ot->idname= "GRAPH_OT_fmodifier_paste"; + ot->description= "Add copied F-Modifiers to the selected F-Curves"; + + /* api callbacks */ + ot->exec= graph_fmodifier_paste_exec; + ot->poll= graphop_editable_keyframes_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /* ************************************************************************** */ diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h index 696d31e22e1..a637ed15fcd 100644 --- a/source/blender/editors/space_graph/graph_intern.h +++ b/source/blender/editors/space_graph/graph_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -63,6 +63,7 @@ void graph_header_buttons(const bContext *C, struct ARegion *ar); void GRAPH_OT_select_all_toggle(struct wmOperatorType *ot); void GRAPH_OT_select_border(struct wmOperatorType *ot); void GRAPH_OT_select_column(struct wmOperatorType *ot); +void GRAPH_OT_select_linked(struct wmOperatorType *ot); void GRAPH_OT_select_more(struct wmOperatorType *ot); void GRAPH_OT_select_less(struct wmOperatorType *ot); void GRAPH_OT_clickselect(struct wmOperatorType *ot); @@ -139,6 +140,8 @@ enum { /* ----------- */ void GRAPH_OT_fmodifier_add(struct wmOperatorType *ot); +void GRAPH_OT_fmodifier_copy(struct wmOperatorType *ot); +void GRAPH_OT_fmodifier_paste(struct wmOperatorType *ot); /* ----------- */ @@ -147,6 +150,7 @@ void GRAPH_OT_ghost_curves_clear(struct wmOperatorType *ot); /* ***************************************** */ /* graph_buttons.c */ + void GRAPH_OT_properties(struct wmOperatorType *ot); void graph_buttons_register(struct ARegionType *art); diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 7c1ac14027a..fa9acb282c7 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,12 +31,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_listBase.h" -#include "DNA_action_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" @@ -44,7 +39,6 @@ #include "BKE_sound.h" #include "BKE_utildefines.h" -#include "UI_interface.h" #include "UI_view2d.h" #include "ED_screen.h" @@ -77,6 +71,7 @@ static void graphview_cursor_apply(bContext *C, wmOperator *op) * NOTE: sync this part of the code with ANIM_OT_change_frame */ CFRA= RNA_int_get(op->ptr, "frame"); + SUBFRA=0.f; sound_seek_scene(C); /* set the cursor value */ @@ -237,6 +232,7 @@ void graphedit_operatortypes(void) WM_operatortype_append(GRAPH_OT_select_all_toggle); WM_operatortype_append(GRAPH_OT_select_border); WM_operatortype_append(GRAPH_OT_select_column); + WM_operatortype_append(GRAPH_OT_select_linked); WM_operatortype_append(GRAPH_OT_select_more); WM_operatortype_append(GRAPH_OT_select_less); @@ -262,8 +258,9 @@ void graphedit_operatortypes(void) WM_operatortype_append(GRAPH_OT_click_insert); /* F-Curve Modifiers */ - // XXX temporary? WM_operatortype_append(GRAPH_OT_fmodifier_add); + WM_operatortype_append(GRAPH_OT_fmodifier_copy); + WM_operatortype_append(GRAPH_OT_fmodifier_paste); } /* ************************** registration - keymaps **********************************/ @@ -303,9 +300,16 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1); /* borderselect */ - WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0)->ptr, "axis_range", 1); - + kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0); + kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "axis_range", 1); + + kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "include_handles", 1); + kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "axis_range", 1); + RNA_boolean_set(kmi->ptr, "include_handles", 1); + /* column select */ RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, 0, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_KEYS); RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_CFRA); @@ -316,6 +320,9 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) WM_keymap_add_item(keymap, "GRAPH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "GRAPH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); + /* select linked */ + WM_keymap_add_item(keymap, "GRAPH_OT_select_linked", LKEY, KM_PRESS, 0, 0); + /* graph_edit.c */ /* snap - current frame to selected keys */ @@ -340,6 +347,7 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) WM_keymap_add_item(keymap, "GRAPH_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "GRAPH_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "GRAPH_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "GRAPH_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index 5a0e061e994..6a9d8801e28 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -29,31 +29,16 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_userdef_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -71,12 +56,8 @@ #include "UI_view2d.h" #include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_keyframes_draw.h" #include "ED_keyframes_edit.h" #include "ED_markers.h" -#include "ED_screen.h" -#include "ED_space_api.h" #include "WM_api.h" #include "WM_types.h" @@ -110,23 +91,23 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel) int filter; SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - BeztEditData bed; - BeztEditFunc test_cb, sel_cb; + KeyframeEditData ked; + KeyframeEditFunc test_cb, sel_cb; /* determine type-based settings */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); /* filter data */ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* init BezTriple looping data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* See if we should be selecting or deselecting */ if (test) { for (ale= anim_data.first; ale; ale= ale->next) { - if (ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, test_cb, NULL)) { + if (ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, test_cb, NULL)) { sel= SELECT_SUBTRACT; break; } @@ -141,7 +122,7 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel) FCurve *fcu= (FCurve *)ale->key_data; /* Keyframes First */ - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, sel_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL); /* only change selection of channel when the visibility of keyframes doesn't depend on this */ if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) { @@ -179,7 +160,7 @@ static int graphkeys_deselectall_exec(bContext *C, wmOperator *op) deselect_graph_keys(&ac, 1, SELECT_ADD); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -211,18 +192,19 @@ void GRAPH_OT_select_all_toggle (wmOperatorType *ot) */ /* Borderselect only selects keyframes now, as overshooting handles often get caught too, - * which means that they may be inadvertantly moved as well. - * Also, for convenience, handles should get same status as keyframe (if it was within bounds) + * which means that they may be inadvertantly moved as well. However, incl_handles overrides + * this, and allow handles to be considered independently too. + * Also, for convenience, handles should get same status as keyframe (if it was within bounds). */ -static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, short selectmode) +static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, short selectmode, short incl_handles) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - BeztEditData bed; - BeztEditFunc ok_cb, select_cb; + KeyframeEditData ked; + KeyframeEditFunc ok_cb, select_cb; View2D *v2d= &ac->ar->v2d; rctf rectf; @@ -231,7 +213,7 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get beztriple editing/validation funcs */ @@ -239,8 +221,12 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho ok_cb= ANIM_editkeyframes_ok(mode); /* init editing data */ - memset(&bed, 0, sizeof(BeztEditData)); - bed.data= &rectf; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.data= &rectf; + + /* treat handles separately? */ + if (incl_handles) + ked.iterflags |= KEYFRAME_ITER_INCL_HANDLES; /* loop over data, doing border select */ for (ale= anim_data.first; ale; ale= ale->next) { @@ -258,21 +244,21 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho /* set horizontal range (if applicable) * NOTE: these values are only used for x-range and y-range but not region - * (which uses bed.data, i.e. rectf) + * (which uses ked.data, i.e. rectf) */ if (mode != BEZT_OK_VALUERANGE) { - bed.f1= rectf.xmin; - bed.f2= rectf.xmax; + ked.f1= rectf.xmin; + ked.f2= rectf.xmax; } else { - bed.f1= rectf.ymin; - bed.f2= rectf.ymax; + ked.f1= rectf.ymin; + ked.f2= rectf.ymax; } /* firstly, check if any keyframes will be hit by this */ - if (ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, ok_cb, NULL)) { + if (ANIM_fcurve_keyframes_loop(&ked, fcu, NULL, ok_cb, NULL)) { /* select keyframes that are in the appropriate places */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, fcu, ok_cb, select_cb, NULL); /* only change selection of channel when the visibility of keyframes doesn't depend on this */ if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) { @@ -301,16 +287,23 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op) bAnimContext ac; rcti rect; short mode=0, selectmode=0; + short incl_handles; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + + /* get select mode + * - 'gesture_mode' from the operator specifies how to select + * - 'include_handles' from the operator specifies whether to include handles in the selection + */ if (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT) selectmode= SELECT_ADD; else selectmode= SELECT_SUBTRACT; - + + incl_handles = RNA_boolean_get(op->ptr, "include_handles"); + /* get settings from operator */ rect.xmin= RNA_int_get(op->ptr, "xmin"); rect.ymin= RNA_int_get(op->ptr, "ymin"); @@ -333,10 +326,10 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op) mode= BEZT_OK_REGION; /* apply borderselect action */ - borderselect_graphkeys(&ac, rect, mode, selectmode); + borderselect_graphkeys(&ac, rect, mode, selectmode, incl_handles); /* send notifier that keyframe selection has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -362,6 +355,7 @@ void GRAPH_OT_select_border(wmOperatorType *ot) WM_operator_properties_gesture_border(ot, FALSE); ot->prop= RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", ""); + RNA_def_boolean(ot->srna, "include_handles", 0, "Include Handles", "Are handles tested individually against the selection criteria"); } /* ******************** Column Select Operator **************************** */ @@ -390,8 +384,8 @@ static void markers_selectkeys_between (bAnimContext *ac) bAnimListElem *ale; int filter; - BeztEditFunc ok_cb, select_cb; - BeztEditData bed; + KeyframeEditFunc ok_cb, select_cb; + KeyframeEditData ked; float min, max; /* get extreme markers */ @@ -403,12 +397,12 @@ static void markers_selectkeys_between (bAnimContext *ac) ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); select_cb= ANIM_editkeyframes_select(SELECT_ADD); - memset(&bed, 0, sizeof(BeztEditData)); - bed.f1= min; - bed.f2= max; + memset(&ked, 0, sizeof(KeyframeEditData)); + ked.f1= min; + ked.f2= max; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys in-between */ @@ -417,11 +411,11 @@ static void markers_selectkeys_between (bAnimContext *ac) if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else { - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); } } @@ -439,20 +433,20 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode) Scene *scene= ac->scene; CfraElem *ce; - BeztEditFunc select_cb, ok_cb; - BeztEditData bed; + KeyframeEditFunc select_cb, ok_cb; + KeyframeEditData ked; /* initialise keyframe editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* build list of columns */ switch (mode) { case GRAPHKEYS_COLUMNSEL_KEYS: /* list of selected keys */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_to_cfraelem, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_to_cfraelem, NULL); BLI_freelistN(&anim_data); break; @@ -460,13 +454,13 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode) case GRAPHKEYS_COLUMNSEL_CFRA: /* current frame */ /* make a single CfraElem for storing this */ ce= MEM_callocN(sizeof(CfraElem), "cfraElem"); - BLI_addtail(&bed.list, ce); + BLI_addtail(&ked.list, ce); ce->cfra= (float)CFRA; break; case GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */ - ED_markers_make_cfra_list(ac->markers, &bed.list, 1); + ED_markers_make_cfra_list(ac->markers, &ked.list, 1); break; default: /* invalid option */ @@ -480,29 +474,29 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode) /* loop through all of the keys and select additional keyframes * based on the keys found to be selected above */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(ac, ale); - /* loop over cfraelems (stored in the BeztEditData->list) + /* loop over cfraelems (stored in the KeyframeEditData->list) * - we need to do this here, as we can apply fewer NLA-mapping conversions */ - for (ce= bed.list.first; ce; ce= ce->next) { + for (ce= ked.list.first; ce; ce= ce->next) { /* set frame for validation callback to refer to */ if (ale) - bed.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP); + ked.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP); else - bed.f1= ce->cfra; + ked.f1= ce->cfra; /* select elements with frame number matching cfraelem */ - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); } } /* free elements */ - BLI_freelistN(&bed.list); + BLI_freelistN(&ked.list); BLI_freelistN(&anim_data); } @@ -526,7 +520,7 @@ static int graphkeys_columnselect_exec(bContext *C, wmOperator *op) columnselect_graph_keys(&ac, mode); /* set notifier that keyframe selection has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -549,6 +543,61 @@ void GRAPH_OT_select_column (wmOperatorType *ot) ot->prop= RNA_def_enum(ot->srna, "mode", prop_column_select_types, 0, "Mode", ""); } +/* ******************** Select Linked Operator *********************** */ + +static int graphkeys_select_linked_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + + ListBase anim_data= {NULL, NULL}; + bAnimListElem *ale; + int filter; + + KeyframeEditFunc ok_cb = ANIM_editkeyframes_ok(BEZT_OK_SELECTED); + KeyframeEditFunc sel_cb = ANIM_editkeyframes_select(SELECT_ADD); + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* loop through all of the keys and select additional keyframes based on these */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + for (ale= anim_data.first; ale; ale= ale->next) { + FCurve *fcu= (FCurve *)ale->key_data; + + /* check if anything selected? */ + if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, ok_cb, NULL)) { + /* select every keyframe in this curve then */ + ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, sel_cb, NULL); + } + } + + /* Cleanup */ + BLI_freelistN(&anim_data); + + /* set notifier that keyframe selection has changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); + + return OPERATOR_FINISHED; +} + +void GRAPH_OT_select_linked (wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Linked"; + ot->idname= "GRAPH_OT_select_linked"; + ot->description = "Select keyframes occurring the same F-Curves as selected ones"; + + /* api callbacks */ + ot->exec= graphkeys_select_linked_exec; + ot->poll= graphop_visible_keyframes_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/; +} + /* ******************** Select More/Less Operators *********************** */ /* Common code to perform selection */ @@ -558,16 +607,16 @@ static void select_moreless_graph_keys (bAnimContext *ac, short mode) bAnimListElem *ale; int filter; - BeztEditData bed; - BeztEditFunc build_cb; + KeyframeEditData ked; + KeyframeEditFunc build_cb; /* init selmap building data */ build_cb= ANIM_editkeyframes_buildselmap(mode); - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* loop through all of the keys and select additional keyframes based on these */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -578,15 +627,15 @@ static void select_moreless_graph_keys (bAnimContext *ac, short mode) continue; /* build up map of whether F-Curve's keyframes should be selected or not */ - bed.data= MEM_callocN(fcu->totvert, "selmap graphEdit"); - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, build_cb, NULL); + ked.data= MEM_callocN(fcu->totvert, "selmap graphEdit"); + ANIM_fcurve_keyframes_loop(&ked, fcu, NULL, build_cb, NULL); /* based on this map, adjust the selection status of the keyframes */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, bezt_selmap_flush, NULL); + ANIM_fcurve_keyframes_loop(&ked, fcu, NULL, bezt_selmap_flush, NULL); /* free the selmap used here */ - MEM_freeN(bed.data); - bed.data= NULL; + MEM_freeN(ked.data); + ked.data= NULL; } /* Cleanup */ @@ -607,7 +656,7 @@ static int graphkeys_select_more_exec (bContext *C, wmOperator *op) select_moreless_graph_keys(&ac, SELMAP_MORE); /* set notifier that keyframe selection has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -641,7 +690,7 @@ static int graphkeys_select_less_exec (bContext *C, wmOperator *op) select_moreless_graph_keys(&ac, SELMAP_LESS); /* set notifier that keyframe selection has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -682,11 +731,32 @@ static EnumPropertyItem prop_graphkeys_leftright_select_types[] = { /* ------------------- */ -enum { - NEAREST_HANDLE_LEFT = 0, +/* temp info for caching handle vertices close */ +typedef struct tNearestVertInfo { + struct tNearestVertInfo *next, *prev; + + FCurve *fcu; /* F-Curve that keyframe comes from */ + + BezTriple *bezt; /* keyframe to consider */ + FPoint *fpt; /* sample point to consider */ + + short hpoint; /* the handle index that we hit (eHandleIndex) */ + short sel; /* whether the handle is selected or not */ + int dist; /* distance from mouse to vert */ +} tNearestVertInfo; + +/* Tags for the type of graph vert that we have */ +typedef enum eGraphVertIndex { + NEAREST_HANDLE_LEFT = -1, NEAREST_HANDLE_KEY, NEAREST_HANDLE_RIGHT -} eHandleIndex; +} eGraphVertIndex; + +/* Tolerance for absolute radius (in pixels) of the vert from the cursor to use */ +// TODO: perhaps this should depend a bit on the size that the user set the vertices to be? +#define GVERTSEL_TOL 10 + +/* ....... */ /* check if its ok to select a handle */ // XXX also need to check for int-values only? @@ -697,11 +767,61 @@ static int fcurve_handle_sel_check(SpaceIpo *sipo, BezTriple *bezt) return 1; } -/* Find the vertex (either handle (0/2) or the keyframe (1)) that is nearest to the mouse cursor (in area coordinates) - * Selected verts get a disadvantage, to make it easier to select handles behind. - * Returns eHandleIndex - */ -static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fcurve, BezTriple **bezt) +/* check if the given vertex is within bounds or not */ +// TODO: should we return if we hit something? +static void nearest_fcurve_vert_store (ListBase *matches, View2D *v2d, FCurve *fcu, BezTriple *bezt, FPoint *fpt, short hpoint, int mval[2]) +{ + /* Keyframes or Samples? */ + if (bezt) { + int screen_co[2], dist; + + /* convert from data-space to screen coordinates + * NOTE: hpoint+1 gives us 0,1,2 respectively for each handle, + * needed to access the relevant vertex coordinates in the 3x3 + * 'vec' matrix + */ + UI_view2d_view_to_region(v2d, bezt->vec[hpoint+1][0], bezt->vec[hpoint+1][1], &screen_co[0], &screen_co[1]); + + /* check if distance from mouse cursor to vert in screen space is within tolerance */ + // XXX: inlined distance calculation, since we cannot do this on ints using the math lib... + //dist = len_v2v2(mval, screen_co); + dist = sqrt((mval[0] - screen_co[0])*(mval[0] - screen_co[0]) + + (mval[1] - screen_co[1])*(mval[1] - screen_co[1])); + + if (dist <= GVERTSEL_TOL) { + tNearestVertInfo *nvi = (tNearestVertInfo *)matches->last; + short replace = 0; + + /* if there is already a point for the F-Curve, check if this point is closer than that was */ + if ((nvi) && (nvi->fcu == fcu)) { + /* replace if we are closer, or if equal and that one wasn't selected but we are... */ + if ( (nvi->dist > dist) || ((nvi->sel == 0) && BEZSELECTED(bezt)) ) + replace= 1; + } + /* add new if not replacing... */ + if (replace == 0) + nvi = MEM_callocN(sizeof(tNearestVertInfo), "Nearest Graph Vert Info - Bezt"); + + /* store values */ + nvi->fcu = fcu; + nvi->bezt = bezt; + nvi->hpoint = hpoint; + nvi->dist = dist; + + nvi->sel= BEZSELECTED(bezt); // XXX... should this use the individual verts instead? + + /* add to list of matches if appropriate... */ + if (replace == 0) + BLI_addtail(matches, nvi); + } + } + else if (fpt) { + // TODO... + } +} + +/* helper for find_nearest_fcurve_vert() - build the list of nearest matches */ +static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBase *matches) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -709,18 +829,12 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; View2D *v2d= &ac->ar->v2d; - int hpoint=0, sco[3][2]; - int dist= 100, temp, i; - - /* clear pointers first */ - *fcurve= 0; - *bezt= 0; /* get curves to search through * - if the option to only show keyframes that belong to selected F-Curves is enabled, * include the 'only selected' flag... */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (sipo->flag & SIPO_SELCUVERTSONLY) // FIXME: this should really be check for by the filtering code... filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -732,71 +846,42 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc /* apply unit corrections */ ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0); - /* try to progressively get closer to the right point... */ + /* apply NLA mapping to all the keyframes */ + if (adt) + ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); + if (fcu->bezt) { BezTriple *bezt1=fcu->bezt, *prevbezt=NULL; - - /* apply NLA mapping to all the keyframes */ - if (adt) - ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); + int i; for (i=0; i < fcu->totvert; i++, prevbezt=bezt1, bezt1++) { - /* convert beztriple points to screen-space */ - UI_view2d_to_region_no_clip(v2d, bezt1->vec[0][0], bezt1->vec[0][1], &sco[0][0], &sco[0][1]); - UI_view2d_to_region_no_clip(v2d, bezt1->vec[1][0], bezt1->vec[1][1], &sco[1][0], &sco[1][1]); - UI_view2d_to_region_no_clip(v2d, bezt1->vec[2][0], bezt1->vec[2][1], &sco[2][0], &sco[2][1]); - - /* keyframe - do select? */ - temp= abs(mval[0] - sco[1][0]) + abs(mval[1] - sco[1][1]); - - if (bezt1->f2 & SELECT) - temp += 5; - - if (temp < dist) { - hpoint= NEAREST_HANDLE_KEY; - *bezt= bezt1; - dist= temp; - *fcurve= fcu; - } + /* keyframe */ + nearest_fcurve_vert_store(matches, v2d, fcu, bezt1, NULL, NEAREST_HANDLE_KEY, mval); /* handles - only do them if they're visible */ - if (fcurve_handle_sel_check(sipo, bezt1)) { + if (fcurve_handle_sel_check(sipo, bezt1) && (fcu->totvert > 1)) { /* first handle only visible if previous segment had handles */ if ( (!prevbezt && (bezt1->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) { - temp= -3 + abs(mval[0] - sco[0][0]) + abs(mval[1] - sco[0][1]); - if (bezt1->f1 & SELECT) - temp += 5; - - if (temp < dist) { - hpoint= NEAREST_HANDLE_LEFT; - *bezt= bezt1; - dist= temp; - *fcurve= fcu; - } + nearest_fcurve_vert_store(matches, v2d, fcu, bezt1, NULL, NEAREST_HANDLE_LEFT, mval); } /* second handle only visible if this segment is bezier */ if (bezt1->ipo == BEZT_IPO_BEZ) { - temp= abs(mval[0] - sco[2][0]) + abs(mval[1] - sco[2][1]); - if (bezt1->f3 & SELECT) - temp += 5; - - if (temp < dist) { - hpoint= NEAREST_HANDLE_RIGHT; - *bezt=bezt1; - dist= temp; - *fcurve= fcu; - } + nearest_fcurve_vert_store(matches, v2d, fcu, bezt1, NULL, NEAREST_HANDLE_RIGHT, mval); } } } - - /* un-apply NLA mapping from all the keyframes */ - if (adt) - ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } + else if (fcu->fpt) { + // TODO; do this for samples too + + } + + /* un-apply NLA mapping from all the keyframes */ + if (adt) + ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); /* unapply unit corrections */ ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE); @@ -804,25 +889,85 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc /* free channels */ BLI_freelistN(&anim_data); - - /* return handle */ - return hpoint; } - + +/* helper for find_nearest_fcurve_vert() - get the best match to use */ +static tNearestVertInfo *get_best_nearest_fcurve_vert (bAnimContext *ac, ListBase *matches) +{ + tNearestVertInfo *nvi = NULL; + short found = 0; + + /* abort if list is empty */ + if (matches->first == NULL) + return NULL; + + /* if list only has 1 item, remove it from the list and return */ + if (matches->first == matches->last) { + /* need to remove from the list, otherwise it gets freed and then we can't return it */ + nvi= matches->first; + BLI_remlink(matches, nvi); + + return nvi; + } + + /* try to find the first selected F-Curve vert, then take the one after it */ + for (nvi = matches->first; nvi; nvi = nvi->next) { + /* which mode of search are we in: find first selected, or find vert? */ + if (found) { + /* just take this vert now that we've found the selected one + * - we'll need to remove this from the list so that it can be returned to the original caller + */ + BLI_remlink(matches, nvi); + return nvi; + } + else { + /* if vert is selected, we've got what we want... */ + if (nvi->sel) + found= 1; + } + } + + /* if we're still here, this means that we failed to find anything appropriate in the first pass, + * so just take the first item now... + */ + nvi = matches->first; + BLI_remlink(matches, nvi); + return nvi; +} + +/* Find the nearest vertices (either a handle or the keyframe) that are nearest to the mouse cursor (in area coordinates) + * NOTE: the match info found must still be freed + */ +static tNearestVertInfo *find_nearest_fcurve_vert (bAnimContext *ac, int mval[2]) +{ + ListBase matches = {NULL, NULL}; + tNearestVertInfo *nvi; + + /* step 1: get the nearest verts */ + get_nearest_fcurve_verts_list(ac, mval, &matches); + + /* step 2: find the best vert */ + nvi= get_best_nearest_fcurve_vert(ac, &matches); + + BLI_freelistN(&matches); + + /* return the best vert found */ + return nvi; +} + +/* ------------------- */ + /* option 1) select keyframe directly under mouse */ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, short curves_only) { SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - FCurve *fcu; - BezTriple *bezt; - short handle; - int filter; + tNearestVertInfo *nvi; /* find the beztriple that we're selecting, and the handle that was clicked on */ - handle= findnearest_fcurve_vert(ac, mval, &fcu, &bezt); + nvi = find_nearest_fcurve_vert(ac, mval); /* check if anything to select */ - if (fcu == NULL) + if (nvi == NULL) return; /* deselect all other curves? */ @@ -843,13 +988,15 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s /* if points can be selected on this F-Curve */ // TODO: what about those with no keyframes? - if ((curves_only == 0) && ((fcu->flag & FCURVE_PROTECTED)==0)) { + if ((curves_only == 0) && ((nvi->fcu->flag & FCURVE_PROTECTED)==0)) { /* only if there's keyframe */ - if (bezt) { + if (nvi->bezt) { + BezTriple *bezt= nvi->bezt; + /* depends on selection mode */ if (select_mode == SELECT_INVERT) { /* keyframe - invert select of all */ - if (handle == NEAREST_HANDLE_KEY) { + if (nvi->hpoint == NEAREST_HANDLE_KEY) { if (BEZSELECTED(bezt)) { BEZ_DESEL(bezt); } @@ -859,7 +1006,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s } /* handles - toggle selection of relevant handle */ - else if (handle == NEAREST_HANDLE_LEFT) { + else if (nvi->hpoint == NEAREST_HANDLE_LEFT) { /* toggle selection */ bezt->f1 ^= SELECT; } @@ -870,45 +1017,51 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s } else { /* if the keyframe was clicked on, select all verts of given beztriple */ - if (handle == NEAREST_HANDLE_KEY) { + if (nvi->hpoint == NEAREST_HANDLE_KEY) { BEZ_SEL(bezt); } /* otherwise, select the handle that applied */ - else if (handle == NEAREST_HANDLE_LEFT) + else if (nvi->hpoint == NEAREST_HANDLE_LEFT) bezt->f1 |= SELECT; else bezt->f3 |= SELECT; } } + else if (nvi->fpt) { + // TODO: need to handle sample points + } } else { - BeztEditFunc select_cb; - BeztEditData bed; + KeyframeEditFunc select_cb; + KeyframeEditData ked; /* initialise keyframe editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* set up BezTriple edit callbacks */ select_cb= ANIM_editkeyframes_select(select_mode); /* select all keyframes */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, nvi->fcu, NULL, select_cb, NULL); } /* only change selection of channel when the visibility of keyframes doesn't depend on this */ if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) { /* select or deselect curve? */ if (select_mode == SELECT_INVERT) - fcu->flag ^= FCURVE_SELECTED; + nvi->fcu->flag ^= FCURVE_SELECTED; else if (select_mode == SELECT_ADD) - fcu->flag |= FCURVE_SELECTED; + nvi->fcu->flag |= FCURVE_SELECTED; /* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */ - if (fcu->flag & FCURVE_SELECTED) { - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); - ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE); + if (nvi->fcu->flag & FCURVE_SELECTED) { + int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); + ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nvi->fcu, ANIMTYPE_FCURVE); } } + + /* free temp sample data for filtering */ + MEM_freeN(nvi); } /* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */ @@ -919,8 +1072,8 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor int filter; SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - BeztEditFunc ok_cb, select_cb; - BeztEditData bed; + KeyframeEditFunc ok_cb, select_cb; + KeyframeEditData ked; Scene *scene= ac->scene; /* if select mode is replace, deselect all keyframes (and channels) first */ @@ -943,18 +1096,18 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); select_cb= ANIM_editkeyframes_select(select_mode); - memset(&bed, 0, sizeof(BeztEditFunc)); + memset(&ked, 0, sizeof(KeyframeEditFunc)); if (leftright == GRAPHKEYS_LRSEL_LEFT) { - bed.f1 = MINAFRAMEF; - bed.f2 = (float)(CFRA + 0.1f); + ked.f1 = MINAFRAMEF; + ked.f2 = (float)(CFRA + 0.1f); } else { - bed.f1 = (float)(CFRA - 0.1f); - bed.f2 = MAXFRAMEF; + ked.f1 = (float)(CFRA - 0.1f); + ked.f2 = MAXFRAMEF; } /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys on the side where most data occurs */ @@ -963,11 +1116,11 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); } else - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); } /* Cleanup */ @@ -982,19 +1135,24 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec int filter; SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - BeztEditFunc select_cb, ok_cb; - BeztEditData bed; - FCurve *fcu; - BezTriple *bezt; + KeyframeEditFunc select_cb, ok_cb; + KeyframeEditData ked; + tNearestVertInfo *nvi; float selx = (float)ac->scene->r.cfra; - /* find the beztriple that occurs on this frame, and use his as the frame number we're using */ - findnearest_fcurve_vert(ac, mval, &fcu, &bezt); + /* find the beztriple that we're selecting, and the handle that was clicked on */ + nvi = find_nearest_fcurve_vert(ac, mval); /* check if anything to select */ - if (ELEM(NULL, fcu, bezt)) + if (nvi == NULL) return; - selx= bezt->vec[1][0]; + + /* get frame number on which elements should be selected */ + // TODO: should we restrict to integer frames only? + if (nvi->bezt) + selx= nvi->bezt->vec[1][0]; + else if (nvi->fpt) + selx= nvi->fpt->vec[0]; /* if select mode is replace, deselect all keyframes (and channels) first */ if (select_mode==SELECT_REPLACE) { @@ -1013,7 +1171,7 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec } /* initialise keyframe editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* set up BezTriple edit callbacks */ select_cb= ANIM_editkeyframes_select(select_mode); @@ -1022,7 +1180,7 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec /* loop through all of the keys and select additional keyframes * based on the keys found to be selected above */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1030,16 +1188,17 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec /* set frame for validation callback to refer to */ if (adt) - bed.f1= BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP); + ked.f1= BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP); else - bed.f1= selx; + ked.f1= selx; /* select elements with frame number matching cfra */ - ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); } /* free elements */ - BLI_freelistN(&bed.list); + MEM_freeN(nvi); + BLI_freelistN(&ked.list); BLI_freelistN(&anim_data); } @@ -1101,7 +1260,7 @@ static int graphkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *ev } /* set notifier that keyframe selection (and also channel selection in some cases) has changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT|ND_ANIMCHAN_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL); /* for tweak grab to work */ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c index 3d1f0b49826..ad96370e4fa 100644 --- a/source/blender/editors/space_graph/graph_utils.c +++ b/source/blender/editors/space_graph/graph_utils.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,12 +32,8 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_object_types.h" #include "DNA_space_types.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -62,20 +58,10 @@ #include "BIF_gl.h" #include "WM_api.h" -#include "WM_types.h" -#include "RNA_access.h" -#include "RNA_define.h" #include "ED_anim_api.h" -#include "ED_keyframing.h" -#include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "graph_intern.h" // own include @@ -141,6 +127,8 @@ short fcurve_needs_draw_fmodifier_controls (FCurve *fcu, FModifier *fcm) /* clearly harmless */ case FMODIFIER_TYPE_CYCLES: return 0; + case FMODIFIER_TYPE_STEPPED: + return 0; /* borderline... */ case FMODIFIER_TYPE_NOISE: diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 31197f49002..1e006ca38ec 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,10 +30,7 @@ #include #include "DNA_anim_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -48,7 +45,6 @@ #include "BKE_screen.h" #include "BKE_utildefines.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_anim_api.h" #include "ED_markers.h" @@ -58,7 +54,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -387,9 +382,12 @@ static void graph_region_listener(ARegion *ar, wmNotifier *wmn) case ND_OB_ACTIVE: case ND_FRAME: case ND_MARKERS: - case ND_SEQUENCER_SELECT: ED_region_tag_redraw(ar); break; + case ND_SEQUENCER: + if (wmn->action == NA_SELECTED) + ED_region_tag_redraw(ar); + break; } break; case NC_OBJECT: @@ -406,13 +404,9 @@ static void graph_region_listener(ARegion *ar, wmNotifier *wmn) } break; case NC_NODE: - switch(wmn->data) { - case ND_NODE_SELECT: - ED_region_tag_redraw(ar); - break; - } switch(wmn->action) { case NA_EDITED: + case NA_SELECTED: ED_region_tag_redraw(ar); break; } @@ -437,7 +431,7 @@ static void graph_listener(ScrArea *sa, wmNotifier *wmn) switch (wmn->category) { case NC_ANIMATION: /* for selection changes of animation data, we can just redraw... otherwise autocolor might need to be done again */ - if (ELEM(wmn->data, ND_KEYFRAME_SELECT, ND_ANIMCHAN_SELECT)) + if (ELEM(wmn->data, ND_KEYFRAME, ND_ANIMCHAN) && (wmn->action == NA_SELECTED)) ED_area_tag_redraw(sa); else ED_area_tag_refresh(sa); @@ -526,7 +520,7 @@ static void graph_refresh(const bContext *C, ScrArea *sa) * - we don't include ANIMFILTER_CURVEVISIBLE filter, as that will result in a * mismatch between channel-colors and the drawn curves */ - filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CURVESONLY|ANIMFILTER_NODUPLIS); items= ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* loop over F-Curves, assigning colors */ diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt new file mode 100644 index 00000000000..fce56b9c239 --- /dev/null +++ b/source/blender/editors/space_image/CMakeLists.txt @@ -0,0 +1,54 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../imbuf + ../../bmesh + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../render/extern/include + ../../windowmanager +) + +IF(WITH_OPENEXR) + ADD_DEFINITIONS(-DWITH_OPENEXR) +ENDIF(WITH_OPENEXR) + +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + +IF(WITH_LCMS) + SET(INC ${INC} ${LCMS_INCLUDE_DIR}) + ADD_DEFINITIONS(-DWITH_LCMS) +ENDIF(WITH_LCMS) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_space_image "${SRC}" "${INC}") diff --git a/source/blender/editors/space_image/Makefile b/source/blender/editors/space_image/Makefile index a55b4e58dfa..ab30ff607ec 100644 --- a/source/blender/editors/space_image/Makefile +++ b/source/blender/editors/space_image/Makefile @@ -58,3 +58,7 @@ ifeq ($(WITH_OPENEXR), true) CPPFLAGS += -DWITH_OPENEXR endif +ifeq ($(WHITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript index 2b1d5589cb3..933a30808dc 100644 --- a/source/blender/editors/space_image/SConscript +++ b/source/blender/editors/space_image/SConscript @@ -11,7 +11,13 @@ defs = [] if env['WITH_BF_LCMS']: defs.append('WITH_LCMS') + incs += ' ' + env['BF_LCMS_INC'] if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] env.BlenderLib ( 'bf_editors_space_image', sources, Split(incs), defs, libtype=['core'], priority=[40] ) diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 047fc3493cf..e9b094ee8fb 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -29,17 +29,10 @@ #include #include -#include "DNA_color_types.h" -#include "DNA_image_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_packedFile_types.h" #include "DNA_node_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -70,11 +63,8 @@ #include "ED_gpencil.h" #include "ED_image.h" -#include "ED_mesh.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_uvedit.h" -#include "ED_util.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -86,14 +76,12 @@ #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "image_intern.h" #define B_REDR 1 #define B_IMAGECHANGED 2 #define B_TRANS_IMAGE 3 -#define B_CURSOR_IMAGE 4 #define B_NOP 0 #define B_TWINANIM 5 #define B_SIMAGETILE 6 @@ -114,20 +102,13 @@ #define B_SIMACLONEBROWSE 25 #define B_SIMACLONEDELETE 26 -/* XXX */ -static int simaFaceDraw_Check() {return 0;} -static int simaUVSel_Check() { return 0;} -/* XXX */ - /* proto */ static void image_editvertex_buts(const bContext *C, uiBlock *block); -static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block); static void do_image_panel_events(bContext *C, void *arg, int event) { SpaceImage *sima= CTX_wm_space_image(C); - ARegion *ar= CTX_wm_region(C); switch(event) { case B_REDR: @@ -135,9 +116,6 @@ static void do_image_panel_events(bContext *C, void *arg, int event) case B_TRANS_IMAGE: image_editvertex_buts(C, NULL); break; - case B_CURSOR_IMAGE: - image_editcursor_buts(C, &ar->v2d, NULL); - break; } /* all events now */ @@ -162,7 +140,7 @@ static void image_info(Image *ima, ImBuf *ibuf, char *str) ofs+= sprintf(str+ofs, "%d frs", IMB_anim_get_duration(ima->anim)); } else - ofs= sprintf(str, "Image"); + ofs= sprintf(str, "Image"); ofs+= sprintf(str+ofs, ": size %d x %d,", ibuf->x, ibuf->y); @@ -221,7 +199,9 @@ static void image_transform_but_attr(SpaceImage *sima, int *imx, int *imy, int * /* is used for both read and write... */ static void image_editvertex_buts(const bContext *C, uiBlock *block) { + Scene *scene= CTX_data_scene(C); SpaceImage *sima= CTX_wm_space_image(C); + Image *ima= sima->image; Object *obedit= CTX_data_edit_object(C); BMEditMesh *em; BMFace *efa; @@ -239,13 +219,13 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block) em= ((Mesh *)obedit->data)->edit_btmesh; BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!simaFaceDraw_Check(efa, tf)) + if (!uvedit_face_visible(scene, ima, efa, tf)) continue; BM_ITER(l, &iter, em->bm, BM_LOOPS_OF_FACE, efa) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - if (simaUVSel_Check(efa, tf, luv)) { + if (uvedit_uv_selected(em, scene, l)) { cent[0] += luv->uv[0]; cent[1] += luv->uv[1]; @@ -293,13 +273,13 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block) BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!simaFaceDraw_Check(efa, tf)) + if (!uvedit_face_visible(scene, ima, efa, tf)) continue; BM_ITER(l, &iter, em->bm, BM_LOOPS_OF_FACE, efa) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - if (simaUVSel_Check(efa, tf, luv)) { + if (uvedit_uv_selected(em, scene, l)) { luv->uv[0] += delta[0]; luv->uv[1] += delta[1]; } @@ -312,41 +292,6 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block) /* is used for both read and write... */ -static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block) -{ - SpaceImage *sima= CTX_wm_space_image(C); - static float ocent[2]; - int imx= 256, imy= 256; - int step, digits; - - image_transform_but_attr(sima, &imx, &imy, &step, &digits); - - if(block) { // do the buttons - ocent[0]= v2d->cursor[0]; - ocent[1]= v2d->cursor[1]; - if (sima->flag & SI_COORDFLOATS) { - } else { - ocent[0] *= imx; - ocent[1] *= imy; - } - - uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_CURSOR_IMAGE, "Cursor X:", 165, 120, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, ""); - uiDefButF(block, NUM, B_CURSOR_IMAGE, "Cursor Y:", 165, 100, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, ""); - uiBlockEndAlign(block); - } - else { // apply event - if (sima->flag & SI_COORDFLOATS) { - v2d->cursor[0]= ocent[0]; - v2d->cursor[1]= ocent[1]; - } - else { - v2d->cursor[0]= ocent[0]/imx; - v2d->cursor[1]= ocent[1]/imy; - } - WM_event_add_notifier(C, NC_IMAGE, sima->image); - } -} static int image_panel_poll(const bContext *C, PanelType *pt) { @@ -523,12 +468,12 @@ static char *slot_menu() char *str; int a, slot; - str= MEM_callocN(RE_SLOT_MAX*32, "menu slots"); + str= MEM_callocN(IMA_MAX_RENDER_SLOT*32, "menu slots"); strcpy(str, "Slot %t"); a= strlen(str); - for(slot=0; slotmenunr); BKE_image_multilayer_index(rr_v, iuser); WM_event_add_notifier(C, NC_IMAGE|ND_DRAW, NULL); } @@ -703,7 +647,7 @@ static void image_user_change(bContext *C, void *iuser_v, void *unused) } #endif -static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w, int render) +static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w, short *render_slot) { uiBlock *block= uiLayoutGetBlock(layout); uiBut *but; @@ -719,10 +663,9 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image wmenu3= (3*w)/6; /* menu buts */ - if(render) { + if(render_slot) { strp= slot_menu(); - iuser->menunr= RE_GetViewSlot(); - but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu1, 20, &iuser->menunr, 0,0,0,0, "Select Slot"); + but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu1, 20, render_slot, 0,0,0,0, "Select Slot"); uiButSetFunc(but, image_multi_cb, rr, iuser); MEM_freeN(strp); } @@ -741,7 +684,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image } } -static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int render) +static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, short *render_slot) { uiBlock *block= uiLayoutGetBlock(layout); uiLayout *row; @@ -762,7 +705,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, but= uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0,0,18,20, NULL, 0, 0, 0, 0, "Next Layer"); uiButSetFunc(but, image_multi_inclay_cb, rr, iuser); - uiblock_layer_pass_buttons(row, rr, iuser, 230, render); + uiblock_layer_pass_buttons(row, rr, iuser, 230, render_slot); /* decrease, increase arrows */ but= uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0,0,17,20, NULL, 0, 0, 0, 0, "Previous Pass"); @@ -834,7 +777,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn uiLayoutSetContextPointer(layout, "edit_image", &imaptr); if(!compact) - uiTemplateID(layout, C, ptr, propname, "IMAGE_OT_new", "IMAGE_OT_open", NULL); + uiTemplateID(layout, C, ptr, propname, "IMAGE_OT_new", "IMAGE_OT_open", NULL, NULL); // XXX missing: reload, pack @@ -871,19 +814,29 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn } else if(ima->type==IMA_TYPE_R_RESULT) { /* browse layer/passes */ - Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); + Render *re= RE_GetRender(scene->id.name); RenderResult *rr= RE_AcquireResultRead(re); - uiblock_layer_pass_arrow_buttons(layout, rr, iuser, 1); + uiblock_layer_pass_arrow_buttons(layout, rr, iuser, &ima->render_slot); RE_ReleaseResult(re); } } else { row= uiLayoutRow(layout, 0); - uiItemR(row, NULL, 0, &imaptr, "source", (compact)? 0: UI_ITEM_R_EXPAND); + uiItemR(row, &imaptr, "source", 0, NULL, 0); if(ima->source != IMA_SRC_GENERATED) { row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, &imaptr, "filename", 0); + split = uiLayoutSplit(row, 0.0, 0); + if (ima->packedfile) + uiItemO(split, "", ICON_PACKAGE, "image.unpack"); + else + uiItemO(split, "", ICON_UGLYPACKAGE, "image.pack"); + + split = uiLayoutSplit(row, 0.0, 0); + row= uiLayoutRow(split, 1); + uiLayoutSetEnabled(row, ima->packedfile==NULL); + + uiItemR(row, &imaptr, "filepath", 0, "", 0); uiItemO(row, "", ICON_FILE_REFRESH, "image.reload"); } @@ -900,7 +853,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn /* multilayer? */ if(ima->type==IMA_TYPE_MULTILAYER && ima->rr) { - uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser, 0); + uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser, NULL); } else if(ima->source != IMA_SRC_GENERATED) { if(compact == 0) { @@ -918,14 +871,13 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn split= uiLayoutSplit(layout, 0, 0); col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &imaptr, "fields", 0); + uiItemR(col, &imaptr, "fields", 0, NULL, 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &imaptr, "field_order", UI_ITEM_R_EXPAND); + uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, 0); uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "fields")); col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &imaptr, "antialias", 0); - uiItemR(col, NULL, 0, &imaptr, "premultiply", 0); + uiItemR(col, &imaptr, "premultiply", 0, NULL, 0); } } @@ -938,30 +890,30 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn sprintf(str, "(%d) Frames", iuser->framenr); row= uiLayoutRow(col, 1); - uiItemR(col, str, 0, userptr, "frames", 0); + uiItemR(col, userptr, "frames", 0, str, 0); if(ima->anim) { block= uiLayoutGetBlock(row); - but= uiDefBut(block, BUT, 0, "<", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames from the movie or sequence."); + but= uiDefBut(block, BUT, 0, "Match Movie Length", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames to match the movie or sequence."); uiButSetFunc(but, set_frames_cb, ima, iuser); } - uiItemR(col, "Start", 0, userptr, "start_frame", 0); - uiItemR(col, NULL, 0, userptr, "offset", 0); + uiItemR(col, userptr, "frame_start", 0, "Start", 0); + uiItemR(col, userptr, "offset", 0, NULL, 0); col= uiLayoutColumn(split, 0); - uiItemR(col, "Fields", 0, userptr, "fields_per_frame", 0); - uiItemR(col, NULL, 0, userptr, "auto_refresh", 0); - uiItemR(col, NULL, 0, userptr, "cyclic", 0); + uiItemR(col, userptr, "fields_per_frame", 0, "Fields", 0); + uiItemR(col, userptr, "auto_refresh", 0, NULL, 0); + uiItemR(col, userptr, "cyclic", 0, NULL, 0); } else if(ima->source==IMA_SRC_GENERATED) { split= uiLayoutSplit(layout, 0, 0); col= uiLayoutColumn(split, 1); - uiItemR(col, "X", 0, &imaptr, "generated_width", 0); - uiItemR(col, "Y", 0, &imaptr, "generated_height", 0); + uiItemR(col, &imaptr, "generated_width", 0, "X", 0); + uiItemR(col, &imaptr, "generated_height", 0, "Y", 0); col= uiLayoutColumn(split, 0); - uiItemR(col, NULL, 0, &imaptr, "generated_type", UI_ITEM_R_EXPAND); + uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, 0); } } @@ -980,7 +932,7 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser /* render layers and passes */ if(ima && iuser) { rr= BKE_image_acquire_renderresult(scene, ima); - uiblock_layer_pass_buttons(layout, rr, iuser, 160, ima->type==IMA_TYPE_R_RESULT); + uiblock_layer_pass_buttons(layout, rr, iuser, 160, (ima->type==IMA_TYPE_R_RESULT)? &ima->render_slot: NULL); BKE_image_release_renderresult(scene, ima); } } @@ -993,26 +945,27 @@ static int image_panel_uv_poll(const bContext *C, PanelType *pt) static void image_panel_uv(const bContext *C, Panel *pa) { - ARegion *ar= CTX_wm_region(C); uiBlock *block; block= uiLayoutAbsoluteBlock(pa->layout); uiBlockSetHandleFunc(block, do_image_panel_events, NULL); image_editvertex_buts(C, block); - image_editcursor_buts(C, &ar->v2d, block); } void image_buttons_register(ARegionType *art) { PanelType *pt; - pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv"); - strcpy(pt->idname, "IMAGE_PT_uv"); - strcpy(pt->label, "UV"); - pt->draw= image_panel_uv; - pt->poll= image_panel_uv_poll; - BLI_addtail(&art->paneltypes, pt); + /* editvertex_buts not working atm */ + if(0) { + pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv"); + strcpy(pt->idname, "IMAGE_PT_uv"); + strcpy(pt->label, "UV"); + pt->draw= image_panel_uv; + pt->poll= image_panel_uv_poll; + BLI_addtail(&art->paneltypes, pt); + } pt= MEM_callocN(sizeof(PanelType), "spacetype image panel curves"); strcpy(pt->idname, "IMAGE_PT_curves"); diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index cb942472b9e..309c0061130 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -31,15 +31,14 @@ #include "MEM_guardedalloc.h" -#include "DNA_brush_types.h" #include "DNA_camera_types.h" -#include "DNA_image_types.h" #include "DNA_object_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "PIL_time.h" +#include "BLI_threads.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -56,13 +55,13 @@ #include "ED_gpencil.h" #include "ED_image.h" -#include "ED_screen.h" #include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "WM_api.h" + +#include "RE_pipeline.h" #include "image_intern.h" @@ -77,50 +76,47 @@ static void image_verify_buffer_float(SpaceImage *sima, Image *ima, ImBuf *ibuf, NOTE: if float buffer changes, we have to manually remove the rect */ - if(ibuf->rect_float) { - if(ibuf->rect==NULL) { - if (color_manage) { - if (ima && ima->source == IMA_SRC_VIEWER) - ibuf->profile = IB_PROFILE_LINEAR_RGB; - } else { - ibuf->profile = IB_PROFILE_NONE; - } - IMB_rect_from_float(ibuf); + if(ibuf->rect_float && ibuf->rect==NULL) { + if(color_manage) { + if(ima && ima->source == IMA_SRC_VIEWER) + ibuf->profile = IB_PROFILE_LINEAR_RGB; } + else + ibuf->profile = IB_PROFILE_NONE; + + IMB_rect_from_float(ibuf); } } -static void draw_render_info(Image *ima, ARegion *ar) +static void draw_render_info(Scene *scene, Image *ima, ARegion *ar) { + RenderResult *rr; rcti rect; float colf[3]; - int showspare= 0; // XXX BIF_show_render_spare(); - if(ima->render_text==NULL) - return; - - rect= ar->winrct; - rect.xmin= 0; - rect.ymin= ar->winrct.ymax - ar->winrct.ymin - HEADER_HEIGHT; - rect.xmax= ar->winrct.xmax - ar->winrct.xmin; - rect.ymax= ar->winrct.ymax - ar->winrct.ymin; - - /* clear header rect */ - UI_GetThemeColor3fv(TH_BACK, colf); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glColor4f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f, 0.5f); - glRecti(rect.xmin, rect.ymin, rect.xmax, rect.ymax+1); - glDisable(GL_BLEND); - - UI_ThemeColor(TH_TEXT_HI); + rr= BKE_image_acquire_renderresult(scene, ima); - if(showspare) { - UI_DrawString(12, rect.ymin + 5, "(Previous)"); - UI_DrawString(72, rect.ymin + 5, ima->render_text); + if(rr && rr->text) { + rect= ar->winrct; + rect.xmin= 0; + rect.ymin= ar->winrct.ymax - ar->winrct.ymin - HEADER_HEIGHT; + rect.xmax= ar->winrct.xmax - ar->winrct.xmin; + rect.ymax= ar->winrct.ymax - ar->winrct.ymin; + + /* clear header rect */ + UI_GetThemeColor3fv(TH_BACK, colf); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glColor4f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f, 0.5f); + glRecti(rect.xmin, rect.ymin, rect.xmax, rect.ymax+1); + glDisable(GL_BLEND); + + UI_ThemeColor(TH_TEXT_HI); + + UI_DrawString(12, rect.ymin + 5, rr->text); } - else - UI_DrawString(12, rect.ymin + 5, ima->render_text); + + BKE_image_release_renderresult(scene, ima); } void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf) @@ -500,7 +496,7 @@ void draw_image_grease_pencil(bContext *C, short onlyv2d) /* draw grease-pencil ('screen' strokes) */ //if (sima->flag & SI_DISPGP) - draw_gpencil_2dview(C, 0); + draw_gpencil_view2d(C, 0); } } @@ -633,8 +629,8 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) /* retrieve the image and information about it */ ima= ED_space_image(sima); - ibuf= ED_space_image_acquire_buffer(sima, &lock); ED_space_image_zoom(sima, ar, &zoomx, &zoomy); + ibuf= ED_space_image_acquire_buffer(sima, &lock); show_viewer= (ima && ima->source == IMA_SRC_VIEWER); show_render= (show_viewer && ima->type == IMA_TYPE_R_RESULT); @@ -652,10 +648,7 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) /* paint helpers */ draw_image_paint_helpers(sima, ar, scene, zoomx, zoomy); - /* render info */ - if(ibuf && ima && show_render) - draw_render_info(ima, ar); - + /* XXX integrate this code */ #if 0 if(ibuf) { @@ -674,5 +667,9 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene) #endif ED_space_image_release_buffer(sima, lock); + + /* render info */ + if(ima && show_render) + draw_render_info(scene, ima, ar); } diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 4e38d4ec082..efe832040c7 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -30,11 +30,7 @@ #include #include "DNA_object_types.h" -#include "DNA_mesh_types.h" -#include "DNA_customdata_types.h" #include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -50,29 +46,17 @@ #include "BKE_utildefines.h" #include "BKE_mesh.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" #include "ED_image.h" -#include "ED_mesh.h" -#include "ED_screen.h" -#include "ED_transform.h" -#include "ED_types.h" -#include "ED_util.h" -#include "WM_api.h" #include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" -#include "RNA_access.h" -#include "RE_pipeline.h" #include "image_intern.h" @@ -91,10 +75,10 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event) pup= uiPupMenuBegin(C, "Toolbox", 0); layout= uiPupMenuLayout(pup); - uiItemM(layout, C, NULL, 0, "IMAGE_MT_view"); - if(show_uvedit) uiItemM(layout, C, NULL, 0, "IMAGE_MT_select"); - uiItemM(layout, C, NULL, 0, "IMAGE_MT_image"); - if(show_uvedit) uiItemM(layout, C, NULL, 0, "IMAGE_MT_uvs"); + uiItemM(layout, C, "IMAGE_MT_view", NULL, 0); + if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, 0); + uiItemM(layout, C, "IMAGE_MT_image", NULL, 0); + if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, 0); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index f5d84d7487f..c038f58375c 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -80,6 +80,7 @@ void IMAGE_OT_unpack(struct wmOperatorType *ot); void IMAGE_OT_cycle_render_slot(struct wmOperatorType *ot); void IMAGE_OT_sample(struct wmOperatorType *ot); +void IMAGE_OT_sample_line(struct wmOperatorType *ot); void IMAGE_OT_curves_point_set(struct wmOperatorType *ot); void IMAGE_OT_record_composite(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index b9a22745ba5..a8e231bfae9 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -20,26 +20,21 @@ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. * - * Contributor(s): Blender Foundation, 2002-2009 + * Contributor(s): Blender Foundation, 2002-2009, Xavier Thomas * * ***** END GPL LICENSE BLOCK ***** */ +#include #include #include +#include #include "MEM_guardedalloc.h" -#include "DNA_image_types.h" -#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_packedFile_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "DNA_meshdata_types.h" #include "BKE_colortools.h" @@ -65,7 +60,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "bmesh.h" @@ -115,12 +109,14 @@ static void sima_zoom_set_factor(SpaceImage *sima, ARegion *ar, float zoomfac) sima_zoom_set(sima, ar, sima->zoom*zoomfac); } +#if 0 // currently unused static int image_poll(bContext *C) { return (CTX_data_edit_image(C) != NULL); } +#endif -static int space_image_poll(bContext *C) +static int space_image_buffer_exists_poll(bContext *C) { SpaceImage *sima= CTX_wm_space_image(C); if(sima && sima->spacetype==SPACE_IMAGE) @@ -131,7 +127,7 @@ static int space_image_poll(bContext *C) static int space_image_file_exists_poll(bContext *C) { - if(space_image_poll(C)) { + if(space_image_buffer_exists_poll(C)) { SpaceImage *sima= CTX_wm_space_image(C); ImBuf *ibuf; void *lock; @@ -146,6 +142,13 @@ static int space_image_file_exists_poll(bContext *C) return 0; } +static int space_image_poll(bContext *C) +{ + SpaceImage *sima= CTX_wm_space_image(C); + if(sima && sima->spacetype==SPACE_IMAGE && sima->image) + return 1; + return 0; +} int space_image_main_area_poll(bContext *C) { @@ -189,7 +192,7 @@ static void view_pan_exit(bContext *C, wmOperator *op, int cancel) if(cancel) { sima->xof= vpd->xof; sima->yof= vpd->yof; - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); } WM_cursor_restore(CTX_wm_window(C)); @@ -205,7 +208,7 @@ static int view_pan_exec(bContext *C, wmOperator *op) sima->xof += offset[0]; sima->yof += offset[1]; - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); /* XXX notifier? */ #if 0 @@ -321,7 +324,7 @@ static void view_zoom_exit(bContext *C, wmOperator *op, int cancel) if(cancel) { sima->zoom= vpd->zoom; - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); } WM_cursor_restore(CTX_wm_window(C)); @@ -335,7 +338,7 @@ static int view_zoom_exec(bContext *C, wmOperator *op) sima_zoom_set_factor(sima, ar, RNA_float_get(op->ptr, "factor")); - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); /* XXX notifier? */ #if 0 @@ -359,7 +362,7 @@ static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event) factor= 1.0 + (event->x-event->prevx+event->y-event->prevy)/300.0f; RNA_float_set(op->ptr, "factor", factor); sima_zoom_set(sima, ar, sima->zoom*factor); - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } @@ -381,7 +384,7 @@ static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event) factor= 1.0 + (vpd->x-event->x+vpd->y-event->y)/300.0f; RNA_float_set(op->ptr, "factor", factor); sima_zoom_set(sima, ar, vpd->zoom*factor); - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); break; case MIDDLEMOUSE: case LEFTMOUSE: @@ -464,7 +467,7 @@ static int view_all_exec(bContext *C, wmOperator *op) sima->xof= sima->yof= 0.0f; - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } @@ -516,11 +519,16 @@ static int view_selected_exec(bContext *C, wmOperator *op) if(size<=0.01) size= 0.01; sima_zoom_set(sima, ar, 0.7/size); - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } +static int view_selected_poll(bContext *C) +{ + return (space_image_main_area_poll(C) && ED_operator_uvedit(C)); +} + void IMAGE_OT_view_selected(wmOperatorType *ot) { /* identifiers */ @@ -529,7 +537,7 @@ void IMAGE_OT_view_selected(wmOperatorType *ot) /* api callbacks */ ot->exec= view_selected_exec; - ot->poll= ED_operator_uvedit; + ot->poll= view_selected_poll; } /********************** view zoom in/out operator *********************/ @@ -541,7 +549,7 @@ static int view_zoom_in_exec(bContext *C, wmOperator *op) sima_zoom_set_factor(sima, ar, 1.25f); - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } @@ -564,7 +572,7 @@ static int view_zoom_out_exec(bContext *C, wmOperator *op) sima_zoom_set_factor(sima, ar, 0.8f); - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } @@ -602,7 +610,7 @@ static int view_zoom_ratio_exec(bContext *C, wmOperator *op) } #endif - ED_area_tag_redraw(CTX_wm_area(C)); + ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } @@ -635,8 +643,9 @@ static const EnumPropertyItem image_file_type_items[] = { {R_JP2, "JPEG_2000", 0, "Jpeg 2000", ""}, #endif {R_IRIS, "IRIS", 0, "Iris", ""}, - //if(G.have_libtiff) +#ifdef WITH_TIFF {R_TIFF, "TIFF", 0, "Tiff", ""}, +#endif {R_RADHDR, "RADIANCE_HDR", 0, "Radiance HDR", ""}, {R_CINEON, "CINEON", 0, "Cineon", ""}, {R_DPX, "DPX", 0, "DPX", ""}, @@ -651,7 +660,7 @@ static const EnumPropertyItem image_file_type_items[] = { static void image_filesel(bContext *C, wmOperator *op, const char *path) { - RNA_string_set(op->ptr, "path", path); + RNA_string_set(op->ptr, "filepath", path); WM_event_add_fileselect(C, op); } @@ -682,12 +691,16 @@ static int open_exec(bContext *C, wmOperator *op) Image *ima= NULL; char str[FILE_MAX]; - RNA_string_get(op->ptr, "path", str); + RNA_string_get(op->ptr, "filepath", str); /* default to frame 1 if there's no scene in context */ + + errno= 0; + ima= BKE_add_image_file(str, scene ? scene->r.cfra : 1); if(!ima) { if(op->customdata) MEM_freeN(op->customdata); + BKE_reportf(op->reports, RPT_ERROR, "Can't read: \"%s\", %s.", str, errno ? strerror(errno) : "Unsupported image format"); return OPERATOR_CANCELLED; } @@ -723,7 +736,10 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) SpaceImage *sima= CTX_wm_space_image(C); char *path= (sima && sima->image)? sima->image->name: U.textudir; - if(RNA_property_is_set(op->ptr, "path")) + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "filepath")) return open_exec(C, op); open_init(C, op); @@ -748,7 +764,7 @@ void IMAGE_OT_open(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); } /******************** replace image operator ********************/ @@ -761,7 +777,7 @@ static int replace_exec(bContext *C, wmOperator *op) if(!sima->image) return OPERATOR_CANCELLED; - RNA_string_get(op->ptr, "path", str); + RNA_string_get(op->ptr, "filepath", str); BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */ BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD); @@ -773,15 +789,17 @@ static int replace_exec(bContext *C, wmOperator *op) static int replace_invoke(bContext *C, wmOperator *op, wmEvent *event) { SpaceImage *sima= CTX_wm_space_image(C); - char *path= (sima->image)? sima->image->name: U.textudir; if(!sima->image) return OPERATOR_CANCELLED; - if(RNA_property_is_set(op->ptr, "path")) + if(RNA_property_is_set(op->ptr, "filepath")) return replace_exec(C, op); - image_filesel(C, op, path); + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", (strncmp(sima->image->name, "//", 2))==0); + + image_filesel(C, op, sima->image->name); return OPERATOR_RUNNING_MODAL; } @@ -801,26 +819,27 @@ void IMAGE_OT_replace(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); } /******************** save image as operator ********************/ /* assumes name is FILE_MAX */ /* ima->name and ibuf->name should end up the same */ -static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *name) +static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *path) { Image *ima= ED_space_image(sima); void *lock; ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock); - int len; - if (ibuf) { - BLI_convertstringcode(name, G.sce); - BLI_convertstringframe(name, scene->r.cfra, 0); + if (ibuf) { + int relative= RNA_boolean_get(op->ptr, "relative_path"); + int save_copy= (RNA_struct_find_property(op->ptr, "copy") && RNA_boolean_get(op->ptr, "copy")); + + BLI_path_abs(path, G.sce); if(scene->r.scemode & R_EXTENSION) { - BKE_add_image_extension(name, sima->imtypenr); + BKE_add_image_extension(path, sima->imtypenr); } /* enforce user setting for RGB or RGBA, but skip BW */ @@ -834,54 +853,63 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera if(sima->imtypenr==R_MULTILAYER) { RenderResult *rr= BKE_image_acquire_renderresult(scene, ima); if(rr) { - RE_WriteRenderResult(rr, name, scene->r.quality); - - BLI_strncpy(ima->name, name, sizeof(ima->name)); - BLI_strncpy(ibuf->name, name, sizeof(ibuf->name)); - - /* should be function? nevertheless, saving only happens here */ - for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) - ibuf->userflags &= ~IB_BITMAPDIRTY; - + RE_WriteRenderResult(rr, path, scene->r.quality); + + if(relative) + BLI_path_rel(path, G.sce); /* only after saving */ + + if(!save_copy) { + BLI_strncpy(ima->name, path, sizeof(ima->name)); + BLI_strncpy(ibuf->name, path, sizeof(ibuf->name)); + + /* should be function? nevertheless, saving only happens here */ + for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) + ibuf->userflags &= ~IB_BITMAPDIRTY; + } } else BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image"); BKE_image_release_renderresult(scene, ima); } - else if (BKE_write_ibuf(scene, ibuf, name, sima->imtypenr, scene->r.subimtype, scene->r.quality)) { - BLI_strncpy(ima->name, name, sizeof(ima->name)); - BLI_strncpy(ibuf->name, name, sizeof(ibuf->name)); - - ibuf->userflags &= ~IB_BITMAPDIRTY; - - /* change type? */ - if(ima->type==IMA_TYPE_R_RESULT) { - ima->type= IMA_TYPE_IMAGE; + else if (BKE_write_ibuf(scene, ibuf, path, sima->imtypenr, scene->r.subimtype, scene->r.quality)) { - /* workaround to ensure the render result buffer is no longer used - * by this image, otherwise can crash when a new render result is - * created. */ - if(ibuf->rect && !(ibuf->mall & IB_rect)) - imb_freerectImBuf(ibuf); - if(ibuf->rect_float && !(ibuf->mall & IB_rectfloat)) - imb_freerectfloatImBuf(ibuf); - if(ibuf->zbuf && !(ibuf->mall & IB_zbuf)) - IMB_freezbufImBuf(ibuf); - if(ibuf->zbuf_float && !(ibuf->mall & IB_zbuffloat)) - IMB_freezbuffloatImBuf(ibuf); + if(relative) + BLI_path_rel(path, G.sce); /* only after saving */ + + if(!save_copy) { + + BLI_strncpy(ima->name, path, sizeof(ima->name)); + BLI_strncpy(ibuf->name, path, sizeof(ibuf->name)); + + ibuf->userflags &= ~IB_BITMAPDIRTY; + + /* change type? */ + if(ima->type==IMA_TYPE_R_RESULT) { + ima->type= IMA_TYPE_IMAGE; + + /* workaround to ensure the render result buffer is no longer used + * by this image, otherwise can crash when a new render result is + * created. */ + if(ibuf->rect && !(ibuf->mall & IB_rect)) + imb_freerectImBuf(ibuf); + if(ibuf->rect_float && !(ibuf->mall & IB_rectfloat)) + imb_freerectfloatImBuf(ibuf); + if(ibuf->zbuf && !(ibuf->mall & IB_zbuf)) + IMB_freezbufImBuf(ibuf); + if(ibuf->zbuf_float && !(ibuf->mall & IB_zbuffloat)) + IMB_freezbuffloatImBuf(ibuf); + } + if( ELEM(ima->source, IMA_SRC_GENERATED, IMA_SRC_VIEWER)) { + ima->source= IMA_SRC_FILE; + ima->type= IMA_TYPE_IMAGE; + } + + /* name image as how we saved it */ + rename_id(&ima->id, BLI_path_basename(path)); } - if( ELEM(ima->source, IMA_SRC_GENERATED, IMA_SRC_VIEWER)) { - ima->source= IMA_SRC_FILE; - ima->type= IMA_TYPE_IMAGE; - } - - /* name image as how we saved it */ - len= strlen(name); - while (len > 0 && name[len - 1] != '/' && name[len - 1] != '\\') len--; - rename_id(&ima->id, name+len); } else - BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", name); + BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", path); WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image); @@ -902,7 +930,7 @@ static int save_as_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; sima->imtypenr= RNA_enum_get(op->ptr, "file_type"); - RNA_string_get(op->ptr, "path", str); + RNA_string_get(op->ptr, "filepath", str); save_image_doit(C, sima, scene, op, str); @@ -917,7 +945,10 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) ImBuf *ibuf; void *lock; - if(RNA_property_is_set(op->ptr, "path")) + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "filepath")) return save_as_exec(C, op); if(!ima) @@ -932,6 +963,8 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) sima->imtypenr= R_MULTILAYER; else if(ima->type==IMA_TYPE_R_RESULT) sima->imtypenr= scene->r.imtype; + else if (ima->source == IMA_SRC_GENERATED) + sima->imtypenr= R_PNG; else sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype); @@ -939,7 +972,12 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) if(ibuf->name[0]==0) BLI_strncpy(ibuf->name, G.ima, FILE_MAX); - + + /* enable save_copy by default for render results */ + if(ELEM(ima->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE) && !RNA_property_is_set(op->ptr, "copy")) { + RNA_boolean_set(op->ptr, "copy", TRUE); + } + // XXX note: we can give default menu enums to operator for this image_filesel(C, op, ibuf->name); @@ -962,14 +1000,16 @@ void IMAGE_OT_save_as(wmOperatorType *ot) /* api callbacks */ ot->exec= save_as_exec; ot->invoke= save_as_invoke; - ot->poll= space_image_poll; + ot->poll= space_image_buffer_exists_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ RNA_def_enum(ot->srna, "file_type", image_file_type_items, R_PNG, "File Type", "File type to save image as."); - WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_SAVE); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); + + RNA_def_boolean(ot->srna, "copy", 0, "Copy", "Create a new image file without modifying the current image in blender"); } /******************** save image operator ********************/ @@ -1079,7 +1119,7 @@ static int save_sequence_exec(bContext *C, wmOperator *op) char name[FILE_MAX]; BLI_strncpy(name, ibuf->name, sizeof(name)); - BLI_convertstringcode(name, G.sce); + BLI_path_abs(name, G.sce); if(0 == IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat)) { BKE_reportf(op->reports, RPT_ERROR, "Could not write image %s.", name); @@ -1102,7 +1142,7 @@ void IMAGE_OT_save_sequence(wmOperatorType *ot) /* api callbacks */ ot->exec= save_sequence_exec; - ot->poll= space_image_poll; + ot->poll= space_image_buffer_exists_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1122,7 +1162,6 @@ static int reload_exec(bContext *C, wmOperator *op) BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_RELOAD); WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima); - ED_area_tag_redraw(CTX_wm_area(C)); return OPERATOR_FINISHED; } @@ -1135,7 +1174,6 @@ void IMAGE_OT_reload(wmOperatorType *ot) /* api callbacks */ ot->exec= reload_exec; - ot->poll= image_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1153,7 +1191,7 @@ static int new_exec(bContext *C, wmOperator *op) PropertyRNA *prop; char name[22]; float color[4]; - int width, height, floatbuf, uvtestgrid; + int width, height, floatbuf, uvtestgrid, alpha; /* retrieve state */ sima= CTX_wm_space_image(C); @@ -1166,9 +1204,15 @@ static int new_exec(bContext *C, wmOperator *op) floatbuf= RNA_boolean_get(op->ptr, "float"); uvtestgrid= RNA_boolean_get(op->ptr, "uv_test_grid"); RNA_float_get_array(op->ptr, "color", color); - color[3]= RNA_float_get(op->ptr, "alpha"); + alpha= RNA_boolean_get(op->ptr, "alpha"); + + if (!floatbuf && scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) + linearrgb_to_srgb_v3_v3(color, color); - ima = BKE_add_image_size(width, height, name, floatbuf, uvtestgrid, color); + if(!alpha) + color[3]= 1.0f; + + ima = BKE_add_image_size(width, height, name, alpha ? 32 : 24, floatbuf, uvtestgrid, color); if(!ima) return OPERATOR_CANCELLED; @@ -1196,6 +1240,9 @@ static int new_exec(bContext *C, wmOperator *op) void IMAGE_OT_new(wmOperatorType *ot) { + PropertyRNA *prop; + float default_color[4]= {0.0f, 0.0f, 0.0f, 1.0f}; + /* identifiers */ ot->name= "New"; ot->idname= "IMAGE_OT_new"; @@ -1211,8 +1258,9 @@ void IMAGE_OT_new(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Untitled", 21, "Name", "Image datablock name."); RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width.", 1, 16384); RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height.", 1, 16384); - RNA_def_float_color(ot->srna, "color", 3, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f); - RNA_def_float(ot->srna, "alpha", 1.0f, 0.0f, 1.0f, "Alpha", "Default fill alpha.", 0.0f, 1.0f); + prop= RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, default_color); + RNA_def_boolean(ot->srna, "alpha", 1, "Alpha", "Create an image with an alpha channel."); RNA_def_boolean(ot->srna, "uv_test_grid", 0, "UV Test Grid", "Fill the image with a grid for UV map testing."); RNA_def_boolean(ot->srna, "float", 0, "32 bit Float", "Create image with 32 bit floating point bit depth."); } @@ -1256,6 +1304,8 @@ static int pack_exec(bContext *C, wmOperator *op) else ima->packedfile= newPackedFile(op->reports, ima->name); + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima); + return OPERATOR_FINISHED; } @@ -1286,12 +1336,12 @@ void IMAGE_OT_pack(wmOperatorType *ot) { /* identifiers */ ot->name= "Pack"; + ot->description= "Pack an image as embedded data into the .blend file"; ot->idname= "IMAGE_OT_pack"; /* api callbacks */ ot->exec= pack_exec; ot->invoke= pack_invoke; - ot->poll= space_image_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1302,12 +1352,14 @@ void IMAGE_OT_pack(wmOperatorType *ot) /********************* unpack operator *********************/ -void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, PackedFile *pf) +void unpack_menu(bContext *C, char *opname, Image *ima, char *folder, PackedFile *pf) { + PointerRNA props_ptr; uiPopupMenu *pup; uiLayout *layout; char line[FILE_MAXDIR + FILE_MAXFILE + 100]; char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX]; + char *abs_name = ima->name; strcpy(local_name, abs_name); BLI_splitdirstring(local_name, fi); @@ -1316,23 +1368,39 @@ void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, Packed pup= uiPupMenuBegin(C, "Unpack file", 0); layout= uiPupMenuLayout(pup); - uiItemEnumO(layout, "Remove Pack", 0, opname, "method", PF_REMOVE); + uiItemEnumO(layout, opname, "Remove Pack", 0, "method", PF_REMOVE); if(strcmp(abs_name, local_name)) { switch(checkPackedFile(local_name, pf)) { case PF_NOFILE: sprintf(line, "Create %s", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); + break; case PF_EQUAL: sprintf(line, "Use %s (identical)", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); + break; case PF_DIFFERS: sprintf(line, "Use %s (differs)", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL); + RNA_string_set(&props_ptr, "image", ima->id.name); + sprintf(line, "Overwrite %s", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); + + break; } } @@ -1340,17 +1408,30 @@ void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, Packed switch(checkPackedFile(abs_name, pf)) { case PF_NOFILE: sprintf(line, "Create %s", abs_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); break; case PF_EQUAL: sprintf(line, "Use %s (identical)", abs_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); break; case PF_DIFFERS: sprintf(line, "Use %s (differs)", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); + sprintf(line, "Overwrite %s", local_name); - uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL); + //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL); + props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS); + RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL); + RNA_string_set(&props_ptr, "image", ima->id.name+2); break; } @@ -1362,6 +1443,14 @@ static int unpack_exec(bContext *C, wmOperator *op) Image *ima= CTX_data_edit_image(C); int method= RNA_enum_get(op->ptr, "method"); + /* find the suppplied image by name */ + if (RNA_property_is_set(op->ptr, "image")) { + char imaname[22]; + RNA_string_get(op->ptr, "image", imaname); + ima = BLI_findstring(&CTX_data_main(C)->image, imaname, offsetof(ID, name) + 2); + if (!ima) ima = CTX_data_edit_image(C); + } + if(!ima || !ima->packedfile) return OPERATOR_CANCELLED; @@ -1372,8 +1461,10 @@ static int unpack_exec(bContext *C, wmOperator *op) if(G.fileflags & G_AUTOPACK) BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save."); - + unpackImage(op->reports, ima, method); + + WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima); return OPERATOR_FINISHED; } @@ -1382,6 +1473,9 @@ static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event) { Image *ima= CTX_data_edit_image(C); + if(RNA_property_is_set(op->ptr, "image")) + return unpack_exec(C, op); + if(!ima || !ima->packedfile) return OPERATOR_CANCELLED; @@ -1393,7 +1487,7 @@ static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event) if(G.fileflags & G_AUTOPACK) BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save."); - unpack_menu(C, "IMAGE_OT_unpack", ima->name, "textures", ima->packedfile); + unpack_menu(C, "IMAGE_OT_unpack", ima, "textures", ima->packedfile); return OPERATOR_FINISHED; } @@ -1402,18 +1496,19 @@ void IMAGE_OT_unpack(wmOperatorType *ot) { /* identifiers */ ot->name= "Unpack"; + ot->description= "Save an image packed in the .blend file to disk"; ot->idname= "IMAGE_OT_unpack"; /* api callbacks */ ot->exec= unpack_exec; ot->invoke= unpack_invoke; - ot->poll= space_image_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack."); + RNA_def_string(ot->srna, "image", "", 21, "Image Name", "Image datablock name to unpack."); } /******************** sample image operator ********************/ @@ -1503,7 +1598,7 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event) info->colf[0]= fp[0]; info->colf[1]= fp[1]; info->colf[2]= fp[2]; - info->colf[3]= fp[4]; + info->colf[3]= fp[3]; info->colfp= info->colf; } @@ -1623,6 +1718,116 @@ void IMAGE_OT_sample(wmOperatorType *ot) ot->flag= OPTYPE_BLOCKING; } +/******************** sample line operator ********************/ +static int sample_line_exec(bContext *C, wmOperator *op) +{ + SpaceImage *sima= CTX_wm_space_image(C); + ARegion *ar= CTX_wm_region(C); + Scene *scene= CTX_data_scene(C); + + int x_start= RNA_int_get(op->ptr, "xstart"); + int y_start= RNA_int_get(op->ptr, "ystart"); + int x_end= RNA_int_get(op->ptr, "xend"); + int y_end= RNA_int_get(op->ptr, "yend"); + + void *lock; + ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock); + Histogram *hist= &sima->sample_line_hist; + + float x1f, y1f, x2f, y2f; + int x1, y1, x2, y2; + int i, x, y; + float *fp; + float rgb[3]; + unsigned char *cp; + + if (ibuf == NULL) { + ED_space_image_release_buffer(sima, lock); + return OPERATOR_CANCELLED; + } + /* hmmmm */ + if (ibuf->channels < 3) { + ED_space_image_release_buffer(sima, lock); + return OPERATOR_CANCELLED; + } + + UI_view2d_region_to_view(&ar->v2d, x_start, y_start, &x1f, &y1f); + UI_view2d_region_to_view(&ar->v2d, x_end, y_end, &x2f, &y2f); + x1= 0.5f+ x1f*ibuf->x; + x2= 0.5f+ x2f*ibuf->x; + y1= 0.5f+ y1f*ibuf->y; + y2= 0.5f+ y2f*ibuf->y; + + hist->channels = 3; + hist->x_resolution = 256; + hist->xmax = 1.0f; + hist->ymax = 1.0f; + + for (i=0; i<256; i++) { + x= (int)(0.5f + x1 + (float)i*(x2-x1)/255.0f); + y= (int)(0.5f + y1 + (float)i*(y2-y1)/255.0f); + + if (x<0 || y<0 || x>=ibuf->x || y>=ibuf->y) { + hist->data_luma[i] = hist->data_r[i] = hist->data_g[i]= hist->data_b[i] = 0.0f; + } else { + if (ibuf->rect_float) { + fp= (ibuf->rect_float + (ibuf->channels)*(y*ibuf->x + x)); + + if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) + linearrgb_to_srgb_v3_v3(rgb, fp); + else + copy_v3_v3(rgb, fp); + + hist->data_r[i] = rgb[0]; + hist->data_g[i] = rgb[1]; + hist->data_b[i] = rgb[2]; + hist->data_luma[i] = (0.299f*rgb[0] + 0.587f*rgb[1] + 0.114f*rgb[2]); + } + else if (ibuf->rect) { + cp= (unsigned char *)(ibuf->rect + y*ibuf->x + x); + hist->data_r[i] = (float)cp[0]/255.0f; + hist->data_g[i] = (float)cp[1]/255.0f; + hist->data_b[i] = (float)cp[2]/255.0f; + hist->data_luma[i] = (0.299f*cp[0] + 0.587f*cp[1] + 0.114f*cp[2])/255; + } + } + } + + ED_space_image_release_buffer(sima, lock); + + ED_area_tag_redraw(CTX_wm_area(C)); + + return OPERATOR_FINISHED; +} + +static int sample_line_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceImage *sima= CTX_wm_space_image(C); + + if(!ED_space_image_has_buffer(sima)) + return OPERATOR_CANCELLED; + + return WM_gesture_straightline_invoke(C, op, event); +} + +void IMAGE_OT_sample_line(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Sample Line"; + ot->idname= "IMAGE_OT_sample_line"; + + /* api callbacks */ + ot->invoke= sample_line_invoke; + ot->modal= WM_gesture_straightline_modal; + ot->exec= sample_line_exec; + ot->poll= space_image_main_area_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_gesture_straightline(ot, CURSOR_EDIT); +} + /******************** set curve point operator ********************/ void IMAGE_OT_curves_point_set(wmOperatorType *ot) @@ -1795,7 +2000,7 @@ void IMAGE_OT_record_composite(wmOperatorType *ot) ot->invoke= record_composite_invoke; ot->modal= record_composite_modal; ot->cancel= record_composite_cancel; - ot->poll= space_image_poll; + ot->poll= space_image_buffer_exists_poll; } /********************* cycle render slot operator *********************/ @@ -1809,21 +2014,21 @@ static int cycle_render_slot_poll(bContext *C) static int cycle_render_slot_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); - int a, slot, cur= RE_GetViewSlot(); + Image *ima= CTX_data_edit_image(C); + int a, slot, cur= ima->render_slot; - for(a=1; aid.name, slot)) { - RE_SetViewSlot(slot); + if(ima->renders[slot] || slot == ima->last_render_slot) { + ima->render_slot= slot; break; } } - if(a == RE_SLOT_MAX) - RE_SetViewSlot((cur == 1)? 0: 1); - + if(a == IMA_MAX_RENDER_SLOT) + ima->render_slot= ((cur == 1)? 0: 1); + WM_event_add_notifier(C, NC_IMAGE|ND_DRAW, NULL); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c index 97b5f9847ff..18e42ce8797 100644 --- a/source/blender/editors/space_image/image_render.c +++ b/source/blender/editors/space_image/image_render.c @@ -28,7 +28,6 @@ #include #include -#include "DNA_image_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -40,11 +39,9 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "ED_screen.h" #include "RE_pipeline.h" -#include "WM_api.h" #define HEADER_HEIGHT 18 diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 29041899fa3..28669847814 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,13 +29,9 @@ #include #include -#include "DNA_image_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -55,8 +51,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "ED_gpencil.h" -#include "ED_image.h" #include "ED_mesh.h" #include "ED_space_api.h" #include "ED_screen.h" @@ -70,7 +64,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -107,6 +100,7 @@ void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obe WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); ED_area_tag_redraw(CTX_wm_area(C)); + } } @@ -185,6 +179,12 @@ void ED_space_image_size(SpaceImage *sima, int *width, int *height) /* not very important, just nice */ *width= (scene->r.xsch*scene->r.size)/100; *height= (scene->r.ysch*scene->r.size)/100; + + if((scene->r.mode & R_BORDER) && (scene->r.mode & R_CROP)) { + *width *= (scene->r.border.xmax - scene->r.border.xmin); + *height *= (scene->r.border.ymax - scene->r.border.ymin); + } + } /* I know a bit weak... but preview uses not actual image size */ // XXX else if(image_preview_active(sima, width, height)); @@ -296,21 +296,21 @@ int ED_space_image_show_uvshadow(SpaceImage *sima, Object *obedit) } - -static void image_histogram_tag_refresh(ScrArea *sa) +static void image_scopes_tag_refresh(ScrArea *sa) { SpaceImage *sima= (SpaceImage *)sa->spacedata.first; ARegion *ar; - + /* only while histogram is visible */ for (ar=sa->regionbase.first; ar; ar=ar->next) { if (ar->regiontype == RGN_TYPE_PREVIEW && ar->flag & RGN_FLAG_HIDDEN) return; } - - sima->hist.ok=0; + + sima->scopes.ok=0; } + /* ******************** manage regions ********************* */ ARegion *image_has_buttons_region(ScrArea *sa) @@ -363,8 +363,8 @@ ARegion *image_has_scope_region(ScrArea *sa) arnew->alignment= RGN_ALIGN_RIGHT; arnew->flag = RGN_FLAG_HIDDEN; - - image_histogram_tag_refresh(sa); + + image_scopes_tag_refresh(sa); return arnew; } @@ -384,6 +384,8 @@ static SpaceLink *image_new(const bContext *C) simage->iuser.ok= 1; simage->iuser.fie_ima= 2; simage->iuser.frames= 100; + + scopes_new(&simage->scopes); /* header */ ar= MEM_callocN(sizeof(ARegion), "header for image"); @@ -407,7 +409,7 @@ static SpaceLink *image_new(const bContext *C) ar->regiontype= RGN_TYPE_PREVIEW; ar->alignment= RGN_ALIGN_RIGHT; ar->flag = RGN_FLAG_HIDDEN; - + /* main area */ ar= MEM_callocN(sizeof(ARegion), "main area for image"); @@ -424,9 +426,7 @@ static void image_free(SpaceLink *sl) if(simage->cumap) curvemapping_free(simage->cumap); -// if(simage->gpd) -// XXX free_gpencil_data(simage->gpd); - + scopes_free(&simage->scopes); } @@ -474,6 +474,7 @@ void image_operatortypes(void) WM_operatortype_append(IMAGE_OT_cycle_render_slot); WM_operatortype_append(IMAGE_OT_sample); + WM_operatortype_append(IMAGE_OT_sample_line); WM_operatortype_append(IMAGE_OT_curves_point_set); WM_operatortype_append(IMAGE_OT_record_composite); @@ -530,7 +531,7 @@ void image_keymap(struct wmKeyConfig *keyconf) static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) { if(drag->type==WM_DRAG_PATH) - if(ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */ + if(ELEM3(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */ return 1; return 0; } @@ -538,7 +539,7 @@ static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) static void image_drop_copy(wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "path", drag->path); + RNA_string_set(drop->ptr, "filepath", drag->path); } /* area+region dropbox definition */ @@ -559,6 +560,9 @@ static void image_refresh(const bContext *C, ScrArea *sa) ima= ED_space_image(sima); + if(sima->iuser.flag & IMA_ANIM_ALWAYS) + BKE_image_user_calc_frame(&sima->iuser, CTX_data_scene(C)->r.cfra, 0); + /* check if we have to set the image from the editmesh */ if(ima && (ima->source==IMA_SRC_VIEWER || sima->pin)); else if(obedit && obedit->type == OB_MESH) { @@ -590,26 +594,33 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn) switch(wmn->category) { case NC_SCENE: switch(wmn->data) { + case ND_FRAME: + image_scopes_tag_refresh(sa); + ED_area_tag_refresh(sa); + ED_area_tag_redraw(sa); + break; case ND_MODE: case ND_RENDER_RESULT: case ND_COMPO_RESULT: if (ED_space_image_show_render(sima)) - image_histogram_tag_refresh(sa); + image_scopes_tag_refresh(sa); ED_area_tag_refresh(sa); - ED_area_tag_redraw(sa); + ED_area_tag_redraw(sa); break; } break; case NC_IMAGE: if (wmn->reference == sima->image || !wmn->reference) { - image_histogram_tag_refresh(sa); + image_scopes_tag_refresh(sa); ED_area_tag_refresh(sa); ED_area_tag_redraw(sa); } break; case NC_SPACE: - if(wmn->data == ND_SPACE_IMAGE) + if(wmn->data == ND_SPACE_IMAGE) { + image_scopes_tag_refresh(sa); ED_area_tag_redraw(sa); + } break; case NC_GEOM: switch(wmn->data) { @@ -619,6 +630,15 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn) ED_area_tag_redraw(sa); break; } + case NC_OBJECT: + switch(wmn->data) { + case ND_TRANSFORM: + if(sima->lock && (sima->flag & SI_DRAWSHADOW)) { + ED_area_tag_refresh(sa); + ED_area_tag_redraw(sa); + } + break; + } } } @@ -766,7 +786,10 @@ static void image_main_area_listener(ARegion *ar, wmNotifier *wmn) { /* context changes */ switch(wmn->category) { - /* nothing yet */ + case NC_SCREEN: + if (wmn->data==ND_GPENCIL) + ED_region_tag_redraw(ar); + break; } } @@ -792,6 +815,10 @@ static void image_buttons_area_listener(ARegion *ar, wmNotifier *wmn) { /* context changes */ switch(wmn->category) { + case NC_SCREEN: + if (wmn->data==ND_GPENCIL) + ED_region_tag_redraw(ar); + break; case NC_BRUSH: if(wmn->action==NA_EDITED) ED_region_tag_redraw(ar); @@ -815,10 +842,12 @@ static void image_scope_area_init(wmWindowManager *wm, ARegion *ar) static void image_scope_area_draw(const bContext *C, ARegion *ar) { SpaceImage *sima= CTX_wm_space_image(C); + Scene *scene= CTX_data_scene(C); void *lock; ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock); - if(ibuf) - histogram_update(&sima->hist, ibuf); + if(ibuf) { + scopes_update(&sima->scopes, ibuf, scene->r.color_mgt_flag & R_COLOR_MANAGEMENT ); + } ED_space_image_release_buffer(sima, lock); ED_region_panels(C, ar, 1, NULL, -1); @@ -860,6 +889,29 @@ static void image_header_area_draw(const bContext *C, ARegion *ar) ED_region_header(C, ar); } +static void image_header_area_listener(ARegion *ar, wmNotifier *wmn) +{ + /* context changes */ + switch(wmn->category) { + case NC_SCENE: + switch(wmn->data) { + case ND_MODE: + case ND_TOOLSETTINGS: + ED_region_tag_redraw(ar); + break; + } + break; + case NC_GEOM: + switch(wmn->data) { + case ND_DATA: + case ND_SELECT: + ED_region_tag_redraw(ar); + break; + } + + } +} + /**************************** spacetype *****************************/ /* only called once, from space/spacetypes.c */ @@ -919,6 +971,7 @@ void ED_spacetype_image(void) art->regionid = RGN_TYPE_HEADER; art->prefsizey= HEADERY; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER; + art->listener= image_header_area_listener; art->init= image_header_area_init; art->draw= image_header_area_draw; diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt new file mode 100644 index 00000000000..473f1f2fcff --- /dev/null +++ b/source/blender/editors/space_info/CMakeLists.txt @@ -0,0 +1,36 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../imbuf + ../../bmesh + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_info "${SRC}" "${INC}") diff --git a/source/blender/editors/space_info/SConscript b/source/blender/editors/space_info/SConscript index ba1110274ff..cf1d8ab7d77 100644 --- a/source/blender/editors/space_info/SConscript +++ b/source/blender/editors/space_info/SConscript @@ -8,7 +8,4 @@ incs += ' ../../bmesh ../../windowmanager #/intern/guardedalloc #/extern/glew/in defs = [] -if env['WITH_BF_GAMEENGINE']: - defs.append('GAMEBLENDER=1') - env.BlenderLib ( 'bf_editors_space_info', sources, Split(incs), defs, libtype=['core'], priority=[70] ) diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h index 939d984a0d8..4053bbf5a1f 100644 --- a/source/blender/editors/space_info/info_intern.h +++ b/source/blender/editors/space_info/info_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -39,5 +39,7 @@ void FILE_OT_make_paths_absolute(struct wmOperatorType *ot); void FILE_OT_report_missing_files(struct wmOperatorType *ot); void FILE_OT_find_missing_files(struct wmOperatorType *ot); +void INFO_OT_reports_display_update(struct wmOperatorType *ot); + #endif /* ED_INFO_INTERN_H */ diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c index 072c5bf1573..62e82f83e58 100644 --- a/source/blender/editors/space_info/info_ops.c +++ b/source/blender/editors/space_info/info_ops.c @@ -31,14 +31,12 @@ #include "DNA_packedFile_types.h" #include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_math.h" #include "BLI_bpath.h" #include "BKE_context.h" @@ -49,9 +47,6 @@ #include "BKE_report.h" #include "BKE_screen.h" -#include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" #include "WM_api.h" #include "WM_types.h" @@ -60,14 +55,12 @@ #include "BIF_glutil.h" #include "UI_interface.h" -#include "UI_resources.h" #include "IMB_imbuf_types.h" #include "RNA_access.h" #include "RNA_define.h" -#include "WM_types.h" #include "info_intern.h" @@ -278,7 +271,7 @@ static int find_missing_files_exec(bContext *C, wmOperator *op) { char *path; - path= RNA_string_get_alloc(op->ptr, "path", NULL, 0); + path= RNA_string_get_alloc(op->ptr, "filepath", NULL, 0); findMissingFiles(path, G.sce); MEM_freeN(path); @@ -306,5 +299,102 @@ void FILE_OT_find_missing_files(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - WM_operator_properties_filesel(ot, 0, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, 0, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH); +} + +/********************* report box operator *********************/ + +/* Hard to decide whether to keep this as an operator, + * or turn it into a hardcoded ui control feature, + * handling TIMER events for all regions in interface_handlers.c + * Not sure how good that is to be accessing UI data from + * inactive regions, so use this for now. --matt + */ + +#define INFO_TIMEOUT 5.0 +#define INFO_COLOR_TIMEOUT 3.0 +#define ERROR_TIMEOUT 10.0 +#define ERROR_COLOR_TIMEOUT 6.0 +#define COLLAPSE_TIMEOUT 0.2 +static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + wmWindowManager *wm= CTX_wm_manager(C); + ReportList *reports= CTX_wm_reports(C); + Report *report; + ReportTimerInfo *rti; + float progress=0.0, color_progress=0.0; + float neutral_col[3] = {0.35, 0.35, 0.35}; + float neutral_grey= 0.6; + float timeout=0.0, color_timeout=0.0; + + /* escape if not our timer */ + if(reports->reporttimer==NULL || reports->reporttimer != event->customdata) + return OPERATOR_PASS_THROUGH; + + report= BKE_reports_last_displayable(reports); + rti = (ReportTimerInfo *)reports->reporttimer->customdata; + + timeout = (report->type & RPT_ERROR_ALL)?ERROR_TIMEOUT:INFO_TIMEOUT; + color_timeout = (report->type & RPT_ERROR_ALL)?ERROR_COLOR_TIMEOUT:INFO_COLOR_TIMEOUT; + + /* clear the report display after timeout */ + if (reports->reporttimer->duration > timeout) { + WM_event_remove_timer(wm, NULL, reports->reporttimer); + reports->reporttimer = NULL; + + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL); + + return (OPERATOR_FINISHED|OPERATOR_PASS_THROUGH); + } + + if (rti->widthfac == 0.0) { + /* initialise colours based on report type */ + if(report->type & RPT_ERROR_ALL) { + rti->col[0] = 1.0; + rti->col[1] = 0.2; + rti->col[2] = 0.0; + } else if(report->type & RPT_WARNING_ALL) { + rti->col[0] = 1.0; + rti->col[1] = 1.0; + rti->col[2] = 0.0; + } else if(report->type & RPT_INFO_ALL) { + rti->col[0] = 0.3; + rti->col[1] = 0.45; + rti->col[2] = 0.7; + } + rti->greyscale = 0.75; + rti->widthfac=1.0; + } + + progress = reports->reporttimer->duration / timeout; + color_progress = reports->reporttimer->duration / color_timeout; + + /* fade colours out sharply according to progress through fade-out duration */ + interp_v3_v3v3(rti->col, rti->col, neutral_col, color_progress); + rti->greyscale = interpf(neutral_grey, rti->greyscale, color_progress); + + /* collapse report at end of timeout */ + if (progress*timeout > timeout - COLLAPSE_TIMEOUT) { + rti->widthfac = (progress*timeout - (timeout - COLLAPSE_TIMEOUT)) / COLLAPSE_TIMEOUT; + rti->widthfac = 1.0 - rti->widthfac; + } + + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL); + + return (OPERATOR_FINISHED|OPERATOR_PASS_THROUGH); +} + +void INFO_OT_reports_display_update(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Update Reports Display"; + ot->idname= "INFO_OT_reports_display_update"; + + /* api callbacks */ + ot->invoke= update_reports_display_invoke; + + /* flags */ + ot->flag= 0; + + /* properties */ } diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c index 41fc87151bd..68058a5315d 100644 --- a/source/blender/editors/space_info/info_stats.c +++ b/source/blender/editors/space_info/info_stats.c @@ -27,15 +27,11 @@ #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_curve_types.h" #include "DNA_group_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" #include "DNA_meta_types.h" -#include "DNA_object_types.h" -#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "BKE_anim.h" diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c index f6cc25e9074..0f483f4bcec 100644 --- a/source/blender/editors/space_info/space_info.c +++ b/source/blender/editors/space_info/space_info.c @@ -29,10 +29,6 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -42,10 +38,10 @@ #include "BKE_context.h" #include "BKE_colortools.h" +#include "BKE_global.h" #include "BKE_screen.h" #include "BKE_utildefines.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -53,12 +49,8 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" - -#include "ED_markers.h" -#include "ED_object.h" +#include "UI_interface.h" #include "info_intern.h" // own include @@ -120,11 +112,9 @@ static void info_main_area_init(wmWindowManager *wm, ARegion *ar) static void info_main_area_draw(const bContext *C, ARegion *ar) { - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); } @@ -136,11 +126,15 @@ void info_operatortypes(void) WM_operatortype_append(FILE_OT_make_paths_absolute); WM_operatortype_append(FILE_OT_report_missing_files); WM_operatortype_append(FILE_OT_find_missing_files); + + WM_operatortype_append(INFO_OT_reports_display_update); } void info_keymap(struct wmKeyConfig *keyconf) { + wmKeyMap *keymap= WM_keymap_find(keyconf, "Window", 0, 0); + WM_keymap_verify_item(keymap, "INFO_OT_reports_display_update", TIMER, KM_ANY, KM_ANY, 0); } /* add handlers, stuff you only do once or on area/region changes */ @@ -167,6 +161,10 @@ static void info_header_listener(ARegion *ar, wmNotifier *wmn) if(ELEM(wmn->data, ND_SCREENCAST, ND_ANIMPLAY)) ED_region_tag_redraw(ar); break; + case NC_WM: + if(wmn->data == ND_JOB) + ED_region_tag_redraw(ar); + break; case NC_SCENE: if(wmn->data==ND_RENDER_RESULT) ED_region_tag_redraw(ar); @@ -182,6 +180,31 @@ static void info_header_listener(ARegion *ar, wmNotifier *wmn) } +static void recent_files_menu(const bContext *C, Menu *menu) +{ + struct RecentFile *recent; + uiLayout *layout= menu->layout; + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN); + if (G.recent_files.first) { + for(recent = G.recent_files.first; (recent); recent = recent->next) { + uiItemStringO(layout, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath); + } + } else { + uiItemL(layout, "No Recent Files", 0); + } +} + +void recent_files_menu_register() +{ + MenuType *mt; + + mt= MEM_callocN(sizeof(MenuType), "spacetype info menu recent files"); + strcpy(mt->idname, "INFO_MT_file_open_recent"); + strcpy(mt->label, "Open Recent..."); + mt->draw= recent_files_menu; + WM_menutype_add(mt); +} + /* only called once, from space/spacetypes.c */ void ED_spacetype_info(void) { @@ -220,7 +243,8 @@ void ED_spacetype_info(void) BLI_addhead(&st->regiontypes, art); - + recent_files_menu_register(); + BKE_spacetype_register(st); } diff --git a/source/blender/editors/space_logic/CMakeLists.txt b/source/blender/editors/space_logic/CMakeLists.txt new file mode 100644 index 00000000000..91087d57f11 --- /dev/null +++ b/source/blender/editors/space_logic/CMakeLists.txt @@ -0,0 +1,39 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager + ../../editors/interface +) + +IF(WITH_GAMEENGINE) + ADD_DEFINITIONS(-DGAMEBLENDER) +ENDIF(WITH_GAMEENGINE) + +BLENDERLIB(bf_editor_space_logic "${SRC}" "${INC}") diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c index 21f43af7980..6fb019cda35 100644 --- a/source/blender/editors/space_logic/logic_buttons.c +++ b/source/blender/editors/space_logic/logic_buttons.c @@ -28,11 +28,6 @@ #include #include "DNA_object_types.h" -#include "DNA_node_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "DNA_meshdata_types.h" #include "MEM_guardedalloc.h" @@ -49,9 +44,7 @@ #include "BKE_screen.h" #include "BKE_utildefines.h" -#include "ED_space_api.h" #include "ED_screen.h" -#include "ED_util.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -63,7 +56,6 @@ #include "WM_types.h" #include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "interface_intern.h" diff --git a/source/blender/editors/space_logic/logic_header.c b/source/blender/editors/space_logic/logic_header.c index 789c00a6aa5..3e38eb815fb 100644 --- a/source/blender/editors/space_logic/logic_header.c +++ b/source/blender/editors/space_logic/logic_header.c @@ -29,10 +29,6 @@ #include #include -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -46,8 +42,6 @@ #include "ED_types.h" #include "ED_util.h" -#include "WM_api.h" -#include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" diff --git a/source/blender/editors/space_logic/logic_intern.h b/source/blender/editors/space_logic/logic_intern.h index 6a4888c3bf1..3b2b6497cdc 100644 --- a/source/blender/editors/space_logic/logic_intern.h +++ b/source/blender/editors/space_logic/logic_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -54,6 +54,7 @@ void LOGIC_OT_links_cut(struct wmOperatorType *ot); /* logic_window.c */ void logic_buttons(struct bContext *C, struct ARegion *ar); +void make_unique_prop_names(struct bContext *C, char *str); #endif /* ED_LOGIC_INTERN_H */ diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c new file mode 100644 index 00000000000..2a179ac281c --- /dev/null +++ b/source/blender/editors/space_logic/logic_ops.c @@ -0,0 +1,697 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ +#include + +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_sensor_types.h" +#include "DNA_controller_types.h" +#include "DNA_actuator_types.h" + +#include "BLI_blenlib.h" + +#include "BKE_context.h" +#include "BKE_main.h" +#include "BKE_sca.h" + +#include "ED_object.h" +#include "ED_screen.h" + +#include "RNA_access.h" +#include "RNA_define.h" +#include "RNA_enum_types.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "logic_intern.h" + +/* ************* Generic Operator Helpers ************* */ + +static int edit_sensor_poll(bContext *C) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor); + + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + return 1; +} + +static int edit_controller_poll(bContext *C) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "controller", &RNA_Controller); + + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + return 1; +} + +static int edit_actuator_poll(bContext *C) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "actuator", &RNA_Actuator); + + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + return 1; +} + +static void edit_sensor_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "sensor", "", 32, "Sensor", "Name of the sensor to edit"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the object the sensor belongs to"); +} + +static int edit_sensor_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor); + + if (RNA_property_is_set(op->ptr, "sensor") && RNA_property_is_set(op->ptr, "object") ) + return 1; + + if (ptr.data) { + bSensor *sens = ptr.data; + Object *ob = ptr.id.data; + + RNA_string_set(op->ptr, "sensor", sens->name); + RNA_string_set(op->ptr, "object", ob->id.name+2); + return 1; + } + + return 0; +} + +static Object *edit_object_property_get(bContext *C, wmOperator *op) +{ + char ob_name[32]; + Object *ob; + + RNA_string_get(op->ptr, "object", ob_name); + + /* if ob_name is valid try to find the object with this name + otherwise gets the active object */ + if (BLI_strnlen(ob_name, 32) > 0) + ob = BLI_findstring(&(CTX_data_main(C)->object), ob_name, offsetof(ID, name) + 2); + else + ob= ED_object_active_context(C); + + return ob; +} + +static bSensor *edit_sensor_property_get(bContext *C, wmOperator *op, Object **ob) +{ + char sensor_name[32]; + bSensor *sens; + + RNA_string_get(op->ptr, "sensor", sensor_name); + + *ob= edit_object_property_get(C, op); + if (!*ob) return NULL; + + sens = BLI_findstring(&((*ob)->sensors), sensor_name, offsetof(bSensor, name)); + return sens; +} + +static void edit_controller_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "controller", "", 32, "Controller", "Name of the controller to edit"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the object the controller belongs to"); +} + +static int edit_controller_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "controller", &RNA_Controller); + + if (RNA_property_is_set(op->ptr, "controller") && RNA_property_is_set(op->ptr, "object") ) + return 1; + + if (ptr.data) { + bController *cont = ptr.data; + Object *ob = ptr.id.data; + + RNA_string_set(op->ptr, "controller", cont->name); + RNA_string_set(op->ptr, "object", ob->id.name+2); + return 1; + } + + return 0; +} + +static bController *edit_controller_property_get(bContext *C, wmOperator *op, Object **ob) +{ + char controller_name[32]; + bController *cont; + + RNA_string_get(op->ptr, "controller", controller_name); + + *ob= edit_object_property_get(C, op); + if (!*ob) return NULL; + + cont = BLI_findstring(&((*ob)->controllers), controller_name, offsetof(bController, name)); + return cont; +} + +static void edit_actuator_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "actuator", "", 32, "Actuator", "Name of the actuator to edit"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the object the actuator belongs to"); +} + +static int edit_actuator_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "actuator", &RNA_Actuator); + + if (RNA_property_is_set(op->ptr, "actuator") && RNA_property_is_set(op->ptr, "object") ) + return 1; + + if (ptr.data) { + bActuator *act = ptr.data; + Object *ob = ptr.id.data; + + RNA_string_set(op->ptr, "actuator",act->name); + RNA_string_set(op->ptr, "object", ob->id.name+2); + return 1; + } + + return 0; +} + +static bActuator *edit_actuator_property_get(bContext *C, wmOperator *op, Object **ob) +{ + char actuator_name[32]; + bActuator *act; + + RNA_string_get(op->ptr, "actuator", actuator_name); + + *ob= edit_object_property_get(C, op); + if (!*ob) return NULL; + + act = BLI_findstring(&((*ob)->actuators), actuator_name, offsetof(bActuator, name)); + return act; +} + +static int logicbricks_move_property_get(wmOperator *op) +{ + int type = RNA_enum_get(op->ptr, "direction"); + + if (type == 1) + return TRUE; + else + return FALSE; +} + +/* ************* Add/Remove Sensor Operator ************* */ + +static int sensor_remove_exec(bContext *C, wmOperator *op) +{ + Object *ob=NULL; + bSensor *sens = edit_sensor_property_get(C, op, &ob); + + if (!sens) + return OPERATOR_CANCELLED; + + BLI_remlink(&(ob->sensors), sens); + free_sensor(sens); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + + static int sensor_remove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_sensor_invoke_properties(C, op)) + return sensor_remove_exec(C, op); + else + return OPERATOR_CANCELLED; +} + +void LOGIC_OT_sensor_remove(wmOperatorType *ot) +{ + ot->name= "Remove Sensor"; + ot->description= "Remove a sensor from the active object"; + ot->idname= "LOGIC_OT_sensor_remove"; + + ot->invoke= sensor_remove_invoke; + ot->exec= sensor_remove_exec; + ot->poll= edit_sensor_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_sensor_properties(ot); +} + +static int sensor_add_exec(bContext *C, wmOperator *op) +{ + Object *ob; + bSensor *sens; + PointerRNA sens_ptr; + PropertyRNA *prop; + const char *sens_name; + char name[32]; + int type= RNA_enum_get(op->ptr, "type"); + + ob= edit_object_property_get(C, op); + if (!ob) + return OPERATOR_CANCELLED; + + sens= new_sensor(type); + BLI_addtail(&(ob->sensors), sens); + + /* set the sensor name based on rna type enum */ + RNA_pointer_create((ID *)ob, &RNA_Sensor, sens, &sens_ptr); + prop = RNA_struct_find_property(&sens_ptr, "type"); + + RNA_string_get(op->ptr, "name", name); + if(BLI_strnlen(name, 32) < 1){ + RNA_property_enum_name(C, &sens_ptr, prop, RNA_property_enum_get(&sens_ptr, prop), &sens_name); + BLI_strncpy(sens->name, sens_name, sizeof(sens->name)); + } + else + BLI_strncpy(sens->name, name, sizeof(sens->name)); + + make_unique_prop_names(C, sens->name); + ob->scaflag |= OB_SHOWSENS; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void LOGIC_OT_sensor_add(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Add Sensor"; + ot->description = "Add a sensor to the active object"; + ot->idname= "LOGIC_OT_sensor_add"; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= sensor_add_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, SENS_ALWAYS, "Type", "Type of sensor to add"); + RNA_def_enum_funcs(prop, rna_Sensor_type_itemf); + RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Sensor to add"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Sensor to"); +} + +/* ************* Add/Remove Controller Operator ************* */ + +static int controller_remove_exec(bContext *C, wmOperator *op) +{ + Object *ob = NULL; + bController *cont = edit_controller_property_get(C, op, &ob); + + if (!cont) + return OPERATOR_CANCELLED; + + BLI_remlink(&(ob->controllers), cont); + unlink_controller(cont); + free_controller(cont); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + + static int controller_remove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_controller_invoke_properties(C, op)) + return controller_remove_exec(C, op); + else + return OPERATOR_CANCELLED; +} + +void LOGIC_OT_controller_remove(wmOperatorType *ot) +{ + ot->name= "Remove Controller"; + ot->description= "Remove a controller from the active object"; + ot->idname= "LOGIC_OT_controller_remove"; + + ot->invoke= controller_remove_invoke; + ot->exec= controller_remove_exec; + ot->poll= edit_controller_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_controller_properties(ot); +} + +static int controller_add_exec(bContext *C, wmOperator *op) +{ + Object *ob; + bController *cont; + PointerRNA cont_ptr; + PropertyRNA *prop; + const char *cont_name; + int bit; + char name[32]; + int type= RNA_enum_get(op->ptr, "type"); + + ob= edit_object_property_get(C, op); + if(!ob) + return OPERATOR_CANCELLED; + + cont= new_controller(type); + BLI_addtail(&(ob->controllers), cont); + + /* set the controller name based on rna type enum */ + RNA_pointer_create((ID *)ob, &RNA_Controller, cont, &cont_ptr); + prop = RNA_struct_find_property(&cont_ptr, "type"); + + RNA_string_get(op->ptr, "name", name); + if(BLI_strnlen(name, 32) < 1){ + RNA_property_enum_name(C, &cont_ptr, prop, RNA_property_enum_get(&cont_ptr, prop), &cont_name); + BLI_strncpy(cont->name, cont_name, sizeof(cont->name)); + } + else + BLI_strncpy(cont->name, name, sizeof(cont->name)); + + make_unique_prop_names(C, cont->name); + /* set the controller state mask from the current object state. + A controller is always in a single state, so select the lowest bit set + from the object state */ + for (bit=0; bitstate & (1<state_mask = (1<state_mask == 0) { + /* shouldn't happen, object state is never 0 */ + cont->state_mask = 1; + } + + ob->scaflag |= OB_SHOWCONT; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void LOGIC_OT_controller_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Controller"; + ot->description = "Add a controller to the active object"; + ot->idname= "LOGIC_OT_controller_add"; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= controller_add_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", controller_type_items, CONT_LOGIC_AND, "Type", "Type of controller to add"); + RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Controller to add"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Controller to"); +} + +/* ************* Add/Remove Actuator Operator ************* */ + +static int actuator_remove_exec(bContext *C, wmOperator *op) +{ + Object *ob=NULL; + bActuator *act = edit_actuator_property_get(C, op, &ob); + + if (!act) + return OPERATOR_CANCELLED; + + BLI_remlink(&(ob->actuators), act); + unlink_actuator(act); + free_actuator(act); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_actuator_invoke_properties(C, op)) + return actuator_remove_exec(C, op); + else + return OPERATOR_CANCELLED; +} + +void LOGIC_OT_actuator_remove(wmOperatorType *ot) +{ + ot->name= "Remove Actuator"; + ot->description= "Remove a actuator from the active object"; + ot->idname= "LOGIC_OT_actuator_remove"; + + ot->invoke= actuator_remove_invoke; + ot->exec= actuator_remove_exec; + ot->poll= edit_actuator_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + edit_actuator_properties(ot); +} + +static int actuator_add_exec(bContext *C, wmOperator *op) +{ + Object *ob; + bActuator *act; + PointerRNA act_ptr; + PropertyRNA *prop; + const char *act_name; + char name[32]; + int type= RNA_enum_get(op->ptr, "type"); + + ob= edit_object_property_get(C, op); + if(!ob) + return OPERATOR_CANCELLED; + + act= new_actuator(type); + BLI_addtail(&(ob->actuators), act); + + /* set the actuator name based on rna type enum */ + RNA_pointer_create((ID *)ob, &RNA_Actuator, act, &act_ptr); + prop = RNA_struct_find_property(&act_ptr, "type"); + + RNA_string_get(op->ptr, "name", name); + if (BLI_strnlen(name, 32) < 1){ + RNA_property_enum_name(C, &act_ptr, prop, RNA_property_enum_get(&act_ptr, prop), &act_name); + BLI_strncpy(act->name, act_name, sizeof(act->name)); + } + else + BLI_strncpy(act->name, name, sizeof(act->name)); + + make_unique_prop_names(C, act->name); + ob->scaflag |= OB_SHOWACT; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void LOGIC_OT_actuator_add(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Add Actuator"; + ot->description = "Add a actuator to the active object"; + ot->idname= "LOGIC_OT_actuator_add"; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= actuator_add_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, CONT_LOGIC_AND, "Type", "Type of actuator to add"); + RNA_def_enum_funcs(prop, rna_Actuator_type_itemf); + RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Actuator to add"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Actuator to"); +} + +/* ************* Move Logic Bricks Operator ************* */ +static EnumPropertyItem logicbricks_move_direction[] ={ + {1, "UP", 0, "Move Up", ""}, + {2, "DOWN", 0, "Move Down", ""}, + {0, NULL, 0, NULL, NULL}}; + + +static int sensor_move_exec(bContext *C, wmOperator *op) +{ + Object *ob=NULL; + bSensor *sens= edit_sensor_property_get(C, op, &ob); + int move_up= logicbricks_move_property_get(op); + + if (!sens) + return OPERATOR_CANCELLED; + + sca_move_sensor(sens, ob, move_up); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_sensor_invoke_properties(C, op)) { + return sensor_move_exec(C, op); + } + else + return OPERATOR_CANCELLED; +} + +void LOGIC_OT_sensor_move(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Move Sensor"; + ot->description = "Move Densor"; + ot->idname= "LOGIC_OT_sensor_move"; + + /* api callbacks */ + ot->invoke= sensor_move_invoke; + ot->exec= sensor_move_exec; + ot->poll= edit_sensor_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + edit_sensor_properties(ot); + RNA_def_enum(ot->srna, "direction", logicbricks_move_direction, 1, "Direction", "Move Up or Down"); +} + +static int controller_move_exec(bContext *C, wmOperator *op) +{ + Object *ob=NULL; + bController *cont= edit_controller_property_get(C, op, &ob); + int move_up= logicbricks_move_property_get(op); + + if (!cont) + return OPERATOR_CANCELLED; + + sca_move_controller(cont, ob, move_up); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_controller_invoke_properties(C, op)) { + return controller_move_exec(C, op); + } + else + return OPERATOR_CANCELLED; +} + +void LOGIC_OT_controller_move(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Move Controller"; + ot->description = "Move Controller"; + ot->idname= "LOGIC_OT_controller_move"; + + /* api callbacks */ + ot->invoke= controller_move_invoke; + ot->exec= controller_move_exec; + ot->poll= edit_controller_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + edit_controller_properties(ot); + RNA_def_enum(ot->srna, "direction", logicbricks_move_direction, 1, "Direction", "Move Up or Down"); +} + +static int actuator_move_exec(bContext *C, wmOperator *op) +{ + Object *ob=NULL; + bActuator *act = edit_actuator_property_get(C, op, &ob); + int move_up= logicbricks_move_property_get(op); + + if (!act) + return OPERATOR_CANCELLED; + + sca_move_actuator(act, ob, move_up); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_actuator_invoke_properties(C, op)) { + return actuator_move_exec(C, op); + } + else + return OPERATOR_CANCELLED; +} + +void LOGIC_OT_actuator_move(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Move Actuator"; + ot->description = "Move Actuator"; + ot->idname= "LOGIC_OT_actuator_move"; + + /* api callbacks */ + ot->invoke= actuator_move_invoke; + ot->exec= actuator_move_exec; + ot->poll= edit_actuator_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + edit_actuator_properties(ot); + RNA_def_enum(ot->srna, "direction", logicbricks_move_direction, 1, "Direction", "Move Up or Down"); +} + + +void ED_operatortypes_logic(void) +{ + WM_operatortype_append(LOGIC_OT_sensor_remove); + WM_operatortype_append(LOGIC_OT_sensor_add); + WM_operatortype_append(LOGIC_OT_sensor_move); + WM_operatortype_append(LOGIC_OT_controller_remove); + WM_operatortype_append(LOGIC_OT_controller_add); + WM_operatortype_append(LOGIC_OT_controller_move); + WM_operatortype_append(LOGIC_OT_actuator_remove); + WM_operatortype_append(LOGIC_OT_actuator_add); + WM_operatortype_append(LOGIC_OT_actuator_move); +} diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 7539f721883..c4a42d89758 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -33,16 +33,12 @@ #include "DNA_actuator_types.h" #include "DNA_controller_types.h" -#include "DNA_object_types.h" #include "DNA_property_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_sensor_types.h" -#include "DNA_sound_types.h" -#include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_action_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -58,19 +54,16 @@ #include "BKE_sca.h" #include "BKE_utildefines.h" -#include "ED_screen.h" -#include "ED_types.h" #include "ED_util.h" -#include "WM_api.h" #include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" + +#include "RNA_access.h" /* XXX BAD BAD */ #include "../interface/interface_intern.h" @@ -201,8 +194,9 @@ static void make_unique_prop_names_cb(bContext *C, void *strv, void *redraw_view } -static void sca_move_sensor(bContext *C, void *datav, void *move_up) +static void old_sca_move_sensor(bContext *C, void *datav, void *move_up) { + /* deprecated, no longer using it (moved to sca.c) */ Scene *scene= CTX_data_scene(C); bSensor *sens_to_delete= datav; int val; @@ -253,8 +247,9 @@ static void sca_move_sensor(bContext *C, void *datav, void *move_up) } } -static void sca_move_controller(bContext *C, void *datav, void *move_up) +static void old_sca_move_controller(bContext *C, void *datav, void *move_up) { + /* deprecated, no longer using it (moved to sca.c) */ Scene *scene= CTX_data_scene(C); bController *controller_to_del= datav; int val; @@ -308,8 +303,9 @@ static void sca_move_controller(bContext *C, void *datav, void *move_up) } } -static void sca_move_actuator(bContext *C, void *datav, void *move_up) +static void old_sca_move_actuator(bContext *C, void *datav, void *move_up) { + /* deprecated, no longer using it (moved to sca.c) */ Scene *scene= CTX_data_scene(C); bActuator *actuator_to_move= datav; int val; @@ -455,8 +451,8 @@ void do_logic_buts(bContext *C, void *arg, int event) case B_SET_STATE_BIT: for(ob=G.main->object.first; ob; ob=ob->id.next) { - if(ob->scaflag & OB_SETSTBIT) { - ob->scaflag &= ~OB_SETSTBIT; + if(ob->scaflag & OB_ALLSTATE) { + ob->scaflag &= ~OB_ALLSTATE; ob->state = 0x3FFFFFFF; } } @@ -648,17 +644,17 @@ static char *controller_name(int type) { switch (type) { case CONT_LOGIC_AND: - return "AND"; + return "And"; case CONT_LOGIC_OR: - return "OR"; + return "Or"; case CONT_LOGIC_NAND: - return "NAND"; + return "Nand"; case CONT_LOGIC_NOR: - return "NOR"; + return "Nor"; case CONT_LOGIC_XOR: - return "XOR"; + return "Xor"; case CONT_LOGIC_XNOR: - return "XNOR"; + return "Xnor"; case CONT_EXPRESSION: return "Expression"; case CONT_PYTHON: @@ -682,7 +678,7 @@ static char *actuator_name(int type) case ACT_OBJECT: return "Motion"; case ACT_IPO: - return "Ipo"; + return "F-Curve"; case ACT_LAMP: return "Lamp"; case ACT_CAMERA: @@ -710,7 +706,7 @@ static char *actuator_name(int type) case ACT_VISIBILITY: return "Visibility"; case ACT_2DFILTER: - return "2D Filter"; + return "Filter 2D"; case ACT_PARENT: return "Parent"; case ACT_STATE: @@ -731,21 +727,21 @@ static char *actuator_pup(Object *owner) case OB_ARMATURE: return "Actuators %t|Action %x15|Armature %x23|Motion %x0|Constraint %x9|Ipo %x1" "|Camera %x3|Sound %x5|Property %x6|Edit Object %x10" - "|Scene %x11|Random %x13|Message %x14|Game %x17" + "|Scene %x11|Random %x13|Message %x14|Game %x17" "|Visibility %x18|2D Filter %x19|Parent %x20|State %x22"; break; case OB_MESH: return "Actuators %t|Shape Action %x21|Motion %x0|Constraint %x9|Ipo %x1" "|Camera %x3|Sound %x5|Property %x6|Edit Object %x10" - "|Scene %x11|Random %x13|Message %x14|Game %x17" + "|Scene %x11|Random %x13|Message %x14|Game %x17" "|Visibility %x18|2D Filter %x19|Parent %x20|State %x22"; break; default: return "Actuators %t|Motion %x0|Constraint %x9|Ipo %x1" "|Camera %x3|Sound %x5|Property %x6|Edit Object %x10" - "|Scene %x11|Random %x13|Message %x14|Game %x17" + "|Scene %x11|Random %x13|Message %x14|Game %x17" "|Visibility %x18|2D Filter %x19|Parent %x20|State %x22"; } } @@ -916,8 +912,15 @@ static ID **get_selected_and_linked_obs(bContext *C, short *count, short scavisf ob= G.main->object.first; nr= 0; + + /* make the active object always the first one of the list */ + if (obact) { + idar[0]= (ID *)obact; + nr++; + } + while(ob) { - if( ob->scavisflag ) { + if( (ob->scavisflag) && (ob != obact)) { idar[nr]= (ID *)ob; nr++; } @@ -2125,7 +2128,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh break; } - case ACT_SOUND: + case ACT_SOUND: { sa = act->data; sa->sndnr = 0; @@ -2177,27 +2180,27 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh } case ACT_CAMERA: - ysize= 48; + ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - ca= act->data; + ca= act->data; - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+10, yco-24, (width-20)/2, 19, &(ca->ob), "Look at this Object"); - uiDefButF(block, NUM, 0, "Height:", xco+10+(width-20)/2, yco-24, (width-20)/2, 19, &ca->height, 0.0, 20.0, 0, 0, ""); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+10, yco-24, (width-20)/2, 19, &(ca->ob), "Look at this Object"); + uiDefButF(block, NUM, 0, "Height:", xco+10+(width-20)/2, yco-24, (width-20)/2, 19, &ca->height, 0.0, 20.0, 0, 0, ""); - uiDefButF(block, NUM, 0, "Min:", xco+10, yco-44, (width-60)/2, 19, &ca->min, 0.0, 20.0, 0, 0, ""); + uiDefButF(block, NUM, 0, "Min:", xco+10, yco-44, (width-60)/2, 19, &ca->min, 0.0, 20.0, 0, 0, ""); - if(ca->axis==0) ca->axis= 'x'; - uiDefButS(block, ROW, 0, "X", xco+10+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'x', 0, 0, "Camera tries to get behind the X axis"); - uiDefButS(block, ROW, 0, "Y", xco+30+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'y', 0, 0, "Camera tries to get behind the Y axis"); + if(ca->axis==0) ca->axis= 'x'; + uiDefButS(block, ROW, 0, "X", xco+10+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'x', 0, 0, "Camera tries to get behind the X axis"); + uiDefButS(block, ROW, 0, "Y", xco+30+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'y', 0, 0, "Camera tries to get behind the Y axis"); - uiDefButF(block, NUM, 0, "Max:", xco+20+(width)/2, yco-44, (width-60)/2, 19, &ca->max, 0.0, 20.0, 0, 0, ""); + uiDefButF(block, NUM, 0, "Max:", xco+20+(width)/2, yco-44, (width-60)/2, 19, &ca->max, 0.0, 20.0, 0, 0, ""); - yco-= ysize; + yco-= ysize; - break; + break; case ACT_EDIT_OBJECT: @@ -2288,11 +2291,11 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh str= "Edit Object %t|Add Object %x0|End Object %x1|Replace Mesh %x2|Track to %x3|Dynamics %x4"; uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, (width-80), 19, &eoa->type, 0.0, 0.0, 0, 0, ""); - yco-= ysize; + yco-= ysize; - break; + break; - case ACT_CONSTRAINT: + case ACT_CONSTRAINT: coa= act->data; if (coa->type == ACT_CONST_TYPE_LOC) { @@ -2425,79 +2428,79 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh } str= "Constraint Type %t|Location %x0|Distance %x1|Orientation %x2|Force field %x3"; but = uiDefButS(block, MENU, B_REDR, str, xco+40, yco-23, (width-80), 19, &coa->type, 0.0, 0.0, 0, 0, ""); - yco-= ysize; - break; + yco-= ysize; + break; case ACT_SCENE: - sca= act->data; + sca= act->data; - if(sca->type==ACT_SCENE_RESTART) { - ysize= 28; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - } - else if(sca->type==ACT_SCENE_CAMERA) { + if(sca->type==ACT_SCENE_RESTART) { + ysize= 28; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + } + else if(sca->type==ACT_SCENE_CAMERA) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+40, yco-44, (width-80), 19, &(sca->camera), "Set this Camera. Leave empty to refer to self object"); - } - else if(sca->type==ACT_SCENE_SET) { + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+40, yco-44, (width-80), 19, &(sca->camera), "Set this Camera. Leave empty to refer to self object"); + } + else if(sca->type==ACT_SCENE_SET) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Set this Scene"); - } + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Set this Scene"); + } else if(sca->type==ACT_SCENE_ADD_FRONT) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add an Overlay Scene"); - } + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add an Overlay Scene"); + } else if(sca->type==ACT_SCENE_ADD_BACK) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add a Background Scene"); - } + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add a Background Scene"); + } else if(sca->type==ACT_SCENE_REMOVE) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Remove a Scene"); - } + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Remove a Scene"); + } else if(sca->type==ACT_SCENE_SUSPEND) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Pause a Scene"); - } + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Pause a Scene"); + } else if(sca->type==ACT_SCENE_RESUME) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Unpause a Scene"); - } + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Unpause a Scene"); + } str= "Scene %t|Restart %x0|Set Scene %x1|Set Camera %x2|Add OverlayScene %x3|Add BackgroundScene %x4|Remove Scene %x5|Suspend Scene %x6|Resume Scene %x7"; uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, (width-80), 19, &sca->type, 0.0, 0.0, 0, 0, ""); - yco-= ysize; - break; + yco-= ysize; + break; case ACT_GAME: { gma = act->data; @@ -2507,7 +2510,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh ysize = 48; glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefBut(block, TEX, 1, "File: ", xco+10, yco-44,width-20,19, &(gma->filename), 0, 63, 0, 0, "Load this blend file, use the \"//\" prefix for a path relative to the current blend file"); + uiDefBut(block, TEX, 1, "File: ", xco+10, yco-44,width-20,19, &(gma->filename), 0, 63, 0, 0, "Load this blend file, use the \"//\" prefix for a path relative to the current blend file"); // uiDefBut(block, TEX, 1, "Anim: ", xco+10, yco-64,width-20,19, &(gma->loadaniname), 0, 63, 0, 0, "Use this loadinganimation"); } /* else if (gma->type == ACT_GAME_START) @@ -2516,7 +2519,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefBut(block, TEX, 1, "File: ", xco+10, yco-44,width-20,19, &(gma->filename), 0, 63, 0, 0, "Load this file"); + uiDefBut(block, TEX, 1, "File: ", xco+10, yco-44,width-20,19, &(gma->filename), 0, 63, 0, 0, "Load this file"); uiDefBut(block, TEX, 1, "Anim: ", xco+10, yco-64,width-20,19, &(gma->loadaniname), 0, 63, 0, 0, "Use this loadinganimation"); } */ else if (ELEM4(gma->type, ACT_GAME_RESTART, ACT_GAME_QUIT, ACT_GAME_SAVECFG, ACT_GAME_LOADCFG)) @@ -2759,16 +2762,16 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh if (ma->bodyType == ACT_MESG_MESG) { - /* line 3: Message Body */ - uiDefBut(block, TEX, 1, "Body: ", - (xco+10+(0.20*(width-20))),(yco-(myline++*24)),(0.8*(width-20)),19, - &ma->body, 0, 31, 0, 0, - "Optional message body Text"); + /* line 3: Message Body */ + uiDefBut(block, TEX, 1, "Body: ", + (xco+10+(0.20*(width-20))),(yco-(myline++*24)),(0.8*(width-20)),19, + &ma->body, 0, 31, 0, 0, + "Optional message body Text"); } else { /* line 3: Property body (set by property) */ uiDefBut(block, TEX, 1, "Propname: ", - (xco+10+(0.20*(width-20))),(yco-(myline++*24)),(0.8*(width-20)),19, + (xco+10+(0.20*(width-20))),(yco-(myline++*24)),(0.8*(width-20)),19, &ma->body, 0, 31, 0, 0, "The message body will be set by the Property Value"); } @@ -2783,7 +2786,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh { ysize +=20; } - glRects( xco, yco-ysize, xco+width, yco ); + glRects( xco, yco-ysize, xco+width, yco ); uiEmboss( (float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1 ); switch(tdfa->type) @@ -2826,16 +2829,16 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh uiDefButS(block, MENU, B_REDR, str, xco+30,yco-24,width-60, 19, &tdfa->type, 0.0, 0.0, 0.0, 0.0, "2D filter type"); yco -= ysize; - break; + break; case ACT_PARENT: - parAct = act->data; + parAct = act->data; - if(parAct->type==ACT_PARENT_SET) { + if(parAct->type==ACT_PARENT_SET) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+95, yco-24, (width-100), 19, &(parAct->ob), "Set this object as parent"); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+95, yco-24, (width-100), 19, &(parAct->ob), "Set this object as parent"); uiBlockBeginAlign(block); uiDefButBitS(block, TOGN, ACT_PARENT_COMPOUND, B_REDR, "Compound", @@ -2848,21 +2851,21 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh 0.0, 0.0, 0, 0, "Make this object ghost while parented (only if not compound)"); uiBlockEndAlign(block); - } - else if(parAct->type==ACT_PARENT_REMOVE) { + } + else if(parAct->type==ACT_PARENT_REMOVE) { - ysize= 28; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - } + ysize= 28; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + } str= "Parent %t|Set Parent %x0|Remove Parent %x1"; uiDefButI(block, MENU, B_REDR, str, xco+5, yco-24, parAct->type==1?(width-80):90, 19, &parAct->type, 0.0, 0.0, 0, 0, ""); - yco-= ysize; - break; + yco-= ysize; + break; case ACT_ARMATURE: - armAct = act->data; + armAct = act->data; if (ob->type == OB_ARMATURE) { str= "Constraint %t|Run armature %x0|Enable %x1|Disable %x2|Set target %x3|Set weight %x4"; @@ -2897,13 +2900,13 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh break; } } - } + } glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - yco-= ysize; - break; + yco-= ysize; + break; - default: + default: ysize= 4; glRects(xco, yco-ysize, xco+width, yco); @@ -3177,6 +3180,1538 @@ static int is_sensor_linked(uiBlock *block, bSensor *sens) /* never used, see CVS 1.120 for the code */ /* static uiBlock *freecamera_menu(void) */ +/* Sensors code */ + +static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *logic_ptr) +{ + uiLayout *box, *row, *subrow; + bSensor *sens= (bSensor *)ptr->data; + + box= uiLayoutBox(layout); + row= uiLayoutRow(box, 0); + + uiItemR(row, ptr, "expanded", UI_ITEM_R_NO_BG, "", 0); + if(RNA_boolean_get(ptr, "expanded")) { + uiItemR(row, ptr, "type", 0, "", 0); + uiItemR(row, ptr, "name", 0, "", 0); + } else { + uiItemL(row, sensor_name(sens->type), 0); + uiItemL(row, sens->name, 0); + } + + subrow= uiLayoutRow(row, 0); + uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "sensors_show_active_states") + && RNA_boolean_get(ptr, "expanded")) || RNA_boolean_get(ptr, "pinned"))); + uiItemR(subrow, ptr, "pinned", UI_ITEM_R_NO_BG, "", 0); + + if(RNA_boolean_get(ptr, "expanded")==0) { + subrow= uiLayoutRow(row, 1); + uiItemEnumO(subrow, "LOGIC_OT_sensor_move", "", ICON_TRIA_UP, "direction", 1); // up + uiItemEnumO(subrow, "LOGIC_OT_sensor_move", "", ICON_TRIA_DOWN, "direction", 2); // down + } + + uiItemO(row, "", ICON_X, "LOGIC_OT_sensor_remove"); +} + +static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box, *split, *row; + + box= uiLayoutBox(layout); + split = uiLayoutSplit(box, 0.45, 0); + + row= uiLayoutRow(split, 1); + uiItemR(row, ptr, "pulse_true_level", 0, "", ICON_DOTSUP); + uiItemR(row, ptr, "pulse_false_level", 0, "", ICON_DOTSDOWN); + uiItemR(row, ptr, "frequency", 0, "Freq", 0); + + row= uiLayoutRow(split, 1); + uiItemR(row, ptr, "level", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(row, ptr, "tap", UI_ITEM_R_TOGGLE, NULL, 0); + + row= uiLayoutRow(split, 1); + uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", 0); +} +/* sensors in alphabetical order */ + +static void draw_sensor_actuator(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + PointerRNA settings_ptr; + + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + uiItemPointerR(layout, ptr, "actuator", &settings_ptr, "actuators", NULL, ICON_LOGIC); +} + +static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr) +{ + bSensor *sens = (bSensor*)ptr->data; + bArmatureSensor *as = (bArmatureSensor *) sens->data; + Object *ob = (Object *)ptr->id.data; + PointerRNA pose_ptr, pchan_ptr; + PropertyRNA *bones_prop= NULL; + uiLayout *row; + + if(ob->type != OB_ARMATURE){ + uiItemL(layout, "Sensor only available for armatures", 0); + return; + } + + if (ob->pose) { + RNA_pointer_create((ID *)ob, &RNA_Pose, ob->pose, &pose_ptr); + bones_prop = RNA_struct_find_property(&pose_ptr, "bones"); + } + + if (&pose_ptr.data) { + uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA); + + if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, as->posechannel, &pchan_ptr)) + uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE); + } + row = uiLayoutRow(layout, 1); + uiItemR(row, ptr, "test_type", 0, NULL, 0); + uiItemR(row, ptr, "value", 0, NULL, 0); +} + +static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + uiLayout *row, *split; + PointerRNA main_ptr; + + RNA_main_pointer_create(CTX_data_main(C), &main_ptr); + + split = uiLayoutSplit(layout, 0.3, 0); + row = uiLayoutRow(split, 1); + uiItemR(row, ptr, "pulse", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(row, ptr, "collision_type", UI_ITEM_R_TOGGLE, NULL, 0); + + switch (RNA_enum_get(ptr, "collision_type")) { + case SENS_COLLISION_PROPERTY: + uiItemR(split, ptr, "property", 0, NULL, 0); + break; + case SENS_COLLISION_MATERIAL: + uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA); + break; + } +} + +static void draw_sensor_delay(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + row= uiLayoutRow(layout, 0); + + uiItemR(row, ptr, "delay", 0, NULL, 0); + uiItemR(row, ptr, "duration", 0, NULL, 0); + uiItemR(row, ptr, "repeat", 0, NULL, 0); +} + +static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *col, *row; + + uiItemR(layout, ptr, "joystick_index", 0, NULL, 0); + uiItemR(layout, ptr, "event_type", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "event_type")) { + case SENS_JOY_BUTTON: + uiItemR(layout, ptr, "all_events", 0, NULL, 0); + + col = uiLayoutColumn(layout, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "all_events")==0); + uiItemR(col, ptr, "button_number", 0, NULL, 0); + break; + case SENS_JOY_AXIS: + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "axis_number", 0, NULL, 0); + uiItemR(row, ptr, "axis_threshold", 0, NULL, 0); + + uiItemR(layout, ptr, "all_events", 0, NULL, 0); + col = uiLayoutColumn(layout, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "all_events")==0); + uiItemR(col, ptr, "axis_direction", 0, NULL, 0); + break; + case SENS_JOY_HAT: + uiItemR(layout, ptr, "hat_number", 0, NULL, 0); + uiItemR(layout, ptr, "all_events", 0, NULL, 0); + + col = uiLayoutColumn(layout, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "all_events")==0); + uiItemR(col, ptr, "hat_direction", 0, NULL, 0); + break; + case SENS_JOY_AXIS_SINGLE: + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "single_axis_number", 0, NULL, 0); + uiItemR(row, ptr, "axis_threshold", 0, NULL, 0); + break; + } +} + +static void draw_sensor_keyboard(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + PointerRNA settings_ptr; + uiLayout *row, *col; + + row = uiLayoutRow(layout, 0); + uiItemL(row, "Key:", 0); + col = uiLayoutColumn(row, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "all_keys")==0); + uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", 0); + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "all_keys", UI_ITEM_R_TOGGLE, NULL, 0); + + col = uiLayoutColumn(layout, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "all_keys")==0); + row = uiLayoutRow(col, 0); + uiItemL(row, "First Modifier:", 0); + uiItemR(row, ptr, "modifier_key", UI_ITEM_R_EVENT, "", 0); + + row = uiLayoutRow(col, 0); + uiItemL(row, "Second Modifier:", 0); + uiItemR(row, ptr, "second_modifier_key", UI_ITEM_R_EVENT, "", 0); + + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, 0); + uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, 0); +} + +static void draw_sensor_message(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "subject", 0, NULL, 0); +} + +static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "mouse_event", 0, NULL, 0); +} + +static void draw_sensor_near(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "property", 0, NULL, 0); + + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "distance", 0, NULL, 0); + uiItemR(row, ptr, "reset_distance", 0, NULL, 0); +} + +static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + PointerRNA settings_ptr; + + uiLayout *row; + uiItemR(layout, ptr, "evaluation_type", 0, NULL, 0); + + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, 0); + + switch (RNA_enum_get(ptr, "evaluation_type")) { + case SENS_PROP_INTERVAL: + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "min_value", 0, NULL, 0); + uiItemR(row, ptr, "max_value", 0, NULL, 0); + break; + case SENS_PROP_EQUAL: + uiItemR(layout, ptr, "value", 0, NULL, 0); + break; + case SENS_PROP_NEQUAL: + uiItemR(layout, ptr, "value", 0, NULL, 0); + break; + case SENS_PROP_CHANGED: + break; + } +} + +static void draw_sensor_radar(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "property", 0, NULL, 0); + uiItemR(layout, ptr, "axis", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "angle", 0, NULL, 0); + uiItemR(row, ptr, "distance", 0, NULL, 0); +} + +static void draw_sensor_random(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "seed", 0, NULL, 0); +} + +static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + uiLayout *split, *row; + PointerRNA main_ptr; + + RNA_main_pointer_create(CTX_data_main(C), &main_ptr); + split= uiLayoutSplit(layout, 0.3, 0); + uiItemR(split, ptr, "ray_type", 0, "", 0); + switch (RNA_enum_get(ptr, "ray_type")) { + case SENS_RAY_PROPERTY: + uiItemR(split, ptr, "property", 0, "", 0); + break; + case SENS_RAY_MATERIAL: + uiItemPointerR(split, ptr, "material", &main_ptr, "materials", "", ICON_MATERIAL_DATA); + break; + } + + split= uiLayoutSplit(layout, 0.3, 0); + uiItemR(split, ptr, "axis", 0, "", 0); + row= uiLayoutRow(split, 0); + uiItemR(row, ptr, "range", 0, NULL, 0); + uiItemR(row, ptr, "x_ray_mode", UI_ITEM_R_TOGGLE, NULL, 0); +} + +static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "material", 0, NULL, 0); +} + +void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + uiLayout *box; + + if (!RNA_boolean_get(ptr, "expanded")) + return; + + draw_sensor_internal_header(layout, ptr); + + box = uiLayoutBox(layout); + + switch (RNA_enum_get(ptr, "type")) { + + case SENS_ACTUATOR: + draw_sensor_actuator(box, ptr); + break; + case SENS_ALWAYS: + break; + case SENS_ARMATURE: + draw_sensor_armature(box, ptr); + break; + case SENS_COLLISION: + draw_sensor_collision(box, ptr, C); + break; + case SENS_DELAY: + draw_sensor_delay(box, ptr); + break; + case SENS_JOYSTICK: + draw_sensor_joystick(box, ptr); + break; + case SENS_KEYBOARD: + draw_sensor_keyboard(box, ptr); + break; + case SENS_MESSAGE: + draw_sensor_message(box, ptr); + break; + case SENS_MOUSE: + draw_sensor_mouse(box, ptr); + break; + case SENS_NEAR: + draw_sensor_near(box, ptr); + break; + case SENS_PROPERTY: + draw_sensor_property(box, ptr); + break; + case SENS_RADAR: + draw_sensor_radar(box, ptr); + break; + case SENS_RANDOM: + draw_sensor_random(box, ptr); + break; + case SENS_RAY: + draw_sensor_ray(box, ptr, C); + break; + case SENS_TOUCH: + draw_sensor_touch(box, ptr); + break; + } +} + +/* Controller code */ +static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, int width, int yco) +{ + uiLayout *box, *row, *subrow; + bController *cont= (bController *)ptr->data; + + char state[3]; + sprintf(state, "%d", RNA_int_get(ptr, "state")); + + box= uiLayoutBox(layout); + row= uiLayoutRow(box, 0); + + uiItemR(row, ptr, "expanded", UI_ITEM_R_NO_BG, "", 0); + if(RNA_boolean_get(ptr, "expanded")) { + uiItemR(row, ptr, "type", 0, "", 0); + uiItemR(row, ptr, "name", 0, "", 0); + /* XXX provisory for Blender 2.50Beta */ + uiDefBlockBut(uiLayoutGetBlock(layout), controller_state_mask_menu, cont, state, (short)(xco+width-44), yco, 22+22, UI_UNIT_Y, "Set controller state index (from 1 to 30)"); + } else { + uiItemL(row, controller_name(cont->type), 0); + uiItemL(row, cont->name, 0); + uiItemL(row, state, 0); + } + + uiItemR(row, ptr, "priority", 0, "", 0); + + if(RNA_boolean_get(ptr, "expanded")==0) { + subrow= uiLayoutRow(row, 1); + uiItemEnumO(subrow, "LOGIC_OT_controller_move", "", ICON_TRIA_UP, "direction", 1); // up + uiItemEnumO(subrow, "LOGIC_OT_controller_move", "", ICON_TRIA_DOWN, "direction", 2); // down + } + uiItemO(row, "", ICON_X, "LOGIC_OT_controller_remove"); +} + +static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "expression", 0, "", 0); +} + +static void draw_controller_python(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *split, *subsplit; + + split = uiLayoutSplit(layout, 0.3, 1); + uiItemR(split, ptr, "mode", 0, "", 0); + if (RNA_enum_get(ptr, "mode") == CONT_PY_SCRIPT) { + uiItemR(split, ptr, "text", 0, "", 0); + } + else { + subsplit = uiLayoutSplit(split, 0.8, 0); + uiItemR(subsplit, ptr, "module", 0, "", 0); + uiItemR(subsplit, ptr, "debug", UI_ITEM_R_TOGGLE, NULL, 0); + } +} + +static void draw_controller_state(uiLayout *layout, PointerRNA *ptr) +{ + +} + +void draw_brick_controller(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box; + + if (!RNA_boolean_get(ptr, "expanded")) + return; + + box = uiLayoutBox(layout); + + draw_controller_state(box, ptr); + + switch (RNA_enum_get(ptr, "type")) { + case CONT_LOGIC_AND: + break; + case CONT_LOGIC_OR: + break; + case CONT_EXPRESSION: + draw_controller_expression(box, ptr); + break; + case CONT_PYTHON: + draw_controller_python(box, ptr); + break; + case CONT_LOGIC_NAND: + break; + case CONT_LOGIC_NOR: + break; + case CONT_LOGIC_XOR: + break; + case CONT_LOGIC_XNOR: + break; + } +} + +/* Actuator code */ +static void draw_actuator_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *logic_ptr) +{ + uiLayout *box, *row, *subrow; + bActuator *act= (bActuator *)ptr->data; + + box= uiLayoutBox(layout); + row= uiLayoutRow(box, 0); + + uiItemR(row, ptr, "expanded", UI_ITEM_R_NO_BG, "", 0); + if(RNA_boolean_get(ptr, "expanded")) { + uiItemR(row, ptr, "type", 0, "", 0); + uiItemR(row, ptr, "name", 0, "", 0); + } else { + uiItemL(row, actuator_name(act->type), 0); + uiItemL(row, act->name, 0); + } + + subrow= uiLayoutRow(row, 0); + uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "actuators_show_active_states") + && RNA_boolean_get(ptr, "expanded")) || RNA_boolean_get(ptr, "pinned"))); + uiItemR(subrow, ptr, "pinned", UI_ITEM_R_NO_BG, "", 0); + + if(RNA_boolean_get(ptr, "expanded")==0) { + subrow= uiLayoutRow(row, 1); + uiItemEnumO(subrow, "LOGIC_OT_actuator_move", "", ICON_TRIA_UP, "direction", 1); // up + uiItemEnumO(subrow, "LOGIC_OT_actuator_move", "", ICON_TRIA_DOWN, "direction", 2); // down + } + uiItemO(row, "", ICON_X, "LOGIC_OT_actuator_remove"); +} + +static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + PointerRNA settings_ptr; + uiLayout *row; + + if(ob->type != OB_ARMATURE){ + uiItemL(layout, "Actuator only available for armatures", 0); + return; + } + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "mode", 0, "", 0); + uiItemR(row, ptr, "action", 0, NULL, 0); + uiItemR(row, ptr, "continue_last_frame", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + if((RNA_enum_get(ptr, "mode") == ACT_ACTION_FROM_PROP)) + uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0); + + else { + uiItemR(row, ptr, "frame_start", 0, NULL, 0); + uiItemR(row, ptr, "frame_end", 0, NULL, 0); + } + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "blendin", 0, NULL, 0); + uiItemR(row, ptr, "priority", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, 0); + +#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR + uiItemR(row, "stride_length", 0, NULL, 0); +#endif +} + +static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bArmatureActuator *aa = (bArmatureActuator *) act->data; + Object *ob = (Object *)ptr->id.data; + PointerRNA pose_ptr, pchan_ptr; + PropertyRNA *bones_prop; + + if(ob->type != OB_ARMATURE){ + uiItemL(layout, "Actuator only available for armatures", 0); + return; + } + + if (ob->pose) { + RNA_pointer_create((ID *)ob, &RNA_Pose, ob->pose, &pose_ptr); + bones_prop = RNA_struct_find_property(&pose_ptr, "bones"); + } + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "mode")) + { + case ACT_ARM_RUN: + break; + case ACT_ARM_ENABLE: + case ACT_ARM_DISABLE: + if (&pose_ptr.data) { + uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA); + + if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr)) + uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE); + } + break; + case ACT_ARM_SETTARGET: + if (&pose_ptr.data) { + uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA); + + if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr)) + uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE); + } + + uiItemR(layout, ptr, "target", 0, NULL, 0); + uiItemR(layout, ptr, "secondary_target", 0, NULL, 0); + break; + case ACT_ARM_SETWEIGHT: + if (&pose_ptr.data) { + uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA); + + if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr)) + uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE); + } + + uiItemR(layout, ptr, "weight", 0, NULL, 0); + break; + } +} + +static void draw_actuator_camera(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + uiItemR(layout, ptr, "object", 0, NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "height", 0, NULL, 0); + uiItemR(row, ptr, "axis", 0, NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "min", 0, NULL, 0); + uiItemR(row, ptr, "max", 0, NULL, 0); +} + +static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + uiLayout *row, *col, *subcol, *split; + PointerRNA main_ptr; + + RNA_main_pointer_create(CTX_data_main(C), &main_ptr); + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + switch (RNA_enum_get(ptr, "mode")) + { + case ACT_CONST_TYPE_LOC: + uiItemR(layout, ptr, "limit", 0, NULL, 0); + + row = uiLayoutRow(layout, 1); + uiItemR(row, ptr, "limit_min", 0, NULL, 0); + uiItemR(row, ptr, "limit_max", 0, NULL, 0); + + uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, 0); + break; + + case ACT_CONST_TYPE_DIST: + split = uiLayoutSplit(layout, 0.8, 0); + uiItemR(split, ptr, "direction", 0, NULL, 0); + row = uiLayoutRow(split, 1); + uiItemR(row, ptr, "local", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(row, ptr, "normal", UI_ITEM_R_TOGGLE, NULL, 0); + + row = uiLayoutRow(layout, 0); + col = uiLayoutColumn(row, 0); + uiItemL(col, "Range:", 0); + uiItemR(col, ptr, "range", 0, "", 0); + + col = uiLayoutColumn(row, 1); + uiItemR(col, ptr, "force_distance", UI_ITEM_R_TOGGLE, NULL, 0); + subcol = uiLayoutColumn(col, 0); + uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "force_distance")==1); + uiItemR(subcol, ptr, "distance", 0, "", 0); + + uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, 0); + + split = uiLayoutSplit(layout, 0.15, 0); + uiItemR(split, ptr, "detect_material", UI_ITEM_R_TOGGLE, NULL, 0); + if (RNA_boolean_get(ptr, "detect_material")) + uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA); + else + uiItemR(split, ptr, "property", 0, NULL, 0); + + split = uiLayoutSplit(layout, 0.15, 0); + uiItemR(split, ptr, "persistent", UI_ITEM_R_TOGGLE, NULL, 0); + + row = uiLayoutRow(split, 1); + uiItemR(row, ptr, "time", 0, NULL, 0); + uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, 0); + break; + + case ACT_CONST_TYPE_ORI: + uiItemR(layout, ptr, "direction_axis", 0, NULL, 0); + + row=uiLayoutRow(layout, 1); + uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, 0); + uiItemR(row, ptr, "time", 0, NULL, 0); + + row=uiLayoutRow(layout, 0); + uiItemR(row, ptr, "max_rotation", 0, NULL, 0); + + row=uiLayoutRow(layout, 1); + uiItemR(row, ptr, "min_angle", 0, NULL, 0); + uiItemR(row, ptr, "max_angle", 0, NULL, 0); + break; + + case ACT_CONST_TYPE_FH: + split=uiLayoutSplit(layout, 0.75, 0); + row= uiLayoutRow(split, 0); + uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, 0); + + uiItemR(row, ptr, "fh_height", 0, NULL, 0); + uiItemR(split, ptr, "fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "direction_axis", 0, NULL, 0); + split = uiLayoutSplit(row, 0.9, 0); + uiItemR(split, ptr, "spring", 0, NULL, 0); + uiItemR(split, ptr, "fh_normal", UI_ITEM_R_TOGGLE , NULL, 0); + + split = uiLayoutSplit(layout, 0.15, 0); + uiItemR(split, ptr, "detect_material", UI_ITEM_R_TOGGLE, NULL, 0); + if (RNA_boolean_get(ptr, "detect_material")) + uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA); + else + uiItemR(split, ptr, "property", 0, NULL, 0); + + split = uiLayoutSplit(layout, 0.15, 0); + uiItemR(split, ptr, "persistent", UI_ITEM_R_TOGGLE, NULL, 0); + + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "time", 0, NULL, 0); + uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, 0); + break; + } +} + +static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + uiLayout *row, *split, *subsplit; + uiItemR(layout, ptr, "mode", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "mode")) + { + case ACT_EDOB_ADD_OBJECT: + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "object", 0, NULL, 0); + uiItemR(row, ptr, "time", 0, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "linear_velocity", 0, NULL, 0); + uiItemR(split, ptr, "local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "angular_velocity", 0, NULL, 0); + uiItemR(split, ptr, "local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, 0); + break; + case ACT_EDOB_END_OBJECT: + break; + case ACT_EDOB_REPLACE_MESH: + if(ob->type != OB_MESH) { + uiItemL(layout, "Mode only available for mesh objects", 0); + break; + } + split = uiLayoutSplit(layout, 0.6, 0); + uiItemR(split, ptr, "mesh", 0, NULL, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(row, ptr, "replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, 0); + break; + case ACT_EDOB_TRACK_TO: + split = uiLayoutSplit(layout, 0.5, 0); + uiItemR(split, ptr, "track_object", 0, NULL, 0); + subsplit = uiLayoutSplit(split, 0.7, 0); + uiItemR(subsplit, ptr, "time", 0, NULL, 0); + uiItemR(subsplit, ptr, "enable_3d_tracking", UI_ITEM_R_TOGGLE, NULL, 0); + break; + case ACT_EDOB_DYNAMICS: + if(ob->type != OB_MESH) { + uiItemL(layout, "Mode only available for mesh objects", 0); + break; + } + uiItemR(layout, ptr, "dynamic_operation", 0, NULL, 0); + if (RNA_enum_get(ptr, "dynamic_operation") == ACT_EDOB_SET_MASS) + uiItemR(layout, ptr, "mass", 0, NULL, 0); + break; + } +} + +static void draw_actuator_filter_2d(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row, *split; + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + switch (RNA_enum_get(ptr, "mode")) + { + case ACT_2DFILTER_CUSTOMFILTER: + uiItemR(layout, ptr, "filter_pass", 0, NULL, 0); + uiItemR(layout, ptr, "glsl_shader", 0, NULL, 0); + break; + case ACT_2DFILTER_MOTIONBLUR: + split=uiLayoutSplit(layout, 0.75, 1); + row= uiLayoutRow(split, 0); + uiLayoutSetActive(row, RNA_boolean_get(ptr, "enable_motion_blur")==1); + uiItemR(row, ptr, "motion_blur_value", 0, NULL, 0); + uiItemR(split, ptr, "enable_motion_blur", UI_ITEM_R_TOGGLE, NULL, 0); + break; + default: // all other 2D Filters + uiItemR(layout, ptr, "filter_pass", 0, NULL, 0); + break; + } +} + +static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "mode", 0, NULL, 0); + if (RNA_enum_get(ptr, "mode") == ACT_GAME_LOAD) + uiItemR(layout, ptr, "filename", 0, NULL, 0); +} + +static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob; + PointerRNA settings_ptr; + uiLayout *row, *subrow, *col; + + ob = (Object *)ptr->id.data; + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "play_type", 0, "", 0); + subrow= uiLayoutRow(row, 1); + uiItemR(subrow, ptr, "force", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(subrow, ptr, "add", UI_ITEM_R_TOGGLE, NULL, 0); + + col = uiLayoutColumn(subrow, 0); + uiLayoutSetActive(col, (RNA_boolean_get(ptr, "add") || RNA_boolean_get(ptr, "force"))); + uiItemR(col, ptr, "local", UI_ITEM_R_TOGGLE, NULL, 0); + + row= uiLayoutRow(layout, 0); + if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP)) + uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0); + + else { + uiItemR(row, ptr, "frame_start", 0, NULL, 0); + uiItemR(row, ptr, "frame_end", 0, NULL, 0); + } + uiItemR(row, ptr, "child", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, 0); +} + +static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + Object *ob; + PointerRNA main_ptr, settings_ptr; + uiLayout *row; + + RNA_main_pointer_create(CTX_data_main(C), &main_ptr); + + ob = (Object *)ptr->id.data; + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + uiItemPointerR(layout, ptr, "to_property", &main_ptr, "objects", NULL, ICON_OBJECT_DATA); + uiItemR(layout, ptr, "subject", 0, NULL, 0); + + row= uiLayoutRow(layout, 1); + uiItemR(row, ptr, "body_type", 0, NULL, 0); + + if(RNA_enum_get(ptr, "body_type") == ACT_MESG_MESG) + uiItemR(row, ptr, "body_message", 0, "", 0); + else // mode == ACT_MESG_PROP + uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", 0); +} + +static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob; + PointerRNA settings_ptr; + uiLayout *split, *row, *col, *subcol; + int physics_type; + + ob = (Object *)ptr->id.data; + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + physics_type = RNA_enum_get(&settings_ptr, "physics_type"); + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "mode")) { + case ACT_OBJECT_NORMAL: + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "loc", 0, NULL, 0); + uiItemR(split, ptr, "local_location", UI_ITEM_R_TOGGLE, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "rot", 0, NULL, 0); + uiItemR(split, ptr, "local_rotation", UI_ITEM_R_TOGGLE, NULL, 0); + + if (ELEM3(physics_type, OB_BODY_TYPE_DYNAMIC, OB_BODY_TYPE_RIGID, OB_BODY_TYPE_SOFT)) { + uiItemL(layout, "Dynamic Object Settings:", 0); + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "force", 0, NULL, 0); + uiItemR(split, ptr, "local_force", UI_ITEM_R_TOGGLE, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "torque", 0, NULL, 0); + uiItemR(split, ptr, "local_torque", UI_ITEM_R_TOGGLE, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "linear_velocity", 0, NULL, 0); + row = uiLayoutRow(split, 1); + uiItemR(row, ptr, "local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(row, ptr, "add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "angular_velocity", 0, NULL, 0); + uiItemR(split, ptr, "local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, 0); + + uiItemR(layout, ptr, "damping", 0, NULL, 0); + } + break; + case ACT_OBJECT_SERVO: + uiItemR(layout, ptr, "reference_object", 0, NULL, 0); + + split = uiLayoutSplit(layout, 0.9, 0); + row = uiLayoutRow(split, 0); + uiItemR(row, ptr, "linear_velocity", 0, NULL, 0); + uiItemR(split, ptr, "local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0); + + row = uiLayoutRow(layout, 0); + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "servo_limit_x", UI_ITEM_R_TOGGLE, NULL, 0); + subcol = uiLayoutColumn(col, 1); + uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "servo_limit_x")==1); + uiItemR(subcol, ptr, "force_max_x", 0, NULL, 0); + uiItemR(subcol, ptr, "force_min_x", 0, NULL, 0); + + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "servo_limit_y", UI_ITEM_R_TOGGLE, NULL, 0); + subcol = uiLayoutColumn(col, 1); + uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "servo_limit_y")==1); + uiItemR(subcol, ptr, "force_max_y", 0, NULL, 0); + uiItemR(subcol, ptr, "force_min_y", 0, NULL, 0); + + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "servo_limit_z", UI_ITEM_R_TOGGLE, NULL, 0); + subcol = uiLayoutColumn(col, 1); + uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "servo_limit_z")==1); + uiItemR(subcol, ptr, "force_max_z", 0, NULL, 0); + uiItemR(subcol, ptr, "force_min_z", 0, NULL, 0); + + //XXXACTUATOR missing labels from original 2.49 ui (e.g. Servo, Min, Max, Fast) + //Layout designers willing to help on that, please compare with 2.49 ui + // (since the old code is going to be deleted ... soon) + + col = uiLayoutColumn(layout, 1); + uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, 0); + break; + } +} + +static void draw_actuator_parent(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + uiItemR(layout, ptr, "object", 0, NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "compound", 0, NULL, 0); + uiItemR(row, ptr, "ghost", 0, NULL, 0); +} + +static void draw_actuator_property(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + bActuator *act = (bActuator *)ptr->data; + bPropertyActuator *pa = (bPropertyActuator *) act->data; + Object *ob_from= pa->ob; + PointerRNA settings_ptr, obj_settings_ptr; + + uiLayout *row, *subrow; + + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, 0); + + switch(RNA_enum_get(ptr, "mode")) + { + case ACT_PROP_TOGGLE: + break; + case ACT_PROP_ADD: + uiItemR(layout, ptr, "value", 0, NULL, 0); + break; + case ACT_PROP_ASSIGN: + uiItemR(layout, ptr, "value", 0, NULL, 0); + break; + case ACT_PROP_COPY: + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "object", 0, NULL, 0); + if(ob_from){ + RNA_pointer_create((ID *)ob_from, &RNA_GameObjectSettings, ob_from, &obj_settings_ptr); + uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, 0); + }else + { + subrow= uiLayoutRow(row, 0); + uiLayoutSetActive(subrow, 0); + uiItemR(subrow, ptr, "object_property", 0, NULL, 0); + } + break; + } +} + +static void draw_actuator_random(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob; + PointerRNA settings_ptr; + uiLayout *row; + + ob = (Object *)ptr->id.data; + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + row = uiLayoutRow(layout, 0); + + uiItemR(row, ptr, "seed", 0, NULL, 0); + uiItemR(row, ptr, "distribution", 0, NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0); + + row = uiLayoutRow(layout, 0); + + switch (RNA_enum_get(ptr, "distribution")){ + case ACT_RANDOM_BOOL_CONST: + uiItemR(row, ptr, "always_true", UI_ITEM_R_TOGGLE, NULL, 0); + break; + + case ACT_RANDOM_BOOL_UNIFORM: + uiItemL(row, "Choose between true and false, 50% chance each", 0); + break; + + case ACT_RANDOM_BOOL_BERNOUILLI: + uiItemR(row, ptr, "chance", 0, NULL, 0); + break; + + case ACT_RANDOM_INT_CONST: + uiItemR(row, ptr, "int_value", 0, NULL, 0); + break; + + case ACT_RANDOM_INT_UNIFORM: + uiItemR(row, ptr, "int_min", 0, NULL, 0); + uiItemR(row, ptr, "int_max", 0, NULL, 0); + break; + + case ACT_RANDOM_INT_POISSON: + uiItemR(row, ptr, "int_mean", 0, NULL, 0); + break; + + case ACT_RANDOM_FLOAT_CONST: + uiItemR(row, ptr, "float_value", 0, NULL, 0); + break; + + case ACT_RANDOM_FLOAT_UNIFORM: + uiItemR(row, ptr, "float_min", 0, NULL, 0); + uiItemR(row, ptr, "float_max", 0, NULL, 0); + break; + + case ACT_RANDOM_FLOAT_NORMAL: + uiItemR(row, ptr, "float_mean", 0, NULL, 0); + uiItemR(row, ptr, "standard_derivation", 0, NULL, 0); + break; + + case ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL: + uiItemR(row, ptr, "half_life_time", 0, NULL, 0); + break; + } +} + +static void draw_actuator_scene(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "mode", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "mode")) { + case ACT_SCENE_CAMERA: + uiItemR(layout, ptr, "camera", 0, NULL, 0); + break; + case ACT_SCENE_RESTART: + break; + default: // ACT_SCENE_SET|ACT_SCENE_ADD_FRONT|ACT_SCENE_ADD_BACK|ACT_SCENE_REMOVE|ACT_SCENE_SUSPEND|ACT_SCENE_RESUME + uiItemR(layout, ptr, "scene", 0, NULL, 0); + break; + } +} + +static void draw_actuator_shape_action(uiLayout *layout, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->id.data; + PointerRNA settings_ptr; + uiLayout *row; + + if(ob->type != OB_MESH){ + uiItemL(layout, "Actuator only available for mesh objects", 0); + return; + } + + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "mode", 0, "", 0); + uiItemR(row, ptr, "action", 0, NULL, 0); + uiItemR(row, ptr, "continue_last_frame", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + if((RNA_enum_get(ptr, "mode") == ACT_ACTION_FROM_PROP)) + uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0); + + else { + uiItemR(row, ptr, "frame_start", 0, NULL, 0); + uiItemR(row, ptr, "frame_end", 0, NULL, 0); + } + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "blendin", 0, NULL, 0); + uiItemR(row, ptr, "priority", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, 0); + +#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR + uiItemR(row, "stride_length", 0, NULL, 0); +#endif +} + +static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + uiLayout *row, *col; + + uiTemplateID(layout, C, ptr, "sound", NULL, "SOUND_OT_open", NULL, NULL); + if (!RNA_pointer_get(ptr, "sound").data) + { + uiItemL(layout, "Select a sound from the list or load a new one", 0); + return; + } + uiItemR(layout, ptr, "mode", 0, NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "volume", 0, NULL, 0); + uiItemR(row, ptr, "pitch", 0, NULL, 0); + + uiItemR(layout, ptr, "enable_sound_3d", 0, NULL, 0); + + col = uiLayoutColumn(layout, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "enable_sound_3d")==1); + + row = uiLayoutRow(col, 0); + uiItemR(row, ptr, "minimum_gain_3d", 0, NULL, 0); + uiItemR(row, ptr, "maximum_gain_3d", 0, NULL, 0); + + row = uiLayoutRow(col, 0); + uiItemR(row, ptr, "reference_distance_3d", 0, NULL, 0); + uiItemR(row, ptr, "max_distance_3d", 0, NULL, 0); + + row = uiLayoutRow(col, 0); + uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, 0); + uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, 0); + + row = uiLayoutRow(col, 0); + uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, 0); + uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, 0); +} + +static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *split; + Object *ob = (Object *)ptr->id.data; + PointerRNA settings_ptr; + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + split = uiLayoutSplit(layout, 0.35, 0); + uiItemR(split, ptr, "operation", 0, NULL, 0); + + uiTemplateLayers(split, ptr, "state", &settings_ptr, "used_state", 0); +} + +static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + row = uiLayoutRow(layout, 0); + + uiItemR(row, ptr, "visible", 0, NULL, 0); + uiItemR(row, ptr, "occlusion", 0, NULL, 0); + uiItemR(row, ptr, "children", 0, NULL, 0); +} + +void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C) +{ + uiLayout *box; + + if (!RNA_boolean_get(ptr, "expanded")) + return; + + box = uiLayoutBox(layout); + + switch (RNA_enum_get(ptr, "type")) { + case ACT_ACTION: + draw_actuator_action(box, ptr); + break; + case ACT_ARMATURE: + draw_actuator_armature(box, ptr); + break; + case ACT_CAMERA: + draw_actuator_camera(box, ptr); + break; + case ACT_CONSTRAINT: + draw_actuator_constraint(box, ptr, C); + break; + case ACT_EDIT_OBJECT: + draw_actuator_edit_object(box, ptr); + break; + case ACT_2DFILTER: + draw_actuator_filter_2d(box, ptr); + break; + case ACT_GAME: + draw_actuator_game(box, ptr); + break; + case ACT_IPO: + draw_actuator_ipo(box, ptr); + break; + case ACT_MESSAGE: + draw_actuator_message(box, ptr, C); + break; + case ACT_OBJECT: + draw_actuator_motion(box, ptr); + break; + case ACT_PARENT: + draw_actuator_parent(box, ptr); + break; + case ACT_PROPERTY: + draw_actuator_property(box, ptr); + break; + case ACT_RANDOM: + draw_actuator_random(box, ptr); + break; + case ACT_SCENE: + draw_actuator_scene(box, ptr); + break; + case ACT_SHAPEACTION: + draw_actuator_shape_action(box, ptr); + break; + case ACT_SOUND: + draw_actuator_sound(box, ptr, C); + break; + case ACT_STATE: + draw_actuator_state(box, ptr); + break; + case ACT_VISIBILITY: + draw_actuator_visibility(box, ptr); + break; + } +} + +static void logic_buttons_new(bContext *C, ARegion *ar) +{ + SpaceLogic *slogic= CTX_wm_space_logic(C); + Object *ob= CTX_data_active_object(C); + Object *act_ob= ob; + ID **idar; + + PointerRNA logic_ptr, settings_ptr; + + uiLayout *layout, *row, *box; + uiBlock *block; + uiBut *but; + char name[32]; + short a, count; + int xco, yco, width; + + if(ob==NULL) return; + + RNA_pointer_create(NULL, &RNA_SpaceLogicEditor, slogic, &logic_ptr); + idar= get_selected_and_linked_obs(C, &count, slogic->scaflag); + + sprintf(name, "buttonswin %p", ar); + block= uiBeginBlock(C, ar, name, UI_EMBOSS); + uiBlockSetHandleFunc(block, do_logic_buts, NULL); + + /* loop over all objects and set visible/linked flags for the logic bricks */ + for(a=0; aactuators.first; + while(act) { + act->flag &= ~(ACT_LINKED|ACT_VISIBLE); + act = act->next; + } + /* same for sensors */ + sens= ob->sensors.first; + while(sens) { + sens->flag &= ~(SENS_VISIBLE); + sens = sens->next; + } + + /* mark the linked and visible actuators */ + cont= ob->controllers.first; + while(cont) { + flag = ACT_LINKED; + + /* this controller is visible, mark all its actuator */ + if ((ob->scaflag & OB_ALLSTATE) || (ob->state & cont->state_mask)) + flag |= ACT_VISIBLE; + + for (iact=0; iacttotlinks; iact++) { + act = cont->links[iact]; + if (act) + act->flag |= flag; + } + cont = cont->next; + } + } + + /* ****************** Controllers ****************** */ + + xco= 420; yco= 170; width= 300; + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, xco, yco, width, 20, U.uistyles.first); + row = uiLayoutRow(layout, 1); + + uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */ + + uiItemR(row, &logic_ptr, "controllers_show_selected_objects", 0, "Sel", 0); + uiItemR(row, &logic_ptr, "controllers_show_active_objects", 0, "Act", 0); + uiItemR(row, &logic_ptr, "controllers_show_linked_controller", 0, "Link", 0); + + for(a=0; ascavisflag & OB_VIS_CONT) == 0) continue; + + /* Drawing the Controller Header common to all Selected Objects */ + + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); + + split= uiLayoutSplit(layout, 0.05, 0); + uiItemR(split, &settings_ptr, "show_state_panel", UI_ITEM_R_NO_BG, "", ICON_DISCLOSURE_TRI_RIGHT); + + row = uiLayoutRow(split, 1); + uiDefButBitS(block, TOG, OB_SHOWCONT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide controllers"); + if (ob == act_ob) + uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", 0); + + if (RNA_boolean_get(&settings_ptr, "show_state_panel")) { + + box= uiLayoutBox(layout); + split= uiLayoutSplit(box, 0.2, 0); + + col= uiLayoutColumn(split, 0); + uiItemL(col, "Visible", 0); + uiItemL(col, "Initial", 0); + + subsplit= uiLayoutSplit(split, 0.85, 0); + col= uiLayoutColumn(subsplit, 0); + row= uiLayoutRow(col, 0); + uiLayoutSetActive(row, RNA_boolean_get(&settings_ptr, "all_states")==0); + uiTemplateLayers(row, &settings_ptr, "visible_state", &settings_ptr, "used_state", 0); + row= uiLayoutRow(col, 0); + uiTemplateLayers(row, &settings_ptr, "initial_state", &settings_ptr, "used_state", 0); + + col= uiLayoutColumn(subsplit, 0); + uiItemR(col, &settings_ptr, "all_states", UI_ITEM_R_TOGGLE, NULL, 0); + uiItemR(col, &settings_ptr, "debug_state", 0, "", 0); + } + + /* End of Drawing the Controller Header common to all Selected Objects */ + + if ((ob->scaflag & OB_SHOWCONT) == 0) continue; + + + uiItemS(layout); + + for(cont= ob->controllers.first; cont; cont=cont->next) { + RNA_pointer_create((ID *)ob, &RNA_Controller, cont, &ptr); + + if (!(ob->scaflag & OB_ALLSTATE) && !(ob->state & cont->state_mask)) + continue; + + /* use two nested splits to align inlinks/links properly */ + split = uiLayoutSplit(layout, 0.05, 0); + + /* put inlink button to the left */ + col = uiLayoutColumn(split, 0); + uiLayoutSetAlignment(col, UI_LAYOUT_ALIGN_LEFT); + uiDefIconBut(block, INLINK, 0, ICON_INLINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, cont, LINK_CONTROLLER, 0, 0, 0, ""); + + //col = uiLayoutColumn(split, 1); + /* nested split for middle and right columns */ + subsplit = uiLayoutSplit(split, 0.95, 0); + + col = uiLayoutColumn(subsplit, 1); + uiLayoutSetContextPointer(col, "controller", &ptr); + + /* should make UI template for controller header.. function will do for now */ +// draw_controller_header(col, &ptr); + draw_controller_header(col, &ptr, xco, width, yco); //provisory for 2.50 beta + + /* draw the brick contents */ + draw_brick_controller(col, &ptr); + + + /* put link button to the right */ + col = uiLayoutColumn(subsplit, 0); + uiLayoutSetAlignment(col, UI_LAYOUT_ALIGN_LEFT); + but= uiDefIconBut(block, LINK, 0, ICON_LINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + uiSetButLink(but, NULL, (void ***)&(cont->links), &cont->totlinks, LINK_CONTROLLER, LINK_ACTUATOR); + } + } + uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ + + + /* ****************** Sensors ****************** */ + + xco= 10; yco= 170; width= 340; + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, xco, yco, width, 20, U.uistyles.first); + row = uiLayoutRow(layout, 1); + + uiDefBlockBut(block, sensor_menu, NULL, "Sensors", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */ + + uiItemR(row, &logic_ptr, "sensors_show_selected_objects", 0, "Sel", 0); + uiItemR(row, &logic_ptr, "sensors_show_active_objects", 0, "Act", 0); + uiItemR(row, &logic_ptr, "sensors_show_linked_controller", 0, "Link", 0); + uiItemR(row, &logic_ptr, "sensors_show_active_states", 0, "State", 0); + + for(a=0; ascavisflag & OB_VIS_SENS) == 0) continue; + + row = uiLayoutRow(layout, 1); + uiDefButBitS(block, TOG, OB_SHOWSENS, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide sensors"); + if (ob == act_ob) + uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", 0); + + if ((ob->scaflag & OB_SHOWSENS) == 0) continue; + + uiItemS(layout); + + for(sens= ob->sensors.first; sens; sens=sens->next) { + RNA_pointer_create((ID *)ob, &RNA_Sensor, sens, &ptr); + + if ((ob->scaflag & OB_ALLSTATE) || + !(slogic->scaflag & BUTS_SENS_STATE) || + (sens->totlinks == 0) || /* always display sensor without links so that is can be edited */ + (sens->flag & SENS_PIN && slogic->scaflag & BUTS_SENS_STATE) || /* states can hide some sensors, pinned sensors ignore the visible state */ + (is_sensor_linked(block, sens)) + ) + { // gotta check if the current state is visible or not + uiLayout *split, *col; + + /* make as visible, for move operator */ + sens->flag |= SENS_VISIBLE; + + split = uiLayoutSplit(layout, 0.95, 0); + col = uiLayoutColumn(split, 1); + uiLayoutSetContextPointer(col, "sensor", &ptr); + + /* should make UI template for sensor header.. function will do for now */ + draw_sensor_header(col, &ptr, &logic_ptr); + + /* draw the brick contents */ + draw_brick_sensor(col, &ptr, C); + + /* put link button to the right */ + col = uiLayoutColumn(split, 0); + /* use oldskool uiButtons for links for now */ + but= uiDefIconBut(block, LINK, 0, ICON_LINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + uiSetButLink(but, NULL, (void ***)&(sens->links), &sens->totlinks, LINK_SENSOR, LINK_CONTROLLER); + } + } + } + uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ + + /* ****************** Actuators ****************** */ + + xco= 800; yco= 170; width= 340; + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, xco, yco, width, 20, U.uistyles.first); + row = uiLayoutRow(layout, 1); + + uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */ + + uiItemR(row, &logic_ptr, "actuators_show_selected_objects", 0, "Sel", 0); + uiItemR(row, &logic_ptr, "actuators_show_active_objects", 0, "Act", 0); + uiItemR(row, &logic_ptr, "actuators_show_linked_controller", 0, "Link", 0); + uiItemR(row, &logic_ptr, "actuators_show_active_states", 0, "State", 0); + + for(a=0; ascavisflag & OB_VIS_ACT) == 0) continue; + + row = uiLayoutRow(layout, 1); + uiDefButBitS(block, TOG, OB_SHOWACT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide actuators"); + if (ob == act_ob) + uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", 0); + + if ((ob->scaflag & OB_SHOWACT) == 0) continue; + + uiItemS(layout); + + for(act= ob->actuators.first; act; act=act->next) { + + RNA_pointer_create((ID *)ob, &RNA_Actuator, act, &ptr); + + if ((ob->scaflag & OB_ALLSTATE) || + !(slogic->scaflag & BUTS_ACT_STATE) || + !(act->flag & ACT_LINKED) || /* always display actuators without links so that is can be edited */ + (act->flag & ACT_VISIBLE) || /* this actuator has visible connection, display it */ + (act->flag & ACT_PIN && slogic->scaflag & BUTS_ACT_STATE) /* states can hide some sensors, pinned sensors ignore the visible state */ + ) + { // gotta check if the current state is visible or not + uiLayout *split, *col; + + /* make as visible, for move operator */ + act->flag |= ACT_VISIBLE; + + split = uiLayoutSplit(layout, 0.05, 0); + + /* put inlink button to the left */ + col = uiLayoutColumn(split, 0); + uiDefIconBut(block, INLINK, 0, ICON_INLINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, act, LINK_ACTUATOR, 0, 0, 0, ""); + + col = uiLayoutColumn(split, 1); + uiLayoutSetContextPointer(col, "actuator", &ptr); + + /* should make UI template for actuator header.. function will do for now */ + draw_actuator_header(col, &ptr, &logic_ptr); + + /* draw the brick contents */ + draw_brick_actuator(col, &ptr, C); + + } + } + } + uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ + + + uiComposeLinks(block); + + uiEndBlock(C, block); + uiDrawBlock(C, block); + + if(idar) MEM_freeN(idar); +} void logic_buttons(bContext *C, ARegion *ar) { @@ -3188,13 +4723,20 @@ void logic_buttons(bContext *C, ARegion *ar) bActuator *act; uiBlock *block; uiBut *but; + PointerRNA logic_ptr; int a, iact, stbit, offset; - short xco, yco, count, width, ycoo; + int xco, yco, width, ycoo; + short count; char name[32]; /* pin is a bool used for actuator and sensor drawing with states * pin so changing states dosnt hide the logic brick */ char pin; + if (G.rt == 0) { + logic_buttons_new(C, ar); + return; + } + if(ob==NULL) return; // uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE); @@ -3202,6 +4744,8 @@ void logic_buttons(bContext *C, ARegion *ar) block= uiBeginBlock(C, ar, name, UI_EMBOSS); uiBlockSetHandleFunc(block, do_logic_buts, NULL); + RNA_pointer_create(NULL, &RNA_SpaceLogicEditor, slogic, &logic_ptr); + idar= get_selected_and_linked_obs(C, &count, slogic->scaflag); /* clean ACT_LINKED and ACT_VISIBLE of all potentially visible actuators so that @@ -3285,7 +4829,7 @@ void logic_buttons(bContext *C, ARegion *ar) } } uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, OB_SETSTBIT, B_SET_STATE_BIT, "All",(short)(xco+226), yco-10, 22, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Set all state bits"); + uiDefButBitS(block, TOG, OB_ALLSTATE, B_SET_STATE_BIT, "All",(short)(xco+226), yco-10, 22, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Set all state bits"); uiDefButBitS(block, TOG, OB_INITSTBIT, B_INIT_STATE_BIT, "Ini",(short)(xco+248), yco-10, 22, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Set the initial state"); uiDefButBitS(block, TOG, OB_DEBUGSTATE, 0, "D",(short)(xco+270), yco-10, 15, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Print state debug info"); uiBlockEndAlign(block); @@ -3332,15 +4876,15 @@ void logic_buttons(bContext *C, ARegion *ar) cpack(0x999999); glRecti(xco+22, yco, xco+width-22,yco+19); but= uiDefBut(block, LABEL, 0, controller_name(cont->type), (short)(xco+22), yco, 70, UI_UNIT_Y, cont, 0, 0, 0, 0, "Controller type"); - //uiButSetFunc(but, sca_move_controller, cont, NULL); + //uiButSetFunc(but, old_sca_move_controller, cont, NULL); but= uiDefBut(block, LABEL, 0, cont->name,(short)(xco+92), yco,(short)(width-158), UI_UNIT_Y, cont, 0, 0, 0, 0, "Controller name"); - //uiButSetFunc(but, sca_move_controller, cont, NULL); + //uiButSetFunc(but, old_sca_move_controller, cont, NULL); uiBlockBeginAlign(block); but= uiDefIconBut(block, BUT, B_REDR, ICON_TRIA_UP, (short)(xco+width-(110+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick up"); - uiButSetFunc(but, sca_move_controller, cont, (void *)TRUE); + uiButSetFunc(but, old_sca_move_controller, cont, (void *)TRUE); but= uiDefIconBut(block, BUT, B_REDR, ICON_TRIA_DOWN, (short)(xco+width-(88+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick down"); - uiButSetFunc(but, sca_move_controller, cont, (void *)FALSE); + uiButSetFunc(but, old_sca_move_controller, cont, (void *)FALSE); uiBlockEndAlign(block); ycoo= yco; @@ -3361,7 +4905,7 @@ void logic_buttons(bContext *C, ARegion *ar) yco-= 6; } } - + /* ******************************* */ xco= 10; yco= 170; width= 300; @@ -3424,15 +4968,15 @@ void logic_buttons(bContext *C, ARegion *ar) set_col_sensor(sens->type, 1); glRecti(xco+22, yco, xco+width-22,yco+19); but= uiDefBut(block, LABEL, 0, sensor_name(sens->type), (short)(xco+22), yco, 80, UI_UNIT_Y, sens, 0, 0, 0, 0, ""); - //uiButSetFunc(but, sca_move_sensor, sens, NULL); + //uiButSetFunc(but, old_sca_move_sensor, sens, NULL); but= uiDefBut(block, LABEL, 0, sens->name, (short)(xco+102), yco, (short)(width-(pin?146:124)), UI_UNIT_Y, sens, 0, 31, 0, 0, ""); - //uiButSetFunc(but, sca_move_sensor, sens, NULL); + //uiButSetFunc(but, old_sca_move_sensor, sens, NULL); uiBlockBeginAlign(block); but= uiDefIconBut(block, BUT, B_REDR, ICON_TRIA_UP, (short)(xco+width-(66+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick up"); - uiButSetFunc(but, sca_move_sensor, sens, (void *)TRUE); + uiButSetFunc(but, old_sca_move_sensor, sens, (void *)TRUE); but= uiDefIconBut(block, BUT, B_REDR, ICON_TRIA_DOWN, (short)(xco+width-(44+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick down"); - uiButSetFunc(but, sca_move_sensor, sens, (void *)FALSE); + uiButSetFunc(but, old_sca_move_sensor, sens, (void *)FALSE); uiBlockEndAlign(block); } @@ -3446,10 +4990,8 @@ void logic_buttons(bContext *C, ARegion *ar) yco-= 6; } } - /* ******************************* */ xco= 800; yco= 170; width= 300; - uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco+35, 90, UI_UNIT_Y, ""); uiBlockBeginAlign(block); @@ -3504,15 +5046,15 @@ void logic_buttons(bContext *C, ARegion *ar) set_col_actuator(act->type, 1); glRecti((short)(xco+22), yco, (short)(xco+width-22),(short)(yco+19)); but= uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 90, UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator type"); - // uiButSetFunc(but, sca_move_actuator, act, NULL); + // uiButSetFunc(but, old_sca_move_actuator, act, NULL); but= uiDefBut(block, LABEL, 0, act->name, (short)(xco+112), yco, (short)(width-(pin?156:134)), UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator name"); - // uiButSetFunc(but, sca_move_actuator, act, NULL); + // uiButSetFunc(but, old_sca_move_actuator, act, NULL); uiBlockBeginAlign(block); but= uiDefIconBut(block, BUT, B_REDR, ICON_TRIA_UP, (short)(xco+width-(66+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick up"); - uiButSetFunc(but, sca_move_actuator, act, (void *)TRUE); + uiButSetFunc(but, old_sca_move_actuator, act, (void *)TRUE); but= uiDefIconBut(block, BUT, B_REDR, ICON_TRIA_DOWN, (short)(xco+width-(44+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick down"); - uiButSetFunc(but, sca_move_actuator, act, (void *)FALSE); + uiButSetFunc(but, old_sca_move_actuator, act, (void *)FALSE); uiBlockEndAlign(block); ycoo= yco; diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c index ab37cad2bd8..ed3d956ce01 100644 --- a/source/blender/editors/space_logic/space_logic.c +++ b/source/blender/editors/space_logic/space_logic.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,13 +29,6 @@ #include #include -#include "DNA_image_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -46,18 +39,15 @@ #include "BKE_screen.h" #include "BKE_utildefines.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" #include "BIF_glutil.h" -#include "RNA_access.h" #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -192,6 +182,7 @@ void logic_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "LOGIC_OT_properties", NKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "LOGIC_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_menu(keymap, "LOGIC_MT_logicbricks_add", AKEY, KM_PRESS, KM_SHIFT, 0); } static void logic_refresh(const bContext *C, ScrArea *sa) @@ -205,6 +196,9 @@ static void logic_listener(ARegion *ar, wmNotifier *wmn) { /* context changes */ switch(wmn->category) { + case NC_LOGIC: + ED_region_tag_redraw(ar); + break; case NC_SCENE: switch(wmn->data) { case ND_FRAME: @@ -254,11 +248,9 @@ static void logic_main_area_draw(const bContext *C, ARegion *ar) // SpaceLogic *slogic= CTX_wm_space_logic(C); View2D *v2d= &ar->v2d; View2DScrollers *scrollers; - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); @@ -304,15 +296,8 @@ static void logic_header_area_init(wmWindowManager *wm, ARegion *ar) static void logic_header_area_draw(const bContext *C, ARegion *ar) { - float col[3]; - /* clear */ - if(ED_screen_area_active(C)) - UI_GetThemeColor3fv(TH_HEADER, col); - else - UI_GetThemeColor3fv(TH_HEADERDESEL, col); - - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(ED_screen_area_active(C)?TH_HEADER:TH_HEADERDESEL); glClear(GL_COLOR_BUFFER_BIT); /* set view2d view matrix for scrolling (without scrollers) */ diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt new file mode 100644 index 00000000000..be8020b0793 --- /dev/null +++ b/source/blender/editors/space_nla/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_nla "${SRC}" "${INC}") diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index 4f944d1b855..81d4e8b6b01 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,12 +32,6 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -66,17 +60,12 @@ #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" #include "ED_anim_api.h" -#include "ED_keyframing.h" #include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "nla_intern.h" // own include @@ -248,19 +237,19 @@ static void nla_panel_animdata (const bContext *C, Panel *pa) /* Active Action Properties ------------------------------------- */ /* action */ row= uiLayoutRow(layout, 1); - uiTemplateID(row, (bContext *)C, &adt_ptr, "action", "ACTION_OT_new", NULL, NULL /*"ACTION_OT_unlink"*/); // XXX: need to make these operators + uiTemplateID(row, (bContext *)C, &adt_ptr, "action", "ACTION_OT_new", NULL, NULL /*"ACTION_OT_unlink"*/, NULL); // XXX: need to make these operators /* extrapolation */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, 0, &adt_ptr, "action_extrapolation", 0); + uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, 0); /* blending */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, 0, &adt_ptr, "action_blending", 0); + uiItemR(row, &adt_ptr, "action_blending", 0, NULL, 0); /* influence */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, 0, &adt_ptr, "action_influence", 0); + uiItemR(row, &adt_ptr, "action_influence", 0, NULL, 0); } /* active NLA-Track */ @@ -280,7 +269,7 @@ static void nla_panel_track (const bContext *C, Panel *pa) /* Info - Active NLA-Context:Track ---------------------- */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, ICON_NLA, &nlt_ptr, "name", 0); + uiItemR(row, &nlt_ptr, "name", 0, NULL, ICON_NLA); } /* generic settings for active NLA-Strip */ @@ -300,41 +289,41 @@ static void nla_panel_properties(const bContext *C, Panel *pa) /* Strip Properties ------------------------------------- */ /* strip type */ row= uiLayoutColumn(layout, 1); - uiItemR(row, NULL, ICON_NLA, &strip_ptr, "name", 0); // XXX icon? - uiItemR(row, NULL, 0, &strip_ptr, "type", 0); + uiItemR(row, &strip_ptr, "name", 0, NULL, ICON_NLA); // XXX icon? + uiItemR(row, &strip_ptr, "type", 0, NULL, 0); /* strip extents */ column= uiLayoutColumn(layout, 1); uiItemL(column, "Strip Extents:", 0); - uiItemR(column, NULL, 0, &strip_ptr, "start_frame", 0); - uiItemR(column, NULL, 0, &strip_ptr, "end_frame", 0); + uiItemR(column, &strip_ptr, "frame_start", 0, NULL, 0); + uiItemR(column, &strip_ptr, "frame_end", 0, NULL, 0); /* extrapolation */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, 0, &strip_ptr, "extrapolation", 0); + uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, 0); /* blending */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, 0, &strip_ptr, "blending", 0); + uiItemR(row, &strip_ptr, "blending", 0, NULL, 0); /* blend in/out + autoblending * - blend in/out can only be set when autoblending is off */ column= uiLayoutColumn(layout, 1); uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "animated_influence")==0); - uiItemR(column, NULL, 0, &strip_ptr, "auto_blending", 0); // XXX as toggle? + uiItemR(column, &strip_ptr, "auto_blending", 0, NULL, 0); // XXX as toggle? subcol= uiLayoutColumn(column, 1); uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "auto_blending")==0); - uiItemR(subcol, NULL, 0, &strip_ptr, "blend_in", 0); - uiItemR(subcol, NULL, 0, &strip_ptr, "blend_out", 0); + uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, 0); + uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, 0); /* settings */ column= uiLayoutColumn(layout, 1); uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "animated_influence") || RNA_boolean_get(&strip_ptr, "animated_time"))); uiItemL(column, "Playback Settings:", 0); - uiItemR(column, NULL, 0, &strip_ptr, "muted", 0); - uiItemR(column, NULL, 0, &strip_ptr, "reversed", 0); + uiItemR(column, &strip_ptr, "muted", 0, NULL, 0); + uiItemR(column, &strip_ptr, "reversed", 0, NULL, 0); } @@ -356,22 +345,22 @@ static void nla_panel_actclip(const bContext *C, Panel *pa) /* Strip Properties ------------------------------------- */ /* action pointer */ row= uiLayoutRow(layout, 1); - uiItemR(row, NULL, ICON_ACTION, &strip_ptr, "action", 0); + uiItemR(row, &strip_ptr, "action", 0, NULL, ICON_ACTION); /* action extents */ // XXX custom names were used here (to avoid the prefixes)... probably not necessary in future? column= uiLayoutColumn(layout, 1); uiItemL(column, "Action Extents:", 0); - uiItemR(column, "Start Frame", 0, &strip_ptr, "action_start_frame", 0); - uiItemR(column, "End Frame", 0, &strip_ptr, "action_end_frame", 0); + uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", 0); + uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", 0); uiItemO(column, NULL, 0, "NLA_OT_action_sync_length"); /* action usage */ column= uiLayoutColumn(layout, 1); uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "animated_time")==0); uiItemL(column, "Playback Settings:", 0); - uiItemR(column, NULL, 0, &strip_ptr, "scale", 0); - uiItemR(column, NULL, 0, &strip_ptr, "repeat", 0); + uiItemR(column, &strip_ptr, "scale", 0, NULL, 0); + uiItemR(column, &strip_ptr, "repeat", 0, NULL, 0); } /* evaluation settings for active NLA-Strip */ @@ -379,7 +368,7 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa) { PointerRNA strip_ptr; uiLayout *layout= pa->layout; - uiLayout *column, *subcolumn; + uiLayout *column, *subcolumn, *subrow; uiBlock *block; /* check context and also validity of pointer */ @@ -390,19 +379,22 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa) uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL); column= uiLayoutColumn(layout, 1); - uiItemR(column, NULL, 0, &strip_ptr, "animated_influence", 0); + uiItemR(column, &strip_ptr, "animated_influence", 0, NULL, 0); subcolumn= uiLayoutColumn(column, 1); uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "animated_influence")); - uiItemR(subcolumn, NULL, 0, &strip_ptr, "influence", 0); + uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, 0); column= uiLayoutColumn(layout, 1); - uiItemR(column, NULL, 0, &strip_ptr, "animated_time", 0); - + subrow= uiLayoutRow(column, 0); + uiItemR(subrow, &strip_ptr, "animated_time", 0, NULL, 0); + uiItemR(subrow, &strip_ptr, "animated_time_cyclic", 0, NULL, 0); + subcolumn= uiLayoutColumn(column, 1); - uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "animated_time")); - uiItemR(subcolumn, NULL, 0, &strip_ptr, "strip_time", 0); + subrow= uiLayoutRow(subcolumn, 0); + uiLayoutSetEnabled(subrow, RNA_boolean_get(&strip_ptr, "animated_time")); + uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, 0); } /* F-Modifiers for active NLA-Strip */ @@ -430,6 +422,11 @@ static void nla_panel_modifiers(const bContext *C, Panel *pa) // XXX for now, this will be a operator button which calls a temporary 'add modifier' operator // FIXME: we need to set the only-active property so that this will only add modifiers for the active strip (not all selected) uiDefButO(block, BUT, "NLA_OT_fmodifier_add", WM_OP_INVOKE_REGION_WIN, "Add Modifier", 10, 0, 150, 20, "Adds a new F-Modifier for the active NLA Strip"); + + /* copy/paste (as sub-row)*/ + row= uiLayoutRow(row, 1); + uiItemO(row, "", ICON_COPYDOWN, "NLA_OT_fmodifier_copy"); + uiItemO(row, "", ICON_PASTEDOWN, "NLA_OT_fmodifier_paste"); } /* draw each modifier */ diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c index 9708e12e738..cf98decb825 100644 --- a/source/blender/editors/space_nla/nla_channels.c +++ b/source/blender/editors/space_nla/nla_channels.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,24 +31,9 @@ #include #include -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" #include "DNA_object_types.h" -#include "DNA_particle_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_meta_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -65,8 +50,6 @@ #include "ED_anim_api.h" #include "ED_keyframes_edit.h" -#include "ED_markers.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "RNA_access.h" @@ -75,9 +58,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" -#include "UI_interface_icons.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "nla_intern.h" // own include @@ -136,7 +116,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho if (adt) adt->flag |= ADT_UI_SELECTED; } - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; case ANIMTYPE_OBJECT: @@ -177,7 +157,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho adt->flag |= ADT_UI_ACTIVE; /* notifiers - channel was selected */ - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } } break; @@ -214,7 +194,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho ale->adt->flag |= ADT_UI_ACTIVE; } - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } break; @@ -240,21 +220,21 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho nlt->flag ^= NLATRACK_PROTECTED; /* notifier flags - channel was edited */ - notifierFlags |= ND_ANIMCHAN_EDIT; + notifierFlags |= (ND_ANIMCHAN|NA_EDITED); } else if (x >= (v2d->cur.xmax-2*NLACHANNEL_BUTTON_WIDTH)) { /* toggle mute */ nlt->flag ^= NLATRACK_MUTED; /* notifier flags - channel was edited */ - notifierFlags |= ND_ANIMCHAN_EDIT; + notifierFlags |= (ND_ANIMCHAN|NA_EDITED); } else if (x <= ((NLACHANNEL_BUTTON_WIDTH*2)+offset)) { /* toggle 'solo' */ BKE_nlatrack_solo_toggle(adt, nlt); /* notifier flags - channel was edited */ - notifierFlags |= ND_ANIMCHAN_EDIT; + notifierFlags |= (ND_ANIMCHAN|NA_EDITED); } else if (nlaedit_is_tweakmode_on(ac) == 0) { /* set selection */ @@ -273,7 +253,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nlt, ANIMTYPE_NLATRACK); /* notifier flags - channel was selected */ - notifierFlags |= ND_ANIMCHAN_SELECT; + notifierFlags |= (ND_ANIMCHAN|NA_SELECTED); } } break; @@ -426,7 +406,7 @@ static int nlaedit_add_tracks_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -482,7 +462,7 @@ static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c index 3a9d668e7f8..2314b5ddcfa 100644 --- a/source/blender/editors/space_nla/nla_draw.c +++ b/source/blender/editors/space_nla/nla_draw.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,26 +32,10 @@ #include #include -#include "DNA_listBase.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_object_types.h" #include "DNA_screen_types.h" -#include "DNA_scene_types.h" #include "DNA_space_types.h" -#include "DNA_constraint_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_material_types.h" -#include "DNA_meta_types.h" -#include "DNA_particle_types.h" -#include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" -#include "DNA_world_types.h" -#include "DNA_vec_types.h" #include "MEM_guardedalloc.h" @@ -69,13 +53,10 @@ #include "ED_anim_api.h" #include "ED_keyframes_draw.h" -#include "ED_space_api.h" -#include "ED_screen.h" #include "BIF_gl.h" #include "BIF_glutil.h" -#include "WM_api.h" #include "WM_types.h" #include "UI_interface.h" @@ -83,7 +64,6 @@ #include "UI_resources.h" #include "UI_view2d.h" -#include "ED_markers.h" #include "nla_intern.h" // own include @@ -810,7 +790,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie fdrawline((float)(v2d->cur.xmax-offset), yminc, (float)(v2d->cur.xmax-offset), ymaxc); - offset += 16;; + offset += 16; /* 'tweaking action' indicator - not a button */ UI_icon_draw((float)(v2d->cur.xmax-offset), ydatac, ICON_EDIT); @@ -825,7 +805,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie glEnd(); // GL_LINES /* 'push down' icon for normal active-actions */ - UI_icon_draw((float)NLACHANNEL_NAMEWIDTH-offset, ydatac, ICON_FREEZE); + UI_icon_draw((float)v2d->cur.xmax-offset, ydatac, ICON_FREEZE); } } diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 543fa1dfed7..38c6ecdca22 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,13 +31,7 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -59,7 +53,6 @@ #include "ED_anim_api.h" #include "ED_keyframes_edit.h" #include "ED_markers.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_transform.h" @@ -71,8 +64,6 @@ #include "WM_types.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "nla_intern.h" // own include #include "nla_private.h" // FIXME... maybe this shouldn't be included? @@ -269,7 +260,7 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op) cfra= (float)CFRA; /* get action to use */ - act= BLI_findlink(&CTX_data_main(C)->action, RNA_enum_get(op->ptr, "type")); + act= BLI_findlink(&CTX_data_main(C)->action, RNA_enum_get(op->ptr, "action")); if (act == NULL) { BKE_report(op->reports, RPT_ERROR, "No valid Action to add."); @@ -320,7 +311,7 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -345,7 +336,7 @@ void NLA_OT_actionclip_add (wmOperatorType *ot) /* props */ // TODO: this would be nicer as an ID-pointer... - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", ""); + prop= RNA_def_enum(ot->srna, "action", DummyRNA_NULL_items, 0, "Action", ""); RNA_def_enum_funcs(prop, RNA_action_itemf); ot->prop= prop; } @@ -439,7 +430,7 @@ static int nlaedit_add_transition_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -506,7 +497,7 @@ static int nlaedit_add_meta_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -558,7 +549,7 @@ static int nlaedit_remove_meta_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -648,7 +639,7 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -736,7 +727,7 @@ static int nlaedit_delete_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -881,7 +872,7 @@ static int nlaedit_split_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -912,6 +903,7 @@ static int nlaedit_bake_exec (bContext *C, wmOperator *op) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; +// int flag = 0; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -923,7 +915,7 @@ static int nlaedit_bake_exec (bContext *C, wmOperator *op) /* for each AnimData block, bake strips to animdata... */ for (ale= anim_data.first; ale; ale= ale->next) { - // FIXME + //BKE_nla_bake(ac.scene, ale->id, ale->data, flag); } /* free temp data */ @@ -933,7 +925,7 @@ static int nlaedit_bake_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -995,7 +987,7 @@ static int nlaedit_toggle_mute_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1069,7 +1061,7 @@ static int nlaedit_move_up_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1143,7 +1135,7 @@ static int nlaedit_move_down_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1219,7 +1211,7 @@ static int nlaedit_sync_actlen_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1247,10 +1239,10 @@ void NLA_OT_action_sync_length (wmOperatorType *ot) /* Reset the scaling of the selected strips to 1.0f */ /* apply scaling to keyframe */ -static short bezt_apply_nlamapping (BeztEditData *bed, BezTriple *bezt) +static short bezt_apply_nlamapping (KeyframeEditData *ked, BezTriple *bezt) { - /* NLA-strip which has this scaling is stored in bed->data */ - NlaStrip *strip= (NlaStrip *)bed->data; + /* NLA-strip which has this scaling is stored in ked->data */ + NlaStrip *strip= (NlaStrip *)ked->data; /* adjust all the times */ bezt->vec[0][0]= nlastrip_get_frame(strip, bezt->vec[0][0], NLATIME_CONVERT_MAP); @@ -1269,7 +1261,7 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op) bAnimListElem *ale; int filter; - BeztEditData bed; + KeyframeEditData ked; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -1280,7 +1272,7 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op) ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* init the editing data */ - memset(&bed, 0, sizeof(BeztEditData)); + memset(&ked, 0, sizeof(KeyframeEditData)); /* for each NLA-Track, apply scale of all selected strips */ for (ale= anim_data.first; ale; ale= ale->next) { @@ -1303,8 +1295,8 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op) } /* setup iterator, and iterate over all the keyframes in the action, applying this scaling */ - bed.data= strip; - ANIM_animchanneldata_keys_bezier_loop(&bed, strip->act, ALE_ACT, NULL, bezt_apply_nlamapping, calchandles_fcurve, 0); + ked.data= strip; + ANIM_animchanneldata_keyframes_loop(&ked, strip->act, ALE_ACT, NULL, bezt_apply_nlamapping, calchandles_fcurve, 0); /* clear scale of strip now that it has been applied, * and recalculate the extents of the action now that it has been scaled @@ -1320,7 +1312,7 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1383,7 +1375,7 @@ static int nlaedit_clear_scale_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1524,7 +1516,7 @@ static int nlaedit_snap_exec (bContext *C, wmOperator *op) ED_nla_postop_refresh(&ac); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1575,7 +1567,7 @@ static int nla_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *event continue; /* add entry to add this type of modifier */ - uiItemEnumO(layout, fmi->name, 0, "NLA_OT_fmodifier_add", "type", i); + uiItemEnumO(layout, "NLA_OT_fmodifier_add", fmi->name, 0, "type", i); } uiItemS(layout); @@ -1608,12 +1600,19 @@ static int nla_fmodifier_add_exec(bContext *C, wmOperator *op) for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; NlaStrip *strip; - int i = 1; - for (strip= nlt->strips.first; strip; strip=strip->next, i++) { - /* only add F-Modifier if on active strip? */ - if ((onlyActive) && (strip->flag & NLASTRIP_FLAG_ACTIVE)==0) - continue; + for (strip= nlt->strips.first; strip; strip=strip->next) { + /* can F-Modifier be added to the current strip? */ + if (onlyActive) { + /* if not active, cannot add since we're only adding to active strip */ + if ((strip->flag & NLASTRIP_FLAG_ACTIVE)==0) + continue; + } + else { + /* strip must be selected, since we're not just doing active */ + if ((strip->flag & NLASTRIP_FLAG_SELECT)==0) + continue; + } /* add F-Modifier of specified type to selected, and make it the active one */ fcm= add_fmodifier(&strip->modifiers, type); @@ -1621,10 +1620,9 @@ static int nla_fmodifier_add_exec(bContext *C, wmOperator *op) if (fcm) set_active_fmodifier(&strip->modifiers, fcm); else { - char errormsg[128]; - sprintf(errormsg, "Modifier couldn't be added to (%s : %d). See console for details.", nlt->name, i); - - BKE_report(op->reports, RPT_ERROR, errormsg); + BKE_reportf(op->reports, RPT_ERROR, + "Modifier couldn't be added to (%s : %s). See console for details.", + nlt->name, strip->name); } } } @@ -1633,8 +1631,7 @@ static int nla_fmodifier_add_exec(bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* set notifier that things have changed */ - // FIXME: this doesn't really do it justice... - WM_event_add_notifier(C, NC_ANIMATION, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); /* done */ return OPERATOR_FINISHED; @@ -1659,4 +1656,125 @@ void NLA_OT_fmodifier_add (wmOperatorType *ot) RNA_def_boolean(ot->srna, "only_active", 0, "Only Active", "Only add F-Modifier of the specified type to the active strip."); } +/* ******************** Copy F-Modifiers Operator *********************** */ + +static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter, ok=0; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* clear buffer first */ + free_fmodifiers_copybuf(); + + /* get a list of the editable tracks being shown in the NLA */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_FOREDIT); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + /* for each NLA-Track, add the specified modifier to all selected strips */ + for (ale= anim_data.first; ale; ale= ale->next) { + NlaTrack *nlt= (NlaTrack *)ale->data; + NlaStrip *strip; + + for (strip= nlt->strips.first; strip; strip=strip->next) { + /* only add F-Modifier if on active strip? */ + if ((strip->flag & NLASTRIP_FLAG_ACTIVE)==0) + continue; + + // TODO: when 'active' vs 'all' boolean is added, change last param! + ok += ANIM_fmodifiers_copy_to_buf(&strip->modifiers, 0); + } + } + + /* successful or not? */ + if (ok == 0) { + BKE_report(op->reports, RPT_ERROR, "No F-Modifiers available to be copied"); + return OPERATOR_CANCELLED; + } + else + return OPERATOR_FINISHED; +} + +void NLA_OT_fmodifier_copy (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy F-Modifiers"; + ot->idname= "NLA_OT_fmodifier_copy"; + ot->description= "Copy the F-Modifier(s) of the active NLA-Strip."; + + /* api callbacks */ + ot->exec= nla_fmodifier_copy_exec; + ot->poll= nlaop_poll_tweakmode_off; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* id-props */ + //ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All F-Modifiers", "Copy all the F-Modifiers, instead of just the active one"); +} + +/* ******************** Paste F-Modifiers Operator *********************** */ + +static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter, ok=0; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* get a list of the editable tracks being shown in the NLA */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_SEL | ANIMFILTER_FOREDIT); + ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); + + /* for each NLA-Track, add the specified modifier to all selected strips */ + for (ale= anim_data.first; ale; ale= ale->next) { + NlaTrack *nlt= (NlaTrack *)ale->data; + NlaStrip *strip; + + for (strip= nlt->strips.first; strip; strip=strip->next) { + // TODO: do we want to replace existing modifiers? add user pref for that! + ok += ANIM_fmodifiers_paste_from_buf(&strip->modifiers, 0); + } + } + + /* clean up */ + BLI_freelistN(&anim_data); + + /* successful or not? */ + if (ok) { + /* set notifier that things have changed */ + /* set notifier that things have changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "No F-Modifiers to paste"); + return OPERATOR_CANCELLED; + } +} + +void NLA_OT_fmodifier_paste (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Paste F-Modifiers"; + ot->idname= "NLA_OT_fmodifier_paste"; + ot->description= "Add copied F-Modifiers to the selected NLA-Strips"; + + /* api callbacks */ + ot->exec= nla_fmodifier_paste_exec; + ot->poll= nlaop_poll_tweakmode_off; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /* *********************************************** */ diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h index 1af2d2a1635..7570969158b 100644 --- a/source/blender/editors/space_nla/nla_intern.h +++ b/source/blender/editors/space_nla/nla_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -111,6 +111,8 @@ void NLA_OT_clear_scale(wmOperatorType *ot); void NLA_OT_snap(wmOperatorType *ot); void NLA_OT_fmodifier_add(wmOperatorType *ot); +void NLA_OT_fmodifier_copy(wmOperatorType *ot); +void NLA_OT_fmodifier_paste(wmOperatorType *ot); /* **************************************** */ diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c index 10ff10f46fd..dfb50ee33e5 100644 --- a/source/blender/editors/space_nla/nla_ops.c +++ b/source/blender/editors/space_nla/nla_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,14 +29,7 @@ #include #include -#include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -51,7 +44,6 @@ #include "BKE_screen.h" #include "ED_anim_api.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_transform.h" @@ -60,9 +52,6 @@ #include "RNA_access.h" -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "nla_intern.h" // own include @@ -165,6 +154,8 @@ void nla_operatortypes(void) WM_operatortype_append(NLA_OT_snap); WM_operatortype_append(NLA_OT_fmodifier_add); + WM_operatortype_append(NLA_OT_fmodifier_copy); + WM_operatortype_append(NLA_OT_fmodifier_paste); } /* ************************** registration - keymaps **********************************/ @@ -186,6 +177,7 @@ static void nla_keymap_channels (wmKeyConfig *keyconf, wmKeyMap *keymap) /* delete tracks */ WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", BACKSPACEKEY, KM_PRESS, 0, 0); /* General Animation Channels keymap (see anim_channels.c) ----------------------- */ /* selection */ @@ -255,6 +247,7 @@ static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap) /* delete */ WM_keymap_add_item(keymap, "NLA_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NLA_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NLA_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); /* split */ WM_keymap_add_item(keymap, "NLA_OT_split", YKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c index 7729573070d..55463580115 100644 --- a/source/blender/editors/space_nla/nla_select.c +++ b/source/blender/editors/space_nla/nla_select.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,13 +30,7 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -52,8 +46,6 @@ #include "ED_anim_api.h" #include "ED_keyframes_edit.h" -#include "ED_markers.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "RNA_access.h" @@ -62,8 +54,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "nla_intern.h" // own include @@ -80,7 +70,7 @@ static short selmodes_to_flagmodes (short sel) break; case SELECT_INVERT: - return ACHANNEL_SETFLAG_TOGGLE; + return ACHANNEL_SETFLAG_INVERT; break; case SELECT_ADD: @@ -186,7 +176,7 @@ static int nlaedit_deselectall_exec(bContext *C, wmOperator *op) deselect_nla_strips(&ac, DESELECT_STRIPS_TEST, SELECT_ADD); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -323,7 +313,7 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op) borderselect_nla_strips(&ac, rect, mode, selectmode); /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -580,7 +570,7 @@ static int nlaedit_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even } /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_SELECT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL); /* for tweak grab to work */ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index 6ea843a00de..64933e3c11a 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,11 +30,7 @@ #include #include "DNA_anim_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -54,7 +50,6 @@ #include "ED_anim_api.h" #include "ED_markers.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -62,7 +57,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -159,10 +153,10 @@ static SpaceLink *nla_new(const bContext *C) ar->v2d.cur = ar->v2d.tot; ar->v2d.min[0]= 0.0f; - ar->v2d.min[1]= 0.0f; + ar->v2d.min[1]= 0.0f; ar->v2d.max[0]= MAXFRAMEF; - ar->v2d.max[1]= 10000.0f; + ar->v2d.max[1]= 10000.0f; ar->v2d.minzoom= 0.01f; ar->v2d.maxzoom= 50; @@ -233,11 +227,9 @@ static void nla_channel_area_draw(const bContext *C, ARegion *ar) bAnimContext ac; View2D *v2d= &ar->v2d; View2DScrollers *scrollers; - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); @@ -279,12 +271,10 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar) View2D *v2d= &ar->v2d; View2DGrid *grid; View2DScrollers *scrollers; - float col[3]; short unit=0, flag=0; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt new file mode 100644 index 00000000000..0c8f9fc1ee2 --- /dev/null +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -0,0 +1,42 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../imbuf + ../include + ../../../../intern/guardedalloc + ../../../../intern/opennl/extern + ../../makesdna + ../../makesrna + ../../nodes + ../../render/extern/include + ../../windowmanager +) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +BLENDERLIB(bf_editor_space_node "${SRC}" "${INC}") diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 9f02702372f..082f3f97dfd 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -34,23 +34,12 @@ #include "BLI_blenlib.h" #include "BLI_math.h" -#include "DNA_ID.h" #include "DNA_node_types.h" -#include "DNA_image_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_action_types.h" -#include "DNA_color_types.h" -#include "DNA_customdata_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_ipo_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_text_types.h" -#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_curve.h" @@ -73,22 +62,15 @@ #include "MEM_guardedalloc.h" -#include "ED_node.h" -#include "ED_space_api.h" -#include "ED_screen.h" -#include "ED_types.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" -#include "UI_view2d.h" #include "UI_interface.h" #include "UI_resources.h" -#include "RE_pipeline.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -99,7 +81,7 @@ void node_buts_group(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiTemplateIDBrowse(layout, C, ptr, "nodetree", NULL, NULL, ""); + uiTemplateIDBrowse(layout, C, ptr, "nodetree", NULL, NULL, "", NULL); } static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -111,7 +93,7 @@ static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr) prop = RNA_struct_find_property(ptr, "outputs"); RNA_property_collection_lookup_int(ptr, prop, 0, &sockptr); - uiItemR(layout, "", 0, &sockptr, "default_value", 0); + uiItemR(layout, &sockptr, "default_value", 0, "", 0); } static void node_buts_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -125,8 +107,8 @@ static void node_buts_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr) RNA_property_collection_lookup_int(ptr, prop, 0, &sockptr); col = uiLayoutColumn(layout, 0); - uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0); - uiItemR(col, "", 0, &sockptr, "default_value", 0); + uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0, 0, 0); + uiItemR(col, &sockptr, "default_value", 0, "", 0); } static void node_buts_mix_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -136,9 +118,9 @@ static void node_buts_mix_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr) bNodeTree *ntree= (bNodeTree*)ptr->id.data; row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "blend_type", 0); + uiItemR(row, ptr, "blend_type", 0, "", 0); if(ntree->type == NTREE_COMPOSIT) - uiItemR(row, "", ICON_IMAGE_RGB_ALPHA, ptr, "alpha", 0); + uiItemR(row, ptr, "alpha", 0, "", ICON_IMAGE_RGB_ALPHA); } static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -159,8 +141,8 @@ static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr) uiTemplateCurveMapping(layout, ptr, "curve", 's', 0, 0); row= uiLayoutRow(layout, 1); - uiItemR(row, "Sta", 0, ptr, "start", 0); - uiItemR(row, "End", 0, ptr, "end", 0); + uiItemR(row, ptr, "start", 0, "Sta", 0); + uiItemR(row, ptr, "end", 0, "End", 0); } static void node_buts_colorramp(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -278,17 +260,17 @@ static void node_buts_texture(uiLayout *layout, bContext *C, PointerRNA *ptr) (node->type != TEX_NODE_TEXTURE) ); - uiItemR(layout, "", 0, ptr, "texture", 0); + uiItemR(layout, ptr, "texture", 0, "", 0); if(multi) { /* Number Drawing not optimal here, better have a list*/ - uiItemR(layout, "", 0, ptr, "node_output", 0); + uiItemR(layout, ptr, "node_output", 0, "", 0); } } static void node_buts_math(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "operation", 0); + uiItemR(layout, ptr, "operation", 0, "", 0); } /* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */ @@ -324,14 +306,14 @@ static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA bNode *node= ptr->data; uiLayout *col; - uiTemplateID(layout, C, ptr, "material", "MATERIAL_OT_new", NULL, NULL); + uiTemplateID(layout, C, ptr, "material", "MATERIAL_OT_new", NULL, NULL, NULL); if(!node->id) return; col= uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "diffuse", 0); - uiItemR(col, NULL, 0, ptr, "specular", 0); - uiItemR(col, NULL, 0, ptr, "invert_normal", 0); + uiItemR(col, ptr, "diffuse", 0, NULL, 0); + uiItemR(col, ptr, "specular", 0, NULL, 0); + uiItemR(col, ptr, "invert_normal", 0, NULL, 0); } static void node_shader_buts_mapping(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -340,38 +322,48 @@ static void node_shader_buts_mapping(uiLayout *layout, bContext *C, PointerRNA * uiItemL(layout, "Location:", 0); row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "location", 0); + uiItemR(row, ptr, "location", 0, "", 0); uiItemL(layout, "Rotation:", 0); row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "rotation", 0); + uiItemR(row, ptr, "rotation", 0, "", 0); uiItemL(layout, "Scale:", 0); row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, ptr, "scale", 0); + uiItemR(row, ptr, "scale", 0, "", 0); row= uiLayoutRow(layout, 1); - uiItemR(row, "Min", 0, ptr, "clamp_minimum", 0); - uiItemR(row, "", 0, ptr, "minimum", 0); + uiItemR(row, ptr, "clamp_minimum", 0, "Min", 0); + uiItemR(row, ptr, "minimum", 0, "", 0); row= uiLayoutRow(layout, 1); - uiItemR(row, "Max", 0, ptr, "clamp_maximum", 0); - uiItemR(row, "", 0, ptr, "maximum", 0); + uiItemR(row, ptr, "clamp_maximum", 0, "Max", 0); + uiItemR(row, ptr, "maximum", 0, "", 0); } static void node_shader_buts_vect_math(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "operation", 0); + uiItemR(layout, ptr, "operation", 0, "", 0); } static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA *ptr) { + PointerRNA obptr= CTX_data_pointer_get(C, "active_object"); uiLayout *col; - + col= uiLayoutColumn(layout, 0); - uiItemR(col, "UV", 0, ptr, "uv_layer", 0); - uiItemR(col, "VCol", 0, ptr, "color_layer", 0); + + if(obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) { + PointerRNA dataptr= RNA_pointer_get(&obptr, "data"); + + uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", 0); + uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", 0); + } + else { + uiItemR(col, ptr, "uv_layer", 0, "UV", 0); + uiItemR(col, ptr, "color_layer", 0, "VCol", 0); + } } static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -475,7 +467,7 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA * PointerRNA imaptr; PropertyRNA *prop; - uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL); + uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL, NULL); if(!node->id) return; @@ -485,21 +477,21 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA * col= uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, &imaptr, "source", 0); + uiItemR(col, &imaptr, "source", 0, NULL, 0); if (ELEM(RNA_enum_get(&imaptr, "source"), IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) { col= uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "frames", 0); - uiItemR(col, NULL, 0, ptr, "start", 0); - uiItemR(col, NULL, 0, ptr, "offset", 0); - uiItemR(col, NULL, 0, ptr, "cyclic", 0); - uiItemR(col, NULL, 0, ptr, "auto_refresh", UI_ITEM_R_ICON_ONLY); + uiItemR(col, ptr, "frames", 0, NULL, 0); + uiItemR(col, ptr, "start", 0, NULL, 0); + uiItemR(col, ptr, "offset", 0, NULL, 0); + uiItemR(col, ptr, "cyclic", 0, NULL, 0); + uiItemR(col, ptr, "auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, 0); } col= uiLayoutColumn(layout, 0); if (RNA_enum_get(&imaptr, "type")== IMA_TYPE_MULTILAYER) - uiItemR(col, NULL, 0, ptr, "layer", 0); + uiItemR(col, ptr, "layer", 0, NULL, 0); } static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -512,13 +504,13 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point const char *layer_name; char scene_name[19]; - uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL); + uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL, NULL); if(!node->id) return; col= uiLayoutColumn(layout, 0); row = uiLayoutRow(col, 0); - uiItemR(row, "", 0, ptr, "layer", 0); + uiItemR(row, ptr, "layer", 0, "", 0); prop = RNA_struct_find_property(ptr, "layer"); if (!(RNA_property_enum_identifier(C, ptr, prop, RNA_property_enum_get(ptr, prop), &layer_name))) @@ -527,10 +519,10 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point scn_ptr = RNA_pointer_get(ptr, "scene"); RNA_string_get(&scn_ptr, "name", scene_name); - WM_operator_properties_create(&op_ptr, "SCREEN_OT_render"); + WM_operator_properties_create(&op_ptr, "RENDER_OT_render"); RNA_string_set(&op_ptr, "layer", layer_name); RNA_string_set(&op_ptr, "scene", scene_name); - uiItemFullO(row, "", ICON_RENDER_STILL, "SCREEN_OT_render", op_ptr.data, WM_OP_INVOKE_DEFAULT, 0); + uiItemFullO(row, "RENDER_OT_render", "", ICON_RENDER_STILL, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0); } @@ -541,21 +533,21 @@ static void node_composit_buts_blur(uiLayout *layout, bContext *C, PointerRNA *p col= uiLayoutColumn(layout, 0); - uiItemR(col, "", 0, ptr, "filter_type", 0); + uiItemR(col, ptr, "filter_type", 0, "", 0); if (RNA_enum_get(ptr, "filter_type")!= R_FILTER_FAST_GAUSS) { - uiItemR(col, NULL, 0, ptr, "bokeh", 0); - uiItemR(col, NULL, 0, ptr, "gamma", 0); + uiItemR(col, ptr, "bokeh", 0, NULL, 0); + uiItemR(col, ptr, "gamma", 0, NULL, 0); } - uiItemR(col, NULL, 0, ptr, "relative", 0); + uiItemR(col, ptr, "relative", 0, NULL, 0); col= uiLayoutColumn(layout, 1); if (RNA_boolean_get(ptr, "relative")) { - uiItemR(col, "X", 0, ptr, "factor_x", 0); - uiItemR(col, "Y", 0, ptr, "factor_y", 0); + uiItemR(col, ptr, "factor_x", 0, "X", 0); + uiItemR(col, ptr, "factor_y", 0, "Y", 0); } else { - uiItemR(col, "X", 0, ptr, "sizex", 0); - uiItemR(col, "Y", 0, ptr, "sizey", 0); + uiItemR(col, ptr, "sizex", 0, "X", 0); + uiItemR(col, ptr, "sizey", 0, "Y", 0); } } @@ -563,24 +555,24 @@ static void node_composit_buts_dblur(uiLayout *layout, bContext *C, PointerRNA * { uiLayout *col; - uiItemR(layout, NULL, 0, ptr, "iterations", 0); - uiItemR(layout, NULL, 0, ptr, "wrap", 0); + uiItemR(layout, ptr, "iterations", 0, NULL, 0); + uiItemR(layout, ptr, "wrap", 0, NULL, 0); col= uiLayoutColumn(layout, 1); uiItemL(col, "Center:", 0); - uiItemR(col, "X", 0, ptr, "center_x", 0); - uiItemR(col, "Y", 0, ptr, "center_y", 0); + uiItemR(col, ptr, "center_x", 0, "X", 0); + uiItemR(col, ptr, "center_y", 0, "Y", 0); uiItemS(layout); col= uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "distance", 0); - uiItemR(col, NULL, 0, ptr, "angle", 0); + uiItemR(col, ptr, "distance", 0, NULL, 0); + uiItemR(col, ptr, "angle", 0, NULL, 0); uiItemS(layout); - uiItemR(layout, NULL, 0, ptr, "spin", 0); - uiItemR(layout, NULL, 0, ptr, "zoom", 0); + uiItemR(layout, ptr, "spin", 0, NULL, 0); + uiItemR(layout, ptr, "zoom", 0, NULL, 0); } static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -588,9 +580,9 @@ static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *C, Poin uiLayout *col; col= uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "iterations", 0); - uiItemR(col, NULL, 0, ptr, "sigma_color", 0); - uiItemR(col, NULL, 0, ptr, "sigma_space", 0); + uiItemR(col, ptr, "iterations", 0, NULL, 0); + uiItemR(col, ptr, "sigma_color", 0, NULL, 0); + uiItemR(col, ptr, "sigma_space", 0, NULL, 0); } static void node_composit_buts_defocus(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -599,59 +591,59 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *C, PointerRNA col= uiLayoutColumn(layout, 0); uiItemL(col, "Bokeh Type:", 0); - uiItemR(col, "", 0, ptr, "bokeh", 0); - uiItemR(col, NULL, 0, ptr, "angle", 0); + uiItemR(col, ptr, "bokeh", 0, "", 0); + uiItemR(col, ptr, "angle", 0, NULL, 0); - uiItemR(layout, NULL, 0, ptr, "gamma_correction", 0); + uiItemR(layout, ptr, "gamma_correction", 0, NULL, 0); col = uiLayoutColumn(layout, 0); uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==1); - uiItemR(col, NULL, 0, ptr, "f_stop", 0); + uiItemR(col, ptr, "f_stop", 0, NULL, 0); - uiItemR(layout, NULL, 0, ptr, "max_blur", 0); - uiItemR(layout, NULL, 0, ptr, "threshold", 0); + uiItemR(layout, ptr, "max_blur", 0, NULL, 0); + uiItemR(layout, ptr, "threshold", 0, NULL, 0); col = uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "preview", 0); + uiItemR(col, ptr, "preview", 0, NULL, 0); sub = uiLayoutColumn(col, 0); uiLayoutSetActive(sub, RNA_boolean_get(ptr, "preview")); - uiItemR(sub, NULL, 0, ptr, "samples", 0); + uiItemR(sub, ptr, "samples", 0, NULL, 0); col = uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "use_zbuffer", 0); + uiItemR(col, ptr, "use_zbuffer", 0, NULL, 0); sub = uiLayoutColumn(col, 0); uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer")==0); - uiItemR(sub, NULL, 0, ptr, "z_scale", 0); + uiItemR(sub, ptr, "z_scale", 0, NULL, 0); } /* qdn: glare node */ static void node_composit_buts_glare(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "glare_type", 0); - uiItemR(layout, "", 0, ptr, "quality", 0); + uiItemR(layout, ptr, "glare_type", 0, "", 0); + uiItemR(layout, ptr, "quality", 0, "", 0); if (RNA_enum_get(ptr, "glare_type")!= 1) { - uiItemR(layout, NULL, 0, ptr, "iterations", 0); + uiItemR(layout, ptr, "iterations", 0, NULL, 0); if (RNA_enum_get(ptr, "glare_type")!= 0) - uiItemR(layout, NULL, 0, ptr, "color_modulation", UI_ITEM_R_SLIDER); + uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, 0); } - uiItemR(layout, NULL, 0, ptr, "mix", 0); - uiItemR(layout, NULL, 0, ptr, "threshold", 0); + uiItemR(layout, ptr, "mix", 0, NULL, 0); + uiItemR(layout, ptr, "threshold", 0, NULL, 0); if (RNA_enum_get(ptr, "glare_type")== 2) { - uiItemR(layout, NULL, 0, ptr, "streaks", 0); - uiItemR(layout, NULL, 0, ptr, "angle_offset", 0); + uiItemR(layout, ptr, "streaks", 0, NULL, 0); + uiItemR(layout, ptr, "angle_offset", 0, NULL, 0); } if (RNA_enum_get(ptr, "glare_type")== 0 || RNA_enum_get(ptr, "glare_type")== 2) { - uiItemR(layout, NULL, 0, ptr, "fade", UI_ITEM_R_SLIDER); + uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, 0); if (RNA_enum_get(ptr, "glare_type")== 0) - uiItemR(layout, NULL, 0, ptr, "rotate_45", 0); + uiItemR(layout, ptr, "rotate_45", 0, NULL, 0); } if (RNA_enum_get(ptr, "glare_type")== 1) { - uiItemR(layout, NULL, 0, ptr, "size", 0); + uiItemR(layout, ptr, "size", 0, NULL, 0); } } @@ -660,17 +652,17 @@ static void node_composit_buts_tonemap(uiLayout *layout, bContext *C, PointerRNA uiLayout *col; col = uiLayoutColumn(layout, 0); - uiItemR(col, "", 0, ptr, "tonemap_type", 0); + uiItemR(col, ptr, "tonemap_type", 0, "", 0); if (RNA_enum_get(ptr, "tonemap_type")== 0) { - uiItemR(col, NULL, 0, ptr, "key", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "offset", 0); - uiItemR(col, NULL, 0, ptr, "gamma", 0); + uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "offset", 0, NULL, 0); + uiItemR(col, ptr, "gamma", 0, NULL, 0); } else { - uiItemR(col, NULL, 0, ptr, "intensity", 0); - uiItemR(col, NULL, 0, ptr, "contrast", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "adaptation", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "correction", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "intensity", 0, NULL, 0); + uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, 0); } } @@ -679,12 +671,12 @@ static void node_composit_buts_lensdist(uiLayout *layout, bContext *C, PointerRN uiLayout *col; col= uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "projector", 0); + uiItemR(col, ptr, "projector", 0, NULL, 0); col = uiLayoutColumn(col, 0); uiLayoutSetActive(col, RNA_boolean_get(ptr, "projector")==0); - uiItemR(col, NULL, 0, ptr, "jitter", 0); - uiItemR(col, NULL, 0, ptr, "fit", 0); + uiItemR(col, ptr, "jitter", 0, NULL, 0); + uiItemR(col, ptr, "fit", 0, NULL, 0); } static void node_composit_buts_vecblur(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -692,38 +684,38 @@ static void node_composit_buts_vecblur(uiLayout *layout, bContext *C, PointerRNA uiLayout *col; col= uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "samples", 0); - uiItemR(col, "Blur", 0, ptr, "factor", 0); + uiItemR(col, ptr, "samples", 0, NULL, 0); + uiItemR(col, ptr, "factor", 0, "Blur", 0); col= uiLayoutColumn(layout, 1); uiItemL(col, "Speed:", 0); - uiItemR(col, "Min", 0, ptr, "min_speed", 0); - uiItemR(col, "Max", 0, ptr, "max_speed", 0); + uiItemR(col, ptr, "min_speed", 0, "Min", 0); + uiItemR(col, ptr, "max_speed", 0, "Max", 0); - uiItemR(layout, NULL, 0, ptr, "curved", 0); + uiItemR(layout, ptr, "curved", 0, NULL, 0); } static void node_composit_buts_filter(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "filter_type", 0); + uiItemR(layout, ptr, "filter_type", 0, "", 0); } static void node_composit_buts_flip(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "axis", 0); + uiItemR(layout, ptr, "axis", 0, "", 0); } static void node_composit_buts_crop(uiLayout *layout, bContext *C, PointerRNA *ptr) { uiLayout *col; - uiItemR(layout, NULL, 0, ptr, "crop_size", 0); + uiItemR(layout, ptr, "crop_size", 0, NULL, 0); col= uiLayoutColumn(layout, 1); - uiItemR(col, "Left", 0, ptr, "x1", 0); - uiItemR(col, "Right", 0, ptr, "x2", 0); - uiItemR(col, "Up", 0, ptr, "y1", 0); - uiItemR(col, "Down", 0, ptr, "y2", 0); + uiItemR(col, ptr, "x1", 0, "Left", 0); + uiItemR(col, ptr, "x2", 0, "Right", 0); + uiItemR(col, ptr, "y1", 0, "Up", 0); + uiItemR(col, ptr, "y2", 0, "Down", 0); } static void node_composit_buts_splitviewer(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -732,8 +724,8 @@ static void node_composit_buts_splitviewer(uiLayout *layout, bContext *C, Pointe col= uiLayoutColumn(layout, 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "axis", UI_ITEM_R_EXPAND); - uiItemR(col, NULL, 0, ptr, "factor", 0); + uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, 0); + uiItemR(col, ptr, "factor", 0, NULL, 0); } static void node_composit_buts_map_value(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -741,20 +733,20 @@ static void node_composit_buts_map_value(uiLayout *layout, bContext *C, PointerR uiLayout *sub, *col; col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "offset", 0); - uiItemR(col, NULL, 0, ptr, "size", 0); + uiItemR(col, ptr, "offset", 0, NULL, 0); + uiItemR(col, ptr, "size", 0, NULL, 0); col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "use_min", 0); + uiItemR(col, ptr, "use_min", 0, NULL, 0); sub =uiLayoutColumn(col, 0); uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min")); - uiItemR(sub, "", 0, ptr, "min", 0); + uiItemR(sub, ptr, "min", 0, "", 0); col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "use_max", 0); + uiItemR(col, ptr, "use_max", 0, NULL, 0); sub =uiLayoutColumn(col, 0); uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max")); - uiItemR(sub, "", 0, ptr, "max", 0); + uiItemR(sub, ptr, "max", 0, "", 0); } static void node_composit_buts_alphaover(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -762,8 +754,8 @@ static void node_composit_buts_alphaover(uiLayout *layout, bContext *C, PointerR uiLayout *col; col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "convert_premul", 0); - uiItemR(col, NULL, 0, ptr, "premul", 0); + uiItemR(col, ptr, "convert_premul", 0, NULL, 0); + uiItemR(col, ptr, "premul", 0, NULL, 0); } static void node_composit_buts_hue_sat(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -771,14 +763,14 @@ static void node_composit_buts_hue_sat(uiLayout *layout, bContext *C, PointerRNA uiLayout *col; col =uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "hue", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "sat", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "val", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "hue", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "sat", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "val", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_dilateerode(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, NULL, 0, ptr, "distance", 0); + uiItemR(layout, ptr, "distance", 0, NULL, 0); } static void node_composit_buts_diff_matte(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -786,8 +778,8 @@ static void node_composit_buts_diff_matte(uiLayout *layout, bContext *C, Pointer uiLayout *col; col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "tolerance", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "falloff", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_distance_matte(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -795,18 +787,34 @@ static void node_composit_buts_distance_matte(uiLayout *layout, bContext *C, Poi uiLayout *col; col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "tolerance", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "falloff", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_color_spill(uiLayout *layout, bContext *C, PointerRNA *ptr) { uiLayout *row, *col; - col =uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "factor", 0); - row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "channel", UI_ITEM_R_EXPAND); + uiItemL(layout, "Despill Channel:", 0); + row =uiLayoutRow(layout,0); + uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0); + + col= uiLayoutColumn(layout, 0); + uiItemR(col, ptr, "algorithm", 0, NULL, 0); + + if(RNA_enum_get(ptr, "algorithm")==0) { + uiItemL(col, "Limiting Channel:", 0); + row=uiLayoutRow(col,0); + uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, 0); + } + + uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "unspill", 0, NULL, 0); + if (RNA_enum_get(ptr, "unspill")== 1) { + uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, 0); + } } static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -814,13 +822,13 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *C, Point uiLayout *col; col= uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "acceptance", 0); - uiItemR(col, NULL, 0, ptr, "cutoff", 0); + uiItemR(col, ptr, "acceptance", 0, NULL, 0); + uiItemR(col, ptr, "cutoff", 0, NULL, 0); col= uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "lift", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "gain", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "shadow_adjust", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -828,24 +836,35 @@ static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, Pointe uiLayout *col; col= uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "h", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "s", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "v", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "h", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "s", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "v", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_channel_matte(uiLayout *layout, bContext *C, PointerRNA *ptr) { uiLayout *col, *row; + uiItemL(layout, "Color Space:", 0); row= uiLayoutRow(layout, 0); - uiItemR(row, NULL, 0, ptr, "color_space", UI_ITEM_R_EXPAND); + uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, 0); - row= uiLayoutRow(layout, 0); - uiItemR(row, NULL, 0, ptr, "channel", UI_ITEM_R_EXPAND); + col=uiLayoutColumn(layout, 0); + uiItemL(col, "Key Channel:", 0); + row= uiLayoutRow(col, 0); + uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0); - col =uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "high", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "low", UI_ITEM_R_SLIDER); + col =uiLayoutColumn(layout, 0); + + uiItemR(col, ptr, "algorithm", 0, NULL, 0); + if(RNA_enum_get(ptr, "algorithm")==0) { + uiItemL(col, "Limiting Channel:", 0); + row=uiLayoutRow(col,0); + uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, 0); + } + + uiItemR(col, ptr, "high", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "low", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_luma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -853,18 +872,18 @@ static void node_composit_buts_luma_matte(uiLayout *layout, bContext *C, Pointer uiLayout *col; col= uiLayoutColumn(layout, 1); - uiItemR(col, NULL, 0, ptr, "high", UI_ITEM_R_SLIDER); - uiItemR(col, NULL, 0, ptr, "low", UI_ITEM_R_SLIDER); + uiItemR(col, ptr, "high", UI_ITEM_R_SLIDER, NULL, 0); + uiItemR(col, ptr, "low", UI_ITEM_R_SLIDER, NULL, 0); } static void node_composit_buts_map_uv(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, NULL, 0, ptr, "alpha", 0); + uiItemR(layout, ptr, "alpha", 0, NULL, 0); } static void node_composit_buts_id_mask(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, NULL, 0, ptr, "index", 0); + uiItemR(layout, ptr, "index", 0, NULL, 0); } static void node_composit_buts_file_output(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -872,26 +891,31 @@ static void node_composit_buts_file_output(uiLayout *layout, bContext *C, Pointe uiLayout *col, *row; col= uiLayoutColumn(layout, 0); - uiItemR(col, "", 0, ptr, "filename", 0); - uiItemR(col, "", 0, ptr, "image_type", 0); + uiItemR(col, ptr, "filepath", 0, "", 0); + uiItemR(col, ptr, "image_type", 0, "", 0); row= uiLayoutRow(layout, 0); if (RNA_enum_get(ptr, "image_type")== R_OPENEXR) { - uiItemR(row, NULL, 0, ptr, "exr_half", 0); - uiItemR(row, "", 0, ptr, "exr_codec", 0); + uiItemR(row, ptr, "exr_half", 0, NULL, 0); + uiItemR(row, ptr, "exr_codec", 0, "", 0); } else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) { - uiItemR(row, NULL, 0, ptr, "quality", UI_ITEM_R_SLIDER); + uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, NULL, 0); } row= uiLayoutRow(layout, 1); - uiItemR(row, "Start", 0, ptr, "start_frame", 0); - uiItemR(row, "End", 0, ptr, "end_frame", 0); + uiItemR(row, ptr, "frame_start", 0, "Start", 0); + uiItemR(row, ptr, "frame_end", 0, "End", 0); } static void node_composit_buts_scale(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "space", 0); + uiItemR(layout, ptr, "space", 0, "", 0); +} + +static void node_composit_buts_rotate(uiLayout *layout, bContext *C, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "filter", 0, "", 0); } static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -899,61 +923,61 @@ static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA uiLayout *col; col= uiLayoutColumn(layout, 0); - uiItemR(col, NULL, 0, ptr, "rgb", 0); - uiItemR(col, NULL, 0, ptr, "alpha", 0); + uiItemR(col, ptr, "rgb", 0, NULL, 0); + uiItemR(col, ptr, "alpha", 0, NULL, 0); } static void node_composit_buts_premulkey(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "mapping", 0); + uiItemR(layout, ptr, "mapping", 0, "", 0); } static void node_composit_buts_view_levels(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, NULL, 0, ptr, "channel", UI_ITEM_R_EXPAND); + uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0); } static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, PointerRNA *ptr) { uiLayout *split, *col, *row; - uiItemR(layout, NULL, 0, ptr, "correction_formula", 0); + uiItemR(layout, ptr, "correction_formula", 0, NULL, 0); if (RNA_enum_get(ptr, "correction_formula")== 0) { split = uiLayoutSplit(layout, 0, 0); col = uiLayoutColumn(split, 0); - uiTemplateColorWheel(col, ptr, "lift", 1, 1); + uiTemplateColorWheel(col, ptr, "lift", 1, 1, 0, 1); row = uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "lift", 0); + uiItemR(row, ptr, "lift", 0, NULL, 0); col = uiLayoutColumn(split, 0); - uiTemplateColorWheel(col, ptr, "gamma", 1, 1); + uiTemplateColorWheel(col, ptr, "gamma", 1, 1, 1, 1); row = uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "gamma", 0); + uiItemR(row, ptr, "gamma", 0, NULL, 0); col = uiLayoutColumn(split, 0); - uiTemplateColorWheel(col, ptr, "gain", 1, 1); + uiTemplateColorWheel(col, ptr, "gain", 1, 1, 1, 1); row = uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "gain", 0); + uiItemR(row, ptr, "gain", 0, NULL, 0); } else { split = uiLayoutSplit(layout, 0, 0); col = uiLayoutColumn(split, 0); - uiTemplateColorWheel(col, ptr, "offset", 1, 1); + uiTemplateColorWheel(col, ptr, "offset", 1, 1, 0, 1); row = uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "offset", 0); + uiItemR(row, ptr, "offset", 0, NULL, 0); col = uiLayoutColumn(split, 0); - uiTemplateColorWheel(col, ptr, "power", 1, 1); + uiTemplateColorWheel(col, ptr, "power", 1, 1, 0, 1); row = uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "power", 0); + uiItemR(row, ptr, "power", 0, NULL, 0); col = uiLayoutColumn(split, 0); - uiTemplateColorWheel(col, ptr, "slope", 1, 1); + uiTemplateColorWheel(col, ptr, "slope", 1, 1, 0, 1); row = uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, ptr, "slope", 0); + uiItemR(row, ptr, "slope", 0, NULL, 0); } } @@ -1071,6 +1095,9 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_SCALE: ntype->uifunc= node_composit_buts_scale; break; + case CMP_NODE_ROTATE: + ntype->uifunc=node_composit_buts_rotate; + break; case CMP_NODE_CHANNEL_MATTE: ntype->uifunc= node_composit_buts_channel_matte; break; @@ -1094,13 +1121,13 @@ static void node_composit_set_butfunc(bNodeType *ntype) break; case CMP_NODE_VIEW_LEVELS: ntype->uifunc=node_composit_buts_view_levels; - break; + break; case CMP_NODE_COLORBALANCE: ntype->uifunc=node_composit_buts_colorbalance; - break; + break; case CMP_NODE_HUECORRECT: ntype->uifunc=node_composit_buts_huecorrect; - break; + break; default: ntype->uifunc= NULL; } @@ -1113,12 +1140,12 @@ static void node_texture_buts_bricks(uiLayout *layout, bContext *C, PointerRNA * uiLayout *col; col= uiLayoutColumn(layout, 1); - uiItemR(col, "Offset", 0, ptr, "offset", 0); - uiItemR(col, "Frequency", 0, ptr, "offset_frequency", 0); + uiItemR(col, ptr, "offset", 0, "Offset", 0); + uiItemR(col, ptr, "offset_frequency", 0, "Frequency", 0); col= uiLayoutColumn(layout, 1); - uiItemR(col, "Squash", 0, ptr, "squash", 0); - uiItemR(col, "Frequency", 0, ptr, "squash_frequency", 0); + uiItemR(col, ptr, "squash", 0, "Squash", 0); + uiItemR(col, ptr, "squash_frequency", 0, "Frequency", 0); } static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -1135,54 +1162,54 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *pt switch( tex->type ) { case TEX_BLEND: - uiItemR(col, "", 0, &tex_ptr, "progression", 0); + uiItemR(col, &tex_ptr, "progression", 0, "", 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "flip_axis", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "flip_axis", UI_ITEM_R_EXPAND, NULL, 0); break; case TEX_MARBLE: row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "stype", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "stype", UI_ITEM_R_EXPAND, NULL, 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "noisebasis2", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "noisebasis2", UI_ITEM_R_EXPAND, NULL, 0); break; case TEX_WOOD: - uiItemR(col, "", 0, &tex_ptr, "noise_basis", 0); - uiItemR(col, "", 0, &tex_ptr, "stype", 0); + uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0); + uiItemR(col, &tex_ptr, "stype", 0, "", 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "noisebasis2", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "noisebasis2", UI_ITEM_R_EXPAND, NULL, 0); row= uiLayoutRow(col, 0); uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "stype")==TEX_BAND || RNA_enum_get(&tex_ptr, "stype")==TEX_RING)); - uiItemR(row, NULL, 0, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0); break; case TEX_CLOUDS: - uiItemR(col, "", 0, &tex_ptr, "noise_basis", 0); + uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "stype", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "stype", UI_ITEM_R_EXPAND, NULL, 0); row= uiLayoutRow(col, 0); - uiItemR(row, NULL, 0, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND); - uiItemR(col, "Depth", 0, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND); + uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0); + uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", 0); break; case TEX_DISTNOISE: - uiItemR(col, "", 0, &tex_ptr, "noise_basis", 0); - uiItemR(col, "", 0, &tex_ptr, "noise_distortion", 0); + uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0); + uiItemR(col, &tex_ptr, "noise_distortion", 0, "", 0); break; } } static void node_texture_buts_image(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL); + uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL, NULL); } static void node_texture_buts_output(uiLayout *layout, bContext *C, PointerRNA *ptr) { - uiItemR(layout, "", 0, ptr, "output_name", 0); + uiItemR(layout, ptr, "output_name", 0, "", 0); } /* only once called */ @@ -1276,14 +1303,17 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage) glMatrixMode(GL_MODELVIEW); glPushMatrix(); + /* keep this, saves us from a version patch */ + if(snode->zoom==0.0f) snode->zoom= 1.0f; + /* somehow the offset has to be calculated inverse */ glaDefine2DArea(&ar->winrct); /* ortho at pixel level curarea */ wmOrtho2(-0.375, ar->winx-0.375, -0.375, ar->winy-0.375); - x = (ar->winx-ibuf->x)/2 + snode->xof; - y = (ar->winy-ibuf->y)/2 + snode->yof; + x = (ar->winx-snode->zoom*ibuf->x)/2 + snode->xof; + y = (ar->winy-snode->zoom*ibuf->y)/2 + snode->yof; if(!ibuf->rect) { if(color_manage) @@ -1293,8 +1323,11 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage) IMB_rect_from_float(ibuf); } - if(ibuf->rect) + if(ibuf->rect) { + glPixelZoom(snode->zoom, snode->zoom); glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); + glPixelZoom(1.0f, 1.0f); + } glMatrixMode(GL_PROJECTION); glPopMatrix(); diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index cbd3ad73024..41cf689407b 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,13 +31,8 @@ #include #include -#include "DNA_ID.h" -#include "DNA_gpencil_types.h" #include "DNA_node_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -61,16 +56,12 @@ #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" #include "ED_gpencil.h" #include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "node_intern.h" // own include @@ -123,7 +114,7 @@ static void active_node_panel(const bContext *C, Panel *pa) uiBlockSetHandleFunc(block, do_node_region_buttons, NULL); /* draw this node's name, etc. */ - uiItemR(layout, NULL, ICON_NODE, &ptr, "name", 0); + uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE); // TODO: a separator would be nice... /* draw this node's settings */ diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 5928e5cf20e..5eb6d9cf94a 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -30,23 +30,12 @@ #include #include -#include "DNA_ID.h" #include "DNA_node_types.h" -#include "DNA_image_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_action_types.h" -#include "DNA_color_types.h" -#include "DNA_customdata_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_ipo_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_text_types.h" -#include "DNA_userdef_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -73,9 +62,6 @@ #include "WM_types.h" #include "ED_gpencil.h" -#include "ED_screen.h" -#include "ED_util.h" -#include "ED_types.h" #include "UI_interface.h" #include "UI_interface_icons.h" @@ -121,6 +107,44 @@ void ED_node_changed_update(ID *id, bNode *node) } } +static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup) +{ + bNode *node; + + if(ntree == lookup) + return 1; + + for(node=ntree->nodes.first; node; node=node->next) + if(node->type == NODE_GROUP && node->id) + if(has_nodetree((bNodeTree*)node->id, lookup)) + return 1; + + return 0; +} + +void ED_node_generic_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node) +{ + Material *ma; + Tex *tex; + Scene *sce; + + /* look through all datablocks, to support groups */ + for(ma=bmain->mat.first; ma; ma=ma->id.next) + if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree)) + ED_node_changed_update(&ma->id, node); + + for(tex=bmain->tex.first; tex; tex=tex->id.next) + if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree)) + ED_node_changed_update(&tex->id, node); + + for(sce=bmain->scene.first; sce; sce=sce->id.next) + if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree)) + ED_node_changed_update(&sce->id, node); + + if(ntree->type == NTREE_TEXTURE) + ntreeTexCheckCyclics(ntree); +} + static void do_node_internal_buttons(bContext *C, void *node_v, int event) { if(event==B_NODE_EXEC) { @@ -373,9 +397,6 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode) rctf *rect= &gnode->totr; int counter; - /* init ui blocks for sub-nodetrees */ - node_uiblocks_init(C, ngroup); - /* center them, is a bit of abuse of locx and locy though */ for(node= ngroup->nodes.first; node; node= node->next) { node->locx+= gnode->locx; @@ -562,7 +583,7 @@ static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *socket_v) layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, sock->locx, sock->locy-8, 140, 20, U.uistyles.first), 0); - uiItemR(layout, "", 0, &ptr, "default_value", UI_ITEM_R_EXPAND); + uiItemR(layout, &ptr, "default_value", UI_ITEM_R_EXPAND, "", 0); return block; } @@ -605,13 +626,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) } } -// if(GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_MAC, GPU_DRIVER_OFFICIAL)) { XXX -// float zoomx= curarea->winx/(float)(G.v2d->cur.xmax-G.v2d->cur.xmin); -// float zoomy= curarea->winy/(float)(G.v2d->cur.ymax-G.v2d->cur.ymin); -// glPixelZoom(zoomx*xscale, zoomy*yscale); -// } -// else - glPixelZoom(xscale, yscale); + glPixelZoom(xscale, yscale); glEnable(GL_BLEND); glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); /* premul graphics */ @@ -640,6 +655,19 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN bNodeTree *ntree = snode->nodetree; PointerRNA ptr; + /* hurmf... another candidate for callback, have to see how this works first */ + if(node->id && node->block && snode->treetype==NTREE_SHADER) + nodeShaderSynchronizeID(node, 0); + + /* skip if out of view */ + if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax || + node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax) { + + uiEndBlock(C, node->block); + node->block= NULL; + return; + } + uiSetRoundBox(15-4); ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT); @@ -662,42 +690,32 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN icon_id= ICON_MATERIAL; else icon_id= ICON_MATERIAL_DATA; - iconofs-=18.0f; - glEnable(GL_BLEND); - UI_icon_draw_aspect(iconofs, rct->ymax-NODE_DY, icon_id, 1.0f, 0.5f); - glDisable(GL_BLEND); + iconofs-=22.0f; + uiDefIconBut(node->block, LABEL, B_REDR, icon_id, iconofs, rct->ymax-NODE_DY, + UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } if(node->type == NODE_GROUP) { - iconofs-=18.0f; - glEnable(GL_BLEND); - if(node->id->lib) { - float rgb[3] = {1.0f, 0.7f, 0.3f}; - UI_icon_draw_aspect_color(iconofs, rct->ymax-NODE_DY, ICON_NODETREE, 1.0f, rgb); - } - else { - UI_icon_draw_aspect(iconofs, rct->ymax-NODE_DY, ICON_NODETREE, 1.0f, 0.5f); - } - glDisable(GL_BLEND); + iconofs-=15.0f; + uiDefIconBut(node->block, LABEL, B_REDR, ICON_NODETREE, iconofs, rct->ymax-NODE_DY, + UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } if(node->typeinfo->flag & NODE_OPTIONS) { - iconofs-=18.0f; - glEnable(GL_BLEND); - UI_icon_draw_aspect(iconofs, rct->ymax-NODE_DY, ICON_BUTS, 1.0f, 0.5f); - glDisable(GL_BLEND); + iconofs-=15.0f; + uiDefIconBut(node->block, LABEL, B_REDR, ICON_BUTS, iconofs, rct->ymax-NODE_DY, + UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } { /* always hide/reveal unused sockets */ int shade; - iconofs-=18.0f; + iconofs-=15.0f; // XXX re-enable /*if(node_has_hidden_sockets(node)) shade= -40; else*/ shade= -90; - glEnable(GL_BLEND); - UI_icon_draw_aspect(iconofs, rct->ymax-NODE_DY, ICON_PLUS, 1.0f, 0.5f); - glDisable(GL_BLEND); + uiDefIconBut(node->block, LABEL, B_REDR, ICON_PLUS, iconofs, rct->ymax-NODE_DY, + UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } /* title */ @@ -715,10 +733,10 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_ThemeColor(TH_TEXT); if(node->flag & NODE_CUSTOM_NAME) - BLI_strncpy(showname, node->name, 32); + BLI_strncpy(showname, node->name, sizeof(showname)); else /* todo: auto name display for node types */ - BLI_strncpy(showname, node->name, 32); + BLI_strncpy(showname, node->name, sizeof(showname)); //if(node->flag & NODE_MUTED) // sprintf(showname, "[%s]", showname); @@ -750,10 +768,6 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN node_draw_mute_line(v2d, snode, node); - /* hurmf... another candidate for callback, have to see how this works first */ - if(node->id && node->block && snode->treetype==NTREE_SHADER) - nodeShaderSynchronizeID(node, 0); - /* socket inputs, buttons */ for(sock= node->inputs.first; sock; sock= sock->next) { if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { @@ -824,6 +838,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN node_draw_preview(node->preview, &node->prvr); BLI_unlock_thread(LOCK_PREVIEW); } + + UI_ThemeClearColor(color_id); uiEndBlock(C, node->block); uiDrawBlock(C, node->block); @@ -877,10 +893,10 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b if(node->flag & NODE_CUSTOM_NAME) - BLI_strncpy(showname, node->name, 128); + BLI_strncpy(showname, node->name, sizeof(showname)); else /* todo: auto name display */ - BLI_strncpy(showname, node->name, 128); + BLI_strncpy(showname, node->name, sizeof(showname)); //if(node->flag & NODE_MUTED) // sprintf(showname, "[%s]", showname); @@ -1022,9 +1038,9 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN UI_ThemeColor(TH_TEXT_HI); if (gnode->flag & NODE_CUSTOM_NAME) - strcat(showname, gnode->name); + BLI_strncpy(showname, gnode->name, sizeof(showname)); else - strcpy(showname, ngroup->id.name+2); + BLI_strncpy(showname, ngroup->id.name+2, sizeof(showname)); // XXX this shows some scaling artifacts UI_DrawString(rect.xmin+8.0f, rect.ymax+5.0f, showname); @@ -1046,14 +1062,12 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) { - float col[3]; View2DScrollers *scrollers; SpaceNode *snode= CTX_wm_space_node(C); Scene *scene= CTX_data_scene(C); int color_manage = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT; - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); @@ -1078,8 +1092,16 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) if(snode->nodetree) { bNode *node; + /* init ui blocks for opened node group trees first + * so they're in the correct depth stack order */ + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(node->flag & NODE_GROUP_EDIT) + node_uiblocks_init(C, (bNodeTree *)node->id); + } + node_uiblocks_init(C, snode->nodetree); + /* for now, we set drawing coordinates on each redraw */ for(node= snode->nodetree->nodes.first; node; node= node->next) { if(node->flag & NODE_GROUP_EDIT) @@ -1101,14 +1123,14 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) /* draw grease-pencil ('canvas' strokes) */ if (/*(snode->flag & SNODE_DISPGP) &&*/ (snode->nodetree)) - draw_gpencil_2dview((bContext*)C, 1); + draw_gpencil_view2d((bContext*)C, 1); /* reset view matrix */ UI_view2d_view_restore(C); /* draw grease-pencil (screen strokes, and also paintbuffer) */ if (/*(snode->flag & SNODE_DISPGP) && */(snode->nodetree)) - draw_gpencil_2dview((bContext*)C, 0); + draw_gpencil_view2d((bContext*)C, 0); /* scrollers */ scrollers= UI_view2d_scrollers_calc(C, v2d, 10, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 473f706f6f8..cea88c33c5b 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,22 +31,14 @@ #include #include #include +#include #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" -#include "DNA_brush_types.h" -#include "DNA_color_types.h" -#include "DNA_image_types.h" -#include "DNA_ipo_types.h" #include "DNA_object_types.h" #include "DNA_material_types.h" -#include "DNA_texture_types.h" #include "DNA_node_types.h" -#include "DNA_space_types.h" -#include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_colortools.h" @@ -73,11 +65,8 @@ #include "IMB_imbuf_types.h" #include "ED_node.h" -#include "ED_render.h" #include "ED_screen.h" -#include "ED_space_api.h" -#include "ED_transform.h" -#include "ED_types.h" +#include "ED_render.h" #include "RNA_access.h" #include "RNA_define.h" @@ -87,7 +76,7 @@ #include "UI_interface.h" #include "UI_view2d.h" - + #include "node_intern.h" #define SOCK_IN 1 @@ -101,6 +90,7 @@ typedef struct CompoJob { bNodeTree *localtree; short *stop; short *do_update; + float *progress; } CompoJob; /* called by compo, only to check job 'stop' value */ @@ -146,9 +136,16 @@ static void compo_updatejob(void *cjv) ntreeLocalSync(cj->localtree, cj->ntree); } +static void compo_progressjob(void *cjv, float progress) +{ + CompoJob *cj= cjv; + + *(cj->progress) = progress; +} + /* only this runs inside thread */ -static void compo_startjob(void *cjv, short *stop, short *do_update) +static void compo_startjob(void *cjv, short *stop, short *do_update, float *progress) { CompoJob *cj= cjv; bNodeTree *ntree= cj->localtree; @@ -158,11 +155,14 @@ static void compo_startjob(void *cjv, short *stop, short *do_update) cj->stop= stop; cj->do_update= do_update; + cj->progress= progress; ntree->test_break= compo_breakjob; ntree->tbh= cj; ntree->stats_draw= compo_redrawjob; ntree->sdh= cj; + ntree->progress= compo_progressjob; + ntree->prh= cj; // XXX BIF_store_spare(); @@ -170,6 +170,7 @@ static void compo_startjob(void *cjv, short *stop, short *do_update) ntree->test_break= NULL; ntree->stats_draw= NULL; + ntree->progress= NULL; } @@ -179,7 +180,7 @@ void snode_composite_job(const bContext *C, ScrArea *sa) wmJob *steve; CompoJob *cj; - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa, WM_JOB_EXCL_RENDER); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa, "Compositing", WM_JOB_EXCL_RENDER|WM_JOB_PROGRESS); cj= MEM_callocN(sizeof(CompoJob), "compo job"); /* customdata for preview thread */ @@ -189,7 +190,7 @@ void snode_composite_job(const bContext *C, ScrArea *sa) /* setup job */ WM_jobs_customdata(steve, cj, compo_freejob); WM_jobs_timer(steve, 0.1, NC_SCENE, NC_SCENE|ND_COMPO_RESULT); - WM_jobs_callbacks(steve, compo_startjob, compo_initjob, compo_updatejob); + WM_jobs_callbacks(steve, compo_startjob, compo_initjob, compo_updatejob, NULL); WM_jobs_start(CTX_wm_manager(C), steve); @@ -401,11 +402,13 @@ void snode_set_context(SpaceNode *snode, Scene *scene) snode->from= (ID*)give_current_material(ob, ob->actcol); /* from is not set fully for material nodes, should be ID + Node then */ + snode->id= &tx->id; } } else if(snode->texfrom==SNODE_TEX_WORLD) { tx= give_current_world_texture(scene->world); snode->from= (ID *)scene->world; + snode->id= &tx->id; } else { Brush *brush= NULL; @@ -415,11 +418,12 @@ void snode_set_context(SpaceNode *snode, Scene *scene) else brush= paint_brush(&scene->toolsettings->imapaint.paint); - snode->from= (ID *)brush; - tx= give_current_brush_texture(brush); + if (brush) { + snode->from= (ID *)brush; + tx= give_current_brush_texture(brush); + snode->id= &tx->id; + } } - - snode->id= &tx->id; } if(snode->id) @@ -546,6 +550,8 @@ static int node_group_edit_exec(bContext *C, wmOperator *op) SpaceNode *snode = CTX_wm_space_node(C); bNode *gnode; + ED_preview_kill_jobs(C); + gnode= nodeGetActive(snode->edittree); snode_make_group_editable(snode, gnode); @@ -591,6 +597,8 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op) SpaceNode *snode = CTX_wm_space_node(C); bNode *gnode; + ED_preview_kill_jobs(C); + /* are we inside of a group? */ gnode= node_tree_get_editgroup(snode->nodetree); if(gnode) @@ -697,68 +705,125 @@ static bNode *visible_node(SpaceNode *snode, rctf *rct) return tnode; } -#if 0 -static void snode_bg_viewmove(SpaceNode *snode) +/* **************************** */ + +typedef struct NodeViewMove { + short mvalo[2]; + int xmin, ymin, xmax, ymax; +} NodeViewMove; + +static int snode_bg_viewmove_modal(bContext *C, wmOperator *op, wmEvent *event) { - ScrArea *sa; + SpaceNode *snode= CTX_wm_space_node(C); + ARegion *ar= CTX_wm_region(C); + NodeViewMove *nvm= op->customdata; + + switch (event->type) { + case MOUSEMOVE: + + snode->xof -= (nvm->mvalo[0]-event->mval[0]); + snode->yof -= (nvm->mvalo[1]-event->mval[1]); + nvm->mvalo[0]= event->mval[0]; + nvm->mvalo[1]= event->mval[1]; + + /* prevent dragging image outside of the window and losing it! */ + CLAMP(snode->xof, nvm->xmin, nvm->xmax); + CLAMP(snode->yof, nvm->ymin, nvm->ymax); + + ED_region_tag_redraw(ar); + + break; + + case LEFTMOUSE: + case MIDDLEMOUSE: + case RIGHTMOUSE: + + MEM_freeN(nvm); + op->customdata= NULL; + + return OPERATOR_FINISHED; + } + + return OPERATOR_RUNNING_MODAL; +} + +static int snode_bg_viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + NodeViewMove *nvm; Image *ima; ImBuf *ibuf; - Window *win; - short mval[2], mvalo[2]; - short rectx, recty, xmin, xmax, ymin, ymax, pad; - int oldcursor; + int pad= 10; ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node"); ibuf= BKE_image_get_ibuf(ima, NULL); - sa = snode->area; + if(ibuf == NULL) + return OPERATOR_CANCELLED; + + nvm= MEM_callocN(sizeof(NodeViewMove), "NodeViewMove struct"); + op->customdata= nvm; + nvm->mvalo[0]= event->mval[0]; + nvm->mvalo[1]= event->mval[1]; + + nvm->xmin = -(ar->winx/2) - ibuf->x/2 + pad; + nvm->xmax = ar->winx/2 + ibuf->x/2 - pad; + nvm->ymin = -(ar->winy/2) - ibuf->y/2 + pad; + nvm->ymax = ar->winy/2 + ibuf->y/2 - pad; - if(ibuf) { - rectx = ibuf->x; - recty = ibuf->y; - } else { - rectx = recty = 1; - } + /* add modal handler */ + WM_event_add_modal_handler(C, op); - pad = 10; - xmin = -(sa->winx/2) - rectx/2 + pad; - xmax = sa->winx/2 + rectx/2 - pad; - ymin = -(sa->winy/2) - recty/2 + pad; - ymax = sa->winy/2 + recty/2 - pad; - - getmouseco_sc(mvalo); - - /* store the old cursor to temporarily change it */ - oldcursor=get_cursor(); - win=winlay_get_active_window(); - - SetBlenderCursor(BC_NSEW_SCROLLCURSOR); - - while(get_mbut()&(L_MOUSE|M_MOUSE)) { - - getmouseco_sc(mval); - - if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) { - - snode->xof -= (mvalo[0]-mval[0]); - snode->yof -= (mvalo[1]-mval[1]); - - /* prevent dragging image outside of the window and losing it! */ - CLAMP(snode->xof, xmin, xmax); - CLAMP(snode->yof, ymin, ymax); - - mvalo[0]= mval[0]; - mvalo[1]= mval[1]; - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - } - else BIF_wait_for_statechange(); - } - - window_set_cursor(win, oldcursor); + return OPERATOR_RUNNING_MODAL; } -#endif + + +void NODE_OT_backimage_move(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Background Image Move"; + ot->idname= "NODE_OT_backimage_move"; + + /* api callbacks */ + ot->invoke= snode_bg_viewmove_invoke; + ot->modal= snode_bg_viewmove_modal; + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= OPTYPE_BLOCKING; +} + +static int backimage_zoom(bContext *C, wmOperator *op) +{ + SpaceNode *snode= CTX_wm_space_node(C); + ARegion *ar= CTX_wm_region(C); + float fac= RNA_float_get(op->ptr, "factor"); + + snode->zoom *= fac; + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + + +void NODE_OT_backimage_zoom(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Background Image Zoom"; + ot->idname= "NODE_OT_backimage_zoom"; + + /* api callbacks */ + ot->exec= backimage_zoom; + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= OPTYPE_BLOCKING; + + /* internal */ + RNA_def_float(ot->srna, "factor", 1.2f, 0.0f, 10.0f, "Factor", "", 0.0f, 10.0f); +} + /* ********************** size widget operator ******************** */ @@ -875,6 +940,79 @@ void node_deselectall(SpaceNode *snode) node->flag &= ~SELECT; } +/* return 1 if we need redraw otherwise zero. */ +int node_select_same_type(SpaceNode *snode) +{ + bNode *nac, *p; + int redraw; + + /* search for the active node. */ + for (nac= snode->edittree->nodes.first; nac; nac= nac->next) { + if (nac->flag & SELECT) + break; + } + + /* no active node, return. */ + if (!nac) + return(0); + + redraw= 0; + for (p= snode->edittree->nodes.first; p; p= p->next) { + if (p->type != nac->type && p->flag & SELECT) { + /* if it's selected but different type, unselect */ + redraw= 1; + p->flag &= ~SELECT; + } + else if (p->type == nac->type && (!(p->flag & SELECT))) { + /* if it's the same type and is not selected, select! */ + redraw= 1; + p->flag |= SELECT; + } + } + return(redraw); +} + +/* return 1 if we need redraw, otherwise zero. + * dir can be 0 == next or 0 != prev. + */ +int node_select_same_type_np(SpaceNode *snode, int dir) +{ + bNode *nac, *p; + + /* search the active one. */ + for (nac= snode->edittree->nodes.first; nac; nac= nac->next) { + if (nac->flag & SELECT) + break; + } + + /* no active node, return. */ + if (!nac) + return(0); + + if (dir == 0) + p= nac->next; + else + p= nac->prev; + + while (p) { + /* Now search the next with the same type. */ + if (p->type == nac->type) + break; + + if (dir == 0) + p= p->next; + else + p= p->prev; + } + + if (p) { + node_deselectall(snode); + p->flag |= SELECT; + return(1); + } + return(0); +} + int node_has_hidden_sockets(bNode *node) { bNodeSocket *sock; @@ -903,31 +1041,101 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode) if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) if(node->flag & NODE_DO_OUTPUT) break; + /* no viewer, we make one active */ + if(node==NULL) { + for(node= snode->edittree->nodes.first; node; node= node->next) { + if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { + node->flag |= NODE_DO_OUTPUT; + break; + } + } + } if(node) { bNodeLink *link; - - /* get link to viewer */ + bNodeSocket *sock= NULL; + + /* try to find an already connected socket to cycle to the next */ for(link= snode->edittree->links.first; link; link= link->next) - if(link->tonode==node) - break; + if(link->tonode==node && link->fromnode==tonode) + if(link->tosock==node->inputs.first) + break; if(link) { - link->fromnode= tonode; - link->fromsock= tonode->outputs.first; + /* unlink existing connection */ + sock= link->fromsock; + nodeRemLink(snode->edittree, link); + + /* find a socket after the previously connected socket */ + for(sock=sock->next; sock; sock= sock->next) + if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) + break; + } + + /* find a socket starting from the first socket */ + if(!sock) { + for(sock= tonode->outputs.first; sock; sock= sock->next) + if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) + break; + } + + if(sock) { + /* get link to viewer */ + for(link= snode->edittree->links.first; link; link= link->next) + if(link->tonode==node && link->tosock==node->inputs.first) + break; + + if(link==NULL) { + nodeAddLink(snode->edittree, tonode, sock, node, node->inputs.first); + } + else { + link->fromnode= tonode; + link->fromsock= sock; + } + ntreeSolveOrder(snode->edittree); NodeTagChanged(snode->edittree, node); } } } -void node_active_link_viewer(SpaceNode *snode) +static int node_active_link_viewer(bContext *C, wmOperator *op) { - bNode *node= editnode_get_active(snode->edittree); - if(node) - node_link_viewer(snode, node); + SpaceNode *snode= CTX_wm_space_node(C); + bNode *node; + + node= editnode_get_active(snode->edittree); + + if(!node) + return OPERATOR_CANCELLED; + + ED_preview_kill_jobs(C); + + node_link_viewer(snode, node); + snode_notify(C, snode); + + return OPERATOR_FINISHED; } + + +void NODE_OT_link_viewer(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Link to Viewer Node"; + ot->description = "Link to Viewer Node"; + ot->idname= "NODE_OT_link_viewer"; + + /* api callbacks */ + ot->exec= node_active_link_viewer; + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + + + /* return 0, nothing done */ /*static*/ int node_mouse_groupheader(SpaceNode *snode) { @@ -1267,6 +1475,8 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) { SpaceNode *snode= CTX_wm_space_node(C); + ED_preview_kill_jobs(C); + ntreeCopyTree(snode->edittree, 1); /* 1 == internally selected nodes */ ntreeSolveOrder(snode->edittree); @@ -1425,7 +1635,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) static int node_link_init(SpaceNode *snode, NodeLinkDrag *nldrag) { bNodeLink *link; - + /* output indicated? */ if(find_indicated_socket(snode, &nldrag->node, &nldrag->sock, SOCK_OUT)) { if(nodeCountSocketLinks(snode->edittree, nldrag->sock) < nldrag->sock->limit) @@ -1479,6 +1689,8 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event) UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, &snode->mx, &snode->my); + ED_preview_kill_jobs(C); + nldrag->in_out= node_link_init(snode, nldrag); if(nldrag->in_out) { @@ -1525,6 +1737,8 @@ static int node_make_link_exec(bContext *C, wmOperator *op) SpaceNode *snode= CTX_wm_space_node(C); int replace = RNA_boolean_get(op->ptr, "replace"); + ED_preview_kill_jobs(C); + snode_autoconnect(snode, 0, replace); node_tree_verify_groups(snode->nodetree); @@ -1588,6 +1802,8 @@ static int cut_links_exec(bContext *C, wmOperator *op) if(i>1) { bNodeLink *link, *next; + + ED_preview_kill_jobs(C); for(link= snode->edittree->links.first; link; link= next) { next= link->next; @@ -1633,13 +1849,15 @@ void NODE_OT_links_cut(wmOperatorType *ot) /* ******************************** */ // XXX some code needing updating to operators... -/* goes over all scenes, reads render layerss */ -void node_read_renderlayers(SpaceNode *snode) +/* goes over all scenes, reads render layers */ +static int node_read_renderlayers_exec(bContext *C, wmOperator *op) { - Scene *curscene= NULL; // XXX - Scene *scene; + SpaceNode *snode= CTX_wm_space_node(C); + Scene *curscene= CTX_data_scene(C), *scene; bNode *node; + ED_preview_kill_jobs(C); + /* first tag scenes unread */ for(scene= G.main->scene.first; scene; scene= scene->id.next) scene->id.flag |= LIB_DOIT; @@ -1655,26 +1873,57 @@ void node_read_renderlayers(SpaceNode *snode) } } - // XXX snode_notify(snode); + snode_notify(C, snode); + return OPERATOR_FINISHED; } -void node_read_fullsamplelayers(SpaceNode *snode) +void NODE_OT_read_renderlayers(wmOperatorType *ot) { - Scene *curscene= NULL; // XXX - Render *re= RE_NewRender(curscene->id.name, RE_SLOT_VIEW); - - WM_cursor_wait(1); - - //BIF_init_render_callbacks(re, 1); - RE_MergeFullSample(re, curscene, snode->nodetree); - //BIF_end_render_callbacks(); - // allqueue(REDRAWNODE, 1); - // allqueue(REDRAWIMAGE, 1); + ot->name= "Read Render Layers"; + ot->idname= "NODE_OT_read_renderlayers"; - WM_cursor_wait(0); + ot->exec= node_read_renderlayers_exec; + + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= 0; } +static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode= CTX_wm_space_node(C); + Scene *curscene= CTX_data_scene(C); + Render *re= RE_NewRender(curscene->id.name); + +// WM_cursor_wait(1); + + RE_MergeFullSample(re, curscene, snode->nodetree); + snode_notify(C, snode); + +// WM_cursor_wait(0); + return OPERATOR_FINISHED; +} + + +void NODE_OT_read_fullsamplelayers(wmOperatorType *ot) +{ + + ot->name= "Read Full Sample Layers"; + ot->idname= "NODE_OT_read_fullsamplelayers"; + + ot->exec= node_read_fullsamplelayers_exec; + + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= 0; +} + + +/* ************************* */ + void imagepaint_composite_tags(bNodeTree *ntree, Image *image, ImageUser *iuser) { bNode *node; @@ -1725,6 +1974,8 @@ static int node_group_make_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } } + + ED_preview_kill_jobs(C); gnode= nodeMakeGroupFromSelected(snode->nodetree); if(gnode==NULL) { @@ -1758,49 +2009,144 @@ void NODE_OT_group_make(wmOperatorType *ot) /* ****************** Hide operator *********************** */ +static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag) +{ + int tot_eq= 0, tot_neq= 0; + bNode *node; + + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + + if(toggle_flag== NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW)==0) + continue; + + if(node->flag & toggle_flag) + tot_eq++; + else + tot_neq++; + } + } + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + + if(toggle_flag== NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW)==0) + continue; + + if( (tot_eq && tot_neq) || tot_eq==0) + node->flag |= toggle_flag; + else + node->flag &= ~toggle_flag; + } + } +} + static int node_hide_exec(bContext *C, wmOperator *op) { SpaceNode *snode= CTX_wm_space_node(C); - bNode *node; - int nothidden=0, ishidden=0; /* sanity checking (poll callback checks this already) */ if((snode == NULL) || (snode->edittree == NULL)) return OPERATOR_CANCELLED; - for(node= snode->edittree->nodes.first; node; node= node->next) { - if(node->flag & SELECT) { - if(node->flag & NODE_HIDDEN) - ishidden++; - else - nothidden++; - } - } - for(node= snode->edittree->nodes.first; node; node= node->next) { - if(node->flag & SELECT) { - if( (ishidden && nothidden) || ishidden==0) - node->flag |= NODE_HIDDEN; - else - node->flag &= ~NODE_HIDDEN; - } - } + node_flag_toggle_exec(snode, NODE_HIDDEN); snode_notify(C, snode); return OPERATOR_FINISHED; } -void NODE_OT_hide(wmOperatorType *ot) +void NODE_OT_hide_toggle(wmOperatorType *ot) { /* identifiers */ ot->name= "Hide"; - ot->description= "Toggle hiding of the nodes"; - ot->idname= "NODE_OT_hide"; + ot->description= "Toggle hiding of selected nodes"; + ot->idname= "NODE_OT_hide_toggle"; /* callbacks */ ot->exec= node_hide_exec; ot->poll= ED_operator_node_active; - + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int node_preview_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode= CTX_wm_space_node(C); + + /* sanity checking (poll callback checks this already) */ + if((snode == NULL) || (snode->edittree == NULL)) + return OPERATOR_CANCELLED; + + ED_preview_kill_jobs(C); + + node_flag_toggle_exec(snode, NODE_PREVIEW); + + snode_notify(C, snode); + + return OPERATOR_FINISHED; +} + +void NODE_OT_preview_toggle(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Toggle Node Preview"; + ot->description= "Toggle preview display for selected nodes"; + ot->idname= "NODE_OT_preview_toggle"; + + /* callbacks */ + ot->exec= node_preview_exec; + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int node_socket_toggle_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode= CTX_wm_space_node(C); + bNode *node; + int hidden= 0; + + /* sanity checking (poll callback checks this already) */ + if((snode == NULL) || (snode->edittree == NULL)) + return OPERATOR_CANCELLED; + + ED_preview_kill_jobs(C); + + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + if(node_has_hidden_sockets(node)) { + hidden= 1; + break; + } + } + } + + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + node_set_hidden_sockets(snode, node, !hidden); + } + } + + node_tree_verify_groups(snode->nodetree); + + snode_notify(C, snode); + + return OPERATOR_FINISHED; +} + +void NODE_OT_hide_socket_toggle(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Toggle Hidden Node Sockets"; + ot->description= "Toggle unused node socket display"; + ot->idname= "NODE_OT_hide_socket_toggle"; + + /* callbacks */ + ot->exec= node_socket_toggle_exec; + ot->poll= ED_operator_node_active; + /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } @@ -1816,6 +2162,8 @@ static int node_mute_exec(bContext *C, wmOperator *op) if(node_tree_get_editgroup(snode->nodetree)) return OPERATOR_CANCELLED; + ED_preview_kill_jobs(C); + for(node= snode->edittree->nodes.first; node; node= node->next) { if(node->flag & SELECT) { if(node->inputs.first && node->outputs.first) { @@ -1830,12 +2178,12 @@ static int node_mute_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void NODE_OT_mute(wmOperatorType *ot) +void NODE_OT_mute_toggle(wmOperatorType *ot) { /* identifiers */ - ot->name= "Mute"; + ot->name= "Toggle Node Mute"; ot->description= "Toggle muting of the nodes"; - ot->idname= "NODE_OT_mute"; + ot->idname= "NODE_OT_mute_toggle"; /* callbacks */ ot->exec= node_mute_exec; @@ -1852,6 +2200,8 @@ static int node_delete_exec(bContext *C, wmOperator *op) SpaceNode *snode= CTX_wm_space_node(C); bNode *node, *next; + ED_preview_kill_jobs(C); + for(node= snode->edittree->nodes.first; node; node= next) { next= node->next; if(node->flag & SELECT) { @@ -1912,4 +2262,95 @@ void NODE_OT_show_cyclic_dependencies(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/* ****************** Add File Node Operator ******************* */ + +static int node_add_file_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + SpaceNode *snode= CTX_wm_space_node(C); + bNode *node; + Image *ima= NULL; + int ntype=0; + + /* check input variables */ + if (RNA_property_is_set(op->ptr, "filepath")) + { + char path[FILE_MAX]; + RNA_string_get(op->ptr, "filepath", path); + + errno= 0; + + ima= BKE_add_image_file(path, scene ? scene->r.cfra : 1); + + if(!ima) { + BKE_reportf(op->reports, RPT_ERROR, "Can't read: \"%s\", %s.", path, errno ? strerror(errno) : "Unsupported image format"); + return OPERATOR_CANCELLED; + } + } + else if(RNA_property_is_set(op->ptr, "name")) + { + char name[32]; + RNA_string_get(op->ptr, "name", name); + ima= (Image *)find_id("IM", name); + + if(!ima) { + BKE_reportf(op->reports, RPT_ERROR, "Image named \"%s\", not found.", name); + return OPERATOR_CANCELLED; + } + } + + node_deselectall(snode); + + if (snode->nodetree->type==NTREE_COMPOSIT) + ntype = CMP_NODE_IMAGE; + + ED_preview_kill_jobs(C); + + node = node_add_node(snode, scene, ntype, snode->mx, snode->my); + + if (!node) { + BKE_report(op->reports, RPT_ERROR, "Could not add an image node."); + return OPERATOR_CANCELLED; + } + + node->id = (ID *)ima; + + snode_notify(C, snode); + + return OPERATOR_FINISHED; +} + +static int node_add_file_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + SpaceNode *snode= CTX_wm_space_node(C); + + /* convert mouse coordinates to v2d space */ + UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, + &snode->mx, &snode->my); + + if (RNA_property_is_set(op->ptr, "filepath") || RNA_property_is_set(op->ptr, "name")) + return node_add_file_exec(C, op); + else + return WM_operator_filesel(C, op, event); +} + +void NODE_OT_add_file(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add File Node"; + ot->description= "Add a file node to the current node editor"; + ot->idname= "NODE_OT_add_file"; + + /* callbacks */ + ot->exec= node_add_file_exec; + ot->invoke= node_add_file_invoke; + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH); //XXX TODO, relative_path + RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign."); +} diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index 168d2524995..3ed719eccc0 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -31,11 +31,8 @@ #include "DNA_space_types.h" #include "DNA_node_types.h" -#include "DNA_material_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -47,9 +44,6 @@ #include "BKE_main.h" #include "BKE_utildefines.h" -#include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" #include "WM_api.h" #include "WM_types.h" @@ -58,8 +52,6 @@ #include "BIF_glutil.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "node_intern.h" diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 3a9a2e8ad83..77fda0627e7 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -62,6 +62,9 @@ void NODE_OT_select_linked_from(wmOperatorType *ot); void NODE_OT_visibility_toggle(struct wmOperatorType *ot); void NODE_OT_view_all(struct wmOperatorType *ot); void NODE_OT_select_border(struct wmOperatorType *ot); +void NODE_OT_select_same_type(struct wmOperatorType *ot); +void NODE_OT_select_same_type_next(wmOperatorType *ot); +void NODE_OT_select_same_type_prev(wmOperatorType *ot); /* drawnode.c */ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link); @@ -80,11 +83,15 @@ void snode_set_context(SpaceNode *snode, Scene *scene); void snode_make_group_editable(SpaceNode *snode, bNode *gnode); void node_set_active(SpaceNode *snode, bNode *node); void node_deselectall(SpaceNode *snode); +int node_select_same_type(SpaceNode *snode); +int node_select_same_type_np(SpaceNode *snode, int dir); void snode_composite_job(const struct bContext *C, ScrArea *sa); bNode *node_tree_get_editgroup(bNodeTree *ntree); void node_tree_verify_groups(bNodeTree *nodetree); void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace); int node_has_hidden_sockets(bNode *node); +void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set); + void NODE_OT_duplicate(struct wmOperatorType *ot); void NODE_OT_delete(struct wmOperatorType *ot); @@ -98,10 +105,19 @@ void NODE_OT_group_make(struct wmOperatorType *ot); void NODE_OT_group_ungroup(struct wmOperatorType *ot); void NODE_OT_group_edit(struct wmOperatorType *ot); -void NODE_OT_mute(struct wmOperatorType *ot); -void NODE_OT_hide(struct wmOperatorType *ot); +void NODE_OT_mute_toggle(struct wmOperatorType *ot); +void NODE_OT_hide_toggle(struct wmOperatorType *ot); +void NODE_OT_hide_socket_toggle(struct wmOperatorType *ot); +void NODE_OT_preview_toggle(struct wmOperatorType *ot); void NODE_OT_show_cyclic_dependencies(struct wmOperatorType *ot); +void NODE_OT_link_viewer(struct wmOperatorType *ot); +void NODE_OT_read_fullsamplelayers(struct wmOperatorType *ot); +void NODE_OT_read_renderlayers(struct wmOperatorType *ot); +void NODE_OT_backimage_move(struct wmOperatorType *ot); +void NODE_OT_backimage_zoom(struct wmOperatorType *ot); + +void NODE_OT_add_file(struct wmOperatorType *ot); // XXXXXX diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 4ce56f96146..654fdc6800e 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,20 +27,15 @@ */ #include "DNA_node_types.h" -#include "DNA_material_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" #include "BKE_context.h" #include "BKE_node.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_transform.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" @@ -56,11 +51,16 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_select_linked_to); WM_operatortype_append(NODE_OT_select_linked_from); WM_operatortype_append(NODE_OT_select_border); - + WM_operatortype_append(NODE_OT_select_same_type); + WM_operatortype_append(NODE_OT_select_same_type_next); + WM_operatortype_append(NODE_OT_select_same_type_prev); + WM_operatortype_append(NODE_OT_view_all); WM_operatortype_append(NODE_OT_visibility_toggle); - WM_operatortype_append(NODE_OT_mute); - WM_operatortype_append(NODE_OT_hide); + WM_operatortype_append(NODE_OT_mute_toggle); + WM_operatortype_append(NODE_OT_hide_toggle); + WM_operatortype_append(NODE_OT_preview_toggle); + WM_operatortype_append(NODE_OT_hide_socket_toggle); WM_operatortype_append(NODE_OT_show_cyclic_dependencies); WM_operatortype_append(NODE_OT_duplicate); @@ -74,17 +74,30 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_group_make); WM_operatortype_append(NODE_OT_group_ungroup); WM_operatortype_append(NODE_OT_group_edit); + + WM_operatortype_append(NODE_OT_link_viewer); + + WM_operatortype_append(NODE_OT_read_renderlayers); + WM_operatortype_append(NODE_OT_read_fullsamplelayers); + + WM_operatortype_append(NODE_OT_backimage_move); + WM_operatortype_append(NODE_OT_backimage_zoom); + + WM_operatortype_append(NODE_OT_add_file); } void ED_operatormacros_node(void) { wmOperatorType *ot; - wmOperatorTypeMacro *otmacro; ot= WM_operatortype_append_macro("NODE_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); WM_operatortype_macro_define(ot, "NODE_OT_duplicate"); - otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); - RNA_enum_set(otmacro->ptr, "proportional", 0); + WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); + + ot= WM_operatortype_append_macro("NODE_OT_select_link_viewer", "Link Viewer", OPTYPE_UNDO); + WM_operatortype_macro_define(ot, "NODE_OT_select"); + WM_operatortype_macro_define(ot, "NODE_OT_link_viewer"); + } void node_keymap(struct wmKeyConfig *keyconf) @@ -117,14 +130,25 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_visibility_toggle", LEFTMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "NODE_OT_select_link_viewer", LEFTMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + + WM_keymap_add_item(keymap, "NODE_OT_backimage_move", MIDDLEMOUSE, KM_PRESS, KM_ALT, 0); + kmi= WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, 0, 0); + RNA_float_set(kmi->ptr, "factor", 0.83333f); + kmi= WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, KM_ALT, 0); + RNA_float_set(kmi->ptr, "factor", 1.2f); + + WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "replace", 1); WM_keymap_add_menu(keymap, "NODE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "NODE_OT_hide", HKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "NODE_OT_mute", MKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_hide_toggle", HKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_mute_toggle", MKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_preview_toggle", HKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "NODE_OT_hide_socket_toggle", HKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "NODE_OT_show_cyclic_dependencies", CKEY, KM_PRESS, 0, 0); @@ -132,14 +156,21 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_select_border", BKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_select_linked_to", LKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_select_linked_from", LKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_select_same_type", GKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "NODE_OT_select_same_type_next", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "NODE_OT_select_same_type_prev", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_group_make", GKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "NODE_OT_group_ungroup", GKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "NODE_OT_group_edit", TABKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_read_renderlayers", RKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0); + transform_keymap_for_space(keyconf, keymap, SPACE_NODE); } diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 055290fbb66..ccd1555e1a2 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,11 +29,7 @@ #include #include "DNA_node_types.h" -#include "DNA_material_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "BKE_context.h" #include "BKE_node.h" @@ -42,7 +38,6 @@ #include "BLI_rect.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_types.h" @@ -117,9 +112,6 @@ static int node_select_exec(bContext *C, wmOperator *op) /* perform the select */ node= node_mouse_select(snode, ar, mval, extend); - /* need refresh/a notifier vs compo notifier */ - WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */ - /* WATCH THIS, there are a few other ways to change the active material */ if(node) { if (node->id && ELEM(GS(node->id->name), ID_MA, ID_TE)) { @@ -127,8 +119,8 @@ static int node_select_exec(bContext *C, wmOperator *op) } } - /* send notifiers */ - WM_event_add_notifier(C, NC_NODE|ND_NODE_SELECT, NULL); + /* send notifiers */ + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); /* allow tweak event to work too */ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; @@ -196,7 +188,7 @@ static int node_borderselect_exec(bContext *C, wmOperator *op) } } - WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */ + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -272,7 +264,7 @@ static int node_select_all_exec(bContext *C, wmOperator *op) node->flag |= NODE_SELECT; } - WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -312,7 +304,7 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *op) node->flag |= NODE_SELECT; } - WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -352,7 +344,7 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *op) node->flag |= NODE_SELECT; } - WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -371,3 +363,78 @@ void NODE_OT_select_linked_from(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } +/* ****** Select Same Type ****** */ + +static int node_select_same_type_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode = CTX_wm_space_node(C); + + node_select_same_type(snode); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); + return OPERATOR_FINISHED; +} + +void NODE_OT_select_same_type(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Same Type"; + ot->description = "Select all the same type"; + ot->idname = "NODE_OT_select_same_type"; + + /* api callbacks */ + ot->exec = node_select_same_type_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ****** Select The Next/Prev Node Of The Same Type ****** */ + +static int node_select_same_type_next_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode = CTX_wm_space_node(C); + + node_select_same_type_np(snode, 0); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); + return OPERATOR_FINISHED; +} + +void NODE_OT_select_same_type_next(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Same Type Next"; + ot->description = "Select the next node of the same type."; + ot->idname = "NODE_OT_select_same_type_next"; + + /* api callbacks */ + ot->exec = node_select_same_type_next_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int node_select_same_type_prev_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode = CTX_wm_space_node(C); + + node_select_same_type_np(snode, 1); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); + return OPERATOR_FINISHED; +} + +void NODE_OT_select_same_type_prev(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Same Type Prev"; + ot->description = "Select the prev node of the same type."; + ot->idname = "NODE_OT_select_same_type_prev"; + + /* api callbacks */ + ot->exec = node_select_same_type_prev_exec; + ot->poll = ED_operator_node_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c index e754903efc5..6b3cfd11135 100644 --- a/source/blender/editors/space_node/node_state.c +++ b/source/blender/editors/space_node/node_state.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,11 +29,7 @@ #include #include "DNA_node_types.h" -#include "DNA_material_types.h" -#include "DNA_texture_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "BKE_context.h" #include "BKE_node.h" @@ -41,9 +37,7 @@ #include "BLI_rect.h" -#include "ED_space_api.h" #include "ED_screen.h" -#include "ED_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -57,12 +51,13 @@ /* **************** Node Header Buttons ************** */ -static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) -{ +/* note: call node_tree_verify_groups(snode->nodetree) after this + */ +void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) +{ bNodeSocket *sock; - - /* unhide all */ - if( node_has_hidden_sockets(node) ) { + + if(set==0) { for(sock= node->inputs.first; sock; sock= sock->next) sock->flag &= ~SOCK_HIDDEN; for(sock= node->outputs.first; sock; sock= sock->next) @@ -70,7 +65,7 @@ static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) } else { bNode *gnode= node_tree_get_editgroup(snode->nodetree); - + /* hiding inside group should not break links in other group users */ if(gnode) { nodeGroupSocketUseFlags((bNodeTree *)gnode->id); @@ -95,7 +90,11 @@ static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) } } } +} +static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) +{ + node_set_hidden_sockets(snode, node, !node_has_hidden_sockets(node)); node_tree_verify_groups(snode->nodetree); } diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index fb36c53e9fa..5b681958a3a 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,10 +32,7 @@ #include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_material_types.h" -#include "DNA_texture_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -49,7 +46,6 @@ #include "BKE_node.h" #include "ED_render.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -57,7 +53,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -141,8 +136,8 @@ static SpaceLink *node_new(const bContext *C) ar->v2d.max[0]= 32000.0f; ar->v2d.max[1]= 32000.0f; - ar->v2d.minzoom= 0.2f; - ar->v2d.maxzoom= 1.21f; + ar->v2d.minzoom= 0.09f; + ar->v2d.maxzoom= 2.31f; ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT; @@ -205,7 +200,8 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn) ED_area_tag_redraw(sa); break; case NC_NODE: - ED_area_tag_refresh(sa); + if (wmn->action == NA_EDITED) + ED_area_tag_refresh(sa); break; } } @@ -268,6 +264,7 @@ static void node_buttons_area_draw(const bContext *C, ARegion *ar) static void node_main_area_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; + ListBase *lb; UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); @@ -277,6 +274,11 @@ static void node_main_area_init(wmWindowManager *wm, ARegion *ar) keymap= WM_keymap_find(wm->defaultconf, "Node Editor", SPACE_NODE, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); + + /* add drop boxes */ + lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); + + WM_event_add_dropbox_handler(&ar->handlers, lb); } static void node_main_area_draw(const bContext *C, ARegion *ar) @@ -286,6 +288,47 @@ static void node_main_area_draw(const bContext *C, ARegion *ar) drawnodespace(C, ar, v2d); } + +/* ************* dropboxes ************* */ + +static int node_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) +{ + if(drag->type==WM_DRAG_ID) { + ID *id= (ID *)drag->poin; + if( GS(id->name)==ID_IM ) + return 1; + } + else if(drag->type==WM_DRAG_PATH){ + if(ELEM(drag->icon, 0, ICON_FILE_IMAGE)) /* rule might not work? */ + return 1; + } + return 0; +} + +static void node_id_path_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + ID *id= (ID *)drag->poin; + + if(id) { + RNA_string_set(drop->ptr, "name", id->name+2); + } + if (drag->path[0]) { + RNA_string_set(drop->ptr, "filepath", drag->path); + } +} + +/* this region dropbox definition */ +static void node_dropboxes(void) +{ + ListBase *lb= WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); + + WM_dropbox_add(lb, "NODE_OT_add_file", node_drop_poll, node_id_path_drop_copy); + +} + +/* ************* end drop *********** */ + + /* add handlers, stuff you only do once or on area/region changes */ static void node_header_area_init(wmWindowManager *wm, ARegion *ar) { @@ -297,7 +340,7 @@ static void node_header_area_draw(const bContext *C, ARegion *ar) SpaceNode *snode= CTX_wm_space_node(C); Scene *scene= CTX_data_scene(C); - /* find and set the context */ + /* find and set the context */ snode_set_context(snode, scene); ED_region_header(C, ar); @@ -346,6 +389,7 @@ static int node_context(const bContext *C, const char *member, bContextDataResul CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node); } } + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } @@ -370,6 +414,7 @@ void ED_spacetype_node(void) st->listener= node_area_listener; st->refresh= node_area_refresh; st->context= node_context; + st->dropboxes = node_dropboxes; /* regions: main window */ art= MEM_callocN(sizeof(ARegionType), "spacetype node region"); diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt new file mode 100644 index 00000000000..78c4fcbdd8d --- /dev/null +++ b/source/blender/editors/space_outliner/CMakeLists.txt @@ -0,0 +1,36 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../imbuf + ../include + ../../../../intern/guardedalloc + ../../../../intern/opennl/extern + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_outliner "${SRC}" "${INC}") diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 8a07e99e280..95e2cb920fc 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -27,6 +27,7 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include #include #include #include @@ -34,34 +35,29 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_curve_types.h" #include "DNA_camera_types.h" -#include "DNA_image_types.h" -#include "DNA_ipo_types.h" #include "DNA_group_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meta_types.h" -#include "DNA_modifier_types.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" -#include "DNA_outliner_types.h" #include "DNA_particle_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_texture_types.h" -#include "DNA_text_types.h" #include "DNA_world_types.h" #include "DNA_sequence_types.h" #include "BLI_blenlib.h" +#if defined WIN32 && !defined _LIBC +# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */ +#else +# define _GNU_SOURCE +# include +#endif + #include "IMB_imbuf_types.h" #include "BKE_animsys.h" @@ -87,7 +83,6 @@ #include "ED_object.h" #include "ED_screen.h" #include "ED_util.h" -#include "ED_types.h" #include "WM_api.h" #include "WM_types.h" @@ -103,16 +98,10 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "ED_armature.h" #include "ED_keyframing.h" -#include "ED_object.h" -#include "ED_particle.h" -#include "ED_screen.h" -#include "ED_view3d.h" #include "outliner_intern.h" -#include "PIL_time.h" #define OL_H 19 @@ -134,7 +123,7 @@ /* ************* XXX **************** */ -static void error() {} +static void error(const char *dummy, ...) {} /* ********************************** */ @@ -144,6 +133,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb, void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *)); +static int group_select_flag(Group *gr); /* ******************** PERSISTANT DATA ***************** */ @@ -445,78 +435,91 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb) static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv, TreeElement *parent, short type, short index); +#define LOG2I(x) (int)(log(x)/log(2.0)) static void outliner_add_passes(SpaceOops *soops, TreeElement *tenla, ID *id, SceneRenderLayer *srl) { - TreeStoreElem *tselem= TREESTORE(tenla); - TreeElement *te; + TreeStoreElem *tselem = NULL; + TreeElement *te = NULL; + + /* log stuff is to convert bitflags (powers of 2) to small integers, + * in order to not overflow short tselem->nr */ - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_COMBINED); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_COMBINED)); te->name= "Combined"; te->directdata= &srl->passflag; /* save cpu cycles, but we add the first to invoke an open/close triangle */ + tselem = TREESTORE(tenla); if(tselem->flag & TSE_CLOSED) return; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_Z); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_Z)); te->name= "Z"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_VECTOR); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_VECTOR)); te->name= "Vector"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_NORMAL); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_NORMAL)); te->name= "Normal"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_UV); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_UV)); te->name= "UV"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_MIST); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_MIST)); te->name= "Mist"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_INDEXOB); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDEXOB)); te->name= "Index Object"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_RGBA); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_RGBA)); te->name= "Color"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_DIFFUSE); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_DIFFUSE)); te->name= "Diffuse"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_SPEC); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_SPEC)); te->name= "Specular"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_SHADOW); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_SHADOW)); te->name= "Shadow"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_AO); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_AO)); te->name= "AO"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_REFLECT); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_REFLECT)); te->name= "Reflection"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_REFRACT); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_REFRACT)); te->name= "Refraction"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_RADIO); - te->name= "Radiosity"; + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDIRECT)); + te->name= "Indirect"; + te->directdata= &srl->passflag; + + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_ENVIRONMENT)); + te->name= "Environment"; + te->directdata= &srl->passflag; + + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_EMIT)); + te->name= "Emit"; te->directdata= &srl->passflag; - } +#undef LOG2I /* special handling of hierarchical non-lib data */ static void outliner_add_bone(SpaceOops *soops, ListBase *lb, ID *id, Bone *curBone, @@ -1245,6 +1248,86 @@ void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index) } } +static int outliner_filter_has_name(TreeElement *te, char *name, int flags) +{ +#if 0 + int found= 0; + + /* determine if match */ + if (flags & SO_FIND_CASE_SENSITIVE) { + if (flags & SO_FIND_COMPLETE) + found= strcmp(te->name, name) == 0; + else + found= strstr(te->name, name) != NULL; + } + else { + if (flags & SO_FIND_COMPLETE) + found= BLI_strcasecmp(te->name, name) == 0; + else + found= BLI_strcasestr(te->name, name) != NULL; + } +#else + + int fn_flag= 0; + int found= 0; + + if ((flags & SO_FIND_CASE_SENSITIVE) == 0) + fn_flag |= FNM_CASEFOLD; + + if (flags & SO_FIND_COMPLETE) { + found= fnmatch(name, te->name, fn_flag)==0; + } + else { + char fn_name[sizeof(((struct SpaceOops *)NULL)->search_string) + 2]; + sprintf(fn_name, "*%s*", name); + found= fnmatch(fn_name, te->name, fn_flag)==0; + } + return found; +#endif +} + +static int outliner_filter_tree(SpaceOops *soops, ListBase *lb) +{ + TreeElement *te, *ten; + TreeStoreElem *tselem; + + /* although we don't have any search string, we return TRUE + * since the entire tree is ok then... + */ + if (soops->search_string[0]==0) + return 1; + + for (te= lb->first; te; te= ten) { + ten= te->next; + + if (0==outliner_filter_has_name(te, soops->search_string, soops->search_flags)) { + /* item isn't something we're looking for, but... + * - if the subtree is expanded, check if there are any matches that can be easily found + * so that searching for "cu" in the default scene will still match the Cube + * - otherwise, we can't see within the subtree and the item doesn't match, + * so these can be safely ignored (i.e. the subtree can get freed) + */ + tselem= TREESTORE(te); + + if ((tselem->flag & TSE_CLOSED) || outliner_filter_tree(soops, &te->subtree)==0) { + outliner_free_tree(&te->subtree); + BLI_remlink(lb, te); + + if(te->flag & TE_FREE_NAME) MEM_freeN(te->name); + MEM_freeN(te); + } + } + else { + /* filter subtree too */ + outliner_filter_tree(soops, &te->subtree); + } + } + + /* if there are still items in the list, that means that there were still some matches */ + return (lb->first != NULL); +} + + static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops) { Base *base; @@ -1328,7 +1411,7 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops) GroupObject *go; for(group= mainvar->group.first; group; group= group->id.next) { - if(group->id.us) { + if(group->gobject.first) { te= outliner_add_element(soops, &soops->tree, group, NULL, 0, 0); tselem= TREESTORE(te); @@ -1426,6 +1509,7 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops) } outliner_sort(soops, &soops->tree); + outliner_filter_tree(soops, &soops->tree); } /* **************** INTERACTIVE ************* */ @@ -1550,8 +1634,6 @@ void OUTLINER_OT_selectability_toggle(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -/* --- */ - void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { Base *base= (Base *)te->directdata; @@ -1845,7 +1927,8 @@ static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *so /* we search for the object parent */ ob= (Object *)outliner_search_back(soops, te, ID_OB); - if(ob==NULL || ob!=OBACT) return 0; // just paranoia + // note: ob->matbits can be NULL when a local object points to a library mesh. + if(ob==NULL || ob!=OBACT || ob->matbits==NULL) return 0; // just paranoia /* searching in ob mat array? */ tes= te->parent; @@ -2140,7 +2223,7 @@ static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te, if(set) { Object *ob= (Object *)tselem->id; - WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); // XXX extern_set_butspace(F7KEY, 0); } @@ -2265,7 +2348,6 @@ static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeSto /* Context can be NULL when set==0 */ static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, int set) { - switch(tselem->type) { case TSE_DEFGROUP: return tree_element_active_defgroup(C, scene, te, tselem, set); @@ -2343,12 +2425,46 @@ static int do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, Spa ED_screen_set_scene(C, (Scene *)tselem->id); } } + else if(te->idcode==ID_GR) { + Group *gr= (Group *)tselem->id; + GroupObject *gob; + + if(extend) { + int sel= BA_SELECT; + for(gob= gr->gobject.first; gob; gob= gob->next) { + if(gob->ob->flag & SELECT) { + sel= BA_DESELECT; + break; + } + } + + for(gob= gr->gobject.first; gob; gob= gob->next) { + ED_base_object_select(object_in_scene(gob->ob, scene), sel); + } + } + else { + scene_deselect_all(scene); + + for(gob= gr->gobject.first; gob; gob= gob->next) { + if((gob->ob->flag & SELECT) == 0) + ED_base_object_select(object_in_scene(gob->ob, scene), BA_SELECT); + } + } + + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); + } else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) { Object *obedit= CTX_data_edit_object(C); if(obedit) ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO); else { - ED_object_enter_editmode(C, EM_WAITCURSOR); + Object *ob= CTX_data_active_object(C); + + /* Don't allow edit mode if the object is hide! + * check the bug #22153 and #21609 + */ + if (ob && (!(ob->restrictflag & OB_RESTRICT_VIEW))) + ED_object_enter_editmode(C, EM_WAITCURSOR); // XXX extern_set_butspace(F9KEY, 0); } } else { // rest of types @@ -2655,17 +2771,7 @@ static TreeElement *outliner_find_named(SpaceOops *soops, ListBase *lb, char *na TreeElement *te, *tes; for (te= lb->first; te; te= te->next) { - int found; - - /* determine if match */ - if(flags==OL_FIND) - found= BLI_strcasestr(te->name, name)!=NULL; - else if(flags==OL_FIND_CASE) - found= strstr(te->name, name)!=NULL; - else if(flags==OL_FIND_COMPLETE) - found= BLI_strcasecmp(te->name, name)==0; - else - found= strcmp(te->name, name)==0; + int found = outliner_filter_has_name(te, name, flags); if(found) { /* name is right, but is element the previous one? */ @@ -2721,7 +2827,7 @@ void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again, TreeElement *last_find; TreeStoreElem *tselem; int ytop, xdelta, prevFound=0; - char name[33]; + char name[32]; /* get last found tree-element based on stored search_tse */ last_find= outliner_find_tse(soops, &soops->search_tse); @@ -2729,7 +2835,7 @@ void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again, /* determine which type of search to do */ if (again && last_find) { /* no popup panel - previous + user wanted to search for next after previous */ - BLI_strncpy(name, soops->search_string, 33); + BLI_strncpy(name, soops->search_string, sizeof(name)); flags= soops->search_flags; /* try to find matching element */ @@ -3018,7 +3124,6 @@ static void unlink_group_cb(bContext *C, Scene *scene, TreeElement *te, TreeStor if( GS(tsep->id->name)==ID_OB) { Object *ob= (Object *)tsep->id; ob->dup_group= NULL; - group->id.us--; } } else { @@ -3328,6 +3433,9 @@ static EnumPropertyItem prop_group_op_types[] = { {1, "UNLINK", 0, "Unlink", ""}, {2, "LOCAL", 0, "Make Local", ""}, {3, "LINK", 0, "Link Group Objects to Scene", ""}, + {4, "TOGVIS", 0, "Toggle Visible", ""}, + {5, "TOGSEL", 0, "Toggle Selectable", ""}, + {6, "TOGREN", 0, "Toggle Renderable", ""}, {0, NULL, 0, NULL, NULL} }; @@ -3354,7 +3462,7 @@ static int outliner_group_operation_exec(bContext *C, wmOperator *op) else if(event==3) { outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_linkobs2scene_cb); ED_undo_push(C, "Link Group Objects to Scene"); - } + } WM_event_add_notifier(C, NC_GROUP, NULL); @@ -3786,7 +3894,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m short groupmode= KSP_GROUP_KSNAME; /* check if RNA-property described by this selected element is an animateable prop */ - if ((tselem->type == TSE_RNA_PROPERTY) && RNA_property_animateable(&te->rnaptr, te->directdata)) { + if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM) && RNA_property_animateable(&te->rnaptr, te->directdata)) { /* get id + path + index info from the selected element */ tree_element_to_path(soops, te, tselem, &id, &path, &array_index, &flag, &groupmode); @@ -3794,7 +3902,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m /* only if ID and path were set, should we perform any actions */ if (id && path) { - int arraylen; + int arraylen = 1; /* array checks */ if (flag & KSP_FLAG_WHOLE_ARRAY) { @@ -4101,11 +4209,11 @@ static void tselem_draw_icon_uibut(struct DrawIconArg *arg, int icon) if(arg->x >= arg->xmax) UI_icon_draw(arg->x, arg->y, icon); else { - uiBut *but= uiDefIconBut(arg->block, LABEL, 0, icon, arg->x-4, arg->y, ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH, NULL, 0.0, 0.0, 1.0, arg->alpha, ""); + uiBut *but= uiDefIconBut(arg->block, LABEL, 0, icon, arg->x-4, arg->y, ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH, NULL, 0.0, 0.0, 1.0, arg->alpha, (arg->id && arg->id->lib) ? arg->id->lib->name : ""); if(arg->id) uiButSetDragID(but, arg->id); } - + } static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeStoreElem *tselem, TreeElement *te, float alpha) @@ -4210,6 +4318,8 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto UI_icon_draw(x, y, ICON_MOD_SMOKE); break; case eModifierType_Solidify: UI_icon_draw(x, y, ICON_MOD_SOLIDIFY); break; + case eModifierType_Screw: + UI_icon_draw(x, y, ICON_MOD_SCREW); break; default: UI_icon_draw(x, y, ICON_DOT); break; } @@ -4226,7 +4336,7 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto case TSE_R_LAYER_BASE: UI_icon_draw(x, y, ICON_RENDERLAYERS); break; case TSE_R_LAYER: - UI_icon_draw(x, y, ICON_RENDER_RESULT); break; + UI_icon_draw(x, y, ICON_RENDERLAYERS); break; case TSE_LINKED_LAMP: UI_icon_draw(x, y, ICON_LAMP_DATA); break; case TSE_LINKED_MAT: @@ -4427,6 +4537,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene active= 2; } } + else if(te->idcode==ID_GR) { + Group *gr = (Group *)tselem->id; + + if(group_select_flag(gr)) { + char col[4]; + UI_GetThemeColorType4ubv(TH_SELECT, SPACE_VIEW3D, col); + col[3]= 100; + glColor4ubv((GLubyte *)col); + + active= 2; + } + } else if(te->idcode==ID_OB) { Object *ob= (Object *)tselem->id; @@ -4721,6 +4843,16 @@ static void restrictbutton_view_cb(bContext *C, void *poin, void *poin2) Base *base; Scene *scene = (Scene *)poin; Object *ob = (Object *)poin2; + Object *obedit= CTX_data_edit_object(C); + + /* Don't allow hide an objet in edit mode, + * check the bug #22153 and #21609 + */ + if (obedit && obedit == ob) { + if (ob->restrictflag & OB_RESTRICT_VIEW) + ob->restrictflag &= ~OB_RESTRICT_VIEW; + return; + } /* deselect objects that are invisible */ if (ob->restrictflag & OB_RESTRICT_VIEW) { @@ -4772,11 +4904,9 @@ static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *poin2) static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2) { - Scene *scene = (Scene *)poin; Object *ob = (Object *)poin2; DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - object_handle_update(scene, ob); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); } @@ -4786,6 +4916,73 @@ static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2) WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); } + +static int group_restrict_flag(Group *gr, int flag) +{ + GroupObject *gob; + + for(gob= gr->gobject.first; gob; gob= gob->next) { + if((gob->ob->restrictflag & flag) == 0) + return 0; + } + + return 1; +} + +static int group_select_flag(Group *gr) +{ + GroupObject *gob; + + for(gob= gr->gobject.first; gob; gob= gob->next) + if((gob->ob->flag & SELECT)) + return 1; + + return 0; +} + +static void restrictbutton_gr_restrict_flag(bContext *C, void *poin, void *poin2, int flag) +{ + Scene *scene = (Scene *)poin; + GroupObject *gob; + Group *gr = (Group *)poin2; + + if(group_restrict_flag(gr, flag)) { + for(gob= gr->gobject.first; gob; gob= gob->next) { + gob->ob->restrictflag &= ~flag; + + if(flag==OB_RESTRICT_VIEW) + if(gob->ob->flag & SELECT) + ED_base_object_select(object_in_scene(gob->ob, scene), BA_DESELECT); + } + } + else { + for(gob= gr->gobject.first; gob; gob= gob->next) { + gob->ob->restrictflag |= flag; + + if(flag==OB_RESTRICT_VIEW) + if((gob->ob->flag & SELECT) == 0) + ED_base_object_select(object_in_scene(gob->ob, scene), BA_SELECT); + } + } +} + +static void restrictbutton_gr_restrict_view(bContext *C, void *poin, void *poin2) +{ + restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_VIEW); + WM_event_add_notifier(C, NC_GROUP, NULL); +} +static void restrictbutton_gr_restrict_select(bContext *C, void *poin, void *poin2) +{ + restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_SELECT); + WM_event_add_notifier(C, NC_GROUP, NULL); +} +static void restrictbutton_gr_restrict_render(bContext *C, void *poin, void *poin2) +{ + restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_RENDER); + WM_event_add_notifier(C, NC_GROUP, NULL); +} + + static void namebutton_cb(bContext *C, void *tsep, char *oldname) { SpaceOops *soops= CTX_wm_space_outliner(C); @@ -4816,7 +5013,7 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname) if (te->idcode == ID_LI) { char expanded[FILE_MAXDIR + FILE_MAXFILE]; BLI_strncpy(expanded, ((Library *)tselem->id)->name, FILE_MAXDIR + FILE_MAXFILE); - BLI_convertstringcode(expanded, G.sce); + BLI_path_abs(expanded, G.sce); if (!BLI_exists(expanded)) { error("This path does not exist, correct this before saving"); } @@ -4903,29 +5100,57 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar TreeElement *te; TreeStoreElem *tselem; Object *ob = NULL; + Group *gr = NULL; for(te= lb->first; te; te= te->next) { tselem= TREESTORE(te); if(te->ys+2*OL_H >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) { /* objects have toggle-able restriction flags */ if(tselem->type==0 && te->idcode==ID_OB) { + PointerRNA ptr; + ob = (Object *)tselem->id; + RNA_pointer_create((ID *)ob, &RNA_Object, ob, &ptr); uiBlockSetEmboss(block, UI_EMBOSSN); - bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_VIEW, 0, ICON_RESTRICT_VIEW_OFF, - (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View"); + bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_VIEW_OFF, + (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, + &ptr, "restrict_view", -1, 0, 0, -1, -1, NULL); uiButSetFunc(bt, restrictbutton_view_cb, scene, ob); - bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_SELECT, 0, ICON_RESTRICT_SELECT_OFF, - (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View"); + bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_SELECT_OFF, + (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, + &ptr, "restrict_select", -1, 0, 0, -1, -1, NULL); uiButSetFunc(bt, restrictbutton_sel_cb, scene, ob); - bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, 0, ICON_RESTRICT_RENDER_OFF, - (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability"); + bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_RENDER_OFF, + (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, + &ptr, "restrict_render", -1, 0, 0, -1, -1, NULL); uiButSetFunc(bt, restrictbutton_rend_cb, scene, ob); uiBlockSetEmboss(block, UI_EMBOSS); + } + if(tselem->type==0 && te->idcode==ID_GR){ + int restrict_bool; + gr = (Group *)tselem->id; + + uiBlockSetEmboss(block, UI_EMBOSSN); + + restrict_bool= group_restrict_flag(gr, OB_RESTRICT_VIEW); + bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View"); + uiButSetFunc(bt, restrictbutton_gr_restrict_view, scene, gr); + + restrict_bool= group_restrict_flag(gr, OB_RESTRICT_SELECT); + bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View"); + uiButSetFunc(bt, restrictbutton_gr_restrict_select, scene, gr); + + restrict_bool= group_restrict_flag(gr, OB_RESTRICT_RENDER); + bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow renderability"); + uiButSetFunc(bt, restrictbutton_gr_restrict_render, scene, gr); + + uiBlockSetEmboss(block, UI_EMBOSS); + } /* scene render layers and passes have toggle-able flags too! */ else if(tselem->type==TSE_R_LAYER) { uiBlockSetEmboss(block, UI_EMBOSSN); @@ -4938,16 +5163,18 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar } else if(tselem->type==TSE_R_PASS) { int *layflag= te->directdata; + int passflag= 1<nr; + uiBlockSetEmboss(block, UI_EMBOSSN); - /* NOTE: tselem->nr is short! */ - bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, 0, ICON_CHECKBOX_HLT-1, + + bt= uiDefIconButBitI(block, ICONTOG, passflag, 0, ICON_CHECKBOX_HLT-1, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass"); uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL); layflag++; /* is lay_xor */ - if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO)) - bt= uiDefIconButBitI(block, TOG, tselem->nr, 0, (*layflag & tselem->nr)?ICON_DOT:ICON_BLANK1, + if(ELEM8(passflag, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_INDIRECT, SCE_PASS_EMIT, SCE_PASS_ENVIRONMENT)) + bt= uiDefIconButBitI(block, TOG, passflag, 0, (*layflag & passflag)?ICON_DOT:ICON_BLANK1, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined"); uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL); diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index c3a0165f945..fa3078a365b 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -45,7 +45,8 @@ typedef struct TreeElement { ListBase subtree; float xs, ys; // do selection int store_index; // offset in tree store - short flag, index; // flag for non-saved stuff, index for data arrays + short flag; // flag for non-saved stuff + short index; // index for data arrays short idcode; // from TreeStore id short xend; // width of item display, for select char *name; @@ -98,12 +99,6 @@ typedef struct TreeElement { #define TSE_KEYMAP 34 #define TSE_KEYMAP_ITEM 35 -/* outliner search flags */ -#define OL_FIND 0 -#define OL_FIND_CASE 1 -#define OL_FIND_COMPLETE 2 -#define OL_FIND_COMPLETE_CASE 3 - /* button events */ #define OL_NAMEBUTTON 1 @@ -146,21 +141,5 @@ void OUTLINER_OT_keyingset_remove_selected(struct wmOperatorType *ot); void OUTLINER_OT_drivers_add_selected(struct wmOperatorType *ot); void OUTLINER_OT_drivers_delete_selected(struct wmOperatorType *ot); -#if 0 -extern void outliner_mouse_event(Scene *scene, ARegion *ar, SpaceOops *soops, short event); -extern void outliner_toggle_visible(SpaceOops *soops); -extern void outliner_show_active(ARegion *ar, SpaceOops *soops); -extern void outliner_show_hierarchy(Scene *scene, SpaceOops *soops); -extern void outliner_one_level(SpaceOops *soops, int add); -extern void outliner_select(Scene *scene, SpaceOops *soops); -extern void outliner_toggle_selected(Scene *scene, SpaceOops *soops); -extern void outliner_toggle_visibility(Scene *scene, SpaceOops *soops); -extern void outliner_toggle_selectability(Scene *scene, SpaceOops *soops); -extern void outliner_toggle_renderability(Scene *scene, SpaceOops *soops); -extern void outliner_del(Scene *scene, SpaceOops *soops); -extern void outliner_page_up_down(Scene *scene, ARegion *ar, SpaceOops *soops, int up); -extern void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again, int flags); -#endif - #endif /* ED_OUTLINER_INTERN_H */ diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index fdfb89d32e3..d23e950a033 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,15 +29,12 @@ #include #include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "WM_api.h" #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "ED_screen.h" #include "outliner_intern.h" @@ -78,6 +75,8 @@ void outliner_keymap(wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Outliner", SPACE_OUTLINER, 0); + WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "extend", 0); RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 27d6c83cdb8..1c86eb4df70 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -29,16 +29,6 @@ #include #include -#include "DNA_color_types.h" -#include "DNA_object_types.h" -#include "DNA_outliner_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_texture_types.h" -#include "DNA_vec_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -52,7 +42,6 @@ #include "BKE_texture.h" #include "BKE_utildefines.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "WM_api.h" @@ -61,12 +50,9 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "RNA_access.h" -#include "RNA_types.h" #include "outliner_intern.h" @@ -85,11 +71,9 @@ static void outliner_main_area_draw(const bContext *C, ARegion *ar) { View2D *v2d= &ar->v2d; View2DScrollers *scrollers; - float col[3]; /* clear */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); draw_outliner(C); diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt new file mode 100644 index 00000000000..58b3affe2d4 --- /dev/null +++ b/source/blender/editors/space_script/CMakeLists.txt @@ -0,0 +1,40 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +IF(WITH_PYTHON) + SET(INC ${INC} ${PYTHON_INC} ../../python) +ELSE(WITH_PYTHON) + ADD_DEFINITIONS(-DDISABLE_PYTHON) +ENDIF(WITH_PYTHON) + +BLENDERLIB(bf_editor_space_script "${SRC}" "${INC}") diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c index cc90330459b..71b37e514d7 100644 --- a/source/blender/editors/space_script/script_edit.c +++ b/source/blender/editors/space_script/script_edit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,9 +29,6 @@ #include #include -#include "DNA_space_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -41,6 +38,7 @@ #include "BKE_global.h" #include "BKE_screen.h" #include "BKE_utildefines.h" +#include "BKE_report.h" #include "WM_api.h" #include "WM_types.h" @@ -49,25 +47,21 @@ #include "RNA_define.h" #include "ED_screen.h" -#include "ED_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "script_intern.h" // own include - +#ifndef DISABLE_PYTHON #include "BPY_extern.h" /* BPY_run_python_script */ +#endif static int run_pyfile_exec(bContext *C, wmOperator *op) { - ARegion *ar= CTX_wm_region(C); - - char path[512]; - RNA_string_get(op->ptr, "path", path); + RNA_string_get(op->ptr, "filepath", path); #ifndef DISABLE_PYTHON if(BPY_run_python_script(C, path, NULL, op->reports)) { + ARegion *ar= CTX_wm_region(C); ED_region_tag_redraw(ar); return OPERATOR_FINISHED; } @@ -87,6 +81,34 @@ void SCRIPT_OT_python_file_run(wmOperatorType *ot) ot->exec= run_pyfile_exec; ot->poll= ED_operator_areaactive; - RNA_def_string_file_path(ot->srna, "path", "", 512, "Path", ""); + RNA_def_string_file_path(ot->srna, "filepath", "", 512, "Path", ""); } + +static int script_reload_exec(bContext *C, wmOperator *op) +{ +#ifndef DISABLE_PYTHON + /* TODO, this crashes on netrender and keying sets, need to look into why + * disable for now unless running in debug mode */ + if(G.f & G_DEBUG) { + BPY_eval_string(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)"); + } + else { + BKE_reportf(op->reports, RPT_ERROR, "reloading is currently unstable, only operates in debug mode.\n"); + return OPERATOR_CANCELLED; + } + return OPERATOR_FINISHED; +#endif + return OPERATOR_CANCELLED; +} + +void SCRIPT_OT_reload(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reload Scripts"; + ot->description= "Reload Scripts"; + ot->idname= "SCRIPT_OT_reload"; + + /* api callbacks */ + ot->exec= script_reload_exec; +} diff --git a/source/blender/editors/space_script/script_header.c b/source/blender/editors/space_script/script_header.c index 2c08fd97bac..9c23d1b8131 100644 --- a/source/blender/editors/space_script/script_header.c +++ b/source/blender/editors/space_script/script_header.c @@ -29,10 +29,6 @@ #include #include -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -45,8 +41,6 @@ #include "ED_types.h" #include "ED_util.h" -#include "WM_api.h" -#include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h index c24aae600c8..ed625bb8ec6 100644 --- a/source/blender/editors/space_script/script_intern.h +++ b/source/blender/editors/space_script/script_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -39,6 +39,7 @@ void script_operatortypes(void); void script_keymap(struct wmKeyConfig *keyconf); /* script_edit.c */ +void SCRIPT_OT_reload(struct wmOperatorType *ot); void SCRIPT_OT_python_file_run(struct wmOperatorType *ot); #endif /* ED_SCRIPT_INTERN_H */ diff --git a/source/blender/editors/space_script/script_ops.c b/source/blender/editors/space_script/script_ops.c index e6d2990677f..15140f080e7 100644 --- a/source/blender/editors/space_script/script_ops.c +++ b/source/blender/editors/space_script/script_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,11 +31,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -45,12 +42,10 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" -#include "ED_screen.h" #include "script_intern.h" @@ -60,6 +55,7 @@ void script_operatortypes(void) { WM_operatortype_append(SCRIPT_OT_python_file_run); + WM_operatortype_append(SCRIPT_OT_reload); } void script_keymap(wmKeyConfig *keyconf) @@ -67,6 +63,6 @@ void script_keymap(wmKeyConfig *keyconf) wmKeyMap *keymap= WM_keymap_find(keyconf, "Script", SPACE_SCRIPT, 0); /* TODO - this is just while we have no way to load a text datablock */ - RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_python_file_run", PKEY, KM_PRESS, KM_CTRL|KM_SHIFT|KM_ALT, 0)->ptr, "path", "test.py"); + RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_python_file_run", PKEY, KM_PRESS, KM_CTRL|KM_SHIFT|KM_ALT, 0)->ptr, "filepath", "test.py"); } diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c index 4f7c0dc364b..0aba1df47e9 100644 --- a/source/blender/editors/space_script/space_script.c +++ b/source/blender/editors/space_script/space_script.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,10 +29,6 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -44,7 +40,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -52,13 +47,12 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "ED_markers.h" - +#ifndef DISABLE_PYTHON #include "BPY_extern.h" +#endif #include "script_intern.h" // own include @@ -147,11 +141,9 @@ static void script_main_area_draw(const bContext *C, ARegion *ar) /* draw entirely, view changes should be handled here */ SpaceScript *sscript= (SpaceScript*)CTX_wm_space_data(C); View2D *v2d= &ar->v2d; - float col[3]; - + /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt new file mode 100644 index 00000000000..383cc05b7f7 --- /dev/null +++ b/source/blender/editors/space_sequencer/CMakeLists.txt @@ -0,0 +1,36 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../imbuf + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/audaspace/intern +) + +BLENDERLIB(bf_editor_space_sequencer "${SRC}" "${INC}") diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index bd1053d8d77..01a99ed2b1f 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -41,18 +41,9 @@ #include "BLI_math.h" #include "BLI_storage_types.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" -#include "DNA_ipo_types.h" -#include "DNA_curve_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_sequence_types.h" -#include "DNA_view2d_types.h" #include "DNA_userdef_types.h" -#include "DNA_sound_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -71,23 +62,13 @@ #include "WM_api.h" #include "WM_types.h" -#include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" /* for menu/popup icons etc etc*/ -#include "UI_interface.h" -#include "UI_resources.h" -#include "ED_anim_api.h" -#include "ED_space_api.h" -#include "ED_types.h" #include "ED_screen.h" -#include "ED_util.h" -#include "ED_fileselect.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" #include "BKE_sound.h" @@ -105,13 +86,11 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) { - RNA_def_string(ot->srna, "name", "", MAX_ID_NAME-2, "Name", "Name of the new sequence strip"); - if(flag & SEQPROP_STARTFRAME) - RNA_def_int(ot->srna, "start_frame", 0, INT_MIN, INT_MAX, "Start Frame", "Start frame of the sequence strip", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "frame_start", 0, INT_MIN, INT_MAX, "Start Frame", "Start frame of the sequence strip", INT_MIN, INT_MAX); if(flag & SEQPROP_ENDFRAME) - RNA_def_int(ot->srna, "end_frame", 0, INT_MIN, INT_MAX, "End Frame", "End frame for the color strip", INT_MIN, INT_MAX); /* not useual since most strips have a fixed length */ + RNA_def_int(ot->srna, "frame_end", 0, INT_MIN, INT_MAX, "End Frame", "End frame for the color strip", INT_MIN, INT_MAX); /* not useual since most strips have a fixed length */ RNA_def_int(ot->srna, "channel", 1, 1, MAXSEQ, "Channel", "Channel to place this strip into", 1, MAXSEQ); @@ -121,6 +100,20 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", ""); } +static void sequencer_generic_invoke_path__internal(bContext *C, wmOperator *op, const char *identifier) +{ + if(RNA_struct_find_property(op->ptr, identifier)) { + Scene *scene= CTX_data_scene(C); + Sequence *last_seq= seq_active_get(scene); + if(last_seq && last_seq->strip && SEQ_HAS_PATH(last_seq)) { + char path[sizeof(last_seq->strip->dir)]; + BLI_strncpy(path, last_seq->strip->dir, sizeof(path)); + BLI_path_abs(path, G.sce); + RNA_string_set(op->ptr, identifier, path); + } + } +} + static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, wmEvent *event, int flag) { ARegion *ar= CTX_wm_region(C); @@ -136,29 +129,36 @@ static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, w UI_view2d_region_to_view(v2d, mval[0], mval[1], &mval_v2d[0], &mval_v2d[1]); RNA_int_set(op->ptr, "channel", (int)mval_v2d[1]+0.5f); - RNA_int_set(op->ptr, "start_frame", (int)mval_v2d[0]); - - if ((flag & SEQPROP_ENDFRAME) && RNA_property_is_set(op->ptr, "end_frame")==0) - RNA_int_set(op->ptr, "end_frame", (int)mval_v2d[0] + 25); // XXX arbitary but ok for now. + RNA_int_set(op->ptr, "frame_start", (int)mval_v2d[0]); + if ((flag & SEQPROP_ENDFRAME) && RNA_property_is_set(op->ptr, "frame_end")==0) + RNA_int_set(op->ptr, "frame_end", (int)mval_v2d[0] + 25); // XXX arbitary but ok for now. + + sequencer_generic_invoke_path__internal(C, op, "filepath"); + sequencer_generic_invoke_path__internal(C, op, "directory"); } static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op) { + int is_file= -1; memset(seq_load, 0, sizeof(SeqLoadInfo)); - seq_load->start_frame= RNA_int_get(op->ptr, "start_frame"); + seq_load->start_frame= RNA_int_get(op->ptr, "frame_start"); seq_load->end_frame= seq_load->start_frame; /* un-set */ seq_load->channel= RNA_int_get(op->ptr, "channel"); seq_load->len= 1; // images only, if endframe isnt set! - RNA_string_get(op->ptr, "name", seq_load->name+2); + if(RNA_struct_find_property(op->ptr, "filepath")) { + RNA_string_get(op->ptr, "filepath", seq_load->path); /* full path, file is set by the caller */ + is_file= 1; + } else if (RNA_struct_find_property(op->ptr, "directory")) { + RNA_string_get(op->ptr, "directory", seq_load->path); /* full path, file is set by the caller */ + is_file= 0; + } - RNA_string_get(op->ptr, "path", seq_load->path); /* full path, file is set by the caller */ - - if (RNA_struct_find_property(op->ptr, "end_frame")) { - seq_load->end_frame = RNA_int_get(op->ptr, "end_frame"); + if (RNA_struct_find_property(op->ptr, "frame_end")) { + seq_load->end_frame = RNA_int_get(op->ptr, "frame_end"); } if (RNA_struct_find_property(op->ptr, "replace_sel") && RNA_boolean_get(op->ptr, "replace_sel")) @@ -172,6 +172,20 @@ static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op) /* always use this for ops */ seq_load->flag |= SEQ_LOAD_FRAME_ADVANCE; + + + if(is_file==1) { + BLI_strncpy(seq_load->name, BLI_path_basename(seq_load->path), sizeof(seq_load->name)); + } + else if(RNA_struct_find_property(op->ptr, "files")) { + /* used for image strip */ + /* best guess, first images name */ + RNA_BEGIN(op->ptr, itemptr, "files") { + RNA_string_get(&itemptr, "name", seq_load->name); + break; + } + RNA_END; + } } /* add scene operator */ @@ -188,10 +202,10 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) int start_frame, channel; /* operator props */ - start_frame= RNA_int_get(op->ptr, "start_frame"); + start_frame= RNA_int_get(op->ptr, "frame_start"); channel= RNA_int_get(op->ptr, "channel"); - sce_seq= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "type")); + sce_seq= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene")); if (sce_seq==NULL) { BKE_report(op->reports, RPT_ERROR, "Scene not found"); @@ -199,9 +213,11 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) } seq = alloc_sequence(ed->seqbasep, start_frame, channel); - seq->type= SEQ_SCENE; + seq->blend_mode= SEQ_CROSS; /* so alpha adjustment fade to the strip below */ + seq->scene= sce_seq; + seq->sfra= sce_seq->r.sfra; /* basic defaults */ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); @@ -210,17 +226,17 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); - if(RNA_property_is_set(op->ptr, "name")) - RNA_string_get(op->ptr, "name", seq->name+2); - else - strcpy(seq->name+2, sce_seq->id.name+2); - + strcpy(seq->name+2, sce_seq->id.name+2); + seqbase_unique_name_recursive(&ed->seqbase, seq); + + seq->scene_sound = sound_scene_add_scene_sound(scene, seq, start_frame, start_frame + strip->len, 0); + calc_sequence_disp(scene, seq); sort_seq(scene); if (RNA_boolean_get(op->ptr, "replace_sel")) { deselect_all_seq(scene); - active_seq_set(scene, seq); + seq_active_set(scene, seq); seq->flag |= SELECT; } @@ -232,6 +248,11 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) static int sequencer_add_scene_strip_invoke(bContext *C, wmOperator *op, wmEvent *event) { + if(!ED_operator_sequencer_active(C)) { + BKE_report(op->reports, RPT_ERROR, "Sequencer area not active"); + return OPERATOR_CANCELLED; + } + sequencer_generic_invoke_xy__internal(C, op, event, 0); return sequencer_add_scene_strip_exec(C, op); // needs a menu @@ -252,14 +273,15 @@ void SEQUENCER_OT_scene_strip_add(struct wmOperatorType *ot) ot->invoke= sequencer_add_scene_strip_invoke; ot->exec= sequencer_add_scene_strip_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME); - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", ""); + prop= RNA_def_enum(ot->srna, "scene", DummyRNA_NULL_items, 0, "Scene", ""); RNA_def_enum_funcs(prop, RNA_scene_itemf); + ot->prop= prop; } static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoadFunc seq_load_func) @@ -282,7 +304,7 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad char dir_only[FILE_MAX]; char file_only[FILE_MAX]; - BLI_split_dirfile_basic(seq_load.path, dir_only, NULL); + BLI_split_dirfile(seq_load.path, dir_only, NULL); RNA_BEGIN(op->ptr, itemptr, "files") { RNA_string_get(&itemptr, "name", file_only); @@ -318,9 +340,20 @@ static int sequencer_add_movie_strip_exec(bContext *C, wmOperator *op) static int sequencer_add_movie_strip_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ +{ + if(!ED_operator_sequencer_active(C)) { + BKE_report(op->reports, RPT_ERROR, "Sequencer area not active"); + return OPERATOR_CANCELLED; + } + + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + sequencer_generic_invoke_xy__internal(C, op, event, 0); - return WM_operator_filesel(C, op, event); + + WM_event_add_fileselect(C, op); + return OPERATOR_RUNNING_MODAL; + //return sequencer_add_movie_strip_exec(C, op); } @@ -337,12 +370,12 @@ void SEQUENCER_OT_movie_strip_add(struct wmOperatorType *ot) ot->invoke= sequencer_add_movie_strip_invoke; ot->exec= sequencer_add_movie_strip_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - WM_operator_properties_filesel(ot, FOLDERFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILES); RNA_def_boolean(ot->srna, "sound", TRUE, "Sound", "Load sound with the movie"); } @@ -355,9 +388,20 @@ static int sequencer_add_sound_strip_exec(bContext *C, wmOperator *op) } static int sequencer_add_sound_strip_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ +{ + if(!ED_operator_sequencer_active(C)) { + BKE_report(op->reports, RPT_ERROR, "Sequencer area not active"); + return OPERATOR_CANCELLED; + } + + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + sequencer_generic_invoke_xy__internal(C, op, event, 0); - return WM_operator_filesel(C, op, event); + + WM_event_add_fileselect(C, op); + return OPERATOR_RUNNING_MODAL; + //return sequencer_add_sound_strip_exec(C, op); } @@ -374,12 +418,12 @@ void SEQUENCER_OT_sound_strip_add(struct wmOperatorType *ot) ot->invoke= sequencer_add_sound_strip_invoke; ot->exec= sequencer_add_sound_strip_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILES); RNA_def_boolean(ot->srna, "cache", FALSE, "Cache", "Cache the sound in memory."); } @@ -403,26 +447,26 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op) seq_load.len= RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files")); if(seq_load.len==0) - seq_load.len= 1; + return OPERATOR_CANCELLED; if(seq_load.flag & SEQ_LOAD_REPLACE_SEL) deselect_all_seq(scene); - + /* main adding function */ seq= sequencer_add_image_strip(C, ed->seqbasep, &seq_load); strip= seq->strip; se= strip->stripdata; - if(seq_load.len > 1) { - RNA_BEGIN(op->ptr, itemptr, "files") { - RNA_string_get(&itemptr, "name", se->name); - se++; - } - RNA_END; + RNA_BEGIN(op->ptr, itemptr, "files") { + char *filename= RNA_string_get_alloc(&itemptr, "name", NULL, 0); + BLI_strncpy(se->name, filename, sizeof(se->name)); + MEM_freeN(filename); + se++; } - else { - BLI_split_dirfile_basic(seq_load.path, NULL, se->name); + RNA_END; + + if(seq_load.len == 1) { if(seq_load.start_frame < seq_load.end_frame) { seq->endstill= seq_load.end_frame - seq_load.start_frame; } @@ -442,8 +486,19 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op) static int sequencer_add_image_strip_invoke(bContext *C, wmOperator *op, wmEvent *event) { + if(!ED_operator_sequencer_active(C)) { + BKE_report(op->reports, RPT_ERROR, "Sequencer area not active"); + return OPERATOR_CANCELLED; + } + + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME); - return WM_operator_filesel(C, op, event); + + WM_event_add_fileselect(C, op); + return OPERATOR_RUNNING_MODAL; + //return sequencer_add_image_strip_exec(C, op); } @@ -460,12 +515,12 @@ void SEQUENCER_OT_image_strip_add(struct wmOperatorType *ot) ot->invoke= sequencer_add_image_strip_invoke; ot->exec= sequencer_add_image_strip_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_DIRECTORY|WM_FILESEL_RELPATH); sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_ENDFRAME|SEQPROP_FILES); } @@ -486,13 +541,13 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) Sequence *seq1, *seq2, *seq3; char *error_msg; - start_frame= RNA_int_get(op->ptr, "start_frame"); - end_frame= RNA_int_get(op->ptr, "end_frame"); + start_frame= RNA_int_get(op->ptr, "frame_start"); + end_frame= RNA_int_get(op->ptr, "frame_end"); channel= RNA_int_get(op->ptr, "channel"); type= RNA_enum_get(op->ptr, "type"); - // XXX We need unique names and move to invoke + // XXX move to invoke if(!seq_effect_find_selected(scene, NULL, type, &seq1, &seq2, &seq3, &error_msg)) { BKE_report(op->reports, RPT_ERROR, error_msg); return OPERATOR_CANCELLED; @@ -508,11 +563,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) seq = alloc_sequence(ed->seqbasep, start_frame, channel); seq->type= type; - if(RNA_property_is_set(op->ptr, "name")) - RNA_string_get(op->ptr, "name", seq->name+2); - else - strcpy(seq->name+2, give_seqname(seq)); - + BLI_strncpy(seq->name+2, give_seqname(seq), sizeof(seq->name)-2); seqbase_unique_name_recursive(&ed->seqbase, seq); sh = get_sequence_effect(seq); @@ -541,7 +592,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) if (seq->type==SEQ_PLUGIN) { char path[FILE_MAX]; - RNA_string_get(op->ptr, "path", path); + RNA_string_get(op->ptr, "filepath", path); sh.init_plugin(seq, path); @@ -555,6 +606,18 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) else if (seq->type==SEQ_COLOR) { SolidColorVars *colvars= (SolidColorVars *)seq->effectdata; RNA_float_get_array(op->ptr, "color", colvars->col); + seq->blend_mode= SEQ_CROSS; /* so alpha adjustment fade to the strip below */ + + } + + // XXX, this conflicts with giving a channel with invoke, perhaps we should have an active channel + // but for now this is much more usable + if(seq->seq1 || seq->seq2 || seq->seq3) { + int chan= MAX3( seq->seq1 ? seq->seq1->machine : 0, + seq->seq2 ? seq->seq2->machine : 0, + seq->seq3 ? seq->seq3->machine : 0); + if(chan < MAXSEQ) + seq->machine= chan; } if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene); @@ -568,7 +631,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) if (RNA_boolean_get(op->ptr, "replace_sel")) { deselect_all_seq(scene); - active_seq_set(scene, seq); + seq_active_set(scene, seq); seq->flag |= SELECT; } @@ -581,9 +644,18 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) /* add color */ static int sequencer_add_effect_strip_invoke(bContext *C, wmOperator *op, wmEvent *event) { + if(!ED_operator_sequencer_active(C)) { + BKE_report(op->reports, RPT_ERROR, "Sequencer area not active"); + return OPERATOR_CANCELLED; + } + sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME); if (RNA_property_is_set(op->ptr, "type") && RNA_enum_get(op->ptr, "type")==SEQ_PLUGIN) { + + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + /* only plugins need the file selector */ return WM_operator_filesel(C, op, event); } @@ -603,12 +675,12 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot) ot->invoke= sequencer_add_effect_strip_invoke; ot->exec= sequencer_add_effect_strip_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - WM_operator_properties_filesel(ot, 0, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, 0, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH); sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_ENDFRAME); RNA_def_enum(ot->srna, "type", sequencer_prop_effect_types, SEQ_CROSS, "Type", "Sequencer effect type"); RNA_def_float_vector(ot->srna, "color", 3, NULL, 0.0f, 1.0f, "Color", "Initialize the strip with this color (only used when type='COLOR')", 0.0f, 1.0f); diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c index d6b52e83090..a2aa7e649b9 100644 --- a/source/blender/editors/space_sequencer/sequencer_buttons.c +++ b/source/blender/editors/space_sequencer/sequencer_buttons.c @@ -27,11 +27,6 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -43,21 +38,14 @@ #include "BKE_screen.h" #include "BKE_utildefines.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" #include "ED_screen.h" -#include "ED_sequencer.h" -#include "ED_util.h" -#include "RNA_access.h" #include "WM_api.h" #include "WM_types.h" #include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "sequencer_intern.h" diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index c1a023d0009..4f52a17f623 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -35,12 +35,9 @@ #include "IMB_imbuf_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_sequence_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_view2d_types.h" #include "DNA_userdef_types.h" #include "BKE_context.h" @@ -51,7 +48,6 @@ #include "BKE_utildefines.h" #include "BKE_sound.h" -#include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "BIF_gl.h" @@ -59,8 +55,6 @@ #include "ED_anim_api.h" #include "ED_markers.h" -#include "ED_space_api.h" -#include "ED_sequencer.h" #include "ED_types.h" #include "UI_interface.h" @@ -132,6 +126,7 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col) case SEQ_ALPHAUNDER: case SEQ_OVERDROP: case SEQ_GLOW: + case SEQ_MULTICAM: /* slightly offset hue to distinguish different effects */ UI_GetThemeColor3ubv(TH_SEQ_EFFECT, col); @@ -205,48 +200,88 @@ static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, f } } -static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1, float x2, float y2) +static void drawmeta_stipple(int value) { - /* Note, this used to use WHILE_SEQ, but it messes up the seq->depth value, (needed by transform when doing overlap checks) - * so for now, just use the meta's immediate children, could be fixed but its only drawing - Campbell */ - Sequence *seq; - float dx; - int nr; - char col[3]; - - nr= BLI_countlist(&seqm->seqbase); - - dx= (x2-x1)/nr; - - if (seqm->flag & SEQ_MUTE) { + if(value) { glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(stipple_halftone); glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0x8888); } - - for (seq= seqm->seqbase.first; seq; seq= seq->next) { - get_seq_color3ubv(scene, seq, col); - - glColor3ubv((GLubyte *)col); - - glRectf(x1, y1, x1+0.9*dx, y2); - - UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -30); - glColor3ubv((GLubyte *)col); - - fdrawbox(x1, y1, x1+0.9*dx, y2); - - x1+= dx; - } - - if (seqm->flag & SEQ_MUTE) { + else { glDisable(GL_POLYGON_STIPPLE); glDisable(GL_LINE_STIPPLE); } } +static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1, float x2, float y2) +{ + /* Note, this used to use WHILE_SEQ, but it messes up the seq->depth value, (needed by transform when doing overlap checks) + * so for now, just use the meta's immediate children, could be fixed but its only drawing - Campbell */ + Sequence *seq; + char col[4]; + + int chan_min= MAXSEQ; + int chan_max= 0; + int chan_range= 0; + float draw_range= y2 - y1; + float draw_height; + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if(seqm->flag & SEQ_MUTE) + drawmeta_stipple(1); + + for (seq= seqm->seqbase.first; seq; seq= seq->next) { + chan_min= MIN2(chan_min, seq->machine); + chan_max= MAX2(chan_max, seq->machine); + } + + chan_range= (chan_max - chan_min) + 1; + draw_height= draw_range / chan_range; + + col[3]= 196; /* alpha, used for all meta children */ + + for (seq= seqm->seqbase.first; seq; seq= seq->next) { + if((seq->startdisp > x2 || seq->enddisp < x1) == 0) { + float y_chan= (seq->machine - chan_min) / (float)(chan_range) * draw_range; + float x1_chan= seq->startdisp; + float x2_chan= seq->enddisp; + float y1_chan, y2_chan; + + if((seqm->flag & SEQ_MUTE) == 0 && (seq->flag & SEQ_MUTE)) + drawmeta_stipple(1); + + get_seq_color3ubv(scene, seq, col); + + glColor4ubv((GLubyte *)col); + + /* clamp within parent sequence strip bounds */ + if(x1_chan < x1) x1_chan= x1; + if(x2_chan > x2) x2_chan= x2; + + y1_chan= y1 + y_chan + (draw_height * SEQ_STRIP_OFSBOTTOM); + y2_chan= y1 + y_chan + (draw_height * SEQ_STRIP_OFSTOP); + + glRectf(x1_chan, y1_chan, x2_chan, y2_chan); + + UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -30); + glColor4ubv((GLubyte *)col); + fdrawbox(x1_chan, y1_chan, x2_chan, y2_chan); + + if((seqm->flag & SEQ_MUTE) == 0 && (seq->flag & SEQ_MUTE)) + drawmeta_stipple(0); + } + } + + if (seqm->flag & SEQ_MUTE) + drawmeta_stipple(0); + + glDisable(GL_BLEND); +} + /* draw a handle, for each end of a sequence strip */ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short direction) { @@ -330,11 +365,11 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire } } -static void draw_seq_extensions(Scene *scene, SpaceSeq *sseq, Sequence *seq) +static void draw_seq_extensions(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *seq) { float x1, x2, y1, y2, pixely, a; char col[3], blendcol[3]; - View2D *v2d; + View2D *v2d= &ar->v2d; if(seq->type >= SEQ_EFFECT) return; @@ -343,8 +378,7 @@ static void draw_seq_extensions(Scene *scene, SpaceSeq *sseq, Sequence *seq) y1= seq->machine+SEQ_STRIP_OFSBOTTOM; y2= seq->machine+SEQ_STRIP_OFSTOP; - - v2d = &sseq->v2d; + pixely = (v2d->cur.ymax - v2d->cur.ymin)/(v2d->mask.ymax - v2d->mask.ymin); blendcol[0] = blendcol[1] = blendcol[2] = 120; @@ -438,40 +472,49 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float { rctf rect; char str[32 + FILE_MAXDIR+FILE_MAXFILE]; + const char *name= seq->name+2; - if(seq->name[2]) { - sprintf(str, "%d | %s: %s", seq->len, give_seqname(seq), seq->name+2); - } - else{ - if(seq->type == SEQ_META) { - sprintf(str, "%d | %s", seq->len, give_seqname(seq)); - } - else if(seq->type == SEQ_SCENE) { - if(seq->scene) sprintf(str, "%d | %s: %s", seq->len, give_seqname(seq), seq->scene->id.name+2); - else sprintf(str, "%d | %s", seq->len, give_seqname(seq)); - - } - else if(seq->type == SEQ_IMAGE) { - sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name); - } - else if(seq->type & SEQ_EFFECT) { - int can_float = (seq->type != SEQ_PLUGIN) - || (seq->plugin && seq->plugin->version >= 4); + if(name[0]=='\0') + name= give_seqname(seq); - if(seq->seq3!=seq->seq2 && seq->seq1!=seq->seq3) - sprintf(str, "%d | %s: %d>%d (use %d)%s", seq->len, give_seqname(seq), seq->seq1->machine, seq->seq2->machine, seq->seq3->machine, can_float ? "" : " No float, upgrade plugin!"); - else if (seq->seq1 && seq->seq2) - sprintf(str, "%d | %s: %d>%d%s", seq->len, give_seqname(seq), seq->seq1->machine, seq->seq2->machine, can_float ? "" : " No float, upgrade plugin!"); - else - sprintf(str, "%d | %s", seq->len, give_seqname(seq)); + if(seq->type == SEQ_META) { + sprintf(str, "%d | %s", seq->len, name); + } + else if(seq->type == SEQ_SCENE) { + if(seq->scene) { + if(seq->scene_camera) { + sprintf(str, "%d | %s: %s (%s)", seq->len, name, seq->scene->id.name+2, ((ID *)seq->scene_camera)->name+2); + } else { + sprintf(str, "%d | %s: %s", seq->len, name, seq->scene->id.name+2); + } } - else if (seq->type == SEQ_SOUND) { - sprintf(str, "%d | %s", seq->len, seq->sound->name); - } - else if (seq->type == SEQ_MOVIE) { - sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name); + else { + sprintf(str, "%d | %s", seq->len, name); } } + else if(seq->type == SEQ_MULTICAM) { + sprintf(str, "Cam: %d", seq->multicam_source); + } + else if(seq->type == SEQ_IMAGE) { + sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name); + } + else if(seq->type & SEQ_EFFECT) { + int can_float = (seq->type != SEQ_PLUGIN) + || (seq->plugin && seq->plugin->version >= 4); + + if(seq->seq3!=seq->seq2 && seq->seq1!=seq->seq3) + sprintf(str, "%d | %s: %d>%d (use %d)%s", seq->len, name, seq->seq1->machine, seq->seq2->machine, seq->seq3->machine, can_float ? "" : " No float, upgrade plugin!"); + else if (seq->seq1 && seq->seq2) + sprintf(str, "%d | %s: %d>%d%s", seq->len, name, seq->seq1->machine, seq->seq2->machine, can_float ? "" : " No float, upgrade plugin!"); + else + sprintf(str, "%d | %s", seq->len, name); + } + else if (seq->type == SEQ_SOUND) { + sprintf(str, "%d | %s", seq->len, seq->sound->name); + } + else if (seq->type == SEQ_MOVIE) { + sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name); + } if(seq->flag & SELECT){ cpack(0xFFFFFF); @@ -581,7 +624,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence * /* draw additional info and controls */ if (!is_single_image) - draw_seq_extensions(scene, sseq, seq); + draw_seq_extensions(scene, ar, sseq, seq); draw_seq_handle(v2d, seq, pixelx, SEQ_LEFTHANDLE); draw_seq_handle(v2d, seq, pixelx, SEQ_RIGHTHANDLE); @@ -615,13 +658,12 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence * glDisable(GL_LINE_STIPPLE); } + if(seq->type==SEQ_META) drawmeta_contents(scene, seq, x1, y1, x2, y2); + /* calculate if seq is long enough to print a name */ x1= seq->startdisp+seq->handsize; x2= seq->enddisp-seq->handsize; - /* but first the contents of a meta */ - if(seq->type==SEQ_META) drawmeta_contents(scene, seq, x1, y1+0.15, x2, y2-0.15); - /* info text on the strip */ if(x1cur.xmin) x1= v2d->cur.xmin; else if(x1>v2d->cur.xmax) x1= v2d->cur.xmax; @@ -647,7 +689,7 @@ void set_special_seq_update(int val) else special_seq_update= 0; } -void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq) +void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq, int cfra, int frame_ofs) { extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad); struct ImBuf *ibuf; @@ -678,14 +720,19 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq recty = viewrecty + 0.5f; if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { - viewrectx *= (float)scene->r.xasp / (float)scene->r.yasp; + viewrectx *= scene->r.xasp / scene->r.yasp; viewrectx /= proxy_size / 100.0; viewrecty /= proxy_size / 100.0; } - /* XXX TODO: take color from theme */ - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); + if(frame_ofs == 0) { + /* XXX TODO: take color from theme */ + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + } + + /* without this colors can flicker from previous opengl state */ + glColor4ub(255, 255, 255, 255); UI_view2d_totRect_set(v2d, viewrectx + 0.5f, viewrecty + 0.5f); UI_view2d_curRect_validate(v2d); @@ -700,13 +747,13 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq else { recursive= 1; if (special_seq_update) { - ibuf= give_ibuf_seq_direct(scene, rectx, recty, (scene->r.cfra), proxy_size, special_seq_update); + ibuf= give_ibuf_seq_direct(scene, rectx, recty, cfra + frame_ofs, proxy_size, special_seq_update); } else if (!U.prefetchframes) { // XXX || (G.f & G_PLAYANIM) == 0) { - ibuf= (ImBuf *)give_ibuf_seq(scene, rectx, recty, (scene->r.cfra), sseq->chanshown, proxy_size); + ibuf= (ImBuf *)give_ibuf_seq(scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size); } else { - ibuf= (ImBuf *)give_ibuf_seq_threaded(scene, rectx, recty, (scene->r.cfra), sseq->chanshown, proxy_size); + ibuf= (ImBuf *)give_ibuf_seq_threaded(scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size); } recursive= 0; @@ -750,11 +797,6 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq } if(ibuf->rect_float && ibuf->rect==NULL) { - if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) { - ibuf->profile = IB_PROFILE_LINEAR_RGB; - } else { - ibuf->profile = IB_PROFILE_NONE; - } IMB_rect_from_float(ibuf); } @@ -771,11 +813,26 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(v2d->tot.xmin, v2d->tot.ymin); - glTexCoord2f(0.0f, 1.0f);glVertex2f(v2d->tot.xmin, v2d->tot.ymax); + glBegin(GL_QUADS); + + if(frame_ofs) { + rctf tot_clip; + tot_clip.xmin= v2d->tot.xmin + (ABS(v2d->tot.xmax - v2d->tot.xmin) * scene->ed->over_border.xmin); + tot_clip.ymin= v2d->tot.ymin + (ABS(v2d->tot.ymax - v2d->tot.ymin) * scene->ed->over_border.ymin); + tot_clip.xmax= v2d->tot.xmin + (ABS(v2d->tot.xmax - v2d->tot.xmin) * scene->ed->over_border.xmax); + tot_clip.ymax= v2d->tot.ymin + (ABS(v2d->tot.ymax - v2d->tot.ymin) * scene->ed->over_border.ymax); + + glTexCoord2f(scene->ed->over_border.xmin, scene->ed->over_border.ymin);glVertex2f(tot_clip.xmin, tot_clip.ymin); + glTexCoord2f(scene->ed->over_border.xmin, scene->ed->over_border.ymax);glVertex2f(tot_clip.xmin, tot_clip.ymax); + glTexCoord2f(scene->ed->over_border.xmax, scene->ed->over_border.ymax);glVertex2f(tot_clip.xmax, tot_clip.ymax); + glTexCoord2f(scene->ed->over_border.xmax, scene->ed->over_border.ymin);glVertex2f(tot_clip.xmax, tot_clip.ymin); + } + else { + glTexCoord2f(0.0f, 0.0f);glVertex2f(v2d->tot.xmin, v2d->tot.ymin); + glTexCoord2f(0.0f, 1.0f);glVertex2f(v2d->tot.xmin, v2d->tot.ymax); glTexCoord2f(1.0f, 1.0f);glVertex2f(v2d->tot.xmax, v2d->tot.ymax); - glTexCoord2f(1.0f, 0.0f);glVertex2f(v2d->tot.xmax, v2d->tot.ymin); + glTexCoord2f(1.0f, 0.0f);glVertex2f(v2d->tot.xmax, v2d->tot.ymin); + } glEnd( ); glBindTexture(GL_TEXTURE_2D, last_texid); glDisable(GL_TEXTURE_2D); @@ -783,7 +840,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq /* safety border */ if (sseq->mainb == SEQ_DRAW_IMG_IMBUF && - (sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) { + (sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) { float fac= 0.1; float x1 = v2d->tot.xmin; float y1 = v2d->tot.ymin; @@ -820,7 +877,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq /* draw grease-pencil (screen aligned) */ // if (sseq->flag & SEQ_DRAW_GPENCIL) -// XXX draw_gpencil_2dview(sa, 0); +// XXX draw_gpencil_view2d(sa, 0); /* ortho at pixel level */ UI_view2d_view_restore(C); @@ -898,7 +955,7 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar) Scene *scene= CTX_data_scene(C); SpaceSeq *sseq= CTX_wm_space_seq(C); View2D *v2d= &ar->v2d; - Sequence *last_seq = active_seq_get(scene); + Sequence *last_seq = seq_active_get(scene); int sel = 0, j; float pixelx = (v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin); @@ -930,6 +987,33 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar) draw_seq_strip(scene, ar, sseq, last_seq, 120, pixelx); } +static void seq_draw_sfra_efra(const bContext *C, SpaceSeq *sseq, ARegion *ar) +{ + View2D *v2d= UI_view2d_fromcontext(C); + Scene *scene= CTX_data_scene(C); + + glEnable(GL_BLEND); + + /* draw darkened area outside of active timeline + * frame range used is preview range or scene range */ + UI_ThemeColorShadeAlpha(TH_BACK, -25, -100); + + if (PSFRA < PEFRA) { + glRectf(v2d->cur.xmin, v2d->cur.ymin, (float)PSFRA, v2d->cur.ymax); + glRectf((float)PEFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); + } + else { + glRectf(v2d->cur.xmin, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); + } + + UI_ThemeColorShade(TH_BACK, -60); + /* thin lines where the actual frames are */ + fdrawline((float)PSFRA, v2d->cur.ymin, (float)PSFRA, v2d->cur.ymax); + fdrawline((float)PEFRA, v2d->cur.ymin, (float)PEFRA, v2d->cur.ymax); + + glDisable(GL_BLEND); +} + /* Draw Timeline/Strip Editor Mode for Sequencer */ void draw_timeline_seq(const bContext *C, ARegion *ar) { @@ -963,7 +1047,8 @@ void draw_timeline_seq(const bContext *C, ARegion *ar) /* regular grid-pattern over the rest of the view (i.e. frame grid lines) */ UI_view2d_constant_grid_draw(C, v2d); - + + seq_draw_sfra_efra(C, sseq, ar); /* sequence strips (if there is data available to be drawn) */ if (ed) { @@ -987,6 +1072,19 @@ void draw_timeline_seq(const bContext *C, ARegion *ar) /* preview range */ UI_view2d_view_ortho(C, v2d); ANIM_draw_previewrange(C, v2d); + + /* overlap playhead */ + if(scene->ed && scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW) { + int cfra_over= (scene->ed->over_flag & SEQ_EDIT_OVERLAY_ABS) ? scene->ed->over_cfra : scene->r.cfra + scene->ed->over_ofs; + glColor3f(0.2, 0.2, 0.2); + // glRectf(cfra_over, v2d->cur.ymin, scene->ed->over_ofs + scene->r.cfra + 1, v2d->cur.ymax); + + glBegin(GL_LINES); + glVertex2f(cfra_over, v2d->cur.ymin); + glVertex2f(cfra_over, v2d->cur.ymax); + glEnd(); + + } /* reset view matrix */ UI_view2d_view_restore(C); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index ce8d99da3a9..d3d2fd7e220 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -42,18 +42,10 @@ #include "BLI_math.h" #include "BLI_storage_types.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" #include "DNA_ipo_types.h" -#include "DNA_curve_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_sequence_types.h" -#include "DNA_view2d_types.h" #include "DNA_userdef_types.h" -#include "DNA_sound_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -70,37 +62,24 @@ #include "WM_api.h" #include "WM_types.h" -#include "RNA_access.h" #include "RNA_define.h" /* for menu/popup icons etc etc*/ -#include "UI_interface.h" -#include "UI_resources.h" -#include "ED_anim_api.h" -#include "ED_space_api.h" -#include "ED_types.h" #include "ED_screen.h" #include "ED_transform.h" -#include "ED_util.h" #include "ED_sequencer.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" /* own include */ #include "sequencer_intern.h" -/* XXX */ -//static Sequence *_last_seq=0; -//static int _last_seq_init=0; -/* XXX */ -static void error() {} +static void error(const char *dummy) {} static void waitcursor(int val) {} -static void activate_fileselect() {} -static int pupmenu() {return 0;} -static int okee() {return 0;} +static void activate_fileselect(int d1, char *d2, char *d3, void *d4) {} +static int pupmenu(const char *dummy) {return 0;} +static int okee(const char *dummy) {return 0;} /* XXX */ @@ -120,6 +99,7 @@ EnumPropertyItem sequencer_prop_effect_types[] = { {SEQ_TRANSFORM, "TRANSFORM", 0, "Transform", "Transform effect strip type"}, {SEQ_COLOR, "COLOR", 0, "Color", "Color effect strip type"}, {SEQ_SPEED, "SPEED", 0, "Speed", "Color effect strip type"}, + {SEQ_MULTICAM, "MULTICAM", 0, "Multicam Selector", ""}, {0, NULL, 0, NULL, NULL} }; @@ -183,7 +163,7 @@ static void change_plugin_seq(Scene *scene, char *str) /* called from fileselect { Editing *ed= seq_give_editing(scene, FALSE); struct SeqEffectHandle sh; - Sequence *last_seq= active_seq_get(scene); + Sequence *last_seq= seq_active_get(scene); if(last_seq && last_seq->type != SEQ_PLUGIN) return; @@ -409,7 +389,7 @@ void deselect_all_seq(Scene *scene) if(ed==NULL) return; SEQP_BEGIN(ed, seq) { - seq->flag &= SEQ_DESEL; + seq->flag &= ~SEQ_ALLSEL; } SEQ_END @@ -422,9 +402,9 @@ void recurs_sel_seq(Sequence *seqm) seq= seqm->seqbase.first; while(seq) { - if(seqm->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL)) seq->flag &= SEQ_DESEL; + if(seqm->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL)) seq->flag &= ~SEQ_ALLSEL; else if(seqm->flag & SELECT) seq->flag |= SELECT; - else seq->flag &= SEQ_DESEL; + else seq->flag &= ~SEQ_ALLSEL; if(seq->seqbase.first) recurs_sel_seq(seq); @@ -457,7 +437,7 @@ static void reload_sound_strip(Scene *scene, char *name) Editing *ed; Sequence *seq, *seqact; SpaceFile *sfile; - Sequence *last_seq= active_seq_get(scene); + Sequence *last_seq= seq_active_get(scene); ed= scene->ed; @@ -499,7 +479,7 @@ static void reload_image_strip(Scene *scene, char *name) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq=NULL, *seqact; SpaceFile *sfile=NULL; - Sequence *last_seq= active_seq_get(scene); + Sequence *last_seq= seq_active_get(scene); @@ -535,7 +515,7 @@ static void reload_image_strip(Scene *scene, char *name) void change_sequence(Scene *scene) { Editing *ed= seq_give_editing(scene, FALSE); - Sequence *last_seq= active_seq_get(scene); + Sequence *last_seq= seq_active_get(scene); Scene *sce; short event; @@ -573,17 +553,17 @@ void change_sequence(Scene *scene) U.plugseqdir, change_plugin_seq); } else if(event==12); - /* recalculate: only new_stripdata */ + /* recalculate: only new_stripdata */ else { /* free previous effect and init new effect */ struct SeqEffectHandle sh; if (get_sequence_effect_num_inputs( - last_seq->type) - < get_sequence_effect_num_inputs( - event_to_efftype(event))) { + last_seq->type) + < get_sequence_effect_num_inputs( + event_to_efftype(event))) { error("New effect needs more " - "input strips!"); + "input strips!"); } else { sh = get_sequence_effect(last_seq); sh.free(last_seq); @@ -602,9 +582,9 @@ void change_sequence(Scene *scene) else if(last_seq->type == SEQ_IMAGE) { if(okee("Change images")) { activate_fileselect(FILE_SPECIAL, - "Select Images", - ed->act_imagedir, - reload_image_strip); + "Select Images", + ed->act_imagedir, + reload_image_strip); } } else if(last_seq->type == SEQ_MOVIE) { @@ -637,7 +617,7 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen *error_str= NULL; if (!activeseq) - seq2= active_seq_get(scene); + seq2= seq_active_get(scene); for(seq=ed->seqbasep->first; seq; seq=seq->next) { if(seq->flag & SELECT) { @@ -646,13 +626,13 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen return 0; } if((seq != activeseq) && (seq != seq2)) { - if(seq2==0) seq2= seq; - else if(seq1==0) seq1= seq; - else if(seq3==0) seq3= seq; - else { + if(seq2==0) seq2= seq; + else if(seq1==0) seq1= seq; + else if(seq3==0) seq3= seq; + else { *error_str= "Can't apply effect to more than 3 sequence strips"; return 0; - } + } } } } @@ -697,36 +677,6 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen return 1; } -void reassign_inputs_seq_effect(Scene *scene) -{ - Editing *ed= seq_give_editing(scene, FALSE); - Sequence *seq1, *seq2, *seq3, *last_seq = active_seq_get(scene); - char *error_msg; - - if(last_seq==0 || !(last_seq->type & SEQ_EFFECT)) return; - if(ed==NULL) return; - - if(!seq_effect_find_selected(scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg)) { - //BKE_report(op->reports, RPT_ERROR, error_msg); // XXX operatorify - return; - } - /* see reassigning would create a cycle */ - if( seq_is_predecessor(seq1, last_seq) || - seq_is_predecessor(seq2, last_seq) || - seq_is_predecessor(seq3, last_seq) - ) { - //BKE_report(op->reports, RPT_ERROR, "Can't reassign inputs: no cycles allowed"); // XXX operatorify - return; - } - - last_seq->seq1 = seq1; - last_seq->seq2 = seq2; - last_seq->seq3 = seq3; - - update_changed_seq_and_deps(scene, last_seq, 1, 1); - -} - static Sequence *del_seq_find_replace_recurs(Scene *scene, Sequence *seq) { Sequence *seq1, *seq2, *seq3; @@ -769,7 +719,7 @@ static Sequence *del_seq_find_replace_recurs(Scene *scene, Sequence *seq) static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short deleteall) { Sequence *seq, *seqn; - Sequence *last_seq = active_seq_get(scene); + Sequence *last_seq = seq_active_get(scene); seq= lb->first; while(seq) { @@ -779,139 +729,16 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de seq->sound->id.us--; BLI_remlink(lb, seq); - if(seq==last_seq) active_seq_set(scene, NULL); + if(seq==last_seq) seq_active_set(scene, NULL); if(seq->type==SEQ_META) recurs_del_seq_flag(scene, &seq->seqbase, flag, 1); - if(seq->ipo) seq->ipo->id.us--; + /* if(seq->ipo) seq->ipo->id.us--; */ + /* XXX, remove fcurve */ seq_free_sequence(scene, seq); } seq= seqn; } } -static Sequence *dupli_seq(struct Scene *scene, Sequence *seq) -{ - Sequence *seqn = MEM_dupallocN(seq); - - seq->tmp = seqn; - seqn->strip= MEM_dupallocN(seq->strip); - - // XXX: add F-Curve duplication stuff? - - seqn->strip->tstripdata = 0; - seqn->strip->tstripdata_startstill = 0; - seqn->strip->tstripdata_endstill = 0; - seqn->strip->ibuf_startstill = 0; - seqn->strip->ibuf_endstill = 0; - - if (seq->strip->crop) { - seqn->strip->crop = MEM_dupallocN(seq->strip->crop); - } - - if (seq->strip->transform) { - seqn->strip->transform = MEM_dupallocN(seq->strip->transform); - } - - if (seq->strip->proxy) { - seqn->strip->proxy = MEM_dupallocN(seq->strip->proxy); - } - - if (seq->strip->color_balance) { - seqn->strip->color_balance - = MEM_dupallocN(seq->strip->color_balance); - } - - if(seq->type==SEQ_META) { - seqn->strip->stripdata = 0; - - seqn->seqbase.first= seqn->seqbase.last= 0; - /* WATCH OUT!!! - This metastrip is not recursively duplicated here - do this after!!! */ - /* - recurs_dupli_seq(&seq->seqbase,&seqn->seqbase);*/ - } else if(seq->type == SEQ_SCENE) { - seqn->strip->stripdata = 0; - } else if(seq->type == SEQ_MOVIE) { - seqn->strip->stripdata = - MEM_dupallocN(seq->strip->stripdata); - seqn->anim= 0; - } else if(seq->type == SEQ_SOUND) { - seqn->strip->stripdata = - MEM_dupallocN(seq->strip->stripdata); - if(seq->scene_sound) - seqn->scene_sound = sound_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); - - seqn->sound->id.us++; - } else if(seq->type == SEQ_IMAGE) { - seqn->strip->stripdata = - MEM_dupallocN(seq->strip->stripdata); - } else if(seq->type >= SEQ_EFFECT) { - if(seq->seq1 && seq->seq1->tmp) seqn->seq1= seq->seq1->tmp; - if(seq->seq2 && seq->seq2->tmp) seqn->seq2= seq->seq2->tmp; - if(seq->seq3 && seq->seq3->tmp) seqn->seq3= seq->seq3->tmp; - - if (seq->type & SEQ_EFFECT) { - struct SeqEffectHandle sh; - sh = get_sequence_effect(seq); - if(sh.copy) - sh.copy(seq, seqn); - } - - seqn->strip->stripdata = 0; - - } else { - fprintf(stderr, "Aiiiiekkk! sequence type not " - "handled in duplicate!\nExpect a crash" - " now...\n"); - } - - seqbase_unique_name_recursive(&scene->ed->seqbase, seqn); - - return seqn; -} - -static Sequence * deep_dupli_seq(struct Scene *scene, Sequence * seq) -{ - Sequence * seqn = dupli_seq(scene, seq); - if (seq->type == SEQ_META) { - Sequence * s; - for(s= seq->seqbase.first; s; s = s->next) { - Sequence * n = deep_dupli_seq(scene, s); - if (n) { - BLI_addtail(&seqn->seqbase, n); - } - } - } - return seqn; -} - - -static void recurs_dupli_seq(Scene *scene, ListBase *old, ListBase *new, int do_context) -{ - Sequence *seq; - Sequence *seqn = 0; - Sequence *last_seq = active_seq_get(scene); - - for(seq= old->first; seq; seq= seq->next) { - seq->tmp= NULL; - if(seq->flag & SELECT) { - seqn = dupli_seq(scene, seq); - if (seqn) { /*should never fail */ - if(do_context) { - seq->flag &= SEQ_DESEL; - seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL+SEQ_LOCK); - } - - BLI_addtail(new, seqn); - if(seq->type==SEQ_META) - recurs_dupli_seq(scene, &seq->seqbase,&seqn->seqbase, do_context); - - if(do_context) { - if (seq == last_seq) { - active_seq_set(scene, seqn); - } - } - } - } - } -} static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) { @@ -960,12 +787,12 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) } } - reload_sequence_new_file(scene, seq); + reload_sequence_new_file(scene, seq, FALSE); calc_sequence(scene, seq); if (!skip_dup) { /* Duplicate AFTER the first change */ - seqn = deep_dupli_seq(scene, seq); + seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM); } if (seqn) { @@ -999,7 +826,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) seqn->startstill = 0; } - reload_sequence_new_file(scene, seqn); + reload_sequence_new_file(scene, seqn, FALSE); calc_sequence(scene, seqn); } return seqn; @@ -1054,7 +881,7 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe) if (!skip_dup) { /* Duplicate AFTER the first change */ - seqn = deep_dupli_seq(scene, seq); + seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM); } if (seqn) { @@ -1192,7 +1019,8 @@ void set_filter_seq(Scene *scene) if(seq->flag & SELECT) { if(seq->type==SEQ_MOVIE) { seq->flag |= SEQ_FILTERY; - reload_sequence_new_file(scene, seq); + reload_sequence_new_file(scene, seq, FALSE); + calc_sequence(scene, seq); } } @@ -1203,7 +1031,7 @@ void set_filter_seq(Scene *scene) void seq_remap_paths(Scene *scene) { - Sequence *seq, *last_seq = active_seq_get(scene); + Sequence *seq, *last_seq = seq_active_get(scene); Editing *ed= seq_give_editing(scene, FALSE); char from[FILE_MAX], to[FILE_MAX], stripped[FILE_MAX]; @@ -1284,6 +1112,20 @@ static int seq_get_snaplimit(View2D *v2d) #endif /* Operator functions */ +int sequencer_edit_poll(bContext *C) +{ + return (seq_give_editing(CTX_data_scene(C), FALSE) != NULL); +} + +int sequencer_view_poll(bContext *C) +{ + SpaceSeq *sseq= CTX_wm_space_seq(C); + Editing *ed= seq_give_editing(CTX_data_scene(C), FALSE); + if (ed && sseq && (sseq->mainb == SEQ_DRAW_IMG_IMBUF)) + return 1; + + return 0; +} /* snap operator*/ static int sequencer_snap_exec(bContext *C, wmOperator *op) @@ -1293,8 +1135,6 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq; int snap_frame; - - if(ed==NULL) return OPERATOR_CANCELLED; snap_frame= RNA_int_get(op->ptr, "frame"); @@ -1303,7 +1143,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op) /* also check metas */ SEQP_BEGIN(ed, seq) { if (seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK) && - seq_tx_test(seq)) { + seq_tx_test(seq)) { if((seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0) { seq->start= snap_frame-seq->startofs+seq->startstill; } else { @@ -1368,8 +1208,7 @@ void SEQUENCER_OT_snap(struct wmOperatorType *ot) /* api callbacks */ ot->invoke= sequencer_snap_invoke; ot->exec= sequencer_snap_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1385,9 +1224,6 @@ static int sequencer_mute_exec(bContext *C, wmOperator *op) Sequence *seq; int selected; - if(ed==NULL) - return OPERATOR_CANCELLED; - selected= !RNA_boolean_get(op->ptr, "unselected"); for(seq= ed->seqbasep->first; seq; seq= seq->next) { @@ -1418,8 +1254,7 @@ void SEQUENCER_OT_mute(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_mute_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1436,9 +1271,6 @@ static int sequencer_unmute_exec(bContext *C, wmOperator *op) Sequence *seq; int selected; - if(ed==NULL) - return OPERATOR_CANCELLED; - selected= !RNA_boolean_get(op->ptr, "unselected"); for(seq= ed->seqbasep->first; seq; seq= seq->next) { @@ -1463,14 +1295,13 @@ static int sequencer_unmute_exec(bContext *C, wmOperator *op) void SEQUENCER_OT_unmute(struct wmOperatorType *ot) { /* identifiers */ - ot->name= "UnMute Strips"; + ot->name= "Un-Mute Strips"; ot->idname= "SEQUENCER_OT_unmute"; - ot->description="UnMute unselected rather than selected strips"; + ot->description="Un-Mute unselected rather than selected strips"; /* api callbacks */ ot->exec= sequencer_unmute_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1486,9 +1317,6 @@ static int sequencer_lock_exec(bContext *C, wmOperator *op) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq; - if(ed==NULL) - return OPERATOR_CANCELLED; - for(seq= ed->seqbasep->first; seq; seq= seq->next) { if (seq->flag & SELECT) { seq->flag |= SEQ_LOCK; @@ -1509,8 +1337,7 @@ void SEQUENCER_OT_lock(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_lock_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1523,9 +1350,6 @@ static int sequencer_unlock_exec(bContext *C, wmOperator *op) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq; - if(ed==NULL) - return OPERATOR_CANCELLED; - for(seq= ed->seqbasep->first; seq; seq= seq->next) { if (seq->flag & SELECT) { seq->flag &= ~SEQ_LOCK; @@ -1546,8 +1370,7 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_unlock_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1560,9 +1383,6 @@ static int sequencer_reload_exec(bContext *C, wmOperator *op) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq; - if(ed==NULL) - return OPERATOR_CANCELLED; - for(seq= ed->seqbasep->first; seq; seq= seq->next) { if(seq->flag & SELECT) { update_changed_seq_and_deps(scene, seq, 0, 1); @@ -1583,8 +1403,7 @@ void SEQUENCER_OT_reload(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_reload_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1595,9 +1414,6 @@ static int sequencer_refresh_all_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - - if(ed==NULL) - return OPERATOR_CANCELLED; free_imbuf_seq(scene, &ed->seqbase, FALSE); @@ -1615,13 +1431,73 @@ void SEQUENCER_OT_refresh_all(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_refresh_all_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Sequence *seq1, *seq2, *seq3, *last_seq = seq_active_get(scene); + char *error_msg; + + if(!seq_effect_find_selected(scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg)) { + BKE_report(op->reports, RPT_ERROR, error_msg); + return OPERATOR_CANCELLED; + } + /* see reassigning would create a cycle */ + if( seq_is_predecessor(seq1, last_seq) || + seq_is_predecessor(seq2, last_seq) || + seq_is_predecessor(seq3, last_seq) + ) { + BKE_report(op->reports, RPT_ERROR, "Can't reassign inputs: no cycles allowed"); + return OPERATOR_CANCELLED; + } + + last_seq->seq1 = seq1; + last_seq->seq2 = seq2; + last_seq->seq3 = seq3; + + update_changed_seq_and_deps(scene, last_seq, 1, 1); + + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); + + return OPERATOR_FINISHED; +} + +int sequencer_effect_poll(bContext *C) +{ + Scene *scene= CTX_data_scene(C); + Editing *ed= seq_give_editing(scene, FALSE); + + if(ed) { + Sequence *last_seq= seq_active_get(scene); + if(last_seq && (last_seq->type & SEQ_EFFECT)) { + return 1; + } + } + + return 0; +} + +void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reassign Inputs"; + ot->idname= "SEQUENCER_OT_reassign_inputs"; + ot->description="Reassign the inputs for the effects strip"; + + /* api callbacks */ + ot->exec= sequencer_reassign_inputs_exec; + ot->poll= sequencer_effect_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + + /* cut operator */ static EnumPropertyItem prop_cut_types[] = { {SEQ_CUT_SOFT, "SOFT", 0, "Soft", ""}, @@ -1637,9 +1513,6 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op) ListBase newlist; int changed; - - if(ed==NULL) - return OPERATOR_CANCELLED; cut_frame= RNA_int_get(op->ptr, "frame"); cut_hard= RNA_enum_get(op->ptr, "type"); @@ -1663,11 +1536,11 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op) SEQP_BEGIN(ed, seq) { if (cut_side==SEQ_SIDE_LEFT) { if ( seq->startdisp >= cut_frame ) { - seq->flag &= SEQ_DESEL; + seq->flag &= ~SEQ_ALLSEL; } } else { if ( seq->enddisp <= cut_frame ) { - seq->flag &= SEQ_DESEL; + seq->flag &= ~SEQ_ALLSEL; } } } @@ -1688,11 +1561,12 @@ static int sequencer_cut_invoke(bContext *C, wmOperator *op, wmEvent *event) Scene *scene = CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); View2D *v2d= UI_view2d_fromcontext(C); - - int cut_side, cut_frame; - - cut_frame= CFRA; - cut_side= mouse_frame_side(v2d, event->x - ar->winrct.xmin, cut_frame); + + int cut_side= SEQ_SIDE_BOTH; + int cut_frame= CFRA; + + if (ED_operator_sequencer_active(C) && v2d) + cut_side= mouse_frame_side(v2d, event->x - ar->winrct.xmin, cut_frame); RNA_int_set(op->ptr, "frame", cut_frame); RNA_enum_set(op->ptr, "side", cut_side); @@ -1712,8 +1586,7 @@ void SEQUENCER_OT_cut(struct wmOperatorType *ot) /* api callbacks */ ot->invoke= sequencer_cut_invoke; ot->exec= sequencer_cut_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1724,25 +1597,37 @@ void SEQUENCER_OT_cut(struct wmOperatorType *ot) } /* duplicate operator */ +static int apply_unique_name_cb(Sequence *seq, void *arg_pt) +{ + Scene *scene= (Scene *)arg_pt; + char name[sizeof(seq->name)-2]; + + strcpy(name, seq->name+2); + seqbase_unique_name_recursive(&scene->ed->seqbase, seq); + seq_dupe_animdata(scene, name, seq->name+2); + return 1; + +} + static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - ListBase new= {NULL, NULL}; + ListBase nseqbase= {NULL, NULL}; if(ed==NULL) return OPERATOR_CANCELLED; - recurs_dupli_seq(scene, ed->seqbasep, &new, TRUE); + seqbase_dupli_recursive(scene, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT); - if(new.first) { - Sequence * seq= new.first; - /* rely on the new list being added at the end */ - addlisttolist(ed->seqbasep, &new); + if(nseqbase.first) { + Sequence * seq= nseqbase.first; + /* rely on the nseqbase list being added at the end */ + addlisttolist(ed->seqbasep, &nseqbase); for( ; seq; seq= seq->next) - seqbase_unique_name_recursive(&ed->seqbase, seq); + seq_recursive_apply(seq, apply_unique_name_cb, scene); WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); return OPERATOR_FINISHED; @@ -1763,7 +1648,6 @@ static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent * void SEQUENCER_OT_duplicate(wmOperatorType *ot) { - /* identifiers */ ot->name= "Duplicate"; ot->idname= "SEQUENCER_OT_duplicate"; @@ -1772,7 +1656,6 @@ void SEQUENCER_OT_duplicate(wmOperatorType *ot) /* api callbacks */ ot->invoke= sequencer_add_duplicate_invoke; ot->exec= sequencer_add_duplicate_exec; - ot->poll= ED_operator_sequencer_active; /* flags */ @@ -1791,10 +1674,7 @@ static int sequencer_delete_exec(bContext *C, wmOperator *op) MetaStack *ms; int nothingSelected = TRUE; - if(ed==NULL) - return OPERATOR_CANCELLED; - - seq=active_seq_get(scene); + seq=seq_active_get(scene); if (seq && seq->flag & SELECT) { /* avoid a loop since this is likely to be selected */ nothingSelected = FALSE; } else { @@ -1854,8 +1734,7 @@ void SEQUENCER_OT_delete(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_operator_confirm; ot->exec= sequencer_delete_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1874,10 +1753,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) int start_ofs, cfra, frame_end; int step= RNA_int_get(op->ptr, "length"); - if(ed==NULL) - return OPERATOR_CANCELLED; - - seq= ed->seqbasep->first; + seq= ed->seqbasep->first; /* poll checks this is valid */ while (seq) { if((seq->flag & SELECT) && (seq->type == SEQ_IMAGE) && (seq->len > 1)) { @@ -1885,7 +1761,8 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) see seq_free_sequence below for the real free'ing */ seq_next = seq->next; BLI_remlink(ed->seqbasep, seq); - if(seq->ipo) seq->ipo->id.us--; + /* if(seq->ipo) seq->ipo->id.us--; */ + /* XXX, remove fcurve and assign to split image strips */ start_ofs = cfra = seq_tx_get_final_left(seq, 0); frame_end = seq_tx_get_final_right(seq, 0); @@ -1909,11 +1786,16 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem"); strncpy(se_new->name, se->name, FILE_MAXFILE-1); calc_sequence(scene, seq_new); - seq_new->flag &= ~SEQ_OVERLAP; - if (seq_test_overlap(ed->seqbasep, seq_new)) { - shuffle_seq(ed->seqbasep, seq_new, scene); + + if(step > 1) { + seq_new->flag &= ~SEQ_OVERLAP; + if (seq_test_overlap(ed->seqbasep, seq_new)) { + shuffle_seq(ed->seqbasep, seq_new, scene); + } } + /* XXX, COPY FCURVES */ + strncpy(seq_new->name+2, seq->name+2, sizeof(seq->name)-2); seqbase_unique_name_recursive(&scene->ed->seqbase, seq_new); cfra++; @@ -1946,8 +1828,7 @@ void SEQUENCER_OT_images_separate(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_operator_props_popup; ot->exec= sequencer_separate_images_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1963,12 +1844,9 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - Sequence *last_seq= active_seq_get(scene); + Sequence *last_seq= seq_active_get(scene); MetaStack *ms; - if(ed==NULL) - return OPERATOR_CANCELLED; - if(last_seq && last_seq->type==SEQ_META && last_seq->flag & SELECT) { /* Enter Metastrip */ ms= MEM_mallocN(sizeof(MetaStack), "metastack"); @@ -1978,7 +1856,7 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *op) ed->seqbasep= &last_seq->seqbase; - active_seq_set(scene, NULL); + seq_active_set(scene, NULL); } else { @@ -1998,7 +1876,7 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *op) for(seq= ed->seqbasep->first; seq; seq= seq->next) calc_sequence(scene, seq); - active_seq_set(scene, ms->parseq); + seq_active_set(scene, ms->parseq); ms->parseq->flag |= SELECT; recurs_sel_seq(ms->parseq); @@ -2022,8 +1900,7 @@ void SEQUENCER_OT_meta_toggle(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_meta_toggle_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2036,13 +1913,9 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - Sequence *seq, *seqm, *next; - + Sequence *seq, *seqm, *next, *last_seq = seq_active_get(scene); int channel_max= 1; - if(ed==NULL) - return OPERATOR_CANCELLED; - if(seqbase_isolated_sel_check(ed->seqbasep)==FALSE) { BKE_report(op->reports, RPT_ERROR, "Please select all related strips"); return OPERATOR_CANCELLED; @@ -2065,14 +1938,14 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op) } seq= next; } - seqm->machine= channel_max; + seqm->machine= last_seq ? last_seq->machine : channel_max; calc_sequence(scene, seqm); seqm->strip= MEM_callocN(sizeof(Strip), "metastrip"); seqm->strip->len= seqm->len; seqm->strip->us= 1; - active_seq_set(scene, seqm); + seq_active_set(scene, seqm); if( seq_test_overlap(ed->seqbasep, seqm) ) shuffle_seq(ed->seqbasep, seqm, scene); @@ -2095,8 +1968,7 @@ void SEQUENCER_OT_meta_make(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_operator_confirm; ot->exec= sequencer_meta_make_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2118,7 +1990,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - Sequence *seq, *last_seq = active_seq_get(scene); /* last_seq checks ed==NULL */ + Sequence *seq, *last_seq = seq_active_get(scene); /* last_seq checks ed==NULL */ if(last_seq==NULL || last_seq->type!=SEQ_META) return OPERATOR_CANCELLED; @@ -2167,8 +2039,7 @@ void SEQUENCER_OT_meta_separate(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_operator_confirm; ot->exec= sequencer_meta_separate_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2200,7 +2071,6 @@ void SEQUENCER_OT_view_all(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_view_all_exec; - ot->poll= ED_operator_sequencer_active; /* flags */ @@ -2237,7 +2107,7 @@ static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op) imgheight= (scene->r.size*scene->r.ysch)/100; /* Apply aspect, dosnt need to be that accurate */ - imgwidth= (int)(imgwidth * ((float)scene->r.xasp / (float)scene->r.yasp)); + imgwidth= (int)(imgwidth * (scene->r.xasp / scene->r.yasp)); if (((imgwidth >= width) || (imgheight >= height)) && ((width > 0) && (height > 0))) { @@ -2267,13 +2137,49 @@ void SEQUENCER_OT_view_all_preview(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_view_all_preview_exec; - ot->poll= ED_operator_sequencer_active; /* flags */ ot->flag= OPTYPE_REGISTER; } + +static int sequencer_view_zoom_ratio_exec(bContext *C, wmOperator *op) +{ + RenderData *r= &CTX_data_scene(C)->r; + View2D *v2d= UI_view2d_fromcontext(C); + + float ratio= RNA_float_get(op->ptr, "ratio"); + + float winx= (int)(r->size * r->xsch)/100; + float winy= (int)(r->size * r->ysch)/100; + + float facx= (v2d->mask.xmax - v2d->mask.xmin) / winx; + float facy= (v2d->mask.ymax - v2d->mask.ymin) / winy; + + BLI_resize_rctf(&v2d->cur, winx*facx*ratio, winy*facy*ratio); + + ED_region_tag_redraw(CTX_wm_region(C)); + + return OPERATOR_FINISHED; +} + +void SEQUENCER_OT_view_zoom_ratio(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Sequencer View Zoom Ratio"; + ot->idname= "SEQUENCER_OT_view_zoom_ratio"; + + /* api callbacks */ + ot->exec= sequencer_view_zoom_ratio_exec; + ot->poll= ED_operator_sequencer_active; + + /* properties */ + RNA_def_float(ot->srna, "ratio", 1.0f, 0.0f, FLT_MAX, + "Ratio", "Zoom ratio, 1.0 is 1:1, higher is zoomed in, lower is zoomed out.", -FLT_MAX, FLT_MAX); +} + + #if 0 static EnumPropertyItem view_type_items[] = { {SEQ_VIEW_SEQUENCE, "SEQUENCER", ICON_SEQ_SEQUENCER, "Sequencer", ""}, @@ -2384,7 +2290,6 @@ void SEQUENCER_OT_view_selected(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_view_selected_exec; - ot->poll= ED_operator_sequencer_active; /* flags */ @@ -2470,7 +2375,7 @@ void SEQUENCER_OT_next_edit(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_next_edit_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2500,7 +2405,7 @@ void SEQUENCER_OT_previous_edit(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_previous_edit_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2541,11 +2446,10 @@ static int sequencer_swap_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - Sequence *active_seq = active_seq_get(scene); + Sequence *active_seq = seq_active_get(scene); Sequence *seq, *iseq; int side= RNA_enum_get(op->ptr, "side"); - if(ed==NULL) return OPERATOR_CANCELLED; if(active_seq==NULL) return OPERATOR_CANCELLED; seq = find_next_prev_sequence(scene, active_seq, side, -1); @@ -2553,9 +2457,9 @@ static int sequencer_swap_exec(bContext *C, wmOperator *op) if(seq) { /* disallow effect strips */ - if ((seq->type!=SEQ_COLOR) && (seq->effectdata || seq->seq1 || seq->seq2 || seq->seq3)) + if (get_sequence_effect_num_inputs(seq->type) >= 1 && (seq->effectdata || seq->seq1 || seq->seq2 || seq->seq3)) return OPERATOR_CANCELLED; - if ((active_seq->type!=SEQ_COLOR) && (active_seq->effectdata || active_seq->seq1 || active_seq->seq2 || active_seq->seq3)) + if ((get_sequence_effect_num_inputs(active_seq->type) >= 1) && (active_seq->effectdata || active_seq->seq1 || active_seq->seq2 || active_seq->seq3)) return OPERATOR_CANCELLED; switch (side) { @@ -2605,7 +2509,7 @@ void SEQUENCER_OT_swap(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_swap_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2618,7 +2522,7 @@ static int sequencer_rendersize_exec(bContext *C, wmOperator *op) { int retval = OPERATOR_CANCELLED; Scene *scene= CTX_data_scene(C); - Sequence *active_seq = active_seq_get(scene); + Sequence *active_seq = seq_active_get(scene); if(active_seq==NULL) return OPERATOR_CANCELLED; @@ -2655,7 +2559,7 @@ void SEQUENCER_OT_rendersize(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_rendersize_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2684,9 +2588,6 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq; - if(ed==NULL) - return OPERATOR_CANCELLED; - seq_free_clipboard(); if(seqbase_isolated_sel_check(ed->seqbasep)==FALSE) { @@ -2694,7 +2595,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - recurs_dupli_seq(scene, ed->seqbasep, &seqbase_clipboard, FALSE); + seqbase_dupli_recursive(scene, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME); seqbase_clipboard_frame= scene->r.cfra; /* Need to remove anything that references the current scene */ @@ -2714,7 +2615,7 @@ void SEQUENCER_OT_copy(wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_copy_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2741,23 +2642,23 @@ static int sequencer_paste_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, TRUE); /* create if needed */ - ListBase new = {NULL, NULL}; + ListBase nseqbase = {NULL, NULL}; int ofs; Sequence *iseq; deselect_all_seq(scene); ofs = scene->r.cfra - seqbase_clipboard_frame; - recurs_dupli_seq(scene, &seqbase_clipboard, &new, FALSE); + seqbase_dupli_recursive(scene, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME); /* transform pasted strips before adding */ if(ofs) { - for(iseq= new.first; iseq; iseq= iseq->next) { + for(iseq= nseqbase.first; iseq; iseq= iseq->next) { seq_offset(scene, iseq, ofs); } } - addlisttolist(ed->seqbasep, &new); + addlisttolist(ed->seqbasep, &nseqbase); WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); @@ -2780,3 +2681,113 @@ void SEQUENCER_OT_paste(wmOperatorType *ot) /* properties */ } + +static int sequencer_swap_data_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Sequence *seq_act; + Sequence *seq_other; + + if(seq_active_pair_get(scene, &seq_act, &seq_other) == 0) { + BKE_report(op->reports, RPT_ERROR, "Must select 2 strips"); + return OPERATOR_CANCELLED; + } + + if(seq_swap(seq_act, seq_other) == 0) { + BKE_report(op->reports, RPT_ERROR, "Strips were not compatible"); + return OPERATOR_CANCELLED; + } + + sound_remove_scene_sound(scene, seq_act->scene_sound); + sound_remove_scene_sound(scene, seq_other->scene_sound); + + seq_act->scene_sound= NULL; + seq_other->scene_sound= NULL; + + calc_sequence(scene, seq_act); + calc_sequence(scene, seq_other); + + if(seq_act->sound) sound_add_scene_sound(scene, seq_act, seq_act->startdisp, seq_act->enddisp, seq_act->startofs + seq_act->anim_startofs); + if(seq_other->sound) sound_add_scene_sound(scene, seq_other, seq_other->startdisp, seq_other->enddisp, seq_other->startofs + seq_other->anim_startofs); + + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); + + return OPERATOR_FINISHED; +} + +void SEQUENCER_OT_swap_data(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Sequencer Swap Data"; + ot->idname= "SEQUENCER_OT_swap_data"; + ot->description="Swap 2 sequencer strips"; + + /* api callbacks */ + ot->exec= sequencer_swap_data_exec; + ot->poll= ED_operator_sequencer_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ +} + +/* borderselect operator */ +static int view_ghost_border_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Editing *ed= seq_give_editing(scene, FALSE); + View2D *v2d= UI_view2d_fromcontext(C); + + rctf rect; + + /* convert coordinates of rect to 'tot' rect coordinates */ + UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmin"), RNA_int_get(op->ptr, "ymin"), &rect.xmin, &rect.ymin); + UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmax"), RNA_int_get(op->ptr, "ymax"), &rect.xmax, &rect.ymax); + + if(ed==NULL) + return OPERATOR_CANCELLED; + + rect.xmin /= (float)(ABS(v2d->tot.xmax - v2d->tot.xmin)); + rect.ymin /= (float)(ABS(v2d->tot.ymax - v2d->tot.ymin)); + + rect.xmax /= (float)(ABS(v2d->tot.xmax - v2d->tot.xmin)); + rect.ymax /= (float)(ABS(v2d->tot.ymax - v2d->tot.ymin)); + + rect.xmin+=0.5; + rect.xmax+=0.5; + rect.ymin+=0.5; + rect.ymax+=0.5; + + CLAMP(rect.xmin, 0.0f, 1.0f); + CLAMP(rect.ymin, 0.0f, 1.0f); + CLAMP(rect.xmax, 0.0f, 1.0f); + CLAMP(rect.ymax, 0.0f, 1.0f); + + scene->ed->over_border= rect; + + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); + + return OPERATOR_FINISHED; +} + +/* ****** Border Select ****** */ +void SEQUENCER_OT_view_ghost_border(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Border Offset View"; + ot->idname= "SEQUENCER_OT_view_ghost_border"; + ot->description="Enable border select mode"; + + /* api callbacks */ + ot->invoke= WM_border_select_invoke; + ot->exec= view_ghost_border_exec; + ot->modal= WM_border_select_modal; + ot->poll= sequencer_view_poll; + + /* flags */ + ot->flag= 0; + + /* rna */ + WM_operator_properties_gesture_border(ot, FALSE); +} diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h index e9f7da95a81..bf0dfff8e98 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.h +++ b/source/blender/editors/space_sequencer/sequencer_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -48,7 +48,7 @@ struct ARegion *sequencer_has_buttons_region(struct ScrArea *sa); /* sequencer_draw.c */ void draw_timeline_seq(const struct bContext *C, struct ARegion *ar); -void draw_image_seq(const struct bContext* C, struct Scene *scene,struct ARegion *ar, struct SpaceSeq *sseq); +void draw_image_seq(const struct bContext* C, struct Scene *scene,struct ARegion *ar, struct SpaceSeq *sseq, int cfra, int offset); void seq_reset_imageofs(struct SpaceSeq *sseq); @@ -67,6 +67,10 @@ int event_to_efftype(int event); int seq_effect_find_selected(struct Scene *scene, struct Sequence *activeseq, int type, struct Sequence **selseq1, struct Sequence **selseq2, struct Sequence **selseq3, char **error_str); struct Sequence *alloc_sequence(struct ListBase *lb, int cfra, int machine); +/* operator helpers */ +int sequencer_edit_poll(struct bContext *C); +int sequencer_view_poll(struct bContext *C); + /* externs */ extern EnumPropertyItem sequencer_prop_effect_types[]; extern EnumPropertyItem prop_side_types[]; @@ -82,6 +86,7 @@ void SEQUENCER_OT_lock(struct wmOperatorType *ot); void SEQUENCER_OT_unlock(struct wmOperatorType *ot); void SEQUENCER_OT_reload(struct wmOperatorType *ot); void SEQUENCER_OT_refresh_all(struct wmOperatorType *ot); +void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot); void SEQUENCER_OT_duplicate(struct wmOperatorType *ot); void SEQUENCER_OT_delete(struct wmOperatorType *ot); void SEQUENCER_OT_images_separate(struct wmOperatorType *ot); @@ -92,11 +97,14 @@ void SEQUENCER_OT_snap(struct wmOperatorType *ot); void SEQUENCER_OT_previous_edit(struct wmOperatorType *ot); void SEQUENCER_OT_next_edit(struct wmOperatorType *ot); void SEQUENCER_OT_swap(struct wmOperatorType *ot); +void SEQUENCER_OT_swap_data(struct wmOperatorType *ot); void SEQUENCER_OT_rendersize(struct wmOperatorType *ot); void SEQUENCER_OT_view_toggle(struct wmOperatorType *ot); void SEQUENCER_OT_view_all(struct wmOperatorType *ot); void SEQUENCER_OT_view_selected(struct wmOperatorType *ot); +void SEQUENCER_OT_view_zoom_ratio(struct wmOperatorType *ot); +void SEQUENCER_OT_view_ghost_border(struct wmOperatorType *ot); void SEQUENCER_OT_copy(struct wmOperatorType *ot); void SEQUENCER_OT_paste(struct wmOperatorType *ot); @@ -127,22 +135,20 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot); /* RNA enums, just to be more readable */ enum { SEQ_SIDE_NONE=0, - SEQ_SIDE_LEFT, - SEQ_SIDE_RIGHT, + SEQ_SIDE_LEFT, + SEQ_SIDE_RIGHT, SEQ_SIDE_BOTH, }; enum { - SEQ_CUT_SOFT, - SEQ_CUT_HARD, + SEQ_CUT_SOFT, + SEQ_CUT_HARD, }; enum { - SEQ_SELECTED, - SEQ_UNSELECTED, + SEQ_SELECTED, + SEQ_UNSELECTED, }; /* defines used internally */ -#define SEQ_ALLSEL (SELECT+SEQ_LEFTSEL+SEQ_RIGHTSEL) -#define SEQ_DESEL ~SEQ_ALLSEL #define SCE_MARKERS 0 // XXX - dummy /* sequencer_ops.c */ diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index 787d5712640..82f70eafc0a 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -1,6 +1,6 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,11 +32,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_userdef_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -45,13 +41,10 @@ #include "BKE_global.h" #include "BKE_utildefines.h" -#include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" -#include "ED_screen.h" #include "ED_transform.h" /* transform keymap */ #include "sequencer_intern.h" @@ -70,6 +63,7 @@ void sequencer_operatortypes(void) WM_operatortype_append(SEQUENCER_OT_unlock); WM_operatortype_append(SEQUENCER_OT_reload); WM_operatortype_append(SEQUENCER_OT_refresh_all); + WM_operatortype_append(SEQUENCER_OT_reassign_inputs); WM_operatortype_append(SEQUENCER_OT_duplicate); WM_operatortype_append(SEQUENCER_OT_delete); WM_operatortype_append(SEQUENCER_OT_images_separate); @@ -80,12 +74,15 @@ void sequencer_operatortypes(void) WM_operatortype_append(SEQUENCER_OT_next_edit); WM_operatortype_append(SEQUENCER_OT_previous_edit); WM_operatortype_append(SEQUENCER_OT_swap); + WM_operatortype_append(SEQUENCER_OT_swap_data); WM_operatortype_append(SEQUENCER_OT_rendersize); WM_operatortype_append(SEQUENCER_OT_view_all); WM_operatortype_append(SEQUENCER_OT_view_selected); WM_operatortype_append(SEQUENCER_OT_view_all_preview); WM_operatortype_append(SEQUENCER_OT_view_toggle); + WM_operatortype_append(SEQUENCER_OT_view_zoom_ratio); + WM_operatortype_append(SEQUENCER_OT_view_ghost_border); /* sequencer_select.c */ WM_operatortype_append(SEQUENCER_OT_select_all_toggle); @@ -117,6 +114,9 @@ void sequencer_keymap(wmKeyConfig *keyconf) wmKeyMap *keymap= WM_keymap_find(keyconf, "SequencerCommon", SPACE_SEQ, 0); wmKeyMapItem *kmi; + kmi= WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, KM_SHIFT, 0); + RNA_string_set(kmi->ptr, "data_path", "scene.sequence_editor.show_overlay"); + /* operators common to sequence and preview view */ WM_keymap_add_item(keymap, "SEQUENCER_OT_view_toggle", TABKEY, KM_PRESS, KM_CTRL, 0); @@ -139,12 +139,14 @@ void sequencer_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "SEQUENCER_OT_lock", LKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_unlock", LKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); + WM_keymap_add_item(keymap, "SEQUENCER_OT_reassign_inputs", RKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_reload", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", DELKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0); @@ -225,9 +227,28 @@ void sequencer_keymap(wmKeyConfig *keyconf) WM_keymap_add_menu(keymap, "SEQUENCER_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); + kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", OKEY, KM_PRESS, 0, 0); + RNA_string_set(kmi->ptr, "data_path", "scene.sequence_editor.overlay_frame"); + RNA_int_set(kmi->ptr, "value", 0); + transform_keymap_for_space(keyconf, keymap, SPACE_SEQ); keymap= WM_keymap_find(keyconf, "SequencerPreview", SPACE_SEQ, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all_preview", HOMEKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0); + + + keymap= WM_keymap_find(keyconf, "SequencerPreview", SPACE_SEQ, 0); + + WM_keymap_add_item(keymap, "SEQUENCER_OT_view_ghost_border", OKEY, KM_PRESS, 0, 0); + + /* would prefer to use numpad keys for job */ + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f); + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f); + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 2.0f); + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f); + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD2, KM_PRESS, 0, 0)->ptr, "ratio", 0.5f); + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f); + RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f); } diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c index 0257ea5d9ca..d9d027823bc 100644 --- a/source/blender/editors/space_sequencer/sequencer_scopes.c +++ b/source/blender/editors/space_sequencer/sequencer_scopes.c @@ -35,16 +35,16 @@ static void rgb_to_yuv(float rgb[3], float yuv[3]) { - yuv[0]= 0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2]; - yuv[1]= 0.492*(rgb[2] - yuv[0]); - yuv[2]= 0.877*(rgb[0] - yuv[0]); + yuv[0]= 0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2]; + yuv[1]= 0.492*(rgb[2] - yuv[0]); + yuv[2]= 0.877*(rgb[0] - yuv[0]); - /* Normalize */ - yuv[1]*= 255.0/(122*2.0); - yuv[1]+= 0.5; + /* Normalize */ + yuv[1]*= 255.0/(122*2.0); + yuv[1]+= 0.5; - yuv[2]*= 255.0/(157*2.0); - yuv[2]+= 0.5; + yuv[2]*= 255.0/(157*2.0); + yuv[2]+= 0.5; } static void scope_put_pixel(unsigned char* table, unsigned char * pos) @@ -580,7 +580,7 @@ static void vectorscope_put_cross(unsigned char r, unsigned char g, rgb_to_yuv(rgb, yuv); p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1)) - + (int) ((yuv[1] * (w - 3) + 1))); + + (int) ((yuv[1] * (w - 3) + 1))); if (r == 0 && g == 0 && b == 0) { r = 255; @@ -631,7 +631,7 @@ static struct ImBuf *make_vectorscope_view_from_ibuf_byte(struct ImBuf * ibuf) rgb_to_yuv(rgb, yuv); p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1)) - + (int) ((yuv[1] * (w - 3) + 1))); + + (int) ((yuv[1] * (w - 3) + 1))); scope_put_pixel(wtable, (unsigned char*)p); } } @@ -681,7 +681,7 @@ static struct ImBuf *make_vectorscope_view_from_ibuf_float(struct ImBuf * ibuf) rgb_to_yuv(rgb, yuv); p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1)) - + (int) ((yuv[1] * (w - 3) + 1))); + + (int) ((yuv[1] * (w - 3) + 1))); scope_put_pixel(wtable, (unsigned char*)p); } } diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index 437871c7fe8..83fa8bffd58 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -40,13 +40,7 @@ #include "BLI_blenlib.h" #include "BLI_math.h" -#include "DNA_curve_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_sequence_types.h" -#include "DNA_view2d_types.h" -#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -59,27 +53,18 @@ #include "WM_api.h" #include "WM_types.h" -#include "RNA_access.h" #include "RNA_define.h" /* for menu/popup icons etc etc*/ -#include "UI_interface.h" -#include "UI_resources.h" -#include "ED_anim_api.h" -#include "ED_space_api.h" #include "ED_types.h" #include "ED_screen.h" -#include "ED_util.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "UI_view2d.h" /* own include */ #include "sequencer_intern.h" -static void *find_nearest_marker() {return NULL;} -static void deselect_markers() {} +static void *find_nearest_marker(int d1, int d2) {return NULL;} void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK */ { @@ -181,7 +166,7 @@ void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING B if(deselect_all) deselect_all_seq(scene); - active_seq_set(scene, seq); + seq_active_set(scene, seq); if((seq->type==SEQ_IMAGE) || (seq->type==SEQ_MOVIE)) { if(seq->strip) @@ -200,7 +185,7 @@ void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING B void select_neighbor_from_last(Scene *scene, int lr) { - Sequence *seq= active_seq_get(scene); + Sequence *seq= seq_active_get(scene); Sequence *neighbor; int change = 0; if (seq) { @@ -237,9 +222,6 @@ static int sequencer_deselect_exec(bContext *C, wmOperator *op) Sequence *seq; int desel = 0; - if(ed==NULL) - return OPERATOR_CANCELLED; - for(seq= ed->seqbasep->first; seq; seq=seq->next) { if(seq->flag & SEQ_ALLSEL) { desel= 1; @@ -249,7 +231,7 @@ static int sequencer_deselect_exec(bContext *C, wmOperator *op) for(seq= ed->seqbasep->first; seq; seq=seq->next) { if (desel) { - seq->flag &= SEQ_DESEL; + seq->flag &= ~SEQ_ALLSEL; } else { seq->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL); @@ -257,7 +239,7 @@ static int sequencer_deselect_exec(bContext *C, wmOperator *op) } } - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -271,8 +253,7 @@ void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_deselect_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -286,12 +267,9 @@ static int sequencer_select_inverse_exec(bContext *C, wmOperator *op) Editing *ed= seq_give_editing(scene, FALSE); Sequence *seq; - if(ed==NULL) - return OPERATOR_CANCELLED; - for(seq= ed->seqbasep->first; seq; seq=seq->next) { if (seq->flag & SELECT) { - seq->flag &= SEQ_DESEL; + seq->flag &= ~SEQ_ALLSEL; } else { seq->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL); @@ -299,7 +277,7 @@ static int sequencer_select_inverse_exec(bContext *C, wmOperator *op) } } - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -313,8 +291,7 @@ void SEQUENCER_OT_select_inverse(struct wmOperatorType *ot) /* api callbacks */ ot->exec= sequencer_select_inverse_exec; - - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -363,7 +340,7 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) marker->flag |= SELECT; } else { - deselect_markers(0, 0); + /* deselect_markers(0, 0); */ /* XXX, in 2.4x, seq selection used to deselect all, need to re-thnik this for 2.5 */ marker->flag |= SELECT; } @@ -388,6 +365,24 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) } } SEQ_END + + { + SpaceSeq *sseq= CTX_wm_space_seq(C); + if (sseq && sseq->flag & SEQ_MARKER_TRANS) { + TimeMarker *marker; + + for (marker= scene->markers.first; marker; marker= marker->next) { + if( ((x < CFRA) && marker->frame < CFRA) || + ((x >= CFRA) && marker->frame >= CFRA) + ) { + marker->flag |= SELECT; + } + else { + marker->flag &= ~SELECT; + } + } + } + } } else { // seq= find_nearest_seq(scene, v2d, &hand, mval); @@ -397,7 +392,7 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) deselect_all_seq(scene); if(seq) { - active_seq_set(scene, seq); + seq_active_set(scene, seq); if ((seq->type == SEQ_IMAGE) || (seq->type == SEQ_MOVIE)) { if(seq->strip) { @@ -414,7 +409,7 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) switch(hand) { case SEQ_SIDE_NONE: if (linked_handle==0) - seq->flag &= SEQ_DESEL; + seq->flag &= ~SEQ_ALLSEL; break; case SEQ_SIDE_LEFT: seq->flag ^= SEQ_LEFTSEL; @@ -510,7 +505,7 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) } #endif - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); /* allowing tweaks */ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH; @@ -600,7 +595,7 @@ static int sequencer_select_more_exec(bContext *C, wmOperator *op) if(!select_more_less_seq__internal(scene, 0, 0)) return OPERATOR_CANCELLED; - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -610,11 +605,11 @@ void SEQUENCER_OT_select_more(wmOperatorType *ot) /* identifiers */ ot->name= "Select More"; ot->idname= "SEQUENCER_OT_select_more"; - ot->description="DOC_BROKEN"; + ot->description="Select more strips adjacent to the current selection"; /* api callbacks */ ot->exec= sequencer_select_more_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -631,7 +626,7 @@ static int sequencer_select_less_exec(bContext *C, wmOperator *op) if(!select_more_less_seq__internal(scene, 1, 0)) return OPERATOR_CANCELLED; - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -641,11 +636,11 @@ void SEQUENCER_OT_select_less(wmOperatorType *ot) /* identifiers */ ot->name= "Select less"; ot->idname= "SEQUENCER_OT_select_less"; - ot->description="DOC_BROKEN"; + ot->description="Shrink the current selection of adjacent selected strips"; /* api callbacks */ ot->exec= sequencer_select_less_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -686,7 +681,7 @@ static int sequencer_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEv selected = select_more_less_seq__internal(scene, 1, 1); } - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -696,7 +691,7 @@ void SEQUENCER_OT_select_linked_pick(wmOperatorType *ot) /* identifiers */ ot->name= "Select pick linked"; ot->idname= "SEQUENCER_OT_select_linked_pick"; - ot->description="DOC_BROKEN"; + ot->description="Select a chain of linked strips nearest to the mouse pointer"; /* api callbacks */ ot->invoke= sequencer_select_linked_pick_invoke; @@ -721,7 +716,7 @@ static int sequencer_select_linked_exec(bContext *C, wmOperator *op) selected = select_more_less_seq__internal(scene, 1, 1); } - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -731,11 +726,11 @@ void SEQUENCER_OT_select_linked(wmOperatorType *ot) /* identifiers */ ot->name= "Select linked"; ot->idname= "SEQUENCER_OT_select_linked"; - ot->description="DOC_BROKEN"; + ot->description="Select all strips adjacent to the current selection"; /* api callbacks */ ot->exec= sequencer_select_linked_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -752,8 +747,6 @@ static int sequencer_select_handles_exec(bContext *C, wmOperator *op) Sequence *seq; int sel_side= RNA_enum_get(op->ptr, "side"); - if (ed==NULL) - return OPERATOR_CANCELLED; for(seq= ed->seqbasep->first; seq; seq=seq->next) { if (seq->flag & SELECT) { @@ -773,7 +766,7 @@ static int sequencer_select_handles_exec(bContext *C, wmOperator *op) } } - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -783,11 +776,11 @@ void SEQUENCER_OT_select_handles(wmOperatorType *ot) /* identifiers */ ot->name= "Select Handles"; ot->idname= "SEQUENCER_OT_select_handles"; - ot->description="DOC_BROKEN"; + ot->description="Select manipulator handles on the sides of the selected strip"; /* api callbacks */ ot->exec= sequencer_select_handles_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -801,7 +794,7 @@ static int sequencer_select_active_side_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, 0); - Sequence *seq_act= active_seq_get(scene); + Sequence *seq_act= seq_active_get(scene); if (ed==NULL || seq_act==NULL) return OPERATOR_CANCELLED; @@ -810,7 +803,7 @@ static int sequencer_select_active_side_exec(bContext *C, wmOperator *op) select_active_side(ed->seqbasep, RNA_enum_get(op->ptr, "side"), seq_act->machine, seq_act->startdisp); - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } @@ -820,11 +813,11 @@ void SEQUENCER_OT_select_active_side(wmOperatorType *ot) /* identifiers */ ot->name= "Select Active Side"; ot->idname= "SEQUENCER_OT_select_active_side"; - ot->description="DOC_BROKEN"; + ot->description="Select strips on the nominated side of the active strip"; /* api callbacks */ ot->exec= sequencer_select_active_side_exec; - ot->poll= ED_operator_sequencer_active; + ot->poll= sequencer_edit_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -867,12 +860,12 @@ static int sequencer_borderselect_exec(bContext *C, wmOperator *op) if(BLI_isect_rctf(&rq, &rectf, 0)) { if(selecting) seq->flag |= SELECT; - else seq->flag &= SEQ_DESEL; + else seq->flag &= ~SEQ_ALLSEL; recurs_sel_seq(seq); } } - WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER_SELECT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index ba405f74ba6..586b76268e4 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,36 +29,27 @@ #include #include -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_math.h" -#include "BLI_rand.h" -#include "BKE_colortools.h" #include "BKE_context.h" #include "BKE_screen.h" #include "BKE_sequencer.h" +#include "BKE_global.h" -#include "ED_space_api.h" #include "ED_screen.h" - -#include "BIF_gl.h" +#include "ED_view3d.h" /* only for sequencer view3d drawing callback */ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "ED_markers.h" - #include "sequencer_intern.h" // own include /* ******************** manage regions ********************* */ @@ -110,44 +101,44 @@ void ED_sequencer_update_view(bContext *C, int view) switch (view) { case SEQ_VIEW_SEQUENCE: - if (ar_main->flag & RGN_FLAG_HIDDEN) { + if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { ar_main->flag &= ~RGN_FLAG_HIDDEN; ar_main->v2d.flag &= ~V2D_IS_INITIALISED; } - if (!(ar_preview->flag & RGN_FLAG_HIDDEN)) { + if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) { ar_preview->flag |= RGN_FLAG_HIDDEN; ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; WM_event_remove_handlers(C, &ar_preview->handlers); } - ar_main->alignment= RGN_ALIGN_NONE; - ar_preview->alignment= RGN_ALIGN_NONE; + if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; + if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE; break; case SEQ_VIEW_PREVIEW: - if (!(ar_main->flag & RGN_FLAG_HIDDEN)) { + if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) { ar_main->flag |= RGN_FLAG_HIDDEN; ar_main->v2d.flag &= ~V2D_IS_INITIALISED; WM_event_remove_handlers(C, &ar_main->handlers); } - if (ar_preview->flag & RGN_FLAG_HIDDEN) { + if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { ar_preview->flag &= ~RGN_FLAG_HIDDEN; ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; ar_preview->v2d.cur = ar_preview->v2d.tot; } - ar_main->alignment= RGN_ALIGN_NONE; - ar_preview->alignment= RGN_ALIGN_NONE; + if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; + if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE; break; case SEQ_VIEW_SEQUENCE_PREVIEW: - if (ar_main->flag & RGN_FLAG_HIDDEN) { + if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { ar_main->flag &= ~RGN_FLAG_HIDDEN; ar_main->v2d.flag &= ~V2D_IS_INITIALISED; } - if (ar_preview->flag & RGN_FLAG_HIDDEN) { + if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { ar_preview->flag &= ~RGN_FLAG_HIDDEN; ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; ar_preview->v2d.cur = ar_preview->v2d.tot; } - ar_main->alignment= RGN_ALIGN_NONE; - ar_preview->alignment= RGN_ALIGN_TOP; + if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; + if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP; break; } @@ -195,15 +186,15 @@ static SpaceLink *sequencer_new(const bContext *C) /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */ ar->v2d.keepzoom= V2D_KEEPASPECT | V2D_KEEPZOOM; ar->v2d.minzoom= 0.00001f; - ar->v2d.maxzoom= 100000.0f; - ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */ - ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */ - ar->v2d.tot.xmax= 960.0f; - ar->v2d.tot.ymax= 540.0f; - ar->v2d.min[0]= 0.0f; - ar->v2d.min[1]= 0.0f; - ar->v2d.max[0]= 12000.0f; - ar->v2d.max[1]= 12000.0f; + ar->v2d.maxzoom= 100000.0f; + ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */ + ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */ + ar->v2d.tot.xmax= 960.0f; + ar->v2d.tot.ymax= 540.0f; + ar->v2d.min[0]= 0.0f; + ar->v2d.min[1]= 0.0f; + ar->v2d.max[0]= 12000.0f; + ar->v2d.max[1]= 12000.0f; ar->v2d.cur= ar->v2d.tot; ar->v2d.align= V2D_ALIGN_FREE; ar->v2d.keeptot= V2D_KEEPTOT_FREE; @@ -315,7 +306,7 @@ static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) static int movie_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) { if(drag->type==WM_DRAG_PATH) - if(ELEM(drag->icon, ICON_FILE_MOVIE, ICON_FILE_BLANK)) /* rule might not work? */ + if(ELEM3(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK)) /* rule might not work? */ return 1; return 0; } @@ -331,7 +322,7 @@ static int sound_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "path", drag->path); + RNA_string_set(drop->ptr, "filepath", drag->path); } /* this region dropbox definition */ @@ -364,9 +355,9 @@ static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn) case NC_SCENE: switch(wmn->data) { case ND_FRAME: + case ND_FRAME_RANGE: case ND_MARKERS: case ND_SEQUENCER: - case ND_SEQUENCER_SELECT: ED_region_tag_redraw(ar); break; } @@ -405,7 +396,21 @@ static void sequencer_preview_area_draw(const bContext *C, ARegion *ar) /* XXX temp fix for wrong setting in sseq->mainb */ if (sseq->mainb == SEQ_DRAW_SEQUENCE) sseq->mainb = SEQ_DRAW_IMG_IMBUF; - draw_image_seq(C, scene, ar, sseq); + + draw_image_seq(C, scene, ar, sseq, scene->r.cfra, 0); + + if(scene->ed && scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW && sseq->mainb == SEQ_DRAW_IMG_IMBUF) { + int over_cfra; + + if(scene->ed->over_flag & SEQ_EDIT_OVERLAY_ABS) + over_cfra= scene->ed->over_cfra; + else + over_cfra= scene->r.cfra + scene->ed->over_ofs; + + if(over_cfra != scene->r.cfra) + draw_image_seq(C, scene, ar, sseq, scene->r.cfra, over_cfra - scene->r.cfra); + } + } static void sequencer_preview_area_listener(ARegion *ar, wmNotifier *wmn) @@ -417,7 +422,6 @@ static void sequencer_preview_area_listener(ARegion *ar, wmNotifier *wmn) case ND_FRAME: case ND_MARKERS: case ND_SEQUENCER: - case ND_SEQUENCER_SELECT: ED_region_tag_redraw(ar); break; } @@ -459,7 +463,6 @@ static void sequencer_buttons_area_listener(ARegion *ar, wmNotifier *wmn) switch(wmn->data) { case ND_FRAME: case ND_SEQUENCER: - case ND_SEQUENCER_SELECT: ED_region_tag_redraw(ar); break; } @@ -540,5 +543,10 @@ void ED_spacetype_sequencer(void) BLI_addhead(&st->regiontypes, art); BKE_spacetype_register(st); + + /* set the sequencer callback when not in background mode */ + if(G.background==0) { + sequencer_view3d_cb= ED_view3d_draw_offscreen_imbuf_simple; + } } diff --git a/source/blender/editors/space_sound/CMakeLists.txt b/source/blender/editors/space_sound/CMakeLists.txt new file mode 100644 index 00000000000..60c8f5e44bd --- /dev/null +++ b/source/blender/editors/space_sound/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_sound "${SRC}" "${INC}") diff --git a/source/blender/editors/space_sound/sound_header.c b/source/blender/editors/space_sound/sound_header.c index 2e6bf599692..acc9645af9d 100644 --- a/source/blender/editors/space_sound/sound_header.c +++ b/source/blender/editors/space_sound/sound_header.c @@ -29,10 +29,6 @@ #include #include -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -45,8 +41,6 @@ #include "ED_types.h" #include "ED_util.h" -#include "WM_api.h" -#include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" diff --git a/source/blender/editors/space_sound/sound_intern.h b/source/blender/editors/space_sound/sound_intern.h index fd64ccb22b1..7117e7d6df9 100644 --- a/source/blender/editors/space_sound/sound_intern.h +++ b/source/blender/editors/space_sound/sound_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c index f0ec9b3ebb9..174d686cf73 100644 --- a/source/blender/editors/space_sound/space_sound.c +++ b/source/blender/editors/space_sound/space_sound.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,10 +30,7 @@ #include #include "DNA_sound_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -45,7 +42,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -53,11 +49,9 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" -#include "ED_markers.h" #include "sound_intern.h" // own include @@ -156,11 +150,9 @@ static void sound_main_area_draw(const bContext *C, ARegion *ar) /* draw entirely, view changes should be handled here */ // SpaceSound *ssound= (SpaceSound*)CTX_wm_space_data(C); View2D *v2d= &ar->v2d; - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt new file mode 100644 index 00000000000..0616cf5147a --- /dev/null +++ b/source/blender/editors/space_text/CMakeLists.txt @@ -0,0 +1,41 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenfont + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +IF(WITH_PYTHON) + SET(INC ${INC} ${PYTHON_INC} ../../python) +ELSE(WITH_PYTHON) + ADD_DEFINITIONS(-DDISABLE_PYTHON) +ENDIF(WITH_PYTHON) + +BLENDERLIB(bf_editor_text "${SRC}" "${INC}") diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 44aeb9158f0..7f3741e8e17 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,10 +31,6 @@ #include "DNA_text_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "MEM_guardedalloc.h" @@ -46,7 +42,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -60,7 +55,6 @@ #include "RNA_access.h" -#include "ED_markers.h" #include "text_intern.h" // own include @@ -124,15 +118,13 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn) /* context changes */ switch(wmn->category) { case NC_TEXT: - if(!wmn->reference || wmn->reference == st->text) { + if(!wmn->reference || wmn->reference == st->text || wmn->data == ND_DISPLAY || wmn->action == NA_EDITED) { ED_area_tag_redraw(sa); if(wmn->action == NA_EDITED) if(st->text) text_update_edited(st->text); } - else if(wmn->data == ND_DISPLAY) - ED_area_tag_redraw(sa); break; case NC_SPACE: @@ -223,19 +215,19 @@ static void text_keymap(struct wmKeyConfig *keyconf) #endif kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 0); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 1); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 0); kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADMINUS, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.font_size"); + RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); RNA_boolean_set(kmi->ptr, "reverse", 1); WM_keymap_add_item(keymap, "TEXT_OT_new", NKEY, KM_PRESS, KM_ALT, 0); @@ -313,6 +305,8 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_line_break", RETKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_line_break", PADENTER, KM_PRESS, 0, 0); + WM_keymap_add_menu(keymap, "TEXT_MT_toolbox", RIGHTMOUSE, KM_PRESS, KM_ANY, 0); + WM_keymap_add_item(keymap, "TEXT_OT_line_number", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); WM_keymap_add_item(keymap, "TEXT_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last! } @@ -340,12 +334,18 @@ static int text_context(const bContext *C, const char *member, bContextDataResul static void text_main_area_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; + ListBase *lb; UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy); /* own keymap */ keymap= WM_keymap_find(wm->defaultconf, "Text", SPACE_TEXT, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); + + /* add drop boxes */ + lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); + + WM_event_add_dropbox_handler(&ar->handlers, lb); } static void text_main_area_draw(const bContext *C, ARegion *ar) @@ -353,11 +353,9 @@ static void text_main_area_draw(const bContext *C, ARegion *ar) /* draw entirely, view changes should be handled here */ SpaceText *st= CTX_wm_space_text(C); //View2D *v2d= &ar->v2d; - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); // UI_view2d_view_ortho(C, v2d); @@ -376,6 +374,36 @@ static void text_cursor(wmWindow *win, ScrArea *sa, ARegion *ar) WM_cursor_set(win, BC_TEXTEDITCURSOR); } + + +/* ************* dropboxes ************* */ + +static int text_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) +{ + if(drag->type==WM_DRAG_PATH) + if(ELEM(drag->icon, 0, ICON_FILE_BLANK)) /* rule might not work? */ + return 1; + return 0; +} + +static void text_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + /* copy drag path to properties */ + RNA_string_set(drop->ptr, "filepath", drag->path); +} + +/* this region dropbox definition */ +static void text_dropboxes(void) +{ + ListBase *lb= WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); + + WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy); + +} + +/* ************* end drop *********** */ + + /****************** header region ******************/ /* add handlers, stuff you only do once or on area/region changes */ @@ -421,6 +449,7 @@ void ED_spacetype_text(void) st->keymap= text_keymap; st->listener= text_listener; st->context= text_context; + st->dropboxes = text_dropboxes; /* regions: main window */ art= MEM_callocN(sizeof(ARegionType), "spacetype text region"); @@ -435,7 +464,7 @@ void ED_spacetype_text(void) art= MEM_callocN(sizeof(ARegionType), "spacetype text region"); art->regionid = RGN_TYPE_UI; art->prefsizex= UI_COMPACT_PANEL_WIDTH; - art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D; + art->keymapflag= ED_KEYMAP_UI; art->init= text_properties_area_init; art->draw= text_properties_area_draw; diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c index 8f9f475b9c8..873deb30511 100644 --- a/source/blender/editors/space_text/text_draw.c +++ b/source/blender/editors/space_text/text_draw.c @@ -60,18 +60,15 @@ #include "text_intern.h" /******************** text font drawing ******************/ +static int mono= -1; // XXX needs proper storage and change all the BLF_* here static void text_font_begin(SpaceText *st) { - static int mono= -1; // XXX needs proper storage - if(mono == -1) mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size); - BLF_set(mono); - BLF_aspect(1.0); - - BLF_size(st->lheight, 72); + BLF_aspect(mono, 1.0); + BLF_size(mono, st->lheight, 72); } static void text_font_end(SpaceText *st) @@ -80,10 +77,10 @@ static void text_font_end(SpaceText *st) static int text_font_draw(SpaceText *st, int x, int y, char *str) { - BLF_position(x, y, 0); - BLF_draw(str); + BLF_position(mono, x, y, 0); + BLF_draw(mono, str); - return BLF_width(str); + return BLF_width(mono, str); } static int text_font_draw_character(SpaceText *st, int x, int y, char c) @@ -93,15 +90,15 @@ static int text_font_draw_character(SpaceText *st, int x, int y, char c) str[0]= c; str[1]= '\0'; - BLF_position(x, y, 0); - BLF_draw(str); + BLF_position(mono, x, y, 0); + BLF_draw(mono, str); return st->cwidth; } int text_font_width(SpaceText *st, char *str) { - return BLF_width(str); + return BLF_width(mono, str); } /****************** flatten string **********************/ @@ -227,6 +224,24 @@ static int find_specialvar(char *string) return i; } +static int find_bool(char *string) +{ + int i = 0; + /* Check for "False" */ + if(string[0]=='F' && string[1]=='a' && string[2]=='l' && string[3]=='s' && string[4]=='e') + i = 5; + /* Check for "True" */ + else if(string[0]=='T' && string[1]=='r' && string[2]=='u' && string[3]=='e') + i = 4; + /* Check for "None" */ + else if(string[0]=='N' && string[1]=='o' && string[2]=='n' && string[3]=='e') + i = 4; + /* If next source char is an identifier (eg. 'i' in "definate") no match */ + if(i==0 || text_check_identifier(string[i])) + return -1; + return i; +} + /* Ensures the format string for the given line is long enough, reallocating as needed. Allocation is done here, alone, to ensure consistency. */ int text_check_format_len(TextLine *line, unsigned int len) @@ -249,14 +264,14 @@ int text_check_format_len(TextLine *line, unsigned int len) /* Formats the specified line. If do_next is set, the process will move on to the succeeding line if it is affected (eg. multiline strings). Format strings may contain any of the following characters: - '_' Whitespace - '#' Comment text - '!' Punctuation and other symbols - 'n' Numerals - 'l' String letters - 'v' Special variables (class, def) - 'b' Built-in names (print, for, etc.) - 'q' Other text (identifiers, etc.) + '_' Whitespace + '#' Comment text + '!' Punctuation and other symbols + 'n' Numerals + 'l' String letters + 'v' Special variables (class, def) + 'b' Built-in names (print, for, etc.) + 'q' Other text (identifiers, etc.) It is terminated with a null-terminator '\0' followed by a continuation flag indicating whether the line is part of a multi-line string. */ @@ -338,6 +353,17 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) /* Numbers (digits not part of an identifier and periods followed by digits) */ else if((prev != 'q' && text_check_digit(*str)) || (*str == '.' && text_check_digit(*(str+1)))) *fmt = 'n'; + /* Booleans */ + else if(prev != 'q' && (i=find_bool(str)) != -1) + if(i>0) { + while(i>1) { + *fmt = 'n'; fmt++; str++; + i--; + } + *fmt = 'n'; + } + else + *fmt = 'q'; /* Punctuation */ else if(text_check_delim(*str)) *fmt = '!'; @@ -1237,7 +1263,7 @@ void draw_text_main(SpaceText *st, ARegion *ar) } text_font_begin(st); - st->cwidth= BLF_fixed_width(); + st->cwidth= BLF_fixed_width(mono); st->cwidth= MAX2(st->cwidth, 1); /* draw line numbers background */ @@ -1307,7 +1333,7 @@ void draw_text_main(SpaceText *st, ARegion *ar) void text_update_character_width(SpaceText *st) { text_font_begin(st); - st->cwidth= BLF_fixed_width(); + st->cwidth= BLF_fixed_width(mono); st->cwidth= MAX2(st->cwidth, 1); text_font_end(st); } @@ -1318,11 +1344,13 @@ void text_update_cursor_moved(bContext *C) { ScrArea *sa= CTX_wm_area(C); SpaceText *st= CTX_wm_space_text(C); - Text *text= st->text; + Text *text; ARegion *ar; int i, x, winx= 0; - if(!st) return; + if(!st || !st->text || st->text->curl) return; + + text= st->text; for(ar=sa->regionbase.first; ar; ar= ar->next) if(ar->regiontype==RGN_TYPE_WINDOW) @@ -1330,8 +1358,6 @@ void text_update_cursor_moved(bContext *C) winx -= TXT_SCROLL_WIDTH; - if(!text || !text->curl) return; - text_update_character_width(st); i= txt_get_span(text->lines.first, text->sell); diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c index f9b11022cd1..3b1c882ff2f 100644 --- a/source/blender/editors/space_text/text_header.c +++ b/source/blender/editors/space_text/text_header.c @@ -42,10 +42,6 @@ #include "BLI_winstuff.h" #endif -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_text_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -61,20 +57,13 @@ #include "BKE_text.h" #include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" -#include "WM_api.h" #include "WM_types.h" #include "BIF_gl.h" #include "BIF_glutil.h" -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" -#include "RNA_access.h" #ifndef DISABLE_PYTHON #include "BPY_extern.h" @@ -136,7 +125,7 @@ void TEXT_OT_properties(wmOperatorType *ot) { /* identifiers */ ot->name= "Properties"; - ot->description= "Toggle text properties panel"; + ot->description= "Toggle text properties panel"; ot->idname= "TEXT_OT_properties"; /* api callbacks */ @@ -214,10 +203,10 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPopupMenu *pup; pup= uiPupMenuBegin(C, "Text", 0); - uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP); - uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM); - uiItemEnumO(layout, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE); - uiItemEnumO(layout, "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE); + uiItemEnumO(layout, "TEXT_OT_move", "Top of File", 0, "type", FILE_TOP); + uiItemEnumO(layout, "TEXT_OT_move", "Bottom of File", 0, "type", FILE_BOTTOM); + uiItemEnumO(layout, "TEXT_OT_move", "Page Up", 0, "type", PREV_PAGE); + uiItemEnumO(layout, "TEXT_OT_move", "Page Down", 0, "type", NEXT_PAGE); uiPupMenuEnd(C, pup); } #endif diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h index e8cecab8404..a93f30ac62a 100644 --- a/source/blender/editors/space_text/text_intern.h +++ b/source/blender/editors/space_text/text_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -99,7 +99,7 @@ void text_pop_suggest_list(); /* text_ops.c */ enum { LINE_BEGIN, LINE_END, FILE_TOP, FILE_BOTTOM, PREV_CHAR, NEXT_CHAR, - PREV_WORD, NEXT_WORD, PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE }; + PREV_WORD, NEXT_WORD, PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE }; enum { DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD }; void TEXT_OT_new(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index be1151219a2..a684c4dce0e 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -35,13 +35,7 @@ #include "MEM_guardedalloc.h" #include "DNA_constraint_types.h" -#include "DNA_object_types.h" -#include "DNA_action_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_text_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" #include "PIL_time.h" @@ -196,6 +190,9 @@ void TEXT_OT_new(wmOperatorType *ot) /* api callbacks */ ot->exec= new_exec; ot->poll= text_new_poll; + + /* flags */ + ot->flag= OPTYPE_UNDO; } /******************* open operator *********************/ @@ -221,8 +218,9 @@ static int open_exec(bContext *C, wmOperator *op) PropertyPointerRNA *pprop; PointerRNA idptr; char str[FILE_MAX]; + short internal = RNA_int_get(op->ptr, "internal"); - RNA_string_get(op->ptr, "path", str); + RNA_string_get(op->ptr, "filepath", str); text= add_text(str, G.sce); @@ -250,6 +248,13 @@ static int open_exec(bContext *C, wmOperator *op) st->text= text; st->top= 0; } + + if (internal) { + if(text->name) + MEM_freeN(text->name); + + text->name = NULL; + } WM_event_add_notifier(C, NC_TEXT|NA_ADDED, text); @@ -263,11 +268,11 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) Text *text= CTX_data_edit_text(C); char *path= (text && text->name)? text->name: G.sce; - if(RNA_property_is_set(op->ptr, "path")) + if(RNA_property_is_set(op->ptr, "filepath")) return open_exec(C, op); open_init(C, op); - RNA_string_set(op->ptr, "path", path); + RNA_string_set(op->ptr, "filepath", path); WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; @@ -286,8 +291,12 @@ void TEXT_OT_open(wmOperatorType *ot) ot->cancel= open_cancel; ot->poll= text_new_poll; + /* flags */ + ot->flag= OPTYPE_UNDO; + /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE, FILE_SPECIAL, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH); //XXX TODO, relative_path + RNA_def_boolean(ot->srna, "internal", 0, "Make internal", "Make text file internal after loading"); } /******************* reload operator *********************/ @@ -366,6 +375,9 @@ void TEXT_OT_unlink(wmOperatorType *ot) ot->exec= unlink_exec; ot->invoke= WM_operator_confirm; ot->poll= text_edit_poll; + + /* flags */ + ot->flag= OPTYPE_UNDO; } /******************* make internal operator *********************/ @@ -397,6 +409,9 @@ void TEXT_OT_make_internal(wmOperatorType *ot) /* api callbacks */ ot->exec= make_internal_exec; ot->poll= text_edit_poll; + + /* flags */ + ot->flag= OPTYPE_UNDO; } /******************* save operator *********************/ @@ -420,7 +435,7 @@ static void txt_write_file(Text *text, ReportList *reports) char file[FILE_MAXDIR+FILE_MAXFILE]; BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE); - BLI_convertstringcode(file, G.sce); + BLI_path_abs(file, G.sce); fp= fopen(file, "w"); if(fp==NULL) { @@ -479,7 +494,7 @@ static int save_as_exec(bContext *C, wmOperator *op) if(!text) return OPERATOR_CANCELLED; - RNA_string_get(op->ptr, "path", str); + RNA_string_get(op->ptr, "filepath", str); if(text->name) MEM_freeN(text->name); text->name= BLI_strdup(str); @@ -498,7 +513,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) Text *text= CTX_data_edit_text(C); char *str; - if(RNA_property_is_set(op->ptr, "path")) + if(RNA_property_is_set(op->ptr, "filepath")) return save_as_exec(C, op); if(text->name) @@ -508,7 +523,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) else str= G.sce; - RNA_string_set(op->ptr, "path", str); + RNA_string_set(op->ptr, "filepath", str); WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; @@ -527,7 +542,7 @@ void TEXT_OT_save_as(wmOperatorType *ot) ot->poll= text_edit_poll; /* properties */ - WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE, FILE_SPECIAL, FILE_SAVE); + WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH); //XXX TODO, relative_path } /******************* run script operator *********************/ @@ -746,7 +761,7 @@ void TEXT_OT_paste(wmOperatorType *ot) /* api callbacks */ ot->exec= paste_exec; ot->poll= text_edit_poll; - + /* properties */ RNA_def_boolean(ot->srna, "selection", 0, "Selection", "Paste text selected elsewhere rather than copied, X11 only."); } @@ -1592,10 +1607,12 @@ static int jump_exec(bContext *C, wmOperator *op) int line= RNA_int_get(op->ptr, "line"); short nlines= txt_get_span(text->lines.first, text->lines.last)+1; - if(line < 1 || line > nlines) - return OPERATOR_CANCELLED; - - txt_move_toline(text, line-1, 0); + if(line < 1) + txt_move_toline(text, 1, 0); + else if(line > nlines) + txt_move_toline(text, nlines-1, 0); + else + txt_move_toline(text, line-1, 0); text_update_cursor_moved(C); WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text); @@ -1603,6 +1620,12 @@ static int jump_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +static int jump_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + return WM_operator_props_dialog_popup(C,op,200,100); + +} + void TEXT_OT_jump(wmOperatorType *ot) { /* identifiers */ @@ -1611,7 +1634,7 @@ void TEXT_OT_jump(wmOperatorType *ot) ot->description= "Jump cursor to line"; /* api callbacks */ - ot->invoke= WM_operator_props_popup; + ot->invoke= jump_invoke; ot->exec= jump_exec; ot->poll= text_edit_poll; @@ -1699,7 +1722,7 @@ static void screen_skip(SpaceText *st, int lines) { int last; - st->top += lines; + st->top += lines; last= txt_get_span(st->text->lines.first, st->text->lines.last); last= last - (st->viewlines/2); @@ -1849,9 +1872,9 @@ void TEXT_OT_scroll(wmOperatorType *ot) { /* identifiers */ ot->name= "Scroll"; - /*don't really see the difference between this and - scroll_bar. Both do basically the same thing (aside - from keymaps).*/ + /*don't really see the difference between this and + scroll_bar. Both do basically the same thing (aside + from keymaps).*/ ot->idname= "TEXT_OT_scroll"; ot->description= "Scroll text screen"; @@ -1902,9 +1925,9 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot) { /* identifiers */ ot->name= "Scrollbar"; - /*don't really see the difference between this and - scroll. Both do basically the same thing (aside - from keymaps).*/ + /*don't really see the difference between this and + scroll. Both do basically the same thing (aside + from keymaps).*/ ot->idname= "TEXT_OT_scroll_bar"; ot->description= "Scroll text screen"; @@ -2542,7 +2565,7 @@ int text_file_modified(Text *text) return 0; BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE); - BLI_convertstringcode(file, G.sce); + BLI_path_abs(file, G.sce); if(!BLI_exists(file)) return 2; @@ -2570,7 +2593,7 @@ static void text_ignore_modified(Text *text) if(!text || !text->name) return; BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE); - BLI_convertstringcode(file, G.sce); + BLI_path_abs(file, G.sce); if(!BLI_exists(file)) return; @@ -2614,25 +2637,25 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event) /* modified locally and externally, ahhh. offer more possibilites. */ pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", 0); layout= uiPupMenuLayout(pup); - uiItemEnumO(layout, "Reload from disk (ignore local changes)", 0, op->type->idname, "resolution", RESOLVE_RELOAD); - uiItemEnumO(layout, "Save to disk (ignore outside changes)", 0, op->type->idname, "resolution", RESOLVE_SAVE); - uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL); + uiItemEnumO(layout, op->type->idname, "Reload from disk (ignore local changes)", 0, "resolution", RESOLVE_RELOAD); + uiItemEnumO(layout, op->type->idname, "Save to disk (ignore outside changes)", 0, "resolution", RESOLVE_SAVE); + uiItemEnumO(layout, op->type->idname, "Make text internal (separate copy)", 0, "resolution", RESOLVE_MAKE_INTERNAL); uiPupMenuEnd(C, pup); } else { pup= uiPupMenuBegin(C, "File Modified Outside Blender", 0); layout= uiPupMenuLayout(pup); - uiItemEnumO(layout, "Reload from disk", 0, op->type->idname, "resolution", RESOLVE_RELOAD); - uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL); - uiItemEnumO(layout, "Ignore", 0, op->type->idname, "resolution", RESOLVE_IGNORE); + uiItemEnumO(layout, op->type->idname, "Reload from disk", 0, "resolution", RESOLVE_RELOAD); + uiItemEnumO(layout, op->type->idname, "Make text internal (separate copy)", 0, "resolution", RESOLVE_MAKE_INTERNAL); + uiItemEnumO(layout, op->type->idname, "Ignore", 0, "resolution", RESOLVE_IGNORE); uiPupMenuEnd(C, pup); } break; case 2: pup= uiPupMenuBegin(C, "File Deleted Outside Blender", 0); layout= uiPupMenuLayout(pup); - uiItemEnumO(layout, "Make text internal", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL); - uiItemEnumO(layout, "Recreate file", 0, op->type->idname, "resolution", RESOLVE_SAVE); + uiItemEnumO(layout, op->type->idname, "Make text internal", 0, "resolution", RESOLVE_MAKE_INTERNAL); + uiItemEnumO(layout, op->type->idname, "Recreate file", 0, "resolution", RESOLVE_SAVE); uiPupMenuEnd(C, pup); break; } diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c index c5d56408b1e..aee1a7ecfd6 100644 --- a/source/blender/editors/space_text/text_python.c +++ b/source/blender/editors/space_text/text_python.c @@ -39,7 +39,6 @@ #include "BLI_blenlib.h" -#include "WM_api.h" #include "WM_types.h" #include "text_intern.h" diff --git a/source/blender/editors/space_time/CMakeLists.txt b/source/blender/editors/space_time/CMakeLists.txt new file mode 100644 index 00000000000..39b7ba355b9 --- /dev/null +++ b/source/blender/editors/space_time/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_time "${SRC}" "${INC}") diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index 0dc4bff0ebf..b73c08e6542 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -30,10 +30,8 @@ #include #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" +#include "DNA_particle_types.h" #include "MEM_guardedalloc.h" @@ -43,13 +41,12 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_screen.h" +#include "BKE_pointcache.h" #include "BKE_utildefines.h" #include "ED_anim_api.h" #include "ED_keyframes_draw.h" -#include "ED_space_api.h" #include "ED_screen.h" -#include "ED_util.h" #include "WM_api.h" #include "WM_types.h" @@ -57,7 +54,6 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -90,6 +86,174 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar fdrawline((float)PEFRA, v2d->cur.ymin, (float)PEFRA, v2d->cur.ymax); } +#define CACHE_DRAW_HEIGHT 3.0f + +static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar) +{ + SpaceTimeCache *stc; + float yoffs=0.f; + + if (!(stime->cache_display & TIME_CACHE_DISPLAY)) + return; + + for (stc= stime->caches.first; stc; stc=stc->next) { + float col[4]; + + if (!stc->array || !stc->ok) + continue; + + glPushMatrix(); + glTranslatef(0.0, (float)V2D_SCROLL_HEIGHT+yoffs, 0.0); + glScalef(1.0, CACHE_DRAW_HEIGHT, 0.0); + + switch(stc->type) { + case PTCACHE_TYPE_SOFTBODY: + col[0] = 1.0; col[1] = 0.4; col[2] = 0.02; + col[3] = 0.1; + break; + case PTCACHE_TYPE_PARTICLES: + col[0] = 1.0; col[1] = 0.1; col[2] = 0.02; + col[3] = 0.1; + break; + case PTCACHE_TYPE_CLOTH: + col[0] = 0.1; col[1] = 0.1; col[2] = 0.75; + col[3] = 0.1; + break; + case PTCACHE_TYPE_SMOKE_DOMAIN: + case PTCACHE_TYPE_SMOKE_HIGHRES: + col[0] = 0.2; col[1] = 0.2; col[2] = 0.2; + col[3] = 0.1; + break; + } + glColor4fv(col); + + glEnable(GL_BLEND); + + glRectf((float)stc->startframe, 0.0, (float)stc->endframe, 1.0); + + col[3] = 0.4; + if (stc->flag & PTCACHE_BAKED) { + col[0] -= 0.4; col[1] -= 0.4; col[2] -= 0.4; + } + glColor4fv(col); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, stc->array); + glDrawArrays(GL_QUADS, 0, stc->len); + glDisableClientState(GL_VERTEX_ARRAY); + + glDisable(GL_BLEND); + + glPopMatrix(); + + yoffs += CACHE_DRAW_HEIGHT; + } +} + +static void time_cache_free(SpaceTime *stime) +{ + SpaceTimeCache *stc; + + for (stc= stime->caches.first; stc; stc=stc->next) { + if (stc->array) { + MEM_freeN(stc->array); + stc->array = NULL; + } + } + + BLI_freelistN(&stime->caches); +} + +static void time_cache_refresh(const bContext *C, SpaceTime *stime, ARegion *ar) +{ + Object *ob = CTX_data_active_object(C); + PTCacheID *pid; + ListBase pidlist; + + time_cache_free(stime); + + if (!(stime->cache_display & TIME_CACHE_DISPLAY) || (!ob)) + return; + + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); + + /* iterate over pointcaches on the active object, + * add spacetimecache and vertex array for each */ + for(pid=pidlist.first; pid; pid=pid->next) { + SpaceTimeCache *stc; + float *fp, *array; + int i, len; + + switch(pid->type) { + case PTCACHE_TYPE_SOFTBODY: + if (!(stime->cache_display & TIME_CACHE_SOFTBODY)) continue; + break; + case PTCACHE_TYPE_PARTICLES: + if (!(stime->cache_display & TIME_CACHE_PARTICLES)) continue; + break; + case PTCACHE_TYPE_CLOTH: + if (!(stime->cache_display & TIME_CACHE_CLOTH)) continue; + break; + case PTCACHE_TYPE_SMOKE_DOMAIN: + case PTCACHE_TYPE_SMOKE_HIGHRES: + if (!(stime->cache_display & TIME_CACHE_SMOKE)) continue; + break; + } + + stc= MEM_callocN(sizeof(SpaceTimeCache), "spacetimecache"); + + stc->type = pid->type; + + if (pid->cache->flag & PTCACHE_BAKED) + stc->flag |= PTCACHE_BAKED; + if (pid->cache->flag & PTCACHE_DISK_CACHE) + stc->flag |= PTCACHE_DISK_CACHE; + + /* first allocate with maximum number of frames needed */ + BKE_ptcache_id_time(pid, CTX_data_scene(C), 0, &stc->startframe, &stc->endframe, NULL); + len = (stc->endframe - stc->startframe + 1)*4; + fp = array = MEM_callocN(len*2*sizeof(float), "temporary timeline cache array"); + + /* fill the vertex array with a quad for each cached frame */ + for (i=stc->startframe; i<=stc->endframe; i++) { + + if (BKE_ptcache_id_exist(pid, i)) { + fp[0] = (float)i; + fp[1] = 0.0; + fp+=2; + + fp[0] = (float)i; + fp[1] = 1.0; + fp+=2; + + fp[0] = (float)(i+1); + fp[1] = 1.0; + fp+=2; + + fp[0] = (float)(i+1); + fp[1] = 0.0; + fp+=2; + } + } + /* update with final number of frames */ + stc->len = (i-stc->startframe)*4; + stc->array = MEM_mallocN(stc->len*2*sizeof(float), "SpaceTimeCache array"); + memcpy(stc->array, array, stc->len*2*sizeof(float)); + + MEM_freeN(array); + array = NULL; + + stc->ok = 1; + + BLI_addtail(&stime->caches, stc); + } + + /* todo: sort time->caches list for consistent order */ + // ... + + BLI_freelistN(&pidlist); +} + /* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */ static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe) { @@ -212,6 +376,66 @@ static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar /* ---------------- */ +static void time_refresh(const bContext *C, ScrArea *sa) +{ + SpaceTime *stime = (SpaceTime *)sa->spacedata.first; + ARegion *ar; + + /* find the main timeline region and refresh cache display*/ + for (ar= sa->regionbase.first; ar; ar= ar->next) { + if (ar->regiontype==RGN_TYPE_WINDOW) { + time_cache_refresh(C, stime, ar); + break; + } + } +} + +/* editor level listener */ +static void time_listener(ScrArea *sa, wmNotifier *wmn) +{ + + /* mainly for updating cache display */ + switch (wmn->category) { + case NC_OBJECT: + switch (wmn->data) { + case ND_POINTCACHE: + ED_area_tag_refresh(sa); + ED_area_tag_redraw(sa); + break; + } + break; + case NC_SCENE: + switch (wmn->data) { + case ND_OB_ACTIVE: + case ND_FRAME: + ED_area_tag_refresh(sa); + break; + case ND_FRAME_RANGE: + { + ARegion *ar; + Scene *scene = wmn->reference; + + for (ar= sa->regionbase.first; ar; ar= ar->next) { + if (ar->regiontype==RGN_TYPE_WINDOW) { + ar->v2d.tot.xmin= (float)(SFRA - 4); + ar->v2d.tot.xmax= (float)(EFRA + 4); + break; + } + } + } + break; + } + case NC_SPACE: + switch (wmn->data) { + case ND_SPACE_CHANGED: + ED_area_tag_refresh(sa); + break; + } + } +} + +/* ---------------- */ + /* add handlers, stuff you only do once or on area/region changes */ static void time_main_area_init(wmWindowManager *wm, ARegion *ar) { @@ -232,18 +456,16 @@ static void time_main_area_draw(const bContext *C, ARegion *ar) View2DGrid *grid; View2DScrollers *scrollers; int unit, flag=0; - float col[3]; /* clear and setup matrix */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); UI_view2d_view_ortho(C, v2d); /* start and end frame */ time_draw_sfra_efra(C, stime, ar); - + /* grid */ unit= (stime->flag & TIME_DRAWFRAMES)? V2D_UNIT_FRAMES: V2D_UNIT_SECONDS; grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy); @@ -251,7 +473,8 @@ static void time_main_area_draw(const bContext *C, ARegion *ar) UI_view2d_grid_free(grid); /* keyframes */ - time_draw_keyframes(C, stime, ar); + if(!G.rendering) /* ANIM_nla_mapping_apply_fcurve() modifies curve data while rendering, possible race condition */ + time_draw_keyframes(C, stime, ar); /* current frame */ if ((stime->flag & TIME_DRAWFRAMES)==0) flag |= DRAWCFRA_UNIT_SECONDS; @@ -262,6 +485,9 @@ static void time_main_area_draw(const bContext *C, ARegion *ar) UI_view2d_view_orthoSpecial(C, v2d, 1); draw_markers_time(C, 0); + /* caches */ + time_draw_cache(C, stime, ar); + /* reset view matrix */ UI_view2d_view_restore(C); @@ -285,7 +511,6 @@ static void time_main_area_listener(ARegion *ar, wmNotifier *wmn) break; case NC_SCENE: - /* any scene change for now */ ED_region_tag_redraw(ar); break; @@ -385,13 +610,23 @@ static SpaceLink *time_new(const bContext *C) /* not spacelink itself */ static void time_free(SpaceLink *sl) { + SpaceTime *stime= (SpaceTime *)sl; + + time_cache_free(stime); } /* spacetype; init callback in ED_area_initialize() */ /* init is called to (re)initialize an existing editor (file read, screen changes) */ /* validate spacedata, add own area level handlers */ static void time_init(wmWindowManager *wm, ScrArea *sa) { + SpaceTime *stime= (SpaceTime *)sa->spacedata.first; + time_cache_free(stime); + + /* enable all cache display */ + stime->cache_display |= TIME_CACHE_DISPLAY; + stime->cache_display |= (TIME_CACHE_SOFTBODY|TIME_CACHE_PARTICLES); + stime->cache_display |= (TIME_CACHE_CLOTH|TIME_CACHE_SMOKE); } static SpaceLink *time_duplicate(SpaceLink *sl) @@ -399,6 +634,8 @@ static SpaceLink *time_duplicate(SpaceLink *sl) SpaceTime *stime= (SpaceTime *)sl; SpaceTime *stimen= MEM_dupallocN(stime); + time_cache_free(stimen); + return (SpaceLink *)stimen; } @@ -418,6 +655,8 @@ void ED_spacetype_time(void) st->duplicate= time_duplicate; st->operatortypes= time_operatortypes; st->keymap= NULL; + st->listener= time_listener; + st->refresh= time_refresh; /* regions: main window */ art= MEM_callocN(sizeof(ARegionType), "spacetype time region"); diff --git a/source/blender/editors/space_time/time_intern.h b/source/blender/editors/space_time/time_intern.h index 5fe55444d45..31164d0c27a 100644 --- a/source/blender/editors/space_time/time_intern.h +++ b/source/blender/editors/space_time/time_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c index 08e84140f0e..68036d0ea33 100644 --- a/source/blender/editors/space_time/time_ops.c +++ b/source/blender/editors/space_time/time_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,22 +32,15 @@ #include "MEM_guardedalloc.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" #include "BKE_context.h" #include "BKE_utildefines.h" -#include "UI_interface.h" -#include "UI_view2d.h" #include "ED_screen.h" -#include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" diff --git a/source/blender/editors/space_userpref/CMakeLists.txt b/source/blender/editors/space_userpref/CMakeLists.txt new file mode 100644 index 00000000000..1752f39cfa5 --- /dev/null +++ b/source/blender/editors/space_userpref/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenkernel + ../../blenlib + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_space_userpref "${SRC}" "${INC}") diff --git a/source/blender/editors/space_userpref/SConscript b/source/blender/editors/space_userpref/SConscript index 1b808a5a7c0..3ba1543b840 100644 --- a/source/blender/editors/space_userpref/SConscript +++ b/source/blender/editors/space_userpref/SConscript @@ -8,7 +8,4 @@ incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' defs = [] -if env['WITH_BF_GAMEENGINE']: - defs.append('GAMEBLENDER=1') - env.BlenderLib ( 'bf_editors_space_userpref', sources, Split(incs), defs, libtype=['core'], priority=[70] ) diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c index 0a8eee1c7dd..4d6d303625b 100644 --- a/source/blender/editors/space_userpref/space_userpref.c +++ b/source/blender/editors/space_userpref/space_userpref.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,8 +29,6 @@ #include #include -#include "DNA_space_types.h" -#include "DNA_screen_types.h" #include "MEM_guardedalloc.h" @@ -39,7 +37,6 @@ #include "BKE_context.h" #include "BKE_screen.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" diff --git a/source/blender/editors/space_userpref/userpref_intern.h b/source/blender/editors/space_userpref/userpref_intern.h index 8c84cfdede4..206c8efe70e 100644 --- a/source/blender/editors/space_userpref/userpref_intern.h +++ b/source/blender/editors/space_userpref/userpref_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt new file mode 100644 index 00000000000..733c81676d1 --- /dev/null +++ b/source/blender/editors/space_view3d/CMakeLists.txt @@ -0,0 +1,51 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../include + ../../blenfont + ../../blenkernel + ../../blenlib + ../../bmesh + ../../gpu + ../../imbuf + ../../../../intern/guardedalloc + ../../../../intern/smoke/extern + ../../makesdna + ../../makesrna + ../../render/extern/include + ../../windowmanager +) + +IF(WITH_GAMEENGINE) + SET(INC ${INC} ../../../kernel/gen_system) + ADD_DEFINITIONS(-DGAMEBLENDER) +ENDIF(WITH_GAMEENGINE) + +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + +ADD_DEFINITIONS(-DGLEW_STATIC) + +BLENDERLIB(bf_editor_space_view3d "${SRC}" "${INC}") diff --git a/source/blender/editors/space_view3d/SConscript b/source/blender/editors/space_view3d/SConscript index ecff3c96d14..907afc12020 100644 --- a/source/blender/editors/space_view3d/SConscript +++ b/source/blender/editors/space_view3d/SConscript @@ -13,5 +13,7 @@ incs += ' #source/kernel/gen_system' if env['WITH_BF_GAMEENGINE']: defs.append('GAMEBLENDER=1') +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] env.BlenderLib ( 'bf_editors_space_view3d', sources, Split(incs), defines = defs, libtype=['core'], priority=[40] ) diff --git a/source/blender/editors/space_view3d/drawanimviz.c b/source/blender/editors/space_view3d/drawanimviz.c index 721ab12dbc1..1bc51de4471 100644 --- a/source/blender/editors/space_view3d/drawanimviz.c +++ b/source/blender/editors/space_view3d/drawanimviz.c @@ -31,23 +31,13 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_constraint_types.h" -#include "DNA_ID.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -72,11 +62,8 @@ #include "BIF_glutil.h" #include "ED_armature.h" -#include "ED_anim_api.h" #include "ED_keyframes_draw.h" -#include "WM_api.h" -#include "WM_types.h" #include "BLF_api.h" #include "UI_resources.h" @@ -212,6 +199,21 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, glVertex3fv(mpv->co); glEnd(); + /* Draw big green dot where the current frame is */ + // NOTE: only do this when drawing keyframes for now... + if (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) { + UI_ThemeColor(TH_CFRAME); + glPointSize(6.0f); + + glBegin(GL_POINTS); + mpv = mpv_start + (CFRA - sfra); + glVertex3fv(mpv->co); + glEnd(); + + glPointSize(1.0f); + UI_ThemeColor(TH_TEXT_HI); + } + /* Draw frame numbers at each framestep value */ if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) { for (i=0, mpv=mpv_start; i < len; i+=stepsize, mpv+=stepsize) { @@ -233,9 +235,9 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, } } } - + /* Keyframes - dots and numbers */ - if (avs->path_viewflag & MOTIONPATH_VIEW_KFNOS) { + if (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) { AnimData *adt= BKE_animdata_from_id(&ob->id); DLRBT_Tree keys; @@ -243,8 +245,10 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, BLI_dlrbTree_init(&keys); if (adt) { - /* for now, it is assumed that keyframes for bones are all grouped in a single group */ - if (pchan) { + /* it is assumed that keyframes for bones are all grouped in a single group + * unless an option is set to always use the whole action + */ + if ((pchan) && (avs->path_viewflag & MOTIONPATH_VIEW_KFACT)==0) { bActionGroup *agrp= action_groups_find_named(adt->action, pchan->name); if (agrp) { @@ -274,7 +278,7 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, glPointSize(1.0f); /* Draw frame numbers of keyframes */ - if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) { + if (avs->path_viewflag & MOTIONPATH_VIEW_KFNOS) { for (i=0, mpv=mpv_start; i < len; i++, mpv++) { float mframe= (float)(sfra + i); diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index 9df9cad1ac0..e8f4fc7890f 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -31,24 +31,14 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_constraint_types.h" -#include "DNA_ID.h" -#include "DNA_nla_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -74,8 +64,6 @@ #include "ED_armature.h" #include "ED_keyframes_draw.h" -#include "WM_api.h" -#include "WM_types.h" #include "BLF_api.h" #include "UI_resources.h" @@ -1205,7 +1193,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned { /* Draw a 3d octahedral bone, we use normalized space based on length, - for glDisplayLists */ + for glDisplayLists */ glScalef(length, length, length); @@ -1559,7 +1547,7 @@ static void bone_matrix_translate_y(float mat[][4], float y) VECCOPY(trans, mat[1]); mul_v3_fl(trans, y); - add_v3_v3v3(mat[3], mat[3], trans); + add_v3_v3(mat[3], trans); } /* assumes object is Armature with pose */ @@ -1894,16 +1882,16 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, /* Draw additional axes on the bone tail */ if ( (arm->flag & ARM_DRAWAXES) && (arm->flag & ARM_POSEMODE) ) { + float mat[4][4]; glPushMatrix(); copy_m4_m4(bmat, pchan->pose_mat); bone_matrix_translate_y(bmat, pchan->bone->length); glMultMatrixf(bmat); - /* do cached text draw immediate to include transform */ - view3d_cached_text_draw_begin(); - drawaxes(pchan->bone->length*0.25f, 0, OB_ARROWS); - view3d_cached_text_draw_end(v3d, ar, 1, bmat); + mul_m4_m4m4(mat, bmat, rv3d->viewmatob); + drawaxes(rv3d, mat, pchan->bone->length*0.25f, 0, OB_ARROWS); + glPopMatrix(); } } @@ -1929,7 +1917,7 @@ static void get_matrix_editbone(EditBone *eBone, float bmat[][4]) vec_roll_to_mat3(delta, eBone->roll, mat); copy_m4_m3(bmat, mat); - add_v3_v3v3(bmat[3], bmat[3], eBone->head); + add_v3_v3(bmat[3], eBone->head); } static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt) @@ -2090,15 +2078,16 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt) } /* Draw additional axes */ if (arm->flag & ARM_DRAWAXES) { + float mat[4][4]; glPushMatrix(); get_matrix_editbone(eBone, bmat); bone_matrix_translate_y(bmat, eBone->length); glMultMatrixf(bmat); + mul_m4_m4m4(mat, bmat, rv3d->viewmatob); + /* do cached text draw immediate to include transform */ - view3d_cached_text_draw_begin(); - drawaxes(eBone->length*0.25f, 0, OB_ARROWS); - view3d_cached_text_draw_end(v3d, ar, 1, bmat); + drawaxes(rv3d, mat, eBone->length*0.25f, 0, OB_ARROWS); glPopMatrix(); } @@ -2406,7 +2395,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in bArmature *arm= ob->data; int retval= 0; - if(G.f & G_RENDER_SHADOW) + if(v3d->flag2 & V3D_RENDER_OVERRIDE) return 1; if(dt>OB_WIRE && arm->drawtype!=ARM_LINE) { diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index e93e05a0a55..e46a5f5efae 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -35,20 +35,13 @@ #include "BLI_edgehash.h" #include "BLI_editVert.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" -#include "DNA_image_types.h" -#include "DNA_lamp_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_object_types.h" #include "DNA_property_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_view3d_types.h" -#include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" #include "BKE_bmfont.h" @@ -70,9 +63,8 @@ #include "BIF_glutil.h" #include "UI_resources.h" -#include "UI_interface_icons.h" -#include "gpu_buffers.h" +#include "GPU_buffers.h" #include "GPU_extensions.h" #include "GPU_draw.h" @@ -440,7 +432,7 @@ static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr) } else if (tface && tface->mode&TF_OBCOL) { return 2; /* Don't set color */ } else if (!mcol) { - return 2; /* Don't set color */ + return 1; /* Don't set color */ } else { return 1; /* Set color from mcol */ } @@ -475,9 +467,9 @@ static void add_tface_color_layer(DerivedMesh *dm) } } else if (tface && tface->mode&TF_OBCOL) { for(j=0;j<4;j++) { - finalCol[i*4+j].r = Gtexdraw.obcol[0]; - finalCol[i*4+j].g = Gtexdraw.obcol[1]; - finalCol[i*4+j].b = Gtexdraw.obcol[2]; + finalCol[i*4+j].r = FTOCHAR(Gtexdraw.obcol[0]); + finalCol[i*4+j].g = FTOCHAR(Gtexdraw.obcol[1]); + finalCol[i*4+j].b = FTOCHAR(Gtexdraw.obcol[2]); } } else if (!mcol) { if (tface) { @@ -496,9 +488,9 @@ static void add_tface_color_layer(DerivedMesh *dm) else copy_v3_v3(col, &ma->r); for(j=0;j<4;j++) { - finalCol[i*4+j].b = col[2]; - finalCol[i*4+j].g = col[1]; - finalCol[i*4+j].r = col[0]; + finalCol[i*4+j].b = FTOCHAR(col[2]); + finalCol[i*4+j].g = FTOCHAR(col[1]); + finalCol[i*4+j].r = FTOCHAR(col[0]); } } else @@ -568,7 +560,7 @@ static int draw_em_tf_mapped__set_draw(void *userData, int index) mtf.unwrap = tpoly->unwrap; } - return draw_tface__set_draw(&mtf, has_vcol, matnr); + return draw_tface__set_draw_legacy(&mtf, has_vcol, matnr); } static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r) diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 8dbaeed97fa..b737a65e2be 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -28,40 +28,18 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" -#include "IMB_imbuf.h" - - - - -#include "DNA_armature_types.h" -#include "DNA_boid_types.h" #include "DNA_camera_types.h" #include "DNA_curve_types.h" #include "DNA_constraint_types.h" // for drawing constraint -#include "DNA_effect_types.h" #include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_material_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_meta_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_object_fluidsim.h" -#include "DNA_particle_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "DNA_smoke_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" #include "DNA_world_types.h" #include "BLI_blenlib.h" @@ -103,7 +81,6 @@ #include "BIF_glutil.h" #include "GPU_draw.h" -#include "GPU_material.h" #include "GPU_extensions.h" #include "ED_mesh.h" @@ -111,10 +88,8 @@ #include "ED_screen.h" #include "ED_sculpt.h" #include "ED_types.h" -#include "ED_util.h" #include "UI_resources.h" -#include "UI_interface_icons.h" #include "WM_api.h" #include "wm_subwindow.h" @@ -128,13 +103,6 @@ ((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \ (vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX)) -#define CHECK_OB_DRAWFACEDOT(sce, vd, dt) \ -( (sce->toolsettings->selectmode & SCE_SELECT_FACE) && \ - (vd->drawtype<=OB_SOLID) && \ - (G.f & G_BACKBUFSEL)==0 && \ - (((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \ - ) - static void draw_bounding_volume(Scene *scene, Object *ob); static void drawcube_size(float size); @@ -142,6 +110,26 @@ static void drawcircle_size(float size); static void draw_empty_sphere(float size); static void draw_empty_cone(float size); +static int check_ob_drawface_dot(Scene *sce, View3D *vd, char dt) +{ + if((sce->toolsettings->selectmode & SCE_SELECT_FACE) == 0) + return 0; + + if(G.f & G_BACKBUFSEL) + return 0; + + if((vd->flag & V3D_ZBUF_SELECT) == 0) + return 1; + + /* if its drawing textures with zbuf sel, then dont draw dots */ + if(dt==OB_TEXTURE && vd->drawtype==OB_TEXTURE) + return 0; + + if(vd->drawtype>=OB_SOLID && vd->flag2 & V3D_SOLID_TEX) + return 0; + + return 1; +} /* ************* only use while object drawing ************** * or after running ED_view3d_init_mats_rv3d @@ -334,16 +322,114 @@ static float cosval[32] ={ 1.00000000 }; +static void draw_xyz_wire(RegionView3D *rv3d, float mat[][4], float *c, float size, int axis) +{ + float v1[3]= {0.f, 0.f, 0.f}, v2[3] = {0.f, 0.f, 0.f}; + float imat[4][4]; + float dim; + float dx[3], dy[3]; + + /* hrms, really only works properly after glLoadMatrixf(rv3d->viewmat); */ + float pixscale= rv3d->persmat[0][3]*c[0]+ rv3d->persmat[1][3]*c[1]+ rv3d->persmat[2][3]*c[2] + rv3d->persmat[3][3]; + pixscale*= rv3d->pixsize; + + /* halfway blend between fixed size in worldspace vs viewspace - + * alleviates some of the weirdness due to not using viewmat for gl matrix */ + dim = (0.05*size*0.5) + (size*10.f*pixscale*0.5); + + invert_m4_m4(imat, mat); + normalize_v3(imat[0]); + normalize_v3(imat[1]); + + copy_v3_v3(dx, imat[0]); + copy_v3_v3(dy, imat[1]); + + mul_v3_fl(dx, dim); + mul_v3_fl(dy, dim); + + switch(axis) { + case 0: /* x axis */ + glBegin(GL_LINES); + + /* bottom left to top right */ + sub_v3_v3v3(v1, c, dx); + sub_v3_v3(v1, dy); + add_v3_v3v3(v2, c, dx); + add_v3_v3(v2, dy); + + glVertex3fv(v1); + glVertex3fv(v2); + + /* top left to bottom right */ + mul_v3_fl(dy, 2.f); + add_v3_v3(v1, dy); + sub_v3_v3(v2, dy); + + glVertex3fv(v1); + glVertex3fv(v2); + + glEnd(); + break; + case 1: /* y axis */ + glBegin(GL_LINES); + + /* bottom left to top right */ + mul_v3_fl(dx, 0.75f); + sub_v3_v3v3(v1, c, dx); + sub_v3_v3(v1, dy); + add_v3_v3v3(v2, c, dx); + add_v3_v3(v2, dy); + + glVertex3fv(v1); + glVertex3fv(v2); + + /* top left to center */ + mul_v3_fl(dy, 2.f); + add_v3_v3(v1, dy); + copy_v3_v3(v2, c); + + glVertex3fv(v1); + glVertex3fv(v2); + + glEnd(); + break; + case 2: /* z axis */ + glBegin(GL_LINE_STRIP); + + /* start at top left */ + sub_v3_v3v3(v1, c, dx); + add_v3_v3v3(v1, c, dy); + + glVertex3fv(v1); + + mul_v3_fl(dx, 2.f); + add_v3_v3(v1, dx); + + glVertex3fv(v1); + + mul_v3_fl(dy, 2.f); + sub_v3_v3(v1, dx); + sub_v3_v3(v1, dy); + + glVertex3fv(v1); + + add_v3_v3(v1, dx); + + glVertex3fv(v1); + + glEnd(); + break; + } + +} + /* flag is same as for draw_object */ -void drawaxes(float size, int flag, char drawtype) +void drawaxes(RegionView3D *rv3d, float mat[][4], float size, int flag, char drawtype) { int axis; float v1[3]= {0.0, 0.0, 0.0}; float v2[3]= {0.0, 0.0, 0.0}; float v3[3]= {0.0, 0.0, 0.0}; - - if(G.f & G_RENDER_SHADOW) - return; switch(drawtype) { @@ -424,12 +510,12 @@ void drawaxes(float size, int flag, char drawtype) glVertex3fv(v1); glVertex3fv(v2); - v1[axis]= size*0.8; - v1[arrow_axis]= -size*0.125; + v1[axis]= size*0.85; + v1[arrow_axis]= -size*0.08; glVertex3fv(v1); glVertex3fv(v2); - v1[arrow_axis]= size*0.125; + v1[arrow_axis]= size*0.08; glVertex3fv(v1); glVertex3fv(v2); @@ -437,15 +523,7 @@ void drawaxes(float size, int flag, char drawtype) v2[axis]+= size*0.125; - // patch for 3d cards crashing on glSelect for text drawing (IBM) - if((flag & DRAW_PICKING) == 0) { - if (axis==0) - view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "x", 0, V3D_CACHE_TEXT_ZBUF); - else if (axis==1) - view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "y", 0, V3D_CACHE_TEXT_ZBUF); - else - view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "z", 0, V3D_CACHE_TEXT_ZBUF); - } + draw_xyz_wire(rv3d, mat, v2, size, axis); } break; } @@ -554,14 +632,14 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa } if(tot) { +#if 0 bglMats mats; /* ZBuffer depth vars */ double ux, uy, uz; float depth; if(v3d->zbuf) bgl_get_mats(&mats); - - +#endif if(rv3d->rflag & RV3D_CLIPPING) for(a=0; a<6; a++) glDisable(GL_CLIP_PLANE0+a); @@ -578,7 +656,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa else glDepthMask(0); for(vos= strings->first; vos; vos= vos->next) { - +#if 0 // too slow, reading opengl info while drawing is very bad, better to see if we cn use the zbuffer while in pixel space - campbell if(v3d->zbuf && (vos->flag & V3D_CACHE_TEXT_ZBUF)) { gluProject(vos->vec[0], vos->vec[1], vos->vec[2], mats.modelview, mats.projection, (GLint *)mats.viewport, &ux, &uy, &uz); glReadPixels(ar->winrct.xmin+vos->mval[0]+vos->xoffs, ar->winrct.ymin+vos->mval[1], 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); @@ -586,7 +664,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa if(uz > depth) continue; } - +#endif if(vos->mval[0]!=IS_CLIPPED) { glColor3fv(vos->col); BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str); @@ -697,9 +775,7 @@ static void drawshadbuflimits(Lamp *la, float mat[][4]) { float sta[3], end[3], lavec[3]; - lavec[0]= -mat[2][0]; - lavec[1]= -mat[2][1]; - lavec[2]= -mat[2][2]; + negate_v3_v3(lavec, mat[2]); normalize_v3(lavec); sta[0]= mat[3][0]+ la->clipsta*lavec[0]; @@ -794,25 +870,17 @@ static void spotvolume(float *lvec, float *vvec, float inp) static void draw_spot_cone(Lamp *la, float x, float z) { - float vec[3]; - z= fabs(z); glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0f, 0.0f, -x); if(la->mode & LA_SQUARE) { - vec[0]= z; - vec[1]= z; - vec[2]= 0.0; - - glVertex3fv(vec); - vec[1]= -z; - glVertex3fv(vec); - vec[0]= -z; - glVertex3fv(vec); - vec[1]= z; - glVertex3fv(vec); + glVertex3f(z, z, 0); + glVertex3f(-z, z, 0); + glVertex3f(-z, -z, 0); + glVertex3f(z, -z, 0); + glVertex3f(z, z, 0); } else { float angle; @@ -866,9 +934,6 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, float imat[4][4], curcol[4]; char col[4]; int drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && la->type == LA_SPOT && (la->mode & LA_SHOW_CONE)); - - if(G.f & G_RENDER_SHADOW) - return; if(drawcone && !v3d->transp) { /* in this case we need to draw delayed */ @@ -915,21 +980,23 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* Outer circle */ circrad = 3.0f*lampsize; - drawcircball(GL_LINE_LOOP, vec, circrad, imat); - } - else - circrad = 0.0f; - - setlinestyle(3); + setlinestyle(3); - /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */ - if (la->type!=LA_HEMI) { - if ((la->mode & LA_SHAD_RAY) || - ((la->mode & LA_SHAD_BUF) && (la->type==LA_SPOT)) ) - { - drawcircball(GL_LINE_LOOP, vec, circrad + 3.0f*pixsize, imat); + drawcircball(GL_LINE_LOOP, vec, circrad, imat); + + /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */ + if(la->type!=LA_HEMI) { + if( (la->mode & LA_SHAD_RAY) || + ((la->mode & LA_SHAD_BUF) && (la->type==LA_SPOT)) + ) { + drawcircball(GL_LINE_LOOP, vec, circrad + 3.0f*pixsize, imat); + } } } + else { + setlinestyle(3); + circrad = 0.0f; + } /* draw the pretty sun rays */ if(la->type==LA_SUN) { @@ -1002,17 +1069,20 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* draw the circle/square at the end of the cone */ glTranslatef(0.0, 0.0 , x); if(la->mode & LA_SQUARE) { - vvec[0]= fabs(z); - vvec[1]= fabs(z); - vvec[2]= 0.0; + float tvec[3]; + float z_abs= fabs(z); + + tvec[0]= tvec[1]= z_abs; + tvec[2]= 0.0; + glBegin(GL_LINE_LOOP); - glVertex3fv(vvec); - vvec[1]= -fabs(z); - glVertex3fv(vvec); - vvec[0]= -fabs(z); - glVertex3fv(vvec); - vvec[1]= fabs(z); - glVertex3fv(vvec); + glVertex3fv(tvec); + tvec[1]= -z_abs; /* neg */ + glVertex3fv(tvec); + tvec[0]= -z_abs; /* neg */ + glVertex3fv(tvec); + tvec[1]= z_abs; /* pos */ + glVertex3fv(tvec); glEnd(); } else circ(0.0, 0.0, fabs(z)); @@ -1029,6 +1099,22 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if(drawcone) draw_transp_spot_volume(la, x, z); + + /* draw clip start, useful for wide cones where its not obvious where the start is */ + glTranslatef(0.0, 0.0 , -x); /* reverse translation above */ + if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF) ) { + float lvec_clip[3]; + float vvec_clip[3]; + float clipsta_fac= la->clipsta / -x; + + interp_v3_v3v3(lvec_clip, vec, lvec, clipsta_fac); + interp_v3_v3v3(vvec_clip, vec, vvec, clipsta_fac); + + glBegin(GL_LINE_STRIP); + glVertex3fv(lvec_clip); + glVertex3fv(vvec_clip); + glEnd(); + } } else if ELEM(la->type, LA_HEMI, LA_SUN) { @@ -1166,9 +1252,6 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob float nobmat[4][4], vec[8][4], fac, facx, facy, depth; int i; - if(G.f & G_RENDER_SHADOW) - return; - cam= ob->data; glDisable(GL_LIGHTING); @@ -1344,14 +1427,16 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) Lattice *lt= ob->data; DispList *dl; int u, v, w; - int use_wcol= 0; + int use_wcol= 0, is_edit= (lt->editlatt != NULL); /* now we default make displist, this will modifiers work for non animated case */ if(ob->disp.first==NULL) lattice_calc_modifiers(scene, ob); dl= find_displist(&ob->disp, DL_VERTS); - if(lt->editlatt) { + if(is_edit) { + lt= lt->editlatt; + cpack(0x004000); if(ob->defbase.first && lt->dvert) { @@ -1360,8 +1445,6 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) } } - if(lt->editlatt) lt= lt->editlatt; - glBegin(GL_LINES); for(w=0; wpntsw; w++) { int wxt = (w==0 || w==lt->pntsw-1); @@ -1391,7 +1474,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) if(use_wcol) glShadeModel(GL_FLAT); - if( ((Lattice *)ob->data)->editlatt ) { + if(is_edit) { if(v3d->zbuf) glDisable(GL_DEPTH_TEST); lattice_draw_verts(lt, dl, 0); @@ -1986,7 +2069,7 @@ static int draw_dm_creases__setDrawOptions(void *userData, int index) return 0; if (!BM_TestHFlag(eed, BM_HIDDEN) && *crease!=0.0) { - UI_ThemeColorBlend(TH_WIRE, TH_EDGE_SELECT, *crease); + UI_ThemeColorBlend(TH_WIRE, TH_EDGE_CREASE, *crease); return 1; } else { return 0; @@ -2096,7 +2179,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, draw_dm_verts(em, cageDM, sel, eve_act); } - if( CHECK_OB_DRAWFACEDOT(scene, v3d, obedit->dt) ) { + if(check_ob_drawface_dot(scene, v3d, obedit->dt)) { glPointSize(fsize); glColor4ubv((GLubyte *)fcol); draw_dm_face_centers(em, cageDM, sel); @@ -2187,7 +2270,8 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, float area, col[3]; /* area of the face, color of the text to draw */ float grid= unit->system ? unit->scale_length : v3d->grid; int do_split= unit->flag & USER_UNIT_OPT_SPLIT; - if(G.f & (G_RENDER_OGL|G_RENDER_SHADOW)) + + if(v3d->flag2 & V3D_RENDER_OVERRIDE) return; /* make the precision of the pronted value proportionate to the gridsize */ @@ -2430,7 +2514,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object else { if (cageDM!=finalDM) { UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7); - finalDM->drawEdges(finalDM, 1); + finalDM->drawEdges(finalDM, 1, 0); } } @@ -2566,7 +2650,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm) GPU_disable_material(); } else { - dm->drawEdges(dm, 0); + dm->drawEdges(dm, 0, 1); } glLineWidth(1.0); @@ -2610,7 +2694,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0; if(dt==OB_BOUNDBOX) { - draw_bounding_volume(scene, ob); + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); } else if(hasHaloMat || (totface==0 && totedge==0)) { glPointSize(1.5); @@ -2624,8 +2709,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D CHECK_OB_DRAWTEXTURE(v3d, dt)) { int faceselect= (ob==OBACT && paint_facesel_test(ob)); - - if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) { + if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) { draw_mesh_object_outline(v3d, ob, dm); } @@ -2649,7 +2733,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D else UI_ThemeColor(TH_WIRE); - dm->drawLooseEdges(dm); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + dm->drawLooseEdges(dm); } } else if(dt==OB_SOLID) { @@ -2667,7 +2752,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0x8888); - dm->drawEdges(dm, 1); + dm->drawEdges(dm, 1, 0); bglPolygonOffset(rv3d->dist, 0.0); glDepthMask(1); @@ -2680,7 +2765,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D else { Paint *p; - if((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire && !ob->sculpt) + if((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire && !ob->sculpt) draw_mesh_object_outline(v3d, ob, dm); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED ); @@ -2694,9 +2779,11 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D int fast= (p->flags & PAINT_FAST_NAVIGATE) && (rv3d->rflag & RV3D_NAVIGATING); if(ob->sculpt->partial_redraw) { - sculpt_get_redraw_planes(planes, ar, rv3d, ob); - fpl = planes; - ob->sculpt->partial_redraw = 0; + if(ar->do_draw & RGN_DRAW_PARTIAL) { + sculpt_get_redraw_planes(planes, ar, rv3d, ob); + fpl = planes; + ob->sculpt->partial_redraw = 0; + } } dm->drawFacesSolid(dm, fpl, fast, GPU_enable_material); @@ -2714,7 +2801,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } else { UI_ThemeColor(TH_WIRE); } - if(!ob->sculpt) + if(!ob->sculpt && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0) dm->drawLooseEdges(dm); } } @@ -2764,7 +2851,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D dm= mesh_get_derived_final(scene, ob, v3d->customdata_mask); } - if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire) { + if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire) { draw_mesh_object_outline(v3d, ob, dm); } @@ -2781,7 +2868,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } else { UI_ThemeColor(TH_WIRE); } - dm->drawLooseEdges(dm); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + dm->drawLooseEdges(dm); } } @@ -2835,8 +2923,9 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glDepthMask(0); // disable write in zbuffer, selected edge wires show better } - dm->drawEdges(dm, (dt==OB_WIRE || totface==0)); - + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0) + dm->drawEdges(dm, (dt==OB_WIRE || totface==0), me->drawflag & ME_ALLEDGES); + if (dt!=OB_WIRE && draw_wire==2) { glDepthMask(1); bglPolygonOffset(rv3d->dist, 0.0); @@ -3053,8 +3142,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl) case DL_POLY: if(ob->type==OB_SURF) { int nr; - - UI_ThemeColor(TH_WIRE); + glDisable(GL_LIGHTING); /* for some reason glDrawArrays crashes here in half of the platforms (not osx) */ @@ -3176,6 +3264,41 @@ static void drawDispListshaded(ListBase *lb, Object *ob) glDisableClientState(GL_COLOR_ARRAY); } +static void drawCurveDMWired(Object *ob) +{ + DerivedMesh *dm = ob->derivedFinal; + dm->drawEdges (dm, 1, 0); +} + +/* return 1 when nothing was drawn */ +static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt) +{ + Object *ob= base->object; + DerivedMesh *dm = ob->derivedFinal; + + if (!dm) { + return 1; + } + + if(dt>OB_WIRE && dm->getNumFaces(dm)) { + int glsl = draw_glsl_material(scene, ob, v3d, dt); + GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL); + + if (!glsl) + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); + + glEnable(GL_LIGHTING); + dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); + glDisable(GL_LIGHTING); + GPU_end_object_materials(); + } else { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0) + drawCurveDMWired (ob); + } + + return 0; +} + /* returns 1 when nothing was drawn */ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt) { @@ -3187,6 +3310,10 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas solid= (dt > OB_WIRE); + if (drawCurveDerivedMesh(scene, v3d, rv3d, base, dt) == 0) { + return 0; + } + switch(ob->type) { case OB_FONT: case OB_CURVE: @@ -3547,12 +3674,11 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv select=1; } + psys_update_children(&sim); + psys->flag|=PSYS_DRAWING; - if(part->type==PART_HAIR && !psys->childcache) - totchild=0; - else - totchild=psys->totchild*part->disp/100; + totchild=psys->totchild*part->disp/100; ma= give_current_material(ob,part->omat); @@ -3587,11 +3713,18 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv totpart=psys->totpart; - //if(part->flag&PART_GLOB_TIME) cfra=bsystem_time(scene, 0, (float)CFRA, 0.0f); - if(draw_as==PART_DRAW_PATH && psys->pathcache==NULL && psys->childcache==NULL) - draw_as=PART_DRAW_DOT; + if(draw_as==PART_DRAW_PATH) { + if(psys->pathcache==NULL && psys->childcache==NULL) + psys_update_path_cache(&sim, cfra); + + /* can't create pathcache for some reason*/ + if(psys->pathcache==NULL && psys->childcache==NULL) + draw_as=PART_DRAW_DOT; + else if(psys->childcache==NULL) + totchild = 0; + } /* 3. */ switch(draw_as){ @@ -3895,7 +4028,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv setlinestyle(0); } - if((part->draw & PART_DRAW_NUM || part->draw & PART_DRAW_HEALTH) && !(G.f & G_RENDER_SHADOW)){ + + if((part->draw & PART_DRAW_NUM || part->draw & PART_DRAW_HEALTH) && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0){ float vec_txt[3]; char *val_pos= val; val[0]= '\0'; @@ -3924,7 +4058,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv float *cd2=0,*cdata2=0; /* setup gl flags */ - if(ob_dt > OB_WIRE) { + if (1) { //ob_dt > OB_WIRE) { glEnableClientState(GL_NORMAL_ARRAY); if(part->draw&PART_DRAW_MAT_COL) @@ -3934,15 +4068,15 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } - else { + /*else { glDisableClientState(GL_NORMAL_ARRAY); glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); UI_ThemeColor(TH_WIRE); - } + }*/ - if(totchild && (part->draw&PART_DRAW_PARENT)==0) + if(totchild && ((part->draw&PART_DRAW_PARENT)==0 || psys_in_edit_mode(scene, psys))) totpart=0; else if(psys->pathcache==NULL) totpart=0; @@ -3954,7 +4088,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(path->steps > 0) { glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - if(ob_dt > OB_WIRE) { + if(1) { //ob_dt > OB_WIRE) { glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel); if(part->draw&PART_DRAW_MAT_COL) glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); @@ -3970,7 +4104,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv path=cache[a]; glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - if(ob_dt > OB_WIRE) { + if(1) { //ob_dt > OB_WIRE) { glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel); if(part->draw&PART_DRAW_MAT_COL) glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); @@ -3981,7 +4115,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv /* restore & clean up */ - if(ob_dt > OB_WIRE) { + if(1) { //ob_dt > OB_WIRE) { if(part->draw&PART_DRAW_MAT_COL) glDisable(GL_COLOR_ARRAY); glDisable(GL_COLOR_MATERIAL); @@ -3992,6 +4126,20 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv cd2=cdata2=0; glLineWidth(1.0f); + + if((part->draw & PART_DRAW_NUM) && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0){ + cache=psys->pathcache; + + for(a=0, pa=psys->particles; aimat, cache[a]->co); + view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE); + } + } } else if(pdd && ELEM(draw_as, 0, PART_DRAW_CIRC)==0){ glDisableClientState(GL_COLOR_ARRAY); @@ -4414,23 +4562,21 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float } /*place to add drawers */ -unsigned int nurbcol[8]= { - 0, 0x9090, 0x409030, 0x603080, 0, 0x40fff0, 0x40c033, 0xA090F0 }; static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) { BezTriple *bezt; float *fp; - unsigned int *col; + int basecol; int a; if(nu->hide || hide_handles) return; - + glBegin(GL_LINES); if(nu->type == CU_BEZIER) { - if(sel) col= nurbcol+4; - else col= nurbcol; + if(sel) basecol= TH_HANDLE_SEL_FREE; + else basecol= TH_HANDLE_FREE; bezt= nu->bezt; a= nu->pntsu; @@ -4438,26 +4584,26 @@ static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) if(bezt->hide==0) { if( (bezt->f2 & SELECT)==sel) { fp= bezt->vec[0]; - - cpack(col[(int)bezt->h1]); + + UI_ThemeColor(basecol + bezt->h1); glVertex3fv(fp); glVertex3fv(fp+3); - cpack(col[(int)bezt->h2]); + UI_ThemeColor(basecol + bezt->h2); glVertex3fv(fp+3); glVertex3fv(fp+6); } else if( (bezt->f1 & SELECT)==sel) { fp= bezt->vec[0]; - - cpack(col[(int)bezt->h1]); + + UI_ThemeColor(basecol + bezt->h1); glVertex3fv(fp); glVertex3fv(fp+3); } else if( (bezt->f3 & SELECT)==sel) { fp= bezt->vec[1]; - - cpack(col[(int)bezt->h2]); + + UI_ThemeColor(basecol + bezt->h2); glVertex3fv(fp); glVertex3fv(fp+3); } @@ -4468,17 +4614,54 @@ static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) glEnd(); } -static void tekenvertsN(Nurb *nu, short sel, short hide_handles) +static void tekenhandlesN_active(Nurb *nu) { BezTriple *bezt; - BPoint *bp; - float size; + float *fp; int a; if(nu->hide) return; - if(sel) UI_ThemeColor(TH_VERTEX_SELECT); - else UI_ThemeColor(TH_VERTEX); + UI_ThemeColor(TH_ACTIVE_SPLINE); + glLineWidth(2); + + glBegin(GL_LINES); + + if(nu->type == CU_BEZIER) { + bezt= nu->bezt; + a= nu->pntsu; + while(a--) { + if(bezt->hide==0) { + fp= bezt->vec[0]; + + glVertex3fv(fp); + glVertex3fv(fp+3); + + glVertex3fv(fp+3); + glVertex3fv(fp+6); + } + bezt++; + } + } + glEnd(); + + glColor3ub(0,0,0); + glLineWidth(1); +} + +static void tekenvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel) +{ + BezTriple *bezt; + BPoint *bp; + float size; + int a, color; + + if(nu->hide) return; + + if(sel) color= TH_VERTEX_SELECT; + else color= TH_VERTEX; + + UI_ThemeColor(color); size= UI_GetThemeValuef(TH_VERTEX_SIZE); glPointSize(size); @@ -4491,7 +4674,17 @@ static void tekenvertsN(Nurb *nu, short sel, short hide_handles) a= nu->pntsu; while(a--) { if(bezt->hide==0) { - if (hide_handles) { + if (sel == 1 && bezt == lastsel) { + UI_ThemeColor(TH_LASTSEL_POINT); + bglVertex3fv(bezt->vec[1]); + + if (!hide_handles) { + if(bezt->f1 & SELECT) bglVertex3fv(bezt->vec[0]); + if(bezt->f3 & SELECT) bglVertex3fv(bezt->vec[2]); + } + + UI_ThemeColor(color); + } else if (hide_handles) { if((bezt->f2 & SELECT)==sel) bglVertex3fv(bezt->vec[1]); } else { if((bezt->f1 & SELECT)==sel) bglVertex3fv(bezt->vec[0]); @@ -4507,7 +4700,13 @@ static void tekenvertsN(Nurb *nu, short sel, short hide_handles) a= nu->pntsu*nu->pntsv; while(a--) { if(bp->hide==0) { - if((bp->f1 & SELECT)==sel) bglVertex3fv(bp->vec); + if (bp == lastsel) { + UI_ThemeColor(TH_LASTSEL_POINT); + bglVertex3fv(bp->vec); + UI_ThemeColor(color); + } else { + if((bp->f1 & SELECT)==sel) bglVertex3fv(bp->vec); + } } bp++; } @@ -4517,18 +4716,94 @@ static void tekenvertsN(Nurb *nu, short sel, short hide_handles) glPointSize(1.0); } +static void editnurb_draw_active_poly(Nurb *nu) +{ + BPoint *bp; + int a, b; + + UI_ThemeColor(TH_ACTIVE_SPLINE); + glLineWidth(2); + + bp= nu->bp; + for(b=0; bpntsv; b++) { + if(nu->flagu & 1) glBegin(GL_LINE_LOOP); + else glBegin(GL_LINE_STRIP); + + for(a=0; apntsu; a++, bp++) { + glVertex3fv(bp->vec); + } + + glEnd(); + } + + glColor3ub(0,0,0); + glLineWidth(1); +} + +static void editnurb_draw_active_nurbs(Nurb *nu) +{ + BPoint *bp, *bp1; + int a, b, ofs; + + UI_ThemeColor(TH_ACTIVE_SPLINE); + glLineWidth(2); + + glBegin(GL_LINES); + bp= nu->bp; + for(b=0; bpntsv; b++) { + bp1= bp; + bp++; + + for(a=nu->pntsu-1; a>0; a--, bp++) { + if(bp->hide==0 && bp1->hide==0) { + glVertex3fv(bp->vec); + glVertex3fv(bp1->vec); + } + bp1= bp; + } + } + + if(nu->pntsv > 1) { /* surface */ + + ofs= nu->pntsu; + for(b=0; bpntsu; b++) { + bp1= nu->bp+b; + bp= bp1+ofs; + for(a=nu->pntsv-1; a>0; a--, bp+=ofs) { + if(bp->hide==0 && bp1->hide==0) { + glVertex3fv(bp->vec); + glVertex3fv(bp1->vec); + } + bp1= bp; + } + } + } + + glEnd(); + + glColor3ub(0,0,0); + glLineWidth(1); +} + static void draw_editnurb(Object *ob, Nurb *nurb, int sel) { Nurb *nu; BPoint *bp, *bp1; - int a, b, ofs; - + int a, b, ofs, index; + Curve *cu= (Curve*)ob->data; + + index= 0; nu= nurb; while(nu) { if(nu->hide==0) { switch(nu->type) { case CU_POLY: - cpack(nurbcol[3]); + if (!sel && index== cu->actnu) { + /* we should draw active spline highlight below everything */ + editnurb_draw_active_poly(nu); + } + + UI_ThemeColor(TH_NURB_ULINE); bp= nu->bp; for(b=0; bpntsv; b++) { if(nu->flagu & 1) glBegin(GL_LINE_LOOP); @@ -4542,6 +4817,10 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) } break; case CU_NURBS: + if (!sel && index== cu->actnu) { + /* we should draw active spline highlight below everything */ + editnurb_draw_active_nurbs(nu); + } bp= nu->bp; for(b=0; bpntsv; b++) { @@ -4551,7 +4830,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) if(bp->hide==0 && bp1->hide==0) { if(sel) { if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT ) ) { - cpack(nurbcol[5]); + UI_ThemeColor(TH_NURB_SEL_ULINE); glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); @@ -4562,7 +4841,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) else { if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) ); else { - cpack(nurbcol[1]); + UI_ThemeColor(TH_NURB_ULINE); glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); @@ -4584,7 +4863,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) if(bp->hide==0 && bp1->hide==0) { if(sel) { if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) ) { - cpack(nurbcol[7]); + UI_ThemeColor(TH_NURB_SEL_VLINE); glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); @@ -4595,7 +4874,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) else { if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) ); else { - cpack(nurbcol[3]); + UI_ThemeColor(TH_NURB_VLINE); glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); @@ -4612,6 +4891,8 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) break; } } + + ++index; nu= nu->next; } } @@ -4624,6 +4905,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, Nurb *nu; BevList *bl; short hide_handles = (cu->drawflag & CU_HIDE_HANDLES); + int index; // XXX retopo_matrix_update(v3d); @@ -4633,11 +4915,15 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if(v3d->zbuf) glDisable(GL_DEPTH_TEST); - /* first non-selected handles */ + /* first non-selected and active handles */ + index= 0; for(nu=nurb; nu; nu=nu->next) { if(nu->type == CU_BEZIER) { + if (index == cu->actnu && !hide_handles) + tekenhandlesN_active(nu); tekenhandlesN(nu, 0, hide_handles); } + ++index; } draw_editnurb(ob, nurb, 0); draw_editnurb(ob, nurb, 1); @@ -4645,7 +4931,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, for(nu=nurb; nu; nu=nu->next) { if(nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES)==0) tekenhandlesN(nu, 1, hide_handles); - tekenvertsN(nu, 0, hide_handles); + tekenvertsN(nu, 0, hide_handles, NULL); } if(v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -4667,8 +4953,8 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, mul_qt_v3(bevp->quat, vec_a); mul_qt_v3(bevp->quat, vec_b); - add_v3_v3v3(vec_a, vec_a, bevp->vec); - add_v3_v3v3(vec_b, vec_b, bevp->vec); + add_v3_v3(vec_a, bevp->vec); + add_v3_v3(vec_b, bevp->vec); VECSUBFAC(vec_a, vec_a, bevp->dir, fac); VECSUBFAC(vec_b, vec_b, bevp->dir, fac); @@ -4688,7 +4974,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if(v3d->zbuf) glDisable(GL_DEPTH_TEST); for(nu=nurb; nu; nu=nu->next) { - tekenvertsN(nu, 1, hide_handles); + tekenvertsN(nu, 1, hide_handles, cu->lastsel); } if(v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -4935,6 +5221,8 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, } if(ml==NULL) return 1; + + if(v3d->flag2 & V3D_RENDER_OVERRIDE) return 0; /* in case solid draw, reset wire colors */ if(ob->flag & SELECT) { @@ -4986,9 +5274,6 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d) int curcol; float size; - if(G.f & G_RENDER_SHADOW) - return; - /* XXX why? */ if(ob!=scene->obedit && (ob->flag & SELECT)) { if(ob==OBACT) curcol= TH_ACTIVE; @@ -5077,13 +5362,13 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d) /*path end*/ setlinestyle(3); - where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL); + where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL, NULL); UI_ThemeColorBlend(curcol, TH_BACK, 0.5); drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat); /*path beginning*/ setlinestyle(0); - where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL); + where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL, NULL); UI_ThemeColorBlend(curcol, TH_BACK, 0.5); drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat); @@ -5236,7 +5521,7 @@ static void draw_bounding_volume(Scene *scene, Object *ob) bb= mesh_get_bb(ob); } else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) { - bb= ( (Curve *)ob->data )->bb; + bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb; } else if(ob->type==OB_MBALL) { bb= ob->bb; @@ -5303,9 +5588,22 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base) if(ELEM3(ob->type, OB_FONT,OB_CURVE, OB_SURF)) { Curve *cu = ob->data; - if (displist_has_faces(&cu->disp) && boundbox_clip(rv3d, ob->obmat, cu->bb)) { + DerivedMesh *dm = ob->derivedFinal; + int hasfaces= 0; + + if (dm) { + hasfaces= dm->getNumFaces(dm); + } else { + hasfaces= displist_has_faces(&cu->disp); + } + + if (hasfaces && boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { draw_index_wire= 0; - drawDispListwire(&cu->disp); + if (dm) { + draw_mesh_object_outline(v3d, ob, dm); + } else { + drawDispListwire(&cu->disp); + } draw_index_wire= 1; } } else if (ob->type==OB_MBALL) { @@ -5350,10 +5648,16 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob) if (ELEM3(ob->type, OB_FONT, OB_CURVE, OB_SURF)) { Curve *cu = ob->data; - if (boundbox_clip(rv3d, ob->obmat, cu->bb)) { + if (boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { if (ob->type==OB_CURVE) draw_index_wire= 0; - drawDispListwire(&cu->disp); + + if (ob->derivedFinal) { + drawCurveDMWired(ob); + } else { + drawDispListwire(&cu->disp); + } + if (ob->type==OB_CURVE) draw_index_wire= 1; } @@ -5404,9 +5708,6 @@ void drawRBpivot(bRigidBodyJointConstraint *data) float eu[3]= {radsPerDeg*data->axX, radsPerDeg*data->axY, radsPerDeg*data->axZ}; float mat[4][4]; - if(G.f & G_RENDER_SHADOW) - return; - eul_to_mat4(mat,eu); glLineWidth (4.0f); setlinestyle(2); @@ -5457,6 +5758,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if (ob!=scene->obedit) { if (ob->restrictflag & OB_RESTRICT_VIEW) return; + if ((ob->restrictflag & OB_RESTRICT_RENDER) && + (v3d->flag2 & V3D_RENDER_OVERRIDE)) + return; } /* XXX particles are not safe for simultaneous threaded render */ @@ -5672,7 +5976,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) } /* draw outline for selected solid objects, mesh does itself */ - if((v3d->flag & V3D_SELECT_OUTLINE) && ob->type!=OB_MESH) { + if((v3d->flag & V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && ob->type!=OB_MESH) { if(dt>OB_WIRE && dtmode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) { if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) { @@ -5771,9 +6075,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) set_inverted_drawing(0); } } - else if(dt==OB_BOUNDBOX) - draw_bounding_volume(scene, ob); - else if(boundbox_clip(rv3d, ob->obmat, cu->bb)) + else if(dt==OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); + } + else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) empty_object= drawDispList(scene, v3d, rv3d, base, dt); break; @@ -5784,14 +6090,16 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(cu->editnurb) { drawnurb(scene, v3d, rv3d, base, cu->editnurb->first, dt); } - else if(dt==OB_BOUNDBOX) - draw_bounding_volume(scene, ob); - else if(boundbox_clip(rv3d, ob->obmat, cu->bb)) { + else if(dt==OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); + } + else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { empty_object= drawDispList(scene, v3d, rv3d, base, dt); if(cu->path) curve_draw_speed(scene, ob); - } + } break; case OB_MBALL: { @@ -5799,51 +6107,69 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(mb->editelems) drawmball(scene, v3d, rv3d, base, dt); - else if(dt==OB_BOUNDBOX) - draw_bounding_volume(scene, ob); + else if(dt==OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); + } else empty_object= drawmball(scene, v3d, rv3d, base, dt); break; } case OB_EMPTY: - drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + drawaxes(rv3d, rv3d->viewmatob, ob->empty_drawsize, flag, ob->empty_drawtype); break; case OB_LAMP: - drawlamp(scene, v3d, rv3d, base, dt, flag); - if(dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + drawlamp(scene, v3d, rv3d, base, dt, flag); + if(dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat); + } break; case OB_CAMERA: - drawcamera(scene, v3d, rv3d, ob, flag); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0 || (rv3d->persp==RV3D_CAMOB && v3d->camera==ob)) /* special exception for active camera */ + drawcamera(scene, v3d, rv3d, ob, flag); break; case OB_LATTICE: - drawlattice(scene, v3d, ob); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + drawlattice(scene, v3d, ob); + } break; case OB_ARMATURE: - if(dt>OB_WIRE) GPU_enable_material(0, NULL); // we use default material - empty_object= draw_armature(scene, v3d, ar, base, dt, flag); - if(dt>OB_WIRE) GPU_disable_material(); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + if(dt>OB_WIRE) GPU_enable_material(0, NULL); // we use default material + empty_object= draw_armature(scene, v3d, ar, base, dt, flag); + if(dt>OB_WIRE) GPU_disable_material(); + } break; default: - drawaxes(1.0, flag, OB_ARROWS); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + drawaxes(rv3d, rv3d->viewmatob, 1.0, flag, OB_ARROWS); + } } - if(ob->soft /*&& flag & OB_SBMOTION*/){ - float mrt[3][3],msc[3][3],mtr[3][3]; - SoftBody *sb = 0; - float tipw = 0.5f, tiph = 0.5f,drawsize = 4.0f; - if ((sb= ob->soft)){ - if(sb->solverflags & SBSO_ESTIMATEIPO){ - glLoadMatrixf(rv3d->viewmat); - copy_m3_m3(msc,sb->lscale); - copy_m3_m3(mrt,sb->lrot); - mul_m3_m3m3(mtr,mrt,msc); - ob_draw_RE_motion(sb->lcom,mtr,tipw,tiph,drawsize); - glMultMatrixf(ob->obmat); + if((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { + + if(ob->soft /*&& flag & OB_SBMOTION*/){ + float mrt[3][3],msc[3][3],mtr[3][3]; + SoftBody *sb = 0; + float tipw = 0.5f, tiph = 0.5f,drawsize = 4.0f; + if ((sb= ob->soft)){ + if(sb->solverflags & SBSO_ESTIMATEIPO){ + + glLoadMatrixf(rv3d->viewmat); + copy_m3_m3(msc,sb->lscale); + copy_m3_m3(mrt,sb->lrot); + mul_m3_m3m3(mtr,mrt,msc); + ob_draw_RE_motion(sb->lcom,mtr,tipw,tiph,drawsize); + glMultMatrixf(ob->obmat); + } } } - } - if(ob->pd && ob->pd->forcefield) draw_forcefield(scene, ob, rv3d); + if(ob->pd && ob->pd->forcefield) { + draw_forcefield(scene, ob, rv3d); + } + } /* code for new particle system */ if( (warning_recursive==0) && @@ -5852,7 +6178,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) (ob!=scene->obedit) ) { ParticleSystem *psys; - PTCacheEdit *edit = PE_get_current(scene, ob); if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */ //glDepthMask(GL_FALSE); @@ -5863,9 +6188,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) for(psys=ob->particlesystem.first; psys; psys=psys->next) { /* run this so that possible child particles get cached */ - if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) + if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) { + PTCacheEdit *edit = PE_create_current(scene, ob); if(edit && edit->psys == psys) draw_update_ptcache_edit(scene, ob, edit); + } draw_new_particle_system(scene, v3d, rv3d, base, psys, dt); } @@ -5885,7 +6212,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) ) { if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) { - PTCacheEdit *edit = PE_get_current(scene, ob); + PTCacheEdit *edit = PE_create_current(scene, ob); if(edit) { glLoadMatrixf(rv3d->viewmat); draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt); @@ -5999,7 +6326,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) } } - { + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + bConstraint *con; for(con=ob->constraints.first; con; con= con->next) { @@ -6010,27 +6338,31 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) drawRBpivot(data); } } - } - /* draw extra: after normal draw because of makeDispList */ - if(dtx && !(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))) { - if(dtx & OB_AXIS) { - drawaxes(1.0f, flag, OB_ARROWS); - } - if(dtx & OB_BOUNDBOX) draw_bounding_volume(scene, ob); - if(dtx & OB_TEXSPACE) drawtexspace(ob); - if(dtx & OB_DRAWNAME) { - /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */ - /* but, we also dont draw names for sets or duplicators */ - if(flag == 0) { - view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0); + /* draw extra: after normal draw because of makeDispList */ + if(dtx && (G.f & G_RENDER_OGL)==0) { + + if(dtx & OB_AXIS) { + drawaxes(rv3d, rv3d->viewmatob, 1.0f, flag, OB_ARROWS); } + if(dtx & OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + draw_bounding_volume(scene, ob); + } + if(dtx & OB_TEXSPACE) drawtexspace(ob); + if(dtx & OB_DRAWNAME) { + /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */ + /* but, we also dont draw names for sets or duplicators */ + if(flag == 0) { + view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0); + } + } + /*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/ + if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(scene, rv3d, ob); } - /*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/ - if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(scene, rv3d, ob); } - if(dtflag2 & V3D_RENDER_OVERRIDE)==0) { if((ob->gameflag & OB_DYNAMIC) || ((ob->gameflag & OB_BOUNDS) && (ob->boundtype == OB_BOUND_SPHERE))) { float imat[4][4], vec[3]; @@ -6053,13 +6385,15 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(warning_recursive) return; if(base->flag & OB_FROMDUPLI) return; - if(G.f & G_RENDER_SHADOW) return; + if(v3d->flag2 & V3D_RENDER_OVERRIDE) return; /* object centers, need to be drawn in viewmat space for speed, but OK for picking select */ if(ob!=OBACT || !(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) { int do_draw_center= -1; /* defines below are zero or positive... */ - if((scene->basact)==base) + if(v3d->flag2 & V3D_RENDER_OVERRIDE) { + /* dont draw */ + } else if((scene->basact)==base) do_draw_center= ACTIVE; else if(base->flag & SELECT) do_draw_center= SELECT; @@ -6076,15 +6410,15 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) else if((flag & DRAW_CONSTCOLOR)==0) { /* we don't draw centers for duplicators and sets */ if(U.obcenter_dia > 0) { - /* check > 0 otherwise grease pencil can draw into the circle select which is annoying. */ - drawcentercircle(v3d, rv3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us>1); + /* check > 0 otherwise grease pencil can draw into the circle select which is annoying. */ + drawcentercircle(v3d, rv3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us>1); } } } } /* not for sets, duplicators or picking */ - if(flag==0 && (!(v3d->flag & V3D_HIDE_HELPLINES))) { + if(flag==0 && (v3d->flag & V3D_HIDE_HELPLINES)== 0 && (v3d->flag2 & V3D_RENDER_OVERRIDE)== 0) { ListBase *list; /* draw hook center and offset line */ @@ -6225,7 +6559,7 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d, ptrs[1] = (void*)(intptr_t) 1; dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0); - if( CHECK_OB_DRAWFACEDOT(scene, v3d, ob->dt) ) { + if(check_ob_drawface_dot(scene, v3d, ob->dt)) { glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE)); bglBegin(GL_POINTS); @@ -6345,9 +6679,9 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r if(dt<=OB_WIRE) { if(dm) - dm->drawEdges(dm, 1); + dm->drawEdges(dm, 1, 0); else if(edm) - edm->drawEdges(edm, 1); + edm->drawEdges(edm, 1, 0); } else { if(outline) @@ -6391,7 +6725,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object draw_object_mesh_instance(scene, v3d, rv3d, ob, dt, outline); break; case OB_EMPTY: - drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype); + drawaxes(rv3d, rv3d->viewmatob, ob->empty_drawsize, 0, ob->empty_drawtype); break; } } diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c index 004d4a022f6..420f2d77fed 100644 --- a/source/blender/editors/space_view3d/drawvolume.c +++ b/source/blender/editors/space_view3d/drawvolume.c @@ -29,41 +29,15 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "MEM_guardedalloc.h" -#include "IMB_imbuf.h" -#include "DNA_armature_types.h" -#include "DNA_boid_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_constraint_types.h" // for drawing constraint -#include "DNA_effect_types.h" -#include "DNA_lamp_types.h" -#include "DNA_lattice_types.h" -#include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_meta_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_object_fluidsim.h" -#include "DNA_particle_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_smoke_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" -#include "DNA_world_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -99,23 +73,13 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "GPU_draw.h" -#include "GPU_material.h" #include "GPU_extensions.h" #include "ED_mesh.h" -#include "ED_particle.h" -#include "ED_screen.h" -#include "ED_types.h" -#include "ED_util.h" -#include "UI_resources.h" -#include "UI_interface_icons.h" -#include "WM_api.h" #include "BLF_api.h" -#include "GPU_extensions.h" #include "view3d_intern.h" // own include @@ -248,7 +212,7 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture {{-1.0f, 1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}} }; - /* Fragment program to calculate the 3dview of smoke */ + /* Fragment program to calculate the view3d of smoke */ /* using 2 textures, density and shadow */ const char *text = "!!ARBfp1.0\n" "PARAM dx = program.local[0];\n" @@ -272,6 +236,11 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture float size[3]; + if(!tex) { + printf("Could not allocate 3D texture for 3D View smoke drawing.\n"); + return; + } + tstart(); VECSUB(size, max, min); @@ -380,6 +349,11 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture } } + if(i >= 8) { + /* fallback, avoid using buffer over-run */ + i= 0; + } + // printf("i: %d\n", i); // printf("point %f, %f, %f\n", cv[i][0], cv[i][1], cv[i][2]); @@ -397,7 +371,7 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, 7.0, 7.0, 7.0, 1.0); } else - printf("Your gfx card does not support 3dview smoke drawing.\n"); + printf("Your gfx card does not support 3D View smoke drawing.\n"); GPU_texture_bind(tex, 0); if(tex_shadow) diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index fc67881367f..caad2afba7f 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,13 +29,8 @@ #include #include -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_view3d_types.h" #include "MEM_guardedalloc.h" @@ -50,22 +45,20 @@ #include "BKE_utildefines.h" #include "BKE_image.h" -#include "ED_armature.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_object.h" #include "BIF_gl.h" + #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "RNA_access.h" +#include "UI_resources.h" + #include "view3d_intern.h" // own include /* ******************** manage regions ********************* */ @@ -230,7 +223,7 @@ static SpaceLink *view3d_new(const bContext *C) ar= MEM_callocN(sizeof(ARegion), "toolshelf for view3d"); BLI_addtail(&v3d->regionbase, ar); - ar->regiontype= RGN_TYPE_UI; + ar->regiontype= RGN_TYPE_TOOLS; ar->alignment= RGN_ALIGN_LEFT; ar->flag = RGN_FLAG_HIDDEN; @@ -238,7 +231,7 @@ static SpaceLink *view3d_new(const bContext *C) ar= MEM_callocN(sizeof(ARegion), "tool properties for view3d"); BLI_addtail(&v3d->regionbase, ar); - ar->regiontype= RGN_TYPE_UI; + ar->regiontype= RGN_TYPE_TOOL_PROPS; ar->alignment= RGN_ALIGN_BOTTOM|RGN_SPLIT_PREV; ar->flag = RGN_FLAG_HIDDEN; @@ -420,10 +413,16 @@ static int view3d_mat_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) static int view3d_ima_drop_poll(bContext *C, wmDrag *drag, wmEvent *event) { - if(drag->type==WM_DRAG_ID) { - ID *id= (ID *)drag->poin; - if( GS(id->name)==ID_IM ) - return 1; + if( ED_view3d_give_base_under_cursor(C, event->mval) ) { + if(drag->type==WM_DRAG_ID) { + ID *id= (ID *)drag->poin; + if( GS(id->name)==ID_IM ) + return 1; + } + else if(drag->type==WM_DRAG_PATH){ + if(ELEM(drag->icon, 0, ICON_FILE_IMAGE)) /* rule might not work? */ + return 1; + } } return 0; } @@ -444,10 +443,20 @@ static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop) static void view3d_id_drop_copy(wmDrag *drag, wmDropBox *drop) { ID *id= (ID *)drag->poin; - + RNA_string_set(drop->ptr, "name", id->name+2); } +static void view3d_id_path_drop_copy(wmDrag *drag, wmDropBox *drop) +{ + ID *id= (ID *)drag->poin; + + if(id) + RNA_string_set(drop->ptr, "name", id->name+2); + if(drag->path[0]) + RNA_string_set(drop->ptr, "filepath", drag->path); +} + /* region dropbox definition */ static void view3d_dropboxes(void) @@ -456,7 +465,7 @@ static void view3d_dropboxes(void) WM_dropbox_add(lb, "OBJECT_OT_add_named_cursor", view3d_ob_drop_poll, view3d_ob_drop_copy); WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy); - WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_drop_poll, view3d_id_drop_copy); + WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_drop_poll, view3d_id_path_drop_copy); } @@ -514,13 +523,19 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) switch(wmn->category) { case NC_ANIMATION: switch(wmn->data) { - case ND_KEYFRAME_EDIT: case ND_KEYFRAME_PROP: - case ND_NLA_EDIT: case ND_NLA_ACTCHANGE: - case ND_ANIMCHAN_SELECT: ED_region_tag_redraw(ar); break; + case ND_NLA: + case ND_KEYFRAME: + if (wmn->action == NA_EDITED) + ED_region_tag_redraw(ar); + break; + case ND_ANIMCHAN: + if (wmn->action == NA_SELECTED) + ED_region_tag_redraw(ar); + break; } break; case NC_SCENE: @@ -548,8 +563,7 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) case ND_MODIFIER: case ND_CONSTRAINT: case ND_KEYS: - case ND_PARTICLE_SELECT: - case ND_PARTICLE_DATA: + case ND_PARTICLE: ED_region_tag_redraw(ar); break; } @@ -573,7 +587,7 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) break; case NC_BRUSH: if(wmn->action == NA_EDITED) - ED_region_tag_redraw(ar); + ED_region_tag_redraw_overlay(ar); break; case NC_MATERIAL: switch(wmn->data) { @@ -601,9 +615,18 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) * more context than just the region */ ED_region_tag_redraw(ar); break; + case NC_TEXTURE: + /* same as above */ + ED_region_tag_redraw(ar); + break; case NC_SPACE: - if(wmn->data == ND_SPACE_VIEW3D) + if(wmn->data == ND_SPACE_VIEW3D) { + if (wmn->subtype == NS_VIEW3D_GPU) { + RegionView3D *rv3d= ar->regiondata; + rv3d->rflag |= RV3D_GPULIGHT_UPDATE; + } ED_region_tag_redraw(ar); + } break; case NC_ID: if(wmn->action == NA_RENAME) @@ -691,12 +714,15 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn) switch(wmn->category) { case NC_ANIMATION: switch(wmn->data) { - case ND_KEYFRAME_EDIT: case ND_KEYFRAME_PROP: - case ND_NLA_EDIT: case ND_NLA_ACTCHANGE: ED_region_tag_redraw(ar); break; + case ND_NLA: + case ND_KEYFRAME: + if (wmn->action == NA_EDITED) + ED_region_tag_redraw(ar); + break; } break; case NC_SCENE: @@ -723,6 +749,7 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn) case ND_POSE: case ND_DRAW: case ND_KEYS: + case ND_MODIFIER: ED_region_tag_redraw(ar); break; } @@ -734,6 +761,8 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn) ED_region_tag_redraw(ar); break; } + if (wmn->action == NA_EDITED) + ED_region_tag_redraw(ar); break; case NC_TEXTURE: /* for brush textures */ @@ -774,6 +803,25 @@ static void view3d_tools_area_draw(const bContext *C, ARegion *ar) ED_region_panels(C, ar, 1, CTX_data_mode_string(C), -1); } +static void view3d_props_area_listener(ARegion *ar, wmNotifier *wmn) +{ + /* context changes */ + switch(wmn->category) { + case NC_WM: + if(wmn->data == ND_HISTORY) + ED_region_tag_redraw(ar); + break; + case NC_SCENE: + if(wmn->data == ND_MODE) + ED_region_tag_redraw(ar); + break; + case NC_SPACE: + if(wmn->data == ND_SPACE_VIEW3D) + ED_region_tag_redraw(ar); + break; + } +} + static int view3d_context(const bContext *C, const char *member, bContextDataResult *result) { View3D *v3d= CTX_wm_view3d(C); @@ -802,7 +850,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } else if(CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) { @@ -820,7 +868,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } else if(CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) { @@ -836,7 +884,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } else if(CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) { @@ -852,7 +900,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes } } } - + CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } else if(CTX_data_equals(member, "active_base")) { @@ -948,7 +996,10 @@ void ED_spacetype_view3d(void) art->draw= view3d_tools_area_draw; BLI_addhead(&st->regiontypes, art); +#if 0 + /* unfinished still */ view3d_toolshelf_register(art); +#endif /* regions: tool properties */ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region"); @@ -956,7 +1007,7 @@ void ED_spacetype_view3d(void) art->prefsizex= 0; art->prefsizey= 120; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES; - art->listener= view3d_buttons_area_listener; + art->listener= view3d_props_area_listener; art->init= view3d_tools_area_init; art->draw= view3d_tools_area_draw; BLI_addhead(&st->regiontypes, art); diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index e679310b224..93a045dad9d 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,24 +31,13 @@ #include #include -#include "DNA_ID.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_curve_types.h" -#include "DNA_camera_types.h" -#include "DNA_gpencil_types.h" -#include "DNA_lamp_types.h" #include "DNA_lattice_types.h" #include "DNA_meta_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -79,24 +68,15 @@ #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" #include "ED_armature.h" -#include "ED_curve.h" -#include "ED_image.h" #include "ED_gpencil.h" -#include "ED_keyframing.h" #include "ED_mesh.h" -#include "ED_object.h" -#include "ED_particle.h" #include "ED_screen.h" #include "ED_transform.h" -#include "ED_types.h" -#include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "view3d_intern.h" // own include @@ -147,7 +127,7 @@ typedef struct { float ob_scale[3]; // need temp space due to linked values float ob_dims[3]; short link_scale; - float ve_median[5]; + float ve_median[6]; int curdef; float *defweightp; } TransformProperties; @@ -159,12 +139,12 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d uiBlock *block= (layout)? uiLayoutAbsoluteBlock(layout): NULL; MDeformVert *dvert=NULL; TransformProperties *tfp= v3d->properties_storage; - float median[5], ve_median[5]; - int tot, totw, totweight, totedge; + float median[6], ve_median[6]; + int tot, totw, totweight, totedge, totradius; char defstr[320]; - median[0]= median[1]= median[2]= median[3]= median[4]= 0.0; - tot= totw= totweight= totedge= 0; + median[0]= median[1]= median[2]= median[3]= median[4]= median[5]= 0.0; + tot= totw= totweight= totedge= totradius= 0; defstr[0]= 0; if(ob->type==OB_MESH) { @@ -179,7 +159,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d if(BM_TestHFlag(eve, BM_SELECT)) { evedef= eve; tot++; - add_v3_v3v3(median, median, eve->co); + add_v3_v3(median, eve->co); } } @@ -233,18 +213,20 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d a= nu->pntsu; while(a--) { if(bezt->f2 & SELECT) { - add_v3_v3v3(median, median, bezt->vec[1]); + add_v3_v3(median, bezt->vec[1]); tot++; median[4]+= bezt->weight; totweight++; + median[5]+= bezt->radius; + totradius++; } else { if(bezt->f1 & SELECT) { - add_v3_v3v3(median, median, bezt->vec[0]); + add_v3_v3(median, bezt->vec[0]); tot++; } if(bezt->f3 & SELECT) { - add_v3_v3v3(median, median, bezt->vec[2]); + add_v3_v3(median, bezt->vec[2]); tot++; } } @@ -256,12 +238,14 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d a= nu->pntsu*nu->pntsv; while(a--) { if(bp->f1 & SELECT) { - add_v3_v3v3(median, median, bp->vec); + add_v3_v3(median, bp->vec); median[3]+= bp->vec[3]; totw++; tot++; median[4]+= bp->weight; totweight++; + median[5]+= bp->radius; + totradius++; } bp++; } @@ -278,7 +262,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d bp= lt->editlatt->def; while(a--) { if(bp->f1 & SELECT) { - add_v3_v3v3(median, median, bp->vec); + add_v3_v3(median, bp->vec); tot++; median[4]+= bp->weight; totweight++; @@ -295,6 +279,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d if(totedge) median[3] /= (float)totedge; else if(totw) median[3] /= (float)totw; if(totweight) median[4] /= (float)totweight; + if(totradius) median[5] /= (float)totradius; if(v3d->flag & V3D_GLOBAL_STATS) mul_m4_v3(ob->obmat, median); @@ -324,6 +309,8 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d uiBlockEndAlign(block); if(totweight) uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 0, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, ""); + if(totradius) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs"); } else { uiBlockBeginAlign(block); @@ -332,6 +319,8 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d uiBlockEndAlign(block); if(totweight) uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, ""); + if(totradius) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs"); } } else { @@ -349,6 +338,8 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d uiBlockEndAlign(block); if(totweight) uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 0, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal"); + if(totradius) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs"); uiBlockEndAlign(block); } else { @@ -358,6 +349,8 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d uiBlockEndAlign(block); if(totweight) uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal"); + if(totradius) + uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs"); uiBlockEndAlign(block); } } @@ -379,6 +372,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d sub_v3_v3v3(median, ve_median, median); median[3]= ve_median[3]-median[3]; median[4]= ve_median[4]-median[4]; + median[5]= ve_median[5]-median[5]; if(ob->type==OB_MESH) { Mesh *me= ob->data; @@ -389,7 +383,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { if(BM_TestHFlag(eve, BM_SELECT)) { - add_v3_v3v3(eve->co, eve->co, median); + add_v3_v3(eve->co, median); } } @@ -424,17 +418,18 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d a= nu->pntsu; while(a--) { if(bezt->f2 & SELECT) { - add_v3_v3v3(bezt->vec[0], bezt->vec[0], median); - add_v3_v3v3(bezt->vec[1], bezt->vec[1], median); - add_v3_v3v3(bezt->vec[2], bezt->vec[2], median); + add_v3_v3(bezt->vec[0], median); + add_v3_v3(bezt->vec[1], median); + add_v3_v3(bezt->vec[2], median); bezt->weight+= median[4]; + bezt->radius+= median[5]; } else { if(bezt->f1 & SELECT) { - add_v3_v3v3(bezt->vec[0], bezt->vec[0], median); + add_v3_v3(bezt->vec[0], median); } if(bezt->f3 & SELECT) { - add_v3_v3v3(bezt->vec[2], bezt->vec[2], median); + add_v3_v3(bezt->vec[2], median); } } bezt++; @@ -445,9 +440,10 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d a= nu->pntsu*nu->pntsv; while(a--) { if(bp->f1 & SELECT) { - add_v3_v3v3(bp->vec, bp->vec, median); + add_v3_v3(bp->vec, median); bp->vec[3]+= median[3]; bp->weight+= median[4]; + bp->radius+= median[5]; } bp++; } @@ -467,7 +463,7 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d bp= lt->editlatt->def; while(a--) { if(bp->f1 & SELECT) { - add_v3_v3v3(bp->vec, bp->vec, median); + add_v3_v3(bp->vec, median); bp->weight+= median[4]; } bp++; @@ -752,57 +748,57 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr) uiLayoutSetActive(split, !(bone->parent && bone->flag & BONE_CONNECTED)); } colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "Location", 0, ptr, "location", 0); + uiItemR(colsub, ptr, "location", 0, "Location", 0); colsub = uiLayoutColumn(split, 1); uiItemL(colsub, "", 0); - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); split = uiLayoutSplit(layout, 0.8, 0); switch(RNA_enum_get(ptr, "rotation_mode")) { case ROT_MODE_QUAT: /* quaternion */ colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "Rotation", 0, ptr, "rotation_quaternion", 0); + uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", 0); colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "4L", 0, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE); + uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0); if (RNA_boolean_get(ptr, "lock_rotations_4d")) - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); else uiItemL(colsub, "", 0); - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); break; case ROT_MODE_AXISANGLE: /* axis angle */ colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "Rotation", 0, ptr, "rotation_axis_angle", 0); + uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", 0); colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "4L", 0, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE); + uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0); if (RNA_boolean_get(ptr, "lock_rotations_4d")) - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); else uiItemL(colsub, "", 0); - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); break; default: /* euler rotations */ colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "Rotation", 0, ptr, "rotation_euler", 0); + uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", 0); colsub = uiLayoutColumn(split, 1); uiItemL(colsub, "", 0); - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); break; } - uiItemR(layout, "", 0, ptr, "rotation_mode", 0); + uiItemR(layout, ptr, "rotation_mode", 0, "", 0); split = uiLayoutSplit(layout, 0.8, 0); colsub = uiLayoutColumn(split, 1); - uiItemR(colsub, "Scale", 0, ptr, "scale", 0); + uiItemR(colsub, ptr, "scale", 0, "Scale", 0); colsub = uiLayoutColumn(split, 1); uiItemL(colsub, "", 0); - uiItemR(colsub, "", ICON_LOCKED, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY); + uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0); if (ptr->type == &RNA_Object) { Object *ob = ptr->data; if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) - uiItemR(layout, "Dimensions", 0, ptr, "dimensions", 0); + uiItemR(layout, ptr, "dimensions", 0, "Dimensions", 0); } } @@ -928,18 +924,18 @@ static void v3d_editarmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo col= uiLayoutColumn(layout, 0); - uiItemR(col, "Head", 0, &eboneptr, "head", 0); + uiItemR(col, &eboneptr, "head", 0, "Head", 0); if (ebone->parent && ebone->flag & BONE_CONNECTED ) { PointerRNA parptr = RNA_pointer_get(&eboneptr, "parent"); - uiItemR(col, "Radius", 0, &parptr, "tail_radius", 0); + uiItemR(col, &parptr, "tail_radius", 0, "Radius", 0); } else { - uiItemR(col, "Radius", 0, &eboneptr, "head_radius", 0); + uiItemR(col, &eboneptr, "head_radius", 0, "Radius", 0); } - uiItemR(col, "Tail", 0, &eboneptr, "tail", 0); - uiItemR(col, "Radius", 0, &eboneptr, "tail_radius", 0); + uiItemR(col, &eboneptr, "tail", 0, "Tail", 0); + uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", 0); - uiItemR(col, "Roll", 0, &eboneptr, "roll", 0); + uiItemR(col, &eboneptr, "roll", 0, "Roll", 0); } static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim) @@ -958,12 +954,12 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim) RNA_pointer_create(&mball->id, &RNA_MetaElement, mball->lastelem, &ptr); col= uiLayoutColumn(layout, 0); - uiItemR(col, "Location", 0, &ptr, "location", 0); + uiItemR(col, &ptr, "location", 0, "Location", 0); - uiItemR(col, "Radius", 0, &ptr, "radius", 0); - uiItemR(col, "Stiffness", 0, &ptr, "stiffness", 0); + uiItemR(col, &ptr, "radius", 0, "Radius", 0); + uiItemR(col, &ptr, "stiffness", 0, "Stiffness", 0); - uiItemR(col, "Type", 0, &ptr, "type", 0); + uiItemR(col, &ptr, "type", 0, "Type", 0); col= uiLayoutColumn(layout, 1); switch (RNA_enum_get(&ptr, "type")) { @@ -971,24 +967,24 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim) break; case MB_CUBE: uiItemL(col, "Size:", 0); - uiItemR(col, "X", 0, &ptr, "size_x", 0); - uiItemR(col, "Y", 0, &ptr, "size_y", 0); - uiItemR(col, "Z", 0, &ptr, "size_z", 0); + uiItemR(col, &ptr, "size_x", 0, "X", 0); + uiItemR(col, &ptr, "size_y", 0, "Y", 0); + uiItemR(col, &ptr, "size_z", 0, "Z", 0); break; case MB_TUBE: uiItemL(col, "Size:", 0); - uiItemR(col, "X", 0, &ptr, "size_x", 0); + uiItemR(col, &ptr, "size_x", 0, "X", 0); break; case MB_PLANE: uiItemL(col, "Size:", 0); - uiItemR(col, "X", 0, &ptr, "size_x", 0); - uiItemR(col, "Y", 0, &ptr, "size_y", 0); + uiItemR(col, &ptr, "size_x", 0, "X", 0); + uiItemR(col, &ptr, "size_y", 0, "Y", 0); break; case MB_ELIPSOID: uiItemL(col, "Size:", 0); - uiItemR(col, "X", 0, &ptr, "size_x", 0); - uiItemR(col, "Y", 0, &ptr, "size_y", 0); - uiItemR(col, "Z", 0, &ptr, "size_z", 0); + uiItemR(col, &ptr, "size_x", 0, "X", 0); + uiItemR(col, &ptr, "size_y", 0, "Y", 0); + uiItemR(col, &ptr, "size_z", 0, "Z", 0); break; } } diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index a9ab286b2dc..8cc8c976981 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,19 +30,13 @@ #include #include -#include "DNA_action_types.h" #include "DNA_armature_types.h" #include "DNA_camera_types.h" #include "DNA_customdata_types.h" #include "DNA_group_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" #include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -75,27 +69,24 @@ #include "BIF_glutil.h" #include "WM_api.h" -#include "WM_types.h" #include "BLF_api.h" #include "ED_armature.h" #include "ED_keyframing.h" #include "ED_gpencil.h" -#include "ED_mesh.h" #include "ED_screen.h" #include "ED_space_api.h" #include "ED_screen_types.h" -#include "ED_util.h" #include "ED_transform.h" -#include "ED_types.h" +#include "ED_gpencil.h" #include "UI_interface.h" #include "UI_interface_icons.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "GPU_draw.h" #include "GPU_material.h" +#include "GPU_extensions.h" #include "view3d_intern.h" // own include @@ -303,7 +294,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u while(i--) { scalar= bUnit_GetScaler(usys, i); - dx_scalar = dx * scalar * unit->scale_length; + dx_scalar = dx * scalar / unit->scale_length; if (dx_scalar < (GRID_MIN_PX*2)) continue; @@ -476,11 +467,11 @@ static void drawfloor(Scene *scene, View3D *v3d) if (draw_line) { glBegin(GL_LINE_STRIP); - vert[0]= a*v3d->grid; - vert[1]= grid; - glVertex3fv(vert); - vert[1]= -grid; - glVertex3fv(vert); + vert[0]= a*v3d->grid; + vert[1]= grid; + glVertex3fv(vert); + vert[1]= -grid; + glVertex3fv(vert); glEnd(); } } @@ -515,11 +506,11 @@ static void drawfloor(Scene *scene, View3D *v3d) if (draw_line) { glBegin(GL_LINE_STRIP); - vert[1]= a*v3d->grid; - vert[0]= grid; - glVertex3fv(vert ); - vert[0]= -grid; - glVertex3fv(vert); + vert[1]= a*v3d->grid; + vert[0]= grid; + glVertex3fv(vert ); + vert[0]= -grid; + glVertex3fv(vert); glEnd(); } } @@ -830,7 +821,7 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d) } /* colour depends on whether there is a keyframe */ - if (id_frame_has_keyframe((ID *)ob, /*frame_to_float(scene, CFRA)*/(float)(CFRA), v3d->keyflags)) + if (id_frame_has_keyframe((ID *)ob, /*BKE_curframe(scene)*/(float)(CFRA), v3d->keyflags)) UI_ThemeColor(TH_VERTEX_SELECT); else UI_ThemeColor(TH_TEXT_HI); @@ -855,7 +846,7 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d) static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2]) { float winmax= MAX2(ar->winx, ar->winy); - float aspect= (float) (scene->r.xsch*scene->r.xasp)/(scene->r.ysch*scene->r.yasp); + float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp); if(aspect>1.0) { size_r[0]= winmax; @@ -866,14 +857,16 @@ static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2 } } -void calc_viewborder(Scene *scene, ARegion *ar, View3D *v3d, rctf *viewborder_r) +void calc_viewborder(Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, rctf *viewborder_r) { - RegionView3D *rv3d= ar->regiondata; float zoomfac, size[2]; float dx= 0.0f, dy= 0.0f; view3d_get_viewborder_size(scene, ar, size); + if (rv3d == NULL) + rv3d = ar->regiondata; + /* magic zoom calculation, no idea what * it signifies, if you find out, tell me! -zr */ @@ -982,13 +975,14 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) float x3, y3, x4, y4; rctf viewborder; Camera *ca= NULL; + RegionView3D *rv3d= (RegionView3D *)ar->regiondata; if(v3d->camera==NULL) return; if(v3d->camera->type==OB_CAMERA) ca = v3d->camera->data; - calc_viewborder(scene, ar, v3d, &viewborder); + calc_viewborder(scene, ar, rv3d, v3d, &viewborder); x1= viewborder.xmin; y1= viewborder.ymin; x2= viewborder.xmax; @@ -1077,7 +1071,7 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d) rcti winrct; if(base && (base->object->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT) || - paint_facesel_test(base->object))); + paint_facesel_test(base->object))); else if((base && (base->object->mode & OB_MODE_TEXTURE_PAINT)) && scene->toolsettings && (scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)); else if((base && (base->object->mode & OB_MODE_PARTICLE_EDIT)) && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT)); @@ -1317,7 +1311,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d) if(rv3d->persp==RV3D_CAMOB) { rctf vb; - calc_viewborder(scene, ar, v3d, &vb); + calc_viewborder(scene, ar, rv3d, v3d, &vb); x1= vb.xmin; y1= vb.ymin; @@ -1362,7 +1356,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d) int mip= 0; if(ibuf->mipmap[0]==NULL) - IMB_makemipmap(ibuf, 0, 0); + IMB_makemipmap(ibuf, 0); while(tzoom < 1.0f && mip<8 && ibuf->mipmap[mip]) { tzoom*= 2.0f; @@ -1492,11 +1486,19 @@ int dupli_ob_sort(void *arg1, void *arg2) } #endif + +static DupliObject *dupli_step(DupliObject *dob) +{ + while(dob && dob->no_draw) + dob= dob->next; + return dob; +} + static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int color) -{ +{ RegionView3D *rv3d= ar->regiondata; ListBase *lb; - DupliObject *dob; + DupliObject *dob_prev= NULL, *dob, *dob_next; Base tbase; BoundBox bb, *bb_tmp; /* use a copy because draw_object, calls clear_mesh_caches */ GLuint displist=0; @@ -1508,72 +1510,81 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas tbase.flag= OB_FROMDUPLI|base->flag; lb= object_duplilist(scene, base->object); // BLI_sortlist(lb, dupli_ob_sort); // might be nice to have if we have a dupli list with mixed objects. - - for(dob= lb->first; dob; dob= dob->next) { - if(dob->no_draw); - else { - tbase.object= dob->ob; - - /* extra service: draw the duplicator in drawtype of parent */ - /* MIN2 for the drawtype to allow bounding box objects in groups for lods */ - dt= tbase.object->dt; tbase.object->dt= MIN2(tbase.object->dt, base->object->dt); - dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx; - - /* negative scale flag has to propagate */ - transflag= tbase.object->transflag; - if(base->object->transflag & OB_NEG_SCALE) - tbase.object->transflag ^= OB_NEG_SCALE; - - UI_ThemeColorBlend(color, TH_BACK, 0.5); - - /* generate displist, test for new object */ - if(use_displist==1 && dob->prev && dob->prev->ob!=dob->ob) { - use_displist= -1; + + dob=dupli_step(lb->first); + if(dob) dob_next= dupli_step(dob->next); + + for( ; dob ; dob_prev= dob, dob= dob_next, dob_next= dob_next ? dupli_step(dob_next->next) : NULL) { + tbase.object= dob->ob; + + /* extra service: draw the duplicator in drawtype of parent */ + /* MIN2 for the drawtype to allow bounding box objects in groups for lods */ + dt= tbase.object->dt; tbase.object->dt= MIN2(tbase.object->dt, base->object->dt); + dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx; + + /* negative scale flag has to propagate */ + transflag= tbase.object->transflag; + if(base->object->transflag & OB_NEG_SCALE) + tbase.object->transflag ^= OB_NEG_SCALE; + + UI_ThemeColorBlend(color, TH_BACK, 0.5); + + /* generate displist, test for new object */ + if(dob_prev && dob_prev->ob != dob->ob) { + if(use_displist==1) glDeleteLists(displist, 1); - } - /* generate displist */ - if(use_displist == -1) { - - /* lamp drawing messes with matrices, could be handled smarter... but this works */ - /* note, since this was added, its checked dob->type==OB_DUPLIGROUP - * however this is very slow, it was probably needed for the NLA - * offset feature (used in group-duplicate.blend but no longer works in 2.5) - * so for now it should be ok to - campbell */ - if(dob->ob->type==OB_LAMP || (dob->type==OB_DUPLIGROUP && dob->animated) || !(bb_tmp= object_get_boundbox(dob->ob))) - use_displist= 0; - else { - bb= *bb_tmp; /* must make a copy */ + use_displist= -1; + } - /* disable boundbox check for list creation */ - object_boundbox_flag(dob->ob, OB_BB_DISABLED, 1); - /* need this for next part of code */ - unit_m4(dob->ob->obmat); /* obmat gets restored */ - - displist= glGenLists(1); - glNewList(displist, GL_COMPILE); - draw_object(scene, ar, v3d, &tbase, DRAW_CONSTCOLOR); - glEndList(); - - use_displist= 1; - object_boundbox_flag(dob->ob, OB_BB_DISABLED, 0); - } - } - if(use_displist) { - glMultMatrixf(dob->mat); - if(boundbox_clip(rv3d, dob->mat, &bb)) - glCallList(displist); - glLoadMatrixf(rv3d->viewmat); + /* generate displist */ + if(use_displist == -1) { + + /* note, since this was added, its checked dob->type==OB_DUPLIGROUP + * however this is very slow, it was probably needed for the NLA + * offset feature (used in group-duplicate.blend but no longer works in 2.5) + * so for now it should be ok to - campbell */ + + if( (dob_next==NULL || dob_next->ob != dob->ob) || /* if this is the last no need to make a displist */ + (dob->ob->type == OB_LAMP) || /* lamp drawing messes with matrices, could be handled smarter... but this works */ + (dob->type == OB_DUPLIGROUP && dob->animated) || + !(bb_tmp= object_get_boundbox(dob->ob)) + ) { + // printf("draw_dupli_objects_color: skipping displist for %s\n", dob->ob->id.name+2); + use_displist= 0; } else { - copy_m4_m4(dob->ob->obmat, dob->mat); + // printf("draw_dupli_objects_color: using displist for %s\n", dob->ob->id.name+2); + bb= *bb_tmp; /* must make a copy */ + + /* disable boundbox check for list creation */ + object_boundbox_flag(dob->ob, OB_BB_DISABLED, 1); + /* need this for next part of code */ + unit_m4(dob->ob->obmat); /* obmat gets restored */ + + displist= glGenLists(1); + glNewList(displist, GL_COMPILE); draw_object(scene, ar, v3d, &tbase, DRAW_CONSTCOLOR); + glEndList(); + + use_displist= 1; + object_boundbox_flag(dob->ob, OB_BB_DISABLED, 0); } - - tbase.object->dt= dt; - tbase.object->dtx= dtx; - tbase.object->transflag= transflag; } + if(use_displist) { + glMultMatrixf(dob->mat); + if(boundbox_clip(rv3d, dob->mat, &bb)) + glCallList(displist); + glLoadMatrixf(rv3d->viewmat); + } + else { + copy_m4_m4(dob->ob->obmat, dob->mat); + draw_object(scene, ar, v3d, &tbase, DRAW_CONSTCOLOR); + } + + tbase.object->dt= dt; + tbase.object->dtx= dtx; + tbase.object->transflag= transflag; } /* Transp afterdraw disabled, afterdraw only stores base pointers, and duplis can be same obj */ @@ -1647,7 +1658,7 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d) v3d->zbuf= TRUE; glEnable(GL_DEPTH_TEST); - draw_gpencil_3dview_ext(scene, ar, 1); + draw_gpencil_view3d_ext(scene, ar, 1); v3d->zbuf= zbuf; @@ -1791,6 +1802,8 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d) Scene *sce; Base *base; Object *ob; + ARegion ar; + RegionView3D rv3d; shadows.first= shadows.last= NULL; @@ -1818,23 +1831,36 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d) for(shadow=shadows.first; shadow; shadow=shadow->next) { /* this needs to be done better .. */ float viewmat[4][4], winmat[4][4]; - int drawtype, lay, winsize, flag2; + int drawtype, lay, winsize, flag2=v3d->flag2; drawtype= v3d->drawtype; lay= v3d->lay; - flag2= v3d->flag2 & V3D_SOLID_TEX; v3d->drawtype = OB_SOLID; v3d->lay &= GPU_lamp_shadow_layer(shadow->lamp); v3d->flag2 &= ~V3D_SOLID_TEX; + v3d->flag2 |= V3D_RENDER_OVERRIDE; GPU_lamp_shadow_buffer_bind(shadow->lamp, viewmat, &winsize, winmat); -// XXX drawview3d_render(v3d, viewmat, winsize, winsize, winmat, 1); + + memset(&ar, 0, sizeof(ar)); + memset(&rv3d, 0, sizeof(rv3d)); + + ar.regiondata= &rv3d; + ar.regiontype= RGN_TYPE_WINDOW; + rv3d.persp= RV3D_CAMOB; + copy_m4_m4(rv3d.winmat, winmat); + copy_m4_m4(rv3d.viewmat, viewmat); + invert_m4_m4(rv3d.viewinv, rv3d.viewmat); + mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat); + invert_m4_m4(rv3d.persinv, rv3d.viewinv); + + ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat); GPU_lamp_shadow_buffer_unbind(shadow->lamp); v3d->drawtype= drawtype; v3d->lay= lay; - v3d->flag2 |= flag2; + v3d->flag2 = flag2; } BLI_freelistN(&shadows); @@ -1862,7 +1888,7 @@ static CustomDataMask get_viewedit_datamask(bScreen *screen, Scene *scene, Objec } if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) { mask |= CD_MASK_MTFACE | CD_MASK_MCOL; - + if(scene->gm.matmode == GAME_MAT_GLSL) mask |= CD_MASK_ORCO; } @@ -1937,19 +1963,20 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, bwiny= ar->winy; ar->winx= winx; ar->winy= winy; - + /* set flags */ G.f |= G_RENDER_OGL; - GPU_free_images(); + + /* free images which can have changed on frame-change + * warning! can be slow so only free animated images - campbell */ + GPU_free_images_anim(); /* set background color, fallback on the view background color */ if(scene->world) { glClearColor(scene->world->horr, scene->world->horg, scene->world->horb, 0.0); } else { - float col[3]; - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); + UI_ThemeClearColor(TH_BACK); } glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); @@ -2000,22 +2027,111 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, } /* draw grease-pencil stuff */ - draw_gpencil_3dview_ext(scene, ar, 1); + draw_gpencil_view3d_ext(scene, ar, 1); ED_region_pixelspace(ar); /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */ - draw_gpencil_3dview_ext(scene, ar, 0); + draw_gpencil_view3d_ext(scene, ar, 0); - GPU_free_images(); + /* freeing the images again here could be done after the operator runs, leaving for now */ + GPU_free_images_anim(); /* restore size */ ar->winx= bwinx; ar->winy= bwiny; glPopMatrix(); + + glColor4ub(255, 255, 255, 255); // XXX, without this the sequencer flickers with opengl draw enabled, need to find out why - campbell + + G.f &= ~G_RENDER_OGL; } +/* utility func for ED_view3d_draw_offscreen */ +ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, int sizex, int sizey) +{ + RegionView3D *rv3d= ar->regiondata; + ImBuf *ibuf; + GPUOffScreen *ofs; + + /* bind */ + ofs= GPU_offscreen_create(sizex, sizey); + if(ofs == NULL) + return NULL; + + GPU_offscreen_bind(ofs); + + /* render 3d view */ + if(rv3d->persp==RV3D_CAMOB && v3d->camera) { + float winmat[4][4]; + float _clipsta, _clipend, _lens, _yco, _dx, _dy; + rctf _viewplane; + + object_camera_matrix(&scene->r, v3d->camera, sizex, sizey, 0, winmat, &_viewplane, &_clipsta, &_clipend, &_lens, &_yco, &_dx, &_dy); + + ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat); + } + else { + ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL); + } + + /* read in pixels & stamp */ + ibuf= IMB_allocImBuf(sizex, sizey, 24, IB_rect, 0); + glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); + + //if((scene->r.stamp & R_STAMP_ALL) && (scene->r.stamp & R_STAMP_DRAW)) + // BKE_stamp_buf(scene, NULL, rr->rectf, rr->rectx, rr->recty, 4); + + /* unbind */ + GPU_offscreen_unbind(ofs); + GPU_offscreen_free(ofs); + + return ibuf; +} + +/* creates own 3d views, used by the sequencer */ +ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, int drawtype) +{ + View3D v3d; + ARegion ar; + RegionView3D rv3d; + + memset(&v3d, 0, sizeof(v3d)); + memset(&ar, 0, sizeof(ar)); + memset(&rv3d, 0, sizeof(rv3d)); + + /* connect data */ + v3d.regionbase.first= v3d.regionbase.last= &ar; + ar.regiondata= &rv3d; + ar.regiontype= RGN_TYPE_WINDOW; + + v3d.camera= scene->camera; + v3d.lay= scene->lay; + v3d.drawtype = drawtype; + v3d.flag2 = V3D_RENDER_OVERRIDE; + + rv3d.persp= RV3D_CAMOB; + + copy_m4_m4(rv3d.viewinv, v3d.camera->obmat); + normalize_m4(rv3d.viewinv); + invert_m4_m4(rv3d.viewmat, rv3d.viewinv); + + { + float _yco, _dx, _dy; + rctf _viewplane; + object_camera_matrix(&scene->r, v3d.camera, width, height, 0, rv3d.winmat, &_viewplane, &v3d.near, &v3d.far, &v3d.lens, &_yco, &_dx, &_dy); + } + + mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat); + invert_m4_m4(rv3d.persinv, rv3d.viewinv); + + return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height); + + // seq_view3d_cb(scene, cfra, render_size, seqrectx, seqrecty); +} + + /* NOTE: the info that this uses is updated in ED_refresh_viewport_fps(), * which currently gets called during SCREEN_OT_animation_step. */ @@ -2053,15 +2169,15 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar) fps = fps / tot; } #endif - + /* is this more then half a frame behind? */ if (fps+0.5 < FPS) { UI_ThemeColor(TH_REDALERT); - sprintf(printable, "fps: %.2f", (float)fps); + BLI_snprintf(printable, sizeof(printable), "fps: %.2f", (float)fps); } else { UI_ThemeColor(TH_TEXT_HI); - sprintf(printable, "fps: %i", (int)(fps+0.5)); + BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps+0.5)); } BLF_draw_default(22, ar->winy-17, 0.0f, printable); @@ -2075,22 +2191,26 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) Scene *sce; Base *base; Object *ob; - float col[3]; int retopo= 0, sculptparticle= 0; Object *obact = OBACT; char *grid_unit= NULL; /* from now on all object derived meshes check this */ v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C), scene, obact); - + /* shadow buffers, before we setup matrices */ if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype)) gpu_update_lamps_shadows(scene, v3d); + + /* reset default OpenGL lights if needed (i.e. after preferences have been altered) */ + if (rv3d->rflag & RV3D_GPULIGHT_UPDATE) { + rv3d->rflag &= ~RV3D_GPULIGHT_UPDATE; + GPU_default_lights(); + } /* clear background */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + UI_ThemeClearColor(TH_BACK); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /* setup view matrices */ view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL); @@ -2115,35 +2235,38 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) // needs to be done always, gridview is adjusted in drawgrid() now rv3d->gridview= v3d->grid; - if(rv3d->view==0 || rv3d->persp!=0) { - drawfloor(scene, v3d); - if(rv3d->persp==2) { - if(scene->world) { - if(scene->world->mode & WO_STARS) { - RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func, - star_stuff_term_func); + if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + + if(rv3d->view==0 || rv3d->persp != RV3D_ORTHO) { + drawfloor(scene, v3d); + if(rv3d->persp==RV3D_CAMOB) { + if(scene->world) { + if(scene->world->mode & WO_STARS) { + RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func, + star_stuff_term_func); + } } + if(v3d->flag & V3D_DISPBGPICS) draw_bgpic(scene, ar, v3d); } - if(v3d->flag & V3D_DISPBGPICS) draw_bgpic(scene, ar, v3d); } - } - else { - ED_region_pixelspace(ar); - drawgrid(&scene->unit, ar, v3d, &grid_unit); - /* XXX make function? replaces persp(1) */ - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(rv3d->winmat); - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(rv3d->viewmat); - - if(v3d->flag & V3D_DISPBGPICS) { - draw_bgpic(scene, ar, v3d); + else { + ED_region_pixelspace(ar); + drawgrid(&scene->unit, ar, v3d, &grid_unit); + /* XXX make function? replaces persp(1) */ + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(rv3d->winmat); + glMatrixMode(GL_MODELVIEW); + glLoadMatrixf(rv3d->viewmat); + + if(v3d->flag & V3D_DISPBGPICS) { + draw_bgpic(scene, ar, v3d); + } } } if(rv3d->rflag & RV3D_CLIPPING) view3d_set_clipping(rv3d); - + /* draw set first */ if(scene->set) { for(SETLOOPER(scene->set, base)) { @@ -2164,7 +2287,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) /* extra service in layerbuttons, showing used layers */ v3d->lay_used = 0; - + /* then draw not selected and the duplis, but skip editmode object */ for(base= scene->base.first; base; base= base->next) { v3d->lay_used |= base->lay; @@ -2201,8 +2324,6 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) // REEB_draw(); -// if(scene->radio) RAD_drawall(v3d->drawtype>=OB_SOLID); - /* Transp and X-ray afterdraw stuff */ view3d_draw_transp(scene, ar, v3d); view3d_draw_xray(scene, ar, v3d, 1); // clears zbuffer if it is used! @@ -2227,12 +2348,14 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) glDisable(GL_DEPTH_TEST); } - /* draw grease-pencil stuff (3d-space strokes) */ - //if (v3d->flag2 & V3D_DISPGP) - draw_gpencil_3dview((bContext *)C, 1); - - BDR_drawSketch(C); - + if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + /* draw grease-pencil stuff (3d-space strokes) */ + //if (v3d->flag2 & V3D_DISPGP) + draw_gpencil_view3d((bContext *)C, 1); + + BDR_drawSketch(C); + } + ED_region_pixelspace(ar); // retopo_paint_view_update(v3d); @@ -2240,14 +2363,17 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) /* Draw particle edit brush XXX (removed) */ - if(rv3d->persp>1) drawviewborder(scene, ar, v3d); - if(rv3d->rflag & RV3D_FLYMODE) drawviewborder_flymode(ar); - - /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */ -// if (v3d->flag2 & V3D_DISPGP) - draw_gpencil_3dview((bContext *)C, 0); - drawcursor(scene, ar, v3d); + if(rv3d->persp==RV3D_CAMOB) drawviewborder(scene, ar, v3d); + if(rv3d->rflag & RV3D_FLYMODE) drawviewborder_flymode(ar); + + if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) { + /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */ + // if (v3d->flag2 & V3D_DISPGP) + draw_gpencil_view3d((bContext *)C, 0); + + drawcursor(scene, ar, v3d); + } if(U.uiflag & USER_SHOW_ROTVIEWICON) draw_view_axis(rv3d); @@ -2262,7 +2388,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) } if (grid_unit) { /* draw below the viewport name */ UI_ThemeColor(TH_TEXT_HI); - BLF_draw_default(10, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit); + BLF_draw_default(22, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit); } ob= OBACT; @@ -2275,5 +2401,3 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) v3d->flag |= V3D_INVALID_BACKBUF; } - - diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 9e598b2c7ae..0cf2bc492ee 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,17 +31,9 @@ #include #include -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_lamp_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -61,7 +53,6 @@ #include "BKE_utildefines.h" #include "BKE_tessmesh.h" -#include "RE_pipeline.h" // make_stars #include "BIF_gl.h" @@ -73,15 +64,10 @@ #include "ED_particle.h" #include "ED_retopo.h" -#include "ED_space_api.h" #include "ED_screen.h" #include "ED_transform.h" -#include "ED_types.h" #include "ED_mesh.h" -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" #include "PIL_time.h" /* smoothview */ @@ -557,9 +543,9 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y) conjugate_qt(q1); /* conj == inv for unit quat */ VECCOPY(rv3d->ofs, vod->ofs); - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs); + sub_v3_v3(rv3d->ofs, vod->dyn_ofs); mul_qt_v3(q1, rv3d->ofs); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs); + add_v3_v3(rv3d->ofs, vod->dyn_ofs); } } else { @@ -590,9 +576,9 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y) if (vod->use_dyn_ofs) { conjugate_qt(q1); /* conj == inv for unit quat */ - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs); + sub_v3_v3(rv3d->ofs, vod->dyn_ofs); mul_qt_v3(q1, rv3d->ofs); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs); + add_v3_v3(rv3d->ofs, vod->dyn_ofs); } /* Perform the orbital rotation */ @@ -604,9 +590,9 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y) if (vod->use_dyn_ofs) { conjugate_qt(q1); - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs); + sub_v3_v3(rv3d->ofs, vod->dyn_ofs); mul_qt_v3(q1, rv3d->ofs); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs); + add_v3_v3(rv3d->ofs, vod->dyn_ofs); } } @@ -706,8 +692,15 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event) if (U.uiflag & USER_AUTOPERSP) vod->rv3d->persp= RV3D_PERSP; - else if(vod->rv3d->persp==RV3D_CAMOB) + else if(vod->rv3d->persp==RV3D_CAMOB) { + + /* changed since 2.4x, use the camera view */ + View3D *v3d = CTX_wm_view3d(C); + if(v3d->camera) + view3d_settings_from_ob(v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL); + vod->rv3d->persp= RV3D_PERSP; + } ED_region_tag_redraw(vod->ar); } @@ -736,7 +729,19 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event) } } -static int ED_operator_view3d_rotate(bContext *C) +static int view3d_camera_active_poll(bContext *C) +{ + if(ED_operator_view3d_active(C)) { + RegionView3D *rv3d= CTX_wm_region_view3d(C); + if(rv3d && rv3d->persp==RV3D_CAMOB) { + return 1; + } + } + + return 0; +} + +static int view3d_rotate_poll(bContext *C) { if (!ED_operator_view3d_active(C)) { return 0; @@ -762,7 +767,7 @@ void VIEW3D_OT_rotate(wmOperatorType *ot) /* api callbacks */ ot->invoke= viewrotate_invoke; ot->modal= viewrotate_modal; - ot->poll= ED_operator_view3d_rotate; + ot->poll= view3d_rotate_poll; /* flags */ ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER; @@ -816,7 +821,7 @@ static void viewmove_apply(ViewOpsData *vod, int x, int y) float dvec[3]; window_to_3d_delta(vod->ar, dvec, x-vod->oldx, y-vod->oldy); - add_v3_v3v3(vod->rv3d->ofs, vod->rv3d->ofs, dvec); + add_v3_v3(vod->rv3d->ofs, dvec); if(vod->rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_sync(vod->sa, vod->ar); @@ -1037,7 +1042,7 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom) vod->rv3d->dist = vod->dist0; copy_m3_m4(mat, vod->rv3d->viewinv); mul_m3_v3(mat, upvec); - add_v3_v3v3(vod->rv3d->ofs, vod->rv3d->ofs, upvec); + add_v3_v3(vod->rv3d->ofs, upvec); } else { /* these limits were in old code too */ if(vod->rv3d->dist<0.001*vod->grid) vod->rv3d->dist= 0.001*vod->grid; @@ -1119,7 +1124,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op) else { if(rv3d->persp==RV3D_CAMOB) { rv3d->camzoom+= 10; - if(rv3d->camzoom>300) rv3d->camzoom= 300; + if(rv3d->camzoom>600) rv3d->camzoom= 600; } else if(rv3d->dist> 0.001*v3d->grid) { view_zoom_mouseloc(CTX_wm_region(C), .83333f, mx, my); @@ -1172,8 +1177,8 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event) else { /* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */ - vod->origy = vod->oldy = event->x; - viewzoom_apply(vod, event->x, event->prevx, USER_ZOOM_DOLLY); + vod->origy = vod->oldy = vod->origy + event->x - event->prevx; + viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY); } request_depth_update(CTX_wm_region_view3d(C)); @@ -1250,7 +1255,17 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2. minmax_object(base->object, min, max); } } - if(!onedone) return OPERATOR_FINISHED; /* TODO - should this be cancel? */ + if(!onedone) { + ED_region_tag_redraw(ar); + /* TODO - should this be cancel? + * I think no, because we always move the cursor, with or without + * object, but in this case there is no change in the scene, + * only the cursor so I choice a ED_region_tag like + * smooth_view do for the center_cursor. + * See bug #22640 + */ + return OPERATOR_FINISHED; + } afm[0]= (max[0]-min[0]); afm[1]= (max[1]-min[1]); @@ -1278,9 +1293,9 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2. rv3d->persp= RV3D_PERSP; smooth_view(C, NULL, v3d->camera, new_ofs, NULL, &new_dist, NULL); } - else { - smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL); - } + else { + smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL); + } } // XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); @@ -1292,6 +1307,18 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2. return OPERATOR_FINISHED; } +static int viewhome_poll(bContext *C) +{ + if(ED_operator_view3d_active(C)) { + RegionView3D *rv3d= CTX_wm_region_view3d(C); //XXX, when accessed from a header menu this doesnt work! + if(rv3d && rv3d->persp!=RV3D_CAMOB) { + return 1; + } + } + + return 0; +} + void VIEW3D_OT_view_all(wmOperatorType *ot) { /* identifiers */ @@ -1301,7 +1328,7 @@ void VIEW3D_OT_view_all(wmOperatorType *ot) /* api callbacks */ ot->exec= viewhome_exec; - ot->poll= ED_operator_view3d_active; + ot->poll= viewhome_poll; /* flags */ ot->flag= 0; @@ -1309,6 +1336,7 @@ void VIEW3D_OT_view_all(wmOperatorType *ot) RNA_def_boolean(ot->srna, "center", 0, "Center", ""); } + static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview without local!, was centerview() in 2.4x */ { ARegion *ar= CTX_wm_region(C); @@ -1354,11 +1382,12 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { if(pchan->bone->flag & BONE_SELECTED) { if(pchan->bone->layer & arm->layer) { + bPoseChannel *pchan_tx= pchan->custom_tx ? pchan->custom_tx : pchan; ok= 1; - VECCOPY(vec, pchan->pose_head); + VECCOPY(vec, pchan_tx->pose_head); mul_m4_v3(ob->obmat, vec); DO_MINMAX(vec, min, max); - VECCOPY(vec, pchan->pose_tail); + VECCOPY(vec, pchan_tx->pose_tail); mul_m4_v3(ob->obmat, vec); DO_MINMAX(vec, min, max); } @@ -1457,16 +1486,10 @@ static int viewcenter_cursor_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); if (rv3d) { - if (rv3d->persp==RV3D_CAMOB) { - /* center the camera offset */ - rv3d->camdx= rv3d->camdy= 0.0; - } - else { - /* non camera center */ - float new_ofs[3]; - negate_v3_v3(new_ofs, give_cursor(scene, v3d)); - smooth_view(C, NULL, NULL, new_ofs, NULL, NULL, NULL); - } + /* non camera center */ + float new_ofs[3]; + negate_v3_v3(new_ofs, give_cursor(scene, v3d)); + smooth_view(C, NULL, NULL, new_ofs, NULL, NULL, NULL); if (rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_copy(CTX_wm_area(C), CTX_wm_region(C)); @@ -1490,12 +1513,39 @@ void VIEW3D_OT_view_center_cursor(wmOperatorType *ot) ot->flag= 0; } +static int view3d_center_camera_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */ +{ + RegionView3D *rv3d= CTX_wm_region_view3d(C); + + rv3d->camdx= rv3d->camdy= 0.0f; + + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C)); + + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_view_center_camera(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "View Camera Center"; + ot->description = "Center the camera view"; + ot->idname= "VIEW3D_OT_view_center_camera"; + + /* api callbacks */ + ot->exec= view3d_center_camera_exec; + ot->poll= view3d_camera_active_poll; + + /* flags */ + ot->flag= 0; +} + /* ********************* Set render border operator ****************** */ static int render_border_exec(bContext *C, wmOperator *op) { View3D *v3d = CTX_wm_view3d(C); ARegion *ar= CTX_wm_region(C); + RegionView3D *rv3d= ED_view3d_context_rv3d(C); Scene *scene= CTX_data_scene(C); rcti rect; @@ -1508,7 +1558,7 @@ static int render_border_exec(bContext *C, wmOperator *op) rect.ymax= RNA_int_get(op->ptr, "ymax"); /* calculate range */ - calc_viewborder(scene, ar, v3d, &vb); + calc_viewborder(scene, ar, rv3d, v3d, &vb); scene->r.border.xmin= ((float)rect.xmin-vb.xmin)/(vb.xmax-vb.xmin); scene->r.border.ymin= ((float)rect.ymin-vb.ymin)/(vb.ymax-vb.ymin); @@ -1539,15 +1589,6 @@ static int render_border_exec(bContext *C, wmOperator *op) } -static int view3d_render_border_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - RegionView3D *rv3d= CTX_wm_region_view3d(C); - - /* if not in camera view do not exec the operator*/ - if (rv3d->persp == RV3D_CAMOB) return WM_border_select_invoke(C, op, event); - else return OPERATOR_PASS_THROUGH; -} - void VIEW3D_OT_render_border(wmOperatorType *ot) { /* identifiers */ @@ -1556,11 +1597,11 @@ void VIEW3D_OT_render_border(wmOperatorType *ot) ot->idname= "VIEW3D_OT_render_border"; /* api callbacks */ - ot->invoke= view3d_render_border_invoke; + ot->invoke= WM_border_select_invoke; ot->exec= render_border_exec; ot->modal= WM_border_select_modal; - ot->poll= ED_operator_view3d_active; + ot->poll= view3d_camera_active_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1688,7 +1729,7 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op) window_to_3d_delta(ar, dvec, (rect.xmin+rect.xmax-vb[0])/2, (rect.ymin+rect.ymax-vb[1])/2); /* center the view to the center of the rectangle */ - sub_v3_v3v3(new_ofs, new_ofs, dvec); + sub_v3_v3(new_ofs, dvec); } /* work out the ratios, so that everything selected fits when we zoom */ @@ -1906,7 +1947,8 @@ static int viewnumpad_exec(bContext *C, wmOperator *op) if(v3d->camera==NULL) { v3d->camera= scene_find_camera(scene); - /*handle_view3d_lock();*/ + if (v3d->camera == NULL) + return OPERATOR_CANCELLED; } rv3d->persp= RV3D_CAMOB; smooth_view(C, NULL, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens); @@ -2005,7 +2047,7 @@ void VIEW3D_OT_view_orbit(wmOperatorType *ot) /* api callbacks */ ot->exec= vieworbit_exec; - ot->poll= ED_operator_view3d_rotate; + ot->poll= view3d_rotate_poll; /* flags */ ot->flag= 0; @@ -2311,7 +2353,7 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event) if(depth_used==0) { window_to_3d_delta(ar, dvec, mval[0]-mx, mval[1]-my); - sub_v3_v3v3(fp, fp, dvec); + sub_v3_v3(fp, dvec); } } else { @@ -2390,8 +2432,8 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; - /* rna later */ - RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", ""); + /* properties to pass to transform */ + Transform_Properties(ot, P_CONSTRAINT); } static int enable_manipulator_invoke(bContext *C, wmOperator *op, wmEvent *event) @@ -2647,21 +2689,21 @@ float m_dist; void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode) { RegionView3D *rv3d= ar->regiondata; - int i; - float phi; - float dval[7]; + int i; + float phi; + float dval[7]; // static fval[6] for low pass filter; device input vector is dval[6] static float fval[6]; - float tvec[3],rvec[3]; - float q1[4]; + float tvec[3],rvec[3]; + float q1[4]; float mat[3][3]; float upvec[3]; - /*---------------------------------------------------- + /*---------------------------------------------------- * sometimes this routine is called from headerbuttons - * viewmove needs to refresh the screen - */ + * viewmove needs to refresh the screen + */ // XXX areawinset(ar->win); @@ -2719,7 +2761,7 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode) upvec[2] = rv3d->dist; copy_m3_m4(mat, rv3d->viewinv); mul_m3_v3(mat, upvec); - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, upvec); + sub_v3_v3(rv3d->ofs, upvec); rv3d->dist = 0.0; } @@ -2761,12 +2803,12 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode) // translate the view - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, tvec); + sub_v3_v3(rv3d->ofs, tvec); /*---------------------------------------------------- - * refresh the screen XXX - */ + * refresh the screen XXX + */ // update render preview window @@ -2796,10 +2838,10 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode) float mat[3][3]; float upvec[3]; - /* Sensitivity will control how fast the view rotates. The value was - * obtained experimentally by tweaking until the author didn't get dizzy watching. - * Perhaps this should be a configurable user parameter. - */ + /* Sensitivity will control how fast the view rotates. The value was + * obtained experimentally by tweaking until the author didn't get dizzy watching. + * Perhaps this should be a configurable user parameter. + */ float psens = 0.005f * (float) U.ndof_pan; /* pan sensitivity */ float rsens = 0.005f * (float) U.ndof_rotate; /* rotate sensitivity */ float zsens = 0.3f; /* zoom sensitivity */ @@ -2822,19 +2864,19 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode) upvec[2] = rv3d->dist; copy_m3_m4(mat, rv3d->viewinv); mul_m3_v3(mat, upvec); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, upvec); + add_v3_v3(rv3d->ofs, upvec); } - /*---------------------------------------------------- + /*---------------------------------------------------- * sometimes this routine is called from headerbuttons - * viewmove needs to refresh the screen - */ + * viewmove needs to refresh the screen + */ // XXX areawinset(curarea->win); - /*---------------------------------------------------- - * record how much time has passed. clamp at 10 Hz - * pretend the previous frame occured at the clamped time - */ + /*---------------------------------------------------- + * record how much time has passed. clamp at 10 Hz + * pretend the previous frame occured at the clamped time + */ // now = PIL_check_seconds_timer(); // frametime = (now - prevTime); // if (frametime > 0.1f){ /* if more than 1/10s */ @@ -2843,13 +2885,13 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode) // prevTime = now; // sbadjust *= 60 * frametime; /* normalize ndof device adjustments to 100Hz for framerate independence */ - /* fetch the current state of the ndof device & enforce dominant mode if selected */ + /* fetch the current state of the ndof device & enforce dominant mode if selected */ // XXX getndof(fval); if (v3d->ndoffilter) filterNDOFvalues(fval); - // put scaling back here, was previously in ghostwinlay + // put scaling back here, was previously in ghostwinlay fval[0] = fval[0] * (1.0f/600.0f); fval[1] = fval[1] * (1.0f/600.0f); fval[2] = fval[2] * (1.0f/1100.0f); @@ -2858,7 +2900,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode) fval[5] = fval[5] * 0.00005f; fval[6] = fval[6] / 1000000.0f; - // scale more if not in perspective mode + // scale more if not in perspective mode if (rv3d->persp == RV3D_ORTHO) { fval[0] = fval[0] * 0.05f; fval[1] = fval[1] * 0.05f; @@ -2869,7 +2911,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode) zsens *= 8; } - /* set object offset */ + /* set object offset */ if (ob) { obofs[0] = -ob->obmat[3][0]; obofs[1] = -ob->obmat[3][1]; @@ -2879,102 +2921,102 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode) VECCOPY(obofs, rv3d->ofs); } - /* calc an adjustment based on distance from camera - disabled per patch 14402 */ - d = 1.0f; + /* calc an adjustment based on distance from camera + disabled per patch 14402 */ + d = 1.0f; /* if (ob) { - sub_v3_v3v3(diff, obofs, rv3d->ofs); - d = len_v3(diff); - } + sub_v3_v3v3(diff, obofs, rv3d->ofs); + d = len_v3(diff); + } */ - reverse = (rv3d->persmat[2][1] < 0.0f) ? -1.0f : 1.0f; + reverse = (rv3d->persmat[2][1] < 0.0f) ? -1.0f : 1.0f; - /*---------------------------------------------------- - * ndof device pan - */ - psens *= 1.0f + d; - curareaX = sbadjust * psens * fval[0]; - curareaY = sbadjust * psens * fval[1]; - dvec[0] = curareaX * rv3d->persinv[0][0] + curareaY * rv3d->persinv[1][0]; - dvec[1] = curareaX * rv3d->persinv[0][1] + curareaY * rv3d->persinv[1][1]; - dvec[2] = curareaX * rv3d->persinv[0][2] + curareaY * rv3d->persinv[1][2]; - add_v3_v3v3(rv3d->ofs, rv3d->ofs, dvec); + /*---------------------------------------------------- + * ndof device pan + */ + psens *= 1.0f + d; + curareaX = sbadjust * psens * fval[0]; + curareaY = sbadjust * psens * fval[1]; + dvec[0] = curareaX * rv3d->persinv[0][0] + curareaY * rv3d->persinv[1][0]; + dvec[1] = curareaX * rv3d->persinv[0][1] + curareaY * rv3d->persinv[1][1]; + dvec[2] = curareaX * rv3d->persinv[0][2] + curareaY * rv3d->persinv[1][2]; + add_v3_v3(rv3d->ofs, dvec); - /*---------------------------------------------------- - * ndof device dolly - */ - len = zsens * sbadjust * fval[2]; + /*---------------------------------------------------- + * ndof device dolly + */ + len = zsens * sbadjust * fval[2]; - if (rv3d->persp==RV3D_CAMOB) { - if(rv3d->persp==RV3D_CAMOB) { /* This is stupid, please fix - TODO */ - rv3d->camzoom+= 10.0f * -len; - } - if (rv3d->camzoom < minZoom) rv3d->camzoom = minZoom; - else if (rv3d->camzoom > maxZoom) rv3d->camzoom = maxZoom; - } - else if ((rv3d->dist> 0.001*v3d->grid) && (rv3d->dist<10.0*v3d->far)) { - rv3d->dist*=(1.0 + len); - } + if (rv3d->persp==RV3D_CAMOB) { + if(rv3d->persp==RV3D_CAMOB) { /* This is stupid, please fix - TODO */ + rv3d->camzoom+= 10.0f * -len; + } + if (rv3d->camzoom < minZoom) rv3d->camzoom = minZoom; + else if (rv3d->camzoom > maxZoom) rv3d->camzoom = maxZoom; + } + else if ((rv3d->dist> 0.001*v3d->grid) && (rv3d->dist<10.0*v3d->far)) { + rv3d->dist*=(1.0 + len); + } - /*---------------------------------------------------- - * ndof device turntable - * derived from the turntable code in viewmove - */ + /*---------------------------------------------------- + * ndof device turntable + * derived from the turntable code in viewmove + */ - /* Get the 3x3 matrix and its inverse from the quaternion */ - quat_to_mat3( m,rv3d->viewquat); - invert_m3_m3(m_inv,m); + /* Get the 3x3 matrix and its inverse from the quaternion */ + quat_to_mat3( m,rv3d->viewquat); + invert_m3_m3(m_inv,m); - /* Determine the direction of the x vector (for rotating up and down) */ - /* This can likely be compuated directly from the quaternion. */ - mul_m3_v3(m_inv,xvec); - mul_m3_v3(m_inv,yvec); - mul_m3_v3(m_inv,zvec); + /* Determine the direction of the x vector (for rotating up and down) */ + /* This can likely be compuated directly from the quaternion. */ + mul_m3_v3(m_inv,xvec); + mul_m3_v3(m_inv,yvec); + mul_m3_v3(m_inv,zvec); - /* Perform the up/down rotation */ - phi = sbadjust * rsens * /*0.5f * */ fval[3]; /* spin vertically half as fast as horizontally */ - q1[0] = cos(phi); - mul_v3_v3fl(q1+1, xvec, sin(phi)); - mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1); + /* Perform the up/down rotation */ + phi = sbadjust * rsens * /*0.5f * */ fval[3]; /* spin vertically half as fast as horizontally */ + q1[0] = cos(phi); + mul_v3_v3fl(q1+1, xvec, sin(phi)); + mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1); - if (use_sel) { - conjugate_qt(q1); /* conj == inv for unit quat */ - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs); - mul_qt_v3(q1, rv3d->ofs); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs); - } + if (use_sel) { + conjugate_qt(q1); /* conj == inv for unit quat */ + sub_v3_v3(rv3d->ofs, obofs); + mul_qt_v3(q1, rv3d->ofs); + add_v3_v3(rv3d->ofs, obofs); + } - /* Perform the orbital rotation */ - /* Perform the orbital rotation - If the seen Up axis is parallel to the zoom axis, rotation should be - achieved with a pure Roll motion (no Spin) on the device. When you start - to tilt, moving from Top to Side view, Spinning will increasingly become - more relevant while the Roll component will decrease. When a full - Side view is reached, rotations around the world's Up axis are achieved - with a pure Spin-only motion. In other words the control of the spinning - around the world's Up axis should move from the device's Spin axis to the - device's Roll axis depending on the orientation of the world's Up axis - relative to the screen. */ - //phi = sbadjust * rsens * reverse * fval[4]; /* spin the knob, y axis */ - phi = sbadjust * rsens * (yvec[2] * fval[4] + zvec[2] * fval[5]); - q1[0] = cos(phi); - q1[1] = q1[2] = 0.0; - q1[3] = sin(phi); - mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1); + /* Perform the orbital rotation */ + /* Perform the orbital rotation + If the seen Up axis is parallel to the zoom axis, rotation should be + achieved with a pure Roll motion (no Spin) on the device. When you start + to tilt, moving from Top to Side view, Spinning will increasingly become + more relevant while the Roll component will decrease. When a full + Side view is reached, rotations around the world's Up axis are achieved + with a pure Spin-only motion. In other words the control of the spinning + around the world's Up axis should move from the device's Spin axis to the + device's Roll axis depending on the orientation of the world's Up axis + relative to the screen. */ + //phi = sbadjust * rsens * reverse * fval[4]; /* spin the knob, y axis */ + phi = sbadjust * rsens * (yvec[2] * fval[4] + zvec[2] * fval[5]); + q1[0] = cos(phi); + q1[1] = q1[2] = 0.0; + q1[3] = sin(phi); + mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1); - if (use_sel) { - conjugate_qt(q1); - sub_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs); - mul_qt_v3(q1, rv3d->ofs); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, obofs); - } + if (use_sel) { + conjugate_qt(q1); + sub_v3_v3(rv3d->ofs, obofs); + mul_qt_v3(q1, rv3d->ofs); + add_v3_v3(rv3d->ofs, obofs); + } - /*---------------------------------------------------- - * refresh the screen - */ + /*---------------------------------------------------- + * refresh the screen + */ // XXX scrarea_do_windraw(curarea); } diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index c9edeb24aa0..71a7031e407 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -30,19 +30,7 @@ #include #include -#include "DNA_armature_types.h" -#include "DNA_ID.h" -#include "DNA_image_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" /* U.smooth_viewtx */ -#include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -67,9 +55,6 @@ #include "BKE_utildefines.h" /* for VECCOPY */ #include "BKE_tessmesh.h" -#include "ED_armature.h" -#include "ED_particle.h" -#include "ED_object.h" #include "ED_mesh.h" #include "ED_util.h" #include "ED_screen.h" @@ -79,7 +64,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" @@ -91,9 +75,7 @@ #include "BLI_editVert.h" #include "UI_interface.h" -#include "UI_interface_icons.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "view3d_intern.h" @@ -156,11 +138,12 @@ static void handle_view3d_lock(bContext *C) if(v3d->localvd==NULL && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) { /* copy to scene */ scene->lay= v3d->lay; + scene->layact= v3d->layact; scene->camera= v3d->camera; /* not through notifiery, listener don't have context and non-open screens or spaces need to be updated too */ - ED_view3d_scene_layers_update(bmain, scene); + BKE_screen_view3d_main_sync(&bmain->screen, scene); /* notifiers for scene update */ WM_event_add_notifier(C, NC_SCENE|ND_LAYER, scene); @@ -178,14 +161,18 @@ static int layers_exec(bContext *C, wmOperator *op) if(nr < 0) return OPERATOR_CANCELLED; - - + if(nr == 0) { /* all layers */ - v3d->lay |= (1<<20)-1; - if(!v3d->layact) v3d->layact= 1; + + if (toggle && v3d->lay == ((1<<20)-1)) { + /* return to active layer only */ + v3d->lay = v3d->layact; + } else { + v3d->lay |= (1<<20)-1; + } } else { int bit; @@ -398,25 +385,25 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event) if( shift==0 || v3d->twtype==0) { v3d->twtype= V3D_MANIP_TRANSLATE; } - ED_area_tag_redraw(sa); - break; + ED_area_tag_redraw(sa); + break; case B_MAN_ROT: if( shift==0 || v3d->twtype==0) { - v3d->twtype= V3D_MANIP_ROTATE; + v3d->twtype= V3D_MANIP_ROTATE; } - ED_area_tag_redraw(sa); + ED_area_tag_redraw(sa); break; case B_MAN_SCALE: if( shift==0 || v3d->twtype==0) { - v3d->twtype= V3D_MANIP_SCALE; + v3d->twtype= V3D_MANIP_SCALE; } - ED_area_tag_redraw(sa); + ED_area_tag_redraw(sa); break; case B_NDOF: - ED_area_tag_redraw(sa); + ED_area_tag_redraw(sa); break; case B_MAN_MODE: - ED_area_tag_redraw(sa); + ED_area_tag_redraw(sa); break; default: break; @@ -450,7 +437,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) uiBlock *block; uiLayout *row; - RNA_pointer_create(&screen->id, &RNA_Space3DView, v3d, &v3dptr); + RNA_pointer_create(&screen->id, &RNA_SpaceView3D, v3d, &v3dptr); RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &toolsptr); RNA_pointer_create(&scene->id, &RNA_Scene, scene, &sceneptr); @@ -488,7 +475,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) uiBlockEndAlign(block); /* Draw type */ - uiItemR(layout, "", 0, &v3dptr, "viewport_shading", UI_ITEM_R_ICON_ONLY); + uiItemR(layout, &v3dptr, "viewport_shading", UI_ITEM_R_ICON_ONLY, "", 0); if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) { /* Manipulators aren't used in weight paint mode */ @@ -496,13 +483,13 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) PointerRNA meshptr; RNA_pointer_create(&ob->id, &RNA_Mesh, ob->data, &meshptr); - uiItemR(layout, "", 0, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY); + uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", 0); } else { char *str_menu; row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY); - uiItemR(row, "", 0, &v3dptr, "pivot_point_align", UI_ITEM_R_ICON_ONLY); + uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", 0); + uiItemR(row, &v3dptr, "pivot_point_align", UI_ITEM_R_ICON_ONLY, "", 0); /* NDOF */ /* Not implemented yet @@ -510,14 +497,14 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,XIC+10,YIC, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode"); uiDefIconButC(block, TOG, B_NDOF, ICON_NDOF_DOM, - 0,0,XIC,YIC, - &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis"); + 0,0,XIC,YIC, + &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis"); } */ /* Transform widget / manipulators */ row= uiLayoutRow(layout, 1); - uiItemR(row, "", 0, &v3dptr, "manipulator", UI_ITEM_R_ICON_ONLY); + uiItemR(row, &v3dptr, "manipulator", UI_ITEM_R_ICON_ONLY, "", 0); block= uiLayoutGetBlock(row); if(v3d->twflag & V3D_USE_MANIPULATOR) { @@ -540,12 +527,12 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) /* Layers */ if (v3d->scenelock) - uiTemplateLayers(layout, &sceneptr, "visible_layers", &v3dptr, "used_layers", ob_lay); + uiTemplateLayers(layout, &sceneptr, "layers", &v3dptr, "used_layers", ob_lay); else - uiTemplateLayers(layout, &v3dptr, "visible_layers", &v3dptr, "used_layers", ob_lay); + uiTemplateLayers(layout, &v3dptr, "layers", &v3dptr, "used_layers", ob_lay); /* Scene lock */ - uiItemR(layout, "", 0, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY); + uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", 0); } /* selection modus, dont use python for this since it cant do the toggle buttons with shift+click as well as clicking to set one. */ diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index d56d70d1fbc..3e8bc71c351 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -75,6 +75,7 @@ void VIEW3D_OT_view_all(struct wmOperatorType *ot); void VIEW3D_OT_viewnumpad(struct wmOperatorType *ot); void VIEW3D_OT_view_selected(struct wmOperatorType *ot); void VIEW3D_OT_view_center_cursor(struct wmOperatorType *ot); +void VIEW3D_OT_view_center_camera(struct wmOperatorType *ot); void VIEW3D_OT_view_pan(struct wmOperatorType *ot); void VIEW3D_OT_view_persportho(struct wmOperatorType *ot); void VIEW3D_OT_add_background_image(struct wmOperatorType *ot); @@ -104,7 +105,7 @@ void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt); void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int dt, int outline); void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob); -void drawaxes(float size, int flag, char drawtype); +void drawaxes(struct RegionView3D *rv3d, float mat[][4], float size, int flag, char drawtype); void view3d_cached_text_draw_begin(void); void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs, short flag); @@ -125,7 +126,7 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d); void view3d_clr_clipping(void); void view3d_set_clipping(RegionView3D *rv3d); void add_view3d_after(View3D *v3d, Base *base, int type, int flag); -void calc_viewborder(Scene *scene, struct ARegion *ar, View3D *v3d, rctf *viewborder_r); +void calc_viewborder(Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, View3D *v3d, rctf *viewborder_r); void circf(float x, float y, float rad); void circ(float x, float y, float rad); @@ -139,6 +140,8 @@ void VIEW3D_OT_select_border(struct wmOperatorType *ot); void VIEW3D_OT_select_lasso(struct wmOperatorType *ot); /* view3d_view.c */ +void view3d_settings_from_ob(struct Object *ob, float *ofs, float *quat, float *dist, float *lens); + void VIEW3D_OT_smoothview(struct wmOperatorType *ot); void VIEW3D_OT_setcameratoview(struct wmOperatorType *ot); void VIEW3D_OT_setobjectascamera(struct wmOperatorType *ot); @@ -175,7 +178,6 @@ int minmax_verts(Object *obedit, float *min, float *max); void VIEW3D_OT_snap_selected_to_grid(struct wmOperatorType *ot); void VIEW3D_OT_snap_selected_to_cursor(struct wmOperatorType *ot); -void VIEW3D_OT_snap_selected_to_center(struct wmOperatorType *ot); void VIEW3D_OT_snap_cursor_to_grid(struct wmOperatorType *ot); void VIEW3D_OT_snap_cursor_to_center(struct wmOperatorType *ot); void VIEW3D_OT_snap_cursor_to_selected(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 792153cab08..faeab482f72 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -35,9 +35,7 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -47,12 +45,10 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_define.h" #include "WM_api.h" #include "WM_types.h" -#include "ED_screen.h" #include "ED_transform.h" #include "view3d_intern.h" @@ -74,6 +70,7 @@ void view3d_operatortypes(void) WM_operatortype_append(VIEW3D_OT_remove_background_image); WM_operatortype_append(VIEW3D_OT_view_selected); WM_operatortype_append(VIEW3D_OT_view_center_cursor); + WM_operatortype_append(VIEW3D_OT_view_center_camera); WM_operatortype_append(VIEW3D_OT_select); WM_operatortype_append(VIEW3D_OT_select_border); WM_operatortype_append(VIEW3D_OT_clip_border); @@ -97,7 +94,6 @@ void view3d_operatortypes(void) WM_operatortype_append(VIEW3D_OT_snap_selected_to_grid); WM_operatortype_append(VIEW3D_OT_snap_selected_to_cursor); - WM_operatortype_append(VIEW3D_OT_snap_selected_to_center); WM_operatortype_append(VIEW3D_OT_snap_cursor_to_grid); WM_operatortype_append(VIEW3D_OT_snap_cursor_to_center); WM_operatortype_append(VIEW3D_OT_snap_cursor_to_selected); @@ -119,7 +115,8 @@ void view3d_keymap(wmKeyConfig *keyconf) /* only for region 3D window */ keymap= WM_keymap_find(keyconf, "3D View", SPACE_VIEW3D, 0); - WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0); + kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0); + RNA_boolean_set(kmi->ptr, "release_confirm", 1); /* * Doesn't work with KM_SHIFT, have to use KM_ANY and filter in invoke * */ @@ -154,7 +151,8 @@ void view3d_keymap(wmKeyConfig *keyconf) RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, 0, 0)->ptr, "delta", 1); RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELOUTMOUSE, KM_PRESS, 0, 0)->ptr, "delta", -1); - RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0); + WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_camera", HOMEKEY, KM_PRESS, 0, 0); /* only with camera view */ + RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0); /* only without camera view */ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1); /* numpad view hotkeys*/ @@ -186,25 +184,25 @@ void view3d_keymap(wmKeyConfig *keyconf) RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELUPMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPUP); RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPDOWN); - /* active aligned, replaces '*' key in 2.4x */ - kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT, 0); - RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT); - RNA_boolean_set(kmi->ptr, "align_active", TRUE); - kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_SHIFT, 0); - RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT); - RNA_boolean_set(kmi->ptr, "align_active", TRUE); - kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT, 0); - RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP); - RNA_boolean_set(kmi->ptr, "align_active", TRUE); - kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT|KM_CTRL, 0); - RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BACK); - RNA_boolean_set(kmi->ptr, "align_active", TRUE); - kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_SHIFT|KM_CTRL, 0); - RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT); - RNA_boolean_set(kmi->ptr, "align_active", TRUE); - kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT|KM_CTRL, 0); - RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM); - RNA_boolean_set(kmi->ptr, "align_active", TRUE); + /* active aligned, replaces '*' key in 2.4x */ + kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT); + RNA_boolean_set(kmi->ptr, "align_active", TRUE); + kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT); + RNA_boolean_set(kmi->ptr, "align_active", TRUE); + kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP); + RNA_boolean_set(kmi->ptr, "align_active", TRUE); + kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BACK); + RNA_boolean_set(kmi->ptr, "align_active", TRUE); + kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT); + RNA_boolean_set(kmi->ptr, "align_active", TRUE); + kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM); + RNA_boolean_set(kmi->ptr, "align_active", TRUE); WM_keymap_add_item(keymap, "VIEW3D_OT_localview", PADSLASHKEY, KM_PRESS, 0, 0); @@ -224,12 +222,12 @@ void view3d_keymap(wmKeyConfig *keyconf) /* drawtype */ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", ZKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "space_data.viewport_shading"); + RNA_string_set(kmi->ptr, "data_path", "space_data.viewport_shading"); RNA_string_set(kmi->ptr, "value_1", "SOLID"); RNA_string_set(kmi->ptr, "value_2", "WIREFRAME"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", ZKEY, KM_PRESS, KM_ALT, 0); - RNA_string_set(kmi->ptr, "path", "space_data.viewport_shading"); + RNA_string_set(kmi->ptr, "data_path", "space_data.viewport_shading"); RNA_string_set(kmi->ptr, "value_1", "TEXTURED"); RNA_string_set(kmi->ptr, "value_2", "SOLID"); @@ -270,29 +268,29 @@ void view3d_keymap(wmKeyConfig *keyconf) /* context ops */ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "space_data.pivot_point"); + RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point"); RNA_string_set(kmi->ptr, "value", "BOUNDING_BOX_CENTER"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, KM_CTRL, 0); /* 2.4x allowed Comma+Shift too, rather not use both */ - RNA_string_set(kmi->ptr, "path", "space_data.pivot_point"); + RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point"); RNA_string_set(kmi->ptr, "value", "MEDIAN_POINT"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", COMMAKEY, KM_PRESS, KM_ALT, 0); /* new in 2.5 */ - RNA_string_set(kmi->ptr, "path", "space_data.pivot_point_align"); + RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point_align"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* new in 2.5 */ - RNA_string_set(kmi->ptr, "path", "space_data.manipulator"); + RNA_string_set(kmi->ptr, "data_path", "space_data.manipulator"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "path", "space_data.pivot_point"); + RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point"); RNA_string_set(kmi->ptr, "value", "CURSOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, KM_CTRL, 0); - RNA_string_set(kmi->ptr, "path", "space_data.pivot_point"); + RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point"); RNA_string_set(kmi->ptr, "value", "INDIVIDUAL_ORIGINS"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, KM_ALT, 0); - RNA_string_set(kmi->ptr, "path", "space_data.pivot_point"); + RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point"); RNA_string_set(kmi->ptr, "value", "ACTIVE_ELEMENT"); transform_keymap_for_space(keyconf, keymap, SPACE_VIEW3D); diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index 4a103da6d3c..ac6d61fce18 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,23 +31,8 @@ #include #include -#include "DNA_ID.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_curve_types.h" -#include "DNA_camera_types.h" -#include "DNA_lamp_types.h" -#include "DNA_lattice_types.h" -#include "DNA_meta_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -76,23 +61,12 @@ #include "WM_types.h" #include "RNA_access.h" -#include "RNA_define.h" -#include "ED_armature.h" -#include "ED_curve.h" -#include "ED_image.h" -#include "ED_keyframing.h" -#include "ED_mesh.h" -#include "ED_object.h" -#include "ED_particle.h" #include "ED_screen.h" -#include "ED_transform.h" -#include "ED_types.h" #include "ED_util.h" #include "UI_interface.h" #include "UI_resources.h" -#include "UI_view2d.h" #include "view3d_intern.h" // own include @@ -282,7 +256,7 @@ static void view3d_panel_tool_shelf(const bContext *C, Panel *pa) for(ct= st->toolshelf.first; ct; ct= ct->next) { if(0==strncmp(context, ct->context, OP_MAX_TYPENAME)) { col= uiLayoutColumn(pa->layout, 1); - uiItemFullO(col, NULL, 0, ct->opname, NULL, WM_OP_INVOKE_REGION_WIN, 0); + uiItemFullO(col, ct->opname, NULL, 0, NULL, WM_OP_INVOKE_REGION_WIN, 0); } } } diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 759a7ce08b8..4471c051aa7 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,17 +32,9 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" #include "DNA_camera_types.h" #include "DNA_lamp_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_world_types.h" #include "MEM_guardedalloc.h" @@ -63,7 +55,6 @@ #include "BKE_utildefines.h" #include "BKE_depsgraph.h" /* for fly mode updating */ -#include "RE_pipeline.h" // make_stars #include "BIF_gl.h" #include "BIF_glutil.h" @@ -72,17 +63,12 @@ #include "WM_types.h" #include "ED_keyframing.h" -#include "ED_mesh.h" #include "ED_screen.h" -#include "ED_view3d.h" #include "ED_armature.h" -#include "UI_interface.h" -#include "UI_resources.h" -#include "UI_view2d.h" - #include "GPU_draw.h" + #include "PIL_time.h" /* smoothview */ #if GAMEBLENDER == 1 @@ -152,37 +138,32 @@ static void object_lens_clip_settings(Object *ob, float *lens, float *clipsta, f * * The dist is not modified for this function, if NULL its assimed zero * */ -static void view_settings_from_ob(Object *ob, float *ofs, float *quat, float *dist, float *lens) -{ - float bmat[4][4]; - float imat[4][4]; - float tmat[3][3]; - +void view3d_settings_from_ob(Object *ob, float *ofs, float *quat, float *dist, float *lens) +{ if (!ob) return; - + /* Offset */ if (ofs) negate_v3_v3(ofs, ob->obmat[3]); /* Quat */ if (quat) { - copy_m4_m4(bmat, ob->obmat); - normalize_m4(bmat); - invert_m4_m4(imat, bmat); - copy_m3_m4(tmat, imat); - mat3_to_quat( quat,tmat); + float imat[4][4]; + invert_m4_m4(imat, ob->obmat); + mat4_to_quat(quat, imat); } - + if (dist) { - float vec[3]; - copy_m3_m4(tmat, ob->obmat); - - vec[0]= vec[1] = 0.0; - vec[2]= -(*dist); - mul_m3_v3(tmat, vec); - sub_v3_v3v3(ofs, ofs, vec); + float vec[3] = {0.0f, 0.0f, -(*dist)}; + float tquat[4]; + + mat4_to_quat(tquat, ob->obmat); + + mul_qt_v3(tquat, vec); + + sub_v3_v3(ofs, vec); } - + /* Lens */ if (lens) object_lens_clip_settings(ob, lens, NULL, NULL); @@ -226,7 +207,7 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo if(lens) sms.new_lens= *lens; if (camera) { - view_settings_from_ob(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens); + view3d_settings_from_ob(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens); sms.to_camera= 1; /* restore view3d values in end */ } @@ -260,20 +241,20 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo * the angle between quats * this means small rotations wont lag */ if (quat && !ofs && !dist) { - float vec1[3], vec2[3]; + float vec1[3], vec2[3]; - VECCOPY(vec1, sms.new_quat); - VECCOPY(vec2, sms.orig_quat); - normalize_v3(vec1); - normalize_v3(vec2); - /* scale the time allowed by the rotation */ - sms.time_allowed *= angle_normalized_v3v3(vec1, vec2)/(M_PI/2); + VECCOPY(vec1, sms.new_quat); + VECCOPY(vec2, sms.orig_quat); + normalize_v3(vec1); + normalize_v3(vec2); + /* scale the time allowed by the rotation */ + sms.time_allowed *= angle_normalized_v3v3(vec1, vec2)/(M_PI/2); } /* original values */ if (oldcamera) { sms.orig_dist= rv3d->dist; // below function does weird stuff with it... - view_settings_from_ob(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens); + view3d_settings_from_ob(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens); } else { VECCOPY(sms.orig_ofs, rv3d->ofs); @@ -377,7 +358,7 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event) v3d->lens = sms->new_lens*step + sms->orig_lens*step_inv; } - ED_region_tag_redraw(CTX_wm_region(C)); + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d); return OPERATOR_FINISHED; } @@ -540,7 +521,7 @@ void viewline(ARegion *ar, View3D *v3d, float mval[2], float ray_start[3], float float vec[4]; int a; - if(rv3d->persp != RV3D_ORTHO){ + if(!get_view3d_ortho(v3d, rv3d)) { vec[0]= 2.0f * mval[0] / ar->winx - 1; vec[1]= 2.0f * mval[1] / ar->winy - 1; vec[2]= -1.0f; @@ -550,7 +531,7 @@ void viewline(ARegion *ar, View3D *v3d, float mval[2], float ray_start[3], float mul_v3_fl(vec, 1.0f / vec[3]); copy_v3_v3(ray_start, rv3d->viewinv[3]); - sub_v3_v3v3(vec, vec, ray_start); + sub_v3_v3(vec, ray_start); normalize_v3(vec); VECADDFAC(ray_start, rv3d->viewinv[3], vec, v3d->near); @@ -692,8 +673,8 @@ void view3d_unproject(bglMats *mats, float out[3], const short x, const short y, { double ux, uy, uz; - gluUnProject(x,y,z, mats->modelview, mats->projection, - (GLint *)mats->viewport, &ux, &uy, &uz ); + gluUnProject(x,y,z, mats->modelview, mats->projection, + (GLint *)mats->viewport, &ux, &uy, &uz ); out[0] = ux; out[1] = uy; out[2] = uz; @@ -902,24 +883,59 @@ int get_view3d_ortho(View3D *v3d, RegionView3D *rv3d) Camera *cam; if(rv3d->persp==RV3D_CAMOB) { - if(v3d->camera && v3d->camera->type==OB_CAMERA) { - cam= v3d->camera->data; + if(v3d->camera && v3d->camera->type==OB_CAMERA) { + cam= v3d->camera->data; - if(cam && cam->type==CAM_ORTHO) - return 1; - else - return 0; - } - else - return 0; + if(cam && cam->type==CAM_ORTHO) + return 1; + else + return 0; + } + else + return 0; } if(rv3d->persp==RV3D_ORTHO) - return 1; + return 1; return 0; } +/* copies logic of get_view3d_viewplane(), keep in sync */ +int get_view3d_cliprange(View3D *v3d, RegionView3D *rv3d, float *clipsta, float *clipend) +{ + int orth= 0; + + *clipsta= v3d->near; + *clipend= v3d->far; + + if(rv3d->persp==RV3D_CAMOB) { + if(v3d->camera) { + if(v3d->camera->type==OB_LAMP ) { + Lamp *la= v3d->camera->data; + *clipsta= la->clipsta; + *clipend= la->clipend; + } + else if(v3d->camera->type==OB_CAMERA) { + Camera *cam= v3d->camera->data; + *clipsta= cam->clipsta; + *clipend= cam->clipend; + + if(cam->type==CAM_ORTHO) + orth= 1; + } + } + } + + if(rv3d->persp==RV3D_ORTHO) { + *clipend *= 0.5; // otherwise too extreme low zbuffer quality + *clipsta= - *clipend; + orth= 1; + } + + return orth; +} + /* also exposed in previewrender.c */ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize) { @@ -1101,7 +1117,7 @@ static void obmat_to_viewmat(View3D *v3d, RegionView3D *rv3d, Object *ob, short rv3d->persp=RV3D_PERSP; rv3d->dist= 0.0; - view_settings_from_ob(v3d->camera, rv3d->ofs, NULL, NULL, &v3d->lens); + view3d_settings_from_ob(v3d->camera, rv3d->ofs, NULL, NULL, &v3d->lens); smooth_view(NULL, NULL, NULL, orig_ofs, new_quat, &orig_dist, &orig_lens); // XXX rv3d->persp=RV3D_CAMOB; /* just to be polite, not needed */ @@ -1364,56 +1380,7 @@ static unsigned int free_localbit(void) return 0; } -static void copy_view3d_lock_space(View3D *v3d, Scene *scene) -{ - int bit; - - if(v3d->scenelock && v3d->localvd==NULL) { - v3d->lay= scene->lay; - v3d->camera= scene->camera; - - if(v3d->camera==NULL) { - ARegion *ar; - - for(ar=v3d->regionbase.first; ar; ar= ar->next) { - if(ar->regiontype == RGN_TYPE_WINDOW) { - RegionView3D *rv3d= ar->regiondata; - if(rv3d->persp==RV3D_CAMOB) - rv3d->persp= RV3D_PERSP; - } - } - } - - if((v3d->lay & v3d->layact) == 0) { - for(bit= 0; bit<32; bit++) { - if(v3d->lay & (1<layact= 1<screen.first; sc; sc=sc->id.next) { - if(sc->scene!=scene) - continue; - - for(sa=sc->areabase.first; sa; sa=sa->next) - for(sl=sa->spacedata.first; sl; sl=sl->next) - if(sl->spacetype==SPACE_VIEW3D) - copy_view3d_lock_space((View3D*)sl, scene); - } -} - -int ED_view3d_scene_layer_set(int lay, const int *values) +int ED_view3d_scene_layer_set(int lay, const int *values, int *active) { int i, tot= 0; @@ -1426,10 +1393,28 @@ int ED_view3d_scene_layer_set(int lay, const int *values) return lay; for(i=0; i<20; i++) { - if(values[i]) lay |= (1<spacetype != SPACE_VIEW3D) + /* sa can be NULL when called from python */ + if(sa==NULL || sa->spacetype != SPACE_VIEW3D) for(sa=sc->areabase.first; sa; sa= sa->next) if(sa->spacetype==SPACE_VIEW3D) break; @@ -1782,7 +1780,7 @@ static int game_engine_exec(bContext *C, wmOperator *op) if(rv3d->persp==RV3D_CAMOB && startscene->gm.framing.type == SCE_GAMEFRAMING_BARS && startscene->gm.stereoflag != STEREO_DOME) { /* Letterbox */ rctf cam_framef; - calc_viewborder(startscene, ar, CTX_wm_view3d(C), &cam_framef); + calc_viewborder(startscene, ar, rv3d, CTX_wm_view3d(C), &cam_framef); cam_frame.xmin = cam_framef.xmin + ar->winrct.xmin; cam_frame.xmax = cam_framef.xmax + ar->winrct.xmin; cam_frame.ymin = cam_framef.ymin + ar->winrct.ymin; @@ -1894,6 +1892,7 @@ void fly_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CONFIRM); WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM); + WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM); WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM); WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE); @@ -2006,7 +2005,7 @@ static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *even fly->axis= 2; fly->pan_view= FALSE; fly->xlock= FALSE; - fly->zlock= TRUE; + fly->zlock= FALSE; fly->xlock_momentum=0.0f; fly->zlock_momentum=0.0f; fly->grid= 1.0f; @@ -2059,12 +2058,12 @@ static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *even if (fly->rv3d->persp==RV3D_ORTHO) fly->rv3d->persp= RV3D_PERSP; /*if ortho projection, make perspective */ QUATCOPY(fly->rot_backup, fly->rv3d->viewquat); - VECCOPY(fly->ofs_backup, fly->rv3d->ofs); - fly->rv3d->dist= 0.0; + copy_v3_v3(fly->ofs_backup, fly->rv3d->ofs); + fly->rv3d->dist= 0.0f; upvec[2]= fly->dist_backup; /*x and y are 0*/ mul_m3_v3(mat, upvec); - sub_v3_v3v3(fly->rv3d->ofs, fly->rv3d->ofs, upvec); + sub_v3_v3(fly->rv3d->ofs, upvec); /*Done with correcting for the dist*/ } @@ -2135,7 +2134,7 @@ static int flyEnd(bContext *C, FlyInfo *fly) upvec[2]= fly->dist_backup; /*x and y are 0*/ copy_m3_m4(mat, rv3d->viewinv); mul_m3_v3(mat, upvec); - add_v3_v3v3(rv3d->ofs, rv3d->ofs, upvec); + add_v3_v3(rv3d->ofs, upvec); /*Done with correcting for the dist */ } @@ -2241,12 +2240,12 @@ static void flyEvent(FlyInfo *fly, wmEvent *event) break; case FLY_MODAL_DIR_UP: - if (fly->speed < 0.0f) fly->speed= -fly->speed; + if (fly->speed > 0.0f) fly->speed= -fly->speed; fly->axis= 1; break; case FLY_MODAL_DIR_DOWN: - if (fly->speed > 0.0f) fly->speed= -fly->speed; + if (fly->speed < 0.0f) fly->speed= -fly->speed; fly->axis= 1; break; @@ -2276,8 +2275,13 @@ static void flyEvent(FlyInfo *fly, wmEvent *event) } } -static int flyApply(FlyInfo *fly) +static int flyApply(bContext *C, FlyInfo *fly) { + +#define FLY_ROTATE_FAC 2.5f /* more is faster */ +#define FLY_ZUP_CORRECT_FAC 0.1f /* ammount to correct per step */ +#define FLY_ZUP_CORRECT_ACCEL 0.05f /* increase upright momentum each step */ + /* fly mode - Shift+F a fly loop where the user can move move the view as if they are flying @@ -2393,7 +2397,7 @@ static int flyApply(FlyInfo *fly) upvec[1]=0; upvec[2]=0; mul_m3_v3(mat, upvec); - axis_angle_to_quat( tmp_quat, upvec, (float)moffset[1]*-time_redraw*20); /* Rotate about the relative up vec */ + axis_angle_to_quat( tmp_quat, upvec, (float)moffset[1] * time_redraw * -FLY_ROTATE_FAC); /* Rotate about the relative up vec */ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); if (fly->xlock) fly->xlock = 2; /*check for rotation*/ @@ -2425,7 +2429,7 @@ static int flyApply(FlyInfo *fly) mul_m3_v3(mat, upvec); } - axis_angle_to_quat( tmp_quat, upvec, (float)moffset[0]*time_redraw*20); /* Rotate about the relative up vec */ + axis_angle_to_quat( tmp_quat, upvec, (float)moffset[0] * time_redraw * FLY_ROTATE_FAC); /* Rotate about the relative up vec */ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); if (fly->xlock) fly->xlock = 2;/*check for rotation*/ @@ -2446,10 +2450,10 @@ static int flyApply(FlyInfo *fly) upvec[2]=1; mul_m3_v3(mat, upvec); - axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->zlock_momentum*0.1); /* Rotate about the relative up vec */ + axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->zlock_momentum * FLY_ZUP_CORRECT_FAC); /* Rotate about the relative up vec */ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat); - fly->zlock_momentum += 0.05f; + fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL; } else { fly->zlock=1; /* dont check until the view rotates again */ fly->zlock_momentum= 0.0f; @@ -2505,7 +2509,7 @@ static int flyApply(FlyInfo *fly) if (lock_ob->protectflag & OB_LOCK_LOCZ) dvec[2] = 0.0; } - add_v3_v3v3(rv3d->ofs, rv3d->ofs, dvec); + add_v3_v3(rv3d->ofs, dvec); /* todo, dynamic keys */ #if 0 @@ -2524,7 +2528,7 @@ static int flyApply(FlyInfo *fly) ID *id_key; /* transform the parent or the camera? */ if(fly->root_parent) { - Object *ob_update; + Object *ob_update; float view_mat[4][4]; float prev_view_imat[4][4]; @@ -2559,13 +2563,10 @@ static int flyApply(FlyInfo *fly) /* record the motion */ if (autokeyframe_cfra_can_key(scene, id_key)) { - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; - int cfra = CFRA; + ListBase dsources = {NULL, NULL}; - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= id_key; + /* add datasource override for the camera object */ + ANIM_relative_keyingset_add_source(&dsources, id_key, NULL, NULL); /* insert keyframes * 1) on the first frame @@ -2574,12 +2575,15 @@ static int flyApply(FlyInfo *fly) */ if (fly->xlock || fly->zlock || moffset[0] || moffset[1]) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation"); - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); } if (fly->speed) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location"); - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); } + + /* free temp data */ + BLI_freelistN(&dsources); } } } else @@ -2642,7 +2646,7 @@ static int fly_modal(bContext *C, wmOperator *op, wmEvent *event) flyEvent(fly, event); if(event->type==TIMER && event->customdata == fly->timer) - flyApply(fly); + flyApply(C, fly); if(fly->redraw) { ED_region_tag_redraw(CTX_wm_region(C)); @@ -2702,7 +2706,7 @@ void view3d_align_axis_to_vector(View3D *v3d, RegionView3D *rv3d, int axisidx, f VECCOPY(orig_ofs, rv3d->ofs); rv3d->persp= RV3D_PERSP; rv3d->dist= 0.0; - view_settings_from_ob(v3d->camera, rv3d->ofs, NULL, NULL, &v3d->lens); + view3d_settings_from_ob(v3d->camera, rv3d->ofs, NULL, NULL, &v3d->lens); smooth_view(NULL, NULL, NULL, orig_ofs, new_quat, &orig_dist, &orig_lens); // XXX } else { if (rv3d->persp==RV3D_CAMOB) rv3d->persp= RV3D_PERSP; /* switch out of camera mode */ diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt new file mode 100644 index 00000000000..1642648e056 --- /dev/null +++ b/source/blender/editors/transform/CMakeLists.txt @@ -0,0 +1,35 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../bmesh + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_transform "${SRC}" "${INC}") diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 5adda8d09e5..5ed8ff8c8a7 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -33,10 +33,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef WIN32 #include #else @@ -47,20 +43,9 @@ #include "DNA_anim_types.h" #include "DNA_armature_types.h" -#include "DNA_action_types.h" /* for some special action-editor settings */ #include "DNA_constraint_types.h" -#include "DNA_ipo_types.h" /* some silly ipo flag */ -#include "DNA_listBase.h" #include "DNA_meshdata_types.h" -#include "DNA_mesh_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" /* PET modes */ -#include "DNA_screen_types.h" /* area dimensions */ -#include "DNA_texture_types.h" -#include "DNA_userdef_types.h" -#include "DNA_view3d_types.h" -#include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -98,7 +83,6 @@ #include "ED_screen.h" #include "ED_space_api.h" #include "ED_markers.h" -#include "ED_util.h" #include "ED_view3d.h" #include "ED_mesh.h" @@ -112,7 +96,6 @@ #include "BLI_ghash.h" #include "BLI_linklist.h" -#include "PIL_time.h" /* sleep */ #include "UI_resources.h" @@ -219,17 +202,33 @@ void projectIntView(TransInfo *t, float *vec, int *adr) UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr+1); } - else if(ELEM3(t->spacetype, SPACE_IPO, SPACE_NLA, SPACE_ACTION)) { + else if(t->spacetype == SPACE_ACTION) { + SpaceAction *sact = t->sa->spacedata.first; int out[2] = {0, 0}; - UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1); + if (sact->flag & SACTION_DRAWTIME) { + //vec[0] = vec[0]/((t->scene->r.frs_sec / t->scene->r.frs_sec_base)); + + UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1); + } + else { + UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1); + } + + adr[0]= out[0]; + adr[1]= out[1]; + } + else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) { + int out[2] = {0, 0}; + + UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1); adr[0]= out[0]; adr[1]= out[1]; } else if(t->spacetype==SPACE_SEQ) { /* XXX not tested yet, but should work */ int out[2] = {0, 0}; - UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1); + UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], out, out+1); adr[0]= out[0]; adr[1]= out[1]; } @@ -259,9 +258,8 @@ void projectFloatView(TransInfo *t, float *vec, float *adr) void applyAspectRatio(TransInfo *t, float *vec) { - SpaceImage *sima= t->sa->spacedata.first; - if ((t->spacetype==SPACE_IMAGE) && (t->mode==TFM_TRANSLATION)) { + SpaceImage *sima= t->sa->spacedata.first; float aspx, aspy; if((sima->flag & SI_COORDFLOATS)==0) { @@ -280,9 +278,8 @@ void applyAspectRatio(TransInfo *t, float *vec) void removeAspectRatio(TransInfo *t, float *vec) { - SpaceImage *sima= t->sa->spacedata.first; - if ((t->spacetype==SPACE_IMAGE) && (t->mode==TFM_TRANSLATION)) { + SpaceImage *sima= t->sa->spacedata.first; float aspx, aspy; if((sima->flag & SI_COORDFLOATS)==0) { @@ -314,14 +311,14 @@ static void viewRedrawForce(const bContext *C, TransInfo *t) } else if (t->spacetype == SPACE_ACTION) { //SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first; - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } else if (t->spacetype == SPACE_IPO) { //SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first; - WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } else if (t->spacetype == SPACE_NLA) { - WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); + WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL); } else if(t->spacetype == SPACE_NODE) { @@ -347,7 +344,7 @@ static void viewRedrawPost(TransInfo *t) if(t->spacetype == SPACE_VIEW3D) { /* if autokeying is enabled, send notifiers that keyframes were added */ if (IS_AUTOKEY_ON(t->scene)) - WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } #if 0 // TRANSFORM_FIX_ME @@ -482,6 +479,8 @@ static void view_editmove(unsigned short event) #define TFM_MODAL_REMOVE_SNAP 17 /* 18 and 19 used by numinput, defined in transform.h * */ +#define TFM_MODAL_PROPSIZE_UP 20 +#define TFM_MODAL_PROPSIZE_DOWN 21 /* called in transform_ops.c, on each regeneration of keymaps */ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) @@ -506,6 +505,8 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) {TFM_MODAL_REMOVE_SNAP, "REMOVE_SNAP", 0, "Remove Last Snap Point", ""}, {NUM_MODAL_INCREMENT_UP, "INCREMENT_UP", 0, "Numinput Increment Up", ""}, {NUM_MODAL_INCREMENT_DOWN, "INCREMENT_DOWN", 0, "Numinput Increment Down", ""}, + {TFM_MODAL_PROPSIZE_UP, "PROPORTIONAL_SIZE_UP", 0, "Increase Proportional Influence", ""}, + {TFM_MODAL_PROPSIZE_DOWN, "PROPORTIONAL_SIZE_DOWN", 0, "Decrease Poportional Influence", ""}, {0, NULL, 0, NULL, NULL}}; wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map"); @@ -535,6 +536,11 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_add_item(keymap, UPARROWKEY, KM_PRESS, 0, 0, NUM_MODAL_INCREMENT_UP); WM_modalkeymap_add_item(keymap, DOWNARROWKEY, KM_PRESS, 0, 0, NUM_MODAL_INCREMENT_DOWN); + + WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP); + WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN); + WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP); + WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN); return keymap; } @@ -559,7 +565,7 @@ int transformEvent(TransInfo *t, wmEvent *event) t->redraw |= TREDRAW_SOFT; if (t->state == TRANS_STARTING) { - t->state = TRANS_RUNNING; + t->state = TRANS_RUNNING; } applyMouseInput(t, &t->mouse, t->mval, t->values); @@ -715,6 +721,20 @@ int transformEvent(TransInfo *t, wmEvent *event) removeSnapPoint(t); t->redraw |= TREDRAW_HARD; break; + case TFM_MODAL_PROPSIZE_UP: + if(t->flag & T_PROP_EDIT) { + t->prop_size*= 1.1f; + calculatePropRatio(t); + } + t->redraw |= TREDRAW_HARD; + break; + case TFM_MODAL_PROPSIZE_DOWN: + if (t->flag & T_PROP_EDIT) { + t->prop_size*= 0.90909090f; + calculatePropRatio(t); + } + t->redraw |= TREDRAW_HARD; + break; default: handled = 0; break; @@ -939,10 +959,6 @@ int transformEvent(TransInfo *t, wmEvent *event) if (t->flag & T_AUTOIK) { transform_autoik_update(t, 1); } - else if(t->flag & T_PROP_EDIT) { - t->prop_size*= 1.1f; - calculatePropRatio(t); - } else view_editmove(event->type); t->redraw= 1; break; @@ -958,10 +974,6 @@ int transformEvent(TransInfo *t, wmEvent *event) if (t->flag & T_AUTOIK) { transform_autoik_update(t, -1); } - else if (t->flag & T_PROP_EDIT) { - t->prop_size*= 0.90909090f; - calculatePropRatio(t); - } else view_editmove(event->type); t->redraw= 1; break; @@ -1045,10 +1057,13 @@ int transformEvent(TransInfo *t, wmEvent *event) } /* confirm transform if launch key is released after mouse move */ - /* XXX Keyrepeat bug in Xorg fucks this up, will test when fixed */ - if (event->type == LEFTMOUSE /*t->launch_event*/ && t->state != TRANS_STARTING) + if (t->flag & T_RELEASE_CONFIRM) { - t->state = TRANS_CONFIRM; + /* XXX Keyrepeat bug in Xorg fucks this up, will test when fixed */ + if (event->type == t->launch_event && (t->launch_event == LEFTMOUSE || t->launch_event == RIGHTMOUSE)) + { + t->state = TRANS_CONFIRM; + } } } @@ -1456,6 +1471,22 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int t->launch_event = event ? event->type : -1; + if (t->launch_event == EVT_TWEAK_R) + { + t->launch_event = RIGHTMOUSE; + } + else if (t->launch_event == EVT_TWEAK_L) + { + t->launch_event = LEFTMOUSE; + } + + // XXX Remove this when wm_operator_call_internal doesn't use window->eventstate (which can have type = 0) + // For manipulator only, so assume LEFTMOUSE + if (t->launch_event == 0) + { + t->launch_event = LEFTMOUSE; + } + if (!initTransInfo(C, t, op, event)) // internal data, mouse, vectors { return 0; @@ -1486,6 +1517,28 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int return 0; } + /* Stupid code to have Ctrl-Click on manipulator work ok */ + if(event) + { + wmKeyMap *keymap = WM_keymap_active(CTX_wm_manager(C), op->type->modalkeymap); + wmKeyMapItem *kmi; + + for (kmi = keymap->items.first; kmi; kmi = kmi->next) + { + if (kmi->propvalue == TFM_MODAL_SNAP_INV_ON && kmi->val == KM_PRESS) + { + if ((ELEM(kmi->type, LEFTCTRLKEY, RIGHTCTRLKEY) && event->ctrl) || + (ELEM(kmi->type, LEFTSHIFTKEY, RIGHTSHIFTKEY) && event->shift) || + (ELEM(kmi->type, LEFTALTKEY, RIGHTALTKEY) && event->alt) || + (kmi->type == COMMANDKEY && event->oskey)) { + t->modifiers |= MOD_SNAP_INVERT; + } + break; + } + } + + } + initSnapping(t, op); // Initialize snapping data AFTER mode flags /* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */ @@ -1897,39 +1950,50 @@ static void constraintTransLim(TransInfo *t, TransData *td) } } +static void constraintob_from_transdata(bConstraintOb *cob, TransData *td) +{ + /* Make a temporary bConstraintOb for use by limit constraints + * - they only care that cob->matrix is correctly set ;-) + * - current space should be local + */ + memset(cob, 0, sizeof(bConstraintOb)); + if (td->rotOrder == ROT_MODE_QUAT) { + /* quats */ + if (td->ext) { + /* objects and bones do normalization first too, otherwise + we don't necessarily end up with a rotation matrix, and + then conversion back to quat gives a different result */ + float quat[4]; + copy_qt_qt(quat, td->ext->quat); + normalize_qt(quat); + quat_to_mat4(cob->matrix, quat); + } + else + return; + } + else if (td->rotOrder == ROT_MODE_AXISANGLE) { + /* axis angle */ + if (td->ext) + axis_angle_to_mat4(cob->matrix, &td->ext->quat[1], td->ext->quat[0]); + else + return; + } + else { + /* eulers */ + if (td->ext) + eulO_to_mat4(cob->matrix, td->ext->rot, td->rotOrder); + else + return; + } +} + static void constraintRotLim(TransInfo *t, TransData *td) { if (td->con) { bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_ROTLIMIT); bConstraintOb cob; bConstraint *con; - - /* Make a temporary bConstraintOb for using these limit constraints - * - they only care that cob->matrix is correctly set ;-) - * - current space should be local - */ - memset(&cob, 0, sizeof(bConstraintOb)); - if (td->rotOrder == ROT_MODE_QUAT) { - /* quats */ - if (td->ext) - quat_to_mat4( cob.matrix,td->ext->quat); - else - return; - } - else if (td->rotOrder == ROT_MODE_AXISANGLE) { - /* axis angle */ - if (td->ext) - axis_angle_to_mat4( cob.matrix,&td->ext->quat[1], td->ext->quat[0]); - else - return; - } - else { - /* eulers */ - if (td->ext) - eulO_to_mat4( cob.matrix,td->ext->rot, td->rotOrder); - else - return; - } + int dolimit = 0; /* Evaluate valid constraints */ for (con= td->con; con; con= con->next) { @@ -1945,6 +2009,16 @@ static void constraintRotLim(TransInfo *t, TransData *td) /* only use it if it's tagged for this purpose */ if ((data->flag2 & LIMIT_TRANSFORM)==0) continue; + + /* skip incompatable spacetypes */ + if (!ELEM(con->ownspace, CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL)) + continue; + + /* only do conversion if necessary, to preserve quats and eulers */ + if(!dolimit) { + constraintob_from_transdata(&cob, td); + dolimit= 1; + } /* do space conversions */ if (con->ownspace == CONSTRAINT_SPACE_WORLD) { @@ -1952,10 +2026,6 @@ static void constraintRotLim(TransInfo *t, TransData *td) copy_m4_m4(tmat, cob.matrix); mul_m4_m3m4(cob.matrix, td->mtx, tmat); } - else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) { - /* skip... incompatable spacetype */ - continue; - } /* do constraint */ cti->evaluate_constraint(con, &cob, NULL); @@ -1969,18 +2039,20 @@ static void constraintRotLim(TransInfo *t, TransData *td) } } - /* copy results from cob->matrix */ - if (td->rotOrder == ROT_MODE_QUAT) { - /* quats */ - mat4_to_quat( td->ext->quat,cob.matrix); - } - else if (td->rotOrder == ROT_MODE_AXISANGLE) { - /* axis angle */ - mat4_to_axis_angle( &td->ext->quat[1], &td->ext->quat[0],cob.matrix); - } - else { - /* eulers */ - mat4_to_eulO( td->ext->rot, td->rotOrder,cob.matrix); + if(dolimit) { + /* copy results from cob->matrix */ + if (td->rotOrder == ROT_MODE_QUAT) { + /* quats */ + mat4_to_quat( td->ext->quat,cob.matrix); + } + else if (td->rotOrder == ROT_MODE_AXISANGLE) { + /* axis angle */ + mat4_to_axis_angle( &td->ext->quat[1], &td->ext->quat[0],cob.matrix); + } + else { + /* eulers */ + mat4_to_eulO( td->ext->rot, td->rotOrder,cob.matrix); + } } } } @@ -2064,6 +2136,16 @@ static void constraintSizeLim(TransInfo *t, TransData *td) /* ************************** WARP *************************** */ +void postInputWarp(TransInfo *t, float values[3]) +{ + mul_v3_fl(values, (float)(M_PI * 2)); + + if (t->customData) /* non-null value indicates reversed input */ + { + negate_v3(values); + } +} + void initWarp(TransInfo *t) { float max[3], min[3]; @@ -2073,13 +2155,14 @@ void initWarp(TransInfo *t) t->transform = Warp; t->handleEvent = handleEventWarp; + setInputPostFct(&t->mouse, postInputWarp); initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO); t->idx_max = 0; t->num.idx_max = 0; t->snap[0] = 0.0f; - t->snap[1] = 5.0f; - t->snap[2] = 1.0f; + t->snap[1] = 5.0f / 180 * M_PI; + t->snap[2] = 1.0f / 180 * M_PI; t->num.increment = 1.0f; @@ -2091,7 +2174,7 @@ void initWarp(TransInfo *t) VECCOPY(center, t->data[i].center); mul_m3_v3(t->data[i].mtx, center); mul_m4_v3(t->viewmat, center); - sub_v3_v3v3(center, center, t->viewmat[3]); + sub_v3_v3(center, t->viewmat[3]); if (i) minmax_v3_v3v3(min, max, center); else { @@ -2147,20 +2230,15 @@ int Warp(TransInfo *t, short mval[2]) VECCOPY(cursor, curs); VECCOPY(gcursor, cursor); if (t->flag & T_EDIT) { - sub_v3_v3v3(cursor, cursor, t->obedit->obmat[3]); - sub_v3_v3v3(gcursor, gcursor, t->obedit->obmat[3]); + sub_v3_v3(cursor, t->obedit->obmat[3]); + sub_v3_v3(gcursor, t->obedit->obmat[3]); mul_m3_v3(t->data->smtx, gcursor); } mul_m4_v3(t->viewmat, cursor); - sub_v3_v3v3(cursor, cursor, t->viewmat[3]); + sub_v3_v3(cursor, t->viewmat[3]); - /* amount of degrees for warp */ - circumfac = 360.0f * t->values[0]; - - if (t->customData) /* non-null value indicates reversed input */ - { - circumfac *= -1; - } + /* amount of radians for warp */ + circumfac = t->values[0]; snapGrid(t, &circumfac); applyNumInput(&t->num, &circumfac); @@ -2172,13 +2250,17 @@ int Warp(TransInfo *t, short mval[2]) outputNumInput(&(t->num), c); sprintf(str, "Warp: %s", c); + + circumfac = circumfac / 180 * M_PI; } else { /* default header print */ - sprintf(str, "Warp: %.3f", circumfac); + sprintf(str, "Warp: %.3f", circumfac * 180 / M_PI); } - circumfac*= (float)(-M_PI/360.0); + t->values[0] = circumfac; + + circumfac /= 2; /* only need 180 on each side to make 360 */ for(i = 0; i < t->total; i++, td++) { float loc[3]; @@ -2192,7 +2274,7 @@ int Warp(TransInfo *t, short mval[2]) VECCOPY(vec, td->iloc); mul_m3_v3(td->mtx, vec); mul_m4_v3(t->viewmat, vec); - sub_v3_v3v3(vec, vec, t->viewmat[3]); + sub_v3_v3(vec, t->viewmat[3]); dist= vec[0]-cursor[0]; @@ -2208,10 +2290,10 @@ int Warp(TransInfo *t, short mval[2]) loc[2]= vec[2]; mul_m4_v3(t->viewinv, loc); - sub_v3_v3v3(loc, loc, t->viewinv[3]); + sub_v3_v3(loc, t->viewinv[3]); mul_m3_v3(td->smtx, loc); - sub_v3_v3v3(loc, loc, td->iloc); + sub_v3_v3(loc, td->iloc); mul_v3_fl(loc, td->factor); add_v3_v3v3(td->loc, td->iloc, loc); } @@ -2225,12 +2307,18 @@ int Warp(TransInfo *t, short mval[2]) /* ************************** SHEAR *************************** */ +void postInputShear(TransInfo *t, float values[3]) +{ + mul_v3_fl(values, 0.05f); +} + void initShear(TransInfo *t) { t->mode = TFM_SHEAR; t->transform = Shear; t->handleEvent = handleEventShear; + setInputPostFct(&t->mouse, postInputShear); initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE); t->idx_max = 0; @@ -2281,7 +2369,7 @@ int Shear(TransInfo *t, short mval[2]) copy_m3_m4(persmat, t->viewmat); invert_m3_m3(persinv, persmat); - value = 0.05f * t->values[0]; + value = t->values[0]; snapGrid(t, &value); @@ -2330,8 +2418,8 @@ int Shear(TransInfo *t, short mval[2]) mul_m3_v3(tmat, vec); - add_v3_v3v3(vec, vec, t->center); - sub_v3_v3v3(vec, vec, td->center); + add_v3_v3(vec, t->center); + sub_v3_v3(vec, td->center); mul_v3_fl(vec, td->factor); @@ -2482,16 +2570,16 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) { if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't resize objects itself if((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)){ /* scale val and reset size */ - *td->val = td->ival * (1 + (fsize[0] - 1) * td->factor); + *td->val = td->ival * (1 + (fsize[0] - 1) * td->factor); td->ext->size[0] = td->ext->isize[0]; td->ext->size[1] = td->ext->isize[1]; td->ext->size[2] = td->ext->isize[2]; - } + } else { /* Reset val if SINGLESIZE but using a constraint */ if (td->flag & TD_SINGLESIZE) - *td->val = td->ival; + *td->val = td->ival; td->ext->size[0] = td->ext->isize[0] * (1 + (fsize[0] - 1) * td->factor); td->ext->size[1] = td->ext->isize[1] * (1 + (fsize[1] - 1) * td->factor); @@ -2510,11 +2598,11 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) { mul_m3_v3(tmat, vec); - add_v3_v3v3(vec, vec, center); + add_v3_v3(vec, center); if (t->flag & T_POINTS) - sub_v3_v3v3(vec, vec, td->iloc); + sub_v3_v3(vec, td->iloc); else - sub_v3_v3v3(vec, vec, td->center); + sub_v3_v3(vec, td->center); mul_v3_fl(vec, td->factor); @@ -2652,6 +2740,8 @@ int ToSphere(TransInfo *t, short mval[2]) else if (ratio > 1) ratio = 1.0f; + t->values[0] = ratio; + /* header print for NumInput */ if (hasNumInput(&t->num)) { char c[20]; @@ -2696,11 +2786,19 @@ int ToSphere(TransInfo *t, short mval[2]) /* ************************** ROTATION *************************** */ +void postInputRotation(TransInfo *t, float values[3]) +{ + if ((t->con.mode & CON_APPLY) && t->con.applyRot) { + t->con.applyRot(t, NULL, t->axis, values); + } +} + void initRotation(TransInfo *t) { t->mode = TFM_ROTATION; t->transform = Rotation; + setInputPostFct(&t->mouse, postInputRotation); initMouseInputMode(t, &t->mouse, INPUT_ANGLE); t->ndof.axis = 16; @@ -2792,7 +2890,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short mul_m3_v3(mat, vec); // Applying rotation mul_m3_v3(imtx, vec); // To Local space - add_v3_v3v3(vec, vec, center); + add_v3_v3(vec, center); /* vec now is the location where the object has to be */ sub_v3_v3v3(vec, vec, td->center); // Translation needed from the initial location @@ -2864,9 +2962,9 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short /* translation */ sub_v3_v3v3(vec, td->center, center); mul_m3_v3(mat, vec); - add_v3_v3v3(vec, vec, center); + add_v3_v3(vec, center); /* vec now is the location where the object has to be */ - sub_v3_v3v3(vec, vec, td->center); + sub_v3_v3(vec, td->center); mul_m3_v3(td->smtx, vec); protectedTransBits(td->protectflag, vec); @@ -2880,7 +2978,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short /* rotation */ if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself /* euler or quaternion? */ - if ((td->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) { + if ((td->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) { mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0); mat3_to_quat( quat,fmat); // Actual transform @@ -2973,7 +3071,7 @@ int Rotation(TransInfo *t, short mval[2]) snapGrid(t, &final); if ((t->con.mode & CON_APPLY) && t->con.applyRot) { - t->con.applyRot(t, NULL, t->axis, &final); + t->con.applyRot(t, NULL, t->axis, NULL); } else { /* reset axis if constraint is not set */ negate_v3_v3(t->axis, t->viewinv[2]); @@ -3004,12 +3102,10 @@ int Rotation(TransInfo *t, short mval[2]) sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext); } + t->values[0] = final; + vec_rot_to_mat3( mat, t->axis, final); - // TRANSFORM_FIX_ME -// t->values[0] = final; // used in manipulator -// copy_m3_m3(t->mat, mat); // used in manipulator - applyRotation(t, final, t->axis); recalcData(t); @@ -3620,7 +3716,7 @@ int PushPull(TransInfo *t, short mval[2]) if (isLockConstraint(t)) { float dvec[3]; project_v3_v3v3(dvec, vec, axis); - sub_v3_v3v3(vec, vec, dvec); + sub_v3_v3(vec, dvec); } else { project_v3_v3v3(vec, vec, axis); @@ -3772,7 +3868,7 @@ void initBevelWeight(TransInfo *t) t->num.increment = t->snap[1]; - t->flag |= T_NO_CONSTRAINT; + t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } int BevelWeight(TransInfo *t, short mval[2]) @@ -3845,7 +3941,7 @@ void initCrease(TransInfo *t) t->num.increment = t->snap[1]; - t->flag |= T_NO_CONSTRAINT; + t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } int Crease(TransInfo *t, short mval[2]) @@ -4526,7 +4622,7 @@ static int createSlideVerts(TransInfo *t) // populate the SlideVerts - vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "createSlideVerts gh"); look = vertlist; while(look) { i=0; @@ -4680,7 +4776,7 @@ static int createSlideVerts(TransInfo *t) sub_v3_v3v3(vec, co2, co); } - add_v3_v3v3(start, start, vec); + add_v3_v3(start, vec); if (v3d) { view3d_project_float(t->ar, tempsv->down->v1->co, co, projectMat); @@ -4693,7 +4789,7 @@ static int createSlideVerts(TransInfo *t) sub_v3_v3v3(vec, co, co2); } - add_v3_v3v3(end, end, vec); + add_v3_v3(end, vec); totvec += 1.0f; nearest = (EditVert*)look->link; @@ -4705,7 +4801,7 @@ static int createSlideVerts(TransInfo *t) look = look->next; } - add_v3_v3v3(start, start, end); + add_v3_v3(start, end); mul_v3_fl(start, 0.5*(1.0/totvec)); VECCOPY(vec, start); start[0] = t->mval[0]; @@ -4727,7 +4823,7 @@ static int createSlideVerts(TransInfo *t) for (uvlay_idx=0; uvlay_idxverts.first;ev;ev=ev->next) { ev->tmp.l = 0; @@ -4886,7 +4982,7 @@ void initEdgeSlide(TransInfo *t) t->num.increment = t->snap[1]; - t->flag |= T_NO_CONSTRAINT; + t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } int doEdgeSlide(TransInfo *t, float perc) @@ -5507,27 +5603,27 @@ static short getAnimEdit_DrawTime(TransInfo *t) /* This function is used by Animation Editor specific transform functions to do * the Snap Keyframe to Nearest Frame/Marker */ -static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, AnimData *adt, short autosnap) +static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, AnimData *adt, short autosnap) { /* snap key to nearest frame? */ if (autosnap == SACTSNAP_FRAME) { const Scene *scene= t->scene; - const short doTime= getAnimEdit_DrawTime(t); + const short doTime= 0; //XXX doesn't work - getAnimEdit_DrawTime(t); const double secf= FPS; double val; - + /* convert frame to nla-action time (if needed) */ if (adt) val= BKE_nla_tweakedit_remap(adt, *(td->val), NLATIME_CONVERT_MAP); else val= *(td->val); - + /* do the snapping to nearest frame/second */ if (doTime) val= (float)( floor((val/secf) + 0.5f) * secf ); else val= (float)( floor(val+0.5f) ); - + /* convert frame out of nla-action time */ if (adt) *(td->val)= BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_UNMAP); @@ -5537,23 +5633,34 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, AnimData *adt, sho /* snap key to nearest marker? */ else if (autosnap == SACTSNAP_MARKER) { float val; - + /* convert frame to nla-action time (if needed) */ if (adt) val= BKE_nla_tweakedit_remap(adt, *(td->val), NLATIME_CONVERT_MAP); else val= *(td->val); - + /* snap to nearest marker */ // TODO: need some more careful checks for where data comes from val= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, val); - + /* convert frame out of nla-action time */ if (adt) *(td->val)= BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_UNMAP); else *(td->val)= val; } + + /* if the handles are to be moved too (as side-effect of keyframes moving, to keep the general effect) + * offset them by the same amount so that the general angles are maintained (i.e. won't change while + * handles are free-to-roam and keyframes are snap-locked) + */ + if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) { + td2d->h1[0] = td2d->ih1[0] + *td->val - td->ival; + } + if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) { + td2d->h2[0] = td2d->ih2[0] + *td->val - td->ival; + } } /* ----------------- Translation ----------------------- */ @@ -5616,6 +5723,7 @@ static void headerTimeTranslate(TransInfo *t, char *str) static void applyTimeTranslate(TransInfo *t, float sval) { TransData *td = t->data; + TransData2D *td2d = t->data2d; Scene *scene = t->scene; int i; @@ -5624,16 +5732,18 @@ static void applyTimeTranslate(TransInfo *t, float sval) const short autosnap= getAnimEdit_SnapMode(t); - float deltax, val; + float deltax, val, valprev; /* it doesn't matter whether we apply to t->data or t->data2d, but t->data2d is more convenient */ - for (i = 0 ; i < t->total; i++, td++) { + for (i = 0 ; i < t->total; i++, td++, td2d++) { /* it is assumed that td->extra is a pointer to the AnimData, * whose active action is where this keyframe comes from * (this is only valid when not in NLA) */ AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL; + valprev = *td->val; + /* check if any need to apply nla-mapping */ if (adt && t->spacetype != SPACE_SEQ) { deltax = t->values[0]; @@ -5663,7 +5773,7 @@ static void applyTimeTranslate(TransInfo *t, float sval) } /* apply nearest snapping */ - doAnimEdit_SnapFrame(t, td, adt, autosnap); + doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap); } } @@ -5807,6 +5917,7 @@ int TimeSlide(TransInfo *t, short mval[2]) UI_view2d_region_to_view(v2d, t->imval[0], t->imval[0], &sval[0], &sval[1]); /* t->values[0] stores cval[0], which is the current mouse-pointer location (in frames) */ + // XXX Need to be able to repeat this t->values[0] = cval[0]; /* handle numeric-input stuff */ @@ -5873,6 +5984,7 @@ static void headerTimeScale(TransInfo *t, char *str) { static void applyTimeScale(TransInfo *t) { Scene *scene = t->scene; TransData *td = t->data; + TransData2D *td2d = t->data2d; int i; const short autosnap= getAnimEdit_SnapMode(t); @@ -5880,7 +5992,7 @@ static void applyTimeScale(TransInfo *t) { const double secf= FPS; - for (i = 0 ; i < t->total; i++, td++) { + for (i = 0 ; i < t->total; i++, td++, td2d++) { /* it is assumed that td->extra is a pointer to the AnimData, * whose active action is where this keyframe comes from * (this is only valid when not in NLA) @@ -5906,7 +6018,7 @@ static void applyTimeScale(TransInfo *t) { *(td->val) += startx; /* apply nearest snapping */ - doAnimEdit_SnapFrame(t, td, adt, autosnap); + doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap); } } @@ -5941,11 +6053,11 @@ void BIF_TransformSetUndo(char *str) void NDofTransform() { #if 0 // TRANSFORM_FIX_ME - float fval[7]; - float maxval = 50.0f; // also serves as threshold - int axis = -1; - int mode = 0; - int i; + float fval[7]; + float maxval = 50.0f; // also serves as threshold + int axis = -1; + int mode = 0; + int i; getndof(fval); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 7bf0a99103c..487609e0ad8 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -109,25 +109,25 @@ typedef struct TransSnap { typedef struct TransCon { short orientation; /**/ - char text[50]; /* Description of the Constraint for header_print */ - float mtx[3][3]; /* Matrix of the Constraint space */ - float imtx[3][3]; /* Inverse Matrix of the Constraint space */ - float pmtx[3][3]; /* Projection Constraint Matrix (same as imtx with some axis == 0) */ - float center[3]; /* transformation center to define where to draw the view widget - ALWAYS in global space. Unlike the transformation center */ + char text[50]; /* Description of the Constraint for header_print */ + float mtx[3][3]; /* Matrix of the Constraint space */ + float imtx[3][3]; /* Inverse Matrix of the Constraint space */ + float pmtx[3][3]; /* Projection Constraint Matrix (same as imtx with some axis == 0) */ + float center[3]; /* transformation center to define where to draw the view widget + ALWAYS in global space. Unlike the transformation center */ short imval[2]; /* initial mouse value for visual calculation */ - /* the one in TransInfo is not garanty to stay the same (Rotates change it) */ - int mode; /* Mode flags of the Constraint */ + /* the one in TransInfo is not garanty to stay the same (Rotates change it) */ + int mode; /* Mode flags of the Constraint */ void (*drawExtra)(struct TransInfo *); /* For constraints that needs to draw differently from the other uses this instead of the generic draw function */ - void (*applyVec)(struct TransInfo *, struct TransData *, float *, float *, float *); - /* Apply function pointer for linear vectorial transformation */ - /* The last three parameters are pointers to the in/out/printable vectors */ - void (*applySize)(struct TransInfo *, struct TransData *, float [3][3]); - /* Apply function pointer for size transformation */ - void (*applyRot)(struct TransInfo *, struct TransData *, float [3], float *); - /* Apply function pointer for rotation transformation */ + void (*applyVec)(struct TransInfo *, struct TransData *, float *, float *, float *); + /* Apply function pointer for linear vectorial transformation */ + /* The last three parameters are pointers to the in/out/printable vectors */ + void (*applySize)(struct TransInfo *, struct TransData *, float [3][3]); + /* Apply function pointer for size transformation */ + void (*applyRot)(struct TransInfo *, struct TransData *, float [3], float *); + /* Apply function pointer for rotation transformation */ } TransCon; typedef struct TransDataExtension { @@ -136,22 +136,25 @@ typedef struct TransDataExtension { float drotAxis[3]; /* Initial object drotAxis */ float dquat[4]; /* Initial object dquat */ float dsize[3]; /* Initial object dsize */ - float *rot; /* Rotation of the data to transform (Faculative) */ - float irot[3]; /* Initial rotation */ - float *quat; /* Rotation quaternion of the data to transform (Faculative) */ - float iquat[4]; /* Initial rotation quaternion */ + float *rot; /* Rotation of the data to transform (Faculative) */ + float irot[3]; /* Initial rotation */ + float *quat; /* Rotation quaternion of the data to transform (Faculative) */ + float iquat[4]; /* Initial rotation quaternion */ float *rotAngle; /* Rotation angle of the data to transform (Faculative) */ float irotAngle; /* Initial rotation angle */ float *rotAxis; /* Rotation axis of the data to transform (Faculative) */ float irotAxis[4]; /* Initial rotation axis */ - float *size; /* Size of the data to transform (Faculative) */ - float isize[3]; /* Initial size */ + float *size; /* Size of the data to transform (Faculative) */ + float isize[3]; /* Initial size */ float obmat[4][4]; /* Object matrix */ } TransDataExtension; typedef struct TransData2D { float loc[3]; /* Location of data used to transform (x,y,0) */ float *loc2d; /* Pointer to real 2d location of data */ + + float *h1, *h2; /* Pointer to handle locations, if handles aren't being moved independantly*/ + float ih1[2], ih2[2]; } TransData2D; /* we need to store 2 handles for each transdata incase the other handle wasnt selected */ @@ -225,28 +228,29 @@ typedef struct TransData { float dist; /* Distance needed to affect element (for Proportionnal Editing) */ float rdist; /* Distance to the nearest element (for Proportionnal Editing) */ float factor; /* Factor of the transformation (for Proportionnal Editing) */ - float *loc; /* Location of the data to transform */ - float iloc[3]; /* Initial location */ + float *loc; /* Location of the data to transform */ + float iloc[3]; /* Initial location */ float *val; /* Value pointer for special transforms */ float ival; /* Old value*/ - float center[3]; /* Individual data center */ - float mtx[3][3]; /* Transformation matrix from data space to global space */ - float smtx[3][3]; /* Transformation matrix from global space to data space */ + float center[3]; /* Individual data center */ + float mtx[3][3]; /* Transformation matrix from data space to global space */ + float smtx[3][3]; /* Transformation matrix from global space to data space */ float axismtx[3][3];/* Axis orientation matrix of the data */ struct Object *ob; struct bConstraint *con; /* for objects/bones, the first constraint in its constraint stack */ TransDataExtension *ext; /* for objects, poses. 1 single malloc per TransInfo! */ TransDataCurveHandleFlags *hdata; /* for curves, stores handle flags for modification/cancel */ void *extra; /* extra data (mirrored element pointer, in editmode mesh to EditVert) (editbone for roll fixing) (...) */ - int flag; /* Various flags */ + int flag; /* Various flags */ short protectflag; /* If set, copy of Object or PoseChannel protection */ int rotOrder; /* rotation mode, as defined in eRotationModes (DNA_action_types.h) */ } TransData; typedef struct MouseInput { void (*apply)(struct TransInfo *, struct MouseInput *, short [2], float [3]); + void (*post)(struct TransInfo *, float [3]); - short imval[2]; /* initial mouse position */ + short imval[2]; /* initial mouse position */ char precision; short precision_mval[2]; /* mouse position when precision key was pressed */ int center[2]; @@ -255,32 +259,32 @@ typedef struct MouseInput { } MouseInput; typedef struct TransInfo { - int mode; /* current mode */ - int flag; /* generic flags for special behaviors */ - int modifiers; /* special modifiers, by function, not key */ + int mode; /* current mode */ + int flag; /* generic flags for special behaviors */ + int modifiers; /* special modifiers, by function, not key */ short state; /* current state (running, canceled,...)*/ - int options; /* current context/options for transform */ - float val; /* init value for some transformations (and rotation angle) */ - float fac; /* factor for distance based transform */ - int (*transform)(struct TransInfo *, short *); - /* transform function pointer */ + int options; /* current context/options for transform */ + float val; /* init value for some transformations (and rotation angle) */ + float fac; /* factor for distance based transform */ + int (*transform)(struct TransInfo *, short *); + /* transform function pointer */ int (*handleEvent)(struct TransInfo *, struct wmEvent *); /* event handler function pointer RETURN 1 if redraw is needed */ - int total; /* total number of transformed data */ - TransData *data; /* transformed data (array) */ + int total; /* total number of transformed data */ + TransData *data; /* transformed data (array) */ TransDataExtension *ext; /* transformed data extension (array) */ TransData2D *data2d; /* transformed data for 2d (array) */ - TransCon con; /* transformed constraint */ - TransSnap tsnap; - NumInput num; /* numerical input */ - NDofInput ndof; /* ndof input */ - MouseInput mouse; /* mouse input */ - char redraw; /* redraw flag */ + TransCon con; /* transformed constraint */ + TransSnap tsnap; + NumInput num; /* numerical input */ + NDofInput ndof; /* ndof input */ + MouseInput mouse; /* mouse input */ + char redraw; /* redraw flag */ float prop_size; /* proportional circle radius */ char proptext[20]; /* proportional falloff text */ - float center[3]; /* center of transformation */ - int center2d[2]; /* center in screen coordinates */ - short imval[2]; /* initial mouse position */ + float center[3]; /* center of transformation */ + int center2d[2]; /* center in screen coordinates */ + short imval[2]; /* initial mouse position */ short event_type; /* event->type used to invoke transform */ short idx_max; /* maximum index on the input vector */ float snap[3]; /* Snapping Gears */ @@ -327,12 +331,12 @@ typedef struct TransInfo { struct Scene *scene; struct ToolSettings *settings; struct wmTimer *animtimer; - short mval[2]; /* current mouse position */ - struct Object *obedit; - void *draw_handle_apply; - void *draw_handle_view; - void *draw_handle_pixel; - void *draw_handle_cursor; + short mval[2]; /* current mouse position */ + struct Object *obedit; + void *draw_handle_apply; + void *draw_handle_view; + void *draw_handle_pixel; + void *draw_handle_cursor; } TransInfo; @@ -359,7 +363,7 @@ typedef struct TransInfo { #define T_POSE (1 << 2) #define T_TEXTURE (1 << 3) #define T_CAMERA (1 << 4) - // trans on points, having no rotation/scale + // trans on points, having no rotation/scale #define T_POINTS (1 << 6) // for manipulator exceptions, like scaling using center point, drawing help lines #define T_USES_MANIPULATOR (1 << 7) @@ -389,6 +393,11 @@ typedef struct TransInfo { /* to specificy if we save back settings at the end */ #define T_MODAL (1 << 21) + /* no retopo */ +#define T_NO_PROJECT (1 << 22) + +#define T_RELEASE_CONFIRM (1 << 23) + /* TransInfo->modifiers */ #define MOD_CONSTRAINT_SELECT 0x01 #define MOD_PRECISION 0x02 @@ -432,6 +441,8 @@ typedef struct TransInfo { #define TD_NOTIMESNAP (1 << 14) /* for Graph Editor autosnap, indicates that point should not undergo autosnapping */ #define TD_INTVALUES (1 << 15) /* for Graph Editor - curves that can only have int-values need their keyframes tagged with this */ #define TD_MIRROR_EDGE (1 << 16) /* For editmode mirror, clamp to x = 0 */ +#define TD_MOVEHANDLE1 (1 << 17) /* For fcurve handles, move them along with their keyframes */ +#define TD_MOVEHANDLE2 (1 << 18) /* transsnap->status */ #define SNAP_FORCED 1 @@ -643,6 +654,7 @@ int handleMouseInput(struct TransInfo *t, struct MouseInput *mi, struct wmEvent void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, short mval[2], float output[3]); void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2]); +void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *, float [3])); /*********************** Generics ********************************/ diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index cf470426d72..9169d0a87bb 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -32,10 +32,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef WIN32 #include #else @@ -44,19 +40,6 @@ #include "MEM_guardedalloc.h" -#include "DNA_action_types.h" -#include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_effect_types.h" -#include "DNA_image_types.h" -#include "DNA_ipo_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" -#include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_meta_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -79,7 +62,6 @@ // //#include "mydevice.h" -#include "WM_types.h" #include "UI_resources.h" @@ -542,6 +524,7 @@ void setLocalConstraint(TransInfo *t, int mode, const char text[]) { if (t->flag & T_EDIT) { float obmat[3][3]; copy_m3_m4(obmat, t->scene->obedit->obmat); + normalize_m3(obmat); setConstraint(t, obmat, mode, text); } else { @@ -638,7 +621,7 @@ void drawConstraint(const struct bContext *C, TransInfo *t) float vec[3]; char col2[3] = {255,255,255}; convertViewVec(t, vec, (short)(t->mval[0] - t->con.imval[0]), (short)(t->mval[1] - t->con.imval[1])); - add_v3_v3v3(vec, vec, tc->center); + add_v3_v3(vec, tc->center); drawLine(t, tc->center, tc->mtx[0], 'x', 0); drawLine(t, tc->center, tc->mtx[1], 'y', 0); @@ -870,14 +853,14 @@ static void setNearestAxis3d(TransInfo *t) mul_v3_fl(axis, zfac); /* now we can project to get window coordinate */ - add_v3_v3v3(axis, axis, t->con.center); + add_v3_v3(axis, t->con.center); projectIntView(t, axis, icoord); axis[0] = (float)(icoord[0] - t->center2d[0]); axis[1] = (float)(icoord[1] - t->center2d[1]); axis[2] = 0.0f; - if (normalize_v3(axis) != 0.0f) { + if (normalize_v3(axis) != 0.0f) { project_v3_v3v3(proj, mvec, axis); sub_v3_v3v3(axis, mvec, proj); len[i] = normalize_v3(axis); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index f47a2414a24..1e207bb5376 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -38,38 +38,17 @@ #include "MEM_guardedalloc.h" #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_camera_types.h" -#include "DNA_curve_types.h" -#include "DNA_effect_types.h" -#include "DNA_image_types.h" -#include "DNA_key_types.h" -#include "DNA_lamp_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_meta_types.h" -#include "DNA_modifier_types.h" -#include "DNA_nla_types.h" #include "DNA_node_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_particle_types.h" -#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" #include "DNA_sequence_types.h" -#include "DNA_texture_types.h" #include "DNA_view3d_types.h" -#include "DNA_world_types.h" -#include "DNA_userdef_types.h" -#include "DNA_property_types.h" -#include "DNA_vfont_types.h" #include "DNA_constraint_types.h" -#include "DNA_listBase.h" -#include "DNA_gpencil_types.h" +#include "BKE_anim.h" #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_blender.h" @@ -101,21 +80,9 @@ #include "BKE_context.h" #include "BKE_report.h" #include "BKE_tessmesh.h" +#include "BKE_scene.h" -//#include "BIF_editview.h" -//#include "BIF_editlattice.h" -//#include "BIF_editconstraint.h" -//#include "BIF_editmesh.h" -//#include "BIF_editsima.h" -//#include "BIF_editparticle.h" #include "BIF_gl.h" -//#include "BIF_poseobject.h" -//#include "BIF_meshtools.h" -//#include "BIF_mywindow.h" -//#include "BIF_resources.h" -//#include "BIF_screen.h" -//#include "BIF_space.h" -//#include "BIF_toolbox.h" #include "ED_anim_api.h" #include "ED_armature.h" @@ -128,24 +95,15 @@ #include "ED_mesh.h" #include "ED_types.h" #include "ED_uvedit.h" -#include "ED_view3d.h" #include "UI_view2d.h" -//#include "BSE_edit.h" -//#include "BDR_editobject.h" // reset_slowparents() -//#include "BDR_gpencil.h" - #include "BLI_math.h" #include "BLI_blenlib.h" #include "BLI_editVert.h" #include "BLI_array.h" -//#include "editmesh.h" -// -//#include "blendef.h" -// -//#include "mydevice.h" +#include "RNA_access.h" extern ListBase editelems; @@ -291,7 +249,7 @@ static void set_prop_dist(TransInfo *t, short with_dist) static void createTransTexspace(bContext *C, TransInfo *t) { - Scene *scene = CTX_data_scene(C); + Scene *scene = t->scene; TransData *td; Object *ob; ID *id; @@ -719,14 +677,14 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob) int hastranslation = 0; int total = 0; - for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { + for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { bone = pchan->bone; - if(bone->layer & arm->layer) { - if((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected)) + if ((bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) { + if ((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected)) bone->flag |= BONE_TRANSFORM; else bone->flag &= ~BONE_TRANSFORM; - + bone->flag &= ~BONE_HINGE_CHILD_TRANSFORM; bone->flag &= ~BONE_TRANSFORM_CHILD; } @@ -1029,8 +987,8 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob) t->poseobj= ob; /* we also allow non-active objects to be transformed, in weightpaint */ /* init trans data */ - td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransPoseBone"); - tdx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "TransPoseBoneExt"); + td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransPoseBone"); + tdx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "TransPoseBoneExt"); for(i=0; itotal; i++, td++, tdx++) { td->ext= tdx; td->val = NULL; @@ -1075,7 +1033,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t) t->total = 0; for (ebo = edbo->first; ebo; ebo = ebo->next) { - if(ebo->layer & arm->layer) + if (EBONE_VISIBLE(arm, ebo) && !(ebo->flag & BONE_EDITMODE_LOCKED)) { if (t->mode==TFM_BONESIZE) { @@ -1097,18 +1055,19 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t) } } - if (!t->total) return; + if (!t->total) return; copy_m3_m4(mtx, t->obedit->obmat); invert_m3_m3(smtx, mtx); - td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransEditBone"); + td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransEditBone"); for (ebo = edbo->first; ebo; ebo = ebo->next) { ebo->oldlength = ebo->length; // length==0.0 on extrude, used for scaling radius of bone points - if(ebo->layer & arm->layer) { + if (EBONE_VISIBLE(arm, ebo) && !(ebo->flag & BONE_EDITMODE_LOCKED)) + { if (t->mode==TFM_BONE_ENVELOPE) { if (ebo->flag & BONE_ROOTSEL) @@ -1258,7 +1217,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t) static void createTransMBallVerts(bContext *C, TransInfo *t) { MetaBall *mb = (MetaBall*)t->obedit->data; - MetaElem *ml; + MetaElem *ml; TransData *td; TransDataExtension *tx; float mtx[3][3], smtx[3][3]; @@ -1388,7 +1347,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t) Object *obedit= CTX_data_edit_object(C); Curve *cu= obedit->data; TransData *td = NULL; - Nurb *nu; + Nurb *nu; BezTriple *bezt; BPoint *bp; float mtx[3][3], smtx[3][3]; @@ -1436,7 +1395,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t) copy_m3_m4(mtx, t->obedit->obmat); invert_m3_m3(smtx, mtx); - td = t->data; + td = t->data; for(nu= cu->editnurb->first; nu; nu= nu->next) { if(nu->type == CU_BEZIER) { TransData *head, *tail; @@ -1608,7 +1567,7 @@ static void createTransLatticeVerts(bContext *C, TransInfo *t) bp++; } - /* note: in prop mode we need at least 1 selected */ + /* note: in prop mode we need at least 1 selected */ if (countsel==0) return; if(propmode) t->total = count; @@ -1693,7 +1652,7 @@ static void createTransParticleVerts(bContext *C, TransInfo *t) } } - /* note: in prop mode we need at least 1 selected */ + /* note: in prop mode we need at least 1 selected */ if (hasselected==0) return; t->total = count; @@ -2238,7 +2197,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t) } } - /* note: in prop mode we need at least 1 selected */ + /* note: in prop mode we need at least 1 selected */ if (countsel==0) return; /* check active */ @@ -2560,7 +2519,7 @@ static void createTransUVs(bContext *C, TransInfo *t) { SpaceImage *sima = CTX_wm_space_image(C); Image *ima = CTX_data_edit_image(C); - Scene *scene = CTX_data_scene(C); + Scene *scene = t->scene; TransData *td = NULL; TransData2D *td2d = NULL; MTexPoly *tf; @@ -2593,7 +2552,7 @@ static void createTransUVs(bContext *C, TransInfo *t) } } - /* note: in prop mode we need at least 1 selected */ + /* note: in prop mode we need at least 1 selected */ if (countsel==0) return; t->total= (propmode)? count: countsel; @@ -2717,7 +2676,7 @@ static short FrameOnMouseSide(char side, float frame, float cframe) static void createTransNlaData(bContext *C, TransInfo *t) { - Scene *scene= CTX_data_scene(C); + Scene *scene= t->scene; TransData *td = NULL; TransDataNla *tdn = NULL; @@ -2727,7 +2686,6 @@ static void createTransNlaData(bContext *C, TransInfo *t) int filter; int count=0; - char side; /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -2743,11 +2701,11 @@ static void createTransNlaData(bContext *C, TransInfo *t) float xmouse, ymouse; UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse); - side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side + t->frame_side= (xmouse > CFRA) ? 'R' : 'L'; } else { /* normal transform - both sides of current frame are considered */ - side = 'B'; + t->frame_side = 'B'; } /* loop 1: count how many strips are selected (consider each strip as 2 points) */ @@ -2764,8 +2722,8 @@ static void createTransNlaData(bContext *C, TransInfo *t) /* transition strips can't get directly transformed */ if (strip->type != NLASTRIP_TYPE_TRANSITION) { if (strip->flag & NLASTRIP_FLAG_SELECT) { - if (FrameOnMouseSide(side, strip->start, (float)CFRA)) count++; - if (FrameOnMouseSide(side, strip->end, (float)CFRA)) count++; + if (FrameOnMouseSide(t->frame_side, strip->start, (float)CFRA)) count++; + if (FrameOnMouseSide(t->frame_side, strip->end, (float)CFRA)) count++; } } } @@ -2828,13 +2786,13 @@ static void createTransNlaData(bContext *C, TransInfo *t) center[2]= 0.0f; /* set td's based on which handles are applicable */ - if (FrameOnMouseSide(side, strip->start, (float)CFRA)) + if (FrameOnMouseSide(t->frame_side, strip->start, (float)CFRA)) { /* just set tdn to assume that it only has one handle for now */ tdn->handle= -1; /* now, link the transform data up to this data */ - if (t->mode == TFM_TRANSLATION) { + if (ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_EXTEND)) { td->loc= tdn->h1; VECCOPY(td->iloc, tdn->h1); @@ -2859,13 +2817,13 @@ static void createTransNlaData(bContext *C, TransInfo *t) td->extra= tdn; td++; } - if (FrameOnMouseSide(side, strip->end, (float)CFRA)) + if (FrameOnMouseSide(t->frame_side, strip->end, (float)CFRA)) { /* if tdn is already holding the start handle, then we're doing both, otherwise, only end */ tdn->handle= (tdn->handle) ? 2 : 1; /* now, link the transform data up to this data */ - if (t->mode == TFM_TRANSLATION) { + if (ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_EXTEND)) { td->loc= tdn->h2; VECCOPY(td->iloc, tdn->h2); @@ -3038,7 +2996,7 @@ static void posttrans_fcurve_clean (FCurve *fcu) * (if any keyframes were found, or the whole curve wasn't affected) */ if ((len) && (len != fcu->totvert)) { - for (i = 0; i < fcu->totvert; i++) { + for (i= fcu->totvert-1; i >= 0; i--) { BezTriple *bezt= &fcu->bezt[i]; if (BEZSELECTED(bezt) == 0) { @@ -3048,7 +3006,7 @@ static void posttrans_fcurve_clean (FCurve *fcu) delete_fcurve_key(fcu, i, 0); break; } - else if (bezt->vec[1][0] > selcache[index]) + else if (bezt->vec[1][0] < selcache[index]) break; } } @@ -3114,9 +3072,8 @@ static int count_fcurve_keys(FCurve *fcu, char side, float cfra) bezt->f1 |= SELECT; bezt->f3 |= SELECT; - /* increment by 3, as there are 3 points (3 * x-coordinates) that need transform */ if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) - count += 3; + count += 1; } } @@ -3165,9 +3122,10 @@ static void TimeToTransData(TransData *td, float *time, AnimData *adt) * The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data * on the named side are used. */ -static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt, char side, float cfra) +static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FCurve *fcu, AnimData *adt, char side, float cfra) { BezTriple *bezt; + TransData2D *td2d = *td2dv; int i; if (fcu == NULL) @@ -3178,19 +3136,24 @@ static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt, c if (BEZSELECTED(bezt)) { /* only add if on the right 'side' of the current frame */ if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) { - /* each control point needs to be added separetely */ - TimeToTransData(td, bezt->vec[0], adt); - td++; - TimeToTransData(td, bezt->vec[1], adt); - td++; - TimeToTransData(td, bezt->vec[2], adt); + /*set flags to move handles as necassary*/ + td->flag |= TD_MOVEHANDLE1|TD_MOVEHANDLE2; + td2d->h1 = bezt->vec[0]; + td2d->h2 = bezt->vec[2]; + + VECCOPY2D(td2d->ih1, td2d->h1); + VECCOPY2D(td2d->ih2, td2d->h2); + td++; + td2d++; } } } + *td2dv = td2d; + return td; } @@ -3256,8 +3219,9 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl static void createTransActionData(bContext *C, TransInfo *t) { - Scene *scene= CTX_data_scene(C); + Scene *scene= t->scene; TransData *td = NULL; + TransData2D *td2d = NULL; tGPFtransdata *tfd = NULL; bAnimContext ac; @@ -3267,7 +3231,6 @@ static void createTransActionData(bContext *C, TransInfo *t) int count=0; float cfra; - char side; /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -3286,11 +3249,11 @@ static void createTransActionData(bContext *C, TransInfo *t) float xmouse, ymouse; UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse); - side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side + t->frame_side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side } else { /* normal transform - both sides of current frame are considered */ - side = 'B'; + t->frame_side = 'B'; } /* loop 1: fully select ipo-keys and count how many BezTriples are selected */ @@ -3306,9 +3269,9 @@ static void createTransActionData(bContext *C, TransInfo *t) cfra = (float)CFRA; //if (ale->type == ANIMTYPE_GPLAYER) - // count += count_gplayer_frames(ale->data, side, cfra); + // count += count_gplayer_frames(ale->data, t->frame_side, cfra); //else - count += count_fcurve_keys(ale->key_data, side, cfra); + count += count_fcurve_keys(ale->key_data, t->frame_side, cfra); } /* stop if trying to build list if nothing selected */ @@ -3322,7 +3285,9 @@ static void createTransActionData(bContext *C, TransInfo *t) t->total= count; t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(Action Editor)"); + t->data2d= MEM_callocN(t->total*sizeof(TransData2D), "transdata2d"); td= t->data; + td2d = t->data2d; if (ac.datatype == ANIMCONT_GPENCIL) { if (t->mode == TFM_TIME_SLIDE) { @@ -3343,7 +3308,7 @@ static void createTransActionData(bContext *C, TransInfo *t) // bGPDlayer *gpl= (bGPDlayer *)ale->data; // int i; // - // i = GPLayerToTransData(td, tfd, gpl, side, cfra); + // i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra); // td += i; // tfd += i; //} @@ -3359,7 +3324,7 @@ static void createTransActionData(bContext *C, TransInfo *t) else cfra = (float)CFRA; - td= FCurveToTransData(td, fcu, adt, side, cfra); + td= ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra); //} } @@ -3391,8 +3356,13 @@ static void createTransActionData(bContext *C, TransInfo *t) /* Helper function for createTransGraphEditData, which is reponsible for associating * source data with transform data */ -static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, float *loc, float *cent, short selected, short ishandle, short intvals) +static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, BezTriple *bezt, + int bi, short selected, short ishandle, short intvals, + float mtx[3][3], float smtx[3][3]) { + float *loc = bezt->vec[bi]; + float *cent = bezt->vec[1]; + /* New location from td gets dumped onto the old-location of td2d, which then * gets copied to the actual data at td2d->loc2d (bezt->vec[n]) * @@ -3423,7 +3393,21 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, VECCOPY(td->center, cent); VECCOPY(td->iloc, td->loc); } - + + if (td->flag & TD_MOVEHANDLE1) { + td2d->h1 = bezt->vec[0]; + VECCOPY2D(td2d->ih1, td2d->h1); + } + else + td2d->h1 = NULL; + + if (td->flag & TD_MOVEHANDLE2) { + td2d->h2 = bezt->vec[2]; + VECCOPY2D(td2d->ih2, td2d->h2); + } + else + td2d->h2 = NULL; + memset(td->axismtx, 0, sizeof(td->axismtx)); td->axismtx[2][2] = 1.0f; @@ -3443,16 +3427,17 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, td->flag |= TD_NOTIMESNAP; if (intvals) td->flag |= TD_INTVALUES; - - unit_m3(td->mtx); - unit_m3(td->smtx); + + /* copy space-conversion matrices for dealing with non-uniform scales */ + copy_m3_m3(td->mtx, mtx); + copy_m3_m3(td->smtx, smtx); } static void createTransGraphEditData(bContext *C, TransInfo *t) { SpaceIpo *sipo= CTX_wm_space_graph(C); - Scene *scene= CTX_data_scene(C); - ARegion *ar= CTX_wm_region(C); + Scene *scene= t->scene; + ARegion *ar= t->ar; View2D *v2d= &ar->v2d; TransData *td = NULL; @@ -3466,7 +3451,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) BezTriple *bezt; int count=0, i; float cfra; - char side; + float mtx[3][3], smtx[3][3]; /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -3483,11 +3468,11 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) float xmouse, ymouse; UI_view2d_region_to_view(v2d, t->imval[0], t->imval[1], &xmouse, &ymouse); - side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side + t->frame_side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side } else { /* normal transform - both sides of current frame are considered */ - side = 'B'; + t->frame_side = 'B'; } /* loop 1: count how many BezTriples (specifically their verts) are selected (or should be edited) */ @@ -3509,8 +3494,8 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) /* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) { - if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) { - if (sipo->around == V3D_LOCAL) { + if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) { + if (sipo->around == V3D_LOCAL && !ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE)) { /* for local-pivot we only need to count the number of selected handles only, so that centerpoints don't * don't get moved wrong */ @@ -3520,6 +3505,15 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) } else if (bezt->f2 & SELECT) count++; // TODO: could this cause problems? } + else if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) { + /* for 'normal' pivots - just include anything that is selected. + this works a bit differently in translation modes */ + if (bezt->f2 & SELECT) count++; + else { + if (bezt->f1 & SELECT) count++; + if (bezt->f3 & SELECT) count++; + } + } else { /* for 'normal' pivots - just include anything that is selected */ if (bezt->f1 & SELECT) count++; @@ -3547,12 +3541,31 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) td= t->data; td2d= t->data2d; + /* precompute space-conversion matrices for dealing with non-uniform scaling of Graph Editor */ + unit_m3(mtx); + unit_m3(smtx); + + if (ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) { + float xscale, yscale; + + /* apply scale factors to x and y axes of space-conversion matrices */ + UI_view2d_getscale(v2d, &xscale, &yscale); + + /* mtx is data to global (i.e. view) conversion */ + mul_v3_fl(mtx[0], xscale); + mul_v3_fl(mtx[1], yscale); + + /* smtx is global (i.e. view) to data conversion */ + if (IS_EQ(xscale, 0.0f) == 0) mul_v3_fl(smtx[0], 1.0f/xscale); + if (IS_EQ(yscale, 0.0f) == 0) mul_v3_fl(smtx[1], 1.0f/yscale); + } + /* loop 2: build transdata arrays */ for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(&ac, ale); FCurve *fcu= (FCurve *)ale->key_data; short intvals= (fcu->flag & FCURVE_INT_VALUES); - + /* convert current-frame to action-time (slightly less accurate, espcially under * higher scaling ratios, but is faster than converting all points) */ @@ -3569,27 +3582,38 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) /* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse (if applicable) */ for (i=0, bezt= fcu->bezt; i < fcu->totvert; i++, bezt++) { - if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) { + if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) { TransDataCurveHandleFlags *hdata = NULL; short h1=1, h2=1; - /* only include handles if selected, irrespective of the interpolation modes */ - if (bezt->f1 & SELECT) { - hdata = initTransDataCurveHandles(td, bezt); - bezt_to_transdata(td++, td2d++, adt, bezt->vec[0], bezt->vec[1], 1, 1, intvals); - } - else - h1= 0; - if (bezt->f3 & SELECT) { - if (hdata==NULL) + /* only include handles if selected, irrespective of the interpolation modes. + * also, only treat handles specially if the center point isn't selected. + */ + if (!ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE) || !(bezt->f2 & SELECT)) { + if (bezt->f1 & SELECT) { hdata = initTransDataCurveHandles(td, bezt); - bezt_to_transdata(td++, td2d++, adt, bezt->vec[2], bezt->vec[1], 1, 1, intvals); + bezt_to_transdata(td++, td2d++, adt, bezt, 0, 1, 1, intvals, mtx, smtx); + } + else + h1= 0; + + if (bezt->f3 & SELECT) { + if (hdata==NULL) + hdata = initTransDataCurveHandles(td, bezt); + bezt_to_transdata(td++, td2d++, adt, bezt, 2, 1, 1, intvals, mtx, smtx); + } + else + h2= 0; } - else - h2= 0; /* only include main vert if selected */ if (bezt->f2 & SELECT) { + /* move handles relative to center */ + if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) { + if (bezt->f1 & SELECT) td->flag |= TD_MOVEHANDLE1; + if (bezt->f3 & SELECT) td->flag |= TD_MOVEHANDLE2; + } + /* if scaling around individuals centers, do not include keyframes */ if (sipo->around != V3D_LOCAL) { /* if handles were not selected, store their selection status */ @@ -3598,7 +3622,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) hdata = initTransDataCurveHandles(td, bezt); } - bezt_to_transdata(td++, td2d++, adt, bezt->vec[1], bezt->vec[1], 1, 0, intvals); + bezt_to_transdata(td++, td2d++, adt, bezt, 1, 1, 0, intvals, mtx, smtx); } /* special hack (must be done after initTransDataCurveHandles(), as that stores handle settings to restore...): @@ -3724,7 +3748,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv /* dynamically allocate an array of chars to mark whether an TransData's * pointers have been fixed already, so that we don't override ones that are * already done - */ + */ adjusted= MEM_callocN(t->total, "beztmap_adjusted_map"); /* for each beztmap item, find if it is used anywhere */ @@ -3844,7 +3868,7 @@ void flushTransGraphData(TransInfo *t) break; } } - + /* we need to unapply the nla-mapping from the time in some situations */ if (adt) td2d->loc2d[0]= BKE_nla_tweakedit_remap(adt, td2d->loc[0], NLATIME_CONVERT_UNMAP); @@ -3856,6 +3880,16 @@ void flushTransGraphData(TransInfo *t) td2d->loc2d[1]= (float)((int)td2d->loc[1]); else td2d->loc2d[1]= td2d->loc[1]; + + if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) { + td2d->h1[0] = td2d->ih1[0] + td->loc[0] - td->iloc[0]; + td2d->h1[1] = td2d->ih1[1] + td->loc[1] - td->iloc[1]; + } + + if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) { + td2d->h2[0] = td2d->ih2[0] + td->loc[0] - td->iloc[0]; + td2d->h2[1] = td2d->ih2[1] + td->loc[1] - td->iloc[1]; + } } } @@ -3969,6 +4003,8 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count } } else { + t->frame_side= 'B'; + /* *** Normal Transform *** */ if (seq->depth == 0) { @@ -4247,7 +4283,7 @@ static void createTransSeqData(bContext *C, TransInfo *t) { View2D *v2d= UI_view2d_fromcontext(C); - Scene *scene= CTX_data_scene(C); + Scene *scene= t->scene; Editing *ed= seq_give_editing(t->scene, FALSE); TransData *td = NULL; TransData2D *td2d= NULL; @@ -4300,8 +4336,7 @@ static void createTransSeqData(bContext *C, TransInfo *t) /* transcribe given object into TransData for Transforming */ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *ob) { - Scene *scene = CTX_data_scene(C); - Object *track; + Scene *scene = t->scene; float obmtx[3][3]; short constinv; short skip_invert = 0; @@ -4323,10 +4358,7 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object * if (t->mode == TFM_DUMMY) skip_invert = 1; - if (skip_invert == 0 && (ob->track || constinv==0)) { - track= ob->track; - ob->track= NULL; - + if (skip_invert == 0 && constinv == 0) { if (constinv == 0) ob->transflag |= OB_NO_CONSTRAINTS; /* where_is_object_time checks this */ @@ -4334,8 +4366,6 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object * if (constinv == 0) ob->transflag &= ~OB_NO_CONSTRAINTS; - - ob->track= track; } else where_is_object(t->scene, ob); @@ -4569,7 +4599,7 @@ static void clear_trans_object_base_flags(TransInfo *t) if(base->flag & BA_WAS_SEL) base->flag |= SELECT; - base->flag &= ~(BA_WAS_SEL|BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA|BA_DO_IPO|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT); + base->flag &= ~(BA_WAS_SEL|BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA|BA_TEMP_TAG|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT); } } @@ -4585,20 +4615,21 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob, // TODO: this should probably be done per channel instead... if (autokeyframe_cfra_can_key(scene, id)) { KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; + ListBase dsources = {NULL, NULL}; float cfra= (float)CFRA; // xxx this will do for now short flag = 0; - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; - + /* get flags used for inserting keyframes */ flag = ANIM_get_keyframing_flags(scene, 1); + /* add datasource override for the camera object */ + ANIM_relative_keyingset_add_source(&dsources, id, NULL, NULL); + if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) { - /* only insert into active keyingset */ - modify_keyframes(scene, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra); + /* only insert into active keyingset + * NOTE: we assume here that the active Keying Set does not need to have its iterator overridden spe + */ + ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra); } else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) { AnimData *adt= ob->adt; @@ -4644,22 +4675,25 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob, /* insert keyframes for the affected sets of channels using the builtin KeyingSets found */ if (doLoc) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location"); - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } if (doRot) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation"); - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } if (doScale) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scale"); - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } } /* insert keyframe in all (transform) channels */ else { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } + + /* free temp info */ + BLI_freelistN(&dsources); } } @@ -4680,15 +4714,9 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o // TODO: this should probably be done per channel instead... if (autokeyframe_cfra_can_key(scene, id)) { KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene); - bCommonKeySrc cks; - ListBase dsources = {&cks, &cks}; float cfra= (float)CFRA; short flag= 0; - /* init common-key-source for use by KeyingSets */ - memset(&cks, 0, sizeof(bCommonKeySrc)); - cks.id= &ob->id; - /* flag is initialised from UserPref keyframing settings * - special exception for targetless IK - INSERTKEY_MATRIX keyframes should get * visual keyframes even if flag not set, as it's not that useful otherwise @@ -4701,14 +4729,18 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) { if (pchan->bone->flag & BONE_TRANSFORM) { + ListBase dsources = {NULL, NULL}; + /* clear any 'unkeyed' flag it may have */ pchan->bone->flag &= ~BONE_UNKEYED; + /* add datasource override for the camera object */ + ANIM_relative_keyingset_add_source(&dsources, id, &RNA_PoseBone, pchan); + /* only insert into active keyingset? */ if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) { - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra); + /* run the active Keying Set on the current datasource */ + ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra); } /* only insert into available channels? */ else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) { @@ -4757,41 +4789,34 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o if (doLoc) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location"); - - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } if (doRot) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation"); - - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } if (doScale) { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scale"); - - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } } /* insert keyframe in all (transform) channels */ else { KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); - - /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */ - cks.pchan= pchan; - modify_keyframes(scene, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra); } + + /* free temp info */ + BLI_freelistN(&dsources); } } /* do the bone paths - * NOTE: only do this when there is context info + * - only do this when there is context info, since we need that to resolve + * how to do the updates and so on... + * - do not calculate unless there are paths already to update... */ - if (C && (ob->pose->avs.path_type == MOTIONPATH_TYPE_ACFRA)) { + if (C && (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) { //ED_pose_clear_paths(C, ob); // XXX for now, don't need to clear ED_pose_recalculate_paths(C, scene, ob); } @@ -4835,6 +4860,24 @@ void special_aftertrans_update(bContext *C, TransInfo *t) if (t->spacetype == SPACE_SEQ) { /* freeSeqData in transform_conversions.c does this * keep here so the else at the end wont run... */ + + SpaceSeq *sseq= (SpaceSeq *)t->sa->spacedata.first; + + /* marker transform, not especially nice but we may want to move markers + * at the same time as keyframes in the dope sheet. */ + if ((sseq->flag & SEQ_MARKER_TRANS) && (cancelled == 0)) { + /* cant use , TFM_TIME_EXTEND + * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead */ + + if(t->mode == TFM_SEQ_SLIDE) { + if(t->frame_side == 'B') + scene_marker_tfm_translate(t->scene, floor(t->values[0] + 0.5f), SELECT); + } + else if (ELEM(t->frame_side, 'L', 'R')) { + scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side); + } + } + } else if (t->spacetype == SPACE_NODE) { /* pass */ @@ -4863,7 +4906,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t) FCurve *fcu= (FCurve *)ale->key_data; if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && - ((cancelled == 0) || (duplicate)) ) + ((cancelled == 0) || (duplicate)) ) { if (adt) { ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1); @@ -4883,18 +4926,33 @@ void special_aftertrans_update(bContext *C, TransInfo *t) // fixme... some of this stuff is not good if (ob) { if (ob->pose || ob_get_key(ob)) - DAG_id_flush_update(&ob->id, OB_RECALC); + DAG_id_flush_update(&ob->id, OB_RECALC_ALL); else DAG_id_flush_update(&ob->id, OB_RECALC_OB); } /* Do curve cleanups? */ if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && - ((cancelled == 0) || (duplicate)) ) + ((cancelled == 0) || (duplicate)) ) { posttrans_action_clean(&ac, (bAction *)ac.data); } } + + /* marker transform, not especially nice but we may want to move markers + * at the same time as keyframes in the dope sheet. */ + if ((saction->flag & SACTION_MARKERS_MOVE) && (cancelled == 0)) { + /* cant use , TFM_TIME_EXTEND + * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead */ + + if(t->mode == TFM_TIME_TRANSLATE) { + if(t->frame_side == 'B') + scene_marker_tfm_translate(t->scene, floor(t->vec[0] + 0.5f), SELECT); + else if (ELEM(t->frame_side, 'L', 'R')) + scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side); + } + } + #if 0 // XXX future of this is still not clear else if (ac.datatype == ANIMCONT_GPENCIL) { /* remove duplicate frames and also make sure points are in order! */ @@ -4944,7 +5002,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t) FCurve *fcu= (FCurve *)ale->key_data; if ( (sipo->flag & SIPO_NOTRANSKEYCULL)==0 && - ((cancelled == 0) || (duplicate)) ) + ((cancelled == 0) || (duplicate)) ) { if (adt) { ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1); @@ -5060,13 +5118,13 @@ void special_aftertrans_update(bContext *C, TransInfo *t) if (td->flag & TD_SKIP) continue; - /* flag object caches as outdated */ - BKE_ptcache_ids_from_object(&pidlist, ob); - for(pid=pidlist.first; pid; pid=pid->next) { - if(pid->type != PTCACHE_TYPE_PARTICLES) /* particles don't need reset on geometry change */ - pid->cache->flag |= PTCACHE_OUTDATED; - } - BLI_freelistN(&pidlist); + /* flag object caches as outdated */ + BKE_ptcache_ids_from_object(&pidlist, ob, t->scene, MAX_DUPLI_RECUR); + for(pid=pidlist.first; pid; pid=pid->next) { + if(pid->type != PTCACHE_TYPE_PARTICLES) /* particles don't need reset on geometry change */ + pid->cache->flag |= PTCACHE_OUTDATED; + } + BLI_freelistN(&pidlist); /* pointcache refresh */ if (BKE_ptcache_object_reset(t->scene, ob, PTCACHE_RESET_OUTDATED)) @@ -5082,7 +5140,8 @@ void special_aftertrans_update(bContext *C, TransInfo *t) if (!cancelled) { autokeyframe_ob_cb_func(C, t->scene, (View3D *)t->view, ob, t->mode); - if (ob->avs.path_type == MOTIONPATH_TYPE_ACFRA) + /* only calculate paths if there are paths to be recalculated */ + if (ob->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS) recalcObPaths= 1; } } @@ -5239,7 +5298,7 @@ void createTransNodeData(bContext *C, TransInfo *t) void createTransData(bContext *C, TransInfo *t) { - Scene *scene = CTX_data_scene(C); + Scene *scene = t->scene; Object *ob = OBACT; if (t->options & CTX_TEXTURE) { @@ -5306,7 +5365,7 @@ void createTransData(bContext *C, TransInfo *t) t->ext = NULL; if (t->obedit->type == OB_MESH) { createTransEditVerts(C, t); - } + } else if ELEM(t->obedit->type, OB_CURVE, OB_SURF) { createTransCurveVerts(C, t); } @@ -5319,7 +5378,7 @@ void createTransData(bContext *C, TransInfo *t) else if (t->obedit->type==OB_ARMATURE) { t->flag &= ~T_PROP_EDIT; createTransArmatureVerts(C, t); - } + } else { printf("edit type not implemented!\n"); } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 72c17df1309..1783cc58bee 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -35,24 +35,11 @@ #include "BLO_sys_types.h" // for intptr_t support #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_constraint_types.h" -#include "DNA_curve_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" -#include "DNA_modifier_types.h" -#include "DNA_nla_types.h" -#include "DNA_node_types.h" -#include "DNA_object_types.h" -#include "DNA_object_force.h" -#include "DNA_particle_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -106,7 +93,6 @@ #include "BLI_editVert.h" #include "BLI_rand.h" -#include "RNA_access.h" #include "WM_types.h" #include "WM_api.h" @@ -204,8 +190,8 @@ static void clipMirrorModifier(TransInfo *t, Object *ob) copy_v3_v3(iloc, td->iloc); if (mmd->mirror_ob) { - mul_v3_m4v3(loc, mtx, loc); - mul_v3_m4v3(iloc, mtx, iloc); + mul_m4_v3(mtx, loc); + mul_m4_v3(mtx, iloc); } clip = 0; @@ -233,7 +219,7 @@ static void clipMirrorModifier(TransInfo *t, Object *ob) } if (clip) { if (mmd->mirror_ob) { - mul_v3_m4v3(loc, imtx, loc); + mul_m4_v3(imtx, loc); } copy_v3_v3(td->loc, loc); } @@ -327,7 +313,7 @@ static int fcu_test_selected(FCurve *fcu) BezTriple *bezt= fcu->bezt; int i; - if(bezt==NULL) /* ignore baked */ + if (bezt==NULL) /* ignore baked */ return 0; for (i=0; i < fcu->totvert; i++, bezt++) { @@ -423,11 +409,11 @@ void recalcData(TransInfo *t) /* now test if there is a need to re-sort */ for (ale= anim_data.first; ale; ale= ale->next) { FCurve *fcu= (FCurve *)ale->key_data; - + /* ignore unselected fcurves */ - if(!fcu_test_selected(fcu)) + if (!fcu_test_selected(fcu)) continue; - + // fixme: only do this for selected verts... ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYSEL|ANIM_UNITCONV_SELVERTS|ANIM_UNITCONV_RESTORE); @@ -443,7 +429,6 @@ void recalcData(TransInfo *t) */ if ((sipo->flag & SIPO_NOREALTIMEUPDATES) == 0) ANIM_list_elem_update(t->scene, ale); - } /* do resort and other updates? */ @@ -574,8 +559,8 @@ void recalcData(TransInfo *t) // TODO: do we need to write in 2 passes to make sure that no truncation goes on? RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr); - RNA_float_set(&strip_ptr, "start_frame", tdn->h1[0]); - RNA_float_set(&strip_ptr, "end_frame", tdn->h2[0]); + RNA_float_set(&strip_ptr, "frame_start", tdn->h1[0]); + RNA_float_set(&strip_ptr, "frame_end", tdn->h2[0]); /* flush transforms to child strips (since this should be a meta) */ BKE_nlameta_flush_transforms(strip); @@ -653,7 +638,11 @@ void recalcData(TransInfo *t) if ELEM(t->obedit->type, OB_CURVE, OB_SURF) { Curve *cu= t->obedit->data; Nurb *nu= cu->editnurb->first; - + + if(t->state != TRANS_CANCEL) { + clipMirrorModifier(t, t->obedit); + } + DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */ if (t->state == TRANS_CANCEL) { @@ -823,7 +812,7 @@ void recalcData(TransInfo *t) /* sets recalc flags fully, instead of flushing existing ones * otherwise proxies don't function correctly */ - DAG_id_flush_update(&ob->id, OB_RECALC); + DAG_id_flush_update(&ob->id, OB_RECALC_OB); } } @@ -973,7 +962,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) { t->current_orientation = RNA_enum_get(op->ptr, "constraint_orientation"); - if (t->current_orientation >= V3D_MANIP_CUSTOM + BIF_countTransformOrientation(C) - 1) + if (t->current_orientation >= V3D_MANIP_CUSTOM + BIF_countTransformOrientation(C)) { t->current_orientation = V3D_MANIP_GLOBAL; } @@ -1005,6 +994,21 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) t->around = V3D_CENTER; } + if (op && RNA_property_is_set(op->ptr, "release_confirm")) + { + if (RNA_boolean_get(op->ptr, "release_confirm")) + { + t->flag |= T_RELEASE_CONFIRM; + } + } + else + { + if (U.flag & USER_RELEASECONFIRM) + { + t->flag |= T_RELEASE_CONFIRM; + } + } + if (op && RNA_struct_find_property(op->ptr, "mirror") && RNA_property_is_set(op->ptr, "mirror")) { if (RNA_boolean_get(op->ptr, "mirror")) @@ -1115,7 +1119,7 @@ void postTrans (bContext *C, TransInfo *t) if (t->data) { int a; - /* since ipokeys are optional on objects, we mallocced them per trans-data */ + /* free data malloced per trans-data */ for(a=0, td= t->data; atotal; a++, td++) { if (td->flag & TD_BEZTRIPLE) MEM_freeN(td->hdata); @@ -1174,6 +1178,7 @@ static void restoreElement(TransData *td) { if (td->val) { *td->val = td->ival; } + if (td->ext && (td->flag&TD_NO_EXT)==0) { if (td->ext->rot) { VECCOPY(td->ext->rot, td->ext->irot); @@ -1195,11 +1200,23 @@ static void restoreElement(TransData *td) { void restoreTransObjects(TransInfo *t) { TransData *td; + TransData2D *td2d; for (td = t->data; td < t->data + t->total; td++) { restoreElement(td); } + for (td2d=t->data2d; t->data2d && td2d < t->data2d + t->total; td2d++) { + if (td2d->h1) { + td2d->h1[0] = td2d->ih1[0]; + td2d->h1[1] = td2d->ih1[1]; + } + if (td2d->h2) { + td2d->h2[0] = td2d->ih2[0]; + td2d->h2[1] = td2d->ih2[1]; + } + } + unit_m3(t->mat); recalcData(t); @@ -1243,15 +1260,19 @@ void calculateCenterCursor(TransInfo *t) void calculateCenterCursor2D(TransInfo *t) { - View2D *v2d= t->view; float aspx=1.0, aspy=1.0; + float *cursor= NULL; + + if(t->spacetype==SPACE_IMAGE) { + SpaceImage *sima= (SpaceImage *)t->sa->spacedata.first; + /* only space supported right now but may change */ + ED_space_image_uv_aspect(sima, &aspx, &aspy); + cursor = sima->cursor; + } - if(t->spacetype==SPACE_IMAGE) /* only space supported right now but may change */ - ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy); - - if (v2d) { - t->center[0] = v2d->cursor[0] * aspx; - t->center[1] = v2d->cursor[1] * aspy; + if (cursor) { + t->center[0] = cursor[0] * aspx; + t->center[1] = cursor[1] * aspy; } calculateCenter2D(t); @@ -1279,7 +1300,7 @@ void calculateCenterMedian(TransInfo *t) if (t->data[i].flag & TD_SELECTED) { if (!(t->data[i].flag & TD_NOCENTER)) { - add_v3_v3v3(partial, partial, t->data[i].center); + add_v3_v3(partial, t->data[i].center); total++; } } diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index 0e4521052ad..d7ebd28f604 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -26,7 +26,6 @@ #include #include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" @@ -225,6 +224,8 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) double dx3 = mval[0] - mi->imval[0]; double dy3 = mval[1] - mi->imval[1]; + double *angle = mi->data; + /* use doubles here, to make sure a "1.0" (no rotation) doesnt become 9.999999e-01, which gives 0.02 for acos */ double deler = ((dx1*dx1+dy1*dy1)+(dx2*dx2+dy2*dy2)-(dx3*dx3+dy3*dy3)) / (2.0 * (A*B?A*B:1.0)); @@ -266,7 +267,9 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) mi->imval[1] = mval[1]; } - output[0] += dphi; + *angle += dphi; + + output[0] = *angle; } void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2]) @@ -279,6 +282,8 @@ void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2]) mi->imval[0] = mval[0]; mi->imval[1] = mval[1]; + + mi->post = NULL; } static void calcSpringFactor(MouseInput *mi) @@ -314,6 +319,7 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode) t->helpline = HLP_SPRING; break; case INPUT_ANGLE: + mi->data = MEM_callocN(sizeof(double), "angle accumulator"); mi->apply = InputAngle; t->helpline = HLP_ANGLE; break; @@ -354,12 +360,22 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode) applyMouseInput(t, mi, mi->imval, t->values); } +void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *, float [3])) +{ + mi->post = post; +} + void applyMouseInput(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { if (mi->apply != NULL) { mi->apply(t, mi, mval, output); } + + if (mi->post) + { + mi->post(t, output); + } } int handleMouseInput(TransInfo *t, MouseInput *mi, wmEvent *event) diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index 200373a9589..fe63ec0e15b 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -1,5 +1,5 @@ /** -* $Id: +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -41,17 +41,11 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" -#include "DNA_action_types.h" #include "DNA_curve_types.h" #include "DNA_lattice_types.h" -#include "DNA_mesh_types.h" #include "DNA_meta_types.h" -#include "DNA_object_types.h" -#include "DNA_particle_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" #include "RNA_access.h" @@ -79,8 +73,6 @@ #include "ED_armature.h" #include "ED_mesh.h" #include "ED_particle.h" -#include "ED_space_api.h" -#include "ED_transform.h" #include "ED_view3d.h" #include "UI_resources.h" @@ -131,7 +123,7 @@ static void calc_tw_center(Scene *scene, float *co) float *max= scene->twmax; DO_MINMAX(co, min, max); - add_v3_v3v3(twcent, twcent, co); + add_v3_v3(twcent, co); } static void protectflag_to_drawflags(short protectflag, short *drawflags) @@ -1562,6 +1554,8 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, short *mval, float ho return 0; } +int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports); + /* return 0; nothing happened */ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op) { @@ -1575,6 +1569,9 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op) if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return 0; if(!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return 0; + /* Force orientation */ + RNA_enum_set(op->ptr, "constraint_orientation", v3d->twmode); + // find the hotspots first test narrow hotspot val= manipulator_selectbuf(sa, ar, event->mval, 0.5f*(float)U.tw_hotspot); if(val) { @@ -1614,6 +1611,7 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op) } RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); WM_operator_name_call(C, "TRANSFORM_OT_translate", WM_OP_INVOKE_DEFAULT, op->ptr); + //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_translate", 0), event, op->ptr, NULL); } else if (drawflags & MAN_SCALE_C) { switch(drawflags) { @@ -1644,8 +1642,10 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op) } RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); WM_operator_name_call(C, "TRANSFORM_OT_resize", WM_OP_INVOKE_DEFAULT, op->ptr); + //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_resize", 0), event, op->ptr, NULL); } else if (drawflags == MAN_ROT_T) { /* trackball need special case, init is different */ + //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_trackball", 0), event, op->ptr, NULL); WM_operator_name_call(C, "TRANSFORM_OT_trackball", WM_OP_INVOKE_DEFAULT, op->ptr); } else if (drawflags & MAN_ROT_C) { @@ -1662,6 +1662,7 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op) } RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); WM_operator_name_call(C, "TRANSFORM_OT_rotate", WM_OP_INVOKE_DEFAULT, op->ptr); + //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_rotate", 0), event, op->ptr, NULL); } } /* after transform, restore drawflags */ diff --git a/source/blender/editors/transform/transform_ndofinput.c b/source/blender/editors/transform/transform_ndofinput.c index fa872339196..3e47484c54c 100644 --- a/source/blender/editors/transform/transform_ndofinput.c +++ b/source/blender/editors/transform/transform_ndofinput.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,8 +30,6 @@ #include "BKE_global.h" /* for G */ #include "BKE_utildefines.h" /* ABS */ -#include "DNA_view3d_types.h" /* for G.vd (view3d) */ -#include "DNA_windowmanager_types.h" /* for G.vd (view3d) */ #include "WM_types.h" @@ -44,7 +42,7 @@ static void resetNDofInput(NDofInput *n); void initNDofInput(NDofInput *n) { - int i; + int i; n->flag = 0; n->axis = 0; @@ -128,9 +126,9 @@ void applyNDofInput(NDofInput *n, float *vec) static int updateNDofMotion(NDofInput *n) { - float fval[7]; - int i; - int retval = 0; + float fval[7]; + int i; + int retval = 0; getndof(fval); diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 95e0d270fde..29bcd4e8592 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -25,8 +25,6 @@ #include "MEM_guardedalloc.h" #include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_windowmanager_types.h" #include "RNA_access.h" #include "RNA_define.h" @@ -63,6 +61,7 @@ char OP_RESIZE[] = "TRANSFORM_OT_resize"; char OP_SHEAR[] = "TRANSFORM_OT_shear"; char OP_WARP[] = "TRANSFORM_OT_warp"; char OP_SHRINK_FATTEN[] = "TRANSFORM_OT_shrink_fatten"; +char OP_PUSH_PULL[] = "TRANSFORM_OT_push_pull"; char OP_TILT[] = "TRANSFORM_OT_tilt"; char OP_TRACKBALL[] = "TRANSFORM_OT_trackball"; char OP_MIRROR[] = "TRANSFORM_OT_mirror"; @@ -77,6 +76,7 @@ void TRANSFORM_OT_resize(struct wmOperatorType *ot); void TRANSFORM_OT_shear(struct wmOperatorType *ot); void TRANSFORM_OT_warp(struct wmOperatorType *ot); void TRANSFORM_OT_shrink_fatten(struct wmOperatorType *ot); +void TRANSFORM_OT_push_pull(struct wmOperatorType *ot); void TRANSFORM_OT_tilt(struct wmOperatorType *ot); void TRANSFORM_OT_trackball(struct wmOperatorType *ot); void TRANSFORM_OT_mirror(struct wmOperatorType *ot); @@ -93,6 +93,7 @@ TransformModeItem transform_modes[] = {OP_SHEAR, TFM_SHEAR, TRANSFORM_OT_shear}, {OP_WARP, TFM_WARP, TRANSFORM_OT_warp}, {OP_SHRINK_FATTEN, TFM_SHRINKFATTEN, TRANSFORM_OT_shrink_fatten}, + {OP_PUSH_PULL, TFM_PUSHPULL, TRANSFORM_OT_push_pull}, {OP_TILT, TFM_TILT, TRANSFORM_OT_tilt}, {OP_TRACKBALL, TFM_TRACKBALL, TRANSFORM_OT_trackball}, {OP_MIRROR, TFM_MIRROR, TRANSFORM_OT_mirror}, @@ -383,45 +384,66 @@ static int transform_invoke(bContext *C, wmOperator *op, wmEvent *event) } } -void Properties_Proportional(struct wmOperatorType *ot) -{ - RNA_def_enum(ot->srna, "proportional", proportional_editing_items, 0, "Proportional Editing", ""); - RNA_def_enum(ot->srna, "proportional_editing_falloff", proportional_falloff_items, 0, "Proportional Editing Falloff", "Falloff type for proportional editing mode."); - RNA_def_float(ot->srna, "proportional_size", 1, 0, FLT_MAX, "Proportional Size", "", 0, 100); -} - -void Properties_Axis(struct wmOperatorType *ot) +void Transform_Properties(struct wmOperatorType *ot, int flags) { PropertyRNA *prop; - prop= RNA_def_property(ot->srna, "axis", PROP_FLOAT, PROP_DIRECTION); - RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Axis", "The axis around which the transformation occurs"); -} + if (flags & P_AXIS) + { + prop= RNA_def_property(ot->srna, "axis", PROP_FLOAT, PROP_DIRECTION); + RNA_def_property_array(prop, 3); + /* Make this not hidden when there's a nice axis selection widget */ + RNA_def_property_flag(prop, PROP_HIDDEN); + RNA_def_property_ui_text(prop, "Axis", "The axis around which the transformation occurs"); -void Properties_Snapping(struct wmOperatorType *ot, short fullsnap, short align) -{ - RNA_def_boolean(ot->srna, "snap", 0, "Use Snapping Options", ""); + } - if (fullsnap) { - RNA_def_enum(ot->srna, "snap_target", snap_target_items, 0, "Target", ""); - RNA_def_float_vector(ot->srna, "snap_point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "", -FLT_MAX, FLT_MAX); + if (flags & P_CONSTRAINT) + { + prop= RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", ""); + prop= RNA_def_property(ot->srna, "constraint_orientation", PROP_ENUM, PROP_NONE); + RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation"); + RNA_def_enum_funcs(prop, rna_TransformOrientation_itemf); - if (align) { - RNA_def_boolean(ot->srna, "snap_align", 0, "Align with Point Normal", ""); - RNA_def_float_vector(ot->srna, "snap_normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal", "", -FLT_MAX, FLT_MAX); + + } + + if (flags & P_MIRROR) + { + RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); + } + + + if (flags & P_PROPORTIONAL) + { + RNA_def_enum(ot->srna, "proportional", proportional_editing_items, 0, "Proportional Editing", ""); + RNA_def_enum(ot->srna, "proportional_editing_falloff", proportional_falloff_items, 0, "Proportional Editing Falloff", "Falloff type for proportional editing mode."); + RNA_def_float(ot->srna, "proportional_size", 1, 0, FLT_MAX, "Proportional Size", "", 0, 100); + } + + if (flags & P_SNAP) + { + prop= RNA_def_boolean(ot->srna, "snap", 0, "Use Snapping Options", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); + + if (flags & P_GEO_SNAP) { + prop= RNA_def_enum(ot->srna, "snap_target", snap_target_items, 0, "Target", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); + prop= RNA_def_float_vector(ot->srna, "snap_point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(prop, PROP_HIDDEN); + + if (flags & P_ALIGN_SNAP) { + prop= RNA_def_boolean(ot->srna, "snap_align", 0, "Align with Point Normal", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); + prop= RNA_def_float_vector(ot->srna, "snap_normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal", "", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(prop, PROP_HIDDEN); + } } } -} -void Properties_Constraints(struct wmOperatorType *ot) -{ - PropertyRNA *prop; - - RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", ""); - prop= RNA_def_property(ot->srna, "constraint_orientation", PROP_ENUM, PROP_NONE); - RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation"); - RNA_def_enum_funcs(prop, rna_TransformOrientation_itemf); + // Add confirm method all the time. At the end because it's not really that important and should be hidden + prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button"); + RNA_def_property_flag(prop, PROP_HIDDEN); } void TRANSFORM_OT_translate(struct wmOperatorType *ot) @@ -441,13 +463,7 @@ void TRANSFORM_OT_translate(struct wmOperatorType *ot) RNA_def_float_vector(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Constraints(ot); - - Properties_Snapping(ot, 1, 1); + Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP); } void TRANSFORM_OT_resize(struct wmOperatorType *ot) @@ -467,13 +483,7 @@ void TRANSFORM_OT_resize(struct wmOperatorType *ot) RNA_def_float_vector(ot->srna, "value", 3, VecOne, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Constraints(ot); - - Properties_Snapping(ot, 1, 0); + Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP); } @@ -494,11 +504,7 @@ void TRANSFORM_OT_trackball(struct wmOperatorType *ot) RNA_def_float_vector(ot->srna, "value", 2, VecOne, -FLT_MAX, FLT_MAX, "angle", "", -FLT_MAX, FLT_MAX); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP); } void TRANSFORM_OT_rotate(struct wmOperatorType *ot) @@ -518,24 +524,16 @@ void TRANSFORM_OT_rotate(struct wmOperatorType *ot) RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI*2, M_PI*2); - Properties_Axis(ot); - - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Constraints(ot); - - Properties_Snapping(ot, 1, 0); + Transform_Properties(ot, P_AXIS|P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP); } void TRANSFORM_OT_tilt(struct wmOperatorType *ot) { /* identifiers */ ot->name = "Tilt"; - /*optionals - - "Tilt selected vertices." - "Specify an extra axis rotation for selected vertices of 3d curve." */ + /*optionals - + "Tilt selected vertices." + "Specify an extra axis rotation for selected vertices of 3d curve." */ ot->description= "Tilt selected control vertices of 3d curve"; ot->idname = OP_TILT; ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; @@ -549,13 +547,7 @@ void TRANSFORM_OT_tilt(struct wmOperatorType *ot) RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI*2, M_PI*2); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Constraints(ot); - - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_SNAP); } void TRANSFORM_OT_warp(struct wmOperatorType *ot) @@ -575,14 +567,8 @@ void TRANSFORM_OT_warp(struct wmOperatorType *ot) RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", 0, 1); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Snapping(ot, 0, 0); - + Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP); // XXX Warp axis? -// Properties_Constraints(ot); } void TRANSFORM_OT_shear(struct wmOperatorType *ot) @@ -602,14 +588,28 @@ void TRANSFORM_OT_shear(struct wmOperatorType *ot) RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Offset", "", -FLT_MAX, FLT_MAX); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Snapping(ot, 0, 0); - + Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP); // XXX Shear axis? -// Properties_Constraints(ot); +} + +void TRANSFORM_OT_push_pull(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Push/Pull"; + ot->description= "Push/Pull selected items"; + ot->idname = OP_PUSH_PULL; + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; + + /* api callbacks */ + ot->invoke = transform_invoke; + ot->exec = transform_exec; + ot->modal = transform_modal; + ot->cancel = transform_cancel; + ot->poll = ED_operator_areaactive; + + RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Distance", "", -FLT_MAX, FLT_MAX); + + Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP); } void TRANSFORM_OT_shrink_fatten(struct wmOperatorType *ot) @@ -629,18 +629,14 @@ void TRANSFORM_OT_shrink_fatten(struct wmOperatorType *ot) RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Offset", "", -FLT_MAX, FLT_MAX); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP); } void TRANSFORM_OT_tosphere(struct wmOperatorType *ot) { /* identifiers */ ot->name = "To Sphere"; - //added "around mesh center" to differentiate between "MESH_OT_vertices_to_sphere()" + //added "around mesh center" to differentiate between "MESH_OT_vertices_to_sphere()" ot->description= "Move selected vertices outward in a spherical shape around mesh center"; ot->idname = OP_TOSPHERE; ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; @@ -654,11 +650,7 @@ void TRANSFORM_OT_tosphere(struct wmOperatorType *ot) RNA_def_float_factor(ot->srna, "value", 0, 0, 1, "Factor", "", 0, 1); - Properties_Proportional(ot); - - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP); } void TRANSFORM_OT_mirror(struct wmOperatorType *ot) @@ -676,8 +668,7 @@ void TRANSFORM_OT_mirror(struct wmOperatorType *ot) ot->cancel = transform_cancel; ot->poll = ED_operator_areaactive; - Properties_Proportional(ot); - Properties_Constraints(ot); + Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL); } void TRANSFORM_OT_edge_slide(struct wmOperatorType *ot) @@ -697,9 +688,7 @@ void TRANSFORM_OT_edge_slide(struct wmOperatorType *ot) RNA_def_float_factor(ot->srna, "value", 0, -1.0f, 1.0f, "Factor", "", -1.0f, 1.0f); - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_MIRROR|P_SNAP); } void TRANSFORM_OT_edge_crease(struct wmOperatorType *ot) @@ -719,7 +708,7 @@ void TRANSFORM_OT_edge_crease(struct wmOperatorType *ot) RNA_def_float_factor(ot->srna, "value", 0, -1.0f, 1.0f, "Factor", "", -1.0f, 1.0f); - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_SNAP); } void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot) @@ -739,7 +728,7 @@ void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot) RNA_def_float_vector(ot->srna, "value", 2, VecOne, -FLT_MAX, FLT_MAX, "angle", "", -FLT_MAX, FLT_MAX); - Properties_Snapping(ot, 0, 0); + Transform_Properties(ot, P_SNAP); } void TRANSFORM_OT_transform(struct wmOperatorType *ot) @@ -793,12 +782,7 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot) RNA_def_float_vector(ot->srna, "value", 4, NULL, -FLT_MAX, FLT_MAX, "Values", "", -FLT_MAX, FLT_MAX); - Properties_Axis(ot); - - Properties_Proportional(ot); - RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", ""); - - Properties_Constraints(ot); + Transform_Properties(ot, P_AXIS|P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP); } void transform_operatortypes(void) @@ -863,7 +847,7 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac km = WM_keymap_add_item(keymap, OP_MIRROR, MKEY, KM_PRESS, KM_CTRL, 0); km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(km->ptr, "path", "tool_settings.snap"); + RNA_string_set(km->ptr, "data_path", "tool_settings.snap"); km = WM_keymap_add_item(keymap, "TRANSFORM_OT_snap_type", TABKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); @@ -871,30 +855,29 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac case SPACE_ACTION: km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0); RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE); - + km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0); RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE); - + km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0); RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND); - + km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, 0, 0); RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE); - + km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", TKEY, KM_PRESS, 0, 0); RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE); break; case SPACE_IPO: km= WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0); - + km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0); - - // XXX the 'mode' identifier here is not quite right + km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0); RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND); - + km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0); - + km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0); break; case SPACE_NLA: @@ -914,7 +897,9 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac km= WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0); km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_A, KM_ANY, 0, 0); + RNA_enum_set(km->ptr, "release_confirm", 1); km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0); + RNA_enum_set(km->ptr, "release_confirm", 1); km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0); @@ -940,7 +925,7 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac km = WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0); km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(km->ptr, "path", "tool_settings.snap"); + RNA_string_set(km->ptr, "data_path", "tool_settings.snap"); break; default: break; diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index bbff86a8b11..273c0896728 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,16 +28,10 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" -#include "DNA_action_types.h" #include "DNA_curve_types.h" -#include "DNA_listBase.h" #include "DNA_object_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meta_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "DNA_view3d_types.h" #include "BKE_global.h" @@ -58,9 +52,7 @@ #include "ED_armature.h" #include "ED_mesh.h" -#include "ED_util.h" -#include "UI_interface.h" #include "RNA_define.h" @@ -484,7 +476,7 @@ void applyTransformOrientation(const bContext *C, float mat[3][3], char *name) { break; } } - } + } } static int count_bone_select(bArmature *arm, ListBase *lb, int do_it) @@ -526,6 +518,7 @@ void initTransformOrientation(bContext *C, TransInfo *t) case V3D_MANIP_GIMBAL: unit_m3(t->spacemtx); if (gimbal_axis(ob, t->spacemtx)) { + strcpy(t->spacename, "gimbal"); break; } /* no gimbal fallthrough to normal */ @@ -737,7 +730,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3], BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { if (BM_TestHFlag(eve, BM_SELECT)) { - add_v3_v3v3(normal, normal, eve->no); + add_v3_v3(normal, eve->no); } } normalize_v3(normal); @@ -819,7 +812,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3], float mat[4][4]; /* Rotation of MetaElem is stored in quat */ - quat_to_mat4( mat,ml_sel->quat); + quat_to_mat4( mat,ml_sel->quat); VECCOPY(normal, mat[2]); @@ -844,10 +837,10 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3], float vec[3]; sub_v3_v3v3(vec, ebone->tail, ebone->head); normalize_v3(vec); - add_v3_v3v3(normal, normal, vec); + add_v3_v3(normal, vec); vec_roll_to_mat3(vec, ebone->roll, mat); - add_v3_v3v3(plane, plane, mat[2]); + add_v3_v3(plane, mat[2]); } } } @@ -887,8 +880,8 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3], /* use channels to get stats */ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { if (pchan->bone && pchan->bone->flag & BONE_TRANSFORM) { - add_v3_v3v3(normal, normal, pchan->pose_mat[2]); - add_v3_v3v3(plane, plane, pchan->pose_mat[1]); + add_v3_v3(normal, pchan->pose_mat[2]); + add_v3_v3(plane, pchan->pose_mat[1]); } } negate_v3(plane); diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index dc60890cac1..a5a02261ffc 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -34,14 +34,11 @@ #include "PIL_time.h" -#include "DNA_action_types.h" #include "DNA_armature_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_meshdata_types.h" // Temporary, for snapping to other unselected meshes #include "DNA_space_types.h" #include "DNA_screen_types.h" -#include "DNA_userdef_types.h" #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" @@ -75,7 +72,6 @@ #include "ED_armature.h" #include "ED_image.h" #include "ED_mesh.h" -#include "ED_transform.h" #include "ED_uvedit.h" #include "ED_view3d.h" @@ -239,7 +235,7 @@ int handleSnapping(TransInfo *t, wmEvent *event) void applyProject(TransInfo *t) { /* XXX FLICKER IN OBJECT MODE */ - if ((t->tsnap.project) && activeSnap(t)) + if ((t->tsnap.project) && activeSnap(t) && (t->flag & T_NO_PROJECT) == 0) { TransData *td = t->data; float tvec[3]; @@ -285,7 +281,7 @@ void applyProject(TransInfo *t) mul_m3_v3(td->smtx, tvec); - add_v3_v3v3(td->loc, td->loc, tvec); + add_v3_v3(td->loc, tvec); } //XXX constraintTransLim(t, td); @@ -918,7 +914,7 @@ void TargetSnapMedian(TransInfo *t) for(td = t->data, i = 0 ; i < t->total && td->flag & TD_SELECTED ; i++, td++) { - add_v3_v3v3(t->tsnap.snapTarget, t->tsnap.snapTarget, td->center); + add_v3_v3(t->tsnap.snapTarget, td->center); } mul_v3_fl(t->tsnap.snapTarget, 1.0 / i); @@ -1036,7 +1032,7 @@ int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4 VECCOPY(intersect, ray_normal_local); mul_v3_fl(intersect, lambda); - add_v3_v3v3(intersect, intersect, ray_start_local); + add_v3_v3(intersect, ray_start_local); VECCOPY(location, intersect); @@ -1749,7 +1745,7 @@ int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta VECCOPY(intersect, ray_normal_local); mul_v3_fl(intersect, lambda); - add_v3_v3v3(intersect, intersect, ray_start_local); + add_v3_v3(intersect, ray_start_local); VECCOPY(location, intersect); @@ -1779,7 +1775,7 @@ int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta VECCOPY(intersect, ray_normal_local); mul_v3_fl(intersect, lambda); - add_v3_v3v3(intersect, intersect, ray_start_local); + add_v3_v3(intersect, ray_start_local); VECCOPY(location, intersect); @@ -1918,26 +1914,13 @@ void snapGridAction(TransInfo *t, float *val, GearsType action) { void snapGrid(TransInfo *t, float *val) { - int invert; GearsType action; // Only do something if using Snap to Grid if (t->tsnap.mode != SCE_SNAP_MODE_INCREMENT) return; - if(t->mode==TFM_ROTATION || t->mode==TFM_WARP || t->mode==TFM_TILT || t->mode==TFM_TRACKBALL || t->mode==TFM_BONE_ROLL) - invert = U.flag & USER_AUTOROTGRID; - else if(t->mode==TFM_RESIZE || t->mode==TFM_SHEAR || t->mode==TFM_BONESIZE || t->mode==TFM_SHRINKFATTEN || t->mode==TFM_CURVE_SHRINKFATTEN) - invert = U.flag & USER_AUTOSIZEGRID; - else - invert = U.flag & USER_AUTOGRABGRID; - - if(invert) { - action = activeSnap(t) ? NO_GEARS: BIG_GEARS; - } - else { - action = activeSnap(t) ? BIG_GEARS : NO_GEARS; - } + action = activeSnap(t) ? BIG_GEARS : NO_GEARS; if (action == BIG_GEARS && (t->modifiers & MOD_PRECISION)) { action = SMALL_GEARS; diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt new file mode 100644 index 00000000000..b4b2fd12cef --- /dev/null +++ b/source/blender/editors/util/CMakeLists.txt @@ -0,0 +1,34 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../include + ../../../../intern/guardedalloc + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_util "${SRC}" "${INC}") diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index 6adf7305cd6..2796e708932 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,11 +31,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_curve_types.h" -#include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "BLI_blenlib.h" #include "BLI_editVert.h" @@ -46,6 +43,7 @@ #include "ED_armature.h" #include "ED_mesh.h" +#include "ED_object.h" #include "ED_sculpt.h" #include "ED_util.h" @@ -53,6 +51,29 @@ /* ********* general editor util funcs, not BKE stuff please! ********* */ +void ED_editors_init(bContext *C) +{ + Main *bmain= CTX_data_main(C); + Scene *sce= CTX_data_scene(C); + Object *ob, *obact= (sce && sce->basact)? sce->basact->object: NULL; + ID *data; + + /* toggle on modes for objects that were saved with these enabled. for + e.g. linked objects we have to ensure that they are actually the + active object in this scene. */ + for(ob=bmain->object.first; ob; ob=ob->id.next) { + int mode= ob->mode; + + if(mode && (mode != OB_MODE_POSE)) { + ob->mode= 0; + data= ob->data; + + if(ob == obact && !ob->id.lib && !(data && data->lib)) + ED_object_toggle_modes(C, mode); + } + } +} + /* frees all editmode stuff */ void ED_editors_exit(bContext *C) { @@ -67,7 +88,8 @@ void ED_editors_exit(bContext *C) Object *ob= sce->obedit; /* global in meshtools... */ - mesh_octree_table(ob, NULL, NULL, 'e'); + mesh_octree_table(NULL, NULL, NULL, 'e'); + mesh_mirrtopo_table(NULL, 'e'); if(ob) { if(ob->type==OB_MESH) { @@ -94,8 +116,10 @@ void ED_editors_exit(bContext *C) Object *ob= sce->basact->object; /* if weight-painting is on, free mesh octree data */ - if(ob->mode & OB_MODE_WEIGHT_PAINT) - mesh_octree_table(ob, NULL, NULL, 'e'); + if(ob->mode & OB_MODE_WEIGHT_PAINT) { + mesh_octree_table(NULL, NULL, NULL, 'e'); + mesh_mirrtopo_table(NULL, 'e'); + } } } diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index db4dc4efb2c..949bf30c4fd 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -34,12 +34,8 @@ #include "MEM_guardedalloc.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" -#include "DNA_scene_types.h" -#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_depsgraph.h" @@ -51,7 +47,6 @@ #include "BKE_utildefines.h" -#include "ED_util.h" #include "ED_mesh.h" #include "UI_interface.h" @@ -81,7 +76,7 @@ void undo_editmode_menu(void) // history menu /* ********************************************************************* */ /* ****** XXX ***** */ -void error() {} +void error(const char *dummy) {} /* ****** XXX ***** */ diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c index fc193373327..a5c0bfeb73a 100644 --- a/source/blender/editors/util/numinput.c +++ b/source/blender/editors/util/numinput.c @@ -34,7 +34,6 @@ #include "BKE_utildefines.h" /* ABS */ #include "WM_types.h" -#include "DNA_windowmanager_types.h" #include "ED_numinput.h" @@ -170,13 +169,13 @@ char handleNumInput(NumInput *n, wmEvent *event) if (!n->ctrl[idx]) n->ctrl[idx] = 1; - n->val[idx] += n->increment; + n->val[idx] += n->increment; break; case NUM_MODAL_INCREMENT_DOWN: if (!n->ctrl[idx]) n->ctrl[idx] = 1; - n->val[idx] -= n->increment; + n->val[idx] -= n->increment; break; default: return 0; diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index cf60490055f..636ce9dcec5 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -34,13 +34,7 @@ #include "MEM_guardedalloc.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" #include "DNA_object_types.h" -#include "DNA_screen_types.h" -#include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_userdef_types.h" #include "BKE_blender.h" #include "BKE_context.h" @@ -69,8 +63,6 @@ #include "WM_api.h" #include "WM_types.h" -#include "UI_interface.h" -#include "UI_resources.h" #include "util_intern.h" @@ -140,6 +132,8 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) undo_editmode_name(C, undoname); else undo_editmode_step(C, step); + + WM_event_add_notifier(C, NC_GEOM|ND_DATA, NULL); } } else { @@ -242,7 +236,7 @@ void ED_OT_undo(wmOperatorType *ot) { /* identifiers */ ot->name= "Undo"; - ot->description= "Undo previous action"; + ot->description= "Undo previous action"; ot->idname= "ED_OT_undo"; /* api callbacks */ @@ -254,7 +248,7 @@ void ED_OT_redo(wmOperatorType *ot) { /* identifiers */ ot->name= "Redo"; - ot->description= "Redo previous action"; + ot->description= "Redo previous action"; ot->idname= "ED_OT_redo"; /* api callbacks */ diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h index 75475f4abef..73675ab4ef9 100644 --- a/source/blender/editors/util/util_intern.h +++ b/source/blender/editors/util/util_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt new file mode 100644 index 00000000000..bb6caece99f --- /dev/null +++ b/source/blender/editors/uvedit/CMakeLists.txt @@ -0,0 +1,36 @@ +# $Id: CMakeLists.txt 12931 2007-12-17 18:20:48Z theeth $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC *.c) + +SET(INC + ../../blenkernel + ../../blenlib + ../../bmesh + ../include + ../../../../intern/guardedalloc + ../../../../intern/opennl/extern + ../../makesdna + ../../makesrna + ../../windowmanager +) + +BLENDERLIB(bf_editor_uvedit "${SRC}" "${INC}") diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index f13ea513987..7c6c37872f7 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -62,7 +62,6 @@ static void drawcursor_sima(SpaceImage *sima, ARegion *ar) { - View2D *v2d= &ar->v2d; float zoomx, zoomy, w, h; int width, height; @@ -73,7 +72,7 @@ static void drawcursor_sima(SpaceImage *sima, ARegion *ar) h= zoomy*height/256.0f; cpack(0xFFFFFF); - glTranslatef(v2d->cursor[0], v2d->cursor[1], 0.0f); + glTranslatef(sima->cursor[0], sima->cursor[1], 0.0f); fdrawline(-0.05/w, 0, 0, 0.05/h); fdrawline(0, 0.05/h, 0.05/w, 0); fdrawline(0.05/w, 0, 0, -0.05/h); @@ -101,7 +100,7 @@ static void drawcursor_sima(SpaceImage *sima, ARegion *ar) fdrawline(0, -0.020/h, 0, -0.1/h); fdrawline(0, 0.1/h, 0, 0.020/h); - glTranslatef(-v2d->cursor[0], -v2d->cursor[1], 0.0f); + glTranslatef(-sima->cursor[0], -sima->cursor[1], 0.0f); setlinestyle(0); } @@ -758,7 +757,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) pointsize = UI_GetThemeValuef(TH_FACEDOT_SIZE); glPointSize(pointsize); // TODO - drawobject.c changes this value after - Investigate! - /* unselected faces */ + /* unselected faces */ UI_ThemeColor(TH_WIRE); bglBegin(GL_POINTS); @@ -792,7 +791,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) /* 6. draw uv vertices */ if(drawfaces != 2) { /* 2 means Mesh Face Mode */ - /* unselected uvs */ + /* unselected uvs */ UI_ThemeColor(TH_VERTEX); pointsize = UI_GetThemeValuef(TH_VERTEX_SIZE); glPointSize(pointsize); @@ -812,7 +811,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) /* pinned uvs */ /* give odd pointsizes odd pin pointsizes */ - glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0)); + glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0)); cpack(0xFF); bglBegin(GL_POINTS); @@ -859,12 +858,6 @@ void draw_uvedit_main(SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedi show_uvshadow= ED_space_image_show_uvshadow(sima, obedit); if(show_uvedit || show_uvshadow) { - /* this is basically the same object_handle_update as in the 3d view, - * here we have to do it as well for the object we are editing if we - * are displaying the final result */ - if(obedit && (sima->flag & SI_DRAWSHADOW)) - object_handle_update(scene, obedit); - if(show_uvshadow) draw_uvs_shadow(sima, obedit); else diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h index 59f19d85209..dedde856d4e 100644 --- a/source/blender/editors/uvedit/uvedit_intern.h +++ b/source/blender/editors/uvedit/uvedit_intern.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 1f97aab8e1a..92ddc097041 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -35,13 +35,10 @@ #include "MEM_guardedalloc.h" #include "DNA_object_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_image_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_windowmanager_types.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -66,7 +63,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "WM_api.h" #include "WM_types.h" @@ -2514,7 +2510,7 @@ int circle_select_exec(bContext *C, wmOperator *op) MTexPoly *tface; int x, y, radius, width, height, select; float zoomx, zoomy, offset[2], ellipse[2]; - int gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); + int gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); /* get operator properties */ select= (gesture_mode == GESTURE_MODAL_SELECT); @@ -2580,17 +2576,17 @@ static void snap_uv_to_pixel(float *uvco, float w, float h) uvco[1] = ((float)((int)((uvco[1]*h) + 0.5f)))/h; } -static void snap_cursor_to_pixels(SpaceImage *sima, View2D *v2d) +static void snap_cursor_to_pixels(SpaceImage *sima) { int width= 0, height= 0; ED_space_image_size(sima, &width, &height); - snap_uv_to_pixel(v2d->cursor, width, height); + snap_uv_to_pixel(sima->cursor, width, height); } -static int snap_cursor_to_selection(Scene *scene, Image *ima, Object *obedit, View2D *v2d) +static int snap_cursor_to_selection(Scene *scene, Image *ima, Object *obedit, SpaceImage *sima) { - return uvedit_center(scene, ima, obedit, v2d->cursor, 0); + return uvedit_center(scene, ima, obedit, sima->cursor, 0); } static int snap_cursor_exec(bContext *C, wmOperator *op) @@ -2599,23 +2595,22 @@ static int snap_cursor_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Image *ima= CTX_data_edit_image(C); - ARegion *ar= CTX_wm_region(C); int change= 0; switch(RNA_boolean_get(op->ptr, "target")) { case 0: - snap_cursor_to_pixels(sima, &ar->v2d); + snap_cursor_to_pixels(sima); change= 1; break; case 1: - change= snap_cursor_to_selection(scene, ima, obedit, &ar->v2d); + change= snap_cursor_to_selection(scene, ima, obedit, sima); break; } if(!change) return OPERATOR_CANCELLED; - ED_region_tag_redraw(ar); + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, sima); return OPERATOR_FINISHED; } @@ -2643,7 +2638,7 @@ void UV_OT_snap_cursor(wmOperatorType *ot) /* ******************** snap selection operator **************** */ -static int snap_uvs_to_cursor(Scene *scene, Image *ima, Object *obedit, View2D *v2d) +static int snap_uvs_to_cursor(Scene *scene, Image *ima, Object *obedit, SpaceImage *sima) { BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; BMFace *efa; @@ -2661,7 +2656,7 @@ static int snap_uvs_to_cursor(Scene *scene, Image *ima, Object *obedit, View2D * BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { if(uvedit_uv_selected(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - VECCOPY2D(luv->uv, v2d->cursor); + VECCOPY2D(luv->uv, sima->cursor); change= 1; } } @@ -2804,7 +2799,6 @@ static int snap_selection_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Image *ima= CTX_data_edit_image(C); - ARegion *ar= CTX_wm_region(C); int change= 0; switch(RNA_boolean_get(op->ptr, "target")) { @@ -2812,7 +2806,7 @@ static int snap_selection_exec(bContext *C, wmOperator *op) change= snap_uvs_to_pixels(sima, scene, obedit); break; case 1: - change= snap_uvs_to_cursor(scene, ima, obedit, &ar->v2d); + change= snap_uvs_to_cursor(scene, ima, obedit, sima); break; case 2: change= snap_uvs_to_adjacent_unselected(scene, ima, obedit); @@ -3085,14 +3079,14 @@ void UV_OT_reveal(wmOperatorType *ot) static int set_2d_cursor_exec(bContext *C, wmOperator *op) { - ARegion *ar= CTX_wm_region(C); + SpaceImage *sima = CTX_wm_space_image(C); float location[2]; RNA_float_get_array(op->ptr, "location", location); - ar->v2d.cursor[0]= location[0]; - ar->v2d.cursor[1]= location[1]; + sima->cursor[0]= location[0]; + sima->cursor[1]= location[1]; - ED_area_tag_redraw(CTX_wm_area(C)); + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, NULL); return OPERATOR_FINISHED; } @@ -3143,7 +3137,7 @@ static int set_tile_exec(bContext *C, wmOperator *op) RNA_int_get_array(op->ptr, "tile", tile); ED_uvedit_set_tile(C, CTX_data_scene(C), CTX_data_edit_object(C), ima, tile[0] + ima->xrep*tile[1]); - ED_area_tag_redraw(CTX_wm_area(C)); + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, NULL); return OPERATOR_FINISHED; } @@ -3265,7 +3259,7 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "UV_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "UV_OT_weld", WKEY, KM_PRESS, 0, 0); + WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_weldalign", WKEY, KM_PRESS, 0, 0); /* uv operations */ WM_keymap_add_item(keymap, "UV_OT_stitch", VKEY, KM_PRESS, 0, 0); @@ -3290,7 +3284,7 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) /* menus */ WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_snap", SKEY, KM_PRESS, KM_SHIFT, 0); - ED_object_generic_keymap(keyconf, keymap, TRUE); + ED_object_generic_keymap(keyconf, keymap, 1); transform_keymap_for_space(keyconf, keymap, SPACE_IMAGE); } diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index b2d20eb7526..4ab04520582 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -388,7 +388,7 @@ static float p_face_area(PFace *f) static float p_area_signed(float *v1, float *v2, float *v3) { return 0.5f*(((v2[0] - v1[0])*(v3[1] - v1[1])) - - ((v3[0] - v1[0])*(v2[1] - v1[1]))); + ((v3[0] - v1[0])*(v2[1] - v1[1]))); } static float p_face_uv_area_signed(PFace *f) @@ -397,30 +397,30 @@ static float p_face_uv_area_signed(PFace *f) PVert *v1 = e1->vert, *v2 = e2->vert, *v3 = e3->vert; return 0.5f*(((v2->uv[0] - v1->uv[0])*(v3->uv[1] - v1->uv[1])) - - ((v3->uv[0] - v1->uv[0])*(v2->uv[1] - v1->uv[1]))); + ((v3->uv[0] - v1->uv[0])*(v2->uv[1] - v1->uv[1]))); } static float p_edge_length(PEdge *e) { - PVert *v1 = e->vert, *v2 = e->next->vert; - float d[3]; + PVert *v1 = e->vert, *v2 = e->next->vert; + float d[3]; - d[0] = v2->co[0] - v1->co[0]; - d[1] = v2->co[1] - v1->co[1]; - d[2] = v2->co[2] - v1->co[2]; + d[0] = v2->co[0] - v1->co[0]; + d[1] = v2->co[1] - v1->co[1]; + d[2] = v2->co[2] - v1->co[2]; - return sqrt(d[0]*d[0] + d[1]*d[1] + d[2]*d[2]); + return sqrt(d[0]*d[0] + d[1]*d[1] + d[2]*d[2]); } static float p_edge_uv_length(PEdge *e) { - PVert *v1 = e->vert, *v2 = e->next->vert; - float d[3]; + PVert *v1 = e->vert, *v2 = e->next->vert; + float d[3]; - d[0] = v2->uv[0] - v1->uv[0]; - d[1] = v2->uv[1] - v1->uv[1]; + d[0] = v2->uv[0] - v1->uv[0]; + d[1] = v2->uv[1] - v1->uv[1]; - return sqrt(d[0]*d[0] + d[1]*d[1]); + return sqrt(d[0]*d[0] + d[1]*d[1]); } static void p_chart_uv_bbox(PChart *chart, float *minv, float *maxv) @@ -522,7 +522,7 @@ static PEdge *p_boundary_edge_next(PEdge *e) static PEdge *p_boundary_edge_prev(PEdge *e) { - PEdge *we = e, *last; + PEdge *we = e, *last; do { last = we; @@ -591,7 +591,7 @@ static void p_vert_load_pin_select_uvs(PHandle *handle, PVert *v) if (e->flag & PEDGE_SELECT) v->flag |= PVERT_SELECT; - if (e->flag & PEDGE_PIN) { + if (e->flag & PEDGE_PIN) { pinuv[0] += e->orig_uv[0]*handle->aspx; pinuv[1] += e->orig_uv[1]*handle->aspy; npins++; @@ -823,7 +823,7 @@ static PBool p_edge_has_pair(PHandle *handle, PEdge *e, PEdge **pair, PBool impl /* don't connect seams and t-junctions */ if ((pe->flag & PEDGE_SEAM) || *pair || - (impl && p_edge_implicit_seam(e, pe))) { + (impl && p_edge_implicit_seam(e, pe))) { *pair = NULL; return P_FALSE; } @@ -1032,8 +1032,8 @@ static PFace *p_face_add(PHandle *handle) } static PFace *p_face_add_construct(PHandle *handle, ParamKey key, ParamKey *vkeys, - float *co[3], float *uv[3], int i1, int i2, int i3, - ParamBool *pin, ParamBool *select) + float *co[3], float *uv[3], int i1, int i2, int i3, + ParamBool *pin, ParamBool *select) { PFace *f = p_face_add(handle); PEdge *e1 = f->edge, *e2 = e1->next, *e3 = e2->next; @@ -1124,8 +1124,8 @@ static PBool p_quad_split_direction(PHandle *handle, float **co, PHashKey *vkeys static void p_chart_boundaries(PChart *chart, int *nboundaries, PEdge **outer) { - PEdge *e, *be; - float len, maxlen = -1.0; + PEdge *e, *be; + float len, maxlen = -1.0; if (nboundaries) *nboundaries = 0; @@ -1133,29 +1133,29 @@ static void p_chart_boundaries(PChart *chart, int *nboundaries, PEdge **outer) *outer = NULL; for (e=chart->edges; e; e=e->nextlink) { - if (e->pair || (e->flag & PEDGE_DONE)) - continue; + if (e->pair || (e->flag & PEDGE_DONE)) + continue; if (nboundaries) (*nboundaries)++; - len = 0.0f; + len = 0.0f; be = e; do { - be->flag |= PEDGE_DONE; - len += p_edge_length(be); + be->flag |= PEDGE_DONE; + len += p_edge_length(be); be = be->next->vert->edge; - } while(be != e); + } while(be != e); - if (outer && (len > maxlen)) { + if (outer && (len > maxlen)) { *outer = e; - maxlen = len; - } - } + maxlen = len; + } + } for (e=chart->edges; e; e=e->nextlink) - e->flag &= ~PEDGE_DONE; + e->flag &= ~PEDGE_DONE; } static float p_edge_boundary_angle(PEdge *e) @@ -1272,8 +1272,8 @@ static void p_chart_fill_boundaries(PChart *chart, PEdge *outer) for (e=chart->edges; e; e=e->nextlink) { /* enext = e->nextlink; - as yet unused */ - if (e->pair || (e->flag & PEDGE_FILLED)) - continue; + if (e->pair || (e->flag & PEDGE_FILLED)) + continue; nedges = 0; be = e; @@ -1285,7 +1285,7 @@ static void p_chart_fill_boundaries(PChart *chart, PEdge *outer) if (e != outer) p_chart_fill_boundary(chart, e, nedges); - } + } } #if 0 @@ -1848,7 +1848,7 @@ static PBool p_collapse_allowed(PEdge *edge, PEdge *pair) return P_FALSE; return (p_collapse_allowed_topologic(edge, pair) && - p_collapse_allowed_geometric(edge, pair)); + p_collapse_allowed_geometric(edge, pair)); } static float p_collapse_cost(PEdge *edge, PEdge *pair) @@ -2793,7 +2793,7 @@ static PBool p_chart_symmetry_pins(PChart *chart, PEdge *outer, PVert **pin1, PV float maxlen = 0.0f, curlen = 0.0f, totlen = 0.0f, firstlen = 0.0f; float len1, len2; - /* find longest series of verts split in the chart itself, these are + /* find longest series of verts split in the chart itself, these are marked during construction */ be = outer; lastbe = p_boundary_edge_prev(be); @@ -2804,7 +2804,7 @@ static PBool p_chart_symmetry_pins(PChart *chart, PEdge *outer, PVert **pin1, PV nextbe = p_boundary_edge_next(be); if ((be->vert->flag & PVERT_SPLIT) || - (lastbe->vert->flag & nextbe->vert->flag & PVERT_SPLIT)) { + (lastbe->vert->flag & nextbe->vert->flag & PVERT_SPLIT)) { if (!cure) { if (be == outer) firste1 = be; @@ -3192,11 +3192,11 @@ static float p_face_stretch(PFace *f) copy_v3_v3(tmp, v2->co); mul_v3_fl(tmp, (v3->uv[1] - v1->uv[1])); - add_v3_v3v3(Ps, Ps, tmp); + add_v3_v3(Ps, tmp); copy_v3_v3(tmp, v3->co); mul_v3_fl(tmp, (v1->uv[1] - v2->uv[1])); - add_v3_v3v3(Ps, Ps, tmp); + add_v3_v3(Ps, tmp); mul_v3_fl(Ps, w); @@ -3205,11 +3205,11 @@ static float p_face_stretch(PFace *f) copy_v3_v3(tmp, v2->co); mul_v3_fl(tmp, (v1->uv[0] - v3->uv[0])); - add_v3_v3v3(Pt, Pt, tmp); + add_v3_v3(Pt, tmp); copy_v3_v3(tmp, v3->co); mul_v3_fl(tmp, (v2->uv[0] - v1->uv[0])); - add_v3_v3v3(Pt, Pt, tmp); + add_v3_v3(Pt, tmp); mul_v3_fl(Pt, w); @@ -4029,7 +4029,7 @@ static void p_smooth(PChart *chart) MEM_freeN(nodesx); MEM_freeN(nodesy); - arena = BLI_memarena_new(1<<16); + arena = BLI_memarena_new(1<<16, "param smooth arena"); root = p_node_new(arena, tri, esize*2, minv, maxv, 0); for (v=chart->verts; v; v=v->nextlink) @@ -4049,7 +4049,7 @@ ParamHandle *param_construct_begin() PHandle *handle = MEM_callocN(sizeof*handle, "PHandle"); handle->construction_chart = p_chart_new(handle); handle->state = PHANDLE_STATE_ALLOCATED; - handle->arena = BLI_memarena_new((1<<16)); + handle->arena = BLI_memarena_new((1<<16), "param construct arena"); handle->aspx = 1.0f; handle->aspy = 1.0f; @@ -4074,7 +4074,7 @@ void param_delete(ParamHandle *handle) int i; param_assert((phandle->state == PHANDLE_STATE_ALLOCATED) || - (phandle->state == PHANDLE_STATE_CONSTRUCTED)); + (phandle->state == PHANDLE_STATE_CONSTRUCTED)); for (i = 0; i < phandle->ncharts; i++) p_chart_delete(phandle->charts[i]); @@ -4095,8 +4095,8 @@ void param_delete(ParamHandle *handle) } void param_face_add(ParamHandle *handle, ParamKey key, int nverts, - ParamKey *vkeys, float **co, float **uv, - ParamBool *pin, ParamBool *select) + ParamKey *vkeys, float **co, float **uv, + ParamBool *pin, ParamBool *select) { PHandle *phandle = (PHandle*)handle; diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h index 8d440e2e652..912270da9ca 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.h +++ b/source/blender/editors/uvedit/uvedit_parametrizer.h @@ -22,7 +22,7 @@ typedef enum ParamBool { - vertices are implicitly created - in construct_end the mesh will be split up according to the seams - the resulting charts must be: - - manifold, connected, open (at least one boundary loop) + - manifold, connected, open (at least one boundary loop) - output will be written to the uv pointers */ @@ -33,16 +33,16 @@ void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy); int p_face_exists(ParamHandle *handle, ParamKey *vkeys, int i1, int i2, int i3); void param_face_add(ParamHandle *handle, - ParamKey key, - int nverts, - ParamKey *vkeys, - float **co, - float **uv, + ParamKey key, + int nverts, + ParamKey *vkeys, + float **co, + float **uv, ParamBool *pin, ParamBool *select); void param_edge_set_seam(ParamHandle *handle, - ParamKey *vkeys); + ParamKey *vkeys); void param_construct_end(ParamHandle *handle, ParamBool fill, ParamBool impl); void param_delete(ParamHandle *chart); @@ -51,8 +51,8 @@ void param_delete(ParamHandle *chart); ----------------------------- - charts with less than two pinned vertices are assigned 2 pins - lscm is divided in three steps: - - begin: compute matrix and it's factorization (expensive) - - solve using pinned coordinates (cheap) + - begin: compute matrix and it's factorization (expensive) + - solve using pinned coordinates (cheap) - end: clean up - uv coordinates are allowed to change within begin/end, for quick re-solving diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 6275549e3c5..d0fee1b3620 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -34,12 +34,9 @@ #include "MEM_guardedalloc.h" #include "DNA_camera_types.h" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" #include "BKE_context.h" #include "BKE_customdata.h" @@ -55,6 +52,7 @@ #include "BLI_editVert.h" #include "BLI_scanfill.h" #include "BLI_array.h" +#include "BLI_uvproject.h" #include "PIL_time.h" @@ -67,7 +65,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "UI_interface.h" #include "WM_api.h" #include "WM_types.h" @@ -450,7 +447,7 @@ void UV_OT_minimize_stretch(wmOperatorType *ot) ot->name= "Minimize Stretch"; ot->idname= "UV_OT_minimize_stretch"; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - ot->description="DOC_BROKEN"; + ot->description="Reduce UV stretching by relaxing angles"; /* api callbacks */ ot->exec= minimize_stretch_exec; @@ -898,115 +895,7 @@ void UV_OT_unwrap(wmOperatorType *ot) } /**************** Project From View operator **************/ - -static void uv_from_view_bounds(float target[2], float source[3], float rotmat[4][4]) -{ - float pv[3]; - - mul_m4_v3(rotmat, pv); - - /* ortho projection */ - target[0] = -pv[0]; - target[1] = pv[2]; -} - -typedef struct UvCameraInfo { - float camangle; - float camsize; - float xasp, yasp; - float shiftx, shifty; - float rotmat[4][4]; - float caminv[4][4]; - short do_persp, do_pano; -} UvCameraInfo; - -//static void uv_from_camera(float camsize, float camangle, float xasp, float yasp, float target[2], float source[3], float rotmat[4][4], float caminv[4][4], int persp, int pano) -static void uv_from_camera(UvCameraInfo *uci, float target[2], float source[3]) -{ - float pv4[4]; - - copy_v3_v3(pv4, source); - pv4[3]= 1.0; - - /* rotmat is the object matrix in this case */ - mul_m4_v4(uci->rotmat, pv4); - - /* caminv is the inverse camera matrix */ - mul_m4_v4(uci->caminv, pv4); - - if(uci->do_pano) { - float angle= atan2f(pv4[0], -pv4[2]) / (M_PI * 2.0); /* angle around the camera */ - if (uci->do_persp==0) { - target[0] = angle; /* no correct method here, just map to 0-1 */ - target[1] = pv4[1] / uci->camsize; - } - else { - float vec2d[2]= {pv4[0], pv4[2]}; /* 2D position from the camera */ - target[0] = angle * (M_PI / uci->camangle); - target[1] = pv4[1] / (len_v2(vec2d) * uci->camsize); - } - } - else { - if (pv4[2]==0.0f) pv4[2]=0.00001f; /* don't allow div by 0 */ - - if (uci->do_persp==0) { - target[0]=(pv4[0]/uci->camsize) * uci->xasp; - target[1]=(pv4[1]/uci->camsize) * uci->yasp; - } - else { - target[0]=(-pv4[0]*((1.0f/uci->camsize)/pv4[2])*uci->xasp) / 2.0f; - target[1]=(-pv4[1]*((1.0f/uci->camsize)/pv4[2])*uci->yasp) / 2.0f; - } - } - - /* adds camera shift + 0.5 */ - target[0] += uci->shiftx; - target[1] += uci->shifty; -} - -static void uv_from_view(ARegion *ar, float target[2], float source[3], float rotmat[4][4]) -{ - RegionView3D *rv3d = ar->regiondata; - float pv[3], pv4[4], dx, dy, x= 0.0, y= 0.0; - - mul_m4_v3(rotmat, pv); - - dx= ar->winx; - dy= ar->winy; - - copy_v3_v3(pv4, source); - pv4[3]= 1.0; - - /* rotmat is the object matrix in this case */ - mul_m4_v4(rotmat, pv4); - - /* almost project_short */ - mul_m4_v4(rv3d->persmat, pv4); - if(fabs(pv4[3]) > 0.00001) { /* avoid division by zero */ - target[0] = dx/2.0 + (dx/2.0)*pv4[0]/pv4[3]; - target[1] = dy/2.0 + (dy/2.0)*pv4[1]/pv4[3]; - } - else { - /* scaling is lost but give a valid result */ - target[0] = dx/2.0 + (dx/2.0)*pv4[0]; - target[1] = dy/2.0 + (dy/2.0)*pv4[1]; - } - - /* v3d->persmat seems to do this funky scaling */ - if(dx > dy) { - y= (dx-dy)/2.0; - dy = dx; - } - else { - x= (dy-dx)/2.0; - dx = dy; - } - - target[0]= (x + target[0])/dx; - target[1]= (y + target[1])/dy; -} - -static int from_view_exec(bContext *C, wmOperator *op) +static int uv_from_view_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); @@ -1040,48 +929,25 @@ static int from_view_exec(bContext *C, wmOperator *op) BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - uv_from_view_bounds(luv->uv, l->v->co, rotmat); + project_from_view_ortho(luv->uv, l->v->co, rotmat); } } } else if (camera) { - UvCameraInfo uci; - - uci.do_pano = (camera->flag & CAM_PANORAMA); - uci.do_persp = (camera->type==CAM_PERSP); - - uci.camangle= DEG2RAD(camera->angle)/2.0f; - uci.camsize= uci.do_persp ? uci.camsize= tanf(uci.camangle) : camera->ortho_scale; - - if (invert_m4_m4(uci.caminv, v3d->camera->obmat)) { - - /* normal projection */ - copy_m4_m4(uci.rotmat, obedit->obmat); - - /* also make aspect ratio adjustment factors */ - if (scene->r.xsch > scene->r.ysch) { - uci.xasp= 1.0f; - uci.yasp= (float)(scene->r.xsch)/(float)(scene->r.ysch); - } - else { - uci.xasp= (float)(scene->r.ysch)/(float)(scene->r.xsch); - uci.yasp= 1.0f; - } - - - /* include 0.5f here to move the UVs into the center */ - uci.shiftx = 0.5f - camera->shiftx; - uci.shifty = 0.5f - camera->shifty; - + struct UvCameraInfo *uci= project_camera_info(v3d->camera, obedit->obmat, scene->r.xsch, scene->r.ysch); + + if(uci) { BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { if (!BM_TestHFlag(efa, BM_SELECT)) continue; BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - uv_from_camera(&uci, luv->uv, l->v->co); + project_from_camera(luv->uv, l->v->co, uci); } } + + MEM_freeN(uci); } } else { @@ -1093,7 +959,7 @@ static int from_view_exec(bContext *C, wmOperator *op) BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - uv_from_view(ar, luv->uv, l->v->co, rotmat); + project_from_view(luv->uv, l->v->co, rv3d->persmat, rotmat, ar->winx, ar->winy); } } } @@ -1106,7 +972,7 @@ static int from_view_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int from_view_poll(bContext *C) +static int uv_from_view_poll(bContext *C) { RegionView3D *rv3d= CTX_wm_region_view3d(C); @@ -1124,8 +990,8 @@ void UV_OT_from_view(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* api callbacks */ - ot->exec= from_view_exec; - ot->poll= from_view_poll; + ot->exec= uv_from_view_exec; + ot->poll= uv_from_view_poll; /* properties */ RNA_def_boolean(ot->srna, "orthographic", 0, "Orthographic", "Use orthographic projection."); diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 831dbd6bdaa..126cddf852f 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -28,7 +28,7 @@ FILE(GLOB SRC intern/*.c) SET(INC . ../blenlib ../blenkernel ../makesdna ../makesrna ../include - ../../../extern/glew/include ../bmesh ../../../intern/guardedalloc ../../../intern/smoke/extern ../imbuf) + ../../../extern/glew/include ../../../intern/guardedalloc ../../../intern/smoke/extern ../imbuf) IF(WIN32) INCLUDE_DIRECTORIES(${PTHREADS_INC}) diff --git a/source/blender/gpu/gpu_buffers.h b/source/blender/gpu/GPU_buffers.h similarity index 94% rename from source/blender/gpu/gpu_buffers.h rename to source/blender/gpu/GPU_buffers.h index 26612a57c85..6f552e087d7 100644 --- a/source/blender/gpu/gpu_buffers.h +++ b/source/blender/gpu/GPU_buffers.h @@ -1,5 +1,5 @@ /** - * $Id: gpu_buffers.h 23816 2009-10-13 19:02:30Z nicholasbishop $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -49,7 +49,9 @@ #endif struct DerivedMesh; +struct DMGridData; struct GHash; +struct DMGridData; /* V - vertex, N - normal, T - uv, C - color F - float, UB - unsigned byte */ @@ -69,8 +71,9 @@ typedef struct GPUBuffer typedef struct GPUBufferPool { - int size; /* number of allocated buffers stored */ - GPUBuffer* buffers[MAX_FREE_GPU_BUFFERS]; + int size; /* number of allocated buffers stored */ + int maxsize; /* size of the array */ + GPUBuffer **buffers; } GPUBufferPool; typedef struct GPUBufferMaterial @@ -119,7 +122,8 @@ typedef struct GPUAttrib } GPUAttrib; GPUBufferPool *GPU_buffer_pool_new(); -void GPU_buffer_pool_free( GPUBufferPool *pool ); /* TODO: Find a place where to call this function on exit */ +void GPU_buffer_pool_free( GPUBufferPool *pool ); +void GPU_buffer_pool_free_unused( GPUBufferPool *pool ); GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool ); void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool ); @@ -137,7 +141,7 @@ void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert, void *GPU_build_grid_buffers(struct DMGridData **grids, int *grid_indices, int totgrid, int gridsize); void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids, - int *grid_indices, int totgrid, int gridsize); + int *grid_indices, int totgrid, int gridsize, int smooth); void GPU_draw_buffers(void *buffers); void GPU_free_buffers(void *buffers); diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h index d602d75bb35..92bf43e9a5a 100644 --- a/source/blender/gpu/GPU_draw.h +++ b/source/blender/gpu/GPU_draw.h @@ -117,11 +117,15 @@ int GPU_update_image_time(struct Image *ima, double time); int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int tfmode, int compare, int mipmap); void GPU_free_image(struct Image *ima); void GPU_free_images(void); +void GPU_free_images_anim(void); /* smoke drawing functions */ void GPU_free_smoke(struct SmokeModifierData *smd); void GPU_create_smoke(struct SmokeModifierData *smd, int highres); +/* Delayed free of OpenGL buffers by main thread */ +void GPU_free_unused_buffers(void); + #ifdef __cplusplus } #endif diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index 90b0ac2aee9..a7f43d3b0ae 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -57,9 +57,11 @@ typedef struct GPUShader GPUShader; void GPU_extensions_disable(void); void GPU_extensions_init(void); /* call this before running any of the functions below */ void GPU_extensions_exit(void); +int GPU_print_error(char *str); + int GPU_glsl_support(void); int GPU_non_power_of_two_support(void); -int GPU_print_error(char *str); +int GPU_color_depth(void); /* GPU Types */ @@ -73,17 +75,17 @@ typedef enum GPUDeviceType { } GPUDeviceType; typedef enum GPUOSType { - GPU_OS_WIN = (1<<16), - GPU_OS_MAC = (1<<17), - GPU_OS_UNIX = (1<<18), + GPU_OS_WIN = (1<<8), + GPU_OS_MAC = (1<<9), + GPU_OS_UNIX = (1<<10), GPU_OS_ANY = (0xff00) } GPUOSType; typedef enum GPUDriverType { - GPU_DRIVER_OFFICIAL = (1<<24), - GPU_DRIVER_OPENSOURCE = (1<<25), - GPU_DRIVER_SOFTWARE = (1<<26), - GPU_DRIVER_UNKNOWN = (0xff0000) + GPU_DRIVER_OFFICIAL = (1<<16), + GPU_DRIVER_OPENSOURCE = (1<<17), + GPU_DRIVER_SOFTWARE = (1<<18), + GPU_DRIVER_ANY = (0xff0000) } GPUDriverType; int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver); @@ -91,14 +93,14 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver); /* GPU Texture - always returns unsigned char RGBA textures - if texture with non square dimensions is created, depending on the - graphics card capabilities the texture may actually be stored in a + graphics card capabilities the texture may actually be stored in a larger texture with power of two dimensions. the actual dimensions may be queried with GPU_texture_opengl_width/height. GPU_texture_coord_2f calls glTexCoord2f with the coordinates adjusted for this. - can use reference counting: - - reference counter after GPU_texture_create is 1 - - GPU_texture_ref increases by one - - GPU_texture_free decreases by one, and frees if 0 + - reference counter after GPU_texture_create is 1 + - GPU_texture_ref increases by one + - GPU_texture_free decreases by one, and frees if 0 - if created with from_blender, will not free the texture */ @@ -123,10 +125,10 @@ int GPU_texture_opengl_height(GPUTexture *tex); /* GPU Framebuffer - this is a wrapper for an OpenGL framebuffer object (FBO). in practice - multiple FBO's may be created, to get around limitations on the number + multiple FBO's may be created, to get around limitations on the number of attached textures and the dimension requirements. - after any of the GPU_framebuffer_* functions, GPU_framebuffer_restore must - be called before rendering to the window framebuffer again */ + be called before rendering to the window framebuffer again */ GPUFrameBuffer *GPU_framebuffer_create(); int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex); diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index 63baeb99b5d..7f6e9d02a80 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -159,7 +159,7 @@ void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp); void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4]); -void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy); +void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float power); int GPU_lamp_shadow_layer(GPULamp *lamp); #ifdef __cplusplus diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript index 9f59dd4cf47..4f1cdc2ce76 100644 --- a/source/blender/gpu/SConscript +++ b/source/blender/gpu/SConscript @@ -5,9 +5,12 @@ sources = env.Glob('intern/*.c') defs = [ 'GLEW_STATIC' ] -incs = '../blenlib ../blenkernel ../makesdna ../include ../bmesh' +incs = '../blenlib ../blenkernel ../makesdna ../include' incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .' +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] + incs += ' ' + env['BF_OPENGL_INC'] env.BlenderLib ( 'bf_gpu', sources, Split(incs), defines = defs, libtype=['core','player'], priority=[160,110] ) diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index b1c869c6d8d..bc90ddb23b7 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -1,5 +1,5 @@ /** - * $Id: gpu_buffers.c 23816 2009-10-13 19:02:30Z nicholasbishop $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -38,8 +38,9 @@ #include "MEM_guardedalloc.h" -#include "BLI_math.h" #include "BLI_ghash.h" +#include "BLI_math.h" +#include "BLI_threads.h" #include "DNA_meshdata_types.h" @@ -48,7 +49,7 @@ #include "DNA_userdef_types.h" -#include "gpu_buffers.h" +#include "GPU_buffers.h" #define GPU_BUFFER_VERTEX_STATE 1 #define GPU_BUFFER_NORMAL_STATE 2 @@ -82,37 +83,12 @@ GPUBufferPool *GPU_buffer_pool_new() } pool = MEM_callocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new"); + pool->maxsize = MAX_FREE_GPU_BUFFERS; + pool->buffers = MEM_callocN(sizeof(GPUBuffer*)*pool->maxsize, "GPU_buffer_pool_new buffers"); return pool; } -void GPU_buffer_pool_free(GPUBufferPool *pool) -{ - int i; - - DEBUG_VBO("GPU_buffer_pool_free\n"); - - if( pool == 0 ) - pool = globalPool; - if( pool == 0 ) - return; - - for( i = 0; i < pool->size; i++ ) { - if( pool->buffers[i] != 0 ) { - if( useVBOs ) { - glDeleteBuffersARB( 1, &pool->buffers[i]->id ); - } - else { - MEM_freeN( pool->buffers[i]->pointer ); - } - MEM_freeN(pool->buffers[i]); - } else { - ERROR_VBO("Why are we accessing a null buffer in GPU_buffer_pool_free?\n"); - } - } - MEM_freeN(pool); -} - void GPU_buffer_pool_remove( int index, GPUBufferPool *pool ) { int i; @@ -159,6 +135,35 @@ void GPU_buffer_pool_delete_last( GPUBufferPool *pool ) pool->size--; } +void GPU_buffer_pool_free(GPUBufferPool *pool) +{ + DEBUG_VBO("GPU_buffer_pool_free\n"); + + if( pool == 0 ) + pool = globalPool; + if( pool == 0 ) + return; + + while( pool->size ) + GPU_buffer_pool_delete_last(pool); + + MEM_freeN(pool->buffers); + MEM_freeN(pool); +} + +void GPU_buffer_pool_free_unused(GPUBufferPool *pool) +{ + DEBUG_VBO("GPU_buffer_pool_free_unused\n"); + + if( pool == 0 ) + pool = globalPool; + if( pool == 0 ) + return; + + while( pool->size > MAX_FREE_GPU_BUFFERS ) + GPU_buffer_pool_delete_last(pool); +} + GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool ) { char buffer[60]; @@ -226,6 +231,7 @@ GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool ) void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool ) { int i; + DEBUG_VBO("GPU_buffer_free\n"); if( buffer == 0 ) @@ -235,9 +241,19 @@ void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool ) if( pool == 0 ) globalPool = GPU_buffer_pool_new(); - /* free the last used buffer in the queue if no more space */ - if( pool->size == MAX_FREE_GPU_BUFFERS ) { - GPU_buffer_pool_delete_last( pool ); + /* free the last used buffer in the queue if no more space, but only + if we are in the main thread. for e.g. rendering or baking it can + happen that we are in other thread and can't call OpenGL, in that + case cleanup will be done GPU_buffer_pool_free_unused */ + if( BLI_thread_is_main() ) { + while( pool->size >= MAX_FREE_GPU_BUFFERS ) + GPU_buffer_pool_delete_last( pool ); + } + else { + if( pool->maxsize == pool->size ) { + pool->maxsize += MAX_FREE_GPU_BUFFERS; + pool->buffers = MEM_reallocN(pool->buffers, sizeof(GPUBuffer*)*pool->maxsize); + } } for( i =pool->size; i > 0; i-- ) { @@ -273,9 +289,9 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) memset(numverts,0,sizeof(int)*32768); mvert = dm->getVertArray(dm); - mface = dm->getTessFaceArray(dm); + mface = dm->getFaceArray(dm); - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { if( mface[i].v4 ) numverts[mface[i].mat_nr+16383] += 6; /* split every quad into two triangles */ @@ -315,11 +331,10 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) if( object->indices[INDEX].element == -1 ) { \ object->indices[INDEX].element = ACTUAL; \ } else { \ - IndexLink *lnk = &object->indices[INDEX], *lnk2; \ - lnk2 = &object->indexMem[object->indexMemUsage]; \ - lnk2->element = ACTUAL; \ - SWAP(IndexLink, *lnk, *lnk2); \ - lnk->next = lnk2; \ + IndexLink *lnk = &object->indices[INDEX]; \ + while( lnk->next != 0 ) lnk = lnk->next; \ + lnk->next = &object->indexMem[object->indexMemUsage]; \ + lnk->next->element = ACTUAL; \ object->indexMemUsage++; \ } @@ -460,7 +475,7 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface, for(i = 0, tottri = 0; i < totface; ++i) tottri += mface[face_indices[i]].v4 ? 2 : 1; - if(GL_ARB_vertex_buffer_object) + if(GL_ARB_vertex_buffer_object && !(U.gameflags & USER_DISABLE_VBO)) glGenBuffersARB(1, &buffers->index_buf); if(buffers->index_buf) { @@ -521,11 +536,11 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface, } void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids, - int *grid_indices, int totgrid, int gridsize) + int *grid_indices, int totgrid, int gridsize, int smooth) { GPU_Buffers *buffers = buffers_v; DMGridData *vert_data; - int i, totvert; + int i, j, k, totvert; totvert= gridsize*gridsize*totgrid; @@ -540,6 +555,22 @@ void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids, for(i = 0; i < totgrid; ++i) { DMGridData *grid= grids[grid_indices[i]]; memcpy(vert_data, grid, sizeof(DMGridData)*gridsize*gridsize); + + if(!smooth) { + /* for flat shading, recalc normals and set the last vertex of + each quad in the index buffer to have the flat normal as + that is what opengl will use */ + for(j = 0; j < gridsize-1; ++j) { + for(k = 0; k < gridsize-1; ++k) { + normal_quad_v3(vert_data[(j+1)*gridsize + (k+1)].no, + vert_data[(j+1)*gridsize + k].co, + vert_data[(j+1)*gridsize + k+1].co, + vert_data[j*gridsize + k+1].co, + vert_data[j*gridsize + k].co); + } + } + } + vert_data += gridsize*gridsize; } glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); @@ -571,7 +602,7 @@ void *GPU_build_grid_buffers(DMGridData **grids, totquad= (gridsize-1)*(gridsize-1)*totgrid; /* Generate index buffer object */ - if(GL_ARB_vertex_buffer_object) + if(GL_ARB_vertex_buffer_object && !(U.gameflags & USER_DISABLE_VBO)) glGenBuffersARB(1, &buffers->index_buf); if(buffers->index_buf) { @@ -590,10 +621,10 @@ void *GPU_build_grid_buffers(DMGridData **grids, for(i = 0; i < totgrid; ++i) { for(j = 0; j < gridsize-1; ++j) { for(k = 0; k < gridsize-1; ++k) { + *(quad_data++)= offset + j*gridsize + k+1; *(quad_data++)= offset + j*gridsize + k; *(quad_data++)= offset + (j+1)*gridsize + k; *(quad_data++)= offset + (j+1)*gridsize + k+1; - *(quad_data++)= offset + j*gridsize + k+1; } } @@ -620,10 +651,10 @@ void *GPU_build_grid_buffers(DMGridData **grids, for(i = 0; i < totgrid; ++i) { for(j = 0; j < gridsize-1; ++j) { for(k = 0; k < gridsize-1; ++k) { + *(quad_data++)= offset + j*gridsize + k+1; *(quad_data++)= offset + j*gridsize + k; *(quad_data++)= offset + (j+1)*gridsize + k; *(quad_data++)= offset + (j+1)*gridsize + k+1; - *(quad_data++)= offset + j*gridsize + k+1; } } @@ -643,7 +674,6 @@ void *GPU_build_grid_buffers(DMGridData **grids, /* Build VBO */ if(buffers->index_buf) glGenBuffersARB(1, &buffers->vert_buf); - GPU_update_grid_buffers(buffers, grids, grid_indices, totgrid, gridsize); buffers->tot_quad = totquad; @@ -831,9 +861,9 @@ void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *re DEBUG_VBO("GPU_buffer_copy_vertex\n"); mvert = dm->getVertArray(dm); - mface = dm->getTessFaceArray(dm); + mface = dm->getFaceArray(dm); - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) @@ -875,13 +905,13 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re int start; float norm[3]; - float *nors= dm->getTessFaceDataArray(dm, CD_NORMAL); + float *nors= dm->getFaceDataArray(dm, CD_NORMAL); MVert *mvert = dm->getVertArray(dm); - MFace *mface = dm->getTessFaceArray(dm); + MFace *mface = dm->getFaceArray(dm); DEBUG_VBO("GPU_buffer_copy_normal\n"); - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) @@ -943,7 +973,7 @@ void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, DEBUG_VBO("GPU_buffer_copy_uv\n"); - mface = dm->getTessFaceArray(dm); + mface = dm->getFaceArray(dm); mtface = DM_get_face_data_layer(dm, CD_MTFACE); if( mtface == 0 ) { @@ -951,7 +981,7 @@ void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, return; } - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) @@ -987,11 +1017,11 @@ void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *r int i, numfaces; unsigned char *varray = (unsigned char *)varray_; unsigned char *mcol = (unsigned char *)user; - MFace *mface = dm->getTessFaceArray(dm); + MFace *mface = dm->getFaceArray(dm); DEBUG_VBO("GPU_buffer_copy_color3\n"); - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { int start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) @@ -1017,11 +1047,11 @@ void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *r int i, numfaces; unsigned char *varray = (unsigned char *)varray_; unsigned char *mcol = (unsigned char *)user; - MFace *mface = dm->getTessFaceArray(dm); + MFace *mface = dm->getFaceArray(dm); DEBUG_VBO("GPU_buffer_copy_color4\n"); - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { int start = index[redir[mface[i].mat_nr+16383]]; if( mface[i].v4 ) @@ -1061,7 +1091,7 @@ GPUBuffer *GPU_buffer_color( DerivedMesh *dm ) dm->drawObject->colType = CD_MCOL; } - numfaces= dm->getNumTessFaces(dm); + numfaces= dm->getNumFaces(dm); colors = MEM_mallocN(numfaces*12*sizeof(unsigned char), "GPU_buffer_color"); for( i=0; i < numfaces*4; i++ ) { colors[i*3] = mcol[i].b; @@ -1113,7 +1143,7 @@ void GPU_buffer_copy_uvedge( DerivedMesh *dm, float *varray, int *index, int *re if(tf) { for(i = 0; i < dm->numFaceData; i++, tf++) { MFace mf; - dm->getTessFace(dm,i,&mf); + dm->getFace(dm,i,&mf); VECCOPY2D(&varray[j],tf->uv[0]); VECCOPY2D(&varray[j+2],tf->uv[1]); @@ -1501,8 +1531,9 @@ void GPU_buffer_unbind() else break; } - if( GLStates != 0 ) + if( GLStates != 0 ) { DEBUG_VBO( "Some weird OpenGL state is still set. Why?" ); + } if( useVBOs ) glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 ); } diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index efaae5c2720..a6250650787 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -352,7 +352,7 @@ static char *gpu_generate_function_prototyps(GHash *hash) GPUFunction *GPU_lookup_function(char *name) { if(!FUNCTION_HASH) { - FUNCTION_HASH = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); + FUNCTION_HASH = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "GPU_lookup_function gh"); gpu_parse_functions_string(FUNCTION_HASH, datatoc_gpu_shader_material_glsl); /*FUNCTION_PROTOTYPES = gpu_generate_function_prototyps(FUNCTION_HASH); FUNCTION_LIB = GPU_shader_create_lib(datatoc_gpu_shader_material_glsl);*/ @@ -480,8 +480,8 @@ static void codegen_set_unique_ids(ListBase *nodes) GPUOutput *output; int id = 1, texid = 0; - bindhash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - definehash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + bindhash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "codegen_set_unique_ids1 gh"); + definehash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "codegen_set_unique_ids2 gh"); for (node=nodes->first; node; node=node->next) { for (input=node->inputs.first; input; input=input->next) { @@ -492,7 +492,7 @@ static void codegen_set_unique_ids(ListBase *nodes) /* set texid used for settings texture slot with multitexture */ if (codegen_input_has_texture(input) && - ((input->source == GPU_SOURCE_TEX) || (input->source == GPU_SOURCE_TEX_PIXEL))) { + ((input->source == GPU_SOURCE_TEX) || (input->source == GPU_SOURCE_TEX_PIXEL))) { if (input->link) { /* input is texture from buffer, assign only one texid per buffer to avoid sampling the same texture twice */ @@ -1033,7 +1033,7 @@ static void gpu_node_input_socket(GPUNode *node, GPUNodeStack *sock) gpu_node_input_link(node, sock->link, sock->type); } else { - link = GPU_node_link_create(0); + link = GPU_node_link_create(0); link->ptr1 = sock->vec; gpu_node_input_link(node, link, sock->type); } diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h index 883c1abe034..3272f0fa1a9 100644 --- a/source/blender/gpu/intern/gpu_codegen.h +++ b/source/blender/gpu/intern/gpu_codegen.h @@ -59,7 +59,7 @@ GPUFunction *GPU_lookup_function(char *name); /* Pass Generation - Takes a list of nodes and a desired output, and makes a pass. This - will take ownership of the nodes and free them early if unused or + will take ownership of the nodes and free them early if unused or at the end if used. */ diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 10638ca552a..d96f70ed5e9 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -62,9 +62,13 @@ #include "BKE_object.h" #include "BKE_utildefines.h" +#include "BLI_threads.h" +#include "BLI_blenlib.h" + +#include "GPU_buffers.h" +#include "GPU_draw.h" #include "GPU_extensions.h" #include "GPU_material.h" -#include "GPU_draw.h" #include "smoke_API.h" @@ -523,7 +527,7 @@ int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int tfmode, int c } /* scale if not a power of two */ - if (!mipmap && (!is_pow2_limit(rectw) || !is_pow2_limit(recth))) { + if ((!is_pow2_limit(rectw) || !is_pow2_limit(recth))) { rectw= smaller_pow2_limit(rectw); recth= smaller_pow2_limit(recth); @@ -762,11 +766,11 @@ void GPU_free_smoke(SmokeModifierData *smd) if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain) { if(smd->domain->tex) - GPU_texture_free(smd->domain->tex); + GPU_texture_free(smd->domain->tex); smd->domain->tex = NULL; if(smd->domain->tex_shadow) - GPU_texture_free(smd->domain->tex_shadow); + GPU_texture_free(smd->domain->tex_shadow); smd->domain->tex_shadow = NULL; } } @@ -781,8 +785,45 @@ void GPU_create_smoke(SmokeModifierData *smd, int highres) smd->domain->tex_shadow = GPU_texture_create_3D(smd->domain->res[0], smd->domain->res[1], smd->domain->res[2], smd->domain->shadow); } +static ListBase image_free_queue = {NULL, NULL}; + +static void gpu_queue_image_for_free(Image *ima) +{ + Image *cpy = MEM_dupallocN(ima); + + BLI_lock_thread(LOCK_OPENGL); + BLI_addtail(&image_free_queue, cpy); + BLI_unlock_thread(LOCK_OPENGL); +} + +void GPU_free_unused_buffers(void) +{ + Image *ima; + + if(!BLI_thread_is_main()) + return; + + BLI_lock_thread(LOCK_OPENGL); + + /* images */ + for(ima=image_free_queue.first; ima; ima=ima->id.next) + GPU_free_image(ima); + + BLI_freelistN(&image_free_queue); + + /* vbo buffers */ + GPU_buffer_pool_free_unused(0); + + BLI_unlock_thread(LOCK_OPENGL); +} + void GPU_free_image(Image *ima) { + if(!BLI_thread_is_main()) { + gpu_queue_image_for_free(ima); + return; + } + /* free regular image binding */ if(ima->bindcode) { glDeleteTextures(1, (GLuint *)&ima->bindcode); @@ -815,6 +856,17 @@ void GPU_free_images(void) GPU_free_image(ima); } +/* same as above but only free animated images */ +void GPU_free_images_anim(void) +{ + Image* ima; + + if(G.main) + for(ima=G.main->image.first; ima; ima=ima->id.next) + if(ELEM(ima->type, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) + GPU_free_image(ima); +} + /* OpenGL Materials */ #define FIXEDMAT 8 @@ -1097,6 +1149,14 @@ void GPU_end_object_materials(void) GMS.matbuf= NULL; GMS.gmatbuf= NULL; GMS.blendmode= NULL; + + /* resetting the texture matrix after the glScale needed for tiled textures */ + if(GTS.tilemode) + { + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + } } /* Lights */ @@ -1170,7 +1230,7 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4 Base *base; Lamp *la; int count; - float position[4], direction[4], energy[4]; + float position[4], direction[4], energy[4], power; /* disable all lights */ for(count=0; count<8; count++) @@ -1211,8 +1271,8 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4 glLightfv(GL_LIGHT0+count, GL_POSITION, position); glLightf(GL_LIGHT0+count, GL_CONSTANT_ATTENUATION, 1.0); - glLightf(GL_LIGHT0+count, GL_LINEAR_ATTENUATION, la->att1/la->dist); - glLightf(GL_LIGHT0+count, GL_QUADRATIC_ATTENUATION, la->att2/(la->dist*la->dist)); + glLightf(GL_LIGHT0+count, GL_LINEAR_ATTENUATION, 0.0f/la->dist); + glLightf(GL_LIGHT0+count, GL_QUADRATIC_ATTENUATION, 1.0f/(la->dist*la->dist)); if(la->type==LA_SPOT) { /* spot lamp */ @@ -1226,11 +1286,13 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4 else glLightf(GL_LIGHT0+count, GL_SPOT_CUTOFF, 180.0); } + + power= (ELEM(la->type, LA_SUN, LA_HEMI))? la->energy*M_PI: la->power; /* setup energy */ - energy[0]= la->energy*la->r; - energy[1]= la->energy*la->g; - energy[2]= la->energy*la->b; + energy[0]= power*la->r; + energy[1]= power*la->g; + energy[2]= power*la->b; energy[3]= 1.0; glLightfv(GL_LIGHT0+count, GL_DIFFUSE, energy); diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 3ca55c12ce2..a96920aa839 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -71,6 +71,7 @@ static struct GPUGlobal { GLuint currentfb; int glslsupport; int extdisabled; + int colordepth; GPUDeviceType device; GPUOSType os; GPUDriverType driver; @@ -92,6 +93,7 @@ void GPU_extensions_disable() void GPU_extensions_init() { + GLint r, g, b; const char *vendor, *renderer; glewInit(); @@ -106,6 +108,11 @@ void GPU_extensions_init() if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0; if (!GLEW_ARB_fragment_shader) GG.glslsupport = 0; + glGetIntegerv(GL_RED_BITS, &r); + glGetIntegerv(GL_GREEN_BITS, &g); + glGetIntegerv(GL_BLUE_BITS, &b); + GG.colordepth = r+g+b; /* assumes same depth for RGB */ + vendor = (const char*)glGetString(GL_VENDOR); renderer = (const char*)glGetString(GL_RENDERER); @@ -117,7 +124,10 @@ void GPU_extensions_init() GG.device = GPU_DEVICE_NVIDIA; GG.driver = GPU_DRIVER_OFFICIAL; } - else if(strstr(vendor, "Intel") || strstr(renderer, "Mesa DRI Intel")) { + else if(strstr(vendor, "Intel") || + /* src/mesa/drivers/dri/intel/intel_context.c */ + strstr(renderer, "Mesa DRI Intel") || + strstr(renderer, "Mesa DRI Mobile Intel")) { GG.device = GPU_DEVICE_INTEL; GG.driver = GPU_DRIVER_OFFICIAL; } @@ -142,8 +152,8 @@ void GPU_extensions_init() GG.driver = GPU_DRIVER_SOFTWARE; } else { - GG.device = GPU_DEVICE_UNKNOWN; - GG.driver = GPU_DRIVER_UNKNOWN; + GG.device = GPU_DEVICE_ANY; + GG.driver = GPU_DRIVER_ANY; } GG.os = GPU_OS_UNIX; @@ -170,13 +180,18 @@ int GPU_non_power_of_two_support() return GLEW_ARB_texture_non_power_of_two; } +int GPU_color_depth() +{ + return GG.colordepth; +} + int GPU_print_error(char *str) { GLenum errCode; if (G.f & G_DEBUG) { if ((errCode = glGetError()) != GL_NO_ERROR) { - fprintf(stderr, "%s opengl error: %s\n", str, gluErrorString(errCode)); + fprintf(stderr, "%s opengl error: %s\n", str, gluErrorString(errCode)); return 1; } } @@ -392,6 +407,9 @@ GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels) void *pixels = NULL; float vfBorderColor[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + if(!GLEW_VERSION_1_2) + return NULL; + tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture"); tex->w = w; tex->h = h; @@ -1138,7 +1156,7 @@ GPUPixelBuffer *gpu_pixelbuffer_create(int x, int y, int halffloat, int numbuffe pb->numbuffers = numbuffers; pb->halffloat = halffloat; - glGenBuffersARB(pb->numbuffers, pb->bindcode); + glGenBuffersARB(pb->numbuffers, pb->bindcode); if (!pb->bindcode[0]) { fprintf(stderr, "GPUPixelBuffer allocation failed\n"); @@ -1154,9 +1172,9 @@ void GPU_pixelbuffer_texture(GPUTexture *tex, GPUPixelBuffer *pb) void *pixels; int i; - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, tex->bindcode); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, tex->bindcode); - for (i = 0; i < pb->numbuffers; i++) { + for (i = 0; i < pb->numbuffers; i++) { glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb->bindcode[pb->current]); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb->datasize, NULL, GL_STREAM_DRAW_ARB); @@ -1170,22 +1188,22 @@ void GPU_pixelbuffer_texture(GPUTexture *tex, GPUPixelBuffer *pb) } } - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0); } static int pixelbuffer_map_into_gpu(GLuint bindcode) { void *pixels; - glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, bindcode); + glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, bindcode); pixels = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, GL_WRITE_ONLY); /* do stuff in pixels */ - if (!glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT)) { + if (!glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT)) { fprintf(stderr, "Could not unmap opengl PBO\n"); return 0; - } + } return 1; } @@ -1193,14 +1211,14 @@ static int pixelbuffer_map_into_gpu(GLuint bindcode) static void pixelbuffer_copy_to_texture(GPUTexture *tex, GPUPixelBuffer *pb, GLuint bindcode) { GLenum type = (pb->halffloat)? GL_HALF_FLOAT_NV: GL_UNSIGNED_BYTE; - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, tex->bindcode); - glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, bindcode); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, tex->bindcode); + glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, bindcode); - glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, tex->w, tex->h, - GL_RGBA, type, NULL); + glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, tex->w, tex->h, + GL_RGBA, type, NULL); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, 0); - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 0); } void GPU_pixelbuffer_async_to_gpu(GPUTexture *tex, GPUPixelBuffer *pb) @@ -1217,7 +1235,7 @@ void GPU_pixelbuffer_async_to_gpu(GPUTexture *tex, GPUPixelBuffer *pb) pixelbuffer_map_into_gpu(pb->bindcode[newbuffer]); pixelbuffer_copy_to_texture(tex, pb, pb->bindcode[pb->current]); - } + } } #endif diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 03afa0b1b5a..e4c662291cc 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -105,8 +105,8 @@ struct GPULamp { int type, mode, lay; - float dynenergy, dyncol[3]; - float energy, col[3]; + float dynpower, dyncol[3]; + float power, col[3]; float co[3], vec[3]; float dynco[3], dynvec[3]; @@ -115,7 +115,7 @@ struct GPULamp { float dynimat[4][4]; float spotsi, spotbl, k; - float dist, att1, att2; + float dist; float bias, d, clipend; int size; @@ -257,11 +257,11 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim lamp= nlink->data; if((lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) { - lamp->dynenergy = lamp->energy; + lamp->dynpower = lamp->power; VECCOPY(lamp->dyncol, lamp->col); } else { - lamp->dynenergy = 0.0f; + lamp->dynpower = 0.0f; lamp->dyncol[0]= lamp->dyncol[1]= lamp->dyncol[2] = 0.0f; } } @@ -396,9 +396,6 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode case LA_FALLOFF_INVSQUARE: GPU_link(mat, "lamp_falloff_invsquare", GPU_uniform(&lamp->dist), *dist, &visifac); break; - case LA_FALLOFF_SLIDERS: - GPU_link(mat, "lamp_falloff_sliders", GPU_uniform(&lamp->dist), GPU_uniform(&lamp->att1), GPU_uniform(&lamp->att2), *dist, &visifac); - break; case LA_FALLOFF_CURVE: { float *array; @@ -435,34 +432,34 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode #if 0 static void area_lamp_vectors(LampRen *lar) { - float xsize= 0.5*lar->area_size, ysize= 0.5*lar->area_sizey, multifac; + float xsize= 0.5*lar->area_size, ysize= 0.5*lar->area_sizey, multifac; - /* make it smaller, so area light can be multisampled */ - multifac= 1.0f/sqrt((float)lar->ray_totsamp); - xsize *= multifac; - ysize *= multifac; + /* make it smaller, so area light can be multisampled */ + multifac= 1.0f/sqrt((float)lar->ray_totsamp); + xsize *= multifac; + ysize *= multifac; - /* corner vectors */ - lar->area[0][0]= lar->co[0] - xsize*lar->mat[0][0] - ysize*lar->mat[1][0]; - lar->area[0][1]= lar->co[1] - xsize*lar->mat[0][1] - ysize*lar->mat[1][1]; - lar->area[0][2]= lar->co[2] - xsize*lar->mat[0][2] - ysize*lar->mat[1][2]; + /* corner vectors */ + lar->area[0][0]= lar->co[0] - xsize*lar->mat[0][0] - ysize*lar->mat[1][0]; + lar->area[0][1]= lar->co[1] - xsize*lar->mat[0][1] - ysize*lar->mat[1][1]; + lar->area[0][2]= lar->co[2] - xsize*lar->mat[0][2] - ysize*lar->mat[1][2]; - /* corner vectors */ - lar->area[1][0]= lar->co[0] - xsize*lar->mat[0][0] + ysize*lar->mat[1][0]; - lar->area[1][1]= lar->co[1] - xsize*lar->mat[0][1] + ysize*lar->mat[1][1]; - lar->area[1][2]= lar->co[2] - xsize*lar->mat[0][2] + ysize*lar->mat[1][2]; + /* corner vectors */ + lar->area[1][0]= lar->co[0] - xsize*lar->mat[0][0] + ysize*lar->mat[1][0]; + lar->area[1][1]= lar->co[1] - xsize*lar->mat[0][1] + ysize*lar->mat[1][1]; + lar->area[1][2]= lar->co[2] - xsize*lar->mat[0][2] + ysize*lar->mat[1][2]; - /* corner vectors */ - lar->area[2][0]= lar->co[0] + xsize*lar->mat[0][0] + ysize*lar->mat[1][0]; - lar->area[2][1]= lar->co[1] + xsize*lar->mat[0][1] + ysize*lar->mat[1][1]; - lar->area[2][2]= lar->co[2] + xsize*lar->mat[0][2] + ysize*lar->mat[1][2]; + /* corner vectors */ + lar->area[2][0]= lar->co[0] + xsize*lar->mat[0][0] + ysize*lar->mat[1][0]; + lar->area[2][1]= lar->co[1] + xsize*lar->mat[0][1] + ysize*lar->mat[1][1]; + lar->area[2][2]= lar->co[2] + xsize*lar->mat[0][2] + ysize*lar->mat[1][2]; - /* corner vectors */ - lar->area[3][0]= lar->co[0] + xsize*lar->mat[0][0] - ysize*lar->mat[1][0]; - lar->area[3][1]= lar->co[1] + xsize*lar->mat[0][1] - ysize*lar->mat[1][1]; - lar->area[3][2]= lar->co[2] + xsize*lar->mat[0][2] - ysize*lar->mat[1][2]; - /* only for correction button size, matrix size works on energy */ - lar->areasize= lar->dist*lar->dist/(4.0*xsize*ysize); + /* corner vectors */ + lar->area[3][0]= lar->co[0] + xsize*lar->mat[0][0] - ysize*lar->mat[1][0]; + lar->area[3][1]= lar->co[1] + xsize*lar->mat[0][1] - ysize*lar->mat[1][1]; + lar->area[3][2]= lar->co[2] + xsize*lar->mat[0][2] - ysize*lar->mat[1][2]; + /* only for correction button size, matrix size works on energy */ + lar->areasize= lar->dist*lar->dist/(4.0*xsize*ysize); } #endif @@ -525,9 +522,6 @@ static void add_to_diffuse(GPUMaterial *mat, Material *ma, GPUShadeInput *shi, G else { /* input */ switch(ma->rampin_col) { - case MA_RAMP_IN_ENERGY: - GPU_link(mat, "ramp_rgbtobw", rgb, &fac); - break; case MA_RAMP_IN_SHADER: fac= is; break; @@ -578,9 +572,6 @@ static void do_specular_ramp(GPUShadeInput *shi, GPUNodeLink *is, GPUNodeLink *t /* input */ switch(ma->rampin_spec) { - case MA_RAMP_IN_ENERGY: - fac = t; - break; case MA_RAMP_IN_SHADER: fac = is; break; @@ -682,7 +673,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la if(lamp->mode & LA_ONLYSHADOW) { GPU_link(mat, "shade_only_shadow", i, shadfac, - GPU_dynamic_uniform(&lamp->dynenergy), &shadfac); + GPU_dynamic_uniform(&lamp->dynpower), &shadfac); if(!(lamp->mode & LA_NO_DIFF)) GPU_link(mat, "shade_only_shadow_diffuse", shadfac, shi->rgb, @@ -965,7 +956,7 @@ static void do_material_tex(GPUShadeInput *shi) if(tex->imaflag & TEX_USEALPHA) talpha= 1; - } + } else continue; /* texture output */ @@ -1146,10 +1137,10 @@ void GPU_shadeinput_set(GPUMaterial *mat, Material *ma, GPUShadeInput *shi) void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr) { GPUMaterial *mat= shi->gpumat; - GPUNodeLink *emit, *ulinfac, *ulogfac, *mistfac; + GPUNodeLink *emit, *mistfac; Material *ma= shi->mat; World *world= mat->scene->world; - float linfac, logfac, misttype; + float misttype; memset(shr, 0, sizeof(*shr)); @@ -1187,20 +1178,6 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr) shr->alpha = shi->alpha; if(world) { - /* exposure correction */ - if(world->exp!=0.0f || world->range!=1.0f) { - linfac= 1.0 + pow((2.0*world->exp + 0.5), -10); - logfac= log((linfac-1.0)/linfac)/world->range; - - GPU_link(mat, "set_value", GPU_uniform(&linfac), &ulinfac); - GPU_link(mat, "set_value", GPU_uniform(&logfac), &ulogfac); - - GPU_link(mat, "shade_exposure_correct", shr->combined, - ulinfac, ulogfac, &shr->combined); - GPU_link(mat, "shade_exposure_correct", shr->spec, - ulinfac, ulogfac, &shr->spec); - } - /* ambient color */ if(world->ambr!=0.0f || world->ambg!=0.0f || world->ambb!=0.0f) { if(GPU_link_changed(shi->amb) || ma->amb != 0.0f) @@ -1325,14 +1302,14 @@ void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4]) invert_m4_m4(lamp->imat, mat); } -void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy) +void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float power) { - lamp->energy = energy; - if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy; + lamp->power = power; + if(lamp->mode & LA_NEG) lamp->power= -lamp->power; - lamp->col[0]= r* lamp->energy; - lamp->col[1]= g* lamp->energy; - lamp->col[2]= b* lamp->energy; + lamp->col[0]= r* lamp->power; + lamp->col[1]= g* lamp->power; + lamp->col[2]= b* lamp->power; } static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *la, GPULamp *lamp) @@ -1348,12 +1325,12 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l lamp->mode = la->mode; lamp->type = la->type; - lamp->energy = la->energy; - if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy; + lamp->power= (ELEM(la->type, LA_SUN, LA_HEMI))? la->energy*M_PI: la->power; + if(lamp->mode & LA_NEG) lamp->power= -lamp->power; - lamp->col[0]= la->r*lamp->energy; - lamp->col[1]= la->g*lamp->energy; - lamp->col[2]= la->b*lamp->energy; + lamp->col[0]= la->r*lamp->power; + lamp->col[1]= la->g*lamp->power; + lamp->col[2]= la->b*lamp->power; GPU_lamp_update(lamp, ob->lay, ob->obmat); @@ -1367,8 +1344,6 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l lamp->dist= la->dist; lamp->falloff_type= la->falloff_type; - lamp->att1= la->att1; - lamp->att2= la->att2; lamp->curfalloff= la->curfalloff; /* initshadowbuf */ @@ -1478,7 +1453,7 @@ void GPU_lamp_free(Object *ob) int GPU_lamp_has_shadow_buffer(GPULamp *lamp) { return (!(lamp->scene->gm.flag & GAME_GLSL_NO_SHADOWS) && - !(lamp->scene->gm.flag & GAME_GLSL_NO_LIGHTS) && + !(lamp->scene->gm.flag & GAME_GLSL_NO_LIGHTS) && lamp->tex && lamp->fb); } diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl index c824e755afc..a0c37dc5484 100644 --- a/source/blender/gpu/intern/gpu_shader_material.glsl +++ b/source/blender/gpu/intern/gpu_shader_material.glsl @@ -1558,11 +1558,6 @@ void test_shadowbuf(vec3 rco, sampler2DShadow shadowmap, mat4 shadowpersmat, flo } } -void shade_exposure_correct(vec3 col, float linfac, float logfac, out vec3 outcol) -{ - outcol = linfac*(1.0 - exp(col*logfac)); -} - void shade_mist_factor(vec3 co, float miststa, float mistdist, float misttype, float misi, out float outfac) { float fac, zcor; diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c index 920cd16c369..b407ddad2ee 100644 --- a/source/blender/gpu/intern/gpu_shader_material.glsl.c +++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c @@ -1,1034 +1,1029 @@ /* DataToC output of file */ -int datatoc_gpu_shader_material_glsl_size= 33537; +int datatoc_gpu_shader_material_glsl_size= 33401; char datatoc_gpu_shader_material_glsl[]= { - 10, -102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101, -116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118, -111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, - 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, - 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, - 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, - 41, 41, 59, 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, - 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105, -110, 59, 10, 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, - 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, - 48, 46, 48, 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, - 48, 41, 32,123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, - 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120, -121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32, -104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46, -121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, - 10, 9, 9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, - 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, - 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32, -118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, - 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97, -116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32, -114,103, 98, 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, - 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, - 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, -105,102, 40,104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, - 32, 54, 46, 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32, -105, 59, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32, -118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, - 9, 9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9, -105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, - 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, - 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, - 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, - 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, - 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, - 40,116, 44, 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32, -112, 44, 32,113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104, -115,118, 46,119, 41, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, - 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, - 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32, -118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, - 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99, -111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116, -118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97, -116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, - 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, - 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, - 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, - 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, - 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118, -101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, - 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110, -111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10, 9,118,105,101,119, 32, - 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118, -105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, - 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, - 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, - 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32, -105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116, -116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10, -125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, - 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108, -111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, - 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, - 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, - 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, - 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32, -109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109, -101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10, 9, -111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,116,118,105,101,119, 32, 61, - 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, - 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97, -108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32, -118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, - 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10, -118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102, -108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9, -111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97, -116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 50, 32, - 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9, -111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97, -116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,116, 32,118, 97,108, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, -116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110, 40,102,108,111, 97, -116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40, -118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,116, -118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, - 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, - 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, - 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, - 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, - 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 97, -116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,102,108,111, 97,116, + 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32, +102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32, +102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, + 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, + 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, + 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, + 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32, +109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, + 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, + 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32, +123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, + 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, + 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, + 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, + 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32, +105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, + 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, + 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, + 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, + 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116, +111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, + 10,123, 10, 9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, + 59, 10, 9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32, +104,115,118, 91, 49, 93, 59, 10, 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, + 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101, +108,115,101, 32,123, 10, 9, 9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, + 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9, +102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, + 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, + 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, + 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, + 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32, +114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40, +105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, + 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, + 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, + 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32, +118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, + 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, + 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, + 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, + 99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, + 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118, +111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, + 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, + 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, + 32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105, +101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116, +117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97, +108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, + 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117, +116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117, +116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, + 59, 10, 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, + 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, + 48, 41, 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116, +116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110, +111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, + 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114, +105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, + 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, + 44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97, +120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32, +111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97, +116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109, +105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, + 44, 32,109,105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111, +117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10, +118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117, +116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, + 99,111, 46,122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111, +117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32, +109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, + 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99, +116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, + 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97, -108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, -118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97, -116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, -116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, - 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111, -103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, - 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97, -116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116, -118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, - 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109,105, -110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110, -100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, - 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118, -111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102, -108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9, -105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, - 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97, -116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97, -116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40, -118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108, -115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101, -122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, - 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117, -116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, - 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, - 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97, -108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, - 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118, -111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, - 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, -116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10, 9,111,117,116,118, - 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, - 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10, -118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118, -101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, - 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10, 9,111,117,116,118,101, - 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, -101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, - 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59, 10, 9,111,117,116, -118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, - 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32, -118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, - 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10, 9,111,117,116,118, 97, -108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95, -109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32, -111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116, -118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97, -108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, - 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10, 9,111,117,116,118, 32, - 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118, -101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,105,114, 59, 10, 9,111,117, -116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, -117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, - 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, -101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118, -101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,120, 59, 10, 9,111,117,116, -118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, - 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101, -120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, - 48, 46, 53, 41, 46,122, 59, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 32,123, 10, 9, 9,111,117,116, -118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, - 97, 99, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101, -109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46, -114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, - 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108, - 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, - 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111,117,116, 99,111, -108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114, -101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 9,105,102, 32, 40, -102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 32,123, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,111,108, - 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 9,125, 10, 9,111,117,116, - 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, +118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, + 10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108, +111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105, +102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, + 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, + 10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, + 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, + 99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102, +108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111, +117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, +115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, + 10,123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, + 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, + 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, - 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118, -101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, - 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, - 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, - 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111, -117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, - 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97, -116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111, -105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, - 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, - 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105, -120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, - 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, - 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, - 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, - 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117, -116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, - 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, - 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, - 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32, -102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118, -101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, - 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99, -111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111, -108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, - 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, - 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, - 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, - 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40, -102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, - 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, - 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, - 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, - 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99, -111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, - 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, -114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, - 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, - 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, - 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117, -116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, - 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, - 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, - 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,101, - 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42, -102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111, -108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, - 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32, -111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, - 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, - 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, - 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, - 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99, -111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, - 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117, -116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, - 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42, -111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, - 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, - 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, - 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, - 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109, -105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, - 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, - 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, - 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, - 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, - 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32, + 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, + 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117, +116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108, +111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117, +116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112, +111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, + 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108, +115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, +108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, + 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97, +108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, + 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97, +108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, + 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, + 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97, +116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116, +118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, + 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, +117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, + 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, + 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, +118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, + 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, + 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97, +108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, + 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, + 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111, +105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116, +104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97, +108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, + 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, + 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, + 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, + 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98, +115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, + 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, + 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, + 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, + 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, + 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, + 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, + 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, + 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, + 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, + 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, + 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111, +105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32, +118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, +117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, + 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118, +111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111, +117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, + 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, + 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116, +104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10, +123, 10, 9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, + 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32, +100,105,114, 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, + 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, + 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118, +101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114, +101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, + 46,120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, + 97,112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, + 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, + 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, + 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, + 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, + 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, + 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117, +116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120, +116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111, +117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101, +120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9, +111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116, +101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, + 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117, +116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111, +117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108, +117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10, +123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, + 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111, +117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, + 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99, +111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, + 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, + 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108, +111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, +118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97, +108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105, +100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, + 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, +109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32, 118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99, -111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42, -102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105, -100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, - 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, - 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117, -116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, - 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118, -111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111, -108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10, -123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9, -111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, - 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99, -111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111, -108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99, -111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, - 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125, - 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32, -116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112, - 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108, -115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, - 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111, -117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, - 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, - 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, - 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117, -116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, - 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10, - 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118, -101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, -116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, - 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, - 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, - 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, - 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, - 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, - 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, - 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101, -108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, - 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, - 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, - 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, - 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32, -105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, - 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32, -102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, - 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116, -109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, - 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115, -101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, - 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105, -100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32, -118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, - 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97, -116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99, -111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, - 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, - 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32, -104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111, - 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, - 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, - 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97, +111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99, +111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102, +108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32, +111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, +102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111, +108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, + 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97, 116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, - 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115, -118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, - 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, - 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99, -109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114, -103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, -118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99, -111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99, -108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, - 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, - 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95, -104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42, -104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40, -104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40, -102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, - 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, - 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, - 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, - 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111, -108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, - 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115, -118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, - 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99, -111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117, -116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, -115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, - 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, - 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99, -109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, - 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111, -108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, - 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99, -111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110, -101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99, -111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99, -108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, - 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111, -108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, - 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, - 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105, -102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, - 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9, -101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, - 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, - 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, - 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117, -116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, - 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118, -101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10, -123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32, -102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118, -111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97, -116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, - 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, - 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, - 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46, -120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, - 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, -119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, - 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108, -111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99, -111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111, -108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, - 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101, -108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, - 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, - 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, - 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, - 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108, -115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, - 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99, -111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118, -111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, - 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, - 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97, -116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, - 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32, -102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, - 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10, -125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101, -110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, - 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117, -114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, - 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, - 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9, -111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, - 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116, -101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118, -101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, - 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42, -118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, - 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, - 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, - 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, - 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, - 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111, -114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, - 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, - 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, - 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46, -103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, - 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40, -118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9, -111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, - 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32, -100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, - 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110, -103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, - 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, - 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40, -118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, - 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32, -119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32, -111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9, -111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, - 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110, -116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97, -110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10, 10,118, -111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, - 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103, -108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, - 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, - 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, - 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, - 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, - 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, - 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101, -102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118, -105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, - 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, - 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97, -116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110, -111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118, -101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, - 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, - 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, - 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, - 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109, -116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101, -120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, - 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, - 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117, -116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, - 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, - 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10, -123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9, -102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, - 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, - 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, - 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118, -101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, - 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, - 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, - 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, - 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99, -109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9, -105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, - 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, - 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111, -108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, -116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, - 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111, -108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, - 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, - 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101, -108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, - 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32, -111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40, + 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, + 32, 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, + 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, + 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32, +118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, + 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32, +102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, + 52, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, + 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, + 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108, +111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111, +117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, + 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, + 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117, +116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, + 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111, +108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, + 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9, +105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, + 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9, +111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, + 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, + 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, + 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108, +115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, + 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, + 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, + 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, + 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, + 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, + 49, 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, + 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118, +101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, +116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, + 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9, +111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, + 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, + 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, + 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, + 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, + 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, + 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, + 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32, +118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, + 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99, +111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, + 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111, +105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, + 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, + 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117, +116, 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, + 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118, +111,105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111, +108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10, +123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9, +111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46, +114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, + 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, + 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, + 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, + 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, + 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, + 42, 99,111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, + 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117, +116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, + 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, + 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97, +116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116, +109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9, +101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, + 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, + 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, + 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, + 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111, +117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, +111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, + 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, + 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, + 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32, +111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, + 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32, +102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, + 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, + 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, + 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, + 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32, +105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, + 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32, +102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, + 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116, +109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, + 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115, +101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, + 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, + 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, + 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, + 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116, +109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101, +108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, + 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118, +111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, + 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, + 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108, +111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, + 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114, +103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, + 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, + 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95, +116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109, +105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, + 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108, +111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111, +117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, + 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, + 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32, +104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104, +115,118, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95, +116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, + 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, + 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105, +120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, + 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, + 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, + 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, + 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116, +111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99, +109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, + 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111, +114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, + 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97, +109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, + 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118, +101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, + 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, + 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9, +104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, + 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117, +116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9, +111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105, +120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, + 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, + 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, + 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, + 52, 40, 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, + 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, + 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, + 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108, +105,110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, + 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, + 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, + 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, + 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, + 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, + 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, + 9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111, +108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, + 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, + 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, + 98, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, + 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9, +111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, + 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108, +111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, + 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, + 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, + 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, + 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, + 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, + 50, 59, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, + 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111, +108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, + 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111, +108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, + 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32, +102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, +116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, + 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, + 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, + 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, + 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, + 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, + 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117, +101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32, +101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, + 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117, +116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, + 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, + 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108, +111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, + 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, + 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, + 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10, +123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, + 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98, +108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10, +123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, +116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46, +120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, + 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, + 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, + 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, + 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, + 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40, +118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46, +122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, + 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111, +114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, + 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105, +100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101, +114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, + 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111, +108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118, +101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, + 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, + 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111, +114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, + 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99, +111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, + 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95, +117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, + 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104, +101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112, +105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, + 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, + 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114, +109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97, +108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, + 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, + 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, + 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103, +101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116, +116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10, + 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, + 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, + 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, + 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, + 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118, +101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, + 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, + 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101, +102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +114,101,102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, + 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, + 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, + 10, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101, +103, 97,116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, + 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, + 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111, +108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, + 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, + 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, + 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32, +116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32, +111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, + 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, + 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42, +111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40, 118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32, 102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, - 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, - 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, - 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, - 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10, -123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117, -116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32, -111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9, -102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99, -109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, - 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, - 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, - 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, - 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, - 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, - 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, - 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111, -117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32, -102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102, -108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, - 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99, -111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10, -125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111, -108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, - 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99, -109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111, -108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, - 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, - 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, - 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105, -110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116, -101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99, -111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111, -108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, + 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, + 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, + 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, + 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111, +117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, + 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111, +108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, + 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, +114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, + 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, + 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, + 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99, +111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, + 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, +116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, + 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, + 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111, +117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111, +108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, + 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, + 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, + 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, + 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, +116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99, +111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, + 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40, +118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32, +102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, + 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32, +111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, + 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, + 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, + 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, + 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32, +102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99, +111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99, +111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9, +105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, + 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99, +111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, - 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, - 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, - 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105, -110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, - 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, - 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32, -101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32, -102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, - 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, - 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40, -118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32, -102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, - 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, - 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99, -111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, - 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32, -111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9, -118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118, -101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, - 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111, -108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, - 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111, -117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, - 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32, -118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, - 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, - 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117, -116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99, -111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111, -105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, - 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, - 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, - 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108, -111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, - 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108, -117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, - 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116, -101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, - 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117, -116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, - 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, - 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, - 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114, -115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, - 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, -116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108, -117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101, + 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, + 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117, +116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, + 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, + 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108, +111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, + 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, + 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, + 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, + 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46, +114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, + 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, + 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, + 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105, +110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, + 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, + 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10, +123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, + 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, + 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, + 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111, +117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9, +105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, + 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, + 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111, +108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, + 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117, +101, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, +116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99, +111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42, +102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101, +120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99, +111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, + 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, + 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, + 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, + 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, + 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, + 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108, +111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, + 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, + 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, + 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, + 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, + 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99, +111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40, +111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, + 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10, +118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, + 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, +109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, + 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, +102,108,111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, + 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, + 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116, +101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9, +109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, + 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42, +111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102, +108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99, +111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, + 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, + 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99, +116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, + 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32, +116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, + 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99, +109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, + 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99, +111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101, +120, 95,118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32, +116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, + 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99, +109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99, +116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, +118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101, 120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117, 116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109, 116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, - 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, - 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, - 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, -118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101, -120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117, -116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109, -116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, - 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42, -116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97, -108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99, -111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101, -120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, - 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, - 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, - 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, - 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105, -102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, -111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108, -115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, - 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101, -120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117, -116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109, -116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, - 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, - 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101, -120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, - 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, - 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, - 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, - 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101, -108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, - 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, - 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, - 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, - 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, - 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101, -108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, - 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, - 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, - 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, - 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, - 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108, -111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117, -116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, - 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, - 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101, -108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, - 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32, -109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117, -116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, - 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111, -108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112, -104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32, -114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116, -101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, - 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, - 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105, -110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40, -118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9, -111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46, -114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117, -101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105, -110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, - 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, - 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105, -108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114, -103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114, -103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, - 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, - 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42, -115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42, -102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118, -101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117, -116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102, -115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, - 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, -116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, - 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, -118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, - 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, - 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32, -110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, - 44, 32,118,101, 99, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 9, 10, 9,110,111,114,109, - 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114, 46,103, - 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48, 46, 53, - 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97, -108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97, -108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, 46,120, - 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,116, - 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,116, 97,110,103,101,110,116, 32, 61, 32, -110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32, 99,114, -111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97, -108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 32, 43, 32,116,101,120,110,111,114, -109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111, -117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, - 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111, -114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116, -110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, - 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, -110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, - 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, - 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, - 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118, -101, 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, - 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118, -101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105, -102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, - 61, 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, - 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95, -102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, - 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, - 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, - 32, 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105, -110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100, -105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, - 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100, -105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101, -114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108, -111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, -105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97, -109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109, -112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105, -115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, - 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, - 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109, -112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120, -116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 41, 46, -120, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,101,114, -101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,102,108, -111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, - 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10, - 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48, - 41, 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108, -105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97, -116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -105,110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48, - 46, 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118, -101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, - 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114, -111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113, -114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61, - 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112, -111,116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108, -118, 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105, -108,105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112, -111,116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32, -116, 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9, -111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, - 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10, - 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115, -109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10, - 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 10, -125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40,102,108, -111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, - 99, 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, - 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123, - 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97, -112,104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97, -116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, - 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, - 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, - 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114, -111,115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115, -115, 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110, -111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32, -118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61, - 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110, -111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, - 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116, - 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42, -105,110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110, -101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, - 41, 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114, - 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122, -101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110, -111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, - 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, - 41, 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, - 91, 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111, -115,115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114, -109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9, - 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118, -101, 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, - 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99, -111,115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93, - 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114, - 97,100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, - 41, 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, - 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99, - 91, 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93, - 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10, - 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114, -101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32, -108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109, - 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32, -107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112, -111,115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, - 59, 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32, -123, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97, -116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, - 44, 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97, -114,101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105, -102,102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32, -110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108, -105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40, -110, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, - 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111, -116, 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, -105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32, -123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, - 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, - 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116, - 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95, - 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118, -101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, - 59, 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105, -101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105, -102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, - 59, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, - 9, 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10, - 9, 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114, -111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10, - 9, 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, - 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61, - 32, 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115, -105,110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32, -118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116, -104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, - 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115, -108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10, - 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32, -124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108, -115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111, -111,116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110, - 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102, -108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9, -105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9, -101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, - 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10, - 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32, -100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32, -110,108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, - 46, 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, - 51, 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, - 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32, -102,102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32, - 49, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32, -118,110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9, - 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32, - 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116, - 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62, - 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, - 50, 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, - 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114, -101,115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125, - 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, - 60, 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, - 46, 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118, -111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, - 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -111,117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32, - 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101, -108,115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, -116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, - 99, 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32, -108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99, -111,108, 41, 10,123, 10, 9,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42, -108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, - 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, - 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32, -102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,108, -118, 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, - 10, 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, - 48, 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, - 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118, -101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114, -100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, - 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, - 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, - 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32, -118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112, -101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, - 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102, - 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, + 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116, +101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108, +117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111, +108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, + 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, + 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99, +109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9, +101,108,115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, + 95,118, 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32, +116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, + 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99, +109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, + 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, +116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, + 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, +109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32, +102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, + 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, + 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, +101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, + 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, +109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32, +102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, + 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, + 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, +101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, + 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, + 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108, +117,101, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, +116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, + 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40, +102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9, +111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, + 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, + 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, + 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, + 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105, +100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, + 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, + 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, + 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97, +108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, + 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105, +110,116,101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, + 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108, +117,101, 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, + 32,105,110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114, +116, 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, + 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, + 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97, +108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, + 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, + 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105, +116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, + 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, + 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, + 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32, +118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, + 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, + 97, 42,115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105, +108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, + 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32, +111,102,115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118, +101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, +117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99, +111, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32, +118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, + 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, + 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118, +101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, + 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105, +109, 97, 44, 32,118,101, 99, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 9, 10, 9,110,111, +114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114, + 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48, + 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114, +109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, +109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, + 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105, +100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101, +110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,116, 97,110,103,101,110,116, 32, + 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32, + 99,114,111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 41, 59, 10, 10, 9,111,117,116,110,111,114, +109, 97,108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 32, 43, 32,116,101,120,110, +111,114,109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, + 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, + 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, + 97,116, 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119, +110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111, +117,116,110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, + 32, 43, 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, + 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, + 42, 42, 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97, +109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112, +118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109, +112,118,101, 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, + 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, + 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105, +115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115, +116, 32, 61, 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, +108,118, 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109, +112, 95,102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105, +115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, + 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105, +115,116, 32, 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, + 95,105,110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, + 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115, +105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, + 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105, +100,101,114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32, +102,108,111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32, +108, 97,109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, + 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9, +118,105,115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107, +119, 32, 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, + 95,102, 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, + 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116, +101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116, + 41, 46,120, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104, +101,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32, +102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105, +102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, + 59, 10, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, + 46, 48, 41, 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98, +105,108,105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32, +109, 97,116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32,105,110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, + 32, 48, 46, 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, + 42,118,101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, + 32,109, 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108, +118,114,111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47, +115,113,114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, + 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, +115,112,111,116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108, +118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, + 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, + 98,105,108,105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32, +115,112,111,116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, + 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97, +116, 32,116, 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, + 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, + 9,116, 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, + 47, 10, 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, + 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, + 10, 10, 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9, +125, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40, +102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105, +102, 97, 99, 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, + 48, 46, 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, + 97,100,101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, + 10,123, 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103, +114, 97,112,104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, + 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, + 99,111, 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111, +105,100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, + 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, + 99,114,111,115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114, +111,115,115, 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40, +118,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, + 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, + 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, + 95,110,111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, + 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, + 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, + 53, 42,105,110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95, +101,110,101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32, +118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, + 32,114, 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108, +105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, + 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118, +101, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120, +121,122, 41, 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114, +101, 97, 91, 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99, +114,111,115,115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110, +111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, + 10, 9, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, + 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111, +115,115, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, + 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, + 49, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, + 9,114, 97,100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, + 93, 41, 41, 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32, +118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, + 32, 99, 91, 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, + 49, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, + 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, + 9,114,101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115, +104, 97,100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, + 51, 32,108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, + 32,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97, +116, 32,107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, + 32,112,111,115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, + 99,111, 59, 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, + 41, 32,123, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108, +111, 97,116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114, +101, 97, 44, 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, + 42, 97,114,101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, +100,105,102,102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, + 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, + 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111, +116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100, +111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32, +100,111,116, 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, + 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, + 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, + 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102, +108,111, 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, + 97,116, 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105, +116, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, + 9,118,101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42, +110, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, + 86,105,101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, + 9,105,102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, + 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, + 9, 9, 9, 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, + 10, 10, 9, 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, + 42,114,111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, + 59, 10, 9, 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, + 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, + 42, 61, 32, 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, + 32,115,105,110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115, +104, 97,100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, + 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111, +111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, + 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40, +114,115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, + 59, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, + 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9, +101,108,115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115, +109,111,111,116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105, +110,110, 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, + 32,102,108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, + 10, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, - 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, - 97,114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102, - 97, 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115, -112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97, -116, 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, - 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105, -102, 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, - 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119, -101,114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46, - 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111, -119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32, - 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61, - 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9, -115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102, -108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, - 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110, -108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, - 9, 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97, -120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, - 32, 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, - 41, 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47, -118,104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40, - 97, 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32, -105,102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108, -115,101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9, - 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114, - 97, 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, - 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, - 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, - 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, - 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97, -116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, - 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41, - 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32, - 48, 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, -119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, - 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, - 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, - 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, - 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, - 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, - 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111, -115, 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, - 48, 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, - 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101, -114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, - 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111, -111,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32, -102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108, -105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, - 32,110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9, -105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, - 32,105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116, -115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, - 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111, -111,116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32, -115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97, - 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102, - 97, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59, - 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100, -102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32, -102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116, - 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59, - 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44, - 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 99,111,108, 44, 32,111,117,116, - 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116, 42,108, 97,109,112, - 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,118, -101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, -116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125, - 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, - 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111, -108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10, -125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108, -111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111, -108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10, -118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99, -111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, - 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, - 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, - 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 10, -125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32, -118,101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9, -111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, - 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, - 99, 51, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111, -117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, - 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100, -102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103, -121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102, - 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99, - 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118, -101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115, -104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32, -115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99, - 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61, - 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, - 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32, -114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32, -109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, - 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108, -116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32, - 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, - 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47, - 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, - 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99, -111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, - 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,101,120,112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97, -116, 32,108,105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 44, 32,111,117,116, 32,118,101, 99, 51, - 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, - 32, 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, + 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, + 41, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, + 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, + 61, 32,110,108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, + 32, 49, 46, 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118, +101, 99, 51, 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102, +108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97, +116, 32,102,102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, + 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, + 44, 32,118,110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, + 10, 9, 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, + 43, 32, 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, + 40,116, 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, + 50, 62, 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, + 32,116, 50, 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115, +104, 97,100,101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, + 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102, +108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, +102,114,101,115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32, +105,115, 60, 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, + 32, 49, 46, 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, + 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, + 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32,111,117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116, +105, 32, 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, + 42,101,108,115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, +101, 95,116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32, +118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115, +104, 97,100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, + 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117, +116, 99,111,108, 41, 10,123, 10, 9,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, +105, 42,108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, +118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, +100,101, 95,104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118, +101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, + 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, + 9,108,118, 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, + 59, 10, 10, 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, + 43, 32, 48, 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, + 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, + 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, + 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32, +104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108, +116, 32, 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, + 97, 99, 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, + 97,100,101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, + 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, + 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9, +105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, + 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40, +110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, + 32,104, 97,114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, + 99,102, 97, 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, + 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108, +111, 97,116, 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117, +116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, + 49, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, + 32,105,102, 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, + 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112, +111,119,101,114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, + 49, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95, +112,111,119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32, +104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, + 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, + 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, + 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, + 59, 10, 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, + 40,110,108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, + 59, 10, 9, 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32, +109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, + 32, 97, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42, +110,118, 41, 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, + 41, 47,118,104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105, +102, 40, 97, 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115, +101, 32,105,102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9, +101,108,115,101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, + 9, 9, 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101, +102,114, 97, 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, + 32, 61, 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118, +104, 41, 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40, +118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, + 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108, +111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, + 32, 61, 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110, +103, 41, 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, + 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, +101, 95,119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118, +101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99, +102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, + 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, + 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, + 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32, +108, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, + 99,111,115, 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, + 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, + 52, 46, 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110, +100,101,114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, + 41, 47, 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, +116,111,111,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, + 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, + 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40, +104, 44, 32,110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, + 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108, +115,101, 32,105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, + 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108, +115,101, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115, +109,111,111,116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105, +100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99, +102, 97, 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, + 99,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110, +112, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, + 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, + 44, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, + 9,116, 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, + 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32, +116, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 99,111,108, 44, 32,111, +117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116, 42,108, 97, +109,112, 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, + 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32, +111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, + 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, + 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, + 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, + 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32, +102,108,111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, + 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, + 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, + 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111, +108, 32, 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, + 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32, +118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 42,102, 97, 99, + 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, + 44, 32,118,101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, + 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, + 98, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40, +118,101, 99, 51, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, + 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, + 48, 46, 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, +100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, + 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, +117,116,115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101, +114,103,121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, +100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97, +100,102, 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118, +101, 99, 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, + 32,118,101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, + 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97, +116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112, +101, 99, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, + 32, 61, 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, + 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, + 51, 32,114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, + 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100, +111,119, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115, +117,108,116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108, +116, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32, +115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, + 9, 47, 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42, +115,104, 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, + 42, 99,111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40, +115,104, 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, 100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105, 115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115, 116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index 9cb98c258de..98cb3dcefd9 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -28,20 +28,33 @@ FILE(GLOB SRC intern/*.c) SET(INC - . ../makesdna ../../../intern/guardedalloc ../../../intern/memutil ../blenlib - ../avi ../blenkernel + . + ../makesdna + ../../../intern/guardedalloc + ../../../intern/memutil + ../blenlib + ../avi + ../blenkernel ${JPEG_INC} ${PNG_INC} - ${TIFF_INC} ${ZLIB_INC} - ${OPENJPEG_INC} ) +IF(WIN32) + SET(INC ${INC} ${PTHREADS_INC}) +ENDIF(WIN32) + IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + SET(INC ${INC} ${TIFF_INCLUDE_DIR}) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) + SET(INC ${INC} ${OPENJPEG_INC}) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index a77ef54b0b6..07b99dddfa5 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -37,40 +37,6 @@ * blenlib handles guarded memory management in blender-style. * BLI_winstuff.h makes a few windows specific behaviours * posix-compliant. - * - avi - * avi defines import/export to the avi format. Only anim.c - * needs this. It uses the following functions: - * - avi_close - * - avi_is_avi - * - avi_print_error - * - avi_open_movie - * - avi_read_frame - * - avi_get_stream - * Additionally, it needs the types from the avi module. - * - external jpeg library - * The jpeg lib defines import/export to the jpeg format. - * only jpeg.c needs these. Used functions are: - * - jpeg_destroy - * - jpeg_resync_to_restart - * - jpeg_set_marker_processor - * - jpeg_read_header - * - jpeg_start_decompress - * - jpeg_abort_decompress - * - jpeg_read_scanlines - * - jpeg_finish_decompress - * - jpeg_std_error - * - jpeg_create_decompress - * - jpeg_stdio_src - * - jpeg_start_compress - * - jpeg_write_marker - * - jpeg_write_scanlines - * - jpeg_finish_compress - * - jpeg_create_compress - * - jpeg_stdio_dest - * - jpeg_set_defaults - * - jpeg_set_quality - * - jpeg_destroy_compress - * Additionally, it needs the types from the jpeg lib. */ /* * $Id$ @@ -100,6 +66,7 @@ * * ***** END GPL LICENSE BLOCK ***** */ + #ifndef IMB_IMBUF_H #define IMB_IMBUF_H @@ -117,33 +84,16 @@ struct anim; /** * - * @attention Defined in cmap.c + * @attention Defined in allocimbuf.c */ -void IMB_freeImBufdata(void); - -/** - * - * @attention Defined in cmap.c - */ -void IMB_applycmap(struct ImBuf *ibuf); - -/** - * - * @attention Defined in cmap.c - */ -short IMB_converttocmap(struct ImBuf *ibuf); - -/** - * - * @attention Defined in cmap.c - */ -int IMB_alpha_to_col0(int value); +void IMB_init(void); +void IMB_exit(void); /** * * @attention Defined in readimage.c */ -struct ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags); +struct ImBuf *IMB_ibImageFromMemory(unsigned char *mem, int size, int flags); /** * @@ -161,7 +111,7 @@ struct ImBuf *IMB_loadiffname(const char *naam, int flags); * * @attention Defined in allocimbuf.c */ -void IMB_freeImBuf(struct ImBuf * ibuf); +void IMB_freeImBuf(struct ImBuf *ibuf); /** * @@ -180,18 +130,20 @@ struct ImBuf *IMB_allocImBuf(short x, short y, * @attention Defined in allocimbuf.c */ -void IMB_refImBuf(struct ImBuf * ibuf); +void IMB_refImBuf(struct ImBuf *ibuf); /** * * @attention Defined in allocimbuf.c */ -void IMB_cache_limiter_insert(struct ImBuf * i); -void IMB_cache_limiter_unmanage(struct ImBuf * i); -void IMB_cache_limiter_touch(struct ImBuf * i); -void IMB_cache_limiter_ref(struct ImBuf * i); -void IMB_cache_limiter_unref(struct ImBuf * i); -int IMB_cache_limiter_get_refcount(struct ImBuf * i); +void IMB_cache_limiter_insert(struct ImBuf *i); +void IMB_cache_limiter_unmanage(struct ImBuf *i); +void IMB_cache_limiter_touch(struct ImBuf *i); +void IMB_cache_limiter_ref(struct ImBuf *i); +void IMB_cache_limiter_unref(struct ImBuf *i); +int IMB_cache_limiter_get_refcount(struct ImBuf *i); + +void IMB_free_cache_limiter(void); /** * @@ -203,14 +155,8 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1); * * @attention Defined in allocimbuf.c */ -short addzbufImBuf(struct ImBuf * ibuf); -short addzbuffloatImBuf(struct ImBuf * ibuf); - -/** - * - * @attention Defined in allocimbuf.c - */ -void IMB_freecmapImBuf(struct ImBuf * ibuf); +short addzbufImBuf(struct ImBuf *ibuf); +short addzbuffloatImBuf(struct ImBuf *ibuf); /** * @@ -253,8 +199,8 @@ int IMB_anim_get_duration(struct anim *anim); * * @attention Defined in anim.c */ -struct anim * IMB_open_anim(const char * name, int ib_flags); -void IMB_close_anim(struct anim * anim); +struct anim *IMB_open_anim(const char *name, int ib_flags); +void IMB_close_anim(struct anim *anim); /** * @@ -262,53 +208,34 @@ void IMB_close_anim(struct anim * anim); */ int ismovie(char *name); -void IMB_anim_set_preseek(struct anim * anim, int preseek); -int IMB_anim_get_preseek(struct anim * anim); +void IMB_anim_set_preseek(struct anim *anim, int preseek); +int IMB_anim_get_preseek(struct anim *anim); /** * * @attention Defined in anim.c */ -struct ImBuf * IMB_anim_absolute(struct anim * anim, int position); +struct ImBuf *IMB_anim_absolute(struct anim *anim, int position); /** * * @attention Defined in anim.c * fetches a define previewframe, usually half way into the movie */ -struct ImBuf * IMB_anim_previewframe(struct anim * anim); +struct ImBuf *IMB_anim_previewframe(struct anim *anim); /** * * @attention Defined in anim.c */ -void IMB_free_anim_ibuf(struct anim * anim); +void IMB_free_anim_ibuf(struct anim *anim); /** * * @attention Defined in anim.c */ -void IMB_free_anim(struct anim * anim); - -/** - * - * @attention Defined in anim.c - */ -struct ImBuf * IMB_anim_nextpic(struct anim * anim); - - -/** - * - * @attention Defined in antialias.c - */ -void IMB_clever_double (struct ImBuf * ibuf); - -/** - * - * @attention Defined in antialias.c - */ -void IMB_antialias(struct ImBuf * ibuf); +void IMB_free_anim(struct anim *anim); /** * @@ -317,7 +244,17 @@ void IMB_antialias(struct ImBuf * ibuf); void IMB_filter(struct ImBuf *ibuf); void IMB_filterN(struct ImBuf *out, struct ImBuf *in); void IMB_filter_extend(struct ImBuf *ibuf, char *mask); -void IMB_makemipmap(struct ImBuf *ibuf, int use_filter, int SAT); +void IMB_makemipmap(struct ImBuf *ibuf, int use_filter); +struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level); + +/** + * + * @attention Defined in cache.c + */ + +void IMB_tile_cache_params(int totthread, int maxmem); +unsigned int *IMB_gettile(struct ImBuf *ibuf, int tx, int ty, int thread); +void IMB_tiles_to_rect(struct ImBuf *ibuf); /** * @@ -335,13 +272,7 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1); * * @attention Defined in scaling.c */ -struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy); - -/** - * - * @attention Defined in scaling.c - */ -struct ImBuf *IMB_scalefieldImBuf(struct ImBuf *ibuf, short newx, short newy); +struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, short newx, short newy); /** * @@ -372,13 +303,13 @@ int IMB_ispic(char *name); * * @attention Defined in util.c */ -int IMB_isanim(char * name); +int IMB_isanim(char *name); /** * * @attention Defined in util.c */ -int imb_get_anim_type(char * name); +int imb_get_anim_type(char *name); /** * @@ -386,9 +317,11 @@ int imb_get_anim_type(char * name); */ void IMB_de_interlace(struct ImBuf *ibuf); void IMB_interlace(struct ImBuf *ibuf); -void IMB_gamwarp(struct ImBuf *ibuf, double gamma); void IMB_rect_from_float(struct ImBuf *ibuf); void IMB_float_from_rect(struct ImBuf *ibuf); +void IMB_float_from_rect_simple(struct ImBuf *ibuf); /* no profile conversion */ +/* note, check that the conversion exists, only some are supported */ +void IMB_convert_profile(struct ImBuf *ibuf, int profile); /** * Change the ordering of the color bytes pointed to by rect from @@ -397,6 +330,15 @@ void IMB_float_from_rect(struct ImBuf *ibuf); * @attention Defined in imageprocess.c */ void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf); + +/** + * Change the ordering of the color bytes pointed to by rect from + * rgba to abgr. size * 4 color bytes are reordered. + * + * @attention Defined in imageprocess.c + */ +void IMB_convert_bgra_to_rgba(int size, unsigned int *rect); + /** * * @attention defined in imageprocess.c @@ -410,22 +352,6 @@ void neareast_interpolation_color(struct ImBuf *in, unsigned char *col, float *c void bilinear_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v); void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v); -/** - * Change the ordering of the color bytes pointed to by rect from - * rgba to abgr. size * 4 color bytes are reordered. - * - * @attention Defined in imageprocess.c - */ -void IMB_convert_bgra_to_rgba(int size, unsigned int *rect); - -/** - * - * @attention defined in scaling.c - */ -struct ImBuf *IMB_scalefastfieldImBuf(struct ImBuf *ibuf, - short newx, - short newy); - /** * * @attention defined in readimage.c @@ -478,68 +404,23 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1); */ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1); -/** - * - * @attention defined in scaling.c - */ -struct ImBuf *IMB_onethird(struct ImBuf *ibuf1); - -/** - * - * @attention defined in scaling.c - */ -struct ImBuf *IMB_halflace(struct ImBuf *ibuf1); - -/** - * - * @attention defined in dither.c - */ -void IMB_dit2(struct ImBuf * ibuf, short ofs, short bits); - -/** - * - * @attention defined in dither.c - */ -void IMB_dit0(struct ImBuf * ibuf, short ofs, short bits); - -/** Externally used vars: fortunately they do not use funny types */ - -/** - * boolean toggle that tells whether or not to - * scale the color map in the y-direction. - * - * @attention declared in hamx.c - */ -extern int scalecmapY; - -/** - * This 'matrix' defines the transformation from rgb to bw color - * maps. You need to do a sort of dot-product for that. It is a matrix - * with fixed coefficients, extracted from some book. - * - * @attention Defined in matrix.h, only included in hamx.c - */ -extern float rgb_to_bw[4][4]; - /** * * @attention Defined in rotate.c */ void IMB_flipx(struct ImBuf *ibuf); -void IMB_flipy(struct ImBuf * ibuf); +void IMB_flipy(struct ImBuf *ibuf); -/** - * - * @attention Defined in cspace.c - */ -void IMB_cspace(struct ImBuf *ibuf, float mat[][4]); +/* Premultiply alpha */ + +void IMB_premultiply_alpha(struct ImBuf *ibuf); /** * * @attention Defined in allocimbuf.c */ -void IMB_freezbufImBuf(struct ImBuf * ibuf); -void IMB_freezbuffloatImBuf(struct ImBuf * ibuf); +void IMB_freezbufImBuf(struct ImBuf *ibuf); +void IMB_freezbuffloatImBuf(struct ImBuf *ibuf); /** * @@ -551,34 +432,19 @@ void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, i /* this should not be here, really, we needed it for operating on render data, IMB_rectfill_area calls it */ void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2); -/* defined in imginfo.c */ -int IMB_imginfo_change_field(struct ImBuf *img, const char *key, const char *field); +/* defined in metadata.c */ +int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field); /* exported for image tools in blender, to quickly allocate 32 bits rect */ -short imb_addrectImBuf(struct ImBuf * ibuf); -void imb_freerectImBuf(struct ImBuf * ibuf); +short imb_addrectImBuf(struct ImBuf *ibuf); +void imb_freerectImBuf(struct ImBuf *ibuf); -short imb_addrectfloatImBuf(struct ImBuf * ibuf); -void imb_freerectfloatImBuf(struct ImBuf * ibuf); -void imb_freemipmapImBuf(struct ImBuf * ibuf); +short imb_addrectfloatImBuf(struct ImBuf *ibuf); +void imb_freerectfloatImBuf(struct ImBuf *ibuf); +void imb_freemipmapImBuf(struct ImBuf *ibuf); -#ifdef WITH_QUICKTIME -/** - * - * @attention Defined in quicktime_import.c - */ -void quicktime_init(void); - -/** - * - * @attention Defined in quicktime_import.c - */ -void quicktime_exit(void); - -#endif //WITH_QUICKTIME - -/* intern/dynlibtiff.c */ -void libtiff_init(void); -void libtiff_exit(void); +short imb_addtilesImBuf(struct ImBuf *ibuf); +void imb_freetilesImBuf(struct ImBuf *ibuf); #endif + diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index 6c58641a0d5..e0dcc344016 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -48,14 +48,10 @@ #ifndef IMB_IMBUF_TYPES_H #define IMB_IMBUF_TYPES_H -#include /* for size_t */ -#include "DNA_listBase.h" /* for ListBase */ -struct _AviMovie; -struct Mdec; +struct ImMetaData; -struct ImgInfo; - -#define IB_MIPMAP_LEVELS 10 +#define IB_MIPMAP_LEVELS 20 +#define IB_FILENAME_SIZE 1023 /** * \brief The basic imbuf type @@ -73,56 +69,69 @@ struct ImgInfo; */ typedef struct ImBuf { struct ImBuf *next, *prev; /**< allow lists of ImBufs, for caches or flipbooks */ - short x, y; /**< width and Height of our image buffer */ - short skipx; /**< Width in ints to get to the next scanline */ - unsigned char depth; /**< Active amount of bits/bitplanes */ - unsigned char cbits; /**< Amount of active bits in cmap */ - unsigned short mincol; /**< smallest color in colormap */ - unsigned short maxcol; /**< Largest color in colormap */ - int type; /**< 0=abgr, 1=bitplanes */ - int ftype; /**< File type we are going to save as */ - unsigned int *cmap; /**< Color map data. */ - unsigned int *rect; /**< pixel values stored here */ - unsigned int *crect; /**< color corrected pixel values stored here */ - unsigned int **planes; /**< bitplanes */ - int flags; /**< Controls which components should exist. */ - int mall; /**< what is malloced internal, and can be freed */ - short xorig, yorig; /**< Cordinates of first pixel of an image used in some formats (example: targa) */ - char name[1023]; /**< The file name assocated with this image */ - char namenull; /**< Unused don't want to remove it thought messes things up */ - int userflags; /**< Used to set imbuf to Dirty and other stuff */ - int *zbuf; /**< z buffer data, original zbuffer */ - float *zbuf_float; /**< z buffer data, camera coordinates */ - void *userdata; /**< temporary storage, only used by baking at the moment */ - unsigned char *encodedbuffer; /**< Compressed image only used with png currently */ - unsigned int encodedsize; /**< Size of data written to encodedbuffer */ - unsigned int encodedbuffersize; /**< Size of encodedbuffer */ - float *rect_float; /**< floating point Rect equivalent - Linear RGB color space - may need gamma correction to - sRGB when generating 8bit representations */ - int channels; /**< amount of channels in rect_float (0 = 4 channel default) */ - float dither; /**< random dither value, for conversion from float -> byte rect */ - short profile; /** color space/profile preset that the byte rect buffer represents */ - char profile_filename[256]; /** to be implemented properly, specific filename for custom profiles */ + /* dimensions */ + short x, y; /* width and Height of our image buffer */ + unsigned char depth; /* Active amount of bits/bitplanes */ + int channels; /* amount of channels in rect_float (0 = 4 channel default) */ + + /* flags */ + int flags; /* Controls which components should exist. */ + int mall; /* what is malloced internal, and can be freed */ + + /* pixels */ + unsigned int *rect; /* pixel values stored here */ + unsigned int *crect; /* color corrected pixel values stored here */ + float *rect_float; /* floating point Rect equivalent + Linear RGB color space - may need gamma correction to + sRGB when generating 8bit representations */ - struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */ - struct ImgInfo * img_info; - int refcounter; /**< Refcounter for multiple users */ - int index; /**< reference index for ImBuf lists */ - - struct ImBuf *mipmap[IB_MIPMAP_LEVELS]; /**< MipMap levels, a series of halved images */ + /* tiled pixel storage */ + int tilex, tiley; + int xtiles, ytiles; + unsigned int **tiles; + + /* zbuffer */ + int *zbuf; /* z buffer data, original zbuffer */ + float *zbuf_float; /* z buffer data, camera coordinates */ + + /* parameters used by conversion between byte and float */ + float dither; /* random dither value, for conversion from float -> byte rect */ + short profile; /* color space/profile preset that the byte rect buffer represents */ + char profile_filename[256]; /* to be implemented properly, specific filename for custom profiles */ + + /* mipmapping */ + struct ImBuf *mipmap[IB_MIPMAP_LEVELS]; /* MipMap levels, a series of halved images */ + int miptot, miplevel; + + /* externally used data */ + int index; /* reference index for ImBuf lists */ + int userflags; /* used to set imbuf to dirty and other stuff */ + struct ImMetaData *metadata; /* image metadata */ + void *userdata; /* temporary storage, only used by baking at the moment */ + + /* file information */ + int ftype; /* file type we are going to save as */ + char name[IB_FILENAME_SIZE]; /* filename associated with this image */ + char cachename[IB_FILENAME_SIZE]; /* full filename used for reading from cache */ + + /* memory cache limiter */ + struct MEM_CacheLimiterHandle_s *c_handle; /* handle for cache limiter */ + int refcounter; /* reference counter for multiple users */ + + /* some parameters to pass along for packing images */ + unsigned char *encodedbuffer; /* Compressed image only used with png currently */ + unsigned int encodedsize; /* Size of data written to encodedbuffer */ + unsigned int encodedbuffersize; /* Size of encodedbuffer */ } ImBuf; /* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */ /** * \brief Flags used internally by blender for imagebuffers */ -typedef enum { - IB_BITMAPFONT = 1 << 0, /* This image is a font */ - IB_BITMAPDIRTY = 1 << 1 /* Image needs to be saved is not the same as filename */ -} ImBuf_userflagsMask; +#define IB_BITMAPFONT (1 << 0) /* this image is a font */ +#define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */ /* From iff.h. This was once moved away by Frank, now Nzc moves it * back. Such is the way it is... It is a long list of defines, and @@ -136,33 +145,26 @@ typedef enum { */ /**@{*/ /** \brief Flag defining the components of the ImBuf struct. */ -#define IB_rect (1 << 0) -#define IB_planes (1 << 1) -#define IB_cmap (1 << 2) -#define IB_vert (1 << 4) -#define IB_freem (1 << 6) -#define IB_test (1 << 7) - -#define IB_ttob (1 << 8) -#define IB_subdlta (1 << 9) -#define IB_fields (1 << 11) -#define IB_zbuf (1 << 13) - -#define IB_mem (1 << 14) -#define IB_rectfloat (1 << 15) -#define IB_zbuffloat (1 << 16) -#define IB_multilayer (1 << 17) -#define IB_imginfo (1 << 18) -#define IB_animdeinterlace (1 << 19) +#define IB_rect (1 << 0) +#define IB_test (1 << 1) +#define IB_fields (1 << 2) +#define IB_zbuf (1 << 3) +#define IB_mem (1 << 4) +#define IB_rectfloat (1 << 5) +#define IB_zbuffloat (1 << 6) +#define IB_multilayer (1 << 7) +#define IB_metadata (1 << 8) +#define IB_animdeinterlace (1 << 9) +#define IB_tiles (1 << 10) +#define IB_tilecache (1 << 11) +#define IB_premul (1 << 12) /* * The bit flag is stored in the ImBuf.ftype variable. * Note that the lower 10 bits is used for storing custom flags */ -#define AMI (1 << 31) #define PNG (1 << 30) -#define Anim (1 << 29) #define TGA (1 << 28) #define JPG (1 << 27) #define BMP (1 << 26) @@ -188,11 +190,11 @@ typedef enum { #ifdef WITH_OPENJPEG #define JP2 (1 << 18) -#define JP2_12BIT (1 << 17) -#define JP2_16BIT (1 << 16) +#define JP2_12BIT (1 << 17) +#define JP2_16BIT (1 << 16) #define JP2_YCC (1 << 15) -#define JP2_CINE (1 << 14) -#define JP2_CINE_48FPS (1 << 13) +#define JP2_CINE (1 << 14) +#define JP2_CINE_48FPS (1 << 13) #endif #define RAWTGA (TGA | 1) @@ -203,66 +205,16 @@ typedef enum { #define JPG_MAX (JPG | (3 << 8)) #define JPG_MSK (0xffffff00) -#define AM_ham (0x0800 | AMI) -#define AM_hbrite (0x0080 | AMI) - -#define C233 1 -#define YUVX 2 -#define HAMX 3 -#define TANX 4 - -#define AN_c233 (Anim | C233) -#define AN_yuvx (Anim | YUVX) -#define AN_hamx (Anim | HAMX) -#define AN_tanx (Anim | TANX) -/**@}*/ +#define IMAGIC 0732 /** * \name Imbuf preset profile tags * \brief Some predefined color space profiles that 8 bit imbufs can represent */ -/**@{*/ #define IB_PROFILE_NONE 0 #define IB_PROFILE_LINEAR_RGB 1 #define IB_PROFILE_SRGB 2 #define IB_PROFILE_CUSTOM 3 -/**@}*/ - - -/** \name Imbuf File Type Tests - * \brief These macros test if an ImBuf struct is the corresponding file type. - */ -/**@{*/ -/** \brief Tests the ImBuf.ftype variable for the file format. */ -#define IS_amiga(x) (x->ftype & AMI) -#define IS_ham(x) ((x->ftype & AM_ham) == AM_ham) -#define IS_hbrite(x) ((x->ftype & AM_hbrite) == AM_hbrite) - -#define IS_anim(x) (x->ftype & Anim) -#define IS_hamx(x) (x->ftype == AN_hamx) -#define IS_tga(x) (x->ftype & TGA) -#define IS_png(x) (x->ftype & PNG) -#define IS_openexr(x) (x->ftype & OPENEXR) -#define IS_jp2(x) (x->ftype & JP2) -#define IS_cineon(x) (x->ftype & CINEON) -#define IS_dpx(x) (x->ftype & DPX) -#define IS_bmp(x) (x->ftype & BMP) -#define IS_tiff(x) (x->ftype & TIF) -#define IS_radhdr(x) (x->ftype & RADHDR) - -#ifdef WITH_DDS -#define IS_dds(x) (x->ftype & DDS) -#endif - -#define IMAGIC 0732 -#define IS_iris(x) (x->ftype == IMAGIC) - -#define IS_jpg(x) (x->ftype & JPG) -#define IS_stdjpg(x) ((x->ftype & JPG_MSK) == JPG_STD) -#define IS_vidjpg(x) ((x->ftype & JPG_MSK) == JPG_VID) -#define IS_jstjpg(x) ((x->ftype & JPG_MSK) == JPG_JST) -#define IS_maxjpg(x) ((x->ftype & JPG_MSK) == JPG_MAX) -/**@}*/ #endif diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h index 8855c003818..9248b768cb6 100644 --- a/source/blender/imbuf/IMB_thumbs.h +++ b/source/blender/imbuf/IMB_thumbs.h @@ -50,26 +50,31 @@ typedef enum ThumbSize { typedef enum ThumbSource { THB_SOURCE_IMAGE, - THB_SOURCE_MOVIE + THB_SOURCE_MOVIE, + THB_SOURCE_BLEND } ThumbSource; -// IB_imginfo +// IB_metadata /* create thumbnail for file and returns new imbuf for thumbnail */ -ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, ThumbSource source); +ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, ImBuf *ibuf); /* read thumbnail for file and returns new imbuf for thumbnail */ -ImBuf* IMB_thumb_read(const char* dir, const char* file, ThumbSize size); +ImBuf* IMB_thumb_read(const char* path, ThumbSize size); /* delete all thumbs for the file */ -void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size); +void IMB_thumb_delete(const char* path, ThumbSize size); /* return the state of the thumb, needed to determine how to manage the thumb */ -ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, ThumbSource source); +ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source); /* create the necessary dirs to store the thumbnails */ void IMB_thumb_makedirs(); +/* special function for loading a thumbnail embedded into a blend file */ +ImBuf *IMB_loadblend_thumb(const char *path); +void IMB_overlayblend_thumb(unsigned int *thumb, int width, int height, float aspect); + #endif /* _IMB_THUMBS_H */ diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript index a8d91b2d31e..439cdecdf5b 100644 --- a/source/blender/imbuf/SConscript +++ b/source/blender/imbuf/SConscript @@ -14,9 +14,15 @@ incs += ' ' + env['BF_ZLIB_INC'] defs = [] +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] + if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_DDS']: defs.append('WITH_DDS') diff --git a/source/blender/imbuf/intern/IMB_anim.h b/source/blender/imbuf/intern/IMB_anim.h index 0305c6c6b49..c9eac2c1399 100644 --- a/source/blender/imbuf/intern/IMB_anim.h +++ b/source/blender/imbuf/intern/IMB_anim.h @@ -62,10 +62,9 @@ #endif #include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail - BLI_countlist BLI_stringdec */ + BLI_countlist BLI_stringdec */ #include "imbuf.h" -#include "imbuf_patch.h" #include "AVI_avi.h" @@ -93,7 +92,6 @@ #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_bitplanes.h" @@ -117,7 +115,7 @@ #define ANIM_NONE (0) #define ANIM_SEQUENCE (1 << 0) #define ANIM_DIR (1 << 1) -#define ANIM_ANIM5 (1 << 2) +#define ANIM_DEPRECATED (1 << 2) #define ANIM_TGA (1 << 3) #define ANIM_MOVIE (1 << 4) #define ANIM_MDEC (1 << 5) @@ -126,13 +124,10 @@ #define ANIM_FFMPEG (1 << 8) #define ANIM_REDCODE (1 << 9) -#define ANIM5_MMAP 0 -#define ANIM5_MALLOC 1 -#define ANIM5_SNGBUF 2 -#define ANIM5_XOR 4 - #define MAXNUMSTREAMS 50 +struct _AviMovie; + struct anim { int ib_flags; int curtype; @@ -145,14 +140,6 @@ struct anim { /* voor sequence */ char first[256]; - /* anim5 */ - struct ListBase anim5base; - void * anim5mmap; - int anim5len; - struct Anim5Delta *anim5curdlta; - void (*anim5decode)(struct ImBuf *, unsigned char *); - int anim5flags; - /* movie */ void *movie; void *track; diff --git a/source/blender/imbuf/intern/IMB_anim5.h b/source/blender/imbuf/intern/IMB_anim5.h deleted file mode 100644 index 245b3b9a9be..00000000000 --- a/source/blender/imbuf/intern/IMB_anim5.h +++ /dev/null @@ -1,20 +0,0 @@ -/* IMB_anim.h */ -#ifndef IMB_ANIM5_H -#define IMB_ANIM5_H - -struct anim; - -/** - * - * @attention Defined in anim5.c - */ -int nextanim5(struct anim * anim); -int rewindanim5(struct anim * anim); -int startanim5(struct anim * anim); -void free_anim_anim5(struct anim * anim); -struct ImBuf * anim5_fetchibuf(struct anim * anim); - - -#endif - - diff --git a/source/blender/imbuf/intern/IMB_bmp.h b/source/blender/imbuf/intern/IMB_bmp.h deleted file mode 100644 index 99561eeead2..00000000000 --- a/source/blender/imbuf/intern/IMB_bmp.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * IMB_bmp.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_bmp.h - * \ingroup imbuf - * \brief Function declarations for bmp.c - */ - -#ifndef IMB_BMP_H -#define IMB_BMP_H - -struct ImBuf; - -int imb_is_a_bmp(void *buf); -struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags); -short imb_savebmp(struct ImBuf *ibuf, char *name, int flags); - -#endif - diff --git a/source/blender/imbuf/intern/IMB_cmap.h b/source/blender/imbuf/intern/IMB_cmap.h deleted file mode 100644 index 5e30e66f58e..00000000000 --- a/source/blender/imbuf/intern/IMB_cmap.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * IMB_cmap.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_cmap.h - * \ingroup imbuf - * \brief Function declarations for cmap.c - */ -#ifndef IMB_CMAP_H -#define IMB_CMAP_H - -struct ImBuf; - -void imb_makecolarray(struct ImBuf *ibuf, unsigned char *mem, short nocols); -void imb_losecmapbits(struct ImBuf *ibuf, unsigned int *coltab); -short *imb_coldeltatab(unsigned char *coltab, short mincol, short maxcol, short cbits); - -#endif - diff --git a/source/blender/imbuf/intern/IMB_cocoa.h b/source/blender/imbuf/intern/IMB_cocoa.h deleted file mode 100644 index a62e7028143..00000000000 --- a/source/blender/imbuf/intern/IMB_cocoa.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * IMB_cocoa.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Damien Plisson 10/2009 - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_cocoa.h - * \ingroup imbuf - * \brief Function declarations for imbuf_cocoa.m - */ - -#ifndef IMB_COCOA_H -#define IMB_COCOA_H - -/* Foward declaration of ImBuf structure. */ -struct ImBuf; - -/* Declarations for imbuf_cocoa.m */ -struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, int size, int flags); -short imb_cocoaSaveImage(struct ImBuf *ibuf, char *name, int flags); - -#endif /* IMB_COCOA_H */ - diff --git a/source/blender/imbuf/intern/IMB_filetype.h b/source/blender/imbuf/intern/IMB_filetype.h new file mode 100644 index 00000000000..9fd4108bee9 --- /dev/null +++ b/source/blender/imbuf/intern/IMB_filetype.h @@ -0,0 +1,121 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Blender Foundation 2010. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef IMB_FILETYPE_H +#define IMB_FILETYPE_H + +/* Generic File Type */ + +struct ImBuf; + +#define IM_FTYPE_FLOAT 1 + +typedef struct ImFileType { + void (*init)(void); + void (*exit)(void); + + int (*is_a)(unsigned char *buf); + int (*ftype)(struct ImFileType *type, struct ImBuf *ibuf); + struct ImBuf *(*load)(unsigned char *mem, int size, int flags); + int (*save)(struct ImBuf *ibuf, char *name, int flags); + void (*load_tile)(struct ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty, unsigned int *rect); + + int flag; + int filetype; +} ImFileType; + +extern ImFileType IMB_FILE_TYPES[]; + +void imb_filetypes_init(void); +void imb_filetypes_exit(void); + +void imb_tile_cache_init(void); +void imb_tile_cache_exit(void); + +void imb_loadtile(struct ImBuf *ibuf, int tx, int ty, unsigned int *rect); +void imb_tile_cache_tile_free(struct ImBuf *ibuf, int tx, int ty); + +/* Type Specific Functions */ + +/* png */ +int imb_is_a_png(unsigned char *buf); +struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags); +int imb_savepng(struct ImBuf *ibuf, char *name, int flags); + +/* targa */ +int imb_is_a_targa(unsigned char *buf); +struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags); +int imb_savetarga(struct ImBuf * ibuf, char *name, int flags); + +/* iris */ +int imb_is_a_iris(unsigned char *mem); +struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags); +int imb_saveiris(struct ImBuf * ibuf, char *name, int flags); + +/* jp2 */ +int imb_is_a_jp2(unsigned char *buf); +struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags); +int imb_savejp2(struct ImBuf *ibuf, char *name, int flags); + +/* jpeg */ +int imb_is_a_jpeg(unsigned char *mem); +int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags); +struct ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags); +struct ImBuf * imb_load_jpeg (unsigned char * buffer, int size, int flags); + +/* bmp */ +int imb_is_a_bmp(unsigned char *buf); +struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags); +int imb_savebmp(struct ImBuf *ibuf, char *name, int flags); + +/* cocoa */ +struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, int size, int flags); +short imb_cocoaSaveImage(struct ImBuf *ibuf, char *name, int flags); + +/* cineon */ +int imb_savecineon(struct ImBuf *buf, char *myfil, int flags); +struct ImBuf *imb_loadcineon(unsigned char *mem, int size, int flags); +int imb_is_cineon(unsigned char *buf); + +/* dpx */ +int imb_save_dpx(struct ImBuf *buf, char *myfile, int flags); +struct ImBuf *imb_loaddpx(unsigned char *mem, int size, int flags); +int imb_is_dpx(unsigned char *buf); + +/* hdr */ +int imb_is_a_hdr(unsigned char *buf); +struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags); +int imb_savehdr(struct ImBuf * ibuf, char *name, int flags); + +/* tiff */ +void imb_inittiff(void); +int imb_is_a_tiff(unsigned char *buf); +struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags); +void imb_loadtiletiff(struct ImBuf *ibuf, unsigned char *mem, int size, + int tx, int ty, unsigned int *rect); +int imb_savetiff(struct ImBuf *ibuf, char *name, int flags); +void *libtiff_findsymbol(char *name); + +#endif /* IMB_FILETYPE_H */ + diff --git a/source/blender/imbuf/intern/IMB_filter.h b/source/blender/imbuf/intern/IMB_filter.h index 4f54ea91a1f..84ad72c520a 100644 --- a/source/blender/imbuf/intern/IMB_filter.h +++ b/source/blender/imbuf/intern/IMB_filter.h @@ -41,5 +41,8 @@ struct ImBuf; void imb_filterx(struct ImBuf *ibuf); +void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h); +void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h); + #endif diff --git a/source/blender/imbuf/intern/IMB_hamx.h b/source/blender/imbuf/intern/IMB_hamx.h deleted file mode 100644 index e39aef8355d..00000000000 --- a/source/blender/imbuf/intern/IMB_hamx.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * IMB_hamx.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_hamx.h - * \ingroup imbuf - * \brief Function declarations for hamx.c - */ - -#ifndef IMB_HAMX_H -#define IMB_HAMX_H - -struct ImBuf; - -struct ImBuf *imb_loadanim(int *iffmem, int flags); -short imb_enc_anim(struct ImBuf *ibuf, int file); -void imb_convhamx(struct ImBuf *ibuf, unsigned char *coltab, short *deltab); - -#endif - diff --git a/source/blender/imbuf/intern/IMB_iris.h b/source/blender/imbuf/intern/IMB_iris.h deleted file mode 100644 index 3aa157cb959..00000000000 --- a/source/blender/imbuf/intern/IMB_iris.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * IMB_iris.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_iris.h - * \ingroup imbuf - * \brief Function declarations for iris.c - */ - -#ifndef IMB_IRIS_H -#define IMB_IRIS_H - -struct ImBuf; - -struct ImBuf *imb_loadiris(unsigned char *mem, int flags); -short imb_saveiris(struct ImBuf * ibuf, char *name, int flags); - -#endif - diff --git a/source/blender/imbuf/intern/IMB_jp2.h b/source/blender/imbuf/intern/IMB_jp2.h deleted file mode 100644 index 66ff69314ae..00000000000 --- a/source/blender/imbuf/intern/IMB_jp2.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * IMB_jp2.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_jp2.h - * \ingroup imbuf - * \brief Function declarations for jp2.c - */ - -#ifndef IMB_JP2_H -#define IMB_JP2_H - -#ifdef WITH_OPENJPEG -struct ImBuf; - -int imb_is_a_jp2(void *buf); -struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags); -short imb_savejp2(struct ImBuf *ibuf, char *name, int flags); -#endif /* WITH_OPENJPEG */ - -#endif - diff --git a/source/blender/imbuf/intern/IMB_jpeg.h b/source/blender/imbuf/intern/IMB_jpeg.h deleted file mode 100644 index 8e0ba3451ae..00000000000 --- a/source/blender/imbuf/intern/IMB_jpeg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * IMB_jpeg.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_jpeg.h - * \ingroup imbuf - * \brief Function declarations for jpeg.c - */ - -#ifndef IMB_JPEG_H -#define IMB_JPEG_H - -struct ImBuf; -struct jpeg_compress_struct; - -int imb_is_a_jpeg(unsigned char *mem); -int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags); -struct ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags); -struct ImBuf * imb_ibJpegImageFromMemory (unsigned char * buffer, int size, int flags); - -#endif - diff --git a/source/blender/imbuf/intern/IMB_imginfo.h b/source/blender/imbuf/intern/IMB_metadata.h similarity index 74% rename from source/blender/imbuf/intern/IMB_imginfo.h rename to source/blender/imbuf/intern/IMB_metadata.h index 18a2231b0fc..625e0791e07 100644 --- a/source/blender/imbuf/intern/IMB_imginfo.h +++ b/source/blender/imbuf/intern/IMB_metadata.h @@ -1,5 +1,5 @@ /** - * $Id$ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,21 +30,17 @@ #ifndef _IMB_IMGINFO_H #define _IMB_IMGINFO_H -#ifdef __cplusplus -extern "C" { -#endif - struct ImBuf; -typedef struct ImgInfo { - struct ImgInfo *next, *prev; +typedef struct ImMetaData { + struct ImMetaData *next, *prev; char* key; char* value; int len; -} ImgInfo; +} ImMetaData; -/** The imginfo is a list of key/value pairs (both char*) that can me - saved in the header of several image formats. +/** The metadata is a list of key/value pairs (both char*) that can me + saved in the header of several image formats. Apart from some common keys like 'Software' and 'Description' (png standard) we'll use keys within the Blender namespace, so should be called 'Blender::StampInfo' or 'Blender::FrameNum' @@ -52,34 +48,33 @@ typedef struct ImgInfo { */ -/* free blender ImgInfo struct */ -void IMB_imginfo_free(struct ImBuf* img); +/* free blender ImMetaData struct */ +void IMB_metadata_free(struct ImBuf* img); /** read the field from the image info into the field * @param img - the ImBuf that contains the image data * @param key - the key of the field * @param value - the data in the field, first one found with key is returned, - memory has to be allocated by user. + memory has to be allocated by user. * @param len - length of value buffer allocated by user. * @return - 1 (true) if ImageInfo present and value for the key found, 0 (false) otherwise */ -int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* value, int len); +int IMB_metadata_get_field(struct ImBuf* img, const char* key, char* value, int len); -/** set user data in the ImgInfo struct, which has to be allocated with IMB_imginfo_create +/** set user data in the ImMetaData struct, which has to be allocated with IMB_metadata_create * before calling this function. * @param img - the ImBuf that contains the image data * @param key - the key of the field * @param value - the data to be written to the field. zero terminated string * @return - 1 (true) if ImageInfo present, 0 (false) otherwise */ -int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field); +int IMB_metadata_add_field(struct ImBuf* img, const char* key, const char* field); -/** delete the key/field par in the ImgInfo struct. +/** delete the key/field par in the ImMetaData struct. * @param img - the ImBuf that contains the image data * @param key - the key of the field * @return - 1 (true) if delete the key/field, 0 (false) otherwise */ -int IMB_imginfo_del_field(struct ImBuf *img, const char *key); +int IMB_metadata_del_field(struct ImBuf *img, const char *key); #endif /* _IMB_IMGINFO_H */ - diff --git a/source/blender/imbuf/intern/IMB_tiff.h b/source/blender/imbuf/intern/IMB_tiff.h deleted file mode 100644 index ccd993fe477..00000000000 --- a/source/blender/imbuf/intern/IMB_tiff.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * IMB_tiff.h - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jonathan Merritt. - * - * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_tiff.h - * \ingroup imbuf - * \brief Function declarations for tiff.c - */ - -#ifndef IMB_TIFF_H -#define IMB_TIFF_H - -/* Foward declaration of ImBuf structure. */ -struct ImBuf; - -/* Declarations for tiff.c */ -int imb_is_a_tiff(void *buf); -struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags); -short imb_savetiff(struct ImBuf *ibuf, char *name, int flags); -void* libtiff_findsymbol(char *name); - -#endif /* IMB_TIFF_H */ - diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile index 0f2020c799a..5f8029ddf72 100644 --- a/source/blender/imbuf/intern/Makefile +++ b/source/blender/imbuf/intern/Makefile @@ -61,7 +61,6 @@ CFLAGS += $(LEVEL_1_C_WARNINGS) CPPFLAGS += -I$(NAN_JPEG)/include CPPFLAGS += -I$(NAN_PNG)/include CPPFLAGS += -I$(NAN_ZLIB)/include -CPPFLAGS += -I$(NAN_TIFF)/include CPPFLAGS += -I../../include CPPFLAGS += -I../../blenkernel CPPFLAGS += -I../../blenlib @@ -85,3 +84,8 @@ ifeq ($(WITH_FFMPEG), true) CPPFLAGS += -DWITH_FFMPEG CPPFLAGS += $(NAN_FFMPEGCFLAGS) endif + +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF + CPPFLAGS += -I$(NAN_TIFF)/include +endif diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c index 52ec5b37a6f..606913dd590 100644 --- a/source/blender/imbuf/intern/allocimbuf.c +++ b/source/blender/imbuf/intern/allocimbuf.c @@ -32,54 +32,38 @@ /* It's become a bit messy... Basically, only the IMB_ prefixed files * should remain. */ +#include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf.h" - -#include "IMB_divers.h" #include "IMB_allocimbuf.h" -#include "IMB_imginfo.h" +#include "IMB_filetype.h" +#include "IMB_metadata.h" + +#include "imbuf.h" + #include "MEM_CacheLimiterC-Api.h" -static unsigned int dfltcmap[16] = { - 0x00000000, 0xffffffff, 0x777777ff, 0xccccccff, - 0xcc3344ff, 0xdd8844ff, 0xccdd44ff, 0x888833ff, - 0x338844ff, 0x44dd44ff, 0x44ddccff, 0x3388ccff, - 0x8888ddff, 0x4433ccff, 0xcc33ccff, 0xcc88ddff -}; - -void imb_freeplanesImBuf(struct ImBuf * ibuf) -{ - if (ibuf==NULL) return; - if (ibuf->planes){ - if (ibuf->mall & IB_planes) MEM_freeN(ibuf->planes); - } - ibuf->planes = 0; - ibuf->mall &= ~IB_planes; -} - -void imb_freemipmapImBuf(struct ImBuf * ibuf) +void imb_freemipmapImBuf(ImBuf *ibuf) { int a; - for(a=0; amipmap[a]) IMB_freeImBuf(ibuf->mipmap[a]); - ibuf->mipmap[a]= NULL; + for(a=1; amiptot; a++) { + if(ibuf->mipmap[a-1]) + IMB_freeImBuf(ibuf->mipmap[a-1]); + ibuf->mipmap[a-1]= NULL; } + + ibuf->miptot= 0; } /* any free rect frees mipmaps to be sure, creation is in render on first request */ -void imb_freerectfloatImBuf(struct ImBuf * ibuf) +void imb_freerectfloatImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return; + if(ibuf==NULL) return; - if (ibuf->rect_float) { - if (ibuf->mall & IB_rectfloat) { - MEM_freeN(ibuf->rect_float); - ibuf->rect_float=NULL; - } + if(ibuf->rect_float && (ibuf->mall & IB_rectfloat)) { + MEM_freeN(ibuf->rect_float); + ibuf->rect_float=NULL; } imb_freemipmapImBuf(ibuf); @@ -89,19 +73,15 @@ void imb_freerectfloatImBuf(struct ImBuf * ibuf) } /* any free rect frees mipmaps to be sure, creation is in render on first request */ -void imb_freerectImBuf(struct ImBuf * ibuf) +void imb_freerectImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return; + if(ibuf==NULL) return; - if (ibuf->crect && ibuf->crect != ibuf->rect) { + if(ibuf->crect && ibuf->crect != ibuf->rect) MEM_freeN(ibuf->crect); - } - if (ibuf->rect) { - if (ibuf->mall & IB_rect) { - MEM_freeN(ibuf->rect); - } - } + if(ibuf->rect && (ibuf->mall & IB_rect)) + MEM_freeN(ibuf->rect); imb_freemipmapImBuf(ibuf); @@ -110,150 +90,166 @@ void imb_freerectImBuf(struct ImBuf * ibuf) ibuf->mall &= ~IB_rect; } -static void freeencodedbufferImBuf(struct ImBuf * ibuf) +void imb_freetilesImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return; - if (ibuf->encodedbuffer){ - if (ibuf->mall & IB_mem) MEM_freeN(ibuf->encodedbuffer); + int tx, ty; + + if(ibuf==NULL) return; + + if(ibuf->tiles && (ibuf->mall & IB_tiles)) { + for(ty=0; tyytiles; ty++) { + for(tx=0; txxtiles; tx++) { + if(ibuf->tiles[ibuf->xtiles*ty + tx]) { + imb_tile_cache_tile_free(ibuf, tx, ty); + MEM_freeN(ibuf->tiles[ibuf->xtiles*ty + tx]); + } + } + } + + MEM_freeN(ibuf->tiles); } + + ibuf->tiles= NULL; + ibuf->mall &= ~IB_tiles; +} + +static void freeencodedbufferImBuf(ImBuf *ibuf) +{ + if(ibuf==NULL) return; + + if(ibuf->encodedbuffer && (ibuf->mall & IB_mem)) + MEM_freeN(ibuf->encodedbuffer); + ibuf->encodedbuffer = 0; ibuf->encodedbuffersize = 0; ibuf->encodedsize = 0; ibuf->mall &= ~IB_mem; } -void IMB_freezbufImBuf(struct ImBuf * ibuf) +void IMB_freezbufImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return; - if (ibuf->zbuf){ - if (ibuf->mall & IB_zbuf) MEM_freeN(ibuf->zbuf); - } + if(ibuf==NULL) return; + + if(ibuf->zbuf && (ibuf->mall & IB_zbuf)) + MEM_freeN(ibuf->zbuf); + ibuf->zbuf= NULL; ibuf->mall &= ~IB_zbuf; } -void IMB_freezbuffloatImBuf(struct ImBuf * ibuf) +void IMB_freezbuffloatImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return; - if (ibuf->zbuf_float){ - if (ibuf->mall & IB_zbuffloat) MEM_freeN(ibuf->zbuf_float); - } + if(ibuf==NULL) return; + + if(ibuf->zbuf_float && (ibuf->mall & IB_zbuffloat)) + MEM_freeN(ibuf->zbuf_float); + ibuf->zbuf_float= NULL; ibuf->mall &= ~IB_zbuffloat; } -void IMB_freecmapImBuf(struct ImBuf * ibuf) +void IMB_freeImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return; - if (ibuf->cmap){ - if (ibuf->mall & IB_cmap) MEM_freeN(ibuf->cmap); - } - ibuf->cmap = 0; - ibuf->mall &= ~IB_cmap; -} - -void IMB_freeImBuf(struct ImBuf * ibuf) -{ - if (ibuf){ - if (ibuf->refcounter > 0) { + if(ibuf) { + if(ibuf->refcounter > 0) { ibuf->refcounter--; - } else { - imb_freeplanesImBuf(ibuf); + } + else { imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); + imb_freetilesImBuf(ibuf); IMB_freezbufImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); - IMB_freecmapImBuf(ibuf); freeencodedbufferImBuf(ibuf); IMB_cache_limiter_unmanage(ibuf); - IMB_imginfo_free(ibuf); + IMB_metadata_free(ibuf); MEM_freeN(ibuf); } } } -void IMB_refImBuf(struct ImBuf * ibuf) +void IMB_refImBuf(ImBuf *ibuf) { ibuf->refcounter++; } -short addzbufImBuf(struct ImBuf * ibuf) +short addzbufImBuf(ImBuf *ibuf) { int size; - if (ibuf==NULL) return(FALSE); + if(ibuf==NULL) return FALSE; IMB_freezbufImBuf(ibuf); - size = ibuf->x * ibuf->y * sizeof(unsigned int); - if ( (ibuf->zbuf = MEM_mapallocN(size, "addzbufImBuf")) ){ + size = ibuf->x *ibuf->y *sizeof(unsigned int); + if((ibuf->zbuf = MEM_mapallocN(size, "addzbufImBuf"))) { ibuf->mall |= IB_zbuf; ibuf->flags |= IB_zbuf; - return (TRUE); + return TRUE; } - return (FALSE); + return FALSE; } -short addzbuffloatImBuf(struct ImBuf * ibuf) +short addzbuffloatImBuf(ImBuf *ibuf) { int size; - if (ibuf==NULL) return(FALSE); + if(ibuf==NULL) return FALSE; IMB_freezbuffloatImBuf(ibuf); - size = ibuf->x * ibuf->y * sizeof(float); - if ( (ibuf->zbuf_float = MEM_mapallocN(size, "addzbuffloatImBuf")) ){ + size = ibuf->x *ibuf->y *sizeof(float); + if((ibuf->zbuf_float = MEM_mapallocN(size, "addzbuffloatImBuf"))) { ibuf->mall |= IB_zbuffloat; ibuf->flags |= IB_zbuffloat; - return (TRUE); + return TRUE; } - return (FALSE); + return FALSE; } -short imb_addencodedbufferImBuf(struct ImBuf * ibuf) +short imb_addencodedbufferImBuf(ImBuf *ibuf) { - if (ibuf==NULL) return(FALSE); + if(ibuf==NULL) return FALSE; freeencodedbufferImBuf(ibuf); - if (ibuf->encodedbuffersize == 0) + if(ibuf->encodedbuffersize == 0) ibuf->encodedbuffersize = 10000; ibuf->encodedsize = 0; - if ( (ibuf->encodedbuffer = MEM_mallocN(ibuf->encodedbuffersize, "addencodedbufferImBuf") )){ + if((ibuf->encodedbuffer = MEM_mallocN(ibuf->encodedbuffersize, "addencodedbufferImBuf"))) { ibuf->mall |= IB_mem; ibuf->flags |= IB_mem; - return (TRUE); + return TRUE; } - return (FALSE); + return FALSE; } -short imb_enlargeencodedbufferImBuf(struct ImBuf * ibuf) +short imb_enlargeencodedbufferImBuf(ImBuf *ibuf) { unsigned int newsize, encodedsize; void *newbuffer; - if (ibuf==NULL) return(FALSE); + if(ibuf==NULL) return FALSE; - if (ibuf->encodedbuffersize < ibuf->encodedsize) { + if(ibuf->encodedbuffersize < ibuf->encodedsize) { printf("imb_enlargeencodedbufferImBuf: error in parameters\n"); - return(FALSE); + return FALSE; } - newsize = 2 * ibuf->encodedbuffersize; - if (newsize < 10000) newsize = 10000; + newsize = 2 *ibuf->encodedbuffersize; + if(newsize < 10000) newsize = 10000; newbuffer = MEM_mallocN(newsize, "enlargeencodedbufferImBuf"); - if (newbuffer == NULL) return(FALSE); + if(newbuffer == NULL) return FALSE; - if (ibuf->encodedbuffer) { + if(ibuf->encodedbuffer) { memcpy(newbuffer, ibuf->encodedbuffer, ibuf->encodedsize); } else { ibuf->encodedsize = 0; @@ -269,153 +265,98 @@ short imb_enlargeencodedbufferImBuf(struct ImBuf * ibuf) ibuf->mall |= IB_mem; ibuf->flags |= IB_mem; - return (TRUE); + return TRUE; } -short imb_addrectfloatImBuf(struct ImBuf * ibuf) +short imb_addrectfloatImBuf(ImBuf *ibuf) { int size; - if (ibuf==NULL) return(FALSE); + if(ibuf==NULL) return FALSE; imb_freerectfloatImBuf(ibuf); - size = ibuf->x * ibuf->y; - size = size * 4 * sizeof(float); + size = ibuf->x *ibuf->y; + size = size *4 *sizeof(float); ibuf->channels= 4; - if ( (ibuf->rect_float = MEM_mapallocN(size, "imb_addrectfloatImBuf")) ){ + if((ibuf->rect_float = MEM_mapallocN(size, "imb_addrectfloatImBuf"))) { ibuf->mall |= IB_rectfloat; ibuf->flags |= IB_rectfloat; - return (TRUE); + return TRUE; } - return (FALSE); + return FALSE; } /* question; why also add zbuf? */ -short imb_addrectImBuf(struct ImBuf * ibuf) +short imb_addrectImBuf(ImBuf *ibuf) { int size; - if (ibuf==NULL) return(FALSE); + if(ibuf==NULL) return FALSE; imb_freerectImBuf(ibuf); - size = ibuf->x * ibuf->y; - size = size * sizeof(unsigned int); + size = ibuf->x*ibuf->y; + size = size*sizeof(unsigned int); - if ( (ibuf->rect = MEM_mapallocN(size, "imb_addrectImBuf")) ){ + if((ibuf->rect = MEM_mapallocN(size, "imb_addrectImBuf"))) { ibuf->mall |= IB_rect; ibuf->flags |= IB_rect; - if (ibuf->depth > 32) return (addzbufImBuf(ibuf)); - else return (TRUE); + if(ibuf->depth > 32) return (addzbufImBuf(ibuf)); + else return TRUE; } - return (FALSE); + return FALSE; } - -short imb_addcmapImBuf(struct ImBuf *ibuf) +short imb_addtilesImBuf(ImBuf *ibuf) { - int min; - - if (ibuf==NULL) return(FALSE); - IMB_freecmapImBuf(ibuf); + if(ibuf==NULL) return FALSE; - imb_checkncols(ibuf); - if (ibuf->maxcol == 0) return (TRUE); + if(!ibuf->tiles) + if((ibuf->tiles = MEM_callocN(sizeof(unsigned int*)*ibuf->xtiles*ibuf->ytiles, "imb_tiles"))) + ibuf->mall |= IB_tiles; - if ( (ibuf->cmap = MEM_callocN(sizeof(unsigned int) * ibuf->maxcol, "imb_addcmapImBuf") ) ){ - min = ibuf->maxcol * sizeof(unsigned int); - if (min > sizeof(dfltcmap)) min = sizeof(dfltcmap); - memcpy(ibuf->cmap, dfltcmap, min); - ibuf->mall |= IB_cmap; - ibuf->flags |= IB_cmap; - return (TRUE); - } - - return (FALSE); + return (ibuf->tiles != NULL); } - -short imb_addplanesImBuf(struct ImBuf *ibuf) +ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap) /* XXX bitmap argument is deprecated */ { - int size; - short skipx,d,y; - unsigned int **planes; - unsigned int *point2; + ImBuf *ibuf; - if (ibuf==NULL) return(FALSE); - imb_freeplanesImBuf(ibuf); + ibuf = MEM_callocN(sizeof(ImBuf), "ImBuf_struct"); - skipx = ((ibuf->x+31) >> 5); - ibuf->skipx=skipx; - y=ibuf->y; - d=ibuf->depth; - - planes = MEM_mallocN( (d*skipx*y)*sizeof(int) + d*sizeof(int *), "imb_addplanesImBuf"); - - ibuf->planes = planes; - if (planes==0) return (FALSE); - - point2 = (unsigned int *)(planes+d); - size = skipx*y; - - for (;d>0;d--){ - *(planes++) = point2; - point2 += size; - } - ibuf->mall |= IB_planes; - ibuf->flags |= IB_planes; - - return (TRUE); -} - - -struct ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap) -{ - struct ImBuf *ibuf; - - ibuf = MEM_callocN(sizeof(struct ImBuf), "ImBuf_struct"); - if (bitmap) flags |= IB_planes; - - if (ibuf){ + if(ibuf) { ibuf->x= x; ibuf->y= y; ibuf->depth= d; ibuf->ftype= TGA; ibuf->channels= 4; /* float option, is set to other values when buffers get assigned */ - if (flags & IB_rect){ - if (imb_addrectImBuf(ibuf)==FALSE){ + if(flags & IB_rect) { + if(imb_addrectImBuf(ibuf)==FALSE) { IMB_freeImBuf(ibuf); return NULL; } } - if (flags & IB_rectfloat){ - if (imb_addrectfloatImBuf(ibuf)==FALSE){ + if(flags & IB_rectfloat) { + if(imb_addrectfloatImBuf(ibuf)==FALSE) { IMB_freeImBuf(ibuf); return NULL; } } - if (flags & IB_zbuf){ - if (addzbufImBuf(ibuf)==FALSE){ + if(flags & IB_zbuf) { + if(addzbufImBuf(ibuf)==FALSE) { IMB_freeImBuf(ibuf); return NULL; } } - if (flags & IB_zbuffloat){ - if (addzbuffloatImBuf(ibuf)==FALSE){ - IMB_freeImBuf(ibuf); - return NULL; - } - } - - if (flags & IB_planes){ - if (imb_addplanesImBuf(ibuf)==FALSE){ + if(flags & IB_zbuffloat) { + if(addzbuffloatImBuf(ibuf)==FALSE) { IMB_freeImBuf(ibuf); return NULL; } @@ -425,37 +366,33 @@ struct ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, ucha } /* does no zbuffers? */ -struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1) +ImBuf *IMB_dupImBuf(ImBuf *ibuf1) { - struct ImBuf *ibuf2, tbuf; + ImBuf *ibuf2, tbuf; int flags = 0; int a, x, y; - if (ibuf1 == NULL) return NULL; + if(ibuf1 == NULL) return NULL; - if (ibuf1->rect) flags |= IB_rect; - if (ibuf1->rect_float) flags |= IB_rectfloat; - if (ibuf1->planes) flags |= IB_planes; + if(ibuf1->rect) flags |= IB_rect; + if(ibuf1->rect_float) flags |= IB_rectfloat; x = ibuf1->x; y = ibuf1->y; - if (ibuf1->flags & IB_fields) y *= 2; + if(ibuf1->flags & IB_fields) y *= 2; ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags, 0); - if (ibuf2 == NULL) return NULL; + if(ibuf2 == NULL) return NULL; - if (flags & IB_rect) - memcpy(ibuf2->rect, ibuf1->rect, x * y * sizeof(int)); + if(flags & IB_rect) + memcpy(ibuf2->rect, ibuf1->rect, x *y *sizeof(int)); - if (flags & IB_rectfloat) - memcpy(ibuf2->rect_float, ibuf1->rect_float, ibuf1->channels * x * y * sizeof(float)); + if(flags & IB_rectfloat) + memcpy(ibuf2->rect_float, ibuf1->rect_float, ibuf1->channels *x *y *sizeof(float)); - if (flags & IB_planes) - memcpy(*(ibuf2->planes),*(ibuf1->planes),ibuf1->depth * ibuf1->skipx * y * sizeof(int)); - - if (ibuf1->encodedbuffer) { + if(ibuf1->encodedbuffer) { ibuf2->encodedbuffersize = ibuf1->encodedbuffersize; - if (imb_addencodedbufferImBuf(ibuf2) == FALSE) { + if(imb_addencodedbufferImBuf(ibuf2) == FALSE) { IMB_freeImBuf(ibuf2); return NULL; } @@ -469,8 +406,6 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1) // fix pointers tbuf.rect = ibuf2->rect; tbuf.rect_float = ibuf2->rect_float; - tbuf.planes = ibuf2->planes; - tbuf.cmap = ibuf2->cmap; tbuf.encodedbuffer = ibuf2->encodedbuffer; tbuf.zbuf= NULL; tbuf.zbuf_float= NULL; @@ -482,42 +417,36 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1) tbuf.c_handle = 0; tbuf.refcounter = 0; - // for now don't duplicate image info - tbuf.img_info = 0; + // for now don't duplicate metadata + tbuf.metadata = 0; *ibuf2 = tbuf; - if (ibuf1->cmap){ - imb_addcmapImBuf(ibuf2); - if (ibuf2->cmap) memcpy(ibuf2->cmap,ibuf1->cmap,ibuf2->maxcol * sizeof(int)); - } - return(ibuf2); } /* support for cache limiting */ -static void imbuf_cache_destructor(void * data) +static void imbuf_cache_destructor(void *data) { - struct ImBuf * ibuf = (struct ImBuf*) data; + ImBuf *ibuf = (ImBuf*) data; - imb_freeplanesImBuf(ibuf); imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); IMB_freezbufImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); - IMB_freecmapImBuf(ibuf); freeencodedbufferImBuf(ibuf); ibuf->c_handle = 0; } -static MEM_CacheLimiterC ** get_imbuf_cache_limiter() +static MEM_CacheLimiterC **get_imbuf_cache_limiter() { - static MEM_CacheLimiterC * c = 0; - if (!c) { + static MEM_CacheLimiterC *c = 0; + + if(!c) c = new_MEM_CacheLimiter(imbuf_cache_destructor); - } + return &c; } @@ -527,9 +456,9 @@ void IMB_free_cache_limiter() *get_imbuf_cache_limiter() = 0; } -void IMB_cache_limiter_insert(struct ImBuf * i) +void IMB_cache_limiter_insert(ImBuf *i) { - if (!i->c_handle) { + if(!i->c_handle) { i->c_handle = MEM_CacheLimiter_insert( *get_imbuf_cache_limiter(), i); MEM_CacheLimiter_ref(i->c_handle); @@ -539,39 +468,37 @@ void IMB_cache_limiter_insert(struct ImBuf * i) } } -void IMB_cache_limiter_unmanage(struct ImBuf * i) +void IMB_cache_limiter_unmanage(ImBuf *i) { - if (i->c_handle) { + if(i->c_handle) { MEM_CacheLimiter_unmanage(i->c_handle); i->c_handle = 0; } } -void IMB_cache_limiter_touch(struct ImBuf * i) +void IMB_cache_limiter_touch(ImBuf *i) { - if (i->c_handle) { + if(i->c_handle) MEM_CacheLimiter_touch(i->c_handle); - } } -void IMB_cache_limiter_ref(struct ImBuf * i) +void IMB_cache_limiter_ref(ImBuf *i) { - if (i->c_handle) { + if(i->c_handle) MEM_CacheLimiter_ref(i->c_handle); - } } -void IMB_cache_limiter_unref(struct ImBuf * i) +void IMB_cache_limiter_unref(ImBuf *i) { - if (i->c_handle) { + if(i->c_handle) MEM_CacheLimiter_unref(i->c_handle); - } } -int IMB_cache_limiter_get_refcount(struct ImBuf * i) +int IMB_cache_limiter_get_refcount(ImBuf *i) { - if (i->c_handle) { + if(i->c_handle) return MEM_CacheLimiter_get_refcount(i->c_handle); - } + return 0; } + diff --git a/source/blender/imbuf/intern/amiga.c b/source/blender/imbuf/intern/amiga.c deleted file mode 100644 index 4b9e1d85df3..00000000000 --- a/source/blender/imbuf/intern/amiga.c +++ /dev/null @@ -1,540 +0,0 @@ -/** - * amiga.c - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifdef _WIN32 -#include -#define open _open -#define read _read -#define close _close -#define write _write -#endif -#include "imbuf.h" -#include "imbuf_patch.h" - -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" - -#include "BKE_global.h" - -#include "IMB_cmap.h" -#include "IMB_allocimbuf.h" -#include "IMB_bitplanes.h" -#include "IMB_amiga.h" - -/* actually hard coded endianness */ -#define GET_BIG_LONG(x) (((uchar *) (x))[0] << 24 | ((uchar *) (x))[1] << 16 | ((uchar *) (x))[2] << 8 | ((uchar *) (x))[3]) -#define GET_LITTLE_LONG(x) (((uchar *) (x))[3] << 24 | ((uchar *) (x))[2] << 16 | ((uchar *) (x))[1] << 8 | ((uchar *) (x))[0]) -#define SWAP_L(x) (((x << 24) & 0xff000000) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) | ((x >> 24) & 0xff)) -#define SWAP_S(x) (((x << 8) & 0xff00) | ((x >> 8) & 0xff)) - -/* more endianness... should move to a separate file... */ -#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__) -#define GET_ID GET_BIG_LONG -#define LITTLE_LONG SWAP_LONG -#else -#define GET_ID GET_LITTLE_LONG -#define LITTLE_LONG ENDIAN_NOP -#endif - -static uchar *decodebodyscanl(uchar *body, short bytes, uchar **list, short d) -{ - for (;d>0;d--){ - uchar *point; - short todo; - uchar i,j; - - point = *(list++); - todo=bytes; - while (todo>0){ - i = *body++; - - if (i & 128){ /* fill */ - if (i==128) continue; /* nop */ - - i=257-i; - todo-=i; - j = *(body++); - do{ - *(point++) = j; - i--; - }while (i); - } else{ /* copy */ - i++; - todo-=i; - - do{ - *(point++) = *(body++); - i--; - }while (i); - } - } - if (todo) return (0); - } - return(body); -} - - -static uchar *decodebodyh(struct ImBuf *ibuf, uchar *body) -{ - if (ibuf->y==1) { - body=decodebodyscanl(body, WIDTHB(ibuf->x), (uchar **)ibuf->planes, ibuf->depth); - } - else { - unsigned int **list; - short skipx,i,bytes,y; - - list = imb_copyplanelist(ibuf); - if (list == 0) return (0); - - y=ibuf->y; - bytes = WIDTHB(ibuf->x); - skipx = ibuf->skipx; - - for (;y>0;y--){ - body=decodebodyscanl(body, bytes, (uchar **)list, ibuf->depth); - if (body == 0) return (0); - - for (i=ibuf->depth-1;i>=0;i--){ - list[i] += skipx; - } - } - free(list); - } - return(body); -} - - -static uchar *decodebodykolum(uchar *body, short bytes, uchar **list, short d, int next) -{ - for (;d>0;d--){ - uchar *point; - short todo; - uchar i,j; - - point = *(list++); - todo=bytes; - while (todo>0){ - i = *body++; - - if (i & 128){ /* fill */ - if (i==128) continue; /* nop */ - - i=257-i; - todo-=i; - j = *body++; - do{ - *point = j; - point += next; - i--; - }while (i); - } - else{ /* copy */ - i++; - todo-=i; - - do{ - *point = *body++; - point += next; - i--; - }while (i); - } - } - if (todo) return (0); - } - return(body); -} - - -static uchar *decodebodyv(struct ImBuf *ibuf, uchar *body) -{ - uchar **list; - int skipx, i, bytes, times; - - list = (uchar **)imb_copyplanelist(ibuf); - if (list == 0) return (0); - - bytes = ibuf->y; - times = WIDTHB(ibuf->x); - skipx = ibuf->skipx << 2; - - for (;times>0;times--){ - body=decodebodykolum(body,bytes,list,ibuf->depth,skipx); - if (body == 0) return (0); - - for (i=ibuf->depth-1;i>=0;i--){ - list[i] += 1; - } - } - free(list); - return(body); -} - -static uchar *makebody(uchar **planes, short bytes, short depth, uchar *buf) -{ - uchar *bitplstart,*temp; - - register uchar last,this,*bitpl; - register short todo; - register int copy; - - bytes--; - for (;depth>0;depth--){ - bitpl = *(planes++); - bitplstart = bitpl; - todo = bytes; - last = *bitpl++; - this = *bitpl++; - copy = last^this; - while (todo>0){ - - if (copy){ - do{ - last = this; - this = *bitpl++; - if (last == this){ - if (this == bitpl[-3]){ /* three identical ones? */ - todo -= 1; /* set todo */ - break; - } - } - }while (--todo != 0); - - copy=bitpl-bitplstart; - copy -= 1; - if (todo) copy -= 2; - - temp = bitpl; - bitpl = bitplstart; - - while (copy){ - last = copy; - if (copy>MAXDAT) last = MAXDAT; - copy -= last; - *buf++ = last-1; - do{ - *buf++ = *bitpl++; - }while(--last != 0); - } - bitplstart = bitpl; - bitpl = temp; - last = this; - - copy = FALSE; - } - else{ - while (*bitpl++ == this){ /* search for first different bye */ - if (--todo == 0) break; /* or end of line */ - } - bitpl -= 1; - copy = bitpl-bitplstart; - bitplstart = bitpl; - todo -= 1; - this = *bitpl++; - - while (copy){ - if (copy>MAXRUN){ - *buf++ = -(MAXRUN-1); - *buf++ = last; - copy -= MAXRUN; - } - else{ - *buf++ = -(copy-1); - *buf++ = last; - break; - } - } - copy=TRUE; - } - } - } - return (buf); -} - - -short imb_encodebodyh(struct ImBuf *ibuf, int file) -{ - uchar *buf, *endbuf, *max; - int size, line, ok = TRUE; - unsigned int **list; - short skipx,i,y; - - line = WIDTHB(ibuf->x) * ibuf->depth; - line += (line >> 6) + 10; - size = 16 * line; - if (size < 16384) size = 16384; - - buf = (uchar *) malloc(size); - if (buf == 0) return (0); - - max = buf + size - line; - - list = imb_copyplanelist(ibuf); - if (list == 0){ - free(buf); - return (0); - } - - y=ibuf->y; - skipx = ibuf->skipx; - endbuf = buf; - - for (y=ibuf->y;y>0;y--){ - endbuf = makebody((uchar **)list, WIDTHB(ibuf->x), ibuf->depth, endbuf); - if (endbuf==0){ - ok = -20; - break; - } - if (endbuf >= max || y == 1){ - size = endbuf-buf; - if (write(file,buf,size)!=size) ok = -19; - endbuf = buf; - } - for (i=ibuf->depth-1;i>=0;i--){ - list[i] += skipx; - } - if (ok != TRUE) break; - } - free(list); - - free(buf); - return(ok); -} - - -short imb_encodebodyv(struct ImBuf *ibuf, int file) -{ - struct ImBuf *ibufv; - uchar *buf,*endbuf; - short x,offset; - - buf = (uchar *) malloc((ibuf->y + (ibuf->y >> 6) + 10) * ibuf->depth); - if (buf == 0) return (0); - - ibufv=IMB_allocImBuf((ibuf->y)<<3,1, ibuf->depth, 0, 1); - if (ibufv == 0){ - free(buf); - return (0); - } - - offset=0; - - for(x = WIDTHB(ibuf->x);x>0;x--){ - register short i; - - for(i = ibuf->depth-1 ;i>=0;i--){ - register uchar *p1,*p2; - register int skipx; - register short y; - - skipx = (ibuf->skipx)*sizeof(int *); - p1=(uchar *)ibuf->planes[i]; - p2=(uchar *)ibufv->planes[i]; - p1 += offset; - - for (y=ibuf->y;y>0;y--){ - *(p2++) = *p1; - p1 += skipx; - } - } - offset += 1; - - endbuf=makebody((uchar **)ibufv->planes, ibuf->y, ibuf->depth, buf); - if (endbuf==0) return (-20); - if (write(file,buf,endbuf-buf)!=endbuf-buf) return (-19); - } - free(buf); - IMB_freeImBuf(ibufv); - return (TRUE); -} - -static uchar *readbody(struct ImBuf *ibuf, uchar *body) -{ - int skipbuf,skipbdy,depth,y,offset = 0; - - skipbuf = ibuf->skipx; - skipbdy = WIDTHB(ibuf->x); - - for (y = ibuf->y; y> 0; y--){ - for( depth = 0; depth < ibuf->depth; depth ++){ - memcpy(ibuf->planes[depth] + offset, body, skipbdy); - body += skipbdy; - } - offset += skipbuf; - } - return body; -} - -struct ImBuf *imb_loadamiga(int *iffmem,int flags) -{ - int chunk,totlen,len,*cmap=0,cmaplen =0,*mem,ftype=0; - uchar *body=0; - struct BitMapHeader bmhd; - struct ImBuf *ibuf=0; - - mem = iffmem; - bmhd.w = 0; - - if (GET_ID(mem) != FORM) return (0); - if (GET_ID(mem+2) != ILBM) return (0); - totlen= (GET_BIG_LONG(mem+1) + 1) & ~1; - mem += 3; - totlen -= 4; - - - while(totlen > 0){ - chunk = GET_ID(mem); - len= (GET_BIG_LONG(mem+1) + 1) & ~1; - mem += 2; - - totlen -= len+8; - - switch (chunk){ - case BMHD: - memcpy(&bmhd, mem, sizeof(struct BitMapHeader)); - - bmhd.w = BIG_SHORT(bmhd.w); - bmhd.h = BIG_SHORT(bmhd.h); - bmhd.x = BIG_SHORT(bmhd.x); - bmhd.y = BIG_SHORT(bmhd.y); - bmhd.transparentColor = BIG_SHORT(bmhd.transparentColor); - bmhd.pageWidth = BIG_SHORT(bmhd.pageWidth); - bmhd.pageHeight = BIG_SHORT(bmhd.pageHeight); - - break; - case BODY: - body = (uchar *)mem; - break; - case CMAP: - cmap = mem; - cmaplen = len/3; - break; - case CAMG: - ftype = GET_BIG_LONG(mem); - break; - } - mem = (int *)((uchar *)mem +len); - if (body) break; - } - if (bmhd.w == 0) return (0); - if (body == 0) return (0); - - if (flags & IB_test) ibuf = IMB_allocImBuf(bmhd.w, bmhd.h, bmhd.nPlanes, 0, 0); - else ibuf = IMB_allocImBuf(bmhd.w, bmhd.h, bmhd.nPlanes + (bmhd.masking & 1),0,1); - - if (ibuf == 0) return (0); - - ibuf->ftype = (ftype | AMI); - ibuf->profile = IB_PROFILE_SRGB; - - if (cmap){ - ibuf->mincol = 0; - ibuf->maxcol = cmaplen; - imb_addcmapImBuf(ibuf); - imb_makecolarray(ibuf, (uchar *)cmap, 0); - } - - if (flags & IB_test){ - if (flags & IB_freem) free(iffmem); - return(ibuf); - } - - switch (bmhd.compression){ - case 0: - body= readbody(ibuf, body); - break; - case 1: - body= decodebodyh(ibuf,body); - break; - case 2: - body= decodebodyv(ibuf,body); - ibuf->type |= IB_subdlta; - break; - } - - if (flags & IB_freem) free(iffmem); - - if (body == 0){ - free (ibuf); - return(0); - } - - /* forget stencil */ - ibuf->depth = bmhd.nPlanes; - - if (flags & IB_rect){ - imb_addrectImBuf(ibuf); - imb_bptolong(ibuf); - imb_freeplanesImBuf(ibuf); - if (ibuf->cmap){ - if ((flags & IB_cmap) == 0) IMB_applycmap(ibuf); - } else if (ibuf->depth == 18){ - int i,col; - unsigned int *rect; - - rect = ibuf->rect; - for(i=ibuf->x * ibuf->y ; i>0 ; i--){ - col = *rect; - col = ((col & 0x3f000) << 6) + ((col & 0xfc0) << 4) + ((col & 0x3f) << 2); - col += (col & 0xc0c0c0) >> 6; - *rect++ = col; - } - ibuf->depth = 24; - } else if (ibuf->depth <= 8) { /* no colormap and no 24 bits: b&w */ - uchar *rect; - int size, shift; - - if (ibuf->depth < 8){ - rect = (uchar *) ibuf->rect; - rect += 3; - shift = 8 - ibuf->depth; - for (size = ibuf->x * ibuf->y; size > 0; size --){ - rect[0] <<= shift; - rect += 4; - } - } - rect = (uchar *) ibuf->rect; - for (size = ibuf->x * ibuf->y; size > 0; size --){ - rect[1] = rect[2] = rect[3]; - rect += 4; - } - ibuf->depth = 8; - } - } - - if ((flags & IB_ttob) == 0) IMB_flipy(ibuf); - - if (ibuf) { - if (ibuf->rect) - if (ENDIAN_ORDER == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); - } - - return (ibuf); -} diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c index d5ca605cad4..bfc3433875d 100644 --- a/source/blender/imbuf/intern/anim.c +++ b/source/blender/imbuf/intern/anim.c @@ -59,12 +59,12 @@ #endif #include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail - BLI_countlist BLI_stringdec */ + BLI_countlist BLI_stringdec */ #include "DNA_userdef_types.h" #include "BKE_global.h" +#include "BKE_depsgraph.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "AVI_avi.h" @@ -78,9 +78,7 @@ #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_bitplanes.h" #include "IMB_anim.h" -#include "IMB_anim5.h" #ifdef WITH_FFMPEG #include @@ -94,8 +92,13 @@ #define FFMPEG_CODEC_IS_POINTER 1 #endif +#if (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29) && \ + (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10) +#define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT #endif +#endif //WITH_FFMPEG + #ifdef WITH_REDCODE #ifdef _WIN32 /* on windows we use the ones in extern instead */ #include "libredcode/format.h" @@ -220,7 +223,13 @@ static void free_anim_movie(struct anim * anim) { ; } #endif -static int an_stringdec(char *string, char* kop, char *staart,unsigned short *numlen) { +#if defined(_WIN32) +# define PATHSEPERATOR '\\' +#else +# define PATHSEPERATOR '/' +#endif + +static int an_stringdec(const char *string, char* head, char *tail, unsigned short *numlen) { unsigned short len,nume,nums=0; short i,found=FALSE; @@ -228,7 +237,7 @@ static int an_stringdec(char *string, char* kop, char *staart,unsigned short *nu nume = len; for(i=len-1;i>=0;i--){ - if (string[i]=='/') break; + if (string[i]==PATHSEPERATOR) break; if (isdigit(string[i])) { if (found){ nums=i; @@ -242,21 +251,21 @@ static int an_stringdec(char *string, char* kop, char *staart,unsigned short *nu } } if (found){ - strcpy(staart,&string[nume+1]); - strcpy(kop,string); - kop[nums]=0; + strcpy(tail ,&string[nume+1]); + strcpy(head, string); + head[nums]= '\0'; *numlen=nume-nums+1; return ((int)atoi(&(string[nums]))); } - staart[0]=0; - strcpy(kop,string); + tail[0]= '\0'; + strcpy(head, string); *numlen=0; - return (1); + return TRUE; } -static void an_stringenc(char *string, char *head, char *start, unsigned short numlen, int pic) { - BLI_stringenc(string, head, start, numlen, pic); +static void an_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic) { + BLI_stringenc(string, head, tail, numlen, pic); } static void free_anim_avi (struct anim *anim) { @@ -316,7 +325,6 @@ void IMB_free_anim(struct anim * anim) { } IMB_free_anim_ibuf(anim); - free_anim_anim5(anim); free_anim_movie(anim); free_anim_avi(anim); @@ -330,7 +338,7 @@ void IMB_free_anim(struct anim * anim) { free_anim_redcode(anim); #endif - free(anim); + MEM_freeN(anim); } void IMB_close_anim(struct anim * anim) { @@ -465,7 +473,7 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) { if (anim->pgf) { lpbi = AVIStreamGetFrame(anim->pgf, position + AVIStreamStart(anim->pavi[anim->firstvideo])); if (lpbi) { - ibuf = IMB_ibImageFromMemory((int *) lpbi, 100, IB_rect); + ibuf = IMB_ibImageFromMemory((unsigned char *) lpbi, 100, IB_rect); //Oh brother... } } @@ -520,6 +528,13 @@ static int startffmpeg(struct anim * anim) { AVFormatContext *pFormatCtx; AVCodecContext *pCodecCtx; +#ifdef FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT + /* The following for color space determination */ + int srcRange, dstRange, brightness, contrast, saturation; + int *table; + const int *inv_table; +#endif + if (anim == 0) return(-1); do_init_ffmpeg(); @@ -536,7 +551,7 @@ static int startffmpeg(struct anim * anim) { dump_format(pFormatCtx, 0, anim->name, 0); - /* Find the first video stream */ + /* Find the first video stream */ videoStream=-1; for(i=0; inb_streams; i++) if(get_codec_from_stream(pFormatCtx->streams[i])->codec_type @@ -552,7 +567,7 @@ static int startffmpeg(struct anim * anim) { pCodecCtx = get_codec_from_stream(pFormatCtx->streams[videoStream]); - /* Find the decoder for the video stream */ + /* Find the decoder for the video stream */ pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) { av_close_input_file(pFormatCtx); @@ -574,9 +589,9 @@ static int startffmpeg(struct anim * anim) { anim->duration = pFormatCtx->duration * pCodecCtx->frame_rate / pCodecCtx->frame_rate_base / AV_TIME_BASE; #else - anim->duration = pFormatCtx->duration + anim->duration = ceil(pFormatCtx->duration * av_q2d(pFormatCtx->streams[videoStream]->r_frame_rate) - / AV_TIME_BASE; + / AV_TIME_BASE); #endif anim->params = 0; @@ -599,7 +614,7 @@ static int startffmpeg(struct anim * anim) { anim->pFrameRGB = avcodec_alloc_frame(); if (avpicture_get_size(PIX_FMT_RGBA, anim->x, anim->y) - != anim->x * anim->y * 4) { + != anim->x * anim->y * 4) { fprintf (stderr, "ffmpeg has changed alloc scheme ... ARGHHH!\n"); avcodec_close(anim->pCodecCtx); @@ -613,11 +628,11 @@ static int startffmpeg(struct anim * anim) { if (anim->ib_flags & IB_animdeinterlace) { avpicture_fill((AVPicture*) anim->pFrameDeinterlaced, - MEM_callocN(avpicture_get_size( + MEM_callocN(avpicture_get_size( anim->pCodecCtx->pix_fmt, anim->x, anim->y), "ffmpeg deinterlace"), - anim->pCodecCtx->pix_fmt, anim->x, anim->y); + anim->pCodecCtx->pix_fmt, anim->x, anim->y); } if (pCodecCtx->has_b_frames) { @@ -647,6 +662,25 @@ static int startffmpeg(struct anim * anim) { anim->pCodecCtx = NULL; return -1; } + +#ifdef FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT + /* Try do detect if input has 0-255 YCbCR range (JFIF Jpeg MotionJpeg) */ + if (!sws_getColorspaceDetails(anim->img_convert_ctx, (int**)&inv_table, &srcRange, + &table, &dstRange, &brightness, &contrast, &saturation)) { + + srcRange = srcRange || anim->pCodecCtx->color_range == AVCOL_RANGE_JPEG; + inv_table = sws_getCoefficients(anim->pCodecCtx->colorspace); + + if(sws_setColorspaceDetails(anim->img_convert_ctx, (int *)inv_table, srcRange, + table, dstRange, brightness, contrast, saturation)) { + + printf("Warning: Could not set libswscale colorspace details.\n"); + } + } + else { + printf("Warning: Could not set libswscale colorspace details.\n"); + } +#endif return (0); } @@ -664,13 +698,13 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect, 0); avpicture_fill((AVPicture*) anim->pFrameRGB, - (unsigned char*) ibuf->rect, - PIX_FMT_RGBA, anim->x, anim->y); + (unsigned char*) ibuf->rect, + PIX_FMT_RGBA, anim->x, anim->y); if (position != anim->curposition + 1) { if (position > anim->curposition + 1 - && anim->preseek - && position - (anim->curposition + 1) < anim->preseek) { + && anim->preseek + && position - (anim->curposition + 1) < anim->preseek) { while(av_read_frame(anim->pFormatCtx, &packet)>=0) { if (packet.stream_index == anim->videoStream) { avcodec_decode_video( @@ -698,11 +732,11 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { #else double frame_rate = av_q2d(anim->pFormatCtx->streams[anim->videoStream] - ->r_frame_rate); + ->r_frame_rate); #endif double time_base = av_q2d(anim->pFormatCtx->streams[anim->videoStream] - ->time_base); + ->time_base); long long pos = (long long) (position - anim->preseek) * AV_TIME_BASE / frame_rate; long long st_time = anim->pFormatCtx @@ -717,7 +751,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { } av_seek_frame(anim->pFormatCtx, -1, - pos, AVSEEK_FLAG_BACKWARD); + pos, AVSEEK_FLAG_BACKWARD); pts_to_search = (long long) (((double) position) / time_base / frame_rate); @@ -732,8 +766,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { while(av_read_frame(anim->pFormatCtx, &packet)>=0) { if(packet.stream_index == anim->videoStream) { avcodec_decode_video(anim->pCodecCtx, - anim->pFrame, &frameFinished, - packet.data, packet.size); + anim->pFrame, &frameFinished, + packet.data, packet.size); if (frameFinished && !pos_found) { if (packet.dts >= pts_to_search) { @@ -748,21 +782,21 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { /* This means the data wasnt read properly, this check stops crashing */ if (input->data[0]==0 && input->data[1]==0 - && input->data[2]==0 && input->data[3]==0){ + && input->data[2]==0 && input->data[3]==0){ av_free_packet(&packet); break; } if (anim->ib_flags & IB_animdeinterlace) { if (avpicture_deinterlace( - (AVPicture*) - anim->pFrameDeinterlaced, - (const AVPicture*) - anim->pFrame, - anim->pCodecCtx->pix_fmt, - anim->pCodecCtx->width, - anim->pCodecCtx->height) - < 0) { + (AVPicture*) + anim->pFrameDeinterlaced, + (const AVPicture*) + anim->pFrame, + anim->pCodecCtx->pix_fmt, + anim->pCodecCtx->width, + anim->pCodecCtx->height) + < 0) { filter_y = 1; } else { input = anim->pFrameDeinterlaced; @@ -782,7 +816,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { unsigned char* top; sws_scale(anim->img_convert_ctx, - input->data, + (const uint8_t * const *)input->data, input->linesize, 0, anim->pCodecCtx->height, @@ -841,7 +875,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { unsigned char* r; sws_scale(anim->img_convert_ctx, - input->data, + (const uint8_t * const *)input->data, input->linesize, 0, anim->pCodecCtx->height, @@ -931,8 +965,8 @@ static ImBuf * redcode_fetchibuf(struct anim * anim, int position) { return NULL; } - ibuf = IMB_allocImBuf(raw_frame->width * 2, - raw_frame->height * 2, 32, IB_rectfloat, 0); + ibuf = IMB_allocImBuf(raw_frame->width * 2, + raw_frame->height * 2, 32, IB_rectfloat, 0); redcode_decode_video_float(raw_frame, ibuf->rect_float, 1); @@ -958,7 +992,6 @@ static struct ImBuf * anim_getnew(struct anim * anim) { if (anim == NULL) return(0); - free_anim_anim5(anim); free_anim_movie(anim); free_anim_avi(anim); #ifdef WITH_QUICKTIME @@ -976,10 +1009,6 @@ static struct ImBuf * anim_getnew(struct anim * anim) { anim->curtype = imb_get_anim_type(anim->name); switch (anim->curtype) { - case ANIM_ANIM5: - if (startanim5(anim)) return (0); - ibuf = anim5_fetchibuf(anim); - break; case ANIM_SEQUENCE: ibuf = IMB_loadiffname(anim->name, anim->ib_flags); if (ibuf) { @@ -1057,26 +1086,13 @@ struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) { if (position >= anim->duration) return(0); switch(anim->curtype) { - case ANIM_ANIM5: - if (anim->curposition > position) rewindanim5(anim); - while (anim->curposition < position) { - if (nextanim5(anim)) return (0); - } - ibuf = anim5_fetchibuf(anim); - ibuf->profile = IB_PROFILE_SRGB; - break; case ANIM_SEQUENCE: pic = an_stringdec(anim->first, head, tail, &digits); pic += position; an_stringenc(anim->name, head, tail, digits, pic); - ibuf = IMB_loadiffname(anim->name, LI_rect); + ibuf = IMB_loadiffname(anim->name, IB_rect); if (ibuf) { anim->curposition = position; - /* patch... by freeing the cmap you prevent a double apply cmap... */ - /* probably the IB_CMAP option isn't working proper - * after the abgr->rgba reconstruction - */ - IMB_freecmapImBuf(ibuf); } break; case ANIM_MOVIE: @@ -1116,7 +1132,6 @@ struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) { } if (ibuf) { - if (anim->ib_flags & IB_ttob) IMB_flipy(ibuf); if (filter_y) IMB_filtery(ibuf); sprintf(ibuf->name, "%s.%04d", anim->name, anim->curposition + 1); @@ -1124,16 +1139,6 @@ struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) { return(ibuf); } -struct ImBuf * IMB_anim_nextpic(struct anim * anim) { - struct ImBuf * ibuf = 0; - - if (anim == 0) return(0); - - ibuf = IMB_anim_absolute(anim, anim->curposition + 1); - - return(ibuf); -} - /***/ int IMB_anim_get_duration(struct anim *anim) { diff --git a/source/blender/imbuf/intern/anim5.c b/source/blender/imbuf/intern/anim5.c deleted file mode 100644 index 28ba23ef73c..00000000000 --- a/source/blender/imbuf/intern/anim5.c +++ /dev/null @@ -1,539 +0,0 @@ -/** - * anim5.c - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): phase, code torn apart from anim.c - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail - BLI_countlist BLI_stringdec */ - -#include "imbuf.h" -#include "imbuf_patch.h" - -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" - -#include "IMB_cmap.h" -#include "IMB_allocimbuf.h" -#include "IMB_bitplanes.h" -#include "IMB_amiga.h" - -#include "IMB_anim.h" - -#include "IMB_anim5.h" - -#ifdef _WIN32 -#include -#include "BLI_winstuff.h" -#endif - -typedef struct Anhd{ - unsigned char type, mask; - unsigned short w, h; - unsigned short x, y; - unsigned short abs16, abs, reala6, real; - unsigned char interleave, pad0; - unsigned short bits16, bits; - unsigned char pad[16]; -}Anhd; - -typedef struct Anim5Delta { - struct Anim5Delta * next, * prev; - void * data; - int type; -}Anim5Delta; - - -/* om anim5's te kunnen lezen, moet een aantal gegevens bijgehouden worden: - * Een lijst van pointers naar delta's, in geheugen of ge'mmap'ed - * - * Mogelijk kan er ook een 'skiptab' aangelegd worden, om sneller - * sprongen te kunnen maken. - * - * Er moeten niet direct al plaatjes gegenereed worden, dit maakt de - * routines onbruikbaar om snel naar het goede plaatje te springen. - * Een routine voert dus de delta's uit, een andere routine maakt van - * voorgrondplaatje een ibuf; - */ - - -/* - een aantal functie pointers moet geinporteerd worden, zodat er niet - nog meer library's / objects meegelinkt hoeven te worden. - - Dezelfde structuur moet ook gebruikt kunnen worden voor het wegschrijven - van animaties. Hoe geef je dit aan ? - - Hoe snel kunnen 10 .dlta's gedecomprimeerd worden - (zonder omzetten naar rect). - - 1 - zoek naar 1e plaatje, animatie die aan de eisen voldoet - 2 - probeer volgende plaatje te vinden: - anim5 - decomprimeer - sequence - teller ophogen - directory - volgende entry - 3 - geen succes ? ga naar 1. - - -*/ - -/* - 1. Initialiseer routine met toegestane reeksen, en eerste naam - - series op naam (.0001) - - directories - - anim5 animaties - - TGA delta's - - iff 24bits delta's (.delta) - - 2. haal volgende (vorige ?) plaatje op. - - 3. vrijgeven -*/ - -/* selectie volgorde is: - 1 - anim5() - 2 - name - 3 - dir -*/ - -void free_anim_anim5(struct anim * anim) { - ListBase * animbase; - Anim5Delta * delta, * next; - - if (anim == NULL) return; - - animbase = &anim->anim5base; - delta = animbase->first; - - while (delta) { - next = delta->next; - - if (delta->type == ANIM5_MALLOC) free(delta->data); - BLI_remlink(animbase, delta); - free(delta); - - delta = next; - } - - if (anim->anim5mmap && anim->anim5len) { - MEM_freeN(anim->anim5mmap); - } - - anim->anim5mmap = NULL; - anim->anim5len = 0; - anim->anim5curdlta = 0; - anim->duration = 0; -} - -static void planes_to_rect(struct ImBuf * ibuf, int flags) { - if (ibuf == 0) return; - - /* dit komt regelrecht uit de amiga.c */ - - if (flags & IB_rect && ibuf->rect == 0) { - imb_addrectImBuf(ibuf); - imb_bptolong(ibuf); - IMB_flipy(ibuf); - imb_freeplanesImBuf(ibuf); - - if (ibuf->cmap){ - if ((flags & IB_cmap) == 0) { - IMB_applycmap(ibuf); - IMB_convert_rgba_to_abgr(ibuf); - } - } else if (ibuf->depth == 18){ - int i,col; - unsigned int *rect; - - rect = ibuf->rect; - for(i=ibuf->x * ibuf->y ; i>0 ; i--){ - col = *rect; - col = ((col & 0x3f000) << 6) + ((col & 0xfc0) << 4) - + ((col & 0x3f) << 2); - col += (col & 0xc0c0c0) >> 6; - *rect++ = col; - } - ibuf->depth = 24; - } else if (ibuf->depth <= 8) { - /* geen colormap en geen 24 bits: zwartwit */ - uchar *rect; - int size, shift; - - if (ibuf->depth < 8){ - rect = (uchar *) ibuf->rect; - rect += 3; - shift = 8 - ibuf->depth; - for (size = ibuf->x * ibuf->y; size > 0; size --){ - rect[0] <<= shift; - rect += 4; - } - } - rect = (uchar *) ibuf->rect; - for (size = ibuf->x * ibuf->y; size > 0; size --){ - rect[1] = rect[2] = rect[3]; - rect += 4; - } - ibuf->depth = 8; - } - } -} - - -static void anim5decode(struct ImBuf * ibuf, uchar * dlta) { - uchar depth; - int skip; - int *ofspoint; - uchar **planes; - - /* composition delta: - list with ofsets for delta' s by bitplane (ofspoint) - by column in delta (point) - number of operations (noops) - code - associated data - ... - ... - */ - - dlta += 8; - - ofspoint = (int *)dlta; - skip = ibuf->skipx * sizeof(int *); - planes = (uchar **)ibuf->planes; - - for(depth=ibuf->depth ; depth>0 ; depth--){ - if (GET_BIG_LONG(ofspoint)){ - uchar *planestart; - uchar *point; - uchar x; - - point = dlta + GET_BIG_LONG(ofspoint); - planestart = planes[0]; - x = (ibuf->x + 7) >> 3; - - do{ - uchar noop; - - if ( (noop = *(point++)) ){ - uchar *plane; - uchar code; - - plane = planestart; - do{ - if ((code = *(point++))==0){ - uchar val; - - code = *(point++); - val = *(point++); - do { - plane[0] = val; - plane += skip; - } while(--code); - - } else if (code & 128){ - - code &= 0x7f; - do{ - plane[0] = *(point++); - plane += skip; - } while(--code); - - } else plane += code * skip; - - } while(--noop); - } - planestart++; - } while(--x); - } - ofspoint++; - planes++; - } -} - - -static void anim5xordecode(struct ImBuf * ibuf, uchar * dlta) { - uchar depth; - int skip; - int *ofspoint; - uchar **planes; - - /* samenstelling delta: - lijst met ofsets voor delta's per bitplane (ofspoint) - per kolom in delta (point) - aantal handelingen (noops) - code - bijbehorende data - ... - ... - */ - - dlta += 8; - - ofspoint = (int *)dlta; - skip = ibuf->skipx * sizeof(int *); - planes = (uchar **)ibuf->planes; - - for(depth=ibuf->depth ; depth>0 ; depth--){ - - if (GET_BIG_LONG(ofspoint)){ - uchar *planestart; - uchar *point; - uchar x; - - point = dlta + GET_BIG_LONG(ofspoint); - planestart = planes[0]; - x = (ibuf->x + 7) >> 3; - - do{ - uchar noop; - - if ( (noop = *(point++)) ){ - uchar *plane; - uchar code; - - plane = planestart; - do{ - if ((code = *(point++))==0){ - uchar val; - - code = *(point++); - val = *(point++); - do{ - plane[0] ^= val; - plane += skip; - }while(--code); - - } else if (code & 128){ - - code &= 0x7f; - do{ - plane[0] ^= *(point++); - plane += skip; - }while(--code); - - } else plane += code * skip; - - }while(--noop); - } - planestart++; - }while(--x); - } - ofspoint++; - planes++; - } -} - - -int nextanim5(struct anim * anim) { - Anim5Delta * delta; - struct ImBuf * ibuf; - - if (anim == 0) return(-1); - - delta = anim->anim5curdlta; - - if (delta == 0) return (-1); - - if (anim->anim5flags & ANIM5_SNGBUF) { - ibuf = anim->ibuf1; - if (ibuf == 0) return (0); - anim->anim5decode(ibuf, delta->data); - } else { - ibuf = anim->ibuf2; - if (ibuf == 0) return (0); - anim->anim5decode(ibuf, delta->data); - anim->ibuf2 = anim->ibuf1; - anim->ibuf1 = ibuf; - } - - anim->anim5curdlta = anim->anim5curdlta->next; - anim->curposition++; - - return(0); -} - -int rewindanim5(struct anim * anim) { - Anim5Delta * delta; - struct ImBuf * ibuf; - - if (anim == 0) return (-1); - - IMB_free_anim_ibuf(anim); - - delta = anim->anim5base.first; - if (delta == 0) return (-1); - - ibuf = IMB_loadiffmem(delta->data, IB_planes); - if (ibuf == 0) return(-1); - - anim->ibuf1 = ibuf; - if ((anim->anim5flags & ANIM5_SNGBUF) == 0) anim->ibuf2 = IMB_dupImBuf(ibuf); - - anim->anim5curdlta = delta->next; - anim->curposition = 0; - - return(0); -} - - -int startanim5(struct anim * anim) { - int file, buf[20], totlen; - unsigned int len; - short * mem; - ListBase * animbase; - Anim5Delta * delta; - Anhd anhd; - - /* Controles */ - - if (anim == 0) return(-1); - - file = open(anim->name,O_BINARY|O_RDONLY); - if (file < 0) return (-1); - - if (read(file, buf, 24) != 24) { - close(file); - return(-1); - } - - if ((GET_ID(buf) != FORM) || (GET_ID(buf + 2) != ANIM) - || (GET_ID(buf + 3) != FORM) || (GET_ID(buf + 5) != ILBM)){ - printf("No anim5 file %s\n",anim->name); - close(file); - return (-1); - } - - /* de hele file wordt in het geheugen gemapped */ - - totlen = BLI_filesize(file); - if (totlen>0 && file>=0) { - lseek(file, 0L, SEEK_SET); - - mem= MEM_mallocN(totlen, "mmap"); - if (read(file, mem, totlen) != totlen) { - MEM_freeN(mem); - mem = NULL; - } - } else { - mem = NULL; - } - close (file); - - if (!mem) return (-1); - - anhd.interleave = 0; - anhd.bits = 0; - anhd.type = 5; - - anim->anim5mmap = mem; - anim->anim5len = totlen; - anim->anim5flags = 0; - anim->duration = 0; - - animbase = & anim->anim5base; - animbase->first = animbase->last = 0; - - /* eerste plaatje inlezen */ - - mem = mem + 6; - totlen -= 12; - - len = GET_BIG_LONG(mem + 2); - len = (len + 8 + 1) & ~1; - delta = NEW(Anim5Delta); - - delta->data = mem; - delta->type = ANIM5_MMAP; - - BLI_addtail(animbase, delta); - - mem += (len >> 1); - totlen -= len; - - while (totlen > 0) { - len = GET_BIG_LONG(mem + 2); - len = (len + 8 + 1) & ~1; - - switch(GET_ID(mem)){ - case FORM: - len = 12; - break; - case ANHD: - memcpy(&anhd, mem + 4, sizeof(Anhd)); - break; - case DLTA: - delta = NEW(Anim5Delta); - delta->data = mem; - delta->type = ANIM5_MMAP; - BLI_addtail(animbase, delta); - break; - } - - mem += (len >> 1); - totlen -= len; - } - - if (anhd.interleave == 1) anim->anim5flags |= ANIM5_SNGBUF; - if (BIG_SHORT(anhd.bits) & 2) anim->anim5decode = anim5xordecode; - else anim->anim5decode = anim5decode; - - /* laatste twee delta's wissen */ - - delta = animbase->last; - if (delta) { - BLI_remlink(animbase, delta); - free(delta); - } - - if ((anim->anim5flags & ANIM5_SNGBUF) == 0) { - delta = animbase->last; - if (delta) { - BLI_remlink(animbase, delta); - free(delta); - } - } - - anim->duration = BLI_countlist(animbase); - - return(rewindanim5(anim)); -} - - -struct ImBuf * anim5_fetchibuf(struct anim * anim) { - struct ImBuf * ibuf; - - if (anim == 0) return (0); - - ibuf = IMB_dupImBuf(anim->ibuf1); - planes_to_rect(ibuf, anim->ib_flags); - - ibuf->profile = IB_PROFILE_SRGB; - - return(ibuf); -} - diff --git a/source/blender/imbuf/intern/antialias.c b/source/blender/imbuf/intern/antialias.c deleted file mode 100644 index e3a878d0ac4..00000000000 --- a/source/blender/imbuf/intern/antialias.c +++ /dev/null @@ -1,466 +0,0 @@ -/** - * antialias.c - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "imbuf.h" - -#include "BLI_blenlib.h" -#include "DNA_listBase.h" - -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" -#include "IMB_allocimbuf.h" - -/* how it works: - -1 - seek for a transistion in a collumn -2 - check the relationship with left and right, - -Is pixel above transition to the left or right equal to the top color, seek down - -Is pixel below transition to the left or right equal to the bottom color, seek up - -*/ - -/* there should be a funcion * to indicate if two colors are - * equal or not. - * For now we use a define - */ - - -static unsigned int anti_mask = 0xffffffff; -static int anti_a, anti_b, anti_g, anti_r; - -#define compare(x, y) ((x ^ y) & anti_mask) - -typedef struct Edge -{ - struct Edge * next, * prev; - short position; - int col1, col2; -}Edge; - -static void anti_free_listarray(int count, ListBase * listarray) -{ - int i; - - if (listarray == 0) return; - - for (i = 0; i < count; i++) BLI_freelistN(listarray + i); - MEM_freeN(listarray); -} - -static ListBase * scanimage(struct ImBuf * ibuf, int dir) -{ - int step, pixels, lines, nextline, x, y, col1, col2; - unsigned int * rect; - ListBase * listarray, * curlist; - Edge * edge; - int count; - - switch (dir) { - case 'h': - step = 1; nextline = ibuf->x; - pixels = ibuf->x; lines = ibuf->y; - break; -/* case 'v': changed so assured values for step etc.. */ - default: - step = ibuf->x; nextline = 1; - pixels = ibuf->y; lines = ibuf->x; - } - - listarray = (ListBase*)MEM_callocN((lines)* sizeof(ListBase), "listarray"); - for (y = 0; y < lines; y++){ - rect = ibuf->rect; - rect += y * nextline; - curlist = listarray + y; - - col1 = rect[0]; - count = 0; - - for (x = 0; x < pixels; x++) { - col2 = rect[0]; - if (compare(col1, col2)) { - edge = NEW(Edge); - - if (edge == NULL) return(0); - - edge->position = x; - edge->col1 = col1; - edge->col2 = col2; - BLI_addtail(curlist, edge); - col1 = col2; - count++; - if (count > 100) { - printf("\n\n%s: Aborting antialias !\n", ibuf->name); - printf("To many transitions.\nIs this a natural image ?\n\n"), - anti_free_listarray(lines, listarray); - return(0); - } - } - rect += step; - } - } - - return(listarray); -} - - -static Edge * findmatch(Edge * first, Edge * edge) -{ - Edge * match = 0; - int in = 0, out = 65535; - - if (edge->prev) in = edge->prev->position; - if (edge->next) out = edge->next->position; - - while (first) { - if (first->position < edge->position) { - if (first->col1 == edge->col1) { - if (first->position >= in) match = first; - } else if (first->col2 == edge->col2) { - if (first->next == 0) match = first; - else if (first->next->position >= edge->position) match = first; - } else if (first->col2 == edge->col1) { - match = 0; /* at 'sig saw' situations this one can be wrongly set */ - } - } else if (first->position == edge->position) { - if (first->col1 == edge->col1 || first->col2 == edge->col2) match = first; - } else { - if (match) break; /* there is one */ - - if (first->col1 == edge->col1) { - if (first->prev == 0) match = first; - else if (first->prev->position <= edge->position) match = first; - } else if (first->col2 == edge->col2) { - if (first->position <= out) match = first; - } - } - - first = first->next; - } - - return(match); -} - - -static void filterdraw(unsigned int * ldest, unsigned int * lsrce, int zero, int half, int step) -{ - uchar * src, * dst; - int count; - double weight, add; - - /* we filter the pixels at ldest between in and out with pixels from lsrce - * weight values go from 0 to 1 - */ - - - count = half - zero; - if (count < 0) count = -count; - if (count <= 1) return; - - if (zero < half) { - src = (uchar *) (lsrce + (step * zero)); - dst = (uchar *) (ldest + (step * zero)); - } else { - zero--; - src = (uchar *) (lsrce + (step * zero)); - dst = (uchar *) (ldest + (step * zero)); - step = -step; - } - - step = 4 * step; - - dst += step * (count >> 1); - src += step * (count >> 1); - - count = (count + 1) >> 1; - add = 0.5 / count; - weight = 0.5 * add; - - /* this of course gamma corrected */ - - for(; count > 0; count --) { - if (anti_a) dst[0] += weight * (src[0] - dst[0]); - if (anti_b) dst[1] += weight * (src[1] - dst[1]); - if (anti_g) dst[2] += weight * (src[2] - dst[2]); - if (anti_r) dst[3] += weight * (src[3] - dst[3]); - dst += step; - src += step; - weight += add; - } -} - -static void filterimage(struct ImBuf * ibuf, struct ImBuf * cbuf, ListBase * listarray, int dir) -{ - int step, pixels, lines, nextline, y, pos, drawboth; - unsigned int * irect, * crect; - Edge * left, * middle, * right, temp, * any; - - switch (dir) { - case 'h': - step = 1; nextline = ibuf->x; - pixels = ibuf->x; lines = ibuf->y; - break; -/* case 'v': changed so have values */ - default: - step = ibuf->x; nextline = 1; - pixels = ibuf->y; lines = ibuf->x; - } - - for (y = 1; y < lines - 1; y++){ - irect = ibuf->rect; - irect += y * nextline; - crect = cbuf->rect; - crect += y * nextline; - - middle = listarray[y].first; - while (middle) { - left = findmatch(listarray[y - 1].first, middle); - right = findmatch(listarray[y + 1].first, middle); - drawboth = FALSE; - - if (left == 0 || right == 0) { - /* edge */ - any = left; - if (right) any = right; - if (any) { - /* mirroring */ - pos = 2 * middle->position - any->position; - - if (any->position < middle->position) { - if (pos > pixels - 1) pos = pixels - 1; - if (middle->next) { - if (pos > middle->next->position) pos = middle->next->position; - } -/* if (any->next) { - if (pos > any->next->position) pos = any->next->position; - } -*/ } else { - if (pos < 0) pos = 0; - if (middle->prev) { - if (pos < middle->prev->position) pos = middle->prev->position; - } -/* if (any->prev) { - if (pos < any->prev->position) pos = any->prev->position; - } -*/ } - temp.position = pos; - if (left) right = &temp; - else left = &temp; - drawboth = TRUE; - } - } else if (left->position == middle->position || right->position == middle->position) { - /* straight piece */ - /* small corner, with one of the two at distance 2 (the other is at dist 0) ? */ - - if (abs(left->position - right->position) == 2) drawboth = TRUE; - } else if (left->position < middle->position && right->position > middle->position){ - /* stair 1 */ - drawboth = TRUE; - } else if (left->position > middle->position && right->position < middle->position){ - /* stair 2 */ - drawboth = TRUE; - } else { - /* a peek */ - drawboth = TRUE; - } - - if (drawboth) { - filterdraw(irect, crect - nextline, left->position, middle->position, step); - filterdraw(irect, crect + nextline, right->position, middle->position, step); - } - - middle = middle->next; - } - } -} - - -void IMB_antialias(struct ImBuf * ibuf) -{ - struct ImBuf * cbuf; - ListBase * listarray; - - if (ibuf == 0) return; - cbuf = IMB_dupImBuf(ibuf); - if (cbuf == 0) return; - - anti_a = (anti_mask >> 24) & 0xff; - anti_b = (anti_mask >> 16) & 0xff; - anti_g = (anti_mask >> 8) & 0xff; - anti_r = (anti_mask >> 0) & 0xff; - - listarray = scanimage(cbuf, 'h'); - if (listarray) { - filterimage(ibuf, cbuf, listarray, 'h'); - anti_free_listarray(ibuf->y, listarray); - - listarray = scanimage(cbuf, 'v'); - if (listarray) { - filterimage(ibuf, cbuf, listarray, 'v'); - anti_free_listarray(ibuf->x, listarray); - } - } - - IMB_freeImBuf(cbuf); -} - - -/* intelligent scaling */ - -static void _intel_scale(struct ImBuf * ibuf, ListBase * listarray, int dir) -{ - int step, lines, nextline, x, y, col; - unsigned int * irect, * trect; - int start, end; - Edge * left, * right; - struct ImBuf * tbuf; - - switch (dir) { - case 'h': - step = 1; nextline = ibuf->x; - lines = ibuf->y; - tbuf = IMB_double_fast_y(ibuf); - break; - case 'v': - step = 2 * ibuf->x; nextline = 1; - lines = ibuf->x; - tbuf = IMB_double_fast_x(ibuf); - break; - default: - return; - } - - if (tbuf == NULL) return; - - imb_freerectImBuf(ibuf); - - ibuf->rect = tbuf->rect; - ibuf->mall |= IB_rect; - - ibuf->x = tbuf->x; - ibuf->y = tbuf->y; - tbuf->rect = 0; - IMB_freeImBuf(tbuf); - - for (y = 0; y < lines - 2; y++){ - irect = ibuf->rect; - irect += ((2 * y) + 1) * nextline; - - left = listarray[y].first; - while (left) { - right = findmatch(listarray[y + 1].first, left); - if (right) { - if (left->col2 == right->col2) { - if (left->next && right->next) { - if (left->next->position >= right->position) { - start = ((left->position + right->position) >> 1); - end = ((left->next->position + right->next->position) >> 1); - col = left->col2; - trect = irect + (start * step); - for (x = start; x < end; x++) { - *trect = col; - trect += step; - } - } - } - } - - if (left->col1 == right->col1) { - if (left->prev && right->prev) { - if (left->prev->position <= right->position) { - end = ((left->position + right->position) >> 1); - start = ((left->prev->position + right->prev->position) >> 1); - col = left->col1; - trect = irect + (start * step); - for (x = start; x < end; x++) { - *trect = col; - trect += step; - } - } - } - } - - } - left = left->next; - } - } -} - - -void IMB_clever_double(struct ImBuf * ibuf) -{ - ListBase * listarray, * curlist; - Edge * new; - int size; - int i; - - if (ibuf == 0) return; - - size = ibuf->x; - listarray = scanimage(ibuf, 'v'); - if (listarray) { - for (i = 0; i < size; i++) { - curlist = listarray + i; - new = (Edge*)MEM_callocN(sizeof(Edge),"Edge"); - new->col2 = ibuf->rect[i]; /* upper pixel */ - new->col1 = new->col2 - 1; - BLI_addhead(curlist, new); - new = (Edge*)MEM_callocN(sizeof(Edge),"Edge"); - new->position = ibuf->y - 1; - new->col1 = ibuf->rect[i + ((ibuf->y -1) * ibuf->x)]; /* bottom pixel */ - new->col2 = new->col1 - 1; - BLI_addtail(curlist, new); - } - _intel_scale(ibuf, listarray, 'v'); - anti_free_listarray(size, listarray); - - size = ibuf->y; - listarray = scanimage(ibuf, 'h'); - if (listarray) { - for (i = 0; i < size; i++) { - curlist = listarray + i; - new = (Edge*)MEM_callocN(sizeof(Edge),"Edge"); - new->col2 = ibuf->rect[i * ibuf->x]; /* left pixel */ - new->col1 = new->col2 - 1; - BLI_addhead(curlist, new); - new = (Edge*)MEM_callocN(sizeof(Edge),"Edge"); - new->position = ibuf->x - 1; - new->col1 = ibuf->rect[((i + 1) * ibuf->x) - 1]; /* right pixel */ - new->col2 = new->col1 - 1; - BLI_addtail(curlist, new); - } - _intel_scale(ibuf, listarray, 'h'); - anti_free_listarray(size, listarray); - } - } -} diff --git a/source/blender/imbuf/intern/bitplanes.c b/source/blender/imbuf/intern/bitplanes.c deleted file mode 100644 index 91fd2a0f563..00000000000 --- a/source/blender/imbuf/intern/bitplanes.c +++ /dev/null @@ -1,356 +0,0 @@ -/** - * bitplanes.c - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "imbuf.h" -#include "BLI_blenlib.h" - -#include "imbuf_patch.h" - -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" -#include "IMB_allocimbuf.h" -#include "IMB_bitplanes.h" - -unsigned int **imb_copyplanelist(struct ImBuf *ibuf) -{ - int nobp,i; - unsigned int **listn,**listo; - - nobp=ibuf->depth; - listn= malloc(nobp*sizeof(int *)); /* make copy of bitmap */ - if (listn==0) return (0); - - listo=ibuf->planes; - for (i=nobp;i>0;i--){ - *(listn++) = *(listo++); - } - listn -= nobp; - - return (listn); -} - -static void bptolscanl(unsigned int *buf, int size, unsigned int **list, int nobp, int offset) -{ - /* converts bitplanes to a buffer with ints - by 4 dividiable amount of bitplanes, - the width of bitplanes is rounded at ints */ - - list += nobp; - - for (;nobp>0;) - { - int todo,i; - register int bp1, bp2, bp3, bp4, data; - register unsigned int *point; - int loffset; - /*register unsigned int bp1, bp2, bp3, bp4;*/ - - bp1 = bp2 = bp3 = bp4 = todo = 0; - point = buf; - loffset = offset; - - if (nobp & 1){ - list -= 1; - nobp -= 1; - for(i=size;i>0;i--) - { - if (todo==0) - { - bp1 = BIG_LONG((list[0])[loffset]); - loffset++; - todo=32; - } - - data = *point; - data<<=1; - - if (bp1<0) data+=1; - bp1<<=1; - - /* data += (bp1 >> 31); - bp1 <<= 1; - */ - *(point++)=data; - todo--; - } - } else if (nobp & 2){ - list -= 2; - nobp -= 2; - for(i=size;i>0;i--) - { - if (todo==0) - { - bp1 = BIG_LONG((list[0])[loffset]); - bp2 = BIG_LONG((list[1])[loffset]); - loffset++; - todo=32; - } - - data = *point; - data<<=2; - - if (bp1<0) data+=1; - bp1<<=1; - if (bp2<0) data+=2; - bp2<<=1; - - /* data += (bp1 >> 31) + ((bp2 & 0x80000000) >> 30); - bp1 <<= 1; bp2 <<= 1; - */ - *(point++)=data; - todo--; - } - } else{ - list -= 4; - nobp -= 4; - for(i=size;i>0;i--) - { - if (todo==0) { - bp1 = BIG_LONG((list[0])[loffset]); - bp2 = BIG_LONG((list[1])[loffset]); - bp3 = BIG_LONG((list[2])[loffset]); - bp4 = BIG_LONG((list[3])[loffset]); - loffset++; - todo=32; - } - - data = *point; - data<<=4; - - if (bp1<0) data+=1; - bp1<<=1; - if (bp2<0) data+=2; - bp2<<=1; - if (bp3<0) data+=4; - bp3<<=1; - if (bp4<0) data+=8; - bp4<<=1; - - /* data += (bp1 >> 31) \ - + ((bp2 & 0x80000000) >> 30) \ - + ((bp3 & 0x80000000) >> 29) \ - + ((bp4 & 0x80000000) >> 28); - - bp1 <<= 1; bp2 <<= 1; - bp3 <<= 1; bp4 <<= 1; - */ - - *(point++)=data; - todo--; - } - } - } -} - - -void imb_bptolong(struct ImBuf *ibuf) -{ - int nobp,i,x; - unsigned int *rect,offset; - float black[4] = {0.0,0.0,0.0,1.0}; - float clear[4] = {0.0,0.0,0.0,0.0}; - - /* first clear all ints */ - - if (ibuf == 0) return; - if (ibuf->planes == 0) return; - if (ibuf->rect == 0) imb_addrectImBuf(ibuf); - - nobp=ibuf->depth; - if (nobp != 32){ - if (nobp == 24) IMB_rectfill(ibuf, black); /* set alpha */ - else IMB_rectfill(ibuf, clear); - } - - rect= ibuf->rect; - x= ibuf->x; - offset=0; - - for (i= ibuf->y; i>0; i--){ - bptolscanl(rect, x, ibuf->planes, nobp, offset); - rect += x; - offset += ibuf->skipx; - } -} - - -static void ltobpscanl(unsigned int *rect, int x, unsigned int **list, int nobp, int offset) -{ - /* converts a buffer with ints to bitplanes. Take care, buffer - will be destroyed !*/ - - if (nobp != 32) - { - int *rect2; - int todo,j; - - rect2 = (int*)rect; - - todo = 32-nobp; - for (j = x;j>0;j--){ - *(rect2++) <<= todo; - } - } - - list += nobp; - for (;nobp>0;){ - register int bp1=0, bp2=0, bp3=0, data; - register unsigned int *point; - int i,todo; - int bp4=0,loffset; - - point = rect; - todo=32; - loffset=offset; - - if (nobp & 1){ - list -= 1; - nobp -= 1; - - for(i=x;i>0;i--){ - data = *point; - - bp1 <<= 1; - if (data<0) bp1 += 1; - data <<= 1; - - *(point++) = data; - - todo--; - if (todo == 0){ - (list[0])[loffset] = bp1; - loffset++; - todo=32; - } - } - if (todo != 32) - { - bp1 <<= todo; - (list[0])[loffset] = bp1; - } - } else if (nobp & 2){ - list -= 2; - nobp -= 2; - for(i=x;i>0;i--){ - data = *point; - - bp2 <<= 1; - if (data<0) bp2 += 1; - data <<= 1; - bp1 <<= 1; - if (data<0) bp1 += 1; - data <<= 1; - - *(point++) = data; - - todo--; - if (todo == 0){ - (list[0])[loffset] = bp1; - (list[1])[loffset] = bp2; - loffset++; - todo=32; - } - } - if (todo != 32){ - bp1 <<= todo; - bp2 <<= todo; - (list[0])[loffset] = bp1; - (list[1])[loffset] = bp2; - } - } else{ - list -= 4; - nobp -= 4; - for(i=x;i>0;i--){ - data = *point; - - bp4 <<= 1; - if (data<0) bp4 += 1; - data <<= 1; - bp3 <<= 1; - if (data<0) bp3 += 1; - data <<= 1; - bp2 <<= 1; - if (data<0) bp2 += 1; - data <<= 1; - bp1 <<= 1; - if (data<0) bp1 += 1; - data <<= 1; - - *(point++) = data; - - todo--; - if (todo == 0){ - (list[0])[loffset] = bp1; - (list[1])[loffset] = bp2; - (list[2])[loffset] = bp3; - (list[3])[loffset] = bp4; - loffset++; - todo=32; - } - } - if (todo != 32){ - bp1 <<= todo; - bp2 <<= todo; - bp3 <<= todo; - bp4 <<= todo; - (list[0])[loffset] = bp1; - (list[1])[loffset] = bp2; - (list[2])[loffset] = bp3; - (list[3])[loffset] = bp4; - } - } - } -} - - -void imb_longtobp(struct ImBuf *ibuf) -{ - /* converts a buffer with ints to bitplanes. Take care, buffer - will be destroyed !*/ - - int nobp,i,x; - unsigned int *rect,offset,*buf; - ; - - nobp = ibuf->depth; - rect=ibuf->rect; - x=ibuf->x; - offset=0; - if ((buf=malloc(x*sizeof(int)))==0) return; - - for (i=ibuf->y;i>0;i--){ - memcpy(buf, rect, x*sizeof(int)); - rect +=x ; - ltobpscanl(buf, x, ibuf->planes, nobp, offset); - offset += ibuf->skipx; - } - free(buf); -} diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c index 0fd483b6b49..bdcf60090c3 100644 --- a/source/blender/imbuf/intern/bmp.c +++ b/source/blender/imbuf/intern/bmp.c @@ -30,13 +30,11 @@ #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_cmap.h" -#include "IMB_bmp.h" +#include "IMB_filetype.h" /* some code copied from article on microsoft.com, copied here for enhanced BMP support in the future @@ -98,7 +96,7 @@ static int checkbmp(unsigned char *mem) return(ret_val); } -int imb_is_a_bmp(void *buf) { +int imb_is_a_bmp(unsigned char *buf) { return checkbmp(buf); } @@ -195,7 +193,7 @@ static int putShortLSB(unsigned short us,FILE *ofile) { } /* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */ -short imb_savebmp(struct ImBuf *ibuf, char *name, int flags) { +int imb_savebmp(struct ImBuf *ibuf, char *name, int flags) { BMPINFOHEADER infoheader; int bytesize, extrabytes, x, y, t, ptr; @@ -207,7 +205,7 @@ short imb_savebmp(struct ImBuf *ibuf, char *name, int flags) { data = (uchar *) ibuf->rect; ofile = fopen(name,"wb"); - if (!ofile) return 0; + if (!ofile) return 0; putShortLSB(19778,ofile); /* "BM" */ putIntLSB(0,ofile); /* This can be 0 for BI_RGB bitmaps */ diff --git a/source/blender/imbuf/intern/cache.c b/source/blender/imbuf/intern/cache.c new file mode 100644 index 00000000000..d15826df2f0 --- /dev/null +++ b/source/blender/imbuf/intern/cache.c @@ -0,0 +1,442 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "BLI_ghash.h" +#include "BLI_listbase.h" +#include "BLI_memarena.h" +#include "BLI_threads.h" + +#include "BKE_utildefines.h" + +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" +#include "IMB_filetype.h" + +#include "imbuf.h" + +/* We use a two level cache here. A per-thread cache with limited number of + tiles. This can be accessed without locking and so is hoped to lead to most + tile access being lock-free. The global cache is shared between all threads + and requires slow locking to access, and contains all tiles. + + The per-thread cache should be big enough that one might hope to not fall + back to the global cache every pixel, but not to big to keep too many tiles + locked and using memory. */ + +#define IB_THREAD_CACHE_SIZE 100 + +typedef struct ImGlobalTile { + struct ImGlobalTile *next, *prev; + + ImBuf *ibuf; + int tx, ty; + int refcount; + volatile int loading; +} ImGlobalTile; + +typedef struct ImThreadTile { + struct ImThreadTile *next, *prev; + + ImBuf *ibuf; + int tx, ty; + + ImGlobalTile *global; +} ImThreadTile; + +typedef struct ImThreadTileCache { + ListBase tiles; + ListBase unused; + GHash *tilehash; +} ImThreadTileCache; + +typedef struct ImGlobalTileCache { + ListBase tiles; + ListBase unused; + GHash *tilehash; + + MemArena *memarena; + uintptr_t totmem, maxmem; + + ImThreadTileCache thread_cache[BLENDER_MAX_THREADS+1]; + int totthread; + + ThreadMutex mutex; +} ImGlobalTileCache; + +static ImGlobalTileCache GLOBAL_CACHE; + +/***************************** Hash Functions ********************************/ + +static unsigned int imb_global_tile_hash(void *gtile_p) +{ + ImGlobalTile *gtile= gtile_p; + + return ((unsigned int)(intptr_t)gtile->ibuf)*769 + gtile->tx*53 + gtile->ty*97; +} + +static int imb_global_tile_cmp(void *a_p, void *b_p) +{ + ImGlobalTile *a= a_p; + ImGlobalTile *b= b_p; + + if(a->ibuf == b->ibuf && a->tx == b->tx && a->ty == b->ty) return 0; + else if(a->ibuf < b->ibuf || a->tx < b->tx || a->ty < b->ty) return -1; + else return 1; +} + +static unsigned int imb_thread_tile_hash(void *ttile_p) +{ + ImThreadTile *ttile= ttile_p; + + return ((unsigned int)(intptr_t)ttile->ibuf)*769 + ttile->tx*53 + ttile->ty*97; +} + +static int imb_thread_tile_cmp(void *a_p, void *b_p) +{ + ImThreadTile *a= a_p; + ImThreadTile *b= b_p; + + if(a->ibuf == b->ibuf && a->tx == b->tx && a->ty == b->ty) return 0; + else if(a->ibuf < b->ibuf || a->tx < b->tx || a->ty < b->ty) return -1; + else return 1; +} + +/******************************** Load/Unload ********************************/ + +static void imb_global_cache_tile_load(ImGlobalTile *gtile) +{ + ImBuf *ibuf= gtile->ibuf; + int toffs= ibuf->xtiles*gtile->ty + gtile->tx; + unsigned int *rect; + + rect = MEM_callocN(sizeof(unsigned int)*ibuf->tilex*ibuf->tiley, "imb_tile"); + imb_loadtile(ibuf, gtile->tx, gtile->ty, rect); + ibuf->tiles[toffs]= rect; +} + +static void imb_global_cache_tile_unload(ImGlobalTile *gtile) +{ + ImBuf *ibuf= gtile->ibuf; + int toffs= ibuf->xtiles*gtile->ty + gtile->tx; + + MEM_freeN(ibuf->tiles[toffs]); + ibuf->tiles[toffs]= NULL; + + GLOBAL_CACHE.totmem -= sizeof(unsigned int)*ibuf->tilex*ibuf->tiley; +} + +/* external free */ +void imb_tile_cache_tile_free(ImBuf *ibuf, int tx, int ty) +{ + ImGlobalTile *gtile, lookuptile; + + BLI_mutex_lock(&GLOBAL_CACHE.mutex); + + lookuptile.ibuf = ibuf; + lookuptile.tx = tx; + lookuptile.ty = ty; + gtile= BLI_ghash_lookup(GLOBAL_CACHE.tilehash, &lookuptile); + + if(gtile) { + /* in case another thread is loading this */ + while(gtile->loading) + ; + + BLI_ghash_remove(GLOBAL_CACHE.tilehash, gtile, NULL, NULL); + BLI_remlink(&GLOBAL_CACHE.tiles, gtile); + BLI_addtail(&GLOBAL_CACHE.unused, gtile); + } + + BLI_mutex_unlock(&GLOBAL_CACHE.mutex); +} + +/******************************* Init/Exit ***********************************/ + +static void imb_thread_cache_init(ImThreadTileCache *cache) +{ + ImThreadTile *ttile; + int a; + + memset(cache, 0, sizeof(ImThreadTileCache)); + + cache->tilehash= BLI_ghash_new(imb_thread_tile_hash, imb_thread_tile_cmp, "imb_thread_cache_init gh"); + + /* pre-allocate all thread local tiles in unused list */ + for(a=0; aunused, ttile); + } +} + +static void imb_thread_cache_exit(ImThreadTileCache *cache) +{ + BLI_ghash_free(cache->tilehash, NULL, NULL); +} + +void imb_tile_cache_init(void) +{ + memset(&GLOBAL_CACHE, 0, sizeof(ImGlobalTileCache)); + + BLI_mutex_init(&GLOBAL_CACHE.mutex); + + /* initialize for one thread, for places that access textures + outside of rendering (displace modifier, painting, ..) */ + IMB_tile_cache_params(0, 0); +} + +void imb_tile_cache_exit(void) +{ + ImGlobalTile *gtile; + int a; + + for(gtile=GLOBAL_CACHE.tiles.first; gtile; gtile=gtile->next) + imb_global_cache_tile_unload(gtile); + + for(a=0; arefcount--; + + /* find tile in global cache */ + lookuptile.ibuf = ibuf; + lookuptile.tx = tx; + lookuptile.ty = ty; + gtile= BLI_ghash_lookup(GLOBAL_CACHE.tilehash, &lookuptile); + + if(gtile) { + /* found tile. however it may be in the process of being loaded + by another thread, in that case we do stupid busy loop waiting + for the other thread to load the tile */ + gtile->refcount++; + + BLI_mutex_unlock(&GLOBAL_CACHE.mutex); + + while(gtile->loading) + ; + } + else { + /* not found, let's load it from disk */ + + /* first check if we hit the memory limit */ + if(GLOBAL_CACHE.maxmem && GLOBAL_CACHE.totmem > GLOBAL_CACHE.maxmem) { + /* find an existing tile to unload */ + for(gtile=GLOBAL_CACHE.tiles.last; gtile; gtile=gtile->prev) + if(gtile->refcount == 0 && gtile->loading == 0) + break; + } + + if(gtile) { + /* found a tile to unload */ + imb_global_cache_tile_unload(gtile); + BLI_ghash_remove(GLOBAL_CACHE.tilehash, gtile, NULL, NULL); + BLI_remlink(&GLOBAL_CACHE.tiles, gtile); + } + else { + /* allocate a new tile or reuse unused */ + if(GLOBAL_CACHE.unused.first) { + gtile= GLOBAL_CACHE.unused.first; + BLI_remlink(&GLOBAL_CACHE.unused, gtile); + } + else + gtile= BLI_memarena_alloc(GLOBAL_CACHE.memarena, sizeof(ImGlobalTile)); + } + + /* setup new tile */ + gtile->ibuf= ibuf; + gtile->tx= tx; + gtile->ty= ty; + gtile->refcount= 1; + gtile->loading= 1; + + BLI_ghash_insert(GLOBAL_CACHE.tilehash, gtile, gtile); + BLI_addhead(&GLOBAL_CACHE.tiles, gtile); + + /* mark as being loaded and unlock to allow other threads to load too */ + GLOBAL_CACHE.totmem += sizeof(unsigned int)*ibuf->tilex*ibuf->tiley; + + BLI_mutex_unlock(&GLOBAL_CACHE.mutex); + + /* load from disk */ + imb_global_cache_tile_load(gtile); + + /* mark as done loading */ + gtile->loading= 0; + } + + return gtile; +} + +/***************************** Per-Thread Cache ******************************/ + +static unsigned int *imb_thread_cache_get_tile(ImThreadTileCache *cache, ImBuf *ibuf, int tx, int ty) +{ + ImThreadTile *ttile, lookuptile; + ImGlobalTile *gtile, *replacetile; + int toffs= ibuf->xtiles*ty + tx; + + /* test if it is already in our thread local cache */ + if((ttile=cache->tiles.first)) { + /* check last used tile before going to hash */ + if(ttile->ibuf == ibuf && ttile->tx == tx && ttile->ty == ty) + return ibuf->tiles[toffs]; + + /* find tile in hash */ + lookuptile.ibuf = ibuf; + lookuptile.tx = tx; + lookuptile.ty = ty; + + if((ttile=BLI_ghash_lookup(cache->tilehash, &lookuptile))) { + BLI_remlink(&cache->tiles, ttile); + BLI_addhead(&cache->tiles, ttile); + + return ibuf->tiles[toffs]; + } + } + + /* not found, have to do slow lookup in global cache */ + if(cache->unused.first == NULL) { + ttile= cache->tiles.last; + replacetile= ttile->global; + BLI_remlink(&cache->tiles, ttile); + BLI_ghash_remove(cache->tilehash, ttile, NULL, NULL); + } + else { + ttile= cache->unused.first; + replacetile= NULL; + BLI_remlink(&cache->unused, ttile); + } + + BLI_addhead(&cache->tiles, ttile); + BLI_ghash_insert(cache->tilehash, ttile, ttile); + + gtile= imb_global_cache_get_tile(ibuf, tx, ty, replacetile); + + ttile->ibuf= gtile->ibuf; + ttile->tx= gtile->tx; + ttile->ty= gtile->ty; + ttile->global= gtile; + + return ibuf->tiles[toffs]; +} + +unsigned int *IMB_gettile(ImBuf *ibuf, int tx, int ty, int thread) +{ + return imb_thread_cache_get_tile(&GLOBAL_CACHE.thread_cache[thread+1], ibuf, tx, ty); +} + +void IMB_tiles_to_rect(ImBuf *ibuf) +{ + ImBuf *mipbuf; + ImGlobalTile *gtile; + unsigned int *to, *from; + int a, tx, ty, y, w, h; + + for(a=0; amiptot; a++) { + mipbuf= IMB_getmipmap(ibuf, a); + + /* don't call imb_addrectImBuf, it frees all mipmaps */ + if(!mipbuf->rect) { + if((mipbuf->rect = MEM_mapallocN(ibuf->x*ibuf->y*sizeof(unsigned int), "imb_addrectImBuf"))) { + mipbuf->mall |= IB_rect; + mipbuf->flags |= IB_rect; + } + else + break; + } + + for(ty=0; tyytiles; ty++) { + for(tx=0; txxtiles; tx++) { + /* acquire tile through cache, this assumes cache is initialized, + which it is always now but it's a weak assumption ... */ + gtile= imb_global_cache_get_tile(mipbuf, tx, ty, NULL); + + /* setup pointers */ + from= mipbuf->tiles[mipbuf->xtiles*ty + tx]; + to= mipbuf->rect + mipbuf->x*ty*mipbuf->tiley + tx*mipbuf->tilex; + + /* exception in tile width/height for tiles at end of image */ + w= (tx == mipbuf->xtiles-1)? mipbuf->x - tx*mipbuf->tilex: mipbuf->tilex; + h= (ty == mipbuf->ytiles-1)? mipbuf->y - ty*mipbuf->tiley: mipbuf->tiley; + + for(y=0; ytilex; + to += mipbuf->x; + } + + /* decrease refcount for tile again */ + BLI_mutex_lock(&GLOBAL_CACHE.mutex); + gtile->refcount--; + BLI_mutex_unlock(&GLOBAL_CACHE.mutex); + } + } + } +} + diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c index 2acd4dfda75..aa1b8ca3447 100644 --- a/source/blender/imbuf/intern/cineon/cineon_dpx.c +++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c @@ -186,7 +186,7 @@ short imb_savecineon(struct ImBuf *buf, char *myfile, int flags) } -int imb_is_cineon(void *buf) +int imb_is_cineon(unsigned char *buf) { return cineonIsMemFileCineon(buf); } @@ -203,7 +203,7 @@ short imb_save_dpx(struct ImBuf *buf, char *myfile, int flags) return imb_save_dpx_cineon(buf, myfile, 0, flags); } -int imb_is_dpx(void *buf) +int imb_is_dpx(unsigned char *buf) { return dpxIsMemFileCineon(buf); } diff --git a/source/blender/imbuf/intern/cmap.c b/source/blender/imbuf/intern/cmap.c deleted file mode 100644 index 49edc93b507..00000000000 --- a/source/blender/imbuf/intern/cmap.c +++ /dev/null @@ -1,580 +0,0 @@ -/** - * cmap.c - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" - -#include "IMB_cmap.h" - -static short *lastcube = 0; -static uchar *lastcoltab = 0; -static short lastmaxcol; -static short lastmincol; -static short lastcbits; -short alpha_col0 = FALSE; - -extern void IMB_free_cache_limiter(); - -/* - * there still is a bug here. If you want to convert an image to a 1 bit colormap you get - * a black image. All conversion to less than 4 bits is too dark anyway. - */ - -void IMB_freeImBufdata(void) -{ - if (lastcube) free(lastcube); - lastcube= 0; - if (lastcoltab) free(lastcoltab); - lastcoltab= 0; - IMB_free_cache_limiter(); -} - - -int IMB_alpha_to_col0(int value) -{ - int old; - - old = alpha_col0; - alpha_col0 = value; - return (old); -} - - -void imb_losecmapbits(struct ImBuf *ibuf, unsigned int *coltab) -{ - int i,bits; - unsigned int col, and1, and2, *rect; - - if (ibuf == 0) return; - if (ibuf->rect == 0) return; - if (ibuf->cbits == 0) return; - if (ibuf->cbits >= 8) return; - -/* - bij cbits = 5: - and1 = 11100000; - bij cbits = 6: - and1 = 11000000; -*/ - - bits = ibuf->cbits; - and1 = ((1 << (8-bits)) - 1) & 0xff; - and1 |= (and1 << 24) + (and1 << 16) + (and1 << 8); - and2 = ~and1; - and1 <<= bits; - - rect = ibuf->rect; - for (i = ibuf->x * ibuf->y ; i > 0; i--) { - col = rect[0]; - *rect++ = col - ((col & and1) >> bits); - } - - if (coltab){ - for (i = 0 ; i < ibuf->maxcol ; i++) { - col = coltab[i]; - coltab[i] = (col - ((col & and1) >> bits)) & and2; - } - } -} - - -static void addcmapbits(struct ImBuf *ibuf) -{ - int i,bits; - int div,mul; - uchar * cmap; - - if (ibuf == 0) return; - if (ibuf->cmap == 0) return; - if (ibuf->cbits == 0) return; - if (ibuf->cbits >= 8) return; - - bits = ibuf->cbits; - - /* bits = 4 -> div = 0xf0 - * bits = 5 -> div = 0xf8 - */ - - div = ((1 << bits) - 1) << (8 - bits); - mul = 0xffff / div; - - if (ibuf->cmap){ - cmap = (uchar *) ibuf->cmap; - for (i = 0 ; i < ibuf->maxcol ; i++){ - cmap[1] = (mul * cmap[1]) >> 8; - cmap[2] = (mul * cmap[2]) >> 8; - cmap[3] = (mul * cmap[3]) >> 8; - cmap += 4; - } - } -} - - -static short addplanetocube(short *cube, short *plane, int minx, int miny, int sizep, int addcx, int addcy, int sizec, int col) -{ - short done = FALSE; - int x, numx, numy, skipc, skipp, temp; - - /* clip first */ - - numx = numy = sizep; - - temp = minx + sizep - 1; - if (temp > sizec) numx -= temp - sizec; - - temp = miny + sizep - 1; - if (temp > sizec) numy -= temp - sizec; - - if (minx < 0){ - plane -= minx; - cube -= minx * addcx; - numx += minx; - } - - if (miny < 0){ - plane -= miny * sizep; - cube -= miny * addcy; - numy += miny; - } - - skipc = addcy - (numx * addcx); - skipp = sizep - numx; - - for (; numy > 0 ; numy--){ - for (x = numx ; x > 0; x--) { - - if (plane[0] < cube[1]) { - - cube[0] = col; - cube[1] = plane[0]; - done = TRUE; - } - plane ++; - cube += addcx; - } - plane += skipp; - cube += skipc; - } - - return (done); -} - - - -short *imb_coldeltatab(unsigned char *coltab, short mincol, short maxcol, short cbits) -{ - short max, *quadr, *_quadr, *_cube, *cube, *_plane, done, nocol; - unsigned int addcb, addcg, addcr, sizep; - uchar *_colp, *colp, *col; - int i, j, k, addcube; - int r, g, b; - - max = (1 << cbits) - 1; - nocol = maxcol - mincol; - coltab += 4 * mincol; - - /* reduce colors to the right amount of bits */ - - { - unsigned int * lctab, and; - - lctab = (unsigned int *) coltab; - and = max << (8 - cbits); - and = and + (and << 8) + (and << 16) + (and << 24); - for (i=nocol-1 ; i >= 0 ; i--) lctab[i] = (lctab[i] & and) >> (8 - cbits); - } - - /* is this data the same as previous ? */ - - if (lastcube){ - if (mincol == lastmincol && maxcol == lastmaxcol && cbits == lastcbits){ - if (lastcoltab){ - if (memcmp(lastcoltab, coltab, 4 * nocol) == 0) return(lastcube); - } - } - } - if (lastcube) free(lastcube); - if (lastcoltab) free(lastcoltab); - - lastcube = 0; - lastcoltab = 0; - _cube = malloc(2 * (1 << (3 * cbits)) * sizeof(short)); - _plane = malloc((2 * max + 1) * (2 * max + 1) * sizeof(short)); - _quadr = malloc((2 * max + 1) * sizeof(short)); - _colp = malloc(6 * nocol); - - if (_cube == 0 || _plane == 0 || _quadr == 0 || _colp == 0){ - if (_cube) free(_cube); - if (_plane) free(_plane); - if (_quadr) free(_quadr); - if (_colp) free(_colp); - return(0); - } - - lastcoltab = malloc(4 * nocol); - if (lastcoltab) memcpy(lastcoltab, coltab, 4 * nocol); - lastcube = _cube; - lastmincol = mincol; - lastmaxcol = maxcol; - lastcbits = cbits; - - /* cube initialise */ - - cube = _cube; - for (i = (1 << (3 * cbits)); i > 0 ; i--){ - cube[0] = 0; - cube[1] = 32767; - cube += 2; - } - - /* mak error look up table */ - - { - unsigned int delta; - - quadr = _quadr + max + 1; - quadr[0] = 0; - delta = 3; - for (i = 1 ; i <= max ; i++){ - quadr[i] = quadr[-i] = delta; - delta += i + 3; - } - } - - /* colorplane initialise */ - - for (i = 6 * nocol - 1; i >= 0; i--) _colp[i] = 1; - - addcr = 2; - addcg = (addcr << cbits); - addcb = (addcg << cbits); - - /* fill in first round */ - - { - unsigned int ofs; - - col = coltab; - cube = _cube; - - for (i = 0 ; i < nocol ; i++){ - ofs = (col[3] * addcr) + (col[2] * addcg) + (col[1] * addcb); - /* color been filled in -> then skip */ - if (cube[ofs + 1]) cube[ofs] = i + mincol; - cube[ofs + 1] = 0; - col += 4; - } - } - - for (i = 1; i <= max ; i++){ - colp = _colp; - col = coltab; - done = FALSE; - sizep = 2*i +1; - - /* plane initialise */ - { - unsigned int delta; - short *plane; - - plane = _plane; - for (j = -i ; j <= i; j++){ - delta = quadr[i] + quadr[j]; - for (k = -i; k <= i; k++){ - *plane++ = delta + quadr[k]; - } - } - } - - for (j = mincol; j < maxcol; j++){ - b = col[1] - i; - g = col[2] - i; - r = col[3] - i; - - addcube= (addcr * r) + (addcg * g) + (addcb * b); - /* PRINT4(d, d, d, d, addcube, r, g, b); */ - /* if(addcube >= 2 * (1 << (3 * cbits))) { */ - /* printf("maxerror: %d %d\n", addcube, 2 * (1 << (3 * cbits))); */ - /* add_cube= 2 * (1 << (3 * cbits)) -1; */ - /* } */ - cube = _cube + addcube; - - if (colp[0]){ - if (b < 0) colp[0] = 0; - else done |= colp[0] = addplanetocube(cube, _plane, r, g, sizep, addcr, addcg, max, j); - } - if (colp[1]){ - if (g < 0) colp[1] = 0; - else done |= colp[1] = addplanetocube(cube, _plane, r, b, sizep, addcr, addcb, max, j); - } - if (colp[2]){ - if (r < 0) colp[2] = 0; - else done |= colp[2] = addplanetocube(cube, _plane, b, g, sizep, addcb, addcg, max, j); - } - if (colp[3]){ - if ((b + sizep - 1) > max) colp[3] = 0; - else done |= colp[3] = addplanetocube(cube + (sizep -1) * addcb, _plane, r, g, sizep, addcr, - addcg, max, j); - } - if (colp[4]){ - if ((g + sizep - 1) > max) colp[4] = 0; - else done |= colp[4] = addplanetocube(cube + (sizep -1) * addcg, _plane, r, b, sizep, addcr, - addcb, max, j); - } - if (colp[5]){ - if ((r + sizep - 1) > max) colp[5] = 0; - else done |= colp[5] = addplanetocube(cube + (sizep -1) * addcr, _plane, b, g, sizep, addcb, - addcg, max, j); - } - - colp += 6; - col += 4; - } - if (done == 0) break; - } - - free(_quadr); - free(_plane); - free(_colp); - return(_cube); -} - - -static void convcmap(struct ImBuf* ibuf, short *deltab, short cbits) -{ - unsigned int *rect; - short x,y; - unsigned int col; - unsigned int bbits,gbits,rbits; - unsigned int bmask,gmask,rmask; - - bbits = 24 - 3 * cbits - 1; - gbits = 16 - 2 * cbits - 1; - rbits = 8 - cbits - 1; - - rmask = ((1 << cbits) - 1) << (8 - cbits); - gmask = rmask << 8; - bmask = gmask << 8; - - rect =(unsigned int *)ibuf->rect; - - for(y=ibuf->y;y>0;y--){ - for(x=ibuf->x;x>0;x--){ - col = *rect; - col = ((col & bmask) >> bbits) + ((col & gmask) >> gbits) + ((col & rmask) >> rbits); - *rect++ = deltab[col]; - } - } -} - -short IMB_converttocmap(struct ImBuf *ibuf) -{ - unsigned int *coltab; - short *deltab=0, cbits; - int i; - int mincol, mask = 0; - struct ImBuf * abuf = 0; - unsigned int * rect, * arect; - - cbits = 5; - if (ibuf->cmap == 0) return(0); - - if ((ibuf->cbits > 0) && (ibuf->cbits <8)) cbits = ibuf->cbits; - - coltab = calloc(ibuf->maxcol, sizeof(unsigned int)); - if (coltab == 0) return(0); - memcpy(coltab, ibuf->cmap, ibuf->maxcol * sizeof(unsigned int)); - - mincol = ibuf->mincol; - if (alpha_col0) { - if (mincol == 0) mincol = 1; - abuf = IMB_dupImBuf(ibuf); - } - - imb_losecmapbits(ibuf, coltab); - deltab = imb_coldeltatab((uchar *) coltab, mincol ,ibuf->maxcol, cbits); - - if (deltab == 0) { - free(coltab); - if (abuf) IMB_freeImBuf(abuf); - return(0); - } - - - IMB_dit0(ibuf,1,cbits); - IMB_dit0(ibuf,2,cbits); - IMB_dit0(ibuf,3,cbits); - convcmap(ibuf, deltab, cbits); - - if (abuf) { - /* convert alpha to color 0 */ - rect = ibuf->rect; - arect = abuf->rect; - - if (alpha_col0 == 1) mask = 0xff000000; /* alpha == 0 -> 0 */ - if (alpha_col0 == 2) mask = 0x80000000; /* alpha < 128 -> 0 */ - - for (i = ibuf->x * ibuf->y; i > 0; i--) { - if ((*arect++ & mask) == 0) rect[0] = 0; - rect++; - } - - IMB_freeImBuf(abuf); - } - - free(coltab); - - return (TRUE); -} - - -void imb_makecolarray(struct ImBuf *ibuf, unsigned char *mem, short nocols) -{ - short i,bits = 0; - uchar *cmap; - - /* what's the theory behind this? */ - - nocols = ibuf->maxcol; - - if (ibuf->cmap){ - cmap = (uchar *) ibuf->cmap; - for (i = 0; i < nocols; i++){ - cmap[3] = mem[0]; - cmap[2] = mem[1]; - cmap[1] = mem[2]; - cmap[0] = 0; - - bits |= mem[0] | mem[1] | mem[2]; - mem += 3; - cmap += 4; - } - - /* patch voor AdPro II */ - if (IS_ham(ibuf)){ - i = ibuf->depth - 2; - bits = ((1 << i) - 1) << (8 - i); - for (i=0 ; icmap[i] &= (bits << 24) + (bits << 16) + (bits << 8) + bits; - } - - if ((bits & 0x1f) == 0){ - ibuf->cbits = 3; - } else if ((bits & 0x0f) == 0){ - ibuf->cbits = 4; - } else if ((bits & 0x07) == 0){ - ibuf->cbits = 5; - } else if ((bits & 0x03) == 0){ - ibuf->cbits = 6; - } else ibuf->cbits = 8; - - addcmapbits(ibuf); - - if (IS_hbrite(ibuf)){ - for (i=31;i>=0;i--){ - ibuf->cmap[i+32] = (ibuf->cmap[i] & 0xfefefefe) >> 1; - } - } - - if (IS_amiga(ibuf)){ - cmap = (uchar * ) (ibuf->cmap + 1); - for (i = 1; i < nocols; i++){ - cmap[0] = 0xff; - cmap += 4; - } - } - } -} - -/* temporal... rects now are rgba, cmaps are abgr */ -#define SWITCH_INT(a) {char s_i, *p_i; p_i= (char *)&(a); s_i= p_i[0]; p_i[0]= p_i[3]; p_i[3]= s_i; s_i= p_i[1]; p_i[1]= p_i[2]; p_i[2]= s_i; } - -void IMB_applycmap(struct ImBuf *ibuf) -{ - unsigned int *rect, *cmap; - int x, y, i, col, code; - int *mask = 0; - - if (ibuf == 0) return; - if (ibuf->rect == 0 || ibuf->cmap == 0) return; - - rect = ibuf->rect; - cmap = ibuf->cmap; - - if (IS_ham(ibuf)){ - - /* generate mask of max (8 + 2) bits */ - mask = malloc(1024 * 2 * sizeof(int)); - - x = 1 << (ibuf->depth - 2); - y = 65535 / (x - 1); - - for (i = 0; i < x; i++){ - mask[i] = 0; - mask[i + x] = 0x00ffff; - mask[i + x + x] = 0xffff00; - mask[i + x + x + x] = 0xff00ff; - - col = (y * i) >> 8; - - mask[i + 1024] = 0xff000000 | ibuf->cmap[i]; - mask[i + x + 1024] = 0xff000000 | col << 16; - mask[i + x + x + 1024] = 0xff000000 | col; - mask[i + x + x + x + 1024] = 0xff000000 | col << 8; - } - - /* only color 0 transparant */ - mask[0+1024] =ibuf->cmap[0]; - - for (y = ibuf->y ; y>0 ; y--){ - col = cmap[0]; - for (x=ibuf->x ; x>0 ; x--){ - code = *rect; - *rect++ = col = (col & mask[code]) | mask[code + 1024]; - } - } - free(mask); - } else { - - for(i = ibuf->x * ibuf->y; i>0; i--){ - col = *rect; - if (col >= 0 && col < ibuf->maxcol) *rect = cmap[col]; - rect++; - - /* *(rect++) = cmap[*rect]; */ - } - } -} - diff --git a/source/blender/imbuf/intern/cspace.c b/source/blender/imbuf/intern/cspace.c deleted file mode 100644 index 46017fec5ec..00000000000 --- a/source/blender/imbuf/intern/cspace.c +++ /dev/null @@ -1,176 +0,0 @@ -/** - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" - -void IMB_cspace(struct ImBuf *ibuf, float mat[][4]); - -/************************************************************************/ -/* COLORSPACE */ -/************************************************************************/ - -static void fillmattab(double val, unsigned short *mattab) -{ - int tot,ival; - int i; - - val *= (1 << 22); - ival = val; - tot = 32767; /* een half */ - - for(i = 256; i > 0; i--){ - *(mattab) = (tot >> 16); - mattab += 3; - tot += ival; - } -} - - -static void cspfill(short *buf, unsigned short *fill, int x) -{ - unsigned short r,g,b; - - b = fill[0]; - g = fill[1]; - r = fill[2]; - for (;x>0;x--){ - buf[0] = b; - buf[1] = g; - buf[2] = r; - buf += 3; - } -} - - -static void cspadd(short *buf, unsigned short *cont, unsigned char *rect, int x) -{ - short i; - for (;x>0;x--){ - i = *(rect); - rect += 4; - buf[0] += cont[i*3]; - buf[1] += cont[i*3 + 1]; - buf[2] += cont[i*3 + 2]; - buf += 3; - } -} - - -static void cspret(short *buf, unsigned char *rect, int x) -{ - int r,g,b; - - for(; x > 0; x--){ - b = buf[0]; - g = buf[1]; - r = buf[2]; - - if (b & 0x4000){ - if (b<0) rect[2]=0; - else rect[2]=255; - } else rect[2] = b >> 6; - - if (g & 0x4000){ - if (g<0) rect[1]=0; - else rect[1]=255; - } else rect[1] = g >> 6; - - if (r & 0x4000){ - if (r<0) rect[0]=0; - else rect[0]=255; - } else rect[0] = r >> 6; - - buf += 3; - rect += 4; - } -} - - -static void rotcspace(struct ImBuf *ibuf, unsigned short *cont_1, unsigned short *cont_2, unsigned short *cont_3, unsigned short *add) -{ - short x,y,*buf; - uchar *rect; - - x=ibuf->x; - rect= (uchar *)ibuf->rect; - - buf=(short *)malloc(x*3*sizeof(short)); - if (buf){ - for(y=ibuf->y;y>0;y--){ - cspfill(buf,add,x); - cspadd(buf,cont_1,rect+0,x); - cspadd(buf,cont_2,rect+1,x); - cspadd(buf,cont_3,rect+2,x); - cspret(buf,rect,x); - rect += x<<2; - } - free(buf); - } -} - - -void IMB_cspace(struct ImBuf *ibuf, float mat[][4]) -{ - unsigned short *cont_1,*cont_2,*cont_3,add[3]; - - cont_1=(unsigned short *)malloc(256*3*sizeof(short)); - cont_2=(unsigned short *)malloc(256*3*sizeof(short)); - cont_3=(unsigned short *)malloc(256*3*sizeof(short)); - - if (cont_1 && cont_2 && cont_3){ - - fillmattab(mat[0][0],cont_1); - fillmattab(mat[0][1],cont_1+1); - fillmattab(mat[0][2],cont_1+2); - - fillmattab(mat[1][0],cont_2); - fillmattab(mat[1][1],cont_2+1); - fillmattab(mat[1][2],cont_2+2); - - fillmattab(mat[2][0],cont_3); - fillmattab(mat[2][1],cont_3+1); - fillmattab(mat[2][2],cont_3+2); - - add[0] = (mat[3][0] * 64.0) + .5; - add[1] = (mat[3][1] * 64.0) + .5; - add[2] = (mat[3][2] * 64.0) + .5; - - rotcspace(ibuf, cont_1, cont_2, cont_3, add); - } - - if (cont_1) free(cont_1); - if (cont_2) free(cont_2); - if (cont_3) free(cont_3); -} - diff --git a/source/blender/imbuf/intern/data.c b/source/blender/imbuf/intern/data.c deleted file mode 100644 index 526f7012768..00000000000 --- a/source/blender/imbuf/intern/data.c +++ /dev/null @@ -1,142 +0,0 @@ -/** - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * data.c - * - * $Id$ - */ - -#include "imbuf.h" -#include "matrix.h" - -/* -static short quadbase[31] = { - 150,133,117,102, - 88,75,63,52, - 42,33,25,18, - 12,7,3,0, - 3,7,12,18, - 25,33,42,52, - 63,75,88,102, - 117,133,150, -}; - -short *quadr = quadbase+15; -*/ -/* -main() -{ - ushort _quadr[511], *quadr; - int i, delta; - - quadr = _quadr + 255; - - delta = 0; - for (i = 0 ; i <= 255 ; i++){ - quadr[i] = quadr[-i] = delta; - delta += i + 3; - } - - delta = 0; - for (i = 0; i < 511; i++){ - printf("%6d, ", _quadr[i]); - delta++; - if (delta == 8){ - delta = 0; - printf("\n"); - } - } -} -*/ - -static unsigned short quadbase[511] = { - 33150, 32893, 32637, 32382, 32128, 31875, 31623, 31372, - 31122, 30873, 30625, 30378, 30132, 29887, 29643, 29400, - 29158, 28917, 28677, 28438, 28200, 27963, 27727, 27492, - 27258, 27025, 26793, 26562, 26332, 26103, 25875, 25648, - 25422, 25197, 24973, 24750, 24528, 24307, 24087, 23868, - 23650, 23433, 23217, 23002, 22788, 22575, 22363, 22152, - 21942, 21733, 21525, 21318, 21112, 20907, 20703, 20500, - 20298, 20097, 19897, 19698, 19500, 19303, 19107, 18912, - 18718, 18525, 18333, 18142, 17952, 17763, 17575, 17388, - 17202, 17017, 16833, 16650, 16468, 16287, 16107, 15928, - 15750, 15573, 15397, 15222, 15048, 14875, 14703, 14532, - 14362, 14193, 14025, 13858, 13692, 13527, 13363, 13200, - 13038, 12877, 12717, 12558, 12400, 12243, 12087, 11932, - 11778, 11625, 11473, 11322, 11172, 11023, 10875, 10728, - 10582, 10437, 10293, 10150, 10008, 9867, 9727, 9588, - 9450, 9313, 9177, 9042, 8908, 8775, 8643, 8512, - 8382, 8253, 8125, 7998, 7872, 7747, 7623, 7500, - 7378, 7257, 7137, 7018, 6900, 6783, 6667, 6552, - 6438, 6325, 6213, 6102, 5992, 5883, 5775, 5668, - 5562, 5457, 5353, 5250, 5148, 5047, 4947, 4848, - 4750, 4653, 4557, 4462, 4368, 4275, 4183, 4092, - 4002, 3913, 3825, 3738, 3652, 3567, 3483, 3400, - 3318, 3237, 3157, 3078, 3000, 2923, 2847, 2772, - 2698, 2625, 2553, 2482, 2412, 2343, 2275, 2208, - 2142, 2077, 2013, 1950, 1888, 1827, 1767, 1708, - 1650, 1593, 1537, 1482, 1428, 1375, 1323, 1272, - 1222, 1173, 1125, 1078, 1032, 987, 943, 900, - 858, 817, 777, 738, 700, 663, 627, 592, - 558, 525, 493, 462, 432, 403, 375, 348, - 322, 297, 273, 250, 228, 207, 187, 168, - 150, 133, 117, 102, 88, 75, 63, 52, - 42, 33, 25, 18, 12, 7, 3, 0, - 3, 7, 12, 18, 25, 33, 42, 52, - 63, 75, 88, 102, 117, 133, 150, 168, - 187, 207, 228, 250, 273, 297, 322, 348, - 375, 403, 432, 462, 493, 525, 558, 592, - 627, 663, 700, 738, 777, 817, 858, 900, - 943, 987, 1032, 1078, 1125, 1173, 1222, 1272, - 1323, 1375, 1428, 1482, 1537, 1593, 1650, 1708, - 1767, 1827, 1888, 1950, 2013, 2077, 2142, 2208, - 2275, 2343, 2412, 2482, 2553, 2625, 2698, 2772, - 2847, 2923, 3000, 3078, 3157, 3237, 3318, 3400, - 3483, 3567, 3652, 3738, 3825, 3913, 4002, 4092, - 4183, 4275, 4368, 4462, 4557, 4653, 4750, 4848, - 4947, 5047, 5148, 5250, 5353, 5457, 5562, 5668, - 5775, 5883, 5992, 6102, 6213, 6325, 6438, 6552, - 6667, 6783, 6900, 7018, 7137, 7257, 7378, 7500, - 7623, 7747, 7872, 7998, 8125, 8253, 8382, 8512, - 8643, 8775, 8908, 9042, 9177, 9313, 9450, 9588, - 9727, 9867, 10008, 10150, 10293, 10437, 10582, 10728, - 10875, 11023, 11172, 11322, 11473, 11625, 11778, 11932, - 12087, 12243, 12400, 12558, 12717, 12877, 13038, 13200, - 13363, 13527, 13692, 13858, 14025, 14193, 14362, 14532, - 14703, 14875, 15048, 15222, 15397, 15573, 15750, 15928, - 16107, 16287, 16468, 16650, 16833, 17017, 17202, 17388, - 17575, 17763, 17952, 18142, 18333, 18525, 18718, 18912, - 19107, 19303, 19500, 19698, 19897, 20097, 20298, 20500, - 20703, 20907, 21112, 21318, 21525, 21733, 21942, 22152, - 22363, 22575, 22788, 23002, 23217, 23433, 23650, 23868, - 24087, 24307, 24528, 24750, 24973, 25197, 25422, 25648, - 25875, 26103, 26332, 26562, 26793, 27025, 27258, 27492, - 27727, 27963, 28200, 28438, 28677, 28917, 29158, 29400, - 29643, 29887, 30132, 30378, 30625, 30873, 31122, 31372, - 31623, 31875, 32128, 32382, 32637, 32893, 33150, -}; - -unsigned short *quadr = quadbase + 255; diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.h b/source/blender/imbuf/intern/dds/DirectDrawSurface.h index e48a06b12f1..ed1972aa966 100644 --- a/source/blender/imbuf/intern/dds/DirectDrawSurface.h +++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.h @@ -83,11 +83,11 @@ struct DDSCaps /// DDS file header for DX10. struct DDSHeader10 { - uint dxgiFormat; - uint resourceDimension; - uint miscFlag; - uint arraySize; - uint reserved; + uint dxgiFormat; + uint resourceDimension; + uint miscFlag; + uint arraySize; + uint reserved; }; /// DDS file header. diff --git a/source/blender/imbuf/intern/dds/dds_api.cpp b/source/blender/imbuf/intern/dds/dds_api.cpp index 56880c57f1b..9a106253397 100644 --- a/source/blender/imbuf/intern/dds/dds_api.cpp +++ b/source/blender/imbuf/intern/dds/dds_api.cpp @@ -31,13 +31,12 @@ extern "C" { #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -short imb_save_dds(struct ImBuf * ibuf, char *name, int flags) +int imb_save_dds(struct ImBuf * ibuf, char *name, int flags) { return(0); /* todo: finish this function */ @@ -78,6 +77,9 @@ struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags) Color32 pixel; Color32 *pixels = 0; + if(!imb_is_a_dds(mem)) + return (0); + /* check if DDS is valid and supported */ if (!dds.isValid()) { /* no need to print error here, just testing if it is a DDS */ diff --git a/source/blender/imbuf/intern/dds/dds_api.h b/source/blender/imbuf/intern/dds/dds_api.h index b8a61c6fc1a..6d9fa0839dd 100644 --- a/source/blender/imbuf/intern/dds/dds_api.h +++ b/source/blender/imbuf/intern/dds/dds_api.h @@ -29,7 +29,7 @@ extern "C" { #endif -short imb_save_dds(struct ImBuf *ibuf, char *name, int flags); +int imb_save_dds(struct ImBuf *ibuf, char *name, int flags); int imb_is_a_dds(unsigned char *mem); /* use only first 32 bytes of mem */ struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags); diff --git a/source/blender/imbuf/intern/dither.c b/source/blender/imbuf/intern/dither.c deleted file mode 100644 index ccd7982ea07..00000000000 --- a/source/blender/imbuf/intern/dither.c +++ /dev/null @@ -1,130 +0,0 @@ -/** - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * dither.c - * - * $Id$ - */ - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" - -void IMB_dit0(struct ImBuf * ibuf, short ofs, short bits) -{ - int x, y, and, add, pix; - uchar *rect; - - rect= (uchar *)ibuf->rect; - rect +=ofs; - - bits = 8 - bits; - and = ~((1 << bits)-1); - add = 1 << (bits - 1); - - for (y = ibuf->y; y > 0; y--){ - for (x = ibuf->x; x > 0; x--) { - pix = *rect + add; - if (pix > 255) pix = 255; - *rect = pix & and; - rect += 4; - } - } -} - -void IMB_dit2(struct ImBuf * ibuf, short ofs, short bits) -{ - short x,y,pix,and,add1,add2; - uchar *rect; - uchar dit[4]; - - rect= (uchar *)ibuf->rect; - rect +=ofs; - - bits = 8 - bits; - and = ~((1<>= -bits; - dit[1] >>= -bits; - dit[2] >>= -bits; - dit[3] >>= -bits; - } else{ - dit[0] <<= bits; - dit[1] <<= bits; - dit[2] <<= bits; - dit[3] <<= bits; - } - - for(y=ibuf->y;y>0;y--){ - if(y & 1){ - add1=dit[0]; - add2=dit[1]; - } - else{ - add1=dit[2]; - add2=dit[3]; - } - for(x=ibuf->x;x>0;x--){ - pix = *rect; - if (x & 1) pix += add1; - else pix += add2; - - if (pix>255) pix=255; - *rect = pix & and; - rect += 4; - } - } -} diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c index 8ed70b5509f..7b3a07f10ad 100644 --- a/source/blender/imbuf/intern/divers.c +++ b/source/blender/imbuf/intern/divers.c @@ -34,55 +34,12 @@ #include "BLI_math.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_divers.h" #include "BKE_utildefines.h" #include "BKE_colortools.h" -void imb_checkncols(struct ImBuf *ibuf) -{ - unsigned int i; - - if (ibuf==0) return; - - if (IS_amiga(ibuf)){ - if (IS_ham(ibuf)){ - if (ibuf->depth == 0) ibuf->depth = 6; - ibuf->mincol = 0; - ibuf->maxcol = 1 << (ibuf->depth - 2); - /*printf("%d %d\n", ibuf->maxcol, ibuf->depth);*/ - return; - } else if (IS_hbrite(ibuf)){ - ibuf->mincol = 0; - ibuf->maxcol = 64; - ibuf->depth = 6; - return; - } - } - - if (ibuf->maxcol == 0){ - if (ibuf->depth <= 8){ - ibuf->mincol = 0; - ibuf->maxcol = (1 << ibuf->depth); - return; - } else if (ibuf->depth == 0){ - ibuf->depth = 5; - ibuf->mincol = 0; - ibuf->maxcol = 32; - } - return; - } else { - /* ibuf->maxcol defines the depth */ - for (i=1 ; ibuf->maxcol > (1 << i); i++); - ibuf->depth = i; - return; - } -} - - void IMB_de_interlace(struct ImBuf *ibuf) { struct ImBuf * tbuf1, * tbuf2; @@ -138,43 +95,6 @@ void IMB_interlace(struct ImBuf *ibuf) } -void IMB_gamwarp(struct ImBuf *ibuf, double gamma) -{ - uchar gam[256]; - int i; - uchar *rect; - float *rectf; - - if (ibuf == 0) return; - if (gamma == 1.0) return; - - rect = (uchar *) ibuf->rect; - rectf = ibuf->rect_float; - - gamma = 1.0 / gamma; - - if (rect) { - for (i = 255 ; i >= 0 ; i--) - gam[i] = (255.0 * pow(i / 255.0 , - gamma)) + 0.5; - - for (i = ibuf->x * ibuf->y ; i>0 ; i--, rect+=4){ - rect[0] = gam[rect[0]]; - rect[1] = gam[rect[1]]; - rect[2] = gam[rect[2]]; - } - } - - if (rectf) { - for (i = ibuf->x * ibuf->y ; i>0 ; i--, rectf+=4){ - rectf[0] = pow(rectf[0] / 255.0, gamma); - rectf[1] = pow(rectf[1] / 255.0, gamma); - rectf[2] = pow(rectf[2] / 255.0, gamma); - } - } -} - - /* assume converting from linear float to sRGB byte */ void IMB_rect_from_float(struct ImBuf *ibuf) { @@ -302,3 +222,74 @@ void IMB_float_from_rect(struct ImBuf *ibuf) } } +/* no profile conversion */ +void IMB_float_from_rect_simple(struct ImBuf *ibuf) +{ + int profile = IB_PROFILE_NONE; + + /* no color management: + * don't disturb the existing profiles */ + SWAP(int, ibuf->profile, profile); + + IMB_float_from_rect(ibuf); + + SWAP(int, ibuf->profile, profile); +} + +void IMB_convert_profile(struct ImBuf *ibuf, int profile) +{ + int ok= FALSE; + int i; + + unsigned char *rct= (unsigned char *)ibuf->rect; + float *rctf= ibuf->rect_float; + + if(ibuf->profile == profile) + return; + + if(ELEM(ibuf->profile, IB_PROFILE_NONE, IB_PROFILE_SRGB)) { /* from */ + if(profile == IB_PROFILE_LINEAR_RGB) { /* to */ + if(ibuf->rect_float) { + for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) { + rctf[0]= srgb_to_linearrgb(rctf[0]); + rctf[1]= srgb_to_linearrgb(rctf[1]); + rctf[2]= srgb_to_linearrgb(rctf[2]); + } + } + if(ibuf->rect) { + for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) { + rctf[0]= (unsigned char)((srgb_to_linearrgb((float)rctf[0]/255.0f) * 255.0f) + 0.5f); + rctf[1]= (unsigned char)((srgb_to_linearrgb((float)rctf[1]/255.0f) * 255.0f) + 0.5f); + rctf[2]= (unsigned char)((srgb_to_linearrgb((float)rctf[2]/255.0f) * 255.0f) + 0.5f); + } + } + ok= TRUE; + } + } + else if (ibuf->profile == IB_PROFILE_LINEAR_RGB) { /* from */ + if(ELEM(profile, IB_PROFILE_NONE, IB_PROFILE_SRGB)) { /* to */ + if(ibuf->rect_float) { + for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) { + rctf[0]= linearrgb_to_srgb(rctf[0]); + rctf[1]= linearrgb_to_srgb(rctf[1]); + rctf[2]= linearrgb_to_srgb(rctf[2]); + } + } + if(ibuf->rect) { + for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) { + rctf[0]= (unsigned char)((linearrgb_to_srgb((float)rctf[0]/255.0f) * 255.0f) + 0.5f); + rctf[1]= (unsigned char)((linearrgb_to_srgb((float)rctf[1]/255.0f) * 255.0f) + 0.5f); + rctf[2]= (unsigned char)((linearrgb_to_srgb((float)rctf[2]/255.0f) * 255.0f) + 0.5f); + } + } + ok= TRUE; + } + } + + if(ok==FALSE){ + printf("IMB_convert_profile: failed profile conversion %d -> %d\n", ibuf->profile, profile); + return; + } + + ibuf->profile= profile; +} diff --git a/source/blender/imbuf/intern/dynlibtiff.c b/source/blender/imbuf/intern/dynlibtiff.c deleted file mode 100644 index 31da262ffdb..00000000000 --- a/source/blender/imbuf/intern/dynlibtiff.c +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Dynamically loaded libtiff support. - * - * This file is automatically generated by the gen_dynlibtiff.py script. - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jonathan Merritt. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** - * To use the dynamic libtiff support, you must initialize the library using: - * libtiff_init() - * This attempts to load libtiff dynamically at runtime. G.have_libtiff will - * be set to indicate whether or not libtiff is available. If libtiff is - * not available, Blender can proceed with no ill effects, provided that - * it does not attempt to use any of the libtiff_ functions. When you're - * finished, close the library with: - * libtiff_exit() - * These functions are both declared in IMB_imbuf.h - * - * The functions provided by dyn_libtiff.h are the same as those in the - * normal static / shared libtiff, except that they are prefixed by the - * string "libtiff_" to indicate that they belong to a dynamically-loaded - * version. - */ -#include "dynlibtiff.h" - -#include -#include -#include - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf.h" - -#include "BKE_global.h" -#include "PIL_dynlib.h" - -/********************* - * LOCAL DEFINITIONS * - *********************/ -PILdynlib *libtiff = NULL; -void libtiff_loadlibtiff(void); -void* libtiff_findsymbol(char*); -int libtiff_load_symbols(void); - - -/************************** - * LIBRARY INITIALIZATION * - **************************/ - -void libtiff_loadlibtiff(void) -{ - char *filename; - libtiff = NULL; - - filename = getenv("BF_TIFF_LIB"); - if (filename) libtiff = PIL_dynlib_open(filename); - if (libtiff != NULL) return; - - /* Try to find libtiff in a couple of standard places */ -#ifdef __APPLE__ - /* OSX has version specific library */ - //standard install location - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/resources - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/frameworks - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.4.dylib"); - if (libtiff != NULL) return; - //along side the blender app package - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/MacOS - libtiff = PIL_dynlib_open("@executable_path/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/libtiff.4.dylib"); - if (libtiff != NULL) return; -#else - libtiff = PIL_dynlib_open("libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.so.4"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.dll"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.4"); - if (libtiff != NULL) return; -#ifdef __x86_64__ - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.4"); - if (libtiff != NULL) return; -#endif - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.so"); - if (libtiff != NULL) return; - /* For solaris */ - libtiff = PIL_dynlib_open("/usr/openwin/lib/libtiff.so"); -#endif - -} - -void *libtiff_findsymbol(char *name) -{ - void *symbol = NULL; - assert(libtiff != NULL); - symbol = PIL_dynlib_find_symbol(libtiff, name); - if (symbol == NULL) { - char *err = PIL_dynlib_get_error_as_string(libtiff); - - if (err) printf("libtiff_findsymbol: error %s\n",err); - else printf("libtiff_findsymbol: error Unknown.\n"); - - libtiff = NULL; - G.have_libtiff = (0); - return NULL; - } - return symbol; -} - -void libtiff_init(void) -{ - if (libtiff != NULL) { - printf("libtiff_init: Attempted to load libtiff twice!\n"); - return; - } - libtiff_loadlibtiff(); - G.have_libtiff = ((libtiff != NULL) && (libtiff_load_symbols())); -} - -void libtiff_exit(void) -{ - if (libtiff != NULL) { - PIL_dynlib_close(libtiff); - libtiff = NULL; - } -} - - -int libtiff_load_symbols(void) -{ - /* Attempt to load TIFFClientOpen */ - libtiff_TIFFClientOpen = libtiff_findsymbol("TIFFClientOpen"); - if (libtiff_TIFFClientOpen == NULL) { - return (0); - } - /* Attempt to load TIFFClose */ - libtiff_TIFFClose = libtiff_findsymbol("TIFFClose"); - if (libtiff_TIFFClose == NULL) { - return (0); - } - /* Attempt to load TIFFGetField */ - libtiff_TIFFGetField = libtiff_findsymbol("TIFFGetField"); - if (libtiff_TIFFGetField == NULL) { - return (0); - } - /* Attempt to load TIFFOpen */ - libtiff_TIFFOpen = libtiff_findsymbol("TIFFOpen"); - if (libtiff_TIFFOpen == NULL) { - return (0); - } - /* Attempt to load TIFFReadRGBAImage */ - libtiff_TIFFReadRGBAImage = libtiff_findsymbol("TIFFReadRGBAImage"); - if (libtiff_TIFFReadRGBAImage == NULL) { - return (0); - } - /* Attempt to load TIFFSetField */ - libtiff_TIFFSetField = libtiff_findsymbol("TIFFSetField"); - if (libtiff_TIFFSetField == NULL) { - return (0); - } - /* Attempt to load TIFFWriteEncodedStrip */ - libtiff_TIFFWriteEncodedStrip = libtiff_findsymbol("TIFFWriteEncodedStrip"); - if (libtiff_TIFFWriteEncodedStrip == NULL) { - return (0); - } - /* Attempt to load _TIFFfree */ - libtiff__TIFFfree = libtiff_findsymbol("_TIFFfree"); - if (libtiff__TIFFfree == NULL) { - return (0); - } - /* Attempt to load _TIFFmalloc */ - libtiff__TIFFmalloc = libtiff_findsymbol("_TIFFmalloc"); - if (libtiff__TIFFmalloc == NULL) { - return (0); - } - return (1); -} - - -/******************* - * SYMBOL POINTERS * - *******************/ - -TIFF* (*libtiff_TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc) = NULL; -void (*libtiff_TIFFClose)(TIFF*) = NULL; -int (*libtiff_TIFFGetField)(TIFF*, ttag_t, ...) = NULL; -TIFF* (*libtiff_TIFFOpen)(const char*, const char*) = NULL; -int (*libtiff_TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int) = NULL; -int (*libtiff_TIFFSetField)(TIFF*, ttag_t, ...) = NULL; -tsize_t (*libtiff_TIFFWriteEncodedStrip)(TIFF*, tstrip_t, tdata_t, tsize_t) = NULL; -void (*libtiff__TIFFfree)(tdata_t) = NULL; -tdata_t (*libtiff__TIFFmalloc)(tsize_t) = NULL; diff --git a/source/blender/imbuf/intern/dynlibtiff.h b/source/blender/imbuf/intern/dynlibtiff.h deleted file mode 100644 index 6c8cd184463..00000000000 --- a/source/blender/imbuf/intern/dynlibtiff.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Dynamically loaded libtiff support. - * - * This file is automatically generated by the gen_dynlibtiff.py script. - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jonathan Merritt. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** - * To use the dynamic libtiff support, you must initialize the library using: - * libtiff_init() - * This attempts to load libtiff dynamically at runtime. G.have_libtiff will - * be set to indicate whether or not libtiff is available. If libtiff is - * not available, Blender can proceed with no ill effects, provided that - * it does not attempt to use any of the libtiff_ functions. When you're - * finished, close the library with: - * libtiff_exit() - * These functions are both declared in IMB_imbuf.h - * - * The functions provided by dyn_libtiff.h are the same as those in the - * normal static / shared libtiff, except that they are prefixed by the - * string "libtiff_" to indicate that they belong to a dynamically-loaded - * version. - */ -#ifndef DYN_LIBTIFF_H -#include "tiffio.h" -extern TIFF* (*libtiff_TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc); -extern void (*libtiff_TIFFClose)(TIFF*); -extern int (*libtiff_TIFFGetField)(TIFF*, ttag_t, ...); -extern TIFF* (*libtiff_TIFFOpen)(const char*, const char*); -extern int (*libtiff_TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int); -extern int (*libtiff_TIFFSetField)(TIFF*, ttag_t, ...); -extern tsize_t (*libtiff_TIFFWriteEncodedStrip)(TIFF*, tstrip_t, tdata_t, tsize_t); -extern void (*libtiff__TIFFfree)(tdata_t); -extern tdata_t (*libtiff__TIFFmalloc)(tsize_t); -#endif /* DYN_LIBTIFF_H */ - diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c new file mode 100644 index 00000000000..c2140e12013 --- /dev/null +++ b/source/blender/imbuf/intern/filetype.c @@ -0,0 +1,102 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Blender Foundation, 2010. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" +#include "IMB_filetype.h" + +#ifdef WITH_OPENEXR +#include "openexr/openexr_api.h" +#endif + +#ifdef WITH_DDS +#include "dds/dds_api.h" +#endif + +#ifdef WITH_QUICKTIME +#include "quicktime_import.h" +#endif + +#include "imbuf.h" + +static int imb_ftype_default(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype & type->filetype); } +#if defined(__APPLE__) && defined(IMBUF_COCOA) +static int imb_ftype_cocoa(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype & TIF); } +#endif +static int imb_ftype_iris(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype == IMAGIC); } +#ifdef WITH_QUICKTIME +static int imb_ftype_quicktime(ImFileType *type, ImBuf *ibuf) { return 0; } // XXX +#endif + +#ifdef WITH_QUICKTIME +void quicktime_init(void); +void quicktime_exit(void); +#endif + +ImFileType IMB_FILE_TYPES[]= { + {NULL, NULL, imb_is_a_iris, imb_ftype_iris, imb_loadiris, imb_saveiris, NULL, 0, IMAGIC}, + {NULL, NULL, imb_is_a_jpeg, imb_ftype_default, imb_load_jpeg, imb_savejpeg, NULL, 0, JPG}, + {NULL, NULL, imb_is_a_png, imb_ftype_default, imb_loadpng, imb_savepng, NULL, 0, PNG}, + {NULL, NULL, imb_is_a_bmp, imb_ftype_default, imb_bmp_decode, imb_savebmp, NULL, 0, BMP}, + {NULL, NULL, imb_is_a_targa, imb_ftype_default, imb_loadtarga, imb_savetarga, NULL, 0, TGA}, + {NULL, NULL, imb_is_dpx, imb_ftype_default, imb_loaddpx, imb_save_dpx, NULL, IM_FTYPE_FLOAT, DPX}, + {NULL, NULL, imb_is_cineon, imb_ftype_default, imb_loadcineon, imb_savecineon, NULL, IM_FTYPE_FLOAT, CINEON}, +#ifdef WITH_TIFF + {imb_inittiff, NULL, imb_is_a_tiff, imb_ftype_default, imb_loadtiff, imb_savetiff, imb_loadtiletiff, 0, TIF}, +#elif defined(__APPLE__) && defined(IMBUF_COCOA) + {NULL, NULL, imb_is_a_cocoa, imb_ftype_cocoa, imb_imb_cocoaLoadImage, imb_savecocoa, NULL, 0, TIF}, +#endif + {NULL, NULL, imb_is_a_hdr, imb_ftype_default, imb_loadhdr, imb_savehdr, NULL, IM_FTYPE_FLOAT, RADHDR}, +#ifdef WITH_OPENEXR + {NULL, NULL, imb_is_a_openexr, imb_ftype_default, imb_load_openexr, imb_save_openexr, NULL, IM_FTYPE_FLOAT, OPENEXR}, +#endif +#ifdef WITH_OPENJPEG + {NULL, NULL, imb_is_a_jp2, imb_ftype_default, imb_jp2_decode, imb_savejp2, NULL, IM_FTYPE_FLOAT, JP2}, +#endif +#ifdef WITH_DDS + {NULL, NULL, imb_is_a_dds, imb_ftype_default, imb_load_dds, NULL, NULL, 0, DDS}, +#endif +#ifdef WITH_QUICKTIME + {quicktime_init, quicktime_exit, imb_is_a_quicktime, imb_ftype_quicktime, imb_quicktime_decode, NULL, NULL, 0, QUICKTIME}, +#endif + {NULL, NULL, NULL, NULL, NULL, NULL, 0}}; + +void imb_filetypes_init(void) +{ + ImFileType *type; + + for(type=IMB_FILE_TYPES; type->is_a; type++) + if(type->init) + type->init(); +} + +void imb_filetypes_exit(void) +{ + ImFileType *type; + + for(type=IMB_FILE_TYPES; type->is_a; type++) + if(type->exit) + type->exit(); +} + diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c index 76ed0e2c61f..3ee05da15c9 100644 --- a/source/blender/imbuf/intern/filter.c +++ b/source/blender/imbuf/intern/filter.c @@ -29,14 +29,13 @@ * $Id$ */ -#include "BLI_blenlib.h" +#include "BKE_utildefines.h" -#include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_filter.h" +#include "imbuf.h" /************************************************************************/ /* FILTERS */ @@ -371,114 +370,101 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask) } } -#if 0 void IMB_makemipmap(ImBuf *ibuf, int use_filter) { - ImBuf *hbuf= ibuf; - int minsize, curmap=0; - - minsize= ibuf->xy?ibuf->x:ibuf->y; - - while(minsize>10 && curmapmiptot= 1; + + while(curmap < IB_MIPMAP_LEVELS) { if(use_filter) { ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect, 0); IMB_filterN(nbuf, hbuf); - ibuf->mipmap[curmap]= IMB_onehalf(nbuf); + ibuf->mipmap[curmap] = IMB_onehalf(nbuf); IMB_freeImBuf(nbuf); } - else { - ibuf->mipmap[curmap]= IMB_onehalf(hbuf); - } + else + ibuf->mipmap[curmap] = IMB_onehalf(hbuf); + + ibuf->miptot= curmap+2; hbuf= ibuf->mipmap[curmap]; - + hbuf->miplevel= curmap+1; + + if(!hbuf || (hbuf->x == 1 && hbuf->y == 1)) + break; + curmap++; - minsize= hbuf->xy?hbuf->x:hbuf->y; } } -#endif -void IMB_makemipmap(ImBuf *ibuf, int use_filter, int SAT) +ImBuf *IMB_getmipmap(ImBuf *ibuf, int level) { - if (SAT) { - // to maximize precision subtract image average, use intermediate double SAT, - // only convert to float at the end - const double dv = 1.0/255.0; - double avg[4] = {0, 0, 0, 0}; - const int x4 = ibuf->x << 2; - int x, y, i; - ImBuf* sbuf = IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rectfloat, 0); - double *satp, *satbuf = MEM_callocN(sizeof(double)*ibuf->x*ibuf->y*4, "tmp SAT buf"); - const double mf = ibuf->x*ibuf->y; - float* fp; - ibuf->mipmap[0] = sbuf; - if (ibuf->rect_float) { - fp = ibuf->rect_float; - for (y=0; yy; ++y) - for (x=0; xx; ++x) { - avg[0] += *fp++; - avg[1] += *fp++; - avg[2] += *fp++; - avg[3] += *fp++; - } - } - else { - char* cp = (char*)ibuf->rect; - for (y=0; yy; ++y) - for (x=0; xx; ++x) { - avg[0] += *cp++ * dv; - avg[1] += *cp++ * dv; - avg[2] += *cp++ * dv; - avg[3] += *cp++ * dv; - } - } - avg[0] /= mf; - avg[1] /= mf; - avg[2] /= mf; - avg[3] /= mf; - for (y=0; yy; ++y) - for (x=0; xx; ++x) { - const unsigned int p = (x + y*ibuf->x) << 2; - char* cp = (char*)ibuf->rect + p; - fp = ibuf->rect_float + p; - satp = satbuf + p; - for (i=0; i<4; ++i, ++cp, ++fp, ++satp) { - double sv = (ibuf->rect_float ? (double)*fp : (double)(*cp)*dv) - avg[i]; - if (x > 0) sv += satp[-4]; - if (y > 0) sv += satp[-x4]; - if (x > 0 && y > 0) sv -= satp[-x4 - 4]; - *satp = sv; - } - } - fp = sbuf->rect_float; - satp = satbuf; - for (y=0; yy; ++y) - for (x=0; xx; ++x) { - *fp++ = (float)*satp++; - *fp++ = (float)*satp++; - *fp++ = (float)*satp++; - *fp++ = (float)*satp++; - } - MEM_freeN(satbuf); - fp = &sbuf->rect_float[(sbuf->x - 1 + (sbuf->y - 1)*sbuf->x) << 2]; - fp[0] = avg[0]; - fp[1] = avg[1]; - fp[2] = avg[2]; - fp[3] = avg[3]; + CLAMP(level, 0, ibuf->miptot-1); + return (level == 0)? ibuf: ibuf->mipmap[level-1]; +} + +void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h) +{ + char *cp; + int x, y, val; + + if(depth == 24) { /* put alpha at 255 */ + cp= (char *)(rect); + + for(y=0; yx, hbuf->y, 32, IB_rect, 0); - IMB_filterN(nbuf, hbuf); - ibuf->mipmap[curmap] = IMB_onehalf(nbuf); - IMB_freeImBuf(nbuf); + cp= (char *)(rect); + + for(y=0; y>8; + cp[1]= (cp[1]*val)>>8; + cp[2]= (cp[2]*val)>>8; } - else ibuf->mipmap[curmap] = IMB_onehalf(hbuf); - hbuf = ibuf->mipmap[curmap]; - if (hbuf->x == 1 && hbuf->y == 1) break; - curmap++; } } } + +void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h) +{ + float val, *cp; + int x, y; + + if(depth==24) { /* put alpha at 1.0 */ + cp= rect_float; + + for(y=0; yrect) + IMB_premultiply_rect(ibuf->rect, ibuf->depth, ibuf->x, ibuf->y); + + if(ibuf->rect_float) + IMB_premultiply_rect_float(ibuf->rect_float, ibuf->depth, ibuf->x, ibuf->y); +} + diff --git a/source/blender/imbuf/intern/gen_dynlibtiff.py b/source/blender/imbuf/intern/gen_dynlibtiff.py deleted file mode 100755 index fd69a353bfd..00000000000 --- a/source/blender/imbuf/intern/gen_dynlibtiff.py +++ /dev/null @@ -1,303 +0,0 @@ -#!/usr/bin/env python - -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# Contributor(s): Jonathan Merritt. -# -# ***** END GPL LICENSE BLOCK ***** - -# -# This script generates a C source file and a header file that implement -# dynamic loading functionality for libtiff. -# If you need to make more functions from libtiff available, then simply add -# them to the tiff_functions[] list below. -# - - -FILENAME = 'dynlibtiff' -C_FILENAME = '%s.c' % FILENAME -H_FILENAME = '%s.h' % FILENAME - - -COMMENT = \ -"""/** - * Dynamically loaded libtiff support. - * - * This file is automatically generated by the gen_dynlibtiff.py script. - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jonathan Merritt. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** - * To use the dynamic libtiff support, you must initialize the library using: - * libtiff_init() - * This attempts to load libtiff dynamically at runtime. G.have_libtiff will - * be set to indicate whether or not libtiff is available. If libtiff is - * not available, Blender can proceed with no ill effects, provided that - * it does not attempt to use any of the libtiff_ functions. When you're - * finished, close the library with: - * libtiff_exit() - * These functions are both declared in IMB_imbuf.h - * - * The functions provided by dyn_libtiff.h are the same as those in the - * normal static / shared libtiff, except that they are prefixed by the - * string "libtiff_" to indicate that they belong to a dynamically-loaded - * version. - */ -""" - - -C_EXTRA = \ -""" -#include -#include -#include - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf.h" - -#include "BKE_global.h" -#include "PIL_dynlib.h" - -/********************* - * LOCAL DEFINITIONS * - *********************/ -PILdynlib *libtiff = NULL; -void libtiff_loadlibtiff(void); -void* libtiff_findsymbol(char*); -int libtiff_load_symbols(void); - - -/************************** - * LIBRARY INITIALIZATION * - **************************/ - -void libtiff_loadlibtiff(void) -{ - char *filename; - libtiff = NULL; - - filename = getenv("BF_TIFF_LIB"); - if (filename) libtiff = PIL_dynlib_open(filename); - if (libtiff != NULL) return; - - /* Try to find libtiff in a couple of standard places */ -#ifdef __APPLE__ - /* OSX has version specific library */ - //standard install location - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/resources - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/frameworks - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.4.dylib"); - if (libtiff != NULL) return; - //along side the blender app package - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/MacOS - libtiff = PIL_dynlib_open("@executable_path/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/libtiff.4.dylib"); - if (libtiff != NULL) return; -#else - libtiff = PIL_dynlib_open("libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.so.4"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.dll"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.4"); - if (libtiff != NULL) return; -#ifdef __x86_64__ - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.4"); - if (libtiff != NULL) return; -#endif - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.so"); - if (libtiff != NULL) return; - /* For solaris */ - libtiff = PIL_dynlib_open("/usr/openwin/lib/libtiff.so"); -#endif - -} - -void *libtiff_findsymbol(char *name) -{ - void *symbol = NULL; - assert(libtiff != NULL); - symbol = PIL_dynlib_find_symbol(libtiff, name); - if (symbol == NULL) { - char *err = PIL_dynlib_get_error_as_string(libtiff); - - if (err) printf("libtiff_findsymbol: error %s\\n",err); - else printf("libtiff_findsymbol: error Unknown.\\n"); - - libtiff = NULL; - G.have_libtiff = (0); - return NULL; - } - return symbol; -} - -void libtiff_init(void) -{ - if (libtiff != NULL) { - printf("libtiff_init: Attempted to load libtiff twice!\\n"); - return; - } - libtiff_loadlibtiff(); - G.have_libtiff = ((libtiff != NULL) && (libtiff_load_symbols())); -} - -void libtiff_exit(void) -{ - if (libtiff != NULL) { - PIL_dynlib_close(libtiff); - libtiff = NULL; - } -} - - -""" - - -class CFun: - def __init__(self, name, retType, args): - self.name = name - self.retType = retType - self.args = args - def getDynamicName(self): - return ('libtiff_%s' % self.name) - def getDynamicDecl(self): - argstr = (('%s, '*len(self.args)) % tuple(self.args))[:-2] - return ('%s (*%s)(%s)' % (self.retType, - self.getDynamicName(), argstr)) - def getLoadSymbol(self): - dname = self.getDynamicName() - return ( - """\t/* Attempt to load %s */ - %s = libtiff_findsymbol("%s"); - if (%s == NULL) { - return (0); - }\n""" % (self.name, dname, self.name, dname)) - - -# If you need more functions, add them to the list below, based upon entries -# in either tiffio.h or tiff.h. -tiff_functions = [ - CFun('TIFFClientOpen', 'TIFF*', ['const char*', 'const char*', - 'thandle_t', 'TIFFReadWriteProc', 'TIFFReadWriteProc', - 'TIFFSeekProc', 'TIFFCloseProc', 'TIFFSizeProc', - 'TIFFMapFileProc', 'TIFFUnmapFileProc']), - CFun('TIFFClose', 'void', ['TIFF*']), - CFun('TIFFGetField', 'int', ['TIFF*', 'ttag_t', '...']), - CFun('TIFFOpen', 'TIFF*', ['const char*', 'const char*']), - CFun('TIFFReadRGBAImage', 'int', ['TIFF*', 'uint32', 'uint32', - 'uint32*', 'int']), - CFun('TIFFSetField', 'int', ['TIFF*', 'ttag_t', '...']), - CFun('TIFFWriteEncodedStrip', 'tsize_t', ['TIFF*', 'tstrip_t', - 'tdata_t', 'tsize_t']), - CFun('_TIFFfree', 'void', ['tdata_t']), - CFun('_TIFFmalloc', 'tdata_t', ['tsize_t']), -] - - -def outputDynCFile(outfile, header_file_name): - outfile.write(COMMENT) - outfile.write('#include "%s"\n' % header_file_name) - outfile.write(C_EXTRA) - outfile.write('int libtiff_load_symbols(void)\n') - outfile.write('{\n') - for function in tiff_functions: - outfile.write(function.getLoadSymbol()) - outfile.write('\treturn (1);\n') - outfile.write('}\n') - outfile.write(""" - -/******************* - * SYMBOL POINTERS * - *******************/\n\n""") - for function in tiff_functions: - outfile.write('%s = NULL;\n' % function.getDynamicDecl()) - - -def outputDynHFile(outfile): - outfile.write(COMMENT) - outfile.write('#ifndef DYN_LIBTIFF_H\n') - outfile.write('#include "tiffio.h"\n') - for function in tiff_functions: - outfile.write('extern %s;\n' % function.getDynamicDecl()) - outfile.write('#endif /* DYN_LIBTIFF_H */\n\n') - - -if __name__ == '__main__': - outfile = file(C_FILENAME, 'w') - outputDynCFile(outfile, H_FILENAME) - outfile.close() - outfile = file(H_FILENAME, 'w') - outputDynHFile(outfile) - outfile.close() diff --git a/source/blender/imbuf/intern/ham.c b/source/blender/imbuf/intern/ham.c deleted file mode 100644 index 27f6d9c691a..00000000000 --- a/source/blender/imbuf/intern/ham.c +++ /dev/null @@ -1,276 +0,0 @@ -/** - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * ham.c - * - * $Id$ - */ - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" -#include "IMB_cmap.h" -#include "IMB_hamx.h" -#include "IMB_ham.h" - -extern short alpha_col0; - -#define HAMB 0x0100 -#define HAMG 0x0400 -#define HAMR 0x0200 -#define HAMC 0x1000 -#define HAMFREE 0x2000 - -static void addhamdither(short x, unsigned char *dit, - short dmax, unsigned char *rgb, - unsigned short *ham, - short type, short round, short shift) -{ - short dx = 0; - short c1, c2; - - for (;x>0;x--){ - if (ham[0] & (HAMFREE | type)){ - c2 = c1 = *rgb; - - /* wrap dither */ - while (dx >= dmax) dx -= dmax; - - c1 += dit[dx]; - if (c1 > 255) c1 = 255; - c2 += round; - if (c2 > 255) c2 = 255; - - if (c1 != c2){ - c1 >>= shift; c2 >>= shift; - if (ham[1] & HAMFREE){ - ham[0] = type + c1; - ham[1] = type + c2; - } else if (ham[1] & type){ - ham[0] = type + c1; - } else if ((ham[2] & (type | HAMFREE)) == type){ - ham[0] = type + c1; - } else if ((ham[1] & HAMC) | (ham[2] & HAMC)){ - ham[0] = type + c1; - } - } - } - rgb += 4; - ham ++; - dx ++; - } -} - -static void convhamscanl(short x, short y, - unsigned char *rgbbase, - unsigned char *coltab, - short *deltab, - short bits) -{ - int a, r, g, b, lr, lg, lb, dr, dg, db, col, fout, type, x2; - int round, shift; - uchar *rgb, dit[2]; - unsigned short *ham, *hambase; - - /* Concept: - first we check the entire image, where color transitions are coded: FGRB XXXX XXXX - F - free color value, can be changed by anyone - G/R/B - green/red/blue ham transition, only to be changed by this color - XXXX XXXX - N bits value. - - 0000 XXXX XXXX is palette color. - - after that first the green dither is added, then the red dither, and finally blue dither - */ - - if ((hambase = (unsigned short *) malloc((x+4) * sizeof(unsigned short)))==0) return; - - lb = coltab[1]; - lg = coltab[2]; - lr = coltab[3]; - type = col = 0; - - ham = hambase; - rgb = rgbbase; - - shift = 8 - bits; - round = 1 << (shift - 1); - - /* to prevent 'noise' at the end of the line */ - for (x2 = 3; x2 >= 0; x2 --) hambase[x + x2] = HAMFREE; - - for (x2 = x ;x2 > 0; x2--){ - r = rgb[0] + round; - g = rgb[1] + round; - b = rgb[2] + round; - a = rgb[3]; - - if (a < 128 && alpha_col0) { - a = 1; - } else a = 0; - - if (b > 255) b = 255; - if (g > 255) { - g = 255; - } - if (r > 255) r = 255; - - r >>= shift; - g >>= shift; - b >>= shift; - - if ((b-lb) | (g-lg) | (r-lr) | a){ - if (a) { - col = 0; - type = HAMC; - } else { - col = ((b << (2 * bits)) + (g << bits) + r) << 1; - fout = deltab[col + 1]; - col = deltab[col]; - type = HAMC; - - dr = quadr[lr-r]; - dg = quadr[lg-g]; - db = quadr[lb-b]; - - if ((dr+dg) <= fout){ - fout = dr+dg; - col = b; - type = HAMB; - } - if ((dg+db) <= fout){ - fout = dg+db; - col = r; - type = HAMR; - } - if ((dr+db) <= fout){ - fout = dr+db; - col = g; - type = HAMG; - } - } - - switch(type){ - case HAMG: - lg = g; - break; - case HAMR: - lr = r; - break; - case HAMB: - lb = b; - break; - default: - lb = coltab[col*4 + 1]; - lg = coltab[col*4 + 2]; - lr = coltab[col*4 + 3]; - } - *ham = type + col; - } else *ham = HAMG + HAMFREE + g; - - rgb += 4; - ham ++; - } - - - if (y & 1){ - dit[0] = 0 << (shift - 2); - dit[1] = 3 << (shift - 2); - } else { - dit[0] = 2 << (shift - 2); - dit[1] = 1 << (shift - 2); - } - - addhamdither(x,dit,2,rgbbase+2,hambase,HAMG, round, shift); - - if ((y & 1)==0){ - dit[0] = 3 << (shift - 2); - dit[1] = 0 << (shift - 2); - } else { - dit[0] = 1 << (shift - 2); - dit[1] = 2 << (shift - 2); - } - - addhamdither(x,dit,2,rgbbase+3,hambase,HAMR, round, shift); - addhamdither(x,dit,2,rgbbase+1,hambase,HAMB, round, shift); - - - ham = hambase; - rgb = rgbbase; - rgb += 3; - - for (x2=x;x2>0;x2--){ - type = *(ham++); - if (type & HAMG) type |= HAMR | HAMB; - - *rgb = (type & 0xff) | ((type & (HAMR | HAMB)) >> shift); - rgb += 4; - } - - free (hambase); -} - - -short imb_converttoham(struct ImBuf *ibuf) -{ - unsigned int coltab[256],*rect; - short x,y,* deltab; - int mincol; - - memcpy(coltab,ibuf->cmap,4 * ibuf->maxcol); - - mincol = ibuf->mincol; - if (alpha_col0 && mincol == 0) mincol = 1; - - if (ibuf->ftype == AN_hamx) { - deltab = imb_coldeltatab((uchar *) coltab, 0, ibuf->maxcol, 4); - } else { - ibuf->cbits = ibuf->depth - 2; - imb_losecmapbits(ibuf, coltab); - deltab = imb_coldeltatab((uchar *) coltab, mincol, ibuf->maxcol, ibuf->cbits); - } - - rect = ibuf->rect; - x=ibuf->x; - y=ibuf->y; - - if (ibuf->ftype == AN_hamx){ - IMB_dit2(ibuf, 2, 4); - IMB_dit2(ibuf, 1, 4); - IMB_dit2(ibuf, 0, 4); - imb_convhamx(ibuf, (uchar *)coltab, deltab); - } else { - for(;y > 0; y--){ - convhamscanl(x, y, (uchar *)rect, (uchar *)coltab, deltab, ibuf->cbits); - rect += x; - } - } - - return (TRUE); -} diff --git a/source/blender/imbuf/intern/hamx.c b/source/blender/imbuf/intern/hamx.c deleted file mode 100644 index 57672f54999..00000000000 --- a/source/blender/imbuf/intern/hamx.c +++ /dev/null @@ -1,581 +0,0 @@ -/** - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * hamx.c - * - * $Id$ - */ - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" -#include "IMB_imbuf.h" - -#include "IMB_allocimbuf.h" -#include "IMB_filter.h" -#include "IMB_ham.h" -#include "IMB_hamx.h" - -#ifdef WIN32 -#include -#include "BLI_winstuff.h" -#endif - -/* actually hard coded endianness */ -#define GET_BIG_LONG(x) (((uchar *) (x))[0] << 24 | ((uchar *) (x))[1] << 16 | ((uchar *) (x))[2] << 8 | ((uchar *) (x))[3]) -#define GET_LITTLE_LONG(x) (((uchar *) (x))[3] << 24 | ((uchar *) (x))[2] << 16 | ((uchar *) (x))[1] << 8 | ((uchar *) (x))[0]) -#define SWAP_L(x) (((x << 24) & 0xff000000) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) | ((x >> 24) & 0xff)) -#define SWAP_S(x) (((x << 8) & 0xff00) | ((x >> 8) & 0xff)) - -/* more endianness... should move to a separate file... */ -#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__) -#define GET_ID GET_BIG_LONG -#define LITTLE_LONG SWAP_LONG -#else -#define GET_ID GET_LITTLE_LONG -#define LITTLE_LONG ENDIAN_NOP -#endif - -#ifndef ABS -#define ABS(x) ((x) < 0 ? -(x) : (x)) -#endif - -static uchar hamx_array_char[] = { - 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, - 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, - 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, - 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, - 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, - 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, - - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x00, 0x00,0x20,0x00,0x00, 0x00,0x30,0x00,0x00, 0x00,0x40,0x00,0x00, 0x00,0x50,0x00,0x00, 0x00,0x60,0x00,0x00, 0x00,0x70,0x00,0x00, - 0x00,0x80,0x00,0x00, 0x00,0x90,0x00,0x00, 0x00,0xA0,0x00,0x00, 0x00,0xB0,0x00,0x00, 0x00,0xC0,0x00,0x00, 0x00,0xD0,0x00,0x00, 0x00,0xE0,0x00,0x00, 0x00,0xF0,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x00, 0x00,0x00,0x20,0x00, 0x00,0x00,0x30,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x00, 0x00,0x00,0x60,0x00, 0x00,0x00,0x70,0x00, - 0x00,0x00,0x80,0x00, 0x00,0x00,0x90,0x00, 0x00,0x00,0xA0,0x00, 0x00,0x00,0xB0,0x00, 0x00,0x00,0xC0,0x00, 0x00,0x00,0xD0,0x00, 0x00,0x00,0xE0,0x00, 0x00,0x00,0xF0,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x70, - 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0xA0, 0x00,0x00,0x00,0xB0, 0x00,0x00,0x00,0xC0, 0x00,0x00,0x00,0xD0, 0x00,0x00,0x00,0xE0, 0x00,0x00,0x00,0xF0, - - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0xC0, 0x00,0x00,0x00,0xF0, - 0x00,0x00,0x20,0x00, 0x00,0x00,0x20,0x30, 0x00,0x00,0x20,0x60, 0x00,0x00,0x20,0x90, 0x00,0x00,0x20,0xC0, 0x00,0x00,0x20,0xF0, - 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x30, 0x00,0x00,0x40,0x60, 0x00,0x00,0x40,0x90, 0x00,0x00,0x40,0xC0, 0x00,0x00,0x40,0xF0, - 0x00,0x00,0x60,0x00, 0x00,0x00,0x60,0x30, 0x00,0x00,0x60,0x60, 0x00,0x00,0x60,0x90, 0x00,0x00,0x60,0xC0, 0x00,0x00,0x60,0xF0, - 0x00,0x00,0x90,0x00, 0x00,0x00,0x90,0x30, 0x00,0x00,0x90,0x60, 0x00,0x00,0x90,0x90, 0x00,0x00,0x90,0xC0, 0x00,0x00,0x90,0xF0, - 0x00,0x00,0xB0,0x00, 0x00,0x00,0xB0,0x30, 0x00,0x00,0xB0,0x60, 0x00,0x00,0xB0,0x90, 0x00,0x00,0xB0,0xC0, 0x00,0x00,0xB0,0xF0, - 0x00,0x00,0xD0,0x00, 0x00,0x00,0xD0,0x30, 0x00,0x00,0xD0,0x60, 0x00,0x00,0xD0,0x90, 0x00,0x00,0xD0,0xC0, 0x00,0x00,0xD0,0xF0, - 0x00,0x00,0xF0,0x00, 0x00,0x00,0xF0,0x30, 0x00,0x00,0xF0,0x60, 0x00,0x00,0xF0,0x90, 0x00,0x00,0xF0,0xC0, 0x00,0x00,0xF0,0xF0, - 0x00,0x50,0x00,0x00, 0x00,0x50,0x00,0x30, 0x00,0x50,0x00,0x60, 0x00,0x50,0x00,0x90, 0x00,0x50,0x00,0xC0, 0x00,0x50,0x00,0xF0, - 0x00,0x50,0x20,0x00, 0x00,0x50,0x20,0x30, 0x00,0x50,0x20,0x60, 0x00,0x50,0x20,0x90, 0x00,0x50,0x20,0xC0, 0x00,0x50,0x20,0xF0, - 0x00,0x50,0x40,0x00, 0x00,0x50,0x40,0x30, 0x00,0x50,0x40,0x60, 0x00,0x50,0x40,0x90, 0x00,0x50,0x40,0xC0, 0x00,0x50,0x40,0xF0, - 0x00,0x50,0x60,0x00, 0x00,0x50,0x60,0x30, 0x00,0x50,0x60,0x60, 0x00,0x50,0x60,0x90, 0x00,0x50,0x60,0xC0, 0x00,0x50,0x60,0xF0, - 0x00,0x50,0x90,0x00, 0x00,0x50,0x90,0x30, 0x00,0x50,0x90,0x60, 0x00,0x50,0x90,0x90, 0x00,0x50,0x90,0xC0, 0x00,0x50,0x90,0xF0, - 0x00,0x50,0xB0,0x00, 0x00,0x50,0xB0,0x30, 0x00,0x50,0xB0,0x60, 0x00,0x50,0xB0,0x90, 0x00,0x50,0xB0,0xC0, 0x00,0x50,0xB0,0xF0, - 0x00,0x50,0xD0,0x00, 0x00,0x50,0xD0,0x30, 0x00,0x50,0xD0,0x60, 0x00,0x50,0xD0,0x90, 0x00,0x50,0xD0,0xC0, 0x00,0x50,0xD0,0xF0, - 0x00,0x50,0xF0,0x00, 0x00,0x50,0xF0,0x30, 0x00,0x50,0xF0,0x60, 0x00,0x50,0xF0,0x90, 0x00,0x50,0xF0,0xC0, 0x00,0x50,0xF0,0xF0, - 0x00,0xA0,0x00,0x00, 0x00,0xA0,0x00,0x30, 0x00,0xA0,0x00,0x60, 0x00,0xA0,0x00,0x90, 0x00,0xA0,0x00,0xC0, 0x00,0xA0,0x00,0xF0, - 0x00,0xA0,0x20,0x00, 0x00,0xA0,0x20,0x30, 0x00,0xA0,0x20,0x60, 0x00,0xA0,0x20,0x90, 0x00,0xA0,0x20,0xC0, 0x00,0xA0,0x20,0xF0, - 0x00,0xA0,0x40,0x00, 0x00,0xA0,0x40,0x30, 0x00,0xA0,0x40,0x60, 0x00,0xA0,0x40,0x90, 0x00,0xA0,0x40,0xC0, 0x00,0xA0,0x40,0xF0, - 0x00,0xA0,0x60,0x00, 0x00,0xA0,0x60,0x30, 0x00,0xA0,0x60,0x60, 0x00,0xA0,0x60,0x90, 0x00,0xA0,0x60,0xC0, 0x00,0xA0,0x60,0xF0, - 0x00,0xA0,0x90,0x00, 0x00,0xA0,0x90,0x30, 0x00,0xA0,0x90,0x60, 0x00,0xA0,0x90,0x90, 0x00,0xA0,0x90,0xC0, 0x00,0xA0,0x90,0xF0, - 0x00,0xA0,0xB0,0x00, 0x00,0xA0,0xB0,0x30, 0x00,0xA0,0xB0,0x60, 0x00,0xA0,0xB0,0x90, 0x00,0xA0,0xB0,0xC0, 0x00,0xA0,0xB0,0xF0, - 0x00,0xA0,0xD0,0x00, 0x00,0xA0,0xD0,0x30, 0x00,0xA0,0xD0,0x60, 0x00,0xA0,0xD0,0x90, 0x00,0xA0,0xD0,0xC0, 0x00,0xA0,0xD0,0xF0, - 0x00,0xA0,0xF0,0x00, 0x00,0xA0,0xF0,0x30, 0x00,0xA0,0xF0,0x60, 0x00,0xA0,0xF0,0x90, 0x00,0xA0,0xF0,0xC0, 0x00,0xA0,0xF0,0xF0, - 0x00,0xF0,0x00,0x00, 0x00,0xF0,0x00,0x30, 0x00,0xF0,0x00,0x60, 0x00,0xF0,0x00,0x90, 0x00,0xF0,0x00,0xC0, 0x00,0xF0,0x00,0xF0, - 0x00,0xF0,0x20,0x00, 0x00,0xF0,0x20,0x30, 0x00,0xF0,0x20,0x60, 0x00,0xF0,0x20,0x90, 0x00,0xF0,0x20,0xC0, 0x00,0xF0,0x20,0xF0, - 0x00,0xF0,0x40,0x00, 0x00,0xF0,0x40,0x30, 0x00,0xF0,0x40,0x60, 0x00,0xF0,0x40,0x90, 0x00,0xF0,0x40,0xC0, 0x00,0xF0,0x40,0xF0, - 0x00,0xF0,0x60,0x00, 0x00,0xF0,0x60,0x30, 0x00,0xF0,0x60,0x60, 0x00,0xF0,0x60,0x90, 0x00,0xF0,0x60,0xC0, 0x00,0xF0,0x60,0xF0, - 0x00,0xF0,0x90,0x00, 0x00,0xF0,0x90,0x30, 0x00,0xF0,0x90,0x60, 0x00,0xF0,0x90,0x90, 0x00,0xF0,0x90,0xC0, 0x00,0xF0,0x90,0xF0, - 0x00,0xF0,0xB0,0x00, 0x00,0xF0,0xB0,0x30, 0x00,0xF0,0xB0,0x60, 0x00,0xF0,0xB0,0x90, 0x00,0xF0,0xB0,0xC0, 0x00,0xF0,0xB0,0xF0, - 0x00,0xF0,0xD0,0x00, 0x00,0xF0,0xD0,0x30, 0x00,0xF0,0xD0,0x60, 0x00,0xF0,0xD0,0x90, 0x00,0xF0,0xD0,0xC0, 0x00,0xF0,0xD0,0xF0, - 0x00,0xF0,0xF0,0x00, 0x00,0xF0,0xF0,0x30, 0x00,0xF0,0xF0,0x60, 0x00,0xF0,0xF0,0x90, 0x00,0xF0,0xF0,0xC0, 0x00,0xF0,0xF0,0xF0, - - 0x00,0x10,0x10,0x10, 0x00,0x20,0x20,0x20, 0x00,0x30,0x30,0x30, 0x00,0x40,0x40,0x40, - 0x00,0x50,0x50,0x50, 0x00,0x60,0x60,0x60, 0x00,0x70,0x70,0x70, 0x00,0x80,0x80,0x80, - 0x00,0x90,0x90,0x90, 0x00,0xA0,0xA0,0xA0, 0x00,0xB0,0xB0,0xB0, 0x00,0xC0,0xC0,0xC0, - 0x00,0xD0,0xD0,0xD0, 0x00,0xE0,0xE0,0xE0 -}; - -static int * hamx_array = (int *) (hamx_array_char); - -static uchar cmap_hamx[] = { - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0xC0, 0x00,0x00,0x00,0xF0, - 0x00,0x00,0x20,0x00, 0x00,0x00,0x20,0x30, 0x00,0x00,0x20,0x60, 0x00,0x00,0x20,0x90, 0x00,0x00,0x20,0xC0, 0x00,0x00,0x20,0xF0, - 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x30, 0x00,0x00,0x40,0x60, 0x00,0x00,0x40,0x90, 0x00,0x00,0x40,0xC0, 0x00,0x00,0x40,0xF0, - 0x00,0x00,0x60,0x00, 0x00,0x00,0x60,0x30, 0x00,0x00,0x60,0x60, 0x00,0x00,0x60,0x90, 0x00,0x00,0x60,0xC0, 0x00,0x00,0x60,0xF0, - 0x00,0x00,0x90,0x00, 0x00,0x00,0x90,0x30, 0x00,0x00,0x90,0x60, 0x00,0x00,0x90,0x90, 0x00,0x00,0x90,0xC0, 0x00,0x00,0x90,0xF0, - 0x00,0x00,0xB0,0x00, 0x00,0x00,0xB0,0x30, 0x00,0x00,0xB0,0x60, 0x00,0x00,0xB0,0x90, 0x00,0x00,0xB0,0xC0, 0x00,0x00,0xB0,0xF0, - 0x00,0x00,0xD0,0x00, 0x00,0x00,0xD0,0x30, 0x00,0x00,0xD0,0x60, 0x00,0x00,0xD0,0x90, 0x00,0x00,0xD0,0xC0, 0x00,0x00,0xD0,0xF0, - 0x00,0x00,0xF0,0x00, 0x00,0x00,0xF0,0x30, 0x00,0x00,0xF0,0x60, 0x00,0x00,0xF0,0x90, 0x00,0x00,0xF0,0xC0, 0x00,0x00,0xF0,0xF0, - 0x00,0x50,0x00,0x00, 0x00,0x50,0x00,0x30, 0x00,0x50,0x00,0x60, 0x00,0x50,0x00,0x90, 0x00,0x50,0x00,0xC0, 0x00,0x50,0x00,0xF0, - 0x00,0x50,0x20,0x00, 0x00,0x50,0x20,0x30, 0x00,0x50,0x20,0x60, 0x00,0x50,0x20,0x90, 0x00,0x50,0x20,0xC0, 0x00,0x50,0x20,0xF0, - 0x00,0x50,0x40,0x00, 0x00,0x50,0x40,0x30, 0x00,0x50,0x40,0x60, 0x00,0x50,0x40,0x90, 0x00,0x50,0x40,0xC0, 0x00,0x50,0x40,0xF0, - 0x00,0x50,0x60,0x00, 0x00,0x50,0x60,0x30, 0x00,0x50,0x60,0x60, 0x00,0x50,0x60,0x90, 0x00,0x50,0x60,0xC0, 0x00,0x50,0x60,0xF0, - 0x00,0x50,0x90,0x00, 0x00,0x50,0x90,0x30, 0x00,0x50,0x90,0x60, 0x00,0x50,0x90,0x90, 0x00,0x50,0x90,0xC0, 0x00,0x50,0x90,0xF0, - 0x00,0x50,0xB0,0x00, 0x00,0x50,0xB0,0x30, 0x00,0x50,0xB0,0x60, 0x00,0x50,0xB0,0x90, 0x00,0x50,0xB0,0xC0, 0x00,0x50,0xB0,0xF0, - 0x00,0x50,0xD0,0x00, 0x00,0x50,0xD0,0x30, 0x00,0x50,0xD0,0x60, 0x00,0x50,0xD0,0x90, 0x00,0x50,0xD0,0xC0, 0x00,0x50,0xD0,0xF0, - 0x00,0x50,0xF0,0x00, 0x00,0x50,0xF0,0x30, 0x00,0x50,0xF0,0x60, 0x00,0x50,0xF0,0x90, 0x00,0x50,0xF0,0xC0, 0x00,0x50,0xF0,0xF0, - 0x00,0xA0,0x00,0x00, 0x00,0xA0,0x00,0x30, 0x00,0xA0,0x00,0x60, 0x00,0xA0,0x00,0x90, 0x00,0xA0,0x00,0xC0, 0x00,0xA0,0x00,0xF0, - 0x00,0xA0,0x20,0x00, 0x00,0xA0,0x20,0x30, 0x00,0xA0,0x20,0x60, 0x00,0xA0,0x20,0x90, 0x00,0xA0,0x20,0xC0, 0x00,0xA0,0x20,0xF0, - 0x00,0xA0,0x40,0x00, 0x00,0xA0,0x40,0x30, 0x00,0xA0,0x40,0x60, 0x00,0xA0,0x40,0x90, 0x00,0xA0,0x40,0xC0, 0x00,0xA0,0x40,0xF0, - 0x00,0xA0,0x60,0x00, 0x00,0xA0,0x60,0x30, 0x00,0xA0,0x60,0x60, 0x00,0xA0,0x60,0x90, 0x00,0xA0,0x60,0xC0, 0x00,0xA0,0x60,0xF0, - 0x00,0xA0,0x90,0x00, 0x00,0xA0,0x90,0x30, 0x00,0xA0,0x90,0x60, 0x00,0xA0,0x90,0x90, 0x00,0xA0,0x90,0xC0, 0x00,0xA0,0x90,0xF0, - 0x00,0xA0,0xB0,0x00, 0x00,0xA0,0xB0,0x30, 0x00,0xA0,0xB0,0x60, 0x00,0xA0,0xB0,0x90, 0x00,0xA0,0xB0,0xC0, 0x00,0xA0,0xB0,0xF0, - 0x00,0xA0,0xD0,0x00, 0x00,0xA0,0xD0,0x30, 0x00,0xA0,0xD0,0x60, 0x00,0xA0,0xD0,0x90, 0x00,0xA0,0xD0,0xC0, 0x00,0xA0,0xD0,0xF0, - 0x00,0xA0,0xF0,0x00, 0x00,0xA0,0xF0,0x30, 0x00,0xA0,0xF0,0x60, 0x00,0xA0,0xF0,0x90, 0x00,0xA0,0xF0,0xC0, 0x00,0xA0,0xF0,0xF0, - 0x00,0xF0,0x00,0x00, 0x00,0xF0,0x00,0x30, 0x00,0xF0,0x00,0x60, 0x00,0xF0,0x00,0x90, 0x00,0xF0,0x00,0xC0, 0x00,0xF0,0x00,0xF0, - 0x00,0xF0,0x20,0x00, 0x00,0xF0,0x20,0x30, 0x00,0xF0,0x20,0x60, 0x00,0xF0,0x20,0x90, 0x00,0xF0,0x20,0xC0, 0x00,0xF0,0x20,0xF0, - 0x00,0xF0,0x40,0x00, 0x00,0xF0,0x40,0x30, 0x00,0xF0,0x40,0x60, 0x00,0xF0,0x40,0x90, 0x00,0xF0,0x40,0xC0, 0x00,0xF0,0x40,0xF0, - 0x00,0xF0,0x60,0x00, 0x00,0xF0,0x60,0x30, 0x00,0xF0,0x60,0x60, 0x00,0xF0,0x60,0x90, 0x00,0xF0,0x60,0xC0, 0x00,0xF0,0x60,0xF0, - 0x00,0xF0,0x90,0x00, 0x00,0xF0,0x90,0x30, 0x00,0xF0,0x90,0x60, 0x00,0xF0,0x90,0x90, 0x00,0xF0,0x90,0xC0, 0x00,0xF0,0x90,0xF0, - 0x00,0xF0,0xB0,0x00, 0x00,0xF0,0xB0,0x30, 0x00,0xF0,0xB0,0x60, 0x00,0xF0,0xB0,0x90, 0x00,0xF0,0xB0,0xC0, 0x00,0xF0,0xB0,0xF0, - 0x00,0xF0,0xD0,0x00, 0x00,0xF0,0xD0,0x30, 0x00,0xF0,0xD0,0x60, 0x00,0xF0,0xD0,0x90, 0x00,0xF0,0xD0,0xC0, 0x00,0xF0,0xD0,0xF0, - 0x00,0xF0,0xF0,0x00, 0x00,0xF0,0xF0,0x30, 0x00,0xF0,0xF0,0x60, 0x00,0xF0,0xF0,0x90, 0x00,0xF0,0xF0,0xC0, 0x00,0xF0,0xF0,0xF0, - 0x00,0x10,0x10,0x10, 0x00,0x20,0x20,0x20, 0x00,0x30,0x30,0x30, 0x00,0x40,0x40,0x40, 0x00,0x50,0x50,0x50, 0x00,0x60,0x60,0x60, - 0x00,0x70,0x70,0x70, 0x00,0x80,0x80,0x80, 0x00,0x90,0x90,0x90, 0x00,0xA0,0xA0,0xA0, 0x00,0xB0,0xB0,0xB0, 0x00,0xC0,0xC0,0xC0, - 0x00,0xD0,0xD0,0xD0, 0x00,0xE0,0xE0,0xE0 -}; - - -float adat_gamma = 1.0; -float adat_distort = 1.0; - -/* - * - * New version: - * - * 32 brighntesses Y 15 with direct access (black and white are specials) - * 16 colors H ue - * 7 intensities S aturation - * - * Total 3584 'different' colors. First 512 colors free. - * - * - */ - -void imb_convhamx(struct ImBuf *ibuf, unsigned char *coltab, short *deltab) -{ - short r,g,b,lr,lg,lb,dr,dg,db,col,fout,type,step; - int i; - uchar *rect; - - /* - b = 0000 xxxx - g = 0001 xxxx - r = 0010 xxxx - cmap >= 48 - */ - - for (step = 0 ; step < 2 ; step ++){ - rect = (uchar *) ibuf->rect; - rect += 4*step; - i = ((ibuf->x * ibuf->y) + 2 - step - 1) / 2; - - lb = coltab[1]; - lg = coltab[2]; - lr = coltab[3]; - type = col = 0; - - for ( ;i>0;i--){ - b = rect[2] >> 4; - g = rect[1] >> 4; - r = rect[0] >> 4; - - if ((b-lb) | (g-lg) | (r-lr)){ - col = ((b<<8) + (g<<4) + r) << 1; - fout = deltab[col + 1]; - col = deltab[col]; - type = 0; - dr = quadr[lr-r] ; - dg = quadr[lg-g] ; - db = quadr[lb-b]; - - if ((dr+dg)<=fout) { - fout = dr+dg ; - type = 1; - } - if ((dg+db)<=fout) { - fout = dg+db; - type = 2; - } - if ((dr+db)<=fout) { - fout = dr+db; - type = 4; - } - - switch(type){ - case 1: - lb = b ; - col = b; - break; - case 4: - lg = g ; - col = g+16; - break; - case 2: - lr = r ; - col = r + 32; - break; - default: - /*printf("%04x %5d %5d ", (b<<8) + (g<<4) + r, col, fout);*/ - - lb = coltab[col*4 + 1]; - lg = coltab[col*4 + 2]; - lr = coltab[col*4 + 3]; - /*printf("%01x%01x%01x %01x%01x%01x\n", b, g, r, lb, lg, lr);*/ - col += 48; - } - } - rect[3] = col; - rect += 8; - } - } -} - -static short dec_hamx(struct ImBuf * ibuf, unsigned char *body, int cmap[]) -{ - int todo,i; - int j,step,col; - unsigned int *rect; - - for (step = 0 ; step < 2 ; step ++){ - rect = ibuf->rect; - rect += step; - todo = (ibuf->x * ibuf->y + 2 - step - 1) / 2; - col = cmap[0]; - while (todo>0){ - i = *body++; - - if (i & 128){ /* fill */ - - i = 257-i; - todo -= i; - j = *(body++); - - col = ((col & hamx_array[j]) | hamx_array[j + 256]); - - do{ - *rect = col; - rect += 2; - }while (--i); - } else{ /* copy */ - i++; - todo-=i; - - do{ - j = *(body++); - *rect = col = ((col & hamx_array[j]) | hamx_array[j + 256]); - rect += 2; - }while (--i); - } - } - if (todo) return (0); - } - return(1); -} - - -struct ImBuf *imb_loadanim(int *iffmem, int flags) -{ - int chunk, totlen, len, *mem, cmaplen = 0; - unsigned int *cmap = NULL; - uchar *body = 0; - struct Adat adat; - struct ImBuf *ibuf=0; - static int is_flipped = FALSE; - - mem=iffmem; - if (GET_ID(mem) != FORM) return (0); - if (GET_ID(mem + 2) != ANIM) return (0); - totlen= (GET_BIG_LONG(mem + 1) + 1) & ~1; - mem += 3; - totlen -= 4; - adat.w = 0; - adat.xorig = 0; - adat.yorig = 0; - adat.gamma = adat_gamma; - adat.distort = adat_distort; - - while(totlen > 0){ - chunk = GET_ID(mem); - len = (GET_BIG_LONG(mem + 1) + 1) & ~1; - mem += 2; - - totlen -= len+8; - switch (chunk){ - case ADAT: - if (len > sizeof(struct Adat)){ - memcpy(&adat,mem,sizeof(struct Adat)); - } else{ - memcpy(&adat,mem,len); - } - adat.w = BIG_SHORT(adat.w); - adat.h = BIG_SHORT(adat.h); - adat.type = BIG_SHORT(adat.type); - adat.xorig = BIG_SHORT(adat.xorig); - adat.yorig = BIG_SHORT(adat.yorig); - break; - case CMAP: - cmap = (unsigned int *) mem; - cmaplen = len; - break; - case BODY: - body = (uchar *) mem; - break; - } - mem = (int *)((uchar *)mem +len); - } - - if (body == 0) return (0); - if (adat.w == 0) return (0); - - adat_gamma = adat.gamma; - adat_distort = adat.distort; - - if (flags & IB_test) ibuf=IMB_allocImBuf(adat.w, adat.h, 24, 0, 0); - else ibuf=IMB_allocImBuf(adat.w, adat.h, 24, IB_rect, 0); - if (ibuf==0) return (0); - - ibuf->ftype = (Anim | adat.type); - ibuf->profile = IB_PROFILE_SRGB; - ibuf->xorig = adat.xorig; - ibuf->yorig = adat.yorig; - ibuf->flags = flags; - - if (cmaplen){ - ibuf->cmap = malloc(cmaplen); - memcpy(ibuf->cmap, cmap, cmaplen); - ibuf->maxcol = cmaplen >> 2; - } - - if (flags & IB_test){ - if (flags & IB_freem) free(iffmem); - return(ibuf); - } - - switch (adat.type){ - case HAMX: - if (flags & IB_rect){ - if (!is_flipped) { - int i; - unsigned int * t; - t = (unsigned int *) hamx_array_char; - for (i = 0; i < sizeof(hamx_array_char) / sizeof(int) ; i++) { - t[i] = SWAP_LONG(t[i]); - } - - t = (unsigned int *) cmap_hamx; - - for (i = 0; i < sizeof(cmap_hamx) / sizeof(int) ; i++) { - t[i] = SWAP_LONG(t[i]); - } - - is_flipped= TRUE; - } - - if (dec_hamx(ibuf,body,(int*) cmap_hamx) == 0){ - IMB_freeImBuf(ibuf); - ibuf = 0; - } - if (flags & IB_ttob) IMB_flipy(ibuf); - } - break; - default: - IMB_freeImBuf(ibuf); - ibuf = 0; - } - - if (flags & IB_freem) free(iffmem); - - return (ibuf); -} - - -static unsigned char *makebody_anim(int bytes, - unsigned char *buf, - unsigned char *rect) -{ - register uchar last,this; - register int copy; - register uchar *rectstart,*temp; - - bytes--; - rectstart = rect; - last = *rect++; - this = *rect++; - copy = last^this; - while (bytes>0){ - if (copy){ - do{ - last = this; - this = *rect++; - if (last == this){ - if (this == rect[-3]){ /* three the same? */ - bytes --; /* init bytes */ - break; - } - } - }while (--bytes != 0); - - copy = rect-rectstart; - copy --; - if (bytes) copy -= 2; - - temp = rect; - rect = rectstart; - - while (copy){ - last = copy; - if (copy>MAXDAT) last = MAXDAT; - copy -= last; - *buf++ = last-1; - do{ - *buf++ = *rect++; - }while(--last != 0); - } - rectstart = rect; - rect = temp; - last = this; - - copy = FALSE; - } else { - while (*rect++ == this){ /* seek first different byte */ - if (--bytes == 0) break; /* or end of line */ - } - rect --; - copy = rect-rectstart; - rectstart = rect; - bytes --; - this = *rect++; - - while (copy){ - if (copy>MAXRUN){ - *buf++ = -(MAXRUN-1); - *buf++ = last; - copy -= MAXRUN; - } else { - *buf++ = -(copy-1); - *buf++ = last; - break; - } - } - copy=TRUE; - } - } - return (buf); -} - - -short imb_enc_anim(struct ImBuf *ibuf, int file) -{ - int step, size, i, skip, steps = 0; - uchar *buf1, *crect, *_buf1, *_buf2, *bufend; - short ok = TRUE; - - if (ibuf == 0) return (0); - if (file < 0 ) return (0); - if (ibuf->rect == 0) return(0); - - /* add dither */ - - switch(ibuf->ftype){ - case AN_hamx: - ibuf->cmap = (unsigned int *) cmap_hamx; - ibuf->mincol = 0; - ibuf->maxcol = sizeof(cmap_hamx) / 4; - imb_converttoham(ibuf); - steps = 2; - break; - } - if (steps == 0) return 0; - - size = ((ibuf->x + 1)* (ibuf->y + 1)) / steps + 1024; - if ((_buf1 = malloc(size)) == 0) return(0); - if ((_buf2 = malloc(size)) == 0){ - free(_buf1); - return(0); - } - - skip = 4 * steps; - for (step = 0 ; step < steps ; step ++){ - crect = (uchar *) ibuf->rect; - crect += 4 * step; - size = (ibuf->x * ibuf->y + steps - step - 1) / steps; - buf1 = _buf1; - if ((ibuf->ftype == AN_hamx) || (ibuf->ftype == AN_yuvx)){ - crect += 3; - for (i = size ; i>0 ; i--){ - *(buf1 ++) = *crect; - crect += skip; - } - } else{ - for (i = size ; i>0 ; i--){ - *(buf1 ++) = crect[1] + (crect[2] >> 2) + (crect[3] >> 5); - crect += skip; - } - } - bufend = makebody_anim(size,_buf2,_buf1); - if (bufend == 0){ - ok = FALSE; - break; - } - size = bufend - _buf2; - if (write(file, _buf2, size) != size){ - ok = FALSE; - break; - } - } - free(_buf1); - free(_buf2); - return (ok); -} diff --git a/source/blender/imbuf/intern/iff.c b/source/blender/imbuf/intern/iff.c deleted file mode 100644 index 7297d7d6dd1..00000000000 --- a/source/blender/imbuf/intern/iff.c +++ /dev/null @@ -1,224 +0,0 @@ -/** - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * iff.c - * - * $Id$ - */ - -#include "BLI_blenlib.h" -#include "imbuf.h" -#include "imbuf_patch.h" -#include "IMB_imbuf_types.h" -#include "IMB_iff.h" -#ifdef WIN32 -#include -#include "BLI_winstuff.h" -#endif - -unsigned short imb_start_iff(struct ImBuf *ibuf, int file) -{ - unsigned int *point, size, *buf; - - if ((point=buf=(unsigned int *)malloc(32768))==0) return FALSE; - - *point++ = FORM; /* FORMxxxxILBM in buffer */ - *point++ = 0; - - if (IS_amiga(ibuf)){ - struct BitMapHeader *bmhd; - - *point++ = ILBM; - *point++ = CAMG; - *point++ = 4; - *point++ = (ibuf->ftype & 0xffff); - - *point++=BMHD; - *point++=sizeof(struct BitMapHeader); - - bmhd=(struct BitMapHeader *)point; /* bmhd points to location where bmhd will be */ - point=(unsigned int *)((char *)point+sizeof(struct BitMapHeader)); /* advance pointer already */ - - bmhd->w=ibuf->x; - bmhd->h=ibuf->y; - bmhd->pageWidth=ibuf->x; - bmhd->pageHeight=ibuf->y; - bmhd->x=0; - bmhd->y=0; - bmhd->nPlanes=ibuf->depth; - bmhd->masking=0; - if (ibuf->flags & IB_vert){ - bmhd->compression=2; - } - else{ - bmhd->compression=1; - } - bmhd->pad1=0; - bmhd->transparentColor=0; - bmhd->xAspect=1; - bmhd->yAspect=1; - } else if (IS_anim(ibuf)){ - struct Adat *adat; - extern float adat_gamma; - extern float adat_distort; - - *point++ = ANIM; - *point++ = ADAT; - *point++ = BIG_LONG(sizeof(struct Adat)); - - adat = (struct Adat *)point; - point = (unsigned int *)((char *)point+sizeof(struct Adat)); /* advance pointer already */ - - adat->w = BIG_SHORT(ibuf->x); - adat->h = BIG_SHORT(ibuf->y); - - adat->type = BIG_SHORT(ibuf->ftype); - adat->xorig = BIG_SHORT(ibuf->xorig); - adat->yorig = BIG_SHORT(ibuf->yorig); - adat->pad = 0; - adat->gamma = adat_gamma; - adat->distort = adat_distort; - } - - size=((uchar *)point-(uchar *)buf); - if (write(file,buf,size)!=size){ - free(buf); - return (FALSE); - } - - if (ibuf->cmap){ - if (IS_anim(ibuf)){ - size = ibuf->maxcol * sizeof(int); - buf[0] = CMAP; - buf[1] = BIG_LONG(size); - if (write(file,buf,8) != 8){ - free(buf); - return (FALSE); - } - if (write(file,ibuf->cmap,size) != size){ - free(buf); - return (FALSE); - } - } else{ - uchar *cpoint,*cols; - unsigned int i,bits; - - point = buf; - if (IS_amiga(ibuf)){ - *(point++) = CMAP; - *(point++) = BIG_LONG(3*ibuf->maxcol); - } - - cpoint = (uchar *) point; - cols = (uchar *)ibuf->cmap; - if ((ibuf->cbits > 0) && (ibuf->cbits < 8)){ - bits = ~((1 << (8-ibuf->cbits)) - 1); - } else bits = -1; - - if (IS_ham(ibuf)) bits = -1; - - for (i=0 ; imaxcol ; i++){ - *(cpoint++) = cols[0] & bits; - *(cpoint++) = cols[1] & bits; - *(cpoint++) = cols[2] & bits; - cols += 4; - } - if (ibuf->maxcol & 1) *(cpoint++)=0; - - size=(cpoint-(uchar *)buf); - if (write(file,buf,size)!=size){ - free(buf); - return (FALSE); - } - } - } - - if (IS_amiga(ibuf)) buf[0] = BODY; - if (IS_anim(ibuf)) buf[0] = BODY; - buf[1]=0; - - if (write(file,buf,8)!=8){ - free(buf); - return(FALSE); - } - - free(buf); - return (TRUE); -} - - -unsigned short imb_update_iff(int file, int code) -{ - int buf[2], filelen, skip; - uchar nop; - - if (file<=0) return (FALSE); - - filelen = BLI_filesize(file)-8; /* calc filelength */ - - lseek(file,0L,2); /* seek end */ - - if (filelen & 1){ /* make length 'even' */ - switch(code){ - case BODY: - nop = IFFNOP; - break; - } - if (write(file,&nop,1)!=1) return (FALSE); - filelen++; - } - lseek(file,4L,0); - - buf[0] = BIG_LONG(filelen); - - if (write(file, buf, 4) != 4) return (FALSE); - if (code == 0) return (TRUE); - - filelen-=4; - if(lseek(file,4L,1) == -1) return (FALSE); - - while (filelen>0){ /* seek BODY */ - if(read(file, buf, 8) != 8) return (FALSE); - filelen -= 8; - if (buf[0] == code) break; - - skip = (BIG_LONG(buf[1]) + 1) & ~1; - filelen -= skip; - if(lseek(file, skip, 1) == -1) return (FALSE); - } - if (filelen <= 0) { - printf("update_iff: couldn't find chunk\n"); - return (FALSE); - } - - lseek(file, -4L, 1); - - buf[0] = BIG_LONG(filelen); - - if (write(file, buf, 4)!=4) return (FALSE); - - return (TRUE); -} diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c index e52cab0bdd3..4450394e9e6 100644 --- a/source/blender/imbuf/intern/imageprocess.c +++ b/source/blender/imbuf/intern/imageprocess.c @@ -37,6 +37,8 @@ * $Id$ */ +#include + #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "math.h" diff --git a/source/blender/imbuf/intern/imbuf.h b/source/blender/imbuf/intern/imbuf.h index aba4784d7d7..047795355b3 100644 --- a/source/blender/imbuf/intern/imbuf.h +++ b/source/blender/imbuf/intern/imbuf.h @@ -51,6 +51,8 @@ #include #endif +#include "MEM_guardedalloc.h" + #if !defined(WIN32) #define O_BINARY 0 #endif @@ -72,97 +74,10 @@ #define BIG_LONG SWAP_LONG #endif -#define malloc(x) MEM_mallocN(x, __FILE__) -#define free(x) MEM_freeN(x) -#define calloc(x,y) MEM_callocN((x)*(y), __FILE__) -#define freelist(x) BLI_freelistN(x) +typedef unsigned char uchar; -#ifdef SHLIB -void *(*ib_calloc)(); -#define calloc(x,y) ib_calloc((x),(y)) -void *(*ib_malloc)(); -#define malloc(x) ib_malloc(x) -void (*ib_free)(); -#define free(x) ib_free(x) -void (*ib_memcpy)(); -#define memcpy(x,y,z) ib_memcpy((x),(y),(z)) -int (*ib_abs)(); -#define abs(x) ib_abs(x) -void (*ib_fprin_tf)(); -#define fprintf ib_fprin_tf -int (*ib_sprin_tf)(); -#define sprintf ib_sprin_tf -void (*ib_prin_tf)(); -#define printf ib_prin_tf -int (*ib_lseek)(); -#define lseek(x,y,z) ib_lseek((x),(y),(z)) -void *(*ib_mmap)(); -#define mmap(u,v,w,x,y,z) ib_mmap((u),(v),(w),(x),(y),(z)) -int (*ib_munmap)(); -#define munmap(x,y) ib_munmap((x),(y)) -int (*ib_open)(); -#define open(x,y) ib_open((x),(y)) -void (*ib_close)(); -#define close(x) ib_close(x) -int (*ib_write)(); -#define write(x,y,z) ib_write((x),(y),(z)) -int (*ib_read)(); -#define read(x,y,z) ib_read((x),(y),(z)) -int (*ib_fchmod)(); -#define fchmod(x,y) ib_fchmod((x),(y)) -int (*ib_remove)(); -#define remove(x) ib_remove(x) -size_t (*ib_strlen)(); -#define strlen(x) ib_strlen(x) -int (*ib_isdigit)(); -#define isdigit(x) ib_isdigit(x) -char *(*ib_strcpy)(); -#define strcpy(x,y) ib_strcpy((x),(y)) -int (*ib_atoi)(); -#define atoi(x) ib_atoi(x) -char *(*ib_strcat)(); -#define strcat(x,y) ib_strcat((x),(y)) -int (*ib_stat)(); -/* #define stat(x,y) ib_stat((x),(y)) */ -FILE *ib_iob; -#define _iob ib_iob - -#else - -#define ib_stat stat - -#endif /* SHLIB */ - - -#define WIDTHB(x) (((x+15)>>4)<<1) - -extern unsigned short *quadr; -extern float dyuvrgb[4][4]; -extern float rgbdyuv[4][4]; - - -typedef struct Adat -{ - unsigned short w, h; - unsigned short type; - unsigned short xorig, yorig; - unsigned short pad; - float gamma; - float distort; -}Adat; - -struct BitMapHeader -{ - unsigned short w, h; /* in pixels */ - unsigned short x, y; - char nPlanes; - char masking; - char compression; - char pad1; - unsigned short transparentColor; - char xAspect, yAspect; - short pageWidth, pageHeight; -}; +#define TRUE 1 +#define FALSE 0 #endif /* IMBUF_H */ diff --git a/source/blender/imbuf/intern/imbuf_cocoa.m b/source/blender/imbuf/intern/imbuf_cocoa.m index 44ce8e061ce..02c90c5bd09 100644 --- a/source/blender/imbuf/intern/imbuf_cocoa.m +++ b/source/blender/imbuf/intern/imbuf_cocoa.m @@ -34,7 +34,6 @@ #import #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_cocoa.h" @@ -185,6 +184,9 @@ struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, int size, int flags) if (ENDIAN_ORDER == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); + ibuf->ftype = TIF; + ibuf->profile = IB_PROFILE_SRGB; + /* return successfully */ return (ibuf); } diff --git a/source/blender/imbuf/intern/imbuf_patch.h b/source/blender/imbuf/intern/imbuf_patch.h deleted file mode 100644 index 2c8d9efbfbd..00000000000 --- a/source/blender/imbuf/intern/imbuf_patch.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * imbuf_patch.h - * - * These are some definitions to make imbuf more independent from the - * rest of the blender code. Most of these are dirty and should not - * really exist. - * - * $Id$ * - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#ifndef IMBUF_PATCH_H -#define IMBUF_PATCH_H - -/* most of imbuf uses this aloc, and it will disappear soon - * (hopefully) (25-10-2001 nzc) */ -#include "MEM_guardedalloc.h" - -struct ImBuf; - -/* originally, these were defines ... */ -typedef unsigned char uchar; - -/* should not be used at all */ -#define TRUE 1 -#define FALSE 0 - -/* Endianness: flip the byte order. It's strange that this is needed.. - * After all, there is an internal endian.{c,h}... */ -#if defined(__sgi) || defined (__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__) -#define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) -#else -#define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) -#endif - -/* These defines loop back to the internal Blender memory management - * system, implemented in blenlib. */ -#define NEW(x) (x*)MEM_mallocN(sizeof(x),# x) -#define mallocstruct(x,y) (x*)malloc((y)* sizeof(x)) -#define callocstruct(x,y) (x*)calloc((y), sizeof(x)) - -/* These vars are used thoughout the image buffer for conversions. */ -extern float rgbyuv[4][4]; -extern float yuvrgb[4][4]; -extern float rgbbeta[4][4]; - -/* This one helps debugging. */ -extern int IB_verbose; - -/* These ID's are used for checking memory blocks. See blenlib for - * more details. This set is only used in the imbuf internally. */ - -#define CAT MAKE_ID('C','A','T',' ') -#define FORM MAKE_ID('F','O','R','M') -#define ILBM MAKE_ID('I','L','B','M') -#define BMHD MAKE_ID('B','M','H','D') -#define CMAP MAKE_ID('C','M','A','P') -#define CAMG MAKE_ID('C','A','M','G') -#define BODY MAKE_ID('B','O','D','Y') - -#define ANIM MAKE_ID('A','N','I','M') -#define ADAT MAKE_ID('A','D','A','T') -#define CODE MAKE_ID('C','O','D','E') -#define ANHD MAKE_ID('A','N','H','D') -#define DLTA MAKE_ID('D','L','T','A') -#define BLCK MAKE_ID('B','L','C','K') - -#define MAXRUN 126 -#define MAXDAT 126 -#define IFFNOP 128 - -#define camg ftype - -#define LI_rect IB_rect -#define LI_planes IB_planes -#define LI_kcmap IB_cmap -#define LI_cmap IB_cmap -#define LI_freem IB_freem -#define LI_test IB_test - -#define SI_rect IB_rect -#define SI_planes IB_planes -#define SI_kcmap IB_cmap -#define SI_cmap IB_cmap -#define SI_vert IB_vert - -#endif - diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c index 01232786070..dc9c7a1dc3b 100644 --- a/source/blender/imbuf/intern/iris.c +++ b/source/blender/imbuf/intern/iris.c @@ -32,11 +32,10 @@ #include #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_iris.h" +#include "IMB_filetype.h" typedef struct { unsigned short imagic; /* stuff saved on disk . . */ @@ -224,6 +223,16 @@ static void test_endian_zbuf(struct ImBuf *ibuf) } } +/* from misc_util: flip the bytes from x */ +#define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) + +/* this one is only def-ed once, strangely... */ +#define GSS(x) (((uchar *)(x))[1] << 8 | ((uchar *)(x))[0]) + +int imb_is_a_iris(unsigned char *mem) +{ + return ((GS(mem) == IMAGIC) || (GSS(mem) == IMAGIC)); +} /* * longimagedata - @@ -232,7 +241,7 @@ static void test_endian_zbuf(struct ImBuf *ibuf) * */ -struct ImBuf *imb_loadiris(unsigned char *mem, int flags) +struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags) { unsigned int *base, *lptr = NULL; float *fbase, *fptr = NULL; @@ -245,7 +254,9 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) int xsize, ysize, zsize; int bpp, rle, cur, badorder; ImBuf * ibuf; - + + if(!imb_is_a_iris(mem)) return NULL; + /*printf("new iris\n");*/ file_data = mem; @@ -277,8 +288,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) if (rle) { tablen = ysize*zsize*sizeof(int); - starttab = (unsigned int *)malloc(tablen); - lengthtab = (unsigned int *)malloc(tablen); + starttab = (unsigned int *)MEM_mallocN(tablen, "iris starttab"); + lengthtab = (unsigned int *)MEM_mallocN(tablen, "iris endtab"); file_offset = 512; readtab(inf,starttab,tablen); @@ -379,8 +390,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) } } - free(starttab); - free(lengthtab); + MEM_freeN(starttab); + MEM_freeN(lengthtab); } else { if (bpp == 1) { @@ -495,7 +506,6 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) ibuf->ftype = IMAGIC; ibuf->profile = IB_PROFILE_SRGB; - if (flags & IB_ttob) IMB_flipy(ibuf); test_endian_zbuf(ibuf); @@ -661,12 +671,12 @@ static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, char tablen = ysize*zsize*sizeof(int); - image = (IMAGE *)malloc(sizeof(IMAGE)); - starttab = (unsigned int *)malloc(tablen); - lengthtab = (unsigned int *)malloc(tablen); + image = (IMAGE *)MEM_mallocN(sizeof(IMAGE), "iris image"); + starttab = (unsigned int *)MEM_mallocN(tablen, "iris starttab"); + lengthtab = (unsigned int *)MEM_mallocN(tablen, "iris lengthtab"); rlebuflen = 1.05*xsize+10; - rlebuf = (unsigned char *)malloc(rlebuflen); - lumbuf = (unsigned int *)malloc(xsize*sizeof(int)); + rlebuf = (unsigned char *)MEM_mallocN(rlebuflen, "iris rlebuf"); + lumbuf = (unsigned int *)MEM_mallocN(xsize*sizeof(int), "iris lumbuf"); memset(image, 0, sizeof(IMAGE)); image->imagic = IMAGIC; @@ -715,11 +725,11 @@ static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, char fseek(outf,512,SEEK_SET); goodwrite *= writetab(outf,starttab,tablen); goodwrite *= writetab(outf,lengthtab,tablen); - free(image); - free(starttab); - free(lengthtab); - free(rlebuf); - free(lumbuf); + MEM_freeN(image); + MEM_freeN(starttab); + MEM_freeN(lengthtab); + MEM_freeN(rlebuf); + MEM_freeN(lumbuf); fclose(outf); if(goodwrite) return 1; @@ -799,7 +809,7 @@ static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cn return optr - (unsigned char *)rlebuf; } -short imb_saveiris(struct ImBuf * ibuf, char *name, int flags) +int imb_saveiris(struct ImBuf * ibuf, char *name, int flags) { short zsize; int ret; diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c index d7d45b711fc..a76c6e780ca 100644 --- a/source/blender/imbuf/intern/jp2.c +++ b/source/blender/imbuf/intern/jp2.c @@ -24,14 +24,14 @@ #ifdef WITH_OPENJPEG #include "BLI_blenlib.h" +#include "BLI_math.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_jp2.h" +#include "IMB_filetype.h" #include "openjpeg.h" @@ -58,7 +58,7 @@ static int checkj2p(unsigned char *mem) /* J2K_CFMT */ return memcmp(JP2_HEAD, mem, 12) ? 0 : 1; } -int imb_is_a_jp2(void *buf) +int imb_is_a_jp2(unsigned char *buf) { return checkj2p(buf); } @@ -92,8 +92,6 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags) { struct ImBuf *ibuf = 0; int use_float = 0; /* for precision higher then 8 use float */ - unsigned char *rect= NULL; - float *rect_float= NULL; long signed_offsets[4] = {0,0,0,0}; int float_divs[4]; @@ -159,7 +157,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags) return NULL; } - w = image->comps[0].w; + w = image->comps[0].w; h = image->comps[0].h; switch (image->numcomps) { @@ -189,13 +187,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags) float_divs[i]= (1<comps[i].prec)-1; } - if (use_float) { - ibuf= IMB_allocImBuf(w, h, depth, IB_rectfloat, 0); - rect_float = ibuf->rect_float; - } else { - ibuf= IMB_allocImBuf(w, h, depth, IB_rect, 0); - rect = (unsigned char *) ibuf->rect; - } + ibuf= IMB_allocImBuf(w, h, depth, use_float ? IB_rectfloat : IB_rect, 0); if (ibuf==NULL) { if(dinfo) @@ -206,8 +198,8 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags) ibuf->ftype = JP2; if (use_float) { - rect_float = ibuf->rect_float; - + float *rect_float= ibuf->rect_float; + if (image->numcomps < 3) { /* greyscale 12bits+ */ for (i = 0; i < w * h; i++, rect_float+=4) { @@ -237,13 +229,14 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags) } } else { - + unsigned char *rect= (unsigned char *)ibuf->rect; + if (image->numcomps < 3) { /* greyscale */ for (i = 0; i < w * h; i++, rect+=4) { index = w * h - ((i) / (w) + 1) * w + (i) % (w); - rect_float[0]= rect_float[1]= rect_float[2]= (image->comps[0].data[index] + signed_offsets[0]); + rect[0]= rect[1]= rect[2]= (image->comps[0].data[index] + signed_offsets[0]); if (image->numcomps == 2) rect[3]= image->comps[1].data[index] + signed_offsets[1]; @@ -296,8 +289,8 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags) /* 2048x1080 (2K) at 24 fps or 48 fps, or 4096x2160 (4K) at 24 fps; 3×12 bits per pixel, XYZ color space - * In 2K, for Scope (2.39:1) presentation 2048x858 pixels of the imager is used - * In 2K, for Flat (1.85:1) presentation 1998x1080 pixels of the imager is used + * In 2K, for Scope (2.39:1) presentation 2048x858 pixels of the imager is used + * In 2K, for Flat (1.85:1) presentation 1998x1080 pixels of the imager is used */ /* ****************************** COPIED FROM image_to_j2k.c */ @@ -540,16 +533,23 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) { if (rect_float) { + float rgb[3]; + switch (prec) { case 8: /* Convert blenders float color channels to 8,12 or 16bit ints */ for(y=h-1; y>=0; y--) { y_row = y*w; for(x=0; xprofile == IB_PROFILE_LINEAR_RGB) + linearrgb_to_srgb_v3_v3(rgb, rect_float); + else + copy_v3_v3(rgb, rect_float); - image->comps[0].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rect_float[0]); - image->comps[1].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rect_float[1]); - image->comps[2].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rect_float[2]); + image->comps[0].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rgb[0]); + image->comps[1].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rgb[1]); + image->comps[2].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rgb[2]); if (numcomps>3) image->comps[3].data[i] = DOWNSAMPLE_FLOAT_TO_8BIT(rect_float[3]); } @@ -561,10 +561,15 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) { y_row = y*w; for(x=0; xprofile == IB_PROFILE_LINEAR_RGB) + linearrgb_to_srgb_v3_v3(rgb, rect_float); + else + copy_v3_v3(rgb, rect_float); - image->comps[0].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rect_float[0]); - image->comps[1].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rect_float[1]); - image->comps[2].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rect_float[2]); + image->comps[0].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rgb[0]); + image->comps[1].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rgb[1]); + image->comps[2].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rgb[2]); if (numcomps>3) image->comps[3].data[i] = DOWNSAMPLE_FLOAT_TO_12BIT(rect_float[3]); } @@ -575,10 +580,15 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) { y_row = y*w; for(x=0; xprofile == IB_PROFILE_LINEAR_RGB) + linearrgb_to_srgb_v3_v3(rgb, rect_float); + else + copy_v3_v3(rgb, rect_float); - image->comps[0].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rect_float[0]); - image->comps[1].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rect_float[1]); - image->comps[2].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rect_float[2]); + image->comps[0].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rgb[0]); + image->comps[1].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rgb[1]); + image->comps[2].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rgb[2]); if (numcomps>3) image->comps[3].data[i] = DOWNSAMPLE_FLOAT_TO_16BIT(rect_float[3]); } @@ -649,7 +659,7 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) { /* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */ -short imb_savejp2(struct ImBuf *ibuf, char *name, int flags) { +int imb_savejp2(struct ImBuf *ibuf, char *name, int flags) { int quality = ibuf->ftype & 0xff; diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c index 2c4b8618637..3803aa9a8b2 100644 --- a/source/blender/imbuf/intern/jpeg.c +++ b/source/blender/imbuf/intern/jpeg.c @@ -34,17 +34,24 @@ #include #include +#include "MEM_guardedalloc.h" + #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" -#include "IMB_imginfo.h" -#include "IMB_jpeg.h" +#include "IMB_metadata.h" +#include "IMB_filetype.h" #include "jpeglib.h" #include "jerror.h" +#define IS_jpg(x) (x->ftype & JPG) +#define IS_stdjpg(x) ((x->ftype & JPG_MSK) == JPG_STD) +#define IS_vidjpg(x) ((x->ftype & JPG_MSK) == JPG_VID) +#define IS_jstjpg(x) ((x->ftype & JPG_MSK) == JPG_JST) +#define IS_maxjpg(x) ((x->ftype & JPG_MSK) == JPG_MAX) + /* the types are from the jpeg lib */ static void jpeg_error (j_common_ptr cinfo); static void init_source(j_decompress_ptr cinfo); @@ -207,7 +214,7 @@ static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, int siz if (bytes_in_buffer == 0) { \ if (! (*datasrc->fill_input_buffer) (cinfo)) \ { action; } \ - INPUT_RELOAD(cinfo); \ + INPUT_RELOAD(cinfo); \ } \ bytes_in_buffer-- @@ -297,11 +304,7 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f for (y = ibuf->y - 1; y >= 0; y--) { jpeg_read_scanlines(cinfo, row_pointer, 1); - if (flags & IB_ttob) { - rect = (uchar *) (ibuf->rect + (ibuf->y - 1 - y) * ibuf->x); - } else { - rect = (uchar *) (ibuf->rect + y * ibuf->x); - } + rect = (uchar *) (ibuf->rect + y * ibuf->x); buffer = row_pointer[0]; switch(depth) { @@ -378,8 +381,8 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f * the information when we write * it back to disk. */ - IMB_imginfo_add_field(ibuf, "None", (char *) marker->data); - ibuf->flags |= IB_imginfo; + IMB_metadata_add_field(ibuf, "None", (char *) marker->data); + ibuf->flags |= IB_metadata; goto next_stamp_marker; } @@ -404,8 +407,8 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f *value = '\0'; /* need finish the key string */ value++; - IMB_imginfo_add_field(ibuf, key, value); - ibuf->flags |= IB_imginfo; + IMB_metadata_add_field(ibuf, key, value); + ibuf->flags |= IB_metadata; MEM_freeN(str); next_stamp_marker: marker= marker->next; @@ -453,11 +456,13 @@ ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags) return(ibuf); } -ImBuf * imb_ibJpegImageFromMemory (unsigned char * buffer, int size, int flags) +ImBuf * imb_load_jpeg (unsigned char * buffer, int size, int flags) { struct jpeg_decompress_struct _cinfo, *cinfo = &_cinfo; struct my_error_mgr jerr; ImBuf * ibuf; + + if(!imb_is_a_jpeg(buffer)) return NULL; cinfo->err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = jpeg_error; @@ -487,7 +492,7 @@ static void write_jpeg(struct jpeg_compress_struct * cinfo, struct ImBuf * ibuf) uchar * rect; int x, y; char neogeo[128]; - ImgInfo *iptr; + ImMetaData *iptr; char *text; jpeg_start_compress(cinfo, TRUE); @@ -498,10 +503,10 @@ static void write_jpeg(struct jpeg_compress_struct * cinfo, struct ImBuf * ibuf) memcpy(neogeo + 6, &ibuf_ftype, 4); jpeg_write_marker(cinfo, 0xe1, (JOCTET*) neogeo, 10); - if(ibuf->img_info) { + if(ibuf->metadata) { /* key + max value + "Blender" */ text= MEM_mallocN(530, "stamp info read"); - iptr= ibuf->img_info; + iptr= ibuf->metadata; while(iptr) { if (!strcmp (iptr->key, "None")) { jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) iptr->value, strlen (iptr->value) + 1); @@ -526,9 +531,9 @@ next_stamp_info: } row_pointer[0] = - mallocstruct(JSAMPLE, + MEM_mallocN(sizeof(JSAMPLE) * cinfo->input_components * - cinfo->image_width); + cinfo->image_width, "jpeg row_pointer"); for(y = ibuf->y - 1; y >= 0; y--){ rect = (uchar *) (ibuf->rect + y * ibuf->x); @@ -561,7 +566,7 @@ next_stamp_info: } jpeg_finish_compress(cinfo); - free(row_pointer[0]); + MEM_freeN(row_pointer[0]); } @@ -580,7 +585,7 @@ static int init_jpeg(FILE * outfile, struct jpeg_compress_struct * cinfo, struct cinfo->image_height = ibuf->y; cinfo->in_color_space = JCS_RGB; - if (ibuf->depth == 8 && ibuf->cmap == 0) cinfo->in_color_space = JCS_GRAYSCALE; + if (ibuf->depth == 8) cinfo->in_color_space = JCS_GRAYSCALE; if (ibuf->depth == 32) cinfo->in_color_space = JCS_UNKNOWN; switch(cinfo->in_color_space){ @@ -699,7 +704,7 @@ static int save_jstjpeg(char * name, struct ImBuf * ibuf) sprintf(fieldname, "%s.jf0", name); returnval = save_vidjpeg(fieldname, tbuf) ; - if (returnval == 1) { + if (returnval == 1) { IMB_rectcpy(tbuf, ibuf, 0, 0, tbuf->x, 0, ibuf->x, ibuf->y); sprintf(fieldname, "%s.jf1", name); returnval = save_vidjpeg(fieldname, tbuf); diff --git a/source/blender/imbuf/intern/matrix.h b/source/blender/imbuf/intern/matrix.h deleted file mode 100644 index 79b9b2dbc14..00000000000 --- a/source/blender/imbuf/intern/matrix.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * matrix.c - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/* rgbyuv is identiek aan rgbbeta */ - -float rgbyuv[4][4]={ /* afgeleid uit videoframer = Y Cr Cb in kopieen van Francois*/ - /* is identriek aan matrix van jpeg */ - { .50000, .11400, -.08131, 0.0,}, /* b */ - {-.33126, .58700, -.41869, 0.0,}, /* g */ - {-.16874, .29900, .50000, 0.0,}, /* r */ - { 128.0, 0.0, 128.0, 1.0}}; - - /* b-y (u) y r-y (v) */ - - -float rgbbeta[4][4]={ /* afgeleid uit videoframer = Y Cr Cb in kopieen van Francois*/ - /* is identriek aan matrix van jpeg */ - {.50000, .11400, -.08131, 0.0,}, /* b-y -> b */ - {-.33126, .58700, -.41869, 0.0,}, /* y -> g */ - {-.16874, .29900, .50000, 0.0,}, /* r-y -> r */ - { 128.0, 0.0, 128.0, 1.0}}; - - /* b-y y r-y */ - - - -float yuvrgb[4][4]={ - {1.77200, -0.34414, 0.0, 0.0, }, - {1.0, 1.0, 1.0, 0.0, }, - {0.0, -0.71414, 1.40200, 0.0, }, - {-226.816, 135.460, -179.456, 1.0}}; - -float rgb_to_bw[4][4]={ - {.299, .299, .299, 0.0,}, - {.587, .587, .587, 0.0,}, - {.114, .114, .114, 0.0,}, - { 0.5, 0.5, 0.5, 1.0}}; - -float dyuvrgb_oud[4][4]={ - {1.0 , 1.0 , 1.0, 0.0,}, - {1.733, -0.337, 0.0, 0.0,}, - {0.0, -.698, 1.371, 0.0,}, - {-221.8, 132.47, -175.5, 1.0}}; - -float dyuvrgb[4][4]={ - {1.164 , 1.164 , 1.164, 0.0,}, - {2.018, -0.391, 0.0, 0.0,}, - {0.0, -0.813, 1.596, 0.0,}, - {-276.7, 135.6, -222.7, 1.0}}; - -float rgbdyuv[4][4]={ - {0.439, 0.098, -0.071, 0.0,}, - {-0.291, 0.504, -0.368, 0.0,}, - {-0.148, 0.257, 0.439, 0.0,}, - {128.0, 16.0, 128.0, 1.0}}; - diff --git a/source/blender/imbuf/intern/md5.c b/source/blender/imbuf/intern/md5.c index a3165467b53..19a5f25e7a4 100644 --- a/source/blender/imbuf/intern/md5.c +++ b/source/blender/imbuf/intern/md5.c @@ -18,10 +18,6 @@ /* Written by Ulrich Drepper . */ -#ifdef HAVE_CONFIG_H -# include -#endif - #include # include @@ -31,7 +27,7 @@ #ifdef WORDS_BIGENDIAN # define SWAP(n) \ - (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #else # define SWAP(n) (n) #endif @@ -46,7 +42,7 @@ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; (RFC 1321, 3.3: Step 3) */ void md5_init_ctx (ctx) - struct md5_ctx *ctx; + struct md5_ctx *ctx; { ctx->A = 0x67452301; ctx->B = 0xefcdab89; @@ -58,8 +54,8 @@ md5_init_ctx (ctx) be in little endian byte order. */ void * md5_read_ctx (ctx, resbuf) - const struct md5_ctx *ctx; - void *resbuf; + const struct md5_ctx *ctx; + void *resbuf; { ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); @@ -74,8 +70,8 @@ md5_read_ctx (ctx, resbuf) beginning at RESBLOCK. */ int md5_stream (stream, resblock) - FILE *stream; - void *resblock; + FILE *stream; + void *resblock; { /* Important: BLOCKSIZE must be a multiple of 64. */ #define BLOCKSIZE 4096 @@ -92,49 +88,49 @@ md5_stream (stream, resblock) /* Iterate over full file contents. */ while (1) - { - /* We read the file in blocks of BLOCKSIZE bytes. One call of the + { + /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ - size_t n; - sum = 0; + size_t n; + sum = 0; - /* Read block. Take care for partial reads. */ - do + /* Read block. Take care for partial reads. */ + do { n = fread (buffer, 1, BLOCKSIZE - sum, stream); sum += n; } - while (sum < BLOCKSIZE && n != 0); - if (n == 0 && ferror (stream)) - return 1; + while (sum < BLOCKSIZE && n != 0); + if (n == 0 && ferror (stream)) + return 1; - /* RFC 1321 specifies the possible length of the file up to 2^64 bits. + /* RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word - increment. */ - len[0] += sum; - if (len[0] < sum) + increment. */ + len[0] += sum; + if (len[0] < sum) ++len[1]; - /* If end of file is reached, end the loop. */ - if (n == 0) + /* If end of file is reached, end the loop. */ + if (n == 0) break; - /* Process buffer with BLOCKSIZE bytes. Note that + /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 - */ - md5_process_block (buffer, BLOCKSIZE, &ctx); - } + */ + md5_process_block (buffer, BLOCKSIZE, &ctx); + } /* We can copy 64 byte because the buffer is always big enough. FILLBUF - contains the needed bits. */ + contains the needed bits. */ memcpy (&buffer[sum], fillbuf, 64); /* Compute amount of padding bytes needed. Alignment is done to (N + PAD) % 64 == 56 - There is always at least one byte padded. I.e. even the alignment - is correctly aligned 64 padding bytes are added. */ + There is always at least one byte padded. I.e. even the alignment + is correctly aligned 64 padding bytes are added. */ pad = sum & 63; pad = pad >= 56 ? 64 + 56 - pad : 56 - pad; @@ -157,9 +153,9 @@ md5_stream (stream, resblock) digest. */ void * md5_buffer (buffer, len, resblock) - const char *buffer; - size_t len; - void *resblock; + const char *buffer; + size_t len; + void *resblock; { struct md5_ctx ctx; char restbuf[64 + 72]; @@ -177,11 +173,11 @@ md5_buffer (buffer, len, resblock) /* Copy to own buffer. */ memcpy (restbuf, &buffer[blocks], rest); /* Append needed fill bytes at end of buffer. We can copy 64 byte - because the buffer is always big enough. */ + because the buffer is always big enough. */ memcpy (&restbuf[rest], fillbuf, 64); /* PAD bytes are used for padding to correct alignment. Note that - always at least one byte is padded. */ + always at least one byte is padded. */ pad = rest >= 56 ? 64 + 56 - rest : 56 - rest; /* Put length of buffer in *bits* in last eight bytes. */ @@ -210,9 +206,9 @@ md5_buffer (buffer, len, resblock) void md5_process_block (buffer, len, ctx) - const void *buffer; - size_t len; - struct md5_ctx *ctx; + const void *buffer; + size_t len; + struct md5_ctx *ctx; { md5_uint32 correct_words[16]; const md5_uint32 *words = buffer; @@ -224,16 +220,16 @@ md5_process_block (buffer, len, ctx) md5_uint32 D = ctx->D; /* Process all bytes in the buffer with 64 bytes in each round of - the loop. */ + the loop. */ while (words < endp) - { - md5_uint32 *cwp = correct_words; - md5_uint32 A_save = A; - md5_uint32 B_save = B; - md5_uint32 C_save = C; - md5_uint32 D_save = D; + { + md5_uint32 *cwp = correct_words; + md5_uint32 A_save = A; + md5_uint32 B_save = B; + md5_uint32 C_save = C; + md5_uint32 D_save = D; - /* First round: using the given function, the context and a constant + /* First round: using the given function, the context and a constant the next context is computed. Because the algorithms processing unit is a 32-bit word and it is determined to work on words in little endian byte order we perhaps have to change the byte order @@ -241,116 +237,116 @@ md5_process_block (buffer, len, ctx) we store the swapped words in the array CORRECT_WORDS. */ #define OP(a, b, c, d, s, T) \ - do \ - { \ + do \ + { \ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ ++words; \ CYCLIC (a, s); \ a += b; \ - } \ - while (0) + } \ + while (0) - /* It is unfortunate that C does not provide an operator for + /* It is unfortunate that C does not provide an operator for cyclic rotation. Hope the C compiler is smart enough. */ #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) - /* Before we start, one word to the strange constants. + /* Before we start, one word to the strange constants. They are defined in RFC 1321 as T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 - */ + */ - /* Round 1. */ - OP (A, B, C, D, 7, 0xd76aa478); - OP (D, A, B, C, 12, 0xe8c7b756); - OP (C, D, A, B, 17, 0x242070db); - OP (B, C, D, A, 22, 0xc1bdceee); - OP (A, B, C, D, 7, 0xf57c0faf); - OP (D, A, B, C, 12, 0x4787c62a); - OP (C, D, A, B, 17, 0xa8304613); - OP (B, C, D, A, 22, 0xfd469501); - OP (A, B, C, D, 7, 0x698098d8); - OP (D, A, B, C, 12, 0x8b44f7af); - OP (C, D, A, B, 17, 0xffff5bb1); - OP (B, C, D, A, 22, 0x895cd7be); - OP (A, B, C, D, 7, 0x6b901122); - OP (D, A, B, C, 12, 0xfd987193); - OP (C, D, A, B, 17, 0xa679438e); - OP (B, C, D, A, 22, 0x49b40821); + /* Round 1. */ + OP (A, B, C, D, 7, 0xd76aa478); + OP (D, A, B, C, 12, 0xe8c7b756); + OP (C, D, A, B, 17, 0x242070db); + OP (B, C, D, A, 22, 0xc1bdceee); + OP (A, B, C, D, 7, 0xf57c0faf); + OP (D, A, B, C, 12, 0x4787c62a); + OP (C, D, A, B, 17, 0xa8304613); + OP (B, C, D, A, 22, 0xfd469501); + OP (A, B, C, D, 7, 0x698098d8); + OP (D, A, B, C, 12, 0x8b44f7af); + OP (C, D, A, B, 17, 0xffff5bb1); + OP (B, C, D, A, 22, 0x895cd7be); + OP (A, B, C, D, 7, 0x6b901122); + OP (D, A, B, C, 12, 0xfd987193); + OP (C, D, A, B, 17, 0xa679438e); + OP (B, C, D, A, 22, 0x49b40821); - /* For the second to fourth round we have the possibly swapped words + /* For the second to fourth round we have the possibly swapped words in CORRECT_WORDS. Redefine the macro to take an additional first argument specifying the function to use. */ #undef OP #define OP(f, a, b, c, d, k, s, T) \ - do \ + do \ { \ a += f (b, c, d) + correct_words[k] + T; \ CYCLIC (a, s); \ a += b; \ } \ - while (0) + while (0) - /* Round 2. */ - OP (FG, A, B, C, D, 1, 5, 0xf61e2562); - OP (FG, D, A, B, C, 6, 9, 0xc040b340); - OP (FG, C, D, A, B, 11, 14, 0x265e5a51); - OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); - OP (FG, A, B, C, D, 5, 5, 0xd62f105d); - OP (FG, D, A, B, C, 10, 9, 0x02441453); - OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); - OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); - OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); - OP (FG, D, A, B, C, 14, 9, 0xc33707d6); - OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); - OP (FG, B, C, D, A, 8, 20, 0x455a14ed); - OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); - OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); - OP (FG, C, D, A, B, 7, 14, 0x676f02d9); - OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + /* Round 2. */ + OP (FG, A, B, C, D, 1, 5, 0xf61e2562); + OP (FG, D, A, B, C, 6, 9, 0xc040b340); + OP (FG, C, D, A, B, 11, 14, 0x265e5a51); + OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); + OP (FG, A, B, C, D, 5, 5, 0xd62f105d); + OP (FG, D, A, B, C, 10, 9, 0x02441453); + OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); + OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); + OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); + OP (FG, D, A, B, C, 14, 9, 0xc33707d6); + OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); + OP (FG, B, C, D, A, 8, 20, 0x455a14ed); + OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); + OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); + OP (FG, C, D, A, B, 7, 14, 0x676f02d9); + OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); - /* Round 3. */ - OP (FH, A, B, C, D, 5, 4, 0xfffa3942); - OP (FH, D, A, B, C, 8, 11, 0x8771f681); - OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); - OP (FH, B, C, D, A, 14, 23, 0xfde5380c); - OP (FH, A, B, C, D, 1, 4, 0xa4beea44); - OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); - OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); - OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); - OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); - OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); - OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); - OP (FH, B, C, D, A, 6, 23, 0x04881d05); - OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); - OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); - OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); - OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); + /* Round 3. */ + OP (FH, A, B, C, D, 5, 4, 0xfffa3942); + OP (FH, D, A, B, C, 8, 11, 0x8771f681); + OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); + OP (FH, B, C, D, A, 14, 23, 0xfde5380c); + OP (FH, A, B, C, D, 1, 4, 0xa4beea44); + OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); + OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); + OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); + OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); + OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); + OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); + OP (FH, B, C, D, A, 6, 23, 0x04881d05); + OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); + OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); + OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); + OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); - /* Round 4. */ - OP (FI, A, B, C, D, 0, 6, 0xf4292244); - OP (FI, D, A, B, C, 7, 10, 0x432aff97); - OP (FI, C, D, A, B, 14, 15, 0xab9423a7); - OP (FI, B, C, D, A, 5, 21, 0xfc93a039); - OP (FI, A, B, C, D, 12, 6, 0x655b59c3); - OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); - OP (FI, C, D, A, B, 10, 15, 0xffeff47d); - OP (FI, B, C, D, A, 1, 21, 0x85845dd1); - OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); - OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); - OP (FI, C, D, A, B, 6, 15, 0xa3014314); - OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); - OP (FI, A, B, C, D, 4, 6, 0xf7537e82); - OP (FI, D, A, B, C, 11, 10, 0xbd3af235); - OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); - OP (FI, B, C, D, A, 9, 21, 0xeb86d391); + /* Round 4. */ + OP (FI, A, B, C, D, 0, 6, 0xf4292244); + OP (FI, D, A, B, C, 7, 10, 0x432aff97); + OP (FI, C, D, A, B, 14, 15, 0xab9423a7); + OP (FI, B, C, D, A, 5, 21, 0xfc93a039); + OP (FI, A, B, C, D, 12, 6, 0x655b59c3); + OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); + OP (FI, C, D, A, B, 10, 15, 0xffeff47d); + OP (FI, B, C, D, A, 1, 21, 0x85845dd1); + OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); + OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); + OP (FI, C, D, A, B, 6, 15, 0xa3014314); + OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); + OP (FI, A, B, C, D, 4, 6, 0xf7537e82); + OP (FI, D, A, B, C, 11, 10, 0xbd3af235); + OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); + OP (FI, B, C, D, A, 9, 21, 0xeb86d391); - /* Add the starting values of the context. */ - A += A_save; - B += B_save; - C += C_save; - D += D_save; - } + /* Add the starting values of the context. */ + A += A_save; + B += B_save; + C += C_save; + D += D_save; + } /* Put checksum in context given as argument. */ ctx->A = A; diff --git a/source/blender/imbuf/intern/md5.h b/source/blender/imbuf/intern/md5.h index b49f8f559f7..1299eacffbf 100644 --- a/source/blender/imbuf/intern/md5.h +++ b/source/blender/imbuf/intern/md5.h @@ -54,11 +54,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. typedef unsigned short md5_uint32; # else # if ULONG_MAX == UINT_MAX_32_BITS - typedef unsigned long md5_uint32; + typedef unsigned long md5_uint32; # else - /* The following line is intended to evoke an error. - Using #error is not portable enough. */ - "Cannot determine unsigned 32-bit data type." + /* The following line is intended to evoke an error. + Using #error is not portable enough. */ + "Cannot determine unsigned 32-bit data type." # endif # endif #endif @@ -93,7 +93,7 @@ void md5_init_ctx __P ((struct md5_ctx *ctx)); starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ void md5_process_block __P ((const void *buffer, size_t len, - struct md5_ctx *ctx)); + struct md5_ctx *ctx)); /* Put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields diff --git a/source/blender/imbuf/intern/imginfo.c b/source/blender/imbuf/intern/metadata.c similarity index 67% rename from source/blender/imbuf/intern/imginfo.c rename to source/blender/imbuf/intern/metadata.c index 4101045b45e..38ffa2fe2fa 100644 --- a/source/blender/imbuf/intern/imginfo.c +++ b/source/blender/imbuf/intern/metadata.c @@ -1,5 +1,5 @@ /** - * $Id$ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -36,22 +36,22 @@ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" -#include "IMB_imginfo.h" +#include "IMB_metadata.h" -void IMB_imginfo_free(struct ImBuf* img) +void IMB_metadata_free(struct ImBuf* img) { - ImgInfo *info; + ImMetaData *info; if (!img) return; - if (!img->img_info) { + if (!img->metadata) { return; } - info = img->img_info; + info = img->metadata; while (info) { - ImgInfo* next = info->next; + ImMetaData* next = info->next; MEM_freeN(info->key); MEM_freeN(info->value); MEM_freeN(info); @@ -59,17 +59,17 @@ void IMB_imginfo_free(struct ImBuf* img) } } -int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* field, int len) +int IMB_metadata_get_field(struct ImBuf* img, const char* key, char* field, int len) { - ImgInfo *info; + ImMetaData *info; int retval = 0; if (!img) return 0; - if (!img->img_info) { + if (!img->metadata) { return 0; } - info = img->img_info; + info = img->metadata; while (info) { if (strcmp(key, info->key) == 0) { BLI_strncpy(field, info->value, len); @@ -81,25 +81,25 @@ int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* field, int l return retval; } -int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field) +int IMB_metadata_add_field(struct ImBuf* img, const char* key, const char* field) { - ImgInfo *info; - ImgInfo *last; + ImMetaData *info; + ImMetaData *last; if (!img) return 0; - if (!img->img_info) { - img->img_info = MEM_callocN(sizeof(ImgInfo), "ImgInfo"); - info = img->img_info; + if (!img->metadata) { + img->metadata = MEM_callocN(sizeof(ImMetaData), "ImMetaData"); + info = img->metadata; } else { - info = img->img_info; + info = img->metadata; last = info; while (info) { last = info; info = info->next; } - info = MEM_callocN(sizeof(ImgInfo), "ImgInfo"); + info = MEM_callocN(sizeof(ImMetaData), "ImMetaData"); last->next = info; } info->key = BLI_strdup(key); @@ -107,21 +107,21 @@ int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field) return 1; } -int IMB_imginfo_del_field(struct ImBuf *img, const char *key) +int IMB_metadata_del_field(struct ImBuf *img, const char *key) { - ImgInfo *p, *p1; + ImMetaData *p, *p1; - if ((!img) || (!img->img_info)) + if ((!img) || (!img->metadata)) return (0); - p = img->img_info; + p = img->metadata; p1 = NULL; while (p) { if (!strcmp (key, p->key)) { if (p1) p1->next = p->next; else - img->img_info = p->next; + img->metadata = p->next; MEM_freeN(p->key); MEM_freeN(p->value); @@ -134,17 +134,17 @@ int IMB_imginfo_del_field(struct ImBuf *img, const char *key) return (0); } -int IMB_imginfo_change_field(struct ImBuf *img, const char *key, const char *field) +int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field) { - ImgInfo *p; + ImMetaData *p; if (!img) return (0); - if (!img->img_info) - return (IMB_imginfo_add_field (img, key, field)); + if (!img->metadata) + return (IMB_metadata_add_field (img, key, field)); - p = img->img_info; + p = img->metadata; while (p) { if (!strcmp (key, p->key)) { MEM_freeN (p->value); @@ -154,5 +154,6 @@ int IMB_imginfo_change_field(struct ImBuf *img, const char *key, const char *fie p = p->next; } - return (IMB_imginfo_add_field (img, key, field)); + return (IMB_metadata_add_field (img, key, field)); } + diff --git a/source/blender/imbuf/intern/IMB_radiance_hdr.h b/source/blender/imbuf/intern/module.c similarity index 66% rename from source/blender/imbuf/intern/IMB_radiance_hdr.h rename to source/blender/imbuf/intern/module.c index 18e8f0df376..5438066d164 100644 --- a/source/blender/imbuf/intern/IMB_radiance_hdr.h +++ b/source/blender/imbuf/intern/module.c @@ -1,7 +1,5 @@ /* - * IMB_radiance_hdr.h - * - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -19,24 +17,24 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. + * Contributor(s): Blender Foundation, 2010. * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef IMB_RADIANCE_HDR_H -#define IMB_RADIANCE_HDR_H +#include "IMB_imbuf.h" +#include "IMB_filetype.h" -struct ImBuf; +void IMB_init(void) +{ + imb_filetypes_init(); + imb_tile_cache_init(); +} -int imb_is_a_hdr(void *buf); +void IMB_exit(void) +{ + IMB_free_cache_limiter(); + imb_tile_cache_exit(); + imb_filetypes_exit(); +} -struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags); -short imb_savehdr(struct ImBuf * ibuf, char *name, int flags); - -#endif diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index c9859f8d5bd..a0969979817 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -46,10 +46,12 @@ _CRTIMP void __cdecl _invalid_parameter_noinfo(void) #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_math_color.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" +#include "IMB_metadata.h" #include "openexr_multi.h" } @@ -177,7 +179,15 @@ static void openexr_header_compression(Header *header, int compression) } } -static short imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags) +static void openexr_header_metadata(Header *header, struct ImBuf *ibuf) +{ + ImMetaData* info; + + for(info= ibuf->metadata; info; info= info->next) + header->insert(info->key, StringAttribute(info->value)); +} + +static int imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags) { int channels = ibuf->channels; int width = ibuf->x; @@ -189,6 +199,7 @@ static short imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags) Header header (width, height); openexr_header_compression(&header, ibuf->ftype & OPENEXR_COMPRESS); + openexr_header_metadata(&header, ibuf); header.channels().insert ("R", Channel (HALF)); header.channels().insert ("G", Channel (HALF)); @@ -218,35 +229,65 @@ static short imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags) sizeof(float), sizeof(float) * -width)); if(ibuf->rect_float) { float *from; - - for (int i = ibuf->y-1; i >= 0; i--) - { - from= ibuf->rect_float + channels*i*width; - - for (int j = ibuf->x; j > 0; j--) + + if(ibuf->profile == IB_PROFILE_LINEAR_RGB) { + for (int i = ibuf->y-1; i >= 0; i--) { - to->r = from[0]; - to->g = (channels >= 2)? from[1]: from[0]; - to->b = (channels >= 3)? from[2]: from[0]; - to->a = (channels >= 4)? from[3]: from[0]; - to++; from += 4; + from= ibuf->rect_float + channels*i*width; + + for (int j = ibuf->x; j > 0; j--) + { + to->r = from[0]; + to->g = from[1]; + to->b = from[2]; + to->a = (channels >= 4)? from[3]: 1.0f; + to++; from += 4; + } + } + } + else { + for (int i = ibuf->y-1; i >= 0; i--) + { + from= ibuf->rect_float + channels*i*width; + + for (int j = ibuf->x; j > 0; j--) + { + to->r = srgb_to_linearrgb(from[0]); + to->g = srgb_to_linearrgb(from[1]); + to->b = srgb_to_linearrgb(from[2]); + to->a = (channels >= 4)? from[3]: 1.0f; + to++; from += 4; + } } } } else { unsigned char *from; - - for (int i = ibuf->y-1; i >= 0; i--) - { - from= (unsigned char *)ibuf->rect + channels*i*width; - - for (int j = ibuf->x; j > 0; j--) + + if(ibuf->profile == IB_PROFILE_LINEAR_RGB) { + for (int i = ibuf->y-1; i >= 0; i--) { - to->r = (float)(from[0])/255.0; - to->g = (float)((channels >= 2)? from[1]: from[0])/255.0; - to->b = (float)((channels >= 3)? from[2]: from[0])/255.0; - to->a = (float)((channels >= 4)? from[3]: from[0])/255.0; - to++; from += 4; + for (int j = ibuf->x; j > 0; j--) + { + to->r = (float)(from[0])/255.0; + to->g = (float)(from[1])/255.0; + to->b = (float)(from[2])/255.0; + to->a = (float)(channels >= 4) ? from[3]/255.0 : 1.0f; + to++; from += 4; + } + } + } + else { + for (int i = ibuf->y-1; i >= 0; i--) + { + for (int j = ibuf->x; j > 0; j--) + { + to->r = srgb_to_linearrgb((float)from[0] / 255.0); + to->g = srgb_to_linearrgb((float)from[1] / 255.0); + to->b = srgb_to_linearrgb((float)from[2] / 255.0); + to->a = channels >= 4 ? (float)from[3]/255.0 : 1.0f; + to++; from += 4; + } } } } @@ -269,7 +310,7 @@ static short imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags) return (1); } -static short imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags) +static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags) { int channels = ibuf->channels; int width = ibuf->x; @@ -281,6 +322,7 @@ static short imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags) Header header (width, height); openexr_header_compression(&header, ibuf->ftype & OPENEXR_COMPRESS); + openexr_header_metadata(&header, ibuf); header.channels().insert ("R", Channel (FLOAT)); header.channels().insert ("G", Channel (FLOAT)); @@ -297,9 +339,9 @@ static short imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags) float *rect[4] = {NULL, NULL, NULL, NULL}; rect[0]= ibuf->rect_float + channels*(height-1)*width; - rect[1]= (channels >= 2)? rect[0]+1: rect[0]; - rect[2]= (channels >= 3)? rect[0]+2: rect[0]; - rect[3]= (channels >= 4)? rect[0]+3: rect[0]; + rect[1]= rect[0]+1; + rect[2]= rect[0]+2; + rect[3]= (channels >= 4)? rect[0]+3:rect[0]; /* red as alpha, is this needed since alpha isnt written? */ frameBuffer.insert ("R", Slice (FLOAT, (char *)rect[0], xstride, ystride)); frameBuffer.insert ("G", Slice (FLOAT, (char *)rect[1], xstride, ystride)); @@ -326,7 +368,7 @@ static short imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags) } -short imb_save_openexr(struct ImBuf *ibuf, char *name, int flags) +int imb_save_openexr(struct ImBuf *ibuf, char *name, int flags) { if (flags & IB_mem) { @@ -435,6 +477,7 @@ void IMB_exr_add_channel(void *handle, const char *layname, const char *passname BLI_addtail(&data->channels, echan); } +/* only used for writing temp. render results (not image files) */ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, int compress) { ExrHandle *data= (ExrHandle *)handle; @@ -448,6 +491,7 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in header.channels().insert (echan->name, Channel (FLOAT)); openexr_header_compression(&header, compress); + // openexr_header_metadata(&header, ibuf); // no imbuf. cant write /* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */ header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43 and newer")); @@ -518,12 +562,9 @@ void IMB_exr_set_channel(void *handle, char *layname, char *passname, int xstrid } else BLI_strncpy(name, passname, EXR_TOT_MAXNAME-1); - - - for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) - if(strcmp(echan->name, name)==0) - break; - + + echan= (ExrChannel *)BLI_findstring(&data->channels, name, offsetof(ExrChannel, name)); + if(echan) { echan->xstride= xstride; echan->ystride= ystride; @@ -575,7 +616,12 @@ void IMB_exr_write_channels(void *handle) echan->xstride*sizeof(float), echan->ystride*sizeof(float))); data->ofile->setFrameBuffer (frameBuffer); - data->ofile->writePixels (data->height); + try { + data->ofile->writePixels (data->height); + } + catch (const std::exception &exc) { + std::cerr << "OpenEXR-writePixels: ERROR: " << exc.what() << std::endl; + } } else { printf("Error: attempt to save MultiLayer without layers.\n"); @@ -598,7 +644,13 @@ void IMB_exr_read_channels(void *handle) } data->ifile->setFrameBuffer (frameBuffer); - data->ifile->readPixels (0, data->height-1); + + try { + data->ifile->readPixels (0, data->height-1); + } + catch (const std::exception &exc) { + std::cerr << "OpenEXR-readPixels: ERROR: " << exc.what() << std::endl; + } } void IMB_exr_multilayer_convert(void *handle, void *base, @@ -700,35 +752,30 @@ static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *pa static ExrLayer *imb_exr_get_layer(ListBase *lb, char *layname) { - ExrLayer *lay; - - for(lay= (ExrLayer *)lb->first; lay; lay= lay->next) { - if( strcmp(lay->name, layname)==0 ) - return lay; + ExrLayer *lay= (ExrLayer *)BLI_findstring(lb, layname, offsetof(ExrLayer, name)); + + if(lay==NULL) { + lay= (ExrLayer *)MEM_callocN(sizeof(ExrLayer), "exr layer"); + BLI_addtail(lb, lay); + BLI_strncpy(lay->name, layname, EXR_LAY_MAXNAME); } - lay= (ExrLayer *)MEM_callocN(sizeof(ExrLayer), "exr layer"); - BLI_addtail(lb, lay); - BLI_strncpy(lay->name, layname, EXR_LAY_MAXNAME); - + return lay; } static ExrPass *imb_exr_get_pass(ListBase *lb, char *passname) { - ExrPass *pass; + ExrPass *pass= (ExrPass *)BLI_findstring(lb, passname, offsetof(ExrPass, name)); - for(pass= (ExrPass *)lb->first; pass; pass= pass->next) { - if( strcmp(pass->name, passname)==0 ) - return pass; - } - - pass= (ExrPass *)MEM_callocN(sizeof(ExrPass), "exr pass"); + if(pass==NULL) { + pass= (ExrPass *)MEM_callocN(sizeof(ExrPass), "exr pass"); + + if(strcmp(passname, "Combined")==0) + BLI_addhead(lb, pass); + else + BLI_addtail(lb, pass); + } - if(strcmp(passname, "Combined")==0) - BLI_addhead(lb, pass); - else - BLI_addtail(lb, pass); - BLI_strncpy(pass->name, passname, EXR_LAY_MAXNAME); return pass; @@ -880,14 +927,7 @@ static const char *exr_rgba_channelname(InputFile *file, const char *chan) static int exr_has_zbuffer(InputFile *file) { - const ChannelList &channels = file->header().channels(); - - for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i) - { - if(strcmp("Z", i.name())==0) - return 1; - } - return 0; + return !(file->header().channels().findChannel("Z") == NULL); } static int exr_is_renderresult(InputFile *file) @@ -984,16 +1024,22 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, int size, int flags) file->setFrameBuffer (frameBuffer); file->readPixels (dw.min.y, dw.max.y); - - IMB_rect_from_float(ibuf); + + // XXX, ImBuf has no nice way to deal with this. + // ideally IM_rect would be used when the caller wants a rect BUT + // at the moment all functions use IM_rect. + // Disabling this is ok because all functions should check if a rect exists and create one on demand. + // + // Disabling this because the sequencer frees immediate. + // + // if(flag & IM_rect) + // IMB_rect_from_float(ibuf); } } } delete file; - return(ibuf); - } catch (const std::exception &exc) { diff --git a/source/blender/imbuf/intern/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h index a6892dcbaed..c23b47d1480 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.h +++ b/source/blender/imbuf/intern/openexr/openexr_api.h @@ -46,7 +46,7 @@ extern "C" { int imb_is_a_openexr (unsigned char *mem); -short imb_save_openexr (struct ImBuf *ibuf, char *name, int flags); +int imb_save_openexr (struct ImBuf *ibuf, char *name, int flags); struct ImBuf *imb_load_openexr (unsigned char *mem, int size, int flags); diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c index 7f686b11087..68a3324816c 100644 --- a/source/blender/imbuf/intern/png.c +++ b/source/blender/imbuf/intern/png.c @@ -33,15 +33,13 @@ #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_cmap.h" -#include "IMB_imginfo.h" -#include "IMB_png.h" +#include "IMB_metadata.h" +#include "IMB_filetype.h" typedef struct PNGReadStruct { unsigned char *data; @@ -53,7 +51,7 @@ static void ReadData( png_structp png_ptr, png_bytep data, png_size_t length); static void WriteData( png_structp png_ptr, png_bytep data, png_size_t length); static void Flush( png_structp png_ptr); -int imb_is_a_png(void *mem) +int imb_is_a_png(unsigned char *mem) { int ret_val = 0; @@ -94,7 +92,7 @@ static void ReadData( png_structp png_ptr, png_bytep data, png_size_t length) longjmp(png_jmpbuf(png_ptr), 1); } -short imb_savepng(struct ImBuf *ibuf, char *name, int flags) +int imb_savepng(struct ImBuf *ibuf, char *name, int flags) { png_structp png_ptr; png_infop info_ptr; @@ -188,7 +186,7 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags) Flush); } else { fp = fopen(name, "wb"); - if (!fp) { + if (!fp) { MEM_freeN(pixels); return 0; } @@ -219,30 +217,30 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags) PNG_FILTER_TYPE_DEFAULT); /* image text info */ - if (ibuf->img_info) { - png_text* imginfo; - ImgInfo* iptr; + if (ibuf->metadata) { + png_text* metadata; + ImMetaData* iptr; int num_text = 0; - iptr = ibuf->img_info; + iptr = ibuf->metadata; while (iptr) { num_text++; iptr = iptr->next; } - imginfo = MEM_callocN(num_text*sizeof(png_text), "png_imginfo"); - iptr = ibuf->img_info; + metadata = MEM_callocN(num_text*sizeof(png_text), "png_metadata"); + iptr = ibuf->metadata; num_text = 0; while (iptr) { - imginfo[num_text].compression = PNG_TEXT_COMPRESSION_NONE; - imginfo[num_text].key = iptr->key; - imginfo[num_text].text = iptr->value; + metadata[num_text].compression = PNG_TEXT_COMPRESSION_NONE; + metadata[num_text].key = iptr->key; + metadata[num_text].text = iptr->value; num_text++; iptr = iptr->next; } - png_set_text(png_ptr, info_ptr, imginfo, num_text); - MEM_freeN(imginfo); + png_set_text(png_ptr, info_ptr, metadata, num_text); + MEM_freeN(metadata); } @@ -437,13 +435,13 @@ struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags) break; } - if (flags & IB_imginfo) { + if (flags & IB_metadata) { png_text* text_chunks; int count = png_get_text(png_ptr, info_ptr, &text_chunks, NULL); for(i = 0; i < count; i++) { - IMB_imginfo_add_field(ibuf, text_chunks[i].key, text_chunks[i].text); - ibuf->flags |= IB_imginfo; - } + IMB_metadata_add_field(ibuf, text_chunks[i].key, text_chunks[i].text); + ibuf->flags |= IB_metadata; + } } png_read_end(png_ptr, info_ptr); diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c index 5352f17b49e..dabb6780ea3 100644 --- a/source/blender/imbuf/intern/radiance_hdr.c +++ b/source/blender/imbuf/intern/radiance_hdr.c @@ -1,7 +1,7 @@ /* * radiance_hdr.c * - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -43,14 +43,12 @@ #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_cmap.h" -#include "IMB_radiance_hdr.h" +#include "IMB_filetype.h" /* needed constants */ #define MINELEN 8 @@ -160,7 +158,7 @@ static void FLOAT2RGBE(fCOLOR fcol, RGBE rgbe) /* ImBuf read */ -int imb_is_a_hdr(void *buf) +int imb_is_a_hdr(unsigned char *buf) { // For recognition, Blender only loads first 32 bytes, so use #?RADIANCE id instead // update: actually, the 'RADIANCE' part is just an optional program name, the magic word is really only the '#?' part @@ -205,7 +203,6 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags) if (ibuf==NULL) return NULL; ibuf->ftype = RADHDR; ibuf->profile = IB_PROFILE_LINEAR_RGB; - ibuf->xorig = ibuf->yorig = 0; if (flags & IB_test) return ibuf; @@ -257,7 +254,7 @@ static int fwritecolrs(FILE* file, int width, int channels, unsigned char* ibufs rgbe_scan = (RGBE*)MEM_mallocN(sizeof(RGBE)*width, "radhdr_write_tmpscan"); /* convert scanline */ - j= 0; + j= 0; for (i=0;i> 8) & 0xff00) | ((x >> 24) & 0xff)) -#define SWAP_S(x) (((x << 8) & 0xff00) | ((x >> 8) & 0xff)) - -/* more endianness... should move to a separate file... */ -#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined(__hppa__) || defined (__BIG_ENDIAN__) -#define GET_ID GET_BIG_LONG -#define LITTLE_LONG SWAP_LONG -#else -#define GET_ID GET_LITTLE_LONG -#define LITTLE_LONG ENDIAN_NOP -#endif - -/* from misc_util: flip the bytes from x */ -#define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) - -/* this one is only def-ed once, strangely... */ -#define GSS(x) (((uchar *)(x))[1] << 8 | ((uchar *)(x))[0]) - -int IB_verbose = TRUE; - -ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) { - int len; - struct ImBuf *ibuf; - - if (mem == NULL) { + if(mem == NULL) { printf("Error in ibImageFromMemory: NULL pointer\n"); - } else { - if ((GS(mem) == IMAGIC) || (GSS(mem) == IMAGIC)){ - return (imb_loadiris((uchar *) mem, flags)); - } else if (imb_is_a_jpeg((uchar *)mem)) { - return (imb_ibJpegImageFromMemory((uchar *)mem, size, flags)); - } - - if (GET_ID(mem) == CAT){ - mem += 3; - size -= 4; - while (size > 0){ - if (GET_ID(mem) == FORM){ - len = ((GET_BIG_LONG(mem+1) + 1) & ~1) + 8; - if ((GET_ID(mem+2) == ILBM) || (GET_ID(mem+2) == ANIM)) break; - mem = (int *)((uchar *)mem +len); - size -= len; - } else return(0); - } - } - - if (size > 0){ - if (GET_ID(mem) == FORM){ - if (GET_ID(mem+2) == ILBM){ - return (imb_loadamiga(mem, flags)); - } else if (GET_ID(mem+5) == ILBM){ /* animaties */ - return (imb_loadamiga(mem+3, flags)); - } else if (GET_ID(mem+2) == ANIM){ - return (imb_loadanim(mem, flags)); + return NULL; + } + + for(type=IMB_FILE_TYPES; type->is_a; type++) { + if(type->load) { + ibuf= type->load(mem, size, flags); + if(ibuf) { + if(flags & IB_premul) { + IMB_premultiply_alpha(ibuf); + ibuf->flags |= IB_premul; } + + return ibuf; } } - - ibuf = imb_loadpng((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - - ibuf = imb_bmp_decode((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - - ibuf = imb_loadtarga((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - - ibuf = imb_loaddpx((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - - ibuf = imb_loadcineon((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - -#if defined(__APPLE__) && defined(IMBUF_COCOA) - ibuf = imb_cocoaLoadImage((uchar *)mem, size, flags); - if(ibuf) { - ibuf->ftype = TIF; - ibuf->profile = IB_PROFILE_SRGB; - return ibuf; - } -#else - if (G.have_libtiff) { - ibuf = imb_loadtiff((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - } -#endif - - ibuf = imb_loadhdr((uchar*)mem, size, flags); - if (ibuf) return (ibuf); - -#ifdef WITH_OPENEXR - ibuf = imb_load_openexr((uchar *)mem, size, flags); - if (ibuf) return (ibuf); -#endif - -#ifdef WITH_OPENJPEG - ibuf = imb_jp2_decode((uchar *)mem, size, flags); - if (ibuf) return (ibuf); -#endif - -#ifdef WITH_DDS - ibuf = imb_load_dds((uchar *)mem, size, flags); - if (ibuf) return (ibuf); -#endif - -#ifdef WITH_QUICKTIME -#if defined(_WIN32) || defined (__APPLE__) - if(G.have_quicktime) { - ibuf = imb_quicktime_decode((uchar *)mem, size, flags); - if (ibuf) return(ibuf); - } -#endif -#endif - - if (IB_verbose) fprintf(stderr, "Unknown fileformat\n"); } + + fprintf(stderr, "Unknown fileformat\n"); - return (0); + return NULL; } +ImBuf *IMB_loadifffile(int file, int flags) +{ + ImBuf *ibuf; + unsigned char *mem; + int size; -struct ImBuf *IMB_loadiffmem(int *mem, int flags) { - int len,maxlen; - struct ImBuf *ibuf; + if(file == -1) return 0; - // IMB_loadiffmem shouldn't be used anymore in new development - // it's still here to be backwards compatible... + size= BLI_filesize(file); - maxlen= (GET_BIG_LONG(mem+1) + 1) & ~1; - - if (GET_ID(mem) == CAT){ - mem += 3; - maxlen -= 4; - while(maxlen > 0){ - if (GET_ID(mem) == FORM){ - len = ((GET_BIG_LONG(mem+1) + 1) & ~1) + 8; - if ((GET_ID(mem+2) == ILBM) || (GET_ID(mem+2) == ANIM)) break; - mem = (int *)((uchar *)mem +len); - maxlen -= len; - } else return(0); - } + mem= mmap(0, size, PROT_READ, MAP_SHARED, file, 0); + if(mem==(unsigned char*)-1) { + fprintf(stderr, "Couldn't get mapping\n"); + return 0; } - if (maxlen > 0){ - if (GET_ID(mem) == FORM){ - if (GET_ID(mem+2) == ILBM){ - return (imb_loadamiga(mem, flags)); - } else if (GET_ID(mem+5) == ILBM){ /* animaties */ - return (imb_loadamiga(mem+3, flags)); - } else if (GET_ID(mem+2) == ANIM){ - return (imb_loadanim(mem, flags)); - } - } else if ((GS(mem) == IMAGIC) || (GSS(mem) == IMAGIC)){ - return (imb_loadiris((uchar *) mem,flags)); - } else if ((BIG_LONG(mem[0]) & 0xfffffff0) == 0xffd8ffe0) { - return (0); - } - } + ibuf= IMB_ibImageFromMemory(mem, size, flags); - ibuf = imb_loadtarga((uchar *) mem,maxlen,flags); - if (ibuf) return(ibuf); + if(munmap(mem, size)) + fprintf(stderr, "Couldn't unmap file.\n"); - if (IB_verbose) fprintf(stderr,"Unknown fileformat\n"); - return (0); + return ibuf; } -struct ImBuf *IMB_loadifffile(int file, int flags) { - struct ImBuf *ibuf; - int size, *mem; +static void imb_cache_filename(char *filename, const char *name, int flags) +{ + /* read .tx instead if it exists and is not older */ + if(flags & IB_tilecache) { + BLI_strncpy(filename, name, IB_FILENAME_SIZE); + if(!BLI_replace_extension(filename, IB_FILENAME_SIZE, ".tx")) + return; - if (file == -1) return (0); - - size = BLI_filesize(file); - - mem= (int *)mmap(0,size,PROT_READ,MAP_SHARED,file,0); - if (mem==(int *)-1){ - printf("Couldn't get mapping\n"); - return (0); + if(BLI_file_older(name, filename)) + return; } - ibuf = IMB_ibImageFromMemory(mem, size, flags); - - if (munmap( (void *) mem, size)){ - printf("Couldn't unmap file.\n"); - } - return(ibuf); + BLI_strncpy(filename, name, IB_FILENAME_SIZE); } +ImBuf *IMB_loadiffname(const char *name, int flags) +{ + ImBuf *ibuf; + int file, a; + char filename[IB_FILENAME_SIZE]; -struct ImBuf *IMB_loadiffname(const char *naam, int flags) { - int file; - struct ImBuf *ibuf; - int buf[1]; + imb_cache_filename(filename, name, flags); - file = open(naam, O_BINARY|O_RDONLY); - - if (file < 0) return (0); + file = open(filename, O_BINARY|O_RDONLY); + if(file < 0) return 0; ibuf= IMB_loadifffile(file, flags); - if (ibuf == NULL) { - if (read(file, buf, 4) != 4) buf[0] = 0; - if ((BIG_LONG(buf[0]) & 0xfffffff0) == 0xffd8ffe0) - ibuf = imb_ibJpegImageFromFilename(naam, flags); + if(ibuf) { + BLI_strncpy(ibuf->name, name, sizeof(ibuf->name)); + BLI_strncpy(ibuf->cachename, filename, sizeof(ibuf->cachename)); + for(a=1; amiptot; a++) + BLI_strncpy(ibuf->mipmap[a-1]->cachename, filename, sizeof(ibuf->cachename)); + if(flags & IB_fields) IMB_de_interlace(ibuf); } - if (ibuf) { - strncpy(ibuf->name, naam, sizeof(ibuf->name)); - if (flags & IB_fields) IMB_de_interlace(ibuf); - } close(file); - return(ibuf); + + return ibuf; } -struct ImBuf *IMB_testiffname(char *naam,int flags) { +ImBuf *IMB_testiffname(char *name, int flags) +{ + ImBuf *ibuf; int file; - struct ImBuf *ibuf; + char filename[IB_FILENAME_SIZE]; - flags |= IB_test; - file = open(naam,O_BINARY|O_RDONLY); + imb_cache_filename(filename, name, flags); - if (file < 0) return (0); + file = open(filename,O_BINARY|O_RDONLY); + if(file < 0) return 0; - ibuf=IMB_loadifffile(file,flags); - if (ibuf) { - strncpy(ibuf->name, naam, sizeof(ibuf->name)); + ibuf=IMB_loadifffile(file, flags|IB_test); + if(ibuf) { + BLI_strncpy(ibuf->name, name, sizeof(ibuf->name)); + BLI_strncpy(ibuf->cachename, filename, sizeof(ibuf->cachename)); } + close(file); - return(ibuf); + + return ibuf; } + +static void imb_loadtilefile(ImBuf *ibuf, int file, int tx, int ty, unsigned int *rect) +{ + ImFileType *type; + unsigned char *mem; + int size; + + if(file == -1) return; + + size= BLI_filesize(file); + + mem= mmap(0, size, PROT_READ, MAP_SHARED, file, 0); + if(mem==(unsigned char*)-1) { + fprintf(stderr, "Couldn't get memory mapping for %s\n", ibuf->cachename); + return; + } + + for(type=IMB_FILE_TYPES; type->is_a; type++) + if(type->load_tile && type->ftype(type, ibuf)) + type->load_tile(ibuf, mem, size, tx, ty, rect); + + if(munmap(mem, size)) + fprintf(stderr, "Couldn't unmap memory for %s.\n", ibuf->cachename); +} + +void imb_loadtile(ImBuf *ibuf, int tx, int ty, unsigned int *rect) +{ + int file; + + file = open(ibuf->cachename, O_BINARY|O_RDONLY); + if(file < 0) return; + + imb_loadtilefile(ibuf, file, tx, ty, rect); + + close(file); +} + diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c index 3202413a494..53385743bb8 100644 --- a/source/blender/imbuf/intern/rectop.c +++ b/source/blender/imbuf/intern/rectop.c @@ -32,7 +32,6 @@ #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" diff --git a/source/blender/imbuf/intern/rotate.c b/source/blender/imbuf/intern/rotate.c index 2369c83bbd3..e0e52bb7094 100644 --- a/source/blender/imbuf/intern/rotate.c +++ b/source/blender/imbuf/intern/rotate.c @@ -33,7 +33,6 @@ #include "BKE_utildefines.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index 14b1753f586..335e16402f9 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -32,7 +32,6 @@ #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" @@ -263,7 +262,7 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1) for(x = ibuf2->x ; x>0 ; x--) *dest1++ = *dest2++ = *p1++; dest1 = dest2; } - if (do_float) { + if (do_float) { dest2f = dest1f + (4*ibuf2->x); for(x = ibuf2->x*4 ; x>0 ; x--) *dest1f++ = *dest2f++ = *p1f++; dest1f = dest2f; @@ -347,142 +346,6 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1) } - -struct ImBuf *IMB_onethird(struct ImBuf *ibuf1) -{ - struct ImBuf *ibuf2; - uchar *p1,*p2,*p3,*dest; - float *p1f, *p2f, *p3f, *destf; - int do_rect, do_float; - short a,r,g,b,x,y,i; - float af,rf,gf,bf; - - p2= p3= NULL; - p2f= p3f= NULL; - if (ibuf1==NULL) return (0); - if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0); - - do_rect= (ibuf1->rect != NULL); - do_float= (ibuf1->rect_float != NULL); - - ibuf2=IMB_allocImBuf((ibuf1->x)/3, (ibuf1->y)/3, ibuf1->depth, ibuf1->flags, 0); - if (ibuf2==NULL) return (0); - - p1f = ibuf1->rect_float; - destf = ibuf2->rect_float; - p1 = (uchar *) ibuf1->rect; - dest=(uchar *) ibuf2->rect; - - for(y=ibuf2->y;y>0;y--){ - if (do_rect) { - p2 = p1 + (ibuf1->x << 2); - p3 = p2 + (ibuf1->x << 2); - } - if (do_float) { - p2f = p1f + (ibuf1->x <<2); - p3f = p2f + (ibuf1->x <<2); - } - for(x=ibuf2->x;x>0;x--){ - a=r=g=b=0; - af=rf=gf=bf=0; - for (i=3;i>0;i--){ - if (do_rect) { - a += *(p1++) + *(p2++) + *(p3++); - b += *(p1++) + *(p2++) + *(p3++); - g += *(p1++) + *(p2++) + *(p3++); - r += *(p1++) + *(p2++) + *(p3++); - } - if (do_float) { - af += *(p1f++) + *(p2f++) + *(p3f++); - bf += *(p1f++) + *(p2f++) + *(p3f++); - gf += *(p1f++) + *(p2f++) + *(p3f++); - rf += *(p1f++) + *(p2f++) + *(p3f++); - } - } - if (do_rect) { - *(dest++) = a/9; - *(dest++) = b/9; - *(dest++) = g/9; - *(dest++) = r/9; - } - if (do_float) { - *(destf++) = af/9.0f; - *(destf++) = bf/9.0f; - *(destf++) = gf/9.0f; - *(destf++) = rf/9.0f; - } - } - if (do_rect) p1=p3; - if (do_float) p1f = p3f; - } - return (ibuf2); -} - - -struct ImBuf *IMB_halflace(struct ImBuf *ibuf1) -{ - struct ImBuf *ibuf2; - uchar *p1,*p2,*dest; - float *p1f,*p2f,*destf; - short a,r,g,b,x,y,i; - float af,rf,gf,bf; - int do_rect, do_float; - - p2= NULL; - p2f= NULL; - if (ibuf1==NULL) return (0); - if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0); - - do_rect= (ibuf1->rect != NULL); - do_float= (ibuf1->rect_float != NULL); - - ibuf2=IMB_allocImBuf((ibuf1->x)/4, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags, 0); - if (ibuf2==NULL) return (0); - - p1f = ibuf1->rect_float; - destf= ibuf2->rect_float; - p1 = (uchar *) ibuf1->rect; - dest=(uchar *) ibuf2->rect; - - for(y= ibuf2->y / 2 ; y>0;y--){ - if (do_rect) p2 = p1 + (ibuf1->x << 3); - if (do_float) p2f = p1f + (ibuf1->x << 3); - for(x = 2 * ibuf2->x;x>0;x--){ - a=r=g=b=0; - af=rf=gf=bf=0; - for (i=4;i>0;i--){ - if (do_rect) { - a += *(p1++) + *(p2++); - b += *(p1++) + *(p2++); - g += *(p1++) + *(p2++); - r += *(p1++) + *(p2++); - } - if (do_float) { - af += *(p1f++) + *(p2f++); - bf += *(p1f++) + *(p2f++); - gf += *(p1f++) + *(p2f++); - rf += *(p1f++) + *(p2f++); - } - } - if (do_rect) { - *(dest++) = a >> 3; - *(dest++) = b >> 3; - *(dest++) = g >> 3; - *(dest++) = r >> 3; - } - if (do_float) { - *(destf++) = 0.125f*af; - *(destf++) = 0.125f*bf; - *(destf++) = 0.125f*gf; - *(destf++) = 0.125f*rf; - } - } - if (do_rect) p1 = p2; - if (do_float) p1f = p2f; - } - return (ibuf2); -} - /* q_scale_linear_interpolation helper functions */ static void enlarge_picture_byte( @@ -520,38 +383,38 @@ static void enlarge_picture_byte( *dst++ = ((((line1[x] * weight1y) >> 16) * weight1x) >> 16) + ((((line2[x] * weight2y) >> 16) - * weight1x) >> 16) + * weight1x) >> 16) + ((((line1[4 + x] * weight1y) >> 16) * weight2x) >> 16) + ((((line2[4 + x] * weight2y) >> 16) - * weight2x) >> 16); + * weight2x) >> 16); *dst++ = ((((line1[x + 1] * weight1y) >> 16) * weight1x) >> 16) + ((((line2[x + 1] * weight2y) >> 16) - * weight1x) >> 16) + * weight1x) >> 16) + ((((line1[4 + x + 1] * weight1y) >> 16) * weight2x) >> 16) + ((((line2[4 + x + 1] * weight2y) >> 16) - * weight2x) >> 16); + * weight2x) >> 16); *dst++ = ((((line1[x + 2] * weight1y) >> 16) * weight1x) >> 16) + ((((line2[x + 2] * weight2y) >> 16) - * weight1x) >> 16) + * weight1x) >> 16) + ((((line1[4 + x + 2] * weight1y) >> 16) * weight2x) >> 16) + ((((line2[4 + x + 2] * weight2y) >> 16) - * weight2x) >> 16); + * weight2x) >> 16); *dst++ = ((((line1[x + 3] * weight1y) >> 16) * weight1x) >> 16) + ((((line2[x + 3] * weight2y) >> 16) - * weight1x) >> 16) + * weight1x) >> 16) + ((((line1[4 + x + 3] * weight1y) >> 16) * weight2x) >> 16) + ((((line2[4 + x + 3] * weight2y) >> 16) - * weight2x) >> 16); + * weight2x) >> 16); x_src += dx_src; } @@ -661,7 +524,7 @@ static void shrink_picture_byte( *dst++ = (val= (dst_line1[x].a * f) >> 15) > 255 ? 255: val; } memset(dst_line1, 0, dst_width * - sizeof(struct scale_outpix_byte)); + sizeof(struct scale_outpix_byte)); temp = dst_line1; dst_line1 = dst_line2; dst_line2 = temp; @@ -688,10 +551,10 @@ static void q_scale_byte(unsigned char* in, unsigned char* out, int in_width, { if (dst_width > in_width && dst_height > in_height) { enlarge_picture_byte(in, out, in_width, in_height, - dst_width, dst_height); + dst_width, dst_height); } else if (dst_width < in_width && dst_height < in_height) { shrink_picture_byte(in, out, in_width, in_height, - dst_width, dst_height); + dst_width, dst_height); } } @@ -777,7 +640,7 @@ static void shrink_picture_float( double ratioy = (double) (dst_height) / (double) (src_height); uintptr_t x_src; uintptr_t y_src; - float dx_dst, x_dst; + float dx_dst, x_dst; float dy_dst, y_dst; float y_counter; float * dst_begin = dst; @@ -862,7 +725,7 @@ static void shrink_picture_float( *dst++ = dst_line1[x].a * f; } memset(dst_line1, 0, dst_width * - sizeof(struct scale_outpix_float)); + sizeof(struct scale_outpix_float)); temp = dst_line1; dst_line1 = dst_line2; dst_line2 = temp; @@ -888,10 +751,10 @@ static void q_scale_float(float* in, float* out, int in_width, { if (dst_width > in_width && dst_height > in_height) { enlarge_picture_float(in, out, in_width, in_height, - dst_width, dst_height); + dst_width, dst_height); } else if (dst_width < in_width && dst_height < in_height) { shrink_picture_float(in, out, in_width, in_height, - dst_width, dst_height); + dst_width, dst_height); } } @@ -906,7 +769,7 @@ static void q_scale_float(float* in, float* out, int in_width, but that is pretty fast: * does only blit once instead of two passes like the old code - (fewer cache misses) + (fewer cache misses) * uses fixed point integer arithmetic for byte buffers * doesn't branch in tight loops @@ -920,7 +783,7 @@ static int q_scale_linear_interpolation( struct ImBuf *ibuf, int newx, int newy) { if ((newx >= ibuf->x && newy <= ibuf->y) || - (newx <= ibuf->x && newy >= ibuf->y)) { + (newx <= ibuf->x && newy >= ibuf->y)) { return FALSE; } @@ -928,7 +791,7 @@ static int q_scale_linear_interpolation( unsigned char * newrect = MEM_mallocN(newx * newy * sizeof(int), "q_scale rect"); q_scale_byte((unsigned char *)ibuf->rect, newrect, ibuf->x, ibuf->y, - newx, newy); + newx, newy); imb_freerectImBuf(ibuf); ibuf->mall |= IB_rect; @@ -937,9 +800,9 @@ static int q_scale_linear_interpolation( if (ibuf->rect_float) { float * newrect = MEM_mallocN(newx * newy * 4 *sizeof(float), - "q_scale rectfloat"); + "q_scale rectfloat"); q_scale_float(ibuf->rect_float, newrect, ibuf->x, ibuf->y, - newx, newy); + newx, newy); imb_freerectfloatImBuf(ibuf); ibuf->mall |= IB_rectfloat; ibuf->rect_float = newrect; @@ -1687,55 +1550,3 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy) return(ibuf); } - -static struct ImBuf *generic_fieldscale(struct ImBuf *ibuf, short newx, short newy, struct ImBuf *(*scalefunc)(ImBuf *, short, short) ) -{ - struct ImBuf *sbuf1, *sbuf2; - - sbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, ibuf->depth, ibuf->flags, 0); - sbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, ibuf->depth, ibuf->flags, 0); - - ibuf->x *= 2; - - /* more args needed, 0 assumed... (nzc) */ - IMB_rectcpy(sbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y); - IMB_rectcpy(sbuf2, ibuf, 0, 0, sbuf2->x, 0, ibuf->x, ibuf->y); - - imb_freerectImBuf(ibuf); - imb_freerectfloatImBuf(ibuf); - - ibuf->x = newx; - ibuf->y = newy; - - imb_addrectImBuf(ibuf); - if(ibuf->flags & IB_rectfloat) - imb_addrectfloatImBuf(ibuf); - - scalefunc(sbuf1, newx, newy / 2); - scalefunc(sbuf2, newx, newy / 2); - - ibuf->x *= 2; - - /* more args needed, 0 assumed... (nzc) */ - IMB_rectcpy(ibuf, sbuf1, 0, 0, 0, 0, sbuf1->x, sbuf1->y); - IMB_rectcpy(ibuf, sbuf2, sbuf2->x, 0, 0, 0, sbuf2->x, sbuf2->y); - - ibuf->x /= 2; - - IMB_freeImBuf(sbuf1); - IMB_freeImBuf(sbuf2); - - return(ibuf); -} - - -struct ImBuf *IMB_scalefastfieldImBuf(struct ImBuf *ibuf, short newx, short newy) -{ - return(generic_fieldscale(ibuf, newx, newy, IMB_scalefastImBuf)); -} - -struct ImBuf *IMB_scalefieldImBuf(struct ImBuf *ibuf, short newx, short newy) -{ - return(generic_fieldscale(ibuf, newx, newy, IMB_scaleImBuf)); -} - diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c index aafc9711a4e..09aaccc1ab6 100644 --- a/source/blender/imbuf/intern/targa.c +++ b/source/blender/imbuf/intern/targa.c @@ -33,14 +33,12 @@ #include "BLI_blenlib.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_cmap.h" -#include "IMB_targa.h" +#include "IMB_filetype.h" /* this one is only def-ed once, strangely... related to GS? */ @@ -234,11 +232,10 @@ static int dumptarga(struct ImBuf * ibuf, FILE * file) } -short imb_savetarga(struct ImBuf * ibuf, char *name, int flags) +int imb_savetarga(struct ImBuf * ibuf, char *name, int flags) { char buf[20]; FILE *fildes; - int i; short ok = 0; if (ibuf == 0) return (0); @@ -249,19 +246,7 @@ short imb_savetarga(struct ImBuf * ibuf, char *name, int flags) /* buf[0] = 0; length string */ buf[16] = (ibuf->depth + 0x7 ) & ~0x7; - if (ibuf->cmap) { - buf[1] = 1; - buf[2] = 9; - buf[3] = ibuf->mincol & 0xff; - buf[4] = ibuf->mincol >> 8; - buf[5] = ibuf->maxcol & 0xff; - buf[6] = ibuf->maxcol >> 8; - buf[7] = 24; - if ((flags & IB_ttob) == 0) { - IMB_flipy(ibuf); - buf[17] = 0x20; - } - } else if (ibuf->depth > 8 ){ + if (ibuf->depth > 8 ){ buf[2] = 10; } else{ buf[2] = 11; @@ -269,42 +254,29 @@ short imb_savetarga(struct ImBuf * ibuf, char *name, int flags) if (ibuf->ftype == RAWTGA) buf[2] &= ~8; - buf[8] = ibuf->xorig & 0xff; - buf[9] = ibuf->xorig >> 8; - buf[10] = ibuf->yorig & 0xff; - buf[11] = ibuf->yorig >> 8; + buf[8] = 0; + buf[9] = 0; + buf[10] = 0; + buf[11] = 0; buf[12] = ibuf->x & 0xff; buf[13] = ibuf->x >> 8; buf[14] = ibuf->y & 0xff; buf[15] = ibuf->y >> 8; - if (flags & IB_ttob) buf[17] ^= 0x20; - /* Don't forget to indicate that your 32 bit * targa uses 8 bits for the alpha channel! */ if (ibuf->depth==32) { buf[17] |= 0x08; } fildes = fopen(name,"wb"); - if (!fildes) return 0; + if (!fildes) return 0; if (fwrite(buf, 1, 18,fildes) != 18) { fclose(fildes); return (0); } - if (ibuf->cmap){ - for (i = 0 ; imaxcol ; i++){ - if (fwrite(((uchar *)(ibuf->cmap + i)) + 1,1,3,fildes) != 3) { - fclose(fildes); - return (0); - } - } - } - - if (ibuf->cmap && (flags & IB_cmap) == 0) IMB_converttocmap(ibuf); - if (ibuf->ftype == RAWTGA) { ok = dumptarga(ibuf, fildes); } else { @@ -365,7 +337,7 @@ static int checktarga(TARGA *tga, unsigned char *mem) return(1); } -int imb_is_a_targa(void *buf) { +int imb_is_a_targa(unsigned char *buf) { TARGA tga; return checktarga(&tga, buf); @@ -559,7 +531,7 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags) TARGA tga; struct ImBuf * ibuf; int col, count, size; - unsigned int * rect; + unsigned int *rect, *cmap= NULL, mincol= 0, maxcol= 0; uchar * cp = (uchar *) &col; if (checktarga(&tga,mem) == 0) return(0); @@ -570,19 +542,18 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags) if (ibuf == 0) return(0); ibuf->ftype = TGA; ibuf->profile = IB_PROFILE_SRGB; - ibuf->xorig = tga.xorig; - ibuf->yorig = tga.yorig; mem = mem + 18 + tga.numid; cp[0] = 0xff; cp[1] = cp[2] = 0; if (tga.mapsize){ - ibuf->mincol = tga.maporig; - ibuf->maxcol = tga.mapsize; - imb_addcmapImBuf(ibuf); - ibuf->cbits = 8; - for (count = 0 ; count < ibuf->maxcol ; count ++) { + /* load color map */ + mincol = tga.maporig; + maxcol = tga.mapsize; + cmap = MEM_callocN(sizeof(unsigned int)*maxcol, "targa cmap"); + + for (count = 0 ; count < maxcol ; count ++) { switch (tga.mapbits >> 3) { case 4: cp[0] = mem[3]; @@ -606,21 +577,26 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags) col = *mem++; break; } - ibuf->cmap[count] = col; + cmap[count] = col; } size = 0; - for (col = ibuf->maxcol - 1; col > 0; col >>= 1) size++; + for (col = maxcol - 1; col > 0; col >>= 1) size++; ibuf->depth = size; if (tga.mapbits != 32) { /* set alpha bits */ - ibuf->cmap[0] &= BIG_LONG(0x00ffffff); + cmap[0] &= BIG_LONG(0x00ffffff); } } if (flags & IB_test) return (ibuf); - if (tga.imgtyp != 1 && tga.imgtyp != 9) IMB_freecmapImBuf(ibuf); /* happens sometimes (beuh) */ + if (tga.imgtyp != 1 && tga.imgtyp != 9) { /* happens sometimes (beuh) */ + if(cmap) { + MEM_freeN(cmap); + cmap= NULL; + } + } switch(tga.imgtyp){ case 1: @@ -641,11 +617,18 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags) break; } - if (ibuf->cmap){ - if ((flags & IB_cmap) == 0) IMB_applycmap(ibuf); + if(cmap) { + /* apply color map */ + rect = ibuf->rect; + for(size = ibuf->x * ibuf->y; size>0; --size, ++rect) { + col = *rect; + if (col >= 0 && col < maxcol) *rect = cmap[col]; + } + + MEM_freeN(cmap); } - if (tga.pixsize == 16 && ibuf->cmap == 0){ + if (tga.pixsize == 16) { rect = ibuf->rect; for (size = ibuf->x * ibuf->y; size > 0; --size, ++rect){ col = *rect; @@ -679,13 +662,10 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags) } } - if (flags & IB_ttob) tga.imgdes ^= 0x20; if (tga.imgdes & 0x20) IMB_flipy(ibuf); - if (ibuf) { - if (ibuf->rect && (flags & IB_cmap)==0) - IMB_convert_rgba_to_abgr(ibuf); - } + if (ibuf && ibuf->rect) + IMB_convert_rgba_to_abgr(ibuf); return(ibuf); } diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c index 99b9f8eaef6..234c8837b35 100644 --- a/source/blender/imbuf/intern/thumbs.c +++ b/source/blender/imbuf/intern/thumbs.c @@ -37,7 +37,7 @@ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_thumbs.h" -#include "IMB_imginfo.h" +#include "IMB_metadata.h" #include "md5.h" @@ -164,22 +164,22 @@ void to_hex_char(char* hexbytes, const unsigned char* bytes, int len) /** ----- end of adapted code from glib --- */ -static int uri_from_filename( const char *dir, const char *file, char *uri ) +static int uri_from_filename( const char *path, char *uri ) { char orig_uri[URI_MAX]; - const char* dirstart = dir; + const char* dirstart = path; #ifdef WIN32 { char vol[3]; BLI_strncpy(orig_uri, "file:///", FILE_MAX); - if (strlen(dir) < 2 && dir[1] != ':') { + if (strlen(path) < 2 && path[1] != ':') { /* not a correct absolute path */ return 0; } /* on windows, using always uppercase drive/volume letter in uri */ - vol[0] = (unsigned char)toupper(dir[0]); + vol[0] = (unsigned char)toupper(path[0]); vol[1] = ':'; vol[2] = '\0'; strcat(orig_uri, vol); @@ -189,7 +189,6 @@ static int uri_from_filename( const char *dir, const char *file, char *uri ) BLI_strncpy(orig_uri, "file://", FILE_MAX); #endif strcat(orig_uri, dirstart); - strcat(orig_uri, file); BLI_char_switch(orig_uri, '\\', '/'); #ifdef WITH_ICONV @@ -242,14 +241,12 @@ void IMB_thumb_makedirs() } /* create thumbnail for file and returns new imbuf for thumbnail */ -ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, ThumbSource source) +ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, ImBuf *img) { - ImBuf *img = 0; char uri[URI_MAX]; char desc[URI_MAX+22]; char tpath[FILE_MAX]; char tdir[FILE_MAX]; - char wdir[FILE_MAX]; char temp[FILE_MAX]; char mtime[40]; char cwidth[40]; @@ -274,48 +271,52 @@ ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, Thumb return 0; /* unknown size */ } - uri_from_filename(dir, file,uri); + uri_from_filename(path, uri); thumbname_from_uri(uri, thumb); if (get_thumb_dir(tdir, size)) { BLI_snprintf(tpath, FILE_MAX, "%s%s", tdir, thumb); thumb[8] = '\0'; /* shorten for tempname, not needed anymore */ BLI_snprintf(temp, FILE_MAX, "%sblender_%d_%s.png", tdir, abs(getpid()), thumb); - if (strncmp(thumb, dir, strlen(dir)) == 0) { + if (strncmp(path, tdir, strlen(tdir)) == 0) { return NULL; } if (size == THB_FAIL) { - img = IMB_allocImBuf(0,0,32, IB_rect | IB_imginfo, 0); + img = IMB_allocImBuf(0,0,32, IB_rect | IB_metadata, 0); if (!img) return 0; } else { - if (THB_SOURCE_IMAGE == source) { - BLI_getwdN(wdir); - if(chdir(dir) != 0) return 0; - img = IMB_loadiffname(file, IB_rect | IB_imginfo); + if (THB_SOURCE_IMAGE == source || THB_SOURCE_BLEND == source) { + + /* only load if we didnt give an image */ + if(img==NULL) { + if(THB_SOURCE_BLEND == source) { + img = IMB_loadblend_thumb(path); + } + else { + img = IMB_loadiffname(path, IB_rect | IB_metadata); + } + } + if (img != NULL) { - stat(file, &info); + stat(path, &info); sprintf(mtime, "%ld", info.st_mtime); sprintf(cwidth, "%d", img->x); sprintf(cheight, "%d", img->y); } - if(chdir(wdir) != 0) /* unlikely to happen, just silence warning */; } else if (THB_SOURCE_MOVIE == source) { struct anim * anim = NULL; - BLI_getwdN(wdir); - if(chdir(dir) != 0) return 0; - anim = IMB_open_anim(file, IB_rect | IB_imginfo); + anim = IMB_open_anim(path, IB_rect | IB_metadata); if (anim != NULL) { img = IMB_anim_absolute(anim, 0); if (img == NULL) { - printf("not an anim; %s\n", file); + printf("not an anim; %s\n", path); } else { IMB_freeImBuf(img); img = IMB_anim_previewframe(anim); } IMB_free_anim(anim); } - stat(file, &info); + stat(path, &info); sprintf(mtime, "%ld", info.st_mtime); - if(chdir(wdir) != 0) /* unlikely to happen, just silence warning */; } if (!img) return 0; @@ -333,20 +334,20 @@ ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, Thumb IMB_scaleImBuf(img, ex, ey); } sprintf(desc, "Thumbnail for %s", uri); - IMB_imginfo_change_field(img, "Description", desc); - IMB_imginfo_change_field(img, "Software", "Blender"); - IMB_imginfo_change_field(img, "Thumb::URI", uri); - IMB_imginfo_change_field(img, "Thumb::MTime", mtime); + IMB_metadata_change_field(img, "Description", desc); + IMB_metadata_change_field(img, "Software", "Blender"); + IMB_metadata_change_field(img, "Thumb::URI", uri); + IMB_metadata_change_field(img, "Thumb::MTime", mtime); if (THB_SOURCE_IMAGE == source) { - IMB_imginfo_change_field(img, "Thumb::Image::Width", cwidth); - IMB_imginfo_change_field(img, "Thumb::Image::Height", cheight); + IMB_metadata_change_field(img, "Thumb::Image::Width", cwidth); + IMB_metadata_change_field(img, "Thumb::Image::Height", cheight); } img->ftype = PNG; img->depth = 32; - if (IMB_saveiff(img, temp, IB_rect | IB_imginfo)) { + if (IMB_saveiff(img, temp, IB_rect | IB_metadata)) { #ifndef WIN32 chmod(temp, S_IRUSR | S_IWUSR); -#endif +#endif BLI_rename(temp, tpath); } @@ -356,33 +357,33 @@ ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, Thumb } /* read thumbnail for file and returns new imbuf for thumbnail */ -ImBuf* IMB_thumb_read(const char* dir, const char* file, ThumbSize size) +ImBuf* IMB_thumb_read(const char* path, ThumbSize size) { char thumb[FILE_MAX]; char uri[FILE_MAX*3+8]; ImBuf *img = 0; - if (!uri_from_filename(dir, file,uri)) { + if (!uri_from_filename(path,uri)) { return NULL; } if (thumbpath_from_uri(uri, thumb, size)) { - img = IMB_loadiffname(thumb, IB_rect | IB_imginfo); + img = IMB_loadiffname(thumb, IB_rect | IB_metadata); } return img; } /* delete all thumbs for the file */ -void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size) +void IMB_thumb_delete(const char* path, ThumbSize size) { char thumb[FILE_MAX]; char uri[FILE_MAX*3+8]; - if (!uri_from_filename(dir, file,uri)) { + if (!uri_from_filename(path ,uri)) { return; } if (thumbpath_from_uri(uri, thumb, size)) { - if (strncmp(thumb, dir, strlen(dir)) == 0) { + if (strncmp(path, thumb, strlen(thumb)) == 0) { return; } if (BLI_exists(thumb)) { @@ -393,19 +394,17 @@ void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size) /* create the thumb if necessary and manage failed and old thumbs */ -ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, ThumbSource source) +ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source) { - char path[FILE_MAX]; char thumb[FILE_MAX]; char uri[FILE_MAX*3+8]; struct stat st; ImBuf* img = NULL; - - BLI_join_dirfile(path, dir, file); + if (stat(path, &st)) { return NULL; } - if (!uri_from_filename(dir, file,uri)) { + if (!uri_from_filename(path,uri)) { return NULL; } if (thumbpath_from_uri(uri, thumb, THB_FAIL)) { @@ -416,13 +415,13 @@ ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, Thumb } if (thumbpath_from_uri(uri, thumb, size)) { - if (strncmp(thumb, dir, strlen(dir)) == 0) { + if (strncmp(path, thumb, strlen(thumb)) == 0) { img = IMB_loadiffname(path, IB_rect); } else { - img = IMB_loadiffname(thumb, IB_rect | IB_imginfo); + img = IMB_loadiffname(thumb, IB_rect | IB_metadata); if (img) { char mtime[40]; - if (!IMB_imginfo_get_field(img, "Thumb::MTime", mtime, 40)) { + if (!IMB_metadata_get_field(img, "Thumb::MTime", mtime, 40)) { /* illegal thumb, forget it! */ IMB_freeImBuf(img); img = 0; @@ -432,13 +431,13 @@ ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, Thumb /* recreate all thumbs */ IMB_freeImBuf(img); img = 0; - IMB_thumb_delete(dir, file, THB_NORMAL); - IMB_thumb_delete(dir, file, THB_LARGE); - IMB_thumb_delete(dir, file, THB_FAIL); - img = IMB_thumb_create(dir, file, size, source); + IMB_thumb_delete(path, THB_NORMAL); + IMB_thumb_delete(path, THB_LARGE); + IMB_thumb_delete(path, THB_FAIL); + img = IMB_thumb_create(path, size, source, NULL); if(!img){ /* thumb creation failed, write fail thumb */ - img = IMB_thumb_create(dir, file, THB_FAIL, source); + img = IMB_thumb_create(path, THB_FAIL, source, NULL); if (img) { /* we don't need failed thumb anymore */ IMB_freeImBuf(img); @@ -448,10 +447,10 @@ ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, Thumb } } } else { - img = IMB_thumb_create(dir, file, size, source); + img = IMB_thumb_create(path, size, source, NULL); if(!img){ /* thumb creation failed, write fail thumb */ - img = IMB_thumb_create(dir, file, THB_FAIL, source); + img = IMB_thumb_create(path, THB_FAIL, source, NULL); if (img) { /* we don't need failed thumb anymore */ IMB_freeImBuf(img); diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c new file mode 100644 index 00000000000..7f1c903e9de --- /dev/null +++ b/source/blender/imbuf/intern/thumbs_blend.c @@ -0,0 +1,208 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include + +#include "zlib.h" + +#include "BKE_utildefines.h" +#include "BKE_global.h" + +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" +#include "IMB_thumbs.h" + +#include "MEM_guardedalloc.h" + +/* extracts the thumbnail from between the 'REND' and the 'GLOB' + * chunks of the header, dont use typical blend loader because its too slow */ + +static ImBuf *loadblend_thumb(gzFile gzfile) +{ + char buf[8]; + int code= 0; + char endian, pointer_size; + char endian_switch; + int len, im_len, x, y; + ImBuf *img= NULL; + + + /* read the blend file header */ + if(gzread(gzfile, buf, 8) != 8) + return NULL; + if(strncmp(buf, "BLENDER", 7)) + return NULL; + + if(buf[7]=='-') + pointer_size= 8; + else if(buf[7]=='_') + pointer_size= 4; + else + return NULL; + + /* read the next 4 bytes, only need the first char, ignore the version */ + /* endian and vertsion (ignored) */ + if(gzread(gzfile, buf, 4) != 4) + return NULL; + + if(buf[0]=='V') + endian= B_ENDIAN; /* big: PPC */ + else if(buf[0]=='v') + endian= L_ENDIAN; /* little: x86 */ + else + return NULL; + + while(gzread(gzfile, &code, sizeof(int)) == sizeof(int)) { + endian_switch = ((ENDIAN_ORDER != endian)) ? 1 : 0; + + if(gzread(gzfile, buf, sizeof(int)) != sizeof(int)) + return NULL; + + len = *( (int *)((void *)buf) ); + + if(endian_switch) + SWITCH_INT(len); + + /* finally read the rest of the bhead struct, pointer and 2 ints */ + if(gzread(gzfile, buf, pointer_size) != pointer_size) + return NULL; + if(gzread(gzfile, buf, sizeof(int) * 2) != sizeof(int) * 2) + return NULL; + + /* we dont actually care whats in the bhead */ + if (code==REND) { + gzseek(gzfile, len, SEEK_CUR); /* skip to the next */ + } + else { + break; + } + } + + /* using 'TEST' since new names segfault when loading in old blenders */ + if(code != TEST) + return NULL; + + if(gzread(gzfile, &x, sizeof(int)) != sizeof(int)) + return NULL; + if(gzread(gzfile, &y, sizeof(int)) != sizeof(int)) + return NULL; + + len -= sizeof(int) * 2; + + if(endian_switch) { + SWITCH_INT(x); + SWITCH_INT(y); + } + + /* inconsistant image size, quit early */ + im_len = x * y * sizeof(int); + if(im_len != len) + return NULL; + + /* finally malloc and read the data */ + img= IMB_allocImBuf(x, y, 32, IB_rect | IB_metadata, 0); + + if(gzread(gzfile, img->rect, len) != len) { + IMB_freeImBuf(img); + img= NULL; + } + + return img; +} + +ImBuf *IMB_loadblend_thumb(const char *path) +{ + gzFile gzfile; + + /* not necessarily a gzip */ + gzfile = gzopen(path, "rb"); + + if (NULL == gzfile ) { + return NULL; + } + else { + ImBuf *img= loadblend_thumb(gzfile); + + /* read ok! */ + gzclose(gzfile); + + return img; + } +} + +/* add a fake passepartout overlay to a byte buffer, use for blend file thumbnails */ +#define MARGIN 2 + +void IMB_overlayblend_thumb(unsigned int *thumb, int width, int height, float aspect) +{ + unsigned char *px= (unsigned char *)thumb; + int margin_l = MARGIN; + int margin_b = MARGIN; + int margin_r = width - MARGIN; + int margin_t = height - MARGIN; + + if(aspect < 1.0f) { + margin_l= (int)((width - ((float)width * aspect)) / 2.0f); + margin_l += MARGIN; + CLAMP(margin_l, MARGIN, (width/2)); + margin_r = width - margin_l; + } + else if (aspect > 1.0f) { + margin_b= (int)((height - ((float)height / aspect)) / 2.0f); + margin_b += MARGIN; + CLAMP(margin_b, MARGIN, (height/2)); + margin_t = height - margin_b; + } + + { + int x, y; + int hline, vline; + int stride_x= (margin_r - margin_l) - 2; + + for(y=0; y < height; y++) { + for(x=0; x < width; x++, px+=4) { + if((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) { + /* interior. skip */ + x += stride_x; + px += stride_x * 4; + } else if( (hline=(((x == margin_l || x == margin_r)) && y >= margin_b && y <= margin_t)) || + (vline=(((y == margin_b || y == margin_t)) && x >= margin_l && x <= margin_r)) + ) { + /* dashed line */ + if((hline && y % 2) || (vline && x % 2)) { + px[0]= px[1]= px[2]= 0; + px[3] = 255; + } + } + else { + /* outside, fill in alpha, like passepartout */ + px[0] *= 0.5f; + px[1] *= 0.5f; + px[2] *= 0.5f; + px[3] = (px[3] * 0.5f) + 96; + } + } + } + } +} diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 7ee31ff7d9a..99f74fea640 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -40,21 +40,26 @@ * used to compress images. */ +#ifdef WITH_TIFF + #include #include "imbuf.h" -#include "imbuf_patch.h" - + #include "BKE_global.h" +#include "BKE_utildefines.h" + +#include "BLI_math.h" +#include "BLI_string.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" #include "IMB_allocimbuf.h" -#include "IMB_cmap.h" -#include "IMB_tiff.h" +#include "IMB_filetype.h" +#include "IMB_filter.h" -#include "dynlibtiff.h" +#include "tiffio.h" @@ -62,22 +67,22 @@ * Local declarations. * ***********************/ /* Reading and writing of an in-memory TIFF file. */ -tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n); -tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n); -toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence); -int imb_tiff_CloseProc(thandle_t handle); -toff_t imb_tiff_SizeProc(thandle_t handle); -int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize); -void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size); +static tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n); +static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n); +static toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence); +static int imb_tiff_CloseProc(thandle_t handle); +static toff_t imb_tiff_SizeProc(thandle_t handle); +static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize); +static void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size); /* Structure for in-memory TIFF file. */ -struct ImbTIFFMemFile { +typedef struct ImbTIFFMemFile { unsigned char *mem; /* Location of first byte of TIFF file. */ toff_t offset; /* Current offset within the file. */ tsize_t size; /* Size of the TIFF file. */ -}; -#define IMB_TIFF_GET_MEMFILE(x) ((struct ImbTIFFMemFile*)(x)); +} ImbTIFFMemFile; +#define IMB_TIFF_GET_MEMFILE(x) ((ImbTIFFMemFile*)(x)); @@ -86,13 +91,13 @@ struct ImbTIFFMemFile { *****************************/ -void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size) +static void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size) { } -int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { - return (0); + return (0); } /** @@ -105,31 +110,31 @@ int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) * @return: Number of bytes actually read. * 0 = EOF. */ -tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n) +static tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n) { tsize_t nRemaining, nCopy; - struct ImbTIFFMemFile* mfile; + ImbTIFFMemFile* mfile; void *srcAddr; /* get the pointer to the in-memory file */ mfile = IMB_TIFF_GET_MEMFILE(handle); - if (!mfile || !mfile->mem) { + if(!mfile || !mfile->mem) { fprintf(stderr, "imb_tiff_ReadProc: !mfile || !mfile->mem!\n"); return 0; } /* find the actual number of bytes to read (copy) */ nCopy = n; - if ((tsize_t)mfile->offset >= mfile->size) + if((tsize_t)mfile->offset >= mfile->size) nRemaining = 0; else nRemaining = mfile->size - mfile->offset; - if (nCopy > nRemaining) + if(nCopy > nRemaining) nCopy = nRemaining; /* on EOF, return immediately and read (copy) nothing */ - if (nCopy <= 0) + if(nCopy <= 0) return (0); /* all set -> do the read (copy) */ @@ -147,7 +152,7 @@ tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n) * NOTE: The current Blender implementation should not need this function. It * is simply a stub. */ -tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n) +static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n) { printf("imb_tiff_WriteProc: this function should not be called.\n"); return (-1); @@ -169,14 +174,14 @@ tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n) * @return: Resulting offset location within the file, measured in bytes from * the beginning of the file. (-1) indicates an error. */ -toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence) +static toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence) { - struct ImbTIFFMemFile *mfile; + ImbTIFFMemFile *mfile; toff_t new_offset; /* get the pointer to the in-memory file */ mfile = IMB_TIFF_GET_MEMFILE(handle); - if (!mfile || !mfile->mem) { + if(!mfile || !mfile->mem) { fprintf(stderr, "imb_tiff_SeekProc: !mfile || !mfile->mem!\n"); return (-1); } @@ -216,13 +221,13 @@ toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence) * * @return: 0 */ -int imb_tiff_CloseProc(thandle_t handle) +static int imb_tiff_CloseProc(thandle_t handle) { - struct ImbTIFFMemFile *mfile; + ImbTIFFMemFile *mfile; /* get the pointer to the in-memory file */ mfile = IMB_TIFF_GET_MEMFILE(handle); - if (!mfile || !mfile->mem) { + if(!mfile || !mfile->mem) { fprintf(stderr,"imb_tiff_CloseProc: !mfile || !mfile->mem!\n"); return (0); } @@ -242,13 +247,13 @@ int imb_tiff_CloseProc(thandle_t handle) * * @return: Size of file (in bytes). */ -toff_t imb_tiff_SizeProc(thandle_t handle) +static toff_t imb_tiff_SizeProc(thandle_t handle) { - struct ImbTIFFMemFile* mfile; + ImbTIFFMemFile* mfile; /* get the pointer to the in-memory file */ mfile = IMB_TIFF_GET_MEMFILE(handle); - if (!mfile || !mfile->mem) { + if(!mfile || !mfile->mem) { fprintf(stderr,"imb_tiff_SizeProc: !mfile || !mfile->mem!\n"); return (0); } @@ -257,14 +262,23 @@ toff_t imb_tiff_SizeProc(thandle_t handle) return (toff_t)(mfile->size); } +static TIFF *imb_tiff_client_open(ImbTIFFMemFile *memFile, unsigned char *mem, int size) +{ + /* open the TIFF client layer interface to the in-memory file */ + memFile->mem = mem; + memFile->offset = 0; + memFile->size = size; + return TIFFClientOpen("(Blender TIFF Interface Layer)", + "r", (thandle_t)(memFile), + imb_tiff_ReadProc, imb_tiff_WriteProc, + imb_tiff_SeekProc, imb_tiff_CloseProc, + imb_tiff_SizeProc, imb_tiff_DummyMapProc, imb_tiff_DummyUnmapProc); +} /** * Checks whether a given memory buffer contains a TIFF file. * - * FIXME: Possible memory leak if mem is less than IMB_TIFF_NCB bytes long. - * However, changing this will require up-stream modifications. - * * This method uses the format identifiers from: * http://www.faqs.org/faqs/graphics/fileformats-faq/part4/section-9.html * The first four bytes of big-endian and little-endian TIFF files @@ -278,7 +292,7 @@ toff_t imb_tiff_SizeProc(thandle_t handle) * hence my manual comparison. - Jonathan Merritt (lancelet) 4th Sept 2005. */ #define IMB_TIFF_NCB 4 /* number of comparison bytes used */ -int imb_is_a_tiff(void *mem) +int imb_is_a_tiff(unsigned char *mem) { char big_endian[IMB_TIFF_NCB] = { 0x4d, 0x4d, 0x00, 0x2a }; char lil_endian[IMB_TIFF_NCB] = { 0x49, 0x49, 0x2a, 0x00 }; @@ -287,14 +301,222 @@ int imb_is_a_tiff(void *mem) (memcmp(lil_endian, mem, IMB_TIFF_NCB) == 0) ); } +static void scanline_contig_8bit(unsigned char *rect, unsigned char *cbuf, int scanline_w, int spp) +{ + int i; + for (i=0; i < scanline_w; i++) { + rect[i*4 + 0] = cbuf[i*spp + 0]; + rect[i*4 + 1] = cbuf[i*spp + 1]; + rect[i*4 + 2] = cbuf[i*spp + 2]; + rect[i*4 + 3] = (spp==4)?cbuf[i*spp + 3]:255; + } +} +static void scanline_contig_16bit(float *rectf, unsigned short *sbuf, int scanline_w, int spp) +{ + int i; + for (i=0; i < scanline_w; i++) { + rectf[i*4 + 0] = sbuf[i*spp + 0] / 65535.0; + rectf[i*4 + 1] = sbuf[i*spp + 1] / 65535.0; + rectf[i*4 + 2] = sbuf[i*spp + 2] / 65535.0; + rectf[i*4 + 3] = (spp==4)?(sbuf[i*spp + 3] / 65535.0):1.0; + } +} + +static void scanline_contig_32bit(float *rectf, float *fbuf, int scanline_w, int spp) +{ + int i; + for (i=0; i < scanline_w; i++) { + rectf[i*4 + 0] = fbuf[i*spp + 0]; + rectf[i*4 + 1] = fbuf[i*spp + 1]; + rectf[i*4 + 2] = fbuf[i*spp + 2]; + rectf[i*4 + 3] = (spp==4)?fbuf[i*spp + 3]:1.0; + } +} + +static void scanline_separate_8bit(unsigned char *rect, unsigned char *cbuf, int scanline_w, int chan) +{ + int i; + for (i=0; i < scanline_w; i++) + rect[i*4 + chan] = cbuf[i]; +} + +static void scanline_separate_16bit(float *rectf, unsigned short *sbuf, int scanline_w, int chan) +{ + int i; + for (i=0; i < scanline_w; i++) + rectf[i*4 + chan] = sbuf[i] / 65535.0; +} + +static void scanline_separate_32bit(float *rectf, float *fbuf, int scanline_w, int chan) +{ + int i; + for (i=0; i < scanline_w; i++) + rectf[i*4 + chan] = fbuf[i]; +} + + +#if 0 +/* + * Use the libTIFF RGBAImage API to read a TIFF image. + * This function uses the "RGBA Image" support from libtiff, which enables + * it to load most commonly-encountered TIFF formats. libtiff handles format + * conversion, color depth conversion, etc. + */ +static int imb_read_tiff_pixels_rgba(ImBuf *ibuf, TIFF *image, int premul) +{ + ImBuf *tmpibuf; + int success; + + tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rect, 0); + success= TIFFReadRGBAImage(image, ibuf->x, ibuf->y, tmpibuf->rect, 0); + + if(ENDIAN_ORDER == B_ENDIAN) + IMB_convert_rgba_to_abgr(tmpibuf); + if(premul) { + IMB_premultiply_alpha(tmpibuf); + ibuf->flags |= IB_premul; + } + + /* assign rect last */ + ibuf->rect= tmpibuf->rect; + ibuf->mall |= IB_rect; + ibuf->flags |= IB_rect; + + tmpibuf->mall &= ~IB_rect; + IMB_freeImBuf(tmpibuf); + + return success; +} +#endif + +/* + * Use the libTIFF scanline API to read a TIFF image. + * This method is most flexible and can handle multiple different bit depths + * and RGB channel orderings. + */ +static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul) +{ + ImBuf *tmpibuf; + int success; + short bitspersample, spp, config; + size_t scanline; + int ib_flag=0, row, chan; + float *fbuf=NULL; + unsigned short *sbuf=NULL; + unsigned char *cbuf=NULL; + + TIFFGetField(image, TIFFTAG_BITSPERSAMPLE, &bitspersample); + TIFFGetField(image, TIFFTAG_SAMPLESPERPIXEL, &spp); /* number of 'channels' */ + TIFFGetField(image, TIFFTAG_PLANARCONFIG, &config); + scanline = TIFFScanlineSize(image); + + if (bitspersample == 32) { + ib_flag = IB_rectfloat; + fbuf = (float *)_TIFFmalloc(scanline); + } else if (bitspersample == 16) { + ib_flag = IB_rectfloat; + sbuf = (unsigned short *)_TIFFmalloc(scanline); + } else if (bitspersample == 8) { + ib_flag = IB_rect; + cbuf = (unsigned char *)_TIFFmalloc(scanline); + } + + tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag, 0); + + /* contiguous channels: RGBRGBRGB */ + if (config == PLANARCONFIG_CONTIG) { + for (row = 0; row < ibuf->y; row++) { + int ib_offset = ibuf->x*ibuf->y*4 - ibuf->x*4 * (row+1); + + if (bitspersample == 32) { + success = TIFFReadScanline(image, fbuf, row, 0); + scanline_contig_32bit(tmpibuf->rect_float+ib_offset, fbuf, ibuf->x, spp); + + } else if (bitspersample == 16) { + success = TIFFReadScanline(image, sbuf, row, 0); + scanline_contig_16bit(tmpibuf->rect_float+ib_offset, sbuf, ibuf->x, spp); + + } else if (bitspersample == 8) { + unsigned char *crect = (unsigned char*)tmpibuf->rect; + success = TIFFReadScanline(image, cbuf, row, 0); + scanline_contig_8bit(crect+ib_offset, cbuf, ibuf->x, spp); + } + } + /* separate channels: RRRGGGBBB */ + } else if (config == PLANARCONFIG_SEPARATE) { + + /* imbufs always have 4 channels of data, so we iterate over all of them + * but only fill in from the TIFF scanline where necessary. */ + for (chan = 0; chan < 4; chan++) { + for (row = 0; row < ibuf->y; row++) { + int ib_offset = ibuf->x*ibuf->y*4 - ibuf->x*4 * (row+1); + + if (bitspersample == 32) { + if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */ + memset(fbuf, 1.0, sizeof(fbuf)); + else + success = TIFFReadScanline(image, fbuf, row, chan); + scanline_separate_32bit(tmpibuf->rect_float+ib_offset, fbuf, ibuf->x, chan); + + } else if (bitspersample == 16) { + if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */ + memset(sbuf, 65535, sizeof(sbuf)); + else + success = TIFFReadScanline(image, sbuf, row, chan); + scanline_separate_16bit(tmpibuf->rect_float+ib_offset, sbuf, ibuf->x, chan); + + } else if (bitspersample == 8) { + unsigned char *crect = (unsigned char*)tmpibuf->rect; + if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */ + memset(cbuf, 255, sizeof(cbuf)); + else + success = TIFFReadScanline(image, cbuf, row, chan); + scanline_separate_8bit(crect+ib_offset, cbuf, ibuf->x, chan); + } + } + } + } + + ibuf->profile = (bitspersample==32)?IB_PROFILE_LINEAR_RGB:IB_PROFILE_SRGB; + + if (bitspersample == 32) + _TIFFfree(fbuf); + else if (bitspersample == 16) + _TIFFfree(sbuf); + else if (bitspersample == 8) + _TIFFfree(cbuf); + + if(ENDIAN_ORDER == B_ENDIAN) + IMB_convert_rgba_to_abgr(tmpibuf); + if(premul) { + IMB_premultiply_alpha(tmpibuf); + ibuf->flags |= IB_premul; + } + + /* assign rect last */ + if (tmpibuf->rect_float) + ibuf->rect_float= tmpibuf->rect_float; + else + ibuf->rect= tmpibuf->rect; + ibuf->mall |= ib_flag; + ibuf->flags |= ib_flag; + + tmpibuf->mall &= ~ib_flag; + IMB_freeImBuf(tmpibuf); + + return success; +} + +void imb_inittiff(void) +{ + if (!(G.f & G_DEBUG)) + TIFFSetErrorHandler(NULL); +} /** * Loads a TIFF file. * - * This function uses the "RGBA Image" support from libtiff, which enables - * it to load most commonly-encountered TIFF formats. libtiff handles format - * conversion, color depth conversion, etc. * * @param mem: Memory containing the TIFF file. * @param size: Size of the mem buffer. @@ -303,118 +525,155 @@ int imb_is_a_tiff(void *mem) * * @return: A newly allocated ImBuf structure if successful, otherwise NULL. */ -struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) +ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) { TIFF *image = NULL; - struct ImBuf *ibuf = NULL; - struct ImbTIFFMemFile memFile; + ImBuf *ibuf = NULL, *hbuf; + ImbTIFFMemFile memFile; uint32 width, height; - int bytesperpixel, bitspersample; - int success; - unsigned int pixel_i, byte_i; - uint32 *raster = NULL; - uint32 pixel; - unsigned char *to = NULL; - - memFile.mem = mem; - memFile.offset = 0; - memFile.size = size; + char *format = NULL; + int level; + short spp; + int ib_depth; /* check whether or not we have a TIFF file */ - if (size < IMB_TIFF_NCB) { + if(size < IMB_TIFF_NCB) { fprintf(stderr, "imb_loadtiff: size < IMB_TIFF_NCB\n"); return NULL; } - if (imb_is_a_tiff(mem) == 0) + if(imb_is_a_tiff(mem) == 0) return NULL; - /* open the TIFF client layer interface to the in-memory file */ - image = libtiff_TIFFClientOpen("(Blender TIFF Interface Layer)", - "r", (thandle_t)(&memFile), - imb_tiff_ReadProc, imb_tiff_WriteProc, - imb_tiff_SeekProc, imb_tiff_CloseProc, - imb_tiff_SizeProc, imb_tiff_DummyMapProc, imb_tiff_DummyUnmapProc); - if (image == NULL) { + image = imb_tiff_client_open(&memFile, mem, size); + + if(image == NULL) { printf("imb_loadtiff: could not open TIFF IO layer.\n"); return NULL; } /* allocate the image buffer */ - bytesperpixel = 4; /* 1 byte per channel, 4 channels */ - libtiff_TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); - libtiff_TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); - libtiff_TIFFGetField(image, TIFFTAG_BITSPERSAMPLE, &bitspersample); - ibuf = IMB_allocImBuf(width, height, 8*bytesperpixel, 0, 0); - if (ibuf) { + TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); + TIFFGetField(image, TIFFTAG_SAMPLESPERPIXEL, &spp); + + ib_depth = (spp==3)?24:32; + + ibuf = IMB_allocImBuf(width, height, ib_depth, 0, 0); + if(ibuf) { ibuf->ftype = TIF; - ibuf->profile = IB_PROFILE_SRGB; - } else { + } + else { fprintf(stderr, "imb_loadtiff: could not allocate memory for TIFF " \ "image.\n"); - libtiff_TIFFClose(image); + TIFFClose(image); return NULL; } - /* read in the image data */ - if (!(flags & IB_test)) { + /* if testing, we're done */ + if(flags & IB_test) { + TIFFClose(image); + return ibuf; + } - /* allocate memory for the ibuf->rect */ - imb_addrectImBuf(ibuf); + /* detect if we are reading a tiled/mipmapped texture, in that case + we don't read pixels but leave it to the cache to load tiles */ + if(flags & IB_tilecache) { + format= NULL; + TIFFGetField(image, TIFFTAG_PIXAR_TEXTUREFORMAT, &format); - /* perform actual read */ - raster = (uint32*)libtiff__TIFFmalloc( - width*height * sizeof(uint32)); - if (raster == NULL) { - libtiff_TIFFClose(image); - return NULL; - } - success = libtiff_TIFFReadRGBAImage( - image, width, height, raster, 0); - if (!success) { - fprintf(stderr, - "imb_loadtiff: This TIFF format is not " - "currently supported by Blender.\n"); - libtiff__TIFFfree(raster); - libtiff_TIFFClose(image); - return NULL; - } + if(format && strcmp(format, "Plain Texture")==0 && TIFFIsTiled(image)) { + int numlevel = TIFFNumberOfDirectories(image); - /* copy raster to ibuf->rect; we do a fast copy if possible, - * otherwise revert to a slower component-wise copy */ - if (sizeof(unsigned int) == sizeof(uint32)) { - memcpy(ibuf->rect, raster, - width*height*sizeof(uint32)); - } else { - /* this may not be entirely necessary, but is put here - * in case sizeof(unsigned int) is not a 32-bit - * quantity */ - fprintf(stderr, - "imb_loadtiff: using (slower) component-wise " - "buffer copy.\n"); - to = (unsigned char*)ibuf->rect; - for (pixel_i=0; pixel_i < width*height; pixel_i++) - { - byte_i = sizeof(unsigned int)*pixel_i; - pixel = raster[pixel_i]; - - to[byte_i++] = (unsigned char)TIFFGetR(pixel); - to[byte_i++] = (unsigned char)TIFFGetG(pixel); - to[byte_i++] = (unsigned char)TIFFGetB(pixel); - to[byte_i++] = (unsigned char)TIFFGetA(pixel); + /* create empty mipmap levels in advance */ + for(level=0; level 0) { + width= (width > 1)? width/2: 1; + height= (height > 1)? height/2: 1; + + hbuf= IMB_allocImBuf(width, height, 32, 0, 0); + hbuf->miplevel= level; + hbuf->ftype= ibuf->ftype; + ibuf->mipmap[level-1] = hbuf; + + if(flags & IB_premul) + hbuf->flags |= IB_premul; + } + else + hbuf= ibuf; + + hbuf->flags |= IB_tilecache; + + TIFFGetField(image, TIFFTAG_TILEWIDTH, &hbuf->tilex); + TIFFGetField(image, TIFFTAG_TILELENGTH, &hbuf->tiley); + + hbuf->xtiles= ceil(hbuf->x/(float)hbuf->tilex); + hbuf->ytiles= ceil(hbuf->y/(float)hbuf->tiley); + + imb_addtilesImBuf(hbuf); + + ibuf->miptot++; } } + } - libtiff__TIFFfree(raster); + /* read pixels */ + if(!(ibuf->flags & IB_tilecache) && !imb_read_tiff_pixels(ibuf, image, 0)) { + fprintf(stderr, "imb_loadtiff: Failed to read tiff image.\n"); + TIFFClose(image); + return NULL; } /* close the client layer interface to the in-memory file */ - libtiff_TIFFClose(image); - - if (ENDIAN_ORDER == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf); + TIFFClose(image); /* return successfully */ - return (ibuf); + return ibuf; +} + +void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty, unsigned int *rect) +{ + TIFF *image = NULL; + uint32 width, height; + ImbTIFFMemFile memFile; + + image = imb_tiff_client_open(&memFile, mem, size); + + if(image == NULL) { + printf("imb_loadtiff: could not open TIFF IO layer for loading mipmap level.\n"); + return; + } + + if(TIFFSetDirectory(image, ibuf->miplevel)) { + /* allocate the image buffer */ + TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); + + if(width == ibuf->x && height == ibuf->y) { + if(rect) { + /* tiff pixels are bottom to top, tiles are top to bottom */ + if(TIFFReadRGBATile(image, tx*ibuf->tilex, (ibuf->ytiles - 1 - ty)*ibuf->tiley, rect) == 1) { + if(ibuf->tiley > ibuf->y) + memmove(rect, rect+ibuf->tilex*(ibuf->tiley - ibuf->y), sizeof(int)*ibuf->tilex*ibuf->y); + + if(ibuf->flags & IB_premul) + IMB_premultiply_rect(rect, 32, ibuf->tilex, ibuf->tiley); + } + else + printf("imb_loadtiff: failed to read tiff tile at mipmap level %d\n", ibuf->miplevel); + } + } + else + printf("imb_loadtiff: mipmap level %d has unexpected size %dx%d instead of %dx%d\n", ibuf->miplevel, width, height, ibuf->x, ibuf->y); + } + else + printf("imb_loadtiff: could not find mipmap level %d\n", ibuf->miplevel); + + /* close the client layer interface to the in-memory file */ + TIFFClose(image); } /** @@ -433,9 +692,7 @@ struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) * @return: 1 if the function is successful, 0 on failure. */ -#define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f)) - -short imb_savetiff(struct ImBuf *ibuf, char *name, int flags) +int imb_savetiff(ImBuf *ibuf, char *name, int flags) { TIFF *image = NULL; uint16 samplesperpixel, bitspersample; @@ -446,12 +703,13 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags) float *fromf = NULL; int x, y, from_i, to_i, i; int extraSampleTypes[1] = { EXTRASAMPLE_ASSOCALPHA }; + /* check for a valid number of bytes per pixel. Like the PNG writer, * the TIFF writer supports 1, 3 or 4 bytes per pixel, corresponding * to gray, RGB, RGBA respectively. */ samplesperpixel = (uint16)((ibuf->depth + 7) >> 3); - if ((samplesperpixel > 4) || (samplesperpixel == 2)) { + if((samplesperpixel > 4) || (samplesperpixel == 2)) { fprintf(stderr, "imb_savetiff: unsupported number of bytes per " "pixel: %d\n", samplesperpixel); @@ -464,17 +722,18 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags) bitspersample = 8; /* open TIFF file for writing */ - if (flags & IB_mem) { + if(flags & IB_mem) { /* bork at the creation of a TIFF in memory */ fprintf(stderr, "imb_savetiff: creation of in-memory TIFF files is " "not yet supported.\n"); return (0); - } else { - /* create image as a file */ - image = libtiff_TIFFOpen(name, "w"); } - if (image == NULL) { + else { + /* create image as a file */ + image = TIFFOpen(name, "w"); + } + if(image == NULL) { fprintf(stderr, "imb_savetiff: could not open TIFF for writing.\n"); return (0); @@ -483,16 +742,16 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags) /* allocate array for pixel data */ npixels = ibuf->x * ibuf->y; if(bitspersample == 16) - pixels16 = (unsigned short*)libtiff__TIFFmalloc(npixels * + pixels16 = (unsigned short*)_TIFFmalloc(npixels * samplesperpixel * sizeof(unsigned short)); else - pixels = (unsigned char*)libtiff__TIFFmalloc(npixels * + pixels = (unsigned char*)_TIFFmalloc(npixels * samplesperpixel * sizeof(unsigned char)); - if (pixels == NULL && pixels16 == NULL) { + if(pixels == NULL && pixels16 == NULL) { fprintf(stderr, "imb_savetiff: could not allocate pixels array.\n"); - libtiff_TIFFClose(image); + TIFFClose(image); return (0); } @@ -507,69 +766,85 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags) } /* setup samples per pixel */ - libtiff_TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, bitspersample); - libtiff_TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); + TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, bitspersample); + TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); if(samplesperpixel == 4) { /* RGBA images */ - libtiff_TIFFSetField(image, TIFFTAG_EXTRASAMPLES, 1, + TIFFSetField(image, TIFFTAG_EXTRASAMPLES, 1, extraSampleTypes); - libtiff_TIFFSetField(image, TIFFTAG_PHOTOMETRIC, + TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); } else if(samplesperpixel == 3) { /* RGB images */ - libtiff_TIFFSetField(image, TIFFTAG_PHOTOMETRIC, + TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); } else if(samplesperpixel == 1) { /* greyscale images, 1 channel */ - libtiff_TIFFSetField(image, TIFFTAG_PHOTOMETRIC, + TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); } /* copy pixel data. While copying, we flip the image vertically. */ - for (x = 0; x < ibuf->x; x++) { - for (y = 0; y < ibuf->y; y++) { + for(x = 0; x < ibuf->x; x++) { + for(y = 0; y < ibuf->y; y++) { from_i = 4*(y*ibuf->x+x); to_i = samplesperpixel*((ibuf->y-y-1)*ibuf->x+x); if(pixels16) { - for (i = 0; i < samplesperpixel; i++, to_i++, from_i++) - to16[to_i] = FTOUSHORT(fromf[from_i]); + /* convert from float source */ + float rgb[3]; + + if (ibuf->profile == IB_PROFILE_LINEAR_RGB) + linearrgb_to_srgb_v3_v3(rgb, &fromf[from_i]); + else + copy_v3_v3(rgb, &fromf[from_i]); + + to16[to_i+0] = FTOUSHORT(rgb[0]); + to16[to_i+1] = FTOUSHORT(rgb[1]); + to16[to_i+2] = FTOUSHORT(rgb[2]); + to_i += 3; from_i+=3; + + if (samplesperpixel == 4) { + to16[to_i+3] = FTOUSHORT(fromf[from_i+3]); + to_i++; from_i++; + } } else { - for (i = 0; i < samplesperpixel; i++, to_i++, from_i++) + for(i = 0; i < samplesperpixel; i++, to_i++, from_i++) to[to_i] = from[from_i]; } } } /* write the actual TIFF file */ - libtiff_TIFFSetField(image, TIFFTAG_IMAGEWIDTH, ibuf->x); - libtiff_TIFFSetField(image, TIFFTAG_IMAGELENGTH, ibuf->y); - libtiff_TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, ibuf->y); - libtiff_TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); - libtiff_TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); - libtiff_TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - libtiff_TIFFSetField(image, TIFFTAG_XRESOLUTION, 150.0); - libtiff_TIFFSetField(image, TIFFTAG_YRESOLUTION, 150.0); - libtiff_TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); - if (libtiff_TIFFWriteEncodedStrip(image, 0, + TIFFSetField(image, TIFFTAG_IMAGEWIDTH, ibuf->x); + TIFFSetField(image, TIFFTAG_IMAGELENGTH, ibuf->y); + TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, ibuf->y); + TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); + TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); + TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(image, TIFFTAG_XRESOLUTION, 150.0); + TIFFSetField(image, TIFFTAG_YRESOLUTION, 150.0); + TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); + if(TIFFWriteEncodedStrip(image, 0, (bitspersample == 16)? (unsigned char*)pixels16: pixels, ibuf->x*ibuf->y*samplesperpixel*bitspersample/8) == -1) { fprintf(stderr, "imb_savetiff: Could not write encoded TIFF.\n"); - libtiff_TIFFClose(image); - if(pixels) libtiff__TIFFfree(pixels); - if(pixels16) libtiff__TIFFfree(pixels16); + TIFFClose(image); + if(pixels) _TIFFfree(pixels); + if(pixels16) _TIFFfree(pixels16); return (1); } /* close the TIFF file */ - libtiff_TIFFClose(image); - if(pixels) libtiff__TIFFfree(pixels); - if(pixels16) libtiff__TIFFfree(pixels16); + TIFFClose(image); + if(pixels) _TIFFfree(pixels); + if(pixels16) _TIFFfree(pixels16); return (1); } +#endif /* WITH_TIFF */ \ No newline at end of file diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index 216f82fada5..e6f4e226caa 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -42,36 +42,16 @@ #include "BKE_global.h" #include "imbuf.h" -#include "imbuf_patch.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" - -#include "IMB_targa.h" -#include "IMB_png.h" - -#ifdef WITH_DDS -#include "dds/dds_api.h" -#endif - -#include "IMB_bmp.h" -#include "IMB_tiff.h" -#include "IMB_radiance_hdr.h" -#include "IMB_dpxcineon.h" +#include "IMB_filetype.h" #include "IMB_anim.h" -#ifdef WITH_OPENEXR -#include "openexr/openexr_api.h" -#endif - #ifdef WITH_QUICKTIME #include "quicktime_import.h" #endif -#ifdef WITH_OPENJPEG -#include "IMB_jp2.h" -#endif - #ifdef WITH_FFMPEG #include #include @@ -88,97 +68,56 @@ #define UTIL_DEBUG 0 -/* from misc_util: flip the bytes from x */ -#define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) - -/* this one is only def-ed once, strangely... */ -#define GSS(x) (((uchar *)(x))[1] << 8 | ((uchar *)(x))[0]) - static int IMB_ispic_name(char *name) { + ImFileType *type; struct stat st; int fp, buf[10]; - int ofs = 0; if(UTIL_DEBUG) printf("IMB_ispic_name: loading %s\n", name); - if (ib_stat(name,&st) == -1) return(0); - if (((st.st_mode) & S_IFMT) == S_IFREG){ - if ((fp = open(name,O_BINARY|O_RDONLY)) >= 0){ - if (read(fp,buf,32)==32){ - close(fp); - if (buf[ofs] == CAT) ofs += 3; - if (buf[ofs] == FORM){ - if (buf[ofs + 2] == ILBM) return(AMI); - if (buf[ofs + 2] == ANIM){ - if (buf[ofs + 3] == FORM){ - return(ANIM); - }else{ - return(Anim); - } - } - } else { - if (GS(buf) == IMAGIC) return(IMAGIC); - if (GSS(buf) == IMAGIC) return(IMAGIC); - if ((BIG_LONG(buf[0]) & 0xfffffff0) == 0xffd8ffe0) return(JPG); + if(stat(name,&st) == -1) + return FALSE; + if(((st.st_mode) & S_IFMT) != S_IFREG) + return FALSE; - /* at windows there are ".ffl" files with the same magic numnber... - besides that, tim images are not really important anymore! */ - /* if ((BIG_LONG(buf[0]) == 0x10000000) && ((BIG_LONG(buf[1]) & 0xf0ffffff) == 0)) return(TIM); */ + if((fp = open(name,O_BINARY|O_RDONLY)) < 0) + return FALSE; - } - if (imb_is_a_png(buf)) return(PNG); -#ifdef WITH_DDS - if (imb_is_a_dds((uchar *)buf)) return(DDS); -#endif - if (imb_is_a_targa(buf)) return(TGA); -#ifdef WITH_OPENEXR - if (imb_is_a_openexr((uchar *)buf)) return(OPENEXR); -#endif - if (imb_is_a_tiff(buf)) return(TIF); - if (imb_is_dpx(buf)) return (DPX); - if (imb_is_cineon(buf)) return(CINEON); - /* radhdr: check if hdr format */ - if (imb_is_a_hdr(buf)) return(RADHDR); - -/* - if (imb_is_a_bmp(buf)) return(BMP); -*/ - -#ifdef WITH_OPENJPEG - if (imb_is_a_jp2(buf)) return(JP2); -#endif - -#ifdef WITH_QUICKTIME -#if defined(_WIN32) || defined(__APPLE__) - if(G.have_quicktime) { - if (imb_is_a_quicktime(name)) return(QUICKTIME); - } -#endif -#endif - - return(FALSE); - } - close(fp); - } + if(read(fp, buf, 32) != 32) { + close(fp); + return FALSE; } - return(FALSE); + + close(fp); + + /* XXX move this exception */ + if((BIG_LONG(buf[0]) & 0xfffffff0) == 0xffd8ffe0) + return JPG; + + for(type=IMB_FILE_TYPES; type->is_a; type++) + if(type->is_a((uchar*)buf)) + return type->filetype; + + return FALSE; } - - int IMB_ispic(char *filename) { if(U.uiflag & USER_FILTERFILEEXTS) { - if (G.have_libtiff && (BLI_testextensie(filename, ".tif") - || BLI_testextensie(filename, ".tiff"))) { + if (BLI_testextensie(filename, ".tif") + || BLI_testextensie(filename, ".tiff") + || BLI_testextensie(filename, ".tx")) { return IMB_ispic_name(filename); } if (G.have_quicktime){ if( BLI_testextensie(filename, ".jpg") || BLI_testextensie(filename, ".jpeg") +#ifdef WITH_TIFF || BLI_testextensie(filename, ".tif") || BLI_testextensie(filename, ".tiff") + || BLI_testextensie(filename, ".tx") +#endif || BLI_testextensie(filename, ".hdr") || BLI_testextensie(filename, ".tga") || BLI_testextensie(filename, ".rgb") @@ -207,9 +146,14 @@ int IMB_ispic(char *filename) } else { return(FALSE); } - } else { /* no quicktime or libtiff */ + } else { /* no quicktime */ if( BLI_testextensie(filename, ".jpg") || BLI_testextensie(filename, ".jpeg") +#ifdef WITH_TIFF + || BLI_testextensie(filename, ".tif") + || BLI_testextensie(filename, ".tiff") + || BLI_testextensie(filename, ".tx") +#endif || BLI_testextensie(filename, ".hdr") || BLI_testextensie(filename, ".tga") || BLI_testextensie(filename, ".rgb") @@ -327,7 +271,7 @@ static int isffmpeg (char *filename) { if(UTIL_DEBUG) dump_format(pFormatCtx, 0, filename, 0); - /* Find the first video stream */ + /* Find the first video stream */ videoStream=-1; for(i=0; inb_streams; i++) if(pFormatCtx->streams[i] && @@ -345,7 +289,7 @@ static int isffmpeg (char *filename) { pCodecCtx = get_codec_from_stream(pFormatCtx->streams[videoStream]); - /* Find the decoder for the video stream */ + /* Find the decoder for the video stream */ pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) { av_close_input_file(pFormatCtx); @@ -391,14 +335,14 @@ int imb_get_anim_type(char * name) { /* stat test below fails on large files > 4GB */ if (isffmpeg(name)) return (ANIM_FFMPEG); # endif - if (ib_stat(name,&st) == -1) return(0); + if (stat(name,&st) == -1) return(0); if (((st.st_mode) & S_IFMT) != S_IFREG) return(0); if (isavi(name)) return (ANIM_AVI); if (ismovie(name)) return (ANIM_MOVIE); #else - if (ib_stat(name,&st) == -1) return(0); + if (stat(name,&st) == -1) return(0); if (((st.st_mode) & S_IFMT) != S_IFREG) return(0); if (ismovie(name)) return (ANIM_MOVIE); @@ -414,7 +358,6 @@ int imb_get_anim_type(char * name) { if (isredcode(name)) return (ANIM_REDCODE); #endif type = IMB_ispic(name); - if (type == ANIM) return (ANIM_ANIM5); if (type) return(ANIM_SEQUENCE); return(0); } diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c index 808fbc25c24..b55ce4b1df4 100644 --- a/source/blender/imbuf/intern/writeimage.c +++ b/source/blender/imbuf/intern/writeimage.c @@ -31,180 +31,32 @@ #include -#include "BKE_global.h" -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "imbuf_patch.h" - #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" +#include "IMB_filetype.h" -#include "IMB_allocimbuf.h" - -#include "IMB_dpxcineon.h" -#include "IMB_targa.h" -#include "IMB_jpeg.h" -#include "IMB_iris.h" -#include "IMB_ham.h" -#include "IMB_hamx.h" -#include "IMB_amiga.h" -#include "IMB_png.h" -#include "IMB_bmp.h" -#include "IMB_radiance_hdr.h" - -#if defined(__APPLE__) && defined(IMBUF_COCOA) -#include "IMB_cocoa.h" -#else -#include "IMB_tiff.h" -#endif - -#ifdef WITH_OPENJPEG -#include "IMB_jp2.h" -#endif - -#ifdef WITH_OPENEXR -#include "openexr/openexr_api.h" -#endif - -#ifdef WITH_DDS -#include "dds/dds_api.h" -#endif - -#include "IMB_iff.h" -#include "IMB_bitplanes.h" -#include "IMB_divers.h" - -#ifdef WIN32 -#include -#include "BLI_winstuff.h" -#endif -/* added facility to copy with saving non-float rects */ +#include "imbuf.h" short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags) { - short ok=TRUE,delpl=FALSE; - int file = -1; + ImFileType *type; - if (ibuf==0) return (FALSE); + if(ibuf == NULL) return (FALSE); ibuf->flags = flags; - /* Put formats that take a filename here */ - if (IS_jpg(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_savejpeg(ibuf, name, flags); - } - if (IS_radhdr(ibuf)) { - return imb_savehdr(ibuf, name, flags); - } - if (IS_png(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_savepng(ibuf, name, flags); - } - if (IS_bmp(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_savebmp(ibuf, name, flags); - } - if (IS_tga(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_savetarga(ibuf, name, flags); - } - if (IS_iris(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_saveiris(ibuf, name, flags); - } - -#if defined(__APPLE__) && defined(IMBUF_COCOA) - if (IS_tiff(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_cocoaSaveImage(ibuf, name, flags); - } -#else - if (G.have_libtiff && IS_tiff(ibuf)) { - if(ibuf->rect==NULL && ibuf->rect_float) - IMB_rect_from_float(ibuf); - return imb_savetiff(ibuf, name, flags); - } -#endif - -#ifdef WITH_OPENEXR - if (IS_openexr(ibuf)) { - return imb_save_openexr(ibuf, name, flags); - } -#endif -/* not supported yet -#ifdef WITH_DDS - if (IS_dds(ibuf)) { - return imb_save_dds(ibuf, name, flags); - } -#endif -*/ - if (IS_cineon(ibuf)) { - return imb_savecineon(ibuf, name, flags); - - } - if (IS_dpx(ibuf)) { - return imb_save_dpx(ibuf, name, flags); - } -#ifdef WITH_OPENJPEG - if (IS_jp2(ibuf)) { - return imb_savejp2(ibuf, name, flags); - } -#endif - file = open(name, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); - if (file < 0) return (FALSE); - - if (flags & IB_rect){ - if (ibuf->cmap){ - imb_checkncols(ibuf); - } - } - - /* Put formats that take a filehandle here */ - ok = imb_start_iff(ibuf,file); - if (IS_amiga(ibuf)){ - IMB_flipy(ibuf); - if (flags & IB_rect){ - if ((flags & IB_cmap) == 0) { - if (IS_ham(ibuf)){ - if (ok) ok = imb_converttoham(ibuf); - }else if (ibuf->cmap){ - if (ok) ok = IMB_converttocmap(ibuf); - } + for(type=IMB_FILE_TYPES; type->is_a; type++) { + if(type->save && type->ftype(type, ibuf)) { + if(!(type->flag & IM_FTYPE_FLOAT)) { + if(ibuf->rect==NULL && ibuf->rect_float) + IMB_rect_from_float(ibuf); } - if (ok){ - if (ibuf->planes==0){ - delpl=TRUE; - ok=imb_addplanesImBuf(ibuf); - } - imb_longtobp(ibuf); - } - } - if (flags & IB_vert){ - if (ok) ok = imb_encodebodyv(ibuf,file); + return type->save(ibuf, name, flags); } - else{ - if (ok) ok = imb_encodebodyh(ibuf,file); - } - if (ok) ok = imb_update_iff(file,BODY); - }else if (IS_anim(ibuf)) { - if (ok) ok = imb_enc_anim(ibuf, file); - if (ok) ok = imb_update_iff(file, BODY); } - close(file); - if (ok==FALSE) { - fprintf(stderr,"Couldn't save picture.\n"); - } - if (delpl) imb_freeplanesImBuf(ibuf); + fprintf(stderr, "Couldn't save picture.\n"); - return (ok); + return FALSE; } diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 24e1a9f24e9..76468ada523 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -58,11 +58,11 @@ typedef struct IDProperty { seemed like a good idea as a pad var was needed anyway :)*/ IDPropertyData data; /* note, alignment for 64 bits */ int len; /* array length, also (this is important!) string length + 1. - the idea is to be able to reuse array realloc functions on strings.*/ + the idea is to be able to reuse array realloc functions on strings.*/ /*totallen is total length of allocated array/string, including a buffer. Note that the buffering is mild; the code comes from python's list implementation.*/ int totallen; /*strings and arrays are both buffered, though the buffer isn't - saved.*/ + saved.*/ } IDProperty; #define MAX_IDPROP_NAME 32 @@ -116,10 +116,10 @@ typedef struct Library { ID id; ID *idblock; struct FileData *filedata; - char name[240]; /* revealed in the UI, can store relative path */ - char filename[240]; /* expanded name, not relative, used while reading */ + char name[240]; /* path name used for reading, can be relative and edited in the outliner */ + char filepath[240]; /* temp. absolute filepath, only used while reading */ int tot, pad; /* tot, idblock and filedata are only fo read and write */ - struct Library *parent; /* for outliner, showing dependency */ + struct Library *parent; /* set for indirectly linked libs, used in the outliner and while reading */ } Library; #define PREVIEW_MIPMAPS 2 @@ -130,7 +130,7 @@ typedef struct PreviewImage { unsigned int w[2]; unsigned int h[2]; short changed[2]; - short pad0, pad1; + short changed_timestamp[2]; unsigned int * rect[2]; } PreviewImage; @@ -205,8 +205,8 @@ typedef struct PreviewImage { #define LIB_EXTERN 1 #define LIB_INDIRECT 2 #define LIB_TEST 8 -#define LIB_TESTEXT 9 -#define LIB_TESTIND 10 +#define LIB_TESTEXT (LIB_TEST | LIB_EXTERN) +#define LIB_TESTIND (LIB_TEST | LIB_INDIRECT) #define LIB_READ 16 #define LIB_NEEDLINK 32 diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 91d3a7901c4..d0f15b78ada 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -40,6 +40,7 @@ struct SpaceLink; struct Object; struct Group; +struct GHash; /* ************************************************ */ /* Visualisation */ @@ -153,6 +154,8 @@ typedef enum eMotionPaths_ViewFlag { MOTIONPATH_VIEW_KFRAS = (1<<1), /* show keyframe/frame numbers */ MOTIONPATH_VIEW_KFNOS = (1<<2), + /* find keyframes in whole action (instead of just in matching group name) */ + MOTIONPATH_VIEW_KFACT = (1<<3), } eMotionPath_ViewFlag; /* bAnimVizSettings->path_bakeflag */ @@ -161,6 +164,8 @@ typedef enum eMotionPaths_BakeFlag { MOTIONPATH_BAKE_NEEDS_RECALC = (1<<0), /* for bones - calculate head-points for curves instead of tips */ MOTIONPATH_BAKE_HEADS = (1<<1), + /* motion paths exist for AnimVizSettings instance - set when calc for first time, and unset when clearing */ + MOTIONPATH_BAKE_HAS_PATHS = (1<<2), } eMotionPath_BakeFlag; /* ************************************************ */ @@ -324,6 +329,7 @@ typedef enum eRotationModes { */ typedef struct bPose { ListBase chanbase; /* list of pose channels, PoseBones in RNA */ + struct GHash *chanhash; /* ghash for quicker string lookups */ short flag, proxy_layer; /* proxy layer: copy from armature, gets synced */ @@ -340,6 +346,7 @@ typedef struct bPose { void *ikparam; /* IK solver parameters, structure depends on iksolver */ bAnimVizSettings avs; /* settings for visualisation of bone animation */ + char proxy_act_bone[32]; /*proxy active bone name*/ } bPose; @@ -355,9 +362,9 @@ typedef enum ePose_Flags { POSE_CONSTRAINTS_TIMEDEPEND = (1<<3), /* recalculate bone paths */ POSE_RECALCPATHS = (1<<4), - /* set by armature_rebuild_pose to give a chance to the IK solver to rebuild IK tree */ + /* set by armature_rebuild_pose to give a chance to the IK solver to rebuild IK tree */ POSE_WAS_REBUILT = (1<<5), - /* set by game_copy_pose to indicate that this pose is used in the game engine */ + /* set by game_copy_pose to indicate that this pose is used in the game engine */ POSE_GAME_ENGINE = (1<<6), } ePose_Flags; @@ -543,6 +550,9 @@ typedef enum eDopeSheet_FilterFlag { /* NLA-specific filters */ ADS_FILTER_NLA_NOACT = (1<<25), /* if the AnimData block has no NLA data, don't include to just show Action-line */ + /* general filtering 3 */ + ADS_FILTER_INCL_HIDDEN = (1<<26), /* include 'hidden' channels too (i.e. those from hidden Objects/Bones) */ + /* combination filters (some only used at runtime) */ ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM), } eDopeSheet_FilterFlag; @@ -597,6 +607,8 @@ typedef enum eSAction_Flag { SACTION_TEMP_NEEDCHANSYNC = (1<<9), /* don't perform realtime updates */ SACTION_NOREALTIMEUPDATES = (1<<10), + /* move markers as well as keyframes */ + SACTION_MARKERS_MOVE = (1<<11), } eSAction_Flag; /* SpaceAction Mode Settings */ diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index a59b748945f..03200b784b4 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -95,7 +95,7 @@ typedef struct bSceneActuator { typedef struct bPropertyActuator { int pad, type; char name[32], value[32]; - struct Object *ob; // not in use anymore + struct Object *ob; } bPropertyActuator; typedef struct bObjectActuator { @@ -351,6 +351,7 @@ typedef struct FreeCamera { #define ACT_PROP_TOGGLE 3 /* constraint flag */ +#define ACT_CONST_NONE 0 #define ACT_CONST_LOCX 1 #define ACT_CONST_LOCY 2 #define ACT_CONST_LOCZ 4 @@ -497,6 +498,10 @@ typedef struct FreeCamera { #define ACT_STATE_REMOVE 2 #define ACT_STATE_CHANGE 3 +/* cameraactuator->axis */ +#define ACT_CAMERA_X (float)'x' +#define ACT_CAMERA_Y (float)'y' + #endif diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index d2755f71fa3..8c2fc7db390 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -73,6 +73,7 @@ typedef enum eFModifier_Types { FMODIFIER_TYPE_FILTER, /* unimplemented - for applying: fft, high/low pass filters, etc. */ FMODIFIER_TYPE_PYTHON, FMODIFIER_TYPE_LIMITS, + FMODIFIER_TYPE_STEPPED, /* NOTE: all new modifiers must be added above this line */ FMODIFIER_NUM_TYPES @@ -211,6 +212,7 @@ typedef enum eFMod_Limit_Flags { FCM_LIMIT_YMAX = (1<<3), } eFMod_Limit_Flags; + /* noise modifier data */ typedef struct FMod_Noise { float size; @@ -230,6 +232,24 @@ typedef enum eFMod_Noise_Modifications { FCM_NOISE_MODIF_MULTIPLY, /* Multiply the curve by noise */ } eFMod_Noise_Modifications; + +/* stepped modifier data */ +typedef struct FMod_Stepped { + float step_size; /* Number of frames each interpolated value should be held */ + float offset; /* Reference frame number that stepping starts from */ + + float start_frame; /* start frame of the frame range that modifier works in */ + float end_frame; /* end frame of the frame range that modifier works in */ + + int flag; /* various settings */ +} FMod_Stepped; + +/* stepped modifier range flags */ +typedef enum eFMod_Stepped_Flags { + FCM_STEPPED_NO_BEFORE = (1<<0), /* don't affect frames before the start frame */ + FCM_STEPPED_NO_AFTER = (1<<1), /* don't affect frames after the end frame */ +} eFMod_Stepped_Flags; + /* Drivers -------------------------------------- */ /* Driver Target (dtar) @@ -581,6 +601,7 @@ typedef enum eNlaStrip_Flag { /* strip influence is controlled by local F-Curve */ NLASTRIP_FLAG_USR_INFLUENCE = (1<<5), NLASTRIP_FLAG_USR_TIME = (1<<6), + NLASTRIP_FLAG_USR_TIME_CYCLIC = (1<<7), /* NLA strip length is synced to the length of the referenced action */ NLASTRIP_FLAG_SYNC_LENGTH = (1<<9), @@ -663,20 +684,19 @@ typedef enum eNlaTrack_Flag { typedef struct KS_Path { struct KS_Path *next, *prev; - /* absolute paths only */ ID *id; /* ID block that keyframes are for */ char group[64]; /* name of the group to add to */ - /* relative paths only */ int idtype; /* ID-type that path can be used on */ - int templates; /* Templates that will be encountered in the path (as set of bitflags) */ - /* all paths */ + short groupmode; /* group naming (eKSP_Grouping) */ + short pad; + char *rna_path; /* dynamically (or statically in the case of predefined sets) path */ int array_index; /* index that path affects */ short flag; /* various settings, etc. */ - short groupmode; /* group naming (eKSP_Grouping) */ + short keyingflag; /* settings to supply insertkey() with */ } KS_Path; /* KS_Path->flag */ @@ -734,6 +754,7 @@ typedef struct KeyingSet { ListBase paths; /* (KS_Path) paths to keyframe to */ char name[64]; /* user-viewable name for KeyingSet (for menus, etc.) */ + char typeinfo[64]; /* name of the typeinfo data used for the relative paths */ short flag; /* settings for KeyingSet */ short keyingflag; /* settings to supply insertkey() with */ diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h index 258646f0e55..f7533ff9bde 100644 --- a/source/blender/makesdna/DNA_armature_types.h +++ b/source/blender/makesdna/DNA_armature_types.h @@ -134,7 +134,7 @@ typedef enum eArmature_DeformFlag { ARM_DEF_VGROUP = (1<<0), ARM_DEF_ENVELOPE = (1<<1), ARM_DEF_QUATERNION = (1<<2), - ARM_DEF_B_BONE_REST = (1<<3), + ARM_DEF_B_BONE_REST = (1<<3), /* deprecated */ ARM_DEF_INVERT_VGROUP = (1<<4) } eArmature_DeformFlag; diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 163c8122fb7..3b2ce6b436e 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -33,9 +33,9 @@ #include "DNA_ID.h" #include "DNA_texture_types.h" -#ifndef MAX_MTEX -#define MAX_MTEX 18 -#endif +//#ifndef MAX_MTEX // XXX Not used? +//#define MAX_MTEX 18 +//#endif struct CurveMapping; struct MTex; @@ -43,8 +43,8 @@ struct Image; typedef struct BrushClone { struct Image *image; /* image for clone tool */ - float offset[2]; /* offset of clone image from canvas */ - float alpha, pad; /* transparency for drawing of clone image */ + float offset[2]; /* offset of clone image from canvas */ + float alpha, pad; /* transparency for drawing of clone image */ } BrushClone; typedef struct Brush { @@ -53,49 +53,94 @@ typedef struct Brush { struct BrushClone clone; struct CurveMapping *curve; /* falloff curve */ struct MTex mtex; - - short flag, blend; /* general purpose flag, blend mode */ - int size; /* brush diameter */ - float jitter; /* jitter the position of the brush */ - float spacing; /* spacing of paint operations */ - int smooth_stroke_radius; /* turning radius (in pixels) for smooth stroke */ - float smooth_stroke_factor; /* higher values limit fast changes in the stroke direction */ - float rate; /* paint operations / second (airbrush) */ + struct Image *image_icon; - float rgb[3]; /* color */ - float alpha; /* opacity */ + float normal_weight; - char sculpt_tool; /* active sculpt tool */ + short blend, pad; /* blend mode */ + int size; /* brush diameter */ + int flag; /* general purpose flag */ + float jitter; /* jitter the position of the brush */ + int spacing; /* spacing of paint operations */ + int smooth_stroke_radius; /* turning radius (in pixels) for smooth stroke */ + float smooth_stroke_factor; /* higher values limit fast changes in the stroke direction */ + float rate; /* paint operations / second (airbrush) */ + + float rgb[3]; /* color */ + float alpha; /* opacity */ + + int sculpt_plane; /* the direction of movement for sculpt vertices */ + + float plane_offset; /* offset for plane brushes (clay, flatten, fill, scrape) */ + + char sculpt_tool; /* active sculpt tool */ char vertexpaint_tool; /* active vertex/weight paint tool/blend mode */ char imagepaint_tool; /* active image paint tool */ - char pad2; + char pad3; + + float autosmooth_factor; + + float crease_pinch_factor; + + float plane_trim; + + float texture_sample_bias; + int texture_overlay_alpha; + + float unprojected_radius; + + float add_col[3]; + float sub_col[3]; } Brush; /* Brush.flag */ -#define BRUSH_AIRBRUSH 1 -#define BRUSH_TORUS 2 -#define BRUSH_ALPHA_PRESSURE 4 -#define BRUSH_SIZE_PRESSURE 8 -#define BRUSH_JITTER_PRESSURE 16 /* was BRUSH_RAD_PRESSURE */ -#define BRUSH_SPACING_PRESSURE 32 -#define BRUSH_FIXED_TEX 64 -#define BRUSH_RAKE 128 -#define BRUSH_ANCHORED 256 -#define BRUSH_DIR_IN 512 -#define BRUSH_SPACE 1024 -#define BRUSH_SMOOTH_STROKE 2048 -#define BRUSH_PERSISTENT 4096 -#define BRUSH_ACCUMULATE 8192 +#define BRUSH_AIRBRUSH (1<<0) +#define BRUSH_TORUS (1<<1) +#define BRUSH_ALPHA_PRESSURE (1<<2) +#define BRUSH_SIZE_PRESSURE (1<<3) +#define BRUSH_JITTER_PRESSURE (1<<4) /* was BRUSH_RAD_PRESSURE */ +#define BRUSH_SPACING_PRESSURE (1<<5) +#define BRUSH_FIXED_TEX (1<<6) +#define BRUSH_RAKE (1<<7) +#define BRUSH_ANCHORED (1<<8) +#define BRUSH_DIR_IN (1<<9) +#define BRUSH_SPACE (1<<10) +#define BRUSH_SMOOTH_STROKE (1<<11) +#define BRUSH_PERSISTENT (1<<12) +#define BRUSH_ACCUMULATE (1<<13) +#define BRUSH_LOCK_ALPHA (1<<14) +#define BRUSH_ORIGINAL_NORMAL (1<<15) +#define BRUSH_OFFSET_PRESSURE (1<<16) +#define BRUSH_SPACE_ATTEN (1<<18) +#define BRUSH_ADAPTIVE_SPACE (1<<19) +#define BRUSH_LOCK_SIZE (1<<20) +#define BRUSH_TEXTURE_OVERLAY (1<<21) +#define BRUSH_EDGE_TO_EDGE (1<<22) +#define BRUSH_RESTORE_MESH (1<<23) +#define BRUSH_INVERSE_SMOOTH_PRESSURE (1<<24) +#define BRUSH_RANDOM_ROTATION (1<<25) +#define BRUSH_PLANE_TRIM (1<<26) +#define BRUSH_FRONTFACE (1<<27) /* Brush.sculpt_tool */ -#define SCULPT_TOOL_DRAW 1 -#define SCULPT_TOOL_SMOOTH 2 -#define SCULPT_TOOL_PINCH 3 -#define SCULPT_TOOL_INFLATE 4 -#define SCULPT_TOOL_GRAB 5 -#define SCULPT_TOOL_LAYER 6 -#define SCULPT_TOOL_FLATTEN 7 -#define SCULPT_TOOL_CLAY 8 +#define SCULPT_TOOL_DRAW 1 +#define SCULPT_TOOL_SMOOTH 2 +#define SCULPT_TOOL_PINCH 3 +#define SCULPT_TOOL_INFLATE 4 +#define SCULPT_TOOL_GRAB 5 +#define SCULPT_TOOL_LAYER 6 +#define SCULPT_TOOL_FLATTEN 7 +#define SCULPT_TOOL_CLAY 8 +#define SCULPT_TOOL_FILL 9 +#define SCULPT_TOOL_SCRAPE 10 +#define SCULPT_TOOL_NUDGE 11 +#define SCULPT_TOOL_THUMB 12 +#define SCULPT_TOOL_SNAKE_HOOK 13 +#define SCULPT_TOOL_ROTATE 14 +//#define SCULPT_TOOL_WAX 15 // XXX: reuse this slot later +#define SCULPT_TOOL_CREASE 16 +#define SCULPT_TOOL_BLOB 17 +#define SCULPT_TOOL_CLAY_TUBES 18 /* ImagePaintSettings.tool */ #define PAINT_TOOL_DRAW 0 @@ -103,5 +148,16 @@ typedef struct Brush { #define PAINT_TOOL_SMEAR 2 #define PAINT_TOOL_CLONE 3 +/* direction that the brush displaces along */ +enum { + SCULPT_DISP_DIR_AREA, + SCULPT_DISP_DIR_VIEW, + SCULPT_DISP_DIR_X, + SCULPT_DISP_DIR_Y, + SCULPT_DISP_DIR_Z, +}; + +#define MAX_BRUSH_PIXEL_RADIUS 200 + #endif diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h index dc075af353c..3a9c7b22cde 100644 --- a/source/blender/makesdna/DNA_camera_types.h +++ b/source/blender/makesdna/DNA_camera_types.h @@ -46,17 +46,15 @@ typedef struct Camera { struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */ short type, flag; - float passepartalpha, angle; + float passepartalpha; float clipsta, clipend; float lens, ortho_scale, drawsize; float shiftx, shifty; /* yafray: dof params */ /* qdn: yafray var 'YF_dofdist' now enabled for defocus composit node as well. - The name was not changed so that no other files need to be modified */ - float YF_dofdist, YF_aperture; - short YF_bkhtype, YF_bkhbias; - float YF_bkhrot; + The name was not changed so that no other files need to be modified */ + float YF_dofdist; struct Ipo *ipo; // XXX depreceated... old animation system diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h index 8e04107afe0..9b9f0ede526 100644 --- a/source/blender/makesdna/DNA_cloth_types.h +++ b/source/blender/makesdna/DNA_cloth_types.h @@ -76,8 +76,10 @@ typedef struct ClothSimSettings short vgroup_bend; /* vertex group for scaling bending stiffness */ short vgroup_mass; /* optional vertexgroup name for assigning weight.*/ short vgroup_struct; /* vertex group for scaling structural stiffness */ + short shapekey_rest; /* vertex group for scaling structural stiffness */ short presets; /* used for presets on GUI */ - short reset; + short reset; + short pad[3]; struct EffectorWeights *effector_weights; } ClothSimSettings; @@ -93,6 +95,7 @@ typedef struct ClothCollSettings int flags; /* collision flags defined in BKE_cloth.h */ short self_loop_count; /* How many iterations for the selfcollision loop */ short loop_count; /* How many iterations for the collision loop. */ + struct Group *group; /* Only use colliders from this group of objects */ } ClothCollSettings; diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h index 5d6802290c2..83cd7979ce7 100644 --- a/source/blender/makesdna/DNA_color_types.h +++ b/source/blender/makesdna/DNA_color_types.h @@ -64,6 +64,8 @@ typedef struct CurveMap { typedef struct CurveMapping { int flag, cur; /* cur; for buttons, to show active curve */ + int preset; + int changed_timestamp; rctf curr, clipr; /* current rect, clip rect (is default rect too) */ @@ -80,16 +82,66 @@ typedef struct CurveMapping { #define CUMA_DRAW_CFRA 4 #define CUMA_DRAW_SAMPLE 8 +/* cumapping->preset */ +typedef enum CurveMappingPreset { + CURVE_PRESET_LINE, + CURVE_PRESET_SHARP, + CURVE_PRESET_SMOOTH, + CURVE_PRESET_MAX, + CURVE_PRESET_MID9, + CURVE_PRESET_ROUND, + CURVE_PRESET_ROOT, +} CurveMappingPreset; + +/* histogram->mode */ +#define HISTO_MODE_LUMA 0 +#define HISTO_MODE_RGB 1 +#define HISTO_MODE_R 2 +#define HISTO_MODE_G 3 +#define HISTO_MODE_B 4 + typedef struct Histogram { int channels; int x_resolution; float data_r[256]; float data_g[256]; float data_b[256]; + float data_luma[256]; float xmax, ymax; - int ok; - int flag; + int mode; + int height; } Histogram; +struct ImBuf; + +typedef struct Scopes { + int ok; + int sample_full; + int sample_lines; + float accuracy; + int wavefrm_mode; + float wavefrm_alpha; + float wavefrm_yfac; + int wavefrm_height; + float vecscope_alpha; + int vecscope_height; + float minmax[3][2]; + struct Histogram hist; + float *waveform_1; + float *waveform_2; + float *waveform_3; + float *vecscope; + int waveform_tot; + int pad; +} Scopes; + +/* scopes->wavefrm_mode */ +#define SCOPES_WAVEFRM_LUMA 0 +#define SCOPES_WAVEFRM_RGB 1 +#define SCOPES_WAVEFRM_YCC_601 2 +#define SCOPES_WAVEFRM_YCC_709 3 +#define SCOPES_WAVEFRM_YCC_JPEG 4 + + #endif diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index 6e837588f0c..f310e5e55e0 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -174,6 +174,7 @@ typedef struct bSplineIKConstraint { /* Single-target subobject constraints --------------------- */ + /* Track To Constraint */ typedef struct bTrackToConstraint { Object *tar; @@ -208,6 +209,12 @@ typedef struct bSizeLikeConstraint { char subtarget[32]; } bSizeLikeConstraint; +/* Maintain Volume Constraint */ +typedef struct bSameVolumeConstraint { + int flag; + float volume; +} bSameVolumeConstraint; + /* Copy Transform Constraint */ typedef struct bTransLikeConstraint { Object *tar; @@ -330,6 +337,24 @@ typedef struct bTransformConstraint { float to_max[3]; } bTransformConstraint; +/* Pivot Constraint */ +typedef struct bPivotConstraint { + /* Pivot Point: + * Either target object + offset, or just offset is used + */ + Object *tar; /* target object (optional) */ + char subtarget[32]; /* subtarget name (optional) */ + float offset[3]; /* offset from the target to use, regardless of whether it exists */ + + /* Rotation-driven activation: + * This option provides easier one-stop setups for footrolls + */ + short rotAxis; /* rotation axes to consider for this (ePivotConstraint_Axis) */ + + /* General flags */ + short flag; /* ePivotConstraint_Flag */ +} bPivotConstraint; + /* transform limiting constraints - zero target ---------------------------- */ /* Limit Location Constraint */ typedef struct bLocLimitConstraint { @@ -412,6 +437,8 @@ typedef enum eBConstraint_Types { CONSTRAINT_TYPE_DAMPTRACK, /* New Tracking constraint that minimises twisting */ CONSTRAINT_TYPE_SPLINEIK, /* Spline-IK - Align 'n' bones to a curve */ CONSTRAINT_TYPE_TRANSLIKE, /* Copy transform matrix */ + CONSTRAINT_TYPE_SAMEVOL, /* Maintain volume during scaling */ + CONSTRAINT_TYPE_PIVOT, /* Pivot Constraint */ /* NOTE: no constraints are allowed to be added after this */ NUM_CONSTRAINT_TYPES @@ -447,7 +474,7 @@ typedef enum eBConstraint_SpaceTypes { CONSTRAINT_SPACE_LOCAL, /* = 1 */ /* for posechannels - pose space */ CONSTRAINT_SPACE_POSE, /* = 2 */ - /* for posechannels - local with parent */ + /* for posechannels - local with parent */ CONSTRAINT_SPACE_PARLOCAL, /* = 3 */ /* for files from between 2.43-2.46 (should have been parlocal) */ CONSTRAINT_SPACE_INVALID, /* = 4. do not exchange for anything! */ @@ -462,11 +489,6 @@ typedef enum eConstraintChannel_Flags { /* -------------------------------------- */ -/** - * The flags for ROTLIKE, LOCLIKE and SIZELIKE should be kept identical - * (that is, same effect, different name). It simplifies the Python API access a lot. - */ - /* bRotateLikeConstraint.flag */ typedef enum eCopyRotation_Flags { ROTLIKE_X = (1<<0), @@ -499,6 +521,13 @@ typedef enum eCopyScale_Flags { SIZELIKE_OFFSET = (1<<3), } eCopyScale_Flags; +/* bSameVolumeConstraint.flag */ +typedef enum eSameVolume_Modes { + SAMEVOL_X = 0, + SAMEVOL_Y, + SAMEVOL_Z, +} eSameVolume_Modes; + /* Locked-Axis Values (Locked Track) */ typedef enum eLockAxis_Modes { LOCK_X = 0, @@ -674,6 +703,35 @@ typedef enum eChildOf_Flags { CHILDOF_SIZEZ = (1<<8), } eChildOf_Flags; +/* Pivot Constraint */ + /* Restrictions for Pivot Constraint axis to consider for enabling constraint */ +typedef enum ePivotConstraint_Axis { + /* do not consider this activity-clamping */ + PIVOTCON_AXIS_NONE = -1, + + /* consider -ve x-axis rotations */ + PIVOTCON_AXIS_X_NEG, + /* consider -ve y-axis rotations */ + PIVOTCON_AXIS_Y_NEG, + /* consider -ve z-axis rotations */ + PIVOTCON_AXIS_Z_NEG, + + /* consider +ve x-axis rotations */ + PIVOTCON_AXIS_X, + /* consider +ve y-axis rotations */ + PIVOTCON_AXIS_Y, + /* consider +ve z-axis rotations */ + PIVOTCON_AXIS_Z, +} ePivotConstraint_Axis; + + /* settings for Pivot Constraint in general */ +typedef enum ePivotConstraint_Flag { + /* offset is to be interpreted as being a fixed-point in space */ + PIVOTCON_FLAG_OFFSET_ABS = (1<<0), + /* rotation-based activation uses negative rotation to drive result */ + PIVOTCON_FLAG_ROTACT_NEG = (1<<1), +} ePivotConstraint_Flag; + /* Rigid-Body Constraint */ #define CONSTRAINT_DRAW_PIVOT 0x40 #define CONSTRAINT_DISABLE_LINKED_COLLISION 0x80 diff --git a/source/blender/makesdna/DNA_controller_types.h b/source/blender/makesdna/DNA_controller_types.h index 026f2a489fc..fcd5587b14b 100644 --- a/source/blender/makesdna/DNA_controller_types.h +++ b/source/blender/makesdna/DNA_controller_types.h @@ -84,5 +84,9 @@ typedef struct bController { /* pyctrl->flag */ #define CONT_PY_DEBUG 1 +/* pyctrl->mode */ +#define CONT_PY_SCRIPT 0 +#define CONT_PY_MODULE 1 + #endif diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index cd002894c5d..d27ab8f125d 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -55,7 +55,7 @@ struct EditFont; typedef struct PathPoint { float vec[4]; /* grr, cant get rid of tilt yet */ float quat[4]; - float radius; + float radius, weight; } PathPoint; /* These two Lines with # tell makesdna this struct can be excluded. */ @@ -80,7 +80,7 @@ typedef struct BevList { # # typedef struct BevPoint { - float vec[3], alfa, radius; + float vec[3], alfa, radius, weight; float sina, cosa; /* 2D Only */ float dir[3], tan[3], quat[4]; /* 3D Only */ short split_tag, dupe_tag; @@ -177,7 +177,7 @@ typedef struct Curve { short texflag, pad1; /* keep a short because of give_obdata_texspace() */ short drawflag, twist_mode, pad[2]; - float twist_smooth, pad2; + float twist_smooth, smallcaps_scale; short pathlen, totcol; short flag, bevresol; @@ -189,8 +189,8 @@ typedef struct Curve { /* edit, index in nurb list */ int actnu; - /* edit, last selected bpoint */ - BPoint *lastselbp; + /* edit, last selected point */ + void *lastsel; /* font part */ short len, lines, pos, spacemode; @@ -243,6 +243,7 @@ typedef struct Curve { #define CU_RETOPO 1024 #define CU_DS_EXPAND 2048 #define CU_PATH_RADIUS 4096 /* make use of the path radius if this is enabled (default for new curves) */ +#define CU_DEFORM_FILL 8192 /* fill 2d curve after deformation */ /* twist mode */ #define CU_TWIST_Z_UP 0 @@ -287,7 +288,9 @@ typedef struct Curve { /* flagu flagv (nurb) */ -#define CU_CYCLIC 1 +#define CU_NURB_CYCLIC 1 +#define CU_NURB_ENDPOINT 2 +#define CU_NURB_BEZIER 4 /* *************** BEZTRIPLE **************** */ @@ -321,11 +324,13 @@ typedef enum eBezTriple_KeyframeType { /* *************** CHARINFO **************** */ /* flag */ -#define CU_STYLE (1+2) -#define CU_BOLD 1 -#define CU_ITALIC 2 -#define CU_UNDERLINE 4 -#define CU_WRAP 8 /* wordwrap occured here */ +/* note: CU_CHINFO_WRAP and CU_CHINFO_SMALLCAPS_TEST are set dynamically */ +#define CU_CHINFO_BOLD (1<<0) +#define CU_CHINFO_ITALIC (1<<1) +#define CU_CHINFO_UNDERLINE (1<<2) +#define CU_CHINFO_WRAP (1<<3) /* wordwrap occured here */ +#define CU_CHINFO_SMALLCAPS (1<<4) +#define CU_CHINFO_SMALLCAPS_CHECK (1<<5) /* set at runtime, checks if case switching is needed */ #endif diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index 52822b67b68..8d5d34fbe9b 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -84,14 +84,15 @@ typedef struct CustomData { #define CD_WEIGHT_MCOL 20 /* for displaying weightpaint colors */ #define CD_MPOLY 21 #define CD_MLOOP 22 -#define CD_WEIGHT_MLOOPCOL 23 +#define CD_CLOTH_ORCO 23 #define CD_ID_MCOL 24 #define CD_TEXTURE_MCOL 25 #define CD_SHAPE_KEYINDEX 26 #define CD_SHAPEKEY 27 #define CD_BWEIGHT 28 #define CD_CREASE 29 -#define CD_NUMTYPES 30 +#define CD_WEIGHT_MLOOPCOL 30 +#define CD_NUMTYPES 31 /* Bits for CustomDataMask */ #define CD_MASK_MVERT (1 << CD_MVERT) @@ -120,6 +121,8 @@ typedef struct CustomData { #define CD_MASK_WEIGHT_MLOOPCOL (1 << CD_WEIGHT_MLOOPCOL) #define CD_MASK_SHAPE_KEYINDEX (1 << CD_SHAPE_KEYINDEX) #define CD_MASK_SHAPEKEY (1 << CD_SHAPEKEY) +#define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO) + /* derivedmesh wants CustomDataMask for weightpaint too, is not customdata though */ #define CD_MASK_WEIGHTPAINT (1 << CD_WEIGHTPAINT) #define CD_MASK_BWEIGHT (1 << CD_BWEIGHT) diff --git a/source/blender/makesdna/DNA_documentation.h b/source/blender/makesdna/DNA_documentation.h index d0f24eb0010..a911b92c313 100644 --- a/source/blender/makesdna/DNA_documentation.h +++ b/source/blender/makesdna/DNA_documentation.h @@ -44,7 +44,7 @@ * untyped. The parser/dna generator has been modified to explicitly * handle these special cases. Most pointers have been given proper * proto's by now. DNA_space_types.h::Spacefile::returnfuncmay still - * be badly defined. The reason for this is that is is called with + * be badly defined. The reason for this is that it is called with * different types of arguments. It takes a char* at this moment... * * - Path to the header files diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 3a7933cf425..1695ceb73a5 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -72,9 +72,12 @@ typedef struct Image { /* sources from: */ struct anim *anim; struct RenderResult *rr; + + struct RenderResult *renders[8]; /* IMA_MAX_RENDER_SLOT */ + short render_slot, last_render_slot; short ok, flag; - short source, type, pad, pad1; + short source, type; int lastframe; /* texture page */ @@ -87,14 +90,13 @@ typedef struct Image { struct PackedFile * packedfile; struct PreviewImage * preview; - /* not saved in file, statistics for render result */ - char *render_text; - + /* game engine tile animation */ float lastupdate; int lastused; short animspeed; - short gen_x, gen_y, gen_type; /* for generated images */ + /* for generated images */ + short gen_x, gen_y, gen_type; /* display aspect - for UV editing images resized for faster openGL display */ float aspx, aspy; @@ -110,7 +112,7 @@ typedef struct Image { #define IMA_REFLECT 16 #define IMA_NOCOLLECT 32 -#define IMA_ANTIALI 64 +#define IMA_DEPRECATED 64 #define IMA_OLD_PREMUL 128 /* tpageflag */ @@ -124,9 +126,9 @@ typedef struct Image { /* ima->type and ima->source moved to BKE_image.h, for API */ -/* render_text maxlen */ -#define IMA_RW_MAXTEXT 512 - +/* render */ +#define IMA_MAX_RENDER_TEXT 512 +#define IMA_MAX_RENDER_SLOT 8 #endif diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h index cb458708b3e..5231108a756 100644 --- a/source/blender/makesdna/DNA_lamp_types.h +++ b/source/blender/makesdna/DNA_lamp_types.h @@ -81,32 +81,26 @@ typedef struct Lamp { /* sun/sky */ short sun_effect_type; short skyblendtype; - float horizon_brightness; - float spread; - float sun_brightness; - float sun_size; - float backscattered_light; - float sun_intensity; + float horizon_brightness; + float spread; + float sun_brightness; + float sun_size; + float backscattered_light; + float sun_intensity; float atm_turbidity; - float atm_inscattering_factor; - float atm_extinction_factor; - float atm_distance_factor; + float atm_inscattering_factor; + float atm_extinction_factor; + float atm_distance_factor; float skyblendfac; float sky_exposure; - short sky_colorspace, pad4; - - /* yafray: photonlight params */ - int YF_numphotons, YF_numsearch; - short YF_phdepth, YF_useqmc, YF_bufsize, YF_pad; - float YF_causticblur, YF_ltradius; - /* yafray: glow params */ - float YF_glowint, YF_glowofs; - short YF_glowtype, YF_pad2; - + short sky_colorspace; + char pad4[6]; + struct Ipo *ipo; // XXX depreceated... old animation system struct MTex *mtex[18]; /* MAX_MTEX */ - short pr_texture, pad[3]; - + short pr_texture; + char pad6[6]; + /* preview */ struct PreviewImage *preview; } Lamp; diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h index 620bdbf5be4..3a0fcb3c38c 100644 --- a/source/blender/makesdna/DNA_lattice_types.h +++ b/source/blender/makesdna/DNA_lattice_types.h @@ -52,6 +52,7 @@ typedef struct Lattice { struct Key *key; struct MDeformVert *dvert; + char vgroup[32]; /* multiply the influence */ /* used while deforming, always free and NULL after use */ float *latticedata; diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 5d321fe49c2..722adba1136 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -65,6 +65,7 @@ typedef enum ModifierType { eModifierType_Smoke, eModifierType_ShapeKey, eModifierType_Solidify, + eModifierType_Screw, NUM_MODIFIER_TYPES } ModifierType; @@ -82,6 +83,7 @@ typedef struct ModifierData { struct ModifierData *next, *prev; int type, mode; + int stackindex, pad; char name[32]; /* XXX for timing info set by caller... solve later? (ton) */ @@ -167,31 +169,31 @@ typedef struct ArrayModifierData { struct Object *offset_ob; /* a constant duplicate offset; 1 means the duplicates are 1 unit apart - */ + */ float offset[3]; /* a scaled factor for duplicate offsets; 1 means the duplicates are 1 object-width apart - */ + */ float scale[3]; /* the length over which to distribute the duplicates */ float length; /* the limit below which to merge vertices in adjacent duplicates */ float merge_dist; /* determines how duplicate count is calculated; one of: - MOD_ARR_FIXEDCOUNT -> fixed - MOD_ARR_FITLENGTH -> calculated to fit a set length - MOD_ARR_FITCURVE -> calculated to fit the length of a Curve object - */ + MOD_ARR_FIXEDCOUNT -> fixed + MOD_ARR_FITLENGTH -> calculated to fit a set length + MOD_ARR_FITCURVE -> calculated to fit the length of a Curve object + */ int fit_type; /* flags specifying how total offset is calculated; binary OR of: - MOD_ARR_OFF_CONST -> total offset += offset - MOD_ARR_OFF_RELATIVE -> total offset += relative * object width - MOD_ARR_OFF_OBJ -> total offset += offset_ob's matrix + MOD_ARR_OFF_CONST -> total offset += offset + MOD_ARR_OFF_RELATIVE -> total offset += relative * object width + MOD_ARR_OFF_OBJ -> total offset += offset_ob's matrix total offset is the sum of the individual enabled offsets */ int offset_type; /* general flags: - MOD_ARR_MERGE -> merge vertices in adjacent duplicates + MOD_ARR_MERGE -> merge vertices in adjacent duplicates */ int flags; /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */ @@ -317,6 +319,7 @@ typedef struct UVProjectModifierData { int flags; int num_projectors; float aspectx, aspecty; + float scalex, scaley; char uvlayer_name[32]; int uvlayer_tmp, pad; } UVProjectModifierData; @@ -514,9 +517,13 @@ typedef struct MeshDeformModifierData { short gridsize, flag, mode, pad; - /* variables filled in when bound */ - float *bindweights, *bindcos; /* computed binding weights */ + /* result of static binding */ + MDefInfluence *bindinfluences; /* influences */ + int *bindoffsets; /* offsets into influences array */ + float *bindcagecos; /* coordinates that cage was bound with */ int totvert, totcagevert; /* total vertices in mesh and cage */ + + /* result of dynamic binding */ MDefCell *dyngrid; /* grid with dynamic binding cell points */ MDefInfluence *dyninfluences; /* dynamic binding vertex influences */ int *dynverts, *pad2; /* is this vertex bound or not? */ @@ -526,8 +533,12 @@ typedef struct MeshDeformModifierData { float dyncellwidth; /* width of dynamic bind cell */ float bindmat[4][4]; /* matrix of cage at binding time */ + /* deprecated storage */ + float *bindweights; /* deprecated inefficient storage */ + float *bindcos; /* deprecated storage of cage coords */ + /* runtime */ - void (*bindfunc)(struct Scene *scene, struct DerivedMesh *dm, + void (*bindfunc)(struct Scene *scene, struct MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[][4]); } MeshDeformModifierData; @@ -569,7 +580,7 @@ typedef struct ParticleInstanceModifierData { typedef enum { eExplodeFlag_CalcFaces = (1<<0), - //eExplodeFlag_PaSize = (1<<1), + eExplodeFlag_PaSize = (1<<1), eExplodeFlag_EdgeSplit = (1<<2), eExplodeFlag_Unborn = (1<<3), eExplodeFlag_Alive = (1<<4), @@ -597,7 +608,7 @@ typedef enum { typedef struct FluidsimModifierData { ModifierData modifier; - struct FluidsimSettings *fss; /* definition is is DNA_object_fluidsim.h */ + struct FluidsimSettings *fss; /* definition is in DNA_object_fluidsim.h */ struct PointCache *point_cache; /* definition is in DNA_object_force.h */ } FluidsimModifierData; @@ -681,15 +692,35 @@ typedef struct SolidifyModifierData { char defgrp_name[32]; /* name of vertex group to use */ float offset; /* new surface offset level*/ + float offset_fac; /* midpoint of the offset */ float crease_inner; float crease_outer; float crease_rim; int flag; - char pad[4]; } SolidifyModifierData; #define MOD_SOLIDIFY_RIM (1<<0) #define MOD_SOLIDIFY_EVEN (1<<1) #define MOD_SOLIDIFY_NORMAL_CALC (1<<2) +#define MOD_SOLIDIFY_VGROUP_INV (1<<3) +#define MOD_SOLIDIFY_RIM_MATERIAL (1<<4) + +typedef struct ScrewModifierData { + ModifierData modifier; + struct Object *ob_axis; + int steps; + int render_steps; + int iter; + float screw_ofs; + float angle; + short axis; + short flag; +} ScrewModifierData; + +#define MOD_SCREW_NORMAL_FLIP (1<<0) +#define MOD_SCREW_NORMAL_CALC (1<<1) +#define MOD_SCREW_OBJECT_OFFSET (1<<2) +// #define MOD_SCREW_OBJECT_ANGLE (1<<4) + #endif diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 4dd089949e9..872d69f3148 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -22,7 +22,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Bob Holcomb, Xavier Thomas * * ***** END GPL LICENSE BLOCK ***** */ @@ -186,10 +186,10 @@ typedef struct bNodeTree { int pad2[2]; /* callbacks */ - void (*timecursor)(void *, int nr); + void (*progress)(void *, float progress); void (*stats_draw)(void *, char *str); int (*test_break)(void *); - void *tbh, *tch, *sdh; + void *tbh, *prh, *sdh; } bNodeTree; @@ -250,6 +250,7 @@ typedef struct NodeChroma { float t1,t2,t3; float fsize,fstrength,falpha; float key[4]; + short algorithm, channel; } NodeChroma; typedef struct NodeTwoXYs { @@ -310,8 +311,17 @@ typedef struct NodeColorBalance { float lift[3]; float gamma[3]; float gain[3]; + + /* temp storage for inverted lift */ + float lift_lgg[3]; } NodeColorBalance; +typedef struct NodeColorspill { + short limchan, unspill; + float limscale; + float uspillr, uspillg, uspillb; +}NodeColorspill; + /* TEX_output */ typedef struct TexNodeOutput { char name[32]; diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h index fa918fc30d9..700021eaceb 100644 --- a/source/blender/makesdna/DNA_object_fluidsim.h +++ b/source/blender/makesdna/DNA_object_fluidsim.h @@ -63,8 +63,10 @@ typedef struct FluidsimSettings { short viscosityExponent; /* gravity strength */ float gravx,gravy,gravz; - /* anim start end time */ + /* anim start end time (in seconds) */ float animStart, animEnd; + /* bake start end time (in blender frames) */ + int bakeStart, bakeEnd; /* g star param (LBM compressibility) */ float gstar; /* activate refinement? */ @@ -160,8 +162,10 @@ typedef struct FluidsimSettings { #define OB_FSPART_FLOAT (1<<4) #define OB_FSPART_TRACER (1<<5) -// new fluid bit flags for fss->flags - dg -#define OB_FLUIDSIM_REVERSE (1 << 0) +// new fluid bit flags for fss->flags +#define OB_FLUIDSIM_REVERSE (1 << 0) +#define OB_FLUIDSIM_ACTIVE (1 << 1) +#define OB_FLUIDSIM_OVERRIDE_TIME (1 << 2) #ifdef __cplusplus } diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 1df76a39d9d..63a6b8fbe4a 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -266,7 +266,7 @@ typedef struct SoftBody { /* springs */ float inspring; /* softbody inner springs */ float infrict; /* softbody inner springs friction */ - char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting + char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting starting to fix old bug .. nastyness that VG are indexes rather find them by name tag to find it -> jow20090613 */ @@ -286,7 +286,7 @@ typedef struct SoftBody { float balldamp; /* cooling down collision response */ float ballstiff; /* pressure the ball is loaded with */ short sbc_mode; - short aeroedge, + short aeroedge, minloops, maxloops, choke, @@ -302,11 +302,11 @@ typedef struct SoftBody { struct ListBase ptcaches; struct EffectorWeights *effector_weights; - /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */ + /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */ float lcom[3]; float lrot[3][3]; float lscale[3][3]; - char pad4[4]; + char pad4[4]; } SoftBody; @@ -330,6 +330,7 @@ typedef struct SoftBody { #define PFIELD_VISIBILITY (1<<13) #define PFIELD_DO_LOCATION (1<<14) #define PFIELD_DO_ROTATION (1<<15) +#define PFIELD_GUIDE_PATH_WEIGHT (1<<16) /* apply curve weights */ /* pd->falloff */ #define PFIELD_FALL_SPHERE 0 @@ -364,6 +365,8 @@ typedef struct SoftBody { #define PTCACHE_FRAMES_SKIPPED 256 #define PTCACHE_EXTERNAL 512 #define PTCACHE_READ_INFO 1024 +/* dont use the filename of the blendfile the data is linked from (write a local cache) */ +#define PTCACHE_IGNORE_LIBPATH 2048 /* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */ #define PTCACHE_REDO_NEEDED 258 diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 3be057959b6..4fe1072b673 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -62,6 +62,7 @@ typedef struct bDeformGroup { struct bDeformGroup *next, *prev; char name[32]; } bDeformGroup; +#define MAX_VGROUP_NAME 32 /** * The following illustrates the orientation of the @@ -169,7 +170,7 @@ typedef struct Object { float mass, damping, inertia; /* The form factor k is introduced to give the user more control * and to fix incompatibility problems. - * For rotational symmetric objects, the inertia value can be + * For rotational symmetric objects, the inertia value can be * expressed as: Theta = k * m * r^2 * where m = Mass, r = Radius * For a Sphere, the form factor is by default = 0.4 @@ -411,14 +412,15 @@ extern Object workob; #define BA_HAS_RECALC_OB 4 #define BA_HAS_RECALC_DATA 8 - // XXX DEPRECEATED SETTING... -#define BA_DO_IPO 32 + /* NOTE: this was used as a proper setting in past, so nullify before using */ +#define BA_TEMP_TAG 32 #define BA_FROMSET 128 #define BA_TRANSFORM_CHILD 256 /* child of a transformed object */ #define BA_TRANSFORM_PARENT 8192 /* parent of a transformed object */ + /* an initial attempt as making selection more specific! */ #define BA_DESELECT 0 #define BA_SELECT 1 @@ -434,8 +436,10 @@ extern Object workob; #define OB_RECALC_DATA 2 /* time flag is set when time changes need recalc, so baked systems can ignore it */ #define OB_RECALC_TIME 4 -#define OB_RECALC 7 +#define OB_RECALC_ALL 7 +/* controller state */ +#define OB_MAX_STATES 30 /* ob->gameflag */ #define OB_DYNAMIC 1 @@ -493,9 +497,10 @@ extern Object workob; #define OB_ADDCONT 512 #define OB_ADDACT 1024 #define OB_SHOWCONT 2048 -#define OB_SETSTBIT 4096 +#define OB_ALLSTATE 4096 #define OB_INITSTBIT 8192 #define OB_DEBUGSTATE 16384 +#define OB_SHOWSTATE 32768 /* ob->restrictflag */ #define OB_RESTRICT_VIEW 1 diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index 36c144a1cfa..105fa6d5289 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -114,11 +114,20 @@ typedef struct ParticleData { short alive; /* the life state of a particle */ } ParticleData; +typedef struct SPHFluidSettings { + /*Particle Fluid*/ + float spring_k, radius, rest_length; + float viscosity_omega, viscosity_beta; + float stiffness_k, stiffness_knear, rest_density; + float buoyancy; +} SPHFluidSettings; + typedef struct ParticleSettings { ID id; struct AnimData *adt; struct BoidSettings *boids; + struct SPHFluidSettings *fluid; struct EffectorWeights *effector_weights; @@ -127,7 +136,7 @@ typedef struct ParticleSettings { /* physics modes */ short phystype, rotmode, avemode, reactevent; short draw, draw_as, draw_size, childtype; - short ren_as, rt2; + short ren_as, subframes; /* number of path segments, power of 2 except */ short draw_step, ren_step; short hair_step, keys_step; @@ -322,6 +331,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in #define PART_PHYS_NEWTON 1 #define PART_PHYS_KEYED 2 #define PART_PHYS_BOIDS 3 +#define PART_PHYS_FLUID 4 /* part->kink */ #define PART_KINK_NO 0 diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 928637a0047..3ac11eabe54 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -104,6 +104,15 @@ typedef struct QuicktimeCodecSettings { int minTemporalQuality; /* in 0-100 scale, to be translated in 0-1024 for qt use */ int keyFrameRate; int bitRate; /* bitrate in bps */ + + /* Audio Codec settings */ + int audiocodecType; + int audioSampleRate; + short audioBitDepth; + short audioChannels; + int audioCodecFlags; + int audioBitRate; + int pad1; } QuicktimeCodecSettings; typedef struct FFMpegCodecData { @@ -170,25 +179,24 @@ typedef struct SceneRenderLayer { #define SCE_LAY_NEG_ZMASK 0x80000 /* srl->passflag */ -#define SCE_PASS_COMBINED 1 -#define SCE_PASS_Z 2 -#define SCE_PASS_RGBA 4 -#define SCE_PASS_DIFFUSE 8 -#define SCE_PASS_SPEC 16 -#define SCE_PASS_SHADOW 32 -#define SCE_PASS_AO 64 -#define SCE_PASS_REFLECT 128 -#define SCE_PASS_NORMAL 256 -#define SCE_PASS_VECTOR 512 -#define SCE_PASS_REFRACT 1024 -#define SCE_PASS_INDEXOB 2048 -#define SCE_PASS_UV 4096 -#define SCE_PASS_RADIO 8192 /* Radio removed, can use for new GI? */ -#define SCE_PASS_MIST 16384 -#define SCE_PASS_RAYHITS 32768 -#define SCE_PASS_EMIT 65536 -#define SCE_PASS_ENVIRONMENT 131072 -#define SCE_PASS_INDIRECT 262144 +#define SCE_PASS_COMBINED (1<<0) +#define SCE_PASS_Z (1<<1) +#define SCE_PASS_RGBA (1<<2) +#define SCE_PASS_DIFFUSE (1<<3) +#define SCE_PASS_SPEC (1<<4) +#define SCE_PASS_SHADOW (1<<5) +#define SCE_PASS_AO (1<<6) +#define SCE_PASS_REFLECT (1<<7) +#define SCE_PASS_NORMAL (1<<8) +#define SCE_PASS_VECTOR (1<<9) +#define SCE_PASS_REFRACT (1<<10) +#define SCE_PASS_INDEXOB (1<<11) +#define SCE_PASS_UV (1<<12) +#define SCE_PASS_INDIRECT (1<<13) +#define SCE_PASS_MIST (1<<14) +#define SCE_PASS_RAYHITS (1<<15) +#define SCE_PASS_EMIT (1<<16) +#define SCE_PASS_ENVIRONMENT (1<<17) /* note, srl->passflag is treestore element 'nr' in outliner, short still... */ @@ -201,12 +209,12 @@ typedef struct RenderData { struct FFMpegCodecData ffcodecdata; int cfra, sfra, efra; /* frames as in 'images' */ + float subframe; /* subframe offset from cfra, in 0.0-1.0 */ int psfra, pefra; /* start+end frames of preview range */ int images, framapto; short flag, threads; - float ctime; /* use for calcutions */ float framelen, blurfac; /** For UR edge rendering: give the edges this color */ @@ -220,7 +228,7 @@ typedef struct RenderData { short dimensionspreset; /* for the dimensions presets menu */ - short filtertype; /* filter is box, tent, gauss, mitch, etc */ + short filtertype; /* filter is box, tent, gauss, mitch, etc */ short size, maximsize; /* size in %, max in Kb */ /* from buttons: */ @@ -246,7 +254,7 @@ typedef struct RenderData { /** Mode bits: */ /* 0: Enable backbuffering for images */ short bufflag; - short quality; + short quality; /** * Render to image editor, fullscreen or to new window. @@ -329,23 +337,13 @@ typedef struct RenderData { /** post-production settings. Depricated, but here for upwards compat (initialized to 1) */ float postgamma, posthue, postsat; - /* Dither noise intensity */ + /* Dither noise intensity */ float dither_intensity; /* Bake Render options */ short bake_osa, bake_filter, bake_mode, bake_flag; short bake_normal_space, bake_quad_split; float bake_maxdist, bake_biasdist, bake_pad; - - /* yafray: global panel params. TODO: move elsewhere */ - short GIquality, GIcache, GImethod, GIphotons, GIdirect; - short YF_AA, YFexportxml, YF_nobump, YF_clamprgb, yfpad1; - int GIdepth, GIcausdepth, GIpixelspersample; - int GIphotoncount, GImixphotons; - float GIphotonradius; - int YF_raydepth, YF_AApasses, YF_AAsamples, yfpad2; - float GIshadowquality, GIrefinement, GIpower, GIindirpower; - float YF_gamma, YF_exposure, YF_raybias, YF_AApixelsize, YF_AAthreshold; /* paths to backbufffer, output, ftype */ char backbuf[160], pic[160]; @@ -361,6 +359,12 @@ typedef struct RenderData { float fg_stamp[4]; float bg_stamp[4]; + /* sequencer options */ + char seq_prev_type; + char seq_rend_type; + char seq_flag; /* flag use for sequence render/draw */ + char pad5[5]; + /* render simplify */ int simplify_flag; short simplify_subsurf; @@ -521,14 +525,18 @@ typedef struct ImagePaintSettings { /* for projection painting only */ short seam_bleed, normal_angle; + short screen_grab_size[2]; /* capture size for re-projection */ + + int pad1; void *paintcursor; /* wm handle */ } ImagePaintSettings; typedef struct ParticleBrushData { - short size, strength; /* common settings */ - short step, invert; /* for specific brushes only */ - int flag, pad; + short size; /* common setting */ + short step, invert, count; /* for specific brushes only */ + int flag; + float strength; } ParticleBrushData; typedef struct ParticleEditSettings { @@ -561,12 +569,30 @@ typedef struct Sculpt { Paint paint; /* For rotating around a pivot point */ - float pivot[3]; + //float pivot[3]; XXX not used? int flags; /* Control tablet input */ - char tablet_size, tablet_strength; - char pad[6]; + //char tablet_size, tablet_strength; XXX not used? + int radial_symm[3]; + + // all this below is used to communicate with the cursor drawing routine + + /* record movement of mouse so that rake can start at an intuitive angle */ + float last_x, last_y; + float last_angle; + + int draw_anchored; + int anchored_size; + float anchored_location[3]; + float anchored_initial_mouse[2]; + + int draw_pressure; + float pressure_value; + + float special_rotation; + + int pad; } Sculpt; typedef struct VPaint { @@ -717,7 +743,7 @@ typedef struct UnitSettings { typedef struct PhysicsSettings { float gravity[3]; - int flag; + int flag, quick_cache_step, rt; } PhysicsSettings; typedef struct Scene { @@ -737,9 +763,11 @@ typedef struct Scene { float cursor[3]; /* 3d cursor location */ float twcent[3]; /* center for transform widget */ float twmin[3], twmax[3]; /* boundbox of selection for transform widget */ - unsigned int lay; - + unsigned int lay; /* bitflags for layer visibility */ + int layact; /* active layer */ + int pad1; + short flag; /* various settings */ short use_nodes; @@ -836,6 +864,10 @@ typedef struct Scene { #define R_TOUCH 0x800000 /* touch files before rendering */ #define R_SIMPLIFY 0x1000000 +/* seq_flag */ +#define R_SEQ_GL_PREV 1 +#define R_SEQ_GL_REND 2 + /* displaymode */ #define R_OUTPUT_SCREEN 0 @@ -887,7 +919,7 @@ typedef struct Scene { #define R_NO_TEX 0x2000 #define R_STAMP_INFO 0x4000 /* deprecated */ #define R_FULL_SAMPLE 0x8000 -#define R_COMP_RERENDER 0x10000 +#define R_DEPRECATED 0x10000 #define R_RECURS_PROTECTION 0x20000 #define R_TEXNODE_PREVIEW 0x40000 @@ -977,6 +1009,9 @@ typedef struct Scene { /* simplify_flag */ #define R_SIMPLE_NO_TRIANGULATE 1 +/* sequencer seq_prev_type seq_rend_type */ + + /* **************** SCENE ********************* */ /* for general use */ @@ -1005,6 +1040,7 @@ typedef struct Scene { #define ID_NEW_US(a) if( (a)->id.newid) {(a)= (void *)(a)->id.newid; (a)->id.us++;} #define ID_NEW_US2(a) if( ((ID *)a)->newid) {(a)= ((ID *)a)->newid; ((ID *)a)->us++;} #define CFRA (scene->r.cfra) +#define SUBFRA (scene->r.subframe) #define F_CFRA ((float)(scene->r.cfra)) #define SFRA (scene->r.sfra) #define EFRA (scene->r.efra) @@ -1075,7 +1111,6 @@ typedef struct Scene { #define F_ERROR -1 #define F_START 0 #define F_SCENE 1 -#define F_SET 2 #define F_DUPLI 3 /* audio->flag */ @@ -1088,19 +1123,22 @@ typedef struct Scene { /* Paint.flags */ typedef enum { - PAINT_SHOW_BRUSH = 1, - PAINT_FAST_NAVIGATE = 2 + PAINT_SHOW_BRUSH = (1<<0), + PAINT_FAST_NAVIGATE = (1<<1), + PAINT_SHOW_BRUSH_ON_SURFACE = (1<<2), } PaintFlags; /* Sculpt.flags */ /* These can eventually be moved to paint flags? */ typedef enum SculptFlags { - SCULPT_SYMM_X = 1, - SCULPT_SYMM_Y = 2, - SCULPT_SYMM_Z = 4, - SCULPT_LOCK_X = 64, - SCULPT_LOCK_Y = 128, - SCULPT_LOCK_Z = 256 + SCULPT_SYMM_X = (1<<0), + SCULPT_SYMM_Y = (1<<1), + SCULPT_SYMM_Z = (1<<2), + SCULPT_LOCK_X = (1<<3), + SCULPT_LOCK_Y = (1<<4), + SCULPT_LOCK_Z = (1<<5), + SCULPT_SYMMETRY_FEATHER = (1<<6), + SCULPT_USE_OPENMP = (1<<7), } SculptFlags; /* ImagePaintSettings.flag */ diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index ce165c0bac8..a811fd9c014 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -152,7 +152,9 @@ typedef struct ARegion { short sizex, sizey; /* current split size in pixels (if zero it uses regiontype) */ short do_draw; /* private, cached notifier events */ + short do_draw_overlay; /* private, cached notifier events */ short swap; /* private, indicator to survive swap-exchange */ + short pad[3]; struct ARegionType *type; /* callbacks for this region type */ @@ -244,5 +246,9 @@ enum { #define RGN_FLAG_HIDDEN 1 #define RGN_FLAG_TOO_SMALL 2 +/* region do_draw */ +#define RGN_DRAW 1 +#define RGN_DRAW_PARTIAL 2 + #endif diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h index d13edb99f07..9b486e2851d 100644 --- a/source/blender/makesdna/DNA_sdna_types.h +++ b/source/blender/makesdna/DNA_sdna_types.h @@ -48,7 +48,7 @@ typedef struct SDNA { int nr_structs; /* number of struct types */ short **structs; /* sp= structs[a] is the adress of a struct definintion - sp[0] is struct type number, sp[1] amount of members + sp[0] is struct type number, sp[1] amount of members (sp[2], sp[3]), (sp[4], sp[5]), .. are the member type and name numbers respectively */ diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h index 41476c81c85..d7256b5b9e0 100644 --- a/source/blender/makesdna/DNA_sensor_types.h +++ b/source/blender/makesdna/DNA_sensor_types.h @@ -75,21 +75,21 @@ typedef struct bKeyboardSensor { } bKeyboardSensor; typedef struct bPropertySensor { - int type; - int pad; + int type; + int pad; char name[32]; char value[32]; - char maxvalue[32]; + char maxvalue[32]; } bPropertySensor; typedef struct bActuatorSensor { - int type; - int pad; + int type; + int pad; char name[32]; } bActuatorSensor; typedef struct bDelaySensor { - short delay; + short delay; short duration; short flag; short pad; @@ -101,7 +101,7 @@ typedef struct bCollisionSensor { // struct Material *ma; // XXX remove materialName short damptimer, damp; short mode; /* flag to choose material or property */ - short pad2; + short pad2; } bCollisionSensor; typedef struct bRadarSensor { @@ -260,11 +260,14 @@ typedef struct bJoystickSensor { * ... The reason for this is that we need to be backward compatible, * and have a proper default value for this thing. * */ -/* #define SENS_COLLISION_PROPERTY 0 */ +#define SENS_COLLISION_PROPERTY 0 #define SENS_COLLISION_MATERIAL 1 #define SENS_COLLISION_PULSE 2 + /* ray specific mode */ /* X-Ray means that the ray will traverse objects that don't have the property/material */ +#define SENS_RAY_PROPERTY 0 +#define SENS_RAY_MATERIAL 1 #define SENS_RAY_XRAY 2 /* Some stuff for the mouse sensor Type: */ @@ -277,6 +280,7 @@ typedef struct bJoystickSensor { #define BL_SENS_MOUSE_MOUSEOVER 16 #define BL_SENS_MOUSE_MOUSEOVER_ANY 32 +/* Joystick sensor - sorted by axis types */ #define SENS_JOY_ANY_EVENT 1 #define SENS_JOY_BUTTON 0 /* axis type */ @@ -292,6 +296,16 @@ typedef struct bJoystickSensor { #define SENS_JOY_HAT 2 /* axis type */ #define SENS_JOY_HAT_DIR 0 +#define SENS_JOY_HAT_UP 1 +#define SENS_JOY_HAT_RIGHT 2 +#define SENS_JOY_HAT_DOWN 4 +#define SENS_JOY_HAT_LEFT 8 + +#define SENS_JOY_HAT_UP_RIGHT SENS_JOY_HAT_UP | SENS_JOY_HAT_RIGHT +#define SENS_JOY_HAT_DOWN_RIGHT SENS_JOY_HAT_DOWN | SENS_JOY_HAT_RIGHT +#define SENS_JOY_HAT_UP_LEFT SENS_JOY_HAT_UP | SENS_JOY_HAT_LEFT +#define SENS_JOY_HAT_DOWN_LEFT SENS_JOY_HAT_DOWN | SENS_JOY_HAT_LEFT + #define SENS_JOY_AXIS_SINGLE 3 /* axis type */ diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index 329e9ce771a..a5299ef081d 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -72,8 +72,8 @@ typedef struct StripColorBalance { float gain[3]; int flag; int pad; - float exposure; - float saturation; + // float exposure; + // float saturation; } StripColorBalance; typedef struct StripProxy { @@ -140,6 +140,7 @@ typedef struct Sequence { int startstill, endstill; int machine, depth; /*machine - the strip channel, depth - the depth in the sequence when dealing with metastrips */ int startdisp, enddisp; /*starting and ending points in the sequence*/ + float sat, pad; float mul, handsize; /* is sfra needed anymore? - it looks like its only used in one place */ int sfra; /* starting frame according to the timeline of the scene. */ @@ -149,6 +150,8 @@ typedef struct Sequence { struct Ipo *ipo; // xxx depreceated... old animation system struct Scene *scene; + struct Object *scene_camera; /* override scene camera */ + struct anim *anim; float effect_fader; float speed_fader; @@ -162,10 +165,11 @@ typedef struct Sequence { struct bSound *sound; /* the linked "bSound" object */ void *scene_sound; - float volume, pad; + float volume; float level, pan; /* level in dB (0=full), pan -1..1 */ int scenenr; /* for scene selection */ + int multicam_source; /* for multicam source selection */ float strobe; void *effectdata; /* Struct pointer for effect settings */ @@ -193,6 +197,10 @@ typedef struct Editing { Sequence *act_seq; char act_imagedir[256]; char act_sounddir[256]; + + int over_ofs, over_cfra; + int over_flag, pad; + rctf over_border; } Editing; /* ************* Effect Variable Structs ********* */ @@ -205,7 +213,7 @@ typedef struct GlowVars { float fMini; /* Minimum intensity to trigger a glow */ float fClamp; float fBoost; /* Amount to multiply glow intensity */ - float dDist; /* Radius of glow blurring */ + float dDist; /* Radius of glow blurring */ int dQuality; int bNoComp; /* SHOW/HIDE glow buffer */ } GlowVars; @@ -239,6 +247,10 @@ typedef struct SpeedControlVars { int lastValidFrame; } SpeedControlVars; +/* Editor->over_flag */ +#define SEQ_EDIT_OVERLAY_SHOW 1 +#define SEQ_EDIT_OVERLAY_ABS 2 + #define SEQ_STRIP_OFSBOTTOM 0.2f #define SEQ_STRIP_OFSTOP 0.8f @@ -273,6 +285,9 @@ typedef struct SpeedControlVars { #define SEQ_USE_PROXY_CUSTOM_FILE 2097152 #define SEQ_USE_EFFECT_DEFAULT_FADE 4194304 +/* convenience define for all selection flags */ +#define SEQ_ALLSEL (SELECT+SEQ_LEFTSEL+SEQ_RIGHTSEL) + /* deprecated, dont use a flag anymore*/ /*#define SEQ_ACTIVE 1048576*/ @@ -304,7 +319,8 @@ typedef struct SpeedControlVars { #define SEQ_TRANSFORM 27 #define SEQ_COLOR 28 #define SEQ_SPEED 29 -#define SEQ_EFFECT_MAX 29 +#define SEQ_MULTICAM 30 +#define SEQ_EFFECT_MAX 30 #define STRIPELEM_FAILED 0 #define STRIPELEM_OK 1 @@ -317,5 +333,8 @@ typedef struct SpeedControlVars { otherwise, you can't really blend, right :) !) */ + +#define SEQ_HAS_PATH(_seq) (ELEM5((_seq)->type, SEQ_MOVIE, SEQ_IMAGE, SEQ_SOUND, SEQ_RAM_SOUND, SEQ_HD_SOUND)) + #endif diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index c57931fa0a9..ba9d0380c9f 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -44,6 +44,7 @@ struct Text; struct Script; struct ImBuf; struct Image; +struct Scopes; struct Histogram; struct SpaceIpo; struct BlendHandle; @@ -168,15 +169,16 @@ typedef struct FileSelectParams { /* XXX - temporary, better move to filelist */ short active_bookmark; + int active_file; int selstate; /* short */ /* XXX --- still unused -- */ short f_fp; /* show font preview */ - short menu; /* currently selected option in pupmenu */ + short pad; char fp_str[8]; /* string to use for font preview */ - char *pupmenu; /* allows menu for save options - result stored in menup */ + /* XXX --- end unused -- */ } FileSelectParams; @@ -185,7 +187,7 @@ typedef struct SpaceFile { SpaceLink *next, *prev; ListBase regionbase; /* storage of regions for inactive spaces */ int spacetype; - int pad; + int scroll_offset; struct FileSelectParams *params; /* config and input for file select */ @@ -201,7 +203,7 @@ typedef struct SpaceFile { */ struct wmOperator *op; - struct wmTimer *loadimage_timer; + struct wmTimer *smoothscroll_timer; struct FileLayout *layout; @@ -251,6 +253,7 @@ typedef struct SpaceImage { char sticky; /* sticky selection type */ char dt_uvstretch; char around; + float cursor[2]; /* UV editor 2d cursor */ float xof, yof; /* user defined offset, image is centered */ float zoom, pad4; /* user defined zoom level */ @@ -258,7 +261,10 @@ typedef struct SpaceImage { struct bGPdata *gpd; /* grease pencil data */ - struct Histogram hist; /* viewer histogram */ + struct Scopes scopes; /* histogram waveform and vectorscope */ + + struct Histogram sample_line_hist; /* sample line histogram */ + } SpaceImage; typedef struct SpaceNla { @@ -340,6 +346,17 @@ typedef struct SpaceScript { void *but_refs; } SpaceScript; +typedef struct SpaceTimeCache { + struct SpaceTimeCache *next, *prev; + int type; + int flag; + + float *array; + int len; + int startframe, endframe; + int ok; +} SpaceTimeCache; + typedef struct SpaceTime { SpaceLink *next, *prev; ListBase regionbase; /* storage of regions for inactive spaces */ @@ -348,6 +365,9 @@ typedef struct SpaceTime { View2D v2d; /* deprecated, copied to region */ + ListBase caches; + int cache_display, pad; + int flag, redraws; } SpaceTime; @@ -367,8 +387,9 @@ typedef struct SpaceNode { float aspect; void *curfont; - float xof, yof; /* offset for drawing the backdrop */ - float mx, my; /* mousepos for drawing socketless link */ + float xof, yof; /* offset for drawing the backdrop */ + float zoom, padf; /* zoom for backdrop */ + float mx, my; /* mousepos for drawing socketless link */ struct bNodeTree *nodetree, *edittree; int treetype; /* treetype: as same nodetree->type */ @@ -524,6 +545,9 @@ typedef struct SpaceUserPref { int spacetype; int pad; + + char filter[64]; /* search term for filtering in the UI */ + } SpaceUserPref; /* view3d Now in DNA_view3d_types.h */ @@ -618,6 +642,7 @@ typedef struct SpaceUserPref { #define BUTS_ACT_LINK 256 #define BUTS_SENS_STATE 512 #define BUTS_ACT_STATE 1024 +#define BUTS_CONT_INIT_STATE 2048 /* FileSelectParams.display */ enum FileDisplayTypeE { @@ -655,7 +680,7 @@ enum FileSortTypeE { /* sfile->flag and simasel->flag */ #define FILE_SHOWSHORT 1 -#define FILE_STRINGCODE 2 +#define FILE_RELPATH 2 /* was FILE_STRINGCODE */ #define FILE_LINK 4 #define FILE_HIDE_DOT 8 #define FILE_AUTOSELECT 16 @@ -667,19 +692,20 @@ enum FileSortTypeE { #define FILE_GROUP_INSTANCE 1024 /* files in filesel list: 2=ACTIVE */ -#define EDITING 1 -#define ACTIVE 2 -#define BLENDERFILE 4 -#define PSXFILE 8 -#define IMAGEFILE 16 -#define MOVIEFILE 32 -#define PYSCRIPTFILE 64 -#define FTFONTFILE 128 -#define SOUNDFILE 256 -#define TEXTFILE 512 -#define MOVIEFILE_ICON 1024 /* movie file that preview can't load */ -#define FOLDERFILE 2048 /* represents folders for filtering */ -#define BTXFILE 4096 +#define EDITING (1<<0) +#define ACTIVEFILE (1<<1) +#define BLENDERFILE (1<<2) +#define PSXFILE (1<<3) +#define IMAGEFILE (1<<4) +#define MOVIEFILE (1<<5) +#define PYSCRIPTFILE (1<<6) +#define FTFONTFILE (1<<7) +#define SOUNDFILE (1<<8) +#define TEXTFILE (1<<9) +#define MOVIEFILE_ICON (1<<10) /* movie file that preview can't load */ +#define FOLDERFILE (1<<11) /* represents folders for filtering */ +#define BTXFILE (1<<12) +#define COLLADAFILE (1<<13) /* SpaceImage->dt_uv */ #define SI_UVDT_OUTLINE 0 @@ -768,7 +794,7 @@ enum { #define ST_SCROLL_SELECT 0x0001 // scrollable #define ST_CLEAR_NAMESPACE 0x0010 // clear namespace after script - // execution (see BPY_main.c) + // execution (see BPY_main.c) #define ST_FIND_WRAP 0x0020 #define ST_FIND_ALL 0x0040 @@ -803,6 +829,10 @@ enum { /* if set, it allows redraws. gets set for some allqueue events */ #define SO_TREESTORE_REDRAW 2 +/* outliner search flags (SpaceOops->search_flags) */ +#define SO_FIND_CASE_SENSITIVE (1<<0) +#define SO_FIND_COMPLETE (1<<1) + /* headerbuttons: 450-499 */ #define B_IMASELHOME 451 @@ -814,31 +844,6 @@ enum { #define C_HI 0xCBBBBB #define C_LO 0x544444 -/* queue settings */ -#define IMS_KNOW_WIN 1 -#define IMS_KNOW_BIP 2 -#define IMS_KNOW_DIR 4 -#define IMS_DOTHE_INF 8 -#define IMS_KNOW_INF 16 -#define IMS_DOTHE_IMA 32 -#define IMS_KNOW_IMA 64 -#define IMS_FOUND_BIP 128 -#define IMS_DOTHE_BIP 256 -#define IMS_WRITE_NO_BIP 512 - -/* imasel->mode */ -#define IMS_NOIMA 0 -#define IMS_IMA 1 -#define IMS_ANIM 2 -#define IMS_DIR 4 -#define IMS_FILE 8 -#define IMS_STRINGCODE 16 - -#define IMS_INDIR 1 -#define IMS_INDIRSLI 2 -#define IMS_INFILE 3 -#define IMS_INFILESLI 4 - /* nla->flag */ /* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old blenders */ /* draw timing in seconds instead of frames */ @@ -869,6 +874,13 @@ enum { #define TIME_CONTINUE_PHYSICS 128 #define TIME_NODES 256 +/* time->cache */ +#define TIME_CACHE_DISPLAY 1 +#define TIME_CACHE_SOFTBODY 2 +#define TIME_CACHE_PARTICLES 4 +#define TIME_CACHE_CLOTH 8 +#define TIME_CACHE_SMOKE 16 + /* sseq->mainb */ #define SEQ_DRAW_SEQUENCE 0 #define SEQ_DRAW_IMG_IMBUF 1 @@ -889,6 +901,14 @@ enum { #define SEQ_VIEW_PREVIEW 2 #define SEQ_VIEW_SEQUENCE_PREVIEW 3 +/* sseq->render_size */ +#define SEQ_PROXY_RENDER_SIZE_NONE -1 +#define SEQ_PROXY_RENDER_SIZE_SCENE 0 +#define SEQ_PROXY_RENDER_SIZE_25 25 +#define SEQ_PROXY_RENDER_SIZE_50 50 +#define SEQ_PROXY_RENDER_SIZE_75 75 +#define SEQ_PROXY_RENDER_SIZE_FULL 100 + /* space types, moved from DNA_screen_types.h */ enum { diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h index 3212ff7b534..e7a5a6e5f56 100644 --- a/source/blender/makesdna/DNA_texture_types.h +++ b/source/blender/makesdna/DNA_texture_types.h @@ -170,7 +170,7 @@ typedef struct PointDensity { short noise_depth; short noise_influence; short noise_basis; - short pdpad3[3]; + short pdpad3[3]; float noise_fac; float speed_scale; @@ -190,8 +190,12 @@ typedef struct VoxelData { float int_multiplier; int still_frame; char source_path[240]; + + /* temporary data */ float *dataset; - + int cachedframe; + int ok; + } VoxelData; typedef struct Tex { @@ -199,8 +203,8 @@ typedef struct Tex { struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */ float noisesize, turbul; - float bright, contrast, rfac, gfac, bfac; - float filtersize; + float bright, contrast, saturation, rfac, gfac, bfac; + float filtersize, pad2; /* newnoise: musgrave parameters */ float mg_H, mg_lacunarity, mg_octaves, mg_offset, mg_gain; @@ -335,8 +339,6 @@ typedef struct TexMapping { #define TXF_EWA 1 #define TXF_FELINE 2 #define TXF_AREA 3 -// TXF_SAT only available when mipmaps disabled -#define TXF_SAT 4 /* imaflag unused, only for version check */ #define TEX_FIELDS_ 8 diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 5a11f10ab31..8a14aaa1820 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -119,7 +119,7 @@ typedef struct uiWidgetColors { char text_sel[4]; short shaded; short shadetop, shadedown; - short pad; + short alpha_check; } uiWidgetColors; typedef struct uiWidgetStateColors { @@ -139,8 +139,8 @@ typedef struct ThemeUI { uiWidgetColors wcol_radio, wcol_option, wcol_toggle; uiWidgetColors wcol_num, wcol_numslider; uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item; - uiWidgetColors wcol_box, wcol_scroll, wcol_list_item; - + uiWidgetColors wcol_box, wcol_scroll, wcol_progress, wcol_list_item; + uiWidgetStateColors wcol_state; char iconfile[80]; // FILE_MAXFILE length @@ -192,7 +192,7 @@ typedef struct ThemeSpace { char active[4], group[4], group_active[4], transform[4]; char vertex[4], vertex_select[4]; char edge[4], edge_select[4]; - char edge_seam[4], edge_sharp[4], edge_facesel[4]; + char edge_seam[4], edge_sharp[4], edge_facesel[4], edge_crease[4]; char face[4], face_select[4]; // solid faces char face_dot[4]; // selected color char normal[4]; @@ -200,6 +200,10 @@ typedef struct ThemeSpace { char bone_solid[4], bone_pose[4]; char strip[4], strip_select[4]; char cframe[4]; + char nurb_uline[4], nurb_vline[4]; + char act_spline[4], nurb_sel_uline[4], nurb_sel_vline[4], lastsel_point[4]; + char handle_free[4], handle_auto[4], handle_vect[4], handle_align[4]; + char handle_sel_free[4], handle_sel_auto[4], handle_sel_vect[4], handle_sel_align[4]; char ds_channel[4], ds_subchannel[4]; // dopesheet char console_output[4], console_input[4], console_info[4], console_error[4]; @@ -219,7 +223,7 @@ typedef struct ThemeSpace { char handle_vertex_select[4]; char handle_vertex_size; - char hpad[3]; + char hpad[7]; char preview_back[4]; @@ -300,6 +304,7 @@ typedef struct UserDef { char plugseqdir[160]; char pythondir[160]; char sounddir[160]; + char image_editor[240]; // FILE_MAX length char anim_player[240]; // FILE_MAX length int anim_player_preset; @@ -339,9 +344,10 @@ typedef struct UserDef { short gp_settings; short tb_leftmouse, tb_rightmouse; struct SolidLight light[3]; + short sculpt_paint_settings; /* user preferences for sculpt and paint */ short tw_hotspot, tw_flag, tw_handlesize, tw_size; short textimeout,texcollectrate; - short wmdrawmethod, wmpad; + short wmdrawmethod; /* removed wmpad */ int memcachelimit; int prefetchframes; short frameserverport; @@ -353,12 +359,15 @@ typedef struct UserDef { short smooth_viewtx; /* miliseconds to spend spinning the view */ short glreslimit; short ndof_pan, ndof_rotate; - short curssize, ipo_new; + short curssize; short color_picker_type; - short pad2; + short ipo_new; /* interpolation mode for newly added F-Curves */ + short keyhandles_new; /* handle types for newly added keyframes */ short scrcastfps; /* frame rate for screencast to be played back */ short scrcastwait; /* milliseconds between screencast snapshots */ + + short propwidth, pad[3]; /* Value for Dual/Single Column UI */ char versemaster[160]; char verseuser[160]; @@ -368,6 +377,11 @@ typedef struct UserDef { short autokey_flag; /* flags for autokeying */ struct ColorBand coba_weight; /* from texture.h */ + + int sculpt_paint_unified_size; /* unified radius of brush in pixels */ + float sculpt_paint_unified_unprojected_radius;/* unified radius of brush in Blender units */ + float sculpt_paint_unified_alpha; /* unified strength of brush */ + float sculpt_paint_overlay_col[3]; } UserDef; extern UserDef U; /* from blenkernel blender.c */ @@ -385,9 +399,9 @@ extern UserDef U; /* from blenkernel blender.c */ /* flag */ #define USER_AUTOSAVE (1 << 0) -#define USER_AUTOGRABGRID (1 << 1) -#define USER_AUTOROTGRID (1 << 2) -#define USER_AUTOSIZEGRID (1 << 3) +#define USER_AUTOGRABGRID (1 << 1) /* deprecated */ +#define USER_AUTOROTGRID (1 << 2) /* deprecated */ +#define USER_AUTOSIZEGRID (1 << 3) /* deprecated */ #define USER_SCENEGLOBAL (1 << 4) #define USER_TRACKBALL (1 << 5) #define USER_DUPLILINK (1 << 6) @@ -405,10 +419,11 @@ extern UserDef U; /* from blenkernel blender.c */ #define USER_ADD_EDITMODE (1 << 18) #define USER_ADD_VIEWALIGNED (1 << 19) #define USER_RELPATHS (1 << 20) -#define USER_DRAGIMMEDIATE (1 << 21) +#define USER_RELEASECONFIRM (1 << 21) #define USER_SCRIPT_AUTOEXEC_DISABLE (1 << 22) #define USER_FILENOUI (1 << 23) #define USER_NONEGFRAMES (1 << 24) +#define USER_TXT_TABSTOSPACES_DISABLE (1 << 25) /* helper macro for checking frame clamping */ #define FRAMENUMBER_MIN_CLAMP(cfra) \ @@ -433,7 +448,7 @@ extern UserDef U; /* from blenkernel blender.c */ #define USER_FLIPFULLSCREEN (1 << 7) #define USER_ALLWINCODECS (1 << 8) #define USER_MENUOPENAUTO (1 << 9) -#define USER_PANELPINNED (1 << 10) +#define USER_PANELPINNED (1 << 10) /* deprecated */ #define USER_AUTOPERSP (1 << 11) #define USER_LOCKAROUND (1 << 12) #define USER_GLOBALUNDO (1 << 13) @@ -451,6 +466,7 @@ extern UserDef U; /* from blenkernel blender.c */ #define USER_CONTINUOUS_MOUSE (1 << 24) #define USER_ZOOM_INVERT (1 << 25) #define USER_ZOOM_DOLLY_HORIZ (1 << 26) +#define USER_SPLASH_DISABLE (1 << 27) /* Auto-Keying mode */ /* AUTOKEY_ON is a bitflag */ @@ -517,6 +533,11 @@ extern UserDef U; /* from blenkernel blender.c */ #define GP_PAINT_DOSMOOTH (1<<0) #define GP_PAINT_DOSIMPLIFY (1<<1) +/* sculpt_paint_settings */ +#define SCULPT_PAINT_USE_UNIFIED_SIZE (1<<0) +#define SCULPT_PAINT_USE_UNIFIED_ALPHA (1<<1) +#define SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE (1<<2) + /* color picker types */ #define USER_CP_CIRCLE 0 #define USER_CP_SQUARE_SV 1 diff --git a/source/blender/makesdna/DNA_vec_types.h b/source/blender/makesdna/DNA_vec_types.h index 4a6f7f3a3cc..5d6f1039ed5 100644 --- a/source/blender/makesdna/DNA_vec_types.h +++ b/source/blender/makesdna/DNA_vec_types.h @@ -78,13 +78,13 @@ typedef struct vec4d { #endif typedef struct rcti { - int xmin, xmax; - int ymin, ymax; + int xmin, xmax; + int ymin, ymax; } rcti; typedef struct rctf { - float xmin, xmax; - float ymin, ymax; + float xmin, xmax; + float ymin, ymax; } rctf; #endif diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h index 965e19e38a2..75ad1e644d1 100644 --- a/source/blender/makesdna/DNA_view2d_types.h +++ b/source/blender/makesdna/DNA_view2d_types.h @@ -58,7 +58,6 @@ typedef struct View2D { short oldwinx, oldwiny; /* storage of previous winx/winy values encountered by UI_view2d_curRect_validate(), for keepaspect */ short around; /* pivot point for transforms (rotate and scale) */ - float cursor[2]; /* only used in the UV view for now (for 2D-cursor) */ float *tab_offset; /* different offset per tab, for buttons */ int tab_num; /* number of tabs stored */ diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 123aab2d9e0..c5516a3bff5 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -63,14 +63,14 @@ struct wmTimer; /* Background Picture in 3D-View */ typedef struct BGpic { - struct BGpic *next, *prev; + struct BGpic *next, *prev; - struct Image *ima; + struct Image *ima; struct ImageUser iuser; - float xof, yof, size, blend; - short view; - short flag; - float pad2; + float xof, yof, size, blend; + short view; + short flag; + float pad2; } BGpic; /* ********************************* */ @@ -229,6 +229,7 @@ typedef struct View3D { #define RV3D_FLYMODE 2 #define RV3D_CLIPPING 4 #define RV3D_NAVIGATING 8 +#define RV3D_GPULIGHT_UPDATE 16 /* RegionView3d->viewlock */ #define RV3D_LOCKED 1 @@ -246,6 +247,7 @@ typedef struct View3D { #define RV3D_VIEW_CAMERA 8 /* View3d->flag2 (short) */ +#define V3D_RENDER_OVERRIDE 4 #define V3D_SOLID_TEX 8 #define V3D_DISPGP 16 diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index a53645e7442..e6d0772f425 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -96,7 +96,16 @@ typedef struct ReportList { int printlevel; /* ReportType */ int storelevel; /* ReportType */ int flag, pad; + struct wmTimer *reporttimer; } ReportList; + +/* timer customdata to control reports display */ +typedef struct ReportTimerInfo { + float col[3]; + float greyscale; + float widthfac; +} ReportTimerInfo; + /* reports need to be before wmWindowManager */ @@ -251,8 +260,6 @@ typedef struct wmKeyConfig { char idname[64]; /* unique name */ char basename[64]; /* idname of configuration this is derives from, "" if none */ - - char filter[64]; /* search term for filtering in the UI */ ListBase keymaps; int actkeymap, flag; @@ -300,8 +307,7 @@ typedef struct wmOperator { typedef enum wmRadialControlMode { WM_RADIALCONTROL_SIZE, WM_RADIALCONTROL_STRENGTH, - WM_RADIALCONTROL_ANGLE + WM_RADIALCONTROL_ANGLE, } wmRadialControlMode; #endif /* DNA_WINDOWMANAGER_TYPES_H */ - diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index 2d62b81e81b..fc5307000e3 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -57,10 +57,6 @@ #include "BLO_sys_types.h" // for intptr_t support -#ifdef HAVE_CONFIG_H -#include -#endif - #define SDNA_MAX_FILENAME_LENGTH 255 @@ -335,8 +331,8 @@ int add_name(char *str) /* * Put )(void) at the end? Maybe )(). Should check this with - * old sdna. Actually, sometimes )(), sometimes )(void...) - * Alas.. such is the nature of braindamage :( + * old sdna. Actually, sometimes )(), sometimes )(void...) + * Alas.. such is the nature of braindamage :( * * Sorted it out: always do )(), except for headdraw and * windraw, part of ScrArea. This is important, because some @@ -920,7 +916,7 @@ int make_structDNA(char *baseDirectory, FILE *file) if (debugSDNA) printf("\tStart of header scan:\n"); for (i = 0; strlen(includefiles[i]); i++) { sprintf(str, "%s%s", baseDirectory, includefiles[i]); - if (debugSDNA) printf("\t|-- Converting %s\n", str); + if (debugSDNA) printf("\t|-- Converting %s\n", str); if (convert_include(str)) { return (1); } diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 89dd6a5c3e6..30cbc512f5a 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -217,6 +217,7 @@ extern StructRNA RNA_FModifierGenerator; extern StructRNA RNA_FModifierLimits; extern StructRNA RNA_FModifierNoise; extern StructRNA RNA_FModifierPython; +extern StructRNA RNA_FModifierStepped; extern StructRNA RNA_FollowPathConstraint; extern StructRNA RNA_Function; extern StructRNA RNA_GameBooleanProperty; @@ -257,6 +258,7 @@ extern StructRNA RNA_KeyConfig; extern StructRNA RNA_Keyframe; extern StructRNA RNA_KeyingSet; extern StructRNA RNA_KeyingSetPath; +extern StructRNA RNA_KeyingSetInfo; extern StructRNA RNA_KeyMap; extern StructRNA RNA_KeyMapItem; extern StructRNA RNA_KinematicConstraint; @@ -314,6 +316,7 @@ extern StructRNA RNA_MotionPath; extern StructRNA RNA_MotionPathVert; extern StructRNA RNA_MouseSensor; extern StructRNA RNA_MovieSequence; +extern StructRNA RNA_MulticamSequence; extern StructRNA RNA_MultiresModifier; extern StructRNA RNA_MusgraveTexture; extern StructRNA RNA_NandController; @@ -349,9 +352,11 @@ extern StructRNA RNA_ParticleHairKey; extern StructRNA RNA_ParticleInstanceModifier; extern StructRNA RNA_ParticleKey; extern StructRNA RNA_ParticleSettings; +extern StructRNA RNA_SPHFluidSettings; extern StructRNA RNA_ParticleSystem; extern StructRNA RNA_ParticleSystemModifier; extern StructRNA RNA_ParticleTarget; +extern StructRNA RNA_PivotConstraint; extern StructRNA RNA_PluginSequence; extern StructRNA RNA_PluginTexture; extern StructRNA RNA_PointCache; @@ -380,7 +385,9 @@ extern StructRNA RNA_Scene; extern StructRNA RNA_SceneGameData; extern StructRNA RNA_SceneRenderLayer; extern StructRNA RNA_SceneSequence; +extern StructRNA RNA_Scopes; extern StructRNA RNA_Screen; +extern StructRNA RNA_ScrewModifier; extern StructRNA RNA_Sculpt; extern StructRNA RNA_Sensor; extern StructRNA RNA_Sequence; @@ -431,7 +438,7 @@ extern StructRNA RNA_SolidifyModifier; extern StructRNA RNA_Sound; extern StructRNA RNA_SoundSequence; extern StructRNA RNA_Space; -extern StructRNA RNA_Space3DView; +extern StructRNA RNA_SpaceView3D; extern StructRNA RNA_SpaceConsole; extern StructRNA RNA_SpaceDopeSheetEditor; extern StructRNA RNA_SpaceFileBrowser; @@ -654,10 +661,12 @@ int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value); int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier); int RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, const char **identifier); int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name); +int RNA_enum_description(EnumPropertyItem *item, const int value, const char **description); void RNA_property_enum_items(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item, int *totitem, int *free); int RNA_property_enum_value(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value); int RNA_property_enum_identifier(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier); +int RNA_property_enum_name(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name); int RNA_property_enum_bitflag_identifiers(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier); StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop); @@ -742,6 +751,7 @@ void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop); void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr); int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key); void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop); +int RNA_property_collection_move(PointerRNA *ptr, PropertyRNA *prop, int key, int pos); /* copy/reset */ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, int index); @@ -761,10 +771,10 @@ char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, char *RNA_path_back(const char *path); int RNA_path_resolve(PointerRNA *ptr, const char *path, - PointerRNA *r_ptr, PropertyRNA **r_prop); + PointerRNA *r_ptr, PropertyRNA **r_prop); int RNA_path_resolve_full(PointerRNA *ptr, const char *path, - PointerRNA *r_ptr, PropertyRNA **r_prop, int *index); + PointerRNA *r_ptr, PropertyRNA **r_prop, int *index); char *RNA_path_from_ID_to_struct(PointerRNA *ptr); char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop); @@ -887,6 +897,8 @@ const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func); ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, FunctionRNA *func); void RNA_parameter_list_free(ParameterList *parms); int RNA_parameter_list_size(ParameterList *parms); +int RNA_parameter_list_arg_count(ParameterList *parms); +int RNA_parameter_list_ret_count(ParameterList *parms); void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter); void RNA_parameter_list_next(ParameterIterator *iter); diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h index 99bd79d5d90..88543e4add2 100644 --- a/source/blender/makesrna/RNA_define.h +++ b/source/blender/makesrna/RNA_define.h @@ -193,6 +193,7 @@ void RNA_def_func_duplicate_pointers(FunctionRNA *func); void RNA_def_func_free_pointers(FunctionRNA *func); void RNA_def_property_duplicate_pointers(PropertyRNA *prop); void RNA_def_property_free_pointers(PropertyRNA *prop); +int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *identifier); #ifdef __cplusplus } diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index ddd6dfef653..bb0a1ba2c52 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -48,6 +48,8 @@ extern EnumPropertyItem modifier_type_items[]; extern EnumPropertyItem constraint_type_items[]; extern EnumPropertyItem boidrule_type_items[]; +extern EnumPropertyItem image_type_items[]; + extern EnumPropertyItem beztriple_keyframe_type_items[]; extern EnumPropertyItem beztriple_handle_type_items[]; extern EnumPropertyItem beztriple_interpolation_mode_items[]; @@ -71,6 +73,10 @@ extern EnumPropertyItem unpack_method_items[]; extern EnumPropertyItem object_type_items[]; +extern EnumPropertyItem object_type_curve_items[]; + +extern EnumPropertyItem controller_type_items[]; + extern EnumPropertyItem space_type_items[]; extern EnumPropertyItem keymap_propvalue_items[]; @@ -82,15 +88,24 @@ extern EnumPropertyItem wm_report_items[]; extern EnumPropertyItem property_type_items[]; extern EnumPropertyItem property_unit_items[]; +extern EnumPropertyItem viewport_shading_items[]; + struct bContext; struct PointerRNA; EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *rna_Sensor_type_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *rna_Actuator_type_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); /* Generic functions, return an enum from library data, index is the position * in the linked list can add more for different types as needed */ EnumPropertyItem *RNA_action_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *RNA_action_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); EnumPropertyItem *RNA_group_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *RNA_group_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *RNA_image_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *RNA_image_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); EnumPropertyItem *RNA_scene_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *RNA_scene_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); #endif /* RNA_ENUM_TYPES */ diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index 178cdacf3c3..88058769f4b 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -78,7 +78,7 @@ typedef enum PropertyUnit { PROP_UNIT_AREA = (2<<16), /* m^2 */ PROP_UNIT_VOLUME = (3<<16), /* m^3 */ PROP_UNIT_MASS = (4<<16), /* kg */ - PROP_UNIT_ROTATION = (5<<16), /* rad */ + PROP_UNIT_ROTATION = (5<<16), /* radians */ PROP_UNIT_TIME = (6<<16), /* frame */ PROP_UNIT_VELOCITY = (7<<16), /* m/s */ PROP_UNIT_ACCELERATION = (8<<16) /* m/(s^2) */ @@ -118,6 +118,7 @@ typedef enum PropertySubType { PROP_QUATERNION = 27, PROP_AXISANGLE = 28, PROP_XYZ = 29, + PROP_XYZ_LENGTH = 29|PROP_UNIT_LENGTH, PROP_COLOR_GAMMA = 30, /* booleans */ @@ -245,8 +246,10 @@ typedef struct ParameterList { /* storage for parameters */ void *data; - /* store the parameter count */ - int tot; + /* store the parameter size */ + int alloc_size; + + int arg_count, ret_count; /* function passed at creation time */ struct FunctionRNA *func; @@ -328,17 +331,31 @@ typedef struct ExtensionRNA { /* fake struct definitions, needed otherwise collections end up owning the C * structs like 'Object' when defined first */ -#define MainCameras Main -#define MainScenes Main -#define MainArmatures Main -#define MainMaterials Main -#define MainMeshes Main -#define MainLamps Main -#define MainObjects Main -#define MainTexts Main -#define MainActions Main -#define MainGroups Main -#define MainTextures Main +#define MainActions Main +#define MainArmatures Main +#define MainBrushes Main +#define MainCameras Main +#define MainCurves Main +#define MainFonts Main +#define MainGreasePencils Main +#define MainGroups Main +#define MainImages Main +#define MainLamps Main +#define MainLattices Main +#define MainLibraries Main +#define MainMaterials Main +#define MainMeshes Main +#define MainMetaBalls Main +#define MainNodeTrees Main +#define MainObjects Main +#define MainParticles Main +#define MainScenes Main +#define MainScreens Main +#define MainSounds Main +#define MainTexts Main +#define MainTextures Main +#define MainWindowManagers Main +#define MainWorlds Main #ifdef __cplusplus } diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript index 38598cf8c95..7728152f1f1 100644 --- a/source/blender/makesrna/SConscript +++ b/source/blender/makesrna/SConscript @@ -6,7 +6,7 @@ objs = [] o = SConscript('intern/SConscript') objs += o -incs = '#/intern/guardedalloc ../blenkernel ../blenlib ../makesdna intern .' +incs = '#/intern/guardedalloc #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .' incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin' incs += ' ../render/extern/include ../bmesh' @@ -15,6 +15,9 @@ defs = [] if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') @@ -34,17 +37,17 @@ if env['WITH_BF_QUICKTIME']: if env['WITH_BF_LCMS']: defs.append('WITH_LCMS') - + incs += ' ' + env['BF_LCMS_INC'] + if env['WITH_BF_GAMEENGINE']: defs.append('GAMEBLENDER=1') if env['BF_UNIT_TEST']: defs.append('UNIT_TEST') - if env['OURPLATFORM'] == 'linux2': cflags='-pthread' - incs += ' ../../../extern/binreloc/include' + incs += ' ../../../extern/binreloc/include' if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 6a773da3d1f..27b303c4106 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -32,14 +32,30 @@ LIST(REMOVE_ITEM DEFSRC ${APISRC}) STRING(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}") SET(SRC - makesrna.c - rna_define.c - ${DEFSRC} - ${APISRC} - ../../../../intern/guardedalloc/intern/mallocn.c - ../../../../intern/guardedalloc/intern/mmap_win.c) + makesrna.c + rna_define.c + ${DEFSRC} + ${APISRC} + ../../../../intern/guardedalloc/intern/mallocn.c + ../../../../intern/guardedalloc/intern/mmap_win.c) + +INCLUDE_DIRECTORIES( + ../../../../intern/audaspace/intern + ../../../../intern/guardedalloc + .. + ../../makesdna + ../../blenkernel + ../../bmesh + ../../blenlib + ../../ikplugin + ../../windowmanager + ../../editors/include + ../../gpu + ../../imbuf + ../../render/extern/include + ../../../../extern/glew/include + . ) -INCLUDE_DIRECTORIES(../../../../intern/audaspace/intern ../../../../intern/guardedalloc .. ../../makesdna ../../blenkernel ../../blenlib ../../ikplugin ../../windowmanager ../../editors/include ../../bmesh ../../gpu ../../imbuf ../../render/extern/include .) FILE(GLOB INC_FILES ../*.h ../../makesdna/*.h) IF(NOT WITH_PYTHON) @@ -58,6 +74,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) @@ -76,6 +96,11 @@ IF(WITH_FFMPEG) ADD_DEFINITIONS(-DWITH_FFMPEG) ENDIF(WITH_FFMPEG) +IF(WITH_LCMS) + SET(INC ${INC} ${LCMS_INCLUDE_DIR}) + ADD_DEFINITIONS(-DWITH_LCMS) +ENDIF(WITH_LCMS) + IF(NOT WITH_ELBEEM) ADD_DEFINITIONS(-DDISABLE_ELBEEM) ENDIF(NOT WITH_ELBEEM) diff --git a/source/blender/makesrna/intern/Makefile b/source/blender/makesrna/intern/Makefile index 5afe55bb319..8aef06e762d 100644 --- a/source/blender/makesrna/intern/Makefile +++ b/source/blender/makesrna/intern/Makefile @@ -46,6 +46,7 @@ endif CFLAGS += $(LEVEL_1_C_WARNINGS) CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include +CPPFLAGS += -I../../../../intern/audaspace/intern CPPFLAGS += -I../../blenlib CPPFLAGS += -I../../blenkernel CPPFLAGS += -I../../imbuf @@ -91,6 +92,10 @@ ifeq ($(WITH_OPENAL),true) CPPFLAGS += -DWITH_OPENAL endif +ifeq ($(WITH_TIFF),true) + CPPFLAGS += -DWITH_TIFF +endif + ifeq ($(OS),windows) # Windows needs these extra libs because of winstuff... It is not # _really_ needed, but it is the easiest fix for now. If you have diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript index d757f6293a0..8caabb3b1c3 100644 --- a/source/blender/makesrna/intern/SConscript +++ b/source/blender/makesrna/intern/SConscript @@ -33,10 +33,14 @@ incs = '#/intern/guardedalloc ../../blenlib ../../blenkernel' incs += ' ../../imbuf ../../makesdna ../../makesrna ../../ikplugin' incs += ' ../../windowmanager ../../editors/include' incs += ' ../../render/extern/include ../../bmesh' +incs += ' #/intern/audaspace/intern' if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 15d5658160d..40f6c1de67e 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -82,6 +82,7 @@ static int replace_if_different(char *tmpfile) if(fp_new==NULL) { /* shouldn't happen, just to be safe */ fprintf(stderr, "%s:%d, open error: \"%s\"\n", __FILE__, __LINE__, tmpfile); + fclose(fp_org); return -1; } @@ -485,13 +486,13 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr if(dp->dnaarraylength == 1) { if(prop->type == PROP_BOOLEAN && dp->booleanbit) - fprintf(f, " values[i]= (%s(data->%s & (%d<booleannegative)? "!": "", dp->dnaname, dp->booleanbit); + fprintf(f, " values[i]= %s((data->%s & (%d<booleannegative)? "!": "", dp->dnaname, dp->booleanbit); else fprintf(f, " values[i]= (%s)%s((&data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname); } else { if(prop->type == PROP_BOOLEAN && dp->booleanbit) { - fprintf(f, " values[i]= (%s(data->%s[i] & ", (dp->booleannegative)? "!": "", dp->dnaname); + fprintf(f, " values[i]= %s((data->%s[i] & ", (dp->booleannegative)? "!": "", dp->dnaname); rna_int_print(f, dp->booleanbit); fprintf(f, ") != 0);\n"); } @@ -516,7 +517,7 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr else { rna_print_data_get(f, dp); if(prop->type == PROP_BOOLEAN && dp->booleanbit) { - fprintf(f, " return (%s((data->%s) & ", (dp->booleannegative)? "!": "", dp->dnaname); + fprintf(f, " return %s(((data->%s) & ", (dp->booleannegative)? "!": "", dp->dnaname); rna_int_print(f, dp->booleanbit); fprintf(f, ") != 0);\n"); } @@ -846,6 +847,98 @@ static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA * return func; } +static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc, char *nextfunc) +{ + char *func; + + if(prop->flag & PROP_IDPROPERTY) + return NULL; + + if(!manualfunc) { + if(!dp->dnastructname || !dp->dnaname) + return NULL; + + /* only supported in case of standard next functions */ + if(strcmp(nextfunc, "rna_iterator_array_next") == 0); + else if(strcmp(nextfunc, "rna_iterator_listbase_next") == 0); + else return NULL; + } + + func= rna_alloc_function_name(srna->identifier, prop->identifier, "lookup_int"); + + fprintf(f, "PointerRNA %s(PointerRNA *ptr, int index)\n", func); + fprintf(f, "{\n"); + + if(manualfunc) { + fprintf(f, "\n return %s(ptr, index);\n", manualfunc); + fprintf(f, "}\n\n"); + return func; + } + + fprintf(f, " PointerRNA r_ptr;\n"); + fprintf(f, " CollectionPropertyIterator iter;\n\n"); + + fprintf(f, " %s_%s_begin(&iter, ptr);\n\n", srna->identifier, prop->identifier); + fprintf(f, " {\n"); + + if(strcmp(nextfunc, "rna_iterator_array_next") == 0) { + fprintf(f, " ArrayIterator *internal= iter.internal;\n"); + fprintf(f, " if(internal->skip) {\n"); + fprintf(f, " while(index-- > 0) {\n"); + fprintf(f, " do {\n"); + fprintf(f, " internal->ptr += internal->itemsize;\n"); + fprintf(f, " } while(internal->skip(&iter, internal->ptr));\n"); + fprintf(f, " }\n"); + fprintf(f, " }\n"); + fprintf(f, " else {\n"); + fprintf(f, " internal->ptr += internal->itemsize*index;\n"); + fprintf(f, " }\n"); + } + else if(strcmp(nextfunc, "rna_iterator_listbase_next") == 0) { + fprintf(f, " ListBaseIterator *internal= iter.internal;\n"); + fprintf(f, " if(internal->skip) {\n"); + fprintf(f, " while(index-- > 0) {\n"); + fprintf(f, " do {\n"); + fprintf(f, " internal->link= internal->link->next;\n"); + fprintf(f, " } while(internal->skip(&iter, internal->link));\n"); + fprintf(f, " }\n"); + fprintf(f, " }\n"); + fprintf(f, " else {\n"); + fprintf(f, " while(index-- > 0)\n"); + fprintf(f, " internal->link= internal->link->next;\n"); + fprintf(f, " }\n"); + } + + fprintf(f, " }\n\n"); + + fprintf(f, " r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier); + fprintf(f, " %s_%s_end(&iter);\n\n", srna->identifier, prop->identifier); + + fprintf(f, " return r_ptr;\n"); + +#if 0 + rna_print_data_get(f, dp); + item_type= (cprop->item_type)? (char*)cprop->item_type: "UnknownType"; + + if(dp->dnalengthname || dp->dnalengthfixed) { + if(dp->dnalengthname) + fprintf(f, "\n rna_array_lookup_int(ptr, &RNA_%s, data->%s, sizeof(data->%s[0]), data->%s, index);\n", item_type, dp->dnaname, dp->dnaname, dp->dnalengthname); + else + fprintf(f, "\n rna_array_lookup_int(ptr, &RNA_%s, data->%s, sizeof(data->%s[0]), %d, index);\n", item_type, dp->dnaname, dp->dnaname, dp->dnalengthfixed); + } + else { + if(dp->dnapointerlevel == 0) + fprintf(f, "\n return rna_listbase_lookup_int(ptr, &RNA_%s, &data->%s, index);\n", item_type, dp->dnaname); + else + fprintf(f, "\n return rna_listbase_lookup_int(ptr, &RNA_%s, data->%s, index);\n", item_type, dp->dnaname); + } +#endif + + fprintf(f, "}\n\n"); + + return func; +} + static char *rna_def_property_next_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc) { char *func, *getfunc; @@ -1015,6 +1108,7 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp) } case PROP_COLLECTION: { CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop; + char *nextfunc= (char*)cprop->next; if(dp->dnatype && strcmp(dp->dnatype, "ListBase")==0); else if(dp->dnalengthname || dp->dnalengthfixed) @@ -1031,6 +1125,7 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp) cprop->begin= (void*)rna_def_property_begin_func(f, srna, prop, dp, (char*)cprop->begin); cprop->next= (void*)rna_def_property_next_func(f, srna, prop, dp, (char*)cprop->next); cprop->end= (void*)rna_def_property_end_func(f, srna, prop, dp, (char*)cprop->end); + cprop->lookupint= (void*)rna_def_property_lookup_int_func(f, srna, prop, dp, (char*)cprop->lookupint, nextfunc); if(!(prop->flag & PROP_IDPROPERTY)) { if(!cprop->begin) { @@ -1542,7 +1637,7 @@ static const char *rna_property_typename(PropertyType type) } } -static const char *rna_property_subtypename(PropertyType type) +static const char *rna_property_subtypename(PropertySubType type) { switch(type) { case PROP_NONE: return "PROP_NONE"; @@ -1592,7 +1687,7 @@ static const char *rna_property_subtype_unit(PropertyType type) case PROP_UNIT_TIME: return "PROP_UNIT_TIME"; case PROP_UNIT_VELOCITY: return "PROP_UNIT_VELOCITY"; case PROP_UNIT_ACCELERATION:return "PROP_UNIT_ACCELERATION"; - default: return "PROP_UNKNOWN"; + default: return "PROP_UNIT_UNKNOWN"; } } @@ -2142,7 +2237,7 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_action.c", "rna_action_api.c", RNA_def_action}, {"rna_animation.c", "rna_animation_api.c", RNA_def_animation}, {"rna_animviz.c", NULL, RNA_def_animviz}, - {"rna_actuator.c", NULL, RNA_def_actuator}, + {"rna_actuator.c", "rna_actuator_api.c", RNA_def_actuator}, {"rna_armature.c", "rna_armature_api.c", RNA_def_armature}, {"rna_boid.c", NULL, RNA_def_boid}, {"rna_brush.c", NULL, RNA_def_brush}, @@ -2151,7 +2246,7 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_color.c", NULL, RNA_def_color}, {"rna_constraint.c", NULL, RNA_def_constraint}, {"rna_context.c", NULL, RNA_def_context}, - {"rna_controller.c", NULL, RNA_def_controller}, + {"rna_controller.c", "rna_controller_api.c", RNA_def_controller}, {"rna_curve.c", NULL, RNA_def_curve}, {"rna_fcurve.c", "rna_fcurve_api.c", RNA_def_fcurve}, {"rna_fluidsim.c", NULL, RNA_def_fluidsim}, @@ -2178,8 +2273,8 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_scene.c", "rna_scene_api.c", RNA_def_scene}, {"rna_screen.c", NULL, RNA_def_screen}, {"rna_sculpt_paint.c", NULL, RNA_def_sculpt_paint}, - {"rna_sensor.c", NULL, RNA_def_sensor}, - {"rna_sequencer.c", NULL, RNA_def_sequencer}, + {"rna_sensor.c", "rna_sensor_api.c", RNA_def_sensor}, + {"rna_sequencer.c", "rna_sequencer_api.c", RNA_def_sequencer}, {"rna_smoke.c", NULL, RNA_def_smoke}, {"rna_space.c", NULL, RNA_def_space}, {"rna_test.c", NULL, RNA_def_test}, @@ -2200,8 +2295,8 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_fi FunctionDefRNA *dfunc; fprintf(f, "\n/* Automatically generated struct definitions for the Data API.\n" - " Do not edit manually, changes will be overwritten. */\n\n" - "#define RNA_RUNTIME\n\n"); + " Do not edit manually, changes will be overwritten. */\n\n" + "#define RNA_RUNTIME\n\n"); fprintf(f, "#include \n"); fprintf(f, "#include \n"); @@ -2276,7 +2371,7 @@ static void rna_generate_header(BlenderRNA *brna, FILE *f) fprintf(f, "#define __RNA_BLENDER_H__\n\n"); fprintf(f, "/* Automatically generated function declarations for the Data API.\n" - " Do not edit manually, changes will be overwritten. */\n\n"); + " Do not edit manually, changes will be overwritten. */\n\n"); fprintf(f, "#include \"RNA_types.h\"\n\n"); @@ -2431,7 +2526,7 @@ static void rna_generate_header_cpp(BlenderRNA *brna, FILE *f) fprintf(f, "#define __RNA_BLENDER_CPP_H__\n\n"); fprintf(f, "/* Automatically generated classes for the Data API.\n" - " Do not edit manually, changes will be overwritten. */\n\n"); + " Do not edit manually, changes will be overwritten. */\n\n"); fprintf(f, "#include \"RNA_blender.h\"\n"); fprintf(f, "#include \"RNA_types.h\"\n"); diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index c47bd74b1fb..009afec2ded 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -27,7 +27,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "DNA_ID.h" @@ -246,6 +245,12 @@ ID *rna_ID_copy(ID *id) return NULL; } +void rna_ID_user_clear(ID *id) +{ + id->us= 0; /* dont save */ + id->flag &= ~LIB_FAKEUSER; +} + #else static void rna_def_ID_properties(BlenderRNA *brna) @@ -372,6 +377,9 @@ static void rna_def_ID(BlenderRNA *brna) parm= RNA_def_pointer(func, "id", "ID", "", "New copy of the ID."); RNA_def_function_return(func, parm); + func= RNA_def_function(srna, "user_clear", "rna_ID_user_clear"); + RNA_def_function_ui_description(func, "Clears the user count of a datablock so its not saved, on reload the data will be removed."); + func= RNA_def_function(srna, "animation_data_create", "BKE_id_add_animdata"); RNA_def_function_ui_description(func, "Create animation data to this ID, note that not all ID types support this."); parm= RNA_def_pointer(func, "anim_data", "AnimData", "", "New animation data or NULL."); @@ -391,10 +399,14 @@ static void rna_def_library(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Library", "External .blend file from which data is linked"); RNA_def_struct_ui_icon(srna, ICON_LIBRARY_DATA_DIRECT); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Filename", "Path to the library .blend file"); + RNA_def_property_ui_text(prop, "File Path", "Path to the library .blend file"); + /* TODO - lib->filename isnt updated, however the outliner also skips this, probably only needed on read. */ + + prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Library"); + RNA_def_property_ui_text(prop, "Parent", ""); } void RNA_def_ID(BlenderRNA *brna) { diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 4cc5ca6f9df..36c8764b3f4 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -47,7 +47,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" /* flush updates */ #include "DNA_object_types.h" @@ -65,7 +64,7 @@ void RNA_init() for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) { if(!srna->cont.prophash) { - srna->cont.prophash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp); + srna->cont.prophash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "RNA_init gh"); for(prop=srna->cont.properties.first; prop; prop=prop->next) if(!(prop->flag & PROP_BUILTIN)) @@ -961,7 +960,8 @@ int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value) } } -/* this is the max length including \0 terminator */ +/* this is the max length including \0 terminator. + * '0' used when their is no maximum */ int RNA_property_string_maxlength(PropertyRNA *prop) { StringPropertyRNA *sprop= (StringPropertyRNA*)rna_ensure_property(prop); @@ -1086,6 +1086,17 @@ int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name) return 0; } +int RNA_enum_description(EnumPropertyItem *item, const int value, const char **description) +{ + for (; item->identifier; item++) { + if(item->identifier[0] && item->value==value) { + *description = item->description; + return 1; + } + } + return 0; +} + int RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier) { EnumPropertyItem *item= NULL; @@ -1102,6 +1113,22 @@ int RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop return 0; } +int RNA_property_enum_name(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name) +{ + EnumPropertyItem *item= NULL; + int result, free; + + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + if(item) { + result= RNA_enum_name(item, value, name); + if(free) + MEM_freeN(item); + + return result; + } + return 0; +} + int RNA_property_enum_bitflag_identifiers(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier) { EnumPropertyItem *item= NULL; @@ -1215,7 +1242,7 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR else { /* WARNING! This is so property drivers update the display! * not especially nice */ - DAG_id_flush_update(ptr->id.data, OB_RECALC); + DAG_id_flush_update(ptr->id.data, OB_RECALC_ALL); WM_main_add_notifier(NC_WINDOW, NULL); } @@ -1814,18 +1841,15 @@ void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *val IDProperty *idprop; if((idprop=rna_idproperty_check(&prop, ptr))) - IDP_AssignString(idprop, (char*)value); + IDP_AssignString(idprop, (char*)value, RNA_property_string_maxlength(prop) - 1); else if(sprop->set) - sprop->set(ptr, value); + sprop->set(ptr, value); /* set function needs to clamp its self */ else if(prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; IDProperty *group; - val.str= (char*)value; - group= RNA_struct_idproperties(ptr, 1); if(group) - IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier)); + IDP_AddToGroup(group, IDP_NewString((char*)value, (char*)prop->identifier, RNA_property_string_maxlength(prop) - 1)); } } @@ -2172,6 +2196,34 @@ int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key) return 0; } +int RNA_property_collection_move(PointerRNA *ptr, PropertyRNA *prop, int key, int pos) +{ + IDProperty *idprop; + + if((idprop=rna_idproperty_check(&prop, ptr))) { + IDProperty tmp, *array; + int len; + + len= idprop->len; + array= IDP_IDPArray(idprop); + + if(key >= 0 && key < len && pos >= 0 && pos < len && key != pos) { + memcpy(&tmp, &array[key], sizeof(IDProperty)); + if(pos < key) + memmove(array+pos+1, array+pos, sizeof(IDProperty)*(key - pos)); + else + memmove(array+key, array+key+1, sizeof(IDProperty)*(pos - key)); + memcpy(&array[pos], &tmp, sizeof(IDProperty)); + } + + return 1; + } + else if(prop->flag & PROP_IDPROPERTY) + return 1; + + return 0; +} + void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop) { IDProperty *idprop; @@ -2708,6 +2760,12 @@ void rna_iterator_listbase_end(CollectionPropertyIterator *iter) iter->internal= NULL; } +PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct ListBase *lb, int index) +{ + void *data= BLI_findlink(lb, index); + return rna_pointer_inherit_refine(ptr, type, data); +} + void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, int free_ptr, IteratorSkipFunc skip) { ArrayIterator *internal; @@ -2772,6 +2830,14 @@ void rna_iterator_array_end(CollectionPropertyIterator *iter) iter->internal= NULL; } +PointerRNA rna_array_lookup_int(PointerRNA *ptr, StructRNA *type, void *data, int itemsize, int length, int index) +{ + if(index < 0 || index >= length) + return PointerRNA_NULL; + + return rna_pointer_inherit_refine(ptr, type, ((char*)data) + index*itemsize); +} + /* RNA Path - Experiment */ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket) @@ -3716,15 +3782,24 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, { PropertyRNA *parm; void *data; - int tot= 0, size; + int alloc_size= 0, size; + parms->arg_count= 0; + parms->ret_count= 0; + /* allocate data */ - for(parm= func->cont.properties.first; parm; parm= parm->next) - tot+= rna_parameter_size_alloc(parm); + for(parm= func->cont.properties.first; parm; parm= parm->next) { + alloc_size += rna_parameter_size_alloc(parm); - parms->data= MEM_callocN(tot, "RNA_parameter_list_create"); + if(parm->flag & PROP_OUTPUT) + parms->ret_count++; + else + parms->arg_count++; + } + + parms->data= MEM_callocN(alloc_size, "RNA_parameter_list_create"); parms->func= func; - parms->tot= tot; + parms->alloc_size= alloc_size; /* set default values */ data= parms->data; @@ -3798,7 +3873,17 @@ void RNA_parameter_list_free(ParameterList *parms) int RNA_parameter_list_size(ParameterList *parms) { - return parms->tot; + return parms->alloc_size; +} + +int RNA_parameter_list_arg_count(ParameterList *parms) +{ + return parms->arg_count; +} + +int RNA_parameter_list_ret_count(ParameterList *parms) +{ + return parms->ret_count; } void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter) @@ -4104,7 +4189,7 @@ static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, Prop if(prop->flag & PROP_RNAPTR) { *((PointerRNA*)dest)= *((PointerRNA*)src); break; - } + } if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) { fprintf(stderr, "%s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna)); diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c index e642d9546e8..1f542e2babe 100644 --- a/source/blender/makesrna/intern/rna_action.c +++ b/source/blender/makesrna/intern/rna_action.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -35,11 +34,16 @@ #include "MEM_guardedalloc.h" +#include "BKE_action.h" + #include "WM_types.h" #ifdef RNA_RUNTIME +#include "ED_keyframing.h" +#include "BKE_fcurve.h" + static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter) { ListBaseIterator *internal= iter->internal; @@ -55,6 +59,95 @@ static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter) iter->valid= (internal->link != NULL); } +static bActionGroup *rna_Action_groups_add(bAction *act, char name[]) +{ + return action_groups_add_new(act, name); +} + +static void rna_Action_groups_remove(bAction *act, ReportList *reports, bActionGroup *agrp) +{ + FCurve *fcu, *fcn; + + /* try to remove the F-Curve from the action */ + if (!BLI_remlink_safe(&act->groups, agrp)) { + BKE_reportf(reports, RPT_ERROR, "ActionGroup '%s' not found in action '%s'", agrp->name, act->id.name+2); + return; + } + + /* move every one one of the group's F-Curves out into the Action again */ + for (fcu= agrp->channels.first; (fcu) && (fcu->grp==agrp); fcu=fcn) { + fcn= fcu->next; + + /* remove from group */ + action_groups_remove_channel(act, fcu); + + /* tack onto the end */ + BLI_addtail(&act->curves, fcu); + } + + /* XXX, invalidates PyObject */ + MEM_freeN(agrp); +} + +static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, char *data_path, int index, char *group) +{ + if(group && group[0]=='\0') group= NULL; + + if(data_path[0] == '\0') { + BKE_report(reports, RPT_ERROR, "FCurve data path empty, invalid argument"); + return NULL; + } + + /* annoying, check if this exists */ + if(verify_fcurve(act, group, data_path, index, 0)) { + BKE_reportf(reports, RPT_ERROR, "FCurve '%s[%d]' alredy exists in action '%s'", data_path, index, act->id.name+2); + return NULL; + } + return verify_fcurve(act, group, data_path, index, 1); +} + +static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, FCurve *fcu) +{ + if(fcu->grp) { + if (BLI_findindex(&act->groups, fcu->grp) == -1) { + BKE_reportf(reports, RPT_ERROR, "FCurve's ActionGroup '%s' not found in action '%s'", fcu->grp->name, act->id.name+2); + return; + } + + action_groups_remove_channel(act, fcu); + } + else { + if(BLI_findindex(&act->curves, fcu) == -1) { + BKE_reportf(reports, RPT_ERROR, "FCurve not found in action '%s'", act->id.name+2); + return; + } + + BLI_remlink(&act->curves, fcu); + free_fcurve(fcu); + } +} + +static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports, char name[]) +{ + TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker"); + marker->flag= 1; + marker->frame= 1; + BLI_strncpy(marker->name, name, sizeof(marker->name)); + BLI_addtail(&act->markers, marker); + return marker; +} + +static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, TimeMarker *marker) +{ + if (!BLI_remlink_safe(&act->markers, marker)) { + BKE_reportf(reports, RPT_ERROR, "TimelineMarker '%s' not found in action '%s'", marker->name, act->id.name+2); + return; + } + + /* XXX, invalidates PyObject */ + MEM_freeN(marker); +} + #else static void rna_def_dopesheet(BlenderRNA *brna) @@ -76,39 +169,45 @@ static void rna_def_dopesheet(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLYSEL); RNA_def_property_ui_text(prop, "Only Selected", "Only include channels relating to selected objects and data"); RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); + + prop= RNA_def_property(srna, "display_hidden", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_INCL_HIDDEN); + RNA_def_property_ui_text(prop, "Display Hidden", "Include channels from objects/bone that aren't visible"); + RNA_def_property_ui_icon(prop, ICON_GHOST_ENABLED, 0); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); /* Object Group Filtering Settings */ prop= RNA_def_property(srna, "only_group_objects", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLYOBGROUP); RNA_def_property_ui_text(prop, "Only Objects in Group", "Only include channels from Objects in the specified Group"); RNA_def_property_ui_icon(prop, ICON_GROUP, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "filtering_group", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "filter_grp"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Filtering Group", "Group that included Object should be a member of"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); /* NLA Specific Settings */ prop= RNA_def_property(srna, "include_missing_nla", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NLA_NOACT); RNA_def_property_ui_text(prop, "Include Missing NLA", "Include Animation Data blocks with no NLA data. (NLA Editor only)"); RNA_def_property_ui_icon(prop, ICON_ACTION, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); /* Summary Settings (DopeSheet editors only) */ prop= RNA_def_property(srna, "display_summary", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_SUMMARY); RNA_def_property_ui_text(prop, "Display Summary", "Display an additional 'summary' line. (DopeSheet Editors only)"); RNA_def_property_ui_icon(prop, ICON_BORDERMOVE, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "collapse_summary", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ADS_FLAG_SUMMARY_COLLAPSED); RNA_def_property_ui_text(prop, "Collapse Summary", "Collapse summary when shown, so all other channels get hidden. (DopeSheet Editors Only)"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); /* General DataType Filtering Settings */ @@ -116,85 +215,85 @@ static void rna_def_dopesheet(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOOBJ); RNA_def_property_ui_text(prop, "Display Transforms", "Include visualization of Object-level Animation data (mostly Transforms)"); RNA_def_property_ui_icon(prop, ICON_MANIPUL, 0); // XXX? - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_shapekeys", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOSHAPEKEYS); RNA_def_property_ui_text(prop, "Display Shapekeys", "Include visualization of ShapeKey related Animation data"); RNA_def_property_ui_icon(prop, ICON_SHAPEKEY_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_mesh", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMESH); RNA_def_property_ui_text(prop, "Display Meshes", "Include visualization of Mesh related Animation data"); RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_camera", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCAM); RNA_def_property_ui_text(prop, "Display Camera", "Include visualization of Camera related Animation data"); RNA_def_property_ui_icon(prop, ICON_CAMERA_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_material", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMAT); RNA_def_property_ui_text(prop, "Display Material", "Include visualization of Material related Animation data"); RNA_def_property_ui_icon(prop, ICON_MATERIAL_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_lamp", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOLAM); RNA_def_property_ui_text(prop, "Display Lamp", "Include visualization of Lamp related Animation data"); RNA_def_property_ui_icon(prop, ICON_LAMP_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_texture", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOTEX); RNA_def_property_ui_text(prop, "Display Texture", "Include visualization of Texture related Animation data"); RNA_def_property_ui_icon(prop, ICON_TEXTURE_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_curve", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCUR); RNA_def_property_ui_text(prop, "Display Curve", "Include visualization of Curve related Animation data"); RNA_def_property_ui_icon(prop, ICON_CURVE_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_world", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOWOR); RNA_def_property_ui_text(prop, "Display World", "Include visualization of World related Animation data"); RNA_def_property_ui_icon(prop, ICON_WORLD_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_scene", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOSCE); RNA_def_property_ui_text(prop, "Display Scene", "Include visualization of Scene related Animation data"); RNA_def_property_ui_icon(prop, ICON_SCENE_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_particle", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOPART); RNA_def_property_ui_text(prop, "Display Particle", "Include visualization of Particle related Animation data"); RNA_def_property_ui_icon(prop, ICON_PARTICLE_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_metaball", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMBA); RNA_def_property_ui_text(prop, "Display Metaball", "Include visualization of Metaball related Animation data"); RNA_def_property_ui_icon(prop, ICON_META_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_armature", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOARM); RNA_def_property_ui_text(prop, "Display Armature", "Include visualization of Armature related Animation data"); RNA_def_property_ui_icon(prop, ICON_ARMATURE_DATA, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "display_node", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NONTREE); RNA_def_property_ui_text(prop, "Display Node", "Include visualization of Node related Animation data"); RNA_def_property_ui_icon(prop, ICON_NODETREE, 0); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); } static void rna_def_action_group(BlenderRNA *brna) @@ -209,14 +308,17 @@ static void rna_def_action_group(BlenderRNA *brna) prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", ""); RNA_def_struct_name_property(srna, prop); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); /* WARNING: be very careful when working with this list, since the endpoint is not * defined like a standard ListBase. Adding/removing channels from this list needs * extreme care, otherwise the F-Curve list running through adjacent groups does * not match up with the one stored in the Action, resulting in curves which do not - * show up in animation editors. For that reason, such operations are currently - * prohibited. + * show up in animation editors. In extreme cases, animation may also selectively + * fail to play back correctly. + * + * If such changes are required, these MUST go through the API functions for manipulating + * these F-Curve groupings. Also, note that groups only apply in actions ONLY. */ prop= RNA_def_property(srna, "channels", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "channels", NULL); @@ -227,22 +329,109 @@ static void rna_def_action_group(BlenderRNA *brna) prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_SELECTED); RNA_def_property_ui_text(prop, "Selected", "Action Group is selected"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_SELECT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_SELECTED, NULL); prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_PROTECTED); RNA_def_property_ui_text(prop, "Locked", "Action Group is locked"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_EXPANDED); RNA_def_property_ui_text(prop, "Expanded", "Action Group is expanded"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "custom_color", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "customCol"); RNA_def_property_ui_text(prop, "Custom Color", "Index of custom color set"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); +} + +/* fcurve.keyframe_points */ +static void rna_def_action_groups(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "ActionGroups"); + srna= RNA_def_struct(brna, "ActionGroups", NULL); + RNA_def_struct_sdna(srna, "bAction"); + RNA_def_struct_ui_text(srna, "Action Groups", "Collection of action groups"); + + func= RNA_def_function(srna, "add", "rna_Action_groups_add"); + RNA_def_function_ui_description(func, "Add a keyframe to the curve."); + parm= RNA_def_string(func, "name", "Group", 0, "", "New name for the action group."); + RNA_def_property_flag(parm, PROP_REQUIRED); + + parm= RNA_def_pointer(func, "action_group", "ActionGroup", "", "Newly created action group"); + RNA_def_function_return(func, parm); + + + func= RNA_def_function(srna, "remove", "rna_Action_groups_remove"); + RNA_def_function_ui_description(func, "Remove action group."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "action_group", "ActionGroup", "", "Action group to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); +} + +static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "ActionFCurves"); + srna= RNA_def_struct(brna, "ActionFCurves", NULL); + RNA_def_struct_sdna(srna, "bAction"); + RNA_def_struct_ui_text(srna, "Action FCurves", "Collection of action fcurves"); + + func= RNA_def_function(srna, "new", "rna_Action_fcurve_new"); + RNA_def_function_ui_description(func, "Add a keyframe to the curve."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_string(func, "data_path", "", 0, "Data Path", "FCurve data path to use."); + parm= RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX); + parm= RNA_def_string(func, "action_group", "", 0, "Action Group", "Acton group to add this fcurve into."); + + parm= RNA_def_pointer(func, "fcurve", "FCurve", "", "Newly created fcurve"); + RNA_def_function_return(func, parm); + + + func= RNA_def_function(srna, "remove", "rna_Action_fcurve_remove"); + RNA_def_function_ui_description(func, "Remove action group."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "fcurve", "FCurve", "", "FCurve to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); +} + +static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "ActionPoseMarkers"); + srna= RNA_def_struct(brna, "ActionPoseMarkers", NULL); + RNA_def_struct_sdna(srna, "bAction"); + RNA_def_struct_ui_text(srna, "Action Pose Markers", "Collection of timeline markers"); + + func= RNA_def_function(srna, "new", "rna_Action_pose_markers_new"); + RNA_def_function_ui_description(func, "Add a pose marker to the action."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_string(func, "name", "Marker", 0, "", "New name for the marker (not unique)."); + RNA_def_property_flag(parm, PROP_REQUIRED); + + parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Newly created marker"); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Action_pose_markers_remove"); + RNA_def_function_ui_description(func, "Remove a timeline marker."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); } static void rna_def_action(BlenderRNA *brna) @@ -259,16 +448,19 @@ static void rna_def_action(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "curves", NULL); RNA_def_property_struct_type(prop, "FCurve"); RNA_def_property_ui_text(prop, "F-Curves", "The individual F-Curves that make up the Action"); + rna_def_action_fcurves(brna, prop); prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "groups", NULL); RNA_def_property_struct_type(prop, "ActionGroup"); RNA_def_property_ui_text(prop, "Groups", "Convenient groupings of F-Curves"); + rna_def_action_groups(brna, prop); prop= RNA_def_property(srna, "pose_markers", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "markers", NULL); RNA_def_property_struct_type(prop, "TimelineMarker"); RNA_def_property_ui_text(prop, "Pose Markers", "Markers specific to this Action, for labeling poses"); + rna_def_action_pose_markers(brna, prop); RNA_api_action(srna); } diff --git a/source/blender/makesrna/intern/rna_action_api.c b/source/blender/makesrna/intern/rna_action_api.c index b09e91f1119..0304ef2b0bd 100644 --- a/source/blender/makesrna/intern/rna_action_api.c +++ b/source/blender/makesrna/intern/rna_action_api.c @@ -30,7 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "DNA_action_types.h" diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 0cb8ff39a89..f07cc6fd419 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -25,26 +25,52 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" - +#include "DNA_constraint_types.h" +#include "DNA_object_types.h" #include "DNA_actuator_types.h" #include "DNA_scene_types.h" // for MAXFRAME #include "WM_types.h" +/* Always keep in alphabetical order */ +EnumPropertyItem actuator_type_items[] ={ + {ACT_ACTION, "ACTION", 0, "Action", ""}, + {ACT_ARMATURE, "ARMATURE", 0, "Armature", ""}, + {ACT_CAMERA, "CAMERA", 0, "Camera", ""}, + {ACT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""}, + {ACT_EDIT_OBJECT, "EDIT_OBJECT", 0, "Edit Object", ""}, + {ACT_IPO, "F-Curve", 0, "F-Curve", ""}, + {ACT_2DFILTER, "FILTER_2D", 0, "Filter 2D", ""}, + {ACT_GAME, "GAME", 0, "Game", ""}, + {ACT_MESSAGE, "MESSAGE", 0, "Message", ""}, + {ACT_OBJECT, "OBJECT", 0, "Motion", ""}, + {ACT_PARENT, "PARENT", 0, "Parent", ""}, + {ACT_PROPERTY, "PROPERTY", 0, "Property", ""}, + {ACT_RANDOM, "RANDOM", 0, "Random", ""}, + {ACT_SCENE, "SCENE", 0, "Scene", ""}, + {ACT_SHAPEACTION, "SHAPE_ACTION", 0, "Shape Action", ""}, + {ACT_SOUND, "SOUND", 0, "Sound", ""}, + {ACT_STATE, "STATE", 0, "State", ""}, + {ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME +#include "BKE_sca.h" + static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr) { bActuator *actuator= (bActuator*)ptr->data; switch(actuator->type) { + case ACT_ACTION: + return &RNA_ActionActuator; case ACT_OBJECT: return &RNA_ObjectActuator; case ACT_IPO: - return &RNA_IpoActuator; + return &RNA_FcurveActuator; case ACT_CAMERA: return &RNA_CameraActuator; case ACT_SOUND: @@ -66,7 +92,7 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr) case ACT_VISIBILITY: return &RNA_VisibilityActuator; case ACT_2DFILTER: - return &RNA_TwoDFilterActuator; + return &RNA_Filter2DActuator; case ACT_PARENT: return &RNA_ParentActuator; case ACT_SHAPEACTION: @@ -80,6 +106,354 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr) } } +static void rna_Actuator_type_set(struct PointerRNA *ptr, int value) +{ + bActuator *act= (bActuator *)ptr->data; + if (value != act->type) + { + act->type = value; + init_actuator(act); + } +} + +static float rna_ConstraintActuator_limitmin_get(struct PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->flag & ACT_CONST_LOCX) fp= ca->minloc; + else if(ca->flag & ACT_CONST_LOCY) fp= ca->minloc+1; + else if(ca->flag & ACT_CONST_LOCZ) fp= ca->minloc+2; + else if(ca->flag & ACT_CONST_ROTX) fp= ca->minrot; + else if(ca->flag & ACT_CONST_ROTY) fp= ca->minrot+1; + else fp= ca->minrot+2; + + return *fp; +} + +static void rna_ConstraintActuator_limitmin_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->flag & ACT_CONST_LOCX) fp= ca->minloc; + else if(ca->flag & ACT_CONST_LOCY) fp= ca->minloc+1; + else if(ca->flag & ACT_CONST_LOCZ) fp= ca->minloc+2; + else if(ca->flag & ACT_CONST_ROTX) fp= ca->minrot; + else if(ca->flag & ACT_CONST_ROTY) fp= ca->minrot+1; + else fp= ca->minrot+2; + + *fp = value; +} + +static float rna_ConstraintActuator_limitmax_get(struct PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->flag & ACT_CONST_LOCX) fp= ca->maxloc; + else if(ca->flag & ACT_CONST_LOCY) fp= ca->maxloc+1; + else if(ca->flag & ACT_CONST_LOCZ) fp= ca->maxloc+2; + else if(ca->flag & ACT_CONST_ROTX) fp= ca->maxrot; + else if(ca->flag & ACT_CONST_ROTY) fp= ca->maxrot+1; + else fp= ca->maxrot+2; + + return *fp; +} + +static void rna_ConstraintActuator_limitmax_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->flag & ACT_CONST_LOCX) fp= ca->maxloc; + else if(ca->flag & ACT_CONST_LOCY) fp= ca->maxloc+1; + else if(ca->flag & ACT_CONST_LOCZ) fp= ca->maxloc+2; + else if(ca->flag & ACT_CONST_ROTX) fp= ca->maxrot; + else if(ca->flag & ACT_CONST_ROTY) fp= ca->maxrot+1; + else fp= ca->maxrot+2; + + *fp = value; +} + +static float rna_ConstraintActuator_distance_get(struct PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->minloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->minloc+1; + else fp= ca->minloc+2; + + return *fp; +} + +static void rna_ConstraintActuator_distance_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->minloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->minloc+1; + else fp= ca->minloc+2; + + *fp = value; +} + +static float rna_ConstraintActuator_range_get(struct PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->maxloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->maxloc+1; + else fp= ca->maxloc+2; + + return *fp; +} + +static void rna_ConstraintActuator_range_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->maxloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->maxloc+1; + else fp= ca->maxloc+2; + + *fp = value; +} + +static float rna_ConstraintActuator_fhheight_get(struct PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->minloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->minloc+1; + else fp= ca->minloc+2; + + return *fp; +} + +static void rna_ConstraintActuator_fhheight_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->minloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->minloc+1; + else fp= ca->minloc+2; + + *fp = value; +} + +static float rna_ConstraintActuator_spring_get(struct PointerRNA *ptr) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->maxloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->maxloc+1; + else fp= ca->maxloc+2; + + return *fp; +} + +static void rna_ConstraintActuator_spring_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + float *fp; + + if(ca->mode & (ACT_CONST_DIRPX|ACT_CONST_DIRNX)) fp= ca->maxloc; + else if(ca->mode & (ACT_CONST_DIRPY|ACT_CONST_DIRNY)) fp= ca->maxloc+1; + else fp= ca->maxloc+2; + + *fp = value; +} + +/* ConstraintActuator uses the same property for Material and Property. + Therefore we need to clear the property when "detect_material" mode changes */ +static void rna_Actuator_constraint_detect_material_set(struct PointerRNA *ptr, int value) +{ + bActuator *act = (bActuator*)ptr->data; + bConstraintActuator *ca = act->data; + + short old_value = (ca->flag & ACT_CONST_MATERIAL? 1:0); + + if (old_value != value) { + ca->flag ^= ACT_CONST_MATERIAL; + ca->matprop[0] = '\0'; + } +} + +static void rna_FcurveActuator_add_set(struct PointerRNA *ptr, int value) +{ + bActuator *act = (bActuator *)ptr->data; + bIpoActuator *ia = act->data; + + if(value == 1){ + ia->flag &= ~ACT_IPOFORCE; + ia->flag |= ACT_IPOADD; + }else + ia->flag &= ~ACT_IPOADD; +} + +static void rna_FcurveActuator_force_set(struct PointerRNA *ptr, int value) +{ + bActuator *act = (bActuator *)ptr->data; + bIpoActuator *ia = act->data; + + if(value == 1){ + ia->flag &= ~ACT_IPOADD; + ia->flag |= ACT_IPOFORCE; + }else + ia->flag &= ~ACT_IPOFORCE; +} + +static void rna_ObjectActuator_integralcoefficient_set(struct PointerRNA *ptr, float value) +{ + bActuator *act = (bActuator*)ptr->data; + bObjectActuator *oa = act->data; + + oa->forcerot[1] = value; + oa->forcerot[0] = 60.0f*oa->forcerot[1]; +} + +static void rna_StateActuator_state_set(PointerRNA *ptr, const int *values) +{ + bActuator *act = (bActuator*)ptr->data; + bStateActuator *sa = act->data; + + int i, tot= 0; + + /* ensure we always have some state selected */ + for(i=0; imask |= (1<mask &= ~(1<type == &RNA_Actuator) { + ob = (Object *)ptr->id.data; + } else { + /* can't use ob from ptr->id.data because that enum is also used by operators */ + ob = CTX_data_active_object(C); + } + + if (ob != NULL) { + if (ob->type==OB_ARMATURE) { + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_ACTION); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_ARMATURE); + } + } + + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_CAMERA); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_CONSTRAINT); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_EDIT_OBJECT); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_IPO); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_2DFILTER); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_GAME); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_MESSAGE); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_OBJECT); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_PARENT); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_PROPERTY); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_RANDOM); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SCENE); + + if (ob != NULL) { + if (ob->type==OB_MESH){ + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SHAPEACTION); + } + } + + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SOUND); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_STATE); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_VISIBILITY); + + RNA_enum_item_end(&item, &totitem); + *free= 1; + + return item; +} + +static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + bActuator *act= (bActuator *)ptr->data; + bArmatureActuator *aa = act->data; + Object *ob = (Object *)ptr->id.data; + + char *posechannel= aa->posechannel; + char *constraint= aa->constraint; + + /* check that bone exist in the active object */ + if (ob->type == OB_ARMATURE && ob->pose) { + bPoseChannel *pchan; + bPose *pose = ob->pose; + for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) { + if (!strcmp(pchan->name, posechannel)) { + /* found it, now look for constraint channel */ + bConstraint *con; + for (con=pchan->constraints.first; con; con=con->next) { + if (!strcmp(con->name, constraint)) { + /* found it, all ok */ + return; + } + } + /* didn't find constraint, make empty */ + constraint[0] = 0; + return; + } + } + } + /* didn't find any */ + posechannel[0] = 0; + constraint[0] = 0; +} + +/* note: the following set functions exists only to avoid id refcounting */ +static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value) +{ + bActuator *act = (bActuator *)ptr->data; + bEditObjectActuator *eoa = (bEditObjectActuator *) act->data; + + eoa->me = value.data; +} + +static void rna_Actuator_action_action_set(PointerRNA *ptr, PointerRNA value) +{ + bActuator *act = (bActuator *)ptr->data; + bActionActuator *aa = (bActionActuator *) act->data; + + aa->act = value.data; +} + #else void rna_def_actuator(BlenderRNA *brna) @@ -87,27 +461,6 @@ void rna_def_actuator(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem actuator_type_items[] ={ - {ACT_OBJECT, "OBJECT", 0, "Motion", ""}, - {ACT_IPO, "IPO", 0, "IPO", ""}, - {ACT_CAMERA, "CAMERA", 0, "Camera", ""}, - {ACT_SOUND, "SOUND", 0, "Sound", ""}, - {ACT_PROPERTY, "PROPERTY", 0, "Property", ""}, - {ACT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""}, - {ACT_EDIT_OBJECT, "EDIT_OBJECT", 0, "Edit Object", ""}, - {ACT_SCENE, "SCENE", 0, "Scene", ""}, - {ACT_RANDOM, "RANDOM", 0, "Random", ""}, - {ACT_MESSAGE, "MESSAGE", 0, "Message", ""}, - {ACT_ACTION, "ACTION", 0, "Action", ""}, - {ACT_GAME, "GAME", 0, "Game", ""}, - {ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""}, - {ACT_2DFILTER, "FILTER_2D", 0, "2D Filter", ""}, - {ACT_PARENT, "PARENT", 0, "Parent", ""}, - {ACT_SHAPEACTION, "SHAPE_ACTION", 0, "Shape Action", ""}, - {ACT_STATE, "STATE", 0, "State", ""}, - {ACT_ARMATURE, "ARMATURE", 0, "Armature", ""}, - {0, NULL, 0, NULL, NULL}}; - srna= RNA_def_struct(brna, "Actuator", NULL); RNA_def_struct_ui_text(srna, "Actuator", "Actuator to apply actions in the game engine"); RNA_def_struct_sdna(srna, "bActuator"); @@ -115,13 +468,107 @@ void rna_def_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", ""); + RNA_def_struct_name_property(srna, prop); - /* type is not editable, would need to do proper data free/alloc */ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, actuator_type_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_Actuator_type_set", "rna_Actuator_type_itemf"); RNA_def_property_ui_text(prop, "Type", ""); + prop= RNA_def_property(srna, "pinned", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_PIN); + RNA_def_property_ui_text(prop, "Pinned", "Display when not linked to a visible states controller"); + RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SHOW); + RNA_def_property_ui_text(prop, "Expanded", "Set actuator expanded in the user interface"); + RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); + + RNA_api_actuator(srna); +} + +static void rna_def_action_actuator(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_type_items[] ={ + {ACT_ACTION_PLAY, "PLAY", 0, "Play", ""}, + {ACT_ACTION_FLIPPER, "FLIPPER", 0, "Flipper", ""}, + {ACT_ACTION_LOOP_STOP, "LOOPSTOP", 0, "Loop Stop", ""}, + {ACT_ACTION_LOOP_END, "LOOPEND", 0, "Loop End", ""}, + {ACT_ACTION_FROM_PROP, "PROPERTY", 0, "Property", ""}, +#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR + {ACT_ACTION_MOTION, "MOTION", 0, "Displacement", ""}, +#endif + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "ActionActuator", "Actuator"); + RNA_def_struct_ui_text(srna, "Action Actuator", "Actuator to control the object movement"); + RNA_def_struct_sdna_from(srna, "bActionActuator", "data"); + + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); + RNA_def_property_enum_items(prop, prop_type_items); + RNA_def_property_ui_text(prop, "Action type", "Action playback type"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "act"); + RNA_def_property_struct_type(prop, "Action"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Action", ""); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "continue_last_frame", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "end_reset", 1); + RNA_def_property_ui_text(prop, "Continue", "Restore last frame when switching on/off, otherwise play from the start each time"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "name"); + RNA_def_property_ui_text(prop, "Property", "Use this property to define the Action position"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "sta"); + RNA_def_property_range(prop, 0, MAXFRAME); + RNA_def_property_ui_text(prop, "Start frame", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "end"); + RNA_def_property_range(prop, 0, MAXFRAME); + RNA_def_property_ui_text(prop, "End frame", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "blendin", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 0, 32767); + RNA_def_property_ui_text(prop, "Blendin", "Number of frames of motion blending"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "priority", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 0, 100); + RNA_def_property_ui_text(prop, "Priority", "Execution priority - lower numbers will override actions with higher numbers. With 2 or more actions at once, the overriding channels must be lower in the stack"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "frame_property", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "frameProp"); + RNA_def_property_ui_text(prop, "Frame Property", "Assign the action's current frame number to this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + +#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR + prop= RNA_def_property(srna, "stride_length", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "stridelength"); + RNA_def_property_range(prop, 0.0, 2500.0); + RNA_def_property_ui_text(prop, "Cycle", "Distance covered by a single cycle of the action"); + RNA_def_property_update(prop, NC_LOGIC, NULL); +#endif } static void rna_def_object_actuator(BlenderRNA *brna) @@ -130,7 +577,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) PropertyRNA* prop; static EnumPropertyItem prop_type_items[] ={ - {ACT_OBJECT_NORMAL, "OBJECT_NORMAL", 0, "Simple motion", ""}, + {ACT_OBJECT_NORMAL, "OBJECT_NORMAL", 0, "Simple Motion", ""}, {ACT_OBJECT_SERVO, "OBJECT_SERVO", 0, "Servo Control", ""}, {0, NULL, 0, NULL, NULL}}; @@ -139,11 +586,11 @@ static void rna_def_object_actuator(BlenderRNA *brna) RNA_def_struct_sdna_from(srna, "bObjectActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Motion Type", "Specify the motion system"); RNA_def_property_update(prop, NC_LOGIC, NULL); - // XXX otype = type prop= RNA_def_property(srna, "reference_object", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); @@ -154,7 +601,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "damping", PROP_INT, PROP_NONE); RNA_def_property_ui_range(prop, 0, 1000, 1, 1); - RNA_def_property_ui_text(prop, "Damping", "Number of frames to reach the target velocity"); + RNA_def_property_ui_text(prop, "Damping Frames", "Number of frames to reach the target velocity"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "proportional_coefficient", PROP_FLOAT, PROP_NONE); @@ -166,6 +613,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "integral_coefficient", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "forcerot[1]"); RNA_def_property_ui_range(prop, 0.0, 3.0, 0.1, 0.01); + RNA_def_property_float_funcs(prop, NULL, "rna_ObjectActuator_integralcoefficient_set", NULL); RNA_def_property_ui_text(prop, "Integral Coefficient", "Low value (0.01) for slow response, high value (0.5) for fast response"); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -175,28 +623,43 @@ static void rna_def_object_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Derivate Coefficient", "Not required, high values can cause instability"); RNA_def_property_update(prop, NC_LOGIC, NULL); - /* XXX We need one of those special get/set functions here: - int offset - if (flag & ACT_SERVO_LIMIT_X): - offset = 0 - elif (flag & ACT_SERVO_LIMIT_Y): - offset = 1 - elif (flag & ACT_SERVO_LIMIT_Z): - offset = 2 - - prop= RNA_def_property(srna, "force_max", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "dloc[offset]"); + /* Servo Limit */ + prop= RNA_def_property(srna, "force_max_x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "dloc[0]"); RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1); RNA_def_property_ui_text(prop, "Max", "Set the upper limit for force"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "force_max", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "drot[offset]"); + prop= RNA_def_property(srna, "force_min_x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "drot[0]"); + RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1); + RNA_def_property_ui_text(prop, "Min", "Set the lower limit for force"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "force_max_y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "dloc[0]"); RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1); RNA_def_property_ui_text(prop, "Max", "Set the upper limit for force"); RNA_def_property_update(prop, NC_LOGIC, NULL); - */ - + + prop= RNA_def_property(srna, "force_min_y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "drot[1]"); + RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1); + RNA_def_property_ui_text(prop, "Min", "Set the lower limit for force"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "force_max_z", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "dloc[2]"); + RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1); + RNA_def_property_ui_text(prop, "Max", "Set the upper limit for force"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "force_min_z", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "drot[2]"); + RNA_def_property_ui_range(prop, -100.0, 100.0, 1.0, 0.1); + RNA_def_property_ui_text(prop, "Min", "Set the lower limit for force"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + /* floats 3 Arrays*/ prop= RNA_def_property(srna, "loc", PROP_FLOAT, PROP_TRANSLATION); RNA_def_property_float_sdna(prop, NULL, "dloc"); @@ -292,7 +755,7 @@ static void rna_def_object_actuator(BlenderRNA *brna) RNA_def_property_update(prop, NC_LOGIC, NULL); } -static void rna_def_ipo_actuator(BlenderRNA *brna) +static void rna_def_fcurve_actuator(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; @@ -307,23 +770,23 @@ static void rna_def_ipo_actuator(BlenderRNA *brna) {ACT_IPO_FROM_PROP, "PROP", 0, "Property", ""}, {0, NULL, 0, NULL, NULL}}; - srna= RNA_def_struct(brna, "IpoActuator", "Actuator"); - RNA_def_struct_ui_text(srna, "Ipo Actuator", "Actuator to animate the object"); + srna= RNA_def_struct(brna, "FcurveActuator", "Actuator"); + RNA_def_struct_ui_text(srna, "F-Curve Actuator", "Actuator to animate the object"); RNA_def_struct_sdna_from(srna, "bIpoActuator", "data"); prop= RNA_def_property(srna, "play_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Ipo Type", "Specify the way you want to play the animation"); + RNA_def_property_ui_text(prop, "F-Curve Type", "Specify the way you want to play the animation"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "sta"); RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1); RNA_def_property_ui_text(prop, "Start Frame", ""); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "end"); RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1); RNA_def_property_ui_text(prop, "End Frame", ""); @@ -331,7 +794,7 @@ static void rna_def_ipo_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Property", "Use this property to define the Ipo position"); + RNA_def_property_ui_text(prop, "Property", "Use this property to define the F-Curve position"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "frame_property", PROP_STRING, PROP_NONE); @@ -339,29 +802,27 @@ static void rna_def_ipo_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Frame Property", "Assign the action's current frame number to this property"); /* booleans */ + prop= RNA_def_property(srna, "add", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOADD); + RNA_def_property_boolean_funcs(prop, NULL, "rna_FcurveActuator_add_set"); + RNA_def_property_ui_text(prop, "Add", "F-Curve is added to the current loc/rot/scale in global or local coordinate according to Local flag"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "force", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOFORCE); - RNA_def_property_ui_text(prop, "Force", "Apply Ipo as a global or local force depending on the local option (dynamic objects only)"); + RNA_def_property_boolean_funcs(prop, NULL, "rna_FcurveActuator_force_set"); + RNA_def_property_ui_text(prop, "Force", "Apply F-Curve as a global or local force depending on the local option (dynamic objects only)"); RNA_def_property_update(prop, NC_LOGIC, NULL); -// logic_window::change_ipo_actuator -// RNA_def_property_boolean_funcs(prop, "rna_Actuator_Ipo_get", "rna_Actuator_Ipo_get", "rna_Actuator_Ipo_range"); prop= RNA_def_property(srna, "local", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOLOCAL); - RNA_def_property_ui_text(prop, "L", "Let the ipo acts in local coordinates, used in Force and Add mode"); + RNA_def_property_ui_text(prop, "L", "Let the F-Curve act in local coordinates, used in Force and Add mode"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "child", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOCHILD); - RNA_def_property_ui_text(prop, "Child", "Update IPO on all children Objects as well"); + RNA_def_property_ui_text(prop, "Child", "Update F-Curve on all children Objects as well"); RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "add", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOADD); - RNA_def_property_ui_text(prop, "Add", "Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag"); - RNA_def_property_update(prop, NC_LOGIC, NULL); -// logic_window::change_ipo_actuator -// RNA_def_property_boolean_funcs(prop, "rna_Actuator_Ipo_get", "rna_Actuator_Ipo_get", "rna_Actuator_Ipo_range"); } static void rna_def_camera_actuator(BlenderRNA *brna) @@ -370,8 +831,8 @@ static void rna_def_camera_actuator(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem prop_axis_items[] ={ - {(float)'x', "X", 0, "X", "Camera tries to get behind the X axis"}, - {(float)'y', "Y", 0, "Y", "Camera tries to get behind the Y axis"}, + {ACT_CAMERA_X, "X", 0, "X", "Camera tries to get behind the X axis"}, + {ACT_CAMERA_Y, "Y", 0, "Y", "Camera tries to get behind the Y axis"}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "CameraActuator", "Actuator"); @@ -402,11 +863,10 @@ static void rna_def_camera_actuator(BlenderRNA *brna) RNA_def_property_update(prop, NC_LOGIC, NULL); /* x/y */ - // It could be changed to be a regular ENUM instead of this weird "(float)string enum" prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "axis"); RNA_def_property_enum_items(prop, prop_axis_items); - RNA_def_property_ui_text(prop, "Axis", "Specify the axy the Camera will try to get behind"); + RNA_def_property_ui_text(prop, "Axis", "Specify the axis the Camera will try to get behind"); RNA_def_property_update(prop, NC_LOGIC, NULL); } @@ -435,9 +895,10 @@ static void rna_def_sound_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Sound", "Sound file"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_ui_text(prop, "Play Mode", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_NONE); @@ -461,7 +922,7 @@ static void rna_def_sound_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "maximum_gain_3d", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "sound3D.max_gain"); RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 0.01); - RNA_def_property_ui_text(prop, "Minimum Gain", "The maximum gain of the sound, no matter how near it is"); + RNA_def_property_ui_text(prop, "Maximum Gain", "The maximum gain of the sound, no matter how near it is"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "reference_distance_3d", PROP_FLOAT, PROP_NONE); @@ -524,12 +985,13 @@ static void rna_def_property_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Property Actuator", "Actuator to handle properties"); RNA_def_struct_sdna_from(srna, "bPropertyActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Mode", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "prop_name", PROP_STRING, PROP_NONE); + prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Property", "The name of the property"); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -537,6 +999,20 @@ static void rna_def_property_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Value", "The value to use, use \"\" around strings"); RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* Copy Mode */ + prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Object"); + RNA_def_property_pointer_sdna(prop, NULL, "ob"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Object", "Copy from this Object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + //XXX add even magic'er property lookup (need to look for the property list of the target object) + prop= RNA_def_property(srna, "object_property", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "value"); + RNA_def_property_ui_text(prop, "Property Name", "Copy this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_constraint_actuator(BlenderRNA *brna) @@ -552,11 +1028,185 @@ static void rna_def_constraint_actuator(BlenderRNA *brna) {0, NULL, 0, NULL, NULL} }; + static EnumPropertyItem prop_limit_items[] ={ + {ACT_CONST_NONE, "NONE", 0, "None", ""}, + {ACT_CONST_LOCX, "LOCX", 0, "Loc X", ""}, + {ACT_CONST_LOCY, "LOCY", 0, "Loc Y", ""}, + {ACT_CONST_LOCZ, "LOCZ", 0, "Loc Z", ""}, + {0, NULL, 0, NULL, NULL} + }; + + static EnumPropertyItem prop_direction_items[] ={ + {ACT_CONST_NONE, "NONE", 0, "None", ""}, + {ACT_CONST_DIRPX, "DIRPX", 0, "X axis", ""}, + {ACT_CONST_DIRPY, "DIRPY", 0, "Y axis", ""}, + {ACT_CONST_DIRPZ, "DIRPZ", 0, "Z axis", ""}, + {ACT_CONST_DIRNX, "DIRNX", 0, "-X axis", ""}, + {ACT_CONST_DIRNY, "DIRNY", 0, "-Y axis", ""}, + {ACT_CONST_DIRNZ, "DIRNZ", 0, "-Z axis", ""}, + {0, NULL, 0, NULL, NULL} + }; + srna= RNA_def_struct(brna, "ConstraintActuator", "Actuator"); - RNA_def_struct_ui_text(srna, "Constraint Actuator", "Actuator to .."); + RNA_def_struct_ui_text(srna, "Constraint Actuator", "Actuator to handle Constraints"); RNA_def_struct_sdna_from(srna, "bConstraintActuator", "data"); - //XXX + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); + RNA_def_property_enum_items(prop, prop_type_items); + RNA_def_property_ui_text(prop, "Constraints Mode", "The type of the constraint"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "limit", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, prop_limit_items); + RNA_def_property_ui_text(prop, "Limit", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_direction_items); + RNA_def_property_ui_text(prop, "Direction", "Set the direction of the ray"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "direction_axis", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_direction_items); + RNA_def_property_ui_text(prop, "Direction", "Select the axis to be aligned along the reference direction"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* ACT_CONST_TYPE_LOC */ + prop= RNA_def_property(srna, "limit_min", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_limitmin_get", "rna_ConstraintActuator_limitmin_set", NULL); + RNA_def_property_ui_range(prop, -2000.f, 2000.f, 1, 2); + RNA_def_property_ui_text(prop, "Min", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "limit_max", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_limitmax_get", "rna_ConstraintActuator_limitmax_set", NULL); + RNA_def_property_ui_range(prop, -2000.f, 2000.f, 1, 2); + RNA_def_property_ui_text(prop, "Max", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "damping", PROP_INT, PROP_PERCENTAGE); + RNA_def_property_int_sdna(prop, NULL, "damp"); + RNA_def_property_ui_range(prop, 0, 100, 1, 1); + RNA_def_property_ui_text(prop, "Damping", "Damping factor: time constant (in frame) of low pass filter"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* ACT_CONST_TYPE_DIST */ + prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_range_get", "rna_ConstraintActuator_range_set", NULL); + RNA_def_property_ui_range(prop, 0.f, 2000.f, 1, 2); + RNA_def_property_ui_text(prop, "Range", "Set the maximum length of ray"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_distance_get", "rna_ConstraintActuator_distance_set", NULL); + RNA_def_property_ui_range(prop, -2000.f, 2000.f, 1, 2); + RNA_def_property_ui_text(prop, "Distance", "Set the maximum length of ray"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + //XXX to use a pointer or add a material lookup + prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "matprop"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Material", "Ray detects only Objects with this material"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + //XXX add magic property lookup + prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "matprop"); + RNA_def_property_ui_text(prop, "Property", "Ray detect only Objects with this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "time", PROP_INT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 1000, 1, 2); + RNA_def_property_ui_text(prop, "Time", "Maximum activation time in frame, 0 for unlimited"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "damping_rotation", PROP_INT, PROP_PERCENTAGE); + RNA_def_property_int_sdna(prop, NULL, "rotdamp"); + RNA_def_property_ui_range(prop, 0, 100, 1, 1); + RNA_def_property_ui_text(prop, "rotDamp", "Use a different damping for orientation"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* ACT_CONST_TYPE_ORI */ + prop= RNA_def_property(srna, "max_rotation", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_float_sdna(prop, NULL, "maxrot"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_range(prop, -2000.0, 2000.0, 0.1, 0.001); + RNA_def_property_ui_text(prop, "Reference Direction", "Reference Direction"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "min_angle", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "minloc[0]"); + RNA_def_property_ui_range(prop, 0.0, 180.0, 0.1, 0.01); + RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "max_angle", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "maxloc[0]"); + RNA_def_property_ui_range(prop, 0.0, 180.0, 0.1, 0.01); + RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* ACT_CONST_TYPE_FH */ + prop= RNA_def_property(srna, "fh_height", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_fhheight_get", "rna_ConstraintActuator_fhheight_set", NULL); + RNA_def_property_ui_range(prop, 0.01, 2000.0, 0.1, 0.01); + RNA_def_property_ui_text(prop, "Distance", "Height of the Fh area"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "spring", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_spring_get", "rna_ConstraintActuator_spring_set", NULL); + RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 0.01); + RNA_def_property_ui_text(prop, "Fh", "Spring force within the Fh area"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "fh_damping", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "maxrot[0]"); + RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 1); + RNA_def_property_ui_text(prop, "Damping", "Damping factor of the Fh spring force"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* booleans */ + prop= RNA_def_property(srna, "force_distance", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_DISTANCE); + RNA_def_property_ui_text(prop, "Force Distance", "Force distance of object to point of impact of ray"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "local", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_LOCAL); + RNA_def_property_ui_text(prop, "L", "Set ray along object's axis or global axis"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "normal", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_NORMAL); + RNA_def_property_ui_text(prop, "N", "Set object axis along (local axis) or parallel (global axis) to the normal at hit position"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "persistent", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_PERMANENT); + RNA_def_property_ui_text(prop, "PER", "Persistent actuator: stays active even if ray does not reach target"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + //XXX to use an enum instead of a flag if possible + prop= RNA_def_property(srna, "detect_material", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_MATERIAL); + RNA_def_property_ui_text(prop, "M/P", "Detect material instead of property"); + RNA_def_property_boolean_funcs(prop, NULL, "rna_Actuator_constraint_detect_material_set"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "fh_paralel_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_DOROTFH); + RNA_def_property_ui_text(prop, "Rot Fh", "Keep object axis parallel to normal"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "fh_normal", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CONST_NORMAL); + RNA_def_property_ui_text(prop, "N", "Add a horizontal spring force on slopes"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_edit_object_actuator(BlenderRNA *brna) @@ -564,27 +1214,27 @@ static void rna_def_edit_object_actuator(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_type_items[] ={ - {ACT_EDOB_ADD_OBJECT, "ADDOBJECT", 0, "Add Object", ""}, - {ACT_EDOB_END_OBJECT, "ENDOBJECT", 0, "End Object", ""}, - {ACT_EDOB_REPLACE_MESH, "REPLACEMESH", 0, "Replace Mesh", ""}, - {ACT_EDOB_TRACK_TO, "TRACKTO", 0, "Track to", ""}, - {ACT_EDOB_DYNAMICS, "DYNAMICS", 0, "Dynamics", ""}, - {0, NULL, 0, NULL, NULL} }; - static EnumPropertyItem prop_dyn_items[] ={ {ACT_EDOB_RESTORE_DYN, "RESTOREDYN", 0, "Restore Dynamics", ""}, {ACT_EDOB_SUSPEND_DYN, "SUSPENDDYN", 0, "Suspend Dynamics", ""}, - {ACT_EDOB_ENABLE_RB, "ENABLERIGIDBOBY", 0, "Enable Rigid Body", ""}, - {ACT_EDOB_DISABLE_RB, "DISABLERIGIDBOBY", 0, "Disable Rigid Body", ""}, + {ACT_EDOB_ENABLE_RB, "ENABLERIGIDBODY", 0, "Enable Rigid Body", ""}, + {ACT_EDOB_DISABLE_RB, "DISABLERIGIDBODY", 0, "Disable Rigid Body", ""}, {ACT_EDOB_SET_MASS, "SETMASS", 0, "Set Mass", ""}, {0, NULL, 0, NULL, NULL} }; + static EnumPropertyItem prop_type_items[] ={ + {ACT_EDOB_ADD_OBJECT, "ADDOBJECT", 0, "Add Object", ""}, + {ACT_EDOB_END_OBJECT, "ENDOBJECT", 0, "End Object", ""}, + {ACT_EDOB_REPLACE_MESH, "REPLACEMESH", 0, "Replace Mesh", ""}, + {ACT_EDOB_TRACK_TO, "TRACKTO", 0, "Track to", ""}, + {ACT_EDOB_DYNAMICS, "DYNAMICS", 0, "Dynamics", ""}, + {0, NULL, 0, NULL, NULL} }; + srna= RNA_def_struct(brna, "EditObjectActuator", "Actuator"); RNA_def_struct_ui_text(srna, "Edit Object Actuator", "Actuator used to edit objects"); RNA_def_struct_sdna_from(srna, "bEditObjectActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Edit Object", "The mode of the actuator"); @@ -615,6 +1265,8 @@ static void rna_def_edit_object_actuator(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "me"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Mesh", "Replace the existing, when left blank 'Phys' will remake the existing physics mesh"); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_editobject_mesh_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "time", PROP_INT, PROP_NONE); @@ -689,11 +1341,13 @@ static void rna_def_scene_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Scene Actuator", "Actuator to .."); RNA_def_struct_sdna_from(srna, "bSceneActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Scene", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); + //XXX filter only camera objects prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_flag(prop, PROP_EDITABLE); @@ -706,7 +1360,7 @@ static void rna_def_scene_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Scene", "Set the Scene to be added/removed/paused/resumed"); RNA_def_property_update(prop, NC_LOGIC, NULL); - /* XXX + /* XXX no need for those tooltips. to remove soon Originally we had different 'scene' tooltips for different values of 'type'. They were: ACT_SCENE_RESTART "" @@ -874,7 +1528,7 @@ static void rna_def_message_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "body_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "bodyType"); RNA_def_property_enum_items(prop, prop_body_type_items); - RNA_def_property_ui_text(prop, "Body Type", "Toggle message type: either Text or a PropertyName"); + RNA_def_property_ui_text(prop, "Body", "Toggle message type: either Text or a PropertyName"); /* ACT_MESG_MESG */ prop= RNA_def_property(srna, "body_message", PROP_STRING, PROP_NONE); @@ -911,14 +1565,17 @@ static void rna_def_game_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Game Actuator", ""); RNA_def_struct_sdna_from(srna, "bGameActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Game", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_NONE); + /* ACT_GAME_LOAD */ + prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); RNA_def_property_ui_text(prop, "File", "Load this blend file, use the \"//\" prefix for a path relative to the current blend file"); RNA_def_property_update(prop, NC_LOGIC, NULL); + //XXX to do: an operator that calls file_browse with relative_path on and blender filtering active } static void rna_def_visibility_actuator(BlenderRNA *brna) @@ -931,7 +1588,7 @@ static void rna_def_visibility_actuator(BlenderRNA *brna) RNA_def_struct_sdna_from(srna, "bVisibilityActuator", "data"); prop= RNA_def_property(srna, "visible", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_VISIBILITY_INVISIBLE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ACT_VISIBILITY_INVISIBLE); RNA_def_property_ui_text(prop, "Visible", "Set the objects visible. Initialized from the objects render restriction toggle (access in the outliner)"); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -970,11 +1627,12 @@ static void rna_def_twodfilter_actuator(BlenderRNA *brna) // {ACT_2DFILTER_NUMBER_OF_FILTERS, "", 0, "Do not use it. Sentinel", ""}, {0, NULL, 0, NULL, NULL}}; - srna= RNA_def_struct(brna, "TwoDFilterActuator", "Actuator"); + srna= RNA_def_struct(brna, "Filter2DActuator", "Actuator"); RNA_def_struct_ui_text(srna, "2D Filter Actuator", "Actuator to .."); RNA_def_struct_sdna_from(srna, "bTwoDFilterActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "2D Filter Type", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -992,19 +1650,16 @@ static void rna_def_twodfilter_actuator(BlenderRNA *brna) RNA_def_property_range(prop, 0, 99); //MAX_RENDER_PASS-1 RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "motion_blur_value", PROP_FLOAT, PROP_PERCENTAGE); + prop= RNA_def_property(srna, "motion_blur_value", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "float_arg"); RNA_def_property_ui_text(prop, "Value", "Set motion blur value"); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_update(prop, NC_LOGIC, NULL); /* booleans */ - // it must be renamed to enable_motion_blur. - // it'll require code change and do_version() - // or RNA_def_property_boolean_funcs() to flip the boolean value - prop= RNA_def_property(srna, "disable_motion_blur", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", 1); - RNA_def_property_ui_text(prop, "D", "Enable/Disable Motion Blur"); + prop= RNA_def_property(srna, "enable_motion_blur", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", 1); + RNA_def_property_ui_text(prop, "Enable", "Enable/Disable Motion Blur"); RNA_def_property_update(prop, NC_LOGIC, NULL); } @@ -1022,7 +1677,8 @@ static void rna_def_parent_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Parent Actuator", ""); RNA_def_struct_sdna_from(srna, "bParentActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Scene", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -1063,10 +1719,11 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna) {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "ShapeActionActuator", "Actuator"); - RNA_def_struct_ui_text(srna, "Shape Action Actuator", "Actuator to .."); + RNA_def_struct_ui_text(srna, "Shape Action Actuator", "Actuator to control shape key animations"); RNA_def_struct_sdna_from(srna, "bActionActuator", "data"); - - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Action type", "Action playback type"); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -1076,6 +1733,8 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Action"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Action", ""); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "continue_last_frame", PROP_BOOLEAN, PROP_NONE); @@ -1088,13 +1747,13 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Property", "Use this property to define the Action position"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "sta"); RNA_def_property_range(prop, 0, MAXFRAME); RNA_def_property_ui_text(prop, "Start frame", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "end"); RNA_def_property_range(prop, 0, MAXFRAME); RNA_def_property_ui_text(prop, "End frame", ""); @@ -1146,14 +1805,11 @@ static void rna_def_state_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Operation", "Select the bit operation on object state mask"); RNA_def_property_update(prop, NC_LOGIC, NULL); -/* - XXX mask needs a template or to use RNA layer type - prop= RNA_def_property(srna, "mask", PROP_BOOLEAN, PROP_LAYER); - RNA_def_property_array(prop, 20); -*/ - prop= RNA_def_property(srna, "mask", PROP_INT, PROP_NONE); - RNA_def_property_ui_text(prop, "Mask", ""); - RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "state", PROP_BOOLEAN, PROP_LAYER_MEMBER); + RNA_def_property_boolean_sdna(prop, NULL, "mask", 1); + RNA_def_property_array(prop, OB_MAX_STATES); + RNA_def_property_ui_text(prop, "State", ""); + RNA_def_property_boolean_funcs(prop, NULL, "rna_StateActuator_state_set"); } static void rna_def_armature_actuator(BlenderRNA *brna) @@ -1162,18 +1818,18 @@ static void rna_def_armature_actuator(BlenderRNA *brna) PropertyRNA* prop; static EnumPropertyItem prop_type_items[] ={ - {ACT_ARM_RUN, "RUN", 0, "Run armature", ""}, + {ACT_ARM_RUN, "RUN", 0, "Run Armature", ""}, {ACT_ARM_ENABLE, "ENABLE", 0, "Enable", ""}, {ACT_ARM_DISABLE, "DISABLE", 0, "Disable", ""}, - {ACT_ARM_SETTARGET, "SETTARGET", 0, "Set target", ""}, - {ACT_ARM_SETWEIGHT, "SETWEIGHT", 0, "Set weight", ""}, + {ACT_ARM_SETTARGET, "SETTARGET", 0, "Set Target", ""}, + {ACT_ARM_SETWEIGHT, "SETWEIGHT", 0, "Set Weight", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "ArmatureActuator", "Actuator"); RNA_def_struct_ui_text(srna, "Armature Actuator", "Actuator to .."); RNA_def_struct_sdna_from(srna, "bArmatureActuator", "data"); - prop= RNA_def_property(srna, "contraint_type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Constraint Type", ""); @@ -1182,18 +1838,12 @@ static void rna_def_armature_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "bone", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "posechannel"); RNA_def_property_ui_text(prop, "Bone", "Bone on which the constraint is defined"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - // XXX uiButSetFunc(but, check_armature_actuator, but, armAct); // the bone must be from the armature - /* XXX eventually move to a datablock pointer. However datablocking this may be a problem - we would need to update the value whenever the armature changes. */ + RNA_def_property_update(prop, NC_LOGIC, "rna_Actuator_Armature_update"); - prop= RNA_def_property(srna, "contraint", PROP_STRING, PROP_NONE); + prop= RNA_def_property(srna, "constraint", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "constraint"); RNA_def_property_ui_text(prop, "Constraint", "Name of the constraint you want to control"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - // XXX uiButSetFunc(but, check_armature_actuator, but, armAct); // the constraintbone must be from the armature - /* XXX eventually move to a datablock pointer. - (more likely to work than for the Bone in my opinion) */ + RNA_def_property_update(prop, NC_LOGIC, "rna_Actuator_Armature_update"); prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); @@ -1208,7 +1858,7 @@ static void rna_def_armature_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Secondary Target", "Set weight of this constraint"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_PERCENTAGE); + prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "weight"); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_ui_text(prop, "Weight", "Set weight of this constraint"); @@ -1219,12 +1869,13 @@ void RNA_def_actuator(BlenderRNA *brna) { rna_def_actuator(brna); + rna_def_action_actuator(brna); rna_def_object_actuator(brna); - rna_def_ipo_actuator(brna); + rna_def_fcurve_actuator(brna); rna_def_camera_actuator(brna); rna_def_sound_actuator(brna); rna_def_property_actuator(brna); - rna_def_constraint_actuator(brna); // to be done + rna_def_constraint_actuator(brna); rna_def_edit_object_actuator(brna); rna_def_scene_actuator(brna); rna_def_random_actuator(brna); diff --git a/source/blender/makesrna/intern/rna_actuator_api.c b/source/blender/makesrna/intern/rna_actuator_api.c new file mode 100644 index 00000000000..b61f9e252a6 --- /dev/null +++ b/source/blender/makesrna/intern/rna_actuator_api.c @@ -0,0 +1,72 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2010 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include + +#include "WM_types.h" +#include "RNA_define.h" + +#ifdef RNA_RUNTIME + +#include "BKE_sca.h" +#include "DNA_controller_types.h" +#include "DNA_actuator_types.h" + +static void rna_Actuator_link(bActuator *act, bController *cont) +{ + link_logicbricks((void **)&act, (void ***)&(cont->links), &cont->totlinks, sizeof(bActuator *)); +} + +static void rna_Actuator_unlink(bActuator *act, bController *cont) +{ + unlink_logicbricks((void **)&act, (void ***)&(cont->links), &cont->totlinks); +} + +#else + +void RNA_api_actuator(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "link", "rna_Actuator_link"); + RNA_def_function_ui_description(func, "Link the actuator to a controller."); + parm= RNA_def_pointer(func, "controller", "Controller", "", "Controller to link to."); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_update(parm, NC_LOGIC, NULL); + + func= RNA_def_function(srna, "unlink", "rna_Actuator_unlink"); + RNA_def_function_ui_description(func, "Unlink the actuator from a controller."); + parm= RNA_def_pointer(func, "controller", "Controller", "", "Controller to unlink from."); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_update(parm, NC_LOGIC, NULL); +} + +#endif + diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index 453d9b9a844..e0cf4f912b1 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -26,7 +26,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "rna_internal.h" @@ -37,16 +36,19 @@ #include "MEM_guardedalloc.h" +#include "ED_keyframing.h" + /* exported for use in API */ EnumPropertyItem keyingset_path_grouping_items[] = { {KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""}, {KSP_GROUP_NONE, "NONE", 0, "None", ""}, {KSP_GROUP_KSNAME, "KEYINGSET", 0, "Keying Set Name", ""}, - {KSP_GROUP_TEMPLATE_ITEM, "TEMPLATE", 0, "Innermost Context-Item Name", ""}, {0, NULL, 0, NULL, NULL}}; #ifdef RNA_RUNTIME +#include "BKE_animsys.h" + static int rna_AnimData_action_editable(PointerRNA *ptr) { AnimData *adt= (AnimData *)ptr->data; @@ -66,6 +68,152 @@ static void rna_AnimData_action_set(PointerRNA *ptr, PointerRNA value) /* ****************************** */ +/* wrapper for poll callback */ +static int RKS_POLL_rna_internal(KeyingSetInfo *ksi, bContext *C) +{ + PointerRNA ptr; + ParameterList list; + FunctionRNA *func; + void *ret; + int ok; + + RNA_pointer_create(NULL, ksi->ext.srna, ksi, &ptr); + func= RNA_struct_find_function(&ptr, "poll"); + + RNA_parameter_list_create(&list, &ptr, func); + /* hook up arguments */ + RNA_parameter_set_lookup(&list, "ksi", &ksi); + RNA_parameter_set_lookup(&list, "context", &C); + + /* execute the function */ + ksi->ext.call(&ptr, func, &list); + + /* read the result */ + RNA_parameter_get_lookup(&list, "ok", &ret); + ok= *(int*)ret; + RNA_parameter_list_free(&list); + + return ok; +} + +/* wrapper for iterator callback */ +static void RKS_ITER_rna_internal(KeyingSetInfo *ksi, bContext *C, KeyingSet *ks) +{ + PointerRNA ptr; + ParameterList list; + FunctionRNA *func; + + RNA_pointer_create(NULL, ksi->ext.srna, ksi, &ptr); + func= RNA_struct_find_function(&ptr, "iterator"); + + RNA_parameter_list_create(&list, &ptr, func); + /* hook up arguments */ + RNA_parameter_set_lookup(&list, "ksi", &ksi); + RNA_parameter_set_lookup(&list, "context", &C); + RNA_parameter_set_lookup(&list, "ks", &ks); + + /* execute the function */ + ksi->ext.call(&ptr, func, &list); + RNA_parameter_list_free(&list); +} + +/* wrapper for generator callback */ +static void RKS_GEN_rna_internal(KeyingSetInfo *ksi, bContext *C, KeyingSet *ks, PointerRNA *data) +{ + PointerRNA ptr; + ParameterList list; + FunctionRNA *func; + + RNA_pointer_create(NULL, ksi->ext.srna, ksi, &ptr); + func= RNA_struct_find_function(&ptr, "generate"); + + RNA_parameter_list_create(&list, &ptr, func); + /* hook up arguments */ + RNA_parameter_set_lookup(&list, "ksi", &ksi); + RNA_parameter_set_lookup(&list, "context", &C); + RNA_parameter_set_lookup(&list, "ks", &ks); + RNA_parameter_set_lookup(&list, "data", data); + + /* execute the function */ + ksi->ext.call(&ptr, func, &list); + RNA_parameter_list_free(&list); +} + +/* ------ */ + +// XXX: the exact purpose of this is not too clear... maybe we want to revise this at some point? +static StructRNA *rna_KeyingSetInfo_refine(PointerRNA *ptr) +{ + KeyingSetInfo *ksi= (KeyingSetInfo *)ptr->data; + return (ksi->ext.srna)? ksi->ext.srna: &RNA_KeyingSetInfo; +} + +static void rna_KeyingSetInfo_unregister(const bContext *C, StructRNA *type) +{ + KeyingSetInfo *ksi= RNA_struct_blender_type_get(type); + + if (ksi == NULL) + return; + + /* free RNA data referencing this */ + RNA_struct_free_extension(type, &ksi->ext); + RNA_struct_free(&BLENDER_RNA, type); + + /* unlink Blender-side data */ + ANIM_keyingset_info_unregister(C, ksi); +} + +static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free) +{ + KeyingSetInfo dummyksi = {0}; + KeyingSetInfo *ksi; + PointerRNA dummyptr; + int have_function[3]; + + /* setup dummy type info to store static properties in */ + // TODO: perhaps we want to get users to register as if they're using 'KeyingSet' directly instead? + RNA_pointer_create(NULL, &RNA_KeyingSetInfo, &dummyksi, &dummyptr); + + /* validate the python class */ + if (validate(&dummyptr, data, have_function) != 0) + return NULL; + + if (strlen(identifier) >= sizeof(dummyksi.idname)) { + BKE_reportf(reports, RPT_ERROR, "registering keying set info class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyksi.idname)); + return NULL; + } + + /* check if we have registered this info before, and remove it */ + ksi = ANIM_keyingset_info_find_named(dummyksi.idname); + if (ksi && ksi->ext.srna) + rna_KeyingSetInfo_unregister(C, ksi->ext.srna); + + /* create a new KeyingSetInfo type */ + ksi= MEM_callocN(sizeof(KeyingSetInfo), "python keying set info"); + memcpy(ksi, &dummyksi, sizeof(KeyingSetInfo)); + + /* set RNA-extensions info */ + ksi->ext.srna= RNA_def_struct(&BLENDER_RNA, ksi->idname, "KeyingSetInfo"); + ksi->ext.data= data; + ksi->ext.call= call; + ksi->ext.free= free; + RNA_struct_blender_type_set(ksi->ext.srna, ksi); + + /* set callbacks */ + // NOTE: we really should have all of these... + ksi->poll= (have_function[0])? RKS_POLL_rna_internal: NULL; + ksi->iter= (have_function[1])? RKS_ITER_rna_internal: NULL; + ksi->generate= (have_function[2])? RKS_GEN_rna_internal: NULL; + + /* add and register with other info as needed */ + ANIM_keyingset_info_register(C, ksi); + + /* return the struct-rna added */ + return ksi->ext.srna; +} + +/* ****************************** */ + static StructRNA *rna_ksPath_id_typef(PointerRNA *ptr) { KS_Path *ksp= (KS_Path*)ptr->data; @@ -165,8 +313,167 @@ static void rna_KeyingSet_active_ksPath_index_range(PointerRNA *ptr, int *min, i *max= MAX2(0, *max); } +static PointerRNA rna_KeyingSet_typeinfo_get(PointerRNA *ptr) +{ + KeyingSet *ks= (KeyingSet *)ptr->data; + KeyingSetInfo *ksi = NULL; + + /* keying set info is only for builtin Keying Sets */ + if ((ks->flag & KEYINGSET_ABSOLUTE)==0) + ksi = ANIM_keyingset_info_find_named(ks->typeinfo); + return rna_pointer_inherit_refine(ptr, &RNA_KeyingSetInfo, ksi); +} + + + +static KS_Path *rna_KeyingSet_paths_add(KeyingSet *keyingset, ReportList *reports, + ID *id, char rna_path[], int index, int grouping_method, char group_name[]) +{ + KS_Path *ksp = NULL; + short flag = 0; + + /* special case when index = -1, we key the whole array (as with other places where index is used) */ + if (index == -1) { + flag |= KSP_FLAG_WHOLE_ARRAY; + index = 0; + } + + /* if data is valid, call the API function for this */ + if (keyingset) { + ksp= BKE_keyingset_add_path(keyingset, id, group_name, rna_path, index, flag, grouping_method); + keyingset->active_path= BLI_countlist(&keyingset->paths); + } + else { + BKE_report(reports, RPT_ERROR, "Keying Set Path could not be added."); + } + + /* return added path */ + return ksp; +} + +static void rna_KeyingSet_paths_remove(KeyingSet *keyingset, ReportList *reports, KS_Path *ksp) +{ + /* if data is valid, call the API function for this */ + if (keyingset && ksp) { + /* remove the active path from the KeyingSet */ + BKE_keyingset_free_path(keyingset, ksp); + + /* the active path number will most likely have changed */ + // TODO: we should get more fancy and actually check if it was removed, but this will do for now + keyingset->active_path = 0; + } + else { + BKE_report(reports, RPT_ERROR, "Keying Set Path could not be removed."); + } +} + +static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports) +{ + /* if data is valid, call the API function for this */ + if (keyingset) { + KS_Path *ksp, *kspn; + + /* free each path as we go to avoid looping twice */ + for (ksp= keyingset->paths.first; ksp; ksp= kspn) { + kspn= ksp->next; + BKE_keyingset_free_path(keyingset, ksp); + } + + /* reset the active path, since there aren't any left */ + keyingset->active_path = 0; + } + else { + BKE_report(reports, RPT_ERROR, "Keying Set Paths could not be removed."); + } +} + + #else +/* helper function for Keying Set -> keying settings */ +static void rna_def_common_keying_flags(StructRNA *srna, short reg) +{ + PropertyRNA *prop; + + prop= RNA_def_property(srna, "insertkey_needed", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_NEEDED); + RNA_def_property_ui_text(prop, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves"); + if (reg) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + + prop= RNA_def_property(srna, "insertkey_visual", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_MATRIX); + RNA_def_property_ui_text(prop, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'"); + if (reg) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + + prop= RNA_def_property(srna, "insertkey_xyz_to_rgb", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_XYZ2RGB); + RNA_def_property_ui_text(prop, "F-Curve Colors - XYZ to RGB", "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"); + if (reg) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); +} + +/* --- */ + +static void rna_def_keyingset_info(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + FunctionRNA *func; + PropertyRNA *parm; + + srna= RNA_def_struct(brna, "KeyingSetInfo", NULL); + RNA_def_struct_sdna(srna, "KeyingSetInfo"); + RNA_def_struct_ui_text(srna, "Keying Set Info", "Callback function defines for builtin Keying Sets"); + RNA_def_struct_refine_func(srna, "rna_KeyingSetInfo_refine"); + RNA_def_struct_register_funcs(srna, "rna_KeyingSetInfo_register", "rna_KeyingSetInfo_unregister"); + + /* Properties --------------------- */ + + RNA_define_verify_sdna(0); // not in sdna + + prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "idname"); + RNA_def_property_flag(prop, PROP_REGISTER); + + /* Name */ + prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "name"); + RNA_def_property_ui_text(prop, "Name", ""); + RNA_def_struct_name_property(srna, prop); + RNA_def_property_flag(prop, PROP_REGISTER); + + rna_def_common_keying_flags(srna, 1); /* '1' arg here is to indicate that we need these to be set on registering */ + + RNA_define_verify_sdna(1); + + /* Function Callbacks ------------- */ + /* poll */ + func= RNA_def_function(srna, "poll", NULL); + RNA_def_function_ui_description(func, "Test if Keying Set can be used or not"); + RNA_def_function_flag(func, FUNC_REGISTER); + RNA_def_function_return(func, RNA_def_boolean(func, "ok", 1, "", "")); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + + /* iterator */ + func= RNA_def_function(srna, "iterator", NULL); + RNA_def_function_ui_description(func, "Call generate() on the structs which have properties to be keyframed"); + RNA_def_function_flag(func, FUNC_REGISTER); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_pointer(func, "ks", "KeyingSet", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + + /* generate */ + func= RNA_def_function(srna, "generate", NULL); + RNA_def_function_ui_description(func, "Add Paths to the Keying Set to keyframe the properties of the given data"); + RNA_def_function_flag(func, FUNC_REGISTER); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_pointer(func, "ks", "KeyingSet", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_pointer(func, "data", "AnyType", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL); +} static void rna_def_keyingset_path(BlenderRNA *brna) { @@ -215,6 +522,60 @@ static void rna_def_keyingset_path(BlenderRNA *brna) prop= RNA_def_property(srna, "entire_array", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", KSP_FLAG_WHOLE_ARRAY); RNA_def_property_ui_text(prop, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used"); + + /* Keyframing Settings */ + rna_def_common_keying_flags(srna, 0); +} + + + +/* keyingset.paths */ +static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "KeyingSetPaths"); + srna= RNA_def_struct(brna, "KeyingSetPaths", NULL); + RNA_def_struct_sdna(srna, "KeyingSet"); + RNA_def_struct_ui_text(srna, "Keying set paths", "Collection of keying set paths"); + + + /* Add Path */ + func= RNA_def_function(srna, "add", "rna_KeyingSet_paths_add"); + RNA_def_function_ui_description(func, "Add a new path for the Keying Set."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + /* return arg */ + parm= RNA_def_pointer(func, "ksp", "KeyingSetPath", "New Path", "Path created and added to the Keying Set"); + RNA_def_function_return(func, parm); + /* ID-block for target */ + parm= RNA_def_pointer(func, "target_id", "ID", "Target ID", "ID-Datablock for the destination."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* rna-path */ + parm= RNA_def_string(func, "data_path", "", 256, "Data-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough + RNA_def_property_flag(parm, PROP_REQUIRED); + /* index (defaults to -1 for entire array) */ + parm=RNA_def_int(func, "index", -1, -1, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX); + /* grouping */ + parm=RNA_def_enum(func, "grouping_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use."); + parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name)."); + + + /* Remove Path */ + func= RNA_def_function(srna, "remove", "rna_KeyingSet_paths_remove"); + RNA_def_function_ui_description(func, "Remove the given path from the Keying Set."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + /* path to remove */ + parm= RNA_def_pointer(func, "path", "KeyingSetPath", "Path", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + + + /* Remove All Paths */ + func= RNA_def_function(srna, "clear", "rna_KeyingSet_paths_clear"); + RNA_def_function_ui_description(func, "Remove all the paths from the Keying Set."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); } static void rna_def_keyingset(BlenderRNA *brna) @@ -228,13 +589,21 @@ static void rna_def_keyingset(BlenderRNA *brna) /* Name */ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", ""); + RNA_def_struct_ui_icon(srna, ICON_KEY_HLT); // TODO: we need a dedicated icon RNA_def_struct_name_property(srna, prop); + /* KeyingSetInfo (Type Info) for Builtin Sets only */ + prop= RNA_def_property(srna, "type_info", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "KeyingSetInfo"); + RNA_def_property_pointer_funcs(prop, "rna_KeyingSet_typeinfo_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Type Info", "Callback function defines for built-in Keying Sets"); + /* Paths */ prop= RNA_def_property(srna, "paths", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "paths", NULL); RNA_def_property_struct_type(prop, "KeyingSetPath"); RNA_def_property_ui_text(prop, "Paths", "Keying Set Paths to define settings that get keyframed together"); + rna_def_keyingset_paths(brna, prop); prop= RNA_def_property(srna, "active_path", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "KeyingSetPath"); @@ -249,28 +618,13 @@ static void rna_def_keyingset(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Active Path Index", "Current Keying Set index"); /* Flags */ - // XXX: depreceated - prop= RNA_def_property(srna, "builtin", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYINGSET_BUILTIN); - RNA_def_property_ui_text(prop, "Built-In", "Keying Set is a built-in to Blender"); - prop= RNA_def_property(srna, "absolute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYINGSET_ABSOLUTE); - RNA_def_property_ui_text(prop, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"); + RNA_def_property_ui_text(prop, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"); /* Keyframing Flags */ - prop= RNA_def_property(srna, "insertkey_needed", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_NEEDED); - RNA_def_property_ui_text(prop, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves"); + rna_def_common_keying_flags(srna, 0); - prop= RNA_def_property(srna, "insertkey_visual", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_MATRIX); - RNA_def_property_ui_text(prop, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'"); - - prop= RNA_def_property(srna, "insertkey_xyz_to_rgb", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_XYZ2RGB); - RNA_def_property_ui_text(prop, "F-Curve Colors - XYZ to RGB", "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"); /* Keying Set API */ RNA_api_keyingset(srna); @@ -347,6 +701,7 @@ void RNA_def_animation(BlenderRNA *brna) rna_def_keyingset(brna); rna_def_keyingset_path(brna); + rna_def_keyingset_info(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_animation_api.c b/source/blender/makesrna/intern/rna_animation_api.c index b07f147ac96..1e62e10f211 100644 --- a/source/blender/makesrna/intern/rna_animation_api.c +++ b/source/blender/makesrna/intern/rna_animation_api.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -31,7 +31,6 @@ #include "RNA_define.h" #include "RNA_enum_types.h" -#include "RNA_types.h" #include "DNA_anim_types.h" #include "DNA_object_types.h" @@ -41,49 +40,12 @@ #include "BKE_animsys.h" -static void rna_KeyingSet_add_path(KeyingSet *keyingset, ReportList *reports, - ID *id, char rna_path[], int array_index, int entire_array, - int grouping_method, char group_name[]) -{ - short flag = 0; - - /* validate flags */ - if (entire_array) - flag |= KSP_FLAG_WHOLE_ARRAY; - - /* if data is valid, call the API function for this */ - if (keyingset) { - BKE_keyingset_add_path(keyingset, id, group_name, rna_path, array_index, flag, grouping_method); - keyingset->active_path= BLI_countlist(&keyingset->paths); - } - else { - BKE_report(reports, RPT_ERROR, "Keying Set Path could not be added."); - } -} - #else void RNA_api_keyingset(StructRNA *srna) { - FunctionRNA *func; - PropertyRNA *parm; - - /* Add Destination */ - func= RNA_def_function(srna, "add_path", "rna_KeyingSet_add_path"); - RNA_def_function_ui_description(func, "Add a new destination for the Keying Set."); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - /* ID-block for target */ - parm= RNA_def_pointer(func, "target_id", "ID", "Target ID", "ID-Datablock for the destination."); - RNA_def_property_flag(parm, PROP_REQUIRED); - /* rna-path */ - parm= RNA_def_string(func, "data_path", "", 256, "Data-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough - RNA_def_property_flag(parm, PROP_REQUIRED); - parm=RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX); - /* flags */ - parm=RNA_def_boolean(func, "entire_array", 1, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used."); - /* grouping */ - parm=RNA_def_enum(func, "grouping_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use."); - parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name)."); +// FunctionRNA *func; +// PropertyRNA *parm; } #endif diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c index d67781085e5..1d9276e7ea2 100644 --- a/source/blender/makesrna/intern/rna_animviz.c +++ b/source/blender/makesrna/intern/rna_animviz.c @@ -24,10 +24,7 @@ #include -#include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" -#include "RNA_enum_types.h" #include "rna_internal.h" @@ -128,11 +125,13 @@ static void rna_def_animviz_motion_path(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Motion Path Points", "Cached positions per frame"); /* Playback Ranges */ - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); + RNA_def_property_int_sdna(prop, NULL, "start_frame"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of the stored range"); - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); + RNA_def_property_int_sdna(prop, NULL, "end_frame"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "End Frame", "End frame of the stored range"); @@ -159,7 +158,7 @@ static void rna_def_animviz_ghosts(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem prop_type_items[] = { - {GHOST_TYPE_NONE, "NONE", 0, "No Ghosts", "Don not show any ghosts"}, + {GHOST_TYPE_NONE, "NONE", 0, "No Ghosts", "Do not show any ghosts"}, {GHOST_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Current Frame", "Show ghosts from around the current frame"}, {GHOST_TYPE_RANGE, "RANGE", 0, "In Range", "Show ghosts for the specified frame range"}, {GHOST_TYPE_KEYS, "KEYS", 0, "On Keyframes", "Show ghosts on keyframes"}, @@ -187,17 +186,17 @@ static void rna_def_animviz_ghosts(BlenderRNA *brna) prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ghost_step"); RNA_def_property_range(prop, 1, 20); - RNA_def_property_ui_text(prop, "Frame Step", "Number of frames between ghosts shown (not for 'On Keyframes' Onion-skining method)"); + RNA_def_property_ui_text(prop, "Frame Step", "Number of frames between ghosts shown (not for 'On Keyframes' Onion-skinning method)"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ /* Playback Ranges */ - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "ghost_sf"); RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_ghost_start_frame_set", NULL); RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "ghost_ef"); RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_ghost_end_frame_set", NULL); RNA_def_property_ui_text(prop, "End Frame", "End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)"); @@ -223,8 +222,8 @@ static void rna_def_animviz_paths(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem prop_type_items[]= { - {MOTIONPATH_TYPE_RANGE, "RANGE", 0, "In Range", "Display Paths of poses within specified range"}, {MOTIONPATH_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Frame", "Display Paths of poses within a fixed number of frames around the current frame"}, + {MOTIONPATH_TYPE_RANGE, "RANGE", 0, "In Range", "Display Paths of poses within specified range"}, {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem prop_location_items[]= { {MOTIONPATH_BAKE_HEADS, "HEADS", 0, "Heads", "Calculate bone paths from heads"}, @@ -265,21 +264,26 @@ static void rna_def_animviz_paths(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Keyframe Numbers", "Show frame numbers of Keyframes on Motion Paths"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ + prop= RNA_def_property(srna, "search_all_action_keyframes", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFACT); + RNA_def_property_ui_text(prop, "All Action Keyframes", "For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower)"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ + prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "path_step"); RNA_def_property_range(prop, 1, 100); - RNA_def_property_ui_text(prop, "Frame Step", "Number of frames between paths shown (not for 'On Keyframes' Onion-skining method)"); + RNA_def_property_ui_text(prop, "Frame Step", "Number of frames between paths shown (not for 'On Keyframes' Onion-skinning method)"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ /* Playback Ranges */ - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "path_sf"); RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_path_start_frame_set", NULL); RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "path_ef"); RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_path_end_frame_set", NULL); RNA_def_property_ui_text(prop, "End Frame", "End frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)"); diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c index d994a1c20be..9239378f496 100644 --- a/source/blender/makesrna/intern/rna_armature.c +++ b/source/blender/makesrna/intern/rna_armature.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -211,11 +210,11 @@ static void rna_EditBone_name_set(PointerRNA *ptr, const char *value) { bArmature *arm= (bArmature*)ptr->id.data; EditBone *ebone= (EditBone*)ptr->data; - char oldname[32], newname[32]; + char oldname[sizeof(ebone->name)], newname[sizeof(ebone->name)]; /* need to be on the stack */ - BLI_strncpy(newname, value, 32); - BLI_strncpy(oldname, ebone->name, 32); + BLI_strncpy(newname, value, sizeof(ebone->name)); + BLI_strncpy(oldname, ebone->name, sizeof(ebone->name)); ED_armature_bone_rename(arm, oldname, newname); } @@ -224,12 +223,12 @@ static void rna_Bone_name_set(PointerRNA *ptr, const char *value) { bArmature *arm= (bArmature*)ptr->id.data; Bone *bone= (Bone*)ptr->data; - char oldname[32], newname[32]; + char oldname[sizeof(bone->name)], newname[sizeof(bone->name)]; /* need to be on the stack */ - BLI_strncpy(newname, value, 32); - BLI_strncpy(oldname, bone->name, 32); - + BLI_strncpy(newname, value, sizeof(bone->name)); + BLI_strncpy(oldname, bone->name, sizeof(bone->name)); + ED_armature_bone_rename(arm, oldname, newname); } @@ -862,11 +861,6 @@ static void rna_def_armature(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Use Dual Quaternion Deformation", "Enable deform rotation with Quaternions"); RNA_def_property_update(prop, 0, "rna_Armature_update_data"); - prop= RNA_def_property(srna, "deform_bbone_rest", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_B_BONE_REST); - RNA_def_property_ui_text(prop, "B-Bones Deform in Rest Position", "Make B-Bones deform already in Rest Position"); - RNA_def_property_update(prop, 0, "rna_Armature_update_data"); - //prop= RNA_def_property(srna, "deform_invert_vertexgroups", PROP_BOOLEAN, PROP_NONE); //RNA_def_property_boolean_negative_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP); //RNA_def_property_ui_text(prop, "Invert Vertex Group Influence", "Invert Vertex Group influence (only for Modifiers)"); @@ -878,25 +872,25 @@ static void rna_def_armature(BlenderRNA *brna) prop= RNA_def_property(srna, "ghost_step", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ghostep"); RNA_def_property_range(prop, 0, 30); - RNA_def_property_ui_text(prop, "Ghosting Step", "Number of frame steps on either side of current frame to show as ghosts (only for 'Around Current Frame' Onion-skining method)"); + RNA_def_property_ui_text(prop, "Ghosting Step", "Number of frame steps on either side of current frame to show as ghosts (only for 'Around Current Frame' Onion-skinning method)"); RNA_def_property_update(prop, 0, "rna_Armature_redraw_data"); RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); prop= RNA_def_property(srna, "ghost_size", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ghostsize"); RNA_def_property_range(prop, 1, 20); - RNA_def_property_ui_text(prop, "Ghosting Frame Step", "Frame step for Ghosts (not for 'On Keyframes' Onion-skining method)"); + RNA_def_property_ui_text(prop, "Ghosting Frame Step", "Frame step for Ghosts (not for 'On Keyframes' Onion-skinning method)"); RNA_def_property_update(prop, 0, "rna_Armature_redraw_data"); RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); - prop= RNA_def_property(srna, "ghost_start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "ghost_frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "ghostsf"); RNA_def_property_int_funcs(prop, NULL, "rna_Armature_ghost_start_frame_set", NULL); RNA_def_property_ui_text(prop, "Ghosting Start Frame", "Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)"); RNA_def_property_update(prop, 0, "rna_Armature_redraw_data"); RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); - prop= RNA_def_property(srna, "ghost_end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "ghost_frame_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "ghostef"); RNA_def_property_int_funcs(prop, NULL, "rna_Armature_ghost_end_frame_set", NULL); RNA_def_property_ui_text(prop, "Ghosting End Frame", "End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)"); diff --git a/source/blender/makesrna/intern/rna_armature_api.c b/source/blender/makesrna/intern/rna_armature_api.c index 0f38486a6fc..cd78bd6e578 100644 --- a/source/blender/makesrna/intern/rna_armature_api.c +++ b/source/blender/makesrna/intern/rna_armature_api.c @@ -30,7 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #ifdef RNA_RUNTIME @@ -38,7 +37,6 @@ #include "BLI_blenlib.h" -#include "ED_armature.h" void rna_EditBone_align_roll(EditBone *ebo, float *no) { diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c index 063e20a73b7..7e52032687c 100644 --- a/source/blender/makesrna/intern/rna_boid.c +++ b/source/blender/makesrna/intern/rna_boid.c @@ -32,7 +32,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -84,7 +83,7 @@ static void rna_Boids_reset(Main *bmain, Scene *scene, PointerRNA *ptr) else DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET); - WM_main_add_notifier(NC_OBJECT|ND_PARTICLE_DATA, NULL); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); } static void rna_Boids_reset_deps(Main *bmain, Scene *scene, PointerRNA *ptr) { @@ -100,7 +99,7 @@ static void rna_Boids_reset_deps(Main *bmain, Scene *scene, PointerRNA *ptr) DAG_scene_sort(scene); - WM_main_add_notifier(NC_OBJECT|ND_PARTICLE_DATA, NULL); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); } static StructRNA* rna_BoidRule_refine(struct PointerRNA *ptr) @@ -267,7 +266,7 @@ static void rna_def_boidrule_avoid(BlenderRNA *brna) prop= RNA_def_property(srna, "fear_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0f, 100.0f); - RNA_def_property_ui_text(prop, "Fear factor", "Avoid object if danger from it is above this threshol"); + RNA_def_property_ui_text(prop, "Fear factor", "Avoid object if danger from it is above this threshold"); RNA_def_property_update(prop, 0, "rna_Boids_reset"); } @@ -446,7 +445,7 @@ static void rna_def_boidstate(BlenderRNA *brna) prop= RNA_def_property(srna, "rule_fuzziness", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0, 1.0); - RNA_def_property_ui_text(prop, "Rule Fuzzines", ""); + RNA_def_property_ui_text(prop, "Rule Fuzziness", ""); RNA_def_property_update(prop, 0, "rna_Boids_reset"); prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index f3e784045b3..6d5a06d4f81 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -25,12 +25,12 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" #include "DNA_brush_types.h" #include "DNA_texture_types.h" +#include "DNA_scene_types.h" #include "BLI_math.h" @@ -52,6 +52,58 @@ static void rna_Brush_update(Main *bmain, Scene *scene, PointerRNA *ptr) WM_main_add_notifier(NC_BRUSH|NA_EDITED, br); } +static int rna_Brush_is_sculpt_brush(Brush *me, bContext *C) +{ + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + int i; + + for (i= 0; i < sd->paint.brush_count; i++) { + if (strcmp(me->id.name+2, sd->paint.brushes[i]->id.name+2) == 0) + return 1; + } + + return 0; +} + +static int rna_Brush_is_vpaint_brush(Brush *me, bContext *C) +{ + VPaint *vp = CTX_data_tool_settings(C)->vpaint; + int i; + + for (i= 0; i < vp->paint.brush_count; i++) { + if (strcmp(me->id.name+2, vp->paint.brushes[i]->id.name+2) == 0) + return 1; + } + + return 0; +} + +static int rna_Brush_is_wpaint_brush(Brush *me, bContext *C) +{ + VPaint *vp = CTX_data_tool_settings(C)->wpaint; + int i; + + for (i= 0; i < vp->paint.brush_count; i++) { + if (strcmp(me->id.name+2, vp->paint.brushes[i]->id.name+2) == 0) + return 1; + } + + return 0; +} + +static int rna_Brush_is_imapaint_brush(Brush *me, bContext *C) +{ + ImagePaintSettings *data = &(CTX_data_tool_settings(C)->imapaint); + int i; + + for (i= 0; i < data->paint.brush_count; i++) { + if (strcmp(me->id.name+2, data->paint.brushes[i]->id.name+2) == 0) + return 1; + } + + return 0; +} + #else static void rna_def_brush_texture_slot(BlenderRNA *brna) @@ -101,14 +153,42 @@ static void rna_def_brush(BlenderRNA *brna) static EnumPropertyItem brush_sculpt_tool_items[] = { {SCULPT_TOOL_DRAW, "DRAW", 0, "Draw", ""}, {SCULPT_TOOL_SMOOTH, "SMOOTH", 0, "Smooth", ""}, + {SCULPT_TOOL_CREASE, "CREASE", 0, "Crease", ""}, + {SCULPT_TOOL_BLOB, "BLOB", 0, "Blob", ""}, {SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", ""}, {SCULPT_TOOL_INFLATE, "INFLATE", 0, "Inflate", ""}, {SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", ""}, + {SCULPT_TOOL_SNAKE_HOOK, "SNAKE_HOOK", 0, "Snake Hook", ""}, + {SCULPT_TOOL_ROTATE, "ROTATE", 0, "Rotate", ""}, + {SCULPT_TOOL_THUMB, "THUMB", 0, "Thumb", ""}, + {SCULPT_TOOL_NUDGE, "NUDGE", 0, "Nudge", ""}, {SCULPT_TOOL_LAYER, "LAYER", 0, "Layer", ""}, {SCULPT_TOOL_FLATTEN, "FLATTEN", 0, "Flatten", ""}, {SCULPT_TOOL_CLAY, "CLAY", 0, "Clay", ""}, + //{SCULPT_TOOL_CLAY_TUBES, "CLAY_TUBES", 0, "Clay Tubes", ""}, XXX: remove clay tubes from UI + {SCULPT_TOOL_FILL, "FILL", 0, "Fill", ""}, + {SCULPT_TOOL_SCRAPE, "SCRAPE", 0, "Scrape", ""}, {0, NULL, 0, NULL, NULL}}; - + + static EnumPropertyItem brush_stroke_method_items[] = { + {0, "DOTS", 0, "Dots", ""}, + {BRUSH_RESTORE_MESH, "DRAG_DOT", 0, "Drag Dot", ""}, + {BRUSH_SPACE, "SPACE", 0, "Space", ""}, + {BRUSH_ANCHORED, "ANCHORED", 0, "Anchored", ""}, + {BRUSH_AIRBRUSH, "AIRBRUSH", 0, "Airbrush", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem texture_angle_source_items[] = { + {0, "USER", 0, "User", ""}, + {BRUSH_RAKE, "RAKE", 0, "Rake", ""}, + {BRUSH_RANDOM_ROTATION, "RANDOM", 0, "Random", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem texture_angle_source_no_random_items[] = { + {0, "USER", 0, "User", ""}, + {BRUSH_RAKE, "RAKE", 0, "Rake", ""}, + {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem brush_vertexpaint_tool_items[] = { {0, "MIX", 0, "Mix", "Use mix blending mode while painting"}, {1, "ADD", 0, "Add", "Use add blending mode while painting"}, @@ -130,11 +210,76 @@ static void rna_def_brush(BlenderRNA *brna) {0, "ADD", 0, "Add", "Add effect of brush"}, {BRUSH_DIR_IN, "SUBTRACT", 0, "Subtract", "Subtract effect of brush"}, {0, NULL, 0, NULL, NULL}}; - + + static const EnumPropertyItem prop_flatten_contrast_items[]= { + {0, "FLATTEN", 0, "Flatten", "Add effect of brush"}, + {BRUSH_DIR_IN, "CONTRAST", 0, "Contrast", "Subtract effect of brush"}, + {0, NULL, 0, NULL, NULL}}; + + static const EnumPropertyItem prop_fill_deepen_items[]= { + {0, "FILL", 0, "Fill", "Add effect of brush"}, + {BRUSH_DIR_IN, "DEEPEN", 0, "Deepen", "Subtract effect of brush"}, + {0, NULL, 0, NULL, NULL}}; + + static const EnumPropertyItem prop_scrape_peaks_items[]= { + {0, "SCRAPE", 0, "Scrape", "Add effect of brush"}, + {BRUSH_DIR_IN, "PEAKS", 0, "Peaks", "Subtract effect of brush"}, + {0, NULL, 0, NULL, NULL}}; + + static const EnumPropertyItem prop_pinch_magnify_items[]= { + {0, "PINCH", 0, "Pinch", "Add effect of brush"}, + {BRUSH_DIR_IN, "MAGNIFY", 0, "Magnify", "Subtract effect of brush"}, + {0, NULL, 0, NULL, NULL}}; + + static const EnumPropertyItem prop_inflate_deflate_items[]= { + {0, "INFLATE", 0, "Inflate", "Add effect of brush"}, + {BRUSH_DIR_IN, "DEFLATE", 0, "Deflate", "Subtract effect of brush"}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem brush_sculpt_plane_items[] = { + {SCULPT_DISP_DIR_AREA, "AREA", 0, "Area Plane", ""}, + {SCULPT_DISP_DIR_VIEW, "VIEW", 0, "View Plane", ""}, + {SCULPT_DISP_DIR_X, "X", 0, "X Plane", ""}, + {SCULPT_DISP_DIR_Y, "Y", 0, "Y Plane", ""}, + {SCULPT_DISP_DIR_Z, "Z", 0, "Z Plane", ""}, + {0, NULL, 0, NULL, NULL}}; + + FunctionRNA *func; + PropertyRNA *parm; + srna= RNA_def_struct(brna, "Brush", "ID"); RNA_def_struct_ui_text(srna, "Brush", "Brush datablock for storing brush settings for painting and sculpting"); RNA_def_struct_ui_icon(srna, ICON_BRUSH_DATA); - + + /* functions */ + func= RNA_def_function(srna, "is_sculpt_brush", "rna_Brush_is_sculpt_brush"); + RNA_def_function_ui_description(func, "Returns true if Brush can be used for sculpting"); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_boolean(func, "ret", 0, "", ""); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "is_vpaint_brush", "rna_Brush_is_vpaint_brush"); + RNA_def_function_ui_description(func, "Returns true if Brush can be used for vertex painting"); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_boolean(func, "ret", 0, "", ""); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "is_wpaint_brush", "rna_Brush_is_wpaint_brush"); + RNA_def_function_ui_description(func, "Returns true if Brush can be used for weight painting"); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_boolean(func, "ret", 0, "", ""); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "is_imapaint_brush", "rna_Brush_is_imapaint_brush"); + RNA_def_function_ui_description(func, "Returns true if Brush can be used for image painting"); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_boolean(func, "ret", 0, "", ""); + RNA_def_function_return(func, parm); + /* enums */ prop= RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_blend_items); @@ -145,7 +290,7 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_enum_items(prop, brush_sculpt_tool_items); RNA_def_property_ui_text(prop, "Sculpt Tool", ""); RNA_def_property_update(prop, 0, "rna_Brush_update"); - + prop= RNA_def_property(srna, "vertexpaint_tool", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, brush_vertexpaint_tool_items); RNA_def_property_ui_text(prop, "Vertex/Weight Paint Tool", ""); @@ -159,41 +304,103 @@ static void rna_def_brush(BlenderRNA *brna) prop= RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); RNA_def_property_enum_items(prop, prop_flip_direction_items); - RNA_def_property_ui_text(prop, "Direction", "Mapping type to use for this image in the game engine"); + RNA_def_property_ui_text(prop, "Direction", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "stroke_method", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, brush_stroke_method_items); + RNA_def_property_ui_text(prop, "Stroke Method", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "texture_angle_source", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, texture_angle_source_items); + RNA_def_property_ui_text(prop, "Texture Angle Source", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "texture_angle_source_no_random", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, texture_angle_source_no_random_items); + RNA_def_property_ui_text(prop, "Texture Angle Source", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "flatten_contrast", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, prop_flatten_contrast_items); + RNA_def_property_ui_text(prop, "Flatten/Contrast", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "inflate_deflate", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, prop_inflate_deflate_items); + RNA_def_property_ui_text(prop, "Inflate/Deflate", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "fill_deepen", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, prop_fill_deepen_items); + RNA_def_property_ui_text(prop, "Fill/Deepen", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "scrape_peaks", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, prop_scrape_peaks_items); + RNA_def_property_ui_text(prop, "Scrape/Peaks", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "pinch_magnify", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, prop_pinch_magnify_items); + RNA_def_property_ui_text(prop, "Pinch/Magnify", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "sculpt_plane", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, brush_sculpt_plane_items); + RNA_def_property_ui_text(prop, "Sculpt Plane", ""); RNA_def_property_update(prop, 0, "rna_Brush_update"); /* number values */ - prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, 200); - RNA_def_property_ui_text(prop, "Size", "Diameter of the brush"); + prop= RNA_def_property(srna, "size", PROP_INT, PROP_DISTANCE); + RNA_def_property_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS*10); + RNA_def_property_ui_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS, 1, 0); + RNA_def_property_ui_text(prop, "Size", "Radius of the brush in pixels"); RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "unprojected_radius", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_range(prop, 0, FLT_MAX); + RNA_def_property_ui_range(prop, 0, 1, 0, 0); + RNA_def_property_ui_text(prop, "Surface Size", "Radius of brush in Blender units"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "jitter", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "jitter"); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Jitter", "Jitter the position of the brush while painting"); RNA_def_property_update(prop, 0, "rna_Brush_update"); - prop= RNA_def_property(srna, "spacing", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "spacing"); - RNA_def_property_range(prop, 1.0f, 100.0f); - RNA_def_property_ui_text(prop, "Spacing", "Spacing between brush stamps"); + prop= RNA_def_property(srna, "spacing", PROP_INT, PROP_PERCENTAGE); + RNA_def_property_int_sdna(prop, NULL, "spacing"); + RNA_def_property_range(prop, 1, 1000); + RNA_def_property_ui_range(prop, 1, 500, 5, 0); + RNA_def_property_ui_text(prop, "Spacing", "Spacing between brush daubs as a percentage of brush diameter"); RNA_def_property_update(prop, 0, "rna_Brush_update"); - prop= RNA_def_property(srna, "smooth_stroke_radius", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "smooth_stroke_radius", PROP_INT, PROP_DISTANCE); RNA_def_property_range(prop, 10, 200); RNA_def_property_ui_text(prop, "Smooth Stroke Radius", "Minimum distance from last point before stroke continues"); RNA_def_property_update(prop, 0, "rna_Brush_update"); - prop= RNA_def_property(srna, "smooth_stroke_factor", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "smooth_stroke_factor", PROP_FLOAT, PROP_FACTOR); RNA_def_property_range(prop, 0.5, 0.99); RNA_def_property_ui_text(prop, "Smooth Stroke Factor", "Higher values give a smoother stroke"); RNA_def_property_update(prop, 0, "rna_Brush_update"); prop= RNA_def_property(srna, "rate", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rate"); - RNA_def_property_range(prop, 0.010f, 1.0f); - RNA_def_property_ui_text(prop, "Rate", "Number of paints per second for Airbrush"); + RNA_def_property_range(prop, 0.0001f , 10000.0f); + RNA_def_property_ui_range(prop, 0.01f, 1.0f, 1, 3); + RNA_def_property_ui_text(prop, "Rate", "Interval between paints for Airbrush"); RNA_def_property_update(prop, 0, "rna_Brush_update"); prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); @@ -202,10 +409,56 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Color", ""); RNA_def_property_update(prop, 0, "rna_Brush_update"); - prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "alpha"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 0.001); + RNA_def_property_ui_text(prop, "Strength", "How powerful the effect of the brush is when applied"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "plane_offset", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_float_sdna(prop, NULL, "plane_offset"); + RNA_def_property_float_default(prop, 0); + RNA_def_property_range(prop, -2.0f, 2.0f); + RNA_def_property_ui_range(prop, -0.5f, 0.5f, 0.001, 0.001); + RNA_def_property_ui_text(prop, "Plane Offset", "Adjusts plane on which the brush acts towards or away from the object surface"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "plane_trim", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_float_sdna(prop, NULL, "plane_trim"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, 0, 1.0f); + RNA_def_property_ui_text(prop, "Plane Trim", "If a vertex is further from offset plane than this then it is not affected"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "texture_sample_bias", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_float_sdna(prop, NULL, "texture_sample_bias"); + RNA_def_property_float_default(prop, 0); + RNA_def_property_range(prop, -1, 1); + RNA_def_property_ui_text(prop, "Texture Sample Bias", "Value added to texture samples"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "normal_weight", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "normal_weight"); + RNA_def_property_float_default(prop, 0); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Strength", "The amount of pressure on the brush"); + RNA_def_property_ui_text(prop, "Normal Weight", "How much grab will pull vertexes out of surface during a grab"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "crease_pinch_factor", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "crease_pinch_factor"); + RNA_def_property_float_default(prop, 2.0f/3.0f); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Crease Brush Pinch Factor", "How much the crease brush pinches"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "autosmooth_factor", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "autosmooth_factor"); + RNA_def_property_float_default(prop, 0); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 0.001); + RNA_def_property_ui_text(prop, "Autosmooth", "Amount of smoothing to automatically apply to each stroke"); RNA_def_property_update(prop, 0, "rna_Brush_update"); /* flag */ @@ -214,6 +467,11 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Airbrush", "Keep applying paint effect while holding mouse (spray)"); RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_original_normal", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ORIGINAL_NORMAL); + RNA_def_property_ui_text(prop, "Original Normal", "When locked keep using normal of surface where stroke was initiated"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_wrap", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_TORUS); RNA_def_property_ui_text(prop, "Wrap", "Enable torus wrapping while painting"); @@ -225,6 +483,12 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Strength Pressure", "Enable tablet pressure sensitivity for strength"); RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_offset_pressure", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_OFFSET_PRESSURE); + RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0); + RNA_def_property_ui_text(prop, "Plane Offset Pressure", "Enable tablet pressure sensitivity for offset"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_size_pressure", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SIZE_PRESSURE); RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0); @@ -243,11 +507,32 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Spacing Pressure", "Enable tablet pressure sensitivity for spacing"); RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_inverse_smooth_pressure", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_INVERSE_SMOOTH_PRESSURE); + RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0); + RNA_def_property_ui_text(prop, "Inverse Smooth Pressure", "Lighter pressure causes more smoothing to be applied"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_rake", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RAKE); RNA_def_property_ui_text(prop, "Rake", "Rotate the brush texture to match the stroke direction"); RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_random_rotation", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RANDOM_ROTATION); + RNA_def_property_ui_text(prop, "Random Rotation", "Rotate the brush texture at random"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "use_plane_trim", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_PLANE_TRIM); + RNA_def_property_ui_text(prop, "Use Plane Trim", "Enable Plane Trim"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "use_frontface", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FRONTFACE); + RNA_def_property_ui_text(prop, "Use Front-Face", "Brush only affects vertexes that face the viewer"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_anchor", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ANCHORED); RNA_def_property_ui_text(prop, "Anchored", "Keep the brush anchored to the initial location"); @@ -273,11 +558,48 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Accumulate", "Accumulate stroke dabs on top of each other"); RNA_def_property_update(prop, 0, "rna_Brush_update"); + prop= RNA_def_property(srna, "use_space_atten", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACE_ATTEN); + RNA_def_property_ui_text(prop, "Use Automatic Strength Adjustment", "Automatically adjusts strength to give consistent results for different spacings"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + /* adaptive space is not implemented yet */ + prop= RNA_def_property(srna, "use_adaptive_space", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ADAPTIVE_SPACE); + RNA_def_property_ui_text(prop, "Adaptive Spacing", "Space daubs according to surface orientation instead of screen space"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "lock_brush_size", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_LOCK_SIZE); + RNA_def_property_ui_text(prop, "Use Blender Units", "When locked brush stays same size relative to object; when unlocked brush size is given in pixels"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "use_texture_overlay", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_TEXTURE_OVERLAY); + RNA_def_property_ui_text(prop, "Use Texture Overlay", "Show texture in viewport"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "edge_to_edge", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_EDGE_TO_EDGE); + RNA_def_property_ui_text(prop, "Edge-to-edge", "Drag anchor brush from edge-to-edge"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "restore_mesh", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RESTORE_MESH); + RNA_def_property_ui_text(prop, "Restore Mesh", "Allows a single dot to be carefully positioned"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + /* not exposed in the interface yet prop= RNA_def_property(srna, "fixed_tex", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FIXED_TEX); RNA_def_property_ui_text(prop, "Fixed Texture", "Keep texture origin in fixed position"); RNA_def_property_update(prop, 0, "rna_Brush_update"); */ + + /* only for projection paint, TODO, other paint modes */ + prop= RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BRUSH_LOCK_ALPHA); + RNA_def_property_ui_text(prop, "Alpha", "When this is disabled, lock alpha while painting"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); @@ -297,6 +619,31 @@ static void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Texture", ""); RNA_def_property_update(prop, NC_TEXTURE, "rna_Brush_update"); + prop= RNA_def_property(srna, "texture_overlay_alpha", PROP_INT, PROP_PERCENTAGE); + RNA_def_property_int_sdna(prop, NULL, "texture_overlay_alpha"); + RNA_def_property_range(prop, 1, 100); + RNA_def_property_ui_text(prop, "Texture Overlay Alpha", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "add_col", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "add_col"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Add Color", "Color of cursor when adding"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "sub_col", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "sub_col"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Subract Color", "Color of cursor when subtracting"); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + + prop= RNA_def_property(srna, "image_icon", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "image_icon"); + RNA_def_property_struct_type(prop, "Image"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Image Icon", ""); + RNA_def_property_update(prop, 0, "rna_Brush_update"); + /* clone tool */ prop= RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "clone.image"); @@ -351,16 +698,19 @@ static void rna_def_operator_stroke_element(BlenderRNA *brna) RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Pressure", "Tablet pressure"); + prop= RNA_def_property(srna, "pen_flip", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_flag(prop, PROP_IDPROPERTY); + RNA_def_property_ui_text(prop, "Flip", ""); + + // used in uv painting prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_flag(prop, PROP_IDPROPERTY); RNA_def_property_ui_text(prop, "Time", ""); - prop= RNA_def_property(srna, "flip", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_flag(prop, PROP_IDPROPERTY); - RNA_def_property_ui_text(prop, "Flip", ""); - /* XXX: Tool (this will be for pressing a modifier key for a different brush, - e.g. switching to a Smooth brush in the middle of the stroke */ + e.g. switching to a Smooth brush in the middle of the stroke */ + + // XXX: i don't think blender currently supports the ability to properly do a remappable modifier in the middle of a stroke } void RNA_def_brush(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c index 2776289b6f0..ef9a0cf040e 100644 --- a/source/blender/makesrna/intern/rna_camera.c +++ b/source/blender/makesrna/intern/rna_camera.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -37,29 +36,20 @@ #ifdef RNA_RUNTIME -static void rna_Camera_angle_update(Main *bmain, Scene *scene, PointerRNA *ptr) -{ - Camera *cam= (Camera*)ptr->id.data; - cam->lens = 16.0f / tan(M_PI*cam->angle/360.0f); -} - -static void rna_Camera_lens_update(Main *bmain, Scene *scene, PointerRNA *ptr) -{ - Camera *cam= (Camera*)ptr->id.data; - cam->angle= 360.0f * atan(16.0f/cam->lens) / M_PI; -} +#include "BKE_object.h" /* only for rad/deg conversion! can remove later */ static float rna_Camera_angle_get(PointerRNA *ptr) { Camera *cam= ptr->id.data; - return cam->angle * (M_PI / 180.0); + + return lens_to_angle(cam->lens); } static void rna_Camera_angle_set(PointerRNA *ptr, float value) { Camera *cam= ptr->id.data; - cam->angle= value * (180.0 / M_PI); + cam->lens= angle_to_lens(value); } #else @@ -94,12 +84,6 @@ void RNA_def_camera(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Passepartout Alpha", "Opacity (alpha) of the darkened overlay in Camera view"); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); - prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0)); - RNA_def_property_ui_text(prop, "Angle", "Perspective Camera lens field of view in degrees"); - RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL); /* only for deg/rad conversion */ - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_angle_update"); - prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "clipsta"); RNA_def_property_range(prop, 0.0f, FLT_MAX); @@ -116,7 +100,13 @@ void RNA_def_camera(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "lens"); RNA_def_property_range(prop, 1.0f, 5000.0f); RNA_def_property_ui_text(prop, "Lens", "Perspective Camera lens value in millimeters"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_lens_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); + + prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0)); + RNA_def_property_ui_text(prop, "Angle", "Perspective Camera lens field of view in degrees"); + RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL); /* only for deg/rad conversion */ + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); prop= RNA_def_property(srna, "ortho_scale", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ortho_scale"); diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c index 4ecb93eb1d6..3518044a601 100644 --- a/source/blender/makesrna/intern/rna_cloth.c +++ b/source/blender/makesrna/intern/rna_cloth.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -141,6 +140,22 @@ static void rna_ClothSettings_bend_vgroup_set(PointerRNA *ptr, const char *value rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_bend); } +static PointerRNA rna_ClothSettings_rest_shape_key_get(PointerRNA *ptr) +{ + Object *ob= (Object*)ptr->id.data; + ClothSimSettings *sim= (ClothSimSettings*)ptr->data; + + return rna_object_shapekey_index_get(ob->data, sim->shapekey_rest); +} + +static void rna_ClothSettings_rest_shape_key_set(PointerRNA *ptr, PointerRNA value) +{ + Object *ob= (Object*)ptr->id.data; + ClothSimSettings *sim= (ClothSimSettings*)ptr->data; + + sim->shapekey_rest= rna_object_shapekey_index_set(ob->data, value, sim->shapekey_rest); +} + static void rna_ClothSettings_gravity_get(PointerRNA *ptr, float *values) { ClothSimSettings *sim= (ClothSimSettings*)ptr->data; @@ -335,6 +350,12 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Pre Roll", "Simulation starts on this frame"); RNA_def_property_update(prop, 0, "rna_cloth_reset"); + prop= RNA_def_property(srna, "rest_shape_key", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_struct_type(prop, "ShapeKey"); + RNA_def_property_pointer_funcs(prop, "rna_ClothSettings_rest_shape_key_get", "rna_ClothSettings_rest_shape_key_set", NULL); + RNA_def_property_ui_text(prop, "Rest Shade Key", "Shape key to use the rest spring lengths from"); + RNA_def_property_update(prop, 0, "rna_cloth_update"); /* unused */ @@ -431,6 +452,11 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna) RNA_def_property_range(prop, 1, 10); RNA_def_property_ui_text(prop, "Self Collision Quality", "How many self collision iterations should be done. (higher is better quality but slower)"); RNA_def_property_update(prop, 0, "rna_cloth_update"); + + prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Collision Group", "Limit colliders to this Group"); + RNA_def_property_update(prop, 0, "rna_cloth_update"); } void RNA_def_cloth(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index ee19bce6435..218ca55e72d 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -26,13 +26,27 @@ #include #include "RNA_define.h" -#include "RNA_types.h" +#include "rna_internal.h" #include "DNA_color_types.h" #ifdef RNA_RUNTIME +#include "RNA_access.h" + +#include "DNA_material_types.h" +#include "DNA_node_types.h" + +#include "MEM_guardedalloc.h" + #include "BKE_colortools.h" +#include "BKE_depsgraph.h" +#include "BKE_node.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_node.h" static int rna_CurveMapping_curves_length(PointerRNA *ptr) { @@ -113,17 +127,166 @@ static void rna_CurveMapping_clipmaxy_range(PointerRNA *ptr, float *min, float * *max= 100.0f; } + +static char *rna_ColorRamp_path(PointerRNA *ptr) +{ + /* handle the cases where a single datablock may have 2 ramp types */ + if (ptr->id.data) { + ID *id= ptr->id.data; + + switch (GS(id->name)) { + case ID_MA: /* material has 2 cases - diffuse and specular */ + { + Material *ma= (Material*)id; + + if (ptr->data == ma->ramp_col) + return BLI_strdup("diffuse_ramp"); + else if (ptr->data == ma->ramp_spec) + return BLI_strdup("specular_ramp"); + } + break; + } + } + + /* everything else just uses 'color_ramp' */ + return BLI_strdup("color_ramp"); +} + +static char *rna_ColorRampElement_path(PointerRNA *ptr) +{ + PointerRNA ramp_ptr; + PropertyRNA *prop; + char *path = NULL; + int index; + + /* helper macro for use here to try and get the path + * - this calls the standard code for getting a path to a texture... + */ +#define COLRAMP_GETPATH \ +{ \ +prop= RNA_struct_find_property(&ramp_ptr, "elements"); \ +if (prop) { \ +index= RNA_property_collection_lookup_index(&ramp_ptr, prop, ptr); \ +if (index >= 0) { \ +char *texture_path= rna_ColorRamp_path(&ramp_ptr); \ +path= BLI_sprintfN("%s.elements[%d]", texture_path, index); \ +MEM_freeN(texture_path); \ +} \ +} \ +} + + /* determine the path from the ID-block to the ramp */ + // FIXME: this is a very slow way to do it, but it will have to suffice... + if (ptr->id.data) { + ID *id= ptr->id.data; + + switch (GS(id->name)) { + case ID_MA: /* 2 cases for material - diffuse and spec */ + { + Material *ma= (Material *)id; + + /* try diffuse first */ + if (ma->ramp_col) { + RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_col, &ramp_ptr); + COLRAMP_GETPATH; + } + /* try specular if not diffuse */ + if (!path && ma->ramp_spec) { + RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_spec, &ramp_ptr); + COLRAMP_GETPATH; + } + } + break; + + // TODO: node trees need special attention + case ID_NT: + { + bNodeTree *ntree = (bNodeTree *)id; + bNode *node; + + for(node=ntree->nodes.first; node; node=node->next) { + if (ELEM3(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + RNA_pointer_create(id, &RNA_ColorRamp, node->storage, &ramp_ptr); + COLRAMP_GETPATH; + } + } + } + break; + + default: /* everything else should have a "color_ramp" property */ + { + /* create pointer to the ID block, and try to resolve "color_ramp" pointer */ + RNA_id_pointer_create(id, &ramp_ptr); + if (RNA_path_resolve(&ramp_ptr, "color_ramp", &ramp_ptr, &prop)) { + COLRAMP_GETPATH; + } + } + } + } + + /* cleanup the macro we defined */ +#undef COLRAMP_GETPATH + + return path; +} + +static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + if (ptr->id.data) { + ID *id= ptr->id.data; + + switch (GS(id->name)) { + case ID_MA: + { + Material *ma= ptr->id.data; + + DAG_id_flush_update(&ma->id, 0); + WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma); + } + break; + case ID_NT: + { + bNodeTree *ntree = (bNodeTree *)id; + bNode *node; + + for(node=ntree->nodes.first; node; node=node->next) { + if (ELEM3(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) { + ED_node_generic_update(bmain, scene, ntree, node); + } + } + } + break; + case ID_TE: + { + Tex *tex= ptr->id.data; + + DAG_id_flush_update(&tex->id, 0); + WM_main_add_notifier(NC_TEXTURE, tex); + } + break; + default: + break; + } + } +} + +static void rna_Scopes_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Scopes *s= (Scopes*)ptr->data; + s->ok = 0; +} + #else static void rna_def_curvemappoint(BlenderRNA *brna) { StructRNA *srna; - PropertyRNA *prop; + PropertyRNA *prop; static EnumPropertyItem prop_handle_type_items[] = { - {0, "AUTO", 0, "Auto Handle", ""}, - {CUMA_VECTOR, "VECTOR", 0, "Vector Handle", ""}, + {0, "AUTO", 0, "Auto Handle", ""}, + {CUMA_VECTOR, "VECTOR", 0, "Vector Handle", ""}, {0, NULL, 0, NULL, NULL} - }; + }; srna= RNA_def_struct(brna, "CurveMapPoint", NULL); RNA_def_struct_ui_text(srna, "CurveMapPoint", "Point of a curve used for a curve mapping"); @@ -150,12 +313,12 @@ static void rna_def_curvemappoint(BlenderRNA *brna) static void rna_def_curvemap(BlenderRNA *brna) { StructRNA *srna; - PropertyRNA *prop; + PropertyRNA *prop; static EnumPropertyItem prop_extend_items[] = { - {0, "HORIZONTAL", 0, "Horizontal", ""}, - {CUMA_EXTEND_EXTRAPOLATE, "EXTRAPOLATED", 0, "Extrapolated", ""}, + {0, "HORIZONTAL", 0, "Horizontal", ""}, + {CUMA_EXTEND_EXTRAPOLATE, "EXTRAPOLATED", 0, "Extrapolated", ""}, {0, NULL, 0, NULL, NULL} - }; + }; srna= RNA_def_struct(brna, "CurveMap", NULL); RNA_def_struct_ui_text(srna, "CurveMap", "Curve in a curve mapping"); @@ -229,21 +392,143 @@ static void rna_def_curvemapping(BlenderRNA *brna) RNA_def_property_float_funcs(prop, NULL, "rna_CurveMapping_white_level_set", NULL); } +static void rna_def_color_ramp_element(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "ColorRampElement", NULL); + RNA_def_struct_sdna(srna, "CBData"); + RNA_def_struct_path_func(srna, "rna_ColorRampElement_path"); + RNA_def_struct_ui_text(srna, "Color Ramp Element", "Element defining a color at a position in the color ramp"); + + prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "r"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Color", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); + + prop= RNA_def_property(srna, "position", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "pos"); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Position", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); +} + +static void rna_def_color_ramp(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_interpolation_items[] = { + {1, "EASE", 0, "Ease", ""}, + {3, "CARDINAL", 0, "Cardinal", ""}, + {0, "LINEAR", 0, "Linear", ""}, + {2, "B_SPLINE", 0, "B-Spline", ""}, + {4, "CONSTANT", 0, "Constant", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "ColorRamp", NULL); + RNA_def_struct_sdna(srna, "ColorBand"); + RNA_def_struct_path_func(srna, "rna_ColorRamp_path"); + RNA_def_struct_ui_text(srna, "Color Ramp", "Color ramp mapping a scalar value to a color"); + + prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_COLOR); + RNA_def_property_collection_sdna(prop, NULL, "data", "tot"); + RNA_def_property_struct_type(prop, "ColorRampElement"); + RNA_def_property_ui_text(prop, "Elements", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); + + prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "ipotype"); + RNA_def_property_enum_items(prop, prop_interpolation_items); + RNA_def_property_ui_text(prop, "Interpolation", ""); + RNA_def_property_update(prop, 0, "rna_ColorRamp_update"); +} + static void rna_def_histogram(BlenderRNA *brna) { StructRNA *srna; + PropertyRNA *prop; + static EnumPropertyItem prop_mode_items[] = { + {HISTO_MODE_LUMA, "Luma", ICON_COLOR, "Luma", ""}, + {HISTO_MODE_RGB, "RGB", ICON_COLOR, "Red Green Blue", ""}, + {HISTO_MODE_R, "R", ICON_COLOR, "Red", ""}, + {HISTO_MODE_G, "G", ICON_COLOR, "Green", ""}, + {HISTO_MODE_B, "B", ICON_COLOR, "Blue", ""}, + {0, NULL, 0, NULL, NULL}}; + srna= RNA_def_struct(brna, "Histogram", NULL); RNA_def_struct_ui_text(srna, "Histogram", "Statistical view of the levels of color in an image"); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_mode_items); + RNA_def_property_ui_text(prop, "Mode", "Channels to display when drawing the histogram"); + } +static void rna_def_scopes(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_wavefrm_mode_items[] = { + {SCOPES_WAVEFRM_LUMA, "LUMA", ICON_COLOR, "Luma", ""}, + {SCOPES_WAVEFRM_RGB, "RGB", ICON_COLOR, "Red Green Blue", ""}, + {SCOPES_WAVEFRM_YCC_601, "YCBCR601", ICON_COLOR, "YCbCr (ITU 601)", ""}, + {SCOPES_WAVEFRM_YCC_709, "YCBCR709", ICON_COLOR, "YCbCr (ITU 709)", ""}, + {SCOPES_WAVEFRM_YCC_JPEG, "YCBCRJPG", ICON_COLOR, "YCbCr (Jpeg)", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "Scopes", NULL); + RNA_def_struct_ui_text(srna, "Scopes", "Scopes for statistical view of an image"); + + prop= RNA_def_property(srna, "use_full_resolution", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, "Scopes", "sample_full", 1); + RNA_def_property_ui_text(prop, "Full Sample", "Sample every pixel of the image"); + RNA_def_property_update(prop, 0, "rna_Scopes_update"); + + prop= RNA_def_property(srna, "accuracy", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_sdna(prop, "Scopes", "accuracy"); + RNA_def_property_range(prop, 0.0, 100.0); + RNA_def_property_ui_range(prop, 0.0, 100.0, 10, 1); + RNA_def_property_ui_text(prop, "Accuracy", "Proportion of original image source pixel lines to sample"); + RNA_def_property_update(prop, 0, "rna_Scopes_update"); + + prop= RNA_def_property(srna, "histogram", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, "Scopes", "hist"); + RNA_def_property_struct_type(prop, "Histogram"); + RNA_def_property_ui_text(prop, "Histogram", "Histogram for viewing image statistics"); + + prop= RNA_def_property(srna, "waveform_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, "Scopes", "wavefrm_mode"); + RNA_def_property_enum_items(prop, prop_wavefrm_mode_items); + RNA_def_property_ui_text(prop, "Waveform Mode", ""); + RNA_def_property_update(prop, 0, "rna_Scopes_update"); + + prop= RNA_def_property(srna, "waveform_alpha", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_sdna(prop, "Scopes", "wavefrm_alpha"); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Waveform Opacity", "Opacity of the points"); + + prop= RNA_def_property(srna, "vectorscope_alpha", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_sdna(prop, "Scopes", "vecscope_alpha"); + RNA_def_property_range(prop, 0, 1); + RNA_def_property_ui_text(prop, "Vectorscope Opacity", "Opacity of the points"); +} + + void RNA_def_color(BlenderRNA *brna) { rna_def_curvemappoint(brna); rna_def_curvemap(brna); rna_def_curvemapping(brna); + rna_def_color_ramp_element(brna); + rna_def_color_ramp(brna); rna_def_histogram(brna); + rna_def_scopes(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index 65114804a3f..fb19e8976c3 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -50,6 +49,7 @@ EnumPropertyItem constraint_type_items[] ={ {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT_DATA, "Limit Location", ""}, {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT_DATA, "Limit Rotation", ""}, {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT_DATA, "Limit Scale", ""}, + {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT_DATA, "Maintain Volume", ""}, {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT_DATA, "Transformation", ""}, {0, "", 0, "Tracking", ""}, {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT_DATA, "Clamp To", ""}, @@ -64,6 +64,7 @@ EnumPropertyItem constraint_type_items[] ={ {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT_DATA, "Child Of", ""}, {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT_DATA, "Floor", ""}, {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT_DATA, "Follow Path", ""}, + {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT_DATA, "Pivot", ""}, {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint", ""}, {CONSTRAINT_TYPE_PYTHON, "SCRIPT", ICON_CONSTRAINT_DATA, "Script", ""}, {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap", ""}, @@ -103,7 +104,6 @@ EnumPropertyItem constraint_ik_axisref_items[] ={ #include "BKE_context.h" #include "BKE_depsgraph.h" -#include "ED_object.h" static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr) { @@ -124,6 +124,8 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr) return &RNA_CopyLocationConstraint; case CONSTRAINT_TYPE_SIZELIKE: return &RNA_CopyScaleConstraint; + case CONSTRAINT_TYPE_SAMEVOL: + return &RNA_MaintainVolumeConstraint; case CONSTRAINT_TYPE_PYTHON: return &RNA_PythonConstraint; case CONSTRAINT_TYPE_ACTION: @@ -156,6 +158,8 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr) return &RNA_SplineIKConstraint; case CONSTRAINT_TYPE_TRANSLIKE: return &RNA_CopyTransformsConstraint; + case CONSTRAINT_TYPE_PIVOT: + return &RNA_PivotConstraint; default: return &RNA_UnknownType; } @@ -164,10 +168,10 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr) static void rna_Constraint_name_set(PointerRNA *ptr, const char *value) { bConstraint *con= ptr->data; - char oldname[32]; + char oldname[sizeof(con->name)]; /* make a copy of the old name first */ - BLI_strncpy(oldname, con->name, sizeof(oldname)); + BLI_strncpy(oldname, con->name, sizeof(con->name)); /* copy the new name into the name slot */ BLI_strncpy(con->name, value, sizeof(con->name)); @@ -813,6 +817,34 @@ static void rna_def_constraint_size_like(BlenderRNA *brna) RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); } +static void rna_def_constraint_same_volume(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem volume_items[] = { + {SAMEVOL_X, "SAMEVOL_X", 0, "X", ""}, + {SAMEVOL_Y, "SAMEVOL_Y", 0, "Y", ""}, + {SAMEVOL_Z, "SAMEVOL_Z", 0, "Z", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "MaintainVolumeConstraint", "Constraint"); + RNA_def_struct_ui_text(srna, "Maintain Volume Constraint", "Maintains a constant volume along a single scaling axis"); + RNA_def_struct_sdna_from(srna, "bSameVolumeConstraint", "data"); + + prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, volume_items); + RNA_def_property_ui_text(prop, "Free Axis", "The free scaling axis of the object"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_range(prop, 0.001, 100.f); + RNA_def_property_ui_text(prop, "Volume", "Volume of the bone at rest"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + +} + static void rna_def_constraint_transform_like(BlenderRNA *brna) { StructRNA *srna; @@ -934,13 +966,13 @@ static void rna_def_constraint_action(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "start"); RNA_def_property_range(prop, MINAFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "Start Frame", "First frame of the Action to use"); RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "end"); RNA_def_property_range(prop, MINAFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "End Frame", "Last frame of the Action to use"); @@ -1810,6 +1842,62 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna) RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); } +static void rna_def_constraint_pivot(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem pivot_rotAxis_items[] = { + {PIVOTCON_AXIS_NONE, "ALWAYS_ACTIVE", 0, "Always", ""}, + {PIVOTCON_AXIS_X_NEG, "NX", 0, "-X Rot", ""}, + {PIVOTCON_AXIS_Y_NEG, "NY", 0, "-Y Rot", ""}, + {PIVOTCON_AXIS_Z_NEG, "NZ", 0, "-Z Rot", ""}, + {PIVOTCON_AXIS_X, "X", 0, "X Rot", ""}, + {PIVOTCON_AXIS_Y, "Y", 0, "Y Rot", ""}, + {PIVOTCON_AXIS_Z, "Z", 0, "Z Rot", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "PivotConstraint", "Constraint"); + RNA_def_struct_ui_text(srna, "Pivot Constraint", "Rotate around a different point"); + + prop= RNA_def_property(srna, "head_tail", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, "bConstraint", "headtail"); + RNA_def_property_ui_text(prop, "Head/Tail", "Target along length of bone: Head=0, Tail=1"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + RNA_def_struct_sdna_from(srna, "bPivotConstraint", "data"); + + /* target-defined pivot */ + prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "tar"); + RNA_def_property_ui_text(prop, "Target", "Target Object, defining the position of the pivot when defined"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update"); + + prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "subtarget"); + RNA_def_property_ui_text(prop, "Sub-Target", ""); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update"); + + /* pivot offset */ + prop= RNA_def_property(srna, "use_relative_position", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PIVOTCON_FLAG_OFFSET_ABS); + RNA_def_property_ui_text(prop, "Use Relative Offset", "Offset will be an absolute point in space instead of relative to the target"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_XYZ); + RNA_def_property_float_sdna(prop, NULL, "offset"); + RNA_def_property_ui_text(prop, "Offset", "Offset of pivot from target (when set), or from owner's location (when Fixed Position is off), or the absolute pivot point"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + /* rotation-based activation */ + prop= RNA_def_property(srna, "enabled_rotation_range", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "rotAxis"); + RNA_def_property_enum_items(prop, pivot_rotAxis_items); + RNA_def_property_ui_text(prop, "Enabled Rotation Range", "Rotation range on which pivoting should occur"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); +} + /* base struct for constraints */ void RNA_def_constraint(BlenderRNA *brna) { @@ -1826,7 +1914,7 @@ void RNA_def_constraint(BlenderRNA *brna) /* strings */ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Constraint_name_set"); - RNA_def_property_ui_text(prop, "Name", ""); + RNA_def_property_ui_text(prop, "Name", "Constraint name"); RNA_def_struct_name_property(srna, prop); /* enums */ @@ -1849,11 +1937,15 @@ void RNA_def_constraint(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Target Space", "Space that target is evaluated in"); /* flags */ + prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_OFF); + RNA_def_property_ui_text(prop, "Enabled", "Enable/Disable Constraint"); + prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_EXPAND); RNA_def_property_ui_text(prop, "Expanded", "Constraint's panel is expanded in UI"); RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); - + // XXX this is really an internal flag, but it may be useful for some tools to be able to access this... prop= RNA_def_property(srna, "disabled", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); @@ -1897,6 +1989,7 @@ void RNA_def_constraint(BlenderRNA *brna) rna_def_constraint_locked_track(brna); rna_def_constraint_action(brna); rna_def_constraint_size_like(brna); + rna_def_constraint_same_volume(brna); rna_def_constraint_locate_like(brna); rna_def_constraint_rotate_like(brna); rna_def_constraint_transform_like(brna); @@ -1913,6 +2006,7 @@ void RNA_def_constraint(BlenderRNA *brna) rna_def_constraint_shrinkwrap(brna); rna_def_constraint_damped_track(brna); rna_def_constraint_spline_ik(brna); + rna_def_constraint_pivot(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c index 27808b7d1bf..9ee2ca1a322 100644 --- a/source/blender/makesrna/intern/rna_context.c +++ b/source/blender/makesrna/intern/rna_context.c @@ -29,7 +29,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "BKE_context.h" diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c index 0c1d3d69283..c66ce532351 100644 --- a/source/blender/makesrna/intern/rna_controller.c +++ b/source/blender/makesrna/intern/rna_controller.c @@ -24,15 +24,28 @@ #include +#include "WM_types.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" - +#include "DNA_object_types.h" #include "DNA_controller_types.h" +EnumPropertyItem controller_type_items[] ={ + {CONT_LOGIC_AND, "LOGIC_AND", 0, "And", "Logic And"}, + {CONT_LOGIC_OR, "LOGIC_OR", 0, "Or", "Logic Or"}, + {CONT_LOGIC_NAND, "LOGIC_NAND", 0, "Nand", "Logic Nand"}, + {CONT_LOGIC_NOR, "LOGIC_NOR", 0, "Nor", "Logic Nor"}, + {CONT_LOGIC_XOR, "LOGIC_XOR", 0, "Xor", "Logic Xor"}, + {CONT_LOGIC_XNOR, "LOGIC_XNOR", 0, "Xnor", "Logic Xnor"}, + {CONT_EXPRESSION, "EXPRESSION", 0, "Expression", ""}, + {CONT_PYTHON, "PYTHON", 0, "Python Script", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME +#include "BKE_sca.h" + static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr) { bController *controller= (bController*)ptr->data; @@ -50,7 +63,7 @@ static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr) return &RNA_XorController; case CONT_LOGIC_XNOR: return &RNA_XnorController; - case CONT_EXPRESSION: + case CONT_EXPRESSION: return &RNA_ExpressionController; case CONT_PYTHON: return &RNA_PythonController; @@ -59,21 +72,82 @@ static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr) } } +static void rna_Controller_type_set(struct PointerRNA *ptr, int value) +{ + bController *cont= (bController *)ptr->data; + if (value != cont->type) + { + cont->type = value; + init_controller(cont); + } +} + +static int rna_Controller_state_number_get(struct PointerRNA *ptr) +{ + bController *cont= (bController *)ptr->data; + int bit; + + for (bit=0; bit<32; bit++) { + if (cont->state_mask & (1<data; + if (value < 1 || value > OB_MAX_STATES) + return; + + cont->state_mask = (1 << (value - 1)); +} + +static void rna_Controller_state_get(PointerRNA *ptr, int *values) +{ + bController *cont= (bController *)ptr->data; + int i; + + memset(values, 0, sizeof(int)*OB_MAX_STATES); + for(i=0; istate_mask & (1<data; + int i, tot= 0; + + /* ensure we always have some state selected */ + for(i=0; i1) + return; + + for(i=0; istate_mask |= (1<state_mask &= ~(1< +#include + +#include "WM_types.h" +#include "RNA_define.h" + +#ifdef RNA_RUNTIME + +#include "BKE_sca.h" +#include "DNA_sensor_types.h" +#include "DNA_controller_types.h" +#include "DNA_actuator_types.h" + +static void rna_Controller_link(bController *cont, bSensor *sens, bActuator *act) +{ + if(sens) + link_logicbricks((void **)&cont, (void ***)&(sens->links), &sens->totlinks, sizeof(bController *)); + if(act) + link_logicbricks((void **)&act, (void ***)&(cont->links), &cont->totlinks, sizeof(bActuator *)); +} + +static void rna_Controller_unlink(bController *cont, bSensor *sens, bActuator *act) +{ + if(sens) + unlink_logicbricks((void **)&cont, (void ***)&(sens->links), &sens->totlinks); + if(act) + unlink_logicbricks((void **)&act, (void ***)&(cont->links), &cont->totlinks); +} + +#else + +void RNA_api_controller(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "link", "rna_Controller_link"); + RNA_def_function_ui_description(func, "Link the controller with a sensor/actuator."); + parm= RNA_def_pointer(func, "sensor", "Sensor", "", "Sensor to link the controller to."); + RNA_def_property_update(parm, NC_LOGIC, NULL); + parm= RNA_def_pointer(func, "actuator", "Actuator", "", "Actuator to link the controller to."); + RNA_def_property_update(parm, NC_LOGIC, NULL); + + func= RNA_def_function(srna, "unlink", "rna_Controller_unlink"); + RNA_def_function_ui_description(func, "Unlink the controller from a sensor/actuator."); + parm= RNA_def_pointer(func, "sensor", "Sensor", "", "Sensor to unlink the controller from."); + RNA_def_property_update(parm, NC_LOGIC, NULL); + parm= RNA_def_pointer(func, "actuator", "Actuator", "", "Actuator to unlink the controller from."); + RNA_def_property_update(parm, NC_LOGIC, NULL); +} + +#endif + diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index 499423276ab..d8bc683ae12 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -50,8 +49,18 @@ EnumPropertyItem beztriple_interpolation_mode_items[] = { {BEZT_IPO_BEZ, "BEZIER", 0, "Bezier", ""}, {0, NULL, 0, NULL, NULL}}; +EnumPropertyItem curve_type_items[] = { + {CU_POLY, "POLY", 0, "Poly", ""}, + {CU_BEZIER, "BEZIER", 0, "Bezier", ""}, + {CU_BSPLINE, "BSPLINE", 0, "BSpline", ""}, + {CU_CARDINAL, "CARDINAL", 0, "Cardinal", ""}, + {CU_NURBS, "NURBS", 0, "Ease", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME +#include "BLI_math.h" + #include "DNA_object_types.h" #include "BKE_curve.h" @@ -72,22 +81,6 @@ static StructRNA *rna_Curve_refine(PointerRNA *ptr) else return &RNA_Curve; } - -static PointerRNA rna_Curve_active_nurb_get(PointerRNA *ptr) -{ - Curve *cu= (Curve*)ptr->data; - Nurb *nu= NULL; - - if(cu->editnurb) - nu = BLI_findlink(cu->editnurb, cu->actnu); - - if(nu) - return rna_pointer_inherit_refine(ptr, &RNA_Spline, nu); - - return rna_pointer_inherit_refine(ptr, NULL, NULL); -} - - static void rna_BezTriple_handle1_get(PointerRNA *ptr, float *values) { BezTriple *bt= (BezTriple*)ptr->data; @@ -148,6 +141,40 @@ static int rna_Curve_texspace_editable(PointerRNA *ptr) return (cu->texflag & CU_AUTOSPACE)? 0: PROP_EDITABLE; } +static void rna_Curve_texspace_loc_get(PointerRNA *ptr, float *values) +{ + Curve *cu= (Curve *)ptr->data; + + if (!cu->bb) + tex_space_curve(cu); + + copy_v3_v3(values, cu->loc); +} + +static void rna_Curve_texspace_loc_set(PointerRNA *ptr, const float *values) +{ + Curve *cu= (Curve *)ptr->data; + + copy_v3_v3(cu->loc, values); +} + +static void rna_Curve_texspace_size_get(PointerRNA *ptr, float *values) +{ + Curve *cu= (Curve *)ptr->data; + + if (!cu->bb) + tex_space_curve(cu); + + copy_v3_v3(values, cu->size); +} + +static void rna_Curve_texspace_size_set(PointerRNA *ptr, const float *values) +{ + Curve *cu= (Curve *)ptr->data; + + copy_v3_v3(cu->size, values); +} + static void rna_Curve_material_index_range(PointerRNA *ptr, int *min, int *max) { Curve *cu= (Curve*)ptr->id.data; @@ -188,10 +215,10 @@ static void rna_Curve_dimension_set(PointerRNA *ptr, int value) } - static int rna_Nurb_length(PointerRNA *ptr) { Nurb *nu= (Nurb*)ptr->data; + if(nu->type == CU_BEZIER) return 0; return nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu; } @@ -208,20 +235,77 @@ static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA rna_iterator_array_begin(iter, (void*)nu->bp, sizeof(BPoint), nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu, 0, NULL); } -static void rna_Curve_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_Curve_update_data_id(Main *bmain, Scene *scene, ID *id) { - ID *id= ptr->id.data; - DAG_id_flush_update(id, OB_RECALC_DATA); WM_main_add_notifier(NC_GEOM|ND_DATA, id); } +static void rna_Curve_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + rna_Curve_update_data_id(bmain, scene, ptr->id.data); +} + static void rna_Curve_update_deps(Main *bmain, Scene *scene, PointerRNA *ptr) { DAG_scene_sort(scene); rna_Curve_update_data(bmain, scene, ptr); } +static PointerRNA rna_Curve_bevelObject_get(PointerRNA *ptr) +{ + Curve *cu= (Curve*)ptr->id.data; + Object *ob= cu->bevobj; + + if(ob) + return rna_pointer_inherit_refine(ptr, &RNA_Object, ob); + + return rna_pointer_inherit_refine(ptr, NULL, NULL); +} + +static void rna_Curve_bevelObject_set(PointerRNA *ptr, PointerRNA value) +{ + Curve *cu= (Curve*)ptr->id.data; + Object *ob= (Object*)value.data; + + if (ob) { + /* if bevel object has got the save curve, as object, for which it's */ + /* set as bevobj, there could be infinity loop in displist calculation */ + if (ob->type == OB_CURVE && ob->data != cu) { + cu->bevobj = ob; + } + } else { + cu->bevobj = NULL; + } +} + +static PointerRNA rna_Curve_taperObject_get(PointerRNA *ptr) +{ + Curve *cu= (Curve*)ptr->id.data; + Object *ob= cu->taperobj; + + if(ob) + return rna_pointer_inherit_refine(ptr, &RNA_Object, ob); + + return rna_pointer_inherit_refine(ptr, NULL, NULL); +} + +static void rna_Curve_taperObject_set(PointerRNA *ptr, PointerRNA value) +{ + Curve *cu= (Curve*)ptr->id.data; + Object *ob= (Object*)value.data; + + if (ob) { + /* if taper object has got the save curve, as object, for which it's */ + /* set as bevobj, there could be infinity loop in displist calculation */ + if (ob->type == OB_CURVE && ob->data != cu) { + cu->taperobj = ob; + } + } else { + cu->taperobj = NULL; + } +} + static void rna_Curve_resolution_u_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) { Curve *cu= (Curve*)ptr->id.data; @@ -316,6 +400,119 @@ static void rna_Nurb_update_knot_v(Main *bmain, Scene *scene, PointerRNA *ptr) rna_Curve_update_data(bmain, scene, ptr); } +static void rna_Curve_spline_points_add(ID *id, Nurb *nu, ReportList *reports, int number) +{ + if(nu->type == CU_BEZIER) { + BKE_report(reports, RPT_ERROR, "Bezier spline can't have points added"); + } + else if(number==0) { + // do nothing + } else { + + addNurbPoints(nu, number); + + /* update */ + makeknots(nu, 1); + + rna_Curve_update_data_id(NULL, NULL, id); + } +} + +static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, ReportList *reports, int number) +{ + if(nu->type != CU_BEZIER) { + BKE_report(reports, RPT_ERROR, "Only bezier splines can be added"); + } + else if(number==0) { + // do nothing + } else { + addNurbPointsBezier(nu, number); + + /* update */ + makeknots(nu, 1); + + rna_Curve_update_data_id(NULL, NULL, id); + } +} + +static Nurb *rna_Curve_spline_new(Curve *cu, int type) +{ + Nurb *nu= ( Nurb * ) MEM_callocN( sizeof( Nurb ), "spline.new" ); + + if(type==CU_BEZIER) { + BezTriple *bezt= (BezTriple *)MEM_callocN(sizeof(BezTriple), "spline.new.bezt"); + bezt->radius= 1.0; + nu->bezt= bezt; + } + else { + BPoint *bp= (BPoint *)MEM_callocN(sizeof(BPoint), "spline.new.bp"); + bp->radius= 1.0f; + nu->bp= bp; + } + + nu->type= type; + nu->pntsu= 1; + nu->pntsv= 1; + + nu->orderu= nu->orderv= 4; + nu->resolu= nu->resolv= 12; + nu->flag= CU_SMOOTH; + + BLI_addtail(&cu->nurb, nu); + + return nu; +} + +static void rna_Curve_spline_remove(Curve *cu, ReportList *reports, Nurb *nu) +{ + /* todo, check we're in the list */ + int found= 0; + if(cu->editnurb) { + found= BLI_remlink_safe(cu->editnurb, nu); + } + else { + found= BLI_remlink_safe(&cu->nurb, nu); + } + + if(!found) { + BKE_reportf(reports, RPT_ERROR, "Curve \"%s\" does not contain spline given", cu->id.name+2); + return; + } + + freeNurb(nu); + /* invalidate pointer!, no can do */ +} + +static PointerRNA rna_Curve_active_spline_get(PointerRNA *ptr) +{ + Curve *cu= (Curve*)ptr->data; + Nurb *nu; + + if(cu->editnurb) + nu= BLI_findlink(cu->editnurb, cu->actnu); + else + nu= BLI_findlink(&cu->nurb, cu->actnu); // currently set to -1, should be changed to be allowed outside of editmode. + + if(nu) + return rna_pointer_inherit_refine(ptr, &RNA_Spline, nu); + + return rna_pointer_inherit_refine(ptr, NULL, NULL); +} + +static void rna_Curve_active_spline_set(PointerRNA *ptr, PointerRNA value) +{ + Curve *cu= (Curve*)ptr->data; + Nurb *nu= value.data; + + /* -1 is ok for an unset index */ + if(nu==NULL) + cu->actnu= -1; + else if(cu->editnurb) + cu->actnu= BLI_findindex(cu->editnurb, nu); + else + cu->actnu= BLI_findindex(&cu->nurb, nu); +} + #else static void rna_def_bpoint(BlenderRNA *brna) @@ -496,9 +693,9 @@ static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna) PropertyRNA *prop; /* flags */ - prop= RNA_def_property(srna, "uv_orco", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "map_along_length", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO); - RNA_def_property_ui_text(prop, "UV Orco", "Forces to use UV coordinates for texture mapping 'orco'"); + RNA_def_property_ui_text(prop, "Map Along Length", "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop= RNA_def_property(srna, "vertex_normal_flip", PROP_BOOLEAN, PROP_NONE); @@ -533,6 +730,12 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) RNA_def_property_ui_text(prop, "Font size", ""); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + prop= RNA_def_property(srna, "small_caps_scale", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "smallcaps_scale"); + RNA_def_property_ui_range(prop, 0, 1.0, 0.1, 0); + RNA_def_property_ui_text(prop, "Small Caps", "Scale of small capitals"); + RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + prop= RNA_def_property(srna, "line_dist", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "linedist"); RNA_def_property_range(prop, 0.0f, 10.0f); @@ -599,7 +802,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "body", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "str"); - RNA_def_property_ui_text(prop, "Body Text", "contence of this text object"); + RNA_def_property_ui_text(prop, "Body Text", "contents of this text object"); RNA_def_property_string_funcs(prop, "rna_Curve_body_get", "rna_Curve_body_length", "rna_Curve_body_set"); RNA_def_property_string_maxlength(prop, 8192); /* note that originally str did not have a limit! */ RNA_def_struct_name_property(srna, prop); @@ -637,6 +840,7 @@ static void rna_def_textbox(BlenderRNA *brna) srna= RNA_def_struct(brna, "TextBox", NULL); RNA_def_struct_ui_text(srna, "Text Box", "Text bounding box for layout"); + // XXX: still needs path function /* number values */ prop= RNA_def_property(srna, "x", PROP_FLOAT, PROP_NONE); @@ -674,29 +878,30 @@ static void rna_def_charinfo(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Text Character Format", "Text character formatting settings"); /* flags */ - prop= RNA_def_property(srna, "style", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STYLE); - RNA_def_property_ui_text(prop, "Style", ""); - RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "bold", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_BOLD); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_BOLD); RNA_def_property_ui_text(prop, "Bold", ""); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop= RNA_def_property(srna, "italic", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_ITALIC); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_ITALIC); RNA_def_property_ui_text(prop, "Italic", ""); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop= RNA_def_property(srna, "underline", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UNDERLINE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_UNDERLINE); RNA_def_property_ui_text(prop, "Underline", ""); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_WRAP); + /* probably there is no reason to expose this */ + /* prop= RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_WRAP); RNA_def_property_ui_text(prop, "Wrap", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update_data"); */ + + prop= RNA_def_property(srna, "use_small_caps", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_SMALLCAPS); + RNA_def_property_ui_text(prop, "Small Caps", ""); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); } @@ -725,6 +930,100 @@ static void rna_def_text(BlenderRNA *brna) rna_def_nurbs(brna, srna); } + +/* curve.splines[0].points */ +static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + //PropertyRNA *prop; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "SplinePoints"); + srna= RNA_def_struct(brna, "SplinePoints", NULL); + RNA_def_struct_sdna(srna, "Nurb"); + RNA_def_struct_ui_text(srna, "Spline Points", "Collection of spline points"); + + func= RNA_def_function(srna, "add", "rna_Curve_spline_points_add"); + RNA_def_function_ui_description(func, "Add a number of points to this spline."); + RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_USE_REPORTS); + parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX); + + /* + func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove"); + RNA_def_function_ui_description(func, "Remove a spline from a curve."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); + */ +} + +static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + //PropertyRNA *prop; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "SplineBezierPoints"); + srna= RNA_def_struct(brna, "SplineBezierPoints", NULL); + RNA_def_struct_sdna(srna, "Nurb"); + RNA_def_struct_ui_text(srna, "Spline Bezier Points", "Collection of spline bezirt points"); + + func= RNA_def_function(srna, "add", "rna_Curve_spline_bezpoints_add"); + RNA_def_function_ui_description(func, "Add a number of points to this spline."); + RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_USE_REPORTS); + parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX); + + /* + func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove"); + RNA_def_function_ui_description(func, "Remove a spline from a curve."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); + */ +} + +/* curve.splines */ +static void rna_def_curve_splines(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + PropertyRNA *prop; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "CurveSplines"); + srna= RNA_def_struct(brna, "CurveSplines", NULL); + RNA_def_struct_sdna(srna, "Curve"); + RNA_def_struct_ui_text(srna, "Curve Splines", "Collection of curve splines"); + + func= RNA_def_function(srna, "new", "rna_Curve_spline_new"); + RNA_def_function_ui_description(func, "Add a new spline to the curve."); + parm= RNA_def_enum(func, "type", curve_type_items, CU_POLY, "", "type for the new spline."); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_pointer(func, "spline", "Spline", "", "The newly created spline."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove"); + RNA_def_function_ui_description(func, "Remove a spline from a curve."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); + + prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Object"); + RNA_def_property_pointer_funcs(prop, "rna_Curve_active_spline_get", "rna_Curve_active_spline_set", NULL); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Active Spline", "Active curve spline"); + /* Could call: ED_base_object_activate(C, scene->basact); + * but would be a bad level call and it seems the notifier is enough */ + RNA_def_property_update(prop, NC_SCENE|ND_OB_ACTIVE, NULL); +} + + static void rna_def_curve(BlenderRNA *brna) { StructRNA *srna; @@ -747,7 +1046,6 @@ static void rna_def_curve(BlenderRNA *brna) RNA_def_struct_refine_func(srna, "rna_Curve_refine"); rna_def_animdata_common(srna); - rna_def_texmat_common(srna, "rna_Curve_texspace_editable"); prop= RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "key"); @@ -757,12 +1055,7 @@ static void rna_def_curve(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "nurb", NULL); RNA_def_property_struct_type(prop, "Spline"); RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object"); - - prop= RNA_def_property(srna, "active_spline", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "Spline"); - RNA_def_property_pointer_funcs(prop, "rna_Curve_active_nurb_get", NULL, NULL); - RNA_def_property_ui_text(prop, "Active Spline", "The active editmode spline"); - + rna_def_curve_splines(brna, prop); prop= RNA_def_property(srna, "draw_handles", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_HANDLES); @@ -820,12 +1113,12 @@ static void rna_def_curve(BlenderRNA *brna) prop= RNA_def_property(srna, "render_resolution_u", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resolu_ren"); RNA_def_property_range(prop, 0, INT_MAX); - RNA_def_property_ui_range(prop, 1, 64, 1, 0); + RNA_def_property_ui_range(prop, 0, 64, 1, 0); RNA_def_property_ui_text(prop, "Render Resolution U", "Surface resolution in U direction used while rendering. Zero skips this property"); prop= RNA_def_property(srna, "render_resolution_v", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resolv_ren"); - RNA_def_property_ui_range(prop, 1, 64, 1, 0); + RNA_def_property_ui_range(prop, 0, 64, 1, 0); RNA_def_property_range(prop, 0, INT_MAX); RNA_def_property_ui_text(prop, "Render Resolution V", "Surface resolution in V direction used while rendering. Zero skips this property"); @@ -837,17 +1130,21 @@ static void rna_def_curve(BlenderRNA *brna) /* pointers */ prop= RNA_def_property(srna, "bevel_object", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Object"); RNA_def_property_pointer_sdna(prop, NULL, "bevobj"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Bevel Object", "Curve object name that defines the bevel shape"); RNA_def_property_update(prop, 0, "rna_Curve_update_deps"); - + RNA_def_property_pointer_funcs(prop, "rna_Curve_bevelObject_get", "rna_Curve_bevelObject_set", NULL); + prop= RNA_def_property(srna, "taper_object", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Object"); RNA_def_property_pointer_sdna(prop, NULL, "taperobj"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Taper Object", "Curve object name that defines the taper (width)"); RNA_def_property_update(prop, 0, "rna_Curve_update_deps"); - + RNA_def_property_pointer_funcs(prop, "rna_Curve_taperObject_get", "rna_Curve_taperObject_set", NULL); + /* Flags */ prop= RNA_def_property(srna, "dimensions", PROP_ENUM, PROP_NONE); /* as an enum */ @@ -880,18 +1177,51 @@ static void rna_def_curve(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Twist Smooth", "Smoothing iteration for tangents"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + prop= RNA_def_property(srna, "use_deform_fill", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_DEFORM_FILL); + RNA_def_property_ui_text(prop, "Fill deformed", "Fill curve after applying deformation"); + RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + + /* texture space */ + prop= RNA_def_property(srna, "auto_texspace", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "texflag", CU_AUTOSPACE); + RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object"); + + prop= RNA_def_property(srna, "texspace_loc", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location"); + RNA_def_property_editable_func(prop, "rna_Curve_texspace_editable"); + RNA_def_property_float_funcs(prop, "rna_Curve_texspace_loc_get", "rna_Curve_texspace_loc_set", NULL); + RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + + prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size"); + RNA_def_property_editable_func(prop, "rna_Curve_texspace_editable"); + RNA_def_property_float_funcs(prop, "rna_Curve_texspace_size_get", "rna_Curve_texspace_size_set", NULL); + RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + + /* not supported yet + prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER); + RNA_def_property_float(prop, NULL, "rot"); + RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation"); + RNA_def_property_editable_func(prop, texspace_editable); + RNA_def_property_update(prop, 0, "rna_Curve_update_data");*/ + + prop= RNA_def_property(srna, "map_along_length", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO); + RNA_def_property_ui_text(prop, "Map Along Length", "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"); + RNA_def_property_update(prop, 0, "rna_Curve_update_data"); + + /* materials */ + prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol"); + RNA_def_property_struct_type(prop, "Material"); + RNA_def_property_ui_text(prop, "Materials", ""); } static void rna_def_curve_nurb(BlenderRNA *brna) { - static EnumPropertyItem curve_type_items[] = { - {CU_POLY, "POLY", 0, "Poly", ""}, - {CU_BEZIER, "BEZIER", 0, "Bezier", ""}, - {CU_BSPLINE, "BSPLINE", 0, "BSpline", ""}, - {CU_CARDINAL, "CARDINAL", 0, "Cardinal", ""}, - {CU_NURBS, "NURBS", 0, "Ease", ""}, - {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem spline_interpolation_items[] = { {BEZT_IPO_CONST, "LINEAR", 0, "Linear", ""}, {BEZT_IPO_LIN, "CARDINAL", 0, "Cardinal", ""}, @@ -903,7 +1233,7 @@ static void rna_def_curve_nurb(BlenderRNA *brna) PropertyRNA *prop; srna= RNA_def_struct(brna, "Spline", NULL); - RNA_def_struct_sdna(srna, "Nurb"); + RNA_def_struct_sdna(srna, "Nurb"); RNA_def_struct_ui_text(srna, "Spline", "Element of a curve, either Nurbs, Bezier or Polyline or a character with text objects"); prop= RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE); @@ -911,11 +1241,13 @@ static void rna_def_curve_nurb(BlenderRNA *brna) RNA_def_property_struct_type(prop, "SplinePoint"); RNA_def_property_collection_funcs(prop, "rna_BPoint_array_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_Nurb_length", 0, 0); RNA_def_property_ui_text(prop, "Points", "Collection of points that make up this poly or nurbs spline"); + rna_def_curve_spline_points(brna, prop); prop= RNA_def_property(srna, "bezier_points", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "BezierSplinePoint"); RNA_def_property_collection_sdna(prop, NULL, "bezt", "pntsu"); RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points for bezier curves only"); + rna_def_curve_spline_bezpoints(brna, prop); prop= RNA_def_property(srna, "tilt_interpolation", PROP_ENUM, PROP_NONE); @@ -937,13 +1269,13 @@ static void rna_def_curve_nurb(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Type", "The interpolation type for this curve element"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "point_count_u", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "point_count_u", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/ RNA_def_property_int_sdna(prop, NULL, "pntsu"); RNA_def_property_ui_text(prop, "Points U", "Total number points for the curve or surface in the U direction"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "point_count_v", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "point_count_v", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/ RNA_def_property_int_sdna(prop, NULL, "pntsv"); RNA_def_property_ui_text(prop, "Points V", "Total number points for the surface on the V direction"); @@ -978,34 +1310,34 @@ static void rna_def_curve_nurb(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop= RNA_def_property(srna, "cyclic_u", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_CYCLIC); + RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_CYCLIC); RNA_def_property_ui_text(prop, "Cyclic U", "Make this curve or surface a closed loop in the U direction"); RNA_def_property_update(prop, 0, "rna_Nurb_update_handle_data"); /* only needed for cyclic_u because cyclic_v cant do bezier */ prop= RNA_def_property(srna, "cyclic_v", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_CYCLIC); + RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_CYCLIC); RNA_def_property_ui_text(prop, "Cyclic V", "Make this surface a closed loop in the V direction"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); /* Note, endpoint and bezier flags should never be on at the same time! */ prop= RNA_def_property(srna, "endpoint_u", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flagu", 2); + RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_ENDPOINT); RNA_def_property_ui_text(prop, "Endpoint U", "Make this nurbs curve or surface meet the endpoints in the U direction (Cyclic U must be disabled)"); RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u"); prop= RNA_def_property(srna, "endpoint_v", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flagv", 2); + RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_ENDPOINT); RNA_def_property_ui_text(prop, "Endpoint V", "Make this nurbs surface meet the endpoints in the V direction (Cyclic V must be disabled)"); RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v"); prop= RNA_def_property(srna, "bezier_u", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flagu", 4); + RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_BEZIER); RNA_def_property_ui_text(prop, "Bezier U", "Make this nurbs curve or surface act like a bezier spline in the U direction (Order U must be 3 or 4, Cyclic U must be disabled)"); RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u"); prop= RNA_def_property(srna, "bezier_v", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flagv", 4); + RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_BEZIER); RNA_def_property_ui_text(prop, "Bezier V", "Make this nurbs surface act like a bezier spline in the V direction (Order V must be 3 or 4, Cyclic V must be disabled)"); RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v"); diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 7629387d4fe..fbcc3109af4 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -34,9 +34,7 @@ #include "DNA_genfile.h" #include "DNA_sdna_types.h" -#include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "BLI_ghash.h" #include "BLI_string.h" @@ -887,7 +885,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier fprop->hardmin= (subtype == PROP_UNSIGNED)? 0.0f: -FLT_MAX; fprop->hardmax= FLT_MAX; - if(subtype == PROP_COLOR) { + if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) { fprop->softmin= 0.0f; fprop->softmax= 1.0f; } @@ -2724,5 +2722,39 @@ void RNA_def_property_free_pointers(PropertyRNA *prop) } } } + +void RNA_def_property_free(StructOrFunctionRNA *cont_, PropertyRNA *prop) +{ + ContainerRNA *cont= cont_; + + RNA_def_property_free_pointers(prop); + + if(prop->flag & PROP_RUNTIME) { + if(cont->prophash) + BLI_ghash_remove(cont->prophash, (void*)prop->identifier, NULL, NULL); + + rna_freelinkN(&cont->properties, prop); + } +} + +/* note: only intended for removing dynamic props */ +int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *identifier) +{ + ContainerRNA *cont= cont_; + PropertyRNA *prop; + + for(prop= cont->properties.first; prop; prop= prop->next) { + if(strcmp(prop->identifier, identifier)==0) { + if(prop->flag & PROP_RUNTIME) { + RNA_def_property_free(cont_, prop); + return 1; + } + else { + return -1; + } + } + } + return 0; +} #endif diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index d5d28ac83ae..d798753d123 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -26,7 +26,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "rna_internal.h" @@ -39,8 +38,13 @@ #include "BLI_math.h" +#include "BKE_action.h" + #include "WM_types.h" +#include "ED_keyframing.h" +#include "ED_keyframes_edit.h" + EnumPropertyItem fmodifier_type_items[] = { {FMODIFIER_TYPE_NULL, "NULL", 0, "Invalid", ""}, {FMODIFIER_TYPE_GENERATOR, "GENERATOR", 0, "Generator", ""}, @@ -51,6 +55,7 @@ EnumPropertyItem fmodifier_type_items[] = { {FMODIFIER_TYPE_FILTER, "FILTER", 0, "Filter", ""}, {FMODIFIER_TYPE_PYTHON, "PYTHON", 0, "Python", ""}, {FMODIFIER_TYPE_LIMITS, "LIMITS", 0, "Limits", ""}, + {FMODIFIER_TYPE_STEPPED, "STEPPED", 0, "Stepped Interpolation", ""}, {0, NULL, 0, NULL, NULL}}; EnumPropertyItem beztriple_keyframe_type_items[] = { @@ -84,6 +89,8 @@ static StructRNA *rna_FModifierType_refine(struct PointerRNA *ptr) return &RNA_FModifierPython; case FMODIFIER_TYPE_LIMITS: return &RNA_FModifierLimits; + case FMODIFIER_TYPE_STEPPED: + return &RNA_FModifierStepped; default: return &RNA_UnknownType; } @@ -148,6 +155,13 @@ static void rna_DriverTarget_update_name(Main *bmain, Scene *scene, PointerRNA * /* ----------- */ +/* note: this function exists only to avoid id refcounting */ +static void rna_DriverTarget_id_set(PointerRNA *ptr, PointerRNA value) +{ + DriverTarget *dtar= (DriverTarget*)ptr->data; + dtar->id= value.data; +} + static StructRNA *rna_DriverTarget_id_typef(PointerRNA *ptr) { DriverTarget *dtar= (DriverTarget*)ptr->data; @@ -316,6 +330,55 @@ static void rna_FCurve_RnaPath_set(PointerRNA *ptr, const char *value) fcu->rna_path= NULL; } +static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value) +{ + AnimData *adt= BKE_animdata_from_id(ptr->id.data); + bAction *act= (adt) ? adt->action : NULL; + FCurve *fcu= ptr->data; + + /* same ID? */ + if (value.data && (ptr->id.data != value.id.data)) { + /* id's differ, cant do this, should raise an error */ + return; + } + /* already belongs to group? */ + if (fcu->grp == value.data) { + /* nothing to do */ + printf("ERROR: F-Curve already belongs to the group\n"); + return; + } + + /* can only change group if we have info about the action the F-Curve is in + * (i.e. for drivers or random F-Curves, this cannot be done) + */ + if (act == NULL) { + /* can't change the grouping of F-Curve when it doesn't belong to an action */ + printf("ERROR: cannot assign F-Curve to group, since F-Curve is not attached to any ID\n"); + return; + } + + /* try to remove F-Curve from action (including from any existing groups) + * - if after this op it is still attached to something, then it is a driver + * not an animation curve as we thought, and we should exit + */ + action_groups_remove_channel(act, fcu); + if (fcu->next) { + /* F-Curve is not one that exists in the action, since the above op couldn't remove it from the list */ + return; + } + + /* add the F-Curve back to the action now in the right place */ + // TODO: make the api function handle the case where there isn't any group to assign to + if (value.data) { + /* add to its group using API function, which makes sure everything goes ok */ + action_groups_add_channel(act, value.data, fcu); + } + else { + /* need to add this back, but it can only go at the end of the list (or else will corrupt groups) */ + BLI_addtail(&act->curves, fcu); + } +} + DriverVar *rna_Driver_new_variable(ChannelDriver *driver) { /* call the API function for this */ @@ -342,12 +405,12 @@ static void rna_FCurve_active_modifier_set(PointerRNA *ptr, PointerRNA value) set_active_fmodifier(&fcu->modifiers, (FModifier *)value.data); } -static FModifier *rna_FCurve_modifiers_new(FCurve *fcu, bContext *C, int type) +static FModifier *rna_FCurve_modifiers_new(FCurve *fcu, int type) { return add_fmodifier(&fcu->modifiers, type); } -static int rna_FCurve_modifiers_remove(FCurve *fcu, bContext *C, int index) +static int rna_FCurve_modifiers_remove(FCurve *fcu, int index) { return remove_fmodifier_index(&fcu->modifiers, index); } @@ -403,6 +466,91 @@ static void rna_FModifierGenerator_coefficients_set(PointerRNA *ptr, const float memcpy(gen->coefficients, values, gen->arraysize * sizeof(float)); } +static void rna_FModifierLimits_minx_range(PointerRNA *ptr, float *min, float *max) +{ + FModifier *fcm= (FModifier*)ptr->data; + FMod_Limits *data= fcm->data; + + *min= MINAFRAMEF; + *max= (data->flag & FCM_LIMIT_XMAX)? data->rect.xmax : MAXFRAMEF; +} + +static void rna_FModifierLimits_maxx_range(PointerRNA *ptr, float *min, float *max) +{ + FModifier *fcm= (FModifier*)ptr->data; + FMod_Limits *data= fcm->data; + + *min= (data->flag & FCM_LIMIT_XMIN)? data->rect.xmin : MINAFRAMEF; + *max= MAXFRAMEF; +} + +static void rna_FModifierLimits_miny_range(PointerRNA *ptr, float *min, float *max) +{ + FModifier *fcm= (FModifier*)ptr->data; + FMod_Limits *data= fcm->data; + + *min= -FLT_MAX; + *max= (data->flag & FCM_LIMIT_YMAX)? data->rect.ymax : FLT_MAX; +} + +static void rna_FModifierLimits_maxy_range(PointerRNA *ptr, float *min, float *max) +{ + FModifier *fcm= (FModifier*)ptr->data; + FMod_Limits *data= fcm->data; + + *min= (data->flag & FCM_LIMIT_YMIN)? data->rect.ymin : -FLT_MAX; + *max= FLT_MAX; +} + + +static void rna_FModifierStepped_start_frame_range(PointerRNA *ptr, float *min, float *max) +{ + FModifier *fcm= (FModifier*)ptr->data; + FMod_Stepped *data= fcm->data; + + *min= MINAFRAMEF; + *max= (data->flag & FCM_STEPPED_NO_AFTER)? data->end_frame : MAXFRAMEF; +} + +static void rna_FModifierStepped_end_frame_range(PointerRNA *ptr, float *min, float *max) +{ + FModifier *fcm= (FModifier*)ptr->data; + FMod_Stepped *data= fcm->data; + + *min= (data->flag & FCM_STEPPED_NO_BEFORE)? data->start_frame : MINAFRAMEF; + *max= MAXFRAMEF; +} + +static BezTriple *rna_FKeyframe_points_add(FCurve *fcu, float frame, float value, int do_replace, int do_needed, int do_fast) +{ + int index; + int flag= 0; + + if(do_replace) flag |= INSERTKEY_REPLACE; + if(do_needed) flag |= INSERTKEY_NEEDED; + if(do_fast) flag |= INSERTKEY_FAST; + + + index= insert_vert_fcurve(fcu, frame, value, flag); + return index >= 0 ? fcu->bezt + index : NULL; +} + +static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTriple *bezt, int do_fast) +{ + int index= (int)(bezt - fcu->bezt); + if (index < 0 || index >= fcu->totvert) { + BKE_report(reports, RPT_ERROR, "bezier not in fcurve."); + return; + } + + delete_fcurve_key(fcu, index, !do_fast); +} + +static void rna_fcurve_range(FCurve *fcu, float range[2]) +{ + calc_fcurve_range(fcu, range, range+1); +} + #else static void rna_def_fmodifier_generator(BlenderRNA *brna) @@ -423,20 +571,20 @@ static void rna_def_fmodifier_generator(BlenderRNA *brna) prop= RNA_def_property(srna, "additive", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_GENERATOR_ADDITIVE); RNA_def_property_ui_text(prop, "Additive", "Values generated by this modifier are applied on top of the existing values instead of overwriting them"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); // XXX this has a special validation func prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, generator_mode_items); RNA_def_property_ui_text(prop, "Mode", "Type of generator to use"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); /* order of the polynomial */ // XXX this has a special validation func prop= RNA_def_property(srna, "poly_order", PROP_INT, PROP_NONE); RNA_def_property_ui_text(prop, "Polynomial Order", "The highest power of 'x' for this polynomial. (number of coefficients - 1)"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); /* coefficients array */ prop= RNA_def_property(srna, "coefficients", PROP_FLOAT, PROP_NONE); @@ -470,31 +618,31 @@ static void rna_def_fmodifier_function_generator(BlenderRNA *brna) /* coefficients */ prop= RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Amplitude", "Scale factor determining the maximum/minimum values"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "phase_multiplier", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Phase Multiplier", "Scale factor determining the 'speed' of the function"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "phase_offset", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Phase Offset", "Constant factor to offset time by for function"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "value_offset", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Value Offset", "Constant factor to offset values by"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); /* flags */ prop= RNA_def_property(srna, "additive", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_GENERATOR_ADDITIVE); RNA_def_property_ui_text(prop, "Additive", "Values generated by this modifier are applied on top of the existing values instead of overwriting them"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "function_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Type", "Type of built-in function to use"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } /* --------- */ @@ -515,18 +663,18 @@ static void rna_def_fmodifier_envelope_ctrl(BlenderRNA *brna) prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "min"); RNA_def_property_ui_text(prop, "Minimum Value", "Lower bound of envelope at this control-point"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "max"); RNA_def_property_ui_text(prop, "Maximum Value", "Upper bound of envelope at this control-point"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); /* Frame */ prop= RNA_def_property(srna, "frame", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "time"); RNA_def_property_ui_text(prop, "Frame", "Frame this control-point occurs on"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); // TODO: // - selection flags (not implemented in UI yet though) @@ -551,17 +699,17 @@ static void rna_def_fmodifier_envelope(BlenderRNA *brna) prop= RNA_def_property(srna, "reference_value", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "midval"); RNA_def_property_ui_text(prop, "Reference Value", "Value that envelope's influence is centered around / based on"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "default_minimum", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "min"); RNA_def_property_ui_text(prop, "Default Minimum", "Lower distance from Reference Value for 1:1 default influence"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "default_maximum", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "max"); RNA_def_property_ui_text(prop, "Default Maximum", "Upper distance from Reference Value for 1:1 default influence"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } /* --------- */ @@ -586,21 +734,21 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna) prop= RNA_def_property(srna, "before_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Before Mode", "Cycling mode to use before first keyframe"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "before_cycles", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "Before Cycles", "Maximum number of cycles to allow before first keyframe. (0 = infinite)"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); /* after */ prop= RNA_def_property(srna, "after_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "After Mode", "Cycling mode to use after last keyframe"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "after_cycles", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_text(prop, "After Cycles", "Maximum number of cycles to allow after last keyframe. (0 = infinite)"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } /* --------- */ @@ -629,42 +777,46 @@ static void rna_def_fmodifier_limits(BlenderRNA *brna) prop= RNA_def_property(srna, "use_minimum_x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_XMIN); RNA_def_property_ui_text(prop, "Minimum X", "Use the minimum X value"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "use_minimum_y", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_YMIN); RNA_def_property_ui_text(prop, "Minimum Y", "Use the minimum Y value"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "use_maximum_x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_XMAX); RNA_def_property_ui_text(prop, "Maximum X", "Use the maximum X value"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "use_maximum_y", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_YMAX); RNA_def_property_ui_text(prop, "Maximum Y", "Use the maximum Y value"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rect.xmin"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifierLimits_minx_range"); RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rect.ymin"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifierLimits_miny_range"); RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rect.xmax"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifierLimits_maxx_range"); RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rect.ymax"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifierLimits_maxy_range"); RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } /* --------- */ @@ -688,33 +840,77 @@ static void rna_def_fmodifier_noise(BlenderRNA *brna) prop= RNA_def_property(srna, "modification", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_modification_items); RNA_def_property_ui_text(prop, "Modification", "Method of modifying the existing F-Curve"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "size"); RNA_def_property_ui_text(prop, "Size", "Scaling (in time) of the noise"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "strength"); RNA_def_property_ui_text(prop, "Strength", "Amplitude of the noise - the amount that it modifies the underlying curve"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "phase"); RNA_def_property_ui_text(prop, "Phase", "A random seed for the noise effect"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "depth"); RNA_def_property_ui_text(prop, "Depth", "Amount of fine level detail present in the noise"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } +/* --------- */ + +static void rna_def_fmodifier_stepped(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "FModifierStepped", "FModifier"); + RNA_def_struct_ui_text(srna, "Stepped Interpolation F-Modifier", "Holds each interpolated value from the F-Curve for several frames without changing the timing"); + RNA_def_struct_sdna_from(srna, "FMod_Stepped", "data"); + + /* properties */ + prop= RNA_def_property(srna, "step_size", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_text(prop, "Step Size", "Number of frames to hold each value"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); + + prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "offset"); + RNA_def_property_ui_text(prop, "Offset", "Reference number of frames before frames get held. Use to get hold for '1-3' vs '5-7' holding patterns"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); + + prop= RNA_def_property(srna, "use_frame_start", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_STEPPED_NO_BEFORE); + RNA_def_property_ui_text(prop, "Use Start Frame", "Restrict modifier to only act after its 'start' frame"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); + + prop= RNA_def_property(srna, "use_frame_end", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_STEPPED_NO_AFTER); + RNA_def_property_ui_text(prop, "Use End Frame", "Restrict modifier to only act before its 'end' frame"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); + + prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "start_frame"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifierStepped_start_frame_range"); + RNA_def_property_ui_text(prop, "Start Frame", "Frame that modifier's influence starts (if applicable)"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); + + prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "end_frame"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifierStepped_end_frame_range"); + RNA_def_property_ui_text(prop, "End Frame", "Frame that modifier's influence ends (if applicable)"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); +} /* --------- */ + static void rna_def_fmodifier(BlenderRNA *brna) { StructRNA *srna; @@ -792,7 +988,8 @@ static void rna_def_drivertarget(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ID"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_editable_func(prop, "rna_DriverTarget_id_editable"); - RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_DriverTarget_id_typef"); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_DriverTarget_id_set", "rna_DriverTarget_id_typef"); RNA_def_property_ui_text(prop, "ID", "ID-block that the specific property used can be found from (id_type property must be set first)"); RNA_def_property_update(prop, 0, "rna_DriverTarget_update_data"); @@ -937,6 +1134,12 @@ static void rna_def_channeldriver(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", DRIVER_FLAG_SHOWDEBUG); RNA_def_property_ui_text(prop, "Show Debug Info", "Show intermediate values for the driver calculations to allow debugging of drivers"); + /* State Info (for Debugging) */ + prop= RNA_def_property(srna, "invalid", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", DRIVER_FLAG_INVALID); + RNA_def_property_ui_text(prop, "Invalid", "Driver could not be evaluated in past, so should be skipped"); + + /* Functions */ RNA_api_drivers(srna); } @@ -956,14 +1159,14 @@ static void rna_def_fpoint(BlenderRNA *brna) prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", 1); RNA_def_property_ui_text(prop, "Selected", "Selection status"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); /* Vector value */ - prop= RNA_def_property(srna, "point", PROP_FLOAT, PROP_XYZ); + prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ); RNA_def_property_float_sdna(prop, NULL, "vec"); RNA_def_property_array(prop, 2); RNA_def_property_ui_text(prop, "Point", "Point coordinates"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } @@ -983,17 +1186,17 @@ static void rna_def_fkeyframe(BlenderRNA *brna) prop= RNA_def_property(srna, "selected_handle1", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f1", 0); RNA_def_property_ui_text(prop, "Handle 1 selected", "Handle 1 selection status"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); prop= RNA_def_property(srna, "selected_handle2", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f3", 0); RNA_def_property_ui_text(prop, "Handle 2 selected", "Handle 2 selection status"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f2", 0); RNA_def_property_ui_text(prop, "Selected", "Control point selection status"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); /* Enums */ prop= RNA_def_property(srna, "handle1_type", PROP_ENUM, PROP_NONE); @@ -1025,22 +1228,21 @@ static void rna_def_fkeyframe(BlenderRNA *brna) RNA_def_property_array(prop, 2); RNA_def_property_float_funcs(prop, "rna_FKeyframe_handle1_get", "rna_FKeyframe_handle1_set", NULL); RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION); RNA_def_property_array(prop, 2); RNA_def_property_float_funcs(prop, "rna_FKeyframe_ctrlpoint_get", "rna_FKeyframe_ctrlpoint_set", NULL); RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); prop= RNA_def_property(srna, "handle2", PROP_FLOAT, PROP_TRANSLATION); RNA_def_property_array(prop, 2); RNA_def_property_float_funcs(prop, "rna_FKeyframe_handle2_get", "rna_FKeyframe_handle2_set", NULL); RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } - static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop) { /* add modifiers */ @@ -1065,7 +1267,6 @@ static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop) /* Constraint collection */ func= RNA_def_function(srna, "new", "rna_FCurve_modifiers_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Add a constraint to this object"); /* return type */ parm= RNA_def_pointer(func, "fmodifier", "FModifier", "", "New fmodifier."); @@ -1075,7 +1276,6 @@ static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_flag(parm, PROP_REQUIRED); func= RNA_def_function(srna, "remove", "rna_FCurve_modifiers_remove"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Remove a modifier from this fcurve."); /* return type */ parm= RNA_def_boolean(func, "success", 0, "Success", "Removed the constraint successfully."); @@ -1085,11 +1285,50 @@ static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_flag(parm, PROP_REQUIRED); } +/* fcurve.keyframe_points */ +static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "FCurveKeyframePoints"); + srna= RNA_def_struct(brna, "FCurveKeyframePoints", NULL); + RNA_def_struct_sdna(srna, "FCurve"); + RNA_def_struct_ui_text(srna, "Keyframe Points", "Collection of keyframe points"); + + func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add"); + RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve."); + parm= RNA_def_float(func, "frame", 0.0f, -FLT_MAX, FLT_MAX, "", "X Value of this keyframe point", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "", "Y Value of this keyframe point", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* optional */ + parm= RNA_def_boolean(func, "replace", 0, "Replace", "Replace existing keyframes"); + parm= RNA_def_boolean(func, "needed", 0, "Needed", "Only adds keyframes that are needed"); + parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time"); + + parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Newly created keyframe"); + RNA_def_function_return(func, parm); + + + func= RNA_def_function(srna, "remove", "rna_FKeyframe_points_remove"); + RNA_def_function_ui_description(func, "Remove keyframe from an fcurve."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Keyframe to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + /* optional */ + parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time"); +} + static void rna_def_fcurve(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - + FunctionRNA *func; + PropertyRNA *parm; + static EnumPropertyItem prop_mode_extend_items[] = { {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant", ""}, {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear", ""}, @@ -1118,10 +1357,11 @@ static void rna_def_fcurve(BlenderRNA *brna) prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "grp"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX this is not editable for now, since editing this will easily break the visible hierarchy + RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Group", "Action Group that this F-Curve belongs to"); - RNA_def_property_update(prop, NC_ANIMATION|ND_FCURVES_ORDER, NULL); - + RNA_def_property_pointer_funcs(prop, NULL, "rna_FCurve_group_set", NULL); + RNA_def_property_update(prop, NC_ANIMATION, NULL); + /* Path + Array Index */ prop= RNA_def_property(srna, "data_path", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, "rna_FCurve_RnaPath_get", "rna_FCurve_RnaPath_length", "rna_FCurve_RnaPath_set"); @@ -1147,17 +1387,17 @@ static void rna_def_fcurve(BlenderRNA *brna) prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_SELECTED); RNA_def_property_ui_text(prop, "Selected", "F-Curve is selected for editing"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL); prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_PROTECTED); RNA_def_property_ui_text(prop, "Locked", "F-Curve's settings cannot be edited"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "muted", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_MUTED); RNA_def_property_ui_text(prop, "Muted", "F-Curve is not evaluated"); - RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL); + RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL); prop= RNA_def_property(srna, "auto_clamped_handles", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_AUTO_HANDLES); @@ -1169,6 +1409,12 @@ static void rna_def_fcurve(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Visible", "F-Curve and its keyframes are shown in the Graph Editor graphs"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL); + /* State Info (for Debugging) */ + prop= RNA_def_property(srna, "disabled", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_DISABLED); + RNA_def_property_ui_text(prop, "Disabled", "F-Curve could not be evaluated in past, so should be skipped when evaluating"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL); + /* Collections */ prop= RNA_def_property(srna, "sampled_points", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "fpt", "totvert"); @@ -1179,12 +1425,28 @@ static void rna_def_fcurve(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "bezt", "totvert"); RNA_def_property_struct_type(prop, "Keyframe"); RNA_def_property_ui_text(prop, "Keyframes", "User-editable keyframes"); + rna_def_fcurve_keyframe_points(brna, prop); prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "FModifier"); RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the shape of the F-Curve"); - rna_def_fcurve_modifiers(brna, prop); + + /* Functions */ + func= RNA_def_function(srna, "evaluate", "evaluate_fcurve"); /* calls the C/API direct */ + RNA_def_function_ui_description(func, "Evaluate fcurve."); + parm= RNA_def_float(func, "frame", 1.0f, -FLT_MAX, FLT_MAX, "Frame", "Evaluate fcurve at given frame", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return value */ + parm= RNA_def_float(func, "position", 0, -FLT_MAX, FLT_MAX, "Position", "Fcurve position", -FLT_MAX, FLT_MAX); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "range", "rna_fcurve_range"); + RNA_def_function_ui_description(func, "Get the time extents for F-Curve."); + /* return value */ + parm= RNA_def_float_vector(func, "range", 2, NULL, -FLT_MAX, FLT_MAX, "Range", "Min/Max values", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_THICK_WRAP); + RNA_def_function_output(func, parm); } /* *********************** */ @@ -1209,6 +1471,7 @@ void RNA_def_fcurve(BlenderRNA *brna) rna_def_fmodifier_python(brna); rna_def_fmodifier_limits(brna); rna_def_fmodifier_noise(brna); + rna_def_fmodifier_stepped(brna); } diff --git a/source/blender/makesrna/intern/rna_fcurve_api.c b/source/blender/makesrna/intern/rna_fcurve_api.c index 2f221663540..27deb242d73 100644 --- a/source/blender/makesrna/intern/rna_fcurve_api.c +++ b/source/blender/makesrna/intern/rna_fcurve_api.c @@ -30,7 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "DNA_anim_types.h" diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c index c14c7ee365b..3a763961420 100644 --- a/source/blender/makesrna/intern/rna_fluidsim.c +++ b/source/blender/makesrna/intern/rna_fluidsim.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -173,6 +172,7 @@ static void rna_def_fluidsim_slip(StructRNA *srna) prop= RNA_def_property(srna, "slip_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "typeFlags"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, slip_items); RNA_def_property_ui_text(prop, "Slip Type", ""); @@ -216,16 +216,6 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna) RNA_def_property_range(prop, 1, 100); RNA_def_property_ui_text(prop, "Preview Resolution", "Preview resolution in X,Y and Z direction"); - prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_TIME); - RNA_def_property_float_sdna(prop, NULL, "animStart"); - RNA_def_property_range(prop, 0, 100); - RNA_def_property_ui_text(prop, "Start Time", "Simulation time of the first blender frame"); - - prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_TIME); - RNA_def_property_float_sdna(prop, NULL, "animEnd"); - RNA_def_property_range(prop, 0, 100); - RNA_def_property_ui_text(prop, "End Time", "Simulation time of the last blender frame"); - prop= RNA_def_property(srna, "viewport_display_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "guiDisplayMode"); RNA_def_property_enum_items(prop, quality_items); @@ -253,13 +243,31 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Memory Estimate", "Estimated amount of memory needed for baking the domain"); /* advanced settings */ - prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION); RNA_def_property_float_sdna(prop, NULL, "gravx"); RNA_def_property_array(prop, 3); RNA_def_property_range(prop, -1000.1, 1000.1); RNA_def_property_ui_text(prop, "Gravity", "Gravity in X, Y and Z direction"); - + + prop= RNA_def_property(srna, "override_time", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_OVERRIDE_TIME); + RNA_def_property_ui_text(prop, "Override Time", "Use a custom start and end time (in seconds) instead of the scene's timeline"); + + prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_TIME); + RNA_def_property_float_sdna(prop, NULL, "animStart"); + RNA_def_property_range(prop, 0, 100); + RNA_def_property_ui_text(prop, "Start Time", "Simulation time of the first blender frame"); + + prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_TIME); + RNA_def_property_float_sdna(prop, NULL, "animEnd"); + RNA_def_property_range(prop, 0, 100); + RNA_def_property_ui_text(prop, "End Time", "Simulation time of the last blender frame"); + + prop= RNA_def_property(srna, "real_world_size", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "realsize"); + RNA_def_property_range(prop, 0.001, 10); + RNA_def_property_ui_text(prop, "Real World Size", "Size of the simulation domain in metres"); + prop= RNA_def_property(srna, "viscosity_preset", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "viscosityMode"); RNA_def_property_enum_items(prop, viscosity_items); @@ -275,18 +283,15 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna) RNA_def_property_range(prop, 0, 10); RNA_def_property_ui_text(prop, "Viscosity Exponent", "Negative exponent for the viscosity value (to simplify entering small values e.g. 5*10^-6.)"); - prop= RNA_def_property(srna, "real_world_size", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "realsize"); - RNA_def_property_range(prop, 0.001, 10); - RNA_def_property_ui_text(prop, "Real World Size", "Size of the simulation domain in metres"); - prop= RNA_def_property(srna, "grid_levels", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "maxRefine"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, -1, 4); RNA_def_property_ui_text(prop, "Grid Levels", "Number of coarsened grids to use (-1 for automatic)"); prop= RNA_def_property(srna, "compressibility", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "gstar"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0.001, 0.1); RNA_def_property_ui_text(prop, "Compressibility", "Allowed compressibility due to gravitational force for standing fluid. (directly affects simulation step size)"); @@ -296,27 +301,32 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna) prop= RNA_def_property(srna, "surface_smoothing", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "surfaceSmoothing"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0.0, 5.0); RNA_def_property_ui_text(prop, "Surface Smoothing", "Amount of surface smoothing. A value of 0 is off, 1 is normal smoothing and more than 1 is extra smoothing"); prop= RNA_def_property(srna, "surface_subdivisions", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "surfaceSubdivs"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0, 5); RNA_def_property_ui_text(prop, "Surface Subdivisions", "Number of isosurface subdivisions. This is necessary for the inclusion of particles into the surface generation. Warning - can lead to longer computation times!"); prop= RNA_def_property(srna, "generate_speed_vectors", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "domainNovecgen", 0); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Generate Speed Vectors", "Generate speed vectors for vector blur"); /* particles */ prop= RNA_def_property(srna, "tracer_particles", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "generateTracers"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0, 10000); RNA_def_property_ui_text(prop, "Tracer Particles", "Number of tracer particles to generate"); prop= RNA_def_property(srna, "generate_particles", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "generateParticles"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0.0, 10.0); RNA_def_property_ui_text(prop, "Generate Particles", "Amount of particles to generate (0=off, 1=normal, >1=more)"); } @@ -333,14 +343,25 @@ static void rna_def_fluidsim_volume(StructRNA *srna) prop= RNA_def_property(srna, "volume_initialization", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "volumeInitType"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, volume_type_items); RNA_def_property_ui_text(prop, "Volume Initialization", "Volume initialization type"); prop= RNA_def_property(srna, "export_animated_mesh", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "domainNovecgen", 0); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Export Animated Mesh", "Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it"); } +static void rna_def_fluidsim_active(StructRNA *srna) +{ + PropertyRNA *prop; + + prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_ACTIVE); + RNA_def_property_ui_text(prop, "Active", "Object contributes to the fluid simulation"); +} + static void rna_def_fluidsim_fluid(BlenderRNA *brna) { StructRNA *srna; @@ -350,8 +371,9 @@ static void rna_def_fluidsim_fluid(BlenderRNA *brna) RNA_def_struct_sdna(srna, "FluidsimSettings"); RNA_def_struct_ui_text(srna, "Fluid Fluid Simulation Settings", "Fluid simulation settings for the fluid in the simulation"); + rna_def_fluidsim_active(srna); rna_def_fluidsim_volume(srna); - + prop= RNA_def_property(srna, "initial_velocity", PROP_FLOAT, PROP_VELOCITY); RNA_def_property_float_sdna(prop, NULL, "iniVelx"); RNA_def_property_array(prop, 3); @@ -364,15 +386,17 @@ static void rna_def_fluidsim_obstacle(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "ObstacleFluidSettings", "FluidSettings"); + srna= RNA_def_struct(brna, "ObstacleFluidSettings", "FluidSettings"); RNA_def_struct_sdna(srna, "FluidsimSettings"); RNA_def_struct_ui_text(srna, "Obstacle Fluid Simulation Settings", "Fluid simulation settings for obstacles in the simulation"); + rna_def_fluidsim_active(srna); rna_def_fluidsim_volume(srna); rna_def_fluidsim_slip(srna); prop= RNA_def_property(srna, "impact_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "surfaceSmoothing"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, -2.0, 10.0); RNA_def_property_ui_text(prop, "Impact Factor", "This is an unphysical value for moving objects - it controls the impact an obstacle has on the fluid, =0 behaves a bit like outflow (deleting fluid), =1 is default, while >1 results in high forces. Can be used to tweak total mass"); } @@ -382,10 +406,11 @@ static void rna_def_fluidsim_inflow(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "InflowFluidSettings", "FluidSettings"); + srna= RNA_def_struct(brna, "InflowFluidSettings", "FluidSettings"); RNA_def_struct_sdna(srna, "FluidsimSettings"); RNA_def_struct_ui_text(srna, "Inflow Fluid Simulation Settings", "Fluid simulation settings for objects adding fluids in the simulation"); + rna_def_fluidsim_active(srna); rna_def_fluidsim_volume(srna); prop= RNA_def_property(srna, "inflow_velocity", PROP_FLOAT, PROP_VELOCITY); @@ -395,6 +420,7 @@ static void rna_def_fluidsim_inflow(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Inflow Velocity", "Initial velocity of fluid"); prop= RNA_def_property(srna, "local_coordinates", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSINFLOW_LOCALCOORD); RNA_def_property_ui_text(prop, "Local Coordinates", "Use local coordinates for inflow. (e.g. for rotating objects)"); } @@ -403,10 +429,11 @@ static void rna_def_fluidsim_outflow(BlenderRNA *brna) { StructRNA *srna; - srna= RNA_def_struct(brna, "OutflowFluidSettings", "FluidSettings"); + srna= RNA_def_struct(brna, "OutflowFluidSettings", "FluidSettings"); RNA_def_struct_sdna(srna, "FluidsimSettings"); RNA_def_struct_ui_text(srna, "Outflow Fluid Simulation Settings", "Fluid simulation settings for objects removing fluids from the simulation"); + rna_def_fluidsim_active(srna); rna_def_fluidsim_volume(srna); } @@ -415,7 +442,7 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "ParticleFluidSettings", "FluidSettings"); + srna= RNA_def_struct(brna, "ParticleFluidSettings", "FluidSettings"); RNA_def_struct_sdna(srna, "FluidsimSettings"); RNA_def_struct_ui_text(srna, "Particle Fluid Simulation Settings", "Fluid simulation settings for objects storing fluid particles generated by the simulation"); @@ -453,10 +480,12 @@ static void rna_def_fluidsim_control(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "ControlFluidSettings", "FluidSettings"); + srna= RNA_def_struct(brna, "ControlFluidSettings", "FluidSettings"); RNA_def_struct_sdna(srna, "FluidsimSettings"); RNA_def_struct_ui_text(srna, "Control Fluid Simulation Settings", "Fluid simulation settings for objects controlling the motion of fluid in the simulation"); + rna_def_fluidsim_active(srna); + prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "cpsTimeStart"); RNA_def_property_range(prop, 0.0, 100.0); @@ -489,11 +518,13 @@ static void rna_def_fluidsim_control(BlenderRNA *brna) prop= RNA_def_property(srna, "quality", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "cpsQuality"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 5.0, 100.0); RNA_def_property_ui_text(prop, "Quality", "Specifies the quality which is used for object sampling. (higher = better but slower)"); prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse control object movement"); } @@ -523,11 +554,12 @@ void RNA_def_fluidsim(BlenderRNA *brna) prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_fluid_type_items); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Type", "Type of participation in the fluid simulation"); RNA_def_property_update(prop, 0, "rna_FluidSettings_update_type"); //prop= RNA_def_property(srna, "ipo", PROP_POINTER, PROP_NONE); - //RNA_def_property_ui_text(prop, "Ipo Curves", "Ipo curves used by fluid simulation settings"); + //RNA_def_property_ui_text(prop, "IPO Curves", "IPO curves used by fluid simulation settings"); /* types */ diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 4e9d15b182d..a503eab4ba9 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -25,8 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" -#include "RNA_enum_types.h" #include "rna_internal.h" @@ -153,7 +151,7 @@ static void rna_def_gpencil_layer(BlenderRNA *brna) /* Name */ prop= RNA_def_property(srna, "info", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text(prop, "Info", "Description of layer"); + RNA_def_property_ui_text(prop, "Info", "Layer name"); RNA_def_struct_name_property(srna, prop); /* Frames */ @@ -171,13 +169,13 @@ static void rna_def_gpencil_layer(BlenderRNA *brna) /* Drawing Color */ prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Color", "Color that all sketches in this layer are drawn with"); + RNA_def_property_ui_text(prop, "Color", "Color for all strokes in this layer"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); prop= RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "color[3]"); RNA_def_property_range(prop, 0.3, 1.0f); - RNA_def_property_ui_text(prop, "Opacity", "Visibility of strokes"); + RNA_def_property_ui_text(prop, "Opacity", "Layer Opacity"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); /* Line Thickness */ @@ -196,29 +194,29 @@ static void rna_def_gpencil_layer(BlenderRNA *brna) prop= RNA_def_property(srna, "max_ghost_range", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "gstep"); RNA_def_property_range(prop, 0, 120); - RNA_def_property_ui_text(prop, "Max Ghost Range", "Maximum number of frames on either side of the active frame to show. (0 = just show the 'first' available sketch on either side)"); + RNA_def_property_ui_text(prop, "Max Ghost Range", "Maximum number of frames on either side of the active frame to show (0 = show the 'first' available sketch on either side)"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); /* Flags */ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE); - RNA_def_property_ui_text(prop, "Hide", "Layer doesn't get drawn"); + RNA_def_property_ui_text(prop, "Hide", "Set layer Visibility"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_LOCKED); - RNA_def_property_ui_text(prop, "Locked", "Layer is protected from further editing and/or frame changes"); + RNA_def_property_ui_text(prop, "Locked", "Protect layer from further editing and/or frame changes"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); prop= RNA_def_property(srna, "frame_lock", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_FRAMELOCK); - RNA_def_property_ui_text(prop, "Frame Locked", "Current frame displayed by layer cannot be changed"); + RNA_def_property_ui_text(prop, "Frame Locked", "Lock current frame displayed by layer"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_ACTIVE); RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencilLayer_active_set"); - RNA_def_property_ui_text(prop, "Active", "Layer is 'active' layer being edited"); + RNA_def_property_ui_text(prop, "Active", "Set active layer for editing"); RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL); prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); @@ -239,10 +237,10 @@ static void rna_def_gpencil_data(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem draw_mode_items[] = { - {GP_DATA_VIEWALIGN, "CURSOR", 0, "Cursor", ""}, - {0, "VIEW", 0, "View", ""}, /* weired, GP_DATA_VIEWALIGN is inverted */ - {GP_DATA_VIEWALIGN|GP_DATA_DEPTH_VIEW, "SURFACE", 0, "Surface", ""}, - {GP_DATA_VIEWALIGN|GP_DATA_DEPTH_STROKE, "STROKE", 0, "Stroke", ""}, + {GP_DATA_VIEWALIGN, "CURSOR", 0, "Cursor", "Draw stroke at the 3D cursor"}, + {0, "VIEW", 0, "View", "Stick stroke to the view "}, /* weired, GP_DATA_VIEWALIGN is inverted */ + {GP_DATA_VIEWALIGN|GP_DATA_DEPTH_VIEW, "SURFACE", 0, "Surface", "Stick stroke to surfaces"}, + {GP_DATA_VIEWALIGN|GP_DATA_DEPTH_STROKE, "STROKE", 0, "Stroke", "Stick stroke to other strokes"}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "GreasePencil", "ID"); @@ -254,7 +252,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna) prop= RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "layers", NULL); RNA_def_property_struct_type(prop, "GPencilLayer"); - RNA_def_property_ui_text(prop, "Layers", "Similar to layers in Photoshop"); + RNA_def_property_ui_text(prop, "Layers", ""); /* Flags */ prop= RNA_def_property(srna, "draw_mode", PROP_ENUM, PROP_NONE); @@ -264,7 +262,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna) prop= RNA_def_property(srna, "use_stroke_endpoints", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_DEPTH_STROKE_ENDPOINTS); - RNA_def_property_ui_text(prop, "Only Endpoints", "When snapping the stroke to existing lines, only use the first and last parts of the line"); + RNA_def_property_ui_text(prop, "Only Endpoints", "Only use the first and last parts of the stroke for snapping"); } diff --git a/source/blender/makesrna/intern/rna_group.c b/source/blender/makesrna/intern/rna_group.c index 8e8db26ffb3..707662e58e0 100644 --- a/source/blender/makesrna/intern/rna_group.c +++ b/source/blender/makesrna/intern/rna_group.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -111,6 +110,7 @@ void RNA_def_group(BlenderRNA *brna) srna= RNA_def_struct(brna, "Group", "ID"); RNA_def_struct_ui_text(srna, "Group", "Group of Object datablocks"); RNA_def_struct_ui_icon(srna, ICON_GROUP); + RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT); /* this is done on save/load in readfile.c, removed if no objects are in the group */ prop= RNA_def_property(srna, "dupli_offset", PROP_FLOAT, PROP_TRANSLATION); RNA_def_property_float_sdna(prop, NULL, "dupli_ofs"); diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c index e9eec9bf64a..7144b409299 100644 --- a/source/blender/makesrna/intern/rna_image.c +++ b/source/blender/makesrna/intern/rna_image.c @@ -25,7 +25,7 @@ #include #include "RNA_define.h" -#include "RNA_types.h" +#include "RNA_enum_types.h" #include "rna_internal.h" @@ -33,6 +33,7 @@ #include "DNA_scene_types.h" #include "BKE_context.h" +#include "BKE_depsgraph.h" #include "BKE_image.h" #include "WM_types.h" @@ -78,6 +79,7 @@ static void rna_Image_source_update(Main *bmain, Scene *scene, PointerRNA *ptr) { Image *ima= ptr->id.data; BKE_image_signal(ima, NULL, IMA_SIGNAL_SRC_CHANGE); + DAG_id_flush_update(&ima->id, 0); } static void rna_Image_fields_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -105,6 +107,7 @@ static void rna_Image_reload_update(Main *bmain, Scene *scene, PointerRNA *ptr) { Image *ima= ptr->id.data; BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD); + DAG_id_flush_update(&ima->id, 0); } static void rna_Image_generated_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -142,6 +145,23 @@ static EnumPropertyItem *rna_Image_source_itemf(bContext *C, PointerRNA *ptr, in return item; } +static int rna_Image_file_format_get(PointerRNA *ptr) +{ + Image *image= (Image*)ptr->data; + ImBuf *ibuf= BKE_image_get_ibuf(image, NULL); + return BKE_ftype_to_imtype(ibuf ? ibuf->ftype : 0); +} + +static void rna_Image_file_format_set(PointerRNA *ptr, int value) +{ + Image *image= (Image*)ptr->data; + if(BKE_imtype_is_movie(value) == 0) { /* should be able to throw an error here */ + ImBuf *ibuf= BKE_image_get_ibuf(image, NULL); + if(ibuf) + ibuf->ftype= BKE_imtype_to_ftype(value); + } +} + static int rna_Image_has_data_get(PointerRNA *ptr) { Image *im= (Image*)ptr->data; @@ -163,7 +183,7 @@ static void rna_Image_size_get(PointerRNA *ptr,int *values) values[0]= ibuf->x; values[1]= ibuf->y; } - else { + else { values[0]= 0; values[1]= 0; } @@ -193,6 +213,12 @@ static int rna_Image_depth_get(PointerRNA *ptr) return depth; } +static int rna_Image_is_image_icon(Image *me, bContext *C) +{ + const char prefix[] = ".imageicon."; + return strncmp(me->id.name+2, prefix, sizeof(prefix)-1) == 0; +} + #else static void rna_def_imageuser(BlenderRNA *brna) @@ -224,7 +250,7 @@ static void rna_def_imageuser(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Offset", "Offsets the number of the frame to use in the animation"); RNA_def_property_update(prop, 0, "rna_ImageUser_update"); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "sfra"); RNA_def_property_range(prop, 1.0f, MAXFRAMEF); RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie"); @@ -260,7 +286,8 @@ static void rna_def_image(BlenderRNA *brna) {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem prop_generated_type_items[]= { {0, "BLANK", 0, "Blank", "Generate a blank image"}, - {1, "UVGRID", 0, "UV Grid", "Generated grid to test UV mappings"}, + {1, "UV_GRID", 0, "UV Grid", "Generated grid to test UV mappings"}, + {2, "COLOR_GRID", 0, "Color Grid", "Generated improved UV grid to test UV mappings"}, {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem prop_mapping_items[]= { {0, "UV", 0, "UV Coordinates", "Use UV coordinates for mapping the image"}, @@ -271,15 +298,28 @@ static void rna_def_image(BlenderRNA *brna) {IMA_STD_FIELD, "ODD", 0, "Lower First", "Lower field first"}, {0, NULL, 0, NULL, NULL}}; + FunctionRNA *func; + PropertyRNA *parm; + srna= RNA_def_struct(brna, "Image", "ID"); RNA_def_struct_ui_text(srna, "Image", "Image datablock referencing an external or packed image"); RNA_def_struct_ui_icon(srna, ICON_IMAGE_DATA); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Filename", "Image/Movie file name"); + RNA_def_property_ui_text(prop, "File Name", "Image/Movie file name"); RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update"); + /* eek. this is horrible but needed so we can save to a new name without blanking the data :( */ + prop= RNA_def_property(srna, "filepath_raw", PROP_STRING, PROP_FILEPATH); + RNA_def_property_string_sdna(prop, NULL, "name"); + RNA_def_property_ui_text(prop, "File Name", "Image/Movie file name (without data refreshing)"); + + prop= RNA_def_property(srna, "file_format", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, image_type_items); + RNA_def_property_enum_funcs(prop, "rna_Image_file_format_get", "rna_Image_file_format_set", NULL); + RNA_def_property_ui_text(prop, "File Format", "Format used for re-saving this file"); + prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, image_source_items); RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Image_source_itemf"); @@ -302,17 +342,20 @@ static void rna_def_image(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Field Order", "Order of video fields. Select which lines are displayed first"); RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL); + /* functions */ + func= RNA_def_function(srna, "is_image_icon", "rna_Image_is_image_icon"); + RNA_def_function_ui_description(func, "Returns true if Image name is prefixed with .imageicon."); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_boolean(func, "ret", 0, "", ""); + RNA_def_function_return(func, parm); + /* booleans */ prop= RNA_def_property(srna, "fields", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_FIELDS); RNA_def_property_ui_text(prop, "Fields", "Use fields of the image"); RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_fields_update"); - prop= RNA_def_property(srna, "antialias", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANTIALI); - RNA_def_property_ui_text(prop, "Anti-alias", "Toggles image anti-aliasing, only works with solid colors"); - RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL); - prop= RNA_def_property(srna, "premultiply", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_DO_PREMUL); RNA_def_property_ui_text(prop, "Premultiply", "Convert RGB from key alpha to premultiplied alpha"); @@ -406,6 +449,12 @@ static void rna_def_image(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Clamp Y", "Disable texture repeating vertically"); RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL); + prop= RNA_def_property(srna, "bindcode", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "bindcode"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Bindcode", "OpenGL bindcode"); + RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL); + /* Image.has_data and Image.depth are temporary, Update import_obj.py when they are replaced (Arystan) @@ -415,7 +464,7 @@ static void rna_def_image(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Has data", "True if this image has data"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_funcs(prop, "rna_Image_depth_get", NULL, NULL); RNA_def_property_ui_text(prop, "Depth", "Image bit depth"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c index 892370a9f72..263603cbd36 100644 --- a/source/blender/makesrna/intern/rna_image_api.c +++ b/source/blender/makesrna/intern/rna_image_api.c @@ -32,7 +32,8 @@ #include #include "RNA_define.h" -#include "RNA_types.h" + +#include "BIF_gl.h" #ifdef RNA_RUNTIME @@ -40,9 +41,13 @@ #include "BKE_packedFile.h" #include "BKE_main.h" #include "BKE_utildefines.h" +#include "BKE_global.h" /* grr: G.sce */ #include "IMB_imbuf.h" +#include "BIF_gl.h" +#include "GPU_draw.h" + #include "DNA_image_types.h" #include "DNA_scene_types.h" @@ -81,12 +86,21 @@ static void rna_Image_save(Image *image, ReportList *reports) { ImBuf *ibuf= BKE_image_get_ibuf(image, NULL); if(ibuf) { + char filename[FILE_MAXDIR + FILE_MAXFILE]; + BLI_strncpy(filename, image->name, sizeof(filename)); + BLI_path_abs(filename, G.sce); + if(image->packedfile) { if (writePackedFile(reports, image->name, image->packedfile, 0) != RET_OK) { BKE_reportf(reports, RPT_ERROR, "Image \"%s\" could saved packed file to \"%s\"", image->id.name+2, image->name); } } - else if (IMB_saveiff(ibuf, image->name, ibuf->flags)) { + else if (IMB_saveiff(ibuf, filename, ibuf->flags)) { + image->type= IMA_TYPE_IMAGE; + + if(image->source==IMA_SRC_GENERATED) + image->source= IMA_SRC_FILE; + ibuf->userflags &= ~IB_BITMAPDIRTY; } else { @@ -98,6 +112,70 @@ static void rna_Image_save(Image *image, ReportList *reports) } } +static void rna_Image_reload(Image *image) +{ + BKE_image_signal(image, NULL, IMA_SIGNAL_RELOAD); +} + +static void rna_Image_update(Image *image, ReportList *reports) +{ + ImBuf *ibuf= BKE_image_get_ibuf(image, NULL); + + if(ibuf == NULL) { + BKE_reportf(reports, RPT_ERROR, "Image \"%s\" does not have any image data", image->id.name+2); + return; + } + + IMB_rect_from_float(ibuf); +} + +static int rna_Image_gl_load(Image *image, ReportList *reports, int filter, int mag) +{ + ImBuf *ibuf; + unsigned int *bind = &image->bindcode; + int error = GL_NO_ERROR; + + if(*bind) + return error; + + ibuf= BKE_image_get_ibuf(image, NULL); + + if(ibuf == NULL || ibuf->rect == NULL ) { + BKE_reportf(reports, RPT_ERROR, "Image \"%s\" does not have any image data", image->id.name+2); + return (int)GL_INVALID_OPERATION; + } + + /* could be made into a function? */ + glGenTextures(1, (GLuint*)bind); + glBindTexture(GL_TEXTURE_2D, *bind); + + if (filter != GL_NEAREST && filter != GL_LINEAR) + error = (int)gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_INT, ibuf->rect); + + if (!error) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLint)filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLint)mag); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ibuf->x, ibuf->y, 0, GL_RGBA, GL_UNSIGNED_INT, ibuf->rect); + error = (int)glGetError(); + } + + if (error) { + glDeleteTextures(1, (GLuint*)bind); + image->bindcode = 0; + } + + return error; +} + +static void rna_Image_gl_free(Image *image) +{ + GPU_free_image(image); + + /* remove the nocollect flag, image is available for garbage collection again */ + image->flag &= ~IMA_NOCOLLECT; +} + #else void RNA_api_image(StructRNA *srna) @@ -106,15 +184,36 @@ void RNA_api_image(StructRNA *srna) PropertyRNA *parm; func= RNA_def_function(srna, "save_render", "rna_Image_save_render"); - RNA_def_function_ui_description(func, "Save image to a specific path using a scenes render settings."); + RNA_def_function_ui_description(func, "Save image to a specific path using a scenes render settings"); RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); - parm= RNA_def_string(func, "path", "", 0, "", "Save path."); + parm= RNA_def_string(func, "filepath", "", 0, "", "Save path."); RNA_def_property_flag(parm, PROP_REQUIRED); - parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to take image parameters from."); + parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to take image parameters from"); func= RNA_def_function(srna, "save", "rna_Image_save"); - RNA_def_function_ui_description(func, "Save image to its source path."); + RNA_def_function_ui_description(func, "Save image to its source path"); RNA_def_function_flag(func, FUNC_USE_REPORTS); + + func= RNA_def_function(srna, "reload", "rna_Image_reload"); + RNA_def_function_ui_description(func, "Reload the image from its source path"); + + func= RNA_def_function(srna, "update", "rna_Image_update"); + RNA_def_function_ui_description(func, "Update the display image from the floating point buffer"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + + func= RNA_def_function(srna, "gl_load", "rna_Image_gl_load"); + RNA_def_function_ui_description(func, "Load the image into OpenGL graphics memory"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", "The texture minifying function", -INT_MAX, INT_MAX); + parm= RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", "The texture magnification function", -INT_MAX, INT_MAX); + /* return value */ + parm= RNA_def_int(func, "error", 0, -INT_MAX, INT_MAX, "Error", "OpenGL error value", -INT_MAX, INT_MAX); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "gl_free", "rna_Image_gl_free"); + RNA_def_function_ui_description(func, "Free the image from OpenGL graphics memory"); + + /* TODO, pack/unpack, maybe should be generic functions? */ } #endif diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 06e0a96deed..806a22dd3b8 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -31,8 +31,10 @@ #define RNA_MAGIC ((int)~0) +struct ID; struct IDProperty; struct SDNA; +struct Sequence; /* Data structures used during define */ @@ -200,9 +202,12 @@ void rna_object_vgroup_name_index_set(struct PointerRNA *ptr, const char *value, void rna_object_vgroup_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen); void rna_object_uvlayer_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen); void rna_object_vcollayer_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen); +PointerRNA rna_object_shapekey_index_get(struct ID *id, int value); +int rna_object_shapekey_index_set(struct ID *id, PointerRNA value, int current); -void rna_Object_update(struct Main *bmain, struct Scene *scene, struct PointerRNA *ptr); -void rna_Object_update_data(struct Main *bmain, struct Scene *scene, struct PointerRNA *ptr); +/* named internal so as not to conflict with obj.update() rna func */ +void rna_Object_internal_update(struct Main *bmain, struct Scene *scene, struct PointerRNA *ptr); +void rna_Object_internal_update_data(struct Main *bmain, struct Scene *scene, struct PointerRNA *ptr); void rna_Mesh_update_draw(struct Main *bmain, struct Scene *scene, struct PointerRNA *ptr); void rna_TextureSlot_update(struct Main *bmain, struct Scene *scene, struct PointerRNA *ptr); @@ -224,12 +229,17 @@ void RNA_api_main(struct StructRNA *srna); void RNA_api_material(StructRNA *srna); void RNA_api_mesh(struct StructRNA *srna); void RNA_api_object(struct StructRNA *srna); +void RNA_api_object_base(struct StructRNA *srna); void RNA_api_pose_channel(struct StructRNA *srna); void RNA_api_scene(struct StructRNA *srna); void RNA_api_scene_render(struct StructRNA *srna); +void RNA_api_sequence_strip(StructRNA *srna); void RNA_api_text(struct StructRNA *srna); void RNA_api_ui_layout(struct StructRNA *srna); void RNA_api_wm(struct StructRNA *srna); +void RNA_api_sensor(struct StructRNA *srna); +void RNA_api_controller(struct StructRNA *srna); +void RNA_api_actuator(struct StructRNA *srna); /* main collection functions */ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop); @@ -246,7 +256,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop); void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop); void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop); void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop); -void RNA_def_main_vfonts(BlenderRNA *brna, PropertyRNA *cprop); +void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop); void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop); void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop); void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop); @@ -297,6 +307,7 @@ void rna_iterator_listbase_begin(struct CollectionPropertyIterator *iter, struct void rna_iterator_listbase_next(struct CollectionPropertyIterator *iter); void *rna_iterator_listbase_get(struct CollectionPropertyIterator *iter); void rna_iterator_listbase_end(struct CollectionPropertyIterator *iter); +PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct ListBase *lb, int index); typedef struct ArrayIterator { char *ptr; @@ -311,6 +322,7 @@ void rna_iterator_array_next(struct CollectionPropertyIterator *iter); void *rna_iterator_array_get(struct CollectionPropertyIterator *iter); void *rna_iterator_array_dereference_get(struct CollectionPropertyIterator *iter); void rna_iterator_array_end(struct CollectionPropertyIterator *iter); +PointerRNA rna_array_lookup_int(PointerRNA *ptr, StructRNA *type, void *data, int itemsize, int length, int index); /* Duplicated code since we can't link in blenlib */ @@ -333,6 +345,7 @@ PointerRNA rna_pointer_inherit_refine(struct PointerRNA *ptr, struct StructRNA * int rna_parameter_size(struct PropertyRNA *parm); int rna_parameter_size_alloc(struct PropertyRNA *parm); + #endif /* RNA_INTERNAL_H */ diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c index b53218b2d50..7e9aebeffa4 100644 --- a/source/blender/makesrna/intern/rna_key.c +++ b/source/blender/makesrna/intern/rna_key.c @@ -24,8 +24,8 @@ #include +#include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -64,10 +64,10 @@ static Key *rna_ShapeKey_find_key(ID *id) void rna_ShapeKey_name_set(PointerRNA *ptr, const char *value) { KeyBlock *kb= ptr->data; - char oldname[32]; + char oldname[sizeof(kb->name)]; /* make a copy of the old name first */ - BLI_strncpy(oldname, kb->name, sizeof(oldname)); + BLI_strncpy(oldname, kb->name, sizeof(kb->name)); /* copy the new name into the name slot */ BLI_strncpy(kb->name, value, sizeof(kb->name)); @@ -75,7 +75,7 @@ void rna_ShapeKey_name_set(PointerRNA *ptr, const char *value) /* make sure the name is truly unique */ if (ptr->id.data) { Key *key= rna_ShapeKey_find_key(ptr->id.data); - BLI_uniquename(&key->block, kb, "Key", '.', offsetof(KeyBlock, name), 32); + BLI_uniquename(&key->block, kb, "Key", '.', offsetof(KeyBlock, name), sizeof(kb->name)); } /* fix all the animation data which may link to this */ @@ -97,30 +97,49 @@ static void rna_ShapeKey_value_range(PointerRNA *ptr, float *min, float *max) *max= data->slidermax; } -static PointerRNA rna_ShapeKey_relative_key_get(PointerRNA *ptr) +PointerRNA rna_object_shapekey_index_get(ID *id, int value) { - Key *key= rna_ShapeKey_find_key(ptr->id.data); - KeyBlock *kb= (KeyBlock*)ptr->data, *kbrel; + Key *key= rna_ShapeKey_find_key(id); + KeyBlock *kb= NULL; + PointerRNA ptr; int a; - if(key && kb->relative < key->totkey) - for(a=0, kbrel=key->block.first; kbrel; kbrel=kbrel->next, a++) - if(a == kb->relative) - return rna_pointer_inherit_refine(ptr, &RNA_ShapeKey, kbrel); + if(key && value < key->totkey) + for(a=0, kb=key->block.first; kb; kb=kb->next, a++) + if(a == value) + break; + + RNA_pointer_create(id, &RNA_ShapeKey, kb, &ptr); - return rna_pointer_inherit_refine(ptr, NULL, NULL); + return ptr; +} + +int rna_object_shapekey_index_set(ID *id, PointerRNA value, int current) +{ + Key *key= rna_ShapeKey_find_key(id); + KeyBlock *kb; + int a; + + if(key) + for(a=0, kb=key->block.first; kb; kb=kb->next, a++) + if(kb == value.data) + return a; + + return current; +} + +static PointerRNA rna_ShapeKey_relative_key_get(PointerRNA *ptr) +{ + KeyBlock *kb= (KeyBlock*)ptr->data; + + return rna_object_shapekey_index_get(ptr->id.data, kb->relative); } static void rna_ShapeKey_relative_key_set(PointerRNA *ptr, PointerRNA value) { - Key *key= rna_ShapeKey_find_key(ptr->id.data); - KeyBlock *kb= (KeyBlock*)ptr->data, *kbrel; - int a; + KeyBlock *kb= (KeyBlock*)ptr->data; - if(key) - for(a=0, kbrel=key->block.first; kbrel; kbrel=kbrel->next, a++) - if(kbrel == value.data) - kb->relative= a; + kb->relative= rna_object_shapekey_index_set(ptr->id.data, value, kb->relative); } static void rna_ShapeKeyPoint_co_get(PointerRNA *ptr, float *values) @@ -227,7 +246,7 @@ static void rna_ShapeKey_data_begin(CollectionPropertyIterator *iter, PointerRNA Nurb *nu; int tot= kb->totelem, size= key->elemsize; - if(GS(key->from->name) == ID_CU) { + if(GS(key->from->name) == ID_CU) { cu= (Curve*)key->from; nu= cu->nurb.first; @@ -248,7 +267,7 @@ static int rna_ShapeKey_data_length(PointerRNA *ptr) Nurb *nu; int tot= kb->totelem; - if(GS(key->from->name) == ID_CU) { + if(GS(key->from->name) == ID_CU) { cu= (Curve*)key->from; nu= cu->nurb.first; diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c index 5b9913ad311..769d73d9f79 100644 --- a/source/blender/makesrna/intern/rna_lamp.c +++ b/source/blender/makesrna/intern/rna_lamp.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -263,7 +262,7 @@ static void rna_def_lamp_sky_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Sun Size", "Sun size"); RNA_def_property_update(prop, 0, "rna_Lamp_sky_update"); - prop= RNA_def_property(srna, "backscattered_light", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "backscattered_light", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -1.0f, 1.0f); RNA_def_property_ui_text(prop, "Backscattered Light", "Backscattered light"); RNA_def_property_update(prop, 0, "rna_Lamp_sky_update"); @@ -276,6 +275,7 @@ static void rna_def_lamp_sky_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "atmosphere_turbidity", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "atm_turbidity"); RNA_def_property_range(prop, 1.0f, 30.0f); + RNA_def_property_ui_range(prop, 2.0f, 10.0f, 1, 2); RNA_def_property_ui_text(prop, "Atmosphere Turbidity", "Sky turbidity"); RNA_def_property_update(prop, 0, "rna_Lamp_sky_update"); @@ -420,13 +420,13 @@ static void rna_def_lamp_falloff(StructRNA *srna) prop= RNA_def_property(srna, "linear_attenuation", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "att1"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Linear Attenuation", "Linear distance attentuation"); + RNA_def_property_ui_text(prop, "Linear Attenuation", "Linear distance attenuation"); RNA_def_property_update(prop, 0, "rna_Lamp_draw_update"); prop= RNA_def_property(srna, "quadratic_attenuation", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "att2"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Quadratic Attenuation", "Quadratic distance attentuation"); + RNA_def_property_ui_text(prop, "Quadratic Attenuation", "Quadratic distance attenuation"); RNA_def_property_update(prop, 0, "rna_Lamp_draw_update"); } diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c index b017bc830c9..c5132844016 100644 --- a/source/blender/makesrna/intern/rna_lattice.c +++ b/source/blender/makesrna/intern/rna_lattice.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -42,6 +41,7 @@ #include "BKE_depsgraph.h" #include "BKE_lattice.h" #include "BKE_main.h" +#include "BKE_deform.h" #include "WM_api.h" #include "WM_types.h" @@ -158,6 +158,16 @@ static void rna_Lattice_points_w_set(PointerRNA *ptr, int value) ((Lattice*)ptr->data)->opntsw= CLAMPIS(value, 1, 64); } +static void rna_Lattice_vg_name_set(PointerRNA *ptr, const char *value) +{ + Lattice *lt= ptr->data; + strcpy(lt->vgroup, value); + + if(lt->editlatt) + strcpy(lt->editlatt->vgroup, value); +} + + #else static void rna_def_latticepoint(BlenderRNA *brna) @@ -246,6 +256,12 @@ static void rna_def_lattice(BlenderRNA *brna) RNA_def_property_boolean_funcs(prop, NULL, "rna_Lattice_outside_set"); RNA_def_property_ui_text(prop, "Outside", "Only draw, and take into account, the outer vertices"); RNA_def_property_update(prop, 0, "rna_Lattice_update_data"); + + prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "vgroup"); + RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group to apply the influence of the lattice"); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Lattice_vg_name_set"); + RNA_def_property_update(prop, 0, "rna_Lattice_update_data"); prop= RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "key"); diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c index 31183cf08b6..052c9fb3453 100644 --- a/source/blender/makesrna/intern/rna_main.c +++ b/source/blender/makesrna/intern/rna_main.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -34,23 +33,42 @@ #include "BKE_main.h" #include "BKE_mesh.h" +#include "BKE_global.h" /* all the list begin functions are added manually here, Main is not in SDNA */ +static int rna_Main_debug_get(PointerRNA *ptr) +{ + return G.f & G_DEBUG; +} -static void rna_Main_filename_get(PointerRNA *ptr, char *value) + +static void rna_Main_debug_set(PointerRNA *ptr, const int value) +{ + if (value) + G.f |= G_DEBUG; + else + G.f &= ~G_DEBUG; +} + +static int rna_Main_fileissaved_get(PointerRNA *ptr) +{ + return G.relbase_valid; +} + +static void rna_Main_filepath_get(PointerRNA *ptr, char *value) { Main *bmain= (Main*)ptr->data; BLI_strncpy(value, bmain->name, sizeof(bmain->name)); } -static int rna_Main_filename_length(PointerRNA *ptr) +static int rna_Main_filepath_length(PointerRNA *ptr) { Main *bmain= (Main*)ptr->data; return strlen(bmain->name); } #if 0 -static void rna_Main_filename_set(PointerRNA *ptr, const char *value) +static void rna_Main_filepath_set(PointerRNA *ptr, const char *value) { Main *bmain= (Main*)ptr->data; BLI_strncpy(bmain->name, value, sizeof(bmain->name)); @@ -155,7 +173,7 @@ static void rna_Main_script_begin(CollectionPropertyIterator *iter, PointerRNA * rna_iterator_listbase_begin(iter, &bmain->script, NULL); } -static void rna_Main_vfont_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +static void rna_Main_font_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) { Main *bmain= (Main*)ptr->data; rna_iterator_listbase_begin(iter, &bmain->vfont, NULL); @@ -239,12 +257,12 @@ static PointerRNA rna_Test_test_get(PointerRNA *ptr) typedef void (CollectionDefFunc)(struct BlenderRNA *brna, struct PropertyRNA *cprop); typedef struct MainCollectionDef { - const char *identifier; - const char *type; - const char *iter_begin; - const char *name; - const char *description; - CollectionDefFunc *func; + const char *identifier; + const char *type; + const char *iter_begin; + const char *name; + const char *description; + CollectionDefFunc *func; } MainCollectionDef; void RNA_def_main(BlenderRNA *brna) @@ -253,6 +271,7 @@ void RNA_def_main(BlenderRNA *brna) PropertyRNA *prop; CollectionDefFunc *func; + /* plural must match idtypes in readblenentry.c */ MainCollectionDef lists[]= { {"cameras", "Camera", "rna_Main_camera_begin", "Cameras", "Camera datablocks.", RNA_def_main_cameras}, {"scenes", "Scene", "rna_Main_scene_begin", "Scenes", "Scene datablocks.", RNA_def_main_scenes}, @@ -268,7 +287,7 @@ void RNA_def_main(BlenderRNA *brna) {"lattices", "Lattice", "rna_Main_latt_begin", "Lattices", "Lattice datablocks.", RNA_def_main_lattices}, {"curves", "Curve", "rna_Main_curve_begin", "Curves", "Curve datablocks.", RNA_def_main_curves} , {"metaballs", "MetaBall", "rna_Main_mball_begin", "Metaballs", "Metaball datablocks.", RNA_def_main_metaballs}, - {"vfonts", "VectorFont", "rna_Main_vfont_begin", "Vector Fonts", "Vector font datablocks.", RNA_def_main_vfonts}, + {"fonts", "VectorFont", "rna_Main_font_begin", "Vector Fonts", "Vector font datablocks.", RNA_def_main_fonts}, {"textures", "Texture", "rna_Main_tex_begin", "Textures", "Texture datablocks.", RNA_def_main_textures}, {"brushes", "Brush", "rna_Main_brush_begin", "Brushes", "Brush datablocks.", RNA_def_main_brushes}, {"worlds", "World", "rna_Main_world_begin", "Worlds", "World datablocks.", RNA_def_main_worlds}, @@ -289,11 +308,21 @@ void RNA_def_main(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Main", "Main data structure representing a .blend file and all its datablocks"); RNA_def_struct_ui_icon(srna, ICON_BLENDER); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_maxlength(prop, 240); - RNA_def_property_string_funcs(prop, "rna_Main_filename_get", "rna_Main_filename_length", "rna_Main_filename_set"); + RNA_def_property_string_funcs(prop, "rna_Main_filepath_get", "rna_Main_filepath_length", "rna_Main_filepath_set"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Filename", "Path to the .blend file"); + + prop= RNA_def_property(srna, "file_is_saved", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_boolean_funcs(prop, "rna_Main_fileissaved_get", NULL); + RNA_def_property_ui_text(prop, "File is Saved", "Has the current session been saved to disk as a .blend file"); + + prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_funcs(prop, "rna_Main_debug_get", "rna_Main_debug_set"); + RNA_def_property_ui_text(prop, "Debug", "Print debugging information in console"); + for(i=0; lists[i].name; i++) { diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index 8db070597fc..c850afc22ae 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -28,10 +28,10 @@ #include #include +#include #include "RNA_define.h" #include "RNA_access.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "BKE_utildefines.h" @@ -51,9 +51,17 @@ #include "BKE_text.h" #include "BKE_action.h" #include "BKE_group.h" +#include "BKE_brush.h" +#include "BKE_lattice.h" +#include "BKE_mball.h" +#include "BKE_world.h" +#include "BKE_particle.h" +#include "BKE_font.h" +#include "BKE_node.h" #include "DNA_armature_types.h" #include "DNA_camera_types.h" +#include "DNA_curve_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" @@ -61,6 +69,13 @@ #include "DNA_text_types.h" #include "DNA_texture_types.h" #include "DNA_group_types.h" +#include "DNA_brush_types.h" +#include "DNA_lattice_types.h" +#include "DNA_meta_types.h" +#include "DNA_world_types.h" +#include "DNA_particle_types.h" +#include "DNA_vfont_types.h" +#include "DNA_node_types.h" #include "ED_screen.h" @@ -69,11 +84,6 @@ Tex *rna_Main_add_texture(Main *bmain, char *name) return add_texture(name); } -Image *rna_Main_add_image(Main *bmain, char *filename) -{ - return BKE_add_image_file(filename, 0); -} - Camera *rna_Main_cameras_new(Main *bmain, char* name) { return add_camera(name); @@ -156,6 +166,8 @@ Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *d ob->id.us--; ob->data= data; + test_object_materials(ob->data); + return ob; } @@ -193,6 +205,23 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material /* XXX python now has invalid pointer? */ } +// XXX, commended for now, need to see how this can be used with node groups. +struct bNodeTree *rna_Main_nodetree_new(Main *bmain, int type) +{ + bNodeTree *tree = ntreeAddTree(type); + tree->id.us--; + return tree; +} +void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, struct bNodeTree *tree) +{ + if(ID_REAL_USERS(tree) <= 0) + free_libblock(&bmain->nodetree, tree); + else + BKE_reportf(reports, RPT_ERROR, "Node Tree \"%s\" must have zero users to be removed, found %d.", tree->id.name+2, ID_REAL_USERS(tree)); + + /* XXX python now has invalid pointer? */ +} + Mesh *rna_Main_meshes_new(Main *bmain, char* name) { Mesh *me= add_mesh(name); @@ -225,6 +254,100 @@ void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp) /* XXX python now has invalid pointer? */ } +Image *rna_Main_images_new(Main *bmain, char* name, int width, int height, int alpha, int float_buffer) +{ + float color[4]= {0.0, 0.0, 0.0, 1.0}; + Image *image= BKE_add_image_size(width, height, name, alpha ? 32:24, float_buffer, 0, color); + image->id.us--; + return image; +} +Image *rna_Main_images_load(Main *bmain, ReportList *reports, char *filepath) +{ + Image *ima; + + errno= 0; + ima= BKE_add_image_file(filepath, 0); + + if(!ima) + BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unsupported image format"); + + return ima; +} +void rna_Main_images_remove(Main *bmain, ReportList *reports, Image *image) +{ + if(ID_REAL_USERS(image) <= 0) + free_libblock(&bmain->image, image); + else + BKE_reportf(reports, RPT_ERROR, "Image \"%s\" must have zero users to be removed, found %d.", image->id.name+2, ID_REAL_USERS(image)); + + /* XXX python now has invalid pointer? */ +} + +Lattice *rna_Main_lattices_new(Main *bmain, char* name) +{ + Lattice *lt= add_lattice(name); + lt->id.us--; + return lt; +} +void rna_Main_lattices_remove(Main *bmain, ReportList *reports, struct Lattice *lt) +{ + if(ID_REAL_USERS(lt) <= 0) + free_libblock(&bmain->latt, lt); + else + BKE_reportf(reports, RPT_ERROR, "Lattice \"%s\" must have zero users to be removed, found %d.", lt->id.name+2, ID_REAL_USERS(lt)); +} + +Curve *rna_Main_curves_new(Main *bmain, char* name, int type) +{ + Curve *cu= add_curve(name, type); + cu->id.us--; + return cu; +} +void rna_Main_curves_remove(Main *bmain, ReportList *reports, struct Curve *cu) +{ + if(ID_REAL_USERS(cu) <= 0) + free_libblock(&bmain->curve, cu); + else + BKE_reportf(reports, RPT_ERROR, "Curve \"%s\" must have zero users to be removed, found %d.", cu->id.name+2, ID_REAL_USERS(cu)); +} + +MetaBall *rna_Main_metaballs_new(Main *bmain, char* name) +{ + MetaBall *mb= add_mball(name); + mb->id.us--; + return mb; +} +void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, struct MetaBall *mb) +{ + if(ID_REAL_USERS(mb) <= 0) + free_libblock(&bmain->mball, mb); + else + BKE_reportf(reports, RPT_ERROR, "MetaBall \"%s\" must have zero users to be removed, found %d.", mb->id.name+2, ID_REAL_USERS(mb)); +} + +VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, char *filepath) +{ + VFont *font; + + errno= 0; + font= load_vfont(filepath); + + if(!font) + BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unsupported font format"); + + return font; + +} +void rna_Main_fonts_remove(Main *bmain, ReportList *reports, VFont *vfont) +{ + if(ID_REAL_USERS(vfont) <= 0) + free_libblock(&bmain->vfont, vfont); + else + BKE_reportf(reports, RPT_ERROR, "Font \"%s\" must have zero users to be removed, found %d.", vfont->id.name+2, ID_REAL_USERS(vfont)); + + /* XXX python now has invalid pointer? */ +} + Tex *rna_Main_textures_new(Main *bmain, char* name) { Tex *tex= add_texture(name); @@ -239,6 +362,34 @@ void rna_Main_textures_remove(Main *bmain, ReportList *reports, struct Tex *tex) BKE_reportf(reports, RPT_ERROR, "Texture \"%s\" must have zero users to be removed, found %d.", tex->id.name+2, ID_REAL_USERS(tex)); } +Brush *rna_Main_brushes_new(Main *bmain, char* name) +{ + Brush *brush = add_brush(name); + brush->id.us--; + return brush; +} +void rna_Main_brushes_remove(Main *bmain, ReportList *reports, struct Brush *brush) +{ + if(ID_REAL_USERS(brush) <= 0) + free_libblock(&bmain->brush, brush); + else + BKE_reportf(reports, RPT_ERROR, "Brush \"%s\" must have zero users to be removed, found %d.", brush->id.name+2, ID_REAL_USERS(brush)); +} + +World *rna_Main_worlds_new(Main *bmain, char* name) +{ + World *world = add_world(name); + world->id.us--; + return world; +} +void rna_Main_worlds_remove(Main *bmain, ReportList *reports, struct World *world) +{ + if(ID_REAL_USERS(world) <= 0) + free_libblock(&bmain->world, world); + else + BKE_reportf(reports, RPT_ERROR, "World \"%s\" must have zero users to be removed, found %d.", world->id.name+2, ID_REAL_USERS(world)); +} + Group *rna_Main_groups_new(Main *bmain, char* name) { return add_group(name); @@ -246,7 +397,6 @@ Group *rna_Main_groups_new(Main *bmain, char* name) void rna_Main_groups_remove(Main *bmain, ReportList *reports, Group *group) { unlink_group(group); - group->id.us= 0; free_libblock(&bmain->group, group); /* XXX python now has invalid pointer? */ } @@ -261,11 +411,16 @@ void rna_Main_texts_remove(Main *bmain, ReportList *reports, Text *text) free_libblock(&bmain->text, text); /* XXX python now has invalid pointer? */ } -Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* path) + +Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* filepath) { - Text *txt= add_text(path, bmain->name); - if(txt==NULL) - BKE_reportf(reports, RPT_ERROR, "Couldn't load text from path \"%s\".", path); + Text *txt; + + errno= 0; + txt= add_text(filepath, bmain->name); + + if(!txt) + BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unable to load text"); return txt; } @@ -303,19 +458,40 @@ void rna_Main_actions_remove(Main *bmain, ReportList *reports, bAction *act) /* XXX python now has invalid pointer? */ } +ParticleSettings *rna_Main_particles_new(Main *bmain, char* name) +{ + ParticleSettings *part = psys_new_settings(name, bmain); + part->id.us--; + return part; +} +void rna_Main_particles_remove(Main *bmain, ReportList *reports, ParticleSettings *part) +{ + if(ID_REAL_USERS(part) <= 0) + free_libblock(&bmain->particle, part); + else + BKE_reportf(reports, RPT_ERROR, "Particle Settings \"%s\" must have zero users to be removed, found %d.", part->id.name+2, ID_REAL_USERS(part)); + + /* XXX python now has invalid pointer? */ +} + #else void RNA_api_main(StructRNA *srna) { + /* FunctionRNA *func; PropertyRNA *parm; - + */ + /* maybe we want to add functions in 'bpy.data' still? + * for now they are all in collections bpy.data.images.new(...) */ + /* func= RNA_def_function(srna, "add_image", "rna_Main_add_image"); RNA_def_function_ui_description(func, "Add a new image."); - parm= RNA_def_string(func, "filename", "", 0, "", "Filename to load image from."); + parm= RNA_def_string(func, "filepath", "", 0, "", "File path to load image from."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_pointer(func, "image", "Image", "", "New image."); RNA_def_function_return(func, parm); + */ } @@ -425,7 +601,35 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop) } void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; +// FunctionRNA *func; +// PropertyRNA *parm; +/* static EnumPropertyItem node_nodetree_items[] = { + {0, "SHADER", 0, "Shader", ""}, + {1, "COMPOSITE", 0, "Composite", ""}, + {2, "TEXTURE", 0, "Texture", ""}, + {0, NULL, 0, NULL, NULL}}; */ + + RNA_def_property_srna(cprop, "MainNodeTrees"); + srna= RNA_def_struct(brna, "MainNodeTrees", NULL); + RNA_def_struct_ui_text(srna, "Main Node Trees", "Collection of node trees"); + +#if 0 // need to see some examples of using these functions before enabling. + func= RNA_def_function(srna, "new", "rna_Main_nodetree_new"); + RNA_def_function_ui_description(func, "Add a new node tree to the main database"); + parm= RNA_def_enum(func, "type", node_nodetree_items, 0, "Type", "The type of curve object to add"); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "tree", "NodeTree", "", "New node tree datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_nodetree_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a node tree from the current blendfile."); + parm= RNA_def_pointer(func, "tree", "NodeTree", "", "Node tree to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); +#endif } void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop) { @@ -485,27 +689,144 @@ void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop) } void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop) { - + } void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainImages"); + srna= RNA_def_struct(brna, "MainImages", NULL); + RNA_def_struct_ui_text(srna, "Main Images", "Collection of images"); + + func= RNA_def_function(srna, "new", "rna_Main_images_new"); + RNA_def_function_ui_description(func, "Add a new image to the main database"); + parm= RNA_def_string(func, "name", "Image", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_int(func, "width", 1024, 1, INT_MAX, "", "Width of the image.", 0, INT_MAX); + parm= RNA_def_int(func, "height", 1024, 1, INT_MAX, "", "Height of the image.", 0, INT_MAX); + parm= RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel"); + parm= RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color"); + /* return type */ + parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "load", "rna_Main_images_load"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Load a new image into the main database"); + parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the file to load."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_images_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove an image from the current blendfile."); + parm= RNA_def_pointer(func, "image", "Image", "", "Image to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } + void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainLattices"); + srna= RNA_def_struct(brna, "MainLattices", NULL); + RNA_def_struct_ui_text(srna, "Main Lattices", "Collection of lattices"); + + func= RNA_def_function(srna, "new", "rna_Main_lattices_new"); + RNA_def_function_ui_description(func, "Add a new lattice to the main database"); + parm= RNA_def_string(func, "name", "Lattice", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "lattice", "Lattice", "", "New lattices datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_lattices_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a lattice from the current blendfile."); + parm= RNA_def_pointer(func, "lattice", "Lattice", "", "Lattice to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainCurves"); + srna= RNA_def_struct(brna, "MainCurves", NULL); + RNA_def_struct_ui_text(srna, "Main Curves", "Collection of curves"); + + func= RNA_def_function(srna, "new", "rna_Main_curves_new"); + RNA_def_function_ui_description(func, "Add a new curve to the main database"); + parm= RNA_def_string(func, "name", "Curve", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_enum(func, "type", object_type_curve_items, 0, "Type", "The type of curve object to add"); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "curve", "Curve", "", "New curve datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_curves_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a curve from the current blendfile."); + parm= RNA_def_pointer(func, "curve", "Curve", "", "Curve to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainMetaBalls"); + srna= RNA_def_struct(brna, "MainMetaBalls", NULL); + RNA_def_struct_ui_text(srna, "Main MetaBall", "Collection of metaballs"); + + func= RNA_def_function(srna, "new", "rna_Main_metaballs_new"); + RNA_def_function_ui_description(func, "Add a new metaball to the main database"); + parm= RNA_def_string(func, "name", "MetaBall", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "metaball", "MetaBall", "", "New metaball datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_metaballs_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a metaball from the current blendfile."); + parm= RNA_def_pointer(func, "metaball", "MetaBall", "", "MetaBall to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } -void RNA_def_main_vfonts(BlenderRNA *brna, PropertyRNA *cprop) +void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainFonts"); + srna= RNA_def_struct(brna, "MainFonts", NULL); + RNA_def_struct_ui_text(srna, "Main Fonts", "Collection of fonts"); + + func= RNA_def_function(srna, "load", "rna_Main_fonts_load"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Load a new font into the main database"); + parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the font to load."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "New font datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_fonts_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a font from the current blendfile."); + parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "Font to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop) { @@ -533,12 +854,54 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop) } void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainBrushes"); + srna= RNA_def_struct(brna, "MainBrushes", NULL); + RNA_def_struct_ui_text(srna, "Main Brushes", "Collection of brushes"); + + func= RNA_def_function(srna, "new", "rna_Main_brushes_new"); + RNA_def_function_ui_description(func, "Add a new brush to the main database"); + parm= RNA_def_string(func, "name", "Brush", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "brush", "Brush", "", "New brush datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_brushes_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a brush from the current blendfile."); + parm= RNA_def_pointer(func, "brush", "Brush", "", "Brush to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } + void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainWorlds"); + srna= RNA_def_struct(brna, "MainWorlds", NULL); + RNA_def_struct_ui_text(srna, "Main Worlds", "Collection of worlds"); + + func= RNA_def_function(srna, "new", "rna_Main_worlds_new"); + RNA_def_function_ui_description(func, "Add a new world to the main database"); + parm= RNA_def_string(func, "name", "World", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "world", "World", "", "New world datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_worlds_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a world from the current blendfile."); + parm= RNA_def_pointer(func, "world", "World", "", "World to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } + void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop) { StructRNA *srna; @@ -591,7 +954,7 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop) func= RNA_def_function(srna, "load", "rna_Main_texts_load"); RNA_def_function_flag(func, FUNC_USE_REPORTS); RNA_def_function_ui_description(func, "Add a new text to the main database from a file"); - parm= RNA_def_string(func, "path", "Path", FILE_MAXDIR + FILE_MAXFILE, "", "path for the datablock."); + parm= RNA_def_string(func, "filepath", "Path", FILE_MAXDIR + FILE_MAXFILE, "", "path for the datablock."); RNA_def_property_flag(parm, PROP_REQUIRED); /* return type */ parm= RNA_def_pointer(func, "text", "Text", "", "New text datablock."); @@ -651,7 +1014,27 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop) } void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop) { + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + RNA_def_property_srna(cprop, "MainParticles"); + srna= RNA_def_struct(brna, "MainParticles", NULL); + RNA_def_struct_ui_text(srna, "Main Particle Settings", "Collection of particle settings"); + + func= RNA_def_function(srna, "new", "rna_Main_particles_new"); + RNA_def_function_ui_description(func, "Add a new particle settings instance to the main database"); + parm= RNA_def_string(func, "name", "ParticleSettings", 0, "", "New name for the datablock."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return type */ + parm= RNA_def_pointer(func, "particle", "ParticleSettings", "", "New particle settings datablock."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "remove", "rna_Main_particles_remove"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove a particle settings instance from the current blendfile."); + parm= RNA_def_pointer(func, "particle", "ParticleSettings", "", "Particle Settings to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED); } void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop) { diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 361aec5260c..1c790898ef2 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -648,8 +647,8 @@ static void rna_def_material_colors(StructRNA *srna) {MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""}, {MA_RAMP_VAL, "VALUE", 0, "Value", ""}, {MA_RAMP_COLOR, "COLOR", 0, "Color", ""}, - {MA_RAMP_SOFT, "SOFT LIGHT", 0, "Soft Light", ""}, - {MA_RAMP_LINEAR, "LINEAR LIGHT", 0, "Linear Light", ""}, + {MA_RAMP_SOFT, "SOFT LIGHT", 0, "Soft Light", ""}, + {MA_RAMP_LINEAR, "LINEAR LIGHT", 0, "Linear Light", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem prop_ramp_input_items[] = { @@ -800,7 +799,7 @@ static void rna_def_material_diffuse(StructRNA *srna) prop= RNA_def_property(srna, "diffuse_fresnel_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "param[0]"); RNA_def_property_range(prop, 0.0f, 5.0f); - RNA_def_property_ui_text(prop, "Diffuse Fresnel Factor", "Blending factor of Frensel"); + RNA_def_property_ui_text(prop, "Diffuse Fresnel Factor", "Blending factor of Fresnel"); RNA_def_property_update(prop, 0, "rna_Material_update"); prop= RNA_def_property(srna, "darkness", PROP_FLOAT, PROP_NONE); @@ -871,7 +870,7 @@ static void rna_def_material_raymirror(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped"); RNA_def_property_update(prop, 0, "rna_Material_update"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "ray_depth"); RNA_def_property_range(prop, 0, 10); RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-reflections"); @@ -936,7 +935,7 @@ static void rna_def_material_raytra(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped"); RNA_def_property_update(prop, 0, "rna_Material_update"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "ray_depth_tra"); RNA_def_property_range(prop, 0, 10); RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-refractions"); @@ -1353,7 +1352,7 @@ static void rna_def_material_specularity(StructRNA *srna) prop= RNA_def_property(srna, "specular_toon_smooth", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "param[3]"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Specular Toon Smooth", "Ssmoothness of specular toon area"); + RNA_def_property_ui_text(prop, "Specular Toon Smooth", "Smoothness of specular toon area"); RNA_def_property_update(prop, 0, "rna_Material_update"); prop= RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_NONE); @@ -1449,7 +1448,7 @@ static void rna_def_material_physics(BlenderRNA *brna) prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "friction"); RNA_def_property_range(prop, 0, 100); - RNA_def_property_ui_text(prop, "Friction", "Coulomb friction coeffecient, when inside the physics distance area"); + RNA_def_property_ui_text(prop, "Friction", "Coulomb friction coefficient, when inside the physics distance area"); prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "fh"); @@ -1487,6 +1486,16 @@ void RNA_def_material(BlenderRNA *brna) {MA_ZTRANSP, "Z_TRANSPARENCY", 0, "Z Transparency", "Use alpha buffer for transparent faces"}, {MA_RAYTRANSP, "RAYTRACE", 0, "Raytrace", "Use raytracing for transparent refraction rendering"}, {0, NULL, 0, NULL, NULL}}; + + /* Render Preview Types */ + static EnumPropertyItem preview_type_items[] = { + {MA_FLAT, "FLAT", ICON_MATPLANE, "Flat", "Preview type: Flat XY plane"}, + {MA_SPHERE, "SPHERE", ICON_MATSPHERE, "Sphere", "Preview type: Sphere"}, + {MA_CUBE, "CUBE", ICON_MATCUBE, "Flat", "Preview type: Cube"}, + {MA_MONKEY, "MONKEY", ICON_MONKEY, "Flat", "Preview type: Monkey"}, + {MA_HAIR, "HAIR", ICON_HAIR, "Flat", "Preview type: Hair strands"}, + {MA_SPHERE_A, "SPHERE_A", ICON_MAT_SPHERE_SKY, "Flat", "Preview type: Large sphere with sky"}, + {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "Material", "ID"); RNA_def_struct_ui_text(srna, "Material", "Material datablock to defined the appearance of geometric objects for rendering"); @@ -1510,6 +1519,13 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Transparency Method", "Method to use for rendering transparency"); RNA_def_property_update(prop, 0, "rna_Material_update"); + /* For Preview Render */ + prop= RNA_def_property(srna, "preview_render_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "pr_type"); + RNA_def_property_enum_items(prop, preview_type_items); + RNA_def_property_ui_text(prop, "Preview render type", "Type of preview render"); + RNA_def_property_update(prop, 0, "rna_Material_update"); + prop= RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "amb"); RNA_def_property_range(prop, 0, 1); diff --git a/source/blender/makesrna/intern/rna_material_api.c b/source/blender/makesrna/intern/rna_material_api.c index 8511df208cf..03eba157bf3 100644 --- a/source/blender/makesrna/intern/rna_material_api.c +++ b/source/blender/makesrna/intern/rna_material_api.c @@ -30,7 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "DNA_material_types.h" diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c index f0f899f5433..2e7d8e3993a 100644 --- a/source/blender/makesrna/intern/rna_mesh_api.c +++ b/source/blender/makesrna/intern/rna_mesh_api.c @@ -30,7 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "BLO_sys_types.h" diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c index 004e5fe0c6f..7481759f67e 100644 --- a/source/blender/makesrna/intern/rna_meta.c +++ b/source/blender/makesrna/intern/rna_meta.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -34,6 +33,8 @@ #ifdef RNA_RUNTIME +#include "BLI_math.h" + #include "DNA_scene_types.h" #include "DNA_object_types.h" @@ -47,9 +48,42 @@ static int rna_Meta_texspace_editable(PointerRNA *ptr) { MetaBall *mb= (MetaBall*)ptr->data; - return (mb->texflag & AUTOSPACE)? 0: PROP_EDITABLE; + return (mb->texflag & MB_AUTOSPACE)? 0: PROP_EDITABLE; } +static void rna_Meta_texspace_loc_get(PointerRNA *ptr, float *values) +{ + MetaBall *mb= (MetaBall*)ptr->data; + + /* tex_space_mball() needs object.. ugh */ + + copy_v3_v3(values, mb->loc); +} + +static void rna_Meta_texspace_loc_set(PointerRNA *ptr, const float *values) +{ + MetaBall *mb= (MetaBall*)ptr->data; + + copy_v3_v3(mb->loc, values); +} + +static void rna_Meta_texspace_size_get(PointerRNA *ptr, float *values) +{ + MetaBall *mb= (MetaBall*)ptr->data; + + /* tex_space_mball() needs object.. ugh */ + + copy_v3_v3(values, mb->size); +} + +static void rna_Meta_texspace_size_set(PointerRNA *ptr, const float *values) +{ + MetaBall *mb= (MetaBall*)ptr->data; + + copy_v3_v3(mb->size, values); +} + + static void rna_MetaBall_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) { MetaBall *mb= ptr->id.data; @@ -191,8 +225,37 @@ static void rna_def_metaball(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Threshold", "Influence of meta elements"); RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); - /* materials, textures */ - rna_def_texmat_common(srna, "rna_Meta_texspace_editable"); + /* texture space */ + prop= RNA_def_property(srna, "auto_texspace", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "texflag", MB_AUTOSPACE); + RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object"); + + prop= RNA_def_property(srna, "texspace_loc", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location"); + RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable"); + RNA_def_property_float_funcs(prop, "rna_Meta_texspace_loc_get", "rna_Meta_texspace_loc_set", NULL); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); + + prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size"); + RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable"); + RNA_def_property_float_funcs(prop, "rna_Meta_texspace_size_get", "rna_Meta_texspace_size_set", NULL); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); + + /* not supported yet + prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER); + RNA_def_property_float(prop, NULL, "rot"); + RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation"); + RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable"); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");*/ + + /* materials */ + prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol"); + RNA_def_property_struct_type(prop, "Material"); + RNA_def_property_ui_text(prop, "Materials", ""); /* anim */ rna_def_animdata_common(srna); diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index f8a85dbaeaf..d2c82b23799 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -27,7 +27,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -37,8 +36,11 @@ #include "DNA_object_force.h" #include "DNA_scene_types.h" +#include "BLI_math.h" + #include "BKE_animsys.h" #include "BKE_bmesh.h" /* For BevelModifierData */ +#include "BKE_multires.h" #include "BKE_smoke.h" /* For smokeModifier_free & smokeModifier_createType */ #include "WM_api.h" @@ -55,6 +57,7 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""}, {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""}, {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""}, + {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""}, {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, @@ -164,6 +167,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_SmokeModifier; case eModifierType_Solidify: return &RNA_SolidifyModifier; + case eModifierType_Screw: + return &RNA_ScrewModifier; default: return &RNA_Modifier; } @@ -172,10 +177,10 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) void rna_Modifier_name_set(PointerRNA *ptr, const char *value) { ModifierData *md= ptr->data; - char oldname[32]; + char oldname[sizeof(md->name)]; /* make a copy of the old name first */ - BLI_strncpy(oldname, md->name, sizeof(oldname)); + BLI_strncpy(oldname, md->name, sizeof(md->name)); /* copy the new name into the name slot */ BLI_strncpy(md->name, value, sizeof(md->name)); @@ -204,7 +209,7 @@ static void rna_Modifier_update(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_Modifier_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr) { rna_Modifier_update(bmain, scene, ptr); - DAG_scene_sort(scene); + DAG_scene_sort(scene); } static void rna_Smoke_set_type(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -365,7 +370,7 @@ static int rna_MultiresModifier_external_get(PointerRNA *ptr) return CustomData_external_test(&me->fdata, CD_MDISPS); } -static void rna_MultiresModifier_filename_get(PointerRNA *ptr, char *value) +static void rna_MultiresModifier_filepath_get(PointerRNA *ptr, char *value) { Object *ob= (Object*)ptr->id.data; CustomDataExternal *external= ((Mesh*)ob->data)->fdata.external; @@ -373,16 +378,18 @@ static void rna_MultiresModifier_filename_get(PointerRNA *ptr, char *value) BLI_strncpy(value, (external)? external->filename: "", sizeof(external->filename)); } -static void rna_MultiresModifier_filename_set(PointerRNA *ptr, const char *value) +static void rna_MultiresModifier_filepath_set(PointerRNA *ptr, const char *value) { Object *ob= (Object*)ptr->id.data; CustomDataExternal *external= ((Mesh*)ob->data)->fdata.external; - if(external) + if(external && strcmp(external->filename, value)) { BLI_strncpy(external->filename, value, sizeof(external->filename)); + multires_force_external_reload(ob); + } } -static int rna_MultiresModifier_filename_length(PointerRNA *ptr) +static int rna_MultiresModifier_filepath_length(PointerRNA *ptr) { Object *ob= (Object*)ptr->id.data; CustomDataExternal *external= ((Mesh*)ob->data)->fdata.external; @@ -395,7 +402,7 @@ static void modifier_object_set(Object *self, Object **ob_p, int type, PointerRN Object *ob= value.data; if(!self || ob != self) - if(!ob || ob->type == type) + if(!ob || type == OB_EMPTY || ob->type == type) *ob_p= ob; } @@ -416,7 +423,7 @@ static void rna_CurveModifier_object_set(PointerRNA *ptr, PointerRNA value) static void rna_CastModifier_object_set(PointerRNA *ptr, PointerRNA value) { - modifier_object_set(ptr->id.data, &((CastModifierData*)ptr->data)->object, OB_MESH, value); + modifier_object_set(ptr->id.data, &((CastModifierData*)ptr->data)->object, OB_EMPTY, value); } static void rna_ArmatureModifier_object_set(PointerRNA *ptr, PointerRNA value) @@ -461,7 +468,7 @@ static void rna_ArrayModifier_curve_set(PointerRNA *ptr, PointerRNA value) static int rna_MeshDeformModifier_is_bound_get(PointerRNA *ptr) { - return (((MeshDeformModifierData*)ptr->data)->bindcos != NULL); + return (((MeshDeformModifierData*)ptr->data)->bindcagecos != NULL); } static PointerRNA rna_SoftBodyModifier_settings_get(PointerRNA *ptr) @@ -492,7 +499,7 @@ static void rna_UVProjector_object_set(PointerRNA *ptr, PointerRNA value) { Object **ob= (Object**)ptr->data; - if(*ob) + if(*ob) id_us_min((ID*)*ob); if(value.data) id_us_plus((ID*)value.data); @@ -599,9 +606,9 @@ static void rna_def_modifier_multires(BlenderRNA *brna) RNA_def_property_boolean_funcs(prop, "rna_MultiresModifier_external_get", NULL); RNA_def_property_ui_text(prop, "External", "Store multires displacements outside the .blend file, to save memory"); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); - RNA_def_property_string_funcs(prop, "rna_MultiresModifier_filename_get", "rna_MultiresModifier_filename_length", "rna_MultiresModifier_filename_set"); - RNA_def_property_ui_text(prop, "Filename", "Path to external displacements file"); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); + RNA_def_property_string_funcs(prop, "rna_MultiresModifier_filepath_get", "rna_MultiresModifier_filepath_length", "rna_MultiresModifier_filepath_set"); + RNA_def_property_ui_text(prop, "File Path", "Path to external displacements file"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "optimal_display", PROP_BOOLEAN, PROP_NONE); @@ -681,7 +688,8 @@ static void rna_def_modifier_build(BlenderRNA *brna) RNA_def_struct_sdna(srna, "BuildModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_BUILD); - prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_TIME); + RNA_def_property_float_sdna(prop, NULL, "start"); RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF); RNA_def_property_ui_text(prop, "Start", "Specify the start frame of the effect"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -816,7 +824,7 @@ static void rna_def_modifier_wave(BlenderRNA *brna) prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM); - RNA_def_property_ui_text(prop, "Normals", "Dispace along normals"); + RNA_def_property_ui_text(prop, "Normals", "Displace along normals"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "x_normal", PROP_BOOLEAN, PROP_NONE); @@ -975,11 +983,6 @@ static void rna_def_modifier_armature(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Quaternion", "Deform rotation interpolation with quaternions"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "b_bone_rest", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_B_BONE_REST); - RNA_def_property_ui_text(prop, "B-Bone Rest", "Make B-Bones deform already in rest position"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "multi_modifier", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "multi", 0); RNA_def_property_ui_text(prop, "Multi Modifier", "Use same input as previous modifier, and mix results using overall vgroup"); @@ -1064,7 +1067,7 @@ static void rna_def_modifier_boolean(BlenderRNA *brna) RNA_def_struct_ui_icon(srna, ICON_MOD_BOOLEAN); prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Object", "Mesh object to use for boolean operation"); + RNA_def_property_ui_text(prop, "Object", "Mesh object to use for Boolean operation"); RNA_def_property_pointer_funcs(prop, NULL, "rna_BooleanModifier_object_set", NULL); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); @@ -1119,7 +1122,7 @@ static void rna_def_modifier_array(BlenderRNA *brna) /* Offset parameters */ prop= RNA_def_property(srna, "constant_offset", PROP_BOOLEAN, PROP_TRANSLATION); RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_CONST); - RNA_def_property_ui_text(prop, "Constant Offset", ""); + RNA_def_property_ui_text(prop, "Constant Offset", "Add a constant offset"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "constant_offset_displacement", PROP_FLOAT, PROP_TRANSLATION); @@ -1129,7 +1132,7 @@ static void rna_def_modifier_array(BlenderRNA *brna) prop= RNA_def_property(srna, "relative_offset", PROP_BOOLEAN, PROP_TRANSLATION); RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_RELATIVE); - RNA_def_property_ui_text(prop, "Relative Offset", ""); + RNA_def_property_ui_text(prop, "Relative Offset", "Add an offset relative to the object's bounding box"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "relative_offset_displacement", PROP_FLOAT, PROP_TRANSLATION); @@ -1158,12 +1161,12 @@ static void rna_def_modifier_array(BlenderRNA *brna) /* Offset object */ prop= RNA_def_property(srna, "add_offset_object", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_OBJ); - RNA_def_property_ui_text(prop, "Add Offset Object", "Add an object transformation to the total offset"); + RNA_def_property_ui_text(prop, "Object Offset", "Add another object's transformation to the total offset"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "offset_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "offset_ob"); - RNA_def_property_ui_text(prop, "Offset Object", ""); + RNA_def_property_ui_text(prop, "Object Offset", ""); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); @@ -1191,6 +1194,7 @@ static void rna_def_modifier_edgesplit(BlenderRNA *brna) RNA_def_struct_sdna(srna, "EdgeSplitModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_EDGESPLIT); + // XXX, convert to radians. prop= RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0, 90); RNA_def_property_ui_range(prop, 0, 90, 100, 2); @@ -1312,19 +1316,33 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "horizontal_aspect_ratio", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "aspect_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "aspectx"); RNA_def_property_range(prop, 1, FLT_MAX); - RNA_def_property_ui_range(prop, 1, 1000, 100, 2); + RNA_def_property_ui_range(prop, 1, 1000, 0.2, 2); RNA_def_property_ui_text(prop, "Horizontal Aspect Ratio", ""); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "vertical_aspect_ratio", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "aspect_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "aspecty"); RNA_def_property_range(prop, 1, FLT_MAX); - RNA_def_property_ui_range(prop, 1, 1000, 100, 2); + RNA_def_property_ui_range(prop, 1, 1000, 0.2, 2); RNA_def_property_ui_text(prop, "Vertical Aspect Ratio", ""); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "scalex"); + RNA_def_property_range(prop, 0, FLT_MAX); + RNA_def_property_ui_range(prop, 0, 1000, 0.2, 2); + RNA_def_property_ui_text(prop, "Horizontal Scale", ""); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "scaley"); + RNA_def_property_range(prop, 0, FLT_MAX); + RNA_def_property_ui_range(prop, 0, 1000, 0.2, 2); + RNA_def_property_ui_text(prop, "Vertical Scale", ""); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "override_image", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_UVPROJECT_OVERRIDEIMAGE); @@ -1468,10 +1486,12 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; +#if 0 static EnumPropertyItem prop_mode_items[] = { {0, "VOLUME", 0, "Volume", "Bind to volume inside cage mesh"}, {1, "SURFACE", 0, "Surface", "Bind to surface of cage mesh"}, {0, NULL, 0, NULL, NULL}}; +#endif srna= RNA_def_struct(brna, "MeshDeformModifier", "Modifier"); RNA_def_struct_ui_text(srna, "MeshDeform Modifier", "Mesh deformation modifier to deform with other meshes"); @@ -1511,20 +1531,28 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Dynamic", "Recompute binding dynamically on top of other deformers (slower and more memory consuming.)"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); +#if 0 prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_mode_items); RNA_def_property_ui_text(prop, "Mode", "Method of binding vertices are bound to cage mesh"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); +#endif } static void rna_def_modifier_particlesystem(BlenderRNA *brna) { StructRNA *srna; + PropertyRNA *prop; srna= RNA_def_struct(brna, "ParticleSystemModifier", "Modifier"); RNA_def_struct_ui_text(srna, "ParticleSystem Modifier", "Particle system simulation modifier"); RNA_def_struct_sdna(srna, "ParticleSystemModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_PARTICLES); + + prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_pointer_sdna(prop, NULL, "psys"); + RNA_def_property_ui_text(prop, "Particle System", "Particle System that this modifier controls"); } static void rna_def_modifier_particleinstance(BlenderRNA *brna) @@ -1572,7 +1600,7 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Children", "Create instances from child particles"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "path", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_path", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Path); RNA_def_property_ui_text(prop, "Path", "Create instances along particle paths"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -1653,6 +1681,11 @@ static void rna_def_modifier_explode(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_Dead); RNA_def_property_ui_text(prop, "Dead", "Show mesh when particles are dead"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "size", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_PaSize); + RNA_def_property_ui_text(prop, "Size", "Use particle size for the shrapnel"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); } static void rna_def_modifier_cloth(BlenderRNA *brna) @@ -1687,9 +1720,9 @@ static void rna_def_modifier_smoke(BlenderRNA *brna) static EnumPropertyItem prop_smoke_type_items[] = { {0, "NONE", 0, "None", ""}, - {MOD_SMOKE_TYPE_DOMAIN, "TYPE_DOMAIN", 0, "Domain", ""}, - {MOD_SMOKE_TYPE_FLOW, "TYPE_FLOW", 0, "Flow", "Inflow/Outflow"}, - {MOD_SMOKE_TYPE_COLL, "TYPE_COLL", 0, "Collision", ""}, + {MOD_SMOKE_TYPE_DOMAIN, "DOMAIN", 0, "Domain", ""}, + {MOD_SMOKE_TYPE_FLOW, "FLOW", 0, "Flow", "Inflow/Outflow"}, + {MOD_SMOKE_TYPE_COLL, "COLLISION", 0, "Collision", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SmokeModifier", "Modifier"); @@ -2021,13 +2054,20 @@ static void rna_def_modifier_solidify(BlenderRNA *brna) RNA_def_struct_sdna(srna, "SolidifyModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_SOLIDIFY); - prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_DISTANCE); + prop= RNA_def_property(srna, "thickness", PROP_FLOAT, PROP_DISTANCE); RNA_def_property_float_sdna(prop, NULL, "offset"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -10, 10, 0.1, 4); RNA_def_property_ui_text(prop, "Thickness", "Thickness of the shell"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_float_sdna(prop, NULL, "offset_fac"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -1, 1, 0.1, 4); + RNA_def_property_ui_text(prop, "Offset", "Offset the thickness from the center"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop= RNA_def_property(srna, "edge_crease_inner", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "crease_inner"); RNA_def_property_range(prop, 0, 1); @@ -2059,6 +2099,11 @@ static void rna_def_modifier_solidify(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_RIM); RNA_def_property_ui_text(prop, "Fill Rim", "Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed)"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "use_rim_material", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_RIM_MATERIAL); + RNA_def_property_ui_text(prop, "Rim Material", "Use in the next material for rim faces"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "use_even_offset", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_EVEN); @@ -2069,6 +2114,91 @@ static void rna_def_modifier_solidify(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_NORMAL_CALC); RNA_def_property_ui_text(prop, "High Quality Normals", "Calculate normals which result in more even thickness (slow, disable when not needed)"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_VGROUP_INV); + RNA_def_property_ui_text(prop, "Vertex Group Invert", "Invert the vertex group influence"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + +} + +static void rna_def_modifier_screw(BlenderRNA *brna) +{ + static EnumPropertyItem axis_items[]= { + {0, "X", 0, "X Axis", ""}, + {1, "Y", 0, "Y Axis", ""}, + {2, "Z", 0, "Z Axis", ""}, + {0, NULL, 0, NULL, NULL}}; + + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "ScrewModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Screw Modifier", "Revolve edges"); + RNA_def_struct_sdna(srna, "ScrewModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_SCREW); + + prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "ob_axis"); + RNA_def_property_ui_text(prop, "Object", "Object to define the screw axis"); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + + prop= RNA_def_property(srna, "steps", PROP_INT, PROP_UNSIGNED); + RNA_def_property_range(prop, 2, 10000); + RNA_def_property_ui_range(prop, 2, 512, 1, 0); + RNA_def_property_ui_text(prop, "Steps", "Number of steps in the revolution"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "render_steps", PROP_INT, PROP_UNSIGNED); + RNA_def_property_range(prop, 2, 10000); + RNA_def_property_ui_range(prop, 2, 512, 1, 0); + RNA_def_property_ui_text(prop, "Render Steps", "Number of steps in the revolution"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "iterations", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "iter"); + RNA_def_property_range(prop, 1, 10000); + RNA_def_property_ui_range(prop, 1, 100, 1, 0); + RNA_def_property_ui_text(prop, "Iterations", "Number of times to apply the screw operation"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, axis_items); + RNA_def_property_ui_text(prop, "Axis", "Screw axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_ui_range(prop, 0, -M_PI*2, M_PI*2, 2); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_text(prop, "Angle", "Angle of revolution"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "screw_offset", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_float_sdna(prop, NULL, "screw_ofs"); + RNA_def_property_ui_text(prop, "Screw", "Offset the revolution along its axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "use_normal_flip", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SCREW_NORMAL_FLIP); + RNA_def_property_ui_text(prop, "Flip", "Flip normals of lathed faces"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "use_normal_calculate", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SCREW_NORMAL_CALC); + RNA_def_property_ui_text(prop, "Calc Order", "Calculate the order of edges (needed for meshes, but not curves)"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "use_object_screw_offset", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SCREW_OBJECT_OFFSET); + RNA_def_property_ui_text(prop, "Object Screw", "Use the distance between the objects to make a screw"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + /*prop= RNA_def_property(srna, "use_angle_object", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SCREW_OBJECT_ANGLE); + RNA_def_property_ui_text(prop, "Object Angle", "Use the angle between the objects rather than the fixed angle"); + RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ } void RNA_def_modifier(BlenderRNA *brna) @@ -2160,6 +2290,7 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_surface(brna); rna_def_modifier_smoke(brna); rna_def_modifier_solidify(brna); + rna_def_modifier_screw(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c index 246616ccffc..8f2a1484b9b 100644 --- a/source/blender/makesrna/intern/rna_nla.c +++ b/source/blender/makesrna/intern/rna_nla.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -321,13 +320,13 @@ static void rna_def_nlastrip(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Blending", "Method used for combining strip's result with accumulated result"); /* Strip extents */ - prop= RNA_def_property(srna, "start_frame", PROP_FLOAT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "start"); RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_start_frame_set", NULL); RNA_def_property_ui_text(prop, "Start Frame", ""); RNA_def_property_update(prop, 0, "rna_NlaStrip_transform_update"); - prop= RNA_def_property(srna, "end_frame", PROP_FLOAT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "end"); RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_end_frame_set", NULL); RNA_def_property_ui_text(prop, "End Frame", ""); @@ -355,12 +354,12 @@ static void rna_def_nlastrip(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Action", "Action referenced by this strip"); /* Action extents */ - prop= RNA_def_property(srna, "action_start_frame", PROP_FLOAT, PROP_TIME); + prop= RNA_def_property(srna, "action_frame_start", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "actstart"); RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_action_start_frame_set", NULL); RNA_def_property_ui_text(prop, "Action Start Frame", ""); - prop= RNA_def_property(srna, "action_end_frame", PROP_FLOAT, PROP_TIME); + prop= RNA_def_property(srna, "action_frame_end", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "actend"); RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_action_end_frame_set", NULL); RNA_def_property_ui_text(prop, "Action End Frame", ""); @@ -411,6 +410,11 @@ static void rna_def_nlastrip(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_TIME); RNA_def_property_boolean_funcs(prop, NULL, "rna_NlaStrip_animated_time_set"); RNA_def_property_ui_text(prop, "Animated Strip Time", "Strip time is controlled by an F-Curve rather than automatically determined"); + + prop= RNA_def_property(srna, "animated_time_cyclic", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_TIME_CYCLIC); + RNA_def_property_ui_text(prop, "Cyclic Strip Time", "Cycle the animated time within the action start & end"); + RNA_def_property_update(prop, 0, "rna_NlaStrip_transform_update"); // is there a better update flag? /* settings */ prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index d8c5c796fa3..5ebf43fc2b7 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Contributor(s): Blender Foundation (2008), Nathan Letwory, Robin Allen + * Contributor(s): Blender Foundation (2008), Nathan Letwory, Robin Allen, Bob Holcomb * * ***** END GPL LICENSE BLOCK ***** */ @@ -25,9 +25,7 @@ #include #include -#include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -118,21 +116,6 @@ static char *rna_NodeSocket_path(PointerRNA *ptr) return NULL; } -static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup) -{ - bNode *node; - - if(ntree == lookup) - return 1; - - for(node=ntree->nodes.first; node; node=node->next) - if(node->type == NODE_GROUP && node->id) - if(has_nodetree((bNodeTree*)node->id, lookup)) - return 1; - - return 0; -} - /* Button Set Funcs for Matte Nodes */ static void rna_Matte_t1_set(PointerRNA *ptr, float value) { @@ -158,22 +141,7 @@ static void rna_Matte_t2_set(PointerRNA *ptr, float value) static void node_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node) { - Material *ma; - Tex *tex; - Scene *sce; - - /* look through all datablocks, to support groups */ - for(ma=bmain->mat.first; ma; ma=ma->id.next) - if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree)) - ED_node_changed_update(&ma->id, node); - - for(tex=bmain->tex.first; tex; tex=tex->id.next) - if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree)) - ED_node_changed_update(&tex->id, node); - - for(sce=bmain->scene.first; sce; sce=sce->id.next) - if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree)) - ED_node_changed_update(&sce->id, node); + ED_node_generic_update(bmain, scene, ntree, node); } static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -198,10 +166,10 @@ static void rna_Node_update_name(Main *bmain, Scene *scene, PointerRNA *ptr) { bNodeTree *ntree= (bNodeTree*)ptr->id.data; bNode *node= (bNode*)ptr->data; - char oldname[32]; + char oldname[sizeof(node->name)]; /* make a copy of the old name first */ - BLI_strncpy(oldname, node->name, sizeof(oldname)); + BLI_strncpy(oldname, node->name, sizeof(node->name)); nodeUniqueName(ntree, node); node->flag |= NODE_CUSTOM_NAME; @@ -897,7 +865,7 @@ static void def_cmp_blur(StructRNA *srna) prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "relative", 1); - RNA_def_property_ui_text(prop, "Relative", ""); + RNA_def_property_ui_text(prop, "Relative", "Use relative (percent) values to define blur radius"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE); @@ -926,12 +894,12 @@ static void def_cmp_blur(StructRNA *srna) prop = RNA_def_property(srna, "bokeh", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "bokeh", 1); - RNA_def_property_ui_text(prop, "Bokeh", ""); + RNA_def_property_ui_text(prop, "Bokeh", "Uses circular filter (slower)"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "gamma", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "gamma", 1); - RNA_def_property_ui_text(prop, "Gamma", ""); + RNA_def_property_ui_text(prop, "Gamma", "Applies filter on gamma corrected values"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } @@ -1147,9 +1115,9 @@ static void def_cmp_output_file(StructRNA *srna) RNA_def_struct_sdna_from(srna, "NodeImageFile", "storage"); - prop = RNA_def_property(srna, "filename", PROP_STRING, PROP_DIRPATH); + prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Filename", ""); + RNA_def_property_ui_text(prop, "File Path", "Output path for the image, same functionality as render output."); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "image_type", PROP_ENUM, PROP_NONE); @@ -1176,13 +1144,13 @@ static void def_cmp_output_file(StructRNA *srna) RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); // TODO: should these be limited to the extents of the each other so that no cross-over occurs? - prop = RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE); + prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "sfra"); RNA_def_property_range(prop, MINFRAMEF, MAXFRAMEF); RNA_def_property_ui_text(prop, "Start Frame", ""); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE); + prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "efra"); RNA_def_property_range(prop, MINFRAMEF, MAXFRAMEF); RNA_def_property_ui_text(prop, "End Frame", ""); @@ -1208,6 +1176,7 @@ static void def_cmp_scale(StructRNA *srna) {0, "RELATIVE", 0, "Relative", ""}, {1, "ABSOLUTE", 0, "Absolute", ""}, {2, "SCENE_SIZE", 0, "Scene Size", ""}, + {3, "RENDER_SIZE", 0, "Render Size", ""}, {0, NULL, 0, NULL, NULL}}; prop = RNA_def_property(srna, "space", PROP_ENUM, PROP_NONE); @@ -1217,6 +1186,23 @@ static void def_cmp_scale(StructRNA *srna) RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } +static void def_cmp_rotate(StructRNA *srna) +{ + PropertyRNA *prop; + + static EnumPropertyItem rotate_items[] = { + {0, "NEAREST", 0, "Nearest", ""}, + {1, "BILINEAR", 0, "Bilinear", ""}, + {2, "BICUBIC", 0, "Bicubic", ""}, + {0, NULL, 0, NULL, NULL}}; + + prop = RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, rotate_items); + RNA_def_property_ui_text(prop, "Filter", "Method to use to filter rotation"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); +} + static void def_cmp_diff_matte(StructRNA *srna) { PropertyRNA *prop; @@ -1287,12 +1273,23 @@ static void def_cmp_distance_matte(StructRNA *srna) static void def_cmp_color_spill(StructRNA *srna) { PropertyRNA *prop; - + static EnumPropertyItem channel_items[] = { {1, "R", 0, "R", "Red Spill Suppression"}, {2, "G", 0, "G", "Green Spill Suppression"}, {3, "B", 0, "B", "Blue Spill Suppression"}, {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem limit_channel_items[] = { + {1, "R", 0, "R", "Limit by Red"}, + {2, "G", 0, "G", "Limit by Green"}, + {3, "B", 0, "B", "Limit by Blue"}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem algorithm_items[] = { + {0, "SIMPLE", 0, "Simple", "Simple Limit Algorithm"}, + {1, "AVERAGE", 0, "Average", "Average Limit Algorithm"}, + {0, NULL, 0, NULL, NULL}}; prop = RNA_def_property(srna, "channel", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); @@ -1300,12 +1297,47 @@ static void def_cmp_color_spill(StructRNA *srna) RNA_def_property_ui_text(prop, "Channel", ""); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - RNA_def_struct_sdna_from(srna, "NodeChroma", "storage"); - - prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "t1"); - RNA_def_property_range(prop, 0.0f, 0.5f); - RNA_def_property_ui_text(prop, "Amount", "How much the selected channel is affected by"); + prop = RNA_def_property(srna, "algorithm", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom2"); + RNA_def_property_enum_items(prop, algorithm_items); + RNA_def_property_ui_text(prop, "Algorithm", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + RNA_def_struct_sdna_from(srna, "NodeColorspill", "storage"); + + prop = RNA_def_property(srna, "limit_channel", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "limchan"); + RNA_def_property_enum_items(prop, limit_channel_items); + RNA_def_property_ui_text(prop, "Limit Channel", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "limscale"); + RNA_def_property_range(prop, 0.5f, 1.5f); + RNA_def_property_ui_text(prop, "Ratio", "Scale limit by value"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "unspill", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "unspill", 0); + RNA_def_property_ui_text(prop, "Unspill", "Compensate all channels (diffenrently) by hand"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "unspill_red", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "uspillr"); + RNA_def_property_range(prop, 0.0f, 1.5f); + RNA_def_property_ui_text(prop, "R", "Red spillmap scale"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "unspill_green", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "uspillg"); + RNA_def_property_range(prop, 0.0f, 1.5f); + RNA_def_property_ui_text(prop, "G", "Green spillmap scale"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "unspill_blue", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "uspillb"); + RNA_def_property_range(prop, 0.0f, 1.5f); + RNA_def_property_ui_text(prop, "B", "Blue spillmap scale"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } @@ -1379,6 +1411,11 @@ static void def_cmp_channel_matte(StructRNA *srna) {CMP_NODE_CHANNEL_MATTE_CS_YUV, "YUV", 0, "YUV", "YUV Color Space"}, {CMP_NODE_CHANNEL_MATTE_CS_YCC, "YCC", 0, "YCbCr", "YCbCr Color Space"}, {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem algorithm_items[] = { + {0, "SINGLE", 0, "Single", "Limit by single channel"}, + {1, "MAX", 0, "Max", "Limit by max of other channels "}, + {0, NULL, 0, NULL, NULL}}; prop = RNA_def_property(srna, "color_space", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom1"); @@ -1386,15 +1423,27 @@ static void def_cmp_channel_matte(StructRNA *srna) RNA_def_property_ui_text(prop, "Color Space", ""); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop= RNA_def_property(srna, "channel", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "custom2"); RNA_def_property_enum_items(prop, prop_tri_channel_items); RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_channel_itemf"); RNA_def_property_ui_text(prop, "Channel", "Channel used to determine matte"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - + RNA_def_struct_sdna_from(srna, "NodeChroma", "storage"); + + prop = RNA_def_property(srna, "algorithm", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "algorithm"); + RNA_def_property_enum_items(prop, algorithm_items); + RNA_def_property_ui_text(prop, "Algorithm", "Algorithm to use to limit channel"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "limit_channel", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "channel"); + RNA_def_property_enum_items(prop, prop_tri_channel_items); + RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_channel_itemf"); + RNA_def_property_ui_text(prop, "Limit Channel", "Limit by this channels value"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "high", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "t1"); @@ -1879,7 +1928,8 @@ static void def_cmp_colorbalance(StructRNA *srna) prop = RNA_def_property(srna, "lift", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "lift"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_range(prop, 0, 1, 0.1, 3); + RNA_def_property_float_array_default(prop, default_1); + RNA_def_property_ui_range(prop, 0, 2, 0.1, 3); RNA_def_property_ui_text(prop, "Lift", "Correction for Shadows"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h index b31751a8ce7..f824f6f20ce 100644 --- a/source/blender/makesrna/intern/rna_nodetree_types.h +++ b/source/blender/makesrna/intern/rna_nodetree_types.h @@ -74,7 +74,7 @@ DefNode( CompositorNode, CMP_NODE_TRANSLATE, 0, "TRANS DefNode( CompositorNode, CMP_NODE_ZCOMBINE, 0, "ZCOMBINE", Zcombine, "Z Combine", "" ) DefNode( CompositorNode, CMP_NODE_COMBRGBA, 0, "COMBRGBA", CombRGBA, "Combine RGBA", "" ) DefNode( CompositorNode, CMP_NODE_DILATEERODE, def_cmp_dilate_erode, "DILATEERODE", DilateErode, "Dilate/Erode", "" ) -DefNode( CompositorNode, CMP_NODE_ROTATE, 0, "ROTATE", Rotate, "Rotate", "" ) +DefNode( CompositorNode, CMP_NODE_ROTATE, def_cmp_rotate, "ROTATE", Rotate, "Rotate", "" ) DefNode( CompositorNode, CMP_NODE_SCALE, def_cmp_scale, "SCALE", Scale, "Scale", "" ) DefNode( CompositorNode, CMP_NODE_SEPYCCA, 0, "SEPYCCA", SepYCCA, "Separate YCCA", "" ) DefNode( CompositorNode, CMP_NODE_COMBYCCA, 0, "COMBYCCA", CombYCCA, "Combine YCCA", "" ) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 8215cb6bf41..26e1cd1d5da 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -27,13 +27,13 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "rna_internal.h" #include "DNA_action_types.h" #include "DNA_customdata_types.h" +#include "DNA_controller_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_object_force.h" @@ -78,12 +78,17 @@ static EnumPropertyItem collision_bounds_items[] = { //{OB_DYN_MESH, "DYNAMIC_MESH", 0, "Dynamic Mesh", ""}, {0, NULL, 0, NULL, NULL}}; +/* used for 2 enums */ +#define OBTYPE_CU_CURVE {OB_CURVE, "CURVE", 0, "Curve", ""} +#define OBTYPE_CU_SURF {OB_SURF, "SURFACE", 0, "Surface", ""} +#define OBTYPE_CU_TEXT {OB_FONT, "TEXT", 0, "Text", ""} + EnumPropertyItem object_type_items[] = { {OB_MESH, "MESH", 0, "Mesh", ""}, - {OB_CURVE, "CURVE", 0, "Curve", ""}, - {OB_SURF, "SURFACE", 0, "Surface", ""}, + OBTYPE_CU_CURVE, + OBTYPE_CU_SURF, {OB_MBALL, "META", 0, "Meta", ""}, - {OB_FONT, "TEXT", 0, "Text", ""}, + OBTYPE_CU_TEXT, {0, "", 0, NULL, NULL}, {OB_ARMATURE, "ARMATURE", 0, "Armature", ""}, {OB_LATTICE, "LATTICE", 0, "Lattice", ""}, @@ -93,6 +98,12 @@ EnumPropertyItem object_type_items[] = { {OB_LAMP, "LAMP", 0, "Lamp", ""}, {0, NULL, 0, NULL, NULL}}; +EnumPropertyItem object_type_curve_items[] = { + OBTYPE_CU_CURVE, + OBTYPE_CU_SURF, + OBTYPE_CU_TEXT, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME #include "BLI_math.h" @@ -120,18 +131,51 @@ EnumPropertyItem object_type_items[] = { #include "ED_object.h" #include "ED_particle.h" -void rna_Object_update(Main *bmain, Scene *scene, PointerRNA *ptr) +void rna_Object_internal_update(Main *bmain, Scene *scene, PointerRNA *ptr) { DAG_id_flush_update(ptr->id.data, OB_RECALC_OB); } -void rna_Object_matrix_update(Main *bmain, Scene *scene, PointerRNA *ptr) +void rna_Object_matrix_world_update(Main *bmain, Scene *scene, PointerRNA *ptr) { - ED_object_apply_obmat(ptr->id.data); - rna_Object_update(bmain, scene, ptr); + object_apply_mat4(ptr->id.data, ((Object *)ptr->id.data)->obmat); + rna_Object_internal_update(bmain, scene, ptr); } -void rna_Object_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) +void rna_Object_matrix_local_get(PointerRNA *ptr, float values[16]) +{ + Object *ob= ptr->id.data; + + if(ob->parent) { + float invmat[4][4]; /* for inverse of parent's matrix */ + invert_m4_m4(invmat, ob->parent->obmat); + mul_m4_m4m4((float(*)[4])values, ob->obmat, invmat); + } + else { + copy_m4_m4((float(*)[4])values, ob->obmat); + } +} + +void rna_Object_matrix_local_set(PointerRNA *ptr, const float values[16]) +{ + Object *ob= ptr->id.data; + + /* localspace matrix is truly relative to the parent, but parameters + * stored in object are relative to parentinv matrix. Undo the parent + * inverse part before updating obmat and calling apply_obmat() */ + if(ob->parent) { + float invmat[4][4]; + invert_m4_m4(invmat, ob->parentinv); + mul_m4_m4m4(ob->obmat, (float(*)[4])values, invmat); + } + else { + copy_m4_m4(ob->obmat, (float(*)[4])values); + } + + object_apply_mat4(ob, ob->obmat); +} + +void rna_Object_internal_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) { DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA); WM_main_add_notifier(NC_OBJECT|ND_DRAW, ptr->id.data); @@ -148,7 +192,7 @@ void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr) EDBM_MakeEditBMesh(scene->toolsettings, scene, ob); } - rna_Object_update_data(bmain, scene, ptr); + rna_Object_internal_update_data(bmain, scene, ptr); } static void rna_Object_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -176,7 +220,7 @@ static void rna_Object_layer_update__internal(Scene *scene, Base *base, Object * { /* try to avoid scene sort */ if((ob->lay & scene->lay) && (base->lay & scene->lay)) { - /* pass */ + /* pass */ } else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0) { /* pass */ } else { @@ -201,7 +245,7 @@ static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_Base_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr) { - Base *base= (Base*)ptr->id.data; + Base *base= (Base*)ptr->data; Object *ob= (Object*)base->object; rna_Object_layer_update__internal(scene, base, ob); @@ -477,7 +521,7 @@ static void rna_Object_active_material_index_set(PointerRNA *ptr, int value) Object *ob= (Object*)ptr->id.data; ob->actcol= value+1; - if((ob->mode & OB_MODE_EDIT) && ob->type==OB_MESH) { + if(ob->type==OB_MESH) { Mesh *me= ob->data; if(me->edit_btmesh) @@ -571,41 +615,13 @@ static void rna_Object_rotation_mode_set(PointerRNA *ptr, int value) static void rna_Object_dimensions_get(PointerRNA *ptr, float *value) { Object *ob= ptr->data; - BoundBox *bb = NULL; - - bb= object_get_boundbox(ob); - if (bb) { - float scale[3]; - - mat4_to_size( scale,ob->obmat); - - value[0] = fabs(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]); - value[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]); - value[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]); - } else { - value[0] = value[1] = value[2] = 0.f; - } + object_get_dimensions(ob, value); } static void rna_Object_dimensions_set(PointerRNA *ptr, const float *value) { Object *ob= ptr->data; - BoundBox *bb = NULL; - - bb= object_get_boundbox(ob); - if (bb) { - float scale[3], len[3]; - - mat4_to_size( scale,ob->obmat); - - len[0] = bb->vec[4][0] - bb->vec[0][0]; - len[1] = bb->vec[2][1] - bb->vec[0][1]; - len[2] = bb->vec[1][2] - bb->vec[0][2]; - - if (len[0] > 0.f) ob->size[0] = value[0] / len[0]; - if (len[1] > 0.f) ob->size[1] = value[1] / len[1]; - if (len[2] > 0.f) ob->size[2] = value[2] / len[2]; - } + object_set_dimensions(ob, value); } static int rna_Object_location_editable(PointerRNA *ptr, int index) @@ -878,25 +894,52 @@ static void rna_Base_layer_set(PointerRNA *ptr, const int *values) /* rna_Base_layer_update updates the objects layer */ } +static void rna_GameObjectSettings_state_get(PointerRNA *ptr, int *values) +{ + Object *ob= (Object*)ptr->data; + int i; + int all_states = (ob->scaflag & OB_ALLSTATE?1:0); + + memset(values, 0, sizeof(int)*OB_MAX_STATES); + for(i=0; istate & (1<data; int i, tot= 0; /* ensure we always have some state selected */ - for(i=0; i<20; i++) + for(i=0; istate |= (1<state &= ~(1<data; + bController *cont; + + memset(values, 0, sizeof(int)*OB_MAX_STATES); + for (cont=ob->controllers.first; cont; cont=cont->next) { + int i; + + for (i=0; istate_mask & (1<id.data; @@ -971,13 +1014,13 @@ static void rna_Object_active_constraint_set(PointerRNA *ptr, PointerRNA value) constraints_set_active(&ob->constraints, (bConstraint *)value.data); } -static bConstraint *rna_Object_constraint_new(Object *object, bContext *C, int type) +static bConstraint *rna_Object_constraint_new(Object *object, int type) { WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT|NA_ADDED, object); return add_ob_constraint(object, NULL, type); } -static int rna_Object_constraint_remove(Object *object, bContext *C, int index) +static int rna_Object_constraint_remove(Object *object, int index) { int ok = remove_constraint_index(&object->constraints, index); if(ok) { @@ -1057,13 +1100,13 @@ static void rna_def_material_slot(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_pointer_funcs(prop, "rna_MaterialSlot_material_get", "rna_MaterialSlot_material_set", NULL); RNA_def_property_ui_text(prop, "Material", "Material datablock used by this material slot"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "link", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, link_items); RNA_def_property_enum_funcs(prop, "rna_MaterialSlot_link_get", "rna_MaterialSlot_link_set", NULL); RNA_def_property_ui_text(prop, "Link", "Link material to object or the object's data"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, "rna_MaterialSlot_name_get", "rna_MaterialSlot_name_length", NULL); @@ -1131,6 +1174,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna) RNA_def_property_enum_items(prop, body_type_items); RNA_def_property_enum_funcs(prop, "rna_GameObjectSettings_physics_type_get", "rna_GameObjectSettings_physics_type_set", NULL); RNA_def_property_ui_text(prop, "Physics Type", "Selects the type of physical representation"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "actor", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ACTOR); @@ -1242,7 +1286,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "collision_compound", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_CHILD); - RNA_def_property_ui_text(prop, "Collison Compound", "Add children to form a compound collision object"); + RNA_def_property_ui_text(prop, "Collision Compound", "Add children to form a compound collision object"); prop= RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH); RNA_def_property_float_sdna(prop, NULL, "margin"); @@ -1255,20 +1299,36 @@ static void rna_def_object_game_settings(BlenderRNA *brna) /* state */ - prop= RNA_def_property(srna, "state", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "visible_state", PROP_BOOLEAN, PROP_LAYER_MEMBER); RNA_def_property_boolean_sdna(prop, NULL, "state", 1); - RNA_def_property_array(prop, 30); + RNA_def_property_array(prop, OB_MAX_STATES); RNA_def_property_ui_text(prop, "State", "State determining which controllers are displayed"); - RNA_def_property_boolean_funcs(prop, NULL, "rna_GameObjectSettings_state_set"); + RNA_def_property_boolean_funcs(prop, "rna_GameObjectSettings_state_get", "rna_GameObjectSettings_state_set"); + prop= RNA_def_property(srna, "used_state", PROP_BOOLEAN, PROP_LAYER_MEMBER); + RNA_def_property_array(prop, OB_MAX_STATES); + RNA_def_property_ui_text(prop, "Used State", "States which are being used by controllers"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_boolean_funcs(prop, "rna_GameObjectSettings_used_state_get", NULL); + prop= RNA_def_property(srna, "initial_state", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "init_state", 1); - RNA_def_property_array(prop, 30); + RNA_def_property_array(prop, OB_MAX_STATES); RNA_def_property_ui_text(prop, "Initial State", "Initial state when the game starts"); prop= RNA_def_property(srna, "debug_state", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scaflag", OB_DEBUGSTATE); RNA_def_property_ui_text(prop, "Debug State", "Print state debug info in the game engine"); + RNA_def_property_ui_icon(prop, ICON_INFO, 0); + + prop= RNA_def_property(srna, "all_states", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", OB_ALLSTATE); + RNA_def_property_ui_text(prop, "All", "Set all state bits"); + + prop= RNA_def_property(srna, "show_state_panel", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", OB_SHOWSTATE); + RNA_def_property_ui_text(prop, "States", "Show state panel"); + RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1); } static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop) @@ -1295,7 +1355,6 @@ static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop) /* Constraint collection */ func= RNA_def_function(srna, "new", "rna_Object_constraint_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Add a new constraint to this object"); /* return type */ parm= RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint."); @@ -1305,7 +1364,6 @@ static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_flag(parm, PROP_REQUIRED); func= RNA_def_function(srna, "remove", "rna_Object_constraint_remove"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Remove a constraint from this object."); /* return type */ parm= RNA_def_boolean(func, "success", 0, "Success", "Removed the constraint successfully."); @@ -1344,7 +1402,7 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop) /* add target */ func= RNA_def_function(srna, "new", "rna_Object_modifier_new"); RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); - RNA_def_function_ui_description(func, "Add a new bone."); + RNA_def_function_ui_description(func, "Add a new modifier."); parm= RNA_def_string(func, "name", "Name", 0, "", "New name for the bone."); RNA_def_property_flag(parm, PROP_REQUIRED); /* modifier to add */ @@ -1420,7 +1478,7 @@ static void rna_def_object(BlenderRNA *brna) {OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", ""}, {OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", ""}, {OB_BOUND_CONE, "CONE", 0, "Cone", ""}, - {OB_BOUND_POLYH, "POLYHEDER", 0, "Polyheder", ""}, + {OB_BOUND_POLYH, "POLYHEDRON", 0, "Polyhedron", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem dupli_items[] = { @@ -1460,7 +1518,7 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_editable_func(prop, "rna_Object_data_editable"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Data", "Object data"); - RNA_def_property_update(prop, 0, "rna_Object_update_data"); + RNA_def_property_update(prop, 0, "rna_Object_internal_update_data"); prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); @@ -1492,9 +1550,9 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_multi_array(prop, 2, boundbox_dimsize); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_float_funcs(prop, "rna_Object_boundbox_get", NULL, NULL); - RNA_def_property_ui_text(prop, "Bound Box", "Objects bound box in object-space coords"); + RNA_def_property_ui_text(prop, "Bound Box", "Objects bound box in object-space coordinates"); - /* parent and track */ + /* parent */ prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_parent_set", NULL); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); @@ -1513,31 +1571,28 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_array(prop, 3); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Parent Vertices", "Indices of vertices in cases of a vertex parenting relation"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "parent_bone", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "parsubstr"); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Object_parent_bone_set"); RNA_def_property_ui_text(prop, "Parent Bone", "Name of parent bone in case of a bone parenting relation"); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update"); - - prop= RNA_def_property(srna, "track", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); - RNA_def_property_ui_text(prop, "Track", "Object being tracked to define the rotation (Old Track)"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update"); - + + /* Track and Up flags */ + // XXX: these have been saved here for a bit longer (after old track was removed), since some other tools still refer to this prop= RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "trackflag"); RNA_def_property_enum_items(prop, track_items); - RNA_def_property_ui_text(prop, "Track Axis", "Tracking axis pointing to the tracked object"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_ui_text(prop, "Track Axis", "Axis that points in 'forward' direction"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "up_axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "upflag"); RNA_def_property_enum_items(prop, up_items); RNA_def_property_ui_text(prop, "Up Axis", "Axis that points in the upward direction"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); - + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); + /* proxy */ prop= RNA_def_property(srna, "proxy", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Proxy", "Library object this proxy object controls"); @@ -1557,7 +1612,7 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", NULL); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Active Material", "Active material being displayed"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "actcol"); @@ -1570,14 +1625,14 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "loc"); RNA_def_property_editable_array_func(prop, "rna_Object_location_editable"); RNA_def_property_ui_text(prop, "Location", "Location of the object"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "rotation_quaternion", PROP_FLOAT, PROP_QUATERNION); RNA_def_property_float_sdna(prop, NULL, "quat"); RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable"); RNA_def_property_float_array_default(prop, default_quat); RNA_def_property_ui_text(prop, "Quaternion Rotation", "Rotation in Quaternions"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); /* XXX: for axis-angle, it would have been nice to have 2 separate fields for UI purposes, but * having a single one is better for Keyframing and other property-management situations... @@ -1588,81 +1643,84 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable"); RNA_def_property_float_array_default(prop, default_axisAngle); RNA_def_property_ui_text(prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER); RNA_def_property_float_sdna(prop, NULL, "rot"); RNA_def_property_editable_array_func(prop, "rna_Object_rotation_euler_editable"); RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "rotmode"); RNA_def_property_enum_items(prop, prop_rotmode_items); // XXX move to using a single define of this someday RNA_def_property_enum_funcs(prop, NULL, "rna_Object_rotation_mode_set", NULL); RNA_def_property_ui_text(prop, "Rotation Mode", ""); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ); RNA_def_property_float_sdna(prop, NULL, "size"); RNA_def_property_editable_array_func(prop, "rna_Object_scale_editable"); RNA_def_property_float_array_default(prop, default_scale); RNA_def_property_ui_text(prop, "Scale", "Scaling of the object"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); - prop= RNA_def_property(srna, "dimensions", PROP_FLOAT, PROP_XYZ|PROP_UNIT_LENGTH); + prop= RNA_def_property(srna, "dimensions", PROP_FLOAT, PROP_XYZ_LENGTH); RNA_def_property_array(prop, 3); RNA_def_property_float_funcs(prop, "rna_Object_dimensions_get", "rna_Object_dimensions_set", NULL); RNA_def_property_ui_text(prop, "Dimensions", "Absolute bounding box dimensions of the object"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); /* delta transforms */ prop= RNA_def_property(srna, "delta_location", PROP_FLOAT, PROP_TRANSLATION); RNA_def_property_float_sdna(prop, NULL, "dloc"); RNA_def_property_ui_text(prop, "Delta Location", "Extra translation added to the location of the object"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "delta_rotation_euler", PROP_FLOAT, PROP_EULER); RNA_def_property_float_sdna(prop, NULL, "drot"); RNA_def_property_ui_text(prop, "Delta Rotation (Euler)", "Extra rotation added to the rotation of the object (when using Euler rotations)"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "delta_rotation_quaternion", PROP_FLOAT, PROP_QUATERNION); RNA_def_property_float_sdna(prop, NULL, "dquat"); RNA_def_property_float_array_default(prop, default_quat); RNA_def_property_ui_text(prop, "Delta Rotation (Quaternion)", "Extra rotation added to the rotation of the object (when using Quaternion rotations)"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); #if 0 // XXX not supported well yet... prop= RNA_def_property(srna, "delta_rotation_axis_angle", PROP_FLOAT, PROP_AXISANGLE); RNA_def_property_float_sdna(prop, NULL, "dquat"); // FIXME: this is not a single field any more! (drotAxis and drotAngle) RNA_def_property_float_array_default(prop, default_axisAngle); RNA_def_property_ui_text(prop, "Delta Rotation (Axis Angle)", "Extra rotation added to the rotation of the object (when using Axis-Angle rotations)"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); #endif prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ); RNA_def_property_float_sdna(prop, NULL, "dsize"); RNA_def_property_ui_text(prop, "Delta Scale", "Extra scaling added to the scale of the object"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); /* transform locks */ prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_XYZ); RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_XYZ); RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); // XXX this is sub-optimal - it really should be included above, but due to technical reasons we can't do this! prop= RNA_def_property(srna, "lock_rotation_w", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTW); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); RNA_def_property_ui_text(prop, "Lock Rotation (4D Angle)", "Lock editing of 'angle' component of four-component rotations in the interface"); // XXX this needs a better name prop= RNA_def_property(srna, "lock_rotations_4d", PROP_BOOLEAN, PROP_NONE); @@ -1673,14 +1731,21 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); /* matrix */ - prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX); + prop= RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX); RNA_def_property_float_sdna(prop, NULL, "obmat"); RNA_def_property_multi_array(prop, 2, matrix_dimsize); - RNA_def_property_ui_text(prop, "Matrix", "Transformation matrix"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_matrix_update"); + RNA_def_property_ui_text(prop, "Matrix World", "Worldspace transformation matrix"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_matrix_world_update"); + + prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_multi_array(prop, 2, matrix_dimsize); + RNA_def_property_ui_text(prop, "Local Matrix", "Parent relative transformation matrix"); + RNA_def_property_float_funcs(prop, "rna_Object_matrix_local_get", "rna_Object_matrix_local_set", NULL); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, NULL); /* collections */ prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE); @@ -1711,13 +1776,13 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_struct_type(prop, "VertexGroup"); RNA_def_property_pointer_funcs(prop, "rna_Object_active_vertex_group_get", "rna_Object_active_vertex_group_set", NULL); RNA_def_property_ui_text(prop, "Active Vertex Group", "Vertex groups of the object"); - RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_update_data"); + RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_internal_update_data"); prop= RNA_def_property(srna, "active_vertex_group_index", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "actdef"); RNA_def_property_int_funcs(prop, "rna_Object_active_vertex_group_index_get", "rna_Object_active_vertex_group_index_set", "rna_Object_active_vertex_group_index_range"); RNA_def_property_ui_text(prop, "Active Vertex Group Index", "Active index in vertex group array"); - RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_update_data"); + RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_internal_update_data"); /* empty */ prop= RNA_def_property(srna, "empty_draw_type", PROP_ENUM, PROP_NONE); @@ -1728,8 +1793,8 @@ static void rna_def_object(BlenderRNA *brna) prop= RNA_def_property(srna, "empty_draw_size", PROP_FLOAT, PROP_DISTANCE); RNA_def_property_float_sdna(prop, NULL, "empty_drawsize"); - RNA_def_property_range(prop, 0.1f, 1000.0f); - RNA_def_property_ui_range(prop, 0.01, 100, 1, 1); + RNA_def_property_range(prop, 0.0001f, 1000.0f); + RNA_def_property_ui_range(prop, 0.01, 100, 1, 2); RNA_def_property_ui_text(prop, "Empty Display Size", "Size of display for empties in the viewport"); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); @@ -1782,16 +1847,19 @@ static void rna_def_object(BlenderRNA *brna) prop= RNA_def_property(srna, "restrict_view", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_VIEW); RNA_def_property_ui_text(prop, "Restrict View", "Restrict visibility in the viewport"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); prop= RNA_def_property(srna, "restrict_select", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_SELECT); RNA_def_property_ui_text(prop, "Restrict Select", "Restrict selection in the viewport"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); prop= RNA_def_property(srna, "restrict_render", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_RENDER); RNA_def_property_ui_text(prop, "Restrict Render", "Restrict renderability"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); /* anim */ @@ -1801,15 +1869,11 @@ static void rna_def_object(BlenderRNA *brna) rna_def_motionpath_common(srna); /* duplicates */ - prop= RNA_def_property(srna, "track_override_parent", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_POWERTRACK); - RNA_def_property_ui_text(prop, "Track Override Parent", "Override rotation from parenting"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); - + // XXX: evil old crap prop= RNA_def_property(srna, "slow_parent", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "partype", PARSLOW); RNA_def_property_ui_text(prop, "Slow Parent", "Create a delay in the parent relationship"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "dupli_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "transflag"); @@ -1820,7 +1884,7 @@ static void rna_def_object(BlenderRNA *brna) prop= RNA_def_property(srna, "use_dupli_frames_speed", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "transflag", OB_DUPLINOSPEED); RNA_def_property_ui_text(prop, "Dupli Frames Speed", "Set dupliframes to use the frame"); // TODO, better descriptio! - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "use_dupli_verts_rotation", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_DUPLIROT); @@ -1830,7 +1894,7 @@ static void rna_def_object(BlenderRNA *brna) prop= RNA_def_property(srna, "use_dupli_faces_scale", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_DUPLIFACES_SCALE); RNA_def_property_ui_text(prop, "Dupli Faces Inherit Scale", "Scale dupli based on face size"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "dupli_faces_scale", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "dupfacesca"); @@ -1848,58 +1912,62 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "dupsta"); RNA_def_property_range(prop, MINAFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "Dupli Frames Start", "Start frame for DupliFrames"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "dupli_frames_end", PROP_INT, PROP_NONE|PROP_UNIT_TIME); RNA_def_property_int_sdna(prop, NULL, "dupend"); RNA_def_property_range(prop, MINAFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "Dupli Frames End", "End frame for DupliFrames"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "dupli_frames_on", PROP_INT, PROP_NONE|PROP_UNIT_TIME); RNA_def_property_int_sdna(prop, NULL, "dupon"); RNA_def_property_range(prop, MINFRAME, MAXFRAME); RNA_def_property_ui_range(prop, 1, 1500, 1, 0); RNA_def_property_ui_text(prop, "Dupli Frames On", "Number of frames to use between DupOff frames"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "dupli_frames_off", PROP_INT, PROP_NONE|PROP_UNIT_TIME); RNA_def_property_int_sdna(prop, NULL, "dupoff"); RNA_def_property_range(prop, 0, MAXFRAME); RNA_def_property_ui_range(prop, 0, 1500, 1, 0); RNA_def_property_ui_text(prop, "Dupli Frames Off", "Recurring frames to exclude from the Dupliframes"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update"); prop= RNA_def_property(srna, "dupli_list", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "duplilist", NULL); RNA_def_property_struct_type(prop, "DupliObject"); RNA_def_property_ui_text(prop, "Dupli list", "Object duplis"); + prop= RNA_def_property(srna, "duplis_used", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_DUPLI); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + /* time offset */ prop= RNA_def_property(srna, "time_offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_TIME); RNA_def_property_float_sdna(prop, NULL, "sf"); RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF); - RNA_def_property_ui_text(prop, "Time Offset", "Animation offset in frames for IPO's and dupligroup instances"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_ui_text(prop, "Time Offset", "Animation offset in frames for F-Curve and dupligroup instances"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "time_offset_edit", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_OB); - RNA_def_property_ui_text(prop, "Time Offset Edit", "Use time offset when inserting keys and display time offset for IPO and action views"); + RNA_def_property_ui_text(prop, "Time Offset Edit", "Use time offset when inserting keys and display time offset for F-Curve and action views"); prop= RNA_def_property(srna, "time_offset_parent", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_PARENT); RNA_def_property_ui_text(prop, "Time Offset Parent", "Apply the time offset to this objects parent relationship"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "time_offset_particle", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_PARTICLE); RNA_def_property_ui_text(prop, "Time Offset Particle", "Let the time offset work on the particle effect"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); prop= RNA_def_property(srna, "time_offset_add_parent", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_OFFS_PARENTADD); RNA_def_property_ui_text(prop, "Time Offset Add Parent", "Add the parents time offset value"); - RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); + RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); /* drawing */ prop= RNA_def_property(srna, "max_draw_type", PROP_ENUM, PROP_NONE); @@ -1972,13 +2040,13 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "shapeflag", OB_SHAPE_LOCK); RNA_def_property_ui_text(prop, "Shape Key Lock", "Always show the current Shape for this Object"); RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1); - RNA_def_property_update(prop, 0, "rna_Object_update_data"); + RNA_def_property_update(prop, 0, "rna_Object_internal_update_data"); prop= RNA_def_property(srna, "shape_key_edit_mode", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "shapeflag", OB_SHAPE_EDIT_MODE); RNA_def_property_ui_text(prop, "Shape Key Edit Mode", "Apply shape keys in edit mode (for Meshes only)"); RNA_def_property_ui_icon(prop, ICON_EDITMODE_HLT, 0); - RNA_def_property_update(prop, 0, "rna_Object_update_data"); + RNA_def_property_update(prop, 0, "rna_Object_internal_update_data"); prop= RNA_def_property(srna, "active_shape_key", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "ShapeKey"); @@ -2023,7 +2091,7 @@ static void rna_def_dupli_object(BlenderRNA *brna) /* TODO: DupliObject has more properties that can be wrapped */ } -static void rna_def_base(BlenderRNA *brna) +static void rna_def_object_base(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; @@ -2050,17 +2118,14 @@ static void rna_def_base(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Selected", "Object base selection state"); RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Base_select_update"); - prop= RNA_def_property(srna, "selected_user", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", BA_WAS_SEL); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "User Selected", "Object base user selection state, used to restore user selection after transformations"); + RNA_api_object_base(srna); } void RNA_def_object(BlenderRNA *brna) { rna_def_object(brna); rna_def_object_game_settings(brna); - rna_def_base(brna); + rna_def_object_base(brna); rna_def_vertex_group(brna); rna_def_material_slot(brna); rna_def_dupli_object(brna); diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 649a2a9f52f..17e6630a48a 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -32,7 +32,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "DNA_object_types.h" @@ -66,25 +65,25 @@ #include "DNA_curve_types.h" #include "DNA_modifier_types.h" #include "DNA_constraint_types.h" +#include "DNA_view3d_types.h" #include "MEM_guardedalloc.h" /* copied from Mesh_getFromObject and adapted to RNA interface */ /* settings: 0 - preview, 1 - render */ -static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports, int apply_modifiers, int settings) +static Mesh *rna_Object_create_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_modifiers, int settings) { Mesh *tmpmesh; Curve *tmpcu = NULL; Object *tmpobj = NULL; int render = settings, i; int cage = !apply_modifiers; - Scene *sce = CTX_data_scene(C); /* perform the mesh extraction based on type */ - switch (ob->type) { - case OB_FONT: - case OB_CURVE: - case OB_SURF: + switch (ob->type) { + case OB_FONT: + case OB_CURVE: + case OB_SURF: /* copies object and modifiers (but not the data) */ tmpobj= copy_object(ob); @@ -116,7 +115,7 @@ static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports /* nurbs_to_mesh changes the type to a mesh, check it worked */ if (tmpobj->type != OB_MESH) { - free_libblock_us( &(CTX_data_main(C)->object), tmpobj ); + free_libblock_us( &(G.main->object), tmpobj ); BKE_report(reports, RPT_ERROR, "cant convert curve to mesh. Does the curve have any segments?"); return NULL; } @@ -124,7 +123,7 @@ static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports free_libblock_us( &G.main->object, tmpobj ); break; - case OB_MBALL: + case OB_MBALL: /* metaballs don't have modifiers, so just convert to mesh */ ob = find_basis_mball( sce, ob ); /* todo, re-generatre for render-res */ @@ -132,9 +131,9 @@ static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports tmpmesh = add_mesh("Mesh"); mball_to_mesh( &ob->disp, tmpmesh ); - break; + break; - case OB_MESH: + case OB_MESH: /* copies object and modifiers (but not the data) */ if (cage) { /* copies the data */ @@ -159,10 +158,10 @@ static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports } break; - default: + default: BKE_report(reports, RPT_ERROR, "Object does not have geometry data"); - return NULL; - } + return NULL; + } /* Copy materials to new mesh */ switch (ob->type) { @@ -234,7 +233,7 @@ static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports } /* When no longer needed, duplilist should be freed with Object.free_duplilist */ -static void rna_Object_create_duplilist(Object *ob, bContext *C, ReportList *reports) +static void rna_Object_create_duplilist(Object *ob, ReportList *reports, Scene *sce) { if (!(ob->transflag & OB_DUPLI)) { BKE_report(reports, RPT_ERROR, "Object does not have duplis."); @@ -249,7 +248,7 @@ static void rna_Object_create_duplilist(Object *ob, bContext *C, ReportList *rep ob->duplilist= NULL; } - ob->duplilist= object_duplilist(CTX_data_scene(C), ob); + ob->duplilist= object_duplilist(sce, ob); /* ob->duplilist should now be freed with Object.free_duplilist */ } @@ -273,10 +272,11 @@ static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeform ED_vgroup_vert_add(ob, def, vertex_index, weight, assignmode); } -/* copied from old API Object.makeDisplayList (Object.c) */ -static void rna_Object_make_display_list(Object *ob, bContext *C) +/* copied from old API Object.makeDisplayList (Object.c) + * use _ suffix because this exists for internal rna */ +static void rna_Object_update(Object *ob, Scene *sce, int object, int data, int time) { - Scene *sce= CTX_data_scene(C); + int flag= 0; if (ob->type == OB_FONT) { Curve *cu = ob->data; @@ -284,7 +284,11 @@ static void rna_Object_make_display_list(Object *ob, bContext *C) BKE_text_to_curve(sce, ob, CU_LEFT); } - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + if(object) flag |= OB_RECALC_OB; + if(data) flag |= OB_RECALC_DATA; + if(time) flag |= OB_RECALC_TIME; + + DAG_id_flush_update(&ob->id, flag); } static Object *rna_Object_find_armature(Object *ob) @@ -329,9 +333,9 @@ static PointerRNA rna_Object_add_shape_key(Object *ob, bContext *C, ReportList * } } -int rna_Object_is_visible(Object *ob, bContext *C) +int rna_Object_is_visible(Object *ob, Scene *sce) { - return !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->lay & CTX_data_scene(C)->lay; + return !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->lay & sce->lay; } /* @@ -409,6 +413,13 @@ void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], fl *index= -1; } +/* ObjectBase */ + +void rna_ObjectBase_layers_from_view(Base *base, View3D *v3d) +{ + base->lay= base->object->lay= v3d->lay; +} + #else void RNA_api_object(StructRNA *srna) @@ -432,7 +443,9 @@ void RNA_api_object(StructRNA *srna) /* mesh */ func= RNA_def_function(srna, "create_mesh", "rna_Object_create_mesh"); RNA_def_function_ui_description(func, "Create a Mesh datablock with modifiers applied."); - RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate modifiers."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); parm= RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply."); @@ -443,7 +456,9 @@ void RNA_api_object(StructRNA *srna) /* duplis */ func= RNA_def_function(srna, "create_dupli_list", "rna_Object_create_duplilist"); RNA_def_function_ui_description(func, "Create a list of dupli objects for this object, needs to be freed manually with free_dupli_list."); - RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate duplis."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + RNA_def_function_flag(func, FUNC_USE_REPORTS); func= RNA_def_function(srna, "free_dupli_list", "rna_Object_free_duplilist"); RNA_def_function_ui_description(func, "Free the list of dupli objects."); @@ -507,17 +522,34 @@ void RNA_api_object(StructRNA *srna) /* DAG */ - func= RNA_def_function(srna, "make_display_list", "rna_Object_make_display_list"); - RNA_def_function_ui_description(func, "Update object's display data."); /* XXX describe better */ - RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "update", "rna_Object_update"); + RNA_def_function_ui_description(func, "Tag the object to update its display data."); + parm= RNA_def_pointer(func, "scene", "Scene", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + RNA_def_boolean(func, "object", 1, "", "Tag the object for updating"); + RNA_def_boolean(func, "data", 1, "", "Tag the objects display data for updating"); + RNA_def_boolean(func, "time", 1, "", "Tag the object time related data for updating"); /* View */ func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible"); - RNA_def_function_ui_description(func, "Determine if object is visible in active scene."); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); + RNA_def_function_ui_description(func, "Determine if object is visible in a given scene."); + parm= RNA_def_pointer(func, "scene", "Scene", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); parm= RNA_def_boolean(func, "is_visible", 0, "", "Object visibility."); RNA_def_function_return(func, parm); } + +void RNA_api_object_base(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "layers_from_view", "rna_ObjectBase_layers_from_view"); + RNA_def_function_ui_description(func, "Sets the object layers from a 3D View (use when adding an object in local view)."); + parm= RNA_def_pointer(func, "view", "SpaceView3D", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); +} + #endif diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 259f634c59d..97c429209de 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -61,23 +60,23 @@ EnumPropertyItem empty_shape_items[] = { }; EnumPropertyItem vortex_shape_items[] = { - {PFIELD_SHAPE_POINT, "POINT", 0, "Old", ""}, - {PFIELD_SHAPE_PLANE, "PLANE", 0, "New", ""}, + {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""}, + {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""}, {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Surface falloff (New)", ""}, {PFIELD_SHAPE_POINTS, "POINTS", 0, "Every Point (New)", ""}, {0, NULL, 0, NULL, NULL} }; EnumPropertyItem curve_vortex_shape_items[] = { - {PFIELD_SHAPE_POINT, "POINT", 0, "Old", ""}, - {PFIELD_SHAPE_PLANE, "PLANE", 0, "New", ""}, + {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""}, + {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""}, {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Curve (New)", ""}, {0, NULL, 0, NULL, NULL} }; EnumPropertyItem empty_vortex_shape_items[] = { - {PFIELD_SHAPE_POINT, "POINT", 0, "Old", ""}, - {PFIELD_SHAPE_PLANE, "PLANE", 0, "New", ""}, + {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""}, + {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""}, {0, NULL, 0, NULL, NULL} }; @@ -109,7 +108,7 @@ static void rna_Cache_change(Main *bmain, Scene *scene, PointerRNA *ptr) cache->flag |= PTCACHE_OUTDATED; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); DAG_id_flush_update(&ob->id, OB_RECALC_DATA); @@ -134,7 +133,7 @@ static void rna_Cache_toggle_disk_cache(Main *bmain, Scene *scene, PointerRNA *p if(!ob) return; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache==cache) @@ -161,7 +160,7 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr) /* TODO: check for proper characters */ - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); if(cache->flag & PTCACHE_EXTERNAL) { for(pid=pidlist.first; pid; pid=pid->next) { @@ -220,7 +219,7 @@ static void rna_Cache_list_begin(CollectionPropertyIterator *iter, PointerRNA *p PTCacheID *pid; ListBase pidlist; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache == cache) { @@ -238,7 +237,7 @@ static void rna_Cache_active_point_cache_index_range(PointerRNA *ptr, int *min, PTCacheID *pid; ListBase pidlist; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); *min= 0; *max= 0; @@ -262,7 +261,7 @@ static int rna_Cache_active_point_cache_index_get(PointerRNA *ptr) ListBase pidlist; int num = 0; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache == cache) { @@ -283,7 +282,7 @@ static void rna_Cache_active_point_cache_index_set(struct PointerRNA *ptr, int v PTCacheID *pid; ListBase pidlist; - BKE_ptcache_ids_from_object(&pidlist, ob); + BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0); for(pid=pidlist.first; pid; pid=pid->next) { if(pid->cache == cache) { @@ -358,14 +357,19 @@ static void rna_SoftBodySettings_self_collision_set(PointerRNA *ptr, int value) static int rna_SoftBodySettings_new_aero_get(PointerRNA *ptr) { Object *data= (Object*)(ptr->id.data); - return (((data->softflag) & OB_SB_AERO_ANGLE) != 0); + if (data->softflag & OB_SB_AERO_ANGLE) + return 1; + else + return 0; } static void rna_SoftBodySettings_new_aero_set(PointerRNA *ptr, int value) { Object *data= (Object*)(ptr->id.data); - if(value) data->softflag |= OB_SB_AERO_ANGLE; - else data->softflag &= ~OB_SB_AERO_ANGLE; + if (value == 1) + data->softflag |= OB_SB_AERO_ANGLE; + else /* value == 0 */ + data->softflag &= ~OB_SB_AERO_ANGLE; } static int rna_SoftBodySettings_face_collision_get(PointerRNA *ptr) @@ -455,7 +459,7 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr) part->pd2->tex= 0; } - DAG_id_flush_update(&part->id, OB_RECALC|PSYS_RECALC_RESET); + DAG_id_flush_update(&part->id, OB_RECALC_ALL|PSYS_RECALC_RESET); WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL); } @@ -497,7 +501,7 @@ static void rna_FieldSettings_shape_update(Main *bmain, Scene *scene, PointerRNA static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr) { if(particle_id_check(ptr)) { - DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC|PSYS_RECALC_RESET); + DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_ALL|PSYS_RECALC_RESET); } else { Object *ob= (Object*)ptr->id.data; @@ -514,7 +518,7 @@ static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, Point DAG_scene_sort(scene); if(ob->type == OB_CURVE && ob->pd->forcefield == PFIELD_GUIDE) - DAG_id_flush_update(&ob->id, OB_RECALC); + DAG_id_flush_update(&ob->id, OB_RECALC_ALL); else DAG_id_flush_update(&ob->id, OB_RECALC_OB); @@ -624,7 +628,7 @@ static void rna_CollisionSettings_update(Main *bmain, Scene *scene, PointerRNA * { Object *ob= (Object*)ptr->id.data; - DAG_id_flush_update(&ob->id, OB_RECALC); + DAG_id_flush_update(&ob->id, OB_RECALC_ALL); WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob); } @@ -678,14 +682,14 @@ static void rna_def_pointcache(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Point Cache", "Point cache for physics simulations"); RNA_def_struct_ui_icon(srna, ICON_PHYSICS); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "startframe"); - RNA_def_property_range(prop, 1, 300000); + RNA_def_property_range(prop, 1, MAXFRAME); RNA_def_property_ui_text(prop, "Start", "Frame on which the simulation starts"); - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "endframe"); - RNA_def_property_range(prop, 1, 300000); + RNA_def_property_range(prop, 1, MAXFRAME); RNA_def_property_ui_text(prop, "End", "Frame on which the simulation stops"); prop= RNA_def_property(srna, "step", PROP_INT, PROP_NONE); @@ -710,7 +714,7 @@ static void rna_def_pointcache(BlenderRNA *brna) prop= RNA_def_property(srna, "disk_cache", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_DISK_CACHE); - RNA_def_property_ui_text(prop, "Disk Cache", "Save cache files to disk"); + RNA_def_property_ui_text(prop, "Disk Cache", "Save cache files to disk (.blend file must be saved first)"); RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_toggle_disk_cache"); prop= RNA_def_property(srna, "outdated", PROP_BOOLEAN, PROP_NONE); @@ -747,6 +751,11 @@ static void rna_def_pointcache(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_EXTERNAL); RNA_def_property_ui_text(prop, "External", "Read cache from an external location"); RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); + + prop= RNA_def_property(srna, "use_library_path", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PTCACHE_IGNORE_LIBPATH); + RNA_def_property_ui_text(prop, "Library Path", "Use this files path when library linked into another file."); + RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); prop= RNA_def_property(srna, "point_cache_list", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_funcs(prop, "rna_Cache_list_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0); @@ -870,8 +879,6 @@ static void rna_def_effector_weight(BlenderRNA *brna) /* General */ prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, NULL, "group"); - RNA_def_property_struct_type(prop, "Group"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this Group"); RNA_def_property_update(prop, 0, "rna_EffectorWeight_dependency_update"); @@ -1265,19 +1272,24 @@ static void rna_def_field(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GUIDE_PATH_ADD); RNA_def_property_ui_text(prop, "Additive", "Based on distance/falloff it adds a portion of the entire path"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); + + prop= RNA_def_property(srna, "use_guide_path_weight", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GUIDE_PATH_WEIGHT); + RNA_def_property_ui_text(prop, "Weights", "Use curve weights to influence the particle influence along the curve"); + RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); /* Clump Settings */ prop= RNA_def_property(srna, "guide_clump_amount", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "clump_fac"); RNA_def_property_range(prop, -1.0f, 1.0f); - RNA_def_property_ui_text(prop, "Amount", "Amount of clumpimg"); + RNA_def_property_ui_text(prop, "Amount", "Amount of clumping"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); prop= RNA_def_property(srna, "guide_clump_shape", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "clump_pow"); RNA_def_property_range(prop, -0.999f, 0.999f); - RNA_def_property_ui_text(prop, "Shape", "Shape of clumpimg"); + RNA_def_property_ui_text(prop, "Shape", "Shape of clumping"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); /* Kink Settings */ @@ -1303,7 +1315,7 @@ static void rna_def_field(BlenderRNA *brna) prop= RNA_def_property(srna, "guide_kink_shape", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "kink_shape"); RNA_def_property_range(prop, -0.999f, 0.999f); - RNA_def_property_ui_text(prop, "Shape", "djust the offset to the beginning/end"); + RNA_def_property_ui_text(prop, "Shape", "Adjust the offset to the beginning/end"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); prop= RNA_def_property(srna, "guide_kink_amplitude", PROP_FLOAT, PROP_NONE); @@ -1397,6 +1409,11 @@ static void rna_def_softbody(BlenderRNA *brna) {SBC_MODE_MAX, "MAXIMAL", 0, "Maximal", "Maximal Spring length * Ball Size"}, {SBC_MODE_AVGMINMAX, "MINMAX", 0, "AvMinMax", "(Min+Max)/2 * Ball Size"}, {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem aerodynamics_type[] = { + {0, "SIMPLE", 0, "Simple", "Edges receive a drag force from surrounding media"}, + {1, "LIFT_FORCE", 0, "Lift Force", "Edges receive a lift force when passing through surrounding media"}, + {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SoftBodySettings", NULL); RNA_def_struct_sdna(srna, "SoftBody"); @@ -1414,7 +1431,7 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "nodemass"); RNA_def_property_range(prop, 0.0f, 50000.0f); - RNA_def_property_ui_text(prop, "Mass", ""); + RNA_def_property_ui_text(prop, "Mass", "General Mass value"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "mass_vertex_group", PROP_STRING, PROP_NONE); @@ -1423,6 +1440,7 @@ static void rna_def_softbody(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoftBodySettings_mass_vgroup_set"); RNA_def_property_update(prop, 0, "rna_softbody_update"); + /* no longer used */ prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION); RNA_def_property_float_sdna(prop, NULL, "grav"); RNA_def_property_range(prop, -10.0f, 10.0f); @@ -1439,23 +1457,25 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "goal_vertex_group", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "vertgroup"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* not impossible .. but not supported yet */ RNA_def_property_string_funcs(prop, "rna_SoftBodySettings_goal_vgroup_get", "rna_SoftBodySettings_goal_vgroup_length", "rna_SoftBodySettings_goal_vgroup_set"); RNA_def_property_ui_text(prop, "Goal Vertex Group", "Control point weight values"); prop= RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "mingoal"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range"); + RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex weights are scaled to match this range"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "maxgoal"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range"); + RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex weights are scaled to match this range"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "defgoal"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_range(prop, 0.0f, 1.0f); RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used"); RNA_def_property_update(prop, 0, "rna_softbody_update"); @@ -1532,11 +1552,13 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "sbc_mode"); RNA_def_property_enum_items(prop, collision_type_items); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Collision Type", "Choose Collision Type"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "ball_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "colball"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* code is not ready for that yet */ RNA_def_property_range(prop, -10.0f, 10.0f); RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manual adjusted"); RNA_def_property_update(prop, 0, "rna_softbody_update"); @@ -1544,7 +1566,7 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "ball_stiff", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ballstiff"); RNA_def_property_range(prop, 0.001f, 100.0f); - RNA_def_property_ui_text(prop, "Ball Size", "Ball inflating presure"); + RNA_def_property_ui_text(prop, "Ball Size", "Ball inflating pressure"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "ball_damp", PROP_FLOAT, PROP_NONE); @@ -1582,7 +1604,7 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "fuzzy", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "fuzzyness"); RNA_def_property_range(prop, 1, 100); - RNA_def_property_ui_text(prop, "Fuzzy", "Fuzzyness while on collision, high values make collsion handling faster but less stable"); + RNA_def_property_ui_text(prop, "Fuzzy", "Fuzziness while on collision, high values make collsion handling faster but less stable"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE); @@ -1596,7 +1618,7 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "estimate_matrix", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_ESTIMATEIPO); - RNA_def_property_ui_text(prop, "Estimate matrix", "esimate matrix .. split to COM , ROT ,SCALE "); + RNA_def_property_ui_text(prop, "Estimate matrix", "estimate matrix .. split to COM , ROT ,SCALE "); /***********************************************************************************/ @@ -1625,16 +1647,19 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "use_goal", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_goal_get", "rna_SoftBodySettings_use_goal_set"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Use Goal", "Define forces for vertices to stick to animated position"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "use_edges", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_edges_get", "rna_SoftBodySettings_use_edges_set"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Use Edges", "Use Edges as springs"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "stiff_quads", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_stiff_quads_get", "rna_SoftBodySettings_stiff_quads_set"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Stiff Quads", "Adds diagonal springs on 4-gons"); RNA_def_property_update(prop, 0, "rna_softbody_update"); @@ -1645,16 +1670,18 @@ static void rna_def_softbody(BlenderRNA *brna) prop= RNA_def_property(srna, "face_collision", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_face_collision_get", "rna_SoftBodySettings_face_collision_set"); - RNA_def_property_ui_text(prop, "Face Collision", "Faces collide too, SLOOOOOW warning"); + RNA_def_property_ui_text(prop, "Face Collision", "Faces collide too, can be very slow"); RNA_def_property_update(prop, 0, "rna_softbody_update"); - prop= RNA_def_property(srna, "new_aero", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_new_aero_get", "rna_SoftBodySettings_new_aero_set"); - RNA_def_property_ui_text(prop, "N", "New aero(uses angle and length)"); + prop= RNA_def_property(srna, "aerodynamics_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, aerodynamics_type); + RNA_def_property_enum_funcs(prop, "rna_SoftBodySettings_new_aero_get", "rna_SoftBodySettings_new_aero_set", NULL); + RNA_def_property_ui_text(prop, "Aerodynamics Type", "Method of calculating aerodynamic interaction"); RNA_def_property_update(prop, 0, "rna_softbody_update"); prop= RNA_def_property(srna, "self_collision", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_self_collision_get", "rna_SoftBodySettings_self_collision_set"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Self Collision", "Enable naive vertex ball self collision"); RNA_def_property_update(prop, 0, "rna_softbody_update"); diff --git a/source/blender/makesrna/intern/rna_packedfile.c b/source/blender/makesrna/intern/rna_packedfile.c index be0d948b2d1..41c4d9b2769 100644 --- a/source/blender/makesrna/intern/rna_packedfile.c +++ b/source/blender/makesrna/intern/rna_packedfile.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index 4028ef28307..74bc564064e 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -28,8 +28,6 @@ #include "limits.h" #include "RNA_define.h" -#include "RNA_types.h" -#include "RNA_access.h" #include "rna_internal.h" @@ -108,6 +106,92 @@ EnumPropertyItem part_hair_ren_as_items[] = { #include "BLI_math.h" #include "BLI_listbase.h" +/* use for object space hair get/set */ +static void rna_ParticleHairKey_location_object_info(PointerRNA *ptr, ParticleSystemModifierData **psmd_pt, ParticleData **pa_pt) +{ + HairKey *hkey= (HairKey *)ptr->data; + Object *ob = (Object *)ptr->id.data; + ModifierData *md; + ParticleSystemModifierData *psmd=NULL; + ParticleSystem *psys; + ParticleData *pa; + int i; + + *psmd_pt= NULL; + *pa_pt= NULL; + + /* weak, what about multiple particle systems? */ + for (md = ob->modifiers.first; md; md=md->next) { + if (md->type == eModifierType_ParticleSystem) + psmd= (ParticleSystemModifierData*) md; + } + + if (!psmd || !psmd->dm || !psmd->psys) { + return; + } + + psys= psmd->psys; + + /* not a very efficient way of getting hair key location data, + * but it's the best we've got at the present */ + + /* find the particle that corresponds with this HairKey */ + for(i=0, pa=psys->particles; itotpart; i++, pa++) { + + /* hairkeys are stored sequentially in memory, so we can find if + * it's the same particle by comparing pointers, without having + * to iterate over them all */ + if ((hkey >= pa->hair) && (hkey < pa->hair + pa->totkey)) + break; + } + + *psmd_pt= psmd; + *pa_pt= pa; +} + +static void rna_ParticleHairKey_location_object_get(PointerRNA *ptr, float *values) +{ + HairKey *hkey= (HairKey *)ptr->data; + Object *ob = (Object *)ptr->id.data; + ParticleSystemModifierData *psmd; + ParticleData *pa; + + rna_ParticleHairKey_location_object_info(ptr, &psmd, &pa); + + if(pa) { + float hairmat[4][4]; + psys_mat_hair_to_object(ob, psmd->dm, psmd->psys->part->from, pa, hairmat); + copy_v3_v3(values, hkey->co); + mul_m4_v3(hairmat, values); + } + else { + zero_v3(values); + } +} + +static void rna_ParticleHairKey_location_object_set(PointerRNA *ptr, const float *values) +{ + HairKey *hkey= (HairKey *)ptr->data; + Object *ob = (Object *)ptr->id.data; + ParticleSystemModifierData *psmd; + ParticleData *pa; + + rna_ParticleHairKey_location_object_info(ptr, &psmd, &pa); + + if(pa) { + float hairmat[4][4]; + float imat[4][4]; + + psys_mat_hair_to_object(ob, psmd->dm, psmd->psys->part->from, pa, hairmat); + invert_m4_m4(imat, hairmat); + copy_v3_v3(hkey->co, values); + mul_m4_v3(imat, hkey->co); + } + else { + zero_v3(hkey->co); + } +} + /* property update functions */ static void particle_recalc(Main *bmain, Scene *scene, PointerRNA *ptr, short flag) { @@ -121,7 +205,7 @@ static void particle_recalc(Main *bmain, Scene *scene, PointerRNA *ptr, short fl else DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|flag); - WM_main_add_notifier(NC_OBJECT|ND_PARTICLE_DATA, NULL); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); } static void rna_Particle_redo(Main *bmain, Scene *scene, PointerRNA *ptr) { @@ -185,7 +269,7 @@ static void rna_Particle_target_reset(Main *bmain, Scene *scene, PointerRNA *ptr DAG_scene_sort(scene); } - WM_main_add_notifier(NC_OBJECT|ND_PARTICLE_DATA, NULL); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); } static void rna_Particle_target_redo(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -197,7 +281,7 @@ static void rna_Particle_target_redo(Main *bmain, Scene *scene, PointerRNA *ptr) psys->recalc = PSYS_RECALC_REDO; DAG_id_flush_update(&ob->id, OB_RECALC_DATA); - WM_main_add_notifier(NC_OBJECT|ND_PARTICLE_DATA, NULL); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); } } @@ -213,7 +297,7 @@ static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *pt rna_Particle_redo(bmain, scene, ptr); } else - WM_main_add_notifier(NC_OBJECT|ND_PARTICLE_DATA, NULL); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); } static PointerRNA rna_particle_settings_get(PointerRNA *ptr) { @@ -639,6 +723,7 @@ static void rna_ParticleVGroup_name_set_9(PointerRNA *ptr, const char *value) { static void rna_ParticleVGroup_name_set_10(PointerRNA *ptr, const char *value) { psys_vg_name_set__internal(ptr, value, 10); } static void rna_ParticleVGroup_name_set_11(PointerRNA *ptr, const char *value) { psys_vg_name_set__internal(ptr, value, 11); } + #else static void rna_def_particle_hair_key(BlenderRNA *brna) @@ -650,16 +735,21 @@ static void rna_def_particle_hair_key(BlenderRNA *brna) RNA_def_struct_sdna(srna, "HairKey"); RNA_def_struct_ui_text(srna, "Particle Hair Key", "Particle key for hair particle system"); - prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION); - RNA_def_property_float_sdna(prop, NULL, "co"); - RNA_def_property_ui_text(prop, "Location", "Key location"); - prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_ui_text(prop, "Time", "Relative time of key over hair length"); prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_ui_text(prop, "Weight", "Weight for cloth simulation"); + + prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Location (Object Space)", "Location of the hair key in object space"); + RNA_def_property_float_funcs(prop, "rna_ParticleHairKey_location_object_get", "rna_ParticleHairKey_location_object_set", NULL); + + prop= RNA_def_property(srna, "location_hairspace", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_float_sdna(prop, NULL, "co"); + RNA_def_property_ui_text(prop, "Location", "Location of the hair key in its internal coordinate system, relative to the emitting face"); } static void rna_def_particle_key(BlenderRNA *brna) @@ -798,17 +888,15 @@ static void rna_def_particle(BlenderRNA *brna) // int totkey; /* flag */ - prop= RNA_def_property(srna, "unexist", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_UNEXIST); - RNA_def_property_ui_text(prop, "unexist", ""); + prop= RNA_def_property(srna, "is_existing", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PARS_UNEXIST); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Exists", ""); - prop= RNA_def_property(srna, "no_disp", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_NO_DISP); - RNA_def_property_ui_text(prop, "no_disp", ""); - - prop= RNA_def_property(srna, "rekey", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_REKEY); - RNA_def_property_ui_text(prop, "rekey", ""); + prop= RNA_def_property(srna, "is_visible", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PARS_NO_DISP); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Visible", ""); prop= RNA_def_property(srna, "alive_state", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "alive"); @@ -839,6 +927,74 @@ static void rna_def_particle_dupliweight(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Particle_redo"); } +static void rna_def_fluid_settings(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "SPHFluidSettings", NULL); + RNA_def_struct_ui_text(srna, "SPH Fluid Settings", "Settings for particle fluids physics"); + + /* Fluid settings */ + prop= RNA_def_property(srna, "spring_k", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "spring_k"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Spring", "Spring force constant"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "fluid_radius", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "radius"); + RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_ui_text(prop, "Radius", "Fluid interaction Radius"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "rest_length"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Rest Length", "The Spring Rest Length (factor of interaction radius)"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + /* Viscosity */ + prop= RNA_def_property(srna, "viscosity_omega", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "viscosity_omega"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Viscosity", "Linear viscosity"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "viscosity_beta", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "viscosity_beta"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Square viscosity", "Square viscosity factor"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + /* Double density relaxation */ + prop= RNA_def_property(srna, "stiffness_k", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "stiffness_k"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Stiffness ", "Constant K - Stiffness"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "stiffness_knear", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "stiffness_knear"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Repulsion", "Repulsion factor: stiffness_knear"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "rest_density", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "rest_density"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Rest Density", "Density"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + /* Buoyancy */ + prop= RNA_def_property(srna, "buoyancy", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "buoyancy"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Buoyancy", ""); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + +} + static void rna_def_particle_settings(BlenderRNA *brna) { StructRNA *srna; @@ -863,6 +1019,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) {PART_PHYS_NEWTON, "NEWTON", 0, "Newtonian", ""}, {PART_PHYS_KEYED, "KEYED", 0, "Keyed", ""}, {PART_PHYS_BOIDS, "BOIDS", 0, "Boids", ""}, + {PART_PHYS_FLUID, "FLUID", 0, "Fluid", ""}, {0, NULL, 0, NULL, NULL} }; @@ -974,11 +1131,6 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Multi React", "React multiple times"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); - /* TODO: used somewhere? */ - prop= RNA_def_property(srna, "hair_geometry", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_GEOMETRY); - RNA_def_property_ui_text(prop, "Hair Geometry", "");//TODO: tooltip - prop= RNA_def_property(srna, "unborn", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_UNBORN); RNA_def_property_ui_text(prop, "Unborn", "Show particles before they are emitted"); @@ -1065,11 +1217,6 @@ static void rna_def_particle_settings(BlenderRNA *brna) //RNA_def_property_ui_text(prop, "Use seams", "Use seams to determine parents"); //RNA_def_property_update(prop, 0, "rna_Particle_redo_child"); - /* TODO: used somewhere? */ - prop= RNA_def_property(srna, "child_render", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_RENDER); - RNA_def_property_ui_text(prop, "child_render", ""); - prop= RNA_def_property(srna, "child_guide", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_GUIDE); RNA_def_property_ui_text(prop, "child_guide", ""); @@ -1317,7 +1464,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "bb_uv_split"); RNA_def_property_range(prop, 1, 100); RNA_def_property_ui_range(prop, 1, 10, 1, 0); - RNA_def_property_ui_text(prop, "UV Split", "Amount of rows/columns to split uv coordinates for billboards"); + RNA_def_property_ui_text(prop, "UV Split", "Amount of rows/columns to split UV coordinates for billboards"); prop= RNA_def_property(srna, "billboard_animation", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "bb_anim"); @@ -1361,7 +1508,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "simplify_refsize", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "simplify_refsize"); RNA_def_property_range(prop, 1, 32768); - RNA_def_property_ui_text(prop, "Reference Size", "Reference size size in pixels, after which simplification begins"); + RNA_def_property_ui_text(prop, "Reference Size", "Reference size in pixels, after which simplification begins"); prop= RNA_def_property(srna, "simplify_rate", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0f, 1.0f); @@ -1376,7 +1523,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Rate", "Speed of Simplification"); /* general values */ - prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "sta");//optional if prop names are the same RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); @@ -1384,7 +1531,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Start", "Frame # to start emitting particles"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); - prop= RNA_def_property(srna, "end", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "end"); RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); @@ -1409,6 +1557,11 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_ui_range(prop, 0, 10, 1, 3); RNA_def_property_ui_text(prop, "Tweak", "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 0, 1000); + RNA_def_property_ui_text(prop, "Subframes", "Subframes to simulate for improved stability and finer granularity simulations"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); prop= RNA_def_property(srna, "jitter_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); @@ -1420,7 +1573,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "effect_hair", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "eff_hair"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Stiffnes", "Hair stiffness for effectors"); + RNA_def_property_ui_text(prop, "Stiffness", "Hair stiffness for effectors"); RNA_def_property_update(prop, 0, "rna_Particle_redo"); prop= RNA_def_property(srna, "amount", PROP_INT, PROP_UNSIGNED); @@ -1568,7 +1721,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "brownfac"); RNA_def_property_range(prop, 0.0f, 200.0f); RNA_def_property_ui_range(prop, 0, 20, 1, 3); - RNA_def_property_ui_text(prop, "Brownian", "Specify the amount of brownian motion"); + RNA_def_property_ui_text(prop, "Brownian", "Specify the amount of Brownian motion"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); prop= RNA_def_property(srna, "damp_factor", PROP_FLOAT, PROP_NONE); @@ -1775,9 +1928,14 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_struct_type(prop, "BoidSettings"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Boid Settings", ""); - + + /* Fluid particles */ + prop= RNA_def_property(srna, "fluid", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "SPHFluidSettings"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "SPH Fluid Settings", ""); + /* draw objects & groups */ - prop= RNA_def_property(srna, "dupli_group", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "dup_group"); RNA_def_property_struct_type(prop, "Group"); @@ -2164,12 +2322,13 @@ void RNA_def_particle(BlenderRNA *brna) rna_def_particle_hair_key(brna); rna_def_particle_key(brna); - + rna_def_fluid_settings(brna); + rna_def_child_particle(brna); rna_def_particle(brna); rna_def_particle_dupliweight(brna); rna_def_particle_system(brna); - rna_def_particle_settings(brna); + rna_def_particle_settings(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 240d02f7f9e..211583e3df6 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "rna_internal.h" @@ -38,6 +37,7 @@ #include "DNA_scene_types.h" #include "BLI_math.h" +#include "BLI_ghash.h" #include "WM_types.h" @@ -197,12 +197,12 @@ static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value) { Object *ob= (Object*)ptr->id.data; bPoseChannel *pchan= (bPoseChannel*)ptr->data; - char oldname[32], newname[32]; - + char oldname[sizeof(pchan->name)], newname[sizeof(pchan->name)]; + /* need to be on the stack */ - BLI_strncpy(newname, value, 32); - BLI_strncpy(oldname, pchan->name, 32); - + BLI_strncpy(newname, value, sizeof(pchan->name)); + BLI_strncpy(oldname, pchan->name, sizeof(pchan->name)); + ED_armature_bone_rename(ob->data, oldname, newname); } @@ -431,7 +431,7 @@ static void rna_PoseChannel_active_constraint_set(PointerRNA *ptr, PointerRNA va constraints_set_active(&pchan->constraints, (bConstraint *)value.data); } -static bConstraint *rna_PoseChannel_constraints_new(bPoseChannel *pchan, bContext *C, int type) +static bConstraint *rna_PoseChannel_constraints_new(bPoseChannel *pchan, int type) { //WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT|NA_ADDED, object); // TODO, pass object also @@ -439,7 +439,7 @@ static bConstraint *rna_PoseChannel_constraints_new(bPoseChannel *pchan, bContex return add_pose_constraint(NULL, pchan, NULL, type); } -static int rna_PoseChannel_constraints_remove(bPoseChannel *pchan, bContext *C, int index) +static int rna_PoseChannel_constraints_remove(bPoseChannel *pchan, int index) { // TODO //ED_object_constraint_set_active(object, NULL); @@ -526,11 +526,23 @@ PointerRNA rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key) { PointerRNA rptr; bPose *pose= (bPose*)ptr->data; - bPoseChannel *pchan= BLI_findstring(&pose->chanbase, key, offsetof(bPoseChannel, name)); + bPoseChannel *pchan= get_pose_channel(pose, key); RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr); return rptr; } +static void rna_PoseChannel_matrix_local_get(PointerRNA *ptr, float *values) +{ + bPoseChannel *pchan= (bPoseChannel*)ptr->data; + pchan_to_mat4(pchan, (float (*)[4])values); +} + +static void rna_PoseChannel_matrix_local_set(PointerRNA *ptr, const float *values) +{ + bPoseChannel *pchan= (bPoseChannel*)ptr->data; + pchan_apply_mat4(pchan, (float (*)[4])values); +} + #else static void rna_def_bone_group(BlenderRNA *brna) @@ -627,7 +639,6 @@ static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cpro /* Constraint collection */ func= RNA_def_function(srna, "new", "rna_PoseChannel_constraints_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Add a constraint to this object"); /* return type */ parm= RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint."); @@ -637,7 +648,6 @@ static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cpro RNA_def_property_flag(parm, PROP_REQUIRED); func= RNA_def_function(srna, "remove", "rna_PoseChannel_constraints_remove"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Remove a constraint from this object."); /* return type */ parm= RNA_def_boolean(func, "success", 0, "Success", "Removed the constraint successfully."); @@ -764,12 +774,17 @@ static void rna_def_pose_channel(BlenderRNA *brna) RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); /* transform matrices - should be read-only since these are set directly by AnimSys evaluation */ - prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX); + prop= RNA_def_property(srna, "matrix_channel", PROP_FLOAT, PROP_MATRIX); RNA_def_property_float_sdna(prop, NULL, "chan_mat"); RNA_def_property_array(prop, 16); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints"); - + + prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_array(prop, 16); + RNA_def_property_ui_text(prop, "Local Matrix", "Matrix representing the parent relative location, scale and rotation. Provides an alternative access to these properties."); + RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_local_get", "rna_PoseChannel_matrix_local_set", NULL); + prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX); RNA_def_property_float_sdna(prop, NULL, "pose_mat"); RNA_def_property_array(prop, 16); @@ -965,6 +980,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable"); RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); @@ -972,6 +988,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable"); RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); @@ -979,6 +996,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) prop= RNA_def_property(srna, "lock_rotation_w", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTW); RNA_def_property_ui_text(prop, "Lock Rotation (4D Angle)", "Lock editing of 'angle' component of four-component rotations in the interface"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable"); RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); @@ -993,6 +1011,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface"); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable"); RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); @@ -1050,7 +1069,7 @@ static void rna_def_pose_itasc(BlenderRNA *brna) prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_AUTO_STEP); - RNA_def_property_ui_text(prop, "Auto step", "Automatically determine the optimal number of steps for best performance/accurary trade off"); + RNA_def_property_ui_text(prop, "Auto step", "Automatically determine the optimal number of steps for best performance/accuracy trade off"); RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update"); prop= RNA_def_property(srna, "min_step", PROP_FLOAT, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_pose_api.c b/source/blender/makesrna/intern/rna_pose_api.c index 6863a168b20..d5280f6beda 100644 --- a/source/blender/makesrna/intern/rna_pose_api.c +++ b/source/blender/makesrna/intern/rna_pose_api.c @@ -32,7 +32,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "DNA_object_types.h" diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c index ff410d11ca7..7bcb58ea28d 100644 --- a/source/blender/makesrna/intern/rna_property.c +++ b/source/blender/makesrna/intern/rna_property.c @@ -25,12 +25,13 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" #include "DNA_property_types.h" +#include "WM_types.h" + #ifdef RNA_RUNTIME #include "BKE_property.h" @@ -109,27 +110,32 @@ void RNA_def_gameproperty(BlenderRNA *brna) RNA_def_struct_refine_func(srna, "rna_GameProperty_refine"); prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text(prop, "Name", "Available as as GameObject attributes in the game engines python api"); + RNA_def_property_ui_text(prop, "Name", "Available as GameObject attributes in the game engine's python API"); RNA_def_struct_name_property(srna, prop); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GameProperty_name_set"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, gameproperty_type_items); RNA_def_property_ui_text(prop, "Type", ""); RNA_def_property_enum_funcs(prop, NULL, "rna_GameProperty_type_set", NULL); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PROP_DEBUG); RNA_def_property_ui_text(prop, "Debug", "Print debug information for this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* GameBooleanProperty */ srna= RNA_def_struct(brna, "GameBooleanProperty", "GameProperty"); - RNA_def_struct_ui_text(srna , "Game Boolean Property", "Game engine user defined boolean property"); + RNA_def_struct_ui_text(srna , "Game Boolean Property", "Game engine user defined Boolean property"); RNA_def_struct_sdna(srna, "bProperty"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "value", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "data", 1); RNA_def_property_ui_text(prop, "Value", "Property value"); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* GameIntProperty */ srna= RNA_def_struct(brna, "GameIntProperty", "GameProperty"); @@ -140,6 +146,7 @@ void RNA_def_gameproperty(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "data"); RNA_def_property_ui_text(prop, "Value", "Property value"); RNA_def_property_range(prop, -10000, 10000); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* GameFloatProperty */ srna= RNA_def_struct(brna, "GameFloatProperty", "GameProperty"); @@ -151,6 +158,7 @@ void RNA_def_gameproperty(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Value", "Property value"); RNA_def_property_range(prop, -10000, 10000); RNA_def_property_float_funcs(prop, "rna_GameFloatProperty_value_get", "rna_GameFloatProperty_value_set", NULL); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* GameTimerProperty */ srna= RNA_def_struct(brna, "GameTimerProperty", "GameProperty"); @@ -162,6 +170,7 @@ void RNA_def_gameproperty(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Value", "Property value"); RNA_def_property_range(prop, -10000, 10000); RNA_def_property_float_funcs(prop, "rna_GameFloatProperty_value_get", "rna_GameFloatProperty_value_set", NULL); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* GameStringProperty */ srna= RNA_def_struct(brna, "GameStringProperty", "GameProperty"); @@ -172,6 +181,7 @@ void RNA_def_gameproperty(BlenderRNA *brna) RNA_def_property_string_sdna(prop, NULL, "poin"); RNA_def_property_string_maxlength(prop, MAX_PROPSTRING); RNA_def_property_ui_text(prop, "Value", "Property value"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } #endif diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index c52d60f5d41..d00507e8bcf 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -27,11 +27,9 @@ #include "DNA_scene_types.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" -#include "WM_types.h" #include "RE_pipeline.h" @@ -44,7 +42,6 @@ #include "BKE_context.h" #include "BKE_report.h" -#include "WM_api.h" /* RenderEngine */ @@ -210,14 +207,12 @@ static int rna_RenderPass_rect_get_length(PointerRNA *ptr, int length[RNA_MAX_AR static void rna_RenderPass_rect_get(PointerRNA *ptr, float *values) { RenderPass *rpass= (RenderPass*)ptr->data; - printf("rect get\n"); memcpy(values, rpass->rect, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels); } static void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values) { RenderPass *rpass= (RenderPass*)ptr->data; - printf("rect set\n"); memcpy(rpass->rect, values, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels); } @@ -282,6 +277,14 @@ static void rna_def_render_engine(BlenderRNA *brna) RNA_def_property_string_sdna(prop, NULL, "type->name"); RNA_def_property_flag(prop, PROP_REGISTER); + prop= RNA_def_property(srna, "bl_preview", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_DO_PREVIEW); + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + + prop= RNA_def_property(srna, "bl_postprocess", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", RE_DO_ALL); + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_define_verify_sdna(1); } @@ -364,7 +367,7 @@ static void rna_def_render_pass(BlenderRNA *brna) {SCE_PASS_AO, "AO", 0, "AO", ""}, {SCE_PASS_REFLECT, "REFLECTION", 0, "Reflection", ""}, {SCE_PASS_NORMAL, "NORMAL", 0, "Normal", ""}, - {SCE_PASS_VECTOR, "VECTOR", 0, "Vecotr", ""}, + {SCE_PASS_VECTOR, "VECTOR", 0, "Vector", ""}, {SCE_PASS_REFRACT, "REFRACTION", 0, "Refraction", ""}, {SCE_PASS_INDEXOB, "OBJECT_INDEX", 0, "Object Index", ""}, {SCE_PASS_UV, "UV", 0, "UV", ""}, diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index 7c4b48b09f6..aa174fd97c3 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -28,7 +28,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -992,7 +991,7 @@ static void rna_def_property(BlenderRNA *brna) prop= RNA_def_property(srna, "is_required", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Property_is_required_get", NULL); - RNA_def_property_ui_text(prop, "Required", "False when this property is an optional argument in an rna function"); + RNA_def_property_ui_text(prop, "Required", "False when this property is an optional argument in an RNA function"); prop= RNA_def_property(srna, "is_never_none", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); @@ -1002,17 +1001,17 @@ static void rna_def_property(BlenderRNA *brna) prop= RNA_def_property(srna, "use_output", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Property_use_output_get", NULL); - RNA_def_property_ui_text(prop, "Return", "True when this property is an output value from an rna function"); + RNA_def_property_ui_text(prop, "Return", "True when this property is an output value from an RNA function"); prop= RNA_def_property(srna, "registered", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Property_registered_get", NULL); - RNA_def_property_ui_text(prop, "Registered", "Property is registerd as part of type registration"); + RNA_def_property_ui_text(prop, "Registered", "Property is registered as part of type registration"); prop= RNA_def_property(srna, "registered_optional", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Property_registered_optional_get", NULL); - RNA_def_property_ui_text(prop, "Registered Optionally", "Property is optionally registerd as part of type registration"); + RNA_def_property_ui_text(prop, "Registered Optionally", "Property is optionally registered as part of type registration"); } static void rna_def_function(BlenderRNA *brna) @@ -1044,12 +1043,12 @@ static void rna_def_function(BlenderRNA *brna) prop= RNA_def_property(srna, "registered", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Function_registered_get", NULL); - RNA_def_property_ui_text(prop, "Registered", "Function is registerd as callback as part of type registration"); + RNA_def_property_ui_text(prop, "Registered", "Function is registered as callback as part of type registration"); prop= RNA_def_property(srna, "registered_optional", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Function_registered_optional_get", NULL); - RNA_def_property_ui_text(prop, "Registered Optionally", "Function is optionally registerd as callback part of type registration"); + RNA_def_property_ui_text(prop, "Registered Optionally", "Function is optionally registered as callback part of type registration"); } static void rna_def_number_property(StructRNA *srna, PropertyType type) diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 523d36f5e7a..8e4737d78de 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -25,12 +25,13 @@ #include #include "RNA_define.h" -#include "RNA_types.h" +#include "RNA_enum_types.h" #include "rna_internal.h" #include "DNA_group_types.h" #include "DNA_modifier_types.h" +#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" @@ -41,6 +42,7 @@ #ifdef WITH_QUICKTIME #include "quicktime_export.h" +#include "AUD_C-API.h" #endif #ifdef WITH_FFMPEG @@ -92,6 +94,53 @@ EnumPropertyItem snap_element_items[] = { {SCE_SNAP_MODE_VOLUME, "VOLUME", ICON_SNAP_VOLUME, "Volume", "Snap to volume"}, {0, NULL, 0, NULL, NULL}}; +EnumPropertyItem image_type_items[] = { + {0, "", 0, "Image", NULL}, + {R_BMP, "BMP", ICON_FILE_IMAGE, "BMP", ""}, + //{R_DDS, "DDS", ICON_FILE_IMAGE, "DDS", ""}, // XXX not yet implemented + {R_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", ""}, + {R_PNG, "PNG", ICON_FILE_IMAGE, "PNG", ""}, + {R_JPEG90, "JPEG", ICON_FILE_IMAGE, "JPEG", ""}, +#ifdef WITH_OPENJPEG + {R_JP2, "JPEG2000", ICON_FILE_IMAGE, "JPEG 2000", ""}, +#endif + {R_TARGA, "TARGA", ICON_FILE_IMAGE, "Targa", ""}, + {R_RAWTGA, "TARGA_RAW", ICON_FILE_IMAGE, "Targa Raw", ""}, + {0, "", 0, " ", NULL}, + {R_CINEON, "CINEON", ICON_FILE_IMAGE, "Cineon", ""}, + {R_DPX, "DPX",ICON_FILE_IMAGE, "DPX", ""}, +#ifdef WITH_OPENEXR + {R_MULTILAYER, "MULTILAYER", ICON_FILE_IMAGE, "MultiLayer", ""}, + {R_OPENEXR, "OPEN_EXR", ICON_FILE_IMAGE, "OpenEXR", ""}, +#endif + {R_RADHDR, "HDR", ICON_FILE_IMAGE, "Radiance HDR", ""}, +#ifdef WITH_TIFF + {R_TIFF, "TIFF", ICON_FILE_IMAGE, "TIFF", ""}, +#endif + {0, "", 0, "Movie", NULL}, +#ifdef _WIN32 + {R_AVICODEC, "AVICODEC", ICON_FILE_MOVIE, "AVI Codec", ""}, // XXX Missing codec menu +#endif + {R_AVIJPEG, "AVI_JPEG", ICON_FILE_MOVIE, "AVI JPEG", ""}, + {R_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", ""}, + {R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", ""}, +#ifdef WITH_FFMPEG + {R_H264, "H264", ICON_FILE_MOVIE, "H.264", ""}, + {R_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "MPEG", ""}, + {R_THEORA, "THEORA", ICON_FILE_MOVIE, "Ogg Theora", ""}, +#endif +#ifdef WITH_QUICKTIME +# ifdef USE_QTKIT + {R_QUICKTIME, "QUICKTIME_QTKIT", ICON_FILE_MOVIE, "QuickTime", ""}, +# else + {R_QUICKTIME, "QUICKTIME_CARBON", ICON_FILE_MOVIE, "QuickTime", ""}, +# endif +#endif +#ifdef WITH_FFMPEG + {R_XVID, "XVID", ICON_FILE_MOVIE, "Xvid", ""}, +#endif + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME #include "DNA_anim_types.h" @@ -110,17 +159,19 @@ EnumPropertyItem snap_element_items[] = { #include "BKE_image.h" #include "BKE_mesh.h" #include "BKE_sound.h" +#include "BKE_screen.h" #include "BLI_threads.h" #include "BLI_editVert.h" +#include "BLI_blenlib.h" #include "WM_api.h" #include "ED_info.h" #include "ED_node.h" #include "ED_view3d.h" -#include "ED_object.h" #include "ED_mesh.h" +#include "ED_keyframing.h" #include "RE_pipeline.h" @@ -132,15 +183,11 @@ static PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter) return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, ((Base*)internal->link)->object); } -static Base *rna_Scene_link_object(Scene *scene, ReportList *reports, Object *ob) +static Base *rna_Scene_object_link(Scene *scene, bContext *C, ReportList *reports, Object *ob) { + Scene *scene_act= CTX_data_scene(C); Base *base; - if (ob->type != OB_EMPTY && ob->data==NULL) { - BKE_reportf(reports, RPT_ERROR, "Object \"%s\" is not an Empty type and has no Object Data set."); - return NULL; - } - if (object_in_scene(ob, scene)) { BKE_reportf(reports, RPT_ERROR, "Object \"%s\" is already in scene \"%s\".", ob->id.name+2, scene->id.name+2); return NULL; @@ -150,34 +197,44 @@ static Base *rna_Scene_link_object(Scene *scene, ReportList *reports, Object *ob ob->id.us++; /* this is similar to what object_add_type and add_object do */ - ob->lay= base->lay= scene->lay; - ob->recalc |= OB_RECALC; + base->lay= scene->lay; + + /* when linking to an inactive scene dont touch the layer */ + if(scene == scene_act) + ob->lay= base->lay; + + ob->recalc |= OB_RECALC_ALL; DAG_scene_sort(scene); return base; } -static void rna_Scene_unlink_object(Scene *scene, bContext *C, ReportList *reports, Object *ob) +static void rna_Scene_object_unlink(Scene *scene, ReportList *reports, Object *ob) { Base *base= object_in_scene(ob, scene); if (!base) { - BKE_report(reports, RPT_ERROR, "Object is not in this scene."); + BKE_reportf(reports, RPT_ERROR, "Object '%s' is not in this scene '%s'.", ob->id.name+2, scene->id.name+2); return; } if (base==scene->basact && ob->mode != OB_MODE_OBJECT) { - BKE_report(reports, RPT_ERROR, "Object must be in 'Object Mode' to unlink."); + BKE_reportf(reports, RPT_ERROR, "Object '%s' must be in 'Object Mode' to unlink.", ob->id.name+2); return; } + if(scene->basact==base) { + scene->basact= NULL; + } - /* as long as ED_base_object_free_and_unlink calls free_libblock_us, we don't have to decrement ob->id.us */ - ED_base_object_free_and_unlink(scene, base); + BLI_remlink(&scene->base, base); + MEM_freeN(base); + + ob->id.us--; /* needed otherwise the depgraph will contain free'd objects which can crash, see [#20958] */ DAG_scene_sort(scene); DAG_ids_flush_update(0); - WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene); + WM_main_add_notifier(NC_SCENE|ND_OB_ACTIVE, scene); } static void rna_Scene_skgen_etch_template_set(PointerRNA *ptr, PointerRNA value) @@ -222,14 +279,14 @@ static void rna_Scene_layer_set(PointerRNA *ptr, const int *values) { Scene *scene= (Scene*)ptr->data; - scene->lay= ED_view3d_scene_layer_set(scene->lay, values); + scene->lay= ED_view3d_scene_layer_set(scene->lay, values, &scene->layact); } -static void rna_Scene_layer_update(Main *bmain, Scene *unused, PointerRNA *ptr) +static void rna_Scene_view3d_update(Main *bmain, Scene *unused, PointerRNA *ptr) { Scene *scene= (Scene*)ptr->data; - ED_view3d_scene_layers_update(bmain, scene); + BKE_screen_view3d_main_sync(&bmain->screen, scene); } static void rna_Scene_current_frame_set(PointerRNA *ptr, int value) @@ -313,46 +370,68 @@ static void rna_Scene_frame_update(bContext *C, PointerRNA *ptr) sound_seek_scene(C); } -static int rna_Scene_active_keying_set_editable(PointerRNA *ptr) -{ - Scene *scene= (Scene *)ptr->data; - - /* only editable if there are some Keying Sets to change to */ - return (scene->keyingsets.first != NULL); -} - static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr) { Scene *scene= (Scene *)ptr->data; - return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, BLI_findlink(&scene->keyingsets, scene->active_keyingset-1)); + return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, ANIM_scene_get_active_keyingset(scene)); } static void rna_Scene_active_keying_set_set(PointerRNA *ptr, PointerRNA value) { Scene *scene= (Scene *)ptr->data; KeyingSet *ks= (KeyingSet*)value.data; - scene->active_keyingset= BLI_findindex(&scene->keyingsets, ks) + 1; + + scene->active_keyingset= ANIM_scene_get_keyingset_index(scene, ks); } +/* get KeyingSet index stuff for list of Keying Sets editing UI + * - active_keyingset-1 since 0 is reserved for 'none' + * - don't clamp, otherwise can never set builtins types as active... + */ static int rna_Scene_active_keying_set_index_get(PointerRNA *ptr) { - Scene *scene= (Scene *)ptr->data; - return MAX2(scene->active_keyingset-1, 0); + Scene *scene= (Scene *)ptr->data; + return scene->active_keyingset-1; } -static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value) +/* get KeyingSet index stuff for list of Keying Sets editing UI + * - value+1 since 0 is reserved for 'none'= + */ +static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value) { - Scene *scene= (Scene *)ptr->data; - scene->active_keyingset= value+1; + Scene *scene= (Scene *)ptr->data; + scene->active_keyingset= value+1; } -static void rna_Scene_active_keying_set_index_range(PointerRNA *ptr, int *min, int *max) -{ - Scene *scene= (Scene *)ptr->data; +// XXX: evil... builtin_keyingsets is defined in keyingsets.c! +// TODO: make API function to retrieve this... +extern ListBase builtin_keyingsets; - *min= 0; - *max= BLI_countlist(&scene->keyingsets)-1; - *max= MAX2(0, *max); +static void rna_Scene_all_keyingsets_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + Scene *scene= (Scene*)ptr->data; + + /* start going over the scene KeyingSets first, while we still have pointer to it + * but only if we have any Keying Sets to use... + */ + if (scene->keyingsets.first) + rna_iterator_listbase_begin(iter, &scene->keyingsets, NULL); + else + rna_iterator_listbase_begin(iter, &builtin_keyingsets, NULL); +} + +static void rna_Scene_all_keyingsets_next(CollectionPropertyIterator *iter) +{ + ListBaseIterator *internal= iter->internal; + KeyingSet *ks= (KeyingSet*)internal->link; + + /* if we've run out of links in Scene list, jump over to the builtins list unless we're there already */ + if ((ks->next == NULL) && (ks != builtin_keyingsets.last)) + internal->link= (Link*)builtin_keyingsets.first; + else + internal->link= (Link*)ks->next; + + iter->valid= (internal->link != NULL); } @@ -371,6 +450,12 @@ static int rna_RenderSettings_threads_get(PointerRNA *ptr) return BLI_system_thread_count(); } +static int rna_RenderSettings_is_movie_fomat_get(PointerRNA *ptr) +{ + RenderData *rd= (RenderData*)ptr->data; + return BKE_imtype_is_movie(rd->imtype); +} + static int rna_RenderSettings_save_buffers_get(PointerRNA *ptr) { RenderData *rd= (RenderData*)ptr->data; @@ -457,14 +542,14 @@ static int rna_RenderSettings_qtcodecsettings_codecType_get(PointerRNA *ptr) { RenderData *rd= (RenderData*)ptr->data; - return quicktime_rnatmpvalue_from_codectype(rd->qtcodecsettings.codecType); + return quicktime_rnatmpvalue_from_videocodectype(rd->qtcodecsettings.codecType); } static void rna_RenderSettings_qtcodecsettings_codecType_set(PointerRNA *ptr, int value) { RenderData *rd= (RenderData*)ptr->data; - rd->qtcodecsettings.codecType = quicktime_codecType_from_rnatmpvalue(value); + rd->qtcodecsettings.codecType = quicktime_videocodecType_from_rnatmpvalue(value); } static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bContext *C, PointerRNA *ptr, int *free) @@ -475,8 +560,8 @@ static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bCon int i=1, totitem= 0; char id[5]; - for(i=0;irnatmpvalue; @@ -490,9 +575,48 @@ static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bCon RNA_enum_item_end(&item, &totitem); *free= 1; + return item; +} + +#ifdef USE_QTKIT +static int rna_RenderSettings_qtcodecsettings_audiocodecType_get(PointerRNA *ptr) +{ + RenderData *rd= (RenderData*)ptr->data; + + return quicktime_rnatmpvalue_from_audiocodectype(rd->qtcodecsettings.audiocodecType); +} + +static void rna_RenderSettings_qtcodecsettings_audiocodecType_set(PointerRNA *ptr, int value) +{ + RenderData *rd= (RenderData*)ptr->data; + + rd->qtcodecsettings.audiocodecType = quicktime_audiocodecType_from_rnatmpvalue(value); +} + +static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_audiocodecType_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + EnumPropertyItem *item= NULL; + EnumPropertyItem tmp = {0, "", 0, "", ""}; + QuicktimeCodecTypeDesc *codecTypeDesc; + int i=1, totitem= 0; + + for(i=0;irnatmpvalue; + tmp.identifier= codecTypeDesc->codecName; + tmp.name= codecTypeDesc->codecName; + RNA_enum_item_add(&item, &totitem, &tmp); + } + + RNA_enum_item_end(&item, &totitem); + *free= 1; + return item; } #endif +#endif static int rna_RenderSettings_active_layer_index_get(PointerRNA *ptr) { @@ -582,7 +706,7 @@ static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value) Scene *scene= (Scene*)ptr->id.data; SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data; - BLI_strncpy(rl->name, value, sizeof(rl->name)); + BLI_strncpy(rl->name, value, sizeof(rl->name)); if(scene->nodetree) { bNode *node; @@ -617,7 +741,7 @@ static int rna_RenderSettings_use_game_engine_get(PointerRNA *ptr) static void rna_SceneRenderLayer_layer_set(PointerRNA *ptr, const int *values) { SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data; - rl->lay= ED_view3d_scene_layer_set(rl->lay, values); + rl->lay= ED_view3d_scene_layer_set(rl->lay, values, NULL); } static void rna_SceneRenderLayer_pass_update(Main *bmain, Scene *unused, PointerRNA *ptr) @@ -682,10 +806,14 @@ static void rna_Scene_editmesh_select_mode_update(Main *bmain, Scene *scene, Poi static void object_simplify_update(Object *ob) { ModifierData *md; + ParticleSystem *psys; for(md=ob->modifiers.first; md; md=md->next) if(ELEM3(md->type, eModifierType_Subsurf, eModifierType_Multires, eModifierType_ParticleSystem)) - ob->recalc |= OB_RECALC_DATA; + ob->recalc |= OB_RECALC_DATA|PSYS_RECALC_CHILD; + + for(psys=ob->particlesystem.first; psys; psys=psys->next) + psys->recalc |= PSYS_RECALC_CHILD; if(ob->dup_group) { GroupObject *gob; @@ -695,17 +823,24 @@ static void object_simplify_update(Object *ob) } } -static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_Scene_use_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr) { + Scene *sce; Base *base; - for(base= scene->base.first; base; base= base->next) + for(SETLOOPER(scene, base)) object_simplify_update(base->object); DAG_ids_flush_update(0); WM_main_add_notifier(NC_GEOM|ND_DATA, NULL); } +static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + if(scene->r.mode & R_SIMPLIFY) + rna_Scene_use_simplify_update(bmain, scene, ptr); +} + static int rna_Scene_sync_mode_get(PointerRNA *ptr) { Scene *scene= (Scene*)ptr->data; @@ -732,6 +867,45 @@ static void rna_Scene_sync_mode_set(PointerRNA *ptr, int value) } } +static int rna_GameSettings_auto_start_get(PointerRNA *ptr) +{ + if (G.fileflags & G_FILE_AUTOPLAY) + return 1; + + return 0; +} + +static void rna_GameSettings_auto_start_set(PointerRNA *ptr, int value) +{ + if(value) + G.fileflags |= G_FILE_AUTOPLAY; + else + G.fileflags &= ~G_FILE_AUTOPLAY; +} + + +static TimeMarker *rna_TimeLine_add(Scene *scene, char name[]) +{ + TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker"); + marker->flag= SELECT; + marker->frame= 1; + BLI_strncpy(marker->name, name, sizeof(marker->name)); + BLI_addtail(&scene->markers, marker); + return marker; +} + +static void rna_TimeLine_remove(Scene *scene, ReportList *reports, TimeMarker *marker) +{ + /* try to remove the F-Curve from the action */ + if (!BLI_remlink_safe(&scene->markers, marker)) { + BKE_reportf(reports, RPT_ERROR, "TimelineMarker '%s' not found in action '%s'", marker->name, scene->id.name+2); + return; + } + + /* XXX, invalidates PyObject */ + MEM_freeN(marker); +} + #else static void rna_def_transform_orientation(BlenderRNA *brna) @@ -885,6 +1059,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "use_auto_keying", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "autokey_mode", AUTOKEY_ON); RNA_def_property_ui_text(prop, "Auto Keying", "Automatic keyframe insertion for Objects and Bones"); + RNA_def_property_ui_icon(prop, ICON_REC, 0); prop= RNA_def_property(srna, "autokey_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "autokey_mode"); @@ -1252,48 +1427,56 @@ void rna_def_render_layer_common(StructRNA *srna, int scene) prop= RNA_def_property(srna, "pass_specular_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_SPEC); RNA_def_property_ui_text(prop, "Specular Exclude", "Exclude specular pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_shadow_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_SHADOW); RNA_def_property_ui_text(prop, "Shadow Exclude", "Exclude shadow pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_ao_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_AO); RNA_def_property_ui_text(prop, "AO Exclude", "Exclude AO pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_reflection_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_REFLECT); RNA_def_property_ui_text(prop, "Reflection Exclude", "Exclude raytraced reflection pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_refraction_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_REFRACT); RNA_def_property_ui_text(prop, "Refraction Exclude", "Exclude raytraced refraction pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_emit_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_EMIT); RNA_def_property_ui_text(prop, "Emit Exclude", "Exclude emission pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_environment_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_ENVIRONMENT); RNA_def_property_ui_text(prop, "Environment Exclude", "Exclude environment pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop= RNA_def_property(srna, "pass_indirect_exclude", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_INDIRECT); RNA_def_property_ui_text(prop, "Indirect Exclude", "Exclude indirect pass from combined"); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); } @@ -1317,7 +1500,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) {DOME_PANORAM_SPH, "PANORAM_SPH", 0, "Spherical Panoramic", ""}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem stereo_modes_items[] ={ + static EnumPropertyItem stereo_modes_items[] ={ {STEREO_QUADBUFFERED, "QUADBUFFERED", 0, "Quad-Buffer", ""}, {STEREO_ABOVEBELOW, "ABOVEBELOW", 0, "Above-Below", ""}, {STEREO_INTERLACED, "INTERLACED", 0, "Interlaced", ""}, @@ -1326,7 +1509,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) {STEREO_VINTERLACE, "VINTERLACE", 0, "Vinterlace", ""}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem stereo_items[] ={ + static EnumPropertyItem stereo_items[] ={ {STEREO_NOSTEREO, "NONE", 0, "None", "Disable Stereo and Dome environments"}, {STEREO_ENABLED, "STEREO", 0, "Stereo", "Enable Stereo environment"}, {STEREO_DOME, "DOME", 0, "Dome", "Enable Dome environment"}, @@ -1364,7 +1547,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Resolution Y", "Number of vertical pixels in the screen"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "depth"); RNA_def_property_range(prop, 8, 32); RNA_def_property_ui_text(prop, "Bits", "Displays bit depth of full screen display"); @@ -1424,7 +1607,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) prop= RNA_def_property(srna, "dome_tesselation", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "dome.res"); RNA_def_property_ui_range(prop, 1, 8, 1, 1); - RNA_def_property_ui_text(prop, "Tesselation", "Tesselation level - check the generated mesh in wireframe mode"); + RNA_def_property_ui_text(prop, "Tessellation", "Tessellation level - check the generated mesh in wireframe mode"); RNA_def_property_update(prop, NC_SCENE, NULL); prop= RNA_def_property(srna, "dome_buffer_resolution", PROP_FLOAT, PROP_NONE); @@ -1468,7 +1651,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) prop= RNA_def_property(srna, "occlusion_culling_resolution", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "occlusionRes"); RNA_def_property_range(prop, 128.0, 1024.0); - RNA_def_property_ui_text(prop, "Occlusion Resolution", "The size of the occlusion buffer in pixel, use higher value for better precsion (slower)"); + RNA_def_property_ui_text(prop, "Occlusion Resolution", "The size of the occlusion buffer in pixel, use higher value for better precision (slower)"); RNA_def_property_update(prop, NC_SCENE, NULL); prop= RNA_def_property(srna, "fps", PROP_INT, PROP_NONE); @@ -1502,7 +1685,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) /* mode */ prop= RNA_def_property(srna, "use_occlusion_culling", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", (1 << 5)); //XXX mode hardcoded // WO_DBVT_CULLING - RNA_def_property_ui_text(prop, "DBVT culling", "Use optimized Bullet DBVT tree for view frustrum and occlusion culling"); + RNA_def_property_ui_text(prop, "DBVT culling", "Use optimized Bullet DBVT tree for view frustum and occlusion culling"); // not used // deprecated !!!!!!!!!!!!! prop= RNA_def_property(srna, "activity_culling", PROP_BOOLEAN, PROP_NONE); @@ -1530,7 +1713,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) prop= RNA_def_property(srna, "use_frame_rate", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_ENABLE_ALL_FRAMES); - RNA_def_property_ui_text(prop, "Use Frame Rate", "Respect the frame rate rather then rendering as many frames as possible"); + RNA_def_property_ui_text(prop, "Use Frame Rate", "Respect the frame rate rather than rendering as many frames as possible"); prop= RNA_def_property(srna, "use_display_lists", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_DISPLAY_LISTS); @@ -1544,6 +1727,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_ENABLE_ANIMATION_RECORD); RNA_def_property_ui_text(prop, "Record Animation", "Record animation to fcurves"); + prop= RNA_def_property(srna, "auto_start", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_funcs(prop, "rna_GameSettings_auto_start_get", "rna_GameSettings_auto_start_set"); + RNA_def_property_ui_text(prop, "Auto Start", "Automatically start game at load time"); + /* materials */ prop= RNA_def_property(srna, "material_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "matmode"); @@ -1588,6 +1775,7 @@ static void rna_def_scene_render_layer(BlenderRNA *brna) srna= RNA_def_struct(brna, "SceneRenderLayer", NULL); RNA_def_struct_ui_text(srna, "Scene Render Layer", "Render layer"); + RNA_def_struct_ui_icon(srna, ICON_RENDERLAYERS); rna_def_render_layer_common(srna, 1); } @@ -1644,22 +1832,15 @@ static void rna_def_scene_render_data(BlenderRNA *brna) static EnumPropertyItem bake_qyad_split_items[] ={ {0, "AUTO", 0, "Automatic", "Split quads to give the least distortion while baking"}, - {1, "FIXED", 0, "Fixed", "Split quads pradictably (0,1,2) (0,2,3)"}, - {2, "FIXED_ALT", 0, "Fixed Alternate", "Split quads pradictably (1,2,3) (1,3,0)"}, - {0, NULL, 0, NULL, NULL}}; - - static EnumPropertyItem bake_aa_items[] ={ - {5, "AA_5", 0, "5", ""}, - {8, "AA_8", 0, "8", ""}, - {11, "AA_11", 0, "11", ""}, - {16, "AA_16", 0, "16", ""}, + {1, "FIXED", 0, "Fixed", "Split quads predictably (0,1,2) (0,2,3)"}, + {2, "FIXED_ALT", 0, "Fixed Alternate", "Split quads predictably (1,2,3) (1,3,0)"}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem octree_resolution_items[] = { - {64, "OCTREE_RES_64", 0, "64", ""}, - {128, "OCTREE_RES_128", 0, "128", ""}, - {256, "OCTREE_RES_256", 0, "256", ""}, - {512, "OCTREE_RES_512", 0, "512", ""}, + {64, "64", 0, "64", ""}, + {128, "128", 0, "128", ""}, + {256, "256", 0, "256", ""}, + {512, "512", 0, "512", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem raytrace_structure_items[] = { @@ -1673,67 +1854,20 @@ static void rna_def_scene_render_data(BlenderRNA *brna) }; static EnumPropertyItem fixed_oversample_items[] = { - {5, "OVERSAMPLE_5", 0, "5", ""}, - {8, "OVERSAMPLE_8", 0, "8", ""}, - {11, "OVERSAMPLE_11", 0, "11", ""}, - {16, "OVERSAMPLE_16", 0, "16", ""}, + {5, "5", 0, "5", ""}, + {8, "8", 0, "8", ""}, + {11, "11", 0, "11", ""}, + {16, "16", 0, "16", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem field_order_items[] = { - {0, "FIELDS_EVENFIRST", 0, "Upper First", "Upper field first"}, - {R_ODDFIELD, "FIELDS_ODDFIRST", 0, "Lower First", "Lower field first"}, + {0, "EVEN_FIRST", 0, "Upper First", "Upper field first"}, + {R_ODDFIELD, "ODD_FIRST", 0, "Lower First", "Lower field first"}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem threads_mode_items[] = { - {0, "THREADS_AUTO", 0, "Auto-detect", "Automatically determine the number of threads, based on CPUs"}, - {R_FIXED_THREADS, "THREADS_FIXED", 0, "Fixed", "Manually determine the number of threads"}, - {0, NULL, 0, NULL, NULL}}; - - static EnumPropertyItem image_type_items[] = { - {0, "", 0, "Image", NULL}, - {R_PNG, "PNG", ICON_FILE_IMAGE, "PNG", ""}, - {R_JPEG90, "JPEG", ICON_FILE_IMAGE, "JPEG", ""}, -#ifdef WITH_OPENJPEG - {R_JP2, "JPEG2000", ICON_FILE_IMAGE, "JPEG 2000", ""}, -#endif - {R_BMP, "BMP", ICON_FILE_IMAGE, "BMP", ""}, - {R_TARGA, "TARGA", ICON_FILE_IMAGE, "Targa", ""}, - {R_RAWTGA, "RAWTARGA", ICON_FILE_IMAGE, "Targa Raw", ""}, - //{R_DDS, "DDS", ICON_FILE_IMAGE, "DDS", ""}, // XXX not yet implemented - {R_HAMX, "HAMX", ICON_FILE_IMAGE, "HamX", ""}, - {R_IRIS, "IRIS", ICON_FILE_IMAGE, "Iris", ""}, - {0, "", 0, " ", NULL}, -#ifdef WITH_OPENEXR - {R_OPENEXR, "OPENEXR", ICON_FILE_IMAGE, "OpenEXR", ""}, - {R_MULTILAYER, "MULTILAYER", ICON_FILE_IMAGE, "MultiLayer", ""}, -#endif - {R_TIFF, "TIFF", ICON_FILE_IMAGE, "TIFF", ""}, // XXX only with G.have_libtiff - {R_RADHDR, "RADHDR", ICON_FILE_IMAGE, "Radiance HDR", ""}, - {R_CINEON, "CINEON", ICON_FILE_IMAGE, "Cineon", ""}, - {R_DPX, "DPX", ICON_FILE_IMAGE, "DPX", ""}, - {0, "", 0, "Movie", NULL}, - {R_AVIRAW, "AVIRAW", ICON_FILE_MOVIE, "AVI Raw", ""}, - {R_AVIJPEG, "AVIJPEG", ICON_FILE_MOVIE, "AVI JPEG", ""}, -#ifdef _WIN32 - {R_AVICODEC, "AVICODEC", ICON_FILE_MOVIE, "AVI Codec", ""}, -#endif -#ifdef WITH_QUICKTIME -# ifdef USE_QTKIT - {R_QUICKTIME, "QUICKTIME_QTKIT", ICON_FILE_MOVIE, "QuickTime", ""}, -# else - {R_QUICKTIME, "QUICKTIME_CARBON", ICON_FILE_MOVIE, "QuickTime", ""}, -# endif -#endif -#ifdef __sgi - {R_MOVIE, "MOVIE", ICON_FILE_MOVIE, "Movie", ""}, -#endif -#ifdef WITH_FFMPEG - {R_H264, "H264", ICON_FILE_MOVIE, "H.264", ""}, - {R_XVID, "XVID", ICON_FILE_MOVIE, "Xvid", ""}, - {R_THEORA, "THEORA", ICON_FILE_MOVIE, "Ogg Theora", ""}, - {R_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "FFMpeg", ""}, -#endif - {R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", ""}, + {0, "AUTO", 0, "Auto-detect", "Automatically determine the number of threads, based on CPUs"}, + {R_FIXED_THREADS, "FIXED", 0, "Fixed", "Manually determine the number of threads"}, {0, NULL, 0, NULL, NULL}}; #ifdef WITH_OPENEXR @@ -1769,6 +1903,35 @@ static void rna_def_scene_render_data(BlenderRNA *brna) static EnumPropertyItem quicktime_codec_type_items[] = { {0, "codec", 0, "codec", ""}, {0, NULL, 0, NULL, NULL}}; + +#ifdef USE_QTKIT + static EnumPropertyItem quicktime_audio_samplerate_items[] = { + {22050, "22050", 0, "22kHz", ""}, + {44100, "44100", 0, "44.1kHz", ""}, + {48000, "48000", 0, "48kHz", ""}, + {88200, "88200", 0, "88.2kHz", ""}, + {96000, "96000", 0, "96kHz", ""}, + {192000, "192000", 0, "192kHz", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem quicktime_audio_bitdepth_items[] = { + {AUD_FORMAT_U8, "8BIT", 0, "8bit", ""}, + {AUD_FORMAT_S16, "16BIT", 0, "16bit", ""}, + {AUD_FORMAT_S24, "24BIT", 0, "24bit", ""}, + {AUD_FORMAT_S32, "32BIT", 0, "32bit", ""}, + {AUD_FORMAT_FLOAT32, "FLOAT32", 0, "float32", ""}, + {AUD_FORMAT_FLOAT64, "FLOAT64", 0, "float64", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem quicktime_audio_bitrate_items[] = { + {64000, "64000", 0, "64kbps", ""}, + {112000, "112000", 0, "112kpbs", ""}, + {128000, "128000", 0, "128kbps", ""}, + {192000, "192000", 0, "192kbps", ""}, + {256000, "256000", 0, "256kbps", ""}, + {320000, "320000", 0, "320kbps", ""}, + {0, NULL, 0, NULL, NULL}}; +#endif #endif #ifdef WITH_FFMPEG @@ -1874,7 +2037,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) /* JPEG and AVI JPEG */ - prop= RNA_def_property(srna, "quality", PROP_INT, PROP_PERCENTAGE); + prop= RNA_def_property(srna, "file_quality", PROP_INT, PROP_PERCENTAGE); RNA_def_property_int_sdna(prop, NULL, "quality"); RNA_def_property_range(prop, 1, 100); RNA_def_property_ui_text(prop, "Quality", "Quality of JPEG images, AVI Jpeg and SGI movies"); @@ -1976,8 +2139,47 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "qtcodecsettings.codecSpatialQuality"); RNA_def_property_range(prop, 0, 100); RNA_def_property_ui_text(prop, "Spatial quality", "Intra-frame spatial quality level"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + +#ifdef USE_QTKIT + prop= RNA_def_property(srna, "quicktime_audiocodec_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "qtcodecsettings.audiocodecType"); + RNA_def_property_enum_items(prop, quicktime_codec_type_items); + RNA_def_property_enum_funcs(prop, "rna_RenderSettings_qtcodecsettings_audiocodecType_get", + "rna_RenderSettings_qtcodecsettings_audiocodecType_set", + "rna_RenderSettings_qtcodecsettings_audiocodecType_itemf"); + RNA_def_property_ui_text(prop, "Audio Codec", "QuickTime audio codec type"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "quicktime_audio_samplerate", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "qtcodecsettings.audioSampleRate"); + RNA_def_property_enum_items(prop, quicktime_audio_samplerate_items); + RNA_def_property_ui_text(prop, "Smp Rate", "Sample Rate"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "quicktime_audio_bitdepth", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "qtcodecsettings.audioBitDepth"); + RNA_def_property_enum_items(prop, quicktime_audio_bitdepth_items); + RNA_def_property_ui_text(prop, "Bit Depth", "Bit Depth"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "quicktime_audio_resampling_hq", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "qtcodecsettings.audioCodecFlags", QTAUDIO_FLAG_RESAMPLE_NOHQ); + RNA_def_property_ui_text(prop, "HQ", "Use High Quality resampling algorithm"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "quicktime_audio_codec_isvbr", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "qtcodecsettings.audioCodecFlags", QTAUDIO_FLAG_CODEC_ISCBR); + RNA_def_property_ui_text(prop, "VBR", "Use Variable Bit Rate compression (improves quality at same bitrate)"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "quicktime_audio_bitrate", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "qtcodecsettings.audioBitRate"); + RNA_def_property_enum_items(prop, quicktime_audio_bitrate_items); + RNA_def_property_ui_text(prop, "Bitrate", "Compressed audio bitrate"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); #endif +#endif #ifdef WITH_FFMPEG /* FFMPEG Video*/ @@ -2128,7 +2330,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Use Local Coords", "Vertex coordinates are stored localy on each primitive. Increases memory usage, but may have impact on speed"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "antialiasing", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "render_antialiasing", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_OSA); RNA_def_property_ui_text(prop, "Anti-Aliasing", "Render and combine multiple samples per pixel to prevent jagged edges"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); @@ -2155,34 +2357,35 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Fields Still", "Disable the time difference between fields"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_shadows", PROP_BOOLEAN, PROP_NONE); + /* rendering features */ + prop= RNA_def_property(srna, "use_shadows", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SHADOW); - RNA_def_property_ui_text(prop, "Render Shadows", "Calculate shadows while rendering"); + RNA_def_property_ui_text(prop, "Shadows", "Calculate shadows while rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_envmaps", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_envmaps", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_ENVMAP); - RNA_def_property_ui_text(prop, "Render Environment Maps", "Calculate environment maps while rendering"); + RNA_def_property_ui_text(prop, "Environment Maps", "Calculate environment maps while rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_radiosity", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_radiosity", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_RADIO); - RNA_def_property_ui_text(prop, "Render Radiosity", "Calculate radiosity in a pre-process before rendering"); + RNA_def_property_ui_text(prop, "Radiosity", "Calculate radiosity in a pre-process before rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_sss", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_sss", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SSS); - RNA_def_property_ui_text(prop, "Render SSS", "Calculate sub-surface scattering in materials rendering"); + RNA_def_property_ui_text(prop, "Subsurface Scattering", "Calculate sub-surface scattering in materials rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_raytracing", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_raytracing", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_RAYTRACE); - RNA_def_property_ui_text(prop, "Render Raytracing", "Pre-calculate the raytrace accelerator and render raytracing effects"); + RNA_def_property_ui_text(prop, "Raytracing", "Pre-calculate the raytrace accelerator and render raytracing effects"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_textures", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_textures", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "scemode", R_NO_TEX); - RNA_def_property_ui_text(prop, "Render Textures", "Use textures to affect material properties"); + RNA_def_property_ui_text(prop, "Textures", "Use textures to affect material properties"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); prop= RNA_def_property(srna, "edge", PROP_BOOLEAN, PROP_NONE); @@ -2202,6 +2405,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Edge Color", ""); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + /* threads */ prop= RNA_def_property(srna, "threads", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "threads"); RNA_def_property_range(prop, 1, BLENDER_MAX_THREADS); @@ -2215,6 +2419,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Threads Mode", "Determine the amount of render threads used"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + /* motion blur */ prop= RNA_def_property(srna, "motion_blur", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_MBLUR); RNA_def_property_ui_text(prop, "Motion Blur", "Use multi-sampled 3D scene motion blur"); @@ -2226,6 +2431,14 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Motion Samples", "Number of scene samples to take with motion blur"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + prop= RNA_def_property(srna, "motion_blur_shutter", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "blurfac"); + RNA_def_property_range(prop, 0.01f, 10.0f); + RNA_def_property_ui_range(prop, 0.01, 2.0f, 1, 0); + RNA_def_property_ui_text(prop, "Shutter", "Time taken in frames between shutter open and close"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + /* border */ prop= RNA_def_property(srna, "use_border", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_BORDER); RNA_def_property_ui_text(prop, "Border", "Render a user-defined border region, within the frame size. Note, this disables save_buffers and full_sample"); @@ -2282,8 +2495,9 @@ static void rna_def_scene_render_data(BlenderRNA *brna) prop= RNA_def_property(srna, "color_management", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "color_mgt_flag", R_COLOR_MANAGEMENT); - RNA_def_property_ui_text(prop, "Color Management", "Use color profiles and gamma corrected imaging pipeline"); - RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_MATERIAL|ND_SHADING, "rna_RenderSettings_color_management_update"); + RNA_def_property_ui_text(prop, "Color Management", "Use linear workflow - gamma corrected imaging pipeline"); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_RenderSettings_color_management_update"); + prop= RNA_def_property(srna, "use_file_extension", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_EXTENSION); @@ -2300,16 +2514,20 @@ static void rna_def_scene_render_data(BlenderRNA *brna) prop= RNA_def_property(srna, "file_extension", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, "rna_SceneRender_file_ext_get", "rna_SceneRender_file_ext_length", NULL); RNA_def_property_ui_text(prop, "Extension", "The file extension used for saving renders"); - RNA_def_struct_name_property(srna, prop); RNA_def_property_clear_flag(prop, PROP_EDITABLE); + prop= RNA_def_property(srna, "is_movie_format", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_is_movie_fomat_get", NULL); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Movie Format", "When true the format is a movie"); + prop= RNA_def_property(srna, "free_image_textures", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FREE_IMAGE); RNA_def_property_ui_text(prop, "Free Image Textures", "Free all image texture from memory after render, to save memory before compositing"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); prop= RNA_def_property(srna, "free_unused_nodes", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FREE_IMAGE); + RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_COMP_FREE); RNA_def_property_ui_text(prop, "Free Unused Nodes", "Free Nodes that are not used while compositing, to save memory"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); @@ -2321,7 +2539,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) prop= RNA_def_property(srna, "full_sample", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FULL_SAMPLE); - RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL); + RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL); RNA_def_property_ui_text(prop, "Full Sample","Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); @@ -2359,7 +2577,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) prop= RNA_def_property(srna, "bake_aa_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_osa"); - RNA_def_property_enum_items(prop, bake_aa_items); + RNA_def_property_enum_items(prop, fixed_oversample_items); RNA_def_property_ui_text(prop, "Anti-Aliasing Level", ""); prop= RNA_def_property(srna, "bake_active", PROP_BOOLEAN, PROP_NONE); @@ -2475,6 +2693,27 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Stamp Background", "Color to use behind stamp text"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + /* sequencer draw options */ + + prop= RNA_def_property(srna, "use_sequencer_gl_preview", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "seq_flag", R_SEQ_GL_PREV); + RNA_def_property_ui_text(prop, "Sequencer OpenGL", ""); + + prop= RNA_def_property(srna, "use_sequencer_gl_render", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "seq_flag", R_SEQ_GL_REND); + RNA_def_property_ui_text(prop, "Sequencer OpenGL", ""); + + + prop= RNA_def_property(srna, "sequencer_gl_preview", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "seq_prev_type"); + RNA_def_property_enum_items(prop, viewport_shading_items); + RNA_def_property_ui_text(prop, "Sequencer Preview Shading", "Method to draw in the sequencer view"); + + prop= RNA_def_property(srna, "sequencer_gl_render", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "seq_rend_type"); + RNA_def_property_enum_items(prop, viewport_shading_items); + RNA_def_property_ui_text(prop, "Sequencer Preview Shading", "Method to draw in the sequencer view"); + /* layers */ prop= RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE); @@ -2514,9 +2753,9 @@ static void rna_def_scene_render_data(BlenderRNA *brna) prop= RNA_def_property(srna, "use_simplify", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SIMPLIFY); RNA_def_property_ui_text(prop, "Use Simplify", "Enable simplification of scene for quicker preview renders"); - RNA_def_property_update(prop, 0, "rna_Scene_simplify_update"); + RNA_def_property_update(prop, 0, "rna_Scene_use_simplify_update"); - prop= RNA_def_property(srna, "simplify_subdivision", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "simplify_subdivision", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "simplify_subsurf"); RNA_def_property_ui_range(prop, 0, 6, 1, 0); RNA_def_property_ui_text(prop, "Simplify Subdivision", "Global maximum subdivision level"); @@ -2560,17 +2799,17 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_struct_sdna(srna, "Scene"); RNA_def_struct_ui_text(srna, "Scene Objects", "Collection of scene objects"); - func= RNA_def_function(srna, "link", "rna_Scene_link_object"); + func= RNA_def_function(srna, "link", "rna_Scene_object_link"); RNA_def_function_ui_description(func, "Link object to scene."); - RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_pointer(func, "base", "ObjectBase", "", "The newly created base."); RNA_def_function_return(func, parm); - func= RNA_def_function(srna, "unlink", "rna_Scene_unlink_object"); + func= RNA_def_function(srna, "unlink", "rna_Scene_object_unlink"); RNA_def_function_ui_description(func, "Unlink object from scene."); - RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); + RNA_def_function_flag(func, FUNC_USE_REPORTS); parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove from scene."); RNA_def_property_flag(parm, PROP_REQUIRED); @@ -2607,6 +2846,35 @@ static void rna_def_scene_bases(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_property_update(prop, NC_SCENE|ND_OB_ACTIVE, NULL); } +/* scene.timeline_markers */ +static void rna_def_timeline_markers(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "TimelineMarkers"); + srna= RNA_def_struct(brna, "TimelineMarkers", NULL); + RNA_def_struct_sdna(srna, "Scene"); + RNA_def_struct_ui_text(srna, "Timeline Markers", "Collection of timeline markers"); + + func= RNA_def_function(srna, "add", "rna_TimeLine_add"); + RNA_def_function_ui_description(func, "Add a keyframe to the curve."); + parm= RNA_def_string(func, "name", "Marker", 0, "", "New name for the marker (not unique)."); + RNA_def_property_flag(parm, PROP_REQUIRED); + + parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Newly created timeline marker"); + RNA_def_function_return(func, parm); + + + func= RNA_def_function(srna, "remove", "rna_TimeLine_remove"); + RNA_def_function_ui_description(func, "Remove a timeline marker."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove."); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); +} + void RNA_def_scene(BlenderRNA *brna) { StructRNA *srna; @@ -2639,22 +2907,22 @@ void RNA_def_scene(BlenderRNA *brna) prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Camera", "Active camera used for rendering the scene"); - RNA_def_property_update(prop, NC_SCENE, NULL); + RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_view3d_update"); prop= RNA_def_property(srna, "set", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "set"); RNA_def_property_struct_type(prop, "Scene"); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_pointer_funcs(prop, NULL, "rna_Scene_set_set", NULL); - RNA_def_property_ui_text(prop, "Set Scene", "Background set scene"); - RNA_def_property_update(prop, NC_SCENE, NULL); + RNA_def_property_ui_text(prop, "Background Scene", "Background set scene"); + RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL); prop= RNA_def_property(srna, "world", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "World", "World used for rendering the scene"); RNA_def_property_update(prop, NC_SCENE|NC_WORLD, NULL); - prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ|PROP_UNIT_LENGTH); + prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ_LENGTH); RNA_def_property_float_sdna(prop, NULL, "cursor"); RNA_def_property_ui_text(prop, "Cursor Location", "3D cursor location"); RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4); @@ -2675,15 +2943,15 @@ void RNA_def_scene(BlenderRNA *brna) rna_def_scene_objects(brna, prop); /* Layers */ - prop= RNA_def_property(srna, "visible_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER); + prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER); RNA_def_property_boolean_sdna(prop, NULL, "lay", 1); RNA_def_property_array(prop, 20); RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_layer_set"); - RNA_def_property_ui_text(prop, "Visible Layers", "Layers visible when rendering the scene"); - RNA_def_property_update(prop, NC_SCENE|ND_LAYER, "rna_Scene_layer_update"); + RNA_def_property_ui_text(prop, "Layers", "Layers visible when rendering the scene"); + RNA_def_property_update(prop, NC_SCENE|ND_LAYER, "rna_Scene_view3d_update"); /* Frame Range Stuff */ - prop= RNA_def_property(srna, "current_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_current", PROP_INT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_int_sdna(prop, NULL, "r.cfra"); RNA_def_property_range(prop, MINAFRAME, MAXFRAME); @@ -2692,21 +2960,21 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update"); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_int_sdna(prop, NULL, "r.sfra"); RNA_def_property_int_funcs(prop, NULL, "rna_Scene_start_frame_set", NULL); RNA_def_property_range(prop, MINFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "Start Frame", "First frame of the playback/rendering range"); - RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL); + RNA_def_property_update(prop, NC_SCENE|ND_FRAME_RANGE, NULL); - prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_int_sdna(prop, NULL, "r.efra"); RNA_def_property_int_funcs(prop, NULL, "rna_Scene_end_frame_set", NULL); RNA_def_property_range(prop, MINFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "End Frame", "Final frame of the playback/rendering range"); - RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL); + RNA_def_property_update(prop, NC_SCENE|ND_FRAME_RANGE, NULL); prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); @@ -2721,21 +2989,22 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_boolean_sdna(prop, NULL, "r.flag", SCER_PRV_RANGE); RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_use_preview_range_set"); - RNA_def_property_ui_text(prop, "Use Preview Range", ""); + RNA_def_property_ui_text(prop, "Use Preview Range", "Use an alternative start/end frame for UI playback, rather than the scene start/end frame"); RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL); + RNA_def_property_ui_icon(prop, ICON_PREVIEW_RANGE, 0); - prop= RNA_def_property(srna, "preview_range_start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "preview_range_frame_start", PROP_INT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_int_sdna(prop, NULL, "r.psfra"); RNA_def_property_int_funcs(prop, NULL, "rna_Scene_preview_range_start_frame_set", NULL); - RNA_def_property_ui_text(prop, "Preview Range Start Frame", ""); + RNA_def_property_ui_text(prop, "Preview Range Start Frame", "Alternative start frame for UI playback"); RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL); - prop= RNA_def_property(srna, "preview_range_end_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "preview_range_frame_end", PROP_INT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_int_sdna(prop, NULL, "r.pefra"); RNA_def_property_int_funcs(prop, NULL, "rna_Scene_preview_range_end_frame_set", NULL); - RNA_def_property_ui_text(prop, "Preview Range End Frame", ""); + RNA_def_property_ui_text(prop, "Preview Range End Frame", "Alternative end frame for UI playback"); RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL); /* Stamp */ @@ -2787,21 +3056,26 @@ void RNA_def_scene(BlenderRNA *brna) prop= RNA_def_property(srna, "keying_sets", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "keyingsets", NULL); RNA_def_property_struct_type(prop, "KeyingSet"); - RNA_def_property_ui_text(prop, "Keying Sets", "Keying Sets for this Scene"); + RNA_def_property_ui_text(prop, "Absolute Keying Sets", "Absolute Keying Sets for this Scene"); + RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); + + prop= RNA_def_property(srna, "all_keying_sets", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_funcs(prop, "rna_Scene_all_keyingsets_begin", "rna_Scene_all_keyingsets_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0); + RNA_def_property_struct_type(prop, "KeyingSet"); + RNA_def_property_ui_text(prop, "All Keying Sets", "All Keying Sets available for use (builtins and Absolute Keying Sets for this Scene)"); RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); prop= RNA_def_property(srna, "active_keying_set", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "KeyingSet"); RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_editable_func(prop, "rna_Scene_active_keying_set_editable"); RNA_def_property_pointer_funcs(prop, "rna_Scene_active_keying_set_get", "rna_Scene_active_keying_set_set", NULL); RNA_def_property_ui_text(prop, "Active Keying Set", "Active Keying Set used to insert/delete keyframes"); RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); prop= RNA_def_property(srna, "active_keying_set_index", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "active_keyingset"); - RNA_def_property_int_funcs(prop, "rna_Scene_active_keying_set_index_get", "rna_Scene_active_keying_set_index_set", "rna_Scene_active_keying_set_index_range"); - RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index"); + RNA_def_property_int_funcs(prop, "rna_Scene_active_keying_set_index_get", "rna_Scene_active_keying_set_index_set", NULL); + RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index (negative for 'builtin' and positive for 'absolute')"); RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); /* Tool Settings */ @@ -2843,6 +3117,7 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "markers", NULL); RNA_def_property_struct_type(prop, "TimelineMarker"); RNA_def_property_ui_text(prop, "Timeline Markers", "Markers used in all timelines for the current scene"); + rna_def_timeline_markers(brna, prop); /* Audio Settings */ prop= RNA_def_property(srna, "mute_audio", PROP_BOOLEAN, PROP_NONE); @@ -2863,13 +3138,13 @@ void RNA_def_scene(BlenderRNA *brna) prop= RNA_def_property(srna, "speed_of_sound", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "audio.speed_of_sound"); RNA_def_property_range(prop, 0.01f, FLT_MAX); - RNA_def_property_ui_text(prop, "Speed of Sound", "Speed of sound for doppler effect calculation"); + RNA_def_property_ui_text(prop, "Speed of Sound", "Speed of sound for Doppler effect calculation"); RNA_def_property_update(prop, NC_SCENE, NULL); prop= RNA_def_property(srna, "doppler_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "audio.doppler_factor"); RNA_def_property_range(prop, 0.0, FLT_MAX); - RNA_def_property_ui_text(prop, "Doppler Factor", "Pitch factor for doppler effect calculation"); + RNA_def_property_ui_text(prop, "Doppler Factor", "Pitch factor for Doppler effect calculation"); RNA_def_property_update(prop, NC_SCENE, NULL); prop= RNA_def_property(srna, "distance_model", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c index 6cae59c4dce..eb48fb6c237 100644 --- a/source/blender/makesrna/intern/rna_scene_api.c +++ b/source/blender/makesrna/intern/rna_scene_api.c @@ -30,8 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_enum_types.h" -#include "RNA_types.h" #include "DNA_anim_types.h" #include "DNA_object_types.h" @@ -46,12 +44,9 @@ #include "BKE_depsgraph.h" #include "BKE_writeavi.h" -#include "ED_object.h" -#include "ED_anim_api.h" -#include "WM_api.h" -static void rna_Scene_set_frame(Scene *scene, bContext *C, int frame) +static void rna_Scene_set_frame(Scene *scene, int frame) { scene->r.cfra= frame; CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME); @@ -103,7 +98,6 @@ void RNA_api_scene(StructRNA *srna) PropertyRNA *parm; func= RNA_def_function(srna, "set_frame", "rna_Scene_set_frame"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Set scene frame updating all objects immediately."); parm= RNA_def_int(func, "frame", 0, MINAFRAME, MAXFRAME, "", "Frame number to set.", MINAFRAME, MAXFRAME); RNA_def_property_flag(parm, PROP_REQUIRED); diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index b2148e38de1..ecf2206c25c 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "rna_internal.h" @@ -162,12 +161,12 @@ static void rna_def_region(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Region Type", "Type of this region"); - prop= RNA_def_property(srna, "width", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "width", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "winx"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Width", "Region width"); - prop= RNA_def_property(srna, "height", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "height", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "winy"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Height", "Region height"); diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c index 456071499e3..604f7776d56 100644 --- a/source/blender/makesrna/intern/rna_sculpt_paint.c +++ b/source/blender/makesrna/intern/rna_sculpt_paint.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -34,6 +33,7 @@ #include "BKE_paint.h" +#include "WM_api.h" #include "WM_types.h" static EnumPropertyItem particle_edit_hair_brush_items[] = { @@ -56,6 +56,15 @@ static EnumPropertyItem particle_edit_hair_brush_items[] = { #include "ED_particle.h" +static EnumPropertyItem particle_edit_disconnected_hair_brush_items[] = { + {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush"}, + {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb hairs"}, + {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth hairs"}, + {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make hairs longer or shorter"}, + {PE_BRUSH_CUT, "CUT", 0, "Cut", "Cut hairs"}, + {PE_BRUSH_WEIGHT, "WEIGHT", 0, "Weight", "Weight hair particles"}, + {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem particle_edit_cache_brush_items[] = { {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush"}, {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb paths"}, @@ -119,15 +128,33 @@ static void rna_ParticleEdit_update(Main *bmain, Scene *scene, PointerRNA *ptr) if(ob) DAG_id_flush_update(&ob->id, OB_RECALC_DATA); } +static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value) +{ + ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data; + + /* redraw hair completely if weight brush is/was used */ + if(pset->brushtype == PE_BRUSH_WEIGHT || value == PE_BRUSH_WEIGHT) { + Object *ob = (pset->scene->basact)? pset->scene->basact->object: NULL; + if(ob) { + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL); + } + } + pset->brushtype = value; +} static EnumPropertyItem *rna_ParticleEdit_tool_itemf(bContext *C, PointerRNA *ptr, int *free) { Scene *scene= CTX_data_scene(C); Object *ob= (scene->basact)? scene->basact->object: NULL; PTCacheEdit *edit = PE_get_current(scene, ob); - if(edit && edit->psys) - return particle_edit_hair_brush_items; + if(edit && edit->psys) { + if(edit->psys->flag & PSYS_GLOBAL_HAIR) + return particle_edit_disconnected_hair_brush_items; + else + return particle_edit_hair_brush_items; + } return particle_edit_cache_brush_items; } @@ -166,7 +193,7 @@ static void rna_Paint_active_brush_name_get(PointerRNA *ptr, char *value) Paint *p= ptr->data; Brush *br = paint_brush(p); - BLI_strncpy(value, br->id.name+2, sizeof(br->id.name-2)); + BLI_strncpy(value, br->id.name+2, sizeof(br->id.name)-2); } @@ -185,7 +212,7 @@ static void rna_Paint_active_brush_name_set(PointerRNA *ptr, const char *value) for(i = 0; i < p->brush_count; ++i) { br = p->brushes[i]; - + if (strcmp(br->id.name+2, value)==0) { paint_brush_set(p, br); return; @@ -235,6 +262,10 @@ static void rna_def_paint(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flags", PAINT_SHOW_BRUSH); RNA_def_property_ui_text(prop, "Show Brush", ""); + prop= RNA_def_property(srna, "show_brush_on_surface", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", PAINT_SHOW_BRUSH_ON_SURFACE); + RNA_def_property_ui_text(prop, "Show Brush On Surface", ""); + prop= RNA_def_property(srna, "fast_navigate", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", PAINT_FAST_NAVIGATE); RNA_def_property_ui_text(prop, "Fast Navigate", "For multires, show low resolution while navigating the view"); @@ -247,7 +278,14 @@ static void rna_def_sculpt(BlenderRNA *brna) srna= RNA_def_struct(brna, "Sculpt", "Paint"); RNA_def_struct_ui_text(srna, "Sculpt", ""); - + + prop= RNA_def_property(srna, "radial_symm", PROP_INT, PROP_XYZ); + RNA_def_property_int_sdna(prop, NULL, "radial_symm"); + RNA_def_property_int_default(prop, 1); + RNA_def_property_range(prop, 1, 64); + RNA_def_property_ui_range(prop, 0, 32, 1, 1); + RNA_def_property_ui_text(prop, "Radial Symmetry Count X Axis", "Number of times to copy strokes across the surface"); + prop= RNA_def_property(srna, "symmetry_x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_X); RNA_def_property_ui_text(prop, "Symmetry X", "Mirror brush across the X axis"); @@ -271,6 +309,14 @@ static void rna_def_sculpt(BlenderRNA *brna) prop= RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Z); RNA_def_property_ui_text(prop, "Lock Z", "Disallow changes to the Z axis of vertices"); + + prop= RNA_def_property(srna, "use_symmetry_feather", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMMETRY_FEATHER); + RNA_def_property_ui_text(prop, "Symmetry Feathering", "Reduce the strength of the brush where it overlaps symmetrical daubs"); + + prop= RNA_def_property(srna, "use_openmp", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_USE_OPENMP); + RNA_def_property_ui_text(prop, "Use OpenMP", "Take advantage of multiple CPU cores to improve sculpting performance"); } static void rna_def_vertex_paint(BlenderRNA *brna) @@ -350,7 +396,10 @@ static void rna_def_image_paint(BlenderRNA *brna) prop= RNA_def_property(srna, "normal_angle", PROP_INT, PROP_UNSIGNED); RNA_def_property_range(prop, 0, 90); - RNA_def_property_ui_text(prop, "Angle", "Paint most on faces pointing towards the view acording to this angle"); + RNA_def_property_ui_text(prop, "Angle", "Paint most on faces pointing towards the view according to this angle"); + + prop= RNA_def_int_array(srna, "screen_grab_size", 2, NULL, 0, 0, "screen_grab_size", "Size to capture the image for re-projecting", 0, 0); + RNA_def_property_range(prop, 512, 16384); } static void rna_def_particle_edit(BlenderRNA *brna) @@ -391,7 +440,7 @@ static void rna_def_particle_edit(BlenderRNA *brna) prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "brushtype"); RNA_def_property_enum_items(prop, particle_edit_hair_brush_items); - RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_ParticleEdit_tool_itemf"); + RNA_def_property_enum_funcs(prop, NULL, "rna_ParticleEdit_tool_set", "rna_ParticleEdit_tool_itemf"); RNA_def_property_ui_text(prop, "Tool", ""); prop= RNA_def_property(srna, "selection_mode", PROP_ENUM, PROP_NONE); @@ -429,7 +478,7 @@ static void rna_def_particle_edit(BlenderRNA *brna) prop= RNA_def_property(srna, "draw_particles", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_DRAW_PART); RNA_def_property_ui_text(prop, "Draw Particles", "Draw actual particles"); - RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_redo"); prop= RNA_def_property(srna, "add_interpolate", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_INTERPOLATE_ADDED); @@ -488,11 +537,15 @@ static void rna_def_particle_edit(BlenderRNA *brna) RNA_def_property_ui_range(prop, 1, 100, 10, 3); RNA_def_property_ui_text(prop, "Size", "Brush size"); - prop= RNA_def_property(srna, "strength", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 1, INT_MAX); - RNA_def_property_ui_range(prop, 1, 100, 10, 3); + prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0.001, 1.0); RNA_def_property_ui_text(prop, "Strength", "Brush strength"); + prop= RNA_def_property(srna, "count", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 1, 1000); + RNA_def_property_ui_range(prop, 1, 100, 10, 3); + RNA_def_property_ui_text(prop, "Count", "Particle count"); + prop= RNA_def_property(srna, "steps", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "step"); RNA_def_property_range(prop, 1, INT_MAX); diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c index 3e628e9dbe2..90a520d6d92 100644 --- a/source/blender/makesrna/intern/rna_sensor.c +++ b/source/blender/makesrna/intern/rna_sensor.c @@ -25,14 +25,39 @@ #include #include "RNA_define.h" -#include "RNA_types.h" +#include "RNA_enum_types.h" #include "rna_internal.h" +#include "DNA_constraint_types.h" +#include "DNA_object_types.h" #include "DNA_sensor_types.h" +#include "WM_types.h" + +/* Always keep in alphabetical order */ +EnumPropertyItem sensor_type_items[] ={ + {SENS_ACTUATOR, "ACTUATOR", 0, "Actuator", ""}, + {SENS_ALWAYS, "ALWAYS", 0, "Always", ""}, + {SENS_ARMATURE, "ARMATURE", 0, "Armature", ""}, + {SENS_COLLISION, "COLLISION", 0, "Collision", ""}, + {SENS_DELAY, "DELAY", 0, "Delay", ""}, + {SENS_JOYSTICK, "JOYSTICK", 0, "Joystick", ""}, + {SENS_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""}, + {SENS_MESSAGE, "MESSAGE", 0, "Message", ""}, + {SENS_MOUSE, "MOUSE", 0, "Mouse", ""}, + {SENS_NEAR, "NEAR", 0, "Near", ""}, + {SENS_PROPERTY, "PROPERTY", 0, "Property", ""}, + {SENS_RADAR, "RADAR", 0, "Radar", ""}, + {SENS_RANDOM, "RANDOM", 0, "Random", ""}, + {SENS_RAY, "RAY", 0, "Ray", ""}, + {SENS_TOUCH, "TOUCH", 0, "Touch", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME +#include "BKE_sca.h" + static StructRNA* rna_Sensor_refine(struct PointerRNA *ptr) { bSensor *sensor= (bSensor*)ptr->data; @@ -73,29 +98,150 @@ static StructRNA* rna_Sensor_refine(struct PointerRNA *ptr) } } +static void rna_Sensor_type_set(struct PointerRNA *ptr, int value) +{ + bSensor *sens= (bSensor *)ptr->data; + if (value != sens->type) + { + sens->type = value; + init_sensor(sens); + } +} + +/* Always keep in alphabetical order */ +EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + EnumPropertyItem *item= NULL; + Object *ob=NULL; + int totitem= 0; + + if (ptr->type == &RNA_Sensor) { + ob = (Object *)ptr->id.data; + } else { + /* can't use ob from ptr->id.data because that enum is also used by operators */ + ob = CTX_data_active_object(C); + } + + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_ACTUATOR); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_ALWAYS); + + if (ob != NULL) { + if (ob->type==OB_ARMATURE) { + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_ARMATURE); + } + } + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_COLLISION); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_DELAY); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_JOYSTICK); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_KEYBOARD); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_MESSAGE); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_MOUSE); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_NEAR); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_PROPERTY); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_RADAR); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_RANDOM); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_RAY); + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_TOUCH); + + RNA_enum_item_end(&item, &totitem); + *free= 1; + + return item; +} + +static void rna_Sensor_keyboard_key_set(struct PointerRNA *ptr, int value) +{ + bSensor *sens= (bSensor *)ptr->data; + bKeyboardSensor *ks = (bKeyboardSensor *)sens->data; + + if (ISKEYBOARD(value)) + ks->key = value; +} + +static void rna_Sensor_keyboard_modifier_set(struct PointerRNA *ptr, int value) +{ + bSensor *sens= (bSensor *)ptr->data; + bKeyboardSensor *ks = (bKeyboardSensor *)sens->data; + + if (ISKEYBOARD(value)) + ks->qual = value; +} + +static void rna_Sensor_keyboard_modifier2_set(struct PointerRNA *ptr, int value) +{ + bSensor *sens= (bSensor *)ptr->data; + bKeyboardSensor *ks = (bKeyboardSensor *)sens->data; + + if (ISKEYBOARD(value)) + ks->qual2 = value; +} + +static void rna_Sensor_tap_set(struct PointerRNA *ptr, int value) +{ + bSensor *sens= (bSensor*)ptr->data; + + sens->tap = value; + if(sens->tap == 1) + sens->level = 0; +} + +static void rna_Sensor_level_set(struct PointerRNA *ptr, int value) +{ + bSensor *sens= (bSensor*)ptr->data; + + sens->level = value; + if(sens->level == 1) + sens->tap = 0; +} + +static void rna_Sensor_Armature_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + bSensor *sens= (bSensor *)ptr->data; + bArmatureSensor *as = sens->data; + Object *ob = (Object *)ptr->id.data; + + char *posechannel= as->posechannel; + char *constraint= as->constraint; + + /* check that bone exist in the active object */ + if (ob->type == OB_ARMATURE && ob->pose) { + bPoseChannel *pchan; + bPose *pose = ob->pose; + for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) { + if (!strcmp(pchan->name, posechannel)) { + /* found it, now look for constraint channel */ + bConstraint *con; + for (con=pchan->constraints.first; con; con=con->next) { + if (!strcmp(con->name, constraint)) { + /* found it, all ok */ + return; + } + } + /* didn't find constraint, make empty */ + constraint[0] = 0; + return; + } + } + } + /* didn't find any */ + posechannel[0] = 0; + constraint[0] = 0; +} + +/* note: the following set functions exists only to avoid id refcounting */ +static void rna_Sensor_touch_material_set(PointerRNA *ptr, PointerRNA value) +{ + bSensor *sens = (bSensor *)ptr->data; + bTouchSensor *ts = (bTouchSensor *) sens->data; + + ts->ma = value.data; +} #else static void rna_def_sensor(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem sensor_type_items[] ={ - {SENS_ALWAYS, "ALWAYS", 0, "Always", ""}, - {SENS_TOUCH, "TOUCH", 0, "Touch", ""}, - {SENS_NEAR, "NEAR", 0, "Near", ""}, - {SENS_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""}, - {SENS_PROPERTY, "PROPERTY", 0, "Property", ""}, - {SENS_MOUSE, "MOUSE", 0, "Mouse", ""}, - {SENS_COLLISION, "COLLISION", 0, "Collision", ""}, - {SENS_RADAR, "RADAR", 0, "Radar", ""}, - {SENS_RANDOM, "RANDOM", 0, "Random", ""}, - {SENS_RAY, "RAY", 0, "Ray", ""}, - {SENS_MESSAGE, "MESSAGE", 0, "Message", ""}, - {SENS_JOYSTICK, "JOYSTICK", 0, "joystick", ""}, - {SENS_ACTUATOR, "ACTUATOR", 0, "Actuator", ""}, - {SENS_DELAY, "DELAY", 0, "Delay", ""}, - {SENS_ARMATURE, "ARMATURE", 0, "Armature", ""}, - {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "Sensor", NULL); RNA_def_struct_ui_text(srna, "Sensor", "Game engine logic brick to detect events"); @@ -105,31 +251,59 @@ static void rna_def_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", "Sensor name"); RNA_def_struct_name_property(srna, prop); + RNA_def_property_update(prop, NC_LOGIC, NULL); - /* type is not editable, would need to do proper data free/alloc */ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, sensor_type_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_Sensor_type_set", "rna_Sensor_type_itemf"); RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "pinned", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_PIN); + RNA_def_property_ui_text(prop, "Pinned", "Display when not linked to a visible states controller"); + RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_SHOW); + RNA_def_property_ui_text(prop, "Expanded", "Set sensor expanded in the user interface"); + RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Invert Output", "Invert the level(output) of this sensor"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "level", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Level", "Level detector, trigger controllers of new states(only applicable upon logic state transition)"); + RNA_def_property_boolean_funcs(prop, NULL, "rna_Sensor_level_set"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "pulse_true_level", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pulse", SENS_PULSE_REPEAT); RNA_def_property_ui_text(prop, "Pulse True Level", "Activate TRUE level triggering (pulse mode)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "pulse_false_level", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pulse", SENS_NEG_PULSE_MODE); RNA_def_property_ui_text(prop, "Pulse False Level", "Activate FALSE level triggering (pulse mode)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "frequence", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "freq"); RNA_def_property_ui_text(prop, "Frequency", "Delay between repeated pulses(in logic tics, 0=no delay)"); RNA_def_property_range(prop, 0, 10000); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "tap", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "tap", 1); + RNA_def_property_boolean_funcs(prop, NULL, "rna_Sensor_tap_set"); + RNA_def_property_ui_text(prop, "Tap", "Trigger controllers only for an instant, even while the sensor remains true"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + RNA_api_sensor(srna); } static void rna_def_always_sensor(BlenderRNA *brna) @@ -151,16 +325,19 @@ static void rna_def_near_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "dist"); RNA_def_property_ui_text(prop, "Distance", "Trigger distance"); RNA_def_property_range(prop, 0.0f, 10000.0f); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "reset_distance", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "resetdist"); RNA_def_property_ui_text(prop, "Reset Distance", ""); RNA_def_property_range(prop, 0.0f, 10000.0f); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_mouse_sensor(BlenderRNA *brna) @@ -187,6 +364,7 @@ static void rna_def_mouse_sensor(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, mouse_event_items); RNA_def_property_ui_text(prop, "Mouse Event", "Specify the type of event this mouse sensor should trigger on"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_touch_sensor(BlenderRNA *brna) @@ -202,7 +380,10 @@ static void rna_def_touch_sensor(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Material"); RNA_def_property_pointer_sdna(prop, NULL, "ma"); RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Material", "Only look for floors with this material"); + RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material"); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Sensor_touch_material_set", NULL); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_keyboard_sensor(BlenderRNA *brna) @@ -214,34 +395,41 @@ static void rna_def_keyboard_sensor(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Keyboard Sensor", "Sensor to detect keyboard events"); RNA_def_struct_sdna_from(srna, "bKeyboardSensor", "data"); - prop= RNA_def_property(srna, "key", PROP_INT, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* need better range or enum check */ - RNA_def_property_ui_text(prop, "Key", "Input key code"); - RNA_def_property_range(prop, 0, 255); - - prop= RNA_def_property(srna, "modifier_key", PROP_INT, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* need better range or enum check */ - RNA_def_property_int_sdna(prop, NULL, "qual"); + prop= RNA_def_property(srna, "key", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "key"); + RNA_def_property_enum_items(prop, event_type_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_Sensor_keyboard_key_set", NULL); + RNA_def_property_ui_text(prop, "Key", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "modifier_key", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "qual"); + RNA_def_property_enum_items(prop, event_type_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_Sensor_keyboard_modifier_set", NULL); RNA_def_property_ui_text(prop, "Modifier Key", "Modifier key code"); - RNA_def_property_range(prop, 0, 255); - - prop= RNA_def_property(srna, "second_modifier_key", PROP_INT, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* need better range or enum check */ - RNA_def_property_int_sdna(prop, NULL, "qual2"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "second_modifier_key", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "qual2"); + RNA_def_property_enum_items(prop, event_type_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_Sensor_keyboard_modifier2_set", NULL); RNA_def_property_ui_text(prop, "Second Modifier Key", "Modifier key code"); - RNA_def_property_range(prop, 0, 255); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "target", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "targetName"); RNA_def_property_ui_text(prop, "Target", "Property that indicates whether to log keystrokes as a string"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "log", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "toggleName"); - RNA_def_property_ui_text(prop, "Log", "Property that receive the keystrokes in case a string is logged"); + RNA_def_property_ui_text(prop, "Log Toggle", "Property that receive the keystrokes in case a string is logged"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "all_keys", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "type", 1); RNA_def_property_ui_text(prop, "All Keys", "Trigger this sensor on any keystroke"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_property_sensor(BlenderRNA *brna) @@ -264,22 +452,27 @@ static void rna_def_property_sensor(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Evaluation Type", "Type of property evaluation"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Property", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "value"); RNA_def_property_ui_text(prop, "Value", "Check for this value in types in Equal or Not Equal types"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "min_value", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "value"); RNA_def_property_ui_text(prop, "Minimum Value", "Specify minimum value in Interval type"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "max_value", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "maxvalue"); RNA_def_property_ui_text(prop, "Maximum Value", "Specify maximum value in Interval type"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_armature_sensor(BlenderRNA *brna) @@ -298,22 +491,26 @@ static void rna_def_armature_sensor(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Armature Sensor", "Sensor to detect values and changes in values of IK solver"); RNA_def_struct_sdna_from(srna, "bArmatureSensor", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "test_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Test Type", "Type of value and test"); + RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "channel_name", PROP_STRING, PROP_NONE); + prop= RNA_def_property(srna, "bone", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "posechannel"); RNA_def_property_ui_text(prop, "Bone name", "Identify the bone to check value from"); + RNA_def_property_update(prop, NC_LOGIC, "rna_Sensor_Armature_update"); - prop= RNA_def_property(srna, "constraint_name", PROP_STRING, PROP_NONE); + prop= RNA_def_property(srna, "constraint", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "constraint"); RNA_def_property_ui_text(prop, "Constraint name", "Identify the bone constraint to check value from"); + RNA_def_property_update(prop, NC_LOGIC, "rna_Sensor_Armature_update"); prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "value"); RNA_def_property_ui_text(prop, "Compare Value", "Specify value to be used in comparison"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_actuator_sensor(BlenderRNA *brna) @@ -329,6 +526,7 @@ static void rna_def_actuator_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "actuator", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Actuator", "Actuator name, actuator active state modifications will be detected"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_delay_sensor(BlenderRNA *brna) @@ -343,48 +541,57 @@ static void rna_def_delay_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "delay", PROP_INT, PROP_NONE); RNA_def_property_ui_text(prop, "Delay", "Delay in number of logic tics before the positive trigger (default 60 per second)"); RNA_def_property_range(prop, 0, 5000); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "duration", PROP_INT, PROP_NONE); RNA_def_property_ui_text(prop, "Duration", "If >0, delay in number of logic tics before the negative trigger following the positive trigger"); RNA_def_property_range(prop, 0, 5000); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "repeat", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_DELAY_REPEAT); RNA_def_property_ui_text(prop, "Repeat", "Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_collision_sensor(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_type_items[] ={ - {0, "PROPERTY", 0, "Property", ""}, - {1, "MATERIAL", 0, "Material", ""}, - {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "CollisionSensor", "Sensor"); RNA_def_struct_ui_text(srna, "Collision Sensor", "Sensor to detect objects colliding with the current object, with more settings than the Touch sensor"); RNA_def_struct_sdna_from(srna, "bCollisionSensor", "data"); + prop= RNA_def_property(srna, "pulse", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "mode", SENS_COLLISION_PULSE); + RNA_def_property_ui_text(prop, "Pulse", "Changes to the set of colliding objects generates pulse"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "collision_type", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "mode", SENS_COLLISION_MATERIAL); + RNA_def_property_ui_text(prop, "M/P", "Toggle collision on material or property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Property Name", "Only look for Objects with this property"); + RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + //XXX to make a setFunction to create a lookup with all materials in Blend File (not only this object mat.) prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "materialName"); - RNA_def_property_ui_text(prop, "Material Name", "Only look for Objects with this material"); + RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material"); + RNA_def_property_update(prop, NC_LOGIC, NULL); -/* +/*//XXX either use a datablock look up to store the string name (material) + // or to do a doversion and use a material pointer. prop= RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Material"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_pointer_sdna(prop, NULL, "ma"); RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material"); */ - prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "mode"); - RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Collision Type", "Toggle collision on material or property"); } static void rna_def_radar_sensor(BlenderRNA *brna) @@ -407,19 +614,23 @@ static void rna_def_radar_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, axis_items); RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the radar cone is cast"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0, 179.9); RNA_def_property_ui_text(prop, "Angle", "Opening angle of the radar cone"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "range"); RNA_def_property_range(prop, 0.0, 10000.0); RNA_def_property_ui_text(prop, "Distance", "Depth of the radar cone"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_random_sensor(BlenderRNA *brna) @@ -434,6 +645,7 @@ static void rna_def_random_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE); RNA_def_property_range(prop, 0, 1000); RNA_def_property_ui_text(prop, "Seed", "Initial seed of the generator. (Choose 0 for not random)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_ray_sensor(BlenderRNA *brna) @@ -448,24 +660,34 @@ static void rna_def_ray_sensor(BlenderRNA *brna) {SENS_RAY_NEG_Y_AXIS, "NEGYAXIS", 0, "-Y axis", ""}, {SENS_RAY_NEG_Z_AXIS, "NEGZAXIS", 0, "-Z axis", ""}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem prop_type_items[] ={ - {0, "PROPERTY", 0, "Property", ""}, - {1, "MATERIAL", 0, "Material", ""}, + + static const EnumPropertyItem prop_ray_type_items[]= { + {SENS_COLLISION_PROPERTY, "PROPERTY", ICON_LOGIC, "Property", "Use a material for ray intersections"}, + {SENS_COLLISION_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "Material", "Use a property for ray intersections"}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "RaySensor", "Sensor"); RNA_def_struct_ui_text(srna, "Ray Sensor", "Sensor to detect intersections with a ray emanating from the current object"); RNA_def_struct_sdna_from(srna, "bRaySensor", "data"); + + prop= RNA_def_property(srna, "ray_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_ray_type_items); + RNA_def_property_ui_text(prop, "Ray Type", "Toggle collision on material or property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "propname"); RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "matname"); RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material"); + RNA_def_property_update(prop, NC_LOGIC, NULL); -/* + /* //XXX either use a datablock look up to store the string name (material) + // or to do a doversion and use a material pointer. prop= RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Material"); RNA_def_property_flag(prop, PROP_EDITABLE); @@ -473,23 +695,21 @@ static void rna_def_ray_sensor(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material"); */ - prop= RNA_def_property(srna, "ray_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "mode"); - RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Collision Type", "Toggle collision on material or property"); - prop= RNA_def_property(srna, "x_ray_mode", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", SENS_RAY_XRAY); RNA_def_property_ui_text(prop, "X-Ray Mode", "Toggle X-Ray option (see through objects that don't have the property)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.01, 10000.0); RNA_def_property_ui_text(prop, "Range", "Sense objects no farther than this distance"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "axisflag"); RNA_def_property_enum_items(prop, axis_items); RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the ray is cast"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_message_sensor(BlenderRNA *brna) @@ -503,6 +723,7 @@ static void rna_def_message_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "subject", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Subject", "Optional subject filter: only accept messages with this subject, or empty for all"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_joystick_sensor(BlenderRNA *brna) @@ -514,6 +735,7 @@ static void rna_def_joystick_sensor(BlenderRNA *brna) {SENS_JOY_BUTTON, "BUTTON", 0, "Button", ""}, {SENS_JOY_AXIS, "AXIS", 0, "Axis", ""}, {SENS_JOY_HAT, "HAT", 0, "Hat", ""}, + {SENS_JOY_AXIS_SINGLE, "AXIS_SINGLE", 0, "Single Axis", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem axis_direction_items[] ={ @@ -523,56 +745,84 @@ static void rna_def_joystick_sensor(BlenderRNA *brna) {SENS_JOY_NEG_Y_AXIS, "DOWNAXIS", 0, "Down Axis", ""}, {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem hat_direction_items[] ={ + {SENS_JOY_HAT_UP, "UP", 0, "Up", ""}, + {SENS_JOY_HAT_DOWN, "DOWN", 0, "Down", ""}, + {SENS_JOY_HAT_LEFT, "LEFT", 0, "Left", ""}, + {SENS_JOY_HAT_RIGHT, "RIGHT", 0, "Right", ""}, + + {SENS_JOY_HAT_UP_RIGHT, "UPRIGHT", 0, "Up/Right", ""}, + {SENS_JOY_HAT_DOWN_LEFT, "DOWNLEFT", 0, "Down/Left", ""}, + {SENS_JOY_HAT_UP_LEFT, "UPLEFT", 0, "Up/Left", ""}, + {SENS_JOY_HAT_DOWN_RIGHT, "DOWNRIGHT", 0, "Down/Right", ""}, + {0, NULL, 0, NULL, NULL}}; + srna= RNA_def_struct(brna, "JoystickSensor", "Sensor"); RNA_def_struct_ui_text(srna, "Joystick Sensor", "Sensor to detect joystick events"); RNA_def_struct_sdna_from(srna, "bJoystickSensor", "data"); prop= RNA_def_property(srna, "joystick_index", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "joyindex"); - RNA_def_property_ui_text(prop, "Joystick Index", "Specify which joystick to use"); + RNA_def_property_ui_text(prop, "Index", "Specify which joystick to use"); RNA_def_property_range(prop, 0, SENS_JOY_MAXINDEX-1); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "event_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, event_type_items); RNA_def_property_ui_text(prop, "Event Type", "The type of event this joystick sensor is triggered on"); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "all_events", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_JOY_ANY_EVENT); RNA_def_property_ui_text(prop, "All Events", "Triggered by all events on this joysticks current type (axis/button/hat)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* Button */ prop= RNA_def_property(srna, "button_number", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "button"); RNA_def_property_ui_text(prop, "Button Number", "Specify which button to use"); RNA_def_property_range(prop, 0, 18); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* Axis */ prop= RNA_def_property(srna, "axis_number", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "axis"); RNA_def_property_ui_text(prop, "Axis Number", "Specify which axis pair to use, 1 is usually the main direction input"); RNA_def_property_range(prop, 1, 2); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "axis_threshold", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "precision"); RNA_def_property_ui_text(prop, "Axis Threshold", "Specify the precision of the axis"); RNA_def_property_range(prop, 0, 32768); + RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "axis_direction", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "axisf"); RNA_def_property_enum_items(prop, axis_direction_items); RNA_def_property_ui_text(prop, "Axis Direction", "The direction of the axis"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* Single Axis */ + prop= RNA_def_property(srna, "single_axis_number", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "axis_single"); + RNA_def_property_ui_text(prop, "Axis Number", "Specify a single axis (verticle/horizontal/other) to detect"); + RNA_def_property_range(prop, 1, 16); + RNA_def_property_update(prop, NC_LOGIC, NULL); /* Hat */ prop= RNA_def_property(srna, "hat_number", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "hat"); RNA_def_property_ui_text(prop, "Hat Number", "Specify which hat to use"); RNA_def_property_range(prop, 1, 2); + RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "hat_direction", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "hatf"); + prop= RNA_def_property(srna, "hat_direction", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "hatf"); + RNA_def_property_enum_items(prop, hat_direction_items); RNA_def_property_ui_text(prop, "Hat Direction", "Specify hat direction"); - RNA_def_property_range(prop, 0, 12); + RNA_def_property_update(prop, NC_LOGIC, NULL); } void RNA_def_sensor(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_sensor_api.c b/source/blender/makesrna/intern/rna_sensor_api.c new file mode 100644 index 00000000000..afdb71b4f3b --- /dev/null +++ b/source/blender/makesrna/intern/rna_sensor_api.c @@ -0,0 +1,72 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2010 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include + +#include "WM_types.h" +#include "RNA_define.h" + +#ifdef RNA_RUNTIME + +#include "BKE_sca.h" +#include "DNA_sensor_types.h" +#include "DNA_controller_types.h" + +static void rna_Sensor_link(bSensor *sens, bController *cont) +{ + link_logicbricks((void **)&cont, (void ***)&(sens->links), &sens->totlinks, sizeof(bController *)); +} + +static void rna_Sensor_unlink(bSensor *sens, bController *cont) +{ + unlink_logicbricks((void **)&cont, (void ***)&(sens->links), &sens->totlinks); +} + +#else + +void RNA_api_sensor(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "link", "rna_Sensor_link"); + RNA_def_function_ui_description(func, "Link the sensor to a controller."); + parm= RNA_def_pointer(func, "controller", "Controller", "", "Controller to link to."); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_update(parm, NC_LOGIC, NULL); + + func= RNA_def_function(srna, "unlink", "rna_Sensor_unlink"); + RNA_def_function_ui_description(func, "Unlink the sensor from a controller."); + parm= RNA_def_pointer(func, "controller", "Controller", "", "Controller to unlink from."); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_update(parm, NC_LOGIC, NULL); +} + +#endif + diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 7464df6eb79..f46efb675ca 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -27,10 +27,10 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" +#include "DNA_anim_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" @@ -41,9 +41,20 @@ #include "MEM_guardedalloc.h" #include "WM_types.h" +#include "BLI_math.h" #ifdef RNA_RUNTIME +static float to_dB(float x) +{ + return logf(x * x + 1e-30f) * 4.34294480f; +} + +static float from_dB(float x) +{ + return expf(x * 0.11512925f); +} + /* build a temp referene to the parent */ static void meta_tmp_ref(Sequence *seq_par, Sequence *seq) { @@ -131,7 +142,29 @@ static void rna_Sequence_end_frame_final_set(PointerRNA *ptr, int value) rna_Sequence_frame_change_update(scene, seq); } -static void rna_Sequence_length_set(PointerRNA *ptr, int value) +static void rna_Sequence_anim_startofs_final_set(PointerRNA *ptr, int value) +{ + Sequence *seq= (Sequence*)ptr->data; + Scene *scene= (Scene*)ptr->id.data; + + seq->anim_startofs = MIN2(value, seq->len + seq->anim_startofs); + + reload_sequence_new_file(scene, seq, FALSE); + rna_Sequence_frame_change_update(scene, seq); +} + +static void rna_Sequence_anim_endofs_final_set(PointerRNA *ptr, int value) +{ + Sequence *seq= (Sequence*)ptr->data; + Scene *scene= (Scene*)ptr->id.data; + + seq->anim_endofs = MIN2(value, seq->len + seq->anim_endofs); + + reload_sequence_new_file(scene, seq, FALSE); + rna_Sequence_frame_change_update(scene, seq); +} + +static void rna_Sequence_frame_length_set(PointerRNA *ptr, int value) { Sequence *seq= (Sequence*)ptr->data; Scene *scene= (Scene*)ptr->id.data; @@ -140,7 +173,7 @@ static void rna_Sequence_length_set(PointerRNA *ptr, int value) rna_Sequence_frame_change_update(scene, seq); } -static int rna_Sequence_length_get(PointerRNA *ptr) +static int rna_Sequence_frame_length_get(PointerRNA *ptr) { Sequence *seq= (Sequence*)ptr->data; return seq_tx_get_final_right(seq, 0)-seq_tx_get_final_left(seq, 0); @@ -237,7 +270,8 @@ static void rna_Sequence_name_set(PointerRNA *ptr, const char *value) { Scene *scene= (Scene*)ptr->id.data; Sequence *seq= (Sequence*)ptr->data; - char oldname[32]; + char oldname[sizeof(seq->name)]; + AnimData *adt; /* make a copy of the old name first */ BLI_strncpy(oldname, seq->name+2, sizeof(seq->name)-2); @@ -249,7 +283,12 @@ static void rna_Sequence_name_set(PointerRNA *ptr, const char *value) seqbase_unique_name_recursive(&scene->ed->seqbase, seq); /* fix all the animation data which may link to this */ - BKE_all_animdata_fix_paths_rename("sequence_editor.sequences_all", oldname, seq->name+2); + + /* dont rename everywhere because these are per scene */ + /* BKE_all_animdata_fix_paths_rename("sequence_editor.sequences_all", oldname, seq->name+2); */ + adt= BKE_animdata_from_id(&scene->id); + if(adt) + BKE_animdata_fix_paths_rename(&scene->id, adt, "sequence_editor.sequences_all", oldname, seq->name+2, 0, 0, 1); } static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr) @@ -276,6 +315,8 @@ static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr) case SEQ_MUL: case SEQ_OVERDROP: return &RNA_EffectSequence; + case SEQ_MULTICAM: + return &RNA_MulticamSequence; case SEQ_PLUGIN: return &RNA_PluginSequence; case SEQ_WIPE: @@ -314,12 +355,23 @@ static PointerRNA rna_SequenceEditor_meta_stack_get(CollectionPropertyIterator * return rna_pointer_inherit_refine(&iter->parent, &RNA_Sequence, ms->parseq); } +/* TODO, expose seq path setting as a higher level sequencer BKE function */ static void rna_Sequence_filepath_set(PointerRNA *ptr, const char *value) { Sequence *seq= (Sequence*)(ptr->data); char dir[FILE_MAX], name[FILE_MAX]; - BLI_split_dirfile_basic(value, dir, name); + if(seq->type == SEQ_SOUND && seq->sound) { + /* for sound strips we need to update the sound as well. + * arguably, this could load in a new sound rather then modify an existing one. + * but while using the sequencer its most likely your not using the sound in the game engine too. + */ + PointerRNA id_ptr; + RNA_id_pointer_create((ID *)seq->sound, &id_ptr); + RNA_string_set(&id_ptr, "filepath", value); + } + + BLI_split_dirfile(value, dir, name); BLI_strncpy(seq->strip->dir, dir, sizeof(seq->strip->dir)); BLI_strncpy(seq->strip->stripdata->name, name, sizeof(seq->strip->stripdata->name)); } @@ -342,12 +394,55 @@ static int rna_Sequence_filepath_length(PointerRNA *ptr) return strlen(path)+1; } -static void rna_SoundSequence_filename_set(PointerRNA *ptr, const char *value) +static void rna_Sequence_proxy_filepath_set(PointerRNA *ptr, const char *value) +{ + StripProxy *proxy= (StripProxy*)(ptr->data); + char dir[FILE_MAX], name[FILE_MAX]; + + BLI_split_dirfile(value, dir, name); + BLI_strncpy(proxy->dir, dir, sizeof(proxy->dir)); + BLI_strncpy(proxy->file, name, sizeof(proxy->file)); +} + +static void rna_Sequence_proxy_filepath_get(PointerRNA *ptr, char *value) +{ + StripProxy *proxy= (StripProxy*)(ptr->data); + char path[FILE_MAX]; + + BLI_join_dirfile(path, proxy->dir, proxy->file); + BLI_strncpy(value, path, strlen(path)+1); +} + +static int rna_Sequence_proxy_filepath_length(PointerRNA *ptr) +{ + StripProxy *proxy= (StripProxy*)(ptr->data); + char path[FILE_MAX]; + + BLI_join_dirfile(path, proxy->dir, proxy->file); + return strlen(path)+1; +} + +static float rna_Sequence_attenuation_get(PointerRNA *ptr) +{ + Sequence *seq= (Sequence*)(ptr->data); + + return to_dB(seq->volume); +} + +static void rna_Sequence_attenuation_set(PointerRNA *ptr, float value) +{ + Sequence *seq= (Sequence*)(ptr->data); + + seq->volume = from_dB(value); +} + + +/*static void rna_SoundSequence_filename_set(PointerRNA *ptr, const char *value) { Sequence *seq= (Sequence*)(ptr->data); char dir[FILE_MAX], name[FILE_MAX]; - BLI_split_dirfile_basic(value, dir, name); + BLI_split_dirfile(value, dir, name); BLI_strncpy(seq->strip->dir, dir, sizeof(seq->strip->dir)); BLI_strncpy(seq->strip->stripdata->name, name, sizeof(seq->strip->stripdata->name)); } @@ -357,9 +452,9 @@ static void rna_SequenceElement_filename_set(PointerRNA *ptr, const char *value) StripElem *elem= (StripElem*)(ptr->data); char name[FILE_MAX]; - BLI_split_dirfile_basic(value, NULL, name); + BLI_split_dirfile(value, NULL, name); BLI_strncpy(elem->name, name, sizeof(elem->name)); -} +}*/ static void rna_Sequence_update(Main *bmain, Scene *scene, PointerRNA *ptr) { @@ -379,6 +474,14 @@ static void rna_Sequence_mute_update(Main *bmain, Scene *scene, PointerRNA *ptr) rna_Sequence_update(bmain, scene, ptr); } +static void rna_Sequence_filepath_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Sequence *seq= (Sequence*)(ptr->data); + reload_sequence_new_file(scene, seq, TRUE); + calc_sequence(scene, seq); + rna_Sequence_update(bmain, scene, ptr); +} + /* do_versions? */ static float rna_Sequence_opacity_get(PointerRNA *ptr) { return ((Sequence*)(ptr->data))->blend_opacity / 100.0f; @@ -387,6 +490,86 @@ static void rna_Sequence_opacity_set(PointerRNA *ptr, float value) { ((Sequence*)(ptr->data))->blend_opacity = value * 100.0f; } + +static int colbalance_seq_cmp_cb(Sequence *seq, void *arg_pt) +{ + struct { Sequence *seq; void *color_balance; } *data= arg_pt; + + if(seq->strip && seq->strip->color_balance == data->color_balance) { + data->seq= seq; + return -1; /* done so bail out */ + } + return 1; +} +static char *rna_SequenceColorBalance_path(PointerRNA *ptr) +{ + Scene *scene= ptr->id.data; + Editing *ed= seq_give_editing(scene, FALSE); + Sequence *seq; + + struct { Sequence *seq; void *color_balance; } data; + data.seq= NULL; + data.color_balance= ptr->data; + + /* irritating we need to search for our sequence! */ + seqbase_recursive_apply(&ed->seqbase, colbalance_seq_cmp_cb, &data); + seq= data.seq; + + if (seq && seq->name+2) + return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].color_balance", seq->name+2); + else + return BLI_strdup(""); +} + +static void rna_SequenceEditor_overlay_lock_set(PointerRNA *ptr, int value) +{ + Scene *scene= ptr->id.data; + Editing *ed= seq_give_editing(scene, FALSE); + + if(ed==NULL) + return; + + /* convert from abs to relative and back */ + if((ed->over_flag & SEQ_EDIT_OVERLAY_ABS)==0 && value) { + ed->over_cfra= scene->r.cfra + ed->over_ofs; + ed->over_flag |= SEQ_EDIT_OVERLAY_ABS; + } + else if((ed->over_flag & SEQ_EDIT_OVERLAY_ABS) && !value) { + ed->over_ofs= ed->over_cfra - scene->r.cfra; + ed->over_flag &= ~SEQ_EDIT_OVERLAY_ABS; + } +} + +static int rna_SequenceEditor_overlay_frame_get(PointerRNA *ptr) +{ + Scene *scene= (Scene *)ptr->id.data; + Editing *ed= seq_give_editing(scene, FALSE); + + if(ed==NULL) + return scene->r.cfra; + + if(ed->over_flag & SEQ_EDIT_OVERLAY_ABS) + return ed->over_cfra - scene->r.cfra; + else + return ed->over_ofs; + +} + +static void rna_SequenceEditor_overlay_frame_set(PointerRNA *ptr, int value) +{ + Scene *scene= (Scene *)ptr->id.data; + Editing *ed= seq_give_editing(scene, FALSE); + + if(ed==NULL) + return; + + + if(ed->over_flag & SEQ_EDIT_OVERLAY_ABS) + ed->over_cfra= (scene->r.cfra + value); + else + ed->over_ofs= value; +} + #else static void rna_def_strip_element(BlenderRNA *brna) @@ -400,9 +583,7 @@ static void rna_def_strip_element(BlenderRNA *brna) prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILENAME); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Filename", ""); - RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SequenceElement_filename_set"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); } @@ -447,7 +628,7 @@ static void rna_def_strip_transform(BlenderRNA *brna) prop= RNA_def_property(srna, "offset_x", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "xofs"); - RNA_def_property_ui_text(prop, "Offset Y", ""); + RNA_def_property_ui_text(prop, "Offset X", ""); RNA_def_property_ui_range(prop, -4096, 4096, 1, 0); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); @@ -469,12 +650,13 @@ static void rna_def_strip_proxy(BlenderRNA *brna) prop= RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, NULL, "dir"); - RNA_def_property_ui_text(prop, "Directory", "Location to story the proxy file"); + RNA_def_property_ui_text(prop, "Directory", "Location to store the proxy files"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "file", PROP_STRING, PROP_DIRPATH); - RNA_def_property_string_sdna(prop, NULL, "file"); - RNA_def_property_ui_text(prop, "File", "Proxy file name"); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); + RNA_def_property_ui_text(prop, "Path", "Location of custom proxy file"); + RNA_def_property_string_funcs(prop, "rna_Sequence_proxy_filepath_get", "rna_Sequence_proxy_filepath_length", "rna_Sequence_proxy_filepath_set"); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); } @@ -489,14 +671,17 @@ static void rna_def_strip_color_balance(BlenderRNA *brna) prop= RNA_def_property(srna, "lift", PROP_FLOAT, PROP_COLOR); RNA_def_property_ui_text(prop, "Lift", "Color balance lift (shadows)"); + RNA_def_property_ui_range(prop, 0, 2, 0.1, 3); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_COLOR); RNA_def_property_ui_text(prop, "Gamma", "Color balance gamma (midtones)"); + RNA_def_property_ui_range(prop, 0, 2, 0.1, 3); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); prop= RNA_def_property(srna, "gain", PROP_FLOAT, PROP_COLOR); RNA_def_property_ui_text(prop, "Gain", "Color balance gain (highlights)"); + RNA_def_property_ui_range(prop, 0, 2, 0.1, 3); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); prop= RNA_def_property(srna, "inverse_gain", PROP_BOOLEAN, PROP_NONE); @@ -513,7 +698,9 @@ static void rna_def_strip_color_balance(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_COLOR_BALANCE_INVERSE_LIFT); RNA_def_property_ui_text(prop, "Inverse Lift", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - + + RNA_def_struct_path_func(srna, "rna_SequenceColorBalance_path"); + /* not yet used prop= RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0f, 1.0f); @@ -530,7 +717,6 @@ static void rna_def_sequence(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - FunctionRNA *func; static const EnumPropertyItem seq_type_items[]= { {SEQ_IMAGE, "IMAGE", 0, "Image", ""}, @@ -552,6 +738,7 @@ static void rna_def_sequence(BlenderRNA *brna) {SEQ_TRANSFORM, "TRANSFORM", 0, "Transform", ""}, {SEQ_COLOR, "COLOR", 0, "Color", ""}, {SEQ_SPEED, "SPEED", 0, "Speed", ""}, + {SEQ_MULTICAM, "MULTICAM", 0, "Multicam Selector", ""}, {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem blend_mode_items[]= { @@ -585,35 +772,30 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); //prop= RNA_def_property(srna, "ipo", PROP_POINTER, PROP_NONE); - //RNA_def_property_ui_text(prop, "Ipo Curves", "Ipo curves used by this sequence"); + //RNA_def_property_ui_text(prop, "IPO Curves", "IPO curves used by this sequence"); /* flags */ prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT); RNA_def_property_ui_text(prop, "Selected", ""); - RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER_SELECT, NULL); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER|NA_SELECTED, NULL); prop= RNA_def_property(srna, "left_handle_selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_LEFTSEL); RNA_def_property_ui_text(prop, "Left Handle Selected", ""); - RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER_SELECT, NULL); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER|NA_SELECTED, NULL); prop= RNA_def_property(srna, "right_handle_selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_RIGHTSEL); RNA_def_property_ui_text(prop, "Right Handle Selected", ""); - RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER_SELECT, NULL); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER|NA_SELECTED, NULL); prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MUTE); RNA_def_property_ui_text(prop, "Mute", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_mute_update"); - prop= RNA_def_property(srna, "frame_locked", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_IPO_FRAME_LOCKED); - RNA_def_property_ui_text(prop, "Frame Locked", "Lock the animation curve to the global frame counter"); - RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_LOCK); RNA_def_property_ui_text(prop, "Lock", "Lock strip so that it can't be transformed"); @@ -621,55 +803,60 @@ static void rna_def_sequence(BlenderRNA *brna) /* strip positioning */ - prop= RNA_def_property(srna, "length", PROP_INT, PROP_TIME); - RNA_def_property_int_sdna(prop, NULL, "len"); + prop= RNA_def_property(srna, "frame_final_length", PROP_INT, PROP_TIME); RNA_def_property_range(prop, 1, MAXFRAME); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Length", "The length of the contents of this strip before the handles are applied"); - RNA_def_property_int_funcs(prop, "rna_Sequence_length_get", "rna_Sequence_length_set",NULL); + RNA_def_property_int_funcs(prop, "rna_Sequence_frame_length_get", "rna_Sequence_frame_length_set",NULL); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + + prop= RNA_def_property(srna, "frame_length", PROP_INT, PROP_TIME); + RNA_def_property_int_sdna(prop, NULL, "len"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE|PROP_ANIMATABLE); + RNA_def_property_range(prop, 1, MAXFRAME); + RNA_def_property_ui_text(prop, "Length", "The length of the contents of this strip before the handles are applied"); - prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "start"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Start Frame", ""); RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_start_frame_set",NULL); // overlap tests and calc_seq_disp RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "start_frame_final", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_final_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "startdisp"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Start Frame", "Start frame displayed in the sequence editor after offsets are applied, setting this is equivilent to moving the handle, not the actual start frame"); + RNA_def_property_ui_text(prop, "Start Frame", "Start frame displayed in the sequence editor after offsets are applied, setting this is equivalent to moving the handle, not the actual start frame"); RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_start_frame_final_set", NULL); // overlap tests and calc_seq_disp RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "end_frame_final", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_final_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "enddisp"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "End Frame", "End frame displayed in the sequence editor after offsets are applied"); RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_end_frame_final_set", NULL); // overlap tests and calc_seq_disp RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "start_offset", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_offset_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "startofs"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests RNA_def_property_ui_text(prop, "Start Offset", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "end_offset", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_offset_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "endofs"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests - RNA_def_property_ui_text(prop, "End offset", ""); + RNA_def_property_ui_text(prop, "End Offset", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "start_still", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_still_start", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "startstill"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests RNA_def_property_range(prop, 0, MAXFRAME); RNA_def_property_ui_text(prop, "Start Still", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - prop= RNA_def_property(srna, "end_still", PROP_INT, PROP_TIME); + prop= RNA_def_property(srna, "frame_still_end", PROP_INT, PROP_TIME); RNA_def_property_int_sdna(prop, NULL, "endstill"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests RNA_def_property_range(prop, 0, MAXFRAME); @@ -704,7 +891,7 @@ static void rna_def_sequence(BlenderRNA *brna) prop= RNA_def_property(srna, "use_effect_default_fade", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_USE_EFFECT_DEFAULT_FADE); - RNA_def_property_ui_text(prop, "Use Default Fade", "Fade effect using the builtin default (usually make transition as long as effect strip)"); + RNA_def_property_ui_text(prop, "Use Default Fade", "Fade effect using the built-in default (usually make transition as long as effect strip)"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); @@ -713,12 +900,7 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Speed effect fader position", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); - /* functions */ - func= RNA_def_function(srna, "getStripElem", "give_stripelem"); - RNA_def_function_ui_description(func, "Return the strip element from a given frame or None."); - prop= RNA_def_int(func, "frame", 0, -MAXFRAME, MAXFRAME, "Frame", "The frame to get the strip element from", -MAXFRAME, MAXFRAME); - RNA_def_property_flag(prop, PROP_REQUIRED); - RNA_def_function_return(func, RNA_def_pointer(func, "elem", "SequenceElement", "", "strip element of the current frame")); + RNA_api_sequence_strip(srna); } static void rna_def_editor(BlenderRNA *brna) @@ -750,6 +932,24 @@ static void rna_def_editor(BlenderRNA *brna) prop= RNA_def_property(srna, "active_strip", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "act_seq"); + RNA_def_property_flag(prop, PROP_EDITABLE); + + prop= RNA_def_property(srna, "show_overlay", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "over_flag", SEQ_EDIT_OVERLAY_SHOW); + RNA_def_property_ui_text(prop, "Draw Axes", "Partial overlay ontop of the sequencer"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); + + prop= RNA_def_property(srna, "overlay_lock", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "over_flag", SEQ_EDIT_OVERLAY_ABS); + RNA_def_property_ui_text(prop, "Overlay Lock", ""); + RNA_def_property_boolean_funcs(prop, NULL, "rna_SequenceEditor_overlay_lock_set"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); + + /* access to fixed and relative frame */ + prop= RNA_def_property(srna, "overlay_frame", PROP_INT, PROP_NONE); + RNA_def_property_ui_text(prop, "Overlay Offset", ""); + RNA_def_property_int_funcs(prop, "rna_SequenceEditor_overlay_frame_get", "rna_SequenceEditor_overlay_frame_set", NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); RNA_def_property_ui_text(prop, "Active Strip", "Sequencers active strip"); } @@ -792,6 +992,13 @@ static void rna_def_filter_video(StructRNA *srna) RNA_def_property_ui_text(prop, "Multiply Colors", ""); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "color_saturation", PROP_FLOAT, PROP_UNSIGNED); + RNA_def_property_float_sdna(prop, NULL, "sat"); + RNA_def_property_range(prop, 0.0f, 20.0f); + RNA_def_property_ui_range(prop, 0.0f, 2.0f, 3, 3); + RNA_def_property_ui_text(prop, "Saturation", ""); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "strobe", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 1.0f, 30.0f); RNA_def_property_ui_text(prop, "Strobe", "Only display every nth frame"); @@ -845,6 +1052,11 @@ static void rna_def_proxy(StructRNA *srna) RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_USE_PROXY_CUSTOM_DIR); RNA_def_property_ui_text(prop, "Proxy Custom Directory", "Use a custom directory to store data"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + + prop= RNA_def_property(srna, "proxy_custom_file", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_USE_PROXY_CUSTOM_FILE); + RNA_def_property_ui_text(prop, "Proxy Custom File", "Use a custom file to read proxy data from"); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); } static void rna_def_input(StructRNA *srna) @@ -853,13 +1065,16 @@ static void rna_def_input(StructRNA *srna) prop= RNA_def_property(srna, "animation_start_offset", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "anim_startofs"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap test + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_anim_startofs_final_set", NULL); // overlap tests + RNA_def_property_ui_text(prop, "Animation Start Offset", "Animation start offset (trim start)"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); prop= RNA_def_property(srna, "animation_end_offset", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "anim_endofs"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap test + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_int_funcs(prop, NULL, "rna_Sequence_anim_endofs_final_set", NULL); // overlap tests RNA_def_property_ui_text(prop, "Animation End Offset", "Animation end offset (trim end)"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); } @@ -921,6 +1136,11 @@ static void rna_def_scene(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Scene", "Scene that this sequence uses"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "scene_camera", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Camera Override", "Override the scenes active camera"); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + rna_def_filter_video(srna); rna_def_proxy(srna); rna_def_input(srna); @@ -945,7 +1165,7 @@ static void rna_def_movie(BlenderRNA *brna) RNA_def_property_ui_text(prop, "File", ""); RNA_def_property_string_funcs(prop, "rna_Sequence_filepath_get", "rna_Sequence_filepath_length", "rna_Sequence_filepath_set"); - RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_filepath_update"); rna_def_filter_video(srna); rna_def_proxy(srna); @@ -968,10 +1188,17 @@ static void rna_def_sound(BlenderRNA *brna) prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "volume"); - RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_text(prop, "Volume", "Playback volume of the sound"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "attenuation", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -100.0f, +40.0f); + RNA_def_property_ui_text(prop, "Attenuation/db", "Attenuation in dezibel"); + RNA_def_property_float_funcs(prop, "rna_Sequence_attenuation_get", "rna_Sequence_attenuation_set", NULL); + + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_ui_text(prop, "File", ""); RNA_def_property_string_funcs(prop, "rna_Sequence_filepath_get", "rna_Sequence_filepath_length", @@ -989,9 +1216,30 @@ static void rna_def_effect(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Effect Sequence", "Sequence strip applying an effect on the images created by other strips"); RNA_def_struct_sdna(srna, "Sequence"); + rna_def_filter_video(srna); rna_def_proxy(srna); } +static void rna_def_multicam(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "MulticamSequence", "Sequence"); + RNA_def_struct_ui_text(srna, "Multicam Select Sequence", "Sequence strip to perform multicam editing: select channel from below"); + RNA_def_struct_sdna(srna, "Sequence"); + + prop= RNA_def_property(srna, "multicam_source", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "multicam_source"); + RNA_def_property_range(prop, 0, MAXSEQ-1); + RNA_def_property_ui_text(prop, "Multicam Source Channel", ""); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + + rna_def_filter_video(srna); + rna_def_proxy(srna); + rna_def_input(srna); +} + static void rna_def_plugin(BlenderRNA *brna) { StructRNA *srna; @@ -1182,7 +1430,7 @@ static void rna_def_solid_color(BlenderRNA *brna) PropertyRNA *prop; srna = RNA_def_struct(brna, "ColorSequence", "EffectSequence"); - RNA_def_struct_ui_text(srna, "Color Sequence", "Sequence strip creating an image filled with a single color"); + RNA_def_struct_ui_text(srna, "Color Sequence", "Sequence strip creating an image filled with a single g"); RNA_def_struct_sdna_from(srna, "SolidColorVars", "effectdata"); prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); @@ -1240,6 +1488,7 @@ void RNA_def_sequencer(BlenderRNA *brna) rna_def_movie(brna); rna_def_sound(brna); rna_def_effect(brna); + rna_def_multicam(brna); rna_def_plugin(brna); rna_def_wipe(brna); rna_def_glow(brna); diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c new file mode 100644 index 00000000000..425bad9fcd7 --- /dev/null +++ b/source/blender/makesrna/intern/rna_sequencer_api.c @@ -0,0 +1,72 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Blender Foundation (2010) + * + * ***** END GPL LICENSE BLOCK ***** + */ + + +#include +#include +#include + +#include "RNA_define.h" + +#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */ + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "rna_internal.h" + +#include "DNA_scene_types.h" +#include "DNA_sequence_types.h" + +#ifdef RNA_RUNTIME + +#include "BKE_report.h" +#include "BKE_sequencer.h" + +static void rna_Sequence_swap_internal(Sequence *seq_self, ReportList *reports, Sequence *seq_other) +{ + if(seq_swap(seq_self, seq_other) == 0) + BKE_report(reports, RPT_ERROR, "both strips must be the same length"); +} + +#else + +void RNA_api_sequence_strip(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "getStripElem", "give_stripelem"); + RNA_def_function_ui_description(func, "Return the strip element from a given frame or None."); + parm= RNA_def_int(func, "frame", 0, -MAXFRAME, MAXFRAME, "Frame", "The frame to get the strip element from", -MAXFRAME, MAXFRAME); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_function_return(func, RNA_def_pointer(func, "elem", "SequenceElement", "", "strip element of the current frame")); + + func= RNA_def_function(srna, "swap", "rna_Sequence_swap_internal"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_pointer(func, "other", "Sequence", "Other", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); +} + +#endif diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c index 8d5b38d767d..d4ff98e9701 100644 --- a/source/blender/makesrna/intern/rna_smoke.c +++ b/source/blender/makesrna/intern/rna_smoke.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -47,7 +46,6 @@ #include "BKE_depsgraph.h" #include "BKE_particle.h" -#include "ED_object.h" static void rna_Smoke_update(Main *bmain, Scene *scene, PointerRNA *ptr) { @@ -57,7 +55,7 @@ static void rna_Smoke_update(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr) { rna_Smoke_update(bmain, scene, ptr); - DAG_scene_sort(scene); + DAG_scene_sort(scene); } static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -272,7 +270,7 @@ static void rna_def_smoke_flow_settings(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "temp"); RNA_def_property_range(prop, -10, 10); RNA_def_property_ui_range(prop, -10, 10, 1, 1); - RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambientt temperature"); + RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambient temperature"); RNA_def_property_update(prop, 0, NULL); prop= RNA_def_property(srna, "psys", PROP_POINTER, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_sound.c b/source/blender/makesrna/intern/rna_sound.c index 584e3802db1..9048a3c3072 100644 --- a/source/blender/makesrna/intern/rna_sound.c +++ b/source/blender/makesrna/intern/rna_sound.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -37,7 +36,7 @@ #include "BKE_sound.h" #include "BKE_context.h" -static void rna_Sound_filename_update(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_Sound_filepath_update(Main *bmain, Scene *scene, PointerRNA *ptr) { sound_load(bmain, (bSound*)ptr->data); } @@ -71,10 +70,10 @@ static void rna_def_sound(BlenderRNA *brna) //rna_def_ipo_common(srna); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Filename", "Sound sample file used by this Sound datablock"); - RNA_def_property_update(prop, 0, "rna_Sound_filename_update"); + RNA_def_property_ui_text(prop, "File Path", "Sound sample file used by this Sound datablock"); + RNA_def_property_update(prop, 0, "rna_Sound_filepath_update"); prop= RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "packedfile"); @@ -83,7 +82,7 @@ static void rna_def_sound(BlenderRNA *brna) prop= RNA_def_property(srna, "caching", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_Sound_caching_get", "rna_Sound_caching_set"); RNA_def_property_ui_text(prop, "Caching", "The sound file is decoded and loaded into RAM"); - RNA_def_property_update(prop, 0, "rna_Sound_filename_update"); + RNA_def_property_update(prop, 0, "rna_Sound_filepath_update"); } void RNA_def_sound(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 6f3faeeda35..227466f808d 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -28,7 +28,6 @@ #include "RNA_access.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -90,12 +89,22 @@ EnumPropertyItem autosnap_items[] = { {SACTSNAP_MARKER, "MARKER", 0, "Nearest Marker", "Snap to nearest marker"}, {0, NULL, 0, NULL, NULL}}; +EnumPropertyItem viewport_shading_items[] = { + {OB_BOUNDBOX, "BOUNDBOX", ICON_BBOX, "Bounding Box", "Display the object's local bounding boxes only"}, + {OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"}, + {OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display the object solid, lit with default OpenGL lights"}, + //{OB_SHADED, "SHADED", ICON_SMOOTH, "Shaded", "Display the object solid, with preview shading interpolated at vertices"}, + {OB_TEXTURE, "TEXTURED", ICON_POTATO, "Textured", "Display the object solid, with face-assigned textures"}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME #include "DNA_anim_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BLI_math.h" + #include "BKE_animsys.h" #include "BKE_brush.h" #include "BKE_colortools.h" @@ -116,7 +125,7 @@ static StructRNA* rna_Space_refine(struct PointerRNA *ptr) switch(space->spacetype) { case SPACE_VIEW3D: - return &RNA_Space3DView; + return &RNA_SpaceView3D; case SPACE_IPO: return &RNA_SpaceGraphEditor; case SPACE_OUTLINER: @@ -218,7 +227,7 @@ EnumPropertyItem *rna_TransformOrientation_itemf(bContext *C, PointerRNA *ptr, i RNA_enum_items_add_value(&item, &totitem, transform_orientation_items, V3D_MANIP_LOCAL); RNA_enum_items_add_value(&item, &totitem, transform_orientation_items, V3D_MANIP_VIEW); - if (ptr->type == &RNA_Space3DView) + if (ptr->type == &RNA_SpaceView3D) scene = ((bScreen*)ptr->id.data)->scene; else scene = CTX_data_scene(C); /* can't use scene from ptr->id.data because that enum is also used by operators */ @@ -247,7 +256,7 @@ EnumPropertyItem *rna_TransformOrientation_itemf(bContext *C, PointerRNA *ptr, i } /* Space 3D View */ -static void rna_Space3DView_lock_camera_and_layers_set(PointerRNA *ptr, int value) +static void rna_SpaceView3D_lock_camera_and_layers_set(PointerRNA *ptr, int value) { View3D *v3d= (View3D*)(ptr->data); bScreen *sc= (bScreen*)ptr->id.data; @@ -270,11 +279,31 @@ static void rna_Space3DView_lock_camera_and_layers_set(PointerRNA *ptr, int valu } } -static void rna_Space3DView_layer_set(PointerRNA *ptr, const int *values) +static void rna_View3D_CursorLocation_get(PointerRNA *ptr, float *values) +{ + View3D *v3d= (View3D*)(ptr->data); + bScreen *sc= (bScreen*)ptr->id.data; + Scene *scene= (Scene *)sc->scene; + float *loc = give_cursor(scene, v3d); + + copy_v3_v3(values, loc); +} + +static void rna_View3D_CursorLocation_set(PointerRNA *ptr, const float *values) +{ + View3D *v3d= (View3D*)(ptr->data); + bScreen *sc= (bScreen*)ptr->id.data; + Scene *scene= (Scene *)sc->scene; + float *cursor = give_cursor(scene, v3d); + + copy_v3_v3(cursor, values); +} + +static void rna_SpaceView3D_layer_set(PointerRNA *ptr, const int *values) { View3D *v3d= (View3D*)(ptr->data); - v3d->lay= ED_view3d_scene_layer_set(v3d->lay, values); + v3d->lay= ED_view3d_scene_layer_set(v3d->lay, values, &v3d->layact); } static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr) @@ -284,7 +313,7 @@ static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr) ListBase *regionbase= (sa->spacedata.first == v3d)? &sa->regionbase: &v3d->regionbase; ARegion *ar= regionbase->last; /* always last in list, weak .. */ - return rna_pointer_inherit_refine(ptr, &RNA_Region3DView, ar->regiondata); + return rna_pointer_inherit_refine(ptr, &RNA_RegionView3D, ar->regiondata); } static PointerRNA rna_SpaceView3D_region_quadview_get(PointerRNA *ptr) @@ -296,10 +325,10 @@ static PointerRNA rna_SpaceView3D_region_quadview_get(PointerRNA *ptr) ar= (ar->alignment == RGN_ALIGN_QSPLIT)? ar->prev: NULL; - return rna_pointer_inherit_refine(ptr, &RNA_Region3DView, (ar)? ar->regiondata: NULL); + return rna_pointer_inherit_refine(ptr, &RNA_RegionView3D, (ar)? ar->regiondata: NULL); } -static void rna_Region3DView_quadview_update(Main *main, Scene *scene, PointerRNA *ptr) +static void rna_RegionView3D_quadview_update(Main *main, Scene *scene, PointerRNA *ptr) { ScrArea *sa; ARegion *ar; @@ -309,6 +338,18 @@ static void rna_Region3DView_quadview_update(Main *main, Scene *scene, PointerRN ED_view3d_quadview_update(sa, ar); } +static void rna_RegionView3D_view_location_get(PointerRNA *ptr, float *values) +{ + RegionView3D *rv3d= (RegionView3D *)(ptr->data); + negate_v3_v3(values, rv3d->ofs); +} + +static void rna_RegionView3D_view_location_set(PointerRNA *ptr, const float *values) +{ + RegionView3D *rv3d= (RegionView3D *)(ptr->data); + negate_v3_v3(rv3d->ofs, values); +} + /* Space Image Editor */ static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr) @@ -386,6 +427,36 @@ static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *C, P return item; } +static void rna_SpaceImageEditor_cursor_location_get(PointerRNA *ptr, float *values) +{ + SpaceImage *sima= (SpaceImage*)ptr->data; + + if (sima->flag & SI_COORDFLOATS) { + copy_v2_v2(values, sima->cursor); + } else { + int w, h; + ED_space_image_size(sima, &w, &h); + + values[0] = sima->cursor[0] * w; + values[1] = sima->cursor[1] * h; + } +} + +static void rna_SpaceImageEditor_cursor_location_set(PointerRNA *ptr, const float *values) +{ + SpaceImage *sima= (SpaceImage*)ptr->data; + + if (sima->flag & SI_COORDFLOATS) { + copy_v2_v2(sima->cursor, values); + } else { + int w, h; + ED_space_image_size(sima, &w, &h); + + sima->cursor[0] = values[0] / w; + sima->cursor[1] = values[1] / h; + } +} + static void rna_SpaceImageEditor_curves_update(Main *bmain, Scene *scene, PointerRNA *ptr) { SpaceImage *sima= (SpaceImage*)ptr->data; @@ -399,7 +470,7 @@ static void rna_SpaceImageEditor_curves_update(Main *bmain, Scene *scene, Pointe WM_main_add_notifier(NC_IMAGE, sima->image); } -static void rna_SpaceImageEditor_histogram_update(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_SpaceImageEditor_scopes_update(Main *bmain, Scene *scene, PointerRNA *ptr) { SpaceImage *sima= (SpaceImage*)ptr->data; ImBuf *ibuf; @@ -407,13 +478,12 @@ static void rna_SpaceImageEditor_histogram_update(Main *bmain, Scene *scene, Poi ibuf= ED_space_image_acquire_buffer(sima, &lock); if(ibuf) { - histogram_update(&sima->hist, ibuf); + scopes_update(&sima->scopes, ibuf, scene->r.color_mgt_flag & R_COLOR_MANAGEMENT); WM_main_add_notifier(NC_IMAGE, sima->image); } ED_space_image_release_buffer(sima, lock); } - /* Space Text Editor */ static void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, int value) @@ -434,6 +504,13 @@ static void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value) /* Space Properties */ +/* note: this function exists only to avoid id refcounting */ +static void rna_SpaceProperties_pin_id_set(PointerRNA *ptr, PointerRNA value) +{ + SpaceButs *sbuts= (SpaceButs*)(ptr->data); + sbuts->pinid= value.data; +} + static StructRNA *rna_SpaceProperties_pin_id_typef(PointerRNA *ptr) { SpaceButs *sbuts= (SpaceButs*)(ptr->data); @@ -444,6 +521,33 @@ static StructRNA *rna_SpaceProperties_pin_id_typef(PointerRNA *ptr) return &RNA_ID; } +static void rna_SpaceProperties_pin_id_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + SpaceButs *sbuts= (SpaceButs*)(ptr->data); + ID *id = sbuts->pinid; + + if (id == NULL) { + sbuts->flag &= ~SB_PIN_CONTEXT; + return; + } + + switch (GS(id->name)) { + case ID_MA: + WM_main_add_notifier(NC_MATERIAL|ND_SHADING, NULL); + break; + case ID_TE: + WM_main_add_notifier(NC_TEXTURE, NULL); + break; + case ID_WO: + WM_main_add_notifier(NC_WORLD, NULL); + break; + case ID_LA: + WM_main_add_notifier(NC_LAMP, NULL); + break; + } +} + + static void rna_SpaceProperties_align_set(PointerRNA *ptr, int value) { SpaceButs *sbuts= (SpaceButs*)(ptr->data); @@ -499,7 +603,7 @@ static void rna_SpaceTime_redraw_update(Main *bmain, Scene *scene, PointerRNA *p SpaceTime *st= (SpaceTime*)ptr->data; bScreen *screen= (bScreen*)ptr->id.data; - ED_screen_animation_timer_update(screen, st->redraws); + ED_screen_animation_timer_update(screen, st->redraws, SPACE_TIME); } /* Space Dopesheet */ @@ -664,6 +768,12 @@ static void rna_def_space_image_uv(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_COORDFLOATS); RNA_def_property_ui_text(prop, "Normalized Coordinates", "Display UV coordinates from 0.0 to 1.0 rather than in pixels"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL); + + prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_NONE); + RNA_def_property_array(prop, 2); + RNA_def_property_float_funcs(prop, "rna_SpaceImageEditor_cursor_location_get", "rna_SpaceImageEditor_cursor_location_set", NULL); + RNA_def_property_ui_text(prop, "2D Cursor Location", "2D cursor location for this view"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL); /* todo: move edge and face drawing options here from G.f */ @@ -695,20 +805,20 @@ static void rna_def_space_outliner(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem display_mode_items[] = { - {0, "ALL_SCENES", 0, "All Scenes", ""}, - {1, "CURRENT_SCENE", 0, "Current Scene", ""}, - {2, "VISIBLE_LAYERS", 0, "Visible Layers", ""}, - {3, "SELECTED", 0, "Selected", ""}, - {4, "ACTIVE", 0, "Active", ""}, - {5, "SAME_TYPES", 0, "Same Types", ""}, - {6, "GROUPS", 0, "Groups", ""}, - {7, "LIBRARIES", 0, "Libraries", ""}, - {10, "SEQUENCE", 0, "Sequence", ""}, - {11, "DATABLOCKS", 0, "Datablocks", ""}, - {12, "USER_PREFERENCES", 0, "User Preferences", ""}, - {13, "KEYMAPS", 0, "Key Maps", ""}, + {SO_ALL_SCENES, "ALL_SCENES", 0, "All Scenes", ""}, + {SO_CUR_SCENE, "CURRENT_SCENE", 0, "Current Scene", ""}, + {SO_VISIBLE, "VISIBLE_LAYERS", 0, "Visible Layers", ""}, + {SO_SELECTED, "SELECTED", 0, "Selected", ""}, + {SO_ACTIVE, "ACTIVE", 0, "Active", ""}, + {SO_SAME_TYPE, "SAME_TYPES", 0, "Same Types", ""}, + {SO_GROUPS, "GROUPS", 0, "Groups", ""}, + {SO_LIBRARIES, "LIBRARIES", 0, "Libraries", ""}, + {SO_SEQUENCE, "SEQUENCE", 0, "Sequence", ""}, + {SO_DATABLOCKS, "DATABLOCKS", 0, "Datablocks", ""}, + {SO_USERDEF, "USER_PREFERENCES", 0, "User Preferences", ""}, + {SO_KEYMAP, "KEYMAPS", 0, "Key Maps", ""}, {0, NULL, 0, NULL, NULL}}; - + srna= RNA_def_struct(brna, "SpaceOutliner", "Space"); RNA_def_struct_sdna(srna, "SpaceOops"); RNA_def_struct_ui_text(srna, "Space Outliner", "Outliner space data"); @@ -718,12 +828,26 @@ static void rna_def_space_outliner(BlenderRNA *brna) RNA_def_property_enum_items(prop, display_mode_items); RNA_def_property_ui_text(prop, "Display Mode", "Type of information to display"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL); - + + prop= RNA_def_property(srna, "display_filter", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "search_string"); + RNA_def_property_ui_text(prop, "Display Filter", "Live search filtering string"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL); + + prop= RNA_def_property(srna, "match_case_sensitive", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "search_flags", SO_FIND_CASE_SENSITIVE); + RNA_def_property_ui_text(prop, "Case Sensitive Matches Only", "Only use case sensitive matches of search string"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL); + + prop= RNA_def_property(srna, "match_complete", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "search_flags", SO_FIND_COMPLETE); + RNA_def_property_ui_text(prop, "Complete Matches Only", "Only use complete matches of search string"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL); + prop= RNA_def_property(srna, "show_restriction_columns", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SO_HIDE_RESTRICTCOLS); - RNA_def_property_ui_text(prop, "Show Restriction Columns", "Show colum"); + RNA_def_property_ui_text(prop, "Show Restriction Columns", "Show column"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL); - } static void rna_def_background_image(BlenderRNA *brna) @@ -801,18 +925,11 @@ static void rna_def_background_image(BlenderRNA *brna) } -static void rna_def_space_3dview(BlenderRNA *brna) +static void rna_def_space_view3d(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - - static EnumPropertyItem viewport_shading_items[] = { - {OB_BOUNDBOX, "BOUNDBOX", ICON_BBOX, "Bounding Box", "Display the object's local bounding boxes only"}, - {OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"}, - {OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display the object solid, lit with default OpenGL lights"}, - //{OB_SHADED, "SHADED", ICON_SMOOTH, "Shaded", "Display the object solid, with preview shading interpolated at vertices"}, - {OB_TEXTURE, "TEXTURED", ICON_POTATO, "Textured", "Display the object solid, with face-assigned textures"}, - {0, NULL, 0, NULL, NULL}}; + int matrix_dimsize[]= {4, 4}; static EnumPropertyItem pivot_items[] = { {V3D_CENTER, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", ""}, @@ -821,8 +938,14 @@ static void rna_def_space_3dview(BlenderRNA *brna) {V3D_CENTROID, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point", ""}, {V3D_ACTIVE, "ACTIVE_ELEMENT", ICON_ROTACTIVE, "Active Element", ""}, {0, NULL, 0, NULL, NULL}}; - - srna= RNA_def_struct(brna, "Space3DView", "Space"); + + static EnumPropertyItem rv3d_persp_items[] = { + {RV3D_PERSP, "PERSP", 0, "Perspective", ""}, + {RV3D_ORTHO, "ORTHO", 0, "Orthographic", ""}, + {RV3D_CAMOB, "CAMERA", 0, "Camera", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "SpaceView3D", "Space"); RNA_def_struct_sdna(srna, "View3D"); RNA_def_struct_ui_text(srna, "3D View Space", "3D View space data"); @@ -852,7 +975,14 @@ static void rna_def_space_3dview(BlenderRNA *brna) prop= RNA_def_property(srna, "local_view", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "localvd"); RNA_def_property_ui_text(prop, "Local View", "Display an isolated sub-set of objects, apart from the scene visibility"); - + + prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ_LENGTH); + RNA_def_property_array(prop, 3); + RNA_def_property_float_funcs(prop, "rna_View3D_CursorLocation_get", "rna_View3D_CursorLocation_set", NULL); + RNA_def_property_ui_text(prop, "3D Cursor Location", "3D cursor location for this view (dependent on local view setting)"); + RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + prop= RNA_def_property(srna, "lens", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "lens"); RNA_def_property_ui_text(prop, "Lens", "Lens angle (mm) in perspective view"); @@ -928,6 +1058,11 @@ static void rna_def_space_3dview(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SOLID_TEX); RNA_def_property_ui_text(prop, "Textured Solid", "Display face-assigned textures in solid view"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + + prop= RNA_def_property(srna, "display_render_override", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_RENDER_OVERRIDE); + RNA_def_property_ui_text(prop, "Only Render", "Display only objects which will be rendered"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); prop= RNA_def_property(srna, "occlude_geometry", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_ZBUF_SELECT); @@ -996,15 +1131,15 @@ static void rna_def_space_3dview(BlenderRNA *brna) prop= RNA_def_property(srna, "lock_camera_and_layers", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scenelock", 1); - RNA_def_property_boolean_funcs(prop, NULL, "rna_Space3DView_lock_camera_and_layers_set"); + RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceView3D_lock_camera_and_layers_set"); RNA_def_property_ui_text(prop, "Lock Camera and Layers", "Use the scene's active camera and layers in this view, rather than local layers"); RNA_def_property_ui_icon(prop, ICON_LOCKVIEW_OFF, 1); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); - prop= RNA_def_property(srna, "visible_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER); + prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER); RNA_def_property_boolean_sdna(prop, NULL, "lay", 1); RNA_def_property_array(prop, 20); - RNA_def_property_boolean_funcs(prop, NULL, "rna_Space3DView_layer_set"); + RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceView3D_layer_set"); RNA_def_property_ui_text(prop, "Visible Layers", "Layers visible in this 3D View"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); @@ -1015,35 +1150,75 @@ static void rna_def_space_3dview(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Used Layers", "Layers that contain something"); prop= RNA_def_property(srna, "region_3d", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "Region3DView"); + RNA_def_property_struct_type(prop, "RegionView3D"); RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_region_3d_get", NULL, NULL); RNA_def_property_ui_text(prop, "3D Region", "3D region in this space, in case of quad view the camera region"); prop= RNA_def_property(srna, "region_quadview", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "Region3DView"); + RNA_def_property_struct_type(prop, "RegionView3D"); RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_region_quadview_get", NULL, NULL); RNA_def_property_ui_text(prop, "Quad View Region", "3D region that defines the quad view settings"); /* region */ - srna= RNA_def_struct(brna, "Region3DView", "Region"); + srna= RNA_def_struct(brna, "RegionView3D", NULL); RNA_def_struct_sdna(srna, "RegionView3D"); RNA_def_struct_ui_text(srna, "3D View Region", "3D View region data"); prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_LOCKED); RNA_def_property_ui_text(prop, "Lock", "Lock view rotation in side views"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_Region3DView_quadview_update"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update"); prop= RNA_def_property(srna, "box_preview", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_BOXVIEW); RNA_def_property_ui_text(prop, "Box", "Sync view position between side views"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_Region3DView_quadview_update"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update"); prop= RNA_def_property(srna, "box_clip", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_BOXCLIP); RNA_def_property_ui_text(prop, "Clip", "Clip objects based on what's visible in other side views"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_Region3DView_quadview_update"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update"); + + prop= RNA_def_property(srna, "perspective_matrix", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_float_sdna(prop, NULL, "persmat"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX: for now, it's too risky for users to do this + RNA_def_property_multi_array(prop, 2, matrix_dimsize); + RNA_def_property_ui_text(prop, "Perspective Matrix", "Current perspective matrix of the 3D region"); + + prop= RNA_def_property(srna, "view_matrix", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_float_sdna(prop, NULL, "viewmat"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX: for now, it's too risky for users to do this + RNA_def_property_multi_array(prop, 2, matrix_dimsize); + RNA_def_property_ui_text(prop, "View Matrix", "Current view matrix of the 3D region"); + + prop= RNA_def_property(srna, "view_perspective", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "persp"); + RNA_def_property_enum_items(prop, rv3d_persp_items); + RNA_def_property_ui_text(prop, "Perspective", "View Perspective"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + + prop= RNA_def_property(srna, "view_location", PROP_FLOAT, PROP_TRANSLATION); +#if 0 + RNA_def_property_float_sdna(prop, NULL, "ofs"); // cant use because its negated +#else + RNA_def_property_array(prop, 3); + RNA_def_property_float_funcs(prop, "rna_RegionView3D_view_location_get", "rna_RegionView3D_view_location_set", NULL); +#endif + RNA_def_property_ui_text(prop, "View Location", "View pivot location"); + RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "view_rotation", PROP_FLOAT, PROP_QUATERNION); + RNA_def_property_float_sdna(prop, NULL, "viewquat"); + RNA_def_property_ui_text(prop, "View Rotation", "Rotation in quaternions (keep normalized)"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + + /* not sure we need rna access to these but adding anyway */ + prop= RNA_def_property(srna, "view_distance", PROP_FLOAT, PROP_UNSIGNED); + RNA_def_property_float_sdna(prop, NULL, "dist"); + RNA_def_property_ui_text(prop, "Distance", "Distance to the view location"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); } static void rna_def_space_buttons(BlenderRNA *brna) @@ -1098,9 +1273,14 @@ static void rna_def_space_buttons(BlenderRNA *brna) prop= RNA_def_property(srna, "pin_id", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "pinid"); RNA_def_property_struct_type(prop, "ID"); - RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_SpaceProperties_pin_id_typef"); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceProperties_pin_id_set", "rna_SpaceProperties_pin_id_typef"); RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, "rna_SpaceProperties_pin_id_update"); + + prop= RNA_def_property(srna, "use_pin_id", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SB_PIN_CONTEXT); + RNA_def_property_ui_text(prop, "Pin ID", "Use the pinned context"); } static void rna_def_space_image(BlenderRNA *brna) @@ -1129,18 +1309,24 @@ static void rna_def_space_image(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "cumap"); RNA_def_property_ui_text(prop, "Curves", "Color curve mapping to use for displaying the image"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_curves_update"); - - prop= RNA_def_property(srna, "histogram", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, NULL, "hist"); - RNA_def_property_struct_type(prop, "Histogram"); - RNA_def_property_ui_text(prop, "Histogram", "Histogram for viewing image statistics"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_histogram_update"); + + prop= RNA_def_property(srna, "scopes", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "scopes"); + RNA_def_property_struct_type(prop, "Scopes"); + RNA_def_property_ui_text(prop, "Scopes", "Scopes to visualize image statistics."); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_scopes_update"); prop= RNA_def_property(srna, "image_pin", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "pin", 0); RNA_def_property_ui_text(prop, "Image Pin", "Display current image regardless of object selection"); + RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL); + prop= RNA_def_property(srna, "sample_histogram", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "sample_line_hist"); + RNA_def_property_struct_type(prop, "Histogram"); + RNA_def_property_ui_text(prop, "Line sample", "Sampled colors along line"); + /* image draw */ prop= RNA_def_property(srna, "draw_repeated", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_TILE); @@ -1171,7 +1357,8 @@ static void rna_def_space_image(BlenderRNA *brna) /* grease pencil */ prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "gpd"); - RNA_def_property_struct_type(prop, "UnknownType"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_struct_type(prop, "GreasePencil"); RNA_def_property_ui_text(prop, "Grease Pencil", "Grease pencil data for this space"); prop= RNA_def_property(srna, "use_grease_pencil", PROP_BOOLEAN, PROP_NONE); @@ -1197,7 +1384,7 @@ static void rna_def_space_image(BlenderRNA *brna) prop= RNA_def_property(srna, "show_uvedit", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SpaceImageEditor_show_uvedit_get", NULL); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Show UV Editor", "Show uv editing related properties"); + RNA_def_property_ui_text(prop, "Show UV Editor", "Show UV editing related properties"); rna_def_space_image_uv(brna); } @@ -1210,7 +1397,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna) static EnumPropertyItem view_type_items[] = { {SEQ_VIEW_SEQUENCE, "SEQUENCER", ICON_SEQ_SEQUENCER, "Sequencer", ""}, {SEQ_VIEW_PREVIEW, "PREVIEW", ICON_SEQ_PREVIEW, "Image Preview", ""}, - {SEQ_VIEW_SEQUENCE_PREVIEW, "SEQUENCER_PREVIEW", ICON_SEQ_SEQUENCER, "Sequencer and Image Preview", ""}, + {SEQ_VIEW_SEQUENCE_PREVIEW, "SEQUENCER_PREVIEW", ICON_SEQ_SPLITVIEW, "Sequencer and Image Preview", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem display_mode_items[] = { @@ -1219,6 +1406,15 @@ static void rna_def_space_sequencer(BlenderRNA *brna) {SEQ_DRAW_IMG_VECTORSCOPE, "VECTOR_SCOPE", ICON_SEQ_CHROMA_SCOPE, "Chroma Vectorscope", ""}, {SEQ_DRAW_IMG_HISTOGRAM, "HISTOGRAM", ICON_SEQ_HISTOGRAM, "Histogram", ""}, {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem proxy_render_size_items[] = { + {SEQ_PROXY_RENDER_SIZE_NONE, "NONE", 0, "No display", ""}, + {SEQ_PROXY_RENDER_SIZE_SCENE, "SCENE", 0, "Scene render size", ""}, + {SEQ_PROXY_RENDER_SIZE_25, "PROXY_25", 0, "Proxy size 25%", ""}, + {SEQ_PROXY_RENDER_SIZE_50, "PROXY_50", 0, "Proxy size 50%", ""}, + {SEQ_PROXY_RENDER_SIZE_75, "PROXY_75", 0, "Proxy size 75%", ""}, + {SEQ_PROXY_RENDER_SIZE_FULL, "FULL", 0, "No proxy, full render", ""}, + {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SpaceSequenceEditor", "Space"); RNA_def_struct_sdna(srna, "SpaceSeq"); @@ -1228,7 +1424,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna) prop= RNA_def_property(srna, "view_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "view"); RNA_def_property_enum_items(prop, view_type_items); - RNA_def_property_ui_text(prop, "View Type", "The type of the Sequencere view (sequencer, preview or both)"); + RNA_def_property_ui_text(prop, "View Type", "The type of the Sequencer view (sequencer, preview or both)"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_Sequencer_display_mode_update"); @@ -1247,17 +1443,17 @@ static void rna_def_space_sequencer(BlenderRNA *brna) prop= RNA_def_property(srna, "draw_frames", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAWFRAMES); - RNA_def_property_ui_text(prop, "Draw Frames", "Draw frames rather then seconds"); + RNA_def_property_ui_text(prop, "Draw Frames", "Draw frames rather than seconds"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); - prop= RNA_def_property(srna, "transform_markers", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_marker_sync", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MARKER_TRANS); RNA_def_property_ui_text(prop, "Transform Markers", "Transform markers as well as strips"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); prop= RNA_def_property(srna, "separate_color_preview", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAW_COLOR_SEPERATED); - RNA_def_property_ui_text(prop, "Seperate Colors", "Seperate color channels in preview"); + RNA_def_property_ui_text(prop, "Separate Colors", "Separate color channels in preview"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); prop= RNA_def_property(srna, "draw_safe_margin", PROP_BOOLEAN, PROP_NONE); @@ -1280,7 +1476,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna) prop= RNA_def_property(srna, "display_channel", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "chanshown"); RNA_def_property_ui_text(prop, "Display Channel", "The channel number shown in the image preview. 0 is the result of all strips combined"); - RNA_def_property_range(prop, 0, 32); // MAXSEQ --- todo, move from BKE_sequencer.h + RNA_def_property_range(prop, -5, 32); // MAXSEQ --- todo, move from BKE_sequencer.h, allow up to 5 layers up the metastack. Should be dynamic... RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); prop= RNA_def_property(srna, "draw_overexposed", PROP_INT, PROP_NONE); @@ -1289,6 +1485,12 @@ static void rna_def_space_sequencer(BlenderRNA *brna) RNA_def_property_range(prop, 0, 110); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); + prop= RNA_def_property(srna, "proxy_render_size", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "render_size"); + RNA_def_property_enum_items(prop, proxy_render_size_items); + RNA_def_property_ui_text(prop, "Proxy render size", "Draw preview using full resolution or different proxy resolutions"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL); + /* not sure we need rna access to these but adding anyway */ prop= RNA_def_property(srna, "offset_x", PROP_FLOAT, PROP_NONE); @@ -1355,7 +1557,7 @@ static void rna_def_space_text(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "tabnumber"); RNA_def_property_range(prop, 2, 8); RNA_def_property_ui_text(prop, "Tab Width", "Number of spaces to display tabs with"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL); + RNA_def_property_update(prop, NC_TEXT|NA_EDITED, NULL); prop= RNA_def_property(srna, "font_size", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "lheight"); @@ -1393,8 +1595,8 @@ static void rna_def_space_dopesheet(BlenderRNA *brna) static EnumPropertyItem mode_items[] = { {SACTCONT_DOPESHEET, "DOPESHEET", 0, "DopeSheet", ""}, {SACTCONT_ACTION, "ACTION", 0, "Action Editor", ""}, - {SACTCONT_SHAPEKEY, "SHAPEKEY", 0, "ShapeKey Editor", ""}, // XXX to be depreceated? - {SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""}, + {SACTCONT_SHAPEKEY, "SHAPEKEY", 0, "ShapeKey Editor", ""}, + //{SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""}, // XXX: to be reimplemented, but not enough time before 2.53 - Aligorith, 2010Jul14 {0, NULL, 0, NULL, NULL}}; @@ -1407,7 +1609,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceDopeSheetEditor_action_set", NULL); RNA_def_property_ui_text(prop, "Action", "Action displayed and edited in this space"); - RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, "rna_SpaceDopeSheetEditor_action_update"); + RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, "rna_SpaceDopeSheetEditor_action_update"); /* mode */ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); @@ -1436,7 +1638,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna) /* editing */ prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOTRANSKEYCULL); - RNA_def_property_ui_text(prop, "AutoMerge Keyframes", "Show handles of Bezier control points"); + RNA_def_property_ui_text(prop, "AutoMerge Keyframes", "Automatically merge nearby keyframes"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL); prop= RNA_def_property(srna, "realtime_updates", PROP_BOOLEAN, PROP_NONE); @@ -1444,6 +1646,10 @@ static void rna_def_space_dopesheet(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Realtime Updates", "When transforming keyframes, changes to the animation data are flushed to other views"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL); + prop= RNA_def_property(srna, "use_marker_sync", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_MARKERS_MOVE); + RNA_def_property_ui_text(prop, "Sync Markers", "Sync Markers with keyframe edits"); + /* dopesheet */ prop= RNA_def_property(srna, "dopesheet", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "DopeSheet"); @@ -1525,7 +1731,7 @@ static void rna_def_space_graph(BlenderRNA *brna) /* editing */ prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOTRANSKEYCULL); - RNA_def_property_ui_text(prop, "AutoMerge Keyframes", "Show handles of Bezier control points"); + RNA_def_property_ui_text(prop, "AutoMerge Keyframes", "Automatically merge nearby keyframes"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL); prop= RNA_def_property(srna, "realtime_updates", PROP_BOOLEAN, PROP_NONE); @@ -1672,6 +1878,32 @@ static void rna_def_space_time(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", TIME_CFRA_NUM); RNA_def_property_ui_text(prop, "Show Frame Number Indicator", "Show frame number beside the current frame indicator line"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL); + + /* displaying cache status */ + prop= RNA_def_property(srna, "show_cache", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_DISPLAY); + RNA_def_property_ui_text(prop, "Show Cache", "Show the status of cached frames in the timeline"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL); + + prop= RNA_def_property(srna, "cache_softbody", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_SOFTBODY); + RNA_def_property_ui_text(prop, "Softbody", "Show the active object's softbody point cache"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL); + + prop= RNA_def_property(srna, "cache_particles", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_PARTICLES); + RNA_def_property_ui_text(prop, "Particles", "Show the active object's particle point cache"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL); + + prop= RNA_def_property(srna, "cache_cloth", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_CLOTH); + RNA_def_property_ui_text(prop, "Cloth", "Show the active object's cloth point cache"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL); + + prop= RNA_def_property(srna, "cache_smoke", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_SMOKE); + RNA_def_property_ui_text(prop, "Smoke", "Show the active object's smoke cache"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL); } static void rna_def_console_line(BlenderRNA *brna) @@ -1755,15 +1987,11 @@ static void rna_def_space_console(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Error", "Display error text"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL); - - prop= RNA_def_property(srna, "prompt", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Prompt", "Command line prompt"); - RNA_def_struct_name_property(srna, prop); prop= RNA_def_property(srna, "language", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Language", "Command line prompt language"); - RNA_def_struct_name_property(srna, prop); prop= RNA_def_property(srna, "history", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "history", NULL); @@ -1821,12 +2049,12 @@ static void rna_def_fileselect_params(BlenderRNA *brna) prop= RNA_def_property(srna, "do_filter", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_FILTER); RNA_def_property_ui_text(prop, "Filter Files", "Enable filtering of files"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "hide_dot", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_HIDE_DOT); RNA_def_property_ui_text(prop, "Hide Dot Files", "Hide hidden dot files"); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST , NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS , NULL); prop= RNA_def_property(srna, "sort", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "sort"); @@ -1838,51 +2066,50 @@ static void rna_def_fileselect_params(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "filter", IMAGEFILE); RNA_def_property_ui_text(prop, "Filter Images", "Show image files"); RNA_def_property_ui_icon(prop, ICON_FILE_IMAGE, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_blender", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", BLENDERFILE); RNA_def_property_ui_text(prop, "Filter Blender", "Show .blend files"); RNA_def_property_ui_icon(prop, ICON_FILE_BLEND, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_movie", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", MOVIEFILE); RNA_def_property_ui_text(prop, "Filter Movies", "Show movie files"); RNA_def_property_ui_icon(prop, ICON_FILE_MOVIE, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_script", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", PYSCRIPTFILE); RNA_def_property_ui_text(prop, "Filter Script", "Show script files"); RNA_def_property_ui_icon(prop, ICON_FILE_SCRIPT, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_font", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", FTFONTFILE); RNA_def_property_ui_text(prop, "Filter Fonts", "Show font files"); RNA_def_property_ui_icon(prop, ICON_FILE_FONT, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_sound", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", SOUNDFILE); RNA_def_property_ui_text(prop, "Filter Sound", "Show sound files"); RNA_def_property_ui_icon(prop, ICON_FILE_SOUND, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_text", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", TEXTFILE); RNA_def_property_ui_text(prop, "Filter Text", "Show text files"); RNA_def_property_ui_icon(prop, ICON_FILE_BLANK, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); prop= RNA_def_property(srna, "filter_folder", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", FOLDERFILE); RNA_def_property_ui_text(prop, "Filter Folder", "Show folders"); RNA_def_property_ui_icon(prop, ICON_FILE_FOLDER, 0); - RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL); - } static void rna_def_space_filebrowser(BlenderRNA *brna) @@ -1911,10 +2138,16 @@ static void rna_def_space_info(BlenderRNA *brna) static void rna_def_space_userpref(BlenderRNA *brna) { StructRNA *srna; - + PropertyRNA *prop; + srna= RNA_def_struct(brna, "SpaceUserPreferences", "Space"); RNA_def_struct_sdna(srna, "SpaceUserPref"); RNA_def_struct_ui_text(srna, "Space User Preferences", "User preferences space data"); + + prop= RNA_def_property(srna, "filter", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "filter"); + RNA_def_property_ui_text(prop, "Filter", "Search term for filtering in the UI"); + } static void rna_def_space_node(BlenderRNA *brna) @@ -1972,10 +2205,70 @@ static void rna_def_space_node(BlenderRNA *brna) static void rna_def_space_logic(BlenderRNA *brna) { StructRNA *srna; + PropertyRNA *prop; srna= RNA_def_struct(brna, "SpaceLogicEditor", "Space"); RNA_def_struct_sdna(srna, "SpaceLogic"); RNA_def_struct_ui_text(srna, "Space Logic Editor", "Logic editor space data"); + + /* sensors */ + prop= RNA_def_property(srna, "sensors_show_selected_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_SEL); + RNA_def_property_ui_text(prop, "Show Selected Object", "Show sensors of all selected objects"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "sensors_show_active_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_ACT); + RNA_def_property_ui_text(prop, "Show Active Object", "Show sensors of active object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "sensors_show_linked_controller", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_LINK); + RNA_def_property_ui_text(prop, "Show Linked to Controller", "Show linked objects to the controller"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "sensors_show_active_states", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_STATE); + RNA_def_property_ui_text(prop, "Show Active States", "Show only sensors connected to active states"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* controllers */ + prop= RNA_def_property(srna, "controllers_show_selected_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_CONT_SEL); + RNA_def_property_ui_text(prop, "Show Selected Object", "Show controllers of all selected objects"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "controllers_show_active_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_CONT_ACT); + RNA_def_property_ui_text(prop, "Show Active Object", "Show controllers of active object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "controllers_show_linked_controller", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_CONT_LINK); + RNA_def_property_ui_text(prop, "Show Linked to Controller", "Show linked objects to sensor/actuator"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* actuators */ + prop= RNA_def_property(srna, "actuators_show_selected_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_SEL); + RNA_def_property_ui_text(prop, "Show Selected Object", "Show actuators of all selected objects"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "actuators_show_active_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_ACT); + RNA_def_property_ui_text(prop, "Show Active Object", "Show actuators of active object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "actuators_show_linked_controller", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_LINK); + RNA_def_property_ui_text(prop, "Show Linked to Actuator", "Show linked objects to the actuator"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "actuators_show_active_states", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_STATE); + RNA_def_property_ui_text(prop, "Show Active States", "Show only actuators connected to active states"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + } void RNA_def_space(BlenderRNA *brna) @@ -1988,7 +2281,7 @@ void RNA_def_space(BlenderRNA *brna) rna_def_space_filebrowser(brna); rna_def_space_outliner(brna); rna_def_background_image(brna); - rna_def_space_3dview(brna); + rna_def_space_view3d(brna); rna_def_space_buttons(brna); rna_def_space_dopesheet(brna); rna_def_space_graph(brna); diff --git a/source/blender/makesrna/intern/rna_test.c b/source/blender/makesrna/intern/rna_test.c index 558ac00e3bf..592d88c718a 100644 --- a/source/blender/makesrna/intern/rna_test.c +++ b/source/blender/makesrna/intern/rna_test.c @@ -28,7 +28,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" diff --git a/source/blender/makesrna/intern/rna_text.c b/source/blender/makesrna/intern/rna_text.c index b054b049fc9..d8651e5d05d 100644 --- a/source/blender/makesrna/intern/rna_text.c +++ b/source/blender/makesrna/intern/rna_text.c @@ -30,7 +30,6 @@ #include "BKE_text.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -175,9 +174,9 @@ static void rna_def_text(BlenderRNA *brna) RNA_def_struct_ui_icon(srna, ICON_TEXT); RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_NONE); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, "rna_Text_filename_get", "rna_Text_filename_length", "rna_Text_filename_set"); - RNA_def_property_ui_text(prop, "Filename", "Filename of the text file"); + RNA_def_property_ui_text(prop, "File Path", "Filename of the text file"); prop= RNA_def_property(srna, "dirty", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISDIRTY); @@ -196,7 +195,7 @@ static void rna_def_text(BlenderRNA *brna) prop= RNA_def_property(srna, "use_module", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISSCRIPT); - RNA_def_property_ui_text(prop, "Register", "Register this text as a module on loading"); + RNA_def_property_ui_text(prop, "Register", "Register this text as a module on loading, Text name must end with \".py\""); prop= RNA_def_property(srna, "tabs_as_spaces", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_TABSTOSPACES); diff --git a/source/blender/makesrna/intern/rna_text_api.c b/source/blender/makesrna/intern/rna_text_api.c index 0c446faf9af..2534eb63f2b 100644 --- a/source/blender/makesrna/intern/rna_text_api.c +++ b/source/blender/makesrna/intern/rna_text_api.c @@ -26,7 +26,6 @@ #include "RNA_define.h" -#include "RNA_types.h" #ifdef RNA_RUNTIME diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 7d6547e1abb..84fd217e64e 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -27,7 +27,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -43,12 +42,11 @@ #include "BKE_node.h" -static EnumPropertyItem texture_filter_items[] = { +EnumPropertyItem texture_filter_items[] = { {TXF_BOX, "BOX", 0, "Box", ""}, {TXF_EWA, "EWA", 0, "EWA", ""}, {TXF_FELINE, "FELINE", 0, "FELINE", ""}, {TXF_AREA, "AREA", 0, "Area", ""}, - {TXF_SAT, "SAT", 0, "SAT (4x mem)", ""}, {0, NULL, 0, NULL, NULL}}; EnumPropertyItem texture_type_items[] = { @@ -77,6 +75,7 @@ EnumPropertyItem texture_type_items[] = { #include "RNA_access.h" #include "BKE_depsgraph.h" +#include "BKE_image.h" #include "BKE_texture.h" #include "BKE_main.h" @@ -133,6 +132,22 @@ static void rna_Texture_update(Main *bmain, Scene *scene, PointerRNA *ptr) WM_main_add_notifier(NC_TEXTURE, tex); } +static void rna_Texture_voxeldata_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Tex *tex= ptr->id.data; + + tex->vd->ok = 0; + rna_Texture_update(bmain, scene, ptr); +} + +static void rna_Texture_voxeldata_image_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Tex *tex= ptr->id.data; + + tex->ima->source = IMA_SRC_SEQUENCE; + rna_Texture_voxeldata_update(bmain, scene, ptr); +} + /* Used for Texture Properties, used (also) for/in Nodes */ static void rna_Texture_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr) { @@ -145,18 +160,8 @@ static void rna_Texture_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_Texture_type_set(PointerRNA *ptr, int value) { Tex *tex= (Tex*)ptr->data; - - if (value == TEX_VOXELDATA) { - if (tex->vd == NULL) { - tex->vd = BKE_add_voxeldata(); - } - } else if (value == TEX_POINTDENSITY) { - if (tex->pd == NULL) { - tex->pd = BKE_add_pointdensity(); - } - } - tex->type = value; + tex_set_type(tex, value); } void rna_TextureSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -321,26 +326,18 @@ static void rna_ImageTexture_mipmap_set(PointerRNA *ptr, int value) if(value) tex->imaflag |= TEX_MIPMAP; else tex->imaflag &= ~TEX_MIPMAP; - if((tex->imaflag & TEX_MIPMAP) && tex->texfilter == TXF_SAT) + if(tex->imaflag & TEX_MIPMAP) tex->texfilter = TXF_EWA; } -static EnumPropertyItem *rna_ImageTexture_filter_itemf(bContext *C, PointerRNA *ptr, int *free) +static void rna_Envmap_source_update(Main *bmain, Scene *scene, PointerRNA *ptr) { - Tex *tex= (Tex*)ptr->data; - EnumPropertyItem *item= NULL; - int totitem= 0; - - RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_BOX); - RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_EWA); - RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_FELINE); - RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_AREA); - if(tex->imaflag & TEX_MIPMAP) - RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_SAT); + Tex *tex= ptr->id.data; - *free= 1; - - return item; + if (tex->env) + BKE_free_envmapdata(tex->env); + + rna_Texture_update(bmain, scene, ptr); } static PointerRNA rna_PointDensity_psys_get(PointerRNA *ptr) @@ -366,156 +363,8 @@ static void rna_PointDensity_psys_set(PointerRNA *ptr, PointerRNA value) pd->psys= BLI_findindex(&ob->particlesystem, value.data) + 1; } -static char *rna_ColorRamp_path(PointerRNA *ptr) -{ - /* handle the cases where a single datablock may have 2 ramp types */ - if (ptr->id.data) { - ID *id= ptr->id.data; - - switch (GS(id->name)) { - case ID_MA: /* material has 2 cases - diffuse and specular */ - { - Material *ma= (Material*)id; - - if (ptr->data == ma->ramp_col) - return BLI_strdup("diffuse_ramp"); - else if (ptr->data == ma->ramp_spec) - return BLI_strdup("specular_ramp"); - } - break; - } - } - - /* everything else just uses 'color_ramp' */ - return BLI_strdup("color_ramp"); -} - -static char *rna_ColorRampElement_path(PointerRNA *ptr) -{ - PointerRNA ramp_ptr; - PropertyRNA *prop; - char *path = NULL; - int index; - - /* helper macro for use here to try and get the path - * - this calls the standard code for getting a path to a texture... - */ -#define COLRAMP_GETPATH \ - { \ - prop= RNA_struct_find_property(&ramp_ptr, "elements"); \ - if (prop) { \ - index= RNA_property_collection_lookup_index(&ramp_ptr, prop, ptr); \ - if (index >= 0) { \ - char *texture_path= rna_ColorRamp_path(&ramp_ptr); \ - path= BLI_sprintfN("%s.elements[%d]", texture_path, index); \ - MEM_freeN(texture_path); \ - } \ - } \ - } - - /* determine the path from the ID-block to the ramp */ - // FIXME: this is a very slow way to do it, but it will have to suffice... - if (ptr->id.data) { - ID *id= ptr->id.data; - - switch (GS(id->name)) { - case ID_MA: /* 2 cases for material - diffuse and spec */ - { - Material *ma= (Material *)id; - - /* try diffuse first */ - if (ma->ramp_col) { - RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_col, &ramp_ptr); - COLRAMP_GETPATH; - } - /* try specular if not diffuse */ - if (!path && ma->ramp_spec) { - RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_spec, &ramp_ptr); - COLRAMP_GETPATH; - } - } - break; - - // TODO: node trees need special attention - case ID_NT: - { - // FIXME: we'll probably have to loop over nodes until we find one that uses the color ramp - } - break; - - default: /* everything else should have a "color_ramp" property */ - { - /* create pointer to the ID block, and try to resolve "color_ramp" pointer */ - RNA_id_pointer_create(id, &ramp_ptr); - if (RNA_path_resolve(&ramp_ptr, "color_ramp", &ramp_ptr, &prop)) { - COLRAMP_GETPATH; - } - } - } - } - - /* cleanup the macro we defined */ -#undef COLRAMP_GETPATH - - return path; -} - #else -static void rna_def_color_ramp_element(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna= RNA_def_struct(brna, "ColorRampElement", NULL); - RNA_def_struct_sdna(srna, "CBData"); - RNA_def_struct_path_func(srna, "rna_ColorRampElement_path"); - RNA_def_struct_ui_text(srna, "Color Ramp Element", "Element defining a color at a position in the color ramp"); - - prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR); - RNA_def_property_float_sdna(prop, NULL, "r"); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Color", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - - prop= RNA_def_property(srna, "position", PROP_FLOAT, PROP_COLOR); - RNA_def_property_float_sdna(prop, NULL, "pos"); - RNA_def_property_range(prop, 0, 1); - RNA_def_property_ui_text(prop, "Position", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); -} - -static void rna_def_color_ramp(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static EnumPropertyItem prop_interpolation_items[] = { - {1, "EASE", 0, "Ease", ""}, - {3, "CARDINAL", 0, "Cardinal", ""}, - {0, "LINEAR", 0, "Linear", ""}, - {2, "B_SPLINE", 0, "B-Spline", ""}, - {4, "CONSTANT", 0, "Constant", ""}, - {0, NULL, 0, NULL, NULL}}; - - srna= RNA_def_struct(brna, "ColorRamp", NULL); - RNA_def_struct_sdna(srna, "ColorBand"); - RNA_def_struct_path_func(srna, "rna_ColorRamp_path"); - RNA_def_struct_ui_text(srna, "Color Ramp", "Color ramp mapping a scalar value to a color"); - - prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_COLOR); - RNA_def_property_collection_sdna(prop, NULL, "data", "tot"); - RNA_def_property_struct_type(prop, "ColorRampElement"); - RNA_def_property_ui_text(prop, "Elements", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - - prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "ipotype"); - RNA_def_property_enum_items(prop, prop_interpolation_items); - RNA_def_property_ui_text(prop, "Interpolation", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); -} - static void rna_def_texmapping(BlenderRNA *brna) { StructRNA *srna; @@ -580,8 +429,8 @@ static void rna_def_mtex(BlenderRNA *brna) {MTEX_BLEND_SAT, "SATURATION", 0, "Saturation", ""}, {MTEX_BLEND_VAL, "VALUE", 0, "Value", ""}, {MTEX_BLEND_COLOR, "COLOR", 0, "Color", ""}, - {MTEX_SOFT_LIGHT, "SOFT LIGHT", 0, "Soft Light", ""}, - {MTEX_LIN_LIGHT , "LINEAR LIGHT", 0, "Linear Light", ""}, + {MTEX_SOFT_LIGHT, "SOFT LIGHT", 0, "Soft Light", ""}, + {MTEX_LIN_LIGHT , "LINEAR LIGHT", 0, "Linear Light", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem output_node_items[] = { @@ -661,9 +510,38 @@ static void rna_def_mtex(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_TextureSlot_update"); } -static void rna_def_filter_size_common(StructRNA *srna) +static void rna_def_filter_common(StructRNA *srna) { PropertyRNA *prop; + + prop= RNA_def_property(srna, "mipmap", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_MIPMAP); + RNA_def_property_boolean_funcs(prop, NULL, "rna_ImageTexture_mipmap_set"); + RNA_def_property_ui_text(prop, "MIP Map", "Uses auto-generated MIP maps for the image"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + + prop= RNA_def_property(srna, "mipmap_gauss", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_GAUSS_MIP); + RNA_def_property_ui_text(prop, "MIP Map Gaussian filter", "Uses Gauss filter to sample down MIP maps"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + + prop= RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "texfilter"); + RNA_def_property_enum_items(prop, texture_filter_items); + RNA_def_property_ui_text(prop, "Filter", "Texture filter to use for sampling image"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + + prop= RNA_def_property(srna, "filter_probes", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "afmax"); + RNA_def_property_range(prop, 1, 256); + RNA_def_property_ui_text(prop, "Filter Probes", "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + + prop= RNA_def_property(srna, "filter_eccentricity", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "afmax"); + RNA_def_property_range(prop, 1, 256); + RNA_def_property_ui_text(prop, "Filter Eccentricity", "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); prop= RNA_def_property(srna, "filter_size_minimum", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_FILTER_MIN); @@ -678,36 +556,18 @@ static void rna_def_filter_size_common(StructRNA *srna) RNA_def_property_update(prop, 0, "rna_Texture_update"); } -static void rna_def_environment_map_common(StructRNA *srna) -{ - PropertyRNA *prop; - - static EnumPropertyItem prop_source_items[] = { - {ENV_STATIC, "STATIC", 0, "Static", "Calculates environment map only once"}, - {ENV_ANIM, "ANIMATED", 0, "Animated", "Calculates environment map at each rendering"}, - {ENV_LOAD, "LOADED", 0, "Loaded", "Loads saved environment map from disk"}, - {0, NULL, 0, NULL, NULL}}; - - prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "stype"); - RNA_def_property_enum_items(prop, prop_source_items); - RNA_def_property_ui_text(prop, "Source", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - - /* XXX: move this to specific types if needed */ - prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, NULL, "ima"); - RNA_def_property_struct_type(prop, "Image"); - RNA_def_property_ui_text(prop, "Image", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); -} - static void rna_def_environment_map(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_type_items[] = { + static EnumPropertyItem prop_source_items[] = { + {ENV_STATIC, "STATIC", 0, "Static", "Calculates environment map only once"}, + {ENV_ANIM, "ANIMATED", 0, "Animated", "Calculates environment map at each rendering"}, + {ENV_LOAD, "IMAGE_FILE", 0, "Image File", "Loads a saved environment map image from disk"}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem prop_mapping_items[] = { {ENV_CUBE, "CUBE", 0, "Cube", "Use environment map with six cube sides"}, {ENV_PLANE, "PLANE", 0, "Plane", "Only one side is rendered, with Z axis pointing in direction of image"}, {0, NULL, 0, NULL, NULL}}; @@ -715,13 +575,23 @@ static void rna_def_environment_map(BlenderRNA *brna) srna= RNA_def_struct(brna, "EnvironmentMap", NULL); RNA_def_struct_sdna(srna, "EnvMap"); RNA_def_struct_ui_text(srna, "EnvironmentMap", "Environment map created by the renderer and cached for subsequent renders"); + + prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "stype"); + RNA_def_property_enum_items(prop, prop_source_items); + RNA_def_property_ui_text(prop, "Source", ""); + RNA_def_property_update(prop, 0, "rna_Envmap_source_update"); - rna_def_environment_map_common(srna); - - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "viewpoint_object", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "object"); + RNA_def_property_ui_text(prop, "Viewpoint Object", "Object to use as the environment map's viewpoint location"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + + prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_enum_items(prop, prop_mapping_items); + RNA_def_property_ui_text(prop, "Mapping", ""); RNA_def_property_update(prop, 0, "rna_Texture_update"); prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_NONE); @@ -740,20 +610,24 @@ static void rna_def_environment_map(BlenderRNA *brna) prop= RNA_def_property(srna, "zoom", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "viewscale"); - RNA_def_property_range(prop, 0.01, FLT_MAX); - RNA_def_property_ui_range(prop, 0.5, 5, 100, 2); + RNA_def_property_range(prop, 0.1, 5.0); + RNA_def_property_ui_range(prop, 0.5, 1.5, 1, 2); RNA_def_property_ui_text(prop, "Zoom", ""); RNA_def_property_update(prop, 0, "rna_Texture_update"); - /* XXX: EnvMap.notlay */ + prop= RNA_def_property(srna, "ignore_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER); + RNA_def_property_boolean_sdna(prop, NULL, "notlay", 1); + RNA_def_property_array(prop, 20); + RNA_def_property_ui_text(prop, "Ignore Layers", "Hide objects on these layers when generating the Environment Map"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); - prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "cuberes"); RNA_def_property_range(prop, 50, 4096); RNA_def_property_ui_text(prop, "Resolution", "Pixel resolution of the rendered environment map"); RNA_def_property_update(prop, 0, "rna_Texture_update"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_range(prop, 0, 5); RNA_def_property_ui_text(prop, "Depth", "Number of times a map will be rendered recursively (mirror effects.)"); RNA_def_property_update(prop, 0, "rna_Texture_update"); @@ -1116,17 +990,6 @@ static void rna_def_texture_image(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Image Texture", ""); RNA_def_struct_sdna(srna, "Tex"); - prop= RNA_def_property(srna, "mipmap", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_MIPMAP); - RNA_def_property_boolean_funcs(prop, NULL, "rna_ImageTexture_mipmap_set"); - RNA_def_property_ui_text(prop, "MIP Map", "Uses auto-generated MIP maps for the image"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - - prop= RNA_def_property(srna, "mipmap_gauss", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_GAUSS_MIP); - RNA_def_property_ui_text(prop, "MIP Map Gaussian filter", "Uses Gauss filter to sample down MIP maps"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - prop= RNA_def_property(srna, "interpolation", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_INTERPOL); RNA_def_property_ui_text(prop, "Interpolation", "Interpolates pixels using Area filter"); @@ -1153,7 +1016,7 @@ static void rna_def_texture_image(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Invert Alpha", "Inverts all the alpha values in the image"); RNA_def_property_update(prop, 0, "rna_Texture_update"); - rna_def_filter_size_common(srna); + rna_def_filter_common(srna); prop= RNA_def_property(srna, "extension", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "extend"); @@ -1254,26 +1117,6 @@ static void rna_def_texture_image(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed"); RNA_def_property_update(prop, 0, "rna_Texture_update"); - /* filtering */ - prop= RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "texfilter"); - RNA_def_property_enum_items(prop, texture_filter_items); - RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_ImageTexture_filter_itemf"); - RNA_def_property_ui_text(prop, "Filter", "Texture filter to use for sampling image"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - - prop= RNA_def_property(srna, "filter_probes", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "afmax"); - RNA_def_property_range(prop, 1, 256); - RNA_def_property_ui_text(prop, "Filter Probes", "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - - prop= RNA_def_property(srna, "filter_eccentricity", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "afmax"); - RNA_def_property_range(prop, 1, 256); - RNA_def_property_ui_text(prop, "Filter Eccentricity", "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); - /* Normal Map */ prop= RNA_def_property(srna, "normal_map", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_NORMALMAP); @@ -1310,20 +1153,25 @@ static void rna_def_texture_environment_map(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Environment Map", "Environment map texture"); RNA_def_struct_sdna(srna, "Tex"); - rna_def_environment_map_common(srna); - + prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "ima"); + RNA_def_property_struct_type(prop, "Image"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Image", "Source image file to read the environment map from"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL); RNA_def_property_pointer_sdna(prop, NULL, "iuser"); RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed"); RNA_def_property_update(prop, 0, "rna_Texture_update"); + rna_def_filter_common(srna); + prop= RNA_def_property(srna, "environment_map", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "env"); RNA_def_property_struct_type(prop, "EnvironmentMap"); RNA_def_property_ui_text(prop, "Environment Map", "Gets the environment map associated with this texture"); RNA_def_property_update(prop, 0, "rna_Texture_update"); - - rna_def_filter_size_common(srna); } static void rna_def_texture_musgrave(BlenderRNA *brna) @@ -1358,7 +1206,7 @@ static void rna_def_texture_musgrave(BlenderRNA *brna) prop= RNA_def_property(srna, "lacunarity", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "mg_lacunarity"); RNA_def_property_range(prop, 0, 6); - RNA_def_property_ui_text(prop, "Lacunarity", "Gap between succesive frequencies"); + RNA_def_property_ui_text(prop, "Lacunarity", "Gap between successive frequencies"); RNA_def_property_update(prop, 0, "rna_Texture_update"); prop= RNA_def_property(srna, "octaves", PROP_FLOAT, PROP_NONE); @@ -1642,7 +1490,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna) prop= RNA_def_property(srna, "speed_scale", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "speed_scale"); RNA_def_property_range(prop, 0.001, 100.0); - RNA_def_property_ui_text(prop, "Scale", "Multipler to bring particle speed within an acceptable range"); + RNA_def_property_ui_text(prop, "Scale", "Multiplier to bring particle speed within an acceptable range"); RNA_def_property_update(prop, 0, "rna_Texture_update"); prop= RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NEVER_NULL); @@ -1684,7 +1532,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna) prop= RNA_def_property(srna, "noise_basis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "noise_basis"); RNA_def_property_enum_items(prop, prop_noise_basis_items); - RNA_def_property_ui_text(prop, "Noise Basis", "Noise formula used for tubulence"); + RNA_def_property_ui_text(prop, "Noise Basis", "Noise formula used for turbulence"); RNA_def_property_update(prop, 0, "rna_Texture_update"); @@ -1746,7 +1594,7 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "smoked_type"); RNA_def_property_enum_items(prop, smoked_type_items); RNA_def_property_ui_text(prop, "Source", "Simulation value to be used as a texture"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); prop= RNA_def_property(srna, "extension", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "extend"); @@ -1764,34 +1612,34 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "file_format"); RNA_def_property_enum_items(prop, file_format_items); RNA_def_property_ui_text(prop, "File Format", "Format of the source data set to render "); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); prop= RNA_def_property(srna, "source_path", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_sdna(prop, NULL, "source_path"); RNA_def_property_ui_text(prop, "Source Path", "The external source data file to use"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resol"); RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); prop= RNA_def_property(srna, "still", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_VD_STILL); RNA_def_property_ui_text(prop, "Still Frame Only", "Always render a still frame from the voxel data sequence"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); prop= RNA_def_property(srna, "still_frame_number", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "still_frame"); RNA_def_property_range(prop, -MAXFRAME, MAXFRAME); RNA_def_property_ui_text(prop, "Still Frame Number", "The frame number to always use"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); prop= RNA_def_property(srna, "domain_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "object"); RNA_def_property_ui_text(prop, "Domain Object", "Object used as the smoke simulation domain"); RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); srna= RNA_def_struct(brna, "VoxelDataTexture", "Texture"); @@ -1809,12 +1657,12 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Image"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Image", ""); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_image_update"); prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL); RNA_def_property_pointer_sdna(prop, NULL, "iuser"); RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed"); - RNA_def_property_update(prop, 0, "rna_Texture_update"); + RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); } static void rna_def_texture(BlenderRNA *brna) @@ -1858,6 +1706,11 @@ static void rna_def_texture(BlenderRNA *brna) RNA_def_property_range(prop, 0.01, 5); RNA_def_property_ui_text(prop, "Contrast", ""); RNA_def_property_update(prop, 0, "rna_Texture_update"); + + prop= RNA_def_property(srna, "saturation", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0, 2); + RNA_def_property_ui_text(prop, "Saturation", ""); + RNA_def_property_update(prop, 0, "rna_Texture_update"); /* RGB Factor */ prop= RNA_def_property(srna, "factor_red", PROP_FLOAT, PROP_NONE); @@ -1878,6 +1731,12 @@ static void rna_def_texture(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Factor Blue", ""); RNA_def_property_update(prop, 0, "rna_Texture_update"); + /* Alpha for preview render */ + prop= RNA_def_property(srna, "use_preview_alpha", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_PRV_ALPHA); + RNA_def_property_ui_text(prop, "Show Alpha", "Show Alpha in Preview Render"); + RNA_def_property_update(prop, 0, "rna_Texture_update"); + /* nodetree */ prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1); @@ -1916,8 +1775,6 @@ void RNA_def_texture(BlenderRNA *brna) rna_def_texture(brna); rna_def_mtex(brna); rna_def_environment_map(brna); - rna_def_color_ramp(brna); - rna_def_color_ramp_element(brna); rna_def_texmapping(brna); } diff --git a/source/blender/makesrna/intern/rna_timeline.c b/source/blender/makesrna/intern/rna_timeline.c index 895cae6b51b..afc1d087cf2 100644 --- a/source/blender/makesrna/intern/rna_timeline.c +++ b/source/blender/makesrna/intern/rna_timeline.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index f204efb88c5..d25efd23da0 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -27,7 +27,6 @@ #include "DNA_screen_types.h" #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" #include "RNA_enum_types.h" diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 07c4d9c826e..b2831c4b1d3 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,14 +30,12 @@ #include #include "RNA_define.h" -#include "RNA_types.h" -#include "UI_interface.h" #include "UI_resources.h" #ifdef RNA_RUNTIME -static void rna_uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand, int slider, int toggle, int icon_only, int event, int full_event, int no_bg, int index) +static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, char *name, int icon, int expand, int slider, int toggle, int icon_only, int event, int full_event, int emboss, int index) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); int flag= 0; @@ -53,14 +51,16 @@ static void rna_uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, flag |= (icon_only)? UI_ITEM_R_ICON_ONLY: 0; flag |= (event)? UI_ITEM_R_EVENT: 0; flag |= (full_event)? UI_ITEM_R_FULL_EVENT: 0; - flag |= (no_bg)? UI_ITEM_R_NO_BG: 0; + flag |= (emboss)? 0: UI_ITEM_R_NO_BG; - uiItemFullR(layout, name, icon, ptr, prop, index, 0, flag); + uiItemFullR(layout, ptr, prop, index, 0, flag, name, icon); } -static PointerRNA rna_uiItemO(uiLayout *layout, char *name, int icon, char *opname) +static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int icon, int emboss) { - return uiItemFullO(layout, name, icon, opname, NULL, uiLayoutGetOperatorContext(layout), UI_ITEM_O_RETURN_PROPS); + int flag= UI_ITEM_O_RETURN_PROPS; + flag |= (emboss)? 0: UI_ITEM_R_NO_BG; + return uiItemFullO(layout, opname, name, icon, NULL, uiLayoutGetOperatorContext(layout), flag); } #else @@ -83,15 +83,19 @@ static void api_ui_item_common(FunctionRNA *func) } -static void api_ui_item_op_common(FunctionRNA *func) +static void api_ui_item_op(FunctionRNA *func) { PropertyRNA *parm; - - api_ui_item_common(func); parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator."); RNA_def_property_flag(parm, PROP_REQUIRED); } +static void api_ui_item_op_common(FunctionRNA *func) +{ + api_ui_item_op(func); + api_ui_item_common(func); +} + static void api_ui_item_rna_common(FunctionRNA *func) { PropertyRNA *parm; @@ -150,40 +154,41 @@ void RNA_api_ui_layout(StructRNA *srna) /* items */ func= RNA_def_function(srna, "prop", "rna_uiItemR"); - api_ui_item_common(func); api_ui_item_rna_common(func); + api_ui_item_common(func); RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail."); RNA_def_boolean(func, "slider", 0, "", "Use slider widget for numeric values."); RNA_def_boolean(func, "toggle", 0, "", "Use toggle widget for boolean values."); RNA_def_boolean(func, "icon_only", 0, "", "Draw only icons in buttons, no text."); RNA_def_boolean(func, "event", 0, "", "Use button to input key events."); RNA_def_boolean(func, "full_event", 0, "", "Use button to input full events including modifiers."); - RNA_def_boolean(func, "no_bg", 0, "", "Don't draw the button itself, just the icon/text."); + RNA_def_boolean(func, "emboss", 1, "", "Draw the button itself, just the icon/text."); RNA_def_int(func, "index", -1, -2, INT_MAX, "", "The index of this button, when set a single member of an array can be accessed, when set to -1 all array members are used.", -2, INT_MAX); /* RNA_NO_INDEX == -1 */ func= RNA_def_function(srna, "props_enum", "uiItemsEnumR"); api_ui_item_rna_common(func); func= RNA_def_function(srna, "prop_menu_enum", "uiItemMenuEnumR"); - api_ui_item_common(func); api_ui_item_rna_common(func); + api_ui_item_common(func); func= RNA_def_function(srna, "prop_enum", "uiItemEnumR_string"); - api_ui_item_common(func); api_ui_item_rna_common(func); parm= RNA_def_string(func, "value", "", 0, "", "Enum property value."); RNA_def_property_flag(parm, PROP_REQUIRED); + api_ui_item_common(func); func= RNA_def_function(srna, "prop_object", "uiItemPointerR"); - api_ui_item_common(func); api_ui_item_rna_common(func); parm= RNA_def_pointer(func, "search_data", "AnyType", "", "Data from which to take collection to search in."); RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL); parm= RNA_def_string(func, "search_property", "", 0, "", "Identifier of search collection property."); RNA_def_property_flag(parm, PROP_REQUIRED); + api_ui_item_common(func); func= RNA_def_function(srna, "operator", "rna_uiItemO"); api_ui_item_op_common(func); + RNA_def_boolean(func, "emboss", 1, "", "Draw the button itself, just the icon/text."); parm= RNA_def_pointer(func, "properties", "OperatorProperties", "", "Operator properties to fill in, return when 'properties' is set to true."); RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR); RNA_def_function_return(func, parm); @@ -202,9 +207,10 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_property_flag(parm, PROP_REQUIRED); func= RNA_def_function(srna, "operator_menu_enum", "uiItemMenuEnumO"); - api_ui_item_op_common(func); + api_ui_item_op(func); /* cant use api_ui_item_op_common because property must come right after */ parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator."); RNA_def_property_flag(parm, PROP_REQUIRED); + api_ui_item_common(func); /* func= RNA_def_function(srna, "operator_boolean", "uiItemBooleanO"); api_ui_item_op_common(func); @@ -239,8 +245,8 @@ void RNA_api_ui_layout(StructRNA *srna) func= RNA_def_function(srna, "menu", "uiItemM"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); - api_ui_item_common(func); parm= RNA_def_string(func, "menu", "", 0, "", "Identifier of the menu."); + api_ui_item_common(func); RNA_def_property_flag(parm, PROP_REQUIRED); func= RNA_def_function(srna, "separator", "uiItemS"); @@ -268,6 +274,7 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block."); RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a file for creating a new ID block."); RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block."); + RNA_def_string(func, "filter", "", 0, "", "Function identifier to filter the ID block."); func= RNA_def_function(srna, "template_ID_preview", "uiTemplateIDPreview"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); @@ -275,6 +282,7 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block."); RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a file for creating a new ID block."); RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block."); + RNA_def_string(func, "filter", "", 0, "", "Function identifier to filter the ID block."); RNA_def_int(func, "rows", 0, 0, INT_MAX, "Number of thumbnail preview rows to display", "", 0, INT_MAX); RNA_def_int(func, "cols", 0, 0, INT_MAX, "Number of thumbnail preview columns to display", "", 0, INT_MAX); @@ -311,6 +319,7 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL); parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); RNA_def_function_return(func, parm); + RNA_def_boolean(func, "compact", 0, "", "Show a smaller version of the template, split on two lines."); func= RNA_def_function(srna, "template_preview", "uiTemplatePreview"); parm= RNA_def_pointer(func, "id", "ID", "", "ID datablock."); @@ -332,6 +341,14 @@ void RNA_api_ui_layout(StructRNA *srna) api_ui_item_rna_common(func); RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail."); + func= RNA_def_function(srna, "template_waveform", "uiTemplateWaveform"); + api_ui_item_rna_common(func); + RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail."); + + func= RNA_def_function(srna, "template_vectorscope", "uiTemplateVectorscope"); + api_ui_item_rna_common(func); + RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail."); + func= RNA_def_function(srna, "template_layers", "uiTemplateLayers"); api_ui_item_rna_common(func); parm= RNA_def_pointer(func, "used_layers_data", "AnyType", "", "Data from which to take property."); @@ -345,6 +362,8 @@ void RNA_api_ui_layout(StructRNA *srna) api_ui_item_rna_common(func); RNA_def_boolean(func, "value_slider", 0, "", "Display the value slider to the right of the color wheel"); RNA_def_boolean(func, "lock", 0, "", "Lock the color wheel display to value 1.0 regardless of actual color"); + RNA_def_boolean(func, "lock_luminosity", 0, "", "Keep the color at its original vector length"); + RNA_def_boolean(func, "cubic", 1, "", "Cubic saturation for picking values close to white"); func= RNA_def_function(srna, "template_triColorSet", "uiTemplateTriColorSet"); api_ui_item_rna_common(func); @@ -387,10 +406,6 @@ void RNA_api_ui_layout(StructRNA *srna) func= RNA_def_function(srna, "template_reports_banner", "uiTemplateReportsBanner"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); - parm= RNA_def_pointer(func, "operator", "Operator", "", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - - func= RNA_def_function(srna, "introspect", "uiLayoutIntrospect"); parm= RNA_def_string(func, "string", "", 1024*1024, "Descr", "DESCR"); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index abf83f33c8b..e933b7903bc 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -25,13 +25,14 @@ #include #include "RNA_define.h" -#include "RNA_types.h" +#include "RNA_enum_types.h" #include "rna_internal.h" #include "DNA_curve_types.h" #include "DNA_space_types.h" #include "DNA_userdef_types.h" +#include "DNA_brush_types.h" #include "WM_api.h" #include "WM_types.h" @@ -69,8 +70,7 @@ static void rna_userdef_mipmap_update(Main *bmain, Scene *scene, PointerRNA *ptr rna_userdef_update(bmain, scene, ptr); } -#if 0 -static void rna_userdef_lmb_select_set(PointerRNA *ptr,int value) +static void rna_userdef_select_mouse_set(PointerRNA *ptr,int value) { UserDef *userdef = (UserDef*)ptr->data; @@ -82,22 +82,6 @@ static void rna_userdef_lmb_select_set(PointerRNA *ptr,int value) userdef->flag &= ~USER_LMOUSESELECT; } -static void rna_userdef_rmb_select_set(PointerRNA *ptr,int value) -{ - rna_userdef_lmb_select_set(ptr, !value); -} -#endif - -static void rna_userdef_emulate_set(PointerRNA *ptr,int value) -{ - UserDef *userdef = (UserDef*)ptr->data; - - if(userdef->flag & USER_LMOUSESELECT) - userdef->flag &= ~USER_TWOBUTTONMOUSE; - else - userdef->flag ^= USER_TWOBUTTONMOUSE; -} - static int rna_userdef_autokeymode_get(PointerRNA *ptr) { UserDef *userdef = (UserDef*)ptr->data; @@ -201,12 +185,9 @@ static void rna_UserDef_weight_color_update(Main *bmain, Scene *scene, PointerRN rna_userdef_update(bmain, scene, ptr); } -// XXX - todo, this is not accessible from here and it only works when the userprefs are in the same window. -// extern int GPU_default_lights(void); static void rna_UserDef_viewport_lights_update(Main *bmain, Scene *scene, PointerRNA *ptr) { - // GPU_default_lights(); - WM_main_add_notifier(NC_SPACE|ND_SPACE_VIEW3D, NULL); + WM_main_add_notifier(NC_SPACE|ND_SPACE_VIEW3D|NS_VIEW3D_GPU, NULL); rna_userdef_update(bmain, scene, ptr); } @@ -231,7 +212,12 @@ static void rna_userdef_addon_remove(bAddon *bext) BLI_freelinkN(&U.addons, bext); } - +static void rna_userdef_temp_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + extern char btempdir[]; + UserDef *userdef = (UserDef*)ptr->data; + strncpy(btempdir, userdef->tempdir, FILE_MAXDIR+FILE_MAXFILE); +} #else @@ -539,6 +525,13 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ThemeWidgetColors"); RNA_def_property_ui_text(prop, "Scroll Widget Colors", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "wcol_progress", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_pointer_sdna(prop, NULL, "wcol_progress"); + RNA_def_property_struct_type(prop, "ThemeWidgetColors"); + RNA_def_property_ui_text(prop, "Progress Bar Widget Colors", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); prop= RNA_def_property(srna, "wcol_list_item", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); @@ -686,6 +679,11 @@ static void rna_def_userdef_theme_spaces_edge(StructRNA *srna) RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Edge Sharp", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "edge_crease", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Edge Crease", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); prop= RNA_def_property(srna, "edge_facesel", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 3); @@ -718,6 +716,97 @@ static void rna_def_userdef_theme_spaces_face(StructRNA *srna) RNA_def_property_update(prop, 0, "rna_userdef_update"); } +static void rna_def_userdef_theme_spaces_curves(StructRNA *srna, short incl_nurbs) +{ + PropertyRNA *prop; + + if (incl_nurbs) { + prop= RNA_def_property(srna, "nurb_uline", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "nurb_uline"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Nurb U-lines", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "nurb_vline", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "nurb_vline"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Nurb V-lines", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "nurb_sel_uline", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "nurb_sel_uline"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Nurb active U-lines", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "nurb_sel_vline", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "nurb_sel_vline"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Nurb active V-lines", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "act_spline", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "act_spline"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Active spline", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + } + + prop= RNA_def_property(srna, "handle_free", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_free"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Free handle color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_auto", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_auto"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Auto handle color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_vect", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_vect"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Vector handle color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_align", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_align"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Align handle color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_sel_free", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_sel_free"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Free handle selected color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_sel_auto", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_sel_auto"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Auto handle selected color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_sel_vect", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_sel_vect"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Vector handle selected color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "handle_sel_align", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "handle_sel_align"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Align handle selected color", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "lastsel_point", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "lastsel_point"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Last selected point", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); +} + static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna) { StructRNA *srna; @@ -779,10 +868,11 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna) RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Transform", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - + rna_def_userdef_theme_spaces_vertex(srna); rna_def_userdef_theme_spaces_edge(srna); rna_def_userdef_theme_spaces_face(srna); + rna_def_userdef_theme_spaces_curves(srna, 1); prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 4); @@ -809,7 +899,7 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Bone Pose", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -862,8 +952,9 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_userdef_update"); rna_def_userdef_theme_spaces_vertex(srna); + rna_def_userdef_theme_spaces_curves(srna, 0); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -1083,7 +1174,7 @@ static void rna_def_userdef_theme_space_text(BlenderRNA *brna) prop= RNA_def_property(srna, "syntax_builtin", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "syntaxb"); RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Syntax Builtin", ""); + RNA_def_property_ui_text(prop, "Syntax Built-in", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); prop= RNA_def_property(srna, "syntax_special", PROP_FLOAT, PROP_COLOR); @@ -1230,7 +1321,7 @@ static void rna_def_userdef_theme_space_time(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Grid", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -1261,7 +1352,7 @@ static void rna_def_userdef_theme_space_sound(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Window Sliders", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -1306,7 +1397,7 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna) RNA_def_struct_sdna(srna, "ThemeSpace"); RNA_def_struct_ui_text(srna, "Theme Sequence Editor", "Theme settings for the Sequence Editor"); - rna_def_userdef_theme_spaces_main(srna, SPACE_IMAGE); + rna_def_userdef_theme_spaces_main(srna, SPACE_IMAGE); prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 3); @@ -1367,7 +1458,7 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Meta Strip", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -1452,7 +1543,7 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Long Key Selected", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -1519,7 +1610,7 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Strips Selected", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "cframe"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Current Frame", ""); @@ -1824,6 +1915,10 @@ static void rna_def_userdef_view(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_VIEWPORTNAME); RNA_def_property_ui_text(prop, "Show View Name", "Show the name of the view's direction in each 3D View"); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "show_splash", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "uiflag", USER_SPLASH_DISABLE); + RNA_def_property_ui_text(prop, "Show Splash", "Display splash screen on startup"); prop= RNA_def_property(srna, "show_playback_fps", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_FPS); @@ -1856,10 +1951,6 @@ static void rna_def_userdef_view(BlenderRNA *brna) RNA_def_property_range(prop, 1, 40); RNA_def_property_ui_text(prop, "Hold RMB Open Toolbox Delay", "Time in 1/10 seconds to hold the Right Mouse Button before opening the toolbox"); - prop= RNA_def_property(srna, "pin_floating_panels", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_PANELPINNED); - RNA_def_property_ui_text(prop, "Pin Floating Panels", "Make floating panels invoked by a hotkey (eg. N Key) open at the previous location"); - prop= RNA_def_property(srna, "use_column_layout", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_PLAINMENUS); RNA_def_property_ui_text(prop, "Toolbox Column Layout", "Use a column layout for toolbox"); @@ -1975,6 +2066,13 @@ static void rna_def_userdef_view(BlenderRNA *brna) RNA_def_property_enum_funcs(prop, NULL, "rna_userdef_timecode_style_set", NULL); RNA_def_property_ui_text(prop, "TimeCode Style", "Format of Time Codes displayed when not displaying timing in terms of frames"); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + /* Properties Window */ + prop= RNA_def_property(srna, "properties_width_check", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "propwidth"); + RNA_def_property_range(prop, 150, 400); + RNA_def_property_ui_text(prop, "Width Check", "Dual Column layout will change to single column layout when the width of the area gets below this value (needs restart to take effect)"); + RNA_def_property_update(prop, 0, "rna_userdef_update"); } static void rna_def_userdef_edit(BlenderRNA *brna) @@ -1986,22 +2084,15 @@ static void rna_def_userdef_edit(BlenderRNA *brna) {AUTOKEY_MODE_NORMAL, "ADD_REPLACE_KEYS", 0, "Add/Replace", ""}, {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace", ""}, {0, NULL, 0, NULL, NULL}}; - - // XXX: we could just use the one that is defined in rna_curve.h - static EnumPropertyItem new_interpolation_types[] = { - {BEZT_IPO_CONST, "CONSTANT", 0, "Constant", ""}, - {BEZT_IPO_LIN, "LINEAR", 0, "Linear", ""}, - {BEZT_IPO_BEZ, "BEZIER", 0, "Bezier", ""}, - {0, NULL, 0, NULL, NULL}}; - + static const EnumPropertyItem material_link_items[]= { {0, "OBDATA", 0, "ObData", "Toggle whether the material is linked to object data or the object block"}, {USER_MAT_ON_OB, "OBJECT", 0, "Object", "Toggle whether the material is linked to object data or the object block"}, {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem object_align_items[]= { - {0, "WORLD", 0, "World", "Align newly added objects facing the 3D View direction"}, - {USER_ADD_VIEWALIGNED, "VIEW", 0, "View", "Align newly added objects to the world coordinates"}, + {0, "WORLD", 0, "World", "Align newly added objects to the world coordinates"}, + {USER_ADD_VIEWALIGNED, "VIEW", 0, "View", "Align newly added objects facing the active 3D View direction"}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "UserPreferencesEdit", NULL); @@ -2019,15 +2110,15 @@ static void rna_def_userdef_edit(BlenderRNA *brna) prop= RNA_def_property(srna, "object_align", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); RNA_def_property_enum_items(prop, object_align_items); - RNA_def_property_ui_text(prop, "Align Object To", "Align newly added objects facing the 3D View direction or the world coordinates"); + RNA_def_property_ui_text(prop, "Align Object To", "When adding objects from a 3D View menu, either align them to that view's direction or the world coordinates"); prop= RNA_def_property(srna, "enter_edit_mode", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_ADD_EDITMODE); RNA_def_property_ui_text(prop, "Enter Edit Mode", "Enter Edit Mode automatically after adding a new object"); prop= RNA_def_property(srna, "drag_immediately", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_DRAGIMMEDIATE); - RNA_def_property_ui_text(prop, "Drag Immediately", "Moving things with a mouse drag doesn't require a click to confirm (Best for tablet users)"); + RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELEASECONFIRM); + RNA_def_property_ui_text(prop, "Release confirm", "Moving things with a mouse drag confirms when releasing the button"); /* Undo */ prop= RNA_def_property(srna, "undo_steps", PROP_INT, PROP_NONE); @@ -2044,23 +2135,11 @@ static void rna_def_userdef_edit(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_GLOBALUNDO); RNA_def_property_ui_text(prop, "Global Undo", "Global undo works by keeping a full copy of the file itself in memory, so takes extra memory"); - /* snapping */ - prop= RNA_def_property(srna, "snap_translate", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOGRABGRID); - RNA_def_property_ui_text(prop, "Enable Translation Snap", "Snap objects and sub-objects to grid units when moving"); - - prop= RNA_def_property(srna, "snap_rotate", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOROTGRID); - RNA_def_property_ui_text(prop, "Enable Rotation Snap", "Snap objects and sub-objects to grid units when rotating"); - - prop= RNA_def_property(srna, "snap_scale", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSIZEGRID); - RNA_def_property_ui_text(prop, "Enable Scaling Snap", "Snap objects and sub-objects to grid units when scaling"); - /* auto keyframing */ prop= RNA_def_property(srna, "use_auto_keying", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "autokey_mode", AUTOKEY_ON); RNA_def_property_ui_text(prop, "Auto Keying Enable", "Automatic keyframe insertion for Objects and Bones"); + RNA_def_property_ui_icon(prop, ICON_REC, 0); prop= RNA_def_property(srna, "auto_keying_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, auto_key_modes); @@ -2088,11 +2167,16 @@ static void rna_def_userdef_edit(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_XYZ2RGB); RNA_def_property_ui_text(prop, "New F-Curve Colors - XYZ to RGB", "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"); - prop= RNA_def_property(srna, "new_interpolation_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, new_interpolation_types); + prop= RNA_def_property(srna, "keyframe_new_interpolation_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, beztriple_interpolation_mode_items); RNA_def_property_enum_sdna(prop, NULL, "ipo_new"); RNA_def_property_ui_text(prop, "New Interpolation Type", ""); + prop= RNA_def_property(srna, "keyframe_new_handle_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, beztriple_handle_type_items); + RNA_def_property_enum_sdna(prop, NULL, "keyhandles_new"); + RNA_def_property_ui_text(prop, "New Handles Type", ""); + /* frame numbers */ prop= RNA_def_property(srna, "use_negative_frames", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_NONEGFRAMES); @@ -2121,7 +2205,43 @@ static void rna_def_userdef_edit(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "gp_eraser"); RNA_def_property_range(prop, 0, 100); RNA_def_property_ui_text(prop, "Grease Pencil Eraser Radius", "Radius of eraser 'brush'"); - + + /* sculpt and paint */ + + prop= RNA_def_property(srna, "sculpt_paint_overlay_col", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "sculpt_paint_overlay_col"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Sculpt/Paint Overlay Color", "Color of texture overlay"); + + prop= RNA_def_property(srna, "sculpt_paint_use_unified_size", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "sculpt_paint_settings", SCULPT_PAINT_USE_UNIFIED_SIZE); + RNA_def_property_ui_text(prop, "Sculpt/Paint Use Unified Radius", "Instead of per brush radius, the radius is shared across brushes"); + + prop= RNA_def_property(srna, "sculpt_paint_use_unified_strength", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "sculpt_paint_settings", SCULPT_PAINT_USE_UNIFIED_ALPHA); + RNA_def_property_ui_text(prop, "Sculpt/Paint Use Unified Strength", "Instead of per brush strength, the strength is shared across brushes"); + + prop= RNA_def_property(srna, "sculpt_paint_unified_lock_brush_size", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "sculpt_paint_settings", SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE); + RNA_def_property_ui_text(prop, "Sculpt/Paint Use Unified Blender Units", "When locked all brushes stay same size relative to object; when unlocked all brush sizes are given in pixels"); + + prop= RNA_def_property(srna, "sculpt_paint_unified_size", PROP_INT, PROP_DISTANCE); + RNA_def_property_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS*10); + RNA_def_property_ui_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS, 1, 0); + RNA_def_property_ui_text(prop, "Sculpt/Paint Unified Size", "Unified radius of the brush in pixels"); + + prop= RNA_def_property(srna, "sculpt_paint_unified_unprojected_radius", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_range(prop, 0, FLT_MAX); + RNA_def_property_ui_range(prop, 0, 1, 0, 0); + RNA_def_property_ui_text(prop, "Sculpt/Paint Unified Surface Size", "Unified radius of brush in Blender units"); + + prop= RNA_def_property(srna, "sculpt_paint_unified_strength", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "sculpt_paint_unified_alpha"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 0.001); + RNA_def_property_ui_text(prop, "Sculpt/Paint Unified Strength", "Unified power of effect of brushes when applied"); + /* duplication linking */ prop= RNA_def_property(srna, "duplicate_mesh", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MESH); @@ -2368,6 +2488,10 @@ static void rna_def_userdef_system(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Auto Run Python Scripts", "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)"); RNA_def_property_update(prop, 0, "rna_userdef_script_autoexec_update"); + prop= RNA_def_property(srna, "tabs_as_spaces", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_TXT_TABSTOSPACES_DISABLE); + RNA_def_property_ui_text(prop, "Tabs as Spaces", "Automatically converts all new tabs into spaces for new and loaded text files"); + prop= RNA_def_property(srna, "prefetch_frames", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "prefetchframes"); RNA_def_property_range(prop, 0, 500); @@ -2381,7 +2505,7 @@ static void rna_def_userdef_system(BlenderRNA *brna) prop= RNA_def_property(srna, "frame_server_port", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "frameserverport"); RNA_def_property_range(prop, 0, 32727); - RNA_def_property_ui_text(prop, "Frame Server Port", "Frameserver Port for Framserver-Rendering"); + RNA_def_property_ui_text(prop, "Frame Server Port", "Frameserver Port for Frameserver Rendering"); prop= RNA_def_property(srna, "clip_alpha", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "glalphaclip"); @@ -2509,12 +2633,13 @@ static void rna_def_userdef_input(BlenderRNA *brna) prop= RNA_def_property(srna, "select_mouse", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); RNA_def_property_enum_items(prop, select_mouse_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_userdef_select_mouse_set", NULL); RNA_def_property_ui_text(prop, "Select Mouse", "The mouse button used for selection"); - prop= RNA_def_property(srna, "viewport_zoom_style", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "zoom_style", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "viewzoom"); RNA_def_property_enum_items(prop, view_zoom_styles); - RNA_def_property_ui_text(prop, "Viewport Zoom Style", "Which style to use for viewport scaling"); + RNA_def_property_ui_text(prop, "Zoom Style", "Which style to use for viewport scaling"); prop= RNA_def_property(srna, "zoom_axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "uiflag"); @@ -2551,12 +2676,17 @@ static void rna_def_userdef_input(BlenderRNA *brna) prop= RNA_def_property(srna, "emulate_3_button_mouse", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TWOBUTTONMOUSE); - RNA_def_property_boolean_funcs(prop, NULL, "rna_userdef_emulate_set"); - RNA_def_property_ui_text(prop, "Emulate 3 Button Mouse", "Emulates Middle Mouse with Alt+LeftMouse (doesnt work with Left Mouse Select option)"); + RNA_def_property_ui_text(prop, "Emulate 3 Button Mouse", "Emulates Middle Mouse with Alt+LeftMouse (doesn't work with Left Mouse Select option)"); prop= RNA_def_property(srna, "emulate_numpad", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_NONUMPAD); RNA_def_property_ui_text(prop, "Emulate Numpad", "Causes the 1 to 0 keys to act as the numpad (useful for laptops)"); + + /* U.keymaps - custom keymaps that have been edited from default configs */ + prop= RNA_def_property(srna, "edited_keymaps", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "keymaps", NULL); + RNA_def_property_struct_type(prop, "KeyMap"); + RNA_def_property_ui_text(prop, "Edited Keymaps", ""); } static void rna_def_userdef_filepaths(BlenderRNA *brna) @@ -2570,6 +2700,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) {2, "DJV", 0, "Djv", "Open source frame player: http://djv.sourceforge.net"}, {3, "FRAMECYCLER", 0, "FrameCycler", "Frame player from IRIDAS"}, {4, "RV", 0, "rv", "Frame player from Tweak Software"}, + {5, "MPLAYER", 0, "MPlayer", "Media player for video & png/jpeg/sgi image sequences"}, {50, "CUSTOM", 0, "Custom", "Custom animation player executable path"}, {0, NULL, 0, NULL, NULL}}; @@ -2629,6 +2760,11 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) prop= RNA_def_property(srna, "temporary_directory", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, NULL, "tempdir"); RNA_def_property_ui_text(prop, "Temporary Directory", "The directory for storing temporary save files"); + RNA_def_property_update(prop, 0, "rna_userdef_temp_update"); + + prop= RNA_def_property(srna, "image_editor", PROP_STRING, PROP_DIRPATH); + RNA_def_property_string_sdna(prop, NULL, "image_editor"); + RNA_def_property_ui_text(prop, "Image Editor", "Path to an image editor"); prop= RNA_def_property(srna, "animation_player", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, NULL, "anim_player"); diff --git a/source/blender/makesrna/intern/rna_vfont.c b/source/blender/makesrna/intern/rna_vfont.c index d0098e7b216..c19fbd7d5d3 100644 --- a/source/blender/makesrna/intern/rna_vfont.c +++ b/source/blender/makesrna/intern/rna_vfont.c @@ -25,7 +25,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -45,10 +44,10 @@ void RNA_def_vfont(BlenderRNA *brna) RNA_def_struct_sdna(srna, "VFont"); RNA_def_struct_ui_icon(srna, ICON_FILE_FONT); - prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Filename", ""); + RNA_def_property_ui_text(prop, "File Path", ""); prop= RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "packedfile"); diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index cda7fca1073..1797df2abf0 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -27,7 +27,6 @@ #include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -115,6 +114,7 @@ EnumPropertyItem event_type_items[] = { {SELECTMOUSE, "SELECTMOUSE", 0, "Select Mouse", ""}, {0, "", 0, NULL, NULL}, {MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", ""}, + {INBETWEEN_MOUSEMOVE, "INBETWEEN_MOUSEMOVE", 0, "Inbetween Move", ""}, {MOUSEPAN, "TRACKPADPAN", 0, "Mouse/Trackpad Pan", ""}, {MOUSEZOOM, "TRACKPADZOOM", 0, "Mouse/Trackpad Zoom", ""}, {MOUSEROTATE, "MOUSEROTATE", 0, "Mouse/Trackpad Rotate", ""}, @@ -227,6 +227,13 @@ EnumPropertyItem event_type_items[] = { {F10KEY, "F10", 0, "F10", ""}, {F11KEY, "F11", 0, "F11", ""}, {F12KEY, "F12", 0, "F12", ""}, + {F13KEY, "F13", 0, "F13", ""}, + {F14KEY, "F14", 0, "F14", ""}, + {F15KEY, "F15", 0, "F15", ""}, + {F16KEY, "F16", 0, "F16", ""}, + {F17KEY, "F17", 0, "F17", ""}, + {F18KEY, "F18", 0, "F18", ""}, + {F19KEY, "F19", 0, "F19", ""}, {PAUSEKEY, "PAUSE", 0, "Pause", ""}, {INSERTKEY, "INSERT", 0, "Insert", ""}, {HOMEKEY, "HOME", 0, "Home", ""}, @@ -409,7 +416,7 @@ static int rna_wmKeyMapItem_map_type_get(PointerRNA *ptr) wmKeyMapItem *kmi= ptr->data; if(ISTIMER(kmi->type)) return KMI_TYPE_TIMER; - if(ISKEYBOARD(kmi->type)) return KMI_TYPE_KEYBOARD; + if(ISKEYBOARD(kmi->type)) return KMI_TYPE_KEYBOARD; if(ISTWEAK(kmi->type)) return KMI_TYPE_TWEAK; if(ISMOUSE(kmi->type)) return KMI_TYPE_MOUSE; if(kmi->type == KM_TEXTINPUT) return KMI_TYPE_TEXTINPUT; @@ -605,6 +612,7 @@ static int rna_wmKeyMapItem_name_length(PointerRNA *ptr) return 0; } +#ifndef DISABLE_PYTHON static void rna_Operator_unregister(const bContext *C, StructRNA *type) { char *idname; @@ -613,6 +621,12 @@ static void rna_Operator_unregister(const bContext *C, StructRNA *type) if(!ot) return; + /* update while blender is running */ + if(C) { + WM_operator_stack_clear((bContext*)C); + WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL); + } + RNA_struct_free_extension(type, &ot->ext); idname= ot->idname; @@ -621,10 +635,6 @@ static void rna_Operator_unregister(const bContext *C, StructRNA *type) /* not to be confused with the RNA_struct_free that WM_operatortype_remove calls, they are 2 different srna's */ RNA_struct_free(&BLENDER_RNA, type); - - /* update while blender is running */ - if(C) - WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL); } static int operator_poll(bContext *C, wmOperatorType *ot) @@ -738,7 +748,6 @@ static void operator_draw(bContext *C, wmOperator *op) RNA_parameter_list_free(&list); } -#ifndef DISABLE_PYTHON void operator_wrapper(wmOperatorType *ot, void *userdata); void macro_wrapper(wmOperatorType *ot, void *userdata); @@ -892,6 +901,66 @@ static StructRNA* rna_MacroOperator_refine(PointerRNA *opr) return (op->type && op->type->ext.srna)? op->type->ext.srna: &RNA_Macro; } +static wmKeyMapItem *rna_KeyMap_add_item(wmKeyMap *km, ReportList *reports, char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier) +{ +// wmWindowManager *wm = CTX_wm_manager(C); + int modifier= 0; + + /* only on non-modal maps */ + if (km->flag & KEYMAP_MODAL) { + BKE_report(reports, RPT_ERROR, "Not a non-modal keymap."); + return NULL; + } + + if(shift) modifier |= KM_SHIFT; + if(ctrl) modifier |= KM_CTRL; + if(alt) modifier |= KM_ALT; + if(oskey) modifier |= KM_OSKEY; + + if(any) modifier = KM_ANY; + + return WM_keymap_add_item(km, idname, type, value, modifier, keymodifier); +} + +static wmKeyMapItem *rna_KeyMap_add_modal_item(wmKeyMap *km, bContext *C, ReportList *reports, char* propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier) +{ + wmWindowManager *wm = CTX_wm_manager(C); + int modifier= 0; + int propvalue = 0; + + /* only modal maps */ + if ((km->flag & KEYMAP_MODAL) == 0) { + BKE_report(reports, RPT_ERROR, "Not a modal keymap."); + return NULL; + } + + if (!km->modal_items) { + if(!WM_keymap_user_init(wm, km)) { + BKE_report(reports, RPT_ERROR, "User defined keymap doesn't correspond to a system keymap."); + return NULL; + } + } + + if (!km->modal_items) { + BKE_report(reports, RPT_ERROR, "No property values defined."); + return NULL; + } + + + if(RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue)==0) { + BKE_report(reports, RPT_WARNING, "Property value not in enumeration."); + } + + if(shift) modifier |= KM_SHIFT; + if(ctrl) modifier |= KM_CTRL; + if(alt) modifier |= KM_ALT; + if(oskey) modifier |= KM_OSKEY; + + if(any) modifier = KM_ANY; + + return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue); +} + #else static void rna_def_operator(BlenderRNA *brna) @@ -1204,6 +1273,56 @@ static void rna_def_windowmanager(BlenderRNA *brna) RNA_api_wm(srna); } +/* keyconfig.items */ +static void rna_def_keymap_items(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; +// PropertyRNA *prop; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "KeyMapItems"); + srna= RNA_def_struct(brna, "KeyMapItems", NULL); + RNA_def_struct_sdna(srna, "wmKeyMap"); + RNA_def_struct_ui_text(srna, "KeyMap Items", "Collection of keymap items"); + + func= RNA_def_function(srna, "add", "rna_KeyMap_add_item"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm= RNA_def_string(func, "idname", "", 0, "Operator Identifier", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_boolean(func, "any", 0, "Any", ""); + RNA_def_boolean(func, "shift", 0, "Shift", ""); + RNA_def_boolean(func, "ctrl", 0, "Ctrl", ""); + RNA_def_boolean(func, "alt", 0, "Alt", ""); + RNA_def_boolean(func, "oskey", 0, "OS Key", ""); + RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", ""); + parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item."); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "add_modal", "rna_KeyMap_add_modal_item"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); + parm= RNA_def_string(func, "propvalue", "", 0, "Property Value", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", ""); + RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_boolean(func, "any", 0, "Any", ""); + RNA_def_boolean(func, "shift", 0, "Shift", ""); + RNA_def_boolean(func, "ctrl", 0, "Ctrl", ""); + RNA_def_boolean(func, "alt", 0, "Alt", ""); + RNA_def_boolean(func, "oskey", 0, "OS Key", ""); + RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", ""); + parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item."); + RNA_def_function_return(func, parm); + +} + static void rna_def_keyconfig(BlenderRNA *brna) { StructRNA *srna; @@ -1229,10 +1348,6 @@ static void rna_def_keyconfig(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Name", "Name of the key configuration"); RNA_def_struct_name_property(srna, prop); - prop= RNA_def_property(srna, "filter", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "filter"); - RNA_def_property_ui_text(prop, "Filter", "Search term for filtering in the UI"); - prop= RNA_def_property(srna, "keymaps", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "KeyMap"); RNA_def_property_ui_text(prop, "Key Maps", "Key maps configured as part of this configuration"); @@ -1270,6 +1385,7 @@ static void rna_def_keyconfig(BlenderRNA *brna) prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "KeyMapItem"); RNA_def_property_ui_text(prop, "Items", "Items in the keymap, linking an operator to an input event"); + rna_def_keymap_items(brna, prop); prop= RNA_def_property(srna, "user_defined", PROP_BOOLEAN, PROP_NEVER_NULL); RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_USER); diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index 07146b95e6b..b48f314588e 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -30,7 +30,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "DNA_screen_types.h" @@ -40,8 +39,6 @@ #include "BKE_context.h" -#include "WM_api.h" -#include "WM_types.h" static wmKeyMap *rna_keymap_add(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid, int modal) { @@ -73,72 +70,11 @@ static wmKeyMap *rna_keymap_active(wmKeyMap *km, bContext *C) return WM_keymap_active(wm, km); } - -static wmKeyMapItem *rna_KeyMap_add_modal_item(wmKeyMap *km, bContext *C, ReportList *reports, char* propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier) -{ - wmWindowManager *wm = CTX_wm_manager(C); - int modifier= 0; - int propvalue = 0; - - /* only modal maps */ - if ((km->flag & KEYMAP_MODAL) == 0) { - BKE_report(reports, RPT_ERROR, "Not a modal keymap."); - return NULL; - } - - if (!km->modal_items) { - if(!WM_keymap_user_init(wm, km)) { - BKE_report(reports, RPT_ERROR, "User defined keymap doesn't correspond to a system keymap."); - return NULL; - } - } - - if (!km->modal_items) { - BKE_report(reports, RPT_ERROR, "No property values defined."); - return NULL; - } - - - if(RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue)==0) { - BKE_report(reports, RPT_WARNING, "Property value not in enumeration."); - } - - if(shift) modifier |= KM_SHIFT; - if(ctrl) modifier |= KM_CTRL; - if(alt) modifier |= KM_ALT; - if(oskey) modifier |= KM_OSKEY; - - if(any) modifier = KM_ANY; - - return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue); -} - static void rna_keymap_restore_item_to_default(wmKeyMap *km, bContext *C, wmKeyMapItem *kmi) { WM_keymap_restore_item_to_default(C, km, kmi); } -static wmKeyMapItem *rna_KeyMap_add_item(wmKeyMap *km, ReportList *reports, char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier) -{ -// wmWindowManager *wm = CTX_wm_manager(C); - int modifier= 0; - - /* only on non-modal maps */ - if (km->flag & KEYMAP_MODAL) { - BKE_report(reports, RPT_ERROR, "Not a non-modal keymap."); - return NULL; - } - - if(shift) modifier |= KM_SHIFT; - if(ctrl) modifier |= KM_CTRL; - if(alt) modifier |= KM_ALT; - if(oskey) modifier |= KM_OSKEY; - - if(any) modifier = KM_ANY; - - return WM_keymap_add_item(km, idname, type, value, modifier, keymodifier); -} - static void rna_Operator_report(wmOperator *op, int type, char *msg) { BKE_report(op->reports, type, msg); @@ -158,7 +94,11 @@ static int rna_event_add_modal_handler(struct bContext *C, struct wmOperator *op #else -static void rna_generic_op_invoke(FunctionRNA *func, int use_event, int use_ret) +#define WM_GEN_INVOKE_EVENT (1<<0) +#define WM_GEN_INVOKE_SIZE (1<<1) +#define WM_GEN_INVOKE_RETURN (1<<2) + +static void rna_generic_op_invoke(FunctionRNA *func, int flag) { PropertyRNA *parm; @@ -166,12 +106,17 @@ static void rna_generic_op_invoke(FunctionRNA *func, int use_event, int use_ret) parm= RNA_def_pointer(func, "operator", "Operator", "", "Operator to call."); RNA_def_property_flag(parm, PROP_REQUIRED); - if(use_event) { + if(flag & WM_GEN_INVOKE_EVENT) { parm= RNA_def_pointer(func, "event", "Event", "", "Event."); RNA_def_property_flag(parm, PROP_REQUIRED); } - if(use_ret) { + if(flag & WM_GEN_INVOKE_SIZE) { + parm= RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup.", 0, INT_MAX); + parm= RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup.", 0, INT_MAX); + } + + if(flag & WM_GEN_INVOKE_RETURN) { parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); RNA_def_property_flag(parm, PROP_ENUM_FLAG); RNA_def_function_return(func, parm); @@ -185,7 +130,7 @@ void RNA_api_wm(StructRNA *srna) func= RNA_def_function(srna, "add_fileselect", "WM_event_add_fileselect"); RNA_def_function_ui_description(func, "Show up the file selector."); - rna_generic_op_invoke(func, 0, 0); + rna_generic_op_invoke(func, 0); func= RNA_def_function(srna, "add_keyconfig", "WM_keyconfig_add_user"); parm= RNA_def_string(func, "name", "", 0, "Name", ""); @@ -206,18 +151,21 @@ void RNA_api_wm(StructRNA *srna) /* invoke functions, for use with python */ func= RNA_def_function(srna, "invoke_props_popup", "WM_operator_props_popup"); RNA_def_function_ui_description(func, "Operator popup invoke."); - rna_generic_op_invoke(func, 1, 1); + rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT|WM_GEN_INVOKE_RETURN); + + /* invoked dialog opens popup with OK button, does not auto-exec operator. */ + func= RNA_def_function(srna, "invoke_props_dialog", "WM_operator_props_dialog_popup"); + RNA_def_function_ui_description(func, "Operator dialog (non-autoexec popup) invoke."); + rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE|WM_GEN_INVOKE_RETURN); /* invoke enum */ func= RNA_def_function(srna, "invoke_search_popup", "rna_Operator_enum_search_invoke"); - rna_generic_op_invoke(func, 0, 0); + rna_generic_op_invoke(func, 0); /* invoke functions, for use with python */ func= RNA_def_function(srna, "invoke_popup", "WM_operator_ui_popup"); RNA_def_function_ui_description(func, "Operator popup invoke."); - rna_generic_op_invoke(func, 0, 0); - parm= RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup.", 0, INT_MAX); - parm= RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup.", 0, INT_MAX); + rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE|WM_GEN_INVOKE_RETURN); } void RNA_api_operator(StructRNA *srna) @@ -343,40 +291,6 @@ void RNA_api_keymap(StructRNA *srna) FunctionRNA *func; PropertyRNA *parm; - func= RNA_def_function(srna, "add_item", "rna_KeyMap_add_item"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm= RNA_def_string(func, "idname", "", 0, "Operator Identifier", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - RNA_def_boolean(func, "any", 0, "Any", ""); - RNA_def_boolean(func, "shift", 0, "Shift", ""); - RNA_def_boolean(func, "ctrl", 0, "Ctrl", ""); - RNA_def_boolean(func, "alt", 0, "Alt", ""); - RNA_def_boolean(func, "oskey", 0, "OS Key", ""); - RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", ""); - parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item."); - RNA_def_function_return(func, parm); - - func= RNA_def_function(srna, "add_modal_item", "rna_KeyMap_add_modal_item"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); - parm= RNA_def_string(func, "propvalue", "", 0, "Property Value", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); - RNA_def_boolean(func, "any", 0, "Any", ""); - RNA_def_boolean(func, "shift", 0, "Shift", ""); - RNA_def_boolean(func, "ctrl", 0, "Ctrl", ""); - RNA_def_boolean(func, "alt", 0, "Alt", ""); - RNA_def_boolean(func, "oskey", 0, "OS Key", ""); - RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", ""); - parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item."); - RNA_def_function_return(func, parm); - func= RNA_def_function(srna, "active", "rna_keymap_active"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Active key map."); diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c index 903b3aa521c..8d5e2291724 100644 --- a/source/blender/makesrna/intern/rna_world.c +++ b/source/blender/makesrna/intern/rna_world.c @@ -26,7 +26,6 @@ #include #include "RNA_define.h" -#include "RNA_types.h" #include "rna_internal.h" @@ -363,9 +362,9 @@ static void rna_def_world_mist(BlenderRNA *brna) RNA_def_struct_nested(brna, srna, "World"); RNA_def_struct_ui_text(srna, "World Mist", "Mist settings for a World data-block"); - prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_mist", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_MIST); - RNA_def_property_ui_text(prop, "Enabled", "Occlude objects with the environment color as they are further away"); + RNA_def_property_ui_text(prop, "Use Mist", "Occlude objects with the environment color as they are further away"); RNA_def_property_update(prop, 0, "rna_World_draw_update"); prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE); @@ -411,10 +410,10 @@ static void rna_def_world_stars(BlenderRNA *brna) RNA_def_struct_nested(brna, srna, "World"); RNA_def_struct_ui_text(srna, "World Stars", "Stars setting for a World data-block"); - prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_stars", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_STARS); - RNA_def_property_ui_text(prop, "Enabled", "Enable starfield generation"); - RNA_def_property_update(prop, 0, "rna_World_update"); + RNA_def_property_ui_text(prop, "Use Stars", "Enable starfield generation"); + RNA_def_property_update(prop, 0, "rna_World_draw_update"); prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "starsize"); @@ -432,7 +431,7 @@ static void rna_def_world_stars(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "stardist"); RNA_def_property_range(prop, 2, 1000); RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars"); - RNA_def_property_update(prop, 0, "rna_World_update"); + RNA_def_property_update(prop, 0, "rna_World_draw_update"); prop= RNA_def_property(srna, "color_randomization", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "starcolnoise"); diff --git a/source/blender/makesrna/rna_cleanup/rna_booleans.txt b/source/blender/makesrna/rna_cleanup/rna_booleans.txt new file mode 100644 index 00000000000..614db736d64 --- /dev/null +++ b/source/blender/makesrna/rna_cleanup/rna_booleans.txt @@ -0,0 +1,1371 @@ +ActionActuator.continue_last_frame -> use_continue_last_frame: boolean Restore last frame when switching on/off, otherwise play from the start each time +ActionGroup.expanded -> show_expanded: boolean Action Group is expanded +ActionGroup.locked -> lock: boolean Action Group is locked +ActionGroup.selected -> select: boolean Action Group is selected +Actuator.expanded -> show_expanded: boolean Set actuator expanded in the user interface +AnimData.nla_enabled -> use_nla: boolean NLA stack is evaluated when evaluating this block +AnimVizMotionPaths.highlight_keyframes -> show_keyframe_highlight: boolean Emphasize position of keyframes on Motion Paths +AnimVizMotionPaths.search_all_action_keyframes -> show_keyframe_action_all: boolean For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower) +AnimVizMotionPaths.show_frame_numbers -> show_frame_numbers: boolean Show frame numbers on Motion Paths +AnimVizMotionPaths.show_keyframe_numbers -> show_keyframe_numbers: boolean Show frame numbers of Keyframes on Motion Paths +AnimVizOnionSkinning.only_selected -> show_only_selected: boolean For Pose-Mode drawing, only draw ghosts for selected bones +Area.show_menus -> show_menus: boolean Show menus in the header +AreaLamp.dither -> use_dither: boolean Use 2x2 dithering for sampling (Constant Jittered sampling) +AreaLamp.jitter -> use_jitter: boolean Use noise for sampling (Constant Jittered sampling) +AreaLamp.only_shadow -> use_only_shadow: boolean Causes light to cast shadows only without illuminating objects +AreaLamp.shadow_layer -> use_shadow_layer: boolean Causes only objects on the same layer to cast shadows +AreaLamp.umbra -> use_umbra: boolean Emphasize parts that are fully shadowed (Constant Jittered sampling) +Armature.auto_ik -> use_auto_ik: boolean Add temporaral IK constraints while grabbing bones in Pose Mode +Armature.deform_envelope -> use_deform_envelopes: boolean Enable Bone Envelopes when defining deform +Armature.deform_quaternion -> use_deform_preserve_volume: boolean Deform rotation interpolation with quaternions +Armature.deform_vertexgroups -> use_deform_vertex_groups: boolean Enable Vertex Groups when defining deform +Armature.delay_deform -> use_deform_delay: boolean Don't deform children when manipulating bones in Pose Mode +Armature.draw_axes -> show_axes: boolean Draw bone axes +Armature.draw_custom_bone_shapes -> show_bone_custom_shapes: boolean Draw bones with their custom shapes +Armature.draw_group_colors -> show_group_colors: boolean Draw bone group colors +Armature.draw_names -> show_names: boolean Draw bone names +Armature.show_ghost_only_selected -> show_only_ghost_selected: boolean +Armature.layer -> layer: boolean Armature layer visibility +Armature.layer_protection -> layer_protected: boolean Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo +Armature.x_axis_mirror -> use_mirror_x: boolean Apply changes to matching bone on opposite side of X-Axis +ArmatureModifier.invert -> invert_vertex_group: boolean Invert vertex group influence +ArmatureModifier.multi_modifier -> use_multi_modifier: boolean Use same input as previous modifier, and mix results using overall vgroup +ArmatureModifier.quaternion -> use_deform_preserve_volume: boolean Deform rotation interpolation with quaternions +ArmatureModifier.use_deform_envelopes -> use_deform_envelopes: boolean +ArmatureModifier.use_deform_vertex_groups -> use_deform_vertex_groups: boolean +ArrayModifier.add_offset_object -> use_object_offset: boolean Add another object's transformation to the total offset +ArrayModifier.constant_offset -> use_constant_offset: boolean Add a constant offset +ArrayModifier.merge_adjacent_vertices -> use_merge_adjacent_vertices: boolean Merge vertices in adjacent duplicates +ArrayModifier.merge_end_vertices -> use_merge_end_vertices: boolean Merge vertices in first and last duplicates +ArrayModifier.relative_offset -> use_relative_offset: boolean Add an offset relative to the object's bounding box +BackgroundImage.show_expanded -> show_expanded: boolean Show the expanded in the user interface +BevelModifier.only_vertices -> use_only_vertices: boolean Bevel verts/corners, not edges +BezierSplinePoint.hidden -> hide: boolean Visibility status +BezierSplinePoint.selected_control_point -> select_control_point: boolean Control point selection status +BezierSplinePoint.selected_handle1 -> select_left_handle: boolean Handle 1 selection status +BezierSplinePoint.selected_handle2 -> select_right_handle: boolean Handle 2 selection status +BoidRule.in_air -> use_in_air: boolean Use rule when boid is flying +BoidRule.on_land -> use_on_land: boolean Use rule when boid is on land +BoidRuleAvoid.predict -> use_predict: boolean Predict target movement +BoidRuleAvoidCollision.boids -> use_avoid: boolean Avoid collision with other boids +BoidRuleAvoidCollision.deflectors -> use_avoid_collision: boolean Avoid collision with deflector objects +BoidRuleFollowLeader.line -> use_line: boolean Follow leader in a line +BoidRuleGoal.predict -> use_predict: boolean Predict target movement +BoidSettings.allow_climb -> use_climb: boolean Allow boids to climb goal objects +BoidSettings.allow_flight -> use_flight: boolean Allow boids to move in air +BoidSettings.allow_land -> use_land: boolean Allow boids to move on land +Bone.connected -> use_connect: boolean, (read-only) When bone has a parent, bone's head is struck to the parent's tail +Bone.cyclic_offset -> use_cyclic_offset: boolean When bone doesn't have a parent, it receives cyclic offset effects +Bone.deform -> use_deform: boolean Bone does not deform any geometry +Bone.draw_wire -> show_wire: boolean Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes +Bone.hidden -> hide: boolean Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes) +Bone.hinge -> use_hinge: boolean Bone inherits rotation or scale from parent bone +Bone.inherit_scale -> use_inherit_scale: boolean Bone inherits scaling from parent bone +Bone.layer -> layer: boolean Layers bone exists in +Bone.local_location -> use_local_location: boolean Bone location is set in local space +Bone.multiply_vertexgroup_with_envelope -> use_envelope_multiply: boolean When deforming bone, multiply effects of Vertex Group weights with Envelope influence +Bone.restrict_select -> restrict_select: boolean Bone is able to be selected +Bone.selected -> select: boolean +BooleanProperty.default -> default: boolean, (read-only) Default value for this number +BooleanProperty.default_array -> default_array: boolean, (read-only) Default value for this array +Brush.use_accumulate -> use_accumulate: boolean Accumulate stroke dabs on top of each other +Brush.use_airbrush -> use_airbrush: boolean Keep applying paint effect while holding mouse (spray) +Brush.use_alpha -> use_alpha: boolean When this is disabled, lock alpha while painting +Brush.use_anchor -> use_anchor: boolean Keep the brush anchored to the initial location +Brush.use_jitter_pressure -> use_pressure_jitter: boolean Enable tablet pressure sensitivity for jitter +Brush.use_persistent -> use_persistent: boolean Sculpts on a persistent layer of the mesh +Brush.use_rake -> use_rake: boolean Rotate the brush texture to match the stroke direction +Brush.use_size_pressure -> use_pressure_size: boolean Enable tablet pressure sensitivity for size +Brush.use_smooth_stroke -> use_smooth_stroke: boolean Brush lags behind mouse and follows a smoother path +Brush.use_space -> use_space: boolean Limit brush application to the distance specified by spacing +Brush.use_spacing_pressure -> use_pressure_spacing: boolean Enable tablet pressure sensitivity for spacing +Brush.use_strength_pressure -> use_pressure_strength: boolean Enable tablet pressure sensitivity for strength +Brush.use_wrap -> use_wrap: boolean Enable torus wrapping while painting +BuildModifier.randomize -> use_random_order: boolean Randomize the faces or edges during build +Camera.panorama -> use_panorama: boolean Render the scene with a cylindrical camera for pseudo-fisheye lens effects +Camera.show_limits -> show_limits: boolean Draw the clipping range and focus point on the camera +Camera.show_mist -> show_mist: boolean Draw a line from the Camera to indicate the mist area +Camera.show_name -> show_name: boolean Show the active Camera's name in Camera view +Camera.show_passepartout -> show_passepartout: boolean Show a darkened overlay outside the image area in Camera view +Camera.show_title_safe -> show_title_safe: boolean Show indicators for the title safe zone in Camera view +CastModifier.from_radius -> use_radius_as_size: boolean Use radius as size of projection shape (0 = auto) +CastModifier.use_transform -> use_transform: boolean Use object transform to control projection shape +CastModifier.x -> use_x: boolean +CastModifier.y -> use_y: boolean +CastModifier.z -> use_z: boolean +ChildOfConstraint.use_location_x -> use_location_x: boolean Use X Location of Parent +ChildOfConstraint.use_location_y -> use_location_y: boolean Use Y Location of Parent +ChildOfConstraint.use_location_z -> use_location_z: boolean Use Z Location of Parent +ChildOfConstraint.use_rotation_x -> use_rotation_x: boolean Use X Rotation of Parent +ChildOfConstraint.use_rotation_y -> use_rotation_y: boolean Use Y Rotation of Parent +ChildOfConstraint.use_rotation_z -> use_rotation_z: boolean Use Z Rotation of Parent +ChildOfConstraint.use_scale_x -> use_scale_x: boolean Use X Scale of Parent +ChildOfConstraint.use_scale_y -> use_scale_y: boolean Use Y Scale of Parent +ChildOfConstraint.use_scale_z -> use_scale_z: boolean Use Z Scale of Parent +ClampToConstraint.cyclic -> use_cyclic: boolean Treat curve as cyclic curve (no clamping to curve bounding box +ClothCollisionSettings.enable_collision -> use_collision: boolean Enable collisions with other objects +ClothCollisionSettings.enable_self_collision -> use_self_collision: boolean Enable self collisions +ClothSettings.pin_cloth -> use_pin_cloth: boolean Enable pinning of cloth vertices to other objects/positions +ClothSettings.stiffness_scaling -> use_stiffness_scale: boolean If enabled, stiffness can be scaled along a weight painted vertex group +CollisionSensor.collision_type -> use_material: boolean Use material instead of property +CollisionSensor.pulse -> use_pulse: boolean Changes to the set of colliding objects generates pulse +CollisionSettings.enabled -> use: boolean Enable this objects as a collider for physics systems +CollisionSettings.kill_particles -> use_particle_kill: boolean Kill colliding particles +CompositorNodeAlphaOver.convert_premul -> use_premultiply: boolean +CompositorNodeBlur.bokeh -> use_bokeh: boolean +CompositorNodeBlur.gamma -> use_gamma_correction: boolean +CompositorNodeBlur.relative -> use_relative: boolean +CompositorNodeColorSpill.unspill -> use_unspill: boolean Compensate all channels (diffenrently) by hand +CompositorNodeCrop.crop_size -> use_crop_size: boolean Whether to crop the size of the input image +CompositorNodeDBlur.wrap -> use_wrap: boolean +CompositorNodeDefocus.gamma_correction -> use_gamma_correction: boolean Enable gamma correction before and after main process +CompositorNodeDefocus.preview -> use_preview: boolean Enable sampling mode, useful for preview when using low samplecounts +CompositorNodeDefocus.use_zbuffer -> use_zbuffer: boolean Disable when using an image as input instead of actual zbuffer (auto enabled if node not image based, eg. time node) +CompositorNodeGlare.rotate_45 -> use_rotate_45: boolean Simple star filter: add 45 degree rotation offset +CompositorNodeImage.auto_refresh -> use_auto_refresh: boolean +CompositorNodeImage.cyclic -> use_cyclic: boolean +CompositorNodeInvert.alpha -> invert_alpha: boolean +CompositorNodeInvert.rgb -> invert_rgb: boolean +CompositorNodeLensdist.fit -> use_fit: boolean For positive distortion factor only: scale image such that black areas are not visible +CompositorNodeLensdist.jitter -> use_jitter: boolean Enable/disable jittering; faster, but also noisier +CompositorNodeLensdist.projector -> use_projector: boolean Enable/disable projector mode. Effect is applied in horizontal direction only +CompositorNodeMapValue.use_max -> use_max: boolean +CompositorNodeMapValue.use_min -> use_min: boolean +CompositorNodeMixRGB.alpha -> use_alpha: boolean Include alpha of second input in this operation +CompositorNodeOutputFile.exr_half -> use_exr_half: boolean +CompositorNodeVecBlur.curved -> use_curved: boolean Interpolate between frames in a bezier curve, rather than linearly +Constraint.active -> active: boolean Constraint is the one being edited +Constraint.disabled -> is_valid: boolean, (read-only) Constraint has invalid settings and will not be evaluated +Constraint.expanded -> show_expanded: boolean Constraint's panel is expanded in UI +Constraint.proxy_local -> is_proxy_local: boolean Constraint was added in this proxy instance (i.e. did not belong to source Armature) +ConstraintActuator.detect_material -> use_material_detect: boolean Detect material instead of property +ConstraintActuator.fh_normal -> use_fh_normal: boolean Add a horizontal spring force on slopes +ConstraintActuator.fh_paralel_axis -> use_fh_paralel_axis: boolean Keep object axis parallel to normal +ConstraintActuator.force_distance -> use_force_distance: boolean Force distance of object to point of impact of ray +ConstraintActuator.local -> use_local: boolean Set ray along object's axis or global axis +ConstraintActuator.normal -> use_normal: boolean Set object axis along (local axis) or parallel (global axis) to the normal at hit position +ConstraintActuator.persistent -> use_persistent: boolean Persistent actuator: stays active even if ray does not reach target +ControlFluidSettings.active -> use: boolean Object contributes to the fluid simulation +ControlFluidSettings.reverse_frames -> use_reverse_frames: boolean Reverse control object movement +Controller.expanded -> show_expanded: boolean Set controller expanded in the user interface +Controller.priority -> use_priority: boolean Mark controller for execution before all non-marked controllers (good for startup scripts) +Controller.state -> state: boolean, (read-only) Set Controller state index (1 to 30) +CopyLocationConstraint.invert_x -> invert_x: boolean Invert the X location +CopyLocationConstraint.invert_y -> invert_y: boolean Invert the Y location +CopyLocationConstraint.invert_z -> invert_z: boolean Invert the Z location +CopyLocationConstraint.use_offset -> use_offset: boolean Add original location into copied location +CopyLocationConstraint.use_x -> use_x: boolean Copy the target's X location +CopyLocationConstraint.use_y -> use_y: boolean Copy the target's Y location +CopyLocationConstraint.use_z -> use_z: boolean Copy the target's Z location +CopyRotationConstraint.invert_x -> invert_x: boolean Invert the X rotation +CopyRotationConstraint.invert_y -> invert_y: boolean Invert the Y rotation +CopyRotationConstraint.invert_z -> invert_z: boolean Invert the Z rotation +CopyRotationConstraint.use_offset -> use_offset: boolean Add original rotation into copied rotation +CopyRotationConstraint.use_x -> use_x: boolean Copy the target's X rotation +CopyRotationConstraint.use_y -> use_y: boolean Copy the target's Y rotation +CopyRotationConstraint.use_z -> use_z: boolean Copy the target's Z rotation +CopyScaleConstraint.use_offset -> use_offset: boolean Add original scale into copied scale +CopyScaleConstraint.use_x -> use_x: boolean Copy the target's X scale +CopyScaleConstraint.use_y -> use_y: boolean Copy the target's Y scale +CopyScaleConstraint.use_z -> use_z: boolean Copy the target's Z scale +Curve.auto_texspace -> use_auto_texspace: boolean Adjusts active object's texture space automatically when transforming object +Curve.back -> use_fill_back: boolean Draw filled back for extruded/beveled curves +Curve.draw_handles -> show_handles: boolean Display bezier handles in editmode +Curve.draw_normals -> show_normals: boolean Display 3D curve normals in editmode +Curve.front -> use_fill_front: boolean Draw filled front for extruded/beveled curves +Curve.map_along_length -> use_map_along_length: boolean Generate texture mapping coordinates following the curve direction, rather than the local bounding box +Curve.use_deform_fill -> use_fill_deform: boolean Fill curve after applying deformation +Curve.use_path -> use_path: boolean Enable the curve to become a translation path +Curve.use_path_follow -> use_path_follow: boolean Make curve path children to rotate along the path +Curve.use_radius -> use_radius: boolean Option for paths: apply the curve radius with path following it and deforming +Curve.use_stretch -> use_stretch: boolean Option for curve-deform: makes deformed child to stretch along entire path +Curve.use_time_offset -> use_time_offset: boolean Children will use Time Offset value as path distance offset +CurveMapPoint.selected -> select: boolean Selection state of the curve point +CurveMapping.clip -> use_clip: boolean Force the curve view to fit a defined boundary +DelaySensor.repeat -> use_repeat: boolean Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics +DomainFluidSettings.generate_speed_vectors -> use_speed_vectors: boolean Generate speed vectors for vector blur +DomainFluidSettings.override_time -> use_time_override: boolean Use a custom start and end time (in seconds) instead of the scene's timeline +DomainFluidSettings.reverse_frames -> use_reverse_frames: boolean Reverse fluid frames +NEGATE * DopeSheet.collapse_summary -> show_expanded_summary: boolean Collapse summary when shown, so all other channels get hidden. (DopeSheet Editors Only) +DopeSheet.display_armature -> show_armatures: boolean Include visualization of Armature related Animation data +DopeSheet.display_camera -> show_cameras: boolean Include visualization of Camera related Animation data +DopeSheet.display_curve -> show_curves: boolean Include visualization of Curve related Animation data +DopeSheet.display_lamp -> show_lamps: boolean Include visualization of Lamp related Animation data +DopeSheet.display_material -> show_materials: boolean Include visualization of Material related Animation data +DopeSheet.display_mesh -> show_meshes: boolean Include visualization of Mesh related Animation data +DopeSheet.display_metaball -> show_metaballs: boolean Include visualization of Metaball related Animation data +DopeSheet.display_node -> show_nodes: boolean Include visualization of Node related Animation data +DopeSheet.display_particle -> show_particles: boolean Include visualization of Particle related Animation data +DopeSheet.display_scene -> show_scenes: boolean Include visualization of Scene related Animation data +DopeSheet.display_shapekeys -> show_shapekeys: boolean Include visualization of ShapeKey related Animation data +DopeSheet.display_summary -> show_summary: boolean Display an additional 'summary' line. (DopeSheet Editors only) +DopeSheet.display_texture -> show_textures: boolean Include visualization of Texture related Animation data +DopeSheet.display_transforms -> show_transforms: boolean Include visualization of Object-level Animation data (mostly Transforms) +DopeSheet.display_world -> show_worlds: boolean Include visualization of World related Animation data +DopeSheet.include_missing_nla -> show_missing_nla: boolean Include Animation Data blocks with no NLA data. (NLA Editor only) +DopeSheet.only_group_objects -> show_only_group_objects: boolean Only include channels from Objects in the specified Group +DopeSheet.only_selected -> show_only_selected: boolean Only include channels relating to selected objects and data +Driver.invalid -> is_valid: boolean Driver could not be evaluated in past, so should be skipped +Driver.show_debug_info -> show_debug_info: boolean Show intermediate values for the driver calculations to allow debugging of drivers +DriverTarget.use_local_space_transforms -> use_local_space_transform: boolean Use transforms in Local Space (as opposed to the worldspace default) +EdgeSplitModifier.use_edge_angle -> use_edge_angle: boolean Split edges with high angle between faces +EdgeSplitModifier.use_sharp -> use_edge_sharp: boolean Split edges that are marked as sharp +EditBone.connected -> use_connect: boolean When bone has a parent, bone's head is struck to the parent's tail +EditBone.cyclic_offset -> use_cyclic_offset: boolean When bone doesn't have a parent, it receives cyclic offset effects +EditBone.deform -> use_deform: boolean Bone does not deform any geometry +EditBone.draw_wire -> show_wire: boolean Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes +EditBone.hidden -> hide: boolean Bone is not visible when in Edit Mode +EditBone.hinge -> use_hinge: boolean Bone inherits rotation or scale from parent bone +EditBone.inherit_scale -> use_inherit_scale: boolean Bone inherits scaling from parent bone +EditBone.layer -> layer: boolean Layers bone exists in +EditBone.local_location -> use_local_location: boolean Bone location is set in local space +EditBone.locked -> lock: boolean Bone is not able to be transformed when in Edit Mode +EditBone.multiply_vertexgroup_with_envelope -> use_envelope_multiply: boolean When deforming bone, multiply effects of Vertex Group weights with Envelope influence +EditBone.restrict_select -> restrict_select: boolean Bone is able to be selected +EditBone.selected -> select: boolean +EditBone.selected_head -> select_head: boolean +EditBone.selected_tail -> select_tail: boolean +EditObjectActuator.enable_3d_tracking -> use_3d_tracking: boolean Enable 3D tracking +EditObjectActuator.local_angular_velocity -> use_local_angular_velocity: boolean Apply the rotation locally +EditObjectActuator.local_linear_velocity -> use_local_linear_velocity: boolean Apply the transformation locally +EditObjectActuator.replace_display_mesh -> use_replace_display_mesh: boolean Replace the display mesh +EditObjectActuator.replace_physics_mesh -> use_replace_physics_mesh: boolean Replace the physics mesh (triangle bounds only - compound shapes not supported) +EffectSequence.convert_float -> use_float: boolean Convert input to float data +EffectSequence.de_interlace -> use_deinterlace: boolean For video movies to remove fields +EffectSequence.flip_x -> use_flip_x: boolean Flip on the X axis +EffectSequence.flip_y -> use_flip_y: boolean Flip on the Y axis +EffectSequence.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +EffectSequence.proxy_custom_directory -> use_proxy_custom_directory: boolean Use a custom directory to store data +EffectSequence.proxy_custom_file -> use_proxy_custom_file: boolean Use a custom file to read proxy data from +EffectSequence.reverse_frames -> use_reverse_frames: boolean Reverse frame order +EffectSequence.use_color_balance -> use_color_balance: boolean (3-Way color correction) on input +EffectSequence.use_crop -> use_crop: boolean Crop image before processing +EffectSequence.use_proxy -> use_proxy: boolean Use a preview proxy for this strip +EffectSequence.use_translation -> use_translation: boolean Translate image before processing +EffectorWeights.do_growing_hair -> apply_to_hair_growing: boolean Use force fields when growing hair +EnvironmentMap.ignore_layers -> layer_ignore: boolean Hide objects on these layers when generating the Environment Map +EnvironmentMapTexture.use_filter_size_min -> filter_size_min: boolean Use Filter Size as a minimal filter value in pixels +EnvironmentMapTexture.mipmap -> use_mipmap: boolean Uses auto-generated MIP maps for the image +EnvironmentMapTexture.mipmap_gauss -> use_mipmap_gauss: boolean Uses Gauss filter to sample down MIP maps +Event.alt -> alt: boolean, (read-only) True when the Alt/Option key is held +Event.ctrl -> ctrl: boolean, (read-only) True when the Ctrl key is held +Event.oskey -> oskey: boolean, (read-only) True when the Cmd key is held +Event.shift -> shift: boolean, (read-only) True when the Shift key is held +ExplodeModifier.alive -> show_alive: boolean Show mesh when particles are alive +ExplodeModifier.dead -> show_dead: boolean Show mesh when particles are dead +ExplodeModifier.size -> use_size: boolean Use particle size for the shrapnel +ExplodeModifier.split_edges -> use_edge_split: boolean Split face edges for nicer shrapnel +ExplodeModifier.unborn -> show_unborn: boolean Show mesh when particles are unborn +FCurve.auto_clamped_handles -> use_auto_handle_clamp: boolean All auto-handles for F-Curve are clamped +NEGATE * FCurve.disabled -> enabled: boolean F-Curve could not be evaluated in past, so should be skipped when evaluating +FCurve.locked -> lock: boolean F-Curve's settings cannot be edited +FCurve.muted -> mute: boolean F-Curve is not evaluated +FCurve.selected -> select: boolean F-Curve is selected for editing +NEGATE * FCurve.visible -> hide: boolean F-Curve and its keyframes are shown in the Graph Editor graphs +FCurveSample.selected -> select: boolean Selection status +FModifier.active -> active: boolean F-Curve Modifier is the one being edited +NEGATE * FModifier.disabled -> enabled: boolean, (read-only) F-Curve Modifier has invalid settings and will not be evaluated +FModifier.expanded -> show_expanded: boolean F-Curve Modifier's panel is expanded in UI +FModifier.muted -> mute: boolean F-Curve Modifier will not be evaluated +FModifierFunctionGenerator.additive -> use_additive: boolean Values generated by this modifier are applied on top of the existing values instead of overwriting them +FModifierGenerator.additive -> use_additive: boolean Values generated by this modifier are applied on top of the existing values instead of overwriting them +FModifierLimits.use_maximum_x -> use_max_x: boolean Use the maximum X value +FModifierLimits.use_maximum_y -> use_max_y: boolean Use the maximum Y value +FModifierLimits.use_minimum_x -> use_min_x: boolean Use the minimum X value +FModifierLimits.use_minimum_y -> use_min_y: boolean Use the minimum Y value +FModifierStepped.use_frame_end -> use_frame_end: boolean Restrict modifier to only act before its 'end' frame +FModifierStepped.use_frame_start -> use_frame_start: boolean Restrict modifier to only act after its 'start' frame +FcurveActuator.add -> use_add: boolean F-Curve is added to the current loc/rot/scale in global or local coordinate according to Local flag +FcurveActuator.child -> apply_to_children: boolean Update F-Curve on all children Objects as well +FcurveActuator.force -> use_force: boolean Apply F-Curve as a global or local force depending on the local option (dynamic objects only) +FcurveActuator.local -> use_local: boolean Let the F-Curve act in local coordinates, used in Force and Add mode +FieldSettings.do_absorption -> use_absorption: boolean Force gets absorbed by collision objects +FieldSettings.do_location -> apply_to_location: boolean Effect particles' location +FieldSettings.do_rotation -> apply_to_rotation: boolean Effect particles' dynamic rotation +FieldSettings.force_2d -> use_2d_force: boolean Apply force only in 2d +FieldSettings.global_coordinates -> use_global_coordinates: boolean Use effector/global coordinates for turbulence +FieldSettings.guide_path_add -> use_guide_path_add: boolean Based on distance/falloff it adds a portion of the entire path +FieldSettings.multiple_springs -> use_multiple_springs: boolean Every point is effected by multiple springs +FieldSettings.root_coordinates -> use_root_coordinates: boolean Texture coordinates from root particle locations +FieldSettings.use_coordinates -> use_object_coordinates: boolean Use object/global coordinates for texture +FieldSettings.use_guide_path_weight -> use_guide_path_weight: boolean Use curve weights to influence the particle influence along the curve +FieldSettings.use_max_distance -> use_max_distance: boolean Use a maximum distance for the field to work +FieldSettings.use_min_distance -> use_min_distance: boolean Use a minimum distance for the field's fall-off +FieldSettings.use_radial_max -> use_radial_max: boolean Use a maximum radial distance for the field to work +FieldSettings.use_radial_min -> use_radial_min: boolean Use a minimum radial distance for the field's fall-off +FileSelectParams.do_filter -> use_filter: boolean Enable filtering of files +FileSelectParams.filter_blender -> use_filter_blender: boolean Show .blend files +FileSelectParams.filter_folder -> use_filter_folder: boolean Show folders +FileSelectParams.filter_font -> use_filter_font: boolean Show font files +FileSelectParams.filter_image -> use_filter_image: boolean Show image files +FileSelectParams.filter_movie -> use_filter_movie: boolean Show movie files +FileSelectParams.filter_script -> use_filter_script: boolean Show script files +FileSelectParams.filter_sound -> use_filter_sound: boolean Show sound files +FileSelectParams.filter_text -> use_filter_text: boolean Show text files +NEGATE * FileSelectParams.hide_dot -> show_hidden: boolean Hide hidden dot files +Filter2DActuator.enable_motion_blur -> use_motion_blur: boolean Enable/Disable Motion Blur +FloorConstraint.sticky -> use_sticky: boolean Immobilize object while constrained +FloorConstraint.use_rotation -> use_rotation: boolean Use the target's rotation to determine floor +FluidFluidSettings.active -> use: boolean Object contributes to the fluid simulation +FluidFluidSettings.export_animated_mesh -> use_animated_mesh: boolean Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it +FollowPathConstraint.use_curve_follow -> use_curve_follow: boolean Object will follow the heading and banking of the curve +FollowPathConstraint.use_curve_radius -> use_curve_radius: boolean Objects scale by the curve radius +FollowPathConstraint.use_fixed_position -> use_fixed_location: boolean Object will stay locked to a single point somewhere along the length of the curve regardless of time +Function.registered -> is_registered: boolean, (read-only) Function is registered as callback as part of type registration +Function.registered_optional -> is_registered_optional: boolean, (read-only) Function is optionally registered as callback part of type registration +GPencilFrame.paint_lock -> is_edited: boolean Frame is being edited (painted on) +GPencilFrame.selected -> select: boolean Frame is selected for editing in the DopeSheet +GPencilLayer.active -> active: boolean Set active layer for editing +GPencilLayer.frame_lock -> lock_frame: boolean Lock current frame displayed by layer +GPencilLayer.hide -> hide: boolean Set layer Visibility +GPencilLayer.locked -> lock: boolean Protect layer from further editing and/or frame changes +GPencilLayer.selected -> select: boolean Layer is selected for editing in the DopeSheet +GPencilLayer.show_points -> show_points: boolean Draw the points which make up the strokes (for debugging purposes) +GPencilLayer.use_onion_skinning -> use_onion_skinning: boolean Ghost frames on either side of frame +GameBooleanProperty.value -> value: boolean Property value +GameObjectSettings.actor -> use_actor: boolean Object is detected by the Near and Radar sensor +GameObjectSettings.all_states -> use_all_states: boolean Set all state bits +GameObjectSettings.anisotropic_friction -> use_anisotropic_friction: boolean Enable anisotropic friction +GameObjectSettings.collision_compound -> use_collision_compound: boolean Add children to form a compound collision object +GameObjectSettings.debug_state -> show_debug_state: boolean Print state debug info in the game engine +GameObjectSettings.ghost -> use_ghost: boolean Object does not restitute collisions, like a ghost +GameObjectSettings.initial_state -> state_initial: boolean Initial state when the game starts +GameObjectSettings.lock_x_axis -> lock_location_x: boolean Disable simulation of linear motion along the X axis +GameObjectSettings.lock_x_rot_axis -> lock_rotation_x: boolean Disable simulation of angular motion along the X axis +GameObjectSettings.lock_y_axis -> lock_location_y: boolean Disable simulation of linear motion along the Y axis +GameObjectSettings.lock_y_rot_axis -> lock_rotation_y: boolean Disable simulation of angular motion along the Y axis +GameObjectSettings.lock_z_axis -> lock_location_z: boolean Disable simulation of linear motion along the Z axis +GameObjectSettings.lock_z_rot_axis -> lock_rotation_z: boolean Disable simulation of angular motion along the Z axis +GameObjectSettings.material_physics -> use_material_physics: boolean Use physics settings in materials +NEGATE * GameObjectSettings.no_sleeping -> use_sleep: boolean Disable auto (de)activation in physics simulation +GameObjectSettings.rotate_from_normal -> use_rotate_from_normal: boolean Use face normal to rotate object, so that it points away from the surface +GameObjectSettings.show_actuators -> show_actuators: boolean Shows actuators for this object in the user interface +GameObjectSettings.show_controllers -> show_controllers: boolean Shows controllers for this object in the user interface +GameObjectSettings.show_sensors -> show_sensors: boolean Shows sensors for this object in the user interface +GameObjectSettings.show_state_panel -> show_state_panel: boolean Show state panel +GameObjectSettings.use_activity_culling -> use_activity_culling: boolean Disable simulation of angular motion along the Z axis +GameObjectSettings.use_collision_bounds -> use_collision_bounds: boolean Specify a collision bounds type other than the default +GameObjectSettings.used_state -> state_used: boolean, (read-only) States which are being used by controllers +GameObjectSettings.visible_state -> state_visible: boolean State determining which controllers are displayed +GameProperty.debug -> show_debug: boolean Print debug information for this property +GameSoftBodySettings.bending_const -> use_bending_constraints: boolean Enable bending constraints +GameSoftBodySettings.cluster_rigid_to_softbody -> use_cluster_rigid_to_softbody: boolean Enable cluster collision between soft and rigid body +GameSoftBodySettings.cluster_soft_to_softbody -> use_cluster_soft_to_softbody: boolean Enable cluster collision between soft and soft body +GameSoftBodySettings.shape_match -> use_shape_match: boolean Enable soft body shape matching goal +GlowSequence.only_boost -> use_only_boost: boolean Show the glow buffer only +GreasePencil.use_stroke_endpoints -> use_stroke_endpoints: boolean Only use the first and last parts of the stroke for snapping +Group.layer -> layer: boolean Layers visible when this groups is instanced as a dupli +ID.fake_user -> use_fake_user: boolean Saves this datablock even if it has no users +ID.tag -> tag: boolean Tools can use this to tag data, (initial state is undefined) +Image.animated -> use_animation: boolean Use as animated texture in the game engine +Image.clamp_x -> use_clamp_x: boolean Disable texture repeating horizontally +Image.clamp_y -> use_clamp_y: boolean Disable texture repeating vertically +Image.dirty -> is_dirty: boolean, (read-only) Image has changed and is not saved +Image.fields -> use_fields: boolean Use fields of the image +Image.has_data -> has_data: boolean, (read-only) True if this image has data +Image.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +Image.tiles -> use_tiles: boolean Use of tilemode for faces (default shift-LMB to pick the tile for selected faces) +ImagePaint.invert_stencil -> invert_stencil: boolean Invert the stencil layer +ImagePaint.show_brush -> show_brush: boolean Enables brush shape while not drawing +ImagePaint.show_brush_draw -> show_brush_draw: boolean Enables brush shape while drawing +ImagePaint.use_backface_cull -> use_backface_culling: boolean Ignore faces pointing away from the view (faster) +ImagePaint.use_clone_layer -> use_clone_layer: boolean Use another UV layer as clone source, otherwise use 3D the cursor as the source +ImagePaint.use_normal_falloff -> use_normal_falloff: boolean Paint most on faces pointing towards the view +ImagePaint.use_occlude -> use_occlude: boolean Only paint onto the faces directly under the brush (slower) +ImagePaint.use_projection -> use_projection: boolean Use projection painting for improved consistency in the brush strokes +ImagePaint.use_stencil_layer -> use_stencil_layer: boolean Set the mask layer from the UV layer buttons +ImageSequence.convert_float -> use_float: boolean Convert input to float data +ImageSequence.de_interlace -> use_deinterlace: boolean For video movies to remove fields +ImageSequence.flip_x -> use_flip_x: boolean Flip on the X axis +ImageSequence.flip_y -> use_flip_y: boolean Flip on the Y axis +ImageSequence.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +ImageSequence.proxy_custom_directory -> use_proxy_custom_directory: boolean Use a custom directory to store data +ImageSequence.proxy_custom_file -> use_proxy_custom_file: boolean Use a custom file to read proxy data from +ImageSequence.reverse_frames -> use_reverse_frames: boolean Reverse frame order +ImageSequence.use_color_balance -> use_color_balance: boolean (3-Way color correction) on input +ImageSequence.use_crop -> use_crop: boolean Crop image before processing +ImageSequence.use_proxy -> use_proxy: boolean Use a preview proxy for this strip +ImageSequence.use_translation -> use_translation: boolean Translate image before processing +ImageTexture.calculate_alpha -> use_calculate_alpha: boolean Calculates an alpha channel based on RGB values in the image +ImageTexture.checker_even -> use_checker_even: boolean Sets even checker tiles +ImageTexture.checker_odd -> use_checker_odd: boolean Sets odd checker tiles +ImageTexture.filter_size_minimum -> use_minimum_filter_size: boolean Use Filter Size as a minimal filter value in pixels +ImageTexture.flip_axis -> use_flip_axis: boolean Flips the texture's X and Y axis +ImageTexture.interpolation -> use_interpolation: boolean Interpolates pixels using Area filter +ImageTexture.invert_alpha -> invert_alpha: boolean Inverts all the alpha values in the image +ImageTexture.mipmap -> use_mipmap: boolean Uses auto-generated MIP maps for the image +ImageTexture.mipmap_gauss -> use_mipmap_gauss: boolean Uses Gauss filter to sample down MIP maps +ImageTexture.mirror_x -> use_mirror_x: boolean Mirrors the image repetition on the X direction +ImageTexture.mirror_y -> use_mirror_y: boolean Mirrors the image repetition on the Y direction +ImageTexture.normal_map -> use_normal_map: boolean Uses image RGB values for normal mapping +ImageTexture.use_alpha -> use_alpha: boolean Uses the alpha channel information in the image +ImageUser.auto_refresh -> use_auto_refresh: boolean Always refresh image on frame changes +ImageUser.cyclic -> use_cyclic: boolean Cycle the images in the movie +InflowFluidSettings.active -> use: boolean Object contributes to the fluid simulation +InflowFluidSettings.export_animated_mesh -> use_animated_mesh: boolean Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it +InflowFluidSettings.local_coordinates -> use_local_coordinates: boolean Use local coordinates for inflow. (e.g. for rotating objects) +Itasc.auto_step -> use_auto_step: boolean Automatically determine the optimal number of steps for best performance/accuracy trade off +JoystickSensor.all_events -> use_all_events: boolean Triggered by all events on this joysticks current type (axis/button/hat) +Key.relative -> use_relative: boolean Makes shape keys relative +KeyConfig.user_defined -> is_user_defined: boolean, (read-only) Indicates that a keyconfig was defined by the user +KeyMap.children_expanded -> show_expanded_children: boolean Children expanded in the user interface +KeyMap.items_expanded -> show_expanded_items: boolean Expanded in the user interface +KeyMap.modal -> is_modal: boolean, (read-only) Indicates that a keymap is used for translate modal events for an operator +KeyMap.user_defined -> is_user_defined: boolean Keymap is defined by the user +KeyMapItem.active -> active: boolean Activate or deactivate item +KeyMapItem.alt -> alt: boolean Alt key pressed +KeyMapItem.any -> any: boolean Any modifier keys pressed +KeyMapItem.ctrl -> ctrl: boolean Control key pressed +KeyMapItem.expanded -> show_expanded: boolean Show key map event and property details in the user interface +KeyMapItem.oskey -> oskey: boolean Operating system key pressed +KeyMapItem.shift -> shift: boolean Shift key pressed +KeyboardSensor.all_keys -> use_all_keys: boolean Trigger this sensor on any keystroke +Keyframe.selected -> select: boolean Control point selection status +Keyframe.selected_handle1 -> select_left_handle: boolean Handle 1 selection status +Keyframe.selected_handle2 -> select_right_handle: boolean Handle 2 selection status +KeyingSet.absolute -> use_absolute: boolean Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info) +KeyingSet.insertkey_needed -> use_insertkey_needed: boolean Only insert keyframes where they're needed in the relevant F-Curves +KeyingSet.insertkey_visual -> use_insertkey_visual: boolean Insert keyframes based on 'visual transforms' +KeyingSet.insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis +KeyingSetInfo.insertkey_needed -> use_insertkey_needed: boolean Only insert keyframes where they're needed in the relevant F-Curves +KeyingSetInfo.insertkey_visual -> use_insertkey_visual: boolean Insert keyframes based on 'visual transforms' +KeyingSetInfo.insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis +KeyingSetPath.entire_array -> use_entire_array: boolean When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used +KeyingSetPath.insertkey_needed -> use_insertkey_needed: boolean Only insert keyframes where they're needed in the relevant F-Curves +KeyingSetPath.insertkey_visual -> use_insertkey_visual: boolean Insert keyframes based on 'visual transforms' +KeyingSetPath.insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis +KinematicConstraint.pos_lock_x -> lock_location_x: boolean Constraint position along X axis +KinematicConstraint.pos_lock_y -> lock_location_y: boolean Constraint position along Y axis +KinematicConstraint.pos_lock_z -> lock_location_z: boolean Constraint position along Z axis +KinematicConstraint.rot_lock_x -> lock_rotation_x: boolean Constraint rotation along X axis +KinematicConstraint.rot_lock_y -> lock_rotation_y: boolean Constraint rotation along Y axis +KinematicConstraint.rot_lock_z -> lock_rotation_z: boolean Constraint rotation along Z axis +KinematicConstraint.use_position -> use_location: boolean Chain follows position of target +KinematicConstraint.use_rotation -> use_rotation: boolean Chain follows rotation of target +KinematicConstraint.use_stretch -> use_stretch: boolean Enable IK Stretching +KinematicConstraint.use_tail -> use_tail: boolean Include bone's tail as last element in chain +KinematicConstraint.use_target -> use_target: boolean Disable for targetless IK +Lamp.diffuse -> use_diffuse: boolean Lamp does diffuse shading +Lamp.layer -> use_own_layer: boolean Illuminates objects only on the same layer the lamp is on +Lamp.negative -> use_negative: boolean Lamp casts negative light +Lamp.specular -> use_specular: boolean Lamp creates specular highlights +LampSkySettings.use_atmosphere -> use_atmosphere: boolean Apply sun effect on atmosphere +LampSkySettings.use_sky -> use_sky: boolean Apply sun effect on sky +LampTextureSlot.map_color -> use_map_color: boolean Lets the texture affect the basic color of the lamp +LampTextureSlot.map_shadow -> use_map_shadow: boolean Lets the texture affect the shadow color of the lamp +Lattice.outside -> use_outside: boolean Only draw, and take into account, the outer vertices +LimitLocationConstraint.limit_transform -> limit_transform: boolean Transforms are affected by this constraint as well +LimitLocationConstraint.use_maximum_x -> use_max_x: boolean Use the maximum X value +LimitLocationConstraint.use_maximum_y -> use_max_y: boolean Use the maximum Y value +LimitLocationConstraint.use_maximum_z -> use_max_z: boolean Use the maximum Z value +LimitLocationConstraint.use_minimum_x -> use_min_x: boolean Use the minimum X value +LimitLocationConstraint.use_minimum_y -> use_min_y: boolean Use the minimum Y value +LimitLocationConstraint.use_minimum_z -> use_min_z: boolean Use the minimum Z value +LimitRotationConstraint.limit_transform -> limit_transform: boolean Transforms are affected by this constraint as well +LimitRotationConstraint.use_limit_x -> use_limit_x: boolean Use the minimum X value +LimitRotationConstraint.use_limit_y -> use_limit_y: boolean Use the minimum Y value +LimitRotationConstraint.use_limit_z -> use_limit_z: boolean Use the minimum Z value +LimitScaleConstraint.limit_transform -> limit_transform: boolean Transforms are affected by this constraint as well +LimitScaleConstraint.use_maximum_x -> use_max_x: boolean Use the maximum X value +LimitScaleConstraint.use_maximum_y -> use_max_y: boolean Use the maximum Y value +LimitScaleConstraint.use_maximum_z -> use_max_z: boolean Use the maximum Z value +LimitScaleConstraint.use_minimum_x -> use_min_x: boolean Use the minimum X value +LimitScaleConstraint.use_minimum_y -> use_min_y: boolean Use the minimum Y value +LimitScaleConstraint.use_minimum_z -> use_min_z: boolean Use the minimum Z value +Main.debug -> show_debug: boolean Print debugging information in console +Main.file_is_saved -> is_saved: boolean, (read-only) Has the current session been saved to disk as a .blend file +MaskModifier.invert -> invert_vertex_group: boolean Use vertices that are not part of region defined +Material.cast_approximate -> use_cast_approximate: boolean Allow this material to cast shadows when using approximate ambient occlusion. +Material.cast_buffer_shadows -> use_cast_buffer_shadows: boolean Allow this material to cast shadows from shadow buffer lamps +Material.cast_shadows_only -> use_cast_shadows_only: boolean Makes objects with this material appear invisible, only casting shadows (not rendered) +Material.cubic -> use_cubic: boolean Use cubic interpolation for diffuse values, for smoother transitions +NEGATE * Material.exclude_mist -> use_mist: boolean Excludes this material from mist effects (in world settings) +Material.face_texture -> use_face_texture: boolean Replaces the object's base color with color from face assigned image textures +Material.face_texture_alpha -> use_face_texture_alpha: boolean Replaces the object's base alpha value with alpha from face assigned image textures +Material.full_oversampling -> use_full_oversampling: boolean Force this material to render full shading/textures for all anti-aliasing samples +Material.invert_z -> invert_z: boolean Renders material's faces with an inverted Z buffer (scanline only) +Material.light_group_exclusive -> use_light_group_exclusive: boolean Material uses the light group exclusively - these lamps are excluded from other scene lighting +Material.object_color -> use_object_color: boolean Modulate the result with a per-object color +Material.only_shadow -> use_only_shadow: boolean Renders shadows as the material's alpha value, making materials transparent except for shadowed areas +Material.ray_shadow_bias -> use_ray_shadow_bias: boolean Prevents raytraced shadow errors on surfaces with smooth shaded normals (terminator problem) +Material.receive_transparent_shadows -> use_transparent_shadows: boolean Allow this object to receive transparent shadows casted through other objects +Material.shadeless -> use_shadeless: boolean Makes this material insensitive to light or shadow +Material.shadows -> use_shadows: boolean Allows this material to receive shadows +Material.tangent_shading -> use_tangent_shading: boolean Use the material's tangent vector instead of the normal for shading - for anisotropic shading effects +Material.traceable -> use_traceable: boolean Include this material and geometry that uses it in ray tracing calculations +Material.transparency -> use_transparency: boolean Render material as transparent +Material.use_diffuse_ramp -> use_diffuse_ramp: boolean Toggle diffuse ramp operations +Material.use_nodes -> use_nodes: boolean Use shader nodes to render the material +Material.use_sky -> use_sky: boolean Renders this material with zero alpha, with sky background in place (scanline only) +Material.use_specular_ramp -> use_specular_ramp: boolean Toggle specular ramp operations +Material.use_textures -> use_textures: boolean Enable/Disable each texture +Material.vertex_color_light -> use_vertex_color_light: boolean Add vertex colors as additional lighting +Material.vertex_color_paint -> use_vertex_color_paint: boolean Replaces object base color with vertex colors (multiplies with 'texture face' face assigned textures) +MaterialHalo.flare_mode -> use_flare_mode: boolean Renders halo as a lensflare +MaterialHalo.lines -> use_lines: boolean Renders star shaped lines over halo +MaterialHalo.ring -> use_ring: boolean Renders rings over halo +MaterialHalo.shaded -> use_shading: boolean Lets halo receive light and shadows from external objects +MaterialHalo.soft -> use_soft: boolean Softens the edges of halos at intersections with other geometry +MaterialHalo.star -> use_star: boolean Renders halo as a star +MaterialHalo.texture -> use_texture: boolean Gives halo a texture +MaterialHalo.vertex_normal -> use_vertex_normal: boolean Uses the vertex normal to specify the dimension of the halo +MaterialHalo.xalpha -> use_extreme_alpha: boolean Uses extreme alpha +MaterialPhysics.align_to_normal -> use_align_to_normal: boolean Align dynamic game objects along the surface normal, when inside the physics distance area +MaterialRaytraceMirror.enabled -> use: boolean Enable raytraced reflections +MaterialStrand.blender_units -> use_blender_units: boolean Use Blender units for widths instead of pixels +MaterialStrand.surface_diffuse -> use_surface_diffuse: boolean Make diffuse shading more similar to shading the surface +MaterialStrand.tangent_shading -> use_tangent_shading: boolean Uses direction of strands as normal for tangent-shading +MaterialSubsurfaceScattering.enabled -> use: boolean Enable diffuse subsurface scatting effects in a material +MaterialTextureSlot.enabled -> use: boolean Enable this material texture slot +MaterialTextureSlot.from_dupli -> use_from_dupli: boolean Dupli's instanced from verts, faces or particles, inherit texture coordinate from their parent +MaterialTextureSlot.from_original -> use_from_original: boolean Dupli's derive their object coordinates from the original objects transformation +MaterialTextureSlot.map_alpha -> use_map_alpha: boolean Causes the texture to affect the alpha value +MaterialTextureSlot.map_ambient -> use_map_ambient: boolean Causes the texture to affect the value of ambient +MaterialTextureSlot.map_colordiff -> use_map_colordiff: boolean Causes the texture to affect basic color of the material +MaterialTextureSlot.map_coloremission -> use_map_coloremission: boolean Causes the texture to affect the color of emission +MaterialTextureSlot.map_colorreflection -> use_map_colorreflection: boolean Causes the texture to affect the color of scattered light +MaterialTextureSlot.map_colorspec -> use_map_colorspec: boolean Causes the texture to affect the specularity color +MaterialTextureSlot.map_colortransmission -> use_map_colortransmission: boolean Causes the texture to affect the result color after other light has been scattered/absorbed +MaterialTextureSlot.map_density -> use_map_density: boolean Causes the texture to affect the volume's density +MaterialTextureSlot.map_diffuse -> use_map_diffuse: boolean Causes the texture to affect the value of the materials diffuse reflectivity +MaterialTextureSlot.map_displacement -> use_map_displacement: boolean Let the texture displace the surface +MaterialTextureSlot.map_emission -> use_map_emission: boolean Causes the texture to affect the volume's emission +MaterialTextureSlot.map_emit -> use_map_emit: boolean Causes the texture to affect the emit value +MaterialTextureSlot.map_hardness -> use_map_hardness: boolean Causes the texture to affect the hardness value +MaterialTextureSlot.map_mirror -> use_map_mirror: boolean Causes the texture to affect the mirror color +MaterialTextureSlot.map_normal -> use_map_normal: boolean Causes the texture to affect the rendered normal +MaterialTextureSlot.map_raymir -> use_map_raymir: boolean Causes the texture to affect the ray-mirror value +MaterialTextureSlot.map_reflection -> use_map_reflect: boolean Causes the texture to affect the reflected light's brightness +MaterialTextureSlot.map_scattering -> use_map_scatter: boolean Causes the texture to affect the volume's scattering +MaterialTextureSlot.map_specular -> use_map_specular: boolean Causes the texture to affect the value of specular reflectivity +MaterialTextureSlot.map_translucency -> use_map_translucency: boolean Causes the texture to affect the translucency value +MaterialTextureSlot.map_warp -> use_map_warp: boolean Let the texture warp texture coordinates of next channels +MaterialTextureSlot.new_bump -> use_new_bump: boolean Use new, corrected bump mapping code (backwards compatibility option) +MaterialVolume.external_shadows -> use_external_shadows: boolean Receive shadows from sources outside the volume (temporary) +MaterialVolume.light_cache -> use_light_cache: boolean Pre-calculate the shading information into a voxel grid, speeds up shading at slightly less accuracy +Mesh.all_edges -> show_all_edges: boolean Displays all edges for wireframe in all view modes in the 3D view +Mesh.auto_texspace -> use_auto_texspace: boolean Adjusts active object's texture space automatically when transforming object +Mesh.autosmooth -> use_autosmooth: boolean Treats all set-smoothed faces with angles less than the specified angle as 'smooth' during render +Mesh.double_sided -> show_double_sided: boolean Render/display the mesh with double or single sided lighting +Mesh.draw_bevel_weights -> show_bevel_weights: boolean Displays weights created for the Bevel modifier +Mesh.draw_creases -> show_creases: boolean Displays creases created for subsurf weighting +Mesh.draw_edge_angle -> show_edge_angle: boolean Displays the angles in the selected edges in degrees +Mesh.draw_edge_lenght -> show_edge_lenght: boolean Displays selected edge lengths +Mesh.draw_edges -> show_edges: boolean Displays selected edges using highlights in the 3D view and UV editor +Mesh.draw_face_area -> show_face_area: boolean Displays the area of selected faces +Mesh.draw_faces -> show_faces: boolean Displays all faces as shades in the 3D view and UV editor +Mesh.draw_normals -> show_normals: boolean Displays face normals as lines +Mesh.draw_seams -> show_seams: boolean Displays UV unwrapping seams +Mesh.draw_sharp -> show_sharp: boolean Displays sharp edges, used with the EdgeSplit modifier +Mesh.draw_vertex_normals -> show_vertex_normals: boolean Displays vertex normals as lines +Mesh.use_mirror_topology -> use_mirror_topology: boolean Use topology based mirroring +Mesh.use_mirror_x -> use_mirror_x: boolean X Axis mirror editing +Mesh.use_paint_mask -> use_paint_mask: boolean Face selection masking for painting +Mesh.vertex_normal_flip -> use_vertex_normal_flip: boolean Flip vertex normals towards the camera during render +MeshColorLayer.active -> active: boolean Sets the layer as active for display and editing +MeshColorLayer.active_render -> active_render: boolean Sets the layer as active for rendering +MeshDeformModifier.dynamic -> dynamic: boolean Recompute binding dynamically on top of other deformers (slower and more memory consuming.) +MeshDeformModifier.invert -> invert_vertex_group: boolean Invert vertex group influence +MeshDeformModifier.is_bound -> is_bound: boolean, (read-only) Whether geometry has been bound to control cage +MeshEdge.fgon -> is_fgon: boolean, (read-only) Fgon edge +MeshEdge.hidden -> hide: boolean +MeshEdge.loose -> is_loose: boolean, (read-only) Loose edge +MeshEdge.seam -> use_seam: boolean Seam edge for UV unwrapping +MeshEdge.selected -> select: boolean +MeshEdge.sharp -> use_sharp: boolean Sharp edge for the EdgeSplit modifier +MeshFace.hidden -> hide: boolean +MeshFace.selected -> select: boolean +MeshFace.smooth -> use_smooth: boolean +MeshTextureFace.alpha_sort -> use_alpha_sort: boolean Enable sorting of faces for correct alpha drawing (slow, use Clip Alpha instead when possible) +MeshTextureFace.billboard -> use_billboard: boolean Billboard with Z-axis constraint +MeshTextureFace.collision -> use_collision: boolean Use face for collision and ray-sensor detection +MeshTextureFace.halo -> use_halo: boolean Screen aligned billboard +MeshTextureFace.invisible -> hide: boolean Make face invisible +MeshTextureFace.light -> use_light: boolean Use light for face +MeshTextureFace.object_color -> use_object_color: boolean Use ObColor instead of vertex colors +MeshTextureFace.shadow -> use_shadow_face: boolean Face is used for shadow +MeshTextureFace.shared -> use_blend_shared: boolean Blend vertex colors across face when vertices are shared +MeshTextureFace.tex -> use_texture: boolean Render face with texture +MeshTextureFace.text -> use_bitmap_text: boolean Enable bitmap text on face +MeshTextureFace.twoside -> use_twoside: boolean Render face two-sided +MeshTextureFace.uv_pinned -> uv_pin: boolean +MeshTextureFace.uv_selected -> uv_select: boolean +MeshTextureFaceLayer.active -> active: boolean Sets the layer as active for display and editing +MeshTextureFaceLayer.active_clone -> active_clone: boolean Sets the layer as active for cloning +MeshTextureFaceLayer.active_render -> active_render: boolean Sets the layer as active for rendering +MeshVertex.hidden -> hide: boolean +MeshVertex.selected -> select: boolean +MetaBall.auto_texspace -> use_auto_texspace: boolean Adjusts active object's texture space automatically when transforming object +MetaElement.hide -> hide: boolean Hide element +MetaElement.negative -> use_negative: boolean Set metaball as negative one +MetaSequence.convert_float -> use_float: boolean Convert input to float data +MetaSequence.de_interlace -> use_deinterlace: boolean For video movies to remove fields +MetaSequence.flip_x -> use_flip_x: boolean Flip on the X axis +MetaSequence.flip_y -> use_flip_y: boolean Flip on the Y axis +MetaSequence.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +MetaSequence.proxy_custom_directory -> use_proxy_custom_directory: boolean Use a custom directory to store data +MetaSequence.proxy_custom_file -> use_proxy_custom_file: boolean Use a custom file to read proxy data from +MetaSequence.reverse_frames -> use_reverse_frames: boolean Reverse frame order +MetaSequence.use_color_balance -> use_color_balance: boolean (3-Way color correction) on input +MetaSequence.use_crop -> use_crop: boolean Crop image before processing +MetaSequence.use_proxy -> use_proxy: boolean Use a preview proxy for this strip +MetaSequence.use_translation -> use_translation: boolean Translate image before processing +MirrorModifier.clip -> use_clip: boolean Prevents vertices from going through the mirror during transform +MirrorModifier.mirror_u -> use_mirror_u: boolean Mirror the U texture coordinate around the 0.5 point +MirrorModifier.mirror_v -> use_mirror_v: boolean Mirror the V texture coordinate around the 0.5 point +MirrorModifier.mirror_vertex_groups -> use_mirror_vertex_groups: boolean Mirror vertex groups (e.g. .R->.L) +MirrorModifier.x -> use_x: boolean Enable X axis mirror +MirrorModifier.y -> use_y: boolean Enable Y axis mirror +MirrorModifier.z -> use_z: boolean Enable Z axis mirror +Modifier.editmode -> show_in_editmode: boolean Use modifier while in the edit mode +Modifier.expanded -> show_expanded: boolean Set modifier expanded in the user interface +Modifier.on_cage -> show_on_cage: boolean Enable direct editing of modifier control cage +Modifier.realtime -> show_realtime: boolean Realtime display of a modifier +Modifier.render -> use_render: boolean Use modifier during rendering +MotionPath.editing -> is_edited: boolean Path is being edited +MotionPath.use_bone_head -> use_bone_head: boolean, (read-only) For PoseBone paths, use the bone head location when calculating this path +MotionPathVert.selected -> select: boolean Path point is selected for editing +MovieSequence.convert_float -> use_float: boolean Convert input to float data +MovieSequence.de_interlace -> use_deinterlace: boolean For video movies to remove fields +MovieSequence.flip_x -> use_flip_x: boolean Flip on the X axis +MovieSequence.flip_y -> use_flip_y: boolean Flip on the Y axis +MovieSequence.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +MovieSequence.proxy_custom_directory -> use_proxy_custom_directory: boolean Use a custom directory to store data +MovieSequence.proxy_custom_file -> use_proxy_custom_file: boolean Use a custom file to read proxy data from +MovieSequence.reverse_frames -> use_reverse_frames: boolean Reverse frame order +MovieSequence.use_color_balance -> use_color_balance: boolean (3-Way color correction) on input +MovieSequence.use_crop -> use_crop: boolean Crop image before processing +MovieSequence.use_proxy -> use_proxy: boolean Use a preview proxy for this strip +MovieSequence.use_translation -> use_translation: boolean Translate image before processing +MulticamSequence.convert_float -> use_float: boolean Convert input to float data +MulticamSequence.de_interlace -> use_deinterlace: boolean For video movies to remove fields +MulticamSequence.flip_x -> use_flip_x: boolean Flip on the X axis +MulticamSequence.flip_y -> use_flip_y: boolean Flip on the Y axis +MulticamSequence.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +MulticamSequence.proxy_custom_directory -> use_proxy_custom_directory: boolean Use a custom directory to store data +MulticamSequence.proxy_custom_file -> use_proxy_custom_file: boolean Use a custom file to read proxy data from +MulticamSequence.reverse_frames -> use_reverse_frames: boolean Reverse frame order +MulticamSequence.use_color_balance -> use_color_balance: boolean (3-Way color correction) on input +MulticamSequence.use_crop -> use_crop: boolean Crop image before processing +MulticamSequence.use_proxy -> use_proxy: boolean Use a preview proxy for this strip +MulticamSequence.use_translation -> use_translation: boolean Translate image before processing +MultiresModifier.external -> is_external: boolean, (read-only) Store multires displacements outside the .blend file, to save memory +MultiresModifier.optimal_display -> show_only_control_edges: boolean Skip drawing/rendering of interior subdivided edges +NetRenderSettings.master_broadcast -> use_master_broadcast: boolean broadcast master server address on local network +NetRenderSettings.master_clear -> use_master_clear: boolean delete saved files on exit +NetRenderSettings.slave_clear -> use_slave_clear: boolean delete downloaded files on exit +NetRenderSettings.slave_outputlog -> use_slave_output_log: boolean Output render text log to console as well as sending it to the master +NetRenderSettings.slave_thumb -> use_slave_thumb: boolean Generate thumbnails on slaves instead of master +NlaStrip.active -> active: boolean, (read-only) NLA Strip is active +NlaStrip.animated_influence -> use_animated_influence: boolean Influence setting is controlled by an F-Curve rather than automatically determined +NlaStrip.animated_time -> use_animated_time: boolean Strip time is controlled by an F-Curve rather than automatically determined +NlaStrip.animated_time_cyclic -> use_animated_time_cyclic: boolean Cycle the animated time within the action start & end +NlaStrip.auto_blending -> use_auto_blend: boolean Number of frames for Blending In/Out is automatically determined from overlapping strips +NlaStrip.muted -> mute: boolean NLA Strip is not evaluated +NlaStrip.reversed -> use_reverse: boolean NLA Strip is played back in reverse order (only when timing is automatically determined) +NlaStrip.selected -> select: boolean NLA Strip is selected +NlaTrack.active -> active: boolean, (read-only) NLA Track is active +NlaTrack.locked -> lock: boolean NLA Track is locked +NlaTrack.muted -> mute: boolean NLA Track is not evaluated +NlaTrack.selected -> select: boolean NLA Track is selected +NlaTrack.solo -> is_solo: boolean, (read-only) NLA Track is evaluated itself (i.e. active Action and all other NLA Tracks in the same AnimData block are disabled) +Object.draw_axis -> show_axis: boolean Displays the object's origin and axis +Object.draw_bounds -> show_bounds: boolean Displays the object's bounds +Object.draw_name -> show_name: boolean Displays the object's name +Object.draw_texture_space -> show_texture_space: boolean Displays the object's texture space +Object.draw_transparent -> show_transparent: boolean Enables transparent materials for the object (Mesh only) +Object.draw_wire -> show_wire: boolean Adds the object's wireframe over solid drawing +Object.duplis_used -> is_duplicator: boolean, (read-only) +Object.layers -> layer: boolean Layers the object is on +Object.lock_location -> lock_location: boolean Lock editing of location in the interface +Object.lock_rotation -> lock_rotation: boolean Lock editing of rotation in the interface +Object.lock_rotation_w -> lock_rotation_w: boolean Lock editing of 'angle' component of four-component rotations in the interface +Object.lock_rotations_4d -> lock_rotations_4d: boolean Lock editing of four component rotations by components (instead of as Eulers) +Object.lock_scale -> lock_scale: boolean Lock editing of scale in the interface +Object.restrict_render -> restrict_render: boolean Restrict renderability +Object.restrict_select -> restrict_select: boolean Restrict selection in the viewport +Object.restrict_view -> restrict_view: boolean Restrict visibility in the viewport +Object.selected -> select: boolean Object selection state +Object.shape_key_edit_mode -> use_shape_key_edit_mode: boolean Apply shape keys in edit mode (for Meshes only) +Object.shape_key_lock -> show_shape_key: boolean Always show the current Shape for this Object +Object.slow_parent -> use_slow_parent: boolean Create a delay in the parent relationship +Object.time_offset_add_parent -> use_time_offset_add_parent: boolean Add the parents time offset value +Object.time_offset_edit -> use_time_offset_edit: boolean Use time offset when inserting keys and display time offset for F-Curve and action views +Object.time_offset_parent -> use_time_offset_parent: boolean Apply the time offset to this objects parent relationship +Object.time_offset_particle -> use_time_offset_particle: boolean Let the time offset work on the particle effect +Object.use_dupli_faces_scale -> use_dupli_faces_scale: boolean Scale dupli based on face size +Object.use_dupli_frames_speed -> use_dupli_frames_speed: boolean Set dupliframes to use the frame +Object.use_dupli_verts_rotation -> use_dupli_verts_rotation: boolean Rotate dupli according to vertex normal +Object.x_ray -> show_x_ray: boolean Makes the object draw in front of others +ObjectActuator.add_linear_velocity -> use_add_linear_velocity: boolean Toggles between ADD and SET linV +ObjectActuator.local_angular_velocity -> use_local_angular_velocity: boolean Angular velocity is defined in local coordinates +ObjectActuator.local_force -> use_local_force: boolean Force is defined in local coordinates +ObjectActuator.local_linear_velocity -> use_local_linear_velocity: boolean Velocity is defined in local coordinates +ObjectActuator.local_location -> use_local_location: boolean Location is defined in local coordinates +ObjectActuator.local_rotation -> use_local_rotation: boolean Rotation is defined in local coordinates +ObjectActuator.local_torque -> use_local_torque: boolean Torque is defined in local coordinates +ObjectActuator.servo_limit_x -> use_servo_limit_x: boolean Set limit to force along the X axis +ObjectActuator.servo_limit_y -> use_servo_limit_y: boolean Set limit to force along the Y axis +ObjectActuator.servo_limit_z -> use_servo_limit_z: boolean Set limit to force along the Z axis +ObjectBase.layers -> layer: boolean Layers the object base is on +ObjectBase.selected -> select: boolean Object base selection state +ObstacleFluidSettings.active -> use: boolean Object contributes to the fluid simulation +ObstacleFluidSettings.export_animated_mesh -> use_animated_mesh: boolean Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it +Operator.has_reports -> has_reports: boolean, (read-only) Operator has a set of reports (warnings and errors) from last execution +OperatorStrokeElement.flip -> use_flip: boolean +OutflowFluidSettings.active -> use: boolean Object contributes to the fluid simulation +OutflowFluidSettings.export_animated_mesh -> use_animated_mesh: boolean Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it +Paint.fast_navigate -> show_low_resolution: boolean For multires, show low resolution while navigating the view +Paint.show_brush -> show_brush: boolean +Panel.bl_default_closed -> bl_use_closed: boolean +Panel.bl_show_header -> bl_show_header: boolean +ParentActuator.compound -> use_compound: boolean Add this object shape to the parent shape (only if the parent shape is already compound) +ParentActuator.ghost -> use_ghost: boolean Make this object ghost while parented (only if not compound) +ParticleBrush.use_puff_volume -> use_puff_volume: boolean Apply puff to unselected end-points, (helps maintain hair volume when puffing root) +ParticleEdit.add_interpolate -> use_add_interpolate: boolean Interpolate new particles from the existing ones +ParticleEdit.auto_velocity -> use_auto_velocity: boolean Calculate point velocities automatically +ParticleEdit.draw_particles -> show_particles: boolean Draw actual particles +ParticleEdit.editable -> is_editable: boolean, (read-only) A valid edit mode exists +ParticleEdit.emitter_deflect -> use_emitter_deflect: boolean Keep paths from intersecting the emitter +ParticleEdit.fade_time -> use_fade_time: boolean Fade paths and keys further away from current frame +ParticleEdit.hair -> is_hair: boolean, (read-only) Editing hair +ParticleEdit.keep_lengths -> use_preserve_lengths: boolean Keep path lengths constant +ParticleEdit.keep_root -> use_preserve_root: boolean Keep root keys unmodified +ParticleFluidSettings.drops -> use_drops: boolean Show drop particles +ParticleFluidSettings.floats -> use_floats: boolean Show floating foam particles +ParticleFluidSettings.tracer -> use_tracer: boolean Show tracer particles +ParticleInstanceModifier.alive -> use_alive: boolean Show instances when particles are alive +ParticleInstanceModifier.children -> use_children: boolean Create instances from child particles +ParticleInstanceModifier.dead -> use_dead: boolean Show instances when particles are dead +ParticleInstanceModifier.keep_shape -> use_preserve_shape: boolean Don't stretch the object +ParticleInstanceModifier.normal -> use_normal: boolean Create instances from normal particles +ParticleInstanceModifier.size -> use_size: boolean Use particle size to scale the instances +ParticleInstanceModifier.unborn -> use_unborn: boolean Show instances when particles are unborn +ParticleInstanceModifier.use_path -> use_path: boolean Create instances along particle paths +ParticleSettings.abs_path_time -> use_absolute_path_time: boolean Path timing is in absolute frames +ParticleSettings.animate_branching -> use_animate_branching: boolean Animate branching +ParticleSettings.billboard_lock -> lock_billboard: boolean Lock the billboards align axis +ParticleSettings.boids_2d -> lock_boids_to_surface: boolean Constrain boids to a surface +ParticleSettings.branching -> use_branching: boolean Branch child paths from each other +ParticleSettings.child_effector -> apply_effector_to_children: boolean Apply effectors to children +ParticleSettings.child_guide -> apply_guide_to_children: boolean +ParticleSettings.die_on_collision -> use_die_on_collision: boolean Particles die when they collide with a deflector object +ParticleSettings.died -> use_died: boolean Show particles after they have died +ParticleSettings.draw_health -> show_health: boolean Draw boid health +ParticleSettings.emitter -> use_render_emitter: boolean Render emitter Object also +ParticleSettings.enable_simplify -> use_simplify: boolean Remove child strands as the object becomes smaller on the screen +ParticleSettings.even_distribution -> use_even_distribution: boolean Use even distribution from faces based on face areas or edge lengths +ParticleSettings.grid_invert -> invert_grid: boolean Invert what is considered object and what is not +ParticleSettings.hair_bspline -> use_hair_bspline: boolean Interpolate hair using B-Splines +ParticleSettings.material_color -> show_material_color: boolean Draw particles using material's diffuse color +ParticleSettings.num -> show_number: boolean Show particle number +ParticleSettings.parent -> use_parents: boolean Render parent particles +ParticleSettings.rand_group -> use_group_pick_random: boolean Pick objects from group randomly +ParticleSettings.react_multiple -> use_react_multiple: boolean React multiple times +ParticleSettings.react_start_end -> use_react_start_end: boolean Give birth to unreacted particles eventually +ParticleSettings.render_adaptive -> use_render_adaptive: boolean Use adapative rendering for paths +ParticleSettings.render_strand -> use_strand_primitive: boolean Use the strand primitive for rendering +ParticleSettings.rotation_dynamic -> use_dynamic_rotation: boolean Sets rotation to dynamic/constant +ParticleSettings.self_effect -> use_self_effect: boolean Particle effectors effect themselves +ParticleSettings.show_size -> show_size: boolean Show particle size +ParticleSettings.size_deflect -> use_size_deflect: boolean Use particle's size in deflection +ParticleSettings.sizemass -> use_multiply_size_mass: boolean Multiply mass by particle size +ParticleSettings.symmetric_branching -> use_symmetric_branching: boolean Start and end points are the same +ParticleSettings.trand -> use_emit_random: boolean Emit in random order of elements +ParticleSettings.unborn -> use_unborn: boolean Show particles before they are emitted +ParticleSettings.use_global_dupli -> use_global_dupli: boolean Use object's global coordinates for duplication +ParticleSettings.use_group_count -> use_group_count: boolean Use object multiple times in the same group +ParticleSettings.velocity -> show_velocity: boolean Show particle velocity +ParticleSettings.velocity_length -> use_velocity_length: boolean Multiply line length by particle speed +ParticleSettings.viewport -> use_simplify_viewport: boolean +ParticleSettings.whole_group -> use_whole_group: boolean Use whole group at once +ParticleSystem.editable -> is_editable: boolean, (read-only) Particle system can be edited in particle mode +ParticleSystem.edited -> is_edited: boolean, (read-only) Particle system has been edited in particle mode +ParticleSystem.global_hair -> is_global_hair: boolean, (read-only) Hair keys are in global coordinate space +ParticleSystem.hair_dynamics -> use_hair_dynamics: boolean Enable hair dynamics using cloth simulation +ParticleSystem.keyed_timing -> use_keyed_timing: boolean Use key times +ParticleSystem.multiple_caches -> has_multiple_caches: boolean, (read-only) Particle system has multiple point caches +ParticleSystem.vertex_group_clump_negate -> invert_vertex_group_clump: boolean Negate the effect of the clump vertex group +ParticleSystem.vertex_group_density_negate -> invert_vertex_group_density: boolean Negate the effect of the density vertex group +ParticleSystem.vertex_group_field_negate -> invert_vertex_group_field: boolean Negate the effect of the field vertex group +ParticleSystem.vertex_group_kink_negate -> invert_vertex_group_kink: boolean Negate the effect of the kink vertex group +ParticleSystem.vertex_group_length_negate -> invert_vertex_group_length: boolean Negate the effect of the length vertex group +ParticleSystem.vertex_group_rotation_negate -> invert_vertex_group_rotation: boolean Negate the effect of the rotation vertex group +ParticleSystem.vertex_group_roughness1_negate -> invert_vertex_group_roughness1: boolean Negate the effect of the roughness 1 vertex group +ParticleSystem.vertex_group_roughness2_negate -> invert_vertex_group_roughness2: boolean Negate the effect of the roughness 2 vertex group +ParticleSystem.vertex_group_roughness_end_negate -> invert_vertex_group_roughness_end: boolean Negate the effect of the roughness end vertex group +ParticleSystem.vertex_group_size_negate -> invert_vertex_group_size: boolean Negate the effect of the size vertex group +ParticleSystem.vertex_group_tangent_negate -> invert_vertex_group_tangent: boolean Negate the effect of the tangent vertex group +ParticleSystem.vertex_group_velocity_negate -> invert_vertex_group_velocity: boolean Negate the effect of the velocity vertex group +ParticleTarget.valid -> is_valid: boolean Keyed particles target is valid +PivotConstraint.use_relative_position -> use_relative_location: boolean Offset will be an absolute point in space instead of relative to the target +PointCache.baked -> is_baked: boolean, (read-only) +PointCache.baking -> is_baking: boolean, (read-only) +PointCache.disk_cache -> use_disk_cache: boolean Save cache files to disk (.blend file must be saved first) +PointCache.external -> use_external: boolean Read cache from an external location +PointCache.has_skipped_frames-> frames_skipped: boolean, (read-only) +PointCache.outdated -> is_outdated: boolean, (read-only) +PointCache.quick_cache -> use_quick_cache: boolean Update simulation with cache steps +PointCache.use_library_path -> use_library_path: boolean Use this files path when library linked into another file. +PointDensity.turbulence -> use_turbulence: boolean Add directed noise to the density at render-time +PointLamp.only_shadow -> use_only_shadow: boolean Causes light to cast shadows only without illuminating objects +PointLamp.shadow_layer -> use_shadow_layer: boolean Causes only objects on the same layer to cast shadows +PointLamp.sphere -> use_sphere: boolean Sets light intensity to zero beyond lamp distance +PoseBone.has_ik -> is_in_ik_chain: boolean, (read-only) Is part of an IK chain +NEGATE * PoseBone.ik_dof_x -> lock_ik_x: boolean Allow movement around the X axis +NEGATE * PoseBone.ik_dof_y -> lock_ik_y: boolean Allow movement around the Y axis +NEGATE * PoseBone.ik_dof_z -> lock_ik_z: boolean Allow movement around the Z axis +PoseBone.ik_limit_x -> lock_ik_x: boolean Limit movement around the X axis +PoseBone.ik_limit_y -> lock_ik_y: boolean Limit movement around the Y axis +PoseBone.ik_limit_z -> lock_ik_z: boolean Limit movement around the Z axis +PoseBone.ik_lin_control -> use_ik_lin_control: boolean Apply channel size as IK constraint if stretching is enabled +PoseBone.ik_rot_control -> use_ik_rot_control: boolean Apply channel rotation as IK constraint +PoseBone.lock_location -> lock_location: boolean Lock editing of location in the interface +PoseBone.lock_rotation -> lock_rotation: boolean Lock editing of rotation in the interface +PoseBone.lock_rotation_w -> lock_rotation_w: boolean Lock editing of 'angle' component of four-component rotations in the interface +PoseBone.lock_rotations_4d -> lock_rotations_4d: boolean Lock editing of four component rotations by components (instead of as Eulers) +PoseBone.lock_scale -> lock_scale: boolean Lock editing of scale in the interface +PoseBone.selected -> select: boolean +PoseTemplateSettings.generate_def_rig -> use_generate_deform_rig: boolean Create a copy of the metarig, constrainted by the generated rig +Property.is_never_none -> is_never_none: boolean, (read-only) True when this value can't be set to None +Property.is_readonly -> is_readonly: boolean, (read-only) Property is editable through RNA +Property.is_required -> is_required: boolean, (read-only) False when this property is an optional argument in an RNA function +Property.registered -> is_registered: boolean, (read-only) Property is registered as part of type registration +Property.registered_optional -> is_registered_optional: boolean, (read-only) Property is optionally registered as part of type registration +Property.use_output -> is_output: boolean, (read-only) True when this property is an output value from an RNA function +PythonConstraint.script_error -> has_script_error: boolean, (read-only) The linked Python script has thrown an error +PythonConstraint.use_targets -> use_targets: boolean Use the targets indicated in the constraint panel +PythonController.debug -> use_debug: boolean Continuously reload the module from disk for editing external modules without restarting +RandomActuator.always_true -> use_always_true: boolean Always false or always true +RaySensor.x_ray_mode -> use_x_ray: boolean See through objects that don't have the property +RegionView3D.box_clip -> use_box_clip: boolean Clip objects based on what's visible in other side views +RegionView3D.box_preview -> show_synced_view: boolean Sync view position between side views +RegionView3D.lock_rotation -> lock_rotation: boolean Lock view rotation in side views +RenderEngine.bl_postprocess -> bl_use_postprocess: boolean +RenderEngine.bl_preview -> bl_use_preview: boolean +RenderLayer.all_z -> use_all_z: boolean, (read-only) Fill in Z values for solid faces in invisible layers, for masking +RenderLayer.edge -> use_edge_enhance: boolean, (read-only) Render Edge-enhance in this Layer (only works for Solid faces) +RenderLayer.enabled -> use: boolean, (read-only) Disable or enable the render layer +RenderLayer.halo -> use_halo: boolean, (read-only) Render Halos in this Layer (on top of Solid) +RenderLayer.pass_ao -> use_pass_ambient_occlusion: boolean, (read-only) Deliver AO pass +RenderLayer.pass_ao_exclude -> exclude_ambient_occlusion: boolean, (read-only) Exclude AO pass from combined +RenderLayer.pass_color -> use_pass_color: boolean, (read-only) Deliver shade-less color pass +RenderLayer.pass_combined -> use_pass_combined: boolean, (read-only) Deliver full combined RGBA buffer +RenderLayer.pass_diffuse -> use_pass_diffuse: boolean, (read-only) Deliver diffuse pass +RenderLayer.pass_emit -> use_pass_emit: boolean, (read-only) Deliver emission pass +RenderLayer.pass_emit_exclude -> exclude_emit: boolean, (read-only) Exclude emission pass from combined +RenderLayer.pass_environment -> use_pass_environment: boolean, (read-only) Deliver environment lighting pass +RenderLayer.pass_environment_exclude -> exclude_environment: boolean, (read-only) Exclude environment pass from combined +RenderLayer.pass_indirect -> use_pass_indirect: boolean, (read-only) Deliver indirect lighting pass +RenderLayer.pass_indirect_exclude -> exclude_indirect: boolean, (read-only) Exclude indirect pass from combined +RenderLayer.pass_mist -> use_pass_mist: boolean, (read-only) Deliver mist factor pass (0.0-1.0) +RenderLayer.pass_normal -> use_pass_normal: boolean, (read-only) Deliver normal pass +RenderLayer.pass_object_index -> use_pass_object_index: boolean, (read-only) Deliver object index pass +RenderLayer.pass_reflection -> use_pass_reflection: boolean, (read-only) Deliver raytraced reflection pass +RenderLayer.pass_reflection_exclude -> exclude_reflection: boolean, (read-only) Exclude raytraced reflection pass from combined +RenderLayer.pass_refraction -> use_pass_refraction: boolean, (read-only) Deliver raytraced refraction pass +RenderLayer.pass_refraction_exclude -> exclude_refraction: boolean, (read-only) Exclude raytraced refraction pass from combined +RenderLayer.pass_shadow -> use_pass_shadow: boolean, (read-only) Deliver shadow pass +RenderLayer.pass_shadow_exclude -> exclude_shadow: boolean, (read-only) Exclude shadow pass from combined +RenderLayer.pass_specular -> use_pass_specular: boolean, (read-only) Deliver specular pass +RenderLayer.pass_specular_exclude -> exclude_specular: boolean, (read-only) Exclude specular pass from combined +RenderLayer.pass_uv -> use_pass_uv: boolean, (read-only) Deliver texture UV pass +RenderLayer.pass_vector -> use_pass_vector: boolean, (read-only) Deliver speed vector pass +RenderLayer.pass_z -> use_pass_z: boolean, (read-only) Deliver Z values pass +RenderLayer.sky -> use_sky: boolean, (read-only) Render Sky in this Layer +RenderLayer.solid -> use_solid: boolean, (read-only) Render Solid faces in this Layer +RenderLayer.strand -> use_strand: boolean, (read-only) Render Strands in this Layer +RenderLayer.visible_layers -> layer: boolean, (read-only) Scene layers included in this render layer +RenderLayer.zmask -> use_zmask: boolean, (read-only) Only render what's in front of the solid z values +RenderLayer.zmask_layers -> layer_zmask: boolean, (read-only) Zmask scene layers +RenderLayer.zmask_negate -> invert_zmask: boolean, (read-only) For Zmask, only render what is behind solid z values instead of in front +RenderLayer.ztransp -> use_ztransp: boolean, (read-only) Render Z-Transparent faces in this Layer (On top of Solid and Halos) +RenderSettings.backbuf -> use_backbuf: boolean Render backbuffer image +RenderSettings.bake_active -> use_bake_active_to_selected: boolean Bake shading on the surface of selected objects to the active object +RenderSettings.bake_clear -> use_bake_clear: boolean Clear Images before baking +RenderSettings.bake_enable_aa -> use_bake_antialiasing: boolean Enables Anti-aliasing +RenderSettings.bake_normalized -> use_bake_normalized: boolean With displacement normalize to the distance, with ambient occlusion normalize without using material settings +RenderSettings.cineon_log -> use_cineon_log: boolean Convert to logarithmic color space +RenderSettings.color_management -> use_color_management: boolean Use color profiles and gamma corrected imaging pipeline +RenderSettings.crop_to_border -> use_crop_to_border: boolean Crop the rendered frame to the defined border size +RenderSettings.edge -> use_edge_enhance: boolean use_Create a toon outline around the edges of geometry +RenderSettings.exr_half -> use_exr_half: boolean Use 16 bit floats instead of 32 bit floats per channel +RenderSettings.exr_preview -> use_exr_preview: boolean When rendering animations, save JPG preview images in same directory +RenderSettings.exr_zbuf -> use_exr_zbuf: boolean Save the z-depth per pixel (32 bit unsigned int zbuffer) +RenderSettings.ffmpeg_autosplit -> use_ffmpeg_autosplit: boolean Autosplit output at 2GB boundary +RenderSettings.fields -> use_fields: boolean Render image to two fields per frame, for interlaced TV output +RenderSettings.fields_still -> use_fields_still: boolean Disable the time difference between fields +RenderSettings.free_image_textures -> use_free_image_textures: boolean Free all image texture from memory after render, to save memory before compositing +RenderSettings.free_unused_nodes -> use_free_unused_nodes: boolean Free Nodes that are not used while compositing, to save memory +RenderSettings.full_sample -> use_full_sample: boolean Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing +RenderSettings.is_movie_format -> is_movie_format: boolean, (read-only) When true the format is a movie +RenderSettings.jpeg2k_ycc -> use_jpeg2k_ycc: boolean Save luminance-chrominance-chrominance channels instead of RGB colors +RenderSettings.motion_blur -> use_motion_blur: boolean Use multi-sampled 3D scene motion blur +RenderSettings.multiple_engines -> has_multiple_engines: boolean, (read-only) More than one rendering engine is available +RenderSettings.render_antialiasing -> use_antialiasing: boolean Render and combine multiple samples per pixel to prevent jagged edges +RenderSettings.render_stamp -> use_stamp: boolean Render the stamp info text in the rendered image +RenderSettings.save_buffers -> use_save_buffers: boolean Save tiles for all RenderLayers and SceneNodes to files in the temp directory (saves memory, required for Full Sample) +RenderSettings.simplify_triangulate -> use_simplify_triangulate: boolean Disables non-planer quads being triangulated +RenderSettings.single_layer -> use_single_layer: boolean Only render the active layer +RenderSettings.stamp_camera -> use_stamp_camera: boolean Include the name of the active camera in image metadata +RenderSettings.stamp_date -> use_stamp_date: boolean Include the current date in image metadata +RenderSettings.stamp_filename -> use_stamp_filename: boolean Include the filename of the .blend file in image metadata +RenderSettings.stamp_frame -> use_stamp_frame: boolean Include the frame number in image metadata +RenderSettings.stamp_marker -> use_stamp_marker: boolean Include the name of the last marker in image metadata +RenderSettings.stamp_note -> use_stamp_note: boolean Include a custom note in image metadata +RenderSettings.stamp_render_time -> use_stamp_render_time: boolean Include the render time in the stamp image +RenderSettings.stamp_scene -> use_stamp_scene: boolean Include the name of the active scene in image metadata +RenderSettings.stamp_sequencer_strip -> use_stamp_sequencer_strip: boolean Include the name of the foreground sequence strip in image metadata +RenderSettings.stamp_time -> use_stamp_time: boolean Include the render frame as HH:MM:SS.FF in image metadata +RenderSettings.tiff_bit -> use_tiff_16bit: boolean Save TIFF with 16 bits per channel +RenderSettings.use_border -> use_border: boolean Render a user-defined border region, within the frame size. Note, this disables save_buffers and full_sample +RenderSettings.use_compositing -> use_compositing: boolean Process the render result through the compositing pipeline, if compositing nodes are enabled +RenderSettings.use_envmaps -> use_envmaps: boolean Calculate environment maps while rendering +RenderSettings.use_file_extension -> use_file_extension: boolean Add the file format extensions to the rendered file name (eg: filename + .jpg) +RenderSettings.use_game_engine -> use_game_engine: boolean, (read-only) Current rendering engine is a game engine +RenderSettings.use_instances -> use_instances: boolean Instance support leads to effective memory reduction when using duplicates +RenderSettings.use_local_coords -> use_local_coords: boolean Vertex coordinates are stored localy on each primitive. Increases memory usage, but may have impact on speed +RenderSettings.use_overwrite -> use_overwrite: boolean Overwrite existing files while rendering +RenderSettings.use_placeholder -> use_placeholder: boolean Create empty placeholder files while rendering frames (similar to Unix 'touch') +RenderSettings.use_radiosity -> use_radiosity: boolean Calculate radiosity in a pre-process before rendering +RenderSettings.use_raytracing -> use_raytrace: boolean Pre-calculate the raytrace accelerator and render raytracing effects +RenderSettings.use_sequencer -> use_sequencer: boolean Process the render (and composited) result through the video sequence editor pipeline, if sequencer strips exist +RenderSettings.use_sequencer_gl_preview -> use_sequencer_gl_preview: boolean +RenderSettings.use_sequencer_gl_render -> use_sequencer_gl_render: boolean +RenderSettings.use_shadows -> use_shadows: boolean Calculate shadows while rendering +RenderSettings.use_simplify -> use_simplify: boolean Enable simplification of scene for quicker preview renders +RenderSettings.use_sss -> use_sss: boolean Calculate sub-surface scattering in materials rendering +RenderSettings.use_textures -> use_textures: boolean Use textures to affect material properties +NEGATE * RigidBodyJointConstraint.disable_linked_collision -> use_linked_collision: boolean Disable collision between linked bodies +RigidBodyJointConstraint.draw_pivot -> show_pivot: boolean Display the pivot point and rotation in 3D view +Scene.frame_drop -> use_frame_drop: boolean Play back dropping frames if frame display is too slow +Scene.layers -> layer: boolean Layers visible when rendering the scene +Scene.mute_audio -> mute_audio: boolean Play back of audio from Sequence Editor will be muted +Scene.nla_tweakmode_on -> use_nla_tweakmode: boolean, (read-only) Indicates whether there is any action referenced by NLA being edited. Strictly read-only +Scene.pov_radio_always_sample -> use_pov_radio_always_sample: boolean Only use the data from the pretrace step and not gather any new samples during the final radiosity pass +Scene.pov_radio_display_advanced -> show_pov_radio_advanced: boolean Show advanced options +Scene.pov_radio_enable -> use_pov_radio: boolean Enable povrays radiosity calculation +Scene.pov_radio_media -> use_pov_radio_media: boolean Radiosity estimation can be affected by media +Scene.pov_radio_normal -> use_pov_radio_normal: boolean Radiosity estimation can be affected by normals +Scene.scrub_audio -> use_audio_scrub: boolean Play audio from Sequence Editor while scrubbing +Scene.sync_audio -> use_audio_sync: boolean Play back and sync with audio clock, dropping frames if frame display is too slow +Scene.use_gravity -> use_gravity: boolean Use global gravity for all dynamics +Scene.use_nodes -> use_nodes: boolean Enable the compositing node tree +Scene.use_preview_range -> use_preview_range: boolean Use an alternative start/end frame for UI playback, rather than the scene start/end frame +SceneGameData.activity_culling -> use_activity_culling: boolean Activity culling is enabled +SceneGameData.auto_start -> use_auto_start: boolean Automatically start game at load time +SceneGameData.fullscreen -> show_fullscreen: boolean Starts player in a new fullscreen display +SceneGameData.glsl_extra_textures -> use_glsl_extra_textures: boolean Use extra textures like normal or specular maps for GLSL rendering +SceneGameData.glsl_lights -> use_glsl_lights: boolean Use lights for GLSL rendering +SceneGameData.glsl_nodes -> use_glsl_nodes: boolean Use nodes for GLSL rendering +SceneGameData.glsl_ramps -> use_glsl_ramps: boolean Use ramps for GLSL rendering +SceneGameData.glsl_shaders -> use_glsl_shaders: boolean Use shaders for GLSL rendering +SceneGameData.glsl_shadows -> use_glsl_shadows: boolean Use shadows for GLSL rendering +SceneGameData.show_debug_properties -> show_debug_properties: boolean Show properties marked for debugging while the game runs +SceneGameData.show_framerate_profile -> show_framerate_profile: boolean Show framerate and profiling information while the game runs +SceneGameData.show_physics_visualization -> show_physics_visualization: boolean Show a visualization of physics bounds and interactions +SceneGameData.use_animation_record -> use_animation_record: boolean Record animation to fcurves +SceneGameData.use_deprecation_warnings -> use_deprecation_warnings: boolean Print warnings when using deprecated features in the python API +SceneGameData.use_display_lists -> use_display_lists: boolean Use display lists to speed up rendering by keeping geometry on the GPU +SceneGameData.use_frame_rate -> use_frame_rate: boolean Respect the frame rate rather than rendering as many frames as possible +SceneGameData.use_occlusion_culling -> use_occlusion_culling: boolean Use optimized Bullet DBVT tree for view frustum and occlusion culling +SceneRenderLayer.all_z -> use_all_z: boolean Fill in Z values for solid faces in invisible layers, for masking +SceneRenderLayer.edge -> use_edge_enhance: boolean Render Edge-enhance in this Layer (only works for Solid faces) +SceneRenderLayer.enabled -> use: boolean Disable or enable the render layer +SceneRenderLayer.halo -> use_halo: boolean Render Halos in this Layer (on top of Solid) +SceneRenderLayer.pass_ao -> use_pass_ambient_occlusion: boolean Deliver AO pass +SceneRenderLayer.pass_ao_exclude -> exclude_ambient_occlusion: boolean Exclude AO pass from combined +SceneRenderLayer.pass_color -> use_pass_color: boolean Deliver shade-less color pass +SceneRenderLayer.pass_combined -> use_pass_combined: boolean Deliver full combined RGBA buffer +SceneRenderLayer.pass_diffuse -> use_pass_diffuse: boolean Deliver diffuse pass +SceneRenderLayer.pass_emit -> use_pass_emit: boolean Deliver emission pass +SceneRenderLayer.pass_emit_exclude -> exclude_emit: boolean Exclude emission pass from combined +SceneRenderLayer.pass_environment -> use_pass_environment: boolean Deliver environment lighting pass +SceneRenderLayer.pass_environment_exclude -> exclude_environment: boolean Exclude environment pass from combined +SceneRenderLayer.pass_indirect -> use_pass_indirect: boolean Deliver indirect lighting pass +SceneRenderLayer.pass_indirect_exclude -> exclude_indirect: boolean Exclude indirect pass from combined +SceneRenderLayer.pass_mist -> use_pass_mist: boolean Deliver mist factor pass (0.0-1.0) +SceneRenderLayer.pass_normal -> use_pass_normal: boolean Deliver normal pass +SceneRenderLayer.pass_object_index -> use_pass_object_index: boolean Deliver object index pass +SceneRenderLayer.pass_reflection -> use_pass_reflection: boolean Deliver raytraced reflection pass +SceneRenderLayer.pass_reflection_exclude -> exclude_reflection: boolean Exclude raytraced reflection pass from combined +SceneRenderLayer.pass_refraction -> use_pass_refraction: boolean Deliver raytraced refraction pass +SceneRenderLayer.pass_refraction_exclude -> exclude_refraction: boolean Exclude raytraced refraction pass from combined +SceneRenderLayer.pass_shadow -> use_pass_shadow: boolean Deliver shadow pass +SceneRenderLayer.pass_shadow_exclude -> exclude_shadow: boolean Exclude shadow pass from combined +SceneRenderLayer.pass_specular -> use_pass_specular: boolean Deliver specular pass +SceneRenderLayer.pass_specular_exclude -> exclude_specular: boolean Exclude specular pass from combined +SceneRenderLayer.pass_uv -> use_pass_uv: boolean Deliver texture UV pass +SceneRenderLayer.pass_vector -> use_pass_vector: boolean Deliver speed vector pass +SceneRenderLayer.pass_z -> use_pass_z: boolean Deliver Z values pass +SceneRenderLayer.sky -> use_sky: boolean Render Sky in this Layer +SceneRenderLayer.solid -> use_solid: boolean Render Solid faces in this Layer +SceneRenderLayer.strand -> use_strand: boolean Render Strands in this Layer +SceneRenderLayer.visible_layers -> layer: boolean Scene layers included in this render layer +SceneRenderLayer.zmask -> use_zmask: boolean Only render what's in front of the solid z values +SceneRenderLayer.zmask_layers -> layer_zmask: boolean Zmask scene layers +SceneRenderLayer.zmask_negate -> invert_zmask: boolean For Zmask, only render what is behind solid z values instead of in front +SceneRenderLayer.ztransp -> use_ztransp: boolean Render Z-Transparent faces in this Layer (On top of Solid and Halos) +SceneSequence.convert_float -> use_float: boolean Convert input to float data +SceneSequence.de_interlace -> use_deinterlace: boolean For video movies to remove fields +SceneSequence.flip_x -> use_flip_x: boolean Flip on the X axis +SceneSequence.flip_y -> use_flip_y: boolean Flip on the Y axis +SceneSequence.premultiply -> use_premultiply: boolean Convert RGB from key alpha to premultiplied alpha +SceneSequence.proxy_custom_directory -> use_proxy_custom_directory: boolean Use a custom directory to store data +SceneSequence.proxy_custom_file -> use_proxy_custom_file: boolean Use a custom file to read proxy data from +SceneSequence.reverse_frames -> use_reverse_frames: boolean Reverse frame order +SceneSequence.use_color_balance -> use_color_balance: boolean (3-Way color correction) on input +SceneSequence.use_crop -> use_crop: boolean Crop image before processing +SceneSequence.use_proxy -> use_proxy: boolean Use a preview proxy for this strip +SceneSequence.use_translation -> use_translation: boolean Translate image before processing +Scopes.use_full_resolution -> use_full_resolution: boolean Sample every pixel of the image +Screen.animation_playing -> is_animation_playing: boolean, (read-only) Animation playback is active +Screen.fullscreen -> is_fullscreen: boolean, (read-only) An area is maximised, filling this screen +ScrewModifier.use_normal_calculate -> use_normal_calculate: boolean Calculate the order of edges (needed for meshes, but not curves) +ScrewModifier.use_normal_flip -> use_normal_flip: boolean Flip normals of lathed faces +ScrewModifier.use_object_screw_offset -> use_object_screw_offset: boolean Use the distance between the objects to make a screw +Sculpt.lock_x -> lock_x: boolean Disallow changes to the X axis of vertices +Sculpt.lock_y -> lock_y: boolean Disallow changes to the Y axis of vertices +Sculpt.lock_z -> lock_z: boolean Disallow changes to the Z axis of vertices +Sculpt.symmetry_x -> use_symmetry_x: boolean Mirror brush across the X axis +Sculpt.symmetry_y -> use_symmetry_y: boolean Mirror brush across the Y axis +Sculpt.symmetry_z -> use_symmetry_z: boolean Mirror brush across the Z axis +Sensor.expanded -> show_expanded: boolean Set sensor expanded in the user interface +Sensor.invert -> invert: boolean Invert the level(output) of this sensor +Sensor.level -> use_level: boolean Level detector, trigger controllers of new states (only applicable upon logic state transition) +Sensor.pulse_false_level -> use_pulse_false_level: boolean Activate FALSE level triggering (pulse mode) +Sensor.pulse_true_level -> use_pulse_true_level: boolean Activate TRUE level triggering (pulse mode) +Sensor.tap -> use_tap: boolean Trigger controllers only for an instant, even while the sensor remains true +Sequence.frame_locked -> use_frame_lock: boolean Lock the animation curve to the global frame counter +Sequence.left_handle_selected -> select_left_handle: boolean +Sequence.lock -> lock: boolean Lock strip so that it can't be transformed +Sequence.mute -> mute: boolean +Sequence.right_handle_selected -> select_right_handle: boolean +Sequence.selected -> select: boolean +Sequence.use_effect_default_fade -> use_default_fade: boolean Fade effect using the built-in default (usually make transition as long as effect strip) +SequenceColorBalance.inverse_gain -> invert_gain: boolean +SequenceColorBalance.inverse_gamma -> invert_gamma: boolean +SequenceColorBalance.inverse_lift -> invert_lift: boolean +ShaderNodeExtendedMaterial.diffuse -> use_diffuse: boolean Material Node outputs Diffuse +ShaderNodeExtendedMaterial.invert_normal -> invert_normal: boolean Material Node uses inverted normal +ShaderNodeExtendedMaterial.specular -> use_specular: boolean Material Node outputs Specular +ShaderNodeMapping.clamp_maximum -> use_max: boolean Clamp the output coordinate to a maximum value +ShaderNodeMapping.clamp_minimum -> use_min: boolean Clamp the output coordinate to a minimum value +ShaderNodeMaterial.diffuse -> use_diffuse: boolean Material Node outputs Diffuse +ShaderNodeMaterial.invert_normal -> invert_normal: boolean Material Node uses inverted normal +ShaderNodeMaterial.specular -> use_specular: boolean Material Node outputs Specular +ShaderNodeMixRGB.alpha -> use_alpha: boolean Include alpha of second input in this operation +ShapeActionActuator.continue_last_frame -> use_continue_last_frame: boolean Restore last frame when switching on/off, otherwise play from the start each time +ShapeKey.mute -> mute: boolean Mute this shape key +ShrinkwrapModifier.cull_back_faces -> use_cull_back_faces: boolean Stop vertices from projecting to a back face on the target +ShrinkwrapModifier.cull_front_faces -> use_cull_front_faces: boolean Stop vertices from projecting to a front face on the target +ShrinkwrapModifier.keep_above_surface -> use_keep_above_surface: boolean +ShrinkwrapModifier.negative -> use_negative_direction: boolean Allow vertices to move in the negative direction of axis +ShrinkwrapModifier.positive -> use_positive_direction: boolean Allow vertices to move in the positive direction of axis +ShrinkwrapModifier.x -> use_project_x: boolean +ShrinkwrapModifier.y -> use_project_y: boolean +ShrinkwrapModifier.z -> use_project_z: boolean +SimpleDeformModifier.lock_x_axis -> lock_x: boolean +SimpleDeformModifier.lock_y_axis -> lock_y: boolean +SimpleDeformModifier.relative -> use_relative: boolean Sets the origin of deform space to be relative to the object +SmokeDomainSettings.dissolve_smoke -> use_dissolve_smoke: boolean Enable smoke to disappear over time +SmokeDomainSettings.dissolve_smoke_log -> use_dissolve_smoke_log: boolean Using 1/x +SmokeDomainSettings.highres -> use_high_resolution: boolean Enable high resolution (using amplification) +SmokeDomainSettings.initial_velocity -> use_initial_velocity: boolean Smoke inherits it's velocity from the emitter particle +SmokeDomainSettings.viewhighres -> show_high_resolution: boolean Show high resolution (using amplification) +NEGATE * SmokeFlowSettings.outflow -> use_outflow: boolean Deletes smoke from simulation +SmoothModifier.x -> use_x: boolean +SmoothModifier.y -> use_y: boolean +SmoothModifier.z -> use_z: boolean +SoftBodySettings.auto_step -> use_auto_step: boolean Use velocities for automagic step sizes +SoftBodySettings.diagnose -> use_diagnose: boolean Turn on SB diagnose console prints +SoftBodySettings.edge_collision -> use_edge_collision: boolean Edges collide too +SoftBodySettings.estimate_matrix -> use_estimate_matrix: boolean estimate matrix .. split to COM , ROT ,SCALE +SoftBodySettings.face_collision -> use_face_collision: boolean Faces collide too, SLOOOOOW warning +SoftBodySettings.new_aero -> use_new_aero: boolean New aero(uses angle and length) +SoftBodySettings.self_collision -> use_self_collision: boolean Enable naive vertex ball self collision +SoftBodySettings.stiff_quads -> use_stiff_quads: boolean Adds diagonal springs on 4-gons +SoftBodySettings.use_edges -> use_edges: boolean Use Edges as springs +SoftBodySettings.use_goal -> use_goal: boolean Define forces for vertices to stick to animated position +SolidifyModifier.invert -> invert_vertex_group: boolean Invert the vertex group influence +SolidifyModifier.use_even_offset -> use_even_offset: boolean Maintain thickness by adjusting for sharp corners (slow, disable when not needed) +SolidifyModifier.use_quality_normals -> use_quality_normals: boolean Calculate normals which result in more even thickness (slow, disable when not needed) +SolidifyModifier.use_rim -> use_rim: boolean Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed) +SolidifyModifier.use_rim_material -> use_rim_material: boolean Use in the next material for rim faces +Sound.caching -> use_ram_cache: boolean The sound file is decoded and loaded into RAM +SoundActuator.enable_sound_3d -> use_3d_sound: boolean Enable/Disable 3D Sound +SpaceConsole.show_report_debug -> show_report_debug: boolean Display debug reporting info +SpaceConsole.show_report_error -> show_report_error: boolean Display error text +SpaceConsole.show_report_info -> show_report_info: boolean Display general information +SpaceConsole.show_report_operator -> show_report_operator: boolean Display the operator log +SpaceConsole.show_report_warn -> show_report_warning: boolean Display warnings +SpaceDopeSheetEditor.automerge_keyframes -> use_automerge_keyframes: boolean Automatically merge nearby keyframes +SpaceDopeSheetEditor.realtime_updates -> use_realtime_updates: boolean When transforming keyframes, changes to the animation data are flushed to other views +SpaceDopeSheetEditor.show_cframe_indicator -> show_frame_indicator: boolean Show frame number beside the current frame indicator line +SpaceDopeSheetEditor.show_seconds -> show_seconds: boolean, (read-only) Show timing in seconds not frames +SpaceDopeSheetEditor.show_sliders -> show_sliders: boolean Show sliders beside F-Curve channels +SpaceDopeSheetEditor.use_marker_sync -> use_marker_sync: boolean Sync Markers with keyframe edits +SpaceGraphEditor.automerge_keyframes -> use_automerge_keyframes: boolean Automatically merge nearby keyframes +SpaceGraphEditor.has_ghost_curves -> has_ghost_curves: boolean Graph Editor instance has some ghost curves stored +SpaceGraphEditor.only_selected_curves_handles -> use_only_selected_curves_handles: boolean Only keyframes of selected F-Curves are visible and editable +SpaceGraphEditor.only_selected_keyframe_handles -> use_only_selected_keyframe_handles: boolean Only show and edit handles of selected keyframes +SpaceGraphEditor.realtime_updates -> use_realtime_updates: boolean When transforming keyframes, changes to the animation data are flushed to other views +SpaceGraphEditor.show_cframe_indicator -> show_frame_indicator: boolean Show frame number beside the current frame indicator line +SpaceGraphEditor.show_cursor -> show_cursor: boolean Show 2D cursor +SpaceGraphEditor.show_handles -> show_handles: boolean Show handles of Bezier control points +SpaceGraphEditor.show_seconds -> show_seconds: boolean, (read-only) Show timing in seconds not frames +SpaceGraphEditor.show_sliders -> show_sliders: boolean Show sliders beside F-Curve channels +SpaceImageEditor.draw_repeated -> show_repeated: boolean Draw the image repeated outside of the main view +SpaceImageEditor.image_painting -> use_image_paint: boolean Enable image painting mode +SpaceImageEditor.image_pin -> use_image_pin: boolean Display current image regardless of object selection +SpaceImageEditor.show_paint -> show_paint: boolean, (read-only) Show paint related properties +SpaceImageEditor.show_render -> show_render: boolean, (read-only) Show render related properties +SpaceImageEditor.show_uvedit -> show_uvedit: boolean, (read-only) Show UV editing related properties +SpaceImageEditor.update_automatically -> use_realtime_updates: boolean Update other affected window spaces automatically to reflect changes during interactive operations such as transform +SpaceImageEditor.use_grease_pencil -> use_grease_pencil: boolean Display and edit the grease pencil freehand annotations overlay +SpaceLogicEditor.actuators_show_active_objects -> show_actuators_active_objects: boolean Show actuators of active object +SpaceLogicEditor.actuators_show_active_states -> show_actuators_active_states: boolean Show only actuators connected to active states +SpaceLogicEditor.actuators_show_linked_controller -> show_actuators_linked_controller: boolean Show linked objects to the actuator +SpaceLogicEditor.actuators_show_selected_objects -> show_actuators_selected_objects: boolean Show actuators of all selected objects +SpaceLogicEditor.controllers_show_active_objects -> show_controllers_active_objects: boolean Show controllers of active object +SpaceLogicEditor.controllers_show_linked_controller -> show_controllers_linked_controller: boolean Show linked objects to sensor/actuator +SpaceLogicEditor.controllers_show_selected_objects -> show_controllers_selected_objects: boolean Show controllers of all selected objects +SpaceLogicEditor.sensors_show_active_objects -> show_sensors_active_objects: boolean Show sensors of active object +SpaceLogicEditor.sensors_show_active_states -> show_sensors_active_states: boolean Show only sensors connected to active states +SpaceLogicEditor.sensors_show_linked_controller -> show_sensors_linked_controller: boolean Show linked objects to the controller +SpaceLogicEditor.sensors_show_selected_objects -> show_sensors_selected_objects: boolean Show sensors of all selected objects +SpaceNLA.realtime_updates -> use_realtime_updates: boolean When transforming strips, changes to the animation data are flushed to other views +SpaceNLA.show_cframe_indicator -> show_frame_indicator: boolean Show frame number beside the current frame indicator line +SpaceNLA.show_seconds -> show_seconds: boolean, (read-only) Show timing in seconds not frames +SpaceNLA.show_strip_curves -> show_strip_curves: boolean Show influence curves on strips +SpaceNodeEditor.backdrop -> show_backdrop: boolean Use active Viewer Node output as backdrop for compositing nodes +SpaceOutliner.match_case_sensitive -> use_match_case_sensitive: boolean Only use case sensitive matches of search string +SpaceOutliner.match_complete -> use_match_complete: boolean Only use complete matches of search string +SpaceOutliner.show_restriction_columns -> show_restriction_columns: boolean Show column +SpaceProperties.brush_texture -> show_brush_texture: boolean Show brush textures +SpaceProperties.use_pin_id -> use_pin_id: boolean Use the pinned context +SpaceSequenceEditor.draw_frames -> show_frames: boolean Draw frames rather than seconds +SpaceSequenceEditor.draw_safe_margin -> show_safe_margin: boolean Draw title safe margins in preview +SpaceSequenceEditor.separate_color_preview -> show_separate_color: boolean Separate color channels in preview +SpaceSequenceEditor.show_cframe_indicator -> show_frame_indicator: boolean Show frame number beside the current frame indicator line +SpaceSequenceEditor.use_grease_pencil -> use_grease_pencil: boolean Display and edit the grease pencil freehand annotations overlay +SpaceSequenceEditor.use_marker_sync -> use_marker_sync: boolean Transform markers as well as strips +SpaceTextEditor.find_all -> use_find_all: boolean Search in all text datablocks, instead of only the active one +SpaceTextEditor.find_wrap -> use_find_wrap: boolean Search again from the start of the file when reaching the end +SpaceTextEditor.line_numbers -> show_line_numbers: boolean Show line numbers next to the text +SpaceTextEditor.live_edit -> use_live_edit: boolean Run python while editing +SpaceTextEditor.overwrite -> use_overwrite: boolean Overwrite characters when typing rather than inserting them +SpaceTextEditor.syntax_highlight -> show_syntax_highlight: boolean Syntax highlight for scripting +SpaceTextEditor.word_wrap -> use_word_wrap: boolean Wrap words if there is not enough horizontal space +SpaceTimeline.only_selected -> show_only_selected: boolean Show keyframes for active Object and/or its selected channels only +SpaceTimeline.play_all_3d -> use_play_3d_editors: boolean +SpaceTimeline.play_anim -> use_play_animation_editors: boolean +SpaceTimeline.play_buttons -> use_play_properties_editors: boolean +SpaceTimeline.play_image -> use_play_image_editors: boolean +SpaceTimeline.play_nodes -> use_play_node_editors: boolean +SpaceTimeline.play_sequencer -> use_play_sequence_editors: boolean +SpaceTimeline.play_top_left -> use_play_top_left_3d_editor: boolean +SpaceTimeline.show_cframe_indicator -> show_frame_indicator: boolean Show frame number beside the current frame indicator line +SpaceUVEditor.constrain_to_image_bounds -> use_constrain_to_image_bounds: boolean Constraint to stay within the image bounds while editing +SpaceUVEditor.draw_modified_edges -> show_modified_edges: boolean Draw edges after modifiers are applied +SpaceUVEditor.draw_other_objects -> show_other_objects: boolean Draw other selected objects that share the same image +SpaceUVEditor.draw_smooth_edges -> show_smooth_edges: boolean Draw UV edges anti-aliased +SpaceUVEditor.draw_stretch -> show_stretch: boolean Draw faces colored according to the difference in shape between UVs and their 3D coordinates (blue for low distortion, red for high distortion) +SpaceUVEditor.live_unwrap -> use_live_unwrap: boolean Continuously unwrap the selected UV island while transforming pinned vertices +SpaceUVEditor.normalized_coordinates -> show_normalized_coordinates: boolean Display UV coordinates from 0.0 to 1.0 rather than in pixels +SpaceUVEditor.snap_to_pixels -> use_snap_to_pixels: boolean Snap UVs to pixel locations while editing +SpaceView3D.all_object_origins -> show_all_objects_origin: boolean Show the object origin center dot for all (selected and unselected) objects +SpaceView3D.display_background_images -> show_background_images: boolean Display reference images behind objects in the 3D View +SpaceView3D.display_floor -> show_floor: boolean Show the ground plane grid in perspective view +SpaceView3D.display_render_override -> show_only_render: boolean Display only objects which will be rendered +SpaceView3D.display_x_axis -> show_axis_x: boolean Show the X axis line in perspective view +SpaceView3D.display_y_axis -> show_axis_y: boolean Show the Y axis line in perspective view +SpaceView3D.display_z_axis -> show_axis_z: boolean Show the Z axis line in perspective view +SpaceView3D.layers -> layer: boolean Layers visible in this 3D View +SpaceView3D.lock_camera_and_layers -> lock_camera_and_layers: boolean Use the scene's active camera and layers in this view, rather than local layers +SpaceView3D.manipulator -> use_manipulator: boolean Use a 3D manipulator widget for controlling transforms +SpaceView3D.manipulator_rotate -> use_manipulator_rotate: boolean Use the manipulator for rotation transformations +SpaceView3D.manipulator_scale -> use_manipulator_scale: boolean Use the manipulator for scale transformations +SpaceView3D.manipulator_translate -> use_manipulator_translate: boolean Use the manipulator for movement transformations +SpaceView3D.occlude_geometry -> use_occlude_geometry: boolean Limit selection to visible (clipped with depth buffer) +SpaceView3D.outline_selected -> show_outline_selected: boolean Show an outline highlight around selected objects in non-wireframe views +SpaceView3D.pivot_point_align -> use_pivot_point_align: boolean Manipulate object centers only +SpaceView3D.relationship_lines -> show_relationship_lines: boolean Show dashed lines indicating parent or constraint relationships +SpaceView3D.textured_solid -> show_textured_solid: boolean Display face-assigned textures in solid view +SpaceView3D.used_layers -> layer_used: boolean, (read-only) Layers that contain something +SpeedControlSequence.curve_compress_y -> use_curve_compress_y: boolean Scale F-Curve value to get the target frame number, F-Curve value runs from 0.0 to 1.0 +SpeedControlSequence.curve_velocity -> use_curve_velocity: boolean Interpret the F-Curve value as a velocity instead of a frame number +SpeedControlSequence.frame_blending -> use_frame_blend: boolean Blend two frames into the target for a smoother result +Spline.bezier_u -> use_bezier_u: boolean Make this nurbs curve or surface act like a bezier spline in the U direction (Order U must be 3 or 4, Cyclic U must be disabled) +Spline.bezier_v -> use_bezier_v: boolean Make this nurbs surface act like a bezier spline in the V direction (Order V must be 3 or 4, Cyclic V must be disabled) +Spline.cyclic_u -> use_cyclic_u: boolean Make this curve or surface a closed loop in the U direction +Spline.cyclic_v -> use_cyclic_v: boolean Make this surface a closed loop in the V direction +Spline.endpoint_u -> use_endpoint_u: boolean Make this nurbs curve or surface meet the endpoints in the U direction (Cyclic U must be disabled) +Spline.endpoint_v -> use_endpoint_v: boolean Make this nurbs surface meet the endpoints in the V direction (Cyclic V must be disabled) +Spline.hide -> hide: boolean Hide this curve in editmode +Spline.smooth -> use_smooth: boolean Smooth the normals of the surface or beveled curve +SplineIKConstraint.chain_offset -> use_chain_offset: boolean Offset the entire chain relative to the root joint +SplineIKConstraint.even_divisions -> use_even_divisions: boolean Ignore the relative lengths of the bones when fitting to the curve +SplineIKConstraint.use_curve_radius -> use_curve_radius: boolean Average radius of the endpoints is used to tweak the X and Z Scaling of the bones, on top of XZ Scale mode +SplineIKConstraint.y_stretch -> use_y_stretch: boolean Stretch the Y axis of the bones to fit the curve +SplinePoint.hidden -> hide: boolean Visibility status +SplinePoint.selected -> select_control_point: boolean Selection status +SpotLamp.auto_clip_end -> use_auto_clip_end: boolean Automatic calculation of clipping-end, based on visible vertices +SpotLamp.auto_clip_start -> use_auto_clip_start: boolean Automatic calculation of clipping-start, based on visible vertices +SpotLamp.halo -> use_halo: boolean Renders spotlight with a volumetric halo (Buffer Shadows) +SpotLamp.only_shadow -> use_only_shadow: boolean Causes light to cast shadows only without illuminating objects +SpotLamp.shadow_layer -> use_shadow_layer: boolean Causes only objects on the same layer to cast shadows +SpotLamp.show_cone -> show_cone: boolean Draw transparent cone in 3D view to visualize which objects are contained in it +SpotLamp.sphere -> use_sphere: boolean Sets light intensity to zero beyond lamp distance +SpotLamp.square -> use_square: boolean Casts a square spot light shape +StateActuator.state -> state: boolean +SubsurfModifier.optimal_display -> show_only_control_edges: boolean Skip drawing/rendering of interior subdivided edges +SubsurfModifier.subsurf_uv -> use_subsurf_uv: boolean Use subsurf to subdivide UVs +SunLamp.only_shadow -> use_only_shadow: boolean Causes light to cast shadows only without illuminating objects +SunLamp.shadow_layer -> use_shadow_layer: boolean Causes only objects on the same layer to cast shadows +SurfaceCurve.map_along_length -> use_map_along_length: boolean Generate texture mapping coordinates following the curve direction, rather than the local bounding box +SurfaceCurve.vertex_normal_flip -> use_vertex_normal_flip: boolean Flip vertex normals towards the camera during render +TexMapping.has_maximum -> use_max: boolean Whether to use maximum clipping value +TexMapping.has_minimum -> use_min: boolean Whether to use minimum clipping value +Text.dirty -> is_dirty: boolean, (read-only) Text file has been edited since last save +Text.memory -> is_in_memory: boolean, (read-only) Text file is in memory, without a corresponding file on disk +Text.modified -> is_modified: boolean, (read-only) Text file on disk is different than the one in memory +Text.tabs_as_spaces -> use_tabs_as_spaces: boolean Automatically converts all new tabs into spaces +Text.use_module -> use_module: boolean Register this text as a module on loading, Text name must end with '.py' +TextCharacterFormat.bold -> use_bold: boolean +TextCharacterFormat.italic -> use_italic: boolean +TextCharacterFormat.style -> use_style: boolean +TextCharacterFormat.underline -> use_underline: boolean +TextCharacterFormat.wrap -> use_wrap: boolean +TextCurve.fast -> use_fast_editing: boolean Don't fill polygons while editing +TextCurve.map_along_length -> use_map_along_length: boolean Generate texture mapping coordinates following the curve direction, rather than the local bounding box +TextCurve.vertex_normal_flip -> use_vertex_normal_flip: boolean Flip vertex normals towards the camera during render +TextMarker.edit_all -> use_edit_all: boolean, (read-only) Edit all markers of the same group as one +TextMarker.temporary -> is_temporary: boolean, (read-only) Marker is temporary +Texture.use_color_ramp -> use_color_ramp: boolean Toggle color ramp operations +Texture.use_nodes -> use_nodes: boolean Make this a node-based texture +Texture.use_preview_alpha -> use_preview_alpha: boolean Show Alpha in Preview Render +TextureNodeMixRGB.alpha -> use_alpha: boolean Include alpha of second input in this operation +TextureSlot.negate -> invert: boolean Inverts the values of the texture to reverse its effect +TextureSlot.rgb_to_intensity -> use_rgb_to_intensity: boolean Converts texture RGB values to intensity (gray) values +TextureSlot.stencil -> use_stencil: boolean Use this texture as a blending value on the next texture +ThemeBoneColorSet.colored_constraints -> show_colored_constraints: boolean Allow the use of colors indicating constraints/keyed status +ThemeWidgetColors.shaded -> show_shaded: boolean +TimelineMarker.selected -> select: boolean Marker selection state +ToolSettings.auto_normalize -> use_auto_normalize: boolean Ensure all bone-deforming vertex groups add up to 1.0 while weight painting +ToolSettings.automerge_editing -> use_automerge_editing: boolean Automatically merge vertices moved to the same location +ToolSettings.bone_sketching -> use_bone_sketching: boolean DOC BROKEN +ToolSettings.etch_autoname -> use_etch_autoname: boolean DOC BROKEN +ToolSettings.etch_overdraw -> use_etch_overdraw: boolean DOC BROKEN +ToolSettings.etch_quick -> use_etch_quick: boolean DOC BROKEN +ToolSettings.mesh_selection_mode -> mesh_selection_mode: boolean Which mesh elements selection works on +ToolSettings.record_with_nla -> use_record_with_nla: boolean Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking +ToolSettings.snap -> use_snap: boolean Snap during transform +ToolSettings.snap_align_rotation -> use_snap_align_rotation: boolean Align rotation with the snapping target +ToolSettings.snap_peel_object -> use_snap_peel_object: boolean Consider objects as whole when finding volume center +ToolSettings.snap_project -> use_snap_project: boolean Project vertices on the surface of other objects +ToolSettings.use_auto_keying -> use_keyframe_insert_auto: boolean Automatic keyframe insertion for Objects and Bones +ToolSettings.uv_local_view -> show_local_view: boolean Draw only faces with the currently displayed image assigned +ToolSettings.uv_sync_selection -> use_uv_sync_selection: boolean Keep UV and edit mode mesh selection in sync +TrackToConstraint.target_z -> use_target_z: boolean Target's Z axis, not World Z axis, will constraint the Up direction +TransformConstraint.extrapolate_motion -> use_motion_extrapolate: boolean Extrapolate ranges +TransformSequence.uniform_scale -> use_uniform_scale: boolean Scale uniformly, preserving aspect ratio +UILayout.active -> show_active: boolean +UILayout.enabled -> show_enabled: boolean +UVProjectModifier.override_image -> use_image_override: boolean Override faces' current images with the given image +UnitSettings.use_separate -> use_separate: boolean Display units in pairs +UserPreferencesEdit.auto_keyframe_insert_available -> use_keyframe_insert_available: boolean Automatic keyframe insertion in available curves +UserPreferencesEdit.auto_keyframe_insert_keyingset -> use_keyframe_insert_keyingset: boolean Automatic keyframe insertion using active Keying Set +UserPreferencesEdit.drag_immediately -> use_drag_immediately: boolean Moving things with a mouse drag confirms when releasing the button +UserPreferencesEdit.duplicate_action -> use_duplicate_action: boolean Causes actions to be duplicated with the object +UserPreferencesEdit.duplicate_armature -> use_duplicate_armature: boolean Causes armature data to be duplicated with the object +UserPreferencesEdit.duplicate_curve -> use_duplicate_curve: boolean Causes curve data to be duplicated with the object +UserPreferencesEdit.duplicate_fcurve -> use_duplicate_fcurve: boolean Causes F-curve data to be duplicated with the object +UserPreferencesEdit.duplicate_lamp -> use_duplicate_lamp: boolean Causes lamp data to be duplicated with the object +UserPreferencesEdit.duplicate_material -> use_duplicate_material: boolean Causes material data to be duplicated with the object +UserPreferencesEdit.duplicate_mesh -> use_duplicate_mesh: boolean Causes mesh data to be duplicated with the object +UserPreferencesEdit.duplicate_metaball -> use_duplicate_metaball: boolean Causes metaball data to be duplicated with the object +UserPreferencesEdit.duplicate_particle -> use_duplicate_particle: boolean Causes particle systems to be duplicated with the object +UserPreferencesEdit.duplicate_surface -> use_duplicate_surface: boolean Causes surface data to be duplicated with the object +UserPreferencesEdit.duplicate_text -> use_duplicate_text: boolean Causes text data to be duplicated with the object +UserPreferencesEdit.duplicate_texture -> use_duplicate_texture: boolean Causes texture data to be duplicated with the object +UserPreferencesEdit.enter_edit_mode -> use_enter_edit_mode: boolean Enter Edit Mode automatically after adding a new object +UserPreferencesEdit.global_undo -> use_global_undo: boolean Global undo works by keeping a full copy of the file itself in memory, so takes extra memory +UserPreferencesEdit.grease_pencil_simplify_stroke -> use_grease_pencil_simplify_stroke: boolean Simplify the final stroke +UserPreferencesEdit.grease_pencil_smooth_stroke -> use_grease_pencil_smooth_stroke: boolean Smooth the final stroke +UserPreferencesEdit.insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis +UserPreferencesEdit.keyframe_insert_needed -> use_keyframe_insert_needed: boolean Keyframe insertion only when keyframe needed +UserPreferencesEdit.use_auto_keying -> use_auto_keying: boolean Automatic keyframe insertion for Objects and Bones +UserPreferencesEdit.use_negative_frames -> use_negative_frames: boolean Current frame number can be manually set to a negative value +UserPreferencesEdit.use_visual_keying -> use_visual_keying: boolean Use Visual keying automatically for constrained objects +UserPreferencesFilePaths.auto_save_temporary_files -> use_auto_save_temporary_files: boolean Automatic saving of temporary files +UserPreferencesFilePaths.compress_file -> use_file_compression: boolean Enable file compression when saving .blend files +UserPreferencesFilePaths.filter_file_extensions -> use_filter_files: boolean Display only files with extensions in the image select window +UserPreferencesFilePaths.hide_dot_files_datablocks -> show_hidden_files_datablocks: boolean Hide files/datablocks that start with a dot(.*) +UserPreferencesFilePaths.load_ui -> use_load_ui: boolean Load user interface setup when loading .blend files +UserPreferencesFilePaths.save_preview_images -> use_save_preview_images: boolean Enables automatic saving of preview images in the .blend file +UserPreferencesFilePaths.use_relative_paths -> use_relative_paths: boolean Default relative path option for the file selector +UserPreferencesInput.continuous_mouse -> use_continuous_mouse: boolean Allow moving the mouse outside the view on some manipulations (transform, ui control drag) +UserPreferencesInput.emulate_3_button_mouse -> use_emulate_3_button_mouse: boolean Emulates Middle Mouse with Alt+LeftMouse (doesn't work with Left Mouse Select option) +UserPreferencesInput.emulate_numpad -> use_emulate_numpad: boolean Causes the 1 to 0 keys to act as the numpad (useful for laptops) +UserPreferencesInput.invert_zoom_direction -> invert_zoom_direction: boolean Invert the axis of mouse movement for zooming +UserPreferencesSystem.auto_execute_scripts -> use_scripts_auto_execute: boolean Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source) +UserPreferencesSystem.enable_all_codecs -> use_preview_images: boolean Enables automatic saving of preview images in the .blend file (Windows only) +UserPreferencesSystem.international_fonts -> use_international_fonts: boolean Use international fonts +UserPreferencesSystem.tabs_as_spaces -> use_tabs_as_spaces: boolean Automatically converts all new tabs into spaces for new and loaded text files +UserPreferencesSystem.translate_buttons -> use_translate_buttons: boolean Translate button labels +UserPreferencesSystem.translate_toolbox -> use_translate_toolbox: boolean Translate toolbox menu +UserPreferencesSystem.translate_tooltips -> use_translate_tooltips: boolean Translate Tooltips +UserPreferencesSystem.use_antialiasing -> use_antialiasing: boolean Use anti-aliasing for the 3D view (may impact redraw performance) +UserPreferencesSystem.use_mipmaps -> use_mipmaps: boolean Scale textures for the 3D View (looks nicer but uses more memory and slows image reloading) +UserPreferencesSystem.use_textured_fonts -> use_textured_fonts: boolean Use textures for drawing international fonts +UserPreferencesSystem.use_vbos -> use_vertex_buffer_objects: boolean Use Vertex Buffer Objects (or Vertex Arrays, if unsupported) for viewport rendering +UserPreferencesSystem.use_weight_color_range -> use_weight_color_range: boolean Enable color range used for weight visualization in weight painting mode +UserPreferencesView.auto_depth -> use_mouse_auto_depth: boolean Use the depth under the mouse to improve view pan/rotate/zoom functionality +UserPreferencesView.auto_perspective -> use_auto_perspective: boolean Automatically switch between orthographic and perspective when changing from top/front/side views +UserPreferencesView.directional_menus -> use_directional_menus: boolean Otherwise menus, etc will always be top to bottom, left to right, no matter opening direction +UserPreferencesView.display_object_info -> show_object_info: boolean Display objects name and frame number in 3D view +UserPreferencesView.global_pivot -> use_global_pivot: boolean Lock the same rotation/scaling pivot in all 3D Views +UserPreferencesView.global_scene -> use_global_scene: boolean Forces the current Scene to be displayed in all Screens +UserPreferencesView.open_mouse_over -> use_mouse_over_open: boolean Open menu buttons and pulldowns automatically when the mouse is hovering +UserPreferencesView.rotate_around_selection -> use_rotate_around_selection: boolean Use selection as the pivot point +UserPreferencesView.show_mini_axis -> show_mini_axis: boolean Show a small rotating 3D axis in the bottom left corner of the 3D View +UserPreferencesView.show_playback_fps -> show_playback_fps: boolean Show the frames per second screen refresh rate, while animation is played back +UserPreferencesView.show_splash -> show_splash: boolean Display splash screen on startup +UserPreferencesView.show_view_name -> show_view_name: boolean Show the name of the view's direction in each 3D View +UserPreferencesView.tooltips -> show_tooltips: boolean Display tooltips +UserPreferencesView.use_column_layout -> show_column_layout: boolean Use a column layout for toolbox +UserPreferencesView.use_large_cursors -> show_large_cursors: boolean Use large mouse cursors when available +UserPreferencesView.use_manipulator -> show_manipulator: boolean Use 3D transform manipulator +UserPreferencesView.use_middle_mouse_paste -> use_mouse_mmb_paste: boolean In text window, paste with middle mouse button instead of panning +UserPreferencesView.wheel_invert_zoom -> invert_mouse_wheel_zoom: boolean Swap the Mouse Wheel zoom direction +UserPreferencesView.zoom_to_mouse -> use_zoom_to_mouse: boolean Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center +UserSolidLight.enabled -> use: boolean Enable this OpenGL light in solid draw mode +VertexPaint.all_faces -> use_all_faces: boolean Paint on all faces inside brush +VertexPaint.normals -> use_normal: boolean Applies the vertex normal before painting +VertexPaint.spray -> use_spray: boolean Keep applying paint effect while holding mouse +VisibilityActuator.children -> apply_to_children: boolean Set all the children of this object to the same visibility/occlusion recursively +VisibilityActuator.occlusion -> use_occlusion: boolean Set the object to occlude objects behind it. Initialized from the object type in physics button +VisibilityActuator.visible -> use_visible: boolean Set the objects visible. Initialized from the objects render restriction toggle (access in the outliner) +VoxelData.still -> use_still_frame: boolean Always render a still frame from the voxel data sequence +WaveModifier.cyclic -> use_cyclic: boolean Cyclic wave effect +WaveModifier.normals -> use_normal: boolean Displace along normal +WaveModifier.x -> use_x: boolean X axis motion +WaveModifier.x_normal -> use_normal_x: boolean Enable displacement along the X normal +WaveModifier.y -> use_y: boolean Y axis motion +WaveModifier.y_normal -> use_normal_y: boolean Enable displacement along the Y normal +WaveModifier.z_normal -> use_normal_z: boolean Enable displacement along the Z normal +World.blend_sky -> use_sky_blend: boolean Render background with natural progression from horizon to zenith +World.paper_sky -> use_sky_paper: boolean Flatten blend or texture coordinates +World.real_sky -> use_sky_real: boolean Render background with a real horizon, relative to the camera angle +WorldLighting.falloff -> use_falloff: boolean +WorldLighting.pixel_cache -> use_cache: boolean Cache AO results in pixels and interpolate over neighbouring pixels for speedup (for Approximate) +WorldLighting.use_ambient_occlusion -> use_ambient_occlusian: boolean Use Ambient Occlusion to add shadowing based on distance between objects +WorldLighting.use_environment_lighting -> use_environment_lighting: boolean Add light coming from the environment +WorldLighting.use_indirect_lighting -> use_indirect_lighting: boolean Add indirect light bouncing of surrounding objects +WorldMistSettings.use_mist -> use_mist: boolean Occlude objects with the environment color as they are further away +WorldStarsSettings.use_stars -> use_stars: boolean Enable starfield generation +WorldTextureSlot.map_blend -> use_map_blend: boolean Affect the color progression of the background +WorldTextureSlot.map_horizon -> use_map_horizon: boolean Affect the color of the horizon +WorldTextureSlot.map_zenith_down -> use_map_zenith_down: boolean Affect the color of the zenith below +WorldTextureSlot.map_zenith_up -> use_map_zenith_up: boolean Affect the color of the zenith above diff --git a/source/blender/makesrna/rna_cleanup/rna_cleaner.py b/source/blender/makesrna/rna_cleanup/rna_cleaner.py new file mode 100755 index 00000000000..f39ee586237 --- /dev/null +++ b/source/blender/makesrna/rna_cleanup/rna_cleaner.py @@ -0,0 +1,290 @@ +#! /usr/bin/env python3.1 + +""" +This script is used to help cleaning RNA api. + +Typical line in the input file (elements in [] are optional). + +[comment *] ToolSettings.snap_align_rotation -> use_snap_align_rotation: boolean [Align rotation with the snapping target] +""" + + +def font_bold(mystring): + """ + Formats the string as bold, to be used in printouts. + """ + font_bold = "\033[1m" + font_reset = "\033[0;0m" + return font_bold + mystring + font_reset + + +def usage(): + """ + Prints script usage. + """ + import sys + scriptname = sys.argv[0] + sort_choices_string = '|'.join(sort_choices) + message = "\nUSAGE:" + message += "\n%s input-file (.txt|.py) order-priority (%s).\n" % (font_bold(scriptname), sort_choices_string) + message += "%s -h for help\n" % font_bold(scriptname) + print(message) + exit() + + +def help(): + """ + Prints script' help. + """ + message = '\nHELP:' + message += '\nRun this script to re-format the edits you make in the input file.\n' + message += 'Do quick modification to important fields like \'to\' and don\'t care about fields like \'changed\' or \'description\' and save.\n' + message += 'The script outputs 3 files:\n' + message += ' 1) *_clean.txt: is formatted same as the .txt input, can be edited by user.\n' + message += ' 2) *_clean.py: is formatted same as the .py input, can be edited by user.\n' + message += ' 3) rna_api.py is not formatted for readability and go under complete check. Can be used for rna cleanup.\n' + print(message) + usage() + + +def check_commandline(): + """ + Takes parameters from the commandline. + """ + import sys + # Usage + if len(sys.argv)==1 or len(sys.argv)>3: + usage() + if sys.argv[1] == '-h': + help() + elif not (sys.argv[1].endswith(".txt") or sys.argv[1].endswith(".py")): + print ('\nBad input file extension... exiting.') + usage() + else: + inputfile = sys.argv[1] + if len(sys.argv) == 2: + sort_priority = default_sort_choice + print ('\nSecond parameter missing: choosing to order by %s.' % font_bold(sort_priority)) + elif len(sys.argv)==3: + sort_priority = sys.argv[2] + if sort_priority not in sort_choices: + print('\nWrong sort_priority... exiting.') + usage() + return (inputfile, sort_priority) + + +def check_prefix(prop): + # reminder: props=[comment, changed, bclass, bfrom, bto, kwcheck, btype, description] + if '_' in prop: + prefix = prop.split('_')[0] + if prefix not in kw_prefixes: + return 'BAD-PREFIX: ' + prefix + else: + return prefix + '_' + elif prop in kw: + return 'SPECIAL-KEYWORD: ' + prop + else: + return 'BAD-KEYWORD: ' + prop + + +def check_if_changed(a,b): + if a != b: return 'changed' + else: return 'same' + + +def get_props_from_txt(input_filename): + """ + If the file is *.txt, the script assumes it is formatted as outlined in this script docstring + """ + + file=open(input_filename,'r') + file_lines=file.readlines() + file.close() + + props_list=[] + props_length_max=[0,0,0,0,0,0,0,0] + for line in file_lines: + + # debug + #print(line) + + # empty line or comment + if not line.strip() or line.startswith('#'): + continue + + # class + [bclass, tail] = [x.strip() for x in line.split('.', 1)] + + # comment + if '*' in bclass: + [comment, bclass] = [x.strip() for x in bclass.split('*', 1)] + else: + comment= '' + + # skipping the header if we have one. + # the header is assumed to be "NOTE * CLASS.FROM -> TO: TYPE DESCRIPTION" + if comment == 'NOTE' and bclass == 'CLASS': + continue + + # from + [bfrom, tail] = [x.strip() for x in tail.split('->', 1)] + + # to + [bto, tail] = [x.strip() for x in tail.split(':', 1)] + + # type, description + try: + [btype, description] = tail.split(None, 1) + if '"' in description: + description.replace('"', "'") + except ValueError: + [btype, description] = [tail,'NO DESCRIPTION'] + + # keyword-check + kwcheck = check_prefix(bto) + + # changed + changed = check_if_changed(bfrom, bto) + + # lists formatting + props=[comment, changed, bclass, bfrom, bto, kwcheck, btype, repr(description)] + props_list.append(props) + props_length_max=list(map(max,zip(props_length_max,list(map(len,props))))) + + return (props_list,props_length_max) + + +def get_props_from_py(input_filename): + """ + If the file is *.py, the script assumes it contains a python list (as "rna_api=[...]") + This means that this script executes the text in the py file with an exec(text). + """ + # adds the list "rna_api" to this function's scope + rna_api = __import__(input_filename[:-3]).rna_api + + props_length_max = [0 for i in rna_api[0]] # this way if the vector will take more elements we are safe + for index,props in enumerate(rna_api): + comment, changed, bclass, bfrom, bto, kwcheck, btype, description = props + kwcheck = check_prefix(bto) # keyword-check + changed = check_if_changed(bfrom, bto) # changed? + description = repr(description) + rna_api[index] = [comment, changed, bclass, bfrom, bto, kwcheck, btype, description] + props_length = list(map(len,props)) # lengths + props_length_max = list(map(max,zip(props_length_max,props_length))) # max lengths + return (rna_api,props_length_max) + + +def get_props(input_filename): + if input_filename.endswith(".txt"): + props_list,props_length_max = get_props_from_txt(input_filename) + elif input_filename.endswith(".py"): + props_list,props_length_max = get_props_from_py(input_filename) + return (props_list,props_length_max) + + +def sort(props_list, sort_priority): + """ + reminder + props=[comment, changed, bclass, bfrom, bto, kwcheck, btype, description] + """ + + # order based on the i-th element in lists + i = sort_choices.index(sort_priority) + if i == 0: + props_list = sorted(props_list, key=lambda p: p[i], reverse=True) + else: + props_list = sorted(props_list, key=lambda p: p[i]) + + print ('\nSorted by %s.' % font_bold(sort_priority)) + return props_list + + +def file_basename(input_filename): + # if needed will use os.path + if input_filename.endswith(".txt"): + if input_filename.endswith("_work.txt"): + base_filename = input_filename.replace("_work.txt", "") + else: + base_filename = input_filename.replace(".txt", "") + elif input_filename.endswith(".py"): + if input_filename.endswith("_work.py"): + base_filename = input_filename.replace("_work.py", "") + else: + base_filename = input_filename.replace(".py", "") + + return base_filename + + +def write_files(basename, props_list, props_length_max): + """ + Writes in 3 files: + * output_filename_work.txt: formatted as txt input file (can be edited) + * output_filename_work.py: formatted for readability (can be edited) + * rna_api.py: unformatted, just as final output + """ + + f_rna = open("rna_api.py",'w') + f_txt = open(basename + '_work.txt','w') + f_py = open(basename + '_work.py','w') + + # reminder: props=[comment, changed, bclass, bfrom, bto, kwcheck, btype, description] + # [comment *] ToolSettings.snap_align_rotation -> use_snap_align_rotation: boolean [Align rotation with the snapping target] + rna = py = txt = '' + props_list = [['NOTE', 'CHANGED', 'CLASS', 'FROM', 'TO', 'KEYWORD-CHECK', 'TYPE', 'DESCRIPTION']] + props_list + for props in props_list: + #txt + if props[0] != '': txt += '%s * ' % props[0] # comment + txt += '%s.%s -> %s: %s %s\n' % tuple(props[2:5] + props[6:]) # skipping keyword-check + # rna_api + if props[0] == 'NOTE': indent = '# ' + else: indent = ' ' + rna += indent + '("%s", "%s", "%s", "%s", %s),\n' % tuple(props[2:5] + props[6:]) # description is alredy string formatted + # py + blanks = [' '* (x[0]-x[1]) for x in zip(props_length_max,list(map(len,props)))] + props = [('"%s"%s' if props[-1] != x[0] else "%s%s") % (x[0],x[1]) for x in zip(props,blanks)] + py += indent + '(%s, %s, %s, %s, %s, %s, %s, %s),\n' % tuple(props) + + f_txt.write(txt) + f_py.write("rna_api = [\n%s]\n" % py) + f_rna.write("rna_api = [\n%s]\n" % rna) + + # write useful py script, wont hurt + f_py.write("\n'''\n") + f_py.write("for p_note, p_changed, p_class, p_from, p_to, p_check, p_type, p_desc in rna_api:\n") + f_py.write(" print(p_to)\n") + f_py.write("\n'''\n") + + f_txt.close() + f_py.close() + f_rna.close() + + print ('\nSaved %s, %s and %s.\n' % (font_bold(f_txt.name), font_bold(f_py.name), font_bold(f_rna.name) ) ) + + +def main(): + + global sort_choices, default_sort_choice + global kw_prefixes, kw + + sort_choices = ['note','changed','class','from','to','kw'] + default_sort_choice = sort_choices[0] + #kw_prefixes = ['invert','is','lock','show','show_only','use','use_only'] + #kw = ['hide','select','layer','state'] + kw_prefixes = ['has','invert','is','lock','layers','show','show_only','states','use','use_only'] + kw = ['layers','states','value'] + + input_filename, sort_priority = check_commandline() + props_list,props_length_max = get_props(input_filename) + props_list = sort(props_list,sort_priority) + + output_basename = file_basename(input_filename) + write_files(output_basename, props_list,props_length_max) + + +if __name__=='__main__': + import sys + if not sys.version.startswith("3"): + print("Incorrect python version, use python 3!") + else: + main() + diff --git a/source/blender/makesrna/rna_cleanup/rna_properties.txt b/source/blender/makesrna/rna_cleanup/rna_properties.txt new file mode 100644 index 00000000000..0c0b7e1070b --- /dev/null +++ b/source/blender/makesrna/rna_cleanup/rna_properties.txt @@ -0,0 +1,3190 @@ +Action.fcurves -> fcurves: collection, (read-only) The individual F-Curves that make up the Action +Action.groups -> groups: collection, (read-only) Convenient groupings of F-Curves +Action.pose_markers -> pose_markers: collection, (read-only) Markers specific to this Action, for labeling poses +ActionActuator.action -> action: pointer +ActionActuator.blendin -> blendin: int Number of frames of motion blending +ActionActuator.frame_end -> frame_end: int +ActionActuator.frame_property -> frame_property: string Assign the action's current frame number to this property +ActionActuator.frame_start -> frame_start: int +ActionActuator.mode -> mode: enum Action playback type +ActionActuator.priority -> priority: int Execution priority - lower numbers will override actions with higher numbers. With 2 or more actions at once, the overriding channels must be lower in the stack +ActionActuator.property -> property: string Use this property to define the Action position +ActionConstraint.action -> action: pointer +ActionConstraint.frame_end -> frame_end: int Last frame of the Action to use +ActionConstraint.frame_start -> frame_start: int First frame of the Action to use +ActionConstraint.maximum -> max: float Maximum value for target channel range +ActionConstraint.minimum -> min: float Minimum value for target channel range +ActionConstraint.subtarget -> subtarget: string +ActionConstraint.target -> target: pointer Target Object +ActionConstraint.transform_channel -> transform_channel: enum Transformation channel from the target that is used to key the Action +ActionGroup.channels -> channels: collection, (read-only) F-Curves in this group +ActionGroup.custom_color -> custom_color: int Index of custom color set +ActionGroup.name -> name: string +Actuator.name -> name: string +Actuator.type -> type: enum +ActuatorSensor.actuator -> actuator: string Actuator name, actuator active state modifications will be detected +Addon.module -> module: string Module name +AnimData.action -> action: pointer Active Action for this datablock +AnimData.action_blending -> action_blend_type: enum Method used for combining Active Action's result with result of NLA stack +AnimData.action_extrapolation -> action_extrapolation: enum Action to take for gaps past the Active Action's range (when evaluating with NLA) +AnimData.action_influence -> action_influence: float Amount the Active Action contributes to the result of the NLA stack +AnimData.drivers -> drivers: collection, (read-only) The Drivers/Expressions for this datablock +AnimData.nla_tracks -> nla_tracks: collection, (read-only) NLA Tracks (i.e. Animation Layers) +AnimViz.motion_paths -> motion_paths: pointer, (read-only) Motion Path settings for visualisation +AnimViz.onion_skinning -> onion_skin_frames: pointer, (read-only) Onion Skinning (ghosting) settings for visualisation +AnimVizMotionPaths.after_current -> after_current: int Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method) +AnimVizMotionPaths.bake_location -> bake_location: enum When calculating Bone Paths, use Head or Tips +AnimVizMotionPaths.before_current -> before_current: int Number of frames to show before the current frame (only for 'Around Current Frame' Onion-skinning method) +AnimVizMotionPaths.frame_end -> frame_end: int End frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method) +AnimVizMotionPaths.frame_start -> frame_start: int Starting frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method) +AnimVizMotionPaths.frame_step -> frame_step: int Number of frames between paths shown (not for 'On Keyframes' Onion-skinning method) +AnimVizMotionPaths.type -> type: enum Type of range to show for Motion Paths +AnimVizOnionSkinning.after_current -> after_current: int Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method) +AnimVizOnionSkinning.before_current -> before_current: int Number of frames to show before the current frame (only for 'Around Current Frame' Onion-skinning method) +AnimVizOnionSkinning.frame_end -> frame_end: int End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method) +AnimVizOnionSkinning.frame_start -> frame_start: int Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method) +AnimVizOnionSkinning.frame_step -> frame_step: int Number of frames between ghosts shown (not for 'On Keyframes' Onion-skinning method) +AnimVizOnionSkinning.type -> type: enum Method used for determining what ghosts get drawn +Area.active_space -> active_space: pointer, (read-only) Space currently being displayed in this area +Area.regions -> regions: collection, (read-only) Regions this area is subdivided in +Area.spaces -> spaces: collection, (read-only) Spaces contained in this area, the first space is active +Area.type -> type: enum Space type +AreaLamp.gamma -> gamma: float Light gamma correction value +AreaLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float Threshold for Adaptive Sampling (Raytraced shadows) +AreaLamp.shadow_color -> shadow_color: float Color of shadows cast by the lamp +AreaLamp.shadow_method -> shadow_method: enum Method to compute lamp shadow with +AreaLamp.shadow_ray_samples_x -> shadow_ray_samples_x: int Amount of samples taken extra (samples x samples) +AreaLamp.shadow_ray_samples_y -> shadow_ray_samples_y: int Amount of samples taken extra (samples x samples) +AreaLamp.shadow_ray_sampling_method -> shadow_ray_sample_method: enum Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower +AreaLamp.shadow_soft_size -> shadow_soft_size: float Light size for ray shadow sampling (Raytraced shadows) +AreaLamp.shape -> shape: enum Shape of the area lamp +AreaLamp.size -> size: float Size of the area of the area Lamp, X direction size for Rectangle shapes +AreaLamp.size_y -> size_y: float Size of the area of the area Lamp in the Y direction for Rectangle shapes +Armature.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Armature.bones -> bones: collection, (read-only) +Armature.drawtype -> drawtype: enum +Armature.edit_bones -> edit_bones: collection, (read-only) +Armature.ghost_frame_end -> ghost_frame_end: int End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method) +Armature.ghost_frame_start -> ghost_frame_start: int Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method) +Armature.ghost_size -> ghost_size: int Frame step for Ghosts (not for 'On Keyframes' Onion-skinning method) +Armature.ghost_step -> ghost_step: int Number of frame steps on either side of current frame to show as ghosts (only for 'Around Current Frame' Onion-skinning method) +Armature.ghost_type -> ghost_type: enum Method of Onion-skinning for active Action +Armature.pose_position -> pose_position: enum Show armature in binding pose or final posed state +ArmatureActuator.bone -> bone: string Bone on which the constraint is defined +ArmatureActuator.constraint -> constraint: string Name of the constraint you want to control +ArmatureActuator.mode -> mode: enum +ArmatureActuator.secondary_target -> secondary_target: pointer Set weight of this constraint +ArmatureActuator.target -> target: pointer Set this object as the target of the constraint +ArmatureActuator.weight -> weight: float Set weight of this constraint +ArmatureBones.active -> active: pointer Armatures active bone +ArmatureEditBones.active -> active: pointer Armatures active edit bone +ArmatureModifier.object -> object: pointer Armature object to deform with +ArmatureModifier.vertex_group -> vertex_group: string Vertex group name +ArmatureSensor.bone -> bone: string Identify the bone to check value from +ArmatureSensor.constraint -> constraint: string Identify the bone constraint to check value from +ArmatureSensor.test_type -> test_type: enum Type of value and test +ArmatureSensor.value -> value: float Specify value to be used in comparison +ArrayModifier.constant_offset_displacement -> constant_offset_displacement: float +ArrayModifier.count -> count: int Number of duplicates to make +ArrayModifier.curve -> curve: pointer Curve object to fit array length to +ArrayModifier.end_cap -> end_cap: pointer Mesh object to use as an end cap +ArrayModifier.fit_type -> fit_type: enum Array length calculation method +ArrayModifier.length -> length: float Length to fit array within +ArrayModifier.merge_distance -> merge_distance: float Limit below which to merge vertices +ArrayModifier.offset_object -> offset_object: pointer +ArrayModifier.relative_offset_displacement -> relative_offset_displacement: float +ArrayModifier.start_cap -> start_cap: pointer Mesh object to use as a start cap +BackgroundImage.image -> image: pointer Image displayed and edited in this space +BackgroundImage.image_user -> image_user: pointer, (read-only) Parameters defining which layer, pass and frame of the image is displayed +BackgroundImage.offset_x -> offset_x: float Offsets image horizontally from the world origin +BackgroundImage.offset_y -> offset_y: float Offsets image vertically from the world origin +BackgroundImage.size -> size: float Scaling factor for the background image +BackgroundImage.transparency -> transparency: float Amount to blend the image against the background color +BackgroundImage.view_axis -> view_axis: enum The axis to display the image on +BevelModifier.angle -> angle: float Angle above which to bevel edges +BevelModifier.edge_weight_method -> edge_weight_method: enum What edge weight to use for weighting a vertex +BevelModifier.limit_method -> limit_method: enum +BevelModifier.width -> width: float Bevel value/amount +BezierSplinePoint.co -> co: float Coordinates of the control point +BezierSplinePoint.handle1 -> handle_left: float Coordinates of the first handle +BezierSplinePoint.handle1_type -> handle_left_type: enum Handle types +BezierSplinePoint.handle2 -> handle_right: float Coordinates of the second handle +BezierSplinePoint.handle2_type -> handle_right_type: enum Handle types +BezierSplinePoint.radius -> radius: float, (read-only) Radius for bevelling +BezierSplinePoint.tilt -> tilt: float Tilt in 3D View +BezierSplinePoint.weight -> weight: float Softbody goal weight +BlendTexture.flip_axis -> flip_axis: enum Flips the texture's X and Y axis +BlendTexture.progression -> progression: enum Sets the style of the color blending +BlenderRNA.structs -> structs: collection, (read-only) +BoidRule.name -> name: string Boid rule name +BoidRule.type -> type: enum, (read-only) +BoidRuleAverageSpeed.level -> level: float How much velocity's z-component is kept constant +BoidRuleAverageSpeed.speed -> speed: float Percentage of maximum speed +BoidRuleAverageSpeed.wander -> wander: float How fast velocity's direction is randomized +BoidRuleAvoid.fear_factor -> fear_factor: float Avoid object if danger from it is above this threshold +BoidRuleAvoid.object -> object: pointer Object to avoid +BoidRuleAvoidCollision.look_ahead -> look_ahead: float Time to look ahead in seconds +BoidRuleFight.distance -> distance: float Attack boids at max this distance +BoidRuleFight.flee_distance -> flee_distance: float Flee to this distance +BoidRuleFollowLeader.distance -> distance: float Distance behind leader to follow +BoidRuleFollowLeader.object -> object: pointer Follow this object instead of a boid +BoidRuleFollowLeader.queue_size -> queue_size: int How many boids in a line +BoidRuleGoal.object -> object: pointer Goal object +BoidSettings.accuracy -> accuracy: float Accuracy of attack +BoidSettings.active_boid_state -> active_boid_state: pointer, (read-only) +BoidSettings.active_boid_state_index -> active_boid_state_index: int +BoidSettings.aggression -> aggression: float Boid will fight this times stronger enemy +BoidSettings.air_max_acc -> air_acc_max: float Maximum acceleration in air (relative to maximum speed) +BoidSettings.air_max_ave -> air_ave_max: float Maximum angular velocity in air (relative to 180 degrees) +BoidSettings.air_max_speed -> air_speed_max: float Maximum speed in air +BoidSettings.air_min_speed -> air_speed_min: float Minimum speed in air (relative to maximum speed) +BoidSettings.air_personal_space -> air_personal_space: float Radius of boids personal space in air (% of particle size) +BoidSettings.banking -> bank: float Amount of rotation around velocity vector on turns +BoidSettings.health -> health: float Initial boid health when born +BoidSettings.height -> height: float Boid height relative to particle size +BoidSettings.land_jump_speed -> land_jump_speed: float Maximum speed for jumping +BoidSettings.land_max_acc -> land_acc_max: float Maximum acceleration on land (relative to maximum speed) +BoidSettings.land_max_ave -> land_ave_max: float Maximum angular velocity on land (relative to 180 degrees) +BoidSettings.land_max_speed -> land_speed_max: float Maximum speed on land +BoidSettings.land_personal_space -> land_personal_space: float Radius of boids personal space on land (% of particle size) +BoidSettings.land_stick_force -> land_stick_force: float How strong a force must be to start effecting a boid on land +BoidSettings.landing_smoothness -> land_smooth: float How smoothly the boids land +BoidSettings.range -> range: float The maximum distance from which a boid can attack +BoidSettings.states -> states: collection, (read-only) +BoidSettings.strength -> strength: float Maximum caused damage on attack per second +BoidState.active_boid_rule -> active_boid_rule: pointer, (read-only) +BoidState.active_boid_rule_index -> active_boid_rule_index: int +BoidState.falloff -> falloff: float +BoidState.name -> name: string Boid state name +BoidState.rule_fuzziness -> rule_fuzzy: float +BoidState.rules -> rules: collection, (read-only) +BoidState.ruleset_type -> ruleset_type: enum How the rules in the list are evaluated +BoidState.volume -> volume: float +Bone.bbone_in -> bbone_in: float Length of first Bezier Handle (for B-Bones only) +Bone.bbone_out -> bbone_out: float Length of second Bezier Handle (for B-Bones only) +Bone.bbone_segments -> bbone_segments: int Number of subdivisions of bone (for B-Bones only) +Bone.children -> children: collection, (read-only) Bones which are children of this bone +Bone.envelope_distance -> envelope_distance: float Bone deformation distance (for Envelope deform only) +Bone.envelope_weight -> envelope_weight: float Bone deformation weight (for Envelope deform only) +Bone.head -> head: float Location of head end of the bone relative to its parent +Bone.head_local -> head_local: float Location of head end of the bone relative to armature +Bone.head_radius -> head_radius: float Radius of head of bone (for Envelope deform only) +Bone.matrix -> matrix: float 3x3 bone matrix +Bone.matrix_local -> matrix_local: float 4x4 bone matrix relative to armature +Bone.name -> name: string +Bone.parent -> parent: pointer, (read-only) Parent bone (in same Armature) +Bone.tail -> tail: float Location of tail end of the bone +Bone.tail_local -> tail_local: float Location of tail end of the bone relative to armature +Bone.tail_radius -> tail_radius: float Radius of tail of bone (for Envelope deform only) +BoneGroup.color_set -> color_set: enum Custom color set to use +BoneGroup.colors -> colors: pointer, (read-only) Copy of the colors associated with the group's color set +BoneGroup.name -> name: string +BooleanModifier.object -> object: pointer Mesh object to use for Boolean operation +BooleanModifier.operation -> operation: enum +BooleanProperty.array_length -> array_length: int, (read-only) Maximum length of the array, 0 means unlimited +Brush.blend -> blend: enum Brush blending mode +Brush.clone_alpha -> clone_alpha: float Opacity of clone image display +Brush.clone_image -> clone_image: pointer Image for clone tool +Brush.clone_offset -> clone_offset: float +Brush.color -> color: float +Brush.curve -> curve: pointer, (read-only) Editable falloff curve +Brush.direction -> direction: enum Mapping type to use for this image in the game engine +Brush.imagepaint_tool -> imagepaint_tool: enum +Brush.jitter -> jitter: float Jitter the position of the brush while painting +Brush.rate -> rate: float Interval between paints for Airbrush +Brush.sculpt_tool -> sculpt_tool: enum +Brush.size -> size: int Diameter of the brush +Brush.smooth_stroke_factor -> smooth_stroke_factor: float Higher values give a smoother stroke +Brush.smooth_stroke_radius -> smooth_stroke_radius: int Minimum distance from last point before stroke continues +Brush.spacing -> spacing: float Spacing between brush stamps +Brush.strength -> strength: float The amount of pressure on the brush +Brush.texture -> texture: pointer +Brush.texture_slot -> texture_slot: pointer, (read-only) +Brush.vertexpaint_tool -> vertexpaint_tool: enum +BrushTextureSlot.angle -> angle: float Defines brush texture rotation +BrushTextureSlot.map_mode -> map_mode: enum +BuildModifier.frame_start -> frame_start: float Specify the start frame of the effect +BuildModifier.length -> length: float Specify the total time the build effect requires +BuildModifier.seed -> seed: int Specify the seed for random if used +Camera.angle -> angle: float Perspective Camera lens field of view in degrees +Camera.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Camera.clip_end -> clip_end: float Camera far clipping distance +Camera.clip_start -> clip_start: float Camera near clipping distance +Camera.dof_distance -> dof_distance: float Distance to the focus point for depth of field +Camera.dof_object -> dof_object: pointer Use this object to define the depth of field focal point +Camera.draw_size -> draw_size: float Apparent size of the Camera object in the 3D View +Camera.lens -> lens: float Perspective Camera lens value in millimeters +Camera.lens_unit -> lens_unit: enum Unit to edit lens in for the user interface +Camera.ortho_scale -> ortho_scale: float Orthographic Camera scale (similar to zoom) +Camera.passepartout_alpha -> passepartout_alpha: float Opacity (alpha) of the darkened overlay in Camera view +Camera.shift_x -> shift_x: float Perspective Camera horizontal shift +Camera.shift_y -> shift_y: float Perspective Camera vertical shift +Camera.type -> type: enum Camera types +CameraActuator.axis -> axis: enum Specify the axis the Camera will try to get behind +CameraActuator.height -> height: float +CameraActuator.max -> max: float +CameraActuator.min -> min: float +CameraActuator.object -> object: pointer Look at this Object +CastModifier.cast_type -> cast_type: enum +CastModifier.factor -> factor: float +CastModifier.object -> object: pointer Control object: if available, its location determines the center of the effect +CastModifier.radius -> radius: float Only deform vertices within this distance from the center of the effect (leave as 0 for infinite.) +CastModifier.size -> size: float Size of projection shape (leave as 0 for auto.) +CastModifier.vertex_group -> vertex_group: string Vertex group name +ChildOfConstraint.subtarget -> subtarget: string +ChildOfConstraint.target -> target: pointer Target Object +ClampToConstraint.main_axis -> main_axis: enum Main axis of movement +ClampToConstraint.target -> target: pointer Target Object +ClothCollisionSettings.collision_quality -> collision_quality: int How many collision iterations should be done. (higher is better quality but slower) +ClothCollisionSettings.friction -> friction: float Friction force if a collision happened. (higher = less movement) +ClothCollisionSettings.group -> group: pointer Limit colliders to this Group +ClothCollisionSettings.min_distance -> distance_min: float Minimum distance between collision objects before collision response takes in +ClothCollisionSettings.self_collision_quality -> self_collision_quality: int How many self collision iterations should be done. (higher is better quality but slower) +ClothCollisionSettings.self_friction -> self_friction: float Friction/damping with self contact +ClothCollisionSettings.self_min_distance -> self_distance_min: float 0.5 means no distance at all, 1.0 is maximum distance +ClothModifier.collision_settings -> collision_settings: pointer, (read-only) +ClothModifier.point_cache -> point_cache: pointer, (read-only) +ClothModifier.settings -> settings: pointer, (read-only) +ClothSettings.air_damping -> air_damping: float Air has normally some thickness which slows falling things down +ClothSettings.bending_stiffness -> bending_stiffness: float Wrinkle coefficient. (higher = less smaller but more big wrinkles) +ClothSettings.bending_stiffness_max -> bending_stiffness_max: float Maximum bending stiffness value +ClothSettings.bending_vertex_group -> bending_vertex_group: string Vertex group for fine control over bending stiffness +ClothSettings.collider_friction -> collider_friction: float +ClothSettings.effector_weights -> effector_weights: pointer, (read-only) +ClothSettings.goal_default -> goal_default: float Default Goal (vertex target position) value, when no Vertex Group used +ClothSettings.goal_friction -> goal_friction: float Goal (vertex target position) friction +ClothSettings.goal_max -> goal_max: float Goal maximum, vertex group weights are scaled to match this range +ClothSettings.goal_min -> goal_min: float Goal minimum, vertex group weights are scaled to match this range +ClothSettings.goal_spring -> goal_spring: float Goal (vertex target position) spring stiffness +ClothSettings.gravity -> gravity: float Gravity or external force vector +ClothSettings.internal_friction -> internal_friction: float +ClothSettings.mass -> mass: float Mass of cloth material +ClothSettings.mass_vertex_group -> mass_vertex_group: string Vertex Group for pinning of vertices +ClothSettings.pin_stiffness -> pin_stiffness: float Pin (vertex target position) spring stiffness +ClothSettings.pre_roll -> pre_roll: int Simulation starts on this frame +ClothSettings.quality -> quality: int Quality of the simulation in steps per frame. (higher is better quality but slower) +ClothSettings.rest_shape_key -> rest_shape_key: pointer Shape key to use the rest spring lengths from +ClothSettings.spring_damping -> spring_damping: float Damping of cloth velocity. (higher = more smooth, less jiggling) +ClothSettings.structural_stiffness -> structural_stiffness: float Overall stiffness of structure +ClothSettings.structural_stiffness_max -> structural_stiffness_max: float Maximum structural stiffness value +ClothSettings.structural_stiffness_vertex_group -> structural_stiffness_vertex_group: string Vertex group for fine control over structural stiffness +CloudsTexture.nabla -> nabla: float Size of derivative offset used for calculating normal +CloudsTexture.noise_basis -> noise_basis: enum Sets the noise basis used for turbulence +CloudsTexture.noise_depth -> noise_depth: int Sets the depth of the cloud calculation +CloudsTexture.noise_size -> noise_size: float Sets scaling for noise input +CloudsTexture.noise_type -> noise_type: enum +CloudsTexture.stype -> stype: enum +CollectionProperty.fixed_type -> fixed_type: pointer, (read-only) Fixed pointer type, empty if variable type +CollisionModifier.settings -> settings: pointer, (read-only) +CollisionSensor.material -> material: string Only look for Objects with this material +CollisionSensor.property -> property: string Only look for Objects with this property +CollisionSettings.absorption -> absorption: float How much of effector force gets lost during collision with this object (in percent) +CollisionSettings.damping -> damping: float Amount of damping during collision +CollisionSettings.damping_factor -> damping_factor: float Amount of damping during particle collision +CollisionSettings.friction_factor -> friction_factor: float Amount of friction during particle collision +CollisionSettings.inner_thickness -> inner_thickness: float Inner face thickness +CollisionSettings.outer_thickness -> outer_thickness: float Outer face thickness +CollisionSettings.permeability -> permeability: float Chance that the particle will pass through the mesh +CollisionSettings.random_damping -> random_damping: float Random variation of damping +CollisionSettings.random_friction -> random_friction: float Random variation of friction +CollisionSettings.stickness -> stickness: float Amount of stickness to surface collision +ColorRamp.elements -> elements: collection, (read-only) +ColorRamp.interpolation -> interpolation: enum +ColorRampElement.color -> color: float +ColorRampElement.position -> position: float +ColorSequence.color -> color: float +CompositorNode.type -> type: enum, (read-only) +CompositorNodeAlphaOver.premul -> premul: float Mix Factor +CompositorNodeBilateralblur.iterations -> iterations: int +CompositorNodeBilateralblur.sigma_color -> sigma_color: float +CompositorNodeBilateralblur.sigma_space -> sigma_space: float +CompositorNodeBlur.factor -> factor: float +CompositorNodeBlur.factor_x -> factor_x: float +CompositorNodeBlur.factor_y -> factor_y: float +CompositorNodeBlur.filter_type -> filter_type: enum +CompositorNodeBlur.sizex -> size_x: int +CompositorNodeBlur.sizey -> size_y: int +CompositorNodeChannelMatte.algorithm -> algorithm: enum Algorithm to use to limit channel +CompositorNodeChannelMatte.channel -> channel: enum Channel used to determine matte +CompositorNodeChannelMatte.color_space -> color_space: enum +CompositorNodeChannelMatte.high -> high: float Values higher than this setting are 100% opaque +CompositorNodeChannelMatte.limit_channel -> limit_channel: enum Limit by this channels value +CompositorNodeChannelMatte.low -> low: float Values lower than this setting are 100% keyed +CompositorNodeChromaMatte.acceptance -> acceptance: float Tolerance for a color to be considered a keying color +CompositorNodeChromaMatte.cutoff -> cutoff: float Tolerance below which colors will be considered as exact matches +CompositorNodeChromaMatte.gain -> gain: float Alpha gain +CompositorNodeChromaMatte.lift -> lift: float Alpha lift +CompositorNodeChromaMatte.shadow_adjust -> shadow_adjust: float Adjusts the brightness of any shadows captured +CompositorNodeColorBalance.correction_formula -> correction_formula: enum +CompositorNodeColorBalance.gain -> gain: float Correction for Highlights +CompositorNodeColorBalance.gamma -> gamma: float Correction for Midtones +CompositorNodeColorBalance.lift -> lift: float Correction for Shadows +CompositorNodeColorBalance.offset -> offset: float Correction for Shadows +CompositorNodeColorBalance.power -> power: float Correction for Midtones +CompositorNodeColorBalance.slope -> slope: float Correction for Highlights +CompositorNodeColorMatte.h -> h: float Hue tolerance for colors to be considered a keying color +CompositorNodeColorMatte.s -> s: float Saturation Tolerance for the color +CompositorNodeColorMatte.v -> v: float Value Tolerance for the color +CompositorNodeColorSpill.algorithm -> algorithm: enum +CompositorNodeColorSpill.channel -> channel: enum +CompositorNodeColorSpill.limit_channel -> limit_channel: enum +CompositorNodeColorSpill.ratio -> ratio: float Scale limit by value +CompositorNodeColorSpill.unspill_blue -> unspill_blue: float Blue spillmap scale +CompositorNodeColorSpill.unspill_green -> unspill_green: float Green spillmap scale +CompositorNodeColorSpill.unspill_red -> unspill_red: float Red spillmap scale +CompositorNodeCrop.x1 -> x1: int +CompositorNodeCrop.x2 -> x2: int +CompositorNodeCrop.y1 -> y1: int +CompositorNodeCrop.y2 -> y2: int +CompositorNodeCurveRGB.mapping -> mapping: pointer, (read-only) +CompositorNodeCurveVec.mapping -> mapping: pointer, (read-only) +CompositorNodeDBlur.angle -> angle: float +CompositorNodeDBlur.center_x -> center_x: float +CompositorNodeDBlur.center_y -> center_y: float +CompositorNodeDBlur.distance -> distance: float +CompositorNodeDBlur.iterations -> iterations: int +CompositorNodeDBlur.spin -> spin: float +CompositorNodeDBlur.zoom -> zoom: float +CompositorNodeDefocus.angle -> angle: int Bokeh shape rotation offset in degrees +CompositorNodeDefocus.bokeh -> bokeh: enum +CompositorNodeDefocus.f_stop -> f_stop: float Amount of focal blur, 128=infinity=perfect focus, half the value doubles the blur radius +CompositorNodeDefocus.max_blur -> blur_max: float blur limit, maximum CoC radius, 0=no limit +CompositorNodeDefocus.samples -> samples: int Number of samples (16=grainy, higher=less noise) +CompositorNodeDefocus.threshold -> threshold: float CoC radius threshold, prevents background bleed on in-focus midground, 0=off +CompositorNodeDefocus.z_scale -> z_scale: float Scales the Z input when not using a zbuffer, controls maximum blur designated by the color white or input value 1 +CompositorNodeDiffMatte.falloff -> falloff: float Color distances below this additional threshold are partially keyed +CompositorNodeDiffMatte.tolerance -> tolerance: float Color distances below this threshold are keyed +CompositorNodeDilateErode.distance -> distance: int Distance to grow/shrink (number of iterations) +CompositorNodeDistanceMatte.falloff -> falloff: float Color distances below this additional threshold are partially keyed +CompositorNodeDistanceMatte.tolerance -> tolerance: float Color distances below this threshold are keyed +CompositorNodeFilter.filter_type -> filter_type: enum +CompositorNodeFlip.axis -> axis: enum +CompositorNodeGlare.angle_offset -> angle_offset: float Streak angle offset in degrees +CompositorNodeGlare.color_modulation -> color_modulation: float Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect +CompositorNodeGlare.fade -> fade: float Streak fade-out factor +CompositorNodeGlare.glare_type -> glare_type: enum +CompositorNodeGlare.iterations -> iterations: int +CompositorNodeGlare.mix -> mix: float -1 is original image only, 0 is exact 50/50 mix, 1 is processed image only +CompositorNodeGlare.quality -> quality: enum If not set to high quality, the effect will be applied to a low-res copy of the source image +CompositorNodeGlare.size -> size: int Glow/glare size (not actual size; relative to initial size of bright area of pixels) +CompositorNodeGlare.streaks -> streaks: int Total number of streaks +CompositorNodeGlare.threshold -> threshold: float The glare filter will only be applied to pixels brighter than this value +CompositorNodeHueCorrect.mapping -> mapping: pointer, (read-only) +CompositorNodeHueSat.hue -> hue: float +CompositorNodeHueSat.sat -> sat: float +CompositorNodeHueSat.val -> val: float +CompositorNodeIDMask.index -> index: int Pass index number to convert to alpha +CompositorNodeImage.frames -> frames: int Number of images used in animation +CompositorNodeImage.image -> image: pointer +CompositorNodeImage.layer -> layer: enum +CompositorNodeImage.offset -> offset: int Offsets the number of the frame to use in the animation +CompositorNodeImage.start -> start: int +CompositorNodeLevels.channel -> channel: enum +CompositorNodeLumaMatte.high -> high: float Values higher than this setting are 100% opaque +CompositorNodeLumaMatte.low -> low: float Values lower than this setting are 100% keyed +CompositorNodeMapUV.alpha -> alpha: int +CompositorNodeMapValue.max -> max: float +CompositorNodeMapValue.min -> min: float +CompositorNodeMapValue.offset -> offset: float +CompositorNodeMapValue.size -> size: float +CompositorNodeMath.operation -> operation: enum +CompositorNodeMixRGB.blend_type -> blend_type: enum +CompositorNodeOutputFile.exr_codec -> exr_codec: enum +CompositorNodeOutputFile.filepath -> filepath: string Output path for the image, same functionality as render output. +CompositorNodeOutputFile.frame_end -> frame_end: int +CompositorNodeOutputFile.frame_start -> frame_start: int +CompositorNodeOutputFile.image_type -> image_type: enum +CompositorNodeOutputFile.quality -> quality: int +CompositorNodePremulKey.mapping -> mapping: enum Conversion between premultiplied alpha and key alpha +CompositorNodeRLayers.layer -> layer: enum +CompositorNodeRLayers.scene -> scene: pointer +CompositorNodeRotate.filter -> filter: enum Method to use to filter rotation +CompositorNodeScale.space -> space: enum Coordinate space to scale relative to +CompositorNodeSplitViewer.axis -> axis: enum +CompositorNodeSplitViewer.factor -> factor: int +CompositorNodeTexture.node_output -> node_output: int For node-based textures, which output node to use +CompositorNodeTexture.texture -> texture: pointer +CompositorNodeTime.curve -> curve: pointer, (read-only) +CompositorNodeTime.end -> end: int +CompositorNodeTime.start -> start: int +CompositorNodeTonemap.adaptation -> adaptation: float If 0, global; if 1, based on pixel intensity +CompositorNodeTonemap.contrast -> contrast: float Set to 0 to use estimate from input image +CompositorNodeTonemap.correction -> correction: float If 0, same for all channels; if 1, each independent +CompositorNodeTonemap.gamma -> gamma: float If not used, set to 1 +CompositorNodeTonemap.intensity -> intensity: float If less than zero, darkens image; otherwise, makes it brighter +CompositorNodeTonemap.key -> key: float The value the average luminance is mapped to +CompositorNodeTonemap.offset -> offset: float Normally always 1, but can be used as an extra control to alter the brightness curve +CompositorNodeTonemap.tonemap_type -> tonemap_type: enum +CompositorNodeValToRGB.color_ramp -> color_ramp: pointer, (read-only) +CompositorNodeVecBlur.factor -> factor: float Scaling factor for motion vectors; actually 'shutter speed' in frames +CompositorNodeVecBlur.max_speed -> speed_max: int Maximum speed, or zero for none +CompositorNodeVecBlur.min_speed -> speed_min: int Minimum speed for a pixel to be blurred; used to separate background from foreground +CompositorNodeVecBlur.samples -> samples: int +ConsoleLine.current_character -> current_character: int +ConsoleLine.line -> line: string Text in the line +Constraint.influence -> influence: float Amount of influence constraint will have on the final solution +Constraint.lin_error -> lin_error: float, (read-only) Amount of residual error in Blender space unit for constraints that work on position +Constraint.name -> name: string Constraint name +Constraint.owner_space -> owner_space: enum Space that owner is evaluated in +Constraint.rot_error -> rot_error: float, (read-only) Amount of residual error in radiant for constraints that work on orientation +Constraint.target_space -> target_space: enum Space that target is evaluated in +Constraint.type -> type: enum, (read-only) +ConstraintActuator.damping -> damping: int Damping factor: time constant (in frame) of low pass filter +ConstraintActuator.damping_rotation -> damping_rotation: int Use a different damping for orientation +ConstraintActuator.direction -> direction: enum Set the direction of the ray +ConstraintActuator.direction_axis -> direction_axis: enum Select the axis to be aligned along the reference direction +ConstraintActuator.distance -> distance: float Set the maximum length of ray +ConstraintActuator.fh_damping -> fh_damping: float Damping factor of the Fh spring force +ConstraintActuator.fh_height -> fh_height: float Height of the Fh area +ConstraintActuator.limit -> limit: enum +ConstraintActuator.limit_max -> limit_max: float +ConstraintActuator.limit_min -> limit_min: float +ConstraintActuator.material -> material: string Ray detects only Objects with this material +ConstraintActuator.max_angle -> angle_max: float Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max +ConstraintActuator.max_rotation -> rotation_max: float Reference Direction +ConstraintActuator.min_angle -> angle_min: float Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max +ConstraintActuator.mode -> mode: enum The type of the constraint +ConstraintActuator.property -> property: string Ray detect only Objects with this property +ConstraintActuator.range -> range: float Set the maximum length of ray +ConstraintActuator.spring -> spring: float Spring force within the Fh area +ConstraintActuator.time -> time: int Maximum activation time in frame, 0 for unlimited +ConstraintTarget.subtarget -> subtarget: string +ConstraintTarget.target -> target: pointer Target Object +Context.area -> area: pointer, (read-only) +Context.main -> main: pointer, (read-only) +Context.manager -> manager: pointer, (read-only) +Context.mode -> mode: enum, (read-only) +Context.region -> region: pointer, (read-only) +Context.scene -> scene: pointer, (read-only) +Context.screen -> screen: pointer, (read-only) +Context.space_data -> space_data: pointer, (read-only) +Context.tool_settings -> tool_settings: pointer, (read-only) +Context.user_preferences -> user_preferences: pointer, (read-only) +Context.window -> window: pointer, (read-only) +ControlFluidSettings.attraction_radius -> attraction_radius: float Specifies the force field radius around the control object +ControlFluidSettings.attraction_strength -> attraction_strength: float Force strength for directional attraction towards the control object +ControlFluidSettings.end_time -> end_time: float Specifies time when the control particles are deactivated +ControlFluidSettings.quality -> quality: float Specifies the quality which is used for object sampling. (higher = better but slower) +ControlFluidSettings.start_time -> start_time: float Specifies time when the control particles are activated +ControlFluidSettings.velocity_radius -> velocity_radius: float Specifies the force field radius around the control object +ControlFluidSettings.velocity_strength -> velocity_strength: float Force strength of how much of the control object's velocity is influencing the fluid velocity +Controller.name -> name: string +Controller.state_number -> state_number: int Set Controller state index (1 to 30) +Controller.type -> type: enum +CopyLocationConstraint.head_tail -> head_tail: float Target along length of bone: Head=0, Tail=1 +CopyLocationConstraint.subtarget -> subtarget: string +CopyLocationConstraint.target -> target: pointer Target Object +CopyRotationConstraint.subtarget -> subtarget: string +CopyRotationConstraint.target -> target: pointer Target Object +CopyScaleConstraint.subtarget -> subtarget: string +CopyScaleConstraint.target -> target: pointer Target Object +CopyTransformsConstraint.head_tail -> head_tail: float Target along length of bone: Head=0, Tail=1 +CopyTransformsConstraint.subtarget -> subtarget: string +CopyTransformsConstraint.target -> target: pointer Target Object +Curve.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Curve.bevel_depth -> bevel_depth: float Bevel depth when not using a bevel object +Curve.bevel_object -> bevel_object: pointer Curve object name that defines the bevel shape +Curve.bevel_resolution -> bevel_resolution: int Bevel resolution when depth is non-zero and no specific bevel object has been defined +Curve.dimensions -> dimensions: enum Select 2D or 3D curve type +Curve.eval_time -> eval_time: float Parametric position along the length of the curve that Objects 'following' it should be at. Position is evaluated by dividing by the 'Path Length' value +Curve.extrude -> extrude: float Amount of curve extrusion when not using a bevel object +Curve.materials -> materials: collection, (read-only) +Curve.path_length -> path_length: int The number of frames that are needed to traverse the path, defining the maximum value for the 'Evaluation Time' setting +Curve.render_resolution_u -> render_resolution_u: int Surface resolution in U direction used while rendering. Zero skips this property +Curve.render_resolution_v -> render_resolution_v: int Surface resolution in V direction used while rendering. Zero skips this property +Curve.resolution_u -> resolution_u: int Surface resolution in U direction +Curve.resolution_v -> resolution_v: int Surface resolution in V direction +Curve.shape_keys -> shape_keys: pointer, (read-only) +Curve.splines -> splines: collection, (read-only) Collection of splines in this curve data object +Curve.taper_object -> taper_object: pointer Curve object name that defines the taper (width) +Curve.texspace_loc -> texspace_loc: float Texture space location +Curve.texspace_size -> texspace_size: float Texture space size +Curve.twist_mode -> twist_mode: enum The type of tilt calculation for 3D Curves +Curve.twist_smooth -> twist_smooth: float Smoothing iteration for tangents +Curve.width -> width: float Scale the original width (1.0) based on given factor +CurveMap.extend -> extend: enum, (read-only) Extrapolate the curve or extend it horizontally +CurveMap.points -> points: collection, (read-only) +CurveMapPoint.handle_type -> handle_type: enum, (read-only) Curve interpolation at this point: bezier or vector +CurveMapPoint.location -> location: float, (read-only) X/Y coordinates of the curve point +CurveMapping.black_level -> black_level: float For RGB curves, the color that black is mapped to +CurveMapping.clip_max_x -> clip_max_x: float +CurveMapping.clip_max_y -> clip_max_y: float +CurveMapping.clip_min_x -> clip_min_x: float +CurveMapping.clip_min_y -> clip_min_y: float +CurveMapping.curves -> curves: collection, (read-only) +CurveMapping.white_level -> white_level: float For RGB curves, the color that white is mapped to +CurveModifier.deform_axis -> deform_axis: enum The axis that the curve deforms along +CurveModifier.object -> object: pointer Curve object to deform with +CurveModifier.vertex_group -> vertex_group: string Vertex group name +CurveSplines.active -> active: pointer Active curve spline +DampedTrackConstraint.subtarget -> subtarget: string +DampedTrackConstraint.target -> target: pointer Target Object +DampedTrackConstraint.track -> track: enum Axis that points to the target object +DecimateModifier.face_count -> face_count: int, (read-only) The current number of faces in the decimated mesh +DecimateModifier.ratio -> ratio: float Defines the ratio of triangles to reduce to +DelaySensor.delay -> delay: int Delay in number of logic tics before the positive trigger (default 60 per second) +DelaySensor.duration -> duration: int If >0, delay in number of logic tics before the negative trigger following the positive trigger +DisplaceModifier.direction -> direction: enum +DisplaceModifier.midlevel -> midlevel: float Material value that gives no displacement +DisplaceModifier.strength -> strength: float +DisplaceModifier.texture -> texture: pointer +DisplaceModifier.texture_coordinate_object -> texture_coordinate_object: pointer +DisplaceModifier.texture_coordinates -> texture_coordinates: enum +DisplaceModifier.uv_layer -> uv_layer: string UV layer name +DisplaceModifier.vertex_group -> vertex_group: string Vertex group name +DistortedNoiseTexture.distortion -> distortion: float +DistortedNoiseTexture.nabla -> nabla: float Size of derivative offset used for calculating normal +DistortedNoiseTexture.noise_basis -> noise_basis: enum Sets the noise basis used for turbulence +DistortedNoiseTexture.noise_distortion -> noise_distortion: enum Sets the noise basis for the distortion +DistortedNoiseTexture.noise_size -> noise_size: float Sets scaling for noise input +DomainFluidSettings.compressibility -> compressibility: float Allowed compressibility due to gravitational force for standing fluid. (directly affects simulation step size) +DomainFluidSettings.end_time -> end_time: float Simulation time of the last blender frame +DomainFluidSettings.generate_particles -> generate_particles: float Amount of particles to generate (0=off, 1=normal, >1=more) +DomainFluidSettings.gravity -> gravity: float Gravity in X, Y and Z direction +DomainFluidSettings.grid_levels -> grid_levels: int Number of coarsened grids to use (-1 for automatic) +DomainFluidSettings.memory_estimate -> memory_estimate: string, (read-only) Estimated amount of memory needed for baking the domain +DomainFluidSettings.partial_slip_factor -> partial_slip_factor: float Amount of mixing between no- and free-slip, 0 is no slip and 1 is free slip +DomainFluidSettings.path -> path: string Directory (and/or filename prefix) to store baked fluid simulation files in +DomainFluidSettings.preview_resolution -> preview_resolution: int Preview resolution in X,Y and Z direction +DomainFluidSettings.real_world_size -> real_world_size: float Size of the simulation domain in metres +DomainFluidSettings.render_display_mode -> render_display_mode: enum How to display the mesh for rendering +DomainFluidSettings.resolution -> resolution: int Domain resolution in X,Y and Z direction +DomainFluidSettings.slip_type -> slip_type: enum +DomainFluidSettings.start_time -> start_time: float Simulation time of the first blender frame +DomainFluidSettings.surface_smoothing -> surface_smooth: float Amount of surface smoothing. A value of 0 is off, 1 is normal smoothing and more than 1 is extra smoothing +DomainFluidSettings.surface_subdivisions -> surface_subdivisions: int Number of isosurface subdivisions. This is necessary for the inclusion of particles into the surface generation. Warning - can lead to longer computation times! +DomainFluidSettings.tracer_particles -> tracer_particles: int Number of tracer particles to generate +DomainFluidSettings.viewport_display_mode -> viewport_display_mode: enum How to display the mesh in the viewport +DomainFluidSettings.viscosity_base -> viscosity_base: float Viscosity setting: value that is multiplied by 10 to the power of (exponent*-1) +DomainFluidSettings.viscosity_exponent -> viscosity_exponent: int Negative exponent for the viscosity value (to simplify entering small values e.g. 5*10^-6.) +DomainFluidSettings.viscosity_preset -> viscosity_preset: enum Set viscosity of the fluid to a preset value, or use manual input +DopeSheet.filtering_group -> filtering_group: pointer Group that included Object should be a member of +DopeSheet.source -> source: pointer, (read-only) ID-Block representing source data, currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil) +Driver.expression -> expression: string Expression to use for Scripted Expression +Driver.type -> type: enum Driver type +Driver.variables -> variables: collection, (read-only) Properties acting as inputs for this driver +DriverTarget.bone_target -> bone_target: string Name of PoseBone to use as target +DriverTarget.data_path -> data_path: string RNA Path (from ID-block) to property used +DriverTarget.id -> id: pointer ID-block that the specific property used can be found from (id_type property must be set first) +DriverTarget.id_type -> id_type: enum Type of ID-block that can be used +DriverTarget.transform_type -> transform_type: enum Driver variable type +DriverVariable.name -> name: string Name to use in scripted expressions/functions. (No spaces or dots are allowed. Also, must not start with a symbol or digit) +DriverVariable.targets -> targets: collection, (read-only) Sources of input data for evaluating this variable +DriverVariable.type -> type: enum Driver variable type +DupliObject.matrix -> matrix: float Object duplicate transformation matrix +DupliObject.object -> object: pointer, (read-only) Object being duplicated +DupliObject.object_matrix -> object_matrix: float Duplicated object transformation matrix +EdgeSplitModifier.split_angle -> split_angle: float Angle above which to split edges +EditBone.bbone_in -> bbone_in: float Length of first Bezier Handle (for B-Bones only) +EditBone.bbone_out -> bbone_out: float Length of second Bezier Handle (for B-Bones only) +EditBone.bbone_segments -> bbone_segments: int Number of subdivisions of bone (for B-Bones only) +EditBone.envelope_distance -> envelope_distance: float Bone deformation distance (for Envelope deform only) +EditBone.envelope_weight -> envelope_weight: float Bone deformation weight (for Envelope deform only) +EditBone.head -> head: float Location of head end of the bone +EditBone.head_radius -> head_radius: float Radius of head of bone (for Envelope deform only) +EditBone.matrix -> matrix: float, (read-only) Read-only matrix calculated from the roll (armature space) +EditBone.name -> name: string +EditBone.parent -> parent: pointer Parent edit bone (in same Armature) +EditBone.roll -> roll: float Bone rotation around head-tail axis +EditBone.tail -> tail: float Location of tail end of the bone +EditBone.tail_radius -> tail_radius: float Radius of tail of bone (for Envelope deform only) +EditObjectActuator.angular_velocity -> angular_velocity: float Angular velocity upon creation +EditObjectActuator.dynamic_operation -> dynamic_operation: enum +EditObjectActuator.linear_velocity -> linear_velocity: float Velocity upon creation +EditObjectActuator.mass -> mass: float The mass of the object +EditObjectActuator.mesh -> mesh: pointer Replace the existing, when left blank 'Phys' will remake the existing physics mesh +EditObjectActuator.mode -> mode: enum The mode of the actuator +EditObjectActuator.object -> object: pointer Add this Object and all its children (cant be on an visible layer) +EditObjectActuator.time -> time: int Duration the new Object lives or the track takes +EditObjectActuator.track_object -> track_object: pointer Track to this Object +EffectSequence.color_balance -> color_balance: pointer, (read-only) +EffectSequence.crop -> crop: pointer, (read-only) +EffectSequence.multiply_colors -> color_multiply: float +EffectSequence.proxy -> proxy: pointer, (read-only) +EffectSequence.strobe -> strobe: float Only display every nth frame +EffectSequence.transform -> transform: pointer, (read-only) +EffectorWeights.all -> all: float All effector's weight +EffectorWeights.boid -> boid: float Boid effector weight +EffectorWeights.charge -> charge: float Charge effector weight +EffectorWeights.curveguide -> curveguide: float Curve guide effector weight +EffectorWeights.drag -> drag: float Drag effector weight +EffectorWeights.force -> force: float Force effector weight +EffectorWeights.gravity -> gravity: float Global gravity weight +EffectorWeights.group -> group: pointer Limit effectors to this Group +EffectorWeights.harmonic -> harmonic: float Harmonic effector weight +EffectorWeights.lennardjones -> lennardjones: float Lennard-Jones effector weight +EffectorWeights.magnetic -> magnetic: float Magnetic effector weight +EffectorWeights.texture -> texture: float Texture effector weight +EffectorWeights.turbulence -> turbulence: float Turbulence effector weight +EffectorWeights.vortex -> vortex: float Vortex effector weight +EffectorWeights.wind -> wind: float Wind effector weight +EnumProperty.default -> default: enum, (read-only) Default value for this enum +EnumProperty.items -> items: collection, (read-only) Possible values for the property +EnumPropertyItem.description -> description: string, (read-only) Description of the item's purpose +EnumPropertyItem.identifier -> identifier: string, (read-only) Unique name used in the code and scripting +EnumPropertyItem.name -> name: string, (read-only) Human readable name +EnumPropertyItem.value -> value: int, (read-only) Value of the item +EnvironmentMap.clip_end -> clip_end: float Objects further than this are not visible to map +EnvironmentMap.clip_start -> clip_start: float Objects nearer than this are not visible to map +EnvironmentMap.depth -> depth: int Number of times a map will be rendered recursively (mirror effects.) +EnvironmentMap.mapping -> mapping: enum +EnvironmentMap.resolution -> resolution: int Pixel resolution of the rendered environment map +EnvironmentMap.source -> source: enum +EnvironmentMap.viewpoint_object -> viewpoint_object: pointer Object to use as the environment map's viewpoint location +EnvironmentMap.zoom -> zoom: float +EnvironmentMapTexture.environment_map -> environment_map: pointer, (read-only) Gets the environment map associated with this texture +EnvironmentMapTexture.filter -> filter: enum Texture filter to use for sampling image +EnvironmentMapTexture.filter_eccentricity -> filter_eccentricity: int Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower +EnvironmentMapTexture.filter_probes -> filter_probes: int Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower +EnvironmentMapTexture.filter_size -> filter_size: float Multiplies the filter size used by MIP Map and Interpolation +EnvironmentMapTexture.image -> image: pointer Source image file to read the environment map from +EnvironmentMapTexture.image_user -> image_user: pointer, (read-only) Parameters defining which layer, pass and frame of the image is displayed +Event.ascii -> ascii: string, (read-only) Single ASCII character for this event +Event.mouse_prev_x -> mouse_prev_x: int, (read-only) The window relative vertical location of the mouse +Event.mouse_prev_y -> mouse_prev_y: int, (read-only) The window relative horizontal location of the mouse +Event.mouse_region_x -> mouse_region_x: int, (read-only) The region relative vertical location of the mouse +Event.mouse_region_y -> mouse_region_y: int, (read-only) The region relative horizontal location of the mouse +Event.mouse_x -> mouse_x: int, (read-only) The window relative vertical location of the mouse +Event.mouse_y -> mouse_y: int, (read-only) The window relative horizontal location of the mouse +Event.type -> type: enum, (read-only) +Event.value -> value: enum, (read-only) The type of event, only applies to some +ExplodeModifier.protect -> protect: float Clean vertex group edges +ExplodeModifier.vertex_group -> vertex_group: string +ExpressionController.expression -> expression: string +FCurve.array_index -> array_index: int Index to the specific property affected by F-Curve if applicable +FCurve.color -> color: float Color of the F-Curve in the Graph Editor +FCurve.color_mode -> color_mode: enum Method used to determine color of F-Curve in Graph Editor +FCurve.data_path -> data_path: string RNA Path to property affected by F-Curve +FCurve.driver -> driver: pointer, (read-only) Channel Driver (only set for Driver F-Curves) +FCurve.extrapolation -> extrapolation: enum +FCurve.group -> group: pointer Action Group that this F-Curve belongs to +FCurve.keyframe_points -> keyframe_points: collection, (read-only) User-editable keyframes +FCurve.modifiers -> modifiers: collection, (read-only) Modifiers affecting the shape of the F-Curve +FCurve.sampled_points -> sampled_points: collection, (read-only) Sampled animation data +FCurveModifiers.active -> active: pointer Active F-Curve Modifier +FCurveSample.co -> co: float Point coordinates +FModifier.type -> type: enum, (read-only) F-Curve Modifier Type +FModifierCycles.after_cycles -> after_cycles: float Maximum number of cycles to allow after last keyframe. (0 = infinite) +FModifierCycles.after_mode -> after_mode: enum Cycling mode to use after last keyframe +FModifierCycles.before_cycles -> before_cycles: float Maximum number of cycles to allow before first keyframe. (0 = infinite) +FModifierCycles.before_mode -> before_mode: enum Cycling mode to use before first keyframe +FModifierEnvelope.control_points -> control_points: collection, (read-only) Control points defining the shape of the envelope +FModifierEnvelope.default_maximum -> default_max: float Upper distance from Reference Value for 1:1 default influence +FModifierEnvelope.default_minimum -> default_min: float Lower distance from Reference Value for 1:1 default influence +FModifierEnvelope.reference_value -> reference_value: float Value that envelope's influence is centered around / based on +FModifierEnvelopeControlPoint.frame -> frame: float Frame this control-point occurs on +FModifierEnvelopeControlPoint.maximum -> max: float Upper bound of envelope at this control-point +FModifierEnvelopeControlPoint.minimum -> min: float Lower bound of envelope at this control-point +FModifierFunctionGenerator.amplitude -> amplitude: float Scale factor determining the maximum/minimum values +FModifierFunctionGenerator.function_type -> function_type: enum Type of built-in function to use +FModifierFunctionGenerator.phase_multiplier -> phase_multiplier: float Scale factor determining the 'speed' of the function +FModifierFunctionGenerator.phase_offset -> phase_offset: float Constant factor to offset time by for function +FModifierFunctionGenerator.value_offset -> value_offset: float Constant factor to offset values by +FModifierGenerator.coefficients -> coefficients: float Coefficients for 'x' (starting from lowest power of x^0) +FModifierGenerator.mode -> mode: enum Type of generator to use +FModifierGenerator.poly_order -> poly_order: int The highest power of 'x' for this polynomial. (number of coefficients - 1) +FModifierLimits.maximum_x -> max_x: float Highest X value to allow +FModifierLimits.maximum_y -> max_y: float Highest Y value to allow +FModifierLimits.minimum_x -> min_x: float Lowest X value to allow +FModifierLimits.minimum_y -> min_y: float Lowest Y value to allow +FModifierNoise.depth -> depth: int Amount of fine level detail present in the noise +FModifierNoise.modification -> modification: enum Method of modifying the existing F-Curve +FModifierNoise.phase -> phase: float A random seed for the noise effect +FModifierNoise.size -> size: float Scaling (in time) of the noise +FModifierNoise.strength -> strength: float Amplitude of the noise - the amount that it modifies the underlying curve +FModifierStepped.frame_end -> frame_end: float Frame that modifier's influence ends (if applicable) +FModifierStepped.frame_start -> frame_start: float Frame that modifier's influence starts (if applicable) +FModifierStepped.offset -> offset: float Reference number of frames before frames get held. Use to get hold for '1-3' vs '5-7' holding patterns +FModifierStepped.step_size -> step_size: float Number of frames to hold each value +FcurveActuator.frame_end -> frame_end: int +FcurveActuator.frame_property -> frame_property: string Assign the action's current frame number to this property +FcurveActuator.frame_start -> frame_start: int +FcurveActuator.play_type -> play_type: enum Specify the way you want to play the animation +FcurveActuator.property -> property: string Use this property to define the F-Curve position +FieldSettings.falloff_power -> falloff_power: float Falloff power (real gravitational falloff = 2) +FieldSettings.falloff_type -> falloff_type: enum Fall-off shape +FieldSettings.flow -> flow: float Convert effector force into air flow velocity +FieldSettings.guide_clump_amount -> guide_clump_amount: float Amount of clumping +FieldSettings.guide_clump_shape -> guide_clump_shape: float Shape of clumping +FieldSettings.guide_free -> guide_free: float Guide-free time from particle life's end +FieldSettings.guide_kink_amplitude -> guide_kink_amplitude: float The amplitude of the offset +FieldSettings.guide_kink_axis -> guide_kink_axis: enum Which axis to use for offset +FieldSettings.guide_kink_frequency -> guide_kink_frequency: float The frequency of the offset (1/total length) +FieldSettings.guide_kink_shape -> guide_kink_shape: float Adjust the offset to the beginning/end +FieldSettings.guide_kink_type -> guide_kink_type: enum Type of periodic offset on the curve +FieldSettings.guide_minimum -> guide_minimum: float The distance from which particles are affected fully +FieldSettings.harmonic_damping -> harmonic_damping: float Damping of the harmonic force +FieldSettings.inflow -> inflow: float Inwards component of the vortex force +FieldSettings.linear_drag -> linear_drag: float Drag component proportional to velocity +FieldSettings.maximum_distance -> distance_max: float Maximum distance for the field to work +FieldSettings.minimum_distance -> distance_min: float Minimum distance for the field's fall-off +FieldSettings.noise -> noise: float Noise of the force +FieldSettings.quadratic_drag -> quadratic_drag: float Drag component proportional to the square of velocity +FieldSettings.radial_falloff -> radial_falloff: float Radial falloff power (real gravitational falloff = 2) +FieldSettings.radial_maximum -> radial_max: float Maximum radial distance for the field to work +FieldSettings.radial_minimum -> radial_min: float Minimum radial distance for the field's fall-off +FieldSettings.rest_length -> rest_length: float Rest length of the harmonic force +FieldSettings.seed -> seed: int Seed of the noise +FieldSettings.shape -> shape: enum Which direction is used to calculate the effector force +FieldSettings.size -> size: float Size of the noise +FieldSettings.strength -> strength: float Strength of force field +FieldSettings.texture -> texture: pointer Texture to use as force +FieldSettings.texture_mode -> texture_mode: enum How the texture effect is calculated (RGB & Curl need a RGB texture else Gradient will be used instead) +FieldSettings.texture_nabla -> texture_nabla: float Defines size of derivative offset used for calculating gradient and curl +FieldSettings.type -> type: enum Type of field +FieldSettings.z_direction -> z_direction: enum Effect in full or only positive/negative Z direction +FileSelectParams.directory -> directory: string Directory displayed in the file browser +FileSelectParams.display -> display: enum Display mode for the file list +FileSelectParams.file -> file: string Active file in the file browser +FileSelectParams.sort -> sort: enum +FileSelectParams.title -> title: string, (read-only) Title for the file browser +Filter2DActuator.filter_pass -> filter_pass: int Set filter order +Filter2DActuator.glsl_shader -> glsl_shader: pointer +Filter2DActuator.mode -> mode: enum +Filter2DActuator.motion_blur_value -> motion_blur_value: float Set motion blur value +FloatProperty.array_length -> array_length: int, (read-only) Maximum length of the array, 0 means unlimited +FloatProperty.default -> default: float, (read-only) Default value for this number +FloatProperty.default_array -> default_array: float, (read-only) Default value for this array +FloatProperty.hard_max -> hard_max: float, (read-only) Maximum value used by buttons +FloatProperty.hard_min -> hard_min: float, (read-only) Minimum value used by buttons +FloatProperty.precision -> precision: int, (read-only) Number of digits after the dot used by buttons +FloatProperty.soft_max -> soft_max: float, (read-only) Maximum value used by buttons +FloatProperty.soft_min -> soft_min: float, (read-only) Minimum value used by buttons +FloatProperty.step -> step: float, (read-only) Step size used by number buttons, for floats 1/100th of the step size +FloorConstraint.floor_location -> floor_location: enum Location of target that object will not pass through +FloorConstraint.offset -> offset: float Offset of floor from object origin +FloorConstraint.subtarget -> subtarget: string +FloorConstraint.target -> target: pointer Target Object +FluidFluidSettings.initial_velocity -> initial_velocity: float Initial velocity of fluid +FluidFluidSettings.volume_initialization -> volume_initialization: enum Volume initialization type +FluidSettings.type -> type: enum Type of participation in the fluid simulation +FluidSimulationModifier.settings -> settings: pointer, (read-only) Settings for how this object is used in the fluid simulation +FollowPathConstraint.forward -> forward: enum Axis that points forward along the path +FollowPathConstraint.offset -> offset: int Offset from the position corresponding to the time frame +FollowPathConstraint.offset_factor -> offset_factor: float Percentage value defining target position along length of bone +FollowPathConstraint.target -> target: pointer Target Object +FollowPathConstraint.up -> up: enum Axis that points upward +Function.description -> description: string, (read-only) Description of the Function's purpose +Function.identifier -> identifier: string, (read-only) Unique name used in the code and scripting +Function.parameters -> parameters: collection, (read-only) Parameters for the function +GPencilFrame.frame_number -> frame_number: int The frame on which this sketch appears +GPencilFrame.strokes -> strokes: collection, (read-only) Freehand curves defining the sketch on this frame +GPencilLayer.active_frame -> active_frame: pointer, (read-only) Frame currently being displayed for this layer +GPencilLayer.color -> color: float Color for all strokes in this layer +GPencilLayer.frames -> frames: collection, (read-only) Sketches for this layer on different frames +GPencilLayer.info -> info: string Layer name +GPencilLayer.line_thickness -> line_width: int Thickness of strokes (in pixels) +GPencilLayer.max_ghost_range -> ghost_range_max: int Maximum number of frames on either side of the active frame to show (0 = show the 'first' available sketch on either side) +GPencilLayer.opacity -> opacity: float Layer Opacity +GPencilStroke.points -> points: collection, (read-only) Stroke data points +GPencilStrokePoint.co -> co: float +GPencilStrokePoint.pressure -> pressure: float Pressure of tablet at point when drawing it +GameActuator.filename -> filename: string Load this blend file, use the "//" prefix for a path relative to the current blend file +GameActuator.mode -> mode: enum +GameFloatProperty.value -> value: float Property value +GameIntProperty.value -> value: int Property value +GameObjectSettings.actuators -> actuators: collection, (read-only) Game engine actuators to act on events +GameObjectSettings.collision_bounds -> collision_bounds: enum Selects the collision type +GameObjectSettings.collision_margin -> collision_margin: float Extra margin around object for collision detection, small amount required for stability +GameObjectSettings.controllers -> controllers: collection, (read-only) Game engine controllers to process events, connecting sensor to actuators +GameObjectSettings.damping -> damping: float General movement damping +GameObjectSettings.form_factor -> form_factor: float Form factor scales the inertia tensor +GameObjectSettings.friction_coefficients -> friction_coefficients: float Relative friction coefficient in the in the X, Y and Z directions, when anisotropic friction is enabled +GameObjectSettings.mass -> mass: float Mass of the object +GameObjectSettings.maximum_velocity -> velocity_max: float Clamp velocity to this maximum speed +GameObjectSettings.minimum_velocity -> velocity_min: float Clamp velocity to this minimum speed (except when totally still) +GameObjectSettings.physics_type -> physics_type: enum Selects the type of physical representation +GameObjectSettings.properties -> properties: collection, (read-only) Game engine properties +GameObjectSettings.radius -> radius: float Radius of bounding sphere and material physics +GameObjectSettings.rotation_damping -> rotation_damping: float General rotation damping +GameObjectSettings.sensors -> sensors: collection, (read-only) Game engine sensor to detect events +GameObjectSettings.soft_body -> soft_body: pointer, (read-only) Settings for Bullet soft body simulation +GameProperty.name -> name: string Available as GameObject attributes in the game engine's python API +GameProperty.type -> type: enum +GameSoftBodySettings.cluster_iterations -> cluster_iterations: int Specify the number of cluster iterations +GameSoftBodySettings.dynamic_friction -> dynamic_friction: float Dynamic Friction +GameSoftBodySettings.linstiff -> linear_stiffness: float Linear stiffness of the soft body links +GameSoftBodySettings.margin -> margin: float Collision margin for soft body. Small value makes the algorithm unstable +GameSoftBodySettings.position_iterations -> position_iterations: int Position solver iterations +GameSoftBodySettings.threshold -> threshold: float Shape matching threshold +GameSoftBodySettings.welding -> weld_threshold: float Welding threshold: distance between nearby vertices to be considered equal => set to 0.0 to disable welding test and speed up scene loading (ok if the mesh has no duplicates) +GameStringProperty.value -> value: string Property value +GameTimerProperty.value -> value: float Property value +GlowSequence.blur_distance -> blur_distance: float Radius of glow effect +GlowSequence.boost_factor -> boost_factor: float Brightness multiplier +GlowSequence.clamp -> clamp: float rightness limit of intensity +GlowSequence.quality -> quality: int Accuracy of the blur effect +GlowSequence.threshold -> threshold: float Minimum intensity to trigger a glow +GreasePencil.draw_mode -> draw_mode: enum +GreasePencil.layers -> layers: collection, (read-only) +Group.dupli_offset -> dupli_offset: float Offset from the origin to use when instancing as DupliGroup +Group.objects -> objects: collection, (read-only) A collection of this groups objects +Header.bl_idname -> bl_idname: string +Header.bl_space_type -> bl_space_type: enum +Header.layout -> layout: pointer, (read-only) +Histogram.mode -> mode: enum Channels to display when drawing the histogram +HookModifier.falloff -> falloff: float If not zero, the distance from the hook where influence ends +HookModifier.force -> force: float Relative force of the hook +HookModifier.object -> object: pointer Parent Object for hook, also recalculates and clears offset +HookModifier.subtarget -> subtarget: string Name of Parent Bone for hook (if applicable), also recalculates and clears offset +HookModifier.vertex_group -> vertex_group: string Vertex group name +ID.library -> library: pointer, (read-only) Library file the datablock is linked from +ID.name -> name: string Unique datablock ID name +ID.users -> users: int, (read-only) Number of times this datablock is referenced +IDProperty.collection -> collection: collection, (read-only) +IDProperty.double -> double: float +IDProperty.double_array -> double_array: float +IDProperty.float -> float: float +IDProperty.float_array -> float_array: float +IDProperty.group -> group: pointer, (read-only) +IDProperty.int -> int: int +IDProperty.int_array -> int_array: int +IDProperty.string -> string: string +IDPropertyGroup.name -> name: string Unique name used in the code and scripting +IKParam.ik_solver -> ik_solver: enum, (read-only) IK solver for which these parameters are defined, 0 for Legacy, 1 for iTaSC +Image.animation_end -> animation_end: int End frame of an animated texture +Image.animation_speed -> animation_speed: int Speed of the animation in frames per second +Image.animation_start -> animation_start: int Start frame of an animated texture +Image.bindcode -> bindcode: int, (read-only) OpenGL bindcode +Image.depth -> depth: int, (read-only) Image bit depth +Image.display_aspect -> display_aspect: float Display Aspect for this image, does not affect rendering +Image.field_order -> field_order: enum Order of video fields. Select which lines are displayed first +Image.file_format -> file_format: enum Format used for re-saving this file +Image.filepath -> filepath: string Image/Movie file name +Image.filepath_raw -> filepath_raw: string Image/Movie file name (without data refreshing) +Image.generated_height -> generated_height: int Generated image height +Image.generated_type -> generated_type: enum Generated image type +Image.generated_width -> generated_width: int Generated image width +Image.mapping -> mapping: enum Mapping type to use for this image in the game engine +Image.packed_file -> packed_file: pointer, (read-only) +Image.size -> size: int, (read-only) Width and height in pixels, zero when image data cant be loaded +Image.source -> source: enum Where the image comes from +Image.tiles_x -> tiles_x: int Degree of repetition in the X direction +Image.tiles_y -> tiles_y: int Degree of repetition in the Y direction +Image.type -> type: enum, (read-only) How to generate the image +ImagePaint.normal_angle -> normal_angle: int Paint most on faces pointing towards the view according to this angle +ImagePaint.screen_grab_size -> screen_grab_size: int Size to capture the image for re-projecting +ImagePaint.seam_bleed -> seam_bleed: int Extend paint beyond the faces UVs to reduce seams (in pixels, slower) +ImageSequence.animation_end_offset -> animation_end_offset: int Animation end offset (trim end) +ImageSequence.animation_start_offset -> animation_start_offset: int Animation start offset (trim start) +ImageSequence.color_balance -> color_balance: pointer, (read-only) +ImageSequence.crop -> crop: pointer, (read-only) +ImageSequence.directory -> directory: string +ImageSequence.elements -> elements: collection, (read-only) +ImageSequence.multiply_colors -> multiply_colors: float +ImageSequence.proxy -> proxy: pointer, (read-only) +ImageSequence.strobe -> strobe: float Only display every nth frame +ImageSequence.transform -> transform: pointer, (read-only) +ImageTexture.checker_distance -> checker_distance: float Sets distance between checker tiles +ImageTexture.crop_max_x -> crop_max_x: float Sets maximum X value to crop the image +ImageTexture.crop_max_y -> crop_max_y: float Sets maximum Y value to crop the image +ImageTexture.crop_min_x -> crop_min_x: float Sets minimum X value to crop the image +ImageTexture.crop_min_y -> crop_min_y: float Sets minimum Y value to crop the image +ImageTexture.extension -> extension: enum Sets how the image is extrapolated past its original bounds +ImageTexture.filter -> filter: enum Texture filter to use for sampling image +ImageTexture.filter_eccentricity -> filter_eccentricity: int Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower +ImageTexture.filter_probes -> filter_probes: int Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower +ImageTexture.filter_size -> filter_size: float Multiplies the filter size used by MIP Map and Interpolation +ImageTexture.image -> image: pointer +ImageTexture.image_user -> image_user: pointer, (read-only) Parameters defining which layer, pass and frame of the image is displayed +ImageTexture.normal_space -> normal_space: enum Sets space of normal map image +ImageTexture.repeat_x -> repeat_x: int Sets a repetition multiplier in the X direction +ImageTexture.repeat_y -> repeat_y: int Sets a repetition multiplier in the Y direction +ImageUser.fields_per_frame -> fields_per_frame: int The number of fields per rendered frame (2 fields is 1 image) +ImageUser.frame_start -> frame_start: int Sets the global starting frame of the movie +ImageUser.frames -> frames: int Sets the number of images of a movie to use +ImageUser.multilayer_layer -> multilayer_layer: int, (read-only) Layer in multilayer image +ImageUser.multilayer_pass -> multilayer_pass: int, (read-only) Pass in multilayer image +ImageUser.offset -> offset: int Offsets the number of the frame to use in the animation +InflowFluidSettings.inflow_velocity -> inflow_velocity: float Initial velocity of fluid +InflowFluidSettings.volume_initialization -> volume_initialization: enum Volume initialization type +IntProperty.array_length -> array_length: int, (read-only) Maximum length of the array, 0 means unlimited +IntProperty.default -> default: int, (read-only) Default value for this number +IntProperty.default_array -> default_array: int, (read-only) Default value for this array +IntProperty.hard_max -> hard_max: int, (read-only) Maximum value used by buttons +IntProperty.hard_min -> hard_min: int, (read-only) Minimum value used by buttons +IntProperty.soft_max -> soft_max: int, (read-only) Maximum value used by buttons +IntProperty.soft_min -> soft_min: int, (read-only) Minimum value used by buttons +IntProperty.step -> step: int, (read-only) Step size used by number buttons, for floats 1/100th of the step size +Itasc.dampeps -> dampeps: float Singular value under which damping is progressively applied. Higher values=more stability, less reactivity. Default=0.1 +Itasc.dampmax -> dampmax: float Maximum damping coefficient when singular value is nearly 0. Higher values=more stability, less reactivity. Default=0.5 +Itasc.feedback -> feedback: float Feedback coefficient for error correction. Average response time=1/feedback. Default=20 +Itasc.max_step -> step_max: float Higher bound for timestep in second in case of automatic substeps +Itasc.max_velocity -> velocity_max: float Maximum joint velocity in rad/s. Default=50 +Itasc.min_step -> step_min: float Lower bound for timestep in second in case of automatic substeps +Itasc.mode -> mode: enum +Itasc.num_iter -> num_iter: int Maximum number of iterations for convergence in case of reiteration +Itasc.num_step -> num_step: int Divides the frame interval into this many steps +Itasc.precision -> precision: float Precision of convergence in case of reiteration +Itasc.reiteration -> reiteration: enum Defines if the solver is allowed to reiterate (converges until precision is met) on none, first or all frames +Itasc.solver -> solver: enum Solving method selection: Automatic damping or manual damping +JoystickSensor.axis_direction -> axis_direction: enum The direction of the axis +JoystickSensor.axis_number -> axis_number: int Specify which axis pair to use, 1 is usually the main direction input +JoystickSensor.axis_threshold -> axis_threshold: int Specify the precision of the axis +JoystickSensor.button_number -> button_number: int Specify which button to use +JoystickSensor.event_type -> event_type: enum The type of event this joystick sensor is triggered on +JoystickSensor.hat_direction -> hat_direction: enum Specify hat direction +JoystickSensor.hat_number -> hat_number: int Specify which hat to use +JoystickSensor.joystick_index -> joystick_index: int Specify which joystick to use +JoystickSensor.single_axis_number -> single_axis_number: int Specify a single axis (verticle/horizontal/other) to detect +Key.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Key.keys -> keys: collection, (read-only) Shape keys +Key.reference_key -> reference_key: pointer, (read-only) +Key.slurph -> slurph: int Creates a delay in amount of frames in applying keypositions, first vertex goes first +Key.user -> user: pointer, (read-only) Datablock using these shape keys +KeyConfig.keymaps -> keymaps: collection, (read-only) Key maps configured as part of this configuration +KeyConfig.name -> name: string Name of the key configuration +KeyMap.items -> items: collection, (read-only) Items in the keymap, linking an operator to an input event +KeyMap.name -> name: string, (read-only) Name of the key map +KeyMap.region_type -> region_type: enum, (read-only) Optional region type keymap is associated with +KeyMap.space_type -> space_type: enum, (read-only) Optional space type keymap is associated with +KeyMapItem.id -> id: int, (read-only) ID of the item +KeyMapItem.idname -> idname: string Identifier of operator to call on input event +KeyMapItem.key_modifier -> key_modifier: enum Regular key pressed as a modifier +KeyMapItem.map_type -> map_type: enum Type of event mapping +KeyMapItem.name -> name: string, (read-only) Name of operator to call on input event +KeyMapItem.properties -> properties: pointer, (read-only) Properties to set when the operator is called +KeyMapItem.propvalue -> propvalue: enum The value this event translates to in a modal keymap +KeyMapItem.type -> type: enum Type of event +KeyMapItem.value -> value: enum +KeyboardSensor.key -> key: enum +KeyboardSensor.log -> log: string Property that receive the keystrokes in case a string is logged +KeyboardSensor.modifier_key -> modifier_key: enum Modifier key code +KeyboardSensor.second_modifier_key -> second_modifier_key: enum Modifier key code +KeyboardSensor.target -> target: string Property that indicates whether to log keystrokes as a string +Keyframe.co -> co: float Coordinates of the control point +Keyframe.handle1 -> handle_left: float Coordinates of the first handle +Keyframe.handle1_type -> handle_left_type: enum Handle types +Keyframe.handle2 -> handle_right: float Coordinates of the second handle +Keyframe.handle2_type -> handle_right_type: enum Handle types +Keyframe.interpolation -> interpolation: enum Interpolation method to use for segment of the curve from this Keyframe until the next Keyframe +Keyframe.type -> type: enum The type of keyframe +KeyingSet.active_path -> active_path: pointer Active Keying Set used to insert/delete keyframes +KeyingSet.active_path_index -> active_path_index: int Current Keying Set index +KeyingSet.name -> name: string +KeyingSet.paths -> paths: collection, (read-only) Keying Set Paths to define settings that get keyframed together +KeyingSet.type_info -> type_info: pointer, (read-only) Callback function defines for built-in Keying Sets +KeyingSetInfo.bl_idname -> bl_idname: string +KeyingSetInfo.bl_label -> bl_label: string +KeyingSetPath.array_index -> array_index: int Index to the specific setting if applicable +KeyingSetPath.data_path -> data_path: string Path to property setting +KeyingSetPath.group -> group: string Name of Action Group to assign setting(s) for this path to +KeyingSetPath.grouping -> group_method: enum Method used to define which Group-name to use +KeyingSetPath.id -> id: pointer ID-Block that keyframes for Keying Set should be added to (for Absolute Keying Sets only) +KeyingSetPath.id_type -> id_type: enum Type of ID-block that can be used +KinematicConstraint.axis_reference -> axis_reference: enum Constraint axis Lock options relative to Bone or Target reference +KinematicConstraint.chain_length -> chain_length: int How many bones are included in the IK effect - 0 uses all bones +KinematicConstraint.distance -> distance: float Radius of limiting sphere +KinematicConstraint.ik_type -> ik_type: enum +KinematicConstraint.iterations -> iterations: int Maximum number of solving iterations +KinematicConstraint.limit_mode -> limit_mode: enum Distances in relation to sphere of influence to allow +KinematicConstraint.orient_weight -> orient_weight: float For Tree-IK: Weight of orientation control for this target +KinematicConstraint.pole_angle -> pole_angle: float Pole rotation offset +KinematicConstraint.pole_subtarget -> pole_subtarget: string +KinematicConstraint.pole_target -> pole_target: pointer Object for pole rotation +KinematicConstraint.subtarget -> subtarget: string +KinematicConstraint.target -> target: pointer Target Object +KinematicConstraint.weight -> weight: float For Tree-IK: Weight of position control for this target +Lamp.active_texture -> active_texture: pointer Active texture slot being displayed +Lamp.active_texture_index -> active_texture_index: int Index of active texture slot +Lamp.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Lamp.color -> color: float Light color +Lamp.distance -> distance: float Falloff distance - the light is at half the original intensity at this point +Lamp.energy -> energy: float Amount of light that the lamp emits +Lamp.texture_slots -> texture_slots: collection, (read-only) Texture slots defining the mapping and influence of textures +Lamp.type -> type: enum Type of Lamp +LampSkySettings.atmosphere_distance_factor -> atmosphere_distance_factor: float Multiplier to convert blender units to physical distance +LampSkySettings.atmosphere_extinction -> atmosphere_extinction: float Extinction scattering contribution factor +LampSkySettings.atmosphere_inscattering -> atmosphere_inscattering: float Scatter contribution factor +LampSkySettings.atmosphere_turbidity -> atmosphere_turbidity: float Sky turbidity +LampSkySettings.backscattered_light -> backscattered_light: float Backscattered light +LampSkySettings.horizon_brightness -> horizon_intensity: float Horizon brightness +LampSkySettings.sky_blend -> sky_blend: float Blend factor with sky +LampSkySettings.sky_blend_type -> sky_blend_type: enum Blend mode for combining sun sky with world sky +LampSkySettings.sky_color_space -> sky_color_space: enum Color space to use for internal XYZ->RGB color conversion +LampSkySettings.sky_exposure -> sky_exposure: float Strength of sky shading exponential exposure correction +LampSkySettings.spread -> spread: float Horizon Spread +LampSkySettings.sun_brightness -> sun_intensity: float Sun brightness +LampSkySettings.sun_intensity -> sun_intensity: float Sun intensity +LampSkySettings.sun_size -> sun_size: float Sun size +LampTextureSlot.color_factor -> color_factor: float Amount texture affects color values +LampTextureSlot.object -> object: pointer Object to use for mapping with Object texture coordinates +LampTextureSlot.shadow_factor -> shadow_factor: float Amount texture affects shadow +LampTextureSlot.texture_coordinates -> texture_coordinates: enum +Lattice.interpolation_type_u -> interpolation_type_u: enum +Lattice.interpolation_type_v -> interpolation_type_v: enum +Lattice.interpolation_type_w -> interpolation_type_w: enum +Lattice.points -> points: collection, (read-only) Points of the lattice +Lattice.points_u -> points_u: int Points in U direction +Lattice.points_v -> points_v: int Points in V direction +Lattice.points_w -> points_w: int Points in W direction +Lattice.shape_keys -> shape_keys: pointer, (read-only) +Lattice.vertex_group -> vertex_group: string Vertex group to apply the influence of the lattice +LatticeModifier.object -> object: pointer Lattice object to deform with +LatticeModifier.vertex_group -> vertex_group: string Vertex group name +LatticePoint.co -> co: float, (read-only) +LatticePoint.deformed_co -> deformed_co: float +LatticePoint.groups -> groups: collection, (read-only) Weights for the vertex groups this point is member of +Library.filepath -> filepath: string Path to the library .blend file +Library.parent -> parent: pointer, (read-only) +LimitDistanceConstraint.distance -> distance: float Radius of limiting sphere +LimitDistanceConstraint.limit_mode -> limit_mode: enum Distances in relation to sphere of influence to allow +LimitDistanceConstraint.subtarget -> subtarget: string +LimitDistanceConstraint.target -> target: pointer Target Object +LimitLocationConstraint.maximum_x -> max_x: float Highest X value to allow +LimitLocationConstraint.maximum_y -> max_y: float Highest Y value to allow +LimitLocationConstraint.maximum_z -> max_z: float Highest Z value to allow +LimitLocationConstraint.minimum_x -> min_x: float Lowest X value to allow +LimitLocationConstraint.minimum_y -> min_y: float Lowest Y value to allow +LimitLocationConstraint.minimum_z -> min_z: float Lowest Z value to allow +LimitRotationConstraint.maximum_x -> max_x: float Highest X value to allow +LimitRotationConstraint.maximum_y -> max_y: float Highest Y value to allow +LimitRotationConstraint.maximum_z -> max_z: float Highest Z value to allow +LimitRotationConstraint.minimum_x -> min_x: float Lowest X value to allow +LimitRotationConstraint.minimum_y -> min_y: float Lowest Y value to allow +LimitRotationConstraint.minimum_z -> min_z: float Lowest Z value to allow +LimitScaleConstraint.maximum_x -> max_x: float Highest X value to allow +LimitScaleConstraint.maximum_y -> max_y: float Highest Y value to allow +LimitScaleConstraint.maximum_z -> max_z: float Highest Z value to allow +LimitScaleConstraint.minimum_x -> min_x: float Lowest X value to allow +LimitScaleConstraint.minimum_y -> min_y: float Lowest Y value to allow +LimitScaleConstraint.minimum_z -> min_z: float Lowest Z value to allow +LockedTrackConstraint.locked -> locked: enum Axis that points upward +LockedTrackConstraint.subtarget -> subtarget: string +LockedTrackConstraint.target -> target: pointer Target Object +LockedTrackConstraint.track -> track: enum Axis that points to the target object +Macro.bl_description -> bl_description: string +Macro.bl_idname -> bl_idname: string +Macro.bl_label -> bl_label: string +Macro.bl_options -> bl_options: enum Options for this operator type +Macro.name -> name: string, (read-only) +Macro.properties -> properties: pointer, (read-only) +MagicTexture.noise_depth -> noise_depth: int Sets the depth of the cloud calculation +MagicTexture.turbulence -> turbulence: float Sets the turbulence of the bandnoise and ringnoise types +Main.actions -> actions: collection, (read-only) Action datablocks. +Main.armatures -> armatures: collection, (read-only) Armature datablocks. +Main.brushes -> brushes: collection, (read-only) Brush datablocks. +Main.cameras -> cameras: collection, (read-only) Camera datablocks. +Main.curves -> curves: collection, (read-only) Curve datablocks. +Main.filepath -> filepath: string, (read-only) Path to the .blend file +Main.fonts -> fonts: collection, (read-only) Vector font datablocks. +Main.gpencil -> gpencil: collection, (read-only) Grease Pencil datablocks. +Main.groups -> groups: collection, (read-only) Group datablocks. +Main.images -> images: collection, (read-only) Image datablocks. +Main.lamps -> lamps: collection, (read-only) Lamp datablocks. +Main.lattices -> lattices: collection, (read-only) Lattice datablocks. +Main.libraries -> libraries: collection, (read-only) Library datablocks. +Main.materials -> materials: collection, (read-only) Material datablocks. +Main.meshes -> meshes: collection, (read-only) Mesh datablocks. +Main.metaballs -> metaballs: collection, (read-only) Metaball datablocks. +Main.node_groups -> node_groups: collection, (read-only) Node group datablocks. +Main.objects -> objects: collection, (read-only) Object datablocks. +Main.particles -> particles: collection, (read-only) Particle datablocks. +Main.scenes -> scenes: collection, (read-only) Scene datablocks. +Main.screens -> screens: collection, (read-only) Screen datablocks. +Main.scripts -> scripts: collection, (read-only) Script datablocks (DEPRECATED). +Main.sounds -> sounds: collection, (read-only) Sound datablocks. +Main.texts -> texts: collection, (read-only) Text datablocks. +Main.textures -> textures: collection, (read-only) Texture datablocks. +Main.window_managers -> window_managers: collection, (read-only) Window manager datablocks. +Main.worlds -> worlds: collection, (read-only) World datablocks. +MaintainVolumeConstraint.axis -> axis: enum The free scaling axis of the object +MaintainVolumeConstraint.volume -> volume: float Volume of the bone at rest +MarbleTexture.nabla -> nabla: float Size of derivative offset used for calculating normal +MarbleTexture.noise_basis -> noise_basis: enum Sets the noise basis used for turbulence +MarbleTexture.noise_depth -> noise_depth: int Sets the depth of the cloud calculation +MarbleTexture.noise_size -> noise_size: float Sets scaling for noise input +MarbleTexture.noise_type -> noise_type: enum +MarbleTexture.noisebasis2 -> noisebasis2: enum +MarbleTexture.stype -> stype: enum +MarbleTexture.turbulence -> turbulence: float Sets the turbulence of the bandnoise and ringnoise types +MaskModifier.armature -> armature: pointer Armature to use as source of bones to mask +MaskModifier.mode -> mode: enum +MaskModifier.vertex_group -> vertex_group: string Vertex group name +Material.active_node_material -> active_node_material: pointer Active node material +Material.active_texture -> active_texture: pointer Active texture slot being displayed +Material.active_texture_index -> active_texture_index: int Index of active texture slot +Material.alpha -> alpha: float Alpha transparency of the material +Material.ambient -> ambient: float Amount of global ambient color the material receives +Material.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Material.darkness -> darkness: float Minnaert darkness +Material.diffuse_color -> diffuse_color: float +Material.diffuse_fresnel -> diffuse_fresnel: float Power of Fresnel +Material.diffuse_fresnel_factor -> diffuse_fresnel_factor: float Blending factor of Fresnel +Material.diffuse_intensity -> diffuse_intensity: float Amount of diffuse reflection +Material.diffuse_ramp -> diffuse_ramp: pointer, (read-only) Color ramp used to affect diffuse shading +Material.diffuse_ramp_blend -> diffuse_ramp_blend: enum +Material.diffuse_ramp_factor -> diffuse_ramp_factor: float Blending factor (also uses alpha in Colorband) +Material.diffuse_ramp_input -> diffuse_ramp_input: enum +Material.diffuse_shader -> diffuse_shader: enum +Material.diffuse_toon_size -> diffuse_toon_size: float Size of diffuse toon area +Material.diffuse_toon_smooth -> diffuse_toon_smooth: float Smoothness of diffuse toon area +Material.emit -> emit: float Amount of light to emit +Material.halo -> halo: pointer, (read-only) Halo settings for the material +Material.light_group -> light_group: pointer Limit lighting to lamps in this Group +Material.mirror_color -> mirror_color: float Mirror color of the material +Material.node_tree -> node_tree: pointer, (read-only) Node tree for node based materials +Material.physics -> physics: pointer, (read-only) Game physics settings +Material.preview_render_type -> preview_render_type: enum Type of preview render +Material.raytrace_mirror -> raytrace_mirror: pointer, (read-only) Raytraced reflection settings for the material +Material.raytrace_transparency -> raytrace_transparency: pointer, (read-only) Raytraced transparency settings for the material +Material.roughness -> rough: float Oren-Nayar Roughness +Material.shadow_buffer_bias -> shadow_buffer_bias: float Factor to multiply shadow buffer bias with (0 is ignore.) +Material.shadow_casting_alpha -> shadow_cast_alpha: float Shadow casting alpha, in use for Irregular and Deep shadow buffer +Material.shadow_ray_bias -> shadow_ray_bias: float Shadow raytracing bias to prevent terminator problems on shadow boundary +Material.specular_alpha -> specular_alpha: float Alpha transparency for specular areas +Material.specular_color -> specular_color: float Specular color of the material +Material.specular_hardness -> specular_hard: int +Material.specular_intensity -> specular_intensity: float +Material.specular_ior -> specular_ior: float +Material.specular_ramp -> specular_ramp: pointer, (read-only) Color ramp used to affect specular shading +Material.specular_ramp_blend -> specular_ramp_blend: enum +Material.specular_ramp_factor -> specular_ramp_factor: float Blending factor (also uses alpha in Colorband) +Material.specular_ramp_input -> specular_ramp_input: enum +Material.specular_shader -> specular_shader: enum +Material.specular_slope -> specular_slope: float The standard deviation of surface slope +Material.specular_toon_size -> specular_toon_size: float Size of specular toon area +Material.specular_toon_smooth -> specular_toon_smooth: float Smoothness of specular toon area +Material.strand -> strand: pointer, (read-only) Strand settings for the material +Material.subsurface_scattering -> subsurface_scattering: pointer, (read-only) Subsurface scattering settings for the material +Material.texture_slots -> texture_slots: collection, (read-only) Texture slots defining the mapping and influence of textures +Material.translucency -> translucency: float Amount of diffuse shading on the back side +Material.transparency_method -> transparency_method: enum Method to use for rendering transparency +Material.type -> type: enum Material type defining how the object is rendered +Material.volume -> volume: pointer, (read-only) Volume settings for the material +Material.z_offset -> z_offset: float Gives faces an artificial offset in the Z buffer for Z transparency +MaterialHalo.add -> add: float Sets the strength of the add effect +MaterialHalo.flare_boost -> flare_boost: float Gives the flare extra strength +MaterialHalo.flare_seed -> flare_seed: int Specifies an offset in the flare seed table +MaterialHalo.flare_size -> flare_size: float Sets the factor by which the flare is larger than the halo +MaterialHalo.flare_subsize -> flare_subsize: float Sets the dimension of the subflares, dots and circles +MaterialHalo.flares_sub -> flares_sub: int Sets the number of subflares +MaterialHalo.hardness -> hard: int Sets the hardness of the halo +MaterialHalo.line_number -> line_number: int Sets the number of star shaped lines rendered over the halo +MaterialHalo.rings -> rings: int Sets the number of rings rendered over the halo +MaterialHalo.seed -> seed: int Randomizes ring dimension and line location +MaterialHalo.size -> size: float Sets the dimension of the halo +MaterialHalo.star_tips -> star_tips: int Sets the number of points on the star shaped halo +MaterialPhysics.damp -> damp: float Damping of the spring force, when inside the physics distance area +MaterialPhysics.distance -> distance: float Distance of the physics area +MaterialPhysics.elasticity -> elasticity: float Elasticity of collisions +MaterialPhysics.force -> force: float Upward spring force, when inside the physics distance area +MaterialPhysics.friction -> friction: float Coulomb friction coefficient, when inside the physics distance area +MaterialRaytraceMirror.depth -> depth: int Maximum allowed number of light inter-reflections +MaterialRaytraceMirror.distance -> distance: float Maximum distance of reflected rays. Reflections further than this range fade to sky color or material color +MaterialRaytraceMirror.fade_to -> fade_to: enum The color that rays with no intersection within the Max Distance take. Material color can be best for indoor scenes, sky color for outdoor +MaterialRaytraceMirror.fresnel -> fresnel: float Power of Fresnel for mirror reflection +MaterialRaytraceMirror.fresnel_factor -> fresnel_factor: float Blending factor for Fresnel +MaterialRaytraceMirror.gloss_anisotropic -> gloss_anisotropic: float The shape of the reflection, from 0.0 (circular) to 1.0 (fully stretched along the tangent +MaterialRaytraceMirror.gloss_factor -> gloss_factor: float The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections +MaterialRaytraceMirror.gloss_samples -> gloss_samples: int Number of cone samples averaged for blurry reflections +MaterialRaytraceMirror.gloss_threshold -> gloss_threshold: float Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped +MaterialRaytraceMirror.reflect_factor -> reflect_factor: float Sets the amount mirror reflection for raytrace +MaterialRaytraceTransparency.depth -> depth: int Maximum allowed number of light inter-refractions +MaterialRaytraceTransparency.falloff -> falloff: float Falloff power for transmissivity filter effect (1.0 is linear) +MaterialRaytraceTransparency.filter -> filter: float Amount to blend in the material's diffuse color in raytraced transparency (simulating absorption) +MaterialRaytraceTransparency.fresnel -> fresnel: float Power of Fresnel for transparency (Ray or ZTransp) +MaterialRaytraceTransparency.fresnel_factor -> fresnel_factor: float Blending factor for Fresnel +MaterialRaytraceTransparency.gloss_factor -> gloss_factor: float The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions +MaterialRaytraceTransparency.gloss_samples -> gloss_samples: int Number of cone samples averaged for blurry refractions +MaterialRaytraceTransparency.gloss_threshold -> gloss_threshold: float Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped +MaterialRaytraceTransparency.ior -> ior: float Sets angular index of refraction for raytraced refraction +MaterialRaytraceTransparency.limit -> limit: float Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled) +MaterialSlot.link -> link: enum Link material to object or the object's data +MaterialSlot.material -> material: pointer Material datablock used by this material slot +MaterialSlot.name -> name: string, (read-only) Material slot name +MaterialStrand.blend_distance -> blend_distance: float Worldspace distance over which to blend in the surface normal +MaterialStrand.min_size -> size_min: float Minimum size of strands in pixels +MaterialStrand.root_size -> root_size: float Start size of strands in pixels or Blender units +MaterialStrand.shape -> shape: float Positive values make strands rounder, negative makes strands spiky +MaterialStrand.tip_size -> tip_size: float End size of strands in pixels or Blender units +MaterialStrand.uv_layer -> uv_layer: string Name of UV layer to override +MaterialStrand.width_fade -> width_fade: float Transparency along the width of the strand +MaterialSubsurfaceScattering.back -> back: float Back scattering weight +MaterialSubsurfaceScattering.color -> color: float Scattering color +MaterialSubsurfaceScattering.color_factor -> color_factor: float Blend factor for SSS colors +MaterialSubsurfaceScattering.error_tolerance -> error_tolerance: float Error tolerance (low values are slower and higher quality) +MaterialSubsurfaceScattering.front -> front: float Front scattering weight +MaterialSubsurfaceScattering.ior -> ior: float Index of refraction (higher values are denser) +MaterialSubsurfaceScattering.radius -> radius: float Mean red/green/blue scattering path length +MaterialSubsurfaceScattering.scale -> scale: float Object scale factor +MaterialSubsurfaceScattering.texture_factor -> texture_factor: float Texture scatting blend factor +MaterialTextureSlot.alpha_factor -> alpha_factor: float Amount texture affects alpha +MaterialTextureSlot.ambient_factor -> ambient_factor: float Amount texture affects ambient +MaterialTextureSlot.colordiff_factor -> colordiff_factor: float Amount texture affects diffuse color +MaterialTextureSlot.coloremission_factor -> coloremission_factor: float Amount texture affects emission color +MaterialTextureSlot.colorreflection_factor -> colorreflection_factor: float Amount texture affects color of out-scattered light +MaterialTextureSlot.colorspec_factor -> colorspec_factor: float Amount texture affects specular color +MaterialTextureSlot.colortransmission_factor -> colortransmission_factor: float Amount texture affects result color after light has been scattered/absorbed +MaterialTextureSlot.density_factor -> density_factor: float Amount texture affects density +MaterialTextureSlot.diffuse_factor -> diffuse_factor: float Amount texture affects diffuse reflectivity +MaterialTextureSlot.displacement_factor -> displacement_factor: float Amount texture displaces the surface +MaterialTextureSlot.emission_factor -> emission_factor: float Amount texture affects emission +MaterialTextureSlot.emit_factor -> emit_factor: float Amount texture affects emission +MaterialTextureSlot.hardness_factor -> hard_factor: float Amount texture affects hardness +MaterialTextureSlot.mapping -> mapping: enum +MaterialTextureSlot.mirror_factor -> mirror_factor: float Amount texture affects mirror color +MaterialTextureSlot.normal_factor -> normal_factor: float Amount texture affects normal values +MaterialTextureSlot.normal_map_space -> normal_map_space: enum +MaterialTextureSlot.object -> object: pointer Object to use for mapping with Object texture coordinates +MaterialTextureSlot.raymir_factor -> raymir_factor: float Amount texture affects ray mirror +MaterialTextureSlot.reflection_factor -> reflection_factor: float Amount texture affects brightness of out-scattered light +MaterialTextureSlot.scattering_factor -> scattering_factor: float Amount texture affects scattering +MaterialTextureSlot.specular_factor -> specular_factor: float Amount texture affects specular reflectivity +MaterialTextureSlot.texture_coordinates -> texture_coordinates: enum +MaterialTextureSlot.translucency_factor -> translucency_factor: float Amount texture affects translucency +MaterialTextureSlot.uv_layer -> uv_layer: string UV layer to use for mapping with UV texture coordinates +MaterialTextureSlot.warp_factor -> warp_factor: float Amount texture affects texture coordinates of next channels +MaterialTextureSlot.x_mapping -> x_mapping: enum +MaterialTextureSlot.y_mapping -> y_mapping: enum +MaterialTextureSlot.z_mapping -> z_mapping: enum +MaterialVolume.asymmetry -> asymmetry: float Back scattering (-1.0) to Forward scattering (1.0) and the range in between +MaterialVolume.cache_resolution -> cache_resolution: int Resolution of the voxel grid, low resolutions are faster, high resolutions use more memory +MaterialVolume.density -> density: float The base density of the volume +MaterialVolume.density_scale -> density_scale: float Multiplier for the material's density +MaterialVolume.depth_cutoff -> depth_cutoff: float Stop ray marching early if transmission drops below this luminance - higher values give speedups in dense volumes at the expense of accuracy +MaterialVolume.emission -> emission: float Amount of light that gets emitted by the volume +MaterialVolume.emission_color -> emission_color: float +MaterialVolume.lighting_mode -> light_mode: enum Method of shading, attenuating, and scattering light through the volume +MaterialVolume.ms_diffusion -> ms_diffusion: float Diffusion factor, the strength of the blurring effect +MaterialVolume.ms_intensity -> ms_intensity: float Multiplier for multiple scattered light energy +MaterialVolume.ms_spread -> ms_spread: float Proportional distance over which the light is diffused +MaterialVolume.reflection -> reflection: float Multiplier to make out-scattered light brighter or darker (non-physically correct) +MaterialVolume.reflection_color -> reflection_color: float Colour of light scattered out of the volume (does not affect transmission) +MaterialVolume.scattering -> scattering: float Amount of light that gets scattered out by the volume - the more out-scattering, the shallower the light will penetrate +MaterialVolume.step_calculation -> step_calculation: enum Method of calculating the steps through the volume +MaterialVolume.step_size -> step_size: float Distance between subsequent volume depth samples +MaterialVolume.transmission_color -> transmission_color: float Result color of the volume, after other light has been scattered/absorbed +Menu.bl_idname -> bl_idname: string +Menu.bl_label -> bl_label: string +Menu.layout -> layout: pointer, (read-only) +Mesh.active_uv_texture -> active_uv_texture: pointer Active UV texture +Mesh.active_uv_texture_index -> active_uv_texture_index: int Active UV texture index +Mesh.active_vertex_color -> active_vertex_color: pointer Active vertex color layer +Mesh.active_vertex_color_index -> active_vertex_color_index: int Active vertex color index +Mesh.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Mesh.autosmooth_angle -> autosmooth_angle: int Defines maximum angle between face normals that 'Auto Smooth' will operate on +Mesh.edges -> edges: collection, (read-only) Edges of the mesh +Mesh.faces -> faces: collection, (read-only) Faces of the mesh +Mesh.float_layers -> float_layers: collection, (read-only) +Mesh.int_layers -> int_layers: collection, (read-only) +Mesh.materials -> materials: collection, (read-only) +Mesh.shape_keys -> shape_keys: pointer, (read-only) +Mesh.sticky -> sticky: collection, (read-only) Sticky texture coordinates +Mesh.string_layers -> string_layers: collection, (read-only) +Mesh.texco_mesh -> texco_mesh: pointer Derive texture coordinates from another mesh +Mesh.texspace_loc -> texspace_loc: float Texture space location +Mesh.texspace_size -> texspace_size: float Texture space size +Mesh.texture_mesh -> texture_mesh: pointer Use another mesh for texture indices (vertex indices must be aligned) +Mesh.total_edge_sel -> total_edge_sel: int, (read-only) Selected edge count in editmode +Mesh.total_face_sel -> total_face_sel: int, (read-only) Selected face count in editmode +Mesh.total_vert_sel -> total_vert_sel: int, (read-only) Selected vertex count in editmode +Mesh.uv_texture_clone -> uv_texture_clone: pointer UV texture to be used as cloning source +Mesh.uv_texture_clone_index -> uv_texture_clone_index: int Clone UV texture index +Mesh.uv_texture_stencil -> uv_texture_stencil: pointer UV texture to mask the painted area +Mesh.uv_texture_stencil_index -> uv_texture_stencil_index: int Mask UV texture index +Mesh.uv_textures -> uv_textures: collection, (read-only) +Mesh.vertex_colors -> vertex_colors: collection, (read-only) +Mesh.verts -> verts: collection, (read-only) Vertices of the mesh +MeshColor.color1 -> color1: float +MeshColor.color2 -> color2: float +MeshColor.color3 -> color3: float +MeshColor.color4 -> color4: float +MeshColorLayer.data -> data: collection, (read-only) +MeshColorLayer.name -> name: string +MeshDeformModifier.object -> object: pointer Mesh object to deform with +MeshDeformModifier.precision -> precision: int The grid size for binding +MeshDeformModifier.vertex_group -> vertex_group: string Vertex group name +MeshEdge.bevel_weight -> bevel_weight: float Weight used by the Bevel modifier +MeshEdge.crease -> crease: float Weight used by the Subsurf modifier for creasing +MeshEdge.index -> index: int, (read-only) Index number of the vertex +MeshEdge.verts -> verts: int Vertex indices +MeshFace.area -> area: float, (read-only) read only area of the face +MeshFace.index -> index: int, (read-only) Index number of the vertex +MeshFace.material_index -> material_index: int +MeshFace.normal -> normal: float, (read-only) local space unit length normal vector for this face +MeshFace.verts -> verts: int Vertex indices +MeshFace.verts_raw -> verts_raw: int Fixed size vertex indices array +MeshFaces.active -> active: int The active face for this mesh +MeshFaces.active_tface -> active_tface: pointer, (read-only) Active Texture Face +MeshFloatProperty.value -> value: float +MeshFloatPropertyLayer.data -> data: collection, (read-only) +MeshFloatPropertyLayer.name -> name: string +MeshIntProperty.value -> value: int +MeshIntPropertyLayer.data -> data: collection, (read-only) +MeshIntPropertyLayer.name -> name: string +MeshSticky.co -> co: float Sticky texture coordinate location +MeshStringProperty.value -> value: string +MeshStringPropertyLayer.data -> data: collection, (read-only) +MeshStringPropertyLayer.name -> name: string +MeshTextureFace.image -> image: pointer +MeshTextureFace.transp -> transp: enum Transparency blending mode +MeshTextureFace.uv -> uv: float +MeshTextureFace.uv1 -> uv1: float +MeshTextureFace.uv2 -> uv2: float +MeshTextureFace.uv3 -> uv3: float +MeshTextureFace.uv4 -> uv4: float +MeshTextureFace.uv_raw -> uv_raw: float Fixed size UV coordinates array +MeshTextureFaceLayer.data -> data: collection, (read-only) +MeshTextureFaceLayer.name -> name: string +MeshVertex.bevel_weight -> bevel_weight: float Weight used by the Bevel modifier 'Only Vertices' option +MeshVertex.co -> co: float +MeshVertex.groups -> groups: collection, (read-only) Weights for the vertex groups this vertex is member of +MeshVertex.index -> index: int, (read-only) Index number of the vertex +MeshVertex.normal -> normal: float Vertex Normal +MessageActuator.body_message -> body_message: string Optional message body Text +MessageActuator.body_property -> body_property: string The message body will be set by the Property Value +MessageActuator.body_type -> body_type: enum Toggle message type: either Text or a PropertyName +MessageActuator.subject -> subject: string Optional message subject. This is what can be filtered on +MessageActuator.to_property -> to_property: string Optional send message to objects with this name only, or empty to broadcast +MessageSensor.subject -> subject: string Optional subject filter: only accept messages with this subject, or empty for all +MetaBall.active_element -> active_element: pointer, (read-only) Last selected element +MetaBall.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +MetaBall.elements -> elements: collection, (read-only) Meta elements +MetaBall.flag -> flag: enum Metaball edit update behavior +MetaBall.materials -> materials: collection, (read-only) +MetaBall.render_size -> render_size: float Polygonization resolution in rendering +MetaBall.texspace_loc -> texspace_loc: float Texture space location +MetaBall.texspace_size -> texspace_size: float Texture space size +MetaBall.threshold -> threshold: float Influence of meta elements +MetaBall.wire_size -> wire_size: float Polygonization resolution in the 3D viewport +MetaElement.location -> location: float +MetaElement.radius -> radius: float +MetaElement.rotation -> rotation: float +MetaElement.size_x -> size_x: float Size of element, use of components depends on element type +MetaElement.size_y -> size_y: float Size of element, use of components depends on element type +MetaElement.size_z -> size_z: float Size of element, use of components depends on element type +MetaElement.stiffness -> stiffness: float Stiffness defines how much of the element to fill +MetaElement.type -> type: enum Metaball types +MetaSequence.animation_end_offset -> animation_end_offset: int Animation end offset (trim end) +MetaSequence.animation_start_offset -> animation_start_offset: int Animation start offset (trim start) +MetaSequence.color_balance -> color_balance: pointer, (read-only) +MetaSequence.crop -> crop: pointer, (read-only) +MetaSequence.multiply_colors -> multiply_colors: float +MetaSequence.proxy -> proxy: pointer, (read-only) +MetaSequence.sequences -> sequences: collection, (read-only) +MetaSequence.strobe -> strobe: float Only display every nth frame +MetaSequence.transform -> transform: pointer, (read-only) +MirrorModifier.merge_limit -> merge_limit: float Distance from axis within which mirrored vertices are merged +MirrorModifier.mirror_object -> mirror_object: pointer Object to use as mirror +Modifier.name -> name: string Modifier name +Modifier.type -> type: enum, (read-only) +MotionPath.frame_end -> frame_end: int, (read-only) End frame of the stored range +MotionPath.frame_start -> frame_start: int, (read-only) Starting frame of the stored range +MotionPath.length -> length: int, (read-only) Number of frames cached +MotionPath.points -> points: collection, (read-only) Cached positions per frame +MotionPathVert.co -> co: float +MouseSensor.mouse_event -> mouse_event: enum Specify the type of event this mouse sensor should trigger on +MovieSequence.animation_end_offset -> animation_end_offset: int Animation end offset (trim end) +MovieSequence.animation_start_offset -> animation_start_offset: int Animation start offset (trim start) +MovieSequence.color_balance -> color_balance: pointer, (read-only) +MovieSequence.crop -> crop: pointer, (read-only) +MovieSequence.filepath -> filepath: string +MovieSequence.mpeg_preseek -> mpeg_preseek: int For MPEG movies, preseek this many frames +MovieSequence.multiply_colors -> multiply_colors: float +MovieSequence.proxy -> proxy: pointer, (read-only) +MovieSequence.strobe -> strobe: float Only display every nth frame +MovieSequence.transform -> transform: pointer, (read-only) +MulticamSequence.animation_end_offset -> animation_end_offset: int Animation end offset (trim end) +MulticamSequence.animation_start_offset -> animation_start_offset: int Animation start offset (trim start) +MulticamSequence.color_balance -> color_balance: pointer, (read-only) +MulticamSequence.crop -> crop: pointer, (read-only) +MulticamSequence.multicam_source -> multicam_source: int +MulticamSequence.multiply_colors -> multiply_colors: float +MulticamSequence.proxy -> proxy: pointer, (read-only) +MulticamSequence.strobe -> strobe: float Only display every nth frame +MulticamSequence.transform -> transform: pointer, (read-only) +MultiresModifier.filepath -> filepath: string Path to external displacements file +MultiresModifier.levels -> levels: int Number of subdivisions to use in the viewport +MultiresModifier.render_levels -> render_levels: int +MultiresModifier.sculpt_levels -> sculpt_levels: int Number of subdivisions to use in sculpt mode +MultiresModifier.subdivision_type -> subdivision_type: enum Selects type of subdivision algorithm +MultiresModifier.total_levels -> total_levels: int, (read-only) Number of subdivisions for which displacements are stored +MusgraveTexture.gain -> gain: float The gain multiplier +MusgraveTexture.highest_dimension -> highest_dimension: float Highest fractal dimension +MusgraveTexture.lacunarity -> lacunarity: float Gap between successive frequencies +MusgraveTexture.musgrave_type -> musgrave_type: enum +MusgraveTexture.nabla -> nabla: float Size of derivative offset used for calculating normal +MusgraveTexture.noise_basis -> noise_basis: enum Sets the noise basis used for turbulence +MusgraveTexture.noise_intensity -> noise_intensity: float +MusgraveTexture.noise_size -> noise_size: float Sets scaling for noise input +MusgraveTexture.octaves -> octaves: float Number of frequencies used +MusgraveTexture.offset -> offset: float The fractal offset +NearSensor.distance -> distance: float Trigger distance +NearSensor.property -> property: string Only look for objects with this property +NearSensor.reset_distance -> reset_distance: float +NetRenderJob.name -> name: string +NetRenderSettings.active_blacklisted_slave_index -> active_blacklisted_slave_index: int +NetRenderSettings.active_job_index -> active_job_index: int +NetRenderSettings.active_slave_index -> active_slave_index: int +NetRenderSettings.chunks -> chunks: int Number of frame to dispatch to each slave in one chunk +NetRenderSettings.job_category -> job_category: string Category of the job +NetRenderSettings.job_id -> job_id: string id of the last sent render job +NetRenderSettings.job_name -> job_name: string Name of the job +NetRenderSettings.jobs -> jobs: collection, (read-only) +NetRenderSettings.mode -> mode: enum Mode of operation of this instance +NetRenderSettings.path -> path: string Path for temporary files +NetRenderSettings.priority -> priority: int Priority of the job +NetRenderSettings.server_address -> server_address: string IP or name of the master render server +NetRenderSettings.server_port -> server_port: int port of the master render server +NetRenderSettings.slaves -> slaves: collection, (read-only) +NetRenderSettings.slaves_blacklist -> slaves_blacklist: collection, (read-only) +NetRenderSlave.name -> name: string +NlaStrip.action -> action: pointer Action referenced by this strip +NlaStrip.action_frame_end -> action_frame_end: float +NlaStrip.action_frame_start -> action_frame_start: float +NlaStrip.blend_in -> blend_in: float Number of frames at start of strip to fade in influence +NlaStrip.blend_out -> blend_out: float +NlaStrip.blending -> blend_type: enum Method used for combining strip's result with accumulated result +NlaStrip.extrapolation -> extrapolation: enum Action to take for gaps past the strip extents +NlaStrip.fcurves -> fcurves: collection, (read-only) F-Curves for controlling the strip's influence and timing +NlaStrip.frame_end -> frame_end: float +NlaStrip.frame_start -> frame_start: float +NlaStrip.influence -> influence: float Amount the strip contributes to the current result +NlaStrip.modifiers -> modifiers: collection, (read-only) Modifiers affecting all the F-Curves in the referenced Action +NlaStrip.name -> name: string +NlaStrip.repeat -> repeat: float Number of times to repeat the action range +NlaStrip.scale -> scale: float Scaling factor for action +NlaStrip.strip_time -> strip_time: float Frame of referenced Action to evaluate +NlaStrip.strips -> strips: collection, (read-only) NLA Strips that this strip acts as a container for (if it is of type Meta) +NlaStrip.type -> type: enum, (read-only) Type of NLA Strip +NlaTrack.name -> name: string +NlaTrack.strips -> strips: collection, (read-only) NLA Strips on this NLA-track +Node.inputs -> inputs: collection, (read-only) +Node.location -> location: float +Node.name -> name: string Node name +Node.outputs -> outputs: collection, (read-only) +NodeGroup.nodetree -> nodetree: pointer +NodeTree.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +NodeTree.grease_pencil -> grease_pencil: pointer Grease Pencil datablock +NodeTree.nodes -> nodes: collection, (read-only) +Object.active_material -> active_material: pointer Active material being displayed +Object.active_material_index -> active_material_index: int Index of active material slot +Object.active_particle_system -> active_particle_system: pointer, (read-only) Active particle system being displayed +Object.active_particle_system_index -> active_particle_system_index: int Index of active particle system slot +Object.active_shape_key -> active_shape_key: pointer, (read-only) Current shape key +Object.active_shape_key_index -> active_shape_key_index: int Current shape key index +Object.active_vertex_group -> active_vertex_group: pointer, (read-only) Vertex groups of the object +Object.active_vertex_group_index -> active_vertex_group_index: int Active index in vertex group array +Object.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Object.animation_visualisation -> animation_visualisation: pointer, (read-only) Animation data for this datablock +Object.bound_box -> bound_box: float, (read-only) Objects bound box in object-space coordinates +Object.collision -> collision: pointer, (read-only) Settings for using the objects as a collider in physics simulation +Object.color -> color: float Object color and alpha, used when faces have the ObColor mode enabled +Object.constraints -> constraints: collection, (read-only) Constraints affecting the transformation of the object +Object.data -> data: pointer Object data +Object.delta_location -> delta_location: float Extra translation added to the location of the object +Object.delta_rotation_euler -> delta_rotation_euler: float Extra rotation added to the rotation of the object (when using Euler rotations) +Object.delta_rotation_quaternion -> delta_rotation_quaternion: float Extra rotation added to the rotation of the object (when using Quaternion rotations) +Object.delta_scale -> delta_scale: float Extra scaling added to the scale of the object +Object.dimensions -> dimensions: float Absolute bounding box dimensions of the object +Object.draw_bounds_type -> draw_bounds_type: enum Object boundary display type +Object.dupli_faces_scale -> dupli_faces_scale: float Scale the DupliFace objects +Object.dupli_frames_end -> dupli_frames_end: int End frame for DupliFrames +Object.dupli_frames_off -> dupli_frames_off: int Recurring frames to exclude from the Dupliframes +Object.dupli_frames_on -> dupli_frames_on: int Number of frames to use between DupOff frames +Object.dupli_frames_start -> dupli_frames_start: int Start frame for DupliFrames +Object.dupli_group -> dupli_group: pointer Instance an existing group +Object.dupli_list -> dupli_list: collection, (read-only) Object duplis +Object.dupli_type -> dupli_type: enum If not None, object duplication method to use +Object.empty_draw_size -> empty_draw_size: float Size of display for empties in the viewport +Object.empty_draw_type -> empty_draw_type: enum Viewport display style for empties +Object.field -> field: pointer, (read-only) Settings for using the objects as a field in physics simulation +Object.game -> game: pointer, (read-only) Game engine related settings for the object +Object.grease_pencil -> grease_pencil: pointer Grease Pencil datablock +Object.location -> location: float Location of the object +Object.material_slots -> material_slots: collection, (read-only) Material slots in the object +Object.matrix_local -> matrix_local: float Parent relative transformation matrix +Object.matrix_world -> matrix_world: float Worldspace transformation matrix +Object.max_draw_type -> draw_type: enum Maximum draw type to display object with in viewport +Object.mode -> mode: enum, (read-only) Object interaction mode +Object.modifiers -> modifiers: collection, (read-only) Modifiers affecting the geometric data of the object +Object.motion_path -> motion_path: pointer, (read-only) Motion Path for this element +Object.parent -> parent: pointer Parent Object +Object.parent_bone -> parent_bone: string Name of parent bone in case of a bone parenting relation +Object.parent_type -> parent_type: enum Type of parent relation +Object.parent_vertices -> parent_vertices: int, (read-only) Indices of vertices in cases of a vertex parenting relation +Object.particle_systems -> particle_systems: collection, (read-only) Particle systems emitted from the object +Object.pass_index -> pass_index: int Index # for the IndexOB render pass +Object.pose -> pose: pointer, (read-only) Current pose for armatures +Object.pose_library -> pose_library: pointer, (read-only) Action used as a pose library for armatures +Object.proxy -> proxy: pointer, (read-only) Library object this proxy object controls +Object.proxy_group -> proxy_group: pointer, (read-only) Library group duplicator object this proxy object controls +Object.rotation_axis_angle -> rotation_axis_angle: float Angle of Rotation for Axis-Angle rotation representation +Object.rotation_euler -> rotation_euler: float Rotation in Eulers +Object.rotation_mode -> rotation_mode: enum +Object.rotation_quaternion -> rotation_quaternion: float Rotation in Quaternions +Object.scale -> scale: float Scaling of the object +Object.soft_body -> soft_body: pointer, (read-only) Settings for soft body simulation +Object.time_offset -> time_offset: float Animation offset in frames for F-Curve and dupligroup instances +Object.track_axis -> track_axis: enum Axis that points in 'forward' direction +Object.type -> type: enum, (read-only) Type of Object +Object.up_axis -> up_axis: enum Axis that points in the upward direction +Object.vertex_groups -> vertex_groups: collection, (read-only) Vertex groups of the object +ObjectActuator.angular_velocity -> angular_velocity: float Sets the angular velocity +ObjectActuator.damping -> damping: int Number of frames to reach the target velocity +ObjectActuator.derivate_coefficient -> derivate_coefficient: float Not required, high values can cause instability +ObjectActuator.force -> force: float Sets the force +ObjectActuator.force_max_x -> force_max_x: float Set the upper limit for force +ObjectActuator.force_max_y -> force_max_y: float Set the upper limit for force +ObjectActuator.force_max_z -> force_max_z: float Set the upper limit for force +ObjectActuator.force_min_x -> force_min_x: float Set the lower limit for force +ObjectActuator.force_min_y -> force_min_y: float Set the lower limit for force +ObjectActuator.force_min_z -> force_min_z: float Set the lower limit for force +ObjectActuator.integral_coefficient -> integral_coefficient: float Low value (0.01) for slow response, high value (0.5) for fast response +ObjectActuator.linear_velocity -> linear_velocity: float Sets the linear velocity (in Servo mode it sets the target relative linear velocity, it will be achieved by automatic application of force. Null velocity is a valid target) +ObjectActuator.loc -> loc: float Sets the location +ObjectActuator.mode -> mode: enum Specify the motion system +ObjectActuator.proportional_coefficient -> proportional_coefficient: float Typical value is 60x integral coefficient +ObjectActuator.reference_object -> reference_object: pointer Reference object for velocity calculation, leave empty for world reference +ObjectActuator.rot -> rot: float Sets the rotation +ObjectActuator.torque -> torque: float Sets the torque +ObjectBase.object -> object: pointer, (read-only) Object this base links to +ObjectConstraints.active -> active: pointer Active Object constraint +ObstacleFluidSettings.impact_factor -> impact_factor: float This is an unphysical value for moving objects - it controls the impact an obstacle has on the fluid, =0 behaves a bit like outflow (deleting fluid), =1 is default, while >1 results in high forces. Can be used to tweak total mass +ObstacleFluidSettings.partial_slip_factor -> partial_slip_factor: float Amount of mixing between no- and free-slip, 0 is no slip and 1 is free slip +ObstacleFluidSettings.slip_type -> slip_type: enum +ObstacleFluidSettings.volume_initialization -> volume_initialization: enum Volume initialization type +Operator.bl_description -> bl_description: string +Operator.bl_idname -> bl_idname: string +Operator.bl_label -> bl_label: string +Operator.bl_options -> bl_options: enum Options for this operator type +Operator.layout -> layout: pointer, (read-only) +Operator.name -> name: string, (read-only) +Operator.properties -> properties: pointer, (read-only) +OperatorFileListElement.name -> name: string the name of a file or directory within a file list +OperatorMousePath.loc -> loc: float Mouse location +OperatorMousePath.time -> time: float Time of mouse location +OperatorStrokeElement.location -> location: float +OperatorStrokeElement.mouse -> mouse: float +OperatorStrokeElement.pressure -> pressure: float Tablet pressure +OperatorStrokeElement.time -> time: float +OperatorTypeMacro.properties -> properties: pointer, (read-only) +OutflowFluidSettings.volume_initialization -> volume_initialization: enum Volume initialization type +PackedFile.size -> size: int, (read-only) Size of packed file in bytes +Paint.active_brush_index -> active_brush_index: int +Paint.active_brush_name -> active_brush_name: string +Paint.brush -> brush: pointer Active paint brush +Paint.brushes -> brushes: collection, (read-only) Brushes selected for this paint mode +Panel.bl_context -> bl_context: string +Panel.bl_idname -> bl_idname: string +Panel.bl_label -> bl_label: string +Panel.bl_region_type -> bl_region_type: enum +Panel.bl_space_type -> bl_space_type: enum +Panel.layout -> layout: pointer, (read-only) +Panel.text -> text: string +ParentActuator.mode -> mode: enum +ParentActuator.object -> object: pointer Set this object as parent +Particle.alive_state -> alive_state: enum +Particle.angular_velocity -> angular_velocity: float +Particle.birthtime -> birthtime: float +Particle.die_time -> die_time: float +Particle.hair -> hair: collection, (read-only) +Particle.keys -> keys: collection, (read-only) +Particle.lifetime -> lifetime: float +Particle.location -> location: float +Particle.prev_angular_velocity -> prev_angular_velocity: float +Particle.prev_location -> prev_location: float +Particle.prev_rotation -> prev_rotation: float +Particle.prev_velocity -> prev_velocity: float +Particle.rotation -> rotation: float +Particle.size -> size: float +Particle.velocity -> velocity: float +ParticleBrush.count -> count: int Particle count +ParticleBrush.curve -> curve: pointer, (read-only) +ParticleBrush.length_mode -> length_mode: enum +ParticleBrush.puff_mode -> puff_mode: enum +ParticleBrush.size -> size: int Brush size +ParticleBrush.steps -> steps: int Brush steps +ParticleBrush.strength -> strength: float Brush strength +ParticleDupliWeight.count -> count: int The number of times this object is repeated with respect to other objects +ParticleDupliWeight.name -> name: string, (read-only) Particle dupliobject name +ParticleEdit.add_keys -> add_keys: int How many keys to make new particles with +ParticleEdit.brush -> brush: pointer, (read-only) +ParticleEdit.draw_step -> draw_step: int How many steps to draw the path with +ParticleEdit.emitter_distance -> emitter_distance: float Distance to keep particles away from the emitter +ParticleEdit.fade_frames -> fade_frames: int How many frames to fade +ParticleEdit.object -> object: pointer, (read-only) The edited object +ParticleEdit.selection_mode -> selection_mode: enum Particle select and display mode +ParticleEdit.tool -> tool: enum +ParticleEdit.type -> type: enum +ParticleFluidSettings.alpha_influence -> alpha_influence: float Amount of particle alpha change, inverse of size influence: 0=off (all same alpha), 1=full. (large particles get lower alphas, smaller ones higher values) +ParticleFluidSettings.particle_influence -> particle_influence: float Amount of particle size scaling: 0=off (all same size), 1=full (range 0.2-2.0), >1=stronger +ParticleFluidSettings.path -> path: string Directory (and/or filename prefix) to store and load particles from +ParticleHairKey.location -> location: float Location of the hair key in object space +ParticleHairKey.location_hairspace -> location_hairspace: float Location of the hair key in its internal coordinate system, relative to the emitting face +ParticleHairKey.time -> time: float Relative time of key over hair length +ParticleHairKey.weight -> weight: float Weight for cloth simulation +ParticleInstanceModifier.axis -> axis: enum Pole axis for rotation +ParticleInstanceModifier.object -> object: pointer Object that has the particle system +ParticleInstanceModifier.particle_system_number -> particle_system_number: int +ParticleInstanceModifier.position -> position: float Position along path +ParticleInstanceModifier.random_position -> random_position: float Randomize position along path +ParticleKey.angular_velocity -> angular_velocity: float Key angular velocity +ParticleKey.location -> location: float Key location +ParticleKey.rotation -> rotation: float Key rotation quaterion +ParticleKey.time -> time: float Time of key over the simulation +ParticleKey.velocity -> velocity: float Key velocity +ParticleSettings.active_dupliweight -> active_dupliweight: pointer, (read-only) +ParticleSettings.active_dupliweight_index -> active_dupliweight_index: int +ParticleSettings.adaptive_angle -> adaptive_angle: int How many degrees path has to curve to make another render segment +ParticleSettings.adaptive_pix -> adaptive_pix: int How many pixels path has to cover to make another render segment +ParticleSettings.amount -> amount: int Total number of particles +ParticleSettings.angular_velocity_factor -> angular_velocity_factor: float Angular velocity amount +ParticleSettings.angular_velocity_mode -> angular_velocity_mode: enum Particle angular velocity mode +ParticleSettings.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +ParticleSettings.billboard_align -> billboard_align: enum In respect to what the billboards are aligned +ParticleSettings.billboard_animation -> billboard_animation: enum How to animate billboard textures +ParticleSettings.billboard_object -> billboard_object: pointer Billboards face this object (default is active camera) +ParticleSettings.billboard_offset -> billboard_offset: float +ParticleSettings.billboard_random_tilt -> billboard_random_tilt: float Random tilt of the billboards +ParticleSettings.billboard_split_offset -> billboard_split_offset: enum How to offset billboard textures +ParticleSettings.billboard_tilt -> billboard_tilt: float Tilt of the billboards +ParticleSettings.billboard_uv_split -> billboard_uv_split: int Amount of rows/columns to split UV coordinates for billboards +ParticleSettings.boids -> boids: pointer, (read-only) +ParticleSettings.branch_threshold -> branch_threshold: float Threshold of branching +ParticleSettings.brownian_factor -> brownian_factor: float Specify the amount of Brownian motion +ParticleSettings.child_length -> child_length: float Length of child paths +ParticleSettings.child_length_thres -> child_length_thres: float Amount of particles left untouched by child path length +ParticleSettings.child_nbr -> child_nbr: int Amount of children/parent +ParticleSettings.child_radius -> child_radius: float Radius of children around parent +ParticleSettings.child_random_size -> child_random_size: float Random variation to the size of the child particles +ParticleSettings.child_roundness -> child_roundness: float Roundness of children around parent +ParticleSettings.child_size -> child_size: float A multiplier for the child particle size +ParticleSettings.child_type -> child_type: enum Create child particles +ParticleSettings.clump_factor -> clump_factor: float Amount of clumping +ParticleSettings.clumppow -> clumppow: float Shape of clumping +ParticleSettings.damp_factor -> damp_factor: float Specify the amount of damping +ParticleSettings.display -> display: int Percentage of particles to display in 3D view +ParticleSettings.distribution -> distribution: enum How to distribute particles on selected element +ParticleSettings.drag_factor -> drag_factor: float Specify the amount of air-drag +ParticleSettings.draw_as -> draw_as: enum How particles are drawn in viewport +ParticleSettings.draw_size -> draw_size: int Size of particles on viewport in pixels (0=default) +ParticleSettings.draw_step -> draw_step: int How many steps paths are drawn with (power of 2) +ParticleSettings.dupli_group -> dupli_group: pointer Show Objects in this Group in place of particles +ParticleSettings.dupli_object -> dupli_object: pointer Show this Object in place of particles +ParticleSettings.dupliweights -> dupliweights: collection, (read-only) Weights for all of the objects in the dupli group +ParticleSettings.effect_hair -> effect_hair: float Hair stiffness for effectors +ParticleSettings.effector_weights -> effector_weights: pointer, (read-only) +ParticleSettings.emit_from -> emit_from: enum Where to emit particles from +ParticleSettings.fluid -> fluid: pointer, (read-only) +ParticleSettings.force_field_1 -> force_field_1: pointer, (read-only) +ParticleSettings.force_field_2 -> force_field_2: pointer, (read-only) +ParticleSettings.frame_end -> frame_end: float Frame # to stop emitting particles +ParticleSettings.frame_start -> frame_start: float Frame # to start emitting particles +ParticleSettings.grid_resolution -> grid_resolution: int The resolution of the particle grid +ParticleSettings.hair_step -> hair_step: int Number of hair segments +ParticleSettings.integrator -> integrator: enum Select physics integrator type +ParticleSettings.jitter_factor -> jitter_factor: float Amount of jitter applied to the sampling +ParticleSettings.keyed_loops -> keyed_loops: int Number of times the keys are looped +ParticleSettings.keys_step -> keys_step: int +ParticleSettings.kink -> kink: enum Type of periodic offset on the path +ParticleSettings.kink_amplitude -> kink_amplitude: float The amplitude of the offset +ParticleSettings.kink_axis -> kink_axis: enum Which axis to use for offset +ParticleSettings.kink_frequency -> kink_frequency: float The frequency of the offset (1/total length) +ParticleSettings.kink_shape -> kink_shape: float Adjust the offset to the beginning/end +ParticleSettings.lifetime -> lifetime: float Specify the life span of the particles +ParticleSettings.line_length_head -> line_length_head: float Length of the line's head +ParticleSettings.line_length_tail -> line_length_tail: float Length of the line's tail +ParticleSettings.mass -> mass: float Specify the mass of the particles +ParticleSettings.material -> material: int Specify material used for the particles +ParticleSettings.normal_factor -> normal_factor: float Let the surface normal give the particle a starting speed +ParticleSettings.object_aligned_factor -> object_aligned_factor: float Let the emitter object orientation give the particle a starting speed +ParticleSettings.object_factor -> object_factor: float Let the object give the particle a starting speed +ParticleSettings.particle_factor -> particle_factor: float Let the target particle give the particle a starting speed +ParticleSettings.particle_size -> particle_size: float The size of the particles +ParticleSettings.path_end -> path_end: float End time of drawn path +ParticleSettings.path_start -> path_start: float Starting time of drawn path +ParticleSettings.phase_factor -> phase_factor: float Initial rotation phase +ParticleSettings.physics_type -> physics_type: enum Particle physics type +ParticleSettings.random_factor -> random_factor: float Give the starting speed a random variation +ParticleSettings.random_length -> random_length: float Give path length a random variation +ParticleSettings.random_lifetime -> random_lifetime: float Give the particle life a random variation +ParticleSettings.random_phase_factor -> random_phase_factor: float Randomize rotation phase +ParticleSettings.random_rotation_factor -> random_rotation_factor: float Randomize rotation +ParticleSettings.random_size -> random_size: float Give the particle size a random variation +ParticleSettings.react_event -> react_event: enum The event of target particles to react on +ParticleSettings.reaction_shape -> reaction_shape: float Power of reaction strength dependence on distance to target +ParticleSettings.reactor_factor -> reactor_factor: float Let the vector away from the target particles location give the particle a starting speed +ParticleSettings.ren_as -> ren_as: enum How particles are rendered +ParticleSettings.render_step -> render_step: int How many steps paths are rendered with (power of 2) +ParticleSettings.rendered_child_nbr -> rendered_child_nbr: int Amount of children/parent for rendering +ParticleSettings.rotate_from -> rotate_from: enum +ParticleSettings.rotation_mode -> rotation_mode: enum Particles initial rotation +ParticleSettings.rough1 -> rough1: float Amount of location dependent rough +ParticleSettings.rough1_size -> rough1_size: float Size of location dependent rough +ParticleSettings.rough2 -> rough2: float Amount of random rough +ParticleSettings.rough2_size -> rough2_size: float Size of random rough +ParticleSettings.rough2_thres -> rough2_thres: float Amount of particles left untouched by random rough +ParticleSettings.rough_end_shape -> rough_end_shape: float Shape of end point rough +ParticleSettings.rough_endpoint -> rough_endpoint: float Amount of end point rough +ParticleSettings.simplify_rate -> simplify_rate: float Speed of simplification +ParticleSettings.simplify_refsize -> simplify_refsize: int Reference size in pixels, after which simplification begins +ParticleSettings.simplify_transition -> simplify_transition: float Transition period for fading out strands +ParticleSettings.simplify_viewport -> simplify_viewport: float Speed of Simplification +ParticleSettings.subframes -> subframes: int Subframes to simulate for improved stability and finer granularity simulations +ParticleSettings.tangent_factor -> tangent_factor: float Let the surface tangent give the particle a starting speed +ParticleSettings.tangent_phase -> tangent_phase: float Rotate the surface tangent +ParticleSettings.time_tweak -> time_tweak: float A multiplier for physics timestep (1.0 means one frame = 1/25 seconds) +ParticleSettings.trail_count -> trail_count: int Number of trail particles +ParticleSettings.type -> type: enum +ParticleSettings.userjit -> userjit: int Emission locations / face (0 = automatic) +ParticleSettings.virtual_parents -> virtual_parents: float Relative amount of virtual parents +ParticleSystem.active_particle_target -> active_particle_target: pointer, (read-only) +ParticleSystem.active_particle_target_index -> active_particle_target_index: int +ParticleSystem.billboard_normal_uv -> billboard_normal_uv: string UV Layer to control billboard normals +ParticleSystem.billboard_split_uv -> billboard_split_uv: string UV Layer to control billboard splitting +ParticleSystem.billboard_time_index_uv -> billboard_time_index_uv: string UV Layer to control billboard time index (X-Y) +ParticleSystem.child_particles -> child_particles: collection, (read-only) Child particles generated by the particle system +ParticleSystem.cloth -> cloth: pointer, (read-only) Cloth dynamics for hair +ParticleSystem.name -> name: string Particle system name +ParticleSystem.parent -> parent: pointer Use this object's coordinate system instead of global coordinate system +ParticleSystem.particles -> particles: collection, (read-only) Particles generated by the particle system +ParticleSystem.point_cache -> point_cache: pointer, (read-only) +ParticleSystem.reactor_target_object -> reactor_target_object: pointer For reactor systems, the object that has the target particle system (empty if same object) +ParticleSystem.reactor_target_particle_system -> reactor_target_particle_system: int For reactor systems, index of particle system on the target object +ParticleSystem.seed -> seed: int Offset in the random number table, to get a different randomized result +ParticleSystem.settings -> settings: pointer Particle system settings +ParticleSystem.targets -> targets: collection, (read-only) Target particle systems +ParticleSystem.vertex_group_clump -> vertex_group_clump: string Vertex group to control clump +ParticleSystem.vertex_group_density -> vertex_group_density: string Vertex group to control density +ParticleSystem.vertex_group_field -> vertex_group_field: string Vertex group to control field +ParticleSystem.vertex_group_kink -> vertex_group_kink: string Vertex group to control kink +ParticleSystem.vertex_group_length -> vertex_group_length: string Vertex group to control length +ParticleSystem.vertex_group_rotation -> vertex_group_rotation: string Vertex group to control rotation +ParticleSystem.vertex_group_roughness1 -> vertex_group_rough1: string Vertex group to control roughness 1 +ParticleSystem.vertex_group_roughness2 -> vertex_group_rough2: string Vertex group to control roughness 2 +ParticleSystem.vertex_group_roughness_end -> vertex_group_rough_end: string Vertex group to control roughness end +ParticleSystem.vertex_group_size -> vertex_group_size: string Vertex group to control size +ParticleSystem.vertex_group_tangent -> vertex_group_tangent: string Vertex group to control tangent +ParticleSystem.vertex_group_velocity -> vertex_group_velocity: string Vertex group to control velocity +ParticleSystemModifier.particle_system -> particle_system: pointer, (read-only) Particle System that this modifier controls +ParticleTarget.duration -> duration: float +ParticleTarget.mode -> mode: enum +ParticleTarget.name -> name: string, (read-only) Particle target name +ParticleTarget.object -> object: pointer The object that has the target particle system (empty if same object) +ParticleTarget.system -> system: int The index of particle system on the target object +ParticleTarget.time -> time: float +PivotConstraint.enabled_rotation_range -> enabled_rotation_range: enum Rotation range on which pivoting should occur +PivotConstraint.head_tail -> head_tail: float Target along length of bone: Head=0, Tail=1 +PivotConstraint.offset -> offset: float Offset of pivot from target (when set), or from owner's location (when Fixed Position is off), or the absolute pivot point +PivotConstraint.subtarget -> subtarget: string +PivotConstraint.target -> target: pointer Target Object, defining the position of the pivot when defined +PluginSequence.filename -> filename: string, (read-only) +PointCache.active_point_cache_index -> active_point_cache_index: int +PointCache.filepath -> filepath: string Cache file path +PointCache.frame_end -> frame_end: int Frame on which the simulation stops +PointCache.frame_start -> frame_start: int Frame on which the simulation starts +PointCache.index -> index: int Index number of cache files +PointCache.info -> info: string, (read-only) Info on current cache status +PointCache.name -> name: string Cache name +PointCache.point_cache_list -> point_cache_list: collection, (read-only) Point cache list +PointCache.step -> step: int Number of frames between cached frames +PointDensity.color_ramp -> color_ramp: pointer, (read-only) +PointDensity.color_source -> color_source: enum Data to derive color results from +PointDensity.falloff -> falloff: enum Method of attenuating density by distance from the point +PointDensity.falloff_softness -> falloff_soft: float Softness of the 'soft' falloff option +PointDensity.noise_basis -> noise_basis: enum Noise formula used for turbulence +PointDensity.object -> object: pointer Object to take point data from +PointDensity.particle_cache -> particle_cache: enum Co-ordinate system to cache particles in +PointDensity.particle_system -> particle_system: pointer Particle System to render as points +PointDensity.point_source -> point_source: enum Point data to use as renderable point density +PointDensity.radius -> radius: float Radius from the shaded sample to look for points within +PointDensity.speed_scale -> speed_scale: float Multiplier to bring particle speed within an acceptable range +PointDensity.turbulence_depth -> turbulence_depth: int Level of detail in the added turbulent noise +PointDensity.turbulence_influence -> turbulence_influence: enum Method for driving added turbulent noise +PointDensity.turbulence_size -> turbulence_size: float Scale of the added turbulent noise +PointDensity.turbulence_strength -> turbulence_strength: float +PointDensity.vertices_cache -> vertices_cache: enum Co-ordinate system to cache vertices in +PointDensityTexture.pointdensity -> pointdensity: pointer, (read-only) The point density settings associated with this texture +PointLamp.falloff_curve -> falloff_curve: pointer, (read-only) Custom Lamp Falloff Curve +PointLamp.falloff_type -> falloff_type: enum Intensity Decay with distance +PointLamp.linear_attenuation -> linear_attenuation: float Linear distance attenuation +PointLamp.quadratic_attenuation -> quadratic_attenuation: float Quadratic distance attenuation +PointLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float Threshold for Adaptive Sampling (Raytraced shadows) +PointLamp.shadow_color -> shadow_color: float Color of shadows cast by the lamp +PointLamp.shadow_method -> shadow_method: enum Method to compute lamp shadow with +PointLamp.shadow_ray_samples -> shadow_ray_samples: int Amount of samples taken extra (samples x samples) +PointLamp.shadow_ray_sampling_method -> shadow_ray_sample_method: enum Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower +PointLamp.shadow_soft_size -> shadow_soft_size: float Light size for ray shadow sampling (Raytraced shadows) +PointerProperty.fixed_type -> fixed_type: pointer, (read-only) Fixed pointer type, empty if variable type +Pose.active_bone_group -> active_bone_group: pointer Active bone group for this pose +Pose.active_bone_group_index -> active_bone_group_index: int Active index in bone groups array +Pose.animation_visualisation -> animation_visualisation: pointer, (read-only) Animation data for this datablock +Pose.bone_groups -> bone_groups: collection, (read-only) Groups of the bones +Pose.bones -> bones: collection, (read-only) Individual pose bones for the armature +Pose.ik_param -> ik_param: pointer, (read-only) Parameters for IK solver +Pose.ik_solver -> ik_solver: enum Selection of IK solver for IK chain, current choice is 0 for Legacy, 1 for iTaSC +PoseBone.bone -> bone: pointer, (read-only) Bone associated with this PoseBone +PoseBone.bone_group -> bone_group: pointer Bone Group this pose channel belongs to +PoseBone.bone_group_index -> bone_group_index: int Bone Group this pose channel belongs to (0=no group) +PoseBone.child -> child: pointer, (read-only) Child of this pose bone +PoseBone.constraints -> constraints: collection, (read-only) Constraints that act on this PoseChannel +PoseBone.custom_shape -> custom_shape: pointer Object that defines custom draw type for this bone +PoseBone.custom_shape_transform -> custom_shape_transform: pointer Bone that defines the display transform of this custom shape +PoseBone.head -> head: float, (read-only) Location of head of the channel's bone +PoseBone.ik_lin_weight -> ik_lin_weight: float Weight of scale constraint for IK +PoseBone.ik_max_x -> ik_max_x: float Maximum angles for IK Limit +PoseBone.ik_max_y -> ik_max_y: float Maximum angles for IK Limit +PoseBone.ik_max_z -> ik_max_z: float Maximum angles for IK Limit +PoseBone.ik_min_x -> ik_min_x: float Minimum angles for IK Limit +PoseBone.ik_min_y -> ik_min_y: float Minimum angles for IK Limit +PoseBone.ik_min_z -> ik_min_z: float Minimum angles for IK Limit +PoseBone.ik_rot_weight -> ik_rot_weight: float Weight of rotation constraint for IK +PoseBone.ik_stiffness_x -> ik_stiffness_x: float IK stiffness around the X axis +PoseBone.ik_stiffness_y -> ik_stiffness_y: float IK stiffness around the Y axis +PoseBone.ik_stiffness_z -> ik_stiffness_z: float IK stiffness around the Z axis +PoseBone.ik_stretch -> ik_stretch: float Allow scaling of the bone for IK +PoseBone.location -> location: float +PoseBone.matrix -> matrix: float, (read-only) Final 4x4 matrix for this channel +PoseBone.matrix_channel -> matrix_channel: float, (read-only) 4x4 matrix, before constraints +PoseBone.matrix_local -> matrix_local: float Matrix representing the parent relative location, scale and rotation. Provides an alternative access to these properties. +PoseBone.motion_path -> motion_path: pointer, (read-only) Motion Path for this element +PoseBone.name -> name: string +PoseBone.parent -> parent: pointer, (read-only) Parent of this pose bone +PoseBone.rotation_axis_angle -> rotation_axis_angle: float Angle of Rotation for Axis-Angle rotation representation +PoseBone.rotation_euler -> rotation_euler: float Rotation in Eulers +PoseBone.rotation_mode -> rotation_mode: enum +PoseBone.rotation_quaternion -> rotation_quaternion: float Rotation in Quaternions +PoseBone.scale -> scale: float +PoseBone.tail -> tail: float, (read-only) Location of tail of the channel's bone +PoseBoneConstraints.active -> active: pointer Active PoseChannel constraint +PoseTemplate.name -> name: string +PoseTemplateSettings.active_template_index -> active_template_index: int +PoseTemplateSettings.templates -> templates: collection, (read-only) +Property.description -> description: string, (read-only) Description of the property for tooltips +Property.identifier -> identifier: string, (read-only) Unique name used in the code and scripting +Property.name -> name: string, (read-only) Human readable name +Property.srna -> srna: pointer, (read-only) Struct definition used for properties assigned to this item +Property.subtype -> subtype: enum, (read-only) Semantic interpretation of the property +Property.type -> type: enum, (read-only) Data type of the property +Property.unit -> unit: enum, (read-only) Type of units for this property +PropertyActuator.mode -> mode: enum +PropertyActuator.object -> object: pointer Copy from this Object +PropertyActuator.object_property -> object_property: string Copy this property +PropertyActuator.property -> property: string The name of the property +PropertyActuator.value -> value: string The value to use, use "" around strings +PropertySensor.evaluation_type -> evaluation_type: enum Type of property evaluation +PropertySensor.max_value -> value_max: string Specify maximum value in Interval type +PropertySensor.min_value -> value_min: string Specify minimum value in Interval type +PropertySensor.property -> property: string +PropertySensor.value -> value: string Check for this value in types in Equal or Not Equal types +PythonConstraint.number_of_targets -> number_of_targets: int Usually only 1-3 are needed +PythonConstraint.targets -> targets: collection, (read-only) Target Objects +PythonConstraint.text -> text: pointer The text object that contains the Python script +PythonController.mode -> mode: enum Python script type (textblock or module - faster) +PythonController.module -> module: string Module name and function to run e.g. "someModule.main". Internal texts and external python files can be used +PythonController.text -> text: pointer Text datablock with the python script +RGBANodeSocket.default_value -> default_value: float Default value of the socket when no link is attached +RGBANodeSocket.name -> name: string, (read-only) Socket name +RadarSensor.angle -> angle: float Opening angle of the radar cone +RadarSensor.axis -> axis: enum Specify along which axis the radar cone is cast +RadarSensor.distance -> distance: float Depth of the radar cone +RadarSensor.property -> property: string Only look for Objects with this property +RandomActuator.chance -> chance: float Pick a number between 0 and 1. Success if you stay below this value +RandomActuator.distribution -> distribution: enum Choose the type of distribution +RandomActuator.float_max -> float_max: float Choose a number from a range. Upper boundary of the range +RandomActuator.float_mean -> float_mean: float A normal distribution. Mean of the distribution +RandomActuator.float_min -> float_min: float Choose a number from a range. Lower boundary of the range +RandomActuator.float_value -> float_value: float Always return this number +RandomActuator.half_life_time -> half_life_time: float Negative exponential dropoff +RandomActuator.int_max -> int_max: int Choose a number from a range. Upper boundary of the range +RandomActuator.int_mean -> int_mean: float Expected mean value of the distribution +RandomActuator.int_min -> int_min: int Choose a number from a range. Lower boundary of the range +RandomActuator.int_value -> int_value: int Always return this number +RandomActuator.property -> property: string Assign the random value to this property +RandomActuator.seed -> seed: int Initial seed of the random generator. Use Python for more freedom (choose 0 for not random) +RandomActuator.standard_derivation -> standard_derivation: float A normal distribution. Standard deviation of the distribution +RandomSensor.seed -> seed: int Initial seed of the generator. (Choose 0 for not random) +RaySensor.axis -> axis: enum Specify along which axis the ray is cast +RaySensor.material -> material: string Only look for Objects with this material +RaySensor.property -> property: string Only look for Objects with this property +RaySensor.range -> range: float Sense objects no farther than this distance +RaySensor.ray_type -> ray_type: enum Toggle collision on material or property +Region.height -> height: int, (read-only) Region height +Region.id -> id: int, (read-only) Unique ID for this region +Region.type -> type: enum, (read-only) Type of this region +Region.width -> width: int, (read-only) Region width +RegionView3D.perspective_matrix -> perspective_matrix: float, (read-only) Current perspective matrix of the 3D region +RegionView3D.view_distance -> view_distance: float Distance to the view location +RegionView3D.view_location -> view_location: float View pivot location +RegionView3D.view_matrix -> view_matrix: float, (read-only) Current view matrix of the 3D region +RegionView3D.view_perspective -> view_perspective: enum View Perspective +RegionView3D.view_rotation -> view_rotation: float Rotation in quaternions (keep normalized) +RenderEngine.bl_idname -> bl_idname: string +RenderEngine.bl_label -> bl_label: string +RenderLayer.light_override -> light_override: pointer, (read-only) Group to override all other lights in this render layer +RenderLayer.material_override -> material_override: pointer, (read-only) Material to override all other materials in this render layer +RenderLayer.name -> name: string, (read-only) Render layer name +RenderLayer.passes -> passes: collection, (read-only) +RenderLayer.rect -> rect: float +RenderPass.channel_id -> channel_id: string, (read-only) +RenderPass.channels -> channels: int, (read-only) +RenderPass.name -> name: string, (read-only) +RenderPass.rect -> rect: float +RenderPass.type -> type: enum, (read-only) +RenderResult.layers -> layers: collection, (read-only) +RenderResult.resolution_x -> resolution_x: int, (read-only) +RenderResult.resolution_y -> resolution_y: int, (read-only) +RenderSettings.active_layer_index -> active_layer_index: int Active index in render layer array +RenderSettings.alpha_mode -> alpha_mode: enum Representation of alpha information in the RGBA pixels +RenderSettings.antialiasing_samples -> antialiasing_samples: enum Amount of anti-aliasing samples per pixel +RenderSettings.bake_aa_mode -> bake_aa_mode: enum +RenderSettings.bake_bias -> bake_bias: float Bias towards faces further away from the object (in blender units) +RenderSettings.bake_distance -> bake_distance: float Maximum distance from active object to other object (in blender units +RenderSettings.bake_margin -> bake_margin: int Amount of pixels to extend the baked result with, as post process filter +RenderSettings.bake_normal_space -> bake_normal_space: enum Choose normal space for baking +RenderSettings.bake_quad_split -> bake_quad_split: enum Choose the method used to split a quad into 2 triangles for baking +RenderSettings.bake_type -> bake_type: enum Choose shading information to bake into the image +RenderSettings.border_max_x -> border_max_x: float Sets maximum X value for the render border +RenderSettings.border_max_y -> border_max_y: float Sets maximum Y value for the render border +RenderSettings.border_min_x -> border_min_x: float Sets minimum X value to for the render border +RenderSettings.border_min_y -> border_min_y: float Sets minimum Y value for the render border +RenderSettings.cineon_black -> cineon_black: int Log conversion reference blackpoint +RenderSettings.cineon_gamma -> cineon_gamma: float Log conversion gamma +RenderSettings.cineon_white -> cineon_white: int Log conversion reference whitepoint +RenderSettings.color_mode -> color_mode: enum Choose BW for saving greyscale images, RGB for saving red, green and blue channels, AND RGBA for saving red, green, blue + alpha channels +RenderSettings.display_mode -> display_mode: enum Select where rendered images will be displayed +RenderSettings.dither_intensity -> dither_intensity: float Amount of dithering noise added to the rendered image to break up banding +RenderSettings.edge_color -> edge_color: float +RenderSettings.edge_threshold -> edge_threshold: int Threshold for drawing outlines on geometry edges +RenderSettings.engine -> engine: enum Engine to use for rendering +RenderSettings.field_order -> field_order: enum Order of video fields. Select which lines get rendered first, to create smooth motion for TV output +RenderSettings.file_extension -> file_extension: string, (read-only) The file extension used for saving renders +RenderSettings.file_format -> file_format: enum File format to save the rendered images as +RenderSettings.file_quality -> file_quality: int Quality of JPEG images, AVI Jpeg and SGI movies +RenderSettings.filter_size -> filter_size: float Pixel width over which the reconstruction filter combines samples +RenderSettings.fps -> fps: int Framerate, expressed in frames per second +RenderSettings.fps_base -> fps_base: float Framerate base +RenderSettings.layers -> layers: collection, (read-only) +RenderSettings.motion_blur_samples -> motion_blur_samples: int Number of scene samples to take with motion blur +RenderSettings.motion_blur_shutter -> motion_blur_shutter: float Time taken in frames between shutter open and close +RenderSettings.octree_resolution -> octree_resolution: enum Resolution of raytrace accelerator. Use higher resolutions for larger scenes +RenderSettings.output_path -> output_path: string Directory/name to save animations, # characters defines the position and length of frame numbers +RenderSettings.parts_x -> parts_x: int Number of horizontal tiles to use while rendering +RenderSettings.parts_y -> parts_y: int Number of vertical tiles to use while rendering +RenderSettings.pixel_aspect_x -> pixel_aspect_x: float Horizontal aspect ratio - for anamorphic or non-square pixel output +RenderSettings.pixel_aspect_y -> pixel_aspect_y: float Vertical aspect ratio - for anamorphic or non-square pixel output +RenderSettings.pixel_filter -> pixel_filter: enum Reconstruction filter used for combining anti-aliasing samples +RenderSettings.raytrace_structure -> raytrace_structure: enum Type of raytrace accelerator structure +RenderSettings.resolution_percentage -> resolution_percentage: int Percentage scale for render resolution +RenderSettings.resolution_x -> resolution_x: int Number of horizontal pixels in the rendered image +RenderSettings.resolution_y -> resolution_y: int Number of vertical pixels in the rendered image +RenderSettings.sequencer_gl_preview -> sequencer_gl_preview: enum Method to draw in the sequencer view +RenderSettings.sequencer_gl_render -> sequencer_gl_render: enum Method to draw in the sequencer view +RenderSettings.simplify_ao_sss -> simplify_ao_sss: float Global approximate AA and SSS quality factor +RenderSettings.simplify_child_particles -> simplify_child_particles: float Global child particles percentage +RenderSettings.simplify_shadow_samples -> simplify_shadow_samples: int Global maximum shadow samples +RenderSettings.simplify_subdivision -> simplify_subdivision: int Global maximum subdivision level +RenderSettings.stamp_background -> stamp_background: float Color to use behind stamp text +RenderSettings.stamp_font_size -> stamp_font_size: int Size of the font used when rendering stamp text +RenderSettings.stamp_foreground -> stamp_foreground: float Color to use for stamp text +RenderSettings.stamp_note_text -> stamp_note_text: string Custom text to appear in the stamp note +RenderSettings.threads -> threads: int Number of CPU threads to use simultaneously while rendering (for multi-core/CPU systems) +RenderSettings.threads_mode -> threads_mode: enum Determine the amount of render threads used +RigidBodyJointConstraint.axis_x -> axis_x: float Rotate pivot on X axis in degrees +RigidBodyJointConstraint.axis_y -> axis_y: float Rotate pivot on Y axis in degrees +RigidBodyJointConstraint.axis_z -> axis_z: float Rotate pivot on Z axis in degrees +RigidBodyJointConstraint.child -> child: pointer Child object +RigidBodyJointConstraint.pivot_type -> pivot_type: enum +RigidBodyJointConstraint.pivot_x -> pivot_x: float Offset pivot on X +RigidBodyJointConstraint.pivot_y -> pivot_y: float Offset pivot on Y +RigidBodyJointConstraint.pivot_z -> pivot_z: float Offset pivot on Z +RigidBodyJointConstraint.target -> target: pointer Target Object +SPHFluidSettings.buoyancy -> buoyancy: float +SPHFluidSettings.fluid_radius -> fluid_radius: float Fluid interaction Radius +SPHFluidSettings.rest_density -> rest_density: float Density +SPHFluidSettings.rest_length -> rest_length: float The Spring Rest Length (factor of interaction radius) +SPHFluidSettings.spring_k -> spring_k: float Spring force constant +SPHFluidSettings.stiffness_k -> stiffness_k: float Constant K - Stiffness +SPHFluidSettings.stiffness_knear -> stiffness_knear: float Repulsion factor: stiffness_knear +SPHFluidSettings.viscosity_beta -> viscosity_beta: float Square viscosity factor +SPHFluidSettings.viscosity_omega -> viscosity_omega: float Linear viscosity +Scene.active_keying_set -> active_keying_set: pointer Active Keying Set used to insert/delete keyframes +Scene.active_keying_set_index -> active_keying_set_index: int Current Keying Set index (negative for 'builtin' and positive for 'absolute') +Scene.all_keying_sets -> all_keying_sets: collection, (read-only) All Keying Sets available for use (builtins and Absolute Keying Sets for this Scene) +Scene.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Scene.bases -> bases: collection, (read-only) +Scene.camera -> camera: pointer Active camera used for rendering the scene +Scene.cursor_location -> cursor_location: float 3D cursor location +Scene.distance_model -> distance_model: enum Distance model for distance attenuation calculation +Scene.doppler_factor -> doppler_factor: float Pitch factor for Doppler effect calculation +Scene.frame_current -> frame_current: int +Scene.frame_end -> frame_end: int Final frame of the playback/rendering range +Scene.frame_start -> frame_start: int First frame of the playback/rendering range +Scene.frame_step -> frame_step: int Number of frames to skip forward while rendering/playing back each frame +Scene.game_data -> game_data: pointer, (read-only) +Scene.gravity -> gravity: float Constant acceleration in a given direction +Scene.grease_pencil -> grease_pencil: pointer Grease Pencil datablock +Scene.keying_sets -> keying_sets: collection, (read-only) Absolute Keying Sets for this Scene +Scene.network_render -> network_render: pointer, (read-only) Network Render Settings +Scene.nodetree -> nodetree: pointer, (read-only) Compositing node tree +Scene.objects -> objects: collection, (read-only) +Scene.orientations -> orientations: collection, (read-only) +Scene.pose_templates -> pose_templates: pointer, (read-only) Pose Template Settings +Scene.pov_radio_adc_bailout -> pov_radio_adc_bailout: float The adc_bailout for radiosity rays. Use adc_bailout = 0.01 / brightest_ambient_object for good results +Scene.pov_radio_brightness -> pov_radio_intensity: float Amount objects are brightened before being returned upwards to the rest of the system +Scene.pov_radio_count -> pov_radio_count: int Number of rays that are sent out whenever a new radiosity value has to be calculated +Scene.pov_radio_error_bound -> pov_radio_error_bound: float One of the two main speed/quality tuning values, lower values are more accurate +Scene.pov_radio_gray_threshold -> pov_radio_gray_threshold: float One of the two main speed/quality tuning values, lower values are more accurate +Scene.pov_radio_low_error_factor -> pov_radio_low_error_factor: float If you calculate just enough samples, but no more, you will get an image which has slightly blotchy lighting +Scene.pov_radio_minimum_reuse -> pov_radio_minimum_reuse: float Fraction of the screen width which sets the minimum radius of reuse for each sample point (At values higher than 2% expect errors) +Scene.pov_radio_nearest_count -> pov_radio_nearest_count: int Number of old ambient values blended together to create a new interpolated value +Scene.pov_radio_recursion_limit -> pov_radio_recursion_limit: int how many recursion levels are used to calculate the diffuse inter-reflection +Scene.preview_range_frame_end -> preview_range_frame_end: int Alternative end frame for UI playback +Scene.preview_range_frame_start -> preview_range_frame_start: int Alternative start frame for UI playback +Scene.render -> render: pointer, (read-only) +Scene.sequence_editor -> sequence_editor: pointer, (read-only) +Scene.set -> set: pointer Background set scene +Scene.speed_of_sound -> speed_of_sound: float Speed of sound for Doppler effect calculation +Scene.stamp_note -> stamp_note: string User define note for the render stamping +Scene.sync_mode -> sync_mode: enum How to sync playback +Scene.timeline_markers -> timeline_markers: collection, (read-only) Markers used in all timelines for the current scene +Scene.tool_settings -> tool_settings: pointer, (read-only) +Scene.unit_settings -> unit_settings: pointer, (read-only) Unit editing settings +Scene.world -> world: pointer World used for rendering the scene +SceneActuator.camera -> camera: pointer Set this Camera. Leave empty to refer to self object +SceneActuator.mode -> mode: enum +SceneActuator.scene -> scene: pointer Set the Scene to be added/removed/paused/resumed +SceneBases.active -> active: pointer Active object base in the scene +SceneGameData.activity_culling_box_radius -> activity_culling_box_radius: float Radius of the activity bubble, in Manhattan length. Objects outside the box are activity-culled +SceneGameData.depth -> depth: int Displays bit depth of full screen display +SceneGameData.dome_angle -> dome_angle: int Field of View of the Dome - it only works in mode Fisheye and Truncated +SceneGameData.dome_buffer_resolution -> dome_buffer_resolution: float Buffer Resolution - decrease it to increase speed +SceneGameData.dome_mode -> dome_mode: enum Dome physical configurations +SceneGameData.dome_tesselation -> dome_tesselation: int Tessellation level - check the generated mesh in wireframe mode +SceneGameData.dome_text -> dome_text: pointer Custom Warp Mesh data file +SceneGameData.dome_tilt -> dome_tilt: int Camera rotation in horizontal axis +SceneGameData.eye_separation -> eye_separation: float Set the distance between the eyes - the camera focal length/30 should be fine +SceneGameData.fps -> fps: int The nominal number of game frames per second. Physics fixed timestep = 1/fps, independently of actual frame rate +SceneGameData.framing_color -> frame_color: float Set colour of the bars +SceneGameData.framing_type -> frame_type: enum Select the type of Framing you want +SceneGameData.frequency -> frequency: int Displays clock frequency of fullscreen display +SceneGameData.logic_step_max -> logic_step_max: int Sets the maximum number of logic frame per game frame if graphics slows down the game, higher value allows better synchronization with physics +SceneGameData.material_mode -> material_mode: enum Material mode to use for rendering +SceneGameData.occlusion_culling_resolution -> occlusion_culling_resolution: float The size of the occlusion buffer in pixel, use higher value for better precision (slower) +SceneGameData.physics_engine -> physics_engine: enum Physics engine used for physics simulation in the game engine +SceneGameData.physics_gravity -> physics_gravity: float Gravitational constant used for physics simulation in the game engine +SceneGameData.physics_step_max -> physics_step_max: int Sets the maximum number of physics step per game frame if graphics slows down the game, higher value allows physics to keep up with realtime +SceneGameData.physics_step_sub -> physics_step_sub: int Sets the number of simulation substep per physic timestep, higher value give better physics precision +SceneGameData.resolution_x -> resolution_x: int Number of horizontal pixels in the screen +SceneGameData.resolution_y -> resolution_y: int Number of vertical pixels in the screen +SceneGameData.stereo -> stereo: enum +SceneGameData.stereo_mode -> stereo_mode: enum Stereographic techniques +SceneObjects.active -> active: pointer Active object for this scene +SceneRenderLayer.light_override -> light_override: pointer Group to override all other lights in this render layer +SceneRenderLayer.material_override -> material_override: pointer Material to override all other materials in this render layer +SceneRenderLayer.name -> name: string Render layer name +SceneSequence.animation_end_offset -> animation_end_offset: int Animation end offset (trim end) +SceneSequence.animation_start_offset -> animation_start_offset: int Animation start offset (trim start) +SceneSequence.color_balance -> color_balance: pointer, (read-only) +SceneSequence.crop -> crop: pointer, (read-only) +SceneSequence.multiply_colors -> multiply_colors: float +SceneSequence.proxy -> proxy: pointer, (read-only) +SceneSequence.scene -> scene: pointer Scene that this sequence uses +SceneSequence.scene_camera -> scene_camera: pointer Override the scenes active camera +SceneSequence.strobe -> strobe: float Only display every nth frame +SceneSequence.transform -> transform: pointer, (read-only) +Scopes.accuracy -> accuracy: float Proportion of original image source pixel lines to sample +Scopes.histogram -> histogram: pointer, (read-only) Histogram for viewing image statistics +Scopes.vectorscope_alpha -> vectorscope_alpha: float Opacity of the points +Scopes.waveform_alpha -> waveform_alpha: float Opacity of the points +Scopes.waveform_mode -> waveform_mode: enum +Screen.areas -> areas: collection, (read-only) Areas the screen is subdivided into +Screen.scene -> scene: pointer Active scene to be edited in the screen +ScrewModifier.angle -> angle: float Angle of revolution +ScrewModifier.axis -> axis: enum Screw axis +ScrewModifier.iterations -> iterations: int Number of times to apply the screw operation +ScrewModifier.object -> object: pointer Object to define the screw axis +ScrewModifier.render_steps -> render_steps: int Number of steps in the revolution +ScrewModifier.screw_offset -> screw_offset: float Offset the revolution along its axis +ScrewModifier.steps -> steps: int Number of steps in the revolution +Sensor.frequency -> frequency: int Delay between repeated pulses(in logic tics, 0=no delay) +Sensor.name -> name: string Sensor name +Sensor.type -> type: enum +Sequence.blend_mode -> blend_type: enum +Sequence.blend_opacity -> blend_opacity: float +Sequence.channel -> channel: int Y position of the sequence strip +Sequence.effect_fader -> effect_fader: float +Sequence.frame_final_end -> frame_final_end: int End frame displayed in the sequence editor after offsets are applied +Sequence.frame_final_length -> frame_final_length: int The length of the contents of this strip before the handles are applied +Sequence.frame_final_start -> frame_final_start: int Start frame displayed in the sequence editor after offsets are applied, setting this is equivalent to moving the handle, not the actual start frame +Sequence.frame_length -> frame_length: int, (read-only) The length of the contents of this strip before the handles are applied +Sequence.frame_offset_end -> frame_offset_end: int, (read-only) +Sequence.frame_offset_start -> frame_offset_start: int, (read-only) +Sequence.frame_start -> frame_start: int +Sequence.frame_still_end -> frame_still_end: int, (read-only) +Sequence.frame_still_start -> frame_still_start: int, (read-only) +Sequence.name -> name: string +Sequence.speed_fader -> speed_fader: float +Sequence.type -> type: enum, (read-only) +SequenceColorBalance.gain -> gain: float Color balance gain (highlights) +SequenceColorBalance.gamma -> gamma: float Color balance gamma (midtones) +SequenceColorBalance.lift -> lift: float Color balance lift (shadows) +SequenceCrop.bottom -> bottom: int +SequenceCrop.left -> left: int +SequenceCrop.right -> right: int +SequenceCrop.top -> top: int +SequenceEditor.active_strip -> active_strip: pointer +SequenceEditor.meta_stack -> meta_stack: collection, (read-only) Meta strip stack, last is currently edited meta strip +SequenceEditor.overlay_frame -> overlay_frame: int Sequencers active strip +SequenceEditor.sequences -> sequences: collection, (read-only) +SequenceEditor.sequences_all -> sequences_all: collection, (read-only) +SequenceElement.filename -> filename: string +SequenceProxy.directory -> directory: string Location to store the proxy files +SequenceProxy.filepath -> filepath: string Location of custom proxy file +SequenceTransform.offset_x -> offset_x: int +SequenceTransform.offset_y -> offset_y: int +ShaderNode.type -> type: enum, (read-only) +ShaderNodeExtendedMaterial.material -> material: pointer +ShaderNodeGeometry.color_layer -> color_layer: string +ShaderNodeGeometry.uv_layer -> uv_layer: string +ShaderNodeMapping.location -> location: float Location offset for the input coordinate +ShaderNodeMapping.maximum -> max: float Maximum value to clamp coordinate to +ShaderNodeMapping.minimum -> min: float Minimum value to clamp coordinate to +ShaderNodeMapping.rotation -> rotation: float Rotation offset for the input coordinate +ShaderNodeMapping.scale -> scale: float Scale adjustment for the input coordinate +ShaderNodeMaterial.material -> material: pointer +ShaderNodeMath.operation -> operation: enum +ShaderNodeMixRGB.blend_type -> blend_type: enum +ShaderNodeRGBCurve.mapping -> mapping: pointer, (read-only) +ShaderNodeTexture.node_output -> node_output: int For node-based textures, which output node to use +ShaderNodeTexture.texture -> texture: pointer +ShaderNodeValToRGB.color_ramp -> color_ramp: pointer, (read-only) +ShaderNodeVectorCurve.mapping -> mapping: pointer, (read-only) +ShaderNodeVectorMath.operation -> operation: enum +ShapeActionActuator.action -> action: pointer +ShapeActionActuator.blendin -> blendin: int Number of frames of motion blending +ShapeActionActuator.frame_end -> frame_end: int +ShapeActionActuator.frame_property -> frame_property: string Assign the action's current frame number to this property +ShapeActionActuator.frame_start -> frame_start: int +ShapeActionActuator.mode -> mode: enum Action playback type +ShapeActionActuator.priority -> priority: int Execution priority - lower numbers will override actions with higher numbers. With 2 or more actions at once, the overriding channels must be lower in the stack +ShapeActionActuator.property -> property: string Use this property to define the Action position +ShapeKey.data -> data: collection, (read-only) +ShapeKey.frame -> frame: float, (read-only) Frame for absolute keys +ShapeKey.interpolation -> interpolation: enum Interpolation type +ShapeKey.name -> name: string +ShapeKey.relative_key -> relative_key: pointer Shape used as a relative key +ShapeKey.slider_max -> slider_max: float Maximum for slider +ShapeKey.slider_min -> slider_min: float Minimum for slider +ShapeKey.value -> value: float Value of shape key at the current frame +ShapeKey.vertex_group -> vertex_group: string Vertex weight group, to blend with basis shape +ShapeKeyBezierPoint.co -> co: float +ShapeKeyBezierPoint.handle_1_co -> handle_1_co: float +ShapeKeyBezierPoint.handle_2_co -> handle_2_co: float +ShapeKeyCurvePoint.co -> co: float +ShapeKeyCurvePoint.tilt -> tilt: float +ShapeKeyPoint.co -> co: float +ShrinkwrapConstraint.distance -> distance: float Distance to Target +ShrinkwrapConstraint.shrinkwrap_type -> shrinkwrap_type: enum Selects type of shrinkwrap algorithm for target position +ShrinkwrapConstraint.target -> target: pointer Target Object +ShrinkwrapModifier.auxiliary_target -> auxiliary_target: pointer Additional mesh target to shrink to +ShrinkwrapModifier.mode -> mode: enum +ShrinkwrapModifier.offset -> offset: float Distance to keep from the target +ShrinkwrapModifier.subsurf_levels -> subsurf_levels: int Number of subdivisions that must be performed before extracting vertices' positions and normals +ShrinkwrapModifier.target -> target: pointer Mesh target to shrink to +ShrinkwrapModifier.vertex_group -> vertex_group: string Vertex group name +SimpleDeformModifier.factor -> factor: float +SimpleDeformModifier.limits -> limits: float Lower/Upper limits for deform +SimpleDeformModifier.mode -> mode: enum +SimpleDeformModifier.origin -> origin: pointer Origin of modifier space coordinates +SimpleDeformModifier.vertex_group -> vertex_group: string Vertex group name +SmokeDomainSettings.alpha -> alpha: float Higher value results in sinking smoke +SmokeDomainSettings.amplify -> amplify: int Enhance the resolution of smoke by this factor using noise +SmokeDomainSettings.beta -> beta: float Higher value results in faster rising smoke +SmokeDomainSettings.coll_group -> coll_group: pointer Limit collisions to this group +SmokeDomainSettings.dissolve_speed -> dissolve_speed: int Dissolve Speed +SmokeDomainSettings.eff_group -> eff_group: pointer Limit effectors to this group +SmokeDomainSettings.effector_weights -> effector_weights: pointer, (read-only) +SmokeDomainSettings.fluid_group -> fluid_group: pointer Limit fluid objects to this group +SmokeDomainSettings.maxres -> maxres: int Maximal resolution used in the fluid domain +SmokeDomainSettings.noise_type -> noise_type: enum Noise method which is used for creating the high resolution +SmokeDomainSettings.point_cache_high -> point_cache_high: pointer, (read-only) +SmokeDomainSettings.point_cache_low -> point_cache_low: pointer, (read-only) +SmokeDomainSettings.smoke_cache_comp -> smoke_cache_comp: enum Compression method to be used +SmokeDomainSettings.smoke_cache_high_comp -> smoke_cache_high_comp: enum Compression method to be used +SmokeDomainSettings.strength -> strength: float Strength of wavelet noise +SmokeFlowSettings.density -> density: float +SmokeFlowSettings.psys -> psys: pointer Particle systems emitted from the object +SmokeFlowSettings.temperature -> temperature: float Temperature difference to ambient temperature +SmokeModifier.coll_settings -> coll_settings: pointer, (read-only) +SmokeModifier.domain_settings -> domain_settings: pointer, (read-only) +SmokeModifier.flow_settings -> flow_settings: pointer, (read-only) +SmokeModifier.smoke_type -> smoke_type: enum +SmoothModifier.factor -> factor: float +SmoothModifier.repeat -> repeat: int +SmoothModifier.vertex_group -> vertex_group: string Vertex group name +SoftBodyModifier.point_cache -> point_cache: pointer, (read-only) +SoftBodyModifier.settings -> settings: pointer, (read-only) +SoftBodySettings.aero -> aero: float Make edges 'sail' +SoftBodySettings.aerodynamics_type -> aerodynamics_type: enum Method of calculating aerodynamic interaction +SoftBodySettings.ball_damp -> ball_damp: float Blending to inelastic collision +SoftBodySettings.ball_size -> ball_size: float Absolute ball size or factor if not manual adjusted +SoftBodySettings.ball_stiff -> ball_stiff: float Ball inflating pressure +SoftBodySettings.bending -> bend: float Bending Stiffness +SoftBodySettings.choke -> choke: int 'Viscosity' inside collision target +SoftBodySettings.collision_type -> collision_type: enum Choose Collision Type +SoftBodySettings.damp -> damp: float Edge spring friction +SoftBodySettings.effector_weights -> effector_weights: pointer, (read-only) +SoftBodySettings.error_limit -> error_limit: float The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed +SoftBodySettings.friction -> friction: float General media friction for point movements +SoftBodySettings.fuzzy -> fuzzy: int Fuzziness while on collision, high values make collsion handling faster but less stable +SoftBodySettings.goal_default -> goal_default: float Default Goal (vertex target position) value, when no Vertex Group used +SoftBodySettings.goal_friction -> goal_friction: float Goal (vertex target position) friction +SoftBodySettings.goal_max -> goal_max: float Goal maximum, vertex weights are scaled to match this range +SoftBodySettings.goal_min -> goal_min: float Goal minimum, vertex weights are scaled to match this range +SoftBodySettings.goal_spring -> goal_spring: float Goal (vertex target position) spring stiffness +SoftBodySettings.goal_vertex_group -> goal_vertex_group: string Control point weight values +SoftBodySettings.gravity -> gravity: float Apply gravitation to point movement +SoftBodySettings.lcom -> lcom: float Location of Center of mass +SoftBodySettings.lrot -> lrot: float Estimated rotation matrix +SoftBodySettings.lscale -> lscale: float Estimated scale matrix +SoftBodySettings.mass -> mass: float General Mass value +SoftBodySettings.mass_vertex_group -> mass_vertex_group: string Control point mass values +SoftBodySettings.maxstep -> step_max: int Maximal # solver steps/frame +SoftBodySettings.minstep -> step_min: int Minimal # solver steps/frame +SoftBodySettings.plastic -> plastic: float Permanent deform +SoftBodySettings.pull -> pull: float Edge spring stiffness when longer than rest length +SoftBodySettings.push -> push: float Edge spring stiffness when shorter than rest length +SoftBodySettings.shear -> shear: float Shear Stiffness +SoftBodySettings.speed -> speed: float Tweak timing for physics to control frequency and speed +SoftBodySettings.spring_length -> spring_length: float Alter spring length to shrink/blow up (unit %) 0 to disable +SoftBodySettings.spring_vertex_group -> spring_vertex_group: string Control point spring strength values +SolidifyModifier.edge_crease_inner -> edge_crease_inner: float Assign a crease to inner edges +SolidifyModifier.edge_crease_outer -> edge_crease_outer: float Assign a crease to outer edges +SolidifyModifier.edge_crease_rim -> edge_crease_rim: float Assign a crease to the edges making up the rim +SolidifyModifier.offset -> offset: float +SolidifyModifier.thickness -> thickness: float Thickness of the shell +SolidifyModifier.vertex_group -> vertex_group: string Vertex group name +Sound.filepath -> filepath: string Sound sample file used by this Sound datablock +Sound.packed_file -> packed_file: pointer, (read-only) +SoundActuator.cone_inner_angle_3d -> cone_inner_angle_3d: float The angle of the inner cone +SoundActuator.cone_outer_angle_3d -> cone_outer_angle_3d: float The angle of the outer cone +SoundActuator.cone_outer_gain_3d -> cone_outer_gain_3d: float The gain outside the outer cone. The gain in the outer cone will be interpolated between this value and the normal gain in the inner cone +SoundActuator.max_distance_3d -> distance_3d_max: float The maximum distance at which you can hear the sound +SoundActuator.maximum_gain_3d -> gain_3d_max: float The maximum gain of the sound, no matter how near it is +SoundActuator.minimum_gain_3d -> gain_3d_min: float The minimum gain of the sound, no matter how far it is away +SoundActuator.mode -> mode: enum +SoundActuator.pitch -> pitch: float Sets the pitch of the sound +SoundActuator.reference_distance_3d -> reference_distance_3d: float The distance where the sound has a gain of 1.0 +SoundActuator.rolloff_factor_3d -> rolloff_factor_3d: float The influence factor on volume depending on distance +SoundActuator.sound -> sound: pointer +SoundActuator.volume -> volume: float Sets the initial volume of the sound +SoundSequence.animation_end_offset -> animation_end_offset: int Animation end offset (trim end) +SoundSequence.animation_start_offset -> animation_start_offset: int Animation start offset (trim start) +SoundSequence.attenuation -> attenuation: float Attenuation in dezibel +SoundSequence.filepath -> filepath: string +SoundSequence.sound -> sound: pointer, (read-only) Sound datablock used by this sequence +SoundSequence.volume -> volume: float Playback volume of the sound +Space.type -> type: enum, (read-only) Space data type +SpaceConsole.console_type -> console_type: enum Console type +SpaceConsole.font_size -> font_size: int Font size to use for displaying the text +SpaceConsole.history -> history: collection, (read-only) Command history +SpaceConsole.language -> language: string Command line prompt language +SpaceConsole.prompt -> prompt: string Command line prompt +SpaceConsole.scrollback -> scrollback: collection, (read-only) Command output +SpaceConsole.selection_end -> selection_end: int +SpaceConsole.selection_start -> selection_start: int +SpaceDopeSheetEditor.action -> action: pointer Action displayed and edited in this space +SpaceDopeSheetEditor.autosnap -> autosnap: enum Automatic time snapping settings for transformations +SpaceDopeSheetEditor.dopesheet -> dopesheet: pointer, (read-only) Settings for filtering animation data +SpaceDopeSheetEditor.mode -> mode: enum Editing context being displayed +SpaceFileBrowser.params -> params: pointer, (read-only) Parameters and Settings for the Filebrowser +SpaceGraphEditor.autosnap -> autosnap: enum Automatic time snapping settings for transformations +SpaceGraphEditor.cursor_value -> cursor_value: float Graph Editor 2D-Value cursor - Y-Value component +SpaceGraphEditor.dopesheet -> dopesheet: pointer, (read-only) Settings for filtering animation data +SpaceGraphEditor.mode -> mode: enum Editing context being displayed +SpaceGraphEditor.pivot_point -> pivot_point: enum Pivot center for rotation/scaling +SpaceImageEditor.curves -> curves: pointer, (read-only) Color curve mapping to use for displaying the image +SpaceImageEditor.draw_channels -> draw_channels: enum Channels of the image to draw +SpaceImageEditor.grease_pencil -> grease_pencil: pointer Grease pencil data for this space +SpaceImageEditor.image -> image: pointer Image displayed and edited in this space +SpaceImageEditor.image_user -> image_user: pointer, (read-only) Parameters defining which layer, pass and frame of the image is displayed +SpaceImageEditor.sample_histogram -> sample_histogram: pointer, (read-only) Sampled colors along line +SpaceImageEditor.scopes -> scopes: pointer, (read-only) Scopes to visualize image statistics. +SpaceImageEditor.uv_editor -> uv_editor: pointer, (read-only) UV editor settings +SpaceNLA.autosnap -> autosnap: enum Automatic time snapping settings for transformations +SpaceNLA.dopesheet -> dopesheet: pointer, (read-only) Settings for filtering animation data +SpaceNodeEditor.id -> id: pointer, (read-only) Datablock whose nodes are being edited +SpaceNodeEditor.id_from -> id_from: pointer, (read-only) Datablock from which the edited datablock is linked +SpaceNodeEditor.nodetree -> nodetree: pointer, (read-only) Node tree being displayed and edited +SpaceNodeEditor.texture_type -> texture_type: enum Type of data to take texture from +SpaceNodeEditor.tree_type -> tree_type: enum Node tree type to display and edit +SpaceOutliner.display_filter -> display_filter: string Live search filtering string +SpaceOutliner.display_mode -> display_mode: enum Type of information to display +SpaceProperties.align -> align: enum Arrangement of the panels +SpaceProperties.context -> context: enum Type of active data to display and edit +SpaceProperties.pin_id -> pin_id: pointer +SpaceSequenceEditor.display_channel -> display_channel: int The channel number shown in the image preview. 0 is the result of all strips combined +SpaceSequenceEditor.display_mode -> display_mode: enum The view mode to use for displaying sequencer output +SpaceSequenceEditor.draw_overexposed -> draw_overexposed: int Show overexposed areas with zebra stripes +SpaceSequenceEditor.grease_pencil -> grease_pencil: pointer, (read-only) Grease pencil data for this space +SpaceSequenceEditor.offset_x -> offset_x: float Offsets image horizontally from the view center +SpaceSequenceEditor.offset_y -> offset_y: float Offsets image horizontally from the view center +SpaceSequenceEditor.proxy_render_size -> proxy_render_size: enum Draw preview using full resolution or different proxy resolutions +SpaceSequenceEditor.view_type -> view_type: enum The type of the Sequencer view (sequencer, preview or both) +SpaceSequenceEditor.zoom -> zoom: float Display zoom level +SpaceTextEditor.find_text -> find_text: string Text to search for with the find tool +SpaceTextEditor.font_size -> font_size: int Font size to use for displaying the text +SpaceTextEditor.replace_text -> replace_text: string Text to replace selected text with using the replace tool +SpaceTextEditor.tab_width -> tab_width: int Number of spaces to display tabs with +SpaceTextEditor.text -> text: pointer Text displayed and edited in this space +SpaceUVEditor.cursor_location -> cursor_location: float 2D cursor location for this view +SpaceUVEditor.draw_stretch_type -> draw_stretch_type: enum Type of stretch to draw +SpaceUVEditor.edge_draw_type -> edge_draw_type: enum Draw type for drawing UV edges +SpaceUVEditor.pivot -> pivot: enum Rotation/Scaling Pivot +SpaceUVEditor.sticky_selection_mode -> sticky_selection_mode: enum Automatically select also UVs sharing the same vertex as the ones being selected +SpaceUserPreferences.filter -> filter: string Search term for filtering in the UI +SpaceView3D.background_images -> background_images: collection, (read-only) List of background images +SpaceView3D.camera -> camera: pointer Active camera used in this view (when unlocked from the scene's active camera) +SpaceView3D.clip_end -> clip_end: float 3D View far clipping distance +SpaceView3D.clip_start -> clip_start: float 3D View near clipping distance +SpaceView3D.current_orientation -> current_orientation: pointer, (read-only) Current Transformation orientation +SpaceView3D.cursor_location -> cursor_location: float 3D cursor location for this view (dependent on local view setting) +SpaceView3D.grid_lines -> grid_lines: int The number of grid lines to display in perspective view +SpaceView3D.grid_spacing -> grid_spacing: float The distance between 3D View grid lines +SpaceView3D.grid_subdivisions -> grid_subdivisions: int The number of subdivisions between grid lines +SpaceView3D.lens -> lens: float Lens angle (mm) in perspective view +SpaceView3D.local_view -> local_view: pointer, (read-only) Display an isolated sub-set of objects, apart from the scene visibility +SpaceView3D.lock_bone -> lock_bone: string 3D View center is locked to this bone's position +SpaceView3D.lock_object -> lock_object: pointer 3D View center is locked to this object's position +SpaceView3D.pivot_point -> pivot_point: enum Pivot center for rotation/scaling +SpaceView3D.region_3d -> region_3d: pointer, (read-only) 3D region in this space, in case of quad view the camera region +SpaceView3D.region_quadview -> region_quadview: pointer, (read-only) 3D region that defines the quad view settings +SpaceView3D.transform_orientation -> transform_orientation: enum Transformation orientation +SpaceView3D.viewport_shading -> viewport_shade: enum Method to display/shade objects in the 3D View +SpeedControlSequence.global_speed -> global_speed: float +Spline.bezier_points -> bezier_points: collection, (read-only) Collection of points for bezier curves only +Spline.character_index -> character_index: int, (read-only) Location of this character in the text data (only for text curves) +Spline.material_index -> material_index: int +Spline.order_u -> order_u: int Nurbs order in the U direction (For splines and surfaces), Higher values let points influence a greater area +Spline.order_v -> order_v: int Nurbs order in the V direction (For surfaces only), Higher values let points influence a greater area +Spline.point_count_u -> point_count_u: int, (read-only) Total number points for the curve or surface in the U direction +Spline.point_count_v -> point_count_v: int, (read-only) Total number points for the surface on the V direction +Spline.points -> points: collection, (read-only) Collection of points that make up this poly or nurbs spline +Spline.radius_interpolation -> radius_interpolation: enum The type of radius interpolation for Bezier curves +Spline.resolution_u -> resolution_u: int Curve or Surface subdivisions per segment +Spline.resolution_v -> resolution_v: int Surface subdivisions per segment +Spline.tilt_interpolation -> tilt_interpolation: enum The type of tilt interpolation for 3D, Bezier curves +Spline.type -> type: enum The interpolation type for this curve element +SplineIKConstraint.chain_length -> chain_length: int How many bones are included in the chain +SplineIKConstraint.joint_bindings -> joint_bindings: float (EXPERIENCED USERS ONLY) The relative positions of the joints along the chain as percentages +SplineIKConstraint.target -> target: pointer Curve that controls this relationship +SplineIKConstraint.xz_scaling_mode -> xz_scale_mode: enum Method used for determining the scaling of the X and Z axes of the bones +SplinePoint.co -> co: float Point coordinates +SplinePoint.radius -> radius: float, (read-only) Radius for bevelling +SplinePoint.tilt -> tilt: float Tilt in 3D View +SplinePoint.weight -> weight: float Nurbs weight +SplinePoint.weight_softbody -> weight_softbody: float Softbody goal weight +SpotLamp.compression_threshold -> compression_threshold: float Deep shadow map compression threshold +SpotLamp.falloff_curve -> falloff_curve: pointer, (read-only) Custom Lamp Falloff Curve +SpotLamp.falloff_type -> falloff_type: enum Intensity Decay with distance +SpotLamp.halo_intensity -> halo_intensity: float Brightness of the spotlight's halo cone (Buffer Shadows) +SpotLamp.halo_step -> halo_step: int Volumetric halo sampling frequency +SpotLamp.linear_attenuation -> linear_attenuation: float Linear distance attenuation +SpotLamp.quadratic_attenuation -> quadratic_attenuation: float Quadratic distance attenuation +SpotLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float Threshold for Adaptive Sampling (Raytraced shadows) +SpotLamp.shadow_buffer_bias -> shadow_buffer_bias: float Shadow buffer sampling bias +SpotLamp.shadow_buffer_clip_end -> shadow_buffer_clip_end: float Shadow map clip end beyond which objects will not generate shadows +SpotLamp.shadow_buffer_clip_start -> shadow_buffer_clip_start: float Shadow map clip start: objects closer will not generate shadows +SpotLamp.shadow_buffer_samples -> shadow_buffer_samples: int Number of shadow buffer samples +SpotLamp.shadow_buffer_size -> shadow_buffer_size: int Resolution of the shadow buffer, higher values give crisper shadows but use more memory +SpotLamp.shadow_buffer_soft -> shadow_buffer_soft: float Size of shadow buffer sampling area +SpotLamp.shadow_buffer_type -> shadow_buffer_type: enum Type of shadow buffer +SpotLamp.shadow_color -> shadow_color: float Color of shadows cast by the lamp +SpotLamp.shadow_filter_type -> shadow_filter_type: enum Type of shadow filter (Buffer Shadows) +SpotLamp.shadow_method -> shadow_method: enum Method to compute lamp shadow with +SpotLamp.shadow_ray_samples -> shadow_ray_samples: int Amount of samples taken extra (samples x samples) +SpotLamp.shadow_ray_sampling_method -> shadow_ray_sample_method: enum Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower +SpotLamp.shadow_sample_buffers -> shadow_sample_buffers: enum Number of shadow buffers to render for better AA, this increases memory usage +SpotLamp.shadow_soft_size -> shadow_soft_size: float Light size for ray shadow sampling (Raytraced shadows) +SpotLamp.spot_blend -> spot_blend: float The softness of the spotlight edge +SpotLamp.spot_size -> spot_size: float Angle of the spotlight beam in degrees +StateActuator.operation -> operation: enum Select the bit operation on object state mask +StretchToConstraint.bulge -> bulge: float Factor between volume variation and stretching +StretchToConstraint.head_tail -> head_tail: float Target along length of bone: Head=0, Tail=1 +StretchToConstraint.keep_axis -> keep_axis: enum Axis to maintain during stretch +StretchToConstraint.original_length -> original_length: float Length at rest position +StretchToConstraint.subtarget -> subtarget: string +StretchToConstraint.target -> target: pointer Target Object +StretchToConstraint.volume -> volume: enum Maintain the object's volume as it stretches +StringProperty.default -> default: string, (read-only) string default value +StringProperty.max_length -> length_max: int, (read-only) Maximum length of the string, 0 means unlimited +Struct.base -> base: pointer, (read-only) Struct definition this is derived from +Struct.description -> description: string, (read-only) Description of the Struct's purpose +Struct.functions -> functions: collection, (read-only) +Struct.identifier -> identifier: string, (read-only) Unique name used in the code and scripting +Struct.name -> name: string, (read-only) Human readable name +Struct.name_property -> name_property: pointer, (read-only) Property that gives the name of the struct +Struct.nested -> nested: pointer, (read-only) Struct in which this struct is always nested, and to which it logically belongs +Struct.properties -> properties: collection, (read-only) Properties in the struct +StucciTexture.noise_basis -> noise_basis: enum Sets the noise basis used for turbulence +StucciTexture.noise_size -> noise_size: float Sets scaling for noise input +StucciTexture.noise_type -> noise_type: enum +StucciTexture.stype -> stype: enum +StucciTexture.turbulence -> turbulence: float Sets the turbulence of the bandnoise and ringnoise types +SubsurfModifier.levels -> levels: int Number of subdivisions to perform +SubsurfModifier.render_levels -> render_levels: int Number of subdivisions to perform when rendering +SubsurfModifier.subdivision_type -> subdivision_type: enum Selects type of subdivision algorithm +SunLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float Threshold for Adaptive Sampling (Raytraced shadows) +SunLamp.shadow_color -> shadow_color: float Color of shadows cast by the lamp +SunLamp.shadow_method -> shadow_method: enum Method to compute lamp shadow with +SunLamp.shadow_ray_samples -> shadow_ray_samples: int Amount of samples taken extra (samples x samples) +SunLamp.shadow_ray_sampling_method -> shadow_ray_sampling_method: enum Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower +SunLamp.shadow_soft_size -> shadow_soft_size: float Light size for ray shadow sampling (Raytraced shadows) +SunLamp.sky -> sky: pointer, (read-only) Sky related settings for sun lamps +TexMapping.location -> location: float +TexMapping.maximum -> max: float Maximum value for clipping +TexMapping.minimum -> min: float Minimum value for clipping +TexMapping.rotation -> rotation: float +TexMapping.scale -> scale: float +Text.current_character -> current_character: int, (read-only) Index of current character in current line, and also start index of character in selection if one exists +Text.current_line -> current_line: pointer, (read-only) Current line, and start line of selection if one exists +Text.filepath -> filepath: string Filename of the text file +Text.lines -> lines: collection, (read-only) Lines of text +Text.markers -> markers: collection, (read-only) Text markers highlighting part of the text +Text.selection_end_character -> selection_end_character: int, (read-only) Index of character after end of selection in the selection end line +Text.selection_end_line -> selection_end_line: pointer, (read-only) End line of selection +TextBox.height -> height: float +TextBox.width -> width: float +TextBox.x -> x: float +TextBox.y -> y: float +TextCurve.active_textbox -> active_textbox: int +TextCurve.body -> body: string contents of this text object +TextCurve.edit_format -> edit_format: pointer, (read-only) Editing settings character formatting +TextCurve.family -> family: string Use Blender Objects as font characters. Give font objects a common name followed by the character it represents, eg. familya, familyb etc, and turn on Verts Duplication +TextCurve.font -> font: pointer +TextCurve.line_dist -> line_distance: float +TextCurve.offset_x -> offset_x: float Horizontal offset from the object origin +TextCurve.offset_y -> offset_y: float Vertical offset from the object origin +TextCurve.shear -> shear: float Italic angle of the characters +TextCurve.spacemode -> spacemode: enum Text align from the object center +TextCurve.spacing -> spacing: float +TextCurve.text_on_curve -> text_on_curve: pointer Curve deforming text object +TextCurve.text_size -> text_size: float +TextCurve.textboxes -> textboxes: collection, (read-only) +TextCurve.ul_height -> ul_height: float +TextCurve.ul_position -> ul_position: float Vertical position of underline +TextCurve.word_spacing -> word_spacing: float +TextLine.line -> line: string Text in the line +TextMarker.color -> color: float Color to display the marker with +TextMarker.end -> end: int, (read-only) Start position of the marker in the line +TextMarker.group -> group: int, (read-only) +TextMarker.line -> line: int, (read-only) Line in which the marker is located +TextMarker.start -> start: int, (read-only) Start position of the marker in the line +Texture.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +Texture.brightness -> intensity: float +Texture.color_ramp -> color_ramp: pointer, (read-only) +Texture.contrast -> contrast: float +Texture.factor_blue -> factor_blue: float +Texture.factor_green -> factor_green: float +Texture.factor_red -> factor_red: float +Texture.node_tree -> node_tree: pointer, (read-only) Node tree for node-based textures +Texture.saturation -> saturation: float +Texture.type -> type: enum +TextureNode.type -> type: enum, (read-only) +TextureNodeBricks.offset -> offset: float +TextureNodeBricks.offset_frequency -> offset_frequency: int Offset every N rows +TextureNodeBricks.squash -> squash: float +TextureNodeBricks.squash_frequency -> squash_frequency: int Squash every N rows +TextureNodeCurveRGB.mapping -> mapping: pointer, (read-only) +TextureNodeCurveTime.curve -> curve: pointer, (read-only) +TextureNodeCurveTime.end -> end: int +TextureNodeCurveTime.start -> start: int +TextureNodeImage.image -> image: pointer +TextureNodeMath.operation -> operation: enum +TextureNodeMixRGB.blend_type -> blend_type: enum +TextureNodeOutput.output_name -> output_name: string +TextureNodeTexture.node_output -> node_output: int For node-based textures, which output node to use +TextureNodeTexture.texture -> texture: pointer +TextureNodeValToRGB.color_ramp -> color_ramp: pointer, (read-only) +TextureSlot.blend_type -> blend_type: enum +TextureSlot.color -> color: float The default color for textures that don't return RGB +TextureSlot.default_value -> default_value: float Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard +TextureSlot.name -> name: string, (read-only) Texture slot name +TextureSlot.offset -> offset: float Fine tunes texture mapping X, Y and Z locations +TextureSlot.output_node -> output_node: enum Which output node to use, for node-based textures +TextureSlot.size -> size: float Sets scaling for the texture's X, Y and Z sizes +TextureSlot.texture -> texture: pointer Texture datablock used by this texture slot +Theme.bone_color_sets -> bone_color_sets: collection, (read-only) +Theme.console -> console: pointer, (read-only) +Theme.dopesheet_editor -> dopesheet_editor: pointer, (read-only) +Theme.file_browser -> file_browser: pointer, (read-only) +Theme.graph_editor -> graph_editor: pointer, (read-only) +Theme.image_editor -> image_editor: pointer, (read-only) +Theme.info -> info: pointer, (read-only) +Theme.logic_editor -> logic_editor: pointer, (read-only) +Theme.name -> name: string Name of the theme +Theme.nla_editor -> nla_editor: pointer, (read-only) +Theme.node_editor -> node_editor: pointer, (read-only) +Theme.outliner -> outliner: pointer, (read-only) +Theme.properties -> properties: pointer, (read-only) +Theme.sequence_editor -> sequence_editor: pointer, (read-only) +Theme.text_editor -> text_editor: pointer, (read-only) +Theme.theme_area -> theme_area: enum +Theme.timeline -> timeline: pointer, (read-only) +Theme.user_interface -> user_interface: pointer, (read-only) +Theme.user_preferences -> user_preferences: pointer, (read-only) +Theme.view_3d -> view_3d: pointer, (read-only) +ThemeAudioWindow.back -> back: float +ThemeAudioWindow.button -> button: float +ThemeAudioWindow.button_text -> button_text: float +ThemeAudioWindow.button_text_hi -> button_text_hi: float +ThemeAudioWindow.button_title -> button_title: float +ThemeAudioWindow.frame_current -> frame_current: float +ThemeAudioWindow.grid -> grid: float +ThemeAudioWindow.header -> header: float +ThemeAudioWindow.header_text -> header_text: float +ThemeAudioWindow.header_text_hi -> header_text_hi: float +ThemeAudioWindow.text -> text: float +ThemeAudioWindow.text_hi -> text_hi: float +ThemeAudioWindow.title -> title: float +ThemeAudioWindow.window_sliders -> window_sliders: float +ThemeBoneColorSet.active -> active: float Color used for active bones +ThemeBoneColorSet.normal -> normal: float Color used for the surface of bones +ThemeBoneColorSet.selected -> select: float Color used for selected bones +ThemeConsole.back -> back: float +ThemeConsole.button -> button: float +ThemeConsole.button_text -> button_text: float +ThemeConsole.button_text_hi -> button_text_hi: float +ThemeConsole.button_title -> button_title: float +ThemeConsole.cursor -> cursor: float +ThemeConsole.header -> header: float +ThemeConsole.header_text -> header_text: float +ThemeConsole.header_text_hi -> header_text_hi: float +ThemeConsole.line_error -> line_error: float +ThemeConsole.line_info -> line_info: float +ThemeConsole.line_input -> line_input: float +ThemeConsole.line_output -> line_output: float +ThemeConsole.text -> text: float +ThemeConsole.text_hi -> text_hi: float +ThemeConsole.title -> title: float +ThemeDopeSheet.active_channels_group -> active_channels_group: float +ThemeDopeSheet.back -> back: float +ThemeDopeSheet.button -> button: float +ThemeDopeSheet.button_text -> button_text: float +ThemeDopeSheet.button_text_hi -> button_text_hi: float +ThemeDopeSheet.button_title -> button_title: float +ThemeDopeSheet.channel_group -> channel_group: float +ThemeDopeSheet.channels -> channels: float +ThemeDopeSheet.channels_selected -> channels_selected: float +ThemeDopeSheet.dopesheet_channel -> dopesheet_channel: float +ThemeDopeSheet.dopesheet_subchannel -> dopesheet_subchannel: float +ThemeDopeSheet.frame_current -> frame_current: float +ThemeDopeSheet.grid -> grid: float +ThemeDopeSheet.header -> header: float +ThemeDopeSheet.header_text -> header_text: float +ThemeDopeSheet.header_text_hi -> header_text_hi: float +ThemeDopeSheet.list -> list: float +ThemeDopeSheet.list_text -> list_text: float +ThemeDopeSheet.list_text_hi -> list_text_hi: float +ThemeDopeSheet.list_title -> list_title: float +ThemeDopeSheet.long_key -> long_key: float +ThemeDopeSheet.long_key_selected -> long_key_selected: float +ThemeDopeSheet.text -> text: float +ThemeDopeSheet.text_hi -> text_hi: float +ThemeDopeSheet.title -> title: float +ThemeDopeSheet.value_sliders -> value_sliders: float +ThemeDopeSheet.view_sliders -> view_sliders: float +ThemeFileBrowser.active_file -> active_file: float +ThemeFileBrowser.active_file_text -> active_file_text: float +ThemeFileBrowser.back -> back: float +ThemeFileBrowser.button -> button: float +ThemeFileBrowser.button_text -> button_text: float +ThemeFileBrowser.button_text_hi -> button_text_hi: float +ThemeFileBrowser.button_title -> button_title: float +ThemeFileBrowser.header -> header: float +ThemeFileBrowser.header_text -> header_text: float +ThemeFileBrowser.header_text_hi -> header_text_hi: float +ThemeFileBrowser.list -> list: float +ThemeFileBrowser.list_text -> list_text: float +ThemeFileBrowser.list_text_hi -> list_text_hi: float +ThemeFileBrowser.list_title -> list_title: float +ThemeFileBrowser.scroll_handle -> scroll_handle: float +ThemeFileBrowser.scrollbar -> scrollbar: float +ThemeFileBrowser.selected_file -> selected_file: float +ThemeFileBrowser.text -> text: float +ThemeFileBrowser.text_hi -> text_hi: float +ThemeFileBrowser.tiles -> tiles: float +ThemeFileBrowser.title -> title: float +ThemeFontStyle.font_kerning_style -> font_kerning_style: enum Which style to use for font kerning +ThemeFontStyle.points -> points: int +ThemeFontStyle.shadow -> shadow: int Shadow size in pixels (0, 3 and 5 supported) +ThemeFontStyle.shadowalpha -> shadowalpha: float +ThemeFontStyle.shadowcolor -> shadowcolor: float Shadow color in grey value +ThemeFontStyle.shadx -> shadow_offset_x: int Shadow offset in pixels +ThemeFontStyle.shady -> shadow_offset_y: int Shadow offset in pixels +ThemeGraphEditor.active_channels_group -> active_channels_group: float +ThemeGraphEditor.back -> back: float +ThemeGraphEditor.button -> button: float +ThemeGraphEditor.button_text -> button_text: float +ThemeGraphEditor.button_text_hi -> button_text_hi: float +ThemeGraphEditor.button_title -> button_title: float +ThemeGraphEditor.channel_group -> channel_group: float +ThemeGraphEditor.channels_region -> channels_region: float +ThemeGraphEditor.dopesheet_channel -> dopesheet_channel: float +ThemeGraphEditor.dopesheet_subchannel -> dopesheet_subchannel: float +ThemeGraphEditor.frame_current -> frame_current: float +ThemeGraphEditor.grid -> grid: float +ThemeGraphEditor.handle_align -> handle_align: float +ThemeGraphEditor.handle_auto -> handle_auto: float +ThemeGraphEditor.handle_free -> handle_free: float +ThemeGraphEditor.handle_sel_align -> handle_sel_align: float +ThemeGraphEditor.handle_sel_auto -> handle_sel_auto: float +ThemeGraphEditor.handle_sel_free -> handle_sel_free: float +ThemeGraphEditor.handle_sel_vect -> handle_sel_vect: float +ThemeGraphEditor.handle_vect -> handle_vect: float +ThemeGraphEditor.handle_vertex -> handle_vertex: float +ThemeGraphEditor.handle_vertex_select -> handle_vertex_select: float +ThemeGraphEditor.handle_vertex_size -> handle_vertex_size: int +ThemeGraphEditor.header -> header: float +ThemeGraphEditor.header_text -> header_text: float +ThemeGraphEditor.header_text_hi -> header_text_hi: float +ThemeGraphEditor.lastsel_point -> lastsel_point: float +ThemeGraphEditor.list -> list: float +ThemeGraphEditor.list_text -> list_text: float +ThemeGraphEditor.list_text_hi -> list_text_hi: float +ThemeGraphEditor.list_title -> list_title: float +ThemeGraphEditor.panel -> panel: float +ThemeGraphEditor.text -> text: float +ThemeGraphEditor.text_hi -> text_hi: float +ThemeGraphEditor.title -> title: float +ThemeGraphEditor.vertex -> vertex: float +ThemeGraphEditor.vertex_select -> vertex_select: float +ThemeGraphEditor.vertex_size -> vertex_size: int +ThemeGraphEditor.window_sliders -> window_sliders: float +ThemeImageEditor.back -> back: float +ThemeImageEditor.button -> button: float +ThemeImageEditor.button_text -> button_text: float +ThemeImageEditor.button_text_hi -> button_text_hi: float +ThemeImageEditor.button_title -> button_title: float +ThemeImageEditor.editmesh_active -> editmesh_active: float +ThemeImageEditor.face -> face: float +ThemeImageEditor.face_dot -> face_dot: float +ThemeImageEditor.face_select -> face_select: float +ThemeImageEditor.facedot_size -> facedot_size: int +ThemeImageEditor.header -> header: float +ThemeImageEditor.header_text -> header_text: float +ThemeImageEditor.header_text_hi -> header_text_hi: float +ThemeImageEditor.scope_back -> scope_back: float +ThemeImageEditor.text -> text: float +ThemeImageEditor.text_hi -> text_hi: float +ThemeImageEditor.title -> title: float +ThemeImageEditor.vertex -> vertex: float +ThemeImageEditor.vertex_select -> vertex_select: float +ThemeImageEditor.vertex_size -> vertex_size: int +ThemeInfo.back -> back: float +ThemeInfo.button -> button: float +ThemeInfo.button_text -> button_text: float +ThemeInfo.button_text_hi -> button_text_hi: float +ThemeInfo.button_title -> button_title: float +ThemeInfo.header -> header: float +ThemeInfo.header_text -> header_text: float +ThemeInfo.header_text_hi -> header_text_hi: float +ThemeInfo.text -> text: float +ThemeInfo.text_hi -> text_hi: float +ThemeInfo.title -> title: float +ThemeLogicEditor.back -> back: float +ThemeLogicEditor.button -> button: float +ThemeLogicEditor.button_text -> button_text: float +ThemeLogicEditor.button_text_hi -> button_text_hi: float +ThemeLogicEditor.button_title -> button_title: float +ThemeLogicEditor.header -> header: float +ThemeLogicEditor.header_text -> header_text: float +ThemeLogicEditor.header_text_hi -> header_text_hi: float +ThemeLogicEditor.panel -> panel: float +ThemeLogicEditor.text -> text: float +ThemeLogicEditor.text_hi -> text_hi: float +ThemeLogicEditor.title -> title: float +ThemeNLAEditor.back -> back: float +ThemeNLAEditor.bars -> bars: float +ThemeNLAEditor.bars_selected -> bars_selected: float +ThemeNLAEditor.button -> button: float +ThemeNLAEditor.button_text -> button_text: float +ThemeNLAEditor.button_text_hi -> button_text_hi: float +ThemeNLAEditor.button_title -> button_title: float +ThemeNLAEditor.frame_current -> frame_current: float +ThemeNLAEditor.grid -> grid: float +ThemeNLAEditor.header -> header: float +ThemeNLAEditor.header_text -> header_text: float +ThemeNLAEditor.header_text_hi -> header_text_hi: float +ThemeNLAEditor.list -> list: float +ThemeNLAEditor.list_text -> list_text: float +ThemeNLAEditor.list_text_hi -> list_text_hi: float +ThemeNLAEditor.list_title -> list_title: float +ThemeNLAEditor.strips -> strips: float +ThemeNLAEditor.strips_selected -> strips_selected: float +ThemeNLAEditor.text -> text: float +ThemeNLAEditor.text_hi -> text_hi: float +ThemeNLAEditor.title -> title: float +ThemeNLAEditor.view_sliders -> view_sliders: float +ThemeNodeEditor.back -> back: float +ThemeNodeEditor.button -> button: float +ThemeNodeEditor.button_text -> button_text: float +ThemeNodeEditor.button_text_hi -> button_text_hi: float +ThemeNodeEditor.button_title -> button_title: float +ThemeNodeEditor.converter_node -> converter_node: float +ThemeNodeEditor.group_node -> group_node: float +ThemeNodeEditor.header -> header: float +ThemeNodeEditor.header_text -> header_text: float +ThemeNodeEditor.header_text_hi -> header_text_hi: float +ThemeNodeEditor.in_out_node -> in_out_node: float +ThemeNodeEditor.list -> list: float +ThemeNodeEditor.list_text -> list_text: float +ThemeNodeEditor.list_text_hi -> list_text_hi: float +ThemeNodeEditor.list_title -> list_title: float +ThemeNodeEditor.node_backdrop -> node_backdrop: float +ThemeNodeEditor.operator_node -> operator_node: float +ThemeNodeEditor.selected_text -> selected_text: float +ThemeNodeEditor.text -> text: float +ThemeNodeEditor.text_hi -> text_hi: float +ThemeNodeEditor.title -> title: float +ThemeNodeEditor.wire_select -> wire_select: float +ThemeNodeEditor.wires -> wires: float +ThemeOutliner.back -> back: float +ThemeOutliner.button -> button: float +ThemeOutliner.button_text -> button_text: float +ThemeOutliner.button_text_hi -> button_text_hi: float +ThemeOutliner.button_title -> button_title: float +ThemeOutliner.header -> header: float +ThemeOutliner.header_text -> header_text: float +ThemeOutliner.header_text_hi -> header_text_hi: float +ThemeOutliner.text -> text: float +ThemeOutliner.text_hi -> text_hi: float +ThemeOutliner.title -> title: float +ThemeProperties.back -> back: float +ThemeProperties.button -> button: float +ThemeProperties.button_text -> button_text: float +ThemeProperties.button_text_hi -> button_text_hi: float +ThemeProperties.button_title -> button_title: float +ThemeProperties.header -> header: float +ThemeProperties.header_text -> header_text: float +ThemeProperties.header_text_hi -> header_text_hi: float +ThemeProperties.panel -> panel: float +ThemeProperties.text -> text: float +ThemeProperties.text_hi -> text_hi: float +ThemeProperties.title -> title: float +ThemeSequenceEditor.audio_strip -> audio_strip: float +ThemeSequenceEditor.back -> back: float +ThemeSequenceEditor.button -> button: float +ThemeSequenceEditor.button_text -> button_text: float +ThemeSequenceEditor.button_text_hi -> button_text_hi: float +ThemeSequenceEditor.button_title -> button_title: float +ThemeSequenceEditor.draw_action -> draw_action: float +ThemeSequenceEditor.effect_strip -> effect_strip: float +ThemeSequenceEditor.frame_current -> frame_current: float +ThemeSequenceEditor.grid -> grid: float +ThemeSequenceEditor.header -> header: float +ThemeSequenceEditor.header_text -> header_text: float +ThemeSequenceEditor.header_text_hi -> header_text_hi: float +ThemeSequenceEditor.image_strip -> image_strip: float +ThemeSequenceEditor.keyframe -> keyframe: float +ThemeSequenceEditor.meta_strip -> meta_strip: float +ThemeSequenceEditor.movie_strip -> movie_strip: float +ThemeSequenceEditor.plugin_strip -> plugin_strip: float +ThemeSequenceEditor.scene_strip -> scene_strip: float +ThemeSequenceEditor.text -> text: float +ThemeSequenceEditor.text_hi -> text_hi: float +ThemeSequenceEditor.title -> title: float +ThemeSequenceEditor.transition_strip -> transition_strip: float +ThemeSequenceEditor.window_sliders -> window_sliders: float +ThemeStyle.grouplabel -> grouplabel: pointer, (read-only) +ThemeStyle.paneltitle -> paneltitle: pointer, (read-only) +ThemeStyle.panelzoom -> panelzoom: float Default zoom level for panel areas +ThemeStyle.widget -> widget: pointer, (read-only) +ThemeStyle.widgetlabel -> widgetlabel: pointer, (read-only) +ThemeTextEditor.back -> back: float +ThemeTextEditor.button -> button: float +ThemeTextEditor.button_text -> button_text: float +ThemeTextEditor.button_text_hi -> button_text_hi: float +ThemeTextEditor.button_title -> button_title: float +ThemeTextEditor.cursor -> cursor: float +ThemeTextEditor.header -> header: float +ThemeTextEditor.header_text -> header_text: float +ThemeTextEditor.header_text_hi -> header_text_hi: float +ThemeTextEditor.line_numbers_background -> line_numbers_background: float +ThemeTextEditor.scroll_bar -> scroll_bar: float +ThemeTextEditor.selected_text -> selected_text: float +ThemeTextEditor.syntax_builtin -> syntax_builtin: float +ThemeTextEditor.syntax_comment -> syntax_comment: float +ThemeTextEditor.syntax_numbers -> syntax_numbers: float +ThemeTextEditor.syntax_special -> syntax_special: float +ThemeTextEditor.syntax_string -> syntax_string: float +ThemeTextEditor.text -> text: float +ThemeTextEditor.text_hi -> text_hi: float +ThemeTextEditor.title -> title: float +ThemeTimeline.back -> back: float +ThemeTimeline.button -> button: float +ThemeTimeline.button_text -> button_text: float +ThemeTimeline.button_text_hi -> button_text_hi: float +ThemeTimeline.button_title -> button_title: float +ThemeTimeline.frame_current -> frame_current: float +ThemeTimeline.grid -> grid: float +ThemeTimeline.header -> header: float +ThemeTimeline.header_text -> header_text: float +ThemeTimeline.header_text_hi -> header_text_hi: float +ThemeTimeline.text -> text: float +ThemeTimeline.text_hi -> text_hi: float +ThemeTimeline.title -> title: float +ThemeUserInterface.icon_file -> icon_file: string +ThemeUserInterface.wcol_box -> wcol_box: pointer, (read-only) +ThemeUserInterface.wcol_list_item -> wcol_list_item: pointer, (read-only) +ThemeUserInterface.wcol_menu -> wcol_menu: pointer, (read-only) +ThemeUserInterface.wcol_menu_back -> wcol_menu_back: pointer, (read-only) +ThemeUserInterface.wcol_menu_item -> wcol_menu_item: pointer, (read-only) +ThemeUserInterface.wcol_num -> wcol_num: pointer, (read-only) +ThemeUserInterface.wcol_numslider -> wcol_numslider: pointer, (read-only) +ThemeUserInterface.wcol_option -> wcol_option: pointer, (read-only) +ThemeUserInterface.wcol_progress -> wcol_progress: pointer, (read-only) +ThemeUserInterface.wcol_pulldown -> wcol_pulldown: pointer, (read-only) +ThemeUserInterface.wcol_radio -> wcol_radio: pointer, (read-only) +ThemeUserInterface.wcol_regular -> wcol_regular: pointer, (read-only) +ThemeUserInterface.wcol_scroll -> wcol_scroll: pointer, (read-only) +ThemeUserInterface.wcol_state -> wcol_state: pointer, (read-only) +ThemeUserInterface.wcol_text -> wcol_text: pointer, (read-only) +ThemeUserInterface.wcol_toggle -> wcol_toggle: pointer, (read-only) +ThemeUserInterface.wcol_tool -> wcol_tool: pointer, (read-only) +ThemeUserPreferences.back -> back: float +ThemeUserPreferences.button -> button: float +ThemeUserPreferences.button_text -> button_text: float +ThemeUserPreferences.button_text_hi -> button_text_hi: float +ThemeUserPreferences.button_title -> button_title: float +ThemeUserPreferences.header -> header: float +ThemeUserPreferences.header_text -> header_text: float +ThemeUserPreferences.header_text_hi -> header_text_hi: float +ThemeUserPreferences.text -> text: float +ThemeUserPreferences.text_hi -> text_hi: float +ThemeUserPreferences.title -> title: float +ThemeView3D.act_spline -> act_spline: float +ThemeView3D.back -> back: float +ThemeView3D.bone_pose -> bone_pose: float +ThemeView3D.bone_solid -> bone_solid: float +ThemeView3D.button -> button: float +ThemeView3D.button_text -> button_text: float +ThemeView3D.button_text_hi -> button_text_hi: float +ThemeView3D.button_title -> button_title: float +ThemeView3D.edge_crease -> edge_crease: float +ThemeView3D.edge_facesel -> edge_facesel: float +ThemeView3D.edge_seam -> edge_seam: float +ThemeView3D.edge_select -> edge_select: float +ThemeView3D.edge_sharp -> edge_sharp: float +ThemeView3D.editmesh_active -> editmesh_active: float +ThemeView3D.face -> face: float +ThemeView3D.face_dot -> face_dot: float +ThemeView3D.face_select -> face_select: float +ThemeView3D.facedot_size -> facedot_size: int +ThemeView3D.frame_current -> frame_current: float +ThemeView3D.grid -> grid: float +ThemeView3D.handle_align -> handle_align: float +ThemeView3D.handle_auto -> handle_auto: float +ThemeView3D.handle_free -> handle_free: float +ThemeView3D.handle_sel_align -> handle_sel_align: float +ThemeView3D.handle_sel_auto -> handle_sel_auto: float +ThemeView3D.handle_sel_free -> handle_sel_free: float +ThemeView3D.handle_sel_vect -> handle_sel_vect: float +ThemeView3D.handle_vect -> handle_vect: float +ThemeView3D.header -> header: float +ThemeView3D.header_text -> header_text: float +ThemeView3D.header_text_hi -> header_text_hi: float +ThemeView3D.lamp -> lamp: float +ThemeView3D.lastsel_point -> lastsel_point: float +ThemeView3D.normal -> normal: float +ThemeView3D.nurb_sel_uline -> nurb_sel_uline: float +ThemeView3D.nurb_sel_vline -> nurb_sel_vline: float +ThemeView3D.nurb_uline -> nurb_uline: float +ThemeView3D.nurb_vline -> nurb_vline: float +ThemeView3D.object_active -> object_active: float +ThemeView3D.object_grouped -> object_grouped: float +ThemeView3D.object_grouped_active -> object_grouped_active: float +ThemeView3D.object_selected -> object_selected: float +ThemeView3D.panel -> panel: float +ThemeView3D.text -> text: float +ThemeView3D.text_hi -> text_hi: float +ThemeView3D.title -> title: float +ThemeView3D.transform -> transform: float +ThemeView3D.vertex -> vertex: float +ThemeView3D.vertex_normal -> vertex_normal: float +ThemeView3D.vertex_select -> vertex_select: float +ThemeView3D.vertex_size -> vertex_size: int +ThemeView3D.wire -> wire: float +ThemeWidgetColors.inner -> inner: float +ThemeWidgetColors.inner_sel -> inner_sel: float +ThemeWidgetColors.item -> item: float +ThemeWidgetColors.outline -> outline: float +ThemeWidgetColors.shadedown -> shadedown: int +ThemeWidgetColors.shadetop -> shadetop: int +ThemeWidgetColors.text -> text: float +ThemeWidgetColors.text_sel -> text_sel: float +ThemeWidgetStateColors.blend -> blend: float +ThemeWidgetStateColors.inner_anim -> inner_anim: float +ThemeWidgetStateColors.inner_anim_sel -> inner_anim_sel: float +ThemeWidgetStateColors.inner_driven -> inner_driven: float +ThemeWidgetStateColors.inner_driven_sel -> inner_driven_sel: float +ThemeWidgetStateColors.inner_key -> inner_key: float +ThemeWidgetStateColors.inner_key_sel -> inner_key_sel: float +TimelineMarker.camera -> camera: pointer Camera this timeline sets to active +TimelineMarker.frame -> frame: int The frame on which the timeline marker appears +TimelineMarker.name -> name: string +ToolSettings.autokey_mode -> autokey_mode: enum Mode of automatic keyframe insertion for Objects and Bones +ToolSettings.edge_path_mode -> edge_path_mode: enum The edge flag to tag when selecting the shortest path +ToolSettings.etch_adaptive_limit -> etch_adaptive_limit: float Number of bones in the subdivided stroke +ToolSettings.etch_convert_mode -> etch_convert_mode: enum Method used to convert stroke to bones +ToolSettings.etch_length_limit -> etch_length_limit: float Number of bones in the subdivided stroke +ToolSettings.etch_number -> etch_number: string DOC BROKEN +ToolSettings.etch_roll_mode -> etch_roll_mode: enum Method used to adjust the roll of bones when retargeting +ToolSettings.etch_side -> etch_side: string DOC BROKEN +ToolSettings.etch_subdivision_number -> etch_subdivision_number: int Number of bones in the subdivided stroke +ToolSettings.etch_template -> etch_template: pointer Template armature that will be retargeted to the stroke +ToolSettings.image_paint -> image_paint: pointer, (read-only) +ToolSettings.normal_size -> normal_size: float Display size for normals in the 3D view +ToolSettings.particle_edit -> particle_edit: pointer, (read-only) +ToolSettings.proportional_editing -> proportional_edit: enum Proportional editing mode +ToolSettings.proportional_editing_falloff -> proportional_edit_falloff: enum Falloff type for proportional editing mode +ToolSettings.sculpt -> sculpt: pointer, (read-only) +ToolSettings.snap_element -> snap_element: enum Type of element to snap to +ToolSettings.snap_target -> snap_target: enum Which part to snap onto the target +ToolSettings.uv_selection_mode -> uv_selection_mode: enum UV selection and display mode +ToolSettings.vertex_group_weight -> vertex_group_weight: float Weight to assign in vertex groups +ToolSettings.vertex_paint -> vertex_paint: pointer, (read-only) +ToolSettings.weight_paint -> weight_paint: pointer, (read-only) +TouchSensor.material -> material: pointer Only look for objects with this material +TrackToConstraint.head_tail -> head_tail: float Target along length of bone: Head=0, Tail=1 +TrackToConstraint.subtarget -> subtarget: string +TrackToConstraint.target -> target: pointer Target Object +TrackToConstraint.track -> track: enum Axis that points to the target object +TrackToConstraint.up -> up: enum Axis that points upward +TransformConstraint.from_max_x -> from_max_x: float Top range of X axis source motion +TransformConstraint.from_max_y -> from_max_y: float Top range of Y axis source motion +TransformConstraint.from_max_z -> from_max_z: float Top range of Z axis source motion +TransformConstraint.from_min_x -> from_min_x: float Bottom range of X axis source motion +TransformConstraint.from_min_y -> from_min_y: float Bottom range of Y axis source motion +TransformConstraint.from_min_z -> from_min_z: float Bottom range of Z axis source motion +TransformConstraint.map_from -> map_from: enum The transformation type to use from the target +TransformConstraint.map_to -> map_to: enum The transformation type to affect of the constrained object +TransformConstraint.map_to_x_from -> map_to_x_from: enum The source axis constrained object's X axis uses +TransformConstraint.map_to_y_from -> map_to_y_from: enum The source axis constrained object's Y axis uses +TransformConstraint.map_to_z_from -> map_to_z_from: enum The source axis constrained object's Z axis uses +TransformConstraint.subtarget -> subtarget: string +TransformConstraint.target -> target: pointer Target Object +TransformConstraint.to_max_x -> to_max_x: float Top range of X axis destination motion +TransformConstraint.to_max_y -> to_max_y: float Top range of Y axis destination motion +TransformConstraint.to_max_z -> to_max_z: float Top range of Z axis destination motion +TransformConstraint.to_min_x -> to_min_x: float Bottom range of X axis destination motion +TransformConstraint.to_min_y -> to_min_y: float Bottom range of Y axis destination motion +TransformConstraint.to_min_z -> to_min_z: float Bottom range of Z axis destination motion +TransformOrientation.matrix -> matrix: float +TransformOrientation.name -> name: string +TransformSequence.interpolation -> interpolation: enum +TransformSequence.rotation_start -> rotation_start: float +TransformSequence.scale_start_x -> scale_start_x: float +TransformSequence.scale_start_y -> scale_start_y: float +TransformSequence.translate_start_x -> translate_start_x: float +TransformSequence.translate_start_y -> translate_start_y: float +TransformSequence.translation_unit -> translation_unit: enum +UILayout.alignment -> alignment: enum +UILayout.operator_context -> operator_context: enum +UILayout.scale_x -> scale_x: float +UILayout.scale_y -> scale_y: float +UVProjectModifier.aspect_x -> aspect_x: float +UVProjectModifier.aspect_y -> aspect_y: float +UVProjectModifier.image -> image: pointer +UVProjectModifier.num_projectors -> num_projectors: int Number of projectors to use +UVProjectModifier.projectors -> projectors: collection, (read-only) +UVProjectModifier.scale_x -> scale_x: float +UVProjectModifier.scale_y -> scale_y: float +UVProjectModifier.uv_layer -> uv_layer: string UV layer name +UVProjector.object -> object: pointer Object to use as projector transform +UnitSettings.rotation_units -> rotation_units: enum Unit to use for displaying/editing rotation values +UnitSettings.scale_length -> scale_length: float Scale to use when converting between blender units and dimensions +UnitSettings.system -> system: enum The unit system to use for button display +UserPreferences.active_section -> active_section: enum Active section of the user preferences shown in the user interface +UserPreferences.addons -> addons: collection, (read-only) +UserPreferences.edit -> edit: pointer, (read-only) Settings for interacting with Blender data +UserPreferences.filepaths -> filepaths: pointer, (read-only) Default paths for external files +UserPreferences.inputs -> inputs: pointer, (read-only) Settings for input devices +UserPreferences.system -> system: pointer, (read-only) Graphics driver and operating system settings +UserPreferences.themes -> themes: collection, (read-only) +UserPreferences.uistyles -> uistyles: collection, (read-only) +UserPreferences.view -> view: pointer, (read-only) Preferences related to viewing data +UserPreferencesEdit.auto_keying_mode -> auto_keying_mode: enum Mode of automatic keyframe insertion for Objects and Bones +UserPreferencesEdit.grease_pencil_eraser_radius -> grease_pencil_eraser_radius: int Radius of eraser 'brush' +UserPreferencesEdit.grease_pencil_euclidean_distance -> grease_pencil_euclidean_distance: int Distance moved by mouse when drawing stroke (in pixels) to include +UserPreferencesEdit.grease_pencil_manhattan_distance -> grease_pencil_manhattan_distance: int Pixels moved by mouse per axis when drawing stroke +UserPreferencesEdit.keyframe_new_handle_type -> keyframe_new_handle_type: enum +UserPreferencesEdit.keyframe_new_interpolation_type -> keyframe_new_interpolation_type: enum +UserPreferencesEdit.material_link -> material_link: enum Toggle whether the material is linked to object data or the object block +UserPreferencesEdit.object_align -> object_align: enum When adding objects from a 3D View menu, either align them to that view's direction or the world coordinates +UserPreferencesEdit.undo_memory_limit -> undo_memory_limit: int Maximum memory usage in megabytes (0 means unlimited) +UserPreferencesEdit.undo_steps -> undo_steps: int Number of undo steps available (smaller values conserve memory) +UserPreferencesFilePaths.animation_player -> animation_player: string Path to a custom animation/frame sequence player +UserPreferencesFilePaths.animation_player_preset -> animation_player_preset: enum Preset configs for external animation players +UserPreferencesFilePaths.auto_save_time -> auto_save_time: int The time (in minutes) to wait between automatic temporary saves +UserPreferencesFilePaths.fonts_directory -> fonts_directory: string The default directory to search for loading fonts +UserPreferencesFilePaths.image_editor -> image_editor: string Path to an image editor +UserPreferencesFilePaths.python_scripts_directory -> python_scripts_directory: string The default directory to search for Python scripts (resets python module search path: sys.path) +UserPreferencesFilePaths.recent_files -> recent_files: int Maximum number of recently opened files to remember +UserPreferencesFilePaths.render_output_directory -> render_output_directory: string The default directory for rendering output +UserPreferencesFilePaths.save_version -> save_version: int The number of old versions to maintain in the current directory, when manually saving +UserPreferencesFilePaths.sequence_plugin_directory -> sequence_plugin_directory: string The default directory to search for sequence plugins +UserPreferencesFilePaths.sounds_directory -> sounds_directory: string The default directory to search for sounds +UserPreferencesFilePaths.temporary_directory -> temporary_directory: string The directory for storing temporary save files +UserPreferencesFilePaths.texture_plugin_directory -> texture_plugin_directory: string The default directory to search for texture plugins +UserPreferencesFilePaths.textures_directory -> textures_directory: string The default directory to search for textures +UserPreferencesInput.double_click_time -> double_click_time: int The time (in ms) for a double click +UserPreferencesInput.edited_keymaps -> edited_keymaps: collection, (read-only) +UserPreferencesInput.ndof_pan_speed -> ndof_pan_speed: int The overall panning speed of an NDOF device, as percent of standard +UserPreferencesInput.ndof_rotate_speed -> ndof_rotate_speed: int The overall rotation speed of an NDOF device, as percent of standard +UserPreferencesInput.select_mouse -> select_mouse: enum The mouse button used for selection +UserPreferencesInput.view_rotation -> view_rotation: enum Rotation style in the viewport +UserPreferencesInput.zoom_axis -> zoom_axis: enum Axis of mouse movement to zoom in or out on +UserPreferencesInput.zoom_style -> zoom_style: enum Which style to use for viewport scaling +UserPreferencesSystem.audio_channels -> audio_channels: enum Sets the audio channel count +UserPreferencesSystem.audio_device -> audio_device: enum Sets the audio output device +UserPreferencesSystem.audio_mixing_buffer -> audio_mixing_buffer: enum Sets the number of samples used by the audio mixing buffer +UserPreferencesSystem.audio_sample_format -> audio_sample_format: enum Sets the audio sample format +UserPreferencesSystem.audio_sample_rate -> audio_sample_rate: enum Sets the audio sample rate +UserPreferencesSystem.clip_alpha -> clip_alpha: float Clip alpha below this threshold in the 3D textured view +UserPreferencesSystem.color_picker_type -> color_picker_type: enum Different styles of displaying the color picker widget +UserPreferencesSystem.dpi -> dpi: int Font size and resolution for display +UserPreferencesSystem.frame_server_port -> frame_server_port: int Frameserver Port for Frameserver Rendering +UserPreferencesSystem.gl_texture_limit -> gl_texture_limit: enum Limit the texture size to save graphics memory +UserPreferencesSystem.language -> language: enum Language use for translation +UserPreferencesSystem.memory_cache_limit -> memory_cache_limit: int Memory cache limit in sequencer (megabytes) +UserPreferencesSystem.prefetch_frames -> prefetch_frames: int Number of frames to render ahead during playback +UserPreferencesSystem.screencast_fps -> screencast_fps: int Frame rate for the screencast to be played back +UserPreferencesSystem.screencast_wait_time -> screencast_wait_time: int Time in milliseconds between each frame recorded for screencast +UserPreferencesSystem.scrollback -> scrollback: int Maximum number of lines to store for the console buffer +UserPreferencesSystem.solid_lights -> solid_lights: collection, (read-only) Lights user to display objects in solid draw mode +UserPreferencesSystem.texture_collection_rate -> texture_collection_rate: int Number of seconds between each run of the GL texture garbage collector +UserPreferencesSystem.texture_time_out -> texture_time_out: int Time since last access of a GL texture in seconds after which it is freed. (Set to 0 to keep textures allocated.) +UserPreferencesSystem.weight_color_range -> weight_color_range: pointer, (read-only) Color range used for weight visualization in weight painting mode +UserPreferencesSystem.window_draw_method -> window_draw_method: enum Drawing method used by the window manager +UserPreferencesView.manipulator_handle_size -> manipulator_handle_size: int Size of widget handles as percentage of widget radius +UserPreferencesView.manipulator_hotspot -> manipulator_hotspot: int Hotspot in pixels for clicking widget handles +UserPreferencesView.manipulator_size -> manipulator_size: int Diameter of widget, in 10 pixel units +UserPreferencesView.mini_axis_brightness -> mini_axis_brightness: int The brightness of the icon +UserPreferencesView.mini_axis_size -> mini_axis_size: int The axis icon's size +UserPreferencesView.object_origin_size -> object_origin_size: int Diameter in Pixels for Object/Lamp origin display +UserPreferencesView.open_left_mouse_delay -> open_left_mouse_delay: int Time in 1/10 seconds to hold the Left Mouse Button before opening the toolbox +UserPreferencesView.open_right_mouse_delay -> open_right_mouse_delay: int Time in 1/10 seconds to hold the Right Mouse Button before opening the toolbox +UserPreferencesView.open_sublevel_delay -> open_sublevel_delay: int Time delay in 1/10 seconds before automatically opening sub level menus +UserPreferencesView.open_toplevel_delay -> open_toplevel_delay: int Time delay in 1/10 seconds before automatically opening top level menus +UserPreferencesView.properties_width_check -> properties_width_check: int Dual Column layout will change to single column layout when the width of the area gets below this value (needs restart to take effect) +UserPreferencesView.rotation_angle -> rotation_angle: int The rotation step for numerical pad keys (2 4 6 8) +UserPreferencesView.smooth_view -> smooth_view: int The time to animate the view in milliseconds, zero to disable +UserPreferencesView.timecode_style -> timecode_style: enum Format of Time Codes displayed when not displaying timing in terms of frames +UserPreferencesView.view2d_grid_minimum_spacing -> view2d_grid_spacing_min: int Minimum number of pixels between each gridline in 2D Viewports +UserPreferencesView.wheel_scroll_lines -> wheel_scroll_lines: int The number of lines scrolled at a time with the mouse wheel +UserSolidLight.diffuse_color -> diffuse_color: float The diffuse color of the OpenGL light +UserSolidLight.direction -> direction: float The direction that the OpenGL light is shining +UserSolidLight.specular_color -> specular_color: float The color of the lights specular highlight +ValueNodeSocket.default_value -> default_value: float Default value of the socket when no link is attached +ValueNodeSocket.name -> name: string, (read-only) Socket name +VectorFont.filepath -> filepath: string, (read-only) +VectorFont.packed_file -> packed_file: pointer, (read-only) +VectorNodeSocket.default_value -> default_value: float Default value of the socket when no link is attached +VectorNodeSocket.name -> name: string, (read-only) Socket name +VertexGroup.index -> index: int, (read-only) Index number of the vertex group +VertexGroup.name -> name: string Vertex group name +VertexGroupElement.group -> group: int, (read-only) +VertexGroupElement.weight -> weight: float Vertex Weight +VoronoiTexture.coloring -> color_mode: enum +VoronoiTexture.distance_metric -> distance_metric: enum +VoronoiTexture.minkovsky_exponent -> minkovsky_exponent: float Minkovsky exponent +VoronoiTexture.nabla -> nabla: float Size of derivative offset used for calculating normal +VoronoiTexture.noise_intensity -> noise_intensity: float +VoronoiTexture.noise_size -> noise_size: float Sets scaling for noise input +VoronoiTexture.weight_1 -> weight_1: float Voronoi feature weight 1 +VoronoiTexture.weight_2 -> weight_2: float Voronoi feature weight 2 +VoronoiTexture.weight_3 -> weight_3: float Voronoi feature weight 3 +VoronoiTexture.weight_4 -> weight_4: float Voronoi feature weight 4 +VoxelData.domain_object -> domain_object: pointer Object used as the smoke simulation domain +VoxelData.extension -> extension: enum Sets how the texture is extrapolated past its original bounds +VoxelData.file_format -> file_format: enum Format of the source data set to render +VoxelData.intensity -> intensity: float Multiplier for intensity values +VoxelData.interpolation -> interpolation: enum Method to interpolate/smooth values between voxel cells +VoxelData.resolution -> resolution: int Resolution of the voxel grid +VoxelData.smoke_data_type -> smoke_data_type: enum Simulation value to be used as a texture +VoxelData.source_path -> source_path: string The external source data file to use +VoxelData.still_frame_number -> still_frame_number: int The frame number to always use +VoxelDataTexture.image -> image: pointer +VoxelDataTexture.image_user -> image_user: pointer, (read-only) Parameters defining which layer, pass and frame of the image is displayed +VoxelDataTexture.voxeldata -> voxeldata: pointer, (read-only) The voxel data associated with this texture +WaveModifier.damping_time -> damping_time: float +WaveModifier.falloff_radius -> falloff_radius: float +WaveModifier.height -> height: float +WaveModifier.lifetime -> lifetime: float +WaveModifier.narrowness -> narrowness: float +WaveModifier.speed -> speed: float +WaveModifier.start_position_object -> start_position_object: pointer +WaveModifier.start_position_x -> start_position_x: float +WaveModifier.start_position_y -> start_position_y: float +WaveModifier.texture -> texture: pointer Texture for modulating the wave +WaveModifier.texture_coordinates -> texture_coordinates: enum Texture coordinates used for modulating input +WaveModifier.texture_coordinates_object -> texture_coordinates_object: pointer +WaveModifier.time_offset -> time_offset: float Either the starting frame (for positive speed) or ending frame (for negative speed.) +WaveModifier.uv_layer -> uv_layer: string UV layer name +WaveModifier.vertex_group -> vertex_group: string Vertex group name for modulating the wave +WaveModifier.width -> width: float +Window.screen -> screen: pointer Active screen showing in the window +WindowManager.active_keyconfig -> active_keyconfig: pointer +WindowManager.default_keyconfig -> default_keyconfig: pointer, (read-only) +WindowManager.keyconfigs -> keyconfigs: collection, (read-only) Registered key configurations +WindowManager.operators -> operators: collection, (read-only) Operator registry +WindowManager.windows -> windows: collection, (read-only) Open windows +WipeSequence.angle -> angle: float Edge angle +WipeSequence.blur_width -> blur_width: float Width of the blur edge, in percentage relative to the image size +WipeSequence.direction -> direction: enum Wipe direction +WipeSequence.transition_type -> transition_type: enum +WoodTexture.nabla -> nabla: float Size of derivative offset used for calculating normal +WoodTexture.noise_basis -> noise_basis: enum Sets the noise basis used for turbulence +WoodTexture.noise_size -> noise_size: float Sets scaling for noise input +WoodTexture.noise_type -> noise_type: enum +WoodTexture.noisebasis2 -> noisebasis2: enum +WoodTexture.stype -> stype: enum +WoodTexture.turbulence -> turbulence: float Sets the turbulence of the bandnoise and ringnoise types +World.active_texture -> active_texture: pointer Active texture slot being displayed +World.active_texture_index -> active_texture_index: int Index of active texture slot +World.ambient_color -> ambient_color: float +World.animation_data -> animation_data: pointer, (read-only) Animation data for this datablock +World.exposure -> exposure: float Amount of exponential color correction for light +World.horizon_color -> horizon_color: float Color at the horizon +World.lighting -> lighting: pointer, (read-only) World lighting settings +World.mist -> mist: pointer, (read-only) World mist settings +World.range -> range: float The color range that will be mapped to 0-1 +World.stars -> stars: pointer, (read-only) World stars settings +World.texture_slots -> texture_slots: collection, (read-only) Texture slots defining the mapping and influence of textures +World.zenith_color -> zenith_color: float Color at the zenith +WorldLighting.adapt_to_speed -> adapt_to_speed: float Use the speed vector pass to reduce AO samples in fast moving pixels. Higher values result in more aggressive sample reduction. Requires Vec pass enabled (for Raytrace Adaptive QMC) +WorldLighting.ao_blend_mode -> ao_blend_type: enum Defines how AO mixes with material shading +WorldLighting.ao_factor -> ao_factor: float Factor for ambient occlusion blending +WorldLighting.bias -> bias: float Bias (in radians) to prevent smoothed faces from showing banding (for Raytrace Constant Jittered) +WorldLighting.correction -> correction: float Ad-hoc correction for over-occlusion due to the approximation (for Approximate) +WorldLighting.distance -> distance: float Length of rays, defines how far away other faces give occlusion effect +WorldLighting.environment_color -> environment_color: enum Defines where the color of the environment light comes from +WorldLighting.environment_energy -> environment_energy: float Defines the strength of environment light +WorldLighting.error_tolerance -> error_tolerance: float Low values are slower and higher quality (for Approximate) +WorldLighting.falloff_strength -> falloff_strength: float Distance attenuation factor, the higher, the 'shorter' the shadows +WorldLighting.gather_method -> gather_method: enum +WorldLighting.indirect_bounces -> indirect_bounces: int Number of indirect diffuse light bounces to use for approximate ambient occlusion +WorldLighting.indirect_factor -> indirect_factor: float Factor for how much surrounding objects contribute to light +WorldLighting.passes -> passes: int Number of preprocessing passes to reduce overocclusion (for approximate ambient occlusion) +WorldLighting.sample_method -> sample_method: enum Method for generating shadow samples (for Raytrace) +WorldLighting.samples -> samples: int Amount of ray samples. Higher values give smoother results and longer rendering times +WorldLighting.threshold -> threshold: float Samples below this threshold will be considered fully shadowed/unshadowed and skipped (for Raytrace Adaptive QMC) +WorldMistSettings.depth -> depth: float The distance over which the mist effect fades in +WorldMistSettings.falloff -> falloff: enum Type of transition used to fade mist +WorldMistSettings.height -> height: float Control how much mist density decreases with height +WorldMistSettings.intensity -> intensity: float Intensity of the mist effect +WorldMistSettings.start -> start: float Starting distance of the mist, measured from the camera +WorldStarsSettings.average_separation -> average_separation: float Average distance between any two stars +WorldStarsSettings.color_randomization -> color_randomization: float Randomize star colors +WorldStarsSettings.min_distance -> distance_min: float Minimum distance to the camera for stars +WorldStarsSettings.size -> size: float Average screen dimension of stars +WorldTextureSlot.blend_factor -> blend_factor: float Amount texture affects color progression of the background +WorldTextureSlot.horizon_factor -> horizon_factor: float Amount texture affects color of the horizon +WorldTextureSlot.object -> object: pointer Object to use for mapping with Object texture coordinates +WorldTextureSlot.texture_coordinates -> texture_coordinates: enum Texture coordinates used to map the texture onto the background +WorldTextureSlot.zenith_down_factor -> zenith_down_factor: float Amount texture affects color of the zenith below +WorldTextureSlot.zenith_up_factor -> zenith_up_factor: float Amount texture affects color of the zenith above diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt new file mode 100644 index 00000000000..dd432d005a1 --- /dev/null +++ b/source/blender/modifiers/CMakeLists.txt @@ -0,0 +1,49 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2006, Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Jacques Beaurain +# Ben Batt +# +# ***** END GPL LICENSE BLOCK ***** + +FILE(GLOB SRC intern/*.c) + +SET(INC + . ./intern + ../blenlib + ../makesdna + ../blenkernel + ../blenkernel/intern + ../bmesh + ../render/extern/include + ../../../intern/guardedalloc + ../../../intern/decimation/extern + ../../../intern/elbeem/extern + ../../../intern/bsp/extern + ${ZLIB_INC} +) + +IF(NOT WITH_ELBEEM) + ADD_DEFINITIONS(-DDISABLE_ELBEEM) +ENDIF(NOT WITH_ELBEEM) + +BLENDERLIB(bf_modifiers "${SRC}" "${INC}") + diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h new file mode 100644 index 00000000000..bd10b4aa6fc --- /dev/null +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -0,0 +1,74 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful; + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation; + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): Ben Batt + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef MOD_MODIFIERTYPES_H +#define MOD_MODIFIERTYPES_H + +#include "BKE_modifier.h" + +/* ****************** Type structures for all modifiers ****************** */ + +extern ModifierTypeInfo modifierType_None; +extern ModifierTypeInfo modifierType_Subsurf; +extern ModifierTypeInfo modifierType_Lattice; +extern ModifierTypeInfo modifierType_Curve; +extern ModifierTypeInfo modifierType_Build; +extern ModifierTypeInfo modifierType_Mirror; +extern ModifierTypeInfo modifierType_Decimate; +extern ModifierTypeInfo modifierType_Wave; +extern ModifierTypeInfo modifierType_Armature; +extern ModifierTypeInfo modifierType_Hook; +extern ModifierTypeInfo modifierType_Softbody; +extern ModifierTypeInfo modifierType_Boolean; +extern ModifierTypeInfo modifierType_Array; +extern ModifierTypeInfo modifierType_EdgeSplit; +extern ModifierTypeInfo modifierType_Displace; +extern ModifierTypeInfo modifierType_UVProject; +extern ModifierTypeInfo modifierType_Smooth; +extern ModifierTypeInfo modifierType_Cast; +extern ModifierTypeInfo modifierType_MeshDeform; +extern ModifierTypeInfo modifierType_ParticleSystem; +extern ModifierTypeInfo modifierType_ParticleInstance; +extern ModifierTypeInfo modifierType_Explode; +extern ModifierTypeInfo modifierType_Cloth; +extern ModifierTypeInfo modifierType_Collision; +extern ModifierTypeInfo modifierType_Bevel; +extern ModifierTypeInfo modifierType_Shrinkwrap; +extern ModifierTypeInfo modifierType_Fluidsim; +extern ModifierTypeInfo modifierType_Mask; +extern ModifierTypeInfo modifierType_SimpleDeform; +extern ModifierTypeInfo modifierType_Multires; +extern ModifierTypeInfo modifierType_Surface; +extern ModifierTypeInfo modifierType_Smoke; +extern ModifierTypeInfo modifierType_ShapeKey; +extern ModifierTypeInfo modifierType_Solidify; +extern ModifierTypeInfo modifierType_Screw; + +/* MOD_util.c */ +void modifier_type_init(ModifierTypeInfo *types[], ModifierType type); + +#endif //MOD_MODIFIERTYPES_H diff --git a/source/blender/modifiers/Makefile b/source/blender/modifiers/Makefile new file mode 100644 index 00000000000..4b2c4b0a036 --- /dev/null +++ b/source/blender/modifiers/Makefile @@ -0,0 +1,34 @@ +# +# $Id$ +# +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Ben Batt +# +# ***** END GPL LICENSE BLOCK ***** +# +# Bounces make to subdirectories. + +SOURCEDIR = source/blender/modifiers +DIRS = intern + +include nan_subdirs.mk diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript new file mode 100644 index 00000000000..dc1598fa6e9 --- /dev/null +++ b/source/blender/modifiers/SConscript @@ -0,0 +1,20 @@ +#!/usr/bin/python +Import ('env') + +sources = env.Glob('intern/*.c') + +incs = '. ./intern' +incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern' +incs += ' ../render/extern/include' +incs += ' ../include ../blenlib ../makesdna ../blenkernel ../blenkernel/intern' + +incs += ' ' + env['BF_ZLIB_INC'] + +defs = [] + +if env['BF_NO_ELBEEM']: + defs.append('DISABLE_ELBEEM') + +env.BlenderLib ( libname = 'modifiers', sources = sources, + includes = Split(incs), defines=defs, + libtype=['core','player'], priority = [180, 20] ) diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c new file mode 100644 index 00000000000..f0c28cb8aef --- /dev/null +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -0,0 +1,178 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "string.h" + +#include "DNA_armature_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_lattice.h" +#include "BKE_modifier.h" + +#include "MEM_guardedalloc.h" + +#include "depsgraph_private.h" + +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + + amd->deformflag = ARM_DEF_ENVELOPE | ARM_DEF_VGROUP; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + ArmatureModifierData *tamd = (ArmatureModifierData*) target; + + tamd->object = amd->object; + tamd->deformflag = amd->deformflag; + strncpy(tamd->defgrp_name, amd->defgrp_name, 32); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + CustomDataMask dataMask = 0; + + /* ask for vertexgroups */ + dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + + return !amd->object; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + + walk(userData, ob, &amd->object); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, + DagNode *obNode) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + + if (amd->object) { + DagNode *curNode = dag_get_node(forest, amd->object); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier"); + } +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + + modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ + + armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL, + numVerts, amd->deformflag, + (float(*)[3])amd->prevCos, amd->defgrp_name); + /* free cache */ + if(amd->prevCos) { + MEM_freeN(amd->prevCos); + amd->prevCos= NULL; + } +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + DerivedMesh *dm = derivedData; + + if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + + armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts, + amd->deformflag, NULL, amd->defgrp_name); + + if(!derivedData) dm->release(dm); +} + +static void deformMatricesEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], + float (*defMats)[3][3], int numVerts) +{ + ArmatureModifierData *amd = (ArmatureModifierData*) md; + DerivedMesh *dm = derivedData; + + if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + + armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts, + amd->deformflag, NULL, amd->defgrp_name); + + if(!derivedData) dm->release(dm); +} + + +ModifierTypeInfo modifierType_Armature = { + /* name */ "Armature", + /* structName */ "ArmatureModifierData", + /* structSize */ sizeof(ArmatureModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ deformMatricesEM, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c new file mode 100644 index 00000000000..ef518531f13 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_array.c @@ -0,0 +1,556 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* Array modifier: duplicates the object multiple times along an axis */ + +#include "DNA_curve_types.h" +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" +#include "BLI_ghash.h" +#include "BLI_edgehash.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_displist.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_object.h" +#include "BKE_tessmesh.h" + +#include "depsgraph_private.h" + +static void initData(ModifierData *md) +{ + ArrayModifierData *amd = (ArrayModifierData*) md; + + /* default to 2 duplicates distributed along the x-axis by an + offset of 1 object-width + */ + amd->start_cap = amd->end_cap = amd->curve_ob = amd->offset_ob = NULL; + amd->count = 2; + amd->offset[0] = amd->offset[1] = amd->offset[2] = 0; + amd->scale[0] = 1; + amd->scale[1] = amd->scale[2] = 0; + amd->length = 0; + amd->merge_dist = 0.01; + amd->fit_type = MOD_ARR_FIXEDCOUNT; + amd->offset_type = MOD_ARR_OFF_RELATIVE; + amd->flags = 0; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + ArrayModifierData *amd = (ArrayModifierData*) md; + ArrayModifierData *tamd = (ArrayModifierData*) target; + + tamd->start_cap = amd->start_cap; + tamd->end_cap = amd->end_cap; + tamd->curve_ob = amd->curve_ob; + tamd->offset_ob = amd->offset_ob; + tamd->count = amd->count; + copy_v3_v3(tamd->offset, amd->offset); + copy_v3_v3(tamd->scale, amd->scale); + tamd->length = amd->length; + tamd->merge_dist = amd->merge_dist; + tamd->fit_type = amd->fit_type; + tamd->offset_type = amd->offset_type; + tamd->flags = amd->flags; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + ArrayModifierData *amd = (ArrayModifierData*) md; + + walk(userData, ob, &amd->start_cap); + walk(userData, ob, &amd->end_cap); + walk(userData, ob, &amd->curve_ob); + walk(userData, ob, &amd->offset_ob); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, + Object *ob, DagNode *obNode) +{ + ArrayModifierData *amd = (ArrayModifierData*) md; + + if (amd->start_cap) { + DagNode *curNode = dag_get_node(forest, amd->start_cap); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); + } + if (amd->end_cap) { + DagNode *curNode = dag_get_node(forest, amd->end_cap); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); + } + if (amd->curve_ob) { + DagNode *curNode = dag_get_node(forest, amd->curve_ob); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); + } + if (amd->offset_ob) { + DagNode *curNode = dag_get_node(forest, amd->offset_ob); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier"); + } +} + +static float vertarray_size(MVert *mvert, int numVerts, int axis) +{ + int i; + float min_co, max_co; + + /* if there are no vertices, width is 0 */ + if(numVerts == 0) return 0; + + /* find the minimum and maximum coordinates on the desired axis */ + min_co = max_co = mvert->co[axis]; + ++mvert; + for(i = 1; i < numVerts; ++i, ++mvert) { + if(mvert->co[axis] < min_co) min_co = mvert->co[axis]; + if(mvert->co[axis] > max_co) max_co = mvert->co[axis]; + } + + return max_co - min_co; +} + +/* finds the best possible flipped name. For renaming; check for unique names afterwards */ +/* if strip_number: removes number extensions */ +void vertgroup_flip_name (char *name, int strip_number) +{ + int len; + char prefix[128]={""}; /* The part before the facing */ + char suffix[128]={""}; /* The part after the facing */ + char replace[128]={""}; /* The replacement string */ + char number[128]={""}; /* The number extension string */ + char *index=NULL; + + len= strlen(name); + if(len<3) return; // we don't do names like .R or .L + + /* We first check the case with a .### extension, let's find the last period */ + if(isdigit(name[len-1])) { + index= strrchr(name, '.'); // last occurrance + if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever! + if(strip_number==0) + strcpy(number, index); + *index= 0; + len= strlen(name); + } + } + + strcpy (prefix, name); + +#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_') + + /* first case; separator . - _ with extensions r R l L */ + if( IS_SEPARATOR(name[len-2]) ) { + switch(name[len-1]) { + case 'l': + prefix[len-1]= 0; + strcpy(replace, "r"); + break; + case 'r': + prefix[len-1]= 0; + strcpy(replace, "l"); + break; + case 'L': + prefix[len-1]= 0; + strcpy(replace, "R"); + break; + case 'R': + prefix[len-1]= 0; + strcpy(replace, "L"); + break; + } + } + /* case; beginning with r R l L , with separator after it */ + else if( IS_SEPARATOR(name[1]) ) { + switch(name[0]) { + case 'l': + strcpy(replace, "r"); + strcpy(suffix, name+1); + prefix[0]= 0; + break; + case 'r': + strcpy(replace, "l"); + strcpy(suffix, name+1); + prefix[0]= 0; + break; + case 'L': + strcpy(replace, "R"); + strcpy(suffix, name+1); + prefix[0]= 0; + break; + case 'R': + strcpy(replace, "L"); + strcpy(suffix, name+1); + prefix[0]= 0; + break; + } + } + else if(len > 5) { + /* hrms, why test for a separator? lets do the rule 'ultimate left or right' */ + index = BLI_strcasestr(prefix, "right"); + if (index==prefix || index==prefix+len-5) { + if(index[0]=='r') + strcpy (replace, "left"); + else { + if(index[1]=='I') + strcpy (replace, "LEFT"); + else + strcpy (replace, "Left"); + } + *index= 0; + strcpy (suffix, index+5); + } + else { + index = BLI_strcasestr(prefix, "left"); + if (index==prefix || index==prefix+len-4) { + if(index[0]=='l') + strcpy (replace, "right"); + else { + if(index[1]=='E') + strcpy (replace, "RIGHT"); + else + strcpy (replace, "Right"); + } + *index= 0; + strcpy (suffix, index+4); + } + } + } + +#undef IS_SEPARATOR + + sprintf (name, "%s%s%s%s", prefix, replace, suffix, number); +} + +typedef struct IndexMapEntry { + /* the new vert index that this old vert index maps to */ + int new; + /* -1 if this vert isn't merged, otherwise the old vert index it + * should be replaced with + */ + int merge; + /* 1 if this vert's first copy is merged with the last copy of its + * merge target, otherwise 0 + */ + short merge_final; +} IndexMapEntry; + +/* indexMap - an array of IndexMap entries + * oldIndex - the old index to map + * copyNum - the copy number to map to (original = 0, first copy = 1, etc.) + */ +static int calc_mapping(IndexMapEntry *indexMap, int oldIndex, int copyNum) +{ + if(indexMap[oldIndex].merge < 0) { + /* vert wasn't merged, so use copy of this vert */ + return indexMap[oldIndex].new + copyNum; + } else if(indexMap[oldIndex].merge == oldIndex) { + /* vert was merged with itself */ + return indexMap[oldIndex].new; + } else { + /* vert was merged with another vert */ + /* follow the chain of merges to the end, or until we've passed + * a number of vertices equal to the copy number + */ + if(copyNum <= 0) + return indexMap[oldIndex].new; + else + return calc_mapping(indexMap, indexMap[oldIndex].merge, + copyNum - 1); + } +} + +static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, + Scene *scene, Object *ob, DerivedMesh *dm, + int initFlags) +{ + DerivedMesh *cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's + BMEditMesh *em = CDDM_To_BMesh(cddm, NULL); + BMOperator op, oldop, weldop; + int i, j, indexLen; + /* offset matrix */ + float offset[4][4]; + float final_offset[4][4]; + float tmp_mat[4][4]; + float length = amd->length; + int count = amd->count, maxVerts; + int finalVerts, finalEdges, finalFaces; + int *indexMap = NULL; + DerivedMesh *start_cap = NULL, *end_cap = NULL; + MVert *src_mvert; + + /* need to avoid infinite recursion here */ + if(amd->start_cap && amd->start_cap != ob) + start_cap = mesh_get_derived_final(scene, amd->start_cap, CD_MASK_MESH); + if(amd->end_cap && amd->end_cap != ob) + end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH); + + unit_m4(offset); + + src_mvert = cddm->getVertArray(dm); + maxVerts = cddm->getNumVerts(dm); + + if(amd->offset_type & MOD_ARR_OFF_CONST) + add_v3_v3v3(offset[3], offset[3], amd->offset); + if(amd->offset_type & MOD_ARR_OFF_RELATIVE) { + for(j = 0; j < 3; j++) + offset[3][j] += amd->scale[j] * vertarray_size(src_mvert, + maxVerts, j); + } + + if((amd->offset_type & MOD_ARR_OFF_OBJ) && (amd->offset_ob)) { + float obinv[4][4]; + float result_mat[4][4]; + + if(ob) + invert_m4_m4(obinv, ob->obmat); + else + unit_m4(obinv); + + mul_serie_m4(result_mat, offset, + obinv, amd->offset_ob->obmat, + NULL, NULL, NULL, NULL, NULL); + copy_m4_m4(offset, result_mat); + } + + if(amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) { + Curve *cu = amd->curve_ob->data; + if(cu) { + float tmp_mat[3][3]; + float scale; + + object_to_mat3(amd->curve_ob, tmp_mat); + scale = mat3_to_scale(tmp_mat); + + if(!cu->path) { + cu->flag |= CU_PATH; // needed for path & bevlist + makeDispListCurveTypes(scene, amd->curve_ob, 0); + } + if(cu->path) + length = scale*cu->path->totdist; + } + } + + /* calculate the maximum number of copies which will fit within the + prescribed length */ + if(amd->fit_type == MOD_ARR_FITLENGTH + || amd->fit_type == MOD_ARR_FITCURVE) + { + float dist = sqrt(INPR(offset[3], offset[3])); + + if(dist > 1e-6f) + /* this gives length = first copy start to last copy end + add a tiny offset for floating point rounding errors */ + count = (length + 1e-6f) / dist; + else + /* if the offset has no translation, just make one copy */ + count = 1; + } + + if(count < 1) + count = 1; + + /* allocate memory for count duplicates (including original) plus + * start and end caps + */ + finalVerts = dm->getNumVerts(dm) * count; + finalEdges = dm->getNumEdges(dm) * count; + finalFaces = dm->getNumFaces(dm) * count; + if(start_cap) { + finalVerts += start_cap->getNumVerts(start_cap); + finalEdges += start_cap->getNumEdges(start_cap); + finalFaces += start_cap->getNumFaces(start_cap); + } + if(end_cap) { + finalVerts += end_cap->getNumVerts(end_cap); + finalEdges += end_cap->getNumEdges(end_cap); + finalFaces += end_cap->getNumFaces(end_cap); + } + + /* calculate the offset matrix of the final copy (for merging) */ + unit_m4(final_offset); + + for(j=0; j < count - 1; j++) { + mul_m4_m4m4(tmp_mat, final_offset, offset); + copy_m4_m4(final_offset, tmp_mat); + } + + BMO_Init_Op(&weldop, "weldverts"); + BMO_InitOpf(em->bm, &op, "dupe geom=%avef"); + oldop = op; + for (j=0; j < count; j++) { + BMVert *v, *v2; + BMOpSlot *s1; + BMOpSlot *s2; + + BMO_InitOpf(em->bm, &op, "dupe geom=%s", &oldop, j==0 ? "geom" : "newout"); + BMO_Exec_Op(em->bm, &op); + + s1 = BMO_GetSlot(&op, "geom"); + s2 = BMO_GetSlot(&op, "newout"); + + BMO_CallOpf(em->bm, "transform mat=%m4 verts=%s", offset, &op, "newout"); + + #define _E(s, i) ((BMVert**)(s)->data.buf)[i] + + /*calculate merge mapping*/ + if (j == 0) { + BMOperator findop; + BMOIter oiter; + BMVert *v, *v2; + BMHeader *h; + + BMO_InitOpf(em->bm, &findop, + "finddoubles verts=%av dist=%f keepverts=%s", + amd->merge_dist, &op, "geom"); + + i = 0; + BMO_ITER(h, &oiter, em->bm, &op, "geom", BM_ALL) { + BMINDEX_SET(h, i); + i++; + } + + BMO_ITER(h, &oiter, em->bm, &op, "newout", BM_ALL) { + BMINDEX_SET(h, i); + i++; + } + + BMO_Exec_Op(em->bm, &findop); + + indexLen = i; + indexMap = MEM_callocN(sizeof(int)*indexLen, "indexMap"); + + /*element type argument doesn't do anything here*/ + BMO_ITER(v, &oiter, em->bm, &findop, "targetmapout", 0) { + v2 = BMO_IterMapValp(&oiter); + + indexMap[BMINDEX_GET(v)] = BMINDEX_GET(v2)+1; + } + + BMO_Finish_Op(em->bm, &findop); + } + + /*generate merge mappping using index map. we do this by using the + operator slots as lookup arrays.*/ + #define E(i) (i) < s1->len ? _E(s1, i) : _E(s2, (i)-s1->len) + + for (i=0; ibm, &weldop, "targetmap", v, v2); + } + + #undef E + #undef _E + + BMO_Finish_Op(em->bm, &oldop); + oldop = op; + } + + if (j > 0) BMO_Finish_Op(em->bm, &op); + + if (amd->flags & MOD_ARR_MERGE) + BMO_Exec_Op(em->bm, &weldop); + + BMO_Finish_Op(em->bm, &weldop); + + BMEdit_RecalcTesselation(em); + cddm = CDDM_from_BMEditMesh(em, NULL); + + BMEdit_Free(em); + MEM_freeN(indexMap); + + return cddm; +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *result; + ArrayModifierData *amd = (ArrayModifierData*) md; + + result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0); + + //if(result != derivedData) + // CDDM_calc_normals(result); + + return result; +} + +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_Array = { + /* name */ "Array", + /* structName */ "ArrayModifierData", + /* structSize */ sizeof(ArrayModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode + | eModifierTypeFlag_AcceptsCVs, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c new file mode 100644 index 00000000000..1ece8581963 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -0,0 +1,142 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "BKE_bmesh.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" + + +static void initData(ModifierData *md) +{ + BevelModifierData *bmd = (BevelModifierData*) md; + + bmd->value = 0.1f; + bmd->res = 1; + bmd->flags = 0; + bmd->val_flags = 0; + bmd->lim_flags = 0; + bmd->e_flags = 0; + bmd->bevel_angle = 30; + bmd->defgrp_name[0] = '\0'; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + BevelModifierData *bmd = (BevelModifierData*) md; + BevelModifierData *tbmd = (BevelModifierData*) target; + + tbmd->value = bmd->value; + tbmd->res = bmd->res; + tbmd->flags = bmd->flags; + tbmd->val_flags = bmd->val_flags; + tbmd->lim_flags = bmd->lim_flags; + tbmd->e_flags = bmd->e_flags; + tbmd->bevel_angle = bmd->bevel_angle; + strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + BevelModifierData *bmd = (BevelModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(bmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ +#if 0 + DerivedMesh *result; + BME_Mesh *bm; + + /*bDeformGroup *def;*/ + int /*i,*/ options, defgrp_index = -1; + BevelModifierData *bmd = (BevelModifierData*) md; + + options = bmd->flags|bmd->val_flags|bmd->lim_flags|bmd->e_flags; + + /*if ((options & BME_BEVEL_VWEIGHT) && bmd->defgrp_name[0]) { + defgrp_index = defgroup_name_index(ob, bmd->defgrp_name); + if (defgrp_index < 0) { + options &= ~BME_BEVEL_VWEIGHT; + } + }*/ + + bm = BME_derivedmesh_to_bmesh(derivedData); + BME_bevel(bm,bmd->value,bmd->res,options,defgrp_index,bmd->bevel_angle,NULL); + result = BME_bmesh_to_derivedmesh(bm,derivedData); + BME_free_mesh(bm); + + CDDM_calc_normals(result); +#endif + + return CDDM_copy(derivedData, 0); +} + +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_Bevel = { + /* name */ "Bevel", + /* structName */ "BevelModifierData", + /* structSize */ sizeof(BevelModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c new file mode 100644 index 00000000000..116f5ab22d2 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -0,0 +1,139 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + + +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" + +#include "depsgraph_private.h" + +#include "MOD_boolean_util.h" + + +static void copyData(ModifierData *md, ModifierData *target) +{ + BooleanModifierData *bmd = (BooleanModifierData*) md; + BooleanModifierData *tbmd = (BooleanModifierData*) target; + + tbmd->object = bmd->object; + tbmd->operation = bmd->operation; +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + BooleanModifierData *bmd = (BooleanModifierData*) md; + + return !bmd->object; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + BooleanModifierData *bmd = (BooleanModifierData*) md; + + walk(userData, ob, &bmd->object); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, + DagNode *obNode) +{ + BooleanModifierData *bmd = (BooleanModifierData*) md; + + if(bmd->object) { + DagNode *curNode = dag_get_node(forest, bmd->object); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Boolean Modifier"); + } +} + + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + BooleanModifierData *bmd = (BooleanModifierData*) md; + DerivedMesh *dm = bmd->object->derivedFinal; + + /* we do a quick sanity check */ + if(dm && (derivedData->getNumFaces(derivedData) > 3) + && bmd->object && dm->getNumFaces(dm) > 3) { + DerivedMesh *result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob, + 1 + bmd->operation); + + /* if new mesh returned, return it; otherwise there was + * an error, so delete the modifier object */ + if(result) + return result; + else + modifier_setError(md, "Can't execute boolean operation."); + } + + return derivedData; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE); + + dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + + +ModifierTypeInfo modifierType_Boolean = { + /* name */ "Boolean", + /* structName */ "BooleanModifierData", + /* structSize */ sizeof(BooleanModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_UsesPointCache, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ 0, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c new file mode 100644 index 00000000000..705756fd25d --- /dev/null +++ b/source/blender/modifiers/intern/MOD_boolean_util.c @@ -0,0 +1,591 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) Blender Foundation + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + * CSG operations. + */ + +#include "DNA_material_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#include "BLI_math.h" +#include "BLI_ghash.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_depsgraph.h" +#include "BKE_material.h" +#include "BKE_mesh.h" +#include "BKE_object.h" + +#include "CSG_BooleanOps.h" + +/** + * Here's the vertex iterator structure used to walk through + * the blender vertex structure. + */ + +typedef struct { + DerivedMesh *dm; + Object *ob; + int pos; +} VertexIt; + +/** + * Implementations of local vertex iterator functions. + * These describe a blender mesh to the CSG module. + */ + +static void VertexIt_Destruct(CSG_VertexIteratorDescriptor * iterator) +{ + if (iterator->it) { + // deallocate memory for iterator + MEM_freeN(iterator->it); + iterator->it = 0; + } + iterator->Done = NULL; + iterator->Fill = NULL; + iterator->Reset = NULL; + iterator->Step = NULL; + iterator->num_elements = 0; + +} + +static int VertexIt_Done(CSG_IteratorPtr it) +{ + VertexIt * iterator = (VertexIt *)it; + return(iterator->pos >= iterator->dm->getNumVerts(iterator->dm)); +} + +static void VertexIt_Fill(CSG_IteratorPtr it, CSG_IVertex *vert) +{ + VertexIt * iterator = (VertexIt *)it; + MVert *verts = iterator->dm->getVertArray(iterator->dm); + + float global_pos[3]; + + /* boolean happens in global space, transform both with obmat */ + mul_v3_m4v3( + global_pos, + iterator->ob->obmat, + verts[iterator->pos].co + ); + + vert->position[0] = global_pos[0]; + vert->position[1] = global_pos[1]; + vert->position[2] = global_pos[2]; +} + +static void VertexIt_Step(CSG_IteratorPtr it) +{ + VertexIt * iterator = (VertexIt *)it; + iterator->pos ++; +} + +static void VertexIt_Reset(CSG_IteratorPtr it) +{ + VertexIt * iterator = (VertexIt *)it; + iterator->pos = 0; +} + +static void VertexIt_Construct(CSG_VertexIteratorDescriptor *output, DerivedMesh *dm, Object *ob) +{ + + VertexIt *it; + if (output == 0) return; + + // allocate some memory for blender iterator + it = (VertexIt *)(MEM_mallocN(sizeof(VertexIt),"Boolean_VIt")); + if (it == 0) { + return; + } + // assign blender specific variables + it->dm = dm; + it->ob = ob; // needed for obmat transformations + + it->pos = 0; + + // assign iterator function pointers. + output->Step = VertexIt_Step; + output->Fill = VertexIt_Fill; + output->Done = VertexIt_Done; + output->Reset = VertexIt_Reset; + output->num_elements = it->dm->getNumVerts(it->dm); + output->it = it; +} + +/** + * Blender Face iterator + */ + +typedef struct { + DerivedMesh *dm; + int pos; + int offset; + int flip; +} FaceIt; + +static void FaceIt_Destruct(CSG_FaceIteratorDescriptor * iterator) +{ + MEM_freeN(iterator->it); + iterator->Done = NULL; + iterator->Fill = NULL; + iterator->Reset = NULL; + iterator->Step = NULL; + iterator->num_elements = 0; +} + +static int FaceIt_Done(CSG_IteratorPtr it) +{ + // assume CSG_IteratorPtr is of the correct type. + FaceIt * iterator = (FaceIt *)it; + return(iterator->pos >= iterator->dm->getNumTessFaces(iterator->dm)); +} + +static void FaceIt_Fill(CSG_IteratorPtr it, CSG_IFace *face) +{ + // assume CSG_IteratorPtr is of the correct type. + FaceIt *face_it = (FaceIt *)it; + MFace *mfaces = face_it->dm->getTessFaceArray(face_it->dm); + MFace *mface = &mfaces[face_it->pos]; + + /* reverse face vertices if necessary */ + face->vertex_index[1] = mface->v2; + if( face_it->flip == 0 ) { + face->vertex_index[0] = mface->v1; + face->vertex_index[2] = mface->v3; + } else { + face->vertex_index[2] = mface->v1; + face->vertex_index[0] = mface->v3; + } + if (mface->v4) { + face->vertex_index[3] = mface->v4; + face->vertex_number = 4; + } else { + face->vertex_number = 3; + } + + face->orig_face = face_it->offset + face_it->pos; +} + +static void FaceIt_Step(CSG_IteratorPtr it) +{ + FaceIt * face_it = (FaceIt *)it; + face_it->pos ++; +} + +static void FaceIt_Reset(CSG_IteratorPtr it) +{ + FaceIt * face_it = (FaceIt *)it; + face_it->pos = 0; +} + +static void FaceIt_Construct( + CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset, Object *ob) +{ + FaceIt *it; + if (output == 0) return; + + // allocate some memory for blender iterator + it = (FaceIt *)(MEM_mallocN(sizeof(FaceIt),"Boolean_FIt")); + if (it == 0) { + return ; + } + // assign blender specific variables + it->dm = dm; + it->offset = offset; + it->pos = 0; + + /* determine if we will need to reverse order of face vertices */ + if (ob->size[0] < 0.0f) { + if (ob->size[1] < 0.0f && ob->size[2] < 0.0f) { + it->flip = 1; + } else if (ob->size[1] >= 0.0f && ob->size[2] >= 0.0f) { + it->flip = 1; + } else { + it->flip = 0; + } + } else { + if (ob->size[1] < 0.0f && ob->size[2] < 0.0f) { + it->flip = 0; + } else if (ob->size[1] >= 0.0f && ob->size[2] >= 0.0f) { + it->flip = 0; + } else { + it->flip = 1; + } + } + + // assign iterator function pointers. + output->Step = FaceIt_Step; + output->Fill = FaceIt_Fill; + output->Done = FaceIt_Done; + output->Reset = FaceIt_Reset; + output->num_elements = it->dm->getNumTessFaces(it->dm); + output->it = it; +} + +static Object *AddNewBlenderMesh(Scene *scene, Base *base) +{ + // This little function adds a new mesh object to the blender object list + // It uses ob to duplicate data as this seems to be easier than creating + // a new one. This new oject contains no faces nor vertices. + Mesh *old_me; + Base *basen; + Object *ob_new; + + // now create a new blender object. + // duplicating all the settings from the previous object + // to the new one. + ob_new= copy_object(base->object); + + // Ok we don't want to use the actual data from the + // last object, the above function incremented the + // number of users, so decrement it here. + old_me= ob_new->data; + old_me->id.us--; + + // Now create a new base to add into the linked list of + // vase objects. + + basen= MEM_mallocN(sizeof(Base), "duplibase"); + *basen= *base; + BLI_addhead(&scene->base, basen); /* addhead: anders oneindige lus */ + basen->object= ob_new; + basen->flag &= ~SELECT; + + // Initialize the mesh data associated with this object. + ob_new->data= add_mesh("Mesh"); + + // Finally assign the object type. + ob_new->type= OB_MESH; + + return ob_new; +} + +static void InterpCSGFace( + DerivedMesh *dm, DerivedMesh *orig_dm, int index, int orig_index, int nr, + float mapmat[][4]) +{ + float obco[3], *co[4], *orig_co[4], w[4][4]; + MFace *mface, *orig_mface; + int j; + + mface = CDDM_get_tessface(dm, index); + orig_mface = orig_dm->getTessFaceArray(orig_dm) + orig_index; + + // get the vertex coordinates from the original mesh + orig_co[0] = (orig_dm->getVertArray(orig_dm) + orig_mface->v1)->co; + orig_co[1] = (orig_dm->getVertArray(orig_dm) + orig_mface->v2)->co; + orig_co[2] = (orig_dm->getVertArray(orig_dm) + orig_mface->v3)->co; + orig_co[3] = (orig_mface->v4)? (orig_dm->getVertArray(orig_dm) + orig_mface->v4)->co: NULL; + + // get the vertex coordinates from the new derivedmesh + co[0] = CDDM_get_vert(dm, mface->v1)->co; + co[1] = CDDM_get_vert(dm, mface->v2)->co; + co[2] = CDDM_get_vert(dm, mface->v3)->co; + co[3] = (nr == 4)? CDDM_get_vert(dm, mface->v4)->co: NULL; + + for (j = 0; j < nr; j++) { + // get coordinate into the space of the original mesh + if (mapmat) + mul_v3_m4v3(obco, mapmat, co[j]); + else + copy_v3_v3(obco, co[j]); + + interp_weights_face_v3( w[j],orig_co[0], orig_co[1], orig_co[2], orig_co[3], obco); + } + + CustomData_interp(&orig_dm->faceData, &dm->faceData, &orig_index, NULL, (float*)w, 1, index); +} + +/* Iterate over the CSG Output Descriptors and create a new DerivedMesh + from them */ +static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh( + CSG_FaceIteratorDescriptor *face_it, + CSG_VertexIteratorDescriptor *vertex_it, + float parinv[][4], + float mapmat[][4], + Material **mat, + int *totmat, + DerivedMesh *dm1, + Object *ob1, + DerivedMesh *dm2, + Object *ob2) +{ + DerivedMesh *result, *orig_dm, *dm; + GHash *material_hash = NULL; + Mesh *me1= (Mesh*)ob1->data; + Mesh *me2= (Mesh*)ob2->data; + int i; + + // create a new DerivedMesh + result = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements, 0, 0); + CustomData_merge(&dm1->faceData, &result->faceData, CD_MASK_DERIVEDMESH, + CD_DEFAULT, face_it->num_elements); + CustomData_merge(&dm2->faceData, &result->faceData, CD_MASK_DERIVEDMESH, + CD_DEFAULT, face_it->num_elements); + + // step through the vertex iterators: + for (i = 0; !vertex_it->Done(vertex_it->it); i++) { + CSG_IVertex csgvert; + MVert *mvert = CDDM_get_vert(result, i); + + // retrieve a csg vertex from the boolean module + vertex_it->Fill(vertex_it->it, &csgvert); + vertex_it->Step(vertex_it->it); + + // we have to map the vertex coordinates back in the coordinate frame + // of the resulting object, since it was computed in world space + mul_v3_m4v3(mvert->co, parinv, csgvert.position); + } + + // a hash table to remap materials to indices + if (mat) { + material_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "CSG_mat gh"); + *totmat = 0; + } + + // step through the face iterators + for(i = 0; !face_it->Done(face_it->it); i++) { + Mesh *orig_me; + Object *orig_ob; + Material *orig_mat; + CSG_IFace csgface; + MFace *mface; + int orig_index, mat_nr; + + // retrieve a csg face from the boolean module + face_it->Fill(face_it->it, &csgface); + face_it->Step(face_it->it); + + // find the original mesh and data + orig_ob = (csgface.orig_face < dm1->getNumTessFaces(dm1))? ob1: ob2; + orig_dm = (csgface.orig_face < dm1->getNumTessFaces(dm1))? dm1: dm2; + orig_me = (orig_ob == ob1)? me1: me2; + orig_index = (orig_ob == ob1)? csgface.orig_face: csgface.orig_face - dm1->getNumTessFaces(dm1); + + // copy all face layers, including mface + CustomData_copy_data(&orig_dm->faceData, &result->faceData, orig_index, i, 1); + + // set mface + mface = CDDM_get_tessface(result, i); + mface->v1 = csgface.vertex_index[0]; + mface->v2 = csgface.vertex_index[1]; + mface->v3 = csgface.vertex_index[2]; + mface->v4 = (csgface.vertex_number == 4)? csgface.vertex_index[3]: 0; + + // set material, based on lookup in hash table + orig_mat= give_current_material(orig_ob, mface->mat_nr+1); + + if (mat && orig_mat) { + if (!BLI_ghash_haskey(material_hash, orig_mat)) { + mat[*totmat] = orig_mat; + mat_nr = mface->mat_nr = (*totmat)++; + BLI_ghash_insert(material_hash, orig_mat, SET_INT_IN_POINTER(mat_nr)); + } + else + mface->mat_nr = GET_INT_FROM_POINTER(BLI_ghash_lookup(material_hash, orig_mat)); + } + else + mface->mat_nr = 0; + + InterpCSGFace(result, orig_dm, i, orig_index, csgface.vertex_number, + (orig_me == me2)? mapmat: NULL); + + test_index_face(mface, &result->faceData, i, csgface.vertex_number); + } + + if (material_hash) + BLI_ghash_free(material_hash, NULL, NULL); + + CDDM_calc_edges(result); + CDDM_calc_normals(result); + + dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); + + return dm; +} + +static void BuildMeshDescriptors( + struct DerivedMesh *dm, + struct Object *ob, + int face_offset, + struct CSG_FaceIteratorDescriptor * face_it, + struct CSG_VertexIteratorDescriptor * vertex_it) +{ + VertexIt_Construct(vertex_it,dm, ob); + FaceIt_Construct(face_it,dm,face_offset,ob); +} + +static void FreeMeshDescriptors( + struct CSG_FaceIteratorDescriptor *face_it, + struct CSG_VertexIteratorDescriptor *vertex_it) +{ + VertexIt_Destruct(vertex_it); + FaceIt_Destruct(face_it); +} + +DerivedMesh *NewBooleanDerivedMesh_intern( + DerivedMesh *dm, struct Object *ob, DerivedMesh *dm_select, struct Object *ob_select, + int int_op_type, Material **mat, int *totmat) +{ + + float inv_mat[4][4]; + float map_mat[4][4]; + + DerivedMesh *result = NULL; + + if (dm == NULL || dm_select == NULL) return 0; + if (!dm->getNumTessFaces(dm) || !dm_select->getNumTessFaces(dm_select)) return 0; + + // we map the final object back into ob's local coordinate space. For this + // we need to compute the inverse transform from global to ob (inv_mat), + // and the transform from ob to ob_select for use in interpolation (map_mat) + invert_m4_m4(inv_mat, ob->obmat); + mul_m4_m4m4(map_mat, ob_select->obmat, inv_mat); + invert_m4_m4(inv_mat, ob_select->obmat); + + { + // interface with the boolean module: + // + // the idea is, we pass the boolean module verts and faces using the + // provided descriptors. once the boolean operation is performed, we + // get back output descriptors, from which we then build a DerivedMesh + + CSG_VertexIteratorDescriptor vd_1, vd_2; + CSG_FaceIteratorDescriptor fd_1, fd_2; + CSG_OperationType op_type; + CSG_BooleanOperation *bool_op; + + // work out the operation they chose and pick the appropriate + // enum from the csg module. + switch (int_op_type) { + case 1 : op_type = e_csg_intersection; break; + case 2 : op_type = e_csg_union; break; + case 3 : op_type = e_csg_difference; break; + case 4 : op_type = e_csg_classify; break; + default : op_type = e_csg_intersection; + } + + BuildMeshDescriptors(dm_select, ob_select, 0, &fd_1, &vd_1); + BuildMeshDescriptors(dm, ob, dm_select->getNumTessFaces(dm_select) , &fd_2, &vd_2); + + bool_op = CSG_NewBooleanFunction(); + + // perform the operation + if (CSG_PerformBooleanOperation(bool_op, op_type, fd_1, vd_1, fd_2, vd_2)) { + CSG_VertexIteratorDescriptor vd_o; + CSG_FaceIteratorDescriptor fd_o; + + CSG_OutputFaceDescriptor(bool_op, &fd_o); + CSG_OutputVertexDescriptor(bool_op, &vd_o); + + // iterate through results of operation and insert + // into new object + result = ConvertCSGDescriptorsToDerivedMesh( + &fd_o, &vd_o, inv_mat, map_mat, mat, totmat, dm_select, ob_select, dm, ob); + + // free up the memory + CSG_FreeVertexDescriptor(&vd_o); + CSG_FreeFaceDescriptor(&fd_o); + } + else + printf("Unknown internal error in boolean"); + + CSG_FreeBooleanOperation(bool_op); + + FreeMeshDescriptors(&fd_1, &vd_1); + FreeMeshDescriptors(&fd_2, &vd_2); + } + + return result; +} + +int NewBooleanMesh(Scene *scene, Base *base, Base *base_select, int int_op_type) +{ + Mesh *me_new; + int a, maxmat, totmat= 0; + Object *ob_new, *ob, *ob_select; + Material **mat; + DerivedMesh *result; + DerivedMesh *dm_select; + DerivedMesh *dm; + + ob= base->object; + ob_select= base_select->object; + + dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); + dm_select = mesh_create_derived_view(scene, ob_select, 0); // no modifiers in editmode ?? + + maxmat= ob->totcol + ob_select->totcol; + mat= (Material**)MEM_mallocN(sizeof(Material*)*maxmat, "NewBooleanMeshMat"); + + /* put some checks in for nice user feedback */ + if (dm == NULL || dm_select == NULL) return 0; + if (!dm->getNumTessFaces(dm) || !dm_select->getNumTessFaces(dm_select)) + { + MEM_freeN(mat); + return -1; + } + + result= NewBooleanDerivedMesh_intern(dm, ob, dm_select, ob_select, int_op_type, mat, &totmat); + + if (result == NULL) { + MEM_freeN(mat); + return 0; + } + + /* create a new blender mesh object - using 'base' as a template */ + ob_new= AddNewBlenderMesh(scene, base_select); + me_new= ob_new->data; + + DM_to_mesh(result, me_new); + result->release(result); + + dm->release(dm); + dm_select->release(dm_select); + + /* add materials to object */ + for (a = 0; a < totmat; a++) + assign_material(ob_new, mat[a], a+1); + + MEM_freeN(mat); + + /* update dag */ + DAG_id_flush_update(&ob_new->id, OB_RECALC_DATA); + + return 1; +} + +DerivedMesh *NewBooleanDerivedMesh(DerivedMesh *dm, struct Object *ob, DerivedMesh *dm_select, struct Object *ob_select, + int int_op_type) +{ + return NewBooleanDerivedMesh_intern(dm, ob, dm_select, ob_select, int_op_type, NULL, NULL); +} diff --git a/source/blender/blenkernel/BKE_booleanops.h b/source/blender/modifiers/intern/MOD_boolean_util.h similarity index 93% rename from source/blender/blenkernel/BKE_booleanops.h rename to source/blender/modifiers/intern/MOD_boolean_util.h index d323725ec19..e415b368a85 100644 --- a/source/blender/blenkernel/BKE_booleanops.h +++ b/source/blender/modifiers/intern/MOD_boolean_util.h @@ -26,8 +26,9 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef BKE_BOOLEANOPS_H -#define BKE_BOOLEANOPS_H + +#ifndef MOD_BOOLEAN_UTILS_H +#define MOD_BOOLEAN_UTILS_H struct Scene; struct Object; @@ -43,7 +44,7 @@ int NewBooleanMesh(struct Scene *scene, struct Base *base, struct Base *base_sel /* Performs a boolean between two mesh objects, it is assumed that both objects are in fact mesh object. On success returns a DerivedMesh. On failure returns NULL and reports an error. */ -struct DerivedMesh *NewBooleanDerivedMesh(struct DerivedMesh *dm, struct Object *ob, struct DerivedMesh *dm_select, struct Object *ob_select, - int int_op_type); -#endif + +struct DerivedMesh *NewBooleanDerivedMesh(struct DerivedMesh *dm, struct Object *ob, struct DerivedMesh *dm_select, struct Object *ob_select, int int_op_type); +#endif // MOD_BOOLEAN_UTILS diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c new file mode 100644 index 00000000000..36b6cad59b6 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_build.c @@ -0,0 +1,302 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "BLI_rand.h" +#include "BLI_ghash.h" + +#include "DNA_scene_types.h" +#include "DNA_meshdata_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_object.h" +#include "BKE_particle.h" +#include "BKE_scene.h" + + +static void initData(ModifierData *md) +{ + BuildModifierData *bmd = (BuildModifierData*) md; + + bmd->start = 1.0; + bmd->length = 100.0; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + BuildModifierData *bmd = (BuildModifierData*) md; + BuildModifierData *tbmd = (BuildModifierData*) target; + + tbmd->start = bmd->start; + tbmd->length = bmd->length; + tbmd->randomize = bmd->randomize; + tbmd->seed = bmd->seed; +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, + DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = derivedData; + DerivedMesh *result; + BuildModifierData *bmd = (BuildModifierData*) md; + int i; + int numFaces, numEdges; + int maxVerts, maxEdges, maxFaces; + int *vertMap, *edgeMap, *faceMap; + float frac; + GHashIterator *hashIter; + /* maps vert indices in old mesh to indices in new mesh */ + GHash *vertHash = BLI_ghash_new(BLI_ghashutil_inthash, + BLI_ghashutil_intcmp, "build ve apply gh"); + /* maps edge indices in new mesh to indices in old mesh */ + GHash *edgeHash = BLI_ghash_new(BLI_ghashutil_inthash, + BLI_ghashutil_intcmp, "build ed apply gh"); + + maxVerts = dm->getNumVerts(dm); + vertMap = MEM_callocN(sizeof(*vertMap) * maxVerts, + "build modifier vertMap"); + for(i = 0; i < maxVerts; ++i) vertMap[i] = i; + + maxEdges = dm->getNumEdges(dm); + edgeMap = MEM_callocN(sizeof(*edgeMap) * maxEdges, + "build modifier edgeMap"); + for(i = 0; i < maxEdges; ++i) edgeMap[i] = i; + + maxFaces = dm->getNumTessFaces(dm); + faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces, + "build modifier faceMap"); + for(i = 0; i < maxFaces; ++i) faceMap[i] = i; + + if (ob) { + frac = bsystem_time(md->scene, ob, md->scene->r.cfra, + bmd->start - 1.0f) / bmd->length; + } else { + frac = BKE_curframe(md->scene) - bmd->start / bmd->length; + } + CLAMP(frac, 0.0, 1.0); + + numFaces = dm->getNumTessFaces(dm) * frac; + numEdges = dm->getNumEdges(dm) * frac; + + /* if there's at least one face, build based on faces */ + if(numFaces) { + int maxEdges; + + if(bmd->randomize) + BLI_array_randomize(faceMap, sizeof(*faceMap), + maxFaces, bmd->seed); + + /* get the set of all vert indices that will be in the final mesh, + * mapped to the new indices + */ + for(i = 0; i < numFaces; ++i) { + MFace mf; + dm->getTessFace(dm, faceMap[i], &mf); + + if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v1))) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v1), + SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); + if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v2))) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v2), + SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); + if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v3))) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v3), + SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); + if(mf.v4 && !BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v4))) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v4), + SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); + } + + /* get the set of edges that will be in the new mesh (i.e. all edges + * that have both verts in the new mesh) + */ + maxEdges = dm->getNumEdges(dm); + for(i = 0; i < maxEdges; ++i) { + MEdge me; + dm->getEdge(dm, i, &me); + + if(BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1)) + && BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2))) + BLI_ghash_insert(edgeHash, + SET_INT_IN_POINTER(BLI_ghash_size(edgeHash)), SET_INT_IN_POINTER(i)); + } + } else if(numEdges) { + if(bmd->randomize) + BLI_array_randomize(edgeMap, sizeof(*edgeMap), + maxEdges, bmd->seed); + + /* get the set of all vert indices that will be in the final mesh, + * mapped to the new indices + */ + for(i = 0; i < numEdges; ++i) { + MEdge me; + dm->getEdge(dm, edgeMap[i], &me); + + if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1))) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(me.v1), + SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); + if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2))) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(me.v2), + SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); + } + + /* get the set of edges that will be in the new mesh + */ + for(i = 0; i < numEdges; ++i) { + MEdge me; + dm->getEdge(dm, edgeMap[i], &me); + + BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(BLI_ghash_size(edgeHash)), + SET_INT_IN_POINTER(edgeMap[i])); + } + } else { + int numVerts = dm->getNumVerts(dm) * frac; + + if(bmd->randomize) + BLI_array_randomize(vertMap, sizeof(*vertMap), + maxVerts, bmd->seed); + + /* get the set of all vert indices that will be in the final mesh, + * mapped to the new indices + */ + for(i = 0; i < numVerts; ++i) + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(vertMap[i]), SET_INT_IN_POINTER(i)); + } + + /* now we know the number of verts, edges and faces, we can create + * the mesh + */ + result = CDDM_from_template(dm, BLI_ghash_size(vertHash), + BLI_ghash_size(edgeHash), numFaces, 0, 0); + + /* copy the vertices across */ + for(hashIter = BLI_ghashIterator_new(vertHash); + !BLI_ghashIterator_isDone(hashIter); + BLI_ghashIterator_step(hashIter)) { + MVert source; + MVert *dest; + int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); + int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); + + dm->getVert(dm, oldIndex, &source); + dest = CDDM_get_vert(result, newIndex); + + DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); + *dest = source; + } + BLI_ghashIterator_free(hashIter); + + /* copy the edges across, remapping indices */ + for(i = 0; i < BLI_ghash_size(edgeHash); ++i) { + MEdge source; + MEdge *dest; + int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i))); + + dm->getEdge(dm, oldIndex, &source); + dest = CDDM_get_edge(result, i); + + source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); + source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); + + DM_copy_edge_data(dm, result, oldIndex, i, 1); + *dest = source; + } + + /* copy the faces across, remapping indices */ + for(i = 0; i < numFaces; ++i) { + MFace source; + MFace *dest; + int orig_v4; + + dm->getTessFace(dm, faceMap[i], &source); + dest = CDDM_get_tessface(result, i); + + orig_v4 = source.v4; + + source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); + source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); + source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3))); + if(source.v4) + source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4))); + + DM_copy_face_data(dm, result, faceMap[i], i, 1); + *dest = source; + + test_index_face(dest, &result->faceData, i, (orig_v4 ? 4 : 3)); + } + + CDDM_calc_normals(result); + + BLI_ghash_free(vertHash, NULL, NULL); + BLI_ghash_free(edgeHash, NULL, NULL); + + MEM_freeN(vertMap); + MEM_freeN(edgeMap); + MEM_freeN(faceMap); + + dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); + + return dm; +} + + +ModifierTypeInfo modifierType_Build = { + /* name */ "Build", + /* structName */ "BuildModifierData", + /* structSize */ sizeof(BuildModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs, + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c new file mode 100644 index 00000000000..338454f0e6a --- /dev/null +++ b/source/blender/modifiers/intern/MOD_cast.c @@ -0,0 +1,627 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_deform.h" +#include "BKE_DerivedMesh.h" +#include "BKE_modifier.h" +#include "BKE_utildefines.h" + +#include "depsgraph_private.h" + +#include "MOD_util.h" + +static void initData(ModifierData *md) +{ + CastModifierData *cmd = (CastModifierData*) md; + + cmd->fac = 0.5f; + cmd->radius = 0.0f; + cmd->size = 0.0f; + cmd->flag = MOD_CAST_X | MOD_CAST_Y | MOD_CAST_Z + | MOD_CAST_SIZE_FROM_RADIUS; + cmd->type = MOD_CAST_TYPE_SPHERE; + cmd->defgrp_name[0] = '\0'; + cmd->object = NULL; +} + + +static void copyData(ModifierData *md, ModifierData *target) +{ + CastModifierData *cmd = (CastModifierData*) md; + CastModifierData *tcmd = (CastModifierData*) target; + + tcmd->fac = cmd->fac; + tcmd->radius = cmd->radius; + tcmd->size = cmd->size; + tcmd->flag = cmd->flag; + tcmd->type = cmd->type; + tcmd->object = cmd->object; + strncpy(tcmd->defgrp_name, cmd->defgrp_name, 32); +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + CastModifierData *cmd = (CastModifierData*) md; + short flag; + + flag = cmd->flag & (MOD_CAST_X|MOD_CAST_Y|MOD_CAST_Z); + + if((cmd->fac == 0.0f) || flag == 0) return 1; + + return 0; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + CastModifierData *cmd = (CastModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(cmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + CastModifierData *cmd = (CastModifierData*) md; + + walk (userData, ob, &cmd->object); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, + DagNode *obNode) +{ + CastModifierData *cmd = (CastModifierData*) md; + + if (cmd->object) { + DagNode *curNode = dag_get_node(forest, cmd->object); + + dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, + "Cast Modifier"); + } +} + +static void sphere_do( + CastModifierData *cmd, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) +{ + MDeformVert *dvert = NULL; + + Object *ctrl_ob = NULL; + + int i, defgrp_index; + int has_radius = 0; + short flag, type; + float fac, facm, len = 0.0f; + float vec[3], center[3] = {0.0f, 0.0f, 0.0f}; + float mat[4][4], imat[4][4]; + + fac = cmd->fac; + facm = 1.0f - fac; + + flag = cmd->flag; + type = cmd->type; /* projection type: sphere or cylinder */ + + if (type == MOD_CAST_TYPE_CYLINDER) + flag &= ~MOD_CAST_Z; + + ctrl_ob = cmd->object; + + /* spherify's center is {0, 0, 0} (the ob's own center in its local + * space), by default, but if the user defined a control object, + * we use its location, transformed to ob's local space */ + if (ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat); + mul_m4_m4m4(mat, ob->obmat, ctrl_ob->imat); + invert_m4_m4(imat, mat); + } + + invert_m4_m4(ob->imat, ob->obmat); + mul_v3_m4v3(center, ob->imat, ctrl_ob->obmat[3]); + } + + /* now we check which options the user wants */ + + /* 1) (flag was checked in the "if (ctrl_ob)" block above) */ + /* 2) cmd->radius > 0.0f: only the vertices within this radius from + * the center of the effect should be deformed */ + if (cmd->radius > FLT_EPSILON) has_radius = 1; + + /* 3) if we were given a vertex group name, + * only those vertices should be affected */ + defgrp_index = defgroup_name_index(ob, cmd->defgrp_name); + + if ((ob->type == OB_MESH) && dm && defgrp_index >= 0) + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + + if(flag & MOD_CAST_SIZE_FROM_RADIUS) { + len = cmd->radius; + } + else { + len = cmd->size; + } + + if(len <= 0) { + for (i = 0; i < numVerts; i++) { + len += len_v3v3(center, vertexCos[i]); + } + len /= numVerts; + + if (len == 0.0f) len = 10.0f; + } + + /* ready to apply the effect, one vertex at a time; + * tiny optimization: the code is separated (with parts repeated) + * in two possible cases: + * with or w/o a vgroup. With lots of if's in the code below, + * further optimizations are possible, if needed */ + if (dvert) { /* with a vgroup */ + float fac_orig = fac; + for (i = 0; i < numVerts; i++) { + MDeformWeight *dw = NULL; + int j; + float tmp_co[3]; + + copy_v3_v3(tmp_co, vertexCos[i]); + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(mat, tmp_co); + } else { + sub_v3_v3(tmp_co, center); + } + } + + copy_v3_v3(vec, tmp_co); + + if (type == MOD_CAST_TYPE_CYLINDER) + vec[2] = 0.0f; + + if (has_radius) { + if (len_v3(vec) > cmd->radius) continue; + } + + for (j = 0; j < dvert[i].totweight; ++j) { + if(dvert[i].dw[j].def_nr == defgrp_index) { + dw = &dvert[i].dw[j]; + break; + } + } + if (!dw) continue; + + fac = fac_orig * dw->weight; + facm = 1.0f - fac; + + normalize_v3(vec); + + if (flag & MOD_CAST_X) + tmp_co[0] = fac*vec[0]*len + facm*tmp_co[0]; + if (flag & MOD_CAST_Y) + tmp_co[1] = fac*vec[1]*len + facm*tmp_co[1]; + if (flag & MOD_CAST_Z) + tmp_co[2] = fac*vec[2]*len + facm*tmp_co[2]; + + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(imat, tmp_co); + } else { + add_v3_v3(tmp_co, center); + } + } + + copy_v3_v3(vertexCos[i], tmp_co); + } + return; + } + + /* no vgroup */ + for (i = 0; i < numVerts; i++) { + float tmp_co[3]; + + copy_v3_v3(tmp_co, vertexCos[i]); + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(mat, tmp_co); + } else { + sub_v3_v3(tmp_co, center); + } + } + + copy_v3_v3(vec, tmp_co); + + if (type == MOD_CAST_TYPE_CYLINDER) + vec[2] = 0.0f; + + if (has_radius) { + if (len_v3(vec) > cmd->radius) continue; + } + + normalize_v3(vec); + + if (flag & MOD_CAST_X) + tmp_co[0] = fac*vec[0]*len + facm*tmp_co[0]; + if (flag & MOD_CAST_Y) + tmp_co[1] = fac*vec[1]*len + facm*tmp_co[1]; + if (flag & MOD_CAST_Z) + tmp_co[2] = fac*vec[2]*len + facm*tmp_co[2]; + + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(imat, tmp_co); + } else { + add_v3_v3(tmp_co, center); + } + } + + copy_v3_v3(vertexCos[i], tmp_co); + } +} + +static void cuboid_do( + CastModifierData *cmd, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) +{ + MDeformVert *dvert = NULL; + Object *ctrl_ob = NULL; + + int i, defgrp_index; + int has_radius = 0; + short flag; + float fac, facm; + float min[3], max[3], bb[8][3]; + float center[3] = {0.0f, 0.0f, 0.0f}; + float mat[4][4], imat[4][4]; + + fac = cmd->fac; + facm = 1.0f - fac; + + flag = cmd->flag; + + ctrl_ob = cmd->object; + + /* now we check which options the user wants */ + + /* 1) (flag was checked in the "if (ctrl_ob)" block above) */ + /* 2) cmd->radius > 0.0f: only the vertices within this radius from + * the center of the effect should be deformed */ + if (cmd->radius > FLT_EPSILON) has_radius = 1; + + /* 3) if we were given a vertex group name, + * only those vertices should be affected */ + defgrp_index = defgroup_name_index(ob, cmd->defgrp_name); + + if ((ob->type == OB_MESH) && dm && defgrp_index >= 0) + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + + if (ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat); + mul_m4_m4m4(mat, ob->obmat, ctrl_ob->imat); + invert_m4_m4(imat, mat); + } + + invert_m4_m4(ob->imat, ob->obmat); + mul_v3_m4v3(center, ob->imat, ctrl_ob->obmat[3]); + } + + if((flag & MOD_CAST_SIZE_FROM_RADIUS) && has_radius) { + for(i = 0; i < 3; i++) { + min[i] = -cmd->radius; + max[i] = cmd->radius; + } + } else if(!(flag & MOD_CAST_SIZE_FROM_RADIUS) && cmd->size > 0) { + for(i = 0; i < 3; i++) { + min[i] = -cmd->size; + max[i] = cmd->size; + } + } else { + /* get bound box */ + /* We can't use the object's bound box because other modifiers + * may have changed the vertex data. */ + INIT_MINMAX(min, max); + + /* Cast's center is the ob's own center in its local space, + * by default, but if the user defined a control object, we use + * its location, transformed to ob's local space. */ + if (ctrl_ob) { + float vec[3]; + + /* let the center of the ctrl_ob be part of the bound box: */ + DO_MINMAX(center, min, max); + + for (i = 0; i < numVerts; i++) { + sub_v3_v3v3(vec, vertexCos[i], center); + DO_MINMAX(vec, min, max); + } + } + else { + for (i = 0; i < numVerts; i++) { + DO_MINMAX(vertexCos[i], min, max); + } + } + + /* we want a symmetric bound box around the origin */ + if (fabs(min[0]) > fabs(max[0])) max[0] = fabs(min[0]); + if (fabs(min[1]) > fabs(max[1])) max[1] = fabs(min[1]); + if (fabs(min[2]) > fabs(max[2])) max[2] = fabs(min[2]); + min[0] = -max[0]; + min[1] = -max[1]; + min[2] = -max[2]; + } + + /* building our custom bounding box */ + bb[0][0] = bb[2][0] = bb[4][0] = bb[6][0] = min[0]; + bb[1][0] = bb[3][0] = bb[5][0] = bb[7][0] = max[0]; + bb[0][1] = bb[1][1] = bb[4][1] = bb[5][1] = min[1]; + bb[2][1] = bb[3][1] = bb[6][1] = bb[7][1] = max[1]; + bb[0][2] = bb[1][2] = bb[2][2] = bb[3][2] = min[2]; + bb[4][2] = bb[5][2] = bb[6][2] = bb[7][2] = max[2]; + + /* ready to apply the effect, one vertex at a time; + * tiny optimization: the code is separated (with parts repeated) + * in two possible cases: + * with or w/o a vgroup. With lots of if's in the code below, + * further optimizations are possible, if needed */ + if (dvert) { /* with a vgroup */ + float fac_orig = fac; + for (i = 0; i < numVerts; i++) { + MDeformWeight *dw = NULL; + int j, octant, coord; + float d[3], dmax, apex[3], fbb; + float tmp_co[3]; + + copy_v3_v3(tmp_co, vertexCos[i]); + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(mat, tmp_co); + } else { + sub_v3_v3(tmp_co, center); + } + } + + if (has_radius) { + if (fabs(tmp_co[0]) > cmd->radius || + fabs(tmp_co[1]) > cmd->radius || + fabs(tmp_co[2]) > cmd->radius) continue; + } + + for (j = 0; j < dvert[i].totweight; ++j) { + if(dvert[i].dw[j].def_nr == defgrp_index) { + dw = &dvert[i].dw[j]; + break; + } + } + if (!dw) continue; + + fac = fac_orig * dw->weight; + facm = 1.0f - fac; + + /* The algo used to project the vertices to their + * bounding box (bb) is pretty simple: + * for each vertex v: + * 1) find in which octant v is in; + * 2) find which outer "wall" of that octant is closer to v; + * 3) calculate factor (var fbb) to project v to that wall; + * 4) project. */ + + /* find in which octant this vertex is in */ + octant = 0; + if (tmp_co[0] > 0.0f) octant += 1; + if (tmp_co[1] > 0.0f) octant += 2; + if (tmp_co[2] > 0.0f) octant += 4; + + /* apex is the bb's vertex at the chosen octant */ + copy_v3_v3(apex, bb[octant]); + + /* find which bb plane is closest to this vertex ... */ + d[0] = tmp_co[0] / apex[0]; + d[1] = tmp_co[1] / apex[1]; + d[2] = tmp_co[2] / apex[2]; + + /* ... (the closest has the higher (closer to 1) d value) */ + dmax = d[0]; + coord = 0; + if (d[1] > dmax) { + dmax = d[1]; + coord = 1; + } + if (d[2] > dmax) { + /* dmax = d[2]; */ /* commented, we don't need it */ + coord = 2; + } + + /* ok, now we know which coordinate of the vertex to use */ + + if (fabs(tmp_co[coord]) < FLT_EPSILON) /* avoid division by zero */ + continue; + + /* finally, this is the factor we wanted, to project the vertex + * to its bounding box (bb) */ + fbb = apex[coord] / tmp_co[coord]; + + /* calculate the new vertex position */ + if (flag & MOD_CAST_X) + tmp_co[0] = facm * tmp_co[0] + fac * tmp_co[0] * fbb; + if (flag & MOD_CAST_Y) + tmp_co[1] = facm * tmp_co[1] + fac * tmp_co[1] * fbb; + if (flag & MOD_CAST_Z) + tmp_co[2] = facm * tmp_co[2] + fac * tmp_co[2] * fbb; + + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(imat, tmp_co); + } else { + add_v3_v3(tmp_co, center); + } + } + + copy_v3_v3(vertexCos[i], tmp_co); + } + return; + } + + /* no vgroup (check previous case for comments about the code) */ + for (i = 0; i < numVerts; i++) { + int octant, coord; + float d[3], dmax, fbb, apex[3]; + float tmp_co[3]; + + copy_v3_v3(tmp_co, vertexCos[i]); + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(mat, tmp_co); + } else { + sub_v3_v3(tmp_co, center); + } + } + + if (has_radius) { + if (fabs(tmp_co[0]) > cmd->radius || + fabs(tmp_co[1]) > cmd->radius || + fabs(tmp_co[2]) > cmd->radius) continue; + } + + octant = 0; + if (tmp_co[0] > 0.0f) octant += 1; + if (tmp_co[1] > 0.0f) octant += 2; + if (tmp_co[2] > 0.0f) octant += 4; + + copy_v3_v3(apex, bb[octant]); + + d[0] = tmp_co[0] / apex[0]; + d[1] = tmp_co[1] / apex[1]; + d[2] = tmp_co[2] / apex[2]; + + dmax = d[0]; + coord = 0; + if (d[1] > dmax) { + dmax = d[1]; + coord = 1; + } + if (d[2] > dmax) { + /* dmax = d[2]; */ /* commented, we don't need it */ + coord = 2; + } + + if (fabs(tmp_co[coord]) < FLT_EPSILON) + continue; + + fbb = apex[coord] / tmp_co[coord]; + + if (flag & MOD_CAST_X) + tmp_co[0] = facm * tmp_co[0] + fac * tmp_co[0] * fbb; + if (flag & MOD_CAST_Y) + tmp_co[1] = facm * tmp_co[1] + fac * tmp_co[1] * fbb; + if (flag & MOD_CAST_Z) + tmp_co[2] = facm * tmp_co[2] + fac * tmp_co[2] * fbb; + + if(ctrl_ob) { + if(flag & MOD_CAST_USE_OB_TRANSFORM) { + mul_m4_v3(imat, tmp_co); + } else { + add_v3_v3(tmp_co, center); + } + } + + copy_v3_v3(vertexCos[i], tmp_co); + } +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = NULL; + CastModifierData *cmd = (CastModifierData *)md; + + dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0); + + if (cmd->type == MOD_CAST_TYPE_CUBOID) { + cuboid_do(cmd, ob, dm, vertexCos, numVerts); + } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ + sphere_do(cmd, ob, dm, vertexCos, numVerts); + } + + if(dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = get_dm(md->scene, ob, editData, derivedData, NULL, 0); + CastModifierData *cmd = (CastModifierData *)md; + + if (cmd->type == MOD_CAST_TYPE_CUBOID) { + cuboid_do(cmd, ob, dm, vertexCos, numVerts); + } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ + sphere_do(cmd, ob, dm, vertexCos, numVerts); + } + + if(dm != derivedData) + dm->release(dm); +} + + +ModifierTypeInfo modifierType_Cast = { + /* name */ "Cast", + /* structName */ "CastModifierData", + /* structSize */ sizeof(CastModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c new file mode 100644 index 00000000000..5050333cd43 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_cloth.c @@ -0,0 +1,200 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "BKE_cloth.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_global.h" +#include "BKE_modifier.h" +#include "BKE_pointcache.h" + +#include "depsgraph_private.h" + + +static void initData(ModifierData *md) +{ + ClothModifierData *clmd = (ClothModifierData*) md; + + clmd->sim_parms = MEM_callocN(sizeof(ClothSimSettings), "cloth sim parms"); + clmd->coll_parms = MEM_callocN(sizeof(ClothCollSettings), "cloth coll parms"); + clmd->point_cache = BKE_ptcache_add(&clmd->ptcaches); + + /* check for alloc failing */ + if(!clmd->sim_parms || !clmd->coll_parms || !clmd->point_cache) + return; + + cloth_init (clmd); +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, + DerivedMesh *derivedData, int useRenderParams, int isFinalCalc) +{ + ClothModifierData *clmd = (ClothModifierData*) md; + DerivedMesh *result=NULL; + + /* check for alloc failing */ + if(!clmd->sim_parms || !clmd->coll_parms) + { + initData(md); + + if(!clmd->sim_parms || !clmd->coll_parms) + return derivedData; + } + + result = clothModifier_do(clmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc); + + if(result) + { + CDDM_calc_normals(result); + return result; + } + return derivedData; +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, + DagNode *obNode) +{ + ClothModifierData *clmd = (ClothModifierData*) md; + + Base *base; + + if(clmd) + { + for(base = scene->base.first; base; base= base->next) + { + Object *ob1= base->object; + if(ob1 != ob) + { + CollisionModifierData *coll_clmd = (CollisionModifierData *)modifiers_findByType(ob1, eModifierType_Collision); + if(coll_clmd) + { + DagNode *curNode = dag_get_node(forest, ob1); + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Cloth Collision"); + } + } + } + } +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + CustomDataMask dataMask = 0; + ClothModifierData *clmd = (ClothModifierData*)md; + + if(cloth_uses_vgroup(clmd)) + dataMask |= (1 << CD_MDEFORMVERT); + + if(clmd->sim_parms->shapekey_rest != 0) + dataMask |= (1 << CD_CLOTH_ORCO); + + return dataMask; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + ClothModifierData *clmd = (ClothModifierData*) md; + ClothModifierData *tclmd = (ClothModifierData*) target; + + if(tclmd->sim_parms) { + if(tclmd->sim_parms->effector_weights) + MEM_freeN(tclmd->sim_parms->effector_weights); + MEM_freeN(tclmd->sim_parms); + } + + if(tclmd->coll_parms) + MEM_freeN(tclmd->coll_parms); + + BKE_ptcache_free_list(&tclmd->ptcaches); + tclmd->point_cache = NULL; + + tclmd->sim_parms = MEM_dupallocN(clmd->sim_parms); + if(clmd->sim_parms->effector_weights) + tclmd->sim_parms->effector_weights = MEM_dupallocN(clmd->sim_parms->effector_weights); + tclmd->coll_parms = MEM_dupallocN(clmd->coll_parms); + tclmd->point_cache = BKE_ptcache_copy_list(&tclmd->ptcaches, &clmd->ptcaches); + tclmd->clothObject = NULL; +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void freeData(ModifierData *md) +{ + ClothModifierData *clmd = (ClothModifierData*) md; + + if (clmd) + { + if(G.rt > 0) + printf("clothModifier_freeData\n"); + + cloth_free_modifier_extern (clmd); + + if(clmd->sim_parms) { + if(clmd->sim_parms->effector_weights) + MEM_freeN(clmd->sim_parms->effector_weights); + MEM_freeN(clmd->sim_parms); + } + if(clmd->coll_parms) + MEM_freeN(clmd->coll_parms); + + BKE_ptcache_free_list(&clmd->ptcaches); + clmd->point_cache = NULL; + } +} + + +ModifierTypeInfo modifierType_Cloth = { + /* name */ "Cloth", + /* structName */ "ClothModifierData", + /* structSize */ sizeof(ClothModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_UsesPointCache + | eModifierTypeFlag_Single, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c new file mode 100644 index 00000000000..1c63f48e12d --- /dev/null +++ b/source/blender/modifiers/intern/MOD_collision.c @@ -0,0 +1,249 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_scene_types.h" + +#include "BLI_math.h" + +#include "BKE_collision.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_global.h" +#include "BKE_modifier.h" +#include "BKE_object.h" +#include "BKE_pointcache.h" +#include "BKE_scene.h" + + +static void initData(ModifierData *md) +{ + CollisionModifierData *collmd = (CollisionModifierData*) md; + + collmd->x = NULL; + collmd->xnew = NULL; + collmd->current_x = NULL; + collmd->current_xnew = NULL; + collmd->current_v = NULL; + collmd->time = -1000; + collmd->numverts = 0; + collmd->bvhtree = NULL; +} + +static void freeData(ModifierData *md) +{ + CollisionModifierData *collmd = (CollisionModifierData*) md; + + if (collmd) + { + if(collmd->bvhtree) + BLI_bvhtree_free(collmd->bvhtree); + if(collmd->x) + MEM_freeN(collmd->x); + if(collmd->xnew) + MEM_freeN(collmd->xnew); + if(collmd->current_x) + MEM_freeN(collmd->current_x); + if(collmd->current_xnew) + MEM_freeN(collmd->current_xnew); + if(collmd->current_v) + MEM_freeN(collmd->current_v); + if(collmd->mfaces) + MEM_freeN(collmd->mfaces); + + collmd->x = NULL; + collmd->xnew = NULL; + collmd->current_x = NULL; + collmd->current_xnew = NULL; + collmd->current_v = NULL; + collmd->time = -1000; + collmd->numverts = 0; + collmd->bvhtree = NULL; + collmd->mfaces = NULL; + } +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + CollisionModifierData *collmd = (CollisionModifierData*) md; + DerivedMesh *dm = NULL; + float current_time = 0; + unsigned int numverts = 0, i = 0; + MVert *tempVert = NULL; + + /* if possible use/create DerivedMesh */ + if(derivedData) dm = CDDM_copy(derivedData, 0); + else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob); + + if(!ob->pd) + { + printf("CollisionModifier deformVerts: Should not happen!\n"); + return; + } + + if(dm) + { + CDDM_apply_vert_coords(dm, vertexCos); + CDDM_calc_normals(dm); + + current_time = BKE_curframe(md->scene); + + if(G.rt > 0) + printf("current_time %f, collmd->time %f\n", current_time, collmd->time); + + numverts = dm->getNumVerts ( dm ); + + if((current_time > collmd->time)|| (BKE_ptcache_get_continue_physics())) + { + // check if mesh has changed + if(collmd->x && (numverts != collmd->numverts)) + freeData((ModifierData *)collmd); + + if(collmd->time == -1000) // first time + { + collmd->x = dm->dupVertArray(dm); // frame start position + + for ( i = 0; i < numverts; i++ ) + { + // we save global positions + mul_m4_v3( ob->obmat, collmd->x[i].co ); + } + + collmd->xnew = MEM_dupallocN(collmd->x); // frame end position + collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame + collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame + collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame + + collmd->numverts = numverts; + + collmd->mfaces = dm->dupTessFaceArray(dm); + collmd->numfaces = dm->getNumTessFaces(dm); + + // create bounding box hierarchy + collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->x, numverts, ob->pd->pdef_sboft); + + collmd->time = current_time; + } + else if(numverts == collmd->numverts) + { + // put positions to old positions + tempVert = collmd->x; + collmd->x = collmd->xnew; + collmd->xnew = tempVert; + + memcpy(collmd->xnew, dm->getVertArray(dm), numverts*sizeof(MVert)); + + for ( i = 0; i < numverts; i++ ) + { + // we save global positions + mul_m4_v3( ob->obmat, collmd->xnew[i].co ); + } + + memcpy(collmd->current_xnew, collmd->x, numverts*sizeof(MVert)); + memcpy(collmd->current_x, collmd->x, numverts*sizeof(MVert)); + + /* check if GUI setting has changed for bvh */ + if(collmd->bvhtree) + { + if(ob->pd->pdef_sboft != BLI_bvhtree_getepsilon(collmd->bvhtree)) + { + BLI_bvhtree_free(collmd->bvhtree); + collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->current_x, numverts, ob->pd->pdef_sboft); + } + + } + + /* happens on file load (ONLY when i decomment changes in readfile.c) */ + if(!collmd->bvhtree) + { + collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->current_x, numverts, ob->pd->pdef_sboft); + } + else + { + // recalc static bounding boxes + bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 ); + } + + collmd->time = current_time; + } + else if(numverts != collmd->numverts) + { + freeData((ModifierData *)collmd); + } + + } + else if(current_time < collmd->time) + { + freeData((ModifierData *)collmd); + } + else + { + if(numverts != collmd->numverts) + { + freeData((ModifierData *)collmd); + } + } + } + + if(dm) + dm->release(dm); +} + + +ModifierTypeInfo modifierType_Collision = { + /* name */ "Collision", + /* structName */ "CollisionModifierData", + /* structSize */ sizeof(CollisionModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_Single, + + /* copyData */ 0, + /* deformVerts */ deformVerts, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c new file mode 100644 index 00000000000..6f1142ae6b9 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_curve.c @@ -0,0 +1,149 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "string.h" + +#include "DNA_scene_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_lattice.h" +#include "BKE_modifier.h" + +#include "depsgraph_private.h" + + +static void initData(ModifierData *md) +{ + CurveModifierData *cmd = (CurveModifierData*) md; + + cmd->defaxis = MOD_CURVE_POSX; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + CurveModifierData *cmd = (CurveModifierData*) md; + CurveModifierData *tcmd = (CurveModifierData*) target; + + tcmd->defaxis = cmd->defaxis; + tcmd->object = cmd->object; + strncpy(tcmd->name, cmd->name, 32); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + CurveModifierData *cmd = (CurveModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(cmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static int isDisabled(ModifierData *md, int userRenderParams) +{ + CurveModifierData *cmd = (CurveModifierData*) md; + + return !cmd->object; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + CurveModifierData *cmd = (CurveModifierData*) md; + + walk(userData, ob, &cmd->object); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, Scene *scene, + Object *ob, DagNode *obNode) +{ + CurveModifierData *cmd = (CurveModifierData*) md; + + if (cmd->object) { + DagNode *curNode = dag_get_node(forest, cmd->object); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Curve Modifier"); + } +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + CurveModifierData *cmd = (CurveModifierData*) md; + + curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts, + cmd->name, cmd->defaxis); +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = derivedData; + + if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + + deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); + + if(!derivedData) dm->release(dm); +} + + +ModifierTypeInfo modifierType_Curve = { + /* name */ "Curve", + /* structName */ "CurveModifierData", + /* structSize */ sizeof(CurveModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c new file mode 100644 index 00000000000..f75fc0dd1f4 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_decimate.c @@ -0,0 +1,204 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" + +#include "MEM_guardedalloc.h" + +#include "LOD_decimation.h" + + +static void initData(ModifierData *md) +{ + DecimateModifierData *dmd = (DecimateModifierData*) md; + + dmd->percent = 1.0; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + DecimateModifierData *dmd = (DecimateModifierData*) md; + DecimateModifierData *tdmd = (DecimateModifierData*) target; + + tdmd->percent = dmd->percent; +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DecimateModifierData *dmd = (DecimateModifierData*) md; + DerivedMesh *dm = derivedData, *result = NULL; + MVert *mvert; + MFace *mface; + LOD_Decimation_Info lod; + int totvert, totface; + int a, numTris; + + mvert = dm->getVertArray(dm); + mface = dm->getTessFaceArray(dm); + totvert = dm->getNumVerts(dm); + totface = dm->getNumTessFaces(dm); + + numTris = 0; + for (a=0; av4) numTris++; + } + + if(numTris<3) { + modifier_setError(md, + "Modifier requires more than 3 input faces (triangles)."); + goto exit; + } + + lod.vertex_buffer= MEM_mallocN(3*sizeof(float)*totvert, "vertices"); + lod.vertex_normal_buffer= MEM_mallocN(3*sizeof(float)*totvert, "normals"); + lod.triangle_index_buffer= MEM_mallocN(3*sizeof(int)*numTris, "trias"); + lod.vertex_num= totvert; + lod.face_num= numTris; + + for(a=0; aco); + normal_short_to_float_v3(vbNo, mv->no); + } + + numTris = 0; + for(a=0; av1; + tri[1]= mf->v2; + tri[2]= mf->v3; + + if(mf->v4) { + tri = &lod.triangle_index_buffer[3*numTris++]; + tri[0]= mf->v1; + tri[1]= mf->v3; + tri[2]= mf->v4; + } + } + + dmd->faceCount = 0; + if(LOD_LoadMesh(&lod) ) { + if( LOD_PreprocessMesh(&lod) ) { + /* we assume the decim_faces tells how much to reduce */ + + while(lod.face_num > numTris*dmd->percent) { + if( LOD_CollapseEdge(&lod)==0) break; + } + + if(lod.vertex_num>2) { + result = CDDM_new(lod.vertex_num, 0, lod.face_num, 0, 0); + dmd->faceCount = lod.face_num; + } + else + result = CDDM_new(lod.vertex_num, 0, 0, 0, 0); + + mvert = CDDM_get_verts(result); + for(a=0; aco, vbCo); + } + + if(lod.vertex_num>2) { + mface = CDDM_get_tessfaces(result); + for(a=0; av1 = tri[0]; + mf->v2 = tri[1]; + mf->v3 = tri[2]; + test_index_face(mf, NULL, 0, 3); + } + } + + CDDM_calc_edges(result); + CDDM_calc_normals(result); + } + else + modifier_setError(md, "Out of memory."); + + LOD_FreeDecimationData(&lod); + } + else + modifier_setError(md, "Non-manifold mesh as input."); + + MEM_freeN(lod.vertex_buffer); + MEM_freeN(lod.vertex_normal_buffer); + MEM_freeN(lod.triangle_index_buffer); + +exit: + + dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); + + return dm; +} + + +ModifierTypeInfo modifierType_Decimate = { + /* name */ "Decimate", + /* structName */ "DecimateModifierData", + /* structSize */ sizeof(DecimateModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh, + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c new file mode 100644 index 00000000000..fc6eae5491c --- /dev/null +++ b/source/blender/modifiers/intern/MOD_displace.c @@ -0,0 +1,353 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" +#include "BKE_texture.h" +#include "BKE_deform.h" + +#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" + +#include "MOD_util.h" + +#include "RE_shader_ext.h" + + +/* Displace */ + +static void initData(ModifierData *md) +{ + DisplaceModifierData *dmd = (DisplaceModifierData*) md; + + dmd->texture = NULL; + dmd->strength = 1; + dmd->direction = MOD_DISP_DIR_NOR; + dmd->midlevel = 0.5; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + DisplaceModifierData *dmd = (DisplaceModifierData*) md; + DisplaceModifierData *tdmd = (DisplaceModifierData*) target; + + tdmd->texture = dmd->texture; + tdmd->strength = dmd->strength; + tdmd->direction = dmd->direction; + strncpy(tdmd->defgrp_name, dmd->defgrp_name, 32); + tdmd->midlevel = dmd->midlevel; + tdmd->texmapping = dmd->texmapping; + tdmd->map_object = dmd->map_object; + strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + DisplaceModifierData *dmd = (DisplaceModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(dmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + /* ask for UV coordinates if we need them */ + if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= (1 << CD_MTFACE); + + return dataMask; +} + +static int dependsOnTime(ModifierData *md) +{ + DisplaceModifierData *dmd = (DisplaceModifierData *)md; + + if(dmd->texture) + { + return BKE_texture_dependsOnTime(dmd->texture); + } + else + { + return 0; + } +} + +static void foreachObjectLink(ModifierData *md, Object *ob, + ObjectWalkFunc walk, void *userData) +{ + DisplaceModifierData *dmd = (DisplaceModifierData*) md; + + walk(userData, ob, &dmd->map_object); +} + +static void foreachIDLink(ModifierData *md, Object *ob, + IDWalkFunc walk, void *userData) +{ + DisplaceModifierData *dmd = (DisplaceModifierData*) md; + + walk(userData, ob, (ID **)&dmd->texture); + + foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + DisplaceModifierData *dmd = (DisplaceModifierData*) md; + + return (!dmd->texture || dmd->strength == 0.0f); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, struct Scene *scene, + Object *ob, DagNode *obNode) +{ + DisplaceModifierData *dmd = (DisplaceModifierData*) md; + + if(dmd->map_object) { + DagNode *curNode = dag_get_node(forest, dmd->map_object); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier"); + } +} + +static void get_texture_coords(DisplaceModifierData *dmd, Object *ob, + DerivedMesh *dm, + float (*co)[3], float (*texco)[3], + int numVerts) +{ + int i; + int texmapping = dmd->texmapping; + float mapob_imat[4][4]; + + if(texmapping == MOD_DISP_MAP_OBJECT) { + if(dmd->map_object) + invert_m4_m4(mapob_imat, dmd->map_object->obmat); + else /* if there is no map object, default to local */ + texmapping = MOD_DISP_MAP_LOCAL; + } + + /* UVs need special handling, since they come from faces */ + if(texmapping == MOD_DISP_MAP_UV) { + if(CustomData_has_layer(&dm->faceData, CD_MTFACE)) { + MFace *mface = dm->getTessFaceArray(dm); + MFace *mf; + char *done = MEM_callocN(sizeof(*done) * numVerts, + "get_texture_coords done"); + int numFaces = dm->getNumTessFaces(dm); + char uvname[32]; + MTFace *tf; + + validate_layer_name(&dm->faceData, CD_MTFACE, dmd->uvlayer_name, uvname); + tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname); + + /* verts are given the UV from the first face that uses them */ + for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tf) { + if(!done[mf->v1]) { + texco[mf->v1][0] = tf->uv[0][0]; + texco[mf->v1][1] = tf->uv[0][1]; + texco[mf->v1][2] = 0; + done[mf->v1] = 1; + } + if(!done[mf->v2]) { + texco[mf->v2][0] = tf->uv[1][0]; + texco[mf->v2][1] = tf->uv[1][1]; + texco[mf->v2][2] = 0; + done[mf->v2] = 1; + } + if(!done[mf->v3]) { + texco[mf->v3][0] = tf->uv[2][0]; + texco[mf->v3][1] = tf->uv[2][1]; + texco[mf->v3][2] = 0; + done[mf->v3] = 1; + } + if(!done[mf->v4]) { + texco[mf->v4][0] = tf->uv[3][0]; + texco[mf->v4][1] = tf->uv[3][1]; + texco[mf->v4][2] = 0; + done[mf->v4] = 1; + } + } + + /* remap UVs from [0, 1] to [-1, 1] */ + for(i = 0; i < numVerts; ++i) { + texco[i][0] = texco[i][0] * 2 - 1; + texco[i][1] = texco[i][1] * 2 - 1; + } + + MEM_freeN(done); + return; + } else /* if there are no UVs, default to local */ + texmapping = MOD_DISP_MAP_LOCAL; + } + + for(i = 0; i < numVerts; ++i, ++co, ++texco) { + switch(texmapping) { + case MOD_DISP_MAP_LOCAL: + copy_v3_v3(*texco, *co); + break; + case MOD_DISP_MAP_GLOBAL: + mul_v3_m4v3(*texco, ob->obmat, *co); + break; + case MOD_DISP_MAP_OBJECT: + mul_v3_m4v3(*texco, ob->obmat, *co); + mul_m4_v3(mapob_imat, *texco); + break; + } + } +} + +/* dm must be a CDDerivedMesh */ +static void displaceModifier_do( + DisplaceModifierData *dmd, Object *ob, + DerivedMesh *dm, float (*vertexCos)[3], int numVerts) +{ + int i; + MVert *mvert; + MDeformVert *dvert = NULL; + int defgrp_index; + float (*tex_co)[3]; + + if(!dmd->texture) return; + + defgrp_index = defgroup_name_index(ob, dmd->defgrp_name); + + mvert = CDDM_get_verts(dm); + if(defgrp_index >= 0) + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + + tex_co = MEM_callocN(sizeof(*tex_co) * numVerts, + "displaceModifier_do tex_co"); + get_texture_coords(dmd, ob, dm, vertexCos, tex_co, numVerts); + + for(i = 0; i < numVerts; ++i) { + TexResult texres; + float delta = 0, strength = dmd->strength; + MDeformWeight *def_weight = NULL; + + if(dvert) { + int j; + for(j = 0; j < dvert[i].totweight; ++j) { + if(dvert[i].dw[j].def_nr == defgrp_index) { + def_weight = &dvert[i].dw[j]; + break; + } + } + if(!def_weight) continue; + } + + texres.nor = NULL; + get_texture_value(dmd->texture, tex_co[i], &texres); + + delta = texres.tin - dmd->midlevel; + + if(def_weight) strength *= def_weight->weight; + + delta *= strength; + + switch(dmd->direction) { + case MOD_DISP_DIR_X: + vertexCos[i][0] += delta; + break; + case MOD_DISP_DIR_Y: + vertexCos[i][1] += delta; + break; + case MOD_DISP_DIR_Z: + vertexCos[i][2] += delta; + break; + case MOD_DISP_DIR_RGB_XYZ: + vertexCos[i][0] += (texres.tr - dmd->midlevel) * strength; + vertexCos[i][1] += (texres.tg - dmd->midlevel) * strength; + vertexCos[i][2] += (texres.tb - dmd->midlevel) * strength; + break; + case MOD_DISP_DIR_NOR: + vertexCos[i][0] += delta * mvert[i].no[0] / 32767.0f; + vertexCos[i][1] += delta * mvert[i].no[1] / 32767.0f; + vertexCos[i][2] += delta * mvert[i].no[2] / 32767.0f; + break; + } + } + + MEM_freeN(tex_co); +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos); + + displaceModifier_do((DisplaceModifierData *)md, ob, dm, + vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm= get_cddm(md->scene, ob, editData, derivedData, vertexCos); + + displaceModifier_do((DisplaceModifierData *)md, ob, dm, + vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + + +ModifierTypeInfo modifierType_Displace = { + /* name */ "Displace", + /* structName */ "DisplaceModifierData", + /* structSize */ sizeof(DisplaceModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ foreachIDLink, +}; diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c new file mode 100644 index 00000000000..9d622669c78 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -0,0 +1,461 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Joseph Eagar +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* EdgeSplit modifier: Splits edges in the mesh according to sharpness flag + * or edge angle (can be used to achieve autosmoothing) */ + +#include "DNA_meshdata_types.h" + +#include "BLI_listbase.h" +#include "BLI_memarena.h" +#include "BLI_edgehash.h" +#include "BLI_math.h" +#include "BLI_array.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" +#include "BKE_tessmesh.h" + +#include "MEM_guardedalloc.h" + +/* EdgeSplit */ +/* EdgeSplit modifier: Splits edges in the mesh according to sharpness flag + * or edge angle (can be used to achieve autosmoothing) +*/ + +/*new cddm-based edge split code*/ +typedef struct VertUser { + int ov, v, done; + ListBase users; +} VertUser; + +typedef struct EdgeNode { + struct EdgeNode *next, *prev; + struct EdgeData *edge; +} EdgeNode; + +typedef struct EdgeData { + EdgeNode v1node, v2node; + VertUser *v1user, *v2user; + float fno[3]; /*used to calculate face angles*/ + int has_fno; + int tag; + int v1, v2; + int used; +} EdgeData; + +typedef struct MemBase { + BLI_mempool *vertuserpool; +} MemBase; + +BM_INLINE EdgeData *edge_get_next(EdgeData *e, int ov) { + if (ov == e->v1) + return e->v1node.next ? e->v1node.next->edge : NULL; + else return e->v2node.next ? e->v2node.next->edge : NULL; +} + +BM_INLINE EdgeNode *edge_get_node(EdgeData *e, int ov) +{ + if (ov == e->v1) + return &e->v1node; + else return &e->v2node; + return NULL; +} + +BM_INLINE VertUser *edge_get_vuser(MemBase *b, EdgeData *edge, int ov) +{ + if (ov == edge->v1) + return edge->v1user; + else if (ov == edge->v2) + return edge->v2user; + else { + printf("yeek!!\n"); + return NULL; + } +} + +BM_INLINE void edge_set_vuser(MemBase *b, EdgeData *e, int ov, VertUser *vu) + +{ + VertUser *olduser = edge_get_vuser(b, e, ov); + + if (vu == olduser) + return; + + if (olduser) + BLI_remlink(&olduser->users, ov==e->v1 ? &e->v1node : &e->v2node); + BLI_addtail(&vu->users, ov==e->v1 ? &e->v1node : &e->v2node); + + if (ov == e->v1) + e->v1user = vu; + else e->v2user = vu; +} + +BM_INLINE VertUser *new_vuser(MemBase *base) +{ + VertUser *vusr = BLI_mempool_calloc(base->vertuserpool); + + return vusr; +} + +BM_INLINE MemBase *new_membase(void) +{ + MemBase *b = MEM_callocN(sizeof(MemBase), "MemBase for edgesplit in modifier.c"); + b->vertuserpool = BLI_mempool_create(sizeof(VertUser), 1, 2048, 1, 0); + + return b; +} + +BM_INLINE void free_membase(MemBase *b) +{ + BLI_mempool_destroy(b->vertuserpool); + MEM_freeN(b); +} + +BM_INLINE EdgeData *edge_get_first(VertUser *vu) +{ + return vu->users.first ? ((EdgeNode*)vu->users.first)->edge : NULL; +} + +DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd) +{ + DerivedMesh *cddm = CDDM_copy(dm, 0); + MEdge *medge; + BLI_array_declare(medge); + MLoop *mloop, *ml, *prevl; + MPoly *mpoly, *mp; + MVert *mvert; + BLI_array_declare(mvert); + EdgeData *etags, *e, *enext; + BLI_array_declare(etags); + VertUser *vu, *vu2; + MemBase *membase; + CustomData edata, vdata; + int i, j, curv, cure; + float threshold = cos((emd->split_angle + 0.00001) * M_PI / 180.0); + float no[3], edge_angle_cos; + + if (!cddm->numVertData || !cddm->numEdgeData) + return cddm; + + membase = new_membase(); + + etags = MEM_callocN(sizeof(EdgeData)*cddm->numEdgeData, "edgedata tag thingies"); + BLI_array_set_length(etags, cddm->numEdgeData); + + mvert = cddm->getVertArray(cddm); + BLI_array_set_length(mvert, cddm->numVertData); + medge = cddm->getEdgeArray(cddm); + BLI_array_set_length(medge, cddm->numEdgeData); + mloop = CustomData_get_layer(&cddm->loopData, CD_MLOOP); + mpoly = CustomData_get_layer(&cddm->polyData, CD_MPOLY); + + for (i=0; inumEdgeData; i++) { + etags[i].v1 = medge[i].v1; + etags[i].v2 = medge[i].v2; + + etags[i].tag = (medge[i].flag & ME_SHARP) != 0; + + etags[i].v1node.edge = etags+i; + etags[i].v2node.edge = etags+i; + } + + if (emd->flags & MOD_EDGESPLIT_FROMANGLE) { + mp = mpoly; + for (i=0; inumPolyData; i++, mp++) { + mesh_calc_poly_normal(mp, mloop+mp->loopstart, mvert, no); + + ml = mloop + mp->loopstart; + for (j=0; jtotloop; j++, ml++) { + if (!etags[ml->e].has_fno) { + VECCOPY(etags[ml->e].fno, no); + etags[ml->e].has_fno = 1; + } else if (!etags[ml->e].tag) { + edge_angle_cos = INPR(etags[ml->e].fno, no); + if (edge_angle_cos < threshold) { + etags[ml->e].tag = 1; + } + } + } + } + } + + mp = mpoly; + for (i=0; inumPolyData; i++, mp++) { + ml = mloop + mp->loopstart; + for (j=0; jtotloop; j++, ml++) { + if (etags[ml->e].tag) + continue; + + prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop; + + if (!edge_get_vuser(membase, etags+prevl->e, ml->v)) { + vu = new_vuser(membase); + vu->ov = vu->v = ml->v; + edge_set_vuser(membase, etags+prevl->e, ml->v, vu); + } + + if (!edge_get_vuser(membase, etags+ml->e, ml->v)) { + vu = new_vuser(membase); + vu->ov = vu->v = ml->v; + edge_set_vuser(membase, etags+ml->e, ml->v, vu); + } + + /*continue if previous edge is tagged*/ + if (etags[prevl->e].tag) + continue; + + /*merge together adjacent split vert users*/ + if (edge_get_vuser(membase, etags+prevl->e, ml->v) + != edge_get_vuser(membase, etags+ml->e, ml->v)) + { + vu = edge_get_vuser(membase, etags+prevl->e, ml->v); + vu2 = edge_get_vuser(membase, etags+ml->e, ml->v); + + /*remove from vu2's users list and add to vu's*/ + for (e=edge_get_first(vu2); e; e=enext) { + enext = edge_get_next(e, ml->v); + edge_set_vuser(membase, e, ml->v, vu); + } + } + } + } + + mp = mpoly; + for (i=0; inumPolyData; i++, mp++) { + ml = mloop + mp->loopstart; + for (j=0; jtotloop; j++, ml++) { + if (!etags[ml->e].tag) + continue; + + prevl = mloop + mp->loopstart + ((j-1)+mp->totloop) % mp->totloop; + + if (!etags[prevl->e].tag) { + vu = edge_get_vuser(membase, etags+prevl->e, ml->v); + if (!vu) { + vu = new_vuser(membase); + vu->ov = vu->v = ml->v; + edge_set_vuser(membase, etags+prevl->e, ml->v, vu); + } + + edge_set_vuser(membase, etags+ml->e, ml->v, vu); + } else { + vu = new_vuser(membase); + vu->ov = vu->v = ml->v; + edge_set_vuser(membase, etags+ml->e, ml->v, vu); + } + } + } + + curv = cddm->numVertData; + cure = cddm->numEdgeData; + mp = mpoly; + for (i=0; inumPolyData; i++, mp++) { + ml = mloop + mp->loopstart; + for (j=0; jtotloop; j++, ml++) { + e = etags + ml->e; + if (e->v1user && !e->v1user->done) { + e->v1user->done = 1; + BLI_array_growone(mvert); + + mvert[curv] = mvert[e->v1user->ov]; + e->v1user->v = curv; + + curv++; + } + + if (e->v2user && !e->v2user->done) { + e->v2user->done = 1; + BLI_array_growone(mvert); + + mvert[curv] = mvert[e->v2user->ov]; + e->v2user->v = curv; + + curv++; + } + + vu = edge_get_vuser(membase, e, ml->v); + if (!vu) + continue; + ml->v = vu->v; + +#if 0 //BMESH_TODO should really handle edges here, but for now use cddm_calc_edges + /*ok, now we have to deal with edges. . .*/ + if (etags[ml->e].tag) { + if (etags[ml->e].used) { + BLI_array_growone(medge); + BLI_array_growone(etags); + medge[cure] = medge[ml->e]; + + ml->e = cure; + etags[cure].used = 1; + cure++; + } + + vu = etags[ml->e].v1user; + vu2 = etags[ml->e].v2user; + + if (vu) + medge[ml->e].v1 = vu->v; + if (vu2) + medge[ml->e].v2 = vu2->v; + } else { + etags[ml->e].used = 1; + + if (vu->ov == etags[ml->e].v1) + medge[ml->e].v1 = vu->v; + else if (vu->ov == etags[ml->e].v2) + medge[ml->e].v2 = vu->v; + } +#endif + } + } + + + /*resize customdata arrays and add new medge/mvert arrays*/ + vdata = cddm->vertData; + edata = cddm->edgeData; + + /*make sure we don't copy over mvert/medge layers*/ + CustomData_set_layer(&vdata, CD_MVERT, NULL); + CustomData_set_layer(&edata, CD_MEDGE, NULL); + CustomData_free_layer_active(&vdata, CD_MVERT, cddm->numVertData); + CustomData_free_layer_active(&edata, CD_MEDGE, cddm->numEdgeData); + + memset(&cddm->vertData, 0, sizeof(CustomData)); + memset(&cddm->edgeData, 0, sizeof(CustomData)); + + CustomData_copy(&vdata, &cddm->vertData, CD_MASK_DERIVEDMESH, CD_CALLOC, curv); + CustomData_copy_data(&vdata, &cddm->vertData, 0, 0, cddm->numVertData); + CustomData_free(&vdata, cddm->numVertData); + cddm->numVertData = curv; + + CustomData_copy(&edata, &cddm->edgeData, CD_MASK_DERIVEDMESH, CD_CALLOC, cure); + CustomData_copy_data(&edata, &cddm->edgeData, 0, 0, cddm->numEdgeData); + CustomData_free(&edata, cddm->numEdgeData); + cddm->numEdgeData = cure; + + CDDM_set_mvert(cddm, mvert); + CDDM_set_medge(cddm, medge); + + free_membase(membase); + MEM_freeN(etags); + + /*edge calculation isn't working correctly, so just brute force it*/ + cddm->numEdgeData = 0; + CDDM_calc_edges_poly(cddm); + + cddm->numFaceData = mesh_recalcTesselation(&cddm->faceData, + &cddm->loopData, &cddm->polyData, + mvert, cddm->numFaceData, + cddm->numLoopData, cddm->numPolyData, 1, 0); + + CDDM_set_mface(cddm, DM_get_tessface_data_layer(cddm, CD_MFACE)); + CDDM_calc_normals(cddm); + + return cddm; +} + + +static void initData(ModifierData *md) +{ + EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md; + + /* default to 30-degree split angle, sharpness from both angle & flag + */ + emd->split_angle = 30; + emd->flags = MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md; + EdgeSplitModifierData *temd = (EdgeSplitModifierData*) target; + + temd->split_angle = emd->split_angle; + temd->flags = emd->flags; +} + +static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd, + Object *ob, DerivedMesh *dm) +{ + if(!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG))) + return dm; + + return doEdgeSplit(dm, emd); +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *result; + EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md; + + result = edgesplitModifier_do(emd, ob, derivedData); + + if(result != derivedData) + CDDM_calc_normals(result); + + return result; +} + +static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, + BMEditMesh *editData, DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_EdgeSplit = { + /* name */ "EdgeSplit", + /* structName */ "EdgeSplitModifierData", + /* structSize */ sizeof(EdgeSplitModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c new file mode 100644 index 00000000000..ec4137c2654 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -0,0 +1,910 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" +#include "DNA_scene_types.h" + +#include "BLI_kdtree.h" +#include "BLI_rand.h" +#include "BLI_math.h" +#include "BLI_edgehash.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_deform.h" +#include "BKE_lattice.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_object.h" +#include "BKE_particle.h" +#include "BKE_scene.h" +#include "BKE_utildefines.h" + +#include "MEM_guardedalloc.h" + + +static void initData(ModifierData *md) +{ + ExplodeModifierData *emd= (ExplodeModifierData*) md; + + emd->facepa=0; + emd->flag |= eExplodeFlag_Unborn+eExplodeFlag_Alive+eExplodeFlag_Dead; +} +static void freeData(ModifierData *md) +{ + ExplodeModifierData *emd= (ExplodeModifierData*) md; + + if(emd->facepa) MEM_freeN(emd->facepa); +} +static void copyData(ModifierData *md, ModifierData *target) +{ + ExplodeModifierData *emd= (ExplodeModifierData*) md; + ExplodeModifierData *temd= (ExplodeModifierData*) target; + + temd->facepa = 0; + temd->flag = emd->flag; + temd->protect = emd->protect; + temd->vgroup = emd->vgroup; +} +static int dependsOnTime(ModifierData *md) +{ + return 1; +} +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + ExplodeModifierData *emd= (ExplodeModifierData*) md; + CustomDataMask dataMask = 0; + + if(emd->vgroup) + dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static void createFacepa(ExplodeModifierData *emd, + ParticleSystemModifierData *psmd, + Object *ob, DerivedMesh *dm) +{ + ParticleSystem *psys=psmd->psys; + MFace *fa=0, *mface=0; + MVert *mvert = 0; + ParticleData *pa; + KDTree *tree; + float center[3], co[3]; + int *facepa=0,*vertpa=0,totvert=0,totface=0,totpart=0; + int i,p,v1,v2,v3,v4=0; + + mvert = dm->getVertArray(dm); + mface = dm->getTessFaceArray(dm); + totface= dm->getNumTessFaces(dm); + totvert= dm->getNumVerts(dm); + totpart= psmd->psys->totpart; + + BLI_srandom(psys->seed); + + if(emd->facepa) + MEM_freeN(emd->facepa); + + facepa = emd->facepa = MEM_callocN(sizeof(int)*totface, "explode_facepa"); + + vertpa = MEM_callocN(sizeof(int)*totvert, "explode_vertpa"); + + /* initialize all faces & verts to no particle */ + for(i=0; ivgroup){ + MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + float val; + if(dvert){ + int defgrp_index= emd->vgroup-1; + for(i=0; iprotect)*val + emd->protect*0.5f; + if(val < defvert_find_weight(dvert, defgrp_index)) + vertpa[i] = -1; + } + } + } + + /* make tree of emitter locations */ + tree=BLI_kdtree_new(totpart); + for(p=0,pa=psys->particles; pdm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,0,0); + BLI_kdtree_insert(tree, p, co, NULL); + } + BLI_kdtree_balance(tree); + + /* set face-particle-indexes to nearest particle to face center */ + for(i=0,fa=mface; iv1].co,mvert[fa->v2].co); + add_v3_v3(center, mvert[fa->v3].co); + if(fa->v4){ + add_v3_v3(center, mvert[fa->v4].co); + mul_v3_fl(center,0.25); + } + else + mul_v3_fl(center,0.3333f); + + p= BLI_kdtree_find_nearest(tree,center,NULL,NULL); + + v1=vertpa[fa->v1]; + v2=vertpa[fa->v2]; + v3=vertpa[fa->v3]; + if(fa->v4) + v4=vertpa[fa->v4]; + + if(v1>=0 && v2>=0 && v3>=0 && (fa->v4==0 || v4>=0)) + facepa[i]=p; + + if(v1>=0) vertpa[fa->v1]=p; + if(v2>=0) vertpa[fa->v2]=p; + if(v3>=0) vertpa[fa->v3]=p; + if(fa->v4 && v4>=0) vertpa[fa->v4]=p; + } + + if(vertpa) MEM_freeN(vertpa); + BLI_kdtree_free(tree); +} + +static int edgesplit_get(EdgeHash *edgehash, int v1, int v2) +{ + return GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, v1, v2)); +} + +static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){ + DerivedMesh *splitdm; + MFace *mf=0,*df1=0,*df2=0,*df3=0; + MFace *mface=CDDM_get_tessfaces(dm); + MVert *dupve, *mv; + EdgeHash *edgehash; + EdgeHashIterator *ehi; + int totvert=dm->getNumVerts(dm); + int totface=dm->getNumTessFaces(dm); + + int *facesplit = MEM_callocN(sizeof(int)*totface,"explode_facesplit"); + int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2"); + int *facepa = emd->facepa; + int *fs, totesplit=0,totfsplit=0,totin=0,curdupvert=0,curdupface=0,curdupin=0; + int i,j,v1,v2,v3,v4,esplit; + + edgehash= BLI_edgehash_new(); + + /* recreate vertpa from facepa calculation */ + for (i=0,mf=mface; iv1]=facepa[i]; + vertpa[mf->v2]=facepa[i]; + vertpa[mf->v3]=facepa[i]; + if(mf->v4) + vertpa[mf->v4]=facepa[i]; + } + + /* mark edges for splitting and how to split faces */ + for (i=0,mf=mface,fs=facesplit; iv4){ + v1=vertpa[mf->v1]; + v2=vertpa[mf->v2]; + v3=vertpa[mf->v3]; + v4=vertpa[mf->v4]; + + if(v1!=v2){ + BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL); + (*fs)++; + } + + if(v2!=v3){ + BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL); + (*fs)++; + } + + if(v3!=v4){ + BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL); + (*fs)++; + } + + if(v1!=v4){ + BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL); + (*fs)++; + } + + if(*fs==2){ + if((v1==v2 && v3==v4) || (v1==v4 && v2==v3)) + *fs=1; + else if(v1!=v2){ + if(v1!=v4) + BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL); + else + BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL); + } + else{ + if(v1!=v4) + BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL); + else + BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL); + } + } + } + } + + /* count splits & reindex */ + ehi= BLI_edgehashIterator_new(edgehash); + totesplit=totvert; + for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { + BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totesplit)); + totesplit++; + } + BLI_edgehashIterator_free(ehi); + + /* count new faces due to splitting */ + for(i=0,fs=facesplit; igetTessFaceData(dm,i,CD_MFACE);//CDDM_get_tessface(dm,i); + + if(vertpa[mf->v1]!=vertpa[mf->v2] && vertpa[mf->v2]!=vertpa[mf->v3]) + totin++; + } + } + + splitdm= CDDM_from_template(dm, totesplit+totin, dm->getNumEdges(dm),totface+totfsplit, 0, 0); + + /* copy new faces & verts (is it really this painful with custom data??) */ + for(i=0; igetVert(dm, i, &source); + dest = CDDM_get_vert(splitdm, i); + + DM_copy_vert_data(dm, splitdm, i, i, 1); + *dest = source; + } + for(i=0; igetTessFace(dm, i, &source); + dest = CDDM_get_tessface(splitdm, i); + + DM_copy_tessface_data(dm, splitdm, i, i, 1); + *dest = source; + } + + /* override original facepa (original pointer is saved in caller function) */ + facepa= MEM_callocN(sizeof(int)*(totface+totfsplit),"explode_facepa"); + memcpy(facepa,emd->facepa,totface*sizeof(int)); + emd->facepa=facepa; + + /* create new verts */ + curdupvert=totvert; + ehi= BLI_edgehashIterator_new(edgehash); + for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { + BLI_edgehashIterator_getKey(ehi, &i, &j); + esplit= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); + mv=CDDM_get_vert(splitdm,j); + dupve=CDDM_get_vert(splitdm,esplit); + + DM_copy_vert_data(splitdm,splitdm,j,esplit,1); + + *dupve=*mv; + + mv=CDDM_get_vert(splitdm,i); + + add_v3_v3(dupve->co, mv->co); + mul_v3_fl(dupve->co, 0.5f); + } + BLI_edgehashIterator_free(ehi); + + /* create new faces */ + curdupface=totface; + curdupin=totesplit; + for(i=0,fs=facesplit; iv1]; + v2=vertpa[mf->v2]; + v3=vertpa[mf->v3]; + v4=vertpa[mf->v4]; + /* ouch! creating new faces & remapping them to new verts is no fun */ + if(*fs==1){ + df1=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df1=*mf; + curdupface++; + + if(v1==v2){ + df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); + df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); + mf->v3=df1->v2; + mf->v4=df1->v1; + } + else{ + df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); + df1->v4=edgesplit_get(edgehash, mf->v3, mf->v4); + mf->v2=df1->v1; + mf->v3=df1->v4; + } + + facepa[i]=v1; + facepa[curdupface-1]=v3; + + test_index_face(df1, &splitdm->faceData, curdupface, (df1->v4 ? 4 : 3)); + } + if(*fs==2){ + df1=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df1=*mf; + curdupface++; + + df2=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df2=*mf; + curdupface++; + + if(v1!=v2){ + if(v1!=v4){ + df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); + df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); + df2->v1=df1->v3=mf->v2; + df2->v3=df1->v4=mf->v4; + df2->v2=mf->v3; + + mf->v2=df1->v2; + mf->v3=df1->v1; + + df2->v4=mf->v4=0; + + facepa[i]=v1; + } + else{ + df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); + df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); + df1->v4=mf->v3; + df2->v2=mf->v3; + df2->v3=mf->v4; + + mf->v1=df1->v2; + mf->v3=df1->v3; + + df2->v4=mf->v4=0; + + facepa[i]=v2; + } + facepa[curdupface-1]=facepa[curdupface-2]=v3; + } + else{ + if(v1!=v4){ + df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4); + df1->v2=mf->v3; + + mf->v1=df1->v4; + mf->v2=df1->v3; + mf->v3=mf->v4; + + df2->v4=mf->v4=0; + + facepa[i]=v4; + } + else{ + df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); + df1->v4=edgesplit_get(edgehash, mf->v3, mf->v4); + df1->v1=mf->v4; + df1->v2=mf->v2; + df2->v3=mf->v4; + + mf->v1=df1->v4; + mf->v2=df1->v3; + + df2->v4=mf->v4=0; + + facepa[i]=v3; + } + + facepa[curdupface-1]=facepa[curdupface-2]=v1; + } + + test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); + test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); + } + else if(*fs==3){ + df1=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df1=*mf; + curdupface++; + + df2=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df2=*mf; + curdupface++; + + df3=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df3=*mf; + curdupface++; + + if(v1==v2){ + df2->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); + df3->v1=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); + df3->v3=df2->v2=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + df3->v2=mf->v3; + df2->v3=mf->v4; + df1->v4=df2->v4=df3->v4=0; + + mf->v3=df1->v2; + mf->v4=df1->v1; + + facepa[i]=facepa[curdupface-3]=v1; + facepa[curdupface-1]=v3; + facepa[curdupface-2]=v4; + } + else if(v2==v3){ + df3->v1=df2->v3=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4); + df2->v2=df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); + df3->v2=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + + df3->v3=mf->v4; + df2->v1=mf->v1; + df1->v4=df2->v4=df3->v4=0; + + mf->v1=df1->v2; + mf->v4=df1->v3; + + facepa[i]=facepa[curdupface-3]=v2; + facepa[curdupface-1]=v4; + facepa[curdupface-2]=v1; + } + else if(v3==v4){ + df3->v2=df2->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); + df2->v3=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); + df3->v3=df1->v3=edgesplit_get(edgehash, mf->v1, mf->v4); + + df3->v1=mf->v1; + df2->v2=mf->v2; + df1->v4=df2->v4=df3->v4=0; + + mf->v1=df1->v3; + mf->v2=df1->v2; + + facepa[i]=facepa[curdupface-3]=v3; + facepa[curdupface-1]=v1; + facepa[curdupface-2]=v2; + } + else{ + df3->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); + df3->v3=df2->v1=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3); + df2->v3=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + + df3->v2=mf->v2; + df2->v2=mf->v3; + df1->v4=df2->v4=df3->v4=0; + + mf->v2=df1->v1; + mf->v3=df1->v3; + + facepa[i]=facepa[curdupface-3]=v1; + facepa[curdupface-1]=v2; + facepa[curdupface-2]=v3; + } + + test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3)); + test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); + test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); + } + else if(*fs==4){ + if(v1!=v2 && v2!=v3){ + + /* set new vert to face center */ + mv=CDDM_get_vert(splitdm,mf->v1); + dupve=CDDM_get_vert(splitdm,curdupin); + DM_copy_vert_data(splitdm,splitdm,mf->v1,curdupin,1); + *dupve=*mv; + + mv=CDDM_get_vert(splitdm,mf->v2); + VECADD(dupve->co,dupve->co,mv->co); + mv=CDDM_get_vert(splitdm,mf->v3); + VECADD(dupve->co,dupve->co,mv->co); + mv=CDDM_get_vert(splitdm,mf->v4); + VECADD(dupve->co,dupve->co,mv->co); + mul_v3_fl(dupve->co,0.25); + + + df1=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df1=*mf; + curdupface++; + + df2=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df2=*mf; + curdupface++; + + df3=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df3=*mf; + curdupface++; + + df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); + df3->v2=df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); + + df2->v1=edgesplit_get(edgehash, mf->v1, mf->v4); + df3->v4=df2->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + + df3->v1=df2->v2=df1->v4=curdupin; + + mf->v2=df1->v1; + mf->v3=curdupin; + mf->v4=df2->v1; + + curdupin++; + + facepa[i]=v1; + facepa[curdupface-3]=v2; + facepa[curdupface-2]=v3; + facepa[curdupface-1]=v4; + + test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3)); + + test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); + test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); + } + else{ + df1=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df1=*mf; + curdupface++; + + df2=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df2=*mf; + curdupface++; + + df3=CDDM_get_tessface(splitdm,curdupface); + DM_copy_face_data(splitdm,splitdm,i,curdupface,1); + *df3=*mf; + curdupface++; + + if(v2==v3){ + df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2); + df3->v1=df1->v2=df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3); + df2->v1=df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4); + + df3->v3=df2->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + + df3->v2=mf->v3; + df3->v4=0; + + mf->v2=df1->v1; + mf->v3=df1->v4; + mf->v4=0; + + facepa[i]=v1; + facepa[curdupface-3]=facepa[curdupface-2]=v2; + facepa[curdupface-1]=v3; + } + else{ + df3->v1=df2->v1=df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2); + df2->v4=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4); + df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4); + + df3->v3=df2->v2=edgesplit_get(edgehash, mf->v2, mf->v3); + + df3->v4=0; + + mf->v1=df1->v4; + mf->v2=df1->v3; + mf->v3=mf->v4; + mf->v4=0; + + facepa[i]=v4; + facepa[curdupface-3]=facepa[curdupface-2]=v1; + facepa[curdupface-1]=v2; + } + + test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3)); + test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3)); + test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3)); + } + } + + test_index_face(df1, &splitdm->faceData, i, (df1->v4 ? 4 : 3)); + } + } + + BLI_edgehash_free(edgehash, NULL); + MEM_freeN(facesplit); + MEM_freeN(vertpa); + + dm = CDDM_copy(splitdm, 1); /*builds ngon faces from tess (mface) faces*/ + splitdm->needsFree = 1; + splitdm->release(splitdm); + + return dm; +} +static DerivedMesh * explodeMesh(ExplodeModifierData *emd, + ParticleSystemModifierData *psmd, Scene *scene, Object *ob, + DerivedMesh *to_explode) +{ + DerivedMesh *explode, *dm=to_explode; + MFace *mf=0, *mface; + ParticleSettings *part=psmd->psys->part; + ParticleSimulationData sim = {scene, ob, psmd->psys, psmd}; + ParticleData *pa=NULL, *pars=psmd->psys->particles; + ParticleKey state; + EdgeHash *vertpahash; + EdgeHashIterator *ehi; + float *vertco=0, imat[4][4]; + float loc0[3], nor[3]; + float timestep, cfra; + int *facepa=emd->facepa; + int totdup=0,totvert=0,totface=0,totpart=0; + int i, j, v, mindex=0; + + totface= dm->getNumTessFaces(dm); + totvert= dm->getNumVerts(dm); + mface= dm->getTessFaceArray(dm); + totpart= psmd->psys->totpart; + + timestep= psys_get_timestep(&sim); + + //if(part->flag & PART_GLOB_TIME) + cfra= BKE_curframe(scene); + //else + // cfra=bsystem_time(scene, ob,(float)scene->r.cfra,0.0); + + /* hash table for vertice <-> particle relations */ + vertpahash= BLI_edgehash_new(); + + for (i=0; itime) + mindex = totvert+totpart; + else + mindex = totvert+facepa[i]; + + mf= &mface[i]; + + /* set face vertices to exist in particle group */ + BLI_edgehash_insert(vertpahash, mf->v1, mindex, NULL); + BLI_edgehash_insert(vertpahash, mf->v2, mindex, NULL); + BLI_edgehash_insert(vertpahash, mf->v3, mindex, NULL); + if(mf->v4) + BLI_edgehash_insert(vertpahash, mf->v4, mindex, NULL); + } + + /* make new vertice indexes & count total vertices after duplication */ + ehi= BLI_edgehashIterator_new(vertpahash); + for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { + BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totdup)); + totdup++; + } + BLI_edgehashIterator_free(ehi); + + /* the final duplicated vertices */ + explode= CDDM_from_template(dm, totdup, 0,totface, 0, 0); + /*dupvert= CDDM_get_verts(explode);*/ + + /* getting back to object space */ + invert_m4_m4(imat,ob->obmat); + + psmd->psys->lattice = psys_get_lattice(&sim); + + /* duplicate & displace vertices */ + ehi= BLI_edgehashIterator_new(vertpahash); + for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { + MVert source; + MVert *dest; + + /* get particle + vertex from hash */ + BLI_edgehashIterator_getKey(ehi, &j, &i); + i -= totvert; + v= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); + + dm->getVert(dm, j, &source); + dest = CDDM_get_vert(explode,v); + + DM_copy_vert_data(dm,explode,j,v,1); + *dest = source; + + if(i!=totpart) { + /* get particle */ + pa= pars+i; + + /* get particle state */ + psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc0,nor,0,0,0,0); + mul_m4_v3(ob->obmat,loc0); + + state.time=cfra; + psys_get_particle_state(&sim, i, &state, 1); + + vertco=CDDM_get_vert(explode,v)->co; + + mul_m4_v3(ob->obmat,vertco); + + VECSUB(vertco,vertco,loc0); + + /* apply rotation, size & location */ + mul_qt_v3(state.rot,vertco); + if(emd->flag & eExplodeFlag_PaSize) + mul_v3_fl(vertco,pa->size); + VECADD(vertco,vertco,state.co); + + mul_m4_v3(imat,vertco); + } + } + BLI_edgehashIterator_free(ehi); + + /*map new vertices to faces*/ + for (i=0; ialive==PARS_UNBORN && (emd->flag&eExplodeFlag_Unborn)==0) continue; + if(pa->alive==PARS_ALIVE && (emd->flag&eExplodeFlag_Alive)==0) continue; + if(pa->alive==PARS_DEAD && (emd->flag&eExplodeFlag_Dead)==0) continue; + } + + dm->getTessFace(dm,i,&source); + mf=CDDM_get_tessface(explode,i); + + orig_v4 = source.v4; + + if(facepa[i]!=totpart && cfra <= pa->time) + mindex = totvert+totpart; + else + mindex = totvert+facepa[i]; + + source.v1 = edgesplit_get(vertpahash, source.v1, mindex); + source.v2 = edgesplit_get(vertpahash, source.v2, mindex); + source.v3 = edgesplit_get(vertpahash, source.v3, mindex); + if(source.v4) + source.v4 = edgesplit_get(vertpahash, source.v4, mindex); + + DM_copy_face_data(dm,explode,i,i,1); + + *mf = source; + + test_index_face(mf, &explode->faceData, i, (orig_v4 ? 4 : 3)); + } + + /* cleanup */ + BLI_edgehash_free(vertpahash, NULL); + + /* finalization */ + CDDM_calc_edges(explode); + CDDM_calc_normals(explode); + + if(psmd->psys->lattice){ + end_latt_deform(psmd->psys->lattice); + psmd->psys->lattice= NULL; + } + + dm = CDDM_copy(explode, 1); /*builds ngon faces from tess (mface) faces*/ + explode->needsFree = 1; + explode->release(explode); + + return explode; +} + +static ParticleSystemModifierData * findPrecedingParticlesystem(Object *ob, ModifierData *emd) +{ + ModifierData *md; + ParticleSystemModifierData *psmd=0; + + for (md=ob->modifiers.first; emd!=md; md=md->next){ + if(md->type==eModifierType_ParticleSystem) + psmd= (ParticleSystemModifierData*) md; + } + return psmd; +} +static DerivedMesh * applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = derivedData; + ExplodeModifierData *emd= (ExplodeModifierData*) md; + ParticleSystemModifierData *psmd=findPrecedingParticlesystem(ob,md); + + if(psmd){ + ParticleSystem * psys=psmd->psys; + + if(psys==0 || psys->totpart==0) return derivedData; + if(psys->part==0 || psys->particles==0) return derivedData; + if(psmd->dm==0) return derivedData; + + /* 1. find faces to be exploded if needed */ + if(emd->facepa==0 + || psmd->flag&eParticleSystemFlag_Pars + || emd->flag&eExplodeFlag_CalcFaces + || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumTessFaces(dm)){ + if(psmd->flag & eParticleSystemFlag_Pars) + psmd->flag &= ~eParticleSystemFlag_Pars; + + if(emd->flag & eExplodeFlag_CalcFaces) + emd->flag &= ~eExplodeFlag_CalcFaces; + + createFacepa(emd,psmd,ob,derivedData); + } + + /* 2. create new mesh */ + if(emd->flag & eExplodeFlag_EdgeSplit){ + int *facepa = emd->facepa; + DerivedMesh *splitdm=splitEdges(emd,dm); + DerivedMesh *explode=explodeMesh(emd, psmd, md->scene, ob, splitdm); + + MEM_freeN(emd->facepa); + emd->facepa=facepa; + splitdm->release(splitdm); + return explode; + } + else + return explodeMesh(emd, psmd, md->scene, ob, derivedData); + } + return derivedData; +} + + +ModifierTypeInfo modifierType_Explode = { + /* name */ "Explode", + /* structName */ "ExplodeModifierData", + /* structSize */ sizeof(ExplodeModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh, + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c new file mode 100644 index 00000000000..f272e7f18a6 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_fluidsim.c @@ -0,0 +1,157 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_scene_types.h" +#include "DNA_object_fluidsim.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" + +#include "depsgraph_private.h" + +#include "MOD_fluidsim_util.h" +#include "MEM_guardedalloc.h" + +/* Fluidsim */ +static void initData(ModifierData *md) +{ + FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; + + fluidsim_init(fluidmd); +} +static void freeData(ModifierData *md) +{ + FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; + + fluidsim_free(fluidmd); +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; + FluidsimModifierData *tfluidmd= (FluidsimModifierData*) target; + + if(tfluidmd->fss) + MEM_freeN(tfluidmd->fss); + + tfluidmd->fss = MEM_dupallocN(fluidmd->fss); +} + + + +static DerivedMesh * applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; + DerivedMesh *result = NULL; + + /* check for alloc failing */ + if(!fluidmd->fss) + { + initData(md); + + if(!fluidmd->fss) + return derivedData; + } + + result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc); + + if(result) + { + return result; + } + + return derivedData; +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, Scene *scene, + Object *ob, DagNode *obNode) +{ + FluidsimModifierData *fluidmd= (FluidsimModifierData*) md; + Base *base; + + if(fluidmd && fluidmd->fss) + { + if(fluidmd->fss->type == OB_FLUIDSIM_DOMAIN) + { + for(base = scene->base.first; base; base= base->next) + { + Object *ob1= base->object; + if(ob1 != ob) + { + FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob1, eModifierType_Fluidsim); + + // only put dependancies from NON-DOMAIN fluids in here + if(fluidmdtmp && fluidmdtmp->fss && (fluidmdtmp->fss->type!=OB_FLUIDSIM_DOMAIN)) + { + DagNode *curNode = dag_get_node(forest, ob1); + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Fluidsim Object"); + } + } + } + } + } +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + + +ModifierTypeInfo modifierType_Fluidsim = { + /* name */ "Fluidsim", + /* structName */ "FluidsimModifierData", + /* structSize */ sizeof(FluidsimModifierData), + /* type */ eModifierTypeType_Nonconstructive, + + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_RequiresOriginalData + | eModifierTypeFlag_Single, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c new file mode 100644 index 00000000000..17ce46129bc --- /dev/null +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c @@ -0,0 +1,608 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include +#include + +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_object_fluidsim.h" + +#include "BLI_blenlib.h" +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_utildefines.h" +#include "BKE_global.h" /* G.sce only */ + +#include "MOD_modifiertypes.h" + +#include "MEM_guardedalloc.h" + +// headers for fluidsim bobj meshes +#include "LBM_fluidsim.h" + +void fluidsim_init(FluidsimModifierData *fluidmd) +{ +#ifndef DISABLE_ELBEEM + if(fluidmd) + { + FluidsimSettings *fss = MEM_callocN(sizeof(FluidsimSettings), "fluidsimsettings"); + + fluidmd->fss = fss; + + if(!fss) + return; + + fss->fmd = fluidmd; + fss->type = OB_FLUIDSIM_ENABLE; + fss->show_advancedoptions = 0; + + fss->resolutionxyz = 65; + fss->previewresxyz = 45; + fss->realsize = 0.5; + fss->guiDisplayMode = 2; // preview + fss->renderDisplayMode = 3; // render + + fss->viscosityMode = 2; // default to water + fss->viscosityValue = 1.0; + fss->viscosityExponent = 6; + + // dg TODO: change this to [] + fss->gravx = 0.0; + fss->gravy = 0.0; + fss->gravz = -9.81; + fss->animStart = 0.0; + fss->animEnd = 4.0; + fss->gstar = 0.005; // used as normgstar + fss->maxRefine = -1; + // maxRefine is set according to resolutionxyz during bake + + // fluid/inflow settings + // fss->iniVel --> automatically set to 0 + + /* elubie: changed this to default to the same dir as the render output + to prevent saving to C:\ on Windows */ + BLI_strncpy(fss->surfdataPath, btempdir, FILE_MAX); + + // first init of bounding box + // no bounding box needed + + // todo - reuse default init from elbeem! + fss->typeFlags = OB_FSBND_PARTSLIP; + fss->domainNovecgen = 0; + fss->volumeInitType = 1; // volume + fss->partSlipValue = 0.2; + + fss->generateTracers = 0; + fss->generateParticles = 0.0; + fss->surfaceSmoothing = 1.0; + fss->surfaceSubdivs = 0.0; + fss->particleInfSize = 0.0; + fss->particleInfAlpha = 0.0; + + // init fluid control settings + fss->attractforceStrength = 0.2; + fss->attractforceRadius = 0.75; + fss->velocityforceStrength = 0.2; + fss->velocityforceRadius = 0.75; + fss->cpsTimeStart = fss->animStart; + fss->cpsTimeEnd = fss->animEnd; + fss->cpsQuality = 10.0; // 1.0 / 10.0 => means 0.1 width + + /* + BAD TODO: this is done in buttons_object.c in the moment + Mesh *mesh = ob->data; + // calculate bounding box + fluid_get_bb(mesh->mvert, mesh->totvert, ob->obmat, fss->bbStart, fss->bbSize); + */ + + // (ab)used to store velocities + fss->meshSurfNormals = NULL; + + fss->lastgoodframe = -1; + + fss->flag |= OB_FLUIDSIM_ACTIVE; + + } +#endif + return; +} + +void fluidsim_free(FluidsimModifierData *fluidmd) +{ +#ifndef DISABLE_ELBEEM + if(fluidmd) + { + if(fluidmd->fss->meshSurfNormals) + { + MEM_freeN(fluidmd->fss->meshSurfNormals); + fluidmd->fss->meshSurfNormals = NULL; + } + MEM_freeN(fluidmd->fss); + } +#endif + return; +} + +#ifndef DISABLE_ELBEEM +/* read .bobj.gz file into a fluidsimDerivedMesh struct */ +DerivedMesh *fluidsim_read_obj(char *filename) +{ + int wri,i,j; + float wrf; + int gotBytes; + gzFile gzf; + int numverts = 0, numfaces = 0; + DerivedMesh *dm = NULL; + MFace *mface; + MVert *mvert; + short *normals; + + // ------------------------------------------------ + // get numverts + numfaces first + // ------------------------------------------------ + gzf = gzopen(filename, "rb"); + if (!gzf) + { + return NULL; + } + + // read numverts + gotBytes = gzread(gzf, &wri, sizeof(wri)); + numverts = wri; + + // skip verts + for(i=0; ico[j] = wrf; + } + } + + // should be the same as numverts + gotBytes = gzread(gzf, &wri, sizeof(wri)); + if(wri != numverts) + { + if(dm) + dm->release(dm); + gzclose( gzf ); + return NULL; + } + + normals = MEM_callocN(sizeof(short) * numverts * 3, "fluid_tmp_normals" ); + if(!normals) + { + if(dm) + dm->release(dm); + gzclose( gzf ); + return NULL; + } + + // read normals from file (but don't save them yet) + for(i=0; iv1 = face[0]; + mf->v2 = face[1]; + mf->v3 = face[2]; + } + else + { + mf->v1 = face[1]; + mf->v2 = face[2]; + mf->v3 = face[0]; + } + mf->v4 = face[3]; + + test_index_face(mf, NULL, 0, 3); + } + + gzclose( gzf ); + + CDDM_calc_edges(dm); + + CDDM_apply_vert_normals(dm, (short (*)[3])normals); + MEM_freeN(normals); + + // CDDM_calc_normals(result); + + return dm; +} + + +void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4], + /*RET*/ float start[3], /*RET*/ float size[3] ) +{ + float bbsx=0.0, bbsy=0.0, bbsz=0.0; + float bbex=1.0, bbey=1.0, bbez=1.0; + int i; + float vec[3]; + + if(totvert == 0) { + zero_v3(start); + zero_v3(size); + return; + } + + copy_v3_v3(vec, mvert[0].co); + mul_m4_v3(obmat, vec); + bbsx = vec[0]; bbsy = vec[1]; bbsz = vec[2]; + bbex = vec[0]; bbey = vec[1]; bbez = vec[2]; + + for(i = 1; i < totvert; i++) { + copy_v3_v3(vec, mvert[i].co); + mul_m4_v3(obmat, vec); + + if(vec[0] < bbsx){ bbsx= vec[0]; } + if(vec[1] < bbsy){ bbsy= vec[1]; } + if(vec[2] < bbsz){ bbsz= vec[2]; } + if(vec[0] > bbex){ bbex= vec[0]; } + if(vec[1] > bbey){ bbey= vec[1]; } + if(vec[2] > bbez){ bbez= vec[2]; } + } + + // return values... + if(start) { + start[0] = bbsx; + start[1] = bbsy; + start[2] = bbsz; + } + if(size) { + size[0] = bbex-bbsx; + size[1] = bbey-bbsy; + size[2] = bbez-bbsz; + } +} + +//------------------------------------------------------------------------------- +// old interface +//------------------------------------------------------------------------------- + +void fluid_estimate_memory(Object *ob, FluidsimSettings *fss, char *value) +{ + Mesh *mesh; + + value[0]= '\0'; + + if(ob->type == OB_MESH) { + /* use mesh bounding box and object scaling */ + mesh= ob->data; + + fluid_get_bb(mesh->mvert, mesh->totvert, ob->obmat, fss->bbStart, fss->bbSize); + elbeemEstimateMemreq(fss->resolutionxyz, fss->bbSize[0],fss->bbSize[1],fss->bbSize[2], fss->maxRefine, value); + } +} + + +/* read zipped fluidsim velocities into the co's of the fluidsimsettings normals struct */ +void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename) +{ + int wri, i, j; + float wrf; + gzFile gzf; + FluidsimSettings *fss = fluidmd->fss; + int len = strlen(filename); + int totvert = dm->getNumVerts(dm); + float *velarray = NULL; + + // mesh and vverts have to be valid from loading... + + if(fss->meshSurfNormals) + MEM_freeN(fss->meshSurfNormals); + + if(len<7) + { + return; + } + + if(fss->domainNovecgen>0) return; + + // abusing pointer to hold an array of 3d-velocities + fss->meshSurfNormals = MEM_callocN(sizeof(float)*3*dm->getNumVerts(dm), "Fluidsim_velocities"); + // abusing pointer to hold an INT + fss->meshSurface = SET_INT_IN_POINTER(totvert); + + velarray = (float *)fss->meshSurfNormals; + + // .bobj.gz , correct filename + // 87654321 + filename[len-6] = 'v'; + filename[len-5] = 'e'; + filename[len-4] = 'l'; + + gzf = gzopen(filename, "rb"); + if (!gzf) + { + MEM_freeN(fss->meshSurfNormals); + fss->meshSurfNormals = NULL; + return; + } + + gzread(gzf, &wri, sizeof( wri )); + if(wri != totvert) + { + MEM_freeN(fss->meshSurfNormals); + fss->meshSurfNormals = NULL; + return; + } + + for(i=0; ir.sfra*/; /* start with 0 at start frame */ + char targetDir[FILE_MAXFILE+FILE_MAXDIR], targetFile[FILE_MAXFILE+FILE_MAXDIR]; + FluidsimSettings *fss = fluidmd->fss; + DerivedMesh *dm = NULL; + MFace *mface; + int numfaces; + int mat_nr, flag, i; + + if(!useRenderParams) { + displaymode = fss->guiDisplayMode; + } else { + displaymode = fss->renderDisplayMode; + } + + strncpy(targetDir, fss->surfdataPath, FILE_MAXDIR); + + // use preview or final mesh? + if(displaymode==1) + { + // just display original object + return NULL; + } + else if(displaymode==2) + { + strcat(targetDir,"fluidsurface_preview_####"); + } + else + { // 3 + strcat(targetDir,"fluidsurface_final_####"); + } + + BLI_path_abs(targetDir, G.sce); + BLI_path_frame(targetDir, curFrame, 0); // fixed #frame-no + + strcpy(targetFile,targetDir); + strcat(targetFile, ".bobj.gz"); + + dm = fluidsim_read_obj(targetFile); + + if(!dm) + { + // switch, abort background rendering when fluidsim mesh is missing + const char *strEnvName2 = "BLENDER_ELBEEMBOBJABORT"; // from blendercall.cpp + + if(G.background==1) { + if(getenv(strEnvName2)) { + int elevel = atoi(getenv(strEnvName2)); + if(elevel>0) { + printf("Env. var %s set, fluid sim mesh '%s' not found, aborting render...\n",strEnvName2, targetFile); + exit(1); + } + } + } + + // display org. object upon failure which is in dm + return NULL; + } + + // assign material + flags to new dm + mface = orgdm->getTessFaceArray(orgdm); + mat_nr = mface[0].mat_nr; + flag = mface[0].flag; + + mface = dm->getTessFaceArray(dm); + numfaces = dm->getNumTessFaces(dm); + for(i=0; imeshSurfNormals) + MEM_freeN(fss->meshSurfNormals); + + fss->meshSurfNormals = NULL; + } + + return dm; +} + +#endif // DISABLE_ELBEEM + +DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc) +{ +#ifndef DISABLE_ELBEEM + DerivedMesh *result = NULL; + int framenr; + FluidsimSettings *fss = NULL; + + framenr= (int)scene->r.cfra; + + // only handle fluidsim domains + if(fluidmd && fluidmd->fss && (fluidmd->fss->type != OB_FLUIDSIM_DOMAIN)) + return dm; + + // sanity check + if(!fluidmd || (fluidmd && !fluidmd->fss)) + return dm; + + fss = fluidmd->fss; + + // timescale not supported yet + // clmd->sim_parms->timescale= timescale; + + // support reversing of baked fluid frames here + if((fss->flag & OB_FLUIDSIM_REVERSE) && (fss->lastgoodframe >= 0)) + { + framenr = fss->lastgoodframe - framenr + 1; + CLAMP(framenr, 1, fss->lastgoodframe); + } + + /* try to read from cache */ + if(((fss->lastgoodframe >= framenr) || (fss->lastgoodframe < 0)) && (result = fluidsim_read_cache(ob, dm, fluidmd, framenr, useRenderParams))) + { + // fss->lastgoodframe = framenr; // set also in src/fluidsim.c + return result; + } + else + { + // display last known good frame + if(fss->lastgoodframe >= 0) + { + if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams))) + { + return result; + } + + // it was supposed to be a valid frame but it isn't! + fss->lastgoodframe = framenr - 1; + + + // this could be likely the case when you load an old fluidsim + if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams))) + { + return result; + } + } + + result = CDDM_copy(dm, 1); + + if(result) + { + return result; + } + } + + return dm; +#else + return NULL; +#endif +} diff --git a/source/blender/blenkernel/BKE_simple_deform.h b/source/blender/modifiers/intern/MOD_fluidsim_util.h similarity index 65% rename from source/blender/blenkernel/BKE_simple_deform.h rename to source/blender/modifiers/intern/MOD_fluidsim_util.h index b5f4a2514dd..a06c74cb8dd 100644 --- a/source/blender/blenkernel/BKE_simple_deform.h +++ b/source/blender/modifiers/intern/MOD_fluidsim_util.h @@ -1,5 +1,5 @@ /** - * BKE_shrinkwrap.h + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) Blender Foundation. + * The Original Code is Copyright (C) Blender Foundation * All rights reserved. * * The Original Code is: all of this file. @@ -26,14 +26,22 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef BKE_SIMPLE_DEFORM_H -#define BKE_SIMPLE_DEFORM_H + +#ifndef MOD_FLUIDSIM_UTIL_H +#define MOD_FLUIDSIM_UTIL_H struct Object; +struct Scene; +struct FluidsimModifierData; struct DerivedMesh; -struct SimpleDeformModifierData; -void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts); +/* new fluid-modifier interface */ +void fluidsim_init(struct FluidsimModifierData *fluidmd); +void fluidsim_free(struct FluidsimModifierData *fluidmd); +struct DerivedMesh *fluidsimModifier_do(struct FluidsimModifierData *fluidmd, + struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, + int useRenderParams, int isFinalCalc); + #endif diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c new file mode 100644 index 00000000000..6715e2b78c0 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_hook.c @@ -0,0 +1,278 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_action.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" +#include "BKE_deform.h" + +#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" + + +static void initData(ModifierData *md) +{ + HookModifierData *hmd = (HookModifierData*) md; + + hmd->force= 1.0; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + HookModifierData *hmd = (HookModifierData*) md; + HookModifierData *thmd = (HookModifierData*) target; + + copy_v3_v3(thmd->cent, hmd->cent); + thmd->falloff = hmd->falloff; + thmd->force = hmd->force; + thmd->object = hmd->object; + thmd->totindex = hmd->totindex; + thmd->indexar = MEM_dupallocN(hmd->indexar); + memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv)); + strncpy(thmd->name, hmd->name, 32); + strncpy(thmd->subtarget, hmd->subtarget, 32); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + HookModifierData *hmd = (HookModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(!hmd->indexar && hmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static void freeData(ModifierData *md) +{ + HookModifierData *hmd = (HookModifierData*) md; + + if (hmd->indexar) MEM_freeN(hmd->indexar); +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + HookModifierData *hmd = (HookModifierData*) md; + + return !hmd->object; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + HookModifierData *hmd = (HookModifierData*) md; + + walk(userData, ob, &hmd->object); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, + Object *ob, DagNode *obNode) +{ + HookModifierData *hmd = (HookModifierData*) md; + + if (hmd->object) { + DagNode *curNode = dag_get_node(forest, hmd->object); + + if (hmd->subtarget[0]) + dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA|DAG_RL_DATA_DATA, "Hook Modifier"); + else + dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, "Hook Modifier"); + } +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + HookModifierData *hmd = (HookModifierData*) md; + bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget); + float vec[3], mat[4][4], dmat[4][4]; + int i; + DerivedMesh *dm = derivedData; + + /* get world-space matrix of target, corrected for the space the verts are in */ + if (hmd->subtarget[0] && pchan) { + /* bone target if there's a matching pose-channel */ + mul_m4_m4m4(dmat, pchan->pose_mat, hmd->object->obmat); + } + else { + /* just object target */ + copy_m4_m4(dmat, hmd->object->obmat); + } + invert_m4_m4(ob->imat, ob->obmat); + mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv, + NULL, NULL, NULL, NULL, NULL); + + /* vertex indices? */ + if(hmd->indexar) { + for(i = 0; i < hmd->totindex; i++) { + int index = hmd->indexar[i]; + + /* This should always be true and I don't generally like + * "paranoid" style code like this, but old files can have + * indices that are out of range because old blender did + * not correct them on exit editmode. - zr + */ + if(index < numVerts) { + float *co = vertexCos[index]; + float fac = hmd->force; + + /* if DerivedMesh is present and has original index data, + * use it + */ + if(dm && dm->getVertDataArray(dm, CD_ORIGINDEX)) { + int j; + int orig_index; + for(j = 0; j < numVerts; ++j) { + fac = hmd->force; + orig_index = *(int *)dm->getVertData(dm, j, + CD_ORIGINDEX); + if(orig_index == index) { + co = vertexCos[j]; + if(hmd->falloff != 0.0) { + float len = len_v3v3(co, hmd->cent); + if(len > hmd->falloff) fac = 0.0; + else if(len > 0.0) + fac *= sqrt(1.0 - len / hmd->falloff); + } + + if(fac != 0.0) { + mul_v3_m4v3(vec, mat, co); + interp_v3_v3v3(co, co, vec, fac); + } + } + } + } else { + if(hmd->falloff != 0.0) { + float len = len_v3v3(co, hmd->cent); + if(len > hmd->falloff) fac = 0.0; + else if(len > 0.0) + fac *= sqrt(1.0 - len / hmd->falloff); + } + + if(fac != 0.0) { + mul_v3_m4v3(vec, mat, co); + interp_v3_v3v3(co, co, vec, fac); + } + } + } + } + } + else if(hmd->name[0]) { /* vertex group hook */ + Mesh *me = ob->data; + int use_dverts = 0; + int maxVerts = 0; + int defgrp_index = defgroup_name_index(ob, hmd->name); + + if(dm) { + if(dm->getVertData(dm, 0, CD_MDEFORMVERT)) { + maxVerts = dm->getNumVerts(dm); + use_dverts = 1; + } + } + else if(me->dvert) { + maxVerts = me->totvert; + use_dverts = 1; + } + + if(defgrp_index >= 0 && use_dverts) { + MDeformVert *dvert = me->dvert; + int i; + float fac; + + for(i = 0; i < maxVerts; i++, dvert++) { + if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT); + + fac= defvert_find_weight(dvert, defgrp_index); + + if(fac > 0.0f) { + float *co = vertexCos[i]; + + if(hmd->falloff != 0.0) { + float len = len_v3v3(co, hmd->cent); + if(len > hmd->falloff) fac = 0.0; + else if(len > 0.0) + fac *= sqrt(1.0 - len / hmd->falloff); + } + + mul_v3_m4v3(vec, mat, co); + interp_v3_v3v3(co, co, vec, fac); + } + } + } + } +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = derivedData; + + if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + + deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0); + + if(!derivedData) dm->release(dm); +} + + +ModifierTypeInfo modifierType_Hook = { + /* name */ "Hook", + /* structName */ "HookModifierData", + /* structSize */ sizeof(HookModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c new file mode 100644 index 00000000000..c5100578fff --- /dev/null +++ b/source/blender/modifiers/intern/MOD_lattice.c @@ -0,0 +1,142 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "string.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_lattice.h" +#include "BKE_modifier.h" + +#include "depsgraph_private.h" + +#include "MOD_util.h" + + +static void copyData(ModifierData *md, ModifierData *target) +{ + LatticeModifierData *lmd = (LatticeModifierData*) md; + LatticeModifierData *tlmd = (LatticeModifierData*) target; + + tlmd->object = lmd->object; + strncpy(tlmd->name, lmd->name, 32); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + LatticeModifierData *lmd = (LatticeModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(lmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static int isDisabled(ModifierData *md, int userRenderParams) +{ + LatticeModifierData *lmd = (LatticeModifierData*) md; + + return !lmd->object; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + LatticeModifierData *lmd = (LatticeModifierData*) md; + + walk(userData, ob, &lmd->object); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, + Object *ob, DagNode *obNode) +{ + LatticeModifierData *lmd = (LatticeModifierData*) md; + + if(lmd->object) { + DagNode *latNode = dag_get_node(forest, lmd->object); + + dag_add_relation(forest, latNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Lattice Modifier"); + } +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + LatticeModifierData *lmd = (LatticeModifierData*) md; + + + modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ + + lattice_deform_verts(lmd->object, ob, derivedData, + vertexCos, numVerts, lmd->name); +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = derivedData; + + if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + + deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0); + + if(!derivedData) dm->release(dm); +} + + +ModifierTypeInfo modifierType_Lattice = { + /* name */ "Lattice", + /* structName */ "LatticeModifierData", + /* structSize */ sizeof(LatticeModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ 0, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c new file mode 100644 index 00000000000..2505458c4d7 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_mask.c @@ -0,0 +1,410 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_armature_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" + +#include "BLI_ghash.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_deform.h" + +#include "depsgraph_private.h" + + +static void copyData(ModifierData *md, ModifierData *target) +{ + MaskModifierData *mmd = (MaskModifierData*) md; + MaskModifierData *tmmd = (MaskModifierData*) target; + + strcpy(tmmd->vgroup, mmd->vgroup); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + return (1 << CD_MDEFORMVERT); +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + MaskModifierData *mmd = (MaskModifierData *)md; + walk(userData, ob, &mmd->ob_arm); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, + Object *ob, DagNode *obNode) +{ + MaskModifierData *mmd = (MaskModifierData *)md; + + if (mmd->ob_arm) + { + DagNode *armNode = dag_get_node(forest, mmd->ob_arm); + + dag_add_relation(forest, armNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mask Modifier"); + } +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, + DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + MaskModifierData *mmd= (MaskModifierData *)md; + DerivedMesh *dm= derivedData, *result= NULL; + GHash *vertHash=NULL, *edgeHash, *faceHash; + GHashIterator *hashIter; + MDeformVert *dvert= NULL; + int numFaces=0, numEdges=0, numVerts=0; + int maxVerts, maxEdges, maxFaces; + int i; + + /* Overview of Method: + * 1. Get the vertices that are in the vertexgroup of interest + * 2. Filter out unwanted geometry (i.e. not in vertexgroup), by populating mappings with new vs old indices + * 3. Make a new mesh containing only the mapping data + */ + + /* get original number of verts, edges, and faces */ + maxVerts= dm->getNumVerts(dm); + maxEdges= dm->getNumEdges(dm); + maxFaces= dm->getNumTessFaces(dm); + + /* check if we can just return the original mesh + * - must have verts and therefore verts assigned to vgroups to do anything useful + */ + if ( !(ELEM(mmd->mode, MOD_MASK_MODE_ARM, MOD_MASK_MODE_VGROUP)) || + (maxVerts == 0) || (ob->defbase.first == NULL) ) + { + return derivedData; + } + + /* if mode is to use selected armature bones, aggregate the bone groups */ + if (mmd->mode == MOD_MASK_MODE_ARM) /* --- using selected bones --- */ + { + GHash *vgroupHash, *boneHash; + Object *oba= mmd->ob_arm; + bPoseChannel *pchan; + bDeformGroup *def; + + /* check that there is armature object with bones to use, otherwise return original mesh */ + if (ELEM(NULL, mmd->ob_arm, mmd->ob_arm->pose)) + return derivedData; + + /* hashes for finding mapping of: + * - vgroups to indicies -> vgroupHash (string, int) + * - bones to vgroup indices -> boneHash (index of vgroup, dummy) + */ + vgroupHash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "mask vgroup gh"); + boneHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "mask bone gh"); + + /* build mapping of names of vertex groups to indices */ + for (i = 0, def = ob->defbase.first; def; def = def->next, i++) + BLI_ghash_insert(vgroupHash, def->name, SET_INT_IN_POINTER(i)); + + /* get selected-posechannel <-> vertexgroup index mapping */ + for (pchan= oba->pose->chanbase.first; pchan; pchan= pchan->next) + { + /* check if bone is selected */ + // TODO: include checks for visibility too? + // FIXME: the depsgraph needs extensions to make this work in realtime... + if ( (pchan->bone) && (pchan->bone->flag & BONE_SELECTED) ) + { + /* check if hash has group for this bone */ + if (BLI_ghash_haskey(vgroupHash, pchan->name)) + { + int defgrp_index= GET_INT_FROM_POINTER(BLI_ghash_lookup(vgroupHash, pchan->name)); + + /* add index to hash (store under key only) */ + BLI_ghash_insert(boneHash, SET_INT_IN_POINTER(defgrp_index), pchan); + } + } + } + + /* if no bones selected, free hashes and return original mesh */ + if (BLI_ghash_size(boneHash) == 0) + { + BLI_ghash_free(vgroupHash, NULL, NULL); + BLI_ghash_free(boneHash, NULL, NULL); + + return derivedData; + } + + /* repeat the previous check, but for dverts */ + dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT); + if (dvert == NULL) + { + BLI_ghash_free(vgroupHash, NULL, NULL); + BLI_ghash_free(boneHash, NULL, NULL); + + return derivedData; + } + + /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ + vertHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "mask vert gh"); + + /* add vertices which exist in vertexgroups into vertHash for filtering */ + for (i = 0; i < maxVerts; i++) + { + MDeformWeight *def_weight = NULL; + int j; + + for (j= 0; j < dvert[i].totweight; j++) + { + if (BLI_ghash_haskey(boneHash, SET_INT_IN_POINTER(dvert[i].dw[j].def_nr))) + { + def_weight = &dvert[i].dw[j]; + break; + } + } + + /* check if include vert in vertHash */ + if (mmd->flag & MOD_MASK_INV) { + /* if this vert is in the vgroup, don't include it in vertHash */ + if (def_weight) continue; + } + else { + /* if this vert isn't in the vgroup, don't include it in vertHash */ + if (!def_weight) continue; + } + + /* add to ghash for verts (numVerts acts as counter for mapping) */ + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts)); + numVerts++; + } + + /* free temp hashes */ + BLI_ghash_free(vgroupHash, NULL, NULL); + BLI_ghash_free(boneHash, NULL, NULL); + } + else /* --- Using Nominated VertexGroup only --- */ + { + int defgrp_index = defgroup_name_index(ob, mmd->vgroup); + + /* get dverts */ + if (defgrp_index >= 0) + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + + /* if no vgroup (i.e. dverts) found, return the initial mesh */ + if ((defgrp_index < 0) || (dvert == NULL)) + return dm; + + /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ + vertHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "mask vert2 bh"); + + /* add vertices which exist in vertexgroup into ghash for filtering */ + for (i = 0; i < maxVerts; i++) + { + MDeformWeight *def_weight = NULL; + int j; + + for (j= 0; j < dvert[i].totweight; j++) + { + if (dvert[i].dw[j].def_nr == defgrp_index) + { + def_weight = &dvert[i].dw[j]; + break; + } + } + + /* check if include vert in vertHash */ + if (mmd->flag & MOD_MASK_INV) { + /* if this vert is in the vgroup, don't include it in vertHash */ + if (def_weight) continue; + } + else { + /* if this vert isn't in the vgroup, don't include it in vertHash */ + if (!def_weight) continue; + } + + /* add to ghash for verts (numVerts acts as counter for mapping) */ + BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts)); + numVerts++; + } + } + + /* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */ + edgeHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "mask ed2 gh"); + faceHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "mask fa2 gh"); + + /* loop over edges and faces, and do the same thing to + * ensure that they only reference existing verts + */ + for (i = 0; i < maxEdges; i++) + { + MEdge me; + dm->getEdge(dm, i, &me); + + /* only add if both verts will be in new mesh */ + if ( BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1)) && + BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2)) ) + { + BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numEdges)); + numEdges++; + } + } + for (i = 0; i < maxFaces; i++) + { + MFace mf; + dm->getTessFace(dm, i, &mf); + + /* all verts must be available */ + if ( BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v1)) && + BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v2)) && + BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v3)) && + (mf.v4==0 || BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v4))) ) + { + BLI_ghash_insert(faceHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numFaces)); + numFaces++; + } + } + + + /* now we know the number of verts, edges and faces, + * we can create the new (reduced) mesh + */ + result = CDDM_from_template(dm, numVerts, numEdges, numFaces, 0, 0); + + + /* using ghash-iterators, map data into new mesh */ + /* vertices */ + for ( hashIter = BLI_ghashIterator_new(vertHash); + !BLI_ghashIterator_isDone(hashIter); + BLI_ghashIterator_step(hashIter) ) + { + MVert source; + MVert *dest; + int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); + int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); + + dm->getVert(dm, oldIndex, &source); + dest = CDDM_get_vert(result, newIndex); + + DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); + *dest = source; + } + BLI_ghashIterator_free(hashIter); + + /* edges */ + for ( hashIter = BLI_ghashIterator_new(edgeHash); + !BLI_ghashIterator_isDone(hashIter); + BLI_ghashIterator_step(hashIter) ) + { + MEdge source; + MEdge *dest; + int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); + int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); + + dm->getEdge(dm, oldIndex, &source); + dest = CDDM_get_edge(result, newIndex); + + source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); + source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); + + DM_copy_edge_data(dm, result, oldIndex, newIndex, 1); + *dest = source; + } + BLI_ghashIterator_free(hashIter); + + /* faces */ + for ( hashIter = BLI_ghashIterator_new(faceHash); + !BLI_ghashIterator_isDone(hashIter); + BLI_ghashIterator_step(hashIter) ) + { + MFace source; + MFace *dest; + int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); + int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); + int orig_v4; + + dm->getTessFace(dm, oldIndex, &source); + dest = CDDM_get_tessface(result, newIndex); + + orig_v4 = source.v4; + + source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); + source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2))); + source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3))); + if (source.v4) + source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4))); + + DM_copy_face_data(dm, result, oldIndex, newIndex, 1); + *dest = source; + + test_index_face(dest, &result->faceData, newIndex, (orig_v4 ? 4 : 3)); + } + BLI_ghashIterator_free(hashIter); + + /* recalculate normals */ + CDDM_calc_normals(result); + + /* free hashes */ + BLI_ghash_free(vertHash, NULL, NULL); + BLI_ghash_free(edgeHash, NULL, NULL); + BLI_ghash_free(faceHash, NULL, NULL); + + /* return the new mesh */ + dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); + + return dm; +} + + +ModifierTypeInfo modifierType_Mask = { + /* name */ "Mask", + /* structName */ "MaskModifierData", + /* structSize */ sizeof(MaskModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_SupportsMapping|eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ 0, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c new file mode 100644 index 00000000000..defc23fc468 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -0,0 +1,451 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_global.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_deform.h" +#include "BKE_tessmesh.h" + +#include "depsgraph_private.h" + +#include "MEM_guardedalloc.h" + +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + + mmd->gridsize= 5; +} + +static void freeData(ModifierData *md) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + + if(mmd->bindinfluences) MEM_freeN(mmd->bindinfluences); + if(mmd->bindoffsets) MEM_freeN(mmd->bindoffsets); + if(mmd->bindcagecos) MEM_freeN(mmd->bindcagecos); + if(mmd->dyngrid) MEM_freeN(mmd->dyngrid); + if(mmd->dyninfluences) MEM_freeN(mmd->dyninfluences); + if(mmd->dynverts) MEM_freeN(mmd->dynverts); +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + MeshDeformModifierData *tmmd = (MeshDeformModifierData*) target; + + tmmd->gridsize = mmd->gridsize; + tmmd->object = mmd->object; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(mmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + + return !mmd->object; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + + walk(userData, ob, &mmd->object); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, + DagNode *obNode) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + + if (mmd->object) { + DagNode *curNode = dag_get_node(forest, mmd->object); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA|DAG_RL_OB_DATA|DAG_RL_DATA_OB|DAG_RL_OB_OB, + "Mesh Deform Modifier"); + } +} + +static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3], float *vec) +{ + MDefCell *cell; + MDefInfluence *inf; + float gridvec[3], dvec[3], ivec[3], co[3], wx, wy, wz; + float weight, cageweight, totweight, *cageco; + int i, j, a, x, y, z, size; + + co[0]= co[1]= co[2]= 0.0f; + totweight= 0.0f; + size= mmd->dyngridsize; + + for(i=0; i<3; i++) { + gridvec[i]= (vec[i] - mmd->dyncellmin[i] - mmd->dyncellwidth*0.5f)/mmd->dyncellwidth; + ivec[i]= (int)gridvec[i]; + dvec[i]= gridvec[i] - ivec[i]; + } + + for(i=0; i<8; i++) { + if(i & 1) { x= ivec[0]+1; wx= dvec[0]; } + else { x= ivec[0]; wx= 1.0f-dvec[0]; } + + if(i & 2) { y= ivec[1]+1; wy= dvec[1]; } + else { y= ivec[1]; wy= 1.0f-dvec[1]; } + + if(i & 4) { z= ivec[2]+1; wz= dvec[2]; } + else { z= ivec[2]; wz= 1.0f-dvec[2]; } + + CLAMP(x, 0, size-1); + CLAMP(y, 0, size-1); + CLAMP(z, 0, size-1); + + a= x + y*size + z*size*size; + weight= wx*wy*wz; + + cell= &mmd->dyngrid[a]; + inf= mmd->dyninfluences + cell->offset; + for(j=0; jtotinfluence; j++, inf++) { + cageco= dco[inf->vertex]; + cageweight= weight*inf->weight; + co[0] += cageweight*cageco[0]; + co[1] += cageweight*cageco[1]; + co[2] += cageweight*cageco[2]; + totweight += cageweight; + } + } + + copy_v3_v3(vec, co); + + return totweight; +} + +static void meshdeformModifier_do( + ModifierData *md, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) +{ + MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; + struct Mesh *me= (mmd->object)? mmd->object->data: NULL; + BMEditMesh *em = me ? me->edit_btmesh : NULL; + DerivedMesh *tmpdm, *cagedm; + MDeformVert *dvert = NULL; + MDeformWeight *dw; + MDefInfluence *influences; + int *offsets; + float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4]; + float weight, totweight, fac, co[3], (*dco)[3], (*bindcagecos)[3]; + int a, b, totvert, totcagevert, defgrp_index; + float (*cagecos)[3]; + + if(!mmd->object || (!mmd->bindcagecos && !mmd->bindfunc)) + return; + + /* get cage derivedmesh */ + if(em) { + tmpdm= editbmesh_get_derived_cage_and_final(md->scene, ob, em, &cagedm, 0); + if(tmpdm) + tmpdm->release(tmpdm); + } + else + cagedm= mmd->object->derivedFinal; + + /* if we don't have one computed, use derivedmesh from data + * without any modifiers */ + if(!cagedm) { + cagedm= get_dm(md->scene, mmd->object, NULL, NULL, NULL, 0); + if(cagedm) + cagedm->needsFree= 1; + } + + if(!cagedm) { + modifier_setError(md, "Can't get mesh from cage object."); + return; + } + + /* compute matrices to go in and out of cage object space */ + invert_m4_m4(imat, mmd->object->obmat); + mul_m4_m4m4(cagemat, ob->obmat, imat); + mul_m4_m4m4(cmat, cagemat, mmd->bindmat); + invert_m4_m4(iobmat, cmat); + copy_m3_m4(icagemat, iobmat); + + /* bind weights if needed */ + if(!mmd->bindcagecos) { + static int recursive = 0; + + /* progress bar redraw can make this recursive .. */ + if(!recursive) { + recursive = 1; + mmd->bindfunc(md->scene, mmd, (float*)vertexCos, numVerts, cagemat); + recursive = 0; + } + } + + /* verify we have compatible weights */ + totvert= numVerts; + totcagevert= cagedm->getNumVerts(cagedm); + + if(mmd->totvert != totvert) { + modifier_setError(md, "Verts changed from %d to %d.", mmd->totvert, totvert); + cagedm->release(cagedm); + return; + } + else if (mmd->totcagevert != totcagevert) { + modifier_setError(md, "Cage verts changed from %d to %d.", mmd->totcagevert, totcagevert); + cagedm->release(cagedm); + return; + } else if (mmd->bindcagecos == NULL) { + modifier_setError(md, "Bind data missing."); + cagedm->release(cagedm); + return; + } + + cagecos= MEM_callocN(sizeof(*cagecos)*totcagevert, "meshdeformModifier vertCos"); + + /* setup deformation data */ + cagedm->getVertCos(cagedm, cagecos); + influences= mmd->bindinfluences; + offsets= mmd->bindoffsets; + bindcagecos= (float(*)[3])mmd->bindcagecos; + + dco= MEM_callocN(sizeof(*dco)*totcagevert, "MDefDco"); + for(a=0; abindmat, co); + /* compute difference with world space bind coord */ + sub_v3_v3v3(dco[a], co, bindcagecos[a]); + } + else + copy_v3_v3(dco[a], co); + } + + defgrp_index = defgroup_name_index(ob, mmd->defgrp_name); + + if(dm && defgrp_index >= 0) + dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT); + + /* do deformation */ + fac= 1.0f; + + for(b=0; bflag & MOD_MDEF_DYNAMIC_BIND) + if(!mmd->dynverts[b]) + continue; + + if(dvert) { + for(dw=NULL, a=0; aflag & MOD_MDEF_INVERT_VGROUP) { + if(!dw) fac= 1.0f; + else if(dw->weight == 1.0f) continue; + else fac=1.0f-dw->weight; + } + else { + if(!dw) continue; + else fac= dw->weight; + } + } + + if(mmd->flag & MOD_MDEF_DYNAMIC_BIND) { + /* transform coordinate into cage's local space */ + mul_v3_m4v3(co, cagemat, vertexCos[b]); + totweight= meshdeform_dynamic_bind(mmd, dco, co); + } + else { + totweight= 0.0f; + co[0]= co[1]= co[2]= 0.0f; + + for(a=offsets[b]; a 0.0f) { + mul_v3_fl(co, fac/totweight); + mul_m3_v3(icagemat, co); + if(G.rt != 527) + add_v3_v3(vertexCos[b], co); + else + copy_v3_v3(vertexCos[b], co); + } + } + + /* release cage derivedmesh */ + MEM_freeN(dco); + MEM_freeN(cagecos); + cagedm->release(cagedm); +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);; + + modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ + + meshdeformModifier_do(md, ob, dm, vertexCos, numVerts); + + if(dm && dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM(ModifierData *md, Object *ob, struct BMEditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);; + + meshdeformModifier_do(md, ob, dm, vertexCos, numVerts); + + if(dm && dm != derivedData) + dm->release(dm); +} + +#define MESHDEFORM_MIN_INFLUENCE 0.00001 + +void modifier_mdef_compact_influences(ModifierData *md) +{ + MeshDeformModifierData *mmd= (MeshDeformModifierData*)md; + float weight, *weights, totweight; + int totinfluence, totvert, totcagevert, a, b; + + weights= mmd->bindweights; + if(!weights) + return; + + totvert= mmd->totvert; + totcagevert= mmd->totcagevert; + + /* count number of influences above threshold */ + for(b=0; b MESHDEFORM_MIN_INFLUENCE) + mmd->totinfluence++; + } + } + + /* allocate bind influences */ + mmd->bindinfluences= MEM_callocN(sizeof(MDefInfluence)*mmd->totinfluence, "MDefBindInfluence"); + mmd->bindoffsets= MEM_callocN(sizeof(int)*(totvert+1), "MDefBindOffset"); + + /* write influences */ + totinfluence= 0; + + for(b=0; bbindoffsets[b]= totinfluence; + totweight= 0.0f; + + /* sum total weight */ + for(a=0; a MESHDEFORM_MIN_INFLUENCE) + totweight += weight; + } + + /* assign weights normalized */ + for(a=0; a MESHDEFORM_MIN_INFLUENCE) { + mmd->bindinfluences[totinfluence].weight= weight/totweight; + mmd->bindinfluences[totinfluence].vertex= a; + totinfluence++; + } + } + } + + mmd->bindoffsets[b]= totinfluence; + + /* free */ + MEM_freeN(mmd->bindweights); + mmd->bindweights= NULL; +} + +ModifierTypeInfo modifierType_MeshDeform = { + /* name */ "MeshDeform", + /* structName */ "MeshDeformModifierData", + /* structSize */ sizeof(MeshDeformModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c new file mode 100644 index 00000000000..2b9fa45ae9b --- /dev/null +++ b/source/blender/modifiers/intern/MOD_mirror.c @@ -0,0 +1,267 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_deform.h" +#include "BKE_utildefines.h" +#include "BKE_tessmesh.h" + +#include "MEM_guardedalloc.h" +#include "depsgraph_private.h" + +static void initData(ModifierData *md) +{ + MirrorModifierData *mmd = (MirrorModifierData*) md; + + mmd->flag |= (MOD_MIR_AXIS_X | MOD_MIR_VGROUP); + mmd->tolerance = 0.001; + mmd->mirror_ob = NULL; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + MirrorModifierData *mmd = (MirrorModifierData*) md; + MirrorModifierData *tmmd = (MirrorModifierData*) target; + + tmmd->axis = mmd->axis; + tmmd->flag = mmd->flag; + tmmd->tolerance = mmd->tolerance; + tmmd->mirror_ob = mmd->mirror_ob;; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + MirrorModifierData *mmd = (MirrorModifierData*) md; + + walk(userData, ob, &mmd->mirror_ob); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, + Object *ob, DagNode *obNode) +{ + MirrorModifierData *mmd = (MirrorModifierData*) md; + + if(mmd->mirror_ob) { + DagNode *latNode = dag_get_node(forest, mmd->mirror_ob); + + dag_add_relation(forest, latNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mirror Modifier"); + } +} + + +/* Mirror */ +#define VERT_NEW 1 + +void vertgroup_flip_name (char *name, int strip_number); +DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd, + Object *ob, + DerivedMesh *dm, + int initFlags, + int axis) +{ + float tolerance = mmd->tolerance; + DerivedMesh *result, *cddm; + BMEditMesh *em; + BMesh *bm; + BMOIter siter1; + BMOperator op; + BMVert *v1; + int vector_size=0, a, b; + bDeformGroup *def, *defb; + bDeformGroup **vector_def = NULL; + float mtx[4][4], imtx[4][4]; + int j; + + cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's + em = CDDM_To_BMesh(dm, NULL); + + /*convienence variable*/ + bm = em->bm; + + if (mmd->flag & MOD_MIR_VGROUP) { + /* calculate the number of deformedGroups */ + for(vector_size = 0, def = ob->defbase.first; def; + def = def->next, vector_size++); + + /* load the deformedGroups for fast access */ + vector_def = + (bDeformGroup **)MEM_mallocN(sizeof(bDeformGroup*) * vector_size, + "group_index"); + for(a = 0, def = ob->defbase.first; def; def = def->next, a++) { + vector_def[a] = def; + } + } + + if (mmd->mirror_ob) { + float mtx2[4][4], vec[3]; + + invert_m4_m4(mtx2, mmd->mirror_ob->obmat); + mul_m4_m4m4(mtx, ob->obmat, mtx2); + } else { + unit_m4(mtx); + } + + BMO_InitOpf(bm, &op, "mirror geom=%avef mat=%m4 mergedist=%f axis=%d", + mtx, mmd->tolerance, axis); + + BMO_Exec_Op(bm, &op); + + BMO_CallOpf(bm, "reversefaces faces=%s", &op, "newout"); + + /*handle vgroup stuff*/ + if (mmd->flag & MOD_MIR_VGROUP) { + BMO_ITER(v1, &siter1, bm, &op, "newout", BM_VERT) { + MDeformVert *dvert = CustomData_bmesh_get(&bm->vdata, v1->head.data, CD_MDEFORMVERT); + + if (dvert) { + for(j = 0; j < dvert[0].totweight; ++j) { + char tmpname[32]; + + if(dvert->dw[j].def_nr < 0 || + dvert->dw[j].def_nr >= vector_size) + continue; + + def = vector_def[dvert->dw[j].def_nr]; + strcpy(tmpname, def->name); + vertgroup_flip_name(tmpname,0); + + for(b = 0, defb = ob->defbase.first; defb; + defb = defb->next, b++) + { + if(!strcmp(defb->name, tmpname)) + { + dvert->dw[j].def_nr = b; + break; + } + } + } + } + } + } + + BMO_Finish_Op(bm, &op); + + BMEdit_RecalcTesselation(em); + result = CDDM_from_BMEditMesh(em, NULL); //CDDM_copy(getEditDerivedBMesh(em, ob, NULL), 0); + + BMEdit_Free(em); + MEM_freeN(em); + + if (vector_def) MEM_freeN(vector_def); + + return result; +} + +static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd, + Object *ob, DerivedMesh *dm, + int initFlags) +{ + DerivedMesh *result = dm; + + /* check which axes have been toggled and mirror accordingly */ + if(mmd->flag & MOD_MIR_AXIS_X) { + result = doMirrorOnAxis(mmd, ob, result, initFlags, 0); + } + if(mmd->flag & MOD_MIR_AXIS_Y) { + DerivedMesh *tmp = result; + result = doMirrorOnAxis(mmd, ob, result, initFlags, 1); + if(tmp != dm) tmp->release(tmp); /* free intermediate results */ + } + if(mmd->flag & MOD_MIR_AXIS_Z) { + DerivedMesh *tmp = result; + result = doMirrorOnAxis(mmd, ob, result, initFlags, 2); + if(tmp != dm) tmp->release(tmp); /* free intermediate results */ + } + + return result; +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *result; + MirrorModifierData *mmd = (MirrorModifierData*) md; + + result = mirrorModifier__doMirror(mmd, ob, derivedData, 0); + + if(result != derivedData) + CDDM_calc_normals(result); + + return result; +} + +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_Mirror = { + /* name */ "Mirror", + /* structName */ "MirrorModifierData", + /* structSize */ sizeof(MirrorModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode + | eModifierTypeFlag_AcceptsCVs, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c new file mode 100644 index 00000000000..0498c57e0a8 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -0,0 +1,112 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include + +#include "BKE_cdderivedmesh.h" +#include "BKE_multires.h" +#include "BKE_modifier.h" +#include "BKE_paint.h" +#include "BKE_particle.h" + +static void initData(ModifierData *md) +{ + MultiresModifierData *mmd = (MultiresModifierData*)md; + + mmd->lvl = 0; + mmd->sculptlvl = 0; + mmd->renderlvl = 0; + mmd->totlvl = 0; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + MultiresModifierData *mmd = (MultiresModifierData*) md; + MultiresModifierData *tmmd = (MultiresModifierData*) target; + + tmmd->lvl = mmd->lvl; + tmmd->sculptlvl = mmd->sculptlvl; + tmmd->renderlvl = mmd->renderlvl; + tmmd->totlvl = mmd->totlvl; +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, + int useRenderParams, int isFinalCalc) +{ + SculptSession *ss= ob->sculpt; + int sculpting= (ob->mode & OB_MODE_SCULPT) && ss; + MultiresModifierData *mmd = (MultiresModifierData*)md; + DerivedMesh *result; + + result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc); + + if(result == dm) + return dm; + + if(useRenderParams || !isFinalCalc) { + DerivedMesh *cddm= CDDM_copy(result, 0); + result->release(result); + result= cddm; + } + else if(sculpting) { + /* would be created on the fly too, just nicer this + way on first stroke after e.g. switching levels */ + ss->pbvh= result->getPBVH(ob, result); + } + + return result; +} + + +ModifierTypeInfo modifierType_Multires = { + /* name */ "Multires", + /* structName */ "MultiresModifierData", + /* structSize */ sizeof(MultiresModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_RequiresOriginalData, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c new file mode 100644 index 00000000000..3a5dc4dce33 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_none.c @@ -0,0 +1,70 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful; + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation; + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Daniel Dunbar + * Ton Roosendaal, + * Ben Batt, + * Brecht Van Lommel, + * Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "MOD_modifiertypes.h" + +/* We only need to define isDisabled; because it always returns 1, + * no other functions will be called + */ + +static int isDisabled(ModifierData *md, int userRenderParams) +{ + return 1; +} + +ModifierTypeInfo modifierType_None = { + /* name */ "None", + /* structName */ "ModifierData", + /* structSize */ sizeof(ModifierData), + /* type */ eModifierType_None, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs, + + /* copyData */ 0, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ 0, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c new file mode 100644 index 00000000000..c1e5eda746e --- /dev/null +++ b/source/blender/modifiers/intern/MOD_particleinstance.c @@ -0,0 +1,344 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" +#include "BLI_listbase.h" +#include "BLI_rand.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_lattice.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" +#include "BKE_pointcache.h" +#include "BKE_utildefines.h" + +#include "depsgraph_private.h" + + +static void initData(ModifierData *md) +{ + ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md; + + pimd->flag = eParticleInstanceFlag_Parents|eParticleInstanceFlag_Unborn| + eParticleInstanceFlag_Alive|eParticleInstanceFlag_Dead; + pimd->psys = 1; + pimd->position = 1.0f; + pimd->axis = 2; + +} +static void copyData(ModifierData *md, ModifierData *target) +{ + ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md; + ParticleInstanceModifierData *tpimd= (ParticleInstanceModifierData*) target; + + tpimd->ob = pimd->ob; + tpimd->psys = pimd->psys; + tpimd->flag = pimd->flag; + tpimd->axis = pimd->axis; + tpimd->position = pimd->position; + tpimd->random_position = pimd->random_position; +} + +static int dependsOnTime(ModifierData *md) +{ + return 0; +} +static void updateDepgraph(ModifierData *md, DagForest *forest, + struct Scene *scene,Object *ob, DagNode *obNode) +{ + ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md; + + if (pimd->ob) { + DagNode *curNode = dag_get_node(forest, pimd->ob); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, + "Particle Instance Modifier"); + } +} + +static void foreachObjectLink(ModifierData *md, Object *ob, + ObjectWalkFunc walk, void *userData) +{ + ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md; + + walk(userData, ob, &pimd->ob); +} + +static DerivedMesh * applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = derivedData, *result; + ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md; + ParticleSimulationData sim; + ParticleSystem * psys=0; + ParticleData *pa=0, *pars=0; + MFace *mface, *orig_mface; + MVert *mvert, *orig_mvert; + int i,totvert, totpart=0, totface, maxvert, maxface, first_particle=0; + short track=ob->trackflag%3, trackneg, axis = pimd->axis; + float max_co=0.0, min_co=0.0, temp_co[3], cross[3]; + float *size=NULL; + + trackneg=((ob->trackflag>2)?1:0); + + if(pimd->ob==ob){ + pimd->ob=0; + return derivedData; + } + + if(pimd->ob){ + psys = BLI_findlink(&pimd->ob->particlesystem,pimd->psys-1); + if(psys==0 || psys->totpart==0) + return derivedData; + } + else return derivedData; + + if(pimd->flag & eParticleInstanceFlag_Parents) + totpart+=psys->totpart; + if(pimd->flag & eParticleInstanceFlag_Children){ + if(totpart==0) + first_particle=psys->totpart; + totpart+=psys->totchild; + } + + if(totpart==0) + return derivedData; + + sim.scene = md->scene; + sim.ob = pimd->ob; + sim.psys = psys; + sim.psmd = psys_get_modifier(pimd->ob, psys); + + if(pimd->flag & eParticleInstanceFlag_UseSize) { + int p; + float *si; + si = size = MEM_callocN(totpart * sizeof(float), "particle size array"); + + if(pimd->flag & eParticleInstanceFlag_Parents) { + for(p=0, pa= psys->particles; ptotpart; p++, pa++, si++) + *si = pa->size; + } + + if(pimd->flag & eParticleInstanceFlag_Children) { + ChildParticle *cpa = psys->child; + + for(p=0; ptotchild; p++, cpa++, si++) { + *si = psys_get_child_size(psys, cpa, 0.0f, NULL); + } + } + } + + pars=psys->particles; + + totvert=dm->getNumVerts(dm); + totface=dm->getNumTessFaces(dm); + + maxvert=totvert*totpart; + maxface=totface*totpart; + + psys->lattice=psys_get_lattice(&sim); + + if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED){ + + float min_r[3], max_r[3]; + INIT_MINMAX(min_r, max_r); + dm->getMinMax(dm, min_r, max_r); + min_co=min_r[track]; + max_co=max_r[track]; + } + + result = CDDM_from_template(dm, maxvert,dm->getNumEdges(dm)*totpart,maxface, 0, 0); + + mvert=result->getVertArray(result); + orig_mvert=dm->getVertArray(dm); + + for(i=0; ico); + mv->co[axis]=temp_co[track]; + mv->co[(axis+1)%3]=temp_co[(track+1)%3]; + mv->co[(axis+2)%3]=temp_co[(track+2)%3]; + + if((psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED) && pimd->flag & eParticleInstanceFlag_Path){ + float ran = 0.0f; + if(pimd->random_position != 0.0f) { + BLI_srandom(psys->seed + (i/totvert)%totpart); + ran = pimd->random_position * BLI_frand(); + } + + if(pimd->flag & eParticleInstanceFlag_KeepShape) { + state.time = pimd->position * (1.0f - ran); + } + else { + state.time=(mv->co[axis]-min_co)/(max_co-min_co) * pimd->position * (1.0f - ran); + + if(trackneg) + state.time=1.0f-state.time; + + mv->co[axis] = 0.0; + } + + psys_get_particle_on_path(&sim, first_particle + i/totvert, &state,1); + + normalize_v3(state.vel); + + /* TODO: incremental rotations somehow */ + if(state.vel[axis] < -0.9999 || state.vel[axis] > 0.9999) { + state.rot[0] = 1; + state.rot[1] = state.rot[2] = state.rot[3] = 0.0f; + } + else { + float temp[3] = {0.0f,0.0f,0.0f}; + temp[axis] = 1.0f; + + cross_v3_v3v3(cross, temp, state.vel); + + /* state.vel[axis] is the only component surviving from a dot product with the axis */ + axis_angle_to_quat(state.rot,cross,saacos(state.vel[axis])); + } + + } + else{ + state.time=-1.0; + psys_get_particle_state(&sim, first_particle + i/totvert, &state,1); + } + + mul_qt_v3(state.rot,mv->co); + if(pimd->flag & eParticleInstanceFlag_UseSize) + mul_v3_fl(mv->co, size[i/totvert]); + VECADD(mv->co,mv->co,state.co); + } + + mface=result->getTessFaceArray(result); + orig_mface=dm->getTessFaceArray(dm); + + for(i=0; iflag & eParticleInstanceFlag_Parents){ + if(i/totface>=psys->totpart){ + if(psys->part->childtype==PART_CHILD_PARTICLES) + pa=psys->particles+(psys->child+i/totface-psys->totpart)->parent; + else + pa=0; + } + else + pa=pars+i/totface; + } + else{ + if(psys->part->childtype==PART_CHILD_PARTICLES) + pa=psys->particles+(psys->child+i/totface)->parent; + else + pa=0; + } + + if(pa){ + if(pa->alive==PARS_UNBORN && (pimd->flag&eParticleInstanceFlag_Unborn)==0) continue; + if(pa->alive==PARS_ALIVE && (pimd->flag&eParticleInstanceFlag_Alive)==0) continue; + if(pa->alive==PARS_DEAD && (pimd->flag&eParticleInstanceFlag_Dead)==0) continue; + } + + inMF = orig_mface + i%totface; + DM_copy_face_data(dm, result, i%totface, i, 1); + *mf = *inMF; + + mf->v1+=(i/totface)*totvert; + mf->v2+=(i/totface)*totvert; + mf->v3+=(i/totface)*totvert; + if(mf->v4) + mf->v4+=(i/totface)*totvert; + } + + CDDM_calc_edges(result); + CDDM_calc_normals(result); + + if(psys->lattice){ + end_latt_deform(psys->lattice); + psys->lattice= NULL; + } + + if(size) + MEM_freeN(size); + + dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); + + return dm; +} + +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_ParticleInstance = { + /* name */ "ParticleInstance", + /* structName */ "ParticleInstanceModifierData", + /* structSize */ sizeof(ParticleInstanceModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c new file mode 100644 index 00000000000..4feeef54882 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -0,0 +1,232 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "stddef.h" + +#include "DNA_material_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_material.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" + +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; + psmd->psys= 0; + psmd->dm=0; + psmd->totdmvert= psmd->totdmedge= psmd->totdmface= 0; +} +static void freeData(ModifierData *md) +{ + ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; + + if(psmd->dm){ + psmd->dm->needsFree = 1; + psmd->dm->release(psmd->dm); + psmd->dm=0; + } + + /* ED_object_modifier_remove may have freed this first before calling + * modifier_free (which calls this function) */ + if(psmd->psys) + psmd->psys->flag |= PSYS_DELETE; +} +static void copyData(ModifierData *md, ModifierData *target) +{ + ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; + ParticleSystemModifierData *tpsmd= (ParticleSystemModifierData*) target; + + tpsmd->dm = 0; + tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0; + //tpsmd->facepa = 0; + tpsmd->flag = psmd->flag; + /* need to keep this to recognise a bit later in copy_object */ + tpsmd->psys = psmd->psys; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; + CustomDataMask dataMask = 0; + Material *ma; + MTex *mtex; + int i; + + if(!psmd->psys->part) + return 0; + + ma= give_current_material(ob, psmd->psys->part->omat); + if(ma) { + for(i=0; imtex[i]; + if(mtex && (ma->septex & (1<pmapto && (mtex->texco & TEXCO_UV)) + dataMask |= (1 << CD_MTFACE); + } + } + + if(psmd->psys->part->tanfac!=0.0) + dataMask |= (1 << CD_MTFACE); + + /* ask for vertexgroups if we need them */ + for(i=0; ipsys->vgroup[i]){ + dataMask |= (1 << CD_MDEFORMVERT); + break; + } + } + + /* particles only need this if they are after a non deform modifier, and + * the modifier stack will only create them in that case. */ + dataMask |= CD_MASK_ORIGSPACE; + + dataMask |= CD_MASK_ORCO; + + return dataMask; +} + +/* saves the current emitter state for a particle system and calculates particles */ +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = derivedData; + ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; + ParticleSystem * psys=0; + int needsFree=0; + + if(ob->particlesystem.first) + psys=psmd->psys; + else + return; + + if(!psys_check_enabled(ob, psys)) + return; + + if(dm==0) { + dm= get_dm(md->scene, ob, NULL, NULL, vertexCos, 1); + + if(!dm) + return; + + needsFree= 1; + } + + /* clear old dm */ + if(psmd->dm){ + psmd->dm->needsFree = 1; + psmd->dm->release(psmd->dm); + } + + /* make new dm */ + psmd->dm=CDDM_copy(dm, 0); + CDDM_apply_vert_coords(psmd->dm, vertexCos); + CDDM_calc_normals(psmd->dm); + + if(needsFree){ + dm->needsFree = 1; + dm->release(dm); + } + + /* protect dm */ + psmd->dm->needsFree = 0; + + /* report change in mesh structure */ + if(psmd->dm->getNumVerts(psmd->dm)!=psmd->totdmvert || + psmd->dm->getNumEdges(psmd->dm)!=psmd->totdmedge || + psmd->dm->getNumTessFaces(psmd->dm)!=psmd->totdmface){ + /* in file read dm hasn't really changed but just wasn't saved in file */ + + psys->recalc |= PSYS_RECALC_RESET; + psmd->flag |= eParticleSystemFlag_DM_changed; + + psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm); + psmd->totdmedge= psmd->dm->getNumEdges(psmd->dm); + psmd->totdmface= psmd->dm->getNumTessFaces(psmd->dm); + } + + if(psys) { + psmd->flag &= ~eParticleSystemFlag_psys_updated; + particle_system_update(md->scene, ob, psys); + psmd->flag |= eParticleSystemFlag_psys_updated; + psmd->flag &= ~eParticleSystemFlag_DM_changed; + } +} + +/* disabled particles in editmode for now, until support for proper derivedmesh + * updates is coded */ +#if 0 +static void deformVertsEM( + ModifierData *md, Object *ob, EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = derivedData; + + if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); + + deformVerts(md, ob, dm, vertexCos, numVerts); + + if(!derivedData) dm->release(dm); +} +#endif + + +ModifierTypeInfo modifierType_ParticleSystem = { + /* name */ "ParticleSystem", + /* structName */ "ParticleSystemModifierData", + /* structSize */ sizeof(ParticleSystemModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_UsesPointCache /* + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode */, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ 0 /* deformVertsEM */ , + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c new file mode 100644 index 00000000000..16990c2522b --- /dev/null +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -0,0 +1,880 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* Screw modifier: revolves the edges about an axis */ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" + +#include "depsgraph_private.h" +#include "MOD_modifiertypes.h" +#include "MEM_guardedalloc.h" + +/* used for gathering edge connectivity */ +typedef struct ScrewVertConnect { + float dist; /* distance from the center axis */ + float co[3]; /* loaction relative to the transformed axis */ + float no[3]; /* calc normal of the vertex */ + int v[2]; /* 2 verts on either side of this one */ + MEdge *e[2]; /* edges on either side, a bit of a waste since each edge ref's 2 edges */ + char flag; +} ScrewVertConnect; + +typedef struct ScrewVertIter { + ScrewVertConnect * v_array; + ScrewVertConnect * v_poin; + int v; + int v_other; + MEdge *e; +} ScrewVertIter; + +#define ScrewVertIter_INIT(iter, array, v_init, dir)\ + iter.v_array = array;\ + iter.v = v_init;\ + if (v_init>=0) {\ + iter.v_poin = &array[v_init];\ + iter.v_other = iter.v_poin->v[dir];\ + if (dir)\ + iter.e = iter.v_poin->e[0];\ + else\ + iter.e = iter.v_poin->e[1];\ + } else {\ + iter.v_poin= NULL;\ + iter.e= NULL;\ + } + + +#define ScrewVertIter_NEXT(iter)\ + if (iter.v_poin->v[0] == iter.v_other) {\ + iter.v_other= iter.v;\ + iter.v= iter.v_poin->v[1];\ + } else if (iter.v_poin->v[1] == iter.v_other) {\ + iter.v_other= iter.v;\ + iter.v= iter.v_poin->v[0];\ + }\ + if (iter.v >=0) {\ + iter.v_poin= &iter.v_array[iter.v];\ + if ( iter.v_poin->e[0] != iter.e ) iter.e= iter.v_poin->e[0];\ + else iter.e= iter.v_poin->e[1];\ + } else {\ + iter.e= NULL;\ + iter.v_poin= NULL;\ + } + +static void initData(ModifierData *md) +{ + ScrewModifierData *ltmd= (ScrewModifierData*) md; + ltmd->ob_axis= NULL; + ltmd->angle= M_PI * 2.0; + ltmd->axis= 2; + ltmd->flag= 0; + ltmd->steps= 16; + ltmd->render_steps= 16; + ltmd->iter= 1; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + ScrewModifierData *sltmd= (ScrewModifierData*) md; + ScrewModifierData *tltmd= (ScrewModifierData*) target; + + tltmd->ob_axis= sltmd->ob_axis; + tltmd->angle= sltmd->angle; + tltmd->axis= sltmd->axis; + tltmd->flag= sltmd->flag; + tltmd->steps= sltmd->steps; + tltmd->render_steps= sltmd->render_steps; + tltmd->screw_ofs= sltmd->screw_ofs; + tltmd->iter= sltmd->iter; +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, + DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm= derivedData; + DerivedMesh *result; + ScrewModifierData *ltmd= (ScrewModifierData*) md; + + int *origindex; + int mface_index=0; + int i, j; + int i1,i2; + int steps= ltmd->steps; + int maxVerts=0, maxEdges=0, maxFaces=0; + int totvert= dm->getNumVerts(dm); + int totedge= dm->getNumEdges(dm); + + char axis_char= 'X', close; + float angle= ltmd->angle; + float screw_ofs= ltmd->screw_ofs; + float axis_vec[3]= {0.0f, 0.0f, 0.0f}; + float tmp_vec1[3], tmp_vec2[3]; + float mat3[3][3]; + float mtx_tx[4][4]; /* transform the coords by an object relative to this objects transformation */ + float mtx_tx_inv[4][4]; /* inverted */ + float mtx_tmp_a[4][4]; + + int vc_tot_linked= 0; + short other_axis_1, other_axis_2; + float *tmpf1, *tmpf2; + + MFace *mface_new, *mf_new; + MEdge *medge_orig, *med_orig, *med_new, *med_new_firstloop, *medge_new; + MVert *mvert_new, *mvert_orig, *mv_orig, *mv_new, *mv_new_base; + + ScrewVertConnect *vc, *vc_tmp, *vert_connect= NULL; + + float mat[4][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 1.0f}}; + + /* dont do anything? */ + if (!totvert) + return CDDM_from_template(dm, 0, 0, 0, 0, 0); + + steps= useRenderParams ? ltmd->render_steps : ltmd->steps; + + switch(ltmd->axis) { + case 0: + other_axis_1=1; + other_axis_2=2; + break; + case 1: + other_axis_1=0; + other_axis_2=2; + break; + default: /* 2, use default to quiet warnings */ + other_axis_1=0; + other_axis_2=1; + break; + } + + axis_vec[ltmd->axis]= 1.0f; + + if (ltmd->ob_axis) { + float mtx3_tx[3][3]; + /* calc the matrix relative to the axis object */ + invert_m4_m4(mtx_tmp_a, ob->obmat); + copy_m4_m4(mtx_tx_inv, ltmd->ob_axis->obmat); + mul_m4_m4m4(mtx_tx, mtx_tx_inv, mtx_tmp_a); + + copy_m3_m4(mtx3_tx, mtx_tx); + + /* calc the axis vec */ + mul_m3_v3(mtx3_tx, axis_vec); + normalize_v3(axis_vec); + + /* screw */ + if(ltmd->flag & MOD_SCREW_OBJECT_OFFSET) { + /* find the offset along this axis relative to this objects matrix */ + float totlen = len_v3(mtx_tx[3]); + + if(totlen != 0.0f) { + float zero[3]={0.0f, 0.0f, 0.0f}; + float cp[3]; + screw_ofs= closest_to_line_v3(cp, mtx_tx[3], zero, axis_vec); + } + else { + screw_ofs= 0.0f; + } + } + + /* angle */ + +#if 0 // cant incluide this, not pradictable enough, though quite fun,. + if(ltmd->flag & MOD_SCREW_OBJECT_ANGLE) { + + + float vec[3] = {0,1,0}; + float cross1[3]; + float cross2[3]; + cross_v3_v3v3(cross1, vec, axis_vec); + + mul_v3_m3v3(cross2, mtx3_tx, cross1); + { + float c1[3]; + float c2[3]; + float axis_tmp[3]; + + cross_v3_v3v3(c1, cross2, axis_vec); + cross_v3_v3v3(c2, axis_vec, c1); + + + angle= angle_v3v3(cross1, c2); + + cross_v3_v3v3(axis_tmp, cross1, c2); + normalize_v3(axis_tmp); + + if(len_v3v3(axis_tmp, axis_vec) > 1.0f) + angle= -angle; + + } + } +#endif + } + else { + /* exis char is used by i_rotate*/ + axis_char += ltmd->axis; /* 'X' + axis */ + + /* useful to be able to use the axis vec in some cases still */ + zero_v3(axis_vec); + axis_vec[ltmd->axis]= 1.0f; + } + + /* apply the multiplier */ + angle *= ltmd->iter; + screw_ofs *= ltmd->iter; + + /* multiplying the steps is a bit tricky, this works best */ + steps = ((steps + 1) * ltmd->iter) - (ltmd->iter - 1); + + /* will the screw be closed? + * Note! smaller then FLT_EPSILON*100 gives problems with float precission so its never closed. */ + if (fabs(screw_ofs) <= (FLT_EPSILON*100) && fabs(fabs(angle) - (M_PI * 2)) <= (FLT_EPSILON*100)) { + close= 1; + steps--; + if(steps < 2) steps= 2; + + maxVerts = totvert * steps; /* -1 because we're joining back up */ + maxEdges = (totvert * steps) + /* these are the edges between new verts */ + (totedge * steps); /* -1 because vert edges join */ + maxFaces = totedge * steps; + + screw_ofs= 0.0f; + } + else { + close= 0; + if(steps < 2) steps= 2; + + maxVerts = totvert * steps; /* -1 because we're joining back up */ + maxEdges = (totvert * (steps-1)) + /* these are the edges between new verts */ + (totedge * steps); /* -1 because vert edges join */ + maxFaces = totedge * (steps-1); + } + + result= CDDM_from_template(dm, maxVerts, maxEdges, maxFaces, 0, 0); + + /* copy verts from mesh */ + mvert_orig = dm->getVertArray(dm); + medge_orig = dm->getEdgeArray(dm); + + mvert_new = result->getVertArray(result); + mface_new = result->getTessFaceArray(result); + medge_new = result->getEdgeArray(result); + + origindex= result->getTessFaceDataArray(result, CD_ORIGINDEX); + + /* Set the locations of the first set of verts */ + + mv_new= mvert_new; + mv_orig= mvert_orig; + + /* Copy the first set of edges */ + med_orig= medge_orig; + med_new= medge_new; + for (i=0; i < totedge; i++, med_orig++, med_new++) { + med_new->v1= med_orig->v1; + med_new->v2= med_orig->v2; + med_new->crease= med_orig->crease; + med_new->flag= med_orig->flag & ~ME_LOOSEEDGE; + } + + if(ltmd->flag & MOD_SCREW_NORMAL_CALC) { + /* + * Normal Calculation (for face flipping) + * Sort edge verts for correct face flipping + * NOT REALLY NEEDED but face flipping is nice. + * + * */ + + + /* Notice! + * + * Since we are only ordering the edges here it can avoid mallocing the + * extra space by abusing the vert array berfore its filled with new verts. + * The new array for vert_connect must be at least sizeof(ScrewVertConnect) * totvert + * and the size of our resulting meshes array is sizeof(MVert) * totvert * 3 + * so its safe to use the second 2 thrids of MVert the array for vert_connect, + * just make sure ScrewVertConnect struct is no more then twice as big as MVert, + * at the moment there is no chance of that being a problem, + * unless MVert becomes half its current size. + * + * once the edges are ordered, vert_connect is not needed and it can be used for verts + * + * This makes the modifier faster with one less alloc. + */ + + vert_connect= MEM_mallocN(sizeof(ScrewVertConnect) * totvert, "ScrewVertConnect"); + //vert_connect= (ScrewVertConnect *) &medge_new[totvert]; /* skip the first slice of verts */ + vc= vert_connect; + + /* Copy Vert Locations */ + /* - We can do this in a later loop - only do here if no normal calc */ + if (!totedge) { + for (i=0; i < totvert; i++, mv_orig++, mv_new++) { + copy_v3_v3(mv_new->co, mv_orig->co); + normalize_v3_v3(vc->no, mv_new->co); /* no edges- this is realy a dummy normal */ + } + } + else { + /*printf("\n\n\n\n\nStarting Modifier\n");*/ + /* set edge users */ + med_new= medge_new; + mv_new= mvert_new; + + if (ltmd->ob_axis) { + /*mtx_tx is initialized early on */ + for (i=0; i < totvert; i++, mv_new++, mv_orig++, vc++) { + vc->co[0]= mv_new->co[0]= mv_orig->co[0]; + vc->co[1]= mv_new->co[1]= mv_orig->co[1]; + vc->co[2]= mv_new->co[2]= mv_orig->co[2]; + + vc->flag= 0; + vc->e[0]= vc->e[1]= NULL; + vc->v[0]= vc->v[1]= -1; + + mul_m4_v3(mtx_tx, vc->co); + /* length in 2d, dont sqrt because this is only for comparison */ + vc->dist = vc->co[other_axis_1]*vc->co[other_axis_1] + + vc->co[other_axis_2]*vc->co[other_axis_2]; + + /* printf("location %f %f %f -- %f\n", vc->co[0], vc->co[1], vc->co[2], vc->dist);*/ + } + } + else { + for (i=0; i < totvert; i++, mv_new++, mv_orig++, vc++) { + vc->co[0]= mv_new->co[0]= mv_orig->co[0]; + vc->co[1]= mv_new->co[1]= mv_orig->co[1]; + vc->co[2]= mv_new->co[2]= mv_orig->co[2]; + + vc->flag= 0; + vc->e[0]= vc->e[1]= NULL; + vc->v[0]= vc->v[1]= -1; + + /* length in 2d, dont sqrt because this is only for comparison */ + vc->dist = vc->co[other_axis_1]*vc->co[other_axis_1] + + vc->co[other_axis_2]*vc->co[other_axis_2]; + + /* printf("location %f %f %f -- %f\n", vc->co[0], vc->co[1], vc->co[2], vc->dist);*/ + } + } + + /* this loop builds connectivity info for verts */ + for (i=0; iv1]; + + if (vc->v[0]==-1) { /* unused */ + vc->v[0]= med_new->v2; + vc->e[0]= med_new; + } + else if (vc->v[1]==-1) { + vc->v[1]= med_new->v2; + vc->e[1]= med_new; + } + else { + vc->v[0]= vc->v[1]= -2; /* erro value - dont use, 3 edges on vert */ + } + + vc= &vert_connect[med_new->v2]; + + /* same as above but swap v1/2 */ + if (vc->v[0]==-1) { /* unused */ + vc->v[0]= med_new->v1; + vc->e[0]= med_new; + } + else if (vc->v[1]==-1) { + vc->v[1]= med_new->v1; + vc->e[1]= med_new; + } + else { + vc->v[0]= vc->v[1]= -2; /* erro value - dont use, 3 edges on vert */ + } + } + + /* find the first vert */ + vc= vert_connect; + for (i=0; i < totvert; i++, vc++) { + int VBEST=-1, ed_loop_closed=0; /* vert and vert new */ + int ed_loop_flip; + float fl= -1.0f; + ScrewVertIter lt_iter; + + /* Now do search for connected verts, order all edges and flip them + * so resulting faces are flipped the right way */ + vc_tot_linked= 0; /* count the number of linked verts for this loop */ + if (vc->flag==0) { + /*printf("Loop on connected vert: %i\n", i);*/ + + for(j=0; j<2; j++) { + /*printf("\tSide: %i\n", j);*/ + ScrewVertIter_INIT(lt_iter, vert_connect, i, j); + if (j==1) { + ScrewVertIter_NEXT(lt_iter); + } + while (lt_iter.v_poin) { + /*printf("\t\tVERT: %i\n", lt_iter.v);*/ + if (lt_iter.v_poin->flag) { + /*printf("\t\t\tBreaking Found end\n");*/ + //endpoints[0]= endpoints[1]= -1; + ed_loop_closed= 1; /* circle */ + break; + } + lt_iter.v_poin->flag= 1; + vc_tot_linked++; + /*printf("Testing 2 floats %f : %f\n", fl, lt_iter.v_poin->dist);*/ + if (fl <= lt_iter.v_poin->dist) { + fl= lt_iter.v_poin->dist; + VBEST= lt_iter.v; + /*printf("\t\t\tVERT BEST: %i\n", VBEST);*/ + } + ScrewVertIter_NEXT(lt_iter); + if (!lt_iter.v_poin) { + /*printf("\t\t\tFound End Also Num %i\n", j);*/ + /*endpoints[j]= lt_iter.v_other;*/ /* other is still valid */ + break; + } + } + } + + /* now we have a collection of used edges. flip their edges the right way*/ + /*if (VBEST !=-1) - */ + + /*printf("Done Looking - vc_tot_linked: %i\n", vc_tot_linked);*/ + + if (vc_tot_linked>1) { + float vf_1, vf_2, vf_best; + + vc_tmp= &vert_connect[VBEST]; + + tmpf1= vert_connect[vc_tmp->v[0]].co; + tmpf2= vert_connect[vc_tmp->v[1]].co; + + + /* edge connects on each side! */ + if ((vc_tmp->v[0] > -1) && (vc_tmp->v[1] > -1)) { + /*printf("Verts on each side (%i %i)\n", vc_tmp->v[0], vc_tmp->v[1]);*/ + /* find out which is higher */ + + vf_1= tmpf1[ltmd->axis]; + vf_2= tmpf2[ltmd->axis]; + vf_best= vc_tmp->co[ltmd->axis]; + + if (vf_1 < vf_best && vf_best < vf_2) { + ed_loop_flip= 0; + } + else if (vf_1 > vf_best && vf_best > vf_2) { + ed_loop_flip= 1; + } + else { + /* not so simple to work out which edge is higher */ + sub_v3_v3v3(tmp_vec1, tmpf1, vc_tmp->co); + sub_v3_v3v3(tmp_vec1, tmpf2, vc_tmp->co); + normalize_v3(tmp_vec1); + normalize_v3(tmp_vec2); + + if (tmp_vec1[ltmd->axis] < tmp_vec2[ltmd->axis]) { + ed_loop_flip= 1; + } + else { + ed_loop_flip= 0; + } + } + } + else if (vc_tmp->v[0] >= 0) { /*vertex only connected on 1 side */ + /*printf("Verts on ONE side (%i %i)\n", vc_tmp->v[0], vc_tmp->v[1]);*/ + if (tmpf1[ltmd->axis] < vc_tmp->co[ltmd->axis]) { /* best is above */ + ed_loop_flip= 1; + } + else { /* best is below or even... in even case we cant know whet to do. */ + ed_loop_flip= 0; + } + + }/* else { + printf("No Connected ___\n"); + }*/ + + /*printf("flip direction %i\n", ed_loop_flip);*/ + + + /* switch the flip option if set */ + if (ltmd->flag & MOD_SCREW_NORMAL_FLIP) + ed_loop_flip= !ed_loop_flip; + + if (angle < 0.0f) + ed_loop_flip= !ed_loop_flip; + + /* if its closed, we only need 1 loop */ + for(j=ed_loop_closed; j<2; j++) { + /*printf("Ordering Side J %i\n", j);*/ + + ScrewVertIter_INIT(lt_iter, vert_connect, VBEST, j); + /*printf("\n\nStarting - Loop\n");*/ + lt_iter.v_poin->flag= 1; /* so a non loop will traverse the other side */ + + + /* If this is the vert off the best vert and + * the best vert has 2 edges connected too it + * then swap the flip direction */ + if (j==1 && (vc_tmp->v[0] > -1) && (vc_tmp->v[1] > -1)) + ed_loop_flip= !ed_loop_flip; + + while (lt_iter.v_poin && lt_iter.v_poin->flag != 2) { + /*printf("\tOrdering Vert V %i\n", lt_iter.v);*/ + + lt_iter.v_poin->flag= 2; + if (lt_iter.e) { + if (lt_iter.v == lt_iter.e->v1) { + if (ed_loop_flip==0) { + /*printf("\t\t\tFlipping 0\n");*/ + SWAP(int, lt_iter.e->v1, lt_iter.e->v2); + }/* else { + printf("\t\t\tFlipping Not 0\n"); + }*/ + } + else if (lt_iter.v == lt_iter.e->v2) { + if (ed_loop_flip==1) { + /*printf("\t\t\tFlipping 1\n");*/ + SWAP(int, lt_iter.e->v1, lt_iter.e->v2); + }/* else { + printf("\t\t\tFlipping Not 1\n"); + }*/ + }/* else { + printf("\t\tIncorrect edge topology"); + }*/ + }/* else { + printf("\t\tNo Edge at this point\n"); + }*/ + ScrewVertIter_NEXT(lt_iter); + } + } + } + } + + /* *VERTEX NORMALS* + * we know the surrounding edges are ordered correctly now + * so its safe to create vertex normals. + * + * calculate vertex normals that can be propodated on lathing + * use edge connectivity work this out */ + if (vc->v[0]>=0) { + if (vc->v[1]>=0) { + /* 2 edges connedted */ + /* make 2 connecting vert locations relative to the middle vert */ + sub_v3_v3v3(tmp_vec1, mvert_new[vc->v[0]].co, mvert_new[i].co); + sub_v3_v3v3(tmp_vec2, mvert_new[vc->v[1]].co, mvert_new[i].co); + /* normalize so both edges have the same influence, no matter their length */ + normalize_v3(tmp_vec1); + normalize_v3(tmp_vec2); + + /* vc_no_tmp1 - this line is the average direction of both connecting edges + * + * Use the edge order to make the subtraction, flip the normal the right way + * edge should be there but check just in case... */ + if (vc->e && vc->e[0]->v1 == i) { + sub_v3_v3(tmp_vec1, tmp_vec2); + } + else { + sub_v3_v3v3(tmp_vec1, tmp_vec2, tmp_vec1); + } + } + else { + /* only 1 edge connected - same as above except + * dont need to average edge direction */ + if (vc->e && vc->e[0]->v2 == i) { + sub_v3_v3v3(tmp_vec1, mvert_new[i].co, mvert_new[vc->v[0]].co); + } + else { + sub_v3_v3v3(tmp_vec1, mvert_new[vc->v[0]].co, mvert_new[i].co); + } + } + + /* vc_no_tmp2 - is a line 90d from the pivot to the vec + * This is used so the resulting normal points directly away from the middle */ + cross_v3_v3v3(tmp_vec2, axis_vec, vc->co); + + /* edge average vector and right angle to the pivot make the normal */ + cross_v3_v3v3(vc->no, tmp_vec1, tmp_vec2); + + } + else { + copy_v3_v3(vc->no, vc->co); + } + + /* we wont be looping on this data again so copy normals here */ + if (angle < 0.0f) + negate_v3(vc->no); + + normalize_v3(vc->no); + normal_float_to_short_v3(mvert_new[i].no, vc->no); + + /* Done with normals */ + } + } + } + else { + + if (ltmd->flag & MOD_SCREW_NORMAL_FLIP) { + mv_orig= mvert_orig; + mv_new= mvert_new + (totvert-1); + + for (i=0; i < totvert; i++, mv_new--, mv_orig++) { + copy_v3_v3(mv_new->co, mv_orig->co); + } + } + else { + mv_orig= mvert_orig; + mv_new= mvert_new; + + for (i=0; i < totvert; i++, mv_new++, mv_orig++) { + copy_v3_v3(mv_new->co, mv_orig->co); + } + } + } + /* done with edge connectivity based normal flipping */ + + + /* Add Faces */ + for (i=1; i < steps; i++) { + float step_angle; + float no_tx[3]; + /* Rotation Matrix */ + if (close) step_angle= (angle / steps) * i; + else step_angle= (angle / (steps-1)) * i; + + if (ltmd->ob_axis) { + axis_angle_to_mat3(mat3, axis_vec, step_angle); + copy_m4_m3(mat, mat3); + } + else { + unit_m4(mat); + rotate_m4(mat, axis_char, step_angle); + copy_m3_m4(mat3, mat); + } + + if(screw_ofs) + madd_v3_v3fl(mat[3], axis_vec, screw_ofs * ((float)i / (float)(steps-1))); + + mv_new_base= mvert_new; + mv_new= &mvert_new[totvert*i]; /* advance to the next slice */ + + for (j=0; jno, no_tx); + } + + /* set location */ + copy_v3_v3(mv_new->co, mv_new_base->co); + + /* only need to set these if using non cleared memory */ + /*mv_new->mat_nr= mv_new->flag= 0;*/ + + if (ltmd->ob_axis) { + sub_v3_v3(mv_new->co, mtx_tx[3]); + + mul_m4_v3(mat, mv_new->co); + + add_v3_v3(mv_new->co, mtx_tx[3]); + } + else { + mul_m4_v3(mat, mv_new->co); + } + + /* add the new edge */ + med_new->v1= j+(i*totvert); + med_new->v2= med_new->v1 - totvert; + med_new->flag= ME_EDGEDRAW|ME_EDGERENDER; + med_new++; + } + } + + /* we can avoid if using vert alloc trick */ + if(vert_connect) { + MEM_freeN(vert_connect); + vert_connect= NULL; + } + + if (close) { + /* last loop of edges, previous loop dosnt account for the last set of edges */ + for (i=0; iv1= i; + med_new->v2= i+((steps-1)*totvert); + med_new->flag= ME_EDGEDRAW|ME_EDGERENDER; + med_new++; + } + } + + mf_new= mface_new; + med_new_firstloop= medge_new; + + for (i=0; i < totedge; i++, med_new_firstloop++) { + /* for each edge, make a cylinder of quads */ + i1= med_new_firstloop->v1; + i2= med_new_firstloop->v2; + + for (j=0; j < steps-1; j++) { + + /* new face */ + mf_new->v1= i1; + mf_new->v2= i2; + mf_new->v3= i2 + totvert; + mf_new->v4= i1 + totvert; + + if( !mf_new->v3 || !mf_new->v4 ) { + SWAP(int, mf_new->v1, mf_new->v3); + SWAP(int, mf_new->v2, mf_new->v4); + } + mf_new->flag= ME_SMOOTH; + origindex[mface_index]= ORIGINDEX_NONE; + mf_new++; + mface_index++; + + /* new vertical edge */ + if (j) { /* The first set is alredy dome */ + med_new->v1= i1; + med_new->v2= i2; + med_new->flag= med_new_firstloop->flag; + med_new->crease= med_new_firstloop->crease; + med_new++; + } + i1 += totvert; + i2 += totvert; + } + + /* close the loop*/ + if (close) { + mf_new->v1= i1; + mf_new->v2= i2; + mf_new->v3= med_new_firstloop->v2; + mf_new->v4= med_new_firstloop->v1; + + if( !mf_new->v3 || !mf_new->v4 ) { + SWAP(int, mf_new->v1, mf_new->v3); + SWAP(int, mf_new->v2, mf_new->v4); + } + mf_new->flag= ME_SMOOTH; + origindex[mface_index]= ORIGINDEX_NONE; + mf_new++; + mface_index++; + } + + /* new vertical edge */ + med_new->v1= i1; + med_new->v2= i2; + med_new->flag= med_new_firstloop->flag & ~ME_LOOSEEDGE; + med_new->crease= med_new_firstloop->crease; + med_new++; + } + + if((ltmd->flag & MOD_SCREW_NORMAL_CALC)==0) { + CDDM_calc_normals(result); + } + + dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); +} + + +static void updateDepgraph( + ModifierData *md, DagForest *forest, + struct Scene *scene, Object *ob, DagNode *obNode) +{ + ScrewModifierData *ltmd= (ScrewModifierData*) md; + + if(ltmd->ob_axis) { + DagNode *curNode= dag_get_node(forest, ltmd->ob_axis); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, + "Screw Modifier"); + } +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + ScrewModifierData *ltmd= (ScrewModifierData*) md; + + walk(userData, ob, <md->ob_axis); +} + +/* This dosnt work with material*/ +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + +static int dependsOnTime(ModifierData *md) +{ + return 0; +} + + +ModifierTypeInfo modifierType_Screw = { + /* name */ "Screw", + /* structName */ "ScrewModifierData", + /* structSize */ sizeof(ScrewModifierData), + /* type */ eModifierTypeType_Constructive, + + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c new file mode 100644 index 00000000000..f73dcc25235 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_shapekey.c @@ -0,0 +1,112 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "BLI_math.h" + +#include "DNA_key_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_key.h" +#include "BKE_particle.h" + +#include "MOD_modifiertypes.h" + +#include "MEM_guardedalloc.h" + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + KeyBlock *kb= ob_get_keyblock(ob); + float (*deformedVerts)[3]; + + if(kb && kb->totelem == numVerts) { + deformedVerts= (float(*)[3])do_ob_key(md->scene, ob); + if(deformedVerts) { + memcpy(vertexCos, deformedVerts, sizeof(float)*3*numVerts); + MEM_freeN(deformedVerts); + } + } +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + Key *key= ob_get_key(ob); + + if(key && key->type == KEY_RELATIVE) + deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0); +} + +static void deformMatricesEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], + float (*defMats)[3][3], int numVerts) +{ + Key *key= ob_get_key(ob); + KeyBlock *kb= ob_get_keyblock(ob); + float scale[3][3]; + int a; + + if(kb && kb->totelem==numVerts && kb!=key->refkey) { + scale_m3_fl(scale, kb->curval); + + for(a=0; ashrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE; + smd->shrinkOpts = MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR; + smd->keepDist = 0.0f; + + smd->target = NULL; + smd->auxTarget = NULL; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*)md; + ShrinkwrapModifierData *tsmd = (ShrinkwrapModifierData*)target; + + tsmd->target = smd->target; + tsmd->auxTarget = smd->auxTarget; + + strcpy(tsmd->vgroup_name, smd->vgroup_name); + + tsmd->keepDist = smd->keepDist; + tsmd->shrinkType= smd->shrinkType; + tsmd->shrinkOpts= smd->shrinkOpts; + tsmd->projAxis = smd->projAxis; + tsmd->subsurfLevels = smd->subsurfLevels; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(smd->vgroup_name[0]) + dataMask |= (1 << CD_MDEFORMVERT); + + if(smd->shrinkType == MOD_SHRINKWRAP_PROJECT + && smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL) + dataMask |= (1 << CD_MVERT); + + return dataMask; +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; + return !smd->target; +} + + +static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData) +{ + ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; + + walk(userData, ob, &smd->target); + walk(userData, ob, &smd->auxTarget); +} + +static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = derivedData; + CustomDataMask dataMask = requiredDataMask(ob, md); + + /* ensure we get a CDDM with applied vertex coords */ + if(dataMask) + dm= get_cddm(md->scene, ob, NULL, dm, vertexCos); + + shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = derivedData; + CustomDataMask dataMask = requiredDataMask(ob, md); + + /* ensure we get a CDDM with applied vertex coords */ + if(dataMask) + dm= get_cddm(md->scene, ob, editData, dm, vertexCos); + + shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode) +{ + ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md; + + if (smd->target) + dag_add_relation(forest, dag_get_node(forest, smd->target), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier"); + + if (smd->auxTarget) + dag_add_relation(forest, dag_get_node(forest, smd->auxTarget), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier"); +} + + +ModifierTypeInfo modifierType_Shrinkwrap = { + /* name */ "Shrinkwrap", + /* structName */ "ShrinkwrapModifierData", + /* structSize */ sizeof(ShrinkwrapModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/blenkernel/intern/simple_deform.c b/source/blender/modifiers/intern/MOD_simpledeform.c similarity index 50% rename from source/blender/blenkernel/intern/simple_deform.c rename to source/blender/modifiers/intern/MOD_simpledeform.c index f3984eb1c8b..79190c409cc 100644 --- a/source/blender/blenkernel/intern/simple_deform.c +++ b/source/blender/modifiers/intern/MOD_simpledeform.c @@ -1,49 +1,54 @@ -/** - * deform_simple.c - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) Blender Foundation. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): André Pinto - * - * ***** END GPL LICENSE BLOCK ***** - */ -#include "DNA_object_types.h" -#include "DNA_modifier_types.h" +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + #include "DNA_meshdata_types.h" -#include "BKE_simple_deform.h" -#include "BKE_DerivedMesh.h" -#include "BKE_lattice.h" -#include "BKE_deform.h" -#include "BKE_utildefines.h" #include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_lattice.h" +#include "BKE_modifier.h" +#include "BKE_deform.h" #include "BKE_shrinkwrap.h" +#include "BKE_utildefines.h" -#include -#include +#include "depsgraph_private.h" + +#include "MOD_util.h" -//Clamps/Limits the given coordinate to: limits[0] <= co[axis] <= limits[1] -//The ammount of clamp is saved on dcut + +/* Clamps/Limits the given coordinate to: limits[0] <= co[axis] <= limits[1] + * The ammount of clamp is saved on dcut */ static void axis_limit(int axis, const float limits[2], float co[3], float dcut[3]) { float val = co[axis]; @@ -87,7 +92,7 @@ static void simpleDeform_stretch(const float factor, const float dcut[3], float { co[0] += dcut[0]; co[1] += dcut[1]; - co[2] += dcut[2]; + co[2] += dcut[2]; } } @@ -133,7 +138,7 @@ static void simpleDeform_bend(const float factor, const float dcut[3], float *co { co[0] += cost*dcut[0]; co[1] += sint*dcut[0]; - co[2] += dcut[2]; + co[2] += dcut[2]; } } @@ -145,7 +150,7 @@ void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, s static const float lock_axis[2] = {0.0f, 0.0f}; int i; - int limit_axis = 0; + int limit_axis = 0; float smd_limit[2], smd_factor; SpaceTransform *transf = NULL, tmp_transf; void (*simpleDeform_callback)(const float factor, const float dcut[3], float *co) = NULL; //Mode callback @@ -164,7 +169,7 @@ void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, s if(smd->origin) { transf = &tmp_transf; - + if(smd->originOpts & MOD_SIMPLEDEFORM_ORIGIN_LOCAL) { space_transform_from_matrixs(transf, ob->obmat, smd->origin->obmat); @@ -247,10 +252,125 @@ void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, s simpleDeform_callback(smd_factor, dcut, co); //Apply deform interp_v3_v3v3(vertexCos[i], vertexCos[i], co, weight); //Use vertex weight has coef of linear interpolation - + if(transf) space_transform_invert(transf, vertexCos[i]); } } } + + +/* SimpleDeform */ +static void initData(ModifierData *md) +{ + SimpleDeformModifierData *smd = (SimpleDeformModifierData*) md; + + smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; + smd->axis = 0; + + smd->origin = NULL; + smd->factor = 0.35f; + smd->limit[0] = 0.0f; + smd->limit[1] = 1.0f; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; + SimpleDeformModifierData *tsmd = (SimpleDeformModifierData*)target; + + tsmd->mode = smd->mode; + tsmd->axis = smd->axis; + tsmd->origin= smd->origin; + tsmd->originOpts= smd->originOpts; + tsmd->factor= smd->factor; + memcpy(tsmd->limit, smd->limit, sizeof(tsmd->limit)); + strcpy(tsmd->vgroup_name, smd->vgroup_name); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(smd->vgroup_name[0]) + dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static void foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData) +{ + SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; + walk(userData, ob, &smd->origin); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode) +{ + SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md; + + if (smd->origin) + dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier"); +} + +static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm = derivedData; + CustomDataMask dataMask = requiredDataMask(ob, md); + + /* we implement requiredDataMask but thats not really usefull since + mesh_calc_modifiers pass a NULL derivedData */ + if(dataMask) + dm= get_dm(md->scene, ob, NULL, dm, NULL, 0); + + SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm = derivedData; + CustomDataMask dataMask = requiredDataMask(ob, md); + + /* we implement requiredDataMask but thats not really usefull since + mesh_calc_modifiers pass a NULL derivedData */ + if(dataMask) + dm= get_dm(md->scene, ob, editData, dm, NULL, 0); + + SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + + +ModifierTypeInfo modifierType_SimpleDeform = { + /* name */ "SimpleDeform", + /* structName */ "SimpleDeformModifierData", + /* structSize */ sizeof(SimpleDeformModifierData), + /* type */ eModifierTypeType_OnlyDeform, + + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c new file mode 100644 index 00000000000..df8372876bd --- /dev/null +++ b/source/blender/modifiers/intern/MOD_smoke.c @@ -0,0 +1,144 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "stddef.h" + +#include "MEM_guardedalloc.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_modifier.h" +#include "BKE_smoke.h" + +#include "depsgraph_private.h" + +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + SmokeModifierData *smd = (SmokeModifierData*) md; + + smd->domain = NULL; + smd->flow = NULL; + smd->coll = NULL; + smd->type = 0; + smd->time = -1; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SmokeModifierData *smd = (SmokeModifierData*)md; + SmokeModifierData *tsmd = (SmokeModifierData*)target; + + smokeModifier_copy(smd, tsmd); +} + +static void freeData(ModifierData *md) +{ + SmokeModifierData *smd = (SmokeModifierData*) md; + + smokeModifier_free (smd); +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + SmokeModifierData *smd = (SmokeModifierData*) md; + DerivedMesh *dm = dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos); + + smokeModifier_do(smd, md->scene, ob, dm, useRenderParams, isFinalCalc); + + if(dm != derivedData) + dm->release(dm); +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, + DagNode *obNode) +{ + /*SmokeModifierData *smd = (SmokeModifierData *) md; + if(smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) + { + if(smd->domain->fluid_group) + { + GroupObject *go = NULL; + + for(go = smd->domain->fluid_group->gobject.first; go; go = go->next) + { + if(go->ob) + { + SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(go->ob, eModifierType_Smoke); + + // check for initialized smoke object + if(smd2 && (smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) + { + DagNode *curNode = dag_get_node(forest, go->ob); + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow"); + } + } + } + } + } + */ +} + + +ModifierTypeInfo modifierType_Smoke = { + /* name */ "Smoke", + /* structName */ "SmokeModifierData", + /* structSize */ sizeof(SmokeModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_UsesPointCache + | eModifierTypeFlag_Single, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c new file mode 100644 index 00000000000..a42bf8abbaf --- /dev/null +++ b/source/blender/modifiers/intern/MOD_smooth.c @@ -0,0 +1,269 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_particle.h" +#include "BKE_deform.h" + +#include "MEM_guardedalloc.h" + +#include "MOD_modifiertypes.h" +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + SmoothModifierData *smd = (SmoothModifierData*) md; + + smd->fac = 0.5f; + smd->repeat = 1; + smd->flag = MOD_SMOOTH_X | MOD_SMOOTH_Y | MOD_SMOOTH_Z; + smd->defgrp_name[0] = '\0'; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SmoothModifierData *smd = (SmoothModifierData*) md; + SmoothModifierData *tsmd = (SmoothModifierData*) target; + + tsmd->fac = smd->fac; + tsmd->repeat = smd->repeat; + tsmd->flag = smd->flag; + strncpy(tsmd->defgrp_name, smd->defgrp_name, 32); +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + SmoothModifierData *smd = (SmoothModifierData*) md; + short flag; + + flag = smd->flag & (MOD_SMOOTH_X|MOD_SMOOTH_Y|MOD_SMOOTH_Z); + + /* disable if modifier is off for X, Y and Z or if factor is 0 */ + if((smd->fac == 0.0f) || flag == 0) return 1; + + return 0; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + SmoothModifierData *smd = (SmoothModifierData *)md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static void smoothModifier_do( + SmoothModifierData *smd, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) +{ + MDeformVert *dvert = NULL; + MEdge *medges = NULL; + + int i, j, numDMEdges, defgrp_index; + unsigned char *uctmp; + float *ftmp, fac, facm; + + ftmp = (float*)MEM_callocN(3*sizeof(float)*numVerts, + "smoothmodifier_f"); + if (!ftmp) return; + uctmp = (unsigned char*)MEM_callocN(sizeof(unsigned char)*numVerts, + "smoothmodifier_uc"); + if (!uctmp) { + if (ftmp) MEM_freeN(ftmp); + return; + } + + fac = smd->fac; + facm = 1 - fac; + + medges = dm->getEdgeArray(dm); + numDMEdges = dm->getNumEdges(dm); + + defgrp_index = defgroup_name_index(ob, smd->defgrp_name); + + if (defgrp_index >= 0) + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + + /* NOTICE: this can be optimized a little bit by moving the + * if (dvert) out of the loop, if needed */ + for (j = 0; j < smd->repeat; j++) { + for (i = 0; i < numDMEdges; i++) { + float fvec[3]; + float *v1, *v2; + unsigned int idx1, idx2; + + idx1 = medges[i].v1; + idx2 = medges[i].v2; + + v1 = vertexCos[idx1]; + v2 = vertexCos[idx2]; + + fvec[0] = (v1[0] + v2[0]) / 2.0; + fvec[1] = (v1[1] + v2[1]) / 2.0; + fvec[2] = (v1[2] + v2[2]) / 2.0; + + v1 = &ftmp[idx1*3]; + v2 = &ftmp[idx2*3]; + + if (uctmp[idx1] < 255) { + uctmp[idx1]++; + add_v3_v3(v1, fvec); + } + if (uctmp[idx2] < 255) { + uctmp[idx2]++; + add_v3_v3(v2, fvec); + } + } + + if (dvert) { + for (i = 0; i < numVerts; i++) { + MDeformWeight *dw = NULL; + float f, fm, facw, *fp, *v; + int k; + short flag = smd->flag; + + v = vertexCos[i]; + fp = &ftmp[i*3]; + + for (k = 0; k < dvert[i].totweight; ++k) { + if(dvert[i].dw[k].def_nr == defgrp_index) { + dw = &dvert[i].dw[k]; + break; + } + } + if (!dw) continue; + + f = fac * dw->weight; + fm = 1.0f - f; + + /* fp is the sum of uctmp[i] verts, so must be averaged */ + facw = 0.0f; + if (uctmp[i]) + facw = f / (float)uctmp[i]; + + if (flag & MOD_SMOOTH_X) + v[0] = fm * v[0] + facw * fp[0]; + if (flag & MOD_SMOOTH_Y) + v[1] = fm * v[1] + facw * fp[1]; + if (flag & MOD_SMOOTH_Z) + v[2] = fm * v[2] + facw * fp[2]; + } + } + else { /* no vertex group */ + for (i = 0; i < numVerts; i++) { + float facw, *fp, *v; + short flag = smd->flag; + + v = vertexCos[i]; + fp = &ftmp[i*3]; + + /* fp is the sum of uctmp[i] verts, so must be averaged */ + facw = 0.0f; + if (uctmp[i]) + facw = fac / (float)uctmp[i]; + + if (flag & MOD_SMOOTH_X) + v[0] = facm * v[0] + facw * fp[0]; + if (flag & MOD_SMOOTH_Y) + v[1] = facm * v[1] + facw * fp[1]; + if (flag & MOD_SMOOTH_Z) + v[2] = facm * v[2] + facw * fp[2]; + } + + } + + memset(ftmp, 0, 3*sizeof(float)*numVerts); + memset(uctmp, 0, sizeof(unsigned char)*numVerts); + } + + MEM_freeN(ftmp); + MEM_freeN(uctmp); +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0); + + smoothModifier_do((SmoothModifierData *)md, ob, dm, + vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm= get_dm(md->scene, ob, editData, derivedData, NULL, 0); + + smoothModifier_do((SmoothModifierData *)md, ob, dm, + vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + + +ModifierTypeInfo modifierType_Smooth = { + /* name */ "Smooth", + /* structName */ "SmoothModifierData", + /* structSize */ sizeof(SmoothModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ isDisabled, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c new file mode 100644 index 00000000000..8f629001e0b --- /dev/null +++ b/source/blender/modifiers/intern/MOD_softbody.c @@ -0,0 +1,77 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_scene_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_particle.h" +#include "BKE_softbody.h" + +#include "MOD_modifiertypes.h" + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts); +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + + +ModifierTypeInfo modifierType_Softbody = { + /* name */ "Softbody", + /* structName */ "SoftbodyModifierData", + /* structSize */ sizeof(SoftbodyModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_RequiresOriginalData + | eModifierTypeFlag_Single, + + /* copyData */ 0, + /* deformVerts */ deformVerts, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ 0, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c new file mode 100644 index 00000000000..9c17100b33f --- /dev/null +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -0,0 +1,670 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" +#include "BLI_edgehash.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_particle.h" +#include "BKE_deform.h" +#include "BKE_utildefines.h" + +#include "MOD_modifiertypes.h" + +#include "MEM_guardedalloc.h" + +typedef struct EdgeFaceRef { + int f1; /* init as -1 */ + int f2; +} EdgeFaceRef; + +static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3]) +{ + int i, numVerts, numEdges, numFaces; + MFace *mface, *mf; + MVert *mvert, *mv; + + float (*face_nors)[3]; + float *f_no; + int calc_face_nors= 0; + + numVerts = dm->getNumVerts(dm); + numEdges = dm->getNumEdges(dm); + numFaces = dm->getNumFaces(dm); + mface = dm->getTessFaceArray(dm); + mvert = dm->getVertArray(dm); + + /* we don't want to overwrite any referenced layers */ + + /* + Dosnt work here! + mv = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT); + cddm->mvert = mv; + */ + + face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL); + if(!face_nors) { + calc_face_nors = 1; + face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, numFaces); + } + + mv = mvert; + mf = mface; + + { + EdgeHash *edge_hash = BLI_edgehash_new(); + EdgeHashIterator *edge_iter; + int edge_ref_count = 0; + int ed_v1, ed_v2; /* use when getting the key */ + EdgeFaceRef *edge_ref_array = MEM_callocN(numEdges * sizeof(EdgeFaceRef), "Edge Connectivity"); + EdgeFaceRef *edge_ref; + float edge_normal[3]; + + /* This function adds an edge hash if its not there, and adds the face index */ +#define NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(EDV1, EDV2); \ + edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, EDV1, EDV2); \ + if (!edge_ref) { \ + edge_ref = &edge_ref_array[edge_ref_count]; edge_ref_count++; \ + edge_ref->f1=i; \ + edge_ref->f2=-1; \ + BLI_edgehash_insert(edge_hash, EDV1, EDV2, edge_ref); \ + } else { \ + edge_ref->f2=i; \ + } + + for(i = 0; i < numFaces; i++, mf++) { + f_no = face_nors[i]; + + if(mf->v4) { + if(calc_face_nors) + normal_quad_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co); + + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2); + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3); + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v4); + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v4, mf->v1); + } else { + if(calc_face_nors) + normal_tri_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co); + + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2); + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3); + NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v1); + } + } + + for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) { + /* Get the edge vert indicies, and edge value (the face indicies that use it)*/ + BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2); + edge_ref = BLI_edgehashIterator_getValue(edge_iter); + + if (edge_ref->f2 != -1) { + /* We have 2 faces using this edge, calculate the edges normal + * using the angle between the 2 faces as a weighting */ + add_v3_v3v3(edge_normal, face_nors[edge_ref->f1], face_nors[edge_ref->f2]); + normalize_v3(edge_normal); + mul_v3_fl(edge_normal, angle_normalized_v3v3(face_nors[edge_ref->f1], face_nors[edge_ref->f2])); + } else { + /* only one face attached to that edge */ + /* an edge without another attached- the weight on this is + * undefined, M_PI/2 is 90d in radians and that seems good enough */ + mul_v3_v3fl(edge_normal, face_nors[edge_ref->f1], M_PI/2); + } + add_v3_v3(temp_nors[ed_v1], edge_normal); + add_v3_v3(temp_nors[ed_v2], edge_normal); + } + BLI_edgehashIterator_free(edge_iter); + BLI_edgehash_free(edge_hash, NULL); + MEM_freeN(edge_ref_array); + } + + /* normalize vertex normals and assign */ + for(i = 0; i < numVerts; i++, mv++) { + if(normalize_v3(temp_nors[i]) == 0.0f) { + normal_short_to_float_v3(temp_nors[i], mv->no); + } + } +} + +static void initData(ModifierData *md) +{ + SolidifyModifierData *smd = (SolidifyModifierData*) md; + smd->offset = 0.01f; + smd->offset_fac = -1.0f; + smd->flag = MOD_SOLIDIFY_RIM; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SolidifyModifierData *smd = (SolidifyModifierData*) md; + SolidifyModifierData *tsmd = (SolidifyModifierData*) target; + tsmd->offset = smd->offset; + tsmd->offset_fac = smd->offset_fac; + tsmd->crease_inner = smd->crease_inner; + tsmd->crease_outer = smd->crease_outer; + tsmd->crease_rim = smd->crease_rim; + tsmd->flag = smd->flag; + strcpy(tsmd->defgrp_name, smd->defgrp_name); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + SolidifyModifierData *smd = (SolidifyModifierData*) md; + CustomDataMask dataMask = 0; + + /* ask for vertexgroups if we need them */ + if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + + +static DerivedMesh *applyModifier(ModifierData *md, + Object *ob, + DerivedMesh *dm, + int useRenderParams, + int isFinalCalc) +{ + int i; + DerivedMesh *result, *copy; + SolidifyModifierData *smd = (SolidifyModifierData*) md; + + MFace *mf, *mface, *orig_mface; + MEdge *ed, *medge, *orig_medge; + MVert *mv, *mvert, *orig_mvert; + + int numVerts = dm->getNumVerts(dm); + int numEdges = dm->getNumEdges(dm); + int numFaces = dm->getNumFaces(dm); + + /* use for edges */ + int *new_vert_arr= NULL; + int newFaces = 0; + + int *new_edge_arr= NULL; + int newEdges = 0; + + int *edge_users= NULL; + char *edge_order= NULL; + + float (*vert_nors)[3]= NULL; + + float ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset); + float ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset); + + /* weights */ + MDeformVert *dvert= NULL, *dv= NULL; + int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0); + int defgrp_index= defgroup_name_index(ob, smd->defgrp_name); + + if (defgrp_index >= 0) + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + + orig_mface = dm->getTessFaceArray(dm); + orig_medge = dm->getEdgeArray(dm); + orig_mvert = dm->getVertArray(dm); + + if(smd->flag & MOD_SOLIDIFY_RIM) { + EdgeHash *edgehash = BLI_edgehash_new(); + EdgeHashIterator *ehi; + int v1, v2; + int eidx; + + for(i=0, mv=orig_mvert; iflag &= ~ME_VERT_TMP_TAG; + } + + for(i=0, ed=orig_medge; iv1, ed->v2, SET_INT_IN_POINTER(i)); + } + +#define INVALID_UNUSED -1 +#define INVALID_PAIR -2 + +#define ADD_EDGE_USER(_v1, _v2, edge_ord) \ + eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, _v1, _v2)); \ + if(edge_users[eidx] == INVALID_UNUSED) { \ + ed= orig_medge + eidx; \ + edge_users[eidx]= (_v1 < _v2) == (ed->v1 < ed->v2) ? i:(i+numFaces); \ + edge_order[eidx]= edge_ord; \ + } else { \ + edge_users[eidx]= INVALID_PAIR; \ + } \ + + + edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges"); + edge_order= MEM_mallocN(sizeof(char) * numEdges, "solid_mod eorder"); + memset(edge_users, INVALID_UNUSED, sizeof(int) * numEdges); + + for(i=0, mf=orig_mface; iv4) { + ADD_EDGE_USER(mf->v1, mf->v2, 0); + ADD_EDGE_USER(mf->v2, mf->v3, 1); + ADD_EDGE_USER(mf->v3, mf->v4, 2); + ADD_EDGE_USER(mf->v4, mf->v1, 3); + } + else { + ADD_EDGE_USER(mf->v1, mf->v2, 0); + ADD_EDGE_USER(mf->v2, mf->v3, 1); + ADD_EDGE_USER(mf->v3, mf->v1, 2); + } + } + +#undef ADD_EDGE_USER +#undef INVALID_UNUSED +#undef INVALID_PAIR + + + new_edge_arr= MEM_callocN(sizeof(int) * numEdges, "solid_mod arr"); + + ehi= BLI_edgehashIterator_new(edgehash); + for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { + int eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); + if(edge_users[eidx] >= 0) { + BLI_edgehashIterator_getKey(ehi, &v1, &v2); + orig_mvert[v1].flag |= ME_VERT_TMP_TAG; + orig_mvert[v2].flag |= ME_VERT_TMP_TAG; + new_edge_arr[newFaces]= eidx; + newFaces++; + } + } + BLI_edgehashIterator_free(ehi); + + + + new_vert_arr= MEM_callocN(sizeof(int) * numVerts, "solid_mod new_varr"); + for(i=0, mv=orig_mvert; iflag & ME_VERT_TMP_TAG) { + new_vert_arr[newEdges] = i; + newEdges++; + + mv->flag &= ~ME_VERT_TMP_TAG; + } + } + + BLI_edgehash_free(edgehash, NULL); + } + + if(smd->flag & MOD_SOLIDIFY_NORMAL_CALC) { + vert_nors= MEM_callocN(sizeof(float) * numVerts * 3, "mod_solid_vno_hq"); + dm_calc_normal(dm, vert_nors); + } + + result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces, 0, 0); + + mface = result->getTessFaceArray(result); + medge = result->getEdgeArray(result); + mvert = result->getVertArray(result); + + DM_copy_face_data(dm, result, 0, 0, numFaces); + DM_copy_face_data(dm, result, 0, numFaces, numFaces); + + DM_copy_edge_data(dm, result, 0, 0, numEdges); + DM_copy_edge_data(dm, result, 0, numEdges, numEdges); + + DM_copy_vert_data(dm, result, 0, 0, numVerts); + DM_copy_vert_data(dm, result, 0, numVerts, numVerts); + + { + static int corner_indices[4] = {2, 1, 0, 3}; + int is_quad; + + for(i=0, mf=mface+numFaces; iv1 += numVerts; + mf->v2 += numVerts; + mf->v3 += numVerts; + if(mf->v4) + mf->v4 += numVerts; + + /* Flip face normal */ + { + is_quad = mf->v4; + SWAP(int, mf->v1, mf->v3); + DM_swap_tessface_data(result, i+numFaces, corner_indices); + test_index_face(mf, &result->faceData, numFaces, is_quad ? 4:3); + } + } + } + + for(i=0, ed=medge+numEdges; iv1 += numVerts; + ed->v2 += numVerts; + } + + /* note, copied vertex layers dont have flipped normals yet. do this after applying offset */ + if((smd->flag & MOD_SOLIDIFY_EVEN) == 0) { + /* no even thickness, very simple */ + float scalar_short; + float scalar_short_vgroup; + + + if(ofs_new != 0.0f) { + scalar_short= scalar_short_vgroup= ofs_new / 32767.0f; + mv= mvert + ((ofs_new >= ofs_orig) ? 0 : numVerts); + dv= dvert; + for(i=0; ico, mv->co, mv->no, scalar_short_vgroup); + } + } + + if(ofs_orig != 0.0f) { + scalar_short= scalar_short_vgroup= ofs_orig / 32767.0f; + mv= mvert + ((ofs_new >= ofs_orig) ? numVerts : 0); /* same as above but swapped, intentional use of 'ofs_new' */ + dv= dvert; + for(i=0; ico, mv->co, mv->no, scalar_short_vgroup); + } + } + + } + else { + /* make a face normal layer if not present */ + float (*face_nors)[3]; + int face_nors_calc= 0; + + /* same as EM_solidify() in editmesh_lib.c */ + float *vert_angles= MEM_callocN(sizeof(float) * numVerts * 2, "mod_solid_pair"); /* 2 in 1 */ + float *vert_accum= vert_angles + numVerts; + float face_angles[4]; + int i, j, vidx; + + face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL); + if(!face_nors) { + face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, dm->numFaceData); + face_nors_calc= 1; + } + + if(vert_nors==NULL) { + vert_nors= MEM_mallocN(sizeof(float) * numVerts * 3, "mod_solid_vno"); + for(i=0, mv=mvert; ino); + } + } + + for(i=0, mf=mface; iv4) + normal_quad_v3(face_nors[i], mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co); + else + normal_tri_v3(face_nors[i] , mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co); + } + + if(mf->v4) { + angle_quad_v3(face_angles, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co); + j= 3; + } + else { + angle_tri_v3(face_angles, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co); + j= 2; + } + + for(; j>=0; j--) { + vidx = *(&mf->v1 + j); + vert_accum[vidx] += face_angles[j]; + vert_angles[vidx]+= shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * face_angles[j]; + } + } + + /* vertex group support */ + if(dvert) { + dv= dvert; + if(defgrp_invert) { + for(i=0; i= ofs_orig) ? 0 : numVerts); + + for(i=0; ico, vert_nors[i], ofs_new * (vert_angles[i] / vert_accum[i])); + } + } + } + + if(ofs_orig) { + mv= mvert + ((ofs_new >= ofs_orig) ? numVerts : 0); /* same as above but swapped, intentional use of 'ofs_new' */ + + for(i=0; ico, vert_nors[i], ofs_orig * (vert_angles[i] / vert_accum[i])); + } + } + } + + MEM_freeN(vert_angles); + } + + if(vert_nors) + MEM_freeN(vert_nors); + + /* flip vertex normals for copied verts */ + mv= mvert + numVerts; + for(i=0; ino[0]= -mv->no[0]; + mv->no[1]= -mv->no[1]; + mv->no[2]= -mv->no[2]; + } + + if(smd->flag & MOD_SOLIDIFY_RIM) { + + + /* bugger, need to re-calculate the normals for the new edge faces. + * This could be done in many ways, but probably the quickest way is to calculate the average normals for side faces only. + * Then blend them with the normals of the edge verts. + * + * at the moment its easiest to allocate an entire array for every vertex, even though we only need edge verts - campbell + */ + +#define SOLIDIFY_SIDE_NORMALS + +#ifdef SOLIDIFY_SIDE_NORMALS + /* annoying to allocate these since we only need the edge verts, */ + float (*edge_vert_nos)[3]= MEM_callocN(sizeof(float) * numVerts * 3, "solidify_edge_nos"); + float nor[3]; +#endif + /* maximum value -1, so we have room to increase */ + const short mat_nr_shift= (smd->flag & MOD_SOLIDIFY_RIM_MATERIAL) ? ob->totcol-1 : -1; + + const unsigned char crease_rim= smd->crease_rim * 255.0f; + const unsigned char crease_outer= smd->crease_outer * 255.0f; + const unsigned char crease_inner= smd->crease_inner * 255.0f; + + const int edge_indices[4][4] = { + {1, 0, 0, 1}, + {2, 1, 1, 2}, + {3, 2, 2, 3}, + {0, 3, 3, 0}}; + + /* add faces & edges */ + ed= medge + (numEdges * 2); + for(i=0; iv1= new_vert_arr[i]; + ed->v2= new_vert_arr[i] + numVerts; + ed->flag |= ME_EDGEDRAW; + + if(crease_rim) + ed->crease= crease_rim; + } + + /* faces */ + mf= mface + (numFaces * 2); + for(i=0; i= numFaces) { + fidx -= numFaces; + flip= 1; + } + else { + flip= 0; + } + + ed= medge + eidx; + + /* copy most of the face settings */ + DM_copy_face_data(dm, result, fidx, (numFaces * 2) + i, 1); + + if(flip) { + DM_swap_tessface_data(result, (numFaces * 2) + i, edge_indices[edge_order[eidx]]); + + mf->v1= ed->v1; + mf->v2= ed->v2; + mf->v3= ed->v2 + numVerts; + mf->v4= ed->v1 + numVerts; + } + else { + DM_swap_tessface_data(result, (numFaces * 2) + i, edge_indices[edge_order[eidx]]); + + mf->v1= ed->v2; + mf->v2= ed->v1; + mf->v3= ed->v1 + numVerts; + mf->v4= ed->v2 + numVerts; + } + + /* use the next material index if option enabled */ + if(mf->mat_nr < mat_nr_shift) + mf->mat_nr++; + + if(crease_outer) + ed->crease= crease_outer; + + if(crease_inner) { + medge[numEdges + eidx].crease= crease_inner; + } + +#ifdef SOLIDIFY_SIDE_NORMALS + normal_quad_v3(nor, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co); + + add_v3_v3(edge_vert_nos[ed->v1], nor); + add_v3_v3(edge_vert_nos[ed->v2], nor); +#endif + } + +#ifdef SOLIDIFY_SIDE_NORMALS + ed= medge + (numEdges * 2); + for(i=0; iv1]); + + for(j=0; j<2; j++) { /* loop over both verts of the edge */ + nor_short= mvert[*(&ed->v1 + j)].no; + normal_short_to_float_v3(nor, nor_short); + add_v3_v3(nor, nor_cpy); + normalize_v3(nor); + normal_float_to_short_v3(nor_short, nor); + } + } + + MEM_freeN(edge_vert_nos); +#endif + + MEM_freeN(new_vert_arr); + MEM_freeN(new_edge_arr); + MEM_freeN(edge_users); + MEM_freeN(edge_order); + } + + copy = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/ + result->needsFree = 1; + result->release(result); + + return copy; +} + +#undef SOLIDIFY_SIDE_NORMALS + +static DerivedMesh *applyModifierEM(ModifierData *md, + Object *ob, + struct EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_Solidify = { + /* name */ "Solidify", + /* structName */ "SolidifyModifierData", + /* structSize */ sizeof(SolidifyModifierData), + /* type */ eModifierTypeType_Constructive, + + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c new file mode 100644 index 00000000000..e84d8e24faa --- /dev/null +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -0,0 +1,144 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "stddef.h" + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_scene.h" +#include "BKE_subsurf.h" + +#include "MOD_modifiertypes.h" + +#include "CCGSubSurf.h" + +static void initData(ModifierData *md) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + + smd->levels = 1; + smd->renderLevels = 2; + smd->flags |= eSubsurfModifierFlag_SubsurfUv; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + SubsurfModifierData *tsmd = (SubsurfModifierData*) target; + + tsmd->flags = smd->flags; + tsmd->levels = smd->levels; + tsmd->renderLevels = smd->renderLevels; + tsmd->subdivType = smd->subdivType; +} + +static void freeData(ModifierData *md) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + + if(smd->mCache) { + ccgSubSurf_free(smd->mCache); + } + if(smd->emCache) { + ccgSubSurf_free(smd->emCache); + } +} + +static int isDisabled(ModifierData *md, int useRenderParams) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + int levels= (useRenderParams)? smd->renderLevels: smd->levels; + + return get_render_subsurf_level(&md->scene->r, levels) == 0; +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + DerivedMesh *result; + + result = subsurf_make_derived_from_derived(derivedData, smd, + useRenderParams, NULL, isFinalCalc, 0); + + if(useRenderParams || !isFinalCalc) { + DerivedMesh *cddm= CDDM_copy(result, 0); + result->release(result); + result= cddm; + } + + return result; +} + +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData) +{ + SubsurfModifierData *smd = (SubsurfModifierData*) md; + DerivedMesh *result; + + result = subsurf_make_derived_from_derived(derivedData, smd, 0, + NULL, 0, 1); + + return result; +} + + +ModifierTypeInfo modifierType_Subsurf = { + /* name */ "Subsurf", + /* structName */ "SubsurfModifierData", + /* structSize */ sizeof(SubsurfModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode + | eModifierTypeFlag_AcceptsCVs, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ freeData, + /* isDisabled */ isDisabled, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c new file mode 100644 index 00000000000..a55d6bbd141 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_surface.c @@ -0,0 +1,183 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_meshdata_types.h" + +#include "BLI_math.h" + +#include "BKE_cdderivedmesh.h" + +#include "MOD_modifiertypes.h" +#include "MOD_util.h" + +#include "MEM_guardedalloc.h" + + +static void initData(ModifierData *md) +{ + SurfaceModifierData *surmd = (SurfaceModifierData*) md; + + surmd->bvhtree = NULL; +} + +static void freeData(ModifierData *md) +{ + SurfaceModifierData *surmd = (SurfaceModifierData*) md; + + if (surmd) + { + if(surmd->bvhtree) { + free_bvhtree_from_mesh(surmd->bvhtree); + MEM_freeN(surmd->bvhtree); + } + + if(surmd->dm) + surmd->dm->release(surmd->dm); + + if(surmd->x) + MEM_freeN(surmd->x); + + if(surmd->v) + MEM_freeN(surmd->v); + + surmd->bvhtree = NULL; + surmd->dm = NULL; + } +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + SurfaceModifierData *surmd = (SurfaceModifierData*) md; + unsigned int numverts = 0, i = 0; + + if(surmd->dm) + surmd->dm->release(surmd->dm); + + /* if possible use/create DerivedMesh */ + if(derivedData) surmd->dm = CDDM_copy(derivedData, 0); + else surmd->dm = get_dm(md->scene, ob, NULL, NULL, NULL, 0); + + if(!ob->pd) + { + printf("SurfaceModifier deformVerts: Should not happen!\n"); + return; + } + + if(surmd->dm) + { + int init = 0; + float *vec; + MVert *x, *v; + + CDDM_apply_vert_coords(surmd->dm, vertexCos); + CDDM_calc_normals(surmd->dm); + + numverts = surmd->dm->getNumVerts ( surmd->dm ); + + if(numverts != surmd->numverts || surmd->x == NULL || surmd->v == NULL || md->scene->r.cfra != surmd->cfra+1) { + if(surmd->x) { + MEM_freeN(surmd->x); + surmd->x = NULL; + } + if(surmd->v) { + MEM_freeN(surmd->v); + surmd->v = NULL; + } + + surmd->x = MEM_callocN(numverts * sizeof(MVert), "MVert"); + surmd->v = MEM_callocN(numverts * sizeof(MVert), "MVert"); + + surmd->numverts = numverts; + + init = 1; + } + + /* convert to global coordinates and calculate velocity */ + for(i = 0, x = surmd->x, v = surmd->v; idm, i)->co; + mul_m4_v3(ob->obmat, vec); + + if(init) + v->co[0] = v->co[1] = v->co[2] = 0.0f; + else + sub_v3_v3v3(v->co, vec, x->co); + + copy_v3_v3(x->co, vec); + } + + surmd->cfra = md->scene->r.cfra; + + if(surmd->bvhtree) + free_bvhtree_from_mesh(surmd->bvhtree); + else + surmd->bvhtree = MEM_callocN(sizeof(BVHTreeFromMesh), "BVHTreeFromMesh"); + + if(surmd->dm->getNumTessFaces(surmd->dm)) + bvhtree_from_mesh_faces(surmd->bvhtree, surmd->dm, 0.0, 2, 6); + else + bvhtree_from_mesh_edges(surmd->bvhtree, surmd->dm, 0.0, 2, 6); + } +} + + +ModifierTypeInfo modifierType_Surface = { + /* name */ "Surface", + /* structName */ "SurfaceModifierData", + /* structSize */ sizeof(SurfaceModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_NoUserAdd, + + /* copyData */ 0, + /* deformVerts */ deformVerts, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c new file mode 100644 index 00000000000..5853b7a51ee --- /dev/null +++ b/source/blender/modifiers/intern/MOD_util.c @@ -0,0 +1,186 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful; + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation; + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Ben Batt + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "string.h" + +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "DNA_curve_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_displist.h" +#include "BKE_utildefines.h" +#include "BKE_modifier.h" + +#include "MOD_util.h" +#include "MOD_modifiertypes.h" + +#include "MEM_guardedalloc.h" + +#include "RE_shader_ext.h" + +void get_texture_value(Tex *texture, float *tex_co, TexResult *texres) +{ + int result_type; + + result_type = multitex_ext(texture, tex_co, NULL, NULL, 0, texres); + + /* if the texture gave an RGB value, we assume it didn't give a valid + * intensity, so calculate one (formula from do_material_tex). + * if the texture didn't give an RGB value, copy the intensity across + */ + if(result_type & TEX_RGB) + texres->tin = (0.35f * texres->tr + 0.45f * texres->tg + + 0.2f * texres->tb); + else + texres->tr = texres->tg = texres->tb = texres->tin; +} + +void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3]) +{ + while((md=md->next) && md->type==eModifierType_Armature) { + ArmatureModifierData *amd = (ArmatureModifierData*) md; + if(amd->multi && amd->prevCos==NULL) + amd->prevCos= MEM_dupallocN(vertexCos); + else + break; + } + /* lattice/mesh modifier too */ +} + +void validate_layer_name(const CustomData *data, int type, char *name, char *outname) +{ + int index = -1; + + /* if a layer name was given, try to find that layer */ + if(name[0]) + index = CustomData_get_named_layer_index(data, CD_MTFACE, name); + + if(index < 0) { + /* either no layer was specified, or the layer we want has been + * deleted, so assign the active layer to name + */ + index = CustomData_get_active_layer_index(data, CD_MTFACE); + strcpy(outname, data->layers[index].name); + } + else + strcpy(outname, name); +} + +/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */ +DerivedMesh *get_cddm(struct Scene *scene, Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3]) +{ + if(dm && dm->type == DM_TYPE_CDDM) + return dm; + + if(!dm) { + dm= get_dm(scene, ob, em, dm, vertexCos, 0); + } + else { + dm= CDDM_copy(dm, 0); + CDDM_apply_vert_coords(dm, vertexCos); + } + + if(dm) + CDDM_calc_normals(dm); + + return dm; +} + +/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */ +DerivedMesh *get_dm(struct Scene *scene, Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco) +{ + if(dm) + return dm; + + if(ob->type==OB_MESH) { + if(em) dm= CDDM_from_editmesh(em, ob->data); + else dm = CDDM_from_mesh((struct Mesh *)(ob->data), ob); + + if(vertexCos) { + CDDM_apply_vert_coords(dm, vertexCos); + //CDDM_calc_normals(dm); + } + + if(orco) + DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob)); + } + else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) { + dm= CDDM_from_curve(ob); + } + + return dm; +} + +/* only called by BKE_modifier.h/modifier.c */ +void modifier_type_init(ModifierTypeInfo *types[], ModifierType type) +{ + memset(types, 0, sizeof(types)); +#define INIT_TYPE(typeName) (types[eModifierType_##typeName] = &modifierType_##typeName) + INIT_TYPE(None); + INIT_TYPE(Curve); + INIT_TYPE(Lattice); + INIT_TYPE(Subsurf); + INIT_TYPE(Build); + INIT_TYPE(Array); + INIT_TYPE(Mirror); + INIT_TYPE(EdgeSplit); + INIT_TYPE(Bevel); + INIT_TYPE(Displace); + INIT_TYPE(UVProject); + INIT_TYPE(Decimate); + INIT_TYPE(Smooth); + INIT_TYPE(Cast); + INIT_TYPE(Wave); + INIT_TYPE(Armature); + INIT_TYPE(Hook); + INIT_TYPE(Softbody); + INIT_TYPE(Cloth); + INIT_TYPE(Collision); + INIT_TYPE(Boolean); + INIT_TYPE(MeshDeform); + INIT_TYPE(ParticleSystem); + INIT_TYPE(ParticleInstance); + INIT_TYPE(Explode); + INIT_TYPE(Shrinkwrap); + INIT_TYPE(Fluidsim); + INIT_TYPE(Mask); + INIT_TYPE(SimpleDeform); + INIT_TYPE(Multires); + INIT_TYPE(Surface); + INIT_TYPE(Smoke); + INIT_TYPE(ShapeKey); + INIT_TYPE(Solidify); + INIT_TYPE(Screw); +#undef INIT_TYPE +} diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h new file mode 100644 index 00000000000..9592a3ce123 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_util.h @@ -0,0 +1,48 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful; + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation; + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): Ben Batt + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef MOD_UTIL_H +#define MOD_UTIL_H + +struct Tex; +struct TexResult; +struct CustomData; +struct DerivedMesh; +struct Object; +struct Scene; +struct EditMesh; +struct ModifierData; + +void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult *texres); +void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]); +void validate_layer_name(const struct CustomData *data, int type, char *name, char *outname); +struct DerivedMesh *get_cddm(struct Scene *scene, struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]); +struct DerivedMesh *get_dm(struct Scene *scene, struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco); + +void modifier_type_init(struct ModifierTypeInfo *types[], ModifierType type); + +#endif /* MOD_UTIL_H */ diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c new file mode 100644 index 00000000000..5d3c428c12d --- /dev/null +++ b/source/blender/modifiers/intern/MOD_uvproject.c @@ -0,0 +1,422 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* UV Project modifier: Generates UVs projected from an object */ + +#include "DNA_meshdata_types.h" +#include "DNA_camera_types.h" + +#include "BLI_math.h" +#include "BLI_uvproject.h" + +#include "BKE_DerivedMesh.h" + +#include "MOD_modifiertypes.h" +#include "MOD_util.h" + +#include "MEM_guardedalloc.h" +#include "depsgraph_private.h" + +static void initData(ModifierData *md) +{ + UVProjectModifierData *umd = (UVProjectModifierData*) md; + int i; + + for(i = 0; i < MOD_UVPROJECT_MAXPROJECTORS; ++i) + umd->projectors[i] = NULL; + umd->image = NULL; + umd->flags = 0; + umd->num_projectors = 1; + umd->aspectx = umd->aspecty = 1.0f; + umd->scalex = umd->scaley = 1.0f; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + UVProjectModifierData *umd = (UVProjectModifierData*) md; + UVProjectModifierData *tumd = (UVProjectModifierData*) target; + int i; + + for(i = 0; i < MOD_UVPROJECT_MAXPROJECTORS; ++i) + tumd->projectors[i] = umd->projectors[i]; + tumd->image = umd->image; + tumd->flags = umd->flags; + tumd->num_projectors = umd->num_projectors; + tumd->aspectx = umd->aspectx; + tumd->aspecty = umd->aspecty; + tumd->scalex = umd->scalex; + tumd->scaley = umd->scaley; +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + CustomDataMask dataMask = 0; + + /* ask for UV coordinates */ + dataMask |= (1 << CD_MTFACE); + + return dataMask; +} + +static void foreachObjectLink(ModifierData *md, Object *ob, + ObjectWalkFunc walk, void *userData) +{ + UVProjectModifierData *umd = (UVProjectModifierData*) md; + int i; + + for(i = 0; i < MOD_UVPROJECT_MAXPROJECTORS; ++i) + walk(userData, ob, &umd->projectors[i]); +} + +static void foreachIDLink(ModifierData *md, Object *ob, + IDWalkFunc walk, void *userData) +{ + UVProjectModifierData *umd = (UVProjectModifierData*) md; + + walk(userData, ob, (ID **)&umd->image); + + foreachObjectLink(md, ob, (ObjectWalkFunc)walk, + userData); +} + +static void updateDepgraph(ModifierData *md, + DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode) +{ + UVProjectModifierData *umd = (UVProjectModifierData*) md; + int i; + + for(i = 0; i < umd->num_projectors; ++i) { + if(umd->projectors[i]) { + DagNode *curNode = dag_get_node(forest, umd->projectors[i]); + + dag_add_relation(forest, curNode, obNode, + DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "UV Project Modifier"); + } + } +} + +typedef struct Projector { + Object *ob; /* object this projector is derived from */ + float projmat[4][4]; /* projection matrix */ + float normal[3]; /* projector normal in world space */ + void *uci; /* optional uv-project info (panorama projection) */ +} Projector; + +static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd, + Object *ob, DerivedMesh *dm) +{ + float (*coords)[3], (*co)[3]; + MTFace *tface; + int i, numVerts, numFaces; + Image *image = umd->image; + MFace *mface, *mf; + int override_image = ((umd->flags & MOD_UVPROJECT_OVERRIDEIMAGE) != 0); + Projector projectors[MOD_UVPROJECT_MAXPROJECTORS]; + int num_projectors = 0; + float aspect; + char uvname[32]; + float aspx= umd->aspectx ? umd->aspectx : 1.0f; + float aspy= umd->aspecty ? umd->aspecty : 1.0f; + float scax= umd->scalex ? umd->scalex : 1.0f; + float scay= umd->scaley ? umd->scaley : 1.0f; + int free_uci= 0; + + aspect = aspx / aspy; + + for(i = 0; i < umd->num_projectors; ++i) + if(umd->projectors[i]) + projectors[num_projectors++].ob = umd->projectors[i]; + + if(num_projectors == 0) return dm; + + /* make sure there are UV layers available */ + + if(!CustomData_has_layer(&dm->faceData, CD_MTFACE)) return dm; + + /* make sure we're using an existing layer */ + validate_layer_name(&dm->faceData, CD_MTFACE, umd->uvlayer_name, uvname); + + /* calculate a projection matrix and normal for each projector */ + for(i = 0; i < num_projectors; ++i) { + float tmpmat[4][4]; + float offsetmat[4][4]; + Camera *cam = NULL; + /* calculate projection matrix */ + invert_m4_m4(projectors[i].projmat, projectors[i].ob->obmat); + + projectors[i].uci= NULL; + + if(projectors[i].ob->type == OB_CAMERA) { + + cam = (Camera *)projectors[i].ob->data; + if(cam->flag & CAM_PANORAMA) { + projectors[i].uci= project_camera_info(projectors[i].ob, NULL, aspx, aspy); + project_camera_info_scale(projectors[i].uci, scax, scay); + free_uci= 1; + } + else { + float scale= (cam->type == CAM_PERSP) ? cam->clipsta * 32.0 / cam->lens : cam->ortho_scale; + float xmax, xmin, ymax, ymin; + + if(aspect > 1.0f) { + xmax = 0.5f * scale; + ymax = xmax / aspect; + } else { + ymax = 0.5f * scale; + xmax = ymax * aspect; + } + xmin = -xmax; + ymin = -ymax; + + /* scale the matrix */ + xmin *= scax; + xmax *= scax; + ymin *= scay; + ymax *= scay; + + if(cam->type == CAM_PERSP) { + float perspmat[4][4]; + perspective_m4( perspmat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend); + mul_m4_m4m4(tmpmat, projectors[i].projmat, perspmat); + } else { /* if(cam->type == CAM_ORTHO) */ + float orthomat[4][4]; + orthographic_m4( orthomat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend); + mul_m4_m4m4(tmpmat, projectors[i].projmat, orthomat); + } + } + } else { + copy_m4_m4(tmpmat, projectors[i].projmat); + } + + unit_m4(offsetmat); + mul_mat3_m4_fl(offsetmat, 0.5); + offsetmat[3][0] = offsetmat[3][1] = offsetmat[3][2] = 0.5; + + if (cam) { + if (aspx == aspy) { + offsetmat[3][0] -= cam->shiftx; + offsetmat[3][1] -= cam->shifty; + } else if (aspx < aspy) { + offsetmat[3][0] -=(cam->shiftx * aspy/aspx); + offsetmat[3][1] -= cam->shifty; + } else { + offsetmat[3][0] -= cam->shiftx; + offsetmat[3][1] -=(cam->shifty * aspx/aspy); + } + } + + mul_m4_m4m4(projectors[i].projmat, tmpmat, offsetmat); + + /* calculate worldspace projector normal (for best projector test) */ + projectors[i].normal[0] = 0; + projectors[i].normal[1] = 0; + projectors[i].normal[2] = 1; + mul_mat3_m4_v3(projectors[i].ob->obmat, projectors[i].normal); + } + + /* make sure we are not modifying the original UV layer */ + tface = CustomData_duplicate_referenced_layer_named(&dm->faceData, + CD_MTFACE, uvname); + + + numVerts = dm->getNumVerts(dm); + + coords = MEM_callocN(sizeof(*coords) * numVerts, + "uvprojectModifier_do coords"); + dm->getVertCos(dm, coords); + + /* convert coords to world space */ + for(i = 0, co = coords; i < numVerts; ++i, ++co) + mul_m4_v3(ob->obmat, *co); + + /* if only one projector, project coords to UVs */ + if(num_projectors == 1 && projectors[0].uci==NULL) + for(i = 0, co = coords; i < numVerts; ++i, ++co) + mul_project_m4_v4(projectors[0].projmat, *co); + + mface = dm->getTessFaceArray(dm); + numFaces = dm->getNumTessFaces(dm); + + /* apply coords as UVs, and apply image if tfaces are new */ + for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tface) { + if(override_image || !image || tface->tpage == image) { + if(num_projectors == 1) { + if(projectors[0].uci) { + project_from_camera(tface->uv[0], coords[mf->v1], projectors[0].uci); + project_from_camera(tface->uv[1], coords[mf->v2], projectors[0].uci); + project_from_camera(tface->uv[2], coords[mf->v3], projectors[0].uci); + if(mf->v3) + project_from_camera(tface->uv[3], coords[mf->v4], projectors[0].uci); + } + else { + /* apply transformed coords as UVs */ + tface->uv[0][0] = coords[mf->v1][0]; + tface->uv[0][1] = coords[mf->v1][1]; + tface->uv[1][0] = coords[mf->v2][0]; + tface->uv[1][1] = coords[mf->v2][1]; + tface->uv[2][0] = coords[mf->v3][0]; + tface->uv[2][1] = coords[mf->v3][1]; + if(mf->v4) { + tface->uv[3][0] = coords[mf->v4][0]; + tface->uv[3][1] = coords[mf->v4][1]; + } + } + } else { + /* multiple projectors, select the closest to face normal + * direction + */ + float co1[3], co2[3], co3[3], co4[3]; + float face_no[3]; + int j; + Projector *best_projector; + float best_dot; + + copy_v3_v3(co1, coords[mf->v1]); + copy_v3_v3(co2, coords[mf->v2]); + copy_v3_v3(co3, coords[mf->v3]); + + /* get the untransformed face normal */ + if(mf->v4) { + copy_v3_v3(co4, coords[mf->v4]); + normal_quad_v3(face_no, co1, co2, co3, co4); + } else { + normal_tri_v3(face_no, co1, co2, co3); + } + + /* find the projector which the face points at most directly + * (projector normal with largest dot product is best) + */ + best_dot = dot_v3v3(projectors[0].normal, face_no); + best_projector = &projectors[0]; + + for(j = 1; j < num_projectors; ++j) { + float tmp_dot = dot_v3v3(projectors[j].normal, + face_no); + if(tmp_dot > best_dot) { + best_dot = tmp_dot; + best_projector = &projectors[j]; + } + } + + if(best_projector->uci) { + project_from_camera(tface->uv[0], coords[mf->v1], best_projector->uci); + project_from_camera(tface->uv[1], coords[mf->v2], best_projector->uci); + project_from_camera(tface->uv[2], coords[mf->v3], best_projector->uci); + if(mf->v3) + project_from_camera(tface->uv[3], coords[mf->v4], best_projector->uci); + } + else { + mul_project_m4_v4(best_projector->projmat, co1); + mul_project_m4_v4(best_projector->projmat, co2); + mul_project_m4_v4(best_projector->projmat, co3); + if(mf->v4) + mul_project_m4_v4(best_projector->projmat, co4); + + /* apply transformed coords as UVs */ + tface->uv[0][0] = co1[0]; + tface->uv[0][1] = co1[1]; + tface->uv[1][0] = co2[0]; + tface->uv[1][1] = co2[1]; + tface->uv[2][0] = co3[0]; + tface->uv[2][1] = co3[1]; + if(mf->v4) { + tface->uv[3][0] = co4[0]; + tface->uv[3][1] = co4[1]; + } + } + } + } + + if(override_image) { + tface->mode = TF_TEX; + tface->tpage = image; + } + } + + MEM_freeN(coords); + + if(free_uci) { + int j; + for(j = 0; j < num_projectors; ++j) { + if(projectors[j].uci) { + MEM_freeN(projectors[j].uci); + } + } + } + return dm; +} + +static DerivedMesh *applyModifier( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *result; + UVProjectModifierData *umd = (UVProjectModifierData*) md; + + result = uvprojectModifier_do(umd, ob, derivedData); + + return result; +} + +static DerivedMesh *applyModifierEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_UVProject = { + /* name */ "UVProject", + /* structName */ "UVProjectModifierData", + /* structSize */ sizeof(UVProjectModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_SupportsMapping + | eModifierTypeFlag_SupportsEditmode + | eModifierTypeFlag_EnableInEditmode, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ 0, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ foreachIDLink, +}; diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c new file mode 100644 index 00000000000..27e1e071e60 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_wave.c @@ -0,0 +1,459 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): Daniel Dunbar +* Ton Roosendaal, +* Ben Batt, +* Brecht Van Lommel, +* Campbell Barton +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "BLI_math.h" + +#include "DNA_meshdata_types.h" +#include "DNA_scene_types.h" + +#include "BKE_DerivedMesh.h" +#include "BKE_object.h" +#include "BKE_deform.h" +#include "BKE_scene.h" + +#include "depsgraph_private.h" + +#include "MEM_guardedalloc.h" +#include "RE_shader_ext.h" + +#include "MOD_modifiertypes.h" +#include "MOD_util.h" + +static void initData(ModifierData *md) +{ + WaveModifierData *wmd = (WaveModifierData*) md; // whadya know, moved here from Iraq + + wmd->flag |= (MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL + | MOD_WAVE_NORM_X | MOD_WAVE_NORM_Y | MOD_WAVE_NORM_Z); + + wmd->objectcenter = NULL; + wmd->texture = NULL; + wmd->map_object = NULL; + wmd->height= 0.5f; + wmd->width= 1.5f; + wmd->speed= 0.25f; + wmd->narrow= 1.5f; + wmd->lifetime= 0.0f; + wmd->damp= 10.0f; + wmd->falloff= 0.0f; + wmd->texmapping = MOD_WAV_MAP_LOCAL; + wmd->defgrp_name[0] = 0; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + WaveModifierData *twmd = (WaveModifierData*) target; + + twmd->damp = wmd->damp; + twmd->flag = wmd->flag; + twmd->height = wmd->height; + twmd->lifetime = wmd->lifetime; + twmd->narrow = wmd->narrow; + twmd->speed = wmd->speed; + twmd->startx = wmd->startx; + twmd->starty = wmd->starty; + twmd->timeoffs = wmd->timeoffs; + twmd->width = wmd->width; + twmd->falloff = wmd->falloff; + twmd->objectcenter = wmd->objectcenter; + twmd->texture = wmd->texture; + twmd->map_object = wmd->map_object; + twmd->texmapping = wmd->texmapping; + strncpy(twmd->defgrp_name, wmd->defgrp_name, 32); +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void foreachObjectLink( + ModifierData *md, Object *ob, + ObjectWalkFunc walk, void *userData) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + + walk(userData, ob, &wmd->objectcenter); + walk(userData, ob, &wmd->map_object); +} + +static void foreachIDLink(ModifierData *md, Object *ob, + IDWalkFunc walk, void *userData) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + + walk(userData, ob, (ID **)&wmd->texture); + + foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); +} + +static void updateDepgraph( + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, + DagNode *obNode) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + + if(wmd->objectcenter) { + DagNode *curNode = dag_get_node(forest, wmd->objectcenter); + + dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, + "Wave Modifier"); + } + + if(wmd->map_object) { + DagNode *curNode = dag_get_node(forest, wmd->map_object); + + dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, + "Wave Modifer"); + } +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + WaveModifierData *wmd = (WaveModifierData *)md; + CustomDataMask dataMask = 0; + + + /* ask for UV coordinates if we need them */ + if(wmd->texture && wmd->texmapping == MOD_WAV_MAP_UV) + dataMask |= (1 << CD_MTFACE); + + /* ask for vertexgroups if we need them */ + if(wmd->defgrp_name[0]) + dataMask |= (1 << CD_MDEFORMVERT); + + return dataMask; +} + +static void wavemod_get_texture_coords(WaveModifierData *wmd, Object *ob, + DerivedMesh *dm, + float (*co)[3], float (*texco)[3], + int numVerts) +{ + int i; + int texmapping = wmd->texmapping; + + if(texmapping == MOD_WAV_MAP_OBJECT) { + if(wmd->map_object) + invert_m4_m4(wmd->map_object->imat, wmd->map_object->obmat); + else /* if there is no map object, default to local */ + texmapping = MOD_WAV_MAP_LOCAL; + } + + /* UVs need special handling, since they come from faces */ + if(texmapping == MOD_WAV_MAP_UV) { + if(CustomData_has_layer(&dm->faceData, CD_MTFACE)) { + MFace *mface = dm->getTessFaceArray(dm); + MFace *mf; + char *done = MEM_callocN(sizeof(*done) * numVerts, + "get_texture_coords done"); + int numFaces = dm->getNumTessFaces(dm); + char uvname[32]; + MTFace *tf; + + validate_layer_name(&dm->faceData, CD_MTFACE, wmd->uvlayer_name, uvname); + tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname); + + /* verts are given the UV from the first face that uses them */ + for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tf) { + if(!done[mf->v1]) { + texco[mf->v1][0] = tf->uv[0][0]; + texco[mf->v1][1] = tf->uv[0][1]; + texco[mf->v1][2] = 0; + done[mf->v1] = 1; + } + if(!done[mf->v2]) { + texco[mf->v2][0] = tf->uv[1][0]; + texco[mf->v2][1] = tf->uv[1][1]; + texco[mf->v2][2] = 0; + done[mf->v2] = 1; + } + if(!done[mf->v3]) { + texco[mf->v3][0] = tf->uv[2][0]; + texco[mf->v3][1] = tf->uv[2][1]; + texco[mf->v3][2] = 0; + done[mf->v3] = 1; + } + if(!done[mf->v4]) { + texco[mf->v4][0] = tf->uv[3][0]; + texco[mf->v4][1] = tf->uv[3][1]; + texco[mf->v4][2] = 0; + done[mf->v4] = 1; + } + } + + /* remap UVs from [0, 1] to [-1, 1] */ + for(i = 0; i < numVerts; ++i) { + texco[i][0] = texco[i][0] * 2 - 1; + texco[i][1] = texco[i][1] * 2 - 1; + } + + MEM_freeN(done); + return; + } else /* if there are no UVs, default to local */ + texmapping = MOD_WAV_MAP_LOCAL; + } + + for(i = 0; i < numVerts; ++i, ++co, ++texco) { + switch(texmapping) { + case MOD_WAV_MAP_LOCAL: + copy_v3_v3(*texco, *co); + break; + case MOD_WAV_MAP_GLOBAL: + mul_v3_m4v3(*texco, ob->obmat, *co); + break; + case MOD_WAV_MAP_OBJECT: + mul_v3_m4v3(*texco, ob->obmat, *co); + mul_m4_v3(wmd->map_object->imat, *texco); + break; + } + } +} + +static void waveModifier_do(WaveModifierData *md, + Scene *scene, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + MVert *mvert = NULL; + MDeformVert *dvert = NULL; + int defgrp_index; + float ctime = BKE_curframe(scene); + float minfac = + (float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow)); + float lifefac = wmd->height; + float (*tex_co)[3] = NULL; + + if(wmd->flag & MOD_WAVE_NORM && ob->type == OB_MESH) + mvert = dm->getVertArray(dm); + + if(wmd->objectcenter){ + float mat[4][4]; + /* get the control object's location in local coordinates */ + invert_m4_m4(ob->imat, ob->obmat); + mul_m4_m4m4(mat, wmd->objectcenter->obmat, ob->imat); + + wmd->startx = mat[3][0]; + wmd->starty = mat[3][1]; + } + + /* get the index of the deform group */ + defgrp_index = defgroup_name_index(ob, wmd->defgrp_name); + + if(defgrp_index >= 0){ + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + } + + if(wmd->damp == 0) wmd->damp = 10.0f; + + if(wmd->lifetime != 0.0) { + float x = ctime - wmd->timeoffs; + + if(x > wmd->lifetime) { + lifefac = x - wmd->lifetime; + + if(lifefac > wmd->damp) lifefac = 0.0; + else lifefac = + (float)(wmd->height * (1.0 - sqrt(lifefac / wmd->damp))); + } + } + + if(wmd->texture) { + tex_co = MEM_mallocN(sizeof(*tex_co) * numVerts, + "waveModifier_do tex_co"); + wavemod_get_texture_coords(wmd, ob, dm, vertexCos, tex_co, numVerts); + } + + if(lifefac != 0.0) { + /* avoid divide by zero checks within the loop */ + float falloff_inv= wmd->falloff ? 1.0f / wmd->falloff : 1.0; + int i; + + for(i = 0; i < numVerts; i++) { + float *co = vertexCos[i]; + float x = co[0] - wmd->startx; + float y = co[1] - wmd->starty; + float amplit= 0.0f; + float dist = 0.0f; + float falloff_fac = 0.0f; + TexResult texres; + MDeformWeight *def_weight = NULL; + + /* get weights */ + if(dvert) { + int j; + for(j = 0; j < dvert[i].totweight; ++j) { + if(dvert[i].dw[j].def_nr == defgrp_index) { + def_weight = &dvert[i].dw[j]; + break; + } + } + + /* if this vert isn't in the vgroup, don't deform it */ + if(!def_weight) continue; + } + + if(wmd->texture) { + texres.nor = NULL; + get_texture_value(wmd->texture, tex_co[i], &texres); + } + + /*get dist*/ + if(wmd->flag & MOD_WAVE_X) { + if(wmd->flag & MOD_WAVE_Y){ + dist = (float)sqrt(x*x + y*y); + } + else{ + dist = fabs(x); + } + } + else if(wmd->flag & MOD_WAVE_Y) { + dist = fabs(y); + } + + falloff_fac = (1.0f - (dist * falloff_inv)); + + if(wmd->flag & MOD_WAVE_X) { + if(wmd->flag & MOD_WAVE_Y) amplit = (float)sqrt(x*x + y*y); + else amplit = x; + } + else if(wmd->flag & MOD_WAVE_Y) + amplit= y; + + /* this way it makes nice circles */ + amplit -= (ctime - wmd->timeoffs) * wmd->speed; + + if(wmd->flag & MOD_WAVE_CYCL) { + amplit = (float)fmod(amplit - wmd->width, 2.0 * wmd->width) + + wmd->width; + } + + /* GAUSSIAN */ + if(amplit > -wmd->width && amplit < wmd->width) { + amplit = amplit * wmd->narrow; + amplit = (float)(1.0 / exp(amplit * amplit) - minfac); + + /*apply texture*/ + if(wmd->texture) + amplit = amplit * texres.tin; + + /*apply weight*/ + if(def_weight) + amplit = amplit * def_weight->weight; + + /*apply falloff*/ + if (wmd->falloff > 0) + amplit = amplit * falloff_fac; + + if(mvert) { + /* move along normals */ + if(wmd->flag & MOD_WAVE_NORM_X) { + co[0] += (lifefac * amplit) * mvert[i].no[0] / 32767.0f; + } + if(wmd->flag & MOD_WAVE_NORM_Y) { + co[1] += (lifefac * amplit) * mvert[i].no[1] / 32767.0f; + } + if(wmd->flag & MOD_WAVE_NORM_Z) { + co[2] += (lifefac * amplit) * mvert[i].no[2] / 32767.0f; + } + } + else { + /* move along local z axis */ + co[2] += lifefac * amplit; + } + } + } + } + + if(wmd->texture) MEM_freeN(tex_co); +} + +static void deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + DerivedMesh *dm= derivedData; + WaveModifierData *wmd = (WaveModifierData *)md; + + if(wmd->flag & MOD_WAVE_NORM) + dm= get_cddm(md->scene, ob, NULL, dm, vertexCos); + else if(wmd->texture || wmd->defgrp_name[0]) + dm= get_dm(md->scene, ob, NULL, dm, NULL, 0); + + waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + +static void deformVertsEM( + ModifierData *md, Object *ob, struct EditMesh *editData, + DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) +{ + DerivedMesh *dm= derivedData; + WaveModifierData *wmd = (WaveModifierData *)md; + + if(wmd->flag & MOD_WAVE_NORM) + dm= get_cddm(md->scene, ob, editData, dm, vertexCos); + else if(wmd->texture || wmd->defgrp_name[0]) + dm= get_dm(md->scene, ob, editData, dm, NULL, 0); + + waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts); + + if(dm != derivedData) + dm->release(dm); +} + + +ModifierTypeInfo modifierType_Wave = { + /* name */ "Wave", + /* structName */ "WaveModifierData", + /* structSize */ sizeof(WaveModifierData), + /* type */ eModifierTypeType_OnlyDeform, + /* flags */ eModifierTypeFlag_AcceptsCVs + | eModifierTypeFlag_SupportsEditmode, + /* copyData */ copyData, + /* deformVerts */ deformVerts, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ 0, + /* applyModifier */ 0, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ foreachIDLink, +}; diff --git a/source/blender/modifiers/intern/Makefile b/source/blender/modifiers/intern/Makefile new file mode 100644 index 00000000000..849bc11662e --- /dev/null +++ b/source/blender/modifiers/intern/Makefile @@ -0,0 +1,55 @@ +# +# $Id$ +# +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL LICENSE BLOCK ***** +# +# + +LIBNAME = modifiers +DIR = $(OCGDIR)/blender/$(LIBNAME) + +include nan_compile.mk + +CFLAGS += $(LEVEL_1_C_WARNINGS) + +CPPFLAGS += -I.. + +CPPFLAGS += -I../../makesdna +CPPFLAGS += -I../../makesrna +CPPFLAGS += -I../../blenlib +CPPFLAGS += -I../../blenkernel +CPPFLAGS += -I../../blenkernel/intern +CPPFLAGS += -I../../render/extern/include + +CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include + +CPPFLAGS += -I$(NAN_DECIMATION)/include +CPPFLAGS += -I$(NAN_ELBEEM)/include +CPPFLAGS += -I$(NAN_OPENNL)/include +CPPFLAGS += -I$(NAN_BSP)/include +# CPPFLAGS += -I$(NAN_SMOKE)/include + + diff --git a/source/blender/nodes/Makefile b/source/blender/nodes/Makefile index 400064f24b8..a173908aeb1 100644 --- a/source/blender/nodes/Makefile +++ b/source/blender/nodes/Makefile @@ -1,5 +1,5 @@ # -# $Id: Makefile +# $Id$ # # ***** BEGIN GPL LICENSE BLOCK ***** # diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c index cda6cf06681..ca7c19cc778 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c @@ -45,7 +45,7 @@ static bNodeSocketType cmp_node_channel_matte_out[]={ static void do_normalized_rgba_to_ycca2(bNode *node, float *out, float *in) { /*normalize to the range 0.0 to 1.0) */ - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[0]=(out[0])/255.0; out[1]=(out[1])/255.0; out[2]=(out[2])/255.0; @@ -58,7 +58,7 @@ static void do_normalized_ycca_to_rgba2(bNode *node, float *out, float *in) in[0]=in[0]*255.0; in[1]=in[1]*255.0; in[2]=in[2]*255.0; - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } @@ -66,30 +66,36 @@ static void do_normalized_ycca_to_rgba2(bNode *node, float *out, float *in) static void do_channel_matte(bNode *node, float *out, float *in) { NodeChroma *c=(NodeChroma *)node->storage; - float alpha=0.0; - - /* Alpha=G-MAX(R, B) */ - - switch(node->custom2) - { - case 1: - { - alpha=in[0]-MAX2(in[1],in[2]); - break; - } - case 2: - { - alpha=in[1]-MAX2(in[0],in[2]); - break; - } - case 3: - { - alpha=in[2]-MAX2(in[0],in[1]); - break; - } - default: - break; - } + float alpha=0.0; + + switch(c->algorithm) { + case 0: { /* Alpha=key_channel-limit channel */ + int key_channel=node->custom2-1; + int limit_channel=c->channel-1; + alpha=in[key_channel]-in[limit_channel]; + break; + } + case 1: { /* Alpha=G-MAX(R, B) */ + switch(node->custom2) { + case 1: { + alpha=in[0]-MAX2(in[1],in[2]); + break; + } + case 2: { + alpha=in[1]-MAX2(in[0],in[2]); + break; + } + case 3: { + alpha=in[2]-MAX2(in[0],in[1]); + break; + } + default: + break; + } + } + default: + break; + } /*flip because 0.0 is transparent, not 1.0*/ alpha=1-alpha; @@ -131,24 +137,24 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack /*convert to colorspace*/ switch(node->custom1) { - case CMP_NODE_CHANNEL_MATTE_CS_RGB: - break; - case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_hsva, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_normalized_rgba_to_ycca2, CB_RGBA); - break; - default: - break; + case CMP_NODE_CHANNEL_MATTE_CS_RGB: + break; + case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ + composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_hsva, CB_RGBA); + break; + case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ + composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA); + break; + case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ + composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_normalized_rgba_to_ycca2, CB_RGBA); + break; + default: + break; } /*use the selected channel information to do the key */ composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_channel_matte, CB_RGBA); - + /*convert back to RGB colorspace in place*/ switch(node->custom1) { case CMP_NODE_CHANNEL_MATTE_CS_RGB: /*RGB*/ @@ -185,6 +191,8 @@ static void node_composit_init_channel_matte(bNode *node) c->t3= 0.0f; c->fsize= 0.0f; c->fstrength= 0.0f; + c->algorithm=1; /*max channel limiting */ + c->channel=1; /* limit by red */ node->custom1= 1; /* RGB channel */ node->custom2= 2; /* Green Channel */ } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c index a8d7ff6b029..b081880b87b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c @@ -45,7 +45,7 @@ static bNodeSocketType cmp_node_chroma_out[]={ static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in) { /*normalize to the range -1.0 to 1.0) */ - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[0]=((out[0])-16)/255.0; out[1]=((out[1])-128)/255.0; out[2]=((out[2])-128)/255.0; @@ -58,7 +58,7 @@ static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in) in[0]=(in[0]*255.0)+16; in[1]=(in[1]*255.0)+128; in[2]=(in[2]*255.0)+128; - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c index 44f690e1fa6..8d5f4688657 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c @@ -51,10 +51,10 @@ static void do_color_key(bNode *node, float *out, float *in) VECCOPY(out, in); if(fabs(in[0]-c->key[0]) < c->t1 && - fabs(in[1]-c->key[1]) < c->t2 && - fabs(in[2]-c->key[2]) < c->t3) + fabs(in[1]-c->key[1]) < c->t2 && + fabs(in[2]-c->key[2]) < c->t3) { - out[3]=0.0; /*make transparent*/ + out[3]=0.0; /*make transparent*/ } else { /*pixel is outside key color */ diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c index 5fcbcd0b854..54fb1e384c3 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c @@ -22,7 +22,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Bob Holcomb, Xavier Thomas * * ***** END GPL LICENSE BLOCK ***** */ @@ -30,6 +30,7 @@ #include "../CMP_util.h" +#define avg(a,b) ((a+b)/2) /* ******************* Color Spill Supression ********************************* */ static bNodeSocketType cmp_node_color_spill_in[]={ @@ -42,33 +43,93 @@ static bNodeSocketType cmp_node_color_spill_out[]={ {-1,0,""} }; -static void do_reduce_red(bNode *node, float* out, float *in) +static void do_simple_spillmap_red(bNode *node, float* out, float *in) { - NodeChroma *c; - c=node->storage; - - if(in[0] > in[1] && in[0] > in[2]) { - out[0]=((in[1]+in[2])/2)*(1-c->t1); + NodeColorspill *ncs; + ncs=node->storage; + out[0]=in[0]-( ncs->limscale * in[ncs->limchan] ); +} + +static void do_simple_spillmap_green(bNode *node, float* out, float *in) +{ + NodeColorspill *ncs; + ncs=node->storage; + out[0]=in[1]-( ncs->limscale * in[ncs->limchan] ); +} + +static void do_simple_spillmap_blue(bNode *node, float* out, float *in) +{ + NodeColorspill *ncs; + ncs=node->storage; + out[0]=in[2]-( ncs->limscale * in[ncs->limchan] ); +} + +static void do_average_spillmap_red(bNode *node, float* out, float *in) +{ + NodeColorspill *ncs; + ncs=node->storage; + out[0]=in[0]-(ncs->limscale * avg(in[1], in[2]) ); +} + +static void do_average_spillmap_green(bNode *node, float* out, float *in) +{ + NodeColorspill *ncs; + ncs=node->storage; + out[0]=in[1]-(ncs->limscale * avg(in[0], in[2]) ); +} + +static void do_average_spillmap_blue(bNode *node, float* out, float *in) +{ + NodeColorspill *ncs; + ncs=node->storage; + out[0]=in[2]-(ncs->limscale * avg(in[0], in[1]) ); +} + +static void do_apply_spillmap_red(bNode *node, float* out, float *in, float *map) +{ + NodeColorspill *ncs; + ncs=node->storage; + if(map[0]>0) { + out[0]=in[0]-(ncs->uspillr*map[0]); + out[1]=in[1]+(ncs->uspillg*map[0]); + out[2]=in[2]+(ncs->uspillb*map[0]); + } + else { + out[0]=in[0]; + out[1]=in[1]; + out[2]=in[2]; } } -static void do_reduce_green(bNode *node, float* out, float *in) +static void do_apply_spillmap_green(bNode *node, float* out, float *in, float *map) { - NodeChroma *c; - c=node->storage; - - if(in[1] > in[0] && in[1] > in[2]) { - out[1]=((in[0]+in[2])/2)*(1-c->t1); + NodeColorspill *ncs; + ncs=node->storage; + if(map[0]>0) { + out[0]=in[0]+(ncs->uspillr*map[0]); + out[1]=in[1]-(ncs->uspillg*map[0]); + out[2]=in[2]+(ncs->uspillb*map[0]); + } + else { + out[0]=in[0]; + out[1]=in[1]; + out[2]=in[2]; } } -static void do_reduce_blue(bNode *node, float* out, float *in) +static void do_apply_spillmap_blue(bNode *node, float* out, float *in, float *map) { - NodeChroma *c; - c=node->storage; - - if(in[2] > in[1] && in[2] > in[1]) { - out[2]=((in[1]+in[0])/2)*(1-c->t1); + NodeColorspill *ncs; + ncs=node->storage; + if(map[0]>0) { + out[0]=in[0]+(ncs->uspillr*map[0]); + out[1]=in[1]+(ncs->uspillg*map[0]); + out[2]=in[2]-(ncs->uspillb*map[0]); + } + else { + out[0]=in[0]; + out[1]=in[1]; + out[2]=in[2]; } } @@ -79,28 +140,86 @@ static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack * discussions from vfxtalk.com.*/ CompBuf *cbuf; CompBuf *rgbbuf; + CompBuf *spillmap; + NodeColorspill *ncs; + ncs=node->storage; if(out[0]->hasoutput==0 || in[0]->hasinput==0) return; if(in[0]->data==NULL) return; cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); + spillmap=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); rgbbuf=dupalloc_compbuf(cbuf); switch(node->custom1) { case 1: /*red spill*/ { - composit1_pixel_processor(node, rgbbuf, cbuf, in[1]->vec, do_reduce_red, CB_RGBA); + switch(node->custom2) + { + case 0: /* simple limit */ + { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_red, CB_RGBA); + break; + } + case 1: /* average limit */ + { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_red, CB_RGBA); + break; + } + } + if(ncs->unspill==0) { + ncs->uspillr=1.0f; + ncs->uspillg=0.0f; + ncs->uspillb=0.0f; + } + composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_red, CB_RGBA, CB_VAL); break; } case 2: /*green spill*/ { - composit1_pixel_processor(node, rgbbuf, cbuf, in[1]->vec, do_reduce_green, CB_RGBA); + switch(node->custom2) + { + case 0: /* simple limit */ + { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_green, CB_RGBA); + break; + } + case 1: /* average limit */ + { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_green, CB_RGBA); + break; + } + } + if(ncs->unspill==0) { + ncs->uspillr=0.0f; + ncs->uspillg=1.0f; + ncs->uspillb=0.0f; + } + composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_green, CB_RGBA, CB_VAL); break; } case 3: /*blue spill*/ { - composit1_pixel_processor(node, rgbbuf, cbuf, in[1]->vec, do_reduce_blue, CB_RGBA); + switch(node->custom2) + { + case 0: /* simple limit */ + { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_blue, CB_RGBA); + break; + } + case 1: /* average limit */ + { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_blue, CB_RGBA); + break; + } + } + if(ncs->unspill==0) { + ncs->uspillr=0.0f; + ncs->uspillg=0.0f; + ncs->uspillb=1.0f; + } + composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_blue, CB_RGBA, CB_VAL); break; } default: @@ -111,18 +230,19 @@ static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack * if(cbuf!=in[0]->data) free_compbuf(cbuf); + + free_compbuf(spillmap); } static void node_composit_init_color_spill(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); - node->storage=c; - c->t1= 0.0f; - c->t2= 0.0f; - c->t3= 0.0f; - c->fsize= 0.0f; - c->fstrength= 0.0f; + NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill"); + node->storage=ncs; node->custom1= 2; /* green channel */ + node->custom2= 0; /* simple limit algo*/ + ncs->limchan= 0; /* limit by red */ + ncs->limscale= 1.0f; /* limit scaling factor */ + ncs->unspill=0; /* do not use unspill */ } bNodeType cmp_node_color_spill={ @@ -133,7 +253,7 @@ bNodeType cmp_node_color_spill={ /* class+opts */ NODE_CLASS_MATTE, NODE_OPTIONS, /* input sock */ cmp_node_color_spill_in, /* output sock */ cmp_node_color_spill_out, - /* storage */ "NodeChroma", + /* storage */ "NodeColorspill", /* execfunc */ node_composit_exec_color_spill, /* butfunc */ NULL, /* initfunc */ node_composit_init_color_spill, diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c index 7ec28e6461d..efd49172f95 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c @@ -54,10 +54,11 @@ DO_INLINE float colorbalance_cdl(float in, float offset, float power, float slop return powf(x, 1.f/power); } -DO_INLINE float colorbalance_lgg(float in, float lift, float gamma, float gain) -{ - float x = gain*(in+lift*(1-in)); - +/* note: lift_lgg is just 2-lift */ +DO_INLINE float colorbalance_lgg(float in, float lift_lgg, float gamma, float gain) +{ + float x= (((in - 1.0f) * lift_lgg) + 1.0f) * gain; + /* prevent NaN */ if (x < 0.f) x = 0.f; @@ -88,10 +89,10 @@ static void do_colorbalance_cdl_fac(bNode *node, float* out, float *in, float *f static void do_colorbalance_lgg(bNode *node, float* out, float *in) { NodeColorBalance *n= (NodeColorBalance *)node->storage; - - out[0] = colorbalance_lgg(in[0], n->lift[0], n->gamma[0], n->gain[0]); - out[1] = colorbalance_lgg(in[1], n->lift[1], n->gamma[1], n->gain[1]); - out[2] = colorbalance_lgg(in[2], n->lift[2], n->gamma[2], n->gain[2]); + + out[0] = colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma[0], n->gain[0]); + out[1] = colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma[1], n->gain[1]); + out[2] = colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma[2], n->gain[2]); out[3] = in[3]; } @@ -99,10 +100,10 @@ static void do_colorbalance_lgg_fac(bNode *node, float* out, float *in, float *f { NodeColorBalance *n= (NodeColorBalance *)node->storage; const float mfac= 1.0f - *fac; - - out[0] = mfac*in[0] + *fac * colorbalance_lgg(in[0], n->lift[0], n->gamma[0], n->gain[0]); - out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift[1], n->gamma[1], n->gain[1]); - out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift[2], n->gamma[2], n->gain[2]); + + out[0] = mfac*in[0] + *fac * colorbalance_lgg(in[0], n->lift_lgg[0], n->gamma[0], n->gain[0]); + out[1] = mfac*in[1] + *fac * colorbalance_lgg(in[1], n->lift_lgg[1], n->gamma[1], n->gain[1]); + out[2] = mfac*in[2] + *fac * colorbalance_lgg(in[2], n->lift_lgg[2], n->gamma[2], n->gain[2]); out[3] = in[3]; } @@ -119,7 +120,23 @@ static void node_composit_exec_colorbalance(void *data, bNode *node, bNodeStack out[0]->data = pass_on_compbuf(cbuf); return; } - + + { + NodeColorBalance *n= (NodeColorBalance *)node->storage; + int c; + + copy_v3_v3(n->lift_lgg, n->lift); + + for (c = 0; c < 3; c++) { + /* tweak to give more subtle results + * values above 1.0 are scaled */ + if(n->lift_lgg[c] > 1.0f) + n->lift_lgg[c] = pow(n->lift_lgg[c] - 1.0f, 2.0f) + 1.0f; + + n->lift_lgg[c] = 2.0f - n->lift_lgg[c]; + } + } + if (cbuf) { stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* create output based on image input */ @@ -150,7 +167,7 @@ static void node_composit_init_colorbalance(bNode *node) { NodeColorBalance *n= node->storage= MEM_callocN(sizeof(NodeColorBalance), "node colorbalance"); - n->lift[0] = n->lift[1] = n->lift[2] = 0.0f; + n->lift[0] = n->lift[1] = n->lift[2] = 1.0f; n->gamma[0] = n->gamma[1] = n->gamma[2] = 1.0f; n->gain[0] = n->gain[1] = n->gain[2] = 1.0f; } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c index 76a78e46e3a..7510a2d11d4 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c @@ -50,7 +50,7 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i RenderData *rd= data; if(scene && (rd->scemode & R_DOCOMP)) { - Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING); + Render *re= RE_GetRender(scene->id.name); RenderResult *rr= RE_AcquireResultWrite(re); if(rr) { CompBuf *outbuf, *zbuf=NULL; @@ -80,10 +80,10 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i outbuf->malloc= 0; free_compbuf(outbuf); - RE_ReleaseResult(re); - /* signal for imageviewer to refresh (it converts to byte rects...) */ BKE_image_signal(BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), NULL, IMA_SIGNAL_FREE); + + RE_ReleaseResult(re); return; } else diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c index 00038f6fde2..c2edb3dd52f 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c @@ -83,7 +83,7 @@ static void node_composit_exec_crop(void *data, bNode *node, bNodeStack **in, bN srcfp= cbuf->rect + (y * cbuf->x + outputrect.xmin) * cbuf->type; outfp= stackbuf->rect + (y * stackbuf->x + outputrect.xmin) * stackbuf->type; for(x=outputrect.xmin; xtype, srcfp+= cbuf->type) - memcpy(outfp, srcfp, sizeof(float)*stackbuf->type); + memcpy(outfp, srcfp, sizeof(float)*stackbuf->type); } } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c index 4c515df34fb..a93a5760842 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c @@ -242,11 +242,9 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, CompBuf *crad; // CoC radius buffer BokehCoeffs BKH[8]; // bokeh shape data, here never > 8 pts. float bkh_b[4] = {0}; // shape 2D bound - unsigned int p, px, p4, zp, cp, cp4; - float *ctcol, u, v, iZ, ct_crad, lwt, wt=0, cR2=0; - float dof_sp, maxfgc, bk_hn_theta=0, inradsq=0; float cam_fdist=1, cam_invfdist=1, cam_lens=35; - int x, y, sx, sy, len_bkh=0; + float dof_sp, maxfgc, bk_hn_theta=0, inradsq=0; + int y, len_bkh=0, ydone=0; float aspect, aperture; int minsz; //float bcrad, nmaxc, scf; @@ -288,6 +286,8 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, // to prevent *reaaallly* big radius values and impossible calculation times, // limit the maximum to half the image width or height, whichever is smaller float maxr = 0.5f*(float)MIN2(img->x, img->y); + unsigned int p; + for (p=0; p<(unsigned int)(img->x*img->y); p++) { crad->rect[p] = zbuf ? (zbuf->rect[p]*nqd->scale) : inpval; // bug #5921, limit minimum @@ -298,6 +298,8 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, } } else { + float wt; + // actual zbuffer. // separate foreground from background CoC's // then blur background and blend in again with foreground, @@ -305,10 +307,11 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, // wts buffer here used for blendmask maxfgc = 0.f; // maximum foreground CoC radius for (y=0; yy; y++) { - p = y * img->x; + unsigned int p = y * img->x; + int x; for (x=0; xx; x++) { - px = p + x; - iZ = (zbuf->rect[px]==0.f) ? 0.f : (1.f/zbuf->rect[px]); + unsigned int px = p + x; + float iZ = (zbuf->rect[px]==0.f) ? 0.f : (1.f/zbuf->rect[px]); crad->rect[px] = 0.5f*(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f)); if (crad->rect[px] <= 0.f) { wts->rect[px] = 1.f; @@ -342,11 +345,13 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, // and blend... for (y=0; yy; y++) { - p = y*img->x; + unsigned int p = y*img->x; + int x; + for (x=0; xx; x++) { - px = p + x; + unsigned px = p + x; if (zbuf->rect[px]!=0.f) { - iZ = (zbuf->rect[px]==0.f) ? 0.f : (1.f/zbuf->rect[px]); + float iZ = (zbuf->rect[px]==0.f) ? 0.f : (1.f/zbuf->rect[px]); // bug #6656 part 2b, do not rescale /* @@ -373,18 +378,30 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, //------------------------------------------------------------------ // main loop + #pragma omp parallel for private(y) if(!nqd->preview && img->y*img->x > 16384) schedule(guided) for (y=0; yy; y++) { + unsigned int p, p4, zp, cp, cp4; + float *ctcol, u, v, ct_crad, cR2=0; + int x, sx, sy; + // some sort of visual feedback would be nice, or at least this text in the renderwin header // but for now just print some info in the console every 8 scanlines. - if (((y & 7)==0) || (y==(img->y-1))) { - if(G.background==0) { - printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y); - fflush(stdout); + #pragma omp critical + { + if (((ydone & 7)==0) || (ydone==(img->y-1))) { + if(G.background==0) { + printf("\rdefocus: Processing Line %d of %d ... ", ydone+1, img->y); + fflush(stdout); + } } + + ydone++; } - // esc set by main calling process + + // esc set by main calling process. don't break because openmp doesn't + // allow it, just continue and do nothing if(node->exec & NODE_BREAK) - break; + continue; zp = y * img->x; for (x=0; xx; x++) { @@ -412,6 +429,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, if (!nqd->preview) { int xs, xe, ys, ye; float lwt, wtcol[4] = {0}, aacol[4] = {0}; + float wt; // shape weight if (nqd->bktype==0) // disk @@ -700,7 +718,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, else { // sampled, simple rejection sampling here, good enough unsigned int maxsam, s, ui = BLI_rand()*BLI_rand(); - float wcor, cpr = BLI_frand(); + float wcor, cpr = BLI_frand(), lwt; if (no_zbuf) maxsam = nqd->samples; // no zbuffer input, use sample value directly else { @@ -749,8 +767,10 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf, // finally, normalize for (y=0; yy; y++) { - p = y * new->x; - p4 = p * new->type; + unsigned int p = y * new->x; + unsigned int p4 = p * new->type; + int x; + for (x=0; xx; x++) { float dv = (wts->rect[p]==0.f) ? 1.f : (1.f/wts->rect[p]); new->rect[p4] *= dv; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c index f1b39587e2a..0735a369d12 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c @@ -42,9 +42,7 @@ static bNodeSocketType cmp_node_diff_matte_out[]={ {-1,0,""} }; -/* note, keyvals is passed on from caller as stack array */ -/* might have been nicer as temp struct though... */ -static void do_diff_matte(bNode *node, float *colorbuf, float *imbuf1, float *imbuf2) +static void do_diff_matte(bNode *node, float *outColor, float *inColor1, float *inColor2) { NodeChroma *c= (NodeChroma *)node->storage; float tolerence=c->t1; @@ -52,52 +50,57 @@ static void do_diff_matte(bNode *node, float *colorbuf, float *imbuf1, float *im float difference; float alpha; - difference=fabs(imbuf2[0]-imbuf1[0])+ - fabs(imbuf2[1]-imbuf1[1])+ - fabs(imbuf2[2]-imbuf1[2]); + difference=fabs(inColor2[0]-inColor1[0])+ + fabs(inColor2[1]-inColor1[1])+ + fabs(inColor2[2]-inColor1[2]); /*average together the distances*/ difference=difference/3.0; - VECCOPY(colorbuf, imbuf1); + VECCOPY(outColor, inColor1); /*make 100% transparent*/ if(difference < tolerence){ - colorbuf[3]=0.0; + outColor[3]=0.0; } /*in the falloff region, make partially transparent */ else if(difference < falloff+tolerence){ - difference=difference-tolerence; - alpha=difference/falloff; - /*only change if more transparent than before */ - if(alpha < imbuf1[3]) { - colorbuf[3]=alpha; - } - else { /* leave as before */ - colorbuf[3]=imbuf1[3]; - } + difference=difference-tolerence; + alpha=difference/falloff; + /*only change if more transparent than before */ + if(alpha < inColor1[3]) { + outColor[3]=alpha; + } + else { /* leave as before */ + outColor[3]=inColor1[3]; + } } else { /*foreground object*/ - colorbuf[3]= imbuf1[3]; + outColor[3]= inColor1[3]; } } static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - CompBuf *outbuf; - CompBuf *imbuf1; - CompBuf *imbuf2; + CompBuf *outbuf=0; + CompBuf *imbuf1=0; + CompBuf *imbuf2=0; NodeChroma *c; /*is anything connected?*/ if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return; + /*must have an image imput*/ if(in[0]->data==NULL) return; - if(in[1]->data==NULL) return; + imbuf1=typecheck_compbuf(in[0]->data, CB_RGBA); - imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA); + + /* if there's an image, use that, if not use the color */ + if(in[1]->data) { + imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA); + } c=node->storage; outbuf=dupalloc_compbuf(imbuf1); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c index 877f71bfbfb..6fe6dcd8440 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c @@ -44,94 +44,83 @@ static bNodeSocketType cmp_node_displace_out[]= { { -1, 0, "" } }; -static float *vecbuf_get_pixel(CompBuf *vecbuf, float *veccol, int x, int y) -{ - /* the x-xrad stuff is a bit weird, but i seem to need it otherwise - * my returned pixels are offset weirdly */ - return compbuf_get_pixel(vecbuf, veccol, x-vecbuf->xrad, y-vecbuf->yrad, vecbuf->xrad, vecbuf->yrad); -} +/* minimum distance (in pixels) a pixel has to be displaced + * in order to take effect */ +#define DISPLACE_EPSILON 0.01 static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, float *xscale, float *yscale) { ImBuf *ibuf; - float dx=0.0, dy=0.0; - float dspx, dspy; - float uv[2], col[4], colnext[4], colprev[4]; - float *vp, *vpnext, *vpprev; - float *out= stackbuf->rect, *vec=vecbuf->rect, *in= cbuf->rect; - int x, y, vx, vy, sx, sy; + int x, y; + float p_dx, p_dy; /* main displacement in pixel space */ + float d_dx, d_dy; + float dxt, dyt; + float u, v; + float vec[3], vecdx[3], vecdy[3]; + float col[3]; - /* ibuf needed for sampling */ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0); ibuf->rect_float= cbuf->rect; - vec = vecbuf->rect; - - sx= stackbuf->x; - sy= stackbuf->y; - - QUATCOPY(col, veccol); - QUATCOPY(colnext, veccol); - QUATCOPY(colprev, veccol); - - for(y=0; yy; y++) { + for(x=0; x < stackbuf->x; x++) { + /* calc pixel coordinates */ + qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof, vec); + p_dx = vec[0] * xscale[0]; + p_dy = vec[1] * yscale[0]; - vp = vecbuf_get_pixel(vecbuf, col, x, y); - - /* this happens in compbuf_get_pixel, need to make sure the following - * check takes them into account */ - vx= x-vecbuf->xof; - vy= y-vecbuf->yof; - - /* find the new displaced co-ords, also correcting for translate offset */ - dspx = vx - (*xscale * vp[0]); - dspy = vy - (*yscale * vp[1]); - - /* convert image space to 0.0-1.0 UV space for sampling, correcting for translate offset */ - uv[0] = dspx / (float)sx; - uv[1] = dspy / (float)sy; - - if(vx>0 && vx< vecbuf->x-1 && vy>0 && vy< vecbuf->y-1) { - /* adaptive sampling, X and Y channel. - * we call vecbuf_get_pixel for every pixel since the input - * might be a procedural, and then we can't use offsets */ - vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y); - dx= 0.5f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0])); - - vpprev = vecbuf_get_pixel(vecbuf, colprev, x, y-1); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x, y+1); - dy= 0.5f*(fabs(vp[1]-vpnext[1]) + fabs(vp[1]-vpprev[1])); - - vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y-1); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x-1, y+1); - dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0])); - dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1])); - - vpprev = vecbuf_get_pixel(vecbuf, colprev, x+1, y-1); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y+1); - dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0])); - dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1])); - - /* scaled down to prevent blurriness */ - /* 8: magic number, provides a good level of sharpness without getting too aliased */ - dx /= 8; - dy /= 8; + /* if no displacement, then just copy this pixel */ + if (p_dx < DISPLACE_EPSILON && p_dy < DISPLACE_EPSILON) { + qd_getPixel(cbuf, x-cbuf->xof, y-cbuf->yof, col); + qd_setPixel(stackbuf, x, y, col); + continue; } - - /* should use mipmap */ - if(dx > 0.006f) dx= 0.006f; - if(dy > 0.006f) dy= 0.006f; - if ((vp[0]> 0.0) && (dx < 0.004)) dx = 0.004; - if ((vp[1]> 0.0) && (dy < 0.004)) dy = 0.004; - - ibuf_sample(ibuf, uv[0], uv[1], dx, dy, out); + /* displaced pixel in uv coords, for image sampling */ + u = (x - cbuf->xof - p_dx + 0.5f) / (float)stackbuf->x; + v = (y - cbuf->yof - p_dy + 0.5f) / (float)stackbuf->y; + + + /* calc derivatives */ + qd_getPixel(vecbuf, x-vecbuf->xof+1, y-vecbuf->yof, vecdx); + qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof+1, vecdy); + d_dx = vecdx[0] * xscale[0]; + d_dy = vecdy[0] * yscale[0]; + + /* clamp derivatives to minimum displacement distance in UV space */ + dxt = MAX2(p_dx - d_dx, DISPLACE_EPSILON)/(float)stackbuf->x; + dyt = MAX2(p_dy - d_dy, DISPLACE_EPSILON)/(float)stackbuf->y; + + ibuf_sample(ibuf, u, v, dxt, dyt, col); + qd_setPixel(stackbuf, x, y, col); } } - - IMB_freeImBuf(ibuf); + IMB_freeImBuf(ibuf); + + +/* simple method for reference, linear interpolation */ +/* + int x, y; + float dx, dy; + float u, v; + float vec[3]; + float col[3]; + + for(y=0; y < stackbuf->y; y++) { + for(x=0; x < stackbuf->x; x++) { + qd_getPixel(vecbuf, x, y, vec); + + dx = vec[0] * (xscale[0]); + dy = vec[1] * (yscale[0]); + + u = (x - dx + 0.5f) / (float)stackbuf->x; + v = (y - dy + 0.5f) / (float)stackbuf->y; + + qd_getPixelLerp(cbuf, u*cbuf->x - 0.5f, v*cbuf->y - 0.5f, col); + qd_setPixel(stackbuf, x, y, col); + } + } +*/ } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c index 4213a5f5389..e0e595fc8f6 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c @@ -53,29 +53,29 @@ static void do_distance_matte(bNode *node, float *out, float *in) float alpha; distance=sqrt((c->key[0]-in[0])*(c->key[0]-in[0]) + - (c->key[1]-in[1])*(c->key[1]-in[1]) + - (c->key[2]-in[2])*(c->key[2]-in[2])); + (c->key[1]-in[1])*(c->key[1]-in[1]) + + (c->key[2]-in[2])*(c->key[2]-in[2])); VECCOPY(out, in); /*make 100% transparent */ if(distance < tolerence) { - out[3]=0.0; + out[3]=0.0; } /*in the falloff region, make partially transparent */ else if(distance < falloff+tolerence){ - distance=distance-tolerence; - alpha=distance/falloff; - /*only change if more transparent than before */ - if(alpha < in[3]) { - out[3]=alpha; - } - else { /* leave as before */ - out[3]=in[3]; - } + distance=distance-tolerence; + alpha=distance/falloff; + /*only change if more transparent than before */ + if(alpha < in[3]) { + out[3]=alpha; + } + else { /* leave as before */ + out[3]=in[3]; + } } else { - out[3]=in[3]; + out[3]=in[3]; } } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c index 1726347b367..c0e524a3ae9 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c @@ -35,7 +35,7 @@ static bNodeSocketType cmp_node_gamma_in[]= { { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, { SOCK_VALUE, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f}, - { -1, 0, "" } + { -1, 0, "" } }; static bNodeSocketType cmp_node_gamma_out[]= { { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, @@ -82,11 +82,11 @@ bNodeType cmp_node_gamma= { /* output sock */ cmp_node_gamma_out, /* storage */ "", /* execfunc */ node_composit_exec_gamma, - /* butfunc */ NULL, - /* initfunc */ NULL, - /* freestoragefunc */ NULL, - /* copysotragefunc */ NULL, - /* id */ NULL + /* butfunc */ NULL, + /* initfunc */ NULL, + /* freestoragefunc */ NULL, + /* copysotragefunc */ NULL, + /* id */ NULL }; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c index 0517811fe0d..95db66d92f7 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c @@ -60,7 +60,6 @@ static void do_huecorrect(bNode *node, float *out, float *in) CLAMP(hsv[0], 0.f, 1.f); CLAMP(hsv[1], 0.f, 1.f); - CLAMP(hsv[2], 0.f, 1.f); /* convert back to rgb */ hsv_to_rgb(hsv[0], hsv[1], hsv[2], out, out+1, out+2); @@ -89,7 +88,6 @@ static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac) CLAMP(hsv[0], 0.f, 1.f); CLAMP(hsv[1], 0.f, 1.f); - CLAMP(hsv[2], 0.f, 1.f); /* convert back to rgb */ hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); @@ -137,28 +135,13 @@ static void node_composit_exec_huecorrect(void *data, bNode *node, bNodeStack ** static void node_composit_init_huecorrect(bNode* node) { CurveMapping *cumapping = node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); - int c, i; + int c; + + cumapping->preset = CURVE_PRESET_MID9; for (c=0; c<3; c++) { CurveMap *cuma = &cumapping->cm[c]; - - /* set default horizontal curve */ - if(cuma->curve) - MEM_freeN(cuma->curve); - - cuma->totpoint= 9; - cuma->curve= MEM_callocN(cuma->totpoint*sizeof(CurveMapPoint), "curve points"); - - for (i=0; i < cuma->totpoint; i++) - { - cuma->curve[i].x= i / ((float)cuma->totpoint-1); - cuma->curve[i].y= 0.5; - } - - if(cuma->table) { - MEM_freeN(cuma->table); - cuma->table= NULL; - } + curvemap_reset(cuma, &cumapping->clipr, cumapping->preset); } /* default to showing Saturation */ diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index aa3fa9db412..0bbf9c9bf85 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -46,9 +46,11 @@ static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Reflect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 0, "Radio", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -176,13 +178,16 @@ void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, I out[RRES_OUT_REFLECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_REFLECT); if(out[RRES_OUT_REFRACT]->hasoutput) out[RRES_OUT_REFRACT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_REFRACT); - if(out[RRES_OUT_RADIO]->hasoutput) - out[RRES_OUT_RADIO]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_RADIO); + if(out[RRES_OUT_INDIRECT]->hasoutput) + out[RRES_OUT_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST); - + if(out[RRES_OUT_EMIT]->hasoutput) + out[RRES_OUT_EMIT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_EMIT); + if(out[RRES_OUT_ENV]->hasoutput) + out[RRES_OUT_ENV]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_ENVIRONMENT); }; @@ -226,9 +231,12 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **in, b /*first duplicate stackbuf->rect, since it's just a pointer to the source imbuf, and we don't want to change that.*/ stackbuf->rect = MEM_dupallocN(stackbuf->rect); - + + /* since stackbuf now has allocated memory, rather than just a pointer, + * mark it as allocated so it can be freed properly */ + stackbuf->malloc=1; + /*premul the image*/ - pixel = stackbuf->rect; for (i=0; ix*stackbuf->y; i++, pixel += 4) { pixel[0] *= pixel[3]; @@ -288,23 +296,23 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in { float *fp= RE_RenderLayerGetPass(rl, passcode); if(fp) { - CompBuf *buf; - int buftype= CB_VEC3; + CompBuf *buf; + int buftype= CB_VEC3; - if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST)) - buftype= CB_VAL; - else if(passcode==SCE_PASS_VECTOR) - buftype= CB_VEC4; - else if(ELEM(passcode, SCE_PASS_COMBINED, SCE_PASS_RGBA)) - buftype= CB_RGBA; + if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST)) + buftype= CB_VAL; + else if(passcode==SCE_PASS_VECTOR) + buftype= CB_VEC4; + else if(ELEM(passcode, SCE_PASS_COMBINED, SCE_PASS_RGBA)) + buftype= CB_RGBA; - if(rd->scemode & R_COMP_CROP) - buf= get_cropped_compbuf(&rd->disprect, fp, rectx, recty, buftype); - else { - buf= alloc_compbuf(rectx, recty, buftype, 0); - buf->rect= fp; - } - return buf; + if(rd->scemode & R_COMP_CROP) + buf= get_cropped_compbuf(&rd->disprect, fp, rectx, recty, buftype); + else { + buf= alloc_compbuf(rectx, recty, buftype, 0); + buf->rect= fp; + } + return buf; } return NULL; }; @@ -312,41 +320,44 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty) { if(out[RRES_OUT_Z]->hasoutput) - out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z); + out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z); if(out[RRES_OUT_VEC]->hasoutput) - out[RRES_OUT_VEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_VECTOR); + out[RRES_OUT_VEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_VECTOR); if(out[RRES_OUT_NORMAL]->hasoutput) - out[RRES_OUT_NORMAL]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_NORMAL); + out[RRES_OUT_NORMAL]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_NORMAL); if(out[RRES_OUT_UV]->hasoutput) - out[RRES_OUT_UV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_UV); + out[RRES_OUT_UV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_UV); if(out[RRES_OUT_RGBA]->hasoutput) - out[RRES_OUT_RGBA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RGBA); + out[RRES_OUT_RGBA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RGBA); if(out[RRES_OUT_DIFF]->hasoutput) - out[RRES_OUT_DIFF]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE); + out[RRES_OUT_DIFF]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE); if(out[RRES_OUT_SPEC]->hasoutput) - out[RRES_OUT_SPEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SPEC); + out[RRES_OUT_SPEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SPEC); if(out[RRES_OUT_SHADOW]->hasoutput) - out[RRES_OUT_SHADOW]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SHADOW); + out[RRES_OUT_SHADOW]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SHADOW); if(out[RRES_OUT_AO]->hasoutput) - out[RRES_OUT_AO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_AO); + out[RRES_OUT_AO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_AO); if(out[RRES_OUT_REFLECT]->hasoutput) - out[RRES_OUT_REFLECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFLECT); + out[RRES_OUT_REFLECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFLECT); if(out[RRES_OUT_REFRACT]->hasoutput) - out[RRES_OUT_REFRACT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFRACT); - if(out[RRES_OUT_RADIO]->hasoutput) - out[RRES_OUT_RADIO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RADIO); + out[RRES_OUT_REFRACT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFRACT); + if(out[RRES_OUT_INDIRECT]->hasoutput) + out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST); - + if(out[RRES_OUT_EMIT]->hasoutput) + out[RRES_OUT_EMIT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_EMIT); + if(out[RRES_OUT_ENV]->hasoutput) + out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT); }; static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { Scene *sce= (Scene *)node->id; - Render *re= (sce)? RE_GetRender(sce->id.name, RE_SLOT_RENDERING): NULL; + Render *re= (sce)? RE_GetRender(sce->id.name): NULL; RenderData *rd= data; RenderResult *rr= NULL; @@ -354,38 +365,38 @@ static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in, rr= RE_AcquireResultRead(re); if(rr) { - SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); - if(srl) { - RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if(rl && rl->rectf) { - CompBuf *stackbuf; + SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); + if(srl) { + RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); + if(rl && rl->rectf) { + CompBuf *stackbuf; - /* we put render rect on stack, cbuf knows rect is from other ibuf when freed! */ - if(rd->scemode & R_COMP_CROP) - stackbuf= get_cropped_compbuf(&rd->disprect, rl->rectf, rr->rectx, rr->recty, CB_RGBA); - else { - stackbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 0); - stackbuf->rect= rl->rectf; - } - if(stackbuf==NULL) { - printf("Error; Preview Panel in UV Window returns zero sized image\n"); - } - else { - stackbuf->xof= rr->xof; - stackbuf->yof= rr->yof; + /* we put render rect on stack, cbuf knows rect is from other ibuf when freed! */ + if(rd->scemode & R_COMP_CROP) + stackbuf= get_cropped_compbuf(&rd->disprect, rl->rectf, rr->rectx, rr->recty, CB_RGBA); + else { + stackbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 0); + stackbuf->rect= rl->rectf; + } + if(stackbuf==NULL) { + printf("Error; Preview Panel in UV Window returns zero sized image\n"); + } + else { + stackbuf->xof= rr->xof; + stackbuf->yof= rr->yof; - /* put on stack */ - out[RRES_OUT_IMAGE]->data= stackbuf; + /* put on stack */ + out[RRES_OUT_IMAGE]->data= stackbuf; - if(out[RRES_OUT_ALPHA]->hasoutput) - out[RRES_OUT_ALPHA]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); + if(out[RRES_OUT_ALPHA]->hasoutput) + out[RRES_OUT_ALPHA]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); - node_composit_rlayers_out(rd, rl, out, rr->rectx, rr->recty); + node_composit_rlayers_out(rd, rl, out, rr->rectx, rr->recty); - generate_preview(data, node, stackbuf); - } - } - } + generate_preview(data, node, stackbuf); + } + } + } } if(re) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c index f61d98692fd..f663dc76b5c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c @@ -171,7 +171,7 @@ static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bN stackbuf=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); } /* and if it doesn't exist use the second input since we - know that one of them must exist at this point*/ + know that one of them must exist at this point*/ else { stackbuf=alloc_compbuf(cbuf2->x, cbuf2->y, CB_VAL, 1); } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c index b948ccbd273..6f29548fcc3 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c @@ -47,13 +47,22 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack * if(nif->sfra!=nif->efra && (rd->cfrasfra || rd->cfra>nif->efra)) { return; /* BAIL OUT RETURN */ } - else { + else if (!G.rendering) { + /* only output files when rendering a sequence - + * otherwise, it overwrites the output files just + * scrubbing through the timeline when the compositor updates */ + return; + } else { CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); ImBuf *ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0); char string[256]; ibuf->rect_float= cbuf->rect; ibuf->dither= rd->dither_intensity; + + if (rd->color_mgt_flag & R_COLOR_MANAGEMENT) + ibuf->profile = IB_PROFILE_LINEAR_RGB; + if(in[1]->data) { CompBuf *zbuf= in[1]->data; if(zbuf->type==CB_VAL && zbuf->x==cbuf->x && zbuf->y==cbuf->y) { diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c index 0a2fe906eb6..4103981af46 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c @@ -41,46 +41,6 @@ static bNodeSocketType cmp_node_rotate_out[]= { { -1, 0, "" } }; -/* function assumes out to be zero'ed, only does RGBA */ -static void bilinear_interpolation_rotate(CompBuf *in, float *out, float u, float v) -{ - float *row1, *row2, *row3, *row4, a, b; - float a_b, ma_b, a_mb, ma_mb; - float empty[4]= {0.0f, 0.0f, 0.0f, 0.0f}; - int y1, y2, x1, x2; - - x1= (int)floor(u); - x2= (int)ceil(u); - y1= (int)floor(v); - y2= (int)ceil(v); - - /* sample area entirely outside image? */ - if(x2<0 || x1>in->x-1 || y2<0 || y1>in->y-1) - return; - - /* sample including outside of edges of image */ - if(x1<0 || y1<0) row1= empty; - else row1= in->rect + in->x * y1 * in->type + in->type*x1; - - if(x1<0 || y2>in->y-1) row2= empty; - else row2= in->rect + in->x * y2 * in->type + in->type*x1; - - if(x2>in->x-1 || y1<0) row3= empty; - else row3= in->rect + in->x * y1 * in->type + in->type*x2; - - if(x2>in->x-1 || y2>in->y-1) row4= empty; - else row4= in->rect + in->x * y2 * in->type + in->type*x2; - - a= u-floor(u); - b= v-floor(v); - a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b); - - out[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0]; - out[1]= ma_mb*row1[1] + a_mb*row3[1] + ma_b*row2[1]+ a_b*row4[1]; - out[2]= ma_mb*row1[2] + a_mb*row3[2] + ma_b*row2[2]+ a_b*row4[2]; - out[3]= ma_mb*row1[3] + a_mb*row3[3] + ma_b*row2[3]+ a_b*row4[3]; -} - /* only supports RGBA nodes now */ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { @@ -91,8 +51,9 @@ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, if(in[0]->data) { CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* note, this returns zero'd image */ - float *ofp, rad, u, v, s, c, centx, centy, miny, maxy, minx, maxx; - int x, y, yo; + float rad, u, v, s, c, centx, centy, miny, maxy, minx, maxx; + int x, y, yo, xo; + ImBuf *ibuf, *obuf; rad= (M_PI*in[1]->vec[0])/180.0f; @@ -106,32 +67,56 @@ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, miny= -centy; maxy= -centy + (float)cbuf->y; - for(y=miny; yrect + 4*yo*stackbuf->x; - - for(x=minx; xx, cbuf->y, 32, 0, 0); + obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0, 0); + + if(ibuf){ + ibuf->rect_float=cbuf->rect; + obuf->rect_float=stackbuf->rect; + + for(y=miny; ycustom1) { + case 0: + neareast_interpolation(ibuf, obuf, u, v, xo, yo); + break ; + case 1: + bilinear_interpolation(ibuf, obuf, u, v, xo, yo); + break; + case 2: + bicubic_interpolation(ibuf, obuf, u, v, xo, yo); + } + } + } + + /* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */ + s= sin(-rad); + c= cos(-rad); + centx= (float)cbuf->xof; centy= (float)cbuf->yof; + stackbuf->xof= (int)( c*centx + s*centy); + stackbuf->yof= (int)(-s*centx + c*centy); } - /* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */ - s= sin(-rad); - c= cos(-rad); - centx= (float)cbuf->xof; centy= (float)cbuf->yof; - stackbuf->xof= (int)( c*centx + s*centy); - stackbuf->yof= (int)(-s*centx + c*centy); /* pass on output and free */ out[0]->data= stackbuf; if(cbuf!=in[0]->data) free_compbuf(cbuf); - } } +static void node_composit_init_rotate(bNode *node) +{ + node->custom1= 1; /* Bilinear Filter*/ +} + bNodeType cmp_node_rotate= { /* *next,*prev */ NULL, NULL, /* type code */ CMP_NODE_ROTATE, @@ -143,7 +128,7 @@ bNodeType cmp_node_rotate= { /* storage */ "", /* execfunc */ node_composit_exec_rotate, /* butfunc */ NULL, - /* initfunc */ NULL, + /* initfunc */ node_composit_init_rotate, /* freestoragefunc */ NULL, /* copystoragefunc */ NULL, /* id */ NULL diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c index d7a9497f41d..9779875b01a 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c @@ -64,6 +64,10 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b else if(node->custom1==CMP_SCALE_SCENEPERCENT) { newx = cbuf->x * (rd->size / 100.0f); newy = cbuf->y * (rd->size / 100.0f); + } + else if (node->custom1==CMP_SCALE_RENDERPERCENT) { + newx= (rd->xsch * rd->size)/100; + newy= (rd->ysch * rd->size)/100; } else { /* CMP_SCALE_ABSOLUTE */ newx= MAX2((int)in[1]->vec[0], 1); newy= MAX2((int)in[2]->vec[0], 1); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c index 0edacd20e6d..d80dd9b0a4b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c @@ -145,29 +145,29 @@ static void node_composit_exec_combhsva(void *data, bNode *node, bNodeStack **in /* input no image? then only color operation */ if((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { - out[0]->vec[0] = in[0]->vec[0]; - out[0]->vec[1] = in[1]->vec[0]; - out[0]->vec[2] = in[2]->vec[0]; - out[0]->vec[3] = in[3]->vec[0]; + out[0]->vec[0] = in[0]->vec[0]; + out[0]->vec[1] = in[1]->vec[0]; + out[0]->vec[2] = in[2]->vec[0]; + out[0]->vec[3] = in[3]->vec[0]; } else { - /* make output size of first available input image */ - CompBuf *cbuf; - CompBuf *stackbuf; + /* make output size of first available input image */ + CompBuf *cbuf; + CompBuf *stackbuf; - /* allocate a CompBuf the size of the first available input */ - if (in[0]->data) cbuf = in[0]->data; - else if (in[1]->data) cbuf = in[1]->data; - else if (in[2]->data) cbuf = in[2]->data; - else cbuf = in[3]->data; + /* allocate a CompBuf the size of the first available input */ + if (in[0]->data) cbuf = in[0]->data; + else if (in[1]->data) cbuf = in[1]->data; + else if (in[2]->data) cbuf = in[2]->data; + else cbuf = in[3]->data; - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ + stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_hsva, CB_VAL, CB_VAL, CB_VAL, CB_VAL); + composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, + in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, + do_comb_hsva, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - out[0]->data= stackbuf; + out[0]->data= stackbuf; } } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c index e42fafe58e5..7b3dfccab50 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c @@ -47,7 +47,7 @@ static void do_sepycca(bNode *node, float *out, float *in) { float y, cb, cr; - rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr); + rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT601); /*divided by 255 to normalize for viewing in */ out[0]= y/255.0; @@ -62,7 +62,7 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in, if(in[0]->data==NULL) { float y, cb, cr; - rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr); + rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601); /*divided by 255 to normalize for viewing in */ out[0]->vec[0] = y/255.0; @@ -136,7 +136,7 @@ static void do_comb_ycca(bNode *node, float *out, float *in1, float *in2, float cb=in2[0]*255; cr=in3[0]*255; - ycc_to_rgb(y,cb,cr, &r, &g, &b); + ycc_to_rgb(y,cb,cr, &r, &g, &b, BLI_YCC_ITU_BT601); out[0] = r; out[1] = g; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c index 889de9d1d18..98bda1bd7fa 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c @@ -61,6 +61,7 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack * CompBuf *cbuf, *buf1, *buf2, *mask; int x, y; float offset; + void *lock; buf1= typecheck_compbuf(in[0]->data, CB_RGBA); buf2= typecheck_compbuf(in[1]->data, CB_RGBA); @@ -68,9 +69,10 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack * BKE_image_user_calc_frame(node->storage, rd->cfra, 0); /* always returns for viewer image, but we check nevertheless */ - ibuf= BKE_image_get_ibuf(ima, node->storage); + ibuf= BKE_image_acquire_ibuf(ima, node->storage, &lock); if(ibuf==NULL) { printf("node_composit_exec_viewer error\n"); + BKE_image_release_ibuf(ima, lock); return; } @@ -121,6 +123,8 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack * composit3_pixel_processor(node, cbuf, buf1, in[0]->vec, buf2, in[1]->vec, mask, NULL, do_copy_split_rgba, CB_RGBA, CB_RGBA, CB_VAL); + BKE_image_release_ibuf(ima, lock); + generate_preview(data, node, cbuf); free_compbuf(cbuf); free_compbuf(mask); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c index b130b3f38a8..f990fa452cb 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c @@ -95,10 +95,11 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in, /* first make the preview image */ CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */ - - sizex = rd->xsch; - sizey = rd->ysch; - + + /* Also take care about the render size! */ + sizex = (rd->size*rd->xsch)/100; + sizey = (rd->size*rd->ysch)/100; + prevbuf->rect_procedural= texture_procedural; prevbuf->node= node; VECCOPY(prevbuf->procedural_offset, in[0]->vec); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c index e62a7462702..80200ad9ce6 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c @@ -50,13 +50,15 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, ImBuf *ibuf; CompBuf *cbuf, *tbuf; int rectx, recty; + void *lock; BKE_image_user_calc_frame(node->storage, rd->cfra, 0); /* always returns for viewer image, but we check nevertheless */ - ibuf= BKE_image_get_ibuf(ima, node->storage); + ibuf= BKE_image_acquire_ibuf(ima, node->storage, &lock); if(ibuf==NULL) { printf("node_composit_exec_viewer error\n"); + BKE_image_release_ibuf(ima, lock); return; } @@ -106,6 +108,8 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, free_compbuf(zbuf); } + BKE_image_release_ibuf(ima, lock); + generate_preview(data, node, cbuf); free_compbuf(cbuf); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c index 020b3797074..7be9f34f00b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c @@ -31,7 +31,7 @@ /* **************** Z COMBINE ******************** */ - /* lazy coder note: node->custom1 is abused to send signal */ + /* lazy coder note: node->custom1 is abused to send signal */ static bNodeSocketType cmp_node_zcombine_in[]= { { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f}, diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c index 7d080304905..f3e00cb37f8 100644 --- a/source/blender/nodes/intern/CMP_util.c +++ b/source/blender/nodes/intern/CMP_util.c @@ -73,7 +73,7 @@ CompBuf *dupalloc_compbuf(CompBuf *cbuf) /* instead of reference counting, we create a list */ CompBuf *pass_on_compbuf(CompBuf *cbuf) { - CompBuf *dupbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 0); + CompBuf *dupbuf= (cbuf)? alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 0): NULL; CompBuf *lastbuf; if(dupbuf) { @@ -122,6 +122,11 @@ void print_compbuf(char *str, CompBuf *cbuf) } +void compbuf_set_node(CompBuf *cbuf, bNode *node) +{ + if (cbuf) cbuf->node = node; +} + /* used for disabling node (similar code in drawnode.c for disable line) */ void node_compo_pass_on(bNode *node, bNodeStack **nsin, bNodeStack **nsout) { @@ -573,9 +578,9 @@ CompBuf *valbuf_from_rgbabuf(CompBuf *cbuf, int channel) valbuf->yof= cbuf->yof; valf= valbuf->rect; - + /* defaults to returning alpha channel */ - if ((channel < CHAN_R) && (channel > CHAN_A)) channel = CHAN_A; + if ((channel < CHAN_R) || (channel > CHAN_A)) channel = CHAN_A; rectf= cbuf->rect + channel; @@ -671,7 +676,7 @@ void do_rgba_to_hsva(bNode *node, float *out, float *in) void do_rgba_to_ycca(bNode *node, float *out, float *in) { - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } @@ -689,7 +694,7 @@ void do_hsva_to_rgba(bNode *node, float *out, float *in) void do_ycca_to_rgba(bNode *node, float *out, float *in) { - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); out[3]=in[3]; } @@ -725,18 +730,18 @@ void gamma_correct_compbuf(CompBuf *img, int inversed) drect= img->rect; if(inversed) { - for(x=img->x*img->y; x>0; x--, drect+=4) { - if(drect[0]>0.0f) drect[0]= sqrt(drect[0]); else drect[0]= 0.0f; - if(drect[1]>0.0f) drect[1]= sqrt(drect[1]); else drect[1]= 0.0f; - if(drect[2]>0.0f) drect[2]= sqrt(drect[2]); else drect[2]= 0.0f; - } + for(x=img->x*img->y; x>0; x--, drect+=4) { + if(drect[0]>0.0f) drect[0]= sqrt(drect[0]); else drect[0]= 0.0f; + if(drect[1]>0.0f) drect[1]= sqrt(drect[1]); else drect[1]= 0.0f; + if(drect[2]>0.0f) drect[2]= sqrt(drect[2]); else drect[2]= 0.0f; + } } else { - for(x=img->x*img->y; x>0; x--, drect+=4) { - if(drect[0]>0.0f) drect[0]*= drect[0]; else drect[0]= 0.0f; - if(drect[1]>0.0f) drect[1]*= drect[1]; else drect[1]= 0.0f; - if(drect[2]>0.0f) drect[2]*= drect[2]; else drect[2]= 0.0f; - } + for(x=img->x*img->y; x>0; x--, drect+=4) { + if(drect[0]>0.0f) drect[0]*= drect[0]; else drect[0]= 0.0f; + if(drect[1]>0.0f) drect[1]*= drect[1]; else drect[1]= 0.0f; + if(drect[2]>0.0f) drect[2]*= drect[2]; else drect[2]= 0.0f; + } } } @@ -749,7 +754,7 @@ void premul_compbuf(CompBuf *img, int inversed) drect= img->rect; if(inversed) { - for(x=img->x*img->y; x>0; x--, drect+=4) { + for(x=img->x*img->y; x>0; x--, drect+=4) { if(fabs(drect[3]) < 1e-5f) { drect[0]= 0.0f; drect[1]= 0.0f; @@ -760,14 +765,14 @@ void premul_compbuf(CompBuf *img, int inversed) drect[1] /= drect[3]; drect[2] /= drect[3]; } - } + } } else { - for(x=img->x*img->y; x>0; x--, drect+=4) { + for(x=img->x*img->y; x>0; x--, drect+=4) { drect[0] *= drect[3]; drect[1] *= drect[3]; drect[2] *= drect[3]; - } + } } } diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/intern/CMP_util.h index ae3fe97b21a..9dfea6abf54 100644 --- a/source/blender/nodes/intern/CMP_util.h +++ b/source/blender/nodes/intern/CMP_util.h @@ -110,6 +110,7 @@ CompBuf *dupalloc_compbuf(CompBuf *cbuf); CompBuf *pass_on_compbuf(CompBuf *cbuf); void free_compbuf(CompBuf *cbuf); void print_compbuf(char *str, CompBuf *cbuf); +void compbuf_set_node(struct CompBuf *cbuf, struct bNode *node); void node_compo_pass_on(struct bNode *node, struct bNodeStack **nsin, struct bNodeStack **nsout); CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, int type); @@ -185,8 +186,8 @@ typedef float fRGB[4]; #define fRGB_rgbmult(c, r, g, b) { c[0]*=(r); c[1]*=(g); c[2]*=(b); } /* swap colors c1 & c2 */ #define fRGB_swap(c1, c2) { float _t=c1[0]; c1[0]=c2[0]; c2[0]=_t;\ - _t=c1[1]; c1[1]=c2[1]; c2[1]=_t;\ - _t=c1[2]; c1[2]=c2[2]; c2[2]=_t;\ + _t=c1[1]; c1[1]=c2[1]; c2[1]=_t;\ + _t=c1[2]; c1[2]=c2[2]; c2[2]=_t;\ _t=c1[3]; c1[3]=c2[3]; c3[3]=_t;} void qd_getPixel(CompBuf* src, int x, int y, float* col); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c index ab1bec199f3..aefe7d104b5 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c @@ -54,7 +54,6 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNod NodeGeometry *ngeo= (NodeGeometry*)node->storage; ShadeInputUV *suv= &shi->uv[shi->actuv]; static float defaultvcol[4] = {1.0f, 1.0f, 1.0f, 1.0f}; - static float front= 0.0; int i; if(ngeo->uvname[0]) { @@ -109,14 +108,8 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNod out[GEOM_OUT_NORMAL]->datatype= NS_OSA_VECTORS; } - /* front/back - * check the original un-flipped normals to determine front or back side */ - if (shi->orignor[2] < FLT_EPSILON) { - front= 1.0f; - } else { - front = 0.0f; - } - out[GEOM_OUT_FRONTBACK]->vec[0]= front; + /* front/back, normal flipping was stored */ + out[GEOM_OUT_FRONTBACK]->vec[0]= (shi->flippednor)? 0.0f: 1.0f; } } diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/intern/SHD_nodes/SHD_material.c index d216ddf565a..4395eef0a5f 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_material.c @@ -138,7 +138,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, if(node->custom1 & SH_NODE_MAT_DIFF) { VECCOPY(col, shrnode.combined); if(!(node->custom1 & SH_NODE_MAT_SPEC)) { - sub_v3_v3v3(col, col, shrnode.spec); + sub_v3_v3(col, shrnode.spec); } } else if(node->custom1 & SH_NODE_MAT_SPEC) { @@ -173,8 +173,17 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, } /* copy passes, now just active node */ - if(node->flag & NODE_ACTIVE_ID) + if(node->flag & NODE_ACTIVE_ID) { + float combined[4], alpha; + + copy_v4_v4(combined, shcd->shr->combined); + alpha= shcd->shr->alpha; + *(shcd->shr)= shrnode; + + copy_v4_v4(shcd->shr->combined, combined); + shcd->shr->alpha= alpha; + } } } diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c index 18972aa4b0b..926dcd0f046 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c @@ -51,7 +51,7 @@ bNodeStack **out) nodestack_get_vec(vec+1, SOCK_VALUE, in[1]); nodestack_get_vec(vec+2, SOCK_VALUE, in[2]); - out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ; + out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ; } static int gpu_shader_squeeze(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c index 16b65a4b0be..3e7ef0e94fe 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c @@ -111,24 +111,24 @@ static int count_outputs(bNode *node) /* Boilerplate generators */ #define ProcNoInputs(name) \ - static void name##_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) \ - {} + static void name##_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) \ + {} #define ProcDef(name) \ - static void name##_colorfn(float *result, TexParams *p, bNode *node, bNodeStack **in, short thread) \ - { \ - texfn(result, p, node, in, 0, &name##_map_inputs, thread); \ - } \ - static void name##_normalfn(float *result, TexParams *p, bNode *node, bNodeStack **in, short thread) \ - { \ - texfn(result, p, node, in, 1, &name##_map_inputs, thread); \ - } \ - static void name##_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) \ - { \ - int outs = count_outputs(node); \ - if(outs >= 1) tex_output(node, in, out[0], &name##_colorfn, data); \ - if(outs >= 2) tex_output(node, in, out[1], &name##_normalfn, data); \ - } + static void name##_colorfn(float *result, TexParams *p, bNode *node, bNodeStack **in, short thread) \ + { \ + texfn(result, p, node, in, 0, &name##_map_inputs, thread); \ + } \ + static void name##_normalfn(float *result, TexParams *p, bNode *node, bNodeStack **in, short thread) \ + { \ + texfn(result, p, node, in, 1, &name##_map_inputs, thread); \ + } \ + static void name##_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) \ + { \ + int outs = count_outputs(node); \ + if(outs >= 1) tex_output(node, in, out[0], &name##_colorfn, data); \ + if(outs >= 2) tex_output(node, in, out[1], &name##_normalfn, data); \ + } /* --- VORONOI -- */ diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c index 31b669991ad..9a855938eef 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c @@ -72,8 +72,10 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor tex_input_vec(ax, in[2], p, thread); rotate(new_co, a, ax, p->co); - rotate(new_dxt, a, ax, p->dxt); - rotate(new_dyt, a, ax, p->dyt); + if (p->osatex) { + rotate(new_dxt, a, ax, p->dxt); + rotate(new_dyt, a, ax, p->dyt); + } { TexParams np = *p; diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c index 609b117e5be..721c322c540 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c @@ -52,8 +52,10 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor tex_input_vec(scale, in[1], p, thread); mul_v3_v3v3(new_co, p->co, scale); - mul_v3_v3v3(new_dxt, p->dxt, scale); - mul_v3_v3v3(new_dyt, p->dyt, scale); + if (p->osatex) { + mul_v3_v3v3(new_dxt, p->dxt, scale); + mul_v3_v3v3(new_dyt, p->dyt, scale); + } tex_input_rgba(out, in[0], &np, thread); } diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c index f471198d8ee..dc31685827f 100644 --- a/source/blender/nodes/intern/TEX_util.c +++ b/source/blender/nodes/intern/TEX_util.c @@ -35,11 +35,11 @@ the TexDelegate* from its input stack, and uses tex_call_delegate to retrieve the colour from the delegate. - comments: (ton) + comments: (ton) - This system needs recode, a node system should rely on the stack, and + This system needs recode, a node system should rely on the stack, and callbacks for nodes only should evaluate own node, not recursively go - over other previous ones. + over other previous ones. */ #include diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 0d9bf8a7ffe..40d544ac17e 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -67,11 +67,11 @@ extern "C" { some_drawspace_pylist = PyList_New(0); BPy_Set_DrawButtonsList(some_drawspace_pylist); - Also, BPy_Free_DrawButtonsList() must be called as necassary when a drawspace - with python callbacks is destroyed. + Also, BPy_Free_DrawButtonsList() must be called as necassary when a drawspace + with python callbacks is destroyed. - This is necassary to avoid blender buttons storing invalid pointers to freed - python data.*/ + This is necassary to avoid blender buttons storing invalid pointers to freed + python data.*/ // void BPy_Set_DrawButtonsList(void *list); // void BPy_Free_DrawButtonsList(void); // @@ -119,9 +119,11 @@ extern "C" { // short eventValue, unsigned short space_event); // // void BPY_pydriver_update(void); - float BPY_pydriver_eval(struct ChannelDriver *driver); + float BPY_eval_driver(struct ChannelDriver *driver); // - int BPY_button_eval(struct bContext *C, char *expr, double *value); + int BPY_eval_button(struct bContext *C, const char *expr, double *value); + + int BPY_eval_string(struct bContext *C, const char *expr); /* format importer hook */ int BPY_call_importloader( char *name ); diff --git a/source/blender/python/doc/epy/BGL.py b/source/blender/python/doc/epy/BGL.py index b054e762273..ce148dc72ba 100644 --- a/source/blender/python/doc/epy/BGL.py +++ b/source/blender/python/doc/epy/BGL.py @@ -318,6 +318,34 @@ def glCopyPixels(x, y, width, height, type): @type type: Enumerated constant @param type: Specifies whether color values, depth values, or stencil values are to be copied. """ + + def glCopyTexImage2D(target, level, internalformat, x, y, width, height, border): + """ + Copy pixels into a 2D texture image + @see: U{www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml} + + @type target: Enumerated constant + @param target: Specifies the target texture. + @type level: int + @param level: Specifies the level-of-detail number. Level 0 is the base image level. + Level n is the nth mipmap reduction image. + @type internalformat: int + @param internalformat: Specifies the number of color components in the texture. + @type width: int + @type x, y: int + @param x, y:Specify the window coordinates of the first pixel that is copied + from the frame buffer. This location is the lower left corner of a rectangular + block of pixels. + @param width: Specifies the width of the texture image. Must be 2n+2(border) for + some integer n. All implementations support texture images that are at least 64 + texels wide. + @type height: int + @param height: Specifies the height of the texture image. Must be 2m+2(border) for + some integer m. All implementations support texture images that are at least 64 + texels high. + @type border: int + @param border: Specifies the width of the border. Must be either 0 or 1. + """ def glCullFace(mode): """ diff --git a/source/blender/python/doc/epy/Geometry.py b/source/blender/python/doc/epy/Geometry.py index 237cd8c3443..717c147b215 100644 --- a/source/blender/python/doc/epy/Geometry.py +++ b/source/blender/python/doc/epy/Geometry.py @@ -101,7 +101,7 @@ def PolyFill(polylines): The example below creates 2 polylines and fills them in with faces, then makes a mesh in the current scene:: import Blender - Vector= Blender.Mathutils.Vector + Vector= Blender.mathutils.Vector # Outline of 5 points polyline1= [Vector(-2.0, 1.0, 1.0), Vector(-1.0, 2.0, 1.0), Vector(1.0, 2.0, 1.0), Vector(1.0, -1.0, 1.0), Vector(-1.0, -1.0, 1.0)] diff --git a/source/blender/python/doc/epy/Mathutils.py b/source/blender/python/doc/epy/Mathutils.py index b1bb039debe..17a227f729a 100644 --- a/source/blender/python/doc/epy/Mathutils.py +++ b/source/blender/python/doc/epy/Mathutils.py @@ -1,4 +1,4 @@ -# Blender.Mathutils module and its subtypes +# Blender.mathutils module and its subtypes diff --git a/source/blender/python/doc/examples/Mathutils.Euler.py b/source/blender/python/doc/examples/Mathutils.Euler.py deleted file mode 100644 index 0e7a62162d9..00000000000 --- a/source/blender/python/doc/examples/Mathutils.Euler.py +++ /dev/null @@ -1,3 +0,0 @@ -import Mathutils - -# todo \ No newline at end of file diff --git a/source/blender/python/doc/examples/Mathutils.Matrix.py b/source/blender/python/doc/examples/Mathutils.Matrix.py deleted file mode 100644 index 0e7a62162d9..00000000000 --- a/source/blender/python/doc/examples/Mathutils.Matrix.py +++ /dev/null @@ -1,3 +0,0 @@ -import Mathutils - -# todo \ No newline at end of file diff --git a/source/blender/python/doc/examples/Mathutils.Quaternion.py b/source/blender/python/doc/examples/Mathutils.Quaternion.py deleted file mode 100644 index 0e7a62162d9..00000000000 --- a/source/blender/python/doc/examples/Mathutils.Quaternion.py +++ /dev/null @@ -1,3 +0,0 @@ -import Mathutils - -# todo \ No newline at end of file diff --git a/source/blender/python/doc/examples/Mathutils.py b/source/blender/python/doc/examples/Mathutils.py deleted file mode 100644 index a00ca3dd1c8..00000000000 --- a/source/blender/python/doc/examples/Mathutils.py +++ /dev/null @@ -1,17 +0,0 @@ -import Mathutils - -vec = Mathutils.Vector(1.0, 2.0, 3.0) - -mat_rot = Mathutils.RotationMatrix(90, 4, 'X') -mat_trans = Mathutils.TranslationMatrix(vec) - -mat = mat_trans * mat_rot -mat.invert() - -mat3 = mat.rotation_part() -quat1 = mat.to_quat() -quat2 = mat3.to_quat() - -angle = quat1.difference(quat2) - -print(angle) \ No newline at end of file diff --git a/source/blender/python/doc/examples/bpy.data.py b/source/blender/python/doc/examples/bpy.data.py new file mode 100644 index 00000000000..fc1145a523f --- /dev/null +++ b/source/blender/python/doc/examples/bpy.data.py @@ -0,0 +1,29 @@ +import bpy + + +# print all objects +for obj in bpy.data.objects: + print(obj.name) + + +# print all scene names in a list +print(bpy.data.scenes.keys()) + + +# remove mesh Cube +if "Cube" in bpy.data.meshes: + mesh = bpy.data.meshes["Cube"] + print("removing mesh", mesh) + bpy.data.meshes.unlink(mesh) + + +# write images into a file next to the blend +import os +file = open(os.path.splitext(bpy.data.filepath)[0] + ".txt", 'w') + +for image in bpy.data.images: + file.write("%s %dx%d\n" % (image.filepath, image.size[0], image.size[1])) + +file.close() + + diff --git a/source/blender/python/doc/examples/mathutils.Euler.py b/source/blender/python/doc/examples/mathutils.Euler.py new file mode 100644 index 00000000000..f8294ce5545 --- /dev/null +++ b/source/blender/python/doc/examples/mathutils.Euler.py @@ -0,0 +1,3 @@ +import mathutils + +# todo \ No newline at end of file diff --git a/source/blender/python/doc/examples/mathutils.Matrix.py b/source/blender/python/doc/examples/mathutils.Matrix.py new file mode 100644 index 00000000000..f8294ce5545 --- /dev/null +++ b/source/blender/python/doc/examples/mathutils.Matrix.py @@ -0,0 +1,3 @@ +import mathutils + +# todo \ No newline at end of file diff --git a/source/blender/python/doc/examples/mathutils.Quaternion.py b/source/blender/python/doc/examples/mathutils.Quaternion.py new file mode 100644 index 00000000000..f8294ce5545 --- /dev/null +++ b/source/blender/python/doc/examples/mathutils.Quaternion.py @@ -0,0 +1,3 @@ +import mathutils + +# todo \ No newline at end of file diff --git a/source/blender/python/doc/examples/Mathutils.Vector.py b/source/blender/python/doc/examples/mathutils.Vector.py similarity index 79% rename from source/blender/python/doc/examples/Mathutils.Vector.py rename to source/blender/python/doc/examples/mathutils.Vector.py index 8b3dbfa5ee8..fb00e8aead6 100644 --- a/source/blender/python/doc/examples/Mathutils.Vector.py +++ b/source/blender/python/doc/examples/mathutils.Vector.py @@ -1,20 +1,20 @@ -import Mathutils +import mathutils # zero length vector -vec = Mathutils.Vector(0, 0, 1) +vec = mathutils.Vector((0, 0, 1)) # unit length vector vec_a = vec.copy().normalize() -vec_b = Mathutils.Vector(0, 1, 2) +vec_b = mathutils.Vector((0, 1, 2)) -vec2d = Mathutils.Vector(1, 2) -vec3d = Mathutils.Vector([1, 0, 0]) +vec2d = mathutils.Vector((1, 2)) +vec3d = mathutils.Vector((1, 0, 0)) vec4d = vec_a.copy().resize4D() # other mathutuls types -quat = Mathutils.Quaternion() -matrix = Mathutils.Matrix() +quat = mathutils.Quaternion() +matrix = mathutils.Matrix() # Comparison operators can be done on Vector classes: diff --git a/source/blender/python/doc/examples/mathutils.py b/source/blender/python/doc/examples/mathutils.py new file mode 100644 index 00000000000..4a5de5887c9 --- /dev/null +++ b/source/blender/python/doc/examples/mathutils.py @@ -0,0 +1,18 @@ +import mathutils +from math import radians + +vec = mathutils.Vector((1.0, 2.0, 3.0)) + +mat_rot = mathutils.RotationMatrix(radians(90), 4, 'X') +mat_trans = mathutils.TranslationMatrix(vec) + +mat = mat_trans * mat_rot +mat.invert() + +mat3 = mat.rotation_part() +quat1 = mat.to_quat() +quat2 = mat3.to_quat() + +angle = quat1.difference(quat2) + +print(angle) \ No newline at end of file diff --git a/source/blender/python/doc/sphinx_doc_gen.py b/source/blender/python/doc/sphinx_doc_gen.py index 701aad651cf..27524c66c36 100644 --- a/source/blender/python/doc/sphinx_doc_gen.py +++ b/source/blender/python/doc/sphinx_doc_gen.py @@ -24,7 +24,7 @@ run this script from blenders root path once you have compiled blender ./blender.bin -b -P /b/source/blender/python/doc/sphinx_doc_gen.py This will generate python files in "./source/blender/python/doc/sphinx-in" -Generate html docs by running... +Generate html docs by running... sphinx-build source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out @@ -36,6 +36,7 @@ For PDF generation make ''' +# import rpdb2; rpdb2.start_embedded_debugger('test') import os import inspect @@ -43,10 +44,29 @@ import bpy import rna_info reload(rna_info) +# lame, python wont give some access +MethodDescriptorType = type(dict.get) +GetSetDescriptorType = type(int.real) + EXAMPLE_SET = set() EXAMPLE_SET_USED = set() +_BPY_STRUCT_FAKE = "bpy_struct" +_BPY_FULL_REBUILD = False + +def undocumented_message(module_name, type_name, identifier): + message = "Undocumented (`contribute " \ + "`_)\n\n" % (module_name, type_name, identifier) + return message + + def range_str(val): + ''' + Converts values to strings for the range directive. + (unused function it seems) + ''' if val < -10000000: return '-inf' if val > 10000000: return 'inf' if type(val)==float: @@ -55,9 +75,9 @@ def range_str(val): return str(val) -def write_example_ref(ident, fw, example_id, ext=".py"): +def write_example_ref(ident, fw, example_id, ext="py"): if example_id in EXAMPLE_SET: - fw("%s.. literalinclude:: ../examples/%s%s\n\n" % (ident, example_id, ext)) + fw("%s.. literalinclude:: ../examples/%s.%s\n\n" % (ident, example_id, ext)) EXAMPLE_SET_USED.add(example_id) else: if bpy.app.debug: @@ -65,6 +85,9 @@ def write_example_ref(ident, fw, example_id, ext=".py"): def write_indented_lines(ident, fn, text, strip=True): + ''' + Apply same indentation to all lines in a multilines text. + ''' if text is None: return for l in text.split("\n"): @@ -118,7 +141,26 @@ def pyfunc2sphinx(ident, fw, identifier, py_func, is_class=True): write_indented_lines(ident + " ", fw, py_func.__doc__.strip()) fw("\n") -def py_c_func2sphinx(ident, fw, identifier, py_func, is_class=True): + +def py_descr2sphinx(ident, fw, descr, module_name, type_name, identifier): + + doc = descr.__doc__ + if not doc: + doc = undocumented_message(module_name, type_name, identifier) + + if type(descr) == GetSetDescriptorType: + fw(ident + ".. attribute:: %s\n\n" % identifier) + write_indented_lines(ident + " ", fw, doc, False) + elif type(descr) == MethodDescriptorType: # GetSetDescriptorType's are not documented yet + write_indented_lines(ident, fw, doc, False) + else: + raise TypeError("type was not GetSetDescriptorType or MethodDescriptorType") + + write_example_ref(ident, fw, module_name + "." + type_name + "." + identifier) + fw("\n") + + +def py_c_func2sphinx(ident, fw, module_name, type_name, identifier, py_func, is_class=True): ''' c defined function to sphinx. ''' @@ -129,14 +171,18 @@ def py_c_func2sphinx(ident, fw, identifier, py_func, is_class=True): fw("\n") else: fw(ident + ".. function:: %s()\n\n" % identifier) - fw(ident + " Undocumented function.\n\n" % identifier) + fw(ident + " " + undocumented_message(module_name, type_name, identifier)) def pyprop2sphinx(ident, fw, identifier, py_prop): ''' python property to sphinx ''' - fw(ident + ".. attribute:: %s\n\n" % identifier) + # readonly properties use "data" directive, variables use "attribute" directive + if py_prop.fset is None: + fw(ident + ".. data:: %s\n\n" % identifier) + else: + fw(ident + ".. attribute:: %s\n\n" % identifier) write_indented_lines(ident + " ", fw, py_prop.__doc__) if py_prop.fset is None: fw(ident + " (readonly)\n\n") @@ -144,12 +190,7 @@ def pyprop2sphinx(ident, fw, identifier, py_prop): def pymodule2sphinx(BASEPATH, module_name, module, title): import types - # lame, python wont give some access - MethodDescriptorType = type(dict.get) - GetSetDescriptorType = type(int.real) - - - + attribute_set = set() filepath = os.path.join(BASEPATH, module_name + ".rst") file = open(filepath, "w") @@ -170,18 +211,26 @@ def pymodule2sphinx(BASEPATH, module_name, module, title): # write members of the module # only tested with PyStructs which are not exactly modules - for attribute, descr in sorted(type(module).__dict__.items()): + for key, descr in sorted(type(module).__dict__.items()): if type(descr) == types.MemberDescriptorType: if descr.__doc__: - fw(".. data:: %s\n\n" % attribute) + fw(".. data:: %s\n\n" % key) write_indented_lines(" ", fw, descr.__doc__, False) + attribute_set.add(key) fw("\n") - + del key, descr classes = [] - for attribute in dir(module): + for attribute in sorted(dir(module)): if not attribute.startswith("_"): + + if attribute in attribute_set: + continue + + if attribute.startswith("n_"): # annoying exception, needed for bpy.app + continue + value = getattr(module, attribute) value_type = type(value) @@ -191,41 +240,41 @@ def pymodule2sphinx(BASEPATH, module_name, module, title): elif value_type in (types.BuiltinMethodType, types.BuiltinFunctionType): # both the same at the moment but to be future proof # note: can't get args from these, so dump the string as is # this means any module used like this must have fully formatted docstrings. - py_c_func2sphinx("", fw, attribute, value, is_class=False) + py_c_func2sphinx("", fw, module_name, module, attribute, value, is_class=False) elif value_type == type: classes.append((attribute, value)) + elif value_type in (bool, int, float, str, tuple): + # constant, not much fun we can do here except to list it. + # TODO, figure out some way to document these! + fw(".. data:: %s\n\n" % attribute) + write_indented_lines(" ", fw, "constant value %s" % repr(value), False) + fw("\n") + else: + print("\tnot documenting %s.%s" % (module_name, attribute)) + continue + + attribute_set.add(attribute) # TODO, more types... - + # write collected classes now - for (attribute, value) in classes: + for (type_name, value) in classes: # May need to be its own function - fw(".. class:: %s\n\n" % attribute) + fw(".. class:: %s\n\n" % type_name) if value.__doc__: write_indented_lines(" ", fw, value.__doc__, False) fw("\n") - write_example_ref(" ", fw, module_name + "." + attribute) + write_example_ref(" ", fw, module_name + "." + type_name) - for key in sorted(value.__dict__.keys()): - if key.startswith("__"): - continue - descr = value.__dict__[key] + descr_items = [(key, descr) for key, descr in sorted(value.__dict__.items()) if not key.startswith("__")] + + for key, descr in descr_items: + if type(descr) == MethodDescriptorType: # GetSetDescriptorType's are not documented yet + py_descr2sphinx(" ", fw, descr, module_name, type_name, key) + + for key, descr in descr_items: if type(descr) == GetSetDescriptorType: - if descr.__doc__: - fw(" .. attribute:: %s\n\n" % key) - write_indented_lines(" ", fw, descr.__doc__, False) - write_example_ref(" ", fw, module_name + "." + attribute + "." + key) - fw("\n") + py_descr2sphinx(" ", fw, descr, module_name, type_name, key) - for key in sorted(value.__dict__.keys()): - if key.startswith("__"): - continue - descr = value.__dict__[key] - if type(descr) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet - if descr.__doc__: - write_indented_lines(" ", fw, descr.__doc__, False) - write_example_ref(" ", fw, module_name + "." + attribute + "." + key) - fw("\n") - fw("\n\n") file.close() @@ -251,11 +300,14 @@ def rna2sphinx(BASEPATH): if bpy.app.build_revision != "Unknown": version_string = version_string + " r" + bpy.app.build_revision - fw("project = 'Blender 3D'\n") + fw("project = 'Blender'\n") # fw("master_doc = 'index'\n") fw("copyright = u'Blender Foundation'\n") fw("version = '%s - UNSTABLE API'\n" % version_string) fw("release = '%s - UNSTABLE API'\n" % version_string) + fw("html_theme = 'blender-org'\n") + fw("html_theme_path = ['../']\n") + fw("html_favicon = 'favicon.ico'\n") # not helpful since the source us generated, adds to upload size. fw("html_copy_source = False\n") fw("\n") @@ -275,12 +327,15 @@ def rna2sphinx(BASEPATH): fw("\n") fw("This document is an API reference for Blender %s. built %s.\n" % (version_string, bpy.app.build_date)) fw("\n") - fw("An introduction to blender and python can be found at \n") + fw("An introduction to Blender and Python can be found at \n") + fw("\n") + fw("`A PDF version of this document is also available `__\n") fw("\n") fw(".. warning:: The Python API in Blender is **UNSTABLE**, It should only be used for testing, any script written now may break in future releases.\n") fw(" \n") fw(" The following areas are subject to change.\n") fw(" * operator names and arguments\n") + fw(" * render api\n") fw(" * function calls with the data api (any function calls with values accessed from bpy.data), including functions for importing and exporting meshes\n") fw(" * class registration (Operator, Panels, Menus, Headers)\n") fw(" * modules: bpy.props, blf)\n") @@ -290,10 +345,16 @@ def rna2sphinx(BASEPATH): fw(" These parts of the API are relatively stable and are unlikely to change significantly\n") fw(" * data API, access to attributes of blender data such as mesh verts, material color, timeline frames and scene objects\n") fw(" * user interface functions for defining buttons, creation of menus, headers, panels\n") - fw(" * modules: bgl, Mathutils and Geometry\n") + fw(" * modules: bgl, mathutils and geometry\n") + fw("\n") + + fw("===================\n") + fw("Application Modules\n") + fw("===================\n") fw("\n") fw(".. toctree::\n") fw(" :maxdepth: 1\n\n") + fw(" bpy.data.rst\n\n") # note: not actually a module fw(" bpy.ops.rst\n\n") fw(" bpy.types.rst\n\n") @@ -303,9 +364,30 @@ def rna2sphinx(BASEPATH): # C modules fw(" bpy.props.rst\n\n") - - fw(" Mathutils.rst\n\n") + + fw("==================\n") + fw("Standalone Modules\n") + fw("==================\n") + fw("\n") + fw(".. toctree::\n") + fw(" :maxdepth: 1\n\n") + + + fw(" mathutils.rst\n\n") fw(" blf.rst\n\n") + + # game engine + fw("===================\n") + fw("Game Engine Modules\n") + fw("===================\n") + fw("\n") + fw(".. toctree::\n") + fw(" :maxdepth: 1\n\n") + fw(" bge.types.rst\n\n") + fw(" bge.logic.rst\n\n") + fw(" bge.render.rst\n\n") + fw(" bge.events.rst\n\n") + file.close() @@ -313,8 +395,8 @@ def rna2sphinx(BASEPATH): filepath = os.path.join(BASEPATH, "bpy.ops.rst") file = open(filepath, "w") fw = file.write - fw("Blender Operators (bpy.ops)\n") - fw("===========================\n\n") + fw("Operators (bpy.ops)\n") + fw("===================\n\n") fw(".. toctree::\n") fw(" :glob:\n\n") fw(" bpy.ops.*\n\n") @@ -323,14 +405,36 @@ def rna2sphinx(BASEPATH): filepath = os.path.join(BASEPATH, "bpy.types.rst") file = open(filepath, "w") fw = file.write - fw("Blender Types (bpy.types)\n") - fw("=========================\n\n") + fw("Types (bpy.types)\n") + fw("=================\n\n") fw(".. toctree::\n") fw(" :glob:\n\n") fw(" bpy.types.*\n\n") file.close() + # not actually a module, only write this file so we + # can reference in the TOC + filepath = os.path.join(BASEPATH, "bpy.data.rst") + file = open(filepath, "w") + fw = file.write + fw("Data Access (bpy.data)\n") + fw("======================\n\n") + fw(".. module:: bpy\n") + fw("\n") + fw("This module is used for all blender/python access.\n") + fw("\n") + fw(".. literalinclude:: ../examples/bpy.data.py\n") + fw("\n") + fw(".. data:: data\n") + fw("\n") + fw(" Access to blenders internal data\n") + fw("\n") + fw(" :type: :class:`bpy.types.Main`\n") + file.close() + + EXAMPLE_SET_USED.add("bpy.data") + # python modules from bpy import utils as module @@ -343,14 +447,23 @@ def rna2sphinx(BASEPATH): from bpy import props as module pymodule2sphinx(BASEPATH, "bpy.props", module, "Property Definitions (bpy.props)") - import Mathutils as module - pymodule2sphinx(BASEPATH, "Mathutils", module, "Math Types & Utilities (Mathutils)") + import mathutils as module + pymodule2sphinx(BASEPATH, "mathutils", module, "Math Types & Utilities (mathutils)") del module import blf as module - pymodule2sphinx(BASEPATH, "blf", module, "Blender Font Drawing (blf)") + pymodule2sphinx(BASEPATH, "blf", module, "Font Drawing (blf)") del module + # game engine + import shutil + # copy2 keeps time/date stamps + shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.types.rst"), BASEPATH) + shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.logic.rst"), BASEPATH) + shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.render.rst"), BASEPATH) + shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.events.rst"), BASEPATH) + + if 0: filepath = os.path.join(BASEPATH, "bpy.rst") file = open(filepath, "w") @@ -391,8 +504,14 @@ def rna2sphinx(BASEPATH): file = open(filepath, "w") fw = file.write - if struct.base: - title = "%s(%s)" % (struct.identifier, struct.base.identifier) + base_id = getattr(struct.base, "identifier", "") + + if _BPY_STRUCT_FAKE: + if not base_id: + base_id = _BPY_STRUCT_FAKE + + if base_id: + title = "%s(%s)" % (struct.identifier, base_id) else: title = struct.identifier @@ -400,37 +519,54 @@ def rna2sphinx(BASEPATH): fw(".. module:: bpy.types\n\n") - bases = struct.get_bases() - if bases: - if len(bases) > 1: + base_ids = [base.identifier for base in struct.get_bases()] + + if _BPY_STRUCT_FAKE: + base_ids.append(_BPY_STRUCT_FAKE) + + base_ids.reverse() + + if base_ids: + if len(base_ids) > 1: fw("base classes --- ") else: fw("base class --- ") - fw(", ".join([(":class:`%s`" % base.identifier) for base in reversed(bases)])) + fw(", ".join([(":class:`%s`" % base_id) for base_id in base_ids])) fw("\n\n") - subclasses = [s for s in structs.values() if s.base is struct] + subclass_ids = [s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier)] + if subclass_ids: + fw("subclasses --- \n" + ", ".join([(":class:`%s`" % s) for s in subclass_ids]) + "\n\n") - if subclasses: - fw("subclasses --- \n") - fw(", ".join([(":class:`%s`" % s.identifier) for s in subclasses])) - fw("\n\n") + base_id = getattr(struct.base, "identifier", "") + + if _BPY_STRUCT_FAKE: + if not base_id: + base_id = _BPY_STRUCT_FAKE - - if struct.base: - fw(".. class:: %s(%s)\n\n" % (struct.identifier, struct.base.identifier)) + if base_id: + fw(".. class:: %s(%s)\n\n" % (struct.identifier, base_id)) else: fw(".. class:: %s\n\n" % struct.identifier) fw(" %s\n\n" % struct.description) - - for prop in struct.properties: - fw(" .. attribute:: %s\n\n" % prop.identifier) + + # properties sorted in alphabetical order + zip_props_ids = zip(struct.properties, [prop.identifier for prop in struct.properties]) + zip_props_ids = sorted(zip_props_ids, key=lambda p: p[1]) + sorted_struct_properties = [x[0] for x in zip_props_ids] + + for prop in sorted_struct_properties: + type_descr = prop.get_type_description(class_fmt=":class:`%s`") + # readonly properties use "data" directive, variables properties use "attribute" directive + if 'readonly' in type_descr: + fw(" .. data:: %s\n\n" % prop.identifier) + else: + fw(" .. attribute:: %s\n\n" % prop.identifier) if prop.description: fw(" %s\n\n" % prop.description) - type_descr = prop.get_type_description(class_fmt=":class:`%s`") - fw(" *type* %s\n\n" % type_descr) + fw(" :type: %s\n\n" % type_descr) # python attributes py_properties = struct.get_py_properties() @@ -470,6 +606,62 @@ def rna2sphinx(BASEPATH): pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True) del py_funcs, py_func + lines = [] + + if struct.base or _BPY_STRUCT_FAKE: + bases = list(reversed(struct.get_bases())) + + # props + lines[:] = [] + + if _BPY_STRUCT_FAKE: + descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")] + + if _BPY_STRUCT_FAKE: + for key, descr in descr_items: + if type(descr) == GetSetDescriptorType: + lines.append("* :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) + + for base in bases: + for prop in base.properties: + lines.append("* :class:`%s.%s`\n" % (base.identifier, prop.identifier)) + + for identifier, py_prop in base.get_py_properties(): + lines.append("* :class:`%s.%s`\n" % (base.identifier, identifier)) + + for identifier, py_prop in base.get_py_properties(): + lines.append("* :class:`%s.%s`\n" % (base.identifier, identifier)) + + if lines: + fw(".. rubric:: Inherited Properties\n\n") + for line in lines: + fw(line) + fw("\n") + + + # funcs + lines[:] = [] + + if _BPY_STRUCT_FAKE: + for key, descr in descr_items: + if type(descr) == MethodDescriptorType: + lines.append("* :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) + + for base in bases: + for func in base.functions: + lines.append("* :class:`%s.%s`\n" % (base.identifier, func.identifier)) + for identifier, py_func in base.get_py_functions(): + lines.append("* :class:`%s.%s`\n" % (base.identifier, identifier)) + + if lines: + fw(".. rubric:: Inherited Functions\n\n") + for line in lines: + fw(line) + fw("\n") + + lines[:] = [] + + if struct.references: # use this otherwise it gets in the index for a normal heading. fw(".. rubric:: References\n\n") @@ -487,11 +679,43 @@ def rna2sphinx(BASEPATH): if "_OT_" in struct.identifier: continue write_struct(struct) - - # oeprators - def write_ops(): - fw = None + # special case, bpy_struct + if _BPY_STRUCT_FAKE: + filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % _BPY_STRUCT_FAKE) + file = open(filepath, "w") + fw = file.write + + fw("%s\n" % _BPY_STRUCT_FAKE) + fw("=" * len(_BPY_STRUCT_FAKE) + "\n") + fw("\n") + fw(".. module:: bpy.types\n") + fw("\n") + + subclass_ids = [s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier)] + if subclass_ids: + fw("subclasses --- \n" + ", ".join([(":class:`%s`" % s) for s in sorted(subclass_ids)]) + "\n\n") + + fw(".. class:: %s\n\n" % _BPY_STRUCT_FAKE) + fw(" built-in base class for all classes in bpy.types.\n\n") + fw(" .. note::\n\n") + fw(" Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % _BPY_STRUCT_FAKE) + + descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")] + + for key, descr in descr_items: + if type(descr) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet + py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key) + + for key, descr in descr_items: + if type(descr) == GetSetDescriptorType: + py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key) + + + # operators + def write_ops(): + API_BASEURL='https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/scripts' + fw = None last_mod = '' for op_key in sorted(ops.keys()): @@ -507,11 +731,18 @@ def rna2sphinx(BASEPATH): fw(".. module:: bpy.ops.%s\n\n" % op.module_name) last_mod = op.module_name - + args_str = ", ".join([prop.get_arg_default(force=True) for prop in op.args]) fw(".. function:: %s(%s)\n\n" % (op.func_name, args_str)) - if op.description: - fw(" %s\n\n" % op.description) + + # if the description isn't valid, we output the standard warning + # with a link to the wiki so that people can help + if not op.description or op.description == "(undocumented operator)": + operator_description = undocumented_message('bpy.ops',op.module_name,op.func_name) + else: + operator_description = op.description + + fw(" %s\n\n" % operator_description) for prop in op.args: write_param(" ", fw, prop) if op.args: @@ -519,7 +750,7 @@ def rna2sphinx(BASEPATH): location = op.get_location() if location != (None, None): - fw(" *python operator source --- `%s:%d`* \n\n" % location) + fw(" :file: `%s <%s/%s>`_:%d\n\n" % (location[0],API_BASEURL,location[0],location[1])) write_ops() @@ -533,22 +764,59 @@ if __name__ == '__main__': import shutil path_in = 'source/blender/python/doc/sphinx-in' - path_out = 'source/blender/python/doc/sphinx-in' + path_out = 'source/blender/python/doc/sphinx-out' path_examples = 'source/blender/python/doc/examples' + # only for partial updates + path_in_tmp = path_in + "-tmp" + + if not os.path.exists(path_in): + os.mkdir(path_in) - shutil.rmtree(path_in, True) - shutil.rmtree(path_out, True) - for f in os.listdir(path_examples): if f.endswith(".py"): EXAMPLE_SET.add(os.path.splitext(f)[0]) - - rna2sphinx(path_in) - # for fast module testing - # os.system("rm source/blender/python/doc/sphinx-in/bpy.types.*.rst") - # os.system("rm source/blender/python/doc/sphinx-in/bpy.ops.*.rst") - + + # only for full updates + if _BPY_FULL_REBUILD: + shutil.rmtree(path_in, True) + shutil.rmtree(path_out, True) + else: + # write here, then move + shutil.rmtree(path_in_tmp, True) + + rna2sphinx(path_in_tmp) + + if not _BPY_FULL_REBUILD: + import filecmp + + # now move changed files from 'path_in_tmp' --> 'path_in' + file_list_path_in = set(os.listdir(path_in)) + file_list_path_in_tmp = set(os.listdir(path_in_tmp)) + + # remove deprecated files that have been removed. + for f in sorted(file_list_path_in): + if f not in file_list_path_in_tmp: + print("\tdeprecated: %s" % f) + os.remove(os.path.join(path_in, f)) + + # freshen with new files. + for f in sorted(file_list_path_in_tmp): + f_from = os.path.join(path_in_tmp, f) + f_to = os.path.join(path_in, f) + + do_copy = True + if f in file_list_path_in: + if filecmp.cmp(f_from, f_to): + do_copy = False + + if do_copy: + print("\tupdating: %s" % f) + shutil.copy(f_from, f_to) + '''else: + print("\tkeeping: %s" % f) # eh, not that useful''' + + EXAMPLE_SET_UNUSED = EXAMPLE_SET - EXAMPLE_SET_USED if EXAMPLE_SET_UNUSED: print("\nUnused examples found in '%s'..." % path_examples) diff --git a/source/blender/python/doc/sphinx_doc_gen.sh b/source/blender/python/doc/sphinx_doc_gen.sh new file mode 100755 index 00000000000..4f5f55af2bd --- /dev/null +++ b/source/blender/python/doc/sphinx_doc_gen.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# run from the blender source dir +# bash source/blender/python/doc/sphinx_doc_gen.sh +# ssh upload means you need an account on the server + +BLENDER="./blender.bin" +SSH_HOST="ideasman42@emo.blender.org" +SSH_UPLOAD="/data/www/vhosts/www.blender.org/documentation/250PythonDoc" + +# dont delete existing docs, now partial updates are used for quick builds. +$BLENDER --background --python ./source/blender/python/doc/sphinx_doc_gen.py + +# html +sphinx-build source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out +cp source/blender/python/doc/sphinx-out/contents.html source/blender/python/doc/sphinx-out/index.html +ssh ideasman42@emo.blender.org 'rm -rf '$SSH_UPLOAD'/*' +rsync --progress -avze "ssh -p 22" /b/source/blender/python/doc/sphinx-out/* $SSH_HOST:$SSH_UPLOAD/ + +# pdf +sphinx-build -b latex source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out +cd source/blender/python/doc/sphinx-out +make +cd ../../../../../ +rsync --progress -avze "ssh -p 22" source/blender/python/doc/sphinx-out/contents.pdf $SSH_HOST:$SSH_UPLOAD/blender_python_reference_250.pdf diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c index decc28198ff..ba563f9fcbf 100644 --- a/source/blender/python/generic/IDProp.c +++ b/source/blender/python/generic/IDProp.c @@ -1,5 +1,5 @@ /** - * $Id: IDProp.c + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -23,17 +23,10 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "DNA_ID.h" - #include "BKE_idprop.h" - #include "IDProp.h" -// #include "gen_utils.h" - #include "MEM_guardedalloc.h" -#define BSTR_EQ(a, b) (*(a) == *(b) && !strcmp(a, b)) - /*** Function to wrap ID properties ***/ PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent); diff --git a/source/blender/python/generic/IDProp.h b/source/blender/python/generic/IDProp.h index 6a8cb7db3c4..c0a07879c1d 100644 --- a/source/blender/python/generic/IDProp.h +++ b/source/blender/python/generic/IDProp.h @@ -1,5 +1,5 @@ /** - * $Id: IDProp.h + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c index 050d71a3c7e..9bd3b4831db 100644 --- a/source/blender/python/generic/bgl.c +++ b/source/blender/python/generic/bgl.c @@ -1,5 +1,5 @@ /* - * $Id: bgl.c 27189 2010-02-28 15:44:18Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -61,16 +61,19 @@ static PyObject *Buffer_item( PyObject * self, int i ); static PyObject *Buffer_slice( PyObject * self, int begin, int end ); static int Buffer_ass_item( PyObject * self, int i, PyObject * v ); static int Buffer_ass_slice( PyObject * self, int begin, int end, - PyObject * seq ); + PyObject * seq ); static PySequenceMethods Buffer_SeqMethods = { - ( lenfunc ) Buffer_len, /*sq_length */ - ( binaryfunc ) 0, /*sq_concat */ - ( ssizeargfunc ) 0, /*sq_repeat */ - ( ssizeargfunc ) Buffer_item, /*sq_item */ - ( ssizessizeargfunc ) Buffer_slice, /*sq_slice */ - ( ssizeobjargproc ) Buffer_ass_item, /*sq_ass_item */ - ( ssizessizeobjargproc ) Buffer_ass_slice, /*sq_ass_slice */ + ( lenfunc ) Buffer_len, /*sq_length */ + ( binaryfunc ) NULL, /*sq_concat */ + ( ssizeargfunc ) NULL, /*sq_repeat */ + ( ssizeargfunc ) Buffer_item, /*sq_item */ + ( ssizessizeargfunc ) Buffer_slice, /*sq_slice, deprecated TODO, replace */ + ( ssizeobjargproc ) Buffer_ass_item, /*sq_ass_item */ + ( ssizessizeobjargproc ) Buffer_ass_slice, /*sq_ass_slice, deprecated TODO, replace */ + (objobjproc) NULL, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; static void Buffer_dealloc( PyObject * self ); @@ -319,20 +322,20 @@ static int Buffer_ass_item(PyObject *self, int i, PyObject *v) } if (buf->type==GL_BYTE) { - if (!PyArg_Parse(v, "b;Coordinates must be ints", &buf->buf.asbyte[i])) + if (!PyArg_Parse(v, "b:Coordinates must be ints", &buf->buf.asbyte[i])) return -1; } else if (buf->type==GL_SHORT) { - if (!PyArg_Parse(v, "h;Coordinates must be ints", &buf->buf.asshort[i])) + if (!PyArg_Parse(v, "h:Coordinates must be ints", &buf->buf.asshort[i])) return -1; } else if (buf->type==GL_INT) { - if (!PyArg_Parse(v, "i;Coordinates must be ints", &buf->buf.asint[i])) + if (!PyArg_Parse(v, "i:Coordinates must be ints", &buf->buf.asint[i])) return -1; } else if (buf->type==GL_FLOAT) { - if (!PyArg_Parse(v, "f;Coordinates must be floats", &buf->buf.asfloat[i])) + if (!PyArg_Parse(v, "f:Coordinates must be floats", &buf->buf.asfloat[i])) return -1; } else if (buf->type==GL_DOUBLE) { - if (!PyArg_Parse(v, "d;Coordinates must be floats", &buf->buf.asdouble[i])) + if (!PyArg_Parse(v, "d:Coordinates must be floats", &buf->buf.asdouble[i])) return -1; } return 0; @@ -355,7 +358,10 @@ static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq) } if (PySequence_Length(seq)!=(end-begin)) { - PyErr_SetString(PyExc_TypeError, "size mismatch in assignment"); + int seq_len = PySequence_Length(seq); + char err_str[128]; + sprintf(err_str, "size mismatch in assignment. Expected size: %d (size provided: %d)", seq_len, (end-begin)); + PyErr_SetString(PyExc_TypeError, err_str); return -1; } @@ -430,7 +436,7 @@ BGL_Wrap(3, AreTexturesResident, GLboolean, (GLsizei, GLuintP, GLbooleanP)) BGL_Wrap(1, Begin, void, (GLenum)) BGL_Wrap(2, BindTexture, void, (GLenum, GLuint)) BGL_Wrap(7, Bitmap, void, (GLsizei, GLsizei, GLfloat, - GLfloat, GLfloat, GLfloat, GLubyteP)) + GLfloat, GLfloat, GLfloat, GLubyteP)) BGL_Wrap(2, BlendFunc, void, (GLenum, GLenum)) BGL_Wrap(1, CallList, void, (GLuint)) BGL_Wrap(3, CallLists, void, (GLsizei, GLenum, GLvoidP)) @@ -476,6 +482,7 @@ BGL_Wrap(1, Color4usv, void, (GLushortP)) BGL_Wrap(4, ColorMask, void, (GLboolean, GLboolean, GLboolean, GLboolean)) BGL_Wrap(2, ColorMaterial, void, (GLenum, GLenum)) BGL_Wrap(5, CopyPixels, void, (GLint, GLint, GLsizei, GLsizei, GLenum)) +BGL_Wrap(8, CopyTexImage2D, void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint)) BGL_Wrap(1, CullFace, void, (GLenum)) BGL_Wrap(2, DeleteLists, void, (GLuint, GLsizei)) BGL_Wrap(2, DeleteTextures, void, (GLsizei, GLuintP)) @@ -511,7 +518,7 @@ BGL_Wrap(2, Fogi, void, (GLenum, GLint)) BGL_Wrap(2, Fogiv, void, (GLenum, GLintP)) BGL_Wrap(1, FrontFace, void, (GLenum)) BGL_Wrap(6, Frustum, void, (GLdouble, GLdouble, - GLdouble, GLdouble, GLdouble, GLdouble)) + GLdouble, GLdouble, GLdouble, GLdouble)) BGL_Wrap(1, GenLists, GLuint, (GLsizei)) BGL_Wrap(2, GenTextures, void, (GLsizei, GLuintP)) BGL_Wrap(2, GetBooleanv, void, (GLenum, GLbooleanP)) @@ -573,19 +580,19 @@ BGL_Wrap(1, LoadMatrixf, void, (GLfloatP)) BGL_Wrap(1, LoadName, void, (GLuint)) BGL_Wrap(1, LogicOp, void, (GLenum)) BGL_Wrap(6, Map1d, void, (GLenum, GLdouble, GLdouble, - GLint, GLint, GLdoubleP)) + GLint, GLint, GLdoubleP)) BGL_Wrap(6, Map1f, void, (GLenum, GLfloat, GLfloat, - GLint, GLint, GLfloatP)) + GLint, GLint, GLfloatP)) BGL_Wrap(10, Map2d, void, (GLenum, GLdouble, GLdouble, - GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdoubleP)) + GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdoubleP)) BGL_Wrap(10, Map2f, void, (GLenum, GLfloat, GLfloat, - GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloatP)) + GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloatP)) BGL_Wrap(3, MapGrid1d, void, (GLint, GLdouble, GLdouble)) BGL_Wrap(3, MapGrid1f, void, (GLint, GLfloat, GLfloat)) BGL_Wrap(6, MapGrid2d, void, (GLint, GLdouble, GLdouble, - GLint, GLdouble, GLdouble)) + GLint, GLdouble, GLdouble)) BGL_Wrap(6, MapGrid2f, void, (GLint, GLfloat, GLfloat, - GLint, GLfloat, GLfloat)) + GLint, GLfloat, GLfloat)) BGL_Wrap(3, Materialf, void, (GLenum, GLenum, GLfloat)) BGL_Wrap(3, Materialfv, void, (GLenum, GLenum, GLfloatP)) BGL_Wrap(3, Materiali, void, (GLenum, GLenum, GLint)) @@ -605,7 +612,7 @@ BGL_Wrap(1, Normal3iv, void, (GLintP)) BGL_Wrap(3, Normal3s, void, (GLshort, GLshort, GLshort)) BGL_Wrap(1, Normal3sv, void, (GLshortP)) BGL_Wrap(6, Ortho, void, (GLdouble, GLdouble, - GLdouble, GLdouble, GLdouble, GLdouble)) + GLdouble, GLdouble, GLdouble, GLdouble)) BGL_Wrap(1, PassThrough, void, (GLfloat)) BGL_Wrap(3, PixelMapfv, void, (GLenum, GLint, GLfloatP)) BGL_Wrap(3, PixelMapuiv, void, (GLenum, GLint, GLuintP)) @@ -654,7 +661,7 @@ BGL_Wrap(4, RasterPos4s, void, (GLshort, GLshort, GLshort, GLshort)) BGL_Wrap(1, RasterPos4sv, void, (GLshortP)) BGL_Wrap(1, ReadBuffer, void, (GLenum)) BGL_Wrap(7, ReadPixels, void, (GLint, GLint, GLsizei, - GLsizei, GLenum, GLenum, GLvoidP)) + GLsizei, GLenum, GLenum, GLvoidP)) BGL_Wrap(4, Rectd, void, (GLdouble, GLdouble, GLdouble, GLdouble)) BGL_Wrap(2, Rectdv, void, (GLdoubleP, GLdoubleP)) BGL_Wrap(4, Rectf, void, (GLfloat, GLfloat, GLfloat, GLfloat)) @@ -717,9 +724,9 @@ BGL_Wrap(3, TexGenfv, void, (GLenum, GLenum, GLfloatP)) BGL_Wrap(3, TexGeni, void, (GLenum, GLenum, GLint)) BGL_Wrap(3, TexGeniv, void, (GLenum, GLenum, GLintP)) BGL_Wrap(8, TexImage1D, void, (GLenum, GLint, GLint, - GLsizei, GLint, GLenum, GLenum, GLvoidP)) + GLsizei, GLint, GLenum, GLenum, GLvoidP)) BGL_Wrap(9, TexImage2D, void, (GLenum, GLint, GLint, - GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP)) + GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP)) BGL_Wrap(3, TexParameterf, void, (GLenum, GLenum, GLfloat)) BGL_Wrap(3, TexParameterfv, void, (GLenum, GLenum, GLfloatP)) BGL_Wrap(3, TexParameteri, void, (GLenum, GLenum, GLint)) @@ -819,6 +826,7 @@ static struct PyMethodDef BGL_methods[] = { MethodDef(ColorMask), MethodDef(ColorMaterial), MethodDef(CopyPixels), + MethodDef(CopyTexImage2D), MethodDef(CullFace), MethodDef(DeleteLists), MethodDef(DeleteTextures), @@ -1605,4 +1613,3 @@ PyObject *BGL_Init(void) return mod; } - diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h index 765259c25e6..80b0b90f643 100644 --- a/source/blender/python/generic/bgl.h +++ b/source/blender/python/generic/bgl.h @@ -1,5 +1,5 @@ /* - * $Id: bgl.h 27188 2010-02-28 14:57:26Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -36,10 +36,6 @@ #ifndef EXPP_BGL_H #define EXPP_BGL_H -#ifdef HAVE_CONFIG_H -#include -#endif - #include PyObject *BGL_Init(void); diff --git a/source/blender/python/generic/blf.c b/source/blender/python/generic/blf.c deleted file mode 100644 index 52fe860f988..00000000000 --- a/source/blender/python/generic/blf.c +++ /dev/null @@ -1,196 +0,0 @@ -/** - * $Id: - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include -#include "blf.h" - -#include "../../blenfont/BLF_api.h" - -static char py_blf_position_doc[] = -".. function:: position(x, y, z)\n" -"\n" -" Set the position for drawing text."; - -static PyObject *py_blf_position(PyObject *self, PyObject *args) -{ - float x, y, z; - - if (!PyArg_ParseTuple(args, "fff:BLF.position", &x, &y, &z)) - return NULL; - - BLF_position(x, y, z); - - Py_RETURN_NONE; -} - - -static char py_blf_size_doc[] = -".. function:: size(size, dpi)\n" -"\n" -" Set the size and dpi for drawing text.\n" -"\n" -" :arg size: Point size of the font.\n" -" :type size: int\n" -" :arg dpi: dots per inch value to use for drawing.\n" -" :type dpi: int\n"; - -static PyObject *py_blf_size(PyObject *self, PyObject *args) -{ - int size, dpi; - - if (!PyArg_ParseTuple(args, "ii:BLF.size", &size, &dpi)) - return NULL; - - BLF_size(size, dpi); - - Py_RETURN_NONE; -} - - -static char py_blf_aspect_doc[] = -".. function:: aspect(aspect)\n" -"\n" -" Set the aspect for drawing text.\n" -"\n" -" :arg aspect: The aspect ratio for text drawing to use.\n" -" :type aspect: float\n"; - -static PyObject *py_blf_aspect(PyObject *self, PyObject *args) -{ - float aspect; - - if (!PyArg_ParseTuple(args, "f:BLF.aspect", &aspect)) - return NULL; - - BLF_aspect(aspect); - - Py_RETURN_NONE; -} - - -static char py_blf_blur_doc[] = -".. function:: blur(radius)\n" -"\n" -" Set the blur radius for drawing text.\n" -"\n" -" :arg radius: The radius for blurring text (in pixels).\n" -" :type radius: int\n"; - -static PyObject *py_blf_blur(PyObject *self, PyObject *args) -{ - int blur; - - if (!PyArg_ParseTuple(args, "i:BLF.blur", &blur)) - return NULL; - - BLF_blur(blur); - - Py_RETURN_NONE; -} - - -static char py_blf_draw_doc[] = -".. function:: draw(text)\n" -"\n" -" Draw text in the current context.\n" -"\n" -" :arg text: the text to draw.\n" -" :type text: string\n"; - -static PyObject *py_blf_draw(PyObject *self, PyObject *args) -{ - char *text; - - if (!PyArg_ParseTuple(args, "s:BLF.draw", &text)) - return NULL; - - BLF_draw(text); - - Py_RETURN_NONE; -} - -static char py_blf_dimensions_doc[] = -".. function:: dimensions(text)\n" -"\n" -" Return the width and hight of the text.\n" -"\n" -" :arg text: the text to draw.\n" -" :type text: string\n" -" :return: the width and height of the text.\n" -" :rtype: tuple of 2 floats\n"; - -static PyObject *py_blf_dimensions(PyObject *self, PyObject *args) -{ - char *text; - float r_width, r_height; - PyObject *ret; - - if (!PyArg_ParseTuple(args, "s:BLF.dimensions", &text)) - return NULL; - - BLF_width_and_height(text, &r_width, &r_height); - - ret= PyTuple_New(2); - PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(r_width)); - PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(r_height)); - return ret; -} - -/*----------------------------MODULE INIT-------------------------*/ -struct PyMethodDef BLF_methods[] = { - {"position", (PyCFunction)py_blf_position, METH_VARARGS, py_blf_position_doc}, - {"size", (PyCFunction) py_blf_size, METH_VARARGS, py_blf_size_doc}, - {"aspect", (PyCFunction) py_blf_aspect, METH_VARARGS, py_blf_aspect_doc}, - {"blur", (PyCFunction) py_blf_blur, METH_VARARGS, py_blf_blur_doc}, - - {"draw", (PyCFunction) py_blf_draw, METH_VARARGS, py_blf_draw_doc}, - - {"dimensions", (PyCFunction) py_blf_dimensions, METH_VARARGS, py_blf_dimensions_doc}, - {NULL, NULL, 0, NULL} -}; - -static char BLF_doc[] = -"This module provides access to blenders text drawing functions.\n"; - -static struct PyModuleDef BLF_module_def = { - PyModuleDef_HEAD_INIT, - "blf", /* m_name */ - BLF_doc, /* m_doc */ - 0, /* m_size */ - BLF_methods, /* m_methods */ - 0, /* m_reload */ - 0, /* m_traverse */ - 0, /* m_clear */ - 0, /* m_free */ -}; - -PyObject *BLF_Init(void) -{ - PyObject *submodule; - - submodule = PyModule_Create(&BLF_module_def); - PyDict_SetItemString(PySys_GetObject("modules"), BLF_module_def.m_name, submodule); - - return (submodule); -} diff --git a/source/blender/python/generic/blf_api.c b/source/blender/python/generic/blf_api.c new file mode 100644 index 00000000000..db3ce06554e --- /dev/null +++ b/source/blender/python/generic/blf_api.c @@ -0,0 +1,405 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include "blf_api.h" + +#include "../../blenfont/BLF_api.h" + +static char py_blf_position_doc[] = +".. function:: position(fontid, x, y, z)\n" +"\n" +" Set the position for drawing text.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg x: X axis position to draw the text.\n" +" :type x: float\n" +" :arg y: Y axis position to draw the text.\n" +" :type y: float\n" +" :arg z: Z axis position to draw the text.\n" +" :type x: float\n"; + +static PyObject *py_blf_position(PyObject *self, PyObject *args) +{ + int fontid; + float x, y, z; + + if (!PyArg_ParseTuple(args, "ifff:blf.position", &fontid, &x, &y, &z)) + return NULL; + + BLF_position(fontid, x, y, z); + + Py_RETURN_NONE; +} + + +static char py_blf_size_doc[] = +".. function:: size(fontid, size, dpi)\n" +"\n" +" Set the size and dpi for drawing text.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg size: Point size of the font.\n" +" :type size: int\n" +" :arg dpi: dots per inch value to use for drawing.\n" +" :type dpi: int\n"; + +static PyObject *py_blf_size(PyObject *self, PyObject *args) +{ + int fontid, size, dpi; + + if (!PyArg_ParseTuple(args, "iii:blf.size", &fontid, &size, &dpi)) + return NULL; + + BLF_size(fontid, size, dpi); + + Py_RETURN_NONE; +} + + +static char py_blf_aspect_doc[] = +".. function:: aspect(fontid, aspect)\n" +"\n" +" Set the aspect for drawing text.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg aspect: The aspect ratio for text drawing to use.\n" +" :type aspect: float\n"; + +static PyObject *py_blf_aspect(PyObject *self, PyObject *args) +{ + float aspect; + int fontid; + + if (!PyArg_ParseTuple(args, "if:blf.aspect", &fontid, &aspect)) + return NULL; + + BLF_aspect(fontid, aspect); + + Py_RETURN_NONE; +} + + +static char py_blf_blur_doc[] = +".. function:: blur(fontid, radius)\n" +"\n" +" Set the blur radius for drawing text.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg radius: The radius for blurring text (in pixels).\n" +" :type radius: int\n"; + +static PyObject *py_blf_blur(PyObject *self, PyObject *args) +{ + int blur, fontid; + + if (!PyArg_ParseTuple(args, "ii:blf.blur", &fontid, &blur)) + return NULL; + + BLF_blur(fontid, blur); + + Py_RETURN_NONE; +} + + +static char py_blf_draw_doc[] = +".. function:: draw(fontid, text)\n" +"\n" +" Draw text in the current context.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg text: the text to draw.\n" +" :type text: string\n"; + +static PyObject *py_blf_draw(PyObject *self, PyObject *args) +{ + char *text; + int fontid; + + if (!PyArg_ParseTuple(args, "is:blf.draw", &fontid, &text)) + return NULL; + + BLF_draw(fontid, text); + + Py_RETURN_NONE; +} + +static char py_blf_dimensions_doc[] = +".. function:: dimensions(fontid, text)\n" +"\n" +" Return the width and hight of the text.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg text: the text to draw.\n" +" :type text: string\n" +" :return: the width and height of the text.\n" +" :rtype: tuple of 2 floats\n"; + +static PyObject *py_blf_dimensions(PyObject *self, PyObject *args) +{ + char *text; + float r_width, r_height; + PyObject *ret; + int fontid; + + if (!PyArg_ParseTuple(args, "is:blf.dimensions", &fontid, &text)) + return NULL; + + BLF_width_and_height(fontid, text, &r_width, &r_height); + + ret= PyTuple_New(2); + PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(r_width)); + PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(r_height)); + return ret; +} + +static char py_blf_clipping_doc[] = +".. function:: clipping(fontid, xmin, ymin, xmax, ymax)\n" +"\n" +" Set the clipping, enable/disable using CLIPPING.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg xmin: Clip the drawing area by these bounds.\n" +" :type xmin: float\n" +" :arg ymin: Clip the drawing area by these bounds.\n" +" :type ymin: float\n" +" :arg xmax: Clip the drawing area by these bounds.\n" +" :type xmax: float\n" +" :arg ymax: Clip the drawing area by these bounds.\n" +" :type ymax: float\n"; + +static PyObject *py_blf_clipping(PyObject *self, PyObject *args) +{ + float xmin, ymin, xmax, ymax; + int fontid; + + if (!PyArg_ParseTuple(args, "iffff:blf.clipping", &fontid, &xmin, &ymin, &xmax, &ymax)) + return NULL; + + BLF_clipping(fontid, xmin, ymin, xmax, ymax); + + Py_RETURN_NONE; +} + +static char py_blf_disable_doc[] = +".. function:: disable(fontid, option)\n" +"\n" +" Disable option.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg option: One of ROTATION, CLIPPING, SHADOW or KERNING_DEFAULT.\n" +" :type option: int\n"; + +static PyObject *py_blf_disable(PyObject *self, PyObject *args) +{ + int option, fontid; + + if (!PyArg_ParseTuple(args, "ii:blf.disable", &fontid, &option)) + return NULL; + + BLF_disable(fontid, option); + + Py_RETURN_NONE; +} + +static char py_blf_enable_doc[] = +".. function:: enable(fontid, option)\n" +"\n" +" Enable option.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg option: One of ROTATION, CLIPPING, SHADOW or KERNING_DEFAULT.\n" +" :type option: int\n"; + +static PyObject *py_blf_enable(PyObject *self, PyObject *args) +{ + int option, fontid; + + if (!PyArg_ParseTuple(args, "ii:blf.enable", &fontid, &option)) + return NULL; + + BLF_enable(fontid, option); + + Py_RETURN_NONE; +} + +static char py_blf_rotation_doc[] = +".. function:: rotation(fontid, angle)\n" +"\n" +" Set the text rotation angle, enable/disable using ROTATION.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg angle: The angle for text drawing to use.\n" +" :type aspect: float\n"; + +static PyObject *py_blf_rotation(PyObject *self, PyObject *args) +{ + float angle; + int fontid; + + if (!PyArg_ParseTuple(args, "if:blf.rotation", &fontid, &angle)) + return NULL; + + BLF_rotation(fontid, angle); + + Py_RETURN_NONE; +} + +static char py_blf_shadow_doc[] = +".. function:: shadow(fontid, level, r, g, b, a)\n" +"\n" +" Shadow options, enable/disable using SHADOW .\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg level: The blur level, can be 3, 5 or 0.\n" +" :type level: int\n" +" :arg r: Shadow color (red channel 0.0 - 1.0).\n" +" :type r: float\n" +" :arg g: Shadow color (green channel 0.0 - 1.0).\n" +" :type g: float\n" +" :arg b: Shadow color (blue channel 0.0 - 1.0).\n" +" :type b: float\n" +" :arg a: Shadow color (alpha channel 0.0 - 1.0).\n" +" :type a: float\n"; + +static PyObject *py_blf_shadow(PyObject *self, PyObject *args) +{ + int level, fontid; + float r, g, b, a; + + if (!PyArg_ParseTuple(args, "iiffff:blf.shadow", &fontid, &level, &r, &g, &b, &a)) + return NULL; + + if (level != 0 && level != 3 && level != 5) { + PyErr_SetString(PyExc_TypeError, "blf.shadow expected arg to be in (0, 3, 5)"); + return NULL; + } + + BLF_shadow(fontid, level, r, g, b, a); + + Py_RETURN_NONE; +} + +static char py_blf_shadow_offset_doc[] = +".. function:: shadow_offset(fontid, x, y)\n" +"\n" +" Set the offset for shadow text.\n" +"\n" +" :arg fontid: The id of the typeface as returned by :func:`blf.load`, for default font use 0.\n" +" :type fontid: int\n" +" :arg x: Vertical shadow offset value in pixels.\n" +" :type x: float\n" +" :arg y: Horizontal shadow offset value in pixels.\n" +" :type y: float\n"; + +static PyObject *py_blf_shadow_offset(PyObject *self, PyObject *args) +{ + int x, y, fontid; + + if (!PyArg_ParseTuple(args, "iii:blf.shadow_offset", &fontid, &x, &y)) + return NULL; + + BLF_shadow_offset(fontid, x, y); + + Py_RETURN_NONE; +} + +static char py_blf_load_doc[] = +".. function:: load(filename)\n" +"\n" +" Load a new font.\n" +"\n" +" :arg filename: the filename of the font.\n" +" :type filename: string\n" +" :return: the new font's fontid or -1 if there was an error.\n" +" :rtype: integer\n"; + +static PyObject *py_blf_load(PyObject *self, PyObject *args) +{ + char* filename; + + if (!PyArg_ParseTuple(args, "s:blf.load", &filename)) + return NULL; + + return PyLong_FromLong(BLF_load(filename)); +} + +/*----------------------------MODULE INIT-------------------------*/ +struct PyMethodDef BLF_methods[] = { + {"aspect", (PyCFunction) py_blf_aspect, METH_VARARGS, py_blf_aspect_doc}, + {"blur", (PyCFunction) py_blf_blur, METH_VARARGS, py_blf_blur_doc}, + {"clipping", (PyCFunction) py_blf_clipping, METH_VARARGS, py_blf_clipping_doc}, + {"disable", (PyCFunction) py_blf_disable, METH_VARARGS, py_blf_disable_doc}, + {"dimensions", (PyCFunction) py_blf_dimensions, METH_VARARGS, py_blf_dimensions_doc}, + {"draw", (PyCFunction) py_blf_draw, METH_VARARGS, py_blf_draw_doc}, + {"enable", (PyCFunction) py_blf_enable, METH_VARARGS, py_blf_enable_doc}, + {"position", (PyCFunction)py_blf_position, METH_VARARGS, py_blf_position_doc}, + {"rotation", (PyCFunction) py_blf_rotation, METH_VARARGS, py_blf_rotation_doc}, + {"shadow", (PyCFunction) py_blf_shadow, METH_VARARGS, py_blf_shadow_doc}, + {"shadow_offset", (PyCFunction) py_blf_shadow_offset, METH_VARARGS, py_blf_shadow_offset_doc}, + {"size", (PyCFunction) py_blf_size, METH_VARARGS, py_blf_size_doc}, + {"load", (PyCFunction) py_blf_load, METH_VARARGS, py_blf_load_doc}, + {NULL, NULL, 0, NULL} +}; + +static char BLF_doc[] = +"This module provides access to blenders text drawing functions.\n"; + +static struct PyModuleDef BLF_module_def = { + PyModuleDef_HEAD_INIT, + "blf", /* m_name */ + BLF_doc, /* m_doc */ + 0, /* m_size */ + BLF_methods, /* m_methods */ + 0, /* m_reload */ + 0, /* m_traverse */ + 0, /* m_clear */ + 0, /* m_free */ +}; + +PyObject *BLF_Init(void) +{ + PyObject *submodule; + + submodule = PyModule_Create(&BLF_module_def); + PyDict_SetItemString(PySys_GetObject("modules"), BLF_module_def.m_name, submodule); + + PyModule_AddIntConstant(submodule, "ROTATION", BLF_ROTATION); + PyModule_AddIntConstant(submodule, "CLIPPING", BLF_CLIPPING); + PyModule_AddIntConstant(submodule, "SHADOW", BLF_SHADOW); + PyModule_AddIntConstant(submodule, "KERNING_DEFAULT", BLF_KERNING_DEFAULT); + + return (submodule); +} diff --git a/source/blender/python/generic/blf.h b/source/blender/python/generic/blf_api.h similarity index 99% rename from source/blender/python/generic/blf.h rename to source/blender/python/generic/blf_api.h index 0a0e97934e2..fae20ace996 100644 --- a/source/blender/python/generic/blf.h +++ b/source/blender/python/generic/blf_api.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index e9c751525e0..ffd34139cf5 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -28,12 +28,13 @@ #include "bpy_internal_import.h" #include "DNA_text_types.h" -#include "DNA_ID.h" #include "MEM_guardedalloc.h" #include "BKE_text.h" /* txt_to_buf */ #include "BKE_main.h" +#include "BKE_global.h" /* grr, only for G.sce */ #include "BLI_listbase.h" +#include "BLI_path_util.h" #include static Main *bpy_import_main= NULL; @@ -56,6 +57,12 @@ void bpy_import_main_set(struct Main *maggie) bpy_import_main= maggie; } +/* returns a dummy filename for a textblock so we can tell what file a text block comes from */ +void bpy_text_filename_get(char *fn, Text *text) +{ + sprintf(fn, "%s/%s", text->id.lib ? text->id.lib->filepath : G.sce, text->id.name+2); +} + PyObject *bpy_text_import( Text *text ) { char *buf = NULL; @@ -63,8 +70,11 @@ PyObject *bpy_text_import( Text *text ) int len; if( !text->compiled ) { + char fn_dummy[256]; + bpy_text_filename_get(fn_dummy, text); + buf = txt_to_buf( text ); - text->compiled = Py_CompileString( buf, text->id.name+2, Py_file_input ); + text->compiled = Py_CompileString( buf, fn_dummy, Py_file_input ); MEM_freeN( buf ); if( PyErr_Occurred( ) ) { @@ -120,8 +130,8 @@ PyObject *bpy_text_import_name( char *name, int *found ) PyObject *bpy_text_reimport( PyObject *module, int *found ) { Text *text; - const char *txtname; const char *name; + char *filepath; char *buf = NULL; //XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main; Main *maggie= bpy_import_main; @@ -134,14 +144,14 @@ PyObject *bpy_text_reimport( PyObject *module, int *found ) *found= 0; /* get name, filename from the module itself */ + if((name= PyModule_GetName(module)) == NULL) + return NULL; - txtname = PyModule_GetFilename( module ); - name = PyModule_GetName( module ); - if( !txtname || !name) + if((filepath= (char *)PyModule_GetFilename(module)) == NULL) return NULL; /* look up the text object */ - text= BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2); + text= BLI_findstring(&maggie->text, BLI_path_basename(filepath), offsetof(ID, name) + 2); /* uh-oh.... didn't find it */ if( !text ) @@ -187,7 +197,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k static char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", 0}; if( !PyArg_ParseTupleAndKeywords( args, kw, "s|OOOi:bpy_import_meth", kwlist, - &name, &globals, &locals, &fromlist, &dummy_val) ) + &name, &globals, &locals, &fromlist, &dummy_val) ) return NULL; /* import existing builtin modules or modules that have been imported alredy */ @@ -227,16 +237,11 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k * our reload() module, to handle reloading in-memory scripts */ -static PyObject *blender_reload( PyObject * self, PyObject * args ) +static PyObject *blender_reload( PyObject * self, PyObject * module ) { PyObject *exception, *err, *tb; - PyObject *module = NULL; PyObject *newmodule = NULL; int found= 0; - - /* check for a module arg */ - if( !PyArg_ParseTuple( args, "O:bpy_reload_meth", &module ) ) - return NULL; /* try reimporting from file */ newmodule = PyImport_ReloadModule( module ); @@ -270,7 +275,7 @@ static PyObject *blender_reload( PyObject * self, PyObject * args ) } PyMethodDef bpy_import_meth[] = { {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"} }; -PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", (PyCFunction)blender_reload, METH_VARARGS, "blenders reload"} }; +PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"} }; /* Clear user modules. diff --git a/source/blender/python/generic/bpy_internal_import.h b/source/blender/python/generic/bpy_internal_import.h index 50d7811bb16..fc4b31a917c 100644 --- a/source/blender/python/generic/bpy_internal_import.h +++ b/source/blender/python/generic/bpy_internal_import.h @@ -50,6 +50,9 @@ PyObject* bpy_text_import( struct Text *text ); PyObject* bpy_text_import_name( char *name, int *found ); PyObject* bpy_text_reimport( PyObject *module, int *found ); /* void bpy_text_clear_modules( int clear_all );*/ /* Clear user modules */ + +void bpy_text_filename_get(char *fn, struct Text *text); + extern PyMethodDef bpy_import_meth[]; extern PyMethodDef bpy_reload_meth[]; diff --git a/source/blender/python/generic/Geometry.c b/source/blender/python/generic/geometry.c similarity index 96% rename from source/blender/python/generic/Geometry.c rename to source/blender/python/generic/geometry.c index f54dae3d6b7..586c6a3406d 100644 --- a/source/blender/python/generic/Geometry.c +++ b/source/blender/python/generic/geometry.c @@ -1,5 +1,5 @@ /* - * $Id: Geometry.c 21254 2009-06-30 00:42:17Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,12 +27,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Geometry.h" - -/* - Not needed for now though other geometry functions will probably need them -#include "BLI_math.h" -#include "BKE_utildefines.h" -*/ +#include "geometry.h" /* Used for PolyFill */ #include "BKE_displist.h" @@ -49,7 +44,7 @@ /*-------------------------DOC STRINGS ---------------------------*/ -static char M_Geometry_doc[] = "The Blender Geometry module\n\n"; +static char M_Geometry_doc[] = "The Blender geometry module\n\n"; static char M_Geometry_Intersect_doc[] = "(v1, v2, v3, ray, orig, clip=1) - returns the intersection between a ray and a triangle, if possible, returns None otherwise"; static char M_Geometry_TriangleArea_doc[] = "(v1, v2, v3) - returns the area size of the 2D or 3D triangle defined"; static char M_Geometry_TriangleNormal_doc[] = "(v1, v2, v3) - returns the normal of the 3D triangle defined"; @@ -64,7 +59,7 @@ static char M_Geometry_BoxPack2D_doc[] = ""; static char M_Geometry_BezierInterp_doc[] = ""; //---------------------------------INTERSECTION FUNCTIONS-------------------- -//----------------------------------Mathutils.Intersect() ------------------- +//----------------------------------geometry.Intersect() ------------------- static PyObject *M_Geometry_Intersect( PyObject * self, PyObject * args ) { VectorObject *ray, *ray_off, *vec1, *vec2, *vec3; @@ -136,7 +131,7 @@ static PyObject *M_Geometry_Intersect( PyObject * self, PyObject * args ) return newVectorObject(pvec, 3, Py_NEW, NULL); } -//----------------------------------Mathutils.LineIntersect() ------------------- +//----------------------------------geometry.LineIntersect() ------------------- /* Line-Line intersection using algorithm from mathworld.wolfram.com */ static PyObject *M_Geometry_LineIntersect( PyObject * self, PyObject * args ) { @@ -205,7 +200,7 @@ static PyObject *M_Geometry_LineIntersect( PyObject * self, PyObject * args ) //---------------------------------NORMALS FUNCTIONS-------------------- -//----------------------------------Mathutils.QuadNormal() ------------------- +//----------------------------------geometry.QuadNormal() ------------------- static PyObject *M_Geometry_QuadNormal( PyObject * self, PyObject * args ) { VectorObject *vec1; @@ -256,7 +251,7 @@ static PyObject *M_Geometry_QuadNormal( PyObject * self, PyObject * args ) return newVectorObject(n1, 3, Py_NEW, NULL); } -//----------------------------Mathutils.TriangleNormal() ------------------- +//----------------------------geometry.TriangleNormal() ------------------- static PyObject *M_Geometry_TriangleNormal( PyObject * self, PyObject * args ) { VectorObject *vec1, *vec2, *vec3; @@ -293,14 +288,14 @@ static PyObject *M_Geometry_TriangleNormal( PyObject * self, PyObject * args ) } //--------------------------------- AREA FUNCTIONS-------------------- -//----------------------------------Mathutils.TriangleArea() ------------------- +//----------------------------------geometry.TriangleArea() ------------------- static PyObject *M_Geometry_TriangleArea( PyObject * self, PyObject * args ) { VectorObject *vec1, *vec2, *vec3; float v1[3], v2[3], v3[3]; if( !PyArg_ParseTuple - ( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2 + ( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2 , &vector_Type, &vec3 ) ) { PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n"); return NULL; @@ -338,7 +333,7 @@ static PyObject *M_Geometry_TriangleArea( PyObject * self, PyObject * args ) } } -/*----------------------------------Geometry.PolyFill() -------------------*/ +/*----------------------------------geometry.PolyFill() -------------------*/ /* PolyFill function, uses Blenders scanfill to fill multiple poly lines */ static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq ) { @@ -368,7 +363,7 @@ static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq ) if (!PySequence_Check(polyLine)) { freedisplist(&dispbase); Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/ - PyErr_SetString( PyExc_TypeError, "One or more of the polylines is not a sequence of Mathutils.Vector's" ); + PyErr_SetString( PyExc_TypeError, "One or more of the polylines is not a sequence of mathutils.Vector's" ); return NULL; } @@ -378,7 +373,7 @@ static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq ) if (EXPP_check_sequence_consistency( polyLine, &vector_Type ) != 1) { freedisplist(&dispbase); Py_DECREF(polyLine); - PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a Mathutils.Vector type" ); + PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type" ); return NULL; } #endif @@ -419,12 +414,12 @@ static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq ) if(ls_error) { freedisplist(&dispbase); /* possible some dl was allocated */ - PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a Mathutils.Vector type" ); + PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type" ); return NULL; } else if (totpoints) { /* now make the list to return */ - filldisplist(&dispbase, &dispbase); + filldisplist(&dispbase, &dispbase, 0); /* The faces are stored in a new DisplayList thats added to the head of the listbase */ @@ -433,7 +428,7 @@ static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq ) tri_list= PyList_New(dl->parts); if( !tri_list ) { freedisplist(&dispbase); - PyErr_SetString( PyExc_RuntimeError, "Geometry.PolyFill failed to make a new list" ); + PyErr_SetString( PyExc_RuntimeError, "geometry.PolyFill failed to make a new list" ); return NULL; } @@ -824,7 +819,7 @@ struct PyMethodDef M_Geometry_methods[] = { static struct PyModuleDef M_Geometry_module_def = { PyModuleDef_HEAD_INIT, - "Geometry", /* m_name */ + "geometry", /* m_name */ M_Geometry_doc, /* m_doc */ 0, /* m_size */ M_Geometry_methods, /* m_methods */ diff --git a/source/blender/python/generic/Geometry.h b/source/blender/python/generic/geometry.h similarity index 93% rename from source/blender/python/generic/Geometry.h rename to source/blender/python/generic/geometry.h index d73a997bbbf..401efcc7888 100644 --- a/source/blender/python/generic/Geometry.h +++ b/source/blender/python/generic/geometry.h @@ -1,5 +1,5 @@ /* - * $Id: Geometry.h 21094 2009-06-23 00:09:26Z gsrb3d $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -32,7 +32,7 @@ #define EXPP_Geometry_H #include -#include "Mathutils.h" +#include "mathutils.h" PyObject *Geometry_Init(void); diff --git a/source/blender/python/generic/Mathutils.c b/source/blender/python/generic/mathutils.c similarity index 86% rename from source/blender/python/generic/Mathutils.c rename to source/blender/python/generic/mathutils.c index 45f8073744c..f0571f32f58 100644 --- a/source/blender/python/generic/Mathutils.c +++ b/source/blender/python/generic/mathutils.c @@ -1,5 +1,5 @@ /* - * $Id: Mathutils.c 21559 2009-07-13 12:17:07Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -29,6 +29,7 @@ /* Note: Changes to Mathutils since 2.4x * use radians rather then degrees + * - Mathutils.Vector/Euler/Quaternion(), now only take single sequence arguments. * - Mathutils.MidpointVecs --> vector.lerp(other, fac) * - Mathutils.AngleBetweenVecs --> vector.angle(other) * - Mathutils.ProjectVecs --> vector.project(other) @@ -47,16 +48,50 @@ * Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect */ -#include "Mathutils.h" +#include "mathutils.h" #include "BLI_math.h" -#include "PIL_time.h" -#include "BKE_utildefines.h" //-------------------------DOC STRINGS --------------------------- static char M_Mathutils_doc[] = "This module provides access to matrices, eulers, quaternions and vectors."; +/* helper functionm returns length of the 'value', -1 on error */ +int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix) +{ + PyObject *value_fast= NULL; + + int i, size; + + /* non list/tuple cases */ + if(!(value_fast=PySequence_Fast(value, error_prefix))) { + /* PySequence_Fast sets the error */ + return -1; + } + + size= PySequence_Fast_GET_SIZE(value_fast); + + if(size > array_max || size < array_min) { + if (array_max == array_min) PyErr_Format(PyExc_ValueError, "%.200s: sequence size is %d, expected %d", error_prefix, size, array_max); + else PyErr_Format(PyExc_ValueError, "%.200s: sequence size is %d, expected [%d - %d]", error_prefix, size, array_min, array_max); + Py_DECREF(value_fast); + return -1; + } + + i= size; + do { + i--; + if(((array[i]= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i))) == -1.0) && PyErr_Occurred()) { + PyErr_Format(PyExc_ValueError, "%.200s: sequence index %d is not a float", error_prefix, i); + Py_DECREF(value_fast); + return -1; + } + } while(i); + + Py_XDECREF(value_fast); + return size; +} + //-----------------------------METHODS---------------------------- //-----------------quat_rotation (internal)----------- //This function multiplies a vector/point * quat or vice versa @@ -126,14 +161,14 @@ PyObject *quat_rotation(PyObject *arg1, PyObject *arg2) } //----------------------------------MATRIX FUNCTIONS-------------------- -//----------------------------------Mathutils.RotationMatrix() ---------- +//----------------------------------mathutils.RotationMatrix() ---------- //mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. static char M_Mathutils_RotationMatrix_doc[] = ".. function:: RotationMatrix(angle, size, axis)\n" "\n" " Create a matrix representing a rotation.\n" "\n" -" :arg angle: The angle of rotation desired.\n" +" :arg angle: The angle of rotation desired, in radians.\n" " :type angle: float\n" " :arg size: The size of the rotation matrix to construct [2, 4].\n" " :type size: int\n" @@ -152,14 +187,14 @@ static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args) 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; if(!PyArg_ParseTuple(args, "fi|O", &angle, &matSize, &vec)) { - PyErr_SetString(PyExc_TypeError, "Mathutils.RotationMatrix(angle, size, axis): expected float int and a string or vector\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(angle, size, axis): expected float int and a string or vector\n"); return NULL; } if(vec && !VectorObject_Check(vec)) { axis= _PyUnicode_AsString((PyObject *)vec); if(axis==NULL || axis[0]=='\0' || axis[1]!='\0' || axis[0] < 'X' || axis[0] > 'Z') { - PyErr_SetString(PyExc_TypeError, "Mathutils.RotationMatrix(): 3rd argument axis value must be a 3D vector or a string in 'X', 'Y', 'Z'\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(): 3rd argument axis value must be a 3D vector or a string in 'X', 'Y', 'Z'\n"); return NULL; } else { @@ -174,20 +209,20 @@ static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args) angle-=(Py_PI*2); if(matSize != 2 && matSize != 3 && matSize != 4) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); return NULL; } if(matSize == 2 && (vec != NULL)) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis\n"); return NULL; } if((matSize == 3 || matSize == 4) && (axis == NULL) && (vec == NULL)) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): please choose an axis of rotation for 3d and 4d matrices\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): please choose an axis of rotation for 3d and 4d matrices\n"); return NULL; } if(vec) { if(vec->size != 3) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): the vector axis must be a 3D vector\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): the vector axis must be a 3D vector\n"); return NULL; } @@ -230,7 +265,7 @@ static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args) } else { /* should never get here */ - PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): unknown error\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): unknown error\n"); return NULL; } @@ -265,11 +300,11 @@ static PyObject *M_Mathutils_TranslationMatrix(PyObject * self, VectorObject * v 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; if(!VectorObject_Check(vec)) { - PyErr_SetString(PyExc_TypeError, "Mathutils.TranslationMatrix(): expected vector\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.TranslationMatrix(): expected vector\n"); return NULL; } if(vec->size != 3 && vec->size != 4) { - PyErr_SetString(PyExc_TypeError, "Mathutils.TranslationMatrix(): vector must be 3D or 4D\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.TranslationMatrix(): vector must be 3D or 4D\n"); return NULL; } @@ -284,7 +319,7 @@ static PyObject *M_Mathutils_TranslationMatrix(PyObject * self, VectorObject * v return newMatrixObject(mat, 4, 4, Py_NEW, NULL); } -//----------------------------------Mathutils.ScaleMatrix() ------------- +//----------------------------------mathutils.ScaleMatrix() ------------- //mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. static char M_Mathutils_ScaleMatrix_doc[] = ".. function:: ScaleMatrix(factor, size, axis)\n" @@ -309,16 +344,16 @@ static PyObject *M_Mathutils_ScaleMatrix(PyObject * self, PyObject * args) 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; if(!PyArg_ParseTuple(args, "fi|O!", &factor, &matSize, &vector_Type, &vec)) { - PyErr_SetString(PyExc_TypeError, "Mathutils.ScaleMatrix(): expected float int and optional vector\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.ScaleMatrix(): expected float int and optional vector\n"); return NULL; } if(matSize != 2 && matSize != 3 && matSize != 4) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.ScaleMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.ScaleMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); return NULL; } if(vec) { if(vec->size > 2 && matSize == 2) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.ScaleMatrix(): please use 2D vectors when scaling in 2D\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.ScaleMatrix(): please use 2D vectors when scaling in 2D\n"); return NULL; } @@ -375,7 +410,7 @@ static PyObject *M_Mathutils_ScaleMatrix(PyObject * self, PyObject * args) //pass to matrix creation return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL); } -//----------------------------------Mathutils.OrthoProjectionMatrix() --- +//----------------------------------mathutils.OrthoProjectionMatrix() --- //mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. static char M_Mathutils_OrthoProjectionMatrix_doc[] = ".. function:: OrthoProjectionMatrix(plane, size, axis)\n" @@ -400,16 +435,16 @@ static PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * a 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; if(!PyArg_ParseTuple(args, "si|O!", &plane, &matSize, &vector_Type, &vec)) { - PyErr_SetString(PyExc_TypeError, "Mathutils.OrthoProjectionMatrix(): expected string and int and optional vector\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.OrthoProjectionMatrix(): expected string and int and optional vector\n"); return NULL; } if(matSize != 2 && matSize != 3 && matSize != 4) { - PyErr_SetString(PyExc_AttributeError,"Mathutils.OrthoProjectionMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); + PyErr_SetString(PyExc_AttributeError,"mathutils.OrthoProjectionMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); return NULL; } if(vec) { if(vec->size > 2 && matSize == 2) { - PyErr_SetString(PyExc_AttributeError, "Mathutils.OrthoProjectionMatrix(): please use 2D vectors when scaling in 2D\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): please use 2D vectors when scaling in 2D\n"); return NULL; } @@ -432,7 +467,7 @@ static PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * a mat[4] = 1.0f; mat[8] = 1.0f; } else { - PyErr_SetString(PyExc_AttributeError, "Mathutils.OrthoProjectionMatrix(): unknown plane - expected: X, Y, XY, XZ, YZ\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: X, Y, XY, XZ, YZ\n"); return NULL; } } else { //arbitrary plane @@ -460,7 +495,7 @@ static PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * a mat[7] = -(vec->vec[1] * vec->vec[2]); mat[8] = 1 - (vec->vec[2] * vec->vec[2]); } else { - PyErr_SetString(PyExc_AttributeError, "Mathutils.OrthoProjectionMatrix(): unknown plane - expected: 'r' expected for axis designation\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: 'r' expected for axis designation\n"); return NULL; } } @@ -502,16 +537,16 @@ static PyObject *M_Mathutils_ShearMatrix(PyObject * self, PyObject * args) 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; if(!PyArg_ParseTuple(args, "sfi", &plane, &factor, &matSize)) { - PyErr_SetString(PyExc_TypeError,"Mathutils.ShearMatrix(): expected string float and int\n"); + PyErr_SetString(PyExc_TypeError,"mathutils.ShearMatrix(): expected string float and int\n"); return NULL; } if(matSize != 2 && matSize != 3 && matSize != 4) { - PyErr_SetString(PyExc_AttributeError,"Mathutils.ShearMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); + PyErr_SetString(PyExc_AttributeError,"mathutils.ShearMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); return NULL; } if((strcmp(plane, "X") == 0) - && matSize == 2) { + && matSize == 2) { mat[0] = 1.0f; mat[2] = factor; mat[3] = 1.0f; @@ -537,7 +572,7 @@ static PyObject *M_Mathutils_ShearMatrix(PyObject * self, PyObject * args) mat[4] = 1.0f; mat[8] = 1.0f; } else { - PyErr_SetString(PyExc_AttributeError, "Mathutils.ShearMatrix(): expected: x, y, xy, xz, yz or wrong matrix size for shearing plane\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.ShearMatrix(): expected: x, y, xy, xz, yz or wrong matrix size for shearing plane\n"); return NULL; } if(matSize == 4) { @@ -611,40 +646,44 @@ int Mathutils_RegisterCallback(Mathutils_Callback *cb) int _BaseMathObject_ReadCallback(BaseMathObject *self) { Mathutils_Callback *cb= mathutils_callbacks[self->cb_type]; - if(cb->get(self->cb_user, self->cb_subtype, self->data)) + if(cb->get(self, self->cb_subtype)) return 1; - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + if(!PyErr_Occurred()) + PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } int _BaseMathObject_WriteCallback(BaseMathObject *self) { Mathutils_Callback *cb= mathutils_callbacks[self->cb_type]; - if(cb->set(self->cb_user, self->cb_subtype, self->data)) + if(cb->set(self, self->cb_subtype)) return 1; - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + if(!PyErr_Occurred()) + PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index) { Mathutils_Callback *cb= mathutils_callbacks[self->cb_type]; - if(cb->get_index(self->cb_user, self->cb_subtype, self->data, index)) + if(cb->get_index(self, self->cb_subtype, index)) return 1; - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + if(!PyErr_Occurred()) + PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index) { Mathutils_Callback *cb= mathutils_callbacks[self->cb_type]; - if(cb->set_index(self->cb_user, self->cb_subtype, self->data, index)) + if(cb->set_index(self, self->cb_subtype, index)) return 1; - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + if(!PyErr_Occurred()) + PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } @@ -685,7 +724,7 @@ struct PyMethodDef M_Mathutils_methods[] = { static struct PyModuleDef M_Mathutils_module_def = { PyModuleDef_HEAD_INIT, - "Mathutils", /* m_name */ + "mathutils", /* m_name */ M_Mathutils_doc, /* m_doc */ 0, /* m_size */ M_Mathutils_methods, /* m_methods */ @@ -707,7 +746,9 @@ PyObject *Mathutils_Init(void) return NULL; if( PyType_Ready( &quaternion_Type ) < 0 ) return NULL; - + if( PyType_Ready( &color_Type ) < 0 ) + return NULL; + submodule = PyModule_Create(&M_Mathutils_module_def); PyDict_SetItemString(PySys_GetObject("modules"), M_Mathutils_module_def.m_name, submodule); @@ -716,6 +757,7 @@ PyObject *Mathutils_Init(void) PyModule_AddObject( submodule, "Matrix", (PyObject *)&matrix_Type ); PyModule_AddObject( submodule, "Euler", (PyObject *)&euler_Type ); PyModule_AddObject( submodule, "Quaternion", (PyObject *)&quaternion_Type ); + PyModule_AddObject( submodule, "Color", (PyObject *)&color_Type ); mathutils_matrix_vector_cb_index= Mathutils_RegisterCallback(&mathutils_matrix_vector_cb); diff --git a/source/blender/python/generic/Mathutils.h b/source/blender/python/generic/mathutils.h similarity index 67% rename from source/blender/python/generic/Mathutils.h rename to source/blender/python/generic/mathutils.h index 67606af3517..b03f15a20b1 100644 --- a/source/blender/python/generic/Mathutils.h +++ b/source/blender/python/generic/mathutils.h @@ -1,5 +1,5 @@ /* - * $Id: Mathutils.h 21499 2009-07-10 18:09:53Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -33,25 +33,29 @@ #include -#include "vector.h" -#include "matrix.h" -#include "quat.h" -#include "euler.h" - /* Can cast different mathutils types to this, use for generic funcs */ extern char BaseMathObject_Wrapped_doc[]; extern char BaseMathObject_Owner_doc[]; +#define BASE_MATH_MEMBERS(_data) \ + PyObject_VAR_HEAD \ + float *_data; /* array of data (alias), wrapped status depends on wrapped status */ \ + PyObject *cb_user; /* if this vector references another object, otherwise NULL, *Note* this owns its reference */ \ + unsigned char cb_type; /* which user funcs do we adhere to, RNA, GameObject, etc */ \ + unsigned char cb_subtype; /* subtype: location, rotation... to avoid defining many new functions for every attribute of the same type */ \ + unsigned char wrapped; /* wrapped data type? */ \ + typedef struct { - PyObject_VAR_HEAD - float *data; /*array of data (alias), wrapped status depends on wrapped status */ - PyObject *cb_user; /* if this vector references another object, otherwise NULL, *Note* this owns its reference */ - unsigned char cb_type; /* which user funcs do we adhere to, RNA, GameObject, etc */ - unsigned char cb_subtype; /* subtype: location, rotation... to avoid defining many new functions for every attribute of the same type */ - unsigned char wrapped; /* wrapped data type? */ + BASE_MATH_MEMBERS(data) } BaseMathObject; +#include "mathutils_vector.h" +#include "mathutils_matrix.h" +#include "mathutils_quat.h" +#include "mathutils_euler.h" +#include "mathutils_color.h" + PyObject *BaseMathObject_getOwner( BaseMathObject * self, void * ); PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void * ); void BaseMathObject_dealloc(BaseMathObject * self); @@ -84,18 +88,18 @@ int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps); typedef struct Mathutils_Callback Mathutils_Callback; -typedef int (*BaseMathCheckFunc)(PyObject *); -typedef int (*BaseMathGetFunc)(PyObject *, int, float *); -typedef int (*BaseMathSetFunc)(PyObject *, int, float *); -typedef int (*BaseMathGetIndexFunc)(PyObject *, int, float *, int); -typedef int (*BaseMathSetIndexFunc)(PyObject *, int, float *, int); +typedef int (*BaseMathCheckFunc)(BaseMathObject *); /* checks the user is still valid */ +typedef int (*BaseMathGetFunc)(BaseMathObject *, int); /* gets the vector from the user */ +typedef int (*BaseMathSetFunc)(BaseMathObject *, int); /* sets the users vector values once the vector is modified */ +typedef int (*BaseMathGetIndexFunc)(BaseMathObject *, int, int); /* same as above but only for an index */ +typedef int (*BaseMathSetIndexFunc)(BaseMathObject *, int, int); /* same as above but only for an index */ struct Mathutils_Callback { - int (*check)(PyObject *user); /* checks the user is still valid */ - int (*get)(PyObject *user, int subtype, float *from); /* gets the vector from the user */ - int (*set)(PyObject *user, int subtype, float *to); /* sets the users vector values once the vector is modified */ - int (*get_index)(PyObject *user, int subtype, float *from,int index); /* same as above but only for an index */ - int (*set_index)(PyObject *user, int subtype, float *to, int index); /* same as above but only for an index */ + BaseMathCheckFunc check; + BaseMathGetFunc get; + BaseMathSetFunc set; + BaseMathGetIndexFunc get_index; + BaseMathSetIndexFunc set_index; }; int Mathutils_RegisterCallback(Mathutils_Callback *cb); @@ -111,4 +115,7 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index); #define BaseMath_ReadIndexCallback(_self, _index) (((_self)->cb_user ? _BaseMathObject_ReadIndexCallback((BaseMathObject *)_self, _index):1)) #define BaseMath_WriteIndexCallback(_self, _index) (((_self)->cb_user ? _BaseMathObject_WriteIndexCallback((BaseMathObject *)_self, _index):1)) +/* utility func */ +int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix); + #endif /* EXPP_Mathutils_H */ diff --git a/source/blender/python/generic/mathutils_color.c b/source/blender/python/generic/mathutils_color.c new file mode 100644 index 00000000000..5acd03060d4 --- /dev/null +++ b/source/blender/python/generic/mathutils_color.c @@ -0,0 +1,560 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "mathutils.h" + +#include "BLI_math.h" +#include "BKE_utildefines.h" + +#define COLOR_SIZE 3 + +//----------------------------------mathutils.Color() ------------------- +//makes a new color for you to play with +static PyObject *Color_new(PyTypeObject * type, PyObject * args, PyObject * kwargs) +{ + float col[3]= {0.0f, 0.0f, 0.0f}; + + switch(PyTuple_GET_SIZE(args)) { + case 0: + break; + case 1: + if((mathutils_array_parse(col, COLOR_SIZE, COLOR_SIZE, PyTuple_GET_ITEM(args, 0), "mathutils.Color()")) == -1) + return NULL; + break; + default: + PyErr_SetString(PyExc_TypeError, "mathutils.Color(): more then a single arg given"); + return NULL; + } + return newColorObject(col, Py_NEW, type); +} + +//-----------------------------METHODS---------------------------- + +/* note: BaseMath_ReadCallback must be called beforehand */ +static PyObject *Color_ToTupleExt(ColorObject *self, int ndigits) +{ + PyObject *ret; + int i; + + ret= PyTuple_New(COLOR_SIZE); + + if(ndigits >= 0) { + for(i= 0; i < COLOR_SIZE; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->col[i], ndigits))); + } + } + else { + for(i= 0; i < COLOR_SIZE; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->col[i])); + } + } + + return ret; +} + +static char Color_copy_doc[] = +".. function:: copy()\n" +"\n" +" Returns a copy of this color.\n" +"\n" +" :return: A copy of the color.\n" +" :rtype: :class:`Color`\n" +"\n" +" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n"; + +static PyObject *Color_copy(ColorObject * self, PyObject *args) +{ + if(!BaseMath_ReadCallback(self)) + return NULL; + + return newColorObject(self->col, Py_NEW, Py_TYPE(self)); +} + +//----------------------------print object (internal)-------------- +//print the object to screen + +static PyObject *Color_repr(ColorObject * self) +{ + PyObject *ret, *tuple; + + if(!BaseMath_ReadCallback(self)) + return NULL; + + tuple= Color_ToTupleExt(self, -1); + + ret= PyUnicode_FromFormat("Color(%R)", tuple); + + Py_DECREF(tuple); + return ret; +} + +//------------------------tp_richcmpr +//returns -1 execption, 0 false, 1 true +static PyObject* Color_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type) +{ + ColorObject *colA = NULL, *colB = NULL; + int result = 0; + + if(ColorObject_Check(objectA)) { + colA = (ColorObject*)objectA; + if(!BaseMath_ReadCallback(colA)) + return NULL; + } + if(ColorObject_Check(objectB)) { + colB = (ColorObject*)objectB; + if(!BaseMath_ReadCallback(colB)) + return NULL; + } + + if (!colA || !colB){ + if (comparison_type == Py_NE){ + Py_RETURN_TRUE; + }else{ + Py_RETURN_FALSE; + } + } + colA = (ColorObject*)objectA; + colB = (ColorObject*)objectB; + + switch (comparison_type){ + case Py_EQ: + result = EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1); + break; + case Py_NE: + result = !EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1); + break; + default: + printf("The result of the comparison could not be evaluated"); + break; + } + if (result == 1){ + Py_RETURN_TRUE; + }else{ + Py_RETURN_FALSE; + } +} + +//---------------------SEQUENCE PROTOCOLS------------------------ +//----------------------------len(object)------------------------ +//sequence length +static int Color_len(ColorObject * self) +{ + return COLOR_SIZE; +} +//----------------------------object[]--------------------------- +//sequence accessor (get) +static PyObject *Color_item(ColorObject * self, int i) +{ + if(i<0) i= COLOR_SIZE-i; + + if(i < 0 || i >= COLOR_SIZE) { + PyErr_SetString(PyExc_IndexError, "color[attribute]: array index out of range"); + return NULL; + } + + if(!BaseMath_ReadIndexCallback(self, i)) + return NULL; + + return PyFloat_FromDouble(self->col[i]); + +} +//----------------------------object[]------------------------- +//sequence accessor (set) +static int Color_ass_item(ColorObject * self, int i, PyObject * value) +{ + float f = PyFloat_AsDouble(value); + + if(f == -1 && PyErr_Occurred()) { // parsed item not a number + PyErr_SetString(PyExc_TypeError, "color[attribute] = x: argument not a number"); + return -1; + } + + if(i<0) i= COLOR_SIZE-i; + + if(i < 0 || i >= COLOR_SIZE){ + PyErr_SetString(PyExc_IndexError, "color[attribute] = x: array assignment index out of range\n"); + return -1; + } + + self->col[i] = f; + + if(!BaseMath_WriteIndexCallback(self, i)) + return -1; + + return 0; +} +//----------------------------object[z:y]------------------------ +//sequence slice (get) +static PyObject *Color_slice(ColorObject * self, int begin, int end) +{ + PyObject *list = NULL; + int count; + + if(!BaseMath_ReadCallback(self)) + return NULL; + + CLAMP(begin, 0, COLOR_SIZE); + if (end<0) end= (COLOR_SIZE + 1) + end; + CLAMP(end, 0, COLOR_SIZE); + begin = MIN2(begin,end); + + list = PyList_New(end - begin); + for(count = begin; count < end; count++) { + PyList_SetItem(list, count - begin, + PyFloat_FromDouble(self->col[count])); + } + + return list; +} +//----------------------------object[z:y]------------------------ +//sequence slice (set) +static int Color_ass_slice(ColorObject * self, int begin, int end, PyObject * seq) +{ + int i, size; + float col[COLOR_SIZE]; + + if(!BaseMath_ReadCallback(self)) + return -1; + + CLAMP(begin, 0, COLOR_SIZE); + if (end<0) end= (COLOR_SIZE + 1) + end; + CLAMP(end, 0, COLOR_SIZE); + begin = MIN2(begin,end); + + if((size=mathutils_array_parse(col, 0, COLOR_SIZE, seq, "mathutils.Color[begin:end] = []")) == -1) + return -1; + + if(size != (end - begin)){ + PyErr_SetString(PyExc_TypeError, "color[begin:end] = []: size mismatch in slice assignment"); + return -1; + } + + for(i= 0; i < COLOR_SIZE; i++) + self->col[begin + i] = col[i]; + + BaseMath_WriteCallback(self); + return 0; +} + +static PyObject *Color_subscript(ColorObject *self, PyObject *item) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return NULL; + if (i < 0) + i += COLOR_SIZE; + return Color_item(self, i); + } else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0) + return NULL; + + if (slicelength <= 0) { + return PyList_New(0); + } + else if (step == 1) { + return Color_slice(self, start, stop); + } + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with color"); + return NULL; + } + } + else { + PyErr_Format(PyExc_TypeError, + "color indices must be integers, not %.200s", + item->ob_type->tp_name); + return NULL; + } +} + +static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *value) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return -1; + if (i < 0) + i += COLOR_SIZE; + return Color_ass_item(self, i, value); + } + else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0) + return -1; + + if (step == 1) + return Color_ass_slice(self, start, stop, value); + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with color"); + return -1; + } + } + else { + PyErr_Format(PyExc_TypeError, + "color indices must be integers, not %.200s", + item->ob_type->tp_name); + return -1; + } +} + +//-----------------PROTCOL DECLARATIONS-------------------------- +static PySequenceMethods Color_SeqMethods = { + (lenfunc) Color_len, /* sq_length */ + (binaryfunc) NULL, /* sq_concat */ + (ssizeargfunc) NULL, /* sq_repeat */ + (ssizeargfunc) Color_item, /* sq_item */ + (ssizessizeargfunc) NULL, /* sq_slice, deprecated */ + (ssizeobjargproc) Color_ass_item, /* sq_ass_item */ + (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */ + (objobjproc) NULL, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ +}; + +static PyMappingMethods Color_AsMapping = { + (lenfunc)Color_len, + (binaryfunc)Color_subscript, + (objobjargproc)Color_ass_subscript +}; + +/* color channel, vector.r/g/b */ +static PyObject *Color_getChannel( ColorObject * self, void *type ) +{ + return Color_item(self, GET_INT_FROM_POINTER(type)); +} + +static int Color_setChannel(ColorObject * self, PyObject * value, void * type) +{ + return Color_ass_item(self, GET_INT_FROM_POINTER(type), value); +} + +/* color channel (HSV), color.h/s/v */ +static PyObject *Color_getChannelHSV( ColorObject * self, void *type ) +{ + float hsv[3]; + int i= GET_INT_FROM_POINTER(type); + + if(!BaseMath_ReadCallback(self)) + return NULL; + + rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2])); + + return PyFloat_FromDouble(hsv[i]); +} + +static int Color_setChannelHSV(ColorObject * self, PyObject * value, void * type) +{ + float hsv[3]; + int i= GET_INT_FROM_POINTER(type); + float f = PyFloat_AsDouble(value); + + if(f == -1 && PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, "color.h/s/v = value: argument not a number"); + return -1; + } + + if(!BaseMath_ReadCallback(self)) + return -1; + + rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2])); + CLAMP(f, 0.0f, 1.0f); + hsv[i] = f; + hsv_to_rgb(hsv[0], hsv[1], hsv[2], &(self->col[0]), &(self->col[1]), &(self->col[2])); + + if(!BaseMath_WriteCallback(self)) + return -1; + + return 0; +} + +/* color channel (HSV), color.h/s/v */ +static PyObject *Color_getHSV(ColorObject * self, void *type) +{ + float hsv[3]; + PyObject *ret; + + if(!BaseMath_ReadCallback(self)) + return NULL; + + rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2])); + + ret= PyTuple_New(3); + PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(hsv[0])); + PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(hsv[1])); + PyTuple_SET_ITEM(ret, 2, PyFloat_FromDouble(hsv[2])); + return ret; +} + +static int Color_setHSV(ColorObject * self, PyObject * value, void * type) +{ + float hsv[3]; + + if(mathutils_array_parse(hsv, 3, 3, value, "mathutils.Color.hsv = value") == -1) + return -1; + + CLAMP(hsv[0], 0.0f, 1.0f); + CLAMP(hsv[1], 0.0f, 1.0f); + CLAMP(hsv[2], 0.0f, 1.0f); + + hsv_to_rgb(hsv[0], hsv[1], hsv[2], &(self->col[0]), &(self->col[1]), &(self->col[2])); + + if(!BaseMath_WriteCallback(self)) + return -1; + + return 0; +} + +/*****************************************************************************/ +/* Python attributes get/set structure: */ +/*****************************************************************************/ +static PyGetSetDef Color_getseters[] = { + {"r", (getter)Color_getChannel, (setter)Color_setChannel, "Red color channel. **type** float", (void *)0}, + {"g", (getter)Color_getChannel, (setter)Color_setChannel, "Green color channel. **type** float", (void *)1}, + {"b", (getter)Color_getChannel, (setter)Color_setChannel, "Blue color channel. **type** float", (void *)2}, + + {"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Hue component in [0, 1]. **type** float", (void *)0}, + {"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Saturation component in [0, 1]. **type** float", (void *)1}, + {"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Value component in [0, 1]. **type** float", (void *)2}, + + {"hsv", (getter)Color_getHSV, (setter)Color_setHSV, "HSV Values in [0, 1]. **type** float triplet", (void *)0}, + + {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL}, + {"_owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL}, + {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ +}; + + +//-----------------------METHOD DEFINITIONS ---------------------- +static struct PyMethodDef Color_methods[] = { + {"__copy__", (PyCFunction) Color_copy, METH_VARARGS, Color_copy_doc}, + {"copy", (PyCFunction) Color_copy, METH_VARARGS, Color_copy_doc}, + {NULL, NULL, 0, NULL} +}; + +//------------------PY_OBECT DEFINITION-------------------------- +static char color_doc[] = +"This object gives access to Colors in Blender."; + +PyTypeObject color_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "color", //tp_name + sizeof(ColorObject), //tp_basicsize + 0, //tp_itemsize + (destructor)BaseMathObject_dealloc, //tp_dealloc + 0, //tp_print + 0, //tp_getattr + 0, //tp_setattr + 0, //tp_compare + (reprfunc) Color_repr, //tp_repr + 0, //tp_as_number + &Color_SeqMethods, //tp_as_sequence + &Color_AsMapping, //tp_as_mapping + 0, //tp_hash + 0, //tp_call + 0, //tp_str + 0, //tp_getattro + 0, //tp_setattro + 0, //tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags + color_doc, //tp_doc + 0, //tp_traverse + 0, //tp_clear + (richcmpfunc)Color_richcmpr, //tp_richcompare + 0, //tp_weaklistoffset + 0, //tp_iter + 0, //tp_iternext + Color_methods, //tp_methods + 0, //tp_members + Color_getseters, //tp_getset + 0, //tp_base + 0, //tp_dict + 0, //tp_descr_get + 0, //tp_descr_set + 0, //tp_dictoffset + 0, //tp_init + 0, //tp_alloc + Color_new, //tp_new + 0, //tp_free + 0, //tp_is_gc + 0, //tp_bases + 0, //tp_mro + 0, //tp_cache + 0, //tp_subclasses + 0, //tp_weaklist + 0 //tp_del +}; +//------------------------newColorObject (internal)------------- +//creates a new color object +/*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER + (i.e. it was allocated elsewhere by MEM_mallocN()) + pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON + (i.e. it must be created here with PyMEM_malloc())*/ +PyObject *newColorObject(float *col, int type, PyTypeObject *base_type) +{ + ColorObject *self; + + if(base_type) self = (ColorObject *)base_type->tp_alloc(base_type, 0); + else self = PyObject_NEW(ColorObject, &color_Type); + + /* init callbacks as NULL */ + self->cb_user= NULL; + self->cb_type= self->cb_subtype= 0; + + if(type == Py_WRAP){ + self->col = col; + self->wrapped = Py_WRAP; + } + else if (type == Py_NEW){ + self->col = PyMem_Malloc(COLOR_SIZE * sizeof(float)); + if(col) + copy_v3_v3(self->col, col); + else + zero_v3(self->col); + + self->wrapped = Py_NEW; + } + else { + return NULL; + } + + return (PyObject *)self; +} + +PyObject *newColorObject_cb(PyObject *cb_user, int cb_type, int cb_subtype) +{ + ColorObject *self= (ColorObject *)newColorObject(NULL, Py_NEW, NULL); + if(self) { + Py_INCREF(cb_user); + self->cb_user= cb_user; + self->cb_type= (unsigned char)cb_type; + self->cb_subtype= (unsigned char)cb_subtype; + } + + return (PyObject *)self; +} diff --git a/source/blender/imbuf/intern/IMB_targa.h b/source/blender/python/generic/mathutils_color.h similarity index 57% rename from source/blender/imbuf/intern/IMB_targa.h rename to source/blender/python/generic/mathutils_color.h index a81801eedac..02b27d86817 100644 --- a/source/blender/imbuf/intern/IMB_targa.h +++ b/source/blender/python/generic/mathutils_color.h @@ -1,6 +1,4 @@ /* - * IMB_targa.h - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -24,25 +22,31 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Joseph Gilbert * * ***** END GPL LICENSE BLOCK ***** - */ -/** - * \file IMB_targa.h - * \ingroup imbuf - * \brief Function declarations for targa.c + * */ -#ifndef IMB_TARGA_H -#define IMB_TARGA_H +#ifndef EXPP_color_h +#define EXPP_color_h -struct ImBuf; +#include -int imb_is_a_targa(void *buf); +extern PyTypeObject color_Type; +#define ColorObject_Check(_v) PyObject_TypeCheck((_v), &color_Type) -struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags); -short imb_savetarga(struct ImBuf * ibuf, char *name, int flags); +typedef struct { + BASE_MATH_MEMBERS(col) +} ColorObject; -#endif +/*struct data contains a pointer to the actual data that the +object uses. It can use either PyMem allocated data (which will +be stored in py_data) or be a wrapper for data allocated through +blender (stored in blend_data). This is an either/or struct not both*/ +//prototypes +PyObject *newColorObject( float *col, int type, PyTypeObject *base_type); +PyObject *newColorObject_cb(PyObject *cb_user, int cb_type, int cb_subtype); + +#endif /* EXPP_color_h */ diff --git a/source/blender/python/generic/euler.c b/source/blender/python/generic/mathutils_euler.c similarity index 69% rename from source/blender/python/generic/euler.c rename to source/blender/python/generic/mathutils_euler.c index be934618d39..aac65043a0a 100644 --- a/source/blender/python/generic/euler.c +++ b/source/blender/python/generic/mathutils_euler.c @@ -1,5 +1,5 @@ /* - * $Id: euler.c 21462 2009-07-09 15:40:04Z ton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,60 +26,41 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Mathutils.h" +#include "mathutils.h" #include "BLI_math.h" #include "BKE_utildefines.h" -#include "BLI_blenlib.h" +#ifndef int32_t #include "BLO_sys_types.h" +#endif -//----------------------------------Mathutils.Euler() ------------------- +#define EULER_SIZE 3 + +//----------------------------------mathutils.Euler() ------------------- //makes a new euler for you to play with static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * kwargs) { - PyObject *listObject = NULL; - int size, i; - float eul[3]; - PyObject *e; - short order= 0; // TODO, add order option + PyObject *seq= NULL; + char *order_str= NULL; - size = PyTuple_GET_SIZE(args); - if (size == 1) { - listObject = PyTuple_GET_ITEM(args, 0); - if (PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - } else { // Single argument was not a sequence - PyErr_SetString(PyExc_TypeError, "Mathutils.Euler(): 3d numeric sequence expected\n"); - return NULL; - } - } else if (size == 0) { - //returns a new empty 3d euler - return newEulerObject(NULL, order, Py_NEW, NULL); - } else { - listObject = args; - } + float eul[EULER_SIZE]= {0.0f, 0.0f, 0.0f}; + short order= EULER_ORDER_XYZ; - if (size != 3) { // Invalid euler size - PyErr_SetString(PyExc_AttributeError, "Mathutils.Euler(): 3d numeric sequence expected\n"); + if(!PyArg_ParseTuple(args, "|Os:mathutils.Euler", &seq, &order_str)) return NULL; - } - for (i=0; i= 0) { + for(i= 0; i < EULER_SIZE; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->eul[i], ndigits))); + } + } + else { + for(i= 0; i < EULER_SIZE; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->eul[i])); + } + } + + return ret; +} + //-----------------------------METHODS---------------------------- -//----------------------------Euler.toQuat()---------------------- //return a quaternion representation of the euler static char Euler_ToQuat_doc[] = @@ -120,12 +122,12 @@ static PyObject *Euler_ToQuat(EulerObject * self) if(!BaseMath_ReadCallback(self)) return NULL; - if(self->order==0) eul_to_quat(quat, self->eul); - else eulO_to_quat(quat, self->eul, self->order); + if(self->order==EULER_ORDER_XYZ) eul_to_quat(quat, self->eul); + else eulO_to_quat(quat, self->eul, self->order); return newQuaternionObject(quat, Py_NEW, NULL); } -//----------------------------Euler.toMatrix()--------------------- + //return a matrix representation of the euler static char Euler_ToMatrix_doc[] = ".. method:: to_matrix()\n" @@ -142,12 +144,12 @@ static PyObject *Euler_ToMatrix(EulerObject * self) if(!BaseMath_ReadCallback(self)) return NULL; - if(self->order==0) eul_to_mat3((float (*)[3])mat, self->eul); - else eulO_to_mat3((float (*)[3])mat, self->eul, self->order); + if(self->order==EULER_ORDER_XYZ) eul_to_mat3((float (*)[3])mat, self->eul); + else eulO_to_mat3((float (*)[3])mat, self->eul, self->order); return newMatrixObject(mat, 3, 3 , Py_NEW, NULL); } -//----------------------------Euler.unique()----------------------- + //sets the x,y,z values to a unique euler rotation // TODO, check if this works with rotation order!!! static char Euler_Unique_doc[] = @@ -206,7 +208,7 @@ static PyObject *Euler_Unique(EulerObject * self) Py_INCREF(self); return (PyObject *)self; } -//----------------------------Euler.zero()------------------------- + //sets the euler to 0,0,0 static char Euler_Zero_doc[] = ".. method:: zero()\n" @@ -226,28 +228,38 @@ static PyObject *Euler_Zero(EulerObject * self) Py_INCREF(self); return (PyObject *)self; } -//----------------------------Euler.rotate()----------------------- -//rotates a euler a certain amount and returns the result -//should return a unique euler rotation (i.e. no 720 degree pitches :) + +static char Euler_Rotate_doc[] = +".. method:: rotate(angle, axis)\n" +"\n" +" Rotates the euler a certain amount and returning a unique euler rotation (no 720 degree pitches).\n" +"\n" +" :arg angle: angle in radians.\n" +" :type angle: float\n" +" :arg axis: single character in ['X, 'Y', 'Z'].\n" +" :type axis: string\n" +" :return: an instance of itself\n" +" :rtype: :class:`Euler`"; + static PyObject *Euler_Rotate(EulerObject * self, PyObject *args) { float angle = 0.0f; char *axis; - if(!PyArg_ParseTuple(args, "fs", &angle, &axis)){ - PyErr_SetString(PyExc_TypeError, "euler.rotate():expected angle (float) and axis (x,y,z)"); + if(!PyArg_ParseTuple(args, "fs:rotate", &angle, &axis)){ + PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected angle (float) and axis (x,y,z)"); return NULL; } - if(ELEM3(*axis, 'x', 'y', 'z') && axis[1]=='\0'){ - PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected axis to be 'x', 'y' or 'z'"); + if(ELEM3(*axis, 'X', 'Y', 'Z') && axis[1]=='\0'){ + PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected axis to be 'X', 'Y' or 'Z'"); return NULL; } if(!BaseMath_ReadCallback(self)) return NULL; - if(self->order == 0) rotate_eul(self->eul, *axis, angle); - else rotate_eulO(self->eul, self->order, *axis, angle); + if(self->order == EULER_ORDER_XYZ) rotate_eul(self->eul, *axis, angle); + else rotate_eulO(self->eul, self->order, *axis, angle); BaseMath_WriteCallback(self); Py_INCREF(self); @@ -311,16 +323,22 @@ static PyObject *Euler_copy(EulerObject * self, PyObject *args) //----------------------------print object (internal)-------------- //print the object to screen + static PyObject *Euler_repr(EulerObject * self) { - char str[64]; - + PyObject *ret, *tuple; + if(!BaseMath_ReadCallback(self)) return NULL; - sprintf(str, "[%.6f, %.6f, %.6f](euler)", self->eul[0], self->eul[1], self->eul[2]); - return PyUnicode_FromString(str); + tuple= Euler_ToTupleExt(self, -1); + + ret= PyUnicode_FromFormat("Euler(%R)", tuple); + + Py_DECREF(tuple); + return ret; } + //------------------------tp_richcmpr //returns -1 execption, 0 false, 1 true static PyObject* Euler_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type) @@ -351,10 +369,10 @@ static PyObject* Euler_richcmpr(PyObject *objectA, PyObject *objectB, int compar switch (comparison_type){ case Py_EQ: - result = EXPP_VectorsAreEqual(eulA->eul, eulB->eul, 3, 1); + result = EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1); break; case Py_NE: - result = !EXPP_VectorsAreEqual(eulA->eul, eulB->eul, 3, 1); + result = !EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1); break; default: printf("The result of the comparison could not be evaluated"); @@ -372,15 +390,15 @@ static PyObject* Euler_richcmpr(PyObject *objectA, PyObject *objectB, int compar //sequence length static int Euler_len(EulerObject * self) { - return 3; + return EULER_SIZE; } //----------------------------object[]--------------------------- //sequence accessor (get) static PyObject *Euler_item(EulerObject * self, int i) { - if(i<0) i= 3-i; + if(i<0) i= EULER_SIZE-i; - if(i < 0 || i >= 3) { + if(i < 0 || i >= EULER_SIZE) { PyErr_SetString(PyExc_IndexError, "euler[attribute]: array index out of range"); return NULL; } @@ -402,9 +420,9 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject * value) return -1; } - if(i<0) i= 3-i; + if(i<0) i= EULER_SIZE-i; - if(i < 0 || i >= 3){ + if(i < 0 || i >= EULER_SIZE){ PyErr_SetString(PyExc_IndexError, "euler[attribute] = x: array assignment index out of range\n"); return -1; } @@ -426,9 +444,9 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end) if(!BaseMath_ReadCallback(self)) return NULL; - CLAMP(begin, 0, 3); - if (end<0) end= 4+end; - CLAMP(end, 0, 3); + CLAMP(begin, 0, EULER_SIZE); + if (end<0) end= (EULER_SIZE + 1) + end; + CLAMP(end, 0, EULER_SIZE); begin = MIN2(begin,end); list = PyList_New(end - begin); @@ -441,64 +459,123 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end) } //----------------------------object[z:y]------------------------ //sequence slice (set) -static int Euler_ass_slice(EulerObject * self, int begin, int end, - PyObject * seq) +static int Euler_ass_slice(EulerObject * self, int begin, int end, PyObject * seq) { - int i, y, size = 0; - float eul[3]; - PyObject *e; + int i, size; + float eul[EULER_SIZE]; if(!BaseMath_ReadCallback(self)) return -1; - CLAMP(begin, 0, 3); - if (end<0) end= 4+end; - CLAMP(end, 0, 3); + CLAMP(begin, 0, EULER_SIZE); + if (end<0) end= (EULER_SIZE + 1) + end; + CLAMP(end, 0, EULER_SIZE); begin = MIN2(begin,end); - size = PySequence_Length(seq); + if((size=mathutils_array_parse(eul, 0, EULER_SIZE, seq, "mathutils.Euler[begin:end] = []")) == -1) + return -1; + if(size != (end - begin)){ PyErr_SetString(PyExc_TypeError, "euler[begin:end] = []: size mismatch in slice assignment"); return -1; } - for (i = 0; i < size; i++) { - e = PySequence_GetItem(seq, i); - if (e == NULL) { // Failed to read sequence - PyErr_SetString(PyExc_RuntimeError, "euler[begin:end] = []: unable to read sequence"); - return -1; - } - - eul[i] = (float)PyFloat_AsDouble(e); - Py_DECREF(e); - - if(eul[i]==-1 && PyErr_Occurred()) { // parsed item not a number - PyErr_SetString(PyExc_TypeError, "euler[begin:end] = []: sequence argument not a number"); - return -1; - } - } - //parsed well - now set in vector - for(y = 0; y < 3; y++){ - self->eul[begin + y] = eul[y]; - } + for(i= 0; i < EULER_SIZE; i++) + self->eul[begin + i] = eul[i]; BaseMath_WriteCallback(self); return 0; } + +static PyObject *Euler_subscript(EulerObject *self, PyObject *item) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return NULL; + if (i < 0) + i += EULER_SIZE; + return Euler_item(self, i); + } else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx((PySliceObject*)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0) + return NULL; + + if (slicelength <= 0) { + return PyList_New(0); + } + else if (step == 1) { + return Euler_slice(self, start, stop); + } + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with eulers"); + return NULL; + } + } + else { + PyErr_Format(PyExc_TypeError, + "euler indices must be integers, not %.200s", + item->ob_type->tp_name); + return NULL; + } +} + + +static int Euler_ass_subscript(EulerObject *self, PyObject *item, PyObject *value) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return -1; + if (i < 0) + i += EULER_SIZE; + return Euler_ass_item(self, i, value); + } + else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx((PySliceObject*)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0) + return -1; + + if (step == 1) + return Euler_ass_slice(self, start, stop, value); + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with euler"); + return -1; + } + } + else { + PyErr_Format(PyExc_TypeError, + "euler indices must be integers, not %.200s", + item->ob_type->tp_name); + return -1; + } +} + //-----------------PROTCOL DECLARATIONS-------------------------- static PySequenceMethods Euler_SeqMethods = { - (lenfunc) Euler_len, /* sq_length */ - (binaryfunc) 0, /* sq_concat */ - (ssizeargfunc) 0, /* sq_repeat */ - (ssizeargfunc) Euler_item, /* sq_item */ - (ssizessizeargfunc) Euler_slice, /* sq_slice */ - (ssizeobjargproc) Euler_ass_item, /* sq_ass_item */ - (ssizessizeobjargproc) Euler_ass_slice, /* sq_ass_slice */ + (lenfunc) Euler_len, /* sq_length */ + (binaryfunc) NULL, /* sq_concat */ + (ssizeargfunc) NULL, /* sq_repeat */ + (ssizeargfunc) Euler_item, /* sq_item */ + (ssizessizeargfunc) NULL, /* sq_slice, deprecated */ + (ssizeobjargproc) Euler_ass_item, /* sq_ass_item */ + (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */ + (objobjproc) NULL, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; +static PyMappingMethods Euler_AsMapping = { + (lenfunc)Euler_len, + (binaryfunc)Euler_subscript, + (objobjargproc)Euler_ass_subscript +}; /* - * vector axis, vector.x/y/z/w + * euler axis, euler.x/y/z */ static PyObject *Euler_getAxis( EulerObject * self, void *type ) { @@ -513,8 +590,12 @@ static int Euler_setAxis( EulerObject * self, PyObject * value, void * type ) /* rotation order */ static PyObject *Euler_getOrder(EulerObject *self, void *type) { - static char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"}; - return PyUnicode_FromString(order[self->order]); + const char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"}; + + if(!BaseMath_ReadCallback(self)) /* can read order too */ + return NULL; + + return PyUnicode_FromString(order[self->order-EULER_ORDER_XYZ]); } static int Euler_setOrder( EulerObject * self, PyObject * value, void * type ) @@ -522,15 +603,11 @@ static int Euler_setOrder( EulerObject * self, PyObject * value, void * type ) char *order_str= _PyUnicode_AsString(value); short order= euler_order_from_string(order_str, "euler.order"); - if(order < 0) + if(order == -1) return -1; - if(self->cb_user) { - PyErr_SetString(PyExc_TypeError, "euler.order: assignment is not allowed on eulers with an owner"); - return -1; - } - self->order= order; + BaseMath_WriteCallback(self); /* order can be written back */ return 0; } @@ -555,7 +632,7 @@ static struct PyMethodDef Euler_methods[] = { {"unique", (PyCFunction) Euler_Unique, METH_NOARGS, Euler_Unique_doc}, {"to_matrix", (PyCFunction) Euler_ToMatrix, METH_NOARGS, Euler_ToMatrix_doc}, {"to_quat", (PyCFunction) Euler_ToQuat, METH_NOARGS, Euler_ToQuat_doc}, - {"rotate", (PyCFunction) Euler_Rotate, METH_VARARGS, NULL}, + {"rotate", (PyCFunction) Euler_Rotate, METH_VARARGS, Euler_Rotate_doc}, {"make_compatible", (PyCFunction) Euler_MakeCompatible, METH_O, Euler_MakeCompatible_doc}, {"__copy__", (PyCFunction) Euler_copy, METH_VARARGS, Euler_copy_doc}, {"copy", (PyCFunction) Euler_copy, METH_VARARGS, Euler_copy_doc}, @@ -579,7 +656,7 @@ PyTypeObject euler_Type = { (reprfunc) Euler_repr, //tp_repr 0, //tp_as_number &Euler_SeqMethods, //tp_as_sequence - 0, //tp_as_mapping + &Euler_AsMapping, //tp_as_mapping 0, //tp_hash 0, //tp_call 0, //tp_str @@ -623,7 +700,6 @@ PyTypeObject euler_Type = { PyObject *newEulerObject(float *eul, short order, int type, PyTypeObject *base_type) { EulerObject *self; - int x; if(base_type) self = (EulerObject *)base_type->tp_alloc(base_type, 0); else self = PyObject_NEW(EulerObject, &euler_Type); @@ -632,20 +708,20 @@ PyObject *newEulerObject(float *eul, short order, int type, PyTypeObject *base_t self->cb_user= NULL; self->cb_type= self->cb_subtype= 0; - if(type == Py_WRAP){ + if(type == Py_WRAP) { self->eul = eul; self->wrapped = Py_WRAP; - }else if (type == Py_NEW){ - self->eul = PyMem_Malloc(3 * sizeof(float)); - if(!eul) { //new empty - for(x = 0; x < 3; x++) { - self->eul[x] = 0.0f; - } - }else{ - VECCOPY(self->eul, eul); - } + } + else if (type == Py_NEW){ + self->eul = PyMem_Malloc(EULER_SIZE * sizeof(float)); + if(eul) + copy_v3_v3(self->eul, eul); + else + zero_v3(self->eul); + self->wrapped = Py_NEW; - }else{ //bad type + } + else{ return NULL; } diff --git a/source/blender/python/generic/euler.h b/source/blender/python/generic/mathutils_euler.h similarity index 76% rename from source/blender/python/generic/euler.h rename to source/blender/python/generic/mathutils_euler.h index fd00e74d30a..b8523c3b661 100644 --- a/source/blender/python/generic/euler.h +++ b/source/blender/python/generic/mathutils_euler.h @@ -1,5 +1,5 @@ /* - * $Id: euler.h 21254 2009-06-30 00:42:17Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -37,14 +37,7 @@ extern PyTypeObject euler_Type; #define EulerObject_Check(_v) PyObject_TypeCheck((_v), &euler_Type) typedef struct { - PyObject_VAR_HEAD - float *eul; /*1D array of data */ - PyObject *cb_user; /* if this vector references another object, otherwise NULL, *Note* this owns its reference */ - unsigned char cb_type; /* which user funcs do we adhere to, RNA, GameObject, etc */ - unsigned char cb_subtype; /* subtype: location, rotation... to avoid defining many new functions for every attribute of the same type */ - unsigned char wrapped; /* wrapped data type? */ - /* end BaseMathObject */ - + BASE_MATH_MEMBERS(eul) unsigned char order; /* rotation order */ } EulerObject; diff --git a/source/blender/python/generic/matrix.c b/source/blender/python/generic/mathutils_matrix.c similarity index 92% rename from source/blender/python/generic/matrix.c rename to source/blender/python/generic/mathutils_matrix.c index 1be74101896..a211386f503 100644 --- a/source/blender/python/generic/matrix.c +++ b/source/blender/python/generic/mathutils_matrix.c @@ -1,5 +1,5 @@ /* - * $Id: matrix.c 21293 2009-07-01 20:55:32Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -25,7 +25,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Mathutils.h" +#include "mathutils.h" #include "BKE_utildefines.h" #include "BLI_math.h" @@ -37,60 +37,60 @@ static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* /* matrix vector callbacks */ int mathutils_matrix_vector_cb_index= -1; -static int mathutils_matrix_vector_check(PyObject *self_p) +static int mathutils_matrix_vector_check(BaseMathObject *bmo) { - MatrixObject *self= (MatrixObject*)self_p; + MatrixObject *self= (MatrixObject *)bmo->cb_user; return BaseMath_ReadCallback(self); } -static int mathutils_matrix_vector_get(PyObject *self_p, int subtype, float *vec_from) +static int mathutils_matrix_vector_get(BaseMathObject *bmo, int subtype) { - MatrixObject *self= (MatrixObject*)self_p; + MatrixObject *self= (MatrixObject *)bmo->cb_user; int i; if(!BaseMath_ReadCallback(self)) return 0; - for(i=0; icolSize; i++) - vec_from[i]= self->matrix[subtype][i]; + for(i=0; i < self->colSize; i++) + bmo->data[i]= self->matrix[subtype][i]; return 1; } -static int mathutils_matrix_vector_set(PyObject *self_p, int subtype, float *vec_to) +static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype) { - MatrixObject *self= (MatrixObject*)self_p; + MatrixObject *self= (MatrixObject *)bmo->cb_user; int i; if(!BaseMath_ReadCallback(self)) return 0; - for(i=0; icolSize; i++) - self->matrix[subtype][i]= vec_to[i]; + for(i=0; i < self->colSize; i++) + self->matrix[subtype][i]= bmo->data[i]; BaseMath_WriteCallback(self); return 1; } -static int mathutils_matrix_vector_get_index(PyObject *self_p, int subtype, float *vec_from, int index) +static int mathutils_matrix_vector_get_index(BaseMathObject *bmo, int subtype, int index) { - MatrixObject *self= (MatrixObject*)self_p; + MatrixObject *self= (MatrixObject *)bmo->cb_user; if(!BaseMath_ReadCallback(self)) return 0; - vec_from[index]= self->matrix[subtype][index]; + bmo->data[index]= self->matrix[subtype][index]; return 1; } -static int mathutils_matrix_vector_set_index(PyObject *self_p, int subtype, float *vec_to, int index) +static int mathutils_matrix_vector_set_index(BaseMathObject *bmo, int subtype, int index) { - MatrixObject *self= (MatrixObject*)self_p; + MatrixObject *self= (MatrixObject *)bmo->cb_user; if(!BaseMath_ReadCallback(self)) return 0; - self->matrix[subtype][index]= vec_to[index]; + self->matrix[subtype][index]= bmo->data[index]; BaseMath_WriteCallback(self); return 1; @@ -105,7 +105,7 @@ Mathutils_Callback mathutils_matrix_vector_cb = { }; /* matrix vector callbacks, this is so you can do matrix[i][j] = val */ -//----------------------------------Mathutils.Matrix() ----------------- +//----------------------------------mathutils.Matrix() ----------------- //mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. //create a new matrix type static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @@ -118,8 +118,8 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds) float scalar; argSize = PyTuple_GET_SIZE(args); - if(argSize > 4){ //bad arg nums - PyErr_SetString(PyExc_AttributeError, "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); + if(argSize > MATRIX_MAX_DIM) { //bad arg nums + PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); return NULL; } else if (argSize == 0) { //return empty 4D matrix return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, NULL); @@ -141,13 +141,13 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (PySequence_Check(argObject)) { //seq? if(seqSize){ //0 at first if(PySequence_Length(argObject) != seqSize){ //seq size not same - PyErr_SetString(PyExc_AttributeError, "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); return NULL; } } seqSize = PySequence_Length(argObject); }else{ //arg not a sequence - PyErr_SetString(PyExc_TypeError, "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); + PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); return NULL; } } @@ -155,14 +155,14 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds) for (i = 0; i < argSize; i++){ m = PyTuple_GET_ITEM(args, i); if (m == NULL) { // Failed to read sequence - PyErr_SetString(PyExc_RuntimeError, "Mathutils.Matrix(): failed to parse arguments...\n"); + PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments...\n"); return NULL; } for (j = 0; j < seqSize; j++) { s = PySequence_GetItem(m, j); if (s == NULL) { // Failed to read sequence - PyErr_SetString(PyExc_RuntimeError, "Mathutils.Matrix(): failed to parse arguments...\n"); + PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments...\n"); return NULL; } @@ -170,7 +170,7 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(s); if(scalar==-1 && PyErr_Occurred()) { // parsed item is not a number - PyErr_SetString(PyExc_AttributeError, "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); + PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); return NULL; } @@ -221,7 +221,7 @@ static PyObject *Matrix_toQuat(MatrixObject * self) return NULL; } if(self->colSize == 3){ - mat3_to_quat( quat,(float (*)[3])self->contigPtr); + mat3_to_quat( quat,(float (*)[3])self->contigPtr); }else{ mat4_to_quat( quat,(float (*)[4])self->contigPtr); } @@ -245,7 +245,7 @@ static char Matrix_toEuler_doc[] = PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args) { char *order_str= NULL; - short order= 0; + short order= EULER_ORDER_XYZ; float eul[3], eul_compatf[3]; EulerObject *eul_compat = NULL; @@ -262,7 +262,7 @@ PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args) if(!BaseMath_ReadCallback(eul_compat)) return NULL; - VECCOPY(eul_compatf, eul_compat->eul); + copy_v3_v3(eul_compatf, eul_compat->eul); } /*must be 3-4 cols, 3-4 rows, square matrix*/ @@ -279,16 +279,16 @@ PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args) if(order_str) { order= euler_order_from_string(order_str, "Matrix.to_euler()"); - if(order < 0) + if(order == -1) return NULL; } if(eul_compat) { - if(order == 0) mat3_to_compatible_eul( eul, eul_compatf, mat); + if(order == 1) mat3_to_compatible_eul( eul, eul_compatf, mat); else mat3_to_compatible_eulO(eul, eul_compatf, order, mat); } else { - if(order == 0) mat3_to_eul(eul, mat); + if(order == 1) mat3_to_eul(eul, mat); else mat3_to_eulO(eul, order, mat); } @@ -321,11 +321,6 @@ PyObject *Matrix_Resize4x4(MatrixObject * self) PyErr_SetString(PyExc_MemoryError, "matrix.resize4x4(): problem allocating pointer space"); return NULL; } - self->matrix = PyMem_Realloc(self->matrix, (sizeof(float *) * 4)); - if(self->matrix == NULL) { - PyErr_SetString(PyExc_MemoryError, "matrix.resize4x4(): problem allocating pointer space"); - return NULL; - } /*set row pointers*/ for(x = 0; x < 4; x++) { self->matrix[x] = self->contigPtr + (x * 4); @@ -728,27 +723,25 @@ PyObject *Matrix_copy(MatrixObject * self) static PyObject *Matrix_repr(MatrixObject * self) { int x, y; - char buffer[48], str[1024]; + char str[1024]="Matrix((", *str_p; if(!BaseMath_ReadCallback(self)) return NULL; - - BLI_strncpy(str,"",1024); + + str_p= &str[8]; + for(x = 0; x < self->colSize; x++){ - sprintf(buffer, "["); - strcat(str,buffer); for(y = 0; y < (self->rowSize - 1); y++) { - sprintf(buffer, "%.6f, ", self->matrix[y][x]); - strcat(str,buffer); + str_p += sprintf(str_p, "%f, ", self->matrix[y][x]); } if(x < (self->colSize-1)){ - sprintf(buffer, "%.6f](matrix [row %d])\n", self->matrix[y][x], x); - strcat(str,buffer); - }else{ - sprintf(buffer, "%.6f](matrix [row %d])", self->matrix[y][x], x); - strcat(str,buffer); + str_p += sprintf(str_p, "%f), (", self->matrix[y][x]); + } + else{ + str_p += sprintf(str_p, "%f)", self->matrix[y][x]); } } + strcat(str_p, ")"); return PyUnicode_FromString(str); } @@ -1133,13 +1126,16 @@ static PyObject* Matrix_inv(MatrixObject *self) /*-----------------PROTOCOL DECLARATIONS--------------------------*/ static PySequenceMethods Matrix_SeqMethods = { - (lenfunc) Matrix_len, /* sq_length */ - (binaryfunc) 0, /* sq_concat */ - (ssizeargfunc) 0, /* sq_repeat */ - (ssizeargfunc) Matrix_item, /* sq_item */ - (ssizessizeargfunc) Matrix_slice, /* sq_slice */ - (ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */ - (ssizessizeobjargproc) Matrix_ass_slice, /* sq_ass_slice */ + (lenfunc) Matrix_len, /* sq_length */ + (binaryfunc) NULL, /* sq_concat */ + (ssizeargfunc) NULL, /* sq_repeat */ + (ssizeargfunc) Matrix_item, /* sq_item */ + (ssizessizeargfunc) Matrix_slice, /* sq_slice, deprecated TODO, replace */ + (ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */ + (ssizessizeobjargproc) Matrix_ass_slice, /* sq_ass_slice, deprecated TODO, replace */ + (objobjproc) NULL, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; @@ -1172,8 +1168,8 @@ static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item) } else { PyErr_Format(PyExc_TypeError, - "vector indices must be integers, not %.200s", - item->ob_type->tp_name); + "vector indices must be integers, not %.200s", + item->ob_type->tp_name); return NULL; } } @@ -1203,8 +1199,8 @@ static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* va } else { PyErr_Format(PyExc_TypeError, - "matrix indices must be integers, not %.200s", - item->ob_type->tp_name); + "matrix indices must be integers, not %.200s", + item->ob_type->tp_name); return -1; } } @@ -1389,13 +1385,13 @@ PyTypeObject matrix_Type = { /*------------------------newMatrixObject (internal)------------- creates a new matrix object self->matrix self->contiguous_ptr (reference to data.xxx) - [0]------------->[0] - [1] - [2] - [1]------------->[3] - [4] - [5] - .... + [0]------------->[0] + [1] + [2] + [1]------------->[3] + [4] + [5] + .... self->matrix[1][1] = self->contigPtr[4] */ /*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER @@ -1425,12 +1421,6 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyType if(type == Py_WRAP){ self->contigPtr = mat; - /*create pointer array*/ - self->matrix = PyMem_Malloc(rowSize * sizeof(float *)); - if(self->matrix == NULL) { /*allocation failure*/ - PyErr_SetString( PyExc_MemoryError, "matrix(): problem allocating pointer space"); - return NULL; - } /*pointer array points to contigous memory*/ for(x = 0; x < rowSize; x++) { self->matrix[x] = self->contigPtr + (x * colSize); @@ -1442,13 +1432,6 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyType PyErr_SetString( PyExc_MemoryError, "matrix(): problem allocating pointer space\n"); return NULL; } - /*create pointer array*/ - self->matrix = PyMem_Malloc(rowSize * sizeof(float *)); - if(self->matrix == NULL) { /*allocation failure*/ - PyMem_Free(self->contigPtr); - PyErr_SetString( PyExc_MemoryError, "matrix(): problem allocating pointer space"); - return NULL; - } /*pointer array points to contigous memory*/ for(x = 0; x < rowSize; x++) { self->matrix[x] = self->contigPtr + (x * colSize); diff --git a/source/blender/python/generic/matrix.h b/source/blender/python/generic/mathutils_matrix.h similarity index 72% rename from source/blender/python/generic/matrix.h rename to source/blender/python/generic/mathutils_matrix.h index 33b6224f694..21538f8168e 100644 --- a/source/blender/python/generic/matrix.h +++ b/source/blender/python/generic/mathutils_matrix.h @@ -1,5 +1,5 @@ /* - * $Id: matrix.h 21254 2009-06-30 00:42:17Z campbellbarton $ + * $Id$ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -34,21 +34,14 @@ extern PyTypeObject matrix_Type; #define MatrixObject_Check(_v) PyObject_TypeCheck((_v), &matrix_Type) +#define MATRIX_MAX_DIM 4 -typedef float **ptRow; -typedef struct _Matrix { /* keep aligned with BaseMathObject in Mathutils.h */ - PyObject_VAR_HEAD - float *contigPtr; /*1D array of data (alias)*/ - PyObject *cb_user; /* if this vector references another object, otherwise NULL, *Note* this owns its reference */ - unsigned char cb_type; /* which user funcs do we adhere to, RNA, GameObject, etc */ - unsigned char cb_subtype; /* subtype: location, rotation... to avoid defining many new functions for every attribute of the same type */ - unsigned char wrapped; /*is wrapped data?*/ - /* end BaseMathObject */ +typedef struct { + BASE_MATH_MEMBERS(contigPtr) unsigned char rowSize; unsigned int colSize; - ptRow matrix; /*ptr to the contigPtr (accessor)*/ - + float *matrix[MATRIX_MAX_DIM]; /* ptr to the contigPtr (accessor) */ } MatrixObject; /*struct data contains a pointer to the actual data that the diff --git a/source/blender/python/generic/quat.c b/source/blender/python/generic/mathutils_quat.c similarity index 76% rename from source/blender/python/generic/quat.c rename to source/blender/python/generic/mathutils_quat.c index 19fa3ea7270..f94e5e2a03a 100644 --- a/source/blender/python/generic/quat.c +++ b/source/blender/python/generic/mathutils_quat.c @@ -1,5 +1,5 @@ /* - * $Id: quat.c 21462 2009-07-09 15:40:04Z ton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,13 +26,37 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Mathutils.h" +#include "mathutils.h" #include "BLI_math.h" #include "BKE_utildefines.h" -#include "BLI_blenlib.h" + +#define QUAT_SIZE 4 //-----------------------------METHODS------------------------------ + +/* note: BaseMath_ReadCallback must be called beforehand */ +static PyObject *Quaternion_ToTupleExt(QuaternionObject *self, int ndigits) +{ + PyObject *ret; + int i; + + ret= PyTuple_New(QUAT_SIZE); + + if(ndigits >= 0) { + for(i= 0; i < QUAT_SIZE; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->quat[i], ndigits))); + } + } + else { + for(i= 0; i < QUAT_SIZE; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->quat[i])); + } + } + + return ret; +} + static char Quaternion_ToEuler_doc[] = ".. method:: to_euler(order, euler_compat)\n" "\n" @@ -49,7 +73,7 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args) { float eul[3]; char *order_str= NULL; - short order= 0; + short order= EULER_ORDER_XYZ; EulerObject *eul_compat = NULL; if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat)) @@ -61,7 +85,7 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args) if(order_str) { order= euler_order_from_string(order_str, "Matrix.to_euler()"); - if(order < 0) + if(order == -1) return NULL; } @@ -73,12 +97,12 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args) quat_to_mat3(mat, self->quat); - if(order == 0) mat3_to_compatible_eul(eul, eul_compat->eul, mat); - else mat3_to_compatible_eulO(eul, eul_compat->eul, order, mat); + if(order == EULER_ORDER_XYZ) mat3_to_compatible_eul(eul, eul_compat->eul, mat); + else mat3_to_compatible_eulO(eul, eul_compat->eul, order, mat); } else { - if(order == 0) quat_to_eul(eul, self->quat); - else quat_to_eulO(eul, order, self->quat); + if(order == EULER_ORDER_XYZ) quat_to_eul(eul, self->quat); + else quat_to_eulO(eul, order, self->quat); } return newEulerObject(eul, order, Py_NEW, NULL); @@ -116,7 +140,7 @@ static char Quaternion_Cross_doc[] = static PyObject *Quaternion_Cross(QuaternionObject * self, QuaternionObject * value) { - float quat[4]; + float quat[QUAT_SIZE]; if (!QuaternionObject_Check(value)) { PyErr_SetString( PyExc_TypeError, "quat.cross(value): expected a quaternion argument" ); @@ -166,7 +190,7 @@ static char Quaternion_Difference_doc[] = static PyObject *Quaternion_Difference(QuaternionObject * self, QuaternionObject * value) { - float quat[4], tempQuat[4]; + float quat[QUAT_SIZE], tempQuat[QUAT_SIZE]; double dot = 0.0f; int x; @@ -178,15 +202,11 @@ static PyObject *Quaternion_Difference(QuaternionObject * self, QuaternionObject if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value)) return NULL; - tempQuat[0] = self->quat[0]; - tempQuat[1] = - self->quat[1]; - tempQuat[2] = - self->quat[2]; - tempQuat[3] = - self->quat[3]; + copy_qt_qt(tempQuat, self->quat); + conjugate_qt(tempQuat); + dot = sqrt(dot_qtqt(tempQuat, tempQuat)); - dot = sqrt(tempQuat[0] * tempQuat[0] + tempQuat[1] * tempQuat[1] + - tempQuat[2] * tempQuat[2] + tempQuat[3] * tempQuat[3]); - - for(x = 0; x < 4; x++) { + for(x = 0; x < QUAT_SIZE; x++) { tempQuat[x] /= (float)(dot * dot); } mul_qt_qtqt(quat, tempQuat, value->quat); @@ -208,7 +228,7 @@ static char Quaternion_Slerp_doc[] = static PyObject *Quaternion_Slerp(QuaternionObject *self, PyObject *args) { QuaternionObject *value; - float quat[4], fac; + float quat[QUAT_SIZE], fac; if(!PyArg_ParseTuple(args, "O!f:slerp", &quaternion_Type, &value, &fac)) { PyErr_SetString(PyExc_TypeError, "quat.slerp(): expected Quaternion types and float"); @@ -352,14 +372,19 @@ static PyObject *Quaternion_copy(QuaternionObject * self) //print the object to screen static PyObject *Quaternion_repr(QuaternionObject * self) { - char str[64]; - + PyObject *ret, *tuple; + if(!BaseMath_ReadCallback(self)) return NULL; - sprintf(str, "[%.6f, %.6f, %.6f, %.6f](quaternion)", self->quat[0], self->quat[1], self->quat[2], self->quat[3]); - return PyUnicode_FromString(str); + tuple= Quaternion_ToTupleExt(self, -1); + + ret= PyUnicode_FromFormat("Quaternion(%R)", tuple); + + Py_DECREF(tuple); + return ret; } + //------------------------tp_richcmpr //returns -1 execption, 0 false, 1 true static PyObject* Quaternion_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type) @@ -388,10 +413,10 @@ static PyObject* Quaternion_richcmpr(PyObject *objectA, PyObject *objectB, int c switch (comparison_type){ case Py_EQ: - result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, 4, 1); + result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1); break; case Py_NE: - result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, 4, 1); + result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1); if (result == 0){ result = 1; }else{ @@ -414,15 +439,15 @@ static PyObject* Quaternion_richcmpr(PyObject *objectA, PyObject *objectB, int c //sequence length static int Quaternion_len(QuaternionObject * self) { - return 4; + return QUAT_SIZE; } //----------------------------object[]--------------------------- //sequence accessor (get) static PyObject *Quaternion_item(QuaternionObject * self, int i) { - if(i<0) i= 4-i; + if(i<0) i= QUAT_SIZE-i; - if(i < 0 || i >= 4) { + if(i < 0 || i >= QUAT_SIZE) { PyErr_SetString(PyExc_IndexError, "quaternion[attribute]: array index out of range\n"); return NULL; } @@ -443,9 +468,9 @@ static int Quaternion_ass_item(QuaternionObject * self, int i, PyObject * ob) return -1; } - if(i<0) i= 4-i; + if(i<0) i= QUAT_SIZE-i; - if(i < 0 || i >= 4){ + if(i < 0 || i >= QUAT_SIZE){ PyErr_SetString(PyExc_IndexError, "quaternion[attribute] = x: array assignment index out of range\n"); return -1; } @@ -466,9 +491,9 @@ static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end) if(!BaseMath_ReadCallback(self)) return NULL; - CLAMP(begin, 0, 4); - if (end<0) end= 5+end; - CLAMP(end, 0, 4); + CLAMP(begin, 0, QUAT_SIZE); + if (end<0) end= (QUAT_SIZE + 1) + end; + CLAMP(end, 0, QUAT_SIZE); begin = MIN2(begin,end); list = PyList_New(end - begin); @@ -483,52 +508,107 @@ static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end) //sequence slice (set) static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyObject * seq) { - int i, y, size = 0; - float quat[4]; - PyObject *q; + int i, size; + float quat[QUAT_SIZE]; if(!BaseMath_ReadCallback(self)) return -1; - CLAMP(begin, 0, 4); - if (end<0) end= 5+end; - CLAMP(end, 0, 4); + CLAMP(begin, 0, QUAT_SIZE); + if (end<0) end= (QUAT_SIZE + 1) + end; + CLAMP(end, 0, QUAT_SIZE); begin = MIN2(begin,end); - size = PySequence_Length(seq); + if((size=mathutils_array_parse(quat, 0, QUAT_SIZE, seq, "mathutils.Quaternion[begin:end] = []")) == -1) + return -1; + if(size != (end - begin)){ - PyErr_SetString(PyExc_TypeError, "quaternion[begin:end] = []: size mismatch in slice assignment\n"); + PyErr_SetString(PyExc_TypeError, "quaternion[begin:end] = []: size mismatch in slice assignment"); return -1; } - for (i = 0; i < size; i++) { - q = PySequence_GetItem(seq, i); - if (q == NULL) { // Failed to read sequence - PyErr_SetString(PyExc_RuntimeError, "quaternion[begin:end] = []: unable to read sequence\n"); - return -1; - } - - quat[i]= (float)PyFloat_AsDouble(q); - Py_DECREF(q); - - if(quat[i]==-1.0f && PyErr_Occurred()) { /* parsed item not a number */ - PyErr_SetString(PyExc_TypeError, "quaternion[begin:end] = []: sequence argument not a number\n"); - return -1; - } - } - //parsed well - now set in vector - for(y = 0; y < size; y++) - self->quat[begin + y] = quat[y]; + /* parsed well - now set in vector */ + for(i= 0; i < size; i++) + self->quat[begin + i] = quat[i]; BaseMath_WriteCallback(self); return 0; } + + +static PyObject *Quaternion_subscript(QuaternionObject *self, PyObject *item) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return NULL; + if (i < 0) + i += QUAT_SIZE; + return Quaternion_item(self, i); + } else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx((PySliceObject*)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0) + return NULL; + + if (slicelength <= 0) { + return PyList_New(0); + } + else if (step == 1) { + return Quaternion_slice(self, start, stop); + } + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with quaternions"); + return NULL; + } + } + else { + PyErr_Format(PyExc_TypeError, + "quaternion indices must be integers, not %.200s", + item->ob_type->tp_name); + return NULL; + } +} + + +static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyObject *value) +{ + if (PyIndex_Check(item)) { + Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return -1; + if (i < 0) + i += QUAT_SIZE; + return Quaternion_ass_item(self, i, value); + } + else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx((PySliceObject*)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0) + return -1; + + if (step == 1) + return Quaternion_ass_slice(self, start, stop, value); + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with quaternion"); + return -1; + } + } + else { + PyErr_Format(PyExc_TypeError, + "quaternion indices must be integers, not %.200s", + item->ob_type->tp_name); + return -1; + } +} + //------------------------NUMERIC PROTOCOLS---------------------- //------------------------obj + obj------------------------------ //addition static PyObject *Quaternion_add(PyObject * q1, PyObject * q2) { - float quat[4]; + float quat[QUAT_SIZE]; QuaternionObject *quat1 = NULL, *quat2 = NULL; if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) { @@ -549,7 +629,7 @@ static PyObject *Quaternion_add(PyObject * q1, PyObject * q2) static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2) { int x; - float quat[4]; + float quat[QUAT_SIZE]; QuaternionObject *quat1 = NULL, *quat2 = NULL; if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) { @@ -563,7 +643,7 @@ static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2) if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2)) return NULL; - for(x = 0; x < 4; x++) { + for(x = 0; x < QUAT_SIZE; x++) { quat[x] = quat1->quat[x] - quat2->quat[x]; } @@ -573,7 +653,7 @@ static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2) //mulplication static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2) { - float quat[4], scalar; + float quat[QUAT_SIZE], scalar; QuaternionObject *quat1 = NULL, *quat2 = NULL; VectorObject *vec = NULL; @@ -627,50 +707,59 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2) //-----------------PROTOCOL DECLARATIONS-------------------------- static PySequenceMethods Quaternion_SeqMethods = { - (lenfunc) Quaternion_len, /* sq_length */ - (binaryfunc) 0, /* sq_concat */ - (ssizeargfunc) 0, /* sq_repeat */ - (ssizeargfunc) Quaternion_item, /* sq_item */ - (ssizessizeargfunc) Quaternion_slice, /* sq_slice */ - (ssizeobjargproc) Quaternion_ass_item, /* sq_ass_item */ - (ssizessizeobjargproc) Quaternion_ass_slice, /* sq_ass_slice */ + (lenfunc) Quaternion_len, /* sq_length */ + (binaryfunc) NULL, /* sq_concat */ + (ssizeargfunc) NULL, /* sq_repeat */ + (ssizeargfunc) Quaternion_item, /* sq_item */ + (ssizessizeargfunc) NULL, /* sq_slice, deprecated */ + (ssizeobjargproc) Quaternion_ass_item, /* sq_ass_item */ + (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */ + (objobjproc) NULL, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ +}; + +static PyMappingMethods Quaternion_AsMapping = { + (lenfunc)Quaternion_len, + (binaryfunc)Quaternion_subscript, + (objobjargproc)Quaternion_ass_subscript }; static PyNumberMethods Quaternion_NumMethods = { - (binaryfunc) Quaternion_add, /*nb_add*/ - (binaryfunc) Quaternion_sub, /*nb_subtract*/ - (binaryfunc) Quaternion_mul, /*nb_multiply*/ - 0, /*nb_remainder*/ - 0, /*nb_divmod*/ - 0, /*nb_power*/ - (unaryfunc) 0, /*nb_negative*/ - (unaryfunc) 0, /*tp_positive*/ - (unaryfunc) 0, /*tp_absolute*/ - (inquiry) 0, /*tp_bool*/ - (unaryfunc) 0, /*nb_invert*/ - 0, /*nb_lshift*/ - (binaryfunc)0, /*nb_rshift*/ - 0, /*nb_and*/ - 0, /*nb_xor*/ - 0, /*nb_or*/ - 0, /*nb_int*/ - 0, /*nb_reserved*/ - 0, /*nb_float*/ - 0, /* nb_inplace_add */ - 0, /* nb_inplace_subtract */ - 0, /* nb_inplace_multiply */ - 0, /* nb_inplace_remainder */ - 0, /* nb_inplace_power */ - 0, /* nb_inplace_lshift */ - 0, /* nb_inplace_rshift */ - 0, /* nb_inplace_and */ - 0, /* nb_inplace_xor */ - 0, /* nb_inplace_or */ - 0, /* nb_floor_divide */ - 0, /* nb_true_divide */ - 0, /* nb_inplace_floor_divide */ - 0, /* nb_inplace_true_divide */ - 0, /* nb_index */ + (binaryfunc) Quaternion_add, /*nb_add*/ + (binaryfunc) Quaternion_sub, /*nb_subtract*/ + (binaryfunc) Quaternion_mul, /*nb_multiply*/ + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + (unaryfunc) 0, /*nb_negative*/ + (unaryfunc) 0, /*tp_positive*/ + (unaryfunc) 0, /*tp_absolute*/ + (inquiry) 0, /*tp_bool*/ + (unaryfunc) 0, /*nb_invert*/ + 0, /*nb_lshift*/ + (binaryfunc)0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + 0, /*nb_int*/ + 0, /*nb_reserved*/ + 0, /*nb_float*/ + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + 0, /* nb_floor_divide */ + 0, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ + 0, /* nb_index */ }; static PyObject *Quaternion_getAxis( QuaternionObject * self, void *type ) @@ -695,16 +784,11 @@ static PyObject *Quaternion_getAngle( QuaternionObject * self, void *type ) static PyObject *Quaternion_getAxisVec( QuaternionObject * self, void *type ) { - int i; float vec[3]; - double mag = self->quat[0] * (Py_PI / 180); - mag = 2 * (saacos(mag)); - mag = sin(mag / 2); - for(i = 0; i < 3; i++) - vec[i] = (float)(self->quat[i + 1] / mag); - - normalize_v3(vec); - //If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations + + normalize_v3_v3(vec, self->quat+1); + + /* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */ if( EXPP_FloatsAreEqual(vec[0], 0.0f, 10) && EXPP_FloatsAreEqual(vec[1], 0.0f, 10) && EXPP_FloatsAreEqual(vec[2], 0.0f, 10) ){ @@ -713,97 +797,31 @@ static PyObject *Quaternion_getAxisVec( QuaternionObject * self, void *type ) return (PyObject *) newVectorObject(vec, 3, Py_NEW, NULL); } -//----------------------------------Mathutils.Quaternion() -------------- +//----------------------------------mathutils.Quaternion() -------------- static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyObject *listObject = NULL, *n, *q; - int size, i; - float quat[4]; - double angle = 0.0f; + PyObject *seq= NULL; + float angle = 0.0f; + float quat[QUAT_SIZE]= {0.0f, 0.0f, 0.0f, 0.0f}; - size = PyTuple_GET_SIZE(args); - if (size == 1 || size == 2) { //seq? - listObject = PyTuple_GET_ITEM(args, 0); - if (PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - if ((size == 4 && PySequence_Length(args) !=1) || - (size == 3 && PySequence_Length(args) !=2) || (size >4 || size < 3)) { - // invalid args/size - PyErr_SetString(PyExc_AttributeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - return NULL; - } - if(size == 3){ //get angle in axis/angle - n = PySequence_GetItem(args, 1); - if(n == NULL) { // parsed item not a number or getItem fail - PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - return NULL; - } + if(!PyArg_ParseTuple(args, "|Of:mathutils.Quaternion", &seq, &angle)) + return NULL; - angle = PyFloat_AsDouble(n); - Py_DECREF(n); - - if (angle==-1 && PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - return NULL; - } - } - }else{ - listObject = PyTuple_GET_ITEM(args, 1); - if (size>1 && PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - if (size != 3) { - // invalid args/size - PyErr_SetString(PyExc_AttributeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - return NULL; - } - angle = PyFloat_AsDouble(PyTuple_GET_ITEM(args, 0)); - - if (angle==-1 && PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - return NULL; - } - } else { // argument was not a sequence - PyErr_SetString(PyExc_TypeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - return NULL; - } - } - } else if (size == 0) { //returns a new empty quat - return newQuaternionObject(NULL, Py_NEW, NULL); - } else { - listObject = args; - } - - if (size == 3) { // invalid quat size - if(PySequence_Length(args) != 2){ - PyErr_SetString(PyExc_AttributeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); + switch(PyTuple_GET_SIZE(args)) { + case 0: + break; + case 1: + if (mathutils_array_parse(quat, QUAT_SIZE, QUAT_SIZE, seq, "mathutils.Quaternion()") == -1) return NULL; - } - }else{ - if(size != 4){ - PyErr_SetString(PyExc_AttributeError, "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); + break; + case 2: + if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1) return NULL; - } - } - for (i=0; iquat = quat; self->wrapped = Py_WRAP; }else if (type == Py_NEW){ - self->quat = PyMem_Malloc(4 * sizeof(float)); + self->quat = PyMem_Malloc(QUAT_SIZE * sizeof(float)); if(!quat) { //new empty unit_qt(self->quat); }else{ diff --git a/source/blender/python/generic/quat.h b/source/blender/python/generic/mathutils_quat.h similarity index 72% rename from source/blender/python/generic/quat.h rename to source/blender/python/generic/mathutils_quat.h index adce94421fa..c9ec12d6152 100644 --- a/source/blender/python/generic/quat.h +++ b/source/blender/python/generic/mathutils_quat.h @@ -1,5 +1,5 @@ /* - * $Id: quat.h 21254 2009-06-30 00:42:17Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -36,15 +36,8 @@ extern PyTypeObject quaternion_Type; #define QuaternionObject_Check(_v) PyObject_TypeCheck((_v), &quaternion_Type) -typedef struct { /* keep aligned with BaseMathObject in Mathutils.h */ - PyObject_VAR_HEAD - float *quat; /* 1D array of data (alias) */ - PyObject *cb_user; /* if this vector references another object, otherwise NULL, *Note* this owns its reference */ - unsigned char cb_type; /* which user funcs do we adhere to, RNA, GameObject, etc */ - unsigned char cb_subtype; /* subtype: location, rotation... to avoid defining many new functions for every attribute of the same type */ - unsigned char wrapped; /* wrapped data type? */ - /* end BaseMathObject */ - +typedef struct { + BASE_MATH_MEMBERS(quat) } QuaternionObject; /*struct data contains a pointer to the actual data that the diff --git a/source/blender/python/generic/vector.c b/source/blender/python/generic/mathutils_vector.c similarity index 93% rename from source/blender/python/generic/vector.c rename to source/blender/python/generic/mathutils_vector.c index d12cc477e0b..a9bcdacdb03 100644 --- a/source/blender/python/generic/vector.c +++ b/source/blender/python/generic/mathutils_vector.c @@ -1,5 +1,5 @@ /* - * $Id: vector.c 21462 2009-07-09 15:40:04Z ton $ + * $Id$ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -25,7 +25,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Mathutils.h" +#include "mathutils.h" #include "BLI_blenlib.h" #include "BKE_utildefines.h" @@ -40,55 +40,27 @@ #define SWIZZLE_AXIS 0x3 static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat); /* utility func */ +static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits); -//----------------------------------Mathutils.Vector() ------------------ +//----------------------------------mathutils.Vector() ------------------ // Supports 2D, 3D, and 4D vector objects both int and float values // accepted. Mixed float and int values accepted. Ints are parsed to float static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyObject *listObject = NULL; - int size, i; - float vec[4], f; - PyObject *v; + float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f}; + int size= 3; /* default to a 3D vector */ - size = PyTuple_GET_SIZE(args); /* we know its a tuple because its an arg */ - if (size == 1) { - listObject = PyTuple_GET_ITEM(args, 0); - if (PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - } else { // Single argument was not a sequence - PyErr_SetString(PyExc_TypeError, "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n"); + switch(PyTuple_GET_SIZE(args)) { + case 0: + break; + case 1: + if((size=mathutils_array_parse(vec, 2, 4, PyTuple_GET_ITEM(args, 0), "mathutils.Vector()")) == -1) return NULL; - } - } else if (size == 0) { - //returns a new empty 3d vector - return newVectorObject(NULL, 3, Py_NEW, type); - } else { - listObject = args; - } - - if (size<2 || size>4) { // Invalid vector size - PyErr_SetString(PyExc_AttributeError, "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n"); + break; + default: + PyErr_SetString(PyExc_TypeError, "mathutils.Vector(): more then a single arg given"); return NULL; } - - for (i=0; isize; i++) { @@ -125,7 +97,7 @@ static char Vector_Normalize_doc[] = "\n" " .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n"; -static PyObject *Vector_Normalize(VectorObject * self) +static PyObject *Vector_Normalize(VectorObject *self) { int i; float norm = 0.0f; @@ -156,7 +128,7 @@ static char Vector_Resize2D_doc[] = " :return: an instance of itself\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Resize2D(VectorObject * self) +static PyObject *Vector_Resize2D(VectorObject *self) { if(self->wrapped==Py_WRAP) { PyErr_SetString(PyExc_TypeError, "vector.resize2D(): cannot resize wrapped data - only python vectors\n"); @@ -186,7 +158,7 @@ static char Vector_Resize3D_doc[] = " :return: an instance of itself\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Resize3D(VectorObject * self) +static PyObject *Vector_Resize3D(VectorObject *self) { if (self->wrapped==Py_WRAP) { PyErr_SetString(PyExc_TypeError, "vector.resize3D(): cannot resize wrapped data - only python vectors\n"); @@ -219,7 +191,7 @@ static char Vector_Resize4D_doc[] = " :return: an instance of itself\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Resize4D(VectorObject * self) +static PyObject *Vector_Resize4D(VectorObject *self) { if(self->wrapped==Py_WRAP) { PyErr_SetString(PyExc_TypeError, "vector.resize4D(): cannot resize wrapped data - only python vectors"); @@ -248,37 +220,56 @@ static PyObject *Vector_Resize4D(VectorObject * self) /*----------------------------Vector.toTuple() ------------------ */ static char Vector_ToTuple_doc[] = -".. method:: to_tuple(precision)\n" +".. method:: to_tuple(precision=-1)\n" "\n" " Return this vector as a tuple with.\n" "\n" -" :arg precision: The number to round the value to in [0, 21].\n" +" :arg precision: The number to round the value to in [-1, 21].\n" " :type precision: int\n" " :return: the values of the vector rounded by *precision*\n" " :rtype: tuple\n"; -static PyObject *Vector_ToTuple(VectorObject * self, PyObject *value) +/* note: BaseMath_ReadCallback must be called beforehand */ +static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits) { - int ndigits= PyLong_AsSsize_t(value); - int x; - PyObject *ret; + int i; - if(ndigits > 22 || ndigits < 0) { /* accounts for non ints */ - PyErr_SetString(PyExc_TypeError, "vector.to_tuple(ndigits): ndigits must be between 0 and 21"); + ret= PyTuple_New(self->size); + + if(ndigits >= 0) { + for(i = 0; i < self->size; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->vec[i], ndigits))); + } + } + else { + for(i = 0; i < self->size; i++) { + PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->vec[i])); + } + } + + return ret; +} + +static PyObject *Vector_ToTuple(VectorObject *self, PyObject *args) +{ + int ndigits= 0; + + if(!PyArg_ParseTuple(args, "|i:to_tuple", &ndigits)) + return NULL; + + if(ndigits > 22 || ndigits < 0) { + PyErr_SetString(PyExc_ValueError, "vector.to_tuple(ndigits): ndigits must be between 0 and 21"); return NULL; } + if(PyTuple_GET_SIZE(args)==0) + ndigits= -1; + if(!BaseMath_ReadCallback(self)) return NULL; - ret= PyTuple_New(self->size); - - for(x = 0; x < self->size; x++) { - PyTuple_SET_ITEM(ret, x, PyFloat_FromDouble(double_round((double)self->vec[x], ndigits))); - } - - return ret; + return Vector_ToTupleExt(self, ndigits); } /*----------------------------Vector.toTrackQuat(track, up) ---------------------- */ @@ -291,19 +282,18 @@ static char Vector_ToTrackQuat_doc[] = " :type track: string\n" " :arg up: Up axis in ['X', 'Y', 'Z'].\n" " :type up: string\n" -" :return: rotation from the vector and the track and up axis." +" :return: rotation from the vector and the track and up axis.\n" " :rtype: :class:`Quaternion`\n"; -static PyObject *Vector_ToTrackQuat( VectorObject * self, PyObject * args ) +static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args ) { float vec[3], quat[4]; char *strack, *sup; short track = 2, up = 1; - if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup)) { - PyErr_SetString( PyExc_TypeError, "expected optional two strings\n" ); + if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup)) return NULL; - } + if (self->size != 3) { PyErr_SetString( PyExc_TypeError, "only for 3D vectors\n" ); return NULL; @@ -413,7 +403,7 @@ static char Vector_Reflect_doc[] = " :return: The reflected vector matching the size of this vector.\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Reflect( VectorObject * self, VectorObject * value ) +static PyObject *Vector_Reflect(VectorObject *self, VectorObject *value ) { float mirror[3], vec[3]; float reflect[3] = {0.0f, 0.0f, 0.0f}; @@ -454,7 +444,7 @@ static char Vector_Cross_doc[] = "\n" " .. note:: both vectors must be 3D\n"; -static PyObject *Vector_Cross( VectorObject * self, VectorObject * value ) +static PyObject *Vector_Cross(VectorObject *self, VectorObject *value ) { VectorObject *vecCross = NULL; @@ -486,7 +476,7 @@ static char Vector_Dot_doc[] = " :return: The dot product.\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Dot( VectorObject * self, VectorObject * value ) +static PyObject *Vector_Dot(VectorObject *self, VectorObject *value ) { double dot = 0.0; int x; @@ -510,21 +500,28 @@ static PyObject *Vector_Dot( VectorObject * self, VectorObject * value ) return PyFloat_FromDouble(dot); } -static char Vector_Angle_doc[] = -".. function:: angle(other)\n" +static char Vector_angle_doc[] = +".. function:: angle(other, fallback)\n" "\n" " Return the angle between two vectors.\n" "\n" +" :arg other: another vector to compare the angle with\n" " :type other: :class:`Vector`\n" -" :return angle: angle in radians\n" +" :arg fallback: return this value when the angle cant be calculated (zero length vector)\n" +" :return angle: angle in radians or fallback when given\n" " :rtype: float\n" "\n" " .. note:: Zero length vectors raise an :exc:`AttributeError`.\n"; -static PyObject *Vector_Angle(VectorObject * self, VectorObject * value) +static PyObject *Vector_angle(VectorObject *self, PyObject *args) { - double dot = 0.0f, angleRads, test_v1 = 0.0f, test_v2 = 0.0f; + VectorObject *value; + double dot = 0.0f, angleRads, test_v1 = 0.0f, test_v2 = 0.0f; int x, size; + PyObject *fallback= NULL; + if(!PyArg_ParseTuple(args, "O!|O:angle", &vector_Type, &value, &fallback)) + return NULL; + if (!VectorObject_Check(value)) { PyErr_SetString( PyExc_TypeError, "vec.angle(value): expected a vector argument" ); return NULL; @@ -546,8 +543,15 @@ static PyObject *Vector_Angle(VectorObject * self, VectorObject * value) test_v2 += value->vec[x] * value->vec[x]; } if (!test_v1 || !test_v2){ - PyErr_SetString(PyExc_AttributeError, "vector.angle(other): zero length vectors are not acceptable arguments\n"); - return NULL; + /* avoid exception */ + if(fallback) { + Py_INCREF(fallback); + return fallback; + } + else { + PyErr_SetString(PyExc_ValueError, "vector.angle(other): zero length vectors have no valid angle\n"); + return NULL; + } } //dot product @@ -573,7 +577,7 @@ static char Vector_Difference_doc[] = "\n" " .. note:: 2D vectors raise an :exc:`AttributeError`.\n";; -static PyObject *Vector_Difference( VectorObject * self, VectorObject * value ) +static PyObject *Vector_Difference(VectorObject *self, VectorObject *value ) { float quat[4], vec_a[3], vec_b[3]; @@ -607,7 +611,7 @@ static char Vector_Project_doc[] = " :return projection: the parallel projection vector\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Project(VectorObject * self, VectorObject * value) +static PyObject *Vector_Project(VectorObject *self, VectorObject *value) { float vec[4]; double dot = 0.0f, dot2 = 0.0f; @@ -643,7 +647,6 @@ static PyObject *Vector_Project(VectorObject * self, VectorObject * value) return newVectorObject(vec, size, Py_NEW, NULL); } -//----------------------------------Mathutils.MidpointVecs() ------------- static char Vector_Lerp_doc[] = ".. function:: lerp(other, factor)\n" "\n" @@ -656,16 +659,15 @@ static char Vector_Lerp_doc[] = " :return: The interpolated rotation.\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Lerp(VectorObject * self, PyObject * args) +static PyObject *Vector_Lerp(VectorObject *self, PyObject *args) { VectorObject *vec2 = NULL; float fac, ifac, vec[4]; int x; - if(!PyArg_ParseTuple(args, "O!f:lerp", &vector_Type, &vec2, &fac)) { - PyErr_SetString(PyExc_TypeError, "vector.lerp(): expects a vector of the same size and float"); + if(!PyArg_ParseTuple(args, "O!f:lerp", &vector_Type, &vec2, &fac)) return NULL; - } + if(self->size != vec2->size) { PyErr_SetString(PyExc_AttributeError, "vector.lerp(): expects (2) vector objects of the same size"); return NULL; @@ -693,7 +695,7 @@ static char Vector_copy_doc[] = "\n" " .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n"; -static PyObject *Vector_copy(VectorObject * self) +static PyObject *Vector_copy(VectorObject *self) { if(!BaseMath_ReadCallback(self)) return NULL; @@ -703,38 +705,29 @@ static PyObject *Vector_copy(VectorObject * self) /*----------------------------print object (internal)------------- print the object to screen */ -static PyObject *Vector_repr(VectorObject * self) +static PyObject *Vector_repr(VectorObject *self) { - int i; - char buffer[48], str[1024]; + PyObject *ret, *tuple; if(!BaseMath_ReadCallback(self)) return NULL; - - BLI_strncpy(str,"[",1024); - for(i = 0; i < self->size; i++){ - if(i < (self->size - 1)){ - sprintf(buffer, "%.6f, ", self->vec[i]); - strcat(str,buffer); - }else{ - sprintf(buffer, "%.6f", self->vec[i]); - strcat(str,buffer); - } - } - strcat(str, "](vector)"); - return PyUnicode_FromString(str); + tuple= Vector_ToTupleExt(self, -1); + ret= PyUnicode_FromFormat("Vector(%R)", tuple); + Py_DECREF(tuple); + return ret; } + /*---------------------SEQUENCE PROTOCOLS------------------------ ----------------------------len(object)------------------------ sequence length*/ -static int Vector_len(VectorObject * self) +static int Vector_len(VectorObject *self) { return self->size; } /*----------------------------object[]--------------------------- sequence accessor (get)*/ -static PyObject *Vector_item(VectorObject * self, int i) +static PyObject *Vector_item(VectorObject *self, int i) { if(i<0) i= self->size-i; @@ -751,10 +744,10 @@ static PyObject *Vector_item(VectorObject * self, int i) } /*----------------------------object[]------------------------- sequence accessor (set)*/ -static int Vector_ass_item(VectorObject * self, int i, PyObject * ob) +static int Vector_ass_item(VectorObject *self, int i, PyObject * ob) { - float scalar= (float)PyFloat_AsDouble(ob); - if(scalar==-1.0f && PyErr_Occurred()) { /* parsed item not a number */ + float scalar; + if((scalar=PyFloat_AsDouble(ob))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */ PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number\n"); return -1; } @@ -774,7 +767,7 @@ static int Vector_ass_item(VectorObject * self, int i, PyObject * ob) /*----------------------------object[z:y]------------------------ sequence slice (get) */ -static PyObject *Vector_slice(VectorObject * self, int begin, int end) +static PyObject *Vector_slice(VectorObject *self, int begin, int end) { PyObject *list = NULL; int count; @@ -796,8 +789,8 @@ static PyObject *Vector_slice(VectorObject * self, int begin, int end) } /*----------------------------object[z:y]------------------------ sequence slice (set) */ -static int Vector_ass_slice(VectorObject * self, int begin, int end, - PyObject * seq) +static int Vector_ass_slice(VectorObject *self, int begin, int end, + PyObject * seq) { int i, y, size = 0; float vec[4], scalar; @@ -824,8 +817,7 @@ static int Vector_ass_slice(VectorObject * self, int begin, int end, return -1; } - scalar= (float)PyFloat_AsDouble(v); - if(scalar==-1.0f && PyErr_Occurred()) { /* parsed item not a number */ + if((scalar=PyFloat_AsDouble(v)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */ Py_DECREF(v); PyErr_SetString(PyExc_TypeError, "vector[begin:end] = []: sequence argument not a number\n"); return -1; @@ -1118,14 +1110,13 @@ static PyObject *Vector_div(PyObject * v1, PyObject * v2) if(!BaseMath_ReadCallback(vec1)) return NULL; - - scalar = (float)PyFloat_AsDouble(v2); - if(scalar== -1.0f && PyErr_Occurred()) { /* parsed item not a number */ + + if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n"); return NULL; } - if(scalar==0.0) { /* not a vector */ + if(scalar==0.0) { PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error.\n"); return NULL; } @@ -1147,13 +1138,12 @@ static PyObject *Vector_idiv(PyObject * v1, PyObject * v2) if(!BaseMath_ReadCallback(vec1)) return NULL; - scalar = (float)PyFloat_AsDouble(v2); - if(scalar==-1.0f && PyErr_Occurred()) { /* parsed item not a number */ + if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n"); return NULL; } - - if(scalar==0.0) { /* not a vector */ + + if(scalar==0.0) { PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error.\n"); return NULL; } @@ -1283,13 +1273,16 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa /*-----------------PROTCOL DECLARATIONS--------------------------*/ static PySequenceMethods Vector_SeqMethods = { - (lenfunc) Vector_len, /* sq_length */ - (binaryfunc) 0, /* sq_concat */ - (ssizeargfunc) 0, /* sq_repeat */ - (ssizeargfunc) Vector_item, /* sq_item */ - NULL, /* py3 deprecated slice func */ - (ssizeobjargproc) Vector_ass_item, /* sq_ass_item */ - NULL, /* py3 deprecated slice assign func */ + (lenfunc) Vector_len, /* sq_length */ + (binaryfunc) 0, /* sq_concat */ + (ssizeargfunc) 0, /* sq_repeat */ + (ssizeargfunc) Vector_item, /* sq_item */ + NULL, /* py3 deprecated slice func */ + (ssizeobjargproc) Vector_ass_item, /* sq_ass_item */ + NULL, /* py3 deprecated slice assign func */ + (objobjproc) NULL, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; static PyObject *Vector_subscript(VectorObject* self, PyObject* item) @@ -1321,8 +1314,8 @@ static PyObject *Vector_subscript(VectorObject* self, PyObject* item) } else { PyErr_Format(PyExc_TypeError, - "vector indices must be integers, not %.200s", - item->ob_type->tp_name); + "vector indices must be integers, not %.200s", + item->ob_type->tp_name); return NULL; } } @@ -1352,8 +1345,8 @@ static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* va } else { PyErr_Format(PyExc_TypeError, - "vector indices must be integers, not %.200s", - item->ob_type->tp_name); + "vector indices must be integers, not %.200s", + item->ob_type->tp_name); return -1; } } @@ -1408,18 +1401,18 @@ static PyNumberMethods Vector_NumMethods = { * vector axis, vector.x/y/z/w */ -static PyObject *Vector_getAxis( VectorObject * self, void *type ) +static PyObject *Vector_getAxis(VectorObject *self, void *type ) { return Vector_item(self, GET_INT_FROM_POINTER(type)); } -static int Vector_setAxis( VectorObject * self, PyObject * value, void * type ) +static int Vector_setAxis(VectorObject *self, PyObject * value, void * type ) { return Vector_ass_item(self, GET_INT_FROM_POINTER(type), value); } /* vector.length */ -static PyObject *Vector_getLength( VectorObject * self, void *type ) +static PyObject *Vector_getLength(VectorObject *self, void *type ) { double dot = 0.0f; int i; @@ -1433,25 +1426,24 @@ static PyObject *Vector_getLength( VectorObject * self, void *type ) return PyFloat_FromDouble(sqrt(dot)); } -static int Vector_setLength( VectorObject * self, PyObject * value ) +static int Vector_setLength(VectorObject *self, PyObject * value ) { double dot = 0.0f, param; int i; if(!BaseMath_ReadCallback(self)) return -1; - - param= PyFloat_AsDouble( value ); - if(param==-1.0 && PyErr_Occurred()) { + + if((param=PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "length must be set to a number"); return -1; } - if (param < 0) { + if (param < 0.0f) { PyErr_SetString( PyExc_TypeError, "cannot set a vectors length to a negative value" ); return -1; } - if (param==0) { + if (param == 0.0f) { for(i = 0; i < self->size; i++){ self->vec[i]= 0; } @@ -1484,10 +1476,10 @@ static int Vector_setLength( VectorObject * self, PyObject * value ) /* Get a new Vector according to the provided swizzle. This function has little error checking, as we are in control of the inputs: the closure is set by us in Vector_createSwizzleGetSeter. */ -static PyObject *Vector_getSwizzle(VectorObject * self, void *closure) +static PyObject *Vector_getSwizzle(VectorObject *self, void *closure) { - size_t axisA; - size_t axisB; + size_t axis_to; + size_t axis_from; float vec[MAX_DIMENSIONS]; unsigned int swizzleClosure; @@ -1495,46 +1487,46 @@ static PyObject *Vector_getSwizzle(VectorObject * self, void *closure) return NULL; /* Unpack the axes from the closure into an array. */ - axisA = 0; + axis_to = 0; swizzleClosure = GET_INT_FROM_POINTER(closure); while (swizzleClosure & SWIZZLE_VALID_AXIS) { - axisB = swizzleClosure & SWIZZLE_AXIS; - if(axisB >= self->size) { + axis_from = swizzleClosure & SWIZZLE_AXIS; + if(axis_from >= self->size) { PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis."); return NULL; } - vec[axisA] = self->vec[axisB]; + vec[axis_to] = self->vec[axis_from]; swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS; - axisA++; + axis_to++; } - return newVectorObject(vec, axisA, Py_NEW, Py_TYPE(self)); + return newVectorObject(vec, axis_to, Py_NEW, Py_TYPE(self)); } /* Set the items of this vector using a swizzle. - If value is a vector or list this operates like an array copy, except that - the destination is effectively re-ordered as defined by the swizzle. At - most min(len(source), len(dest)) values will be copied. + the destination is effectively re-ordered as defined by the swizzle. At + most min(len(source), len(dest)) values will be copied. - If the value is scalar, it is copied to all axes listed in the swizzle. - If an axis appears more than once in the swizzle, the final occurrence is - the one that determines its value. + the one that determines its value. Returns 0 on success and -1 on failure. On failure, the vector will be unchanged. */ -static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closure) +static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure) { - VectorObject *vecVal = NULL; - PyObject *item; - size_t listLen; + size_t size_from; float scalarVal; - size_t axisB; - size_t axisA; + size_t axis_from; + size_t axis_to; + unsigned int swizzleClosure; - float vecTemp[MAX_DIMENSIONS]; + float tvec[MAX_DIMENSIONS]; + float vec_assign[MAX_DIMENSIONS]; if(!BaseMath_ReadCallback(self)) return -1; @@ -1542,95 +1534,48 @@ static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closur /* Check that the closure can be used with this vector: even 2D vectors have swizzles defined for axes z and w, but they would be invalid. */ swizzleClosure = GET_INT_FROM_POINTER(closure); + axis_from= 0; while (swizzleClosure & SWIZZLE_VALID_AXIS) { - axisA = swizzleClosure & SWIZZLE_AXIS; - if (axisA >= self->size) + axis_to = swizzleClosure & SWIZZLE_AXIS; + if (axis_to >= self->size) { PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis.\n"); return -1; } swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS; + axis_from++; } - - if (VectorObject_Check(value)) - { - /* Copy vector contents onto swizzled axes. */ - vecVal = (VectorObject*) value; - axisB = 0; - swizzleClosure = GET_INT_FROM_POINTER(closure); - while (swizzleClosure & SWIZZLE_VALID_AXIS && axisB < vecVal->size) - { - axisA = swizzleClosure & SWIZZLE_AXIS; - if(axisB >= vecVal->size) { - PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis."); - return -1; - } + if (((scalarVal=PyFloat_AsDouble(value)) == -1 && PyErr_Occurred())==0) { + int i; + for(i=0; i < MAX_DIMENSIONS; i++) + vec_assign[i]= scalarVal; - vecTemp[axisA] = vecVal->vec[axisB]; - - swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS; - axisB++; - } - - if(axisB != vecVal->size) { - PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle.\n"); - return -1; - } - - memcpy(self->vec, vecTemp, axisB * sizeof(float)); - /* continue with BaseMathObject_WriteCallback at the end */ + size_from= axis_from; } - else if (PyList_Check(value)) - { - /* Copy list contents onto swizzled axes. */ - listLen = PyList_Size(value); - swizzleClosure = GET_INT_FROM_POINTER(closure); - axisB = 0; - while (swizzleClosure & SWIZZLE_VALID_AXIS && axisB < listLen) - { - item = PyList_GetItem(value, axisB); - scalarVal = (float)PyFloat_AsDouble(item); - - if (scalarVal==-1.0 && PyErr_Occurred()) { - PyErr_SetString(PyExc_AttributeError, "Error: list item could not be used as a float.\n"); - return -1; - } - - - axisA = swizzleClosure & SWIZZLE_AXIS; - vecTemp[axisA] = scalarVal; - - swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS; - axisB++; - } - - if(axisB != listLen) { - PyErr_SetString(PyExc_AttributeError, "Error: list size does not match swizzle.\n"); - return -1; - } - - memcpy(self->vec, vecTemp, axisB * sizeof(float)); - /* continue with BaseMathObject_WriteCallback at the end */ - } - else if (((scalarVal = (float)PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred())==0) - { - /* Assign the same value to each axis. */ - swizzleClosure = GET_INT_FROM_POINTER(closure); - while (swizzleClosure & SWIZZLE_VALID_AXIS) - { - axisA = swizzleClosure & SWIZZLE_AXIS; - self->vec[axisA] = scalarVal; - - swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS; - } - /* continue with BaseMathObject_WriteCallback at the end */ - } - else { - PyErr_SetString( PyExc_TypeError, "Expected a Vector, list or scalar value." ); + else if((size_from=mathutils_array_parse(vec_assign, 2, 4, value, "mathutils.Vector.**** = swizzle assignment")) == -1) { return -1; } + + if(axis_from != size_from) { + PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle.\n"); + return -1; + } + + /* Copy vector contents onto swizzled axes. */ + axis_from = 0; + swizzleClosure = GET_INT_FROM_POINTER(closure); + while (swizzleClosure & SWIZZLE_VALID_AXIS) + { + axis_to = swizzleClosure & SWIZZLE_AXIS; + tvec[axis_to] = vec_assign[axis_from]; + swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS; + axis_from++; + } + + memcpy(self->vec, tvec, axis_from * sizeof(float)); + /* continue with BaseMathObject_WriteCallback at the end */ if(!BaseMath_WriteCallback(self)) return -1; @@ -2080,7 +2025,7 @@ static char Vector_Negate_doc[] = " :return: an instance of itself\n" " :rtype: :class:`Vector`\n"; -static PyObject *Vector_Negate(VectorObject * self) +static PyObject *Vector_Negate(VectorObject *self) { int i; if(!BaseMath_ReadCallback(self)) @@ -2102,12 +2047,12 @@ static struct PyMethodDef Vector_methods[] = { {"resize2D", (PyCFunction) Vector_Resize2D, METH_NOARGS, Vector_Resize2D_doc}, {"resize3D", (PyCFunction) Vector_Resize3D, METH_NOARGS, Vector_Resize3D_doc}, {"resize4D", (PyCFunction) Vector_Resize4D, METH_NOARGS, Vector_Resize4D_doc}, - {"to_tuple", (PyCFunction) Vector_ToTuple, METH_O, Vector_ToTuple_doc}, + {"to_tuple", (PyCFunction) Vector_ToTuple, METH_VARARGS, Vector_ToTuple_doc}, {"to_track_quat", ( PyCFunction ) Vector_ToTrackQuat, METH_VARARGS, Vector_ToTrackQuat_doc}, {"reflect", ( PyCFunction ) Vector_Reflect, METH_O, Vector_Reflect_doc}, {"cross", ( PyCFunction ) Vector_Cross, METH_O, Vector_Cross_doc}, {"dot", ( PyCFunction ) Vector_Dot, METH_O, Vector_Dot_doc}, - {"angle", ( PyCFunction ) Vector_Angle, METH_O, Vector_Angle_doc}, + {"angle", ( PyCFunction ) Vector_angle, METH_VARARGS, Vector_angle_doc}, {"difference", ( PyCFunction ) Vector_Difference, METH_O, Vector_Difference_doc}, {"project", ( PyCFunction ) Vector_Project, METH_O, Vector_Project_doc}, {"lerp", ( PyCFunction ) Vector_Lerp, METH_VARARGS, Vector_Lerp_doc}, @@ -2130,7 +2075,7 @@ PyTypeObject vector_Type = { PyVarObject_HEAD_INIT(NULL, 0) /* For printing, in format "." */ "vector", /* char *tp_name; */ - sizeof( VectorObject ), /* int tp_basicsize; */ + sizeof(VectorObject), /* int tp_basicsize; */ 0, /* tp_itemsize; For allocation */ /* Methods to implement standard operations */ diff --git a/source/blender/python/generic/vector.h b/source/blender/python/generic/mathutils_vector.h similarity index 68% rename from source/blender/python/generic/vector.h rename to source/blender/python/generic/mathutils_vector.h index 350eaeebedd..42b9849dd3f 100644 --- a/source/blender/python/generic/vector.h +++ b/source/blender/python/generic/mathutils_vector.h @@ -1,4 +1,5 @@ -/* $Id: vector.h 21254 2009-06-30 00:42:17Z campbellbarton $ +/* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -35,14 +36,8 @@ extern PyTypeObject vector_Type; #define VectorObject_Check(_v) PyObject_TypeCheck((_v), &vector_Type) -typedef struct { /* keep aligned with BaseMathObject in Mathutils.h */ - PyObject_VAR_HEAD - float *vec; /*1D array of data (alias), wrapped status depends on wrapped status */ - PyObject *cb_user; /* if this vector references another object, otherwise NULL, *Note* this owns its reference */ - unsigned char cb_type; /* which user funcs do we adhere to, RNA, GameObject, etc */ - unsigned char cb_subtype; /* subtype: location, rotation... to avoid defining many new functions for every attribute of the same type */ - unsigned char wrapped; /* wrapped data type? */ - /* end BaseMathObject */ +typedef struct { + BASE_MATH_MEMBERS(vec) unsigned char size; /* vec size 2,3 or 4 */ } VectorObject; diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index 222e41c3bb8..b978e46f6da 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -25,27 +25,26 @@ /* This file defines the '_bpy' module which is used by python's 'bpy' package. * a script writer should never directly access this module */ -#include #include "bpy_util.h" #include "bpy_rna.h" #include "bpy_app.h" #include "bpy_props.h" #include "bpy_operator.h" - + #include "BLI_path_util.h" +#include "BLI_bpath.h" /* external util modules */ -#include "../generic/Mathutils.h" -#include "../generic/Geometry.h" +#include "../generic/geometry.h" #include "../generic/bgl.h" -#include "../generic/blf.h" +#include "../generic/blf_api.h" #include "../generic/IDProp.h" static char bpy_home_paths_doc[] = ".. function:: home_paths(subfolder)\n" "\n" -" return 3 paths to blender home directories.\n" +" Return 3 paths to blender home directories.\n" "\n" " :arg subfolder: The name of a subfolder to find within the blenders home directory.\n" " :type subfolder: string\n" @@ -54,26 +53,75 @@ static char bpy_home_paths_doc[] = PyObject *bpy_home_paths(PyObject *self, PyObject *args) { - PyObject *ret= PyTuple_New(3); - char *path; - char *subfolder= ""; + PyObject *ret= PyTuple_New(3); + char *path; + char *subfolder= ""; if (!PyArg_ParseTuple(args, "|s:blender_homes", &subfolder)) return NULL; - path= BLI_gethome_folder(subfolder, BLI_GETHOME_SYSTEM); - PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:"")); + path= BLI_gethome_folder(subfolder, BLI_GETHOME_SYSTEM); + PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:"")); - path= BLI_gethome_folder(subfolder, BLI_GETHOME_LOCAL); - PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:"")); + path= BLI_gethome_folder(subfolder, BLI_GETHOME_LOCAL); + PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:"")); - path= BLI_gethome_folder(subfolder, BLI_GETHOME_USER); - PyTuple_SET_ITEM(ret, 2, PyUnicode_FromString(path?path:"")); + path= BLI_gethome_folder(subfolder, BLI_GETHOME_USER); + PyTuple_SET_ITEM(ret, 2, PyUnicode_FromString(path?path:"")); - return ret; + return ret; +} + +static char bpy_blend_paths_doc[] = +".. function:: blend_paths(absolute=False)\n" +"\n" +" Returns a list of paths associated with this blend file.\n" +"\n" +" :arg absolute: When true the paths returned are made absolute.\n" +" :type absolute: boolean\n" +" :return: path list.\n" +" :rtype: list of strigs\n"; +static PyObject *bpy_blend_paths(PyObject * self, PyObject *args, PyObject *kw) +{ + struct BPathIterator bpi; + PyObject *list = PyList_New(0), *st; /* stupidly big string to be safe */ + /* be sure there is low chance of the path being too short */ + char filepath_expanded[1024]; + char *lib; + + int absolute = 0; + static char *kwlist[] = {"absolute", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kw, "|i:blend_paths", kwlist, &absolute)) + return NULL; + + for(BLI_bpathIterator_init(&bpi, NULL); !BLI_bpathIterator_isDone(&bpi); BLI_bpathIterator_step(&bpi)) { + /* build the list */ + if (absolute) { + BLI_bpathIterator_getPathExpanded(&bpi, filepath_expanded); + } + else { + lib = BLI_bpathIterator_getLib(&bpi); + if (lib && (strcmp(lib, bpi.base_path))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */ + BLI_bpathIterator_getPathExpanded(&bpi, filepath_expanded); + } + else { + BLI_bpathIterator_getPath(&bpi, filepath_expanded); + } + } + st = PyUnicode_FromString(filepath_expanded); + + PyList_Append(list, st); + Py_DECREF(st); + } + + BLI_bpathIterator_free(&bpi); + + return list; } static PyMethodDef meth_bpy_home_paths[] = {{ "home_paths", (PyCFunction)bpy_home_paths, METH_VARARGS, bpy_home_paths_doc}}; +static PyMethodDef meth_bpy_blend_paths[] = {{ "blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc}}; static void bpy_import_test(char *modname) { @@ -93,17 +141,21 @@ static void bpy_import_test(char *modname) void BPy_init_modules( void ) { extern BPy_StructRNA *bpy_context_module; + PointerRNA ctx_ptr; PyObject *mod; /* Needs to be first since this dir is needed for future modules */ - char *modpath= BLI_gethome_folder("scripts/modules", BLI_GETHOME_ALL); + char *modpath= BLI_get_folder(BLENDER_SCRIPTS, "modules"); if(modpath) { + // printf("bpy: found module path '%s'.\n", modpath); PyObject *sys_path= PySys_GetObject("path"); /* borrow */ PyObject *py_modpath= PyUnicode_FromString(modpath); PyList_Insert(sys_path, 0, py_modpath); /* add first */ Py_DECREF(py_modpath); } - + else { + printf("bpy: couldnt find 'scripts/modules', blender probably wont start.\n"); + } /* stand alone utility modules not related to blender directly */ Geometry_Init(); Mathutils_Init(); @@ -130,13 +182,17 @@ void BPy_init_modules( void ) PyModule_AddObject( mod, "app", BPY_app_struct() ); /* bpy context */ - bpy_context_module= ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type ); - RNA_pointer_create(NULL, &RNA_Context, BPy_GetContext(), &bpy_context_module->ptr); - bpy_context_module->freeptr= 0; + RNA_pointer_create(NULL, &RNA_Context, BPy_GetContext(), &ctx_ptr); + bpy_context_module= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ctx_ptr); + /* odd that this is needed, 1 ref on creation and another for the module + * but without we get a crash on exit */ + Py_INCREF(bpy_context_module); + PyModule_AddObject(mod, "context", (PyObject *)bpy_context_module); /* utility func's that have nowhere else to go */ PyModule_AddObject(mod, meth_bpy_home_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_home_paths, NULL)); + PyModule_AddObject(mod, meth_bpy_blend_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_blend_paths, NULL)); /* add our own modules dir, this is a python package */ bpy_import_test("bpy"); diff --git a/source/blender/python/intern/bpy.h b/source/blender/python/intern/bpy.h index 024986b99a6..114d0f9a43d 100644 --- a/source/blender/python/intern/bpy.h +++ b/source/blender/python/intern/bpy.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c index 59c1c0bf7c2..4a2ac0c9252 100644 --- a/source/blender/python/intern/bpy_app.c +++ b/source/blender/python/intern/bpy_app.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -23,7 +23,6 @@ */ #include "bpy_app.h" -#include "bpy_util.h" #include "BLI_path_util.h" @@ -32,11 +31,11 @@ #include "structseq.h" #ifdef BUILD_DATE -extern const char * build_date; -extern const char * build_time; -extern const char * build_rev; -extern const char * build_platform; -extern const char * build_type; +extern char build_date[]; +extern char build_time[]; +extern char build_rev[]; +extern char build_platform[]; +extern char build_type[]; #endif static PyTypeObject BlenderAppType; @@ -47,6 +46,7 @@ static PyStructSequence_Field app_info_fields[] = { {"home", "The blender home directory, normally matching $HOME"}, {"binary_path", "The location of blenders executable, useful for utilities that spawn new instances"}, {"debug", "Boolean, set when blender is running in debug mode (started with -d)"}, + {"background", "Boolean, True when blender is running without a user interface (started with -b)"}, /* buildinfo */ {"build_date", "The date this blender instance was built"}, @@ -61,27 +61,12 @@ static PyStructSequence_Desc app_info_desc = { "bpy.app", /* name */ "This module contains application values that remain unchanged during runtime.", /* doc */ app_info_fields, /* fields */ - 10 + (sizeof(app_info_fields)/sizeof(PyStructSequence_Field)) - 1 }; -static char *strip_quotes(char *buf, const char *input) -{ - int i; - strcpy(buf, input); - if(buf[0]=='\0') return buf; - while(buf[1] && (buf[0]=='"' || buf[0]=='\'')) buf++; - if(buf[0]=='\0') return buf; - i= strlen(buf) - 1; - while(i>=0 && (buf[i]=='"' || buf[i]=='\'')) i--; - buf[i+1]= '\0'; - - return buf; -} - static PyObject *make_app_info(void) { extern char bprogname[]; /* argv[0] from creator.c */ - char buf[256]; PyObject *app_info; int pos = 0; @@ -103,20 +88,21 @@ static PyObject *make_app_info(void) SetStrItem(BLI_gethome()); SetStrItem(bprogname); SetObjItem(PyBool_FromLong(G.f & G_DEBUG)); + SetObjItem(PyBool_FromLong(G.background)); /* build info */ #ifdef BUILD_DATE - SetStrItem(strip_quotes(buf, build_date)); - SetStrItem(strip_quotes(buf, build_time)); - SetStrItem(strip_quotes(buf, build_rev)); - SetStrItem(strip_quotes(buf, build_platform)); - SetStrItem(strip_quotes(buf, build_type)); + SetStrItem(build_date); + SetStrItem(build_time); + SetStrItem(build_rev); + SetStrItem(build_platform); + SetStrItem(build_type); #else - SetStrItem(strip_quotes(buf, "Unknown")); - SetStrItem(strip_quotes(buf, "Unknown")); - SetStrItem(strip_quotes(buf, "Unknown")); - SetStrItem(strip_quotes(buf, "Unknown")); - SetStrItem(strip_quotes(buf, "Unknown")); + SetStrItem("Unknown"); + SetStrItem("Unknown"); + SetStrItem("Unknown"); + SetStrItem("Unknown"); + SetStrItem("Unknown"); #endif #undef SetIntItem diff --git a/source/blender/python/intern/bpy_array.c b/source/blender/python/intern/bpy_array.c index bb1826d231d..9ceba4ae004 100644 --- a/source/blender/python/intern/bpy_array.c +++ b/source/blender/python/intern/bpy_array.c @@ -22,14 +22,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Python.h" - #include "bpy_rna.h" - -#include "RNA_access.h" - -#include "BLI_string.h" - #include "BKE_global.h" #define MAX_ARRAY_DIMENSION 10 @@ -41,15 +34,15 @@ typedef void (*RNA_SetIndexFunc)(PointerRNA *, PropertyRNA *, int index, void *) /* arr[3][4][5] - 0 1 2 <- dimension index + 0 1 2 <- dimension index */ /* arr[2] = x py_to_array_index(arraydim=0, arrayoffset=0, index=2) - validate_array(lvalue_dim=0) - ... make real index ... + validate_array(lvalue_dim=0) + ... make real index ... */ /* arr[3]=x, self->arraydim is 0, lvalue_dim is 1 */ diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index f628e7e8569..e5719a84fdd 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -24,16 +24,16 @@ /* ****************************************** */ /* Drivers - PyExpression Evaluation */ +#include + #include "DNA_anim_types.h" #include "BLI_listbase.h" +#include "BLI_math_base.h" -#include "BPY_extern.h" #include "BKE_fcurve.h" #include "BKE_global.h" -#include - /* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */ PyObject *bpy_pydriver_Dict = NULL; @@ -59,10 +59,6 @@ static int bpy_pydriver_create_dict(void) mod = PyImport_ImportModule("math"); if (mod) { PyDict_Merge(d, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */ - - /* Only keep for backwards compat! - just import all math into root, they are standard */ - PyDict_SetItemString(d, "math", mod); - PyDict_SetItemString(d, "m", mod); Py_DECREF(mod); } @@ -103,13 +99,17 @@ static int bpy_pydriver_create_dict(void) } /* Update function, it gets rid of pydrivers global dictionary, forcing - * BPY_pydriver_eval to recreate it. This function is used to force + * BPY_eval_driver to recreate it. This function is used to force * reloading the Blender text module "pydrivers.py", if available, so * updates in it reach pydriver evaluation. */ void BPY_pydriver_update(void) { - PyGILState_STATE gilstate = PyGILState_Ensure(); + PyGILState_STATE gilstate; + int use_gil= 1; // (PyThreadState_Get()==NULL); + + if(use_gil) + gilstate = PyGILState_Ensure(); if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */ PyDict_Clear(bpy_pydriver_Dict); @@ -117,7 +117,8 @@ void BPY_pydriver_update(void) bpy_pydriver_Dict = NULL; } - PyGILState_Release(gilstate); + if(use_gil) + PyGILState_Release(gilstate); return; } @@ -143,42 +144,48 @@ static float pydriver_error(ChannelDriver *driver) /* This evals py driver expressions, 'expr' is a Python expression that * should evaluate to a float number, which is returned. + * + * note: PyGILState_Ensure() isnt always called because python can call the + * bake operator which intern starts a thread which calls scene update which + * does a driver update. to avoid a deadlock check PyThreadState_Get() if PyGILState_Ensure() is needed. */ -float BPY_pydriver_eval (ChannelDriver *driver) +float BPY_eval_driver (ChannelDriver *driver) { PyObject *driver_vars=NULL; PyObject *retval= NULL; PyObject *expr_vars; /* speed up by pre-hashing string & avoids re-converting unicode strings for every execution */ PyObject *expr_code; PyGILState_STATE gilstate; + int use_gil; DriverVar *dvar; - float result = 0.0f; /* default return */ + double result = 0.0; /* default return */ char *expr = NULL; short targets_ok= 1; int i; - /* sanity checks - should driver be executed? */ - /*if (G.f & G_SCRIPT_AUTOEXEC)==0) return result; */ - /* get the py expression to be evaluated */ expr = driver->expression; if ((expr == NULL) || (expr[0]=='\0')) - return result; + return 0.0f; if(!(G.f & G_SCRIPT_AUTOEXEC)) { printf("skipping driver '%s', automatic scripts are disabled\n", driver->expression); - return result; + return 0.0f; } - gilstate = PyGILState_Ensure(); + use_gil= 1; //(PyThreadState_Get()==NULL); + + if(use_gil) + gilstate = PyGILState_Ensure(); /* init global dictionary for py-driver evaluation settings */ if (!bpy_pydriver_Dict) { if (bpy_pydriver_create_dict() != 0) { fprintf(stderr, "Pydriver error: couldn't create Python dictionary"); - PyGILState_Release(gilstate); - return result; + if(use_gil) + PyGILState_Release(gilstate); + return 0.0f; } } @@ -235,11 +242,11 @@ float BPY_pydriver_eval (ChannelDriver *driver) /* this target failed - bad name */ if (targets_ok) { /* first one - print some extra info for easier identification */ - fprintf(stderr, "\nBPY_pydriver_eval() - Error while evaluating PyDriver:\n"); + fprintf(stderr, "\nBPY_eval_driver() - Error while evaluating PyDriver:\n"); targets_ok= 0; } - fprintf(stderr, "\tBPY_pydriver_eval() - couldn't add variable '%s' to namespace \n", dvar->name); + fprintf(stderr, "\tBPY_eval_driver() - couldn't add variable '%s' to namespace\n", dvar->name); // BPy_errors_to_report(NULL); // TODO - reports PyErr_Print(); PyErr_Clear(); @@ -261,12 +268,10 @@ float BPY_pydriver_eval (ChannelDriver *driver) /* process the result */ if (retval == NULL) { pydriver_error(driver); - result = 0.0f; - } else if((result= (float)PyFloat_AsDouble(retval)) == -1.0f && PyErr_Occurred()) { + } else if((result= PyFloat_AsDouble(retval)) == -1.0 && PyErr_Occurred()) { pydriver_error(driver); Py_DECREF(retval); - result = 0.0f; - + result = 0.0; } else { /* all fine, make sure the "invalid expression" flag is cleared */ @@ -274,6 +279,14 @@ float BPY_pydriver_eval (ChannelDriver *driver) Py_DECREF(retval); } - PyGILState_Release(gilstate); - return result; + if(use_gil) + PyGILState_Release(gilstate); + + if(finite(result)) { + return (float)result; + } + else { + fprintf(stderr, "\tBPY_eval_driver() - driver '%s' evaluates to '%f'\n", dvar->name, result); + return 0.0f; + } } diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 02eebde8a13..bf91b0498ed 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -23,10 +23,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include -#include -#include -#include /* grr, python redefines */ @@ -34,33 +30,20 @@ #undef _POSIX_C_SOURCE #endif -#include -#include "compile.h" /* for the PyCodeObject */ -#include "eval.h" /* for PyEval_EvalCode */ #include "bpy.h" #include "bpy_rna.h" #include "bpy_util.h" -#ifndef WIN32 -#include -#else -#include "BLI_winstuff.h" -#endif - #include "DNA_space_types.h" #include "DNA_text_types.h" #include "MEM_guardedalloc.h" - -#include "BLI_storage.h" -#include "BLI_fileops.h" -#include "BLI_string.h" #include "BLI_path_util.h" +#include "BLI_math_base.h" #include "BKE_context.h" #include "BKE_text.h" -#include "BKE_context.h" #include "BKE_main.h" #include "BKE_global.h" /* only for script checking */ @@ -167,7 +150,6 @@ void BPY_update_modules( void ) *****************************************************************************/ static PyObject *CreateGlobalDictionary( bContext *C, const char *filename ) { - PyObject *mod; PyObject *item; PyObject *dict = PyDict_New( ); PyDict_SetItemString( dict, "__builtins__", PyEval_GetBuiltins( ) ); @@ -183,18 +165,13 @@ static PyObject *CreateGlobalDictionary( bContext *C, const char *filename ) Py_DECREF(item); } - /* add bpy to global namespace */ - mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0); - PyDict_SetItemString( dict, "bpy", mod ); - Py_DECREF(mod); - return dict; } /* must be called before Py_Initialize */ void BPY_start_python_path(void) { - char *py_path_bundle= BLI_gethome_folder("python", BLI_GETHOME_ALL); + char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL); if(py_path_bundle==NULL) return; @@ -248,12 +225,11 @@ void BPY_start_python( int argc, char **argv ) BPY_start_python_path(); /* allow to use our own included python */ + // Py_SetProgramName(); // extern char bprogname[FILE_MAXDIR+FILE_MAXFILE]; + Py_Initialize( ); - /*convert argv to wchar_t*/ // PySys_SetArgv( argc, argv); // broken in py3, not a huge deal - - /*temporarily set argv*/ /* sigh, why do python guys not have a char** version anymore? :( */ { int i; @@ -347,16 +323,17 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc } bpy_context_set(C, &gilstate); - - py_dict = CreateGlobalDictionary(C, text?text->id.name+2:fn); if (text) { + char fn_dummy[FILE_MAXDIR]; + bpy_text_filename_get(fn_dummy, text); + py_dict = CreateGlobalDictionary(C, fn_dummy); if( !text->compiled ) { /* if it wasn't already compiled, do it now */ char *buf = txt_to_buf( text ); text->compiled = - Py_CompileString( buf, text->id.name+2, Py_file_input ); + Py_CompileString( buf, fn_dummy, Py_file_input ); MEM_freeN( buf ); @@ -367,8 +344,12 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc if(text->compiled) py_result = PyEval_EvalCode( text->compiled, py_dict, py_dict ); - } else { - FILE *fp= fopen(fn, "r"); + } + else { + FILE *fp= fopen(fn, "r"); + + py_dict = CreateGlobalDictionary(C, fn); + if(fp) { #ifdef _WIN32 /* Previously we used PyRun_File to run directly the code on a FILE @@ -547,14 +528,8 @@ int BPY_run_python_script_space(const char *modulename, const char *func) } #endif -// #define TIME_REGISTRATION -#ifdef TIME_REGISTRATION -#include "PIL_time.h" -#endif - - -int BPY_button_eval(bContext *C, char *expr, double *value) +int BPY_eval_button(bContext *C, const char *expr, double *value) { PyGILState_STATE gilstate; PyObject *dict, *mod, *retval; @@ -607,6 +582,9 @@ int BPY_button_eval(bContext *C, char *expr, double *value) if(val==-1 && PyErr_Occurred()) { error_ret= -1; } + else if (!finite(val)) { + *value= 0.0; + } else { *value= val; } @@ -622,6 +600,40 @@ int BPY_button_eval(bContext *C, char *expr, double *value) return error_ret; } +int BPY_eval_string(bContext *C, const char *expr) +{ + PyGILState_STATE gilstate; + PyObject *dict, *retval; + int error_ret = 0; + + if (!expr) return -1; + + if(expr[0]=='\0') { + return error_ret; + } + + bpy_context_set(C, &gilstate); + + dict= CreateGlobalDictionary(C, NULL); + + retval = PyRun_String(expr, Py_eval_input, dict, dict); + + if (retval == NULL) { + error_ret= -1; + + BPy_errors_to_report(CTX_wm_reports(C)); + } + else { + Py_DECREF(retval); + } + + Py_DECREF(dict); + bpy_context_clear(C, &gilstate); + + return error_ret; +} + + void BPY_load_user_modules(bContext *C) { PyGILState_STATE gilstate; diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index b2a8f5be097..0e54f158ac4 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -39,7 +39,6 @@ #include "MEM_guardedalloc.h" #include "BKE_report.h" -#include "BKE_utildefines.h" static PyObject *pyop_call( PyObject * self, PyObject * args) diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 2ef55ef88d4..48a2655ecb2 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -23,15 +23,12 @@ */ #include "bpy_operator_wrap.h" -#include "BKE_context.h" #include "WM_api.h" #include "WM_types.h" #include "RNA_define.h" #include "bpy_rna.h" -#include "bpy_props.h" -#include "bpy_util.h" static void operator_properties_init(wmOperatorType *ot) { @@ -113,7 +110,7 @@ PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args) } /* identifiers */ - srna= srna_from_self(macro); + srna= srna_from_self(macro, "Macro Define:"); macroname = RNA_struct_identifier(srna); ot = WM_operatortype_exists(macroname); diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 3e4221011c0..c278ad56ab9 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -26,14 +26,11 @@ #include "bpy_rna.h" #include "bpy_util.h" -#include "RNA_access.h" #include "RNA_define.h" /* for defining our own rna */ #include "RNA_enum_types.h" #include "MEM_guardedalloc.h" -#include "float.h" /* FLT_MIN/MAX */ - EnumPropertyItem property_flag_items[] = { {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""}, @@ -71,6 +68,7 @@ EnumPropertyItem property_subtype_array_items[] = { {PROP_AXISANGLE, "AXISANGLE", 0, "Axis Angle", ""}, {PROP_XYZ, "XYZ", 0, "XYZ", ""}, {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color Gamma", ""}, + {PROP_LAYER, "LAYER", 0, "Layer", ""}, {PROP_NONE, "NONE", 0, "None", ""}, {0, NULL, 0, NULL, NULL}}; @@ -88,17 +86,19 @@ static PyObject *bpy_prop_deferred_return(void *func, PyObject *kw) return ret; } +#if 0 static int bpy_struct_id_used(StructRNA *srna, char *identifier) { PointerRNA ptr; RNA_pointer_create(NULL, srna, NULL, &ptr); return (RNA_struct_find_property(&ptr, identifier) != NULL); } +#endif /* Function that sets RNA, NOTE - self is NULL when called from python, but being abused from C so we can pass the srna allong * This isnt incorrect since its a python object - but be careful */ -static char BPy_BoolProperty_doc[] = +char BPy_BoolProperty_doc[] = ".. function:: BoolProperty(name=\"\", description=\"\", default=False, options={'ANIMATABLE'}, subtype='NONE')\n" "\n" " Returns a new boolean property definition.\n" @@ -113,11 +113,11 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "BoolProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -134,10 +134,9 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiO!s:BoolProperty", (char **)kwlist, &id, &name, &description, &def, &PySet_Type, &pyopts, &pysubtype)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "BoolProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "BoolProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "BoolProperty(options={...}):")) @@ -165,25 +164,25 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw) } } -static char BPy_BoolVectorProperty_doc[] = +char BPy_BoolVectorProperty_doc[] = ".. function:: BoolVectorProperty(name=\"\", description=\"\", default=(False, False, False), options={'ANIMATABLE'}, subtype='NONE', size=3)\n" "\n" " Returns a new vector boolean property definition.\n" "\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" -" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'NONE'].\n" +" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n" " :type subtype: string"; PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "BoolVectorProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -202,10 +201,9 @@ PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOO!si:BoolVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &PySet_Type, &pyopts, &pysubtype, &size)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "BoolVectorProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "BoolVectorProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "BoolVectorProperty(options={...}):")) @@ -242,7 +240,7 @@ PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw) } } -static char BPy_IntProperty_doc[] = +char BPy_IntProperty_doc[] = ".. function:: IntProperty(name=\"\", description=\"\", default=0, min=-sys.maxint, max=sys.maxint, soft_min=-sys.maxint, soft_max=sys.maxint, step=1, options={'ANIMATABLE'}, subtype='NONE')\n" "\n" " Returns a new int property definition.\n" @@ -256,11 +254,11 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "IntProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -277,10 +275,9 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiiiiiiO!s:IntProperty", (char **)kwlist, &id, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "IntProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "IntProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "IntProperty(options={...}):")) @@ -309,25 +306,25 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw) } } -static char BPy_IntVectorProperty_doc[] = +char BPy_IntVectorProperty_doc[] = ".. function:: IntVectorProperty(name=\"\", description=\"\", default=(0, 0, 0), min=-sys.maxint, max=sys.maxint, soft_min=-sys.maxint, soft_max=sys.maxint, options={'ANIMATABLE'}, subtype='NONE', size=3)\n" "\n" " Returns a new vector int property definition.\n" "\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" -" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'NONE'].\n" +" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n" " :type subtype: string"; PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "IntVectorProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -346,10 +343,9 @@ PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOiiiiO!si:IntVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &PySet_Type, &pyopts, &pysubtype, &size)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "IntVectorProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "IntVectorProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "IntVectorProperty(options={...}):")) @@ -388,7 +384,7 @@ PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw) } -static char BPy_FloatProperty_doc[] = +char BPy_FloatProperty_doc[] = ".. function:: FloatProperty(name=\"\", description=\"\", default=0.0, min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, subtype='NONE', unit='NONE')\n" "\n" " Returns a new float property definition.\n" @@ -404,11 +400,11 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "FloatProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -428,10 +424,9 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssffffffiO!ss:FloatProperty", (char **)kwlist, &id, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &pyunit)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "FloatProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "FloatProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "FloatProperty(options={...}):")) @@ -465,25 +460,25 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw) } } -static char BPy_FloatVectorProperty_doc[] = +char BPy_FloatVectorProperty_doc[] = ".. function:: FloatVectorProperty(name=\"\", description=\"\", default=(0.0, 0.0, 0.0), min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, subtype='NONE', size=3)\n" "\n" " Returns a new vector float property definition.\n" "\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" -" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'NONE'].\n" +" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n" " :type subtype: string"; PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "FloatVectorProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -502,10 +497,9 @@ PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOfffffiO!si:FloatVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &size)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "FloatVectorProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "FloatVectorProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "FloatVectorProperty(options={...}):")) @@ -543,7 +537,7 @@ PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw) } } -static char BPy_StringProperty_doc[] = +char BPy_StringProperty_doc[] = ".. function:: StringProperty(name=\"\", description=\"\", default=\"\", maxlen=0, options={'ANIMATABLE'}, subtype='NONE')\n" "\n" " Returns a new string property definition.\n" @@ -557,11 +551,11 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "StringProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -578,10 +572,9 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "s|sssiO!s:StringProperty", (char **)kwlist, &id, &name, &description, &def, &maxlen, &PySet_Type, &pyopts, &pysubtype)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "StringProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "StringProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "StringProperty(options={...}):")) @@ -593,7 +586,7 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw) } prop= RNA_def_property(srna, id, PROP_STRING, subtype); - if(maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen); + if(maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen + 1); /* +1 since it includes null terminator */ if(def) RNA_def_property_string_default(prop, def); RNA_def_property_ui_text(prop, name, description); @@ -655,7 +648,7 @@ static EnumPropertyItem *enum_items_from_py(PyObject *value, const char *def, in return items; } -static char BPy_EnumProperty_doc[] = +char BPy_EnumProperty_doc[] = ".. function:: EnumProperty(items, name=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n" "\n" " Returns a new enumerator property definition.\n" @@ -669,11 +662,11 @@ PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "EnumProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -690,10 +683,9 @@ PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|sssO!:EnumProperty", (char **)kwlist, &id, &items, &name, &description, &def, &PySet_Type, &pyopts)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "EnumProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "EnumProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "EnumProperty(options={...}):")) @@ -718,25 +710,29 @@ PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) } } -static StructRNA *pointer_type_from_py(PyObject *value) +static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix) { StructRNA *srna; - srna= srna_from_self(value); + srna= srna_from_self(value, "BoolProperty(...):"); if(!srna) { - PyErr_SetString(PyExc_SystemError, "expected an RNA type derived from IDPropertyGroup"); + + PyObject *msg= BPY_exception_buffer(); + char *msg_char= _PyUnicode_AsString(msg); + PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with: %s", error_prefix, msg_char); + Py_DECREF(msg); return NULL; } if(!RNA_struct_is_a(srna, &RNA_IDPropertyGroup)) { - PyErr_SetString(PyExc_SystemError, "expected an RNA type derived from IDPropertyGroup"); + PyErr_Format(PyExc_SystemError, "%.200s expected an RNA type derived from IDPropertyGroup", error_prefix); return NULL; } return srna; } -static char BPy_PointerProperty_doc[] = +char BPy_PointerProperty_doc[] = ".. function:: PointerProperty(items, type=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n" "\n" " Returns a new pointer property definition.\n" @@ -750,11 +746,11 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "PointerProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -770,16 +766,15 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ssO!:PointerProperty", (char **)kwlist, &id, &type, &name, &description, &PySet_Type, &pyopts)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "PointerProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "PointerProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "PointerProperty(options={...}):")) return NULL; - ptype= pointer_type_from_py(type); + ptype= pointer_type_from_py(type, "PointerProperty(...):"); if(!ptype) return NULL; @@ -797,7 +792,7 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw) return NULL; } -static char BPy_CollectionProperty_doc[] = +char BPy_CollectionProperty_doc[] = ".. function:: CollectionProperty(items, type=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n" "\n" " Returns a new collection property definition.\n" @@ -811,11 +806,11 @@ PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw) StructRNA *srna; if (PyTuple_GET_SIZE(args) > 0) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); return NULL; } - srna= srna_from_self(self); + srna= srna_from_self(self, "CollectionProperty(...):"); if(srna==NULL && PyErr_Occurred()) { return NULL; /* self's type was compatible but error getting the srna */ } @@ -831,16 +826,15 @@ PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ssO!:CollectionProperty", (char **)kwlist, &id, &type, &name, &description, &PySet_Type, &pyopts)) return NULL; - if(bpy_struct_id_used(srna, id)) { - // PyErr_Format(PyExc_TypeError, "CollectionProperty(): '%s' already defined.", id); - // return NULL; - Py_RETURN_NONE; + if(RNA_def_property_free_identifier(srna, id) == -1) { + PyErr_Format(PyExc_TypeError, "CollectionProperty(): '%s' is defined as a non-dynamic type.", id); + return NULL; } if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "CollectionProperty(options={...}):")) return NULL; - ptype= pointer_type_from_py(type); + ptype= pointer_type_from_py(type, "CollectionProperty(...):"); if(!ptype) return NULL; @@ -858,6 +852,42 @@ PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw) return NULL; } +char BPy_RemoveProperty_doc[] = +".. function:: RemoveProperty(attr)\n" +"\n" +" Removes a dynamically defined property.\n" +"\n" +" :arg attr: Property name.\n" +" :type attr: string"; +PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw) +{ + StructRNA *srna; + + srna= srna_from_self(self, "RemoveProperty(...):"); + if(srna==NULL && PyErr_Occurred()) { + return NULL; /* self's type was compatible but error getting the srna */ + } + else if(srna==NULL) { + PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type."); + return NULL; + } + else { + static const char *kwlist[] = {"attr", NULL}; + + char *id=NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kw, "s:RemoveProperty", (char **)kwlist, &id)) + return NULL; + + if(RNA_def_property_free_identifier(srna, id) != 1) { + PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property.", id); + return NULL; + } + + Py_RETURN_NONE; + } +} + static struct PyMethodDef props_methods[] = { {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolProperty_doc}, {"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolVectorProperty_doc}, @@ -869,6 +899,9 @@ static struct PyMethodDef props_methods[] = { {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS, BPy_EnumProperty_doc}, {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS, BPy_PointerProperty_doc}, {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS, BPy_CollectionProperty_doc}, + + /* only useful as a bpy_struct method */ + /* {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS|METH_KEYWORDS, BPy_RemoveProperty_doc}, */ {NULL, NULL, 0, NULL} }; diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h index 5fb62ac56d3..d90b12c0f91 100644 --- a/source/blender/python/intern/bpy_props.h +++ b/source/blender/python/intern/bpy_props.h @@ -41,6 +41,20 @@ PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw); PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw); PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw); +PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw); + +extern char BPy_BoolProperty_doc[]; +extern char BPy_BoolVectorProperty_doc[]; +extern char BPy_IntProperty_doc[]; +extern char BPy_IntVectorProperty_doc[]; +extern char BPy_FloatProperty_doc[]; +extern char BPy_FloatVectorProperty_doc[]; +extern char BPy_StringProperty_doc[]; +extern char BPy_EnumProperty_doc[]; +extern char BPy_PointerProperty_doc[]; +extern char BPy_CollectionProperty_doc[];\ +extern char BPy_RemoveProperty_doc[]; + #define PYRNA_STACK_ARRAY 32 #endif diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index d22297e3da9..fbb806f6436 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -1,4 +1,3 @@ - /** * $Id$ * @@ -30,11 +29,8 @@ //#include "blendef.h" #include "BLI_dynstr.h" #include "BLI_listbase.h" -#include "BLI_string.h" #include "float.h" /* FLT_MIN/MAX */ -#include "RNA_access.h" -#include "RNA_define.h" /* for defining our own rna */ #include "RNA_enum_types.h" #include "MEM_guardedalloc.h" @@ -54,15 +50,14 @@ #define USE_MATHUTILS #ifdef USE_MATHUTILS -#include "../generic/Mathutils.h" /* so we can have mathutils callbacks */ +#include "../generic/mathutils.h" /* so we can have mathutils callbacks */ #include "../generic/IDProp.h" /* for IDprop lookups */ -#include static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyRNA *self, PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length); static Py_ssize_t pyrna_prop_array_length(BPy_PropertyRNA *self); -static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self ); - +static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self); +static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback); /* bpyrna vector/euler/quat callbacks */ static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */ @@ -71,47 +66,84 @@ static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */ #define MATHUTILS_CB_SUBTYPE_EUL 0 #define MATHUTILS_CB_SUBTYPE_VEC 1 #define MATHUTILS_CB_SUBTYPE_QUAT 2 +#define MATHUTILS_CB_SUBTYPE_COLOR 0 -static int mathutils_rna_generic_check(BPy_PropertyRNA *self) +static int mathutils_rna_generic_check(BaseMathObject *bmo) { - return self->prop?1:0; + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; + return self->prop ? 1:0; } -static int mathutils_rna_vector_get(BPy_PropertyRNA *self, int subtype, float *vec_from) +static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype) { + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; if(self->prop==NULL) return 0; - RNA_property_float_get_array(&self->ptr, self->prop, vec_from); + RNA_property_float_get_array(&self->ptr, self->prop, bmo->data); + + /* Euler order exception */ + if(subtype==MATHUTILS_CB_SUBTYPE_EUL) { + EulerObject *eul= (EulerObject *)bmo; + PropertyRNA *prop_eul_order= NULL; + eul->order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order); + } + return 1; } -static int mathutils_rna_vector_set(BPy_PropertyRNA *self, int subtype, float *vec_to) +static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype) { + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; + float min, max; if(self->prop==NULL) return 0; - /* TODO, clamp */ - RNA_property_float_set_array(&self->ptr, self->prop, vec_to); + + RNA_property_float_range(&self->ptr, self->prop, &min, &max); + + if(min != FLT_MIN || max != FLT_MAX) { + int i, len= RNA_property_array_length(&self->ptr, self->prop); + for(i=0; idata[i], min, max); + } + } + + RNA_property_float_set_array(&self->ptr, self->prop, bmo->data); RNA_property_update(BPy_GetContext(), &self->ptr, self->prop); + + /* Euler order exception */ + if(subtype==MATHUTILS_CB_SUBTYPE_EUL) { + EulerObject *eul= (EulerObject *)bmo; + PropertyRNA *prop_eul_order= NULL; + short order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order); + if(order != eul->order) { + RNA_property_enum_set(&self->ptr, prop_eul_order, eul->order); + RNA_property_update(BPy_GetContext(), &self->ptr, prop_eul_order); + } + } return 1; } -static int mathutils_rna_vector_get_index(BPy_PropertyRNA *self, int subtype, float *vec_from, int index) +static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int subtype, int index) { + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; + if(self->prop==NULL) return 0; - vec_from[index]= RNA_property_float_get_index(&self->ptr, self->prop, index); + bmo->data[index]= RNA_property_float_get_index(&self->ptr, self->prop, index); return 1; } -static int mathutils_rna_vector_set_index(BPy_PropertyRNA *self, int subtype, float *vec_to, int index) +static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int subtype, int index) { + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; + if(self->prop==NULL) return 0; - RNA_property_float_clamp(&self->ptr, self->prop, &vec_to[index]); - RNA_property_float_set_index(&self->ptr, self->prop, index, vec_to[index]); + RNA_property_float_clamp(&self->ptr, self->prop, &bmo->data[index]); + RNA_property_float_set_index(&self->ptr, self->prop, index, bmo->data[index]); RNA_property_update(BPy_GetContext(), &self->ptr, self->prop); return 1; } @@ -128,31 +160,35 @@ Mathutils_Callback mathutils_rna_array_cb = { /* bpyrna matrix callbacks */ static int mathutils_rna_matrix_cb_index= -1; /* index for our callbacks */ -static int mathutils_rna_matrix_get(BPy_PropertyRNA *self, int subtype, float *mat_from) +static int mathutils_rna_matrix_get(BaseMathObject *bmo, int subtype) { + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; + if(self->prop==NULL) return 0; - RNA_property_float_get_array(&self->ptr, self->prop, mat_from); + RNA_property_float_get_array(&self->ptr, self->prop, bmo->data); return 1; } -static int mathutils_rna_matrix_set(BPy_PropertyRNA *self, int subtype, float *mat_to) +static int mathutils_rna_matrix_set(BaseMathObject *bmo, int subtype) { + BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user; + if(self->prop==NULL) return 0; /* can ignore clamping here */ - RNA_property_float_set_array(&self->ptr, self->prop, mat_to); + RNA_property_float_set_array(&self->ptr, self->prop, bmo->data); RNA_property_update(BPy_GetContext(), &self->ptr, self->prop); return 1; } Mathutils_Callback mathutils_rna_matrix_cb = { - (BaseMathCheckFunc) mathutils_rna_generic_check, - (BaseMathGetFunc) mathutils_rna_matrix_get, - (BaseMathSetFunc) mathutils_rna_matrix_set, - (BaseMathGetIndexFunc) NULL, - (BaseMathSetIndexFunc) NULL + mathutils_rna_generic_check, + mathutils_rna_matrix_get, + mathutils_rna_matrix_set, + NULL, + NULL }; /* same as RNA_enum_value_from_id but raises an exception */ @@ -168,7 +204,7 @@ int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int return 0; } -#define PROP_ALL_VECTOR_SUBTYPES PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ|PROP_UNIT_LENGTH +#define PROP_ALL_VECTOR_SUBTYPES PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) { @@ -236,13 +272,18 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) case PROP_QUATERNION: if(len==3) { /* euler */ if(is_thick) { - ret= newEulerObject(NULL, 0, Py_NEW, NULL); // TODO, get order from RNA + /* attempt to get order, only needed for thixk types since wrapped with update via callbacks */ + PropertyRNA *prop_eul_order= NULL; + short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, ROT_MODE_XYZ); + + ret= newEulerObject(NULL, order, Py_NEW, NULL); // TODO, get order from RNA RNA_property_float_get_array(ptr, prop, ((EulerObject *)ret)->eul); } else { - PyObject *eul_cb= newEulerObject_cb(ret, 0, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA - Py_DECREF(ret); /* the matrix owns now */ - ret= eul_cb; /* return the matrix instead */ + /* order will be updated from callback on use */ + PyObject *eul_cb= newEulerObject_cb(ret, ROT_MODE_XYZ, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA + Py_DECREF(ret); /* the euler owns now */ + ret= eul_cb; /* return the euler instead */ } } else if (len==4) { @@ -252,11 +293,23 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) } else { PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_QUAT); - Py_DECREF(ret); /* the matrix owns now */ - ret= quat_cb; /* return the matrix instead */ + Py_DECREF(ret); /* the quat owns now */ + ret= quat_cb; /* return the quat instead */ } } break; + case PROP_COLOR: + if(len==3) { /* color */ + if(is_thick) { + ret= newColorObject(NULL, Py_NEW, NULL); // TODO, get order from RNA + RNA_property_float_get_array(ptr, prop, ((ColorObject *)ret)->col); + } + else { + PyObject *col_cb= newColorObject_cb(ret, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_COLOR); + Py_DECREF(ret); /* the color owns now */ + ret= col_cb; /* return the color instead */ + } + } default: break; } @@ -279,6 +332,21 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) #endif +static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback) +{ + /* attempt to get order */ + if(*prop_eul_order==NULL) + *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode"); + + if(*prop_eul_order) { + short order= RNA_property_enum_get(ptr, *prop_eul_order); + if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */ + return order; + } + + return order_fallback; +} + static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b ) { return (a->ptr.data==b->ptr.data) ? 0 : -1; @@ -363,7 +431,7 @@ static PyObject *pyrna_struct_repr( BPy_StructRNA *self ) return pyob; } - return PyUnicode_FromFormat( "", RNA_struct_identifier(self->ptr.type)); + return PyUnicode_FromFormat( "", RNA_struct_identifier(self->ptr.type), self->ptr.data); } static PyObject *pyrna_prop_repr( BPy_PropertyRNA *self ) @@ -413,7 +481,27 @@ static PyObject *pyrna_prop_repr( BPy_PropertyRNA *self ) static long pyrna_struct_hash( BPy_StructRNA *self ) { - return (long)self->ptr.data; + return _Py_HashPointer(self->ptr.data); +} + +/* from python's meth_hash v3.1.2 */ +static long pyrna_prop_hash(BPy_PropertyRNA *self) +{ + long x,y; + if (self->ptr.data == NULL) + x = 0; + else { + x = _Py_HashPointer(self->ptr.data); + if (x == -1) + return -1; + } + y = _Py_HashPointer((void*)(self->prop)); + if (y == -1) + return -1; + x ^= y; + if (x == -1) + x = -2; + return x; } /* use our own dealloc so we can free a property if we use one */ @@ -772,7 +860,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v } else /* continue... */ #endif if (!PySequence_Check(value)) { - PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment expected a sequence instead of %.200s instance.", error_prefix, Py_TYPE(value)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence instead of %.200s instance.", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } /* done getting the length */ @@ -800,7 +888,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v param = PyLong_AsSsize_t( value ); if( param < 0 || param > 1) { - PyErr_Format(PyExc_TypeError, "%.200s expected True/False or 0/1", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; } else { if(data) *((int*)data)= param; @@ -812,7 +900,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v { int param = PyLong_AsSsize_t(value); if (param==-1 && PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "%.200s expected an int type", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; } else { RNA_property_int_clamp(ptr, prop, ¶m); @@ -825,7 +913,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v { float param = PyFloat_AsDouble(value); if (PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "%.200s expected a float type", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a float type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; } else { RNA_property_float_clamp(ptr, prop, (float *)¶m); @@ -837,11 +925,12 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v case PROP_STRING: { char *param = _PyUnicode_AsString(value); - + if (param==NULL) { - PyErr_Format(PyExc_TypeError, "%.200s expected a string type", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; - } else { + } + else { if(data) *((char**)data)= param; else RNA_property_string_set(ptr, prop, param); } @@ -868,7 +957,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v } else { char *enum_str= pyrna_enum_as_string(ptr, prop); - PyErr_Format(PyExc_TypeError, "%.200s expected a string enum or a set of strings in (%.200s)", error_prefix, enum_str); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s)", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), enum_str); MEM_freeN(enum_str); return -1; } @@ -890,13 +979,13 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v } if(!BPy_StructRNA_Check(value) && value != Py_None) { - PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptype)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype)); return -1; } else if((flag & PROP_NEVER_NULL) && value == Py_None) { - PyErr_Format(PyExc_TypeError, "%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptype)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype)); return -1; } else if(value != Py_None && ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA*)value)->ptr.id.data)) { - PyErr_Format(PyExc_TypeError, "%.200s ID type does not support assignment to its self", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s ID type does not support assignment to its self", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; } else { BPy_StructRNA *param= (BPy_StructRNA*)value; @@ -932,7 +1021,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v else { PointerRNA tmp; RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type)); return -1; } } @@ -940,7 +1029,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v if(raise_error) { PointerRNA tmp; RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type)); return -1; } } @@ -958,15 +1047,22 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v /* convert a sequence of dict's into a collection */ if(!PySequence_Check(value)) { - PyErr_Format(PyExc_TypeError, "%.200s expected a sequence of dicts for an RNA collection", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a sequence for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } - + seq_len = PySequence_Length(value); for(i=0; itype), RNA_property_identifier(prop), i); + Py_XDECREF(item); + return -1; + } + + if(PyDict_Check(item)==0) { + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a each sequence member to be a dict for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(item)->tp_name); Py_XDECREF(item); return -1; } @@ -980,7 +1076,13 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v RNA_property_collection_add(ptr, prop, &itemptr); if(pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection")==-1) { + PyObject *msg= BPY_exception_buffer(); + char *msg_char= _PyUnicode_AsString(msg); + + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s error converting a member of a collection from a dicts into an RNA collection, failed with: %s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), msg_char); + Py_DECREF(item); + Py_DECREF(msg); return -1; } Py_DECREF(item); @@ -989,7 +1091,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, v break; } default: - PyErr_Format(PyExc_AttributeError, "%.200s unknown property type (pyrna_py_to_prop)", error_prefix); + PyErr_Format(PyExc_AttributeError, "%.200s %.200s.%.200s unknown property type (pyrna_py_to_prop)", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; break; } @@ -1068,6 +1170,9 @@ static int pyrna_py_to_prop_index(BPy_PropertyRNA *self, int index, PyObject *va break; } } + + /* Run rna property functions */ + RNA_property_update(BPy_GetContext(), ptr, prop); return ret; } @@ -1090,12 +1195,17 @@ static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self ) static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum) { PointerRNA newptr; + int len= RNA_property_collection_length(&self->ptr, self->prop); - if(keynum < 0) keynum += RNA_property_collection_length(&self->ptr, self->prop); - - if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr)) - return pyrna_struct_CreatePyObject(&newptr); + if(keynum < 0) keynum += len; + if(keynum >= 0 && keynum < len) { + if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr)) { + return pyrna_struct_CreatePyObject(&newptr); + } + PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d could not be found", keynum); + return NULL; + } PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range", keynum); return NULL; } @@ -1307,7 +1417,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in return -1; } - if(!(value=PySequence_Fast(value_orig, "bpy_prop_array[slice] = value: type is not a sequence"))) { + if(!(value=PySequence_Fast(value_orig, "bpy_prop_array[slice] = value: assignment is not a sequence type"))) { return -1; } @@ -1413,43 +1523,50 @@ static int prop_subscript_ass_array_int(BPy_PropertyRNA *self, Py_ssize_t keynum static int pyrna_prop_array_ass_subscript( BPy_PropertyRNA *self, PyObject *key, PyObject *value ) { /* char *keyname = NULL; */ /* not supported yet */ - + int ret= -1; + if (!RNA_property_editable_flag(&self->ptr, self->prop)) { PyErr_Format(PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type) ); - return -1; + ret= -1; } - if (PyIndex_Check(key)) { + else if (PyIndex_Check(key)) { Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) - return -1; - - return prop_subscript_ass_array_int(self, i, value); + if (i == -1 && PyErr_Occurred()) { + ret= -1; + } + else { + ret= prop_subscript_ass_array_int(self, i, value); + } } else if (PySlice_Check(key)) { int len= RNA_property_array_length(&self->ptr, self->prop); Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0) - return -1; - - if (slicelength <= 0) { - return 0; + if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0) { + ret= -1; + } + else if (slicelength <= 0) { + ret= 0; /* do nothing */ } else if (step == 1) { - return prop_subscript_ass_array_slice(&self->ptr, self->prop, start, stop, len, value); + ret= prop_subscript_ass_array_slice(&self->ptr, self->prop, start, stop, len, value); } else { PyErr_SetString(PyExc_TypeError, "slice steps not supported with rna"); - return -1; + ret= -1; } } else { PyErr_SetString(PyExc_AttributeError, "invalid key, key must be an int"); - return -1; + ret= -1; } - RNA_property_update(BPy_GetContext(), &self->ptr, self->prop); + if(ret != -1) { + RNA_property_update(BPy_GetContext(), &self->ptr, self->prop); + } + + return ret; } /* for slice only */ @@ -1521,6 +1638,8 @@ static PySequenceMethods pyrna_prop_array_as_sequence = { (ssizeobjargproc)prop_subscript_ass_array_int, /* sq_ass_item */ NULL, /* *was* sq_ass_slice */ (objobjproc)pyrna_prop_array_contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; static PySequenceMethods pyrna_prop_collection_as_sequence = { @@ -1532,6 +1651,8 @@ static PySequenceMethods pyrna_prop_collection_as_sequence = { NULL, /* sq_ass_item */ NULL, /* *was* sq_ass_slice */ (objobjproc)pyrna_prop_collection_contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; static PySequenceMethods pyrna_struct_as_sequence = { @@ -1543,6 +1664,8 @@ static PySequenceMethods pyrna_struct_as_sequence = { NULL, /* sq_ass_item */ NULL, /* *was* sq_ass_slice */ (objobjproc)pyrna_struct_contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key ) @@ -1596,6 +1719,16 @@ static PyMappingMethods pyrna_struct_as_mapping = { ( objobjargproc ) pyrna_struct_ass_subscript, /* mp_ass_subscript */ }; +static char pyrna_struct_keys_doc[] = +".. method:: keys()\n" +"\n" +" Returns the keys of this objects custom properties (matches pythons dictionary function of the same name).\n" +"\n" +" :return: custom property keys.\n" +" :rtype: list of strings\n" +"\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"; + static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self) { IDProperty *group; @@ -1613,6 +1746,16 @@ static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self) return BPy_Wrap_GetKeys(group); } +static char pyrna_struct_items_doc[] = +".. method:: items()\n" +"\n" +" Returns the items of this objects custom properties (matches pythons dictionary function of the same name).\n" +"\n" +" :return: custom property key, value pairs.\n" +" :rtype: list of key, value tuples\n" +"\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"; + static PyObject *pyrna_struct_items(BPy_PropertyRNA *self) { IDProperty *group; @@ -1630,6 +1773,15 @@ static PyObject *pyrna_struct_items(BPy_PropertyRNA *self) return BPy_Wrap_GetItems(self->ptr.id.data, group); } +static char pyrna_struct_values_doc[] = +".. method:: values()\n" +"\n" +" Returns the values of this objects custom properties (matches pythons dictionary function of the same name).\n" +"\n" +" :return: custom property values.\n" +" :rtype: list\n" +"\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"; static PyObject *pyrna_struct_values(BPy_PropertyRNA *self) { @@ -1648,35 +1800,46 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self) return BPy_Wrap_GetValues(self->ptr.id.data, group); } -/* internal use for insert and delete */ -int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, char *error_prefix, - char **path_full, int *index, float *cfra) /* return values */ +/* for keyframes and drivers */ +static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefix, const char *path, + char **path_full, int *index) { - char *path; PropertyRNA *prop; - - if (!PyArg_ParseTuple(args, "s|if", &path, &index, &cfra)) { - PyErr_Format(PyExc_TypeError, "%.200s expected a string and optionally an int and float arguments", error_prefix); - return -1; - } - + if (ptr->data==NULL) { PyErr_Format(PyExc_TypeError, "%.200s this struct has no data, can't be animated", error_prefix); return -1; } - + prop = RNA_struct_find_property(ptr, path); - + if (prop==NULL) { PyErr_Format( PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path); return -1; } if (!RNA_property_animateable(ptr, prop)) { - PyErr_Format( PyExc_TypeError, "%.200s property \"%s\" not animatable", error_prefix, path); + PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not animatable", error_prefix, path); return -1; } + if(RNA_property_array_check(ptr, prop) == 0) { + if((*index) == -1) { + *index= 0; + } + else { + PyErr_Format(PyExc_TypeError, "%.200s index %d was given while property \"%s\" is not an array", error_prefix, *index, path); + return -1; + } + } + else { + int array_len= RNA_property_array_length(ptr, prop); + if((*index) < -1 || (*index) >= array_len) { + PyErr_Format( PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len); + return -1; + } + } + *path_full= RNA_path_from_ID_to_property(ptr, prop); if (*path_full==NULL) { @@ -1684,79 +1847,120 @@ int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, char *error_pre return -1; } + return 0; +} + +/* internal use for insert and delete */ +static int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix, + char **path_full, int *index, float *cfra, char **group_name) /* return values */ +{ + static char *kwlist[] = {"data_path", "index", "frame", "group", NULL}; + char *path; + + /* note, parse_str MUST start with 's|ifs' */ + if (!PyArg_ParseTupleAndKeywords(args, kw, parse_str, (char **)kwlist, &path, index, cfra, group_name)) + return -1; + + if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0) + return -1; + if(*cfra==FLT_MAX) *cfra= CTX_data_scene(BPy_GetContext())->r.cfra; return 0; /* success */ } -static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args) +static char pyrna_struct_keyframe_insert_doc[] = +".. method:: keyframe_insert(data_path, index=-1, frame=bpy.context.scene.frame_current, group=\"\")\n" +"\n" +" Insert a keyframe on the property given, adding fcurves and animation data when necessary.\n" +"\n" +" :arg data_path: path to the property to key, analogous to the fcurve's data path.\n" +" :type data_path: string\n" +" :arg index: array index of the property to key. Defaults to -1 which will key all indicies or a single channel if the property is not an array.\n" +" :type index: int\n" +" :arg frame: The frame on which the keyframe is inserted, defaulting to the current frame.\n" +" :type frame: float\n" +" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n" +" :type group: str\n" +" :return: Success of keyframe insertion.\n" +" :rtype: boolean"; + +static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw) { PyObject *result; /* args, pyrna_struct_keyframe_parse handles these */ char *path_full= NULL; int index= -1; float cfra= FLT_MAX; + char *group_name= NULL; - if(pyrna_struct_keyframe_parse(&self->ptr, args, "bpy_struct.keyframe_insert():", &path_full, &index, &cfra) == -1) + if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) return NULL; - result= PyBool_FromLong(insert_keyframe((ID *)self->ptr.id.data, NULL, NULL, path_full, index, cfra, 0)); + result= PyBool_FromLong(insert_keyframe((ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0)); MEM_freeN(path_full); return result; } -static PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args) +static char pyrna_struct_keyframe_delete_doc[] = +".. method:: keyframe_delete(data_path, index=-1, frame=bpy.context.scene.frame_current, group=\"\")\n" +"\n" +" Remove a keyframe from this properties fcurve.\n" +"\n" +" :arg data_path: path to the property to remove a key, analogous to the fcurve's data path.\n" +" :type data_path: string\n" +" :arg index: array index of the property to remove a key. Defaults to -1 removing all indicies or a single channel if the property is not an array.\n" +" :type index: int\n" +" :arg frame: The frame on which the keyframe is deleted, defaulting to the current frame.\n" +" :type frame: float\n" +" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n" +" :type group: str\n" +" :return: Success of keyframe deleation.\n" +" :rtype: boolean"; + +static PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw) { PyObject *result; /* args, pyrna_struct_keyframe_parse handles these */ char *path_full= NULL; int index= -1; float cfra= FLT_MAX; + char *group_name= NULL; - if(pyrna_struct_keyframe_parse(&self->ptr, args, "bpy_struct.keyframe_delete():", &path_full, &index, &cfra) == -1) + if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) return NULL; - result= PyBool_FromLong(delete_keyframe((ID *)self->ptr.id.data, NULL, NULL, path_full, index, cfra, 0)); + result= PyBool_FromLong(delete_keyframe((ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0)); MEM_freeN(path_full); return result; } +static char pyrna_struct_driver_add_doc[] = +".. method:: driver_add(path, index=-1)\n" +"\n" +" Adds driver(s) to the given property\n" +"\n" +" :arg path: path to the property to drive, analogous to the fcurve's data path.\n" +" :type path: string\n" +" :arg index: array index of the property drive. Defaults to -1 for all indicies or a single channel if the property is not an array.\n" +" :type index: int\n" +" :return: The driver(s) added.\n" +" :rtype: :class:`FCurve` or list if index is -1 with an array property."; + static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args) { char *path, *path_full; - int index= -1; /* default to all */ - PropertyRNA *prop; + int index= -1; PyObject *ret; if (!PyArg_ParseTuple(args, "s|i:driver_add", &path, &index)) return NULL; - if (self->ptr.data==NULL) { - PyErr_Format( PyExc_TypeError, "bpy_struct.driver_add(): this struct has no data, cant be animated", path); + if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0) return NULL; - } - - prop = RNA_struct_find_property(&self->ptr, path); - - if (prop==NULL) { - PyErr_Format( PyExc_TypeError, "bpy_struct.driver_add(): property \"%s\" not found", path); - return NULL; - } - - if (!RNA_property_animateable(&self->ptr, prop)) { - PyErr_Format( PyExc_TypeError, "bpy_struct.driver_add(): property \"%s\" not animatable", path); - return NULL; - } - - path_full= RNA_path_from_ID_to_property(&self->ptr, prop); - - if (path_full==NULL) { - PyErr_Format( PyExc_TypeError, "bpy_struct.driver_add(): could not make path to \"%s\"", path); - return NULL; - } if(ANIM_add_driver((ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON)) { ID *id= self->ptr.id.data; @@ -1783,8 +1987,8 @@ static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args) } } else { - ret= Py_None; - Py_INCREF(ret); + PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error"); + return NULL; } MEM_freeN(path_full); @@ -1792,6 +1996,47 @@ static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args) return ret; } + +static char pyrna_struct_driver_remove_doc[] = +".. method:: driver_remove(path, index=-1)\n" +"\n" +" Remove driver(s) from the given property\n" +"\n" +" :arg path: path to the property to drive, analogous to the fcurve's data path.\n" +" :type path: string\n" +" :arg index: array index of the property drive. Defaults to -1 for all indicies or a single channel if the property is not an array.\n" +" :type index: int\n" +" :return: Success of driver removal.\n" +" :rtype: boolean"; + +static PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args) +{ + char *path, *path_full; + int index= -1; + PyObject *ret; + + if (!PyArg_ParseTuple(args, "s|i:driver_remove", &path, &index)) + return NULL; + + if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0) + return NULL; + + ret= PyBool_FromLong(ANIM_remove_driver((ID *)self->ptr.id.data, path_full, index, 0)); + + MEM_freeN(path_full); + + return ret; +} + + +static char pyrna_struct_is_property_set_doc[] = +".. method:: is_property_set(property)\n" +"\n" +" Check if a property is set, use for testing operator properties.\n" +"\n" +" :return: True when the property has been set.\n" +" :rtype: boolean"; + static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *args) { char *name; @@ -1802,6 +2047,14 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg return PyBool_FromLong(RNA_property_is_set(&self->ptr, name)); } +static char pyrna_struct_is_property_hidden_doc[] = +".. method:: is_property_hidden(property)\n" +"\n" +" Check if a property is hidden.\n" +"\n" +" :return: True when the property is hidden.\n" +" :rtype: boolean"; + static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject *args) { PropertyRNA *prop; @@ -1817,6 +2070,11 @@ static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject * return PyBool_FromLong(hidden); } +static char pyrna_struct_path_resolve_doc[] = +".. method:: path_resolve(path)\n" +"\n" +" Returns the property from the path given or None if the property is not found."; + static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *value) { char *path= _PyUnicode_AsString(value); @@ -1824,7 +2082,7 @@ static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *value) PropertyRNA *r_prop; if(path==NULL) { - PyErr_SetString( PyExc_TypeError, "bpy_struct.items(): is only valid for collection types" ); + PyErr_SetString(PyExc_TypeError, "bpy_struct.path_resolve(): accepts only a single string argument"); return NULL; } @@ -1834,20 +2092,30 @@ static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *value) Py_RETURN_NONE; } -static PyObject *pyrna_struct_path_to_id(BPy_StructRNA *self, PyObject *args) +static char pyrna_struct_path_from_id_doc[] = +".. method:: path_from_id(property=\"\")\n" +"\n" +" Returns the data path from the ID to this object (string).\n" +"\n" +" :arg property: Optional property name which can be used if the path is to a property of this object.\n" +" :type property: string\n" +" :return: The path from :class:`bpy_struct.id_data` to this struct and property (when given).\n" +" :rtype: str"; + +static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args) { char *name= NULL; char *path; PropertyRNA *prop; PyObject *ret; - if (!PyArg_ParseTuple(args, "|s:path_to_id", &name)) + if (!PyArg_ParseTuple(args, "|s:path_from_id", &name)) return NULL; if(name) { prop= RNA_struct_find_property(&self->ptr, name); if(prop==NULL) { - PyErr_Format(PyExc_TypeError, "%.200s.path_to_id(\"%.200s\") not found", RNA_struct_identifier(self->ptr.type), name); + PyErr_Format(PyExc_TypeError, "%.200s.path_from_id(\"%.200s\") not found", RNA_struct_identifier(self->ptr.type), name); return NULL; } @@ -1858,8 +2126,8 @@ static PyObject *pyrna_struct_path_to_id(BPy_StructRNA *self, PyObject *args) } if(path==NULL) { - if(name) PyErr_Format(PyExc_TypeError, "%.200s.path_to_id(\"%s\") found but does not support path creation", RNA_struct_identifier(self->ptr.type), name); - else PyErr_Format(PyExc_TypeError, "%.200s.path_to_id() does not support path creation for this type", name); + if(name) PyErr_Format(PyExc_TypeError, "%.200s.path_from_id(\"%s\") found but does not support path creation", RNA_struct_identifier(self->ptr.type), name); + else PyErr_Format(PyExc_TypeError, "%.200s.path_from_id() does not support path creation for this type", RNA_struct_identifier(self->ptr.type)); return NULL; } @@ -1869,14 +2137,15 @@ static PyObject *pyrna_struct_path_to_id(BPy_StructRNA *self, PyObject *args) return ret; } -static PyObject *pyrna_struct_recast_type(BPy_StructRNA *self, PyObject *args) -{ - PointerRNA r_ptr; - RNA_pointer_recast(&self->ptr, &r_ptr); - return pyrna_struct_CreatePyObject(&r_ptr); -} +static char pyrna_prop_path_from_id_doc[] = +".. method:: path_from_id()\n" +"\n" +" Returns the data path from the ID to this property (string).\n" +"\n" +" :return: The path from :class:`bpy_struct.id_data` to this property.\n" +" :rtype: str"; -static PyObject *pyrna_prop_path_to_id(BPy_PropertyRNA *self) +static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self) { char *path; PropertyRNA *prop = self->prop; @@ -1885,7 +2154,7 @@ static PyObject *pyrna_prop_path_to_id(BPy_PropertyRNA *self) path= RNA_path_from_ID_to_property(&self->ptr, self->prop); if(path==NULL) { - PyErr_Format(PyExc_TypeError, "%.200s.%.200s.path_to_id() does not support path creation for this type", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(prop)); + PyErr_Format(PyExc_TypeError, "%.200s.%.200s.path_from_id() does not support path creation for this type", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(prop)); return NULL; } @@ -1895,6 +2164,21 @@ static PyObject *pyrna_prop_path_to_id(BPy_PropertyRNA *self) return ret; } +static char pyrna_struct_recast_type_doc[] = +".. method:: recast_type()\n" +"\n" +" Return a new instance, this is needed because types such as textures can be changed at runtime.\n" +"\n" +" :return: a new instance of this object with the type initialized again.\n" +" :rtype: subclass of :class:`bpy_struct`"; + +static PyObject *pyrna_struct_recast_type(BPy_StructRNA *self, PyObject *args) +{ + PointerRNA r_ptr; + RNA_pointer_recast(&self->ptr, &r_ptr); + return pyrna_struct_CreatePyObject(&r_ptr); +} + static void pyrna_dir_members_py(PyObject *list, PyObject *self) { PyObject *dict; @@ -2014,8 +2298,8 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname ) } } else if ((prop = RNA_struct_find_property(&self->ptr, name))) { - ret = pyrna_prop_to_py(&self->ptr, prop); - } + ret = pyrna_prop_to_py(&self->ptr, prop); + } /* RNA function only if callback is declared (no optional functions) */ else if ((func = RNA_struct_find_function(&self->ptr, name)) && RNA_function_defined(func)) { ret = pyrna_func_to_py((BPy_DummyPointerRNA *)self, func); @@ -2029,28 +2313,39 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname ) else { PointerRNA newptr; ListBase newlb; + short newtype; - int done= CTX_data_get(C, name, &newptr, &newlb); + int done= CTX_data_get(C, name, &newptr, &newlb, &newtype); if(done==1) { /* found */ - if (newptr.data) { - ret = pyrna_struct_CreatePyObject(&newptr); - } - else if (newlb.first) { - CollectionPointerLink *link; - PyObject *linkptr; - - ret = PyList_New(0); - - for(link=newlb.first; link; link=link->next) { - linkptr= pyrna_struct_CreatePyObject(&link->ptr); - PyList_Append(ret, linkptr); - Py_DECREF(linkptr); + switch(newtype) { + case CTX_DATA_TYPE_POINTER: + if(newptr.data == NULL) { + ret= Py_None; + Py_INCREF(ret); } - } - else { - ret = Py_None; - Py_INCREF(ret); + else { + ret= pyrna_struct_CreatePyObject(&newptr); + } + break; + case CTX_DATA_TYPE_COLLECTION: + { + CollectionPointerLink *link; + PyObject *linkptr; + + ret = PyList_New(0); + + for(link=newlb.first; link; link=link->next) { + linkptr= pyrna_struct_CreatePyObject(&link->ptr); + PyList_Append(ret, linkptr); + Py_DECREF(linkptr); + } + } + break; + default: + /* should never happen */ + PyErr_Format(PyExc_AttributeError, "bpy_struct: Context type invalid %d, can't get \"%.200s\" from context", newtype, name); + ret= NULL; } } else if (done==-1) { /* found but not set */ @@ -2098,17 +2393,43 @@ static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname) static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObject *value ) { char *name = _PyUnicode_AsString(pyname); - PropertyRNA *prop = RNA_struct_find_property(&self->ptr, name); - - if (prop==NULL) { - return PyObject_GenericSetAttr((PyObject *)self, pyname, value); - } else if (!RNA_property_editable_flag(&self->ptr, prop)) { - PyErr_Format( PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) ); - return -1; + PropertyRNA *prop= NULL; + + if (name[0] != '_' && (prop= RNA_struct_find_property(&self->ptr, name))) { + if (!RNA_property_editable_flag(&self->ptr, prop)) { + PyErr_Format( PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) ); + return -1; + } } - + else if (self->ptr.type == &RNA_Context) { + /* code just raises correct error, context prop's cant be set, unless its apart of the py class */ + bContext *C = self->ptr.data; + if(C==NULL) { + PyErr_Format(PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't set \"%.200s\" from context", name); + return -1; + } + else { + PointerRNA newptr; + ListBase newlb; + short newtype; + + int done= CTX_data_get(C, name, &newptr, &newlb, &newtype); + + if(done==1) { + PyErr_Format(PyExc_AttributeError, "bpy_struct: Context property \"%.200s\" is read-only", name); + BLI_freelistN(&newlb); + return -1; + } + + BLI_freelistN(&newlb); + } + } + /* pyrna_py_to_prop sets its own exceptions */ - return pyrna_py_to_prop(&self->ptr, prop, NULL, NULL, value, "bpy_struct: item.attr = val:"); + if(prop) + return pyrna_py_to_prop(&self->ptr, prop, NULL, NULL, value, "bpy_struct: item.attr = val:"); + else + return PyObject_GenericSetAttr((PyObject *)self, pyname, value); } static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self) @@ -2220,6 +2541,27 @@ static PyObject *pyrna_prop_remove(BPy_PropertyRNA *self, PyObject *value) return ret; } +static PyObject *pyrna_prop_move(BPy_PropertyRNA *self, PyObject *args) +{ + PyObject *ret; + int key=0, pos=0; + + if (!PyArg_ParseTuple(args, "ii", &key, &pos)) { + PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.move(): expected two ints as arguments"); + return NULL; + } + + if(!RNA_property_collection_move(&self->ptr, self->prop, key, pos)) { + PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.move() not supported for this collection"); + return NULL; + } + + ret = Py_None; + Py_INCREF(ret); + + return ret; +} + static PyObject *pyrna_struct_get_id_data(BPy_StructRNA *self) { if(self->ptr.id.data) { @@ -2242,7 +2584,7 @@ static PyGetSetDef pyrna_prop_getseters[] = { #endif static PyGetSetDef pyrna_struct_getseters[] = { - {"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, "The ID data this datablock is from, (not available for all data)", NULL}, + {"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, "The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL}, {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ }; @@ -2319,6 +2661,18 @@ static PyObject *pyrna_prop_values(BPy_PropertyRNA *self) return ret; } +static char pyrna_struct_get_doc[] = +".. method:: get(key, default=None)\n" +"\n" +" Returns the value of the custom property assigned to key or default when not found (matches pythons dictionary function of the same name).\n" +"\n" +" :arg key: The key assosiated with the custom property.\n" +" :type key: string\n" +" :arg default: Optional argument for the value to return if *key* is not found.\n" +// " :type default: Undefined\n" +"\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"; + static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args) { IDProperty *group, *idprop; @@ -2347,6 +2701,24 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args) return def; } +static char pyrna_struct_as_pointer_doc[] = +".. method:: as_pointer()\n" +"\n" +" Returns capsule which holds a pointer to blenders internal data\n" +"\n" +" :return: capsule with a name set from the struct type.\n" +" :rtype: PyCapsule\n" +"\n" +" .. note:: This is intended only for advanced script writers who need to pass blender data to their own C/Python modules.\n"; + +static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self) +{ + if(self->ptr.data) + return PyCapsule_New(self->ptr.data, RNA_struct_identifier(self->ptr.type), NULL); + + Py_RETURN_NONE; +} + static PyObject *pyrna_prop_get(BPy_PropertyRNA *self, PyObject *args) { PointerRNA newptr; @@ -2655,21 +3027,23 @@ PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self) static struct PyMethodDef pyrna_struct_methods[] = { /* only for PointerRNA's with ID'props */ - {"keys", (PyCFunction)pyrna_struct_keys, METH_NOARGS, NULL}, - {"values", (PyCFunction)pyrna_struct_values, METH_NOARGS, NULL}, - {"items", (PyCFunction)pyrna_struct_items, METH_NOARGS, NULL}, + {"keys", (PyCFunction)pyrna_struct_keys, METH_NOARGS, pyrna_struct_keys_doc}, + {"values", (PyCFunction)pyrna_struct_values, METH_NOARGS, pyrna_struct_values_doc}, + {"items", (PyCFunction)pyrna_struct_items, METH_NOARGS, pyrna_struct_items_doc}, - {"get", (PyCFunction)pyrna_struct_get, METH_VARARGS, NULL}, + {"get", (PyCFunction)pyrna_struct_get, METH_VARARGS, pyrna_struct_get_doc}, - /* maybe this become and ID function */ - {"keyframe_insert", (PyCFunction)pyrna_struct_keyframe_insert, METH_VARARGS, NULL}, - {"keyframe_delete", (PyCFunction)pyrna_struct_keyframe_delete, METH_VARARGS, NULL}, - {"driver_add", (PyCFunction)pyrna_struct_driver_add, METH_VARARGS, NULL}, - {"is_property_set", (PyCFunction)pyrna_struct_is_property_set, METH_VARARGS, NULL}, - {"is_property_hidden", (PyCFunction)pyrna_struct_is_property_hidden, METH_VARARGS, NULL}, - {"path_resolve", (PyCFunction)pyrna_struct_path_resolve, METH_O, NULL}, - {"path_to_id", (PyCFunction)pyrna_struct_path_to_id, METH_VARARGS, NULL}, - {"recast_type", (PyCFunction)pyrna_struct_recast_type, METH_NOARGS, NULL}, + {"as_pointer", (PyCFunction)pyrna_struct_as_pointer, METH_NOARGS, pyrna_struct_as_pointer_doc}, + + {"keyframe_insert", (PyCFunction)pyrna_struct_keyframe_insert, METH_VARARGS|METH_KEYWORDS, pyrna_struct_keyframe_insert_doc}, + {"keyframe_delete", (PyCFunction)pyrna_struct_keyframe_delete, METH_VARARGS|METH_KEYWORDS, pyrna_struct_keyframe_delete_doc}, + {"driver_add", (PyCFunction)pyrna_struct_driver_add, METH_VARARGS, pyrna_struct_driver_add_doc}, + {"driver_remove", (PyCFunction)pyrna_struct_driver_remove, METH_VARARGS, pyrna_struct_driver_remove_doc}, + {"is_property_set", (PyCFunction)pyrna_struct_is_property_set, METH_VARARGS, pyrna_struct_is_property_set_doc}, + {"is_property_hidden", (PyCFunction)pyrna_struct_is_property_hidden, METH_VARARGS, pyrna_struct_is_property_hidden_doc}, + {"path_resolve", (PyCFunction)pyrna_struct_path_resolve, METH_O, pyrna_struct_path_resolve_doc}, + {"path_from_id", (PyCFunction)pyrna_struct_path_from_id, METH_VARARGS, pyrna_struct_path_from_id_doc}, + {"recast_type", (PyCFunction)pyrna_struct_recast_type, METH_NOARGS, pyrna_struct_recast_type_doc}, {"__dir__", (PyCFunction)pyrna_struct_dir, METH_NOARGS, NULL}, /* experemental */ @@ -2680,7 +3054,7 @@ static struct PyMethodDef pyrna_struct_methods[] = { }; static struct PyMethodDef pyrna_prop_methods[] = { - {"path_to_id", (PyCFunction)pyrna_prop_path_to_id, METH_NOARGS, NULL}, + {"path_from_id", (PyCFunction)pyrna_prop_path_from_id, METH_NOARGS, pyrna_prop_path_from_id_doc}, {"__dir__", (PyCFunction)pyrna_prop_dir, METH_NOARGS, NULL}, {NULL, NULL, 0, NULL} }; @@ -2704,6 +3078,7 @@ static struct PyMethodDef pyrna_prop_collection_methods[] = { /* moved into a getset */ {"add", (PyCFunction)pyrna_prop_add, METH_NOARGS, NULL}, {"remove", (PyCFunction)pyrna_prop_remove, METH_O, NULL}, + {"move", (PyCFunction)pyrna_prop_move, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; @@ -2923,7 +3298,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw) RNA_parameter_list_create(&parms, self_ptr, self_func); RNA_parameter_list_begin(&parms, &iter); - parms_len= RNA_parameter_list_size(&parms); + parms_len= RNA_parameter_list_arg_count(&parms); ret_len= 0; if(pyargs_len + pykw_len > parms_len) { @@ -2951,7 +3326,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw) parm_id= RNA_property_identifier(parm); item= NULL; - if ((i < pyargs_len) && (flag & PROP_REQUIRED)) { + if (i < pyargs_len) { item= PyTuple_GET_ITEM(args, i); i++; @@ -2996,7 +3371,6 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw) RNA_parameter_list_end(&iter); - /* Check if we gave args that dont exist in the function * printing the error is slow but it should only happen when developing. * the if below is quick, checking if it passed less keyword args then we gave. @@ -3209,7 +3583,7 @@ PyTypeObject pyrna_prop_Type = { 0, /* tp_itemsize */ /* methods */ NULL, /* tp_dealloc */ - NULL, /* printfunc tp_print; */ + NULL, /* printfunc tp_print; */ NULL, /* getattrfunc tp_getattr; */ NULL, /* setattrfunc tp_setattr; */ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */ @@ -3223,7 +3597,7 @@ PyTypeObject pyrna_prop_Type = { /* More standard operations (here for binary compatibility) */ - NULL, /* hashfunc tp_hash; */ + ( hashfunc ) pyrna_prop_hash, /* hashfunc tp_hash; */ NULL, /* ternaryfunc tp_call; */ NULL, /* reprfunc tp_str; */ @@ -3443,16 +3817,18 @@ PyTypeObject pyrna_prop_collection_Type = { }; static struct PyMethodDef pyrna_struct_subtype_methods[] = { - {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"IntVectorProperty", (PyCFunction)BPy_IntVectorProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"FloatVectorProperty", (PyCFunction)BPy_FloatVectorProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS, ""}, - {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS, ""}, + {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolProperty_doc}, + {"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolVectorProperty_doc}, + {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, BPy_IntProperty_doc}, + {"IntVectorProperty", (PyCFunction)BPy_IntVectorProperty, METH_VARARGS|METH_KEYWORDS, BPy_IntVectorProperty_doc}, + {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS, BPy_FloatProperty_doc}, + {"FloatVectorProperty", (PyCFunction)BPy_FloatVectorProperty, METH_VARARGS|METH_KEYWORDS, BPy_FloatVectorProperty_doc}, + {"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS, BPy_StringProperty_doc}, + {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS, BPy_EnumProperty_doc}, + {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS, BPy_PointerProperty_doc}, + {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS, BPy_CollectionProperty_doc}, + + {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS|METH_KEYWORDS, BPy_RemoveProperty_doc}, // {"__get_rna", (PyCFunction)BPy_GetStructRNA, METH_NOARGS, ""}, {NULL, NULL, 0, NULL} @@ -3496,26 +3872,6 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna) } } -/* -static StructRNA *srna_from_self(PyObject *self); -PyObject *BPy_GetStructRNA(PyObject *self) -{ - StructRNA *srna= pyrna_struct_as_srna(self); - PointerRNA ptr; - PyObject *ret; - - RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr); - ret= pyrna_struct_CreatePyObject(&ptr); - - if(ret) { - return ret; - } - else { - Py_RETURN_NONE; - } -} -*/ - static PyObject* pyrna_srna_Subtype(StructRNA *srna); /* return a borrowed reference */ @@ -3665,7 +4021,8 @@ static PyObject* pyrna_struct_Subtype(PointerRNA *ptr) PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr ) { BPy_StructRNA *pyrna= NULL; - + + /* note: don't rely on this to return None since NULL data with a valid type can often crash */ if (ptr->data==NULL && ptr->type==NULL) { /* Operator RNA has NULL data */ Py_RETURN_NONE; } @@ -3856,7 +4213,7 @@ PyObject *BPY_rna_types(void) return (PyObject *)self; } -StructRNA *pyrna_struct_as_srna(PyObject *self) +StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_prefix) { BPy_StructRNA *py_srna = NULL; StructRNA *srna; @@ -3866,24 +4223,28 @@ StructRNA *pyrna_struct_as_srna(PyObject *self) py_srna = (BPy_StructRNA *)PyDict_GetItemString(((PyTypeObject *)self)->tp_dict, "bl_rna"); Py_XINCREF(py_srna); } - - if(py_srna==NULL) - py_srna = (BPy_StructRNA*)PyObject_GetAttrString(self, "bl_rna"); + + if(parent) { + /* be very careful with this since it will return a parent classes srna. + * modifying this will do confusing stuff! */ + if(py_srna==NULL) + py_srna = (BPy_StructRNA*)PyObject_GetAttrString(self, "bl_rna"); + } if(py_srna==NULL) { - PyErr_SetString(PyExc_SystemError, "internal error, self had no bl_rna attribute, should never happen."); + PyErr_Format(PyExc_SystemError, "%.200s internal error, self of type '%.200s' had no bl_rna attribute, should never happen", error_prefix, Py_TYPE(self)->tp_name); return NULL; } if(!BPy_StructRNA_Check(py_srna)) { - PyErr_Format(PyExc_SystemError, "internal error, bl_rna was of type %.200s, instead of %.200s instance.", Py_TYPE(py_srna)->tp_name, pyrna_struct_Type.tp_name); - Py_DECREF(py_srna); + PyErr_Format(PyExc_SystemError, "%.200s internal error, bl_rna was of type '%.200s', instead of %.200s instance", error_prefix, Py_TYPE(py_srna)->tp_name, pyrna_struct_Type.tp_name); + Py_DECREF(py_srna); return NULL; } if(py_srna->ptr.type != &RNA_Struct) { - PyErr_SetString(PyExc_SystemError, "internal error, bl_rna was not a RNA_Struct type of rna struct."); - Py_DECREF(py_srna); + PyErr_Format(PyExc_SystemError, "%.200s internal error, bl_rna was not a RNA_Struct type of rna struct", error_prefix); + Py_DECREF(py_srna); return NULL; } @@ -3896,7 +4257,7 @@ StructRNA *pyrna_struct_as_srna(PyObject *self) /* Orphan functions, not sure where they should go */ /* get the srna for methods attached to types */ /* */ -StructRNA *srna_from_self(PyObject *self) +StructRNA *srna_from_self(PyObject *self, const char *error_prefix) { /* a bit sloppy but would cause a very confusing bug if * an error happened to be set here */ @@ -3914,7 +4275,7 @@ StructRNA *srna_from_self(PyObject *self) /* These cases above not errors, they just mean the type was not compatible * After this any errors will be raised in the script */ - return pyrna_struct_as_srna(self); + return pyrna_struct_as_srna(self, 0, error_prefix); } static int deferred_register_prop(StructRNA *srna, PyObject *item, PyObject *key, PyObject *dummy_args) @@ -4409,12 +4770,13 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class) PyObject *item; const char *identifier= ""; - if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")) { - PyErr_SetString(PyExc_AttributeError, "bpy.types.register(): already registered as a subclass."); + if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")) { + PyErr_SetString(PyExc_AttributeError, "bpy.types.register(...): already registered as a subclass."); return NULL; - } + } - srna= pyrna_struct_as_srna(py_class); + /* warning: gets parent classes srna, only for the register function */ + srna= pyrna_struct_as_srna(py_class, 1, "bpy.types.register(...):"); if(srna==NULL) return NULL; @@ -4422,7 +4784,7 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class) reg= RNA_struct_register(srna); if(!reg) { - PyErr_SetString(PyExc_ValueError, "bpy.types.register(): expected a Type subclassed from a registerable rna type (no register supported)."); + PyErr_SetString(PyExc_ValueError, "bpy.types.register(...): expected a Type subclassed from a registerable rna type (no register supported)."); return NULL; } @@ -4480,12 +4842,12 @@ PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class) StructUnregisterFunc unreg; StructRNA *srna; - /*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) { + /*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) { PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not a registered as a subclass."); return NULL; - }*/ + }*/ - srna= pyrna_struct_as_srna(py_class); + srna= pyrna_struct_as_srna(py_class, 0, "bpy.types.unregister(...):"); if(srna==NULL) return NULL; @@ -4493,7 +4855,7 @@ PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class) unreg= RNA_struct_unregister(srna); if(!unreg) { - PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(): expected a Type subclassed from a registerable rna type (no unregister supported)."); + PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(...): expected a Type subclassed from a registerable rna type (no unregister supported)."); return NULL; } diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index 770e88e1a1d..9892ed6989b 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -64,8 +64,8 @@ typedef struct { /* cheap trick */ #define BPy_BaseTypeRNA BPy_PropertyRNA -StructRNA *srna_from_self(PyObject *self); -StructRNA *pyrna_struct_as_srna(PyObject *self); +StructRNA *srna_from_self(PyObject *self, const char *error_prefix); +StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_prefix); void BPY_rna_init( void ); PyObject *BPY_rna_module( void ); diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index c71429a76af..2404442dc18 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -22,12 +22,10 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "Python.h" #include "bpy_rna.h" #include "bpy_util.h" -#include "BLI_path_util.h" #include "DNA_screen_types.h" #include "BKE_context.h" #include "ED_space_api.h" diff --git a/source/blender/python/intern/bpy_rna_callback.h b/source/blender/python/intern/bpy_rna_callback.h index b6d771b23b2..d846b388c25 100644 --- a/source/blender/python/intern/bpy_rna_callback.h +++ b/source/blender/python/intern/bpy_rna_callback.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c index bd80b89cdc1..38462d1b176 100644 --- a/source/blender/python/intern/bpy_util.c +++ b/source/blender/python/intern/bpy_util.c @@ -22,8 +22,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "DNA_listBase.h" -#include "RNA_access.h" #include "bpy_util.h" #include "BLI_dynstr.h" #include "MEM_guardedalloc.h" @@ -245,8 +243,8 @@ PyObject *BPY_exception_buffer(void) PyErr_Clear(); - /* import StringIO / io - * string_io = StringIO.StringIO() + /* import io + * string_io = io.StringIO() */ if(! (string_io_mod= PyImport_ImportModule("io")) ) { diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h index 10cd6ba010b..e7e7bb09419 100644 --- a/source/blender/python/intern/bpy_util.h +++ b/source/blender/python/intern/bpy_util.h @@ -50,9 +50,9 @@ PyObject *PyObject_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...); /* Class type checking, use for checking classes can be added as operators, panels etc */ typedef struct BPY_class_attr_check { const char *name; /* name of the class attribute */ - char type; /* 's' = string, 'f' = function, 'l' = list, (add as needed) */ - int arg_count; /* only for function types, -1 for undefined, includes self arg */ - int len; /* only for string types currently */ + char type; /* 's' = string, 'f' = function, 'l' = list, (add as needed) */ + int arg_count; /* only for function types, -1 for undefined, includes self arg */ + int len; /* only for string types currently */ int flag; /* other options */ } BPY_class_attr_check; diff --git a/source/blender/python/intern/stubs.c b/source/blender/python/intern/stubs.c index 580ceefe9cb..d6dc5059342 100644 --- a/source/blender/python/intern/stubs.c +++ b/source/blender/python/intern/stubs.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/quicktime/SConscript b/source/blender/quicktime/SConscript index c8cd795decb..c8aeb70aa57 100644 --- a/source/blender/quicktime/SConscript +++ b/source/blender/quicktime/SConscript @@ -23,7 +23,8 @@ incs = ['.', '../imbuf/intern', '../blenloader', '../render/extern/include', - '../editors/include'] + '../editors/include', + '#/intern/audaspace/intern'] incs.append(env['BF_QUICKTIME_INC']) diff --git a/source/blender/quicktime/apple/Makefile b/source/blender/quicktime/apple/Makefile index 70f3f05c5f0..70757f02055 100644 --- a/source/blender/quicktime/apple/Makefile +++ b/source/blender/quicktime/apple/Makefile @@ -59,4 +59,5 @@ CPPFLAGS += -I.. CPPFLAGS += -I../../blenloader -I../../imbuf/intern -I../../imbuf CPPFLAGS += -I../../blenlib -I../../makesdna -I../../editors/include -I../../avi CPPFLAGS += -I../../blenkernel -I../../render/extern/include -I../../windowmanager -I../../makesrna +CPPFLAGS += -I../../../intern/audaspace/intern diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m index d22fbcdeacf..35f3629cb61 100644 --- a/source/blender/quicktime/apple/qtkit_export.m +++ b/source/blender/quicktime/apple/qtkit_export.m @@ -36,6 +36,9 @@ #include #include "DNA_scene_types.h" +#include "DNA_userdef_types.h" + +#include "AUD_C-API.h" #include "BKE_global.h" #include "BKE_scene.h" @@ -57,6 +60,7 @@ #endif #import #import +#include #if (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4) || !__LP64__ #error 64 bit build & OSX 10.5 minimum are needed for QTKit @@ -74,14 +78,34 @@ typedef struct QuicktimeExport { QTTime frameDuration; NSDictionary *frameAttributes; + + NSString *videoTempFileName; + /* Audio section */ + AUD_Device *audioInputDevice; + AudioFileID audioFile; + NSString *audioFileName; + AudioConverterRef audioConverter; + AudioBufferList audioBufferList; + AudioStreamBasicDescription audioInputFormat, audioOutputFormat; + AudioStreamPacketDescription *audioOutputPktDesc; + SInt64 audioFilePos; + char* audioInputBuffer; + char* audioOutputBuffer; + UInt32 audioCodecMaxOutputPacketSize; + UInt64 audioTotalExportedFrames, audioTotalSavedFrames; + UInt64 audioLastFrame; + SInt64 audioOutputPktPos; + } QuicktimeExport; static struct QuicktimeExport *qtexport; +#define AUDIOOUTPUTBUFFERSIZE 65536 + #pragma mark rna helper functions - -static QuicktimeCodecTypeDesc qtCodecList[] = { +/* Video codec */ +static QuicktimeCodecTypeDesc qtVideoCodecList[] = { {kRawCodecType, 1, "Uncompressed"}, {kJPEGCodecType, 2, "JPEG"}, {kMotionJPEGACodecType, 3, "M-JPEG A"}, @@ -96,34 +120,75 @@ static QuicktimeCodecTypeDesc qtCodecList[] = { {kH264CodecType, 12, "H.264"}, {0,0,NULL}}; -static int qtCodecCount = 12; +static int qtVideoCodecCount = 12; -int quicktime_get_num_codecs() { - return qtCodecCount; +int quicktime_get_num_videocodecs() { + return qtVideoCodecCount; } -QuicktimeCodecTypeDesc* quicktime_get_codecType_desc(int indexValue) { - if ((indexValue>=0) && (indexValue < qtCodecCount)) - return &qtCodecList[indexValue]; +QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue) { + if ((indexValue>=0) && (indexValue < qtVideoCodecCount)) + return &qtVideoCodecList[indexValue]; else return NULL; } -int quicktime_rnatmpvalue_from_codectype(int codecType) { +int quicktime_rnatmpvalue_from_videocodectype(int codecType) { int i; - for (i=0;i=0) && (indexValue < qtAudioCodecCount)) + return &qtAudioCodecList[indexValue]; + else + return NULL; +} + +int quicktime_rnatmpvalue_from_audiocodectype(int codecType) { + int i; + for (i=0;ipic); - BLI_convertstringcode(string, G.sce); + BLI_path_abs(string, G.sce); BLI_make_existing_file(string); @@ -157,7 +222,7 @@ void filepath_qt(char *string, RenderData *rd) { if (string==NULL) return; strcpy(string, rd->pic); - BLI_convertstringcode(string, G.sce); + BLI_path_abs(string, G.sce); BLI_make_existing_file(string); @@ -166,20 +231,74 @@ void filepath_qt(char *string, RenderData *rd) { if (strchr(string, '#')==NULL) strcat(string, "####"); /* 4 numbers */ - BLI_convertstringframe_range(string, rd->sfra, rd->efra, 4); + BLI_path_frame_range(string, rd->sfra, rd->efra, 4); strcat(string, ".mov"); } } +#pragma mark audio export functions + +static OSStatus write_cookie(AudioConverterRef converter, AudioFileID outfile) +{ + // grab the cookie from the converter and write it to the file + UInt32 cookieSize = 0; + OSStatus err = AudioConverterGetPropertyInfo(converter, kAudioConverterCompressionMagicCookie, &cookieSize, NULL); + // if there is an error here, then the format doesn't have a cookie, so on we go + if (!err && cookieSize) { + char* cookie = malloc(cookieSize); + + err = AudioConverterGetProperty(converter, kAudioConverterCompressionMagicCookie, &cookieSize, cookie); + + if (!err) + err = AudioFileSetProperty (outfile, kAudioFilePropertyMagicCookieData, cookieSize, cookie); + // even though some formats have cookies, some files don't take them + + free(cookie); + } + return err; +} + +/* AudioConverter input stream callback */ +static OSStatus AudioConverterInputCallback(AudioConverterRef inAudioConverter, + UInt32* ioNumberDataPackets, + AudioBufferList* ioData, + AudioStreamPacketDescription** outDataPacketDescription, + void* inUserData) +{ + if (qtexport->audioTotalExportedFrames >= qtexport->audioLastFrame) { /* EOF */ + *ioNumberDataPackets = 0; + return noErr; + } + + if (qtexport->audioInputFormat.mBytesPerPacket * *ioNumberDataPackets > AUDIOOUTPUTBUFFERSIZE) + *ioNumberDataPackets = AUDIOOUTPUTBUFFERSIZE / qtexport->audioInputFormat.mBytesPerPacket; + + if ((qtexport->audioTotalExportedFrames + *ioNumberDataPackets) > qtexport->audioLastFrame) + *ioNumberDataPackets = (qtexport->audioLastFrame - qtexport->audioTotalExportedFrames) / qtexport->audioInputFormat.mFramesPerPacket; + + qtexport->audioTotalExportedFrames += *ioNumberDataPackets; + + AUD_readDevice(qtexport->audioInputDevice, (UInt8*)qtexport->audioInputBuffer, + qtexport->audioInputFormat.mFramesPerPacket * *ioNumberDataPackets); + + ioData->mBuffers[0].mDataByteSize = qtexport->audioInputFormat.mBytesPerPacket * *ioNumberDataPackets; + ioData->mBuffers[0].mData = qtexport->audioInputBuffer; + ioData->mBuffers[0].mNumberChannels = qtexport->audioInputFormat.mChannelsPerFrame; + + return noErr; +} + + #pragma mark export functions int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSError *error; - char name[2048]; + char name[1024]; int success= 1; + OSStatus err=noErr; if(qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport"); @@ -192,18 +311,229 @@ int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, R } else { makeqtstring(rd, name); - qtexport->filename = [NSString stringWithCString:name + qtexport->filename = [[NSString alloc] initWithCString:name encoding:[NSString defaultCStringEncoding]]; - qtexport->movie = [[QTMovie alloc] initToWritableFile:qtexport->filename error:&error]; + qtexport->movie = nil; + qtexport->audioFile = NULL; + + if (rd->qtcodecsettings.audiocodecType) { + // generate a name for our video & audio files + /* Init audio file */ + CFURLRef outputFileURL; + char extension[32]; + AudioFileTypeID audioFileType; + + switch (rd->qtcodecsettings.audiocodecType) { + case kAudioFormatLinearPCM: + audioFileType = kAudioFileWAVEType; + strcpy(extension,".wav"); + break; + case kAudioFormatMPEG4AAC: + case kAudioFormatAppleLossless: + audioFileType = kAudioFileM4AType; + strcpy(extension, ".m4a"); + break; + default: + audioFileType = kAudioFileAIFFType; + strcpy(extension,".aiff"); + break; + } + + tmpnam(name); + strcat(name, extension); + outputFileURL = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,(UInt8*) name, strlen(name), false); + + if (outputFileURL) { + + qtexport->audioFileName = [[NSString alloc] initWithCString:name + encoding:[NSString defaultCStringEncoding]]; + + qtexport->audioInputFormat.mSampleRate = U.audiorate; + qtexport->audioInputFormat.mFormatID = kAudioFormatLinearPCM; + qtexport->audioInputFormat.mChannelsPerFrame = U.audiochannels; + switch (U.audioformat) { + case AUD_FORMAT_U8: + qtexport->audioInputFormat.mBitsPerChannel = 8; + qtexport->audioInputFormat.mFormatFlags = 0; + break; + case AUD_FORMAT_S24: + qtexport->audioInputFormat.mBitsPerChannel = 24; + qtexport->audioInputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + break; + case AUD_FORMAT_S32: + qtexport->audioInputFormat.mBitsPerChannel = 32; + qtexport->audioInputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + break; + case AUD_FORMAT_FLOAT32: + qtexport->audioInputFormat.mBitsPerChannel = 32; + qtexport->audioInputFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; + break; + case AUD_FORMAT_FLOAT64: + qtexport->audioInputFormat.mBitsPerChannel = 64; + qtexport->audioInputFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; + break; + case AUD_FORMAT_S16: + default: + qtexport->audioInputFormat.mBitsPerChannel = 16; + qtexport->audioInputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + break; + } + qtexport->audioInputFormat.mBytesPerFrame = qtexport->audioInputFormat.mChannelsPerFrame * qtexport->audioInputFormat.mBitsPerChannel / 8; + qtexport->audioInputFormat.mFramesPerPacket = 1; /*If not ==1, then need to check input callback for "rounding" issues"*/ + qtexport->audioInputFormat.mBytesPerPacket = qtexport->audioInputFormat.mBytesPerFrame; + qtexport->audioInputFormat.mFormatFlags |= kLinearPCMFormatFlagIsPacked; + + + /*Ouput format*/ + qtexport->audioOutputFormat.mFormatID = rd->qtcodecsettings.audiocodecType; + //TODO: set audio channels + qtexport->audioOutputFormat.mChannelsPerFrame = 2; + qtexport->audioOutputFormat.mSampleRate = rd->qtcodecsettings.audioSampleRate; + + /* Default value for compressed formats, overriden after if not the case */ + qtexport->audioOutputFormat.mFramesPerPacket = 0; + qtexport->audioOutputFormat.mBytesPerFrame = 0; + qtexport->audioOutputFormat.mBytesPerPacket = 0; + qtexport->audioOutputFormat.mBitsPerChannel = 0; + + switch (rd->qtcodecsettings.audiocodecType) { + case kAudioFormatMPEG4AAC: + qtexport->audioOutputFormat.mFormatFlags = kMPEG4Object_AAC_Main; + /* AAC codec does not handle sample rates above 48kHz, force this limit instead of getting an error afterwards */ + if (qtexport->audioOutputFormat.mSampleRate > 48000) qtexport->audioOutputFormat.mSampleRate = 48000; + break; + case kAudioFormatAppleLossless: + switch (U.audioformat) { + case AUD_FORMAT_S16: + qtexport->audioOutputFormat.mFormatFlags = kAppleLosslessFormatFlag_16BitSourceData; + break; + case AUD_FORMAT_S24: + qtexport->audioOutputFormat.mFormatFlags = kAppleLosslessFormatFlag_24BitSourceData; + break; + case AUD_FORMAT_S32: + qtexport->audioOutputFormat.mFormatFlags = kAppleLosslessFormatFlag_32BitSourceData; + break; + case AUD_FORMAT_U8: + case AUD_FORMAT_FLOAT32: + case AUD_FORMAT_FLOAT64: + default: + break; + } + break; + case kAudioFormatLinearPCM: + default: + switch (rd->qtcodecsettings.audioBitDepth) { + case AUD_FORMAT_U8: + qtexport->audioOutputFormat.mBitsPerChannel = 8; + qtexport->audioOutputFormat.mFormatFlags = 0; + break; + case AUD_FORMAT_S24: + qtexport->audioOutputFormat.mBitsPerChannel = 24; + qtexport->audioOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + break; + case AUD_FORMAT_S32: + qtexport->audioOutputFormat.mBitsPerChannel = 32; + qtexport->audioOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + break; + case AUD_FORMAT_FLOAT32: + qtexport->audioOutputFormat.mBitsPerChannel = 32; + qtexport->audioOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; + break; + case AUD_FORMAT_FLOAT64: + qtexport->audioOutputFormat.mBitsPerChannel = 64; + qtexport->audioOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; + break; + case AUD_FORMAT_S16: + default: + qtexport->audioOutputFormat.mBitsPerChannel = 16; + qtexport->audioOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + break; + } + qtexport->audioOutputFormat.mFormatFlags |= kLinearPCMFormatFlagIsPacked; + qtexport->audioOutputFormat.mBytesPerPacket = qtexport->audioOutputFormat.mChannelsPerFrame * (qtexport->audioOutputFormat.mBitsPerChannel / 8); + qtexport->audioOutputFormat.mFramesPerPacket = 1; + qtexport->audioOutputFormat.mBytesPerFrame = qtexport->audioOutputFormat.mBytesPerPacket; + break; + } + + err = AudioFileCreateWithURL(outputFileURL, audioFileType, &qtexport->audioOutputFormat, kAudioFileFlags_EraseFile, &qtexport->audioFile); + CFRelease(outputFileURL); + + if(err) + BKE_report(reports, RPT_ERROR, "\nQuicktime: unable to create temporary audio file. Format error ?"); + else { + err = AudioConverterNew(&qtexport->audioInputFormat, &qtexport->audioOutputFormat, &qtexport->audioConverter); + if (err) { + BKE_report(reports, RPT_ERROR, "\nQuicktime: unable to initialize audio codec converter. Format error ?"); + AudioFileClose(qtexport->audioFile); + qtexport->audioFile = NULL; + [qtexport->audioFileName release]; + qtexport->audioFileName = nil; + } else { + UInt32 prop,propSize; + /* Set up codec properties */ + if (rd->qtcodecsettings.audiocodecType == kAudioFormatMPEG4AAC) { /*Lossy compressed format*/ + prop = rd->qtcodecsettings.audioBitRate; + AudioConverterSetProperty(qtexport->audioConverter, kAudioConverterEncodeBitRate, + sizeof(prop), &prop); + + if (rd->qtcodecsettings.audioCodecFlags & QTAUDIO_FLAG_CODEC_ISCBR) + prop = kAudioCodecBitRateControlMode_Constant; + else + prop = kAudioCodecBitRateControlMode_LongTermAverage; + AudioConverterSetProperty(qtexport->audioConverter, kAudioCodecPropertyBitRateControlMode, + sizeof(prop), &prop); + } + /* Conversion quality : if performance impact then offer degraded option */ + if ((rd->qtcodecsettings.audioCodecFlags & QTAUDIO_FLAG_RESAMPLE_NOHQ) == 0) { + prop = kAudioConverterSampleRateConverterComplexity_Mastering; + AudioConverterSetProperty(qtexport->audioConverter, kAudioConverterSampleRateConverterComplexity, + sizeof(prop), &prop); + + prop = kAudioConverterQuality_Max; + AudioConverterSetProperty(qtexport->audioConverter, kAudioConverterSampleRateConverterQuality, + sizeof(prop), &prop); + } + + write_cookie(qtexport->audioConverter, qtexport->audioFile); + + /* Allocate output buffer */ + if (qtexport->audioOutputFormat.mBytesPerPacket ==0) /* VBR */ + AudioConverterGetProperty(qtexport->audioConverter, kAudioConverterPropertyMaximumOutputPacketSize, + &propSize, &qtexport->audioCodecMaxOutputPacketSize); + else + qtexport->audioCodecMaxOutputPacketSize = qtexport->audioOutputFormat.mBytesPerPacket; + + qtexport->audioInputBuffer = MEM_mallocN(AUDIOOUTPUTBUFFERSIZE, "qt_audio_inputPacket"); + qtexport->audioOutputBuffer = MEM_mallocN(AUDIOOUTPUTBUFFERSIZE, "qt_audio_outputPacket"); + qtexport->audioOutputPktDesc = MEM_mallocN(sizeof(AudioStreamPacketDescription)*AUDIOOUTPUTBUFFERSIZE/qtexport->audioCodecMaxOutputPacketSize, + "qt_audio_pktdesc"); + } + } + } + + if (err == noErr) { + qtexport->videoTempFileName = [[NSString alloc] initWithCString:tmpnam(nil) + encoding:[NSString defaultCStringEncoding]]; + if (qtexport->videoTempFileName) + qtexport->movie = [[QTMovie alloc] initToWritableFile:qtexport->videoTempFileName error:&error]; + + } + } else + qtexport->movie = [[QTMovie alloc] initToWritableFile:qtexport->filename error:&error]; if(qtexport->movie == nil) { BKE_report(reports, RPT_ERROR, "Unable to create quicktime movie."); success= 0; - NSLog(@"Unable to create quicktime movie : %@",[error localizedDescription]); + if (qtexport->filename) [qtexport->filename release]; + qtexport->filename = nil; + if (qtexport->audioFileName) [qtexport->audioFileName release]; + qtexport->audioFileName = nil; + if (qtexport->videoTempFileName) [qtexport->videoTempFileName release]; + qtexport->videoTempFileName = nil; [QTMovie exitQTKitOnThread]; } else { [qtexport->movie retain]; - [qtexport->filename retain]; [qtexport->movie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; [qtexport->movie setAttribute:@"Made with Blender" forKey:QTMovieCopyrightAttribute]; @@ -226,6 +556,23 @@ int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, R nil]; } [qtexport->frameAttributes retain]; + + if (qtexport->audioFile) { + /* Init audio input stream */ + AUD_DeviceSpecs specs; + + specs.channels = U.audiochannels; + specs.format = U.audioformat; + specs.rate = U.audiorate; + qtexport->audioInputDevice = AUD_openReadDevice(specs); + AUD_playDevice(qtexport->audioInputDevice, scene->sound_scene, rd->sfra * rd->frs_sec_base / rd->frs_sec); + + qtexport->audioOutputPktPos = 0; + qtexport->audioTotalExportedFrames = 0; + qtexport->audioTotalSavedFrames = 0; + + qtexport->audioLastFrame = (rd->efra - rd->sfra) * qtexport->audioInputFormat.mSampleRate * rd->frs_sec_base / rd->frs_sec; + } } } @@ -276,6 +623,41 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect [blBitmapFormatImage release]; [frameImage release]; + + + if (qtexport->audioFile) { + UInt32 audioPacketsConverted; + /* Append audio */ + while (((double)qtexport->audioTotalExportedFrames / (double) qtexport->audioInputFormat.mSampleRate) + < ((double)(frame - rd->sfra)) / (((double)rd->frs_sec) / rd->frs_sec_base)) { + + qtexport->audioBufferList.mNumberBuffers = 1; + qtexport->audioBufferList.mBuffers[0].mNumberChannels = qtexport->audioOutputFormat.mChannelsPerFrame; + qtexport->audioBufferList.mBuffers[0].mDataByteSize = AUDIOOUTPUTBUFFERSIZE; + qtexport->audioBufferList.mBuffers[0].mData = qtexport->audioOutputBuffer; + audioPacketsConverted = AUDIOOUTPUTBUFFERSIZE / qtexport->audioCodecMaxOutputPacketSize; + + AudioConverterFillComplexBuffer(qtexport->audioConverter, AudioConverterInputCallback, + NULL, &audioPacketsConverted, &qtexport->audioBufferList, qtexport->audioOutputPktDesc); + if (audioPacketsConverted) { + AudioFileWritePackets(qtexport->audioFile, false, qtexport->audioBufferList.mBuffers[0].mDataByteSize, + qtexport->audioOutputPktDesc, qtexport->audioOutputPktPos, &audioPacketsConverted, qtexport->audioOutputBuffer); + qtexport->audioOutputPktPos += audioPacketsConverted; + + if (qtexport->audioOutputFormat.mFramesPerPacket) { + // this is the common case: format has constant frames per packet + qtexport->audioTotalSavedFrames += (audioPacketsConverted * qtexport->audioOutputFormat.mFramesPerPacket); + } else { + unsigned int i; + // if there are variable frames per packet, then we have to do this for each packeet + for (i = 0; i < audioPacketsConverted; ++i) + qtexport->audioTotalSavedFrames += qtexport->audioOutputPktDesc[i].mVariableFramesInPacket; + } + + + } + } + } [pool drain]; return 1; @@ -284,17 +666,97 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect void end_qt(void) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if (qtexport->movie) { - /* Flush update of the movie file */ - [qtexport->movie updateMovieFile]; - [qtexport->movie invalidate]; + if (qtexport->audioFile) + { + NSDictionary *dict = nil; + QTMovie *audioTmpMovie = nil; + NSError *error; + NSFileManager *fileManager; + + /* Mux video and audio then save file */ + + /* Write last frames for VBR files */ + if (qtexport->audioOutputFormat.mBitsPerChannel == 0) { + OSStatus err = noErr; + AudioConverterPrimeInfo primeInfo; + UInt32 primeSize = sizeof(primeInfo); + + err = AudioConverterGetProperty(qtexport->audioConverter, kAudioConverterPrimeInfo, &primeSize, &primeInfo); + if (err == noErr) { + // there's priming to write out to the file + AudioFilePacketTableInfo pti; + pti.mPrimingFrames = primeInfo.leadingFrames; + pti.mRemainderFrames = primeInfo.trailingFrames; + pti.mNumberValidFrames = qtexport->audioTotalSavedFrames - pti.mPrimingFrames - pti.mRemainderFrames; + AudioFileSetProperty(qtexport->audioFile, kAudioFilePropertyPacketTableInfo, sizeof(pti), &pti); + } + + } + + write_cookie(qtexport->audioConverter, qtexport->audioFile); + AudioConverterDispose(qtexport->audioConverter); + AudioFileClose(qtexport->audioFile); + AUD_closeReadDevice(qtexport->audioInputDevice); + qtexport->audioFile = NULL; + qtexport->audioInputDevice = NULL; + MEM_freeN(qtexport->audioInputBuffer); + MEM_freeN(qtexport->audioOutputBuffer); + MEM_freeN(qtexport->audioOutputPktDesc); + + /* Reopen audio file and merge it */ + audioTmpMovie = [QTMovie movieWithFile:qtexport->audioFileName error:&error]; + if (audioTmpMovie) { + NSArray *audioTracks = [audioTmpMovie tracksOfMediaType:QTMediaTypeSound]; + QTTrack *audioTrack = nil; + if( [audioTracks count] > 0 ) + { + audioTrack = [audioTracks objectAtIndex:0]; + } + + if( audioTrack ) + { + QTTimeRange totalRange; + totalRange.time = QTZeroTime; + totalRange.duration = [[audioTmpMovie attributeForKey:QTMovieDurationAttribute] QTTimeValue]; + + [qtexport->movie insertSegmentOfTrack:audioTrack timeRange:totalRange atTime:QTZeroTime]; + } + } + + /* Save file */ + dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] + forKey:QTMovieFlatten]; + + if (dict) { + [qtexport->movie writeToFile:qtexport->filename withAttributes:dict]; + } + + /* Delete temp files */ + fileManager = [[NSFileManager alloc] init]; + [fileManager removeItemAtPath:qtexport->audioFileName error:&error]; + [fileManager removeItemAtPath:qtexport->videoTempFileName error:&error]; + [fileManager release]; + } + else { + /* Flush update of the movie file */ + [qtexport->movie updateMovieFile]; + + [qtexport->movie invalidate]; + } /* Clean up movie structure */ - [qtexport->filename release]; + if (qtexport->filename) [qtexport->filename release]; + qtexport->filename = nil; + if (qtexport->audioFileName) [qtexport->audioFileName release]; + qtexport->audioFileName = nil; + if (qtexport->videoTempFileName) [qtexport->videoTempFileName release]; + qtexport->videoTempFileName = nil; [qtexport->frameAttributes release]; [qtexport->movie release]; - } + } [QTMovie exitQTKitOnThread]; @@ -302,6 +764,7 @@ void end_qt(void) MEM_freeN(qtexport); qtexport = NULL; } + [pool drain]; } @@ -318,6 +781,15 @@ void quicktime_verify_image_type(RenderData *rd) rd->qtcodecsettings.codecType = kJPEGCodecType; rd->qtcodecsettings.codecSpatialQuality = (codecHighQuality*100)/codecLosslessQuality; } + if ((rd->qtcodecsettings.audioSampleRate < 21000) || + (rd->qtcodecsettings.audioSampleRate > 193000)) + rd->qtcodecsettings.audioSampleRate = 48000; + + if (rd->qtcodecsettings.audioBitDepth == 0) + rd->qtcodecsettings.audioBitDepth = AUD_FORMAT_S16; + + if (rd->qtcodecsettings.audioBitRate == 0) + rd->qtcodecsettings.audioBitRate = 256000; } } diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m index 43c17644681..80b97066b61 100644 --- a/source/blender/quicktime/apple/qtkit_import.m +++ b/source/blender/quicktime/apple/qtkit_import.m @@ -198,7 +198,6 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height) rasterRGB = (uchar*)[blBitmapFormatImageRGB bitmapData]; if (rasterRGB == NULL) { - [bitmapImage release]; [blBitmapFormatImageRGB release]; return NULL; } @@ -220,7 +219,6 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height) rasterRGBA = (uchar*)[blBitmapFormatImageRGBA bitmapData]; if (rasterRGBA == NULL) { - [bitmapImage release]; [blBitmapFormatImageRGB release]; [blBitmapFormatImageRGBA release]; return NULL; @@ -378,7 +376,11 @@ int imb_is_a_quicktime (char *name) { NSImage *image; int result; - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSAutoreleasePool *pool; + + if(!G.have_quicktime) return 0; + + pool = [[NSAutoreleasePool alloc] init]; // dont let quicktime image import handle these if( BLI_testextensie(name, ".swf") || @@ -390,13 +392,14 @@ int imb_is_a_quicktime (char *name) BLI_testextensie(name, ".mp3")) return 0; - image = [NSImage alloc]; - if ([image initWithContentsOfFile:[NSString stringWithUTF8String:name]]) + image = [[NSImage alloc] initWithContentsOfFile:[NSString stringWithUTF8String:name]]; + if (image) { + [image release]; result = true; + } else result = false; - [image release]; [pool drain]; return result; } @@ -413,6 +416,9 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags) NSBitmapImageRep *bitmapImage; NSBitmapImageRep *blBitmapFormatImageRGB,*blBitmapFormatImageRGBA; NSAutoreleasePool *pool; + + if(!G.have_quicktime) + return NULL; pool = [[NSAutoreleasePool alloc] init]; diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c index 8f12e40b04a..c1291fc6949 100644 --- a/source/blender/quicktime/apple/quicktime_export.c +++ b/source/blender/quicktime/apple/quicktime_export.c @@ -123,7 +123,7 @@ static int sframe; /* RNA functions */ -static QuicktimeCodecTypeDesc qtCodecList[] = { +static QuicktimeCodecTypeDesc qtVideoCodecList[] = { {kRawCodecType, 1, "Uncompressed"}, {kJPEGCodecType, 2, "JPEG"}, {kMotionJPEGACodecType, 3, "M-JPEG A"}, @@ -138,34 +138,34 @@ static QuicktimeCodecTypeDesc qtCodecList[] = { {kH264CodecType, 12, "H.264"}, {0,0,NULL}}; -static int qtCodecCount = 12; +static int qtVideoCodecCount = 12; -int quicktime_get_num_codecs() { - return qtCodecCount; +int quicktime_get_num_videocodecs() { + return qtVideoCodecCount; } -QuicktimeCodecTypeDesc* quicktime_get_codecType_desc(int indexValue) { - if ((indexValue>=0) && (indexValue < qtCodecCount)) - return &qtCodecList[indexValue]; +QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue) { + if ((indexValue>=0) && (indexValue < qtVideoCodecCount)) + return &qtVideoCodecList[indexValue]; else return NULL; } -int quicktime_rnatmpvalue_from_codectype(int codecType) { +int quicktime_rnatmpvalue_from_videocodectype(int codecType) { int i; - for (i=0;ipic); - BLI_convertstringcode(string, G.sce); + BLI_path_abs(string, G.sce); BLI_make_existing_file(string); @@ -871,20 +871,20 @@ int fromcocoa_request_qtcodec_settings(bContext *C, wmOperator *op) void SCENE_OT_render_data_set_quicktime_codec(wmOperatorType *ot) { /* identifiers */ - ot->name= "Change codec"; - ot->description= "Change Quicktime codec Settings"; - ot->idname= "SCENE_OT_render_data_set_quicktime_codec"; + ot->name= "Change codec"; + ot->description= "Change Quicktime codec Settings"; + ot->idname= "SCENE_OT_render_data_set_quicktime_codec"; - /* api callbacks */ + /* api callbacks */ #if defined(__APPLE__) && defined(GHOST_COCOA) ot->exec = cocoa_request_qtcodec_settings; #else - ot->exec= request_qtcodec_settings; + ot->exec= request_qtcodec_settings; #endif - ot->poll= ED_operator_setqtcodec; + ot->poll= ED_operator_setqtcodec; - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } #endif /* USE_QTKIT */ diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c index edcf7213cc1..75f77dccbfa 100644 --- a/source/blender/quicktime/apple/quicktime_import.c +++ b/source/blender/quicktime/apple/quicktime_import.c @@ -559,6 +559,8 @@ int imb_is_a_quicktime (char *name) #endif OSErr err = noErr; + if(!G.have_quicktime) return 0; + if(QTIME_DEBUG) printf("qt: checking as image %s\n", name); // dont let quicktime image import handle these @@ -783,25 +785,25 @@ bail: #if 0 struct ImageDescription { - long idSize; - CodecType cType; - long resvd1; - short resvd2; - short dataRefIndex; - short version; - short revisionLevel; - long vendor; - CodecQ temporalQuality; - CodecQ spatialQuality; - short width; - short height; - Fixed hRes; - Fixed vRes; - long dataSize; - short frameCount; - Str31 name; - short depth; - short clutID; + long idSize; + CodecType cType; + long resvd1; + short resvd2; + short dataRefIndex; + short version; + short revisionLevel; + long vendor; + CodecQ temporalQuality; + CodecQ spatialQuality; + short width; + short height; + Fixed hRes; + Fixed vRes; + long dataSize; + short frameCount; + Str31 name; + short depth; + short clutID; }; #endif // 0 diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h index 71faeeb0ce0..1ca52b1bd10 100644 --- a/source/blender/quicktime/quicktime_export.h +++ b/source/blender/quicktime/quicktime_export.h @@ -34,6 +34,10 @@ #define __AIFF__ +#define QTAUDIO_FLAG_RESAMPLE_NOHQ 1 +#define QTAUDIO_FLAG_CODEC_ISCBR 2 + + /*Codec list*/ typedef struct QuicktimeCodecTypeDesc { int codecType; @@ -54,10 +58,19 @@ void filepath_qt(char *string, struct RenderData *rd); /*RNA helper functions */ void quicktime_verify_image_type(struct RenderData *rd); //used by RNA for defaults values init, if needed -int quicktime_get_num_codecs(); -QuicktimeCodecTypeDesc* quicktime_get_codecType_desc(int indexValue); -int quicktime_rnatmpvalue_from_codectype(int codecType); -int quicktime_codecType_from_rnatmpvalue(int rnatmpvalue); +/*Video codec type*/ +int quicktime_get_num_videocodecs(); +QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue); +int quicktime_rnatmpvalue_from_videocodectype(int codecType); +int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue); + +#ifdef USE_QTKIT +/*Audio codec type*/ +int quicktime_get_num_audiocodecs(); +QuicktimeCodecTypeDesc* quicktime_get_audiocodecType_desc(int indexValue); +int quicktime_rnatmpvalue_from_audiocodectype(int codecType); +int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue); +#endif #ifndef USE_QTKIT void SCENE_OT_render_data_set_quicktime_codec(struct wmOperatorType *ot); //Operator to raise quicktime standard dialog to request codec settings diff --git a/source/blender/quicktime/quicktime_import.h b/source/blender/quicktime/quicktime_import.h index a7f427a2b1f..1fccc776620 100644 --- a/source/blender/quicktime/quicktime_import.h +++ b/source/blender/quicktime/quicktime_import.h @@ -35,10 +35,6 @@ #define __AIFF__ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "../imbuf/IMB_imbuf.h" #include "../imbuf/IMB_imbuf_types.h" diff --git a/source/blender/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c index 5e43e44c6bd..57d16416dd8 100644 --- a/source/blender/readblenfile/intern/BLO_readblenfile.c +++ b/source/blender/readblenfile/intern/BLO_readblenfile.c @@ -36,10 +36,7 @@ #include #include #include - -#ifdef HAVE_CONFIG_H -#include -#endif +#include #ifdef WIN32 #include // read, open @@ -140,7 +137,7 @@ blo_read_runtime( fd= open(path, O_BINARY|O_RDONLY, 0); if (fd==-1) { - BKE_report(reports, RPT_ERROR, "Unable to open"); + BKE_reportf(reports, RPT_ERROR, "Unable to open \"%s\": %s.", path, strerror(errno)); goto cleanup; } @@ -150,13 +147,13 @@ blo_read_runtime( datastart= handle_read_msb_int(fd); if (datastart==-1) { - BKE_report(reports, RPT_ERROR, "Unable to read"); + BKE_reportf(reports, RPT_ERROR, "Unable to read \"%s\" (problem seeking)", path); goto cleanup; } else if (read(fd, buf, 8)!=8) { - BKE_report(reports, RPT_ERROR, "Unable to read"); + BKE_reportf(reports, RPT_ERROR, "Unable to read \"%s\" (truncated header)", path); goto cleanup; } else if (memcmp(buf, "BRUNTIME", 8)!=0) { - BKE_report(reports, RPT_ERROR, "File is not a Blender file"); + BKE_reportf(reports, RPT_ERROR, "Unable to read \"%s\" (not a blend file)", path); goto cleanup; } else { //printf("starting to read runtime from %s at datastart %d\n", path, datastart); diff --git a/source/blender/readblenfile/test/test.c b/source/blender/readblenfile/test/test.c index 86473c18687..1cb4f7e92f3 100644 --- a/source/blender/readblenfile/test/test.c +++ b/source/blender/readblenfile/test/test.c @@ -29,19 +29,15 @@ #include // strlen #include "BLO_readblenfile.h" -#ifdef HAVE_CONFIG_H -#include -#endif - struct streamGlueControlStruct *Global_streamGlueControl; - int + int streamGlueWrite( - struct streamGlueControlStruct *streamGlueControl, - struct streamGlueStruct **streamGlue, - unsigned char *data, - unsigned int dataIn, - int finishUp) + struct streamGlueControlStruct *streamGlueControl, + struct streamGlueStruct **streamGlue, + unsigned char *data, + unsigned int dataIn, + int finishUp) { printf("called with %d bytes in buffer [%s]\n", dataIn, data); return (0); diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 0f72546724e..42c91b7315b 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -54,10 +54,6 @@ IF(APPLE) ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") ENDIF(APPLE) -IF(WITH_RAYOPTIMIZATION) - ADD_DEFINITIONS(-D__SSE__) -ENDIF(WITH_RAYOPTIMIZATION) - #TODO #if env['OURPLATFORM']=='linux2': # cflags='-pthread' diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index f9c4e9690a1..802703d476c 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -129,6 +129,12 @@ typedef struct RenderResult { /* for render results in Image, verify validity for sequences */ int framenr; + + /* for acquire image, to indicate if it there is a combined layer */ + int have_combined; + + /* render info text */ + char *text; } RenderResult; @@ -146,21 +152,8 @@ typedef struct RenderStats { /* the name is used as identifier, so elsewhere in blender the result can retrieved */ /* calling a new render with same name, frees automatic existing render */ -struct Render *RE_NewRender (const char *name, int slot); -struct Render *RE_GetRender(const char *name, int slot); - -/* render slots. for most cases like baking or preview render this will - always be default, for actual render multiple slots can be used. in - that case 'rendering' is the slot being rendered to, and 'view' is the - slot being viewed. these are always the same except if the currently - viewed slot is changed during render, at the end they will be synced. */ -#define RE_SLOT_RENDERING -2 -#define RE_SLOT_VIEW -1 -#define RE_SLOT_DEFAULT 0 -#define RE_SLOT_MAX 10 - -void RE_SetViewSlot(int slot); -int RE_GetViewSlot(void); +struct Render *RE_NewRender (const char *name); +struct Render *RE_GetRender(const char *name); /* returns 1 while render is working (or renders called from within render) */ int RE_RenderInProgress(struct Render *re); @@ -177,6 +170,7 @@ struct RenderResult *RE_AcquireResultWrite(struct Render *re); void RE_ReleaseResult(struct Render *re); void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr); void RE_ReleaseResultImage(struct Render *re); +void RE_SwapResult(struct Render *re, struct RenderResult **rr); struct RenderStats *RE_GetStats(struct Render *re); void RE_ResultGet32(struct Render *re, unsigned int *rect); struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name); @@ -198,7 +192,7 @@ void RE_SetPixelSize(struct Render *re, float pixsize); void RE_SetView (struct Render *re, float mat[][4]); /* make or free the dbase */ -void RE_Database_FromScene(struct Render *re, struct Scene *scene, int use_camera_view); +void RE_Database_FromScene(struct Render *re, struct Scene *scene, unsigned int lay, int use_camera_view); void RE_Database_Free (struct Render *re); /* project dbase again, when viewplane/perspective changed */ @@ -211,11 +205,14 @@ void RE_set_max_threads(int threads); void RE_init_threadcount(Render *re); /* the main processor, assumes all was set OK! */ -void RE_TileProcessor(struct Render *re, int firsttile, int threaded); +void RE_TileProcessor(struct Render *re); /* only RE_NewRender() needed, main Blender render calls */ -void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, int frame); -void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra, int tfra, struct ReportList *reports); +void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame); +void RE_BlenderAnim(struct Render *re, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports); + +/* main preview render call */ +void RE_PreviewRender(struct Render *re, struct Scene *scene); void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress); @@ -233,7 +230,7 @@ void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr)); void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect)); void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs)); -void RE_timecursor_cb (struct Render *re, void *handle, void (*f)(void *handle, int)); +void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float)); void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle)); void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, char *str)); @@ -251,7 +248,7 @@ void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, #define RE_BAKE_DISPLACEMENT 5 #define RE_BAKE_SHADOW 6 -void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct Object *actob); +void RE_Database_Baking(struct Render *re, struct Scene *scene, unsigned int lay, int type, struct Object *actob); void RE_DataBase_GetView(struct Render *re, float mat[][4]); void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]); @@ -259,8 +256,10 @@ struct Scene *RE_GetScene(struct Render *re); /* External Engine */ -#define RE_INTERNAL 1 -#define RE_GAME 2 +#define RE_INTERNAL 1 +#define RE_GAME 2 +#define RE_DO_PREVIEW 4 +#define RE_DO_ALL 8 extern ListBase R_engines; diff --git a/source/blender/render/extern/include/RE_raytrace.h b/source/blender/render/extern/include/RE_raytrace.h index 317de5b9954..215dd816a4e 100644 --- a/source/blender/render/extern/include/RE_raytrace.h +++ b/source/blender/render/extern/include/RE_raytrace.h @@ -201,6 +201,7 @@ struct Isect #define RE_SKIP_VLR_NEIGHBOUR (1 << 1) #define RE_SKIP_VLR_RENDER_CHECK (1 << 2) #define RE_SKIP_VLR_NON_SOLID_MATERIAL (1 << 3) +#define RE_SKIP_VLR_BAKE_CHECK (1 << 4) /* TODO use: FLT_MAX? */ #define RE_RAYTRACE_MAXDIST 1e33 diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index f7dfb4d889e..6cab4a7ce03 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -166,9 +166,6 @@ typedef struct ShadeInput int depth; /* 1 or larger on raytrace shading */ int volume_depth; /* number of intersections through volumes */ - /* stored copy of original face normal (facenor) - * before flipping. Used in Front/back output on geometry node */ - float orignor[3]; /* for strand shading, normal at the surface */ float surfnor[3], surfdist; @@ -202,7 +199,7 @@ struct Image; struct Object; void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr); -int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob, short *do_update); +int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob, short *do_update, float *progress); struct Image *RE_bake_shade_get_image(void); #endif /* RE_SHADER_EXT_H */ diff --git a/source/blender/render/intern/include/rayobject.h b/source/blender/render/intern/include/rayobject.h index daab170965d..a21c7ef4f50 100644 --- a/source/blender/render/intern/include/rayobject.h +++ b/source/blender/render/intern/include/rayobject.h @@ -64,7 +64,7 @@ extern "C" { This leads to 4 possible types of RayObject: addr&3 - type of object - 0 Self (reserved for each structure) + 0 Self (reserved for each structure) 1 RayFace (tri/quad primitive) 2 RayObject (generic with API callbacks) 3 VlakPrimitive diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index ef85f965453..331474a85e3 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -146,7 +146,9 @@ struct Render int partx, party; /* values for viewing */ - float lens, ycor, viewfac; + float lens; + float ycor; /* (scene->xasp / scene->yasp), multiplied with 'winy' */ + float panophi, panosi, panoco, panodxp, panodxv; /* Matrices */ @@ -172,6 +174,7 @@ struct Render Scene *scene; RenderData r; World wrld; + unsigned int lay; ListBase parts; @@ -186,7 +189,8 @@ struct Render ListBase strandsurface; /* use this instead of R.r.cfra */ - float cfra; + float cfra; + float mblur_offs, field_offs; /* render database */ int totvlak, totvert, tothalo, totstrand, totlamp; @@ -231,8 +235,8 @@ struct Render void (*stats_draw)(void *handle, RenderStats *ri); void *sdh; - void (*timecursor)(void *handle, int i); - void *tch; + void (*progress)(void *handle, float i); + void *prh; int (*test_break)(void *handle); void *tbh; @@ -373,18 +377,18 @@ typedef struct VlakRen { typedef struct HaloRen { - short miny, maxy; - float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3]; + short miny, maxy; + float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3]; float hard, b, g, r; - int zs, zd; - int zBufDist; /* depth in the z-buffer coordinate system */ - char starpoints, type, add, tex; - char linec, ringc, seed; + int zs, zd; + int zBufDist; /* depth in the z-buffer coordinate system */ + char starpoints, type, add, tex; + char linec, ringc, seed; short flarec; /* used to be a char. why ?*/ - float hasize; - int pixels; - unsigned int lay; - struct Material *mat; + float hasize; + int pixels; + unsigned int lay; + struct Material *mat; } HaloRen; /* ------------------------------------------------------------------------- */ @@ -561,13 +565,6 @@ typedef struct LampRen { /* passes & node shader support: all shadow info for a pixel */ LampShadowSample *shadsamp; - - /* yafray: photonlight params */ - int YF_numphotons, YF_numsearch; - short YF_phdepth, YF_useqmc, YF_bufsize; - float YF_causticblur, YF_ltradius; - float YF_glowint, YF_glowofs; - short YF_glowtype; /* ray optim */ struct RayObject *last_hit[BLENDER_MAX_THREADS]; diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h index 9ed12a8fe60..2a0086b436c 100644 --- a/source/blender/render/intern/include/renderdatabase.h +++ b/source/blender/render/intern/include/renderdatabase.h @@ -137,7 +137,7 @@ void RE_set_customdata_names(struct ObjectRen *obr, struct CustomData *data); /* convertblender.c */ void init_render_world(Render *re); -void RE_Database_FromScene_Vectors(Render *re, struct Scene *sce); +void RE_Database_FromScene_Vectors(Render *re, struct Scene *sce, unsigned int lay); #endif /* RENDERDATABASE_H */ diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h index 247400487ac..8250c5631dd 100644 --- a/source/blender/render/intern/include/shading.h +++ b/source/blender/render/intern/include/shading.h @@ -1,5 +1,5 @@ /** -* $Id: +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h index 7f1defc2dd4..111d1df2694 100644 --- a/source/blender/render/intern/include/sunsky.h +++ b/source/blender/render/intern/include/sunsky.h @@ -33,43 +33,43 @@ typedef struct SunSky { - short effect_type, skyblendtype, sky_colorspace; - float turbidity; - float theta, phi; + short effect_type, skyblendtype, sky_colorspace; + float turbidity; + float theta, phi; - float toSun[3]; + float toSun[3]; - /*float sunSpectralRaddata[SPECTRUM_MAX_COMPONENTS];*/ - float sunSolidAngle; + /*float sunSpectralRaddata[SPECTRUM_MAX_COMPONENTS];*/ + float sunSolidAngle; - float zenith_Y, zenith_x, zenith_y; + float zenith_Y, zenith_x, zenith_y; - float perez_Y[5], perez_x[5], perez_y[5]; + float perez_Y[5], perez_x[5], perez_y[5]; - /* suggested by glome in - * http://projects.blender.org/tracker/?func=detail&atid=127&aid=8063&group_id=9*/ - float horizon_brightness; - float spread; - float sun_brightness; - float sun_size; - float backscattered_light; - float skyblendfac; + /* suggested by glome in + * http://projects.blender.org/tracker/?func=detail&atid=127&aid=8063&group_id=9*/ + float horizon_brightness; + float spread; + float sun_brightness; + float sun_size; + float backscattered_light; + float skyblendfac; float sky_exposure; - float atm_HGg; + float atm_HGg; - float atm_SunIntensity; - float atm_InscatteringMultiplier; - float atm_ExtinctionMultiplier; - float atm_BetaRayMultiplier; - float atm_BetaMieMultiplier; - float atm_DistanceMultiplier; + float atm_SunIntensity; + float atm_InscatteringMultiplier; + float atm_ExtinctionMultiplier; + float atm_BetaRayMultiplier; + float atm_BetaMieMultiplier; + float atm_DistanceMultiplier; - float atm_BetaRay[3]; - float atm_BetaDashRay[3]; - float atm_BetaMie[3]; - float atm_BetaDashMie[3]; - float atm_BetaRM[3]; + float atm_BetaRay[3]; + float atm_BetaDashRay[3]; + float atm_BetaMie[3]; + float atm_BetaDashMie[3]; + float atm_BetaRM[3]; }SunSky; /** diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h index 3e6fc8c5677..436b365b352 100644 --- a/source/blender/render/intern/include/texture.h +++ b/source/blender/render/intern/include/texture.h @@ -40,7 +40,13 @@ if(texres->tr<0.0) texres->tr= 0.0; \ texres->tg= tex->gfac*((texres->tg-0.5)*tex->contrast+tex->bright-0.5); \ if(texres->tg<0.0) texres->tg= 0.0; \ texres->tb= tex->bfac*((texres->tb-0.5)*tex->contrast+tex->bright-0.5); \ -if(texres->tb<0.0) texres->tb= 0.0; +if(texres->tb<0.0) texres->tb= 0.0; \ +if(tex->saturation != 1.0f) { \ + float _hsv[3]; \ + rgb_to_hsv(texres->tr, texres->tg, texres->tb, _hsv, _hsv+1, _hsv+2); \ + _hsv[1] *= tex->saturation; \ + hsv_to_rgb(_hsv[0], _hsv[1], _hsv[2], &texres->tr, &texres->tg, &texres->tb); \ +} \ struct HaloRen; diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h index fb6760c28d3..dcaaca7d718 100644 --- a/source/blender/render/intern/include/zbuf.h +++ b/source/blender/render/intern/include/zbuf.h @@ -59,22 +59,22 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo int zbuffer_strands_abuf(struct Render *re, struct RenderPart *pa, struct APixstrand *apixbuf, struct ListBase *apsmbase, unsigned int lay, int negzmask, float winmat[][4], int winx, int winy, int sample, float (*jit)[2], float clipcrop, int shadow, struct StrandShadeCache *cache); typedef struct APixstr { - unsigned short mask[4]; /* jitter mask */ - int z[4]; /* distance */ - int p[4]; /* index */ + unsigned short mask[4]; /* jitter mask */ + int z[4]; /* distance */ + int p[4]; /* index */ int obi[4]; /* object instance */ short shadfac[4]; /* optimize storage for irregular shadow */ - struct APixstr *next; + struct APixstr *next; } APixstr; typedef struct APixstrand { - unsigned short mask[4]; /* jitter mask */ - int z[4]; /* distance */ - int p[4]; /* index */ + unsigned short mask[4]; /* jitter mask */ + int z[4]; /* distance */ + int p[4]; /* index */ int obi[4]; /* object instance */ int seg[4]; /* for strands, segment number */ float u[4], v[4]; /* for strands, u,v coordinate in segment */ - struct APixstrand *next; + struct APixstrand *next; } APixstrand; typedef struct APixstrMain diff --git a/source/blender/render/intern/raytrace/Makefile b/source/blender/render/intern/raytrace/Makefile index 6e40c544c6f..c136f945ca5 100644 --- a/source/blender/render/intern/raytrace/Makefile +++ b/source/blender/render/intern/raytrace/Makefile @@ -15,7 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. # All rights reserved. diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp index a85a3255a7b..84ec56e131a 100644 --- a/source/blender/render/intern/raytrace/rayobject.cpp +++ b/source/blender/render/intern/raytrace/rayobject.cpp @@ -165,6 +165,11 @@ static inline int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, V return 0; } +static inline int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr) +{ + return (obi->obr->ob != is->userdata); +} + static inline int rayface_check_cullface(RayFace *face, Isect *is) { float nor[3]; @@ -189,17 +194,24 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is) if(is->orig.ob == face->ob && is->orig.face == face->face) return 0; - + /* check if we should intersect this face */ if(is->skip & RE_SKIP_VLR_RENDER_CHECK) { if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0) return 0; } - if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL) + else if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL) { + if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0) + return 0; if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0) return 0; } + else if(is->skip & RE_SKIP_VLR_BAKE_CHECK) { + if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0) + return 0; + } + if(is->skip & RE_SKIP_CULLFACE) { if(rayface_check_cullface(face, is) == 0) @@ -321,7 +333,7 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is) RE_RC_COUNT(is->raycounter->faces.hit); - is->isect= ok; // wich half of the quad + is->isect= ok; // which half of the quad is->labda= labda; is->u= u; is->v= v; @@ -450,6 +462,7 @@ int RE_rayobject_intersect(RayObject *r, Isect *i) return r->api->raycast( r, i ); } else assert(0); + return 0; /* wont reach this, quiet compilers */ } void RE_rayobject_add(RayObject *r, RayObject *o) @@ -484,12 +497,22 @@ void RE_rayobject_merge_bb(RayObject *r, float *min, float *max) else if(RE_rayobject_isVlakPrimitive(r)) { VlakPrimitive *face = (VlakPrimitive*) RE_rayobject_align(r); - VlakRen *vlr = face->face; + RayFace nface; + RE_rayface_from_vlak(&nface, face->ob, face->face); - DO_MINMAX( vlr->v1->co, min, max ); - DO_MINMAX( vlr->v2->co, min, max ); - DO_MINMAX( vlr->v3->co, min, max ); - if(vlr->v4) DO_MINMAX( vlr->v4->co, min, max ); + if(face->ob->transform_primitives) + { + mul_m4_v3(face->ob->mat, nface.v1); + mul_m4_v3(face->ob->mat, nface.v2); + mul_m4_v3(face->ob->mat, nface.v3); + if(RE_rayface_isQuad(&nface)) + mul_m4_v3(face->ob->mat, nface.v4); + } + + DO_MINMAX( nface.v1, min, max ); + DO_MINMAX( nface.v2, min, max ); + DO_MINMAX( nface.v3, min, max ); + if(RE_rayface_isQuad(&nface)) DO_MINMAX( nface.v4, min, max ); } else if(RE_rayobject_isRayAPI(r)) { diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp index cdc3be4c521..afffdd44f1f 100644 --- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp +++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp @@ -52,10 +52,10 @@ void bvh_done(QBVHTree *obj) rtbuild_done(obj->builder, &obj->rayobj.control); //TODO find a away to exactly calculate the needed memory - MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "qbvh arena"); BLI_memarena_use_malloc(arena1); - MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "qbvh arena 2"); BLI_memarena_use_malloc(arena2); BLI_memarena_use_align(arena2, 16); diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp index dcefb2072b8..1c3cdd5919f 100644 --- a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp +++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp @@ -386,7 +386,9 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds) // right_cost -= obj[i]->cost; if(right_cost < 0) right_cost = 0; } - assert(baxis >= 0 && baxis < 3); + //assert(baxis >= 0 && baxis < 3); + if (!(baxis >= 0 && baxis < 3)) + baxis = 0; } @@ -456,8 +458,10 @@ float bb_area(float *min, float *max) sub[2] = max[2]-min[2]; a = (sub[0]*sub[1] + sub[0]*sub[2] + sub[1]*sub[2])*2; - assert(a >= 0.0); - return a; + /* used to have an assert() here on negative results + * however, in this case its likely some overflow or ffast math error. + * so just return 0.0f instead. */ + return a < 0.0f ? 0.0f : a; } int bb_largest_axis(float *min, float *max) diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp index 67af596e301..389512ce469 100644 --- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp +++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp @@ -63,10 +63,10 @@ void bvh_done(SVBVHTree *obj) rtbuild_done(obj->builder, &obj->rayobj.control); //TODO find a away to exactly calculate the needed memory - MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "svbvh arena"); BLI_memarena_use_malloc(arena1); - MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "svbvh arena2"); BLI_memarena_use_malloc(arena2); BLI_memarena_use_align(arena2, 16); diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp index 0190b971d84..de1e6d349be 100644 --- a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp +++ b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp @@ -76,7 +76,7 @@ void bvh_done(VBVHTree *obj) rtbuild_done(obj->builder, &obj->rayobj.control); //TODO find a away to exactly calculate the needed memory - MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vbvh arena"); BLI_memarena_use_malloc(arena1); //Build and optimize the tree @@ -101,7 +101,7 @@ void bvh_done(VBVHTree *obj) { /* TODO - MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vbvh arena2"); BLI_memarena_use_malloc(arena2); //Finds the optimal packing of this tree using a given cost model diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile index c313549f9b9..5aaa66e7712 100644 --- a/source/blender/render/intern/source/Makefile +++ b/source/blender/render/intern/source/Makefile @@ -15,7 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. # All rights reserved. diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index bc300f6d609..a87518bd668 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -316,7 +316,7 @@ NOTE THAT U/V COORDINATES ARE SOMETIMES SWAPPED !! u | | F1 | F2 | | | | | ()----p1----p2----() - v -> + v -> */ /* ------------------------------------------------------------------------- */ @@ -512,7 +512,7 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d int a; if(do_nmap_tangent) { - arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "nmap tangent arena"); BLI_memarena_use_calloc(arena); vtangents= MEM_callocN(sizeof(VertexTangent*)*obr->totvert, "VertexTangent"); @@ -851,32 +851,30 @@ static void autosmooth(Render *re, ObjectRen *obr, float mat[][4], int degr) static float *get_object_orco(Render *re, Object *ob) { float *orco; - + if (!re->orco_hash) - re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - + re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "get_object_orco gh"); + orco = BLI_ghash_lookup(re->orco_hash, ob); - + if (!orco) { if (ELEM(ob->type, OB_CURVE, OB_FONT)) { orco = make_orco_curve(re->scene, ob); } else if (ob->type==OB_SURF) { orco = make_orco_surf(ob); - } else if (ob->type==OB_MBALL) { - orco = make_orco_mball(ob); } - + if (orco) BLI_ghash_insert(re->orco_hash, ob, orco); } - + return orco; } static void set_object_orco(Render *re, void *ob, float *orco) { if (!re->orco_hash) - re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "set_object_orco gh"); BLI_ghash_insert(re->orco_hash, ob, orco); } @@ -1006,8 +1004,8 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par /* use actual Blender units for strand width and fall back to minimum width */ if(ma->mode & MA_STR_B_UNITS){ - crosslen= len_v3(cross); - w= 2.0f*crosslen*ma->strand_min/w; + crosslen= len_v3(cross); + w= 2.0f*crosslen*ma->strand_min/w; if(width < w) width= w; @@ -1041,7 +1039,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par vlr->v4= RE_findOrAddVert(obr, obr->totvert++); VECCOPY(vlr->v1->co, vec); - add_v3_v3v3(vlr->v1->co, vlr->v1->co, cross); + add_v3_v3(vlr->v1->co, cross); VECCOPY(vlr->v1->n, nor); vlr->v1->orco= sd->orco; vlr->v1->accum= -1.0f; // accum abuse for strand texco @@ -1053,7 +1051,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par vlr->v2->accum= vlr->v1->accum; VECCOPY(vlr->v4->co, vec1); - add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross); + add_v3_v3(vlr->v4->co, cross); VECCOPY(vlr->v4->n, nor); vlr->v4->orco= sd->orco; vlr->v4->accum= 1.0f; // accum abuse for strand texco @@ -1115,7 +1113,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par v2= RE_findOrAddVert(obr, obr->totvert++); VECCOPY(v1->co, vec); - add_v3_v3v3(v1->co, v1->co, cross); + add_v3_v3(v1->co, cross); VECCOPY(v1->n, nor); v1->orco= sd->orco; v1->accum= -1.0f; // accum abuse for strand texco @@ -1177,7 +1175,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par } VECCOPY(vlr->v4->co, vec); - add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross); + add_v3_v3(vlr->v4->co, cross); VECCOPY(vlr->v4->n, nor); vlr->v4->orco= sd->orco; vlr->v4->accum= -1.0f + 2.0f*sd->time; // accum abuse for strand texco @@ -1520,7 +1518,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem RNG *rng= 0; float loc[3],loc1[3],loc0[3],mat[4][4],nmat[3][3],co[3],nor[3],time; float strandlen=0.0f, curlen=0.0f; - float hasize, pa_size, r_tilt, r_length, cfra=bsystem_time(re->scene, ob, (float)re->scene->r.cfra, 0.0); + float hasize, pa_size, r_tilt, r_length, cfra= BKE_curframe(re->scene); float pa_time, pa_birthtime, pa_dietime; float random, simplify[2]; int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0; @@ -1532,8 +1530,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem /* 1. check that everything is ok & updated */ if(psys==NULL) return 0; - - totchild=psys->totchild; part=psys->part; pars=psys->particles; @@ -1554,6 +1550,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if(part->phystype==PART_PHYS_KEYED) psys_count_keyed_targets(&sim); + psys_update_children(&sim); + totchild=psys->totchild; if(G.rendering == 0) { /* preview render */ totchild = (int)((float)totchild * (float)part->disp / 100.0f); @@ -1639,7 +1637,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if(part->flag & PART_GLOB_TIME) #endif // XXX old animation system - cfra = bsystem_time(re->scene, 0, (float)re->scene->r.cfra, 0.0); + cfra = BKE_curframe(re->scene); ///* 2.4 setup reactors */ // if(part->type == PART_REACTOR){ @@ -1657,6 +1655,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem transpose_m3(nmat); /* 2.6 setup strand rendering */ + if(part->ren_as == PART_DRAW_PATH && psys->pathcache==NULL) + psys_update_path_cache(&sim, cfra); + if(part->ren_as == PART_DRAW_PATH && psys->pathcache){ path_nbr=(int)pow(2.0,(double) part->ren_step); @@ -2366,6 +2367,7 @@ static void init_render_mball(Render *re, ObjectRen *obr) Material *ma; float *data, *nors, *orco, mat[4][4], imat[3][3], xn, yn, zn; int a, need_orco, vlakindex, *index; + ListBase dispbase= {NULL, NULL}; if (ob!=find_basis_mball(re->scene, ob)) return; @@ -2380,14 +2382,22 @@ static void init_render_mball(Render *re, ObjectRen *obr) if(ma->texco & TEXCO_ORCO) { need_orco= 1; } - - makeDispListMBall(re->scene, ob); - dl= ob->disp.first; + + makeDispListMBall_forRender(re->scene, ob, &dispbase); + dl= dispbase.first; if(dl==0) return; data= dl->verts; nors= dl->nors; - orco= get_object_orco(re, ob); + if(need_orco) { + orco= get_object_orco(re, ob); + + if (!orco) { + /* orco hasn't been found in cache - create new one and add to cache */ + orco= make_orco_mball(ob, &dispbase); + set_object_orco(re, ob, orco); + } + } for(a=0; anr; a++, data+=3, nors+=3, orco+=3) { @@ -2444,10 +2454,7 @@ static void init_render_mball(Render *re, ObjectRen *obr) } /* enforce display lists remade */ - freedisplist(&ob->disp); - - /* this enforces remake for real, orco displist is small (in scale) */ - ob->recalc |= OB_RECALC_DATA; + freedisplist(&dispbase); } /* ------------------------------------------------------------------------- */ @@ -2544,10 +2551,10 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, vlr->flag |= R_NOPUNOFLIP; } - add_v3_v3v3(v1->n, v1->n, n1); - add_v3_v3v3(v2->n, v2->n, n1); - add_v3_v3v3(v3->n, v3->n, n1); - add_v3_v3v3(v4->n, v4->n, n1); + add_v3_v3(v1->n, n1); + add_v3_v3(v2->n, n1); + add_v3_v3(v3->n, n1); + add_v3_v3(v4->n, n1); p1++; p2++; p3++; p4++; } @@ -2561,10 +2568,10 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, /* optimize! :*/ vlr= RE_findOrAddVlak(obr, UVTOINDEX(sizeu - 1, v)); vlr1= RE_findOrAddVlak(obr, UVTOINDEX(0, v)); - add_v3_v3v3(vlr1->v1->n, vlr1->v1->n, vlr->n); - add_v3_v3v3(vlr1->v2->n, vlr1->v2->n, vlr->n); - add_v3_v3v3(vlr->v3->n, vlr->v3->n, vlr1->n); - add_v3_v3v3(vlr->v4->n, vlr->v4->n, vlr1->n); + add_v3_v3(vlr1->v1->n, vlr->n); + add_v3_v3(vlr1->v2->n, vlr->n); + add_v3_v3(vlr->v3->n, vlr1->n); + add_v3_v3(vlr->v4->n, vlr1->n); } } if (dl->flag & DL_CYCL_U) { @@ -2574,10 +2581,10 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, /* optimize! :*/ vlr= RE_findOrAddVlak(obr, UVTOINDEX(u, 0)); vlr1= RE_findOrAddVlak(obr, UVTOINDEX(u, sizev-1)); - add_v3_v3v3(vlr1->v2->n, vlr1->v2->n, vlr->n); - add_v3_v3v3(vlr1->v3->n, vlr1->v3->n, vlr->n); - add_v3_v3v3(vlr->v1->n, vlr->v1->n, vlr1->n); - add_v3_v3v3(vlr->v4->n, vlr->v4->n, vlr1->n); + add_v3_v3(vlr1->v2->n, vlr->n); + add_v3_v3(vlr1->v3->n, vlr->n); + add_v3_v3(vlr->v1->n, vlr1->n); + add_v3_v3(vlr->v4->n, vlr1->n); } } /* last vertex is an extra case: @@ -2603,9 +2610,9 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, vlr1= RE_findOrAddVlak(obr, UVTOINDEX(0,0)); /* (0,0) */ add_v3_v3v3(n1, vlr->n, vlr1->n); vlr2= RE_findOrAddVlak(obr, UVTOINDEX(0, sizev-1)); /* (0,n) */ - add_v3_v3v3(n1, n1, vlr2->n); + add_v3_v3(n1, vlr2->n); vlr3= RE_findOrAddVlak(obr, UVTOINDEX(sizeu-1, 0)); /* (m,0) */ - add_v3_v3v3(n1, n1, vlr3->n); + add_v3_v3(n1, vlr3->n); VECCOPY(vlr->v3->n, n1); VECCOPY(vlr1->v1->n, n1); VECCOPY(vlr2->v2->n, n1); @@ -2620,16 +2627,127 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, return orcoret; } -static void init_render_surf(Render *re, ObjectRen *obr) +static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr, + int timeoffset, float *orco, float mat[4][4]) +{ + Object *ob= obr->ob; + int a, a1, end, totvert, vertofs; + VertRen *ver; + VlakRen *vlr; + Curve *cu= NULL; + MVert *mvert = NULL; + MFace *mface; + Material *ma; + + mvert= dm->getVertArray(dm); + totvert= dm->getNumVerts(dm); + + if ELEM(ob->type, OB_FONT, OB_CURVE) { + cu= ob->data; + } + + for(a=0; atotvert++); + VECCOPY(ver->co, mvert->co); + mul_m4_v3(mat, ver->co); + + if(orco) { + ver->orco= orco; + orco+=3; + } + } + + if(!timeoffset) { + /* store customdata names, because DerivedMesh is freed */ + RE_set_customdata_names(obr, &dm->faceData); + + /* still to do for keys: the correct local texture coordinate */ + + /* faces in order of color blocks */ + vertofs= obr->totvert - totvert; + for(a1=0; (a1totcol || (a1==0 && ob->totcol==0)); a1++) { + + ma= give_render_material(re, ob, a1+1); + end= dm->getNumTessFaces(dm); + mface= dm->getTessFaceArray(dm); + + for(a=0; amat_nr==a1 ) { + float len; + + v1= mface->v1; + v2= mface->v2; + v3= mface->v3; + v4= mface->v4; + flag= mface->flag & ME_SMOOTH; + + vlr= RE_findOrAddVlak(obr, obr->totvlak++); + vlr->v1= RE_findOrAddVert(obr, vertofs+v1); + vlr->v2= RE_findOrAddVert(obr, vertofs+v2); + vlr->v3= RE_findOrAddVert(obr, vertofs+v3); + if(v4) vlr->v4= RE_findOrAddVert(obr, vertofs+v4); + else vlr->v4= 0; + + /* render normals are inverted in render */ + if(vlr->v4) + len= normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); + else + len= normal_tri_v3( vlr->n,vlr->v3->co, vlr->v2->co, vlr->v1->co); + + vlr->mat= ma; + vlr->flag= flag; + if(cu &&(cu->flag & ME_NOPUNOFLIP)) { + vlr->flag |= R_NOPUNOFLIP; + } + vlr->ec= 0; /* mesh edges rendered separately */ + + if(len==0) obr->totvlak--; + else { + CustomDataLayer *layer; + MTFace *mtface, *mtf; + MCol *mcol, *mc; + int index, mtfn= 0, mcn= 0; + char *name; + + for(index=0; indexfaceData.totlayer; index++) { + layer= &dm->faceData.layers[index]; + name= layer->name; + + if(layer->type == CD_MTFACE && mtfn < MAX_MTFACE) { + mtf= RE_vlakren_get_tface(obr, vlr, mtfn++, &name, 1); + mtface= (MTFace*)layer->data; + *mtf= mtface[a]; + } + else if(layer->type == CD_MCOL && mcn < MAX_MCOL) { + mc= RE_vlakren_get_mcol(obr, vlr, mcn++, &name, 1); + mcol= (MCol*)layer->data; + memcpy(mc, &mcol[a*4], sizeof(MCol)*4); + } + } + } + } + } + } + + /* Normals */ + calc_vertexnormals(re, obr, 0, 0); + } + +} + +static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Nurb *nu=0; Curve *cu; - ListBase displist; + ListBase displist= {NULL, NULL}; DispList *dl; Material **matar; float *orco=NULL, *orcobase=NULL, mat[4][4]; int a, totmat, need_orco=0; + DerivedMesh *dm= NULL; cu= ob->data; nu= cu->nurb.first; @@ -2651,19 +2769,33 @@ static void init_render_surf(Render *re, ObjectRen *obr) if(ob->parent && (ob->parent->type==OB_LATTICE)) need_orco= 1; - if(need_orco) orcobase= orco= get_object_orco(re, ob); + makeDispListSurf(re->scene, ob, &displist, &dm, 1, 0); - displist.first= displist.last= 0; - makeDispListSurf(re->scene, ob, &displist, 1, 0); + if (dm) { + if(need_orco) { + orco= makeOrcoDispList(re->scene, ob, dm, 1); + if(orco) { + set_object_orco(re, ob, orco); + } + } - /* walk along displaylist and create rendervertices/-faces */ - for(dl=displist.first; dl; dl=dl->next) { - /* watch out: u ^= y, v ^= x !! */ - if(dl->type==DL_SURF) - orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat); + init_render_dm(dm, re, obr, timeoffset, orco, mat); + dm->release(dm); + } else { + if(need_orco) { + orcobase= orco= get_object_orco(re, ob); + } + + /* walk along displaylist and create rendervertices/-faces */ + for(dl=displist.first; dl; dl=dl->next) { + /* watch out: u ^= y, v ^= x !! */ + if(dl->type==DL_SURF) + orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat); + } } freedisplist(&displist); + MEM_freeN(matar); } @@ -2674,7 +2806,8 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) VertRen *ver; VlakRen *vlr; DispList *dl; - ListBase olddl={NULL, NULL}; + DerivedMesh *dm = NULL; + ListBase disp={NULL, NULL}; Material **matar; float len, *data, *fp, *orco=NULL, *orcobase= NULL; float n[3], mat[4][4]; @@ -2685,16 +2818,9 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if(ob->type==OB_FONT && cu->str==NULL) return; else if(ob->type==OB_CURVE && cu->nurb.first==NULL) return; - /* no modifier call here, is in makedisp */ - - if(cu->resolu_ren) - SWAP(ListBase, olddl, cu->disp); - - /* test displist */ - if(cu->disp.first==NULL) - makeDispListCurveTypes(re->scene, ob, 0); - dl= cu->disp.first; - if(cu->disp.first==NULL) return; + makeDispListCurveTypes_forRender(re->scene, ob, &disp, &dm, 0); + dl= disp.first; + if(dl==NULL) return; mul_m4_m4m4(mat, ob->obmat, re->viewmat); invert_m4_m4(ob->imat, mat); @@ -2710,89 +2836,48 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) need_orco= 1; } - if(need_orco) orcobase=orco= get_object_orco(re, ob); - - dl= cu->disp.first; - while(dl) { - if(dl->type==DL_INDEX3) { - int *index; - - startvert= obr->totvert; - data= dl->verts; - - n[0]= ob->imat[0][2]; - n[1]= ob->imat[1][2]; - n[2]= ob->imat[2][2]; - normalize_v3(n); - - for(a=0; anr; a++, data+=3) { - ver= RE_findOrAddVert(obr, obr->totvert++); - VECCOPY(ver->co, data); - - /* flip normal if face is backfacing, also used in face loop below */ - if(ver->co[2] < 0.0) { - VECCOPY(ver->n, n); - ver->flag = 1; - } - else { - ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2]; - ver->flag = 0; - } - - mul_m4_v3(mat, ver->co); - - if (orco) { - ver->orco = orco; - orco += 3; - } - } - - if(timeoffset==0) { - startvlak= obr->totvlak; - index= dl->index; - for(a=0; aparts; a++, index+=3) { - - vlr= RE_findOrAddVlak(obr, obr->totvlak++); - vlr->v1= RE_findOrAddVert(obr, startvert+index[0]); - vlr->v2= RE_findOrAddVert(obr, startvert+index[1]); - vlr->v3= RE_findOrAddVert(obr, startvert+index[2]); - vlr->v4= NULL; - - if(vlr->v1->flag) { - VECCOPY(vlr->n, n); - } - else { - vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2]; - } - - vlr->mat= matar[ dl->col ]; - vlr->flag= 0; - if( (cu->flag & CU_NOPUNOFLIP) ) { - vlr->flag |= R_NOPUNOFLIP; - } - vlr->ec= 0; - } + if (dm) { + if(need_orco) { + orco= makeOrcoDispList(re->scene, ob, dm, 1); + if(orco) { + set_object_orco(re, ob, orco); } } - else if (dl->type==DL_SURF) { - - /* cyclic U means an extruded full circular curve, we skip bevel splitting then */ - if (dl->flag & DL_CYCL_U) { - orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat); - } - else { - int p1,p2,p3,p4; - fp= dl->verts; + init_render_dm(dm, re, obr, timeoffset, orco, mat); + dm->release(dm); + } else { + if(need_orco) { + orcobase=orco= get_object_orco(re, ob); + } + + while(dl) { + if(dl->type==DL_INDEX3) { + int *index; + startvert= obr->totvert; - nr= dl->nr*dl->parts; + data= dl->verts; - while(nr--) { + n[0]= ob->imat[0][2]; + n[1]= ob->imat[1][2]; + n[2]= ob->imat[2][2]; + normalize_v3(n); + + for(a=0; anr; a++, data+=3) { ver= RE_findOrAddVert(obr, obr->totvert++); - - VECCOPY(ver->co, fp); + VECCOPY(ver->co, data); + + /* flip normal if face is backfacing, also used in face loop below */ + if(ver->co[2] < 0.0) { + VECCOPY(ver->n, n); + ver->flag = 1; + } + else { + ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2]; + ver->flag = 0; + } + mul_m4_v3(mat, ver->co); - fp+= 3; if (orco) { ver->orco = orco; @@ -2800,92 +2885,142 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) } } - if(dl->bevelSplitFlag || timeoffset==0) { + if(timeoffset==0) { startvlak= obr->totvlak; + index= dl->index; + for(a=0; aparts; a++, index+=3) { - for(a=0; aparts; a++) { + vlr= RE_findOrAddVlak(obr, obr->totvlak++); + vlr->v1= RE_findOrAddVert(obr, startvert+index[0]); + vlr->v2= RE_findOrAddVert(obr, startvert+index[1]); + vlr->v3= RE_findOrAddVert(obr, startvert+index[2]); + vlr->v4= NULL; - frontside= (a >= dl->nr/2); - - if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0) - break; - - p1+= startvert; - p2+= startvert; - p3+= startvert; - p4+= startvert; - - for(; bnr; b++) { - vlr= RE_findOrAddVlak(obr, obr->totvlak++); - vlr->v1= RE_findOrAddVert(obr, p2); - vlr->v2= RE_findOrAddVert(obr, p1); - vlr->v3= RE_findOrAddVert(obr, p3); - vlr->v4= RE_findOrAddVert(obr, p4); - vlr->ec= ME_V2V3+ME_V3V4; - if(a==0) vlr->ec+= ME_V1V2; - - vlr->flag= dl->rt; - - /* this is not really scientific: the vertices - * 2, 3 en 4 seem to give better vertexnormals than 1 2 3: - * front and backside treated different!! - */ - - if(frontside) - normal_tri_v3( vlr->n,vlr->v2->co, vlr->v3->co, vlr->v4->co); - else - normal_tri_v3( vlr->n,vlr->v1->co, vlr->v2->co, vlr->v3->co); - - vlr->mat= matar[ dl->col ]; - - p4= p3; - p3++; - p2= p1; - p1++; + if(vlr->v1->flag) { + VECCOPY(vlr->n, n); + } + else { + vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2]; } - } - if (dl->bevelSplitFlag) { - for(a=0; aparts-1+!!(dl->flag&DL_CYCL_V); a++) - if(dl->bevelSplitFlag[a>>5]&(1<<(a&0x1F))) - split_v_renderfaces(obr, startvlak, startvert, dl->parts, dl->nr, a, dl->flag&DL_CYCL_V, dl->flag&DL_CYCL_U); - } - - /* vertex normals */ - for(a= startvlak; atotvlak; a++) { - vlr= RE_findOrAddVlak(obr, a); - - add_v3_v3v3(vlr->v1->n, vlr->v1->n, vlr->n); - add_v3_v3v3(vlr->v3->n, vlr->v3->n, vlr->n); - add_v3_v3v3(vlr->v2->n, vlr->v2->n, vlr->n); - add_v3_v3v3(vlr->v4->n, vlr->v4->n, vlr->n); - } - for(a=startvert; atotvert; a++) { - ver= RE_findOrAddVert(obr, a); - len= normalize_v3(ver->n); - if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */ - else ver->flag= 0; - } - for(a= startvlak; atotvlak; a++) { - vlr= RE_findOrAddVlak(obr, a); - if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n); - if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n); - if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n); - if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n); + vlr->mat= matar[ dl->col ]; + vlr->flag= 0; + if( (cu->flag & CU_NOPUNOFLIP) ) { + vlr->flag |= R_NOPUNOFLIP; + } + vlr->ec= 0; } } } - } + else if (dl->type==DL_SURF) { - dl= dl->next; - } - - /* not very elegant... but we want original displist in UI */ - if(cu->resolu_ren) { - freedisplist(&cu->disp); - SWAP(ListBase, olddl, cu->disp); + /* cyclic U means an extruded full circular curve, we skip bevel splitting then */ + if (dl->flag & DL_CYCL_U) { + orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat); + } + else { + int p1,p2,p3,p4; + + fp= dl->verts; + startvert= obr->totvert; + nr= dl->nr*dl->parts; + + while(nr--) { + ver= RE_findOrAddVert(obr, obr->totvert++); + + VECCOPY(ver->co, fp); + mul_m4_v3(mat, ver->co); + fp+= 3; + + if (orco) { + ver->orco = orco; + orco += 3; + } + } + + if(dl->bevelSplitFlag || timeoffset==0) { + startvlak= obr->totvlak; + + for(a=0; aparts; a++) { + + frontside= (a >= dl->nr/2); + + if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0) + break; + + p1+= startvert; + p2+= startvert; + p3+= startvert; + p4+= startvert; + + for(; bnr; b++) { + vlr= RE_findOrAddVlak(obr, obr->totvlak++); + vlr->v1= RE_findOrAddVert(obr, p2); + vlr->v2= RE_findOrAddVert(obr, p1); + vlr->v3= RE_findOrAddVert(obr, p3); + vlr->v4= RE_findOrAddVert(obr, p4); + vlr->ec= ME_V2V3+ME_V3V4; + if(a==0) vlr->ec+= ME_V1V2; + + vlr->flag= dl->rt; + + /* this is not really scientific: the vertices + * 2, 3 en 4 seem to give better vertexnormals than 1 2 3: + * front and backside treated different!! + */ + + if(frontside) + normal_tri_v3( vlr->n,vlr->v2->co, vlr->v3->co, vlr->v4->co); + else + normal_tri_v3( vlr->n,vlr->v1->co, vlr->v2->co, vlr->v3->co); + + vlr->mat= matar[ dl->col ]; + + p4= p3; + p3++; + p2= p1; + p1++; + } + } + + if (dl->bevelSplitFlag) { + for(a=0; aparts-1+!!(dl->flag&DL_CYCL_V); a++) + if(dl->bevelSplitFlag[a>>5]&(1<<(a&0x1F))) + split_v_renderfaces(obr, startvlak, startvert, dl->parts, dl->nr, a, dl->flag&DL_CYCL_V, dl->flag&DL_CYCL_U); + } + + /* vertex normals */ + for(a= startvlak; atotvlak; a++) { + vlr= RE_findOrAddVlak(obr, a); + + add_v3_v3(vlr->v1->n, vlr->n); + add_v3_v3(vlr->v3->n, vlr->n); + add_v3_v3(vlr->v2->n, vlr->n); + add_v3_v3(vlr->v4->n, vlr->n); + } + for(a=startvert; atotvert; a++) { + ver= RE_findOrAddVert(obr, a); + len= normalize_v3(ver->n); + if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */ + else ver->flag= 0; + } + for(a= startvlak; atotvlak; a++) { + vlr= RE_findOrAddVlak(obr, a); + if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n); + if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n); + if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n); + if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n); + } + } + } + } + + dl= dl->next; + } } + freedisplist(&disp); + MEM_freeN(matar); } @@ -2917,12 +3052,12 @@ static void to_edgesort(struct edgesort *ed, int i1, int i2, int v1, int v2, int static int vergedgesort(const void *v1, const void *v2) { const struct edgesort *x1=v1, *x2=v2; - + if( x1->v1 > x2->v1) return 1; else if( x1->v1 < x2->v1) return -1; else if( x1->v2 > x2->v2) return 1; else if( x1->v2 < x2->v2) return -1; - + return 0; } @@ -2933,14 +3068,14 @@ static struct edgesort *make_mesh_edge_lookup(DerivedMesh *dm, int *totedgesort) struct edgesort *edsort, *ed; unsigned int *mcol=NULL; int a, totedge=0, totface; - + mface= dm->getTessFaceArray(dm); totface= dm->getNumTessFaces(dm); tface= dm->getTessFaceDataArray(dm, CD_MTFACE); mcol= dm->getTessFaceDataArray(dm, CD_MCOL); - + if(mcol==NULL && tface==NULL) return NULL; - + /* make sorted table with edges and face indices in it */ for(a= totface, mf= mface; a>0; a--, mf++) { if(mf->v4) totedge+=4; @@ -2949,9 +3084,9 @@ static struct edgesort *make_mesh_edge_lookup(DerivedMesh *dm, int *totedgesort) if(totedge==0) return NULL; - + ed= edsort= MEM_callocN(totedge*sizeof(struct edgesort), "edgesort"); - + for(a=0, mf=mface; av1, mf->v2, a); to_edgesort(ed++, 1, 2, mf->v2, mf->v3, a); @@ -2962,9 +3097,9 @@ static struct edgesort *make_mesh_edge_lookup(DerivedMesh *dm, int *totedgesort) else if(mf->v3) to_edgesort(ed++, 2, 3, mf->v3, mf->v1, a); } - + qsort(edsort, totedge, sizeof(struct edgesort), vergedgesort); - + *totedgesort= totedge; return edsort; @@ -2978,7 +3113,7 @@ static void use_mesh_edge_lookup(ObjectRen *obr, DerivedMesh *dm, MEdge *medge, MCol *mcol, *mc; int index, mtfn, mcn; char *name; - + if(medge->v1 < medge->v2) { ed.v1= medge->v1; ed.v2= medge->v2; @@ -2987,7 +3122,7 @@ static void use_mesh_edge_lookup(ObjectRen *obr, DerivedMesh *dm, MEdge *medge, ed.v1= medge->v2; ed.v2= medge->v1; } - + edp= bsearch(&ed, edgetable, totedge, sizeof(struct edgesort), vergedgesort); /* since edges have different index ordering, we have to duplicate mcol and tface */ @@ -3036,17 +3171,17 @@ static void init_camera_inside_volumes(Render *re) if (obi->obr == vo->obr) { if (point_inside_volume_objectinstance(re, obi, co)) { MatInside *mi; - + mi = MEM_mallocN(sizeof(MatInside), "camera inside material"); mi->ma = vo->ma; mi->obi = obi; - + BLI_addtail(&(re->render_volumes_inside), mi); } } } } - + /* debug { MatInside *m; for (m=re->render_volumes_inside.first; m; m=m->next) { @@ -3058,12 +3193,12 @@ static void init_camera_inside_volumes(Render *re) static void add_volume(Render *re, ObjectRen *obr, Material *ma) { struct VolumeOb *vo; - + vo = MEM_mallocN(sizeof(VolumeOb), "volume object"); - + vo->ma = ma; vo->obr = obr; - + BLI_addtail(&re->volumes, vo); } @@ -3585,7 +3720,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) lar->sunsky->effect_type = la->sun_effect_type; VECCOPY(vec,ob->obmat[2]); - normalize_v3(vec); + normalize_v3(vec); InitSunSky(lar->sunsky, la->atm_turbidity, vec, la->horizon_brightness, la->spread, la->sun_brightness, la->sun_size, la->backscattered_light, @@ -3731,7 +3866,7 @@ static void add_lightgroup(Render *re, Group *group, int exclusive) for(go= group->gobject.first; go; go= go->next) { go->lampren= NULL; - if(go->ob->lay & re->scene->lay) { + if(go->ob->lay & re->lay) { if(go->ob && go->ob->type==OB_LAMP) { for(gol= re->lights.first; gol; gol= gol->next) { if(gol->ob==go->ob) { @@ -4098,7 +4233,7 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset) /* Baking lets us define a quad split order */ split_quads(obr, re->r.bake_quad_split); } else { - if((re->r.simplify_flag & R_SIMPLE_NO_TRIANGULATE) == 0) + if((re->r.mode & R_SIMPLIFY && re->r.simplify_flag & R_SIMPLE_NO_TRIANGULATE) == 0) check_non_flat_quads(obr); } @@ -4291,7 +4426,7 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) if ELEM(ob->type, OB_FONT, OB_CURVE) init_render_curve(re, obr, timeoffset); else if(ob->type==OB_SURF) - init_render_surf(re, obr); + init_render_surf(re, obr, timeoffset); else if(ob->type==OB_MESH) init_render_mesh(re, obr, timeoffset); else if(ob->type==OB_MBALL) @@ -4299,7 +4434,7 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) } finalize_render_object(re, obr, timeoffset); - + re->totvert += obr->totvert; re->totvlak += obr->totvlak; re->tothalo += obr->tothalo; @@ -4414,7 +4549,6 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject void RE_Database_Free(Render *re) { - Object *ob = NULL; LampRen *lar; /* statistics for debugging render memory usage */ @@ -4441,21 +4575,8 @@ void RE_Database_Free(Render *re) BLI_freelistN(&re->lights); free_renderdata_tables(re); - - /* free orco. check all objects because of duplis and sets */ - ob= G.main->object.first; - while(ob) { - if(ob->type==OB_MBALL) { - if(ob->disp.first && ob->disp.first!=ob->disp.last) { - DispList *dl= ob->disp.first; - BLI_remlink(&ob->disp, dl); - freedisplist(&ob->disp); - BLI_addtail(&ob->disp, dl); - } - } - ob= ob->id.next; - } + /* free orco */ free_mesh_orco_hash(re); #if 0 /* radio can be redone better */ end_radio_render(); @@ -4464,7 +4585,6 @@ void RE_Database_Free(Render *re) end_render_textures(); free_pointdensities(re); - free_voxeldata(re); free_camera_inside_volumes(re); @@ -4546,8 +4666,7 @@ static int allow_render_dupli_instance(Render *re, DupliObject *dob, Object *obd /* don't allow lamp, animated duplis, or radio render */ return (render_object_type(obd->type) && - (!(dob->type == OB_DUPLIGROUP) || !dob->animated) && - !(re->r.mode & R_RADIO)); + (!(dob->type == OB_DUPLIGROUP) || !dob->animated)); } static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, int level, int enable) @@ -4594,9 +4713,9 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in static int get_vector_renderlayers(Scene *sce) { SceneRenderLayer *srl; - int lay= 0; + unsigned int lay= 0; - for(srl= sce->r.layers.first; srl; srl= srl->next) + for(srl= sce->r.layers.first; srl; srl= srl->next) if(srl->passflag & SCE_PASS_VECTOR) lay |= srl->lay; @@ -4661,7 +4780,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp /* in the prev/next pass for making speed vectors, avoid creating * objects that are not on a renderlayer with a vector pass, can * save a lot of time in complex scenes */ - vectorlay= get_vector_renderlayers(sce); + vectorlay= get_vector_renderlayers(re->scene); lay= (timeoffset)? renderlay & vectorlay: renderlay; /* if the object has been restricted from rendering in the outliner, ignore it */ @@ -4678,7 +4797,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } } } - else if((base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->scene->lay)) ) { + else if((base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->lay)) ) { if((ob->transflag & OB_DUPLI) && (ob->type!=OB_MBALL)) { DupliObject *dob; ListBase *lb; @@ -4688,7 +4807,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp /* create list of duplis generated by this object, particle * system need to have render settings set for dupli particles */ dupli_render_particle_set(re, ob, timeoffset, 0, 1); - lb= object_duplilist(sce, ob); + lb= object_duplilist(re->scene, ob); dupli_render_particle_set(re, ob, timeoffset, 0, 0); for(dob= lb->first; dob; dob= dob->next) { @@ -4805,15 +4924,15 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } /* used to be 'rotate scene' */ -void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) +void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_camera_view) { extern int slurph_opt; /* key.c */ Scene *sce; float mat[4][4]; float amb[3]; - unsigned int lay; re->scene= scene; + re->lay= lay; /* per second, per object, stats print this */ re->i.infostr= "Preparing Scene data"; @@ -4822,7 +4941,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) /* XXX add test if dbase was filled already? */ - re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "render db arena"); re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->lights.first= re->lights.last= NULL; re->lampren.first= re->lampren.last= NULL; @@ -4831,8 +4950,8 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) re->i.partsdone= 0; /* signal now in use for previewrender */ /* in localview, lamps are using normal layers, objects only local bits */ - if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000; - else lay= re->scene->lay; + if(re->lay & 0xFF000000) + lay &= 0xFF000000; /* applies changes fully */ if((re->r.scemode & R_PREVIEWBUTS)==0) @@ -4840,6 +4959,11 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) /* if no camera, viewmat should have been set! */ if(use_camera_view && re->scene->camera) { + /* called before but need to call again incase of lens animation from the + * above call to scene_update_for_newframe, fixes bug. [#22702]. + * following calls dont depend on 'RE_SetCamera' */ + RE_SetCamera(re, scene->camera); + normalize_m4(re->scene->camera->obmat); invert_m4_m4(mat, re->scene->camera->obmat); RE_SetView(re, mat); @@ -4899,11 +5023,6 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) /* yafray: 'direct' radiosity, environment maps and raytree init not needed for yafray render */ /* although radio mode could be useful at some point, later */ if (re->r.renderer==R_INTERN) { -#if 0 /* RADIO was removed */ - /* RADIO (uses no R anymore) */ - if(!re->test_break(re->tbh)) - if(re->r.mode & R_RADIO) do_radio_render(re); -#endif /* raytree */ if(!re->test_break(re->tbh)) { if(re->r.mode & R_RAYTRACE) { @@ -4967,17 +5086,17 @@ void RE_DataBase_GetView(Render *re, float mat[][4]) /* Speed Vectors */ /* ------------------------------------------------------------------------- */ -static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset) +static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset) { extern int slurph_opt; /* key.c */ float mat[4][4]; - unsigned int lay; re->scene= scene; + re->lay= lay; /* XXX add test if dbase was filled already? */ - re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vector render db arena"); re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0; re->lights.first= re->lights.last= NULL; @@ -4985,8 +5104,8 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset) slurph_opt= 0; /* in localview, lamps are using normal layers, objects only local bits */ - if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000; - else lay= re->scene->lay; + if(re->lay & 0xFF000000) + lay &= 0xFF000000; /* applies changes fully */ scene->r.cfra += timeoffset; @@ -5349,7 +5468,7 @@ static void free_dbase_object_vectors(ListBase *lb) BLI_freelistN(lb); } -void RE_Database_FromScene_Vectors(Render *re, Scene *sce) +void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay) { ObjectInstanceRen *obi, *oldobi; StrandSurface *mesh; @@ -5364,7 +5483,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce) speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */ /* creates entire dbase */ - database_fromscene_vectors(re, sce, -1); + database_fromscene_vectors(re, sce, lay, -1); /* copy away vertex info */ copy_dbase_object_vectors(re, &oldtable); @@ -5379,7 +5498,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce) /* creates entire dbase */ re->i.infostr= "Calculating next frame vectors"; - database_fromscene_vectors(re, sce, +1); + database_fromscene_vectors(re, sce, lay, +1); } /* copy away vertex info */ copy_dbase_object_vectors(re, &newtable); @@ -5391,7 +5510,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce) re->strandsurface= strandsurface; if(!re->test_break(re->tbh)) - RE_Database_FromScene(re, sce, 1); + RE_Database_FromScene(re, sce, lay, 1); if(!re->test_break(re->tbh)) { for(step= 0; step<2; step++) { @@ -5480,14 +5599,14 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce) RE_BAKE_DISPLACEMENT:for baking, no lamps, only selected objects RE_BAKE_SHADOW: for baking, only shadows, but all objects */ -void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob) +void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Object *actob) { float mat[4][4]; float amb[3]; - unsigned int lay; int onlyselected, nolamps; re->scene= scene; + re->lay= lay; /* renderdata setup and exceptions */ re->r= scene->r; @@ -5513,15 +5632,15 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob) } /* setup render stuff */ - re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "bake db arena"); re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->lights.first= re->lights.last= NULL; re->lampren.first= re->lampren.last= NULL; /* in localview, lamps are using normal layers, objects only local bits */ - if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000; - else lay= re->scene->lay; + if(re->lay & 0xFF000000) + lay &= 0xFF000000; /* if no camera, set unit */ if(re->scene->camera) { @@ -5605,7 +5724,7 @@ void RE_make_sticky(Scene *scene, View3D *v3d) return; } - re= RE_NewRender("_make sticky_", RE_SLOT_DEFAULT); + re= RE_NewRender("_make sticky_"); RE_InitState(re, NULL, &scene->r, NULL, scene->r.xsch, scene->r.ysch, NULL); /* use renderdata and camera to set viewplane */ diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 5a69bcb45bd..1accb0fdb60 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -74,15 +74,23 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf) dx= ibuf->y; dx/= 2; - if(3*dx != ibuf->x) { + if (3*dx == ibuf->x) { + env->type = ENV_CUBE; + } else if (ibuf->x == ibuf->y) { + env->type = ENV_PLANE; + } else { printf("Incorrect envmap size\n"); env->ok= 0; env->ima->ok= 0; + return; } - else { + + if (env->type == ENV_CUBE) { for(part=0; part<6; part++) { - env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect, 0); + env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat, 0); } + IMB_float_from_rect(ibuf); + IMB_rectcpy(env->cube[0], ibuf, 0, 0, 0, 0, dx, dx); IMB_rectcpy(env->cube[1], ibuf, @@ -97,6 +105,12 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf) 0, 0, 2*dx, dx, dx, dx); env->ok= ENV_OSA; } + else { /* ENV_PLANE */ + env->cube[1]= IMB_dupImBuf(ibuf); + IMB_float_from_rect(env->cube[1]); + + env->ok= ENV_OSA; + } } /* ------------------------------------------------------------------------- */ @@ -108,7 +122,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env) Render *envre; int cuberes; - envre= RE_NewRender("Envmap", RE_SLOT_DEFAULT); + envre= RE_NewRender("Envmap"); env->lastsize= re->r.size; cuberes = (env->cuberes * re->r.size) / 100; @@ -129,6 +143,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env) RE_InitState(envre, NULL, &envre->r, NULL, cuberes, cuberes, NULL); envre->scene= re->scene; /* unsure about this... */ + envre->lay= re->lay; /* view stuff in env render */ envre->lens= 16.0f; @@ -432,7 +447,7 @@ static void render_envmap(Render *re, EnvMap *env) env_set_imats(envre); if(re->test_break(re->tbh)==0) { - RE_TileProcessor(envre, 0, 0); + RE_TileProcessor(envre); } /* rotate back */ @@ -442,17 +457,18 @@ static void render_envmap(Render *re, EnvMap *env) if(re->test_break(re->tbh)==0) { RenderLayer *rl= envre->result->layers.first; int y; - char *alpha; + float *alpha; - ibuf= IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect, 0); - ibuf->rect_float= rl->rectf; - IMB_rect_from_float(ibuf); - ibuf->rect_float= NULL; + ibuf= IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect|IB_rectfloat, 0); + memcpy(ibuf->rect_float, rl->rectf, ibuf->channels * ibuf->x * ibuf->y * sizeof(float)); + + if (re->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) + ibuf->profile = IB_PROFILE_LINEAR_RGB; /* envmap renders without alpha */ - alpha= ((char *)ibuf->rect)+3; + alpha= ((float *)ibuf->rect_float)+3; for(y= ibuf->x*ibuf->y - 1; y>=0; y--, alpha+=4) - *alpha= 255; + *alpha= 1.0; env->cube[part]= ibuf; } @@ -498,7 +514,7 @@ void make_envmaps(Render *re) if(tex->env && tex->env->object) { EnvMap *env= tex->env; - if(env->object->lay & re->scene->lay) { + if(env->object->lay & re->lay) { if(env->stype==ENV_LOAD) { float orthmat[4][4], mat[4][4], tmat[4][4]; @@ -657,10 +673,11 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe texres->tin= 0.0; return 0; } + if(env->stype==ENV_LOAD) { env->ima= tex->ima; if(env->ima && env->ima->ok) { - if(env->cube[0]==NULL) { + if(env->cube[1]==NULL) { ImBuf *ibuf= BKE_image_get_ibuf(env->ima, NULL); if(ibuf) envmap_split_ima(env, ibuf); @@ -671,7 +688,6 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe } if(env->ok==0) { - texres->tin= 0.0; return 0; } @@ -703,9 +719,9 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe texr1.nor= texr2.nor= NULL; - add_v3_v3v3(vec, vec, dxt); + add_v3_v3(vec, dxt); face1= envcube_isect(env, vec, sco); - sub_v3_v3v3(vec, vec, dxt); + sub_v3_v3(vec, dxt); if(face!=face1) { ibuf= env->cube[face1]; @@ -716,9 +732,9 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe /* here was the nasty bug! results were not zero-ed. FPE! */ - add_v3_v3v3(vec, vec, dyt); + add_v3_v3(vec, dyt); face1= envcube_isect(env, vec, sco); - sub_v3_v3v3(vec, vec, dyt); + sub_v3_v3(vec, dyt); if(face!=face1) { ibuf= env->cube[face1]; diff --git a/source/blender/render/intern/source/gammaCorrectionTables.c b/source/blender/render/intern/source/gammaCorrectionTables.c index 02410d28048..d88638f423c 100644 --- a/source/blender/render/intern/source/gammaCorrectionTables.c +++ b/source/blender/render/intern/source/gammaCorrectionTables.c @@ -33,10 +33,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* WARNING; optimized, cannot be used to do gamma(invgamma()) and expect */ /* result remain identical (ton) */ @@ -75,7 +71,7 @@ float gammaCorrect(float c) if (i < 0) res = -pow(abs(c), valid_gamma); else if (i >= RE_GAMMA_TABLE_SIZE ) res = pow(c, valid_gamma); else res = gamma_range_table[i] + - ( (c - color_domain_table[i]) * gamfactor_table[i]); + ( (c - color_domain_table[i]) * gamfactor_table[i]); return res; } /* end of float gammaCorrect(float col) */ @@ -92,7 +88,7 @@ float invGammaCorrect(float col) if (i < 0) res = -pow(abs(col), valid_inv_gamma); else if (i >= RE_GAMMA_TABLE_SIZE) res = pow(col, valid_inv_gamma); else res = inv_gamma_range_table[i] + - ( (col - color_domain_table[i]) * inv_gamfactor_table[i]); + ( (col - color_domain_table[i]) * inv_gamfactor_table[i]); return res; } /* end of float invGammaCorrect(float col) */ diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index cf0a01576d8..f08529b3f2c 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -1,6 +1,6 @@ /** * - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -236,8 +236,6 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre } } - BRICONTRGB; - if(texres->talpha) texres->tin= texres->ta; else if(tex->imaflag & TEX_CALCALPHA) { texres->ta= texres->tin= MAX3(texres->tr, texres->tg, texres->tb); @@ -254,6 +252,8 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre texres->tb*= fx; } + BRICONTRGB; + return retval; } @@ -417,111 +417,10 @@ static float clipy_rctf(rctf *rf, float y1, float y2) } -// used in SAT_get_color_bilerp() below -static void SAT_getcol(float* col, ImBuf* ibuf, int x, int y) -{ - if ((x == (ibuf->x - 1)) && (y == (ibuf->y - 1))) { // avg val pos - col[0] = col[1] = col[2] = col[3] = 0.f; - return; - } - ibuf_get_color(col, ibuf, x, y); -} - -// used in boxsampleclip_SAT() below -static void SAT_get_color_bilerp(float *col, ImBuf *ibuf, float u, float v) -{ - float c00[4], c01[4], c10[4], c11[4]; - const float ufl = floorf(u -= 0.5f), vfl = floorf(v -= 0.5f); - const float uf = u - ufl, vf = v - vfl; - const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf; - int x1 = (int)ufl, y1 = (int)vfl, x2 = x1 + 1, y2 = y1 + 1; - x1 = (x1 < 0) ? 0 : (x1 >= ibuf->x ? ibuf->x - 1 : x1); - x2 = (x2 < 0) ? 0 : (x2 >= ibuf->x ? ibuf->x - 1 : x2); - y1 = (y1 < 0) ? 0 : (y1 >= ibuf->y ? ibuf->y - 1 : y1); - y2 = (y2 < 0) ? 0 : (y2 >= ibuf->y ? ibuf->y - 1 : y2); - SAT_getcol(c00, ibuf, x1, y1); - SAT_getcol(c10, ibuf, x2, y1); - SAT_getcol(c01, ibuf, x1, y2); - SAT_getcol(c11, ibuf, x2, y2); - col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0]; - col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1]; - col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2]; - col[3] = w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3]; -} - -static void boxsampleclip_SAT(ImBuf *ibuf, rctf *rf, TexResult *texres, int intpol) -{ - float div, col[4]; - if (intpol) { - div = 1.f/((rf->xmax - rf->xmin + 1.f)*(rf->ymax - rf->ymin + 1.f)); - SAT_get_color_bilerp(&texres->tr, ibuf, rf->xmax, rf->ymax); - if (rf->ymin >= 1.f) { - SAT_get_color_bilerp(col, ibuf, rf->xmax, rf->ymin - 1.f); - texres->tr -= col[0]; - texres->tg -= col[1]; - texres->tb -= col[2]; - texres->ta -= col[3]; - } - if (rf->xmin >= 1.f) { - SAT_get_color_bilerp(col, ibuf, rf->xmin - 1.f, rf->ymax); - texres->tr -= col[0]; - texres->tg -= col[1]; - texres->tb -= col[2]; - texres->ta -= col[3]; - } - if (rf->xmin >= 1.f && rf->ymin >= 1.f) { - SAT_get_color_bilerp(col, ibuf, rf->xmin - 1.f, rf->ymin - 1.f); - texres->tr += col[0]; - texres->tg += col[1]; - texres->tb += col[2]; - texres->ta += col[3]; - } - } - else { - int startx = (int)floorf(rf->xmin); - int endx = (int)floorf(rf->xmax); - int starty = (int)floorf(rf->ymin); - int endy = (int)floorf(rf->ymax); - if (startx < 0) startx = 0; - if (starty < 0) starty = 0; - if (endx >= ibuf->x) endx = ibuf->x - 1; - if (endy >= ibuf->y) endy = ibuf->y - 1; - div = 1.f/((endx - startx + 1)*(endy - starty + 1)); - SAT_getcol(&texres->tr, ibuf, endx, endy); - if (starty >= 1) { - SAT_getcol(col, ibuf, endx, starty - 1); - texres->tr -= col[0]; - texres->tg -= col[1]; - texres->tb -= col[2]; - texres->ta -= col[3]; - } - if (startx >= 1) { - SAT_getcol(col, ibuf, startx - 1, endy); - texres->tr -= col[0]; - texres->tg -= col[1]; - texres->tb -= col[2]; - texres->ta -= col[3]; - } - if (startx >=1 && starty >= 1) { - SAT_getcol(col, ibuf, startx - 1, starty - 1); - texres->tr += col[0]; - texres->tg += col[1]; - texres->tb += col[2]; - texres->ta += col[3]; - } - } - // avg - ibuf_get_color(col, ibuf, ibuf->x - 1, ibuf->y - 1); - texres->tr = texres->tr*div + col[0]; - texres->tg = texres->tg*div + col[1]; - texres->tb = texres->tb*div + col[2]; - texres->ta = texres->ta*div + col[3]; -} - static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres) { /* sample box, is clipped already, and minx etc. have been set at ibuf size. - Enlarge with antialiased edges of the pixels */ + Enlarge with antialiased edges of the pixels */ float muly, mulx, div, col[4]; int x, y, startx, endx, starty, endy; @@ -601,7 +500,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres) } } -static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend, int SAT, int intpol) +static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend, int intpol) { /* Sample box, performs clip. minx etc are in range 0.0 - 1.0 . * Enlarge with antialiased edges of pixels. @@ -655,10 +554,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max if(count>1) { tot= texres->tr= texres->tb= texres->tg= texres->ta= 0.0; while(count--) { - if (SAT) - boxsampleclip_SAT(ibuf, rf, &texr, intpol); - else - boxsampleclip(ibuf, rf, &texr); + boxsampleclip(ibuf, rf, &texr); opp= square_rctf(rf); tot+= opp; @@ -676,12 +572,8 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max if(texres->talpha) texres->ta/= tot; } } - else { - if (SAT) - boxsampleclip_SAT(ibuf, rf, texres, intpol); - else - boxsampleclip(ibuf, rf, texres); - } + else + boxsampleclip(ibuf, rf, texres); if(texres->talpha==0) texres->ta= 1.0; @@ -694,49 +586,19 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max } } -void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *result) -{ - TexResult texres; - ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); - - if(ibuf==NULL) { - result[0]= result[1]= result[2]= result[3]= 0.0f; - return; - } - - if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) - ibuf->rect+= (ibuf->x*ibuf->y); - - boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0, 0); - result[0]= texres.tr; - result[1]= texres.tg; - result[2]= texres.tb; - result[3]= texres.ta; - - if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) - ibuf->rect-= (ibuf->x*ibuf->y); -} - -void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) -{ - TexResult texres; - - if(ibuf==NULL) { - return; - } - - memset(&texres, 0, sizeof(texres)); - boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0, 0); - result[0]= texres.tr; - result[1]= texres.tg; - result[2]= texres.tb; - result[3]= texres.ta; -} - - //----------------------------------------------------------------------------------------------------------------- // from here, some functions only used for the new filtering +// anisotropic filters, data struct used instead of long line of (possibly unused) func args +typedef struct afdata_t { + float dxt[2], dyt[2]; + int intpol, extflag; + // feline only + float majrad, minrad, theta; + int iProbes; + float dusc, dvsc; +} afdata_t; + // this only used here to make it easier to pass extend flags as single int enum {TXC_XMIR=1, TXC_YMIR, TXC_REPT, TXC_EXTD}; @@ -821,16 +683,6 @@ static int ibuf_get_color_clip_bilerp(float *col, ImBuf *ibuf, float u, float v, return ibuf_get_color_clip(col, ibuf, (int)u, (int)v, extflag); } -// anisotropic filters, data struct used instead of long line of (possibly unused) func args -typedef struct afdata_t { - float dxt[2], dyt[2]; - int intpol, extflag; - // feline only - float majrad, minrad, theta; - int iProbes; - float dusc, dvsc; -} afdata_t; - static void area_sample(TexResult* texr, ImBuf* ibuf, float fx, float fy, afdata_t* AFD) { int xs, ys, clip = 0; @@ -1148,7 +1000,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, if (tex->imaflag & TEX_MIPMAP) { if (((ibuf->flags & IB_fields) == 0) && (ibuf->mipmap[0] == NULL)) { BLI_lock_thread(LOCK_IMAGE); - if (ibuf->mipmap[0] == NULL) IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP, 0); + if (ibuf->mipmap[0] == NULL) IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP); BLI_unlock_thread(LOCK_IMAGE); } } @@ -1188,7 +1040,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, if (tex->imaflag & TEX_FILTER_MIN) { // make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy) - const float addval = (0.5f * tex->filtersize) / (float)MIN2(ibuf->x, ibuf->y); + const float addval = (0.5f * tex->filtersize) / (float)MIN2(ibuf->x, ibuf->y); if (addval > minx) minx = addval; if (addval > miny) miny = addval; } @@ -1466,8 +1318,6 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, } } - BRICONTRGB; - if (tex->imaflag & TEX_CALCALPHA) texres->ta = texres->tin = texres->ta * MAX3(texres->tr, texres->tg, texres->tb); else @@ -1496,6 +1346,8 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, texres->tb *= fx; } + BRICONTRGB; + return retval; } @@ -1505,7 +1357,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f TexResult texr; float fx, fy, minx, maxx, miny, maxy, dx, dy, dxt[3], dyt[3]; float maxd, pixsize, val1, val2, val3; - int curmap, retval, imaprepeat, imapextend, SAT = (tex->texfilter == TXF_SAT); + int curmap, retval, imaprepeat, imapextend; // TXF: since dxt/dyt might be modified here and since they might be needed after imagewraposa() call, // make a local copy here so that original vecs remain untouched @@ -1513,7 +1365,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f VECCOPY(dyt, DYT); // anisotropic filtering - if (!SAT && (tex->texfilter != TXF_BOX)) + if (tex->texfilter != TXF_BOX) return imagewraposa_aniso(tex, ima, ibuf, texvec, dxt, dyt, texres); texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0f; @@ -1536,13 +1388,13 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f return retval; /* mipmap test */ - if (SAT || tex->imaflag & TEX_MIPMAP) { + if (tex->imaflag & TEX_MIPMAP) { if(ibuf->flags & IB_fields); else if(ibuf->mipmap[0]==NULL) { BLI_lock_thread(LOCK_IMAGE); if(ibuf->mipmap[0]==NULL) - IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP, SAT); + IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP); BLI_unlock_thread(LOCK_IMAGE); } @@ -1589,7 +1441,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f if(tex->imaflag & TEX_FILTER_MIN) { /* make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy) */ - float addval= (0.5f * tex->filtersize) / (float) MIN2(ibuf->x, ibuf->y); + float addval= (0.5f * tex->filtersize) / (float) MIN2(ibuf->x, ibuf->y); if(addval > minx) minx= addval; @@ -1754,11 +1606,11 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f //minx*= 1.35f; //miny*= 1.35f; - boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0, 0); + boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0); val1= texres->tr+texres->tg+texres->tb; - boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0, 0); + boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0); val2= texr.tr + texr.tg + texr.tb; - boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0, 0); + boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0); val3= texr.tr + texr.tg + texr.tb; /* don't switch x or y! */ @@ -1767,7 +1619,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f if(previbuf!=curibuf) { /* interpolate */ - boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend, 0, 0); + boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend, 0); /* calc rgb */ dx= 2.0f*(pixsize-maxd)/pixsize; @@ -1784,9 +1636,9 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f } val1= dy*val1+ dx*(texr.tr + texr.tg + texr.tb); - boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0, 0); + boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0); val2= dy*val2+ dx*(texr.tr + texr.tg + texr.tb); - boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0, 0); + boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0); val3= dy*val3+ dx*(texr.tr + texr.tg + texr.tb); texres->nor[0]= (val1-val2); /* vals have been interpolated above! */ @@ -1809,10 +1661,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f maxy= fy+miny; miny= fy-miny; - boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend, 0, 0); + boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend, 0); if(previbuf!=curibuf) { /* interpolate */ - boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend, 0, 0); + boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend, 0); fx= 2.0f*(pixsize-maxd)/pixsize; @@ -1831,43 +1683,28 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f } else { const int intpol = tex->imaflag & TEX_INTERPOL; - if (intpol && !SAT) { + if (intpol) { /* sample 1 pixel minimum */ if (minx < 0.5f / ibuf->x) minx = 0.5f / ibuf->x; if (miny < 0.5f / ibuf->y) miny = 0.5f / ibuf->y; } if(texres->nor && (tex->imaflag & TEX_NORMALMAP)==0) { - if (SAT) { - boxsample(ibuf->mipmap[0], fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 1, intpol); - val1 = texres->tr + texres->tg + texres->tb; - boxsample(ibuf->mipmap[0], fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 1, intpol); - val2 = texr.tr + texr.tg + texr.tb; - boxsample(ibuf->mipmap[0], fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 1, intpol); - val3 = texr.tr + texr.tg + texr.tb; - } - else { - boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0, 0); - val1= texres->tr+texres->tg+texres->tb; - boxsample(ibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0, 0); - val2= texr.tr + texr.tg + texr.tb; - boxsample(ibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0, 0); - val3= texr.tr + texr.tg + texr.tb; - } + boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0); + val1= texres->tr+texres->tg+texres->tb; + boxsample(ibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0); + val2= texr.tr + texr.tg + texr.tb; + boxsample(ibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0); + val3= texr.tr + texr.tg + texr.tb; + /* don't switch x or y! */ texres->nor[0]= (val1-val2); texres->nor[1]= (val1-val3); } - else { - if (SAT) - boxsample(ibuf->mipmap[0], fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 1, intpol); - else - boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0, 0); - } + else + boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0); } - BRICONTRGB; - if(tex->imaflag & TEX_CALCALPHA) { texres->ta= texres->tin= texres->ta*MAX3(texres->tr, texres->tg, texres->tb); } @@ -1894,5 +1731,57 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f texres->tb*= fx; } + BRICONTRGB; + return retval; } + +void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *result) +{ + TexResult texres; + ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); + + if(ibuf==NULL) { + result[0]= result[1]= result[2]= result[3]= 0.0f; + return; + } + + if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) + ibuf->rect+= (ibuf->x*ibuf->y); + + boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0); + result[0]= texres.tr; + result[1]= texres.tg; + result[2]= texres.tb; + result[3]= texres.ta; + + if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) + ibuf->rect-= (ibuf->x*ibuf->y); +} + +void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) +{ + TexResult texres; + afdata_t AFD; + + if(ibuf==NULL) { + return; + } + + AFD.dxt[0] = dx; AFD.dxt[1] = dx; + AFD.dyt[0] = dy; AFD.dyt[1] = dy; + //copy_v2_v2(AFD.dxt, dx); + //copy_v2_v2(AFD.dyt, dy); + + AFD.intpol = 1; + AFD.extflag = TXC_EXTD; + + memset(&texres, 0, sizeof(texres)); + ewa_eval(&texres, ibuf, fx, fy, &AFD); + + + result[0]= texres.tr; + result[1]= texres.tg; + result[2]= texres.tb; + result[3]= texres.ta; +} \ No newline at end of file diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 46dcb018a00..26c68d0a167 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -109,10 +109,10 @@ static void init_render_jit(Render *re) static float filt_quadratic(float x) { - if (x < 0.0f) x = -x; - if (x < 0.5f) return 0.75f-(x*x); - if (x < 1.5f) return 0.50f*(x-1.5f)*(x-1.5f); - return 0.0f; + if (x < 0.0f) x = -x; + if (x < 0.5f) return 0.75f-(x*x); + if (x < 1.5f) return 0.50f*(x-1.5f)*(x-1.5f); + return 0.0f; } @@ -120,11 +120,11 @@ static float filt_cubic(float x) { float x2= x*x; - if (x < 0.0f) x = -x; + if (x < 0.0f) x = -x; - if (x < 1.0f) return 0.5*x*x2 - x2 + 2.0f/3.0f; - if (x < 2.0f) return (2.0-x)*(2.0-x)*(2.0-x)/6.0f; - return 0.0f; + if (x < 1.0f) return 0.5*x*x2 - x2 + 2.0f/3.0f; + if (x < 2.0f) return (2.0-x)*(2.0-x)*(2.0-x)/6.0f; + return 0.0f; } @@ -132,10 +132,10 @@ static float filt_catrom(float x) { float x2= x*x; - if (x < 0.0f) x = -x; - if (x < 1.0f) return 1.5f*x2*x - 2.5f*x2 + 1.0f; - if (x < 2.0f) return -0.5f*x2*x + 2.5*x2 - 4.0f*x + 2.0f; - return 0.0f; + if (x < 0.0f) x = -x; + if (x < 1.0f) return 1.5f*x2*x - 2.5f*x2 + 1.0f; + if (x < 2.0f) return -0.5f*x2*x + 2.5*x2 - 4.0f*x + 2.0f; + return 0.0f; } static float filt_mitchell(float x) /* Mitchell & Netravali's two-param cubic */ @@ -447,117 +447,9 @@ void make_sample_tables(Render *re) /* per render, there's one persistant viewplane. Parts will set their own viewplanes */ void RE_SetCamera(Render *re, Object *camera) { - Camera *cam=NULL; - rctf viewplane; - float pixsize, clipsta, clipend; - float lens, shiftx=0.0, shifty=0.0, winside; - - /* question mark */ - re->ycor= ( (float)re->r.yasp)/( (float)re->r.xasp); - if(re->r.mode & R_FIELDS) - re->ycor *= 2.0f; - - if(camera->type==OB_CAMERA) { - cam= camera->data; - - if(cam->type==CAM_ORTHO) re->r.mode |= R_ORTHO; - if(cam->flag & CAM_PANORAMA) re->r.mode |= R_PANORAMA; - - /* solve this too... all time depending stuff is in convertblender.c? - * Need to update the camera early because it's used for projection matrices - * and other stuff BEFORE the animation update loop is done - * */ -#if 0 // XXX old animation system - if(cam->ipo) { - calc_ipo(cam->ipo, frame_to_float(re->scene, re->r.cfra)); - execute_ipo(&cam->id, cam->ipo); - } -#endif // XXX old animation system - lens= cam->lens; - shiftx=cam->shiftx; - shifty=cam->shifty; - - clipsta= cam->clipsta; - clipend= cam->clipend; - } - else if(camera->type==OB_LAMP) { - Lamp *la= camera->data; - float fac= cos( M_PI*la->spotsize/360.0 ); - float phi= acos(fac); - - lens= 16.0*fac/sin(phi); - if(lens==0.0f) - lens= 35.0; - clipsta= la->clipsta; - clipend= la->clipend; - } - else { /* envmap exception... */ - lens= re->lens; - if(lens==0.0f) - lens= 16.0; - - clipsta= re->clipsta; - clipend= re->clipend; - if(clipsta==0.0f || clipend==0.0f) { - clipsta= 0.1f; - clipend= 1000.0f; - } - } - - /* ortho only with camera available */ - if(cam && (re->r.mode & R_ORTHO)) { - if( (re->r.xasp*re->winx) >= (re->r.yasp*re->winy) ) { - re->viewfac= re->winx; - } - else { - re->viewfac= re->ycor*re->winy; - } - /* ortho_scale == 1.0 means exact 1 to 1 mapping */ - pixsize= cam->ortho_scale/re->viewfac; - } - else { - if( (re->r.xasp*re->winx) >= (re->r.yasp*re->winy) ) { - re->viewfac= (re->winx*lens)/32.0; - } - else { - re->viewfac= re->ycor*(re->winy*lens)/32.0; - } - - pixsize= clipsta/re->viewfac; - } - - /* viewplane fully centered, zbuffer fills in jittered between -.5 and +.5 */ - winside= MAX2(re->winx, re->winy); - viewplane.xmin= -0.5f*(float)re->winx + shiftx*winside; - viewplane.ymin= -0.5f*re->ycor*(float)re->winy + shifty*winside; - viewplane.xmax= 0.5f*(float)re->winx + shiftx*winside; - viewplane.ymax= 0.5f*re->ycor*(float)re->winy + shifty*winside; - - if(re->flag & R_SEC_FIELD) { - if(re->r.mode & R_ODDFIELD) { - viewplane.ymin-= .5*re->ycor; - viewplane.ymax-= .5*re->ycor; - } - else { - viewplane.ymin+= .5*re->ycor; - viewplane.ymax+= .5*re->ycor; - } - } - /* the window matrix is used for clipping, and not changed during OSA steps */ - /* using an offset of +0.5 here would give clip errors on edges */ - viewplane.xmin= pixsize*(viewplane.xmin); - viewplane.xmax= pixsize*(viewplane.xmax); - viewplane.ymin= pixsize*(viewplane.ymin); - viewplane.ymax= pixsize*(viewplane.ymax); - - re->viewdx= pixsize; - re->viewdy= re->ycor*pixsize; - - if(re->r.mode & R_ORTHO) - RE_SetOrtho(re, &viewplane, clipsta, clipend); - else - RE_SetWindow(re, &viewplane, clipsta, clipend); - + object_camera_matrix(&re->r, camera, re->winx, re->winy, re->flag & R_SEC_FIELD, + re->winmat, &re->viewplane, &re->clipsta, &re->clipend, + &re->lens, &re->ycor, &re->viewdx, &re->viewdy); } void RE_SetPixelSize(Render *re, float pixsize) diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c index 7c52857a94b..ff718359a3e 100644 --- a/source/blender/render/intern/source/occlusion.c +++ b/source/blender/render/intern/source/occlusion.c @@ -213,7 +213,7 @@ static void occ_build_shade(Render *re, OcclusionTree *tree) /* setup shade sample with correct passes */ memset(&ssamp, 0, sizeof(ShadeSample)); - ssamp.shi[0].lay= re->scene->lay; + ssamp.shi[0].lay= re->lay; ssamp.shi[0].passflag= SCE_PASS_DIFFUSE|SCE_PASS_RGBA; ssamp.shi[0].combinedflag= ~(SCE_PASS_SPEC); ssamp.tot= 1; @@ -660,7 +660,7 @@ static OcclusionTree *occ_tree_build(Render *re) tree->doindirect= (re->wrld.ao_indirect_energy > 0.0f && re->wrld.ao_indirect_bounces > 0); /* allocation */ - tree->arena= BLI_memarena_new(0x8000 * sizeof(OccNode)); + tree->arena= BLI_memarena_new(0x8000 * sizeof(OccNode), "occ tree arena"); BLI_memarena_use_calloc(tree->arena); if(re->wrld.aomode & WO_AOCACHE) @@ -1025,8 +1025,8 @@ static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, floa /* dot */ vresult.v = (vec_splat_float(n[0])*gx + - vec_splat_float(n[1])*gy + - vec_splat_float(n[2])*gz)*vangle; + vec_splat_float(n[1])*gy + + vec_splat_float(n[2])*gz)*vangle; result= (vresult.f[0] + vresult.f[1] + vresult.f[2] + vresult.f[3])*(0.5f/(float)M_PI); result= MAX2(result, 0.0f); @@ -1096,7 +1096,7 @@ static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, floa aresult = (_mm_set_ps1(n[0])*gx + _mm_set_ps1(n[1])*gy + _mm_set_ps1(n[2])*gz)*angle; /* sum together */ - result= (fresult[0] + fresult[1] + fresult[2] + fresult[3])*(0.5f/(float)M_PI); + result= (fresult[0] + fresult[1] + fresult[2] + fresult[3])*(0.5f/(float)M_PI); result= MAX2(result, 0.0f); return result; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 0122f1b5d65..fd91bf8a2c2 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -111,12 +111,9 @@ static struct { ListBase renderlist; - /* render slots */ - int viewslot, renderingslot; - /* commandline thread override */ int threads; -} RenderGlobal = {{NULL, NULL}, 0, 0, -1}; +} RenderGlobal = {{NULL, NULL}, -1}; /* hardcopy of current render, used while rendering for speed */ Render R; @@ -134,22 +131,26 @@ static int thread_break(void *unused) static void result_nothing(void *unused, RenderResult *rr) {} static void result_rcti_nothing(void *unused, RenderResult *rr, volatile struct rcti *rect) {} static void stats_nothing(void *unused, RenderStats *rs) {} -static void int_nothing(void *unused, int val) {} +static void float_nothing(void *unused, float val) {} static void print_error(void *unused, char *str) {printf("ERROR: %s\n", str);} static int default_break(void *unused) {return G.afbreek == 1;} -int RE_RenderInProgress(Render *re) -{ - return re->result_ok==0; -} - static void stats_background(void *unused, RenderStats *rs) { - uintptr_t mem_in_use= MEM_get_memory_in_use(); - float megs_used_memory= mem_in_use/(1024.0*1024.0); char str[400], *spos= str; - - spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", rs->cfra, megs_used_memory); + uintptr_t mem_in_use, mmap_in_use, peak_memory; + float megs_used_memory, mmap_used_memory, megs_peak_memory; + + mem_in_use= MEM_get_memory_in_use(); + mmap_in_use= MEM_get_mapped_memory_in_use(); + peak_memory = MEM_get_peak_memory(); + + megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0); + mmap_used_memory= (mmap_in_use)/(1024.0*1024.0); + megs_peak_memory = (peak_memory)/(1024.0*1024.0); + + spos+= sprintf(spos, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra, + megs_used_memory, mmap_used_memory, megs_peak_memory); if(rs->curfield) spos+= sprintf(spos, "Field %d ", rs->curfield); @@ -196,6 +197,8 @@ void RE_FreeRenderResult(RenderResult *res) MEM_freeN(res->rectz); if(res->rectf) MEM_freeN(res->rectf); + if(res->text) + MEM_freeN(res->text); MEM_freeN(res); } @@ -345,10 +348,10 @@ static char *get_pass_name(int passtype, int channel) return "AO.B"; } if(passtype == SCE_PASS_ENVIRONMENT) { - if(channel==-1) return "Environment"; - if(channel==0) return "Environment.R"; - if(channel==1) return "Environment.G"; - return "Environment.B"; + if(channel==-1) return "Env"; + if(channel==0) return "Env.R"; + if(channel==1) return "Env.G"; + return "Env.B"; } if(passtype == SCE_PASS_INDIRECT) { if(channel==-1) return "Indirect"; @@ -368,12 +371,6 @@ static char *get_pass_name(int passtype, int channel) if(channel==1) return "Refract.G"; return "Refract.B"; } - if(passtype == SCE_PASS_RADIO) { - if(channel==-1) return "Radio"; - if(channel==0) return "Radio.R"; - if(channel==1) return "Radio.G"; - return "Radio.B"; - } if(passtype == SCE_PASS_INDEXOB) { if(channel==-1) return "IndexOB"; return "IndexOB.X"; @@ -428,7 +425,7 @@ static int passtype_from_name(char *str) if(strcmp(str, "AO")==0) return SCE_PASS_AO; - if(strcmp(str, "Environment")==0) + if(strcmp(str, "Env")==0) return SCE_PASS_ENVIRONMENT; if(strcmp(str, "Indirect")==0) @@ -440,9 +437,6 @@ static int passtype_from_name(char *str) if(strcmp(str, "Refract")==0) return SCE_PASS_REFRACT; - if(strcmp(str, "Radio")==0) - return SCE_PASS_RADIO; - if(strcmp(str, "IndexOB")==0) return SCE_PASS_INDEXOB; @@ -622,8 +616,6 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int render_layer_add_pass(rr, rl, 3, SCE_PASS_REFLECT); if(srl->passflag & SCE_PASS_REFRACT) render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT); - if(srl->passflag & SCE_PASS_RADIO) - render_layer_add_pass(rr, rl, 3, SCE_PASS_RADIO); if(srl->passflag & SCE_PASS_INDEXOB) render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB); if(srl->passflag & SCE_PASS_MIST) @@ -935,12 +927,16 @@ static int read_render_result_from_file(char *filename, RenderResult *rr) int rectx, recty; if(IMB_exr_begin_read(exrhandle, filename, &rectx, &recty)==0) { + printf("failed being read %s\n", filename); IMB_exr_close(exrhandle); return 0; } - + if(rr == NULL || rectx!=rr->rectx || recty!=rr->recty) { - printf("error in reading render result\n"); + if(rr) + printf("error in reading render result: dimensions don't match\n"); + else + printf("error in reading render result: NULL result pointer\n"); IMB_exr_close(exrhandle); return 0; } @@ -994,38 +990,15 @@ static void read_render_result(Render *re, int sample) /* *************************************************** */ -void RE_SetViewSlot(int slot) -{ - RenderGlobal.viewslot = slot; -} - -int RE_GetViewSlot(void) -{ - return RenderGlobal.viewslot; -} - -static int re_get_slot(int slot) -{ - if(slot == RE_SLOT_VIEW) - return RenderGlobal.viewslot; - else if(slot == RE_SLOT_RENDERING) - return (G.rendering)? RenderGlobal.renderingslot: RenderGlobal.viewslot; - - return slot; -} - -Render *RE_GetRender(const char *name, int slot) +Render *RE_GetRender(const char *name) { Render *re; - slot= re_get_slot(slot); - /* search for existing renders */ - for(re= RenderGlobal.renderlist.first; re; re= re->next) { - if(strncmp(re->name, name, RE_MAXNAME)==0 && re->slot==slot) { + for(re= RenderGlobal.renderlist.first; re; re= re->next) + if(strncmp(re->name, name, RE_MAXNAME)==0) break; - } - } + return re; } @@ -1050,6 +1023,15 @@ RenderResult *RE_AcquireResultWrite(Render *re) return NULL; } +void RE_SwapResult(Render *re, RenderResult **rr) +{ + /* for keeping render buffers */ + if(re) { + SWAP(RenderResult*, re->result, *rr); + } +} + + void RE_ReleaseResult(Render *re) { if(re) @@ -1102,6 +1084,9 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr) if(rr->rectz==NULL) rr->rectz= RE_RenderLayerGetPass(rl, SCE_PASS_Z); } + + rr->have_combined= (re->result->rectf != NULL); + rr->layers= re->result->layers; } } } @@ -1158,21 +1143,18 @@ RenderStats *RE_GetStats(Render *re) return &re->i; } -Render *RE_NewRender(const char *name, int slot) +Render *RE_NewRender(const char *name) { Render *re; - slot= re_get_slot(slot); - /* only one render per name exists */ - re= RE_GetRender(name, slot); + re= RE_GetRender(name); if(re==NULL) { /* new render data struct */ re= MEM_callocN(sizeof(Render), "new render"); BLI_addtail(&RenderGlobal.renderlist, re); strncpy(re->name, name, RE_MAXNAME); - re->slot= slot; BLI_rw_mutex_init(&re->resultmutex); } @@ -1180,7 +1162,7 @@ Render *RE_NewRender(const char *name, int slot) re->display_init= result_nothing; re->display_clear= result_nothing; re->display_draw= result_rcti_nothing; - re->timecursor= int_nothing; + re->progress= float_nothing; re->test_break= default_break; re->error= print_error; if(G.background) @@ -1188,7 +1170,7 @@ Render *RE_NewRender(const char *name, int slot) else re->stats_draw= stats_nothing; /* clear callback handles */ - re->dih= re->dch= re->ddh= re->sdh= re->tch= re->tbh= re->erh= NULL; + re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL; /* init some variables */ re->ycor= 1.0f; @@ -1289,7 +1271,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer * int index = BLI_findindex(&re->r.layers, srl); if (index != -1) { re->r.actlay = index; - re->r.scemode |= (R_SINGLE_LAYER|R_COMP_RERENDER); + re->r.scemode |= R_SINGLE_LAYER; } } @@ -1320,6 +1302,8 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer * /* we clip faces with a minimum of 2 pixel boundary outside of image border. see zbuf.c */ re->clipcrop= 1.0f + 2.0f/(float)(re->winx>re->winy?re->winy:re->winx); + re->mblur_offs = re->field_offs = 0.f; + RE_init_threadcount(re); } @@ -1392,10 +1376,10 @@ void RE_stats_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderSt re->stats_draw= f; re->sdh= handle; } -void RE_timecursor_cb(Render *re, void *handle, void (*f)(void *handle, int)) +void RE_progress_cb(Render *re, void *handle, void (*f)(void *handle, float)) { - re->timecursor= f; - re->tch= handle; + re->progress= f; + re->prh= handle; } void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle)) @@ -1488,61 +1472,6 @@ static void *do_part_thread(void *pa_v) return NULL; } -/* returns with render result filled, not threaded, used for preview now only */ -static void render_tile_processor(Render *re, int firsttile) -{ - RenderPart *pa; - - if(re->test_break(re->tbh)) - return; - - BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); - - /* hrmf... exception, this is used for preview render, re-entrant, so render result has to be re-used */ - if(re->result==NULL || re->result->layers.first==NULL) { - if(re->result) RE_FreeRenderResult(re->result); - re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM); - } - - BLI_rw_mutex_unlock(&re->resultmutex); - - re->stats_draw(re->sdh, &re->i); - - if(re->result==NULL) - return; - - initparts(re); - - /* assuming no new data gets added to dbase... */ - R= *re; - - for(pa= re->parts.first; pa; pa= pa->next) { - if(firsttile) { - re->i.partsdone++; /* was reset in initparts */ - firsttile--; - } - else { - do_part_thread(pa); - - if(pa->result) { - if(!re->test_break(re->tbh)) { - if(render_display_draw_enabled(re)) - re->display_draw(re->ddh, pa->result, NULL); - - re->i.partsdone++; - re->stats_draw(re->sdh, &re->i); - } - RE_FreeRenderResult(pa->result); - pa->result= NULL; - } - if(re->test_break(re->tbh)) - break; - } - } - - freeparts(re); -} - /* calculus for how much 1 pixel rendered should rotate the 3d geometry */ /* is not that simple, needs to be corrected for errors of larger viewplane sizes */ /* called in initrender.c, initparts() and convertblender.c, for speedvectors */ @@ -1650,7 +1579,7 @@ static void print_part_stats(Render *re, RenderPart *pa) { char str[64]; - sprintf(str, "Part %d-%d", pa->nr, re->i.totpart); + sprintf(str, "%s, Part %d-%d", re->scene->id.name+2, pa->nr, re->i.totpart); re->i.infostr= str; re->stats_draw(re->sdh, &re->i); re->i.infostr= NULL; @@ -1767,6 +1696,7 @@ static void threaded_tile_processor(Render *re) free_render_result(&pa->fullresult, pa->result); pa->result= NULL; re->i.partsdone++; + re->progress(re->prh, re->i.partsdone / (float)re->i.totpart); hasdrawn= 1; } } @@ -1816,53 +1746,31 @@ static void threaded_tile_processor(Render *re) } /* currently only called by preview renders and envmap */ -void RE_TileProcessor(Render *re, int firsttile, int threaded) +void RE_TileProcessor(Render *re) { - /* the partsdone variable has to be reset to firsttile, to survive esc before it was set to zero */ - - re->i.partsdone= firsttile; - - if(!re->sss_points) - re->i.starttime= PIL_check_seconds_timer(); - - if(threaded) - threaded_tile_processor(re); - else - render_tile_processor(re, firsttile); - - if(!re->sss_points) - re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime; - re->stats_draw(re->sdh, &re->i); + threaded_tile_processor(re); } - /* ************ This part uses API, for rendering Blender scenes ********** */ -static void external_render_3d(Render *re, RenderEngineType *type); +static int external_render_3d(Render *re, int do_all); static void do_render_3d(Render *re) { - RenderEngineType *type; - /* try external */ - for(type=R_engines.first; type; type=type->next) - if(strcmp(type->idname, re->r.engine) == 0) - break; - - if(type && type->render) { - external_render_3d(re, type); + if(external_render_3d(re, 0)) return; - } /* internal */ // re->cfra= cfra; /* <- unused! */ + re->scene->r.subframe = re->mblur_offs + re->field_offs; /* make render verts/faces/halos/lamps */ if(render_scene_needs_vector(re)) - RE_Database_FromScene_Vectors(re, re->scene); + RE_Database_FromScene_Vectors(re, re->scene, re->lay); else - RE_Database_FromScene(re, re->scene, 1); + RE_Database_FromScene(re, re->scene, re->lay, 1); threaded_tile_processor(re); @@ -1873,6 +1781,8 @@ static void do_render_3d(Render *re) /* free all render verts etc */ RE_Database_Free(re); + + re->scene->r.subframe = 0.f; } /* called by blur loop, accumulate RGBA key alpha */ @@ -1972,7 +1882,7 @@ static void do_render_blur_3d(Render *re) /* do the blur steps */ while(blur--) { - set_mblur_offs( re->r.blurfac*((float)(re->r.mblur_samples-blur))/(float)re->r.mblur_samples ); + re->mblur_offs = re->r.blurfac*((float)(re->r.mblur_samples-blur))/(float)re->r.mblur_samples; re->i.curblur= re->r.mblur_samples-blur; /* stats */ @@ -1990,7 +1900,7 @@ static void do_render_blur_3d(Render *re) re->result= rres; BLI_rw_mutex_unlock(&re->resultmutex); - set_mblur_offs(0.0f); + re->mblur_offs = 0.0f; re->i.curblur= 0; /* stats */ /* weak... the display callback wants an active renderlayer pointer... */ @@ -2070,15 +1980,17 @@ static void do_render_fields_3d(Render *re) re->i.curfield= 2; /* stats */ re->flag |= R_SEC_FIELD; - if((re->r.mode & R_FIELDSTILL)==0) - set_field_offs(0.5f); + if((re->r.mode & R_FIELDSTILL)==0) { + re->field_offs = 0.5f; + } RE_SetCamera(re, re->scene->camera); if(re->r.mode & R_MBLUR) do_render_blur_3d(re); else do_render_3d(re); re->flag &= ~R_SEC_FIELD; - set_field_offs(0.0f); + + re->field_offs = 0.0f; rr2= re->result; } @@ -2120,8 +2032,8 @@ static void load_backbuffer(Render *re) char name[256]; strcpy(name, re->r.backbuf); - BLI_convertstringcode(name, G.sce); - BLI_convertstringframe(name, re->r.cfra, 0); + BLI_path_abs(name, G.sce); + BLI_path_frame(name, re->r.cfra, 0); if(re->backbuf) { re->backbuf->id.us--; @@ -2215,7 +2127,7 @@ static void do_render_fields_blur_3d(Render *re) */ static void render_scene(Render *re, Scene *sce, int cfra) { - Render *resc= RE_NewRender(sce->id.name, RE_SLOT_RENDERING); + Render *resc= RE_NewRender(sce->id.name); int winx= re->winx, winy= re->winy; sce->r.cfra= cfra; @@ -2231,6 +2143,7 @@ static void render_scene(Render *re, Scene *sce, int cfra) /* still unsure entity this... */ resc->scene= sce; + resc->lay= sce->lay; /* ensure scene has depsgraph, base flags etc OK */ set_scene_bg(sce); @@ -2463,38 +2376,40 @@ static void do_render_composite_fields_blur_3d(Render *re) ntreeCompositTagAnimated(ntree); } - if(1 || !(re->r.scemode & R_COMP_RERENDER)) { - if(ntree && re->r.scemode & R_DOCOMP) { - /* checks if there are render-result nodes that need scene */ - if((re->r.scemode & R_SINGLE_LAYER)==0) - ntree_render_scenes(re); + if(ntree && re->r.scemode & R_DOCOMP) { + /* checks if there are render-result nodes that need scene */ + if((re->r.scemode & R_SINGLE_LAYER)==0) + ntree_render_scenes(re); + + if(!re->test_break(re->tbh)) { + ntree->stats_draw= render_composit_stats; + ntree->test_break= re->test_break; + ntree->progress= re->progress; + ntree->sdh= re->sdh; + ntree->tbh= re->tbh; + ntree->prh= re->prh; - if(!re->test_break(re->tbh)) { - ntree->stats_draw= render_composit_stats; - ntree->test_break= re->test_break; - ntree->sdh= re->sdh; - ntree->tbh= re->tbh; - /* in case it was never initialized */ - R.sdh= re->sdh; - R.stats_draw= re->stats_draw; - - if (update_newframe) - scene_update_for_newframe(re->scene, re->scene->lay); - - if(re->r.scemode & R_FULL_SAMPLE) - do_merge_fullsample(re, ntree); - else { - ntreeCompositExecTree(ntree, &re->r, G.background==0); - } - - ntree->stats_draw= NULL; - ntree->test_break= NULL; - ntree->tbh= ntree->sdh= NULL; + /* in case it was never initialized */ + R.sdh= re->sdh; + R.stats_draw= re->stats_draw; + + if (update_newframe) + scene_update_for_newframe(re->scene, re->lay); + + if(re->r.scemode & R_FULL_SAMPLE) + do_merge_fullsample(re, ntree); + else { + ntreeCompositExecTree(ntree, &re->r, G.background==0); } + + ntree->stats_draw= NULL; + ntree->test_break= NULL; + ntree->progress= NULL; + ntree->tbh= ntree->sdh= ntree->prh= NULL; } - else if(re->r.scemode & R_FULL_SAMPLE) - do_merge_fullsample(re, NULL); } + else if(re->r.scemode & R_FULL_SAMPLE) + do_merge_fullsample(re, NULL); } /* weak... the display callback wants an active renderlayer pointer... */ @@ -2505,7 +2420,7 @@ static void do_render_composite_fields_blur_3d(Render *re) static void renderresult_stampinfo(Scene *scene) { RenderResult rres; - Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING); + Render *re= RE_GetRender(scene->id.name); /* this is the basic trick to get the displayed float or char rect from render result */ RE_AcquireResultImage(re, &rres); @@ -2513,6 +2428,24 @@ static void renderresult_stampinfo(Scene *scene) RE_ReleaseResultImage(re); } +static int seq_render_active(Render *re) +{ + Editing *ed; + Sequence *seq; + + ed = re->scene->ed; + + if (!(re->r.scemode & R_DOSEQ) || !ed || !ed->seqbase.first) + return 0; + + for (seq= ed->seqbase.first; seq; seq= seq->next) { + if (seq->type != SEQ_SOUND) + return 1; + } + + return 0; +} + static void do_render_seq(Render * re) { static int recurs_depth = 0; @@ -2522,7 +2455,7 @@ static void do_render_seq(Render * re) if(recurs_depth==0) { /* otherwise sequencer animation isnt updated */ - BKE_animsys_evaluate_all_animation(G.main, (float)cfra); // XXX, was frame_to_float(re->scene, cfra) + BKE_animsys_evaluate_all_animation(G.main, (float)cfra); // XXX, was BKE_curframe(re->scene) } recurs_depth++; @@ -2537,8 +2470,21 @@ static void do_render_seq(Render * re) if(ibuf->rect_float) { if (!rr->rectf) rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf"); - + memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty); + + /* sequencer float buffer is not in linear color space, convert + * should always be true, use a fake ibuf for the colorspace conversion */ + if(ibuf->profile != IB_PROFILE_LINEAR_RGB) { + ImBuf ibuf_dummy; + memset(&ibuf_dummy, 0, sizeof(ImBuf)); + ibuf_dummy.profile= ibuf->profile; + ibuf_dummy.x= rr->rectx; + ibuf_dummy.y= rr->recty; + ibuf_dummy.rect_float= rr->rectf; + /* only touch the rr->rectf */ + IMB_convert_profile(&ibuf_dummy, IB_PROFILE_LINEAR_RGB); + } /* TSK! Since sequence render doesn't free the *rr render result, the old rect32 can hang around when sequence render has rendered a 32 bits one before */ @@ -2584,18 +2530,17 @@ static void do_render_seq(Render * re) /* main loop: doing sequence + fields + blur + 3d render + compositing */ static void do_render_all_options(Render *re) { -#ifdef DURIAN_CAMERA_SWITCH - Object *camera= scene_find_camera_switch(re->scene); - if(camera) - re->scene->camera= camera; -#endif + scene_camera_switch_update(re->scene); re->i.starttime= PIL_check_seconds_timer(); /* ensure no images are in memory from previous animated sequences */ BKE_image_all_free_anim_ibufs(re->r.cfra); - - if((re->r.scemode & R_DOSEQ) && re->scene->ed && re->scene->ed->seqbase.first) { + + if(external_render_3d(re, 1)) { + /* in this case external render overrides all */ + } + else if(seq_render_active(re)) { /* note: do_render_seq() frees rect32 when sequencer returns float images */ if(!re->test_break(re->tbh)) do_render_seq(re); @@ -2693,7 +2638,7 @@ static int is_rendering_allowed(Render *re) } } - /* check valid camera, without camera render is OK (compo, seq) */ + /* check valid camera, without camera render is OK (compo, seq) */ if(re->scene->camera==NULL) re->scene->camera= scene_find_camera(re->scene); @@ -2744,7 +2689,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init) BKE_ptcache_make_cache(&baker); } /* evaluating scene options for general Blender render */ -static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, int anim, int anim_init) +static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init) { int winx, winy; rcti disprect; @@ -2771,6 +2716,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLay } re->scene= scene; + re->lay= lay; /* not too nice, but it survives anim-border render */ if(anim) { @@ -2811,23 +2757,20 @@ static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLay } /* general Blender frame render call */ -void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, int frame) +void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame) { /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */ - RenderGlobal.renderingslot= re->slot; - re->result_ok= 0; G.rendering= 1; scene->r.cfra= frame; - if(render_initialize_from_scene(re, scene, srl, 0, 0)) { + if(render_initialize_from_scene(re, scene, srl, lay, 0, 0)) { + MEM_reset_peak_memory(); do_render_all_options(re); } - + /* UGLY WARNING */ - re->result_ok= 1; G.rendering= 0; - RenderGlobal.renderingslot= RenderGlobal.viewslot; } static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports) @@ -2917,22 +2860,19 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R } /* saves images to disk */ -void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, ReportList *reports) +void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports) { bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype); - unsigned int lay; int cfrao= scene->r.cfra; int nfra; /* do not fully call for each frame, it initializes & pops output window */ - if(!render_initialize_from_scene(re, scene, NULL, 0, 1)) + if(!render_initialize_from_scene(re, scene, NULL, lay, 0, 1)) return; /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */ /* is also set by caller renderwin.c */ G.rendering= 1; - RenderGlobal.renderingslot= re->slot; - re->result_ok= 0; if(BKE_imtype_is_movie(scene->r.imtype)) if(!mh->start_movie(scene, &re->r, re->rectx, re->recty, reports)) @@ -2960,7 +2900,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo char name[FILE_MAX]; /* only border now, todo: camera lens. (ton) */ - render_initialize_from_scene(re, scene, NULL, 1, 0); + render_initialize_from_scene(re, scene, NULL, lay, 1, 0); if(nfra!=scene->r.cfra) { /* @@ -2968,12 +2908,14 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo * From convertblender.c: * in localview, lamps are using normal layers, objects only local bits. */ - if(scene->lay & 0xFF000000) - lay= scene->lay & 0xFF000000; - else - lay= scene->lay; + unsigned int updatelay; - scene_update_for_newframe(scene, lay); + if(re->lay & 0xFF000000) + updatelay= re->lay & 0xFF000000; + else + updatelay= re->lay; + + scene_update_for_newframe(scene, updatelay); continue; } else @@ -3024,11 +2966,26 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo mh->end_movie(); scene->r.cfra= cfrao; - + /* UGLY WARNING */ G.rendering= 0; - re->result_ok= 1; - RenderGlobal.renderingslot= RenderGlobal.viewslot; +} + +void RE_PreviewRender(Render *re, Scene *sce) +{ + int winx, winy; + + winx= (sce->r.size*sce->r.xsch)/100; + winy= (sce->r.size*sce->r.ysch)/100; + + RE_InitState(re, NULL, &sce->r, NULL, winx, winy, NULL); + + re->scene = sce; + re->lay = sce->lay; + + RE_SetCamera(re, sce->camera); + + do_render_3d(re); } /* note; repeated win/disprect calc... solve that nicer, also in compo */ @@ -3062,9 +3019,9 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode) scene= scenode; /* get render: it can be called from UI with draw callbacks */ - re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); + re= RE_GetRender(scene->id.name); if(re==NULL) - re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); + re= RE_NewRender(scene->id.name); RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect); re->scene= scene; @@ -3236,10 +3193,24 @@ void RE_result_load_from_file(RenderResult *result, ReportList *reports, char *f } } -static void external_render_3d(Render *re, RenderEngineType *type) +static int external_render_3d(Render *re, int do_all) { + RenderEngineType *type; RenderEngine engine; + for(type=R_engines.first; type; type=type->next) + if(strcmp(type->idname, re->r.engine) == 0) + break; + + if(!(type && type->render)) + return 0; + if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_DO_PREVIEW)) + return 0; + if(do_all && !(type->flag & RE_DO_ALL)) + return 0; + if(!do_all && (type->flag & RE_DO_ALL)) + return 0; + BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); if(re->result==NULL || !(re->r.scemode & R_PREVIEWBUTS)) { RE_FreeRenderResult(re->result); @@ -3252,7 +3223,7 @@ static void external_render_3d(Render *re, RenderEngineType *type) BLI_rw_mutex_unlock(&re->resultmutex); if(re->result==NULL) - return; + return 1; /* external */ memset(&engine, 0, sizeof(engine)); @@ -3280,5 +3251,7 @@ static void external_render_3d(Render *re, RenderEngineType *type) read_render_result(re, 0); } BLI_rw_mutex_unlock(&re->resultmutex); + + return 1; } diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c index 683c6323fb2..8ff35bc9bae 100644 --- a/source/blender/render/intern/source/pixelblending.c +++ b/source/blender/render/intern/source/pixelblending.c @@ -74,8 +74,8 @@ extern struct Render R; void addAlphaOverFloat(float *dest, float *source) { - /* d = s + (1-alpha_s)d*/ - float mul; + /* d = s + (1-alpha_s)d*/ + float mul; mul= 1.0 - source[3]; @@ -91,7 +91,7 @@ void addAlphaOverFloat(float *dest, float *source) void addAlphaUnderFloat(float *dest, float *source) { - float mul; + float mul; mul= 1.0 - dest[3]; @@ -105,41 +105,41 @@ void addAlphaUnderFloat(float *dest, float *source) /* ------------------------------------------------------------------------- */ void addalphaAddfacFloat(float *dest, float *source, char addfac) { - float m; /* weiging factor of destination */ - float c; /* intermediate color */ + float m; /* weiging factor of destination */ + float c; /* intermediate color */ - /* Addfac is a number between 0 and 1: rescale */ - /* final target is to diminish the influence of dest when addfac rises */ - m = 1.0 - ( source[3] * ((255.0 - addfac) / 255.0)); + /* Addfac is a number between 0 and 1: rescale */ + /* final target is to diminish the influence of dest when addfac rises */ + m = 1.0 - ( source[3] * ((255.0 - addfac) / 255.0)); - /* blend colors*/ - c= (m * dest[0]) + source[0]; + /* blend colors*/ + c= (m * dest[0]) + source[0]; #ifdef RE_FLOAT_COLOR_CLIPPING - if(c >= RE_FULL_COLOR_FLOAT) dest[0] = RE_FULL_COLOR_FLOAT; - else + if(c >= RE_FULL_COLOR_FLOAT) dest[0] = RE_FULL_COLOR_FLOAT; + else #endif - dest[0]= c; + dest[0]= c; - c= (m * dest[1]) + source[1]; + c= (m * dest[1]) + source[1]; #ifdef RE_FLOAT_COLOR_CLIPPING - if(c >= RE_FULL_COLOR_FLOAT) dest[1] = RE_FULL_COLOR_FLOAT; - else + if(c >= RE_FULL_COLOR_FLOAT) dest[1] = RE_FULL_COLOR_FLOAT; + else #endif - dest[1]= c; + dest[1]= c; - c= (m * dest[2]) + source[2]; + c= (m * dest[2]) + source[2]; #ifdef RE_FLOAT_COLOR_CLIPPING - if(c >= RE_FULL_COLOR_FLOAT) dest[2] = RE_FULL_COLOR_FLOAT; - else + if(c >= RE_FULL_COLOR_FLOAT) dest[2] = RE_FULL_COLOR_FLOAT; + else #endif - dest[2]= c; + dest[2]= c; c= (m * dest[3]) + source[3]; #ifdef RE_ALPHA_CLIPPING if(c >= RE_FULL_COLOR_FLOAT) dest[3] = RE_FULL_COLOR_FLOAT; else #endif - dest[3]= c; + dest[3]= c; } diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c index 69e1f1103e2..768fc4ecacb 100644 --- a/source/blender/render/intern/source/pixelshading.c +++ b/source/blender/render/intern/source/pixelshading.c @@ -285,14 +285,14 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz, int a; if(R.wrld.mode & WO_MIST) { - if(har->type & HA_ONLYSKY) { - /* stars but no mist */ - alpha= har->alfa; - } - else { - /* a bit patchy... */ - alpha= mistfactor(-har->co[2], har->co)*har->alfa; - } + if(har->type & HA_ONLYSKY) { + /* stars but no mist */ + alpha= har->alfa; + } + else { + /* a bit patchy... */ + alpha= mistfactor(-har->co[2], har->co)*har->alfa; + } } else alpha= har->alfa; diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index aa24333c14b..4f23df3c18c 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -39,6 +39,7 @@ #include "BKE_main.h" #include "BKE_object.h" #include "BKE_particle.h" +#include "BKE_scene.h" #include "BKE_texture.h" #include "DNA_meshdata_types.h" @@ -95,7 +96,7 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa ParticleKey state; ParticleSimulationData sim = {re->scene, ob, psys, NULL}; ParticleData *pa=NULL; - float cfra = bsystem_time(re->scene, ob, (float)re->scene->r.cfra, 0.0); + float cfra = BKE_curframe(re->scene); int i, childexists; int total_particles, offset=0; int data_used = point_data_used(pd); @@ -142,9 +143,7 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa if (pd->psys_cache_space == TEX_PD_OBJECTSPACE) mul_m4_v3(ob->imat, partco); else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) { - float obloc[3]; - VECCOPY(obloc, ob->loc); - sub_v3_v3v3(partco, partco, obloc); + sub_v3_v3(partco, ob->loc); } else { /* TEX_PD_WORLDSPACE */ } @@ -209,7 +208,7 @@ static void pointdensity_cache_object(Render *re, PointDensity *pd, Object *ob) break; case TEX_PD_OBJECTLOC: mul_m4_v3(ob->obmat, co); - sub_v3_v3v3(co, co, ob->loc); + sub_v3_v3(co, ob->loc); break; case TEX_PD_WORLDSPACE: default: @@ -306,12 +305,12 @@ void free_pointdensities(Render *re) typedef struct PointDensityRangeData { - float *density; - float squared_radius; - float *point_data; + float *density; + float squared_radius; + float *point_data; float *vec; float softness; - short falloff_type; + short falloff_type; short noise_influence; float *age; int point_data_used; diff --git a/source/blender/render/intern/source/rayobject_instance.c b/source/blender/render/intern/source/rayobject_instance.c index cb0dc6f8ce0..a3e062c01c6 100644 --- a/source/blender/render/intern/source/rayobject_instance.c +++ b/source/blender/render/intern/source/rayobject_instance.c @@ -143,6 +143,13 @@ static int RE_rayobject_instance_intersect(RayObject *o, Isect *isec) { isec->labda *= dist / isec->dist; isec->hit.ob = obj->ob; + +#ifdef RT_USE_LAST_HIT + // TODO support for last hit optimization in instances that can jump + // directly to the last hit face. + // For now it jumps directly to the last-hit instance root node. + isec->last_hit = RE_rayobject_unalignRayAPI((RayObject*) obj); +#endif } isec->dist = dist; VECCOPY( isec->start, start ); diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 9c589ee1b64..ed52f37fcfa 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -41,9 +41,10 @@ #include "BKE_node.h" #include "BKE_utildefines.h" -#include "BLI_math.h" #include "BLI_blenlib.h" +#include "BLI_cpu.h" #include "BLI_jitter.h" +#include "BLI_math.h" #include "BLI_rand.h" #include "PIL_time.h" @@ -98,7 +99,7 @@ RayObject* RE_rayobject_create(Render *re, int type, int size) //TODO //if(detect_simd()) #ifdef __SSE__ - type = R_RAYSTRUCTURE_SIMD_SVBVH; + type = BLI_cpu_support_sse2()? R_RAYSTRUCTURE_SIMD_SVBVH: R_RAYSTRUCTURE_VBVH; #else type = R_RAYSTRUCTURE_VBVH; #endif @@ -240,7 +241,9 @@ RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi) if(is_raytraceable_vlr(re, vlr)) faces++; } - assert( faces > 0 ); + + if (faces == 0) + return NULL; //Create Ray cast accelaration structure raytree = RE_rayobject_create( re, re->r.raytrace_structure, faces ); @@ -370,7 +373,12 @@ static void makeraytree_single(Render *re) if(has_special_rayobject(re, obi)) { RayObject *obj = makeraytree_object(re, obi); - RE_rayobject_add( re->raytree, obj ); + + if(test_break(re)) + break; + + if (obj) + RE_rayobject_add( re->raytree, obj ); } else { @@ -1310,7 +1318,7 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr) /* and perturb the refraction vector in it */ add_v3_v3v3(v_refract_new, v_refract, orthx); - add_v3_v3v3(v_refract_new, v_refract_new, orthy); + add_v3_v3(v_refract_new, orthy); normalize_v3(v_refract_new); } else { @@ -1405,7 +1413,7 @@ static void trace_reflect(float *col, ShadeInput *shi, ShadeResult *shr, float f /* and perturb the normal in it */ add_v3_v3v3(v_nor_new, shi->vn, orthx); - add_v3_v3v3(v_nor_new, v_nor_new, orthy); + add_v3_v3(v_nor_new, orthy); normalize_v3(v_nor_new); } else { /* no blurriness, use the original normal */ @@ -1728,7 +1736,7 @@ static void DS_energy(float *sphere, int tot, float *vec) } mul_v3_fl(res, 0.5); - add_v3_v3v3(vec, vec, res); + add_v3_v3(vec, res); normalize_v3(vec); } @@ -1856,7 +1864,7 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env) RE_RC_INIT(isec, *shi); isec.orig.ob = shi->obi; isec.orig.face = shi->vlr; - isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK | RE_SKIP_VLR_NON_SOLID_MATERIAL; + isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_NON_SOLID_MATERIAL; isec.hint = 0; isec.hit.ob = 0; diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 9afd7505d6c..8e1a959abef 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -486,9 +486,6 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset, case SCE_PASS_REFRACT: col= shr->refr; break; - case SCE_PASS_RADIO: - col= NULL; // removed shr->rad; - break; case SCE_PASS_NORMAL: col= shr->nor; break; @@ -593,9 +590,6 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult case SCE_PASS_REFRACT: col= shr->refr; break; - case SCE_PASS_RADIO: - col= NULL; // removed shr->rad; - break; case SCE_PASS_NORMAL: col= shr->nor; break; @@ -745,10 +739,15 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl) if(*zrect >= 9.9e10 || rgbrect[3]==0.0f) { continue; } - + if((lar->sunsky->effect_type & LA_SUN_EFFECT_AP)) { float tmp_rgb[3]; + /* skip if worldspace lamp vector is below horizon */ + if(go->ob->obmat[2][2] < 0.f) { + continue; + } + VECCOPY(tmp_rgb, rgbrect); if(rgbrect[3]!=1.0f) { /* de-premul */ float div= 1.0f/rgbrect[3]; @@ -1034,7 +1033,7 @@ void edge_enhance_tile(RenderPart *pa, float *rectf, int *rectz) static void reset_sky_speed(RenderPart *pa, RenderLayer *rl) { /* for all pixels with max speed, set to zero */ - RenderLayer *rlpp[RE_MAX_OSA]; + RenderLayer *rlpp[RE_MAX_OSA]; float *fp; int a, sample, totsample; @@ -1051,9 +1050,9 @@ static void reset_sky_speed(RenderPart *pa, RenderLayer *rl) static unsigned short *make_solid_mask(RenderPart *pa) { - intptr_t *rd= pa->rectdaps; - unsigned short *solidmask, *sp; - int x; + intptr_t *rd= pa->rectdaps; + unsigned short *solidmask, *sp; + int x; if(rd==NULL) return NULL; @@ -1098,7 +1097,7 @@ static void addAlphaOverFloatMask(float *dest, float *source, unsigned short dma dest[3]+= source[3]; return; - } + } dest[0]= (mul*dest[0]) + source[0]; dest[1]= (mul*dest[1]) + source[1]; @@ -2217,12 +2216,23 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int } else { char *col= (char *)(bs->rect + bs->rectx*y + x); - col[0]= FTOCHAR(shr.combined[0]); - col[1]= FTOCHAR(shr.combined[1]); - col[2]= FTOCHAR(shr.combined[2]); + + if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE) && (R.r.color_mgt_flag & R_COLOR_MANAGEMENT)) { + float srgb[3]; + srgb[0]= linearrgb_to_srgb(shr.combined[0]); + srgb[1]= linearrgb_to_srgb(shr.combined[1]); + srgb[2]= linearrgb_to_srgb(shr.combined[2]); + + col[0]= FTOCHAR(srgb[0]); + col[1]= FTOCHAR(srgb[1]); + col[2]= FTOCHAR(srgb[2]); + } else { + col[0]= FTOCHAR(shr.combined[0]); + col[1]= FTOCHAR(shr.combined[1]); + col[2]= FTOCHAR(shr.combined[2]); + } - - if (bs->type==RE_BAKE_ALL || bs->type==RE_BAKE_TEXTURE) { + if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE)) { col[3]= FTOCHAR(shr.alpha); } else { col[3]= 255; @@ -2261,21 +2271,8 @@ static void bake_displacement(void *handle, ShadeInput *shi, float dist, int x, } } -#if 0 -static int bake_check_intersect(Isect *is, int ob, RayFace *face) -{ - BakeShade *bs = (BakeShade*)is->userdata; - - /* no direction checking for now, doesn't always improve the result - * (INPR(shi->facenor, bs->dir) > 0.0f); */ - - return (R.objectinstance[ob & ~RE_RAY_TRANSFORM_OFFS].obr->ob != bs->actob); -} -#endif - static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, float *dir, float sign, float *hitco, float *dist) { - //TODO, validate against blender 2.4x, results may have changed. float maxdist; int hit; @@ -2283,7 +2280,7 @@ static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, f if(R.r.bake_maxdist > 0.0f) maxdist= R.r.bake_maxdist; else - maxdist= FLT_MAX + R.r.bake_biasdist; + maxdist= RE_RAYTRACE_MAXDIST + R.r.bake_biasdist; /* 'dir' is always normalized */ VECADDFAC(isect->start, start, dir, -R.r.bake_biasdist); @@ -2294,10 +2291,6 @@ static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, f isect->labda = maxdist; - /* TODO, 2.4x had this... - hit = RE_ray_tree_intersect_check(R.raytree, isect, bake_check_intersect); - ...the active object may NOT be ignored in some cases. - */ hit = RE_rayobject_raycast(raytree, isect); if(hit) { hitco[0] = isect->start[0] + isect->labda*isect->vec[0]; @@ -2427,7 +2420,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v) isec.orig.ob = obi; isec.orig.face = vlr; - isec.userdata= bs; + isec.userdata= bs->actob; + isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_BAKE_CHECK; if(bake_intersect_tree(R.raytree, &isec, shi->co, shi->vn, sign, co, &dist)) { if(!hit || len_v3v3(shi->co, co) < len_v3v3(shi->co, minco)) { @@ -2625,9 +2619,9 @@ static void *do_bake_thread(void *bs_v) /* using object selection tags, the faces with UV maps get baked */ /* render should have been setup */ /* returns 0 if nothing was handled */ -int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_update) +int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_update, float *progress) { - BakeShade handles[BLENDER_MAX_THREADS]; + BakeShade *handles; ListBase threads; Image *ima; int a, vdone=0, usemask=0; @@ -2640,25 +2634,28 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up get_next_bake_face(NULL); /* do we need a mask? */ - if (re->r.bake_filter && (re->r.bake_flag & R_BAKE_CLEAR)==0) + if (re->r.bake_filter) usemask = 1; /* baker uses this flag to detect if image was initialized */ for(ima= G.main->image.first; ima; ima= ima->id.next) { ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); ima->id.flag |= LIB_DOIT; - if (ibuf) + if(ibuf) { ibuf->userdata = NULL; /* use for masking if needed */ + if(ibuf->rect_float) + ibuf->profile = IB_PROFILE_LINEAR_RGB; + } } BLI_init_threads(&threads, do_bake_thread, re->r.threads); + handles= MEM_callocN(sizeof(BakeShade)*re->r.threads, "BakeShade"); + /* get the threads running */ for(a=0; ar.threads; a++) { /* set defaults in handles */ - memset(&handles[a], 0, sizeof(BakeShade)); - - handles[a].ssamp.shi[0].lay= re->scene->lay; + handles[a].ssamp.shi[0].lay= re->lay; if (type==RE_BAKE_SHADOW) { handles[a].ssamp.shi[0].passflag= SCE_PASS_SHADOW; @@ -2683,19 +2680,29 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up /* wait for everything to be done */ a= 0; while(a!=re->r.threads) { - PIL_sleep_ms(50); - for(a=0; ar.threads; a++) + /* calculate progress */ + for(vdone=0, a=0; ar.threads; a++) + vdone+= handles[a].vdone; + if (progress) + *progress = (float)(vdone / (float)re->totvlak); + + for(a=0; ar.threads; a++) { if(handles[a].ready==0) break; + } } /* filter and refresh images */ for(ima= G.main->image.first; ima; ima= ima->id.next) { if((ima->id.flag & LIB_DOIT)==0) { ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); - if (re->r.bake_filter) { + + if(!ibuf) + continue; + + if(re->r.bake_filter) { if (usemask) { /* extend the mask +2 pixels from the image, * this is so colors dont blend in from outside */ @@ -2725,20 +2732,22 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up ibuf->userdata= NULL; } } + ibuf->userflags |= IB_BITMAPDIRTY; if (ibuf->rect_float) IMB_rect_from_float(ibuf); } } /* calculate return value */ - for(a=0; ar.threads; a++) { - vdone+= handles[a].vdone; - + for(a=0; ar.threads; a++) { zbuf_free_span(handles[a].zspan); MEM_freeN(handles[a].zspan); - } + } + + MEM_freeN(handles); BLI_end_threads(&threads); + return vdone; } diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c index 954ff373c89..7101ce5daaf 100644 --- a/source/blender/render/intern/source/shadbuf.c +++ b/source/blender/render/intern/source/shadbuf.c @@ -945,13 +945,13 @@ static int firstreadshadbuf(ShadBuf *shb, ShadSampleBuf *shsample, int **rz, int ofs= (ys>>4)*(shb->size>>4) + (xs>>4); ct= shsample->cbuf+ofs; if(*ct==0) { - if(nr==0) { + if(nr==0) { *rz= *( (int **)(shsample->zbuf+ofs) ); return 1; - } + } else if(*rz!= *( (int **)(shsample->zbuf+ofs) )) return 0; - return 1; + return 1; } return 0; @@ -1071,7 +1071,7 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int else { /* got warning on this for 64 bits.... */ /* but it's working code! in this case rz is not a pointer but zvalue (ton) */ - zsamp= GET_INT_FROM_POINTER(rz); + zsamp= GET_INT_FROM_POINTER(rz); } /* tricky stuff here; we use ints which can overflow easily with bias values */ @@ -1174,7 +1174,7 @@ float testshadowbuf(Render *re, ShadBuf *shb, float *co, float *dxco, float *dyc /* in case we have a constant value in a tile, we can do quicker lookup */ if(xres<16.0f && yres<16.0f) { shsample= shb->buffers.first; - if(firstreadshadbuf(shb, shsample, &rz, (int)xs1, (int)ys1, 0)) { + if(firstreadshadbuf(shb, shsample, &rz, (int)xs1, (int)ys1, 0)) { if(firstreadshadbuf(shb, shsample, &rz, (int)(xs1+xres), (int)ys1, 1)) { if(firstreadshadbuf(shb, shsample, &rz, (int)xs1, (int)(ys1+yres), 1)) { if(firstreadshadbuf(shb, shsample, &rz, (int)(xs1+xres), (int)(ys1+yres), 1)) { @@ -1182,7 +1182,7 @@ float testshadowbuf(Render *re, ShadBuf *shb, float *co, float *dxco, float *dyc } } } - } + } } /* full jittered shadow buffer lookup */ @@ -1255,7 +1255,7 @@ static float readshadowbuf_halo(ShadBuf *shb, ShadSampleBuf *shsample, int xs, i else { /* same as before */ /* still working code! (ton) */ - zsamp= GET_INT_FROM_POINTER(rz); + zsamp= GET_INT_FROM_POINTER(rz); } /* NO schadow when sampled at 'eternal' distance */ @@ -2204,7 +2204,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar) isbdata->recty= pa->recty; /* branches are added using memarena (32k branches) */ - memarena = BLI_memarena_new(0x8000 * sizeof(ISBBranch)); + memarena = BLI_memarena_new(0x8000 * sizeof(ISBBranch), "isb arena"); BLI_memarena_use_calloc(memarena); /* samplebuf is in camera view space (pixels) */ @@ -2300,7 +2300,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar) if(R.osa) { ISBShadfacA **isbsa= isbdata->shadfaca= MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs"); - isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA)); + isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA), "isb arena"); BLI_memarena_use_calloc(isbdata->memarena); for(rd= pa->rectdaps, x=pa->rectx*pa->recty; x>0; x--, rd++, isbsa++) { @@ -2412,7 +2412,7 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la isbdata->recty= pa->recty; /* branches are added using memarena (32k branches) */ - memarena = BLI_memarena_new(0x8000 * sizeof(ISBBranch)); + memarena = BLI_memarena_new(0x8000 * sizeof(ISBBranch), "isb arena"); BLI_memarena_use_calloc(memarena); /* samplebuf is in camera view space (pixels) */ @@ -2503,7 +2503,7 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la /* copy shadow samples to persistant buffer, reduce memory overhead */ isbsa= isbdata->shadfaca= MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs"); - isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA)); + isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA), "isb arena"); for(ap= apixbuf, x=pa->rectx*pa->recty; x>0; x--, ap++, isbsa++) { diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 60d003f3c21..5938e2ce2e0 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -1,5 +1,5 @@ /** -* $Id: +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -176,7 +176,7 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) } /* copy additional passes */ - if(shi->passflag & (SCE_PASS_VECTOR|SCE_PASS_NORMAL|SCE_PASS_RADIO)) { + if(shi->passflag & (SCE_PASS_VECTOR|SCE_PASS_NORMAL)) { QUATCOPY(shr->winspeed, shi->winspeed); VECCOPY(shr->nor, shi->vn); } @@ -276,11 +276,6 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen /* facenormal copy, can get flipped */ shi->flippednor= RE_vlakren_get_normal(&R, obi, vlr, shi->facenor); - /* copy of original pre-flipped normal, for geometry->front/back node output */ - VECCOPY(shi->orignor, shi->facenor); - if(shi->flippednor) - VECMUL(shi->orignor, -1.0f); - /* calculate vertexnormals */ if(vlr->flag & R_SMOOTH) { VECCOPY(shi->n1, shi->v1->n); @@ -372,7 +367,6 @@ void shade_input_set_strand(ShadeInput *shi, StrandRen *strand, StrandPoint *spo /* facenormal, simply viewco flipped */ VECCOPY(shi->facenor, spoint->nor); - VECCOPY(shi->orignor, shi->facenor); /* shade_input_set_normals equivalent */ if(shi->mat->mode & MA_TANGENT_STR) { diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 8ba43c54fc6..033a753bd62 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1,5 +1,5 @@ /** -* $Id: +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -1515,7 +1515,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr) accum/= ir; shr->alpha= (shi->mat->alpha)*(1.0f-accum); } - else shr->alpha= shi->mat->alpha; + else shr->alpha= 0.f; } /* quite disputable this... also note it doesn't mirror-raytrace */ @@ -1754,13 +1754,6 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) shr->combined[0]+= shi->ambr; shr->combined[1]+= shi->ambg; shr->combined[2]+= shi->ambb; - - /* removed - if(shi->combinedflag & SCE_PASS_RADIO) { - shr->combined[0]+= shi->r*shi->amb*shi->rad[0]; - shr->combined[1]+= shi->g*shi->amb*shi->rad[1]; - shr->combined[2]+= shi->b*shi->amb*shi->rad[2]; - }*/ if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(shr->combined, shi); } diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c index bed75266767..aa285401524 100644 --- a/source/blender/render/intern/source/sss.c +++ b/source/blender/render/intern/source/sss.c @@ -31,11 +31,11 @@ - add fresnel terms - adapt Rd table to scale, now with small scale there are a lot of misses? - possible interesting method: perform sss on all samples in the tree, - and then use those values interpolated somehow later. can also do this + and then use those values interpolated somehow later. can also do this filtering on demand for speed. since we are doing things in screen space now there is an exact correspondence - avoid duplicate shading (filtering points in advance, irradiance cache - like lookup?) + like lookup?) - lower resolution samples */ @@ -196,13 +196,13 @@ static float compute_reduced_albedo(ScatterSettings *ss) if(xn_1 > 1.0f) xn_1= 1.0f; fxn= f_Rd(xn, ss->A, ss->ro); - } + } /* avoid division by zero later */ if(xn <= 0.0f) xn= 0.00001f; - return xn; + return xn; } /* Exponential falloff functions */ @@ -779,7 +779,7 @@ void scatter_tree_build(ScatterTree *tree) tmppoints= MEM_callocN(sizeof(ScatterPoint*)*totpoint, "ScatterTmpPoints"); tree->tmppoints= tmppoints; - tree->arena= BLI_memarena_new(0x8000 * sizeof(ScatterNode)); + tree->arena= BLI_memarena_new(0x8000 * sizeof(ScatterNode), "sss tree arena"); BLI_memarena_use_calloc(tree->arena); /* build tree */ @@ -878,7 +878,7 @@ static void sss_create_tree_mat(Render *re, Material *mat) re->result= NULL; BLI_rw_mutex_unlock(&re->resultmutex); - RE_TileProcessor(re, 0, 1); + RE_TileProcessor(re); BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); if(!(re->r.scemode & R_PREVIEWBUTS)) { @@ -988,7 +988,7 @@ void make_sss_tree(Render *re) { Material *mat; - re->sss_hash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + re->sss_hash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "make_sss_tree gh"); re->i.infostr= "SSS preprocessing"; re->stats_draw(re->sdh, &re->i); diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c index d1355c0c345..673bb53b215 100644 --- a/source/blender/render/intern/source/strand.c +++ b/source/blender/render/intern/source/strand.c @@ -240,8 +240,6 @@ void interpolate_shade_result(ShadeResult *shr1, ShadeResult *shr2, float t, Sha interpolate_vec3(shr1->refl, shr2->refl, t, negt, shr->refl); if(addpassflag & SCE_PASS_REFRACT) interpolate_vec3(shr1->refr, shr2->refr, t, negt, shr->refr); - /* removed if(addpassflag & SCE_PASS_RADIO) - interpolate_vec3(shr1->rad, shr2->rad, t, negt, shr->rad);*/ if(addpassflag & SCE_PASS_MIST) interpolate_vec1(&shr1->mist, &shr2->mist, t, negt, &shr->mist); } @@ -320,9 +318,9 @@ StrandShadeCache *strand_shade_cache_create() StrandShadeCache *cache; cache= MEM_callocN(sizeof(StrandShadeCache), "StrandShadeCache"); - cache->resulthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - cache->refcounthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - cache->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + cache->resulthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "strand_shade_cache_create1 gh"); + cache->refcounthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "strand_shade_cache_create2 gh"); + cache->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "strand shade cache arena"); return cache; } @@ -660,8 +658,8 @@ static void strand_render(Render *re, StrandSegment *sseg, float winmat[][4], St obi= sseg->obi - re->objectinstance; index= sseg->strand->index; - projectvert(p1->co, winmat, hoco1); - projectvert(p2->co, winmat, hoco2); + projectvert(p1->co, winmat, hoco1); + projectvert(p2->co, winmat, hoco2); for(a=0; adisprect.ymin - winy-1)/(float)winy; bounds[3]= (2*pa->disprect.ymax - winy+1)/(float)winy; - memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE); + memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "strand sort arena"); firstseg= NULL; sortseg= sortsegments; totsegment= 0; diff --git a/source/blender/render/intern/source/sunsky.c b/source/blender/render/intern/source/sunsky.c index 66b352a9ba6..193fd2aa46f 100644 --- a/source/blender/render/intern/source/sunsky.c +++ b/source/blender/render/intern/source/sunsky.c @@ -63,12 +63,12 @@ * */ void ClipColor(float c[3]) { - if (c[0] > 1.0) c[0] = 1.0; - if (c[0] < 0.0) c[0] = 0.0; - if (c[1] > 1.0) c[1] = 1.0; - if (c[1] < 0.0) c[1] = 0.0; - if (c[2] > 1.0) c[2] = 1.0; - if (c[2] < 0.0) c[2] = 0.0; + if (c[0] > 1.0) c[0] = 1.0; + if (c[0] < 0.0) c[0] = 0.0; + if (c[1] > 1.0) c[1] = 1.0; + if (c[1] < 0.0) c[1] = 0.0; + if (c[2] > 1.0) c[2] = 1.0; + if (c[2] < 0.0) c[2] = 0.0; } /** @@ -97,11 +97,11 @@ static float AngleBetween(float thetav, float phiv, float theta, float phi) * */ static void DirectionToThetaPhi(float *toSun, float *theta, float *phi) { - *theta = acos(toSun[2]); - if (fabs(*theta) < 1e-5) - *phi = 0; - else - *phi = atan2(toSun[1], toSun[0]); + *theta = acos(toSun[2]); + if (fabs(*theta) < 1e-5) + *phi = 0; + else + *phi = atan2(toSun[1], toSun[0]); } /** @@ -110,15 +110,15 @@ static void DirectionToThetaPhi(float *toSun, float *theta, float *phi) * */ float PerezFunction(struct SunSky *sunsky, const float *lam, float theta, float gamma, float lvz) { - float den, num; + float den, num; - den = ((1 + lam[0] * exp(lam[1])) * + den = ((1 + lam[0] * exp(lam[1])) * (1 + lam[2] * exp(lam[3] * sunsky->theta) + lam[4] * cos(sunsky->theta) * cos(sunsky->theta))); - num = ((1 + lam[0] * exp(lam[1] / cos(theta))) * + num = ((1 + lam[0] * exp(lam[1] / cos(theta))) * (1 + lam[2] * exp(lam[3] * gamma) + lam[4] * cos(gamma) * cos(gamma))); - return(lvz * num / den);} + return(lvz * num / den);} /** * InitSunSky: @@ -138,7 +138,7 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b float skyblendfac, short skyblendtype, float sky_exposure, float sky_colorspace) { - float theta2; + float theta2; float theta3; float T; float T2; @@ -157,10 +157,10 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b sunsky->sky_colorspace= sky_colorspace; sunsky->toSun[0] = toSun[0]; - sunsky->toSun[1] = toSun[1]; - sunsky->toSun[2] = toSun[2]; + sunsky->toSun[1] = toSun[1]; + sunsky->toSun[2] = toSun[2]; - DirectionToThetaPhi(sunsky->toSun, &sunsky->theta, &sunsky->phi); + DirectionToThetaPhi(sunsky->toSun, &sunsky->theta, &sunsky->phi); sunsky->sunSolidAngle = 0.25 * M_PI * 1.39 * 1.39 / (150 * 150); // = 6.7443e-05 @@ -177,14 +177,14 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b sunsky->zenith_Y = 1e-6; sunsky->zenith_x = - ( + 0.00165 * theta3 - 0.00374 * theta2 + 0.00208 * sunsky->theta + 0) * T2 + - ( -0.02902 * theta3 + 0.06377 * theta2 - 0.03202 * sunsky->theta + 0.00394) * T + - ( + 0.11693 * theta3 - 0.21196 * theta2 + 0.06052 * sunsky->theta + 0.25885); + ( + 0.00165 * theta3 - 0.00374 * theta2 + 0.00208 * sunsky->theta + 0) * T2 + + ( -0.02902 * theta3 + 0.06377 * theta2 - 0.03202 * sunsky->theta + 0.00394) * T + + ( + 0.11693 * theta3 - 0.21196 * theta2 + 0.06052 * sunsky->theta + 0.25885); sunsky->zenith_y = - ( + 0.00275 * theta3 - 0.00610 * theta2 + 0.00316 * sunsky->theta + 0) * T2 + - ( -0.04214 * theta3 + 0.08970 * theta2 - 0.04153 * sunsky->theta + 0.00515) * T + - ( + 0.15346 * theta3 - 0.26756 * theta2 + 0.06669 * sunsky->theta + 0.26688); + ( + 0.00275 * theta3 - 0.00610 * theta2 + 0.00316 * sunsky->theta + 0) * T2 + + ( -0.04214 * theta3 + 0.08970 * theta2 - 0.04153 * sunsky->theta + 0.00515) * T + + ( + 0.15346 * theta3 - 0.26756 * theta2 + 0.06669 * sunsky->theta + 0.26688); sunsky->perez_Y[0] = 0.17872 * T - 1.46303; @@ -205,8 +205,8 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b sunsky->perez_y[3] = -0.04405 * T - 1.65369; sunsky->perez_y[4] = -0.01092 * T + 0.05291; - /* suggested by glome in - * http://projects.blender.org/tracker/?func=detail&atid=127&aid=8063&group_id=9*/ + /* suggested by glome in + * http://projects.blender.org/tracker/?func=detail&atid=127&aid=8063&group_id=9*/ sunsky->perez_Y[0] *= sunsky->horizon_brightness; sunsky->perez_x[0] *= sunsky->horizon_brightness; sunsky->perez_y[0] *= sunsky->horizon_brightness; @@ -239,12 +239,12 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b * */ void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float color_out[3]) { - float gamma; - float x,y,Y,X,Z; - float hfade=1, nfade=1; + float gamma; + float x,y,Y,X,Z; + float hfade=1, nfade=1; - if (theta>(0.5*M_PI)) { + if (theta>(0.5*M_PI)) { hfade = 1.0-(theta*M_1_PI-0.5)*2.0; hfade = hfade*hfade*(3.0-2.0*hfade); theta = 0.5*M_PI; @@ -260,20 +260,20 @@ void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float colo gamma = AngleBetween(theta, phi, sunsky->theta, sunsky->phi); - // Compute xyY values - x = PerezFunction(sunsky, sunsky->perez_x, theta, gamma, sunsky->zenith_x); - y = PerezFunction(sunsky, sunsky->perez_y, theta, gamma, sunsky->zenith_y); - Y = 6.666666667e-5 * nfade * hfade * PerezFunction(sunsky, sunsky->perez_Y, theta, gamma, sunsky->zenith_Y); + // Compute xyY values + x = PerezFunction(sunsky, sunsky->perez_x, theta, gamma, sunsky->zenith_x); + y = PerezFunction(sunsky, sunsky->perez_y, theta, gamma, sunsky->zenith_y); + Y = 6.666666667e-5 * nfade * hfade * PerezFunction(sunsky, sunsky->perez_Y, theta, gamma, sunsky->zenith_Y); if(sunsky->sky_exposure!=0.0f) Y = 1.0 - exp(Y*sunsky->sky_exposure); - X = (x / y) * Y; - Z = ((1 - x - y) / y) * Y; + X = (x / y) * Y; + Z = ((1 - x - y) / y) * Y; - color_out[0] = X; - color_out[1] = Y; - color_out[2] = Z; + color_out[0] = X; + color_out[1] = Y; + color_out[2] = Z; } /** @@ -286,19 +286,19 @@ void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float colo * */ void GetSkyXYZRadiancef(struct SunSky* sunsky, const float varg[3], float color_out[3]) { - float theta, phi; - float v[3]; + float theta, phi; + float v[3]; copy_v3_v3(v, (float*)varg); normalize_v3(v); - if (v[2] < 0.001){ - v[2] = 0.001; - normalize_v3(v); - } + if (v[2] < 0.001){ + v[2] = 0.001; + normalize_v3(v); + } - DirectionToThetaPhi(v, &theta, &phi); - GetSkyXYZRadiance(sunsky, theta, phi, color_out); + DirectionToThetaPhi(v, &theta, &phi); + GetSkyXYZRadiance(sunsky, theta, phi, color_out); } /** @@ -311,13 +311,13 @@ void GetSkyXYZRadiancef(struct SunSky* sunsky, const float varg[3], float color_ * */ void ComputeAttenuatedSunlight(float theta, int turbidity, float fTau[3]) { - float fBeta ; - float fTauR, fTauA; - float m ; - float fAlpha; + float fBeta ; + float fTauR, fTauA; + float m ; + float fAlpha; - int i; - float fLambda[3]; + int i; + float fLambda[3]; fLambda[0] = 0.65f; fLambda[1] = 0.57f; fLambda[2] = 0.475f; @@ -327,7 +327,7 @@ void ComputeAttenuatedSunlight(float theta, int turbidity, float fTau[3]) m = 1.0/(cos(theta) + 0.15f*pow(93.885f-theta/M_PI*180.0f,-1.253f)); - for(i = 0; i < 3; i++) + for(i = 0; i < 3; i++) { // Rayleigh Scattering fTauR = exp( -m * 0.008735f * pow(fLambda[i], (float)(-4.08f))); @@ -336,7 +336,7 @@ void ComputeAttenuatedSunlight(float theta, int turbidity, float fTau[3]) fTauA = exp(-m * fBeta * pow(fLambda[i], -fAlpha)); fTau[i] = fTauR * fTauA; - } + } } /** diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 9e89d101215..e982c1a12a7 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -98,7 +98,7 @@ void init_render_texture(Render *re, Tex *tex) if(tex->type==TEX_PLUGIN) { if(tex->plugin && tex->plugin->doit) { if(tex->plugin->cfra) { - *(tex->plugin->cfra)= (float)cfra; //frame_to_float(re->scene, cfra); // XXX old animsys - timing stuff to be fixed + *(tex->plugin->cfra)= (float)cfra; //BKE_curframe(re->scene); // XXX old animsys - timing stuff to be fixed } } } @@ -1479,16 +1479,16 @@ void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg VECCOPY(in, out); ramp_blend(MA_RAMP_COLOR, in, in+1, in+2, fact, tex); break; - case MTEX_SOFT_LIGHT: - fact*= facg; - VECCOPY(in, out); - ramp_blend(MA_RAMP_SOFT, in, in+1, in+2, fact, tex); - break; - case MTEX_LIN_LIGHT: - fact*= facg; - VECCOPY(in, out); - ramp_blend(MA_RAMP_LINEAR, in, in+1, in+2, fact, tex); - break; + case MTEX_SOFT_LIGHT: + fact*= facg; + VECCOPY(in, out); + ramp_blend(MA_RAMP_SOFT, in, in+1, in+2, fact, tex); + break; + case MTEX_LIN_LIGHT: + fact*= facg; + VECCOPY(in, out); + ramp_blend(MA_RAMP_LINEAR, in, in+1, in+2, fact, tex); + break; } } @@ -1551,18 +1551,18 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen if(col > out) in= col; else in= out; break; - case MTEX_SOFT_LIGHT: - col= fact*tex; - scf=1.0 - (1.0 - tex) * (1.0 - out); - in= facm*out + fact * ((1.0 - out) * tex * out) + (out * scf); - break; + case MTEX_SOFT_LIGHT: + col= fact*tex; + scf=1.0 - (1.0 - tex) * (1.0 - out); + in= facm*out + fact * ((1.0 - out) * tex * out) + (out * scf); + break; - case MTEX_LIN_LIGHT: - if (tex > 0.5) - in = out + fact*(2*(tex - 0.5)); - else - in = out + fact*(2*tex - 1); - break; + case MTEX_LIN_LIGHT: + if (tex > 0.5) + in = out + fact*(2*(tex - 0.5)); + else + in = out + fact*(2*tex - 1); + break; } return in; @@ -2676,7 +2676,8 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f switch(mtex->texco) { case TEXCO_ANGMAP: /* only works with texture being "real" */ - fact= (1.0/M_PI)*acos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1])); + /* use saacos(), fixes bug [#22398], float precission caused lo[2] to be slightly less then -1.0 */ + fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1])); tempvec[0]= lo[0]*fact; tempvec[1]= lo[1]*fact; tempvec[2]= 0.0; diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c index 75ad292c003..0af05c3cdee 100644 --- a/source/blender/render/intern/source/volume_precache.c +++ b/source/blender/render/intern/source/volume_precache.c @@ -494,7 +494,7 @@ static void precache_setup_shadeinput(Render *re, ObjectInstanceRen *obi, Materi shi->har= shi->mat->har; shi->obi= obi; shi->obr= obi->obr; - shi->lay = re->scene->lay; + shi->lay = re->lay; } static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, ObjectInstanceRen *obi, int totthread, int *parts) diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c index 70e0fd41b7d..c74bb9d4a55 100644 --- a/source/blender/render/intern/source/volumetric.c +++ b/source/blender/render/intern/source/volumetric.c @@ -56,10 +56,6 @@ #include "volumetric.h" #include "volume_precache.h" -#if defined( _MSC_VER ) && !defined( __cplusplus ) -# define inline __inline -#endif // defined( _MSC_VER ) && !defined( __cplusplus ) - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* defined in pipeline.c, is hardcopy of active dynamic allocated Render */ /* only to be used here in this file, it's for speed */ @@ -67,7 +63,7 @@ extern struct Render R; /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* luminance rec. 709 */ -inline float luminance(float* col) +BM_INLINE float luminance(float* col) { return (0.212671f*col[0] + 0.71516f*col[1] + 0.072169f*col[2]); } @@ -296,7 +292,7 @@ float vol_get_density(struct ShadeInput *shi, float *co) if (shi->obi->obr->ob->type == OB_MBALL) { const float md = metadensity(shi->obi->obr->ob, co); if (md < 1.f) density *= md; - } + } return density * density_scale; } @@ -455,7 +451,7 @@ static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float * tau[1] += stepd * sigma_t[1]; tau[2] += stepd * sigma_t[2]; - add_v3_v3v3(p, p, step_vec); + add_v3_v3(p, step_vec); } /* return transmittance */ @@ -561,7 +557,7 @@ void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co) if (lar) { vol_shade_one_lamp(shi, co, lar, lacol); - add_v3_v3v3(scatter_col, scatter_col, lacol); + add_v3_v3(scatter_col, lacol); } } } @@ -631,12 +627,12 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float radiance[1] += stepd * tr[1] * (emit_col[1] + scatter_col[1]); radiance[2] += stepd * tr[2] * (emit_col[2] + scatter_col[2]); } - add_v3_v3v3(p, p, step_vec); + add_v3_v3(p, step_vec); } /* multiply original color (from behind volume) with transmittance over entire distance */ mul_v3_v3v3(col, tr, col); - add_v3_v3v3(col, col, radiance); + add_v3_v3(col, radiance); /* alpha <-- transmission luminance */ col[3] = 1.0f - luminance(tr); diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c index 1e665b2a809..64ba206bb86 100644 --- a/source/blender/render/intern/source/voxeldata.c +++ b/source/blender/render/intern/source/voxeldata.c @@ -57,58 +57,72 @@ #include "texture.h" #include "voxeldata.h" -static int load_frame_blendervoxel(FILE *fp, float *F, int size, int frame, int offset) +static int load_frame_blendervoxel(VoxelData *vd, FILE *fp, int frame) { - if(fseek(fp,frame*size*sizeof(float)+offset,0) == -1) + size_t offset = sizeof(VoxelDataHeader); + int size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + + vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset"); + + if(fseek(fp, frame*size*sizeof(float)+offset, 0) == -1) return 0; - if(fread(F,sizeof(float),size,fp) != size) + if(fread(vd->dataset, sizeof(float), size, fp) != size) return 0; + vd->cachedframe = frame; + vd->ok = 1; return 1; } -static int load_frame_raw8(FILE *fp, float *F, int size, int frame) +static int load_frame_raw8(VoxelData *vd, FILE *fp, int frame) { - char *tmp; + int size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + char *data_c; int i; - tmp = (char *)MEM_mallocN(sizeof(char)*size, "temporary voxel file reading storage"); + vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset"); + data_c = (char *)MEM_mallocN(sizeof(char)*size, "temporary voxel file reading storage"); if(fseek(fp,(frame-1)*size*sizeof(char),0) == -1) { - MEM_freeN(tmp); + MEM_freeN(data_c); return 0; } - if(fread(tmp, sizeof(char), size, fp) != size) { - MEM_freeN(tmp); + if(fread(data_c, sizeof(char), size, fp) != size) { + MEM_freeN(data_c); return 0; } for (i=0; idataset[i] = (float)data_c[i] / 255.f; } - MEM_freeN(tmp); + MEM_freeN(data_c); + + vd->cachedframe = frame; + vd->ok = 1; return 1; } -static void load_frame_image_sequence(Render *re, VoxelData *vd, Tex *tex) +static void load_frame_image_sequence(VoxelData *vd, Tex *tex) { ImBuf *ibuf; Image *ima = tex->ima; - ImageUser *iuser = &tex->iuser; + ImageUser *tiuser = &tex->iuser; + ImageUser iuser = *(tiuser); int x=0, y=0, z=0; float *rf; - if (!ima || !iuser) return; + if (!ima || !tiuser) return; + if (iuser.frames == 0) return; ima->source = IMA_SRC_SEQUENCE; - iuser->framenr = 1 + iuser->offset; + iuser.framenr = 1 + iuser.offset; /* find the first valid ibuf and use it to initialise the resolution of the data set */ /* need to do this in advance so we know how much memory to allocate */ - ibuf= BKE_image_get_ibuf(ima, iuser); - while (!ibuf && (iuser->framenr < iuser->frames)) { - iuser->framenr++; - ibuf= BKE_image_get_ibuf(ima, iuser); + ibuf= BKE_image_get_ibuf(ima, &iuser); + while (!ibuf && (iuser.framenr < iuser.frames)) { + iuser.framenr++; + ibuf= BKE_image_get_ibuf(ima, &iuser); } if (!ibuf) return; if (!ibuf->rect_float) IMB_float_from_rect(ibuf); @@ -116,15 +130,15 @@ static void load_frame_image_sequence(Render *re, VoxelData *vd, Tex *tex) vd->flag |= TEX_VD_STILL; vd->resol[0] = ibuf->x; vd->resol[1] = ibuf->y; - vd->resol[2] = iuser->frames; + vd->resol[2] = iuser.frames; vd->dataset = MEM_mapallocN(sizeof(float)*(vd->resol[0])*(vd->resol[1])*(vd->resol[2]), "voxel dataset"); - for (z=0; z < iuser->frames; z++) + for (z=0; z < iuser.frames; z++) { /* get a new ibuf for each frame */ if (z > 0) { - iuser->framenr++; - ibuf= BKE_image_get_ibuf(ima, iuser); + iuser.framenr++; + ibuf= BKE_image_get_ibuf(ima, &iuser); if (!ibuf) break; if (!ibuf->rect_float) IMB_float_from_rect(ibuf); } @@ -134,14 +148,17 @@ static void load_frame_image_sequence(Render *re, VoxelData *vd, Tex *tex) { for (x=0; x < ibuf->x; x++) { - /* currently converted to monchrome */ + /* currently averaged to monchrome */ vd->dataset[ V_I(x, y, z, vd->resol) ] = (rf[0] + rf[1] + rf[2])*0.333f; rf +=4; } } - BKE_image_free_anim_ibufs(ima, iuser->framenr); + BKE_image_free_anim_ibufs(ima, iuser.framenr); } + + vd->ok = 1; + return; } static int read_voxeldata_header(FILE *fp, struct VoxelData *vd) @@ -162,7 +179,7 @@ static int read_voxeldata_header(FILE *fp, struct VoxelData *vd) return 1; } -static void init_frame_smoke(Render *re, VoxelData *vd, Tex *tex) +static void init_frame_smoke(VoxelData *vd, Tex *tex) { Object *ob; ModifierData *md; @@ -232,58 +249,70 @@ static void init_frame_smoke(Render *re, VoxelData *vd, Tex *tex) } // end of fluid condition } } + + vd->ok = 1; + return; } static void cache_voxeldata(struct Render *re,Tex *tex) { VoxelData *vd = tex->vd; FILE *fp; - int size; int curframe; if (!vd) return; - /* image sequence gets special treatment */ - if (vd->file_format == TEX_VD_IMAGE_SEQUENCE) { - load_frame_image_sequence(re, vd, tex); - return; - } else if (vd->file_format == TEX_VD_SMOKE) { - init_frame_smoke(re, vd, tex); - return; - } - - if (!BLI_exists(vd->source_path)) return; - fp = fopen(vd->source_path,"rb"); - if (!fp) return; - - if (vd->file_format == TEX_VD_BLENDERVOXEL) { - if(!read_voxeldata_header(fp, vd)) { - fclose(fp); - return; - } - } + /* only re-cache if dataset needs updating */ + if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == re->r.cfra)) + if (vd->ok) return; - size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); - vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset"); - - if (vd->flag & TEX_VD_STILL) curframe = vd->still_frame; - else curframe = re->r.cfra; + /* clear out old cache, ready for new */ + if (vd->dataset) { + if(vd->file_format != TEX_VD_SMOKE) + MEM_freeN(vd->dataset); + vd->dataset = NULL; + } + + if (vd->flag & TEX_VD_STILL) + curframe = vd->still_frame; + else + curframe = re->r.cfra; switch(vd->file_format) { + case TEX_VD_IMAGE_SEQUENCE: + load_frame_image_sequence(vd, tex); + return; + case TEX_VD_SMOKE: + init_frame_smoke(vd, tex); + return; case TEX_VD_BLENDERVOXEL: - load_frame_blendervoxel(fp, vd->dataset, size, curframe-1, sizeof(VoxelDataHeader)); - break; + if (!BLI_exists(vd->source_path)) return; + fp = fopen(vd->source_path,"rb"); + if (!fp) return; + + if(read_voxeldata_header(fp, vd)) + load_frame_blendervoxel(vd, fp, curframe-1); + else + fclose(fp); + + return; case TEX_VD_RAW_8BIT: - load_frame_raw8(fp, vd->dataset, size, curframe); - break; + if (!BLI_exists(vd->source_path)) return; + fp = fopen(vd->source_path,"rb"); + if (!fp) return; + + if (load_frame_raw8(vd, fp, curframe)) + ; + else + fclose(fp); + + return; } - - fclose(fp); } void make_voxeldata(struct Render *re) { - Tex *tex; + Tex *tex; re->i.infostr= "Loading voxel datasets"; re->stats_draw(re->sdh, &re->i); @@ -300,32 +329,9 @@ void make_voxeldata(struct Render *re) } -static void free_voxeldata_one(Render *re, Tex *tex) -{ - VoxelData *vd = tex->vd; - - if (vd->dataset) { - if(vd->file_format != TEX_VD_SMOKE) - MEM_freeN(vd->dataset); - vd->dataset = NULL; - } -} - - -void free_voxeldata(Render *re) -{ - Tex *tex; - - for (tex= G.main->tex.first; tex; tex= tex->id.next) { - if(tex->id.us && tex->type==TEX_VOXELDATA) { - free_voxeldata_one(re, tex); - } - } -} - int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres) { - int retval = TEX_INT; + int retval = TEX_INT; VoxelData *vd = tex->vd; float co[3], offset[3] = {0.5, 0.5, 0.5}; @@ -339,7 +345,7 @@ int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres) * to the range 0.0, 1.0, before looking up in the voxel structure. */ copy_v3_v3(co, texvec); mul_v3_fl(co, 0.5f); - add_v3_v3v3(co, co, offset); + add_v3_v3(co, offset); /* co is now in the range 0.0, 1.0 */ switch (tex->extend) { diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index dc87170842b..4f872a238cd 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -1910,10 +1910,10 @@ void zbufclip(ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3, } } - /* warning, this should never happen! */ + /* warning, this should never happen! */ if(clve>38 || clvl>31) printf("clip overflow: clve clvl %d %d\n",clve,clvl); - /* perspective division */ + /* perspective division */ f1=vez; for(c1=0;c1mask= 1<zofsx= -pa->disprect.xmin + jit[zsample][0]; - zspan->zofsy= -pa->disprect.ymin + jit[zsample][1]; + zspan->zofsx= -pa->disprect.xmin - jit[zsample][0]; + zspan->zofsy= -pa->disprect.ymin - jit[zsample][1]; } else { zspan->zofsx= -pa->disprect.xmin; @@ -3312,7 +3312,10 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase * if(vlr->mat!=ma) { ma= vlr->mat; - dofill= shadow || (((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) && !(ma->mode & MA_ONLYCAST)); + if(shadow) + dofill= (ma->mode & MA_SHADBUF); + else + dofill= (((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) && !(ma->mode & MA_ONLYCAST)); } if(dofill) { @@ -3539,9 +3542,6 @@ void merge_transp_passes(RenderLayer *rl, ShadeResult *shr) case SCE_PASS_REFLECT: col= shr->refl; break; - case SCE_PASS_RADIO: - col= NULL; // removed shr->rad; - break; case SCE_PASS_REFRACT: col= shr->refr; break; @@ -3650,9 +3650,6 @@ void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, float alph case SCE_PASS_REFRACT: col= shr->refr; break; - case SCE_PASS_RADIO: - col= NULL; // removed shr->rad; - break; case SCE_PASS_NORMAL: col= shr->nor; break; @@ -3852,7 +3849,7 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf ShadeInput *shi= ssamp->shi; ShadeResult *shr= ssamp->shr; - for(sample=0; sampletot; sample++, shi++, shr++) { + for(sample=0; sampletot; sample++, shi++, shr++) { if(shi->mask & (1<combined[3])*shr->combined[3]; @@ -3900,9 +3897,6 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf if(addpassflag & SCE_PASS_REFRACT) addvecmul(samp_shr->refr, shr->refr, fac); - /* removed if(addpassflag & SCE_PASS_RADIO) - addvecmul(samp_shr->rad, shr->rad, fac);*/ - if(addpassflag & SCE_PASS_MIST) samp_shr->mist= samp_shr->mist+fac*shr->mist; diff --git a/source/blender/verify/intern/BLO_verify.c b/source/blender/verify/intern/BLO_verify.c index 6b79d0e4cab..ccdc8a7e916 100644 --- a/source/blender/verify/intern/BLO_verify.c +++ b/source/blender/verify/intern/BLO_verify.c @@ -45,10 +45,6 @@ #include "BLO_signer_info.h" /* external signer info struct */ -#ifdef HAVE_CONFIG_H -#include -#endif - static struct BLO_SignerInfo g_SignerInfo = {"", "", ""}; struct verifyStructType { @@ -377,7 +373,7 @@ BLO_verify_end( /* verify the signature */ verifySuccess = RSA_verify(NID_ripemd160, digest, RIPEMD160_DIGEST_LENGTH, - BLO_verify->streamHeader->signature, + BLO_verify->streamHeader->signature, BLO_verify->streamHeader->signatureLen, rsa); if (verifySuccess == 1) { #ifndef NDEBUG diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index d880f4fc7d9..ae51c5b395e 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -49,10 +49,6 @@ IF(WITH_INTERNATIONAL) ADD_DEFINITIONS(-DINTERNATIONAL) ENDIF(WITH_INTERNATIONAL) -IF(WITH_OPENEXR) - ADD_DEFINITIONS(-DWITH_OPENEXR) -ENDIF(WITH_OPENEXR) - IF(WITH_OPENCOLLADA) ADD_DEFINITIONS(-DWITH_COLLADA) ENDIF(WITH_OPENCOLLADA) diff --git a/source/blender/windowmanager/Makefile b/source/blender/windowmanager/Makefile index ad574aa0d4c..90621f66057 100644 --- a/source/blender/windowmanager/Makefile +++ b/source/blender/windowmanager/Makefile @@ -1,5 +1,5 @@ # -# $Id: Makefile +# $Id$ # # ***** BEGIN GPL LICENSE BLOCK ***** # diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript index d0370c2f2f8..790b1e108da 100644 --- a/source/blender/windowmanager/SConscript +++ b/source/blender/windowmanager/SConscript @@ -24,7 +24,7 @@ if env['WITH_BF_COLLADA']: if env['OURPLATFORM'] == 'linux2': cflags='-pthread' - incs += ' ../../../extern/binreloc/include' + incs += ' ../../../extern/binreloc/include' if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] @@ -35,4 +35,4 @@ if env['WITH_GHOST_COCOA']: if env['BF_BUILDINFO']: defs.append('NAN_BUILDINFO') -env.BlenderLib ( 'bf_windowmanager', sources, Split(incs), defs, libtype=['core'], priority=[5] ) +env.BlenderLib ( 'bf_windowmanager', sources, Split(incs), defines=defs, libtype=['core'], priority=[5] ) diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 82788dc962b..78ea0350667 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -57,6 +57,7 @@ void WM_init (struct bContext *C, int argc, char **argv); void WM_exit (struct bContext *C); void WM_main (struct bContext *C); +void WM_init_game (struct bContext *C); void WM_init_splash (struct bContext *C); @@ -77,7 +78,7 @@ void WM_window_open_temp (struct bContext *C, struct rcti *position, int type); int WM_read_homefile (struct bContext *C, struct wmOperator *op); int WM_write_homefile (struct bContext *C, struct wmOperator *op); void WM_read_file (struct bContext *C, char *name, struct ReportList *reports); -void WM_write_file (struct bContext *C, char *target, int fileflags, struct ReportList *reports); +int WM_write_file (struct bContext *C, char *target, int fileflags, struct ReportList *reports); void WM_read_autosavefile(struct bContext *C); void WM_autosave_init (struct wmWindowManager *wm); @@ -183,14 +184,15 @@ int WM_menu_invoke (struct bContext *C, struct wmOperator *op, struct wmEven int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event); /* invoke callback, confirm menu + exec */ int WM_operator_confirm (struct bContext *C, struct wmOperator *op, struct wmEvent *event); - /* invoke callback, file selector "path" unset + exec */ + /* invoke callback, file selector "filepath" unset + exec */ int WM_operator_filesel (struct bContext *C, struct wmOperator *op, struct wmEvent *event); /* poll callback, context checks */ int WM_operator_winactive (struct bContext *C); /* invoke callback, exec + redo popup */ int WM_operator_props_popup (struct bContext *C, struct wmOperator *op, struct wmEvent *event); +int WM_operator_props_dialog_popup (struct bContext *C, struct wmOperator *op, int width, int height); int WM_operator_redo_popup (struct bContext *C, struct wmOperator *op); -void WM_operator_ui_popup (struct bContext *C, struct wmOperator *op, int width, int height); +int WM_operator_ui_popup (struct bContext *C, struct wmOperator *op, int width, int height); int WM_operator_confirm_message(struct bContext *C, struct wmOperator *op, char *message); @@ -221,8 +223,9 @@ void WM_operator_properties_sanitize(struct PointerRNA *ptr, int val); /* make void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring); void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot); void WM_operator_properties_free(struct PointerRNA *ptr); -void WM_operator_properties_filesel(struct wmOperatorType *ot, int filter, short type, short action); +void WM_operator_properties_filesel(struct wmOperatorType *ot, int filter, short type, short action, short flag); void WM_operator_properties_gesture_border(struct wmOperatorType *ot, int extend); +void WM_operator_properties_gesture_straightline(struct wmOperatorType *ot, int cursor); void WM_operator_properties_select_all(struct wmOperatorType *ot); /* MOVE THIS SOMEWHERE ELSE */ @@ -231,6 +234,15 @@ void WM_operator_properties_select_all(struct wmOperatorType *ot); #define SEL_DESELECT 2 #define SEL_INVERT 3 + +/* flags for WM_operator_properties_filesel */ +#define WM_FILESEL_RELPATH (1 << 0) + +#define WM_FILESEL_DIRECTORY (1 << 1) +#define WM_FILESEL_FILENAME (1 << 2) +#define WM_FILESEL_FILEPATH (1 << 3) + + /* operator as a python command (resultuing string must be free'd) */ char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args); void WM_operator_bl_idname(char *to, const char *from); @@ -251,6 +263,8 @@ int WM_gesture_lines_invoke(struct bContext *C, struct wmOperator *op, struct int WM_gesture_lines_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event); int WM_gesture_lasso_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event); int WM_gesture_lasso_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event); +int WM_gesture_straightline_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event); +int WM_gesture_straightline_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event); /* default operator for arearegions, generates event */ void WM_OT_tweak_gesture(struct wmOperatorType *ot); @@ -294,25 +308,34 @@ int WM_framebuffer_to_index(unsigned int col); /* threaded Jobs Manager */ #define WM_JOB_PRIORITY 1 #define WM_JOB_EXCL_RENDER 2 +#define WM_JOB_PROGRESS 4 -struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, int flag); +struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, char *name, int flag); int WM_jobs_test(struct wmWindowManager *wm, void *owner); +float WM_jobs_progress(struct wmWindowManager *wm, void *owner); +char *WM_jobs_name(struct wmWindowManager *wm, void *owner); void WM_jobs_customdata(struct wmJob *, void *customdata, void (*free)(void *)); void WM_jobs_timer(struct wmJob *, double timestep, unsigned int note, unsigned int endnote); void WM_jobs_callbacks(struct wmJob *, - void (*startjob)(void *, short *, short *), + void (*startjob)(void *, short *, short *, float *), void (*initjob)(void *), - void (*update)(void *)); + void (*update)(void *), + void (*endjob)(void *)); void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *); -void WM_jobs_stop(struct wmWindowManager *wm, void *owner); +void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob); +void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void *startjob); void WM_jobs_stop_all(struct wmWindowManager *wm); /* clipboard */ char *WM_clipboard_text_get(int selection); void WM_clipboard_text_set(char *buf, int selection); + /* progress */ +void WM_progress_set(struct wmWindow *win, float progress); +void WM_progress_clear(struct wmWindow *win); + #endif /* WM_API_H */ diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 06f1e7942f7..c84a5e64889 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -157,6 +157,8 @@ typedef struct wmNotifier { #define ND_FILEREAD (1<<16) #define ND_FILESAVE (2<<16) #define ND_DATACHANGED (3<<16) +#define ND_HISTORY (4<<16) +#define ND_JOB (5<<16) /* NC_SCREEN screen */ #define ND_SCREENBROWSE (1<<16) @@ -181,7 +183,7 @@ typedef struct wmNotifier { #define ND_KEYINGSET (12<<16) #define ND_TOOLSETTINGS (13<<16) #define ND_LAYER (14<<16) -#define ND_SEQUENCER_SELECT (15<<16) +#define ND_FRAME_RANGE (15<<16) /* NC_OBJECT Object */ #define ND_TRANSFORM (16<<16) @@ -190,11 +192,11 @@ typedef struct wmNotifier { #define ND_BONE_ACTIVE (19<<16) #define ND_BONE_SELECT (20<<16) #define ND_DRAW (21<<16) -#define ND_MODIFIER (22<<16) /* modifiers edited */ +#define ND_MODIFIER (22<<16) #define ND_KEYS (23<<16) -#define ND_CONSTRAINT (24<<16) /* constraints edited */ -#define ND_PARTICLE_DATA (25<<16) /* particles edited */ -#define ND_PARTICLE_SELECT (26<<16) /* particles selecting change */ +#define ND_CONSTRAINT (24<<16) +#define ND_PARTICLE (25<<16) +#define ND_POINTCACHE (26<<16) /* NC_MATERIAL Material */ #define ND_SHADING (30<<16) @@ -213,15 +215,12 @@ typedef struct wmNotifier { #define ND_DISPLAY (51<<16) /* NC_ANIMATION Animato */ -#define ND_KEYFRAME_SELECT (70<<16) -#define ND_KEYFRAME_EDIT (71<<16) -#define ND_KEYFRAME_PROP (72<<16) -#define ND_ANIMCHAN_SELECT (73<<16) -#define ND_ANIMCHAN_EDIT (74<<16) -#define ND_NLA_SELECT (75<<16) -#define ND_NLA_EDIT (76<<16) -#define ND_NLA_ACTCHANGE (77<<16) -#define ND_FCURVES_ORDER (78<<16) +#define ND_KEYFRAME (70<<16) +#define ND_KEYFRAME_PROP (71<<16) +#define ND_ANIMCHAN (72<<16) +#define ND_NLA (73<<16) +#define ND_NLA_ACTCHANGE (74<<16) +#define ND_FCURVES_ORDER (75<<16) /* NC_GEOM Geometry */ /* Mesh, Curve, MetaBall, Armature, .. */ @@ -229,7 +228,6 @@ typedef struct wmNotifier { #define ND_DATA (91<<16) /* NC_NODE Nodes */ -#define ND_NODE_SELECT (1<<16) /* NC_SPACE */ #define ND_SPACE_CONSOLE (1<<16) /* general redraw */ @@ -267,6 +265,8 @@ typedef struct wmNotifier { #define NS_MODE_POSE (9<<8) #define NS_MODE_PARTICLE (10<<8) +/* subtype 3d view editing */ +#define NS_VIEW3D_GPU (16<<8) /* action classification */ #define NOTE_ACTION (0x000000FF) @@ -275,6 +275,7 @@ typedef struct wmNotifier { #define NA_ADDED 3 #define NA_REMOVED 4 #define NA_RENAME 5 +#define NA_SELECTED 6 /* ************** Gesture Manager data ************** */ @@ -285,6 +286,7 @@ typedef struct wmNotifier { #define WM_GESTURE_CROSS_RECT 3 #define WM_GESTURE_LASSO 4 #define WM_GESTURE_CIRCLE 5 +#define WM_GESTURE_STRAIGHTLINE 6 /* wmGesture is registered to window listbase, handled by operator callbacks */ /* tweak gesture is builtin feature */ @@ -301,6 +303,7 @@ typedef struct wmGesture { /* customdata for border is a recti */ /* customdata for circle is recti, (xmin, ymin) is center, xmax radius */ /* customdata for lasso is short array */ + /* customdata for straight line is a recti: (xmin,ymin) is start, (xmax, ymax) is end */ } wmGesture; /* ************** wmEvent ************************ */ @@ -323,6 +326,7 @@ typedef struct wmEvent { short prevval; short prevx, prevy; double prevclicktime; + short prevclickx, prevclicky; /* modifier states */ short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */ @@ -492,7 +496,7 @@ typedef struct wmDropBox { typedef struct RecentFile { struct RecentFile *next, *prev; - char *filename; + char *filepath; } RecentFile; diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 048487fcd68..fcf8951d796 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,8 +30,6 @@ #include "DNA_windowmanager_types.h" -#include "MEM_guardedalloc.h" - #include "GHOST_C-api.h" #include "BLI_blenlib.h" @@ -53,10 +51,11 @@ #include "wm_draw.h" #include "wm.h" +#include "MEM_guardedalloc.h" + #include "ED_screen.h" #include "BPY_extern.h" -#include "RNA_types.h" /* ****************************************************** */ @@ -64,11 +63,14 @@ void WM_operator_free(wmOperator *op) { + +#ifndef DISABLE_PYTHON if(op->py_instance) { /* do this first incase there are any __del__ functions or * similar that use properties */ BPY_DECREF(op->py_instance); } +#endif if(op->ptr) { op->properties= op->ptr->data; @@ -96,13 +98,18 @@ void WM_operator_free(wmOperator *op) MEM_freeN(op); } +static void wm_reports_free(wmWindowManager *wm) +{ + BKE_reports_clear(&wm->reports); + WM_event_remove_timer(wm, NULL, wm->reports.reporttimer); +} + /* all operations get registered in the windowmanager here */ /* called on event handling by event_system.c */ void wm_operator_register(bContext *C, wmOperator *op) { wmWindowManager *wm= CTX_wm_manager(C); int tot; - char *buf; BLI_addtail(&wm->operators, op); tot= BLI_countlist(&wm->operators); @@ -114,14 +121,9 @@ void wm_operator_register(bContext *C, wmOperator *op) tot--; } - - /* Report the string representation of the operator */ - buf = WM_operator_pystring(C, op->type, op->ptr, 1); - BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf); - MEM_freeN(buf); - /* so the console is redrawn */ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL); + WM_event_add_notifier(C, NC_WM|ND_HISTORY, NULL); } @@ -135,6 +137,7 @@ void WM_operator_stack_clear(bContext *C) WM_operator_free(op); } + WM_event_add_notifier(C, NC_WM|ND_HISTORY, NULL); } /* ****************************************** */ @@ -305,7 +308,8 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm) BLI_freelistN(&wm->paintcursors); BLI_freelistN(&wm->drags); - BKE_reports_clear(&wm->reports); + + wm_reports_free(wm); if(C && CTX_wm_manager(C)==wm) CTX_wm_manager_set(C, NULL); } diff --git a/source/blender/windowmanager/intern/wm_apple.c b/source/blender/windowmanager/intern/wm_apple.c index 7853abc059c..22b4b85c01e 100644 --- a/source/blender/windowmanager/intern/wm_apple.c +++ b/source/blender/windowmanager/intern/wm_apple.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -107,9 +107,9 @@ static void getMacAvailableBounds(short *top, short *left, short *bottom, short GetAvailableWindowPositioningBounds ( GetMainDevice(), &outAvailableRect); *top = outAvailableRect.top; - *left = outAvailableRect.left; - *bottom = outAvailableRect.bottom; - *right = outAvailableRect.right; + *left = outAvailableRect.left; + *bottom = outAvailableRect.bottom; + *right = outAvailableRect.right; } diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c index 5879e0f82d6..b16e82726b4 100644 --- a/source/blender/windowmanager/intern/wm_cursors.c +++ b/source/blender/windowmanager/intern/wm_cursors.c @@ -1,5 +1,5 @@ /** -* $Id: wm_cursors.c +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -660,57 +660,57 @@ END_CURSOR_BLOCK BEGIN_CURSOR_BLOCK static char vloop_sbm[]={ - 0x00, 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x00, - 0x0e, 0x00, 0x66, 0x60, 0x62, 0x6f, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x60, 0x60, 0x60, 0x6f, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x00, + 0x0e, 0x00, 0x66, 0x60, 0x62, 0x6f, 0x00, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x60, 0x60, 0x60, 0x6f, 0x00, 0x00, }; static char vloop_smsk[]={ - 0xff, 0x01, 0xff, 0x00, 0x7f, 0x00, 0x3f, 0x00, - 0xff, 0xf0, 0xff, 0xff, 0xf7, 0xff, 0xf3, 0xf0, - 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xf0, + 0xff, 0x01, 0xff, 0x00, 0x7f, 0x00, 0x3f, 0x00, + 0xff, 0xf0, 0xff, 0xff, 0xf7, 0xff, 0xf3, 0xf0, + 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xf0, }; static char vloop_lbm[]={ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, - 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, - 0xfc, 0x03, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, - 0x3c, 0x3c, 0x00, 0x3c, 0x3c, 0x3c, 0x00, 0x3c, - 0x0c, 0x3c, 0xff, 0x3c, 0x0c, 0x3c, 0xff, 0x3c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, - 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, - 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, - 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, - 0x00, 0x3c, 0xff, 0x3c, 0x00, 0x3c, 0xff, 0x3c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, + 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, + 0xfc, 0x03, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x3c, 0x3c, 0x3c, 0x00, 0x3c, + 0x0c, 0x3c, 0xff, 0x3c, 0x0c, 0x3c, 0xff, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, + 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, + 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, + 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0x3c, 0xff, 0x3c, 0x00, 0x3c, 0xff, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static char vloop_lmsk[]={ - 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, - 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, - 0x0f, 0xff, 0x00, 0xff, 0x0f, 0xff, 0x00, 0xff, - 0x03, 0x3c, 0x00, 0x3c, 0x03, 0x3c, 0x00, 0x3c, - 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, - 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, - 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, - 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, - 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, - 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, - 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, + 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0x0f, 0xff, 0x00, 0xff, 0x0f, 0xff, 0x00, 0xff, + 0x03, 0x3c, 0x00, 0x3c, 0x03, 0x3c, 0x00, 0x3c, + 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, }; diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index 372ef107c15..3d519a5609b 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -57,7 +57,6 @@ #include "wm_event_system.h" #include "wm.h" -#include "RNA_types.h" /* ****************************************************** */ @@ -248,10 +247,10 @@ static void wm_drop_operator_draw(char *name, int x, int y) { int width= UI_GetStringWidth(name); - glColor4ub(0, 0, 0, 128); + glColor4ub(0, 0, 0, 50); - uiSetRoundBox(15); - uiRoundBox(x, y, x + width + 8, y + 15, 7); + uiSetRoundBox(15+16); + uiRoundBox(x, y, x + width + 8, y + 15, 4); glColor4ub(255, 255, 255, 255); UI_DrawString(x+4, y+4, name); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 6bbce386bd3..38322b66bbb 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -48,6 +48,7 @@ #include "ED_screen.h" +#include "GPU_draw.h" #include "GPU_extensions.h" #include "WM_api.h" @@ -158,7 +159,7 @@ static void wm_flush_regions_down(bScreen *screen, rcti *dirty) for(sa= screen->areabase.first; sa; sa= sa->next) { for(ar= sa->regionbase.first; ar; ar= ar->next) { if(BLI_isect_rcti(dirty, &ar->winrct, NULL)) { - ar->do_draw= 1; + ar->do_draw= RGN_DRAW; memset(&ar->drawrct, 0, sizeof(ar->drawrct)); ar->swap= WIN_NONE_OK; } @@ -173,7 +174,7 @@ static void wm_flush_regions_up(bScreen *screen, rcti *dirty) for(ar= screen->regionbase.first; ar; ar= ar->next) { if(BLI_isect_rcti(dirty, &ar->winrct, NULL)) { - ar->do_draw= 1; + ar->do_draw= RGN_DRAW; memset(&ar->drawrct, 0, sizeof(ar->drawrct)); ar->swap= WIN_NONE_OK; } @@ -329,7 +330,7 @@ static int is_pow2(int n) static int smaller_pow2(int n) { - while (!is_pow2(n)) + while (!is_pow2(n)) n= n&(n-1); return n; @@ -388,6 +389,7 @@ static void wm_draw_triple_free(wmWindow *win) wmDrawTriple *triple= win->drawdata; glDeleteTextures(triple->nx*triple->ny, triple->bind); + MEM_freeN(triple); win->drawdata= NULL; @@ -559,7 +561,8 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win) else { win->drawdata= MEM_callocN(sizeof(wmDrawTriple), "wmDrawTriple"); - if(!wm_triple_gen_textures(win, win->drawdata)) { + if(!wm_triple_gen_textures(win, win->drawdata)) + { wm_draw_triple_fail(C, win); return; } @@ -641,6 +644,13 @@ static int wm_draw_update_test_window(wmWindow *win) { ScrArea *sa; ARegion *ar; + + for(ar= win->screen->regionbase.first; ar; ar= ar->next) { + if(ar->do_draw_overlay) { + wm_tag_redraw_overlay(win, ar); + ar->do_draw_overlay= 0; + } + } if(win->screen->do_refresh) return 1; @@ -674,6 +684,8 @@ static int wm_automatic_draw_method(wmWindow *win) /* Windows software driver darkens color on each redraw */ else if(GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_WIN, GPU_DRIVER_SOFTWARE)) return USER_DRAW_OVERLAP_FLIP; + else if(GPU_color_depth() < 24) + return USER_DRAW_OVERLAP; else return USER_DRAW_TRIPLE; } @@ -681,11 +693,23 @@ static int wm_automatic_draw_method(wmWindow *win) return win->drawmethod; } +void wm_tag_redraw_overlay(wmWindow *win, ARegion *ar) +{ + /* for draw triple gestures, paint cursors don't need region redraw */ + if(ar && win) { + if(wm_automatic_draw_method(win) != USER_DRAW_TRIPLE) + ED_region_tag_redraw(ar); + win->screen->do_draw_paintcursor= 1; + } +} + void wm_draw_update(bContext *C) { wmWindowManager *wm= CTX_wm_manager(C); wmWindow *win; int drawmethod; + + GPU_free_unused_buffers(); for(win= wm->windows.first; win; win= win->next) { if(win->drawmethod != U.wmdrawmethod) { diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index b72bc02aca6..3077b25cc73 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -56,7 +56,6 @@ #include "ED_fileselect.h" #include "ED_info.h" #include "ED_screen.h" -#include "ED_space_api.h" #include "ED_util.h" #include "RNA_access.h" @@ -71,6 +70,7 @@ #include "wm_window.h" #include "wm_event_system.h" #include "wm_event_types.h" +#include "wm_draw.h" /* ************ event management ************** */ @@ -108,6 +108,17 @@ void wm_event_free_all(wmWindow *win) /* ********************* notifiers, listeners *************** */ +static int wm_test_duplicate_notifier(wmWindowManager *wm, unsigned int type, void *reference) +{ + wmNotifier *note; + + for(note=wm->queue.first; note; note=note->next) + if((note->category|note->data|note->subtype|note->action) == type && note->reference == reference) + return 1; + + return 0; +} + /* XXX: in future, which notifiers to send to other windows? */ void WM_event_add_notifier(const bContext *C, unsigned int type, void *reference) { @@ -134,7 +145,7 @@ void WM_main_add_notifier(unsigned int type, void *reference) Main *bmain= G.main; wmWindowManager *wm= bmain->wm.first; - if(wm) { + if(wm && !wm_test_duplicate_notifier(wm, type, reference)) { wmNotifier *note= MEM_callocN(sizeof(wmNotifier), "notifier"); note->wm= wm; @@ -217,14 +228,21 @@ void wm_event_do_notifiers(bContext *C) } } - if(ELEM4(note->category, NC_SCENE, NC_OBJECT, NC_GEOM, NC_SCENE)) { + if(ELEM5(note->category, NC_SCENE, NC_OBJECT, NC_GEOM, NC_SCENE, NC_WM)) { ED_info_stats_clear(CTX_data_scene(C)); WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL); } } if(do_anim) { - /* depsgraph gets called, might send more notifiers */ - ED_update_for_newframe(C, 1); + + /* XXX, quick frame changes can cause a crash if framechange and rendering + * collide (happens on slow scenes), scene_update_for_newframe can be called + * twice which can depgraph update the same object at once */ + if(!G.rendering) { + + /* depsgraph gets called, might send more notifiers */ + ED_update_for_newframe(C, 1); + } } } @@ -361,6 +379,52 @@ int WM_operator_poll(bContext *C, wmOperatorType *ot) return 1; } +static void wm_operator_print(wmOperator *op) +{ + char *buf = WM_operator_pystring(NULL, op->type, op->ptr, 1); + printf("%s\n", buf); + MEM_freeN(buf); +} + +static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int popup) +{ + wmWindowManager *wm = CTX_wm_manager(C); + ReportList *reports = CTX_wm_reports(C); + char *buf; + + if(popup) + if(op->reports->list.first) + uiPupMenuReports(C, op->reports); + + if(retval & OPERATOR_FINISHED) { + if(G.f & G_DEBUG) + wm_operator_print(op); /* todo - this print may double up, might want to check more flags then the FINISHED */ + + if (op->type->flag & OPTYPE_REGISTER) { + /* Report the python string representation of the operator */ + buf = WM_operator_pystring(C, op->type, op->ptr, 1); + BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf); + MEM_freeN(buf); + } + } + + if (op->reports->list.first) { + ReportTimerInfo *rti; + + /* add reports to the global list, otherwise they are not seen */ + addlisttolist(&CTX_wm_reports(C)->list, &op->reports->list); + + /* After adding reports to the global list, reset the report timer. */ + WM_event_remove_timer(wm, NULL, reports->reporttimer); + + /* Records time since last report was added */ + reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.02); + + rti = MEM_callocN(sizeof(ReportTimerInfo), "ReportTimerInfo"); + reports->reporttimer->customdata = rti; + } +} + static void wm_operator_finished(bContext *C, wmOperator *op, int repeat) { wmWindowManager *wm= CTX_wm_manager(C); @@ -406,13 +470,12 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) retval= op->type->exec(C, op); - if(op->type->flag & OPTYPE_UNDO) + if(op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm) wm->op_undo_depth--; } - if(retval & (OPERATOR_FINISHED|OPERATOR_CANCELLED)) - if(op->reports->list.first) - uiPupMenuReports(C, op->reports); + if (retval & (OPERATOR_FINISHED|OPERATOR_CANCELLED) && repeat == 0) + wm_operator_reports(C, op, retval, 0); if(retval & OPERATOR_FINISHED) wm_operator_finished(C, op, repeat); @@ -520,13 +583,6 @@ static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, P return op; } -static void wm_operator_print(wmOperator *op) -{ - char *buf = WM_operator_pystring(NULL, op->type, op->ptr, 1); - printf("%s\n", buf); - MEM_freeN(buf); -} - static void wm_region_mouse_co(bContext *C, wmEvent *event) { ARegion *ar= CTX_wm_region(C); @@ -537,7 +593,7 @@ static void wm_region_mouse_co(bContext *C, wmEvent *event) } } -static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports) +int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports) { wmWindowManager *wm= CTX_wm_manager(C); int retval= OPERATOR_PASS_THROUGH; @@ -556,7 +612,7 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P retval= op->type->invoke(C, op, event); - if(op->type->flag & OPTYPE_UNDO) + if(op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm) wm->op_undo_depth--; } else if(op->type->exec) { @@ -565,23 +621,19 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P retval= op->type->exec(C, op); - if(op->type->flag & OPTYPE_UNDO) + if(op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm) wm->op_undo_depth--; } else printf("invalid operator call %s\n", ot->idname); /* debug, important to leave a while, should never happen */ - + /* Note, if the report is given as an argument then assume the caller will deal with displaying them * currently python only uses this */ - if((retval & (OPERATOR_FINISHED|OPERATOR_CANCELLED)) && reports==NULL) - if(op->reports->list.first) /* only show the report if the report list was not given in the function */ - uiPupMenuReports(C, op->reports); + if (!(retval & OPERATOR_HANDLED) && retval & (OPERATOR_FINISHED|OPERATOR_CANCELLED)) + /* only show the report if the report list was not given in the function */ + wm_operator_reports(C, op, retval, (reports==NULL)); + - if (retval & OPERATOR_FINISHED) { /* todo - this may conflict with the other wm_operator_print, if theres ever 2 prints for 1 action will may need to add modal check here */ - if(G.f & G_DEBUG) - wm_operator_print(op); - } - if(retval & OPERATOR_HANDLED) ; /* do nothing, wm_operator_exec() has been called somewhere */ else if(retval & OPERATOR_FINISHED) { @@ -768,7 +820,7 @@ int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA retval= op->type->exec(C, op); - if(op->type->flag & OPTYPE_UNDO) + if(op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm) wm->op_undo_depth--; } else @@ -1058,7 +1110,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand retval= ot->modal(C, op, event); - if(ot->flag & OPTYPE_UNDO) + if(ot->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm) wm->op_undo_depth--; /* putting back screen context, reval can pass trough after modal failures! */ @@ -1070,17 +1122,11 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand /* this special cases is for areas and regions that get removed */ CTX_wm_area_set(C, NULL); CTX_wm_region_set(C, NULL); - } - - if(retval & (OPERATOR_FINISHED|OPERATOR_CANCELLED)) - if(op->reports->list.first) - uiPupMenuReports(C, op->reports); - - if (retval & OPERATOR_FINISHED) { - if(G.f & G_DEBUG) - wm_operator_print(op); /* todo - this print may double up, might want to check more flags then the FINISHED */ - } + } + if(retval & (OPERATOR_CANCELLED|OPERATOR_FINISHED)) + wm_operator_reports(C, op, retval, 0); + if(retval & OPERATOR_FINISHED) { wm_operator_finished(C, op, 0); handler->op= NULL; @@ -1173,7 +1219,6 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa { /* XXX validate area and region? */ bScreen *screen= CTX_wm_screen(C); - char *path= RNA_string_get_alloc(handler->op->ptr, "path", NULL, 0); if(screen != handler->filescreen) ED_screen_full_prevspace(C, CTX_wm_area(C)); @@ -1192,8 +1237,11 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa /* XXX also extension code in image-save doesnt work for this yet */ if (RNA_struct_find_property(handler->op->ptr, "check_existing") && RNA_boolean_get(handler->op->ptr, "check_existing")) { + char *path= RNA_string_get_alloc(handler->op->ptr, "filepath", NULL, 0); /* this gives ownership to pupmenu */ uiPupMenuSaveOver(C, handler->op, (path)? path: ""); + if(path) + MEM_freeN(path); } else { int retval; @@ -1203,7 +1251,7 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa retval= handler->op->type->exec(C, handler->op); - if(handler->op->type->flag & OPTYPE_UNDO) + if(handler->op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm) wm->op_undo_depth--; if (retval & OPERATOR_FINISHED) @@ -1226,6 +1274,10 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa handler->op->reports->printlevel = RPT_WARNING; uiPupMenuReports(C, handler->op->reports); + /* XXX - copied from 'wm_operator_finished()' */ + /* add reports to the global list, otherwise they are not seen */ + addlisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list); + CTX_wm_window_set(C, win_prev); } @@ -1249,8 +1301,6 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa CTX_wm_area_set(C, NULL); wm_event_free_handler(handler); - if(path) - MEM_freeN(path); action= WM_HANDLER_BREAK; } @@ -1383,6 +1433,8 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) /* test for double click first */ if ((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time) { event->val = KM_DBL_CLICK; + event->x = win->eventstate->prevclickx; + event->y = win->eventstate->prevclicky; action |= wm_handlers_do(C, event, handlers); } @@ -1449,9 +1501,7 @@ static void wm_paintcursor_tag(bContext *C, wmPaintCursor *pc, ARegion *ar) if(pc->poll == NULL || pc->poll(C)) { wmWindow *win= CTX_wm_window(C); win->screen->do_draw_paintcursor= 1; - - if(win->drawmethod != USER_DRAW_TRIPLE) - ED_region_tag_redraw(ar); + wm_tag_redraw_overlay(win, ar); } } } @@ -1532,31 +1582,30 @@ void wm_event_do_handlers(bContext *C) if( win->screen==NULL ) wm_event_free_all(win); - else - { + else { Scene* scene = win->screen->scene; - if(scene) - { + + if(scene) { int playing = sound_scene_playing(win->screen->scene); - if(playing != -1) - { + + if(playing != -1) { CTX_wm_window_set(C, win); CTX_wm_screen_set(C, win->screen); CTX_data_scene_set(C, scene); - if(((playing == 1) && (!win->screen->animtimer)) || ((playing == 0) && (win->screen->animtimer))) - { + + if(((playing == 1) && (!win->screen->animtimer)) || ((playing == 0) && (win->screen->animtimer))){ ED_screen_animation_play(C, -1, 1); } - if(playing == 0) - { - int ncfra = floor(sound_sync_scene(scene) * FPS); - if(ncfra != scene->r.cfra) - { + + if(playing == 0) { + int ncfra = round(sound_sync_scene(scene) * FPS); + if(ncfra != scene->r.cfra) { scene->r.cfra = ncfra; ED_update_for_newframe(C, 1); WM_event_add_notifier(C, NC_WINDOW, NULL); } } + CTX_data_scene_set(C, NULL); CTX_wm_screen_set(C, NULL); CTX_wm_window_set(C, NULL); @@ -1567,6 +1616,9 @@ void wm_event_do_handlers(bContext *C) while( (event= win->queue.first) ) { int action = WM_HANDLER_CONTINUE; + if((G.f & G_DEBUG) && event && !ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) + printf("pass on evt %d val %d\n", event->type, event->val); + wm_eventemulation(event); CTX_wm_window_set(C, win); @@ -1615,7 +1667,7 @@ void wm_event_do_handlers(bContext *C) /* does polls for drop regions and checks uibuts */ /* need to be here to make sure region context is true */ - if(event->type==MOUSEMOVE) { + if(ELEM(event->type, MOUSEMOVE, EVT_DROP)) { wm_region_mouse_co(C, event); wm_drags_check_ops(C, event); } @@ -1669,6 +1721,8 @@ void wm_event_do_handlers(bContext *C) /* set click time on first click (press -> release) */ if (win->eventstate->prevval == KM_PRESS && event->val == KM_RELEASE) { win->eventstate->prevclicktime = PIL_check_seconds_timer(); + win->eventstate->prevclickx = event->x; + win->eventstate->prevclicky = event->y; } } else { /* reset click time if event type not the same */ @@ -1681,6 +1735,8 @@ void wm_event_do_handlers(bContext *C) win->eventstate->prevtype = event->type; win->eventstate->prevval = event->val; win->eventstate->prevclicktime = PIL_check_seconds_timer(); + win->eventstate->prevclickx = event->x; + win->eventstate->prevclicky = event->y; } else { /* reset if not */ win->eventstate->prevtype = -1; win->eventstate->prevval = 0; @@ -1918,7 +1974,8 @@ void WM_event_add_mousemove(bContext *C) int WM_modal_tweak_exit(wmEvent *evt, int tweak_event) { /* user preset or keymap? dunno... */ - int tweak_modal= (U.flag & USER_DRAGIMMEDIATE)==0; + // XXX WTH is this? + int tweak_modal= (U.flag & USER_RELEASECONFIRM)==0; switch(tweak_event) { case EVT_TWEAK_L: @@ -1944,7 +2001,7 @@ static int convert_key(GHOST_TKey key) return (ZEROKEY + ((int) key - GHOST_kKey0)); } else if (key>=GHOST_kKeyNumpad0 && key<=GHOST_kKeyNumpad9) { return (PAD0 + ((int) key - GHOST_kKeyNumpad0)); - } else if (key>=GHOST_kKeyF1 && key<=GHOST_kKeyF12) { + } else if (key>=GHOST_kKeyF1 && key<=GHOST_kKeyF19) { return (F1KEY + ((int) key - GHOST_kKeyF1)); } else { switch (key) { @@ -2087,6 +2144,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t case GHOST_kEventCursorMove: { if(win->active) { GHOST_TEventCursorData *cd= customdata; + wmEvent *lastevent= win->queue.last; #if defined(__APPLE__) && defined(GHOST_COCOA) //Cocoa already uses coordinates with y=0 at bottom, and returns inwindow coordinates on mouse moved event @@ -2105,6 +2163,12 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t event.type= MOUSEMOVE; + /* some painting operators want accurate mouse events, they can + handle inbetween mouse move moves, others can happily ignore + them for better performance */ + if(lastevent && lastevent->type == MOUSEMOVE) + lastevent->type = INBETWEEN_MOUSEMOVE; + update_tablet_data(win, &event); wm_event_add(win, &event); @@ -2114,11 +2178,10 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t if(owin) { wmEvent oevent= *(owin->eventstate); - oevent.x= event.x; - oevent.y= event.y; + oevent.x=owin->eventstate->x= event.x; + oevent.y=owin->eventstate->y= event.y; oevent.type= MOUSEMOVE; - *(owin->eventstate)= oevent; update_tablet_data(owin, &oevent); wm_event_add(owin, &oevent); } diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 2ab6f78daa5..8a05e6c4916 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1,5 +1,5 @@ /** - * $Id: wm_files.c + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,6 +30,7 @@ */ #include #include +#include #ifdef WIN32 #include /* need to include windows.h so _WIN32_IE is defined */ @@ -60,6 +61,7 @@ #include "BKE_blender.h" #include "BKE_context.h" +#include "BKE_depsgraph.h" #include "BKE_DerivedMesh.h" #include "BKE_exotic.h" #include "BKE_font.h" @@ -76,12 +78,16 @@ #include "BLO_writefile.h" #include "RNA_access.h" -#include "RNA_define.h" + +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" +#include "IMB_thumbs.h" #include "ED_datafiles.h" #include "ED_object.h" #include "ED_screen.h" #include "ED_sculpt.h" +#include "ED_view3d.h" #include "ED_util.h" #include "GHOST_C-api.h" @@ -98,7 +104,7 @@ #include "wm_window.h" #include "wm_event_system.h" -static void writeBlog(void); +static void write_history(void); /* To be able to read files without windows closing, opening, moving we try to prepare for worst case: @@ -216,7 +222,9 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist) if(win->active) wm->winactive= win; - GHOST_SetWindowUserData(win->ghostwin, win); /* pointer back */ + if(!G.background) /* file loading in background mode still calls this */ + GHOST_SetWindowUserData(win->ghostwin, win); /* pointer back */ + oldwin->ghostwin= NULL; win->eventstate= oldwin->eventstate; @@ -238,19 +246,26 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist) /* in case UserDef was read, we re-initialize all, and do versioning */ static void wm_init_userdef(bContext *C) { + extern char btempdir[]; + UI_init_userdef(); MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024); sound_init(CTX_data_main(C)); /* set the python auto-execute setting from user prefs */ - if (U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) G.f &= ~G_SCRIPT_AUTOEXEC; - else G.f |= G_SCRIPT_AUTOEXEC; + /* disabled by default, unless explicitly enabled in the command line */ + if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) G.f |= G_SCRIPT_AUTOEXEC; + + if(U.tempdir[0]) strncpy(btempdir, U.tempdir, FILE_MAXDIR+FILE_MAXFILE); } void WM_read_file(bContext *C, char *name, ReportList *reports) { int retval; + /* so we can get the error message */ + errno = 0; + /* first try to append data from exotic file formats... */ /* it throws error box when file doesnt exist and returns -1 */ /* note; it should set some error message somewhere... (ton) */ @@ -258,6 +273,7 @@ void WM_read_file(bContext *C, char *name, ReportList *reports) /* we didn't succeed, now try to read Blender file */ if (retval== 0) { + int G_f= G.f; ListBase wmbase; /* put aside screens to match with persistant windows later */ @@ -267,6 +283,11 @@ void WM_read_file(bContext *C, char *name, ReportList *reports) retval= BKE_read_file(C, name, NULL, reports); G.save_over = 1; + /* this flag is initialized by the operator but overwritten on read. + * need to re-enable it here else drivers + registered scripts wont work. */ + if(G_f & G_SCRIPT_AUTOEXEC) G.f |= G_SCRIPT_AUTOEXEC; + else G.f &= ~G_SCRIPT_AUTOEXEC; + /* match the read WM with current WM */ wm_window_match_do(C, &wmbase); WM_check(C); /* opens window(s), checks keymaps */ @@ -277,7 +298,8 @@ void WM_read_file(bContext *C, char *name, ReportList *reports) if (retval!=0) { G.relbase_valid = 1; - writeBlog(); + if(!G.background) /* assume automated tasks with background, dont write recent file list */ + write_history(); } // XXX undo_editmode_clear(); @@ -287,17 +309,22 @@ void WM_read_file(bContext *C, char *name, ReportList *reports) WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL); // refresh_interface_font(); - CTX_wm_window_set(C, NULL); /* exits queues */ + CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first); + + ED_editors_init(C); + DAG_on_load_update(); + #ifndef DISABLE_PYTHON /* run any texts that were loaded in and flagged as modules */ BPY_load_user_modules(C); #endif + CTX_wm_window_set(C, NULL); /* exits queues */ } else if(retval==1) BKE_write_undo(C, "Import file"); else if(retval == -1) { if(reports) - BKE_reportf(reports, RPT_ERROR, "Can't read file \"%s\".", name); + BKE_reportf(reports, RPT_ERROR, "Can't read file: \"%s\", %s.", name, errno ? strerror(errno) : "Incompatible file format"); } } @@ -309,17 +336,23 @@ int WM_read_homefile(bContext *C, wmOperator *op) { ListBase wmbase; char tstr[FILE_MAXDIR+FILE_MAXFILE], scestr[FILE_MAXDIR]; - char *home= BLI_gethome(); int from_memory= op?RNA_boolean_get(op->ptr, "factory"):0; int success; - - BLI_clean(home); free_ttfont(); /* still weird... what does it here? */ G.relbase_valid = 0; if (!from_memory) { - BLI_make_file_string(G.sce, tstr, home, ".B25.blend"); + char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL); + if (cfgdir) { + BLI_make_file_string(G.sce, tstr, cfgdir, BLENDER_STARTUP_FILE); + } else { + tstr[0] = '\0'; + from_memory = 1; + if (op) { + BKE_report(op->reports, RPT_INFO, "Config directory with startup.blend file found."); + } + } } strcpy(scestr, G.sce); /* temporary store */ @@ -332,7 +365,7 @@ int WM_read_homefile(bContext *C, wmOperator *op) if (!from_memory && BLI_exists(tstr)) { success = BKE_read_file(C, tstr, NULL, NULL); } else { - success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL, NULL); + success = BKE_read_file_from_memory(C, datatoc_startup_blend, datatoc_startup_blend_size, NULL, NULL); if (wmbase.first == NULL) wm_clear_default_size(C); } @@ -357,6 +390,9 @@ int WM_read_homefile(bContext *C, wmOperator *op) // undo_editmode_clear(); BKE_reset_undo(); BKE_write_undo(C, "original"); /* save current state */ + + ED_editors_init(C); + DAG_on_load_update(); WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL); CTX_wm_window_set(C, NULL); /* exits queues */ @@ -365,15 +401,19 @@ int WM_read_homefile(bContext *C, wmOperator *op) } -void read_Blog(void) +void read_history(void) { char name[FILE_MAX]; LinkNode *l, *lines; struct RecentFile *recent; char *line; int num; + char *cfgdir = BLI_get_folder(BLENDER_CONFIG, NULL); + + if (!cfgdir) return; + + BLI_make_file_string("/", name, cfgdir, BLENDER_HISTORY_FILE); - BLI_make_file_string("/", name, BLI_gethome(), ".Blog"); lines= BLI_read_file_as_lines(name); G.recent_files.first = G.recent_files.last = NULL; @@ -387,10 +427,10 @@ void read_Blog(void) recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile"); BLI_addtail(&(G.recent_files), recent); - recent->filename = (char*)MEM_mallocN(sizeof(char)*(strlen(line)+1), "name of file"); - recent->filename[0] = '\0'; + recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(line)+1), "name of file"); + recent->filepath[0] = '\0'; - strcpy(recent->filename, line); + strcpy(recent->filepath, line); num++; } } @@ -402,40 +442,40 @@ void read_Blog(void) } -static void writeBlog(void) +static void write_history(void) { struct RecentFile *recent, *next_recent; char name[FILE_MAXDIR+FILE_MAXFILE]; FILE *fp; int i; - BLI_make_file_string("/", name, BLI_gethome(), ".Blog"); + BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_HISTORY_FILE); recent = G.recent_files.first; /* refresh .Blog of recent opened files, when current file was changed */ - if(!(recent) || (strcmp(recent->filename, G.sce)!=0)) { + if(!(recent) || (strcmp(recent->filepath, G.sce)!=0)) { fp= fopen(name, "w"); if (fp) { /* add current file to the beginning of list */ recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile"); - recent->filename = (char*)MEM_mallocN(sizeof(char)*(strlen(G.sce)+1), "name of file"); - recent->filename[0] = '\0'; - strcpy(recent->filename, G.sce); + recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(G.sce)+1), "name of file"); + recent->filepath[0] = '\0'; + strcpy(recent->filepath, G.sce); BLI_addhead(&(G.recent_files), recent); /* write current file to .Blog */ - fprintf(fp, "%s\n", recent->filename); + fprintf(fp, "%s\n", recent->filepath); recent = recent->next; i=1; /* write rest of recent opened files to .Blog */ while((ifilename, G.sce)!=0) { - fprintf(fp, "%s\n", recent->filename); + if (strcmp(recent->filepath, G.sce)!=0) { + fprintf(fp, "%s\n", recent->filepath); recent = recent->next; } else { next_recent = recent->next; - MEM_freeN(recent->filename); + MEM_freeN(recent->filepath); BLI_freelinkN(&(G.recent_files), recent); recent = next_recent; } @@ -471,25 +511,90 @@ static void do_history(char *name, ReportList *reports) BKE_report(reports, RPT_ERROR, "Unable to make version backup"); } -void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports) +static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt) +{ + /* will be scaled down, but gives some nice oversampling */ + ImBuf *ibuf; + int *thumb; + + *thumb_pt= NULL; + + if(G.background || scene->camera==NULL) + return NULL; + + /* gets scaled to BLEN_THUMB_SIZE */ + ibuf= ED_view3d_draw_offscreen_imbuf_simple(scene, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2, OB_SOLID); + + if(ibuf) { + float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp); + + /* dirty oversampling */ + IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE); + + /* add pretty overlay */ + IMB_overlayblend_thumb(ibuf->rect, ibuf->x, ibuf->y, aspect); + + /* first write into thumb buffer */ + thumb= MEM_mallocN(((2 + (BLEN_THUMB_SIZE * BLEN_THUMB_SIZE))) * sizeof(int), "write_file thumb"); + + thumb[0] = BLEN_THUMB_SIZE; + thumb[1] = BLEN_THUMB_SIZE; + + memcpy(thumb + 2, ibuf->rect, BLEN_THUMB_SIZE * BLEN_THUMB_SIZE * sizeof(int)); + } + else { + /* '*thumb_pt' needs to stay NULL to prevent a bad thumbnail from being handled */ + thumb= NULL; + } + + /* must be freed by caller */ + *thumb_pt= thumb; + + return ibuf; +} + +/* easy access from gdb */ +int write_crash_blend(void) +{ + char path[FILE_MAX]; + BLI_strncpy(path, G.sce, sizeof(path)); + BLI_replace_extension(path, sizeof(path), "_crash.blend"); + if(BLO_write_file(G.main, path, G.fileflags, NULL, NULL)) { + printf("written: %s\n", path); + return 1; + } + else { + printf("failed: %s\n", path); + return 0; + } +} + +int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports) { Library *li; int len; char di[FILE_MAX]; - + + int *thumb= NULL; + ImBuf *ibuf_thumb= NULL; + len = strlen(target); - if (len == 0) return; + if (len == 0) { + BKE_report(reports, RPT_ERROR, "Path is empty, cannot save"); + return -1; + } + if (len >= FILE_MAX) { BKE_report(reports, RPT_ERROR, "Path too long, cannot save"); - return; + return -1; } /* send the OnSave event */ for (li= G.main->library.first; li; li= li->id.next) { if (BLI_streq(li->name, target)) { BKE_report(reports, RPT_ERROR, "Cannot overwrite used library"); - return; + return -1; } } @@ -513,7 +618,10 @@ void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports do_history(di, reports); - if (BLO_write_file(CTX_data_main(C), di, fileflags, reports)) { + /* blend file thumbnail */ + ibuf_thumb= blend_file_thumb(di, CTX_data_scene(C), &thumb); + + if (BLO_write_file(CTX_data_main(C), di, fileflags, reports, thumb)) { strcpy(G.sce, di); G.relbase_valid = 1; strcpy(G.main->name, di); /* is guaranteed current file */ @@ -523,10 +631,27 @@ void WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports if(fileflags & G_FILE_COMPRESS) G.fileflags |= G_FILE_COMPRESS; else G.fileflags &= ~G_FILE_COMPRESS; - writeBlog(); + if(fileflags & G_FILE_AUTOPLAY) G.fileflags |= G_FILE_AUTOPLAY; + else G.fileflags &= ~G_FILE_AUTOPLAY; + + write_history(); + + /* run this function after because the file cant be written before the blend is */ + if (ibuf_thumb) { + ibuf_thumb= IMB_thumb_create(di, THB_NORMAL, THB_SOURCE_BLEND, ibuf_thumb); + IMB_freeImBuf(ibuf_thumb); + } + + if(thumb) MEM_freeN(thumb); + } + else { + if(ibuf_thumb) IMB_freeImBuf(ibuf_thumb); + if(thumb) MEM_freeN(thumb); + return -1; } // XXX waitcursor(0); + return 0; } /* operator entry */ @@ -541,12 +666,13 @@ int WM_write_homefile(bContext *C, wmOperator *op) if(win->screen->full == SCREENTEMP) wm_window_close(C, wm, win); - BLI_make_file_string("/", tstr, BLI_gethome(), ".B25.blend"); + BLI_make_file_string("/", tstr, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE); + printf("trying to save homefile at %s \n", tstr); /* force save as regular blend file */ - fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN); + fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN); - BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports); + BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL); G.save_over= 0; @@ -612,10 +738,10 @@ void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) wm_autosave_location(filename); /* force save as regular blend file */ - fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_LOCK|G_FILE_SIGN); + fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_AUTOPLAY |G_FILE_LOCK|G_FILE_SIGN); /* no error reporting to console */ - BLO_write_file(CTX_data_main(C), filename, fileflags, NULL); + BLO_write_file(CTX_data_main(C), filename, fileflags, NULL, NULL); /* do timer after file write, just in case file write takes a long time */ wm->autosavetimer= WM_event_add_timer(wm, NULL, TIMERAUTOSAVE, U.savetime*60.0); diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c index 9674bbe51b7..e87d2d79c39 100644 --- a/source/blender/windowmanager/intern/wm_gesture.c +++ b/source/blender/windowmanager/intern/wm_gesture.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -47,8 +47,8 @@ #include "wm.h" #include "wm_event_system.h" #include "wm_subwindow.h" +#include "wm_draw.h" -#include "ED_screen.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -70,7 +70,7 @@ wmGesture *WM_gesture_new(bContext *C, wmEvent *event, int type) wm_subwindow_getorigin(window, gesture->swinid, &sx, &sy); - if( ELEM4(type, WM_GESTURE_RECT, WM_GESTURE_CROSS_RECT, WM_GESTURE_TWEAK, WM_GESTURE_CIRCLE)) { + if( ELEM5(type, WM_GESTURE_RECT, WM_GESTURE_CROSS_RECT, WM_GESTURE_TWEAK, WM_GESTURE_CIRCLE, WM_GESTURE_STRAIGHTLINE)) { rcti *rect= MEM_callocN(sizeof(rcti), "gesture rect new"); gesture->customdata= rect; @@ -238,7 +238,7 @@ static void draw_filled_lasso(wmGesture *gt) if (lastv) e = BLI_addfilledge(lastv, v); lastv = v; - if (firstv==NULL) firstv = v; + if (firstv==NULL) firstv = v; } /* highly unlikely this will fail, but could crash if (gt->points == 0) */ @@ -335,6 +335,8 @@ void wm_gesture_draw(wmWindow *win) wm_gesture_draw_lasso(win, gt); else if(gt->type==WM_GESTURE_LASSO) wm_gesture_draw_lasso(win, gt); + else if(gt->type==WM_GESTURE_STRAIGHTLINE) + wm_gesture_draw_line(win, gt); } } @@ -346,8 +348,8 @@ void wm_gesture_tag_redraw(bContext *C) if(screen) screen->do_draw_gesture= 1; - if(ar && win->drawmethod != USER_DRAW_TRIPLE) - ED_region_tag_redraw(ar); + + wm_tag_redraw_overlay(win, ar); } diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 344e075c5ae..adf0e9d2001 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -54,6 +54,7 @@ #include "BKE_utildefines.h" #include "BKE_packedFile.h" #include "BKE_sequencer.h" /* free seq clipboard */ +#include "BKE_material.h" /* clear_matcopybuf */ #include "BLI_blenlib.h" #include "BLI_cellalloc.h" @@ -88,7 +89,7 @@ #include "UI_interface.h" #include "BLF_api.h" -#include "gpu_buffers.h" +#include "GPU_buffers.h" #include "GPU_extensions.h" #include "GPU_draw.h" @@ -128,8 +129,6 @@ void WM_init(bContext *C, int argc, char **argv) BLF_init(11, U.dpi); BLF_lang_init(); - init_builtin_keyingsets(); /* editors/animation/keyframing.c */ - /* get the default database, plus a wm */ WM_read_homefile(C, NULL); @@ -151,33 +150,49 @@ void WM_init(bContext *C, int argc, char **argv) if (!G.background) { GPU_extensions_init(); + GPU_set_mipmap(!(U.gameflags & USER_DISABLE_MIPMAP)); UI_init(); } - // clear_matcopybuf(); /* XXX */ - + clear_matcopybuf(); + ED_render_clear_mtex_copybuf(); + // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - -// init_node_butfuncs(); - + ED_preview_init_dbase(); G.ndofdevice = -1; /* XXX bad initializer, needs set otherwise buttons show! */ - read_Blog(); + read_history(); BLI_strncpy(G.lib, G.sce, FILE_MAX); } void WM_init_splash(bContext *C) { + if((U.uiflag & USER_SPLASH_DISABLE) == 0) { + wmWindowManager *wm= CTX_wm_manager(C); + wmWindow *prevwin= CTX_wm_window(C); + + if(wm->windows.first) { + CTX_wm_window_set(C, wm->windows.first); + WM_operator_name_call(C, "WM_OT_splash", WM_OP_INVOKE_DEFAULT, NULL); + CTX_wm_window_set(C, prevwin); + } + } +} + +void WM_init_game(bContext *C) +{ + //XXX copied from WM_init_splash we may not even need those "window" related code + //XXX not working yet, it fails at the game_start_operator pool (it needs an area) wmWindowManager *wm= CTX_wm_manager(C); wmWindow *prevwin= CTX_wm_window(C); if(wm->windows.first) { CTX_wm_window_set(C, wm->windows.first); - WM_operator_name_call(C, "WM_OT_splash", WM_OP_INVOKE_DEFAULT, NULL); + WM_operator_name_call(C, "VIEW3D_OT_game_start", WM_OP_EXEC_DEFAULT, NULL); CTX_wm_window_set(C, prevwin); } } @@ -188,7 +203,7 @@ static void free_openrecent(void) struct RecentFile *recent; for(recent = G.recent_files.first; recent; recent=recent->next) - MEM_freeN(recent->filename); + MEM_freeN(recent->filepath); BLI_freelistN(&(G.recent_files)); } @@ -203,6 +218,7 @@ extern wchar_t *copybufinfo; // XXX copy/paste buffer stuff... extern void free_anim_copybuf(); extern void free_anim_drivers_copybuf(); +extern void free_fmodifiers_copybuf(); extern void free_posebuf(); /* called in creator.c even... tsk, split this! */ @@ -258,6 +274,7 @@ void WM_exit(bContext *C) // free_matcopybuf(); free_anim_copybuf(); free_anim_drivers_copybuf(); + free_fmodifiers_copybuf(); free_posebuf(); // free_vertexpaint(); // free_imagepaint(); @@ -265,7 +282,9 @@ void WM_exit(bContext *C) // fsmenu_free(); BLF_exit(); - + + ANIM_keyingset_infos_exit(); + RE_FreeAllRender(); RE_engines_exit(); @@ -283,23 +302,19 @@ void WM_exit(bContext *C) BPY_end_python(); #endif - libtiff_exit(); - -#ifdef WITH_QUICKTIME - quicktime_exit(); -#endif - if (!G.background) { // XXX UI_filelist_free_icons(); } GPU_buffer_pool_free(0); + GPU_free_unused_buffers(); GPU_extensions_exit(); // if (copybuf) MEM_freeN(copybuf); // if (copybufinfo) MEM_freeN(copybufinfo); - - BKE_undo_save_quit(); // saves quit.blend if global undo is on + if (!G.background) { + BKE_undo_save_quit(); // saves quit.blend if global undo is on + } BKE_reset_undo(); ED_file_exit(); /* for fsmenu */ diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 6613598a102..80f1c680931 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,6 +26,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include + #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -48,9 +50,7 @@ #include "wm_event_types.h" #include "wm.h" -#include "ED_screen.h" -#include "RNA_types.h" /* ********************** Threaded Jobs Manager ****************************** */ @@ -69,11 +69,11 @@ Start or re-run job Stop job - signal job to end - on end, job will tag itself as sleeping + on end, job will tag itself as sleeping Remove job - signal job to end - on end, job will remove itself + on end, job will remove itself When job is done: - it puts timer to sleep (or removes?) @@ -91,12 +91,14 @@ struct wmJob { /* to prevent cpu overhead, use this one which only gets called when job really starts, not in thread */ void (*initjob)(void *); /* this runs inside thread, and does full job */ - void (*startjob)(void *, short *stop, short *do_update); + void (*startjob)(void *, short *stop, short *do_update, float *progress); /* update gets called if thread defines so, and max once per timerstep */ /* it runs outside thread, blocking blender, no drawing! */ void (*update)(void *); /* free entire customdata, doesn't run in thread */ void (*free)(void *); + /* gets called when job is stopped, not in thread */ + void (*endjob)(void *); /* running jobs each have own timer */ double timestep; @@ -109,6 +111,10 @@ struct wmJob { void *owner; int flag; short suspended, running, ready, do_update, stop; + float progress; + + /* for display in header, identification */ + char name[128]; /* once running, we store this separately */ void *run_customdata; @@ -119,18 +125,32 @@ struct wmJob { }; +/* finds: + * 1st priority: job with same owner and name + * 2nd priority: job with same owner + */ +static wmJob *wm_job_find(wmWindowManager *wm, void *owner, char *name) +{ + wmJob *steve, *found=NULL; + + for(steve= wm->jobs.first; steve; steve= steve->next) + if(steve->owner==owner) { + found= steve; + if (name && strcmp(steve->name, name)==0) + return steve; + } + + return found; +} + /* ******************* public API ***************** */ /* returns current or adds new job, but doesnt run it */ /* every owner only gets a single job, adding a new one will stop running stop and when stopped it starts the new one */ -wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, int flag) +wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, char *name, int flag) { - wmJob *steve; - - for(steve= wm->jobs.first; steve; steve= steve->next) - if(steve->owner==owner) - break; + wmJob *steve= wm_job_find(wm, owner, name); if(steve==NULL) { steve= MEM_callocN(sizeof(wmJob), "new job"); @@ -139,6 +159,7 @@ wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, int flag) steve->win= win; steve->owner= owner; steve->flag= flag; + BLI_strncpy(steve->name, name, sizeof(steve->name)); } return steve; @@ -156,6 +177,26 @@ int WM_jobs_test(wmWindowManager *wm, void *owner) return 0; } +float WM_jobs_progress(wmWindowManager *wm, void *owner) +{ + wmJob *steve= wm_job_find(wm, owner, NULL); + + if (steve && steve->flag & WM_JOB_PROGRESS) + return steve->progress; + + return 0.0; +} + +char *WM_jobs_name(wmWindowManager *wm, void *owner) +{ + wmJob *steve= wm_job_find(wm, owner, NULL); + + if (steve) + return steve->name; + + return NULL; +} + void WM_jobs_customdata(wmJob *steve, void *customdata, void (*free)(void *)) { /* pending job? just free */ @@ -179,20 +220,22 @@ void WM_jobs_timer(wmJob *steve, double timestep, unsigned int note, unsigned in } void WM_jobs_callbacks(wmJob *steve, - void (*startjob)(void *, short *, short *), + void (*startjob)(void *, short *, short *, float *), void (*initjob)(void *), - void (*update)(void *)) + void (*update)(void *), + void (*endjob)(void *)) { steve->startjob= startjob; steve->initjob= initjob; steve->update= update; + steve->endjob= endjob; } static void *do_job_thread(void *job_v) { wmJob *steve= job_v; - steve->startjob(steve->run_customdata, &steve->stop, &steve->do_update); + steve->startjob(steve->run_customdata, &steve->stop, &steve->do_update, &steve->progress); steve->ready= 1; return NULL; @@ -246,6 +289,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) steve->stop= 0; steve->ready= 0; + steve->progress= 0.0; BLI_init_threads(&steve->threads, do_job_thread, 1); BLI_insert_thread(&steve->threads, steve); @@ -268,6 +312,9 @@ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *steve) /* signal job to end */ steve->stop= 1; BLI_end_threads(&steve->threads); + + if(steve->endjob) + steve->endjob(steve->run_customdata); } if(steve->wt) @@ -292,17 +339,28 @@ void WM_jobs_stop_all(wmWindowManager *wm) } -/* signal job(s) from this owner to stop, timer is required to get handled */ -void WM_jobs_stop(wmWindowManager *wm, void *owner) +/* signal job(s) from this owner or callback to stop, timer is required to get handled */ +void WM_jobs_stop(wmWindowManager *wm, void *owner, void *startjob) { wmJob *steve; for(steve= wm->jobs.first; steve; steve= steve->next) - if(steve->owner==owner) + if(steve->owner==owner || steve->startjob==startjob) if(steve->running) steve->stop= 1; } +/* actually terminate thread and job timer */ +void WM_jobs_kill(wmWindowManager *wm, void *owner, void *startjob) +{ + wmJob *steve; + + for(steve= wm->jobs.first; steve; steve= steve->next) + if(steve->owner==owner || steve->startjob==startjob) + wm_jobs_kill_job(wm, steve); +} + + /* kill job entirely, also removes timer itself */ void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt) { @@ -320,6 +378,9 @@ void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt) void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) { wmJob *steve= wm->jobs.first, *stevenext; + float total_progress= 0.f; + float jobs_progress=0; + for(; steve; steve= stevenext) { stevenext= steve->next; @@ -335,10 +396,16 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) steve->update(steve->run_customdata); if(steve->note) WM_event_add_notifier(C, steve->note, NULL); + + if (steve->flag & WM_JOB_PROGRESS) + WM_event_add_notifier(C, NC_WM|ND_JOB, NULL); steve->do_update= 0; } if(steve->ready) { + if(steve->endjob) + steve->endjob(steve->run_customdata); + /* free own data */ steve->run_free(steve->run_customdata); steve->run_customdata= NULL; @@ -353,6 +420,8 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) if(steve->endnote) WM_event_add_notifier(C, steve->endnote, NULL); + WM_event_add_notifier(C, NC_WM|ND_JOB, NULL); + /* new job added for steve? */ if(steve->customdata) { WM_jobs_start(wm, steve); @@ -365,6 +434,10 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) BLI_remlink(&wm->jobs, steve); MEM_freeN(steve); } + } else if (steve->flag & WM_JOB_PROGRESS) { + /* accumulate global progress for running jobs */ + jobs_progress++; + total_progress += steve->progress; } } else if(steve->suspended) { @@ -372,5 +445,16 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) } } } + + /* on file load 'winactive' can be NULL, possibly it should not happen but for now do a NULL check - campbell */ + if(wm->winactive) { + /* if there are running jobs, set the global progress indicator */ + if (jobs_progress > 0) { + float progress = total_progress / (float)jobs_progress; + WM_progress_set(wm->winactive, progress); + } else { + WM_progress_clear(wm->winactive); + } + } } diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 81bef5336e8..e79d08dc2f1 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -47,7 +47,6 @@ #include "BKE_utildefines.h" #include "RNA_access.h" -#include "RNA_types.h" #include "RNA_enum_types.h" #include "WM_api.h" @@ -709,8 +708,11 @@ void WM_keymap_restore_item_to_default(bContext *C, wmKeyMap *keymap, wmKeyMapIt WM_keymap_properties_reset(kmi); } - kmi->properties= IDP_CopyProperty(orig->properties); - kmi->ptr->data= kmi->properties; + + if (orig->properties) { + kmi->properties= IDP_CopyProperty(orig->properties); + kmi->ptr->data= kmi->properties; + } kmi->propvalue = orig->propvalue; kmi->type = orig->type; diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index aac9134b0fe..efd05114d9a 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -61,6 +61,7 @@ #include "BKE_scene.h" #include "BKE_screen.h" /* BKE_ST_MAXNAME */ #include "BKE_utildefines.h" +#include "BKE_brush.h" // JW #include "BIF_gl.h" #include "BIF_glutil.h" /* for paint cursor */ @@ -69,6 +70,7 @@ #include "ED_screen.h" #include "ED_util.h" +#include "ED_view3d.h" // JW #include "RNA_access.h" #include "RNA_define.h" @@ -759,7 +761,7 @@ int WM_operator_confirm_message(bContext *C, wmOperator *op, char *message) pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION); layout= uiPupMenuLayout(pup); - uiItemFullO(layout, message, 0, op->type->idname, properties, WM_OP_EXEC_REGION_WIN, 0); + uiItemFullO(layout, op->type->idname, message, 0, properties, WM_OP_EXEC_REGION_WIN, 0); uiPupMenuEnd(C, pup); return OPERATOR_CANCELLED; @@ -774,7 +776,7 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event) /* op->invoke, opens fileselect if path property not set, otherwise executes */ int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event) { - if (RNA_property_is_set(op->ptr, "path")) { + if (RNA_property_is_set(op->ptr, "filepath")) { return WM_operator_call(C, op); } else { @@ -784,13 +786,19 @@ int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event) } /* default properties for fileselect */ -void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type, short action) +void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type, short action, short flag) { PropertyRNA *prop; - RNA_def_string_file_path(ot->srna, "path", "", FILE_MAX, "File Path", "Path to file"); - RNA_def_string_file_name(ot->srna, "filename", "", FILE_MAX, "File Name", "Name of the file"); - RNA_def_string_dir_path(ot->srna, "directory", "", FILE_MAX, "Directory", "Directory of the file"); + + if(flag & WM_FILESEL_FILEPATH) + RNA_def_string_file_path(ot->srna, "filepath", "", FILE_MAX, "File Path", "Path to file"); + + if(flag & WM_FILESEL_DIRECTORY) + RNA_def_string_dir_path(ot->srna, "directory", "", FILE_MAX, "Directory", "Directory of the file"); + + if(flag & WM_FILESEL_FILENAME) + RNA_def_string_file_name(ot->srna, "filename", "", FILE_MAX, "File Name", "Name of the file"); if (action == FILE_SAVE) { prop= RNA_def_boolean(ot->srna, "check_existing", 1, "Check Existing", "Check and warn on overwriting existing files"); @@ -813,6 +821,8 @@ void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type, RNA_def_property_flag(prop, PROP_HIDDEN); prop= RNA_def_boolean(ot->srna, "filter_btx", (filter & BTXFILE), "Filter btx files", ""); RNA_def_property_flag(prop, PROP_HIDDEN); + prop= RNA_def_boolean(ot->srna, "filter_collada", (filter & COLLADAFILE), "Filter COLLADA files", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); prop= RNA_def_boolean(ot->srna, "filter_folder", (filter & FOLDERFILE), "Filter folders", ""); RNA_def_property_flag(prop, PROP_HIDDEN); @@ -820,6 +830,9 @@ void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type, "File Browser Mode", "The setting for the file browser mode to load a .blend file, a library or a special file", FILE_LOADLIB, FILE_SPECIAL); RNA_def_property_flag(prop, PROP_HIDDEN); + + if(flag & WM_FILESEL_RELPATH) + RNA_def_boolean(ot->srna, "relative_path", (U.flag & USER_RELPATHS) ? 1:0, "Relative Path", "Select the file relative to the blend file"); } void WM_operator_properties_select_all(wmOperatorType *ot) { @@ -846,6 +859,17 @@ void WM_operator_properties_gesture_border(wmOperatorType *ot, int extend) RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection instead of deselecting everything first"); } +void WM_operator_properties_gesture_straightline(wmOperatorType *ot, int cursor) +{ + RNA_def_int(ot->srna, "xstart", 0, INT_MIN, INT_MAX, "X Start", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "xend", 0, INT_MIN, INT_MAX, "X End", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "ystart", 0, INT_MIN, INT_MAX, "Y Start", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "yend", 0, INT_MIN, INT_MAX, "Y End", "", INT_MIN, INT_MAX); + + if(cursor) + RNA_def_int(ot->srna, "cursor", cursor, 0, INT_MAX, "Cursor", "Mouse cursor style to use during the modal operator", 0, INT_MAX); +} + /* op->poll */ int WM_operator_winactive(bContext *C) @@ -910,6 +934,60 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op) return block; } +/* Only invoked by OK button in popups created with wm_block_create_dialog() */ +static void dialog_exec_cb(bContext *C, void *arg1, void *arg2) +{ + wmOperator *op= arg1; + uiBlock *block= arg2; + + WM_operator_call(C, op); + + uiPupBlockClose(C, block); +} + +/* Dialogs are popups that require user verification (click OK) before exec */ +static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData) +{ + struct { wmOperator *op; int width; int height; } * data = userData; + wmWindowManager *wm= CTX_wm_manager(C); + wmOperator *op= data->op; + PointerRNA ptr; + uiBlock *block; + uiLayout *layout; + uiBut *btn; + uiStyle *style= U.uistyles.first; + int columns= 2; + + block = uiBeginBlock(C, ar, "operator dialog", UI_EMBOSS); + uiBlockClearFlag(block, UI_BLOCK_LOOP); + uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT); + + if (!op->properties) { + IDPropertyTemplate val = {0}; + op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties"); + } + + RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, style); + uiItemL(layout, op->type->name, 0); + + if (op->type->ui) { + op->layout= layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; + } + else + uiDefAutoButsRNA(C, layout, &ptr, columns); + + /* Create OK button, the callback of which will execute op */ + btn= uiDefBut(block, BUT, 0, "OK", 0, 0, 0, 20, NULL, 0, 0, 0, 0, ""); + uiButSetFunc(btn, dialog_exec_cb, op, block); + + uiPopupBoundsBlock(block, 4.0f, 0, 0); + uiEndBlock(C, block); + + return block; +} static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData) { @@ -949,22 +1027,40 @@ int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *event) { int retval= OPERATOR_CANCELLED; - if(op->type->exec) + if(op->type->exec) { retval= op->type->exec(C, op); + /* ED_undo_push_op(C, op), called by wm_operator_finished now. */ + } + if(retval != OPERATOR_CANCELLED) uiPupBlock(C, wm_block_create_redo, op); return retval; } -void WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height) +int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, int height) +{ + struct { wmOperator *op; int width; int height; } data; + + data.op= op; + data.width= width; + data.height= height; + + /* op is not executed until popup OK but is clicked */ + uiPupBlock(C, wm_block_create_dialog, &data); + + return OPERATOR_RUNNING_MODAL; +} + +int WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height) { struct { wmOperator *op; int width; int height; } data; data.op = op; data.width = width; data.height = height; uiPupBlock(C, wm_operator_create_ui, &data); + return OPERATOR_RUNNING_MODAL; } int WM_operator_redo_popup(bContext *C, wmOperator *op) @@ -1045,6 +1141,19 @@ static void wm_block_splash_close(bContext *C, void *arg_block, void *arg_unused uiPupBlockClose(C, arg_block); } +static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unused); + +/* XXX: hack to refresh splash screen with updated prest menu name, + * since popup blocks don't get regenerated like panels do */ +void wm_block_splash_refreshmenu (bContext *C, void *arg_block, void *unused) +{ + /* ugh, causes crashes in other buttons, disabling for now until + * a better fix + uiPupBlockClose(C, arg_block); + uiPupBlock(C, wm_block_create_splash, NULL); + */ +} + static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unused) { uiBlock *block; @@ -1053,15 +1162,16 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse uiStyle *style= U.uistyles.first; struct RecentFile *recent; int i; - + Menu menu= {0}; + MenuType *mt= WM_menutype_find("USERPREF_MT_splash", TRUE); + #ifdef NAN_BUILDINFO int ver_width, rev_width; char *version_str = NULL; char *revision_str = NULL; char version_buf[128]; char revision_buf[128]; - extern char * build_rev; - char *cp; + extern char build_rev[]; version_str = &version_buf[0]; revision_str = &revision_buf[0]; @@ -1069,63 +1179,55 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse sprintf(version_str, "%d.%02d.%d", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION); sprintf(revision_str, "r%s", build_rev); - /* here on my system I get ugly double quotes around the revision number. - * if so, clip it off: */ - cp = strchr(revision_str, '"'); - if (cp) { - memmove(cp, cp+1, strlen(cp+1)); - cp = strchr(revision_str, '"'); - if (cp) - *cp = 0; - } - - BLF_size(style->widgetlabel.points, U.dpi); - ver_width = BLF_width(version_str)+5; - rev_width = BLF_width(revision_str)+5; + BLF_size(style->widgetlabel.uifont_id, style->widgetlabel.points, U.dpi); + ver_width = BLF_width(style->widgetlabel.uifont_id, version_str)+5; + rev_width = BLF_width(style->widgetlabel.uifont_id, revision_str)+5; #endif //NAN_BUILDINFO block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS); - uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1); + uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN); but= uiDefBut(block, BUT_IMAGE, 0, "", 0, 10, 501, 282, NULL, 0.0, 0.0, 0, 0, ""); uiButSetFunc(but, wm_block_splash_close, block, NULL); + uiBlockSetFunc(block, wm_block_splash_refreshmenu, block, NULL); #ifdef NAN_BUILDINFO - uiDefBut(block, LABEL, 0, version_str, 500-ver_width, 282-24, ver_width, 20, NULL, 0, 0, 0, 0, NULL); - uiDefBut(block, LABEL, 0, revision_str, 500-rev_width, 282-36, rev_width, 20, NULL, 0, 0, 0, 0, NULL); + uiDefBut(block, LABEL, 0, version_str, 494-ver_width, 282-24, ver_width, 20, NULL, 0, 0, 0, 0, NULL); + uiDefBut(block, LABEL, 0, revision_str, 494-rev_width, 282-36, rev_width, 20, NULL, 0, 0, 0, 0, NULL); #endif //NAN_BUILDINFO + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 10, 2, 480, 110, style); + + uiBlockSetEmboss(block, UI_EMBOSS); + /* show the splash menu (containing interaction presets), using python */ + if (mt) { + menu.layout= layout; + menu.type= mt; + mt->draw(C, &menu); + } uiBlockSetEmboss(block, UI_EMBOSSP); - - layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 10, 10, 480, 110, style); - uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN); split = uiLayoutSplit(layout, 0, 0); col = uiLayoutColumn(split, 0); uiItemL(col, "Links", 0); - uiItemO(col, NULL, ICON_URL, "HELP_OT_release_logs"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_manual"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_blender_website"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_user_community"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_python_api"); + uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-250/"); + uiItemStringO(col, "Manual", ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:Manual"); + uiItemStringO(col, "Blender Website", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/"); + uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); + uiItemStringO(col, "Python API Reference", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/documentation/250PythonDoc/contents.html"); uiItemL(col, "", 0); col = uiLayoutColumn(split, 0); uiItemL(col, "Recent", 0); - for(recent = G.recent_files.first, i=0; (i<6) && (recent); recent = recent->next, i++) { - char *display_name= BLI_last_slash(recent->filename); - if(display_name) display_name++; /* skip the slash */ - else display_name= recent->filename; - uiItemStringO(col, display_name, ICON_FILE_BLEND, "WM_OT_open_mainfile", "path", recent->filename); + for(recent = G.recent_files.first, i=0; (i<5) && (recent); recent = recent->next, i++) { + uiItemStringO(col, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath); } - uiItemL(col, "Recovery", 0); - uiItemO(col, NULL, ICON_FILE_BLEND, "WM_OT_recover_last_session"); - uiItemO(col, NULL, ICON_FILE_BLEND, "WM_OT_recover_auto_save"); - + uiItemS(col); + uiItemO(col, NULL, ICON_RECOVER_LAST, "WM_OT_recover_last_session"); uiItemL(col, "", 0); - + uiCenteredBoundsBlock(block, 0.0f); uiEndBlock(C, block); @@ -1236,7 +1338,7 @@ static int wm_search_menu_poll(bContext *C) if(CTX_wm_window(C)==NULL) return 0; if(CTX_wm_area(C) && CTX_wm_area(C)->spacetype==SPACE_CONSOLE) return 0; // XXX - so we can use the shortcut in the console if(CTX_wm_area(C) && CTX_wm_area(C)->spacetype==SPACE_TEXT) return 0; // XXX - so we can use the spacebar in the text editor - if(CTX_data_edit_object(C) && CTX_data_edit_object(C)->type==OB_CURVE) return 0; // XXX - so we can use the spacebar for entering text + if(CTX_data_edit_object(C) && CTX_data_edit_object(C)->type==OB_FONT) return 0; // XXX - so we can use the spacebar for entering text return 1; } @@ -1278,8 +1380,8 @@ static int wm_operator_winactive_normal(bContext *C) { wmWindow *win= CTX_wm_window(C); - if(win==NULL || win->screen==NULL || win->screen->full != SCREENNORMAL) - return 0; + if(win==NULL || win->screen==NULL || win->screen->full != SCREENNORMAL) + return 0; return 1; } @@ -1334,7 +1436,7 @@ static void open_set_use_scripts(wmOperator *op) static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { - RNA_string_set(op->ptr, "path", G.sce); + RNA_string_set(op->ptr, "filepath", G.sce); open_set_load_ui(op); open_set_use_scripts(op); @@ -1347,7 +1449,7 @@ static int wm_open_mainfile_exec(bContext *C, wmOperator *op) { char path[FILE_MAX]; - RNA_string_get(op->ptr, "path", path); + RNA_string_get(op->ptr, "filepath", path); open_set_load_ui(op); open_set_use_scripts(op); @@ -1380,7 +1482,7 @@ static void WM_OT_open_mainfile(wmOperatorType *ot) ot->exec= wm_open_mainfile_exec; ot->poll= WM_operator_winactive; - WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_OPENFILE, WM_FILESEL_FILEPATH); RNA_def_boolean(ot->srna, "load_ui", 1, "Load UI", "Load user interface setup in the .blend file"); RNA_def_boolean(ot->srna, "use_scripts", 1, "Trusted Source", "Allow blend file execute scripts automatically, default available from system preferences"); @@ -1390,12 +1492,15 @@ static void WM_OT_open_mainfile(wmOperatorType *ot) static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *event) { - if(RNA_property_is_set(op->ptr, "path")) { + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "filepath")) { return WM_operator_call(C, op); } else { /* XXX TODO solve where to get last linked library from */ - RNA_string_set(op->ptr, "path", G.lib); + RNA_string_set(op->ptr, "filepath", G.lib); WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; } @@ -1407,9 +1512,10 @@ static short wm_link_append_flag(wmOperator *op) if(RNA_boolean_get(op->ptr, "autoselect")) flag |= FILE_AUTOSELECT; if(RNA_boolean_get(op->ptr, "active_layer")) flag |= FILE_ACTIVELAY; - if(RNA_boolean_get(op->ptr, "relative_paths")) flag |= FILE_STRINGCODE; + if(RNA_boolean_get(op->ptr, "relative_path")) flag |= FILE_RELPATH; if(RNA_boolean_get(op->ptr, "link")) flag |= FILE_LINK; if(RNA_boolean_get(op->ptr, "instance_groups")) flag |= FILE_GROUP_INSTANCE; + return flag; } @@ -1419,7 +1525,7 @@ static void wm_link_make_library_local(Main *main, const char *libname) /* and now find the latest append lib file */ for(lib= main->library.first; lib; lib=lib->id.next) - if(BLI_streq(libname, lib->filename)) + if(BLI_streq(libname, lib->filepath)) break; /* make local */ @@ -1482,6 +1588,14 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) flag = wm_link_append_flag(op); + /* sanity checks for flag */ + if(scene->id.lib && (flag & FILE_GROUP_INSTANCE)) { + /* TODO, user never gets this message */ + BKE_reportf(op->reports, RPT_WARNING, "Scene '%s' is linked, group instance disabled", scene->id.name+2); + flag &= ~FILE_GROUP_INSTANCE; + } + + /* tag everything, all untagged data can be made local * its also generally useful to know what is new * @@ -1539,13 +1653,12 @@ static void WM_OT_link_append(wmOperatorType *ot) ot->flag |= OPTYPE_UNDO; - WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_LOADLIB, FILE_OPENFILE); + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_LOADLIB, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_DIRECTORY|WM_FILESEL_FILENAME| WM_FILESEL_RELPATH); RNA_def_boolean(ot->srna, "link", 1, "Link", "Link the objects or datablocks rather than appending"); RNA_def_boolean(ot->srna, "autoselect", 1, "Select", "Select the linked objects"); RNA_def_boolean(ot->srna, "active_layer", 1, "Active Layer", "Put the linked objects on the active layer"); RNA_def_boolean(ot->srna, "instance_groups", 1, "Instance Groups", "Create instances for each group as a DupliGroup"); - RNA_def_boolean(ot->srna, "relative_paths", 1, "Relative Paths", "Store the library path as a relative path to current .blend file"); RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", ""); } @@ -1567,7 +1680,6 @@ static int wm_recover_last_session_exec(bContext *C, wmOperator *op) WM_read_file(C, filename, op->reports); G.fileflags &= ~G_FILE_RECOVER; - return OPERATOR_FINISHED; } @@ -1587,7 +1699,7 @@ static int wm_recover_auto_save_exec(bContext *C, wmOperator *op) { char path[FILE_MAX]; - RNA_string_get(op->ptr, "path", path); + RNA_string_get(op->ptr, "filepath", path); G.fileflags |= G_FILE_RECOVER; @@ -1608,7 +1720,7 @@ static int wm_recover_auto_save_invoke(bContext *C, wmOperator *op, wmEvent *eve char filename[FILE_MAX]; wm_autosave_location(filename); - RNA_string_set(op->ptr, "path", filename); + RNA_string_set(op->ptr, "filepath", filename); WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; @@ -1624,7 +1736,7 @@ static void WM_OT_recover_auto_save(wmOperatorType *ot) ot->invoke= wm_recover_auto_save_invoke; ot->poll= WM_operator_winactive; - WM_operator_properties_filesel(ot, BLENDERFILE, FILE_BLENDER, FILE_OPENFILE); + WM_operator_properties_filesel(ot, BLENDERFILE, FILE_BLENDER, FILE_OPENFILE, WM_FILESEL_FILEPATH); } /* *************** save file as **************** */ @@ -1659,7 +1771,7 @@ static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *even BLI_strncpy(name, G.sce, FILE_MAX); untitled(name); - RNA_string_set(op->ptr, "path", name); + RNA_string_set(op->ptr, "filepath", name); WM_event_add_fileselect(C, op); @@ -1674,8 +1786,8 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) save_set_compress(op); - if(RNA_property_is_set(op->ptr, "path")) - RNA_string_get(op->ptr, "path", path); + if(RNA_property_is_set(op->ptr, "filepath")) + RNA_string_get(op->ptr, "filepath", path); else { BLI_strncpy(path, G.sce, FILE_MAX); untitled(path); @@ -1689,11 +1801,12 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) if(RNA_boolean_get(op->ptr, "relative_remap")) fileflags |= G_FILE_RELATIVE_REMAP; else fileflags &= ~G_FILE_RELATIVE_REMAP; - WM_write_file(C, path, fileflags, op->reports); - + if ( WM_write_file(C, path, fileflags, op->reports) != 0) + return OPERATOR_CANCELLED; + WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL); - return 0; + return OPERATOR_FINISHED; } static void WM_OT_save_as_mainfile(wmOperatorType *ot) @@ -1706,9 +1819,9 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot) ot->exec= wm_save_as_mainfile_exec; ot->poll= WM_operator_winactive; - WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE); + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH); RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file"); - RNA_def_boolean(ot->srna, "relative_remap", 0, "Remap Relative", "Remap relative paths when saving in a different directory"); + RNA_def_boolean(ot->srna, "relative_remap", 1, "Remap Relative", "Remap relative paths when saving in a different directory"); } /* *************** save file directly ******** */ @@ -1726,7 +1839,7 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) BLI_strncpy(name, G.sce, FILE_MAX); untitled(name); - RNA_string_set(op->ptr, "path", name); + RNA_string_set(op->ptr, "filepath", name); if (RNA_struct_find_property(op->ptr, "check_existing")) if (RNA_boolean_get(op->ptr, "check_existing")==0) @@ -1736,7 +1849,7 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) if (check_existing) uiPupMenuSaveOver(C, op, name); else { - WM_operator_call(C, op); + wm_save_as_mainfile_exec(C, op); } } else { WM_event_add_fileselect(C, op); @@ -1755,7 +1868,7 @@ static void WM_OT_save_mainfile(wmOperatorType *ot) ot->exec= wm_save_as_mainfile_exec; ot->poll= NULL; - WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE); + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH); RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file"); RNA_def_boolean(ot->srna, "relative_remap", 0, "Remap Relative", "Remap relative paths when saving in a different directory"); } @@ -1767,13 +1880,13 @@ static void WM_OT_save_mainfile(wmOperatorType *ot) #include "../../collada/collada.h" static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - //char name[FILE_MAX]; - //BLI_strncpy(name, G.sce, FILE_MAX); - //untitled(name); +{ + if(!RNA_property_is_set(op->ptr, "filepath")) { + char *path = BLI_replacestr(G.sce, ".blend", ".dae"); + RNA_string_set(op->ptr, "filepath", path); + MEM_freeN(path); + } - /* RNA_string_set(op->ptr, "path", "/tmp/test.dae"); */ - WM_event_add_fileselect(C, op); return OPERATOR_RUNNING_MODAL; @@ -1784,18 +1897,14 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; - if(RNA_property_is_set(op->ptr, "path")) - RNA_string_get(op->ptr, "path", filename); - else { - BLI_strncpy(filename, G.sce, FILE_MAX); - untitled(filename); + if(!RNA_property_is_set(op->ptr, "filepath")) { + BKE_report(op->reports, RPT_ERROR, "No filename given"); + return OPERATOR_CANCELLED; } - //WM_write_file(C, filename, op->reports); + RNA_string_get(op->ptr, "filepath", filename); collada_export(CTX_data_scene(C), filename); - /* WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL); */ - return OPERATOR_FINISHED; } @@ -1808,18 +1917,7 @@ static void WM_OT_collada_export(wmOperatorType *ot) ot->exec= wm_collada_export_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - - RNA_def_property(ot->srna, "path", PROP_STRING, PROP_FILEPATH); -} - -static int wm_collada_import_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - /* RNA_string_set(op->ptr, "path", "/tmp/test.dae"); */ - - WM_event_add_fileselect(C, op); - - return OPERATOR_RUNNING_MODAL; + WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH); } /* function used for WM_OT_save_mainfile too */ @@ -1827,18 +1925,14 @@ static int wm_collada_import_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; - if(RNA_property_is_set(op->ptr, "path")) - RNA_string_get(op->ptr, "path", filename); - else { - BLI_strncpy(filename, G.sce, FILE_MAX); - untitled(filename); + if(!RNA_property_is_set(op->ptr, "filepath")) { + BKE_report(op->reports, RPT_ERROR, "No filename given"); + return OPERATOR_CANCELLED; } - - //WM_write_file(C, filename, op->reports); + + RNA_string_get(op->ptr, "filepath", filename); collada_import(C, filename); - /* WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL); */ - return OPERATOR_FINISHED; } @@ -1847,13 +1941,11 @@ static void WM_OT_collada_import(wmOperatorType *ot) ot->name= "Import COLLADA"; ot->idname= "WM_OT_collada_import"; - ot->invoke= wm_collada_import_invoke; + ot->invoke= WM_operator_filesel; ot->exec= wm_collada_import_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - - RNA_def_property(ot->srna, "path", PROP_STRING, PROP_FILEPATH); + WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_OPENFILE, WM_FILESEL_FILEPATH); } #endif @@ -1900,7 +1992,7 @@ static void WM_OT_exit_blender(wmOperatorType *ot) */ void *WM_paint_cursor_activate(wmWindowManager *wm, int (*poll)(bContext *C), - wmPaintCursorDraw draw, void *customdata) + wmPaintCursorDraw draw, void *customdata) { wmPaintCursor *pc= MEM_callocN(sizeof(wmPaintCursor), "paint cursor"); @@ -2018,7 +2110,7 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) } else if (event->type==EVT_MODAL_MAP) { switch (event->val) { - case GESTURE_MODAL_BORDER_BEGIN: + case GESTURE_MODAL_BEGIN: if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) { gesture->mode= 1; wm_gesture_tag_redraw(C); @@ -2026,6 +2118,8 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) break; case GESTURE_MODAL_SELECT: case GESTURE_MODAL_DESELECT: + case GESTURE_MODAL_IN: + case GESTURE_MODAL_OUT: if(border_apply(C, op, event->val)) { wm_gesture_end(C, op); return OPERATOR_FINISHED; @@ -2072,8 +2166,8 @@ static void gesture_circle_apply(bContext *C, wmOperator *op) wmGesture *gesture= op->customdata; rcti *rect= gesture->customdata; - if(RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_NOP) - return; + if(RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_NOP) + return; /* operator arguments and storage. */ RNA_int_set(op->ptr, "x", rect->xmin); @@ -2175,6 +2269,7 @@ static void tweak_gesture_modal(bContext *C, wmEvent *event) switch(event->type) { case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: wm_subwindow_getorigin(window, gesture->swinid, &sx, &sy); @@ -2305,6 +2400,7 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, wmEvent *event) switch(event->type) { case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: wm_gesture_tag_redraw(C); @@ -2383,6 +2479,112 @@ void WM_OT_lasso_gesture(wmOperatorType *ot) } #endif +/* *********************** straight line gesture ****************** */ + +static int straightline_apply(bContext *C, wmOperator *op) +{ + wmGesture *gesture= op->customdata; + rcti *rect= gesture->customdata; + + if(rect->xmin==rect->xmax && rect->ymin==rect->ymax) + return 0; + + /* operator arguments and storage. */ + RNA_int_set(op->ptr, "xstart", rect->xmin); + RNA_int_set(op->ptr, "ystart", rect->ymin); + RNA_int_set(op->ptr, "xend", rect->xmax); + RNA_int_set(op->ptr, "yend", rect->ymax); + + if(op->type->exec) + op->type->exec(C, op); + + return 1; +} + + +int WM_gesture_straightline_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + op->customdata= WM_gesture_new(C, event, WM_GESTURE_STRAIGHTLINE); + + /* add modal handler */ + WM_event_add_modal_handler(C, op); + + wm_gesture_tag_redraw(C); + + if( RNA_struct_find_property(op->ptr, "cursor") ) + WM_cursor_modal(CTX_wm_window(C), RNA_int_get(op->ptr, "cursor")); + + return OPERATOR_RUNNING_MODAL; +} + +int WM_gesture_straightline_modal(bContext *C, wmOperator *op, wmEvent *event) +{ + wmGesture *gesture= op->customdata; + rcti *rect= gesture->customdata; + int sx, sy; + + if(event->type== MOUSEMOVE) { + wm_subwindow_getorigin(CTX_wm_window(C), gesture->swinid, &sx, &sy); + + if(gesture->mode==0) { + rect->xmin= rect->xmax= event->x - sx; + rect->ymin= rect->ymax= event->y - sy; + } + else { + rect->xmax= event->x - sx; + rect->ymax= event->y - sy; + straightline_apply(C, op); + } + + wm_gesture_tag_redraw(C); + } + else if (event->type==EVT_MODAL_MAP) { + switch (event->val) { + case GESTURE_MODAL_BEGIN: + if(gesture->mode==0) { + gesture->mode= 1; + wm_gesture_tag_redraw(C); + } + break; + case GESTURE_MODAL_SELECT: + if(straightline_apply(C, op)) { + wm_gesture_end(C, op); + return OPERATOR_FINISHED; + } + wm_gesture_end(C, op); + return OPERATOR_CANCELLED; + break; + + case GESTURE_MODAL_CANCEL: + wm_gesture_end(C, op); + return OPERATOR_CANCELLED; + } + + } + + return OPERATOR_RUNNING_MODAL; +} + +#if 0 +/* template to copy from */ +void WM_OT_straightline_gesture(wmOperatorType *ot) +{ + PropertyRNA *prop; + + ot->name= "Straight Line Gesture"; + ot->idname= "WM_OT_straightline_gesture"; + ot->description="Draw a straight line as you move the pointer"; + + ot->invoke= WM_gesture_straightline_invoke; + ot->modal= WM_gesture_straightline_modal; + ot->exec= gesture_straightline_exec; + + ot->poll= WM_operator_winactive; + + WM_operator_properties_gesture_straightline(ot, 0); +} +#endif + /* *********************** radial control ****************** */ const int WM_RADIAL_CONTROL_DISPLAY_SIZE = 200; @@ -2395,19 +2597,28 @@ typedef struct wmRadialControl { GLuint tex; } wmRadialControl; +extern Paint *paint_get_active(Scene *sce); +extern struct Brush *paint_brush(struct Paint *paint); + static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata) { wmRadialControl *rc = (wmRadialControl*)customdata; ARegion *ar = CTX_wm_region(C); float r1=0.0f, r2=0.0f, r3=0.0f, angle=0.0f; - /* Keep cursor in the original place */ - x = rc->initial_mouse[0] - ar->winrct.xmin; - y = rc->initial_mouse[1] - ar->winrct.ymin; + Paint *paint = paint_get_active(CTX_data_scene(C)); + Brush *brush = paint_brush(paint); - glPushMatrix(); - - glTranslatef((float)x, (float)y, 0.0f); + ViewContext vc; + + // int hit = 0; + + int flip; + int sign; + + float* col; + + const float str = rc->mode == WM_RADIALCONTROL_STRENGTH ? (rc->value + 0.5) : (brush->texture_overlay_alpha / 100.0f); if(rc->mode == WM_RADIALCONTROL_SIZE) { r1= rc->value; @@ -2415,29 +2626,37 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata) r3= r1; } else if(rc->mode == WM_RADIALCONTROL_STRENGTH) { r1= (1 - rc->value) * WM_RADIAL_CONTROL_DISPLAY_SIZE; - r2= WM_RADIAL_CONTROL_DISPLAY_SIZE; - r3= WM_RADIAL_CONTROL_DISPLAY_SIZE; + r2= r3= WM_RADIAL_CONTROL_DISPLAY_SIZE; } else if(rc->mode == WM_RADIALCONTROL_ANGLE) { - r1= r2= WM_RADIAL_CONTROL_DISPLAY_SIZE; - r3= WM_RADIAL_CONTROL_DISPLAY_SIZE; + r1= r2= r3= WM_RADIAL_CONTROL_DISPLAY_SIZE; angle = rc->value; } - glColor4ub(255, 255, 255, 128); - glEnable( GL_LINE_SMOOTH ); + /* Keep cursor in the original place */ + x = rc->initial_mouse[0] - ar->winrct.xmin; + y = rc->initial_mouse[1] - ar->winrct.ymin; + + view3d_set_viewcontext(C, &vc); + + // XXX: no way currently to know state of pen flip or invert key modifier without starting a stroke + flip = 1; + + sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1); + + if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH)) + col = brush->sub_col; + else + col = brush->add_col; + + glTranslatef((float)x, (float)y, 0.0f); + glEnable(GL_BLEND); - if(rc->mode == WM_RADIALCONTROL_ANGLE) - fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0); - - if(rc->tex) { - const float str = rc->mode == WM_RADIALCONTROL_STRENGTH ? (rc->value + 0.5) : 1; - - if(rc->mode == WM_RADIALCONTROL_ANGLE) { - glRotatef(angle, 0, 0, 1); - fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0); - } + if(rc->mode == WM_RADIALCONTROL_ANGLE) { + glRotatef(angle, 0, 0, 1); + } + if (rc->tex) { glBindTexture(GL_TEXTURE_2D, rc->tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -2445,7 +2664,7 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata) glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); - glColor4f(0,0,0, str); + glColor4f(U.sculpt_paint_overlay_col[0],U.sculpt_paint_overlay_col[1],U.sculpt_paint_overlay_col[2], str); glTexCoord2f(0,0); glVertex2f(-r3, -r3); glTexCoord2f(1,0); @@ -2458,11 +2677,20 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata) glDisable(GL_TEXTURE_2D); } - glColor4ub(255, 255, 255, 128); + if(rc->mode == WM_RADIALCONTROL_ANGLE) { + glColor4f(col[0], col[1], col[2], 0.5f); + glEnable(GL_LINE_SMOOTH); + glRotatef(-angle, 0, 0, 1); + fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0); + glRotatef(angle, 0, 0, 1); + fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0); + glDisable(GL_LINE_SMOOTH); + } + + glColor4f(col[0], col[1], col[2], 0.5f); glutil_draw_lined_arc(0.0, M_PI*2.0, r1, 40); glutil_draw_lined_arc(0.0, M_PI*2.0, r2, 40); glDisable(GL_BLEND); - glDisable( GL_LINE_SMOOTH ); glPopMatrix(); } @@ -2474,6 +2702,7 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event) float dist; double new_value = RNA_float_get(op->ptr, "new_value"); int ret = OPERATOR_RUNNING_MODAL; + float initial_value = RNA_float_get(op->ptr, "initial_value"); mode = RNA_int_get(op->ptr, "mode"); RNA_int_get_array(op->ptr, "initial_mouse", initial_mouse); @@ -2482,6 +2711,16 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event) case MOUSEMOVE: delta[0]= initial_mouse[0] - event->x; delta[1]= initial_mouse[1] - event->y; + + //if (mode == WM_RADIALCONTROL_SIZE) + // delta[0]+= initial_value; + //else if(mode == WM_RADIALCONTROL_STRENGTH) + // delta[0]+= WM_RADIAL_CONTROL_DISPLAY_SIZE * (1 - initial_value); + //else if(mode == WM_RADIALCONTROL_ANGLE) { + // delta[0]+= WM_RADIAL_CONTROL_DISPLAY_SIZE * cos(initial_value*M_PI/180.0f); + // delta[1]+= WM_RADIAL_CONTROL_DISPLAY_SIZE * sin(initial_value*M_PI/180.0f); + //} + dist= sqrt(delta[0]*delta[0]+delta[1]*delta[1]); if(mode == WM_RADIALCONTROL_SIZE) @@ -2528,6 +2767,11 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event) ED_region_tag_redraw(CTX_wm_region(C)); + //if (ret != OPERATOR_RUNNING_MODAL) { + // wmWindow *win = CTX_wm_window(C); + // WM_cursor_restore(win); + //} + return ret; } @@ -2535,10 +2779,15 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event) int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event) { wmRadialControl *rc = MEM_callocN(sizeof(wmRadialControl), "radial control"); + // wmWindow *win = CTX_wm_window(C); int mode = RNA_int_get(op->ptr, "mode"); float initial_value = RNA_float_get(op->ptr, "initial_value"); + //float initial_size = RNA_float_get(op->ptr, "initial_size"); int mouse[2] = {event->x, event->y}; + //if (initial_size == 0) + // initial_size = WM_RADIAL_CONTROL_DISPLAY_SIZE; + if(mode == WM_RADIALCONTROL_SIZE) { rc->max_value = 200; mouse[0]-= initial_value; @@ -2573,7 +2822,9 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event) rc->initial_mouse[0] = mouse[0]; rc->initial_mouse[1] = mouse[1]; rc->cursor = WM_paint_cursor_activate(CTX_wm_manager(C), op->type->poll, - wm_radial_control_paint, op->customdata); + wm_radial_control_paint, op->customdata); + + //WM_cursor_modal(win, CURSOR_NONE); /* add modal handler */ WM_event_add_modal_handler(C, op); @@ -2598,7 +2849,7 @@ void WM_radial_control_string(wmOperator *op, char str[], int maxlen) } /** Important: this doesn't define an actual operator, it - just sets up the common parts of the radial control op. **/ + just sets up the common parts of the radial control op. **/ void WM_OT_radial_control_partial(wmOperatorType *ot) { static EnumPropertyItem radial_mode_items[] = { @@ -2624,6 +2875,28 @@ void WM_OT_radial_control_partial(wmOperatorType *ot) /* uses no type defines, fully local testing function anyway... ;) */ +static void redraw_timer_window_swap(bContext *C) +{ + wmWindow *win= CTX_wm_window(C); + ScrArea *sa; + + for(sa= CTX_wm_screen(C)->areabase.first; sa; sa= sa->next) + ED_area_tag_redraw(sa); + wm_draw_update(C); + + CTX_wm_window_set(C, win); /* XXX context manipulation warning! */ +} + +static EnumPropertyItem redraw_timer_type_items[] = { + {0, "DRAW", 0, "Draw Region", "Draw Region"}, + {1, "DRAW_SWAP", 0, "Draw Region + Swap", "Draw Region and Swap"}, + {2, "DRAW_WIN", 0, "Draw Window", "Draw Window"}, + {3, "DRAW_WIN_SWAP", 0, "Draw Window + Swap", "Draw Window and Swap"}, + {4, "ANIM_STEP", 0, "Anim Step", "Animation Steps"}, + {5, "ANIM_PLAY", 0, "Anim Play", "Animation Playback"}, + {6, "UNDO", 0, "Undo/Redo", "Undo/Redo"}, + {0, NULL, 0, NULL, NULL}}; + static int redraw_timer_exec(bContext *C, wmOperator *op) { ARegion *ar= CTX_wm_region(C); @@ -2632,7 +2905,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) int iter = RNA_int_get(op->ptr, "iterations"); int a; float time; - char *infostr= ""; + const char *infostr= ""; WM_cursor_wait(1); @@ -2673,14 +2946,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) CTX_wm_region_set(C, ar_back); } else if (type==3) { - wmWindow *win= CTX_wm_window(C); - ScrArea *sa; - - for(sa= CTX_wm_screen(C)->areabase.first; sa; sa= sa->next) - ED_area_tag_redraw(sa); - wm_draw_update(C); - - CTX_wm_window_set(C, win); /* XXX context manipulation warning! */ + redraw_timer_window_swap(C); } else if (type==4) { Scene *scene= CTX_data_scene(C); @@ -2689,23 +2955,34 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) else scene->r.cfra++; scene_update_for_newframe(scene, scene->lay); } - else { + else if (type==5) { + + /* play anim, return on same frame as started with */ + Scene *scene= CTX_data_scene(C); + int tot= (scene->r.efra - scene->r.sfra) + 1; + + while(tot--) { + /* todo, ability to escape! */ + scene->r.cfra++; + if(scene->r.cfra > scene->r.efra) + scene->r.cfra= scene->r.sfra; + + scene_update_for_newframe(scene, scene->lay); + redraw_timer_window_swap(C); + } + } + else { /* 6 */ ED_undo_pop(C); ED_undo_redo(C); } } time= ((PIL_check_seconds_timer()-stime)*1000); - - if(type==0) infostr= "Draw Region"; - if(type==1) infostr= "Draw Region and Swap"; - if(type==2) infostr= "Draw Window"; - if(type==3) infostr= "Draw Window and Swap"; - if(type==4) infostr= "Animation Steps"; - if(type==5) infostr= "Undo/Redo"; - + + RNA_enum_description(redraw_timer_type_items, type, &infostr); + WM_cursor_wait(0); - + BKE_reportf(op->reports, RPT_WARNING, "%d x %s: %.2f ms, average: %.4f", iter, infostr, time, time/iter); return OPERATOR_FINISHED; @@ -2713,24 +2990,15 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) static void WM_OT_redraw_timer(wmOperatorType *ot) { - static EnumPropertyItem prop_type_items[] = { - {0, "DRAW", 0, "Draw Region", ""}, - {1, "DRAW_SWAP", 0, "Draw Region + Swap", ""}, - {2, "DRAW_WIN", 0, "Draw Window", ""}, - {3, "DRAW_WIN_SWAP", 0, "Draw Window + Swap", ""}, - {4, "ANIM_STEP", 0, "Anim Step", ""}, - {5, "UNDO", 0, "Undo/Redo", ""}, - {0, NULL, 0, NULL, NULL}}; - ot->name= "Redraw Timer"; ot->idname= "WM_OT_redraw_timer"; ot->description="Simple redraw timer to test the speed of updating the interface"; - + ot->invoke= WM_menu_invoke; ot->exec= redraw_timer_exec; ot->poll= WM_operator_winactive; - - ot->prop= RNA_def_enum(ot->srna, "type", prop_type_items, 0, "Type", ""); + + ot->prop= RNA_def_enum(ot->srna, "type", redraw_timer_type_items, 0, "Type", ""); RNA_def_int(ot->srna, "iterations", 10, 1,INT_MAX, "Iterations", "Number of times to redraw", 1,1000); } @@ -2799,7 +3067,7 @@ void wm_operatortype_init(void) } -/* called in transform_ops.c, on each regeneration of keymaps */ +/* circleselect-like modal operators */ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) { static EnumPropertyItem modal_items[] = { @@ -2852,14 +3120,42 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) } -/* called in transform_ops.c, on each regeneration of keymaps */ +/* straight line modal operators */ +static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf) +{ + static EnumPropertyItem modal_items[] = { + {GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, + {GESTURE_MODAL_SELECT, "SELECT", 0, "Select", ""}, + {GESTURE_MODAL_BEGIN, "BEGIN", 0, "Begin", ""}, + {0, NULL, 0, NULL, NULL}}; + + wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Gesture Straight Line"); + + /* this function is called for each spacetype, only needs to add map once */ + if(keymap) return; + + keymap= WM_modalkeymap_add(keyconf, "Gesture Straight Line", modal_items); + + /* items for modal map */ + WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL); + WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL); + + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_SELECT); + + /* assign map to operators */ + WM_modalkeymap_assign(keymap, "IMAGE_OT_sample_line"); +} + + +/* borderselect-like modal operators */ static void gesture_border_modal_keymap(wmKeyConfig *keyconf) { static EnumPropertyItem modal_items[] = { {GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, {GESTURE_MODAL_SELECT, "SELECT", 0, "Select", ""}, {GESTURE_MODAL_DESELECT,"DESELECT", 0, "DeSelect", ""}, - {GESTURE_MODAL_BORDER_BEGIN, "BEGIN", 0, "Begin", ""}, + {GESTURE_MODAL_BEGIN, "BEGIN", 0, "Begin", ""}, {0, NULL, 0, NULL, NULL}}; wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Gesture Border"); @@ -2873,14 +3169,14 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL); WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL); - WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BORDER_BEGIN); - WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_SELECT); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_SELECT); #if 0 // Durian guys like this - WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_BORDER_BEGIN); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_BEGIN); WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_SHIFT, 0, GESTURE_MODAL_DESELECT); #else - WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BORDER_BEGIN); + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN); WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_DESELECT); #endif @@ -2896,6 +3192,7 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "NODE_OT_select_border"); // WM_modalkeymap_assign(keymap, "SCREEN_OT_border_select"); // template WM_modalkeymap_assign(keymap, "SEQUENCER_OT_select_border"); + WM_modalkeymap_assign(keymap, "SEQUENCER_OT_view_ghost_border"); WM_modalkeymap_assign(keymap, "UV_OT_select_border"); WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border"); WM_modalkeymap_assign(keymap, "VIEW3D_OT_clip_border"); @@ -2904,6 +3201,38 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border"); // XXX TODO: zoom border should perhaps map rightmouse to zoom out instead of in+cancel } +/* zoom to border modal operators */ +static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf) +{ + static EnumPropertyItem modal_items[] = { + {GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, + {GESTURE_MODAL_IN, "IN", 0, "In", ""}, + {GESTURE_MODAL_OUT, "OUT", 0, "Out", ""}, + {GESTURE_MODAL_BEGIN, "BEGIN", 0, "Begin", ""}, + {0, NULL, 0, NULL, NULL}}; + + wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Gesture Zoom Border"); + + /* this function is called for each spacetype, only needs to add map once */ + if(keymap) return; + + keymap= WM_modalkeymap_add(keyconf, "Gesture Zoom Border", modal_items); + + /* items for modal map */ + WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL); + WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL); + + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_IN); + + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN); + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_OUT); + + /* assign map to operators */ + WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border"); + WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border"); +} + /* default keymap for windows and screens, only call once per WM */ void wm_window_keymap(wmKeyConfig *keyconf) { @@ -2928,6 +3257,7 @@ void wm_window_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "WM_OT_link_append", OKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); kmi= WM_keymap_add_item(keymap, "WM_OT_link_append", F1KEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "link", FALSE); + RNA_boolean_set(kmi->ptr, "instance_groups", FALSE); WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "WM_OT_save_mainfile", WKEY, KM_PRESS, KM_CTRL, 0); @@ -2946,55 +3276,57 @@ void wm_window_keymap(wmKeyConfig *keyconf) kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F2KEY, KM_PRESS, KM_SHIFT, 0); /* new in 2.5x, was DXF export */ - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "LOGIC_EDITOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F3KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "NODE_EDITOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F4KEY, KM_PRESS, KM_SHIFT, 0); /* new in 2.5x, was data browser */ - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "CONSOLE"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F5KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "VIEW_3D"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F6KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "GRAPH_EDITOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F7KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "PROPERTIES"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F8KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "SEQUENCE_EDITOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F9KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "OUTLINER"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F10KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "IMAGE_EDITOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F11KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "TEXT_EDITOR"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F12KEY, KM_PRESS, KM_SHIFT, 0); - RNA_string_set(kmi->ptr, "path", "area.type"); + RNA_string_set(kmi->ptr, "data_path", "area.type"); RNA_string_set(kmi->ptr, "value", "DOPESHEET_EDITOR"); gesture_circle_modal_keymap(keyconf); gesture_border_modal_keymap(keyconf); + gesture_zoom_border_modal_keymap(keyconf); + gesture_straightline_modal_keymap(keyconf); } /* Generic itemf's for operators that take library args */ -static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, ID *id) +static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, ID *id, int local) { EnumPropertyItem *item= NULL, item_tmp; int totitem= 0; @@ -3003,9 +3335,11 @@ static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, I memset(&item_tmp, 0, sizeof(item_tmp)); for( ; id; id= id->next) { - item_tmp.identifier= item_tmp.name= id->name+2; - item_tmp.value= i++; - RNA_enum_item_add(&item, &totitem, &item_tmp); + if(local==FALSE || id->lib==NULL) { + item_tmp.identifier= item_tmp.name= id->name+2; + item_tmp.value= i++; + RNA_enum_item_add(&item, &totitem, &item_tmp); + } } RNA_enum_item_end(&item, &totitem); @@ -3017,13 +3351,36 @@ static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, I /* can add more as needed */ EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, int *free) { - return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL); + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL, FALSE); } +EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL, TRUE); +} + EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *free) { - return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL); + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL, FALSE); } +EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL, TRUE); +} + +EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->image.first : NULL, FALSE); +} +EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->image.first : NULL, TRUE); +} + EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, int *free) { - return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL); + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, FALSE); +} +EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, TRUE); } diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c index efa9010fc65..207b6cebfe6 100644 --- a/source/blender/windowmanager/intern/wm_subwindow.c +++ b/source/blender/windowmanager/intern/wm_subwindow.c @@ -44,7 +44,8 @@ #include "BKE_global.h" #include "BIF_gl.h" -#include "BIF_glutil.h" + +#include "GPU_extensions.h" #include "WM_api.h" #include "wm_subwindow.h" @@ -209,8 +210,8 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct) * Really Blender should never _ever_ try * to do such a thing, but just to be safe * clamp it anyway (or fix the bScreen - * scaling routine, and be damn sure you - * fixed it). - zr (2001!) + * scaling routine, and be damn sure you + * fixed it). - zr (2001!) */ if (swin->winrct.xmax > win->sizex) @@ -302,28 +303,6 @@ void wmOrtho2(float x1, float x2, float y1, float y2) /* *************************** Framebuffer color depth, for selection codes ********************** */ -static int wm_get_colordepth(void) -{ - static int mainwin_color_depth= 0; - - if(mainwin_color_depth==0) { - GLint r, g, b; - - glGetIntegerv(GL_RED_BITS, &r); - glGetIntegerv(GL_GREEN_BITS, &g); - glGetIntegerv(GL_BLUE_BITS, &b); - - mainwin_color_depth= r + g + b; - if(G.f & G_DEBUG) { - printf("Color depth r %d g %d b %d\n", (int)r, (int)g, (int)b); - glGetIntegerv(GL_AUX_BUFFERS, &r); - printf("Aux buffers: %d\n", (int)r); - } - } - return mainwin_color_depth; -} - - #ifdef __APPLE__ /* apple seems to round colors to below and up on some configs */ @@ -332,7 +311,7 @@ unsigned int index_to_framebuffer(int index) { unsigned int i= index; - switch(wm_get_colordepth()) { + switch(GPU_color_depth()) { case 12: i= ((i & 0xF00)<<12) + ((i & 0xF0)<<8) + ((i & 0xF)<<4); /* sometimes dithering subtracts! */ @@ -362,7 +341,7 @@ unsigned int index_to_framebuffer(int index) { unsigned int i= index; - switch(wm_get_colordepth()) { + switch(GPU_color_depth()) { case 8: i= ((i & 48)<<18) + ((i & 12)<<12) + ((i & 3)<<6); i |= 0x3F3F3F; @@ -399,7 +378,7 @@ int WM_framebuffer_to_index(unsigned int col) { if (col==0) return 0; - switch(wm_get_colordepth()) { + switch(GPU_color_depth()) { case 8: return ((col & 0xC00000)>>18) + ((col & 0xC000)>>12) + ((col & 0xC0)>>6); case 12: diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 0664c5ab8bb..6d01620dae8 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1,5 +1,5 @@ /** - * $Id: wm_window.c + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -729,7 +729,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) CTX_wm_window_set(C, win); WM_operator_properties_create(&props_ptr, "WM_OT_open_mainfile"); - RNA_string_set(&props_ptr, "path", path); + RNA_string_set(&props_ptr, "filepath", path); WM_operator_name_call(C, "WM_OT_open_mainfile", WM_OP_EXEC_DEFAULT, &props_ptr); WM_operator_properties_free(&props_ptr); @@ -739,21 +739,64 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) } case GHOST_kEventDraggingDropDone: { - wmEvent event= *(win->eventstate); /* copy last state, like mouse coords */ + wmEvent event; + GHOST_TEventDragnDropData *ddd= GHOST_GetEventData(evt); + int cx, cy, wx, wy; + + + /* entering window, update mouse pos */ + GHOST_GetCursorPosition(g_system, &wx, &wy); + + GHOST_ScreenToClient(win->ghostwin, wx, wy, &cx, &cy); + win->eventstate->x= cx; + +#if defined(__APPLE__) && defined(GHOST_COCOA) + //Cocoa already uses coordinates with y=0 at bottom + win->eventstate->y= cy; +#else + win->eventstate->y= (win->sizey-1) - cy; +#endif + + event= *(win->eventstate); /* copy last state, like mouse coords */ + + // activate region + event.type= MOUSEMOVE; + event.prevx= event.x; + event.prevy= event.y; + + wm->winactive= win; /* no context change! c->wm->windrawable is drawable, or for area queues */ + win->active= 1; + + wm_event_add(win, &event); + /* make blender drop event with custom data pointing to wm drags */ event.type= EVT_DROP; + event.val= KM_RELEASE; event.custom= EVT_DATA_LISTBASE; event.customdata= &wm->drags; + event.customdatafree= 1; - printf("Drop detected\n"); + wm_event_add(win, &event); + + /* printf("Drop detected\n"); */ /* add drag data to wm for paths: */ /* need icon type, some dropboxes check for that... see filesel code for this */ - // WM_event_start_drag(C, icon, WM_DRAG_PATH, void *poin, 0.0); - /* void poin should point to string, it makes a copy */ - wm_event_add(win, &event); + if(ddd->dataType == GHOST_kDragnDropTypeFilenames) { + GHOST_TStringArray *stra= ddd->data; + int a; + + for(a=0; acount; a++) { + printf("drop file %s\n", stra->strings[a]); + WM_event_start_drag(C, 0, WM_DRAG_PATH, stra->strings[a], 0.0); + /* void poin should point to string, it makes a copy */ + break; // only one drop element supported now + } + } + + break; } @@ -975,6 +1018,18 @@ void WM_clipboard_text_set(char *buf, int selection) #endif } +/* ******************* progress bar **************** */ + +void WM_progress_set(wmWindow *win, float progress) +{ + GHOST_SetProgressBar(win->ghostwin, progress); +} + +void WM_progress_clear(wmWindow *win) +{ + GHOST_EndProgressBar(win->ghostwin); +} + /* ************************************ */ void wm_window_get_position(wmWindow *win, int *posx_r, int *posy_r) @@ -1057,7 +1112,9 @@ void WM_cursor_warp(wmWindow *win, int x, int y) if (win && win->ghostwin) { int oldx=x, oldy=y; +#if !defined(__APPLE__) || !defined(GHOST_COCOA) y= win->sizey -y - 1; +#endif GHOST_ClientToScreen(win->ghostwin, x, y, &x, &y); GHOST_SetCursorPosition(g_system, x, y); diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h index bf07ee0c884..7228a6dcd93 100644 --- a/source/blender/windowmanager/wm.h +++ b/source/blender/windowmanager/wm.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/windowmanager/wm_draw.h b/source/blender/windowmanager/wm_draw.h index fdece6efc00..762d759c936 100644 --- a/source/blender/windowmanager/wm_draw.h +++ b/source/blender/windowmanager/wm_draw.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -38,5 +38,7 @@ void wm_draw_update (struct bContext *C); void wm_draw_window_clear (struct wmWindow *win); void wm_draw_region_clear (struct wmWindow *win, struct ARegion *ar); +void wm_tag_redraw_overlay (struct wmWindow *win, struct ARegion *ar); + #endif /* WM_DRAW_H */ diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 2f4519d57ba..8fd650fb184 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index b71ccd430c0..6cb3971bd21 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -1,5 +1,5 @@ /* - * $Id: wm_event_types.h + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -70,6 +70,7 @@ /* mapped with userdef */ #define WHEELINMOUSE 0x00c #define WHEELOUTMOUSE 0x00d +#define INBETWEEN_MOUSEMOVE 0x011 /* SYSTEM : 0x01xx */ @@ -187,6 +188,13 @@ #define F10KEY 309 #define F11KEY 310 #define F12KEY 311 +#define F13KEY 312 +#define F14KEY 313 +#define F15KEY 314 +#define F16KEY 315 +#define F17KEY 316 +#define F18KEY 317 +#define F19KEY 318 #define PAUSEKEY 165 #define INSERTKEY 166 @@ -206,6 +214,9 @@ /* test whether the event is a key on the keyboard */ #define ISKEYBOARD(event) (event >=' ' && event <=320) + /* test whether the event is a modifier key */ +#define ISKEYMODIFIER(event) ((event >= LEFTCTRLKEY && event <= LEFTSHIFTKEY) || event == COMMANDKEY) + /* test whether the event is a mouse button */ #define ISMOUSE(event) (event >= LEFTMOUSE && event <= MOUSEROTATE) @@ -216,7 +227,7 @@ #define ISTWEAK(event) (event >= EVT_TWEAK_L && event <= EVT_GESTURE) /* test whether event type is acceptable as hotkey, excluding modifiers */ -#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && !(event>=LEFTCTRLKEY && event<=ESCKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY)) +#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && !(event>=LEFTCTRLKEY && event<=LEFTSHIFTKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY)) /* **************** BLENDER GESTURE EVENTS ********************* */ @@ -281,7 +292,10 @@ #define GESTURE_MODAL_CIRCLE_ADD 6 /* circle sel: larger brush */ #define GESTURE_MODAL_CIRCLE_SUB 7 /* circle sel: smaller brush */ -#define GESTURE_MODAL_BORDER_BEGIN 8 /* border select, activate, use release to detect which button */ +#define GESTURE_MODAL_BEGIN 8 /* border select/straight line, activate, use release to detect which button */ + +#define GESTURE_MODAL_IN 9 +#define GESTURE_MODAL_OUT 10 #endif /* WM_EVENT_TYPES_H */ diff --git a/source/blender/windowmanager/wm_files.h b/source/blender/windowmanager/wm_files.h index b70e4551069..15a38251795 100644 --- a/source/blender/windowmanager/wm_files.h +++ b/source/blender/windowmanager/wm_files.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,7 +28,7 @@ #ifndef WM_FILES_H #define WM_FILES_H -extern void read_Blog(void); +extern void read_history(void); extern void delete_autosave(void); diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index 9b996baa7ef..fa244036645 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -1,5 +1,5 @@ /** - * $Id: wm_window.h + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt index 60ea3347c3e..38ccb56c410 100644 --- a/source/blenderplayer/CMakeLists.txt +++ b/source/blenderplayer/CMakeLists.txt @@ -81,10 +81,11 @@ IF(UNIX) bf_oglrasterizer bf_expressions bf_scenegraph - bf_ikplugin - bf_ITASC - bf_IK - bf_smoke + bf_ikplugin + bf_ITASC + bf_IK + bf_smoke + bf_modifiers bf_moto bf_kernel bf_nodes @@ -115,7 +116,7 @@ IF(UNIX) ) IF(WITH_QUICKTIME) - SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} quicktime) + SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_quicktime) ENDIF(WITH_QUICKTIME) IF(WITH_CXX_GUARDEDALLOC) diff --git a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt index a172ff71c11..9a53997fd66 100644 --- a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt +++ b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt @@ -38,6 +38,10 @@ SET(INC ../../../source/blender/makesrna ) +IF(WITH_GAMEENGINE) + ADD_DEFINITIONS(-DGAMEBLENDER) +ENDIF(WITH_GAMEENGINE) + IF(WITH_INTERNATIONAL) ADD_DEFINITIONS(-DWITH_FREETYPE2) ENDIF(WITH_INTERNATIONAL) diff --git a/source/blenderplayer/bad_level_call_stubs/SConscript b/source/blenderplayer/bad_level_call_stubs/SConscript index ab98e984cef..aa84b88932e 100644 --- a/source/blenderplayer/bad_level_call_stubs/SConscript +++ b/source/blenderplayer/bad_level_call_stubs/SConscript @@ -10,4 +10,7 @@ defs = '' if env['WITH_BF_INTERNATIONAL']: defs += 'WITH_FREETYPE2' +if env['WITH_BF_GAMEENGINE']: + defs += ' GAMEBLENDER=1' + env.BlenderLib ('blenkernel_blc', sources = Split(sources), includes=Split(incs), defines=Split(defs), libtype=['player'],priority=[220] ) diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 00c827bab94..4599f8ff17b 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -28,6 +28,7 @@ * BKE_bad_level_calls function stubs */ +#if GAMEBLENDER == 1 #include #include "DNA_listBase.h" #include "RNA_types.h" @@ -35,30 +36,40 @@ struct ARegion; struct ARegionType; struct Base; +struct Brush; +struct bNodeTree; struct CSG_FaceIteratorDescriptor; struct CSG_VertexIteratorDescriptor; struct ColorBand; struct CurveMapping; struct EditBone; +struct EditFace; struct EditMesh; struct ID; +struct FCurve; struct ImBuf; struct Image; struct ImageUser; +struct KeyingSetInfo; +struct KeyingSet; struct LOD_Decimation_Info; struct MTex; struct Main; struct Material; +struct MCol; struct MenuType; struct Mesh; struct ModifierData; +struct MultiresModifierData; struct NodeBlurData; struct Object; +struct PBVHNode; struct Render; struct RenderEngine; struct RenderLayer; struct RenderResult; struct ScrArea; +struct SculptSession; struct ShadeInput; struct ShadeResult; struct SpaceImage; @@ -76,9 +87,11 @@ struct wmKeyConfig; struct wmKeyMap; struct wmOperator; struct wmWindowManager; +struct View3D; + /*new render funcs */ -float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype) {return NULL;} +float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype) {return (float *) NULL;} float RE_filter_value(int type, float x) {return 0.0f;} struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name) {return (struct RenderLayer *)NULL;} @@ -99,9 +112,9 @@ struct RenderResult *RE_GetResult(struct Render *re){return (struct RenderResult struct Render *RE_GetRender(const char *name){return (struct Render *) NULL;} /* blenkernel */ -char* btempdir(){return NULL;} +char* btempdir(){return (char *) NULL;} void RE_FreeRenderResult(struct RenderResult *res){} -char* datatoc_bmonofont_ttf(){return NULL;} +char* datatoc_bmonofont_ttf(){return (char *) NULL;} int datatoc_bmonofont_ttf_size(){return 0;} struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty){return (struct RenderResult *) NULL;} void RE_GetResultImage(struct Render *re, struct RenderResult *rr){} @@ -117,13 +130,17 @@ void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg char stipple_quarttone[1]; //GLubyte stipple_quarttone[128] double elbeemEstimateMemreq(int res, float sx, float sy, float sz, int refine, char *retstr) {return 0.0f;} struct Render *RE_NewRender(const char *name){return (struct Render*) NULL;} +void RE_SwapResult(struct Render *re, struct RenderResult **rr){} void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame){} /* rna */ +float *give_cursor(struct Scene *scene, struct View3D *v3d){return (float *) NULL;} void WM_menutype_free(void){} void WM_menutype_freelink(struct MenuType* mt){} int WM_menutype_add(struct MenuType *mt) {return 0;} +int WM_operator_props_dialog_popup (struct bContext *C, struct wmOperator *op, int width, int height){return 0;} struct MenuType *WM_menutype_find(const char *idname, int quiet){return (struct MenuType *) NULL;} +void WM_operator_stack_clear(struct bContext *C) {} void WM_autosave_init(struct bContext *C){} void WM_jobs_stop_all(struct wmWindowManager *wm){} @@ -139,8 +156,8 @@ void object_test_constraints (struct Object *owner){} void ED_object_parent(struct Object *ob, struct Object *par, int type, const char *substr){} void ED_object_constraint_set_active(struct Object *ob, struct bConstraint *con){} void ED_node_composit_default(struct Scene *sce){} -void *ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *custumdata, int type){return 0;} -void *ED_region_draw_cb_customdata(void *handle){return 0;} +void *ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *custumdata, int type){return 0;} /* XXX this one looks wierd */ +void *ED_region_draw_cb_customdata(void *handle){return 0;} /* XXX This one looks wrong also */ void ED_region_draw_cb_exit(struct ARegionType *art, void *handle){} struct EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, struct EditBone *ebo){return (struct EditBone *) NULL;} @@ -177,10 +194,20 @@ int WM_keymap_item_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2){ret /* rna editors */ +struct FCurve *verify_fcurve (struct bAction *act, const char group[], const char rna_path[], const int array_index, short add){return (struct FCurve *) NULL;} +int insert_vert_fcurve(struct FCurve *fcu, float x, float y, short flag){return 0;} +void delete_fcurve_key(struct FCurve *fcu, int index, short do_recalc){} +struct KeyingSetInfo *ANIM_keyingset_info_find_named (const char name[]){return (struct KeyingSetInfo *) NULL;} +struct KeyingSet *ANIM_scene_get_active_keyingset (struct Scene *scene){return (struct KeyingSet *) NULL;} +int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks){return 0;} +struct ListBase builtin_keyingsets; +void ANIM_keyingset_info_register (const struct bContext *C, struct KeyingSetInfo *ksi){} +void ANIM_keyingset_info_unregister (const struct bContext *C, struct KeyingSetInfo *ksi){} short ANIM_add_driver(struct ID *id, const char rna_path[], int array_index, short flag, int type){return 0;} +short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index, short flag){return 0;} void ED_space_image_release_buffer(struct SpaceImage *sima, void *lock){} struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **lock_r){return (struct ImBuf *) NULL;} -char *ED_info_stats_string(struct Scene *scene){return NULL;} +char *ED_info_stats_string(struct Scene *scene){return (char *) NULL;} void ED_area_tag_redraw(struct ScrArea *sa){} void ED_area_tag_refresh(struct ScrArea *sa){} void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type){} @@ -188,6 +215,7 @@ void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op){} void WM_cursor_wait (int val) {} void ED_node_texture_default(struct Tex *tx){} void ED_node_changed_update(struct bContext *C, struct bNode *node){} +void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node){} void ED_view3d_scene_layers_update(struct Main *bmain, struct Scene *scene){} int ED_view3d_scene_layer_set(int lay, const int *values){return 0;} void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){} @@ -219,41 +247,43 @@ void ED_mesh_transform(struct Mesh *me, float *mat){} void ED_mesh_update(struct Mesh *mesh, struct bContext *C){} int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me){return 0;} int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me){return 0;} -void ED_object_apply_obmat(struct Object *ob){} void ED_object_constraint_dependency_update(struct Scene *scene, struct Object *ob){} void ED_object_constraint_update(struct Object *ob){} struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name){return (struct bDeformGroup *) NULL;} void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum, float weight, int assignmode){} void ED_sequencer_update_view(struct bContext *C, int view){} float ED_rollBoneToVector(struct EditBone *bone, float new_up_axis[3]){return 0.0f;} +void ED_space_image_size(struct SpaceImage *sima, int *width, int *height){} void EM_selectmode_set(struct EditMesh *em){} +int EM_texFaceCheck(struct EditMesh *em){return 0;} +struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloopy){return (struct MTFace *)NULL;} void make_editMesh(struct Scene *scene, struct Object *ob){} void load_editMesh(struct Scene *scene, struct Object *ob){} -void uiItemR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int flag){} +void uiItemR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, char *name, int icon){} -PointerRNA uiItemFullO(struct uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context, int flag){PointerRNA a; return a;} +struct PointerRNA uiItemFullO(struct uiLayout *layout, char *idname, char *name, int icon, struct IDProperty *properties, int context, int flag){struct PointerRNA a; return a;} struct uiLayout *uiLayoutRow(struct uiLayout *layout, int align){return (struct uiLayout *) NULL;} struct uiLayout *uiLayoutColumn(struct uiLayout *layout, int align){return (struct uiLayout *) NULL;} struct uiLayout *uiLayoutColumnFlow(struct uiLayout *layout, int number, int align){return (struct uiLayout *) NULL;} struct uiLayout *uiLayoutBox(struct uiLayout *layout){return (struct uiLayout *) NULL;} struct uiLayout *uiLayoutSplit(struct uiLayout *layout, float percentage, int align){return (struct uiLayout *) NULL;} void uiItemsEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){} -void uiItemMenuEnumR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname){} -void uiItemEnumR_string(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value){} -void uiItemPointerR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname){} +void uiItemMenuEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon){} +void uiItemEnumR_string(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon){} +void uiItemPointerR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon){} void uiItemsEnumO(struct uiLayout *layout, char *opname, char *propname){} void uiItemEnumO_string(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value_str){} -void uiItemMenuEnumO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname){} +void uiItemMenuEnumO(struct uiLayout *layout, char *opname, char *propname, char *name, int icon){} void uiItemBooleanO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, int value){} void uiItemIntO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, int value){} void uiItemFloatO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, float value){} void uiItemStringO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value){} void uiItemL(struct uiLayout *layout, char *name, int icon){} -void uiItemM(struct uiLayout *layout, struct bContext *C, char *name, int icon, char *menuname){} +void uiItemM(struct uiLayout *layout, struct bContext *C, char *menuname, char *name, int icon){} void uiItemS(struct uiLayout *layout){} -void uiItemFullR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag){} +void uiItemFullR(struct uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, char *name, int icon){} void uiLayoutSetContextPointer(struct uiLayout *layout, char *name, struct PointerRNA *ptr){} char *uiLayoutIntrospect(struct uiLayout *layout){return (char *)NULL;} @@ -281,6 +311,8 @@ void uiTemplateDopeSheetFilter(struct uiLayout *layout, struct bContext *C, stru void uiTemplateColorWheel(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, int value_slider){} void uiTemplateHistogram(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand){} void uiTemplateReportsBanner(struct uiLayout *layout, struct bContext *C, struct wmOperator *op){} +void uiTemplateWaveform(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand){} +void uiTemplateVectorscope(struct uiLayout *_self, struct PointerRNA *data, char* property, int expand){} /* rna render */ struct RenderResult *RE_engine_begin_result(struct RenderEngine *engine, int x, int y, int w, int h){return (struct RenderResult *) NULL;} @@ -316,9 +348,9 @@ void WM_operator_py_idname(char *to, const char *from){} void WM_operator_ui_popup(struct bContext *C, struct wmOperator *op, int width, int height){} short insert_keyframe (struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag){return 0;} short delete_keyframe(struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag){return 0;}; -char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args){return NULL;} -struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value){return NULL;} -struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items){return NULL;} +char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args){return (char *)NULL;} +struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value){return (struct wmKeyMapItem *)NULL;} +struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items){return (struct wmKeyMap *) NULL;} /* intern/decimation */ int LOD_FreeDecimationData(struct LOD_Decimation_Info *info){return 0;} @@ -327,9 +359,7 @@ int LOD_PreprocessMesh(struct LOD_Decimation_Info *info){return 0;} int LOD_LoadMesh(struct LOD_Decimation_Info *info){return 0;} /* smoke */ -void lzo1x_1_compress(void) {return;} void LzmaCompress(void) { return; } -void lzo1x_decompress(void) {return;} void LzmaUncompress(void) {return;} /* smoke is included anyway void smoke_export(void) {return;} @@ -351,6 +381,24 @@ void smoke_get_index(void) {return;} void smoke_step(void) {return;} */ +/* sculpt */ +/* + void ED_sculpt_force_update(struct bContext *C) {} +struct SculptUndoNode *sculpt_undo_push_node(struct SculptSession *ss, struct PBVHNode *node) {return (struct SculptUndoNode *)NULL;} +void sculpt_undo_push_end(void) {} +void sculpt_undo_push_begin(char *name) {} +struct SculptUndoNode *sculpt_undo_get_node(struct PBVHNode *node) {return (struct SculptUndoNode *) NULL;} +struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob) {return (struct MultiresModifierData *) NULL;} +int sculpt_modifiers_active(struct Scene *scene, struct Object *ob) {return 0;} +*/ +int sculpt_get_brush_size(struct Brush *brush) {return 0;} +void sculpt_set_brush_size(struct Brush *brush, int size) {} +int sculpt_get_lock_brush_size(struct Brush *brush){ return 0;} +float sculpt_get_brush_unprojected_radius(struct Brush *brush){return 0.0f;} +void sculpt_set_brush_unprojected_radius(struct Brush *brush, float unprojected_radius){} +float sculpt_get_brush_alpha(struct Brush *brush){return 0.0f;} +void sculpt_set_brush_alpha(struct Brush *brush, float alpha){} + char blender_path[] = ""; /* CSG */ @@ -373,3 +421,5 @@ int CSG_PerformBooleanOperation( CSG_FaceIteratorDescriptor obBFaces, CSG_VertexIteratorDescriptor obBVertices) { return 0;} + +#endif // GAMEBLENDER == 1 diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 7ead3868fa4..f6eb2741945 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -29,28 +29,25 @@ CMAKE_POLICY(SET CMP0005 NEW) SETUP_LIBDIRS() -INCLUDE_DIRECTORIES(../../intern/guardedalloc +INCLUDE_DIRECTORIES( + ../../intern/guardedalloc ../blender/blenlib ../blender/blenkernel ../blender/editors/include ../blender/makesrna - ../blender/makesrna/intern - ../blender/nodes - ../blender/include - ../blender/blenloader ../blender/imbuf - ../blender/renderconverter ../blender/render/extern/include ../blender/makesdna ../blender/gpu ../blender/windowmanager ../kernel/gen_messaging ../kernel/gen_system - ../../extern/glew/include ../blender/bmesh ) - +IF(WIN32) + INCLUDE_DIRECTORIES(${PTHREADS_INC}) +ENDIF(WIN32) IF(WITH_QUICKTIME) ADD_DEFINITIONS(-DWITH_QUICKTIME) @@ -60,6 +57,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_PYTHON) INCLUDE_DIRECTORIES(../blender/python) ELSE(WITH_PYTHON) @@ -189,9 +190,31 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ENDIF(WITH_GAMEENGINE AND WITH_PLAYER) INSTALL( - DIRECTORY ${TARGETDIR}/.blender/ - DESTINATION ${BLENDERPATH} - ) + FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications + ) + INSTALL( + FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps + ) + INSTALL( + DIRECTORY ${CMAKE_SOURCE_DIR}/release/text/ + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/blender + PATTERN ".svn" EXCLUDE + ) + INSTALL( + DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts/ + DESTINATION ${BLENDERPATH}/scripts + PATTERN ".svn" EXCLUDE + ) + IF(WITH_INTERNATIONAL) + INSTALL( + DIRECTORY ${CMAKE_SOURCE_DIR}/bin/.blender/locale/ + DESTINATION ${BLENDERPATH}/datafiles/locale + PATTERN ".svn" EXCLUDE + ) + ENDIF(WITH_INTERNATIONAL) + # end "make install" ENDIF(UNIX AND NOT APPLE) @@ -205,18 +228,16 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) COMMAND cp -Rf ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/ COMMAND cp -Rf ${SOURCEDIR}/Contents/Resources ${TARGETDIR}/blender.app/Contents/ COMMAND cat ${SOURCEINFO} | sed s/VERSION/`cat ${CMAKE_SOURCE_DIR}/release/VERSION`/ | sed s/DATE/`date +'%Y-%b-%d'`/ > ${TARGETINFO} - COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/.blender - COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ - COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ + COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/datafiles + COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/ + COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/ ) IF(WITH_INTERNATIONAL) ADD_CUSTOM_COMMAND( TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ - COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/Resources/ - COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ - COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/Resources/ + COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/ + COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/ ) ENDIF(WITH_INTERNATIONAL) @@ -228,9 +249,10 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ENDIF(WITH_LIBS10.5) ADD_CUSTOM_COMMAND( TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ - COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/.blender/python/ - COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/.blender/python/ + COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/scripts/ + COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/python/ + COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/python/ + COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/python/ COMMAND find ${TARGETDIR}/blender.app -name "*.py?" -prune -exec rm -rf {} "\;" ) ENDIF(WITH_PYTHON) @@ -243,8 +265,6 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ) ENDIF(APPLE) IF(WIN32) - FILE(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} WIN_SOURCE_DIR) - ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender @@ -252,38 +272,35 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\" COMMAND if not exist \"${TARGETDIR}\\.blender\\scripts\" mkdir \"${TARGETDIR}\\.blender\\scripts\" COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\" - COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\" - COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\" - COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\" - COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\" - COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\" - COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\" + COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\" + COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\" + COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\" + COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\" + COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\" + COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\" # TODO, copy python bundle - # COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\windows\\extra\\python31.zip\" \"${TARGETDIR}\\\" + # COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\windows\\extra\\python31.zip\" \"${TARGETDIR}\\\" ) - FILE(TO_NATIVE_PATH "${LIBDIR}" WIN_LIBDIR) - ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\python31_d.zip\" - COMMAND copy /Y \"${WIN_LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\tiff\\lib\\libtiff.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\python31_d.zip\" + COMMAND copy /Y \"${LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\" + # COMMAND copy /Y \"${LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\" ) IF(WITH_INTERNATIONAL) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_INTERNATIONAL) @@ -291,16 +308,16 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_FFMPEG) @@ -308,7 +325,7 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_SNDFILE) @@ -316,7 +333,7 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_JACK) @@ -324,8 +341,8 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_OPENAL) @@ -335,7 +352,7 @@ ADD_DEPENDENCIES(blender makesdna) FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS) -SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_editors blender_render) +SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager blender_render) IF(WITH_ELBEEM) SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_elbeem) @@ -349,24 +366,66 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") # Sort libraries SET(BLENDER_SORTED_LIBS bf_windowmanager - bf_editors - bf_decimation + + bf_editor_space_api + bf_editor_space_action + bf_editor_space_buttons + bf_editor_space_console + bf_editor_space_file + bf_editor_space_graph + bf_editor_space_image + bf_editor_space_info + bf_editor_space_logic + bf_editor_space_nla + bf_editor_space_node + bf_editor_space_outliner + bf_editor_space_script + bf_editor_space_sequencer + bf_editor_space_sound + bf_editor_space_time + bf_editor_space_userpref + bf_editor_space_view3d + + bf_editor_text + bf_editor_transform + bf_editor_util + bf_editor_uvedit + bf_editor_curve + bf_editor_armature + bf_editor_gpencil + bf_editor_interface + bf_editor_mesh + bf_editor_metaball + bf_editor_object + bf_editor_physics + bf_editor_render + bf_editor_screen + bf_editor_sculpt_paint + bf_editor_sound + bf_editor_animation + bf_editor_datafiles + blender_BSP - bf_ghost - bf_string blender_render blender_ONL bf_python bf_gen_python bf_ikplugin +<<<<<<< .working bf_bmesh bf_blenkernel +======= + bf_modifiers + bf_blenkernel +>>>>>>> .merge-right.r30358 bf_nodes bf_gpu - bf_blenloader + bf_blenloader + bf_blenlib + bf_ghost + bf_string bf_blenpluginapi bf_imbuf - bf_blenlib bf_avi bf_cineon bf_openexr @@ -384,7 +443,6 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") blender_CTR bf_moto bf_windowmanager - bf_editors bf_blroutines bf_converter bf_dummy @@ -419,6 +477,8 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") bf_dna bf_blenfont bf_audaspace + bf_decimation + ) IF(WITH_CXX_GUARDEDALLOC) SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_guardedalloc_cpp) diff --git a/source/creator/Makefile b/source/creator/Makefile index 592cf913dfa..34ebc5fa305 100644 --- a/source/creator/Makefile +++ b/source/creator/Makefile @@ -69,4 +69,8 @@ ifeq ($(WITH_BINRELOC), true) CPPFLAGS += -I$(NANBLENDERHOME)/extern/binreloc/include -DWITH_BINRELOC endif +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + CPPFLAGS += -I$(OPENGL_HEADERS) diff --git a/source/creator/SConscript b/source/creator/SConscript index 8c71e0e8566..815bd351f69 100644 --- a/source/creator/SConscript +++ b/source/creator/SConscript @@ -23,6 +23,9 @@ if env['WITH_BF_BINRELOC']: if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if not env['WITH_BF_SDL']: defs.append('DISABLE_SDL') @@ -39,5 +42,11 @@ if env['WITH_BF_FHS']: # /usr -> /usr/share/blender/2.5 if env['BF_BUILDINFO']: defs.append('BUILD_DATE') defs.append('NAN_BUILDINFO') + +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] + +if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): + incs += ' ' + env['BF_PTHREADS_INC'] env.BlenderLib ( libname = 'bf_creator', sources = Split(sources), includes = Split(incs), defines = defs, libtype='core', priority = 0 ) diff --git a/source/creator/buildinfo.c b/source/creator/buildinfo.c index d50a99e8850..d745d826bd6 100644 --- a/source/creator/buildinfo.c +++ b/source/creator/buildinfo.c @@ -27,17 +27,13 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #define STRINGIFY(x) XSTRINGIFY(x) #define XSTRINGIFY(x) #x #ifdef BUILD_DATE -const char * build_date=STRINGIFY(BUILD_DATE); -const char * build_time=STRINGIFY(BUILD_TIME); -const char * build_rev=STRINGIFY(BUILD_REV); -const char * build_platform=STRINGIFY(BUILD_PLATFORM); -const char * build_type=STRINGIFY(BUILD_TYPE); +char build_date[]= STRINGIFY(BUILD_DATE); +char build_time[]= STRINGIFY(BUILD_TIME); +char build_rev[]= STRINGIFY(BUILD_REV); +char build_platform[]= STRINGIFY(BUILD_PLATFORM); +char build_type[]= STRINGIFY(BUILD_TYPE); #endif diff --git a/source/creator/creator.c b/source/creator/creator.c index 3ba6b348a51..199d99efaad 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -32,6 +32,12 @@ #include #endif +#define OSX_SSE_FPE (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__))) + +#if OSX_SSE_FPE +#include +#endif + #include #include #include @@ -51,6 +57,7 @@ #endif #include "BLI_args.h" +#include "BLI_threads.h" #include "GEN_messaging.h" @@ -72,7 +79,7 @@ #include "BKE_report.h" #include "BKE_sound.h" -#include "IMB_imbuf.h" // for quicktime_init +#include "IMB_imbuf.h" // for IMB_init #ifndef DISABLE_PYTHON #include "BPY_extern.h" @@ -82,7 +89,6 @@ //XXX #include "playanim_ext.h" #include "ED_datafiles.h" -#include "UI_interface.h" #include "WM_api.h" @@ -110,11 +116,11 @@ static int no_handler = 0; // from buildinfo.c #ifdef BUILD_DATE -extern const char * build_date; -extern const char * build_time; -extern const char * build_rev; -extern const char * build_platform; -extern const char * build_type; +extern char build_date[]; +extern char build_time[]; +extern char build_rev[]; +extern char build_platform[]; +extern char build_type[]; #endif /* Local Function prototypes */ @@ -139,8 +145,8 @@ char blender_path[FILE_MAXDIR+FILE_MAXFILE] = BLENDERPATH; /* Initialise callbacks for the modules that need them */ static void setCallbacks(void); -/* on linux set breakpoints here when running in debug mode, useful to catch floating point errors */ -#if defined(__sgi) || defined(__linux__) +/* set breakpoints here when running in debug mode, useful to catch floating point errors */ +#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE static void fpe_handler(int sig) { // printf("SIGFPE trapped\n"); @@ -164,6 +170,20 @@ static void blender_esc(int sig) } } +/* buildinfo can have quotes */ +#ifdef BUILD_DATE +static void strip_quotes(char *str) +{ + if(str[0] == '"') { + int len= strlen(str) - 1; + memmove(str, str+1, len); + if(str[len-1] == '"') { + str[len-1]= '\0'; + } + } +} +#endif + static int print_version(int argc, char **argv, void *data) { #ifdef BUILD_DATE @@ -184,98 +204,108 @@ static int print_version(int argc, char **argv, void *data) static int print_help(int argc, char **argv, void *data) { - printf ("Blender %d.%02d (sub %d) Build\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION); - printf ("Usage: blender [args ...] [file] [args ...]\n"); - printf ("\nRender options:\n"); - printf (" -b \tRender in background (doesn't load the user defaults .B.blend file)\n"); - printf (" -a render frames from start to end (inclusive), only works when used after -b\n"); - printf (" -S \tSet scene \n"); - printf (" -f \tRender frame and save it\n"); - printf (" -s \tSet start to frame (use before the -a argument)\n"); - printf (" -e \tSet end to frame (use before the -a argument)\n"); - printf (" -o \tSet the render path and file name.\n"); - printf (" Use // at the start of the path to\n"); - printf (" render relative to the blend file.\n"); - printf (" The # characters are replaced by the frame number, and used to define zero padding.\n"); - printf (" ani_##_test.png becomes ani_01_test.png\n"); - printf (" test-######.png becomes test-000001.png\n"); - printf (" When the filename has no #, The suffix #### is added to the filename\n"); - printf (" The frame number will be added at the end of the filename.\n"); - printf (" eg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a\n"); - printf (" -E \tSpecify the render engine.\n"); - printf (" use -E help to list available engines.\n"); - printf ("\nFormat options:\n"); - printf (" -F \tSet the render format, Valid options are...\n"); - printf (" \tTGA IRIS HAMX JPEG MOVIE IRIZ RAWTGA\n"); - printf (" \tAVIRAW AVIJPEG PNG BMP FRAMESERVER\n"); - printf (" (formats that can be compiled into blender, not available on all systems)\n"); - printf (" \tHDR TIFF EXR MULTILAYER MPEG AVICODEC QUICKTIME CINEON DPX DDS\n"); - printf (" -x \tSet option to add the file extension to the end of the file.\n"); - printf (" -t \tUse amount of for rendering (background mode only).\n"); - printf (" [1-8], 0 for systems processor count.\n"); - printf ("\nAnimation playback options:\n"); - printf (" -a \tPlayback , only operates this way when -b is not used.\n"); - printf (" -p \tOpen with lower left corner at , \n"); - printf (" -m\t\tRead from disk (Don't buffer)\n"); - printf (" -f \t\tSpecify FPS to start with\n"); - printf (" -j \tSet frame step to \n"); - - printf ("\nWindow options:\n"); - printf (" -w\t\tForce opening with borders (default)\n"); - printf (" -W\t\tForce opening without borders\n"); - printf (" -p \tOpen with lower left corner at , \n"); - printf (" \tand width and height , \n"); - printf ("\nGame Engine specific options:\n"); - printf (" -g fixedtime\t\tRun on 50 hertz without dropping frames\n"); - printf (" -g vertexarrays\tUse Vertex Arrays for rendering (usually faster)\n"); - printf (" -g nomipmap\t\tNo Texture Mipmapping\n"); - printf (" -g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)\n"); + bArgs *ba = (bArgs*)data; + + printf ("Blender %d.%02d (sub %d) Build\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION); + printf ("Usage: blender [args ...] [file] [args ...]\n\n"); + + printf ("Render Options:\n"); + BLI_argsPrintArgDoc(ba, "--background"); + BLI_argsPrintArgDoc(ba, "--render-anim"); + BLI_argsPrintArgDoc(ba, "--scene"); + BLI_argsPrintArgDoc(ba, "--render-frame"); + BLI_argsPrintArgDoc(ba, "--frame-start"); + BLI_argsPrintArgDoc(ba, "--frame-end"); + BLI_argsPrintArgDoc(ba, "--frame-jump"); + BLI_argsPrintArgDoc(ba, "--render-output"); + BLI_argsPrintArgDoc(ba, "--engine"); + + printf("\n"); + printf ("Format Options:\n"); + BLI_argsPrintArgDoc(ba, "--render-format"); + BLI_argsPrintArgDoc(ba, "--use-extension"); + BLI_argsPrintArgDoc(ba, "--threads"); + + printf("\n"); + printf ("Animation Playback Options:\n"); + BLI_argsPrintArgDoc(ba, "-a"); + + printf("\n"); + printf ("Window Options:\n"); + BLI_argsPrintArgDoc(ba, "--window-border"); + BLI_argsPrintArgDoc(ba, "--window-borderless"); + BLI_argsPrintArgDoc(ba, "--window-geometry"); + + printf("\n"); + printf ("Game Engine Specific Options:\n"); + BLI_argsPrintArgDoc(ba, "-g"); + + printf("\n"); + printf ("Misc Options:\n"); + BLI_argsPrintArgDoc(ba, "--debug"); + BLI_argsPrintArgDoc(ba, "--debug-fpe"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "-nojoystick"); + BLI_argsPrintArgDoc(ba, "-noglsl"); + BLI_argsPrintArgDoc(ba, "-noaudio"); + BLI_argsPrintArgDoc(ba, "-setaudio"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--help"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--enable-autoexec"); + BLI_argsPrintArgDoc(ba, "--disable-autoexec"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--python"); + BLI_argsPrintArgDoc(ba, "--python-console"); - printf ("\nMisc options:\n"); - printf (" -d\t\tTurn debugging on\n"); - printf (" -nojoystick\tDisable joystick support\n"); - printf (" -noglsl\tDisable GLSL shading\n"); - printf (" -noaudio\tForce sound system to None\n"); - printf (" -setaudio\tForce sound system to a specific device\n"); - printf (" \tNULL SDL OPENAL JACK\n"); - printf (" -h\t\tPrint this help text\n"); - printf (" -y\t\tDisable automatic python script execution (pydrivers, pyconstraints, pynodes)\n"); - printf (" -P \tRun the given Python script (filename or Blender Text)\n"); #ifdef WIN32 - printf (" -R\t\tRegister .blend extension\n"); + BLI_argsPrintArgDoc(ba, "-R"); #endif - printf (" -v\t\tPrint Blender version and exit\n"); - printf (" --\t\tEnds option processing. Following arguments are \n"); - printf (" \t\t passed unchanged. Access via Python's sys.argv\n"); + BLI_argsPrintArgDoc(ba, "--version"); + + BLI_argsPrintArgDoc(ba, "--"); + + printf ("Other Options:\n"); + BLI_argsPrintOtherDoc(ba); + + printf ("Argument Parsing:\n"); + printf ("\targuments must be separated by white space. eg\n"); + printf ("\t\t\"blender -ba test.blend\"\n"); + printf ("\t...will ignore the 'a'\n"); + printf ("\t\t\"blender -b test.blend -f8\"\n"); + printf ("\t...will ignore 8 because there is no space between the -f and the frame value\n\n"); + + printf ("Argument Order:\n"); + printf ("Arguments are executed in the order they are given. eg\n"); + printf ("\t\t\"blender --background test.blend --render-frame 1 --render-output /tmp\"\n"); + printf ("\t...will not render to /tmp because '--render-frame 1' renders before the output path is set\n"); + printf ("\t\t\"blender --background --render-output /tmp test.blend --render-frame 1\"\n"); + printf ("\t...will not render to /tmp because loading the blend file overwrites the render output that was set\n"); + printf ("\t\t\"blender --background test.blend --render-output /tmp --render-frame 1\" works as expected.\n\n"); + printf ("\nEnvironment Variables:\n"); printf (" $HOME\t\t\tStore files such as .blender/ .B.blend .Bfs .Blog here.\n"); - printf (" $BLENDERPATH\tSystem directory to use for data files and scripts.\n"); - printf (" \tFor this build of blender the default BLENDERPATH is...\n"); - printf (" \t\"%s\"\n", blender_path); - printf (" \tseting the $BLENDERPATH will override this\n"); + printf (" $BLENDERPATH System directory to use for data files and scripts.\n"); + printf (" For this build of blender the default $BLENDERPATH is...\n"); + printf (" \"%s\"\n", blender_path); + printf (" setting the $BLENDERPATH will override this\n"); #ifdef WIN32 - printf (" $TEMP\t\tStore temporary files here.\n"); + printf (" $TEMP Store temporary files here.\n"); #else - printf (" $TMP or $TMPDIR\tStore temporary files here.\n"); - printf (" $BF_TIFF_LIB\t\tUse an alternative libtiff.so for loading tiff image files.\n"); + printf (" $TMP or $TMPDIR Store temporary files here.\n"); #endif #ifndef DISABLE_SDL - printf (" $SDL_AUDIODRIVER\tLibSDL audio driver - alsa, esd, alsa, dma.\n"); + printf (" $SDL_AUDIODRIVER LibSDL audio driver - alsa, esd, alsa, dma.\n"); #endif - printf (" $IMAGEEDITOR\t\tImage editor executable, launch with the IKey from the file selector.\n"); - printf (" $WINEDITOR\t\tText editor executable, launch with the EKey from the file selector.\n"); - printf (" $PYTHONHOME\t\tPath to the python directory, eg. /usr/lib/python.\n"); - printf ("\nNote: Arguments must be separated by white space. eg:\n"); - printf (" \"blender -ba test.blend\"\n"); - printf (" ...will ignore the 'a'\n"); - printf (" \"blender -b test.blend -f8\"\n"); - printf (" ...will ignore 8 because there is no space between the -f and the frame value\n"); - printf ("Note: Arguments are executed in the order they are given. eg:\n"); - printf (" \"blender -b test.blend -f 1 -o /tmp\"\n"); - printf (" ...may not render to /tmp because '-f 1' renders before the output path is set\n"); - printf (" \"blender -b -o /tmp test.blend -f 1\"\n"); - printf (" ...may not render to /tmp because loading the blend file overwrites the output path that was set\n"); - printf (" \"blender -b test.blend -o /tmp -f 1\" works as expected.\n\n"); + printf (" $PYTHONHOME Path to the python directory, eg. /usr/lib/python.\n\n"); exit(0); @@ -313,6 +343,8 @@ int segmentation_handler(int sig) /*induce a real crash*/ signal(SIGSEGV, SIG_DFL); *(int*)NULL = 0; + + return 0; } static int nocrashhandler(int argc, char **argv, void *data) @@ -328,29 +360,15 @@ static int end_arguments(int argc, char **argv, void *data) return -1; } -static int disable_python(int argc, char **argv, void *data) +static int enable_python(int argc, char **argv, void *data) { - G.f &= ~G_SCRIPT_AUTOEXEC; + G.f |= G_SCRIPT_AUTOEXEC; return 0; } - -static int forked_tongue(int argc, char **argv, void *data) +static int disable_python(int argc, char **argv, void *data) { - printf ("-y was used to disable script links because,\n"); - printf ("\t-p being taken, Ton was of the opinion that Y\n"); - printf ("\tlooked like a split (disabled) snake, and also\n"); - printf ("\twas similar to a python's tongue (unproven).\n\n"); - - printf ("\tZr agreed because it gave him a reason to add a\n"); - printf ("\tcompletely useless text into Blender.\n\n"); - - printf ("\tADDENDUM! Ton, in defense, found this picture of\n"); - printf ("\tan Australian python, exhibiting her (his/its) forked\n"); - printf ("\tY tongue. It could be part of an H Zr retorted!\n\n"); - printf ("\thttp://www.users.bigpond.com/snake.man/\n"); - - exit(252); + G.f &= ~G_SCRIPT_AUTOEXEC; return 0; } @@ -376,15 +394,26 @@ static int debug_mode(int argc, char **argv, void *data) static int set_fpe(int argc, char **argv, void *data) { -#if defined(__sgi) || defined(__linux__) +#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE /* zealous but makes float issues a heck of a lot easier to find! * set breakpoints on fpe_handler */ signal(SIGFPE, fpe_handler); -#if defined(__linux__) && defined(__GNUC__) +# if defined(__linux__) && defined(__GNUC__) feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW ); +# endif /* defined(__linux__) && defined(__GNUC__) */ +# if OSX_SSE_FPE + /* OSX uses SSE for floating point by default, so here + * use SSE instructions to throw floating point exceptions */ + _MM_SET_EXCEPTION_MASK(_MM_MASK_MASK &~ + (_MM_MASK_OVERFLOW|_MM_MASK_INVALID|_MM_MASK_DIV_ZERO)); +# endif /* OSX_SSE_FPE */ +# if defined(_WIN32) && defined(_MSC_VER) + _controlfp_s(NULL, 0, _MCW_EM); /* enables all fp exceptions */ + _controlfp_s(NULL, _EM_DENORMAL | _EM_UNDERFLOW | _EM_INEXACT, _MCW_EM); /* hide the ones we don't care about */ +# endif /* _WIN32 && _MSC_VER */ #endif -#endif + return 0; } @@ -392,8 +421,6 @@ static int playback_mode(int argc, char **argv, void *data) { /* not if -b was given first */ if (G.background == 0) { - /* exception here, see below, it probably needs happens after qt init? */ - libtiff_init(); // XXX playanim(argc, argv); /* not the same argc and argv as before */ exit(0); @@ -491,11 +518,11 @@ static int set_output(int argc, char **argv, void *data) Scene *scene= CTX_data_scene(C); BLI_strncpy(scene->r.pic, argv[1], FILE_MAXDIR); } else { - printf("\nError: no blend loaded. cannot use '-o'.\n"); + printf("\nError: no blend loaded. cannot use '-o / --render-output'.\n"); } return 1; } else { - printf("\nError: you must specify a path after '-o '.\n"); + printf("\nError: you must specify a path after '-o / --render-output'.\n"); return 0; } } @@ -519,7 +546,7 @@ static int set_engine(int argc, char **argv, void *data) { if (CTX_data_scene(C)==NULL) { - printf("\nError: no blend loaded. order the arguments so '-E ' is after a blend is loaded.\n"); + printf("\nError: no blend loaded. order the arguments so '-E / --engine ' is after a blend is loaded.\n"); } else { @@ -552,17 +579,15 @@ static int set_image_type(int argc, char **argv, void *data) if (argc >= 1){ char *imtype = argv[1]; if (CTX_data_scene(C)==NULL) { - printf("\nError: no blend loaded. order the arguments so '-F ' is after the blend is loaded.\n"); + printf("\nError: no blend loaded. order the arguments so '-F / --render-format' is after the blend is loaded.\n"); } else { Scene *scene= CTX_data_scene(C); if (!strcmp(imtype,"TGA")) scene->r.imtype = R_TARGA; else if (!strcmp(imtype,"IRIS")) scene->r.imtype = R_IRIS; - else if (!strcmp(imtype,"HAMX")) scene->r.imtype = R_HAMX; #ifdef WITH_DDS else if (!strcmp(imtype,"DDS")) scene->r.imtype = R_DDS; #endif else if (!strcmp(imtype,"JPEG")) scene->r.imtype = R_JPEG90; - else if (!strcmp(imtype,"MOVIE")) scene->r.imtype = R_MOVIE; else if (!strcmp(imtype,"IRIZ")) scene->r.imtype = R_IRIZ; else if (!strcmp(imtype,"RAWTGA")) scene->r.imtype = R_RAWTGA; else if (!strcmp(imtype,"AVIRAW")) scene->r.imtype = R_AVIRAW; @@ -572,7 +597,9 @@ static int set_image_type(int argc, char **argv, void *data) else if (!strcmp(imtype,"QUICKTIME")) scene->r.imtype = R_QUICKTIME; else if (!strcmp(imtype,"BMP")) scene->r.imtype = R_BMP; else if (!strcmp(imtype,"HDR")) scene->r.imtype = R_RADHDR; +#ifdef WITH_TIFF else if (!strcmp(imtype,"TIFF")) scene->r.imtype = R_TIFF; +#endif #ifdef WITH_OPENEXR else if (!strcmp(imtype,"EXR")) scene->r.imtype = R_OPENEXR; else if (!strcmp(imtype,"MULTILAYER")) scene->r.imtype = R_MULTILAYER; @@ -584,11 +611,11 @@ static int set_image_type(int argc, char **argv, void *data) #if WITH_OPENJPEG else if (!strcmp(imtype,"JP2")) scene->r.imtype = R_JP2; #endif - else printf("\nError: Format from '-F' not known or not compiled in this release.\n"); + else printf("\nError: Format from '-F / --render-format' not known or not compiled in this release.\n"); } return 1; } else { - printf("\nError: you must specify a format after '-F '.\n"); + printf("\nError: you must specify a format after '-F / --render-foramt'.\n"); return 0; } } @@ -603,7 +630,7 @@ static int set_threads(int argc, char **argv, void *data) } return 1; } else { - printf("\nError: you must specify a number of threads between 0 and 8 '-t '.\n"); + printf("\nError: you must specify a number of threads between 0 and 8 '-t / --threads'.\n"); return 0; } } @@ -619,7 +646,7 @@ static int set_extension(int argc, char **argv, void *data) } else if (argv[1][0] == '1') { scene->r.scemode |= R_EXTENSION; } else { - printf("\nError: Use '-x 1' or '-x 0' To set the extension option.\n"); + printf("\nError: Use '-x 1 / -x 0' To set the extension option or '--use-extension'\n"); } } else { printf("\nError: no blend loaded. order the arguments so '-o ' is after '-x '.\n"); @@ -691,22 +718,34 @@ static int render_frame(int argc, char **argv, void *data) Scene *scene= CTX_data_scene(C); if (argc > 1) { - int frame = atoi(argv[1]); - Render *re = RE_NewRender(scene->id.name, RE_SLOT_DEFAULT); + Render *re = RE_NewRender(scene->id.name); + int frame; ReportList reports; + switch(*argv[1]) { + case '+': + frame= scene->r.sfra + atoi(argv[1]+1); + break; + case '-': + frame= (scene->r.efra - atoi(argv[1]+1)) + 1; + break; + default: + frame= atoi(argv[1]); + break; + } + BKE_reports_init(&reports, RPT_PRINT); frame = MIN2(MAXFRAME, MAX2(MINAFRAME, frame)); - RE_BlenderAnim(re, scene, frame, frame, scene->r.frame_step, &reports); + RE_BlenderAnim(re, scene, scene->lay, frame, frame, scene->r.frame_step, &reports); return 1; } else { - printf("\nError: frame number must follow '-f'.\n"); + printf("\nError: frame number must follow '-f / --render-frame'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-f'.\n"); + printf("\nError: no blend loaded. cannot use '-f / --render-frame'.\n"); return 0; } } @@ -716,10 +755,10 @@ static int render_animation(int argc, char **argv, void *data) bContext *C = data; if (CTX_data_scene(C)) { Scene *scene= CTX_data_scene(C); - Render *re= RE_NewRender(scene->id.name, RE_SLOT_DEFAULT); + Render *re= RE_NewRender(scene->id.name); ReportList reports; BKE_reports_init(&reports, RPT_PRINT); - RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports); + RE_BlenderAnim(re, scene, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports); } else { printf("\nError: no blend loaded. cannot use '-a'.\n"); } @@ -729,10 +768,14 @@ static int render_animation(int argc, char **argv, void *data) static int set_scene(int argc, char **argv, void *data) { if(argc > 1) { - set_scene_name(argv[1]); + bContext *C= data; + Scene *sce= set_scene_name(argv[1]); + if(sce) { + CTX_data_scene_set(C, sce); + } return 1; } else { - printf("\nError: Scene name must follow '-S'.\n"); + printf("\nError: Scene name must follow '-S / --scene'.\n"); return 0; } } @@ -744,14 +787,14 @@ static int set_start_frame(int argc, char **argv, void *data) Scene *scene= CTX_data_scene(C); if (argc > 1) { int frame = atoi(argv[1]); - (scene->r.sfra) = MIN2(MAXFRAME, MAX2(1, frame)); + (scene->r.sfra) = CLAMPIS(frame, MINFRAME, MAXFRAME); return 1; } else { - printf("\nError: frame number must follow '-s'.\n"); + printf("\nError: frame number must follow '-s / --frame-start'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-s'.\n"); + printf("\nError: no blend loaded. cannot use '-s / --frame-start'.\n"); return 0; } } @@ -763,14 +806,14 @@ static int set_end_frame(int argc, char **argv, void *data) Scene *scene= CTX_data_scene(C); if (argc > 1) { int frame = atoi(argv[1]); - (scene->r.efra) = MIN2(MAXFRAME, MAX2(1, frame)); + (scene->r.efra) = CLAMPIS(frame, MINFRAME, MAXFRAME); return 1; } else { - printf("\nError: frame number must follow '-e'.\n"); + printf("\nError: frame number must follow '-e / --frame-end'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-e'.\n"); + printf("\nError: no blend loaded. cannot use '-e / --frame-end'.\n"); return 0; } } @@ -782,48 +825,56 @@ static int set_skip_frame(int argc, char **argv, void *data) Scene *scene= CTX_data_scene(C); if (argc > 1) { int frame = atoi(argv[1]); - (scene->r.frame_step) = MIN2(MAXFRAME, MAX2(1, frame)); + (scene->r.frame_step) = CLAMPIS(frame, 1, MAXFRAME); return 1; } else { - printf("\nError: number of frames must follow '-j'.\n"); + printf("\nError: number of frames to step must follow '-j / --frame-jump'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-j'.\n"); + printf("\nError: no blend loaded. cannot use '-j / --frame-jump'.\n"); return 0; } } +/* macro for ugly context setup/reset */ +#ifndef DISABLE_PYTHON +#define BPY_CTX_SETUP(_cmd) \ +{ \ + wmWindowManager *wm= CTX_wm_manager(C); \ + wmWindow *prevwin= CTX_wm_window(C); \ + Scene *prevscene= CTX_data_scene(C); \ + if(wm->windows.first) { \ + CTX_wm_window_set(C, wm->windows.first); \ + _cmd; \ + CTX_wm_window_set(C, prevwin); \ + } \ + else { \ + fprintf(stderr, "Python script \"%s\" running with missing context data.\n", argv[1]); \ + _cmd; \ + } \ + CTX_data_scene_set(C, prevscene); \ +} \ + +#endif /* DISABLE_PYTHON */ + static int run_python(int argc, char **argv, void *data) { #ifndef DISABLE_PYTHON bContext *C = data; - /* Make the path absolute because its needed for relative linked blends to be found */ - char filename[FILE_MAXDIR + FILE_MAXFILE]; - BLI_strncpy(filename, argv[1], sizeof(filename)); - BLI_convertstringcwd(filename); - /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ if (argc > 1) { - /* XXX, temp setting the WM is ugly, splash also does this :S */ - wmWindowManager *wm= CTX_wm_manager(C); - wmWindow *prevwin= CTX_wm_window(C); + /* Make the path absolute because its needed for relative linked blends to be found */ + char filename[FILE_MAXDIR + FILE_MAXFILE]; + BLI_strncpy(filename, argv[1], sizeof(filename)); + BLI_path_cwd(filename); - if(wm->windows.first) { - CTX_wm_window_set(C, wm->windows.first); + BPY_CTX_SETUP( BPY_run_python_script(C, filename, NULL, NULL) ) - BPY_run_python_script(C, filename, NULL, NULL); // use reports? - - CTX_wm_window_set(C, prevwin); - } - else { - fprintf(stderr, "Python script \"%s\" running with missing context data.\n", argv[1]); - BPY_run_python_script(C, filename, NULL, NULL); // use reports? - } return 1; } else { - printf("\nError: you must specify a Python script after '-P '.\n"); + printf("\nError: you must specify a Python script after '-P / --python'.\n"); return 0; } #else @@ -832,6 +883,21 @@ static int run_python(int argc, char **argv, void *data) #endif /* DISABLE_PYTHON */ } +static int run_python_console(int argc, char **argv, void *data) +{ +#ifndef DISABLE_PYTHON + bContext *C = data; + const char *expr= "__import__('code').interact()"; + + BPY_CTX_SETUP( BPY_eval_string(C, expr) ) + + return 0; +#else + printf("This blender was built without python support\n"); + return 0; +#endif /* DISABLE_PYTHON */ +} + static int load_file(int argc, char **argv, void *data) { bContext *C = data; @@ -839,7 +905,7 @@ static int load_file(int argc, char **argv, void *data) /* Make the path absolute because its needed for relative linked blends to be found */ char filename[FILE_MAXDIR + FILE_MAXFILE]; BLI_strncpy(filename, argv[0], sizeof(filename)); - BLI_convertstringcwd(filename); + BLI_path_cwd(filename); if (G.background) { int retval = BKE_read_file(C, filename, NULL, NULL); @@ -847,11 +913,19 @@ static int load_file(int argc, char **argv, void *data) /*we successfully loaded a blend file, get sure that pointcache works */ if (retval!=0) { + wmWindowManager *wm= CTX_wm_manager(C); CTX_wm_manager_set(C, NULL); /* remove wm to force check */ WM_check(C); G.relbase_valid = 1; + if (CTX_wm_manager(C) == NULL) CTX_wm_manager_set(C, wm); /* reset wm */ } + /* WM_read_file() runs normally but since we're in background mode do here */ +#ifndef DISABLE_PYTHON + /* run any texts that were loaded in and flagged as modules */ + BPY_load_user_modules(C); +#endif + /* happens for the UI on file reading too (huh? (ton))*/ // XXX BKE_reset_undo(); // BKE_write_undo("original"); /* save current state */ @@ -868,57 +942,95 @@ static int load_file(int argc, char **argv, void *data) void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) { - //BLI_argsAdd(ba, arg, pass, BA_ArgCallback cb, C); + static char output_doc[] = "" + "\n\tSet the render path and file name." + "\n\tUse // at the start of the path to" + "\n\t\trender relative to the blend file." + "\n\tThe # characters are replaced by the frame number, and used to define zero padding." + "\n\t\tani_##_test.png becomes ani_01_test.png" + "\n\t\ttest-######.png becomes test-000001.png" + "\n\t\tWhen the filename does not contain #, The suffix #### is added to the filename" + "\n\tThe frame number will be added at the end of the filename." + "\n\t\teg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a" + "\n\t\t//render_ becomes //render_####, writing frames as //render_0001.png//"; + + static char format_doc[] = "" + "\n\tSet the render format, Valid options are..." + "\n\t\tTGA IRIS JPEG MOVIE IRIZ RAWTGA" + "\n\t\tAVIRAW AVIJPEG PNG BMP FRAMESERVER" + "\n\t(formats that can be compiled into blender, not available on all systems)" + "\n\t\tHDR TIFF EXR MULTILAYER MPEG AVICODEC QUICKTIME CINEON DPX DDS"; + + static char playback_doc[] = " " + "\n\tPlayback , only operates this way when not running in background." + "\n\t\t-p \tOpen with lower left corner at , " + "\n\t\t-m\t\tRead from disk (Don't buffer)" + "\n\t\t-f \t\tSpecify FPS to start with" + "\n\t\t-j \tSet frame step to "; + + static char game_doc[] = "Game Engine specific options" + "\n\t-g fixedtime\t\tRun on 50 hertz without dropping frames" + "\n\t-g vertexarrays\tUse Vertex Arrays for rendering (usually faster)" + "\n\t-g nomipmap\t\tNo Texture Mipmapping" + "\n\t-g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)"; + + static char debug_doc[] = "\n\tTurn debugging on\n" + "\n\t* Prints every operator call and their arguments" + "\n\t* Disables mouse grab (to interact with a debugger in some cases)" + "\n\t* Keeps python sys.stdin rather then setting it to None"; + + //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); /* end argument processing after -- */ - BLI_argsAdd(ba, "--", -1, end_arguments, NULL); - BLI_argsAdd(ba, "--no_crash_handler", 1, nocrashhandler, NULL); + BLI_argsAdd(ba, -1, "--", NULL, "\n\tEnds option processing, following arguments passed unchanged. Access via python's sys.argv", end_arguments, NULL); + BLI_argsAdd(ba, 1, "--no_crash_handler", NULL, "disable crash handler", nocrashhandler, NULL); /* first pass: background mode, disable python and commands that exit after usage */ - BLI_argsAdd(ba, "--help", 1, print_help, NULL); - BLI_argsAdd(ba, "-h", 1, print_help, NULL); - BLI_argsAdd(ba, "/?", 1, print_help, NULL); + BLI_argsAdd(ba, 1, "-h", "--help", "\n\tPrint this help text and exit", print_help, ba); + /* Windows only */ + BLI_argsAdd(ba, 1, "/?", NULL, "\n\tPrint this help text and exit (windows only)", print_help, ba); - BLI_argsAdd(ba, "--version", 1, print_version, NULL); - BLI_argsAdd(ba, "-v", 1, print_version, NULL); + BLI_argsAdd(ba, 1, "-v", "--version", "\n\tPrint Blender version and exit", print_version, NULL); - BLI_argsAdd(ba, "-Y", 1, forked_tongue, NULL); - BLI_argsAdd(ba, "-y", 1, disable_python, NULL); + BLI_argsAdd(ba, 1, "-y", "--enable-autoexec", "\n\tEnable automatic python script execution (default)", enable_python, NULL); + BLI_argsAdd(ba, 1, "-Y", "--disable-autoexec", "\n\tDisable automatic python script execution (pydrivers, pyconstraints, pynodes)", disable_python, NULL); - BLI_argsAdd(ba, "-fpe", 1, set_fpe, NULL); + BLI_argsAdd(ba, 1, "-b", "--background", "\n\tLoad in background (often used for UI-less rendering)", background_mode, NULL); - BLI_argsAdd(ba, "-B", 1, background_mode, NULL); - BLI_argsAdd(ba, "-b", 1, background_mode, NULL); - BLI_argsAdd(ba, "-a", 1, playback_mode, NULL); + BLI_argsAdd(ba, 1, "-a", NULL, playback_doc, playback_mode, NULL); - BLI_argsAdd(ba, "-d", 1, debug_mode, ba); + BLI_argsAdd(ba, 1, "-d", "--debug", debug_doc, debug_mode, ba); + BLI_argsAdd(ba, 1, NULL, "--debug-fpe", "\n\tEnable floating point exceptions", set_fpe, NULL); /* second pass: custom window stuff */ - BLI_argsAdd(ba, "-p", 2, prefsize, NULL); - BLI_argsAdd(ba, "-w", 2, with_borders, NULL); - BLI_argsAdd(ba, "-W", 2, without_borders, NULL); - BLI_argsAdd(ba, "-R", 2, register_extension, ba); + BLI_argsAdd(ba, 2, "-p", "--window-geometry", " \n\tOpen with lower left corner at , and width and height as , ", prefsize, NULL); + BLI_argsAdd(ba, 2, "-w", "--window-border", "\n\tForce opening with borders (default)", with_borders, NULL); + BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening with without borders", without_borders, NULL); + BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension (windows only)", register_extension, ba); /* third pass: disabling things and forcing settings */ - BLI_argsAddCase(ba, "-nojoystick", 3, no_joystick, syshandle); - BLI_argsAddCase(ba, "-noglsl", 3, no_glsl, NULL); - BLI_argsAddCase(ba, "-noaudio", 3, no_audio, NULL); - BLI_argsAddCase(ba, "-setaudio", 3, set_audio, NULL); + BLI_argsAddCase(ba, 3, "-nojoystick", 1, NULL, 0, "\n\tDisable joystick support", no_joystick, syshandle); + BLI_argsAddCase(ba, 3, "-noglsl", 1, NULL, 0, "\n\tDisable GLSL shading", no_glsl, NULL); + BLI_argsAddCase(ba, 3, "-noaudio", 1, NULL, 0, "\n\tForce sound system to None", no_audio, NULL); + BLI_argsAddCase(ba, 3, "-setaudio", 1, NULL, 0, "\n\tForce sound system to a specific device\n\tNULL SDL OPENAL JACK", set_audio, NULL); /* fourth pass: processing arguments */ - BLI_argsAdd(ba, "-g", 4, set_ge_parameters, syshandle); - BLI_argsAdd(ba, "-f", 4, render_frame, C); - BLI_argsAdd(ba, "-a", 4, render_animation, C); - BLI_argsAdd(ba, "-S", 4, set_scene, NULL); - BLI_argsAdd(ba, "-s", 4, set_start_frame, C); - BLI_argsAdd(ba, "-e", 4, set_end_frame, C); - BLI_argsAdd(ba, "-j", 4, set_skip_frame, C); - BLI_argsAdd(ba, "-P", 4, run_python, C); - BLI_argsAdd(ba, "-o", 4, set_output, C); - BLI_argsAdd(ba, "-E", 4, set_engine, C); - BLI_argsAdd(ba, "-F", 4, set_image_type, C); - BLI_argsAdd(ba, "-t", 4, set_threads, NULL); - BLI_argsAdd(ba, "-x", 4, set_extension, C); + BLI_argsAdd(ba, 4, "-g", NULL, game_doc, set_ge_parameters, syshandle); + BLI_argsAdd(ba, 4, "-f", "--render-frame", "\n\tRender frame and save it.\n\t+ start frame relative, - end frame relative.", render_frame, C); + BLI_argsAdd(ba, 4, "-a", "--render-anim", "\n\tRender frames from start to end (inclusive)", render_animation, C); + BLI_argsAdd(ba, 4, "-S", "--scene", "\n\tSet the active scene for rendering", set_scene, C); + BLI_argsAdd(ba, 4, "-s", "--frame-start", "\n\tSet start to frame (use before the -a argument)", set_start_frame, C); + BLI_argsAdd(ba, 4, "-e", "--frame-end", "\n\tSet end to frame (use before the -a argument)", set_end_frame, C); + BLI_argsAdd(ba, 4, "-j", "--frame-jump", "\n\tSet number of frames to step forward after each rendered frame", set_skip_frame, C); + BLI_argsAdd(ba, 4, "-P", "--python", "\n\tRun the given Python script (filename or Blender Text)", run_python, C); + BLI_argsAdd(ba, 4, NULL, "--python-console", "\n\tRun blender with an interactive console", run_python_console, C); + + BLI_argsAdd(ba, 4, "-o", "--render-output", output_doc, set_output, C); + BLI_argsAdd(ba, 4, "-E", "--engine", "\n\tSpecify the render engine\n\tuse -E help to list available engines", set_engine, C); + + BLI_argsAdd(ba, 4, "-F", "--render-format", format_doc, set_image_type, C); + BLI_argsAdd(ba, 4, "-t", "--threads", "\n\tUse amount of for rendering in background\n\t[1-" QUOTE(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL); + BLI_argsAdd(ba, 4, "-x", "--use-extension", "\n\tSet option to add the file extension to the end of the file", set_extension, C); } @@ -962,7 +1074,17 @@ int main(int argc, char **argv) if(blender_path_env) BLI_strncpy(blender_path, blender_path_env, sizeof(blender_path)); } - + +#ifdef BUILD_DATE + strip_quotes(build_date); + strip_quotes(build_time); + strip_quotes(build_rev); + strip_quotes(build_platform); + strip_quotes(build_type); +#endif + + BLI_threadapi_init(); + RNA_init(); RE_engines_init(); @@ -975,13 +1097,12 @@ int main(int argc, char **argv) initglobals(); /* blender.c */ + IMB_init(); + syshandle = SYS_GetSystem(); GEN_init_messaging_system(); /* first test for background */ - - G.f |= G_SCRIPT_AUTOEXEC; /* script links enabled by default */ - ba = BLI_argsInit(argc, argv); /* skip binary path */ setupArguments(C, ba, &syshandle); @@ -1002,6 +1123,10 @@ int main(int argc, char **argv) /* background render uses this font too */ BKE_font_register_builtin(datatoc_Bfont, datatoc_Bfont_size); + + /* Initialiaze ffmpeg if built in, also needed for bg mode if videos are + rendered via ffmpeg */ + sound_init_once(); init_def_material(); @@ -1011,16 +1136,18 @@ int main(int argc, char **argv) WM_init(C, argc, argv); - // XXX BRECHT SOLVE + /* this is properly initialized with user defs, but this is default */ BLI_where_is_temp( btempdir, 1 ); /* call after loading the .B.blend so we can read U.tempdir */ #ifndef DISABLE_SDL BLI_setenv("SDL_VIDEODRIVER", "dummy"); +/* I think this is not necessary anymore (04-24-2010 neXyon) #ifdef __linux__ - /* On linux the default SDL driver dma often would not play - * use alsa if none is set */ + // On linux the default SDL driver dma often would not play + // use alsa if none is set setenv("SDL_AUDIODRIVER", "alsa", 0); #endif +*/ #endif } else { @@ -1047,20 +1174,6 @@ int main(int argc, char **argv) CTX_py_init_set(C, 1); WM_keymap_init(C); -#ifdef WITH_QUICKTIME - - quicktime_init(); - -#endif /* WITH_QUICKTIME */ - - /* dynamically load libtiff, if available */ - libtiff_init(); - if (!G.have_libtiff && (G.f & G_DEBUG)) { - printf("Unable to load: libtiff.\n"); - printf("Try setting the BF_TIFF_LIB environment variable if you want this support.\n"); - printf("Example: setenv BF_TIFF_LIB /usr/lib/libtiff.so\n"); - } - /* OK we are ready for it */ BLI_argsParse(ba, 4, load_file, C); @@ -1071,8 +1184,13 @@ int main(int argc, char **argv) WM_exit(C); } - if(!G.background && !G.file_loaded) - WM_init_splash(C); + else { + if((G.fileflags & G_FILE_AUTOPLAY) && (G.f & G_SCRIPT_AUTOEXEC)) + WM_init_game(C); + + else if(!G.file_loaded) + WM_init_splash(C); + } WM_main(C); diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index f2d0fb8aeed..f5b43fa6809 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -28,10 +28,6 @@ * Blender's Ketsji startpoint */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include #include #include @@ -88,6 +84,7 @@ extern "C" { #include "BLI_blenlib.h" #include "BLO_readfile.h" #include "DNA_scene_types.h" +#include "BKE_ipo.h" /***/ #include "AUD_C-API.h" @@ -124,7 +121,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c { /* context values */ struct wmWindow *win= CTX_wm_window(C); - struct Scene *scene= CTX_data_scene(C); + struct Scene *startscene= CTX_data_scene(C); struct Main* maggie1= CTX_data_main(C); @@ -137,7 +134,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c int exitrequested = KX_EXIT_REQUEST_NO_REQUEST; Main* blenderdata = maggie1; - char* startscenename = scene->id.name+2; + char* startscenename = startscene->id.name+2; char pathname[FILE_MAXDIR+FILE_MAXFILE], oldsce[FILE_MAXDIR+FILE_MAXFILE]; STR_String exitstring = ""; BlendFileData *bfd= NULL; @@ -170,12 +167,14 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0); bool animation_record = (SYS_GetCommandLineInt(syshandle, "animation_record", 0) != 0); bool displaylists = (SYS_GetCommandLineInt(syshandle, "displaylists", 0) != 0); +#ifndef DISABLE_PYTHON bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 0) != 0); +#endif bool novertexarrays = (SYS_GetCommandLineInt(syshandle, "novertexarrays", 0) != 0); if(animation_record) usefixed= true; /* override since you's always want fixed time for sim recording */ // create the canvas, rasterizer and rendertools - RAS_ICanvas* canvas = new KX_BlenderCanvas(win, area_rect); + RAS_ICanvas* canvas = new KX_BlenderCanvas(win, area_rect, ar); canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE); RAS_IRenderTools* rendertools = new KX_BlenderRenderTools(); RAS_IRasterizer* rasterizer = NULL; @@ -222,12 +221,12 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c #endif //lock frame and camera enabled - storing global values - int tmp_lay= scene->lay; - Object *tmp_camera = scene->camera; + int tmp_lay= startscene->lay; + Object *tmp_camera = startscene->camera; if (v3d->scenelock==0){ - scene->lay= v3d->lay; - scene->camera= v3d->camera; + startscene->lay= v3d->lay; + startscene->camera= v3d->camera; } // some blender stuff @@ -248,7 +247,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c } if(rv3d->persp==RV3D_CAMOB) { - if(scene->gm.framing.type == SCE_GAMEFRAMING_BARS) { /* Letterbox */ + if(startscene->gm.framing.type == SCE_GAMEFRAMING_BARS) { /* Letterbox */ camzoom = 1.0f; } else { @@ -283,7 +282,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c // to the first file but that makes no sense, relative paths in // blend files should be relative to that file, not some other file // that happened to be loaded first - BLI_convertstringcode(basedpath, pathname); + BLI_path_abs(basedpath, pathname); bfd = load_game_data(basedpath); // if it wasn't loaded, try it forced relative @@ -294,7 +293,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c strcpy(temppath, "//"); strcat(temppath, basedpath); - BLI_convertstringcode(temppath, pathname); + BLI_path_abs(temppath, pathname); bfd = load_game_data(temppath); } @@ -319,22 +318,22 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c } } - Scene *blscene= bfd ? bfd->curscene : (Scene *)BLI_findstring(&blenderdata->scene, startscenename, offsetof(ID, name) + 2); + Scene *scene= bfd ? bfd->curscene : (Scene *)BLI_findstring(&blenderdata->scene, startscenename, offsetof(ID, name) + 2); - if (blscene) + if (scene) { - int startFrame = blscene->r.cfra; + int startFrame = scene->r.cfra; ketsjiengine->SetAnimRecordMode(animation_record, startFrame); // Quad buffered needs a special window. - if(blscene->gm.stereoflag == STEREO_ENABLED){ - if (blscene->gm.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED) - rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) blscene->gm.stereomode); + if(scene->gm.stereoflag == STEREO_ENABLED){ + if (scene->gm.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED) + rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) scene->gm.stereomode); - rasterizer->SetEyeSeparation(blscene->gm.eyeseparation); + rasterizer->SetEyeSeparation(scene->gm.eyeseparation); } - rasterizer->SetBackColor(blscene->gm.framing.col[0], blscene->gm.framing.col[1], blscene->gm.framing.col[2], 0.0f); + rasterizer->SetBackColor(scene->gm.framing.col[0], scene->gm.framing.col[1], scene->gm.framing.col[2], 0.0f); } if (exitrequested != KX_EXIT_REQUEST_QUIT_GAME) @@ -363,19 +362,20 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c if(GPU_glsl_support()) useglslmat = true; - else if(blscene->gm.matmode == GAME_MAT_GLSL) + else if(scene->gm.matmode == GAME_MAT_GLSL) usemat = false; - if(usemat && (blscene->gm.matmode != GAME_MAT_TEXFACE)) + if(usemat && (scene->gm.matmode != GAME_MAT_TEXFACE)) sceneconverter->SetMaterials(true); - if(useglslmat && (blscene->gm.matmode == GAME_MAT_GLSL)) + if(useglslmat && (scene->gm.matmode == GAME_MAT_GLSL)) sceneconverter->SetGLSLMaterials(true); KX_Scene* startscene = new KX_Scene(keyboarddevice, mousedevice, networkdevice, startscenename, - blscene); + scene, + canvas); #ifndef DISABLE_PYTHON // some python things @@ -384,13 +384,13 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c #endif // DISABLE_PYTHON //initialize Dome Settings - if(blscene->gm.stereoflag == STEREO_DOME) - ketsjiengine->InitDome(blscene->gm.dome.res, blscene->gm.dome.mode, blscene->gm.dome.angle, blscene->gm.dome.resbuf, blscene->gm.dome.tilt, blscene->gm.dome.warptext); + if(scene->gm.stereoflag == STEREO_DOME) + ketsjiengine->InitDome(scene->gm.dome.res, scene->gm.dome.mode, scene->gm.dome.angle, scene->gm.dome.resbuf, scene->gm.dome.tilt, scene->gm.dome.warptext); // initialize 3D Audio Settings - AUD_set3DSetting(AUD_3DS_SPEED_OF_SOUND, blscene->audio.speed_of_sound); - AUD_set3DSetting(AUD_3DS_DOPPLER_FACTOR, blscene->audio.doppler_factor); - AUD_set3DSetting(AUD_3DS_DISTANCE_MODEL, blscene->audio.distance_model); + AUD_set3DSetting(AUD_3DS_SPEED_OF_SOUND, scene->audio.speed_of_sound); + AUD_set3DSetting(AUD_3DS_DOPPLER_FACTOR, scene->audio.doppler_factor); + AUD_set3DSetting(AUD_3DS_DISTANCE_MODEL, scene->audio.distance_model); if (sceneconverter) { @@ -506,8 +506,8 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c } //lock frame and camera enabled - restoring global values if (v3d->scenelock==0){ - scene->lay= tmp_lay; - scene->camera= tmp_camera; + startscene->lay= tmp_lay; + startscene->camera= tmp_camera; } // set the cursor back to normal diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp index 40775f0355b..b04e951028d 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp @@ -30,15 +30,14 @@ #include "DNA_screen_types.h" #include "stdio.h" -#ifdef HAVE_CONFIG_H -#include -#endif - -KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, RAS_Rect &rect) : +KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, RAS_Rect &rect, struct ARegion *ar) : m_win(win), m_frame_rect(rect) { + // area boundaries needed for mouse coordinates in Letterbox framing mode + m_area_left = ar->winrct.xmin; + m_area_top = ar->winrct.ymax; } KX_BlenderCanvas::~KX_BlenderCanvas() @@ -104,6 +103,30 @@ int KX_BlenderCanvas::GetHeight( return m_frame_rect.GetHeight(); } +int KX_BlenderCanvas::GetMouseX(int x) +{ + float left = GetWindowArea().GetLeft(); + return float(x - (left - m_area_left)); +} + +int KX_BlenderCanvas::GetMouseY(int y) +{ + float top = GetWindowArea().GetTop(); + return float(y - (m_area_top - top)); +} + +float KX_BlenderCanvas::GetMouseNormalizedX(int x) +{ + int can_x = GetMouseX(x); + return float(can_x)/this->GetWidth(); +} + +float KX_BlenderCanvas::GetMouseNormalizedY(int y) +{ + int can_y = GetMouseY(y); + return float(can_y)/this->GetHeight(); +} + RAS_Rect & KX_BlenderCanvas:: GetWindowArea( @@ -117,6 +140,11 @@ SetViewPort( int x1, int y1, int x2, int y2 ){ + /* x1 and y1 are the min pixel coordinate (e.g. 0) + x2 and y2 are the max pixel coordinate + the width,height is calculated including both pixels + therefore: max - min + 1 + */ int vp_width = (x2 - x1) + 1; int vp_height = (y2 - y1) + 1; int minx = m_frame_rect.GetLeft(); @@ -134,6 +162,8 @@ SetViewPort( void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate) { + m_mousestate = mousestate; + switch (mousestate) { case MOUSE_INVISIBLE: @@ -166,7 +196,7 @@ void KX_BlenderCanvas::SetMousePosition(int x,int y) int winY = m_frame_rect.GetBottom(); int winH = m_frame_rect.GetHeight(); - BL_warp_pointer(m_win, winX + x, winY + (winH-y-1)); + BL_warp_pointer(m_win, winX + x, winY + (winH-y)); } diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h index f352a082421..42f956cafcd 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h @@ -64,7 +64,7 @@ public: * * @param area The Blender ARegion to run the game within. */ - KX_BlenderCanvas(struct wmWindow* win, class RAS_Rect &rect); + KX_BlenderCanvas(struct wmWindow* win, class RAS_Rect &rect, struct ARegion* ar); ~KX_BlenderCanvas(); void @@ -109,6 +109,22 @@ public: GetHeight( ) const ; + int + GetMouseX(int x + ); + + int + GetMouseY(int y + ); + + float + GetMouseNormalizedX(int x + ); + + float + GetMouseNormalizedY(int y + ); + const RAS_Rect & GetDisplayArea( @@ -170,11 +186,13 @@ private: struct wmWindow* m_win; RAS_Rect m_frame_rect; RAS_Rect m_area_rect; + short m_area_left; + short m_area_top; #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderCanvas"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderCanvas"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp index 1f79c03c045..55a687c0baa 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp @@ -36,10 +36,6 @@ extern "C" { } #endif -#ifdef HAVE_CONFIG_H -#include -#endif - /* * This little block needed for linking to Blender... */ diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp index 760dd09077e..697687d1b95 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp @@ -28,7 +28,3 @@ */ #include "KX_BlenderInputDevice.h" -#ifdef HAVE_CONFIG_H -#include -#endif - diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h index 9345d6a9284..5bdf0ccd81d 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h @@ -199,7 +199,14 @@ public: m_reverseKeyTranslateTable[F9KEY ] = KX_F9KEY ; m_reverseKeyTranslateTable[F10KEY ] = KX_F10KEY ; m_reverseKeyTranslateTable[F11KEY ] = KX_F11KEY ; - m_reverseKeyTranslateTable[F12KEY ] = KX_F12KEY ; + m_reverseKeyTranslateTable[F12KEY ] = KX_F12KEY ; + m_reverseKeyTranslateTable[F13KEY ] = KX_F13KEY ; + m_reverseKeyTranslateTable[F14KEY ] = KX_F14KEY ; + m_reverseKeyTranslateTable[F15KEY ] = KX_F15KEY ; + m_reverseKeyTranslateTable[F16KEY ] = KX_F16KEY ; + m_reverseKeyTranslateTable[F17KEY ] = KX_F17KEY ; + m_reverseKeyTranslateTable[F18KEY ] = KX_F18KEY ; + m_reverseKeyTranslateTable[F19KEY ] = KX_F19KEY ; m_reverseKeyTranslateTable[PAUSEKEY ] = KX_PAUSEKEY ; m_reverseKeyTranslateTable[INSERTKEY ] = KX_INSERTKEY ; @@ -227,8 +234,8 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderInputDevice"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderInputDevice"); } + void operator delete(void *mem) { MEM_freeN(mem); } #endif }; #endif //__KX_BLENDERINPUTDEVICE diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp index 1c5989be301..e8cb25af868 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // annoying warnings about truncated STL debug info #pragma warning (disable :4786) diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h index 6cd47a5d93e..eab052895db 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h @@ -51,8 +51,8 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderKeyboardDevice"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderKeyboardDevice"); } + void operator delete(void *mem) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp index 7952c3142b4..c3e3935fca5 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // annoying warnings about truncated STL debug info #pragma warning (disable :4786) diff --git a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h index 8f037ae5b07..ce067ffb379 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h @@ -49,8 +49,8 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderMouseDevice"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderMouseDevice"); } + void operator delete(void *mem) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h index 07226524538..9a7d9c7bcc0 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h @@ -99,7 +99,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderRenderTools"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderRenderTools"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp b/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp index 2f192666dcd..813869dd032 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp @@ -28,10 +28,6 @@ #include "KX_ISystem.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable :4786) #include diff --git a/source/gameengine/BlenderRoutines/KX_BlenderSystem.h b/source/gameengine/BlenderRoutines/KX_BlenderSystem.h index 7c848a7a856..fb40ded9292 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderSystem.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderSystem.h @@ -51,7 +51,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSystem"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSystem"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp index 10453fb1253..b8d4c4e0f04 100644 --- a/source/gameengine/Converter/BL_ActionActuator.cpp +++ b/source/gameengine/Converter/BL_ActionActuator.cpp @@ -53,10 +53,6 @@ #include "PyObjectPlus.h" #include "KX_PyMath.h" -#ifdef HAVE_CONFIG_H -#include -#endif - extern "C" { #include "BKE_animsys.h" #include "BKE_action.h" diff --git a/source/gameengine/Converter/BL_ArmatureActuator.cpp b/source/gameengine/Converter/BL_ArmatureActuator.cpp index 5836ab3d757..c36a97415c9 100644 --- a/source/gameengine/Converter/BL_ArmatureActuator.cpp +++ b/source/gameengine/Converter/BL_ArmatureActuator.cpp @@ -182,13 +182,7 @@ bool BL_ArmatureActuator::Update(double curtime, bool frame) /* ------------------------------------------------------------------------- */ PyTypeObject BL_ArmatureActuator::Type = { -#if (PY_VERSION_HEX >= 0x02060000) PyVarObject_HEAD_INIT(NULL, 0) -#else - /* python 2.5 and below */ - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ -#endif "BL_ArmatureActuator", sizeof(PyObjectPlus_Proxy), 0, diff --git a/source/gameengine/Converter/BL_ArmatureChannel.cpp b/source/gameengine/Converter/BL_ArmatureChannel.cpp index bd2301f2356..c0b422042f9 100644 --- a/source/gameengine/Converter/BL_ArmatureChannel.cpp +++ b/source/gameengine/Converter/BL_ArmatureChannel.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "DNA_armature_types.h" #include "BL_ArmatureChannel.h" #include "BL_ArmatureObject.h" diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.cpp b/source/gameengine/Converter/BL_ArmatureConstraint.cpp index b6a78d416ea..582d8454ba7 100644 --- a/source/gameengine/Converter/BL_ArmatureConstraint.cpp +++ b/source/gameengine/Converter/BL_ArmatureConstraint.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "DNA_constraint_types.h" #include "DNA_action_types.h" #include "BL_ArmatureConstraint.h" @@ -74,7 +70,7 @@ BL_ArmatureConstraint::BL_ArmatureConstraint( bConstraint *constraint, KX_GameObject* target, KX_GameObject* subtarget) - : PyObjectPlus(), m_armature(armature), m_constraint(constraint), m_posechannel(posechannel) + : PyObjectPlus(), m_constraint(constraint), m_posechannel(posechannel), m_armature(armature) { m_target = target; m_blendtarget = (target) ? target->GetBlenderObject() : NULL; diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp index e0a29cb8027..1da07b73dec 100644 --- a/source/gameengine/Converter/BL_ArmatureObject.cpp +++ b/source/gameengine/Converter/BL_ArmatureObject.cpp @@ -53,10 +53,6 @@ #include "MT_Matrix4x4.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /** * Move here pose function for game engine so that we can mix with GE objects * Principle is as follow: @@ -88,6 +84,7 @@ void game_copy_pose(bPose **dst, bPose *src, int copy_constraint) { } out= (bPose*)MEM_dupallocN(src); + out->chanhash = NULL; out->agroups.first= out->agroups.last= NULL; out->ikdata = NULL; out->ikparam = MEM_dupallocN(out->ikparam); @@ -95,7 +92,7 @@ void game_copy_pose(bPose **dst, bPose *src, int copy_constraint) { BLI_duplicatelist(&out->chanbase, &src->chanbase); /* remap pointers */ - ghash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); + ghash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "game_copy_pose gh"); pchan= (bPoseChannel*)src->chanbase.first; outpchan= (bPoseChannel*)out->chanbase.first; @@ -110,7 +107,7 @@ void game_copy_pose(bPose **dst, bPose *src, int copy_constraint) { if (copy_constraint) { ListBase listb; // copy all constraint for backward compatibility - copy_constraints(&listb, &pchan->constraints); // copy_constraints NULLs listb + copy_constraints(&listb, &pchan->constraints, FALSE); // copy_constraints NULLs listb, no need to make extern for this operation. pchan->constraints= listb; } else { pchan->constraints.first = NULL; @@ -119,7 +116,8 @@ void game_copy_pose(bPose **dst, bPose *src, int copy_constraint) { } BLI_ghash_free(ghash, NULL, NULL); - + // set acceleration structure for channel lookup + make_pose_channels_hash(out); *dst=out; } diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 57e576f84b8..5a963be306a 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -28,10 +28,6 @@ * Convert blender data to ketsji */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable : 4786) #endif @@ -88,7 +84,6 @@ #include "BKE_main.h" #include "BKE_global.h" #include "BKE_object.h" -#include "BKE_scene.h" #include "BL_ModifierDeformer.h" #include "BL_ShapeDeformer.h" #include "BL_SkinDeformer.h" @@ -138,6 +133,7 @@ #include "BLI_math.h" extern "C" { +#include "BKE_scene.h" #include "BKE_customdata.h" #include "BKE_cdderivedmesh.h" #include "BKE_DerivedMesh.h" @@ -1552,7 +1548,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj, objprop.m_boundclass = KX_BOUNDMESH; break; } - // Object is not a mesh... can't use polyheder. + // Object is not a mesh... can't use polyhedron. // Fall through and become a sphere. case OB_BOUND_SPHERE: { @@ -1733,7 +1729,7 @@ static KX_GameObject *gameobject_from_blenderobject( // only support relative shape key bool bHasShapeKey = mesh->key != NULL && mesh->key->type==KEY_RELATIVE; bool bHasDvert = mesh->dvert != NULL && ob->defbase.first; - bool bHasArmature = (ob->parent && ob->parent->type == OB_ARMATURE && ob->partype==PARSKEL && bHasDvert); + bool bHasArmature = (BL_ModifierDeformer::HasArmatureDeformer(ob) && ob->parent && ob->parent->type == OB_ARMATURE && bHasDvert); bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(ob); bool bHasSoftBody = (!ob->parent && (ob->gameflag & OB_SOFT_BODY)); @@ -2361,8 +2357,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie, if (me->dvert){ BL_DeformableGameObject *obj = (BL_DeformableGameObject*)converter->FindGameObject(blenderobj); - - if (obj && blenderobj->parent && blenderobj->parent->type==OB_ARMATURE && blenderobj->partype==PARSKEL){ + + if (obj && BL_ModifierDeformer::HasArmatureDeformer(blenderobj) && blenderobj->parent && blenderobj->parent->type==OB_ARMATURE){ KX_GameObject *par = converter->FindGameObject(blenderobj->parent); if (par && obj->GetDeformer()) ((BL_SkinDeformer*)obj->GetDeformer())->SetArmature((BL_ArmatureObject*) par); diff --git a/source/gameengine/Converter/BL_DeformableGameObject.cpp b/source/gameengine/Converter/BL_DeformableGameObject.cpp index 879322fba07..f076d52c745 100644 --- a/source/gameengine/Converter/BL_DeformableGameObject.cpp +++ b/source/gameengine/Converter/BL_DeformableGameObject.cpp @@ -33,10 +33,6 @@ #include "RAS_MaterialBucket.h" -#ifdef HAVE_CONFIG_H -#include -#endif - BL_DeformableGameObject::~BL_DeformableGameObject() { if (m_pDeformer) diff --git a/source/gameengine/Converter/BL_DeformableGameObject.h b/source/gameengine/Converter/BL_DeformableGameObject.h index 0696a61eb41..5d16e3ba1a8 100644 --- a/source/gameengine/Converter/BL_DeformableGameObject.h +++ b/source/gameengine/Converter/BL_DeformableGameObject.h @@ -102,7 +102,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_DeformableGameObject"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_DeformableGameObject"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/BL_MeshDeformer.cpp b/source/gameengine/Converter/BL_MeshDeformer.cpp index d8fcf8eb35d..332c6fee2cf 100644 --- a/source/gameengine/Converter/BL_MeshDeformer.cpp +++ b/source/gameengine/Converter/BL_MeshDeformer.cpp @@ -28,10 +28,6 @@ * Simple deformation controller that restores a mesh to its rest position */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // This warning tells us about truncation of __long__ stl-generated names. // It can occasionally cause DevStudio to have internal compiler warnings. diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h index c8f58dc7b17..50bad254b42 100644 --- a/source/gameengine/Converter/BL_MeshDeformer.h +++ b/source/gameengine/Converter/BL_MeshDeformer.h @@ -89,7 +89,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_MeshDeformer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_MeshDeformer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/BL_ModifierDeformer.cpp b/source/gameengine/Converter/BL_ModifierDeformer.cpp index e28ea47b162..5ccf8de29b1 100644 --- a/source/gameengine/Converter/BL_ModifierDeformer.cpp +++ b/source/gameengine/Converter/BL_ModifierDeformer.cpp @@ -114,11 +114,27 @@ bool BL_ModifierDeformer::HasCompatibleDeformer(Object *ob) continue; if (!(md->mode & eModifierMode_Realtime)) continue; + /* armature modifier are handled by SkinDeformer, not ModifierDeformer */ + if (md->type == eModifierType_Armature ) + continue; return true; } return false; } +bool BL_ModifierDeformer::HasArmatureDeformer(Object *ob) +{ + if (!ob->modifiers.first) + return false; + + ModifierData* md; + for (md = (ModifierData*)ob->modifiers.first; md; md = (ModifierData*)md->next) { + if (md->type == eModifierType_Armature ) + return true; + } + return false; +} + bool BL_ModifierDeformer::Update(void) { bool bShapeUpdate = BL_ShapeDeformer::Update(); diff --git a/source/gameengine/Converter/BL_ModifierDeformer.h b/source/gameengine/Converter/BL_ModifierDeformer.h index 1122d5e8b32..6e0ede8e62f 100644 --- a/source/gameengine/Converter/BL_ModifierDeformer.h +++ b/source/gameengine/Converter/BL_ModifierDeformer.h @@ -45,6 +45,7 @@ class BL_ModifierDeformer : public BL_ShapeDeformer { public: static bool HasCompatibleDeformer(Object *ob); + static bool HasArmatureDeformer(Object *ob); BL_ModifierDeformer(BL_DeformableGameObject *gameobj, @@ -104,7 +105,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ModifierDeformer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ModifierDeformer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp index 0b6d8363d73..08d3e54a7c5 100644 --- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp +++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp @@ -56,10 +56,6 @@ extern "C" { #include "BKE_animsys.h" } -#ifdef HAVE_CONFIG_H -#include -#endif - BL_ShapeActionActuator::~BL_ShapeActionActuator() { } diff --git a/source/gameengine/Converter/BL_ShapeDeformer.h b/source/gameengine/Converter/BL_ShapeDeformer.h index 0ae349642c4..98bd4a1b4ba 100644 --- a/source/gameengine/Converter/BL_ShapeDeformer.h +++ b/source/gameengine/Converter/BL_ShapeDeformer.h @@ -86,7 +86,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ShapeDeformer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ShapeDeformer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/BL_SkinDeformer.h b/source/gameengine/Converter/BL_SkinDeformer.h index 80bdd96febd..df7e8f6dffc 100644 --- a/source/gameengine/Converter/BL_SkinDeformer.h +++ b/source/gameengine/Converter/BL_SkinDeformer.h @@ -109,7 +109,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_SkinDeformer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_SkinDeformer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/BlenderWorldInfo.cpp b/source/gameengine/Converter/BlenderWorldInfo.cpp index d2ddf108794..47653519cfd 100644 --- a/source/gameengine/Converter/BlenderWorldInfo.cpp +++ b/source/gameengine/Converter/BlenderWorldInfo.cpp @@ -31,10 +31,6 @@ #include "BlenderWorldInfo.h" #include "KX_BlenderGL.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* This little block needed for linking to Blender... */ #ifdef WIN32 #include "BLI_winstuff.h" diff --git a/source/gameengine/Converter/BlenderWorldInfo.h b/source/gameengine/Converter/BlenderWorldInfo.h index b2762e9a73e..b500c55a7f2 100644 --- a/source/gameengine/Converter/BlenderWorldInfo.h +++ b/source/gameengine/Converter/BlenderWorldInfo.h @@ -98,7 +98,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BlenderWorldInfo"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BlenderWorldInfo"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.h b/source/gameengine/Converter/KX_BlenderScalarInterpolator.h index ad4779fee6a..7b49cbcf668 100644 --- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.h +++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.h @@ -53,7 +53,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ScalarInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ScalarInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -69,7 +69,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_InterpolatorList"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_InterpolatorList"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 3ee4248343c..0575c55846b 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -80,17 +80,14 @@ extern "C" #include "DNA_material_types.h" #include "BLI_blenlib.h" #include "MEM_guardedalloc.h" -//XXX #include "BSE_editipo.h" -//XXX #include "BSE_editipo_types.h" -// #include "DNA_ipo_types.h" #include "BKE_global.h" #include "BKE_animsys.h" #include "BKE_library.h" -#include "BKE_ipo.h" // eval_icu #include "BKE_material.h" // copy_material #include "BKE_mesh.h" // copy_mesh #include "DNA_space_types.h" #include "DNA_anim_types.h" +#include "RNA_define.h" #include "../../blender/editors/include/ED_keyframing.h" } @@ -755,22 +752,21 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber) { KX_Scene* scene = scenes->at(i); //PHY_IPhysicsEnvironment* physEnv = scene->GetPhysicsEnvironment(); - CListValue* parentList = scene->GetRootParentList(); + CListValue* parentList = scene->GetObjectList(); int numObjects = parentList->GetCount(); int g; for (g=0;gGetValue(g); - if (gameObj->IsDynamic()) + Object* blenderObject = gameObj->GetBlenderObject(); + if (blenderObject && blenderObject->parent==NULL && gameObj->GetPhysicsController() != NULL) { //KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController(); - - Object* blenderObject = gameObj->GetBlenderObject(); if(blenderObject->adt==NULL) BKE_id_add_animdata(&blenderObject->id); - if (blenderObject && blenderObject->adt) + if (blenderObject->adt) { const MT_Point3& position = gameObj->NodeGetWorldPosition(); //const MT_Vector3& scale = gameObj->NodeGetWorldScaling(); diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h index 3dd3afb5662..23d506c98ff 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.h +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h @@ -178,7 +178,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSceneConverter"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSceneConverter"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Converter/KX_ConvertControllers.cpp b/source/gameengine/Converter/KX_ConvertControllers.cpp index c1a99423fc7..858db6d76a1 100644 --- a/source/gameengine/Converter/KX_ConvertControllers.cpp +++ b/source/gameengine/Converter/KX_ConvertControllers.cpp @@ -46,10 +46,6 @@ #include "KX_GameObject.h" #include "IntValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* This little block needed for linking to Blender... */ #ifdef WIN32 #include "BLI_winstuff.h" diff --git a/source/gameengine/Converter/KX_ConvertProperties.cpp b/source/gameengine/Converter/KX_ConvertProperties.cpp index c5294e64d3d..44c0ad38909 100644 --- a/source/gameengine/Converter/KX_ConvertProperties.cpp +++ b/source/gameengine/Converter/KX_ConvertProperties.cpp @@ -28,10 +28,6 @@ #include "KX_ConvertProperties.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #include "DNA_object_types.h" #include "DNA_property_types.h" diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp index 2f81e82b2c7..d65fee93a12 100644 --- a/source/gameengine/Converter/KX_ConvertSensors.cpp +++ b/source/gameengine/Converter/KX_ConvertSensors.cpp @@ -30,10 +30,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable : 4786) #endif //WIN32 @@ -257,7 +253,15 @@ void BL_ConvertSensors(struct Object* blenderobject, gReverseKeyTranslateTable[F9KEY ] = SCA_IInputDevice::KX_F9KEY; gReverseKeyTranslateTable[F10KEY ] = SCA_IInputDevice::KX_F10KEY; gReverseKeyTranslateTable[F11KEY ] = SCA_IInputDevice::KX_F11KEY; - gReverseKeyTranslateTable[F12KEY ] = SCA_IInputDevice::KX_F12KEY; + gReverseKeyTranslateTable[F12KEY ] = SCA_IInputDevice::KX_F12KEY; + gReverseKeyTranslateTable[F13KEY ] = SCA_IInputDevice::KX_F13KEY; + gReverseKeyTranslateTable[F14KEY ] = SCA_IInputDevice::KX_F14KEY; + gReverseKeyTranslateTable[F15KEY ] = SCA_IInputDevice::KX_F15KEY; + gReverseKeyTranslateTable[F16KEY ] = SCA_IInputDevice::KX_F16KEY; + gReverseKeyTranslateTable[F17KEY ] = SCA_IInputDevice::KX_F17KEY; + gReverseKeyTranslateTable[F18KEY ] = SCA_IInputDevice::KX_F18KEY; + gReverseKeyTranslateTable[F19KEY ] = SCA_IInputDevice::KX_F19KEY; + gReverseKeyTranslateTable[PAUSEKEY ] = SCA_IInputDevice::KX_PAUSEKEY; gReverseKeyTranslateTable[INSERTKEY ] = SCA_IInputDevice::KX_INSERTKEY; diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp index 7c6b59a42bd..c983c8a5100 100644 --- a/source/gameengine/Converter/KX_IpoConvert.cpp +++ b/source/gameengine/Converter/KX_IpoConvert.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // don't show stl-warnings @@ -121,7 +117,7 @@ void BL_ConvertIpos(struct Object* blenderobject,KX_GameObject* gameobj,KX_Blend ) ); - char *rotmode, *drotmode; + const char *rotmode, *drotmode; switch(blenderobject->rotmode) { diff --git a/source/gameengine/Converter/KX_SoftBodyDeformer.h b/source/gameengine/Converter/KX_SoftBodyDeformer.h index 89407f2a279..ce3f695ef11 100644 --- a/source/gameengine/Converter/KX_SoftBodyDeformer.h +++ b/source/gameengine/Converter/KX_SoftBodyDeformer.h @@ -92,7 +92,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ShapeDeformer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ShapeDeformer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/BoolValue.cpp b/source/gameengine/Expressions/BoolValue.cpp index 62e43da335b..e6bb454a1b5 100644 --- a/source/gameengine/Expressions/BoolValue.cpp +++ b/source/gameengine/Expressions/BoolValue.cpp @@ -18,10 +18,6 @@ #include "ErrorValue.h" #include "VoidValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/BoolValue.h b/source/gameengine/Expressions/BoolValue.h index baec6bdee69..dac70e3c0b7 100644 --- a/source/gameengine/Expressions/BoolValue.h +++ b/source/gameengine/Expressions/BoolValue.h @@ -55,7 +55,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CBoolValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CBoolValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/ConstExpr.cpp b/source/gameengine/Expressions/ConstExpr.cpp index 6b64be9c9a9..e873e968c86 100644 --- a/source/gameengine/Expressions/ConstExpr.cpp +++ b/source/gameengine/Expressions/ConstExpr.cpp @@ -17,10 +17,6 @@ #include "ConstExpr.h" #include "VectorValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/ConstExpr.h b/source/gameengine/Expressions/ConstExpr.h index f48b8d34355..aef2ddc2467 100644 --- a/source/gameengine/Expressions/ConstExpr.h +++ b/source/gameengine/Expressions/ConstExpr.h @@ -45,7 +45,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CConstExpr"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CConstExpr"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/EXP_C-Api.cpp b/source/gameengine/Expressions/EXP_C-Api.cpp index f944dd38447..d97e13b7784 100644 --- a/source/gameengine/Expressions/EXP_C-Api.cpp +++ b/source/gameengine/Expressions/EXP_C-Api.cpp @@ -33,10 +33,6 @@ #include "ErrorValue.h" #include "InputParser.h" -#ifdef HAVE_CONFIG_H -#include -#endif - EXP_ValueHandle EXP_CreateInt(int innie) { return (EXP_ValueHandle) new CIntValue(innie); diff --git a/source/gameengine/Expressions/EmptyValue.cpp b/source/gameengine/Expressions/EmptyValue.cpp index 5d1273b5301..22215ba5ed1 100644 --- a/source/gameengine/Expressions/EmptyValue.cpp +++ b/source/gameengine/Expressions/EmptyValue.cpp @@ -21,10 +21,6 @@ #include "ListValue.h" #include "VoidValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/EmptyValue.h b/source/gameengine/Expressions/EmptyValue.h index 01029d1655d..f00bc6cfcd7 100644 --- a/source/gameengine/Expressions/EmptyValue.h +++ b/source/gameengine/Expressions/EmptyValue.h @@ -38,7 +38,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CEmptyValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CEmptyValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/ErrorValue.cpp b/source/gameengine/Expressions/ErrorValue.cpp index a44abf8b22e..3063d02d69d 100644 --- a/source/gameengine/Expressions/ErrorValue.cpp +++ b/source/gameengine/Expressions/ErrorValue.cpp @@ -14,10 +14,6 @@ #include "ErrorValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/ErrorValue.h b/source/gameengine/Expressions/ErrorValue.h index 2f65850c4f1..6bd131b762d 100644 --- a/source/gameengine/Expressions/ErrorValue.h +++ b/source/gameengine/Expressions/ErrorValue.h @@ -37,7 +37,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CErrorValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CErrorValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/Expression.cpp b/source/gameengine/Expressions/Expression.cpp index f16f572c322..7ef0d4cc84c 100644 --- a/source/gameengine/Expressions/Expression.cpp +++ b/source/gameengine/Expressions/Expression.cpp @@ -15,10 +15,6 @@ #include "Expression.h" #include "ErrorValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/Expression.h b/source/gameengine/Expressions/Expression.h index bd346fd0552..de0c0821727 100644 --- a/source/gameengine/Expressions/Expression.h +++ b/source/gameengine/Expressions/Expression.h @@ -66,7 +66,7 @@ class CBrokenLinkInfo #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CBrokenLinkInfo"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CBrokenLinkInfo"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -136,7 +136,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CExpression"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CExpression"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/FloatValue.cpp b/source/gameengine/Expressions/FloatValue.cpp index b1ac0e1ea9a..82c86ac68b2 100644 --- a/source/gameengine/Expressions/FloatValue.cpp +++ b/source/gameengine/Expressions/FloatValue.cpp @@ -19,10 +19,6 @@ #include "ErrorValue.h" #include "VoidValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/FloatValue.h b/source/gameengine/Expressions/FloatValue.h index f1469734a1f..49d4efa9f74 100644 --- a/source/gameengine/Expressions/FloatValue.h +++ b/source/gameengine/Expressions/FloatValue.h @@ -47,7 +47,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CFloatValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CFloatValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/IdentifierExpr.cpp b/source/gameengine/Expressions/IdentifierExpr.cpp index 23211b7eed3..3cbd5b748d1 100644 --- a/source/gameengine/Expressions/IdentifierExpr.cpp +++ b/source/gameengine/Expressions/IdentifierExpr.cpp @@ -28,10 +28,6 @@ #include "IdentifierExpr.h" -#ifdef HAVE_CONFIG_H -#include -#endif - CIdentifierExpr::CIdentifierExpr(const STR_String& identifier,CValue* id_context) :m_identifier(identifier) { diff --git a/source/gameengine/Expressions/IdentifierExpr.h b/source/gameengine/Expressions/IdentifierExpr.h index c47a63659c1..0e67b17a9c2 100644 --- a/source/gameengine/Expressions/IdentifierExpr.h +++ b/source/gameengine/Expressions/IdentifierExpr.h @@ -50,7 +50,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CIdentifierExpr"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CIdentifierExpr"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/IfExpr.cpp b/source/gameengine/Expressions/IfExpr.cpp index fcb37bff52d..0aa9cfbd3c6 100644 --- a/source/gameengine/Expressions/IfExpr.cpp +++ b/source/gameengine/Expressions/IfExpr.cpp @@ -17,10 +17,6 @@ #include "ErrorValue.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/IfExpr.h b/source/gameengine/Expressions/IfExpr.h index f06718c851f..b2a953bd36d 100644 --- a/source/gameengine/Expressions/IfExpr.h +++ b/source/gameengine/Expressions/IfExpr.h @@ -48,7 +48,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CIfExpr"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CIfExpr"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/InputParser.cpp b/source/gameengine/Expressions/InputParser.cpp index 96a52aec028..8187ff6a9e8 100644 --- a/source/gameengine/Expressions/InputParser.cpp +++ b/source/gameengine/Expressions/InputParser.cpp @@ -29,10 +29,6 @@ #include "Operator1Expr.h" #include "IdentifierExpr.h" -#ifdef HAVE_CONFIG_H -#include -#endif - // this is disable at the moment, I expected a memleak from it, but the error-cleanup was the reason // well, looks we don't need it anyway, until maybe the Curved Surfaces are integrated into CSG // cool things like (IF(LOD==1,CCurvedValue,IF(LOD==2,CCurvedValue2)) etc... diff --git a/source/gameengine/Expressions/InputParser.h b/source/gameengine/Expressions/InputParser.h index 0d7eab27aeb..b640d4eedc7 100644 --- a/source/gameengine/Expressions/InputParser.h +++ b/source/gameengine/Expressions/InputParser.h @@ -106,7 +106,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CParser"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CParser"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/IntValue.cpp b/source/gameengine/Expressions/IntValue.cpp index badba8ead63..83e57200db0 100644 --- a/source/gameengine/Expressions/IntValue.cpp +++ b/source/gameengine/Expressions/IntValue.cpp @@ -19,10 +19,6 @@ #include "StringValue.h" #include "VoidValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/IntValue.h b/source/gameengine/Expressions/IntValue.h index 26150674c93..63efea56d14 100644 --- a/source/gameengine/Expressions/IntValue.h +++ b/source/gameengine/Expressions/IntValue.h @@ -62,7 +62,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CIntValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CIntValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/KX_HashedPtr.cpp b/source/gameengine/Expressions/KX_HashedPtr.cpp index dbf8058d012..1743e55c2bf 100644 --- a/source/gameengine/Expressions/KX_HashedPtr.cpp +++ b/source/gameengine/Expressions/KX_HashedPtr.cpp @@ -28,10 +28,6 @@ #include "KX_HashedPtr.h" -#ifdef HAVE_CONFIG_H -#include -#endif - unsigned int KX_Hash(void * inDWord) { #if defined(_WIN64) diff --git a/source/gameengine/Expressions/KX_HashedPtr.h b/source/gameengine/Expressions/KX_HashedPtr.h index c4abf3b3279..09332377918 100644 --- a/source/gameengine/Expressions/KX_HashedPtr.h +++ b/source/gameengine/Expressions/KX_HashedPtr.h @@ -52,7 +52,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CHashedPtr"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CHashedPtr"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp index 6e47ed913db..4d9d82efb98 100644 --- a/source/gameengine/Expressions/ListValue.cpp +++ b/source/gameengine/Expressions/ListValue.cpp @@ -24,10 +24,6 @@ #include "BLO_sys_types.h" /* for intptr_t support */ -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -366,8 +362,8 @@ PyObject* listvalue_buffer_slice(PyObject* self,Py_ssize_t ilow, Py_ssize_t ihig if (ihigh >= n) ihigh = n; - if (ihigh < ilow) - ihigh = ilow; + if (ihigh < ilow) + ihigh = ilow; newlist = PyList_New(ihigh - ilow); if (!newlist) @@ -495,6 +491,8 @@ static PySequenceMethods listvalue_as_sequence = { NULL, /*sq_ass_item*/ NULL, /*sq_ass_slice*/ (objobjproc)listvalue_buffer_contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; diff --git a/source/gameengine/Expressions/Operator1Expr.cpp b/source/gameengine/Expressions/Operator1Expr.cpp index 85b3c669802..ca852020e5a 100644 --- a/source/gameengine/Expressions/Operator1Expr.cpp +++ b/source/gameengine/Expressions/Operator1Expr.cpp @@ -15,10 +15,6 @@ #include "Operator1Expr.h" #include "EmptyValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/Operator1Expr.h b/source/gameengine/Expressions/Operator1Expr.h index c2bc68076a0..62f178fb9f7 100644 --- a/source/gameengine/Expressions/Operator1Expr.h +++ b/source/gameengine/Expressions/Operator1Expr.h @@ -50,7 +50,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:COperator1Expr"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:COperator1Expr"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/Operator2Expr.cpp b/source/gameengine/Expressions/Operator2Expr.cpp index da0a3e9a9f9..9428559c607 100644 --- a/source/gameengine/Expressions/Operator2Expr.cpp +++ b/source/gameengine/Expressions/Operator2Expr.cpp @@ -20,10 +20,6 @@ #include "StringValue.h" #include "VoidValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/Operator2Expr.h b/source/gameengine/Expressions/Operator2Expr.h index bb26b7c03be..73ea177f0d0 100644 --- a/source/gameengine/Expressions/Operator2Expr.h +++ b/source/gameengine/Expressions/Operator2Expr.h @@ -56,7 +56,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:COperator2Expr"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:COperator2Expr"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index 7c830a33bbb..dbfa4a36ec6 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - /*------------------------------ * PyObjectPlus cpp * diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index d81753ce64d..7afa85c8c31 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -46,7 +46,7 @@ #ifndef DISABLE_PYTHON #ifdef USE_MATHUTILS extern "C" { -#include "../../blender/python/generic/Mathutils.h" /* so we can have mathutils callbacks */ +#include "../../blender/python/generic/mathutils.h" /* so we can have mathutils callbacks */ } #endif @@ -135,8 +135,8 @@ typedef struct PyObjectPlus_Proxy { // leave above line empty (macro)! #ifdef WITH_CXX_GUARDEDALLOC #define Py_Header __Py_Header \ - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, Type.tp_name); } \ - void operator delete( void *mem ) { MEM_freeN(mem); } \ + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, Type.tp_name); } \ + void operator delete(void *mem) { MEM_freeN(mem); } \ #else #define Py_Header __Py_Header @@ -144,7 +144,7 @@ typedef struct PyObjectPlus_Proxy { #ifdef WITH_CXX_GUARDEDALLOC #define Py_HeaderPtr __Py_HeaderPtr \ - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, Type.tp_name); } \ + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, Type.tp_name); } \ void operator delete( void *mem ) { MEM_freeN(mem); } \ #else @@ -466,16 +466,17 @@ typedef PyTypeObject * PyParentObject; // Define the PyParent Object #define Py_Header \ public: \ - + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PyObjectPlus"); } \ + void operator delete( void *mem ) { MEM_freeN(mem); } \ #define Py_HeaderPtr \ public: \ - + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PyObjectPlusPtr"); } \ + void operator delete( void *mem ) { MEM_freeN(mem); } \ #endif - // By making SG_QList the ultimate parent for PyObjectPlus objects, it // allows to put them in 2 different dynamic lists at the same time // The use of these links is interesting because they free of memory allocation diff --git a/source/gameengine/Expressions/StringValue.cpp b/source/gameengine/Expressions/StringValue.cpp index a7033fcf11c..d0aa8d26678 100644 --- a/source/gameengine/Expressions/StringValue.cpp +++ b/source/gameengine/Expressions/StringValue.cpp @@ -17,10 +17,6 @@ #include "ErrorValue.h" #include "VoidValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/StringValue.h b/source/gameengine/Expressions/StringValue.h index a23bb4ec3e2..d28e435e2a7 100644 --- a/source/gameengine/Expressions/StringValue.h +++ b/source/gameengine/Expressions/StringValue.h @@ -52,7 +52,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CStringValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CStringValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp index 6d2dfe2a6e3..1f4f961268b 100644 --- a/source/gameengine/Expressions/Value.cpp +++ b/source/gameengine/Expressions/Value.cpp @@ -23,10 +23,6 @@ #include "ErrorValue.h" #include "ListValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/source/gameengine/Expressions/Value.h b/source/gameengine/Expressions/Value.h index f639ae5af78..2bb9e39cafc 100644 --- a/source/gameengine/Expressions/Value.h +++ b/source/gameengine/Expressions/Value.h @@ -181,7 +181,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CAction"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CAction"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -436,7 +436,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CPropValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CPropValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/VectorValue.cpp b/source/gameengine/Expressions/VectorValue.cpp index c58c78e6ebe..59ff601746f 100644 --- a/source/gameengine/Expressions/VectorValue.cpp +++ b/source/gameengine/Expressions/VectorValue.cpp @@ -12,10 +12,6 @@ * */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable:4786) #endif diff --git a/source/gameengine/Expressions/VectorValue.h b/source/gameengine/Expressions/VectorValue.h index 49fb1e7ea08..cc4deda2041 100644 --- a/source/gameengine/Expressions/VectorValue.h +++ b/source/gameengine/Expressions/VectorValue.h @@ -83,7 +83,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CVectorValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CVectorValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Expressions/VoidValue.h b/source/gameengine/Expressions/VoidValue.h index 5281fb4f8a3..f30f8c1be7c 100644 --- a/source/gameengine/Expressions/VoidValue.h +++ b/source/gameengine/Expressions/VoidValue.h @@ -63,7 +63,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CVoidValue"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CVoidValue"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/CMakeLists.txt b/source/gameengine/GameLogic/CMakeLists.txt index 958e697aa39..3ffba14ec95 100644 --- a/source/gameengine/GameLogic/CMakeLists.txt +++ b/source/gameengine/GameLogic/CMakeLists.txt @@ -32,7 +32,6 @@ SET(INC ../../../intern/string ../../../source/gameengine/Expressions ../../../source/gameengine/SceneGraph - ../../../source/gameengine/Ketsji ../../../intern/moto/include ../../../source/gameengine/Rasterizer ) diff --git a/source/gameengine/GameLogic/Makefile b/source/gameengine/GameLogic/Makefile index 0d4d50b32a0..ba1e1c25ee7 100644 --- a/source/gameengine/GameLogic/Makefile +++ b/source/gameengine/GameLogic/Makefile @@ -38,11 +38,10 @@ include nan_compile.mk CCFLAGS += $(LEVEL_1_CPP_WARNINGS) -CPPFLAGS += -I../Expressions +CPPFLAGS += -I../Expressions CPPFLAGS += -I../SceneGraph CPPFLAGS += -I../Rasterizer -CPPFLAGS += -I../Ketsji -CPPFLAGS += -I$(NAN_STRING)/include +CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I../../blender/makesdna CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp index 43cf36b7db8..f6d24af0e67 100644 --- a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp +++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp @@ -26,9 +26,6 @@ #include "SCA_IActuator.h" #include "SCA_2DFilterActuator.h" -#ifdef HAVE_CONFIG_H -#include -#endif #include SCA_2DFilterActuator::~SCA_2DFilterActuator() @@ -42,7 +39,7 @@ SCA_2DFilterActuator::SCA_2DFilterActuator( float float_arg, int int_arg, RAS_IRasterizer* rasterizer, - KX_Scene* scene) + SCA_IScene* scene) : SCA_IActuator(gameobj, KX_ACT_2DFILTER), m_type(type), m_disableMotionBlur(flag), diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.h b/source/gameengine/GameLogic/SCA_2DFilterActuator.h index beb4cb88608..034b10763ce 100644 --- a/source/gameengine/GameLogic/SCA_2DFilterActuator.h +++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.h @@ -30,7 +30,7 @@ #include "RAS_IRasterizer.h" #include "SCA_IActuator.h" -#include "KX_Scene.h" +#include "SCA_IScene.h" class SCA_2DFilterActuator : public SCA_IActuator { @@ -45,7 +45,7 @@ private: int m_int_arg; STR_String m_shaderText; RAS_IRasterizer* m_rasterizer; - KX_Scene* m_scene; + SCA_IScene* m_scene; public: @@ -56,7 +56,7 @@ public: float float_arg, int int_arg, RAS_IRasterizer* rasterizer, - KX_Scene* scene); + SCA_IScene* scene); void SetShaderText(const char *text); virtual ~SCA_2DFilterActuator(); diff --git a/source/gameengine/GameLogic/SCA_ANDController.cpp b/source/gameengine/GameLogic/SCA_ANDController.cpp index 134e363708c..53c9be5215e 100644 --- a/source/gameengine/GameLogic/SCA_ANDController.cpp +++ b/source/gameengine/GameLogic/SCA_ANDController.cpp @@ -34,10 +34,6 @@ #include "SCA_LogicManager.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp b/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp index 5b2bdb07892..9a6ed25a203 100644 --- a/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp +++ b/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp @@ -30,10 +30,6 @@ #include "SCA_ActuatorEventManager.h" #include "SCA_ActuatorSensor.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_ActuatorEventManager::SCA_ActuatorEventManager(class SCA_LogicManager* logicmgr) : SCA_EventManager(logicmgr, ACTUATOR_EVENTMGR) diff --git a/source/gameengine/GameLogic/SCA_ActuatorEventManager.h b/source/gameengine/GameLogic/SCA_ActuatorEventManager.h index 9adb9fcca39..859cc5023f1 100644 --- a/source/gameengine/GameLogic/SCA_ActuatorEventManager.h +++ b/source/gameengine/GameLogic/SCA_ActuatorEventManager.h @@ -47,7 +47,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_ActuatorEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_ActuatorEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp index af5c3e7d364..c77e58d2f3b 100644 --- a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp +++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp @@ -34,10 +34,6 @@ #include "SCA_EventManager.h" #include "SCA_LogicManager.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_ActuatorSensor::SCA_ActuatorSensor(SCA_EventManager* eventmgr, SCA_IObject* gameobj, const STR_String& actname) diff --git a/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp b/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp index d1d7ac2095e..7ecd286ea43 100644 --- a/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp +++ b/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp @@ -35,10 +35,6 @@ #include #include "SCA_ISensor.h" -#ifdef HAVE_CONFIG_H -#include -#endif - using namespace std; SCA_AlwaysEventManager::SCA_AlwaysEventManager(class SCA_LogicManager* logicmgr) diff --git a/source/gameengine/GameLogic/SCA_AlwaysEventManager.h b/source/gameengine/GameLogic/SCA_AlwaysEventManager.h index cbbb5debd3c..59429303fc4 100644 --- a/source/gameengine/GameLogic/SCA_AlwaysEventManager.h +++ b/source/gameengine/GameLogic/SCA_AlwaysEventManager.h @@ -41,7 +41,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_AlwaysEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_AlwaysEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp index 6198a3ba471..0f3b81a057e 100644 --- a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp +++ b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp @@ -29,10 +29,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // This warning tells us about truncation of __long__ stl-generated names. // It can occasionally cause DevStudio to have internal compiler warnings. diff --git a/source/gameengine/GameLogic/SCA_BasicEventManager.cpp b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp index 012319c1954..b2ba64da551 100644 --- a/source/gameengine/GameLogic/SCA_BasicEventManager.cpp +++ b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp @@ -35,10 +35,6 @@ #include #include "SCA_ISensor.h" -#ifdef HAVE_CONFIG_H -#include -#endif - using namespace std; SCA_BasicEventManager::SCA_BasicEventManager(class SCA_LogicManager* logicmgr) diff --git a/source/gameengine/GameLogic/SCA_BasicEventManager.h b/source/gameengine/GameLogic/SCA_BasicEventManager.h index f105859c5c4..5e20a5becae 100644 --- a/source/gameengine/GameLogic/SCA_BasicEventManager.h +++ b/source/gameengine/GameLogic/SCA_BasicEventManager.h @@ -48,7 +48,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_BasicEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_BasicEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.cpp b/source/gameengine/GameLogic/SCA_DelaySensor.cpp index 502c2cb6370..701bcb2fc2f 100644 --- a/source/gameengine/GameLogic/SCA_DelaySensor.cpp +++ b/source/gameengine/GameLogic/SCA_DelaySensor.cpp @@ -29,10 +29,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // This warning tells us about truncation of __long__ stl-generated names. // It can occasionally cause DevStudio to have internal compiler warnings. diff --git a/source/gameengine/GameLogic/SCA_EventManager.cpp b/source/gameengine/GameLogic/SCA_EventManager.cpp index c78acd380e0..3a4a06ebfbd 100644 --- a/source/gameengine/GameLogic/SCA_EventManager.cpp +++ b/source/gameengine/GameLogic/SCA_EventManager.cpp @@ -30,10 +30,6 @@ #include "SCA_EventManager.h" #include "SCA_ISensor.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_EventManager::SCA_EventManager(SCA_LogicManager* logicmgr, EVENT_MANAGER_TYPE mgrtype) :m_logicmgr(logicmgr), diff --git a/source/gameengine/GameLogic/SCA_EventManager.h b/source/gameengine/GameLogic/SCA_EventManager.h index 8f77e7d4905..b01d3641cdb 100644 --- a/source/gameengine/GameLogic/SCA_EventManager.h +++ b/source/gameengine/GameLogic/SCA_EventManager.h @@ -82,7 +82,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_EventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_EventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_ExpressionController.cpp b/source/gameengine/GameLogic/SCA_ExpressionController.cpp index 0db36099984..b678648ca58 100644 --- a/source/gameengine/GameLogic/SCA_ExpressionController.cpp +++ b/source/gameengine/GameLogic/SCA_ExpressionController.cpp @@ -38,10 +38,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ diff --git a/source/gameengine/GameLogic/SCA_ExpressionController.h b/source/gameengine/GameLogic/SCA_ExpressionController.h index d7bb8edebb1..38e3904a8d6 100644 --- a/source/gameengine/GameLogic/SCA_ExpressionController.h +++ b/source/gameengine/GameLogic/SCA_ExpressionController.h @@ -57,7 +57,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_ExpressionController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_ExpressionController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_IActuator.cpp b/source/gameengine/GameLogic/SCA_IActuator.cpp index 9755d151fb3..b836227895f 100644 --- a/source/gameengine/GameLogic/SCA_IActuator.cpp +++ b/source/gameengine/GameLogic/SCA_IActuator.cpp @@ -29,10 +29,6 @@ #include "SCA_IActuator.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - using namespace std; SCA_IActuator::SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type) : diff --git a/source/gameengine/GameLogic/SCA_IActuator.h b/source/gameengine/GameLogic/SCA_IActuator.h index f456183a16c..d3ead7c7460 100644 --- a/source/gameengine/GameLogic/SCA_IActuator.h +++ b/source/gameengine/GameLogic/SCA_IActuator.h @@ -157,7 +157,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_IActuator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_IActuator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_IController.cpp b/source/gameengine/GameLogic/SCA_IController.cpp index c72dfcc696c..c291ff091aa 100644 --- a/source/gameengine/GameLogic/SCA_IController.cpp +++ b/source/gameengine/GameLogic/SCA_IController.cpp @@ -35,10 +35,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_IController::SCA_IController(SCA_IObject* gameobj) : SCA_ILogicBrick(gameobj), diff --git a/source/gameengine/GameLogic/SCA_IInputDevice.h b/source/gameengine/GameLogic/SCA_IInputDevice.h index b49168f325b..a13efee1316 100644 --- a/source/gameengine/GameLogic/SCA_IInputDevice.h +++ b/source/gameengine/GameLogic/SCA_IInputDevice.h @@ -230,6 +230,13 @@ public: KX_F10KEY, KX_F11KEY, KX_F12KEY, + KX_F13KEY, + KX_F14KEY, + KX_F15KEY, + KX_F16KEY, + KX_F17KEY, + KX_F18KEY, + KX_F19KEY, KX_PAUSEKEY, KX_INSERTKEY, @@ -309,8 +316,8 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_InputEvent"); } - void operator delete( void *mem ) { MEM_freeN(mem); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_InputEvent"); } + void operator delete(void *mem) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp index b82fc4e2dd7..f2e1a8dd151 100644 --- a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp +++ b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp @@ -29,10 +29,6 @@ #include "SCA_ILogicBrick.h" #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_LogicManager* SCA_ILogicBrick::m_sCurrentLogicManager = NULL; SCA_ILogicBrick::SCA_ILogicBrick(SCA_IObject* gameobj) diff --git a/source/gameengine/GameLogic/SCA_IObject.cpp b/source/gameengine/GameLogic/SCA_IObject.cpp index c43e5ed0598..7c0a5b2db15 100644 --- a/source/gameengine/GameLogic/SCA_IObject.cpp +++ b/source/gameengine/GameLogic/SCA_IObject.cpp @@ -35,10 +35,6 @@ #include "MT_Point3.h" #include "ListValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - MT_Point3 SCA_IObject::m_sDummy=MT_Point3(0,0,0); SG_QList SCA_IObject::m_activeBookmarkedControllers; diff --git a/source/gameengine/GameLogic/SCA_IScene.cpp b/source/gameengine/GameLogic/SCA_IScene.cpp index b11daf6653f..75e323efe94 100644 --- a/source/gameengine/GameLogic/SCA_IScene.cpp +++ b/source/gameengine/GameLogic/SCA_IScene.cpp @@ -29,10 +29,6 @@ #include "SCA_IScene.h" #include "Value.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_DebugProp::SCA_DebugProp(): m_obj(NULL) { } diff --git a/source/gameengine/GameLogic/SCA_IScene.h b/source/gameengine/GameLogic/SCA_IScene.h index 6658aa961ac..93b040c9a31 100644 --- a/source/gameengine/GameLogic/SCA_IScene.h +++ b/source/gameengine/GameLogic/SCA_IScene.h @@ -32,6 +32,7 @@ #include #include "STR_String.h" +#include "RAS_2DFilterManager.h" #ifdef WITH_CXX_GUARDEDALLOC #include "MEM_guardedalloc.h" @@ -64,11 +65,14 @@ public: void AddDebugProperty(class CValue* debugprop, const STR_String &name); void RemoveAllDebugProperties(); + virtual void Update2DFilter(vector& propNames, void* gameObj, + RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, + int pass, STR_String& text) {} #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_IScene"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_IScene"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp index c9c858fd868..bff02326c9c 100644 --- a/source/gameengine/GameLogic/SCA_ISensor.cpp +++ b/source/gameengine/GameLogic/SCA_ISensor.cpp @@ -37,10 +37,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* Native functions */ void SCA_ISensor::ReParent(SCA_IObject* parent) { diff --git a/source/gameengine/GameLogic/SCA_JoystickManager.cpp b/source/gameengine/GameLogic/SCA_JoystickManager.cpp index 94330e52da9..5a975552d3d 100644 --- a/source/gameengine/GameLogic/SCA_JoystickManager.cpp +++ b/source/gameengine/GameLogic/SCA_JoystickManager.cpp @@ -30,9 +30,6 @@ //#include #include "SCA_ISensor.h" -#ifdef HAVE_CONFIG_H -#include -#endif //using namespace std; diff --git a/source/gameengine/GameLogic/SCA_JoystickManager.h b/source/gameengine/GameLogic/SCA_JoystickManager.h index cde2e866815..e5f53442049 100644 --- a/source/gameengine/GameLogic/SCA_JoystickManager.h +++ b/source/gameengine/GameLogic/SCA_JoystickManager.h @@ -48,7 +48,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_JoystickManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_JoystickManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp index b79b014a161..5ab42ae7608 100644 --- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp +++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp @@ -36,10 +36,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_JoystickSensor::SCA_JoystickSensor(class SCA_JoystickManager* eventmgr, SCA_IObject* gameobj, diff --git a/source/gameengine/GameLogic/SCA_KeyboardManager.h b/source/gameengine/GameLogic/SCA_KeyboardManager.h index a9fe208eaca..53735f9fae1 100644 --- a/source/gameengine/GameLogic/SCA_KeyboardManager.h +++ b/source/gameengine/GameLogic/SCA_KeyboardManager.h @@ -58,7 +58,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_KeyboardManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_KeyboardManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp index 224a3bbaf80..c49d65226dc 100644 --- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp +++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp @@ -33,10 +33,6 @@ #include "StringValue.h" #include "SCA_IInputDevice.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp index 9f9eb8a785f..d003c5618f1 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.cpp +++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp @@ -36,10 +36,6 @@ #include "SCA_PythonController.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_LogicManager::SCA_LogicManager() { diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h index 85733275a45..c5f377eeb44 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.h +++ b/source/gameengine/GameLogic/SCA_LogicManager.h @@ -146,7 +146,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_LogicManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_LogicManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_MouseManager.cpp b/source/gameengine/GameLogic/SCA_MouseManager.cpp index 4f5d199e163..f7f9a566c8d 100644 --- a/source/gameengine/GameLogic/SCA_MouseManager.cpp +++ b/source/gameengine/GameLogic/SCA_MouseManager.cpp @@ -30,10 +30,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // This warning tells us about truncation of __long__ stl-generated names. // It can occasionally cause DevStudio to have internal compiler warnings. @@ -44,12 +40,15 @@ #include "SCA_MouseManager.h" #include "SCA_MouseSensor.h" #include "IntValue.h" +#include "RAS_ICanvas.h" SCA_MouseManager::SCA_MouseManager(SCA_LogicManager* logicmgr, - SCA_IInputDevice* mousedev) + SCA_IInputDevice* mousedev, + RAS_ICanvas* canvas) : SCA_EventManager(logicmgr, MOUSE_EVENTMGR), - m_mousedevice (mousedev) + m_mousedevice (mousedev), + m_canvas(canvas) { m_xpos = 0; m_ypos = 0; @@ -82,12 +81,13 @@ void SCA_MouseManager::NextFrame() // coordinates if (!mousesensor->IsSuspended()) { - const SCA_InputEvent& event = + const SCA_InputEvent& event1 = m_mousedevice->GetEventValue(SCA_IInputDevice::KX_MOUSEX); - int mx = event.m_eventval; const SCA_InputEvent& event2 = m_mousedevice->GetEventValue(SCA_IInputDevice::KX_MOUSEY); - int my = event2.m_eventval; + + int mx = this->m_canvas->GetMouseX(event1.m_eventval); + int my = this->m_canvas->GetMouseY(event2.m_eventval); mousesensor->setX(mx); mousesensor->setY(my); diff --git a/source/gameengine/GameLogic/SCA_MouseManager.h b/source/gameengine/GameLogic/SCA_MouseManager.h index 82a8c996ef5..8bf060537ca 100644 --- a/source/gameengine/GameLogic/SCA_MouseManager.h +++ b/source/gameengine/GameLogic/SCA_MouseManager.h @@ -47,12 +47,13 @@ class SCA_MouseManager : public SCA_EventManager { class SCA_IInputDevice* m_mousedevice; + class RAS_ICanvas* m_canvas; unsigned short m_xpos; // Cached location of the mouse pointer unsigned short m_ypos; public: - SCA_MouseManager(class SCA_LogicManager* logicmgr,class SCA_IInputDevice* mousedev); + SCA_MouseManager(class SCA_LogicManager* logicmgr,class SCA_IInputDevice* mousedev, class RAS_ICanvas* canvas); virtual ~SCA_MouseManager(); /** @@ -66,7 +67,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_MouseManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_MouseManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.cpp b/source/gameengine/GameLogic/SCA_MouseSensor.cpp index 10835f13d54..9f4b25986b0 100644 --- a/source/gameengine/GameLogic/SCA_MouseSensor.cpp +++ b/source/gameengine/GameLogic/SCA_MouseSensor.cpp @@ -38,10 +38,6 @@ #include "ConstExpr.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_NANDController.cpp b/source/gameengine/GameLogic/SCA_NANDController.cpp index 233adcb76dd..c09a53d8ac7 100644 --- a/source/gameengine/GameLogic/SCA_NANDController.cpp +++ b/source/gameengine/GameLogic/SCA_NANDController.cpp @@ -34,10 +34,6 @@ #include "SCA_LogicManager.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_NORController.cpp b/source/gameengine/GameLogic/SCA_NORController.cpp index 7c0a4e89e22..8ebd79efcfa 100644 --- a/source/gameengine/GameLogic/SCA_NORController.cpp +++ b/source/gameengine/GameLogic/SCA_NORController.cpp @@ -34,10 +34,6 @@ #include "SCA_LogicManager.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_ORController.cpp b/source/gameengine/GameLogic/SCA_ORController.cpp index 6df566f4695..a638147e211 100644 --- a/source/gameengine/GameLogic/SCA_ORController.cpp +++ b/source/gameengine/GameLogic/SCA_ORController.cpp @@ -34,10 +34,6 @@ #include "SCA_LogicManager.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp index 4ead0c54392..c1b49d32712 100644 --- a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp +++ b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp @@ -34,10 +34,6 @@ #include "Operator2Expr.h" #include "ConstExpr.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp b/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp index d78a9afbaca..f6a1b257c18 100644 --- a/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp +++ b/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp @@ -29,10 +29,6 @@ #include "SCA_ISensor.h" #include "SCA_PropertyEventManager.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_PropertyEventManager::SCA_PropertyEventManager(class SCA_LogicManager* logicmgr) : SCA_EventManager(logicmgr, PROPERTY_EVENTMGR) diff --git a/source/gameengine/GameLogic/SCA_PropertyEventManager.h b/source/gameengine/GameLogic/SCA_PropertyEventManager.h index 159b6d8b827..4e2920d9d70 100644 --- a/source/gameengine/GameLogic/SCA_PropertyEventManager.h +++ b/source/gameengine/GameLogic/SCA_PropertyEventManager.h @@ -46,7 +46,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_PropertyEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_PropertyEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.cpp b/source/gameengine/GameLogic/SCA_PropertySensor.cpp index 134d34fc00d..be86b976a70 100644 --- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp +++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp @@ -41,10 +41,6 @@ #include "FloatValue.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_PropertySensor::SCA_PropertySensor(SCA_EventManager* eventmgr, SCA_IObject* gameobj, const STR_String& propname, @@ -316,10 +312,36 @@ CValue* SCA_PropertySensor::FindIdentifier(const STR_String& identifiername) int SCA_PropertySensor::validValueForProperty(void *self, const PyAttributeDef*) { + /* If someone actually do type checking please make sure the 'max' and 'min' + are checked as well (currently they are calling the PrecalculateRangeExpression + function directly */ + /* There is no type checking at this moment, unfortunately... */ return 0; } +int SCA_PropertySensor::validValueForIntervalProperty(void *self, const PyAttributeDef*) +{ + SCA_PropertySensor* sensor = reinterpret_cast(self); + + if (sensor->m_checktype==KX_PROPSENSOR_INTERVAL) + { + sensor->PrecalculateRangeExpression(); + } + return 0; +} + +int SCA_PropertySensor::modeChange(void *self, const PyAttributeDef* attrdef) +{ + SCA_PropertySensor* sensor = reinterpret_cast(self); + + if (sensor->m_checktype==KX_PROPSENSOR_INTERVAL) + { + sensor->PrecalculateRangeExpression(); + } + return 0; +} + /* Integration hooks ------------------------------------------------------- */ PyTypeObject SCA_PropertySensor::Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -348,9 +370,11 @@ PyMethodDef SCA_PropertySensor::Methods[] = { }; PyAttributeDef SCA_PropertySensor::Attributes[] = { - KX_PYATTRIBUTE_INT_RW("mode",KX_PROPSENSOR_NODEF,KX_PROPSENSOR_MAX-1,false,SCA_PropertySensor,m_checktype), + KX_PYATTRIBUTE_INT_RW_CHECK("mode",KX_PROPSENSOR_NODEF,KX_PROPSENSOR_MAX-1,false,SCA_PropertySensor,m_checktype,modeChange), KX_PYATTRIBUTE_STRING_RW_CHECK("propName",0,100,false,SCA_PropertySensor,m_checkpropname,CheckProperty), KX_PYATTRIBUTE_STRING_RW_CHECK("value",0,100,false,SCA_PropertySensor,m_checkpropval,validValueForProperty), + KX_PYATTRIBUTE_STRING_RW_CHECK("min",0,100,false,SCA_PropertySensor,m_checkpropval,validValueForIntervalProperty), + KX_PYATTRIBUTE_STRING_RW_CHECK("max",0,100,false,SCA_PropertySensor,m_checkpropmaxval,validValueForIntervalProperty), { NULL } //Sentinel }; diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.h b/source/gameengine/GameLogic/SCA_PropertySensor.h index 0bc1e9b3579..9a5c4762558 100644 --- a/source/gameengine/GameLogic/SCA_PropertySensor.h +++ b/source/gameengine/GameLogic/SCA_PropertySensor.h @@ -95,6 +95,16 @@ public: */ static int validValueForProperty(void* self, const PyAttributeDef*); + /** + * Test whether this is a sensible value for interval (type check) and updates Range Expression + */ + static int validValueForIntervalProperty(void* self, const PyAttributeDef*); + + /** + * Test if the new mode is interval. If positive updates Range Expression + */ + static int modeChange(void* self, const PyAttributeDef* attrdef); + #endif }; diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp index b7367221f80..45d3be01bbb 100644 --- a/source/gameengine/GameLogic/SCA_PythonController.cpp +++ b/source/gameengine/GameLogic/SCA_PythonController.cpp @@ -43,10 +43,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - // initialize static member variables SCA_PythonController* SCA_PythonController::m_sCurrentController = NULL; diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp new file mode 100644 index 00000000000..7951a749254 --- /dev/null +++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp @@ -0,0 +1,104 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "SCA_PythonKeyboard.h" +#include "SCA_IInputDevice.h" + +/* ------------------------------------------------------------------------- */ +/* Native functions */ +/* ------------------------------------------------------------------------- */ + +SCA_PythonKeyboard::SCA_PythonKeyboard(SCA_IInputDevice* keyboard) +: PyObjectPlus(), +m_keyboard(keyboard) +{ +} + +SCA_PythonKeyboard::~SCA_PythonKeyboard() +{ + /* intentionally empty */ +} + +#ifndef DISABLE_PYTHON + +/* ------------------------------------------------------------------------- */ +/* Python functions */ +/* ------------------------------------------------------------------------- */ + +/* Integration hooks ------------------------------------------------------- */ +PyTypeObject SCA_PythonKeyboard::Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "SCA_PythonKeyboard", + sizeof(PyObjectPlus_Proxy), + 0, + py_base_dealloc, + 0, + 0, + 0, + 0, + py_base_repr, + 0,0,0,0,0,0,0,0,0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + 0,0,0,0,0,0,0, + Methods, + 0, + 0, + &PyObjectPlus::Type, + 0,0,0,0,0,0, + py_base_new +}; + +PyMethodDef SCA_PythonKeyboard::Methods[] = { + {NULL,NULL} //Sentinel +}; + +PyAttributeDef SCA_PythonKeyboard::Attributes[] = { + KX_PYATTRIBUTE_RO_FUNCTION("events", SCA_PythonKeyboard, pyattr_get_events), + { NULL } //Sentinel +}; + +PyObject* SCA_PythonKeyboard::pyattr_get_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + SCA_PythonKeyboard* self = static_cast(self_v); + + PyObject* resultlist = PyList_New(0); + + for (int i=SCA_IInputDevice::KX_BEGINKEY; i<=SCA_IInputDevice::KX_ENDKEY; i++) + { + const SCA_InputEvent & inevent = self->m_keyboard->GetEventValue((SCA_IInputDevice::KX_EnumInputs)i); + + + if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS) + { + PyObject* keypair = PyTuple_New(2); + PyTuple_SET_ITEM(keypair, 0, PyLong_FromSsize_t(i)); + PyTuple_SET_ITEM(keypair, 1, PyLong_FromSsize_t(inevent.m_status)); + PyList_Append(resultlist, keypair); + } + } + + return resultlist; +} + +#endif diff --git a/source/blender/imbuf/intern/IMB_iff.h b/source/gameengine/GameLogic/SCA_PythonKeyboard.h similarity index 68% rename from source/blender/imbuf/intern/IMB_iff.h rename to source/gameengine/GameLogic/SCA_PythonKeyboard.h index 7d0a74dc00b..0b353ac444c 100644 --- a/source/blender/imbuf/intern/IMB_iff.h +++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.h @@ -1,6 +1,4 @@ -/* - * IMB_iff.h - * +/** * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -19,28 +17,28 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** */ -/** - * \file IMB_iff.h - * \ingroup imbuf - * \brief Function declarations for iff.c - */ -#ifndef IMB_IFF_H -#define IMB_IFF_H +#ifndef __KX_PYKEYBOARD +#define __KX_PYKEYBOARD -struct ImBuf; +#include "PyObjectPlus.h" -unsigned short imb_start_iff(struct ImBuf *ibuf, int file); -unsigned short imb_update_iff(int file, int code); +class SCA_PythonKeyboard : public PyObjectPlus +{ + Py_Header; + class SCA_IInputDevice *m_keyboard; +public: + SCA_PythonKeyboard(class SCA_IInputDevice* keyboard); + virtual ~SCA_PythonKeyboard(); +#ifndef DISABLE_PYTHON + static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); #endif +}; + +#endif //__KX_PYKEYBOARD diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.cpp b/source/gameengine/GameLogic/SCA_PythonMouse.cpp new file mode 100644 index 00000000000..041a0169879 --- /dev/null +++ b/source/gameengine/GameLogic/SCA_PythonMouse.cpp @@ -0,0 +1,178 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "SCA_PythonMouse.h" +#include "SCA_IInputDevice.h" +#include "RAS_ICanvas.h" + +/* ------------------------------------------------------------------------- */ +/* Native functions */ +/* ------------------------------------------------------------------------- */ + +SCA_PythonMouse::SCA_PythonMouse(SCA_IInputDevice* mouse, RAS_ICanvas* canvas) +: PyObjectPlus(), +m_mouse(mouse), +m_canvas(canvas) +{ +} + +SCA_PythonMouse::~SCA_PythonMouse() +{ + /* intentionally empty */ +} + +#ifndef DISABLE_PYTHON + +/* ------------------------------------------------------------------------- */ +/* Python functions */ +/* ------------------------------------------------------------------------- */ + +/* Integration hooks ------------------------------------------------------- */ +PyTypeObject SCA_PythonMouse::Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "SCA_PythonMouse", + sizeof(PyObjectPlus_Proxy), + 0, + py_base_dealloc, + 0, + 0, + 0, + 0, + py_base_repr, + 0,0,0,0,0,0,0,0,0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + 0,0,0,0,0,0,0, + Methods, + 0, + 0, + &PyObjectPlus::Type, + 0,0,0,0,0,0, + py_base_new +}; + +PyMethodDef SCA_PythonMouse::Methods[] = { +// KX_PYMETHODTABLE(SCA_PythonMouse, show), + {NULL,NULL} //Sentinel +}; + +PyAttributeDef SCA_PythonMouse::Attributes[] = { + KX_PYATTRIBUTE_RO_FUNCTION("events", SCA_PythonMouse, pyattr_get_events), + KX_PYATTRIBUTE_RW_FUNCTION("position", SCA_PythonMouse, pyattr_get_position, pyattr_set_position), + KX_PYATTRIBUTE_RW_FUNCTION("visible", SCA_PythonMouse, pyattr_get_visible, pyattr_set_visible), + { NULL } //Sentinel +}; + +PyObject* SCA_PythonMouse::pyattr_get_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + SCA_PythonMouse* self = static_cast(self_v); + + PyObject* resultlist = PyList_New(0); + + for (int i=SCA_IInputDevice::KX_BEGINMOUSE; i<=SCA_IInputDevice::KX_ENDMOUSE; i++) + { + const SCA_InputEvent & inevent = self->m_mouse->GetEventValue((SCA_IInputDevice::KX_EnumInputs)i); + + + if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS) + { + PyObject* keypair = PyTuple_New(2); + PyTuple_SET_ITEM(keypair, 0, PyLong_FromSsize_t(i)); + PyTuple_SET_ITEM(keypair, 1, PyLong_FromSsize_t(inevent.m_status)); + PyList_Append(resultlist, keypair); + } + } + + return resultlist; +} + +PyObject* SCA_PythonMouse::pyattr_get_position(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + SCA_PythonMouse* self = static_cast(self_v); + const SCA_InputEvent & xevent = self->m_mouse->GetEventValue(SCA_IInputDevice::KX_MOUSEX); + const SCA_InputEvent & yevent = self->m_mouse->GetEventValue(SCA_IInputDevice::KX_MOUSEY); + + float x_coord, y_coord; + + x_coord = self->m_canvas->GetMouseNormalizedX(xevent.m_eventval); + y_coord = self->m_canvas->GetMouseNormalizedY(yevent.m_eventval); + + PyObject* ret = PyTuple_New(2); + + PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(x_coord)); + PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(y_coord)); + + return ret; +} + +int SCA_PythonMouse::pyattr_set_position(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + SCA_PythonMouse* self = static_cast(self_v); + int x, y; + float pyx, pyy; + if (!PyArg_ParseTuple(value, "ff:position", &pyx, &pyy)) + return PY_SET_ATTR_FAIL; + + x = (int)(pyx*self->m_canvas->GetWidth()); + y = (int)(pyy*self->m_canvas->GetHeight()); + + self->m_canvas->SetMousePosition(x, y); + + return PY_SET_ATTR_SUCCESS; +} + +PyObject* SCA_PythonMouse::pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + SCA_PythonMouse* self = static_cast(self_v); + + int visible; + + if (self->m_canvas->GetMouseState() == RAS_ICanvas::MOUSE_INVISIBLE) + visible = 0; + else + visible = 1; + + return PyBool_FromLong(visible); +} + +int SCA_PythonMouse::pyattr_set_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + SCA_PythonMouse* self = static_cast(self_v); + + int visible = PyObject_IsTrue(value); + + if (visible == -1) + { + PyErr_SetString(PyExc_AttributeError, "SCA_PythonMouse.visible = bool: SCA_PythonMouse, expected True or False"); + return PY_SET_ATTR_FAIL; + } + + if (visible) + self->m_canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL); + else + self->m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE); + + return PY_SET_ATTR_SUCCESS; +} + +#endif diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.h b/source/gameengine/GameLogic/SCA_PythonMouse.h new file mode 100644 index 00000000000..c73e6683fc8 --- /dev/null +++ b/source/gameengine/GameLogic/SCA_PythonMouse.h @@ -0,0 +1,53 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __KX_PYMOUSE +#define __KX_PYMOUSE + +#include "PyObjectPlus.h" + +class SCA_PythonMouse : public PyObjectPlus +{ + Py_Header; + class SCA_IInputDevice *m_mouse; + class RAS_ICanvas *m_canvas; +public: + SCA_PythonMouse(class SCA_IInputDevice* mouse, class RAS_ICanvas* canvas); + virtual ~SCA_PythonMouse(); + + void Show(bool visible); + +#ifndef DISABLE_PYTHON + KX_PYMETHOD_DOC(SCA_PythonMouse, show); + + static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_position(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_position(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value); + static PyObject* pyattr_get_visible(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_visible(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value); +#endif +}; + +#endif //__KX_PYMOUSE + diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp index ee9288cc0a6..4b90ca7dadf 100644 --- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp +++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp @@ -37,10 +37,6 @@ #include "math.h" #include "MT_Transform.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_RandomEventManager.cpp b/source/gameengine/GameLogic/SCA_RandomEventManager.cpp index dc5aa3739ee..a0ffed57ba5 100644 --- a/source/gameengine/GameLogic/SCA_RandomEventManager.cpp +++ b/source/gameengine/GameLogic/SCA_RandomEventManager.cpp @@ -37,10 +37,6 @@ using namespace std; #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - SCA_RandomEventManager::SCA_RandomEventManager(class SCA_LogicManager* logicmgr) : SCA_EventManager(logicmgr, RANDOM_EVENTMGR) { diff --git a/source/gameengine/GameLogic/SCA_RandomEventManager.h b/source/gameengine/GameLogic/SCA_RandomEventManager.h index 386ec886f06..51d233c4321 100644 --- a/source/gameengine/GameLogic/SCA_RandomEventManager.h +++ b/source/gameengine/GameLogic/SCA_RandomEventManager.h @@ -47,7 +47,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_RandomEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_RandomEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp index 644b0a4a9ea..f5cd4b07458 100644 --- a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp +++ b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp @@ -37,10 +37,6 @@ #include #include "SCA_RandomNumberGenerator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* Period parameters */ #define N 624 #define M 397 diff --git a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h index 1e644fe5c26..8402d0312fc 100644 --- a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h +++ b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h @@ -77,7 +77,7 @@ class SCA_RandomNumberGenerator { #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_RandomNumberGenerator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_RandomNumberGenerator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.cpp b/source/gameengine/GameLogic/SCA_RandomSensor.cpp index 6605752a209..a7d18ff40d4 100644 --- a/source/gameengine/GameLogic/SCA_RandomSensor.cpp +++ b/source/gameengine/GameLogic/SCA_RandomSensor.cpp @@ -36,10 +36,6 @@ #include "ConstExpr.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_TimeEventManager.cpp b/source/gameengine/GameLogic/SCA_TimeEventManager.cpp index cb0d232ffa8..d794a4f1227 100644 --- a/source/gameengine/GameLogic/SCA_TimeEventManager.cpp +++ b/source/gameengine/GameLogic/SCA_TimeEventManager.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 // This warning tells us about truncation of __long__ stl-generated names. diff --git a/source/gameengine/GameLogic/SCA_TimeEventManager.h b/source/gameengine/GameLogic/SCA_TimeEventManager.h index ad4f343d137..b2a2eb5fe5d 100644 --- a/source/gameengine/GameLogic/SCA_TimeEventManager.h +++ b/source/gameengine/GameLogic/SCA_TimeEventManager.h @@ -52,7 +52,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_TimeEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_TimeEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/GameLogic/SCA_XNORController.cpp b/source/gameengine/GameLogic/SCA_XNORController.cpp index 73e45542ce4..9f54e41d110 100644 --- a/source/gameengine/GameLogic/SCA_XNORController.cpp +++ b/source/gameengine/GameLogic/SCA_XNORController.cpp @@ -34,10 +34,6 @@ #include "SCA_LogicManager.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SCA_XORController.cpp b/source/gameengine/GameLogic/SCA_XORController.cpp index ea7b162e7f3..a58f30a3bed 100644 --- a/source/gameengine/GameLogic/SCA_XORController.cpp +++ b/source/gameengine/GameLogic/SCA_XORController.cpp @@ -34,10 +34,6 @@ #include "SCA_LogicManager.h" #include "BoolValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/GameLogic/SConscript b/source/gameengine/GameLogic/SConscript index 57325d99d04..3840754ed06 100644 --- a/source/gameengine/GameLogic/SConscript +++ b/source/gameengine/GameLogic/SConscript @@ -6,7 +6,6 @@ sources = env.Glob('*.cpp') + env.Glob('Joystick/*.cpp') incs = '. #/source/kernel/gen_system #/intern/string' incs += ' #/source/gameengine/Expressions #/intern/moto/include' incs += ' #/source/gameengine/Rasterizer #/source/gameengine/SceneGraph' -incs += ' #/source/gameengine/Ketsji' defs = [] diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp index 3fa27b40928..b90aec75959 100644 --- a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp +++ b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp @@ -27,10 +27,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef NOPNG #ifdef WIN32 #include "png.h" @@ -100,6 +96,12 @@ void GPC_Canvas::ClearColor(float r, float g, float b, float a) void GPC_Canvas::SetViewPort(int x1, int y1, int x2, int y2) { + /* x1 and y1 are the min pixel coordinate (e.g. 0) + x2 and y2 are the max pixel coordinate + the width,height is calculated including both pixels + therefore: max - min + 1 + */ + /* XXX, nasty, this needs to go somewhere else, * but where... definitly need to clean up this * whole canvas/rendertools mess. diff --git a/source/gameengine/GamePlayer/common/GPC_Engine.cpp b/source/gameengine/GamePlayer/common/GPC_Engine.cpp index 3222392ed9a..54ace227821 100644 --- a/source/gameengine/GamePlayer/common/GPC_Engine.cpp +++ b/source/gameengine/GamePlayer/common/GPC_Engine.cpp @@ -27,10 +27,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable:4786) // suppress stl-MSVC debug info warning #endif // WIN32 diff --git a/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp b/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp index 08902aaa029..706c3d178cd 100644 --- a/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp +++ b/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp @@ -29,10 +29,6 @@ #include "GPC_MouseDevice.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPC_MouseDevice::GPC_MouseDevice() { diff --git a/source/gameengine/GamePlayer/common/GPC_RawImage.cpp b/source/gameengine/GamePlayer/common/GPC_RawImage.cpp index d13428b799f..42f3b2dc1e1 100644 --- a/source/gameengine/GamePlayer/common/GPC_RawImage.cpp +++ b/source/gameengine/GamePlayer/common/GPC_RawImage.cpp @@ -33,10 +33,6 @@ #include "GPC_RawImage.h" #include "GPC_RawLogoArrays.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPC_RawImage::GPC_RawImage() : m_data(0), m_dataSize(0), m_width(0), m_height(0) diff --git a/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp b/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp index da25b689ad5..159a6f50776 100644 --- a/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp +++ b/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp @@ -30,10 +30,6 @@ #include "GPC_RawLoadDotBlendArray.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void GetRawLoadingAnimation(unsigned char **data, int *dataSize) { // create an array that will automatically be deleted when) diff --git a/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp b/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp index f6934b1b4d2..761e53cf1d3 100644 --- a/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp +++ b/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp @@ -30,10 +30,6 @@ #include "GPC_RawLogoArrays.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void GetRawBlenderLogo(unsigned char **data, int *width, int *height) { // create an array that will automatically be deleted when) diff --git a/source/gameengine/GamePlayer/common/GPC_System.cpp b/source/gameengine/GamePlayer/common/GPC_System.cpp index 77a1633ae82..36022bae9dd 100644 --- a/source/gameengine/GamePlayer/common/GPC_System.cpp +++ b/source/gameengine/GamePlayer/common/GPC_System.cpp @@ -32,10 +32,6 @@ #include "GPC_KeyboardDevice.h" #include "NG_NetworkDeviceInterface.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPC_System::GPC_System() // : m_ndi(0) { diff --git a/source/gameengine/GamePlayer/common/bmfont.cpp b/source/gameengine/GamePlayer/common/bmfont.cpp index afe20ca5e3a..3532eb81f87 100644 --- a/source/gameengine/GamePlayer/common/bmfont.cpp +++ b/source/gameengine/GamePlayer/common/bmfont.cpp @@ -58,10 +58,6 @@ #include "BKE_bmfont.h" #include "BKE_bmfont_types.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /*MAART: void printfGlyph(bmGlyph * glyph) { diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp b/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp index 130740f2aff..bb7b55fbcf1 100644 --- a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp +++ b/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp @@ -30,10 +30,6 @@ //#include #include "GPU_Canvas.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPU_Canvas::GPU_Canvas(KXH_plugin_handle p, int width, int height) : GPC_Canvas(width, height), m_plugin(p) { diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp b/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp index 6094b66764f..3eb7147bd98 100644 --- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp +++ b/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp @@ -49,10 +49,6 @@ #include "GPC_RenderTools.h" #include "GPC_RawImage.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void Redraw(GPU_Engine *engine); // -the- redraw function // callback functions diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.h b/source/gameengine/GamePlayer/common/unix/GPU_Engine.h index d5d8ffdb138..12fb70c84ef 100644 --- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.h +++ b/source/gameengine/GamePlayer/common/unix/GPU_Engine.h @@ -34,7 +34,7 @@ #include #include -#define Object DNA_Object // tricky stuff !!! but without it it doesn't compile... +#define Object DNA_Object // tricky stuff !!! but without it, it doesn't compile... #include "GPC_Engine.h" diff --git a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp index 570c1fc170d..5444cf22ac9 100644 --- a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp +++ b/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp @@ -67,7 +67,7 @@ GPU_KeyboardDevice::GPU_KeyboardDevice(void) (((int)SCA_IInputDevice::KX_ZEROKEY) + i - XK_0); } - for (i = XK_F1; i< XK_F12; i++) { + for (i = XK_F1; i< XK_F19; i++) { m_reverseKeyTranslateTable[i] = (SCA_IInputDevice::KX_EnumInputs) (((int)SCA_IInputDevice::KX_F1KEY) + i - XK_F1); diff --git a/source/gameengine/GamePlayer/common/unix/GPU_System.cpp b/source/gameengine/GamePlayer/common/unix/GPU_System.cpp index 7efe05972cd..8085ecb4380 100644 --- a/source/gameengine/GamePlayer/common/unix/GPU_System.cpp +++ b/source/gameengine/GamePlayer/common/unix/GPU_System.cpp @@ -30,10 +30,6 @@ #include #include "GPU_System.h" -#ifdef HAVE_CONFIG_H -#include -#endif - static struct timeval startTime; static int startTimeDone = 0; diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp b/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp index 44b53fb9dda..44437820bd2 100644 --- a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp +++ b/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp @@ -29,10 +29,6 @@ #include "GPW_Canvas.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPW_Canvas::GPW_Canvas(HWND hWnd, HDC hDC, int width, int height) : GPC_Canvas(width, height), m_hWnd(hWnd), m_hRC(0), m_hDC(hDC) { diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp b/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp index e2b2486fd43..f5e9f2e767c 100644 --- a/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp +++ b/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp @@ -44,10 +44,6 @@ #include "NG_NetworkScene.h" #include "NG_LoopBackNetworkDeviceInterface.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPW_Engine::GPW_Engine(char *customLoadingAnimationURL, int foregroundColor, int backgroundColor, int frameRate) : GPC_Engine(customLoadingAnimationURL, foregroundColor, backgroundColor, diff --git a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp index 5c5d590c2bc..7e8a50915c8 100644 --- a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp +++ b/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp @@ -29,10 +29,6 @@ #include "GPW_KeyboardDevice.h" -#ifdef HAVE_CONFIG_H -#include -#endif - // Key code values not found in winuser.h #ifndef VK_MINUS #define VK_MINUS 0xBD @@ -140,7 +136,14 @@ GPW_KeyboardDevice::GPW_KeyboardDevice(void) m_reverseKeyTranslateTable[VK_F9 ] = KX_F9KEY ; m_reverseKeyTranslateTable[VK_F10 ] = KX_F10KEY ; m_reverseKeyTranslateTable[VK_F11 ] = KX_F11KEY ; - m_reverseKeyTranslateTable[VK_F12 ] = KX_F12KEY ; + m_reverseKeyTranslateTable[VK_F12 ] = KX_F12KEY ; + m_reverseKeyTranslateTable[VK_F13 ] = KX_F13KEY ; + m_reverseKeyTranslateTable[VK_F14 ] = KX_F14KEY ; + m_reverseKeyTranslateTable[VK_F15 ] = KX_F15KEY ; + m_reverseKeyTranslateTable[VK_F16 ] = KX_F16KEY ; + m_reverseKeyTranslateTable[VK_F17 ] = KX_F17KEY ; + m_reverseKeyTranslateTable[VK_F18 ] = KX_F18KEY ; + m_reverseKeyTranslateTable[VK_F19 ] = KX_F19KEY ; // Numpad keys m_reverseKeyTranslateTable[VK_NUMPAD0 ] = KX_PAD0 ; diff --git a/source/gameengine/GamePlayer/common/windows/GPW_System.cpp b/source/gameengine/GamePlayer/common/windows/GPW_System.cpp index b1dd5afaa6d..4f4a48a52f1 100644 --- a/source/gameengine/GamePlayer/common/windows/GPW_System.cpp +++ b/source/gameengine/GamePlayer/common/windows/GPW_System.cpp @@ -31,10 +31,6 @@ #include #include "GPW_System.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPW_System::GPW_System(void) { m_freq = 0; diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp index 43b26cf9a06..71507642226 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp @@ -28,10 +28,6 @@ * GHOST Blender Player application implementation file. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable:4786) // suppress stl-MSVC debug info warning #include @@ -677,7 +673,8 @@ bool GPG_Application::startEngine(void) m_mouse, m_networkdevice, startscenename, - m_startScene); + m_startScene, + m_canvas); #ifndef DISABLE_PYTHON // some python things @@ -797,10 +794,7 @@ void GPG_Application::exitEngine() m_canvas = 0; } - libtiff_exit(); -#ifdef WITH_QUICKTIME - quicktime_exit(); -#endif + IMB_exit(); GPU_extensions_exit(); m_exitRequested = 0; diff --git a/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp b/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp index 0a96fbbe503..24c0102a87c 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp @@ -31,10 +31,6 @@ #include #include "GHOST_ISystem.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPG_Canvas::GPG_Canvas(GHOST_IWindow* window) : GPC_Canvas(0, 0), m_window(window) { @@ -79,6 +75,8 @@ void GPG_Canvas::SetMousePosition(int x, int y) void GPG_Canvas::SetMouseState(RAS_MouseState mousestate) { + m_mousestate = mousestate; + if (m_window) { switch (mousestate) @@ -106,3 +104,13 @@ void GPG_Canvas::SwapBuffers() m_window->swapBuffers(); } } + +float GPG_Canvas::GetMouseNormalizedX(int x) +{ + return float(x)/this->GetWidth(); +} + +float GPG_Canvas::GetMouseNormalizedY(int y) +{ + return float(y)/this->GetHeight(); +} diff --git a/source/gameengine/GamePlayer/ghost/GPG_Canvas.h b/source/gameengine/GamePlayer/ghost/GPG_Canvas.h index 18e58691d2c..7b19c03d3c3 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Canvas.h +++ b/source/gameengine/GamePlayer/ghost/GPG_Canvas.h @@ -53,6 +53,10 @@ public: virtual void SetMousePosition(int x, int y); virtual void SetMouseState(RAS_MouseState mousestate); virtual void SwapBuffers(); + virtual int GetMouseX(int x){return x;}; + virtual int GetMouseY(int y){return y;}; + virtual float GetMouseNormalizedX(int x); + virtual float GetMouseNormalizedY(int y); bool BeginDraw() { return true;}; void EndDraw() {}; diff --git a/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp b/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp index 243322b715d..2e9810ad0ae 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp @@ -30,10 +30,6 @@ #include "GPG_KeyboardDevice.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPG_KeyboardDevice::GPG_KeyboardDevice(void) { m_reverseKeyTranslateTable[GHOST_kKeyA ] = KX_AKEY ; @@ -101,7 +97,15 @@ GPG_KeyboardDevice::GPG_KeyboardDevice(void) m_reverseKeyTranslateTable[GHOST_kKeyF9 ] = KX_F9KEY ; m_reverseKeyTranslateTable[GHOST_kKeyF10 ] = KX_F10KEY ; m_reverseKeyTranslateTable[GHOST_kKeyF11 ] = KX_F11KEY ; - m_reverseKeyTranslateTable[GHOST_kKeyF12 ] = KX_F12KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF12 ] = KX_F12KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF13 ] = KX_F13KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF14 ] = KX_F14KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF15 ] = KX_F15KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF16 ] = KX_F16KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF17 ] = KX_F17KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF18 ] = KX_F18KEY ; + m_reverseKeyTranslateTable[GHOST_kKeyF19 ] = KX_F19KEY ; + // Numpad keys m_reverseKeyTranslateTable[GHOST_kKeyNumpad0 ] = KX_PAD0 ; diff --git a/source/gameengine/GamePlayer/ghost/GPG_System.cpp b/source/gameengine/GamePlayer/ghost/GPG_System.cpp index d57b90dfff1..94756ec4ed5 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_System.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_System.cpp @@ -32,10 +32,6 @@ #include #include "GHOST_ISystem.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GPG_System::GPG_System(GHOST_ISystem* system) : m_system(system) { diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp index 95370beeeb3..b7ed8666325 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp @@ -376,11 +376,7 @@ int main(int argc, char** argv) GEN_init_messaging_system(); -#ifdef WITH_QUICKTIME - quicktime_init(); -#endif - - libtiff_init(); + IMB_init(); // Parse command line options #ifndef NDEBUG @@ -681,7 +677,7 @@ int main(int argc, char** argv) get_filename(argc_py_clamped, argv, filename); if(filename[0]) - BLI_convertstringcwd(filename); + BLI_path_cwd(filename); do { @@ -695,7 +691,7 @@ int main(int argc, char** argv) // base the actuator filename relative to the last file strcpy(basedpath, exitstring.Ptr()); - BLI_convertstringcode(basedpath, pathname); + BLI_path_abs(basedpath, pathname); bfd = load_game_data(basedpath); @@ -706,7 +702,7 @@ int main(int argc, char** argv) strcpy(temppath, "//"); strcat(temppath, basedpath); - BLI_convertstringcode(temppath, pathname); + BLI_path_abs(temppath, pathname); bfd = load_game_data(temppath); } } diff --git a/source/gameengine/Ketsji/BL_BlenderShader.h b/source/gameengine/Ketsji/BL_BlenderShader.h index 073ce8f1ca5..c2d4245b77f 100644 --- a/source/gameengine/Ketsji/BL_BlenderShader.h +++ b/source/gameengine/Ketsji/BL_BlenderShader.h @@ -56,12 +56,19 @@ public: void ReloadMaterial(); int GetBlendMode(); + void SetScene(KX_Scene *scene) + { + mScene = scene; + mBlenderScene = scene->GetBlenderScene(); + ReloadMaterial(); + } + bool Equals(BL_BlenderShader *blshader); #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderShader"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderShader"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h index 6b53e7fa8b1..62e5a6e638b 100644 --- a/source/gameengine/Ketsji/BL_Material.h +++ b/source/gameengine/Ketsji/BL_Material.h @@ -106,7 +106,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Material"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Material"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp index 55be606378d..8edefe7ac2d 100644 --- a/source/gameengine/Ketsji/BL_Shader.cpp +++ b/source/gameengine/Ketsji/BL_Shader.cpp @@ -884,7 +884,7 @@ KX_PYMETHODDEF_DOC( BL_Shader, setSampler, "setSampler(name, index)" ) { int loc = GetUniformLocation(uniform); if(loc != -1) { - if(index >= MAXTEX && index < 0) + if(index >= MAXTEX || index < 0) spit("Invalid texture sample index: " << index); #ifdef SORT_UNIFORMS diff --git a/source/gameengine/Ketsji/BL_Shader.h b/source/gameengine/Ketsji/BL_Shader.h index ebd2e491f35..5108acea0ff 100644 --- a/source/gameengine/Ketsji/BL_Shader.h +++ b/source/gameengine/Ketsji/BL_Shader.h @@ -28,7 +28,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Sampler"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Sampler"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -75,7 +75,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Uniform"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Uniform"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -100,7 +100,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_DefUniform"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_DefUniform"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/BL_Texture.h b/source/gameengine/Ketsji/BL_Texture.h index 2dfd9c542d3..eb3888b4862 100644 --- a/source/gameengine/Ketsji/BL_Texture.h +++ b/source/gameengine/Ketsji/BL_Texture.h @@ -70,7 +70,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Texture"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Texture"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp index bc4c18ff795..d922fb63b4f 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp @@ -39,10 +39,6 @@ #include "NG_NetworkMessage.h" #include "NG_NetworkObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_NetworkEventManager::KX_NetworkEventManager(class SCA_LogicManager* logicmgr, class NG_NetworkDeviceInterface *ndi) : SCA_EventManager(logicmgr, NETWORK_EVENTMGR), m_ndi(ndi) diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp index a9b56836fa9..e047a9aa273 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp @@ -31,10 +31,6 @@ #include "NG_NetworkScene.h" #include "KX_NetworkMessageActuator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_NetworkMessageActuator::KX_NetworkMessageActuator( SCA_IObject* gameobj, // the actuator controlling object NG_NetworkScene* networkscene, // needed for replication diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp index ef9f4d33a28..56ccac9a93e 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp @@ -38,10 +38,6 @@ #include "ListValue.h" #include "StringValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef NAN_NET_DEBUG #include #endif diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp index 948821b157b..5350c32fff7 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp @@ -26,7 +26,3 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp index f3898fc7bd4..aca0805c337 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp @@ -27,7 +27,3 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - diff --git a/source/gameengine/Ketsji/KX_ArmatureSensor.cpp b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp index 203b7f9b5c9..ba029d7c279 100644 --- a/source/gameengine/Ketsji/KX_ArmatureSensor.cpp +++ b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp @@ -39,10 +39,6 @@ #include "SCA_EventManager.h" #include "SCA_LogicManager.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_ArmatureSensor::KX_ArmatureSensor(class SCA_EventManager* eventmgr, SCA_IObject* gameobj, const char *posechannel, diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index bab7c54a310..2ef7e55429f 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -2,10 +2,6 @@ // ------------------------------------ // ... // ------------------------------------ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "GL/glew.h" #include "KX_BlenderMaterial.h" diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h index c5f5e23c6e7..5bf62ff6b7c 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.h +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h @@ -88,7 +88,11 @@ public: virtual void Replace_IScene(SCA_IScene *val) { - mScene= static_cast(val); + if (mBlenderShader) + { + mScene= static_cast(val); + mBlenderShader->SetScene(mScene); + } }; #ifndef DISABLE_PYTHON diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h index 7fc799abb7e..48a3c98ff81 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h @@ -83,7 +83,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BulletPhysicsController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BulletPhysicsController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp index 42d35798095..82786456589 100644 --- a/source/gameengine/Ketsji/KX_Camera.cpp +++ b/source/gameengine/Ketsji/KX_Camera.cpp @@ -34,10 +34,6 @@ #include "KX_PythonInit.h" #include "KX_Python.h" #include "KX_PyMath.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_Camera::KX_Camera(void* sgReplicationInfo, SG_Callbacks callbacks, const RAS_CameraData& camdata, @@ -503,6 +499,7 @@ PyAttributeDef KX_Camera::Attributes[] = { KX_PYATTRIBUTE_RW_FUNCTION("perspective", KX_Camera, pyattr_get_perspective, pyattr_set_perspective), KX_PYATTRIBUTE_RW_FUNCTION("lens", KX_Camera, pyattr_get_lens, pyattr_set_lens), + KX_PYATTRIBUTE_RW_FUNCTION("ortho_scale", KX_Camera, pyattr_get_ortho_scale, pyattr_set_ortho_scale), KX_PYATTRIBUTE_RW_FUNCTION("near", KX_Camera, pyattr_get_near, pyattr_set_near), KX_PYATTRIBUTE_RW_FUNCTION("far", KX_Camera, pyattr_get_far, pyattr_set_far), @@ -732,6 +729,26 @@ int KX_Camera::pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, return PY_SET_ATTR_SUCCESS; } +PyObject* KX_Camera::pyattr_get_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Camera* self= static_cast(self_v); + return PyFloat_FromDouble(self->m_camdata.m_scale); +} + +int KX_Camera::pyattr_set_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_Camera* self= static_cast(self_v); + float param = PyFloat_AsDouble(value); + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "camera.scale = float: KX_Camera, expected a float greater then zero"); + return PY_SET_ATTR_FAIL; + } + + self->m_camdata.m_scale= param; + self->m_set_projection_matrix = false; + return PY_SET_ATTR_SUCCESS; +} + PyObject* KX_Camera::pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) { KX_Camera* self= static_cast(self_v); diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h index e209f0461b9..406ee1d0764 100644 --- a/source/gameengine/Ketsji/KX_Camera.h +++ b/source/gameengine/Ketsji/KX_Camera.h @@ -289,6 +289,8 @@ public: static PyObject* pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp index f9ec503478c..bc67ecbe1a5 100644 --- a/source/gameengine/Ketsji/KX_CameraActuator.cpp +++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp @@ -38,10 +38,6 @@ #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ @@ -380,7 +376,7 @@ PyTypeObject KX_CameraActuator::Type = { }; PyMethodDef KX_CameraActuator::Methods[] = { - {NULL,NULL,NULL,NULL} //Sentinel + {NULL, NULL} //Sentinel }; PyAttributeDef KX_CameraActuator::Attributes[] = { diff --git a/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp b/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp index 6ae9bbc0931..0bfa1133a1c 100644 --- a/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp +++ b/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp @@ -31,10 +31,6 @@ #include "KX_Camera.h" #include "RAS_CameraData.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(_WIN64) typedef unsigned __int64 uint_ptr; #else diff --git a/source/gameengine/Ketsji/KX_CameraIpoSGController.h b/source/gameengine/Ketsji/KX_CameraIpoSGController.h index 3690043f4a9..e6596edbd1d 100644 --- a/source/gameengine/Ketsji/KX_CameraIpoSGController.h +++ b/source/gameengine/Ketsji/KX_CameraIpoSGController.h @@ -88,7 +88,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_CameraIpoSGController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_CameraIpoSGController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ClientObjectInfo.h b/source/gameengine/Ketsji/KX_ClientObjectInfo.h index f08988c842a..c42843274b3 100644 --- a/source/gameengine/Ketsji/KX_ClientObjectInfo.h +++ b/source/gameengine/Ketsji/KX_ClientObjectInfo.h @@ -78,7 +78,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ClientObjectInfo"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ClientObjectInfo"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp index 3ef689ec94f..9380f4b5d2f 100644 --- a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp +++ b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp @@ -40,10 +40,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp index de6530bf54a..8af6e63f343 100644 --- a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp +++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp @@ -31,10 +31,6 @@ #include "KX_ConstraintWrapper.h" #include "PHY_IPhysicsEnvironment.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_ConstraintWrapper::KX_ConstraintWrapper( PHY_ConstraintType ctype, int constraintId, diff --git a/source/gameengine/Ketsji/KX_Dome.h b/source/gameengine/Ketsji/KX_Dome.h index 9ff33fe2852..749fbebe61c 100644 --- a/source/gameengine/Ketsji/KX_Dome.h +++ b/source/gameengine/Ketsji/KX_Dome.h @@ -188,7 +188,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_Dome"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_Dome"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_EmptyObject.cpp b/source/gameengine/Ketsji/KX_EmptyObject.cpp index 61179b29e10..7dc66b3fb88 100644 --- a/source/gameengine/Ketsji/KX_EmptyObject.cpp +++ b/source/gameengine/Ketsji/KX_EmptyObject.cpp @@ -28,10 +28,6 @@ */ #include "KX_EmptyObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_EmptyObject::~KX_EmptyObject() { diff --git a/source/gameengine/Ketsji/KX_EmptyObject.h b/source/gameengine/Ketsji/KX_EmptyObject.h index c82c2ec1657..c41e40fdd41 100644 --- a/source/gameengine/Ketsji/KX_EmptyObject.h +++ b/source/gameengine/Ketsji/KX_EmptyObject.h @@ -41,7 +41,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_EmptyObject"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_EmptyObject"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_GameActuator.cpp b/source/gameengine/Ketsji/KX_GameActuator.cpp index b7c9ce6d452..208c526398a 100644 --- a/source/gameengine/Ketsji/KX_GameActuator.cpp +++ b/source/gameengine/Ketsji/KX_GameActuator.cpp @@ -39,10 +39,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 744dc85b9cc..ecfacb8f9bb 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -28,10 +28,6 @@ * Game object wrapper */ -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(_WIN64) typedef unsigned __int64 uint_ptr; #else @@ -234,7 +230,12 @@ KX_GameObject* KX_GameObject::GetParent() void KX_GameObject::SetParent(KX_Scene *scene, KX_GameObject* obj, bool addToCompound, bool ghost) { // check on valid node in case a python controller holds a reference to a deleted object - if (obj && GetSGNode() && obj->GetSGNode() && GetSGNode()->GetSGParent() != obj->GetSGNode()) + if (obj && + GetSGNode() && // object is not zombi + obj->GetSGNode() && // object is not zombi + GetSGNode()->GetSGParent() != obj->GetSGNode() && // not already parented to same object + !GetSGNode()->IsAncessor(obj->GetSGNode()) && // no parenting loop + this != obj) // not the object itself { // Make sure the objects have some scale MT_Vector3 scale1 = NodeGetWorldScaling(); @@ -1251,56 +1252,56 @@ void KX_GameObject::Relink(GEN_Map *map_parameter) static int mathutils_kxgameob_vector_cb_index= -1; /* index for our callbacks */ -static int mathutils_kxgameob_generic_check(PyObject *self_v) +static int mathutils_kxgameob_generic_check(BaseMathObject *bmo) { - KX_GameObject* self= static_castBGE_PROXY_REF(self_v); + KX_GameObject* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; return 1; } -static int mathutils_kxgameob_vector_get(PyObject *self_v, int subtype, float *vec_from) +static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype) { - KX_GameObject* self= static_castBGE_PROXY_REF(self_v); + KX_GameObject* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; switch(subtype) { case MATHUTILS_VEC_CB_POS_LOCAL: - self->NodeGetLocalPosition().getValue(vec_from); + self->NodeGetLocalPosition().getValue(bmo->data); break; case MATHUTILS_VEC_CB_POS_GLOBAL: - self->NodeGetWorldPosition().getValue(vec_from); + self->NodeGetWorldPosition().getValue(bmo->data); break; case MATHUTILS_VEC_CB_SCALE_LOCAL: - self->NodeGetLocalScaling().getValue(vec_from); + self->NodeGetLocalScaling().getValue(bmo->data); break; case MATHUTILS_VEC_CB_SCALE_GLOBAL: - self->NodeGetWorldScaling().getValue(vec_from); + self->NodeGetWorldScaling().getValue(bmo->data); break; case MATHUTILS_VEC_CB_INERTIA_LOCAL: if(!self->GetPhysicsController()) return 0; - self->GetPhysicsController()->GetLocalInertia().getValue(vec_from); + self->GetPhysicsController()->GetLocalInertia().getValue(bmo->data); break; case MATHUTILS_VEC_CB_OBJECT_COLOR: - self->GetObjectColor().getValue(vec_from); + self->GetObjectColor().getValue(bmo->data); break; case MATHUTILS_VEC_CB_LINVEL_LOCAL: if(!self->GetPhysicsController()) return 0; - self->GetLinearVelocity(true).getValue(vec_from); + self->GetLinearVelocity(true).getValue(bmo->data); break; case MATHUTILS_VEC_CB_LINVEL_GLOBAL: if(!self->GetPhysicsController()) return 0; - self->GetLinearVelocity(false).getValue(vec_from); + self->GetLinearVelocity(false).getValue(bmo->data); break; case MATHUTILS_VEC_CB_ANGVEL_LOCAL: if(!self->GetPhysicsController()) return 0; - self->GetAngularVelocity(true).getValue(vec_from); + self->GetAngularVelocity(true).getValue(bmo->data); break; case MATHUTILS_VEC_CB_ANGVEL_GLOBAL: if(!self->GetPhysicsController()) return 0; - self->GetAngularVelocity(false).getValue(vec_from); + self->GetAngularVelocity(false).getValue(bmo->data); break; } @@ -1308,73 +1309,69 @@ static int mathutils_kxgameob_vector_get(PyObject *self_v, int subtype, float *v return 1; } -static int mathutils_kxgameob_vector_set(PyObject *self_v, int subtype, float *vec_to) +static int mathutils_kxgameob_vector_set(BaseMathObject *bmo, int subtype) { - KX_GameObject* self= static_castBGE_PROXY_REF(self_v); + KX_GameObject* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; switch(subtype) { case MATHUTILS_VEC_CB_POS_LOCAL: - self->NodeSetLocalPosition(MT_Point3(vec_to)); + self->NodeSetLocalPosition(MT_Point3(bmo->data)); self->NodeUpdateGS(0.f); break; case MATHUTILS_VEC_CB_POS_GLOBAL: - self->NodeSetWorldPosition(MT_Point3(vec_to)); + self->NodeSetWorldPosition(MT_Point3(bmo->data)); self->NodeUpdateGS(0.f); break; case MATHUTILS_VEC_CB_SCALE_LOCAL: - self->NodeSetLocalScale(MT_Point3(vec_to)); + self->NodeSetLocalScale(MT_Point3(bmo->data)); self->NodeUpdateGS(0.f); break; case MATHUTILS_VEC_CB_SCALE_GLOBAL: - break; + PyErr_SetString(PyExc_AttributeError, "KX_GameObject.worldScale is read-only"); + return 0; case MATHUTILS_VEC_CB_INERTIA_LOCAL: /* read only */ break; case MATHUTILS_VEC_CB_OBJECT_COLOR: - self->SetObjectColor(MT_Vector4(vec_to)); + self->SetObjectColor(MT_Vector4(bmo->data)); break; case MATHUTILS_VEC_CB_LINVEL_LOCAL: - self->setLinearVelocity(MT_Point3(vec_to),true); + self->setLinearVelocity(MT_Point3(bmo->data),true); break; case MATHUTILS_VEC_CB_LINVEL_GLOBAL: - self->setLinearVelocity(MT_Point3(vec_to),false); + self->setLinearVelocity(MT_Point3(bmo->data),false); break; case MATHUTILS_VEC_CB_ANGVEL_LOCAL: - self->setAngularVelocity(MT_Point3(vec_to),true); + self->setAngularVelocity(MT_Point3(bmo->data),true); break; case MATHUTILS_VEC_CB_ANGVEL_GLOBAL: - self->setAngularVelocity(MT_Point3(vec_to),false); + self->setAngularVelocity(MT_Point3(bmo->data),false); break; } return 1; } -static int mathutils_kxgameob_vector_get_index(PyObject *self_v, int subtype, float *vec_from, int index) +static int mathutils_kxgameob_vector_get_index(BaseMathObject *bmo, int subtype, int index) { - float f[4]; /* lazy, avoid repeteing the case statement */ - if(!mathutils_kxgameob_vector_get(self_v, subtype, f)) + if(!mathutils_kxgameob_vector_get(bmo, subtype)) return 0; - - vec_from[index]= f[index]; return 1; } -static int mathutils_kxgameob_vector_set_index(PyObject *self_v, int subtype, float *vec_to, int index) +static int mathutils_kxgameob_vector_set_index(BaseMathObject *bmo, int subtype, int index) { - float f= vec_to[index]; + float f= bmo->data[index]; /* lazy, avoid repeteing the case statement */ - if(!mathutils_kxgameob_vector_get(self_v, subtype, vec_to)) + if(!mathutils_kxgameob_vector_get(bmo, subtype)) return 0; - vec_to[index]= f; - mathutils_kxgameob_vector_set(self_v, subtype, vec_to); - - return 1; + bmo->data[index]= f; + return mathutils_kxgameob_vector_set(bmo, subtype); } Mathutils_Callback mathutils_kxgameob_vector_cb = { @@ -1391,18 +1388,18 @@ Mathutils_Callback mathutils_kxgameob_vector_cb = { static int mathutils_kxgameob_matrix_cb_index= -1; /* index for our callbacks */ -static int mathutils_kxgameob_matrix_get(PyObject *self_v, int subtype, float *mat_from) +static int mathutils_kxgameob_matrix_get(BaseMathObject *bmo, int subtype) { - KX_GameObject* self= static_castBGE_PROXY_REF(self_v); + KX_GameObject* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; - + switch(subtype) { case MATHUTILS_MAT_CB_ORI_LOCAL: - self->NodeGetLocalOrientation().getValue3x3(mat_from); + self->NodeGetLocalOrientation().getValue3x3(bmo->data); break; case MATHUTILS_MAT_CB_ORI_GLOBAL: - self->NodeGetWorldOrientation().getValue3x3(mat_from); + self->NodeGetWorldOrientation().getValue3x3(bmo->data); break; } @@ -1410,21 +1407,21 @@ static int mathutils_kxgameob_matrix_get(PyObject *self_v, int subtype, float *m } -static int mathutils_kxgameob_matrix_set(PyObject *self_v, int subtype, float *mat_to) +static int mathutils_kxgameob_matrix_set(BaseMathObject *bmo, int subtype) { - KX_GameObject* self= static_castBGE_PROXY_REF(self_v); + KX_GameObject* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; MT_Matrix3x3 mat3x3; switch(subtype) { case MATHUTILS_MAT_CB_ORI_LOCAL: - mat3x3.setValue3x3(mat_to); + mat3x3.setValue3x3(bmo->data); self->NodeSetLocalOrientation(mat3x3); self->NodeUpdateGS(0.f); break; case MATHUTILS_MAT_CB_ORI_GLOBAL: - mat3x3.setValue3x3(mat_to); + mat3x3.setValue3x3(bmo->data); self->NodeSetLocalOrientation(mat3x3); self->NodeUpdateGS(0.f); break; @@ -1741,6 +1738,8 @@ PySequenceMethods KX_GameObject::Sequence = { NULL, /* sq_ass_item */ NULL, /* sq_ass_slice */ (objobjproc)Seq_Contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; PyTypeObject KX_GameObject::Type = { @@ -2735,7 +2734,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCastTo, KX_RayCast::Callback callback(this,spc); KX_RayCast::RayTest(pe, fromPoint, toPoint, callback); - if (m_pHitObject) + if (m_pHitObject) return m_pHitObject->GetProxy(); Py_RETURN_NONE; diff --git a/source/gameengine/Ketsji/KX_IInterpolator.h b/source/gameengine/Ketsji/KX_IInterpolator.h index b08a2368e5b..aadc964fe49 100644 --- a/source/gameengine/Ketsji/KX_IInterpolator.h +++ b/source/gameengine/Ketsji/KX_IInterpolator.h @@ -44,7 +44,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_IPO_SGController.cpp b/source/gameengine/Ketsji/KX_IPO_SGController.cpp index c174e34ae7d..1d4c64483f5 100644 --- a/source/gameengine/Ketsji/KX_IPO_SGController.cpp +++ b/source/gameengine/Ketsji/KX_IPO_SGController.cpp @@ -28,10 +28,6 @@ * Scenegraph controller for ipos. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(_WIN64) typedef unsigned __int64 uint_ptr; #else diff --git a/source/gameengine/Ketsji/KX_IPO_SGController.h b/source/gameengine/Ketsji/KX_IPO_SGController.h index 3841cae88da..12803cde2f1 100644 --- a/source/gameengine/Ketsji/KX_IPO_SGController.h +++ b/source/gameengine/Ketsji/KX_IPO_SGController.h @@ -119,7 +119,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IpoSGController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IpoSGController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.cpp b/source/gameengine/Ketsji/KX_IPhysicsController.cpp index 07b73a5d245..18816e92bbb 100644 --- a/source/gameengine/Ketsji/KX_IPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_IPhysicsController.cpp @@ -29,10 +29,6 @@ */ #include "KX_IPhysicsController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #include "PHY_DynamicTypes.h" KX_IPhysicsController::KX_IPhysicsController(bool dyna, bool sensor, bool compound, void* userdata) diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h index faab46c0673..288e779fee4 100644 --- a/source/gameengine/Ketsji/KX_IPhysicsController.h +++ b/source/gameengine/Ketsji/KX_IPhysicsController.h @@ -130,7 +130,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IPhysicsController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IPhysicsController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_IScalarInterpolator.h b/source/gameengine/Ketsji/KX_IScalarInterpolator.h index 43e07d69611..a84e1b570fd 100644 --- a/source/gameengine/Ketsji/KX_IScalarInterpolator.h +++ b/source/gameengine/Ketsji/KX_IScalarInterpolator.h @@ -42,7 +42,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IScalarInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IScalarInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ISceneConverter.h b/source/gameengine/Ketsji/KX_ISceneConverter.h index d4081daa2c4..8a11b875347 100644 --- a/source/gameengine/Ketsji/KX_ISceneConverter.h +++ b/source/gameengine/Ketsji/KX_ISceneConverter.h @@ -87,7 +87,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ISceneConverter"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ISceneConverter"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ISystem.h b/source/gameengine/Ketsji/KX_ISystem.h index 027e6348729..fb019299135 100644 --- a/source/gameengine/Ketsji/KX_ISystem.h +++ b/source/gameengine/Ketsji/KX_ISystem.h @@ -55,7 +55,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ISystem"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ISystem"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp index 6d17dc45651..eca40cafb0e 100644 --- a/source/gameengine/Ketsji/KX_IpoActuator.cpp +++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp @@ -39,10 +39,6 @@ #include "KX_GameObject.h" #include "FloatValue.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #include "KX_KetsjiEngine.h" /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index d1fecb76998..71cd8b36045 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -285,6 +285,7 @@ void KX_KetsjiEngine::RenderDome() return; KX_SceneList::iterator sceneit; + KX_Scene* scene; int n_renders=m_dome->GetNumberRenders();// usually 4 or 6 for (int i=0;iGetActiveCamera(); m_rendertools->BeginFrame(m_rasterizer); @@ -368,6 +369,10 @@ void KX_KetsjiEngine::RenderDome() ); } m_dome->Draw(); + // Draw Callback for the last scene +#ifndef DISABLE_PYTHON + scene->RunDrawingCallbacks(scene->GetPostDrawCB()); +#endif EndFrame(); } @@ -1309,8 +1314,10 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam) m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true); SG_SetActiveStage(SG_STAGE_RENDER); +#ifndef DISABLE_PYTHON // Run any pre-drawing python callbacks scene->RunDrawingCallbacks(scene->GetPreDrawCB()); +#endif scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools); @@ -1324,7 +1331,9 @@ void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene) { m_rendertools->MotionBlur(m_rasterizer); scene->Render2DFilters(m_canvas); +#ifndef DISABLE_PYTHON scene->RunDrawingCallbacks(scene->GetPostDrawCB()); +#endif m_rasterizer->FlushDebugLines(); } @@ -1617,7 +1626,8 @@ KX_Scene* KX_KetsjiEngine::CreateScene(Scene *scene) m_mousedevice, m_networkdevice, scene->id.name+2, - scene); + scene, + m_canvas); m_sceneconverter->ConvertScene(tmpscene, m_rendertools, diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h index 36db8685afb..0a461a8b63e 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.h +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h @@ -213,6 +213,8 @@ public: RAS_IRasterizer* GetRasterizer(){return m_rasterizer;}; RAS_ICanvas* GetCanvas(){return m_canvas;}; RAS_IRenderTools* GetRenderTools(){return m_rendertools;}; + SCA_IInputDevice* GetKeyboardDevice(){return m_keyboarddevice;}; + SCA_IInputDevice* GetMouseDevice(){return m_mousedevice;}; /// Dome functions void InitDome(short res, short mode, short angle, float resbuf, short tilt, struct Text* text); @@ -410,7 +412,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_KetsjiEngine"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_KetsjiEngine"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp index db708d25d40..6ef4b873ead 100644 --- a/source/gameengine/Ketsji/KX_Light.cpp +++ b/source/gameengine/Ketsji/KX_Light.cpp @@ -26,10 +26,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable : 4786) @@ -352,6 +348,11 @@ PyObject* KX_LightObject::pyattr_get_typeconst(void *self_v, const KX_PYATTRIBUT } else if (!strcmp(type, "NORMAL")) { retvalue = PyLong_FromSsize_t(RAS_LightObject::LIGHT_NORMAL); } + else { + /* should never happen */ + PyErr_SetString(PyExc_TypeError, "light.type: internal error, invalid light type"); + retvalue = NULL; + } return retvalue; } diff --git a/source/gameengine/Ketsji/KX_Light.h b/source/gameengine/Ketsji/KX_Light.h index c31f33f26ae..334aed1995d 100644 --- a/source/gameengine/Ketsji/KX_Light.h +++ b/source/gameengine/Ketsji/KX_Light.h @@ -65,6 +65,8 @@ public: void UnbindShadowBuffer(class RAS_IRasterizer *ras); void Update(); + void UpdateScene(class KX_Scene *kxscene) {m_lightobj.m_scene = (void*)kxscene;} + virtual int GetGameObjectType() { return OBJ_LIGHT; } #ifndef DISABLE_PYTHON diff --git a/source/gameengine/Ketsji/KX_LightIpoSGController.cpp b/source/gameengine/Ketsji/KX_LightIpoSGController.cpp index 9eae2590308..3a010556cfe 100644 --- a/source/gameengine/Ketsji/KX_LightIpoSGController.cpp +++ b/source/gameengine/Ketsji/KX_LightIpoSGController.cpp @@ -31,10 +31,6 @@ #include "KX_Light.h" #include "RAS_LightObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(_WIN64) typedef unsigned __int64 uint_ptr; #else diff --git a/source/gameengine/Ketsji/KX_LightIpoSGController.h b/source/gameengine/Ketsji/KX_LightIpoSGController.h index 97034d34429..c857994d145 100644 --- a/source/gameengine/Ketsji/KX_LightIpoSGController.h +++ b/source/gameengine/Ketsji/KX_LightIpoSGController.h @@ -96,7 +96,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_LightIpoSGController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_LightIpoSGController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_MaterialIpoController.cpp b/source/gameengine/Ketsji/KX_MaterialIpoController.cpp index 85d514bd22f..13d272ee92d 100644 --- a/source/gameengine/Ketsji/KX_MaterialIpoController.cpp +++ b/source/gameengine/Ketsji/KX_MaterialIpoController.cpp @@ -5,10 +5,6 @@ #include "BLO_sys_types.h" // for intptr_t support -#ifdef HAVE_CONFIG_H -#include -#endif - bool KX_MaterialIpoController::Update(double currentTime) { if (m_modified) diff --git a/source/gameengine/Ketsji/KX_MaterialIpoController.h b/source/gameengine/Ketsji/KX_MaterialIpoController.h index 906c12426eb..a979f59ec95 100644 --- a/source/gameengine/Ketsji/KX_MaterialIpoController.h +++ b/source/gameengine/Ketsji/KX_MaterialIpoController.h @@ -54,7 +54,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_MaterialIpoController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_MaterialIpoController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp index 1cea0f88a24..a5ff7ebcbc1 100644 --- a/source/gameengine/Ketsji/KX_MeshProxy.cpp +++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp @@ -28,10 +28,6 @@ #ifndef DISABLE_PYTHON -#ifdef HAVE_CONFIG_H -#include -#endif - #include "KX_MeshProxy.h" #include "RAS_IPolygonMaterial.h" #include "RAS_MeshObject.h" diff --git a/source/gameengine/Ketsji/KX_MotionState.cpp b/source/gameengine/Ketsji/KX_MotionState.cpp index 57ef8e105a4..08f8ee556d1 100644 --- a/source/gameengine/Ketsji/KX_MotionState.cpp +++ b/source/gameengine/Ketsji/KX_MotionState.cpp @@ -29,10 +29,6 @@ #include "KX_MotionState.h" #include "SG_Spatial.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_MotionState::KX_MotionState(SG_Spatial* node) : m_node(node) { diff --git a/source/gameengine/Ketsji/KX_MotionState.h b/source/gameengine/Ketsji/KX_MotionState.h index 80bdd8bca48..1267abc7fa9 100644 --- a/source/gameengine/Ketsji/KX_MotionState.h +++ b/source/gameengine/Ketsji/KX_MotionState.h @@ -55,7 +55,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_MotionState"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_MotionState"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp index a166f54d37b..36c1b0f5bd1 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.cpp +++ b/source/gameengine/Ketsji/KX_NearSensor.cpp @@ -38,9 +38,6 @@ #include "PHY_IPhysicsController.h" #include "PHY_IMotionState.h" -#ifdef HAVE_CONFIG_H -#include -#endif KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr, KX_GameObject* gameobj, float margin, diff --git a/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp b/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp index 69ed7d80744..108cff0232d 100644 --- a/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp +++ b/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp @@ -30,10 +30,6 @@ #include "KX_ScalarInterpolator.h" #include "KX_GameObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(_WIN64) typedef unsigned __int64 uint_ptr; #else diff --git a/source/gameengine/Ketsji/KX_ObColorIpoSGController.h b/source/gameengine/Ketsji/KX_ObColorIpoSGController.h index fd8de7a70d0..4bb18fb392b 100644 --- a/source/gameengine/Ketsji/KX_ObColorIpoSGController.h +++ b/source/gameengine/Ketsji/KX_ObColorIpoSGController.h @@ -71,7 +71,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ObColorIpoSGController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ObColorIpoSGController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp index df98d58b4e8..0d0cac3c084 100644 --- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp @@ -34,10 +34,6 @@ #include "KX_PyMath.h" // For PyVecTo - should this include be put in PyObjectPlus? #include "KX_IPhysicsController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ @@ -387,74 +383,69 @@ PyAttributeDef KX_ObjectActuator::Attributes[] = { static int mathutils_kxobactu_vector_cb_index= -1; /* index for our callbacks */ -static int mathutils_obactu_generic_check(PyObject *self_v) +static int mathutils_obactu_generic_check(BaseMathObject *bmo) { - KX_ObjectActuator* self= static_castBGE_PROXY_REF(self_v); + KX_ObjectActuator* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; return 1; } -static int mathutils_obactu_vector_get(PyObject *self_v, int subtype, float *vec_from) +static int mathutils_obactu_vector_get(BaseMathObject *bmo, int subtype) { - KX_ObjectActuator* self= static_castBGE_PROXY_REF(self_v); + KX_ObjectActuator* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; switch(subtype) { case MATHUTILS_VEC_CB_LINV: - self->m_linear_velocity.getValue(vec_from); + self->m_linear_velocity.getValue(bmo->data); break; case MATHUTILS_VEC_CB_ANGV: - self->m_angular_velocity.getValue(vec_from); + self->m_angular_velocity.getValue(bmo->data); break; } return 1; } -static int mathutils_obactu_vector_set(PyObject *self_v, int subtype, float *vec_to) +static int mathutils_obactu_vector_set(BaseMathObject *bmo, int subtype) { - KX_ObjectActuator* self= static_castBGE_PROXY_REF(self_v); + KX_ObjectActuator* self= static_castBGE_PROXY_REF(bmo->cb_user); if(self==NULL) return 0; switch(subtype) { case MATHUTILS_VEC_CB_LINV: - self->m_linear_velocity.setValue(vec_to); + self->m_linear_velocity.setValue(bmo->data); break; case MATHUTILS_VEC_CB_ANGV: - self->m_angular_velocity.setValue(vec_to); + self->m_angular_velocity.setValue(bmo->data); break; } return 1; } -static int mathutils_obactu_vector_get_index(PyObject *self_v, int subtype, float *vec_from, int index) +static int mathutils_obactu_vector_get_index(BaseMathObject *bmo, int subtype, int index) { - float f[4]; /* lazy, avoid repeteing the case statement */ - if(!mathutils_obactu_vector_get(self_v, subtype, f)) + if(!mathutils_obactu_vector_get(bmo, subtype)) return 0; - - vec_from[index]= f[index]; return 1; } -static int mathutils_obactu_vector_set_index(PyObject *self_v, int subtype, float *vec_to, int index) +static int mathutils_obactu_vector_set_index(BaseMathObject *bmo, int subtype, int index) { - float f= vec_to[index]; + float f= bmo->data[index]; /* lazy, avoid repeteing the case statement */ - if(!mathutils_obactu_vector_get(self_v, subtype, vec_to)) + if(!mathutils_obactu_vector_get(bmo, subtype)) return 0; - vec_to[index]= f; - mathutils_obactu_vector_set(self_v, subtype, vec_to); - - return 1; + bmo->data[index]= f; + return mathutils_obactu_vector_set(bmo, subtype); } Mathutils_Callback mathutils_obactu_vector_cb = { @@ -476,6 +467,8 @@ int KX_ObjectActuator::pyattr_set_linV(void *self_v, const KX_PYATTRIBUTE_DEF *a if (!PyVecTo(value, self->m_linear_velocity)) return PY_SET_ATTR_FAIL; + self->UpdateFuzzyFlags(); + return PY_SET_ATTR_SUCCESS; } @@ -490,6 +483,8 @@ int KX_ObjectActuator::pyattr_set_angV(void *self_v, const KX_PYATTRIBUTE_DEF *a if (!PyVecTo(value, self->m_angular_velocity)) return PY_SET_ATTR_FAIL; + self->UpdateFuzzyFlags(); + return PY_SET_ATTR_SUCCESS; } diff --git a/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp b/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp index b4bf052aac9..8949a85066c 100644 --- a/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp +++ b/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp @@ -30,10 +30,6 @@ #include "MT_Matrix3x3.h" #include "KX_IScalarInterpolator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void KX_OrientationInterpolator::Execute(float currentTime) const { MT_Vector3 eul(m_ipos[0]->GetValue(currentTime), m_ipos[1]->GetValue(currentTime), diff --git a/source/gameengine/Ketsji/KX_OrientationInterpolator.h b/source/gameengine/Ketsji/KX_OrientationInterpolator.h index fda331f126d..de41323c289 100644 --- a/source/gameengine/Ketsji/KX_OrientationInterpolator.h +++ b/source/gameengine/Ketsji/KX_OrientationInterpolator.h @@ -54,7 +54,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC private: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_OrientationInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_OrientationInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ParentActuator.cpp b/source/gameengine/Ketsji/KX_ParentActuator.cpp index 750b0c9d195..62740585831 100644 --- a/source/gameengine/Ketsji/KX_ParentActuator.cpp +++ b/source/gameengine/Ketsji/KX_ParentActuator.cpp @@ -38,10 +38,6 @@ #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp index d33417be53f..15fc3e5c471 100644 --- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp +++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp @@ -33,10 +33,6 @@ #include "PHY_IPhysicsEnvironment.h" #include "PHY_IPhysicsController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_PhysicsObjectWrapper::KX_PhysicsObjectWrapper( PHY_IPhysicsController* ctrl, PHY_IPhysicsEnvironment* physenv) : diff --git a/source/gameengine/Ketsji/KX_PolyProxy.cpp b/source/gameengine/Ketsji/KX_PolyProxy.cpp index 94fcb392d24..837c79c77b3 100644 --- a/source/gameengine/Ketsji/KX_PolyProxy.cpp +++ b/source/gameengine/Ketsji/KX_PolyProxy.cpp @@ -28,10 +28,6 @@ #ifndef DISABLE_PYTHON -#ifdef HAVE_CONFIG_H -#include -#endif - #include "KX_PolyProxy.h" #include "KX_MeshProxy.h" #include "RAS_MeshObject.h" diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp index b94f3ee6c27..dacc74f139f 100644 --- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp +++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp @@ -25,10 +25,6 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "KX_PolygonMaterial.h" #include "BKE_mesh.h" @@ -119,7 +115,7 @@ bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingI { PyObject *pyRasty = PyCObject_FromVoidPtr((void*)rasty, NULL); /* new reference */ PyObject *pyCachingInfo = PyCObject_FromVoidPtr((void*) &cachingInfo, NULL); /* new reference */ - PyObject *ret = PyObject_CallMethod(m_pymaterial, "activate", "(NNO)", pyRasty, pyCachingInfo, (PyObject*) this->m_proxy); + PyObject *ret = PyObject_CallMethod(m_pymaterial, (char *)"activate", (char *)"(NNO)", pyRasty, pyCachingInfo, (PyObject*) this->m_proxy); if (ret) { bool value = PyLong_AsSsize_t(ret); diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.h b/source/gameengine/Ketsji/KX_PolygonMaterial.h index 9d538b4a3da..03b4bf11a18 100644 --- a/source/gameengine/Ketsji/KX_PolygonMaterial.h +++ b/source/gameengine/Ketsji/KX_PolygonMaterial.h @@ -143,6 +143,7 @@ public: static PyObject* pyattr_get_specular(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_specular(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); #endif + }; #endif // __KX_POLYGONMATERIAL_H__ diff --git a/source/gameengine/Ketsji/KX_PositionInterpolator.cpp b/source/gameengine/Ketsji/KX_PositionInterpolator.cpp index 30864bb4baf..6e047180cdf 100644 --- a/source/gameengine/Ketsji/KX_PositionInterpolator.cpp +++ b/source/gameengine/Ketsji/KX_PositionInterpolator.cpp @@ -30,10 +30,6 @@ #include "MT_Point3.h" #include "KX_IScalarInterpolator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void KX_PositionInterpolator::Execute(float currentTime) const { m_target.setValue(m_ipos[0]->GetValue(currentTime), m_ipos[1]->GetValue(currentTime), diff --git a/source/gameengine/Ketsji/KX_PositionInterpolator.h b/source/gameengine/Ketsji/KX_PositionInterpolator.h index 3dd72a6b08f..764c7bd8750 100644 --- a/source/gameengine/Ketsji/KX_PositionInterpolator.h +++ b/source/gameengine/Ketsji/KX_PositionInterpolator.h @@ -54,7 +54,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC private: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_PositionInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_PositionInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index 94b98e783bc..bbf8152bd68 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -37,10 +37,6 @@ #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef DISABLE_PYTHON // nasty glob variable to connect scripting language diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp index ba213ebc85d..59d1c197cf3 100644 --- a/source/gameengine/Ketsji/KX_PyMath.cpp +++ b/source/gameengine/Ketsji/KX_PyMath.cpp @@ -28,10 +28,6 @@ * Initialize Python thingies. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef WIN32 #pragma warning (disable : 4786) #endif //WIN32 diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h index 8c14ac0e96c..9c9688f79cd 100644 --- a/source/gameengine/Ketsji/KX_PyMath.h +++ b/source/gameengine/Ketsji/KX_PyMath.h @@ -45,7 +45,7 @@ #ifndef DISABLE_PYTHON #ifdef USE_MATHUTILS extern "C" { -#include "../../blender/python/generic/Mathutils.h" /* so we can have mathutils callbacks */ +#include "../../blender/python/generic/mathutils.h" /* so we can have mathutils callbacks */ } #endif diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 6f0ae284392..7327b9c08ff 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -38,9 +38,10 @@ extern "C" { #include "bpy_internal_import.h" /* from the blender python api, but we want to import text too! */ - #include "Mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use. - #include "Geometry.h" // Blender.Geometry module copied here so the blenderlayer can use. + #include "mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use. + #include "geometry.h" // Blender.Geometry module copied here so the blenderlayer can use. #include "bgl.h" + #include "blf_api.h" #include "marshal.h" /* python header for loading/saving dicts */ } @@ -73,6 +74,8 @@ extern "C" { #include "SCA_PropertySensor.h" #include "SCA_RandomActuator.h" #include "SCA_KeyboardSensor.h" /* IsPrintable, ToCharacter */ +#include "SCA_PythonKeyboard.h" +#include "SCA_PythonMouse.h" #include "KX_ConstraintActuator.h" #include "KX_IpoActuator.h" #include "KX_SoundActuator.h" @@ -118,18 +121,21 @@ extern "C" { #include "BLO_readfile.h" } - #include "NG_NetworkScene.h" //Needed for sendMessage() -static void setSandbox(TPythonSecurityLevel level); - // 'local' copy of canvas ptr, for window height/width python scripts + +#ifndef DISABLE_PYTHON + static RAS_ICanvas* gp_Canvas = NULL; +static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = ""; +static char gp_GamePythonPathOrig[FILE_MAXDIR + FILE_MAXFILE] = ""; // not super happy about this, but we need to remember the first loaded file for the global/dict load save + +#endif // DISABLE_PYTHON + static KX_Scene* gp_KetsjiScene = NULL; static KX_KetsjiEngine* gp_KetsjiEngine = NULL; static RAS_IRasterizer* gp_Rasterizer = NULL; -static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = ""; -static char gp_GamePythonPathOrig[FILE_MAXDIR + FILE_MAXFILE] = ""; // not super happy about this, but we need to remember the first loaded file for the global/dict load save void KX_SetActiveScene(class KX_Scene* scene) { @@ -209,7 +215,7 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args) return NULL; BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE); - BLI_convertstringcode(expanded, gp_GamePythonPath); + BLI_path_abs(expanded, gp_GamePythonPath); return PyUnicode_FromString(expanded); } @@ -471,10 +477,10 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args) if (searchpath) { BLI_strncpy(cpath, searchpath, FILE_MAXDIR + FILE_MAXFILE); - BLI_convertstringcode(cpath, gp_GamePythonPath); + BLI_path_abs(cpath, gp_GamePythonPath); } else { /* Get the dir only */ - BLI_split_dirfile_basic(gp_GamePythonPath, cpath, NULL); + BLI_split_dirfile(gp_GamePythonPath, cpath, NULL); } if((dp = opendir(cpath)) == NULL) { @@ -1280,6 +1286,13 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item); + // Add keyboard and mouse attributes to this module + SCA_PythonKeyboard* pykeyb = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice()); + PyDict_SetItemString(d, "keyboard", pykeyb->NewProxy(true)); + + SCA_PythonMouse* pymouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas); + PyDict_SetItemString(d, "mouse", pymouse->NewProxy(true)); + ErrorObject = PyUnicode_FromString("GameLogic.error"); PyDict_SetItemString(d, "error", ErrorObject); Py_DECREF(ErrorObject); @@ -1300,6 +1313,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EXPRESSION, SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION); /* 3. Constraint actuator */ + /* XXX, TODO NXBGE, move constants names from KX_ACT_CONSTRAINT_foo to KX_CONSTRAINTACT_foo */ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCY); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCZ); @@ -1308,10 +1322,10 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTZ); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPX); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPY); - KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPY); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPZ); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNX); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNY); - KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNY); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNZ); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIY); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIZ); @@ -1321,6 +1335,12 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX); KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY); KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ); + KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL); + KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL); + KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT); + KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE); + KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL); + KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH); /* 4. Ipo actuator, simple part */ KX_MACRO_addTypesToDict(d, KX_IPOACT_PLAY, KX_IpoActuator::KX_ACT_IPO_PLAY); @@ -1459,6 +1479,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_MIDDLE, SCA_IInputDevice::KX_MIDDLEMOUSE); KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_RIGHT, SCA_IInputDevice::KX_RIGHTMOUSE); + /* 2D Filter Actuator */ KX_MACRO_addTypesToDict(d, RAS_2DFILTER_ENABLED, RAS_2DFilterManager::RAS_2DFILTER_ENABLED); KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DISABLED, RAS_2DFilterManager::RAS_2DFILTER_DISABLED); KX_MACRO_addTypesToDict(d, RAS_2DFILTER_NOFILTER, RAS_2DFilterManager::RAS_2DFILTER_NOFILTER); @@ -1474,7 +1495,8 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SEPIA, RAS_2DFilterManager::RAS_2DFILTER_SEPIA); KX_MACRO_addTypesToDict(d, RAS_2DFILTER_INVERT, RAS_2DFilterManager::RAS_2DFILTER_INVERT); KX_MACRO_addTypesToDict(d, RAS_2DFILTER_CUSTOMFILTER, RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER); - + + /* Sound Actuator */ KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP, KX_SoundActuator::KX_SOUNDACT_PLAYSTOP); KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND, KX_SoundActuator::KX_SOUNDACT_PLAYEND); KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP, KX_SoundActuator::KX_SOUNDACT_LOOPSTOP); @@ -1482,18 +1504,12 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL); KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP); + /* State Actuator */ KX_MACRO_addTypesToDict(d, KX_STATE_OP_CPY, KX_StateActuator::OP_CPY); KX_MACRO_addTypesToDict(d, KX_STATE_OP_SET, KX_StateActuator::OP_SET); KX_MACRO_addTypesToDict(d, KX_STATE_OP_CLR, KX_StateActuator::OP_CLR); KX_MACRO_addTypesToDict(d, KX_STATE_OP_NEG, KX_StateActuator::OP_NEG); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH); - /* Game Actuator Modes */ KX_MACRO_addTypesToDict(d, KX_GAME_LOAD, KX_GameActuator::KX_GAME_LOAD); KX_MACRO_addTypesToDict(d, KX_GAME_START, KX_GameActuator::KX_GAME_START); @@ -1622,7 +1638,7 @@ PyObject *KXpy_import(PyObject *self, PyObject *args) /* quick hack for GamePython modules TODO: register builtin modules properly by ExtendInittab */ if (!strcmp(name, "GameLogic") || !strcmp(name, "GameKeys") || !strcmp(name, "PhysicsConstraints") || - !strcmp(name, "Rasterizer") || !strcmp(name, "Mathutils") || !strcmp(name, "bgl") || !strcmp(name, "Geometry")) { + !strcmp(name, "Rasterizer") || !strcmp(name, "mathutils") || !strcmp(name, "bgl") || !strcmp(name, "geometry")) { return PyImport_ImportModuleEx(name, globals, locals, fromlist); } @@ -1691,7 +1707,7 @@ static PyMethodDef meth_import[] = {{ "import", KXpy_import, METH_VARARGS, "our //static PyObject *g_oldimport = 0; //static int g_security = 0; -void setSandbox(TPythonSecurityLevel level) +static void setSandbox(TPythonSecurityLevel level) { PyObject *m = PyImport_AddModule("__builtin__"); PyObject *d = PyModule_GetDict(m); @@ -1786,8 +1802,8 @@ static void initPySysObjects__append(PyObject *sys_path, char *filename) PyObject *item; char expanded[FILE_MAXDIR + FILE_MAXFILE]; - BLI_split_dirfile_basic(filename, expanded, NULL); /* get the dir part of filename only */ - BLI_convertstringcode(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */ + BLI_split_dirfile(filename, expanded, NULL); /* get the dir part of filename only */ + BLI_path_abs(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */ BLI_cleanup_file(gp_GamePythonPath, expanded); /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */ item= PyUnicode_FromString(expanded); @@ -1818,7 +1834,7 @@ static void initPySysObjects(Main *maggie) while(lib) { /* lib->name wont work in some cases (on win32), * even when expanding with gp_GamePythonPath, using lib->filename is less trouble */ - initPySysObjects__append(sys_path, lib->filename); + initPySysObjects__append(sys_path, lib->filepath); lib= (Library *)lib->id.next; } @@ -1972,13 +1988,11 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main * initMathutils(); initGeometry(); initBGL(); - -#ifdef WITH_FFMPEG + initBLF(); initVideoTexture(); -#endif /* could be done a lot more nicely, but for now a quick way to get bge.* working */ - PyRun_SimpleString("__import__('sys').modules['bge']=[mod for mod in (type(__builtins__)('bge'), ) if mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'keys':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')}) is None][0]"); + PyRun_SimpleString("__import__('sys').modules['bge']=[mod for mod in (type(__builtins__)('bge'), ) if mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')}) is None][0]"); } static struct PyModuleDef Rasterizer_module_def = { @@ -2249,6 +2263,13 @@ PyObject* initGameKeys() KX_MACRO_addTypesToDict(d, F10KEY, SCA_IInputDevice::KX_F10KEY); KX_MACRO_addTypesToDict(d, F11KEY, SCA_IInputDevice::KX_F11KEY); KX_MACRO_addTypesToDict(d, F12KEY, SCA_IInputDevice::KX_F12KEY); + KX_MACRO_addTypesToDict(d, F13KEY, SCA_IInputDevice::KX_F13KEY); + KX_MACRO_addTypesToDict(d, F14KEY, SCA_IInputDevice::KX_F14KEY); + KX_MACRO_addTypesToDict(d, F15KEY, SCA_IInputDevice::KX_F15KEY); + KX_MACRO_addTypesToDict(d, F16KEY, SCA_IInputDevice::KX_F16KEY); + KX_MACRO_addTypesToDict(d, F17KEY, SCA_IInputDevice::KX_F17KEY); + KX_MACRO_addTypesToDict(d, F18KEY, SCA_IInputDevice::KX_F18KEY); + KX_MACRO_addTypesToDict(d, F19KEY, SCA_IInputDevice::KX_F19KEY); KX_MACRO_addTypesToDict(d, PAUSEKEY, SCA_IInputDevice::KX_PAUSEKEY); KX_MACRO_addTypesToDict(d, INSERTKEY, SCA_IInputDevice::KX_INSERTKEY); @@ -2257,6 +2278,15 @@ PyObject* initGameKeys() KX_MACRO_addTypesToDict(d, PAGEDOWNKEY, SCA_IInputDevice::KX_PAGEDOWNKEY); KX_MACRO_addTypesToDict(d, ENDKEY, SCA_IInputDevice::KX_ENDKEY); + // MOUSE + KX_MACRO_addTypesToDict(d, LEFTMOUSE, SCA_IInputDevice::KX_LEFTMOUSE); + KX_MACRO_addTypesToDict(d, MIDDLEMOUSE, SCA_IInputDevice::KX_MIDDLEMOUSE); + KX_MACRO_addTypesToDict(d, RIGHTMOUSE, SCA_IInputDevice::KX_RIGHTMOUSE); + KX_MACRO_addTypesToDict(d, WHEELUPMOUSE, SCA_IInputDevice::KX_WHEELUPMOUSE); + KX_MACRO_addTypesToDict(d, WHEELDOWNMOUSE, SCA_IInputDevice::KX_WHEELDOWNMOUSE); + KX_MACRO_addTypesToDict(d, MOUSEX, SCA_IInputDevice::KX_MOUSEX); + KX_MACRO_addTypesToDict(d, MOUSEY, SCA_IInputDevice::KX_MOUSEY); + // Check for errors if (PyErr_Occurred()) { @@ -2281,6 +2311,11 @@ PyObject* initBGL() return BGL_Init(); } +PyObject* initBLF() +{ + return BLF_Init(); +} + // utility function for loading and saving the globalDict int saveGamePythonConfig( char **marshal_buffer) { diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h index 7c2b1226bdb..fb59a2f21eb 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.h +++ b/source/gameengine/Ketsji/KX_PythonInit.h @@ -47,6 +47,7 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur PyObject* initMathutils(); PyObject* initGeometry(); PyObject* initBGL(); +PyObject* initBLF(); PyObject* initVideoTexture(void); void exitGamePlayerPythonScripting(); PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, struct Main *maggie); diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp index 278e0236b2e..6b9d7a2cccf 100644 --- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp +++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp @@ -79,6 +79,8 @@ #include "SCA_RandomSensor.h" #include "SCA_XNORController.h" #include "SCA_XORController.h" +#include "SCA_PythonKeyboard.h" +#include "SCA_PythonMouse.h" #include "KX_IpoActuator.h" #include "KX_NearSensor.h" #include "KX_RadarSensor.h" @@ -239,6 +241,8 @@ void initPyTypes(void) PyType_Ready_Attr(dict, SCA_XNORController, init_getset); PyType_Ready_Attr(dict, SCA_XORController, init_getset); PyType_Ready_Attr(dict, SCA_IController, init_getset); + PyType_Ready_Attr(dict, SCA_PythonKeyboard, init_getset); + PyType_Ready_Attr(dict, SCA_PythonMouse, init_getset); } diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp index 2edebf1ac98..8ffd58a781b 100644 --- a/source/gameengine/Ketsji/KX_PythonSeq.cpp +++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -324,6 +324,8 @@ PySequenceMethods KX_PythonSeq_as_sequence = { NULL, /* sq_ass_item */ NULL, /* sq_ass_slice */ (objobjproc)KX_PythonSeq_contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; static PyMappingMethods KX_PythonSeq_as_mapping = { diff --git a/source/gameengine/Ketsji/KX_PythonSeq.h b/source/gameengine/Ketsji/KX_PythonSeq.h index ac011d822f7..ca8f667852a 100644 --- a/source/gameengine/Ketsji/KX_PythonSeq.h +++ b/source/gameengine/Ketsji/KX_PythonSeq.h @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/gameengine/Ketsji/KX_RadarSensor.cpp b/source/gameengine/Ketsji/KX_RadarSensor.cpp index bf4bcc91563..041559158dd 100644 --- a/source/gameengine/Ketsji/KX_RadarSensor.cpp +++ b/source/gameengine/Ketsji/KX_RadarSensor.cpp @@ -32,10 +32,6 @@ #include "PHY_IPhysicsController.h" #include "PHY_IMotionState.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /** * RadarSensor constructor. Creates a near-sensor derived class, with a cone collision shape. */ diff --git a/source/gameengine/Ketsji/KX_RayCast.cpp b/source/gameengine/Ketsji/KX_RayCast.cpp index 58bb61a51a2..7562265a536 100644 --- a/source/gameengine/Ketsji/KX_RayCast.cpp +++ b/source/gameengine/Ketsji/KX_RayCast.cpp @@ -86,7 +86,7 @@ bool KX_RayCast::RayTest(PHY_IPhysicsEnvironment* physics_environment, const MT_ break; } - // The biggest danger to to endless loop, prevent this by checking that the + // The biggest danger to endless loop, prevent this by checking that the // hit point always progresses along the ray direction.. prevpoint -= callback.m_hitPoint; if (prevpoint.length2() < MT_EPSILON) diff --git a/source/gameengine/Ketsji/KX_RayCast.h b/source/gameengine/Ketsji/KX_RayCast.h index f2084b7669d..1512d81e940 100644 --- a/source/gameengine/Ketsji/KX_RayCast.h +++ b/source/gameengine/Ketsji/KX_RayCast.h @@ -95,7 +95,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -134,7 +134,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast::Callback"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast::Callback"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_RayEventManager.cpp b/source/gameengine/Ketsji/KX_RayEventManager.cpp index e9862fdd53f..9c9d6722784 100644 --- a/source/gameengine/Ketsji/KX_RayEventManager.cpp +++ b/source/gameengine/Ketsji/KX_RayEventManager.cpp @@ -38,10 +38,6 @@ using namespace std; #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - void KX_RayEventManager::NextFrame() { SG_DList::iterator it(m_sensors); diff --git a/source/gameengine/Ketsji/KX_RayEventManager.h b/source/gameengine/Ketsji/KX_RayEventManager.h index 35bf57f130c..55c2b81b068 100644 --- a/source/gameengine/Ketsji/KX_RayEventManager.h +++ b/source/gameengine/Ketsji/KX_RayEventManager.h @@ -46,7 +46,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_RaySensor.cpp b/source/gameengine/Ketsji/KX_RaySensor.cpp index c66b55edf50..e745d1f0334 100644 --- a/source/gameengine/Ketsji/KX_RaySensor.cpp +++ b/source/gameengine/Ketsji/KX_RaySensor.cpp @@ -45,10 +45,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - KX_RaySensor::KX_RaySensor(class SCA_EventManager* eventmgr, SCA_IObject* gameobj, diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp index eddad69e4c5..eee6146f6ed 100644 --- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp @@ -40,10 +40,6 @@ #include "KX_IPhysicsController.h" #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp index 58085b74255..bc59c63dc69 100644 --- a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp +++ b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp @@ -37,10 +37,6 @@ #include "KX_SCA_DynamicActuator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef DISABLE_PYTHON /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp index d6a2da3e2c7..c9ead726905 100644 --- a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp @@ -38,10 +38,6 @@ #include "KX_SCA_EndObjectActuator.h" #include "SCA_IScene.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_SCA_EndObjectActuator::KX_SCA_EndObjectActuator(SCA_IObject *gameobj, SCA_IScene* scene): SCA_IActuator(gameobj, KX_ACT_END_OBJECT), diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp index 0e7364bfa3e..20c3168d7ba 100644 --- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp +++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp @@ -40,10 +40,6 @@ #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef DISABLE_PYTHON /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp index 41aeace74c9..0529195e933 100644 --- a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp +++ b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp @@ -34,10 +34,6 @@ #include "BL_ArmatureObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /** * Implementation of classes defined in KX_SG_BoneParentNodeRelationship.h */ diff --git a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h index be8c4951935..05e9d9f02de 100644 --- a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h +++ b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h @@ -103,7 +103,7 @@ private : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BoneParentRelation"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BoneParentRelation"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp b/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp index 21913f8b885..ccdaac8edb7 100644 --- a/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp +++ b/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp @@ -28,10 +28,6 @@ #include "KX_SG_NodeRelationships.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /** * Implementation of classes defined in KX_SG_NodeRelationships.h */ diff --git a/source/gameengine/Ketsji/KX_SG_NodeRelationships.h b/source/gameengine/Ketsji/KX_SG_NodeRelationships.h index f62e18b07c3..7bb6f767308 100644 --- a/source/gameengine/Ketsji/KX_SG_NodeRelationships.h +++ b/source/gameengine/Ketsji/KX_SG_NodeRelationships.h @@ -93,7 +93,7 @@ private : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_NormalParentRelation"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_NormalParentRelation"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -150,7 +150,7 @@ private : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_VertexParentRelation"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_VertexParentRelation"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -233,7 +233,7 @@ private : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_SlowParentRelation"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_SlowParentRelation"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp b/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp index 46ab82ef30b..9fc544feaff 100644 --- a/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp +++ b/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp @@ -29,10 +29,6 @@ #include "KX_ScalarInterpolator.h" #include "KX_IScalarInterpolator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void KX_ScalarInterpolator::Execute(float currentTime) const { *m_target = m_ipo->GetValue(currentTime); } diff --git a/source/gameengine/Ketsji/KX_ScalarInterpolator.h b/source/gameengine/Ketsji/KX_ScalarInterpolator.h index 29962ddf686..5b66ad42bd9 100644 --- a/source/gameengine/Ketsji/KX_ScalarInterpolator.h +++ b/source/gameengine/Ketsji/KX_ScalarInterpolator.h @@ -59,7 +59,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ScalarInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ScalarInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp b/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp index 9dcccd28187..3f5ac8ee8a4 100644 --- a/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp +++ b/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp @@ -30,10 +30,6 @@ #include "MT_Vector3.h" #include "KX_IScalarInterpolator.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void KX_ScalingInterpolator::Execute(float currentTime) const { m_target.setValue(m_ipos[0]->GetValue(currentTime), m_ipos[1]->GetValue(currentTime), diff --git a/source/gameengine/Ketsji/KX_ScalingInterpolator.h b/source/gameengine/Ketsji/KX_ScalingInterpolator.h index 72e0e1185df..87b85a30d1f 100644 --- a/source/gameengine/Ketsji/KX_ScalingInterpolator.h +++ b/source/gameengine/Ketsji/KX_ScalingInterpolator.h @@ -54,7 +54,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ScalingInterpolator"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ScalingInterpolator"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 3547a6db545..99bec8159b4 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -139,7 +139,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, class SCA_IInputDevice* mousedevice, class NG_NetworkDeviceInterface *ndi, const STR_String& sceneName, - Scene *scene): + Scene *scene, + class RAS_ICanvas* canvas): PyObjectPlus(), m_keyboardmgr(NULL), m_mousemgr(NULL), @@ -170,7 +171,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_timemgr = new SCA_TimeEventManager(m_logicmgr); m_keyboardmgr = new SCA_KeyboardManager(m_logicmgr,keyboarddevice); - m_mousemgr = new SCA_MouseManager(m_logicmgr,mousedevice); + m_mousemgr = new SCA_MouseManager(m_logicmgr,mousedevice, canvas); //SCA_AlwaysEventManager* alwaysmgr = new SCA_AlwaysEventManager(m_logicmgr); //SCA_PropertyEventManager* propmgr = new SCA_PropertyEventManager(m_logicmgr); @@ -407,34 +408,6 @@ bool KX_Scene::IsClearingZBuffer() return m_isclearingZbuffer; } -void KX_Scene::RunDrawingCallbacks(PyObject* cb_list) -{ - int len; - - if (cb_list && (len=PyList_GET_SIZE(cb_list))) - { - PyObject* args= PyTuple_New(0); // save python creating each call - PyObject* func; - PyObject* ret; - - // Iterate the list and run the callbacks - for (int pos=0; pos < len; pos++) - { - func= PyList_GET_ITEM(cb_list, pos); - ret= PyObject_Call(func, args, NULL); - if (ret==NULL) { - PyErr_Print(); - PyErr_Clear(); - } - else { - Py_DECREF(ret); - } - } - - Py_DECREF(args); - } -} - void KX_Scene::EnableZBufferClearing(bool isclearingZbuffer) { m_isclearingZbuffer = isclearingZbuffer; @@ -557,7 +530,7 @@ KX_GameObject* KX_Scene::AddNodeReplicaObject(class SG_IObject* node, class CVal // replica of the hierarchy in order to make cross-links work properly // ! // It is VERY important that the order of sensors and actuators in -// the replicated object is preserved: it is is used to reconnect the logic. +// the replicated object is preserved: it is used to reconnect the logic. // This method is more robust then using the bricks name in case of complex // group replication. The replication of logic bricks is done in // SCA_IObject::ReParentLogic(), make sure it preserves the order of the bricks. @@ -989,8 +962,8 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj) { m_logicmgr->RemoveSensor(*its); } - - SCA_ControllerList& controllers = newobj->GetControllers(); + + SCA_ControllerList& controllers = newobj->GetControllers(); for (SCA_ControllerList::iterator itc = controllers.begin(); !(itc==controllers.end());itc++) { @@ -1094,12 +1067,12 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u bool bHasShapeKey = blendmesh->key != NULL && blendmesh->key->type==KEY_RELATIVE; bool bHasDvert = blendmesh->dvert != NULL; bool bHasArmature = + BL_ModifierDeformer::HasArmatureDeformer(blendobj) && parentobj && // current parent is armature parentobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE && oldblendobj && // needed for mesh deform blendobj->parent && // original object had armature (not sure this test is needed) - blendobj->parent->type == OB_ARMATURE && - blendobj->partype==PARSKEL && + blendobj->parent->type == OB_ARMATURE && blendmesh->dvert!=NULL; // mesh has vertex group bool bHasSoftBody = (!parentobj && (blendobj->gameflag & OB_SOFT_BODY)); @@ -1657,9 +1630,6 @@ double KX_Scene::getSuspendedDelta() return m_suspendeddelta; } -#ifndef DISABLE_PYTHON - - #include "KX_BulletPhysicsController.h" static void MergeScene_LogicBrick(SCA_ILogicBrick* brick, KX_Scene *to) @@ -1754,6 +1724,9 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene phys_ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment()); } } + /* If the object is a light, update it's scene */ + if (gameobj->GetGameObjectType() == SCA_IObject::OBJ_LIGHT) + ((KX_LightObject*)gameobj)->UpdateScene(to); /* Add the object to the scene's logic manager */ to->GetLogicManager()->RegisterGameObjectName(gameobj->GetName(), gameobj); @@ -1781,7 +1754,7 @@ bool KX_Scene::MergeScene(KX_Scene *other) } - GetBucketManager()->MergeBucketManager(other->GetBucketManager()); + GetBucketManager()->MergeBucketManager(other->GetBucketManager(), this); /* move materials across, assume they both use the same scene-converters */ GetSceneConverter()->MergeScene(this, other); @@ -1852,6 +1825,36 @@ void KX_Scene::Render2DFilters(RAS_ICanvas* canvas) m_filtermanager.RenderFilters(canvas); } +#ifndef DISABLE_PYTHON + +void KX_Scene::RunDrawingCallbacks(PyObject* cb_list) +{ + int len; + + if (cb_list && (len=PyList_GET_SIZE(cb_list))) + { + PyObject* args= PyTuple_New(0); // save python creating each call + PyObject* func; + PyObject* ret; + + // Iterate the list and run the callbacks + for (int pos=0; pos < len; pos++) + { + func= PyList_GET_ITEM(cb_list, pos); + ret= PyObject_Call(func, args, NULL); + if (ret==NULL) { + PyErr_Print(); + PyErr_Clear(); + } + else { + Py_DECREF(ret); + } + } + + Py_DECREF(args); + } +} + //---------------------------------------------------------------------------- //Python @@ -1885,6 +1888,8 @@ PyMethodDef KX_Scene::Methods[] = { KX_PYMETHODTABLE(KX_Scene, end), KX_PYMETHODTABLE(KX_Scene, restart), KX_PYMETHODTABLE(KX_Scene, replace), + KX_PYMETHODTABLE(KX_Scene, suspend), + KX_PYMETHODTABLE(KX_Scene, resume), /* dict style access */ KX_PYMETHODTABLE(KX_Scene, get), @@ -1994,6 +1999,8 @@ PySequenceMethods KX_Scene::Sequence = { NULL, /* sq_ass_item */ NULL, /* sq_ass_slice */ (objobjproc)Seq_Contains, /* sq_contains */ + (binaryfunc) NULL, /* sq_inplace_concat */ + (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; PyObject* KX_Scene::pyattr_get_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) @@ -2191,6 +2198,24 @@ KX_PYMETHODDEF_DOC(KX_Scene, replace, Py_RETURN_NONE; } +KX_PYMETHODDEF_DOC(KX_Scene, suspend, + "suspend()\n" + "Suspends this scene.\n") +{ + Suspend(); + + Py_RETURN_NONE; +} + +KX_PYMETHODDEF_DOC(KX_Scene, resume, + "resume()\n" + "Resumes this scene.\n") +{ + Resume(); + + Py_RETURN_NONE; +} + /* Matches python dict.get(key, [default]) */ KX_PYMETHODDEF_DOC(KX_Scene, get, "") { diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index c3fc23f2979..cd8277ec39f 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -45,6 +45,7 @@ #include "RAS_FramingManager.h" #include "RAS_Rect.h" + #include "PyObjectPlus.h" #include "RAS_2DFilterManager.h" @@ -83,6 +84,10 @@ class btCollisionShape; class KX_BlenderSceneConverter; struct KX_ClientObjectInfo; +#ifdef WITH_CXX_GUARDEDALLOC +#include "MEM_guardedalloc.h" +#endif + /* for ID freeing */ #define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT)) @@ -280,7 +285,8 @@ public: class SCA_IInputDevice* mousedevice, class NG_NetworkDeviceInterface* ndi, const STR_String& scenename, - struct Scene* scene); + struct Scene* scene, + class RAS_ICanvas* canvas); virtual ~KX_Scene(); @@ -291,11 +297,6 @@ public: RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools); - /** - * Run the registered python drawing functions. - */ - void RunDrawingCallbacks(PyObject* cb_list); - /** * Update all transforms according to the scenegraph. */ @@ -552,6 +553,8 @@ public: KX_PYMETHOD_DOC(KX_Scene, end); KX_PYMETHOD_DOC(KX_Scene, restart); KX_PYMETHOD_DOC(KX_Scene, replace); + KX_PYMETHOD_DOC(KX_Scene, suspend); + KX_PYMETHOD_DOC(KX_Scene, resume); KX_PYMETHOD_DOC(KX_Scene, get); /* attributes */ @@ -573,6 +576,11 @@ public: static PyMappingMethods Mapping; static PySequenceMethods Sequence; + /** + * Run the registered python drawing functions. + */ + void RunDrawingCallbacks(PyObject* cb_list); + PyObject* GetPreDrawCB() { return m_draw_call_pre; }; PyObject* GetPostDrawCB() { return m_draw_call_post; }; #endif @@ -606,8 +614,6 @@ public: //void PrintStats(int verbose_level) { // m_bucketmanager->PrintStats(verbose_level) //} - - }; typedef std::vector KX_SceneList; diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp index 692645f8abd..8f6000ebc3d 100644 --- a/source/gameengine/Ketsji/KX_SceneActuator.cpp +++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp @@ -36,10 +36,6 @@ #include "KX_Camera.h" #include "KX_KetsjiEngine.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 08f235801a0..7f9b090d680 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -35,10 +35,6 @@ #include "KX_PyMath.h" // needed for PyObjectFrom() #include -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ @@ -299,7 +295,7 @@ PyMethodDef KX_SoundActuator::Methods[] = { KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, startSound), KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, pauseSound), KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, stopSound), - {NULL,NULL,NULL,NULL} //Sentinel + {NULL, NULL} //Sentinel }; PyAttributeDef KX_SoundActuator::Attributes[] = { diff --git a/source/gameengine/Ketsji/KX_StateActuator.cpp b/source/gameengine/Ketsji/KX_StateActuator.cpp index f8fb643dd6a..33f21f49810 100644 --- a/source/gameengine/Ketsji/KX_StateActuator.cpp +++ b/source/gameengine/Ketsji/KX_StateActuator.cpp @@ -31,10 +31,6 @@ #include "KX_StateActuator.h" #include "KX_GameObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_StateActuator::KX_StateActuator( SCA_IObject* gameobj, int operation, diff --git a/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp b/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp index 4ba3b44d504..4f10c72b50b 100644 --- a/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp +++ b/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp @@ -29,10 +29,6 @@ #include "KX_TimeCategoryLogger.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_TimeCategoryLogger::KX_TimeCategoryLogger(unsigned int maxNumMeasurements) : m_maxNumMeasurements(maxNumMeasurements) { diff --git a/source/gameengine/Ketsji/KX_TimeCategoryLogger.h b/source/gameengine/Ketsji/KX_TimeCategoryLogger.h index 7eda71c0798..b020683bfc6 100644 --- a/source/gameengine/Ketsji/KX_TimeCategoryLogger.h +++ b/source/gameengine/Ketsji/KX_TimeCategoryLogger.h @@ -128,7 +128,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeCategoryLogger"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeCategoryLogger"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_TimeLogger.cpp b/source/gameengine/Ketsji/KX_TimeLogger.cpp index 479d97f16a8..5ec09df2791 100644 --- a/source/gameengine/Ketsji/KX_TimeLogger.cpp +++ b/source/gameengine/Ketsji/KX_TimeLogger.cpp @@ -29,10 +29,6 @@ #include "KX_TimeLogger.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_TimeLogger::KX_TimeLogger(unsigned int maxNumMeasurements) : m_maxNumMeasurements(maxNumMeasurements), m_logStart(0), diff --git a/source/gameengine/Ketsji/KX_TimeLogger.h b/source/gameengine/Ketsji/KX_TimeLogger.h index b17000c98d0..058b1c2b6c7 100644 --- a/source/gameengine/Ketsji/KX_TimeLogger.h +++ b/source/gameengine/Ketsji/KX_TimeLogger.h @@ -106,7 +106,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeLogger"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeLogger"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.cpp b/source/gameengine/Ketsji/KX_TouchEventManager.cpp index 2b5a7c0f127..eb55d0272f6 100644 --- a/source/gameengine/Ketsji/KX_TouchEventManager.cpp +++ b/source/gameengine/Ketsji/KX_TouchEventManager.cpp @@ -33,10 +33,6 @@ #include "PHY_IPhysicsEnvironment.h" #include "PHY_IPhysicsController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_TouchEventManager::KX_TouchEventManager(class SCA_LogicManager* logicmgr, PHY_IPhysicsEnvironment* physEnv) diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.h b/source/gameengine/Ketsji/KX_TouchEventManager.h index 57d2894498a..388195367b9 100644 --- a/source/gameengine/Ketsji/KX_TouchEventManager.h +++ b/source/gameengine/Ketsji/KX_TouchEventManager.h @@ -79,7 +79,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TouchEventManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TouchEventManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp index 20c021480f9..9b44f487682 100644 --- a/source/gameengine/Ketsji/KX_TouchSensor.cpp +++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp @@ -40,10 +40,6 @@ #include #include "PHY_IPhysicsEnvironment.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.cpp b/source/gameengine/Ketsji/KX_TrackToActuator.cpp index baaa9a04f94..ae8d2f6459b 100644 --- a/source/gameengine/Ketsji/KX_TrackToActuator.cpp +++ b/source/gameengine/Ketsji/KX_TrackToActuator.cpp @@ -44,10 +44,6 @@ #include "PyObjectPlus.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /* ------------------------------------------------------------------------- */ /* Native functions */ /* ------------------------------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp index 4adeefe32b4..4ee80c64570 100644 --- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp +++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp @@ -9,10 +9,6 @@ #include "KX_GameObject.h" #include "KX_MotionState.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_VehicleWrapper::KX_VehicleWrapper( PHY_IVehicle* vehicle, PHY_IPhysicsEnvironment* physenv) : diff --git a/source/gameengine/Ketsji/KX_VertexProxy.cpp b/source/gameengine/Ketsji/KX_VertexProxy.cpp index e53c698c1c8..652bf5eafed 100644 --- a/source/gameengine/Ketsji/KX_VertexProxy.cpp +++ b/source/gameengine/Ketsji/KX_VertexProxy.cpp @@ -28,10 +28,6 @@ #ifndef DISABLE_PYTHON -#ifdef HAVE_CONFIG_H -#include -#endif - #include "KX_VertexProxy.h" #include "KX_MeshProxy.h" #include "RAS_TexVert.h" diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp index e5f520acfc5..e2f2badf051 100644 --- a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp +++ b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp @@ -31,10 +31,6 @@ #include "KX_VisibilityActuator.h" #include "KX_GameObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_VisibilityActuator::KX_VisibilityActuator( SCA_IObject* gameobj, bool visible, diff --git a/source/gameengine/Ketsji/KX_WorldInfo.cpp b/source/gameengine/Ketsji/KX_WorldInfo.cpp index e7b3761e268..bf059ca543c 100644 --- a/source/gameengine/Ketsji/KX_WorldInfo.cpp +++ b/source/gameengine/Ketsji/KX_WorldInfo.cpp @@ -28,10 +28,6 @@ #include "KX_WorldInfo.h" -#ifdef HAVE_CONFIG_H -#include -#endif - KX_WorldInfo::~KX_WorldInfo() { } diff --git a/source/gameengine/Ketsji/KX_WorldInfo.h b/source/gameengine/Ketsji/KX_WorldInfo.h index 21f8f521ef5..3b3d52f91f7 100644 --- a/source/gameengine/Ketsji/KX_WorldInfo.h +++ b/source/gameengine/Ketsji/KX_WorldInfo.h @@ -67,7 +67,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_WorldInfo"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_WorldInfo"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Ketsji/KX_WorldIpoController.cpp b/source/gameengine/Ketsji/KX_WorldIpoController.cpp index f40c4b0253a..476b23a5cbf 100644 --- a/source/gameengine/Ketsji/KX_WorldIpoController.cpp +++ b/source/gameengine/Ketsji/KX_WorldIpoController.cpp @@ -30,10 +30,6 @@ #include "KX_ScalarInterpolator.h" #include "KX_WorldInfo.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #if defined(_WIN64) typedef unsigned __int64 uint_ptr; #else @@ -48,7 +44,8 @@ bool KX_WorldIpoController::Update(double currentTime) for (i = m_interpolators.begin(); !(i == m_interpolators.end()); ++i) { (*i)->Execute(m_ipotime);//currentTime); } - + + /* TODO, this will crash! */ KX_WorldInfo *world = NULL; if (m_modify_mist_start) { diff --git a/source/gameengine/Ketsji/KX_WorldIpoController.h b/source/gameengine/Ketsji/KX_WorldIpoController.h index c89f893458f..f6c36198ae7 100644 --- a/source/gameengine/Ketsji/KX_WorldIpoController.h +++ b/source/gameengine/Ketsji/KX_WorldIpoController.h @@ -94,7 +94,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_WorldIpoController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_WorldIpoController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp index cec5bd80d04..5ac49883e91 100644 --- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp +++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp @@ -31,10 +31,6 @@ #include "NG_LoopBackNetworkDeviceInterface.h" #include "NG_NetworkMessage.h" -#ifdef HAVE_CONFIG_H -#include -#endif - // temporary debugging printf's #ifdef NAN_NET_DEBUG #include @@ -67,11 +63,6 @@ void NG_LoopBackNetworkDeviceInterface::NextFrame() m_currentQueue=1-m_currentQueue; } -STR_String NG_LoopBackNetworkDeviceInterface::GetNetworkVersion() -{ - return LOOPBACK_NETWORK_VERSION; -} - void NG_LoopBackNetworkDeviceInterface::SendNetworkMessage(NG_NetworkMessage* nwmsg) { #ifdef NAN_NET_DEBUG diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h index fdc066b424b..bb15c3239ee 100644 --- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h +++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h @@ -34,11 +34,7 @@ #include "NG_NetworkDeviceInterface.h" class NG_LoopBackNetworkDeviceInterface : public NG_NetworkDeviceInterface -{ - enum { - LOOPBACK_NETWORK_VERSION=28022001 - }; - +{ std::deque m_messages[2]; int m_currentQueue; @@ -58,8 +54,6 @@ public: virtual void SendNetworkMessage(class NG_NetworkMessage* msg); virtual vector RetrieveNetworkMessages(); - - STR_String GetNetworkVersion(); }; #endif //NG_LOOPBACKNETWORKDEVICEINTERFACE_H diff --git a/source/gameengine/Network/NG_NetworkDeviceInterface.h b/source/gameengine/Network/NG_NetworkDeviceInterface.h index 446aa7dab6c..5925870272d 100644 --- a/source/gameengine/Network/NG_NetworkDeviceInterface.h +++ b/source/gameengine/Network/NG_NetworkDeviceInterface.h @@ -70,17 +70,11 @@ public: */ virtual std::vector RetrieveNetworkMessages()=0; - - /** - * number of messages in device hash for this frame - */ - - virtual STR_String GetNetworkVersion(void)=0; #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkDeviceInterface"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkDeviceInterface"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Network/NG_NetworkMessage.cpp b/source/gameengine/Network/NG_NetworkMessage.cpp index ae02b694985..cb9b25c756a 100644 --- a/source/gameengine/Network/NG_NetworkMessage.cpp +++ b/source/gameengine/Network/NG_NetworkMessage.cpp @@ -30,10 +30,6 @@ #include "NG_NetworkMessage.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - int NG_NetworkMessage::s_nextID = 3; // just some number to start with NG_NetworkMessage::NG_NetworkMessage( diff --git a/source/gameengine/Network/NG_NetworkMessage.h b/source/gameengine/Network/NG_NetworkMessage.h index fd6dbd027e9..0d43e3c2b51 100644 --- a/source/gameengine/Network/NG_NetworkMessage.h +++ b/source/gameengine/Network/NG_NetworkMessage.h @@ -130,7 +130,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkMessage"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkMessage"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Network/NG_NetworkObject.cpp b/source/gameengine/Network/NG_NetworkObject.cpp index 3f702c49d3e..36aef6e44c8 100644 --- a/source/gameengine/Network/NG_NetworkObject.cpp +++ b/source/gameengine/Network/NG_NetworkObject.cpp @@ -29,10 +29,6 @@ */ #include "NG_NetworkObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - NG_NetworkObject::NG_NetworkObject() { } diff --git a/source/gameengine/Network/NG_NetworkObject.h b/source/gameengine/Network/NG_NetworkObject.h index ae185f85098..7bdd25305a0 100644 --- a/source/gameengine/Network/NG_NetworkObject.h +++ b/source/gameengine/Network/NG_NetworkObject.h @@ -47,7 +47,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkObject"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkObject"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Network/NG_NetworkScene.cpp b/source/gameengine/Network/NG_NetworkScene.cpp index 777a391368b..355ebe5c475 100644 --- a/source/gameengine/Network/NG_NetworkScene.cpp +++ b/source/gameengine/Network/NG_NetworkScene.cpp @@ -36,10 +36,6 @@ #include "NG_NetworkMessage.h" #include "NG_NetworkObject.h" -#ifdef HAVE_CONFIG_H -#include -#endif - NG_NetworkScene::NG_NetworkScene(NG_NetworkDeviceInterface* nic) { m_networkdevice = nic; diff --git a/source/gameengine/Network/NG_NetworkScene.h b/source/gameengine/Network/NG_NetworkScene.h index 7da949dfe0c..60bb0b09097 100644 --- a/source/gameengine/Network/NG_NetworkScene.h +++ b/source/gameengine/Network/NG_NetworkScene.h @@ -108,7 +108,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkScene"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkScene"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp b/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp index dcafea56a87..301a056f25c 100644 --- a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp +++ b/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp @@ -31,10 +31,6 @@ #include "NG_TerraplayNetworkDeviceInterface.h" #include "NG_NetworkMessage.h" -#ifdef HAVE_CONFIG_H -#include -#endif - //---- relocate these void NG_TerraplayNetworkDeviceInterface::interface_error(char *str, GASResult error) { GASRString err_str = GAS->ErrorTranslate(error); diff --git a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h b/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h index 1d9242850cc..cc5f50e9e5e 100644 --- a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h +++ b/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h @@ -56,8 +56,6 @@ public: void SendNetworkMessage(NG_NetworkMessage* nwmsg); vector RetrieveNetworkMessages(void); - - STR_String GetNetworkVersion(void); int mytest(void); }; diff --git a/source/gameengine/Physics/Bullet/CcdGraphicController.h b/source/gameengine/Physics/Bullet/CcdGraphicController.h index 07cf6d940cb..97893420d79 100644 --- a/source/gameengine/Physics/Bullet/CcdGraphicController.h +++ b/source/gameengine/Physics/Bullet/CcdGraphicController.h @@ -80,7 +80,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdGraphicController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdGraphicController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 607602a4d0d..3bbe17459c9 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -199,7 +199,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdShapeConstructionInfo"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdShapeConstructionInfo"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -576,7 +576,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdPhysicsController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdPhysicsController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -610,7 +610,7 @@ class DefaultMotionState : public PHY_IMotionState #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:DefaultMotionState"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:DefaultMotionState"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index 21f74e95ed4..c6e759743a9 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -277,7 +277,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdPhysicsEnvironment"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdPhysicsEnvironment"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp index e6422f1bcc1..524cffc2732 100644 --- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp @@ -29,10 +29,6 @@ #include "DummyPhysicsEnvironment.h" #include "PHY_IMotionState.h" -#ifdef HAVE_CONFIG_H -#include -#endif - DummyPhysicsEnvironment::DummyPhysicsEnvironment() { // create physicsengine data diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h index 9cf125f3e3f..0ad6649f2e5 100644 --- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h +++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h @@ -96,7 +96,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:DummyPhysicsEnvironment"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:DummyPhysicsEnvironment"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/common/PHY_IController.cpp b/source/gameengine/Physics/common/PHY_IController.cpp index 5f7f5a1b8a9..577e25b4336 100644 --- a/source/gameengine/Physics/common/PHY_IController.cpp +++ b/source/gameengine/Physics/common/PHY_IController.cpp @@ -28,10 +28,6 @@ */ #include "PHY_IController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - PHY_IController::~PHY_IController() { diff --git a/source/gameengine/Physics/common/PHY_IController.h b/source/gameengine/Physics/common/PHY_IController.h index 8fd9a37dea0..de2e53c3613 100644 --- a/source/gameengine/Physics/common/PHY_IController.h +++ b/source/gameengine/Physics/common/PHY_IController.h @@ -54,7 +54,7 @@ class PHY_IController #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.cpp b/source/gameengine/Physics/common/PHY_IGraphicController.cpp index 118aa5c01a1..dc4b31d9a76 100644 --- a/source/gameengine/Physics/common/PHY_IGraphicController.cpp +++ b/source/gameengine/Physics/common/PHY_IGraphicController.cpp @@ -28,10 +28,6 @@ */ #include "PHY_IGraphicController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - PHY_IGraphicController::~PHY_IGraphicController() { diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.h b/source/gameengine/Physics/common/PHY_IGraphicController.h index adca10cc1b4..aeccdb573b4 100644 --- a/source/gameengine/Physics/common/PHY_IGraphicController.h +++ b/source/gameengine/Physics/common/PHY_IGraphicController.h @@ -51,7 +51,7 @@ class PHY_IGraphicController : public PHY_IController virtual PHY_IGraphicController* GetReplica(class PHY_IMotionState* motionstate) {return 0;} #ifdef WITH_CXX_GUARDEDALLOC - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/common/PHY_IMotionState.cpp b/source/gameengine/Physics/common/PHY_IMotionState.cpp index 9d4d1e6c003..78505231895 100644 --- a/source/gameengine/Physics/common/PHY_IMotionState.cpp +++ b/source/gameengine/Physics/common/PHY_IMotionState.cpp @@ -28,10 +28,6 @@ */ #include "PHY_IMotionState.h" -#ifdef HAVE_CONFIG_H -#include -#endif - PHY_IMotionState::~PHY_IMotionState() { diff --git a/source/gameengine/Physics/common/PHY_IMotionState.h b/source/gameengine/Physics/common/PHY_IMotionState.h index 41dc45e6e32..a644bb319ae 100644 --- a/source/gameengine/Physics/common/PHY_IMotionState.h +++ b/source/gameengine/Physics/common/PHY_IMotionState.h @@ -59,7 +59,7 @@ class PHY_IMotionState #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IMotionState"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IMotionState"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.cpp b/source/gameengine/Physics/common/PHY_IPhysicsController.cpp index 0c96363d0e4..00c0bbe6477 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.cpp +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.cpp @@ -28,10 +28,6 @@ */ #include "PHY_IPhysicsController.h" -#ifdef HAVE_CONFIG_H -#include -#endif - PHY_IPhysicsController::~PHY_IPhysicsController() { diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h index 07ae3a01c91..82baa8c47e1 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h @@ -101,7 +101,7 @@ class PHY_IPhysicsController : public PHY_IController #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IPhysicsController"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IPhysicsController"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp index 9088a22cd5f..f56dc5c0aa7 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp @@ -29,10 +29,6 @@ #include "PHY_IPhysicsEnvironment.h" -#ifdef HAVE_CONFIG_H -#include -#endif - /** * Physics Environment takes care of stepping the simulation and is a container for physics entities (rigidbodies,constraints, materials etc.) * A derived class may be able to 'construct' entities by loading and/or converting diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h index b557d4edc07..abce2769f2a 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h @@ -88,7 +88,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IRayCastFilterCallback"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IRayCastFilterCallback"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -179,7 +179,7 @@ class PHY_IPhysicsEnvironment #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IPhysicsEnvironment"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IPhysicsEnvironment"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Physics/common/PHY_IVehicle.h b/source/gameengine/Physics/common/PHY_IVehicle.h index 261bae480f5..7c00b5d0bef 100644 --- a/source/gameengine/Physics/common/PHY_IVehicle.h +++ b/source/gameengine/Physics/common/PHY_IVehicle.h @@ -58,7 +58,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IVehicle"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IVehicle"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/PyDoc/API_intro.py b/source/gameengine/PyDoc/API_intro.py index abc8c83855b..097abbfbf1a 100644 --- a/source/gameengine/PyDoc/API_intro.py +++ b/source/gameengine/PyDoc/API_intro.py @@ -26,7 +26,7 @@ The Blender Game Engine Python API Reference These modules have no GameEngine specific functionality but are useful in many cases. - - L{Mathutils} + - L{mathutils} - L{Geometry} - L{BGL} diff --git a/source/gameengine/PyDoc/GameKeys.py b/source/gameengine/PyDoc/GameKeys.py deleted file mode 100644 index e798f6c901b..00000000000 --- a/source/gameengine/PyDoc/GameKeys.py +++ /dev/null @@ -1,174 +0,0 @@ -# $Id$ -""" -Documentation for the GameKeys module. -====================================== - -This module holds key constants for the SCA_KeyboardSensor. - - -Example:: - # Set a connected keyboard sensor to accept F1 - import GameLogic - import GameKeys - - co = GameLogic.getCurrentController() - # 'Keyboard' is a keyboard sensor - sensor = co.getSensor('Keyboard') - sensor.key = GameKeys.F1KEY - -Example:: - # Do the all keys thing - import GameLogic - import GameKeys - - co = GameLogic.getCurrentController() - # 'Keyboard' is a keyboard sensor - sensor = co.getSensor('Keyboard') - keylist = sensor.events - for key in keylist: - # key[0] == GameKeys.keycode, key[1] = status - if key[1] == GameLogic.KX_INPUT_JUST_ACTIVATED: - if key[0] == GameKeys.WKEY: - # Activate Forward! - if key[0] == GameKeys.SKEY: - # Activate Backward! - if key[0] == GameKeys.AKEY: - # Activate Left! - if key[0] == GameKeys.DKEY: - # Activate Right! - -@group Alphabet keys: AKEY, BKEY, CKEY, DKEY, EKEY, FKEY, GKEY, HKEY, IKEY, JKEY, KKEY, LKEY, MKEY, NKEY, OKEY, PKEY, QKEY, RKEY, SKEY, TKEY, UKEY, VKEY, WKEY, XKEY, YKEY, ZKEY -@var AKEY: -@var BKEY: -@var CKEY: -@var DKEY: -@var EKEY: -@var FKEY: -@var GKEY: -@var HKEY: -@var IKEY: -@var JKEY: -@var KKEY: -@var LKEY: -@var MKEY: -@var NKEY: -@var OKEY: -@var PKEY: -@var QKEY: -@var RKEY: -@var SKEY: -@var TKEY: -@var UKEY: -@var VKEY: -@var WKEY: -@var XKEY: -@var YKEY: -@var ZKEY: - -@group Number keys: ZEROKEY, ONEKEY, TWOKEY, THREEKEY, FOURKEY, FIVEKEY, SIXKEY, SEVENKEY, EIGHTKEY, NINEKEY -@var ZEROKEY: -@var ONEKEY: -@var TWOKEY: -@var THREEKEY: -@var FOURKEY: -@var FIVEKEY: -@var SIXKEY: -@var SEVENKEY: -@var EIGHTKEY: -@var NINEKEY: - -@group Modifiers: CAPSLOCKKEY, LEFTCTRLKEY, LEFTALTKEY, RIGHTALTKEY, RIGHTCTRLKEY, RIGHTSHIFTKEY, LEFTSHIFTKEY -@var CAPSLOCKKEY: -@var LEFTCTRLKEY: -@var LEFTALTKEY: -@var RIGHTALTKEY: -@var RIGHTCTRLKEY: -@var RIGHTSHIFTKEY: -@var LEFTSHIFTKEY: - -@group Arrow Keys: LEFTARROWKEY, DOWNARROWKEY, RIGHTARROWKEY, UPARROWKEY -@var LEFTARROWKEY: -@var DOWNARROWKEY: -@var RIGHTARROWKEY: -@var UPARROWKEY: - -@group Numberpad Keys: PAD0, PAD1, PAD2, PAD3, PAD4, PAD5, PAD6, PAD7, PAD8, PAD9, PADPERIOD, PADSLASHKEY, PADASTERKEY, PADMINUS, PADENTER, PADPLUSKEY -@var PAD0: -@var PAD1: -@var PAD2: -@var PAD3: -@var PAD4: -@var PAD5: -@var PAD6: -@var PAD7: -@var PAD8: -@var PAD9: -@var PADPERIOD: -@var PADSLASHKEY: -@var PADASTERKEY: -@var PADMINUS: -@var PADENTER: -@var PADPLUSKEY: - -@group Function Keys: F1KEY, F2KEY, F3KEY, F4KEY, F5KEY, F6KEY, F7KEY, F8KEY, F9KEY, F10KEY, F11KEY, F12KEY -@var F1KEY: -@var F2KEY: -@var F3KEY: -@var F4KEY: -@var F5KEY: -@var F6KEY: -@var F7KEY: -@var F8KEY: -@var F9KEY: -@var F10KEY: -@var F11KEY: -@var F12KEY: - -@group Other Keys: ACCENTGRAVEKEY, BACKSLASHKEY, BACKSPACEKEY, COMMAKEY, DELKEY, ENDKEY, EQUALKEY, ESCKEY, HOMEKEY, INSERTKEY, LEFTBRACKETKEY, LINEFEEDKEY, MINUSKEY, PAGEDOWNKEY, PAGEUPKEY, PAUSEKEY, PERIODKEY, QUOTEKEY, RIGHTBRACKETKEY, RETKEY, SEMICOLONKEY, SLASHKEY, SPACEKEY, TABKEY -@var ACCENTGRAVEKEY: -@var BACKSLASHKEY: -@var BACKSPACEKEY: -@var COMMAKEY: -@var DELKEY: -@var ENDKEY: -@var EQUALKEY: -@var ESCKEY: -@var HOMEKEY: -@var INSERTKEY: -@var LEFTBRACKETKEY: -@var LINEFEEDKEY: -@var MINUSKEY: -@var PAGEDOWNKEY: -@var PAGEUPKEY: -@var PAUSEKEY: -@var PERIODKEY: -@var QUOTEKEY: -@var RIGHTBRACKETKEY: -@var RETKEY: -@var SEMICOLONKEY: -@var SLASHKEY: -@var SPACEKEY: -@var TABKEY: - -""" - -def EventToString(event): - """ - Return the string name of a key event. Will raise a ValueError error if its invalid. - - @type event: int - @param event: key event from GameKeys or the keyboard sensor. - @rtype: string - """ - -def EventToCharacter(event, shift): - """ - Return the string name of a key event. Returns an empty string if the event cant be represented as a character. - - @type event: int - @param event: key event from GameKeys or the keyboard sensor. - @type shift: bool - @param shift: set to true if shift is held. - @rtype: string - """ - diff --git a/source/gameengine/PyDoc/GameLogic.py b/source/gameengine/PyDoc/GameLogic.py deleted file mode 100644 index 56a9ea0d4f4..00000000000 --- a/source/gameengine/PyDoc/GameLogic.py +++ /dev/null @@ -1,515 +0,0 @@ -# $Id$ -""" -Documentation for the GameLogic Module. -======================================= - - Module to access logic functions, imported automatically into the python controllers namespace. - - Examples:: - # To get the controller thats running this python script: - cont = GameLogic.getCurrentController() # GameLogic is automatically imported - - # To get the game object this controller is on: - obj = cont.owner - L{KX_GameObject} and L{KX_Camera} or L{KX_LightObject} methods are - available depending on the type of object:: - # To get a sensor linked to this controller. - # "sensorname" is the name of the sensor as defined in the Blender interface. - # +---------------------+ +--------+ - # | Sensor "sensorname" +--+ Python + - # +---------------------+ +--------+ - sens = cont.sensors["sensorname"] - - # To get a sequence of all sensors: - sensors = co.sensors - - See the sensor's reference for available methods: - - L{DelaySensor} - - L{JoystickSensor} - - L{KeyboardSensor} - - L{MouseFocusSensor} - - L{MouseSensor} - - L{NearSensor} - - L{NetworkMessageSensor} - - L{PropertySensor} - - L{RadarSensor} - - L{RandomSensor} - - L{RaySensor} - - L{TouchSensor} - - You can also access actuators linked to the controller:: - # To get an actuator attached to the controller: - # +--------+ +-------------------------+ - # + Python +--+ Actuator "actuatorname" | - # +--------+ +-------------------------+ - actuator = co.actuators["actuatorname"] - - # Activate an actuator - controller.activate(actuator) - - See the actuator's reference for available methods: - - L{2DFilterActuator} - - L{ActionActuator} - - L{AddObjectActuator} - - L{CameraActuator} - - L{ConstraintActuator} - - L{DynamicActuator} - - L{EndObjectActuator} - - L{GameActuator} - - L{IpoActuator} - - L{NetworkMessageActuator} - - L{ObjectActuator} - - L{ParentActuator} - - L{PropertyActuator} - - L{RandomActuator} - - L{ReplaceMeshActuator} - - L{SceneActuator} - - L{ShapeActionActuator} - - L{SoundActuator} - - L{StateActuator} - - L{TrackToActuator} - - L{VisibilityActuator} - - Most logic brick's methods are accessors for the properties available in the logic buttons. - Consult the logic bricks documentation for more information on how each logic brick works. - - There are also methods to access the current L{KX_Scene}:: - # Get the current scene - scene = GameLogic.getCurrentScene() - - # Get the current camera - cam = scene.active_camera - - Matricies as used by the game engine are B{row major}:: - matrix[row][col] = float - L{KX_Camera} has some examples using matricies. - - -@group Constants: KX_TRUE, KX_FALSE -@var KX_TRUE: True value used by some modules. -@var KX_FALSE: False value used by some modules. - -@group Property Sensor: KX_PROPSENSOR_* -@var KX_PROPSENSOR_EQUAL: Activate when the property is equal to the sensor value. -@var KX_PROPSENSOR_NOTEQUAL: Activate when the property is not equal to the sensor value. -@var KX_PROPSENSOR_INTERVAL: Activate when the property is between the specified limits. -@var KX_PROPSENSOR_CHANGED: Activate when the property changes -@var KX_PROPSENSOR_EXPRESSION: Activate when the expression matches - -@group Constraint Actuator: KX_CONSTRAINTACT_* -@var KX_CONSTRAINTACT_LOCX: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_LOCY: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_LOCZ: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_ROTX: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_ROTY: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_ROTZ: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_DIRNX: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_DIRNY: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_DIRPX: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_DIRPY: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_ORIX: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_ORIY: See L{KX_ConstraintActuator} -@var KX_CONSTRAINTACT_ORIZ: See L{KX_ConstraintActuator} - -@group IPO Actuator: KX_IPOACT_* -@var KX_IPOACT_PLAY: See L{KX_IpoActuator} -@var KX_IPOACT_PINGPONG: See L{KX_IpoActuator} -@var KX_IPOACT_FLIPPER: See L{KX_IpoActuator} -@var KX_IPOACT_LOOPSTOP: See L{KX_IpoActuator} -@var KX_IPOACT_LOOPEND: See L{KX_IpoActuator} -@var KX_IPOACT_FROM_PROP: See L{KX_IpoActuator} - -@group Random Distributions: KX_RANDOMACT_* -@var KX_RANDOMACT_BOOL_CONST: See L{SCA_RandomActuator} -@var KX_RANDOMACT_BOOL_UNIFORM: See L{SCA_RandomActuator} -@var KX_RANDOMACT_BOOL_BERNOUILLI: See L{SCA_RandomActuator} -@var KX_RANDOMACT_INT_CONST: See L{SCA_RandomActuator} -@var KX_RANDOMACT_INT_UNIFORM: See L{SCA_RandomActuator} -@var KX_RANDOMACT_INT_POISSON: See L{SCA_RandomActuator} -@var KX_RANDOMACT_FLOAT_CONST: See L{SCA_RandomActuator} -@var KX_RANDOMACT_FLOAT_UNIFORM: See L{SCA_RandomActuator} -@var KX_RANDOMACT_FLOAT_NORMAL: See L{SCA_RandomActuator} -@var KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL: See L{SCA_RandomActuator} - -@group Action Actuator: KX_ACTIONACT_* -@var KX_ACTIONACT_PLAY: See L{BL_ActionActuator} -@var KX_ACTIONACT_FLIPPER: See L{BL_ActionActuator} -@var KX_ACTIONACT_LOOPSTOP: See L{BL_ActionActuator} -@var KX_ACTIONACT_LOOPEND: See L{BL_ActionActuator} -@var KX_ACTIONACT_PROPERTY: See L{BL_ActionActuator} - -@group Sound Actuator: KX_SOUNDACT_* -@var KX_SOUNDACT_PLAYSTOP: See L{KX_SoundActuator} -@var KX_SOUNDACT_PLAYEND: See L{KX_SoundActuator} -@var KX_SOUNDACT_LOOPSTOP: See L{KX_SoundActuator} -@var KX_SOUNDACT_LOOPEND: See L{KX_SoundActuator} -@var KX_SOUNDACT_LOOPBIDIRECTIONAL: See L{KX_SoundActuator} -@var KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP: See L{KX_SoundActuator} - -@group Radar Sensor: KX_RADAR_* -@var KX_RADAR_AXIS_POS_X: See L{KX_RadarSensor} -@var KX_RADAR_AXIS_POS_Y: See L{KX_RadarSensor} -@var KX_RADAR_AXIS_POS_Z: See L{KX_RadarSensor} -@var KX_RADAR_AXIS_NEG_X: See L{KX_RadarSensor} -@var KX_RADAR_AXIS_NEG_Y: See L{KX_RadarSensor} -@var KX_RADAR_AXIS_NEG_Z: See L{KX_RadarSensor} - -@group Ray Sensor: KX_RAY_* -@var KX_RAY_AXIS_POS_X: See L{KX_RaySensor} -@var KX_RAY_AXIS_POS_Y: See L{KX_RaySensor} -@var KX_RAY_AXIS_POS_Z: See L{KX_RaySensor} -@var KX_RAY_AXIS_NEG_X: See L{KX_RaySensor} -@var KX_RAY_AXIS_NEG_Y: See L{KX_RaySensor} -@var KX_RAY_AXIS_NEG_Z: See L{KX_RaySensor} - -@group Dynamic Actuator: KX_DYN_* -@var KX_DYN_RESTORE_DYNAMICS: See L{KX_SCA_DynamicActuator} -@var KX_DYN_DISABLE_DYNAMICS: See L{KX_SCA_DynamicActuator} -@var KX_DYN_ENABLE_RIGID_BODY: See L{KX_SCA_DynamicActuator} -@var KX_DYN_DISABLE_RIGID_BODY: See L{KX_SCA_DynamicActuator} -@var KX_DYN_SET_MASS: See L{KX_SCA_DynamicActuator} - -@group Game Actuator: KX_GAME_* -@var KX_GAME_LOAD: See L{KX_GameActuator} -@var KX_GAME_START: See L{KX_GameActuator} -@var KX_GAME_RESTART: See L{KX_GameActuator} -@var KX_GAME_QUIT: See L{KX_GameActuator} -@var KX_GAME_SAVECFG: See L{KX_GameActuator} -@var KX_GAME_LOADCFG: See L{KX_GameActuator} - -@group Scene Actuator: KX_SCENE_* -@var KX_SCENE_RESTART: See L{KX_SceneActuator} -@var KX_SCENE_SET_SCENE: See L{KX_SceneActuator} -@var KX_SCENE_SET_CAMERA: See L{KX_SceneActuator} -@var KX_SCENE_ADD_FRONT_SCENE: See L{KX_SceneActuator} -@var KX_SCENE_ADD_BACK_SCENE: See L{KX_SceneActuator} -@var KX_SCENE_REMOVE_SCENE: See L{KX_SceneActuator} -@var KX_SCENE_SUSPEND: See L{KX_SceneActuator} -@var KX_SCENE_RESUME: See L{KX_SceneActuator} - -@group Input Status: KX_INPUT_* -@var KX_INPUT_NONE: See L{SCA_MouseSensor} -@var KX_INPUT_JUST_ACTIVATED: See L{SCA_MouseSensor} -@var KX_INPUT_ACTIVE: See L{SCA_MouseSensor} -@var KX_INPUT_JUST_RELEASED: See L{SCA_MouseSensor} - - -@group Mouse Buttons: KX_MOUSE_BUT_* -@var KX_MOUSE_BUT_LEFT: See L{SCA_MouseSensor} -@var KX_MOUSE_BUT_MIDDLE: See L{SCA_MouseSensor} -@var KX_MOUSE_BUT_RIGHT: See L{SCA_MouseSensor} - -@group States: KX_STATE* -@var KX_STATE1: -@var KX_STATE10: -@var KX_STATE11: -@var KX_STATE12: -@var KX_STATE13: -@var KX_STATE14: -@var KX_STATE15: -@var KX_STATE16: -@var KX_STATE17: -@var KX_STATE18: -@var KX_STATE19: -@var KX_STATE2: -@var KX_STATE20: -@var KX_STATE21: -@var KX_STATE22: -@var KX_STATE23: -@var KX_STATE24: -@var KX_STATE25: -@var KX_STATE26: -@var KX_STATE27: -@var KX_STATE28: -@var KX_STATE29: -@var KX_STATE3: -@var KX_STATE30: -@var KX_STATE4: -@var KX_STATE5: -@var KX_STATE6: -@var KX_STATE7: -@var KX_STATE8: -@var KX_STATE9: -@var KX_STATE_OP_CLR: -@var KX_STATE_OP_CPY: -@var KX_STATE_OP_NEG: -@var KX_STATE_OP_SET: - -@group 2D Filter: RAS_2DFILTER_* -@var RAS_2DFILTER_BLUR: -@var RAS_2DFILTER_CUSTOMFILTER: -@var RAS_2DFILTER_DILATION: -@var RAS_2DFILTER_DISABLED: -@var RAS_2DFILTER_ENABLED: -@var RAS_2DFILTER_EROSION: -@var RAS_2DFILTER_GRAYSCALE: -@var RAS_2DFILTER_INVERT: -@var RAS_2DFILTER_LAPLACIAN: -@var RAS_2DFILTER_MOTIONBLUR: -@var RAS_2DFILTER_NOFILTER: -@var RAS_2DFILTER_PREWITT: -@var RAS_2DFILTER_SEPIA: -@var RAS_2DFILTER_SHARPEN: -@var RAS_2DFILTER_SOBEL: - -@group Constraint Actuator: KX_ACT_CONSTRAINT_* -@var KX_ACT_CONSTRAINT_DISTANCE: -@var KX_ACT_CONSTRAINT_DOROTFH: -@var KX_ACT_CONSTRAINT_FHNX: -@var KX_ACT_CONSTRAINT_FHNY: -@var KX_ACT_CONSTRAINT_FHNZ: -@var KX_ACT_CONSTRAINT_FHPX: -@var KX_ACT_CONSTRAINT_FHPY: -@var KX_ACT_CONSTRAINT_FHPZ: -@var KX_ACT_CONSTRAINT_LOCAL: -@var KX_ACT_CONSTRAINT_MATERIAL: -@var KX_ACT_CONSTRAINT_NORMAL: -@var KX_ACT_CONSTRAINT_PERMANENT: - -@group Parent Actuator: KX_PARENT_* -@var KX_PARENT_REMOVE: -@var KX_PARENT_SET: - -@group Shader: MODELMATRIX*, MODELVIEWMATRIX*, VIEWMATRIX*, CAM_POS, CONSTANT_TIMER, SHD_TANGENT -@var VIEWMATRIX: -@var VIEWMATRIX_INVERSE: -@var VIEWMATRIX_INVERSETRANSPOSE: -@var VIEWMATRIX_TRANSPOSE: -@var MODELMATRIX: -@var MODELMATRIX_INVERSE: -@var MODELMATRIX_INVERSETRANSPOSE: -@var MODELMATRIX_TRANSPOSE: -@var MODELVIEWMATRIX: -@var MODELVIEWMATRIX_INVERSE: -@var MODELVIEWMATRIX_INVERSETRANSPOSE: -@var MODELVIEWMATRIX_TRANSPOSE: -@var CAM_POS: Current camera position -@var CONSTANT_TIMER: User a timer for the uniform value. -@var SHD_TANGENT: Not yet documented. - -@group Blender Material: BL_* -@var BL_DST_ALPHA: -@var BL_DST_COLOR: -@var BL_ONE: -@var BL_ONE_MINUS_DST_ALPHA: -@var BL_ONE_MINUS_DST_COLOR: -@var BL_ONE_MINUS_SRC_ALPHA: -@var BL_ONE_MINUS_SRC_COLOR: -@var BL_SRC_ALPHA: -@var BL_SRC_ALPHA_SATURATE: -@var BL_SRC_COLOR: -@var BL_ZERO: - -@group Deprecated: addActiveActuator - -@var globalDict: A dictionary that is saved between loading blend files so you can use - it to store inventory and other variables you want to store between - scenes and blend files. It can also be written to a file and loaded - later on with the game load/save actuators. - note: only python built in types such as int/string/bool/float/tuples/lists - can be saved, GameObjects, Actuators etc will not work as expectred. -""" - -import GameTypes - -# TODO -# error - -def getCurrentController(): - """ - Gets the Python controller associated with this Python script. - - @rtype: L{SCA_PythonController} - """ -def getCurrentScene(): - """ - Gets the current Scene. - - @rtype: L{KX_Scene} - """ -def getSceneList(): - """ - Gets a list of the current scenes loaded in the game engine. - - @note: Scenes in your blend file that have not been converted wont be in this list. This list will only contain scenes such as overlays scenes. - - @rtype: list of L{KX_Scene} - """ -def addActiveActuator(actuator, activate): - """ - Activates the given actuator. - - @deprecated: Use L{GameTypes.SCA_PythonController.activate} and L{GameTypes.SCA_PythonController.deactivate} instead. - @type actuator: L{SCA_IActuator} or the actuator name as a string. - @type activate: boolean - @param activate: whether to activate or deactivate the given actuator. - """ -def loadGlobalDict(): - """ - Loads GameLogic.globalDict from a file. - """ -def saveGlobalDict(): - """ - Saves GameLogic.globalDict to a file. - """ -def addScene(name, overlay=1): - """ - Loads a scene into the game engine. - - @param name: The name of the scene - @type name: string - @param body: Overlay or underlay (optional) - @type body: int - """ -def sendMessage(subject, body="", to="", message_from=""): - """ - Sends a message to sensors in any active scene. - - @param subject: The subject of the message - @type subject: string - @param body: The body of the message (optional) - @type body: string - @param to: The name of the object to send the message to (optional) - @type to: string - @param message_from: The name of the object that the message is coming from (optional) - @type message_from: string - """ -def setGravity(gravity): - """ - Sets the world gravity. - - @type gravity: list [fx, fy, fz] - """ -def getSpectrum(): - """ - Returns a 512 point list from the sound card. - This only works if the fmod sound driver is being used. - - @rtype: list [float], len(getSpectrum()) == 512 - """ -def stopDSP(): - """ - Stops the sound driver using DSP effects. - - Only the fmod sound driver supports this. - DSP can be computationally expensive. - """ -def getMaxLogicFrame(): - """ - Gets the maximum number of logic frame per render frame. - - @return: The maximum number of logic frame per render frame - @rtype: interger - """ -def setMaxLogicFrame(maxlogic): - """ - Sets the maximum number of logic frame that are executed per render frame. - This does not affect the physic system that still runs at full frame rate. - - @param maxlogic: The new maximum number of logic frame per render frame. Valid values: 1..5 - @type maxlogic: integer - """ -def getMaxPhysicsFrame(): - """ - Gets the maximum number of physics frame per render frame. - - @return: The maximum number of physics frame per render frame - @rtype: interger - """ -def setMaxPhysicsFrame(maxphysics): - """ - Sets the maximum number of physics timestep that are executed per render frame. - Higher value allows physics to keep up with realtime even if graphics slows down the game. - Physics timestep is fixed and equal to 1/tickrate (see setLogicTicRate) - maxphysics/ticrate is the maximum delay of the renderer that physics can compensate. - - @param maxphysics: The new maximum number of physics timestep per render frame. Valid values: 1..5. - @type maxphysics: integer - """ -def getLogicTicRate(): - """ - Gets the logic update frequency. - - @return: The logic frequency in Hz - @rtype: float - """ -def setLogicTicRate(ticrate): - """ - Sets the logic update frequency. - - The logic update frequency is the number of times logic bricks are executed every second. - The default is 60 Hz. - - @param ticrate: The new logic update frequency (in Hz). - @type ticrate: float - """ -def getPhysicsTicRate(): - """ - NOT IMPLEMENTED - Gets the physics update frequency - - @return: The physics update frequency in Hz - @rtype: float - """ -def setPhysicsTicRate(ticrate): - """ - NOT IMPLEMENTED - Sets the physics update frequency - - The physics update frequency is the number of times the physics system is executed every second. - The default is 60 Hz. - - @param ticrate: The new update frequency (in Hz). - @type ticrate: float - """ -def saveGlobalDict(): - """ - Saves GameLogic.globalDict to a file. - """ -def loadGlobalDict(): - """ - Loads GameLogic.globalDict from a file. - """ - -#{ Utility functions -def getAverageFrameRate(): - """ - Gets the estimated average framerate - - @return: The estimed average framerate in frames per second - @rtype: float - """ -def expandPath(path): - """ - Converts a blender internal path into a proper file system path. - - Use / as directory separator in path - You can use '//' at the start of the string to define a relative path; - Blender replaces that string by the directory of the startup .blend or runtime file - to make a full path name (doesn't change during the game, even if you load other .blend). - The function also converts the directory separator to the local file system format. - - @param path: The path string to be converted/expanded. - @type path: string - @return: The converted string - @rtype: string - """ - -def getBlendFileList(path = "//"): - """ - Returns a list of blend files in the same directory as the open blend file, or from using the option argument. - - @param path: Optional directory argument, will be expanded (like expandPath) into the full path. - @type path: string - @return: A list of filenames, with no directory prefix - @rtype: list - """ -def PrintGLInfo(): - """ - Prints GL Extension Info into the console - """ -def getRandomFloat(): - """ - Returns a random floating point value in the range [0...1) - """ -#} diff --git a/source/gameengine/PyDoc/GameTypes.py b/source/gameengine/PyDoc/GameTypes.py deleted file mode 100644 index cae1b875a1b..00000000000 --- a/source/gameengine/PyDoc/GameTypes.py +++ /dev/null @@ -1,6133 +0,0 @@ -""" -Documentation for the GameTypes Module. -======================================= - -@group Base: PyObjectPlus, CValue, CPropValue, SCA_ILogicBrick, SCA_IObject, SCA_ISensor, SCA_IController, SCA_IActuator - -@group Object: KX_GameObject, KX_LightObject, KX_Camera, BL_ArmatureObject - -@group Animation: BL_ArmatureConstraint - -@group Mesh: KX_MeshProxy, KX_PolyProxy, KX_VertexProxy - -@group Shading: KX_PolygonMaterial, KX_BlenderMaterial, BL_Shader - -@group Sensors: SCA_ActuatorSensor, SCA_AlwaysSensor, SCA_DelaySensor, SCA_JoystickSensor, SCA_KeyboardSensor, KX_MouseFocusSensor, SCA_MouseSensor, KX_NearSensor, KX_NetworkMessageSensor, SCA_PropertySensor, KX_RadarSensor, SCA_RandomSensor, KX_RaySensor, KX_TouchSensor, KX_ArmatureSensor - -@group Actuators: SCA_2DFilterActuator, BL_ActionActuator, BL_ArmatureActuator, KX_SCA_AddObjectActuator, KX_CameraActuator, KX_ConstraintActuator, KX_SCA_DynamicActuator, KX_SCA_EndObjectActuator, KX_GameActuator, KX_IpoActuator, KX_NetworkMessageActuator, KX_ObjectActuator, KX_ParentActuator, SCA_PropertyActuator, SCA_RandomActuator, KX_SCA_ReplaceMeshActuator, KX_SceneActuator, BL_ShapeActionActuator, KX_SoundActuator, KX_StateActuator, KX_TrackToActuator, KX_VisibilityActuator - -@group Controllers: SCA_ANDController, SCA_NANDController, SCA_NORController, SCA_ORController, SCA_PythonController, SCA_XNORController, SCA_XORController -""" -import GameLogic - -class PyObjectPlus: - """ - PyObjectPlus base class of most other types in the Game Engine. - - @ivar invalid: Test if the object has been freed by the game engine and is no longer valid. - - Normally this is not a problem but when storing game engine data in the GameLogic module, - KX_Scenes or other KX_GameObjects its possible to hold a reference to invalid data. - Calling an attribute or method on an invalid object will raise a SystemError. - - The invalid attribute allows testing for this case without exception handling. - @type invalid: bool - """ - - def isA(game_type): - """ - Check if this is a type or a subtype game_type. - - @param game_type: the name of the type or the type its self from the L{GameTypes} module. - @type game_type: string or type - @return: True if this object is a type or a subtype of game_type. - @rtype: bool - """ - -class CValue(PyObjectPlus): - """ - This class is a basis for other classes. - @ivar name: The name of this CValue derived object (read-only). - @type name: string - @group Deprecated: getName - """ - def getName(): - """ - Returns the name of the CValue. - - @deprecated: Use the L{name} attribute instead. - @note: in most cases the CValue's subclasses will override this function. - @rtype: string - """ - -class CPropValue(CValue): - """ - This class has no python functions - """ - pass - -class SCA_ILogicBrick(CValue): - """ - Base class for all logic bricks. - - @ivar executePriority: This determines the order controllers are evaluated, and actuators are activated (lower priority is executed first). - @type executePriority: int - @ivar owner: The game object this logic brick is attached to (read-only). - @type owner: L{KX_GameObject} or None in exceptional cases. - @ivar name: The name of this logic brick (read-only). - @type name: string - """ - -#{ Deprecated - def getOwner(): - """ - Gets the game object associated with this logic brick. - - @deprecated: Use the L{owner} attribute instead. - @rtype: L{KX_GameObject} - """ - - def setExecutePriority(priority): - """ - Sets the priority of this logic brick. - - This determines the order controllers are evaluated, and actuators are activated. - Bricks with lower priority will be executed first. - - @deprecated: Use the L{executePriority} attribute instead. - @type priority: integer - @param priority: the priority of this logic brick. - """ - def getExecutePriority(): - """ - Gets the execution priority of this logic brick. - - @deprecated: Use the L{executePriority} attribute instead. - @rtype: integer - @return: this logic bricks current priority. - """ -#} - -class SCA_IObject(CValue): - """ - This class has no python functions - """ - pass - -class SCA_ISensor(SCA_ILogicBrick): - """ - Base class for all sensor logic bricks. - - @ivar usePosPulseMode: Flag to turn positive pulse mode on and off. - @type usePosPulseMode: boolean - @ivar useNegPulseMode: Flag to turn negative pulse mode on and off. - @type useNegPulseMode: boolean - @ivar frequency: The frequency for pulse mode sensors. - @type frequency: int - @ivar level: Option whether to detect level or edge transition when entering a state. - It makes a difference only in case of logic state transition (state actuator). - A level detector will immediately generate a pulse, negative or positive - depending on the sensor condition, as soon as the state is activated. - A edge detector will wait for a state change before generating a pulse. - note: mutually exclusive with L{tap}, enabling will disable L{tap}. - @type level: boolean - @ivar tap: When enabled only sensors that are just activated will send a positive event, - after this they will be detected as negative by the controllers. - This will make a key thats held act as if its only tapped for an instant. - note: mutually exclusive with L{level}, enabling will disable L{level}. - @type tap: boolean - @ivar invert: Flag to set if this sensor activates on positive or negative events. - @type invert: boolean - @ivar triggered: True if this sensor brick is in a positive state. (read-only) - @type triggered: boolean - @ivar positive: True if this sensor brick is in a positive state. (read-only) - @type positive: boolean - @ivar status: The status of the sensor. (read-only) - KX_SENSOR_INACTIVE, KX_SENSOR_JUST_ACTIVATED, - KX_SENSOR_ACTIVE, KX_SENSOR_JUST_DEACTIVATED - Note: this convenient attribute combines the values of triggered and positive attributes - @type status: int from 0-3. - """ - - def reset(): - """ - Reset sensor internal state, effect depends on the type of sensor and settings. - - The sensor is put in its initial state as if it was just activated. - """ -#{ Deprecated - def isPositive(): - """ - True if this sensor brick is in a positive state. - - @deprecated: use L{positive} - """ - - def isTriggered(): - """ - True if this sensor brick has triggered the current controller. - - @deprecated: use L{triggered} - """ - - def getUsePosPulseMode(): - """ - True if the sensor is in positive pulse mode. - - @deprecated: use L{usePosPulseMode} - """ - def setUsePosPulseMode(pulse): - """ - Sets positive pulse mode. - - @type pulse: boolean - @param pulse: If True, will activate positive pulse mode for this sensor. - @deprecated: use L{usePosPulseMode} - """ - def getFrequency(): - """ - The frequency for pulse mode sensors. - - @rtype: integer - @return: the pulse frequency in 1/50 sec. - @deprecated: use L{frequency} - """ - def setFrequency(freq): - """ - Sets the frequency for pulse mode sensors. - - @type freq: integer - @return: the pulse frequency in 1/50 sec. - @deprecated: use L{frequency} - """ - def getUseNegPulseMode(): - """ - True if the sensor is in negative pulse mode. - - @deprecated: use L{useNegPulseMode} - """ - def setUseNegPulseMode(pulse): - """ - Sets negative pulse mode. - - @type pulse: boolean - @param pulse: If True, will activate negative pulse mode for this sensor. - @deprecated: use L{useNegPulseMode} - """ - def getInvert(): - """ - True if this sensor activates on negative events. - - @deprecated: use L{invert} - """ - def setInvert(invert): - """ - Sets if this sensor activates on positive or negative events. - - @type invert: boolean - @param invert: true if activates on negative events; false if activates on positive events. - @deprecated: use L{invert} - """ - def getLevel(): - """ - Returns whether this sensor is a level detector or a edge detector. - It makes a difference only in case of logic state transition (state actuator). - A level detector will immediately generate a pulse, negative or positive - depending on the sensor condition, as soon as the state is activated. - A edge detector will wait for a state change before generating a pulse. - - @rtype: boolean - @return: true if sensor is level sensitive, false if it is edge sensitive - @deprecated: use L{level} - """ - def setLevel(level): - """ - Set whether to detect level or edge transition when entering a state. - - @param level: Detect level instead of edge? (KX_TRUE, KX_FALSE) - @type level: boolean - @deprecated: use L{level} - """ -#} - -class SCA_IController(SCA_ILogicBrick): - """ - Base class for all controller logic bricks. - - @ivar state: the controllers state bitmask. - This can be used with the GameObject's state to test if the controller is active. - @type state: int bitmask - @ivar sensors: a list of sensors linked to this controller - - note: the sensors are not necessarily owned by the same object. - - note: when objects are instanced in dupligroups links may be lost from objects outside the dupligroup. - @type sensors: sequence supporting index/string lookups and iteration. - @ivar actuators: a list of actuators linked to this controller. - - note: the sensors are not necessarily owned by the same object. - - note: when objects are instanced in dupligroups links may be lost from objects outside the dupligroup. - @type actuators: sequence supporting index/string lookups and iteration. - @ivar useHighPriority: When set the controller executes always before all other controllers that dont have this set. - note: Order of execution between high priority controllers is not guaranteed. - @type useHighPriority: bool - """ -#{ Deprecated - def getState(): - """ - Get the controllers state bitmask, this can be used with the GameObject's state to test if the the controller is active. - This for instance will always be true however you could compare with a previous state to see when the state was activated. - GameLogic.getCurrentController().state & GameLogic.getCurrentController().owner.state - @deprecated: Use the L{state} property - @rtype: int - """ - def getSensors(): - """ - Gets a list of all sensors attached to this controller. - @deprecated: use the L{sensors} property - @rtype: list [L{SCA_ISensor}] - """ - def getSensor(name): - """ - Gets the named linked sensor. - @deprecated: use the L{sensors}[name] property - @type name: string - @rtype: L{SCA_ISensor} - """ - def getActuators(): - """ - Gets a list of all actuators linked to this controller. - @deprecated: Use the L{actuators} property - @rtype: list [L{SCA_IActuator}] - """ - def getActuator(name): - """ - Gets the named linked actuator. - @deprecated: use the L{actuators}[name] property - @type name: string - @rtype: L{SCA_IActuator} - """ -#} - -class SCA_IActuator(SCA_ILogicBrick): - """ - Base class for all actuator logic bricks. - """ - -class BL_ActionActuator(SCA_IActuator): - """ - Action Actuators apply an action to an actor. - - @ivar action: The name of the action to set as the current action. - @type action: string - @ivar channelNames: A list of channel names that may be used with L{setChannel} and L{getChannel} - @type channelNames: list of strings - @ivar frameStart: Specifies the starting frame of the animation. - @type frameStart: float - @ivar frameEnd: Specifies the ending frame of the animation. - @type frameEnd: float - @ivar blendIn: Specifies the number of frames of animation to generate when making transitions between actions. - @type blendIn: float - @ivar priority: Sets the priority of this actuator. Actuators will lower - priority numbers will override actuators with higher - numbers. - @type priority: integer - @ivar frame: Sets the current frame for the animation. - @type frame: float - @ivar propName: Sets the property to be used in FromProp playback mode. - @type propName: string - @ivar blendTime: Sets the internal frame timer. This property must be in - the range from 0.0 to blendIn. - @type blendTime: float - @ivar mode: The operation mode of the actuator. KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY, KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND - @type mode: integer - @ivar useContinue: The actions continue option, True or False. - When True, the action will always play from where last left off, - otherwise negative events to this actuator will reset it to its start frame. - @type useContinue: boolean - @ivar framePropName: The name of the property that is set to the current frame number. - @type framePropName: string - """ - def setChannel(channel, matrix): - """ - Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported. - - @note: These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation. - @param channel: A string specifying the name of the bone channel, error raised if not in L{channelNames}. - @type channel: string - @param matrix: A 4x4 matrix specifying the overriding transformation - as an offset from the bone's rest position. - @type matrix: list [[float]] - """ - - def getChannel(channel): - """ - @param channel: A string specifying the name of the bone channel. error raised if not in L{channelNames}. - @type channel: string - @rtype: tuple - @return: (loc, size, quat) - """ - -#{ Deprecated - def setAction(action, reset = True): - """ - Sets the current action. - @deprecated: use the L{action} property - @param action: The name of the action to set as the current action. - @type action: string - @param reset: Optional parameter indicating whether to reset the - blend timer or not. A value of 1 indicates that the - timer should be reset. A value of 0 will leave it - unchanged. If reset is not specified, the timer will - be reset. - """ - - def setStart(start): - """ - Specifies the starting frame of the animation. - @deprecated: Use the L{frameStart} property - @param start: the starting frame of the animation - @type start: float - """ - - def setEnd(end): - """ - Specifies the ending frame of the animation. - @deprecated: use the L{frameEnd} property - @param end: the ending frame of the animation - @type end: float - """ - def setBlendin(blendin): - """ - Specifies the number of frames of animation to generate - when making transitions between actions. - @deprecated: use the L{blendIn} property - @param blendin: the number of frames in transition. - @type blendin: float - """ - - def setPriority(priority): - """ - Sets the priority of this actuator. - - @deprecated: Use use the L{priority} property - @param priority: Specifies the new priority. Actuators will lower - priority numbers will override actuators with higher - numbers. - @type priority: integer - """ - def setFrame(frame): - """ - Sets the current frame for the animation. - - @deprecated: use the L{frame} property - @param frame: Specifies the new current frame for the animation - @type frame: float - """ - - def setProperty(prop): - """ - Sets the property to be used in FromProp playback mode. - - @deprecated: use the L{property} property - @param prop: the name of the property to use. - @type prop: string. - """ - - def setBlendtime(blendtime): - """ - Sets the internal frame timer. - - Allows the script to directly modify the internal timer - used when generating transitions between actions. - - @deprecated: use the L{blendTime} property - @param blendtime: The new time. This parameter must be in the range from 0.0 to 1.0. - @type blendtime: float - """ - - def setType(mode): - """ - Sets the operation mode of the actuator - - @deprecated: use the L{type} property - @param mode: KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY, KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND - @type mode: integer - """ - - def setContinue(cont): - """ - Set the actions continue option True or False. see getContinue. - - @deprecated: use the L{useContinue} property - @param cont: The continue option. - @type cont: bool - """ - - def getType(): - """ - Returns the operation mode of the actuator - - @deprecated: use the L{type} property - @rtype: integer - @return: KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY, KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND - """ - - def getContinue(): - """ - When True, the action will always play from where last left off, otherwise negative events to this actuator will reset it to its start frame. - - @deprecated: use the L{useContinue} property - @rtype: bool - """ - - def getAction(): - """ - getAction() returns the name of the action associated with this actuator. - - @deprecated: use the L{action} property - @rtype: string - """ - - def getStart(): - """ - Returns the starting frame of the action. - - @deprecated: use the L{frameStart} property - @rtype: float - """ - def getEnd(): - """ - Returns the last frame of the action. - - @deprecated: use the L{frameEnd} property - @rtype: float - """ - def getBlendin(): - """ - Returns the number of interpolation animation frames to be generated when this actuator is triggered. - - @deprecated: use the L{blendIn} property - @rtype: float - """ - def getPriority(): - """ - Returns the priority for this actuator. Actuators with lower Priority numbers will - override actuators with higher numbers. - - @deprecated: use the L{priority} property - @rtype: integer - """ - def getFrame(): - """ - Returns the current frame number. - - @deprecated: use the L{frame} property - @rtype: float - """ - def getProperty(): - """ - Returns the name of the property to be used in FromProp mode. - - @deprecated: use the L{property} property - @rtype: string - """ - def setFrameProperty(prop): - """ - @deprecated: use the L{framePropName} property - @param prop: A string specifying the property of the object that will be updated with the action frame number. - @type prop: string - """ - def getFrameProperty(): - """ - Returns the name of the property that is set to the current frame number. - - @deprecated: use the L{framePropName} property - @rtype: string - """ -#} - -class BL_Shader(PyObjectPlus): - """ - BL_Shader GLSL shaders. - - TODO - Description - """ - - def setUniformfv(name, fList): - """ - Set a uniform with a list of float values - - @param name: the uniform name - @type name: string - - @param fList: a list (2, 3 or 4 elements) of float values - @type fList: list[float] - """ - - def delSource(): - """ - Clear the shader. Use this method before the source is changed with L{setSource}. - """ - def getFragmentProg(): - """ - Returns the fragment program. - - @rtype: string - @return: The fragment program. - """ - def getVertexProg(): - """ - Get the vertex program. - - @rtype: string - @return: The vertex program. - """ - def isValid(): - """ - Check if the shader is valid. - - @rtype: bool - @return: True if the shader is valid - """ - def setAttrib(enum): - """ - Set attribute location. (The parameter is ignored a.t.m. and the value of "tangent" is always used.) - - @param enum: attribute location value - @type enum: integer - """ - def setNumberOfPasses( max_pass ): - """ - Set the maximum number of passes. Not used a.t.m. - - @param max_pass: the maximum number of passes - @type max_pass: integer - """ - def setSampler(name, index): - """ - Set uniform texture sample index. - - @param name: Uniform name - @type name: string - - @param index: Texture sample index. - @type index: integer - """ - def setSource(vertexProgram, fragmentProgram): - """ - Set the vertex and fragment programs - - @param vertexProgram: Vertex program - @type vertexProgram: string - - @param fragmentProgram: Fragment program - @type fragmentProgram: string - """ - def setUniform1f(name, fx): - """ - Set a uniform with 1 float value. - - @param name: the uniform name - @type name: string - - @param fx: Uniform value - @type fx: float - """ - def setUniform1i(name, ix): - """ - Set a uniform with an integer value. - - @param name: the uniform name - @type name: string - - @param ix: the uniform value - @type ix: integer - """ - def setUniform2f(name, fx, fy): - """ - Set a uniform with 2 float values - - @param name: the uniform name - @type name: string - - @param fx: first float value - @type fx: float - - @param fy: second float value - @type fy: float - """ - def setUniform2i(name, ix, iy): - """ - Set a uniform with 2 integer values - - @param name: the uniform name - @type name: string - - @param ix: first integer value - @type ix: integer - - @param iy: second integer value - @type iy: integer - """ - def setUniform3f(name, fx,fy,fz): - """ - Set a uniform with 3 float values. - - @param name: the uniform name - @type name: string - - @param fx: first float value - @type fx: float - - @param fy: second float value - @type fy: float - - @param fz: third float value - @type fz: float - """ - def setUniform3i(name, ix,iy,iz): - """ - Set a uniform with 3 integer values - - @param name: the uniform name - @type name: string - - @param ix: first integer value - @type ix: integer - - @param iy: second integer value - @type iy: integer - - @param iz: third integer value - @type iz: integer - """ - def setUniform4f(name, fx,fy,fz,fw): - """ - Set a uniform with 4 float values. - - @param name: the uniform name - @type name: string - - @param fx: first float value - @type fx: float - - @param fy: second float value - @type fy: float - - @param fz: third float value - @type fz: float - - @param fw: fourth float value - @type fw: float - """ - def setUniform4i(name, ix,iy,iz, iw): - """ - Set a uniform with 4 integer values - - @param name: the uniform name - @type name: string - - @param ix: first integer value - @type ix: integer - - @param iy: second integer value - @type iy: integer - - @param iz: third integer value - @type iz: integer - - @param iw: fourth integer value - @type iw: integer - """ - def setUniformDef(name, type): - """ - Define a new uniform - - @param name: the uniform name - @type name: string - - @param type: uniform type - @type type: UNI_NONE, UNI_INT, UNI_FLOAT, UNI_INT2, UNI_FLOAT2, UNI_INT3, UNI_FLOAT3, UNI_INT4, UNI_FLOAT4, UNI_MAT3, UNI_MAT4, UNI_MAX - """ - def setUniformMatrix3(name, mat, transpose): - """ - Set a uniform with a 3x3 matrix value - - @param name: the uniform name - @type name: string - - @param mat: A 3x3 matrix [[f,f,f], [f,f,f], [f,f,f]] - @type mat: 3x3 matrix - - @param transpose: set to True to transpose the matrix - @type transpose: bool - """ - def setUniformMatrix4(name, mat, transpose): - """ - Set a uniform with a 4x4 matrix value - - @param name: the uniform name - @type name: string - - @param mat: A 4x4 matrix [[f,f,f,f], [f,f,f,f], [f,f,f,f], [f,f,f,f]] - @type mat: 4x4 matrix - - @param transpose: set to True to transpose the matrix - @type transpose: bool - """ - def setUniformiv(name, iList): - """ - Set a uniform with a list of integer values - - @param name: the uniform name - @type name: string - - @param iList: a list (2, 3 or 4 elements) of integer values - @type iList: list[integer] - """ - def validate(): - """ - Validate the shader object. - - """ - -class BL_ShapeActionActuator(SCA_IActuator): - """ - ShapeAction Actuators apply an shape action to an mesh object.\ - - @ivar action: The name of the action to set as the current shape action. - @type action: string - @ivar frameStart: Specifies the starting frame of the shape animation. - @type frameStart: float - @ivar frameEnd: Specifies the ending frame of the shape animation. - @type frameEnd: float - @ivar blendIn: Specifies the number of frames of animation to generate when making transitions between actions. - @type blendIn: float - @ivar priority: Sets the priority of this actuator. Actuators will lower - priority numbers will override actuators with higher - numbers. - @type priority: integer - @ivar frame: Sets the current frame for the animation. - @type frame: float - @ivar propName: Sets the property to be used in FromProp playback mode. - @type propName: string - @ivar blendTime: Sets the internal frame timer. This property must be in - the range from 0.0 to blendin. - @type blendTime: float - @ivar mode: The operation mode of the actuator. - KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY, KX_ACTIONACT_FLIPPER, - KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND - @type mode: integer - @ivar framePropName: The name of the property that is set to the current frame number. - @type framePropName: string - - """ -#{ Deprecated - def setAction(action, reset = True): - """ - Sets the current action. - - @deprecated: use the L{action} property - @param action: The name of the action to set as the current action. - @type action: string - @param reset: Optional parameter indicating whether to reset the - blend timer or not. A value of 1 indicates that the - timer should be reset. A value of 0 will leave it - unchanged. If reset is not specified, the timer will - be reset. - """ - - def setStart(start): - """ - Specifies the starting frame of the animation. - - @deprecated: use the L{frameStart} property - @param start: the starting frame of the animation - @type start: float - """ - - def setEnd(end): - """ - Specifies the ending frame of the animation. - - @deprecated: use the L{frameEnd} property - @param end: the ending frame of the animation - @type end: float - """ - def setBlendin(blendin): - """ - Specifies the number of frames of animation to generate - when making transitions between actions. - - @deprecated: use the L{blendIn} property - @param blendin: the number of frames in transition. - @type blendin: float - """ - - def setPriority(priority): - """ - Sets the priority of this actuator. - - @deprecated: use the L{priority} property - @param priority: Specifies the new priority. Actuators will lower - priority numbers will override actuators with higher - numbers. - @type priority: integer - """ - def setFrame(frame): - """ - Sets the current frame for the animation. - - @deprecated: use the L{frame} property - @param frame: Specifies the new current frame for the animation - @type frame: float - """ - - def setProperty(prop): - """ - Sets the property to be used in FromProp playback mode. - - @deprecated: use the L{property} property - @param prop: the name of the property to use. - @type prop: string. - """ - - def setBlendtime(blendtime): - """ - Sets the internal frame timer. - - Allows the script to directly modify the internal timer - used when generating transitions between actions. - - @deprecated: use the L{blendTime} property - @param blendtime: The new time. This parameter must be in the range from 0.0 to 1.0. - @type blendtime: float - """ - - def setType(mode): - """ - Sets the operation mode of the actuator - - @deprecated: use the L{type} property - @param mode: KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY, KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND - @type mode: integer - """ - - def getType(): - """ - Returns the operation mode of the actuator - - @deprecated: use the L{type} property - @rtype: integer - @return: KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY, KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND - """ - - def getAction(): - """ - getAction() returns the name of the action associated with this actuator. - - @deprecated: use the L{action} property - @rtype: string - """ - - def getStart(): - """ - Returns the starting frame of the action. - - @deprecated: use the L{frameStart} property - @rtype: float - """ - def getEnd(): - """ - Returns the last frame of the action. - - @deprecated: use the L{frameEnd} property - @rtype: float - """ - def getBlendin(): - """ - Returns the number of interpolation animation frames to be generated when this actuator is triggered. - - @deprecated: use the L{blendIn} property - @rtype: float - """ - def getPriority(): - """ - Returns the priority for this actuator. Actuators with lower Priority numbers will - override actuators with higher numbers. - - @deprecated: use the L{priority} property - @rtype: integer - """ - def getFrame(): - """ - Returns the current frame number. - - @deprecated: use the L{frame} property - @rtype: float - """ - def getProperty(): - """ - Returns the name of the property to be used in FromProp mode. - - @deprecated: use the L{property} property - @rtype: string - """ - def setFrameProperty(prop): - """ - @deprecated: use the L{framePropName} property - @param prop: A string specifying the property of the object that will be updated with the action frame number. - @type prop: string - """ - def getFrameProperty(): - """ - Returns the name of the property that is set to the current frame number. - - @deprecated: use the L{framePropName} property - @rtype: string - """ -#} - -class CListValue(CPropValue): - """ - CListValue - - This is a list like object used in the game engine internally that behaves similar to a python list in most ways. - - As well as the normal index lookup. - C{val= clist[i]} - - CListValue supports string lookups. - C{val= scene.objects["Cube"]} - - Other operations such as C{len(clist), list(clist), clist[0:10]} are also supported. - """ - def append(val): - """ - Add an item to the list (like pythons append) - - Warning: Appending values to the list can cause crashes when the list is used internally by the game engine. - """ - - def count(val): - """ - Count the number of instances of a value in the list. - - @rtype: integer - @return: number of instances - """ - def index(val): - """ - Return the index of a value in the list. - - @rtype: integer - @return: The index of the value in the list. - """ - def reverse(): - """ - Reverse the order of the list. - """ - def get(key, default=None): - """ - Return the value matching key, or the default value if its not found. - @return: The key value or a default. - """ - def from_id(id): - """ - This is a funtion especially for the game engine to return a value with a spesific id. - - Since object names are not always unique, the id of an object can be used to get an object from the CValueList. - - Example. - - C{myObID = id(gameObject)} - - C{...} - - C{ob= scene.objects.from_id(myObID)} - - Where myObID is an int or long from the id function. - - This has the advantage that you can store the id in places you could not store a gameObject. - - Warning: the id is derived from a memory location and will be different each time the game engine starts. - """ - -class KX_BlenderMaterial(PyObjectPlus): # , RAS_IPolyMaterial) - """ - KX_BlenderMaterial - - """ - - def getShader(): - """ - Returns the material's shader. - - @rtype: L{BL_Shader} - @return: the material's shader - """ - - def setBlending(src, dest): - """ - Set the pixel color arithmetic functions. - - @param src: Specifies how the red, green, blue, - and alpha source blending factors are computed. - @type src: GL_ZERO, - GL_ONE, - GL_SRC_COLOR, - GL_ONE_MINUS_SRC_COLOR, - GL_DST_COLOR, - GL_ONE_MINUS_DST_COLOR, - GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA, - GL_SRC_ALPHA_SATURATE - - - @param dest: Specifies how the red, green, blue, - and alpha destination blending factors are computed. - @type dest: GL_ZERO, - GL_ONE, - GL_SRC_COLOR, - GL_ONE_MINUS_SRC_COLOR, - GL_DST_COLOR, - GL_ONE_MINUS_DST_COLOR, - GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA, - GL_SRC_ALPHA_SATURATE - - """ - def getMaterialIndex(): - """ - Returns the material's index. - - @rtype: integer - @return: the material's index - """ - -class KX_CameraActuator(SCA_IActuator): - """ - Applies changes to a camera. - - @ivar min: minimum distance to the target object maintained by the actuator - @type min: float - @ivar max: maximum distance to stay from the target object - @type max: float - @ivar height: height to stay above the target object - @type height: float - @ivar useXY: axis this actuator is tracking, true=X, false=Y - @type useXY: boolean - @ivar object: the object this actuator tracks. - @type object: KX_GameObject or None - @author: snail - """ -#{ Deprecated - def getObject(name_only = 1): - """ - Returns the name of the object this actuator tracks. - - @deprecated: Use the L{object} attribute instead. - @type name_only: bool - @param name_only: optional argument, when 0 return a KX_GameObject - @rtype: string, KX_GameObject or None if no object is set - """ - - def setObject(target): - """ - Sets the object this actuator tracks. - - @deprecated: Use the L{object} attribute instead. - @param target: the object to track. - @type target: L{KX_GameObject}, string or None - """ - - def getMin(): - """ - Returns the minimum distance to target maintained by the actuator. - - @deprecated: Use the L{min} attribute instead. - @rtype: float - """ - - def setMin(distance): - """ - Sets the minimum distance to the target object maintained by the - actuator. - - @deprecated: Use the L{min} attribute instead. - @param distance: The minimum distance to maintain. - @type distance: float - """ - - def getMax(): - """ - Gets the maximum distance to stay from the target object. - - @deprecated: Use the L{max} attribute instead. - @rtype: float - """ - - def setMax(distance): - """ - Sets the maximum distance to stay from the target object. - - @deprecated: Use the L{max} attribute instead. - @param distance: The maximum distance to maintain. - @type distance: float - """ - - def getHeight(): - """ - Returns the height to stay above the target object. - - @deprecated: Use the L{height} attribute instead. - @rtype: float - """ - - def setHeight(height): - """ - Sets the height to stay above the target object. - - @deprecated: Use the L{height} attribute instead. - @type height: float - @param height: The height to stay above the target object. - """ - - def setXY(xaxis): - """ - Sets the axis to get behind. - - @deprecated: Use the L{useXY} attribute instead. - @param xaxis: False to track Y axis, True to track X axis. - @type xaxis: boolean - """ - - def getXY(): - """ - Returns the axis this actuator is tracking. - - @deprecated: Use the L{useXY} attribute instead. - @return: True if tracking X axis, False if tracking Y axis. - @rtype: boolean - """ -#} - -class KX_ConstraintActuator(SCA_IActuator): - """ - A constraint actuator limits the position, rotation, distance or orientation of an object. - - Properties: - - @ivar damp: time constant of the constraint expressed in frame (not use by Force field constraint) - @type damp: integer - - @ivar rotDamp: time constant for the rotation expressed in frame (only for the distance constraint) - 0 = use damp for rotation as well - @type rotDamp: integer - - @ivar direction: the reference direction in world coordinate for the orientation constraint - @type direction: 3-tuple of float: [x,y,z] - - @ivar option: Binary combination of the following values: - Applicable to Distance constraint: - - KX_ACT_CONSTRAINT_NORMAL ( 64) : Activate alignment to surface - - KX_ACT_CONSTRAINT_DISTANCE ( 512) : Activate distance control - - KX_ACT_CONSTRAINT_LOCAL (1024) : direction of the ray is along the local axis - Applicable to Force field constraint: - - KX_ACT_CONSTRAINT_DOROTFH (2048) : Force field act on rotation as well - Applicable to both: - - KX_ACT_CONSTRAINT_MATERIAL ( 128) : Detect material rather than property - - KX_ACT_CONSTRAINT_PERMANENT ( 256) : No deactivation if ray does not hit target - @type option: integer - - @ivar time: activation time of the actuator. The actuator disables itself after this many frame. - If set to 0, the actuator is not limited in time. - @type time: integer - - @ivar propName: the name of the property or material for the ray detection of the distance constraint. - @type propName: string - - @ivar min: The lower bound of the constraint - For the rotation and orientation constraint, it represents radiant - @type min: float - - @ivar distance: the target distance of the distance constraint - @type distance: float - - @ivar max: the upper bound of the constraint. - For rotation and orientation constraints, it represents radiant. - @type max: float - - @ivar rayLength: the length of the ray of the distance constraint. - @type rayLength: float - - @ivar limit: type of constraint, use one of the following constant: - KX_ACT_CONSTRAINT_LOCX ( 1) : limit X coord - KX_ACT_CONSTRAINT_LOCY ( 2) : limit Y coord - KX_ACT_CONSTRAINT_LOCZ ( 3) : limit Z coord - KX_ACT_CONSTRAINT_ROTX ( 4) : limit X rotation - KX_ACT_CONSTRAINT_ROTY ( 5) : limit Y rotation - KX_ACT_CONSTRAINT_ROTZ ( 6) : limit Z rotation - KX_ACT_CONSTRAINT_DIRPX ( 7) : set distance along positive X axis - KX_ACT_CONSTRAINT_DIRPY ( 8) : set distance along positive Y axis - KX_ACT_CONSTRAINT_DIRPZ ( 9) : set distance along positive Z axis - KX_ACT_CONSTRAINT_DIRNX (10) : set distance along negative X axis - KX_ACT_CONSTRAINT_DIRNY (11) : set distance along negative Y axis - KX_ACT_CONSTRAINT_DIRNZ (12) : set distance along negative Z axis - KX_ACT_CONSTRAINT_ORIX (13) : set orientation of X axis - KX_ACT_CONSTRAINT_ORIY (14) : set orientation of Y axis - KX_ACT_CONSTRAINT_ORIZ (15) : set orientation of Z axis - KX_ACT_CONSTRAINT_FHPX (16) : set force field along positive X axis - KX_ACT_CONSTRAINT_FHPY (17) : set force field along positive Y axis - KX_ACT_CONSTRAINT_FHPZ (18) : set force field along positive Z axis - KX_ACT_CONSTRAINT_FHNX (19) : set force field along negative X axis - KX_ACT_CONSTRAINT_FHNY (20) : set force field along negative Y axis - KX_ACT_CONSTRAINT_FHNZ (21) : set force field along negative Z axis - @type limit: integer - """ -#{ Deprecated - def setDamp(time): - """ - Sets the time this constraint is delayed. - - @param time: The number of frames to delay. - Negative values are ignored. - @type time: integer - """ - def getDamp(): - """ - Returns the damping time of the constraint. - - @rtype: integer - """ - def setMin(lower): - """ - Sets the lower bound of the constraint. - - For rotational and orientation constraints, lower is specified in degrees. - - @type lower: float - """ - def getMin(): - """ - Gets the lower bound of the constraint. - - For rotational and orientation constraints, the lower bound is returned in radians. - - @rtype: float - """ - def setMax(upper): - """ - Sets the upper bound of the constraint. - - For rotational and orientation constraints, upper is specified in degrees. - - @type upper: float - """ - def getMax(): - """ - Gets the upper bound of the constraint. - - For rotational and orientation constraints, the upper bound is returned in radians. - - @rtype: float - """ - def setLimit(limit): - """ - Sets the type of constraint. - - See module L{GameLogic} for valid constraint types. - - @param limit: - Position constraints: KX_CONSTRAINTACT_LOCX, KX_CONSTRAINTACT_LOCY, KX_CONSTRAINTACT_LOCZ - Rotation constraints: KX_CONSTRAINTACT_ROTX, KX_CONSTRAINTACT_ROTY or KX_CONSTRAINTACT_ROTZ - Distance contraints: KX_ACT_CONSTRAINT_DIRPX, KX_ACT_CONSTRAINT_DIRPY, KX_ACT_CONSTRAINT_DIRPZ, KX_ACT_CONSTRAINT_DIRNX, KX_ACT_CONSTRAINT_DIRNY, KX_ACT_CONSTRAINT_DIRNZ - Orientation constraints: KX_ACT_CONSTRAINT_ORIX, KX_ACT_CONSTRAINT_ORIY, KX_ACT_CONSTRAINT_ORIZ - """ - def getLimit(): - """ - Gets the type of constraint. - - See module L{GameLogic} for valid constraints. - - @return: - Position constraints: KX_CONSTRAINTACT_LOCX, KX_CONSTRAINTACT_LOCY, KX_CONSTRAINTACT_LOCZ, - Rotation constraints: KX_CONSTRAINTACT_ROTX, KX_CONSTRAINTACT_ROTY, KX_CONSTRAINTACT_ROTZ, - Distance contraints: KX_ACT_CONSTRAINT_DIRPX, KX_ACT_CONSTRAINT_DIRPY, KX_ACT_CONSTRAINT_DIRPZ, KX_ACT_CONSTRAINT_DIRNX, KX_ACT_CONSTRAINT_DIRNY, KX_ACT_CONSTRAINT_DIRNZ, - Orientation constraints: KX_ACT_CONSTRAINT_ORIX, KX_ACT_CONSTRAINT_ORIY, KX_ACT_CONSTRAINT_ORIZ - """ - def setRotDamp(duration): - """ - Sets the time constant of the orientation constraint. - - @param duration: If the duration is negative, it is set to 0. - @type duration: integer - """ - def getRotDamp(): - """ - Returns the damping time for application of the constraint. - - @rtype: integer - """ - def setDirection(vector): - """ - Sets the reference direction in world coordinate for the orientation constraint - - @type vector: 3-tuple - """ - def getDirection(): - """ - Returns the reference direction of the orientation constraint in world coordinate. - - @rtype: 3-tuple - """ - def setOption(option): - """ - Sets several options of the distance constraint. - - @type option: integer - @param option: Binary combination of the following values: - 64 : Activate alignment to surface - 128 : Detect material rather than property - 256 : No deactivation if ray does not hit target - 512 : Activate distance control - """ - def getOption(): - """ - Returns the option parameter. - - @rtype: integer - """ - def setTime(duration): - """ - Sets the activation time of the actuator. - - @type duration: integer - @param duration: The actuator disables itself after this many frame. - If set to 0 or negative, the actuator is not limited in time. - """ - def getTime(): - """ - Returns the time parameter. - - @rtype: integer - """ - def setProperty(property): - """ - Sets the name of the property or material for the ray detection of the distance constraint. - - @type property: string - @param property: If empty, the ray will detect any collisioning object. - """ - def getProperty(): - """ - Returns the property parameter. - - @rtype: string - """ - def setDistance(distance): - """ - Sets the target distance in distance constraint. - - @type distance: float - """ - def getDistance(): - """ - Returns the distance parameter. - - @rtype: float - """ - def setRayLength(length): - """ - Sets the maximum ray length of the distance constraint. - - @type length: float - """ - def getRayLength(): - """ - Returns the length of the ray - - @rtype: float - """ -#} - -class KX_ConstraintWrapper(PyObjectPlus): - """ - KX_ConstraintWrapper - - """ - def getConstraintId(val): - """ - Returns the contraint's ID - - @rtype: integer - @return: the constraint's ID - """ - -class KX_GameActuator(SCA_IActuator): - """ - The game actuator loads a new .blend file, restarts the current .blend file or quits the game. - - Properties: - - @ivar fileName: the new .blend file to load - @type fileName: string. - @ivar mode: The mode of this actuator - @type mode: Constant in... - - L{GameLogic.KX_GAME_LOAD} - - L{GameLogic.KX_GAME_START} - - L{GameLogic.KX_GAME_RESTART} - - L{GameLogic.KX_GAME_QUIT} - - L{GameLogic.KX_GAME_SAVECFG} - - L{GameLogic.KX_GAME_LOADCFG} - """ -#{ Deprecated - def getFile(): - """ - Returns the filename of the new .blend file to load. - - @deprecated: use the L{fileName} property - @rtype: string - """ - def setFile(filename): - """ - Sets the new .blend file to load. - - @deprecated: use the L{fileName} property - @param filename: The file name this actuator will load. - @type filename: string - """ -#} - -class KX_GameObject(SCA_IObject): - """ - All game objects are derived from this class. - - Properties assigned to game objects are accessible as attributes of this class. - - note: Calling ANY method or attribute on an object that has been removed from a scene will raise a SystemError, if an object may have been removed since last accessing it use the L{invalid} attribute to check. - - @ivar name: The object's name. (read-only) - @type name: string. - @ivar mass: The object's mass - - note: The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0 - @type mass: float - @ivar linVelocityMin: Enforces the object keeps moving at a minimum velocity. - - note: Applies to dynamic and rigid body objects only. - - note: A value of 0.0 disables this option. - - note: While objects are stationary the minimum velocity will not be applied. - @type linVelocityMin: float - @ivar linVelocityMax: Clamp the maximum linear velocity to prevent objects moving beyond a set speed. - - note: Applies to dynamic and rigid body objects only. - - note: A value of 0.0 disables this option (rather then setting it stationary). - @type linVelocityMax: float - @ivar localInertia: the object's inertia vector in local coordinates. Read only. - @type localInertia: list [ix, iy, iz] - @ivar parent: The object's parent object. (read-only) - @type parent: L{KX_GameObject} or None - @ivar visible: visibility flag. - - note: Game logic will still run for invisible objects. - @type visible: boolean - @ivar color: The object color of the object - @type color: list [r, g, b, a] - @ivar occlusion: occlusion capability flag. - @type occlusion: boolean - @ivar position: The object's position. - - deprecated: use L{localPosition} and L{worldPosition} - @type position: list [x, y, z] On write: local position, on read: world position - @ivar orientation: The object's orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. - - deprecated: use L{localOrientation} and L{worldOrientation} - @type orientation: 3x3 Matrix [[float]] On write: local orientation, on read: world orientation - @ivar scaling: The object's scaling factor. list [sx, sy, sz] - - deprecated: use L{localScale} and L{worldScale} - @type scaling: list [sx, sy, sz] On write: local scaling, on read: world scaling - @ivar localOrientation: The object's local orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. - @type localOrientation: 3x3 Matrix [[float]] - @ivar worldOrientation: The object's world orientation. - @type worldOrientation: 3x3 Matrix [[float]] - @ivar localScale: The object's local scaling factor. - @type localScale: list [sx, sy, sz] - @ivar worldScale: The object's world scaling factor. Read-only - @type worldScale: list [sx, sy, sz] - @ivar localPosition: The object's local position. - @type localPosition: list [x, y, z] - @ivar worldPosition: The object's world position. - @type worldPosition: list [x, y, z] - @ivar timeOffset: adjust the slowparent delay at runtime. - @type timeOffset: float - @ivar state: the game object's state bitmask, using the first 30 bits, one bit must always be set. - @type state: int - @ivar meshes: a list meshes for this object. - - note: Most objects use only 1 mesh. - - note: Changes to this list will not update the KX_GameObject. - @type meshes: list of L{KX_MeshProxy} - @ivar sensors: a sequence of L{SCA_ISensor} objects with string/index lookups and iterator support. - - note: This attribute is experemental and may be removed (but probably wont be). - - note: Changes to this list will not update the KX_GameObject. - @type sensors: list - @ivar controllers: a sequence of L{SCA_IController} objects with string/index lookups and iterator support. - - note: This attribute is experemental and may be removed (but probably wont be). - - note: Changes to this list will not update the KX_GameObject. - @type controllers: list of L{SCA_ISensor}. - @ivar actuators: a list of L{SCA_IActuator} with string/index lookups and iterator support. - - note: This attribute is experemental and may be removed (but probably wont be). - - note: Changes to this list will not update the KX_GameObject. - @type actuators: list - @ivar attrDict: get the objects internal python attribute dictionary for direct (faster) access. - @type attrDict: dict - @ivar children: direct children of this object, (read-only). - @type children: L{CListValue} of L{KX_GameObject}'s - @ivar childrenRecursive: all children of this object including childrens children, (read-only). - @type childrenRecursive: L{CListValue} of L{KX_GameObject}'s - @group Deprecated: getPosition, setPosition, setWorldPosition, getOrientation, setOrientation, getState, setState, getParent, getVisible, getMass, getMesh, getChildren, getChildrenRecursive - @group Property Access: get, attrDict, getPropertyNames - """ - def endObject(): - """ - Delete this object, can be used in place of the EndObject Actuator. - The actual removal of the object from the scene is delayed. - """ - def replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False): - """ - Replace the mesh of this object with a new mesh. This works the same was as the actuator. - @type mesh: L{KX_MeshProxy} or mesh name - @type useDisplayMesh: bool - @param useDisplayMesh: when enabled the display mesh will be replaced (optional argument). - @type usePhysicsMesh: bool - @param usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument). - """ - def getVisible(): - """ - Gets the game object's visible flag. - - @deprecated: use L{visible} - @rtype: boolean - """ - def setVisible(visible, recursive): - """ - Sets the game object's visible flag. - - @type visible: boolean - @type recursive: boolean - @param recursive: optional argument to set all childrens visibility flag too. - """ - def setOcclusion(occlusion, recursive): - """ - Sets the game object's occlusion capability. - - @type occlusion: boolean - @type recursive: boolean - @param recursive: optional argument to set all childrens occlusion flag too. - """ - def getState(): - """ - Gets the game object's state bitmask. - - @deprecated: use L{state} - @rtype: int - @return: the objects state. - """ - def setState(state): - """ - Sets the game object's state flag. - The bitmasks for states from 1 to 30 can be set with (1<<0, 1<<1, 1<<2 ... 1<<29) - @deprecated: use L{state} - @type state: integer - """ - def setPosition(pos): - """ - Sets the game object's position. - Global coordinates for root object, local for child objects. - - @deprecated: use L{localPosition} - @type pos: [x, y, z] - @param pos: the new position, in local coordinates. - """ - def setWorldPosition(pos): - """ - Sets the game object's position in world coordinates regardless if the object is root or child. - - @deprecated: use L{worldPosition} - @type pos: [x, y, z] - @param pos: the new position, in world coordinates. - """ - def getPosition(): - """ - Gets the game object's position. - - @deprecated: use L{worldPosition} - @rtype: list [x, y, z] - @return: the object's position in world coordinates. - """ - def setOrientation(orn): - """ - Sets the game object's orientation. - - @deprecated: use L{localOrientation} - @type orn: 3x3 rotation matrix, or Quaternion. - @param orn: a rotation matrix specifying the new rotation. - @note: When using this matrix with Blender.Mathutils.Matrix() types, it will need to be transposed. - """ - def alignAxisToVect(vect, axis, factor): - """ - Aligns any of the game object's axis along the given vector. - - @type vect: 3d vector. - @param vect: a vector to align the axis. - @type axis: integer. - @param axis:The axis you want to align - - 0: X axis - - 1: Y axis - - 2: Z axis (default) - @type factor: float - @param factor: Only rotate a feaction of the distance to the target vector (0.0 - 1.0) - """ - def getAxisVect(vect): - """ - Returns the axis vector rotates by the objects worldspace orientation. - This is the equivalent of multiplying the vector by the orientation matrix. - - @type vect: 3d vector. - @param vect: a vector to align the axis. - @rtype: 3d vector. - @return: The vector in relation to the objects rotation. - - """ - def getOrientation(): - """ - Gets the game object's orientation. - - @deprecated: use L{worldOrientation} - @rtype: 3x3 rotation matrix - @return: The game object's rotation matrix - @note: When using this matrix with Blender.Mathutils.Matrix() types, it will need to be transposed. - """ - def applyMovement(movement, local = 0): - """ - Sets the game object's movement. - - @type movement: 3d vector. - @param movement: movement vector. - @type local: boolean - @param local: - False: you get the "global" movement ie: relative to world orientation (default). - - True: you get the "local" movement ie: relative to object orientation. - """ - def applyRotation(rotation, local = 0): - """ - Sets the game object's rotation. - - @type rotation: 3d vector. - @param rotation: rotation vector. - @type local: boolean - @param local: - False: you get the "global" rotation ie: relative to world orientation (default). - - True: you get the "local" rotation ie: relative to object orientation. - """ - def applyForce(force, local = 0): - """ - Sets the game object's force. - - This requires a dynamic object. - - @type force: 3d vector. - @param force: force vector. - @type local: boolean - @param local: - False: you get the "global" force ie: relative to world orientation (default). - - True: you get the "local" force ie: relative to object orientation. - """ - def applyTorque(torque, local = 0): - """ - Sets the game object's torque. - - This requires a dynamic object. - - @type torque: 3d vector. - @param torque: torque vector. - @type local: boolean - @param local: - False: you get the "global" torque ie: relative to world orientation (default). - - True: you get the "local" torque ie: relative to object orientation. - """ - def getLinearVelocity(local = 0): - """ - Gets the game object's linear velocity. - - This method returns the game object's velocity through it's centre of mass, - ie no angular velocity component. - - @type local: boolean - @param local: - False: you get the "global" velocity ie: relative to world orientation (default). - - True: you get the "local" velocity ie: relative to object orientation. - @rtype: list [vx, vy, vz] - @return: the object's linear velocity. - """ - def setLinearVelocity(velocity, local = 0): - """ - Sets the game object's linear velocity. - - This method sets game object's velocity through it's centre of mass, - ie no angular velocity component. - - This requires a dynamic object. - - @type velocity: 3d vector. - @param velocity: linear velocity vector. - @type local: boolean - @param local: - False: you get the "global" velocity ie: relative to world orientation (default). - - True: you get the "local" velocity ie: relative to object orientation. - """ - def getAngularVelocity(local = 0): - """ - Gets the game object's angular velocity. - - @type local: boolean - @param local: - False: you get the "global" velocity ie: relative to world orientation (default). - - True: you get the "local" velocity ie: relative to object orientation. - @rtype: list [vx, vy, vz] - @return: the object's angular velocity. - """ - def setAngularVelocity(velocity, local = 0): - """ - Sets the game object's angular velocity. - - This requires a dynamic object. - - @type velocity: 3d vector. - @param velocity: angular velocity vector. - @type local: boolean - @param local: - False: you get the "global" velocity ie: relative to world orientation (default). - - True: you get the "local" velocity ie: relative to object orientation. - """ - def getVelocity(point): - """ - Gets the game object's velocity at the specified point. - - Gets the game object's velocity at the specified point, including angular - components. - - @type point: list [x, y, z] - @param point: the point to return the velocity for, in local coordinates. (optional: default = [0, 0, 0]) - @rtype: list [vx, vy, vz] - @return: the velocity at the specified point. - """ - def getMass(): - """ - Gets the game object's mass. - - @deprecated: use L{mass} - @rtype: float - @return: the object's mass. - """ - def getReactionForce(): - """ - Gets the game object's reaction force. - - The reaction force is the force applied to this object over the last simulation timestep. - This also includes impulses, eg from collisions. - - (B{This is not implimented for bullet physics at the moment}) - - @rtype: list [fx, fy, fz] - @return: the reaction force of this object. - """ - def applyImpulse(point, impulse): - """ - Applies an impulse to the game object. - - This will apply the specified impulse to the game object at the specified point. - If point != getPosition(), applyImpulse will also change the object's angular momentum. - Otherwise, only linear momentum will change. - - @type point: list [x, y, z] - @param point: the point to apply the impulse to (in world coordinates) - """ - def suspendDynamics(): - """ - Suspends physics for this object. - """ - def restoreDynamics(): - """ - Resumes physics for this object. - @Note: The objects linear velocity will be applied from when the dynamics were suspended. - """ - def enableRigidBody(): - """ - Enables rigid body physics for this object. - - Rigid body physics allows the object to roll on collisions. - @Note: This is not working with bullet physics yet. - """ - def disableRigidBody(): - """ - Disables rigid body physics for this object. - @Note: This is not working with bullet physics yet. The angular is removed but rigid body physics can still rotate it later. - """ - def getParent(): - """ - Gets this object's parent. - - @deprecated: use L{parent} - @rtype: L{KX_GameObject} - @return: this object's parent object, or None if this object has no parent. - """ - def setParent(parent,compound,ghost): - """ - Sets this object's parent. - Control the shape status with the optional compound and ghost parameters: - compound=1: the object shape should be added to the parent compound shape (default) - compound=0: the object should keep its individual shape. - In that case you can control if it should be ghost or not: - ghost=1 if the object should be made ghost while parented (default) - ghost=0 if the object should be solid while parented - Note: if the object type is sensor, it stays ghost regardless of ghost parameter - - @type parent: L{KX_GameObject} - @param parent: new parent object. - @type compound: int - @param compound: whether the shape should be added to the parent compound shape - @type ghost: int - @param ghost: whether the object should be ghost while parented - """ - def removeParent(): - """ - Removes this objects parent. - """ - def getChildren(): - """ - Return a list of immediate children of this object. - @rtype: L{CListValue} of L{KX_GameObject} - @return: a list of all this objects children. - """ - def getChildrenRecursive(): - """ - Return a list of children of this object, including all their childrens children. - @rtype: L{CListValue} of L{KX_GameObject} - @return: a list of all this objects children recursivly. - """ - def getMesh(mesh): - """ - Gets the mesh object for this object. - - @type mesh: integer - @param mesh: the mesh object to return (optional: default mesh = 0) - @rtype: L{KX_MeshProxy} - @return: the first mesh object associated with this game object, or None if this object has no meshs. - """ - def getPhysicsId(): - """ - Returns the user data object associated with this game object's physics controller. - """ - def getPropertyNames(): - """ - Gets a list of all property names. - @rtype: list - @return: All property names for this object. - """ - def getDistanceTo(other): - """ - Returns the distance to another object or point. - - @param other: a point or another L{KX_GameObject} to measure the distance to. - @type other: L{KX_GameObject} or list [x, y, z] - @rtype: float - """ - def getVectTo(other): - """ - Returns the vector and the distance to another object or point. - The vector is normalized unless the distance is 0, in which a NULL vector is returned. - - @param other: a point or another L{KX_GameObject} to get the vector and distance to. - @type other: L{KX_GameObject} or list [x, y, z] - @rtype: 3-tuple (float, 3-tuple (x,y,z), 3-tuple (x,y,z)) - @return: (distance, globalVector(3), localVector(3)) - """ - def rayCastTo(other,dist,prop): - """ - Look towards another point/object and find first object hit within dist that matches prop. - - The ray is always casted from the center of the object, ignoring the object itself. - The ray is casted towards the center of another object or an explicit [x,y,z] point. - Use rayCast() if you need to retrieve the hit point - - @param other: [x,y,z] or object towards which the ray is casted - @type other: L{KX_GameObject} or 3-tuple - @param dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other - @type dist: float - @param prop: property name that object must have; can be omitted => detect any object - @type prop: string - @rtype: L{KX_GameObject} - @return: the first object hit or None if no object or object does not match prop - """ - def rayCast(objto,objfrom,dist,prop,face,xray,poly): - """ - Look from a point/object to another point/object and find first object hit within dist that matches prop. - if poly is 0, returns a 3-tuple with object reference, hit point and hit normal or (None,None,None) if no hit. - if poly is 1, returns a 4-tuple with in addition a L{KX_PolyProxy} as 4th element. - if poly is 2, returns a 5-tuple with in addition a 2D vector with the UV mapping of the hit point as 5th element. - - Ex:: - # shoot along the axis gun-gunAim (gunAim should be collision-free) - ob,point,normal = gun.rayCast(gunAim,None,50) - if ob: - # hit something - - Notes: - The ray ignores the object on which the method is called. - It is casted from/to object center or explicit [x,y,z] points. - - The face paremeter determines the orientation of the normal:: - 0 => hit normal is always oriented towards the ray origin (as if you casted the ray from outside) - 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect) - - The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray. - The prop and xray parameters interact as follow:: - prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray. - prop off, xray on : idem. - prop on, xray off: return closest hit if it matches prop, no hit otherwise. - prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray. - The L{KX_PolyProxy} 4th element of the return tuple when poly=1 allows to retrieve information on the polygon hit by the ray. - If there is no hit or the hit object is not a static mesh, None is returned as 4th element. - - The ray ignores collision-free objects and faces that dont have the collision flag enabled, you can however use ghost objects. - - @param objto: [x,y,z] or object to which the ray is casted - @type objto: L{KX_GameObject} or 3-tuple - @param objfrom: [x,y,z] or object from which the ray is casted; None or omitted => use self object center - @type objfrom: L{KX_GameObject} or 3-tuple or None - @param dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to to - @type dist: float - @param prop: property name that object must have; can be omitted or "" => detect any object - @type prop: string - @param face: normal option: 1=>return face normal; 0 or omitted => normal is oriented towards origin - @type face: int - @param xray: X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object - @type xray: int - @param poly: polygon option: 0,1 or 2 to return a 3-, 4- or 5-tuple with information on the face hit - 0 or omitted=> return value is a 3-tuple (object, hitpoint, hitnormal) or (None,None,None) if no hit - 1=>return value is a 4-tuple and the 4th element is a L{KX_PolyProxy} or None if no hit or the object doesn't use a mesh collision shape. - 2=>return value is a 5-tuple and the 5th element is a 2-tuple (u,v) with the UV mapping of the hit point or None if no hit, or the object doesn't use a mesh collision shape, or doesn't have a UV mapping. - @type poly: int - @rtype: 3-tuple (L{KX_GameObject}, 3-tuple (x,y,z), 3-tuple (nx,ny,nz)) - or 4-tuple (L{KX_GameObject}, 3-tuple (x,y,z), 3-tuple (nx,ny,nz), L{KX_PolyProxy}) - or 5-tuple (L{KX_GameObject}, 3-tuple (x,y,z), 3-tuple (nx,ny,nz), L{KX_PolyProxy}, 2-tuple (u,v)) - @return: (object,hitpoint,hitnormal) or (object,hitpoint,hitnormal,polygon) or (object,hitpoint,hitnormal,polygon,hituv) - object, hitpoint and hitnormal are None if no hit. - polygon is valid only if the object is valid and is a static object, a dynamic object using mesh collision shape or a soft body object, otherwise it is None - hituv is valid only if polygon is valid and the object has a UV mapping, otherwise it is None - """ - def setCollisionMargin(margin): - """ - Set the objects collision margin. - - note: If this object has no physics controller (a physics ID of zero), this function will raise RuntimeError. - - @type margin: float - @param margin: the collision margin distance in blender units. - """ - def sendMessage(subject, body="", to=""): - """ - Sends a message. - - @param subject: The subject of the message - @type subject: string - @param body: The body of the message (optional) - @type body: string - @param to: The name of the object to send the message to (optional) - @type to: string - """ - def reinstancePhysicsMesh(gameObject, meshObject): - """ - Updates the physics system with the changed mesh. - - If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object. - - @param gameObject: optional argument, set the physics shape from this gameObjets mesh. - @type gameObject: string, L{KX_GameObject} or None - @param meshObject: optional argument, set the physics shape from this mesh. - @type meshObject: string, L{KX_MeshProxy} or None - - @note: if this object has instances the other instances will be updated too. - @note: the gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf). - @warning: only triangle mesh type objects are supported currently (not convex hull) - @warning: if the object is a part of a combound object it will fail (parent or child) - @warning: rebuilding the physics mesh can be slow, running many times per second will give a performance hit. - @rtype: boolean - @return: True if reinstance succeeded, False if it failed. - """ - - def get(key, default=None): - """ - Return the value matching key, or the default value if its not found. - @return: The key value or a default. - """ - - -class KX_IpoActuator(SCA_IActuator): - """ - IPO actuator activates an animation. - - @ivar frameStart: Start frame. - @type frameStart: float - @ivar frameEnd: End frame. - @type frameEnd: float - @ivar propName: Use this property to define the Ipo position - @type propName: string - @ivar framePropName: Assign this property this action current frame number - @type framePropName: string - @ivar mode: Play mode for the ipo. (In GameLogic.KX_IPOACT_PLAY, KX_IPOACT_PINGPONG, KX_IPOACT_FLIPPER, KX_IPOACT_LOOPSTOP, KX_IPOACT_LOOPEND, KX_IPOACT_FROM_PROP) - @type mode: int - @ivar useIpoAsForce: Apply Ipo as a global or local force depending on the local option (dynamic objects only) - @type useIpoAsForce: bool - @ivar useIpoAdd: Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag - @type useIpoAdd: bool - @ivar useIpoLocal: Let the ipo acts in local coordinates, used in Force and Add mode. - @type useIpoLocal: bool - @ivar useChildren: Update IPO on all children Objects as well - @type useChildren: bool - """ -#{ Deprecated - def set(mode, startframe, endframe, force): - """ - Sets the properties of the actuator. - - @deprecated: use other attributes. - @param mode: "Play", "PingPong", "Flipper", "LoopStop", "LoopEnd" or "FromProp" - @type mode: string - @param startframe: first frame to use - @type startframe: integer - @param endframe: last frame to use - @type endframe: integer - @param force: special mode - @type force: integer (0=normal, 1=interpret location as force, 2=additive) - """ - def setProperty(property): - """ - Sets the name of the property to be used in FromProp mode. - - @deprecated: use L{propName} - @type property: string - """ - def setStart(startframe): - """ - Sets the frame from which the IPO starts playing. - - @deprecated: use L{frameStart} - @type startframe: integer - """ - def getStart(): - """ - Returns the frame from which the IPO starts playing. - - @deprecated: use L{frameStart} - @rtype: integer - """ - def setEnd(endframe): - """ - Sets the frame at which the IPO stops playing. - - @deprecated: use L{frameEnd} - @type endframe: integer - """ - def getEnd(): - """ - Returns the frame at which the IPO stops playing. - - @deprecated: use L{frameEnd} - @rtype: integer - """ - def setIpoAsForce(force): - """ - Set whether to interpret the ipo as a force rather than a displacement. - - @deprecated: use L{useIpoAsForce} - @type force: boolean - @param force: KX_TRUE or KX_FALSE - """ - def getIpoAsForce(): - """ - Returns whether to interpret the ipo as a force rather than a displacement. - - @deprecated: use L{useIpoAsForce} - @rtype: boolean - """ - def setIpoAdd(add): - """ - Set whether to interpret the ipo as additive rather than absolute. - - @deprecated: use L{useIpoAdd} - @type add: boolean - @param add: KX_TRUE or KX_FALSE - """ - def getIpoAdd(): - """ - Returns whether to interpret the ipo as additive rather than absolute. - - @deprecated: use L{useIpoAdd} - @rtype: boolean - """ - def setType(mode): - """ - Sets the operation mode of the actuator. - - @deprecated: use L{type} - @param mode: KX_IPOACT_PLAY, KX_IPOACT_PINGPONG, KX_IPOACT_FLIPPER, KX_IPOACT_LOOPSTOP, KX_IPOACT_LOOPEND - @type mode: string - """ - def getType(): - """ - Returns the operation mode of the actuator. - - @deprecated: use L{type} - @rtype: integer - @return: KX_IPOACT_PLAY, KX_IPOACT_PINGPONG, KX_IPOACT_FLIPPER, KX_IPOACT_LOOPSTOP, KX_IPOACT_LOOPEND - """ - def setForceIpoActsLocal(local): - """ - Set whether to apply the force in the object's local - coordinates rather than the world global coordinates. - - @deprecated: use L{useIpoLocal} - @param local: Apply the ipo-as-force in the object's local - coordinates? (KX_TRUE, KX_FALSE) - @type local: boolean - """ - def getForceIpoActsLocal(): - """ - Return whether to apply the force in the object's local - coordinates rather than the world global coordinates. - - @deprecated: use L{useIpoLocal} - """ -#} - -class KX_LightObject(KX_GameObject): - """ - A Light object. - - Example: - - # Turn on a red alert light. - import GameLogic - - co = GameLogic.getCurrentController() - light = co.owner - - light.energy = 1.0 - light.colour = [1.0, 0.0, 0.0] - - @group Constants: NORMAL, SPOT, SUN - @ivar SPOT: A spot light source. See attribute 'type' - @ivar SUN: A point light source with no attenuation. See attribute 'type' - @ivar NORMAL: A point light source. See attribute 'type' - - @ivar type: The type of light - must be SPOT, SUN or NORMAL - @ivar layer: The layer mask that this light affects object on. - @type layer: bitfield - @ivar energy: The brightness of this light. - @type energy: float - @ivar distance: The maximum distance this light can illuminate. (SPOT and NORMAL lights only) - @type distance: float - @ivar colour: The colour of this light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0] - @type colour: list [r, g, b] - @ivar color: Synonym for colour. - @ivar lin_attenuation: The linear component of this light's attenuation. (SPOT and NORMAL lights only) - @type lin_attenuation: float - @ivar quad_attenuation: The quadratic component of this light's attenuation (SPOT and NORMAL lights only) - @type quad_attenuation: float - @ivar spotsize: The cone angle of the spot light, in degrees. (float) (SPOT lights only) - 0.0 <= spotsize <= 180.0. Spotsize = 360.0 is also accepted. - @ivar spotblend: Specifies the intensity distribution of the spot light. (float) (SPOT lights only) - Higher values result in a more focused light source. - 0.0 <= spotblend <= 1.0. - - """ - -class KX_MeshProxy(SCA_IObject): - """ - A mesh object. - - You can only change the vertex properties of a mesh object, not the mesh topology. - - To use mesh objects effectively, you should know a bit about how the game engine handles them. - 1. Mesh Objects are converted from Blender at scene load. - 2. The Converter groups polygons by Material. This means they can be sent to the - renderer efficiently. A material holds: - 1. The texture. - 2. The Blender material. - 3. The Tile properties - 4. The face properties - (From the "Texture Face" panel) - 5. Transparency & z sorting - 6. Light layer - 7. Polygon shape (triangle/quad) - 8. Game Object - 3. Verticies will be split by face if necessary. Verticies can only be shared between - faces if: - 1. They are at the same position - 2. UV coordinates are the same - 3. Their normals are the same (both polygons are "Set Smooth") - 4. They are the same colour - For example: a cube has 24 verticies: 6 faces with 4 verticies per face. - - The correct method of iterating over every L{KX_VertexProxy} in a game object:: - import GameLogic - - co = GameLogic.getCurrentController() - obj = co.owner - - m_i = 0 - mesh = obj.getMesh(m_i) # There can be more than one mesh... - while mesh != None: - for mat in range(mesh.getNumMaterials()): - for v_index in range(mesh.getVertexArrayLength(mat)): - vertex = mesh.getVertex(mat, v_index) - # Do something with vertex here... - # ... eg: colour the vertex red. - vertex.colour = [1.0, 0.0, 0.0, 1.0] - m_i += 1 - mesh = obj.getMesh(m_i) - - @ivar materials: - @type materials: list of L{KX_BlenderMaterial} or L{KX_PolygonMaterial} types - - @ivar numPolygons: - @type numPolygons: integer - - @ivar numMaterials: - @type numMaterials: integer - """ - - def getNumMaterials(): - """ - Gets the number of materials associated with this object. - - @rtype: integer - """ - - def getMaterialName(matid): - """ - Gets the name of the specified material. - - @type matid: integer - @param matid: the specified material. - @rtype: string - @return: the attached material name. - """ - def getTextureName(matid): - """ - Gets the name of the specified material's texture. - - @type matid: integer - @param matid: the specified material - @rtype: string - @return: the attached material's texture name. - """ - def getVertexArrayLength(matid): - """ - Gets the length of the vertex array associated with the specified material. - - There is one vertex array for each material. - - @type matid: integer - @param matid: the specified material - @rtype: integer - @return: the number of verticies in the vertex array. - """ - def getVertex(matid, index): - """ - Gets the specified vertex from the mesh object. - - @type matid: integer - @param matid: the specified material - @type index: integer - @param index: the index into the vertex array. - @rtype: L{KX_VertexProxy} - @return: a vertex object. - """ - def getNumPolygons(): - """ - Returns the number of polygon in the mesh. - - @rtype: integer - """ - def getPolygon(index): - """ - Gets the specified polygon from the mesh. - - @type index: integer - @param index: polygon number - @rtype: L{KX_PolyProxy} - @return: a polygon object. - """ - -class SCA_MouseSensor(SCA_ISensor): - """ - Mouse Sensor logic brick. - - Properties: - - @ivar position: current [x,y] coordinates of the mouse, in frame coordinates (pixels) - @type position: [integer,interger] - @ivar mode: sensor mode: 1=KX_MOUSESENSORMODE_LEFTBUTTON 2=KX_MOUSESENSORMODE_MIDDLEBUTTON - 3=KX_MOUSESENSORMODE_RIGHTBUTTON 4=KX_MOUSESENSORMODE_WHEELUP - 5=KX_MOUSESENSORMODE_WHEELDOWN 9=KX_MOUSESENSORMODE_MOVEMENT - @type mode: integer - """ - - def getXPosition(): - """ - Gets the x coordinate of the mouse. - - @deprecated: use the L{position} property - @rtype: integer - @return: the current x coordinate of the mouse, in frame coordinates (pixels) - """ - def getYPosition(): - """ - Gets the y coordinate of the mouse. - - @deprecated: use the L{position} property - @rtype: integer - @return: the current y coordinate of the mouse, in frame coordinates (pixels). - """ - def getButtonStatus(button): - """ - Get the mouse button status. - - @type button: int - @param button: value in GameLogic members KX_MOUSE_BUT_LEFT, KX_MOUSE_BUT_MIDDLE, KX_MOUSE_BUT_RIGHT - - @rtype: integer - @return: value in GameLogic members KX_INPUT_NONE, KX_INPUT_NONE, KX_INPUT_JUST_ACTIVATED, KX_INPUT_ACTIVE, KX_INPUT_JUST_RELEASED - """ - -class KX_MouseFocusSensor(SCA_MouseSensor): - """ - The mouse focus sensor detects when the mouse is over the current game object. - - The mouse focus sensor works by transforming the mouse coordinates from 2d device - space to 3d space then raycasting away from the camera. - - @ivar raySource: The worldspace source of the ray (the view position) - @type raySource: list (vector of 3 floats) - @ivar rayTarget: The worldspace target of the ray. - @type rayTarget: list (vector of 3 floats) - @ivar rayDirection: The L{rayTarget} - L{raySource} normalized. - @type rayDirection: list (normalized vector of 3 floats) - @ivar hitObject: the last object the mouse was over. - @type hitObject: L{KX_GameObject} or None - @ivar hitPosition: The worldspace position of the ray intersecton. - @type hitPosition: list (vector of 3 floats) - @ivar hitNormal: the worldspace normal from the face at point of intersection. - @type hitNormal: list (normalized vector of 3 floats) - @ivar hitUV: the UV coordinates at the point of intersection. - If the object has no UV mapping, it returns [0,0]. - The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping. - @type hitUV: list (vector of 2 floats) - @ivar usePulseFocus: When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set) - @type usePulseFocus: bool - """ -#{ Deprecated - def getHitNormal(): - """ - Returns the normal (in worldcoordinates) at the point of collision where the object was hit by this ray. - - @deprecated: use the L{hitNormal} property - @rtype: list [x, y, z] - @return: the ray collision normal. - """ - def getHitObject(): - """ - Returns the object that was hit by this ray or None. - - @deprecated: use the L{hitObject} property - @rtype: L{KX_GameObject} or None - @return: the collision object. - """ - def getHitPosition(): - """ - Returns the position (in worldcoordinates) at the point of collision where the object was hit by this ray. - - @deprecated: use the L{hitPosition} property - @rtype: list [x, y, z] - @return: the ray collision position. - """ - def getRayDirection(): - """ - Returns the normalized direction (in worldcoordinates) of the ray cast by the mouse. - - @deprecated: use the L{rayDirection} property - @rtype: list [x, y, z] - @return: the ray direction. - """ - def getRaySource(): - """ - Returns the position (in worldcoordinates) the ray was cast from by the mouse. - - @deprecated: use the L{raySource} property - @rtype: list [x, y, z] - @return: the ray source. - """ - def getRayTarget(): - """ - Returns the target of the ray (in worldcoordinates) that seeks the focus object. - - @deprecated: use the L{rayTarget} property - @rtype: list [x, y, z] - @return: the ray target. - """ -#} - -class KX_TouchSensor(SCA_ISensor): - """ - Touch sensor detects collisions between objects. - - @ivar propName: The property or material to collide with. - @type propName: string - @ivar useMaterial: Determines if the sensor is looking for a property or material. - KX_True = Find material; KX_False = Find property - @type useMaterial: boolean - @ivar usePulseCollision: When enabled, changes to the set of colliding objects generate a pulse. - @type usePulseCollision: bool - @ivar hitObject: The last collided object. (read-only) - @type hitObject: L{KX_GameObject} or None - @ivar hitObjectList: A list of colliding objects. (read-only) - @type hitObjectList: L{CListValue} of L{KX_GameObject} - """ -#{ Deprecated - def setProperty(name): - """ - Set the property or material to collide with. Use - setTouchMaterial() to switch between properties and - materials. - - @deprecated: use the L{property} property - @type name: string - """ - - def getProperty(): - """ - Returns the property or material to collide with. Use - getTouchMaterial() to find out whether this sensor - looks for properties or materials. - - @deprecated: use the L{property} property - @rtype: string - """ - def getHitObject(): - """ - Returns the last object hit by this touch sensor. - - @deprecated: use the L{hitObject} property - @rtype: L{KX_GameObject} - """ - def getHitObjectList(): - """ - Returns a list of all objects hit in the last frame. (B{deprecated}) - - Only objects that have the requisite material/property are listed. - - @deprecated: use the L{hitObjectList} property - @rtype: L{CListValue} of L{hitObjectList} - """ - def getTouchMaterial(): - """ - Returns KX_TRUE if this sensor looks for a specific material, - KX_FALSE if it looks for a specific property. (B{deprecated}) - - @deprecated: use the L{useMaterial} property - """ -#} - -class KX_NearSensor(KX_TouchSensor): - """ - A near sensor is a specialised form of touch sensor. - - @ivar distance: The near sensor activates when an object is within this distance. - @type distance: float - @ivar resetDistance: The near sensor deactivates when the object exceeds this distance. - @type resetDistance: float - """ - -class KX_NetworkMessageActuator(SCA_IActuator): - """ - Message Actuator - - @ivar propName: Messages will only be sent to objects with the given property name. - @type propName: string - @ivar subject: The subject field of the message. - @type subject: string - @ivar body: The body of the message. - @type body: string - @ivar usePropBody: Send a property instead of a regular body message. - @type usePropBody: boolean - """ -#{Deprecated - def setToPropName(name): - """ - Messages will only be sent to objects with the given property name. - - @deprecated: Use the L{propName} attribute instead. - @type name: string - """ - def setSubject(subject): - """ - Sets the subject field of the message. - - @deprecated: Use the L{subject} attribute instead. - @type subject: string - """ - def setBodyType(bodytype): - """ - Sets the type of body to send. - - @deprecated: Use the L{usePropBody} attribute instead. - @type bodytype: boolean - @param bodytype: True to send the value of a property, False to send the body text. - """ - def setBody(body): - """ - Sets the message body. - - @deprecated: Use the L{body} attribute instead. - @type body: string - @param body: if the body type is True, this is the name of the property to send. - if the body type is False, this is the text to send. - """ -#} - -class KX_NetworkMessageSensor(SCA_ISensor): - """ - The Message Sensor logic brick. - - Currently only loopback (local) networks are supported. - - @ivar subject: The subject the sensor is looking for. - @type subject: string - @ivar frameMessageCount: The number of messages received since the last frame. - (Read-only) - @type frameMessageCount: int - @ivar subjects: The list of message subjects received. (Read-only) - @type subjects: list of strings - @ivar bodies: The list of message bodies received. (Read-only) - @type bodies: list of strings - """ -#{ Deprecated - def setSubjectFilterText(subject): - """ - Change the message subject text that this sensor is listening to. - - @deprecated: Use the L{subject} attribute instead. - @type subject: string - @param subject: the new message subject to listen for. - """ - - def getFrameMessageCount(): - """ - Get the number of messages received since the last frame. - - @deprecated: Use the L{frameMessageCount} attribute instead. - @rtype: integer - """ - def getBodies(): - """ - Gets the list of message bodies. - - @deprecated: Use the L{bodies} attribute instead. - @rtype: list - """ - def getSubject(): - """ - Gets the message subject this sensor is listening for from the Subject: field. - - @deprecated: Use the L{subject} attribute instead. - @rtype: string - """ - def getSubjects(): - """ - Gets the list of message subjects received. - - @deprecated: Use the L{subjects} attribute instead. - @rtype: list - """ -#} - -class KX_ObjectActuator(SCA_IActuator): - """ - The object actuator ("Motion Actuator") applies force, torque, displacement, angular displacement, - velocity, or angular velocity to an object. - Servo control allows to regulate force to achieve a certain speed target. - - @ivar force: The force applied by the actuator - @type force: list [x, y, z] - @ivar useLocalForce: A flag specifying if the force is local - @type useLocalForce: bool - @ivar torque: The torque applied by the actuator - @type torque: list [x, y, z] - @ivar useLocalTorque: A flag specifying if the torque is local - @type useLocalTorque: bool - @ivar dLoc: The displacement vector applied by the actuator - @type dLoc: list [x, y, z] - @ivar useLocalDLoc: A flag specifying if the dLoc is local - @type useLocalDLoc: bool - @ivar dRot: The angular displacement vector applied by the actuator - - note: Since the displacement is applied every frame, you must adjust the displacement - based on the frame rate, or you game experience will depend on the player's computer - speed. - @type dRot: list [x, y, z] - @ivar useLocalDRot: A flag specifying if the dRot is local - @type useLocalDRot: bool - @ivar linV: The linear velocity applied by the actuator - @type linV: list [x, y, z] - @ivar useLocalLinV: A flag specifying if the linear velocity is local - - note: This is the target speed for servo controllers - @type useLocalLinV: bool - @ivar angV: The angular velocity applied by the actuator - @type angV: list [x, y, z] - @ivar useLocalAngV: A flag specifying if the angular velocity is local - @type useLocalAngV: bool - - @ivar damping: The damping parameter of the servo controller - @type damping: short - - @ivar forceLimitX: The min/max force limit along the X axis and activates or deactivates the limits in the servo controller - @type forceLimitX: list [min(float), max(float), bool] - @ivar forceLimitY: The min/max force limit along the Y axis and activates or deactivates the limits in the servo controller - @type forceLimitY: list [min(float), max(float), bool] - @ivar forceLimitZ: The min/max force limit along the Z axis and activates or deactivates the limits in the servo controller - @type forceLimitZ: list [min(float), max(float), bool] - - @ivar pid: The PID coefficients of the servo controller - @type pid: list of floats [proportional, integral, derivate] - @ivar reference: The object that is used as reference to compute the velocity for the servo controller. - @type reference: KX_GameObject or None - - @group Deprecated: getForce, setForce, getTorque, setTorque, getDLoc, setDLoc, getDRot, setDRot, getLinearVelocity, setLinearVelocity, getAngularVelocity, - setAngularVelocity, getDamping, setDamping, getForceLimitX, setForceLimitX, getForceLimitY, setForceLimitY, getForceLimitZ, setForceLimitZ, - getPID, setPID - """ - def getForce(): - """ - Returns the force applied by the actuator. - - @deprecated: Use L{force} and L{useLocalForce} instead. - @rtype: list [fx, fy, fz, local] - @return: A four item list, containing the vector force, and a flag specifying whether the force is local. - """ - def setForce(fx, fy, fz, local): - """ - Sets the force applied by the actuator. - - @deprecated: Use L{force} and L{useLocalForce} instead. - @type fx: float - @param fx: the x component of the force. - @type fy: float - @param fy: the z component of the force. - @type fz: float - @param fz: the z component of the force. - @type local: boolean - @param local: - False: the force is applied in world coordinates. - - True: the force is applied in local coordinates. - """ - def getTorque(): - """ - Returns the torque applied by the actuator. - - @deprecated: Use L{torque} and L{useLocalTorque} instead. - @rtype: list [S{Tau}x, S{Tau}y, S{Tau}z, local] - @return: A four item list, containing the vector torque, and a flag specifying whether - the torque is applied in local coordinates (True) or world coordinates (False) - """ - def setTorque(tx, ty, tz, local): - """ - Sets the torque applied by the actuator. - - @deprecated: Use L{torque} and L{useLocalTorque} instead. - @type tx: float - @param tx: the x component of the torque. - @type ty: float - @param ty: the z component of the torque. - @type tz: float - @param tz: the z component of the torque. - @type local: boolean - @param local: - False: the torque is applied in world coordinates. - - True: the torque is applied in local coordinates. - """ - def getDLoc(): - """ - Returns the displacement vector applied by the actuator. - - @deprecated: Use L{dLoc} and L{useLocalDLoc} instead. - @rtype: list [dx, dy, dz, local] - @return: A four item list, containing the vector displacement, and whether - the displacement is applied in local coordinates (True) or world - coordinates (False) - """ - def setDLoc(dx, dy, dz, local): - """ - Sets the displacement vector applied by the actuator. - - Since the displacement is applied every frame, you must adjust the displacement - based on the frame rate, or you game experience will depend on the player's computer - speed. - - @deprecated: Use L{dLoc} and L{useLocalDLoc} instead. - @type dx: float - @param dx: the x component of the displacement vector. - @type dy: float - @param dy: the z component of the displacement vector. - @type dz: float - @param dz: the z component of the displacement vector. - @type local: boolean - @param local: - False: the displacement vector is applied in world coordinates. - - True: the displacement vector is applied in local coordinates. - """ - def getDRot(): - """ - Returns the angular displacement vector applied by the actuator. - - @deprecated: Use L{dRot} and L{useLocalDRot} instead. - @rtype: list [dx, dy, dz, local] - @return: A four item list, containing the angular displacement vector, and whether - the displacement is applied in local coordinates (True) or world coordinates (False) - """ - def setDRot(dx, dy, dz, local): - """ - Sets the angular displacement vector applied by the actuator. - - Since the displacement is applied every frame, you must adjust the displacement - based on the frame rate, or you game experience will depend on the player's computer - speed. - - @deprecated: Use L{dRot} and L{useLocalDRot} instead. - @type dx: float - @param dx: the x component of the angular displacement vector. - @type dy: float - @param dy: the z component of the angular displacement vector. - @type dz: float - @param dz: the z component of the angular displacement vector. - @type local: boolean - @param local: - False: the angular displacement vector is applied in world coordinates. - - True: the angular displacement vector is applied in local coordinates. - """ - def getLinearVelocity(): - """ - Returns the linear velocity applied by the actuator. - For the servo control actuator, this is the target speed. - - @deprecated: Use L{linV} and L{useLocalLinV} instead. - @rtype: list [vx, vy, vz, local] - @return: A four item list, containing the vector velocity, and whether the velocity is applied in local coordinates (True) or world coordinates (False) - """ - def setLinearVelocity(vx, vy, vz, local): - """ - Sets the linear velocity applied by the actuator. - For the servo control actuator, sets the target speed. - - @deprecated: Use L{linV} and L{useLocalLinV} instead. - @type vx: float - @param vx: the x component of the velocity vector. - @type vy: float - @param vy: the z component of the velocity vector. - @type vz: float - @param vz: the z component of the velocity vector. - @type local: boolean - @param local: - False: the velocity vector is in world coordinates. - - True: the velocity vector is in local coordinates. - """ - def getAngularVelocity(): - """ - Returns the angular velocity applied by the actuator. - - @deprecated: Use L{angV} and L{useLocalAngV} instead. - @rtype: list [S{omega}x, S{omega}y, S{omega}z, local] - @return: A four item list, containing the vector velocity, and whether - the velocity is applied in local coordinates (True) or world - coordinates (False) - """ - def setAngularVelocity(wx, wy, wz, local): - """ - Sets the angular velocity applied by the actuator. - - @deprecated: Use L{angV} and L{useLocalAngV} instead. - @type wx: float - @param wx: the x component of the velocity vector. - @type wy: float - @param wy: the z component of the velocity vector. - @type wz: float - @param wz: the z component of the velocity vector. - @type local: boolean - @param local: - False: the velocity vector is applied in world coordinates. - - True: the velocity vector is applied in local coordinates. - """ - def getDamping(): - """ - Returns the damping parameter of the servo controller. - - @deprecated: Use L{damping} instead. - @rtype: integer - @return: the time constant of the servo controller in frame unit. - """ - def setDamping(damp): - """ - Sets the damping parameter of the servo controller. - - @deprecated: Use L{damping} instead. - @type damp: integer - @param damp: the damping parameter in frame unit. - """ - def getForceLimitX(): - """ - Returns the min/max force limit along the X axis used by the servo controller. - - @deprecated: Use L{forceLimitX} instead. - @rtype: list [min, max, enabled] - @return: A three item list, containing the min and max limits of the force as float - and whether the limits are active(true) or inactive(true) - """ - def setForceLimitX(min, max, enable): - """ - Sets the min/max force limit along the X axis and activates or deactivates the limits in the servo controller. - - @deprecated: Use L{forceLimitX} instead. - @type min: float - @param min: the minimum value of the force along the X axis. - @type max: float - @param max: the maximum value of the force along the X axis. - @type enable: boolean - @param enable: - True: the force will be limited to the min/max - - False: the force will not be limited - """ - def getForceLimitY(): - """ - Returns the min/max force limit along the Y axis used by the servo controller. - - @deprecated: Use L{forceLimitY} instead. - @rtype: list [min, max, enabled] - @return: A three item list, containing the min and max limits of the force as float - and whether the limits are active(true) or inactive(true) - """ - def setForceLimitY(min, max, enable): - """ - Sets the min/max force limit along the Y axis and activates or deactivates the limits in the servo controller. - - @deprecated: Use L{forceLimitY} instead. - @type min: float - @param min: the minimum value of the force along the Y axis. - @type max: float - @param max: the maximum value of the force along the Y axis. - @type enable: boolean - @param enable: - True: the force will be limited to the min/max - - False: the force will not be limited - """ - def getForceLimitZ(): - """ - Returns the min/max force limit along the Z axis used by the servo controller. - - @deprecated: Use L{forceLimitZ} instead. - @rtype: list [min, max, enabled] - @return: A three item list, containing the min and max limits of the force as float - and whether the limits are active(true) or inactive(true) - """ - def setForceLimitZ(min, max, enable): - """ - Sets the min/max force limit along the Z axis and activates or deactivates the limits in the servo controller. - - @deprecated: Use L{forceLimitZ} instead. - @type min: float - @param min: the minimum value of the force along the Z axis. - @type max: float - @param max: the maximum value of the force along the Z axis. - @type enable: boolean - @param enable: - True: the force will be limited to the min/max - - False: the force will not be limited - """ - def getPID(): - """ - Returns the PID coefficient of the servo controller. - - @deprecated: Use L{pid} instead. - @rtype: list [P, I, D] - @return: A three item list, containing the PID coefficient as floats: - P : proportional coefficient - I : Integral coefficient - D : Derivate coefficient - """ - def setPID(P, I, D): - """ - Sets the PID coefficients of the servo controller. - - @deprecated: Use L{pid} instead. - @type P: flat - @param P: proportional coefficient - @type I: float - @param I: Integral coefficient - @type D: float - @param D: Derivate coefficient - """ - -class KX_ParentActuator(SCA_IActuator): - """ - The parent actuator can set or remove an objects parent object. - @ivar object: the object this actuator sets the parent too. - @type object: KX_GameObject or None - @ivar mode: The mode of this actuator - @type mode: int from 0 to 1 L{GameLogic.Parent Actuator} - @ivar compound: Whether the object shape should be added to the parent compound shape when parenting - Effective only if the parent is already a compound shape - @type compound: bool - @ivar ghost: whether the object should be made ghost when parenting - Effective only if the shape is not added to the parent compound shape - @type ghost: bool - - """ - def setObject(object): - """ - Sets the object to set as parent. - - Object can be either a L{KX_GameObject} or the name of the object. - - @deprecated: Use the L{object} property. - @type object: L{KX_GameObject}, string or None - """ - def getObject(name_only = 1): - """ - Returns the name of the object to change to. - - @deprecated: Use the L{object} property. - @type name_only: bool - @param name_only: optional argument, when 0 return a KX_GameObject - @rtype: string, KX_GameObject or None if no object is set - """ - -class KX_PhysicsObjectWrapper(PyObjectPlus): - """ - KX_PhysicsObjectWrapper - - """ - def setActive(active): - """ - Set the object to be active. - - @param active: set to True to be active - @type active: bool - """ - - def setAngularVelocity(x, y, z, local): - """ - Set the angular velocity of the object. - - @param x: angular velocity for the x-axis - @type x: float - - @param y: angular velocity for the y-axis - @type y: float - - @param z: angular velocity for the z-axis - @type z: float - - @param local: set to True for local axis - @type local: bool - """ - def setLinearVelocity(x, y, z, local): - """ - Set the linear velocity of the object. - - @param x: linear velocity for the x-axis - @type x: float - - @param y: linear velocity for the y-axis - @type y: float - - @param z: linear velocity for the z-axis - @type z: float - - @param local: set to True for local axis - @type local: bool - """ - def setPosition(x, y, z): - """ - Set the position of the object - - @param x: x coordinate - @type x: float - - @param y: y coordinate - @type y: float - - @param z: z coordinate - @type z: float - """ - -class KX_PolyProxy(SCA_IObject): - """ - A polygon holds the index of the vertex forming the poylgon. - - Note: - The polygon attributes are read-only, you need to retrieve the vertex proxy if you want - to change the vertex settings. - - @ivar matname: The name of polygon material, empty if no material. - @type matname: string - @ivar material: The material of the polygon - @type material: L{KX_PolygonMaterial} or L{KX_BlenderMaterial} - @ivar texture: The texture name of the polygon. - @type texture: string - @ivar matid: The material index of the polygon, use this to retrieve vertex proxy from mesh proxy - @type matid: integer - @ivar v1: vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy - @type v1: integer - @ivar v2: vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy - @type v2: integer - @ivar v3: vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy - @type v3: integer - @ivar v4: vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex - use this to retrieve vertex proxy from mesh proxy - @type v4: integer - @ivar visible: visible state of the polygon: 1=visible, 0=invisible - @type visible: integer - @ivar collide: collide state of the polygon: 1=receives collision, 0=collision free. - @type collide: integer - """ - - def getMaterialName(): - """ - Returns the polygon material name with MA prefix - - @rtype: string - @return: material name - """ - def getMaterial(): - """ - Returns the polygon material - - @rtype: L{KX_PolygonMaterial} or L{KX_BlenderMaterial} - """ - def getTextureName(): - """ - Returns the polygon texture name - - @rtype: string - @return: texture name - """ - def getMaterialIndex(): - """ - Returns the material bucket index of the polygon. - This index and the ones returned by getVertexIndex() are needed to retrieve the vertex proxy from L{KX_MeshProxy}. - - @rtype: integer - @return: the material index in the mesh - """ - def getNumVertex(): - """ - Returns the number of vertex of the polygon. - - @rtype: integer - @return: number of vertex, 3 or 4. - """ - def isVisible(): - """ - Returns whether the polygon is visible or not - - @rtype: integer - @return: 0=invisible, 1=visible - """ - def isCollider(): - """ - Returns whether the polygon is receives collision or not - - @rtype: integer - @return: 0=collision free, 1=receives collision - """ - def getVertexIndex(vertex): - """ - Returns the mesh vertex index of a polygon vertex - This index and the one returned by getMaterialIndex() are needed to retrieve the vertex proxy from L{KX_MeshProxy}. - - @type vertex: integer - @param vertex: index of the vertex in the polygon: 0->3 - @rtype: integer - @return: mesh vertex index - """ - def getMesh(): - """ - Returns a mesh proxy - - @rtype: L{KX_MeshProxy} - @return: mesh proxy - """ - -class KX_PolygonMaterial: - """ - This is the interface to materials in the game engine. - - Materials define the render state to be applied to mesh objects. - - Warning: Some of the methods/variables are CObjects. If you mix these up, - you will crash blender. - - This example requires: - - PyOpenGL http://pyopengl.sourceforge.net/ - - GLEWPy http://glewpy.sourceforge.net/ - Example:: - - import GameLogic - import OpenGL - from OpenGL.GL import * - from OpenGL.GLU import * - import glew - from glew import * - - glewInit() - - vertex_shader = \"\"\" - - void main(void) - { - gl_Position = ftransform(); - } - \"\"\" - - fragment_shader =\"\"\" - - void main(void) - { - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - } - \"\"\" - - class MyMaterial: - def __init__(self): - self.pass_no = 0 - # Create a shader - self.m_program = glCreateProgramObjectARB() - # Compile the vertex shader - self.shader(GL_VERTEX_SHADER_ARB, (vertex_shader)) - # Compile the fragment shader - self.shader(GL_FRAGMENT_SHADER_ARB, (fragment_shader)) - # Link the shaders together - self.link() - - def PrintInfoLog(self, tag, object): - \"\"\" - PrintInfoLog prints the GLSL compiler log - \"\"\" - print "Tag: def PrintGLError(self, tag = ""): - - def PrintGLError(self, tag = ""): - \"\"\" - Prints the current GL error status - \"\"\" - if len(tag): - print tag - err = glGetError() - if err != GL_NO_ERROR: - print "GL Error: %s\\n"%(gluErrorString(err)) - - def shader(self, type, shaders): - \"\"\" - shader compiles a GLSL shader and attaches it to the current - program. - - type should be either GL_VERTEX_SHADER_ARB or GL_FRAGMENT_SHADER_ARB - shaders should be a sequence of shader source to compile. - \"\"\" - # Create a shader object - shader_object = glCreateShaderObjectARB(type) - - # Add the source code - glShaderSourceARB(shader_object, len(shaders), shaders) - - # Compile the shader - glCompileShaderARB(shader_object) - - # Print the compiler log - self.PrintInfoLog("vertex shader", shader_object) - - # Check if compiled, and attach if it did - compiled = glGetObjectParameterivARB(shader_object, GL_OBJECT_COMPILE_STATUS_ARB) - if compiled: - glAttachObjectARB(self.m_program, shader_object) - - # Delete the object (glAttachObjectARB makes a copy) - glDeleteObjectARB(shader_object) - - # print the gl error log - self.PrintGLError() - - def link(self): - \"\"\" - Links the shaders together. - \"\"\" - # clear error indicator - glGetError() - - glLinkProgramARB(self.m_program) - - self.PrintInfoLog("link", self.m_program) - - linked = glGetObjectParameterivARB(self.m_program, GL_OBJECT_LINK_STATUS_ARB) - if not linked: - print "Shader failed to link" - return - - glValidateProgramARB(self.m_program) - valid = glGetObjectParameterivARB(self.m_program, GL_OBJECT_VALIDATE_STATUS_ARB) - if not valid: - print "Shader failed to validate" - return - - def activate(self, rasty, cachingInfo, mat): - self.pass_no+=1 - if (self.pass_no == 1): - glDisable(GL_COLOR_MATERIAL) - glUseProgramObjectARB(self.m_program) - return True - - glEnable(GL_COLOR_MATERIAL) - glUseProgramObjectARB(0) - self.pass_no = 0 - return False - - obj = GameLogic.getCurrentController().owner - - mesh = obj.meshes[0] - - for mat in mesh.materials: - mat.setCustomMaterial(MyMaterial()) - print mat.texture - - @ivar texture: Texture name - @type texture: string (read-only) - - @ivar gl_texture: OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture) - @type gl_texture: integer (read-only) - - @ivar material: Material name - @type material: string (read-only) - - @ivar tface: Texture face properties - @type tface: CObject (read-only) - - @ivar tile: Texture is tiling - @type tile: boolean - @ivar tilexrep: Number of tile repetitions in x direction. - @type tilexrep: integer - @ivar tileyrep: Number of tile repetitions in y direction. - @type tileyrep: integer - - @ivar drawingmode: Drawing mode for the material. - - 2 (drawingmode & 4) Textured - - 4 (drawingmode & 16) Light - - 14 (drawingmode & 16384) 3d Polygon Text - @type drawingmode: bitfield - - @ivar transparent: This material is transparent. All meshes with this - material will be rendered after non transparent meshes from back - to front. - @type transparent: boolean - - @ivar zsort: Transparent polygons in meshes with this material will be sorted back to - front before rendering. - Non-Transparent polygons will be sorted front to back before rendering. - @type zsort: boolean - - @ivar lightlayer: Light layers this material affects. - @type lightlayer: bitfield. - - @ivar triangle: Mesh data with this material is triangles. It's probably not safe to change this. - @type triangle: boolean - - @ivar diffuse: The diffuse colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0] - @type diffuse: list [r, g, b] - @ivar specular: The specular colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0] - @type specular: list [r, g, b] - @ivar shininess: The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0 - @type shininess: float - @ivar specularity: The amount of specular of the material. 0.0 <= specularity <= 1.0 - @type specularity: float - """ - def updateTexture(tface, rasty): - """ - Updates a realtime animation. - - @param tface: Texture face (eg mat.tface) - @type tface: CObject - @param rasty: Rasterizer - @type rasty: CObject - """ - def setTexture(tface): - """ - Sets texture render state. - - Example:: - mat.setTexture(mat.tface) - - @param tface: Texture face - @type tface: CObject - """ - def activate(rasty, cachingInfo): - """ - Sets material parameters for this object for rendering. - - Material Parameters set: - 1. Texture - 2. Backface culling - 3. Line drawing - 4. Specular Colour - 5. Shininess - 6. Diffuse Colour - 7. Polygon Offset. - - @param rasty: Rasterizer instance. - @type rasty: CObject - @param cachingInfo: Material cache instance. - @type cachingInfo: CObject - """ - def setCustomMaterial(material): - """ - Sets the material state setup object. - - Using this method, you can extend or completely replace the gameengine material - to do your own advanced multipass effects. - - Use this method to register your material class. Instead of the normal material, - your class's activate method will be called just before rendering the mesh. - This should setup the texture, material, and any other state you would like. - It should return True to render the mesh, or False if you are finished. You should - clean up any state Blender does not set before returning False. - - Activate Method Definition:: - def activate(self, rasty, cachingInfo, material): - - Example:: - class PyMaterial: - def __init__(self): - self.pass_no = -1 - - def activate(self, rasty, cachingInfo, material): - # Activate the material here. - # - # The activate method will be called until it returns False. - # Every time the activate method returns True the mesh will - # be rendered. - # - # rasty is a CObject for passing to material.updateTexture() - # and material.activate() - # cachingInfo is a CObject for passing to material.activate() - # material is the KX_PolygonMaterial instance this material - # was added to - - # default material properties: - self.pass_no += 1 - if self.pass_no == 0: - material.activate(rasty, cachingInfo) - # Return True to do this pass - return True - - # clean up and return False to finish. - self.pass_no = -1 - return False - - # Create a new Python Material and pass it to the renderer. - mat.setCustomMaterial(PyMaterial()) - - @param material: The material object. - @type material: instance - """ - -class KX_RadarSensor(KX_NearSensor): - """ - Radar sensor is a near sensor with a conical sensor object. - - @ivar coneOrigin: The origin of the cone with which to test. The origin - is in the middle of the cone. - (read-only) - @type coneOrigin: list of floats [x, y, z] - @ivar coneTarget: The center of the bottom face of the cone with which to test. - (read-only) - @type coneTarget: list of floats [x, y, z] - @ivar distance: The height of the cone with which to test. - @type distance: float - @ivar angle: The angle of the cone (in degrees) with which to test. - @type angle: float from 0 to 360 - @ivar axis: The axis on which the radar cone is cast - @type axis: int from 0 to 5 - KX_RADAR_AXIS_POS_X, KX_RADAR_AXIS_POS_Y, KX_RADAR_AXIS_POS_Z, - KX_RADAR_AXIS_NEG_X, KX_RADAR_AXIS_NEG_Y, KX_RADAR_AXIS_NEG_Z - """ -#{Deprecated - #--The following methods are deprecated, please use properties instead. - def getConeOrigin(): - """ - Returns the origin of the cone with which to test. The origin - is in the middle of the cone. - - @deprecated: Use the L{coneOrigin} property. - @rtype: list [x, y, z] - """ - - def getConeTarget(): - """ - Returns the center of the bottom face of the cone with which to test. - - @deprecated: Use the L{coneTarget} property. - @rtype: list [x, y, z] - """ -#} - - def getConeHeight(): - """ - Returns the height of the cone with which to test. - - @rtype: float - """ - -class KX_RaySensor(SCA_ISensor): - """ - A ray sensor detects the first object in a given direction. - - @ivar propName: The property the ray is looking for. - @type propName: string - @ivar range: The distance of the ray. - @type range: float - @ivar useMaterial: Whether or not to look for a material (false = property) - @type useMaterial: boolean - @ivar useXRay: Whether or not to use XRay. - @type useXRay: boolean - @ivar hitObject: The game object that was hit by the ray. (Read-only) - @type hitObject: KX_GameObject - @ivar hitPosition: The position (in worldcoordinates) where the object was hit by the ray. (Read-only) - @type hitPosition: list [x, y, z] - @ivar hitNormal: The normal (in worldcoordinates) of the object at the location where the object was hit by the ray. (Read-only) - @type hitNormal: list [x, y, z] - @ivar rayDirection: The direction from the ray (in worldcoordinates). (Read-only) - @type rayDirection: list [x, y, z] - @ivar axis: The axis the ray is pointing on. - @type axis: int from 0 to 5 - KX_RAY_AXIS_POS_X, KX_RAY_AXIS_POS_Y, KX_RAY_AXIS_POS_Z, - KX_RAY_AXIS_NEG_X, KX_RAY_AXIS_NEG_Y, KX_RAY_AXIS_NEG_Z - """ -#{ Deprecated - def getHitObject(): - """ - Returns the game object that was hit by this ray. - - @deprecated: Use the L{hitObject} attribute instead. - @rtype: KX_GameObject - """ - def getHitPosition(): - """ - Returns the position (in worldcoordinates) where the object was hit by this ray. - - @deprecated: Use the L{hitPosition} attribute instead. - @rtype: list [x, y, z] - """ - def getHitNormal(): - """ - Returns the normal (in worldcoordinates) of the object at the location where the object was hit by this ray. - - @deprecated: Use the L{hitNormal} attribute instead. - @rtype: list [nx, ny, nz] - """ - def getRayDirection(): - """ - Returns the direction from the ray (in worldcoordinates) - - @deprecated: Use the L{rayDirection} attribute instead. - @rtype: list [dx, dy, dz] - """ -#} - -class KX_SCA_AddObjectActuator(SCA_IActuator): - """ - Edit Object Actuator (in Add Object Mode) - @ivar object: the object this actuator adds. - @type object: KX_GameObject or None - @ivar objectLastCreated: the last added object from this actuator (read-only). - @type objectLastCreated: KX_GameObject or None - @ivar time: the lifetime of added objects, in frames. Set to 0 to disable automatic deletion. - @type time: integer - @ivar linearVelocity: the initial linear velocity of added objects. - @type linearVelocity: list [vx, vy, vz] - @ivar angularVelocity: the initial angular velocity of added objects. - @type angularVelocity: list [vx, vy, vz] - - @warning: An Add Object actuator will be ignored if at game start, the linked object doesn't exist - (or is empty) or the linked object is in an active layer. - - This will genereate a warning in the console: - - C{ERROR: GameObject I{Name} has a AddObjectActuator I{ActuatorName} without object (in 'nonactive' layer)} - """ -#{Deprecated - def setObject(object): - """ - Sets the game object to add. - - A copy of the object will be added to the scene when the actuator is activated. - - If the object does not exist, this function is ignored. - - object can either be a L{KX_GameObject} or the name of an object or None. - - @deprecated: use the L{object} property - @type object: L{KX_GameObject}, string or None - """ - def getObject(name_only = 0): - """ - Returns the name of the game object to be added. - - Returns None if no game object has been assigned to be added. - - @deprecated: use the L{object} property - @type name_only: bool - @param name_only: optional argument, when 0 return a KX_GameObject - @rtype: string, KX_GameObject or None if no object is set - """ - def setTime(time): - """ - Sets the lifetime of added objects, in frames. - - If time == 0, the object will last forever. - - @deprecated: use the L{time} property - @type time: integer - @param time: The minimum value for time is 0. - """ - def getTime(): - """ - Returns the lifetime of the added object, in frames. - - @deprecated: use the L{time} property - @rtype: integer - """ - def setLinearVelocity(vx, vy, vz): - """ - Sets the initial linear velocity of added objects. - - @deprecated: use the L{linearVelocity} property - @type vx: float - @param vx: the x component of the initial linear velocity. - @type vy: float - @param vy: the y component of the initial linear velocity. - @type vz: float - @param vz: the z component of the initial linear velocity. - """ - def getLinearVelocity(): - """ - Returns the initial linear velocity of added objects. - - @deprecated: use the L{linearVelocity} property - @rtype: list [vx, vy, vz] - """ - def setAngularVelocity(vx, vy, vz): - """ - Sets the initial angular velocity of added objects. - - @deprecated: use the L{angularVelocity} property - @type vx: float - @param vx: the x component of the initial angular velocity. - @type vy: float - @param vy: the y component of the initial angular velocity. - @type vz: float - @param vz: the z component of the initial angular velocity. - """ - def getAngularVelocity(): - """ - Returns the initial angular velocity of added objects. - - @deprecated: use the L{angularVelocity} property - @rtype: list [vx, vy, vz] - """ - def getLastCreatedObject(): - """ - Returns the last object created by this actuator. - - @deprecated: use the L{objectLastCreated} property - @rtype: L{KX_GameObject} - @return: A L{KX_GameObject} or None if no object has been created. - """ -#} - def instantAddObject(): - """ - Returns the last object created by this actuator. The object can then be accessed from L{objectLastCreated}. - - @rtype: None - """ - -class KX_SCA_DynamicActuator(SCA_IActuator): - """ - Dynamic Actuator. - @ivar mode: the type of operation of the actuator, 0-4 - KX_DYN_RESTORE_DYNAMICS, KX_DYN_DISABLE_DYNAMICS, - KX_DYN_ENABLE_RIGID_BODY, KX_DYN_DISABLE_RIGID_BODY, KX_DYN_SET_MASS - @type mode: integer - @ivar mass: the mass value for the KX_DYN_SET_MASS operation - @type mass: float - """ -#{ Deprecated - def setOperation(operation): - """ - Set the type of operation when the actuator is activated: - - 0 = restore dynamics - - 1 = disable dynamics - - 2 = enable rigid body - - 3 = disable rigid body - - 4 = set mass - - @deprecated: Use the L{mode} attribute instead. - """ - def getOperation(): - """ - return the type of operation - @deprecated: Use the L{mode} attribute instead. - """ -#} - -class KX_SCA_EndObjectActuator(SCA_IActuator): - """ - Edit Object Actuator (in End Object mode) - - This actuator has no python methods. - """ - -class KX_SCA_ReplaceMeshActuator(SCA_IActuator): - """ - Edit Object actuator, in Replace Mesh mode. - - Example:: - # Level-of-detail - # Switch a game object's mesh based on its depth in the camera view. - # +----------+ +-----------+ +-------------------------------------+ - # | Always +-----+ Python +-----+ Edit Object (Replace Mesh) LOD.Mesh | - # +----------+ +-----------+ +-------------------------------------+ - import GameLogic - - # List detail meshes here - # Mesh (name, near, far) - # Meshes overlap so that they don't 'pop' when on the edge of the distance. - meshes = ((".Hi", 0.0, -20.0), - (".Med", -15.0, -50.0), - (".Lo", -40.0, -100.0) - ) - - co = GameLogic.getCurrentController() - obj = co.owner - act = co.actuators["LOD." + obj.name] - cam = GameLogic.getCurrentScene().active_camera - - def Depth(pos, plane): - return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3] - - # Depth is negative and decreasing further from the camera - depth = Depth(obj.position, cam.world_to_camera[2]) - - newmesh = None - curmesh = None - # Find the lowest detail mesh for depth - for mesh in meshes: - if depth < mesh[1] and depth > mesh[2]: - newmesh = mesh - if "ME" + obj.name + mesh[0] == act.getMesh(): - curmesh = mesh - - if newmesh != None and "ME" + obj.name + newmesh[0] != act.getMesh(): - # The mesh is a different mesh - switch it. - # Check the current mesh is not a better fit. - if curmesh == None or curmesh[1] < depth or curmesh[2] > depth: - act.mesh = obj.getName() + newmesh[0] - GameLogic.addActiveActuator(act, True) - - @warning: Replace mesh actuators will be ignored if at game start, the - named mesh doesn't exist. - - This will generate a warning in the console: - - C{ERROR: GameObject I{Name} ReplaceMeshActuator I{ActuatorName} without object} - - @ivar mesh: L{KX_MeshProxy} or the name of the mesh that will replace the current one - Set to None to disable actuator - @type mesh: L{KX_MeshProxy} or None if no mesh is set - - @ivar useDisplayMesh: when true the displayed mesh is replaced. - @type useDisplayMesh: boolean - @ivar usePhysicsMesh: when true the physics mesh is replaced. - @type usePhysicsMesh: boolean - """ - def setMesh(name): - """ - Sets the name of the mesh that will replace the current one. - When the name is None it will unset the mesh value so no action is taken. - - @deprecated: Use the L{mesh} attribute instead. - @type name: string or None - """ - def getMesh(): - """ - Returns the name of the mesh that will replace the current one. - - Returns None if no mesh has been scheduled to be added. - - @deprecated: Use the L{mesh} attribute instead. - @rtype: string or None - """ - def instantReplaceMesh(): - """ - Immediately replace mesh without delay. - @rtype: None - """ - -class KX_Scene(PyObjectPlus): - """ - An active scene that gives access to objects, cameras, lights and scene attributes. - - The activity culling stuff is supposed to disable logic bricks when their owner gets too far - from the active camera. It was taken from some code lurking at the back of KX_Scene - who knows - what it does! - - Example:: - import GameLogic - - # get the scene - scene = GameLogic.getCurrentScene() - - # print all the objects in the scene - for obj in scene.objects: - print obj.name - - # get an object named 'Cube' - obj = scene.objects["Cube"] - - # get the first object in the scene. - obj = scene.objects[0] - - Example:: - # Get the depth of an object in the camera view. - import GameLogic - - obj = GameLogic.getCurrentController().owner - cam = GameLogic.getCurrentScene().active_camera - - # Depth is negative and decreasing further from the camera - depth = obj.position[0]*cam.world_to_camera[2][0] + obj.position[1]*cam.world_to_camera[2][1] + obj.position[2]*cam.world_to_camera[2][2] + cam.world_to_camera[2][3] - - @bug: All attributes are read only at the moment. - - @ivar name: The scene's name, (read-only). - @type name: string - @ivar objects: A list of objects in the scene, (read-only). - @type objects: L{CListValue} of L{KX_GameObject} - @ivar objectsInactive: A list of objects on background layers (used for the addObject actuator), (read-only). - @type objectsInactive: L{CListValue} of L{KX_GameObject} - @ivar lights: A list of lights in the scene, (read-only). - @type lights: L{CListValue} of L{KX_LightObject} - @ivar cameras: A list of cameras in the scene, (read-only). - @type cameras: L{CListValue} of L{KX_Camera} - @ivar active_camera: The current active camera. - note: this can be set directly from python to avoid using the L{KX_SceneActuator}. - @type active_camera: L{KX_Camera} - @ivar suspended: True if the scene is suspended, (read-only). - @type suspended: boolean - @ivar activity_culling: True if the scene is activity culling - @type activity_culling: boolean - @ivar activity_culling_radius: The distance outside which to do activity culling. Measured in manhattan distance. - @type activity_culling_radius: float - @ivar dbvt_culling: True when Dynamic Bounding box Volume Tree is set (read-only). - @type dbvt_culling: bool - @ivar pre_draw: A list of callables to be run before the render step. - @type pre_draw: list - @ivar post_draw: A list of callables to be run after the render step. - @type post_draw: list - @group Deprecated: getLightList, getObjectList, getName - """ - - def getLightList(): - """ - Returns the list of lights in the scene. - - @deprecated: Use the L{lights} attribute instead. - @rtype: list [L{KX_LightObject}] - """ - def getObjectList(): - """ - Returns the list of objects in the scene. - - @deprecated: Use the L{objects} attribute instead. - @rtype: list [L{KX_GameObject}] - """ - def getName(): - """ - Returns the name of the scene. - - @deprecated: Use the L{name} attribute instead. - @rtype: string - """ - - def addObject(object, other, time=0): - """ - Adds an object to the scene like the Add Object Actuator would, and returns the created object. - - @param object: The object to add - @type object: L{KX_GameObject} or string - @param other: The object's center to use when adding the object - @type other: L{KX_GameObject} or string - @param time: The lifetime of the added object, in frames. A time of 0 means the object will last forever. - @type time: int - - @rtype: L{KX_GameObject} - """ - - def end(): - """ - Removes the scene from the game. - """ - - def restart(): - """ - Restarts the scene. - """ - - def replace(scene): - """ - Replaces this scene with another one. - - @param scene: The name of the scene to replace this scene with. - @type scene: string - """ - - def get(key, default=None): - """ - Return the value matching key, or the default value if its not found. - @return: The key value or a default. - """ - -class KX_SceneActuator(SCA_IActuator): - """ - Scene Actuator logic brick. - - @warning: Scene actuators that use a scene name will be ignored if at game start, the - named scene doesn't exist or is empty - - This will generate a warning in the console: - - C{ERROR: GameObject I{Name} has a SceneActuator I{ActuatorName} (SetScene) without scene} - - @ivar scene: the name of the scene to change to/overlay/underlay/remove/suspend/resume - @type scene: string. - @ivar camera: the camera to change to. - When setting the attribute, you can use either a L{KX_Camera} or the name of the camera. - @type camera: L{KX_Camera} on read, string or L{KX_Camera} on write - @ivar useRestart: Set flag to True to restart the sene - @type useRestart: bool - @ivar mode: The mode of the actuator - @type mode: int from 0 to 5 L{GameLogic.Scene Actuator} - """ -#{ Deprecated - def setUseRestart(flag): - """ - Set flag to True to restart the scene. - - @deprecated: Use the L{useRestart} attribute instead. - @type flag: boolean - """ - def setScene(scene): - """ - Sets the name of the scene to change to/overlay/underlay/remove/suspend/resume. - - @deprecated: use the L{scene} attribute instead. - @type scene: string - """ - def setCamera(camera): - """ - Sets the camera to change to. - - Camera can be either a L{KX_Camera} or the name of the camera. - - @deprecated: use the L{camera} attribute instead. - @type camera: L{KX_Camera} or string - """ - def getUseRestart(): - """ - Returns True if the scene will be restarted. - - @deprecated: use the L{useRestart} attribute instead. - @rtype: boolean - """ - def getScene(): - """ - Returns the name of the scene to change to/overlay/underlay/remove/suspend/resume. - - Returns an empty string ("") if no scene has been set. - - @deprecated: use the L{scene} attribute instead. - @rtype: string - """ - def getCamera(): - """ - Returns the name of the camera to change to. - - @deprecated: use the L{camera} attribute instead. - @rtype: string - """ -#} - -class KX_SoundActuator(SCA_IActuator): - """ - Sound Actuator. - - The L{startSound()}, L{pauseSound()} and L{stopSound()} do not require - the actuator to be activated - they act instantly provided that the actuator has - been activated once at least. - - @ivar fileName: The filename of the sound this actuator plays. - @type fileName: string - - @ivar volume: The volume (gain) of the sound. - @type volume: float - - @ivar pitch: The pitch of the sound. - @type pitch: float - - @ivar rollOffFactor: The roll off factor. Rolloff defines the rate of attenuation as the sound gets further away. - @type rollOffFactor: float - - @ivar looping: The loop mode of the actuator. - @type looping: integer - - @ivar position: The position of the sound as a list: [x, y, z]. - @type position: float array - - @ivar velocity: The velocity of the emitter as a list: [x, y, z]. The relative velocity to the observer determines the pitch. List of 3 floats: [x, y, z]. - @type velocity: float array - - @ivar orientation: The orientation of the sound. When setting the orientation you can also use quaternion [float,float,float,float] or euler angles [float,float,float] - @type orientation: 3x3 matrix [[float]] - - @ivar mode: The operation mode of the actuator. You can use one of the following constants: - - KX_SOUNDACT_PLAYSTOP (1) - - KX_SOUNDACT_PLAYEND (2) - - KX_SOUNDACT_LOOPSTOP (3) - - KX_SOUNDACT_LOOPEND (4) - - KX_SOUNDACT_LOOPBIDIRECTIONAL (5) - - KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP (6) - @type mode: integer - """ - -#{ Play Methods - def startSound(): - """ - Starts the sound. - """ - def pauseSound(): - """ - Pauses the sound. - """ - def stopSound(): - """ - Stops the sound. - """ -#} - -#{ Deprecated - def setFilename(filename): - """ - Sets the filename of the sound this actuator plays. - - @deprecated: Use the L{fileName} attribute instead. - @type filename: string - """ - def getFilename(): - """ - Returns the filename of the sound this actuator plays. - - @deprecated: Use the L{fileName} attribute instead. - @rtype: string - """ - def setGain(gain): - """ - Sets the gain (volume) of the sound - - @deprecated: Use the L{volume} attribute instead. - @type gain: float - @param gain: 0.0 (quiet) <= gain <= 1.0 (loud) - """ - def getGain(): - """ - Gets the gain (volume) of the sound. - - @deprecated: Use the L{volume} attribute instead. - @rtype: float - """ - def setPitch(pitch): - """ - Sets the pitch of the sound. - - @deprecated: Use the L{pitch} attribute instead. - @type pitch: float - """ - def getPitch(): - """ - Returns the pitch of the sound. - - @deprecated: Use the L{pitch} attribute instead. - @rtype: float - """ - def setRollOffFactor(rolloff): - """ - Sets the rolloff factor for the sounds. - - Rolloff defines the rate of attenuation as the sound gets further away. - Higher rolloff factors shorten the distance at which the sound can be heard. - - @deprecated: Use the L{rollOffFactor} attribute instead. - @type rolloff: float - """ - def getRollOffFactor(): - """ - Returns the rolloff factor for the sound. - - @deprecated: Use the L{rollOffFactor} attribute instead. - @rtype: float - """ - def setLooping(loop): - """ - Sets the loop mode of the actuator. - - @bug: There are no constants defined for this method! - @param loop: - Play Stop 1 - - Play End 2 - - Loop Stop 3 - - Loop End 4 - - Bidirection Stop 5 - - Bidirection End 6 - - @deprecated: Use the L{looping} attribute instead. - @type loop: integer - """ - def getLooping(): - """ - Returns the current loop mode of the actuator. - - @deprecated: Use the L{looping} attribute instead. - @rtype: integer - """ - def setPosition(x, y, z): - """ - Sets the position this sound will come from. - - @deprecated: Use the L{position} attribute instead. - @type x: float - @param x: The x coordinate of the sound. - @type y: float - @param y: The y coordinate of the sound. - @type z: float - @param z: The z coordinate of the sound. - """ - def setVelocity(vx, vy, vz): - """ - Sets the velocity this sound is moving at. - - The sound's pitch is determined from the velocity. - - @deprecated: Use the L{velocity} attribute instead. - @type vx: float - @param vx: The vx coordinate of the sound. - @type vy: float - @param vy: The vy coordinate of the sound. - @type vz: float - @param vz: The vz coordinate of the sound. - """ - def setOrientation(o11, o12, o13, o21, o22, o23, o31, o32, o33): - """ - Sets the orientation of the sound. - - The nine parameters specify a rotation matrix:: - | o11, o12, o13 | - | o21, o22, o23 | - | o31, o32, o33 | - @deprecated: Use the L{orientation} attribute instead. - """ - - def setType(mode): - """ - Sets the operation mode of the actuator. - - @deprecated: Use the L{type} attribute instead. - @param mode: KX_SOUNDACT_PLAYSTOP, KX_SOUNDACT_PLAYEND, KX_SOUNDACT_LOOPSTOP, KX_SOUNDACT_LOOPEND, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP - @type mode: integer - """ - - def getType(): - """ - Returns the operation mode of the actuator. - - @deprecated: Use the L{type} attribute instead. - @rtype: integer - @return: KX_SOUNDACT_PLAYSTOP, KX_SOUNDACT_PLAYEND, KX_SOUNDACT_LOOPSTOP, KX_SOUNDACT_LOOPEND, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP - """ -#} - -class KX_StateActuator(SCA_IActuator): - """ - State actuator changes the state mask of parent object. - - Property: - - @ivar operation: type of bit operation to be applied on object state mask. - You can use one of the following constant: - - KX_STATE_OP_CPY (0) : Copy state mask - - KX_STATE_OP_SET (1) : Add bits to state mask - - KX_STATE_OP_CLR (2) : Substract bits to state mask - - KX_STATE_OP_NEG (3) : Invert bits to state mask - @type operation: integer - - @ivar mask: value that defines the bits that will be modified by the operation. - The bits that are 1 in the mask will be updated in the object state, - the bits that are 0 are will be left unmodified expect for the Copy operation - which copies the mask to the object state - @type mask: integer - """ - def setOperation(op): - """ - Set the type of bit operation to be applied on object state mask. - Use setMask() to specify the bits that will be modified. - - @deprecated: Use the L{operation} attribute instead. - @param op: bit operation (0=Copy, 1=Add, 2=Substract, 3=Invert) - @type op: integer - """ - def setMask(mask): - """ - Set the value that defines the bits that will be modified by the operation. - The bits that are 1 in the value will be updated in the object state, - the bits that are 0 are will be left unmodified expect for the Copy operation - which copies the value to the object state. - - @deprecated: Use the L{mask} attribute instead. - @param mask: bits that will be modified - @type mask: integer - """ - -class KX_TrackToActuator(SCA_IActuator): - """ - Edit Object actuator in Track To mode. - - @warning: Track To Actuators will be ignored if at game start, the - object to track to is invalid. - - This will generate a warning in the console: - - C{ERROR: GameObject I{Name} no object in EditObjectActuator I{ActuatorName}} - - @ivar object: the object this actuator tracks. - @type object: KX_GameObject or None - @ivar time: the time in frames with which to delay the tracking motion - @type time: integer - @ivar use3D: the tracking motion to use 3D - @type use3D: boolean - - """ -#{ Deprecated - def setObject(object): - """ - Sets the object to track. - - @deprecated: Use the L{object} attribute instead. - @type object: L{KX_GameObject}, string or None - @param object: Either a reference to a game object or the name of the object to track. - """ - def getObject(name_only): - """ - Returns the name of the object to track. - - @deprecated: Use the L{object} attribute instead. - @type name_only: bool - @param name_only: optional argument, when 0 return a KX_GameObject - @rtype: string, KX_GameObject or None if no object is set - """ - def setTime(time): - """ - Sets the time in frames with which to delay the tracking motion. - - @deprecated: Use the L{time} attribute instead. - @type time: integer - """ - def getTime(): - """ - Returns the time in frames with which the tracking motion is delayed. - - @deprecated: Use the L{time} attribute instead. - @rtype: integer - """ - def setUse3D(use3d): - """ - DEPRECATED: Use the property. - Sets the tracking motion to use 3D. - - @deprecated: Use the L{use3D} attribute instead. - @type use3d: boolean - @param use3d: - True: allow the tracking motion to extend in the z-direction. - - False: lock the tracking motion to the x-y plane. - """ - def getUse3D(): - """ - Returns True if the tracking motion will track in the z direction. - - @deprecated: Use the L{use3D} attribute instead. - @rtype: boolean - """ -#} - -class KX_VehicleWrapper(PyObjectPlus): - """ - KX_VehicleWrapper - - TODO - description - """ - - def addWheel(wheel, attachPos, attachDir, axleDir, suspensionRestLength, wheelRadius, hasSteering): - - """ - Add a wheel to the vehicle - - @param wheel: The object to use as a wheel. - @type wheel: L{KX_GameObject} or a KX_GameObject name - @param attachPos: The position that this wheel will attach to. - @type attachPos: vector of 3 floats - @param attachDir: The direction this wheel points. - @type attachDir: vector of 3 floats - @param axleDir: The direction of this wheels axle. - @type axleDir: vector of 3 floats - @param suspensionRestLength: TODO - Description - @type suspensionRestLength: float - @param wheelRadius: The size of the wheel. - @type wheelRadius: float - """ - - def applyBraking(force, wheelIndex): - """ - Apply a braking force to the specified wheel - - @param force: the brake force - @type force: float - - @param wheelIndex: index of the wheel where the force needs to be applied - @type wheelIndex: integer - """ - def applyEngineForce(force, wheelIndex): - """ - Apply an engine force to the specified wheel - - @param force: the engine force - @type force: float - - @param wheelIndex: index of the wheel where the force needs to be applied - @type wheelIndex: integer - """ - def getConstraintId(): - """ - Get the constraint ID - - @rtype: integer - @return: the constraint id - """ - def getConstraintType(): - """ - Returns the constraint type. - - @rtype: integer - @return: constraint type - """ - def getNumWheels(): - """ - Returns the number of wheels. - - @rtype: integer - @return: the number of wheels for this vehicle - """ - def getWheelOrientationQuaternion(wheelIndex): - """ - Returns the wheel orientation as a quaternion. - - @param wheelIndex: the wheel index - @type wheelIndex: integer - - @rtype: TODO - type should be quat as per method name but from the code it looks like a matrix - @return: TODO Description - """ - def getWheelPosition(wheelIndex): - """ - Returns the position of the specified wheel - - @param wheelIndex: the wheel index - @type wheelIndex: integer - - @rtype: list[x, y, z] - @return: position vector - """ - def getWheelRotation(wheelIndex): - """ - Returns the rotation of the specified wheel - - @param wheelIndex: the wheel index - @type wheelIndex: integer - - @rtype: float - @return: the wheel rotation - """ - def setRollInfluence(rollInfluece, wheelIndex): - """ - Set the specified wheel's roll influence. - The higher the roll influence the more the vehicle will tend to roll over in corners. - - @param rollInfluece: the wheel roll influence - @type rollInfluece: float - - @param wheelIndex: the wheel index - @type wheelIndex: integer - """ - def setSteeringValue(steering, wheelIndex): - """ - Set the specified wheel's steering - - @param steering: the wheel steering - @type steering: float - - @param wheelIndex: the wheel index - @type wheelIndex: integer - """ - def setSuspensionCompression(compression, wheelIndex): - """ - Set the specified wheel's compression - - @param compression: the wheel compression - @type compression: float - - @param wheelIndex: the wheel index - @type wheelIndex: integer - """ - def setSuspensionDamping(damping, wheelIndex): - """ - Set the specified wheel's damping - - @param damping: the wheel damping - @type damping: float - - @param wheelIndex: the wheel index - @type wheelIndex: integer - """ - def setSuspensionStiffness(stiffness, wheelIndex): - """ - Set the specified wheel's stiffness - - @param stiffness: the wheel stiffness - @type stiffness: float - - @param wheelIndex: the wheel index - @type wheelIndex: integer - """ - def setTyreFriction(friction, wheelIndex): - """ - Set the specified wheel's tyre friction - - @param friction: the tyre friction - @type friction: float - - @param wheelIndex: the wheel index - @type wheelIndex: integer - """ - -class KX_VertexProxy(SCA_IObject): - """ - A vertex holds position, UV, colour and normal information. - - Note: - The physics simulation is NOT currently updated - physics will not respond - to changes in the vertex position. - - @ivar XYZ: The position of the vertex. - @type XYZ: list [x, y, z] - @ivar UV: The texture coordinates of the vertex. - @type UV: list [u, v] - @ivar normal: The normal of the vertex - @type normal: list [nx, ny, nz] - @ivar colour: The colour of the vertex. - Black = [0.0, 0.0, 0.0, 1.0], White = [1.0, 1.0, 1.0, 1.0] - @type colour: list [r, g, b, a] - @ivar color: Synonym for colour. - - @group Position: x, y, z - @ivar x: The x coordinate of the vertex. - @type x: float - @ivar y: The y coordinate of the vertex. - @type y: float - @ivar z: The z coordinate of the vertex. - @type z: float - - @group Texture Coordinates: u, v - @ivar u: The u texture coordinate of the vertex. - @type u: float - @ivar v: The v texture coordinate of the vertex. - @type v: float - - @ivar u2: The second u texture coordinate of the vertex. - @type u2: float - @ivar v2: The second v texture coordinate of the vertex. - @type v2: float - - @group Colour: r, g, b, a - @ivar r: The red component of the vertex colour. 0.0 <= r <= 1.0 - @type r: float - @ivar g: The green component of the vertex colour. 0.0 <= g <= 1.0 - @type g: float - @ivar b: The blue component of the vertex colour. 0.0 <= b <= 1.0 - @type b: float - @ivar a: The alpha component of the vertex colour. 0.0 <= a <= 1.0 - @type a: float - """ - - def getXYZ(): - """ - Gets the position of this vertex. - - @rtype: list [x, y, z] - @return: this vertexes position in local coordinates. - """ - def setXYZ(pos): - """ - Sets the position of this vertex. - - @type pos: list [x, y, z] - @param pos: the new position for this vertex in local coordinates. - """ - def getUV(): - """ - Gets the UV (texture) coordinates of this vertex. - - @rtype: list [u, v] - @return: this vertexes UV (texture) coordinates. - """ - def setUV(uv): - """ - Sets the UV (texture) coordinates of this vertex. - - @type uv: list [u, v] - """ - def getUV2(): - """ - Gets the 2nd UV (texture) coordinates of this vertex. - - @rtype: list [u, v] - @return: this vertexes UV (texture) coordinates. - """ - def setUV2(uv, unit): - """ - Sets the 2nd UV (texture) coordinates of this vertex. - - @type uv: list [u, v] - @param unit: optional argument, FLAT==1, SECOND_UV==2, defaults to SECOND_UV - @param unit: int - """ - def getRGBA(): - """ - Gets the colour of this vertex. - - The colour is represented as four bytes packed into an integer value. The colour is - packed as RGBA. - - Since Python offers no way to get each byte without shifting, you must use the struct module to - access colour in an machine independent way. - - Because of this, it is suggested you use the r, g, b and a attributes or the colour attribute instead. - - Example:: - import struct; - col = struct.unpack('4B', struct.pack('I', v.getRGBA())) - # col = (r, g, b, a) - # black = ( 0, 0, 0, 255) - # white = (255, 255, 255, 255) - - @rtype: integer - @return: packed colour. 4 byte integer with one byte per colour channel in RGBA format. - """ - def setRGBA(col): - """ - Sets the colour of this vertex. - - See getRGBA() for the format of col, and its relevant problems. Use the r, g, b and a attributes - or the colour attribute instead. - - setRGBA() also accepts a four component list as argument col. The list represents the colour as [r, g, b, a] - with black = [0.0, 0.0, 0.0, 1.0] and white = [1.0, 1.0, 1.0, 1.0] - - Example:: - v.setRGBA(0xff0000ff) # Red - v.setRGBA(0xff00ff00) # Green on little endian, transparent purple on big endian - v.setRGBA([1.0, 0.0, 0.0, 1.0]) # Red - v.setRGBA([0.0, 1.0, 0.0, 1.0]) # Green on all platforms. - - @type col: integer or list [r, g, b, a] - @param col: the new colour of this vertex in packed RGBA format. - """ - def getNormal(): - """ - Gets the normal vector of this vertex. - - @rtype: list [nx, ny, nz] - @return: normalised normal vector. - """ - def setNormal(normal): - """ - Sets the normal vector of this vertex. - - @type normal: sequence of floats [r, g, b] - @param normal: the new normal of this vertex. - """ - -class KX_VisibilityActuator(SCA_IActuator): - """ - Visibility Actuator. - @ivar visibility: whether the actuator makes its parent object visible or invisible - @type visibility: boolean - @ivar useOcclusion: whether the actuator makes its parent object an occluder or not - @type useOcclusion: boolean - @ivar useRecursion: whether the visibility/occlusion should be propagated to all children of the object - @type useRecursion: boolean - """ -#{ Deprecated - def set(visible): - """ - Sets whether the actuator makes its parent object visible or invisible. - - @deprecated: Use the L{visibility} attribute instead. - @param visible: - True: Makes its parent visible. - - False: Makes its parent invisible. - """ -#} - -class SCA_2DFilterActuator(SCA_IActuator): - """ - Create, enable and disable 2D filters - - Properties: - - The following properties don't have an immediate effect. - You must active the actuator to get the result. - The actuator is not persistent: it automatically stops itself after setting up the filter - but the filter remains active. To stop a filter you must activate the actuator with 'type' - set to RAS_2DFILTER_DISABLED or RAS_2DFILTER_NOFILTER. - - @ivar shaderText: shader source code for custom shader - @type shaderText: string - @ivar disableMotionBlur: action on motion blur: 0=enable, 1=disable - @type disableMotionBlur: integer - @ivar mode: type of 2D filter, use one of the following constants: - RAS_2DFILTER_ENABLED (-2) : enable the filter that was previously disabled - RAS_2DFILTER_DISABLED (-1) : disable the filter that is currently active - RAS_2DFILTER_NOFILTER (0) : disable and destroy the filter that is currently active - RAS_2DFILTER_MOTIONBLUR (1) : create and enable preset filters - RAS_2DFILTER_BLUR (2) - RAS_2DFILTER_SHARPEN (3) - RAS_2DFILTER_DILATION (4) - RAS_2DFILTER_EROSION (5) - RAS_2DFILTER_LAPLACIAN (6) - RAS_2DFILTER_SOBEL (7) - RAS_2DFILTER_PREWITT (8) - RAS_2DFILTER_GRAYSCALE (9) - RAS_2DFILTER_SEPIA (10) - RAS_2DFILTER_INVERT (11) - RAS_2DFILTER_CUSTOMFILTER (12) : customer filter, the code code is set via shaderText property - @type mode: integer - @ivar passNumber: order number of filter in the stack of 2D filters. Filters are executed in increasing order of passNb. - Only be one filter can be defined per passNb. - @type passNumber: integer (0-100) - @ivar value: argument for motion blur filter - @type value: float (0.0-100.0) - """ - -class SCA_ANDController(SCA_IController): - """ - An AND controller activates only when all linked sensors are activated. - - There are no special python methods for this controller. - """ - -class SCA_ActuatorSensor(SCA_ISensor): - """ - Actuator sensor detect change in actuator state of the parent object. - It generates a positive pulse if the corresponding actuator is activated - and a negative pulse if the actuator is deactivated. - - Properties: - - @ivar actuator: the name of the actuator that the sensor is monitoring. - @type actuator: string - """ -#{Deprecated - def getActuator(): - """ - Return the Actuator with which the sensor operates. - - @deprecated: Use the L{actuator} attribute instead. - @rtype: string - """ - def setActuator(name): - """ - Sets the Actuator with which to operate. If there is no Actuator - of this name, the function has no effect. - - @deprecated: Use the L{actuator} attribute instead. - @param name: actuator name - @type name: string - """ -#} - -class SCA_AlwaysSensor(SCA_ISensor): - """ - This sensor is always activated. - """ - -class SCA_DelaySensor(SCA_ISensor): - """ - The Delay sensor generates positive and negative triggers at precise time, - expressed in number of frames. The delay parameter defines the length - of the initial OFF period. A positive trigger is generated at the end of this period. - The duration parameter defines the length of the ON period following the OFF period. - There is a negative trigger at the end of the ON period. If duration is 0, the sensor - stays ON and there is no negative trigger. - The sensor runs the OFF-ON cycle once unless the repeat option is set: the - OFF-ON cycle repeats indefinately (or the OFF cycle if duration is 0). - Use SCA_ISensor::reset() at any time to restart sensor. - - Properties: - - @ivar delay: length of the initial OFF period as number of frame, 0 for immediate trigger. - @type delay: integer. - @ivar duration: length of the ON period in number of frame after the initial OFF period. - If duration is greater than 0, a negative trigger is sent at the end of the ON pulse. - @type duration: integer - @ivar repeat: 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once. - @type repeat: integer - """ -#{Deprecated - def setDelay(delay): - """ - Set the initial delay before the positive trigger. - - @deprecated: Use the L{delay} attribute instead. - @param delay: length of the initial OFF period as number of frame, 0 for immediate trigger - @type delay: integer - """ - def setDuration(duration): - """ - Set the duration of the ON pulse after initial delay and the generation of the positive trigger. - If duration is greater than 0, a negative trigger is sent at the end of the ON pulse. - - @deprecated: Use the L{duration} attribute instead. - @param duration: length of the ON period in number of frame after the initial OFF period - @type duration: integer - """ - def setRepeat(repeat): - """ - Set if the sensor repeat mode. - - @deprecated: Use the L{repeat} attribute instead. - @param repeat: 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once. - @type repeat: integer - """ - def getDelay(): - """ - Return the delay parameter value. - - @deprecated: Use the L{delay} attribute instead. - @rtype: integer - """ - def getDuration(): - """ - Return the duration parameter value - - @deprecated: Use the L{duration} attribute instead. - @rtype: integer - """ - def getRepeat(): - """ - Return the repeat parameter value - - @deprecated: Use the L{repeat} attribute instead. - @rtype: KX_TRUE or KX_FALSE - """ -#} - -class SCA_JoystickSensor(SCA_ISensor): - """ - This sensor detects player joystick events. - - Properties: - - @ivar axisValues: (read-only) The state of the joysticks axis as a list of values L{numAxis} long. - each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. - The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. - left:[-32767, 0, ...], right:[32767, 0, ...], up:[0, -32767, ...], down:[0, 32767, ...] - @type axisValues: list of ints - - @ivar axisSingle: (read-only) like L{axisValues} but returns a single axis value that is set by the sensor. - Only use this for "Single Axis" type sensors otherwise it will raise an error. - @type axisSingle: int - - @ivar hatValues: (read-only) The state of the joysticks hats as a list of values L{numHats} long. - each spesifying the direction of the hat from 1 to 12, 0 when inactive. - Hat directions are as follows... - - 0:None - - 1:Up - - 2:Right - - 4:Down - - 8:Left - - 3:Up - Right - - 6:Down - Right - - 12:Down - Left - - 9:Up - Left - - @type hatValues: list of ints - - @ivar hatSingle: (read-only) like L{hatValues} but returns a single hat direction value that is set by the sensor. - @type hatSingle: int - - @ivar numAxis: (read-only) The number of axes for the joystick at this index. - @type numAxis: integer - @ivar numButtons: (read-only) The number of buttons for the joystick at this index. - @type numButtons: integer - @ivar numHats: (read-only) The number of hats for the joystick at this index. - @type numHats: integer - @ivar connected: (read-only) True if a joystick is connected at this joysticks index. - @type connected: boolean - @ivar index: The joystick index to use (from 0 to 7). The first joystick is always 0. - @type index: integer - @ivar threshold: Axis threshold. Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive. - @type threshold: integer - @ivar button: The button index the sensor reacts to (first button = 0). When the "All Events" toggle is set, this option has no effect. - @type button: integer - @ivar axis: The axis this sensor reacts to, as a list of two values [axisIndex, axisDirection] - axisIndex: the axis index to use when detecting axis movement, 1=primary directional control, 2=secondary directional control. - axisDirection: 0=right, 1=up, 2=left, 3=down - @type axis: [integer, integer] - @ivar hat: The hat the sensor reacts to, as a list of two values: [hatIndex, hatDirection] - hatIndex: the hat index to use when detecting hat movement, 1=primary hat, 2=secondary hat (4 max). - hatDirection: 1-12 - @type hat: [integer, integer] - """ - - def getButtonActiveList(): - """ - Returns a list containing the indicies of the currently pressed buttons. - @rtype: list - """ - def getButtonStatus(buttonIndex): - """ - Returns a bool of the current pressed state of the specified button. - @param buttonIndex: the button index, 0=first button - @type buttonIndex: integer - @rtype: bool - """ -#{Deprecated - def getIndex(): - """ - Returns the joystick index to use (from 1 to 8). - - @deprecated: Use the L{index} attribute instead. - @rtype: integer - """ - def setIndex(index): - """ - Sets the joystick index to use. - - @deprecated: Use the L{index} attribute instead. - @param index: The index of this joystick sensor, Clamped between 1 and 8. - @type index: integer - @note: This is only useful when you have more then 1 joystick connected to your computer - multiplayer games. - """ - def getAxis(): - """ - Returns the current axis this sensor reacts to. See L{getAxisValue()} for the current axis state. - - @deprecated: Use the L{axis} attribute instead. - @rtype: list - @return: 2 values returned are [axisIndex, axisDirection] - see L{setAxis()} for their purpose. - @note: When the "All Events" toggle is set, this option has no effect. - """ - def setAxis(axisIndex, axisDirection): - """ - @deprecated: Use the L{axis} attribute instead. - @param axisIndex: Set the axis index to use when detecting axis movement. - @type axisIndex: integer from 1 to 2 - @param axisDirection: Set the axis direction used for detecting motion. 0:right, 1:up, 2:left, 3:down. - @type axisDirection: integer from 0 to 3 - @note: When the "All Events" toggle is set, this option has no effect. - """ - def getAxisValue(): - """ - Returns the state of the joysticks axis. See differs to L{getAxis()} returning the current state of the joystick. - - @deprecated: Use the L{axisValues} attribute instead. - @rtype: list - @return: 4 values, each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. - - The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. - - left:[-32767, 0, ...], right:[32767, 0, ...], up:[0, -32767, ...], down:[0, 32767, ...] - @note: Some gamepads only set the axis on and off like a button. - """ - def getThreshold(): - """ - Get the axis threshold. See L{setThreshold()} for details. - - @deprecated: Use the L{threshold} attribute instead. - @rtype: integer - """ - def setThreshold(threshold): - """ - Set the axis threshold. - - @deprecated: Use the L{threshold} attribute instead. - @param threshold: Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive. - @type threshold: integer - """ - def getButton(): - """ - Returns the button index the sensor reacts to. See L{getButtonValue()} for a list of pressed buttons. - - @deprecated: Use the L{button} attribute instead. - @rtype: integer - @note: When the "All Events" toggle is set, this option has no effect. - """ - def setButton(index): - """ - Sets the button index the sensor reacts to when the "All Events" option is not set. - - @deprecated: Use the L{button} attribute instead. - @note: When the "All Events" toggle is set, this option has no effect. - """ - def getButtonValue(): - """ - Returns a list containing the indicies of the currently pressed buttons. - - @deprecated: Use the L{getButtonActiveList} method instead. - @rtype: list - """ - def getHat(): - """ - Returns the current hat direction this sensor is set to. - [hatNumber, hatDirection]. - - @deprecated: Use the L{hat} attribute instead. - @rtype: list - @note: When the "All Events" toggle is set, this option has no effect. - """ - def setHat(index,direction): - """ - Sets the hat index the sensor reacts to when the "All Events" option is not set. - - @deprecated: Use the L{hat} attribute instead. - @type index: integer - """ - def getNumAxes(): - """ - Returns the number of axes for the joystick at this index. - - @deprecated: Use the L{numAxis} attribute instead. - @rtype: integer - """ - def getNumButtons(): - """ - Returns the number of buttons for the joystick at this index. - - @deprecated: Use the L{numButtons} attribute instead. - @rtype: integer - """ - def getNumHats(): - """ - Returns the number of hats for the joystick at this index. - - @deprecated: Use the L{numHats} attribute instead. - @rtype: integer - """ - def isConnected(): - """ - Returns True if a joystick is detected at this joysticks index. - - @deprecated: Use the L{connected} attribute instead. - @rtype: bool - """ -#} - -class SCA_KeyboardSensor(SCA_ISensor): - """ - A keyboard sensor detects player key presses. - - See module L{GameKeys} for keycode values. - - @ivar key: The key code this sensor is looking for. - @type key: keycode from L{GameKeys} module - @ivar hold1: The key code for the first modifier this sensor is looking for. - @type hold1: keycode from L{GameKeys} module - @ivar hold2: The key code for the second modifier this sensor is looking for. - @type hold2: keycode from L{GameKeys} module - @ivar toggleProperty: The name of the property that indicates whether or not to log keystrokes as a string. - @type toggleProperty: string - @ivar targetProperty: The name of the property that receives keystrokes in case in case a string is logged. - @type targetProperty: string - @ivar useAllKeys: Flag to determine whether or not to accept all keys. - @type useAllKeys: boolean - @ivar events: a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only). - - - 'keycode' matches the values in L{GameKeys}. - - 'status' uses... - - L{GameLogic.KX_INPUT_NONE} - - L{GameLogic.KX_INPUT_JUST_ACTIVATED} - - L{GameLogic.KX_INPUT_ACTIVE} - - L{GameLogic.KX_INPUT_JUST_RELEASED} - - @type events: list [[keycode, status], ...] - """ - - def getKeyStatus(keycode): - """ - Get the status of a key. - - @rtype: key state L{GameLogic} members (KX_INPUT_NONE, KX_INPUT_JUST_ACTIVATED, KX_INPUT_ACTIVE, KX_INPUT_JUST_RELEASED) - @return: The state of the given key - @type keycode: integer - @param keycode: The code that represents the key you want to get the state of - """ - -#{Deprecated - def getKey(): - """ - Returns the key code this sensor is looking for. - - @deprecated: Use the L{key} attribute instead. - @rtype: keycode from L{GameKeys} module - """ - - def setKey(keycode): - """ - Set the key this sensor should listen for. - - @deprecated: Use the L{key} attribute instead. - @type keycode: keycode from L{GameKeys} module - """ - - def getHold1(): - """ - Returns the key code for the first modifier this sensor is looking for. - - @deprecated: Use the L{hold1} attribute instead. - @rtype: keycode from L{GameKeys} module - """ - - def setHold1(keycode): - """ - Sets the key code for the first modifier this sensor should look for. - - @deprecated: Use the L{hold1} attribute instead. - @type keycode: keycode from L{GameKeys} module - """ - - def getHold2(): - """ - Returns the key code for the second modifier this sensor is looking for. - - @deprecated: Use the L{hold2} attribute instead. - @rtype: keycode from L{GameKeys} module - """ - - def setHold2(keycode): - """ - Sets the key code for the second modifier this sensor should look for. - - @deprecated: Use the L{hold2} attribute instead. - @type keycode: keycode from L{GameKeys} module - """ - - def getPressedKeys(): - """ - Get a list of keys that have either been pressed, or just released this frame. - - @deprecated: Use the L{events} attribute instead. - @rtype: list of key status. [[keycode, status]] - """ - - def getCurrentlyPressedKeys(): - """ - Get a list of currently pressed keys that have either been pressed, or just released - - @deprecated: Use the L{events} attribute instead. - @rtype: list of key status. [[keycode, status]] - """ -#} - -class SCA_NANDController(SCA_IController): - """ - An NAND controller activates when all linked sensors are not active. - - There are no special python methods for this controller. - """ - -class SCA_NORController(SCA_IController): - """ - An NOR controller activates only when all linked sensors are de-activated. - - There are no special python methods for this controller. - """ - -class SCA_ORController(SCA_IController): - """ - An OR controller activates when any connected sensor activates. - - There are no special python methods for this controller. - """ - -class SCA_PropertyActuator(SCA_IActuator): - """ - Property Actuator - - Properties: - - @ivar propName: the property on which to operate. - @type propName: string - @ivar value: the value with which the actuator operates. - @type value: string - @ivar mode: TODO - add constants to game logic dict!. - @type mode: int - """ -#{ Deprecated - def setProperty(prop): - """ - Set the property on which to operate. - - If there is no property of this name, the call is ignored. - - @deprecated: Use the L{propName} attribute instead. - @type prop: string - @param prop: The name of the property to set. - """ - def getProperty(): - """ - Returns the name of the property on which to operate. - - @deprecated: Use the L{propName} attribute instead. - @rtype: string - """ - def setValue(value): - """ - Set the value with which the actuator operates. - - If the value is not compatible with the type of the - property, the subsequent action is ignored. - - @deprecated: Use the L{value} attribute instead. - @type value: string - """ - def getValue(): - """ - Gets the value with which this actuator operates. - - @deprecated: Use the L{value} attribute instead. - @rtype: string - """ -#} - -class SCA_PropertySensor(SCA_ISensor): - """ - Activates when the game object property matches. - - Properties: - - @ivar mode: type of check on the property: - KX_PROPSENSOR_EQUAL(1), KX_PROPSENSOR_NOTEQUAL(2), KX_PROPSENSOR_INTERVAL(3), - KX_PROPSENSOR_CHANGED(4), KX_PROPSENSOR_EXPRESSION(5) - @type mode: integer - @ivar propName: the property the sensor operates. - @type propName: string - @ivar value: the value with which the sensor compares to the value of the property. - @type value: string - """ -#{ Deprecated - def getType(): - """ - Gets when to activate this sensor. - - @deprecated: Use the L{mode} attribute instead. - @return: KX_PROPSENSOR_EQUAL, KX_PROPSENSOR_NOTEQUAL, - KX_PROPSENSOR_INTERVAL, KX_PROPSENSOR_CHANGED, - or KX_PROPSENSOR_EXPRESSION. - """ - - def setType(checktype): - """ - Set the type of check to perform. - - @deprecated: Use the L{mode} attribute instead. - @type checktype: KX_PROPSENSOR_EQUAL, KX_PROPSENSOR_NOTEQUAL, - KX_PROPSENSOR_INTERVAL, KX_PROPSENSOR_CHANGED, - or KX_PROPSENSOR_EXPRESSION. - """ - - def getProperty(): - """ - Return the property with which the sensor operates. - - @deprecated: Use the L{propName} attribute instead. - @rtype: string - @return: the name of the property this sensor is watching. - """ - def setProperty(name): - """ - Sets the property with which to operate. If there is no property - of that name, this call is ignored. - - @deprecated: Use the L{propName} attribute instead. - @type name: string. - """ - def getValue(): - """ - Return the value with which the sensor compares to the value of the property. - - @deprecated: Use the L{value} attribute instead. - @rtype: string - @return: the value of the property this sensor is watching. - """ - def setValue(value): - """ - Set the value with which the sensor operates. If the value - is not compatible with the type of the property, the subsequent - action is ignored. - - @deprecated: Use the L{value} attribute instead. - @type value: string - """ -#} - -class SCA_PythonController(SCA_IController): - """ - A Python controller uses a Python script to activate it's actuators, - based on it's sensors. - - Properties: - - @ivar script: The value of this variable depends on the execution methid. - - When 'Script' execution mode is set this value contains the entire python script as a single string (not the script name as you might expect) which can be modified to run different scripts. - - When 'Module' execution mode is set this value will contain a single line string - module name and function "module.func" or "package.modile.func" where the module names are python textblocks or external scripts. - note: once this is set the script name given for warnings will remain unchanged. - @type script: string - @ivar mode: the execution mode for this controller (read-only). - - Script: 0, Execite the L{script} as a python code. - - Module: 1, Execite the L{script} as a module and function. - @type mode: int - - @group Deprecated: getScript, setScript - """ - def activate(actuator): - """ - Activates an actuator attached to this controller. - @type actuator: actuator or the actuator name as a string - """ - def deactivate(actuator): - """ - Deactivates an actuator attached to this controller. - @type actuator: actuator or the actuator name as a string - """ - def getScript(): - """ - Gets the Python script body this controller executes. - - @deprecated: Use the L{script} attribute instead. - @rtype: string - """ - def setScript(script_body): - """ - Sets the Python script string this controller executes. - - @deprecated: Use the L{script} attribute instead. - @type script_body: string. - """ - -class SCA_RandomActuator(SCA_IActuator): - """ - Random Actuator - - Properties: - - @ivar seed: Seed of the random number generator. - Equal seeds produce equal series. If the seed is 0, - the generator will produce the same value on every call. - @type seed: integer - @ivar para1: the first parameter of the active distribution. - Refer to the documentation of the generator types for the meaning - of this value. - @type para1: float, read-only - @ivar para2: the second parameter of the active distribution. - Refer to the documentation of the generator types for the meaning - of this value. - @type para2: float, read-only - @ivar distribution: distribution type: - KX_RANDOMACT_BOOL_CONST, KX_RANDOMACT_BOOL_UNIFORM, KX_RANDOMACT_BOOL_BERNOUILLI, - KX_RANDOMACT_INT_CONST, KX_RANDOMACT_INT_UNIFORM, KX_RANDOMACT_INT_POISSON, - KX_RANDOMACT_FLOAT_CONST, KX_RANDOMACT_FLOAT_UNIFORM, KX_RANDOMACT_FLOAT_NORMAL, - KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL - @type distribution: integer, read-only - @ivar propName: the name of the property to set with the random value. - If the generator and property types do not match, the assignment is ignored. - @type propName: string - - """ - def setBoolConst(value): - """ - Sets this generator to produce a constant boolean value. - - @param value: The value to return. - @type value: boolean - """ - def setBoolUniform(): - """ - Sets this generator to produce a uniform boolean distribution. - - The generator will generate True or False with 50% chance. - """ - def setBoolBernouilli(value): - """ - Sets this generator to produce a Bernouilli distribution. - - @param value: Specifies the proportion of False values to produce. - - 0.0: Always generate True - - 1.0: Always generate False - @type value: float - """ - def setIntConst(value): - """ - Sets this generator to always produce the given value. - - @param value: the value this generator produces. - @type value: integer - """ - def setIntUniform(lower_bound, upper_bound): - """ - Sets this generator to produce a random value between the given lower and - upper bounds (inclusive). - - @type lower_bound: integer - @type upper_bound: integer - """ - def setIntPoisson(value): - """ - Generate a Poisson-distributed number. - - This performs a series of Bernouilli tests with parameter value. - It returns the number of tries needed to achieve succes. - - @type value: float - """ - def setFloatConst(value): - """ - Always generate the given value. - - @type value: float - """ - def setFloatUniform(lower_bound, upper_bound): - """ - Generates a random float between lower_bound and upper_bound with a - uniform distribution. - - @type lower_bound: float - @type upper_bound: float - """ - def setFloatNormal(mean, standard_deviation): - """ - Generates a random float from the given normal distribution. - - @type mean: float - @param mean: The mean (average) value of the generated numbers - @type standard_deviation: float - @param standard_deviation: The standard deviation of the generated numbers. - """ - def setFloatNegativeExponential(half_life): - """ - Generate negative-exponentially distributed numbers. - - The half-life 'time' is characterized by half_life. - - @type half_life: float - """ -#{ Deprecated - def setSeed(seed): - """ - Sets the seed of the random number generator. - - Equal seeds produce equal series. If the seed is 0, - the generator will produce the same value on every call. - - @deprecated: Use the L{seed} attribute instead. - @type seed: integer - """ - def getSeed(): - """ - Returns the initial seed of the generator. - - @deprecated: Use the L{seed} attribute instead. - @rtype: integer - """ - def getPara1(): - """ - Returns the first parameter of the active distribution. - - Refer to the documentation of the generator types for the meaning - of this value. - - @deprecated: Use the L{para1} attribute instead. - @rtype: float - """ - def getPara2(): - """ - Returns the second parameter of the active distribution. - - Refer to the documentation of the generator types for the meaning - of this value. - - @deprecated: Use the L{para2} attribute instead. - @rtype: float - """ - def getDistribution(): - """ - Returns the type of random distribution. - - @deprecated: Use the L{distribution} attribute instead. - @rtype: distribution type - @return: KX_RANDOMACT_BOOL_CONST, KX_RANDOMACT_BOOL_UNIFORM, KX_RANDOMACT_BOOL_BERNOUILLI, - KX_RANDOMACT_INT_CONST, KX_RANDOMACT_INT_UNIFORM, KX_RANDOMACT_INT_POISSON, - KX_RANDOMACT_FLOAT_CONST, KX_RANDOMACT_FLOAT_UNIFORM, KX_RANDOMACT_FLOAT_NORMAL, - KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL - """ - def setProperty(property): - """ - Set the property to which the random value is assigned. - - If the generator and property types do not match, the assignment is ignored. - - @deprecated: Use the L{propName} attribute instead. - @type property: string - @param property: The name of the property to set. - """ - def getProperty(): - """ - Returns the name of the property to set. - - @deprecated: Use the L{propName} attribute instead. - @rtype: string - """ -#} - - -class SCA_RandomSensor(SCA_ISensor): - """ - This sensor activates randomly. - - @ivar lastDraw: The seed of the random number generator. - @type lastDraw: int - @ivar seed: The seed of the random number generator. - @type seed: int - """ - - def setSeed(seed): - """ - Sets the seed of the random number generator. - - If the seed is 0, the generator will produce the same value on every call. - - @type seed: integer. - """ - def getSeed(): - """ - Returns the initial seed of the generator. Equal seeds produce equal random - series. - - @rtype: integer - """ - def getLastDraw(): - """ - Returns the last random number generated. - - @rtype: integer - """ - -class SCA_XNORController(SCA_IController): - """ - An XNOR controller activates when all linked sensors are the same (activated or inative). - - There are no special python methods for this controller. - """ - -class SCA_XORController(SCA_IController): - """ - An XOR controller activates when there is the input is mixed, but not when all are on or off. - - There are no special python methods for this controller. - """ - -class KX_Camera(KX_GameObject): - """ - A Camera object. - - @group Constants: INSIDE, INTERSECT, OUTSIDE - @ivar INSIDE: see sphereInsideFrustum() and boxInsideFrustum() - @ivar INTERSECT: see sphereInsideFrustum() and boxInsideFrustum() - @ivar OUTSIDE: see sphereInsideFrustum() and boxInsideFrustum() - - @ivar lens: The camera's lens value. - @type lens: float - @ivar near: The camera's near clip distance. - @type near: float - @ivar far: The camera's far clip distance. - @type far: float - @ivar perspective: True if this camera has a perspective transform, False for an orthographic projection. - @type perspective: boolean - @ivar frustum_culling: True if this camera is frustum culling. - @type frustum_culling: boolean - @ivar projection_matrix: This camera's 4x4 projection matrix. - @type projection_matrix: 4x4 Matrix [[float]] - @ivar modelview_matrix: This camera's 4x4 model view matrix. (read-only) - Regenerated every frame from the camera's position and orientation. - @type modelview_matrix: 4x4 Matrix [[float]] - @ivar camera_to_world: This camera's camera to world transform. (read-only) - Regenerated every frame from the camera's position and orientation. - @type camera_to_world: 4x4 Matrix [[float]] - @ivar world_to_camera: This camera's world to camera transform. (read-only) - Regenerated every frame from the camera's position and orientation. - This is camera_to_world inverted. - @type world_to_camera: 4x4 Matrix [[float]] - @ivar useViewport: True when the camera is used as a viewport, set True to enable a viewport for this camera. - @type useViewport: bool - - @group Deprecated: enableViewport, getProjectionMatrix, setProjectionMatrix - """ - - def sphereInsideFrustum(centre, radius): - """ - Tests the given sphere against the view frustum. - - @note: when the camera is first initialized the result will be invalid because the projection matrix has not been set. - @param centre: The centre of the sphere (in world coordinates.) - @type centre: list [x, y, z] - @param radius: the radius of the sphere - @type radius: float - @return: INSIDE, OUTSIDE or INTERSECT - - Example:: - import GameLogic - co = GameLogic.getCurrentController() - cam = co.owner - - # A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0] - if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE): - # Sphere is inside frustum ! - # Do something useful ! - else: - # Sphere is outside frustum - """ - def boxInsideFrustum(box): - """ - Tests the given box against the view frustum. - - Example:: - import GameLogic - co = GameLogic.getCurrentController() - cam = co.owner - - # Box to test... - box = [] - box.append([-1.0, -1.0, -1.0]) - box.append([-1.0, -1.0, 1.0]) - box.append([-1.0, 1.0, -1.0]) - box.append([-1.0, 1.0, 1.0]) - box.append([ 1.0, -1.0, -1.0]) - box.append([ 1.0, -1.0, 1.0]) - box.append([ 1.0, 1.0, -1.0]) - box.append([ 1.0, 1.0, 1.0]) - - if (cam.boxInsideFrustum(box) != cam.OUTSIDE): - # Box is inside/intersects frustum ! - # Do something useful ! - else: - # Box is outside the frustum ! - - @note: when the camera is first initialized the result will be invalid because the projection matrix has not been set. - @return: INSIDE, OUTSIDE or INTERSECT - @type box: list - @param box: Eight (8) corner points of the box (in world coordinates.) - """ - def pointInsideFrustum(point): - """ - Tests the given point against the view frustum. - - Example:: - import GameLogic - co = GameLogic.getCurrentController() - cam = co.owner - - # Test point [0.0, 0.0, 0.0] - if (cam.pointInsideFrustum([0.0, 0.0, 0.0])): - # Point is inside frustum ! - # Do something useful ! - else: - # Box is outside the frustum ! - - @note: when the camera is first initialized the result will be invalid because the projection matrix has not been set. - @rtype: boolean - @return: True if the given point is inside this camera's viewing frustum. - @type point: [x, y, z] - @param point: The point to test (in world coordinates.) - """ - def getCameraToWorld(): - """ - Returns the camera-to-world transform. - - @rtype: matrix (4x4 list) - @return: the camera-to-world transform matrix. - """ - def getWorldToCamera(): - """ - Returns the world-to-camera transform. - - This returns the inverse matrix of getCameraToWorld(). - - @rtype: matrix (4x4 list) - @return: the world-to-camera transform matrix. - """ - def getProjectionMatrix(): - """ - Returns the camera's projection matrix. - - @deprecated: Use the L{projection_matrix} attribute instead. - @rtype: matrix (4x4 list) - @return: the camera's projection matrix. - """ - def setProjectionMatrix(matrix): - """ - Sets the camera's projection matrix. - - You should use normalised device coordinates for the clipping planes: - left = -1.0, right = 1.0, top = 1.0, bottom = -1.0, near = cam.near, far = cam.far - - Example:: - import GameLogic - - def Scale(matrix, size): - for y in range(4): - for x in range(4): - matrix[y][x] = matrix[y][x] * size[y] - return matrix - - # Generate a perspective projection matrix - def Perspective(cam): - return [[cam.near, 0.0 , 0.0 , 0.0 ], - [0.0 , cam.near, 0.0 , 0.0 ], - [0.0 , 0.0 , -(cam.far+cam.near)/(cam.far-cam.near), -2.0*cam.far*cam.near/(cam.far - cam.near)], - [0.0 , 0.0 , -1.0 , 0.0 ]] - - # Generate an orthographic projection matrix - # You will need to scale the camera - def Orthographic(cam): - return [[1.0/cam.scaling[0], 0.0 , 0.0 , 0.0 ], - [0.0 , 1.0/cam.scaling[1], 0.0 , 0.0 ], - [0.0 , 0.0 , -2.0/(cam.far-cam.near), -(cam.far+cam.near)/(cam.far-cam.near)], - [0.0 , 0.0 , 0.0 , 1.0 ]] - - # Generate an isometric projection matrix - def Isometric(cam): - return Scale([[0.707, 0.0 , 0.707, 0.0], - [0.408, 0.816,-0.408, 0.0], - [0.0 , 0.0 , 0.0 , 0.0], - [0.0 , 0.0 , 0.0 , 1.0]], - [1.0/cam.scaling[0], 1.0/cam.scaling[1], 1.0/cam.scaling[2], 1.0]) - - co = GameLogic.getCurrentController() - cam = co.owner - cam.setProjectionMatrix(Perspective(cam))) - - @deprecated: Use the L{projection_matrix} attribute instead. - @type matrix: 4x4 matrix. - @param matrix: The new projection matrix for this camera. - """ - - def enableViewport(viewport): - """ - Use this camera to draw a viewport on the screen (for split screen games or overlay scenes). The viewport region is defined with L{setViewport}. - - @deprecated: Use the L{useViewport} attribute instead. - @type viewport: bool - @param viewport: the new viewport status - """ - def setOnTop(): - """ - Set this cameras viewport ontop of all other viewport. - """ - def setViewport(left, bottom, right, top): - """ - Sets the region of this viewport on the screen in pixels. - - Use L{Rasterizer.getWindowHeight} L{Rasterizer.getWindowWidth} to calculate values relative to the entire display. - - @type left: int - @type bottom: int - @type right: int - @type top: int - """ - def getScreenPosition(arg): - """ - Gets the position of an object projected on screen space. - - Example: - # For an object in the middle of the screen, coord = [0.5,0.5] - coord = camera.getScreenPosition(object) - - @param arg: L{KX_GameObject}, object name or list [x, y, z] - @rtype: list [x, y] - @return: the object's position in screen coordinates. - """ - def getScreenVect(x, y): - """ - Gets the vector from the camera position in the screen coordinate direction. - - Example: - # Gets the vector of the camera front direction: - m_vect = camera.getScreenVect(0.5,0.5) - - @type x: float - @type y: float - @rtype: 3d vector - @return: the vector from a screen coordinate. - """ - def getScreenRay(x, y, dist, property): - """ - Look towards a screen coordinate (x,y) and find first object hit within dist that matches prop. - The ray is similar to KX_GameObject->rayCastTo. - - Example: - # Gets an object with a property "wall" in front of the camera within a distance of 100: - target = camera.getScreenRay(0.5,0.5,100,"wall") - - @type x: float - @type y: float - @param dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other - @type dist: float - @param property: property name that object must have; can be omitted => detect any object - @type property: string - @rtype: L{KX_GameObject} - @return: the first object hit or None if no object or object does not match prop - """ - -class BL_ArmatureObject(KX_GameObject): - """ - An armature object. - - @ivar constraints: The list of armature constraint defined on this armature - Elements of the list can be accessed by index or string. - The key format for string access is ':' - @type constraints: list of L{BL_ArmatureConstraint} - @ivar channels: The list of armature channels. - Elements of the list can be accessed by index or name the bone. - @type channels: list of L{BL_ArmatureChannel} - """ - - def update(): - """ - Ensures that the armature will be updated on next graphic frame. - - This action is unecessary if a KX_ArmatureActuator with mode run is active - or if an action is playing. Use this function in other cases. It must be called - on each frame to ensure that the armature is updated continously. - """ - -class BL_ArmatureActuator(SCA_IActuator): - """ - Armature Actuators change constraint condition on armatures. - - @group Constants: KX_ACT_ARMATURE_RUN, KX_ACT_ARMATURE_ENABLE, KX_ACT_ARMATURE_DISABLE, KX_ACT_ARMATURE_SETTARGET, KX_ACT_ARMATURE_SETWEIGHT - @ivar KX_ACT_ARMATURE_RUN: see type - @ivar KX_ACT_ARMATURE_ENABLE: see type - @ivar KX_ACT_ARMATURE_DISABLE: see type - @ivar KX_ACT_ARMATURE_SETTARGET: see type - @ivar KX_ACT_ARMATURE_SETWEIGHT: see type - @ivar type: The type of action that the actuator executes when it is active. - - KX_ACT_ARMATURE_RUN(0): just make sure the armature will be updated on the next graphic frame - This is the only persistent mode of the actuator: it executes automatically once per frame until stopped by a controller - - KX_ACT_ARMATURE_ENABLE(1): enable the constraint. - - KX_ACT_ARMATURE_DISABLE(2): disable the constraint (runtime constraint values are not updated). - - KX_ACT_ARMATURE_SETTARGET(3): change target and subtarget of constraint - - KX_ACT_ARMATURE_SETWEIGHT(4): change weight of (only for IK constraint) - @type type: integer - @ivar constraint: The constraint object this actuator is controlling. - @type constraint: L{BL_ArmatureConstraint} - @ivar target: The object that this actuator will set as primary target to the constraint it controls - @type target: L{KX_GameObject} - @ivar subtarget: The object that this actuator will set as secondary target to the constraint it controls. - Currently, the only secondary target is the pole target for IK constraint. - @type subtarget: L{KX_GameObject} - @ivar weight: The weight this actuator will set on the constraint it controls. - Currently only the IK constraint has a weight. It must be a value between 0 and 1. - A weight of 0 disables a constraint while still updating constraint runtime values (see L{BL_ArmatureConstraint}) - @type weight: float - """ - -class KX_ArmatureSensor(SCA_ISensor): - """ - Armature sensor detect conditions on armatures. - - @group Constants: KX_ARMSENSOR_STATE_CHANGED, KX_ARMSENSOR_LIN_ERROR_BELOW, KX_ARMSENSOR_LIN_ERROR_ABOVE, KX_ARMSENSOR_ROT_ERROR_BELOW, KX_ARMSENSOR_ROT_ERROR_ABOVE - @ivar KX_ARMSENSOR_STATE_CHANGED: see type - @ivar KX_ARMSENSOR_LIN_ERROR_BELOW: see type - @ivar KX_ARMSENSOR_LIN_ERROR_ABOVE: see type - @ivar KX_ARMSENSOR_ROT_ERROR_BELOW: see type - @ivar KX_ARMSENSOR_ROT_ERROR_ABOVE: see type - @ivar type: The type of measurement that the sensor make when it is active. - - KX_ARMSENSOR_STATE_CHANGED(0): detect that the constraint is changing state (active/inactive) - - KX_ARMSENSOR_LIN_ERROR_BELOW(1): detect that the constraint linear error is above a threshold - - KX_ARMSENSOR_LIN_ERROR_ABOVE(2): detect that the constraint linear error is below a threshold - - KX_ARMSENSOR_ROT_ERROR_BELOW(3): detect that the constraint rotation error is above a threshold - - KX_ARMSENSOR_ROT_ERROR_ABOVE(4): detect that the constraint rotation error is below a threshold - @type type: integer - @ivar constraint: The constraint object this sensor is watching. - @type constraint: L{BL_ArmatureConstraint} - @ivar value: The threshold used in the comparison with the constraint error - The linear error is only updated on CopyPose/Distance IK constraint with iTaSC solver - The rotation error is only updated on CopyPose+rotation IK constraint with iTaSC solver - The linear error on CopyPose is always >= 0: it is the norm of the distance between the target and the bone - The rotation error on CopyPose is always >= 0: it is the norm of the equivalent rotation vector between the bone and the target orientations - The linear error on Distance can be positive if the distance between the bone and the target is greater than the desired distance, and negative if the distance is smaller - @type value: float - """ - -class BL_ArmatureConstraint(PyObjectPlus): - """ - Proxy to Armature Constraint. Allows to change constraint on the fly. - Obtained through L{BL_ArmatureObject}.constraints. - Note: not all armature constraints are supported in the GE. - - @group Constants: CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_ROTLIKE, CONSTRAINT_TYPE_LOCLIKE, CONSTRAINT_TYPE_MINMAX, CONSTRAINT_TYPE_SIZELIKE, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_STRETCHTO, CONSTRAINT_TYPE_CLAMPTO, CONSTRAINT_TYPE_TRANSFORM, CONSTRAINT_TYPE_DISTLIMIT,CONSTRAINT_IK_COPYPOSE, CONSTRAINT_IK_DISTANCE,CONSTRAINT_IK_MODE_INSIDE, CONSTRAINT_IK_MODE_OUTSIDE,CONSTRAINT_IK_MODE_ONSURFACE,CONSTRAINT_IK_FLAG_TIP,CONSTRAINT_IK_FLAG_ROT, CONSTRAINT_IK_FLAG_STRETCH, CONSTRAINT_IK_FLAG_POS - @ivar CONSTRAINT_TYPE_TRACKTO: see type - @ivar CONSTRAINT_TYPE_KINEMATIC: see type - @ivar CONSTRAINT_TYPE_ROTLIKE: see type - @ivar CONSTRAINT_TYPE_LOCLIKE: see type - @ivar CONSTRAINT_TYPE_MINMAX: see type - @ivar CONSTRAINT_TYPE_SIZELIKE: see type - @ivar CONSTRAINT_TYPE_LOCKTRACK: see type - @ivar CONSTRAINT_TYPE_STRETCHTO: see type - @ivar CONSTRAINT_TYPE_CLAMPTO: see type - @ivar CONSTRAINT_TYPE_TRANSFORM: see type - @ivar CONSTRAINT_TYPE_DISTLIMIT: see type - @ivar CONSTRAINT_IK_COPYPOSE: see ik_type - @ivar CONSTRAINT_IK_DISTANCE: see ik_type - @ivar CONSTRAINT_IK_MODE_INSIDE: see ik_mode - @ivar CONSTRAINT_IK_MODE_OUTSIDE: see ik_mode - @ivar CONSTRAINT_IK_MODE_ONSURFACE: see ik_mode - @ivar CONSTRAINT_IK_FLAG_TIP: see ik_flag - @ivar CONSTRAINT_IK_FLAG_ROT: see ik_flag - @ivar CONSTRAINT_IK_FLAG_STRETCH: see ik_flag - @ivar CONSTRAINT_IK_FLAG_POS: see ik_flag - @ivar type: Type of constraint, read-only - @type type: integer, one of CONSTRAINT_TYPE_ constant - @ivar name: Name of constraint constructed as : - This name is also the key subscript on L{BL_ArmatureObject}.constraints list - @type name: string - @ivar enforce: fraction of constraint effect that is enforced. Between 0 and 1. - @type enforce: float - @ivar headtail: position of target between head and tail of the target bone: 0=head, 1=tail - Only used if the target is a bone (i.e target object is an armature) - @type headtail: float - @ivar lin_error: runtime linear error (in Blender unit) on constraint at the current frame. - This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. - @type lin_error: float - @ivar rot_error: runtime rotation error (in radiant) on constraint at the current frame. - This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. - It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint. - @type rot_error: float - @ivar target: Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint. - @type target: L{KX_GameObject} - @ivar subtarget: Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint. - Currently this is only used for pole target on IK constraint. - @type subtarget: L{KX_GameObject} - @ivar active: True if the constraint is active. - Note: an inactive constraint does not update lin_error and rot_error. - @type active: boolean - @ivar ik_weight: Weight of the IK constraint between 0 and 1. - Only defined for IK constraint. - @type ik_weight: float - @ivar ik_type: Type of IK constraint, read-only - - CONSTRAINT_IK_COPYPOSE(0): constraint is trying to match the position and eventually the rotation of the target. - - CONSTRAINT_IK_DISTANCE(1): constraint is maintaining a certain distance to target subject to ik_mode - @type ik_type: integer - @ivar ik_flag: Combination of IK constraint option flags, read-only - - CONSTRAINT_IK_FLAG_TIP(1) : set when the constraint operates on the head of the bone and not the tail - - CONSTRAINT_IK_FLAG_ROT(2) : set when the constraint tries to match the orientation of the target - - CONSTRAINT_IK_FLAG_STRETCH(16) : set when the armature is allowed to stretch (only the bones with stretch factor > 0.0) - - CONSTRAINT_IK_FLAG_POS(32) : set when the constraint tries to match the position of the target - @type ik_flag: integer - @ivar ik_dist: Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE - @type ik_dist: float - @ivar ik_mode: Additional mode for IK constraint. Currently only used for Distance constraint: - - CONSTRAINT_IK_MODE_INSIDE(0) : the constraint tries to keep the bone within ik_dist of target - - CONSTRAINT_IK_MODE_OUTSIDE(1) : the constraint tries to keep the bone outside ik_dist of the target - - CONSTRAINT_IK_MODE_ONSURFACE(2) : the constraint tries to keep the bone exactly at ik_dist of the target - @type ik_mode: integer - """ - -class BL_ArmatureChannel(PyObjectPlus): - """ - Proxy to armature pose channel. Allows to read and set armature pose. - The attributes are identical to RNA attributes, but mostly in read-only mode. - - @group Constants: PCHAN_ROT_QUAT, PCHAN_ROT_XYZ, PCHAN_ROT_XZY, PCHAN_ROT_YXZ, PCHAN_ROT_YZX, PCHAN_ROT_ZXY, PCHAN_ROT_ZYX - @ivar PCHAN_ROT_QUAT: see rotation_mode - @ivar PCHAN_ROT_XYZ: see rotation_mode - @ivar PCHAN_ROT_XZY: see rotation_mode - @ivar PCHAN_ROT_YXZ: see rotation_mode - @ivar PCHAN_ROT_YZX: see rotation_mode - @ivar PCHAN_ROT_ZXY: see rotation_mode - @ivar PCHAN_ROT_ZYX: see rotation_mode - @ivar name: channel name (=bone name), read-only. - @type name: string - @ivar bone: return the bone object corresponding to this pose channel, read-only. - @type bone: L{BL_ArmatureBone} - @ivar parent: return the parent channel object, None if root channel, read-only. - @type parent: L{BL_ArmatureChannel} - @ivar has_ik: true if the bone is part of an active IK chain, read-only. - This flag is not set when an IK constraint is defined but not enabled (miss target information for example) - @type has_ik: boolean - @ivar ik_dof_x: true if the bone is free to rotation in the X axis, read-only. - @type ik_dof_x: boolean - @ivar ik_dof_y: true if the bone is free to rotation in the Y axis, read-only. - @type ik_dof_y: boolean - @ivar ik_dof_z: true if the bone is free to rotation in the Z axis, read-only. - @type ik_dof_z: boolean - @ivar ik_limit_x: true if a limit is imposed on X rotation, read-only. - @type ik_limit_x: boolean - @ivar ik_limit_y: true if a limit is imposed on Y rotation, read-only. - @type ik_limit_y: boolean - @ivar ik_limit_z: true if a limit is imposed on Z rotation, read-only. - @type ik_limit_z: boolean - @ivar ik_rot_control: true if channel rotation should applied as IK constraint, read-only. - @type ik_rot_control: boolean - @ivar ik_lin_control: true if channel size should applied as IK constraint, read-only. - @type ik_lin_control: boolean - @ivar location: displacement of the bone head in armature local space, read-write. - You can only move a bone if it is unconnected to its parent. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update}) - @type location: vector [X,Y,Z] - @ivar scale: scale of the bone relative to its parent, read-write. - An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update}) - @type scale: vector [sizeX, sizeY, sizeZ] - @ivar rotation: rotation of the bone relative to its parent expressed as a quaternion, read-write. - This field is only used if rotation_mode is 0. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update}) - @type rotation: vector [qr, qi, qj, qk] - @ivar euler_rotation: rotation of the bone relative to its parent expressed as a set of euler angles, read-write. - This field is only used if rotation_mode is > 0. You must always pass the angles in [X,Y,Z] order; the order of applying the angles to the bone depends on rotation_mode. An action playing on the armature may change this field. An IK chain does not update this value, see joint_rotation. - Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update}) - @type euler_rotation: vector [X, Y, Z] - @ivar rotation_mode: method of updating the bone rotation, read-write. - Use the following constants (euler mode are named as in BLender UI but the actual axis order is reversed): - - PCHAN_ROT_QUAT(0) : use quaternioin in rotation attribute to update bone rotation - - PCHAN_ROT_XYZ(1) : use euler_rotation and apply angles on bone's Z, Y, X axis successively - - PCHAN_ROT_XZY(2) : use euler_rotation and apply angles on bone's Y, Z, X axis successively - - PCHAN_ROT_YXZ(3) : use euler_rotation and apply angles on bone's Z, X, Y axis successively - - PCHAN_ROT_YZX(4) : use euler_rotation and apply angles on bone's X, Z, Y axis successively - - PCHAN_ROT_ZXY(5) : use euler_rotation and apply angles on bone's Y, X, Z axis successively - - PCHAN_ROT_ZYX(6) : use euler_rotation and apply angles on bone's X, Y, Z axis successively - @type rotation_mode: integer - @ivar channel_matrix: pose matrix in bone space (deformation of the bone due to action, constraint, etc), Read-only. - This field is updated after the graphic render, it represents the current pose. - @type channel_matrix: matrix [4][4] - @ivar pose_matrix: pose matrix in armature space, read-only, - This field is updated after the graphic render, it represents the current pose. - @type pose_matrix: matrix [4][4] - @ivar pose_head: position of bone head in armature space, read-only. - @type pose_head: vector [x, y, z] - @ivar pose_tail: position of bone tail in armature space, read-only. - @type pose_tail: vector [x, y, z] - @ivar ik_min_x: minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only. - @type ik_min_x: float - @ivar ik_max_x: maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only. - @type ik_max_x: float - @ivar ik_min_y: minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only. - @type ik_min_y: float - @ivar ik_max_y: maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only. - @type ik_max_y: float - @ivar ik_min_z: minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only. - @type ik_min_z: float - @ivar ik_max_z: maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only. - @type ik_max_z: float - @ivar ik_stiffness_x: bone rotation stiffness in X axis, read-only - @type ik_stiffness_x: float between 0 and 1 - @ivar ik_stiffness_y: bone rotation stiffness in Y axis, read-only - @type ik_stiffness_y: float between 0 and 1 - @ivar ik_stiffness_z: bone rotation stiffness in Z axis, read-only - @type ik_stiffness_z: float between 0 and 1 - @ivar ik_stretch: ratio of scale change that is allowed, 0=bone can't change size, read-only. - @type ik_stretch: float - @ivar ik_rot_weight: weight of rotation constraint when ik_rot_control is set, read-write. - @type ik_rot_weight: float between 0 and 1 - @ivar ik_lin_weight: weight of size constraint when ik_lin_control is set, read-write. - @type ik_lin_weight: float between 0 and 1 - @ivar joint_rotation: control bone rotation in term of joint angle (for robotic applications), read-write. - When writing to this attribute, you pass a [x, y, z] vector and an appropriate set of euler angles or quaternion is calculated according to the rotation_mode. - When you read this attribute, the current pose matrix is converted into a [x, y, z] vector representing the joint angles. - The value and the meaning of the x, y, z depends on the ik_dof_ attributes: - - 1DoF joint X, Y or Z: the corresponding x, y, or z value is used an a joint angle in radiant - - 2DoF joint X+Y or Z+Y: treated as 2 successive 1DoF joints: first X or Z, then Y. The x or z value is used as a joint angle in radiant along the X or Z axis, followed by a rotation along the new Y axis of y radiants. - - 2DoF joint X+Z: treated as a 2DoF joint with rotation axis on the X/Z plane. The x and z values are used as the coordinates of the rotation vector in the X/Z plane. - - 3DoF joint X+Y+Z: treated as a revolute joint. The [x,y,z] vector represents the equivalent rotation vector to bring the joint from the rest pose to the new pose. - - Notes: - - The bone must be part of an IK chain if you want to set the ik_dof_ attributes via the UI, but this will interfere with this attribute since the IK solver will overwrite the pose. You can stay in control of the armature if you create an IK constraint but do not finalize it (e.g. don't set a target): the IK solver will not run but the IK panel will show up on the UI for each bone in the chain. - - [0,0,0] always corresponds to the rest pose. - - You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see L{BL_ArmatureObject.update}). - - You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute. - @type joint_rotation: vector [x, y, z] - """ - -class BL_ArmatureBone(PyObjectPlus): - """ - Proxy to Blender bone structure. All fields are read-only and comply to RNA names. - All space attribute correspond to the rest pose. - - @ivar name: bone name - @type name: string - @ivar connected: true when the bone head is struck to the parent's tail - @type connected: boolean - @ivar hinge: true when bone doesn't inherit rotation or scale from parent bone - @type hinge: boolean - @ivar inherit_scale: true when bone inherits scaling from parent bone - @type inherit_scale: boolean - @ivar bbone_segments: number of B-bone segments - @type bbone_segments: integer - @ivar roll: bone rotation around head-tail axis - @type roll: float - @ivar head: location of head end of the bone in parent bone space - @type head: vector [x, y, z] - @ivar tail: location of head end of the bone in parent bone space - @type tail: vector [x, y, z] - @ivar length: bone length - @type length: float - @ivar arm_head: location of head end of the bone in armature space - @type arm_head: vector [x, y, z] - @ivar arm_tail: location of tail end of the bone in armature space - @type arm_tail: vector [x, y, z] - @ivar arm_mat: matrix of the bone head in armature space - This matrix has no scale part. - @type arm_mat: matrix [4][4] - @ivar bone_mat: rotation matrix of the bone in parent bone space. - @type bone_mat: matrix [3][3] - @ivar parent: parent bone, or None for root bone - @type parent: L{BL_ArmatureBone} - @ivar children: list of bone's children - @type children: list of L{BL_ArmatureBone} - """ -# Util func to extract all attrs -""" -import types -attrs = [] -for name, val in locals().items(): - if name.startswith('__'): - continue - if type(val) == types.ClassType: - for line in val.__doc__.split('\n'): - if '@ivar' in line: - attrs.append(name + '::' + line.split()[1].replace(':', '')) - -for a in attrs: - print a -""" - - -# Util func to construct a mapping from deprecated attrs to new ones. -""" -import types -import re -import pprint -depAttrs = {} -for name, val in locals().items(): - if name.startswith('__'): - continue - if type(val) == types.ClassType: - print "\t# %s" % name - - # Inspect each attribute. - for attrName in dir(val): - if attrName.startswith('__'): - continue - attr = getattr(val, attrName) - - # Check whether this attribute is deprecated by searching each line. - newAttrName = None - for line in attr.__doc__.split('\n'): - match = re.search(r'@deprecated.*L{(\w+)}', line) - if match: - newAttrName = match.group(1) - break - if not newAttrName: - continue - - # Store the mappings to new attributes in a list (because there - # could be collisions). - if attrName not in depAttrs: - depAttrs[attrName] = {} - mapping = depAttrs[attrName] - - for line in val.__doc__.split('\n'): - if ("@type %s:" % newAttrName) in line: - # The attribute is being replaced in this class (i.e. the - # deprecated attribute wasn't inherited from a parent). We - # have a winner! - funcType = None - if 'sequence' in line: - funcType = 'Keyed' - else: - funcType = 'Simple' - - if attrName.startswith('get') or attrName.startswith('is'): - func = "replace%sGetter" % funcType - elif attrName.startswith('set') or attrName.startswith('enable'): - func = "replace%sSetter" % funcType - else: - func = 'UNKNOWN' - - # Another mapping, from a conversion tuple to lists of class - # names. - conversion = (func, newAttrName) - if conversion not in mapping: - mapping[conversion] = [] - mapping[conversion].append(name) - break - -pprint.pprint(depAttrs, width = 100) -""" diff --git a/source/gameengine/PyDoc/Rasterizer.py b/source/gameengine/PyDoc/Rasterizer.py deleted file mode 100644 index 8fd4d506bde..00000000000 --- a/source/gameengine/PyDoc/Rasterizer.py +++ /dev/null @@ -1,221 +0,0 @@ -# $Id$ -""" -Documentation for the Rasterizer module. - -Example Uses an L{SCA_MouseSensor}, and two L{KX_ObjectActuator}s to implement MouseLook:: - # To use a mouse movement sensor "Mouse" and a - # motion actuator to mouse look: - import Rasterizer - import GameLogic - - # SCALE sets the speed of motion - SCALE=[1, 0.5] - - co = GameLogic.getCurrentController() - obj = co.getOwner() - mouse = co.getSensor("Mouse") - lmotion = co.getActuator("LMove") - wmotion = co.getActuator("WMove") - - # Transform the mouse coordinates to see how far the mouse has moved. - def mousePos(): - x = (Rasterizer.getWindowWidth()/2 - mouse.getXPosition())*SCALE[0] - y = (Rasterizer.getWindowHeight()/2 - mouse.getYPosition())*SCALE[1] - return (x, y) - - pos = mousePos() - - # Set the amount of motion: X is applied in world coordinates... - lmotion.setTorque(0.0, 0.0, pos[0], False) - # ...Y is applied in local coordinates - wmotion.setTorque(-pos[1], 0.0, 0.0, True) - - # Activate both actuators - GameLogic.addActiveActuator(lmotion, True) - GameLogic.addActiveActuator(wmotion, True) - - # Centre the mouse - Rasterizer.setMousePosition(Rasterizer.getWindowWidth()/2, Rasterizer.getWindowHeight()/2) - -@group Material Types: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL -@var KX_TEXFACE_MATERIAL: Materials as defined by the texture face settings. -@var KX_BLENDER_MULTITEX_MATERIAL: Materials approximating blender materials with multitexturing. -@var KX_BLENDER_GLSL_MATERIAL: Materials approximating blender materials with GLSL. - -""" -def getWindowWidth(): - """ - Gets the width of the window (in pixels) - - @rtype: integer - """ -def getWindowHeight(): - """ - Gets the height of the window (in pixels) - - @rtype: integer - """ -def makeScreenshot(filename): - """ - Writes a screenshot to the given filename. - - If filename starts with // the image will be saved relative to the current directory. - If the filename contains # it will be replaced with the frame number. - - The standalone player saves .png files. It does not support colour space conversion - or gamma correction. - - When run from Blender, makeScreenshot supports Iris, IrisZ, TGA, Raw TGA, PNG, HamX, and Jpeg. - Gamma, Colourspace conversion and Jpeg compression are taken from the Render settings panels. - - @type filename: string - """ - -def enableVisibility(visible): - """ - Doesn't really do anything... - """ - -def showMouse(visible): - """ - Enables or disables the operating system mouse cursor. - - @type visible: boolean - """ - -def setMousePosition(x, y): - """ - Sets the mouse cursor position. - - @type x: integer - @type y: integer - """ - -def setBackgroundColor(rgba): - """ - Sets the window background colour. - - @type rgba: list [r, g, b, a] - """ - -def setMistColor(rgb): - """ - Sets the mist colour. - - @type rgb: list [r, g, b] - """ - -def setAmbientColor(rgb): - """ - Sets the color of ambient light. - - @type rgb: list [r, g, b] - """ - -def setMistStart(start): - """ - Sets the mist start value. Objects further away than start will have mist applied to them. - - @type start: float - """ - -def setMistEnd(end): - """ - Sets the mist end value. Objects further away from this will be coloured solid with - the colour set by setMistColor(). - - @type end: float - """ - -def disableMist(): - """ - Disables mist. - - @note: Set any of the mist properties to enable mist. - """ - -def setEyeSeparation(eyesep): - """ - Sets the eye separation for stereo mode. Usually Focal Length/30 provides a confortable value. - - @param eyesep: The distance between the left and right eye. - @type eyesep: float - """ - -def getEyeSeparation(): - """ - Gets the current eye separation for stereo mode. - - @rtype: float - """ - -def setFocalLength(focallength): - """ - Sets the focal length for stereo mode. It uses the current camera focal length as initial value. - - @param focallength: The focal length. - @type focallength: float - """ - -def getFocalLength(): - """ - Gets the current focal length for stereo mode. - - @rtype: float - """ - -def setMaterialMode(mode): - """ - Set the material mode to use for OpenGL rendering. - - @type mode: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL - @note: Changes will only affect newly created scenes. - """ - -def getMaterialMode(mode): - """ - Get the material mode to use for OpenGL rendering. - - @rtype: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL - """ - -def setGLSLMaterialSetting(setting, enable): - """ - Enables or disables a GLSL material setting. - - @type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures) - @type enable: boolean - """ - -def getGLSLMaterialSetting(setting, enable): - """ - Get the state of a GLSL material setting. - - @type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures) - @rtype: boolean - """ - -def drawLine(fromVec,toVec,color): - """ - Draw a line in the 3D scene. - - @param fromVec: the origin of the line - @type fromVec: list [x, y, z] - @param toVec: the end of the line - @type toVec: list [x, y, z] - @param color: the color of the line - @type color: list [r, g, b] - """ - -def enableMotionBlur(factor): - """ - Enable the motion blue effect. - - @param factor: the ammount of motion blur to display. - @type factor: float [0.0 - 1.0] - """ - -def disableMotionBlur(): - """ - Disable the motion blue effect. - """ diff --git a/source/gameengine/PyDoc/bge.events.rst b/source/gameengine/PyDoc/bge.events.rst new file mode 100644 index 00000000000..f642291fe97 --- /dev/null +++ b/source/gameengine/PyDoc/bge.events.rst @@ -0,0 +1,229 @@ + +Game Engine bge.events module +============================= + +***** +Intro +***** + +This module holds key constants for the SCA_KeyboardSensor. + +.. module:: bge.events + +.. code-block:: python + + # Set a connected keyboard sensor to accept F1 + import bge + + co = bge.logic.getCurrentController() + # 'Keyboard' is a keyboard sensor + sensor = co.sensors["Keyboard"] + sensor.key = bge.keys.F1KEY + +.. code-block:: python + + # Do the all keys thing + import bge + + co = bge.logic.getCurrentController() + # 'Keyboard' is a keyboard sensor + sensor = co.sensors["Keyboard"] + + for key,status in sensor.events: + # key[0] == bge.keys.keycode, key[1] = status + if status == bge.logic.KX_INPUT_JUST_ACTIVATED: + if key == bge.keys.WKEY: + # Activate Forward! + if key == bge.keys.SKEY: + # Activate Backward! + if key == bge.keys.AKEY: + # Activate Left! + if key == bge.keys.DKEY: + # Activate Right! + +********* +Functions +********* + +.. function:: EventToString(event) + + Return the string name of a key event. Will raise a ValueError error if its invalid. + + :arg event: key event from bge.keys or the keyboard sensor. + :type event: int + :rtype: string + +.. function:: EventToCharacter(event, shift) + + Return the string name of a key event. Returns an empty string if the event cant be represented as a character. + + :type event: int + :arg event: key event from :mod:`bge.keys` or the keyboard sensor. + :type shift: bool + :arg shift: set to true if shift is held. + :rtype: string + +**************** +Keys (Constants) +**************** + +.. _mouse-keys: + +========== +Mouse Keys +========== + +.. data:: LEFTMOUSE +.. data:: MIDDLEMOUSE +.. data:: RIGHTMOUSE +.. data:: WHEELUPMOUSE +.. data:: WHEELDOWNMOUSE +.. data:: MOUSEX +.. data:: MOUSEY + +.. _keyboard-keys: + +============= +Keyboard Keys +============= + +------------- +Alphabet keys +------------- + +.. data:: AKEY +.. data:: BKEY +.. data:: CKEY +.. data:: DKEY +.. data:: EKEY +.. data:: FKEY +.. data:: GKEY +.. data:: HKEY +.. data:: IKEY +.. data:: JKEY +.. data:: KKEY +.. data:: LKEY +.. data:: MKEY +.. data:: NKEY +.. data:: OKEY +.. data:: PKEY +.. data:: QKEY +.. data:: RKEY +.. data:: SKEY +.. data:: TKEY +.. data:: UKEY +.. data:: VKEY +.. data:: WKEY +.. data:: XKEY +.. data:: YKEY +.. data:: ZKEY + +----------- +Number keys +----------- + +.. data:: ZEROKEY +.. data:: ONEKEY +.. data:: TWOKEY +.. data:: THREEKEY +.. data:: FOURKEY +.. data:: FIVEKEY +.. data:: SIXKEY +.. data:: SEVENKEY +.. data:: EIGHTKEY +.. data:: NINEKEY + +-------------- +Modifiers Keys +-------------- + +.. data:: CAPSLOCKKEY +.. data:: LEFTCTRLKEY +.. data:: LEFTALTKEY +.. data:: RIGHTALTKEY +.. data:: RIGHTCTRLKEY +.. data:: RIGHTSHIFTKEY +.. data:: LEFTSHIFTKEY + +---------- +Arrow Keys +---------- + +.. data:: LEFTARROWKEY +.. data:: DOWNARROWKEY +.. data:: RIGHTARROWKEY +.. data:: UPARROWKEY + +-------------- +Numberpad Keys +-------------- + +.. data:: PAD0 +.. data:: PAD1 +.. data:: PAD2 +.. data:: PAD3 +.. data:: PAD4 +.. data:: PAD5 +.. data:: PAD6 +.. data:: PAD7 +.. data:: PAD8 +.. data:: PAD9 +.. data:: PADPERIOD +.. data:: PADSLASHKEY +.. data:: PADASTERKEY +.. data:: PADMINUS +.. data:: PADENTER +.. data:: PADPLUSKEY + +------------- +Function Keys +------------- + +.. data:: F1KEY +.. data:: F2KEY +.. data:: F3KEY +.. data:: F4KEY +.. data:: F5KEY +.. data:: F6KEY +.. data:: F7KEY +.. data:: F8KEY +.. data:: F9KEY +.. data:: F10KEY +.. data:: F11KEY +.. data:: F12KEY +.. data:: F13KEY +.. data:: F14KEY +.. data:: F15KEY +.. data:: F16KEY +.. data:: F17KEY +.. data:: F18KEY +.. data:: F19KEY + +---------- +Other Keys +---------- + +.. data:: ACCENTGRAVEKEY +.. data:: BACKSLASHKEY +.. data:: BACKSPACEKEY +.. data:: COMMAKEY +.. data:: DELKEY +.. data:: ENDKEY +.. data:: EQUALKEY +.. data:: ESCKEY +.. data:: HOMEKEY +.. data:: INSERTKEY +.. data:: LEFTBRACKETKEY +.. data:: LINEFEEDKEY +.. data:: MINUSKEY +.. data:: PAGEDOWNKEY +.. data:: PAGEUPKEY +.. data:: PAUSEKEY +.. data:: PERIODKEY +.. data:: QUOTEKEY +.. data:: RIGHTBRACKETKEY +.. data:: RETKEY +.. data:: SEMICOLONKEY +.. data:: SLASHKEY +.. data:: SPACEKEY +.. data:: TABKEY diff --git a/source/gameengine/PyDoc/bge.logic.rst b/source/gameengine/PyDoc/bge.logic.rst new file mode 100644 index 00000000000..84b480e2ab9 --- /dev/null +++ b/source/gameengine/PyDoc/bge.logic.rst @@ -0,0 +1,896 @@ + +Game Engine bge.logic Module +============================ +***** +Intro +***** + +Module to access logic functions, imported automatically into the python controllers namespace. + +.. module:: bge.logic + +.. code-block:: python + + # To get the controller thats running this python script: + cont = bge.logic.getCurrentController() # bge.logic is automatically imported + + # To get the game object this controller is on: + obj = cont.owner + +:class:`~bge.types.KX_GameObject` and :class:`~bge.types.KX_Camera` or :class:`bge.types.~KX_LightObject` methods are available depending on the type of object + +.. code-block:: python + + # To get a sensor linked to this controller. + # "sensorname" is the name of the sensor as defined in the Blender interface. + # +---------------------+ +--------+ + # | Sensor "sensorname" +--+ Python + + # +---------------------+ +--------+ + sens = cont.sensors["sensorname"] + + # To get a sequence of all sensors: + sensors = co.sensors + +See the sensor's reference for available methods: + +.. hlist:: + :columns: 3 + + * :class:`~bge.types.KX_MouseFocusSensor` + * :class:`~bge.types.KX_NearSensor` + * :class:`~bge.types.KX_NetworkMessageSensor` + * :class:`~bge.types.KX_RadarSensor` + * :class:`~bge.types.KX_RaySensor` + * :class:`~bge.types.KX_TouchSensor` + * :class:`~bge.types.SCA_DelaySensor` + * :class:`~bge.types.SCA_JoystickSensor` + * :class:`~bge.types.SCA_KeyboardSensor` + * :class:`~bge.types.SCA_MouseSensor` + * :class:`~bge.types.SCA_PropertySensor` + * :class:`~bge.types.SCA_RandomSensor` + +You can also access actuators linked to the controller + +.. code-block:: python + + # To get an actuator attached to the controller: + # +--------+ +-------------------------+ + # + Python +--+ Actuator "actuatorname" | + # +--------+ +-------------------------+ + actuator = co.actuators["actuatorname"] + + # Activate an actuator + controller.activate(actuator) + +See the actuator's reference for available methods + +.. hlist:: + :columns: 3 + + * :class:`~bge.types.BL_ActionActuator` + * :class:`~bge.types.BL_ShapeActionActuator` + * :class:`~bge.types.KX_CameraActuator` + * :class:`~bge.types.KX_ConstraintActuator` + * :class:`~bge.types.KX_GameActuator` + * :class:`~bge.types.KX_IpoActuator` + * :class:`~bge.types.KX_NetworkMessageActuator` + * :class:`~bge.types.KX_ObjectActuator` + * :class:`~bge.types.KX_ParentActuator` + * :class:`~bge.types.KX_SCA_AddObjectActuator` + * :class:`~bge.types.KX_SCA_DynamicActuator` + * :class:`~bge.types.KX_SCA_EndObjectActuator` + * :class:`~bge.types.KX_SCA_ReplaceMeshActuator` + * :class:`~bge.types.KX_SceneActuator` + * :class:`~bge.types.KX_SoundActuator` + * :class:`~bge.types.KX_StateActuator` + * :class:`~bge.types.KX_TrackToActuator` + * :class:`~bge.types.KX_VisibilityActuator` + * :class:`~bge.types.SCA_2DFilterActuator` + * :class:`~bge.types.SCA_PropertyActuator` + * :class:`~bge.types.SCA_RandomActuator` + +Most logic brick's methods are accessors for the properties available in the logic buttons. +Consult the logic bricks documentation for more information on how each logic brick works. + +There are also methods to access the current :class:`bge.types.KX_Scene` + +.. code-block:: python + + # Get the current scene + scene = bge.logic.getCurrentScene() + + # Get the current camera + cam = scene.active_camera + +Matricies as used by the game engine are **row major** +``matrix[row][col] = float`` + +:class:`bge.types.KX_Camera` has some examples using matricies. + +********* +Variables +********* + +.. data:: globalDict + + A dictionary that is saved between loading blend files so you can use it to store inventory and other variables you want to store between scenes and blend files. + It can also be written to a file and loaded later on with the game load/save actuators. + + .. note:: only python built in types such as int/string/bool/float/tuples/lists can be saved, GameObjects, Actuators etc will not work as expected. + +.. data:: keyboard + + The current keyboard wrapped in an :class:`~bge.types.SCA_PythonKeyboard` object. + +.. data:: mouse + + The current mouse wrapped in an :class:`~bge.types.SCA_PythonMouse` object. + +***************** +General functions +***************** + +.. function:: getCurrentController() + + Gets the Python controller associated with this Python script. + + :rtype: :class:`bge.types.SCA_PythonController` + +.. function:: getCurrentScene() + + Gets the current Scene. + + :rtype: :class:`bge.types.KX_Scene` + +.. function:: getSceneList() + + Gets a list of the current scenes loaded in the game engine. + + :rtype: list of :class:`bge.types.KX_Scene` + + .. note:: Scenes in your blend file that have not been converted wont be in this list. This list will only contain scenes such as overlays scenes. + +.. function:: loadGlobalDict() + + Loads bge.logic.globalDict from a file. + +.. function:: saveGlobalDict() + + Saves bge.logic.globalDict to a file. + +.. function:: addScene(name, overlay=1) + + Loads a scene into the game engine. + + :arg name: The name of the scene + :type name: string + :arg overlay: Overlay or underlay (optional) + :type overlay: integer + +.. function:: sendMessage(subject, body="", to="", message_from="") + + Sends a message to sensors in any active scene. + + :arg subject: The subject of the message + :type subject: string + :arg body: The body of the message (optional) + :type body: string + :arg to: The name of the object to send the message to (optional) + :type to: string + :arg message_from: The name of the object that the message is coming from (optional) + :type message_from: string + +.. function:: setGravity(gravity) + + Sets the world gravity. + + :type gravity: list [fx, fy, fz] + +.. function:: getSpectrum() + + Returns a 512 point list from the sound card. + This only works if the fmod sound driver is being used. + + :rtype: list [float], len(getSpectrum()) == 512 + +.. function:: stopDSP() + + Stops the sound driver using DSP effects. + + Only the fmod sound driver supports this. + DSP can be computationally expensive. + +.. function:: getMaxLogicFrame() + + Gets the maximum number of logic frame per render frame. + + :return: The maximum number of logic frame per render frame + :rtype: integer + +.. function:: setMaxLogicFrame(maxlogic) + + Sets the maximum number of logic frame that are executed per render frame. + This does not affect the physic system that still runs at full frame rate. + + :arg maxlogic: The new maximum number of logic frame per render frame. Valid values: 1..5 + :type maxlogic: integer + +.. function:: getMaxPhysicsFrame() + + Gets the maximum number of physics frame per render frame. + + :return: The maximum number of physics frame per render frame + :rtype: integer + +.. function:: setMaxPhysicsFrame(maxphysics) + + Sets the maximum number of physics timestep that are executed per render frame. + Higher value allows physics to keep up with realtime even if graphics slows down the game. + Physics timestep is fixed and equal to 1/tickrate (see setLogicTicRate) + maxphysics/ticrate is the maximum delay of the renderer that physics can compensate. + + :arg maxphysics: The new maximum number of physics timestep per render frame. Valid values: 1..5. + :type maxphysics: integer + +.. function:: getLogicTicRate() + + Gets the logic update frequency. + + :return: The logic frequency in Hz + :rtype: float + +.. function:: setLogicTicRate(ticrate) + + Sets the logic update frequency. + + The logic update frequency is the number of times logic bricks are executed every second. + The default is 60 Hz. + + :arg ticrate: The new logic update frequency (in Hz). + :type ticrate: float + +.. function:: getPhysicsTicRate() + + Gets the physics update frequency + + :return: The physics update frequency in Hz + :rtype: float + + .. warning: Not implimented yet + +.. function:: setPhysicsTicRate(ticrate) + + Sets the physics update frequency + + The physics update frequency is the number of times the physics system is executed every second. + The default is 60 Hz. + + :arg ticrate: The new update frequency (in Hz). + :type ticrate: float + + .. warning: Not implimented yet + +.. function:: saveGlobalDict() + + Saves bge.logic.globalDict to a file. + +.. function:: loadGlobalDict() + + Loads bge.logic.globalDict from a file. + +***************** +Utility functions +***************** + +.. function:: expandPath(path) + + Converts a blender internal path into a proper file system path. + + Use / as directory separator in path + You can use '//' at the start of the string to define a relative path; + Blender replaces that string by the directory of the startup .blend or runtime file + to make a full path name (doesn't change during the game, even if you load other .blend). + The function also converts the directory separator to the local file system format. + + :arg path: The path string to be converted/expanded. + :type path: string + :return: The converted string + :rtype: string + +.. function:: getAverageFrameRate() + + Gets the estimated average framerate + + :return: The estimed average framerate in frames per second + :rtype: float + +.. function:: getBlendFileList(path = "//") + + Returns a list of blend files in the same directory as the open blend file, or from using the option argument. + + :arg path: Optional directory argument, will be expanded (like expandPath) into the full path. + :type path: string + :return: A list of filenames, with no directory prefix + :rtype: list + +.. function:: getRandomFloat() + + Returns a random floating point value in the range [0 - 1) + +.. function:: PrintGLInfo() + + Prints GL Extension Info into the console + +********* +Constants +********* + +.. data:: KX_TRUE + + True value used by some modules. + +.. data:: KX_FALSE + + False value used by some modules. + +======= +Sensors +======= + +.. _sensor-status: + +------------- +Sensor Status +------------- + +.. data:: KX_SENSOR_INACTIVE +.. data:: KX_SENSOR_JUST_ACTIVATED +.. data:: KX_SENSOR_ACTIVE +.. data:: KX_SENSOR_JUST_DEACTIVATED + +.. _logic-property-sensor: + +--------------- +Property Sensor +--------------- + +.. data:: KX_PROPSENSOR_EQUAL + + Activate when the property is equal to the sensor value. + + :value: 1 + +.. data:: KX_PROPSENSOR_NOTEQUAL + + Activate when the property is not equal to the sensor value. + + :value: 2 + +.. data:: KX_PROPSENSOR_INTERVAL + + Activate when the property is between the specified limits. + + :value: 3 + +.. data:: KX_PROPSENSOR_CHANGED + + Activate when the property changes + + :value: 4 + +.. data:: KX_PROPSENSOR_EXPRESSION + + Activate when the expression matches + + :value: 5 + +------------ +Radar Sensor +------------ + +See :class:`bge.types.KX_RadarSensor` + +.. data:: KX_RADAR_AXIS_POS_X +.. data:: KX_RADAR_AXIS_POS_Y +.. data:: KX_RADAR_AXIS_POS_Z +.. data:: KX_RADAR_AXIS_NEG_X +.. data:: KX_RADAR_AXIS_NEG_Y +.. data:: KX_RADAR_AXIS_NEG_Z + +---------- +Ray Sensor +---------- + +See :class:`bge.types.KX_RaySensor` + +.. data:: KX_RAY_AXIS_POS_X +.. data:: KX_RAY_AXIS_POS_Y +.. data:: KX_RAY_AXIS_POS_Z +.. data:: KX_RAY_AXIS_NEG_X +.. data:: KX_RAY_AXIS_NEG_Y +.. data:: KX_RAY_AXIS_NEG_Z + + +========= +Actuators +========= + +.. _action-actuator: + +--------------- +Action Actuator +--------------- + +See :class:`bge.types.BL_ActionActuator` + +.. data:: KX_ACTIONACT_PLAY +.. data:: KX_ACTIONACT_FLIPPER +.. data:: KX_ACTIONACT_LOOPSTOP +.. data:: KX_ACTIONACT_LOOPEND +.. data:: KX_ACTIONACT_PROPERTY + +------------------- +Constraint Actuator +------------------- + +.. _constraint-actuator-option: + +See :class:`bge.types.KX_ConstraintActuator.option` + +* Applicable to Distance constraint: + + .. data:: KX_ACT_CONSTRAINT_NORMAL + + Activate alignment to surface + + .. data:: KX_ACT_CONSTRAINT_DISTANCE + + Activate distance control + + .. data:: KX_ACT_CONSTRAINT_LOCAL + + Direction of the ray is along the local axis + +* Applicable to Force field constraint: + + .. data:: KX_ACT_CONSTRAINT_DOROTFH + + Force field act on rotation as well + +* Applicable to both: + + .. data:: KX_ACT_CONSTRAINT_MATERIAL + + Detect material rather than property + + .. data:: KX_ACT_CONSTRAINT_PERMANENT + + No deactivation if ray does not hit target + +.. _constraint-actuator-limit: + +See :class:`bge.types.KX_ConstraintActuator.limit` + +.. data:: KX_CONSTRAINTACT_LOCX + + Limit X coord. + +.. data:: KX_CONSTRAINTACT_LOCY + + Limit Y coord + +.. data:: KX_CONSTRAINTACT_LOCZ + + Limit Z coord + +.. data:: KX_CONSTRAINTACT_ROTX + + Limit X rotation + +.. data:: KX_CONSTRAINTACT_ROTY + + Limit Y rotation + +.. data:: KX_CONSTRAINTACT_ROTZ + + Limit Z rotation + +.. data:: KX_CONSTRAINTACT_DIRNX + + Set distance along negative X axis + +.. data:: KX_CONSTRAINTACT_DIRNY + + Set distance along negative Y axis + +.. data:: KX_CONSTRAINTACT_DIRNZ + + Set distance along negative Z axis + +.. data:: KX_CONSTRAINTACT_DIRPX + + Set distance along positive X axis + +.. data:: KX_CONSTRAINTACT_DIRPY + + Set distance along positive Y axis + +.. data:: KX_CONSTRAINTACT_DIRPZ + + Set distance along positive Z axis + +.. data:: KX_CONSTRAINTACT_ORIX + + Set orientation of X axis + +.. data:: KX_CONSTRAINTACT_ORIY + + Set orientation of Y axis + +.. data:: KX_CONSTRAINTACT_ORIZ + + Set orientation of Z axis + +.. data:: KX_ACT_CONSTRAINT_FHNX + + Set force field along negative X axis + +.. data:: KX_ACT_CONSTRAINT_FHNY + + Set force field along negative Y axis + +.. data:: KX_ACT_CONSTRAINT_FHNZ + + Set force field along negative Z axis + +.. data:: KX_ACT_CONSTRAINT_FHPX + + Set force field along positive X axis + +.. data:: KX_ACT_CONSTRAINT_FHPY + + Set force field along positive Y axis + +.. data:: KX_ACT_CONSTRAINT_FHPZ + + Set force field along positive Z axis + +---------------- +Dynamic Actuator +---------------- + +See :class:`bge.types.KX_SCA_DynamicActuator` + +.. data:: KX_DYN_RESTORE_DYNAMICS +.. data:: KX_DYN_DISABLE_DYNAMICS +.. data:: KX_DYN_ENABLE_RIGID_BODY +.. data:: KX_DYN_DISABLE_RIGID_BODY +.. data:: KX_DYN_SET_MASS + +.. _game-actuator: + +------------- +Game Actuator +------------- + +See :class:`bge.types.KX_GameActuator` + +.. data:: KX_GAME_LOAD +.. data:: KX_GAME_START +.. data:: KX_GAME_RESTART +.. data:: KX_GAME_QUIT +.. data:: KX_GAME_SAVECFG +.. data:: KX_GAME_LOADCFG + +.. _ipo-actuator: + +------------ +IPO Actuator +------------ + +See :class:`bge.types.KX_IpoActuator` + +.. data:: KX_IPOACT_PLAY +.. data:: KX_IPOACT_PINGPONG +.. data:: KX_IPOACT_FLIPPER +.. data:: KX_IPOACT_LOOPSTOP +.. data:: KX_IPOACT_LOOPEND +.. data:: KX_IPOACT_FROM_PROP + +--------------- +Parent Actuator +--------------- + +.. data:: KX_PARENT_REMOVE +.. data:: KX_PARENT_SET + +.. _logic-random-distributions: + +-------------------- +Random Distributions +-------------------- + +See :class:`bge.types.SCA_RandomActuator` + +.. data:: KX_RANDOMACT_BOOL_CONST +.. data:: KX_RANDOMACT_BOOL_UNIFORM +.. data:: KX_RANDOMACT_BOOL_BERNOUILLI +.. data:: KX_RANDOMACT_INT_CONST +.. data:: KX_RANDOMACT_INT_UNIFORM +.. data:: KX_RANDOMACT_INT_POISSON +.. data:: KX_RANDOMACT_FLOAT_CONST +.. data:: KX_RANDOMACT_FLOAT_UNIFORM +.. data:: KX_RANDOMACT_FLOAT_NORMAL +.. data:: KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL + +-------------- +Scene Actuator +-------------- + +See :class:`bge.types.KX_SceneActuator` + +.. data:: KX_SCENE_RESTART +.. data:: KX_SCENE_SET_SCENE +.. data:: KX_SCENE_SET_CAMERA +.. data:: KX_SCENE_ADD_FRONT_SCENE +.. data:: KX_SCENE_ADD_BACK_SCENE +.. data:: KX_SCENE_REMOVE_SCENE +.. data:: KX_SCENE_SUSPEND +.. data:: KX_SCENE_RESUME + +.. _shape-action-actuator: + +--------------------- +Shape Action Actuator +--------------------- + +See :class:`bge.types.BL_ActionActuator` + +.. data:: KX_ACTIONACT_PLAY +.. data:: KX_ACTIONACT_FLIPPER +.. data:: KX_ACTIONACT_LOOPSTOP +.. data:: KX_ACTIONACT_LOOPEND +.. data:: KX_ACTIONACT_PROPERTY + +.. _logic-sound-actuator: + +-------------- +Sound Actuator +-------------- + +See :class:`bge.types.KX_SoundActuator` + +.. data:: KX_SOUNDACT_PLAYSTOP + + :value: 1 + +.. data:: KX_SOUNDACT_PLAYEND + + :value: 2 + +.. data:: KX_SOUNDACT_LOOPSTOP + + :value: 3 + +.. data:: KX_SOUNDACT_LOOPEND + + :value: 4 + +.. data:: KX_SOUNDACT_LOOPBIDIRECTIONAL + + :value: 5 + +.. data:: KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP + + :value: 6 + + +======= +Various +======= + +.. _input-status: + +------------ +Input Status +------------ + +See :class:`bge.types.SCA_PythonKeyboard`, :class:`bge.types.SCA_PythonMouse`, :class:`bge.types.SCA_MouseSensor`, :class:`bge.types.SCA_KeyboardSensor` + +.. data:: KX_INPUT_NONE +.. data:: KX_INPUT_JUST_ACTIVATED +.. data:: KX_INPUT_ACTIVE +.. data:: KX_INPUT_JUST_RELEASED + +------------- +Mouse Buttons +------------- + +See :class:`bge.types.SCA_MouseSensor` + +.. data:: KX_MOUSE_BUT_LEFT +.. data:: KX_MOUSE_BUT_MIDDLE +.. data:: KX_MOUSE_BUT_RIGHT + +------ +States +------ + +See :class:`bge.types.KX_StateActuator` + +.. data:: KX_STATE1 +.. data:: KX_STATE2 +.. data:: KX_STATE3 +.. data:: KX_STATE4 +.. data:: KX_STATE5 +.. data:: KX_STATE6 +.. data:: KX_STATE7 +.. data:: KX_STATE8 +.. data:: KX_STATE9 +.. data:: KX_STATE10 +.. data:: KX_STATE11 +.. data:: KX_STATE12 +.. data:: KX_STATE13 +.. data:: KX_STATE14 +.. data:: KX_STATE15 +.. data:: KX_STATE16 +.. data:: KX_STATE17 +.. data:: KX_STATE18 +.. data:: KX_STATE19 +.. data:: KX_STATE20 +.. data:: KX_STATE21 +.. data:: KX_STATE22 +.. data:: KX_STATE23 +.. data:: KX_STATE24 +.. data:: KX_STATE25 +.. data:: KX_STATE26 +.. data:: KX_STATE27 +.. data:: KX_STATE28 +.. data:: KX_STATE29 +.. data:: KX_STATE30 + +.. _state-actuator-operation: + +See :class:`bge.types.KX_StateActuator.operation` + +.. data:: KX_STATE_OP_CLR + + Substract bits to state mask + + :value: 0 + +.. data:: KX_STATE_OP_CPY + + Copy state mask + + :value: 1 + +.. data:: KX_STATE_OP_NEG + + Invert bits to state mask + + :value: 2 + +.. data:: KX_STATE_OP_SET + + Add bits to state mask + + :value: 3 + +.. _Two-D-FilterActuator-mode: + +--------- +2D Filter +--------- + +.. data:: RAS_2DFILTER_BLUR + + :value: 2 + +.. data:: RAS_2DFILTER_CUSTOMFILTER + + Customer filter, the code code is set via shaderText property. + + :value: 12 + +.. data:: RAS_2DFILTER_DILATION + + :value: 4 + +.. data:: RAS_2DFILTER_DISABLED + + Disable the filter that is currently active + + :value: -1 + +.. data:: RAS_2DFILTER_ENABLED + + Enable the filter that was previously disabled + + :value: -2 + +.. data:: RAS_2DFILTER_EROSION + + :value: 5 + +.. data:: RAS_2DFILTER_GRAYSCALE + + :value: 9 + +.. data:: RAS_2DFILTER_INVERT + + :value: 11 + +.. data:: RAS_2DFILTER_LAPLACIAN + + :value: 6 + +.. data:: RAS_2DFILTER_MOTIONBLUR + + Create and enable preset filters + + :value: 1 + +.. data:: RAS_2DFILTER_NOFILTER + + Disable and destroy the filter that is currently active + + :value: 0 + +.. data:: RAS_2DFILTER_PREWITT + + :value: 8 + +.. data:: RAS_2DFILTER_SEPIA + + :value: 10 + +.. data:: RAS_2DFILTER_SHARPEN + + :value: 3 + +.. data:: RAS_2DFILTER_SOBEL + + :value: 7 + +------ +Shader +------ + +.. data:: VIEWMATRIX +.. data:: VIEWMATRIX_INVERSE +.. data:: VIEWMATRIX_INVERSETRANSPOSE +.. data:: VIEWMATRIX_TRANSPOSE +.. data:: MODELMATRIX +.. data:: MODELMATRIX_INVERSE +.. data:: MODELMATRIX_INVERSETRANSPOSE +.. data:: MODELMATRIX_TRANSPOSE +.. data:: MODELVIEWMATRIX +.. data:: MODELVIEWMATRIX_INVERSE +.. data:: MODELVIEWMATRIX_INVERSETRANSPOSE +.. data:: MODELVIEWMATRIX_TRANSPOSE +.. data:: CAM_POS + + Current camera position + +.. data:: CONSTANT_TIMER + + User a timer for the uniform value. + +.. data:: SHD_TANGENT + +---------------- +Blender Material +---------------- + +.. data:: BL_DST_ALPHA +.. data:: BL_DST_COLOR +.. data:: BL_ONE +.. data:: BL_ONE_MINUS_DST_ALPHA +.. data:: BL_ONE_MINUS_DST_COLOR +.. data:: BL_ONE_MINUS_SRC_ALPHA +.. data:: BL_ONE_MINUS_SRC_COLOR +.. data:: BL_SRC_ALPHA +.. data:: BL_SRC_ALPHA_SATURATE +.. data:: BL_SRC_COLOR +.. data:: BL_ZERO diff --git a/source/gameengine/PyDoc/bge.render.rst b/source/gameengine/PyDoc/bge.render.rst new file mode 100644 index 00000000000..cea84f3b506 --- /dev/null +++ b/source/gameengine/PyDoc/bge.render.rst @@ -0,0 +1,242 @@ + +Game Engine bge.render Module +============================= + +***** +Intro +***** + +.. module:: bge.render + +.. code-block:: python + + # Example Uses an L{SCA_MouseSensor}, and two L{KX_ObjectActuator}s to implement MouseLook:: + # To use a mouse movement sensor "Mouse" and a + # motion actuator to mouse look: + import bge.render + import bge.logic + + # SCALE sets the speed of motion + SCALE=[1, 0.5] + + co = bge.logic.getCurrentController() + obj = co.getOwner() + mouse = co.getSensor("Mouse") + lmotion = co.getActuator("LMove") + wmotion = co.getActuator("WMove") + + # Transform the mouse coordinates to see how far the mouse has moved. + def mousePos(): + x = (bge.render.getWindowWidth()/2 - mouse.getXPosition())*SCALE[0] + y = (bge.render.getWindowHeight()/2 - mouse.getYPosition())*SCALE[1] + return (x, y) + + pos = mousePos() + + # Set the amount of motion: X is applied in world coordinates... + lmotion.setTorque(0.0, 0.0, pos[0], False) + # ...Y is applied in local coordinates + wmotion.setTorque(-pos[1], 0.0, 0.0, True) + + # Activate both actuators + bge.logic.addActiveActuator(lmotion, True) + bge.logic.addActiveActuator(wmotion, True) + + # Centre the mouse + bge.render.setMousePosition(bge.render.getWindowWidth()/2, bge.render.getWindowHeight()/2) + +********* +Constants +********* + +.. data:: KX_TEXFACE_MATERIAL + + Materials as defined by the texture face settings. + +.. data:: KX_BLENDER_MULTITEX_MATERIAL + + Materials approximating blender materials with multitexturing. + +.. data:: KX_BLENDER_GLSL_MATERIAL + + Materials approximating blender materials with GLSL. + +********* +Functions +********* + +.. function:: getWindowWidth() + + Gets the width of the window (in pixels) + + :rtype: integer + +.. function:: getWindowHeight() + + Gets the height of the window (in pixels) + + :rtype: integer + +.. function:: makeScreenshot(filename) + + Writes a screenshot to the given filename. + + If filename starts with // the image will be saved relative to the current directory. + If the filename contains # it will be replaced with the frame number. + + The standalone player saves .png files. It does not support colour space conversion + or gamma correction. + + When run from Blender, makeScreenshot supports Iris, IrisZ, TGA, Raw TGA, PNG, HamX, and Jpeg. + Gamma, Colourspace conversion and Jpeg compression are taken from the Render settings panels. + + :type filename: string + + +.. function:: enableVisibility(visible) + + Doesn't really do anything... + + +.. function:: showMouse(visible) + + Enables or disables the operating system mouse cursor. + + :type visible: boolean + + +.. function:: setMousePosition(x, y) + + Sets the mouse cursor position. + + :type x: integer + :type y: integer + + +.. function:: setBackgroundColor(rgba) + + Sets the window background colour. + + :type rgba: list [r, g, b, a] + + +.. function:: setMistColor(rgb) + + Sets the mist colour. + + :type rgb: list [r, g, b] + + +.. function:: setAmbientColor(rgb) + + Sets the color of ambient light. + + :type rgb: list [r, g, b] + + +.. function:: setMistStart(start) + + Sets the mist start value. Objects further away than start will have mist applied to them. + + :type start: float + + +.. function:: setMistEnd(end) + + Sets the mist end value. Objects further away from this will be coloured solid with + the colour set by setMistColor(). + + :type end: float + + +.. function:: disableMist() + + Disables mist. + + .. note:: Set any of the mist properties to enable mist. + + +.. function:: setEyeSeparation(eyesep) + + Sets the eye separation for stereo mode. Usually Focal Length/30 provides a confortable value. + + :arg eyesep: The distance between the left and right eye. + :type eyesep: float + + +.. function:: getEyeSeparation() + + Gets the current eye separation for stereo mode. + + :rtype: float + + +.. function:: setFocalLength(focallength) + + Sets the focal length for stereo mode. It uses the current camera focal length as initial value. + + :arg focallength: The focal length. + :type focallength: float + +.. function:: getFocalLength() + + Gets the current focal length for stereo mode. + + :rtype: float + +.. function:: setMaterialMode(mode) + + Set the material mode to use for OpenGL rendering. + + :type mode: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL + + .. note:: Changes will only affect newly created scenes. + + +.. function:: getMaterialMode(mode) + + Get the material mode to use for OpenGL rendering. + + :rtype: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL + + +.. function:: setGLSLMaterialSetting(setting, enable) + + Enables or disables a GLSL material setting. + + :type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures) + :type enable: boolean + + +.. function:: getGLSLMaterialSetting(setting, enable) + + Get the state of a GLSL material setting. + + :type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures) + :rtype: boolean + + +.. function:: drawLine(fromVec,toVec,color) + + Draw a line in the 3D scene. + + :arg fromVec: the origin of the line + :type fromVec: list [x, y, z] + :arg toVec: the end of the line + :type toVec: list [x, y, z] + :arg color: the color of the line + :type color: list [r, g, b] + + +.. function:: enableMotionBlur(factor) + + Enable the motion blue effect. + + :arg factor: the ammount of motion blur to display. + :type factor: float [0.0 - 1.0] + + +.. function:: disableMotionBlur() + + Disable the motion blue effect. + diff --git a/source/gameengine/PyDoc/bge.types.rst b/source/gameengine/PyDoc/bge.types.rst new file mode 100644 index 00000000000..e0ace6ad85b --- /dev/null +++ b/source/gameengine/PyDoc/bge.types.rst @@ -0,0 +1,5202 @@ + +Game Engine bge.types Module +============================= + +.. module:: bge.types + +.. class:: PyObjectPlus + + PyObjectPlus base class of most other types in the Game Engine. + + .. attribute:: invalid + + Test if the object has been freed by the game engine and is no longer valid. + + Normally this is not a problem but when storing game engine data in the GameLogic module, + KX_Scenes or other KX_GameObjects its possible to hold a reference to invalid data. + Calling an attribute or method on an invalid object will raise a SystemError. + + The invalid attribute allows testing for this case without exception handling. + + :type: boolean + + .. method:: isA(game_type) + + Check if this is a type or a subtype game_type. + + :arg game_type: the name of the type or the type its self from the :mod:`bge.types` module. + :type game_type: string or type + :return: True if this object is a type or a subtype of game_type. + :rtype: boolean + +.. class:: CValue(PyObjectPlus) + + This class is a basis for other classes. + + .. attribute:: name + + The name of this CValue derived object (read-only). + + :type: string + +.. class:: CPropValue(CValue) + + This class has no python functions + +.. class:: SCA_ILogicBrick(CValue) + + Base class for all logic bricks. + + .. attribute:: executePriority + + This determines the order controllers are evaluated, and actuators are activated (lower priority is executed first). + + :type: executePriority: int + + .. attribute:: owner + + The game object this logic brick is attached to (read-only). + + :type: :class:`KX_GameObject` or None in exceptional cases. + + .. attribute:: name + + The name of this logic brick (read-only). + + :type: string + +.. class:: SCA_PythonKeyboard(PyObjectPlus) + + The current keyboard. + + .. attribute:: events + + A list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only). + + :type: list [[:ref:`keycode`, :ref:`status`], ...] + +.. class:: SCA_PythonMouse(PyObjectPlus) + + The current mouse. + + .. attribute:: events + + a list of pressed buttons that have either been pressed, or just released, or are active this frame. (read-only). + + :type: list [[:ref:`keycode`, :ref:`status`], ...] + + .. attribute:: position + + The normalized x and y position of the mouse cursor. + + :type: list [x, y] + + .. attribute:: visible + + The visibility of the mouse cursor. + + :type: boolean + +.. class:: SCA_IObject(CValue) + + This class has no python functions + +.. class:: SCA_ISensor(SCA_ILogicBrick) + + Base class for all sensor logic bricks. + + .. attribute:: usePosPulseMode + + Flag to turn positive pulse mode on and off. + + :type: boolean + + .. attribute:: useNegPulseMode + + Flag to turn negative pulse mode on and off. + + :type: boolean + + .. attribute:: frequency + + The frequency for pulse mode sensors. + + :type: integer + + .. attribute:: level + + level Option whether to detect level or edge transition when entering a state. + It makes a difference only in case of logic state transition (state actuator). + A level detector will immediately generate a pulse, negative or positive + depending on the sensor condition, as soon as the state is activated. + A edge detector will wait for a state change before generating a pulse. + note: mutually exclusive with :data:`tap`, enabling will disable :data:`tap`. + + :type: boolean + + .. attribute:: tap + + When enabled only sensors that are just activated will send a positive event, + after this they will be detected as negative by the controllers. + This will make a key thats held act as if its only tapped for an instant. + note: mutually exclusive with :data:`level`, enabling will disable :data:`level`. + + :type: boolean + + .. attribute:: invert + + Flag to set if this sensor activates on positive or negative events. + + :type: boolean + + .. attribute:: triggered + + True if this sensor brick is in a positive state. (read-only). + + :type: boolean + + .. attribute:: positive + + True if this sensor brick is in a positive state. (read-only). + + :type: boolean + + .. attribute:: status + + The status of the sensor (read-only): can be one of :ref:`these constants`. + + :type: int + + .. note:: + + This convenient attribute combines the values of triggered and positive attributes. + + .. method:: reset() + + Reset sensor internal state, effect depends on the type of sensor and settings. + + The sensor is put in its initial state as if it was just activated. + +.. class:: SCA_IController(SCA_ILogicBrick) + + Base class for all controller logic bricks. + + .. attribute:: state + + The controllers state bitmask. This can be used with the GameObject's state to test if the controller is active. + + :type: int bitmask + + .. attribute:: sensors + + A list of sensors linked to this controller. + + :type: sequence supporting index/string lookups and iteration. + + .. note:: + + The sensors are not necessarily owned by the same object. + + .. note:: + + When objects are instanced in dupligroups links may be lost from objects outside the dupligroup. + + .. attribute:: actuators + + A list of actuators linked to this controller. + + :type: sequence supporting index/string lookups and iteration. + + .. note:: + + The sensors are not necessarily owned by the same object. + + .. note:: + + When objects are instanced in dupligroups links may be lost from objects outside the dupligroup. + + .. attribute:: useHighPriority + + When set the controller executes always before all other controllers that dont have this set. + + :type: boolen + + .. note:: + + Order of execution between high priority controllers is not guaranteed. + +.. class:: SCA_IActuator(SCA_ILogicBrick) + + Base class for all actuator logic bricks. + +.. class:: BL_ActionActuator(SCA_IActuator) + + Action Actuators apply an action to an actor. + + .. attribute:: action + + The name of the action to set as the current action. + + :type: string + + .. attribute:: channelNames + + A list of channel names that may be used with :data:`setChannel` and :data:`getChannel`. + + :type: list of strings + + .. attribute:: frameStart + + Specifies the starting frame of the animation. + + :type: float + + .. attribute:: frameEnd + + Specifies the ending frame of the animation. + + :type: float + + .. attribute:: blendIn + + Specifies the number of frames of animation to generate when making transitions between actions. + + :type: float + + .. attribute:: priority + + Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers. + + :type: integer + + .. attribute:: frame + + Sets the current frame for the animation. + + :type: float + + .. attribute:: propName + + Sets the property to be used in FromProp playback mode. + + :type: string + + .. attribute:: blendTime + + Sets the internal frame timer. This property must be in the range from 0.0 to blendIn. + + :type: float + + .. attribute:: mode + + The operation mode of the actuator. Can be one of :ref:`these constants`. + + :type: integer + + .. attribute:: useContinue + + The actions continue option, True or False. When True, the action will always play from where last left off, otherwise negative events to this actuator will reset it to its start frame. + + :type: boolean + + .. attribute:: framePropName + + The name of the property that is set to the current frame number. + + :type: string + + .. method:: setChannel(channel, matrix) + + Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported. + + :arg channel: A string specifying the name of the bone channel, error raised if not in :data:`channelNames`. + :type channel: string + :arg matrix: A 4x4 matrix specifying the overriding transformation as an offset from the bone's rest position. + :arg matrix: list [[float]] + + .. note:: + + These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation. + + .. method:: getChannel(channel) + + :arg channel: A string specifying the name of the bone channel. error raised if not in :data:`channelNames`. + :type channel: string + :return: (loc, size, quat) + :rtype: tuple + +.. class:: BL_Shader(PyObjectPlus) + + BL_Shader GLSL shaders. + + TODO - Description + + .. method:: setUniformfv(name, fList) + + Set a uniform with a list of float values + + :arg name: the uniform name + :type name: string + :arg fList: a list (2, 3 or 4 elements) of float values + :type fList: list[float] + + .. method:: delSource() + + Clear the shader. Use this method before the source is changed with :data:`setSource`. + + .. method:: getFragmentProg() + + Returns the fragment program. + + :return: The fragment program. + :rtype: string + + .. method:: getVertexProg() + + Get the vertex program. + + :return: The vertex program. + :rtype: string + + .. method:: isValid() + + Check if the shader is valid. + + :return: True if the shader is valid + :rtype: boolean + + .. method:: setAttrib(enum) + + Set attribute location. (The parameter is ignored a.t.m. and the value of "tangent" is always used.) + + :arg enum: attribute location value + :type enum: integer + + .. method:: setNumberOfPasses( max_pass ) + + Set the maximum number of passes. Not used a.t.m. + + :arg max_pass: the maximum number of passes + :type max_pass: integer + + .. method:: setSampler(name, index) + + Set uniform texture sample index. + + :arg name: Uniform name + :type name: string + :arg index: Texture sample index. + :type index: integer + + .. method:: setSource(vertexProgram, fragmentProgram) + + Set the vertex and fragment programs + + :arg vertexProgram: Vertex program + :type vertexProgram: string + :arg fragmentProgram: Fragment program + :type fragmentProgram: string + + .. method:: setUniform1f(name, fx) + + Set a uniform with 1 float value. + + :arg name: the uniform name + :type name: string + :arg fx: Uniform value + :type fx: float + + .. method:: setUniform1i(name, ix) + + Set a uniform with an integer value. + + :arg name: the uniform name + :type name: string + :arg ix: the uniform value + :type ix: integer + + .. method:: setUniform2f(name, fx, fy) + + Set a uniform with 2 float values + + :arg name: the uniform name + :type name: string + :arg fx: first float value + :type fx: float + + :arg fy: second float value + :type fy: float + + .. method:: setUniform2i(name, ix, iy) + + Set a uniform with 2 integer values + + :arg name: the uniform name + :type name: string + :arg ix: first integer value + :type ix: integer + :arg iy: second integer value + :type iy: integer + + .. method:: setUniform3f(name, fx, fy, fz) + + Set a uniform with 3 float values. + + :arg name: the uniform name + :type name: string + :arg fx: first float value + :type fx: float + :arg fy: second float value + :type fy: float + :arg fz: third float value + :type fz: float + + .. method:: setUniform3i(name, ix, iy, iz) + + Set a uniform with 3 integer values + + :arg name: the uniform name + :type name: string + :arg ix: first integer value + :type ix: integer + :arg iy: second integer value + :type iy: integer + :arg iz: third integer value + :type iz: integer + + .. method:: setUniform4f(name, fx, fy, fz, fw) + + Set a uniform with 4 float values. + + :arg name: the uniform name + :type name: string + :arg fx: first float value + :type fx: float + :arg fy: second float value + :type fy: float + :arg fz: third float value + :type fz: float + :arg fw: fourth float value + :type fw: float + + .. method:: setUniform4i(name, ix, iy, iz, iw) + + Set a uniform with 4 integer values + + :arg name: the uniform name + :type name: string + :arg ix: first integer value + :type ix: integer + :arg iy: second integer value + :type iy: integer + :arg iz: third integer value + :type iz: integer + :arg iw: fourth integer value + :type iw: integer + + .. method:: setUniformDef(name, type) + + Define a new uniform + + :arg name: the uniform name + :type name: string + :arg type: uniform type + :type type: UNI_NONE, UNI_INT, UNI_FLOAT, UNI_INT2, UNI_FLOAT2, UNI_INT3, UNI_FLOAT3, UNI_INT4, UNI_FLOAT4, UNI_MAT3, UNI_MAT4, UNI_MAX + + .. method:: setUniformMatrix3(name, mat, transpose) + + Set a uniform with a 3x3 matrix value + + :arg name: the uniform name + :type name: string + :arg mat: A 3x3 matrix [[f, f, f], [f, f, f], [f, f, f]] + :type mat: 3x3 matrix + :arg transpose: set to True to transpose the matrix + :type transpose: boolean + + .. method:: setUniformMatrix4(name, mat, transpose) + + Set a uniform with a 4x4 matrix value + + :arg name: the uniform name + :type name: string + :arg mat: A 4x4 matrix [[f, f, f, f], [f, f, f, f], [f, f, f, f], [f, f, f, f]] + :type mat: 4x4 matrix + :arg transpose: set to True to transpose the matrix + :type transpose: boolean + + .. method:: setUniformiv(name, iList) + + Set a uniform with a list of integer values + + :arg name: the uniform name + :type name: string + :arg iList: a list (2, 3 or 4 elements) of integer values + :type iList: list[integer] + + .. method:: validate() + + Validate the shader object. + +.. class:: BL_ShapeActionActuator(SCA_IActuator) + + ShapeAction Actuators apply an shape action to an mesh object. + + .. attribute:: action + + The name of the action to set as the current shape action. + + :type: string + + .. attribute:: frameStart + + Specifies the starting frame of the shape animation. + + :type: float + + .. attribute:: frameEnd + + Specifies the ending frame of the shape animation. + + :type: float + + .. attribute:: blendIn + + Specifies the number of frames of animation to generate when making transitions between actions. + + :type: float + + .. attribute:: priority + + Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers. + + :type: integer + + .. attribute:: frame + + Sets the current frame for the animation. + + :type: float + + .. attribute:: propName + + Sets the property to be used in FromProp playback mode. + + :type: string + + .. attribute:: blendTime + + Sets the internal frame timer. This property must be in the range from 0.0 to blendin. + + :type: float + + .. attribute:: mode + + The operation mode of the actuator. Can be one of :ref:`these constants`. + + :type: integer + + .. attribute:: framePropName + + The name of the property that is set to the current frame number. + + :type: string + +.. class:: CListValue(CPropValue) + + This is a list like object used in the game engine internally that behaves similar to a python list in most ways. + + As well as the normal index lookup (``val= clist[i]``), CListValue supports string lookups (``val= scene.objects["Cube"]``) + + Other operations such as ``len(clist)``, ``list(clist)``, ``clist[0:10]`` are also supported. + + .. method:: append(val) + + Add an item to the list (like pythons append) + + .. warning:: + + Appending values to the list can cause crashes when the list is used internally by the game engine. + + .. method:: count(val) + + Count the number of instances of a value in the list. + + :return: number of instances + :rtype: integer + + .. method:: index(val) + + Return the index of a value in the list. + + :return: The index of the value in the list. + :rtype: integer + + .. method:: reverse() + + Reverse the order of the list. + + .. method:: get(key, default=None) + + Return the value matching key, or the default value if its not found. + + :return: The key value or a default. + + .. method:: from_id(id) + + This is a funtion especially for the game engine to return a value with a spesific id. + + Since object names are not always unique, the id of an object can be used to get an object from the CValueList. + + Example: + + .. code-block:: python + + myObID=id(gameObject) + ob= scene.objects.from_id(myObID) + + Where ``myObID`` is an int or long from the id function. + + This has the advantage that you can store the id in places you could not store a gameObject. + + .. warning:: + + The id is derived from a memory location and will be different each time the game engine starts. + +.. class:: KX_BlenderMaterial(PyObjectPlus) + + KX_BlenderMaterial + + .. method:: getShader() + + Returns the material's shader. + + :return: the material's shader + :rtype: :class:`BL_Shader` + + .. method:: setBlending(src, dest) + + Set the pixel color arithmetic functions. + + :arg src: Specifies how the red, green, blue, and alpha source blending factors are computed. + :type src: Value in... + + * GL_ZERO, + * GL_ONE, + * GL_SRC_COLOR, + * GL_ONE_MINUS_SRC_COLOR, + * GL_DST_COLOR, + * GL_ONE_MINUS_DST_COLOR, + * GL_SRC_ALPHA, + * GL_ONE_MINUS_SRC_ALPHA, + * GL_DST_ALPHA, + * GL_ONE_MINUS_DST_ALPHA, + * GL_SRC_ALPHA_SATURATE + + :arg dest: Specifies how the red, green, blue, and alpha destination blending factors are computed. + :type dest: Value in... + + * GL_ZERO + * GL_ONE + * GL_SRC_COLOR + * GL_ONE_MINUS_SRC_COLOR + * GL_DST_COLOR + * GL_ONE_MINUS_DST_COLOR + * GL_SRC_ALPHA + * GL_ONE_MINUS_SRC_ALPHA + * GL_DST_ALPHA + * GL_ONE_MINUS_DST_ALPHA + * GL_SRC_ALPHA_SATURATE + + .. method:: getMaterialIndex() + + Returns the material's index. + + :return: the material's index + :rtype: integer + +.. class:: KX_CameraActuator(SCA_IActuator) + + Applies changes to a camera. + + .. attribute:: min + + minimum distance to the target object maintained by the actuator. + + :type: float + + .. attribute:: max + + maximum distance to stay from the target object. + + :type: float + + .. attribute:: height + + height to stay above the target object. + + :type: float + + .. attribute:: useXY + + axis this actuator is tracking, True=X, False=Y. + + :type: boolean + + .. attribute:: object + + the object this actuator tracks. + + :type: :class:`KX_GameObject` or None + +.. class:: KX_ConstraintActuator(SCA_IActuator) + + A constraint actuator limits the position, rotation, distance or orientation of an object. + + .. attribute:: damp + + Time constant of the constraint expressed in frame (not use by Force field constraint). + + :type: integer + + .. attribute:: rotDamp + + Time constant for the rotation expressed in frame (only for the distance constraint), 0 = use damp for rotation as well. + + :type: integer + + .. attribute:: direction + + The reference direction in world coordinate for the orientation constraint. + + :type: 3-tuple of float: (x, y, z) + + .. attribute:: option + + Binary combination of :ref:`these constants ` + + :type: integer + + .. attribute:: time + + activation time of the actuator. The actuator disables itself after this many frame. If set to 0, the actuator is not limited in time. + + :type: integer + + .. attribute:: propName + + the name of the property or material for the ray detection of the distance constraint. + + :type: string + + .. attribute:: min + + The lower bound of the constraint. For the rotation and orientation constraint, it represents radiant. + + :type: float + + .. attribute:: distance + + the target distance of the distance constraint. + + :type: float + + .. attribute:: max + + the upper bound of the constraint. For rotation and orientation constraints, it represents radiant. + + :type: float + + .. attribute:: rayLength + + the length of the ray of the distance constraint. + + :type: float + + .. attribute:: limit + + type of constraint. Use one of the :ref:`these constants ` + + :type: integer. + + +.. class:: KX_ConstraintWrapper(PyObjectPlus) + + KX_ConstraintWrapper + + .. method:: getConstraintId(val) + + Returns the contraint's ID + + :return: the constraint's ID + :rtype: integer + +.. class:: KX_GameActuator(SCA_IActuator) + + The game actuator loads a new .blend file, restarts the current .blend file or quits the game. + + .. attribute:: fileName + + the new .blend file to load. + + :type: string + + .. attribute:: mode + + The mode of this actuator. Can be on of :ref:`these constants ` + + :type: Int + +.. class:: KX_GameObject(SCA_IObject) + + All game objects are derived from this class. + + Properties assigned to game objects are accessible as attributes of this class. + + .. note:: + + Calling ANY method or attribute on an object that has been removed from a scene will raise a SystemError, if an object may have been removed since last accessing it use the :data:`invalid` attribute to check. + + .. attribute:: name + + The object's name. (read-only). + + :type: string + + .. attribute:: mass + + The object's mass + + :type: float + + .. note:: + + The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0. + + .. attribute:: linVelocityMin + + Enforces the object keeps moving at a minimum velocity. + + :type: float + + .. note:: + + Applies to dynamic and rigid body objects only. + + .. note:: + + A value of 0.0 disables this option. + + .. note:: + + While objects are stationary the minimum velocity will not be applied. + + .. attribute:: linVelocityMax + + Clamp the maximum linear velocity to prevent objects moving beyond a set speed. + + :type: float + + .. note:: + + Applies to dynamic and rigid body objects only. + + .. note:: + + A value of 0.0 disables this option (rather then setting it stationary). + + .. attribute:: localInertia + + the object's inertia vector in local coordinates. Read only. + + :type: list [ix, iy, iz] + + .. attribute:: parent + + The object's parent object. (read-only). + + :type: :class:`KX_GameObject` or None + + .. attribute:: visible + + visibility flag. + + :type: boolean + + .. note:: + + Game logic will still run for invisible objects. + + .. attribute:: color + + The object color of the object. + + :type: list [r, g, b, a] + + .. attribute:: occlusion + + occlusion capability flag. + + :type: boolean + + .. attribute:: position + + The object's position. + + .. deprecated:: use :data:`localPosition` and :data:`worldPosition`. + + :type: list [x, y, z] On write: local position, on read: world position + + .. attribute:: orientation + + The object's orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. + + .. deprecated:: use :data:`localOrientation` and :data:`worldOrientation`. + + :type: 3x3 Matrix [[float]] On write: local orientation, on read: world orientation + + .. attribute:: scaling + + The object's scaling factor. list [sx, sy, sz] + + .. deprecated:: use :data:`localScale` and :data:`worldScale`. + + :type: list [sx, sy, sz] On write: local scaling, on read: world scaling + + .. attribute:: localOrientation + + The object's local orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector. + + :type: 3x3 Matrix [[float]] + + .. attribute:: worldOrientation + + The object's world orientation. + + :type: 3x3 Matrix [[float]] + + .. attribute:: localScale + + The object's local scaling factor. + + :type: list [sx, sy, sz] + + .. attribute:: worldScale + + The object's world scaling factor. Read-only. + + :type: list [sx, sy, sz] + + .. attribute:: localPosition + + The object's local position. + + :type: list [x, y, z] + + .. attribute:: worldPosition + + The object's world position. + + :type: list [x, y, z] + + .. attribute:: timeOffset + + adjust the slowparent delay at runtime. + + :type: float + + .. attribute:: state + + the game object's state bitmask, using the first 30 bits, one bit must always be set. + + :type: int + + .. attribute:: meshes + + a list meshes for this object. + + :type: list of :class:`KX_MeshProxy` + + .. note:: + + Most objects use only 1 mesh. + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: sensors + + a sequence of :class:`SCA_ISensor` objects with string/index lookups and iterator support. + + :type: list + + .. note:: + + This attribute is experemental and may be removed (but probably wont be). + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: controllers + + a sequence of :class:`SCA_IController` objects with string/index lookups and iterator support. + + :type: list of :class:`SCA_ISensor` + + .. note:: + + This attribute is experemental and may be removed (but probably wont be). + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: actuators + + a list of :class:`SCA_IActuator` with string/index lookups and iterator support. + + :type: list + + .. note:: + + This attribute is experemental and may be removed (but probably wont be). + + .. note:: + + Changes to this list will not update the KX_GameObject. + + .. attribute:: attrDict + + get the objects internal python attribute dictionary for direct (faster) access. + + :type: dict + + .. attribute:: children + + direct children of this object, (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject`'s + + .. attribute:: childrenRecursive + + all children of this object including childrens children, (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject`'s + + .. method:: endObject() + + Delete this object, can be used in place of the EndObject Actuator. + + The actual removal of the object from the scene is delayed. + + .. method:: replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False) + + Replace the mesh of this object with a new mesh. This works the same was as the actuator. + + :arg mesh: mesh to replace or the meshes name. + :type mesh: :class:`MeshProxy` or string + :arg useDisplayMesh: when enabled the display mesh will be replaced (optional argument). + :type useDisplayMesh: boolean + :arg usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument). + :type usePhysicsMesh: boolean + + .. method:: setVisible(visible, recursive) + + Sets the game object's visible flag. + + :arg visible: the visible state to set. + :type visible: boolean + :arg recursive: optional argument to set all childrens visibility flag too. + :type recursive: boolean + + .. method:: setOcclusion(occlusion, recursive) + + Sets the game object's occlusion capability. + + :arg occlusion: the state to set the occlusion to. + :type occlusion: boolean + :arg recursive: optional argument to set all childrens occlusion flag too. + :type recursive: boolean + + .. method:: alignAxisToVect(vect, axis=2, factor=1.0) + + Aligns any of the game object's axis along the given vector. + + + :arg vect: a vector to align the axis. + :type vect: 3D vector + :arg axis: The axis you want to align + + * 0: X axis + * 1: Y axis + * 2: Z axis + + :type axis: integer + :arg factor: Only rotate a feaction of the distance to the target vector (0.0 - 1.0) + :type factor: float + + .. method:: getAxisVect(vect) + + Returns the axis vector rotates by the objects worldspace orientation. + This is the equivalent of multiplying the vector by the orientation matrix. + + :arg vect: a vector to align the axis. + :type vect: 3D Vector + :return: The vector in relation to the objects rotation. + :rtype: 3d vector. + + .. method:: applyMovement(movement, local=False) + + Sets the game object's movement. + + :arg movement: movement vector. + :type movement: 3D Vector + :arg local: + * False: you get the "global" movement ie: relative to world orientation. + * True: you get the "local" movement ie: relative to object orientation. + :arg local: boolean + + .. method:: applyRotation(rotation, local=False) + + Sets the game object's rotation. + + :arg rotation: rotation vector. + :type rotation: 3D Vector + :arg local: + * False: you get the "global" rotation ie: relative to world orientation. + * True: you get the "local" rotation ie: relative to object orientation. + :arg local: boolean + + .. method:: applyForce(force, local=False) + + Sets the game object's force. + + This requires a dynamic object. + + :arg force: force vector. + :type force: 3D Vector + :arg local: + * False: you get the "global" force ie: relative to world orientation. + * True: you get the "local" force ie: relative to object orientation. + :type local: boolean + + .. method:: applyTorque(torque, local=False) + + Sets the game object's torque. + + This requires a dynamic object. + + :arg torque: torque vector. + :type torque: 3D Vector + :arg local: + * False: you get the "global" torque ie: relative to world orientation. + * True: you get the "local" torque ie: relative to object orientation. + :type local: boolean + + .. method:: getLinearVelocity(local=False) + + Gets the game object's linear velocity. + + This method returns the game object's velocity through it's centre of mass, ie no angular velocity component. + + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + :type local: boolean + :return: the object's linear velocity. + :rtype: list [vx, vy, vz] + + .. method:: setLinearVelocity(velocity, local=False) + + Sets the game object's linear velocity. + + This method sets game object's velocity through it's centre of mass, + ie no angular velocity component. + + This requires a dynamic object. + + :arg velocity: linear velocity vector. + :type velocity: 3D Vector + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + :type local: boolean + + .. method:: getAngularVelocity(local=False) + + Gets the game object's angular velocity. + + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + :type local: boolean + :return: the object's angular velocity. + :rtype: list [vx, vy, vz] + + .. method:: setAngularVelocity(velocity, local=False) + + Sets the game object's angular velocity. + + This requires a dynamic object. + + :arg velocity: angular velocity vector. + :type velocity: boolean + :arg local: + * False: you get the "global" velocity ie: relative to world orientation. + * True: you get the "local" velocity ie: relative to object orientation. + + .. method:: getVelocity(point=(0, 0, 0)) + + Gets the game object's velocity at the specified point. + + Gets the game object's velocity at the specified point, including angular + components. + + :arg point: optional point to return the velocity for, in local coordinates. + :type point: 3D Vector + :return: the velocity at the specified point. + :rtype: list [vx, vy, vz] + + .. method:: getReactionForce() + + Gets the game object's reaction force. + + The reaction force is the force applied to this object over the last simulation timestep. + This also includes impulses, eg from collisions. + + :return: the reaction force of this object. + :rtype: list [fx, fy, fz] + + .. note:: + + This is not implimented at the moment. + + .. method:: applyImpulse(point, impulse) + + Applies an impulse to the game object. + + This will apply the specified impulse to the game object at the specified point. + If point != position, applyImpulse will also change the object's angular momentum. + Otherwise, only linear momentum will change. + + :arg point: the point to apply the impulse to (in world coordinates) + :type point: the point to apply the impulse to (in world coordinates) + + .. method:: suspendDynamics() + + Suspends physics for this object. + + .. method:: restoreDynamics() + + Resumes physics for this object. + + .. note:: + + The objects linear velocity will be applied from when the dynamics were suspended. + + .. method:: enableRigidBody() + + Enables rigid body physics for this object. + + Rigid body physics allows the object to roll on collisions. + + .. note:: + + This is not working with bullet physics yet. + + .. method:: disableRigidBody() + + Disables rigid body physics for this object. + + .. note:: + + This is not working with bullet physics yet. The angular is removed but rigid body physics can still rotate it later. + + .. method:: setParent(parent, compound=True, ghost=True) + + Sets this object's parent. + Control the shape status with the optional compound and ghost parameters: + + In that case you can control if it should be ghost or not: + + :arg parent: new parent object. + :type parent: :class:`KX_GameObject` + :arg compound: whether the shape should be added to the parent compound shape. + + * True: the object shape should be added to the parent compound shape. + * False: the object should keep its individual shape. + + :type compound: boolean + :arg ghost: whether the object should be ghost while parented. + + * True: if the object should be made ghost while parented. + * False: if the object should be solid while parented. + + :type ghost: boolean + + .. note:: + + If the object type is sensor, it stays ghost regardless of ghost parameter + + .. method:: removeParent() + + Removes this objects parent. + + .. method:: getPhysicsId() + + Returns the user data object associated with this game object's physics controller. + + .. method:: getPropertyNames() + + Gets a list of all property names. + + :return: All property names for this object. + :rtype: list + + .. method:: getDistanceTo(other) + + :arg other: a point or another :class:`KX_GameObject` to measure the distance to. + :type other: :class:`KX_GameObject` or list [x, y, z] + :return: distance to another object or point. + :rtype: float + + .. method:: getVectTo(other) + + Returns the vector and the distance to another object or point. + The vector is normalized unless the distance is 0, in which a zero length vector is returned. + + :arg other: a point or another :class:`KX_GameObject` to get the vector and distance to. + :type other: :class:`KX_GameObject` or list [x, y, z] + :return: (distance, globalVector(3), localVector(3)) + :rtype: 3-tuple (float, 3-tuple (x, y, z), 3-tuple (x, y, z)) + + .. method:: rayCastTo(other, dist, prop) + + Look towards another point/object and find first object hit within dist that matches prop. + + The ray is always casted from the center of the object, ignoring the object itself. + The ray is casted towards the center of another object or an explicit [x, y, z] point. + Use rayCast() if you need to retrieve the hit point + + :arg other: [x, y, z] or object towards which the ray is casted + :type other: :class:`KX_GameObject` or 3-tuple + :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other + :type dist: float + :arg prop: property name that object must have; can be omitted => detect any object + :type prop: string + :return: the first object hit or None if no object or object does not match prop + :rtype: :class:`KX_GameObject` + + .. method:: rayCast(objto, objfrom, dist, prop, face, xray, poly) + + Look from a point/object to another point/object and find first object hit within dist that matches prop. + if poly is 0, returns a 3-tuple with object reference, hit point and hit normal or (None, None, None) if no hit. + if poly is 1, returns a 4-tuple with in addition a :class:`KX_PolyProxy` as 4th element. + if poly is 2, returns a 5-tuple with in addition a 2D vector with the UV mapping of the hit point as 5th element. + + .. code-block:: python + + # shoot along the axis gun-gunAim (gunAim should be collision-free) + obj, point, normal = gun.rayCast(gunAim, None, 50) + if obj: + # do something + pass + + The face paremeter determines the orientation of the normal. + + * 0 => hit normal is always oriented towards the ray origin (as if you casted the ray from outside) + * 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect) + + The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray. + The prop and xray parameters interact as follow. + + * prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray. + * prop off, xray on : idem. + * prop on, xray off: return closest hit if it matches prop, no hit otherwise. + * prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray. + + The :class:`KX_PolyProxy` 4th element of the return tuple when poly=1 allows to retrieve information on the polygon hit by the ray. + If there is no hit or the hit object is not a static mesh, None is returned as 4th element. + + The ray ignores collision-free objects and faces that dont have the collision flag enabled, you can however use ghost objects. + + :arg objto: [x, y, z] or object to which the ray is casted + :type objto: :class:`KX_GameObject` or 3-tuple + :arg objfrom: [x, y, z] or object from which the ray is casted; None or omitted => use self object center + :type objfrom: :class:`KX_GameObject` or 3-tuple or None + :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to to + :type dist: float + :arg prop: property name that object must have; can be omitted or "" => detect any object + :type prop: string + :arg face: normal option: 1=>return face normal; 0 or omitted => normal is oriented towards origin + :type face: integer + :arg xray: X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object + :type xray: integer + :arg poly: polygon option: 0, 1 or 2 to return a 3-, 4- or 5-tuple with information on the face hit. + + * 0 or omitted: return value is a 3-tuple (object, hitpoint, hitnormal) or (None, None, None) if no hit + * 1: return value is a 4-tuple and the 4th element is a :class:`KX_PolyProxy` or None if no hit or the object doesn't use a mesh collision shape. + * 2: return value is a 5-tuple and the 5th element is a 2-tuple (u, v) with the UV mapping of the hit point or None if no hit, or the object doesn't use a mesh collision shape, or doesn't have a UV mapping. + + :type poly: integer + :return: (object, hitpoint, hitnormal) or (object, hitpoint, hitnormal, polygon) or (object, hitpoint, hitnormal, polygon, hituv). + + * object, hitpoint and hitnormal are None if no hit. + * polygon is valid only if the object is valid and is a static object, a dynamic object using mesh collision shape or a soft body object, otherwise it is None + * hituv is valid only if polygon is valid and the object has a UV mapping, otherwise it is None + + :rtype: + + * 3-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz)) + * or 4-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`) + * or 5-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`, 2-tuple (u, v)) + + .. note:: + + The ray ignores the object on which the method is called. It is casted from/to object center or explicit [x, y, z] points. + + .. method:: setCollisionMargin(margin) + + Set the objects collision margin. + + :arg margin: the collision margin distance in blender units. + :type margin: float + + .. note:: + + If this object has no physics controller (a physics ID of zero), this function will raise RuntimeError. + + .. method:: sendMessage(subject, body="", to="") + + Sends a message. + + :arg subject: The subject of the message + :type subject: string + :arg body: The body of the message (optional) + :type body: string + :arg to: The name of the object to send the message to (optional) + :type to: string + + .. method:: reinstancePhysicsMesh(gameObject, meshObject) + + Updates the physics system with the changed mesh. + + If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object. + + :arg gameObject: optional argument, set the physics shape from this gameObjets mesh. + :type gameObject: string, :class:`KX_GameObject` or None + :arg meshObject: optional argument, set the physics shape from this mesh. + :type meshObject: string, :class:`MeshProxy` or None + + :return: True if reinstance succeeded, False if it failed. + :rtype: boolean + + .. note:: + + If this object has instances the other instances will be updated too. + + .. note:: + + The gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf). + + .. warning:: + + Only triangle mesh type objects are supported currently (not convex hull) + + .. warning:: + + If the object is a part of a combound object it will fail (parent or child) + + .. warning:: + + Rebuilding the physics mesh can be slow, running many times per second will give a performance hit. + + .. method:: get(key, default=None) + + Return the value matching key, or the default value if its not found. + :return: The key value or a default. + +.. class:: KX_IpoActuator(SCA_IActuator) + + IPO actuator activates an animation. + + .. attribute:: frameStart + + Start frame. + + :type: float + + .. attribute:: frameEnd + + End frame. + + :type: float + + .. attribute:: propName + + Use this property to define the Ipo position. + + :type: string + + .. attribute:: framePropName + + Assign this property this action current frame number. + + :type: string + + .. attribute:: mode + + Play mode for the ipo. Can be on of :ref:`these constants ` + + :type: integer + + .. attribute:: useIpoAsForce + + Apply Ipo as a global or local force depending on the local option (dynamic objects only). + + :type: boolean + + .. attribute:: useIpoAdd + + Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag. + + :type: boolean + + .. attribute:: useIpoLocal + + Let the ipo acts in local coordinates, used in Force and Add mode. + + :type: boolean + + .. attribute:: useChildren + + Update IPO on all children Objects as well. + + :type: boolean + +.. class:: KX_LightObject(KX_GameObject) + + A Light object. + + .. code-block:: python + + # Turn on a red alert light. + import bge + + co = bge.logic.getCurrentController() + light = co.owner + + light.energy = 1.0 + light.colour = [1.0, 0.0, 0.0] + + .. data:: SPOT + + A spot light source. See attribute :data:`type` + + .. data:: SUN + + A point light source with no attenuation. See attribute :data:`type` + + .. data:: NORMAL + + A point light source. See attribute :data:`type` + + .. attribute:: type + + The type of light - must be SPOT, SUN or NORMAL + + .. attribute:: layer + + The layer mask that this light affects object on. + + :type: bitfield + + .. attribute:: energy + + The brightness of this light. + + :type: float + + .. attribute:: distance + + The maximum distance this light can illuminate. (SPOT and NORMAL lights only). + + :type: float + + .. attribute:: colour + + The colour of this light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0]. + + :type: list [r, g, b] + + .. attribute:: color + + Synonym for colour. + + .. attribute:: lin_attenuation + + The linear component of this light's attenuation. (SPOT and NORMAL lights only). + + :type: float + + .. attribute:: quad_attenuation + + The quadratic component of this light's attenuation (SPOT and NORMAL lights only). + + :type: float + + .. attribute:: spotsize + + The cone angle of the spot light, in degrees (SPOT lights only). + + :type: float in [0 - 180]. + + .. attribute:: spotblend + + Specifies the intensity distribution of the spot light (SPOT lights only). + + :type: float in [0 - 1] + + .. note:: + + Higher values result in a more focused light source. + +.. class:: KX_MeshProxy(SCA_IObject) + + A mesh object. + + You can only change the vertex properties of a mesh object, not the mesh topology. + + To use mesh objects effectively, you should know a bit about how the game engine handles them. + + #. Mesh Objects are converted from Blender at scene load. + #. The Converter groups polygons by Material. This means they can be sent to the renderer efficiently. A material holds: + + #. The texture. + #. The Blender material. + #. The Tile properties + #. The face properties - (From the "Texture Face" panel) + #. Transparency & z sorting + #. Light layer + #. Polygon shape (triangle/quad) + #. Game Object + + #. Verticies will be split by face if necessary. Verticies can only be shared between faces if: + + #. They are at the same position + #. UV coordinates are the same + #. Their normals are the same (both polygons are "Set Smooth") + #. They are the same colour, for example: a cube has 24 verticies: 6 faces with 4 verticies per face. + + The correct method of iterating over every :class:`KX_VertexProxy` in a game object + + .. code-block:: python + + import GameLogic + + co = GameLogic.getCurrentController() + obj = co.owner + + m_i = 0 + mesh = obj.getMesh(m_i) # There can be more than one mesh... + while mesh != None: + for mat in range(mesh.getNumMaterials()): + for v_index in range(mesh.getVertexArrayLength(mat)): + vertex = mesh.getVertex(mat, v_index) + # Do something with vertex here... + # ... eg: colour the vertex red. + vertex.colour = [1.0, 0.0, 0.0, 1.0] + m_i += 1 + mesh = obj.getMesh(m_i) + + .. attribute:: materials + + :type: list of :class:`KX_BlenderMaterial` or :class:`KX_PolygonMaterial` types + + .. attribute:: numPolygons + + :type: integer + + .. attribute:: numMaterials + + :type: integer + + .. method:: getNumMaterials() + + :return: number of materials associated with this object + :rtype: integer + + .. method:: getMaterialName(matid) + + Gets the name of the specified material. + + :arg matid: the specified material. + :type matid: integer + :return: the attached material name. + :rtype: string + + .. method:: getTextureName(matid) + + Gets the name of the specified material's texture. + + :arg matid: the specified material + :type matid: integer + :return: the attached material's texture name. + :rtype: string + + .. method:: getVertexArrayLength(matid) + + Gets the length of the vertex array associated with the specified material. + + There is one vertex array for each material. + + :arg matid: the specified material + :type matid: integer + :return: the number of verticies in the vertex array. + :rtype: integer + + .. method:: getVertex(matid, index) + + Gets the specified vertex from the mesh object. + + :arg matid: the specified material + :type matid: integer + :arg index: the index into the vertex array. + :type index: integer + :return: a vertex object. + :rtype: :class:`KX_VertexProxy` + + .. method:: getNumPolygons() + + :return: The number of polygon in the mesh. + :rtype: integer + + .. method:: getPolygon(index) + + Gets the specified polygon from the mesh. + + :arg index: polygon number + :type index: integer + :return: a polygon object. + :rtype: :class:`PolyProxy` + +.. class:: SCA_MouseSensor(SCA_ISensor) + + Mouse Sensor logic brick. + + .. attribute:: position + + current [x, y] coordinates of the mouse, in frame coordinates (pixels). + + :type: [integer, interger] + + .. attribute:: mode + + sensor mode. + + :type: integer + + * KX_MOUSESENSORMODE_LEFTBUTTON(1) + * KX_MOUSESENSORMODE_MIDDLEBUTTON(2) + * KX_MOUSESENSORMODE_RIGHTBUTTON(3) + * KX_MOUSESENSORMODE_WHEELUP(4) + * KX_MOUSESENSORMODE_WHEELDOWN(5) + * KX_MOUSESENSORMODE_MOVEMENT(6) + + .. method:: getButtonStatus(button) + + Get the mouse button status. + + :arg button: The code that represents the key you want to get the state of, use one of :ref:`these constants` + :type button: int + :return: The state of the given key, can be one of :ref:`these constants` + :rtype: int + +.. class:: KX_MouseFocusSensor(SCA_MouseSensor) + + The mouse focus sensor detects when the mouse is over the current game object. + + The mouse focus sensor works by transforming the mouse coordinates from 2d device + space to 3d space then raycasting away from the camera. + + .. attribute:: raySource + + The worldspace source of the ray (the view position). + + :type: list (vector of 3 floats) + + .. attribute:: rayTarget + + The worldspace target of the ray. + + :type: list (vector of 3 floats) + + .. attribute:: rayDirection + + The :data:`rayTarget` - :class:`raySource` normalized. + + :type: list (normalized vector of 3 floats) + + .. attribute:: hitObject + + the last object the mouse was over. + + :type: :class:`KX_GameObject` or None + + .. attribute:: hitPosition + + The worldspace position of the ray intersecton. + + :type: list (vector of 3 floats) + + .. attribute:: hitNormal + + the worldspace normal from the face at point of intersection. + + :type: list (normalized vector of 3 floats) + + .. attribute:: hitUV + + the UV coordinates at the point of intersection. + + :type: list (vector of 2 floats) + + If the object has no UV mapping, it returns [0, 0]. + + The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping. + + .. attribute:: usePulseFocus + + When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set). + + :type: boolean + +.. class:: KX_TouchSensor(SCA_ISensor) + + Touch sensor detects collisions between objects. + + .. attribute:: propName + + The property or material to collide with. + + :type: string + + .. attribute:: useMaterial + + Determines if the sensor is looking for a property or material. KX_True = Find material; KX_False = Find property. + + :type: boolean + + .. attribute:: usePulseCollision + + When enabled, changes to the set of colliding objects generate a pulse. + + :type: boolean + + .. attribute:: hitObject + + The last collided object. (read-only). + + :type: :class:`KX_GameObject` or None + + .. attribute:: hitObjectList + + A list of colliding objects. (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject` + +.. class:: KX_NearSensor(KX_TouchSensor) + + A near sensor is a specialised form of touch sensor. + + .. attribute:: distance + + The near sensor activates when an object is within this distance. + + :type: float + + .. attribute:: resetDistance + + The near sensor deactivates when the object exceeds this distance. + + :type: float + +.. class:: KX_NetworkMessageActuator(SCA_IActuator) + + Message Actuator + + .. attribute:: propName + + Messages will only be sent to objects with the given property name. + + :type: string + + .. attribute:: subject + + The subject field of the message. + + :type: string + + .. attribute:: body + + The body of the message. + + :type: string + + .. attribute:: usePropBody + + Send a property instead of a regular body message. + + :type: boolean + +.. class:: KX_NetworkMessageSensor(SCA_ISensor) + + The Message Sensor logic brick. + + Currently only loopback (local) networks are supported. + + .. attribute:: subject + + The subject the sensor is looking for. + + :type: string + + .. attribute:: frameMessageCount + + The number of messages received since the last frame. (read-only). + + :type: integer + + .. attribute:: subjects + + The list of message subjects received. (read-only). + + :type: list of strings + + .. attribute:: bodies + + The list of message bodies received. (read-only). + + :type: list of strings + +.. class:: KX_ObjectActuator(SCA_IActuator) + + The object actuator ("Motion Actuator") applies force, torque, displacement, angular displacement, + velocity, or angular velocity to an object. + Servo control allows to regulate force to achieve a certain speed target. + + .. attribute:: force + + The force applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalForce + + A flag specifying if the force is local. + + :type: boolean + + .. attribute:: torque + + The torque applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalTorque + + A flag specifying if the torque is local. + + :type: boolean + + .. attribute:: dLoc + + The displacement vector applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalDLoc + + A flag specifying if the dLoc is local. + + :type: boolean + + .. attribute:: dRot + + The angular displacement vector applied by the actuator + + :type: list [x, y, z] + + .. note:: + + Since the displacement is applied every frame, you must adjust the displacement based on the frame rate, or you game experience will depend on the player's computer speed. + + .. attribute:: useLocalDRot + + A flag specifying if the dRot is local. + + :type: boolean + + .. attribute:: linV + + The linear velocity applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalLinV + + A flag specifying if the linear velocity is local. + + :type: boolean + + .. note:: + + This is the target speed for servo controllers. + + .. attribute:: angV + + The angular velocity applied by the actuator. + + :type: list [x, y, z] + + .. attribute:: useLocalAngV + + A flag specifying if the angular velocity is local. + + :type: boolean + + .. attribute:: damping + + The damping parameter of the servo controller. + + :type: short + + .. attribute:: forceLimitX + + The min/max force limit along the X axis and activates or deactivates the limits in the servo controller. + + :type: list [min(float), max(float), bool] + + .. attribute:: forceLimitY + + The min/max force limit along the Y axis and activates or deactivates the limits in the servo controller. + + :type: list [min(float), max(float), bool] + + .. attribute:: forceLimitZ + + The min/max force limit along the Z axis and activates or deactivates the limits in the servo controller. + + :type: list [min(float), max(float), bool] + + .. attribute:: pid + + The PID coefficients of the servo controller. + + :type: list of floats [proportional, integral, derivate] + + .. attribute:: reference + + The object that is used as reference to compute the velocity for the servo controller. + + :type: :class:`KX_GameObject` or None + +.. class:: KX_ParentActuator(SCA_IActuator) + + The parent actuator can set or remove an objects parent object. + + .. attribute:: object + + the object this actuator sets the parent too. + + :type: :class:`KX_GameObject` or None + + .. attribute:: mode + + The mode of this actuator. + + :type: integer from 0 to 1. + + .. attribute:: compound + + Whether the object shape should be added to the parent compound shape when parenting. + + Effective only if the parent is already a compound shape. + + :type: boolean + + .. attribute:: ghost + + Whether the object should be made ghost when parenting + Effective only if the shape is not added to the parent compound shape. + + :type: boolean + +.. class:: KX_PhysicsObjectWrapper(PyObjectPlus) + + KX_PhysicsObjectWrapper + + .. method:: setActive(active) + + Set the object to be active. + + :arg active: set to True to be active + :type active: boolean + + .. method:: setAngularVelocity(x, y, z, local) + + Set the angular velocity of the object. + + :arg x: angular velocity for the x-axis + :type x: float + + :arg y: angular velocity for the y-axis + :type y: float + + :arg z: angular velocity for the z-axis + :type z: float + + :arg local: set to True for local axis + :type local: boolean + + .. method:: setLinearVelocity(x, y, z, local) + + Set the linear velocity of the object. + + :arg x: linear velocity for the x-axis + :type x: float + + :arg y: linear velocity for the y-axis + :type y: float + + :arg z: linear velocity for the z-axis + :type z: float + + :arg local: set to True for local axis + :type local: boolean + +.. class:: KX_PolyProxy(SCA_IObject) + + A polygon holds the index of the vertex forming the poylgon. + + Note: + The polygon attributes are read-only, you need to retrieve the vertex proxy if you want + to change the vertex settings. + + .. attribute:: matname + + The name of polygon material, empty if no material. + + :type: string + + .. attribute:: material + + The material of the polygon. + + :type: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial` + + .. attribute:: texture + + The texture name of the polygon. + + :type: string + + .. attribute:: matid + + The material index of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v1 + + vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v2 + + vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v3 + + vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: v4 + + Vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex + Use this to retrieve vertex proxy from mesh proxy. + + :type: integer + + .. attribute:: visible + + visible state of the polygon: 1=visible, 0=invisible. + + :type: integer + + .. attribute:: collide + + collide state of the polygon: 1=receives collision, 0=collision free. + + :type: integer + + .. method:: getMaterialName() + + Returns the polygon material name with MA prefix + + :return: material name + :rtype: string + + .. method:: getMaterial() + + :return: The polygon material + :rtype: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial` + + .. method:: getTextureName() + + :return: The texture name + :rtype: string + + .. method:: getMaterialIndex() + + Returns the material bucket index of the polygon. + This index and the ones returned by getVertexIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`. + + :return: the material index in the mesh + :rtype: integer + + .. method:: getNumVertex() + + Returns the number of vertex of the polygon. + + :return: number of vertex, 3 or 4. + :rtype: integer + + .. method:: isVisible() + + Returns whether the polygon is visible or not + + :return: 0=invisible, 1=visible + :rtype: boolean + + .. method:: isCollider() + + Returns whether the polygon is receives collision or not + + :return: 0=collision free, 1=receives collision + :rtype: integer + + .. method:: getVertexIndex(vertex) + + Returns the mesh vertex index of a polygon vertex + This index and the one returned by getMaterialIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`. + + :arg vertex: index of the vertex in the polygon: 0->3 + :arg vertex: integer + :return: mesh vertex index + :rtype: integer + + .. method:: getMesh() + + Returns a mesh proxy + + :return: mesh proxy + :rtype: :class:`MeshProxy` + +.. class:: KX_PolygonMaterial(PyObjectPlus) + + This is the interface to materials in the game engine. + + Materials define the render state to be applied to mesh objects. + + .. warning:: + + Some of the methods/variables are CObjects. If you mix these up, you will crash blender. + + This example requires `PyOpenGL `_ and `GLEWPy `_ + + .. code-block:: python + + import GameLogic + import OpenGL + from OpenGL.GL import * + from OpenGL.GLU import * + import glew + from glew import * + + glewInit() + + vertex_shader = """ + + void main(void) + { + gl_Position = ftransform(); + } + """ + + fragment_shader =""" + + void main(void) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + """ + + class MyMaterial: + def __init__(self): + self.pass_no = 0 + # Create a shader + self.m_program = glCreateProgramObjectARB() + # Compile the vertex shader + self.shader(GL_VERTEX_SHADER_ARB, (vertex_shader)) + # Compile the fragment shader + self.shader(GL_FRAGMENT_SHADER_ARB, (fragment_shader)) + # Link the shaders together + self.link() + + def PrintInfoLog(self, tag, object): + """ + PrintInfoLog prints the GLSL compiler log + """ + print "Tag: def PrintGLError(self, tag = ""): + + def PrintGLError(self, tag = ""): + """ + Prints the current GL error status + """ + if len(tag): + print tag + err = glGetError() + if err != GL_NO_ERROR: + print "GL Error: %s\\n"%(gluErrorString(err)) + + def shader(self, type, shaders): + """ + shader compiles a GLSL shader and attaches it to the current + program. + + type should be either GL_VERTEX_SHADER_ARB or GL_FRAGMENT_SHADER_ARB + shaders should be a sequence of shader source to compile. + """ + # Create a shader object + shader_object = glCreateShaderObjectARB(type) + + # Add the source code + glShaderSourceARB(shader_object, len(shaders), shaders) + + # Compile the shader + glCompileShaderARB(shader_object) + + # Print the compiler log + self.PrintInfoLog("vertex shader", shader_object) + + # Check if compiled, and attach if it did + compiled = glGetObjectParameterivARB(shader_object, GL_OBJECT_COMPILE_STATUS_ARB) + if compiled: + glAttachObjectARB(self.m_program, shader_object) + + # Delete the object (glAttachObjectARB makes a copy) + glDeleteObjectARB(shader_object) + + # print the gl error log + self.PrintGLError() + + def link(self): + """ + Links the shaders together. + """ + # clear error indicator + glGetError() + + glLinkProgramARB(self.m_program) + + self.PrintInfoLog("link", self.m_program) + + linked = glGetObjectParameterivARB(self.m_program, GL_OBJECT_LINK_STATUS_ARB) + if not linked: + print "Shader failed to link" + return + + glValidateProgramARB(self.m_program) + valid = glGetObjectParameterivARB(self.m_program, GL_OBJECT_VALIDATE_STATUS_ARB) + if not valid: + print "Shader failed to validate" + return + + def activate(self, rasty, cachingInfo, mat): + self.pass_no+=1 + if (self.pass_no == 1): + glDisable(GL_COLOR_MATERIAL) + glUseProgramObjectARB(self.m_program) + return True + + glEnable(GL_COLOR_MATERIAL) + glUseProgramObjectARB(0) + self.pass_no = 0 + return False + + obj = GameLogic.getCurrentController().owner + + mesh = obj.meshes[0] + + for mat in mesh.materials: + mat.setCustomMaterial(MyMaterial()) + print mat.texture + + .. attribute:: texture + + Texture name. + + :type: string (read-only) + + .. attribute:: gl_texture + + OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture). + + :type: integer (read-only) + + .. attribute:: material + + Material name. + + :type: string (read-only) + + .. attribute:: tface + + Texture face properties. + + :type: CObject (read-only) + + .. attribute:: tile + + Texture is tiling. + + :type: boolean + + .. attribute:: tilexrep + + Number of tile repetitions in x direction. + + :type: integer + + .. attribute:: tileyrep + + Number of tile repetitions in y direction. + + :type: integer + + .. attribute:: drawingmode + + Drawing mode for the material. + - 2 (drawingmode & 4) Textured + - 4 (drawingmode & 16) Light + - 14 (drawingmode & 16384) 3d Polygon Text. + + :type: bitfield + + .. attribute:: transparent + + This material is transparent. All meshes with this + material will be rendered after non transparent meshes from back + to front. + + :type: boolean + + .. attribute:: zsort + + Transparent polygons in meshes with this material will be sorted back to + front before rendering. + Non-Transparent polygons will be sorted front to back before rendering. + + :type: boolean + + .. attribute:: lightlayer + + Light layers this material affects. + + :type: bitfield. + + .. attribute:: triangle + + Mesh data with this material is triangles. It's probably not safe to change this. + + :type: boolean + + .. attribute:: diffuse + + The diffuse colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0]. + + :type: list [r, g, b] + + .. attribute:: specular + + The specular colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0]. + + :type: list [r, g, b] + + .. attribute:: shininess + + The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0. + + :type: float + + .. attribute:: specularity + + The amount of specular of the material. 0.0 <= specularity <= 1.0. + + :type: float + + .. method:: updateTexture(tface, rasty) + + Updates a realtime animation. + + :arg tface: Texture face (eg mat.tface) + :type tface: CObject + :arg rasty: Rasterizer + :type rasty: CObject + + .. method:: setTexture(tface) + + Sets texture render state. + + :arg tface: Texture face + :type tface: CObject + + .. code-block:: python + + mat.setTexture(mat.tface) + + .. method:: activate(rasty, cachingInfo) + + Sets material parameters for this object for rendering. + + Material Parameters set: + + #. Texture + #. Backface culling + #. Line drawing + #. Specular Colour + #. Shininess + #. Diffuse Colour + #. Polygon Offset. + + :arg rasty: Rasterizer instance. + :type rasty: CObject + :arg cachingInfo: Material cache instance. + :type cachingInfo: CObject + + .. method:: setCustomMaterial(material) + + Sets the material state setup object. + + Using this method, you can extend or completely replace the gameengine material + to do your own advanced multipass effects. + + Use this method to register your material class. Instead of the normal material, + your class's activate method will be called just before rendering the mesh. + This should setup the texture, material, and any other state you would like. + It should return True to render the mesh, or False if you are finished. You should + clean up any state Blender does not set before returning False. + + Activate Method Definition: + + .. code-block:: python + + def activate(self, rasty, cachingInfo, material): + + :arg material: The material object. + :type material: instance + + .. code-block:: python + + class PyMaterial: + def __init__(self): + self.pass_no = -1 + + def activate(self, rasty, cachingInfo, material): + # Activate the material here. + # + # The activate method will be called until it returns False. + # Every time the activate method returns True the mesh will + # be rendered. + # + # rasty is a CObject for passing to material.updateTexture() + # and material.activate() + # cachingInfo is a CObject for passing to material.activate() + # material is the KX_PolygonMaterial instance this material + # was added to + + # default material properties: + self.pass_no += 1 + if self.pass_no == 0: + material.activate(rasty, cachingInfo) + # Return True to do this pass + return True + + # clean up and return False to finish. + self.pass_no = -1 + return False + + # Create a new Python Material and pass it to the renderer. + mat.setCustomMaterial(PyMaterial()) + +.. class:: KX_RadarSensor(KX_NearSensor) + + Radar sensor is a near sensor with a conical sensor object. + + .. attribute:: coneOrigin + + The origin of the cone with which to test. The origin is in the middle of the cone. (read-only). + + :type: list of floats [x, y, z] + + .. attribute:: coneTarget + + The center of the bottom face of the cone with which to test. (read-only). + + :type: list of floats [x, y, z] + + .. attribute:: distance + + The height of the cone with which to test. + + :type: float + + .. attribute:: angle + + The angle of the cone (in degrees) with which to test. + + :type: float from 0 to 360 + + .. attribute:: axis + + The axis on which the radar cone is cast. + + :type: integer from 0 to 5 + + KX_RADAR_AXIS_POS_X, KX_RADAR_AXIS_POS_Y, KX_RADAR_AXIS_POS_Z, + KX_RADAR_AXIS_NEG_X, KX_RADAR_AXIS_NEG_Y, KX_RADAR_AXIS_NEG_Z + + .. method:: getConeHeight() + + :return: The height of the cone with which to test. + :rtype: float + +.. class:: KX_RaySensor(SCA_ISensor) + + A ray sensor detects the first object in a given direction. + + .. attribute:: propName + + The property the ray is looking for. + + :type: string + + .. attribute:: range + + The distance of the ray. + + :type: float + + .. attribute:: useMaterial + + Whether or not to look for a material (false = property). + + :type: boolean + + .. attribute:: useXRay + + Whether or not to use XRay. + + :type: boolean + + .. attribute:: hitObject + + The game object that was hit by the ray. (read-only). + + :type: :class:`KX_GameObject` + + .. attribute:: hitPosition + + The position (in worldcoordinates) where the object was hit by the ray. (read-only). + + :type: list [x, y, z] + + .. attribute:: hitNormal + + The normal (in worldcoordinates) of the object at the location where the object was hit by the ray. (read-only). + + :type: list [x, y, z] + + .. attribute:: rayDirection + + The direction from the ray (in worldcoordinates). (read-only). + + :type: list [x, y, z] + + .. attribute:: axis + + The axis the ray is pointing on. + + :type: integer from 0 to 5 + + * KX_RAY_AXIS_POS_X + * KX_RAY_AXIS_POS_Y + * KX_RAY_AXIS_POS_Z + * KX_RAY_AXIS_NEG_X + * KX_RAY_AXIS_NEG_Y + * KX_RAY_AXIS_NEG_Z + +.. class:: KX_SCA_AddObjectActuator(SCA_IActuator) + + Edit Object Actuator (in Add Object Mode) + + .. warning:: + + An Add Object actuator will be ignored if at game start, the linked object doesn't exist (or is empty) or the linked object is in an active layer. + + .. code-block:: none + + Error: GameObject 'Name' has a AddObjectActuator 'ActuatorName' without object (in 'nonactive' layer) + + .. attribute:: object + + the object this actuator adds. + + :type: :class:`KX_GameObject` or None + + .. attribute:: objectLastCreated + + the last added object from this actuator (read-only). + + :type: :class:`KX_GameObject` or None + + .. attribute:: time + + the lifetime of added objects, in frames. Set to 0 to disable automatic deletion. + + :type: integer + + .. attribute:: linearVelocity + + the initial linear velocity of added objects. + + :type: list [vx, vy, vz] + + .. attribute:: angularVelocity + + the initial angular velocity of added objects. + + :type: list [vx, vy, vz] + + .. method:: instantAddObject() + + :return: The last object created by this actuator. The object can then be accessed from :data:`objectLastCreated`. + :rtype: None + +.. class:: KX_SCA_DynamicActuator(SCA_IActuator) + + Dynamic Actuator. + + .. attribute:: mode + + :type: integer + + the type of operation of the actuator, 0-4 + + * KX_DYN_RESTORE_DYNAMICS(0) + * KX_DYN_DISABLE_DYNAMICS(1) + * KX_DYN_ENABLE_RIGID_BODY(2) + * KX_DYN_DISABLE_RIGID_BODY(3) + * KX_DYN_SET_MASS(4) + + .. attribute:: mass + + the mass value for the KX_DYN_SET_MASS operation. + + :type: float + +.. class:: KX_SCA_EndObjectActuator(SCA_IActuator) + + Edit Object Actuator (in End Object mode) + + This actuator has no python methods. + +.. class:: KX_SCA_ReplaceMeshActuator(SCA_IActuator) + + Edit Object actuator, in Replace Mesh mode. + + .. warning:: + + Replace mesh actuators will be ignored if at game start, the named mesh doesn't exist. + + This will generate a warning in the console + + .. code-block:: none + + Error: GameObject 'Name' ReplaceMeshActuator 'ActuatorName' without object + + .. code-block:: python + + # Level-of-detail + # Switch a game object's mesh based on its depth in the camera view. + # +----------+ +-----------+ +-------------------------------------+ + # | Always +-----+ Python +-----+ Edit Object (Replace Mesh) LOD.Mesh | + # +----------+ +-----------+ +-------------------------------------+ + import GameLogic + + # List detail meshes here + # Mesh (name, near, far) + # Meshes overlap so that they don't 'pop' when on the edge of the distance. + meshes = ((".Hi", 0.0, -20.0), + (".Med", -15.0, -50.0), + (".Lo", -40.0, -100.0) + ) + + co = GameLogic.getCurrentController() + obj = co.owner + act = co.actuators["LOD." + obj.name] + cam = GameLogic.getCurrentScene().active_camera + + def Depth(pos, plane): + return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3] + + # Depth is negative and decreasing further from the camera + depth = Depth(obj.position, cam.world_to_camera[2]) + + newmesh = None + curmesh = None + # Find the lowest detail mesh for depth + for mesh in meshes: + if depth < mesh[1] and depth > mesh[2]: + newmesh = mesh + if "ME" + obj.name + mesh[0] == act.getMesh(): + curmesh = mesh + + if newmesh != None and "ME" + obj.name + newmesh[0] != act.getMesh(): + # The mesh is a different mesh - switch it. + # Check the current mesh is not a better fit. + if curmesh == None or curmesh[1] < depth or curmesh[2] > depth: + act.mesh = obj.getName() + newmesh[0] + GameLogic.addActiveActuator(act, True) + + .. attribute:: mesh + + :class:`MeshProxy` or the name of the mesh that will replace the current one. + + Set to None to disable actuator. + + :type: :class:`MeshProxy` or None if no mesh is set + + .. attribute:: useDisplayMesh + + when true the displayed mesh is replaced. + + :type: boolean + + .. attribute:: usePhysicsMesh + + when true the physics mesh is replaced. + + :type: boolean + + .. method:: instantReplaceMesh() + + Immediately replace mesh without delay. + +.. class:: KX_Scene(PyObjectPlus) + + An active scene that gives access to objects, cameras, lights and scene attributes. + + The activity culling stuff is supposed to disable logic bricks when their owner gets too far + from the active camera. It was taken from some code lurking at the back of KX_Scene - who knows + what it does! + + .. code-block:: python + + import GameLogic + + # get the scene + scene = GameLogic.getCurrentScene() + + # print all the objects in the scene + for obj in scene.objects: + print obj.name + + # get an object named 'Cube' + obj = scene.objects["Cube"] + + # get the first object in the scene. + obj = scene.objects[0] + + .. code-block:: python + + # Get the depth of an object in the camera view. + import GameLogic + + obj = GameLogic.getCurrentController().owner + cam = GameLogic.getCurrentScene().active_camera + + # Depth is negative and decreasing further from the camera + depth = obj.position[0]*cam.world_to_camera[2][0] + obj.position[1]*cam.world_to_camera[2][1] + obj.position[2]*cam.world_to_camera[2][2] + cam.world_to_camera[2][3] + + @bug: All attributes are read only at the moment. + + .. attribute:: name + + The scene's name, (read-only). + + :type: string + + .. attribute:: objects + + A list of objects in the scene, (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject` + + .. attribute:: objectsInactive + + A list of objects on background layers (used for the addObject actuator), (read-only). + + :type: :class:`CListValue` of :class:`KX_GameObject` + + .. attribute:: lights + + A list of lights in the scene, (read-only). + + :type: :class:`CListValue` of :class:`KX_LightObject` + + .. attribute:: cameras + + A list of cameras in the scene, (read-only). + + :type: :class:`CListValue` of :class:`KX_Camera` + + .. attribute:: active_camera + + The current active camera. + + :type: :class:`KX_Camera` + + .. note:: + + This can be set directly from python to avoid using the :class:`KX_SceneActuator`. + + .. attribute:: suspended + + True if the scene is suspended, (read-only). + + :type: boolean + + .. attribute:: activity_culling + + True if the scene is activity culling. + + :type: boolean + + .. attribute:: activity_culling_radius + + The distance outside which to do activity culling. Measured in manhattan distance. + + :type: float + + .. attribute:: dbvt_culling + + True when Dynamic Bounding box Volume Tree is set (read-only). + + :type: boolean + + .. attribute:: pre_draw + + A list of callables to be run before the render step. + + :type: list + + .. attribute:: post_draw + + A list of callables to be run after the render step. + + :type: list + + .. method:: addObject(object, other, time=0) + + Adds an object to the scene like the Add Object Actuator would. + + :arg object: The object to add + :type object: :class:`KX_GameObject` or string + :arg other: The object's center to use when adding the object + :type other: :class:`KX_GameObject` or string + :arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever. + :type time: integer + :return: The newly added object. + :rtype: :class:`KX_GameObject` + + .. method:: end() + + Removes the scene from the game. + + .. method:: restart() + + Restarts the scene. + + .. method:: replace(scene) + + Replaces this scene with another one. + + :arg scene: The name of the scene to replace this scene with. + :type scene: string + + .. method:: suspend() + + Suspends this scene. + + .. method:: resume() + + Resume this scene. + + .. method:: get(key, default=None) + + Return the value matching key, or the default value if its not found. + :return: The key value or a default. + +.. class:: KX_SceneActuator(SCA_IActuator) + + Scene Actuator logic brick. + + .. warning:: + + Scene actuators that use a scene name will be ignored if at game start, the named scene doesn't exist or is empty + + This will generate a warning in the console: + + .. code-block:: none + + Error: GameObject 'Name' has a SceneActuator 'ActuatorName' (SetScene) without scene + + .. attribute:: scene + + the name of the scene to change to/overlay/underlay/remove/suspend/resume. + + :type: string + + .. attribute:: camera + + the camera to change to. + + :type: :class:`KX_Camera` on read, string or :class:`KX_Camera` on write + + .. note:: + + When setting the attribute, you can use either a :class:`KX_Camera` or the name of the camera. + + .. attribute:: useRestart + + Set flag to True to restart the sene. + + :type: boolean + + .. attribute:: mode + + The mode of the actuator. + + :type: integer from 0 to 5. + +.. class:: KX_SoundActuator(SCA_IActuator) + + Sound Actuator. + + The :data:`startSound`, :data:`pauseSound` and :data:`stopSound` do not requirethe actuator to be activated - they act instantly provided that the actuator has been activated once at least. + + .. attribute:: fileName + + The filename of the sound this actuator plays. + + :type: string + + .. attribute:: volume + + The volume (gain) of the sound. + + :type: float + + .. attribute:: pitch + + The pitch of the sound. + + :type: float + + .. attribute:: rollOffFactor + + The roll off factor. Rolloff defines the rate of attenuation as the sound gets further away. + + :type: float + + .. attribute:: looping + + The loop mode of the actuator. + + :type: integer + + .. attribute:: position + + The position of the sound as a list: [x, y, z]. + + :type: float array + + .. attribute:: velocity + + The velocity of the emitter as a list: [x, y, z]. The relative velocity to the observer determines the pitch. List of 3 floats: [x, y, z]. + + :type: float array + + .. attribute:: orientation + + The orientation of the sound. When setting the orientation you can also use quaternion [float, float, float, float] or euler angles [float, float, float]. + + :type: 3x3 matrix [[float]] + + .. attribute:: mode + + The operation mode of the actuator. Can be one of :ref:`these constants` + + :type: integer + +.. class:: KX_StateActuator(SCA_IActuator) + + State actuator changes the state mask of parent object. + + .. attribute:: operation + + Type of bit operation to be applied on object state mask. + + You can use one of :ref:`these constants ` + + :type: integer + + .. attribute:: mask + + Value that defines the bits that will be modified by the operation. + + The bits that are 1 in the mask will be updated in the object state. + + The bits that are 0 are will be left unmodified expect for the Copy operation which copies the mask to the object state. + + :type: integer + +.. class:: KX_TrackToActuator(SCA_IActuator) + + Edit Object actuator in Track To mode. + + .. warning:: + + Track To Actuators will be ignored if at game start, the object to track to is invalid. + + This will generate a warning in the console: + + .. code-block:: none + + GameObject 'Name' no object in EditObjectActuator 'ActuatorName' + + .. attribute:: object + + the object this actuator tracks. + + :type: :class:`KX_GameObject` or None + + .. attribute:: time + + the time in frames with which to delay the tracking motion. + + :type: integer + + .. attribute:: use3D + + the tracking motion to use 3D. + + :type: boolean + +.. class:: KX_VehicleWrapper(PyObjectPlus) + + KX_VehicleWrapper + + TODO - description + + .. method:: addWheel(wheel, attachPos, attachDir, axleDir, suspensionRestLength, wheelRadius, hasSteering) + + Add a wheel to the vehicle + + :arg wheel: The object to use as a wheel. + :type wheel: :class:`KX_GameObject` or a KX_GameObject name + :arg attachPos: The position that this wheel will attach to. + :type attachPos: vector of 3 floats + :arg attachDir: The direction this wheel points. + :type attachDir: vector of 3 floats + :arg axleDir: The direction of this wheels axle. + :type axleDir: vector of 3 floats + :arg suspensionRestLength: TODO - Description + :type suspensionRestLength: float + :arg wheelRadius: The size of the wheel. + :type wheelRadius: float + + .. method:: applyBraking(force, wheelIndex) + + Apply a braking force to the specified wheel + + :arg force: the brake force + :type force: float + + :arg wheelIndex: index of the wheel where the force needs to be applied + :type wheelIndex: integer + + .. method:: applyEngineForce(force, wheelIndex) + + Apply an engine force to the specified wheel + + :arg force: the engine force + :type force: float + + :arg wheelIndex: index of the wheel where the force needs to be applied + :type wheelIndex: integer + + .. method:: getConstraintId() + + Get the constraint ID + + :return: the constraint id + :rtype: integer + + .. method:: getConstraintType() + + Returns the constraint type. + + :return: constraint type + :rtype: integer + + .. method:: getNumWheels() + + Returns the number of wheels. + + :return: the number of wheels for this vehicle + :rtype: integer + + .. method:: getWheelOrientationQuaternion(wheelIndex) + + Returns the wheel orientation as a quaternion. + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + :return: TODO Description + :rtype: TODO - type should be quat as per method name but from the code it looks like a matrix + + .. method:: getWheelPosition(wheelIndex) + + Returns the position of the specified wheel + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + :return: position vector + :rtype: list[x, y, z] + + .. method:: getWheelRotation(wheelIndex) + + Returns the rotation of the specified wheel + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + :return: the wheel rotation + :rtype: float + + .. method:: setRollInfluence(rollInfluece, wheelIndex) + + Set the specified wheel's roll influence. + The higher the roll influence the more the vehicle will tend to roll over in corners. + + :arg rollInfluece: the wheel roll influence + :type rollInfluece: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSteeringValue(steering, wheelIndex) + + Set the specified wheel's steering + + :arg steering: the wheel steering + :type steering: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSuspensionCompression(compression, wheelIndex) + + Set the specified wheel's compression + + :arg compression: the wheel compression + :type compression: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSuspensionDamping(damping, wheelIndex) + + Set the specified wheel's damping + + :arg damping: the wheel damping + :type damping: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setSuspensionStiffness(stiffness, wheelIndex) + + Set the specified wheel's stiffness + + :arg stiffness: the wheel stiffness + :type stiffness: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + + .. method:: setTyreFriction(friction, wheelIndex) + + Set the specified wheel's tyre friction + + :arg friction: the tyre friction + :type friction: float + + :arg wheelIndex: the wheel index + :type wheelIndex: integer + +.. class:: KX_VertexProxy(SCA_IObject) + + A vertex holds position, UV, colour and normal information. + + Note: + The physics simulation is NOT currently updated - physics will not respond + to changes in the vertex position. + + .. attribute:: XYZ + + The position of the vertex. + + :type: list [x, y, z] + + .. attribute:: UV + + The texture coordinates of the vertex. + + :type: list [u, v] + + .. attribute:: normal + + The normal of the vertex. + + :type: list [nx, ny, nz] + + .. attribute:: colour + + The colour of the vertex. + + :type: list [r, g, b, a] + + Black = [0.0, 0.0, 0.0, 1.0], White = [1.0, 1.0, 1.0, 1.0] + + .. attribute:: color + + Synonym for colour. + + .. attribute:: x + + The x coordinate of the vertex. + + :type: float + + .. attribute:: y + + The y coordinate of the vertex. + + :type: float + + .. attribute:: z + + The z coordinate of the vertex. + + :type: float + + .. attribute:: u + + The u texture coordinate of the vertex. + + :type: float + + .. attribute:: v + + The v texture coordinate of the vertex. + + :type: float + + .. attribute:: u2 + + The second u texture coordinate of the vertex. + + :type: float + + .. attribute:: v2 + + The second v texture coordinate of the vertex. + + :type: float + + .. attribute:: r + + The red component of the vertex colour. 0.0 <= r <= 1.0. + + :type: float + + .. attribute:: g + + The green component of the vertex colour. 0.0 <= g <= 1.0. + + :type: float + + .. attribute:: b + + The blue component of the vertex colour. 0.0 <= b <= 1.0. + + :type: float + + .. attribute:: a + + The alpha component of the vertex colour. 0.0 <= a <= 1.0. + + :type: float + + .. method:: getXYZ() + + Gets the position of this vertex. + + :return: this vertexes position in local coordinates. + :rtype: list [x, y, z] + + .. method:: setXYZ(pos) + + Sets the position of this vertex. + + :type: list [x, y, z] + + :arg pos: the new position for this vertex in local coordinates. + + .. method:: getUV() + + Gets the UV (texture) coordinates of this vertex. + + :return: this vertexes UV (texture) coordinates. + :rtype: list [u, v] + + .. method:: setUV(uv) + + Sets the UV (texture) coordinates of this vertex. + + :type: list [u, v] + + .. method:: getUV2() + + Gets the 2nd UV (texture) coordinates of this vertex. + + :return: this vertexes UV (texture) coordinates. + :rtype: list [u, v] + + .. method:: setUV2(uv, unit) + + Sets the 2nd UV (texture) coordinates of this vertex. + + :type: list [u, v] + + :arg unit: optional argument, FLAT==1, SECOND_UV==2, defaults to SECOND_UV + :arg unit: integer + + .. method:: getRGBA() + + Gets the colour of this vertex. + + The colour is represented as four bytes packed into an integer value. The colour is + packed as RGBA. + + Since Python offers no way to get each byte without shifting, you must use the struct module to + access colour in an machine independent way. + + Because of this, it is suggested you use the r, g, b and a attributes or the colour attribute instead. + + .. code-block:: python + + import struct; + col = struct.unpack('4B', struct.pack('I', v.getRGBA())) + # col = (r, g, b, a) + # black = ( 0, 0, 0, 255) + # white = (255, 255, 255, 255) + + :return: packed colour. 4 byte integer with one byte per colour channel in RGBA format. + :rtype: integer + + .. method:: setRGBA(col) + + Sets the colour of this vertex. + + See getRGBA() for the format of col, and its relevant problems. Use the r, g, b and a attributes + or the colour attribute instead. + + setRGBA() also accepts a four component list as argument col. The list represents the colour as [r, g, b, a] + with black = [0.0, 0.0, 0.0, 1.0] and white = [1.0, 1.0, 1.0, 1.0] + + .. code-block:: python + + v.setRGBA(0xff0000ff) # Red + v.setRGBA(0xff00ff00) # Green on little endian, transparent purple on big endian + v.setRGBA([1.0, 0.0, 0.0, 1.0]) # Red + v.setRGBA([0.0, 1.0, 0.0, 1.0]) # Green on all platforms. + + :arg col: the new colour of this vertex in packed RGBA format. + :type col: integer or list [r, g, b, a] + + .. method:: getNormal() + + Gets the normal vector of this vertex. + + :return: normalised normal vector. + :rtype: list [nx, ny, nz] + + .. method:: setNormal(normal) + + Sets the normal vector of this vertex. + + :type: sequence of floats [r, g, b] + + :arg normal: the new normal of this vertex. + +.. class:: KX_VisibilityActuator(SCA_IActuator) + + Visibility Actuator. + + .. attribute:: visibility + + whether the actuator makes its parent object visible or invisible. + + :type: boolean + + .. attribute:: useOcclusion + + whether the actuator makes its parent object an occluder or not. + + :type: boolean + + .. attribute:: useRecursion + + whether the visibility/occlusion should be propagated to all children of the object. + + :type: boolean + +.. class:: SCA_2DFilterActuator(SCA_IActuator) + + Create, enable and disable 2D filters + + The following properties don't have an immediate effect. + You must active the actuator to get the result. + The actuator is not persistent: it automatically stops itself after setting up the filter + but the filter remains active. To stop a filter you must activate the actuator with 'type' + set to :data:`~bge.logic.RAS_2DFILTER_DISABLED` or :data:`~bge.logic.RAS_2DFILTER_NOFILTER`. + + .. attribute:: shaderText + + shader source code for custom shader. + + :type: string + + .. attribute:: disableMotionBlur + + action on motion blur: 0=enable, 1=disable. + + :type: integer + + .. attribute:: mode + + Type of 2D filter, use one of :ref:`these constants ` + + :type: integer + + .. attribute:: passNumber + + order number of filter in the stack of 2D filters. Filters are executed in increasing order of passNb. + + Only be one filter can be defined per passNb. + + :type: integer (0-100) + + .. attribute:: value + + argument for motion blur filter. + + :type: float (0.0-100.0) + +.. class:: SCA_ANDController(SCA_IController) + + An AND controller activates only when all linked sensors are activated. + + There are no special python methods for this controller. + +.. class:: SCA_ActuatorSensor(SCA_ISensor) + + Actuator sensor detect change in actuator state of the parent object. + It generates a positive pulse if the corresponding actuator is activated + and a negative pulse if the actuator is deactivated. + + .. attribute:: actuator + + the name of the actuator that the sensor is monitoring. + + :type: string + +.. class:: SCA_AlwaysSensor(SCA_ISensor) + + This sensor is always activated. + +.. class:: SCA_DelaySensor(SCA_ISensor) + + The Delay sensor generates positive and negative triggers at precise time, + expressed in number of frames. The delay parameter defines the length of the initial OFF period. A positive trigger is generated at the end of this period. + + The duration parameter defines the length of the ON period following the OFF period. + There is a negative trigger at the end of the ON period. If duration is 0, the sensor stays ON and there is no negative trigger. + + The sensor runs the OFF-ON cycle once unless the repeat option is set: the OFF-ON cycle repeats indefinately (or the OFF cycle if duration is 0). + + Use :class:`SCA_ISensor.reset` at any time to restart sensor. + + .. attribute:: delay + + length of the initial OFF period as number of frame, 0 for immediate trigger. + + :type: integer. + + .. attribute:: duration + + length of the ON period in number of frame after the initial OFF period. + + If duration is greater than 0, a negative trigger is sent at the end of the ON pulse. + + :type: integer + + .. attribute:: repeat + + 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once. + + :type: integer + +.. class:: SCA_JoystickSensor(SCA_ISensor) + + This sensor detects player joystick events. + + .. attribute:: axisValues + + The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only). + + :type: list of ints. + + Each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. + The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. + + * left:[-32767, 0, ...] + * right:[32767, 0, ...] + * up:[0, -32767, ...] + * down:[0, 32767, ...] + + .. attribute:: axisSingle + + like :data:`axisValues` but returns a single axis value that is set by the sensor. (read-only). + + :type: integer + + .. note:: + + Only use this for "Single Axis" type sensors otherwise it will raise an error. + + .. attribute:: hatValues + + The state of the joysticks hats as a list of values :data:`numHats` long. (read-only). + + :type: list of ints + + Each spesifying the direction of the hat from 1 to 12, 0 when inactive. + + Hat directions are as follows... + + * 0:None + * 1:Up + * 2:Right + * 4:Down + * 8:Left + * 3:Up - Right + * 6:Down - Right + * 12:Down - Left + * 9:Up - Left + + .. attribute:: hatSingle + + Like :data:`hatValues` but returns a single hat direction value that is set by the sensor. (read-only). + + :type: integer + + .. attribute:: numAxis + + The number of axes for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numButtons + + The number of buttons for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numHats + + The number of hats for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: connected + + True if a joystick is connected at this joysticks index. (read-only). + + :type: boolean + + .. attribute:: index + + The joystick index to use (from 0 to 7). The first joystick is always 0. + + :type: integer + + .. attribute:: threshold + + Axis threshold. Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive. + + :type: integer + + .. attribute:: button + + The button index the sensor reacts to (first button = 0). When the "All Events" toggle is set, this option has no effect. + + :type: integer + + .. attribute:: axis + + The axis this sensor reacts to, as a list of two values [axisIndex, axisDirection] + + * axisIndex: the axis index to use when detecting axis movement, 1=primary directional control, 2=secondary directional control. + * axisDirection: 0=right, 1=up, 2=left, 3=down. + + :type: [integer, integer] + + .. attribute:: hat + + The hat the sensor reacts to, as a list of two values: [hatIndex, hatDirection] + + * hatIndex: the hat index to use when detecting hat movement, 1=primary hat, 2=secondary hat (4 max). + * hatDirection: 1-12. + + :type: [integer, integer] + + .. method:: getButtonActiveList() + + :return: A list containing the indicies of the currently pressed buttons. + :rtype: list + + .. method:: getButtonStatus(buttonIndex) + + :arg buttonIndex: the button index, 0=first button + :type buttonIndex: integer + :return: The current pressed state of the specified button. + :rtype: boolean + +.. class:: SCA_KeyboardSensor(SCA_ISensor) + + A keyboard sensor detects player key presses. + + See module :mod:`bge.keys` for keycode values. + + .. attribute:: key + + The key code this sensor is looking for. + + :type: keycode from :mod:`bge.keys` module + + .. attribute:: hold1 + + The key code for the first modifier this sensor is looking for. + + :type: keycode from :mod:`bge.keys` module + + .. attribute:: hold2 + + The key code for the second modifier this sensor is looking for. + + :type: keycode from :mod:`bge.keys` module + + .. attribute:: toggleProperty + + The name of the property that indicates whether or not to log keystrokes as a string. + + :type: string + + .. attribute:: targetProperty + + The name of the property that receives keystrokes in case in case a string is logged. + + :type: string + + .. attribute:: useAllKeys + + Flag to determine whether or not to accept all keys. + + :type: boolean + + .. attribute:: events + + a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only). + + :type: list [[:ref:`keycode`, :ref:`status`], ...] + + .. method:: getKeyStatus(keycode) + + Get the status of a key. + + :arg keycode: The code that represents the key you want to get the state of, use one of :ref:`these constants` + :type keycode: integer + :return: The state of the given key, can be one of :ref:`these constants` + :rtype: int + +.. class:: SCA_NANDController(SCA_IController) + + An NAND controller activates when all linked sensors are not active. + + There are no special python methods for this controller. + +.. class:: SCA_NORController(SCA_IController) + + An NOR controller activates only when all linked sensors are de-activated. + + There are no special python methods for this controller. + +.. class:: SCA_ORController(SCA_IController) + + An OR controller activates when any connected sensor activates. + + There are no special python methods for this controller. + +.. class:: SCA_PropertyActuator(SCA_IActuator) + + Property Actuator + + .. attribute:: propName + + the property on which to operate. + + :type: string + + .. attribute:: value + + the value with which the actuator operates. + + :type: string + + .. attribute:: mode + + TODO - add constants to game logic dict!. + + :type: integer + +.. class:: SCA_PropertySensor(SCA_ISensor) + + Activates when the game object property matches. + + .. attribute:: mode + + Type of check on the property. Can be one of :ref:`these constants ` + + :type: integer. + + .. attribute:: propName + + the property the sensor operates. + + :type: string + + .. attribute:: value + + the value with which the sensor compares to the value of the property. + + :type: string + + .. attribute:: min + + the minimum value of the range used to evaluate the property when in interval mode. + + :type: string + + .. attribute:: max + + the maximum value of the range used to evaluate the property when in interval mode. + + :type: string + +.. class:: SCA_PythonController(SCA_IController) + + A Python controller uses a Python script to activate it's actuators, + based on it's sensors. + + .. attribute:: script + + The value of this variable depends on the execution methid. + + * When 'Script' execution mode is set this value contains the entire python script as a single string (not the script name as you might expect) which can be modified to run different scripts. + * When 'Module' execution mode is set this value will contain a single line string - module name and function "module.func" or "package.modile.func" where the module names are python textblocks or external scripts. + + :type: string + + .. note:: + + Once this is set the script name given for warnings will remain unchanged. + + .. attribute:: mode + + the execution mode for this controller (read-only). + + * Script: 0, Execite the :data:`script` as a python code. + * Module: 1, Execite the :data:`script` as a module and function. + + :type: integer + + .. method:: activate(actuator) + + Activates an actuator attached to this controller. + + :arg actuator: The actuator to operate on. + :type actuator: actuator or the actuator name as a string + + .. method:: deactivate(actuator) + + Deactivates an actuator attached to this controller. + + :arg actuator: The actuator to operate on. + :type actuator: actuator or the actuator name as a string + +.. class:: SCA_RandomActuator(SCA_IActuator) + + Random Actuator + + .. attribute:: seed + + Seed of the random number generator. + + :type: integer. + + Equal seeds produce equal series. If the seed is 0, the generator will produce the same value on every call. + + .. attribute:: para1 + + the first parameter of the active distribution. + + :type: float, read-only. + + Refer to the documentation of the generator types for the meaning of this value. + + .. attribute:: para2 + + the second parameter of the active distribution. + + :type: float, read-only + + Refer to the documentation of the generator types for the meaning of this value. + + .. attribute:: distribution + + Distribution type. (read-only). Can be one of :ref:`these constants ` + + :type: integer + + .. attribute:: propName + + the name of the property to set with the random value. + + :type: string + + If the generator and property types do not match, the assignment is ignored. + + .. method:: setBoolConst(value) + + Sets this generator to produce a constant boolean value. + + :arg value: The value to return. + :type value: boolean + + .. method:: setBoolUniform() + + Sets this generator to produce a uniform boolean distribution. + + The generator will generate True or False with 50% chance. + + .. method:: setBoolBernouilli(value) + + Sets this generator to produce a Bernouilli distribution. + + :arg value: Specifies the proportion of False values to produce. + + * 0.0: Always generate True + * 1.0: Always generate False + :type value: float + + .. method:: setIntConst(value) + + Sets this generator to always produce the given value. + + :arg value: the value this generator produces. + :type value: integer + + .. method:: setIntUniform(lower_bound, upper_bound) + + Sets this generator to produce a random value between the given lower and + upper bounds (inclusive). + + :type lower_bound: integer + :type upper_bound: integer + + .. method:: setIntPoisson(value) + + Generate a Poisson-distributed number. + + This performs a series of Bernouilli tests with parameter value. + It returns the number of tries needed to achieve succes. + + :type value: float + + .. method:: setFloatConst(value) + + Always generate the given value. + + :type value: float + + .. method:: setFloatUniform(lower_bound, upper_bound) + + Generates a random float between lower_bound and upper_bound with a + uniform distribution. + + :type lower_bound: float + :type upper_bound: float + + .. method:: setFloatNormal(mean, standard_deviation) + + Generates a random float from the given normal distribution. + + :arg mean: The mean (average) value of the generated numbers + :type mean: float + :arg standard_deviation: The standard deviation of the generated numbers. + :type standard_deviation: float + + .. method:: setFloatNegativeExponential(half_life) + + Generate negative-exponentially distributed numbers. + + The half-life 'time' is characterized by half_life. + + :type half_life: float + +.. class:: SCA_RandomSensor(SCA_ISensor) + + This sensor activates randomly. + + .. attribute:: lastDraw + + The seed of the random number generator. + + :type: integer + + .. attribute:: seed + + The seed of the random number generator. + + :type: integer + + .. method:: setSeed(seed) + + Sets the seed of the random number generator. + + If the seed is 0, the generator will produce the same value on every call. + + :type seed: integer + + .. method:: getSeed() + + :return: The initial seed of the generator. Equal seeds produce equal random series. + :rtype: integer + + .. method:: getLastDraw() + + :return: The last random number generated. + :rtype: integer + +.. class:: SCA_XNORController(SCA_IController) + + An XNOR controller activates when all linked sensors are the same (activated or inative). + + There are no special python methods for this controller. + +.. class:: SCA_XORController(SCA_IController) + + An XOR controller activates when there is the input is mixed, but not when all are on or off. + + There are no special python methods for this controller. + +.. class:: KX_Camera(KX_GameObject) + + A Camera object. + + .. data:: INSIDE + + See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` + + .. data:: INTERSECT + + See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` + + .. data:: OUTSIDE + + See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum` + + .. attribute:: lens + + The camera's lens value. + + :type: float + + .. attribute:: ortho_scale + + The camera's view scale when in orthographic mode. + + :type: float + + .. attribute:: near + + The camera's near clip distance. + + :type: float + + .. attribute:: far + + The camera's far clip distance. + + :type: float + + .. attribute:: perspective + + True if this camera has a perspective transform, False for an orthographic projection. + + :type: boolean + + .. attribute:: frustum_culling + + True if this camera is frustum culling. + + :type: boolean + + .. attribute:: projection_matrix + + This camera's 4x4 projection matrix. + + :type: 4x4 Matrix [[float]] + + .. attribute:: modelview_matrix + + This camera's 4x4 model view matrix. (read-only). + + :type: 4x4 Matrix [[float]] + + .. note:: + + This matrix is regenerated every frame from the camera's position and orientation. + + .. attribute:: camera_to_world + + This camera's camera to world transform. (read-only). + + :type: 4x4 Matrix [[float]] + + .. note:: + + This matrix is regenerated every frame from the camera's position and orientation. + + .. attribute:: world_to_camera + + This camera's world to camera transform. (read-only). + + :type: 4x4 Matrix [[float]] + + .. note:: + + Regenerated every frame from the camera's position and orientation. + + .. note:: + + This is camera_to_world inverted. + + .. attribute:: useViewport + + True when the camera is used as a viewport, set True to enable a viewport for this camera. + + :type: boolean + + .. method:: sphereInsideFrustum(centre, radius) + + Tests the given sphere against the view frustum. + + :arg centre: The centre of the sphere (in world coordinates.) + :type centre: list [x, y, z] + :arg radius: the radius of the sphere + :type radius: float + :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT` + :rtype: integer + + .. note:: + + When the camera is first initialized the result will be invalid because the projection matrix has not been set. + + .. code-block:: python + + import GameLogic + co = GameLogic.getCurrentController() + cam = co.owner + + # A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0] + if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE): + # Sphere is inside frustum ! + # Do something useful ! + else: + # Sphere is outside frustum + + .. method:: boxInsideFrustum(box) + + Tests the given box against the view frustum. + + :arg box: Eight (8) corner points of the box (in world coordinates.) + :type box: list of lists + :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT` + + .. note:: + + When the camera is first initialized the result will be invalid because the projection matrix has not been set. + + .. code-block:: python + + import GameLogic + co = GameLogic.getCurrentController() + cam = co.owner + + # Box to test... + box = [] + box.append([-1.0, -1.0, -1.0]) + box.append([-1.0, -1.0, 1.0]) + box.append([-1.0, 1.0, -1.0]) + box.append([-1.0, 1.0, 1.0]) + box.append([ 1.0, -1.0, -1.0]) + box.append([ 1.0, -1.0, 1.0]) + box.append([ 1.0, 1.0, -1.0]) + box.append([ 1.0, 1.0, 1.0]) + + if (cam.boxInsideFrustum(box) != cam.OUTSIDE): + # Box is inside/intersects frustum ! + # Do something useful ! + else: + # Box is outside the frustum ! + + .. method:: pointInsideFrustum(point) + + Tests the given point against the view frustum. + + :arg point: The point to test (in world coordinates.) + :type point: 3D Vector + :return: True if the given point is inside this camera's viewing frustum. + :rtype: boolean + + .. note:: + + When the camera is first initialized the result will be invalid because the projection matrix has not been set. + + .. code-block:: python + + import GameLogic + co = GameLogic.getCurrentController() + cam = co.owner + + # Test point [0.0, 0.0, 0.0] + if (cam.pointInsideFrustum([0.0, 0.0, 0.0])): + # Point is inside frustum ! + # Do something useful ! + else: + # Box is outside the frustum ! + + .. method:: getCameraToWorld() + + Returns the camera-to-world transform. + + :return: the camera-to-world transform matrix. + :rtype: matrix (4x4 list) + + .. method:: getWorldToCamera() + + Returns the world-to-camera transform. + + This returns the inverse matrix of getCameraToWorld(). + + :return: the world-to-camera transform matrix. + :rtype: matrix (4x4 list) + + .. method:: setOnTop() + + Set this cameras viewport ontop of all other viewport. + + .. method:: setViewport(left, bottom, right, top) + + Sets the region of this viewport on the screen in pixels. + + Use :data:`bge.render.getWindowHeight` and :data:`bge.render.getWindowWidth` to calculate values relative to the entire display. + + :arg left: left pixel coordinate of this viewport + :type left: integer + :arg bottom: bottom pixel coordinate of this viewport + :type bottom: integer + :arg right: right pixel coordinate of this viewport + :type right: integer + :arg top: top pixel coordinate of this viewport + :type top: integer + + .. method:: getScreenPosition(object) + + Gets the position of an object projected on screen space. + + .. code-block:: python + + # For an object in the middle of the screen, coord = [0.5, 0.5] + coord = camera.getScreenPosition(object) + + :arg object: object name or list [x, y, z] + :type object: :class:`KX_GameObject` or 3D Vector + :return: the object's position in screen coordinates. + :rtype: list [x, y] + + .. method:: getScreenVect(x, y) + + Gets the vector from the camera position in the screen coordinate direction. + + :arg x: X Axis + :type x: float + :arg y: Y Axis + :type y: float + :rtype: 3D Vector + :return: The vector from screen coordinate. + + .. code-block:: python + + # Gets the vector of the camera front direction: + m_vect = camera.getScreenVect(0.5, 0.5) + + .. method:: getScreenRay(x, y, dist=inf, property=None) + + Look towards a screen coordinate (x, y) and find first object hit within dist that matches prop. + The ray is similar to KX_GameObject->rayCastTo. + + :arg x: X Axis + :type x: float + :arg y: Y Axis + :type y: float + :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other + :type dist: float + :arg property: property name that object must have; can be omitted => detect any object + :type property: string + :rtype: :class:`KX_GameObject` + :return: the first object hit or None if no object or object does not match prop + + .. code-block:: python + + # Gets an object with a property "wall" in front of the camera within a distance of 100: + target = camera.getScreenRay(0.5, 0.5, 100, "wall") + +.. class:: BL_ArmatureObject(KX_GameObject) + + An armature object. + + .. attribute:: constraints + + The list of armature constraint defined on this armature. + Elements of the list can be accessed by index or string. + The key format for string access is ':'. + + :type: list of :class:`BL_ArmatureConstraint` + + .. attribute:: channels + + The list of armature channels. + Elements of the list can be accessed by index or name the bone. + + :type: list of :class:`BL_ArmatureChannel` + + .. method:: update() + + Ensures that the armature will be updated on next graphic frame. + + This action is unecessary if a KX_ArmatureActuator with mode run is active + or if an action is playing. Use this function in other cases. It must be called + on each frame to ensure that the armature is updated continously. + +.. class:: BL_ArmatureActuator(SCA_IActuator) + + Armature Actuators change constraint condition on armatures. + + .. _armatureactuator-constants-type: + + Constants related to :data:`~bge.types.BL_ArmatureActuator.type` + + .. data:: KX_ACT_ARMATURE_RUN + + Just make sure the armature will be updated on the next graphic frame. This is the only persistent mode of the actuator: it executes automatically once per frame until stopped by a controller + + :value: 0 + + .. data:: KX_ACT_ARMATURE_ENABLE + + Enable the constraint. + + :value: 1 + + .. data:: KX_ACT_ARMATURE_DISABLE + + Disable the constraint (runtime constraint values are not updated). + + :value: 2 + + .. data:: KX_ACT_ARMATURE_SETTARGET + + Change target and subtarget of constraint. + + :value: 3 + + .. data:: KX_ACT_ARMATURE_SETWEIGHT + + Change weight of (only for IK constraint). + + :value: 4 + + .. attribute:: type + + The type of action that the actuator executes when it is active. + + Can be one of :ref:`these constants ` + + :type: integer + + .. attribute:: constraint + + The constraint object this actuator is controlling. + + :type: :class:`BL_ArmatureConstraint` + + .. attribute:: target + + The object that this actuator will set as primary target to the constraint it controls. + + :type: :class:`KX_GameObject` + + .. attribute:: subtarget + + The object that this actuator will set as secondary target to the constraint it controls. + + :type: :class:`KX_GameObject`. + + .. note:: + + Currently, the only secondary target is the pole target for IK constraint. + + .. attribute:: weight + + The weight this actuator will set on the constraint it controls. + + :type: float. + + .. note:: + + Currently only the IK constraint has a weight. It must be a value between 0 and 1. + + .. note:: + + A weight of 0 disables a constraint while still updating constraint runtime values (see :class:`BL_ArmatureConstraint`) + +.. class:: KX_ArmatureSensor(SCA_ISensor) + + Armature sensor detect conditions on armatures. + + .. _armaturesensor-type: + + Constants related to :data:`type` + + .. data:: KX_ARMSENSOR_STATE_CHANGED + + Detect that the constraint is changing state (active/inactive) + + :value: 0 + + .. data:: KX_ARMSENSOR_LIN_ERROR_BELOW + + Detect that the constraint linear error is above a threshold + + :value: 1 + + .. data:: KX_ARMSENSOR_LIN_ERROR_ABOVE + + Detect that the constraint linear error is below a threshold + + :value: 2 + + .. data:: KX_ARMSENSOR_ROT_ERROR_BELOW + + Detect that the constraint rotation error is above a threshold + + :value: 3 + + .. data:: KX_ARMSENSOR_ROT_ERROR_ABOVE + + Detect that the constraint rotation error is below a threshold + + :value: 4 + + .. attribute:: type + + The type of measurement that the sensor make when it is active. + + Can be one of :ref:`these constants ` + + :type: integer. + + .. attribute:: constraint + + The constraint object this sensor is watching. + + :type: :class:`BL_ArmatureConstraint` + + .. attribute:: value + + The threshold used in the comparison with the constraint error + The linear error is only updated on CopyPose/Distance IK constraint with iTaSC solver + The rotation error is only updated on CopyPose+rotation IK constraint with iTaSC solver + The linear error on CopyPose is always >= 0: it is the norm of the distance between the target and the bone + The rotation error on CopyPose is always >= 0: it is the norm of the equivalent rotation vector between the bone and the target orientations + The linear error on Distance can be positive if the distance between the bone and the target is greater than the desired distance, and negative if the distance is smaller. + + :type: float + +.. class:: BL_ArmatureConstraint(PyObjectPlus) + + Proxy to Armature Constraint. Allows to change constraint on the fly. + Obtained through :class:`BL_ArmatureObject`.constraints. + + .. note:: + + Not all armature constraints are supported in the GE. + + .. _armatureconstraint-constants-type: + + Constants related to :data:`type` + + .. data:: CONSTRAINT_TYPE_TRACKTO + .. data:: CONSTRAINT_TYPE_KINEMATIC + .. data:: CONSTRAINT_TYPE_ROTLIKE + .. data:: CONSTRAINT_TYPE_LOCLIKE + .. data:: CONSTRAINT_TYPE_MINMAX + .. data:: CONSTRAINT_TYPE_SIZELIKE + .. data:: CONSTRAINT_TYPE_LOCKTRACK + .. data:: CONSTRAINT_TYPE_STRETCHTO + .. data:: CONSTRAINT_TYPE_CLAMPTO + .. data:: CONSTRAINT_TYPE_TRANSFORM + .. data:: CONSTRAINT_TYPE_DISTLIMIT + + .. _armatureconstraint-constants-ik-type: + + Constants related to :data:`ik_type` + + .. data:: CONSTRAINT_IK_COPYPOSE + + constraint is trying to match the position and eventually the rotation of the target. + + :value: 0 + + .. data:: CONSTRAINT_IK_DISTANCE + + Constraint is maintaining a certain distance to target subject to ik_mode + + :value: 1 + + .. _armatureconstraint-constants-ik-flag: + + Constants related to :data:`ik_flag` + + .. data:: CONSTRAINT_IK_FLAG_TIP + + Set when the constraint operates on the head of the bone and not the tail + + :value: 1 + + .. data:: CONSTRAINT_IK_FLAG_ROT + + Set when the constraint tries to match the orientation of the target + + :value: 2 + + .. data:: CONSTRAINT_IK_FLAG_STRETCH + + Set when the armature is allowed to stretch (only the bones with stretch factor > 0.0) + + :value: 16 + + .. data:: CONSTRAINT_IK_FLAG_POS + + Set when the constraint tries to match the position of the target. + + :value: 32 + + .. _armatureconstraint-constants-ik-mode: + + Constants related to :data:`ik_mode` + + .. data:: CONSTRAINT_IK_MODE_INSIDE + + The constraint tries to keep the bone within ik_dist of target + + :value: 0 + + .. data:: CONSTRAINT_IK_MODE_OUTSIDE + + The constraint tries to keep the bone outside ik_dist of the target + + :value: 1 + + .. data:: CONSTRAINT_IK_MODE_ONSURFACE + + The constraint tries to keep the bone exactly at ik_dist of the target. + + :value: 2 + + .. attribute:: type + + Type of constraint, (read-only). + + Use one of :ref:`these constants`. + + :type: integer, one of CONSTRAINT_TYPE_* constants + + .. attribute:: name + + Name of constraint constructed as :. constraints list. + + :type: string + + This name is also the key subscript on :class:`BL_ArmatureObject`. + + .. attribute:: enforce + + fraction of constraint effect that is enforced. Between 0 and 1. + + :type: float + + .. attribute:: headtail + + Position of target between head and tail of the target bone: 0=head, 1=tail. + + :type: float. + + .. note:: + + Only used if the target is a bone (i.e target object is an armature. + + .. attribute:: lin_error + + runtime linear error (in Blender units) on constraint at the current frame. + + This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. + + :type: float + + .. attribute:: rot_error + + Runtime rotation error (in radiant) on constraint at the current frame. + + :type: float. + + This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver. + + It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint. + + .. attribute:: target + + Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint. + + :type: :class:`KX_GameObject`. + + .. attribute:: subtarget + + Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint. + + :type: :class:`KX_GameObject`. + + Currently this is only used for pole target on IK constraint. + + .. attribute:: active + + True if the constraint is active. + + :type: boolean + + .. note:: + + An inactive constraint does not update lin_error and rot_error. + + .. attribute:: ik_weight + + Weight of the IK constraint between 0 and 1. + + Only defined for IK constraint. + + :type: float + + .. attribute:: ik_type + + Type of IK constraint, (read-only). + + Use one of :ref:`these constants`. + + :type: integer. + + .. attribute:: ik_flag + + Combination of IK constraint option flags, read-only. + + Use one of :ref:`these constants`. + + :type: integer + + .. attribute:: ik_dist + + Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE. + + :type: float + + .. attribute:: ik_mode + + Use one of :ref:`these constants`. + + Additional mode for IK constraint. Currently only used for Distance constraint: + + :type: integer + +.. class:: BL_ArmatureChannel(PyObjectPlus) + + Proxy to armature pose channel. Allows to read and set armature pose. + The attributes are identical to RNA attributes, but mostly in read-only mode. + + See :data:`rotation_mode` + + .. data:: PCHAN_ROT_QUAT + .. data:: PCHAN_ROT_XYZ + .. data:: PCHAN_ROT_XZY + .. data:: PCHAN_ROT_YXZ + .. data:: PCHAN_ROT_YZX + .. data:: PCHAN_ROT_ZXY + .. data:: PCHAN_ROT_ZYX + + .. attribute:: name + + channel name (=bone name), read-only. + + :type: string + + .. attribute:: bone + + return the bone object corresponding to this pose channel, read-only. + + :type: :class:`BL_ArmatureBone` + + .. attribute:: parent + + return the parent channel object, None if root channel, read-only. + + :type: :class:`BL_ArmatureChannel` + + .. attribute:: has_ik + + true if the bone is part of an active IK chain, read-only. + This flag is not set when an IK constraint is defined but not enabled (miss target information for example). + + :type: boolean + + .. attribute:: ik_dof_x + + true if the bone is free to rotation in the X axis, read-only. + + :type: boolean + + .. attribute:: ik_dof_y + + true if the bone is free to rotation in the Y axis, read-only. + + :type: boolean + + .. attribute:: ik_dof_z + + true if the bone is free to rotation in the Z axis, read-only. + + :type: boolean + + .. attribute:: ik_limit_x + + true if a limit is imposed on X rotation, read-only. + + :type: boolean + + .. attribute:: ik_limit_y + + true if a limit is imposed on Y rotation, read-only. + + :type: boolean + + .. attribute:: ik_limit_z + + true if a limit is imposed on Z rotation, read-only. + + :type: boolean + + .. attribute:: ik_rot_control + + true if channel rotation should applied as IK constraint, read-only. + + :type: boolean + + .. attribute:: ik_lin_control + + true if channel size should applied as IK constraint, read-only. + + :type: boolean + + .. attribute:: location + + displacement of the bone head in armature local space, read-write. + + :type: vector [X, Y, Z]. + + .. note:: + + You can only move a bone if it is unconnected to its parent. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`). + + .. attribute:: scale + + scale of the bone relative to its parent, read-write. + + :type: vector [sizeX, sizeY, sizeZ]. + + .. note:: + + An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) + + .. attribute:: rotation + + rotation of the bone relative to its parent expressed as a quaternion, read-write. + + :type: vector [qr, qi, qj, qk]. + + .. note:: + + This field is only used if rotation_mode is 0. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) + + .. attribute:: euler_rotation + + rotation of the bone relative to its parent expressed as a set of euler angles, read-write. + + :type: vector [X, Y, Z]. + + .. note:: + + This field is only used if rotation_mode is > 0. You must always pass the angles in [X, Y, Z] order; the order of applying the angles to the bone depends on rotation_mode. An action playing on the armature may change this field. An IK chain does not update this value, see joint_rotation. + + .. note:: + + Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`) + + .. attribute:: rotation_mode + + Method of updating the bone rotation, read-write. + + :type: integer + + Use the following constants (euler mode are named as in Blender UI but the actual axis order is reversed). + + * PCHAN_ROT_QUAT(0) : use quaternioin in rotation attribute to update bone rotation + * PCHAN_ROT_XYZ(1) : use euler_rotation and apply angles on bone's Z, Y, X axis successively + * PCHAN_ROT_XZY(2) : use euler_rotation and apply angles on bone's Y, Z, X axis successively + * PCHAN_ROT_YXZ(3) : use euler_rotation and apply angles on bone's Z, X, Y axis successively + * PCHAN_ROT_YZX(4) : use euler_rotation and apply angles on bone's X, Z, Y axis successively + * PCHAN_ROT_ZXY(5) : use euler_rotation and apply angles on bone's Y, X, Z axis successively + * PCHAN_ROT_ZYX(6) : use euler_rotation and apply angles on bone's X, Y, Z axis successively + + .. attribute:: channel_matrix + + pose matrix in bone space (deformation of the bone due to action, constraint, etc), Read-only. + This field is updated after the graphic render, it represents the current pose. + + :type: matrix [4][4] + + .. attribute:: pose_matrix + + pose matrix in armature space, read-only, + This field is updated after the graphic render, it represents the current pose. + + :type: matrix [4][4] + + .. attribute:: pose_head + + position of bone head in armature space, read-only. + + :type: vector [x, y, z] + + .. attribute:: pose_tail + + position of bone tail in armature space, read-only. + + :type: vector [x, y, z] + + .. attribute:: ik_min_x + + minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only. + + :type: float + + .. attribute:: ik_max_x + + maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only. + + :type: float + + .. attribute:: ik_min_y + + minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only. + + :type: float + + .. attribute:: ik_max_y + + maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only. + + :type: float + + .. attribute:: ik_min_z + + minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only. + + :type: float + + .. attribute:: ik_max_z + + maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only. + + :type: float + + .. attribute:: ik_stiffness_x + + bone rotation stiffness in X axis, read-only. + + :type: float between 0 and 1 + + .. attribute:: ik_stiffness_y + + bone rotation stiffness in Y axis, read-only. + + :type: float between 0 and 1 + + .. attribute:: ik_stiffness_z + + bone rotation stiffness in Z axis, read-only. + + :type: float between 0 and 1 + + .. attribute:: ik_stretch + + ratio of scale change that is allowed, 0=bone can't change size, read-only. + + :type: float + + .. attribute:: ik_rot_weight + + weight of rotation constraint when ik_rot_control is set, read-write. + + :type: float between 0 and 1 + + .. attribute:: ik_lin_weight + + weight of size constraint when ik_lin_control is set, read-write. + + :type: float between 0 and 1 + + .. attribute:: joint_rotation + + Control bone rotation in term of joint angle (for robotic applications), read-write. + + When writing to this attribute, you pass a [x, y, z] vector and an appropriate set of euler angles or quaternion is calculated according to the rotation_mode. + + When you read this attribute, the current pose matrix is converted into a [x, y, z] vector representing the joint angles. + + The value and the meaning of the x, y, z depends on the ik_dof_x/ik_dof_y/ik_dof_z attributes: + + * 1DoF joint X, Y or Z: the corresponding x, y, or z value is used an a joint angle in radiant + * 2DoF joint X+Y or Z+Y: treated as 2 successive 1DoF joints: first X or Z, then Y. The x or z value is used as a joint angle in radiant along the X or Z axis, followed by a rotation along the new Y axis of y radiants. + * 2DoF joint X+Z: treated as a 2DoF joint with rotation axis on the X/Z plane. The x and z values are used as the coordinates of the rotation vector in the X/Z plane. + * 3DoF joint X+Y+Z: treated as a revolute joint. The [x, y, z] vector represents the equivalent rotation vector to bring the joint from the rest pose to the new pose. + + :type: vector [x, y, z] + + .. note:: + + The bone must be part of an IK chain if you want to set the ik_dof_x/ik_dof_y/ik_dof_z attributes via the UI, but this will interfere with this attribute since the IK solver will overwrite the pose. You can stay in control of the armature if you create an IK constraint but do not finalize it (e.g. don't set a target) the IK solver will not run but the IK panel will show up on the UI for each bone in the chain. + + .. note:: + + [0, 0, 0] always corresponds to the rest pose. + + .. note:: + + You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see :data:`BL_ArmatureObject.update`). + + .. note:: + + You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute. + +.. class:: BL_ArmatureBone(PyObjectPlus) + + Proxy to Blender bone structure. All fields are read-only and comply to RNA names. + All space attribute correspond to the rest pose. + + .. attribute:: name + + bone name. + + :type: string + + .. attribute:: connected + + true when the bone head is struck to the parent's tail. + + :type: boolean + + .. attribute:: hinge + + true when bone doesn't inherit rotation or scale from parent bone. + + :type: boolean + + .. attribute:: inherit_scale + + true when bone inherits scaling from parent bone. + + :type: boolean + + .. attribute:: bbone_segments + + number of B-bone segments. + + :type: integer + + .. attribute:: roll + + bone rotation around head-tail axis. + + :type: float + + .. attribute:: head + + location of head end of the bone in parent bone space. + + :type: vector [x, y, z] + + .. attribute:: tail + + location of head end of the bone in parent bone space. + + :type: vector [x, y, z] + + .. attribute:: length + + bone length. + + :type: float + + .. attribute:: arm_head + + location of head end of the bone in armature space. + + :type: vector [x, y, z] + + .. attribute:: arm_tail + + location of tail end of the bone in armature space. + + :type: vector [x, y, z] + + .. attribute:: arm_mat + + matrix of the bone head in armature space. + + :type: matrix [4][4] + + .. note:: + + This matrix has no scale part. + + .. attribute:: bone_mat + + rotation matrix of the bone in parent bone space. + + :type: matrix [3][3] + + .. attribute:: parent + + parent bone, or None for root bone. + + :type: :class:`BL_ArmatureBone` + + .. attribute:: children + + list of bone's children. + + :type: list of :class:`BL_ArmatureBone` diff --git a/source/gameengine/PyDoc/how_to_build_win.txt b/source/gameengine/PyDoc/how_to_build_win.txt new file mode 100644 index 00000000000..018a28a9bfd --- /dev/null +++ b/source/gameengine/PyDoc/how_to_build_win.txt @@ -0,0 +1,16 @@ +How To Build the BGE Documentation in Windows +------------------------------------------------------------------------- +1) download and install Python 2.6 - http://www.python.org +2) download and install Epydocs - http://epydoc.sourceforge.net + +* for the following lines we will assume that your installation of Python is in C:\Python26 and epydocs is installed in the default folder Scripts\epydoc. + +3) creates a epy_docgen.bat file in this folder (source\gameengine\PyDoc\) and paste the following line into it: + +:::::: +C:\Python26\python.exe C:\Python26\Scripts\epydoc.py --debug -v -o BPY_GE --url "http://www.blender.org" --top API_intro --name "Blender GameEngine" --no-private --no-sourcecode --inheritance=included *.py ../../../source/blender/python/api2_2x/doc/BGL.py ../../../source/blender/python/api2_2x/doc/Mathutils.py ../../../source/blender/python/api2_2x/doc/Geometry.py +:::::: + +4) run your created batch file. If everything goes well it creates a folder named BPY_GE with all the generated documentation. + +Documentation valid in March of 2010 - Blender 2.5alpha2 \ No newline at end of file diff --git a/source/gameengine/Rasterizer/Makefile b/source/gameengine/Rasterizer/Makefile index a12d599b60b..c877e423a71 100644 --- a/source/gameengine/Rasterizer/Makefile +++ b/source/gameengine/Rasterizer/Makefile @@ -49,10 +49,6 @@ CPPFLAGS += -I../Ketsji CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -ifeq ($(OS),darwin) - CPPFLAGS += -fpascal-strings -endif - ############### SOURCEDIR = source/gameengine/Rasterizer diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp index ae74705acff..4527850a8e9 100644 --- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp +++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp @@ -51,10 +51,6 @@ #include -#ifdef HAVE_CONFIG_H -#include -#endif - #include "Value.h" RAS_2DFilterManager::RAS_2DFilterManager(): diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.h b/source/gameengine/Rasterizer/RAS_2DFilterManager.h index 7ff7cde7882..9671f914fcd 100644 --- a/source/gameengine/Rasterizer/RAS_2DFilterManager.h +++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.h @@ -106,7 +106,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_2DFilterManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_2DFilterManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp index 4c22f4dcfc7..32fb1e31780 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp +++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp @@ -346,13 +346,21 @@ void RAS_BucketManager::RemoveMaterial(RAS_IPolyMaterial * mat) //#include -void RAS_BucketManager::MergeBucketManager(RAS_BucketManager *other) +void RAS_BucketManager::MergeBucketManager(RAS_BucketManager *other, SCA_IScene *scene) { /* concatinate lists */ // printf("BEFORE %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size()); + BucketList::iterator it; + + for (it = other->GetSolidBuckets().begin(); it != other->GetSolidBuckets().end(); ++it) + (*it)->GetPolyMaterial()->Replace_IScene(scene); + GetSolidBuckets().insert( GetSolidBuckets().end(), other->GetSolidBuckets().begin(), other->GetSolidBuckets().end() ); other->GetSolidBuckets().clear(); + for (it = other->GetAlphaBuckets().begin(); it != other->GetAlphaBuckets().end(); ++it) + (*it)->GetPolyMaterial()->Replace_IScene(scene); + GetAlphaBuckets().insert( GetAlphaBuckets().end(), other->GetAlphaBuckets().begin(), other->GetAlphaBuckets().end() ); other->GetAlphaBuckets().clear(); //printf("AFTER %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size()); diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.h b/source/gameengine/Rasterizer/RAS_BucketManager.h index 0c871a87428..487df50802c 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.h +++ b/source/gameengine/Rasterizer/RAS_BucketManager.h @@ -63,7 +63,7 @@ public: void RemoveMaterial(RAS_IPolyMaterial * mat); // freeing scenes only /* for merging */ - void MergeBucketManager(RAS_BucketManager *other); + void MergeBucketManager(RAS_BucketManager *other, SCA_IScene *scene); BucketList & GetSolidBuckets() {return m_SolidBuckets;}; BucketList & GetAlphaBuckets() {return m_AlphaBuckets;}; @@ -85,7 +85,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_BucketManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_BucketManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_Deformer.h b/source/gameengine/Rasterizer/RAS_Deformer.h index 396b6717144..17c2cb4695e 100644 --- a/source/gameengine/Rasterizer/RAS_Deformer.h +++ b/source/gameengine/Rasterizer/RAS_Deformer.h @@ -89,7 +89,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Deformer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Deformer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.cpp b/source/gameengine/Rasterizer/RAS_FramingManager.cpp index 1d5f4e674db..61734e89236 100644 --- a/source/gameengine/Rasterizer/RAS_FramingManager.cpp +++ b/source/gameengine/Rasterizer/RAS_FramingManager.cpp @@ -29,10 +29,6 @@ #include "RAS_FramingManager.h" #include "RAS_Rect.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void RAS_FramingManager:: ComputeDefaultFrustum( diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.h b/source/gameengine/Rasterizer/RAS_FramingManager.h index c058c8cd3e8..aedac230cbe 100644 --- a/source/gameengine/Rasterizer/RAS_FramingManager.h +++ b/source/gameengine/Rasterizer/RAS_FramingManager.h @@ -161,7 +161,7 @@ private : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FrameSettings"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FrameSettings"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -288,7 +288,7 @@ private : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FramingManager"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FramingManager"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_ICanvas.h b/source/gameengine/Rasterizer/RAS_ICanvas.h index 2ab06be26e7..826fe732b94 100644 --- a/source/gameengine/Rasterizer/RAS_ICanvas.h +++ b/source/gameengine/Rasterizer/RAS_ICanvas.h @@ -130,6 +130,26 @@ public: GetHeight( ) const = 0; + virtual + int + GetMouseX( int x + )=0; + + virtual + int + GetMouseY( int y + )= 0; + + virtual + float + GetMouseNormalizedX( int x + )=0; + + virtual + float + GetMouseNormalizedY( int y + )= 0; + virtual const RAS_Rect & GetDisplayArea( @@ -172,16 +192,25 @@ public: int y )=0; + virtual + RAS_MouseState + GetMouseState() + { + return m_mousestate; + } + virtual void MakeScreenShot( const char* filename )=0; +protected: + RAS_MouseState m_mousestate; #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_ICanvas"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_ICanvas"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp index b33d1e35062..0c81d7d8274 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp @@ -32,10 +32,6 @@ #include "DNA_image_types.h" #include "DNA_meshdata_types.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void RAS_IPolyMaterial::Initialize( const STR_String& texname, const STR_String& matname, diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h index bcc8c32e54e..e7bd78c2309 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h @@ -176,7 +176,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IPolyMaterial"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IPolyMaterial"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h index 3ffbfcd5a8a..630a43daddc 100644 --- a/source/gameengine/Rasterizer/RAS_IRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h @@ -414,7 +414,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IRasterizer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IRasterizer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.h b/source/gameengine/Rasterizer/RAS_IRenderTools.h index 0d89cb41e3c..50de4980e1d 100644 --- a/source/gameengine/Rasterizer/RAS_IRenderTools.h +++ b/source/gameengine/Rasterizer/RAS_IRenderTools.h @@ -180,7 +180,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IRenderTools"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IRenderTools"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.h b/source/gameengine/Rasterizer/RAS_MaterialBucket.h index 0f7db93049d..c9ccac8e8a7 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.h +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.h @@ -176,7 +176,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshSlot"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshSlot"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -193,7 +193,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshMaterial"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshMaterial"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -252,7 +252,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MaterialBucket"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MaterialBucket"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h index 87314a104d1..5a834bf26b0 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.h +++ b/source/gameengine/Rasterizer/RAS_MeshObject.h @@ -171,7 +171,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshObject"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshObject"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile index 0327714dc5f..aedbc2705f0 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile @@ -51,7 +51,3 @@ CPPFLAGS += -I../../SceneGraph CPPFLAGS += -I.. CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include -ifeq ($(OS),darwin) - CPPFLAGS += -fpascal-strings -endif - diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp index 014169f8838..12a255b4e4e 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp @@ -25,6 +25,7 @@ RAS_ListSlot::RAS_ListSlot(RAS_ListRasterizer* rasty) : KX_ListSlot(), m_list(0), m_flag(LIST_MODIFY|LIST_CREATE), + m_matnr(0), m_rasty(rasty) { } @@ -121,11 +122,23 @@ void RAS_ListRasterizer::RemoveListSlot(RAS_ListSlot* list) if (list->m_flag & LIST_DERIVEDMESH) { RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin(); while(it != mDerivedMeshLists.end()) { - if (it->second == list) { - mDerivedMeshLists.erase(it); + RAS_ListSlots *slots = it->second; + if (slots->size() > list->m_matnr && slots->at(list->m_matnr) == list) { + (*slots)[list->m_matnr] = NULL; + // check if all slots are NULL and if yes, delete the entry + int i; + for (i=slots->size(); i-- > 0; ) { + if (slots->at(i) != NULL) + break; + } + if (i < 0) { + slots->clear(); + delete slots; + mDerivedMeshLists.erase(it); + } break; } - it++; + ++it; } } else { RAS_ArrayLists::iterator it = mArrayLists.begin(); @@ -152,13 +165,29 @@ RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms) if (ms.m_pDerivedMesh) { // that means that we draw based on derived mesh, a display list is possible // Note that we come here only for static derived mesh + int matnr = ms.m_bucket->GetPolyMaterial()->GetMaterialIndex(); + RAS_ListSlot* nullSlot = NULL; + RAS_ListSlots *listVector; RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.find(ms.m_pDerivedMesh); if(it == mDerivedMeshLists.end()) { + listVector = new RAS_ListSlots(matnr+4, nullSlot); localSlot = new RAS_ListSlot(this); localSlot->m_flag |= LIST_DERIVEDMESH; - mDerivedMeshLists.insert(std::pair(ms.m_pDerivedMesh, localSlot)); + localSlot->m_matnr = matnr; + listVector->at(matnr) = localSlot; + mDerivedMeshLists.insert(std::pair(ms.m_pDerivedMesh, listVector)); } else { - localSlot = static_cast(it->second->AddRef()); + listVector = it->second; + if (listVector->size() <= matnr) + listVector->resize(matnr+4, nullSlot); + if ((localSlot = listVector->at(matnr)) == NULL) { + localSlot = new RAS_ListSlot(this); + localSlot->m_flag |= LIST_DERIVEDMESH; + localSlot->m_matnr = matnr; + listVector->at(matnr) = localSlot; + } else { + localSlot->AddRef(); + } } } else { RAS_ArrayLists::iterator it = mArrayLists.find(ms.m_displayArrays); @@ -179,8 +208,16 @@ void RAS_ListRasterizer::ReleaseAlloc() for(RAS_ArrayLists::iterator it = mArrayLists.begin();it != mArrayLists.end();++it) delete it->second; mArrayLists.clear(); - for (RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();it != mDerivedMeshLists.end();++it) - delete it->second; + for (RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();it != mDerivedMeshLists.end();++it) { + RAS_ListSlots* slots = it->second; + for (int i=slots->size(); i-- > 0; ) { + RAS_ListSlot* slot = slots->at(i); + if (slot) + delete slot; + } + slots->clear(); + delete slots; + } mDerivedMeshLists.clear(); } diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h index cff48081f02..28c56b92c3c 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h @@ -12,6 +12,7 @@ class RAS_ListSlot : public KX_ListSlot friend class RAS_ListRasterizer; unsigned int m_list; unsigned int m_flag; + unsigned int m_matnr; RAS_ListRasterizer* m_rasty; public: RAS_ListSlot(RAS_ListRasterizer* rasty); @@ -40,7 +41,8 @@ enum RAS_ListSlotFlags { struct DerivedMesh; typedef std::map RAS_ArrayLists; -typedef std::map RAS_DerivedMeshLists; +typedef std::vector RAS_ListSlots; // indexed by material slot number +typedef std::map RAS_DerivedMeshLists; class RAS_ListRasterizer : public RAS_VAOpenGLRasterizer { @@ -70,7 +72,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_ListRasterizer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_ListRasterizer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h index 6bbf65f72a4..7b516cb53a0 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h @@ -292,7 +292,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_OpenGLRasterizer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_OpenGLRasterizer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp index f33a3b6913b..087b5d052c3 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp @@ -25,10 +25,6 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "RAS_VAOpenGLRasterizer.h" #include diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h index 92833d9b17d..96f6344b403 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h @@ -61,7 +61,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_VAOpenGLRasterizer"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_VAOpenGLRasterizer"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_Polygon.h b/source/gameengine/Rasterizer/RAS_Polygon.h index 48fa4a206f0..8dc9813f5b9 100644 --- a/source/gameengine/Rasterizer/RAS_Polygon.h +++ b/source/gameengine/Rasterizer/RAS_Polygon.h @@ -93,7 +93,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Polygon"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Polygon"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_Rect.h b/source/gameengine/Rasterizer/RAS_Rect.h index 828257dcecc..7a1d21b8905 100644 --- a/source/gameengine/Rasterizer/RAS_Rect.h +++ b/source/gameengine/Rasterizer/RAS_Rect.h @@ -96,7 +96,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Rect"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Rect"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_TexVert.h b/source/gameengine/Rasterizer/RAS_TexVert.h index b74cfb47152..bdf2a6487ad 100644 --- a/source/gameengine/Rasterizer/RAS_TexVert.h +++ b/source/gameengine/Rasterizer/RAS_TexVert.h @@ -141,7 +141,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_TexVert"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_TexVert"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/Rasterizer/RAS_texmatrix.cpp b/source/gameengine/Rasterizer/RAS_texmatrix.cpp index daa9db2a8c9..e69601fe091 100644 --- a/source/gameengine/Rasterizer/RAS_texmatrix.cpp +++ b/source/gameengine/Rasterizer/RAS_texmatrix.cpp @@ -28,10 +28,6 @@ #include "RAS_TexMatrix.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void RAS_CalcTexMatrix(RAS_TexVert p[3],MT_Point3& origin,MT_Vector3& udir,MT_Vector3& vdir) { // precondition: 3 vertices are non-colinear diff --git a/source/gameengine/SceneGraph/SG_BBox.h b/source/gameengine/SceneGraph/SG_BBox.h index cc9dfc2db4e..1a65fc7ef6f 100644 --- a/source/gameengine/SceneGraph/SG_BBox.h +++ b/source/gameengine/SceneGraph/SG_BBox.h @@ -135,7 +135,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_BBox"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_BBox"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_Controller.cpp b/source/gameengine/SceneGraph/SG_Controller.cpp index 6cecbe4c025..d2464b22608 100644 --- a/source/gameengine/SceneGraph/SG_Controller.cpp +++ b/source/gameengine/SceneGraph/SG_Controller.cpp @@ -29,10 +29,6 @@ #include "SG_Controller.h" -#ifdef HAVE_CONFIG_H -#include -#endif - void SG_Controller:: SetObject(SG_IObject* obj) diff --git a/source/gameengine/SceneGraph/SG_Controller.h b/source/gameengine/SceneGraph/SG_Controller.h index 6e44e05cb0b..b4636d5fa62 100644 --- a/source/gameengine/SceneGraph/SG_Controller.h +++ b/source/gameengine/SceneGraph/SG_Controller.h @@ -42,7 +42,7 @@ class SG_Controller public: #ifdef WITH_CXX_GUARDEDALLOC - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "SG_Controller"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "SG_Controller"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif diff --git a/source/gameengine/SceneGraph/SG_DList.h b/source/gameengine/SceneGraph/SG_DList.h index 24b2fd6dee6..0768eaa5021 100644 --- a/source/gameengine/SceneGraph/SG_DList.h +++ b/source/gameengine/SceneGraph/SG_DList.h @@ -215,7 +215,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_DList"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_DList"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_IObject.cpp b/source/gameengine/SceneGraph/SG_IObject.cpp index 03032e376af..38baf6994e2 100644 --- a/source/gameengine/SceneGraph/SG_IObject.cpp +++ b/source/gameengine/SceneGraph/SG_IObject.cpp @@ -29,10 +29,6 @@ #include "SG_IObject.h" #include "SG_Controller.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SG_Stage gSG_Stage = SG_STAGE_UNKNOWN; SG_IObject:: diff --git a/source/gameengine/SceneGraph/SG_IObject.h b/source/gameengine/SceneGraph/SG_IObject.h index 2b9fb68adf5..4c9c31e4934 100644 --- a/source/gameengine/SceneGraph/SG_IObject.h +++ b/source/gameengine/SceneGraph/SG_IObject.h @@ -354,7 +354,7 @@ protected : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_IObject"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_IObject"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_Node.cpp b/source/gameengine/SceneGraph/SG_Node.cpp index 2436f6ecb55..1d27dfa1388 100644 --- a/source/gameengine/SceneGraph/SG_Node.cpp +++ b/source/gameengine/SceneGraph/SG_Node.cpp @@ -30,10 +30,6 @@ #include "SG_ParentRelation.h" #include -#ifdef HAVE_CONFIG_H -#include -#endif - using namespace std; @@ -150,6 +146,12 @@ GetRootSGParent( return (m_SGparent ? (const SG_Node*) m_SGparent->GetRootSGParent() : (const SG_Node*) this); } +bool SG_Node::IsAncessor(const SG_Node* child) const +{ + return (!child->m_SGparent) ? false : + (child->m_SGparent == this) ? true : IsAncessor(child->m_SGparent); +} + void SG_Node:: DisconnectFromParent( diff --git a/source/gameengine/SceneGraph/SG_Node.h b/source/gameengine/SceneGraph/SG_Node.h index 78fa61c019e..30d09b5bdfd 100644 --- a/source/gameengine/SceneGraph/SG_Node.h +++ b/source/gameengine/SceneGraph/SG_Node.h @@ -77,6 +77,13 @@ public: SG_Node* child ); + /** + * Return true if the node is the ancessor of child + */ + bool + IsAncessor( + const SG_Node* child + ) const; /** * Get the current list of children. Do not use this interface for * adding or removing children please use the methods of this class for @@ -262,7 +269,7 @@ private: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Node"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Node"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_ParentRelation.h b/source/gameengine/SceneGraph/SG_ParentRelation.h index 8097fbdb6bb..0bc04245c93 100644 --- a/source/gameengine/SceneGraph/SG_ParentRelation.h +++ b/source/gameengine/SceneGraph/SG_ParentRelation.h @@ -131,7 +131,7 @@ protected : #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_ParentRelation"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_ParentRelation"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_QList.h b/source/gameengine/SceneGraph/SG_QList.h index 9f49060b302..691ec9e1262 100644 --- a/source/gameengine/SceneGraph/SG_QList.h +++ b/source/gameengine/SceneGraph/SG_QList.h @@ -155,7 +155,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_QList"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_QList"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_Spatial.cpp b/source/gameengine/SceneGraph/SG_Spatial.cpp index d88bb68351d..f93dbfd4ebe 100644 --- a/source/gameengine/SceneGraph/SG_Spatial.cpp +++ b/source/gameengine/SceneGraph/SG_Spatial.cpp @@ -32,10 +32,6 @@ #include "SG_Controller.h" #include "SG_ParentRelation.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SG_Spatial:: SG_Spatial( void* clientobj, diff --git a/source/gameengine/SceneGraph/SG_Spatial.h b/source/gameengine/SceneGraph/SG_Spatial.h index 372a1f6d977..b8193806ecb 100644 --- a/source/gameengine/SceneGraph/SG_Spatial.h +++ b/source/gameengine/SceneGraph/SG_Spatial.h @@ -286,7 +286,7 @@ protected: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Spatial"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Spatial"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/SceneGraph/SG_Tree.h b/source/gameengine/SceneGraph/SG_Tree.h index 041f34a5bc6..fa6facde66c 100644 --- a/source/gameengine/SceneGraph/SG_Tree.h +++ b/source/gameengine/SceneGraph/SG_Tree.h @@ -115,7 +115,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Tree"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Tree"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; @@ -158,7 +158,7 @@ public: #ifdef WITH_CXX_GUARDEDALLOC public: - void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_TreeFactory"); } + void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_TreeFactory"); } void operator delete( void *mem ) { MEM_freeN(mem); } #endif }; diff --git a/source/gameengine/VideoTexture/ImageBase.cpp b/source/gameengine/VideoTexture/ImageBase.cpp index 31c634b1511..88a20fadcf7 100644 --- a/source/gameengine/VideoTexture/ImageBase.cpp +++ b/source/gameengine/VideoTexture/ImageBase.cpp @@ -650,7 +650,7 @@ int Image_getbuffer(PyImage *self, Py_buffer *view, int flags) catch (Exception & exp) { // cannot return -1, this creates a crash in Python, for now we will just return an empty buffer - //exp.report(); + exp.report(); //return -1; goto error; } @@ -676,7 +676,7 @@ error: // Return a empty buffer to avoid a crash in Python 3.1 // The bug is fixed in Python SVN 77916, as soon as the python revision used by Blender is // updated, you can simply return -1 and set the error - static char* buf = ""; + static char* buf = (char *)""; ret = PyBuffer_FillInfo(view, (PyObject*)self, buf, 0, 0, flags); if (ret >= 0) self->m_image->m_exports++; diff --git a/source/gameengine/VideoTexture/ImageBuff.cpp b/source/gameengine/VideoTexture/ImageBuff.cpp index 0bb0cf59511..926468c662e 100644 --- a/source/gameengine/VideoTexture/ImageBuff.cpp +++ b/source/gameengine/VideoTexture/ImageBuff.cpp @@ -128,7 +128,7 @@ void ImageBuff::clear (short width, short height, unsigned char color) memset(m_image, color, size*4); // and change the alpha channel p = &((unsigned char*)m_image)[3]; - for (size; size>0; size--) + for (; size>0; size--) { *p = 0xFF; p += 4; diff --git a/source/gameengine/VideoTexture/Texture.cpp b/source/gameengine/VideoTexture/Texture.cpp index b8ed38c435d..f97ceb1fa67 100644 --- a/source/gameengine/VideoTexture/Texture.cpp +++ b/source/gameengine/VideoTexture/Texture.cpp @@ -357,6 +357,12 @@ PyObject * Texture_refresh (Texture * self, PyObject * args) Py_RETURN_NONE; } +// get OpenGL Bind Id +PyObject * Texture_getBindId (Texture * self, void * closure) +{ + unsigned int id = self->m_actTex; + return Py_BuildValue("h", id); +} // get mipmap value PyObject * Texture_getMipmap (Texture * self, void * closure) @@ -430,6 +436,7 @@ static PyGetSetDef textureGetSets[] = { {(char*)"source", (getter)Texture_getSource, (setter)Texture_setSource, (char*)"source of texture", NULL}, {(char*)"mipmap", (getter)Texture_getMipmap, (setter)Texture_setMipmap, (char*)"mipmap texture", NULL}, + {(char*)"bindId", (getter)Texture_getBindId, NULL, (char*)"OpenGL Bind Name", NULL}, {NULL} }; diff --git a/source/gameengine/VideoTexture/VideoFFmpeg.cpp b/source/gameengine/VideoTexture/VideoFFmpeg.cpp index 6f7e9b82911..5a80522ea7d 100644 --- a/source/gameengine/VideoTexture/VideoFFmpeg.cpp +++ b/source/gameengine/VideoTexture/VideoFFmpeg.cpp @@ -23,7 +23,9 @@ http://www.gnu.org/copyleft/lesser.txt. #ifdef WITH_FFMPEG // INT64_C fix for some linux machines (C99ism) +#ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS +#endif #include @@ -56,7 +58,7 @@ m_frame(NULL), m_frameDeinterlaced(NULL), m_frameRGB(NULL), m_imgConvertCtx(NULL m_deinterlace(false), m_preseek(0), m_videoStream(-1), m_baseFrameRate(25.0), m_lastFrame(-1), m_eof(false), m_externTime(false), m_curPosition(-1), m_startTime(0), m_captWidth(0), m_captHeight(0), m_captRate(0.f), m_isImage(false), -m_isThreaded(false), m_stopThread(false), m_cacheStarted(false) +m_isThreaded(false), m_isStreaming(false), m_stopThread(false), m_cacheStarted(false) { // set video format m_format = RGB24; @@ -306,6 +308,7 @@ void *VideoFFmpeg::cacheThread(void *data) int frameFinished = 0; double timeBase = av_q2d(video->m_formatCtx->streams[video->m_videoStream]->time_base); int64_t startTs = video->m_formatCtx->streams[video->m_videoStream]->start_time; + if (startTs == AV_NOPTS_VALUE) startTs = 0; @@ -544,8 +547,10 @@ void VideoFFmpeg::openFile (char * filename) #endif ) { - // the file is in fact a streaming source, prevent seeking + // the file is in fact a streaming source, treat as cam to prevent seeking m_isFile = false; + // but it's not handled exactly like a camera. + m_isStreaming = true; // for streaming it is important to do non blocking read m_formatCtx->flags |= AVFMT_FLAG_NONBLOCK; } @@ -811,12 +816,12 @@ void VideoFFmpeg::calcImage (unsigned int texId, double ts) // close the file as we don't need it anymore release(); } - } else if (!m_isFile) + } else if (m_isStreaming) { // we didn't get a frame and we are streaming, this may be due to // a delay in the network or because we are getting the frame too fast. // In the later case, shift time by a small amount to compensate for a drift - m_startTime += 0.01; + m_startTime += 0.001; } } } @@ -878,14 +883,18 @@ AVFrame *VideoFFmpeg::grabFrame(long position) } // for streaming, always return the next frame, // that's what grabFrame does in non cache mode anyway. - if (!m_isFile || frame->framePosition == position) + if (m_isStreaming || frame->framePosition == position) { return frame->frame; } - if (frame->framePosition > position) + // for cam, skip old frames to keep image realtime. + // There should be no risk of clock drift since it all happens on the same CPU + if (frame->framePosition > position) + { // this can happen after rewind if the seek didn't find the first frame // the frame in the buffer is ahead of time, just leave it there return NULL; + } // this frame is not useful, release it pthread_mutex_lock(&m_cacheMutex); BLI_remlink(&m_frameCacheBase, frame); @@ -930,7 +939,6 @@ AVFrame *VideoFFmpeg::grabFrame(long position) if (position != m_curPosition + 1) { int64_t pos = (int64_t)((position - m_preseek) / (m_baseFrameRate*timeBase)); - int seekres; if (pos < 0) pos = 0; diff --git a/source/gameengine/VideoTexture/VideoFFmpeg.h b/source/gameengine/VideoTexture/VideoFFmpeg.h index b9bf69039c7..a19d8969b40 100644 --- a/source/gameengine/VideoTexture/VideoFFmpeg.h +++ b/source/gameengine/VideoTexture/VideoFFmpeg.h @@ -61,7 +61,7 @@ static inline AVCodecContext* get_codec_from_stream(AVStream* stream) #include "VideoBase.h" -#define CACHE_FRAME_SIZE 5 +#define CACHE_FRAME_SIZE 10 #define CACHE_PACKET_SIZE 30 // type VideoFFmpeg declaration @@ -153,6 +153,9 @@ protected: /// is image loading done in a separate thread? bool m_isThreaded; + /// is streaming or camera? + bool m_isStreaming; + /// keep last image name STR_String m_imageName; diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp index 01e783edc10..5cb50900c89 100644 --- a/source/gameengine/VideoTexture/blendVideoTex.cpp +++ b/source/gameengine/VideoTexture/blendVideoTex.cpp @@ -206,7 +206,7 @@ PyObject* initVideoTexture(void) PyModule_AddObject(m, (char*)"Texture", (PyObject*)&TextureType); // init last error description - Exception::m_lastError[0] = '\0'; + Exception::m_lastError = ""; return m; } diff --git a/source/kernel/gen_messaging/intern/messaging.c b/source/kernel/gen_messaging/intern/messaging.c index ad20e0664af..b1f8a5b8e56 100644 --- a/source/kernel/gen_messaging/intern/messaging.c +++ b/source/kernel/gen_messaging/intern/messaging.c @@ -31,10 +31,6 @@ #include "GEN_messaging.h" -#ifdef HAVE_CONFIG_H -#include -#endif - FILE* GEN_errorstream = NULL; FILE* GEN_userstream = NULL; diff --git a/source/kernel/gen_system/GEN_HashedPtr.cpp b/source/kernel/gen_system/GEN_HashedPtr.cpp index a6a94a1406b..4713c9d5eed 100644 --- a/source/kernel/gen_system/GEN_HashedPtr.cpp +++ b/source/kernel/gen_system/GEN_HashedPtr.cpp @@ -29,10 +29,6 @@ */ #include "GEN_HashedPtr.h" -#ifdef HAVE_CONFIG_H -#include -#endif - #include "BLO_sys_types.h" // for intptr_t support // diff --git a/source/kernel/gen_system/GEN_Matrix4x4.cpp b/source/kernel/gen_system/GEN_Matrix4x4.cpp index d1a8f3510c7..72926ce9c39 100644 --- a/source/kernel/gen_system/GEN_Matrix4x4.cpp +++ b/source/kernel/gen_system/GEN_Matrix4x4.cpp @@ -28,10 +28,6 @@ #include "GEN_Matrix4x4.h" -#ifdef HAVE_CONFIG_H -#include -#endif - GEN_Matrix4x4::GEN_Matrix4x4() { Identity(); diff --git a/source/kernel/gen_system/SYS_SingletonSystem.cpp b/source/kernel/gen_system/SYS_SingletonSystem.cpp index 08476a93167..0b5cfe7273a 100644 --- a/source/kernel/gen_system/SYS_SingletonSystem.cpp +++ b/source/kernel/gen_system/SYS_SingletonSystem.cpp @@ -31,10 +31,6 @@ #include "SYS_SingletonSystem.h" #include "GEN_DataCache.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SYS_SingletonSystem* SYS_SingletonSystem::_instance = 0; void SYS_SingletonSystem::Destruct() diff --git a/source/kernel/gen_system/SYS_System.cpp b/source/kernel/gen_system/SYS_System.cpp index 9504e2917f9..b2e27f179e6 100644 --- a/source/kernel/gen_system/SYS_System.cpp +++ b/source/kernel/gen_system/SYS_System.cpp @@ -31,10 +31,6 @@ #include "SYS_System.h" #include "SYS_SingletonSystem.h" -#ifdef HAVE_CONFIG_H -#include -#endif - SYS_SystemHandle SYS_GetSystem() { return (SYS_SystemHandle) SYS_SingletonSystem::Instance();